From bd80ce461107b8b8bcb20e59a0c575621b314582 Mon Sep 17 00:00:00 2001 From: Jeremy Shen Date: Wed, 27 May 2026 09:54:51 +0800 Subject: [PATCH] fix(vitis): replace absolute paths with relative paths for cross-platform compatibility - Replace hardcoded /home/ly0kos/ paths in .prj, .sprj, and platform.spr with relative paths so the project can be cloned and opened on any machine - Remove RemoteSystemsTempFiles/.project from git (IDE temp file) - Add .gitignore at Vitis root to exclude .metadata/, RemoteSystemsTempFiles/, IDE.log, *.log, and .analytics/ - Update NewInstCal_bsp/.gitignore to stop ignoring /export/ (needed for xpfm) - Add .gitattributes for consistent line ending handling across platforms --- 2.FW/Zynq/proj_cal/Vitis/.gitattributes | 24 + 2.FW/Zynq/proj_cal/Vitis/.gitignore | 6 + .../proj_cal/Vitis/NewInstCal_bsp/.gitignore | 2 +- .../export/NewInstCal_bsp/NewInstCal_bsp.xpfm | 17 + .../export/NewInstCal_bsp/hw/ps7_init.c | 10066 +++++++++++++++ .../export/NewInstCal_bsp/hw/ps7_init.h | 117 + .../export/NewInstCal_bsp/hw/ps7_init_gpl.c | 10079 ++++++++++++++++ .../export/NewInstCal_bsp/hw/ps7_init_gpl.h | 131 + .../NewInstCal_bsp/hw/system_wrapper.bit | Bin 0 -> 13321514 bytes .../NewInstCal_bsp/hw/system_wrapper.xsa | Bin 0 -> 970730 bytes .../NewInstCal_bsp/sw/NewInstCal_bsp.spfm | 43 + .../sw/NewInstCal_bsp/boot/NewInstCal_bsp.bif | 7 + .../sw/NewInstCal_bsp/boot/fsbl.elf | Bin 0 -> 472932 bytes .../sw/NewInstCal_bsp/boot/generic.readme | 8 + .../sw/NewInstCal_bsp/qemu/qemu_args.txt | 51 + .../bspinclude/include/_profile_timer_hw.h | 281 + .../bspinclude/include/arch/cc.h | 83 + .../bspinclude/include/arch/cpu.h | 49 + .../bspinclude/include/arch/perf.h | 52 + .../bspinclude/include/arch/sys_arch.h | 74 + .../bspinclude/include/bspconfig.h | 24 + .../bspinclude/include/lwip/altcp.h | 206 + .../bspinclude/include/lwip/altcp_tcp.h | 72 + .../bspinclude/include/lwip/altcp_tls.h | 143 + .../bspinclude/include/lwip/api.h | 431 + .../bspinclude/include/lwip/apps/FILES | 2 + .../include/lwip/apps/altcp_proxyconnect.h | 79 + .../lwip/apps/altcp_tls_mbedtls_opts.h | 105 + .../bspinclude/include/lwip/apps/fs.h | 126 + .../include/lwip/apps/http_client.h | 160 + .../bspinclude/include/lwip/apps/httpd.h | 255 + .../bspinclude/include/lwip/apps/httpd_opts.h | 396 + .../bspinclude/include/lwip/apps/lwiperf.h | 100 + .../bspinclude/include/lwip/apps/mdns.h | 105 + .../bspinclude/include/lwip/apps/mdns_opts.h | 80 + .../bspinclude/include/lwip/apps/mdns_priv.h | 74 + .../bspinclude/include/lwip/apps/mqtt.h | 205 + .../bspinclude/include/lwip/apps/mqtt_opts.h | 103 + .../bspinclude/include/lwip/apps/mqtt_priv.h | 104 + .../bspinclude/include/lwip/apps/netbiosns.h | 51 + .../include/lwip/apps/netbiosns_opts.h | 66 + .../bspinclude/include/lwip/apps/smtp.h | 128 + .../bspinclude/include/lwip/apps/smtp_opts.h | 80 + .../bspinclude/include/lwip/apps/snmp.h | 135 + .../bspinclude/include/lwip/apps/snmp_core.h | 377 + .../bspinclude/include/lwip/apps/snmp_mib2.h | 78 + .../bspinclude/include/lwip/apps/snmp_opts.h | 297 + .../include/lwip/apps/snmp_scalar.h | 113 + .../include/lwip/apps/snmp_snmpv2_framework.h | 32 + .../include/lwip/apps/snmp_snmpv2_usm.h | 24 + .../bspinclude/include/lwip/apps/snmp_table.h | 134 + .../include/lwip/apps/snmp_threadsync.h | 114 + .../bspinclude/include/lwip/apps/snmpv3.h | 114 + .../bspinclude/include/lwip/apps/sntp.h | 80 + .../bspinclude/include/lwip/apps/sntp_opts.h | 215 + .../bspinclude/include/lwip/apps/tftp_opts.h | 106 + .../include/lwip/apps/tftp_server.h | 95 + .../bspinclude/include/lwip/arch.h | 393 + .../bspinclude/include/lwip/autoip.h | 99 + .../bspinclude/include/lwip/debug.h | 159 + .../bspinclude/include/lwip/def.h | 152 + .../bspinclude/include/lwip/dhcp.h | 139 + .../bspinclude/include/lwip/dhcp6.h | 104 + .../bspinclude/include/lwip/dns.h | 131 + .../bspinclude/include/lwip/err.h | 117 + .../bspinclude/include/lwip/errno.h | 198 + .../bspinclude/include/lwip/etharp.h | 105 + .../bspinclude/include/lwip/ethip6.h | 68 + .../bspinclude/include/lwip/icmp.h | 110 + .../bspinclude/include/lwip/icmp6.h | 72 + .../bspinclude/include/lwip/if_api.h | 70 + .../bspinclude/include/lwip/igmp.h | 115 + .../bspinclude/include/lwip/inet.h | 169 + .../bspinclude/include/lwip/inet_chksum.h | 104 + .../bspinclude/include/lwip/init.h | 100 + .../bspinclude/include/lwip/init.h.cmake.in | 100 + .../bspinclude/include/lwip/ip.h | 328 + .../bspinclude/include/lwip/ip4.h | 109 + .../bspinclude/include/lwip/ip4_addr.h | 216 + .../bspinclude/include/lwip/ip4_frag.h | 100 + .../bspinclude/include/lwip/ip6.h | 93 + .../bspinclude/include/lwip/ip6_addr.h | 352 + .../bspinclude/include/lwip/ip6_frag.h | 144 + .../bspinclude/include/lwip/ip6_zone.h | 304 + .../bspinclude/include/lwip/ip_addr.h | 438 + .../bspinclude/include/lwip/mem.h | 82 + .../bspinclude/include/lwip/memp.h | 155 + .../bspinclude/include/lwip/mld6.h | 99 + .../bspinclude/include/lwip/nd6.h | 90 + .../bspinclude/include/lwip/netbuf.h | 121 + .../bspinclude/include/lwip/netdb.h | 150 + .../bspinclude/include/lwip/netif.h | 686 ++ .../bspinclude/include/lwip/netifapi.h | 161 + .../bspinclude/include/lwip/opt.h | 3530 ++++++ .../bspinclude/include/lwip/pbuf.h | 326 + .../bspinclude/include/lwip/priv/altcp_priv.h | 159 + .../bspinclude/include/lwip/priv/api_msg.h | 272 + .../bspinclude/include/lwip/priv/mem_priv.h | 84 + .../bspinclude/include/lwip/priv/memp_priv.h | 161 + .../bspinclude/include/lwip/priv/memp_std.h | 153 + .../bspinclude/include/lwip/priv/nd6_priv.h | 142 + .../bspinclude/include/lwip/priv/raw_priv.h | 69 + .../include/lwip/priv/sockets_priv.h | 175 + .../bspinclude/include/lwip/priv/tcp_priv.h | 523 + .../bspinclude/include/lwip/priv/tcpip_priv.h | 170 + .../bspinclude/include/lwip/prot/autoip.h | 78 + .../bspinclude/include/lwip/prot/dhcp.h | 178 + .../bspinclude/include/lwip/prot/dhcp6.h | 138 + .../bspinclude/include/lwip/prot/dns.h | 140 + .../bspinclude/include/lwip/prot/etharp.h | 127 + .../bspinclude/include/lwip/prot/ethernet.h | 135 + .../bspinclude/include/lwip/prot/iana.h | 97 + .../bspinclude/include/lwip/prot/icmp.h | 91 + .../bspinclude/include/lwip/prot/icmp6.h | 172 + .../bspinclude/include/lwip/prot/ieee.h | 91 + .../bspinclude/include/lwip/prot/igmp.h | 90 + .../bspinclude/include/lwip/prot/ip.h | 59 + .../bspinclude/include/lwip/prot/ip4.h | 131 + .../bspinclude/include/lwip/prot/ip6.h | 235 + .../bspinclude/include/lwip/prot/mld6.h | 71 + .../bspinclude/include/lwip/prot/nd6.h | 274 + .../bspinclude/include/lwip/prot/tcp.h | 100 + .../bspinclude/include/lwip/prot/udp.h | 68 + .../bspinclude/include/lwip/raw.h | 143 + .../bspinclude/include/lwip/sio.h | 142 + .../bspinclude/include/lwip/snmp.h | 213 + .../bspinclude/include/lwip/sockets.h | 693 ++ .../bspinclude/include/lwip/stats.h | 491 + .../bspinclude/include/lwip/sys.h | 578 + .../bspinclude/include/lwip/tcp.h | 500 + .../bspinclude/include/lwip/tcpbase.h | 88 + .../bspinclude/include/lwip/tcpip.h | 113 + .../bspinclude/include/lwip/timeouts.h | 128 + .../bspinclude/include/lwip/udp.h | 209 + .../bspinclude/include/lwipopts.h | 116 + .../bspinclude/include/mblaze_nt_types.h | 28 + .../bspinclude/include/netif/bridgeif.h | 127 + .../bspinclude/include/netif/bridgeif_opts.h | 90 + .../bspinclude/include/netif/etharp.h | 3 + .../bspinclude/include/netif/ethernet.h | 77 + .../bspinclude/include/netif/ieee802154.h | 112 + .../bspinclude/include/netif/lowpan6.h | 89 + .../bspinclude/include/netif/lowpan6_ble.h | 78 + .../bspinclude/include/netif/lowpan6_common.h | 82 + .../bspinclude/include/netif/lowpan6_opts.h | 122 + .../bspinclude/include/netif/ppp/ccp.h | 164 + .../bspinclude/include/netif/ppp/chap-md5.h | 36 + .../bspinclude/include/netif/ppp/chap-new.h | 200 + .../bspinclude/include/netif/ppp/chap_ms.h | 44 + .../bspinclude/include/netif/ppp/eap.h | 169 + .../bspinclude/include/netif/ppp/ecp.h | 62 + .../bspinclude/include/netif/ppp/eui64.h | 102 + .../bspinclude/include/netif/ppp/fsm.h | 182 + .../bspinclude/include/netif/ppp/ipcp.h | 134 + .../bspinclude/include/netif/ppp/ipv6cp.h | 191 + .../bspinclude/include/netif/ppp/lcp.h | 179 + .../bspinclude/include/netif/ppp/magic.h | 130 + .../bspinclude/include/netif/ppp/mppe.h | 181 + .../include/netif/ppp/polarssl/arc4.h | 81 + .../include/netif/ppp/polarssl/des.h | 92 + .../include/netif/ppp/polarssl/md4.h | 97 + .../include/netif/ppp/polarssl/md5.h | 96 + .../include/netif/ppp/polarssl/sha1.h | 96 + .../bspinclude/include/netif/ppp/ppp.h | 698 ++ .../bspinclude/include/netif/ppp/ppp_impl.h | 722 ++ .../bspinclude/include/netif/ppp/ppp_opts.h | 617 + .../bspinclude/include/netif/ppp/pppapi.h | 137 + .../bspinclude/include/netif/ppp/pppcrypt.h | 144 + .../bspinclude/include/netif/ppp/pppdebug.h | 88 + .../bspinclude/include/netif/ppp/pppoe.h | 187 + .../bspinclude/include/netif/ppp/pppol2tp.h | 209 + .../bspinclude/include/netif/ppp/pppos.h | 126 + .../bspinclude/include/netif/ppp/upap.h | 131 + .../bspinclude/include/netif/ppp/vj.h | 169 + .../bspinclude/include/netif/slipif.h | 86 + .../bspinclude/include/netif/xadapter.h | 88 + .../bspinclude/include/netif/xaxiemacif.h | 137 + .../bspinclude/include/netif/xemacliteif.h | 68 + .../bspinclude/include/netif/xemacpsif.h | 181 + .../bspinclude/include/netif/xlltemacif.h | 95 + .../bspinclude/include/netif/xpqueue.h | 57 + .../bspinclude/include/netif/xtopology.h | 63 + .../bspinclude/include/netif/zepif.h | 81 + .../bspinclude/include/pm_api_version.h | 269 + .../bspinclude/include/profile.h | 105 + .../bspinclude/include/sleep.h | 109 + .../bspinclude/include/smc.h | 97 + .../bspinclude/include/vectors.h | 64 + .../bspinclude/include/xadcps.h | 582 + .../bspinclude/include/xadcps_hw.h | 478 + .../bspinclude/include/xbasic_types.h | 113 + .../bspinclude/include/xcoresightpsdcc.h | 53 + .../bspinclude/include/xcortexa9.h | 18 + .../bspinclude/include/xcortexa9_config.h | 18 + .../bspinclude/include/xcpu_cortexa9.h | 26 + .../bspinclude/include/xddrps.h | 41 + .../bspinclude/include/xdebug.h | 78 + .../bspinclude/include/xdevcfg.h | 393 + .../bspinclude/include/xdevcfg_hw.h | 371 + .../bspinclude/include/xdmaps.h | 347 + .../bspinclude/include/xdmaps_hw.h | 268 + .../bspinclude/include/xemacps.h | 857 ++ .../bspinclude/include/xemacps_bd.h | 763 ++ .../bspinclude/include/xemacps_bdring.h | 216 + .../bspinclude/include/xemacps_hw.h | 664 + .../bspinclude/include/xenv.h | 169 + .../bspinclude/include/xenv_standalone.h | 350 + .../bspinclude/include/xgpiops.h | 314 + .../bspinclude/include/xgpiops_hw.h | 147 + .../bspinclude/include/xil_assert.h | 176 + .../bspinclude/include/xil_cache.h | 107 + .../bspinclude/include/xil_cache_l.h | 75 + .../bspinclude/include/xil_cache_vxworks.h | 75 + .../bspinclude/include/xil_clocking.h | 67 + .../bspinclude/include/xil_cryptoalginfo.h | 50 + .../bspinclude/include/xil_errata.h | 101 + .../bspinclude/include/xil_exception.h | 532 + .../bspinclude/include/xil_hal.h | 43 + .../bspinclude/include/xil_io.h | 433 + .../bspinclude/include/xil_macroback.h | 1113 ++ .../bspinclude/include/xil_mem.h | 48 + .../bspinclude/include/xil_misc_psreset_api.h | 263 + .../bspinclude/include/xil_mmu.h | 92 + .../bspinclude/include/xil_printf.h | 57 + .../bspinclude/include/xil_sleeptimer.h | 120 + .../bspinclude/include/xil_spinlock.h | 83 + .../bspinclude/include/xil_testcache.h | 54 + .../bspinclude/include/xil_testio.h | 76 + .../bspinclude/include/xil_testmem.h | 169 + .../bspinclude/include/xil_types.h | 230 + .../bspinclude/include/xil_util.h | 336 + .../bspinclude/include/xinterrupt_wrap.h | 84 + .../bspinclude/include/xl2cc.h | 155 + .../bspinclude/include/xl2cc_counter.h | 96 + .../bspinclude/include/xlwipconfig.h | 45 + .../bspinclude/include/xparameters.h | 465 + .../bspinclude/include/xparameters_ps.h | 334 + .../bspinclude/include/xplatform_info.h | 159 + .../bspinclude/include/xpm_counter.h | 575 + .../bspinclude/include/xpm_init.h | 46 + .../bspinclude/include/xpseudo_asm.h | 60 + .../bspinclude/include/xpseudo_asm_gcc.h | 285 + .../bspinclude/include/xqspips.h | 804 ++ .../bspinclude/include/xqspips_hw.h | 400 + .../bspinclude/include/xreg_cortexa9.h | 578 + .../bspinclude/include/xscugic.h | 725 ++ .../bspinclude/include/xscugic_hw.h | 762 ++ .../bspinclude/include/xscutimer.h | 360 + .../bspinclude/include/xscutimer_hw.h | 262 + .../bspinclude/include/xscuwdt.h | 382 + .../bspinclude/include/xscuwdt_hw.h | 157 + .../bspinclude/include/xsdps.h | 410 + .../bspinclude/include/xsdps_core.h | 132 + .../bspinclude/include/xsdps_hw.h | 1508 +++ .../bspinclude/include/xstatus.h | 525 + .../bspinclude/include/xtime_l.h | 86 + .../bspinclude/include/xuartps.h | 523 + .../bspinclude/include/xuartps_hw.h | 427 + .../standalone_domain/qemu/qemu_args.txt | 51 + .../Vitis/NewInstCal_bsp/platform.spr | 2 +- .../NewInstrCalBoard/NewInstrCalBoard.prj | 2 +- .../NewInstrCalBoard_system.sprj | 2 +- .../Vitis/RemoteSystemsTempFiles/.project | 12 - 263 files changed, 72421 insertions(+), 16 deletions(-) create mode 100644 2.FW/Zynq/proj_cal/Vitis/.gitattributes create mode 100644 2.FW/Zynq/proj_cal/Vitis/.gitignore create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/NewInstCal_bsp.xpfm create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.c create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.c create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/system_wrapper.bit create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/system_wrapper.xsa create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp.spfm create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/NewInstCal_bsp.bif create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/fsbl.elf create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/generic.readme create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/qemu/qemu_args.txt create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/_profile_timer_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cc.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cpu.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/perf.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/sys_arch.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/bspconfig.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tls.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/api.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/FILES create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_proxyconnect.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_tls_mbedtls_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/fs.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/http_client.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/lwiperf.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_core.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_mib2.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_scalar.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_framework.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_usm.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_table.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_threadsync.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmpv3.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_server.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/arch.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/autoip.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/debug.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/def.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dns.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/err.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/errno.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/etharp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ethip6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/if_api.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/igmp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet_chksum.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h.cmake.in create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_addr.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_frag.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_addr.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_frag.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_zone.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip_addr.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mem.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/memp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mld6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/nd6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netbuf.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netdb.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netifapi.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/opt.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/pbuf.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/altcp_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/api_msg.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/mem_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_std.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/nd6_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/raw_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/sockets_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcp_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcpip_priv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/autoip.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dns.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/etharp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ethernet.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/iana.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ieee.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/igmp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip4.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/mld6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/nd6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/tcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/udp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/raw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sio.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/snmp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sockets.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/stats.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sys.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpbase.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpip.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/timeouts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/udp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwipopts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/mblaze_nt_types.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/etharp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ethernet.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ieee802154.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_ble.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_common.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ccp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-md5.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-new.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap_ms.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eap.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ecp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eui64.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/fsm.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipv6cp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/lcp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/magic.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/mppe.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/arc4.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/des.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md4.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md5.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/sha1.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_impl.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_opts.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppapi.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppcrypt.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppdebug.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppoe.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppol2tp.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppos.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/upap.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/vj.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/slipif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xadapter.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xaxiemacif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacliteif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacpsif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xlltemacif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xpqueue.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xtopology.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/zepif.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/pm_api_version.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/profile.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/sleep.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/smc.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/vectors.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xbasic_types.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcoresightpsdcc.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9_config.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcpu_cortexa9.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xddrps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdebug.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bd.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bdring.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv_standalone.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_assert.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_l.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_vxworks.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_clocking.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cryptoalginfo.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_errata.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_exception.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_hal.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_io.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_macroback.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mem.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_misc_psreset_api.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mmu.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_printf.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_sleeptimer.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_spinlock.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testcache.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testio.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testmem.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_types.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_util.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xinterrupt_wrap.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc_counter.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xlwipconfig.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters_ps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xplatform_info.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_counter.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_init.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm_gcc.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xreg_cortexa9.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_core.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xstatus.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xtime_l.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps_hw.h create mode 100644 2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/qemu/qemu_args.txt delete mode 100644 2.FW/Zynq/proj_cal/Vitis/RemoteSystemsTempFiles/.project diff --git a/2.FW/Zynq/proj_cal/Vitis/.gitattributes b/2.FW/Zynq/proj_cal/Vitis/.gitattributes new file mode 100644 index 0000000..9f33c5e --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/.gitattributes @@ -0,0 +1,24 @@ +# Force LF line endings for all text files (auto-converted to CRLF on Windows checkout) +* text=auto eol=lf + +# XML/project files - ensure consistent line endings +*.xml text eol=lf +*.prj text eol=lf +*.sprj text eol=lf + +# C/C++ source files +*.c text eol=lf +*.h text eol=lf +*.ld text eol=lf +*.tcl text eol=lf + +# Configuration files +*.json text eol=lf +*.mk text eol=lf + +# Binary files - no line ending conversion +*.bit binary +*.elf binary +*.bif binary +*.xsa binary +*.xpfm binary diff --git a/2.FW/Zynq/proj_cal/Vitis/.gitignore b/2.FW/Zynq/proj_cal/Vitis/.gitignore new file mode 100644 index 0000000..e129a25 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/.gitignore @@ -0,0 +1,6 @@ +# Vitis IDE local files - machine-specific, do not commit +.metadata/ +RemoteSystemsTempFiles/ +IDE.log +*.log +.analytics/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/.gitignore b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/.gitignore index c283696..240441c 100644 --- a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/.gitignore +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/.gitignore @@ -1,3 +1,3 @@ -/export/ +# Build artifacts *.o *.d diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/NewInstCal_bsp.xpfm b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/NewInstCal_bsp.xpfm new file mode 100644 index 0000000..075193c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/NewInstCal_bsp.xpfm @@ -0,0 +1,17 @@ + + + +NewInstCal_bsp + + + + + + + + + diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.c b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.c new file mode 100644 index 0000000..1154b44 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.c @@ -0,0 +1,10066 @@ +/****************************************************************************** +* +* Copyright (C) 2010-2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x7 + // .. ==> 0XF800014C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000701U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A02U), + // .. .. 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 = 0x2 + // .. .. ==> 0XF8000170[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 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 = 0x1 + // .. .. ==> 0XF800012C[6:6] = 0x00000001U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. .. GEM1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. SDI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[10:10] = 0x00000001U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. .. SDI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. SPI0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. SPI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. CAN0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. CAN1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. I2C0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[18:18] = 0x00000001U + // .. .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. .. I2C1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[19:19] = 0x00000001U + // .. .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. .. UART0_CPU_1XCLKACT = 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 ,0x01EC044DU), + // .. 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 = 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 = 0x82 + // .. .. ==> 0XF8006004[11:0] = 0x00000082U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000082U + // .. .. 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 ,0x00001082U), + // .. .. 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 = 0xa1 + // .. .. ==> 0XF8006014[13:6] = 0x000000A1U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002840U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004285BU), + // .. .. reg_ddrc_wr2pre = 0x13 + // .. .. ==> 0XF8006018[4:0] = 0x00000013U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000013U + // .. .. 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 ,0x44E458D3U), + // .. .. 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 = 0xf + // .. .. ==> 0XF800601C[14:10] = 0x0000000FU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003C00U + // .. .. reg_ddrc_t_xp = 0x5 + // .. .. ==> 0XF800601C[19:15] = 0x00000005U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00028000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x5 + // .. .. ==> 0XF800601C[27:23] = 0x00000005U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02800000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x7282BCE5U), + // .. .. 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 = 0xb30 + // .. .. ==> 0XF8006030[15:0] = 0x00000B30U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000B30U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040B30U), + // .. .. 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 = 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 = 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_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 = 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 = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. 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 ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000001U ,0x00000001U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 = 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 + // .. ==> 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 = 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 ,0x00000602U), + // .. 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 = 1 + // .. ==> 0XF8000740[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000740[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000740[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000744[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000744[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000744[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000748[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000748[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000748[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF800074C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800074C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800074C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000750[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000750[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000750[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000754[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000754[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000754[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000758[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000758[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800075C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800075C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000760[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000760[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000764[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000764[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000768[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000768[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800076C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800076C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF80007A0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007AC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00001280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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, 0x00003F01U ,0x00001201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00001201U), + // .. 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 = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000012E0U), + // .. 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 = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000012E1U), + // .. 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 = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001280U), + // .. SDIO0_WP_SEL = 46 + // .. ==> 0XF8000830[5:0] = 0x0000002EU + // .. ==> MASK : 0x0000003FU VAL : 0x0000002EU + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x002F002EU), + // .. 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 = 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_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), + // .. 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 + // .. .. 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 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x7 + // .. ==> 0XF800014C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000701U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A02U), + // .. .. 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 = 0x2 + // .. .. ==> 0XF8000170[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 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 = 0x1 + // .. .. ==> 0XF800012C[6:6] = 0x00000001U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. .. GEM1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. SDI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[10:10] = 0x00000001U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. .. SDI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. SPI0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. SPI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. CAN0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. CAN1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. I2C0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[18:18] = 0x00000001U + // .. .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. .. I2C1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[19:19] = 0x00000001U + // .. .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. .. UART0_CPU_1XCLKACT = 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 ,0x01EC044DU), + // .. 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 = 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 = 0x82 + // .. .. ==> 0XF8006004[11:0] = 0x00000082U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000082U + // .. .. 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 ,0x00081082U), + // .. .. 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 = 0xa1 + // .. .. ==> 0XF8006014[13:6] = 0x000000A1U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002840U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004285BU), + // .. .. reg_ddrc_wr2pre = 0x13 + // .. .. ==> 0XF8006018[4:0] = 0x00000013U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000013U + // .. .. 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 ,0x44E458D3U), + // .. .. 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 = 0xf + // .. .. ==> 0XF800601C[14:10] = 0x0000000FU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003C00U + // .. .. reg_ddrc_t_xp = 0x5 + // .. .. ==> 0XF800601C[19:15] = 0x00000005U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00028000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x5 + // .. .. ==> 0XF800601C[27:23] = 0x00000005U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02800000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x7282BCE5U), + // .. .. 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 = 0xb30 + // .. .. ==> 0XF8006030[15:0] = 0x00000B30U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000B30U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040B30U), + // .. .. 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 = 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 = 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_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 = 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 = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. REFIO_TEST = 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 ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000021U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000020U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[16:14] = 0x00000000U + // .. .. ==> MASK : 0x0001C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FFFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 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 + // .. ==> 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 = 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 ,0x00000602U), + // .. 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 = 1 + // .. ==> 0XF8000740[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000740[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000740[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000744[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000744[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000744[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000748[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000748[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000748[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF800074C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800074C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800074C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000750[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000750[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000750[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000754[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000754[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000754[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000758[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000758[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800075C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800075C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000760[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000760[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000764[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000764[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000768[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000768[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800076C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800076C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF80007A0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007AC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00001280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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, 0x00003F01U ,0x00001201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00001201U), + // .. 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 = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000012E0U), + // .. 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 = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000012E1U), + // .. 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 = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001280U), + // .. SDIO0_WP_SEL = 46 + // .. ==> 0XF8000830[5:0] = 0x0000002EU + // .. ==> MASK : 0x0000003FU VAL : 0x0000002EU + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x002F002EU), + // .. 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 = 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_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), + // .. 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 + // .. .. 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 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x7 + // .. ==> 0XF800014C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000701U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A02U), + // .. .. 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 = 0x2 + // .. .. ==> 0XF8000170[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 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 = 0x1 + // .. .. ==> 0XF800012C[6:6] = 0x00000001U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. .. GEM1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. SDI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[10:10] = 0x00000001U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. .. SDI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. SPI0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. SPI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. CAN0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. CAN1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. I2C0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[18:18] = 0x00000001U + // .. .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. .. I2C1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[19:19] = 0x00000001U + // .. .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. .. UART0_CPU_1XCLKACT = 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 ,0x01EC044DU), + // .. 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 = 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 = 0x82 + // .. .. ==> 0XF8006004[11:0] = 0x00000082U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000082U + // .. .. 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 ,0x00081082U), + // .. .. 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 = 0xa1 + // .. .. ==> 0XF8006014[13:6] = 0x000000A1U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002840U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004285BU), + // .. .. reg_ddrc_wr2pre = 0x13 + // .. .. ==> 0XF8006018[4:0] = 0x00000013U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000013U + // .. .. 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 ,0x44E458D3U), + // .. .. 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 = 0xf + // .. .. ==> 0XF800601C[14:10] = 0x0000000FU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003C00U + // .. .. reg_ddrc_t_xp = 0x5 + // .. .. ==> 0XF800601C[19:15] = 0x00000005U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00028000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x5 + // .. .. ==> 0XF800601C[27:23] = 0x00000005U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02800000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x7282BCE5U), + // .. .. 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 = 0xb30 + // .. .. ==> 0XF8006030[15:0] = 0x00000B30U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000B30U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040B30U), + // .. .. 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 = 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 = 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_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 = 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 = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x000073FFU ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000021U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000020U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[16:14] = 0x00000000U + // .. .. ==> MASK : 0x0001C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FFFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 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 + // .. ==> 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 = 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 ,0x00000602U), + // .. 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 = 1 + // .. ==> 0XF8000740[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000740[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000740[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000744[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000744[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000744[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000748[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000748[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000748[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF800074C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800074C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800074C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000750[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000750[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000750[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000754[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000754[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000754[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000758[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000758[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800075C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800075C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000760[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000760[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000764[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000764[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000768[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000768[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800076C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800076C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF80007A0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007AC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00001280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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, 0x00003F01U ,0x00001201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00001201U), + // .. 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 = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000012E0U), + // .. 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 = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000012E1U), + // .. 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 = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001280U), + // .. SDIO0_WP_SEL = 46 + // .. ==> 0XF8000830[5:0] = 0x0000002EU + // .. ==> MASK : 0x0000003FU VAL : 0x0000002EU + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x002F002EU), + // .. 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 = 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_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), + // .. 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 + // .. .. 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.h new file mode 100644 index 0000000..7b9fbeb --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init.h @@ -0,0 +1,117 @@ +/****************************************************************************** +* +* Copyright (C) 2010-2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ +/****************************************************************************/ +/** +* +* @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 142857132 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 100000000 +#define SPI_FREQ 10000000 +#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 100000000 +#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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.c b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.c new file mode 100644 index 0000000..7b96acb --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.c @@ -0,0 +1,10079 @@ +/****************************************************************************** +* Copyright (C) 2010-2020 +* +* 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 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x7 + // .. ==> 0XF800014C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000701U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A02U), + // .. .. 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 = 0x2 + // .. .. ==> 0XF8000170[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 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 = 0x1 + // .. .. ==> 0XF800012C[6:6] = 0x00000001U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. .. GEM1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. SDI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[10:10] = 0x00000001U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. .. SDI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. SPI0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. SPI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. CAN0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. CAN1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. I2C0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[18:18] = 0x00000001U + // .. .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. .. I2C1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[19:19] = 0x00000001U + // .. .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. .. UART0_CPU_1XCLKACT = 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 ,0x01EC044DU), + // .. 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 = 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 = 0x82 + // .. .. ==> 0XF8006004[11:0] = 0x00000082U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000082U + // .. .. 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 ,0x00001082U), + // .. .. 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 = 0xa1 + // .. .. ==> 0XF8006014[13:6] = 0x000000A1U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002840U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004285BU), + // .. .. reg_ddrc_wr2pre = 0x13 + // .. .. ==> 0XF8006018[4:0] = 0x00000013U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000013U + // .. .. 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 ,0x44E458D3U), + // .. .. 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 = 0xf + // .. .. ==> 0XF800601C[14:10] = 0x0000000FU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003C00U + // .. .. reg_ddrc_t_xp = 0x5 + // .. .. ==> 0XF800601C[19:15] = 0x00000005U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00028000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x5 + // .. .. ==> 0XF800601C[27:23] = 0x00000005U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02800000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x7282BCE5U), + // .. .. 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 = 0xb30 + // .. .. ==> 0XF8006030[15:0] = 0x00000B30U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000B30U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040B30U), + // .. .. 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 = 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 = 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_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 = 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 = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. 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 ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000001U ,0x00000001U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. 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 = 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 + // .. ==> 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 = 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 ,0x00000602U), + // .. 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 = 1 + // .. ==> 0XF8000740[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000740[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000740[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000744[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000744[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000744[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000748[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000748[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000748[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF800074C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800074C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800074C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000750[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000750[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000750[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000754[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000754[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000754[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000758[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000758[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800075C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800075C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000760[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000760[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000764[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000764[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000768[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000768[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800076C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800076C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF80007A0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007AC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00001280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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, 0x00003F01U ,0x00001201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00001201U), + // .. 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 = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000012E0U), + // .. 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 = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000012E1U), + // .. 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 = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001280U), + // .. SDIO0_WP_SEL = 46 + // .. ==> 0XF8000830[5:0] = 0x0000002EU + // .. ==> MASK : 0x0000003FU VAL : 0x0000002EU + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x002F002EU), + // .. 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 = 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_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), + // .. 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 + // .. .. 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 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x7 + // .. ==> 0XF800014C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000701U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A02U), + // .. .. 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 = 0x2 + // .. .. ==> 0XF8000170[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 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 = 0x1 + // .. .. ==> 0XF800012C[6:6] = 0x00000001U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. .. GEM1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. SDI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[10:10] = 0x00000001U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. .. SDI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. SPI0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. SPI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. CAN0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. CAN1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. I2C0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[18:18] = 0x00000001U + // .. .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. .. I2C1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[19:19] = 0x00000001U + // .. .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. .. UART0_CPU_1XCLKACT = 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 ,0x01EC044DU), + // .. 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 = 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 = 0x82 + // .. .. ==> 0XF8006004[11:0] = 0x00000082U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000082U + // .. .. 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 ,0x00081082U), + // .. .. 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 = 0xa1 + // .. .. ==> 0XF8006014[13:6] = 0x000000A1U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002840U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004285BU), + // .. .. reg_ddrc_wr2pre = 0x13 + // .. .. ==> 0XF8006018[4:0] = 0x00000013U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000013U + // .. .. 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 ,0x44E458D3U), + // .. .. 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 = 0xf + // .. .. ==> 0XF800601C[14:10] = 0x0000000FU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003C00U + // .. .. reg_ddrc_t_xp = 0x5 + // .. .. ==> 0XF800601C[19:15] = 0x00000005U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00028000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x5 + // .. .. ==> 0XF800601C[27:23] = 0x00000005U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02800000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x7282BCE5U), + // .. .. 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 = 0xb30 + // .. .. ==> 0XF8006030[15:0] = 0x00000B30U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000B30U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040B30U), + // .. .. 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 = 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 = 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_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 = 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 = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. REFIO_TEST = 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 ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000021U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000020U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[16:14] = 0x00000000U + // .. .. ==> MASK : 0x0001C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FFFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 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 + // .. ==> 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 = 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 ,0x00000602U), + // .. 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 = 1 + // .. ==> 0XF8000740[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000740[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000740[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000744[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000744[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000744[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000748[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000748[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000748[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF800074C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800074C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800074C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000750[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000750[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000750[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000754[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000754[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000754[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000758[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000758[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800075C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800075C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000760[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000760[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000764[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000764[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000768[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000768[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800076C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800076C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF80007A0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007AC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00001280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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, 0x00003F01U ,0x00001201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00001201U), + // .. 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 = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000012E0U), + // .. 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 = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000012E1U), + // .. 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 = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001280U), + // .. SDIO0_WP_SEL = 46 + // .. ==> 0XF8000830[5:0] = 0x0000002EU + // .. ==> MASK : 0x0000003FU VAL : 0x0000002EU + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x002F002EU), + // .. 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 = 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_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), + // .. 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 + // .. .. 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 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x7 + // .. ==> 0XF800014C[13:8] = 0x00000007U + // .. ==> MASK : 0x00003F00U VAL : 0x00000700U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000701U), + // .. 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 = 0xa + // .. ==> 0XF8000154[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00000A02U), + // .. .. 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 = 0x2 + // .. .. ==> 0XF8000170[25:20] = 0x00000002U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF8000170, 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 = 0x1 + // .. .. ==> 0XF800012C[6:6] = 0x00000001U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. .. GEM1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. SDI0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[10:10] = 0x00000001U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. .. SDI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. SPI0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. SPI1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. CAN0_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. CAN1_CPU_1XCLKACT = 0x0 + // .. .. ==> 0XF800012C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. I2C0_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[18:18] = 0x00000001U + // .. .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. .. I2C1_CPU_1XCLKACT = 0x1 + // .. .. ==> 0XF800012C[19:19] = 0x00000001U + // .. .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. .. UART0_CPU_1XCLKACT = 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 ,0x01EC044DU), + // .. 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 = 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 = 0x82 + // .. .. ==> 0XF8006004[11:0] = 0x00000082U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000082U + // .. .. 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 ,0x00081082U), + // .. .. 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 = 0xa1 + // .. .. ==> 0XF8006014[13:6] = 0x000000A1U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00002840U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004285BU), + // .. .. reg_ddrc_wr2pre = 0x13 + // .. .. ==> 0XF8006018[4:0] = 0x00000013U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000013U + // .. .. 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 ,0x44E458D3U), + // .. .. 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 = 0xf + // .. .. ==> 0XF800601C[14:10] = 0x0000000FU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003C00U + // .. .. reg_ddrc_t_xp = 0x5 + // .. .. ==> 0XF800601C[19:15] = 0x00000005U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00028000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x5 + // .. .. ==> 0XF800601C[27:23] = 0x00000005U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02800000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x7282BCE5U), + // .. .. 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 = 0xb30 + // .. .. ==> 0XF8006030[15:0] = 0x00000B30U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000B30U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040B30U), + // .. .. 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 = 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 = 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_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 = 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 = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x000073FFU ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000021U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000020U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[16:14] = 0x00000000U + // .. .. ==> MASK : 0x0001C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FFFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 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 + // .. ==> 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 = 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 ,0x00000602U), + // .. 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 = 1 + // .. ==> 0XF8000740[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000740[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000740[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000744[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000744[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000744[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000748[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000748[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000748[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF800074C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800074C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800074C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000750[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000750[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000750[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000754[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000754[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000754[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00001202U), + // .. 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 = 1 + // .. ==> 0XF8000758[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000758[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800075C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800075C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000760[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000760[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000764[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000764[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF8000768[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF8000768[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF800076C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF800076C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00001203U), + // .. 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 = 1 + // .. ==> 0XF80007A0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007A8[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007AC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007B4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00001280U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007B8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. 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, 0x00003F01U ,0x00001201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 1 + // .. ==> 0XF80007BC[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00001201U), + // .. 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 = 1 + // .. ==> 0XF80007C0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000012E0U), + // .. 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 = 1 + // .. ==> 0XF80007C4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000012E1U), + // .. 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 = 1 + // .. ==> 0XF80007D0[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00001280U), + // .. 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 = 1 + // .. ==> 0XF80007D4[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00001280U), + // .. SDIO0_WP_SEL = 46 + // .. ==> 0XF8000830[5:0] = 0x0000002EU + // .. ==> MASK : 0x0000003FU VAL : 0x0000002EU + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F003FU ,0x002F002EU), + // .. 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 = 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_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), + // .. 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 + // .. .. 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.h new file mode 100644 index 0000000..1bfac9c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/ps7_init_gpl.h @@ -0,0 +1,131 @@ +/****************************************************************************** +* +* Copyright (C) 2010-2020 +* +* 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.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 142857132 +#define SMC_FREQ 10000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 10000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 100000000 +#define SPI_FREQ 10000000 +#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 100000000 +#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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/system_wrapper.bit b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/system_wrapper.bit new file mode 100644 index 0000000000000000000000000000000000000000..784c1092515e7b71d7f4131eb18d7596cf3ee52c GIT binary patch literal 13321514 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfWVigK=so9 z@k{fLZ~tBw^MeE1?{!N(=1wf%QoqeR^;2*2Mp~>DIP^<{wS`LVq(GJaSntI;PVVIW zvTp(e2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk 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¥{;ieax+MSe}VglwnHl8W}Ae>(vW> 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 zoUO}LOVD+ar`Zk9wVW;Nn;HLCTSvl_x^g}~{0aP};&&sebm10*mXf%6W`m$Ibwc1gF6jUxdP zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}f!78Bz2eVa8#~IqBmoj2 z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+H$Q zB(VOguR^P%`Z_}EG-$E4uxA+J zfPU;n6GYo51En_j`_)3V1zUe)-^&Cq1ImOZKv9zm{z;71(pFow6)uRaT3Sh~R@?fZ z{rTQ2`s$ymD79wZckOe|y?6fQ50HpDYv!K4*Pp%i-fQiD=iI&TnH%O(IX%ah!r2yh z#(lH#Cxn?a)z}kCyp(931sd}xVlz@6&X+iHN=rv8cBs@XsWjHY7fy9J{=%uA9#k`@ z7&*T7&N+;yI~qRS3;5*Ax8^NRUdKEQHlxf58#$h_n;kO8e@enR({EO5*R1_Xf6^x5mm6qZu zx4oI?=4`J-Dn%lnGQTRmFt~-uKi1UK8b@Ay)9fHNO_T+5G(lQ13ZCShB2USemhI=Wqm<~^$ z=aae8hZUHc;75krBg?seq$zgXk77Gixg~`X2diYWv*Wx@CnXP!~k!vxT=wZyz)@0q0D}S<* z=E*8}`lMg|bB8U<(bl$2zBRfXHkT!VrUjO5X+{qb@wPQ0dFVyK^DwvltZ)H-mZF(% z7QTdJ7D(LjG)3F6=ChrPAJ4Kpee*i?TSr?q+m_&{Y%t~UKYozatjHo+)gyJZLU69&UKGu=?)~n`G`J@MQ7BX86-CaJ0`>%p8L~)%YCsKb7d} zD~_z%{=31pM=4Jh_qn#|JF-&zbVwE6d?fYskE(1-^2y>}Q=7h)=B1d(>hfW&(E181 zok^Z7-pX+9%+%uiRL55Te@9Y%(-d+(_GIyN!fn);q1o4KqadGKS42cP+q!`7kbI6NJO z&PZsgMUf|qXBjs2<#=9@Cy38UzJxAWV95eY7Fe>tk_CQ3EHL-c5$mHPf@SLtD`shn1WAWk04nl zICt?H%#~eS@(4I{?@5m!$q|W6ACc6Ll~C}`r=+-UR$EQPWm@wv&m_g0-!G<(Ja6*3 z(7aFu(v&HynSK^^Ub16FIMTM-;|q{UQ->bfrN^2T_Sm$_MJdOpIQ2KPk)$cts!3LL z*P>`_@e)n92`-=xu1h6+ki}EVBG*i2mS~h~Nwb*6TSU#%hur#6mDvWGh4t@w3JUDU zC6nrn@mXJ{vsc45A1*M@=iEGOD~%yeij>1OFL$e6sxPOuB|L6Xw@6NQLHfc}FFKpm zy=lSpM?o};$-2cDM@J9bY*)4hu1rrkY>kyir}}9s-F?FBg1On~;+Su~HgDc}YqccM z&(VR+#B(i&PTlG!hn73W+<9#y&(G$OJWM5ze38?4jiy{oe~a#BXW+4nYc+lPmkPxe z4pdLiLdCLtl7q;uRTp9w(PrB+PqA%EnH{q$(&e`4hLW__Wm^Ov|NHP7d)R6N1;`=aVcwIV=Dc zTK-vpeT+$(^L()LNlFQ{HfCYoZ0gz*6<@Hvv*=F6=7Cj;zi7lmoZ%KMOi6RD%E=(G zd5jX+Mckvck+@Z#vh?Sve3*`9b{6f&44GZ{uEU>?KUDo_@qQA>$M{rvdlv2S#WXD} zlTllKOOv;CvP_@)?D)fC?YLEvRKky}o~U?iTKv2(KsPNZk>#IgmucQX%qF&DajPuN zm>=s~TH}1|Z|0Os=3%O^g|%YsS>vr{f%OBPtNz>)=)EU;vO zB?~NBV95eY7Fe>tk_DD5uw;QH3oKdSDYk&={_s<*aY@~iwZM{3o~#9z(l1$H$pS}U zfzW!PdEZ;-^n&sON#=#41A(WHz~=QlnLNThv6m%Q81?U-2?!C2hSLyTDgNP1r!>P0 zZ2ILH0Z<982CBz;dQ%P*eI22OKxnxD8NZTZ^RIK$7dF{c?*$r0@0r6l^EDhFN@bCp zbNXJRUo42*TaubM=fD*RC$i9ae#IyX#H-)Cx9%gdw?45F!o=Rvgu`+-HPe(P5a@U? z(;TKdgI-!S@9xl3vd~SO3%k*m4@lyC5s)*2OIlR&z z$;D>5=3%oC4UM^m)u8P=SDVGHQ-<7cMH+dR ziK5W(R}G0-MI4`oURq#Va!n#M%O_3bBUwBT8blOqda(@&i8dsqfDwV9;g14>`I-8b zl9QYK(VTMlaLtP{nWL&xGbc?vs|?K?TOxxwElMLDVu)BiSxfi0>M@=wMtKUxbAl9^ zceS%9M^*k=DVs=Ez9#-eBkfa5Q|Cg&c3LyD(60F0;*}X_%B2x!(vbOxNNdN*9MzMl zlwSQ{(?Z*0a}s5&g{kf7=Jts8jkdGpjv8Cc`EwOD?L3!};W)_o9?_K zkIoNs-Sat0S(NLm7LKdTm|mLD^iXd3#lk#A&d>2#;iCD^k~$8EYvvJ4Ei-vuRSk{j zn=}yTG3a>xu<(^>!ZzFJq@`Mvos^4MQfJIc&2VQ)|g6=7OwFUdNH0uBnu4@T~QuaNQ<7kyW7s*?5GkX+hK}y_BtQtma)>%tTjy#^m5f=r+O)&*X8R#xzOW6ag!?Rka6U% zfSkrA^&04W6$O!#vX;z2;lnkCYXd7I(x_(Xlz!|%t&m#6=jHU8(n3PDUgB{}wQR}? z;m2zH31^U2NLwo9x0;G{{8>w#Mb_*Z5jQPK)mY<143!Q=h$jLLWh73^%Me`^Z z5XDV8P(aYOmCn#wAO26=b-9V+L+q0?k>G73H7Ob~ z?BERPA9b=)I_Sjzd&#~E%Ns~URQ6w>_Fb8EhM`l zd(6SLa&Xi%Y->iXeTUlCs6S0L5a(0qu%Q&%t}j2;=il23KDYQhZb6VW4~#9hxUIiE-pX6YqCYAc=N@Zkv`@uZ6pGm%K{E zww9#1)jaOCXiC*%xJVqq33Zf)N~##I#bKPpl}{PzO7rVRZc>Gh4>V?Fqpc!`NXF>F z5okIg`p~~=nwH}aNcr}j;1g$jqQJLk@0+w)Ds|cKl0JtJ{Vl9T&0|hnHp0+ulm1MW z6usW_40>fl|0-I<=z>T=i+6=})m>vpBUs zO{>hZEJ05nHTx}mrlLlY$d|y2Jo$^wRLl)MnbM_TvO45=NF)^Fv^;4XJTT1cVOXTP zbbH^A<-%Ijpr;AKNLV69Kia3Kif%|u)r=2Q5>ikWbrXKm-hgzSSfAD} z7RpC%^c9iIbg#2Rn*O4pL&mvbQX=^yf})njLo~Yt>1?VrIyoh*Ny*`#CUhC<$v^c4 zDkh|EzAehYH?WAKRTryTF9W*>&rsu{gcVqfHKgKBBhTAm(I}3PsdoiXRaaCylkVCd zL^6aH$|)B8VV9N55b;(Q0~K%*-lcgnB8FA#`vFwng9y`7X#~vodAyN~Rn!JN2ER^ah&Ky2Z39dby#FPOSF#no5oa0k}#bEfqqDj%&A$ z21xxV0HZDfQNfQ?k&I%eNV-Z9!^fE1#DFkOsvt<)A85dkZ`Ep!ze&iysh!87HyTyt zDvAcKV??@?bXiU91N1T1(m%BQgZb4%K8jm#12Kxs8ACFJjn3?@iFuuYI1b(75M6|a z5y%7|!dg7+GXYx=f}YY?7pv}> zMY2&JMN8Df9+HW%;lvaT9G6m#?=?zFooSAC;f%f0Bp5YGc{H;9;=U->*bale+98Yr z!%emIZ5PjooIJ&a#wbohKBB60FiwslqC`AJS}a5E zl}o;0%)Ep3z*q$P=qlss@9PdQHKP&IKmZ!d^Dm!FEtd+B|$VuDU6oH1VO!5bL_&E294^_G)=9fDUjFsZE@Hd z_c{_9<7fm1xoCiEyw0a6QC5B45E`R;0I%N1j@!lfoPtI2OSvK?V;LZZXw@o6d07Vd z!a66SAFkA;O-=GOB`Ub|P2Z+%}hy028w zULpqjdlmkHRzHK}uuAujJyc7IOmb8x6B+kaYSz5O zWwy*D)Vvr|A&IQm0aKA^EGSzgsF^ykG=5Eja7@-m33(}GL5g56@JK!*7ceWyW~S-c zd`%DTiU=&C(m9)|ze!$85A-OSw9h^>`;38j9B!J^=gpLYx?yBV8bH z3ua84G;pIcrUP1Eq13SoF47y59H;QyCR2`)WU22NLzUWk;v&j z10EU=V{^>aFUbZQo8IVOWvMKm=S5g+)ydf|_&+t%^Jz7zTIq=Q1o^#e_iOb3G zW-U%oHp?4fRB250TbA@ZU|StWV_TlTxe{$AbN-Gu43VLlP{jG`oJ-WL^hCO!H#*&I z<*j!<@>{W!p?7!IrX0z-(nPc=sX1$cGSXEEU6rc-i>-u{UR^QO9ln&I2GI^u_Jm?j z%1-(gSj^(~sS|ppiaf4#?w<85gg$_w@#=__Lc7`dGWPW(rq9(c|IFCH)pEwWr?#$N z&9lUkUpq%QW@w0|o0RVO)Nf8PG%X6tPe?`!tEDhCUc7_!G2`e9qQY38e6<*YqsPh5 ztuK^He|^{S_XnjeoH<;ORlc9Ng(~sTV?#Mu_x<%Bd~DV7FaM9JgTJ|aaC01= zeeM1;uiduo&F}lhV({&M`jMIRtGrH`nF-P)wV4?q&HnvsUkl;Y5_ia-UkxoTm$&gvnU3)cRWh^X zq8F)388(Kih~>lBZfb=pcgSxc|_55OLo2n*;3Wyo|^zU#aUfPk)}w`Tej= zBn?PVOXWzv;*u3BRI|9(K1jYD^-Q$mg#UVx92E3FJ>hD`uAAP;*u`Mc@!9A8!n{(p ze3G$F`c_j$+bsMUY5Ig=tJP0(xxAlv`;f-_M5L~KKXwr!18zz@RxsZ7bUkh^3@kAd zuY4tU=Z7D=>fVWQo?b+KLfOB6ffYiA9-G1|E`#m5-*zp8Q4jQt9mD^&IkcKS;`lQmJ{HUnP~Z7)VyBJn2_mI$SwR^{HGMx@3T70Xbc1 z3jyg*q0uzcUq#)(!z9y}>%U66vd4N0Y59@UidhMU^V$0O&;PC;XIC%>GM=<%!sZyZ z<{VAa8jn~pU-Y5}Gd(LhR;-u_E(%`69HT3z6r7GB)e}A^ls>d~H6u^5~_Z>>lV)~CWJ+nDJ`L^bq z`lQYBO`ojr{iuz@oSOP%#mowP^4Xb#_~hWhEf+Nh2*=!xy$@c*xQ;~@u323t6sNpH z`=mW*m7WhXGpSFUgU4t8{(~=2DWex)|NgJzlf&ytrH|j$W?9jUjF09v|7Pc5`pGG8 zSNRp+^r_OzmeeQ1vT?Gxm-JtNtYM>h(BOn1<4Qa#`=R>g$yDHD0?{>}Pa67kdHQq5n|x1K zxlBGFrs8cwio`i(S=@}K}2P97e0d+XK_Q@o~>CSIRV6x`)un{LWbcWthGe>LZf<~=HpILJ{}rAZpEf(mQ#ihupVk5#0($HM?sZXjWnTwbfYbe^Bn81 z4S&^(YsNHUGb}Ci{muMRIvWp~5}DwSFc{8VF}n-_sD6&5q`7a}G}uLwHbuQaGl9>k ziTOy>%sB+N*~hc8i_#W{W=@$1_4F{8o>J8#tsFDaA4TBiW@K_CGz0NM z(4_XWxS0b@-W+;veA5&l;`5pE?PS#TS-s<@2j2czF>Mo=xa&Oum z>?ugo2{qAl5Cm0=MJXdv1F|DX?quJx)%|~o7^~%kMHo7!oU_k2|gYGOXsxugLl&LHMrzCrc9WT&*hzh+1)6y(3FCjZr zBK^`FJKzLJ;pq}4aVgZVORd>~%>oi&r8p8dC>b~;A)06vy#$LE@yV%)6jd`x6sFT4 zeUP73bRaNFMaYB6LQLZmITKizK{zTqde2}lWoKv+N&1FLxW*728X+hKj;Mz&F@^}c zk8~$^D5K-pdC+^Com(SRMK|IDEKw$@9=phj0cc5RH=~>vu7tQmN`q7!%Csg?@uw8# z58heBZ017I$Q{t~YS*R^vGF_KZ&8At7+~}n@8KrQ7O=HhDop$9alU97sG`w=>4ajWKozT|CZ?a`W6;-+X@}7+ zts*i~r(HU>xJ8T%3W&>~++?I$sq5(tfDK%JHa1jlh&rnUoj6b;CJHClv*F)jL z?CK&>5gsz^QB4D997Rw{4?Q)Mnqe2|264sp{i;h`)DyAERZ3k^v=61Oi?ff8PP@HJ zrcgtvX<)6t|>hF0o6lK2?|sX=zi{{b3wVg)W@Bt9nqCD~5^8~h43baoU6|-%53{46Y1}!S zILN3l&6oKUmwb#CUOp+;F`GF0m8vv0Db{@?JjNi;^6yN|j8iy?%Ov zZCue&;S;AZ%??M+@mR?IAgsryie*rt^TFzJM`PvrVF(&IQ} z8Ffhq`S*R2b4f08!P`o;&?VK=Cpn=cQO8q0c9FG~XCBZdQs6LeP5U){+No?2Yfj$6 z%2Jyy?r`y^N};TF5{(y%NkJw$2dCEzUa0n@r)Yjj27aKxw- zbdFhxp2@&9{?Z->Zobg)PIarn3Y?G*WNeZq#}NKVC``IQW>%^qIJRrFQ>>EK{wo)1 z%2iJUp}P^soKmB`Leg9VIw*&O;In3C+>Ya668iGM1@_~&c>K!iWtSwEM=p}f)7hXF zc1q{Kw4d2xYeh_GhPoz1UP?dUzvMdOku#Vi7*tW`#`#iH?_kKOOc!Ti0Aq@>k@uzj zMs}In_>NJLE0eym|48 z@mtCcDecWIX06=&UG$43UK z-ehvQtixkE-=pH#f*&;6vWO$uic3VwVlB4-x;*Uaxv9@G_jjkl<2Gbw=GJW-7BfhM zAhzSfAVVcv+URI9ls0Ah$*29zhUaRm17Yi&-U5c_p#tz3M2YU@j5pkf*EFsg zV$0}8gnw%|4P)#|22gPm)*mt-8iYR46ZiMnSSC4yVm1#>7}E%>$YrEC)}V&)#}F!#f;; zgSJ`@CpnPvkZ!q`f+?X;f^IQGIwEqYrO`PwX@xQbGK@fn>!U{(EKWxWDXlnH>a%_( z6pBN)iIyYJ34UizK-myKO@=B8Mmu57PyA9+3C9werqWDkAQ>gNk^TX+-`@eMkXxhe!ue>&k(wk2fCzsaas}D0T5bhE(X^) zuqf?&P z=^Ped0ECEQt`<0r;s!4lbQmzJgC1q_x3S8WUT|juoZR8yYDK0|=Xkg+6AYI@D`Tgg zWnyt^av6o;0=el_Qh+9OrD-jJRN1g|KBcC z8ofU3?eE%K^-VpJ=OulvH;&JLsBf|~U0=7XQm+}z=Va2UCO0J4xelpJ#nJU9jIR+n z)qMt!(3@!H%s){Svk+=v@C&s$OzNb6y6rBp{wbE?YX6$m+|ot04V%~N!prLn-F~)R z#apM&eDmsw2lwAzO+K(jUPQNuN_|1k^#KsM~jNx+puAW9*y=b}ovT-X$u6N_L$?=Ay#hnljj#=J+FB3&EI?MZO>ZuoT*FRG;{FbZ3l0? z_jfM4=j>Ph!dw1qs_Xi$?qKDvv-{S*|CRCEKKq52-?aas_q}h~C*N~pDOzr(WM@s! z#ksFcUgxgcUU}QvzrF2++fI2ChLdkNSM8{}pyNzV;GKLz_kD5gfqy7-FWhW!Nx9+e*0-J*!`t@F8SiJ zgBR_7{NZ2!=FMB~dFPk@eD@dk{NUj3$7g1)sq9(1_FG@S_wildDBO0S?jAa(4ncW` z?|IEEVJb1}3T>G;hJNw%A7JliR6??Dmx%HMHxb5v{ zUwi9&URhf4?+^XyP5VFhzCXC}yWhQ$GlqlJ2%pgK-Q^Meq_eW;HLt(ziq~zWp9KH@ zb$k+3T_-+?<5efb?}?`#I$__ff4?*J$y=8Fs`}*gb&Eo>|@b zQ0eavoc8EFYhQKG+djSL{jb@5%C;YT>9l`(+n$R*{9BZE(QvZWGbUJ@Rh95DL73b)=te^QAO|yl+9{oW;d&w5AVQ_Q2}~r}$mo?5j?apZ|HWG%?N7r)OO<=GPR=)|~1(xaIRQ z^YAv$pP?Qqm;H5+jJWY~98S`812}^;A-QON+wT2&PW)Z{WuHc=#}>Su=4J7W&d%c3 zlZFnU2vF#P){K&7K518rSCNiI}J}<)4AF&GIiaCjr z(^$0p{x1(x3<*>e@ct_~xr%0w7xBq3I*if$QlDh$yuh)%V7rB3%f^|98aP8wkpa0+ zQsFHRZW-3t%$1kW=4bBuwQqR(3O$?XV>6t3;7`xHZG6GOgShp~rccy93;N_;^b>#P z#H&az^=5p_w-2sev0T3=Z1;(wfo~*FwIyjaS3rMxr3D+0z$YqwH9q;1+$V*4Q^CFW zdSB%}ZPJf-q_?;C%MbZMN3C>q;cCW-OSa{u*wV9Q_?&ZU@r=FXyRJ49p7%GV&gn)@ zC2sNKi_ENeQ0=p2zm8o2K3Vhk`Pc;&pWKZrQ~TvQJ2vJ%(X|a5CJcAzd~)zU@!Gvl zwiIc{dd5`bq**@EJ@Pc6h7NythY!Y_X&<|0_mi>?cHWaSGvB}`YtRdxdR1pf+Q5(2 zC$ScSp*YcDE6PH)I(Tx#9hC}1COtbCT{_u+Lt(7&m&j@5bx@{4@OhTOgYU?6)Q8h^ zjVo@0^+Nv*dk~jHzTvwxJvX>%B-6=F-L$6V+~7wDH|4lC4CI9~l3{pKW0jtjES`M- zDwCa=Y~g8Miff*E-Z`I;^!G=3IG3N}Y1mM?x%v3?l|7$D;$y!uS$knAipSpY!1b@*(9^a18omltEzqB<=`JPI^Ng3)D#HU&KQ|<+ ze!w}yvsC8N^uDWK&pd9>Gm)82=;Z;A-aOy%Z}S+| zX{=|S9v_j#* zp=Yix<^R+H{wQ3cwSER`;gcRdF*ksYXTY$IPbnO+PfmENI;q`%9UD0+H`DS-x~>&n zNO{OT`qS2+)P5)^6p zVoN&0b2D7eF}CxyEQ%9)IplrWG`*HF*W=~-+w{Pnn-2VFp<)i5VsD9WQ>9}(mpUVj zxHDoMi>h(Oq=da`sAmfmG;~>*;f!9wxyDkHj$S=WIDuiMzPIi)l)c7i;3PizIeY8s z`WP7{iAnQx(mE44p>*=f!uo`pjn`A1^#`)>D_K})8|6ah7;|}-$vHnU?ycwaW_nFd zxl}G((=2HqCoz*-#XSyktd0h zhL3<+jhwX3qg=Dp?C_eS~;3)cEm(d`Cl;qshX&!$uyr8Fk?xm1*Op_GFWF z8~B$c<#@J=OA`iAjpu}V^%rm-DgizZeDs-54n`xMZ#9-eQ$E+wBIF{3CW{+xhH z;TfaJpN&6B%y-)((2<*ct|)ZVPK&hZP<-mp1g)=6-=-wXH=~61#4_I`wV+M1Eeb!i zU3$&M4}~?88S6fv1tH6yZ~r};s(A`w8yu+_+mg(W<|^}WzQjV5Rz);j z{%J}=NDJPi%!w?N8+%^(W_*<&^IPKWl4*rodAFp<4nb_xnbT%HTvTF|*_7x|E<`bH z7LO@#lv=sP&0~4e#lpNj>R#_B1NLxBX_qrJLs z(#CWARby!#j7G-v(gr7dI7h6H)O-PqPcfLYaE_AMWuz3NpH>5PStnxLaz+`=WElf- zg{)>?h3>jgFuJ%1oWFWL7XuM0kY{2Fu4GVNPsz&40I|Ruf;~`A1T0Rq^RzZQH#Ww$6E(XAhW)Y#>#RpLAIPJP_Mw|*M1FNbL`nvO>NnZZyCY^T|7 zGs(d~marC-Pvpj}vbYoZUwXBCv{9O7`KH}8n-U=b=tglW4?2x}85@uw9(TIo$VRs2 zuq{Ghq2H6qiqZKNU>(2B?Dgz&5n;sda`&T*{j7v^xDG#CZc=%Aj@3}1g3Op9Lhcc9 z{YT#QJF$A=vcguFD3Xu_!PuM$R}K%ZU4$aHLGE9lYa3nd<3TshQZ9}hs?kE7^mrWG zjhVY-vadVoGMGlrfah$t;RkK~U4zQ1fp~TpQYSYW_EHsAFUiZ575Eb>mZAi&wWE9= zDWSE#DccBkXbddCszolG9MB?gATMyCShiDY#!cKyGmodcZto0+`Xb{`juD0k7b`aGJwwhXiz`M8VQ<*U-cw2RR8z>?RZelSnDhF=^GO-l z)iO>gk_p`-HI{T*{bgy+*l=n?8}|T3;~>sND27)TkmVBuvuHXuk7GT>k-I{=NFtJi z6N(nGZeN|MUFK*#@kEjowawIY7v-`f+i%H4RIF(Czz*5)8nZc6zcrrf*Gyk*8(=#Z7_&_%|?7UHf6Tko7d0jNF1H zXeMbvRP4~u8s)K2s&{q*Hyd3XizaejgoPYC(!u!*d9snDOEL8vh3!{UQ%IV0?5xHj z!2^0O*J-PRr+GDh}q&MLKd&*8@0*D{;I>BvfipC+kE< zdvXOoGQa>w2=0(_&X)+0kV3c$lR54BuHJ~Vhnj^G^8i6z1%&NR?*5Ws4^pv7SHGGw zrp7erE5bYBIB+AzG2*jL{iPB+YDU`==d@;Al`-jkAh8i33T2Y#2`F!U`zM z+NwxkTuodJmN+z4t&33O^o<>4@0L{_*{*6Sn@ZH`Tn#Me##kR4=Es{{!x`raDo}S) zV}uOBwHRdNWCJgIvQCeYjnXVlb*M9*8V$l4=Oz(3LYUo87D?39=Td=IBGZ<_ip?-> z6cWfuqtfW*RJsJC;GJxQ)7gEy<;O^cR|J$tgcM_3^hX3r_|f`Jp`A4TW{!*n*!B!8 zOlb8xNH#CooQa$wufOxYCkPCl!MzOM&#u z1x;xaH{p95^9g$OaOU~Ge@L*BnJFlREb&jB;g99+t%Gu^}kOxoadxf$wE$ zy2D&GojN(Kk&mP#CC>&2%Eu5Ws0C8s1xRcVw8j`(RF#83R6RBYDOBr4tY|_ArsyK1 zjan^6V&7fiK9LDHyxUpVJ#h0v8aiBHD$QXNIA zk^`AQ++kTVkclNPC+lPVZQ5!$1=g(vKsXX-`j}eCv(^zBs1Tn=Lo7;NU%{h?A1TPu z18Nq9%pmZCTqe&$i)HvYKKimg$6GF#Gt_BG6h(bemr0Uxz?5Q`IZk4sMQu4GVsxOg zq*4WhHHM+E5elhYa^jGN3M;>R3s<~VanxKX3e!4W`>IonyD*s^qvk%S5;++^GY;dy zf+-B){)*H`yUMC7kf_0_kVZ()tdYk=5{)s&xO4{r3%!XG@DG9#TEI=s(Yo zg>ldyj)aafQ${T^>y#jLkuzW(e|Hz{t@Gv7%~sL-%qW=Pz{9z{{3=F=OZ%86J4#Sb zw}Vr}=tXSnV3fz9_|T@IxjrqI!R$7X{f_af7#U`P3Fe8@<7(n~W3ekpt(z^xL0ngt z+2jTn#}j6_Ya-OsBReC(6Q(HIQ`|69LW6xPzb1fRbUEi^74jw@VT|C5=74vcaDySC z(?+7pf45e_x5@bePp0_iUmOxNig(3)nBupE~=D`w;jlgcUaSbbkDC~#cpCYj#g z2DmqQnZzf4Wb%{iC*^MQk)FUA*%y2ybez_bo6d^gnN7~=fVZ}shMFbJ!L<- zd5Vse40=O~gsh~f^^o>G{?!2LBK3#i^-kjK1S91c68zpc+bP`j?mCsRlhQp#Ymu}1%XD-QAx^~(4V`Ulm&Nl?%S0_1n)Dm4a@Zwny-gTYoD)@F zWi?B=Uq03)R%F;s>v#n*1E(P+*HTzvu1=wYZ;+ML#Ydl=45_VEodS1jL=7Zj7Q$Gp zJz7N!pVSP=?P0<6o#OQOa*_!$fNhPqe&g^HuM^+!ZVJdR8*n?4tfPnurZ?E$V`Sn1 zvW#^STcsiNkdtPFoVAEFoE+9i7LL4vfme@3=I*n)Wy(o%!&$-fu*kYiclS!k-*#n+ zNppl?)eeV(#kg&BjhaBLRf`$)xq-wG^%e{?B0WPllOwB!5wP9W{2GLWQ2*9I)Dpijv{qgt=@IjwOtg7xE$}R9m&JH7cwkk>^t%JDrS1qI4V$ zo`l3$bjxJG4FK`bxlZLOu!S>?Jf&CX^O>vCK+ybiz#Mi&5o*abu#~->@5DH5@mxwl zs20+?Gp6;5(HeKeS~Cn^aR%#=bmea&kgBkPkb>jJufpT>$bp3YR+|bx&(=$5F-Q}9 z5zyjN1^lGHK7(ht^EktsO1gl%RgUI*8W}mwEO1p4`SjqaO4Uqbp|C1J;EYy~q&iM0 zEp(85dX{f>)oW|uRiD5jaFh@^cgPgV_GMX63XV_icct>^ zq|ODtg%;`so@R}U;e>kkT2j%zBbSVfRAdxa-tKyQE;m#dsWi{-3#l_{J1hnn=#Jj2 zdT?q*CI)H7RT(l9%Vji9&fT1Jl`&3Hp9ssSp-Fc$hzBL)8T4?udtvC#?E1IBIKS!( zszLwVrgJ)}#HV)Gc`Wv6Zn_6w+}IWH4z;?t-UBE0TUOcpD&9`sSL#-tyR2VK#Nj0P zhAwdD)?0@oBMg^`r5_9w_xJU#5BK%Is~!#9FzjUTtdp;NPB7gY%1R0(M+?+i?|j^1 z>C`$r!oVK0ATWw@He3V8hXeZ)CzbjxJiY7o*j_&Hs!M5Ffp2;a+e`SBRdUgJLl@n2 z*RKB8P51qs?bI7?V3`?SUwUq-bj#@K>4%JESsD*jD(ao!6_coT61mtWzA>9AO+k}? z=n-yCD;#UrllC@xro$wkHKB7I=@@qJHMU3|l` zzSe*qaq~4Dp11j?@g!nFH?aCX#<(e7?-fk*J39OzM#DH?=A*e(qp0c*=@UmE?~LZ? z3^c0%pHwI*QTfX9w|(ay)}QqEe|Yu5kG=Z0&)#-bt@h0w`yP7n_OLoxrAz$JwPzpv z#b3DS=C6JDL$5n<_CGzmz2dghPb$y&*0KP!NUyu`hM^sIR#2JT z_drLu-32GyS19*BqkH9hJI$2q@1&nx@vX1a%x&9$=HnB~>tBd3{HyQvF8{B8-g?Ua zzOgUfanq=|p)&dVH}2b4**Eat?^yHwH~-Hs?fD-+yyMZCZ#;V2qc`6A(4FChyQ+V^ z^IQA=>|1-jxBJvj|LJG%+x6GWcG`9SaNn-?6?Q#z=O-W9^W|;t_~L(U`~I$VQ#B)t2V9b8p-?2@xD`RA|hI`gYv zy7l4LbXL_TUG5o|UiJRc8%pbLJ9x+L1MAC;%8fU?d&iyk;p&r4n(PQC`EiCueC3tT zc=mZ8?7=5d=qlmX?|x+}zV-d@S@*i-`!0&hFTOfi{^r8Sz^^S!;vgP1-9dE9vQjBn z_qO+bb?u|;KYG<${`3cHAHV19$2))KZMPoS|GE1rU%heXA6@#%18cwb!98Evf7+`$ zAD!wyuyHmcRO*?!0dK z#J^`L*mBX#XJ_X4B=}hF6Pe=^j@#)0yOvKlm`Xq4?Tx&*G3_V3;Z)zLH3!;!^02R0 zL)-d1pQNek%4!cfyIPUz1q@<7|a zFOKllI9mChuICr|X%ybi=q}iRZ#esRO^Ka2S8;xk1;Hvk*QjR)^{k@uao4*q<$R&a zFumgufIPXK3a_&6;x#?tsyE04?LxvgWbbSI6`4N31Nk-JJM{gHmrhpvJ0J6NhV9`7 ze_k;?=csh@=KNv{&(A-WqSiS_El+m7aUeg>nBsZ5>pfld(sQtYsJZ`W=eKeTwM6F(z*$~C-?Fex)n3uo_Rz5 ziw;XZ@s?~}I`l2e8*|%va@vEKV{NezuUDUprDsmH&8v?V=_hM{#`9SzFV;`C&{0;b zxSM%(7@?(plD2oXXcHV?@OCgh;S(;-^IXndpr5q)WTAf2^&OuUpDfl-xNpQK_i|4n zEU12R`iXDFtX%W3V6g;vs38zqE==h;Jqwf2Dp|G{Mz{uYU%~chn9D5`);<3MJ6lfE zOR}S|2|5qnm)Tgu-{&_vmys7G;V0%^tP#!;j>6MC77f!K$)ro=Mtah8FCl%9okLVT zifeeThQp$D@OVzo!8Iy%jWjGzvH1{<9G46nq0QpFRj3vBH09`LHrUx{3!_})V#5|8joF0>baMskuhLeh z`4lgb>CL!GDtdaZp&dz5F06NT$PUo2@VPK`u8xbkdSIlA3gT70n+LZd2IO z(;~W7^q9uTM+@JozRGhxp`bDp2-B$U6Vp1dT+dP|&W>%a zMU9BlA0UkNt2zg6aG7q-j-64o>7gv5Y9xe{;i^XUdQ{8MOb{t&7R;w8+waD0%0*(c zmZ;KvtY=XuZA#$DxF@8z^Mj5R2aV=1#&Qa;|R$Ky;S=;bcp$u>o0_OuRe5I~iwk$F7vh206T1u;_CFV(Io}$ybG`;3tMt_-REnp>tg$*1}QTUvOPazmSF%e~Yt2n); z`|<+bxG0Ke;3M7=BQoi@u~C0WSndkWLsu93NVK$FgJE)hDAi7O{CA?3?OcS=M?%vn z7f5JV(Vl=L49Pg?8tIZTefnwHJs)y%60H%JKHji%zCoka9hthq+Z5WcEM2yM9x5UI zdKVL*qXk*_Z4sI=U%?#9(>O{2jZ~H(1t(6dlymvCE2cjWpVLOIw%@XNi%XFG;6qtm zlUj5Xt&wkyMTuVia*i`jgqWIYIFeSp7zhbanI^+ZvgQHhK!cZoGcqZ6LGwhT6RkhH zC<8XDgci!T3SL+y>1|CIOjjK>Q~mnmF|in_gO3LjQX(8BNy;CP+c~x5>w@l>e3c*b zarB?K5}}!RFc>(iFXQ5*B%9S^-ld{)_$_pd3R|&-%IQFigp>>!JTWjNvy2TEL|TBt>p=c54*(T)=sVkx*@Er+AkRwN>3=vh%9Sd~yk*o4I0ztqEC zuEHKd+^YGusr z)Amx+J6-EaZpg*eag#leT13b}(|9R=_s|7~RCJh>57DKBh;80TiMVL0W#^QlSv7P{8fYAY8sWm=kFA*Xo;%4n9TovQuWoWr& zOL}&3E7ii&k%br=>4!lq!dP;jS%FqfO2E9$}sHV;>WiZ>TK)LRF-#FRhTd(<=^`nSBMpj2AJ2 zj0KY(r$jb4YdW@L8)KZQ8Et;Nl`obLD!ayvU^G%xQCd?>1Fcbrhz{ebtT<7B(!Z*r zCTKorwFIHkwYy5dM}ZkyOQ10y(5zh%y;UgHun5m_VsSJ;B)+TgueAA)vy!e`n4O9U z`_qnvRWc+ECt)L|d+@eMgVs7KlekXtreYJr3~dMN11e*}dhBYbj{7)yPg&7Z!$ghp9ZnDYHATdVZv;W)c@QJ)r%Q?)oK%R~XjpB;&>94k zh4!XamND^Pd|LM3C!t(wDSt0NBTO|>5|5(O%2#E|jra9XS=N5kEQalkz3Or4X2IsO zYE{cc(}9V?8!sJCbzY&i>x5jnzpxQ=b}c zbkVfI*fL@7E3`tgtUSPb7qzcc&MkM?z{rQeN2z2vEQgk!_eh7~ zHl|TBoOQMIRJ720q=O@S=qqP82~e8Qs!x+NI}&*`y=#)1bs4ukov$|ZbU>o82r&(K zh{stIY9#_j*w`3drWP?b%#bnIh0CTX85JGm|GWIZnuQbh;Z7UQifSru7FD{%C5ulUk$p+`=C?X0YT;>2#Csy{^}t zP%CoyGC@9aQT!oy19I`F$f^{%VsvJFy3>Wx^rT+LgXhby3vzCad_c&|35{rRB4d3KBV8PTkBx~yp{o|8j~wfhlB~BA+Hx4ctnzFe zCJxzhHwaMHJ=vcE=Y*~Uw@SylBZNsq`6HmArlXX!_U=)nLPF#ef>GPwP<`TbPxwO_ z6+Ko>R39UY1k9XU;JyjV^|ae)*aWKUSt=GpM(=iV zpmZLnw9TSgnuWmg3u#HQEda%@apE|P4EP|&=#4dM!hkslfv~2!!lA&N!YCG97UH~; zQaI1JGYvJapw2YZnY(XR7|{-XFv7@iP;#E1BrKAVO8B{fK!21%eyccsgIFt%gtoJj zJnd+hL>5LUJI|XyA93w)v6D#oP?Sf}e~l#=!k4!NtLBf%~WH1PNKRJ;x13t zj%$o&&!--;rkfr$L&oXP2>E;QR0_*E>F|zVd9F0)Y(Rw8V=7jZG~s;6RcI{?dk)=+ zXF-9WbQ}C%_TC0glB&M%@M;6~51E9qUiad6EiX!LSs7;sQONiVp- zH5vv&d@%Y+G}j2;_{iyI7J3)NUY%9q2a}d)SkS8^F|S7LMMaa4xZ_35n+cjc-k5xz zJS4v5#mhY3-#Jx1J+r&8z$O|${AcR?&;RwjpQ^4pr^-6e0?iICh5CX4gCDwTtn+jL zC3XEAEGM*x9VS@CR%ch6Jr!1+-WqoP zMRN~pq(czFJKtp@@;#FAo-XOx#p?Yy*tB7_ywBTcSM5sq^&nnB-fNd}L-~iW|@c6xmOvyl$#`k&z`ok#3U9$eRdq@>pPAQy296GM2oO1ZGI zBEBvy<2<2>>YV30)#_q3S*#>8FRWx!^Y!oKLFe8D?vE3PQ$za6Vg@-l%5Ycn(uh>q$3{aoyvF&N3qn z`gOwh9C@b&TOs+;X-%)$)V@S-hG+80WXk!2hb8BAO6OH3t2Xn)Nj_PfI=^?|v_l4L>93yS+o?d8&FK8QPD&?~I?9-wjLYU zHq*)|Ez{ml>1me&i1RPdMA0V{Ex?1R?AQinW2A6Be@Qab(pzfMv8&EZyNR*CV74x0 zi;GFCZ7RNM{2{|HHY$y}5^OAzCe2L~Y7l|v-!iMda87wicBH8@XYC}-k?l4eb))(0 z5aar1ie8qi^LlE~!uj%+zZ*0oGUuXP| z(dY-oM+ZKrPw&g8H}C75mhIo4F={u!3<4^FOIX5wn=noS9pyeu;91g)6M3^a-Sh7@8|pv*_1i}3_usVR)L;8s_q-2$FggA0 z?|E+J&7Zt*>$m=5!z=&!gQsu2@5sh;K7aEoZ@l!Q+pc}}NB`v=KXda9%RBC0KKP~m z2anY6KfL#=H!U^lTbB3!wdf;_;h)&Qw7kPDAN(r&6zd0%Y<^W`^X~eVBb$Gsz0}yT z=g7gou54be-@m-~3VoOH;E}yo-o)Ozw;!4OQtLpYzFYd(eZFz<@2}r{WXBhR-$woI z%j4qT`H~}xuiSW`SO45Ge#cX)hXo&`)BD=fllwYDlkNRWBfi;hlc6kAgP7r>O@=b6 zJc5s-#)C%^&aYt898NTzc!!MIh&CDi^bmvg1>S zg_n0+aCq;Xw84%`4BkU0+?f&;{Lsc|j$s(4-O z$zerszH@w>RlSYzvFyzLdRCpY%=jywd><>i^${~btBuEpL)0Wc9WfzkTyu>yEPq44 zJk0*I&#+^0JbcRTy303zPG4%A+jKGOhllyo-Zy9Fuw!#!f5rEAFxD@~$%>qeHhJ++ zf0$jOw8^=fe`v5xlH?y~lj-Rd?HUCJ+hk+AUjpiNe4I^;E3r+!vFCEO+8NqJ8s~1> z{JF1%HsSjydp=2YqM?z(Yu?xPwfcZG4n+{cyegXW9pzUyPLO*WmI zXle>=a_+egUBX^n_L~g0NqYU-Hu=VbA6$7Rf4g=K@6k7$_RuDL(~%Y4n>TBmY}z!$ zMu|`IC+UxdoxOYF9=-4MSm_t!WJMm|I3X8djvM}vG_h?Ot{&YnccBkq4=@uk|gct!gL{PR7= z=`tPBf}y9Dc_0n;5l-?QMqg#WqVQJsD{c{Hk7PPPS4+Myc43cXxnD8*IeLHMqvaR= z)_l)V`y0#skn8=$@;v&mrk&8{ZVaEyDd1SJx^L%L(gB_yh!YJb??G0O^UXNTE)N4d z8d(SIqbuJV!3VYZFyJOWlg#EvcEfFwRLn`gr7V zGW>?9xf+sza-6V1kE>_KiP1RGN9Xmv6^)SZxp7kM_G@spDvH=+ZIiMo8^w7dx;y*q zM;a%^t3n3y(QlI#=B(Hz{7PY*e3!RLIvc0q5*sZM0n*|zRq7ysuqV*)Ks)H`tRD4B z`gr(wdeQ6242S;lWP1Bf`bzAAl3yq>QPC!`PG}*qgy8RwdRLUV)GO)Z;p6EAuO~Ce zD=&K(cS8>&8x)ZDc3zAnw~_kuTZcA*$4WF%tn)Dh_{8Cawn%=AQ#_iVLSsq5kAM z^MN0EMscS&$QQVfJFxyDl(9fNrleA!)I$!U-id{!v9uM}5kcvkUC^#%o-hubE3*Uo zF2v!)NTA9fYnHKq-5Ton1f^ZyiTjMSG_z%-z?4puBiGmVbXNW}jDP+$4RLBDSD7|F5l=)NS~zF}@I!hc#CSYsg!J(rBS7|Lb%M z$pCspg#lf;^K0mJL~?xTKsvR)l?u8__1O;}aX}p0LU9+Ke~T%KHB({eDK6;Ob|jAz z#$^Y`7RH>fZ7kE7Y#m$s1i55?ZEt!wyR~WaX!&6v3PYaVK%K{DJtYGi^h(;{aE_yV zgZuIQ+clz=wdxRJg6PmGpb15hyp^2F}fOBqS32(t1(d_%L&Ni&0CX#iIGnW_OYszN(sJ< z$Rf3aR1t?Su<}}hwKg~uO)^&4D=%s4r(m%dH>}hN?3_}ZT}<65t->(nLq>~nsSvZK zH8552!p^yDGu${5gb~ezbj;$o*5^8yFUAAbfOg3Qe>})%2_=Q~f$zy#hgipW2S-PB ztJ8yQeQM53ZblwD4jgY5`Rfqt5!asy$MCNbDdJw~7P5%(T>fQ>DJ@AtTHc#U-2065 zI8Bp6zB%#k2s%q_BI)sr{Uv5E4dhMcdX5jsC9I@y_{^|FpZBG^PYUOY=6*-!6Bgcq z;Zvdpb^vmv!&+`(PWZ}`($HYY&<}nnm9Yo}DMltffCUR&2#cT+Iw~u96IN|^!#I;+ zGQ!cu*vgX*7O^?g4*rmH!x+cGRV#6{LdzueI5bS=k@$=t99c{-%eR{CR!bMnq&f*B zXFK(kg~SdwiG zIjW|pr&*O^iB$m3&D$<*g*$>H-=`YMeD;1`HJ-mqq40Dg3-a z2oQSV84kz4^Q(H|FDQsb49U7c1`gglhi>>|)8)W6U7%-og3p**3@thq4XwX69FDmD zJd~yq%SS5EWM8WmoLd7%=Fw{eyQt@gchT!$)j`%ZJ|VguVv=jP>OMv9j@XGVAPNIP z)JJaUaCAHU*~lu>^2(~ow2mV9EOu-!s)zy=PQ?;f{%68>11yCX_`aI_MV|O(==A}` zz=BAj1czDGmDC!Hmnj&Uag96@PRD4Z$W8%Chy`vJt*NLV^67($l>_KbpvYX%4O}=j z>JtX`kd$4a=_S)&sZ;P*ky@M6PGoqT`M%6&{dnHZR&~fnvW%^eF4t z&zO!jtQ;nW^n7SorfS`z98aAz+3iF8&qJb6QUf#$0mso`PUwS;v4C8Rhfs@8mHIfI z!Nvk^Ef(}Y3^KrcvmFG1vtH^R6;P8Bp*6wLPvwGpG+D*N5($N|^ z6St?v$xB^TYE9}nOUn;n;d9WUc@-=;;%SuJ+-YBI&N1wkw9Z1-*^qFVd9d!SwRKF! zZI**V*1A^S1(RP47lP1rI9;(KI0vSo7SJSb#HO3)^@icShxx4Z z@^0O+WudE^sUgind3UEvZM~9rjjh{uJwGyotN3cJ&i@u^xYWOYi#&-1Pg z4#OT*Yb-^8(XQ3~6dC?>6k@G(e9%m>GBK{XOF(V)fu!UH9dL^S*p3FdksX6c32<0F z>W#G|hCo!D#55;jz(v*h$xM(@IefO8Kdm+okm&lPIumDaE}NX;zZ!%D8N6;8`71CdaR@oVbiZFuSM=`h@w|h-<7)pY_N%rVTBWtgmB1;UR;y6qyybO#2H~H zm+xINMXFZml9StWbI3|lRuv_fV$o%wcrcqO4v|Cha(gA@v<8h`Zd)W{>NRV-(E05u zevYi2*7JH-X=@I^UTP5>$T?@MBF6+D+RvFe%j9hqj0;*W;she=&*2b>Gnr(e_zLCN zMlHgV4^R5dlkf98<58oA?-7pAs8R*74r6@vvM$g}B!CNnHcy2JG;PrbecO;hp`oZo znzSImK43mwht`HRpiE5hlLZqupDa)Rx%|`^aO&;8nph%zD2GFz5%e;Jv5hOnTZB5+ zwYoSb2mbZsxcRQ~;+30m6RNY!*y`D)|oPmZ7ODlY@wzQ~t7 zX8v@sYvwqr#g2pZTE$i8Wtyty7MzowoM*)j+ALddaWd%i{U^iAcZCneLKqIt>GbU^ zzmSdx;o93#y;O7Us!~ga-i3Smx>H*;2(HHRhMUr47@MHZ&l%m5{`Z36zxem^{2%Q% z{u`%>dUU38GlTMj8>76}&ww;|#UtOD>{qN6x)2us- z^Th1ztUD#WXZDn_0H?(B&h+%`d9!Do`ug*(Ipc>?gWmVQbM~We%uju8MOt}&%F**= znb2d#BmeT4O~1iNpnM36sZY0TkEq?*T)9^zY&IJK>Wp zWB2~=uYBcy-+S+;{^6USS@}z2?!9+?K9c7==Q+pHljgTpzVes<-@W(V`^SI$nLqv% zN++tfK8?pukBmNkAKx7w!o~Ezr>Xnx^PRRk0Eu^FXYuHU!0F?1w@~Y z_I-KfJjYFOwVpD#Q4sYHLxh^r-CEz(=X(&JKb9?TIRA!C=cN|*qdVOIZTboPmj=J>$TNClBUc1ykW6-XY*TW4@e@7R;@>B8; zEkwI|@YlV=$~)gIiL}4N1_t;lANXBD;Erzi$z#wD`C@r2)|$iOir zedctsMxU#MzGzTTKHq|O#_I+I)EHFJ+=?CzSBL)fQr*lcA1bekj}wzsfPSQ891mMtNJ7i|QcaZd8~pS$E?UF@Lk1lM1K`WJvt_K0 zOLIx+N3IlD!=E(^2CN2C{sOfv5`CK%|E>t$(~JtBZr zu%IB%6CrelR)4f6XxU~|H8tG_wc#&lD%kL+1y2OEVwpwpF(uL~I10D`i{OOxkhl}G zq*O{-c<>XunYWSOS}TX?gL+X;Xdw47)!au<&^EM^m$YDpXw<`JkchPol0KafEhuNH z&SLUZ%w(1Wj;7doGXxem40NriDzSu9L8%Gya7^N}bg!B5Qj&BAggUy_CNxWSSikAR zI=~*@rF7o?TtCTU)i+Tz_f!)e_-Bcw%!{UnxesTQ9v4ZVdXt`mch~k{VS~|^Crz^=?{&NQpeP6gB3usbH=ecqQ+|47KvRHo|!rLYS2tlV;#p1 z(}C;shOx}2vm>o>XIdo0OZ&2By4#%3O-+{$Qx}um15!H9)KklHWWaOp8INx@UEz=g z-JwoJOeI=07MY?|%*0BR6DvSDO-wp9t2?J=l$X%TnD3jInbx>)%93+4!Q$xM)J@vD zfW>MlMo*{o`kgeA%s{0XE5y8BgoRyVP3lHifCfDaKOHs0^d_Dp(0^W!DO0OW1zwj#-ANjjBzcqNZJ#up$mqo*-q)6p6cV&;a)Sg z6a3BLjhE#824iMvo2<#=Diz&_r!&;t%p$2eUJw%A6OrV3XS~fS zb{a&vvaaF6ivim{VA0NuJtVM0nHO` zXe&*49$Accz&Y8ha{zRY?NMg)#L}HgJs%d0d1&53nK)F#6#(fd8+kGw{1ND%L-f(m z2&_qcQ7icF&3g76=Y~ezl;z}a`k}hSU2DhsOL*d$9ix$BUJ{yM^rVR zAat?)h$+(^JI9N{Jn>jRrdSo}$%R!3m}@m-t2A@LzC$QL!Au8vFOp*!b>`7~iD+ss z({w{0wTT;clSI~n&y3+9jNm~!j9(m)h?%NI!BRM>GHQd&!J>1d*@#WDj3rMDNz?KS zTQl#YFRD^MFwq|&?X+sK@i#K2&15Cb#xT|>uHja`k@2VhU)icsZ!j$uB;x`hi6b1s z+o)N9IU;pn@?@kdt)P3Foz2u>lW!obHSz+y}+js)jtm9+PiZ@$?>`Sy_Y zo~Jw>V+tV`(#ie2cc^|EZNujooN+$Iz8y4DG(JrXeHhNS&@n9@g!rw}H(&M^?gQcy zi?6HEwU0x#7I+hQV8jrAK9K!pvZgCW=mcJQb9|j-oK6-sGYOxbY&Wxt0E@ipwPV8X zSWb|Z8%;psSZ2sX#XN%n&1kdTS;xR&7K_i7*>sc5aqRAlCFK3xWT5JJlkXhnjs_si zG{!=L@Qm5~8>(|$s7r{iP9(5ufs_N2zqO?w504p}brVa;Y zNDw-BcxJ}(rbgCdYH*Xwg0^(5w1yc3aF|iB6Y!um;0C&y!6R6xddjNMKEM%p8}e;E zs3k@K4@Dc(b?E&}I`|3S$nqpg4~GRPuqaus`f}?zvx{3%$G6B{*pi8}J`0W$`nhJH zmU)TeqhXa+H?@S)Zl$e?zO>Uam3`;5=sIaFC+zHJB|D32nXp>bmhV_wv3Kd+M#j_> zeBXaFrl$zW^M`NNCYn~b3J^O2JDVxC2xMr7*s0DG4&Y}HbgG7VSo-|& z;$&PY?*){tl^JI=DC7Y{j}{2v%N9OhtwjZ@SqrQO@y0q{^_?$P-kRN5rPE__J!x5N zM>uC>=sKfwvA0Z4L)^jO`)pU5VcuEmXe3LMVT`2(?q0cnJ~|f@CmY?NV*0l zjqI7r95GMQvy}|mW3=ssrmIc|SD9z=DB9KhSE4 z>hOHu#1relpQ9HW`IU@3XnbUxsppWpN`nTNVCcKlQ&uvMo}==h12(B+gk=?%_EIcM?vvGV@blvfgadW6~M$INyv8@Kt)ESNL0B|q)QY@R)x&ahyrH|(w4jXoEu z`?5nOyDdG?-kvY|Tm7(~YkXK;#vF3X zICJT|88-PG*JNXdIR!I!jnFw$S9SL|xw3N#gIC(*uMBl6I>1}!$isHB&Aiva8`+BK zmkMT8w`A4W2ba4>R)=B9D70e)GF=%*j^X)6B4z1O+K_tHd9SN`u~YAe2R%^LMm8>;kvd8F=e9X*y$i)FiZVDKA*2 zyjD%sY>MT(Cj6f9S$yL@dI>^If{wAnc|Nje&0&vT&1%bo&h2EaZt}6D+NLOV^Q&#< zrX+7wY&uPec$1;Coeo`S;%tV^m^c`PWt$7uiZY{fj2ggm+6>oFnHoZnI)V&0DJ`$? zc;Lyb)vsh;x=o$S+FMSHbyz!yLpSSuGKhC^CsT#zt&%XVoTmln7L57*z-PzkEZ<_aI84)Veas}W#*stgYI)Nw7-O$AM>6Qq z8h1LxztS{S%NN#|)$!Y`8Sivm*&=VqliIwQgU`R2RG4*^LOvZ+4VxEV?)B~}QnIx~x z@*@~i%xZqv(~aps%nOM zPUf_a>YrhCw#a0GZ1Ha^8ky8G$!XtG))WP#3RIUzgY}W;z>d?KbE2aG*qcQ$n#`&o zIzJMJ*oktP&J}{LSKUjlbCj^A7)9)m5>71kPPExeh)&873w0!I5I}p{#PD z5;03Nukd591Q#Q1a%qW@zX~|idXy+F)ldM;F zIOJ&o7vj`cz)h^ii?;M3Rcc`rxAnw~kLtr@;jBru(*5y63v&qga0s+O-|v}`9<=KMuJTUWnRa&J8Ej+SKFwEfMvS+f z7Ss9B`h523oJ2fUQ&`KMJ0W1-yn!*s=Ol65w7vXJCKcIPH+HB#ZTUiRnm@45FYdOc zI>py6Oj^I$W!cV=eQ!$`|IV~dHThkWW0(Dxm&Ko3p|LEf)bM`#smZ9BOp}&QGR*p& z7ssmL$HeF2>25KMDP2I3rL_>~%^NFA#%?xCSBC!XhKEEuw|O+*T%Gbh*;tuO>`0?} z4{LPnP}Ps-OXGR-aPzDA!Hzx9NzUV^za8g!g1(nBQ#I%D1I8v*{9?y)#2u~7<<;K! z#+&%=$@SG_AKyKh%J@aFk?*8zXy`jCraP`~a6C}ktHqjXo2>TEZGQL$KfAbikLw!q zQ*D1nzU0S7{T%bYH`ExxqG@yg$};ow?XrqJ;_I>vfSiJJqs0xGVYWuxZ(C-u**1q4 zeDeS&9iOyJcIz;AeC@By&28_|~ZRo4xEj)3|&5Ec3uphMh6@_xup| zY_ha#TO^>Fd#hRE-qiLgXDsjckMDI{lW*sCni(~Ap>0MEQ69tCirEb~h8@SG~&+BB|3@zR+^%g*FcN2Rnfu9;odf**Q73eIM{hi=c#bZ*B_?q@uc z`;q*f8Q=BL>5So9kodIa7^#{89|*c~u(!>%nUlXwo9S2{yO= z?(c59<=~BP`SRl4FEq-6dZ?XPMzS(Tv==Uvt{igaw z&&)S2e`w>>XMee#?p?$W$zArDGIez0!=5GH7r{8h^ zk8XVSv-!|pWpwBpU#Cs(O7^DdB5iU#U1pr(4wpq{227}jWV617VNY8=_^LMF&gdNG zyC+MB>z`ddcp=|EnfmPEy?p0qdB-Ko2memr;&{RGqQ1eguesd(d*tsvC_H)O(EnOK z@ILeoEiZTYuE}!!mqNGr*2bmCZ<;((zj1jO`y)FpIk5L>e0$^08<+R) zs7y8vymv8$N$WzH!Pw<+b;}x8C%A%Wi&C`URslx$&m2f8v+^p4|(gREXvit*wcHTX;zk13$Px<=~-uIzzz4{fe`|F>4;Ofi1_0U7t z{oW6}>8bzo3orlqKfV8-p8tVUzw~<_{jaxN_WYN9{(;+v-rX@HZ|&MI`zgN7&Mn8+ z9~`}X>C6Maa*F9J-F5mq{^Y*V>^&8R?P&Uq*R|`Hyg%8?xtlgQYVKm3Xs9Fy|DJEd z?6`F1;FbF)8}&~uhwq%!zi@c-tM+f+O`Y*w6WZ#6-JN@&cU;^!s5aTLtZ&pDT;>}y z2S2`lY39(SyJgqd@u}U5KT)CXzaX0Lrfk?f`3&^yllbLZHFy3m_)703d@p6=QsYka zK3+N4JaqByvadW6rqFsDFK5`HuSs`gWbEa7tMjg1DMn`!Q@O>*Ql8=m3 z(BE@;@LkBAF*eW&GU`HnYQ(v8Kb)216mICX%}ToAV#qyaZfrbW+udiFC3#`+rj;R( zauePTEPUU6Vr+iD;=9b{m&Z42KXc{WU7!30XXX#{LgAxc?k$U>Kt3PMU+Lh{*qn%N z>Gu)v?V(MqE!BpHhb~>&b;%{W&Rtm<+LK;dmSuE>)!(~T9+I3kq2AWENwCidc>}ZA zFcjJ(>?h9Ee&geZS&6MSx&01l?h5K~%nM#%yK{W`WKY-|Hoc}zP$HeN_bLy&%<%AM zR_=Sy@J)x0eOPT$sXVyru1!7DD||f+I+6Ms)G1vJ@=iv)^!o_-pVqg@N@x?lX%W_K z_j5vp@)W%kF2Ooe(t*9y3`PnJ?W_ofn7rzhE7pEj-S8j;`mGFi(mZ5|Kt7B zo@Q45>05mN1nUSnZDNetWEU?yH)d^{Fiv2ezO`(VmCz>S>%(fm%P;43&znA@uhKjc zlzBW+T>3jv{S(zI{XPP|D6~oUF0LpVQXN?da~Ewg{$#a^>O+6bT`N?;isZD(QFB*J zrn*fpC?Cp9XcKe3x!AcNSvmXp#&dzRa?z!ngoihoYsS9F+?6x*XcP0`gS_+~MTUV= zi(%*#47`tsx3Y5ik%3_5ripfC@zWO+cox0z z9g>;F^1COKw_0xGBfnL8SKKu5+m*#XkiO{Il3&tSEKdHm&C)G1Llf;h>y>^BJJMMU z{w6qQJYY?VT=)>)0bXzL!E)luu6K zYvEewUz+8$3%C<4obp|gbI#)XBiFjtOF12+uQmQM@Rrv)f7!ON+LqUTqJ8bQH=gOaDvo<6nB#SnUGwh0){NB!+Y{Q_r%cYh5-EeZjS+rSGeN zGj~>&UvRa#VWQ5mm@D|kiS)v^MbuX2DX$6N6Zuf~_Np71#}yyVWzQHxudidUIll1oDXD{WgnO&QH@CVhk z;^VdTB|j#8LT$psz_X2iP~9DUW}jYTNY`3(bIdlhiCg2kR(o(@oS5(1R9-u)O=|I4 zWQ~EjIF6HbzgGV9j+3I>QQis{vH)#zvd2laclaOk_Jf;xJ+;a0w~yV|_}aPWnw8^? zlLrUJiTR0s{i{t@jx|oc*V?3C;t&bdh6`XV}vtv<7Ij#N0nx| z!y0|z+1$}}9yAMXgAIJq_kacLHJpQ=-YL64V^`pkF7W`rmEU1q$p=^c9o=9@dRIx0 z&avU*JFNBizPU(?v=<~HZ^y$$+TDfVgMEq8$LA*sy1NelO+ov0_!Fl@yY>9_^m@Og zyyQnZWa6X*PF_Nwh`@5B#tA|62+~Z^0J$q7!W>aTC|ck`maBJ~8e$+2@q*}&HES|tANZ0A( zZBG0W`rb>%W58~}hPWLdiE0g20IP5{y(BP0P|X5AauR+N3Id`<15pI5c3{?!L(4JX zLGt1K(MItwc30C{O*Xc?6!0Gu(jq-Q;S4_E29}l9S}0Tlv+q4EV}nwugp~-2*rOy? zY(caov@9?n49t@ssLFhBYY8*sTp(h=m@kS@pupDT93J%-;ebJmx?8L`}F(qL7os73O{2g6<=!#Y`*3U@Vy) zUmg?m$UMNh#>b@3i5i4eFV#Lj*d0Hx#}_$ckP;T)g~vJ7FN9tne_MuRt&iyq`7~yu zun5S85)y{`4Vb9s0DK57DS6766Jb!;GrVvg=80_%_fd%WftvTFN>)bJ0@K{ltNyrm2{lRkhcpTgL>r%h#e_XRFWrFidG}oKP-fLEQ-~yQ=ZtdmcT{B#Px_c zt#blPCkgrvB~kI?6inLvC$4dMuQQ98<^9_z&0z1!Mqv5F`B=?sl2tFaudg} zxA1Fo;bI`I-jL$TdgZX1CR5aewkC9%&@6L_>03MNAY=ZNtX8<@n^<%ZZ!Dzq8TML9 zR9V1|`rO*#r;Re}jQn!}h^G)!yWjzsoeJLRHJO>UEY))(>2N5)nFh~hgi_9=u^SuLm{))Klo5yXLPw3z*LVc^XnV*{IekPik01upZ(fkTc||6wYHvZUm5ZYv|r z;_5ln@C?l$#kOj8dT!j4g;`iEUe=m2)|as#5$o!_E=CG|NT2q$FjzFSmA-bF^dUvd zj`dOSRT&Nb98y;N5X$dX`ec`Nxmr)kYH6M$Sfo``Cp=M*KS7C|2(JKtDj|fuM-L*b zm`+?jn?_1iAV@=)#1a#C)#ee?qPO`VAQ)C;B9B{&94lE_Dkf+uoslG)s(Nm(Kou>UaN zm@Uyt&6}yfl{I3EDb%bQw#!XB0plK$6D;(V81Ic*fFMv`2*poa9^5H)y&$pa+-uQXg zHRfLJ(@FO+v|6sc-#bQv^|u=rj9P7>g{0*TeT1@oTK&D}Q}pDcg`UHC%79t$to=Gv z^`27fN8g~6a)H_NotBwKjdK8BnuFZzxZJ)?OF=y z8tu9Ol1$CS`IuuYR2E{jm6d2L5NG4q`6&BH%#I|z=9~@)%tEP;MMnCEO1pN)|>+6UB9}b09uGFr8I*OB-8jtBt zA#E;QYH;%!DW=qRN{K9^1PY8cG3nRBzHqE;IxBs)VaA@D?^JHv{9#|q zu^^vpA@r&Z#alxd`4CrCFw=0QFC86^0LN)P5|N>#9B#z_CYv!mMf9z1%Ok69FrkKT zC!R@FDJROD7pbnQut^;xi)ty)(KKcnCOz9*)EAg!C$V?NCb@&{t7j(Ho5b?{3uCOY z&e15=8g!oeGlWcOEvXA!pjqqLrADo3<(BI3LBx*oP;waD)%F$}V|ug3rOwO}bs@LC zw3<3i^Z0d?vXM5>PmCLa19Ze^Uht`dW}b`sU>98Ug1-2YH*9C5O8(|d4}1BmVy}Bo zpFr+dZ-1Ed<>%2u$c{?H`NXmaTgBx1f{PjB_?}!g!c;VoB|e4HHR@#E)$Vr96QLe! z)MbsHvK>r~Xk!v1!oF2kC&sv^5SUtvR9ePp9bSd8ol$(vC|r5=bm>^-0gjV4I{MmR z=J5@k4&ZWajQ{FBS`a(y$zp#btMA@AbSN-v6o@ZbR>#UR*+Mvb(dVgERjj ztts8tHFXGPqE`o-Yod+M+|b~_${TaSdBQ9OHPXWy|9Pp<($a^x}$O* zk)E%37wkzQe8m#{*uXmLNiP7ePq={B2(@i>tXH#?!dlKJREw_>W|^)qR1;j2#by&0 zjC!V}$&vEDNXTzBr|9v#i9%ayBeWUdk#BJsSIC|wF&@YH^jRp8(uQkHk24Nh6ct4! zx5xo$9Zj*_CRPMzJE|#Mo@Cxcj+KphD?yWU3BR?xGm{$GWOmY1X`b=Ucm?sTExeO! zzSE?vS*|r?Y&irLxoG7t@c9T#z}R=CFo7q)(q%1v>f}v+EqThBNMnbQ#-j$WoVisq zDuvDB%$Mp`V`+7S7l+Uj=X8ye#ZGHUI7~9p%27LppLgB)-Oj}-mtNvjfngqFJAiq& z89ijiNh>BsL1c}a)PVsxAw{m2UQT4rcxN=uR3EJ%9y9tH6LunL3IwV|pQUr-%&r)X zcqBfn=ACScSj{=dk2ptO<}5U;0@SLe#sm$Wr;bV6nG4BF0-jHEetl-_{m?G4&tLw z;Po^DCS7BCl0%gCrT)0VzmuQG1+H&D#%F*i4KvlYMKjK8JBrD?xPzeCRas(Mo~(=v zEs6?|Ij^>Y;R8*?7TF3Wu-WpJ2AP6MwN_|d6(t(ciVo*b&7TZ1!=&QDw7(@gDK}$6 z%4k>XTsn+0fz`+Olra8lnv4Ku_)PwoMqnfyD9XQSlAQP)zE7(hfM}*R-we1KCd%ol8zgRT+4|8L!&HK;Hd!F?k zc1fScMWGF^nqYCSPGr>^&E}UFt1Ey4vTCn0o@`%)^!i^+{gEftU4v^CGh%Kq3paab z?7dD>Aep?gLyc68e@2IHwV|0+bS}wzoMV2@{Mb*QVdods3tMI+H9uyzooa?h&&kHe z!YSQ6yUu#nge&R#$arIPJTqsGm~;aLF^Q(Ip&9le8dn{DcV6unra$d3w8TbJaMno@ z?Qdi%yE6w5yMu=->`OGgWJvoLGtXXA=*(;$+AkV@z&<(8i|=U^U6+|;NP3fIIQV0j zkq&;E$&AvOIBXsxSSpEGNewGVPj~jYlNV*l=@**)_9v_PzOBzYl$%q>s#^|iOSyR% z)qM4g_Rb2Y?f?nd>)f+7^Y{Dl$f4_a-H`X`Qj6`0_~mACWrGw81xmkV+mvtQ)yi#V zuQ8vlzR)ae(^)4yNd0+ZrWlT$sO=!hqUVf}Uu_Q0x=Re7k}~tPmxNK>HjOsh3ETLt zT`~~Z~W#nzj@2fOEw%D zy?<$A{e}u=L-rlkH!mMxPu!9ECw3paQ~MM@ zHN&1c@Im;(H!g2}5qsK_>& zf0gVy?9G#(cN~7yjZqlTCa!U)v89;1(vSS*w?F#4KmXV-eBT@X_AT|FdH(x9_L1j( zWbCw4#}5A2-+ju+mVDEPQpUUKyyMC5dZ@DV;=AsY8@0*Ozy8^We*KFdc^3o3t4$WK zZ>vo%UTTFl8G6$%{o+es@U(j`NF+x8O&`1MzixZ)^6uMWn_U0xGyZJb)!W|uM_db^ zIeFbf@3iy(^UjTv9VWii{Q1IdrzRUV{?6j1FWY*~)!Pq${B>_S=eZ+8Q-6BR8&7@C zMW-CNx$*j2@{69iZ^$j&RKMT{M&EXL|CaH}^77^{u@7;_7iRXdPjUC5&(CarpY|hO zdSLT;>_n-yyRgT>RfbhmC2QEI0f!vH|k)U9KpxLZ(;Q9P`B)1 zl#SZtlY2h7r&~DKw4yfo%*v0h4DHhX#x}c%ospDXng8|=q^RS&;IGK<<3$z+r(LHG zKRwhXuGUy>6DJ}-94ApK2A75_n(dB)ew+B-plp4cF#9lf9iamZKdWpLu8z2tmhYj^ zCWd;yz%KV03FEsUMHi2x_TpD)D{%0R2>=|rZ-c8MK1*+AUs~TH>RrSA*vVQ!gJf8>?+?9=DRsy}ieSagY5&hoS9 zlUMDHmSQelZQ8G?^GxMh z<9VNHZoqoS=>@NK?Q4hhD5S8{K1uX0;8&pJ>}QNv{zSjl_$t@^R9V3{Bm6iwq!afu z3UAFuX}XcGyw;4&%f=Z0WU%%zR=2W`@wJOLY~3bY>}xFX6{L-P56m z_A7SXC%OdA3u|Vs@BjXGdv0!QY>rwMjGb%a{1!>V%ZKhVU;JX9B*OfK&(r=edCDum ztMejxVrDZdn|AG4*|oB36Mu-!rd=z0;D^20UVdZ|&qJdA69Z*^(9|fvV4DzE`HC~G zWIuP^f4@$p)Fyh)rPuw#E8?3t%93ZB$Em1s?N=;de9wKrHP>XH5aWwq>>4H{Y$NQv z>++!*EmhLOo2X^ht=x0$Hdz^L6Y>Z7J=`YKjquP_^Ot#>-nn9a>pG1GjgxD>ATGZj zR>uifOq}8OtQ{xl9CMt6Uk(UW`%I2_EupbSUtD@TSA{r+Q3|?Bn z9?bqYF=3oY>1qYvOXGxdIVIY2smir$&o1!FN^Fyrm80h_m3+_3R~QA-FM)AFbbPR$ z!>m=d$@sXJYQIhFT@A*`TG+(Q#AU*_kKHDktom&d$4S3U?DtlitgV*+P|EsaCdaw$ z33#Fgz9(wHQi^c?QD1iuT(^dh0KU_&g#my*2CQ<4^@;H?4@E}7T;t0W&^HJ)Pc*>>0Tc=TlSwd)r&<)G7P>M$=@v56x ztbXC5pilNAs|IUgYvo6KU!#1I34S3DLL_aUwNBjW3lv!+TtgIUtGp+lIbgZUE|`8m z_~@bomTPNqz|B#~4aiO)dR)IJV0%oJ_^5qA)ES5uQSO$kLM(vmGkg(a{@^ahs_JU2 zuljJ2$?G3Z>W(8+qQJl)ff`IXagsj@7&LwqW{*m>`3Tx;^H7u#8^6v@oxzs8G7@^o zQN7F;9S39whe~*i8y%MpR_DddUn!jjEEireML0qne+7nlJdi;jB2f>t?{gKgk;+$7 ziHw5p;bScOU`?bX0tDz@4ptUME;aE1HIT&AMms}rNCAq3l2>Oi7z|kGS{+#8x ztrj|Q60EiQ0obd+iSLd6i2@sbRh-N$im%>1Jjb0e{RyB2`1S=SGDHi|3f;+>%mp1j z?Jx(Qy%f-r2L!$3&?P^UP8|G$dL&Tlg&u|+Iz!7WI&oM?D?9Y7g&hQUV57bG5y*QP zEjY(QNA==kDFvSE_vzBcieC~zXE0z96$^stM=T{_2F$E<_19rhl1B!IKBkRK8G87! z3IN_3Y|>COp#=kb$aa3u8;2 zthyxe;=vU75XPiZ#goABjUcajQs{%4(3>V>&l(r>T;WC8aNeT1z~M`-w`e8sBoVj} zlb4u~GglB7B~R8k=NQ+u;05O626>Gj>@0_>0^EnK{n)W1HnLqn)P}DAv&bWiRXV^a z7-K%FIH82&DF+H&RVX7%yb@T*9>A82;2#Y!q(~3fW1BUwN-LIx;kBv&&y`frWM!nF ze9|4}U@PyDAJZXpkuLdADiJ91OMChHcY(6#IL{qH7D7wxXiz_LrkF_LnAeC<4FfJ6 z4Xc8kL4_w|Dv2kEVp!&scN=j4OFz%e{Pe1`!0rb�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

X>j*M`e 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

s4}|g*(7=TY1X|*=X4&;1eu3}wc7k1J0*s5 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%0DRlh&Rw^IZWI;U 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 GZ#; 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⪻N_JuRHmbtj_woK}VjEMf@s@#~ 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�@|AX!8$ z(?RE9W!&`sFF~F zCf~u{_M{0(0a1@OwWev!aEYa(k~cNa5+n^7#TfNE0Ed3C8c~0(-C#aW7!LSSl^dxpRuGyLkSu}cY-TJQC(TTt-e{GkkRBd0 zdWtC7w=2ABq)yUIWi=jQM&>YN>Jre&)e*f<^50Sx0g^<;ZZF1=1PMONT!Ss9r{SuY z)DcVN0n$b~jag%+QqO6m@DrZyt(=?~_f|HBIYgR3E;0uKdpc+VA&8l*q|p>lXMzPQ zaph=unG)z?w%*5j7r%jkium-g(Lfc%OzeQM1osM6BYU~sDv%E`^!#!LaOmX4)Xtd% z>t<+JD_JFBg_}t-mt17#oXR7#6f1;3tDA!q2V2_Drb0>5FZ(k{wRZb zUhou-#wO7Rkh-bvSg{4pqytF@ywatvWI&(?JM!njlUIZ{*2ftTx9^ia5V>3JQ!K#; zQP|cw1WC;=*|ZWywnm0sE+Z9F#u3Ad=#hzu?c>?_Yq9OG%?%FER>sfY0DpvI+|n9k z+_QJ*LJNu<2AX97zWs%v_80RNjLvyGnPvlXiFcA{%3e^Ld&A~Y7QGR z^}V0?hhruw_Y;_R9H60J$ANMwrvUcpini^;da7nF+d9jx+1$?$+J?IzU3{FcGz`?F zDvr~tT`b2xKN>k)XsOl)av zHkVzrExllzuc7$!JoaLy-Y|R4yYA}x!Q1nF_nVJy-#+iFX=N_8RcEpfr-SsA_3)AD z#qsU=@|8R@{@|m>Yd8Jk-l~0U{A2rTjf2n8*-uQ4r`Ox#OIzPCSh2@H{EiA|+1pPa z=fhbC+n3Wm(4{dQ-DPrbLXg)1H(kDCH*4w|t60Xg`yYFPW-;Y6_6*1T56}=Y&!?qK zevl?Lehg*&Y~D23o}q=rYdoODQ{VCR$9Mdjik;#pMpM6H`~3LMtG8Gd9|M8U{Vg>J zGj~yS$xca@*a`1Gwe^aTLkkO+VApt{zWdskr!j;-^SYze>eeIMckX=0<-6u9OSit& zHs+2Deei_?m1|yCYi~R&kFWh}-b*J6>y@iEezy8R}Pc7{FnXPx8`tZ$%E}y>auJ5m& z`pd0{KKIMCji7|jq!l|>-+Q3c$^6Go-FfHx{`|dnU3TjqAKH2Lbtj)Xwe!4@lb^eC zOTKgb?9pY@IFjZEF7g|m_^%uCryjmBJ@V&)N(%KCC@D#f8vox zHoW-#-`xJy=7kFjH!V;}zhsu1Z)SK)l8@ZGlw?E6op+yFz2eGi?lv;RrFQOKxOI+t zShzK<%x^Zkc_$YEo%q)#qno!b%$jMWuc3!dX-<`N}i`kiujE?8_NTt4Svy{4yy5q)YxFnYeu?ko4n^KDje zUtWFoD-Kt?b8p+P{qULD|8>qbMovNhKG%rRozL(!9(`2#vkF;7wmg)F6IUWVFKL1@ zXJ$-MHyVltI8>28LE(;!PBqfArgnAh{&cuI_0?!ZK9VZX-^g9>j|&JIX{Vhsyxz4Y zd^n>Y?PFjhIBDCtFen<+ajs^p4LVU=$ZrsROg&%hvyajWzxvu=KqsF)7h?d^;pzek zUNOF5Z2decqX(;ZQ<^hEjhKzsmpYm1wjphmcEoYE-P8N`SJ~%_PS8z9mE1YAPCA_X z$oig?P&-@4vJ3j#ZYy-s8Mrt!KV$p_(1;Rw$hP4qE3QsZO}>Wwt<0Nry09`;}hoMM@G$wDPudNa$F^>6puy> zifM^EK(!f@kAHM)tuZ=Vi2krhc-CyZV6MWnUdPOlS1Gj>72SP)8~ z0lL@^ugEZV)zlVl3|5a?vWc#&*}~m5x~p;Qp++O<1i5B%)mfvf6ATF=cj;ubmW#7s zH@1H~7Vg0nZaN?%K7r)xU7;Oi#t5(T8g0No zmX-K|Z-#AQTX~m!WP@19#XE;>0iRU2iDV7PCQx)BA1&+|yF3UZyCL@pZIlYG!Z$2V z{5mdaLcHi@Q%TuF9hg_zIgURddSsF-y1JJack|e8M@8V>71uChB0U zEZf^+x~r%oAI^ouzA=;mA*s8rjUQg=Ams{BhTqHChCH3{5E0|6*b`DXk`}goxFnF> zVK@U3TfixWZ|pmBa0dx=9;56RZz#@hG&b7&z1IvWU-)~?^^zy@;rvJ0{uTK$Lxg-p zvId}!Hi9O537gBy6$vh!Ie7yvvoGf?-3~lYINE8uRn} za7}5Osk|f5Kar$rI4XMeS>~QeR}m2eG+O{j1{D^cFHw~XJVf>E7Wr* zo?WKXy&}Bfch32x!AAzZ67jl6*mv!|?{8Xd@T9J_LL76$_aNE>1L0W}cE#AWa`9?r zF8*DOKc}BnQX?7ikL2wyfBDHLMf2i|8sS$z%l%QlRUiW$+3+N%E@K9h3^(dr+;Z${ zsGNaEG0wAoGgvLowlz0 zRdd+Rsh{wkJM?aA&A;wwrP3%mg zj#e-Ja%h#S7wgn_N=83XqFA@`RnOCNRt#%Rt$sqO1a?%T5V=#y}ZXBI_shR7wi0b0jJLwI?WsdG^`W z)&6gDh>CbuU7_0WZTYxi?4rj}GcUe4g-)=|?&>6JlaFykozPFz31i(_yGs7?#Hu=;In9Ynm4Lw{2Gi#(d8TjJNdC98t2EJOEv z$5+Jfagre|=*zN}={{fJ%Y02G(0A*mhldTnf!VeBW=RKvT_?BT`e36dEQT=uN zp}{|7gNiM#z?L-Y-4M&Ippz>Zac#Sdi{Tgo@A1jr5xOT0tk&I>^?B?b_g(Ls~zDvAUlmBKt9?_phgOrzb11>&Z353^CxZ zffYi!)`APe5jgMqBYX@9rz?UjJ?q>q{uOeRgjuNkBDAh|OGBF9ON)f!E+jk!lswAt>0N(%bcqeyhs!{p+if4< zY#OAIj|-uQT*6mW6$s%=8hIm}ws2+S8QuJ^6lKfOdxZk@YNO}#MVy=-RvU8w8^^9` z`31HoW27xoNKP)I1CJyIxeIdN)de&JB4N)F#xxaW!-k%6Q%bzMk2sf)F1lMct#1q4MrZ&nsNVD?}BH2Q1!T zmh-$bnG-K%#Lc}WczQz$8{I-0Vvzv?s7YS+a(72DJyDWQd)f2|oA87j9%X~#__-aP z37N~(#}f~@SW(XCWB5uvJ{__AV#T=x;>9f^t==E8OKvf~(~%J2!Z`zIGbIqJPLGX1 zns_xToST1^bZPPbc20R`lv( zanS8{UX_$X+F*k*??jwdb-vodGk?yqsc~)ydp?b2PZPUfs~NGR5m(Z%TRzFH3x{lE z1WyO80_o&J8z6Dir8o0Iu*k~C7})Bsg!0D^v%DJ=zu?ZnBuTy3USRLEDN-+C#)zEM ze;O){&{}aIUk9!iF4{?KEucdM=D$gmL?+5vSa<`W_HbjIc19Kbr^I>1g_dXZ;wW$n zaWQ>NSpm&XMhd}(yP{#i%Mxp+!4m7ZIdbvRPfC5|vLE$)y$*yZ66q^~A58sX%&E-J zB~~wR(%l8g8prpCR1(L9X?74%{s?6$%CNEgxo$|FM#xX?0nyb$jDBkdyabG(F5T_8 z%B>%YJo-`cH`XHvpYx`O43mQTEg1!NzMq)(Q1S#HHe`!Pf){z?VYjP^C2=@T=~oIj z6;n9i8uK;z#3c={tg9(FC)!iS30WX}Mh z#w?M(;OOxOHh6mM4BQ3k%U<(Zi@U^*SR&Gzew=NC^(5qNr?)A-Kp#1!&^k~*9grIZ z`3>G+yj_e0K_nHxw_K3K<8N^RUR!Y2_p?Pa?GVpf;~;VTg*pzM83cg*_O~5X52(k; z8FMeLY>Zn23&E48g}9xGGHb#4fJ3fE4ed zASzJaN$LLddoIB;`zi&=cOn~lh>tbVGRJDIddH+#!dp`dR2Bvmzi3^kt+#o2u&)%p z8c>c|@;M_UWsHX-5Y}M9Q$)DJ)oR08OebUAQ#^d0NY)jJaUA=j^+n6EaQiTn@U<;s zEoMyK{{QT~4|rWybuYNj(UEd=E#xCb7Q#5r_O0sg#)R}XHV{H;ZwcY5DW%s&7RF5- zg~{W&X`33Ju|o>-mMYSVnn^_`Wq|3VxA}OG8U}bX!0X?HxycikhbrA zGvDKz3E=^u4MBH)zqQXk=iI9+S&|+4XT0pY|E#t4+H0@1_dfd^oqaY+_2Q!wsj5rnE;QGm z2(Il$LoZ{MX+Xs|G{0_5xVX<6_3*OA^wVJd;3jhi7_-=GkbzIy`KVm{qv>V5lrF(YFdtkuIVP92FIfZD@q&|TocXT37TI%x3>OqOa(Smep~ z63mrIhrSf?gqD_CLBV3Ik^qfSV1k7#Qm~GSGXTkt{wNT_o;j)rPgTGrNbU#Hrmwv|yHc>J$O2UQH`;j?9s-5)-TYKI62 zO3k3e+Yn$|kQr5DelVze6l8<6mSrM)tHn>iN*c4lQam;Y4E({-O$MtT(a9-2Gs0GG z32=?9p?cJQ)y)vVifdd-aQH?cPv5Fdh>dj(Z>5A)tjgGy1RsGI&nm>Vxyy*}1~IV0 zz8Gig7~EZ?5Z5p?u;B@nK&Ww8qaqBYXmkeoFsY&()|K!pjDYI`;1slZZ8(ItKa84Z z-y2uMC@j4&>M_wcP|@SY=ozrrqDl0QU{X~Fdg1(wfN-FcDAbA90*O0PgrP>z8GWL=)9BxY2VVYPVBs0raE|GYY7ICX#t-X6u?D`Jr`wGsr~hmBFJXLyvOTEbd3W*dw&1nmdjLlD3ysxQHnf2i^9oLl2slnt}rnOY?c-xNu%0d1;tYHPBaAefQV# zGLh1}+=?2w>VgAX(;HTu3KH93Zash_(8jbv$ZdxP1t-c|ND^eAlMjRN#sTmaRNV|S^lMhhT0fYYq{J#@|nEODp9X%!9VA&t6Gn43J&5h94x zu3~QVs{hPs6hKD=k4?}gCp1_rcJb+IHMoV-7zg;O<1|0OUP8U6V9hW=#JqE=Qs*Ka%4T(}~`;BoEo`_w?ifEF^J zSh-RgpRSv~(lut0!d$tl&Fja4gPS zN0$`I>3+&NQxA7u4>n#r$6<9uVS;yF49$Z1Dtw>&N(w%cQwsZ{=<~JmB775cS8=_O zM++!%Q3yQ8D#KXCDOF$sq1Zgl7bBFzm~@Z59KQ_$OAbsbAdVH8H=m|{3C0I(gbwi| zS}VD66hWjBeC$1wa9@L#XhHf=|SAN0c&O zww5HQSo=+klJWl;NkXcy%WNb(17)XlfG!yyt|@hz=^bi(WJ;Ul0KOj*?irY>p+67B z0}^PMJAZyr-nu(8UlPa9v1MRA}-8|HNSGoE2epF9wkOVJe0BH~8n zqa5TN5|dut@;b6cl~ks!eZ&I$~>(WCoy+n#U0|yoLI(=V{*g{ zrlLhHcoiQNiP2Y$R1jhoVm?+*uwkfALnBYf9aq_U#@TQ^TKa zJdDF1M`rdso$QNC6&j-zIF%Hdf1nf};Q5U}M_?>aT(R$z7Vn&h|NXHurT9M`t<G2XJ`bU3kb{3oPo;&ybyY77on<}5<-(v)xxodW1 z_TW={R~A3;>??oi*|&e-p4n2R7QA%!>yGd*YVcpM6_taeDl^+R=kUpWQco%g>yceQtL5J$Ida`@!8Gd+6XV z-~7;LKeO`H>;LkNe}BF?)oi}xSAO8@&0_IM-hS+BbUpzp#FUxwrHQ9Yi&M4A+-saq zFn5*0QC!CgK7n(r{k89YWbtqQH2CsYzO(piZ~Jc_dHl<%Pkw#ntxvw=_}#OZyDTN< z6G|#Sk5*MJq%(1;I;{t$xew&DqEC(tUVGx1N6)|Io>#*5XQ%0t#nPFn%8_VjzH}gp zlOFhrd^N>hh9*rP;J@M@1 z)H8}cQMJlT51zPtcJQv(zxlw@;-Q{sVCVy%*+kJNB;B7n4 zKlQG#w098WKm&x~i-5aj%9a4{99XF2=hueLe3xw$eYeuX@k($AZ z76T{)zI9y14~TBO;m`MpQS!0J0(tk<@81%_g&jcN z1aH3L97#o=@V#riSkAMU0I5%Ki{##h=grZvCT}%;-=I$j6E1>RzyH|hyiWom!O=*G zg-G7EF61v$at)tU;1g(a87g@(1qtvSY&`1Rk=w#k+GF=-cPrM~);x3P&Yg$;=gu92 zSN89hcf4_yQTom`-fed_Ctl8Ngr~SSLqU?O!TSUV0GyP%O<+`zO<70v!Dy-oX z{#gM_*2|zu_s6{u@ktkR-WHzH9y^PnXEsXOOqSgz<#ZWy7xoP_JU7o$1t-SCv2**o zQ=ee&V(IS#d+1QXCo&tt&^$fOy7P*>9(u+?i2sQw`=Gs`w|hq5)zq z1Y6uh8q2x1%YH}N$l={tlaxpL;jy~s6ZzwmN<4f&Lr z!dmsC8Pu=q8tTflKR*$=qZh7Pi4^DQbp^AYW*~|S2cL5ct9DMabl!e>UC=!Xkuh4MJ)T* zSXcm*8qQVZz9qmD>GgxsWPK)oNsiQt;NOoaF5Ty);6d~x4pIUiZ9>1D&12g|PN2T^ z?LWsZt8UD(7cd8cJ6>CI{U=XFajf=HtBi3$TsK`#(g5YyW9OKrE2_DmqZU*`;?2>nj%zT z`6~X=CpBTE;CQt-Al*vnSM4(Cx;_YM=bv_pf~n>z3v#9_#+@x!Vu9b52t+ z@Ov(B&D6zwqOLFa1mA(6ULJPraQ0#Td(uaAehJ4k>-m-?p?T3OfJyWG_Q3XjHE=E+ zC(G~&IeAk|cIOlBm*pN+H84pe0GE1+;S`B+EU3s~iRK}W59gCuY?-pI6QR#Q5PMF0 zZ}Nqx4}DS`C#&bKBj4Kbsd8Ce*zw=PC#AlEPj*4N_QKYQJNpEmz+ssNK6Cy~q%c`v z#e_V+&4DjTG$uelpmyw-AXWe;hgR64#3M4JB@Jb`Ct53I4i}~nlXB80NCw^~bcslD zbJw!>iJ!X+RyZ0T0keuH2y(7C+lx0vU0V4A;HphaveYMq>Jq4DqU9id>>H8|Rf=^RlgoFg}t zdPU03y5%l@1EuvU9*^nR0uk#u+KYBHZE-E`dj|^k(bWI zJl}~I{b^dmX6nvtmTBiPtE4QE#W2VrHJ}kpM{9bHRYdEh1X805+vR&67voQ;9`cmO zq%nMpB{eeqZ3=A4UEfrx^_lxGtWWPi#o|*yBg8N3tAbn|IC@uZ50qI4LcBKQ$hyb{ zDOKe813-lkuPPB-D9P3!@>$~(O5TuWPH5D~|56rYiOIp{Nu*4cW6C%&R7Rk+WQyEM zbk*-{w3KgSOW*ZK4);9ml0I*whWuSLzJioPgpvTc+&X+t%~Rf1HZPdI3kZuO1!EQH zg`|cgm<*vVV0n^X>K|e&QPH~I!oYzGZ$1I!VG>h(ri! zaSOzQTaeD6_yea@?bupEUCdc!6AJ`?9<=tUG&XH{X;CZAC_4s>Rk2M85}P!0S)$$e z?sE&+LJkwg8lYS728_iHVn7Yhc`cCaOs+$v(nw4}`-H?A)1bDJ3@S=Pf;Na82Cr&I z7CC~IFb~ju1D7+1_*)-*{}zRG%9~2aN~WD5%ePe9&YW?XEOiNqo$}JvrUbxN^3NAq zt-YtD@v0W+0z*dRF7q_go6*5ZTyMsuMoD8f@Hivm#^*?Gfly0U2P%-11ZoZN?#js~ zPo^n(CWJKG&2*-1Y6wqXRdAz-ZSQcLB9DP?FPYZldwUBxWrjWUq!3I>)=rMrS!ve> zkTri60k1G1V=&}^H!8J8wu1K>8M{(UfisoG{e#5#pTid_0<8!QW{fh4k(do}%rZ_$ zB%nutX+5wcLQWu&niL_1NI>NDahXdDcf6ef3Jo$B71#}HRPke<;$IqFTd1iAg9PU; zs87j43K?mwaGZmxAR^?w5?7@?JHV0Pai&q%VU5fA2p0=?{YKFWXtEiD)zN_b2^d_4 z0@qtjielv31Z(kfq%ltR@#?2Zbl|i{8uFnSiqsroRhSCXBus)2uSN?G@iI=dWTDz+ zfZ2a-A;k~$*OLORo+LN;U_AfvsuX(!HTIhUkb#Y;iR5Uh+55h!EAAt~3DsWYNjmleh< z!4(T!vA`7zT(Q6v3tX|l6$@Okz!eKzvA`7zT(Q6v3tX|lKM@NA|1|Vm_el_%UN_xYx)ZZo={irLBSwYxyg|t$W)jzzeJsTgQ>{#l?JkdQLk` zT3n8lzUX50g~*8bc)@6k6k^FMZsG@X4)djh(by zPZ`}tGpgZ`4X~AyR-LcESDE~a4dtfyIFVhNM7Gww~(*>?nOia=CI=189sVtao` ziJ%EN%}V56p)X=OqzihJYTH=a^4gQLM2g7T>=`x?m#*3XQzsVKp!f}vux%K`O*WM$MxdE2^XnDV;e(U67C7!$f-Z znjr7g{H!0pzyrP_@NLEy z0ga{_!7p*jz}vjQ00$U?wQPEEp+=GQGQd$&sC)@nhc_rGH<8wr6+#}Ed9tUFis34n z%qbxg?yxB_Ez&W{C3YlVIefLEAZ=coPsWxC&g-0l6zq5(`4ekl4MrEq;VGccmAZm2-Zs2WlT)vkuf^bh%M%) zOc9>cMxPQJ-Gp&{AutpP#3Ya9|L5p(%>vlhC@0%o8mV z8b8hyZc0U>9hL=Qb8ojZY%qV#jqQwbXJ^{6XqZiLWr?-HxrBzD9>C$ie((OFBNCEH zWe{2XJoFgwTggSCGfN}8)r{1GAo02{{oj{?P=Ey86NmyeIVl|>;t~Le>wuD)vJx(V z3IG_J4s6`0Tc`>>O~`Ij7CgxzUUQwdAwF{Zutht>`d&{mc@a{e5MZAYNTd#`(4ag^ z8f0@2z4PpbQZG!uSzvL6a0So^%M>OE%~+JvlE5_OUT(H&)^Zl9Ll;a4m_x#3)IIb; z%QP^WlyU8uF>}F)y&=CrscDrIfb{^Zb@Pb7_~T#^1*73dX}k|o^N|`w43AjkPy|zt zj=YFM+=CJdV+~yMkiZfl6kHsXPxZU?Af3FVlmWR<=+vMCpqe$ou1VPvVaFJXLGwT( z_JBN>mwqzJ)Zw~>%bt0bC_P*caXp_8dT>24_?NbY$5i1vf#D*GC4CFzN1pI5D-kj- z&k%wZ)aPNhg+}^uY2-0?%FzP-dIHC6nPn`yq^Pl|2BokQ1^a$O^)Na-=dKzK3V}UW z1NaE6NDV?S0dxW1B6L4^*#NCcLbrm4tndd8g>MdO;4rz8p~Aoy_Azk;mZsY;8KSOK zghjogd!C1F9F)^oB9j>Eh#w}_2D>3n{DFy}wWd}!ZkCiou|ao3S(1UpdUXvS2kpn^4*fzLjpS!~(*5RHNk2VOc1e2p?J z{(Ci&L=#2LBC3pCRoRqJ^u#EehMOqv2r-BUC(ty0XPvEq$;1SGDl854CE8Rb@GW#u zOgu3ag*EK-bq-7L6-tWZM&BMb8FS_!D&l@;cYih!O%A;2dQ**g;YcuD^`H#3gfzIp z-I)9oic%je!P~$nE0|vjqmaJmWK5_}pe}=*)H_Brt}VSIDulRDnM(4ea4%bc{{^7K z0c$#i%%~iT%9$bU{;E_cy`?0+%V{CAMU(Pi7yfFc3Ldjij!o}UJ{@%BJ^l>bwb*2l{uxgi6(K{>1#Dk zs*wwDGE`T`2T^X9}ag)ge@0|!s@M3@o z^W9vsjl@$U72H|&G!ipfq#<6an=@k3E#ezD50WK91juS&EA!JjV!6h0N zd3*{IQKT$$Ik@2|%cJ|Fpn^^uMN9sv2-u<}H>+w$le-7tw2Zw3{T&B6sK~Mgj0qS5 z7iVl<9Ml|#g^*Vi;_P6lEeZ$g!T!r+1z(C9iyK_q6=AjAngYy21hZyU@ouNkBe z2Z1(7LuLX(WD}gg*Ih==s?mzxx8NKs6}Td`0aUx@FmXI&x70cvj1IfSaQH=1FwBd` zvDHu(km->nh~0yQmQtf=0!rh7svB*FS1CT;gMe1VaM7>` z*k$GOZ(y^9J?eu}eoqBx5u)l*$k~zW3JuQdG_JlNYHWBz+xyg#wjljDe#GL}4meP8 zN^p1zls#((A}R5)kP64uM0~u;X^RjIBaUMunU;W}SM|&m4wo6}qkfkGhW={`!Et&J z=d{BqJXE0q#ly;wvfFSJW}cE>BMnfjO*i=h|5YDW&8RXwxCSfSu9*8u0sWe zR{(Z(i+^y_;|ekB!JO7_!)TwyX&>B8D{{yd!W&WF<4E8d2JHg$W7dIjAv_860NSbt z?KWivMREp>5*|A83>&}@PbW%Yh<#y5_rbe6Rhey;Bc!%DGO`(`F9H7bK?((So?Pfg zmkPZ{=Cr1k1z@I#Fvu4aA`*3ChjK*GN$wsh?K9=6eIZRsQ){;V zdbm;7Mv^;WEvTvoOvJNi08xN*t19TbCAb31gdI}{_LT-FaGuaGP9Ay}?1@H(lf z84L}r`l~}Q)Z5~#jv7eDoQT8j`g(DIk&c7XUv5*$9Hg%DiCM&9u&RbiN(OxgbvZl7 zTU0lwX(ZoBC4ac>Ry*4_QV|RZA4L^T5KQs+5+nvYhIU4Nf0QqJ85%wptHn619xk z59SUmTy^V%2h6_teK%JwL^mI|RaJrs?a=rQ!BBE)aj_QSOhnukh6^%xjfK(BBB$BA z78g%w^)`(LmtvG?hndC2v$e|OM{e0&x^4PLYSU54on!jYo9_BRdHROyzwyo4*^@Wi z{Sya&_u$RDuif!NoYyjY@5-xYd!ioP|2zLtX7mRS?L>dG?ecvd2k(Yh2nX9&RvxMx ze#vDRCnF!3)9}eaPyMQ%9?|5`?2R`M4=!D|Jv!T8nNlCw{_Hn~D-#OW9jE6rkDk1D z@*T5(f9|jDy>aSIcb}X+cyi^JW}kbiG=$!a=9JFhM6Tf*^ud>Z@T)s-x%;_MoNd#M z^M-oPzPx|m;l1|2Z~VsT7giou2NrSP(z_JB;_U3B2dD3TYWC)X&)#A7h4^ue9sbboZVdG_S&ZSVNWmw$Zc!QI!s z_}Z1(lQ>1^owGe*t55nrTHRSn`p_pkL*|p&*@r6A+b@GpuKGFgNl>bze~8f!&c5~L z@am;Xzj|{&$I14uf1^|};k&(0R^XH4(aBOJeE)Q*|IBph$ke&}uR42lTkTlszya~e z>_cC__nsG?|GRAm4*W*EgKLy_aNkyb@|%YawNR4g8=5N~gCfHa`&geY8-#+6)2i!WHW zfu7O24YgJlcX+9swKz6}kN(#AgnH*b!Rbufuez$)?C!>SBsfq;9dhRYIFa}Wc9T9C zIJUjny?-K(aUTv#DO}41n#~_T+FqEhXbovuhu%yl)L?v&tSj$AGsD=J+$YR?I11lT z`u_bF^9i-}rCdy(G@BJV0;R)lh;@qVa&sCsLaO{<{gk|kj!;o+_PGBNMxA}y+<7@bB zU}W0jgk(;&ky47EyABIES@t!3?sIkcM2SyQO$q|iGi=ltpK2*J4qF>X&d$fr#VT0&z+g$kz0?qy<2lOmpVmPwt;^apTLiCl;)w6 zv`yvb^(1_ueLQcAyFj80b!53$1_{plNzX(A+R0lOtV=n>;FI!*Gn=3s*HD>UxxxCDFALMjx(E7d+3wUlkRYT_m{J8c$N*$x}jbYyR&UvInVzV zHFp!z9ah_(!%FS`%p8y1dVK8?&mzLJ6Zk-M<9R*Qap(>N{@fnM$g*v6o)50d(k6V$ zjOX{fh;2bzMYl8ty?zt;hJl=fLqpnvauTB^Atv-O>jR!Pc@g-?FE%8eaud}9SI8q3 zuu)FEit?=g_{b-zr>mE`6`>ipGj4dU*JDlFeDb`z0ORnRV>uu0yfKI6qny`7o0E}x z*~>bgjnTq{%r)28cGMR0FHGMh%8S=(oDX;gWAhNP!I77}%u$_ga-NBtG1Il(%}~nX zTte-5T0;8-=eCBmHBB?RC73~KU?6EQrY+oAXy4wiffW>wvllQ%qPm-}%Q)vpYv~q( zmNPscpE|6*W+=6S!#Pxc0Ga1-{h&|WbA)!Eh_IHxw&Y&+veolq3qzW@d_D>POD-Q* zbHMGlvmfDHmi2tn9|TV{yS6`x^Ln(^HkZ+ovaU6@g>I00;t5_qJkVzQ_s__+Azv-z zrE<=6s7gWc$x0BckgW7h@G)la+c|=4o8cu>8X_ZlyGSIrtu#V>+j< zxu&&TXReK4uTB>Y?YuHh*ts!IJS|s?V)tiCGuu%Amid&y|my?~CWKOu*2ULJRr)w>r$T*Rm zx-yD5PNdwQA9CZdESIJHexhos%5YX)R<*w!n_n?F?mlj_y`mkoNP`A!$%v1oxgc;!Ll2Tfty)L7GZ-KeC z{D-w5^oRAETllt~dBLB%I>Y-Vj=H|MSA?Z`)%AJcp?i40uOl*&TD7k+#j6FwwuPV{ z24mQ_V048gZ1G}1L<-i$+Lv#S7beAq3NdZg#)tik#@RL%w|=D8CL59@NJF3dJPAJI z(i1LfMJj6)2Du006Ns~PmJnh~F3;@z5~-3e$RiG5By@pk$q?uHEz!`}4#_{yJEU1fa~xS1WvS;Q@!|uS)U_<;7<9(x z>}Lx3izju;;$xQ$QtajTsFd<;m_@dF$ML9OZ@Phw+gWPsaJ}#m7 zyExExw!r3XsoU@cmNk0Ea z3KewJN9wSJn*1wt1(aOWH4!m?kfXbp1GLlyYqE|7p>*zLHl_I}_6SNYfGMOemc;E; z`_N9JpHN^D)uLKlN1ei~7T z-z5PA^!y*G1jCcv!&Z^NtpT(gfbV$fP#Nv=C_M&D%-dldI$fPayd*^a98kbvIEZEh z&oRSC$00`mCG*}t1^3c!Xu#nxprT&)l25Fx=i7KpITMgUh(rL=Rw;u~>v|{gjxJ0H zj3grbIk7ONkwIe!R>DgUc6}2yL72%zp$@TDS`mn&r1@;dhlEWtb)=}LXbMJoy@t80 z5G5M?2qGP^Nq>k47QfWszL;@k!a35lQFEYM{4>m}$dC`xtmhYWr$DzMbpVXlBc)l? zw%~3X(JR`BDGwu7W|>HVT_~~)tw&vA9RGenfUzRiE>eDKAJ=UQOk({&t1u#$28F*2 zf(DWr{;-HsF!Rm>lO9pQ&cZhIxm;D+2)L!PEom?uV$-GNm)%jj3iyR7wsR! z%cu^Qg_=Wni*Yp0HrGYMBUw0{D;YrNPjTQX|tr z2>yr_5Ixm_)>eQm%K+k36e-QNx`{c$E})F;5}efxlK6#6{WVfWk$yfmDG#^^#)T6S zg}l_Kav{CF0^w;5Y?>A0Yd;N$SZlONI~JMhDJPqfgUORiNLtAj7oCl)%jBF}Nrm4} zOW6i$30p;2>N)RfYSj-WcTlEoEXb`ASfyY?n^kkz(f01NWta!Wn75_{Qu9G*TV$4dA zJ;ljN(GW#rXiPTwV!(+Kd0P%%{0v$XLoQn7{tk!NFlk3Z+D_X#cg64lDN(vHK7i6j z)O0%v!eG3C1zp29Z(6Y>wk;U^YXvT@(7`ivj>=>v4TL#R4Zy&OObFAGOy79_9ss-a zY3Jd{yN~z{fLy{gS|x+UN{P7fM;cwCAsL9J0`ez=EEEKS2*Y2hPZ5jKcCndFQCpAV zd8M{3pw%X3)6sq#+GWJBQ=Rz~3a`yMjI3<2(l8vu8of@_Viv_Dh-G5HO`=t3nFe;g zjG$nA$%(ylhmaTCcx}xxCN~p=Ktb3zW`9&OfxIEF5q^>lgH3{Q=cUoQ;u-9v3(%mS zK?lP7zr-5;(34DEeF7JM;Uqq^Ojei_hzFH6YL~`_8RVr`rIf8k;Wv$Hq#Xuk@WIU2K!9AZn5&Vr@8VhQW{F6DPL*D7?RTURId_#;bLI%5>ILx z=V}*O$iZwFVdMq-&EQ<3rJq^y)Ho1n=vtKb=HrV)vryAzDdQS zT4Uyo`iQ$U7+EqE>cNK>vb``Br!j-bGX&(RrcNz^RO+K7HX|z0C4{mMRW`W%gLg`*MxY{49=SX3|v0QBnaJ-E(Wj#`_B=MBE+2IaK#Li#VKuN`#>QG`kH)`_7?h>J(sdMI;%=^N{%e~bMX z1y!bi))fRP99IVO!ql-h9S@_OukqNe$J_rqr5>qb29U-Ec(sUp~ z8fJPzo2>cKsM7FcVuo&1!PV8eDxrXCJ_9^v7S(vrx*~1)a zk{`Rgq_9mfZbaHy4GOR~lZjtK(1-`p?v1H}vu$Fh)N8TXuC@)d4S`PgIpTsoFWpeq z2)q^fOhZjAk7q(cWl+V?1Zods{3RoYlI#%oc|BjkCAG9~ahHzcnanz#y!m+K!oHE| z!ro;?F;pVI9kM~Hx{wW zG#QEy&Hv6X+!0oi%HFsV?z4Jl^d+>-SvMDwdO{GW5D;=J=hAPPlB#i~`5@;cz#t|Y zGWX9PKZ%bHe$lyzV-ra5H9|Wzev|qRc{c(x*i%=l)Q*%!tMl;?YFfhVig9xDT`S+Y zVfJr+6;fqEs7s4y!b)xU>|*I}!+o!p9z^-2#?)fv^`jME*M$quUO4`$H{LzloV|D7 z-S_^y$8S9j-hW~D%Gt`9tAGCm>g8c?Ph5fz!r{t)`0{p(y>mU+f8^DR{bz?Nf04~S zI)>q~e@HJra8^~09y$2wyBNWKT^R|7@wKyRnyNr(EsJ>`1RA7^r%+ge8rAjPIQ)#ZOOHY8WRm)G+0y;`a(AC#VkE(ahetl{Z;il$1=X-b#JsbIs=4@J_Xd=Kha2u}4QK z&UJ3m^`tGuyI+a@e0X;`R^8oIOxbwD*TV!R?*Y7PtH##Q)iWkO;cl2t`7G{H&}M*k z7-L-Q!{*0bYGZo|_M_W)9?x4yWi#h*l)ro>AmPV?$f%sPYerNirDT7T6P%Kz)yUF{q9;O zezjGfpg4f<(Vy$&ljTZ$Y!jozj}xVi$vy(_lV?wycpCeGF-P-T2SunCGf4BD@ciBC zVBo1Y!zWX^jce=Ko&VzY=AqkJ-uZ-YspmdH*WADMIO!5g%&@R!;K17L%}ERmV{sp* z8Yz|?2#6M7U4)B`6D?e8`NV*_C7(3tlbv`Gy=Cs=@~_P&k<_0DpTpdh`vg9cxl0Q} zHD}v$>Z}#N6kY;XxvQ z<|t1`%)NbwS@zN(KICPhD!JE2o)1-^Lzcg(MW-6>5COhzERXDAmP0%a{AUnDXTe9n zvpjWO%W$bp((<`2Ts;eJ&*#{};AhZ@A;;B^9X&$7BbSdVE)Ge$&rwy~9z1j&ssAn2 zxqDDL#Iiz!0136Ry2llPxc+MTvDyygFN>c%Kk;}Yeac`4rs30Sx;vZUvF-Uv>xO3 ze7@zh*bH(U-p6lQn7av28HnEyk-gOY9i$@aEM;T?GZI~tXp+g!E)n3rlr*8RmpW&QqAu)`m+wgk^1I*V{QCn;sn{9>n{iJLcknsrKp&a9tLfs|7{h#`YBkjqIdZ{s^1pY!i?U_1 zB-h0u-@nz$Ymhy~pa9yfRZLjtI;Asctz@kLB~JC3u+f=oGuW=T&?o!%7p__OMnTah zS6$WBt&aKqpImj&CtP|=-@;vGVnAGwOgc4r{IT@fsn%Sky8V;9W>Mp$p_Vhv8?rb^ z^H$Js7^;)G!Vis#fDQz{@D$8xyRax;#eRc6wj2lDj{=?iS z`^7f!`muB8Ui@NA|A#1JEuXAR!zVWefk`WxNn?jsJN!7YHYKczyiYE+U(g9yMtRp) zoDcmtSta%&h&AUftF}t|hFoXX&pSx0@VD2iHbDy-& zU4ER<_NWm)sj_1H38N+oq<9Rrbd9UI3)|6zAq)K6RrJX&#nG<;o-Lkqa~Gx&peV=r zW_ATv25wT&g9XYkbN(<7oV7x7Ko4Stu z@`ah{`u`d&6G*$M*PyMgtUw#SHCy1)Ii-+PnGNMRqT^rH1FEj9Xk?hSPAf^fSH%Q#3MNdvQSFn%=pT6Cc-)4J#@=D{dx75FY^ zGLwDn+r8N0{^N}7i5+9Fw8^NPPSTcWAQMsy{sG>{0AP$n(z@$f>j9;P_v&5Gw_po> zVWe|byigx#I5~)Q8HBC)gT*uh2Y#GrT)K2tk?~Zw;~~vGf02f0O|`;#%{OE-&{--= zRG7*%&CprGcVpkJbV|wa$h&c3kP10YCM{9~jsN%+S%Jkh9wWdYCDxKf1cNDRft68( zB+OxPHtSUdv6aC4BQ3j5JGUZzOJ%lywXK-bu}#x9o{eV>STk8hMTQ803=4k`WPgP5 zG@&}?F^nz90A@#8G)iOXC^cj@Ye?$_w8U*4qd?PzG?VRlPhMMs=U6M2w_!bT=bPM8 zlX(%D%FV^+DPP9LIUXr3dTOCqNB6zINb(fMT4y;)$!PE>Vu;XC3Xvr~jvI_}xlD#w zs^^*r`ATrb0#__>#R69>aK!>wEO5mFS1fSF0#__>#R69>aK!>wEO5mFS1fSF0{=g> zK&a8^Ai@{nUYkF~4DjHZcx;w&bbPFc0Q|aeG5R`%LnFlBF5PNW(B1PXY<&5<(qSM2 z^{x`5AbAgCZY%$-s$GOoCFk#_XJ0H2~9p*?i;u;niv?L6z{ z=QQ;Q%!jqcpC9Pr?RZN6&iobP^S*2zqMBsGpnp`jw9@P@t zH0NXR3uN)6Yb)|~)|27IR)NX$cea+xLBiQ3|K>ml3 z4$`bz2G$lS!moi@7Oau5C5U_hOLU8TLrex*QZCGpn@dzTz%GB%*#O_Av-IDwu8ikZ z5z}5Z5N3}@Mn1vV6f^Q6susi#BcoY~W$?Vizgf2ivo5trw8c!84%cgiINX_jK}rCD z*WL)0!MYtnIE2rT_Y%NdLfPk~X!rB2k%ro=W2vpL1LZ8wL;>iNR$c=Pf3097>%vyb z26I-bw?%GU%;1lht=V;Rc3tY`h*y82Xc=^Cz47v{RUP@glz`L_UuM9s0BkKW_!@y* zuLz&mfbU!Bj5W;4$v$*bVR+ zR1)xWobJsvgnRL7E--`$ukvJ+Y~nx>ucUCb2Vex<0^PGx+o1DPYY@j8F7l}fr?=mi(a_>f188d z>uCIlt9xNwY|QFuJA#$4B`CDU3cZC#r@YcW6X@h{WRadBdRPURu23E~W2nTy3$C6Z zvf+Xx$1qlK^As$M;OiRrcJ1*Ve4tY;#a2!{K`XTDt(Nm16_pMw@n(W~3_doFT>~92 zMfgd>wIo^t zw#VYj=dD=ErpyfN!>}T7F>g{G2sId9W=_%uX0F%qu}OSHCH-oe_O+8q6rvCek6*)8 zua_TN5pfYD0Ka7jTS`g}fsMj>RED2T=@ImL9>9r*H;f{%H}sv3ExyT#mIfg;ka{(n zYeD6=D3M74sh%WeL|0OdC1VSb9E)h^<9zySpcm#stJZ9rWoTv>0{s+k)xm z!VHrUzQoFT$YPpu12&L6#+Q+=v5?E~GSY){;o*9a13dLYa;uclzd1N@rHk2h2xz%7T@ei*e zSYXhr6$*3B8mn^3qTP@Iom3R($l;Ivvf7j|5#r0494f$v5x(Jy_<)L(0UMl!r*vw5 z-ZnxD0T{(1N7?MjD7iKWq3W?c^55W&{!LW<;D5?Y!~d0nG7@-1ihOI&m)&MUs5W{5Vk==WK|LHkzmvybC)t| zZqOu@XUNix<2WeJj-gnf#-T(sZ`B9YoHo{C&WQ1t+&cM@9SR=QqonWgj-ehQ%6`c?Q?6@`7P)ExwDF!zu23aFbj|4|bE09OYuNA+cTqw0g=#de= zx{WFfEVuiE|M|2TL<{kX`iLEi#-?P-fo5QXckp9<+IFhKf&!`wbB4$w4R5+Jpn|GK z(qj8gC`X%wY$8z6a@RO5i*X5;sM5lAeA8kP1t-W5MtdffP`_63G9Aiw+5!$Cnn$vV z$qfH(Z>$zHMX|sZL5}i>LnG8vgbyyRu653L{Ax+mYd{4+YL12Pn9EHelv(r5MZ?ydW<~Dy$WXzfMk11 zReYUT?Rl-n?W%@|A!-2V`7NB0Aie}LD#u_RpHV@L4lYle?7=tg!oisdeBJv_rC)lz zS`MLb6ysyxaa2cTn*$@-A;dI+qf3Tx#Y+Y8hk2#9^DcuiyCUO zei=H0x@=-_k$GATnr)n~p;iU~tVRt13odF4HN2+!6rwgL!LTfgF%cpeCw(xt(Z8eA z<2cMD9_>;0VIni8WTar_@SS>cL``b7(;-GaR6RU4G^9UNpC6BgqOzr4Mn~lX_!4Us zofw-<;WjO$edID53eje&j^?{~fHDFZ;OrMP!jgpWjsR%*f7yY?A#`E+gWX3M4nx>K zHFDEJuuCoULc>XSV<$`)wOV0?Y7hdbWE&VZDX<#9oRaCSHK}Nsj?n+qH72U=Nft?07|h!9Bu4oSl1BsvH~#SNads_0;xwOBjgjo>gFD8XQuu`aLzWgi@B-sv4aHeql(*5IPY|1Ro5d z-bOFn6u3HBY=f|<`pfuWMWAsF1K>OTxJTAZB8~NU-3%_O$|LTC0cR^At_n(FvX+Eq=E3UZ^zYk}s;F21-Wl|VqHMkpnTMlmyN1_Yu)zlN7Q>O#FOI=7p(@ti- zgt^5EA&P7`s1-ilsd{h?nCP2IK-s2B7&!I$opEH)<)tf{y1E%l5cCKNL%cR#G>H+o(GZDhS;$O-j7l;53o=2pK~diGHZ4Kx}af z76%5i%8bT1z{v%D8bt8`dlv5&!44dpvuS`Ycq|qK^kV@&sKRYHlK?%Sic2ddbvvYI zBK5WEGUWh416N0 z9K3U|^5WMdr5~RPPe+sbwfeNub(I*1ih}4%CK6eHlH3|5rRZ1GZFmy-&X*h>9vTj@ z)|ys#4o~SHxkll*E3DpBI6VZ-T%BHrjl^H5_rD3v!%0jw8dnCFQgtBgnV7)25%?~z z8d#j%c>zapm^(}11Xd`VpgMd066Y@VE`jaC<5NFjx{-c&U;VzDM~>VdC6CPC%Fa6k zrO;o)o~Xoc_J;R8vR6Z$4=QIVDb8R~mrEESdU0mH(Kp0foK^@EU5byE8mfwdVZ>Wf zt#BgK_^ZBTN_}ed#z)laf_tzo`?LS?>v3%aU$uwhrz#&^+;=lhKvB^_T~fEq9Jtw* zacC3lGV<4V#Y4yYtnR7neYh4w$5C8+u1B8&|K_K!m3sf#q%yW+xb(o`>3v6s@4B}C zmf@bM!v{*Gmk$T(JrCV=@5kP8?)`V2Db1gmt{j=hiXL-a2XH>&_}>!DVdk2{IC=E; zgHJtq=#Bplw?d8U>(6|4_ph$p@Yu>jPkrU1OaEcG|Gwd#uCV9u1N~=@mei|1^n+(U zb$Vpy4}yi(Di=?mU98l4uUon6!paTP=icF|xH5_Ai?!3G%JdD7sM7~Z*Y#ZAc<=P= zEjQlwk{AA$Lo2hhyJydz|ATLw|M`2*Ox^X=%E~?OxaaRnH{Jc^TW2-rbd2 z5FPx#cHesNp4r)NzWi%99lZJc`ITp84-U`%*{9Fmu=45ITYmAK<>6;Pw(rC%uJ1W} z_JMfnfsW?#I(3S_4xjYIkMAh=KQJ^MA5|x}?L08O7d{E$6Q$ns^;7q*44?nZ#2K7T z1D^~J;mDkhmCz?!_6VO#SR2@R`@7p8ed-N|j>9M6S6}-(Pp!=U+{){oTzO#jCx7GL zzxRcyPp0qh|8$Q&a`Z#ZvyX+Pp^qu?Nv;)qf^nkveErPVS9a~bI`>IBkIbKjPmcCK zQaW&F>AIuW*FSRazVfbB$&%{*v19wI zhdk0_i@K`j_U(1G9cQ3qTtb%bZOfJai)hZjD(L@%?+b&$nIJsV4xhJf0)vE6Wu?0n zR^0+9*4+PX&Fi<3JJl1oK-4l@7%*vB0+etylgoIs8Ob+>&z*}F`**u&GJx|`dM!)a4WHoe zkr(kv@f*R;Csi|W%;3U_$62=7)SBXP8PHW+EO60;y(dKZbuFvDC!2|S13Xl$pEX?^3O*5=P^K$Y@JT~W z2-deAqf|o*PxNs~z}`-uI1f0f?(CUkQyfg>aV4y6NSboo&q@QI(hd|4rjPiS@hBzjnJ?sDZoA+>?k z)G1&ZVWZC=@1U=Y*!6F%ollM`-5`;32BILIbUr}^nsXOvPc{$0CpJ4wn)q)FLYuX0X@`Jy#?owz~*uv%e;p>pfl4fkBIj&DfCEu2ilgNgTgs^$e)wK7!%$w z<)W>_Z>hWUQh5koxnMm?;5m42ecdO^_K|9+V*KHfZk z{x2}5w*ypnDC2cI=7ev5``cK#Bn^cTiR&DugHGb|Ij|FTv=&OK4lFW0L3 zw>O*SG)nKEm}oYie!7njE!2hc<$dLI&3O9>oT=4O8+R=PtKH0bR=j4HumFqd)<(-= zL*_uNAXLLFV-o!4S7c3ry!zhvkZ+c;B1j*oG!<-w+;SftM_wuf!E?8uT`Nj`9JTz# zu~?mF&CT!vC1X{B-~RpAUMuxjV4m!3h0EoW{ir>}G6sK&J$CycsMP$~^Q`-+r<$;X zXaOb4<%hr5#MOO$pEPjKla)z}t{v5}48u$)4AwFdpY*G%nT8^(d_p{-**xD=H{uv< zqzw_53^Gp8EkFL)`SZM{HJjUiljB5TJ@YiI@U3riHHW#$u&O7Ux8L5W%FE@Gi3!%m zaiU(wadIBx13 zz1g6dj(?7m%qLCwq(T4i=f(-vCRR0`1XrgTE|*W#7omfUlfFH-A7br4d;STWCNS}z zP%%!86M#>`H_#{h;S*SX734nYtZi!nJbMNr!jI1;`Fu*_hq`$N6z48j{aC>#ZtgNd z(3LWD6rbRcoLLrZgHtU3%)=S~asb*bz2S1m+PDm{b`a^3L74!LTJ-VHhU0Qc55jSw z&N*82>nYE>O1FYJ==s+|#lAxqV}>Vx(DSXeY7e#45u`EBXQv#D2Zv8%jGLA`$`ArP z2-S=;erK&b-?<#iZV@75wpjAgitUx+;r$=hOoZ13@s9eOo?&J@jnn;%U4JP&w(E-@ z)*9rno|g47WX!-RU7u&+POxAEJA)W}`0Jq2fu#GCzv%*I=d~Lv z_R5<6m#vMTM(5j=kOU-{#Zg{hG7POvj;!{ z%@`oMw2ip}*)d6|WrbEiY%N)w419msnxu=DGC51y=Of;i1>HDns#rVs>q_asucc3!J(bnN`Jz0_zD+4YP4!)MFYKH4v-1-5=lr>;LDj=7;i2*ur zc8S16tsD!&q}u|61hlnC7#0o5aGAhfCOI1sV^XI18WWcO8JP*=@zB5`@4@YgkylkL ztTJ~8h-fF9%h3O6hfTLc0mhZpj_&epp(BYOG$f9xCAkh5VIwi^ABcsJ;jL1}Rbm9k ztmj4y>kT7kL<&S7Qy<|v=^RyQ#RJn9$H4m!006D5g zi4<5k^`w^MB?V4eQAFNHirCAajx1$b{9~wg{3!zD>^$N#!kwiog7eSGKzVnm8X-EyU2A90}PQOzRLhNFT! zC=rhd)fF-<_q@Rm%_nIK(uT)>CN?n25TDOWX4LTok%3`~(~9FsB4aOV4=a@z6-7uq z2r14#i zhvA1Th8ZHh4@3|Y;z*SmsL_oIh0btzKLxomKyKw><^0+WPOclU%nZQku zmr2+r#Gs89cEP`Sl)}8Q{XJ3|`e-Ji9uOArv&gs~8ZFk;4ngC2JA_tKOb&jWMMTAT zK^yxvx>y^^hU&o>SLA54t`;NJm>X9;C9K3y*Mq%LWas$j;~p6tc;lUY^8sCNL~0Rp zTfdFw@vdPM5?{qJjVQK2nfP&v#oGO{0z{@g=(37!5ym=lh;V(*#$(^lp=l6$Mn%%y`=jxI>P{kQEw8c80J#vRA_m4X6!5O{d5Q6T7xn5J)$*89+A0f|V)n^6 zv9wd!7%Y^tFgq`0Dd2jdw4@RK5&VJ68M50T(CV>y@Bx3B!L>Tq;WCTQ#aWk3k}6(- zkovIb88=wt<6D*5Ce@JuJw#(~TaYXbCD`LJKsy!yTdrs-GZ-Kcw}kn?Dex)$RmNZ| z#CSyKY15ZXs9SNbh)cf(TQV47WKI}fNFuPHV``;$UM+viVHQ(fq?I|!%|v+r!Hop& z_o`?FShnw-h@jt~8oF&#CHN2Q<%LjMcX?%Yl;$RNG|J5nYVehh@6_0mV`iMKVIiHs za~*C?q`ZFqbZLI4-w(Ey}!V;9Kdv6;Xg0G;SA?esH>jd5hRyN` z-6iPB7Ls+K;ei$cVH35>+f%Yj%a&50r0fIBv)hHVOJBmKLHGIn&&*uit9My1_srz? zw>9T=X8z~4lSn)Xz_cBCl%_FDWZY5yLT{17n5Mm%V|FMIufG3}LyFYGKCY7qvGLjonmBvyAh8SoO;tG8pjV&9*9p*YWy$(=CZE1{rG(< zJmu{k8rnBJsIH3M8;^{tpT@m*X&-)$aGTU>OGDz?O4O9v5YT7i0F#LIFCMQB`yGdN zJX}H3uW!+VJvSX0@`Ij{6T?S)R4{^{df>H{^ysng9vK;ZQ+-|4&bVhd>>rA%Q>QTa z=#yd|-R*fhe(3nfebIfp{X0fgXV38Hn@YZZd*r`mf5WLS**o`(kV9;RMR1zXKkuWa z^!D!PMN2Mi)6F+1-Fd^Q@Wa<&y59bd>oW79j?GXbsSQvnn8LWX9<>Ke|B zTt1=;%Og?g=!Nt1&%frd0T}#TGr?#k+@x;4L_aZgzJ1&q?|t^!gJEaXi?Kle_TEQd zo_+R}|MAq=3!izz*fXC!*Z1TXUOG4X@~2Mx#G}8yW6E@?_n6csxL^;>ZNe-FXKsT{ z{ygY-EAH$T*Zttv?>TYowXZz*?CjYWjvf5i!AH*yoH={f*zDM|&wTfZgLk~}%Iu3j zGIqy-2QNQ)rt`YnZm66)bMJ#==YH^9W|Pi)&fI&?*uC$nU3_`=z_)&C|Gtvix5Mk& zasS!bu@mq9r7w(~+auE=fAG;0vk&&(_R1^kre~z(#HKFxzH8IX((~TZ!|mha;|HI8 z^k7)t*@^Gf@1AWxJ9h6qXKT;iGB*3*gVmq!{rls!bN~G_nL;Tsa9YAdQ92DIHK-fc4di^2%wDKTJ$XNP)t-9l zW=Of5*aY@KoQ&K~idmm$GOyIj+r;x;ybH&^QD#DjO{Ue1-9N4$B|E+}iq=rriZ7GI zCU*X9!(7i;U3FEK<0Ou&j2t`vlK%3gZTj)IzIAl;o4)DfNtq|42lnoLYa48$(0;98 zlhw3cm@BjwA8YLT+1hX@H3c_-(kZ3Ca?F7dn3EleC6FVIV?<;kHu>`2Y<^=Fo7qGf zx|2237&EPW)t@C_vOApImC9qzEtTQw&LNEt?WJ=84`bf%FF*llR?skOe0~t$465$D zbyv@>9paXTcXdNot0(rcb1?C!-MR?dIhaco0O|6OcS!PiQ8JIwi*{lBN;0nzj}h<` zQpU4%Ka#k~JV&Sl>p-f}PRXyTJx?Pf$B}r<0qwE#Amuor%!^b#PvZgvWm%s9f*jvp z-%-}Sx11O7eVGf0y)g&zb=5oZB+t$xOkGLK<_`vV>K7$>#c+0C>}TC*aB{yKYbh-v z^^lyymwa+AIj)=s?rS8B^Jd}O(|CJcq*~Y5*!2S*M zDUo|aL|WX<7q4xby(^b_dzik6w#&os3(vYiHb$X$;m*w4)`rp~nshyNB52W*=Fp(0E!|LDIz&k|S&nNvC=2+se z_t*4vU*FHxN?K_-3%+VFecSyiuGOIU46HOABX)E&n3U9wm94Q!rt_Rlt{$8?`=o^7r-0HoHcUZxqa==QIYtCG5162FdX*b-Ou7ov#gm z+j=s5zr7X)udXjm95OLJ1$+o!PThVU10#?D1W-?udSzifv59hRkjm2a#8Xef7VjPv z7xm=VFi;5prJVoik5Etk1V^&-3F|hocN}tgoZ93mc%`ml#wYG?P)|^iQK{8&#KnVX zG;uuJ%K1L(iKK0?JSQBsOcI+2@vHw@x`!A=vZJxii!ZTBO?gsJ=5&&4C`nA+Rn-&N zB&{c~3B=mukLosQY`X?=ry*G~n>9>rb0f5T?MK&j6uqv!xibmmguqp|u1nE|%d&MHXXTyam9rEjN8grS zgKri!vsnjj$#L7yFF0*nkFmED2xV?PVS_v?9e4TkM zQs&O(N$#B+!b^B%xSR;?wl_gG<)E9O=cOES=NDpS=IywM9p>fOgy53Tm*<^J^0nKz z<~{Vhd^rwYy?ws&iA7dx7jORVs}8UB49Qc*We;ngdM%qHSBbsX>E;sIkdZP>rUhwE zPb2G&uKSkp-~r+?scTD`cO;YUy}XudJ4K6g_uU`cr`?Teto|3AK4xy*c_aM=;=C3t zy&u){vm2H4FiX{wW>O1w&kmPm!%P>{l7-pkS$>&DFwPDsuBYwSC$gj0JHvVe^5k5~ zzcs%A39EU;=4Wyt++fAH{vh84#n!7s`2CI7w)j2UU$y+QA*sJH$Lh~#kFb39_5HTz z_MY=Ce?F#?011!)36KB@kN^pg011!)36KB@kN^pg010e4f%pac0MAQar!IH;G@mZT z$c4`lCvNbw%k49_j!9tWlP;Tgxx|KNz&2YJ&fMkp%~_fkzV7UvL}!b9IrWo#{^a9Y za{2%MaXl>Vyl<;ZS|UO6qF>fAF^IV(jb5{Z<3RlSJL=@P{`UFtYd)}}JK!^Rf4VWM z#cMpwX6Ij{Iu2#W$F6_VA$6z<3AjnXyyhe8SM0+255Xfe5V+zm8UpZ|^iN{NzqG7) zQDAp9OCNwKOAxs7^GFC5CN6!EIk&b&V;-~c5OXn&8PnKh^Uv*B_ci5Dk9Vk^S}afb zACvNA<5Zf;zGzWn8*6ZjBGNoS)J83`$&S8A(j`U3>0YZl`z4*Cl{>x7EEsdQNVTyV z#%t1Z;c?frdqd_G&bzuswBdNJd)xlm;u;DEy?9bR)}+47ttTw>Y#_H}+@@Z5j^f0; zzqu%ltwE!|IoBFPut>bdU0%)Ey-y~k*C~V;?lAtu9{u=RT7vp@nOQnhJteOD*6-QK zW36ACjXy&9T=Ov}(qIf%{uau#jWX713sbi$MsL-LT5z7y9-MTIt-aJCk<3j(%WQqU z#xpE)EJ^Z>&5-_nmbxUddGfgF{p)y%`mnGx@xrKO?2;VU?z2vdG@rLIwCZ2QBAUA! z)%NMN=r;G0^t(M{_dK$?{Wtm!r5dm9ym`!ZWZ0d?pDd-F$-Ma09V`dAF2i^3Rx45`q&vwzIOoL@SV6q$k{VGJb##S% zt4`Kpii*N_D2pnu`!SSkb@c?xE%jtJ@vzc`QSmCNpqiLfW?eZOIx=1CKK``>XuG7# zT-h$jBtOwMAM03!yFU$A*7ciSl490&O_lnW%(JQlIqRHEPnAZLcL)*9@pC!y?z`d# zRH-Cuue7gN5CP)}fsYIwz-THAz*J31a~`d&-ZF%p}2dTQ!SwPM!Mb~UsAm8sI{ z=( zIRWf#Hgs|4e=`4{C`)BW~)^(!5bHd%>KbNbFJu#U*e4@j_6 znr{d$)`+$1k;wWZ!_CK=3t?T8NeLaQ+VxH564vZ%)(^*L(MyOK=!zFX>R*wkKuUsYp>1mmwtTL_Ut=;^5*Kv)o8UBtDY#V z5vX7jSJ6-qfS>;3Tj`1g`zark)5l-4qfa0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*Sc*U>)BKyhue3d0 zDlg-=hQJ;*&jjIX{@vD`nP(w^JQKKl-ufqNDT`i9X69Wjfq46`uQn_5Z4rUU-+$?6 z;$+23XU9DqC(v{ytkibxxV}`61W14cNWet`3qB{l{aamBlRA+A36MY&0lTb5V@$*w zzeXJNlK=^j011#ljtR&besfaP@9@u+(0!kor{eZ+nHRy}RueFCLc0-<$ODPPZOaH4 zIkVk}M}#&>IJ9)@HN8P$f6`K8$jOaSUb^smqRVSmwa!M%^)9jk21D+eY!cm9(xX2lsqI6S;0TOVOz!jUjKI2NI=E&HU2r-=mNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNWggl9q+qj728(YQ?HbP>5CG${8NiYuO+hKi#luBjd_ z={u~AdvUU2BMtgVfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCP$4ptrT_Gp>YHuatr5B(N0( zI$OIw<4Q&3l*p9`F`WcRfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LpydR-c=J`zOPpe<_$9J4 zngm)#U@Pj$Qj-#wifJKVK9)9J zJuBuU0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}fz=Y|eE({5Zhbzz^`~^=jQ*o7SHoYc24<~0pq_YZ{Tat= z-GTW@fCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1V|tU1o|9a|70b6dZi3Z zCxHzjPm{$deIp_C~`F_KaY=Dje!EkLr(ds(Qzs|2F&b5*m|=oKPU@oGr< z&sI}*m-7_QCXsfT_j0;P9g)8RO78o3&l)A!7Q;T}@5y618tX^mH+d`ubtVB4AOR8} z0TLhq5+DH*AOR8}0TLhq5+H$B1AzzfQb<3xn!d+AbM)GENy2y>TpEI>NRNe8-|wPi zxsY+4sJX{Fe)zafUZ21%m_&v6g>@9lD&^$$LoUixh@Vd`NK?rL1akE5H!SM=_xVQo z)A)t|St!yr^aU~t#igNsLP;|j6q>&;6s7F@LZbDfCaQ=};mU0-(ICMMG` zOpK6)r_}^fO!4NQbbeP>VrSjV24a9FC1H&~EE4pXuBL>X2fX{7FF@Kv*|tkJXp6SX zOs95gjBm)2PjC5s`O!OVyOf%-Iwx({-zqifw-;&(UEh!7$0n(!Mg>xJ(2)dkX&k6F zZ2X3+ceKa3(RwwC_Wi%B$>lME67{GQq?7DaVSMKC@yDS2AcQVk=8*HJX$V;-boU z9PX~zxMFPj-jSnnq*ukM#!pnQ3Dtm+$ZM3}ouhKBplaWbuaLpr)`s>EZy{GRl@=}B_ zieM9|D8{P%^glf?d*aOh{DZMO#_k>KJdmSn`jv>6FIy>xE9tf8o`1ecm%Al|ZbV1d zs#sN<(()a6LtfOc)tYS*!X~k`iBf~H)_Ez%%6dlMuyP(Za?H1hGJ9*WnpU`(FPQZG zOkN7K&?c%@tTCx|OT54CbKjF*@J8rFlscrs``{c_)o3T&hO1;r&9n6N=SO>!-Gty) z1<$z#CkJ;1YR8?*?1bBspK`3EY2Q~@%HeAIQ%}{(qFb$o|DShN%S+KKdh@01<-$I- z+A9ZCn^rH1O=_bfF6gu|I`sYg#vEtskMd+zPhRYRO}760n|H?YuWa72H}}XeL|KLj z+qSDVI=Z=M+sdOK%T3!=iowMTbVkQ^^sq@N32=)e<=m`EgL#Vv&r<5QBzsaL>`}Tn z=3q&jB*67goHPrSa*Y7jKXJ_>(5L)U4l1=emF!cm)n(0BuHKKku5b2`%L|m(bjcgz zF(h80Ag(~qAH^EwdtJ9ls-N(;Vp11QAXmrO`npi#iORn}S478sF)Sc|^F=DsLyN@E z&zGBU`R8(@Dik$y$~HD*!CZ6^e0}*DFD&og?O(#(K3ge*2^N&0*ZF7MdY;Z^Uf6ae z+vZ2+IUKzyH`+H>3=a*N{pW|$#}`SW{W&Skgs*&mqM_}=v*7Fwr2~C`oRe~_Ld_h# z`xWjD>``qRYK~q-S@V*m?}M&u>PyFtdDo>l#=QvsGC{(eBx70T!g=z+#peywr+yoJ1C48|CKOK53}J3v<{#8-)&W5OHQMKJUKhhw@T_?h3|qsc)UH zuG~9{ZID_N$)7zIL-X`@XTodrclNn*K6b`D; z3}x~8cgx!KGGz7Sl|S!1d*AhA^?AyH@5{Gv{I8Tsrw>;?dD!)GtU*8L=V@g&`HdG( zoV~sM%xAN*!6xE`O~TXF@RP@~`24$h_%?d&{)F?B&-B;StDuk1!>{W8bcD8y41P7( zr2HE9t&-S8+tJ#vO5r6B&sMUw>zQX@kyn9D)HmnlXLqRD{Rni;E`i~Va9c0)8lx}_ z)R6d#A)Tk)FNeLpQtwpe_IdLbtxfQ>7$&igh}|#Bsx*vVT2(d&GR+>l>v?5oFfOJ{ zG`(1CKI5Y6@}jr3NoV7A*TTnZtF)2Rv0Ni zn3tlYHfbDdm)K-dUTINCfCNZ@1X@cVy1upNzofIHLvQR>F6kKDi3HX_pf5MiR!}ID z77VVva&3l^&j)*g!` zxp9*VI_9lbBEGUL`|GfSQdEf#E|Q74R=HVBz82)zk4uC}QQOYW7wguls+ z%4oaHG%SLKY{)7dqpBGAW}+gsTqw{HTf7`>Vio&VO_M1b1XyBA1u7^~!-c~2=3?!p z#0;>CH3uq;xPkn^Ea>f3PvbW~Br(t8eVcRI$MZFk3t#!OqGcP;z!LrPq37|(5X6^< zZJQ=Z1(5PT<)sjwQte*9nn5rBkRNFD>BH@ZeW@-VKZQjCI$2)nI>rtd6u}t)^=CPG7na zF_0R@_Y;TJ&P`QeOAp@nwk(OtZcJE~ZNTDGaeY^*`0Lo`z=GCPxM;ZNFYujoQU<^p&-E3OwJmR3oo$MyWK zQBg;vw=0bmH=uVc2`bRxZlm`lhI73ztJ1IR{Ch?}rR`e_R3jag&ci}SlqvN~5l8T} z`1(Sve^P#ORi0vu8W|?|Gp2+`S*Z>CDKvyQe-l zhI(>z;KA904~~7#`Sp%g&$;g%tIyk-oKySumDG;*?GL?h_|$>Z`{DyXIyO7@hW)o4 znfl;4X}j)taCYqWv9FwLjdq)H*1q=5IO;|o6Sp8zmt*VdNFE0tz+d&HbI(6-&oiiw z2g&1>jXZ4&kJUHR!joU>sjbeLO{z*yU+RGz-A}sBTuNq>Tq?i3(%-#&a_durN%`66 zQ{rOH-|1j7o(X2OZm`MpK6Op&72Plm`X)B)P@8ukxswl6HLQBkt^n(u?DQgaI9(4# z)<4;a#WoIa-s!jc$X(8lO}$eYu}P1(vi`|C)x>My?!e%c+l3a^MS0D&2yZpH%{yNn z)}2dAU$b%&Yd1alj8f&NYTmH}Y7}W<8(ws6>)$*^TYcodJd78%P(J_p#40}4IvZ5w z^6c!KP4re{+tl+#*KX?JH}K%rCNE+=K(R?RwaJLrW=z{&Z8q>ktv}TFw_b(SX;7=( zfB!SJ8t&Jz{v2#lZ@X06US(EyjC|zkL|g2J__5XFWAnAK4;LGs)TbG;_^|y*^OOAf z2gqO8nQP&3E%3ZpwvDo%f!_og5g{rj-JQGIH6KAGmg(37@NOX`We z{4icJIe!VApLJj7P_Ix8f&yI#!yM7s9M~klt$NzEH)@+yt7>TE{$!{zCExzuD;&~) z(Y9+J`V;8bkd|BvXV+iaFKNt{FHlu+={~-Z``j;OUt75ED%DjVqaFBi87vRDd@+lE zUuo*T!U2~w1)7UJSJKw| z()o$4SA-hW3D72W6wY{P6K70OSA;f6Q1mX^uhubbt!L5eSJ4IWQCVi*Zl)VL+`&AWZZG6pB z`+TDss3bEbEqRI}oiFC2Byoe9GJmef(uX;;Zp$_`e=1qsCUK%US}v^y-7dviwDbPY zwd8JH-nik^nN0?h$jOGJLU?a~vn$0Y31P2YCvN%*9&f5_M-DfWEPbB)o-958uIJ3V z-^aBwxO@uXTG^90Ds$7I%F^p@1z%BJWFBOeKZouQ=1^y-jO#F4ffDU?J`1s^*1l># zzGy-VBinGpv53sIUhyKSg^KDtl9S@h-4iZiGo6z{tV&H2I&>eOYHU`ed7(yaHR+BxsJnXhTt&fEykIew&lWI zBHsPR^{nt`=>>2*t1cBn$i@I{#KoU4n>u-=5t8ezNdsRz?yDg)q)PUYaQ`B`jLn_H zP2|!z$fOklMVLVtKP+?QY$J8vuD_V38+fw|U@Ca=|>sk=~;YmBj$KAaAc%7=<||5~oE=@nk8c?iml&H;hYi zVZ^yL1jHuEkKeQHm$9fN77Jv?aneu?V_`=4f&jxK?I&<-rowDo{E3+f;5GR3#X3?W zH2$n4)gx3BYSN!j6IhGRgxJ{JS)RPR<#P^|V8TEd(@}4iVim(A!5_4ncm}>6R27*T z6dT0*xCrp!%Cys6o~rCZLP4bOKR8qnS-cmZWoz5506%}<4w^SMtP!tqEgYI@_zeEA z=|+|?K(A9A`A%1gG6PdYxXA5Sf!`emJ*WrKF#abu9#P^z*&vAf{m5^}ZAqXG*-618 z7`##>ai-39r&Nda?MLE%jb=&3XqF=>G^j( zXV&|*cNkI|Cc6fs-GNZHbpx)J*o<|6TN5lVyC;Yr31S^YPe=kRl%?n2?YhU6G9)AD zG#VtV##oYpc3z08pkXUx>Ma-WgMQ_T3N~^T+^wPuSf?hMYuj8Y&!y|({n@4OyTN;g zrCVb;WH+9jNEMOR3I=-y58VQNgnGg-59AVmV&={(;fF# z)ClG=`W09tEXAlh^~zBi=)Vvi3;qxPZ$`{OSIPX|-$dUXe%FP!yHbwz>(RM){m0mt zBYdsg`L3u^J$lnkFOH3!J8=2wQt9-uO4qTTQYpT*Qmud6qwnC@uU~WG;LYt{J9GZx zZQn9AJ3Bb`-QWAscWjInE*!<3K3;56tyI+rmR}q@cm21W_QfWLj-4u%Ms`%t?EK1^sf$Oy<%!wZ{rBGfqyP9|mY#pN@0Z*uL-K?d*TQ$J;cZK+)t@HC zxCXWlUPkxUPIlolIYp7Ko$iz*u?h4s9k@eZMkduX25rZZL%Nxw*~BwaGB;#YR>u-C zcDv+8F0pi)I;~XOUC*Dab=9u{(u5p4UEk%7@`+9MsQB*XbSmM#MQb&UIx?eXkkhj^ zDNx&`oSEz2xZWb}6c1hXZdpM?s7%<+UV$BC3j2VHuYu9j%!mO zU6q^2uf9~P?VY=iio3GOjj3BzSP4P9QjYcOQT}i1KgPx!p>7i#?&ex-4?2h`alU$~ z$tK~EG|4*HOlF>80lu+5~FHvFIME>1jOA*WxdR^gWfAa@cP@B6_4z zo}cKHlW!E-E?jvff|TNjyZuSpQ`omw;4eK#a=jZTZkNQ__$tg%Mc+~s>6><{B=sMD zlUBxtCa^X5hdQB^zR;ATP=V;9P8BDvYcuD=^LWI@>QJOSqo(1vw~snf6R0~O{^ag4 zH}_f4e+6;pdDjYxF48v10zpZ%$vi6@Bp=CrUv*7SJzpWy6ahOxA|>D1M>~cwkYU)N zQFV$Vz3bzxC#S)9K7};f$ruJeh0Ykw2N-Xp$Rujp=fz z8@`@Ed{RdWR8h)*E2VNq;<_etzND`}eTaN7maAV_Cs5}lCnD92;WXN=={HHZ7~(zZ zR5==c?K)9RJ|khotL+vOe#Ih@in}k!b4R;Fe7;cqiE?HPw{TxhFmo~LMjh$$)pQgd z#jMA)Gx1>|u~T8B?9Tc`1sH>z#&%&S8J5xapDjV0T{1u?jtZZxwmm$l^<QO z^_IcEq%rF?B_HGUVmFlB2rbHPU3aZiq^wVA$Yhf&~3;>f0 zttjXzsS5$ZBcb|qT&O-i`s=*dMBDMFMxB~~Ny3l8JTl)GV~ZXt^#}f;`rNv_lxJx@ zqn}-#Kh^WEOW}ofsQAJM2EKNz^yXf-v|X1r_pfX3E!j3oF!%If*d#dd;nLUM()}@K=4@;s5@%0!@nQ`lTC?>xoK^ExrC9N7 zQqD~uztj)y;>8#5LOpTmdwol(`l^X9UOlP5y>s4%n8zr0j6;~eIB8uKZ5O2xzq45L z8P$xGD-U9CNN{f$#YWa_@gGp;8qxcm>LE;TEYx%1+w)+LMjc}Wwk5M>rjz*E{pE7Q ze8(g*$J_G1$dB?fR@E5W)Fw8J{v9^C`Q|iG0H^Qj+!R8~(=GWlK_!Guu)Jv`Z5X6> zTRAtg%@U1Q*p9D|?o4vY+N1-s9K|Mh_=SNHRyi&8#2Ga=K#@0pcmoc?Ly$nh2}EB0 z3pkViA~cl1SKB|{5OmnvwzzK6?PGW(g##$gCHv%d+d1f_>e3!HvbTPG*A6QSBnofG zvH@6O0OMFB32t$u_a9v=ORS7lX@2`;!%|<81Ye!kHeb4F3N$9<&)?z3d&Z{A+2#A} zrmXn`z6y=Is;kJR@5va4Ut{{sM zJ?nRm!;W@^qU5@y{PlJ1zO_3ihQboSIBlpkw)hJ}SWEnck-i~UivrSh$^4k;YX#xt z8_#h)OPW#-=h*YQ|I$k37q(EDHqxIURi|NXb7E_&h(yZOmljXIY$zl^0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0*(^!zPDA1*{6zLpi40{sJnRfE)jU}o5YKYwHq44ha`VJ z9qXXjaDko+cV9$_S|WSwS^bX3wXBF`T^qAUY3m|Bb%(QXC?3R%Ytr<(YcmyM<2~$j zG4vAJnR>jnQ)ZtxQLMW4Dq>55;8j-n4Fv-~*muAeT)Acis>Wv;_4HB;* zuk%^UKjpNF#%h<@N7r?o^9AX6ueq3dro4K(otV$K2+*XT09Hwp587HWb{nSy@6tTd zwBaLog^`Z8w6G{~^SM1NAnzSQ+_oe>PV0wP^`tAAceUH40z}%&;;bG?un6-078fFx z^H&9}FW_TY2{Rrx^t-7hMLA)>8Qgs}<4+(`tPscN)dZ@-@Q|6D#&RdYk--?*5d*o9 zOzUrlSK2OIc;Pa-Fw%8bi;7|z&WjEltnur|{{U4WFsfqdrH5bXZuQg z6b!;|Wx8G3Igueh##a6cBi{QQC<=b}8r1qKZUp3;I1Zjhdl@3zK?W z@5i?vb&PEGNeuEs;yAW$Q8umoj)ZR^j!c?vxjFHt2UHl}6iWq=6dyN|M*?lMH>G`a z;c+w`cSwts+{qYZnUezbCMeW5%@wRQz9;00wxW)zo?%p#VbBdxZv=9vc3YLOsz#|I z5gLDKN#`v4p$z-7322je7=q!#mG^+rXs1^PsvWyyxP+f!japPsOGLvrO8j_laGMNdv7b z%SN90+6OlBXlpxGVv~!{{`PEq{oCF)JA3bmgE!oJ@?dZ0gFE(g9eeiNy*G?q|06Hn zeD2Y+$H#_mK5(u!Hg^1T=cZ2m)l@iq#pJk=8luE8s<&-V6?9XR(E*yN@MU%72+CVMkmplUA*Hx<3zWP8(#nWUa51LTOch2s zrOU`&T=DK~ec5iiEwRarRps-kO<(~0(-LQDwMn_Bv=U=mY@1xEZ9!YO2`9xSqqS11 zLsn00FjmvJPQF`ePON5T;y7u})R(f{=}v`my2e{q9J`*0I#lg`T69R)F*z*joOlt| zIl;Ona3#FcQ`X&&bxsaz72SyJ0bVWonX3b}Lyl1l>H7CAEQjqPqQOafJ^oH*c3um% zk!qKCU&45}wFB;J5QaOxU()Y9KfWK~o^<__VR5gAty)-)4LQM-k=1D zKJdvEaBMf&T7etI^|}#@fe=+V>Bcya){0)_^g9u!#XPtlfrQ>rQag+ds^J)}LERBo zo+uYf`dlo|G%OG&HNw`HR7a^rFjA=AYa?R24OD?Bku5(+& z+d3q9QC%=%(qLN@DSytnlEjHdsne)l^0|7%h#er~_>%|Q5==}fvALJt-*K=ARTZN@ ziDjD#z&A+Tp9GTFssv1dY|`1@P*x|rL7b_9p5Dj+di+gDTof94AZhGyRAsD13?eYv z8{6VY=MT79mMF&0zfJqnuNaf+Xrka-m5S5Qj8u-Gy*n`S%B4VZMXSH

zXH_@yRb zm_2;WV$z@i|0}E?l|v$v1}sf2gwy+PTrNiPd6lFSA4UrmC1X_*m4j|HXTBO7LiDi9 zrC76W=hwW)7VU5f=ZWXeL$sV)er%`7+7W&`kkqRFUL2TrCW2a;AD+^=OdT#Q$`u zbb3dnI*J*L6VTb~JoA~(CvO|r{#*B){Yd4uBDG!7M_skaU%@6Ls3)0C{suM~39DD* zX>ekb(?8SsV^;^2503rTK6R{8pth^;Syye6jVE5HUoxiEQ(t|lRxAG`#v3oplIxhh zr`%OPVZTtnEdHg;CN(9ay$d7de{i=b8T|Oj^ZT5nzR@-(N(hJnfm;Yq(^0q#9b{012^t$ZKIjhdhqDmz;vGeQ}P0wFs z=Sf#}Zm1_##WuV?QG<4ZaH?{fb$|Zni&jt6e{|I*ww@$ymsJscJMQWS7pR-sWI;S5 zNPq;2OrWn2*DI#TCUT~1N&h`hokb((0gk<*yu$ziQ&SP?YGFj?nd=~ z(H-65CRL1S3dc<$C!7SRk&2O=aR9B8QmD81gv5F+y zSSkEZr0$VmI(j&9nk|&%&gs^>(H+I(IaLhoAgxsrm2A~K@$d}^M8z`Op-|HG$1WBp zwn||EnzSlp#%a{mRt(8l&(oNiXMdl|W1oe%H3vLWYwD)4ehEXwHu%H4ucAnA@=XRu zij(~0Ws6bsR+gy*CdpC2ijozKE(wqT36KB@kN^pg011!)36KB@kN^pg00|U;z}w#8 zN+C)yH1U*IIt&jU^p;O{N^>`90Tk^>Mjnv`N&`b?tod z8T_-?TlMJJ#;@Ld^&K7d^!~6z${mtH5MB(8&{I_LMa~A@tUpL1kOMw!JvF0(9#y0d zd!U4!Z%vBX`fbV^t(N%kh3%w5gz+u}#Uk<@VTkXiRR&f;mb9KoN>QZGo$*~_gTyfQ zI}vf9OhP%q4l53My|v6T<c6@yrj;&~fmtT7oiNbDH^D?hpN@)@nnr4l#@`G!Moq@>7DzhX zx*g8it0+zwSK*2QY%dcigqq|6nk{q4G{xmV(0jtEG6-IcB~Rc^CW@hQpk30of@lP+ zjS@2! zxI2{fn+ha-&a9a!Rl(K+xxhk=(AUcYU>{4yr>)n7O~raG$mNv}H-GZcwM!3}S zq*?1YlEfrUnlr^%zarlL^&ewnj!?mqM@VIRFs&}AQXn%>b}h1ohVgo& zaxLae3%nsL&Tq(3HsBzW@ikK_uBd5cK7rem3z4s})`p)}hPe~iiW9~`RieV!LqA`z z7OZRgTxnbD^ZS*?Iwt;3Uv+iwRJ-wbr9W0)`vR@dR*7A-DruWmFpJ>1@TV4(xkV9C zZyez|YX7ZjWJI?I9X(aKZ{N03`e>h|dH z6W>1dWLSN2MqkuncqE(G*nrfZ+SguDL3inVjITkX?ZU(RLiH!TZ*M4VOT8~VclPD| zKioC;^35;QZaDVT-yL}Q`aABq=UebS=Vm!onmT>>y6VW8(g*IlwQ_W{vwfmqHt~M4 zxx}pt&3^vu%RLY5ADjL57itfT)joG-_RPQ?cYN=j`5Hz3)K_*~7mXb2{J?#qr7qZ{ zX!WG?(EKvDDvY%N_HMJ?2fp9D?Tvfkjg#JdDUFivJYT$6TjD$2OYP@+eDq&j(J-?~ zq^{h%7d9Cb#U`&=M!lliME&YAh2GMn*<*J-zb#N0+a#>_;5ck>uOZv_e+`}IUkS|j0 z*1c0bWXHM8%a-F{`JX$ad~Gj&A+b_-+g3?SFCR@W)UOhTp|;N+L;F_iFaL63o;=5N zo_0w4n%E-7&=ql~S5QnI(I=1Ti)NF^nX#!pzQOf;Et1EJQcs5QkWmGDB-kv0s)VW^ z%WhzkNLN>Lj=YCFXKaGbybHFNMvG-;Ycj+M*cXvtCXJk&ob0!DDVj~XoS743+aWLT zOEH+^0<3fkJaBzDBK7zfIVC+tq_~IS@zCoRM}EPTqU=c&2_M&qC!5zeUJqyS$>lNf z!8l4GpMm4ddmzziebV)U@*_BQj5IzQZ$Y!l70S(@_aAdn4_a#2<3;N{JTto65) zp!E`wtc4M~#$k?2gUdBYp-j?gpD;OQ6P@Z~Qa1~y!Nr{E#UgVWSAM%|it9#&3p3MJe)}0? zjcTGM@COSi)h^Wm5=&ialu#P50<~Sy-HoMl!fz~jGvUMaMI%f&!OSfY37rp<$qgF* zabyW3vQSd~ZRd(JgWr6teoFL;V#{1QlUU#zYk*{zZeqz568+O{lcW0 zmbx;DnxREK-#5yH#`rQ9UWMV5kvt+k>WoGxS)Rs5<$u%F?@$@U5GwML+mH#re@N-6 zp`Q+dI8Ky2F9tgwqZX+MEt{{lp%)3lj?koCO_D9|TZiTZ0qmS;g)7}%uny*-_;`KQ zp-jK>U^Ig~p7bcFJ0DR`z!Zyh$Rk|z+w~s`-?+C7X^VP@v;6o$I!&N{JE(EUkN;(+Or4iVx zF!CGjlq7At?u&zgq2P&m57T_sTWb+;B~KN9Pr@S08xr#Lb^S zd8X9)>&LD;bgXpd4O0W{H(dAR?CinH!8?B0opP*KlfKFI9%1A5Pi)eD=5*)4tv5U| z@aWiyJ8td!^WKBkmdaOlZlAsBhOyzB|MKJ+Kls|Q>yBERRIa??o4-E$;=u>cKKS&; z>Cx&V^(G)%t;W3bZ|jdRX)aP@kqqsjR5Hfxg`>xsGdxb)5Ex=qr0^1r@(^B;xys>CzT)G^1_ zH2v5PBCesH)N>TT<9*DXLey7NR9F_ z&O1Qai*BfbPpy!foPd6qA|BG{)xM@8q?xMT}J&F626t_lvn~*@wWxT$3jWRy25_C<=l zEI@ogr0;*aRuCB+6dGu?6Qi}Y3S%{;{Q+sbe1%D-$;?ID@vBJVJ9n5CgrP0SRv0P2 z&%vS?(W#{UpHk;bKLq@3-UTs*jh40x#<3zZOtEZWMftkFKy6p=pQPn;&hdh9w@g;_ zG7A{I^v(Q@{fDRa!*0^$6hyk*`36o#)UNX9t09@#DftB8fV)H6$4lqoNtLnhNO!1srxw=AAw7*o^(WCq;r^0tlp<>7kU<4%6`k~uCSQ(qTe$=bk-$*9Wr+9Fxm?deC;YtFw>x_8x2Zum0eXv8iCRQt9a|?eN7W zDjXTEcq22g$q4Gn8~$+Y#692t*%uru#yZsLb7ozK`GrVc_hNqB=&>c{$RuM~pL?#N zYqbUMR^}frN8wKA);$_d=QCzgOJ|QAJCKeHo;RN%v5AZ(hE0+&_BkTIw5pw-T{^8b zDe~gIQLIfyWZlO3b4(g-(zr+N{om|b2{M~>m2qDPnQOZiw~1}L7M+XgTFF+ck5lW; zWlG!Y4w=u0h#@@ol6i|51Yzen!cEs_tad+=#_vz&H%h1o();_al>+ka>bFSC_99xt@7O=4jo2e`1qCmCk~nPIQ@_owG@~ zTqK+HJ>Lr2t2?JyL?o*x&3jp!bb4JH^#nGNuY43lyx(-SAo$t}1mEvS>j_${Nzqm7 z>FJX0S95LGm3xb26Zb4qilGxa^~{y0!1j5(xQob2>5J^*cvSWT!yPp-Kha9&?pZ;# zmC{$(-NEFtbJxNalBuJ@Yx#y7`?wx2o-AY}P#o#{QVz-z*L9rp)uW2%iFV|+OujO? z)qPpTySvqwC(g-#SG+Eip-;BscDjA``ZjyB2HAn?HYa zi+egpqLQrE&Kt3=jw?; zcpiS)0XYgJ6Hb-|?Uo2e)yK)8E~zo8M6f_??-VDb5+T&1j65zbig@pFt|Z24gm%kR z;4^B_i^i4FHa6SXs*>4B`_tj6ETsT$^zH5yV*8ZTgdtH($G)BvPi)6^r?nw#yo{t2 zPkJA8vP@{Sq=WZh9E`0;pC^r(v{wdySVSlm2Z6+m)F}xTMf#lU<1Ja#6O4JR_^^se zW-uluX~OOuvO(LmG$rIb;63VE0YZhg3l{i3tgsQQct#s<`?xxqke8lZ<^{`C;5osx z?IUxc-22LhohyRTww1EYl*YJiE$!B{p3_q%4K+xlcbiblyZeGj-|xCskVjOvx^Ym} zDecBMh*)X#^r#ixOX=wcG6>)ImP*fGeDsiOI{TPY8pj%6)()#)TL+pd)Dyj&mL?9Q zMJtTB^nKw3s_i(u4n3}R?tFi^OHXc-6=ZEowm9`|3VD;}Zt)Cxi|zV(*EEhUV18-n zoyXL888SR6`gsAazLpSML3*_0E{Z(hTtT`uzT^>0VKF^?DC~ z3H#3;ziI5=v4bbaIuDMWeB*5+r%R>N$0};caRd80KXB~uK=tZNIF+NjbmG0LTQd8u zfw8f%druy?rg!XnzWsYg_LWNa-5SPAu8;RvsWft|(p?~%c=x$w5oi;tt}oY=#tg++ zshd~Pw${GrTp8A-Q19EBRH0dpQCFsI(l<$I#p^l zyjPRQwK6WNk8|_N`_XpYjPdmNLc}SV@3XA-HgPq1Rz8YDIc{)B7pscQW5oQ#!!mzS z<|)FJYr~}hu7NV%S)?d>xr9V(U(?wxsX9VR9T@KIfY9k8As$ zSJquLxZLX4V-@tbXL=&uJ~xFsnZ*^$^}faN@|gMh$pptl{LE7**H_!$n4<#Cf87}8 zNcT0U>fZN-SFe0A>xnW~|EtwAXi3hv;jE^?FJ3(_T##UwbKg{346KE3H%QG~co8@v zL-Ljz{w1mT5~rSb#VI?_y0P+aM! znE7C@kY(~ij9I@itQ99pOWsJ^XU9oI?zi4`jus(CH8C)V+>KNeMz7$XT@eLtA|cjg zOaxU0c?u)mlH);ISj0H%G^7#Rl_{c?PQ3;;g1JIenj%W{c^69+W5NmanpWDwAAD*z zZs`MM#492VR{h%^Mq;#ViXpu}n|J6 zXfR1g$yZhCCB;Q@2zFkTu(sx(ly13Ow)|LhIrknIYoyX^ja3R)iWD#Zr ziYC3zy+64ihyi=ow2|%v&6cezb@0=7?b?k`f1u7_tM0DH7snI*uybX>x{Je5%1oB7 zso3v4Tl^-|Q*IUS==iG(QMVb{c_fQ1lH2)9u9e2FyBK2KMSMY`IuI`G@3eYIYuoz| zpsskX>A!w`+*>CIWg3wy;A(YP-=_jJWp?ppxJesUxlgsD=3IYvry7aXo9bgH*3ZI~ zBe=KziN?B%GOGUKRH;|Rw^lU1Jt)@j?FIvhJ#!%p&Bubnj|^18$vv)++&DdYlQD-I zcffTYN!DGAu5wMG&>04CFDxXjE&*hV`98w$r3|^HuiN28g!)#Y=f>8d(a-F?pg+*4IuUDf5w zVa&mYu9ly?|3L4$xLB{^;U&XgW)Y9V@;|tzOlFfy4s@;bSs__t{7E@3!lk7p#E9h? zjXmI+LWi<_7i}1cddF~=!1_hnj}hw~E5A*lYw};XJi)JA_%$~73faDkSkHJf7Bte^ zD{>9cusOa;EM0d+MC%Oz^`muo6qpghH2zrYJ@`srqmztkq!PcE=FX|?t7k*U;gHvQI)Trj!D5kZ<_7@J%Z zlxaWgQjxyBLT!G_Ce4C~XuZ;&^dw$=foqCnbr;!$WNUnzY*K2~T}I%#FpFdTth@f# zplo6)pkP>bhG~P|HUeKzkPwr+Y>4M~N`uVDB2lhzqoUVa9??@?F(_s1fNmHg)Igd- zLs^(6#TjX0I}vJ>8(FYvu`lfgpOGm;_(H+gUDSjo*!AgADI@D@OX3m3F^3j2_p$QJ zTvQ>o3EstbR7)z86(hu!>J%s&_vSeE28UJg4eWJ7J?8v#aNI|erl06OnYm|`|JH34 z2z2`)+wn|LiM|%awVxx9m`L?cq~3r?rT0yHvT5?r5F*Na?i?8^NTQ&O&Mv;2*3sjQ zk_1a3veu*{E4^%9gW}?#CD$ZC3TfCSj1+g;JdI5OwM4EGN{2ea@|2ayNfBZ%p{`Rr zNGA6>q=e~bL7ptsiiD#EMFrRth4wasJtCMv3Na*wS>+fW7DFo8r%=ih8vQ;;6bTob zf+&hf!r#{P3+3Ul!+%kX_T zl;1dLEwmND)Jeuw7M11LmPChPtmOj&bjDO6~Yq+0DzxJ%OhIjFlTdLl|D(GiO#6Vm|@qf^OgMd$iK zqfc={kH|=o^|wwVrO8C&!cNhK(IkCR0`0t_b*C30w>CPi!41VBZJK^$dP1c^J~K8k zqz6QFac%!87G$C69R;)$@R0CS63QvGBU4y0C-4~}>TelBCMX;q73E`@ISniCha-bl zU`|jS1xg3DrtzysI;g-jgnq10iy;WX1-~Z59EwURFC(eMlsYmAzDM+wKXgEu?jN~^ zOt4IPNa#~HG^MCcED=qJDA6WLm6jeA^@B;GGv_fG`954sb@zaY{6HER$PgICf(f+o z1H`QN>>}e*ln8{v@+-qljmT!>?lDucqBIa2c{?FJtz&{=g9yytY2)AB)l^hN!fc~ z2^l=ARZfLuDdQeG6yGJ&avlW9eg~A8GBUtTh7plF#RT=unW(%1*EC~zIG&L*3 z1?$6V7Ijx7uK(27Eh3qgg-8|XLGmC~b+L-ZMeV^WZ!|_4oGP1o=RxjqW^FRJynLdL z^@~xVkdU7oyr^&x`!U{h>2RT9{N%*li?!LkS6=_Av-iH}x?BIXaPW>oT-hHVEW{^X zc;(TVdtdSGvp;d`U%24!n`9Z(5(6V^lL@j3`AKS%yDq{WnNp2Dxmc`V(REb#^4-g| z*{gQW!zMS6-ul~xgHr{0cwAsF&FH2p56#>+bM{NGo&V9 zFxlk8S+NNrRO{&AhCzN8#AF+*QWnj`{Pj3DsTbmd%i# zG#WSD(6R}tHF?<1vUgXN^OCIkvhymwsfF!2MXX<3vX@QM&HWf-mGWu8D@xZnQvcZW znGcEGJF%W|66+hyevY=R569v^4p0kv5GR0-q%ve_3emJv&sd1t#o}eOu94O^B3Tg= z+SmjKm_&rMkE37f8ZUmjQG6f=yXM-g{V56Y`OjxUeE7qS#$%|X=%J7(D|aW>2DMYX zbU7tsDJRk~PM)-~kWHxFpzjkAW#wR#v#sxSt(ZLX z(X}+@OHjIKaGF@G&HCOpKMBP9KHT^)Y|`v~WaVbC^0bXGNiq>b6EvDXBzClA={i@N0#c zyv_W>I3b9BDdT$(4zl0X7rrynvipRnrCQX=m*DSsek&*MvEVhi&_F^;9j>;^s@oGD z#Y3_CrOv7otkrJQW24Vh{t0Kb!&74i+1Xzzecx*z<~s^_lF(0rjyWKm0~t3>#Nc-} z?NXa{A!#mTkBHiaJ*G7Mb$rZAk}rjrj@Ru|VCR>TyPcE0E)--+FjLhw9JG!R93;#* zm&rvcqEbY5l8cS|as0M(YS3?^B>z7k*sN@^5sa++h83Lcc$tTZFv!Prw> zk-rJ5GA1B1EDH@=D8!7%*jfxJIF6>tM$3k8*&fY$F##41smX{)hVBT0)^Xy|?@8iKo!!+1jFKX6WwRY*h&=~j$n zi&CPl(zI$0H5B6X7uecsQKMWSm$DpW`atFEWu80A$Q62@2*-#&22aTFKP}?QM01H2 zGU8KlEs5y87pCD$cf`MNNdo-%93%4tC?zT{%nLTM0e38{Lsa4~)LJ7DL5x>fAbN<@ zVh=?JVP+?5dQt-YV)fC)>D5=ElPwi6MUa+J*bD&86Y3!}e=}?PkG2BknRTC@GA}p~x z4&XMYYI~M+EQ6-J@ro#(q8iOsa7}*xBPU!_VMr`QVows)Vn|jNH9Ptk5A8$~5|oK) zDVPXo>7#5mG+9RO!{B?IQvuJ5sI@e0YDR$&RC&Q^Z2i?HZd|}8Sg_&7TQSYcSgEH(yU*?(~!^2ajN9qqQPZaQtu5fiU zoD#$FbQoVfoYaR$@O+q&tSv`LMK2$JXThtfslvVXWNiM9(<8I*edyX^@!;XYpUyt% z?z@Zor?1{WKX&>2?A1?hetUOp{&gR^;l;Z?_|D^JFR#^uta8gNmgBJWRo8?cyLJ9u zSJ&Tr|Fy+v{Mi0K-StyonH9a;iPxaFq zKX;4HjKy($hm-0k)A6PDKB8fiiE(OHT9hbAn*`!%_dGvrXc1gRIF2oOEfD3X&6ykg6lQiI!rmq9=NLxZa zo~`!aDJHotP2geJ!FOlhwx>t+obhuvbuY-0l_Fc2e%6<#)KM!U_btud&o2-VJRwu^9yq zZIXPdLunThv6-$yBUlrS`_Np_N9~C4HW+@=PPb6v10S$!>)JE&9Z&w!HTh+2#EK;A z!rG*{Zc*IOkTR2ZLQvnV;G<3UXF9qT#sao!>){p@Bt$wUK@oPRiR}jk&W+V)xbDMy zk#;&GtvU9kOr#BE>6Gn3P&|?gCA5{Y*%7u$dbaeC%0K0Y0kF`)N-HW&cbE9X7t)*cmFa)k zj8OKexfSBMm1SsWAdXj~ZE){xhj-D^x44-VCO zzLdbTy-zOD7yPmN`mzVjlx+fN#1&it8)_`HvCY_|Mzc?ieY3&uD3H^{*z=qdTtOmf zrIHjk7BL|X&8mwSa2lj(gJxRM=nwsggQ{pFQ&vYU3XOk;(m+re%elZ$3wh-y<m!?hh!1eU6s99EEk!N6B$EHVMAu*X(1lSHX1_G2P)p_tQNXUGTIrN8jdjY z8a%OtGRC?_kTFx&33*M9Jr@m)m&n7Y0g>sH!N87mo|Lr z7N3aC;qm0Irn1{$ozSR=G`5p9pZ*X#wE7X)X&8$iT2J^{;arC$H~YfCRHLGj%^sKm zegv+vgil9J7|3I}M`O7I;$F4zLX@VBer_I;g{)Hy`Ih$X)NjIPBVYisK|FDq>{OQM z0T2Vr9etrv^J~|xX+)dOb$9@h^nC(a6-3SvVQoAfBSB72QQH8lNp%A!ZObVVjY;Q? z$N=`yFhr;@*B)Oo@ab7GRW~Vi>g`TSwY4Qis^p3rVT&+{3$hXi;mkcFud9pc8EW9+ zH^c5oe!-I5bHP{Gstbg1MVY$E-XJc72eIGjbcDU=P<>VQFTOggz2H6A#Iev^ce+)g zZ0~i;|JU~3Z~b?h3$g28oHY9&wXw1JWBV6oD}}<|U2%EWeP`$AU-!z!eHGZmFF&b1 zw0@Mfx8!tT>BO;`f=gI>$>n47!&lAB9xN0N?uvt5_kDAI{@z;~w^d@_Y=RNh+z^I= zdnlb-+{4c^qnewx5z|ywJCN3j2J1bf>QnNflxYNfkaz9e&F6S3L}xy10xly}dI zM#t~!)YP36)+^Fi)h08EkiL%6#0QT;voB+s&Wd>uCNFkX2|NqJ1g)|9SBZt|C{29G z+}xKjO}nbbM&xq#JtLG^RjM_XC51Bjjhp94rN(LOMN9BXH<%1>4#hXRtBUFnEwf3B zxr!D=BI%n=#G@@89gEc=&qUYr$GE_LjM$UWlA<6wXcPV%$9~dPT_)1HDwD4cbF_V^ zYn5s>rO0r;(er-QH;q^yMqu+1pwGePmHZr83B_gUUexZ|Wk;`Q%Cf@V96va}pF=h9 zm}p3+pOyE!z{te`!xS7td;`{(@!w6AXj-MCF&e zrp@C6Yz>tp=5<`)+ssrfs5#-9O&||FoU0zWv{HfY;d;m@yEmsZtC70V?&Ob}?6hv{ z%<4WdZ)tb-F>N9zo3YmHt`@JE>2c(*oYT$z=v9wghfsI5xaf{y6!P4CfSya_gHfDy zP|g&al0{+O*s7g&2WzAmF~Av^DF!dZ=EO2b^y@ zszYoiKsYMhmWoyU#Fk!u0~f~x37T)JL~FT{B97tH^~iCI^E3+tk3XMv1A+|fl+ybL zcI!26d<0+N)H)*6wVf>#h2a|0Ahfv#o?JR+x~y^G+_006IVURN8^InHXl3NHjzEu% zHbzWM2UAM6aV;~~$MUnC6W^jP0XqINr-pM1hG;exu}xMe(l(wvqHT6$ zQ(&3K&~475&AdEE%D>={^qOSB2kApZR)l`*IMrRkwD$<{eJFFx4wE8W$l_jkPjEC- z%au@Of=JU^XpQaT(HSN(3}cy=b!fu3`N&#!TK>c2HO}eqpulE8O58D`qN&knDiVuR zkzDP00)cCgchH}9PKOH;sC?%IoxTMpC!wNomGN+KVlGs3!qN%j(o_`(an@=O}XjNk!nK@3lw|5gZ0@6~-Se_O*3W?fD znx1eM%2EnshpLP1K{9x&LrR#R{L=L0S_CySXcA-lCfe_$Un7nWc+yylhcxze*ObEk zz4FRh5C^n|RPNj*IekGFf>^oa_}L_BV;^WRVVfb3t5z z)_+)caD7N5zv++`#wOo<&-^!T`0=C9YTWwD*WEY&6DRK~EFVm2f4nP-+nA;V)W`DSKXaeTd}>(j&Sc{z`l+>yW2CKwAo-YHwR zO_n;d{Yib?9aXGN&d%QQ<)J7j199CcTchK>!lUkfLA+D!^G|*G{7>1cGumuo>n>f8 zYv1e9N0)qc6m(#2&T%~Wtb@XrA3oUzza$CUx?e4U zbt~#qthDT)HjPH(NK-7Wo6+vb+Bw}NbCoXdaZOwdV!=;@7@EL7Ckj(irBHZI=@HXZ zbUj=j7^NR`PKzZ0KT$@k35B^5VnV4olk7MoD@t`Ryh*&srFkm`RnwB7k~0RHs;BSDJFOl3v+^6f3*e7oNmqE={rt)jaBE%tX>0 z#4*Y1bY>l!mH%VO;XTemy%xS9`9|s==8<2mRWgr!x5kC3$(GhX5QrN7nxyd_rJ0}z z7?vfe7L%0ngUSb-(}PB?6iF5S1079VnOMsvsgH;V5u0ZU_;E;n(Iq`vptt?*v070J z`nLvQa($Nvtx+&9?BdV5CaF~72$nO(ZNGorBclQ*A})0Yq-VZT`hL>PAqoL=&?8T1 zI4a|tm)nGkRdnZshzJYi z;SOl|b>FLF0a5>qzNK@)ywf!)gCQ)QOT^E&Q?h3evXAF9_66q@j8Dl)>l;S2%1%*9M49HFo^JP_Ozwp&;!Rj}Zfs>( z6jY_{DNu$5IgGli5*DaF>r;aTYqc>swNmx>T@(Dy`|rPdcE4!ud3*4p!ogi}dDp?h z^4stksa@UjF6aenPdu_q>7TlF9CUhDeE-~RsOp&<#wI~|7yRUH@E82=qy-W9SABJ= z$fw3(KG5XbG`>3l4vP2iv-})}4z}@xa4*J7VioW{5o}U)ZvT@&eC07% zgbZLwnZ`oeA+X+|ApiWN_}?^Nk03q-7HnH6P6k(?(S8W*Mp1fS<3+uteGR4?lhF6+MJhI$xF|x_!bvV+X@qevj5GH zNjU{7M3EJ8Bk~s}Mt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7;5P_S2YtTX! z6eI}5f*D1`hu$30L(d7wj6g-~4f)6GPFBdTLEMSk^2B~N6I zR8WwW{`@Ar>#!FJhF)lqDv{joiZ;4e5DAuUgPY#KXYc2!J4SyGNEFb@w*N?bKo|dk z14^LBYrs|r4n=iJ5h=q*q;2XQqAF#mB(N!*o4*wsq~IDF5WIWjeZ`4rIZ9`YL*)AWtfqsjW20 zXV6DzrqL(rv=B;D>7!v7D=OdzjXcj0Jun_wVzT*e)tjgH&O6`5MOt$;H%sCKz%YQlEdI9qp<)7{t}wi51NFA0V&i7 zpTGNJiNF^seRR;8ClUi|UYh zipetb9hS5!@=G`bjbVX=t*w;iQL9Ym@F^win1>d}QF?k&x+{#5;x~p=2^z8BJ=@6_sEj7WHX)G?~D6 zA}XlQ3TVz_;}8~pm;wwOkmli#i&Hi<04Raw?Sj7DX5* zQ5fz;^>rBanM4?B@)6q?MkGKBqlH)y3txzn%19!gF=#zD@BZaOn|G~^U1@H)aCiO6 z`q2~jmy*N#kIi0t{k0Dbk6m%u!9wB0Z0+dmL;?Gsh+x-p5*6ZIBd~_Xje_9kQEBM~ z{l;&d{p{?Qp84Uyw~HH7zt34CKhuY~t*kG=CeuM(+;M-Ya(MjM?ASHeKXk>|73C9! z@WiY;LK7&-&22zV)rIY^%^)db4VIOE15! zi+}QywphcA^Pq}4j`T$DsdG|@9Xq=D$s^)>XG)^u>$lxy@|7MNc)v@C%qFD_SKSXo zJEGNVlPmu6%ik*wl#D(5otHmeao}@PTQ+Ha>A9~>EViHibT`J;&o{oeabRYqo1fow z`9*`5J@XT5lVnw)?m|DTi^c`jUA;EBZ5NDAO!7m zg6EG(QIE+WQI@6IDv8iHlMD%-;sI@V zyU^6{pm(|^O(D|Z?WY!C6N>7~aS-GO>lpZda= zJauiQwWbWF%s_8zUE>)kjcEHYG)%P5 z9ECtR)A>3h=ZK@vtmvh-0pqk(o`W%Zo98a+9?@Fz%8tC%j#RD_V=s1Bd{kJyL^e^P z^La$|7Gn-0u$c&y?%T|(ZSJ+uY^c6hlwI7(u5`|mW6yM60og~w5!22KO<6D z`F&2y2dnxuhvW>%FA@>VBud%F1Zj{xQWnu6>LJ%*h%_S-Bg&*G(+3(^c0&um4WtzU zYQE8kN8*l<7BJ9Udl7lzkl!U}!eo6M=ftwJ(MO3KQ)!oL!tY02L_Sa; zw*b^+k9N{9PlQ=5VmIuIqq5FgX@yLX+a-?>b1^jfks>5Ul{2+Enckb zI2DCzs)BVu3M+s_1&1gTR*N7Wnm|9;OS<0`t(0jVAWdi_8dg)+%q3!6T865N*k)i3 zw>Bk&Iue($2wR$Urk3T!F*)j>8i}T-4|J$bM^Q8(n%+TG8aWdk6gtUDER}82Ebt<} z4^;k)D_YPRQu>G1WGBFX0JArOcn_RHna&mJsYu`uBPk~FcL=M5R1jksghFQ^UDgGD z{;B*A&gekv8X*ime1oI?^i8~1Xn_a9DAs8wt4-R|T1a%3EoEVv%yp1F;EMPww65_= zakN4;R7g@OwEBiB#(iwuh_69H<0CoZI4Z0_TKhy=ctc~q{A9ei44Z^E-TIo(-8y#5EC1<4p)h?ceq=ORE>t2^RH;oCmS6Mo zfBWEzpZ@Lzxu}DMHyYP*LXis>0`-L(^nnj_t_^}upxQE>uxJ$9 zDgF3!zPqpDZu;r2h}Op@tKo{2edMz?`Pz=#Zo3U@Aic9m@`rtN9tf+^$o%B<2J5gqO`s*iCpKVifTcZVq+Xc}tnMMMAsK*O!c{t1=IuD^aAL|(pBNE_+ zi#Ig5_T-Ed8sC0;{ysrrYrP`UhT1|+43u9=Lo#1;Uq-BZG-=B7gT{`#st1jCb&&2z zrIr+LwifNm%W*OkPm->R-(wS31>JPHO24@2m)zb9den}j!0F-P?S*g?@21jgQRtOZ zJ;jyrE}0^10zgbCW0tl78*Mn+ab>dR%(49-+Y>&-2Rb(uJz63aL^cuuckm(%LDJA8 zh9hZG5zUN93m~S!3KSw#)+}*A9_FulL?hP>R2gOOu2LtUl$jKacUjV8sR&k>jFbp7 z1KO|LC5OalNEQktnNdhHr^TF-`@_X9tP$vFr$ae}S_?n^n}IdugqXvH#lQr-g?kvr zfayXd#Lnc&w-0Nvf`9(d*kHXL=n}x4WH}^Q(6*^Svkc57F-?{Jz|)3LUnug1F8QAW zQbnitO?UOf*XdK^gezDbkLjs_mYt$$@)HW>$^ahU4>M7o*%)*f8mH8)=zXQ%|lY6hN4sr-m#cgVc@}7 z@Fzqx*4fe8M~vW;n}FjDUHt3;s)G5Z1giN|1c_nVw((!vJ*hD@sseYhd)Rvv1Iz#XAP6hytGUyn+8M3bmr<0*0a$@c8y~h({J3 zVJVhr%VSMTA0+w!i)N|CwNjirgEhJg*_lq8=BPk|pQA@DzQ zBN2srsgfIN)>UuAQu`Iw94R)Ev9edDOlNpa8H(5vvQ^_dYgL2+b z^3*}8qSJjDO)bl6~*v5LOnn|Hu=^iGe>umFS@SF zVGqD@TEAEk%jpAQ7}1Ha0quQKk)|Qn(R8T6qMQPKnIO_D6B?t!8Vo}c$I&ZC;VQn+ z*pClN6SFU4t$y@iVR>TMU~X&@B7I_7K5`TG0IXDEz3W7{d}6e=Fg-kisgPuo-~6?u z+VpoXWPbAH!t%ivzWYz#I4C`~;J!by1=n2HCC$E!@RNh#axzT&{D!GbMB(79)UyZU z!Y_`-r+1xLUOF*VI~qns>nF>BYL=a73L|H~+6r;iu2u(kl^7Btm!4ueEC`tEa#NCgi5*VAH z^`Cs%5b(|!42kM`p zCs|prKVzA`;bngM^)MWw$HjX2QQPmbWm?DQKDRuQu90ssa~->QV85^Cx-4T8TA5{S zl86sCN@c9iGB%ko=#GmCQGRp{pg&o@q2$$mzsc*@&~(e$*_u+Vu`eT5i)J>laqMZ@ zwODQ~n;d97dczE8%LU%P8w_mTO0(|LglAXX1^rcq!HV^j@}o-`rz3psa~~Z!;MM-| zV=wJcaDa(|!p$*~n1wOPf^_%(jG>|otYf7887Wja2Kctje-RqmmkQRl zKcgnrf}|tXH?GX3q1NbrWh429m+!;a0G}DpiJUxVuFXXM*iaUx$-D<+Z*x)u(+%#C zO!aVD464UGp|YD}-0MR)vmAvU`AYGWqdzX)M=sTem$76P$$#k1cZq03B?Z>bcRW9E zJ@S+4yU$Pctt*WRD66rQxr?fo)4Lr?!>q2dNtJRbh=i;D-X`RFqt!j@ExGmO60OZm z6s8a#viM`daPS5&bv7?WqKKkWIvAE{Mdo4{48xUP(PIv2v)jlb%{Z|_9B>~B>@YC_ zA1r_uPzDW!VO*JvQJ}@8NNQsHL1TaCj2>x=plFz0V=+*z5JigM?xC#huz9drvnA>& znn%XimCi`5&1ecuMa6$1RxzhVcw+0iCA&2#U8jqeo;VQHgjm ze)Ow&q6Mg6V-{Vo{^ zdBo=Xa4db*6)nQ#W^v6C5spWggmTAA#nnPwCqjh@tFfHMwlu&$!WxKOWFgQF{K0f& z9`9(y6^)`Bi?!jDb75^-H!dieL{7orjD48f!Rg@M~ky#4c;u$Z`p*v$M z73|3fifX6!pp}nLiCTm=^07XR7M^mFh>jY69TbLvQs7K>aC4nVu5w8HD1N#W(KAGC z502yzSPfsZGq)r)?6SQnSJd>Rgt$+1sVmB$y+F5CntCb5+6QVsXl7(Wqr_M%kA5$O zEz(FY;Lke>E^0Q9@?>5(iL>UCgCrrqyjM=$8*y%m_|aA%s4D8AV7%!mWR*-Dh|7%L_9t5z!f(o zSA_*RdC|>DBrzdX?f*6Vid|G_S~=`CZR?-8~<={-(>G zJ$vi?{P(=>=uQ7neb=*Rul~&JiLfwtxOQ~M8Sy#W{wtMgUo_{GVPfuO_nZtK2i|N_;PQ*jTK$dHeQ;Usmo+VN-NP5*H4NyS8RfH zjI<{1Fv8tfzer(oUq+-STk9HAi34=L=nG#veo-I0bTx8Cj|-QB_N8=#l8L43upi?t z+L!SPg!n8cOhK@luX0m(gwp6@na>s-M_9u;Muf-wTF)q6=7vQCzO!ja(tBP@_)Kjq zRxBT{ebco;=$PF``PAC@S-%w@N&#>rSZR}kI${!ktN3dt-)&O;AMM%>GEQ|A?k|%h zI*9K$qmr^CkmjS1GL=m2sQd3HUbCK311pnty#^-00B)==y>i!L}VaiupwJz=(%Q zWoEIcZixo=?Xhk_HaR`K$=ADp%Sk$SCmrI2+W209PjU+dA30{m9Kmk$2Zo7Er zb)@`Clz-S2ePm=LiH__Lbw$y5iEI-tnStRsNvw8KlrRTLF^_1>wYm$IQ3l^VbVQYf z1O6hF)?HIbfRs6Aflc^wEdI1Bnn){1NW=8;A|+_SqEJiYdR&BJoEZ2^NeZ1sX(J9H zo2mRqitlwuhft%&Qh``im}4)#_#j!P054h9LA^&zl!>)hw#Za0IW(_cWj=xXrdCY1i`Hp%(+av`x|``kdTiM#Ek>oxmSZKAJtDpY27;GFd#GLMLsA&O>XVaW zmOIak`$ciQLavg+tnm$xBUoS>CR2U!rIILW0*d-WMQ7HSR$@`1HF6mRLQ;ig+IHEe z;XniLDJ6g7iel5S37$@=S96{9Z@(-QtL)TiC+??0~SvvE1_hQblruZ!d8 zY(bicy20X_i7$^`{@Mp+K~5FoV-NO7iG~n6&PKW?BlnENnRzSoOT}v|JC8l;mHcnu*-4Y@{6p4nw*)?)YC#Nvw1m^io=#9x+c<>Z-v zgFC|SzQ@WED+*~{V~~i$h}sS^G1~}Fl-D3h&oiD;@%LO&=yqZDU2KX&>l$f&-Kb?#^wp$M3V1uN0r8bM@zI#yJb>M&y zCrw{C5sxCw?6bZr_))4@a!rqdfFh)oe?-Q1v?bm3yIPBANS=5uTF_!AedFZ{hMcaJ>Gl2~S(!2+@iH@VpQnLNLjG61OnypK7NelFN zMKXl(MMYB4=RN{6)=2y(00nP%QAsn;D;mn)E>2k)P4%P^w>vF?amLAS(^ZHGGpEU+64|@N@xNY-upz2MAI>nMCacUbB7i$xBc( z|2=ebi$d{n;2%M#l?M)yB^JlUFj87jzg;UFXxuoX1Ww}@jlI}WePnDF|6-DAIa@c^ zY%(PL!tB#bvhT$oa+Vy`VeiftJ+y8X)RxF{ET@1rcG4OVSST0MXP>if z@z&hijjLAaXXX?sv>Iqj&~(&Lb4|%mtKAS#!YCwXL~KwZtgha@7)YIH9iNhrPTRp0L}^31jQW`;%gcFK z{wdcK2v6_VQ51!bEG?p+MNJ4?V2Ui0(P9>{q1J)Wx|5ghlr!HKZo(M74ZAOg7n^61 znsjO3?xu)a8!6qlwb$Rk)vvFpcvM^x*LT-yp{j`p-7vK8ra|d*IaFev)nmyA`=~ik z)<^aJ$_t~}=Rfe!FWgk0E@GF)@!jy5_a=C(r$D)W~|!|{77aRKY<$R?&eK_g=+@UA@xuFrIHCH%yPuK(O^ zyJm0u<~P4}-#xQ0s1^S9-rcohSCLJ~Pw?>AG=~v6t-Cy`zltw(#THFD=mEtHmxvk5 z3vWr&HtGE_`4#t6G&aEqR+(niYe~B~Y4@buLW%Zl;k7q->DBZ+*hFIji$+o}rMxFX zkk~E698z^ckuc*i9@=MwCQlJ7h$HfZq2G2*Q|!a|_Bh%T9jcGM9kSuEB-u^jAu*ad z%kG{=-i{c%rpZR-Nq%#qXKvMbSjTuX3{jzw)-hr|<7E`0l{u2$({rCG|L3j3cH`G= z9FVB7&d$z0duT|A#~PpfBwb62RSH0~Zm31HYRI#F8vnYbohz|ML+aEfQBb}ivx&~+ z^W7%N(=tun2^*I{mg9|?PCpT1Vj`6hp3x%z{G@bUOFKtm5-4lgv`OYC=znG8xlNw? z)J##=!h(WCL32H$v}wFeA$}W$sx9F~H2I&ds&Ph=XJqRc!x5wnEu^7M3DKR-_&E-# z@9!q*rdX|5la)r&93`5avhEVOOJje=g&YW-4uBa+RkyrRHzW7y;veKd1(^dGH%~;p z^QO(a*d|{|HLur-3DF)mDe@D)e8s(Yzj#~(${=ZuG>(GtEo~BQht~Ltjg7bE$)7$II1 z`^5wC66{2#!XGj-N+Q%}#P*7udyYrjO|1kzbSD<)Dk5AJ%Sf9&LDIS_j*uHEDnt7+ zPr*}^n5LvBH0+`t5<=m#1o)%4P{uABV(v&RC#9T>ljo})sHM6n3S}23@5!oz z^HwaTX0de~BoVv?kBiZ?2(UR|u(t>C>qHPp<3~MNIc0p8t8%aCTAaLPLQ07TMqplB zJ&kD+Z>D!}s$J$t?}_k`?~zeTuWQ%OsrcIqe}cwD&?a=~X=$-5U5(u(BsDN5zl)#W zWbubxm3=YP5|181CSM@2)oix$Y{qPcvKh;Nq~z?pm1L?ecb^!k$9E_pLs@&yUC$Tw zrRd*C<^uQ{g79;%Uq~Wi}=`Z z2d_OpfAOkAdkA!*cgvSP_top>=U;UBiC12J)$G0p8}qlydw=4!KZ;Viz2yDVC*s=d z)epAw@*OXdj!x3AoxSDk&3E5=&*dlPFTd*8)ekn#zVg;vPd@WL2&>x#F5G>0xc^wu zBb$`p(XO9c@yEW7{ZJ0j5MvbK8AU-lYC5_o6v-7)7cb{YXW#t_@%67azH{IJJ{PrW zF`gou^ia5BSoYYHn@2|A;2P5mN7$tC{^q*`d=h8P&#J6ur+5(-%dV=Cke?WvC?%G# z>{6i;6Lr~7Uc9#N%kNj#ecqU}eqz@%N;DPOdd6fop4SieVj9=M^QcJ)e!f>nH#oGO z5t7h)M%t&5);I1(W4;UBF8WqylaSwc|Hfv4{6+8)IX8*cX$iC@jdblC+V^_%3-%o% zH@?)7%zdKjYwC-126O=PQSy@w1-}VbEyEhLq z#opKibyw3*z@HHPK6~MtO{$+*^XE69jDo_A1F?{XA`3&}gQ!Q0d=V;ypu(hY`!l-t zE!#8FKrPcyWZ{D4i+$;MSC&4rGAI0^;Qh|(qxwoF`*OWvR@dsx3|>ps_c?Gao9r08 zz$}5k2ox6`*3F~wlJh~i_`T;-dOOQXt%as(D;>WYnTb$91lc}PARX1}5N6V;$S&Cm z(DlVoWK&X;q?7`4s>N>>$af_80oUZG=MSp1@ZDfMh6EDx>lHjg<4FHPWC=>An=~%K zK#4R=Uk=4voYTa927O3GlHT~jKxzRtNFNr7kx~Hr&^m`?aW72ek+%dc&a2nP8?bUz zk|lI%15CN=c}h-aM@sN_;nT?MR#g$Pvzs$T@^wrFMjt#gCiN9)@5UvK4BrAQ93= zZC2ioW6KU|pvWo29d90ok6>m*Wn4@SEn@R>cuOeBWla8X>O2wF3q|BYzEHXSx95mb zSc+9sg;Btth+tGqE#XPU_znC8dkPqXq@rRcM=^&dOEQ%=RGoEAl>{3GpygOZXG-gE zw?3G>WiKiy{GFx;M5@y=N-Hc0XX>z2mY>tGJn5R?Kba)zlth0^O0oMH)&zkZf}Lvc zpVkHsS#1?aO)6k5y)RV!E9W#RgvCfah{`I|1$f4ADD)NZ5gI*-RUc`!zDVd(eKPXO z3J$v_c~n>EN>wBbfHh?5N+X{cS23~v9jv6ik#S9<^OdLU+#JI3+2cAKiEfTw^4Bpo z{JmtPj-9fpCtShzZlY)>ef5SY8b%vJ@dOVr)Yf}L!Dn4lC9dr%?k->Vq{8AAi}6vZ z-a0N93&(z1gi6M>(fzvF7lzZ+F$2FVmpP#?~ z@*nu%ZDVK8K6LAAp7!E*&7XMa@>_moxiEdAP}_C&yL)UhJ#*2{U02(7$2Da(Bv0bp zo|%|Qf1rV#8S#;*TQGo#NJwyjRf%#cr@N6USjog=y-tEV9(5)Jei0gwBD*mw560|>Nl)+^lg8} z;ve^@JZQ#AYZKdQ-v*nkt|5^v;h|0bb`6CG$3E~i@{>O!tcQ#jm}X>OOQ5MK8~4^v z9&PFBNDO}Rozy0%m2RUx*SW|)KY7uqbLl&XyqInpWTU@pOHfdzTwues%jGX8`0uXC zj7myFCS#g&$#zDXaxX_nW$7GGsN|eY&KFoMI#;Ni@Axu%1B8sw|Z$0STV--y`l2=xvomMwt(;uiCj~{r?L8PudVW6 za->f0Yw9r6PZY|OM=u>SS`=6pL*ECNrlQ)^5u1zA;7 zUNQ#khKx|0T5$GTqfL3&9V!3zx{GdC!FK<^Ju~a{xxHymBxTg_HE3_B>fXEG^UdC6y}h~nN*@_*)4l>~xI zdPI4X-WgD1?+qpUol~U{uCKk;g>mu|O@|19H#F8ZSK2A1vcB)yLKV#ZO8k_(YXN=XmAwA8dgU(e>E#WW zV{P)db=UEC7Ve(Ds($om?*5mb64Up;d%#j};_Z`5Ht}McbE$Ru32ZVyeU%ch$3P-RqptT+`)HbG_oZCA0fCQkmVa#sLrWzR=jyT+;;OSVz_) zQ)2gT#Cpc1>uCSR^_-KFGS01MeCVOEJJ*9ngvVYdTV9rz3JS#aORR z&YsO|g6~NAMb7#BdD&z-aB*(!1^z-xZ@It=Z2IZzwMnb)^36}mf4k|RZt#L;U^f`H zQz9_hRZzGP!jQr?vgKO*IP`6QMscW3-GN5;nPpi>Zzw%OUDrn z5vN%zNSA-@+ z?15Ex7N34KA9zV_CL9(*~yiJWktjl zv-Ncg{U*e=W7bUi7WtYp3SC5vc_Ls4k;r6MB^eouqM`IXNvqY6)Z0Rxg_>)LWJlDq z8mxS$Gd7`4me67@E+`Q%hzIDaT!m3s09G1qNg3)m!Omyad;0iLt7L9tKkSU;7g2k1 zTAU~p>eIEi?E0Tp8VwM0jbkM7BZ`MD2-3zB2YCmuwP> z(;7CJOUNd>uDHGen}ikelUCg|zC5yP7&gI!w$1pwjFsp-2@mqbcsS<@!M*aUT#r+!kp!xd{_eIh+?OycPzCg;VzjF;IoJ-4*z z(5Y;H#*~M`>88M~Lb;BO{g5l-1NbA5g*sR<$wd1y+BAk++9*-OR1T(lgS%~Eo4n^A z9lPoL&)J$Y8l@S$^L*$b5zL(Y{f61gcSYE0s?QCF-j^|{2J>rg*|DoK-3A?=9lP_B znN1pv1J|r24^?p3CD3D=RBu~L_wD94{RB7ueQLey;+B42QVB%?gD^hZr2LNU#(u5) zwfw|BCr${t(yweNi0!jYUSuD@`YAskUP0l;f%r%oHuqnQNgnjEQoij7Af53k+YfT5 zjnD8rBPkXrgar4TO=BG+u|aKVP3eqJaX+Z~fjsN6s`4y-f7vnM`ojJ>x!@*3nd&ST z!meM);@JAjZd*xuZd?y3Dzx6h>$#v4W%OmauDhJTaMOiwX#Gh`HyZA0BTaFcI)rfx z+x&yqbQ9D2qH-Qk_1O+8k=i7{TSV3V9&t#}D0U!}N@t}~3BxggFNe~TUDX7@YdMb2 z@a^5(tOB}`O8)QVS$H;EfU@%Jf8;OV_iMmTsn;#_f4miM{Csh4^9aV(t zr6q~O9w3ecTmjy)s5Rh+*9hY3Fdhm#a}sD=y%Yzxi0UX1?65NW9IW^q9zKO_mgT5O zz7XwI^&{f>qvKOb48uwhdS&PUO!(v__{}-DPY~9f;8E~sSp^F7xKwO5kQH&LBGVHK zLpdH}wa{*=)rcgfsS0VfYc}cpACix`rh^8|_}iH%bfqGB-3Ss98g%%L6x8ZRGLd59 zw1|%EM!glI&jnx6sdu47{%O)R6@Y!RQvl>-r;H_PrD#R$#?-G7eAa6ZR;MHnig-zm z?36GVWS1*+z@I-hmtCWK!rFH7w@o5v_Wpz)w(R!8r`Ueug4ETKYrD zpS!1vZ6`v^7^=Zd$O*zBvJx2rX*4nvN{SJooIS%P^M6c^yQV{36q0FKR+WpUrYj2x z#^a`i3=4&6*aW*^KRHP%YIb-C#ZI9$L1RL@Gw!Lorp5)x6Fl<*PTrDJCF(AGVCB*; zu1sL3QWcIB!(#m8Q?gb}Mnt@-#J>+k?dBul+eAD82SN1(FNt+ljctic+j~*>z9VrW zEX>Z<$~T>T&xy}n|7S<%$BMTWYd77$f4+G6dyif9k(;LHXJ_ZrdSKv&H)lCIwNc6bcjdD<7GD{43|C#I^28YWFT{%w&7cyyxLYBW{Qx zy9Nl4inrhq5@Ns4nYqrJi(%=C&Ar}cT+Q0#>}+O}hpkPr)uu~g#rCv(U8j|}H&!p& zY-08S!s?Rygjr>hS=>ojhq}#iP4mO8k;?5PzH54HT%PKk8$Wkz&cx_Dwp$e8 zt0oq%!yUrg?YhQFGBFJ3!58|nDY`zc*T*Q?)PA}~}qVIN1m%0?#<(fcNb2E*4M@vpGPB0$4TBm)m zmlVoGLe2>-B~J2&ip{l}ZmA@VICf3%Qd6`eh}G~X@fVwq+pQudwB=CL2O4{Yds-ZX zmq;U4qcMSRc-Xp&7zzW9)a8;WVQpf#$IXl*iuytCbyW?*UIZ=a3d*MGlWWA!@7j{l~++mx1D5` zK&PvXl!;HZaX88dY%&7LQ#bj7n|C=SS{<%)T~(RPE}uHr39jcAA9Gbg*%VA8Mk#4q zcVj6^8qtlJFE&VMG&(9!c=*I4rPaNF(MI72W;LUD}Sf;EokcF@+X|LR4ddC_?Mv86`*a zq7Y0_Tg1|A8L1wTgI-oonfx$H`&^baXnUt?KB|JJ_$4$Tfsi|~hD$>B_9967KxG&A zU`~PUtduZxU&xjKnaL}y>{iSNlZfQca-#-%y%jVc5)Da(+#_vJawGq`1r3~=FWe=1 z%LghI74DBJQM`=xKZho1F(b(2`i8X>v}=gg%4Po6A@J!NcI@bX zb+$==T(+LO_MTa6ldVU;{~gv|z37`wl8^RBzy+?Eo6;17);S_E*|x6HjzWsK-Yn!r zr2NYctC3=EC8TwZh+&e7UB5`7&GG45E2L4f&+6s=F*Iwk-+w?#NWChBQkl$a*J@db ze1%nq-~G;{>)|s*sg-~K0U=hwka){TA(3x3Nj_}#%ER$1k6|xO*o0na5!oZ{kZqFQ z9Fmv1t4g<@Joebv$tEj8nUC8wn-SmqSE_TS<<=Ez`!qi zM9!BIJ>qvUs(;JpQvKI_S){k_GV=T6B_g>aM>Yw~Xk%A3rQ}F>+6+(T zNRxAlT6*3&vz^S8Rw|tuBIq)blQN%|Q2%gVr3YSE^+=E`VlVUO`&4-)f7+v@!;F5& zM?&rH$9Gtb#}O_0%f~6;RJQIbjp;hdzFE0s=4UPTX@hSs^nq3)kmwD2L&?)}qlzw! z_XB>ZwhM1iYU8=l<8cM8W?%Vv+>(PXfX@<5V{K{A+HncN%s!5T7I4$DQ33*?%Q{V>Z99tuM53Xf18}0_01-wk6kEI+jsssY-09t+&)RR_D)=PZ7seV zxq5ZyM$Q_49eFMiMs;+vVOwYR0eCxzEanF8S zce!U1ZsXmvNq)X%yEb;z#LKm_IfoIrU<9gvb-|Z#;{sS0KAs$HK3Vrmm$Y z^BDm~fDv#TfzlVlobSy6(v6h@6^}Fy9 zytVT4$FDw|Kbcz+d$y16N1OZ;ZSh=2%{cvzAeXZD7rOeT{`?$q zl@dPngoUX7L5|SxD{29CmkfNWyOL-0RWwJ;f~ptfa{`arlhU8(2>!mJ8k_tZulywU zjbmeG=D?>L4?Wb^V7X*g|64A_ZWH?K?46&yfo;-;$l#;?*(Bk*Yw$m-E(!Ag91n%) zx!0qKEBWtt-9E8EHmP*|*f_}uFanGKBftnS0y#y%%#J`$J_~cIMjx^BJ8xxQs!bO5 zQI1)R03*N%FanIg6BvQgM?6s8Oq1|Hk5q-y8*;3R%CYP$dcF{NVZOxekk*dRdscJ# zu>J%eUVx!|S{PLNXvZ%vPYE&w{RuIGe?Gm_`hw9a--jWH?~zT!kzAWYlk_^a1ChDb zq)qtb6>W*UMRiMHpW2h;nJv9?7Sm~cMKf=Fs<}k+V>z=#Q{2o98hzm%Ud^m8y``yS z-Xhs^NsLuNUUi16|99R@(Jn7lTN?AbG_~{o(0Auu73`TA$6n3uO770DO>E_5KNICs zzf1fd`L&6aTzb{M8=YR2SDR%0t~tz0oe?UpYV?u2`o=!YoUm-&r3=e*Va=x}l>B}h zo%R4E`a)s(#7#9dos%EZI>by4uA`8XMWWE|Df?AplX_N_IVmd(#RxD0i~u9R2y8zB z)sJugJvZx)i5cTMB$Az*bwxL>Q~fzNfkjvaMt~7u1Q-EE zfDvE>7y(9r5nu!ufh|Iy^rS7i@K#(_Z^cFVnvB5XBjCk1I!R66-l06c>A1u;B2XRP z#+zN}t<;5HfX`7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEU?T{WF51Xh zgE{Akvh1gN>0t2Pz+LqQ&f!xSflWc6^qft(%=TVHZtv~3{cbPV_B(F)hRyawZuk

86S$2o|ZE$o+yUNnORs|Mqs-U zsE%y+9XEbIul6e4I1GH|AP}ex;-(wBr}2{~fU|JjwXxsF7M`V(S3CiJc$)>_Htpvz zQi+x}OXRNWglbd2$@<6-K9Zy7+b%3P$p|n4i~u9R2rvSS03*N%FanG~E)hunK9^z( z39*~=z4EC7OU(!{0*ruH2qZV=NS(9+33DVei|PjgrRU{O58wTy^mjS3Nn7Wa-o!;Y z5}ie51Q>zMMWDKKbFa6RSM$9c*-GsA+82gENnY6b+jlk^_;{Npj%=S&{qHoZu$+tlBftnS0*nA7zzF0Wfh13T%b~oZy*~M?JJwguiBg-oKGF$|SO`Xd z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu$i9f8s%+kVT9-mq5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok zU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u z0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r z5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE> z7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EE zfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u z1Q-EEfDvE>7y(9r5nu!u0Y-okU<4QeMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-okU<4Qe zMt~7u1Q-EEfDvE>7y(9r5nu!u0Y-ok_}}c%fdBvi005BxYa=8$aNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M%bL4o(mTf&hxn5OWFGLrT~VJlm95N-iGLf@m!^;x2B$5)ycaWp)pN z@cs}WK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+z!3#XM7}TA(_DYPof7w~WBR)f w?e6Typf?(SjpiJlt=p@18?(gHXXIzSJ+^NBoAdTI_tR4gE$o0DIKmEm0a21{Q~&?~ literal 0 HcmV?d00001 diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/system_wrapper.xsa b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/hw/system_wrapper.xsa new file mode 100644 index 0000000000000000000000000000000000000000..2dacb42a4dd85a042da3bc62ffa69f4ac3244e5d GIT binary patch literal 970730 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

EJdBw2;%}I0y46X3GK7Om8+7eB>TMHE{J&X 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 z%0D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

|MlRWS>!a;Eor`k$4tefQ6A2 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
1$n%I&l!A2AU9b!kO@KDGax@-x8s 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 z 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 z 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%0ADU~8@2#pV? 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

xA8 zn_V=x%o0kSuz5J%o2nE3uE|3 z45Un_N2u+{#>V|1+3MPOvax#lRr@o-(NKQU@|w2+fNN9#xCowx=v_fig_dZTA??N zb_xb;FIY~YIyKdeysNo(X^6V8-P0f5{f9198oMHK@RL}^&vG7``u(Vf^?dk{ z_9+$VT#}wNbjnGbu?`={LnEqQ*{A#LZSkKk(0jy&v~xvIHQu8*ZRppmB(pEHy)jfy z$ZC10Ki}^e;WC6753m^KdMWMiLb>*QGLh~OS0M)X7BRAB*_lO@;lqVsVR-RuVatOE z?T(j?i?K4R?&jM5yC}0SWZ`DL7~V*JB!{Zt7#Nom#Ddrmz1sBMwygp|Xgg z+T-3pV97h=wVqk}p9{No@fXA=_Yh&;Al#HY-kfTCxB9X9hqTJl7fOi~(kPt6r1#-s za~zXwnN5s}oJ(wT<7#pF+`e8WXfwF^=iNi_dFuB)N@G!DBljo&-07&K2I~w?r?v$lB+Qmy?3gr{ zS=|#Bc?})8QfgIM+MTV%{)Z%XTYs~bZ&%HLEm87QPx_MyXWu7^p5g7+Kc49=J*ouJ zx<31e-y?N(pZJTY6L0C!*9G#)PR?7c+mJav{;?~>W)Hc8Y`j0OubGgpFb%=uY;cW! z-)Vv9`oW%a_c4Fg{ADEP(gKTyu8CTb9E!E$)cZh-c*vfENSb7yv5Z)h`J|b&fCHTI z9V;O`xCKl(uOl-%090cs)Dn=CGMe#i4Edx|NGW41uwE0lF+~Fd{Uf>sQwWWWxyacaX&mMbFUmE(3%{<~6=I@#;v|k*S^qK|A(os3~RG%!h`~$6faQRt+>0FqQ%|awYU=;id%7q z;_eotcyTZ8?oQARZ@=AZe`bCY}URp-4V9>J6c@wMD=Z3!D13 zoUk5m%NbAdEr1@OmSRwzRiyAflVb2QRUl`UUO=SWd$XbFtFD1wss$DZ1Z|;aY59qJ zPneQ#_rd=!1)pAQZ*8r~Ks@0$SNequ<p$vxj1w@l;LqD0FZhEPuc5X&C8~H%Bu4SkMEI1U$+`0TN4j&Wgxuw+mIuy! z@JN0o>!3bk)%AkS+2LX$85Q)!s46a(`PtY}soutz^aVC9j|q)8OnmJd@>DbSKXgls z)6UOrrnjHiW@Cr0b zH@UOuRpt<}eG?8PkSEC*FCPgD{7bxd_!VLI?e}4?;H2p3vgiJ0OKitLiPpP2lAw`D z$O%M{7q#9OS+EjCMv|7+pBm0dUuQa6(c-|@=Lpjgg=GC^o?H_|3cN_sd(1+Aj#{m< zYV_3Cb2t5oLO?{IqVmN+ahnS#{bMhiN<2!ACVYJ&IpLtua65v?r*E~mB86?bhDzV9 zlC*WFq0?nQLPO|eKZF-MB1yt79PG}2V*0(UJf^|h%HQ=(} zgFc&qX6j!3zDq?M@5!1@q4NN_P&HzeE@ExxEf)XrNrBol!9`y*_q!F}J6}(EeUyjX z`Bp@6k%*4N;OFrKKF~b*3x}BR{Ihpa#{=H&<_U_grhOnJ6%BtoYBZJ@pAYe3}us>hwcO(qy zj(sUb-OhTtRWyy5f7z<4I-*=t9{8Hzkvvl3XU+gs{3kB7K+F^5z=`>##(guZD<`*Z z?uFkojQuuIo%3TyHf!huA~$|T@UEY)O2z&MP^jbBjKi`Oord9El(39JH*Gh`Up(Fl zxb|@!`V)zBTL#q&_i*L$Q`j*J?>!8jeu;g)afO|DO~IKMU3-C;$8X2c@?yf-qkUNU z7)*h)q;Om~uCe@_H$bxRxE&a+%Ipmw9qDLXNNI;O^7OJ(+q-Et7CNucwq@|S=nkuL zCVy*Uqr@MQ{w=E?iwsJ=1LkE`L)sdeT$r+hB@7F=?w4&fy?XZmVYeH>(6zhK7+%b; z&$}bGk@u=Oia9{8rGUn_Zx3qSh?sxTE~B}m6_{$A>vxOE(mN07-nL^wuQ#vjl?zFo z;$2K(M|!jc^(~UkGSEuzd|=>MOr)$ch1n2y^v5?xOs*vfDzn`ceG3^zw&h8;PqVq!ccLpC?YliS&#fw>VCT{8@mn(6I-5 zdzl`Cr%0p`n@^s@GHC_1Rv1%ol0a2~a>%65#FaFyq2$<+hvAXkI{0vDH3w@V0zYtr zp{1>AI{dLah_gL?`~%D1opjHw!?Y82BOb@zO|5o0be{h}+=F__(~sI%D~UAhWK~mT z4vRL=V()w~S!VX$UyDd6r&~g~uKREv^^y8uQ6KfU`c4HjR(HA?a7Y0dmw?ts(LIy% z%r`F*c6EB$%hll`*YMG3VtuwF0rzl0(4R?I4;!Q-s8LtH?f?>L=tO_n;`tJ%ZQ=EV zeP3@l{lZbWJ6d94PBB;;6W%&)h40KRtG*t@1O{f0XwLde63LcV<<+?3AzbO#uIJ z{naN|Y+9JfFZG<$LC3Qz6b2>Gb^SZ%#+L)Fops$-DD#4;yScBX z7a;g5fkP!n-^ZMUAfbUCJ8yU;rUKaRD}6;Vapc6C&da#%#TiZ{$NFJ` z)PT$NT}865JhI=84DoVB@<$LRZ-U+4*c$z9ttuYqnP2qN2s!K+buRM&SfTOg(9tWS zVfDJW&}e}zxSQ{JIMePZu_1MBbv{EPUJ?4)9X|8z9j%sGdYoyGc8^iRRb{44iN)pevDr|ztHm#3-6 z55|Uio|(`=#6BN^v1=->A9Bp{_fK*8d!Y38*0WcXJhp_^*u$T%mfp9&f0VYt?$K}R zZeEhEJdW&y5aVyUL1Qx`SutVXjN>PFU-orff8O*jv(!t`Kdk0%&s)l^m^c0yDI&Z< zEz;Y1>H+WYon3ElUT^hDZRwbkP~Dvi>dnjHnb(zlXOw5Oeu&PP24?7KWRL5oD)V*n z@Tsb(6AONhUf3HF;48ZMIFGU!p}CqdGv1z{CHqTKN-xoB*3EtvzQVV>lcnVEaem#m z%#>e(d`#J6z=9?MWANd%NtkWe2me>`C9`FS1A(2x7;w`w@f>(*R)J}d7!)6*xC!jhU zDmHsLI;t0eVmOG54ygTC!ly?&F1+)8D^C;n+UPLN-=^Yyo86-Fig%51Fr|3ImHkGI zB%0OV@3Em8Acz97fjn9yGdn@PZd2_gTxo@JFW(@9D=j8IB96r`6$u~PO%lpdv+~M+ zNv>!oU#D4`MM(kZ^Pnkt51$5PSv4yu688n{TUKILX{Dx7avl3Z{xtI#Fkuz4ZFzl~ z-{SM{^8TOaG+ifYq$iHjd&fPLmgDnga^?8ES(Th}9l`3lO?&hz4 zn`EYSXWyKsj$>Y4^kVy>xh2&foIXtuYdrq0!+NE$<$(8h>c~6NXUX_}$_l{;&|E)@ z8JBh-E;9Q@B%|3?O#7e_=UR$#w-MeCt67goc~P;TbKQ(*2iJ|+wd_vYj1}e~iB^@- z3?B#?%Jjf>~lMry} z*USvIA(Iu^V=G};cwhB*9m`$zONWZsAG?SLdTE)d=@AI>koipUoP62k;g>AdT;N zyFVb;_;j(%U~?s_KJk7qG$=s#4o|&K)v}B=MO$G=2e071fD=Ob)y5yeO^Jhb5FGoR zh6(>R!ILG6ZL@#E3qaL#FD=zwFCt^99s@TG6V$li|RkC!>x4$cW`b(NG8S0c{5_0IW2 zEH^CmQd4FEzg8sQqkpCMZjvmTk1GvTcUt?}pR=`kI@&^JVMmj>AfeW)8Vtl70NKTi zcHTyOTgW%n?}Y>|qme&1FDe5Mb0`@4D z9MV5HslTr^vE1?z-&)m!K_2uX?~7%_k=_#c7p=Pxw59cH(QM`8%wy}J_x*n?3`_UJ zlZlGQ`nKV54}owy%^zsfaa$3Lgpjra1pmb-Xa9Kj_C`K6=FQLOKD*XwJG;+9qOOo~ zHb)WrBWisR8~J*Z3uNG>c>$P4SP8Y5o6$d}$&=#_Z-UpKk7>8hH{eFPX^=E;Sj#Je z?%!f$7{X_~nVtXs6?N{!1N(si=4zQ>#oWF}y;}n}d$pacC988Db$0ar zC$sM?9}Bzq?H;7475b3-N15N)!7ZXZ$$U1h@aXmi5YrSiMfj(YFOhhb@Xyi_iZ7$v z-(vvvYS&w)<`>_6Bj0_@ALecV4mnOHWoghsK|v{E~19o%+-g*dRqKPH_|c z(>(@fIrtr(!y5UgXGjSdd8DtKJ5oG@8J}2*0oiNJu9rzIZR$XsciE5YSFHE#?*y5= zZtA9ExXg#<>+Em91y><=yFqeNjK>Cb(Z9@BK}qL>V;m4aiEo~Mi&crFa-bzm*tNm| zLS3x2wtcfDwLNog_s{o}%%R@2$!Z-;!>xnX>(pvfX(MS%#f$ZKmmXKzxrEV1ERmFKXw@HEiAa`Q*(vuJfG=j zRPpor`aIprhA1WqRk=sf#aN8EQ&)Tvz#!yXn)`g;@EJ!+IV|9tP)va7rhfhOsr=K~ zv%b82<)KTJgVW3D%0iTzrwjP@X=MQ4hp7@yJjFzIEq%#g0_{-^8BacyB^1$f>Z~U7 z>qLl0$1k~f&6>H4&3mP-t!I6uY>>IvI%A(O{ZyNRs5*diwt_%i@j(rmq`b5K|)={xG= zWOMAfFK3|%N7k|)&x#Am&s9|jYn+1a=D-ZyG(KhdS$(JS16`x0z+0H-J2?-z!?Piu z7+>?3mMXofg%dYwSzf*cdTLbPQQ*`45LI7}zSPCoklF8pSQ{$-|NcVxP~j|TkqO%d z9Vg~+VCLtqSK928EcVPY|@z#dquXpk#eq-=1 zt=UESITq^j&Ng~S^{*pEP7@*py(e=#K&o%`qX`j>VoQ0plboV2u=PHk7wHuz_v7A+ zuI=$Ihz%8`EN3cPX!wxsK(iJ66AyIRjfD34%U^8iuxvO{Wt?sJmtWYj$0kWRb07}{ z_djXZGc0CNW7|eFsw0psz8EexUJ5_HJ~jW%G;wk4}EaT)?SfvN~z&Akcv^IClDW=3+H#4pJ#tn8@Kb zzwJ&%h0rf-j6zm<2<7Z8zJyP`_B)+qDKmb_8uu+sOufiw)A)SY^jV8m0I~JCW|hol zW%z#fSnt&R*BQk8S^V}4+K8}oE?^h!`w{Dk*wnVQ-YDT!A@3<*o$dS<@cy&C($O*J z;L1RuD1rS&JU#8^)ba+>pZ)qO^QD2Jq0Y@T{kcEJ1-ZZ>aX~EBAOuEsdr|$kw+jQt zp%(lnNF9)VKw@hccXY-V!u^o&ySkN|TbHO&>P zBS{CW-5B#HN`WCGOeuK?jKho913apk`4jrW=6->m8OM*=fD7yLaIyGtc3F<_<|+H9 z)qy^(WzHRsbMgGz1P^6e_@;;jq9|N4@MV00|V>4 z1_0sf%8+&KakC%OM>ZiAD{%Sav`iVRsED(ja#Qk5D@3IWG1s$*GhA9I&2QuJ8mWpCl`joYKcQ^ec~?}6=a({^;Kwh;GQ|3 z>zs}(mnJrTpKjYZ?v?x@Ay72U5!`QrUu$2gW>Z*ryeDNgXQZ)YqMB}e_xNgjrrWl} z8Sk=j_NZ;>ttNm2(8a`sr)gu zLfOQGIz)VDYd6tyFK)PrNj?Z(^s+X{DIo+$sD*tU00@7xRmk+#j@^LM0Se8yoZSa=Q3bVl<=G(cVTF>t*Xes+0;TP;yqTxi$M-)fJ{2T^WUel^>x$ zh?Pp`r@vp%Uxb7-R7WS>(Uc9=wq}%QsT^eM35BU%RTfbxm~@svT<7upV7J%rW2lUb zDJ9(>kkvE_{{rYR|KgP^Bti4h#~*kYLf&5|t-X6G_j0$v1hAZGgse~CVaKJH_%r7? zY_ATF?lC2JdYC(_pgPpp%l>DU>N&vK1 zRu{5c;n!#ogWTM)6mr`S!^!~=hmSh&CDEL$)y;MG&h7iV@ zxqw+qYCaQla#!s0UN%SO)MI>;=_Vei3nSh;@Unc~*Pfv6(T7u(<2MRIuOZ(*L7-7@ z9#iNJUz9;IVd2unSK#Kg%L$09^Zx+g!7ElUu+I6S2{^8nECkTf=L2lXH6v#R%kYa0 z6h2vP@rc0Hku-<|_n;1h0x^;zh69Jk3t^7N{UZsfXrwtZGgy;A^Y!u*kF3EbMDBIj;O#H( zf5RP)A4-qOYAsmA%ly zOtb_8Is;!y1D8AXx$oi@MYNC5Eokoets0u#=2pOb$QSUTuK2nqnbD?TQ@5cBM30df z;X+e+VP0%P?=^7cFmsWg2EWeXwj}enjrGO)4xc$&^{EHDBHIqLkCxS-uhd}!a!12i z)iOs*YfJLwH&(Q3NA-6j1j0Ui-!KE*k5xL35r$P>WKh4n(zphFz>i6+{bKAW9NRQWZse3R0u_oM24r&^`O~N&Fp! zNNUZsBT5;oF;69xAT-Y$r=TKpl?Y02vKnJeV709KyABDAtj~^fCkMwnvZ*z}<-OoT zwc$UJvvn3p8@tQ*jA6e@*wl)kv+Q$OnpU``VRFNW1U3z|`J0rCmCpo=Tjn(ET*s}V z{7I474Wo+Gb*&?9?6hs@-6*v)`})I^*A~bR&4%r92OdNZOSOH=K)-%<&lKJX+aMR} z#Zs7?x?b&R+91Wk#8JGn-xhv(4v2`_8K|O%dms6xh-Tgtk;s3FNVH{t>C(s;S&jMJ zFZC7i)v9mOAlQSGnUPZi8lpL|!vASbr%{5&6*aba@;kxD-96>tD;7ZJDqlv_tSK7- zS**1`cVz6+4Z-BZw<|%Bu#PGczuiPjApwmMn*J~39+DnN7Y}o7)SCwEwBDJ^Le5wr z%2E`&iJM&UnIk8-OQoksK=ytpSJD5gg`6*h8{z|T~jqad+?h*Ufe7oS=2j7s3qFd!5YvoKkfBb4o1*lC)7sqgo+8IuB>F|diY1hA3r;BdLEK7HJd1bG2 z@%T@n?XhXsr3=kd!2Ub4XLgQgN^5_rf?oZ&{Rmr9ao!u-;ca{v7VaX5ELJ$AAD`=b zKUg!zyy@_3On41u%M^xu-HV+$Z?NTq`dXz@nrQk%I-l7{3|vm(+8Z*eQo0?zEGIEjZZuLVJe;=?AJ} zOHFa>!O;9TLA2?{RJ`{M#|X3RtG@O9dn7MLBBW4k!uWG&*)c-XLc(!=Lo!HT4D~X%$rFMVf@y-6n)G{T ziirS@cs&oA+{_i%)Hn!CpTa`VoHF-olPmNMfqGye>A+(CLFvZzr~OQWcAIr}h`N-+ z<~h1`cD*v!6d&X`f(zfyhbMXU?KTZ^>``xQLkXdn2;wmKY`O8rJvYNA>U*xvpsfdb zE`W;u+)wJ?8R-f#^|Uhhf{@S7oI9x5RP?rZ+X8Jqh7;V5XH;HHE|o%(C18{~cJrP{?4qL?MG&|8Fot66a8m`~?o= zNnGn2V*c=TBrg7;g`Tl-bn)O6(By&+5333DRL5>Ij(i; zlLE=D?KZ~gA0cdu&7-hd!z!jj0&Tm6lQz1>Cpl(uon0_yD@;#iSObe=)1zdasl~%= z20+MjvVWwlJhki+L5^i4HqA z;sguJoZ6*&kPmcG@0a7;-rZJ>APG|p`Yk^q5`Srq2q-y2YA>ON^gQf8L@Iy^t$GnC zbJ}HFw(u#UZdV?_$DF75P}K38fL-XG;8b1J0iZnw?H?qGI$Fba9tusIOri0+CwxoH z$#%lNj)fHQq3Ht;_bLZ*kxVt5kP4t+JlllmTUsIfVWS7@244>%F4J zxUVQL36%j1ienD6b+zJ{W$EuIM-;XqsJ)1k6MnYmk{U@F!wmW_aRmD*y^jLj#UKL$ z8L#6IkZaXVa%TW>7LoaR7o?4O6q}M9Vn*Dh_nY1DXESmcQF9|Qv1;`~9cHBS$*s~2 zL;G|Z$TFi7JGQKa0`zl%!m(wz7)WMg&45(G5PrF}4Sn;mud1b!h=@9cV6s6Cs1RgC) zSo!K*#7sX%gDK<4vTIhKHx4m@4@-R>hOsohii$S|SMT>PaZ6vCaG}+edaZr}9h@DL z=6yDtIA+h%)-Vnr?`8e0)@lF>?(6N&>fP%oo*1-1U*99mj!A1&ERLh1j$K(Xc~=(R zf*P{5H4(~`!H-w^s2{GZAj6Sf@9LGjGCt6o z{Hh^)7HTcjPml$i3qNyI{k%sWT4)6Pidf9c0sQWp(do0%`60XPpaXOpw!6O72D7&u z6EGA-?2$hk#nZAvi$&-DwZPyP(d&TN2kG9OGzEhC^@q?+!R9|KjL}R?@`BG+e<iPS-Dn?j<aZZU5KLeGzclBL_7B@3akE`G~PIcgHYml>#+mD*u8;YE#TStB<6WAy_6VS zT1`ThwXNOp-X9@!h|(y=PdnlhD<8U%XBz(b?I^^+^Lg?UT2vSdmd}jpxZCXDQi#bz z$Zvgi)L;>kH^&C~zrZY3_Ya%MJ`kVdb{SIvKE|;qKE7vXLb8cC49@)vM#`P~+&uVq z-2n2pxZPKO0~FDYrVGM3B>!F$g;j|Bew*H>qA$M(*u5l-@l3AmXppm7YzAQot5ERu zol%*hPs9^B1m(O)!B8ID9H<4Y4=>t0*pG2_eb?A|_gha~vp3l=NPTeveR3A{fC>#` z>iOeeVaqZ|K`dNRXvzn$>pRUQv^G`>(}4s>QE5bQX=>?vD}GedUL=hGb_U7#y31@l zcFUP<)aOCs>4KNY?&&N__ga~-w+cXP98<0DK;+k!=6zg+OS@-od@8>GK(f9d+9SQA;Akiz#_> zr>cRijF;HZ`@%t&FIDFWs=$TN&WE*OoQd|+9OnBGKk@Q;%#SfE@Sbq|5N81$cca3T zzwwEMtGPWzs87w)N72OQ6HctLEjG^8Cr(H|#_U~gAb2BdHJpD_sbyGT?(9St z*`T3+tX0X>ctQ_JelVL^6*v)QsM5hBhfmFlS;bQDrZdt@9xSv52$~FsYuTLhVWv zPZhGV1}E6ndA-DioR?tM$`OGR_ennF) zl3^!uE^WwT+A7q26t+{~`SapEREF2qUdzaLe|S=VSK-IOG5Md5IxAm!-1VRo4nD&9 zlTAqer2Nx}6_|<>Ci;mDwcjF2sWIS_PWA}aAT3Cc=A7dQ12X!f1RfZC3Xu#;b=Z6? zoaM9|1n(F#AEoW`rTOf&2UrMNpGAp0JLwV#ej?xy5Q4Vy^&Q55)FbIzzEu)vLzLpy z1LAorV?P&5@u}DP-(>ohl-%|OsG5djgO5>>APs!3&*^?~Xa z|0+#Nh`XpuIfDC_1YuLAb6T~a0 zeM9*e7m9~B{-`M9Pv0>-r)p$GniF=PmqFfMfU6*3zY{MamEVuO_2PAeNZv;k7f^4PH9dwvG~Zjqy4T1wzMi1{J2od6M@= zG7no;_7_%utp@^V+AuTN6eWGL!!o2io_^fN5N@fN)%IVW`Z2fJk_Eoaw!{99XR8PG ze2fFlcaThu*4U`32SZT;CmsdF&`oI6qzn5OoQN{BD#M4~&=GLk&_5Vz?V2B%gB&*V zqkr2&N?zxrFJ{!)_Dvzn%)cEs@9T>ki5|j_v?7Z*2_eCWo zuUpxE`$`QyJrotxj2Q#jnE1c~Wm@*H$pMQZ(CI zs;;Jb8VDFXnL)vm@O}@tn#2`X0D;=EqAR{L_B)kI28( zWvsZTb_GY|CrC86FCA*AsY+0@p@S;s)3qfQla+%k67@@_h&N6umuQqZLF;E`4J2t4l24$i!8~BLmOeboh?R@H^EA{O}}A z3iS%lsc+8{Za0kipKJ#>n51GK++n%s;2ivha3zD5B&4a4`5Tg_$%(gigj|-hA>n~w z{>b#70o=!l(M$S;*VMPpf>XEe)$N;XrqxWCn~b4ngellKlv)I~C9x`* zzOImJptyhtzbBNT!;MWmCYVjca~7THRs^3tg>ikV59S9sIUcn0F=v%^atj>aru35~ zknUL4;*bn1nz3w0TF1U~ICxpIT8Ijk1;BX6PzAnu2-$TJcQ39_sQGANLn{nyYuh*> z*D+Wl6Gn`srmsmJ(!0nIxIv`Q@x=Qv2lRQ#;27fI819nz^vr2!7HFF9 zu`tLQfr*ZC%2>IHPANQa-1@yXd#MNVqSJ8R!44k_734ObiAI0_GpU3AnbdflzMhfY zfzj>F9Q~3!49wzxuHIb#&k-z+OeVoBN*$g9ddQ5gmum$DzEwg|;=PG4&-zF#*c5C{ ziR;kwJe4V4-0Uvqu6pE7M zl^KpYX{~U33H%nba+BoMOLmxk#Lp7XI@_dXTqC(WnFiAe9uj#U%eD`;nIdC+e5h)% zr=|5dk+4z=bQ-fdHx*G_uT(!e4VYUA*V2C!@zOgA-gg3N*)v&ybQO=Rg~Gb>8joWGs%(TTvgb_Qwlmf>FBxl%v29{5>l>rba!) z>z>H~=>0aU2YC2TabL1?U$Ry16y2M0ydEm^PUn4l=f!MI&Ph4S=iZx3BzqL(3#q9* z596Fm!Iy<8$l0BGJuiva<1IgI*huGy-Vq(|Xw&Rn6)YK=t~b2e%*7$`Y6gub+rf zIbnd?D|dFkC;hl1^i^i=7mbODAYRGl>C=w}#iC6fDH4RgML>1syDacZ>`PW|tIKb{ zj5WRBcpky*7hT06>ljN%X~y^J$?-e{{{%uRdx<*MNP>#=5^K|)bhI8P5_=i(*2pc? z;VYvw9!+WSclzf!eT-PtUi>t$yUR8OG`tje278zCK+{+tLg$V9i2hQ3Cu!%jB zsflCS7{rM}?8`LQyPjGle~nMRizqGDeoY1e9Zk5vb$NyJL}5=?ToRnj)@xPYFqhhz z5%Mk1Ok_}V3O#iZD(S%ud6aX$k*_$t&sYma>yHVm+l+Y2Q7+%DPt(JB^&jJ2!e-WG ze)9?81-TjT-5h`?6`P(5f?g-qm3IPhCXs$V~f)e$f$ z0##Hl7EyOt{RqJ7bw|8E`EURP!IabJ>bJRh@$oqmA_ti*-;!2W94x#*Jk(Zphg+t(5u*t51jdg|=d*?m24kMd}` zs<3QpZVAcEBbdWyq&ixWFTofJt(*u?pfttkIimS$MKj}C@%zyj3T@HU&sm<+niUhQ zxEYL$sEkaX7>plE(iB(IIsEFMWTN7)6BpdIim)_B9fZ;@P;?*M!~{CS7X0PoUO#IU zE04C*5#Dr)3Ak`SGg)Qx-pNw_Y&!xL?>_CW=1%sbS~O2m-%U?wW&*fh&ttN94Hw87 zmy5!~^&c11P2skqGtAJxb_*5(c@^yh3pe0S@4pW`?*&bT{H>ftrP0G4~29C1pLsr;X_{&ep%og;jAu1}OVDSM2uZ^I=v|6h!xEZHeV9 zLL|V|FaW6gj0L+^YBy?`Yqq@R#hmyrUc8C-^^({SF6f1aqE3`Gbi1R(A{Cp(N>i)w z1^gz-{+}e^P0~UMku?32_y;gBD8KSMVULcpwb++xn%#*-nw2J+drZ#=O`3#AQl&x0 zBYQ;_!ln(8OhY7Q|C99pCz*vv3L%nNnYtHh%hD7xIHxH66!V#)a4HXU7+m6*8P`c| zRk7)E-*9yNg6W6{l}R!tqo>;X!4GDiYD9R;isfhNYwdk~3O17s@)OC=$4g{?cR z(c0UHKvuI7Y@f85apswOAC9{6*I<0p5hW&Aj*{$};)};{GtI|?{7B8izFfE)2?&BJ z-dlf?p2^KF?&L~UoAV&zoibC*bBp|JBIpIqb~jPi8kR|!3H6{w9_uIQ76zPAYaO+XoJJSOR=A@M z;A*nR_xNzD^}5s~)O-vW8!Ac|P6(V%021kBW%!Uqv>bAEG_8^bY^P`7Z?`Iy9?nb2 zKb|dppE$bNR1|tB>v?r;jsZz|WUVr-cG{O5?N>aL?bM$~Bo@`{7Z8{}liht$^NqV? zxQUnw9}P*!a6pD2t%`8v^7-C^Z>UAWpV@Ql>=%R5=X@sZjY6-{*@+NsQNk z(%WqM%2x?`23k&X;Bl*)$Wj^Y0ybud6K}2v%vXHJ_$oG!9Jn)X^W3#Q^Ieg6l^MIz zZnwgjypp_?(lja%KlPc&2CR9TW3KW%9oAPD`kN1f`EwUm-2ioATm}P%&PP!h-#5#2 z8W@UZ9ZbT)GY@1vpBt9BCma|-RWHBqyceXnWzvLNi@;R-eA|i9_g6_*G#L+sdjTfR zS7b(@i~jkUNF9R&YiilHmwrJEz72Qhv*nfhEigQw2BVm1Csm1OcapAgc_myX_4w-J^F4e?;e_vjp`+YjoAP=PKVHyAv`nQ_44^5ko?T+p>m zr8*;?$n=t6t50`9tHqyZ`dtUcEPUv!>L6{B%&bg|LNcz$!fBD`8YGvNPGnE58KxTB zsDZ6(d{Yeh_P&I7UE3M4pYvYY z*;_jP^q)$NG~?HJn3=HX?IF1Pb#Z(fK43$k1u2XY~0SA{Io({ zFe-0GVH-JgrpKZSgctl=^_5y(XK0YFLdkraG_&}z6#cbrEnBw4jVSteiWfiidhb;B zbJ(CAA=A&Wv>T0c*%mhIFDowWAob0aF{9JdUP2_3uXmuAC?~?;I;qplr+f2HR39z5 z;;GM-*)A*!&j}m|9~_yFj=&KXTo^p@)XF{A$|Lfi!bwSxaQlw;`^p1StzR{12F=}i z+{ZrBPjOC{mG*_~b+B8$+g>aJ7M#fO>B+!d5AONFF8MHxw6@r^rQ>Py&>NxCH9kFp z&}YA*&$U=Lt=CZ|iN-?((dnL?E<$k@Yy@_VnH3cb=0bPKYkjQ~=0t16;KC&$)IN~4 zz0tMhOi%g zs6Bke)Kiog!E3oreNs9X2zlH^2u6bCP*sWBcc<+jU-sP>a|^pc43Y*`l!5fA^CTyl z=Lt4}=NnZ?K_^in8i6DhgW9X>5bcctfN@+l59}kf7pZitA&knGh#@BxGqKk68oA}R$w_1>+!WGSiS8acY~E} z{#6)FAX@T+T;g?3jz~EA$$L@27r1G|3-9d!=kJQJqywJjTieT{vGm@&;!bhJabKOf zWKD_WP7-o%T(Y|O2Kx~l#A_nYR7Z(EzB-z{;0lChT#}72L5VQ7ZZ`_8@LXQ@++rE-AEVg36#3(K;0@ zbouC6740IfA?Dg?#sY6`ERk|4RNv@Mj|{LGvHo)QZgQzDauR;5@o3N`#@K$l{mSS8 zOpRq0zQeL?Qd#2Hlk(LEKN3r?h!}UHjy~8d9xC~8p?m!LDUnFDAQCFPn}*UB>`OL?8LY9G znX~5!<(?yt@WG%iw-w@Tgu>UCvpPSS{M+xT=g0f;6+I%s8m>V)qr+R0+VH%D$xY$$ zs2kGo(IU(Qw32wpp0*wZF5aytu8YEtU23+Gc<66f^wg3#OIvZY(^X}><(~_ZsKSWQI_jlU2cuvhu5sXy_ z{3tSF(FhO?sE2LWufazzGORd%#Y_=@*d9qd$+2oXm6Q4S-Evs!1uqZf?xCG;fy%fU zpoyWQ>hE}M`PxaQr_x$~-t=xS%F5Usp=PBlW68<ae5IO{6Kf?MlI1@+-*+Hw zQ%DVrA6v*UFL1p?W#wK|ZN!^Ct=6>6YvrH?a6lSqTP_ju$EP?OYny5l)ww2`S|U7z z4S#Zip7nlDA3+m%18*WzS&?}Zf}7ri^j|c+LiM^$w9?m zjmNCj;Te24+}R){=SRS@qfok#I?HE$$}#654Y`Yuz+8kx4)|mP(h^YwEkg5IvcPA? z8^P;Gxa{qe$DQ=IK#GdQPxAAm@NxCC@q~fSp*gWvHVgxIF7J1z{BZ^0GydSS?lR)l8Pri+F?HO`kfMQH=R5|aRt=IubleN? zMiIp`j4#9NQbn`y=uGzUM_&C_@OO0 zHMF-g)8LMXb{VYQI4gHPwq4qDSC?;lv4w#5xXXY9K?9)g_w@2_ zE0g@fB+a9)r5~C)|K{2DP59ZqWh?k<%0*y%7gt#0}nm`>&3ue=a=~W6dO8y_6qi5W5`+5u*wc67iX5%e`KN>7|LLeIP5a zz?XgWdj#j&x($4?29}^SfQzN42_{ad`#yf3H%?6pIrx*1v!r&d*-hf?Grr$mli5mYZ9|0 zrH$iU5`?6lEmtsX_nucS;1ZgJCW({ObihM1QaJKnH9}+uq23`wM9ob$s9#z|j}l@{ z&n==e=FQAdO!fk7ht%AN4zy>3jzb+aB-KewRe$x*4f>$5`g3&@as0hcljn=WO*nK^ z@4jgmmk54;tvry_2Sv=Ec6pO11xS0%?3!2GWF`ikks(zrz4%^~l+8H-JNJnwfrOb^ zylz|~`iDy=twSF+WEY$!7avR8lu)?Gp)+idq1)fF8-qd=4i41*gQdznp4k1+G?2p> zgaAPWgB+Ou(7q+luZHU6auE#31?llCz*42g zBxO69zU_WQK}S$NT-3?;Gok!r?(I%Fc{jCy{C+|WfBU2{BV$6HYik$@$EMVQf?$7B zpAmI!998qo9;jG)IRB3;>br+1y6q3b@>*^<8ne3hOl3WS$Q6cH@`S?{P4;_#4OZX^ zpvxGyi{alz?tK{hF!AKN}b===v zRafBVSBw=;Io&W1!m6agnFQN*#r)y)>O@`oar0D>X6K-LyKt?MFb9SI*ES1lBwX)@ zmvuyJ(>xUUBQbLc@vIS

TDi9UdDSJ@gegfT11yzCQx4G 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ÐI{e)DZ84?!de@dUChw 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 + + +NewInstCal_bsp + + + + NewInstCal_bsp + + + + + + + + + + diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/NewInstCal_bsp.bif b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/NewInstCal_bsp.bif new file mode 100644 index 0000000..cdd0bca --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/NewInstCal_bsp.bif @@ -0,0 +1,7 @@ +/*NewInstCal_bsp*/ +the_ROM_image: +{ + [bootloader] + + +} diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/fsbl.elf b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/boot/fsbl.elf new file mode 100644 index 0000000000000000000000000000000000000000..34ad82cbc25f0d9e5b09c3249f6be06eb90e9ae3 GIT binary patch literal 472932 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
    +* MODIFICATION HISTORY :
    +*
    +* Ver   Who  Date	 Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 6.6   srm  11/02/17 Added processor specific sleep routines
    +*								 function prototypes.
    +* 7.7	sk   01/10/22 Typecast sleep declaration argument from unsigned int to
    +* 		      u32 to fix misra_c_2012_directive_4_6 violation.
    +* 7.7	sk   01/10/22 Modify the return type of sleep_R5 and usleep_R5 from
    +* 		      unsigned to void to fix misra_c_2012_rule_17_7 violation.
    +* 8.0	sk   03/02/22 Update usleep_R5 and usleep parameter types to fix misra_
    +*		      c_2012_directive_4_6 violation.
    +* 8.0	sk   03/17/22 Modify the return type of usleep_MB from int to void and
    +*		      sleep_MB from unsigned to void to fix misra_c_2012_rule_
    +*		      17_7 violation.
    +* 8.0	sk   03/17/22 Modify sleep_MB parameter type from unsigned int to
    +*		      u32 and usleep_MB parameter type from unsigned long to
    +*		      ULONG to fix misra_c_2012_rule_4_6 violation.
    +* 9.0   ml   03/03/23 Add description to fix doxygen warnings.
    +* 
    +* +******************************************************************************/ + +#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; \ + } ) + +/************************** Function Prototypes ******************************/ +void usleep(ULONG useconds); +void sleep(u32 seconds); +void usleep_R5(ULONG useconds); +void sleep_R5(u32 seconds); +void usleep_MB(ULONG useconds); +void sleep_MB(u32 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/smc.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/smc.h new file mode 100644 index 0000000..b4fa9d3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/smc.h @@ -0,0 +1,97 @@ +/****************************************************************************** +* Copyright (c) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @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. +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 */ + +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/vectors.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/vectors.h new file mode 100644 index 0000000..f9747c7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/vectors.h @@ -0,0 +1,64 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @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
    +* 8.0	sk   03/02/22 Update _VECTORS_H_ with VECTORS_H_ to fix misra_c_
    +* 		      2012_rule_21_1 violation.
    +* 
    +* +* @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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps.h new file mode 100644 index 0000000..f73ff96 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps.h @@ -0,0 +1,582 @@ +/****************************************************************************** +* Copyright (C) 2011 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xadcps.h +* @addtogroup Overview +* @{ +* @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.
    +* 2.3   mn     07/09/18 Fix Doxygen warning
    +* 2.6   aad    11/02/20 Fix MISRAC Mandatory and Advisory errors.
    +*       aad    12/17/20 Added missing function declarations and removed
    +*			functions with no definitions.
    +* 2.7   cog    07/24/23 Added support for SDT flow
    +*
    +*
    +* 
    +* +*****************************************************************************/ +#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 0x0U /**< On Chip Temperature */ +#define XADCPS_CH_VCCINT 0x1U /**< VCCINT */ +#define XADCPS_CH_VCCAUX 0x2U /**< VCCAUX */ +#define XADCPS_CH_VPVN 0x3U /**< VP/VN Dedicated analog inputs */ +#define XADCPS_CH_VREFP 0x4U /**< VREFP */ +#define XADCPS_CH_VREFN 0x5U /**< VREFN */ +#define XADCPS_CH_VBRAM 0x6U /**< On-chip VBRAM Data Reg, 7 series */ +#define XADCPS_CH_SUPPLY_CALIB 0x07U /**< Supply Calib Data Reg */ +#define XADCPS_CH_ADC_CALIB 0x08U /**< ADC Offset Channel Reg */ +#define XADCPS_CH_GAINERR_CALIB 0x09U /**< Gain Error Channel Reg */ +#define XADCPS_CH_VCCPINT 0x0DU /**< On-chip PS VCCPINT Channel , Zynq */ +#define XADCPS_CH_VCCPAUX 0x0EU /**< On-chip PS VCCPAUX Channel , Zynq */ +#define XADCPS_CH_VCCPDRO 0x0FU /**< On-chip PS VCCPDRO Channel , Zynq */ +#define XADCPS_CH_AUX_MIN 16U /**< Channel number for 1st Aux Channel */ +#define XADCPS_CH_AUX_MAX 31U /**< Channel number for Last Aux channel */ + +/*@}*/ + + +/** + * @name Indexes for reading the Calibration Coefficient Data. + * @{ + */ +#define XADCPS_CALIB_SUPPLY_COEFF 0U /**< Supply Offset Calib Coefficient */ +#define XADCPS_CALIB_ADC_COEFF 1U /**< ADC Offset Calib Coefficient */ +#define XADCPS_CALIB_GAIN_ERROR_COEFF 2U /**< Gain Error Calib Coefficient*/ +/*@}*/ + + +/** + * @name Indexes for reading the Minimum/Maximum Measurement Data. + * @{ + */ +#define XADCPS_MAX_TEMP 0U /**< Maximum Temperature Data */ +#define XADCPS_MAX_VCCINT 1U /**< Maximum VCCINT Data */ +#define XADCPS_MAX_VCCAUX 2U /**< Maximum VCCAUX Data */ +#define XADCPS_MAX_VBRAM 3U /**< Maximum VBRAM Data */ +#define XADCPS_MIN_TEMP 4U /**< Minimum Temperature Data */ +#define XADCPS_MIN_VCCINT 5U /**< Minimum VCCINT Data */ +#define XADCPS_MIN_VCCAUX 6U /**< Minimum VCCAUX Data */ +#define XADCPS_MIN_VBRAM 7U /**< Minimum VBRAM Data */ +#define XADCPS_MAX_VCCPINT 8U /**< Maximum VCCPINT Register , Zynq */ +#define XADCPS_MAX_VCCPAUX 9U /**< Maximum VCCPAUX Register , Zynq */ +#define XADCPS_MAX_VCCPDRO 0xAU /**< Maximum VCCPDRO Register , Zynq */ +#define XADCPS_MIN_VCCPINT 0xCU /**< Minimum VCCPINT Register , Zynq */ +#define XADCPS_MIN_VCCPAUX 0xDU /**< Minimum VCCPAUX Register , Zynq */ +#define XADCPS_MIN_VCCPDRO 0xEU /**< Minimum VCCPDRO Register , Zynq */ + +/*@}*/ + + +/** + * @name Alarm Threshold(Limit) Register (ATR) indexes. + * @{ + */ +#define XADCPS_ATR_TEMP_UPPER 0U /**< High user Temperature */ +#define XADCPS_ATR_VCCINT_UPPER 1U /**< VCCINT high voltage limit register */ +#define XADCPS_ATR_VCCAUX_UPPER 2U /**< VCCAUX high voltage limit register */ +#define XADCPS_ATR_OT_UPPER 3U /**< VCCAUX high voltage limit register */ +#define XADCPS_ATR_TEMP_LOWER 4U /**< Upper Over Temperature limit Reg */ +#define XADCPS_ATR_VCCINT_LOWER 5U /**< VCCINT high voltage limit register */ +#define XADCPS_ATR_VCCAUX_LOWER 6U /**< VCCAUX low voltage limit register */ +#define XADCPS_ATR_OT_LOWER 7U /**< Lower Over Temperature limit */ +#define XADCPS_ATR_VBRAM_UPPER_ 8U /**< VRBAM Upper Alarm Reg, 7 Series */ +#define XADCPS_ATR_VCCPINT_UPPER 9U /**< VCCPINT Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VCCPAUX_UPPER 0xAU /**< VCCPAUX Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VCCPDRO_UPPER 0xBU /**< VCCPDRO Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VBRAM_LOWER 0xCU /**< VRBAM Lower Alarm Reg, 7 Series */ +#define XADCPS_ATR_VCCPINT_LOWER 0xDU /**< VCCPINT Lower Alarm Reg , Zynq */ +#define XADCPS_ATR_VCCPAUX_LOWER 0xEU /**< VCCPAUX Lower Alarm Reg , Zynq */ +#define XADCPS_ATR_VCCPDRO_LOWER 0xFU /**< VCCPDRO Lower Alarm Reg , Zynq */ + +/*@}*/ + + +/** + * @name Averaging to be done for the channels. + * @{ + */ +#define XADCPS_AVG_0_SAMPLES 0U /**< No Averaging */ +#define XADCPS_AVG_16_SAMPLES 1U /**< Average 16 samples */ +#define XADCPS_AVG_64_SAMPLES 2U /**< Average 64 samples */ +#define XADCPS_AVG_256_SAMPLES 3U /**< Average 256 samples */ + +/*@}*/ + + +/** + * @name Channel Sequencer Modes of operation + * @{ + */ +#define XADCPS_SEQ_MODE_SAFE 0U /**< Default Safe Mode */ +#define XADCPS_SEQ_MODE_ONEPASS 1U /**< Onepass through Sequencer */ +#define XADCPS_SEQ_MODE_CONTINPASS 2U /**< Continuous Cycling Sequencer */ +#define XADCPS_SEQ_MODE_SINGCHAN 3U /**< Single channel -No Sequencing */ +#define XADCPS_SEQ_MODE_SIMUL_SAMPLING 4U /**< Simultaneous sampling */ +#define XADCPS_SEQ_MODE_INDEPENDENT 8U /**< Independent mode */ + +/*@}*/ + + + +/** + * @name Power Down Modes + * @{ + */ +#define XADCPS_PD_MODE_NONE 0U /**< No Power Down */ +#define XADCPS_PD_MODE_ADCB 1U /**< Power Down ADC B */ +#define XADCPS_PD_MODE_XADC 2U /**< Power Down ADC A and ADC B */ +/*@}*/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the XADC/ADC + * device. + */ +typedef struct { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + 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. +* @param Data is the value to be written to XADC register. +* +* @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 + */ +#ifndef SDT +XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId); +#else +XAdcPs_Config *XAdcPs_LookupConfig(u32 BaseAddress); +#endif + +/** + * Functions in xadcps.c + */ +int XAdcPs_CfgInitialize(XAdcPs *InstancePtr, + XAdcPs_Config *ConfigPtr, + u32 EffectiveAddr); + +void XAdcPs_SetConfigRegister(XAdcPs *InstancePtr, u32 Data); +u32 XAdcPs_GetConfigRegister(XAdcPs *InstancePtr); + +u32 XAdcPs_GetMiscStatus(XAdcPs *InstancePtr); + +void XAdcPs_SetMiscCtrlRegister(XAdcPs *InstancePtr, u32 Data); +u32 XAdcPs_GetMiscCtrlRegister(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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps_hw.h new file mode 100644 index 0000000..1477617 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xadcps_hw.h @@ -0,0 +1,478 @@ +/****************************************************************************** +* Copyright (C) 2011 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xadcps_hw.h +* @addtogroup Overview +* @{ +* +* 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
    +* 2.6   aad    11/02/20 Fix MISRAC Mandatory and Advisory errors.
    +*
    +* 
    +* +*****************************************************************************/ +#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 0x00U /**< Configuration Register */ +#define XADCPS_INT_STS_OFFSET 0x04U /**< Interrupt Status Register */ +#define XADCPS_INT_MASK_OFFSET 0x08U /**< Interrupt Mask Register */ +#define XADCPS_MSTS_OFFSET 0x0CU /**< Misc status register */ +#define XADCPS_CMDFIFO_OFFSET 0x10U /**< Command FIFO Register */ +#define XADCPS_RDFIFO_OFFSET 0x14U /**< Read FIFO Register */ +#define XADCPS_MCTL_OFFSET 0x18U /**< Misc control register */ + +/* @} */ + + + + + +/** @name XADC Config Register Bit definitions + * @{ + */ +#define XADCPS_CFG_ENABLE_MASK 0x80000000U /**< Enable access from PS mask */ +#define XADCPS_CFG_CFIFOTH_MASK 0x00F00000U /**< Command FIFO Threshold mask */ +#define XADCPS_CFG_DFIFOTH_MASK 0x000F0000U /**< Data FIFO Threshold mask */ +#define XADCPS_CFG_WEDGE_MASK 0x00002000U /**< Write Edge Mask */ +#define XADCPS_CFG_REDGE_MASK 0x00001000U /**< Read Edge Mask */ +#define XADCPS_CFG_TCKRATE_MASK 0x00000300U /**< Clock freq control */ +#define XADCPS_CFG_IGAP_MASK 0x0000001FU /**< 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 0x000003FFU /**< Alarm Signals Mask */ +#define XADCPS_INTX_CFIFO_LTH_MASK 0x00000200U /**< CMD FIFO less than threshold */ +#define XADCPS_INTX_DFIFO_GTH_MASK 0x00000100U /**< Data FIFO greater than threshold */ +#define XADCPS_INTX_OT_MASK 0x00000080U /**< Over temperature Alarm Status */ +#define XADCPS_INTX_ALM_ALL_MASK 0x0000007FU /**< Alarm Signals Mask */ +#define XADCPS_INTX_ALM6_MASK 0x00000040U /**< Alarm 6 Mask */ +#define XADCPS_INTX_ALM5_MASK 0x00000020U /**< Alarm 5 Mask */ +#define XADCPS_INTX_ALM4_MASK 0x00000010U /**< Alarm 4 Mask */ +#define XADCPS_INTX_ALM3_MASK 0x00000008U /**< Alarm 3 Mask */ +#define XADCPS_INTX_ALM2_MASK 0x00000004U /**< Alarm 2 Mask */ +#define XADCPS_INTX_ALM1_MASK 0x00000002U /**< Alarm 1 Mask */ +#define XADCPS_INTX_ALM0_MASK 0x00000001U /**< Alarm 0 Mask */ + +/* @} */ + + +/** @name XADC Miscellaneous Register Bit definitions + * @{ + */ +#define XADCPS_MSTS_CFIFO_LVL_MASK 0x000F0000U /**< Command FIFO Level mask */ +#define XADCPS_MSTS_DFIFO_LVL_MASK 0x0000F000U /**< Data FIFO Level Mask */ +#define XADCPS_MSTS_CFIFOF_MASK 0x00000800U /**< Command FIFO Full Mask */ +#define XADCPS_MSTS_CFIFOE_MASK 0x00000400U /**< Command FIFO Empty Mask */ +#define XADCPS_MSTS_DFIFOF_MASK 0x00000200U /**< Data FIFO Full Mask */ +#define XADCPS_MSTS_DFIFOE_MASK 0x00000100U /**< Data FIFO Empty Mask */ +#define XADCPS_MSTS_OT_MASK 0x00000080U /**< Over Temperature Mask */ +#define XADCPS_MSTS_ALM_MASK 0x0000007FU /**< Alarms Mask */ +/* @} */ + + +/** @name XADC Miscellaneous Control Register Bit definitions + * @{ + */ +#define XADCPS_MCTL_RESET_MASK 0x00000010U /**< Reset XADC */ +#define XADCPS_MCTL_FLUSH_MASK 0x00000001U /**< 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 0x00U /**< On-chip Temperature Reg */ +#define XADCPS_VCCINT_OFFSET 0x01U /**< On-chip VCCINT Data Reg */ +#define XADCPS_VCCAUX_OFFSET 0x02U /**< On-chip VCCAUX Data Reg */ +#define XADCPS_VPVN_OFFSET 0x03U /**< ADC out of VP/VN */ +#define XADCPS_VREFP_OFFSET 0x04U /**< On-chip VREFP Data Reg */ +#define XADCPS_VREFN_OFFSET 0x05U /**< On-chip VREFN Data Reg */ +#define XADCPS_VBRAM_OFFSET 0x06U /**< On-chip VBRAM , 7 Series */ +#define XADCPS_ADC_A_SUPPLY_CALIB_OFFSET 0x08U /**< ADC A Supply Offset Reg */ +#define XADCPS_ADC_A_OFFSET_CALIB_OFFSET 0x09U /**< ADC A Offset Data Reg */ +#define XADCPS_ADC_A_GAINERR_CALIB_OFFSET 0x0AU /**< ADC A Gain Error Reg */ +#define XADCPS_VCCPINT_OFFSET 0x0DU /**< On-chip VCCPINT Reg, Zynq */ +#define XADCPS_VCCPAUX_OFFSET 0x0EU /**< On-chip VCCPAUX Reg, Zynq */ +#define XADCPS_VCCPDRO_OFFSET 0x0FU /**< On-chip VCCPDRO Reg, Zynq */ + +/* + * XADC External Channel Registers + */ +#define XADCPS_AUX00_OFFSET 0x10U /**< ADC out of VAUXP0/VAUXN0 */ +#define XADCPS_AUX01_OFFSET 0x11U /**< ADC out of VAUXP1/VAUXN1 */ +#define XADCPS_AUX02_OFFSET 0x12U /**< ADC out of VAUXP2/VAUXN2 */ +#define XADCPS_AUX03_OFFSET 0x13U /**< ADC out of VAUXP3/VAUXN3 */ +#define XADCPS_AUX04_OFFSET 0x14U /**< ADC out of VAUXP4/VAUXN4 */ +#define XADCPS_AUX05_OFFSET 0x15U /**< ADC out of VAUXP5/VAUXN5 */ +#define XADCPS_AUX06_OFFSET 0x16U /**< ADC out of VAUXP6/VAUXN6 */ +#define XADCPS_AUX07_OFFSET 0x17U /**< ADC out of VAUXP7/VAUXN7 */ +#define XADCPS_AUX08_OFFSET 0x18U /**< ADC out of VAUXP8/VAUXN8 */ +#define XADCPS_AUX09_OFFSET 0x19U /**< ADC out of VAUXP9/VAUXN9 */ +#define XADCPS_AUX10_OFFSET 0x1AU /**< ADC out of VAUXP10/VAUXN10 */ +#define XADCPS_AUX11_OFFSET 0x1BU /**< ADC out of VAUXP11/VAUXN11 */ +#define XADCPS_AUX12_OFFSET 0x1CU /**< ADC out of VAUXP12/VAUXN12 */ +#define XADCPS_AUX13_OFFSET 0x1DU /**< ADC out of VAUXP13/VAUXN13 */ +#define XADCPS_AUX14_OFFSET 0x1EU /**< ADC out of VAUXP14/VAUXN14 */ +#define XADCPS_AUX15_OFFSET 0x1FU /**< 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 0x20U /**< Max Temperature Reg */ +#define XADCPS_MAX_VCCINT_OFFSET 0x21U /**< Max VCCINT Register */ +#define XADCPS_MAX_VCCAUX_OFFSET 0x22U /**< Max VCCAUX Register */ +#define XADCPS_MAX_VCCBRAM_OFFSET 0x23U /**< Max BRAM Register, 7 series */ +#define XADCPS_MIN_TEMP_OFFSET 0x24U /**< Min Temperature Reg */ +#define XADCPS_MIN_VCCINT_OFFSET 0x25U /**< Min VCCINT Register */ +#define XADCPS_MIN_VCCAUX_OFFSET 0x26U /**< Min VCCAUX Register */ +#define XADCPS_MIN_VCCBRAM_OFFSET 0x27U /**< Min BRAM Register, 7 series */ +#define XADCPS_MAX_VCCPINT_OFFSET 0x28U /**< Max VCCPINT Register, Zynq */ +#define XADCPS_MAX_VCCPAUX_OFFSET 0x29U /**< Max VCCPAUX Register, Zynq */ +#define XADCPS_MAX_VCCPDRO_OFFSET 0x2AU /**< Max VCCPDRO Register, Zynq */ +#define XADCPS_MIN_VCCPINT_OFFSET 0x2CU /**< Min VCCPINT Register, Zynq */ +#define XADCPS_MIN_VCCPAUX_OFFSET 0x2DU /**< Min VCCPAUX Register, Zynq */ +#define XADCPS_MIN_VCCPDRO_OFFSET 0x2EU /**< Min VCCPDRO Register,Zynq */ + /* Undefined 0x2F to 0x3E */ +#define XADCPS_FLAG_OFFSET 0x3FU /**< Flag Register */ + +/* + * XADC Configuration Registers + */ +#define XADCPS_CFR0_OFFSET 0x40U /**< Configuration Register 0 */ +#define XADCPS_CFR1_OFFSET 0x41U /**< Configuration Register 1 */ +#define XADCPS_CFR2_OFFSET 0x42U /**< Configuration Register 2 */ + +/* Test Registers 0x43 to 0x47 */ + +/* + * XADC Sequence Registers + */ +#define XADCPS_SEQ00_OFFSET 0x48U /**< Seq Reg 00 Adc Channel Selection */ +#define XADCPS_SEQ01_OFFSET 0x49U /**< Seq Reg 01 Adc Channel Selection */ +#define XADCPS_SEQ02_OFFSET 0x4AU /**< Seq Reg 02 Adc Average Enable */ +#define XADCPS_SEQ03_OFFSET 0x4BU /**< Seq Reg 03 Adc Average Enable */ +#define XADCPS_SEQ04_OFFSET 0x4CU /**< Seq Reg 04 Adc Input Mode Select */ +#define XADCPS_SEQ05_OFFSET 0x4DU /**< Seq Reg 05 Adc Input Mode Select */ +#define XADCPS_SEQ06_OFFSET 0x4EU /**< Seq Reg 06 Adc Acquisition Select */ +#define XADCPS_SEQ07_OFFSET 0x4FU /**< Seq Reg 07 Adc Acquisition Select */ + +/* + * XADC Alarm Threshold/Limit Registers (ATR) + */ +#define XADCPS_ATR_TEMP_UPPER_OFFSET 0x50U /**< Temp Upper Alarm Register */ +#define XADCPS_ATR_VCCINT_UPPER_OFFSET 0x51U /**< VCCINT Upper Alarm Reg */ +#define XADCPS_ATR_VCCAUX_UPPER_OFFSET 0x52U /**< VCCAUX Upper Alarm Reg */ +#define XADCPS_ATR_OT_UPPER_OFFSET 0x53U /**< Over Temp Upper Alarm Reg */ +#define XADCPS_ATR_TEMP_LOWER_OFFSET 0x54U /**< Temp Lower Alarm Register */ +#define XADCPS_ATR_VCCINT_LOWER_OFFSET 0x55U /**< VCCINT Lower Alarm Reg */ +#define XADCPS_ATR_VCCAUX_LOWER_OFFSET 0x56U /**< VCCAUX Lower Alarm Reg */ +#define XADCPS_ATR_OT_LOWER_OFFSET 0x57U /**< Over Temp Lower Alarm Reg */ +#define XADCPS_ATR_VBRAM_UPPER_OFFSET 0x58U /**< VBRAM Upper Alarm, 7 series */ +#define XADCPS_ATR_VCCPINT_UPPER_OFFSET 0x59U /**< VCCPINT Upper Alarm, Zynq */ +#define XADCPS_ATR_VCCPAUX_UPPER_OFFSET 0x5AU /**< VCCPAUX Upper Alarm, Zynq */ +#define XADCPS_ATR_VCCPDRO_UPPER_OFFSET 0x5BU /**< VCCPDRO Upper Alarm, Zynq */ +#define XADCPS_ATR_VBRAM_LOWER_OFFSET 0x5CU /**< VRBAM Lower Alarm, 7 Series */ +#define XADCPS_ATR_VCCPINT_LOWER_OFFSET 0x5DU /**< VCCPINT Lower Alarm, Zynq */ +#define XADCPS_ATR_VCCPAUX_LOWER_OFFSET 0x5EU /**< VCCPAUX Lower Alarm, Zynq */ +#define XADCPS_ATR_VCCPDRO_LOWER_OFFSET 0x5FU /**< VCCPDRO Lower Alarm, Zynq */ + +/* Undefined 0x60 to 0x7F */ + +/*@}*/ + + + +/** + * @name Configuration Register 0 (CFR0) mask(s) + * @{ + */ +#define XADCPS_CFR0_CAL_AVG_MASK 0x00008000U /**< Averaging enable Mask */ +#define XADCPS_CFR0_AVG_VALID_MASK 0x00003000U /**< Averaging bit Mask */ +#define XADCPS_CFR0_AVG1_MASK 0x00000000U /**< No Averaging */ +#define XADCPS_CFR0_AVG16_MASK 0x00001000U /**< Average 16 samples */ +#define XADCPS_CFR0_AVG64_MASK 0x00002000U /**< Average 64 samples */ +#define XADCPS_CFR0_AVG256_MASK 0x00003000U /**< Average 256 samples */ +#define XADCPS_CFR0_AVG_SHIFT 12U /**< Averaging bits shift */ +#define XADCPS_CFR0_MUX_MASK 0x00000800U /**< External Mask Enable */ +#define XADCPS_CFR0_DU_MASK 0x00000400U /**< Bipolar/Unipolar mode */ +#define XADCPS_CFR0_EC_MASK 0x00000200U /**< Event driven/ + * Continuous mode selection + */ +#define XADCPS_CFR0_ACQ_MASK 0x00000100U /**< Add acquisition by 6 ADCCLK */ +#define XADCPS_CFR0_CHANNEL_MASK 0x0000001FU /**< Channel number bit Mask */ + +/*@}*/ + +/** + * @name Configuration Register 1 (CFR1) mask(s) + * @{ + */ +#define XADCPS_CFR1_SEQ_VALID_MASK 0x0000F000U /**< Sequence bit Mask */ +#define XADCPS_CFR1_SEQ_SAFEMODE_MASK 0x00000000U /**< Default Safe Mode */ +#define XADCPS_CFR1_SEQ_ONEPASS_MASK 0x00001000U /**< Onepass through Seq */ +#define XADCPS_CFR1_SEQ_CONTINPASS_MASK 0x00002000U /**< Continuous Cycling Seq */ +#define XADCPS_CFR1_SEQ_SINGCHAN_MASK 0x00003000U /**< Single channel - No Seq */ +#define XADCPS_CFR1_SEQ_SIMUL_SAMPLING_MASK 0x00004000U /**< Simulataneous Sampling Mask */ +#define XADCPS_CFR1_SEQ_INDEPENDENT_MASK 0x00008000U /**< Independent Mode */ +#define XADCPS_CFR1_SEQ_SHIFT 12U /**< Sequence bit shift */ +#define XADCPS_CFR1_ALM_VCCPDRO_MASK 0x00000800U /**< Alm 6 - VCCPDRO, Zynq */ +#define XADCPS_CFR1_ALM_VCCPAUX_MASK 0x00000400U /**< Alm 5 - VCCPAUX, Zynq */ +#define XADCPS_CFR1_ALM_VCCPINT_MASK 0x00000200U /**< Alm 4 - VCCPINT, Zynq */ +#define XADCPS_CFR1_ALM_VBRAM_MASK 0x00000100U /**< Alm 3 - VBRAM, 7 series */ +#define XADCPS_CFR1_CAL_VALID_MASK 0x000000F0U /**< Valid Calibration Mask */ +#define XADCPS_CFR1_CAL_PS_GAIN_OFFSET_MASK 0x00000080U /**< Calibration 3 -Power + Supply Gain/Offset + Enable */ +#define XADCPS_CFR1_CAL_PS_OFFSET_MASK 0x00000040U /**< Calibration 2 -Power + Supply Offset Enable */ +#define XADCPS_CFR1_CAL_ADC_GAIN_OFFSET_MASK 0x00000020U /**< Calibration 1 -ADC Gain + Offset Enable */ +#define XADCPS_CFR1_CAL_ADC_OFFSET_MASK 0x00000010U /**< Calibration 0 -ADC Offset + Enable */ +#define XADCPS_CFR1_CAL_DISABLE_MASK 0x00000000U /**< No Calibration */ +#define XADCPS_CFR1_ALM_ALL_MASK 0x00000F0FU /**< Mask for all alarms */ +#define XADCPS_CFR1_ALM_VCCAUX_MASK 0x00000008U /**< Alarm 2 - VCCAUX Enable */ +#define XADCPS_CFR1_ALM_VCCINT_MASK 0x00000004U /**< Alarm 1 - VCCINT Enable */ +#define XADCPS_CFR1_ALM_TEMP_MASK 0x00000002U /**< Alarm 0 - Temperature */ +#define XADCPS_CFR1_OT_MASK 0x00000001U /**< Over Temperature Enable */ + +/*@}*/ + +/** + * @name Configuration Register 2 (CFR2) mask(s) + * @{ + */ +#define XADCPS_CFR2_CD_VALID_MASK 0xFF00U /** +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a adk 1/31/14 Added in bsp common folder for backward compatibility +* 7.0 aru 01/21/19 Modified the typedef of u32,u16,u8 +* 7.0 aru 02/06/19 Included stdint.h and stddef.h +* +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#ifndef XBASIC_TYPES_H /* prevent circular inclusions */ +#define XBASIC_TYPES_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** @name Legacy types + * Deprecated legacy types. + * @{ + */ +typedef uint8_t Xuint8; /**< unsigned 8-bit */ +typedef char Xint8; /**< signed 8-bit */ +typedef uint16_t Xuint16; /**< unsigned 16-bit */ +typedef short Xint16; /**< signed 16-bit */ +typedef uint32_t 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 + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcoresightpsdcc.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcoresightpsdcc.h new file mode 100644 index 0000000..7ace6c3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcoresightpsdcc.h @@ -0,0 +1,53 @@ +/****************************************************************************** +* Copyright (C) 2015 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xcoresightpsdcc.h +* @addtogroup coresightps_dcc Overview +* @{ +* @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.
    +* 1.5   sne    01/19/19 Fixed MISRA-C Violations CR#1025101.
    +*
    +* 
    +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#ifndef XCORESIGHTPSDCC_H /* prevent circular inclusions */ +#define XCORESIGHTPSDCC_H /* by using protection macros */ +#ifndef __MICROBLAZE__ +#include + +void XCoresightPs_DccSendByte(u32 BaseAddress, u8 Data); + +u8 XCoresightPs_DccRecvByte(u32 BaseAddress); +#endif +#endif +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9.h new file mode 100644 index 0000000..65a9db0 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9.h @@ -0,0 +1,18 @@ +/****************************************************************************** +* Copyright (c) 2021-2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ +#ifndef XIL_XCORTEXA9_H_ /* prevent circular inclusions */ +#define XIL_XCORTEXA9_H_ /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" + +/**************************** Type Definitions ******************************/ +typedef struct { + u32 CpuFreq; +} XCortexa9_Config; + +#endif /* XIL_XCORTEXA9_H_ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9_config.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9_config.h new file mode 100644 index 0000000..1a774f1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcortexa9_config.h @@ -0,0 +1,18 @@ +/****************************************************************************** +* Copyright (c) 2021-2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022-2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ +#ifndef XIL_XCORTEXA9_CONFIG_H_ /* prevent circular inclusions */ +#define XIL_XCORTEXA9_CONFIG_H_ /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xcortexa9.h" + +/************************** Variable Definitions ****************************/ +extern XCortexa9_Config XCortexa9_ConfigTable; + +/***************** Macros (Inline Functions) Definitions ********************/ +#define XGet_CpuFreq() XCortexa9_ConfigTable.CpuFreq +#endif /* XIL_XCORTEXA9_CONFIG_H_ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcpu_cortexa9.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcpu_cortexa9.h new file mode 100644 index 0000000..f6b3728 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xcpu_cortexa9.h @@ -0,0 +1,26 @@ +/****************************************************************************** +* Copyright (C) 2011 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xcpu_cortexa9.h +* @addtogroup cpu_cortexa9 Overview +* @{ +* @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 +# 2.7 mus 07/03/18 Updated tcl to not to add default flags forcefully into +# extra compiler flags. Now, user can remove default flags +# from extra compiler flags. It fixes CR#998768. +******************************************************************************/ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xddrps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xddrps.h new file mode 100644 index 0000000..271da20 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xddrps.h @@ -0,0 +1,41 @@ +/******************************************************************************* +* Copyright (C) 2015 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +*******************************************************************************/ + +/******************************************************************************/ +/** + * + * @file xddrps.h + * @addtogroup ddrps Overview + * @{ + * @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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdebug.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdebug.h new file mode 100644 index 0000000..74bfdb0 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdebug.h @@ -0,0 +1,78 @@ +/****************************************************************************** +* Copyright (C) 2002 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + + +#ifndef XDEBUG +#define XDEBUG + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xil_printf.h" + +#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_DEBUG_FIFO_REG 0x00000100U /* display register reads/writes */ +#define XDBG_DEBUG_FIFO_RX 0x00000101U /* receive debug messages */ +#define XDBG_DEBUG_FIFO_TX 0x00000102U /* transmit debug messages */ +#define XDBG_DEBUG_FIFO_ALL 0x0000010FU /* all fifo debug messages */ + +#define XDBG_DEBUG_TEMAC_REG 0x00000400U /* display register reads/writes */ +#define XDBG_DEBUG_TEMAC_RX 0x00000401U /* receive debug messages */ +#define XDBG_DEBUG_TEMAC_TX 0x00000402U /* transmit debug messages */ +#define XDBG_DEBUG_TEMAC_ALL 0x0000040FU /* all temac debug messages */ + +#define XDBG_DEBUG_TEMAC_ADPT_RX 0x00000800U /* receive debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_TX 0x00000801U /* transmit debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_IOCTL 0x00000802U /* ioctl debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_MISC 0x00000803U /* debug msg for other routines */ +#define XDBG_DEBUG_TEMAC_ADPT_ALL 0x0000080FU /* all temac adapter debug messages */ + + +#define xdbg_current_types (XDBG_DEBUG_GENERAL | XDBG_DEBUG_ERROR | XDBG_DEBUG_TEMAC_REG | XDBG_DEBUG_FIFO_RX | XDBG_DEBUG_FIFO_TX | XDBG_DEBUG_FIFO_REG) + +#define xdbg_stmnt(x) x + +/* In VxWorks, if _WRS_GNU_VAR_MACROS is defined, special syntax is needed for + * macros that accept variable number of arguments + */ +#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS) +#define xdbg_printf(type, args...) (((type) & xdbg_current_types) ? printf (## args) : 0) +#else /* ANSI Syntax */ +#define xdbg_printf(type, ...) (((type) & xdbg_current_types) ? printf (__VA_ARGS__) : 0) +#endif + +#define xdbg_exception_printf(type, ...) (((type) & xdbg_current_types) ? xil_printf (__VA_ARGS__) : 0) + +#else /* defined(DEBUG) && !defined(NDEBUG) */ + +#define xdbg_stmnt(x) /**< Debug statement */ + +/* See VxWorks comments above */ +#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS) +#define xdbg_printf(type, args...) +#else /* ANSI Syntax */ +#define xdbg_printf(...) /**< Debug printf */ +#endif +#endif /* defined(DEBUG) && !defined(NDEBUG) */ + +#ifdef __cplusplus +} +#endif + +#endif /* XDEBUG */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg.h new file mode 100644 index 0000000..694e3b3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg.h @@ -0,0 +1,393 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xdevcfg.h +* @addtogroup devcfg Overview +* @{ +* @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
    +* 3.8  Nava 06/21/23 Added support for system device-tree flow.
    +* 
    +* +******************************************************************************/ +#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 { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + u32 BaseAddr; /**< Base address of the device */ +#ifdef SDT + u32 IntrId; /** Bits[11:0] Interrupt-id Bits[15:12] + * trigger type and level flags */ + UINTPTR IntrParent; /** Bit[0] Interrupt parent type Bit[64/32:1] + * Parent base address */ +#endif +} 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. + */ +#ifndef SDT +XDcfg_Config *XDcfg_LookupConfig(u16 DeviceId); +#else +XDcfg_Config *XDcfg_LookupConfig(UINTPTR BaseAddress); +#endif + +/* + * 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg_hw.h new file mode 100644 index 0000000..3db7835 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdevcfg_hw.h @@ -0,0 +1,371 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.h +* @addtogroup devcfg Overview +* @{ +* +* 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.
    +* 3.8   Nava    06/21/23 Added support for system device-tree flow.
    +* 
    +* +******************************************************************************/ +#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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps.h new file mode 100644 index 0000000..4b98640 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps.h @@ -0,0 +1,347 @@ +/****************************************************************************** +* Copyright (C) 2009 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xdmaps.h +* @addtogroup dmaps Overview +* @{ +* @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.
    +* 2.4   adk    13/08/18 Fixed armcc compiler warnings in the driver CR-1008310.
    +* 2.8	sk     05/18/21 Modify all inline functions declarations from extern inline
    +*			to static inline to avoid the linkage conflict for IAR compiler.
    +* 2.9   aj     11/07/23 Added support for system device tree
    +* 
    +* +*****************************************************************************/ + +#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 { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + u32 BaseAddress; /**< Base address of device (IPIF) */ + +#ifdef SDT + u32 IntrId[9]; /** Bits[11:0] Interrupt-id Bits[15:12] + * trigger type and level flags */ + UINTPTR IntrParent; /** Bit[0] Interrupt parent type Bit[64/32:1] + * Parent base address */ +#endif +} 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); +int XDmaPs_Instr_DMARMB(char *DmaProg); +int XDmaPs_Instr_DMAWMB(char *DmaProg); + +/** + * To avoid linkage error,modify all inline functions from extern + * inline to static inline for IAR compiler + */ +#ifdef __ICCARM__ +static INLINE int XDmaPs_Instr_DMAEND(char *DmaProg); +static INLINE void XDmaPs_Memcpy4(char *Dst, char *Src); +static INLINE int XDmaPs_Instr_DMAGO(char *DmaProg, unsigned int Cn, + u32 Imm, unsigned int Ns); +static INLINE int XDmaPs_Instr_DMALD(char *DmaProg); +static INLINE int XDmaPs_Instr_DMALP(char *DmaProg, unsigned Lc, + unsigned LoopIterations); +static INLINE int XDmaPs_Instr_DMALPEND(char *DmaProg, char *BodyStart, unsigned Lc); +static INLINE int XDmaPs_Instr_DMAMOV(char *DmaProg, unsigned Rd, u32 Imm); +static INLINE int XDmaPs_Instr_DMANOP(char *DmaProg); +static INLINE int XDmaPs_Instr_DMASEV(char *DmaProg, unsigned int EventNumber); +static INLINE int XDmaPs_Instr_DMAST(char *DmaProg); +static INLINE unsigned XDmaPs_ToEndianSwapSizeBits(unsigned int EndianSwapSize); +static 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 + */ +#ifndef SDT +XDmaPs_Config *XDmaPs_LookupConfig(u16 DeviceId); +#else +XDmaPs_Config *XDmaPs_LookupConfig(UINTPTR BaseAddress); +u32 XDmaPs_GetDrvIndex(XDmaPs *InstancePtr, UINTPTR BaseAddress); +#endif + + +/* + * self-test functions in xdmaps_selftest.c + */ +int XDmaPs_SelfTest(XDmaPs *InstPtr); + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps_hw.h new file mode 100644 index 0000000..32c2c91 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xdmaps_hw.h @@ -0,0 +1,268 @@ +/****************************************************************************** +* Copyright (C) 2009 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xdmaps_hw.h +* @addtogroup dmaps Overview +* @{ +* +* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps.h new file mode 100644 index 0000000..a7db38d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps.h @@ -0,0 +1,857 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** + * + * @file xemacps.h +* @addtogroup emacps Overview +* @{ +* @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 supported 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
    + * 3.8   hk   07/19/18 Fixed CPP, GCC and doxygen warnings - CR-1006327
    + *	 hk   09/17/18 Fix PTP interrupt masks and cleanup comments.
    + * 3.9   hk   01/23/19 Add RX watermark support
    + * 3.11  sd   02/14/20 Add clock support
    + * 3.13  nsk  12/14/20 Updated the tcl to not to use the instance names.
    + *
    + * 
    + * + ****************************************************************************/ + +#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" +#if defined (XCLOCKING) +#include "xil_clocking.h" +#endif + +/************************** 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 + * parameter. + * + * @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 { +#ifdef SDT + char *Name; /**< Unique name of the device */ +#else + u16 DeviceId; /**< Unique ID of device */ +#endif + UINTPTR BaseAddress;/**< Physical base address of IPIF registers */ + u8 IsCacheCoherent; /**< Applicable only to A53 in EL1 mode; + * describes whether Cache Coherent or not */ +#ifdef SDT + u16 IntrId; + UINTPTR IntrParent; +#endif +#if defined (XCLOCKING) + u32 RefClk; /**< Input clock */ +#endif + u16 S1GDiv0; /**< 1Gbps Clock Divider 0 */ + u8 S1GDiv1; /**< 1Gbps Clock Divider 1 */ + u16 S100MDiv0; /**< 100Mbps Clock Divider 0 */ + u8 S100MDiv1; /**< 100Mbps Clock Divider 1 */ + u16 S10MDiv0; /**< 10Mbps Clock Divider 0 */ + u8 S10MDiv1; /**< 10Mbps Clock Divider 1 */ +} 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 *****************************/ + +/****************************************************************************/ +/** +* +* This macro sets RX watermark register. +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* @param High is the non-zero RX high watermark value. When SRAM fill level +* is above this, a pause frame will be sent. +* @param Low is the non-zero RX low watermark value. When SRAM fill level +* is below this, a zero length pause frame will be sent IF the last +* pause frame sent was non-zero. +* +* @return None +* +* @note +* +* Signature: void XEmacPs_SetRXWatermark(XEmacPs *InstancePtr, u16 High, +* u16 Low) +* +*****************************************************************************/ +#define XEmacPs_SetRXWatermark(InstancePtr, High, Low) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_RXWATERMARK_OFFSET, \ + (High & XEMACPS_RXWM_HIGH_MASK) | \ + ((Low << XEMACPS_RXWM_LOW_SHFT_MSK) & XEMACPS_RXWM_LOW_MASK) |) + +/****************************************************************************/ +/** +* +* This macro gets RX watermark register. +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return RX watermark register value +* +* @note +* +* Signature: void XEmacPs_GetRXWatermark(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_GetRXWatermark(InstancePtr) \ + XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_RXWATERMARK_OFFSET) +/* + * 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 + */ + +#ifndef SDT +XEmacPs_Config *XEmacPs_LookupConfig(u16 DeviceId); +#else +XEmacPs_Config *XEmacPs_LookupConfig(UINTPTR BaseAddress); +#endif + +/* + * 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bd.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bd.h new file mode 100644 index 0000000..264dfb7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bd.h @@ -0,0 +1,763 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** + * + * @file xemacps_bd.h +* @addtogroup emacps Overview +* @{ + * + * 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.
    + * 3.8   hk   08/18/18 Remove duplicate definition of XEmacPs_BdSetLength
    + * 3.8   mus  11/05/18 Support 64 bit DMA addresses for Microblaze-X platform.
    + *
    + * 
    + * + * *************************************************************************** + */ + +#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) + * + *****************************************************************************/ +#if defined(__aarch64__) || defined(__arch64__) +#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 receive 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) + * + *****************************************************************************/ +#if defined(__aarch64__) || defined(__arch64__) +#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))) + + +/*****************************************************************************/ +/** + * 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 InstancePtr is the pointer to XEmacps instance + * + * @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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bdring.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bdring.h new file mode 100644 index 0000000..017669d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_bdring.h @@ -0,0 +1,216 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.h +* @addtogroup emacps Overview +* @{ +* +* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_hw.h new file mode 100644 index 0000000..765411d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xemacps_hw.h @@ -0,0 +1,664 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xemacps_hw.h +* @addtogroup emacps Overview +* @{ +* +* 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.
    +* 3.8  hk   09/17/18 Fix PTP interrupt masks.
    +* 3.9  hk   01/23/19 Add RX watermark support
    +* 3.10 hk   05/16/19 Clear status registers properly in reset
    +* 3.18  sne 01/11/23 Add PCS control and status registers information.
    +* 
    +* +******************************************************************************/ + +#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_RXWATERMARK_OFFSET 0x0000007CU /**< RX watermark 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_PCS_CONTROL_OFFSET 0x00000200U /** PCS control register */ +#define XEMACPS_PCS_STATUS_OFFSET 0x00000204U /** PCS status register */ + +#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) + +#define XEMACPS_SR_ALL_MASK 0xFFFFFFFFU /**< Mask for full register */ + +/*@}*/ + +/** + * @name PCS control register bit definitions + * @{ + */ +#define XEMACPS_PCS_CON_AUTO_NEG_MASK 0x00001000U /**< Auto-negotiation */ +/*@}*/ + +/** + * @name PCS status register bit definitions + * @{ + */ +#define XEMACPS_PCS_STATUS_LINK_STATUS_MASK 0x00000004U /**< Link status */ +/*@}*/ + +/** + * @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 Pdelay_resp TXed */ +#define XEMACPS_IXR_PTPPDRTX_MASK 0x01000000U /**< PTP Pdelay_req TXed */ +#define XEMACPS_IXR_PTPPSRX_MASK 0x00800000U /**< PTP Pdelay_resp RXed */ +#define XEMACPS_IXR_PTPPDRRX_MASK 0x00400000U /**< PTP Pdelay_req RXed */ + +#define XEMACPS_IXR_PTPSTX_MASK 0x00200000U /**< PTP Sync TXed */ +#define XEMACPS_IXR_PTPDRTX_MASK 0x00100000U /**< PTP Delay_req TXed */ +#define XEMACPS_IXR_PTPSRX_MASK 0x00080000U /**< PTP Sync RXed */ +#define XEMACPS_IXR_PTPDRRX_MASK 0x00040000U /**< PTP Delay_req RXed */ + +#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 */ +/*@}*/ + +/** @name RX watermark bit definitions + * @{ + */ +#define XEMACPS_RXWM_HIGH_MASK 0x0000FFFFU /**< RXWM high mask */ +#define XEMACPS_RXWM_LOW_MASK 0xFFFF0000U /**< RXWM low mask */ +#define XEMACPS_RXWM_LOW_SHFT_MSK 16U /**< Shift for RXWM low */ +/*@}*/ + +/* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv.h new file mode 100644 index 0000000..d8aef59 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv.h @@ -0,0 +1,169 @@ +/****************************************************************************** +* Copyright (c) 2002 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 */ + +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv_standalone.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv_standalone.h new file mode 100644 index 0000000..9794da0 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xenv_standalone.h @@ -0,0 +1,350 @@ +/****************************************************************************** +* Copyright (c) 2002 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +*
    +* 
    +* +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 implementation 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 */ + + /** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops.h new file mode 100644 index 0000000..ef3547f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops.h @@ -0,0 +1,314 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xgpiops.h +* @addtogroup gpiops Overview +* @{ +* @details +* +* The Xilinx PS GPIO driver. This driver supports the Xilinx PS GPIO +* Controller. +* +* The GPIO Controller supports the following features: +* - 6 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. +* +* Here is GPIO Bank and Pin mapping information for different platforms. +* Zynq: +* PS GPIO contain 4 banks and 118 pins +* Bank 0 MIO pins 0 - 31 +* Bank 1 MIO pins 32 - 53 +* Bank 2 MIO pins 54 - 85 +* Bank 3 EMIO signals 86 - 117 +* +* Zynq Ultrascale+ MP: +* PS GPIO contain 6 banks and 174 pins +* Bank 0 MIO pins 0 - 25 +* Bank 1 MIO pins 26 - 51 +* Bank 2 MIO pins 52 - 77 +* Bank 3 EMIO signals 78 - 109 +* Bank 4 EMIO signals 110 - 141 +* Bank 5 EMIO signals 142 - 173 + +* Versal: Two GPIOPS instances PMC GPIO and PS GPIO +* PMC GPIO contain 4 banks and 116 pins +* Bank 0 MIO pins 0 - 25 +* Bank 1 MIO pins 26 - 51 +* Bank 3 EMIO signals 52 - 83 +* Bank 4 EMIO signals 84 - 115 +* PS GPIO contains 2 banks and 58 pins +* Bank 0 MIO pins 0 - 25 +* Bank 3 EMIO signals 26-57 +* +* 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.
    +* 3.4   aru  08/17/18 Resolved MISRA-C mandatory violations. CR# 1007751
    +* 3.5   sne  03/01/19 Fixes violations according to MISRAC-2012
    +*                     in safety mode and modified the code such as
    +*                     Use of mixed mode arithmetic,Declared the pointer param
    +*                     as Pointer to const,Casting operation to a pointer,
    +*                     Literal value requires a U suffix.
    +* 3.5   sne  03/14/19 Added Versal support.
    +* 3.6   mus  04/05/19 Replaced XPLAT_versal macro with XPLAT_VERSAL, to be in
    +*                     sync with standalone BSP
    +* 3.6	sne  06/12/19 Fixed IAR compiler warning.
    +* 3.6   sne  08/14/19 Added interrupt handler support on versal.
    +* 3.7	sne  12/04/19 Reverted versal examples support.
    +* 3.8   sne  08/28/20 Modify Makefile to support parallel make execution.
    +* 3.8	sne  09/17/20 Added description for Versal PS and PMC GPIO pins.
    +* 3.9	sne  03/15/21 Fixed MISRA-C violations.
    +* 3.11  sg   02/23/23 Update bank and pin mapping information.
    +* 3.12  gm   07/11/23 Added SDT support.
    +*
    +* 
    +* +******************************************************************************/ +#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 */ +#define XGPIOPS_BANK4 0x04U /**< GPIO Bank 4 */ +#define XGPIOPS_BANK5 0x05U /**< GPIO Bank 5 */ + +#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 { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + UINTPTR BaseAddr; /**< Register base address */ +#ifdef SDT + u16 IntrId; /** Bits[11:0] Interrupt-id Bits[15:12] + * trigger type and level flags */ + UINTPTR IntrParent; /** Bit[0] Interrupt parent type Bit[64/32:1] + * Parent base address */ +#endif +} 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 */ + u32 PmcGpio; /**< Flag for accessing PS GPIO for versal*/ +} XGpioPs; + +/************************** Variable Definitions *****************************/ +extern XGpioPs_Config XGpioPs_ConfigTable[]; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/* Functions in xgpiops.c */ +s32 XGpioPs_CfgInitialize(XGpioPs *InstancePtr, const XGpioPs_Config *ConfigPtr, + u32 EffectiveAddr); + +/* Bank APIs in xgpiops.c */ +u32 XGpioPs_Read(const XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_Write(const XGpioPs *InstancePtr, u8 Bank, u32 Data); +void XGpioPs_SetDirection(const XGpioPs *InstancePtr, u8 Bank, u32 Direction); +u32 XGpioPs_GetDirection(const XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_SetOutputEnable(const XGpioPs *InstancePtr, u8 Bank, u32 OpEnable); +u32 XGpioPs_GetOutputEnable(const XGpioPs *InstancePtr, u8 Bank); +#ifdef versal +void XGpioPs_GetBankPin(const XGpioPs *InstancePtr,u8 PinNumber,u8 *BankNumber, u8 *PinNumberInBank); +#else +void XGpioPs_GetBankPin(u8 PinNumber,u8 *BankNumber, u8 *PinNumberInBank); +#endif + +/* Pin APIs in xgpiops.c */ +u32 XGpioPs_ReadPin(const XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_WritePin(const XGpioPs *InstancePtr, u32 Pin, u32 Data); +void XGpioPs_SetDirectionPin(const XGpioPs *InstancePtr, u32 Pin, u32 Direction); +u32 XGpioPs_GetDirectionPin(const XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_SetOutputEnablePin(const XGpioPs *InstancePtr, u32 Pin, u32 OpEnable); +u32 XGpioPs_GetOutputEnablePin(const XGpioPs *InstancePtr, u32 Pin); + +/* Diagnostic functions in xgpiops_selftest.c */ +s32 XGpioPs_SelfTest(const XGpioPs *InstancePtr); + +/* Functions in xgpiops_intr.c */ +/* Bank APIs in xgpiops_intr.c */ +void XGpioPs_IntrEnable(const XGpioPs *InstancePtr, u8 Bank, u32 Mask); +void XGpioPs_IntrDisable(const XGpioPs *InstancePtr, u8 Bank, u32 Mask); +u32 XGpioPs_IntrGetEnabled(const XGpioPs *InstancePtr, u8 Bank); +u32 XGpioPs_IntrGetStatus(const XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_IntrClear(const XGpioPs *InstancePtr, u8 Bank, u32 Mask); +void XGpioPs_SetIntrType(const XGpioPs *InstancePtr, u8 Bank, u32 IntrType, + u32 IntrPolarity, u32 IntrOnAny); +void XGpioPs_GetIntrType(const XGpioPs *InstancePtr, u8 Bank, u32 *IntrType, + u32 *IntrPolarity, u32 *IntrOnAny); +void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef, + XGpioPs_Handler FuncPointer); +void XGpioPs_IntrHandler(const XGpioPs *InstancePtr); + +/* Pin APIs in xgpiops_intr.c */ +void XGpioPs_SetIntrTypePin(const XGpioPs *InstancePtr, u32 Pin, u8 IrqType); +u8 XGpioPs_GetIntrTypePin(const XGpioPs *InstancePtr, u32 Pin); + +void XGpioPs_IntrEnablePin(const XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_IntrDisablePin(const XGpioPs *InstancePtr, u32 Pin); +u32 XGpioPs_IntrGetEnabledPin(const XGpioPs *InstancePtr, u32 Pin); +u32 XGpioPs_IntrGetStatusPin(const XGpioPs *InstancePtr, u32 Pin); +void XGpioPs_IntrClearPin(const XGpioPs *InstancePtr, u32 Pin); + +/* Functions in xgpiops_sinit.c */ +#ifndef SDT +XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId); +#else +XGpioPs_Config *XGpioPs_LookupConfig(u32 BaseAddress); +#endif +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops_hw.h new file mode 100644 index 0000000..3248dc2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xgpiops_hw.h @@ -0,0 +1,147 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.h +* @addtogroup gpiops Overview +* @{ +* +* 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.
    +* 3.5   sne  03/14/19 Added versal support.
    +* 
    +* +******************************************************************************/ +#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 /**< Mask for backward support */ + +/** @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 /**< Resets specific to Zynq Ultrascale+ MP */ +#define XGPIOPS_INTTYPE_BANK2_RESET 0x03FFFFFFU /**< Resets specific to Zynq Ultrascale+ MP */ +#else +#define XGPIOPS_INTTYPE_BANK0_RESET 0xFFFFFFFFU /**< Resets specific to Zynq */ +#define XGPIOPS_INTTYPE_BANK1_RESET 0x003FFFFFU /**< Resets specific to Zynq */ +#define XGPIOPS_INTTYPE_BANK2_RESET 0xFFFFFFFFU /**< Resets specific to Zynq */ +#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 /**< Resets specific to Zynq Ultrascale+ MP */ +/** @} */ +#define XGPIOPS_PS_GPIO_BASEADDR 0xFF0B0000U /**< Flag for Base Address for PS_GPIO in Versal */ +#define XGPIOPS_ZERO 0U /**< Flag for 0 Value */ +#define XGPIOPS_ONE 1U /**< Flag for 1 Value */ +#define XGPIOPS_TWO 2U /**< Flag for 2 Value */ +#define XGPIOPS_THREE 3U /**< Flag for 3 Value */ +#define XGPIOPS_FOUR 4U /**< Flag for 4 Value */ +#define XGPIOPS_SIX 6U /**< Flag for 6 Value */ + +/**************************** 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(UINTPTR BaseAddress); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XGPIOPS_HW_H */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_assert.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_assert.h new file mode 100644 index 0000000..e8b87b5 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_assert.h @@ -0,0 +1,176 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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); +/** + *@endcond + */ +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 +* accommodate 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 accommodate 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". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache.h new file mode 100644 index 0000000..7c94568 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache.h @@ -0,0 +1,107 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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.
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 9.0   ml   03/03/23 Updated function prototypes.
    +* 
    +* +******************************************************************************/ + +/** +*@cond nocomments +*/ + +#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 + +/** +*@endcond +*/ + +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". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_l.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_l.h new file mode 100644 index 0000000..21c8ced --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_l.h @@ -0,0 +1,75 @@ +/****************************************************************************** +* Copyright (c) 2010 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 
    +* +******************************************************************************/ +#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". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_vxworks.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_vxworks.h new file mode 100644 index 0000000..64079e7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cache_vxworks.h @@ -0,0 +1,75 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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 +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_clocking.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_clocking.h new file mode 100644 index 0000000..d40a6f7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_clocking.h @@ -0,0 +1,67 @@ +/****************************************************************************** +* Copyright (c) 2020 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xil_clocking.h +* +* The xil_clocking.h file contains clocking related functions and macros. +* certain conditions. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 7.2 sd  12/11/19 First release
    +* 7.2 sd  03/20/20 Added checking for isolation case
    +* 7.7 sk  01/10/22 Add function prototype for Xil_ClockGetRate to fix
    +* 		   misra_c_2012_rule_8_4 violation.
    +* 9.0 ml  03/03/23 Added description to fix doxygen warnings.
    +* 
    +* +******************************************************************************/ + +#ifndef XIL_CLOCKING_H /**< prevent circular inclusions */ +#define XIL_CLOCKING_H /**< by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xdebug.h" +#include "xil_printf.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xparameters.h" +#include "xstatus.h" +#if defined (XPAR_XCRPSU_0_DEVICE_ID) || defined(XPAR_PSU_CRL_APB_BASEADDR) +#include "xclockps.h" +#else +typedef u32 XClock_OutputClks; +typedef u64 XClockRate; +#endif + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + + +XStatus Xil_ClockDisable(XClock_OutputClks ClockId); +XStatus Xil_ClockEnable(XClock_OutputClks ClockId); +XStatus Xil_ClockInit(void); +XStatus Xil_ClockGet(void); +XStatus Xil_ClockSetRate(XClock_OutputClks ClockId, XClockRate Rate, XClockRate *SetRate); +XStatus Xil_ClockGetRate(XClock_OutputClks ClockId, XClockRate *Rate); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cryptoalginfo.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cryptoalginfo.h new file mode 100644 index 0000000..df95b88 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_cryptoalginfo.h @@ -0,0 +1,50 @@ +/******************************************************************************/ +/** +* Copyright (c) 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* @file xil_cryptoalginfo.h +* @{ +* @details +* +* Crypto algotithm information structure declaration. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 9.0   mmd      07/04/23 First release.
    +* 
    +* +*****************************************************************************/ +#ifndef XIL_CRYPTOALGINFO_H +#define XIL_CRYPTOALGINFO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" + +/**************************** Type Definitions *******************************/ +typedef enum _Xil_CryptoAlgNistStatus { + NOT_APPLICABLE = 0x00, + NIST_COMPLIANT = 0x11, + NIST_NON_COMPLIANT = 0xFE, +} Xil_CryptoAlgNistStatus; + +typedef struct _Xil_CryptoAlgInfo { + u32 Version; + Xil_CryptoAlgNistStatus NistStatus; +} Xil_CryptoAlgInfo; + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_CRYPTOALGINFO_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_errata.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_errata.h new file mode 100644 index 0000000..5923f44 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_errata.h @@ -0,0 +1,101 @@ +/****************************************************************************** +* Copyright (c) 2013 - 2022 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 7.7   asa  01/06/22 Removed errata 742230 and 743622. These are
    +*                     already fixed in Cortex-A9 r3p0, the revision
    +*                     that is being used in Zynq platforms.
    +* 
    +* +******************************************************************************/ +#ifndef XIL_ERRATA_H +#define XIL_ERRATA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + *@cond nocomments + */ +/** + * @name errata_definitions + * + * The errata conditions handled in the standalone BSP are listed below + * @{ + */ + +#define ENABLE_ARM_ERRATA 1 + +/** + *@endcond + */ + +#ifdef ENABLE_ARM_ERRATA + +/** + * 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 */ + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_ERRATA_H */ +/** +* @} End of "addtogroup a9_errata". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_exception.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_exception.h new file mode 100644 index 0000000..b517983 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_exception.h @@ -0,0 +1,532 @@ +/****************************************************************************** +* Copyright (c) 2015 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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.
    +* 7.0   mus      01/03/19 Tweak Xil_ExceptionEnableMask and
    +*                         Xil_ExceptionDisableMask macros to support legacy
    +*                         examples for Cortexa72 EL3 exception level.
    +* 7.3   mus      04/15/20 Added Xil_EnableNestedInterrupts and
    +*                         Xil_DisableNestedInterrupts macros for ARMv8.
    +*                         For Cortexa72, these macro's would not be supported
    +*                         at EL3, as Cortexa72 is using GIC-500(GICv3),  which
    +*                         triggeres only FIQ at EL3. Fix for CR#1062506
    +* 7.6   mus      09/17/21 Updated flag checking to fix warning reported with
    +*                         -Wundef compiler option CR#1110261
    +* 7.7   mus      01/31/22 Few of the #defines in xil_exception.h in are treated
    +*                         in different way based on "versal" flag. In existing
    +*                         flow, this flag is defined only in xparameters.h and
    +*                         BSP compiler flags, it is not defined in application
    +*                         compiler flags. So, including xil_exception.h in
    +*                         application source file, without including
    +*                         xparameters.h results  in incorrect behavior.
    +*                         Including xparameters.h in xil_exception.h to avoid
    +*                         such issues. It fixes CR#1120498.
    +* 8.0  mus       02/24/22 Updated few macros to support legacy driver examples
    +*                         for CortexR52. This is needed, as by default scugic
    +*                         driver configures interrupts as group0 and CortexR52
    +*                         GIC triggers FIQ for group0 interrupts.
    +* 8.0  sk	 03/02/22 Define XExc_VectorTableEntry structure to fix
    +* 			  misra_c_2012_rule_5_6 violation.
    +* 8.0  sk	 03/02/22 Add XExc_VectorTable as extern to fix misra_c_2012_
    +* 			  rule_8_4 violation.
    +* 8.1  asa       02/12/23 Updated data abort and prefetch abort fault
    +*                         status reporting for ARMv7.
    +*						  Updated Sync and SError fault status reporting
    +*						  for ARMv8.
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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" +#include "bspconfig.h" +#ifndef SDT +#include "xparameters.h" +#include "xdebug.h" +#endif + +#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 + +#ifdef DEBUG + +#if defined (__aarch64__) +#define ARMV8_SYNC_ERROR 0x01U +#define ARMV8_SERROR 0x02U + +#define ARMV8_FAR_VALUE_VALID 0x01U + +#define ARMV8_ESR_EC_SHIFT 26U +#define ARMV8_ESR_EC_MASK ((0x3FU) << ARMV8_ESR_EC_SHIFT) +#define ARMV8_EXTRACT_ESR_EC(Val) \ + (((Val) & ARMV8_ESR_EC_MASK) >> ARMV8_ESR_EC_SHIFT) + +#define ARMV8_ESR_IL_SHIFT (25U) +#define ARMV8_ESR_IL_MASK ((1U) << ARMV8_ESR_IL_SHIFT) +#define ARMV8_EXTRACT_ESR_IL(Val) \ + (((Val) & ARMV8_ESR_IL_MASK) >> ARMV8_ESR_IL_SHIFT) + +#define ARMV8_ESR_ISS_MASK (ARMV8_ESR_IL_MASK - 1U) +#define ARMV8_EXTRACT_ESR_ISS(Val) ((Val) & ARMV8_ESR_ISS_MASK) + + +#define ARMV8_ESR_EC_UNKNOWN_ERR 0x00U +#define ARMV8_ESR_EC_FP_ASIMD 0x07U +#define ARMV8_ESR_ILL_EXECUTION_STATE 0x0EU +#define ARMV8_ESR_EC_DATA_ABORT_LOWER 0x24U +#define ARMV8_ESR_EC_DATA_ABORT 0x25U +#define ARMV8_ESR_EC_INS_ABORT_LOWER 0x20U +#define ARMV8_ESR_EC_INS_ABORT 0x21U +#define ARMV8_ESR_EC_PC_ALIGNMENT_FAULT 0x22U +#define ARMV8_ESR_EC_SP_ALIGNMENT_FAULT 0x26U +#define ARMV8_ESR_EC_SERROR 0x2FU + + +/* ISS field definitions shared by different classes */ +#define ARMV8_ESR_ISS_WNR_SHIFT (6U) +#define ARMV8_ESR_ISS_WNR_MASK ((1U) << ARMV8_ESR_ISS_WNR_SHIFT) + +/* Asynchronous Error Type */ + +#define ARMV8_ESR_ISS_AET_SHIFT (10U) +#define ARMV8_ESR_ISS_AET_MASK ((0x7U) << ARMV8_ESR_ISS_AET_SHIFT) +#define ARMV8_ESR_ISS_AET_UC ((0U) << ARMV8_ESR_ISS_AET_SHIFT) +#define ARMV8_ESR_ISS_AET_UEU ((1U) << ARMV8_ESR_ISS_AET_SHIFT) +#define ARMV8_ESR_ISS_AET_UEO ((2U) << ARMV8_ESR_ISS_AET_SHIFT) +#define ARMV8_ESR_ISS_AET_UER ((3U) << ARMV8_ESR_ISS_AET_SHIFT) +#define ARMV8_ESR_ISS_AET_CE ((6U) << ARMV8_ESR_ISS_AET_SHIFT) + + +/* Shared ISS fault status code(IFSC/DFSC) for Data/Instruction aborts */ +#define ARMV8_ESR_ISS_FSC (0x3FU) +#define ARMV8_ESR_ISS_CM_SHIFT (8U) +#define ARMV8_ESR_ISS_CM_MASK ((1U) << ARMV8_ESR_ISS_CM_SHIFT) + +#define ARMV8_LEVEL_0_ADDR_FAULT 0x00U +#define ARMV8_LEVEL_1_ADDR_FAULT 0x01U +#define ARMV8_LEVEL_2_ADDR_FAULT 0x02U +#define ARMV8_LEVEL_3_ADDR_FAULT 0x03U +#define ARMV8_LEVEL_0_TRANS_FAULT 0x04U +#define ARMV8_LEVEL_1_TRANS_FAULT 0x05U +#define ARMV8_LEVEL_2_TRANS_FAULT 0x06U +#define ARMV8_LEVEL_3_TRANS_FAULT 0x07U +#define ARMV8_LEVEL_0_ACCS_FLAG_FAULT 0x08U +#define ARMV8_LEVEL_1_ACCS_FLAG_FAULT 0x09U +#define ARMV8_LEVEL_2_ACCS_FLAG_FAULT 0x0AU +#define ARMV8_LEVEL_3_ACCS_FLAG_FAULT 0x0BU +#define ARMV8_LEVEL_0_PERMISSION_FAULT 0x0CU +#define ARMV8_LEVEL_1_PERMISSION_FAULT 0x0DU +#define ARMV8_LEVEL_2_PERMISSION_FAULT 0x0EU +#define ARMV8_LEVEL_3_PERMISSION_FAULT 0x0FU + +#define ARMV8_SYNC_EXT_ABORT_NOT_ON_TTW 0x10U +#define ARMV8_LEVEL_0_SYNC_EXT_ABORT 0x14U +#define ARMV8_LEVEL_1_SYNC_EXT_ABORT 0x15U +#define ARMV8_LEVEL_2_SYNC_EXT_ABORT 0x16U +#define ARMV8_LEVEL_3_SYNC_EXT_ABORT 0x17U + +#define ARMV8_SYNC_PAR_OR_ECC_ERROR_NOT_ON_TTW 0x18U +#define ARMV8_LEVEL_0_SYNC_PAR_OR_ECC_ERROR 0x1CU +#define ARMV8_LEVEL_1_SYNC_PAR_OR_ECC_ERROR 0x1DU +#define ARMV8_LEVEL_2_SYNC_PAR_OR_ECC_ERROR 0x1EU +#define ARMV8_LEVEL_3_SYNC_PAR_OR_ECC_ERROR 0x1FU + +#define ARMV8_ALIGNMENT_FAULT 0x21U +#define ARMV8_TLB_CONFLICT_ABORT 0x30U + +#define ARMV8_ASYNC_SEEROR_INTERRUPT 0x11U + +#else /* #if defined (__aarch64__) */ + +#define DATA_ABORT 0x00U +#define INS_PREFETCH_ABORT 0x01U +#define ARMV7_FAULT_STATUS_MASK_BIT3_0 0x0FU +#define ARMV7_DFAR_VALUE_VALID 0x01U +#define ARMV7_FAULT_STATUS_BIT10_MASK 0x400U + +#define ARMV7_BACKGROUND_FAULT 0x00U +#define ARMV7_ALIGNMENT_FAULT 0x01U +#define ARMV7_DEBUG_EVENT 0x02U +#define ARMV7_ACCESS_FLAG_FAULT 0x03U +#define ARMV7_ICACHE_MAINTENANCE_FAULT 0x04U +#define ARMV7_TRANSLATION_FAULT 0x05U +#define ARMV7_SYNC_EXT_ABORT 0x08U +#define ARMV7_DOMAIN_FAULT 0x09U +#define ARMV7_SYNC_ABORT_TRANSTAB_WALK 0x0CU +#define ARMV7_PERMISSION_FAULT 0x0DU +#define ARMV7_TLB_CONFLICT_ABORT 0x10U +#define ARMV7_ASYNC_EXT_ABORT 0x16U +#define ARMV7_MEM_ACS_ASYNC_PAR_ERR 0x18U +#define ARMV7_MEM_ACS_SYNC_PAR_ERR 0x19U +#define ARMV7_SYNCPAR_ERR_TRANSTAB_WALK 0x1CU + +#define EXTRACT_BITS_10_AND_3_TO_0(Val) \ + ((Val & (ARMV7_FAULT_STATUS_BIT10_MASK)) >> 6) | \ + (Val & ARMV7_FAULT_STATUS_MASK_BIT3_0) + +#endif /* #if defined (__aarch64__) */ +#endif /* #ifdef DEBUG */ + +/* + * XIL_EXCEPTION_ID_INT is defined for all Xilinx processors. + */ +#if (defined (versal) && !defined(ARMR5) && EL3) +#define XIL_EXCEPTION_ID_INT XIL_EXCEPTION_ID_FIQ_INT +#else +#define XIL_EXCEPTION_ID_INT XIL_EXCEPTION_ID_IRQ_INT +#endif + +/**************************** Type Definitions ******************************/ + +/** + * This typedef is the exception handler function. + */ +typedef void (*Xil_ExceptionHandler)(void *data); +typedef void (*Xil_InterruptHandler)(void *data); + +typedef struct { + Xil_ExceptionHandler Handler; + void *Data; +} XExc_VectorTableEntry; + +extern XExc_VectorTableEntry XExc_VectorTable[]; + +/** +*@endcond +*/ + +/***************** 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 (versal) && !defined(ARMR5) && EL3) +/* + * Cortexa72 processor in versal is coupled with GIC-500, and GIC-500 supports + * only FIQ at EL3. Hence, tweaking this macro to always enable FIQ + * ignoring argument passed by user. + */ +#define Xil_ExceptionEnableMask(Mask) \ + (void)Mask; \ + mtcpsr(mfcpsr() & ~ ((XIL_EXCEPTION_FIQ) & XIL_EXCEPTION_ALL)) +#elif 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. +* +******************************************************************************/ +#if (defined (versal) && !defined(ARMR5) && EL3) +#define Xil_ExceptionEnable() \ + Xil_ExceptionEnableMask(XIL_EXCEPTION_FIQ) +#else +#define Xil_ExceptionEnable() \ + Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ) +#endif + +/****************************************************************************/ +/** +* @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 (versal) && !defined(ARMR5) && EL3) +/* + * Cortexa72 processor in versal is coupled with GIC-500, and GIC-500 supports + * only FIQ at EL3. Hence, tweaking this macro to always disable FIQ + * ignoring argument passed by user. + */ +#define Xil_ExceptionDisableMask(Mask) \ + mtcpsr(mfcpsr() | ((XIL_EXCEPTION_FIQ) & XIL_EXCEPTION_ALL)) +#elif 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 (PLATFORM_ZYNQMP) && defined (EL3) && (EL3==1) ) +/****************************************************************************/ +/** +* @brief Enable nested interrupts by clearing the I bit in DAIF.This +* macro is defined for Cortex-A53 64 bit mode BSP configured to run +* at EL3.. However,it is not defined for Versal Cortex-A72 BSP +* configured to run at EL3. Reason is, Cortex-A72 is coupled +* with GIC-500(GICv3 specifications) and it triggers only FIQ at EL3. +* +* @return None. +* +* @note This macro is supposed to be used from interrupt handlers. In the +* interrupt handler the interrupts are disabled by default (I bit +* is set as 1). To allow nesting of interrupts, this macro should be +* used. It clears the I bit. Once that bit is 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 +* bit, there can be an infinite loop of interrupts with an +* eventual crash (all the stack space getting consumed). +******************************************************************************/ +#define Xil_EnableNestedInterrupts() \ + __asm__ __volatile__ ("mrs X1, ELR_EL3"); \ + __asm__ __volatile__ ("mrs X2, SPSR_EL3"); \ + __asm__ __volatile__ ("stp X1,X2, [sp,#-0x10]!"); \ + __asm__ __volatile__ ("mrs X1, DAIF"); \ + __asm__ __volatile__ ("bic X1,X1,#(0x1<<7)"); \ + __asm__ __volatile__ ("msr DAIF, X1"); \ + +/****************************************************************************/ +/** +* @brief Disable the nested interrupts by setting the I bit in DAIF. This +* macro is defined for Cortex-A53 64 bit mode BSP configured to run +* at EL3. +* +* @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 mode and +* hence sets back the I bit. +******************************************************************************/ +#define Xil_DisableNestedInterrupts() \ + __asm__ __volatile__ ("ldp X1,X2, [sp,#0x10]!"); \ + __asm__ __volatile__ ("msr ELR_EL3, X1"); \ + __asm__ __volatile__ ("msr SPSR_EL3, X2"); \ + __asm__ __volatile__ ("mrs X1, DAIF"); \ + __asm__ __volatile__ ("orr X1, X1, #(0x1<<7)"); \ + __asm__ __volatile__ ("msr DAIF, X1"); \ + +#elif (defined (EL1_NONSECURE) && (EL1_NONSECURE==1)) +/****************************************************************************/ +/** +* @brief Enable nested interrupts by clearing the I bit in DAIF.This +* macro is defined for Cortex-A53 64 bit mode and Cortex-A72 64 bit +* BSP configured to run at EL1 NON SECURE +* +* @return None. +* +* @note This macro is supposed to be used from interrupt handlers. In the +* interrupt handler the interrupts are disabled by default (I bit +* is set as 1). To allow nesting of interrupts, this macro should be +* used. It clears the I bit. Once that bit is 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 +* bit, there can be an infinite loop of interrupts with an +* eventual crash (all the stack space getting consumed). +******************************************************************************/ +#define Xil_EnableNestedInterrupts() \ + __asm__ __volatile__ ("mrs X1, ELR_EL1"); \ + __asm__ __volatile__ ("mrs X2, SPSR_EL1"); \ + __asm__ __volatile__ ("stp X1,X2, [sp,#-0x10]!"); \ + __asm__ __volatile__ ("mrs X1, DAIF"); \ + __asm__ __volatile__ ("bic X1,X1,#(0x1<<7)"); \ + __asm__ __volatile__ ("msr DAIF, X1"); \ + +/****************************************************************************/ +/** +* @brief Disable the nested interrupts by setting the I bit in DAIF. This +* macro is defined for Cortex-A53 64 bit mode and Cortex-A72 64 bit +* BSP configured to run at EL1 NON SECURE +* +* @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 mode and +* hence sets back the I bit. +******************************************************************************/ +#define Xil_DisableNestedInterrupts() \ + __asm__ __volatile__ ("ldp X1,X2, [sp,#0x10]!"); \ + __asm__ __volatile__ ("msr ELR_EL1, X1"); \ + __asm__ __volatile__ ("msr SPSR_EL1, X2"); \ + __asm__ __volatile__ ("mrs X1, DAIF"); \ + __asm__ __volatile__ ("orr X1, X1, #(0x1<<7)"); \ + __asm__ __volatile__ ("msr DAIF, X1"); \ + +#elif (!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); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_EXCEPTION_H */ +/** +* @} End of "addtogroup arm_exception_apis". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_hal.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_hal.h new file mode 100644 index 0000000..4b289a7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_hal.h @@ -0,0 +1,43 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xil_cache.h" +#include "xil_io.h" +#include "xil_assert.h" +#include "xil_exception.h" +#include "xil_types.h" + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_io.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_io.h new file mode 100644 index 0000000..382bc87 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_io.h @@ -0,0 +1,433 @@ +/****************************************************************************** +* Copyright (C) 2014 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 7.20  har      01/03/20 Added Xil_SecureOut32 for avoiding blindwrite for
    +*                         CR-1049218
    +* 7.30  kpt      09/21/20 Moved Xil_EndianSwap16 and Xil_EndianSwap32 to
    +*                         xil_io.h and made them as static inline
    +*       am       10/13/20 Changed the return type of Xil_SecureOut32 function
    +*                         from u32 to int
    +* 7.50  dp       02/12/21 Fix compilation error in Xil_EndianSwap32() that occur
    +*                         when -Werror=conversion compiler flag is enabled
    +* 7.5   mus      05/17/21 Update the functions with comments. It fixes CR#1067739.
    +* 9.0   ml       03/03/23 Add description and remove comments to fix doxygen warnings.
    +* 
    +******************************************************************************/ + +#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" +#include "xstatus.h" + +#if defined (__MICROBLAZE__) +#include "mb_interface.h" +#else +#include "xpseudo_asm.h" +#endif + +/************************** Function Prototypes ******************************/ +#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) /**< Instruction Synchronization Barrier */ +# define DATA_SYNC mbar(1) /**< Data Synchronization Barrier */ +# else +# define SYNCHRONIZE_IO dmb() /**< Data Memory Barrier */ +# define INST_SYNC isb() /**< Instruction Synchronization Barrier */ +# define DATA_SYNC dsb() /**< Data Synchronization Barrier */ +# endif +#else +# define SYNCHRONIZE_IO /**< Data Memory Barrier */ +# define INST_SYNC /**< Instruction Synchronization Barrier */ +# define DATA_SYNC /**< Data Synchronization Barrier */ +# define INST_SYNC /**< Instruction Synchronization Barrier */ +# define DATA_SYNC /**< Data Synchronization Barrier */ +#endif + +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__MICROBLAZE__) +#define INLINE inline /**< static inline keyword */ +#else +#define INLINE __inline /**> 8U) | ((Data & 0x00FFU) << 8U)); +} + +/*****************************************************************************/ +/** +* +* @brief Perform a 32-bit endian conversion. +* +* @param Data : 32 bit value to be converted +* +* @return 32 bit data with converted endianness +* +******************************************************************************/ +static INLINE __attribute__((always_inline)) 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 = (u16)(((LoWord & 0xFF00U) >> 8U) | ((LoWord & 0x00FFU) << 8U)); + HiWord = (u16)(((HiWord & 0xFF00U) >> 8U) | ((HiWord & 0x00FFU) << 8U)); + + /* swap the half words before returning the value */ + + return ((((u32)LoWord) << (u32)16U) | (u32)HiWord); +} + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +# define Xil_In16LE Xil_In16 /**< Register Read of 16 Bits in Little Endian */ +# define Xil_In32LE Xil_In32 /**< Register Read of 32 Bits in Little Endian */ +# define Xil_Out16LE Xil_Out16 /**< Register Write of 16 Bits in Little Endian */ +# define Xil_Out32LE Xil_Out32 /**< Register Write of 32 Bits in Little Endian */ +# define Xil_Htons Xil_EndianSwap16 /**< Endian swap of 16 bits */ +# define Xil_Htonl Xil_EndianSwap32 /**< Endian swap of 32 bits */ +# define Xil_Ntohs Xil_EndianSwap16 /**< Endian swap of 16 bits */ +# define Xil_Ntohl Xil_EndianSwap32 /**< Endian swap of 32 bits */ +# else +# define Xil_In16BE Xil_In16 /**< Register Read of 16 Bits in Big Endian */ +# define Xil_In32BE Xil_In32 /**< Register Read of 32 Bits in Big Endian */ +# define Xil_Out16BE Xil_Out16 /**< Register Write of 16 Bits in Big Endian */ +# define Xil_Out32BE Xil_Out32 /**< Register Write of 32 Bits in Big Endian */ +# define Xil_Htons(Data) (Data) /**< Endian swap of 16 bits */ +# define Xil_Htonl(Data) (Data) /**< Endian swap of 32 bits */ +# define Xil_Ntohs(Data) (Data) /**< Endian swap of 16 bits */ +# define Xil_Ntohl(Data) (Data) /**< Endian swap of 32 bits */ +#endif +#else +# define Xil_In16LE Xil_In16 /**< Register Read of 16 Bits in Little Endian */ +# define Xil_In32LE Xil_In32 /**< Register Read of 32 Bits in Little Endian */ +# define Xil_Out16LE Xil_Out16 /**< Register Write of 16 Bits in Little Endian */ +# define Xil_Out32LE Xil_Out32 /**< Register Write of 32 Bits in Little Endian */ +# define Xil_Htons Xil_EndianSwap16 /**< Endian swap of 16 bits */ +# define Xil_Htonl Xil_EndianSwap32 /**< Endian swap of 32 bits */ +# define Xil_Ntohs Xil_EndianSwap16 /**< Endian swap of 16 bits */ +# define Xil_Ntohl Xil_EndianSwap32 /**< Endian swap of 32 bits */ +#endif + +#if defined (__MICROBLAZE__) +#ifdef __LITTLE_ENDIAN__ +static INLINE u16 Xil_In16BE(UINTPTR Addr) /**< Static inline function to Read + Register of 16 Bits in Big Endian */ +#else +static INLINE u16 Xil_In16LE(UINTPTR Addr) /**< Static inline function to Read + Register of 16 Bits in Little Endian */ +#endif +#else +/** +* Static inline function to Read Register of 16 Bits in Big Endian. +**********************************************************************************/ +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) /**< Static inline function to Read + Register of 32 Bits in Big Endian */ +#else +static INLINE u32 Xil_In32LE(UINTPTR Addr) /**< Static inline function to Read + Register of 32 Bits in Little Endian */ +#endif +#else +/** +* Static inline function to Read Register of 32 Bits in Big Endian. +**********************************************************************************/ +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) /**< Static inline function to write + Register of 16 Bits in Big Endian */ +#else +static INLINE void Xil_Out16LE(UINTPTR Addr, u16 Value) /**< Static inline function to write + Register of 16 Bits in Little Endian */ +#endif +#else +/** +* Static inline function to write Register of 16 Bits in Big Endian. +**********************************************************************************/ +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) /**< Static inline function to write + Register of 32 Bits in Big Endian */ +#else +static INLINE void Xil_Out32LE(UINTPTR Addr, u32 Value) /**< Static inline function to write + Register of 32 Bits in Little Endian */ +#endif +#else +/** +* Static inline function to Read Register of 16 Bits in Big Endian. +**********************************************************************************/ +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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_macroback.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_macroback.h new file mode 100644 index 0000000..7a0135a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_macroback.h @@ -0,0 +1,1113 @@ +/****************************************************************************** +* Copyright (c) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + + +/*********************************************************************/ +/** + * @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 corresponding driver document for replacement. + * + *********************************************************************/ + +/** + *@cond nocomments + */ + +#ifndef XIL_MACROBACK_H +#define XIL_MACROBACK_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************************************************************/ +/** + * 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 + +/*********************************************************************/ +/** + * Macros for Driver XPmonPsv + * + *********************************************************************/ +#ifndef XpsvPmon_CfgInitialize +#define XpsvPmon_CfgInitialize XPmonPsv_CfgInitialize +#endif + +#ifndef XpsvPmon_LookupConfig +#define XpsvPmon_LookupConfig XPmonPsv_LookupConfig +#endif + +#ifndef XpsvPmon_WriteReg +#define XpsvPmon_WriteReg XPmonPsv_WriteReg +#endif + +#ifndef XpsvPmon_SetMetrics +#define XpsvPmon_SetMetrics XPmonPsv_SetMetrics +#endif + +#ifndef XpsvPmon_GetMetrics +#define XpsvPmon_GetMetrics XPmonPsv_GetMetrics +#endif + +#ifndef XpsvPmon_ResetCounter +#define XpsvPmon_ResetCounter XPmonPsv_ResetCounter +#endif + +#ifndef XpsvPmon_GetWriteCounter +#define XpsvPmon_GetWriteCounter XPmonPsv_GetWriteCounter +#endif + +#ifndef XpsvPmon_GetReadCounter +#define XpsvPmon_GetReadCounter XPmonPsv_GetReadCounter +#endif + +#ifndef XpsvPmon_EnableCounters +#define XpsvPmon_EnableCounters XPmonPsv_EnableCounters +#endif + +#ifndef XpsvPmon_StopCounter +#define XpsvPmon_StopCounter XPmonPsv_StopCounter +#endif + +#ifndef XpsvPmon_SetPort +#define XpsvPmon_SetPort XPmonPsv_SetPort +#endif + +#ifndef XpsvPmon_SetSrc +#define XpsvPmon_SetSrc XPmonPsv_SetSrc +#endif + +#ifndef XpsvPmon_Unlock +#define XpsvPmon_Unlock XPmonPsv_Unlock +#endif + +#ifndef XpsvPmon_Lock +#define XpsvPmon_Lock XPmonPsv_Lock +#endif + + +#ifndef XpsvPmon_RequestCounter +#define XpsvPmon_RequestCounter XPmonPsv_RequestCounter +#endif + +#ifndef XPmonpsv_Config +#define XPmonpsv_Config XPmonPsv_Config +#endif + +typedef XPmonPsv XpsvPmon; +#ifdef __cplusplus +} +#endif + +#endif +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mem.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mem.h new file mode 100644 index 0000000..5623dd9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mem.h @@ -0,0 +1,48 @@ +/******************************************************************************/ +/** +* Copyright (C) 2015 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* @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.
    +* 7.0   mus      01/07/19 Add cpp extern macro
    +* 9.0   ml       03/03/23 Add description to fix doxygen warnings.
    +* 
    +* +*****************************************************************************/ +#ifndef XIL_MEM_H /**< prevent circular inclusions */ +#define XIL_MEM_H /**< by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Function Prototypes *****************************/ + +void Xil_MemCpy(void* dst, const void* src, u32 cnt); + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_MEM_H */ +/** +* @} End of "addtogroup common_mem_operation_api". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_misc_psreset_api.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_misc_psreset_api.h new file mode 100644 index 0000000..de0ff25 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_misc_psreset_api.h @@ -0,0 +1,263 @@ +/****************************************************************************** +* Copyright (C) 2013 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @file xil_misc_psreset_api.h +* +* This file contains the various register definitions 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. +* 9.0 ml 03/03/23 Add description to fix doxygen warnings. +* +* +******************************************************************************/ + +#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 *****************************/ + +/** + *@cond nocomments + */ + +#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 + +/** + *@endcond + */ + +/**************************** 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mmu.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mmu.h new file mode 100644 index 0000000..d21e13a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_mmu.h @@ -0,0 +1,92 @@ +/****************************************************************************** +* Copyright (c) 2012 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @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
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 
    +* +* +******************************************************************************/ + +/** +*@cond nocomments +*/ + +#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)) + +/** +*@endcond +*/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SetTlbAttributes(INTPTR Addr, u32 attrib); +void Xil_EnableMMU(void); +void Xil_DisableMMU(void); +void* Xil_MemMap(UINTPTR PhysAddr, size_t size, u32 flags); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_MMU_H */ +/** +* @} End of "addtogroup a9_mmu_apis". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_printf.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_printf.h new file mode 100644 index 0000000..c69af0f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_printf.h @@ -0,0 +1,57 @@ +/****************************************************************************** +* Copyright (C) 1995 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +*******************************************************************************/ + #ifndef XIL_PRINTF_H + #define XIL_PRINTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include "xil_types.h" +#include "bspconfig.h" +#ifndef SDT +#include "xparameters.h" +#endif +#if defined (__aarch64__) && 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); + +/************************** Function Prototypes ******************************/ +/**< prints the statement */ +void xil_printf( const char8 *ctrl1, ...); +/**< This routine is equivalent to vprintf routine */ +void xil_vprintf(const char8 *ctrl1, va_list argp); +void print( const char8 *ptr); +extern void outbyte (char c); /**< To send byte */ +extern char inbyte(void); /**< To receive byte */ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_sleeptimer.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_sleeptimer.h new file mode 100644 index 0000000..adcb7e6 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_sleeptimer.h @@ -0,0 +1,120 @@ +/****************************************************************************** +* Copyright (C) 2017 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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.
    +* 7.0   mus  01/07/19 Add cpp extern macro
    +* 7.7	sk   01/10/22 Add explicit parentheses for EL3==1 to fix
    +* 		      misra_c_2012_rule_12_1 violation.
    +* 7.7	sk   01/10/22 Add void to XTime_StartTTCTimer function declaration
    +* 		      to fix misra_c_2012_rule_8_2 violation.
    +* 9.0   ml   03/03/23 Add description to fix doxygen warnings.
    +* 
    +*****************************************************************************/ + +/** + *@cond nocomments + */ +#ifndef XIL_SLEEPTIMER_H /* prevent circular inclusions */ +#define XIL_SLEEPTIMER_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************** 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) +#if defined (versal) +#define CRL_TTC_RST 0xFF5E0344U +#define CRL_TTC_BASE_RST_MASK 0x1U +#else +#define RST_LPD_IOU2 0xFF5E0238U +#define RST_LPD_IOU2_TTC_BASE_RESET_MASK 0x00000800U +#endif +#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 *******************************/ +/** + *@endcond + */ +/************************** Function Prototypes ******************************/ + +/**< This is a helper function used by sleep/usleep APIs to +* have delay in sec/usec */ +void Xil_SleepTTCCommon(u32 delay, u64 frequency); + +void XTime_StartTTCTimer(void); /**< This API starts the Triple + * Timer Counter */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_SLEEPTIMER_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_spinlock.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_spinlock.h new file mode 100644 index 0000000..b61d7d3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_spinlock.h @@ -0,0 +1,83 @@ +/****************************************************************************** +* Copyright (C) 2021 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xil_spinlock.h +* +* This header file contains function prototypes to be used while using Xilinx +* spinlocking mechanism. +* Please refer to file header contents of xil_spinlock.c to understand in +* detail the spinlocking mechanism. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 7.5 	asa		 02/16/21 First release
    +* 7.6	sk	 08/05/21 Add Boolean check and braces for Xil_IsSpinLockEnabled
    +* 			  if condition to fix misrac violations.
    +* 7.7	sk	 01/10/22 Update XIL_SPINLOCK_ENABLED from signed to unsigned to
    +* 			  fix misra_c_2012_rule_10_4 violation.
    +* 9.0   ml       03/03/23 Add description to fix doxygen warnings.
    +* 
    +* +******************************************************************************/ + +#ifndef XIL_SPINLOCK_H /**< prevent circular inclusions */ +#define XIL_SPINLOCK_H /**< by using protection macros */ + +/***************************** Include Files ********************************/ +#include "xil_types.h" +#include "xstatus.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if !defined (__aarch64__) && defined(__GNUC__) && !defined(__clang__) +/************************** Function Prototypes *****************************/ +u32 Xil_SpinLock(void); +u32 Xil_SpinUnlock(void); +u32 Xil_InitializeSpinLock(UINTPTR lockaddr, UINTPTR lockflagaddr, + u32 lockflag); +void Xil_ReleaseSpinLock(void); +u32 Xil_IsSpinLockEnabled(void); + +/************************** MACRO Definitions ****************************/ +#define XIL_SPINLOCK_LOCKVAL 0x10203040 +#define XIL_SPINLOCK_RESETVAL 0x40302010 +#define XIL_SPINLOCK_ENABLE 0x17273747 +#define XIL_SPINLOCK_ENABLED 0x17273747U +/***************** Macros (Inline Functions) Definitions ********************/ + +#endif /* !(__aarch64__) && (__GNUC__) && !(__clang__)*/ +/***************************************************************************/ +#if !defined (__aarch64__) && defined(__GNUC__) && !defined(__clang__) +#define XIL_SPINLOCK() \ + if(Xil_IsSpinLockEnabled()!=(u32)0) { \ + Xil_SpinLock(); } +#else +#define XIL_SPINLOCK() /**< protect multiple applications running at separate + * CPUs to write to the same register */ +#endif /* !(__aarch64__) && (__GNUC__) && !(__clang__)*/ + +#if !defined (__aarch64__) && defined(__GNUC__) && !defined(__clang__) +#define XIL_SPINUNLOCK() \ + if(Xil_IsSpinLockEnabled()!=(u32)0) { \ + Xil_SpinUnlock(); } +#else +#define XIL_SPINUNLOCK() /**< Release the lock previously taken */ +#endif /* !(__aarch64__) && (__GNUC__) && !(__clang__)*/ + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_SPINLOCK_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testcache.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testcache.h new file mode 100644 index 0000000..5798c21 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testcache.h @@ -0,0 +1,54 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 
    +* +******************************************************************************/ + +/** +*@cond nocomments +*/ + +#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 */ + +/** + *@endcond + */ + +/** +* @} End of "addtogroup common_test_utils". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testio.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testio.h new file mode 100644 index 0000000..5a1bda3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testio.h @@ -0,0 +1,76 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xil_testio.h +* +* @addtogroup common_test_utils Test Utilities for Memory and Caches +*

    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
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 + +/** + *@endcond + */ + +/**************************** 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testmem.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testmem.h new file mode 100644 index 0000000..9fddbc5 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_testmem.h @@ -0,0 +1,169 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xil_testmem.h +* @addtogroup common_test_utils Test Utilities for Memory and Caches +* +* - Cache test: xil_testcache.h contains utility functions to test cache. +* +* - I/O test: The Xil_testio.h file contains 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. +* +* - 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 boundary 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
    +* 7.5   mus  03/10/21 Added new set of Xil_TestMem32, Xil_TestMem16 and
    +*                     Xil_TestMem8 APIs to support memory test for memory
    +*                     regions mapped at extended addresses
    +*                     (addresses > 4 GB). These new set of APIs would be
    +*                     compiled only for 32 bit Microblaze processor, if
    +*                     XPAR_MICROBLAZE_ADDR_SIZE is greater than 32.
    +*                     It fixes CR#1089129.
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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" +#include "bspconfig.h" +#ifndef SDT +#include "xparameters.h" +#endif + +/************************** 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 +/* @} */ + +#if !defined(__aarch64__) && !defined(__arch64__) +#define NUM_OF_BITS_IN_BYTE 8U +#define NUM_OF_BYTES_IN_HW 2U +#define NUM_OF_BITS_IN_HW 16U +#define NUM_OF_BYTES_IN_WORD 4U +#define NUM_OF_BITS_IN_WORD 32U +#endif +/***************** Macros (Inline Functions) Definitions *********************/ + +/** + *@endcond + */ + +/************************** Function Prototypes ******************************/ + +/* xutil_testmem prototypes */ +#if defined(__MICROBLAZE__) && !defined(__arch64__) && (XPAR_MICROBLAZE_ADDR_SIZE > 32) +extern s32 Xil_TestMem32(u32 AddrLow, u32 AddrHigh, u32 Words, u32 Pattern, u8 Subtest); +extern s32 Xil_TestMem16(u32 AddrLow, u32 AddrHigh, u32 Words, u16 Pattern, u8 Subtest); +extern s32 Xil_TestMem8(u32 AddrLow, u32 AddrHigh, u32 Words, u8 Pattern, u8 Subtest); +#else +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); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_test_utils". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_types.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_types.h new file mode 100644 index 0000000..4c37fbc --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_types.h @@ -0,0 +1,230 @@ +/****************************************************************************** +* Copyright (c) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 7.00  mus  01/07/19 Add cpp extern macro
    +* 7.1   aru  08/19/19 Shift the value in UPPER_32_BITS only if it
    +*                     is 64-bit processor
    +* 8.1   dp   12/23/22 Updated UINTPTR and INTPTR to point to 64bit data types
    +*                     incase of microblaze 32-bit with extended address enabled
    +* 9.0   ml   14/04/23 Add parenthesis on sub-expression to fix misra-c violation.
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ +#ifndef XIL_TYPES_H /* prevent circular inclusions */ +#define XIL_TYPES_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "bspconfig.h" +#ifndef SDT +#include "xparameters.h" +#endif + +/************************** 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; + +#if defined(__MICROBLAZE__) && !defined(__arch64__) && \ + (XPAR_MICROBLAZE_ADDR_SIZE > 32) +typedef uint64_t UINTPTR; +typedef int64_t INTPTR; +#else +typedef uintptr_t UINTPTR; +typedef intptr_t INTPTR; +#endif + +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); + +#if defined (__riscv_xlen) && (__riscv_xlen == 64) +#define __arch64__ +#endif + +/** + * @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. + */ +#if defined (__aarch64__) || defined (__arch64__) +#define UPPER_32_BITS(n) ((u32)(((n) >> 16) >> 16)) +#else +#define UPPER_32_BITS(n) 0U +#endif +/** + * @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)) + +/** + * @brief Returns 0-31 bits of a number . + * @param n : Number being accessed. + * @return Bits 0-31 of number. + */ +#if defined (__aarch64__) || defined (__arch64__) +#define LEFT_SHIFT_BY_32_BITS(n) (u64)(((u64)n) << 32) +#else +#define LEFT_SHIFT_BY_32_BITS(n) 0U +#endif + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +#define TRUE 1U +#endif + +#ifndef FALSE +#define FALSE 0U +#endif + +#ifndef NULL +#define NULL 0U +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** + *@endcond + */ +/** +* @} End of "addtogroup common_types". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_util.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_util.h new file mode 100644 index 0000000..5852c38 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xil_util.h @@ -0,0 +1,336 @@ +/******************************************************************************/ +/** +* Copyright (C) 2019 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* @file xil_util.h +* @addtogroup common_utilities Common Utility APIs +* @{ +* @details +* +* xil_util.h file contains xil utility functions declarations +* Except few functions, most of these functions are wrappers to standard functions. +* The standard string functions do not validate the input and that results into +* buffer overflows. To avoid it, the wrapper function validates the input and +* then passed to standard function. There are few constant time functions +* ( xxx_CT() ) which are used to compare the data in constant time. +* The constant time functions should be used while comparing secure data +* like password, keys which prevent disclosing of the data using +* timing analysis. +* +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +* 6.4   mmd      04/21/19 First release.
    +* 6.5   kal      02/29/20 Added Xil_ConvertStringToHexBE API
    +* 7.3   kal      06/30/20 Converted Xil_Ceil macro to API
    +*       rpo      08/19/20 Added function for read, modify and write
    +*       bsv      08/21/20 Added XSECURE_TEMPORAL_CHECK macro to add
    +*                         redundancy in security critical functions, to avoid
    +*                         glitches from altering the return values of security
    +*                         critical functions. The macro requires a label to be
    +*                         passed to "go to" in case of error.
    +*      kpt       09/03/20 Added XSECURE_TEMPORAL_IMPL macro for redundancy
    +*      kal       09/22/20 Changed the param type from const char to const char*
    +*                         to avoid copying key onto stack
    +*      td        10/16/20 Added Xil_Strcpy, Xil_Strcat, Xil_SecureMemCpy and
    +*                         Xil_MemCmp functions
    +*      am        10/13/20 Resolved Coverity warning
    +*      td        11/19/20 Updated XSECURE_TEMPORAL_CHECK and
    +*                         XSECURE_TEMPORAL_IMPL to fix MISRA C Rule 15.3
    +* 7.4  am        11/26/20 Added Xil_StrCpyRange function
    +* 7.6  kpt       07/15/21 Added Xil_SecureZeroize function
    +* 7.7  kpt       11/09/21 Added Xil_SMemCmp, Xil_SMemCmp_CT, Xil_SMemCpy,
    +*                         Xil_SMemSet, Xil_SStrCat, Xil_SStrCmp, Xil_SStrCmp_CT
    +*                         Xil_SStrCpy functions
    +* 7.7	sk	 01/10/22 Update functions return type to fix misra_c_2012_
    +* 			  directive_4_6 violations.
    +*      mmd       02/28/22 Added Xil_SMemMove function prototype
    +* 8.0  adk       04/18/22 Added Xil_WaitForEventSet function prototype.
    +*      ssc       08/25/22 Added Xil_SecureRMW32 prototype
    +* 8.1  sa        09/29/22 Change the type of first argument passed to Xil_WaitForEvent
    +*			  API from u32 to UINTPTR for supporting 64 bit addressing.
    +* 8.1  sa        10/20/22 Change the type of first argument passed to Xil_WaitForEvents
    +*                         API from u32 to UINTPTR for supporting 64 bit addressing.
    +* 8.1  akm       01/02/23 Added Xil_RegisterPlmHandler() & Xil_PlmStubHandler() APIs.
    +*      bm        03/14/23 Added XSECURE_REDUNDANT_CALL and XSECURE_REDUNDANT_IMPL macros
    +*      sk        03/14/23 Added Status Check Glitch detect Macro
    +* 9.0  ml        03/03/23 Add description to fix doxygen warnings.
    +*      mmd       07/09/23 Added macro to build version
    +*      ml        09/13/23 Replaced numerical types (int) with proper typedefs(s32) to
    +*                         fix MISRA-C violations for Rule 4.6
    +* 
    +* +*****************************************************************************/ + +#ifndef XIL_UTIL_H_ +#define XIL_UTIL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************* Include Files ********************************/ +#include "xil_types.h" +#include "xil_io.h" +#include "xstatus.h" + +/*************************** Constant Definitions *****************************/ +#define XIL_SIZE_OF_NIBBLE_IN_BITS 4U /**< size of nibble in bits */ +#define XIL_SIZE_OF_BYTE_IN_BITS 8U /**< size of byte in bits */ + +#define XIL_MAX_HEX_STR_LEN 512U /**< Maximum string length handled by + Xil_ValidateHexStr function */ + +/****************** Macros (Inline Functions) Definitions *********************/ + +/******************************************************************************/ +/** + * + * Builds version number by concatenates 16-bit Major version and Minor version. + * + * @param Major is the 16-bit major version number + * @param Minor is the 16-bit minor version number + * + * @return 32-bit version number + * + ******************************************************************************/ +#define XIL_BUILD_VERSION(Major, Minor) (((Major) << 16U) | (Minor)) + +#ifdef __GNUC__ +/******************************************************************************/ +/** + * + * Updates the return value of the called function into Var and VarTmp variables + * for redundancy. This is to avoid glitches from altering the return values of + * security critical functions. + * + * @param Var is the variable which holds the return value of function + * executed + * @param VarTmp is the variable which holds the value stored in Var + * @param Function is the function to be executed + * @param Other params are arguments to the called function + * + * @return None + * + ******************************************************************************/ +#define XSECURE_TEMPORAL_IMPL(Var, VarTmp, Function, ...) \ + { \ + Var = XST_FAILURE; \ + VarTmp = XST_FAILURE; \ + Var = Function(__VA_ARGS__); \ + VarTmp = Var; \ + } + +/******************************************************************************/ +/** + * + * Adds redundancy while checking the status of the called function. + * This is to avoid glitches from altering the return values of security + * critical functions. The macro requires a label to be passed to "go to" + * in case of error. + * + * @param Label is the label defined in function and the control + * will jump to the label in case of XST_FAILURE + * @param Status is the variable which holds the return value of + * function executed + * @param Function is the function to be executed + * @param Other params are arguments to the called function + * + * @return None + * + ******************************************************************************/ +#define XSECURE_TEMPORAL_CHECK(Label, Status, Function, ...) \ + { \ + volatile int StatusTmp; \ + XSECURE_TEMPORAL_IMPL(Status, StatusTmp, Function, __VA_ARGS__); \ + if ((Status != XST_SUCCESS) || \ + (StatusTmp != XST_SUCCESS)) { \ + if (((Status) != (StatusTmp)) || \ + (Status == XST_SUCCESS)) { \ + Status = XST_GLITCH_ERROR; \ + }\ + goto Label; \ + } \ + } + +/******************************************************************************/ +/** + * + * Adds redundancy to the function call. This is to avoid glitches which can skip + * a function call and cause altering of the code flow in security critical + * functions. + * + * @param Status is the variable which holds the return value of + * function executed + * @param StatusTmp is the variable which holds the return value of + * redundant function call executed + * @param Function is the function to be executed + * @param Other params are arguments to the called function + * + * @return None + * + ******************************************************************************/ +#define XSECURE_REDUNDANT_CALL(Status, StatusTmp, Function, ...) \ + { \ + Status = Function(__VA_ARGS__); \ + StatusTmp = Function(__VA_ARGS__); \ + } + +/******************************************************************************/ +/** + * + * Adds redundancy to the function call. This is to avoid glitches which can skip + * a function call and cause altering of the code flow in security critical + * functions. + * + * @param Function is the function to be executed + * @param Other params are arguments to the called function + * + * @return None + * + ******************************************************************************/ +#define XSECURE_REDUNDANT_IMPL(Function, ...) \ + { \ + Function(__VA_ARGS__); \ + Function(__VA_ARGS__); \ + } + +/******************************************************************************/ +/** + * + * This Macro helps to detect glitches skipping the Status check + * in case of error. + * + * @param None + * + * @return None + * + ******************************************************************************/ +#define XSECURE_STATUS_CHK_GLITCH_DETECT(Status) \ + { \ + if (Status == XST_SUCCESS) { \ + Status = (int)XST_GLITCH_ERROR; \ + } \ + } + +#endif +/*************************** Function Prototypes ******************************/ +/**< Ceils the provided float value */ +s32 Xil_Ceil(float Value); + +/**< Converts input character to nibble */ +u32 Xil_ConvertCharToNibble(u8 InChar, u8 *Num); + +/**< Convert input hex string to array of 32-bits integers */ +u32 Xil_ConvertStringToHex(const char *Str, u32 *buf, u8 Len); + +#ifdef VERSAL_PLM +/**< Register PLM handler */ +void Xil_RegisterPlmHandler(void (*PlmAlive) (void)); + +/**< Call PLM handler */ +void Xil_PlmStubHandler(void); +#endif + +/**< Waits for specified event */ +u32 Xil_WaitForEvent(UINTPTR RegAddr, u32 EventMask, u32 Event, u32 Timeout); + +/**< Waits for specified events */ +u32 Xil_WaitForEvents(UINTPTR EventsRegAddr, u32 EventsMask, u32 WaitEvents, + u32 Timeout, u32 *Events); + +/**< Validate input hex character */ +u32 Xil_IsValidHexChar(const char *Ch); + +/**< Validate the input string contains only hexadecimal characters */ +u32 Xil_ValidateHexStr(const char *HexStr); + +/**< Convert string to hex numbers in little enidian format */ +u32 Xil_ConvertStringToHexLE(const char *Str, u8 *Buf, u32 Len); + +/**< Returns length of the input string */ +u32 Xil_Strnlen(const char *Str, u32 MaxLen); + +/**< Convert string to hex numbers in big endian format */ +u32 Xil_ConvertStringToHexBE(const char *Str, u8 *Buf, u32 Len); + +/**< Read, Modify and Write to an address*/ +void Xil_UtilRMW32(u32 Addr, u32 Mask, u32 Value); + +/**< Copies source string to destination string */ +s32 Xil_Strcpy(char *DestPtr, const char *SrcPtr, const u32 Size); + +/**< Copies specified range from source string to destination string */ +s32 Xil_StrCpyRange(const u8 *Src, u8 *Dest, u32 From, u32 To, u32 MaxSrcLen, + u32 MaxDstLen); + +/**< Appends string2 to string1 */ +s32 Xil_Strcat(char *Str1Ptr, const char *Str2Ptr, const u32 Size); + +/**< Copies Len bytes from source memory to destination memory */ +s32 Xil_SecureMemCpy(void *DestPtr, u32 DestPtrLen, const void *SrcPtr, u32 Len); + +/**< Compares Len bytes from memory1 and memory2 */ +s32 Xil_MemCmp(const void *Buf1Ptr, const void *Buf2Ptr, u32 Len); + +/**< Zeroizes the memory of given length */ +s32 Xil_SecureZeroize(u8 *DataPtr, const u32 Length); + +/**< Copies Len bytes from source memory to destination memory */ +s32 Xil_SMemCpy (void *Dest, const u32 DestSize, + const void *Src, const u32 SrcSize, const u32 CopyLen); + +/**< Copies Len bytes from source memory to destination memory, allows + overlapped memory between source and destination */ +s32 Xil_SMemMove(void *Dest, const u32 DestSize, + const void *Src, const u32 SrcSize, const u32 CopyLen); + +/**< Compares Len bytes between source and destination memory */ +s32 Xil_SMemCmp (const void *Src1, const u32 Src1Size, + const void *Src2, const u32 Src2Size, const u32 CmpLen); + +/**< Compares Len bytes between source and destination memory with constant time */ +s32 Xil_SMemCmp_CT (const void *Src1, const u32 Src1Size, + const void *Src2, const u32 Src2Size, const u32 CmpLen); + +/**< Sets the destination memory of given length with given data */ +s32 Xil_SMemSet (void *Dest, const u32 DestSize, + const u8 Data, const u32 Len); + +/**< Copies source string to destination string */ +s32 Xil_SStrCpy (u8 *DestStr, const u32 DestSize, + const u8 *SrcStr, const u32 SrcSize); + +/**< Compares source string with destination string */ +s32 Xil_SStrCmp (const u8 *Str1, const u32 Str1Size, + const u8 *Str2, const u32 Str2Size); + +/**< Compares source string with destination string with constant time */ +s32 Xil_SStrCmp_CT (const u8 *Str1, const u32 Str1Size, + const u8 *Str2, const u32 Str2Size); + +/**< Concatenates source string to destination string */ +s32 Xil_SStrCat (u8 *DestStr, const u32 DestSize, + const u8 *SrcStr, const u32 SrcSize); + +/**< Waits for event timeout */ +u32 Xil_WaitForEventSet(u32 Timeout, u32 NumOfEvents, volatile u32 *EventAddr, ...); + +/**< Implements Read Modify Writes securely */ +s32 Xil_SecureRMW32(UINTPTR Addr, u32 Mask, u32 Value); + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_UTIL_H_ */ +/** +* @} End of "addtogroup common_utilities". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xinterrupt_wrap.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xinterrupt_wrap.h new file mode 100644 index 0000000..423aa0e --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xinterrupt_wrap.h @@ -0,0 +1,84 @@ +/****************************************************************************** +* Copyright (C) 2021 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xinterrupt_wrap.h +* +* The xinterrupt_wrap.h file contains interrupt related functions and macros. +* +* @{ +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who    Date   Changes
    +* ----- ---- -------- -------------------------------------------------------
    +* 7.2   mus  22/11/21 First release of xil interrupt support
    +* 8.0	sk   03/17/22 Update XINTC_BASEADDR_MASK macro to unsigned to
    +* 		      fix misra_c_2012_rule_7_2 violation.
    +* 9.0   ml   03/03/23 Add description to fix doxygen warnings.
    +* 
    +* +******************************************************************************/ + +#ifndef XINTERRUPT_WRAP_H /**< prevent circular inclusions */ +#define XINTERRUPT_WRAP_H /**< by using protection macros */ + +#include "xil_types.h" +#include "xstatus.h" + +#ifdef XIL_INTERRUPT +#ifdef SDT +#include "xcommon_drv_config.h" +#else +#include "xparameters.h" +#endif +#include "xil_exception.h" + +#if defined(XPAR_AXI_INTC) +#include "xintc.h" +#endif + +#if defined(XPAR_SCUGIC) +#include "xscugic.h" +#define XSPI_INTR_OFFSET 32U +#endif + +#define XINTERRUPT_DEFAULT_PRIORITY 0xA0U /* AXI INTC doesnt support priority setting, it is default priority for GIC interrupts */ +#define XINTC_TYPE_IS_SCUGIC 0U +#define XINTC_TYPE_IS_INTC 1U +#define XINTR_IS_EDGE_TRIGGERED 3U +#define XINTR_IS_LEVEL_TRIGGERED 1U + +#define XINTC_TYPE_MASK 0x1 +#define XINTC_INTR_TYPE_MASK 0x100000 +#define XINTC_BASEADDR_MASK 0xFFFFFFFFFFFFFFFEU +#define XINTC_INTRID_MASK 0xFFF +#define XINTC_TRIGGER_MASK 0xF000 +#define XINTC_TRIGGER_SHIFT 12 +#define XINTC_INTR_TYPE_SHIFT 20U +#define XGet_IntcType(IntParent) (IntParent & XINTC_TYPE_MASK) +#define XGet_IntrType(IntId) ((IntId & XINTC_INTR_TYPE_MASK) >> XINTC_INTR_TYPE_SHIFT) +#define XGet_BaseAddr(IntParent) (IntParent & XINTC_BASEADDR_MASK) +#define XGet_IntrId(IntId) (IntId & XINTC_INTRID_MASK) +#define XGet_TriggerType(IntId) ((IntId & XINTC_TRIGGER_MASK) >> XINTC_TRIGGER_SHIFT) +#define XGet_IntrOffset(IntId) (( XGet_IntrType(IntId) == 1) ? 16 : 32) /* For PPI offset is 16 and for SPI it is 32 */ + +extern int XConfigInterruptCntrl(UINTPTR IntcParent); +extern int XConnectToInterruptCntrl(u32 IntrId, void *IntrHandler, void *CallBackRef, UINTPTR IntcParent); +extern int XDisconnectInterruptCntrl(u32 IntrId, UINTPTR IntcParent); +extern int XStartInterruptCntrl(u32 Mode, UINTPTR IntcParent); +extern void XEnableIntrId( u32 IntrId, UINTPTR IntcParent); +extern void XDisableIntrId( u32 IntrId, UINTPTR IntcParent); +extern void XSetPriorityTriggerType( u32 IntrId, u8 Priority, UINTPTR IntcParent); +extern void XGetPriorityTriggerType( u32 IntrId, u8 *Priority, u8 *Trigger, UINTPTR IntcParent); +extern void XStopInterruptCntrl( UINTPTR IntcParent); +extern void XRegisterInterruptHandler( void *IntrHandler, UINTPTR IntcParent); +extern int XSetupInterruptSystem(void *DriverInstance, void *IntrHandler, u32 IntrId, UINTPTR IntcParent, + u16 Priority); +#endif + +#endif /* end of protection macro */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc.h new file mode 100644 index 0000000..4df6d87 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc.h @@ -0,0 +1,155 @@ +/****************************************************************************** +* Copyright (c) 2011 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @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. +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 */ + +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc_counter.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc_counter.h new file mode 100644 index 0000000..31156ee --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xl2cc_counter.h @@ -0,0 +1,96 @@ +/****************************************************************************** +* Copyright (c) 2011 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 
    +* +******************************************************************************/ + +/** +*@cond nocomments +*/ + +#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 ****************************/ + +/** +*@endcond +*/ + +/************************** 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". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xlwipconfig.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xlwipconfig.h new file mode 100644 index 0000000..acec86b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xlwipconfig.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2001, 2002 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __XLWIPCONFIG_H_ +#define __XLWIPCONFIG_H_ + + +/* This is a generated file - do not edit */ + +#define XLWIP_CONFIG_INCLUDE_GEM 1 +#define XLWIP_CONFIG_EMAC_NUMBER 0 +#define XLWIP_CONFIG_N_TX_DESC 64 +#define XLWIP_CONFIG_N_RX_DESC 64 + +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters.h new file mode 100644 index 0000000..b9d630a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters.h @@ -0,0 +1,465 @@ +#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 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 125000000 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV0 8 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV1 1 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV0 8 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV1 5 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV0 8 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV1 50 +#define XPAR_PS7_ETHERNET_0_ENET_TSU_CLK_FREQ_HZ 0 + + +/******************************************************************/ + +#define XPAR_PS7_ETHERNET_0_IS_CACHE_COHERENT 0 +#define XPAR_XEMACPS_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 125000000 +#define XPAR_XEMACPS_0_ENET_SLCR_1000Mbps_DIV0 8 +#define XPAR_XEMACPS_0_ENET_SLCR_1000Mbps_DIV1 1 +#define XPAR_XEMACPS_0_ENET_SLCR_100Mbps_DIV0 8 +#define XPAR_XEMACPS_0_ENET_SLCR_100Mbps_DIV1 5 +#define XPAR_XEMACPS_0_ENET_SLCR_10Mbps_DIV0 8 +#define XPAR_XEMACPS_0_ENET_SLCR_10Mbps_DIV1 50 +#define XPAR_XEMACPS_0_ENET_TSU_CLK_FREQ_HZ 0 + + +/******************************************************************/ + + +/* Peripheral Definitions for peripheral MYDNA_READ_V1_0_0 */ +#define XPAR_MYDNA_READ_V1_0_0_BASEADDR 0x43C00000 +#define XPAR_MYDNA_READ_V1_0_0_HIGHADDR 0x43C0FFFF + + +/* Peripheral Definitions for peripheral PS7_AFI_0 */ +#define XPAR_PS7_AFI_0_S_AXI_BASEADDR 0xF8008000 +#define XPAR_PS7_AFI_0_S_AXI_HIGHADDR 0xF8008FFF + + +/* Peripheral Definitions for peripheral PS7_AFI_1 */ +#define XPAR_PS7_AFI_1_S_AXI_BASEADDR 0xF8009000 +#define XPAR_PS7_AFI_1_S_AXI_HIGHADDR 0xF8009FFF + + +/* Peripheral Definitions for peripheral PS7_AFI_2 */ +#define XPAR_PS7_AFI_2_S_AXI_BASEADDR 0xF800A000 +#define XPAR_PS7_AFI_2_S_AXI_HIGHADDR 0xF800AFFF + + +/* Peripheral Definitions for peripheral PS7_AFI_3 */ +#define XPAR_PS7_AFI_3_S_AXI_BASEADDR 0xF800B000 +#define XPAR_PS7_AFI_3_S_AXI_HIGHADDR 0xF800BFFF + + +/* Peripheral Definitions for peripheral PS7_DDRC_0 */ +#define XPAR_PS7_DDRC_0_S_AXI_BASEADDR 0xF8006000 +#define XPAR_PS7_DDRC_0_S_AXI_HIGHADDR 0xF8006FFF + + +/* Peripheral Definitions for peripheral PS7_GLOBALTIMER_0 */ +#define XPAR_PS7_GLOBALTIMER_0_S_AXI_BASEADDR 0xF8F00200 +#define XPAR_PS7_GLOBALTIMER_0_S_AXI_HIGHADDR 0xF8F002FF + + +/* Peripheral Definitions for peripheral PS7_GPV_0 */ +#define XPAR_PS7_GPV_0_S_AXI_BASEADDR 0xF8900000 +#define XPAR_PS7_GPV_0_S_AXI_HIGHADDR 0xF89FFFFF + + +/* Peripheral 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 + + +/* Peripheral 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 + + +/* Peripheral Definitions for peripheral PS7_L2CACHEC_0 */ +#define XPAR_PS7_L2CACHEC_0_S_AXI_BASEADDR 0xF8F02000 +#define XPAR_PS7_L2CACHEC_0_S_AXI_HIGHADDR 0xF8F02FFF + + +/* Peripheral Definitions for peripheral PS7_OCMC_0 */ +#define XPAR_PS7_OCMC_0_S_AXI_BASEADDR 0xF800C000 +#define XPAR_PS7_OCMC_0_S_AXI_HIGHADDR 0xF800CFFF + + +/* Peripheral Definitions for peripheral PS7_PL310_0 */ +#define XPAR_PS7_PL310_0_S_AXI_BASEADDR 0xF8F02000 +#define XPAR_PS7_PL310_0_S_AXI_HIGHADDR 0xF8F02FFF + + +/* Peripheral 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 + + +/* Peripheral 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 + + +/* Peripheral Definitions for peripheral PS7_RAM_0 */ +#define XPAR_PS7_RAM_0_S_AXI_BASEADDR 0x00000000 +#define XPAR_PS7_RAM_0_S_AXI_HIGHADDR 0x0003FFFF + + +/* Peripheral Definitions for peripheral PS7_RAM_1 */ +#define XPAR_PS7_RAM_1_S_AXI_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_1_S_AXI_HIGHADDR 0xFFFFFFFF + + +/* Peripheral Definitions for peripheral PS7_SCUC_0 */ +#define XPAR_PS7_SCUC_0_S_AXI_BASEADDR 0xF8F00000 +#define XPAR_PS7_SCUC_0_S_AXI_HIGHADDR 0xF8F000FC + + +/* Peripheral Definitions for peripheral PS7_SLCR_0 */ +#define XPAR_PS7_SLCR_0_S_AXI_BASEADDR 0xF8000000 +#define XPAR_PS7_SLCR_0_S_AXI_HIGHADDR 0xF8000FFF + + +/******************************************************************/ + + +/* Canonical Definitions for peripheral MYDNA_READ_V1_0_0 */ +#define XPAR_MYDNA_READ_V1_0_BASEADDR 0x43C00000 +#define XPAR_MYDNA_READ_V1_0_HIGHADDR 0x43C0FFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/******************************************************************/ + +/* 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 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 142857132 +#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 142857132 +#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_SLOT_TYPE 0 +#define XPAR_PS7_SD_0_CLK_50_SDR_ITAP_DLY 0 +#define XPAR_PS7_SD_0_CLK_50_SDR_OTAP_DLY 0 +#define XPAR_PS7_SD_0_CLK_50_DDR_ITAP_DLY 0 +#define XPAR_PS7_SD_0_CLK_50_DDR_OTAP_DLY 0 +#define XPAR_PS7_SD_0_CLK_100_SDR_OTAP_DLY 0 +#define XPAR_PS7_SD_0_CLK_200_SDR_OTAP_DLY 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 +#define XPAR_XSDPS_0_SLOT_TYPE 0 +#define XPAR_XSDPS_0_IS_CACHE_COHERENT 0 +#define XPAR_XSDPS_0_CLK_50_SDR_ITAP_DLY 0 +#define XPAR_XSDPS_0_CLK_50_SDR_OTAP_DLY 0 +#define XPAR_XSDPS_0_CLK_50_DDR_ITAP_DLY 0 +#define XPAR_XSDPS_0_CLK_50_DDR_OTAP_DLY 0 +#define XPAR_XSDPS_0_CLK_100_SDR_OTAP_DLY 0 +#define XPAR_XSDPS_0_CLK_200_SDR_OTAP_DLY 0 + + +/******************************************************************/ + +/* 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 100000000 +#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 100000000 +#define XPAR_XUARTPS_0_HAS_MODEM 0 + + +/******************************************************************/ + +/* Definition for input Clock */ +/* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters_ps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters_ps.h new file mode 100644 index 0000000..f8b4e00 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xparameters_ps.h @@ -0,0 +1,334 @@ +/****************************************************************************** +* Copyright (c) 2010 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @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. +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 compatibility + */ + +#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 compatibility */ +#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 + +/* + * Defines for interrupt wrapper API + * For more details about usage please refer xinterrupt_wrap.h + * Here Bits[11:0] represents interrupt id + * Bits[15:12] represents interrupt trigger type and level flags + */ +#define XPAR_PS7_SCUTIMER_0_INTERRUPT_ID 0x10000D +#define XPAR_PS7_TTC_0_INTERRUPT_ID 0x400A +#define XPAR_PS7_TTC_1_INTERRUPT_ID 0x400B +#define XPAR_PS7_TTC_2_INTERRUPT_ID 0x400C +#define XPAR_PS7_TTC_3_INTERRUPT_ID 0x4025 +#define XPAR_PS7_TTC_4_INTERRUPT_ID 0x4026 +#define XPAR_PS7_TTC_5_INTERRUPT_ID 0x4027 + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ + +/** + *@endcond + */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xplatform_info.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xplatform_info.h new file mode 100644 index 0000000..251a697 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xplatform_info.h @@ -0,0 +1,159 @@ +/****************************************************************************** +* Copyright (c) 2014 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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.
    +* 7.2    adk  08/01/20 Added versal support for the XGetPSVersion_Info function.
    +* 7.6    mus  08/23/21 Updated prototypes for functions which are not taking any
    +*                      arguments with void keyword. This has been done to fix
    +*                      compilation warnings with "-Wstrict-prototypes" flag.
    +*                      It fixes CR#1108601.
    +* 7.6    mus  08/30/21 Updated flag checking to fix compilation warnings
    +*                      reported with "-Wundef" flag.
    +* 7.7	 sk   01/10/22 Update XPLAT_INFO_MASK from signed to unsigned to fix
    +*		       misra_c_2012_rule_10_4 violation.
    +* 8.1    mus  02/13/23 Added new API's XGetCoreId and XGetClusterId. As of now
    +*                      they are supported only for VERSAL_NET APU and RPU.
    +* 9.0    mus 03/28/23 Added new API XGetBootStatus for VERSAL_NET. It can be
    +*                     used to identify type of boot (cold/warm).
    +* 9.0    mus 07/27/23 Updated XGetCoreId API to support A9, R5 and A53 processor
    +* 9.0    ml  09/14/23 Added U to numerical to fix MISRA-C violation for Rule
    +*                     10.1 and 10.4
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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 *****************************/ +#if defined (versal) +#define XPAR_PMC_TAP_BASEADDR 0xF11A0000U +#define XPAR_PMC_TAP_VERSION_OFFSET 0x00000004U +#define XPLAT_PS_VERSION_ADDRESS (XPAR_PMC_TAP_BASEADDR + \ + XPAR_PMC_TAP_VERSION_OFFSET) +#else +#define XPAR_CSU_BASEADDR 0xFFCA0000U +#define XPAR_CSU_VER_OFFSET 0x00000044U +#define XPLAT_PS_VERSION_ADDRESS (XPAR_CSU_BASEADDR + \ + XPAR_CSU_VER_OFFSET) +#endif +#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 XPLAT_VERSAL 0x6U + +#define XPS_VERSION_1 0x0 +#define XPS_VERSION_2 0x1 +#define XPLAT_INFO_MASK (0xFU) + +#if defined (versal) +#define XPS_VERSION_INFO_MASK 0xFF00U +#define XPS_VERSION_INFO_SHIFT 0x8U +#define XPLAT_INFO_SHIFT 0x18U +#else +#define XPS_VERSION_INFO_MASK 0xFU +#define XPS_VERSION_INFO_SHIFT 0x0U +#define XPLAT_INFO_SHIFT 0xCU +#endif + +#if defined (VERSAL_NET) +#if defined (ARMR52) +#define XPS_NUM_OF_CORES_PER_CLUSTER 2U +#define XPS_RPU_PCIL_A0_PWRDWN 0xEB4200C0U +/* + * Offset between RPU_PCIL_X_PWRDWN registers of consecutive + * CPU cores in given cluster + */ +#define XPS_RPU_PCIL_CORE_OFFSET 0x100U + +/* + * Offset between RPU_PCIL_A0_PWRDWN registers of 2 clusters + */ +#define XPS_RPU_PCIL_CLUSTER_OFFSET 0x1000U +#define XPS_RPU_PCIL_X_PWRDWN_EN_MASK 1U +#else +#define XPS_NUM_OF_CORES_PER_CLUSTER 4U +#define XPS_CORE_X_PWRDWN_BASEADDR 0xECB10000U +/* + * Offset between CORE_X_PWRDWN registers of consecutive + * CPU cores + */ +#define XPS_CORE_X_PWRDWN_OFFSET 48U +#define XPS_CORE_X_PWRDWN_EN_MASK 1U +#endif +#endif +/**************************** Type Definitions *******************************/ +/** + *@endcond + */ +/***************** Macros (Inline Functions) Definitions *********************/ + + +u32 XGetPlatform_Info(void); +#if ! defined(__microblaze__) && ! defined(__riscv) +u8 XGetCoreId(void); +#endif + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) || defined (PSU_PMU) || defined (versal) +u32 XGetPSVersion_Info(void); +#endif + +#if defined (ARMR5) || defined (__aarch64__) || defined (ARMA53_32) +u32 XGet_Zynq_UltraMp_Platform_info(void); +#endif + +#if (defined (__aarch64__) && defined (VERSAL_NET)) || defined (ARMR52) +u8 XGetClusterId(void); +u8 XGetCoreId(void); +u8 XGetBootStatus(void); +#endif + +/************************** Function Prototypes ******************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** +* @} End of "addtogroup common_platform_info". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_counter.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_counter.h new file mode 100644 index 0000000..8b09ef5 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_counter.h @@ -0,0 +1,575 @@ +/****************************************************************************** +* Copyright (c) 2011 - 2022 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 8.0   mus  07/07/22 Added prototype for new APIs as per consolidated
    +*                     xpm_counter.c.
    +* 
    +* +******************************************************************************/ + +/** +*@cond nocomments +*/ + +#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 + +#define XPM_NO_COUNTERS_AVAILABLE 0xFFU +#define XPM_MAX_EVENTHANDLER_ID 0x6U +#define XPM_EVENT_CNTRS_BIT_MASK 0x3FU +#define XPM_ALL_EVENT_CNTRS_IN_USE 0x3FU +#define XPM_EVENT_CNTRS_MASK 0x3FU +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ +#if defined(__GNUC__) +#define Xpm_ReadCycleCounterVal() mfcp(XREG_CP15_PERF_CYCLE_COUNTER) +#elif defined (__ICCARM__) +#define Xpm_ReadCycleCounterVal(val) mfcp(XREG_CP15_PERF_CYCLE_COUNTER,val) +#endif +/************************** Variable Definitions ****************************/ + +/** +*@endcond +*/ + +/************************** Function Prototypes *****************************/ + +/* Interface functions to access performance counters from abstraction layer */ +void Xpm_SetEvents(s32 PmcrCfg); +void Xpm_GetEventCounters(u32 *PmCtrValue); +u32 Xpm_DisableEvent(u32 EventCntrId); +void Xpm_DisableEventCounters(void); +void Xpm_EnableEventCounters (void); +void Xpm_ResetEventCounters (void); +u32 Xpm_SetUpAnEvent(u32 EventID); +u32 Xpm_GetEventCounter(u32 EventCntrId, u32 *CntVal); + +#ifdef __cplusplus +} +#endif + +#endif +/** +* @} End of "addtogroup a9_event_counter_apis". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_init.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_init.h new file mode 100644 index 0000000..f2856be --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpm_init.h @@ -0,0 +1,46 @@ +/****************************************************************************** +*Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +*SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xpm_init.h +* @addtogroup xpm_init xpm_init APIs +*
    +* MODIFICATION HISTORY:
    +*
    +* Ver   Who      Date     Changes
    +* ----- -------- -------- -----------------------------------------------
    +*  1.0  gm      14/06/23 Initial release.
    +* 
    +******************************************************************************/ + +#ifndef XPM_INIT_H +#define XPM_INIT_H + +/************************** Constant Definitions *****************************/ + +#if defined (XPM_SUPPORT) +#ifdef VERSAL_NET +#define MAX_NODE_COUNT 38 +#elif defined(versal) +#define MAX_NODE_COUNT 33 +#endif + +/**************************** Type Definitions *******************************/ + +typedef struct { + UINTPTR BaseAddress; + UINTPTR NodeId; + UINTPTR ResetId; +} XpmNodeInfo; + +/************************** Function Prototypes ******************************/ + +UINTPTR XpmGetNodeId(UINTPTR BaseAddress); +UINTPTR XpmGetResetId(UINTPTR BaseAddress); + +#endif +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm.h new file mode 100644 index 0000000..6d07851 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm.h @@ -0,0 +1,60 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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.
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 
    +* +******************************************************************************/ +#ifndef XPSEUDO_ASM_H +#define XPSEUDO_ASM_H + +#ifdef __cplusplus +extern "C" { +#endif + +#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 + +#ifdef __cplusplus +} +#endif + +#endif /* XPSEUDO_ASM_H */ +/** +* @} End of "addtogroup a9_specific". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm_gcc.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm_gcc.h new file mode 100644 index 0000000..b8517d3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xpseudo_asm_gcc.h @@ -0,0 +1,285 @@ +/****************************************************************************** +* Copyright (c) 2014 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 7.2   asa      04/03/20 Renamed the str macro to strw.
    +* 7.2   dp       04/30/20 Added clobber "cc" to mtcpsr for aarch32 processors
    +* 8.0   mus      02/24/22 Added macro mfcpnotoken and mtcpnotoken.
    +* 8.1   asa      02/13/23 Create macros to read ESR, FAR and ELR registers.
    +* 
    +* +******************************************************************************/ + +/** + *@cond nocomments + */ + +#ifndef XPSEUDO_ASM_GCC_H /* prevent circular inclusions */ +#define XPSEUDO_ASM_GCC_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "bspconfig.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;\ + }) + +#if (EL3 == 1) +#define mfelrel3() ({u64 rval = 0U; \ + asm volatile("mrs %0, ELR_EL3" : "=r" (rval));\ + rval;\ + }) +#define mfesrel3() ({u64 rval = 0U; \ + asm volatile("mrs %0, ESR_EL3" : "=r" (rval));\ + rval;\ + }) + +#define mffarel3() ({u64 rval = 0U; \ + asm volatile("mrs %0, FAR_EL3" : "=r" (rval));\ + rval;\ + }) + +#else +#define mfelrel1() ({u64 rval = 0U; \ + asm volatile("mrs %0, ELR_EL1" : "=r" (rval));\ + rval;\ + }) + +#define mfesrel1() ({u64 rval = 0U; \ + asm volatile("mrs %0, ESR_EL1" : "=r" (rval));\ + rval;\ + }) + +#define mffarel1() ({u64 rval = 0U; \ + asm volatile("mrs %0, FAR_EL1" : "=r" (rval));\ + rval;\ + }) + + +#endif + +#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) : "cc" \ + ) + +#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 strw(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 mfcpnotoken(reg) ({u64 rval = 0U;\ + __asm__ __volatile__("mrs %0, " reg : "=r" (rval));\ + rval;\ + }) + +#define mtcp(reg,val) __asm__ __volatile__("msr " #reg ",%0" : : "r" (val)) +#define mtcpnotoken(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;\ + }) + +#define mtcp2(rn, v) __asm__ __volatile__(\ + "mcrr " rn "\n"\ + : : "r" (v), "r" (0)\ + ); + +#endif + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/** + *@endcond + */ + +#endif /* XPSEUDO_ASM_GCC_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips.h new file mode 100644 index 0000000..23ccb52 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips.h @@ -0,0 +1,804 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xqspips.h +* @addtogroup qspips Overview +* @{ +* @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 endianness 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
    +* 3.5	tjs 08/21/18 Fixed compilation warnings for the ARMCC.
    +* 3.5	tjs 07/16/18 Added support for low density ISSI flash parts.
    +* 3.6   akm 03/28/19 Fixed memory leak issue while reading from qspi.(CR#1016357)
    +* 3.6   akm 04/15/19 Modified FlashQuadEnable, FlashWrie and FlashErase APIs,
    +*                    to wait for the on going operation to complete before
    +*                    performing the next operation.
    +* 3.6   akm 04/15/19 Modified the mask in XQspiPs_GetReadData() API to retrieve
    +*                    configuration register values of both the Flashes in dual
    +*                    parellel connection.
    +* 3.7	akm 11/19/19 Fixed Coverity unused value warning in XQspiPs_PolledTransfer()
    +* 			and XQspiPs_Transfer() APIs.
    +* 3.7	akm 03/19/20 Modified XQspiPs_PolledTransfer(), XQspiPs_Transfer() and
    +*			XQspiPs_InterruptHandler() APIs to fill TX FIFO with valid
    +*			data when RX buffer is not NULL.
    +* 3.8	akm 09/02/20 Updated the Makefile to support parallel make execution.
    +* 3.11	akm 07/10/23 Update the driver to support for system device-tree flow.
    +*
    +* 
    +* +******************************************************************************/ +#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 Reg Read */ +#define XQSPIPS_FLASH_OPCODE_WRITE_LOCK_REG 0xE5 /* Lock Reg 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 { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + u32 BaseAddress; /**< Base address of the device */ + u32 InputClockHz; /**< Input clock frequency */ + u8 ConnectionMode; /**< Single, Stacked and Parallel mode */ +#ifdef SDT + u32 IntrId; /**< Bits[11:0] Interrupt-id Bits[15:12] + * trigger type and level flags */ + UINTPTR IntrParent; /**< Bit[0] Interrupt parent type Bit[64/32:1] + * Parent base address */ +#endif +} 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 + */ +#ifndef SDT +XQspiPs_Config *XQspiPs_LookupConfig(u16 DeviceId); +#else +XQspiPs_Config *XQspiPs_LookupConfig(UINTPTR BaseAddress); +#endif + +/* + * 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips_hw.h new file mode 100644 index 0000000..a136a2f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xqspips_hw.h @@ -0,0 +1,400 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xqspips_hw.h +* @addtogroup qspips Overview +* @{ +* +* 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.
    +* 3.6   akm 03/28/19 Fixed memory leak issue while reading from qspi.(CR#1016357)
    +*
    +* 
    +* +******************************************************************************/ +#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 /**< Separate 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 +#define XQSPIPS_DUMMY_TX_DATA 0xFFFFFFFF + +/****************************************************************************/ +/** +* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xreg_cortexa9.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xreg_cortexa9.h new file mode 100644 index 0000000..0d2c7b1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xreg_cortexa9.h @@ -0,0 +1,578 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (c) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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
    +* 9.0   mus      07/29/23 Added definitions for processor affinity register.
    +* 
    +* +******************************************************************************/ +#ifndef XREG_CORTEXA9_H +#define XREG_CORTEXA9_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + *@cond nocomments + */ + +/* 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 + +/* Affinity register bits */ +#define XREG_MPIDR_MASK 0xFFFFFFFFU +#define XREG_MPIDR_AFFINITY0_MASK 0x3U +#define XREG_MPIDR_AFFINITY0_SHIFT 0x0U +/* 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) + + +/** + *@endcond + */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XREG_CORTEXA9_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic.h new file mode 100644 index 0000000..1230208 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic.h @@ -0,0 +1,725 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xscugic.h +* @addtogroup scugic Overview +* @{ +* @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 interrupts 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.
    +* 3.10  aru  08/23/18 Resolved MISRA-C:2012 compliance mandatory violations
    +* 4.0   mus  11/22/18 Fixed bugs in software interrupt generation through
    +*                      XScuGic_SoftwareIntr API
    +* 4.1   asa  03/30/19 Made changes not to direct each interrupt to all
    +*                     available CPUs by default. This was breaking AMP
    +*                     behavior. Instead every time an interrupt enable
    +*                     request is received, the interrupt was mapped to
    +*                     the respective CPU. There were several other changes
    +*                     made to implement this. This set of changes was to
    +*                     fix CR-1024716.
    +* 4.1   mus  06/19/19 Added API's XScuGic_MarkCoreAsleep and
    +*                     XScuGic_MarkCoreAwake to mark processor core as
    +*                     asleep or awake. Fix for CR#1027220.
    +* 4.5   asa  03/07/21 Included a header file xil_spinlock.h to ensure that
    +*                     GIC driver can use newly introduced spinlock
    +*                     functionality.
    +* 4.6	sk   08/05/21 Fix scugic misrac violations.
    +* 4.7   dp   11/22/21 Added new API XScuGic_IsInitialized() to check and return
    +*                     the GIC initialization status.
    +* 5.0   mus  22/02/22 Add support for VERSAL NET
    +* 	adk  04/18/22 Replace infinite while loops in the examples with
    +* 		      Xil_WaitForEventSet() API.
    +*       dp   04/25/22 Correct Trigger index calculation in macro
    +*                     XScuGic_Get_Rdist_Int_Trigger_Index
    +* 5.0   dp   11/07/22 Add macros for accessing the GIC Binary Point and
    +*                     Running Priority registers of Cortex-R52.
    +* 5.1   mus  02/13/23 Updated XScuGic_CfgInitialize, XScuGic_Enable and
    +*                     XScuGic_Disable to support interrupts on each core
    +*                     of all CortexA78/CortexR52 clusters in VERSAL NET SoC.
    +*                     While at it, modified interrupt routing logic to make
    +*                     use of CPU affinity register instead of XPAR_CPU_ID macro.
    +*                     Also, XScuGic_CfgInitialize has been updated to find
    +*                     redistributor base address of core on which API is
    +*                     executed, redistributor address will be stored in newly
    +*                     added member of XScuGic data structure "RedistBaseAddr".
    +*                     It fixes CR#1150432.
    +* 5.2   ml   03/02/23 Add description to fix Doxygen warnings.
    +* 5.2   adk  04/14/23 Added support for system device-tree flow.
    +* 
    +* +******************************************************************************/ + +#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" +#include "xil_spinlock.h" + +/************************** Constant Definitions *****************************/ + +/** + * @name EFUSE status Register information + * EFUSE Status Register + * @{ + */ +#define EFUSE_STATUS_OFFSET 0x10 +#define EFUSE_STATUS_CPU_MASK 0x80 + +#if !defined (ARMR5) && !defined (__aarch64__) && !defined (ARMA53_32) +#define ARMA9 /**< ARMA9 macro to identify cortexA9 */ +#endif + +/** + * @name GICD_CTLR Register information + * GICD_CTLR Status Register + * @{ + */ +#define XSCUGIC500_DCTLR_ARE_NS_ENABLE 0x20 +#define XSCUGIC500_DCTLR_ARE_S_ENABLE 0x10 + +#if defined (VERSAL_NET) +#define XSCUGIC_CLUSTERID_MASK 0xF0U +#define XSCUGIC_COREID_MASK 0xFU +#define XSCUGIC_CLUSTERID_SHIFT 4U +#define XSCUGIC_COREID_SHIFT 0U + +#define XSCUGIC_SGI1R_AFFINITY1_SHIFT 16U +#define XSCUGIC_SGI1R_AFFINITY2_SHIFT 32U + +#define XSCUGIC_IROUTER_AFFINITY1_SHIFT 8U +#define XSCUGIC_IROUTER_AFFINITY2_SHIFT 16U + +#define XSCUGIC_IROUTER_IRM_MASK 0x80000000U +#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; /**< Interrupt Handler */ + void *CallBackRef; /**< CallBackRef is the callback reference passed in + by the upper layer when setting the Interrupt + handler for specific interrupt ID, and it will + passed back to Interrupt handler when it is + invoked. */ +} XScuGic_VectorTableEntry; + +/** + * This typedef contains configuration information for the device. + */ +typedef struct +{ +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ + u32 CpuBaseAddress; /**< CPU Interface Register base address */ + u32 DistBaseAddress; /**< Distributor Register base address */ +#else + char *Name; /**< Compatible string */ + u32 DistBaseAddress; /**< Distributor Register base address */ + u32 CpuBaseAddress; /**< CPU Interface Register base address */ +#endif + 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 */ +#if defined (GICv3) + UINTPTR RedistBaseAddr; +#endif + u32 IsReady; /**< Device is initialized and ready */ + u32 UnhandledInterrupts; /**< Intc Statistics */ +} XScuGic; + +/************************** Variable Definitions *****************************/ + +extern XScuGic_Config XScuGic_ConfigTable[]; /**< Config table */ + +/***************** 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))) + +#if defined (GICv3) +/****************************************************************************/ +/** +* +* Write the given ReDistributor 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_ReDistWriteReg(InstancePtr, RegOffset, Data) \ +(XScuGic_WriteReg(InstancePtr->RedistBaseAddr, RegOffset, (u32)Data)) + +/****************************************************************************/ +/** +* +* Read the given ReDistributor 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_ReDistReadReg(InstancePtr, RegOffset) \ +(XScuGic_ReadReg(InstancePtr->RedistBaseAddr, RegOffset)) + +/****************************************************************************/ +/** +* +* Write the given ReDistributor SGI PPI 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_ReDistSGIPPIWriteReg(InstancePtr, RegOffset, Data) \ +(XScuGic_WriteReg(InstancePtr->RedistBaseAddr + \ + XSCUGIC_RDIST_SGI_PPI_OFFSET, (RegOffset), ((u32)(Data)))) + +/****************************************************************************/ +/** +* +* Read the given ReDistributor SGI PPI 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_ReDistSGIPPIReadReg(InstancePtr, RegOffset) \ +(XScuGic_ReadReg(InstancePtr->RedistBaseAddr + XSCUGIC_RDIST_SGI_PPI_OFFSET, \ + RegOffset)) + +#if defined(ARMR52) +#define XREG_ICC_SRE_EL1 "p15, 0, %0, c12, c12, 5" +#define XREG_ICC_IGRPEN0_EL1 "p15, 0, %0, c12, c12, 6" +#define XREG_ICC_IGRPEN1_EL1 "p15, 0, %0, c12, c12, 7" +#define XREG_ICC_SGI0R_EL1 "p15, 2, %0, %1, c12" +#define XREG_ICC_SGI1R_EL1 "p15, 0, %0, %1, c12" +#define XREG_ICC_PMR_EL1 "p15, 0, %0, c4, c6, 0" +#define XREG_ICC_IAR0_EL1 "p15, 0, %0, c12, c8, 0" +#define XREG_ICC_IAR1_EL1 "p15, 0, %0, c12, c12, 0" +#define XREG_ICC_EOIR0_EL1 "p15, 0, %0, c12, c8, 1" +#define XREG_ICC_EOIR1_EL1 "p15, 0, %0, c12, c12, 1" +#define XREG_IMP_CBAR "p15, 1, %0, c15, c3, 0" +#define XREG_ICC_BPR0_EL1 "p15, 0, %0, c12, c8, 3" +#define XREG_ICC_BPR1_EL1 "p15, 0, %0, c12, c12, 3" +#define XREG_ICC_RPR_EL1 "p15, 0, %0, c12, c11, 3" +#else +#define XREG_ICC_SRE_EL1 "S3_0_C12_C12_5" +#define XREG_ICC_SRE_EL3 "S3_6_C12_C12_5" +#define XREG_ICC_IGRPEN0_EL1 "S3_0_C12_C12_6" +#define XREG_ICC_IGRPEN1_EL1 "S3_0_C12_C12_7" +#define XREG_ICC_IGRPEN1_EL3 "S3_6_C12_C12_7" +#define XREG_ICC_SGI0R_EL1 "S3_0_C12_C11_7" +#define XREG_ICC_SGI1R_EL1 "S3_0_C12_C11_5" +#define XREG_ICC_PMR_EL1 "S3_0_C4_C6_0" +#define XREG_ICC_IAR0_EL1 "S3_0_C12_C8_0" +#define XREG_ICC_IAR1_EL1 "S3_0_C12_C12_0" +#define XREG_ICC_EOIR0_EL1 "S3_0_C12_C8_1" +#define XREG_ICC_EOIR1_EL1 "S3_0_C12_C12_1" +#endif +/****************************************************************************/ +/** +* This function enables system register interface for GIC CPU Interface +* +* @param value to be written +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined (__aarch64__) +#define XScuGic_Enable_SystemReg_CPU_Interface_EL3() mtcpnotoken(XREG_ICC_SRE_EL3, 0xF); +#define XScuGic_Enable_SystemReg_CPU_Interface_EL1() mtcpnotoken(XREG_ICC_SRE_EL1, 0xF); +#elif defined (ARMR52) +#define XScuGic_Enable_SystemReg_CPU_Interface_EL1() mtcp(XREG_ICC_SRE_EL1, 0xF); +#endif +/****************************************************************************/ +/** +* This function enables Grou0 interrupts +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined(ARMR52) +#define XScuGic_Enable_Group0_Interrupts() mtcp(XREG_ICC_IGRPEN0_EL1,0x1); +#else +#define XScuGic_Enable_Group0_Interrupts() mtcpnotoken(XREG_ICC_IGRPEN0_EL1,0x1); +#endif +/****************************************************************************/ +/** +* This function enables Group1 interrupts +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined (ARMR52) + +#define XScuGic_Enable_Group1_Interrupts() \ + mtcp (XREG_ICC_IGRPEN1_EL1, 0x1 | mfcp(XREG_ICC_IGRPEN1_EL1) ); +#elif EL1_NONSECURE +#define XScuGic_Enable_Group1_Interrupts() \ + mtcpnotoken(XREG_ICC_IGRPEN1_EL1, 0x1 | mfcpnotoken(XREG_ICC_IGRPEN1_EL1) ); +#else +#define XScuGic_Enable_Group1_Interrupts() \ + mtcpnotoken(XREG_ICC_IGRPEN1_EL3, 0x1 | mfcpnotoken(XREG_ICC_IGRPEN1_EL3) ); +#endif +/****************************************************************************/ +/** +* This function writes to ICC_SGI0R_EL1 +* +* @param value to be written +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined(ARMR52) +#define XScuGic_WriteICC_SGI0R_EL1(val) mtcp2(XREG_ICC_SGI0R_EL1,val) +#else +#define XScuGic_WriteICC_SGI0R_EL1(val) mtcpnotoken(XREG_ICC_SGI0R_EL1,val) +#endif + +/****************************************************************************/ +/** +* This function writes to ICC_SGI1R_EL1 +* +* @param value to be written +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined(ARMR52) +#define XScuGic_WriteICC_SGI1R_EL1(val) mtcp2(XREG_ICC_SGI1R_EL1,val) +#else +#define XScuGic_WriteICC_SGI1R_EL1(val) mtcpnotoken(XREG_ICC_SGI1R_EL1,val) +#endif + +/****************************************************************************/ +/** +* This function reads ICC_SGI1R_EL1 register +* +* @param None +* +* @return Value of ICC_SGI1R_EL1 register +* +* @note None. +* +*****************************************************************************/ +#if defined (ARMR52) +#define XScuGic_ReadICC_SGI1R_EL1() mfcp(XREG_ICC_SGI1R_EL1) +#else +#define XScuGic_ReadICC_SGI1R_EL1() mfcpnotoken(XREG_ICC_SGI1R_EL1) +#endif +/****************************************************************************/ +/** +* This function sets interrupt priority filter +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined (ARMR52) +#define XScuGic_set_priority_filter(val) mtcp(XREG_ICC_PMR_EL1, val) +#else +#define XScuGic_set_priority_filter(val) mtcpnotoken(XREG_ICC_PMR_EL1, val) +#endif +/****************************************************************************/ +/** +* This function returns interrupt id of highest priority pending interrupt +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined(ARMR52) +#define XScuGic_get_IntID() mfcp(XREG_ICC_IAR1_EL1) +#elif EL3 +#define XScuGic_get_IntID() mfcpnotoken(XREG_ICC_IAR0_EL1) +#else +#define XScuGic_get_IntID() mfcpnotoken(XREG_ICC_IAR1_EL1) +#endif +/****************************************************************************/ +/** +* This function acks the interrupt +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#if defined(ARMR52) +#define XScuGic_ack_Int(val) mtcp(XREG_ICC_EOIR1_EL1,val) +#elif EL3 +#define XScuGic_ack_Int(val) mtcpnotoken(XREG_ICC_EOIR0_EL1,val) +#else +#define XScuGic_ack_Int(val) mtcpnotoken(XREG_ICC_EOIR1_EL1,val) +#endif +/****************************************************************************/ +/** +* This macro returns bit position for the specific interrupt's trigger type +* configuration within GICR_ICFGR0/GICR_ICFGR1 register +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#define XScuGic_Get_Rdist_Int_Trigger_Index(IntrId) ((Int_Id%16) * 2U) +#endif +/************************** 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_Identifier); + +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_Identifier, u32 Int_Id); +void XScuGic_InterruptUnmapFromCpu(XScuGic *InstancePtr, u8 Cpu_Identifier, u32 Int_Id); +void XScuGic_UnmapAllInterruptsFromCpu(XScuGic *InstancePtr, u8 Cpu_Identifier); +void XScuGic_Stop(XScuGic *InstancePtr); +void XScuGic_SetCpuID(u32 CpuCoreId); +u32 XScuGic_GetCpuID(void); +#ifndef SDT +u8 XScuGic_IsInitialized(u32 DeviceId); +#else +u8 XScuGic_IsInitialized(u32 BaseAddress); +#endif +#ifndef SDT +/* + * Lookup configuration by using DeviceId + */ +XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId); +/* + * Lookup configuration by using BaseAddress + */ +XScuGic_Config *XScuGic_LookupConfigBaseAddr(UINTPTR BaseAddress); +#else +XScuGic_Config *XScuGic_LookupConfig(UINTPTR BaseAddr); +#endif + +/* + * Interrupt functions in xscugic_intr.c + */ +void XScuGic_InterruptHandler(XScuGic *InstancePtr); + +/* + * Self-test functions in xscugic_selftest.c + */ +s32 XScuGic_SelfTest(XScuGic *InstancePtr); + +#if defined (GICv3) +void XScuGic_MarkCoreAsleep(XScuGic *InstancePtr); +void XScuGic_MarkCoreAwake(XScuGic *InstancePtr); +#endif +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic_hw.h new file mode 100644 index 0000000..139bf8a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscugic_hw.h @@ -0,0 +1,762 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xscugic_hw.h +* @addtogroup scugic Overview +* @{ +* +* 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.
    +* 3.10  aru  08/23/18 Resolved MISRA-C:2012 compliance mandatory violations
    +* 4.1   asa  03/30/19 Removed macros for XScuGic_EnableIntr, and
    +*                     XScuGic_DisableIntr. These are now C functions. This
    +*                     change was to fix CR-1024716.
    +* 4.1   mus  06/12/19 Updated XSCUGIC_MAX_NUM_INTR_INPUTS for Versal.
    +* 4.6	sk   06/07/21 Delete the commented macro code to fix the MISRA-C warning.
    +* 4.6	sk   08/05/21 Fix Scugic Misrac violations.
    +* 4.7	sk   12/10/21 Update XSCUGIC_SPI_INT_ID_START macro from signed to unsigned
    +* 		      to fix misrac violation.
    +* 4.7   mus  03/17/22 GICv3 coupled with A72 has different redistributor for
    +*                     each core, and each redistributor has different address,
    +*                     Updated #define for re-distributor address to have correct
    +*                     value based on the cpu number. It fixes CR#1126156.
    +* 5.0   mus  22/02/22 Added support for VERSAL NET
    +* 5.1   mus  02/13/23 Added #defines required for logic to find redistributor
    +*                     based address for specific CPU core. Also, added new macro
    +*                     XScuGic_ReadReg64 to read 64 bit value from specific address.
    +* 5.1   mus  02/15/23 Added support for VERSAL_NET APU and RPU GIC.
    +* 5.2   ml   03/02/23 Add description to fix Doxygen warnings.
    +* 5.2   mus  03/26/23 Fixed calculation for XSCUGIC_RDIST_INT_PRIORITY_OFFSET_CALC.
    +* 
    +* +******************************************************************************/ + +#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" +#include "bspconfig.h" + +/************************** Constant Definitions *****************************/ +#if (defined (versal) && !defined(ARMR5)) || defined (ARMR52) +#define GICv3 +#endif + +#if defined (VERSAL_NET) && ! defined (ARMR52) +#define GIC600 +#endif + +#if defined (VERSAL_NET) +#if defined (ARMR52) +#define XSCUGIC_NUM_OF_CORES_PER_CLUSTER 2U +#else +#define XSCUGIC_NUM_OF_CORES_PER_CLUSTER 4U +#endif +#endif + +/* + * The maximum number of interrupts supported by the hardware. + */ +#ifdef PLATFORM_ZYNQ +#define XSCUGIC_MAX_NUM_INTR_INPUTS 95U /**< Maximum number of + interrupt defined by + Zynq */ +#elif defined (VERSAL_NET) +#define XSCUGIC_MAX_NUM_INTR_INPUTS 256U /**< Maximum number of + interrupt sources in + VERSAL NET */ +#elif defined (versal) +#define XSCUGIC_MAX_NUM_INTR_INPUTS 192U /**< Maximum number of + interrupt sources in + VERSAL */ +#else +#define XSCUGIC_MAX_NUM_INTR_INPUTS 195U /**< Maximum number of + interrupt defined by + Zynq Ultrascale Mp */ +#endif + +#define XSCUGIC_SPI_INT_ID_START 0x20U /**< First Interrupt Id for + SPI interrupts. */ + +#define XSCUGIC_MAX_INTR_PRIO_VAL 248U /**< The maximum priority value + that can be used in + the GIC. */ +#define XSCUGIC_INTR_PRIO_MASK 0x000000F8U /**< The Interrupt + priority mask value */ + +/** @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 */ +#if defined (GICv3) +#define XSCUGIC_PCELLID_OFFSET 0x0000FFF0U /**< Pcell ID Register */ +#else +#define XSCUGIC_PCELLID_OFFSET 0x00000FF0U /**< Pcell ID Register */ +#endif +/* @} */ + +/** @name Distributor Enable Register + * Controls if the distributor response to external interrupt inputs. + * @{ + */ +#if defined (GICv3) +#define XSCUGIC_EN_INT_MASK 0x00000003U /**< Interrupt In Enable */ +#else +#define XSCUGIC_EN_INT_MASK 0x00000001U /**< Interrupt In Enable */ +#endif +/* @} */ + +/** @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 /**< Interrupt configuration Mask */ +/* @} */ + +/** @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 endianness + * 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 issuing 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 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 */ +/* @} */ + +#if defined (GICv3) +#define XSCUGIC_IROUTER_BASE_OFFSET 0x6000U +#endif +/* + * Highest Pending Interrupt register definitions + * Identifies the interrupt priority of the highest priority pending interrupt + */ +#define XSCUGIC_PEND_INTID_MASK 0x000003FFU /**< Pending Interrupt ID */ +/* @} */ +#if defined (GICv3) +/** @name ReDistributor Interface Register Map + * + * @{ + */ +#if defined (VERSAL_NET) && ! defined (ARMR52) +#define XSCUGIC_RDIST_START_ADDR 0xE2060000U +#define XSCUGIC_RDIST_END_ADDR 0xE2260000U +#elif defined (ARMR52) +#define XSCUGIC_RDIST_START_ADDR 0xE2100000U +#define XSCUGIC_RDIST_END_ADDR 0xE2130000U +#else +#define XSCUGIC_RDIST_START_ADDR 0xF9080000U +#define XSCUGIC_RDIST_END_ADDR 0xF90B0000U +#endif +#define XSCUGIC_RDIST_OFFSET 0x20000U /* offset between consecutive redistributors */ +#define XSCUGIC_RDIST_SGI_PPI_OFFSET 0x10000U /* offset between control redistributor and SGI/PPI redistributor */ +#define XSCUGIC_GICR_TYPER_AFFINITY_SHIFT 32U +#define XSCUGIC_GICR_TYPER_AFFINITY_MASK 0xFFFFFFFF00000000UL + +#define XSCUGIC_RDIST_ISENABLE_OFFSET 0x100U +#define XSCUGIC_RDIST_IPRIORITYR_OFFSET 0x400U +#define XSCUGIC_RDIST_IGROUPR_OFFSET 0x80U + +#define XSCUGIC_RDIST_GRPMODR_OFFSET 0xD00U +#define XSCUGIC_RDIST_INT_CONFIG_OFFSET 0xC00U +#define XSCUGIC_RDIST_TYPER_OFFSET 0x8U +#define XSCUGIC_RDIST_WAKER_OFFSET 0x14U +#define XSCUGIC_SGIR_EL1_INITID_SHIFT 24U + +#if defined (GIC600) +#define XSCUGIC_RDIST_PWRR_OFFSET 0x24U +#endif +/* + * GICR_IGROUPR register definitions + */ +#if EL3 +#define XSCUGIC_DEFAULT_SECURITY 0x0U +#else +#define XSCUGIC_DEFAULT_SECURITY 0xFFFFFFFFU +#endif +/* + * GICR_WAKER register definitions + */ +#define XSCUGIC_RDIST_WAKER_LOW_POWER_STATE_MASK 0x7 +#define XSCUGIC_RDIST_PWRR_RDPD_MASK 0x1U +#endif +/***************** 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 Interrupt Routing Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_IROUTER_OFFSET_CALC(InterruptID) \ + ((u32)XSCUGIC_IROUTER_BASE_OFFSET + (InterruptID * 8)) + +/****************************************************************************/ +/** +* +* 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 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_SECURITY_TARGET_OFFSET_CALC(InterruptID) \ + ((u32)XSCUGIC_SECURITY_OFFSET + (((InterruptID)/32U)*4U)) + +/****************************************************************************/ +/** +* +* Read the Re-distributor Interrupt configuration register offset +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_RDIST_INT_CONFIG_OFFSET_CALC(InterruptID) \ + ((u32)XSCUGIC_RDIST_INT_CONFIG_OFFSET + ((InterruptID /16)*4)) + +/****************************************************************************/ +/** +* +* Read the Re-distributor Interrupt Priority register offset +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_RDIST_INT_PRIORITY_OFFSET_CALC(InterruptID) \ + ((u32)XSCUGIC_RDIST_IPRIORITYR_OFFSET + ((InterruptID/4) * 4)) +/****************************************************************************/ +/** +* +* Read the Interrupt Clear-Enable Register offset for an interrupt ID +* +* @param Register is the register offset for the clear/enable bank. +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_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))) + +/****************************************************************************/ +/** +* +* 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 64-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_ReadReg64(UINTPTR BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_ReadReg64(BaseAddress, RegOffset) \ + (Xil_In64((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)))) + + +/************************** Function Prototypes ******************************/ + +void XScuGic_DeviceInterruptHandler(void *DeviceId); +s32 XScuGic_DeviceInitialize(u32 DeviceId); +void XScuGic_RegisterHandler(u32 BaseAddress, s32 InterruptID, + Xil_InterruptHandler IntrHandler, 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_InterruptMapFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id, u32 Int_Id); +void XScuGic_InterruptUnmapFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id, u32 Int_Id); +void XScuGic_UnmapAllInterruptsFromCpuByDistAddr(u32 DistBaseAddress, + u8 Cpu_Id); +void XScuGic_EnableIntr (u32 DistBaseAddress, u32 Int_Id); +void XScuGic_DisableIntr (u32 DistBaseAddress, u32 Int_Id); +#if defined(GICv3) +UINTPTR XScuGic_GetRedistBaseAddr(void); +#endif +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer.h new file mode 100644 index 0000000..008b900 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer.h @@ -0,0 +1,360 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xscutimer.h +* @addtogroup scutimer Overview +* @{ +* @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.
    +* 2.3   mus 08/31/20 Updated makefile to support parallel make and
    +*                    incremental builds, it would help to reduce compilation
    +*                    time.
    +* 2.5   dp   07/11/23 Add support for system device tree flow
    +* 
    +* +******************************************************************************/ +#ifndef XSCUTIMER_H /* prevent circular inclusions */ +#define XSCUTIMER_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xscutimer_hw.h" +#include "bspconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + u32 BaseAddr; /**< Base address of the device */ +#ifdef XIL_INTERRUPT + u32 IntrId; + UINTPTR IntrParent; /** Bit[0] Interrupt parent type Bit[64/32:1] Parent base address */ +#endif +} 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 + */ +#ifndef SDT +XScuTimer_Config *XScuTimer_LookupConfig(u16 DeviceId); +#else +XScuTimer_Config *XScuTimer_LookupConfig(UINTPTR BaseAddr); +#endif + +/* + * 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer_hw.h new file mode 100644 index 0000000..8eb1875 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscutimer_hw.h @@ -0,0 +1,262 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2020 Xilinx, Inc. All rights reserved. +* Copyright (C) 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xscutimer_hw.h +* @addtogroup scutimer Overview +* @{ +* +* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt.h new file mode 100644 index 0000000..9130e4d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt.h @@ -0,0 +1,382 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xscuwdt.h +* @addtogroup Overview +* @{ +* @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.
    +* 2.3   mus 08/31/20 Updated makefile to support parallel make and
    +*                    incremental builds. It would help to reduce compilaton
    +*                    time.
    +* 2.3	sne 09/16/20 Fixed MISRA-C violations.
    +* 2.4	sne 02/04/21 Fixed Doxygen warnings.
    +* 2.5   asa 07/18/23 Added support for system device tree based workflow
    +*                    decoupling flow.
    +* 
    +* +******************************************************************************/ +#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 { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; /**< Unique name of the device */ +#endif + UINTPTR BaseAddr; /**< Register base address */ +#ifdef SDT + u32 IntrId; /** Bits[11:0] Interrupt-id Bits[15:12] + * trigger type and level flags */ + UINTPTR IntrParent; /** Bit[0] Interrupt parent type Bit[64/32:1] + * Parent base address */ +#endif +} 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; + +/************************** Variable Definitions *****************************/ +extern XScuWdt_Config XScuWdt_ConfigTable[]; + +/***************** 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. + */ +#ifndef SDT +XScuWdt_Config *XScuWdt_LookupConfig(u16 DeviceId); +#else +XScuWdt_Config *XScuWdt_LookupConfig(UINTPTR BaseAddress); +#endif + +/* + * 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt_hw.h new file mode 100644 index 0000000..3c401ec --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xscuwdt_hw.h @@ -0,0 +1,157 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xscuwdt_hw.h +* @addtogroup Overview +* @{ +* +* 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 occurred */ +/*@}*/ + +/** @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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps.h new file mode 100644 index 0000000..6278d69 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps.h @@ -0,0 +1,410 @@ +/****************************************************************************** +* Copyright (C) 2013 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xsdps.h +* @addtogroup sdps Overview +* @{ +* @details +* +* This section explains the implementation of the XSdPs driver. +* See xsdps.h for a detailed description of the device and 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. +* +* Initialization & Configuration +* +* 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 transfer 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 filesystem 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
    +* 3.6   mn     08/01/18 Add support for using 64Bit DMA with 32-Bit Processor
    +* 3.7   mn     02/01/19 Add support for idling of SDIO
    +* 3.8   mn     04/12/19 Modified TapDelay code for supporting ZynqMP and Versal
    +*       mn     09/17/19 Modified ADMA handling API for 32bit and 64bit addresses
    +* 3.9   mn     03/03/20 Restructured the code for more readability and modularity
    +*       mn     03/16/20 Move XSdPs_Select_Card API to User APIs
    +* 3.10  mn     06/05/20 Check Transfer completion separately from XSdPs_Read and
    +*                       XSdPs_Write APIs
    +*       mn     06/05/20 Modified code for SD Non-Blocking Read support
    +* 3.11  sk     12/01/20 Tap programming sequence updates like disable OTAPEN
    +*                       always, write zero to tap register for zero tap value.
    +*       sk     12/07/20 Fix eMMC DDR52 mode write/read issue.
    +*       sk     12/17/20 Removed checking platform specific SD macros and used
    +*                       Baseaddress instead.
    +* 3.12  sk     01/28/21 Added support for non-blocking write.
    +*       sk     02/12/21 Fix the issue in reading CID and CSD.
    +*       sk     04/08/21 Fixed doxygen warnings in all source files.
    +*       sk     05/25/21 Fix the compilation issue in Cortex-A72 + EL1_NS by
    +*                       removing the DLL reset logic (Dead code for Versal).
    +* 3.13  sk     08/10/21 Limit the SD operating frequency to 19MHz for Versal.
    +* 3.14  sk     10/22/21 Add support for Erase feature.
    +*       sk     11/29/21 Fix compilation warnings reported with "-Wundef" flag.
    +*       sk     01/10/22 Add support to read slot_type parameter.
    +* 4.0   sk     02/25/22 Add support for eMMC5.1.
    +*       sk     04/07/22 Add support to read custom tap delay values from design
    +*                       for SD/eMMC.
    +*       sk     06/03/22 Fix issue in internal clock divider calculation logic.
    +* 4.1   sk     11/10/22 Add SD/eMMC Tap delay support for Versal Net.
    +* 4.1   sa     01/03/23 Report error if Transfer size is greater than 2MB.
    +* 4.1	sa     12/19/22 Enable eMMC HS400 mode for Versal Net.
    +* 	sa     01/25/23	Use instance structure to store DMA descriptor tables.
    +* 4.2   ro     06/12/23 Added support for system device-tree flow.
    +* 4.2   ap     08/09/23 Reordered XSdPs_FrameCmd XSdPs_Identify_UhsMode functions
    +*
    +* 
    +* +******************************************************************************/ + + +#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 "sleep.h" +#include +#if defined (XCLOCKING) +#include "xil_clocking.h" +#endif + +/************************** Constant Definitions *****************************/ + +#define XSDPS_CT_ERROR 0x2L /**< Command timeout flag */ +#define MAX_TUNING_COUNT 40U /**< Maximum Tuning count */ +#define MAX_TIMEOUT 0x1FFFFFFFU /**< Maximum Timeout */ +#define XSDPS_CMD8_VOL_PATTERN 0x1AAU /**< CMD8 voltage pattern */ +#define XSDPS_RESPOCR_READY 0x80000000U /**< Ready response */ +#define XSDPS_ACMD41_HCS 0x40000000U /**< High Capacity Support */ +#define XSDPS_ACMD41_3V3 0x00300000U /**< 3.3 voltage support */ +#define XSDPS_CMD1_HIGH_VOL 0x00FF8000U /**< CMD1 for High voltage */ +#define XSDPS_CMD1_DUAL_VOL 0x00FF8010U /**< CMD1 for Dual voltage */ +#define HIGH_SPEED_SUPPORT 0x2U /**< High Speed support */ +#define UHS_SDR12_SUPPORT 0x1U /**< SDR12 support */ +#define UHS_SDR25_SUPPORT 0x2U /**< SDR25 support */ +#define UHS_SDR50_SUPPORT 0x4U /**< SDR50 support */ +#define UHS_SDR104_SUPPORT 0x8U /**< SDR104 support */ +#define UHS_DDR50_SUPPORT 0x10U /**< DDR50 support */ +#define WIDTH_4_BIT_SUPPORT 0x4U /**< 4-bit width support */ +#define SD_CLK_25_MHZ 25000000U /**< 25MHz clock */ +#define SD_CLK_19_MHZ 19000000U /**< 19MHz clock */ +#define SD_CLK_26_MHZ 26000000U /**< 26MHz clock */ +#define EXT_CSD_DEVICE_TYPE_BYTE 196U /**< CSD Device Type byte number */ +#define EXT_CSD_SEC_COUNT_BYTE1 212U /**< CSD Sector count byte 1 */ +#define EXT_CSD_SEC_COUNT_BYTE2 213U /**< CSD Sector count byte 2 */ +#define EXT_CSD_SEC_COUNT_BYTE3 214U /**< CSD Sector count byte 3 */ +#define EXT_CSD_SEC_COUNT_BYTE4 215U /**< CSD Sector count byte 4 */ +#define EXT_CSD_DEVICE_TYPE_HIGH_SPEED 0x2U /**< CSD Device type HS */ +#define EXT_CSD_DEVICE_TYPE_DDR_1V8_HIGH_SPEED 0x4U /**< CSD Dev type DDR 1.8v speed */ +#define EXT_CSD_DEVICE_TYPE_DDR_1V2_HIGH_SPEED 0x8U /**< CSD Dev type DDR 1.2v speed */ +#define EXT_CSD_DEVICE_TYPE_SDR_1V8_HS200 0x10U /**< CSD SDR 1.8v HS200 */ +#define EXT_CSD_DEVICE_TYPE_SDR_1V2_HS200 0x20U /**< CSD SDR 1.2v HS200 */ +#define EXT_CSD_DEVICE_TYPE_DDR_1V8_HS400 0x40U /**< CSD SDR 1.8v HS400 */ +#define EXT_CSD_DEVICE_TYPE_DDR_1V2_HS400 0x80U /**< CSD SDR 1.2v HS400 */ +#define CSD_SPEC_VER_3 0x3U /**< CSD card spec ver 3 */ +#define SCR_SPEC_VER_3 0x80U /**< SCR spec ver 3 */ +#define ADDRESS_BEYOND_32BIT 0x100000000U /**< Macro used for beyond 32-bit addr */ + +#define XSDPS_ZYNQMP_SD0_BASE 0xFF160000U /**< ZynqMP SD0 Baseaddress */ +#define XSDPS_ZYNQMP_SD1_BASE 0xFF170000U /**< ZynqMP SD1 Baseaddress */ +#define XSDPS_VERSAL_SD0_BASE 0xF1040000U /**< Versal SD0 Baseaddress */ +#define XSDPS_VERSAL_SD1_BASE 0xF1050000U /**< Versal SD1 Baseaddress */ + +/** @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 /**< Blk Size 512 */ + +/** @} */ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + UINTPTR 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 SlotType; /**< Slot type */ + u8 IsCacheCoherent; /**< If SD is Cache Coherent or not */ +#if defined (XCLOCKING) || defined (SDT) + u32 RefClk; /**< Input clocks */ +#endif + u32 ITapDly_SDR_Clk50; /**< Input Tap delay for HSD/SDR25 modes */ + u32 OTapDly_SDR_Clk50; /**< Output Tap delay for HSD/SDR25 modes */ + u32 ITapDly_DDR_Clk50; /**< Input Tap delay for DDR50 modes */ + u32 OTapDly_DDR_Clk50; /**< Output Tap delay for DDR50 modes */ + u32 OTapDly_SDR_Clk100; /**< Input Tap delay for SDR50 modes */ + u32 OTapDly_SDR_Clk200; /**< Input Tap delay for SDR104/HS200 modes */ +} XSdPs_Config; + +/** + * ADMA2 32-Bit descriptor table + */ +typedef struct { + u16 Attribute; /**< Attributes of descriptor */ + u16 Length; /**< Length of current dma transfer */ + u32 Address; /**< Address of current dma transfer */ +#ifdef __ICCARM__ +#pragma data_alignment = 32 +} XSdPs_Adma2Descriptor32; +#else +} +__attribute__((__packed__))XSdPs_Adma2Descriptor32; +#endif + +/** + * ADMA2 64-Bit descriptor table + */ +typedef struct { + u16 Attribute; /**< Attributes of descriptor */ + u16 Length; /**< Length of current dma transfer */ + u64 Address; /**< Address of current dma transfer */ +#ifdef __ICCARM__ +#pragma data_alignment = 32 +} XSdPs_Adma2Descriptor64; +#else +} __attribute__((__packed__))XSdPs_Adma2Descriptor64; +#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 */ + u32 OTapDelay; /**< Output Tap Delay */ + u32 ITapDelay; /**< Input Tap Delay */ + u64 Dma64BitAddr; /**< 64 Bit DMA Address */ + u16 TransferMode; /**< Transfer Mode */ + u32 SlcrBaseAddr; /**< SLCR base address*/ + u8 IsBusy; /**< Busy Flag*/ + u32 BlkSize; /**< Block Size*/ + u8 IsTuningDone; /**< Flag to indicate HS200 tuning complete */ +#ifdef __ICCARM__ +#pragma data_alignment = 32 + XSdPs_Adma2Descriptor32 Adma2_DescrTbl32[32]; /**< ADMA descriptor table 32 Bit */ + XSdPs_Adma2Descriptor64 Adma2_DescrTbl64[32]; /**< ADMA descriptor table 64 Bit */ +#else + XSdPs_Adma2Descriptor32 Adma2_DescrTbl32[32] __attribute__ ((aligned(32))); /**< ADMA descriptor table 32 Bit */ + XSdPs_Adma2Descriptor64 Adma2_DescrTbl64[32] __attribute__ ((aligned(32))); /**< ADMA descriptor table 64 Bit */ +#endif +} XSdPs; + +/***************** Macros (Inline Functions) Definitions *********************/ +/** + * @name SD High Speed mode configuration options + * @{ + */ +/** + * User configuration option to enable or disable SD HS mode. + * By default SD HS mode is disabled for Versal and enabled for + * other platforms. + */ +#ifdef versal +#define SD_HS_MODE_ENABLE 0 +#else +#define SD_HS_MODE_ENABLE 1 +#endif +/** @} */ + +/** + * Enable eMMC HS400 mode for Versal Net platform + */ +#define ENABLE_HS400_MODE + +/************************** Variable Definitions *****************************/ +/** + * XSdPs Configuration Table + */ +#ifndef SDT +extern XSdPs_Config XSdPs_ConfigTable[XPAR_XSDPS_NUM_INSTANCES]; +#else +extern XSdPs_Config XSdPs_ConfigTable[]; +#endif + +/************************** Function Prototypes ******************************/ +#ifndef SDT +XSdPs_Config *XSdPs_LookupConfig(u16 DeviceId); +#else +XSdPs_Config *XSdPs_LookupConfig(u32 BaseAddress); +#endif +s32 XSdPs_CfgInitialize(XSdPs *InstancePtr, XSdPs_Config *ConfigPtr, + UINTPTR EffectiveAddr); +s32 XSdPs_CardInitialize(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_Idle(XSdPs *InstancePtr); + +s32 XSdPs_Change_BusSpeed(XSdPs *InstancePtr); +s32 XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq); +s32 XSdPs_Pullup(XSdPs *InstancePtr); +s32 XSdPs_Get_BusWidth(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Change_BusWidth(XSdPs *InstancePtr); +s32 XSdPs_Get_BusSpeed(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_Set_Mmc_ExtCsd(XSdPs *InstancePtr, u32 Arg); +s32 XSdPs_SetBlkSize(XSdPs *InstancePtr, u16 BlkSize); +s32 XSdPs_Get_Status(XSdPs *InstancePtr, u8 *SdStatReg); +s32 XSdPs_Select_Card(XSdPs *InstancePtr); +s32 XSdPs_StartReadTransfer(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, u8 *Buff); +s32 XSdPs_CheckReadTransfer(XSdPs *InstancePtr); +s32 XSdPs_StartWriteTransfer(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, u8 *Buff); +s32 XSdPs_CheckWriteTransfer(XSdPs *InstancePtr); +s32 XSdPs_Erase(XSdPs *InstancePtr, u32 StartAddr, u32 EndAddr); + +#ifdef __cplusplus +} +#endif + +#endif /* SD_H_ */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_core.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_core.h new file mode 100644 index 0000000..ebdb9d9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_core.h @@ -0,0 +1,132 @@ +/****************************************************************************** +* Copyright (C) 2013 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xsdps_core.h +* @addtogroup sdps Overview +* @{ +* +* The xsdps_core.h 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
    +* ----- ---    -------- -----------------------------------------------
    +* 3.9   mn     03/03/20 Restructured the code for more readability and modularity
    +*       mn     03/16/20 Move XSdPs_Select_Card API to User APIs
    +* 3.12  sk     01/28/21 Added support for non-blocking write.
    +* 3.14  sk     10/22/21 Add support for Erase feature.
    +*       mn     11/28/21 Fix MISRA-C violations.
    +* 4.0   sk     02/25/22 Add support for eMMC5.1.
    +* 4.1   sa     01/06/23 Include xil_util.h in this file.
    +* 4.2   ap     08/09/23 Add XSdPs_SetTapDelay APIs.
    +* 
    +* +******************************************************************************/ + +/** @cond INTERNAL */ +#ifndef SDPS_INCLUDE_H_ +#define SDPS_INCLUDE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xsdps.h" +#if defined (__aarch64__) +#include "xil_smc.h" +#endif + +#include "xil_util.h" + +s32 XSdPs_SdCardInitialize(XSdPs *InstancePtr); +s32 XSdPs_MmcCardInitialize(XSdPs *InstancePtr); +s32 XSdPs_IdentifyCard(XSdPs *InstancePtr); +s32 XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt); +s32 XSdPs_SetupTransfer(XSdPs *InstancePtr); +s32 XSdPs_Read(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, u8 *Buff); +s32 XSdPs_Write(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt, const u8 *Buff); +s32 XSdPs_CheckTransferComplete(XSdPs *InstancePtr); +void XSdPs_Identify_UhsMode(XSdPs *InstancePtr, u8 *ReadBuff); +s32 XSdPs_DllReset(XSdPs *InstancePtr); +s32 XSdPs_Switch_Voltage(XSdPs *InstancePtr); +void XSdPs_SetupADMA2DescTbl64Bit(XSdPs *InstancePtr, u32 BlkCnt); +void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff); +void XSdPs_DllRstCtrl(XSdPs *InstancePtr, u8 EnRst); +void XSdPs_ConfigTapDelay(XSdPs *InstancePtr); +s32 XSdPs_Execute_Tuning(XSdPs *InstancePtr); +void XSdPs_Setup32ADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff); +void XSdPs_Setup64ADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff); +u32 XSdPs_FrameCmd(XSdPs *InstancePtr, u32 Cmd); +void XSdPs_SetTapDelay(XSdPs *InstancePtr); +s32 XSdPs_CheckResetDone(XSdPs *InstancePtr, u8 Value); +s32 XSdPs_CheckVoltage18(XSdPs *InstancePtr); +s32 XSdPs_SetupCmd(XSdPs *InstancePtr, u32 Arg, u32 BlkCnt); +void XSdPs_SetExecTuning(XSdPs *InstancePtr); +s32 XSdPs_CheckCardDetect(XSdPs *InstancePtr); +s32 XSdPs_CardReset(XSdPs *InstancePtr); +s32 XSdPs_CardIfCond(XSdPs *InstancePtr); +s32 XSdPs_CardOpCond(XSdPs *InstancePtr); +s32 XSdPs_GetCardId(XSdPs *InstancePtr); +s32 XSdPs_GetCsd(XSdPs *InstancePtr); +s32 XSdPs_CardSetVoltage18(XSdPs *InstancePtr); +s32 XSdPs_SdModeInit(XSdPs *InstancePtr); +s32 XSdPs_SdCardEnum(XSdPs *InstancePtr); +s32 XSdPs_MmcCardEnum(XSdPs *InstancePtr); +s32 XSdPs_MmcModeInit(XSdPs *InstancePtr); +s32 XSdPs_EmmcModeInit(XSdPs *InstancePtr); +s32 XSdPs_ResetConfig(XSdPs *InstancePtr); +void XSdPs_HostConfig(XSdPs *InstancePtr); +s32 XSdPs_Reset(XSdPs *InstancePtr, u8 Value); +void XSdPs_DisableBusPower(XSdPs *InstancePtr); +void XSdPs_EnableBusPower(XSdPs *InstancePtr); +s32 XSdPs_CheckBusIdle(XSdPs *InstancePtr, u32 Value); +s32 XSdPs_CheckBusHigh(XSdPs *InstancePtr); +s32 XSdPs_SetupVoltageSwitch(XSdPs *InstancePtr); +s32 XSdPs_AutoTuning(XSdPs *InstancePtr); +s32 XSdPs_SetClock(XSdPs *InstancePtr, u32 SelFreq); +u32 XSdPs_CalcClock(XSdPs *InstancePtr, u32 SelFreq); +s32 XSdPs_EnableClock(XSdPs *InstancePtr, u16 ClockReg); +s32 XSdps_CheckTransferDone(XSdPs *InstancePtr); +s32 XSdPs_Change_SdBusSpeed(XSdPs *InstancePtr); +s32 XSdPs_Change_MmcBusSpeed(XSdPs *InstancePtr); +s32 XSdPs_CalcBusSpeed(XSdPs *InstancePtr, u32 *Arg); +void XSdPs_SetupReadDma(XSdPs *InstancePtr, u16 BlkCnt, u16 BlkSize, u8 *Buff); +void XSdPs_SetupWriteDma(XSdPs *InstancePtr, u16 BlkCnt, u16 BlkSize, const u8 *Buff); +s32 XSdPs_SetVoltage18(XSdPs *InstancePtr); +s32 XSdPs_SendCmd(XSdPs *InstancePtr, u32 Cmd); +void XSdPs_IdentifyEmmcMode(XSdPs *InstancePtr, const u8 *ExtCsd); +s32 XSdPs_CheckEmmcTiming(XSdPs *InstancePtr, u8 *ExtCsd); +void XSdPs_ConfigPower(XSdPs *InstancePtr); +void XSdPs_ConfigDma(XSdPs *InstancePtr); +void XSdPs_ConfigInterrupt(XSdPs *InstancePtr); +s32 XSdPs_SendErase(XSdPs *InstancePtr); +s32 XSdPs_SetEndAddr(XSdPs *InstancePtr, u32 EndAddr); +s32 XSdPs_SetStartAddr(XSdPs *InstancePtr, u32 StartAddr); +void XSdPs_SetTapDelay_SDR104(XSdPs *InstancePtr); +void XSdPs_SetTapDelay_SDR50(XSdPs *InstancePtr); +void XSdPs_SetTapDelay_DDR50(XSdPs *InstancePtr); +void XSdPs_SetTapDelay_SDR25(XSdPs *InstancePtr); +#ifdef VERSAL_NET +u32 XSdPs_Select_HS400(XSdPs *InstancePtr); +#endif + +#if defined (__aarch64__) && (EL1_NONSECURE == 1) +void XSdps_Smc(XSdPs *InstancePtr, u32 RegOffset, u32 Mask, u32 Val); +#endif + +#ifdef __cplusplus +} +#endif + +#endif +/** @endcond */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_hw.h new file mode 100644 index 0000000..d7c4e9d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xsdps_hw.h @@ -0,0 +1,1508 @@ +/****************************************************************************** +* Copyright (C) 2013 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xsdps_hw.h +* @addtogroup sdps Overview +* @{{ +* +* The xsdps_hw.h 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
    +* 3.6   mn     07/06/18 Fix Doxygen warnings for sdps driver
    +* 3.8   mn     04/12/19 Modified TapDelay code for supporting ZynqMP and Versal
    +*       mn     05/21/19 Set correct tap delays for Versal
    +*       mn     05/21/19 Disable DLL Reset code for Versal
    +*       mn     07/03/19 Update Input Tap Delays for Versal
    +* 3.9   mn     03/03/20 Restructured the code for more readability and modularity
    +* 3.14  mn     11/28/21 Fix MISRA-C violations.
    +* 4.0   sk     02/25/22 Add support for eMMC5.1.
    +*       sk     04/07/22 Fix typo in 'XSDPS_MMC_1_BIT_BUS_ARG' macro definition.
    +* 4.1   sk     11/10/22 Add SD/eMMC Tap delay support for Versal Net.
    +* 4.2   ro     06/12/23 Added support for system device-tree flow.
    +*
    +* 
    +* +******************************************************************************/ + +/** @cond INTERNAL */ +#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 "bspconfig.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 */ +#ifdef VERSAL_NET +#define XSDPS_PHYCTRLREG1_OFFSET 0x270U /**< PHY Control register2 */ +#define XSDPS_PHYCTRLREG2_OFFSET 0x274U /**< PHY Control register2 */ +#endif + +/** @} */ + +/** @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 /**< INT clk enable */ +#define XSDPS_CC_INT_CLK_STABLE_MASK 0x00000002U /**< INT clk stable */ +#define XSDPS_CC_SD_CLK_EN_MASK 0x00000004U /**< SD clk enable */ +#define XSDPS_CC_SD_CLK_GEN_SEL_MASK 0x00000020U /**< SD clk gen selection */ +#define XSDPS_CC_SDCLK_FREQ_SEL_EXT_MASK 0x00000003U /**< SD clk freq sel upper */ +#define XSDPS_CC_SDCLK_FREQ_SEL_MASK 0x000000FFU /**< SD clk freq sel */ +#define XSDPS_CC_SDCLK_FREQ_D256_MASK 0x00008000U /**< Divider 256 */ +#define XSDPS_CC_SDCLK_FREQ_D128_MASK 0x00004000U /**< Divider 128 */ +#define XSDPS_CC_SDCLK_FREQ_D64_MASK 0x00002000U /**< Divider 64 */ +#define XSDPS_CC_SDCLK_FREQ_D32_MASK 0x00001000U /**< Divider 32 */ +#define XSDPS_CC_SDCLK_FREQ_D16_MASK 0x00000800U /**< Divider 16 */ +#define XSDPS_CC_SDCLK_FREQ_D8_MASK 0x00000400U /**< Divider 8 */ +#define XSDPS_CC_SDCLK_FREQ_D4_MASK 0x00000200U /**< Divider 4 */ +#define XSDPS_CC_SDCLK_FREQ_D2_MASK 0x00000100U /**< Divider 2 */ +#define XSDPS_CC_SDCLK_FREQ_BASE_MASK 0x00000000U /**< Base clock */ +#define XSDPS_CC_MAX_DIV_CNT 256U /**< Max divider count */ +#define XSDPS_CC_EXT_MAX_DIV_CNT 2046U /**< Max extended divider count */ +#define XSDPS_CC_EXT_DIV_SHIFT 6U /**< Ext divider shift */ + +#define XSDPS_TC_CNTR_VAL_MASK 0x0000000FU /**< Data timeout counter */ + +#define XSDPS_SWRST_ALL_MASK 0x00000001U /**< Software Reset All */ +#define XSDPS_SWRST_CMD_LINE_MASK 0x00000002U /**< Software reset for CMD line */ +#define XSDPS_SWRST_DAT_LINE_MASK 0x00000004U /**< Software reset for DAT line */ + +#define XSDPS_CC_MAX_NUM_OF_DIV 9U /**< Max number of Clock dividers */ +#define XSDPS_CC_DIV_SHIFT 8U /**< Clock Divider shift */ + +/** @} */ + +/** @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_HS400_MASK 0x0005U /**< HS400 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 Capabilities 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 Response */ +#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 /**< HC spec version 3 */ +#define XSDPS_HC_SPEC_V2 0x0001U /**< HC spec version 2 */ +#define XSDPS_HC_SPEC_V1 0x0000U /**< HC spec version 1 */ +/** @} */ + +/** @name PHYCTRL Register1 - OTAP, ITAP and SROBE SEL + * + * This register contains bits for input tap, output tap and strobe sel. + * @{ + */ + +#define XSDPS_PHYREG1_STROBE_SEL_MASK 0xFF0000U /**< STROBE Sel Mask */ +#define XSDPS_PHYREG1_STROBE_SEL_SHIFT 16U /**< STROBE Sel Shift */ +#define XSDPS_PHYREG1_ITAP_CHGWIN_MASK 0x40U /**< Input Tap Change Window */ +#define XSDPS_PHYREG1_ITAP_EN_MASK 0x1U /**< Input Tap Enable Mask */ +#define XSDPS_PHYREG1_ITAP_DLY_MASK 0x2EU /**< Input Tap Delay Mask */ +#define XSDPS_PHYREG1_ITAP_DLY_SHIFT 1U /**< Input Tap Delay Shift */ +#define XSDPS_PHYREG1_OTAP_EN_MASK 0x100U /**< Output Tap Enable Mask */ +#define XSDPS_PHYREG1_OTAP_DLY_MASK 0xF000U /**< Output Tap Delay Mask */ +#define XSDPS_PHYREG1_OTAP_DLY_SHIFT 12U /**< Output Tap Delay Shift */ + +/** @} */ + +/** @name PHYCTRL Register2 - DLL enable, FREQ_SEL, Tx and Rx Dly Chain Sel + * + * This register contains bits for cDLL enable, FREQ_SEL, Tx and Rx Dly Chain Sel + * and DLL Ready. + * @{ + */ + +#define XSDPS_PHYREG2_DLL_EN_MASK 0x00000001U /**< DLL enable */ +#define XSDPS_PHYREG2_DLL_RDY_MASK 0x00000002U /**< DLL Ready */ +#define XSDPS_PHYREG2_FREQ_SEL_MASK 0x00000070U /**< Freq selection */ +#define XSDPS_PHYREG2_FREQ_SEL_SHIFT 4U /**< Freq selection shift */ +#define XSDPS_FREQ_SEL_170MHZ_200MHz 0U /**< Macro to select between 170MHz to 200MHz */ +#define XSDPS_FREQ_SEL_140MHZ_169MHz 1U /**< Macro to select between 140MHz to 169MHz */ +#define XSDPS_FREQ_SEL_110MHZ_139MHz 2U /**< Macro to select between 110MHz to 139MHz */ +#define XSDPS_FREQ_SEL_80MHZ_109MHz 3U /**< Macro to select between 80MHz to 109MHz */ +#define XSDPS_FREQ_SEL_50MHZ_79MHz 4U /**< Macro to select between 50MHz to 79MHz */ +#define XSDPS_PHYREG2_TRIM_ICP_MASK 0x00000F00U /**< DLL TRIM ICP */ +#define XSDPS_PHYREG2_TRIM_ICP_DEF_VAL 8U /**< DLL TRIM ICP default value */ +#define XSDPS_PHYREG2_TRIM_ICP_SHIFT 8U /**< DLL TRIM ICP shift */ +#define XSDPS_PHYREG2_DLYTX_SEL_MASK 0x00010000U /**< Delay Chain based Tx Clk */ +#define XSDPS_PHYREG2_DLYRX_SEL_MASK 0x00020000U /**< Delay Chain based Rx Clk */ +/** @} */ + +/** @name Commands + * + * Constant definitions for commands and response related to SD + * @{ + */ +/** + * Command/Response related to SD/eMMC + */ + +#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 CMD32 0x2000U +#define CMD33 0x2100U +#define CMD35 0x2300U +#define CMD36 0x2400U +#define CMD38 0x2600U +#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 + +/** @} */ + +/** + * @name Card Interface + * @{ + */ +/** + * 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) +/** @} */ + +/** + * @name OCR + * @{ + */ +/** + * Operation Conditions Register Definitions + */ +#define XSDPS_OCR_PWRUP_STS (0x00000001U << 31) +#define XSDPS_OCR_CC_STS (0x00000001U << 30) +#define XSDPS_OCR_S18 (0x00000001U << 24) +#define XSDPS_OCR_3V5_3V6 (0x00000001U << 23) +#define XSDPS_OCR_3V4_3V5 (0x00000001U << 22) +#define XSDPS_OCR_3V3_3V4 (0x00000001U << 21) +#define XSDPS_OCR_3V2_3V3 (0x00000001U << 20) +#define XSDPS_OCR_3V1_3V2 (0x00000001U << 19) +#define XSDPS_OCR_3V0_3V1 (0x00000001U << 18) +#define XSDPS_OCR_2V9_3V0 (0x00000001U << 17) +#define XSDPS_OCR_2V8_2V9 (0x00000001U << 16) +#define XSDPS_OCR_2V7_2V8 (0x00000001U << 15) +#define XSDPS_OCR_1V7_1V95 (0x00000001U << 7) +#define XSDPS_OCR_HIGH_VOL 0x00FF8000U +#define XSDPS_OCR_LOW_VOL 0x00000080U +/** @} */ + +/** + * @name Card Configuration + * @{ + */ +/** + * 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) +/** @} */ + +/** + * @name Card Status + * @{ + */ +/** + * 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) +/** @} */ + +/** + * @name Switch function + * @{ + */ +/** + * Switch Function Definitions CMD6 + */ +#define XSDPS_SWITCH_SD_RESP_LEN 64U + +#define XSDPS_SWITCH_FUNC_SWITCH (1U<<31) +#define XSDPS_SWITCH_FUNC_CHECK 0U +/** @} */ + +/** + * @name Mode Function + * @{ + */ +/** + * Mode function groups definitions. + */ +#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 +/** @} */ + +/** + * @name Operating modes + * @{ + */ +/** + * SD operating modes in UHS. + */ +#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 +/** @} */ + +/** + * @name General definitions + * @{ + */ +/** + * Definitions related to Driver strength, Current limit and + * CSD specific data. + */ +#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 +#define CSD_CCC_MASK 0xFFF00000U +#define CSD_CCC_SHIFT 20U +#define CSD_CCC_CLASS5_MASK 0x20U +/** @} */ + +/** + * @name Extended Card Specific Data + * @{ + */ +/** + * 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_BOOT1 (0x2U) +#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3U) +#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4U) +#define EXT_CSD_PART_CONFIG_BYTE (179U) +#define XSDPS_MMC_PART_CFG_0_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24U) \ + | ((u32)EXT_CSD_PART_CONFIG_BYTE << 16U) \ + | ((u32)(0U) << 8U)) + +#define XSDPS_MMC_PART_CFG_1_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24U) \ + | ((u32)EXT_CSD_PART_CONFIG_BYTE << 16U) \ + | ((u32)EXT_CSD_PART_CONFIG_ACC_BOOT0 << 8U)) + +#define XSDPS_MMC_PART_CFG_2_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24U) \ + | ((u32)EXT_CSD_PART_CONFIG_BYTE << 16U) \ + | ((u32)EXT_CSD_PART_CONFIG_ACC_BOOT1 << 8U)) + +#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_HS_TIMING_HS400 3U /* 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 +/** @} */ + +/** + * @name SD/eMMC Bus Speed and Bus Width Arguments + * @{ + */ +/** + * SD/MMC Arguments for Bus Speed and Bus Width. + */ +#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_HS400_ARG (((u32)XSDPS_EXT_CSD_WRITE_BYTE << 24) \ + | ((u32)EXT_CSD_HS_TIMING_BYTE << 16) \ + | ((u32)EXT_CSD_HS_TIMING_HS400 << 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_WIDTH_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 + +/** @} */ + +/** + * @name General Delay definitions + * @{ + */ +/** + * @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 /**< Default voltage level */ +#define XSDPS_CARD_DEF_ADDR 0x1234U /**< Card Default address */ + +#define XSDPS_CARD_SD 1U /**< SD card */ +#define XSDPS_CARD_MMC 2U /**< MMC card */ +#define XSDPS_CARD_SDIO 3U /**< SDIO card */ +#define XSDPS_CARD_SDCOMBO 4U /**< SDCOMBO card */ +#define XSDPS_CHIP_EMMC 5U /**< EMMC chip */ + + +/** + *@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 /**< SCR Block Count */ +#define XSDPS_SCR_BLKSIZE 8U /**< SCR Block Size */ +#define XSDPS_1_BIT_WIDTH 0x1U /**< Bus Width 1 */ +#define XSDPS_4_BIT_WIDTH 0x2U /**< Bus Width 4 */ +#define XSDPS_8_BIT_WIDTH 0x3U /**< Bus Width 8 */ +#define XSDPS_UHS_SPEED_MODE_SDR12 0x0U /**< SDR12 mode */ +#define XSDPS_UHS_SPEED_MODE_SDR25 0x1U /**< SDR25 mode */ +#define XSDPS_UHS_SPEED_MODE_SDR50 0x2U /**< SDR50 mode */ +#define XSDPS_UHS_SPEED_MODE_SDR104 0x3U /**< SDR104 mode */ +#define XSDPS_UHS_SPEED_MODE_DDR50 0x4U /**< DDR50 mode */ +#define XSDPS_HIGH_SPEED_MODE 0x5U /**< High Speed mode */ +#define XSDPS_DEFAULT_SPEED_MODE 0x6U /**< Default speed mode */ +#define XSDPS_HS200_MODE 0x7U /**< eMMC HS200 mode */ +#define XSDPS_HS400_MODE 0x8U /**< eMMC HS400 mode */ +#define XSDPS_DDR52_MODE 0x4U /**< eMMC DDR52 mode */ +#define XSDPS_SWITCH_CMD_BLKCNT 1U /**< Blk cnt for SWITCH cmd */ +#define XSDPS_SWITCH_CMD_BLKSIZE 64U /**< Blk sz for SWITCH cmd */ +#define XSDPS_SWITCH_CMD_HS_GET 0x00FFFFF0U /**< SWITCH cmd to Get HS */ +#define XSDPS_SWITCH_CMD_HS_SET 0x80FFFFF1U /**< SWITCH cmd to Set HS */ +#define XSDPS_SWITCH_CMD_SDR12_SET 0x80FFFFF0U /**< SWITCH cmd to Set SDR12 */ +#define XSDPS_SWITCH_CMD_SDR25_SET 0x80FFFFF1U /**< SWITCH cmd to Set SDR25 */ +#define XSDPS_SWITCH_CMD_SDR50_SET 0x80FFFFF2U /**< SWITCH cmd to Set SDR50 */ +#define XSDPS_SWITCH_CMD_SDR104_SET 0x80FFFFF3U /**< SWITCH cmd to Set SDR104 */ +#define XSDPS_SWITCH_CMD_DDR50_SET 0x80FFFFF4U /**< SWITCH cmd to Set DDR50 */ +#define XSDPS_EXT_CSD_CMD_BLKCNT 1U /**< Blk Cnt for EXT CSD */ +#define XSDPS_EXT_CSD_CMD_BLKSIZE 512U /**< Blk Sz for EXT CSD */ +#define XSDPS_TUNING_CMD_BLKCNT 1U /**< Blk Cnt for Tuning cmd */ +#define XSDPS_TUNING_CMD_BLKSIZE 64U /**< Blk Sz for Tuning cmd */ +#define XSDPS_SD_STATUS_BLKCNT 1U /**< Blk Cnt for SD status */ +#define XSDPS_SD_STATUS_BLKSIZE 64U /**< Blk Sz for SD status */ + +#define XSDPS_HIGH_SPEED_MAX_CLK 50000000U /**< Max clk for HS mode */ +#define XSDPS_UHS_SDR104_MAX_CLK 208000000U /**< Max clk for SDR104 mode */ +#define XSDPS_UHS_SDR50_MAX_CLK 100000000U /**< Max clk for SDR50 mode */ +#define XSDPS_UHS_DDR50_MAX_CLK 50000000U /**< Max clk for DDR50 mode */ +#define XSDPS_UHS_SDR25_MAX_CLK 50000000U /**< Max clk for SDR25 mode */ +#define XSDPS_UHS_SDR12_MAX_CLK 25000000U /**< Max clk for SDR12 mode */ + +#define SD_DRIVER_TYPE_B 0x01U /**< Driver Type B */ +#define SD_DRIVER_TYPE_A 0x02U /**< Driver Type A */ +#define SD_DRIVER_TYPE_C 0x04U /**< Driver Type C */ +#define SD_DRIVER_TYPE_D 0x08U /**< Driver Type D */ +#define SD_SET_CURRENT_LIMIT_200 0U /**< Current limit 200mA */ +#define SD_SET_CURRENT_LIMIT_400 1U /**< Current limit 400mA */ +#define SD_SET_CURRENT_LIMIT_600 2U /**< Current limit 600mA */ +#define SD_SET_CURRENT_LIMIT_800 3U /**< Current limit 800mA */ + +#define SD_MAX_CURRENT_200 (1U << SD_SET_CURRENT_LIMIT_200) /**< Current limit 200mA Arg */ +#define SD_MAX_CURRENT_400 (1U << SD_SET_CURRENT_LIMIT_400) /**< Current limit 400mA Arg */ +#define SD_MAX_CURRENT_600 (1U << SD_SET_CURRENT_LIMIT_600) /**< Current limit 600mA Arg */ +#define SD_MAX_CURRENT_800 (1U << SD_SET_CURRENT_LIMIT_800) /**< Current limit 800mA Arg */ + +#define XSDPS_SD_SDR12_MAX_CLK 25000000U /**< Max clk for SDR12 mode */ +#define XSDPS_SD_SDR25_MAX_CLK 50000000U /**< Max clk for SDR25 mode */ +#define XSDPS_SD_SDR50_MAX_CLK 100000000U /**< Max clk for SDR50 mode */ +#define XSDPS_SD_DDR50_MAX_CLK 50000000U /**< Max clk for DDR50 mode */ +#define XSDPS_SD_SDR104_MAX_CLK 208000000U /**< Max clk for SDR104 mode */ +/** + * 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 /**< Max clk for MMC HS200 mode */ +#define XSDPS_MMC_HSD_MAX_CLK 52000000U /**< Max clk for MMC HSD mode */ +#define XSDPS_MMC_DDR_MAX_CLK 52000000U /**< Max clk for MMC DDR52 mode */ + +#define XSDPD_MIN_DLL_MODE_CLK 50000000U /**< Min clk for DLL mode */ + +/** + * @name Card states + * @{ + */ +/** + * Definition for Card state. + */ +#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 /**< Removable slot */ +#define XSDPS_SLOT_EMB 1U /**< Embedded slot */ + +#define XSDPS_WIDTH_8 8U /**< Bus width 8 */ +#define XSDPS_WIDTH_4 4U /**< Bus width 4 */ + +#define XSDPS_SLOTTYPE_SDADIR 4U /**< SD3.0 Auto Direction */ + +/** + * @name Tap delays + * @{ + */ +/** + * SD/eMMC ITAP and OTAP delays for different operating modes + * for both Versal and ZynqMP platforms. + */ +#ifdef VERSAL_NET +#define SD_ITAPDLY_SEL_MASK 0x000000FFU +#define SD_OTAPDLY_SEL_MASK 0x0000003FU +#define SD_ITAPDLY 0x0000F0F8U +#define SD_OTAPDLY 0x0000F0FCU +#define SD0_DLL_CTRL 0x00000448U +#define SD1_DLL_CTRL 0x000004C8U +#define SD_DLL_RST 0x00000004U +#define SD_ITAPCHGWIN 0x00000200U +#define SD_ITAPDLYENA 0x00000100U +#define SD_OTAPDLYENA 0x00000040U +#define SD_OTAPDLYSEL_HS200_B0 0x00000007U +#define SD_OTAPDLYSEL_HS200_B2 0x00000007U +#define SD_OTAPDLYSEL_HS400 0x00000004U +#define SD_ITAPDLYSEL_SD50 0x0000000EU +#define SD_OTAPDLYSEL_SD50 0x00000003U +#define SD_ITAPDLYSEL_SD_DDR50 0x00000036U +#define SD_ITAPDLYSEL_EMMC_DDR50 0x00000003U +#define SD_OTAPDLYSEL_SD_DDR50 0x00000003U +#define SD_OTAPDLYSEL_EMMC_DDR50 0x00000005U +#define SD_ITAPDLYSEL_HSD 0x0000002CU +#define SD_ITAPDLYSEL_EMMC_HSD 0x00000000U +#define SD_OTAPDLYSEL_SD_HSD 0x00000004U +#define SD_OTAPDLYSEL_EMMC_HSD 0x00000005U +#define SD_AUTODIR_ITAPDLYSEL_HSD 0x00000025U +#define SD_AUTODIR_ITAPDLYSEL_SDR25 0x00000026U +#define SD_AUTODIR_ITAPDLYSEL_DDR50 0x0000002AU +#define PHY_STRB_SEL_SIG 0x00000077U +#elif defined (versal) +#define SD_ITAPDLY_SEL_MASK 0x000000FFU +#define SD_OTAPDLY_SEL_MASK 0x0000003FU +#define SD_ITAPDLY 0x0000F0F8U +#define SD_OTAPDLY 0x0000F0FCU +#define SD0_DLL_CTRL 0x00000448U +#define SD1_DLL_CTRL 0x000004C8U +#define SD_DLL_RST 0x00000004U +#define SD_ITAPCHGWIN 0x00000200U +#define SD_ITAPDLYENA 0x00000100U +#define SD_OTAPDLYENA 0x00000040U +#define SD_OTAPDLYSEL_HS200_B0 0x00000002U +#define SD_OTAPDLYSEL_HS200_B2 0x00000002U +#define SD_ITAPDLYSEL_SD50 0x0000000EU +#define SD_OTAPDLYSEL_SD50 0x00000003U +#define SD_ITAPDLYSEL_SD_DDR50 0x00000036U +#define SD_ITAPDLYSEL_EMMC_DDR50 0x0000001EU +#define SD_OTAPDLYSEL_SD_DDR50 0x00000003U +#define SD_OTAPDLYSEL_EMMC_DDR50 0x00000005U +#define SD_ITAPDLYSEL_HSD 0x0000002CU +#define SD_ITAPDLYSEL_EMMC_HSD 0x0000002CU +#define SD_OTAPDLYSEL_SD_HSD 0x00000004U +#define SD_OTAPDLYSEL_EMMC_HSD 0x00000005U +#define SD_AUTODIR_ITAPDLYSEL_HSD 0x00000025U +#define SD_AUTODIR_ITAPDLYSEL_SDR25 0x00000026U +#define SD_AUTODIR_ITAPDLYSEL_DDR50 0x0000002AU +#else +#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 SD_OTAPDLYSEL_HS200_B0 0x00000003U +#define SD_OTAPDLYSEL_HS200_B2 0x00000002U +#define SD_ITAPDLYSEL_SD50 0x00000014U +#define SD_OTAPDLYSEL_SD50 0x00000003U +#define SD_ITAPDLYSEL_SD_DDR50 0x0000003DU +#define SD_ITAPDLYSEL_EMMC_DDR50 0x00000012U +#define SD_OTAPDLYSEL_SD_DDR50 0x00000004U +#define SD_OTAPDLYSEL_EMMC_DDR50 0x00000006U +#define SD_ITAPDLYSEL_HSD 0x00000015U +#define SD_ITAPDLYSEL_EMMC_HSD 0x00000015U +#define SD_OTAPDLYSEL_SD_HSD 0x00000005U +#define SD_OTAPDLYSEL_EMMC_HSD 0x00000006U +#define SD_AUTODIR_ITAPDLYSEL_HSD 0x00000028U +#define SD_AUTODIR_ITAPDLYSEL_SDR25 0x0000002CU +#define SD_AUTODIR_ITAPDLYSEL_DDR50 0x00000033U +#endif +/** @} */ + +#ifdef __MICROBLAZE__ +#define XPS_SYS_CTRL_BASEADDR 0xFF180000U /**< System controller Baseaddress */ +#endif + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ +#define XSdPs_In64 Xil_In64 /**< Low level 64-bit data read */ +#define XSdPs_Out64 Xil_Out64 /**< Low level 64-bit data write */ + +#define XSdPs_In32 Xil_In32 /**< Low level 32-bit data read */ +#define XSdPs_Out32 Xil_Out32 /**< Low level 32-bit data write */ + +#define XSdPs_In16 Xil_In16 /**< Low level 16-bit data read */ +#define XSdPs_Out16 Xil_Out16 /**< Low level 16-bit data write */ + +#define XSdPs_In8 Xil_In8 /**< Low level 8-bit data read */ +#define XSdPs_Out8 Xil_Out8 /**< Low level 8-bit data write */ + +/****************************************************************************/ +/** +* Read a register. +* +* @param InstancePtr is the pointer to the sdps instance. +* @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 InstancePtr is the pointer to the sdps instance. +* @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(UINTPTR BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XSdPs_ReadReg(BaseAddress, RegOffset) \ + XSdPs_In32((UINTPTR)(BaseAddress) + (UINTPTR)(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(UINTPTR BaseAddress, int RegOffset, +* u32 RegisterValue) +* +******************************************************************************/ +#define XSdPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XSdPs_Out32((UINTPTR)(BaseAddress) + (UINTPTR)(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(UINTPTR BaseAddress. int RegOffset) +* +******************************************************************************/ +static INLINE u16 XSdPs_ReadReg16(UINTPTR 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((UINTPTR)(BaseAddress) + (UINTPTR)(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(UINTPTR BaseAddress, int RegOffset, +* u16 RegisterValue) +* +******************************************************************************/ + +static INLINE void XSdPs_WriteReg16(UINTPTR BaseAddress, u8 RegOffset, u16 RegisterValue) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg &= ~(0xFFFFU << ((RegOffset & 0x3) * 8)); + Reg |= RegisterValue << ((RegOffset & 0x3) * 8); + XSdPs_Out32(BaseAddress, Reg); +#else + XSdPs_Out16((UINTPTR)(BaseAddress) + (UINTPTR)(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(UINTPTR BaseAddress. int RegOffset) +* +******************************************************************************/ +static INLINE u8 XSdPs_ReadReg8(UINTPTR 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((UINTPTR)(BaseAddress) + (UINTPTR)(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(UINTPTR BaseAddress, int RegOffset, +* u8 RegisterValue) +* +******************************************************************************/ +static INLINE void XSdPs_WriteReg8(UINTPTR BaseAddress, u8 RegOffset, u8 RegisterValue) +{ +#if defined (__MICROBLAZE__) + u32 Reg; + BaseAddress += RegOffset & 0xFC; + Reg = XSdPs_In32(BaseAddress); + Reg &= ~(0xFFU << ((RegOffset & 0x3) * 8)); + Reg |= RegisterValue << ((RegOffset & 0x3) * 8); + XSdPs_Out32(BaseAddress, Reg); +#else + XSdPs_Out8((UINTPTR)(BaseAddress) + (UINTPTR)(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(UINTPTR 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_ */ +/** @endcond */ +/** @} */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xstatus.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xstatus.h new file mode 100644 index 0000000..f534bdf --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xstatus.h @@ -0,0 +1,525 @@ +/****************************************************************************** +* Copyright (c) 2002 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022-2023, Advanced Micro Devices, Inc. All Rights Reserved. * +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @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. +* +* @{ +******************************************************************************/ + +/** + *@cond nocomments + */ + +#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" +#include "bspconfig.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 */ +#define XST_NO_ACCESS 30L /* Generic access error */ +#define XST_TIMEOUT 31L /*!< Event timeout occurred */ +#define XST_GLITCH_ERROR 32L /*!< Used when a glitch occurs*/ + +/** @} */ +/***************** 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 descriptors 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 committed */ +#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 */ +#define XST_IIC_ARB_LOST 1089 /*!< Arbitration lost for master */ +/** @} */ +/** +@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 */ + +/** + *@endcond + */ + +/** +* @} End of "addtogroup common_status_codes". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xtime_l.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xtime_l.h new file mode 100644 index 0000000..9d17f5c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xtime_l.h @@ -0,0 +1,86 @@ +/****************************************************************************** +* Copyright (c) 2009 - 2021 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* @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 Updated 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 Updated get/set time functions to make use Global Timer
    +* 6.6   srm    10/23/17 Updated the macros to support user configurable sleep
    +*						implementation
    +* 6.8   aru  09/06/18 Removed compilation warnings for ARMCC toolchain.
    +* 7.5   mus    04/30/21  Moved pragma message from xtime_l.h to xtime_l.c, to avoid
    +*                        displaying same warnings multiple times. It fixes CR#1090562.
    +* 
    +* +******************************************************************************/ + +/** +*@cond nocomments +*/ + +#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 +/************************** Variable Definitions *****************************/ + +/** +*@endcond +*/ + +/************************** 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". +*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps.h new file mode 100644 index 0000000..89ed5fd --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps.h @@ -0,0 +1,523 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xuartps.h +* @addtogroup uartps Overview +* @{ +* @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. The 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.
    +* 3.7   aru    08/17/18 Resolved MISRA-C:2012 compliance mandatory violations.
    +* 3.9   rna    12/03/19 Modified the XUARTPS_MAX_RATE macro.
    +* 3.9   sd     02/06/20 Added clock support
    +* 3.12	gm     11/04/22 Added timeout support using Xil_WaitForEvent
    +* 3.13	adk    14/04/23 Added support for system device-tree flow.
    +*
    +* 
    +* +*****************************************************************************/ + +#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" +#if defined (XCLOCKING) +#include "xil_clocking.h" +#endif +#include "xil_util.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 6240000U +#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 */ + +/*@}*/ + +#define TIMEOUT_VAL 1000000U /**< Wait for 1 sec in worst case */ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { +#ifndef SDT + u16 DeviceId; /**< Unique ID of device */ +#else + char *Name; +#endif + u32 BaseAddress; /**< Base address of device (IPIF) */ + u32 InputClockHz;/**< Input clock frequency */ + s32 ModemPinsConnected; /** Specifies whether modem pins are connected + * to MIO or FMIO */ +#if defined (XCLOCKING) || defined(SDT) + u32 RefClk; /**< Input clock frequency */ +#endif +#if defined(SDT) + u32 IntrId; /** Bits[11:0] Interrupt-id Bits[15:12] + * trigger type and level flags */ + UINTPTR IntrParent; /** Bit[0] Interrupt parent type Bit[64/32:1] + * Parent base address */ +#endif +} 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 */ +#ifndef SDT +XUartPs_Config *XUartPs_LookupConfig(u16 DeviceId); +#else +XUartPs_Config *XUartPs_LookupConfig(u32 BaseAddress); +#endif + +/* 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps_hw.h new file mode 100644 index 0000000..144f28c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/xuartps_hw.h @@ -0,0 +1,427 @@ +/****************************************************************************** +* Copyright (C) 2010 - 2021 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** +* +* @file xuartps_hw.h +* @addtogroup uartps Overview +* @{ +* +* 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" +#include "xstatus.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 compatibility, 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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/qemu/qemu_args.txt b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/qemu/qemu_args.txt new file mode 100644 index 0000000..39b5bda --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/qemu/qemu_args.txt @@ -0,0 +1,51 @@ +######################################################################## +# This is file which used to generate QEMU(which emulates A9 core) +# commandline(start_qemu.sh script) which used in Zynq HW-EMU. +# This is a template file which is packaged in platform and it gets +# processed by Vitis tool to generate meaningful file. +# +# This file contains flag and value pairs and they must be seperated +# into two lines value followed by flag. Below are the common/mandated +# flag and value pairs used for emulating Zynq. User can add more +# commandline args to this file depends on requirements. +# +# For more details on the QEMU commandline, please refer to +# the QEMU user guide UG1169. +######################################################################## +# +# +# selects emulated machine +-M +arm-generic-fdt-7series +# +# +# redirect the serial port to specified char dev (i.e stdio, tcp port, file etc) +-serial +/dev/null +-serial +mon:stdio +# +# +# Register writes to SLCR block, to set PLL and CLK_CTRL regs (required for linux) +-device +loader,addr=0xf8000008,data=0xDF0D,data-len=4 +-device +loader,addr=0xf8000140,data=0x00500801,data-len=4 +-device +loader,addr=0xf800012c,data=0x1ed044d,data-len=4 +-device +loader,addr=0xf8000108,data=0x0001e008,data-len=4 +-device +loader,addr=0xF800025C,data=0x00000005,data-len=4 +-device +loader,addr=0xF8000240,data=0x00000000,data-len=4 +# +# +# Boot device selection +-boot +mode=5 +# +# +# Guest software to load during boot up +-kernel + diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/platform.spr b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/platform.spr index 198f7f2..c0a49bb 100644 --- a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/platform.spr +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/platform.spr @@ -1 +1 @@ -{"platformName":"NewInstCal_bsp","sprVersion":"2.0","mode":"gui","dsaType":"Fixed","platformDesc":"NewInstCal_bsp","platHandOff":"/home/ly0kos/work/prj/New_CalBoard/2.FW/Zynq/proj_cal/Vitis/system_wrapper.xsa","platIntHandOff":"/hw/system_wrapper.xsa","deviceType":"zynq","platIsPrebuiltAutogen":"false","platIsNoBootBsp":"false","hasFsblMakeHasChanges":"false","hasPmufwMakeHasChanges":"false","fsblExtraCompilerFlags":"-MMD -MP -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard ","platPreBuiltFlag":false,"platformSamplesDir":"","platActiveSys":"NewInstCal_bsp","systems":[{"systemName":"NewInstCal_bsp","systemDesc":"NewInstCal_bsp","sysIsBootAutoGen":"true","systemDispName":"NewInstCal_bsp","sysActiveDom":"standalone_domain","sysDefaultDom":"standalone_domain","domains":[{"domainName":"zynq_fsbl","domainDispName":"zynq_fsbl","domainDesc":"FSBL Application BSP - Auto Generated.","processors":"ps7_cortexa9_0","os":"standalone","sdxOs":"standalone","debugEnable":"","domRuntimes":["cpp"],"swRepo":"","mssOsVer":"9.0","mssFile":"","md5Digest":"88a630cf45945e27dbb40d72cff1145a","compatibleApp":"zynq_fsbl","domType":"bootDomain","arch":"32-bit","appSettings":{"appCompilerFlags":"","appLinkerFlags":""},"addedLibs":["xilffs:5.1","xilrsa:1.7"],"libOptions":{"libsContainingOptions":[]},"prebuiltLibs":{"prebuiltIncPath":[],"prebuiltLibPath":[]},"isolation":{}},{"domainName":"standalone_domain","domainDispName":"standalone on ps7_cortexa9_0","domainDesc":"standalone_domain","processors":"ps7_cortexa9_0","os":"standalone","sdxOs":"standalone","qemuArgs":"/resources/NewInstCal_bsp/standalone_domain/qemu_args.txt","qemuData":"/resources/NewInstCal_bsp/standalone_domain/qemu","debugEnable":"False","domRuntimes":["cpp"],"swRepo":"","mssOsVer":"9.0","mssFile":"","md5Digest":"36df5c3fd5a33f289a56469b013613e2","compatibleApp":"","domType":"mssDomain","appSettings":{"appCompilerFlags":"","appLinkerFlags":""},"addedLibs":["lwip213:1.1"],"libOptions":{"libsContainingOptions":[]},"prebuiltLibs":{"prebuiltIncPath":[],"prebuiltLibPath":[]},"isolation":{}}]}]} +{"platformName":"NewInstCal_bsp","sprVersion":"2.0","mode":"gui","dsaType":"Fixed","platformDesc":"NewInstCal_bsp","platHandOff":"../../system_wrapper.xsa","platIntHandOff":"/hw/system_wrapper.xsa","deviceType":"zynq","platIsPrebuiltAutogen":"false","platIsNoBootBsp":"false","hasFsblMakeHasChanges":"false","hasPmufwMakeHasChanges":"false","fsblExtraCompilerFlags":"-MMD -MP -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard ","platPreBuiltFlag":false,"platformSamplesDir":"","platActiveSys":"NewInstCal_bsp","systems":[{"systemName":"NewInstCal_bsp","systemDesc":"NewInstCal_bsp","sysIsBootAutoGen":"true","systemDispName":"NewInstCal_bsp","sysActiveDom":"standalone_domain","sysDefaultDom":"standalone_domain","domains":[{"domainName":"zynq_fsbl","domainDispName":"zynq_fsbl","domainDesc":"FSBL Application BSP - Auto Generated.","processors":"ps7_cortexa9_0","os":"standalone","sdxOs":"standalone","debugEnable":"","domRuntimes":["cpp"],"swRepo":"","mssOsVer":"9.0","mssFile":"","md5Digest":"88a630cf45945e27dbb40d72cff1145a","compatibleApp":"zynq_fsbl","domType":"bootDomain","arch":"32-bit","appSettings":{"appCompilerFlags":"","appLinkerFlags":""},"addedLibs":["xilffs:5.1","xilrsa:1.7"],"libOptions":{"libsContainingOptions":[]},"prebuiltLibs":{"prebuiltIncPath":[],"prebuiltLibPath":[]},"isolation":{}},{"domainName":"standalone_domain","domainDispName":"standalone on ps7_cortexa9_0","domainDesc":"standalone_domain","processors":"ps7_cortexa9_0","os":"standalone","sdxOs":"standalone","qemuArgs":"/resources/NewInstCal_bsp/standalone_domain/qemu_args.txt","qemuData":"/resources/NewInstCal_bsp/standalone_domain/qemu","debugEnable":"False","domRuntimes":["cpp"],"swRepo":"","mssOsVer":"9.0","mssFile":"","md5Digest":"36df5c3fd5a33f289a56469b013613e2","compatibleApp":"","domType":"mssDomain","appSettings":{"appCompilerFlags":"","appLinkerFlags":""},"addedLibs":["lwip213:1.1"],"libOptions":{"libsContainingOptions":[]},"prebuiltLibs":{"prebuiltIncPath":[],"prebuiltLibPath":[]},"isolation":{}}]}]} diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard/NewInstrCalBoard.prj b/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard/NewInstrCalBoard.prj index cae92f5..99af006 100644 --- a/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard/NewInstrCalBoard.prj +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard/NewInstrCalBoard.prj @@ -1,5 +1,5 @@ - + diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard_system/NewInstrCalBoard_system.sprj b/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard_system/NewInstrCalBoard_system.sprj index 070406f..b395ad1 100644 --- a/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard_system/NewInstrCalBoard_system.sprj +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstrCalBoard_system/NewInstrCalBoard_system.sprj @@ -1,5 +1,5 @@ - + diff --git a/2.FW/Zynq/proj_cal/Vitis/RemoteSystemsTempFiles/.project b/2.FW/Zynq/proj_cal/Vitis/RemoteSystemsTempFiles/.project deleted file mode 100644 index 5447a64..0000000 --- a/2.FW/Zynq/proj_cal/Vitis/RemoteSystemsTempFiles/.project +++ /dev/null @@ -1,12 +0,0 @@ - - - RemoteSystemsTempFiles - - - - - - - org.eclipse.rse.ui.remoteSystemsTempNature - -

    ~VL8 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 +Application: + +1. Copy the contents of this directory to an SD card +2. Set boot mode to SD +3. Insert SD card and turn board on diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/qemu/qemu_args.txt b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/qemu/qemu_args.txt new file mode 100644 index 0000000..39b5bda --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/qemu/qemu_args.txt @@ -0,0 +1,51 @@ +######################################################################## +# This is file which used to generate QEMU(which emulates A9 core) +# commandline(start_qemu.sh script) which used in Zynq HW-EMU. +# This is a template file which is packaged in platform and it gets +# processed by Vitis tool to generate meaningful file. +# +# This file contains flag and value pairs and they must be seperated +# into two lines value followed by flag. Below are the common/mandated +# flag and value pairs used for emulating Zynq. User can add more +# commandline args to this file depends on requirements. +# +# For more details on the QEMU commandline, please refer to +# the QEMU user guide UG1169. +######################################################################## +# +# +# selects emulated machine +-M +arm-generic-fdt-7series +# +# +# redirect the serial port to specified char dev (i.e stdio, tcp port, file etc) +-serial +/dev/null +-serial +mon:stdio +# +# +# Register writes to SLCR block, to set PLL and CLK_CTRL regs (required for linux) +-device +loader,addr=0xf8000008,data=0xDF0D,data-len=4 +-device +loader,addr=0xf8000140,data=0x00500801,data-len=4 +-device +loader,addr=0xf800012c,data=0x1ed044d,data-len=4 +-device +loader,addr=0xf8000108,data=0x0001e008,data-len=4 +-device +loader,addr=0xF800025C,data=0x00000005,data-len=4 +-device +loader,addr=0xF8000240,data=0x00000000,data-len=4 +# +# +# Boot device selection +-boot +mode=5 +# +# +# Guest software to load during boot up +-kernel + diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/_profile_timer_hw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/_profile_timer_hw.h new file mode 100644 index 0000000..b80c577 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/_profile_timer_hw.h @@ -0,0 +1,281 @@ +/****************************************************************************** +* Copyright (c) 2004 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + + +#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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cc.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cc.h new file mode 100644 index 0000000..264ce0a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cc.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __ARCH_CC_H__ +#define __ARCH_CC_H__ + +#include +#include + +#include "lwipopts.h" + +/** if you want to use the struct timeval provided + * by your system, set this to 0 and include in cc.h */ +#define LWIP_TIMEVAL_PRIVATE 0 +#include +#include "cpu.h" + +/* As per new design of lwip-2.0.2, + * LWIP_NO_STDINT_H should be defined as 1 in cc.h */ +#define LWIP_NO_STDINT_H 1 + +typedef unsigned char u8_t; +typedef signed char s8_t; +typedef unsigned short u16_t; +typedef signed short s16_t; +typedef unsigned int u32_t; +typedef signed int s32_t; +typedef unsigned long long u64_t; +typedef signed long long s64_t; + +#define S16_F "d" +#define U16_F "d" +#define S32_F "d" +#define U32_F "x" + +#define X16_F "x" +#define X32_F "x" + +#define LWIP_RAND rand + +typedef unsigned long mem_ptr_t; + +#define PACK_STRUCT_FIELD(x) x +#define PACK_STRUCT_STRUCT __attribute__((packed)) +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_END + +#define LWIP_PLATFORM_ASSERT(x) +#define LWIP_PLATFORM_DIAG(x) do { xil_printf x; } while(0) + +#endif /* __ARCH_CC_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cpu.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cpu.h new file mode 100644 index 0000000..18051e4 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/cpu.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __ARCH_CPU_H__ +#define __ARCH_CPU_H__ + +#include "lwipopts.h" + +#ifndef BYTE_ORDER +#ifdef PROCESSOR_LITTLE_ENDIAN +#define BYTE_ORDER LITTLE_ENDIAN +#else +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif + +#endif /* __ARCH_CPU_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/perf.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/perf.h new file mode 100644 index 0000000..95648e3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/perf.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __ARCH_PERF_H__ +#define __ARCH_PERF_H__ + +#define PERF_START /* null definition */ +#define PERF_STOP(x) /* null definition */ + +#ifdef __cplusplus +extern "C" { +#endif + +void perf_init(char *fname); + +#ifdef __cplusplus +} +#endif + +#endif /* __ARCH_PERF_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/sys_arch.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/sys_arch.h new file mode 100644 index 0000000..51dfe7a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/arch/sys_arch.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __SYS_XILINX_ARCH_H__ +#define __SYS_XILINX_ARCH_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lwipopts.h" + + +#if !NO_SYS + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +#include "timers.h" + +#define SYS_MBOX_NULL ( ( xQueueHandle ) NULL ) +#define SYS_SEM_NULL ( ( xSemaphoreHandle ) NULL ) +#define SYS_DEFAULT_THREAD_STACK_DEPTH configMINIMAL_STACK_SIZE + +typedef xSemaphoreHandle sys_sem_t; +typedef xSemaphoreHandle sys_mutex_t; +typedef xQueueHandle sys_mbox_t; +typedef xTaskHandle sys_thread_t; + +typedef unsigned long sys_prot_t; + +#define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) +#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL ) +#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) +#define sys_sem_set_invalid( x ) ( ( *x ) = NULL ) +#endif /* !NO_SYS */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SYS_XILINX_ARCH_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/bspconfig.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/bspconfig.h new file mode 100644 index 0000000..5498919 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/bspconfig.h @@ -0,0 +1,24 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by HSI. +* Version: 2023.2 +* DO NOT EDIT. +* +* Copyright (C) 2010-2026 Xilinx, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT + +* +* Description: Configurations for Standalone BSP +* +*******************************************************************/ + +#ifndef BSPCONFIG_H /* prevent circular inclusions */ +#define BSPCONFIG_H /* by using protection macros */ + +#define MICROBLAZE_PVR_NONE + +/* Definition for hard-float ABI */ +#define FPU_HARD_FLOAT_ABI_ENABLED 1 + +#endif /*end of __BSPCONFIG_H_*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp.h new file mode 100644 index 0000000..1b24544 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp.h @@ -0,0 +1,206 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * + * This file contains the generic API. + * For more details see @ref altcp_api. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_H +#define LWIP_HDR_ALTCP_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcpbase.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_pcb; +struct altcp_functions; + +typedef err_t (*altcp_accept_fn)(void *arg, struct altcp_pcb *new_conn, err_t err); +typedef err_t (*altcp_connected_fn)(void *arg, struct altcp_pcb *conn, err_t err); +typedef err_t (*altcp_recv_fn)(void *arg, struct altcp_pcb *conn, struct pbuf *p, err_t err); +typedef err_t (*altcp_sent_fn)(void *arg, struct altcp_pcb *conn, u16_t len); +typedef err_t (*altcp_poll_fn)(void *arg, struct altcp_pcb *conn); +typedef void (*altcp_err_fn)(void *arg, err_t err); + +typedef struct altcp_pcb* (*altcp_new_fn)(void *arg, u8_t ip_type); + +struct altcp_pcb { + const struct altcp_functions *fns; + struct altcp_pcb *inner_conn; + void *arg; + void *state; + /* application callbacks */ + altcp_accept_fn accept; + altcp_connected_fn connected; + altcp_recv_fn recv; + altcp_sent_fn sent; + altcp_poll_fn poll; + altcp_err_fn err; + u8_t pollinterval; +}; + +/** @ingroup altcp */ +typedef struct altcp_allocator_s { + /** Allocator function */ + altcp_new_fn alloc; + /** Argument to allocator function */ + void *arg; +} altcp_allocator_t; + +struct altcp_pcb *altcp_new(altcp_allocator_t *allocator); +struct altcp_pcb *altcp_new_ip6(altcp_allocator_t *allocator); +struct altcp_pcb *altcp_new_ip_type(altcp_allocator_t *allocator, u8_t ip_type); + +void altcp_arg(struct altcp_pcb *conn, void *arg); +void altcp_accept(struct altcp_pcb *conn, altcp_accept_fn accept); +void altcp_recv(struct altcp_pcb *conn, altcp_recv_fn recv); +void altcp_sent(struct altcp_pcb *conn, altcp_sent_fn sent); +void altcp_poll(struct altcp_pcb *conn, altcp_poll_fn poll, u8_t interval); +void altcp_err(struct altcp_pcb *conn, altcp_err_fn err); + +void altcp_recved(struct altcp_pcb *conn, u16_t len); +err_t altcp_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +err_t altcp_connect(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected); + +/* return conn for source code compatibility to tcp callback API only */ +struct altcp_pcb *altcp_listen_with_backlog_and_err(struct altcp_pcb *conn, u8_t backlog, err_t *err); +#define altcp_listen_with_backlog(conn, backlog) altcp_listen_with_backlog_and_err(conn, backlog, NULL) +/** @ingroup altcp */ +#define altcp_listen(conn) altcp_listen_with_backlog_and_err(conn, TCP_DEFAULT_LISTEN_BACKLOG, NULL) + +void altcp_abort(struct altcp_pcb *conn); +err_t altcp_close(struct altcp_pcb *conn); +err_t altcp_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); + +err_t altcp_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +err_t altcp_output(struct altcp_pcb *conn); + +u16_t altcp_mss(struct altcp_pcb *conn); +u16_t altcp_sndbuf(struct altcp_pcb *conn); +u16_t altcp_sndqueuelen(struct altcp_pcb *conn); +void altcp_nagle_disable(struct altcp_pcb *conn); +void altcp_nagle_enable(struct altcp_pcb *conn); +int altcp_nagle_disabled(struct altcp_pcb *conn); + +void altcp_setprio(struct altcp_pcb *conn, u8_t prio); + +err_t altcp_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +ip_addr_t *altcp_get_ip(struct altcp_pcb *conn, int local); +u16_t altcp_get_port(struct altcp_pcb *conn, int local); + +#if LWIP_TCP_KEEPALIVE +void altcp_keepalive_disable(struct altcp_pcb *conn); +void altcp_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); +#endif + +#ifdef LWIP_DEBUG +enum tcp_state altcp_dbg_get_tcp_state(struct altcp_pcb *conn); +#endif + +#ifdef __cplusplus +} +#endif + +#else /* LWIP_ALTCP */ + +/* ALTCP disabled, define everything to link against tcp callback API (e.g. to get a small non-ssl httpd) */ + +#include "lwip/tcp.h" + +#define altcp_accept_fn tcp_accept_fn +#define altcp_connected_fn tcp_connected_fn +#define altcp_recv_fn tcp_recv_fn +#define altcp_sent_fn tcp_sent_fn +#define altcp_poll_fn tcp_poll_fn +#define altcp_err_fn tcp_err_fn + +#define altcp_pcb tcp_pcb +#define altcp_tcp_new_ip_type tcp_new_ip_type +#define altcp_tcp_new tcp_new +#define altcp_tcp_new_ip6 tcp_new_ip6 + +#define altcp_new(allocator) tcp_new() +#define altcp_new_ip6(allocator) tcp_new_ip6() +#define altcp_new_ip_type(allocator, ip_type) tcp_new_ip_type(ip_type) + +#define altcp_arg tcp_arg +#define altcp_accept tcp_accept +#define altcp_recv tcp_recv +#define altcp_sent tcp_sent +#define altcp_poll tcp_poll +#define altcp_err tcp_err + +#define altcp_recved tcp_recved +#define altcp_bind tcp_bind +#define altcp_connect tcp_connect + +#define altcp_listen_with_backlog_and_err tcp_listen_with_backlog_and_err +#define altcp_listen_with_backlog tcp_listen_with_backlog +#define altcp_listen tcp_listen + +#define altcp_abort tcp_abort +#define altcp_close tcp_close +#define altcp_shutdown tcp_shutdown + +#define altcp_write tcp_write +#define altcp_output tcp_output + +#define altcp_mss tcp_mss +#define altcp_sndbuf tcp_sndbuf +#define altcp_sndqueuelen tcp_sndqueuelen +#define altcp_nagle_disable tcp_nagle_disable +#define altcp_nagle_enable tcp_nagle_enable +#define altcp_nagle_disabled tcp_nagle_disabled +#define altcp_setprio tcp_setprio + +#define altcp_get_tcp_addrinfo tcp_get_tcp_addrinfo +#define altcp_get_ip(pcb, local) ((local) ? (&(pcb)->local_ip) : (&(pcb)->remote_ip)) + +#ifdef LWIP_DEBUG +#define altcp_dbg_get_tcp_state tcp_dbg_get_tcp_state +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tcp.h new file mode 100644 index 0000000..dbde584 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tcp.h @@ -0,0 +1,72 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + * + * This file contains the base implementation calling into tcp. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_TCP_H +#define LWIP_HDR_ALTCP_TCP_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_pcb *altcp_tcp_new_ip_type(u8_t ip_type); + +#define altcp_tcp_new() altcp_tcp_new_ip_type(IPADDR_TYPE_V4) +#define altcp_tcp_new_ip6() altcp_tcp_new_ip_type(IPADDR_TYPE_V6) + +struct altcp_pcb *altcp_tcp_alloc(void *arg, u8_t ip_type); + +struct tcp_pcb; +struct altcp_pcb *altcp_tcp_wrap(struct tcp_pcb *tpcb); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_TCP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tls.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tls.h new file mode 100644 index 0000000..ff797f2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/altcp_tls.h @@ -0,0 +1,143 @@ +/** + * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) + * + * @defgroup altcp_tls TLS layer + * @ingroup altcp + * This file contains function prototypes for a TLS layer. + * A port to ARM mbedtls is provided in the apps/ tree + * (LWIP_ALTCP_TLS_MBEDTLS option). + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_TLS_H +#define LWIP_HDR_ALTCP_TLS_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#if LWIP_ALTCP_TLS + +#include "lwip/altcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @ingroup altcp_tls + * ALTCP_TLS configuration handle, content depends on port (e.g. mbedtls) + */ +struct altcp_tls_config; + +/** @ingroup altcp_tls + * Create an ALTCP_TLS server configuration handle prepared for multiple certificates + */ +struct altcp_tls_config *altcp_tls_create_config_server(uint8_t cert_count); + +/** @ingroup altcp_tls + * Add a certificate to an ALTCP_TLS server configuration handle + */ +err_t altcp_tls_config_server_add_privkey_cert(struct altcp_tls_config *config, + const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Create an ALTCP_TLS server configuration handle with one certificate + * (short version of calling @ref altcp_tls_create_config_server and + * @ref altcp_tls_config_server_add_privkey_cert) + */ +struct altcp_tls_config *altcp_tls_create_config_server_privkey_cert(const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Create an ALTCP_TLS client configuration handle + */ +struct altcp_tls_config *altcp_tls_create_config_client(const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Create an ALTCP_TLS client configuration handle with two-way server/client authentication + */ +struct altcp_tls_config *altcp_tls_create_config_client_2wayauth(const u8_t *ca, size_t ca_len, const u8_t *privkey, size_t privkey_len, + const u8_t *privkey_pass, size_t privkey_pass_len, + const u8_t *cert, size_t cert_len); + +/** @ingroup altcp_tls + * Free an ALTCP_TLS configuration handle + */ +void altcp_tls_free_config(struct altcp_tls_config *conf); + +/** @ingroup altcp_tls + * Free an ALTCP_TLS global entropy instance. + * All ALTCP_TLS configuration are linked to one altcp_tls_entropy_rng structure + * that handle an unique system entropy & ctr_drbg instance. + * This function allow application to free this altcp_tls_entropy_rng structure + * when all configuration referencing it were destroyed. + * This function does nothing if some ALTCP_TLS configuration handle are still + * active. + */ +void altcp_tls_free_entropy(void); + +/** @ingroup altcp_tls + * Create new ALTCP_TLS layer wrapping an existing pcb as inner connection (e.g. TLS over TCP) + */ +struct altcp_pcb *altcp_tls_wrap(struct altcp_tls_config *config, struct altcp_pcb *inner_pcb); + +/** @ingroup altcp_tls + * Create new ALTCP_TLS pcb and its inner tcp pcb + */ +struct altcp_pcb *altcp_tls_new(struct altcp_tls_config *config, u8_t ip_type); + +/** @ingroup altcp_tls + * Create new ALTCP_TLS layer pcb and its inner tcp pcb. + * Same as @ref altcp_tls_new but this allocator function fits to + * @ref altcp_allocator_t / @ref altcp_new.\n + 'arg' must contain a struct altcp_tls_config *. + */ +struct altcp_pcb *altcp_tls_alloc(void *arg, u8_t ip_type); + +/** @ingroup altcp_tls + * Return pointer to internal TLS context so application can tweak it. + * Real type depends on port (e.g. mbedtls) + */ +void *altcp_tls_context(struct altcp_pcb *conn); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP_TLS */ +#endif /* LWIP_ALTCP */ +#endif /* LWIP_HDR_ALTCP_TLS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/api.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/api.h new file mode 100644 index 0000000..739f8be --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/api.h @@ -0,0 +1,431 @@ +/** + * @file + * netconn API (to be used from non-TCPIP threads) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_API_H +#define LWIP_HDR_API_H + +#include "lwip/opt.h" + +#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ +/* Note: Netconn API is always available when sockets are enabled - + * sockets are implemented on top of them */ + +#include "lwip/arch.h" +#include "lwip/netbuf.h" +#include "lwip/sys.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Throughout this file, IP addresses and port numbers are expected to be in + * the same byte order as in the corresponding pcb. + */ + +/* Flags for netconn_write (u8_t) */ +#define NETCONN_NOFLAG 0x00 +#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ +#define NETCONN_COPY 0x01 +#define NETCONN_MORE 0x02 +#define NETCONN_DONTBLOCK 0x04 +#define NETCONN_NOAUTORCVD 0x08 /* prevent netconn_recv_data_tcp() from updating the tcp window - must be done manually via netconn_tcp_recvd() */ +#define NETCONN_NOFIN 0x10 /* upper layer already received data, leave FIN in queue until called again */ + +/* Flags for struct netconn.flags (u8_t) */ +/** This netconn had an error, don't block on recvmbox/acceptmbox any more */ +#define NETCONN_FLAG_MBOXCLOSED 0x01 +/** Should this netconn avoid blocking? */ +#define NETCONN_FLAG_NON_BLOCKING 0x02 +/** Was the last connect action a non-blocking one? */ +#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT 0x04 +#if LWIP_NETCONN_FULLDUPLEX + /** The mbox of this netconn is being deallocated, don't use it anymore */ +#define NETCONN_FLAG_MBOXINVALID 0x08 +#endif /* LWIP_NETCONN_FULLDUPLEX */ +/** If a nonblocking write has been rejected before, poll_tcp needs to + check if the netconn is writable again */ +#define NETCONN_FLAG_CHECK_WRITESPACE 0x10 +#if LWIP_IPV6 +/** If this flag is set then only IPv6 communication is allowed on the + netconn. As per RFC#3493 this features defaults to OFF allowing + dual-stack usage by default. */ +#define NETCONN_FLAG_IPV6_V6ONLY 0x20 +#endif /* LWIP_IPV6 */ +#if LWIP_NETBUF_RECVINFO +/** Received packet info will be recorded for this netconn */ +#define NETCONN_FLAG_PKTINFO 0x40 +#endif /* LWIP_NETBUF_RECVINFO */ +/** A FIN has been received but not passed to the application yet */ +#define NETCONN_FIN_RX_PENDING 0x80 + +/* Helpers to process several netconn_types by the same code */ +#define NETCONNTYPE_GROUP(t) ((t)&0xF0) +#define NETCONNTYPE_DATAGRAM(t) ((t)&0xE0) +#if LWIP_IPV6 +#define NETCONN_TYPE_IPV6 0x08 +#define NETCONNTYPE_ISIPV6(t) (((t)&NETCONN_TYPE_IPV6) != 0) +#define NETCONNTYPE_ISUDPLITE(t) (((t)&0xF3) == NETCONN_UDPLITE) +#define NETCONNTYPE_ISUDPNOCHKSUM(t) (((t)&0xF3) == NETCONN_UDPNOCHKSUM) +#else /* LWIP_IPV6 */ +#define NETCONNTYPE_ISIPV6(t) (0) +#define NETCONNTYPE_ISUDPLITE(t) ((t) == NETCONN_UDPLITE) +#define NETCONNTYPE_ISUDPNOCHKSUM(t) ((t) == NETCONN_UDPNOCHKSUM) +#endif /* LWIP_IPV6 */ + +/** @ingroup netconn_common + * Protocol family and type of the netconn + */ +enum netconn_type { + NETCONN_INVALID = 0, + /** TCP IPv4 */ + NETCONN_TCP = 0x10, +#if LWIP_IPV6 + /** TCP IPv6 */ + NETCONN_TCP_IPV6 = NETCONN_TCP | NETCONN_TYPE_IPV6 /* 0x18 */, +#endif /* LWIP_IPV6 */ + /** UDP IPv4 */ + NETCONN_UDP = 0x20, + /** UDP IPv4 lite */ + NETCONN_UDPLITE = 0x21, + /** UDP IPv4 no checksum */ + NETCONN_UDPNOCHKSUM = 0x22, + +#if LWIP_IPV6 + /** UDP IPv6 (dual-stack by default, unless you call @ref netconn_set_ipv6only) */ + NETCONN_UDP_IPV6 = NETCONN_UDP | NETCONN_TYPE_IPV6 /* 0x28 */, + /** UDP IPv6 lite (dual-stack by default, unless you call @ref netconn_set_ipv6only) */ + NETCONN_UDPLITE_IPV6 = NETCONN_UDPLITE | NETCONN_TYPE_IPV6 /* 0x29 */, + /** UDP IPv6 no checksum (dual-stack by default, unless you call @ref netconn_set_ipv6only) */ + NETCONN_UDPNOCHKSUM_IPV6 = NETCONN_UDPNOCHKSUM | NETCONN_TYPE_IPV6 /* 0x2a */, +#endif /* LWIP_IPV6 */ + + /** Raw connection IPv4 */ + NETCONN_RAW = 0x40 +#if LWIP_IPV6 + /** Raw connection IPv6 (dual-stack by default, unless you call @ref netconn_set_ipv6only) */ + , NETCONN_RAW_IPV6 = NETCONN_RAW | NETCONN_TYPE_IPV6 /* 0x48 */ +#endif /* LWIP_IPV6 */ +}; + +/** Current state of the netconn. Non-TCP netconns are always + * in state NETCONN_NONE! */ +enum netconn_state { + NETCONN_NONE, + NETCONN_WRITE, + NETCONN_LISTEN, + NETCONN_CONNECT, + NETCONN_CLOSE +}; + +/** Used to inform the callback function about changes + * + * Event explanation: + * + * In the netconn implementation, there are three ways to block a client: + * + * - accept mbox (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0); in netconn_accept()) + * - receive mbox (sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0); in netconn_recv_data()) + * - send queue is full (sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); in lwip_netconn_do_write()) + * + * The events have to be seen as events signaling the state of these mboxes/semaphores. For non-blocking + * connections, you need to know in advance whether a call to a netconn function call would block or not, + * and these events tell you about that. + * + * RCVPLUS events say: Safe to perform a potentially blocking call call once more. + * They are counted in sockets - three RCVPLUS events for accept mbox means you are safe + * to call netconn_accept 3 times without being blocked. + * Same thing for receive mbox. + * + * RCVMINUS events say: Your call to to a possibly blocking function is "acknowledged". + * Socket implementation decrements the counter. + * + * For TX, there is no need to count, its merely a flag. SENDPLUS means you may send something. + * SENDPLUS occurs when enough data was delivered to peer so netconn_send() can be called again. + * A SENDMINUS event occurs when the next call to a netconn_send() would be blocking. + */ +enum netconn_evt { + NETCONN_EVT_RCVPLUS, + NETCONN_EVT_RCVMINUS, + NETCONN_EVT_SENDPLUS, + NETCONN_EVT_SENDMINUS, + NETCONN_EVT_ERROR +}; + +#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) +/** Used for netconn_join_leave_group() */ +enum netconn_igmp { + NETCONN_JOIN, + NETCONN_LEAVE +}; +#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ + +#if LWIP_DNS +/* Used for netconn_gethostbyname_addrtype(), these should match the DNS_ADDRTYPE defines in dns.h */ +#define NETCONN_DNS_DEFAULT NETCONN_DNS_IPV4_IPV6 +#define NETCONN_DNS_IPV4 0 +#define NETCONN_DNS_IPV6 1 +#define NETCONN_DNS_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */ +#define NETCONN_DNS_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */ +#endif /* LWIP_DNS */ + +/* forward-declare some structs to avoid to include their headers */ +struct ip_pcb; +struct tcp_pcb; +struct udp_pcb; +struct raw_pcb; +struct netconn; +struct api_msg; + +/** A callback prototype to inform about events for a netconn */ +typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len); + +/** A netconn descriptor */ +struct netconn { + /** type of the netconn (TCP, UDP or RAW) */ + enum netconn_type type; + /** current state of the netconn */ + enum netconn_state state; + /** the lwIP internal protocol control block */ + union { + struct ip_pcb *ip; + struct tcp_pcb *tcp; + struct udp_pcb *udp; + struct raw_pcb *raw; + } pcb; + /** the last asynchronous unreported error this netconn had */ + err_t pending_err; +#if !LWIP_NETCONN_SEM_PER_THREAD + /** sem that is used to synchronously execute functions in the core context */ + sys_sem_t op_completed; +#endif + /** mbox where received packets are stored until they are fetched + by the netconn application thread (can grow quite big) */ + sys_mbox_t recvmbox; +#if LWIP_TCP + /** mbox where new connections are stored until processed + by the application thread */ + sys_mbox_t acceptmbox; +#endif /* LWIP_TCP */ +#if LWIP_NETCONN_FULLDUPLEX + /** number of threads waiting on an mbox. This is required to unblock + all threads when closing while threads are waiting. */ + int mbox_threads_waiting; +#endif + /** only used for socket layer */ +#if LWIP_SOCKET + int socket; +#endif /* LWIP_SOCKET */ +#if LWIP_SO_SNDTIMEO + /** timeout to wait for sending data (which means enqueueing data for sending + in internal buffers) in milliseconds */ + s32_t send_timeout; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVTIMEO + /** timeout in milliseconds to wait for new data to be received + (or connections to arrive for listening netconns) */ + u32_t recv_timeout; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + /** maximum amount of bytes queued in recvmbox + not used for TCP: adjust TCP_WND instead! */ + int recv_bufsize; + /** number of bytes currently in recvmbox to be received, + tested against recv_bufsize to limit bytes on recvmbox + for UDP and RAW, used for FIONREAD */ + int recv_avail; +#endif /* LWIP_SO_RCVBUF */ +#if LWIP_SO_LINGER + /** values <0 mean linger is disabled, values > 0 are seconds to linger */ + s16_t linger; +#endif /* LWIP_SO_LINGER */ + /** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */ + u8_t flags; +#if LWIP_TCP + /** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores the message. + Also used during connect and close. */ + struct api_msg *current_msg; +#endif /* LWIP_TCP */ + /** A callback function that is informed about events for this netconn */ + netconn_callback callback; +}; + +/** This vector type is passed to @ref netconn_write_vectors_partly to send + * multiple buffers at once. + * ATTENTION: This type has to directly map struct iovec since one is casted + * into the other! + */ +struct netvector { + /** pointer to the application buffer that contains the data to send */ + const void *ptr; + /** size of the application data to send */ + size_t len; +}; + +/** Register an Network connection event */ +#define API_EVENT(c,e,l) if (c->callback) { \ + (*c->callback)(c, e, l); \ + } + +/* Network connection functions: */ + +/** @ingroup netconn_common + * Create new netconn connection + * @param t @ref netconn_type */ +#define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL) +#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c) +struct netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, + netconn_callback callback); +err_t netconn_prepare_delete(struct netconn *conn); +err_t netconn_delete(struct netconn *conn); +/** Get the type of a netconn (as enum netconn_type). */ +#define netconn_type(conn) (conn->type) + +err_t netconn_getaddr(struct netconn *conn, ip_addr_t *addr, + u16_t *port, u8_t local); +/** @ingroup netconn_common */ +#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0) +/** @ingroup netconn_common */ +#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1) + +err_t netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port); +err_t netconn_bind_if(struct netconn *conn, u8_t if_idx); +err_t netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port); +err_t netconn_disconnect (struct netconn *conn); +err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); +/** @ingroup netconn_tcp */ +#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG) +err_t netconn_accept(struct netconn *conn, struct netconn **new_conn); +err_t netconn_recv(struct netconn *conn, struct netbuf **new_buf); +err_t netconn_recv_udp_raw_netbuf(struct netconn *conn, struct netbuf **new_buf); +err_t netconn_recv_udp_raw_netbuf_flags(struct netconn *conn, struct netbuf **new_buf, u8_t apiflags); +err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf); +err_t netconn_recv_tcp_pbuf_flags(struct netconn *conn, struct pbuf **new_buf, u8_t apiflags); +err_t netconn_tcp_recvd(struct netconn *conn, size_t len); +err_t netconn_sendto(struct netconn *conn, struct netbuf *buf, + const ip_addr_t *addr, u16_t port); +err_t netconn_send(struct netconn *conn, struct netbuf *buf); +err_t netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, + u8_t apiflags, size_t *bytes_written); +err_t netconn_write_vectors_partly(struct netconn *conn, struct netvector *vectors, u16_t vectorcnt, + u8_t apiflags, size_t *bytes_written); +/** @ingroup netconn_tcp */ +#define netconn_write(conn, dataptr, size, apiflags) \ + netconn_write_partly(conn, dataptr, size, apiflags, NULL) +err_t netconn_close(struct netconn *conn); +err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx); + +#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) +err_t netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr, + const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave); +err_t netconn_join_leave_group_netif(struct netconn *conn, const ip_addr_t *multiaddr, + u8_t if_idx, enum netconn_igmp join_or_leave); +#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ +#if LWIP_DNS +#if LWIP_IPV4 && LWIP_IPV6 +err_t netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype); +#define netconn_gethostbyname(name, addr) netconn_gethostbyname_addrtype(name, addr, NETCONN_DNS_DEFAULT) +#else /* LWIP_IPV4 && LWIP_IPV6 */ +err_t netconn_gethostbyname(const char *name, ip_addr_t *addr); +#define netconn_gethostbyname_addrtype(name, addr, dns_addrtype) netconn_gethostbyname(name, addr) +#endif /* LWIP_IPV4 && LWIP_IPV6 */ +#endif /* LWIP_DNS */ + +err_t netconn_err(struct netconn *conn); +#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize) + +#define netconn_set_flags(conn, set_flags) do { (conn)->flags = (u8_t)((conn)->flags | (set_flags)); } while(0) +#define netconn_clear_flags(conn, clr_flags) do { (conn)->flags = (u8_t)((conn)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define netconn_is_flag_set(conn, flag) (((conn)->flags & (flag)) != 0) + +/** Set the blocking status of netconn calls (@todo: write/send is missing) */ +#define netconn_set_nonblocking(conn, val) do { if(val) { \ + netconn_set_flags(conn, NETCONN_FLAG_NON_BLOCKING); \ +} else { \ + netconn_clear_flags(conn, NETCONN_FLAG_NON_BLOCKING); }} while(0) +/** Get the blocking status of netconn calls (@todo: write/send is missing) */ +#define netconn_is_nonblocking(conn) (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0) + +#if LWIP_IPV6 +/** @ingroup netconn_common + * TCP: Set the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) + */ +#define netconn_set_ipv6only(conn, val) do { if(val) { \ + netconn_set_flags(conn, NETCONN_FLAG_IPV6_V6ONLY); \ +} else { \ + netconn_clear_flags(conn, NETCONN_FLAG_IPV6_V6ONLY); }} while(0) +/** @ingroup netconn_common + * TCP: Get the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY) + */ +#define netconn_get_ipv6only(conn) (((conn)->flags & NETCONN_FLAG_IPV6_V6ONLY) != 0) +#endif /* LWIP_IPV6 */ + +#if LWIP_SO_SNDTIMEO +/** Set the send timeout in milliseconds */ +#define netconn_set_sendtimeout(conn, timeout) ((conn)->send_timeout = (timeout)) +/** Get the send timeout in milliseconds */ +#define netconn_get_sendtimeout(conn) ((conn)->send_timeout) +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO +/** Set the receive timeout in milliseconds */ +#define netconn_set_recvtimeout(conn, timeout) ((conn)->recv_timeout = (timeout)) +/** Get the receive timeout in milliseconds */ +#define netconn_get_recvtimeout(conn) ((conn)->recv_timeout) +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF +/** Set the receive buffer in bytes */ +#define netconn_set_recvbufsize(conn, recvbufsize) ((conn)->recv_bufsize = (recvbufsize)) +/** Get the receive buffer in bytes */ +#define netconn_get_recvbufsize(conn) ((conn)->recv_bufsize) +#endif /* LWIP_SO_RCVBUF*/ + +#if LWIP_NETCONN_SEM_PER_THREAD +void netconn_thread_init(void); +void netconn_thread_cleanup(void); +#else /* LWIP_NETCONN_SEM_PER_THREAD */ +#define netconn_thread_init() +#define netconn_thread_cleanup() +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETCONN || LWIP_SOCKET */ + +#endif /* LWIP_HDR_API_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/FILES b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/FILES new file mode 100644 index 0000000..adfc0f3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/FILES @@ -0,0 +1,2 @@ +This directory contains application headers. +Every application shall provide one api file APP.h and optionally one options file APP_opts.h diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_proxyconnect.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_proxyconnect.h new file mode 100644 index 0000000..65d3127 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_proxyconnect.h @@ -0,0 +1,79 @@ +/** + * @file + * Application layered TCP connection API that executes a proxy-connect. + * + * This file provides a starting layer that executes a proxy-connect e.g. to + * set up TLS connections through a http proxy. + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H +#define LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_proxyconnect_config { + ip_addr_t proxy_addr; + u16_t proxy_port; +}; + + +struct altcp_pcb *altcp_proxyconnect_new(struct altcp_proxyconnect_config *config, struct altcp_pcb *inner_pcb); +struct altcp_pcb *altcp_proxyconnect_new_tcp(struct altcp_proxyconnect_config *config, u8_t ip_type); + +struct altcp_pcb *altcp_proxyconnect_alloc(void *arg, u8_t ip_type); + +#if LWIP_ALTCP_TLS +struct altcp_proxyconnect_tls_config { + struct altcp_proxyconnect_config proxy; + struct altcp_tls_config *tls_config; +}; + +struct altcp_pcb *altcp_proxyconnect_tls_alloc(void *arg, u8_t ip_type); +#endif /* LWIP_ALTCP_TLS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP */ +#endif /* LWIP_HDR_APPS_ALTCP_PROXYCONNECT_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_tls_mbedtls_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_tls_mbedtls_opts.h new file mode 100644 index 0000000..71aa599 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/altcp_tls_mbedtls_opts.h @@ -0,0 +1,105 @@ +/** + * @file + * Application layered TCP/TLS connection API (to be used from TCPIP thread) + * + * This file contains options for an mbedtls port of the TLS layer. + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_TLS_OPTS_H +#define LWIP_HDR_ALTCP_TLS_OPTS_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +/** LWIP_ALTCP_TLS_MBEDTLS==1: use mbedTLS for TLS support for altcp API + * mbedtls include directory must be reachable via include search path + */ +#ifndef LWIP_ALTCP_TLS_MBEDTLS +#define LWIP_ALTCP_TLS_MBEDTLS 0 +#endif + +/** Configure debug level of this file */ +#ifndef ALTCP_MBEDTLS_DEBUG +#define ALTCP_MBEDTLS_DEBUG LWIP_DBG_OFF +#endif + +/** Configure lwIP debug level of the mbedTLS library */ +#ifndef ALTCP_MBEDTLS_LIB_DEBUG +#define ALTCP_MBEDTLS_LIB_DEBUG LWIP_DBG_OFF +#endif + +/** Configure minimum internal debug level of the mbedTLS library */ +#ifndef ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN +#define ALTCP_MBEDTLS_LIB_DEBUG_LEVEL_MIN 0 +#endif + +/** Enable the basic session cache + * ATTENTION: Using a session cache can lower security by reusing keys! + */ +#ifndef ALTCP_MBEDTLS_USE_SESSION_CACHE +#define ALTCP_MBEDTLS_USE_SESSION_CACHE 0 +#endif + +/** Maximum cache size of the basic session cache */ +#ifndef ALTCP_MBEDTLS_SESSION_CACHE_SIZE +#define ALTCP_MBEDTLS_SESSION_CACHE_SIZE 30 +#endif + +/** Set a session timeout in seconds for the basic session cache */ +#ifndef ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS +#define ALTCP_MBEDTLS_SESSION_CACHE_TIMEOUT_SECONDS (60 * 60) +#endif + +/** Use session tickets to speed up connection setup (needs + * MBEDTLS_SSL_SESSION_TICKETS enabled in mbedTLS config). + * ATTENTION: Using session tickets can lower security by reusing keys! + */ +#ifndef ALTCP_MBEDTLS_USE_SESSION_TICKETS +#define ALTCP_MBEDTLS_USE_SESSION_TICKETS 0 +#endif + +/** Session ticket cipher */ +#ifndef ALTCP_MBEDTLS_SESSION_TICKET_CIPHER +#define ALTCP_MBEDTLS_SESSION_TICKET_CIPHER MBEDTLS_CIPHER_AES_256_GCM +#endif + +/** Maximum timeout for session tickets */ +#ifndef ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS +#define ALTCP_MBEDTLS_SESSION_TICKET_TIMEOUT_SECONDS (60 * 60 * 24) +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_TLS_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/fs.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/fs.h new file mode 100644 index 0000000..5be77c1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/fs.h @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_APPS_FS_H +#define LWIP_HDR_APPS_FS_H + +#include "httpd_opts.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define FS_READ_EOF -1 +#define FS_READ_DELAYED -2 + +#if HTTPD_PRECALCULATED_CHECKSUM +struct fsdata_chksum { + u32_t offset; + u16_t chksum; + u16_t len; +}; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ + +#define FS_FILE_FLAGS_HEADER_INCLUDED 0x01 +#define FS_FILE_FLAGS_HEADER_PERSISTENT 0x02 +#define FS_FILE_FLAGS_HEADER_HTTPVER_1_1 0x04 +#define FS_FILE_FLAGS_SSI 0x08 + +/** Define FS_FILE_EXTENSION_T_DEFINED if you have typedef'ed to your private + * pointer type (defaults to 'void' so the default usage is 'void*') + */ +#ifndef FS_FILE_EXTENSION_T_DEFINED +typedef void fs_file_extension; +#endif + +struct fs_file { + const char *data; + int len; + int index; + /* pextension is free for implementations to hold private (extensional) + arbitrary data, e.g. holding some file state or file system handle */ + fs_file_extension *pextension; +#if HTTPD_PRECALCULATED_CHECKSUM + const struct fsdata_chksum *chksum; + u16_t chksum_count; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ + u8_t flags; +#if LWIP_HTTPD_CUSTOM_FILES + u8_t is_custom_file; +#endif /* LWIP_HTTPD_CUSTOM_FILES */ +#if LWIP_HTTPD_FILE_STATE + void *state; +#endif /* LWIP_HTTPD_FILE_STATE */ +}; + +#if LWIP_HTTPD_FS_ASYNC_READ +typedef void (*fs_wait_cb)(void *arg); +#endif /* LWIP_HTTPD_FS_ASYNC_READ */ + +err_t fs_open(struct fs_file *file, const char *name); +void fs_close(struct fs_file *file); +#if LWIP_HTTPD_DYNAMIC_FILE_READ +#if LWIP_HTTPD_FS_ASYNC_READ +int fs_read_async(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg); +#else /* LWIP_HTTPD_FS_ASYNC_READ */ +int fs_read(struct fs_file *file, char *buffer, int count); +#endif /* LWIP_HTTPD_FS_ASYNC_READ */ +#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */ +#if LWIP_HTTPD_FS_ASYNC_READ +int fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg); +#endif /* LWIP_HTTPD_FS_ASYNC_READ */ +int fs_bytes_left(struct fs_file *file); + +#if LWIP_HTTPD_FILE_STATE +/** This user-defined function is called when a file is opened. */ +void *fs_state_init(struct fs_file *file, const char *name); +/** This user-defined function is called when a file is closed. */ +void fs_state_free(struct fs_file *file, void *state); +#endif /* #if LWIP_HTTPD_FILE_STATE */ + +struct fsdata_file { + const struct fsdata_file *next; + const unsigned char *name; + const unsigned char *data; + int len; + u8_t flags; +#if HTTPD_PRECALCULATED_CHECKSUM + u16_t chksum_count; + const struct fsdata_chksum *chksum; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_FS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/http_client.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/http_client.h new file mode 100644 index 0000000..d39e1bf --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/http_client.h @@ -0,0 +1,160 @@ +/** + * @file + * HTTP client + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_APPS_HTTP_CLIENT_H +#define LWIP_HDR_APPS_HTTP_CLIENT_H + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/altcp.h" +#include "lwip/prot/iana.h" +#include "lwip/pbuf.h" + +#if LWIP_TCP && LWIP_CALLBACK_API + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup httpc + * HTTPC_HAVE_FILE_IO: define this to 1 to have functions dowloading directly + * to disk via fopen/fwrite. + * These functions are example implementations of the interface only. + */ +#ifndef LWIP_HTTPC_HAVE_FILE_IO +#define LWIP_HTTPC_HAVE_FILE_IO 0 +#endif + +/** + * @ingroup httpc + * The default TCP port used for HTTP + */ +#define HTTP_DEFAULT_PORT LWIP_IANA_PORT_HTTP + +/** + * @ingroup httpc + * HTTP client result codes + */ +typedef enum ehttpc_result { + /** File successfully received */ + HTTPC_RESULT_OK = 0, + /** Unknown error */ + HTTPC_RESULT_ERR_UNKNOWN = 1, + /** Connection to server failed */ + HTTPC_RESULT_ERR_CONNECT = 2, + /** Failed to resolve server hostname */ + HTTPC_RESULT_ERR_HOSTNAME = 3, + /** Connection unexpectedly closed by remote server */ + HTTPC_RESULT_ERR_CLOSED = 4, + /** Connection timed out (server didn't respond in time) */ + HTTPC_RESULT_ERR_TIMEOUT = 5, + /** Server responded with an error code */ + HTTPC_RESULT_ERR_SVR_RESP = 6, + /** Local memory error */ + HTTPC_RESULT_ERR_MEM = 7, + /** Local abort */ + HTTPC_RESULT_LOCAL_ABORT = 8, + /** Content length mismatch */ + HTTPC_RESULT_ERR_CONTENT_LEN = 9 +} httpc_result_t; + +typedef struct _httpc_state httpc_state_t; + +/** + * @ingroup httpc + * Prototype of a http client callback function + * + * @param arg argument specified when initiating the request + * @param httpc_result result of the http transfer (see enum httpc_result_t) + * @param rx_content_len number of bytes received (without headers) + * @param srv_res this contains the http status code received (if any) + * @param err an error returned by internal lwip functions, can help to specify + * the source of the error but must not necessarily be != ERR_OK + */ +typedef void (*httpc_result_fn)(void *arg, httpc_result_t httpc_result, u32_t rx_content_len, u32_t srv_res, err_t err); + +/** + * @ingroup httpc + * Prototype of http client callback: called when the headers are received + * + * @param connection http client connection + * @param arg argument specified when initiating the request + * @param hdr header pbuf(s) (may contain data also) + * @param hdr_len length of the heders in 'hdr' + * @param content_len content length as received in the headers (-1 if not received) + * @return if != ERR_OK is returned, the connection is aborted + */ +typedef err_t (*httpc_headers_done_fn)(httpc_state_t *connection, void *arg, struct pbuf *hdr, u16_t hdr_len, u32_t content_len); + +typedef struct _httpc_connection { + ip_addr_t proxy_addr; + u16_t proxy_port; + u8_t use_proxy; + /* @todo: add username:pass? */ + +#if LWIP_ALTCP + altcp_allocator_t *altcp_allocator; +#endif + + /* this callback is called when the transfer is finished (or aborted) */ + httpc_result_fn result_fn; + /* this callback is called after receiving the http headers + It can abort the connection by returning != ERR_OK */ + httpc_headers_done_fn headers_done_fn; +} httpc_connection_t; + +err_t httpc_get_file(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings, + altcp_recv_fn recv_fn, void* callback_arg, httpc_state_t **connection); +err_t httpc_get_file_dns(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings, + altcp_recv_fn recv_fn, void* callback_arg, httpc_state_t **connection); + +#if LWIP_HTTPC_HAVE_FILE_IO +err_t httpc_get_file_to_disk(const ip_addr_t* server_addr, u16_t port, const char* uri, const httpc_connection_t *settings, + void* callback_arg, const char* local_file_name, httpc_state_t **connection); +err_t httpc_get_file_dns_to_disk(const char* server_name, u16_t port, const char* uri, const httpc_connection_t *settings, + void* callback_arg, const char* local_file_name, httpc_state_t **connection); +#endif /* LWIP_HTTPC_HAVE_FILE_IO */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP && LWIP_CALLBACK_API */ + +#endif /* LWIP_HDR_APPS_HTTP_CLIENT_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd.h new file mode 100644 index 0000000..e872429 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd.h @@ -0,0 +1,255 @@ +/** + * @file + * HTTP server + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * This version of the file has been modified by Texas Instruments to offer + * simple server-side-include (SSI) and Common Gateway Interface (CGI) + * capability. + */ + +#ifndef LWIP_HDR_APPS_HTTPD_H +#define LWIP_HDR_APPS_HTTPD_H + +#include "httpd_opts.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_HTTPD_CGI + +/** + * @ingroup httpd + * Function pointer for a CGI script handler. + * + * This function is called each time the HTTPD server is asked for a file + * whose name was previously registered as a CGI function using a call to + * http_set_cgi_handlers. The iIndex parameter provides the index of the + * CGI within the cgis array passed to http_set_cgi_handlers. Parameters + * pcParam and pcValue provide access to the parameters provided along with + * the URI. iNumParams provides a count of the entries in the pcParam and + * pcValue arrays. Each entry in the pcParam array contains the name of a + * parameter with the corresponding entry in the pcValue array containing the + * value for that parameter. Note that pcParam may contain multiple elements + * with the same name if, for example, a multi-selection list control is used + * in the form generating the data. + * + * The function should return a pointer to a character string which is the + * path and filename of the response that is to be sent to the connected + * browser, for example "/thanks.htm" or "/response/error.ssi". + * + * The maximum number of parameters that will be passed to this function via + * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in + * the incoming HTTP request above this number will be discarded. + * + * Requests intended for use by this CGI mechanism must be sent using the GET + * method (which encodes all parameters within the URI rather than in a block + * later in the request). Attempts to use the POST method will result in the + * request being ignored. + * + */ +typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[], + char *pcValue[]); + +/** + * @ingroup httpd + * Structure defining the base filename (URL) of a CGI and the associated + * function which is to be called when that URL is requested. + */ +typedef struct +{ + const char *pcCGIName; + tCGIHandler pfnCGIHandler; +} tCGI; + +void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers); + +#endif /* LWIP_HTTPD_CGI */ + +#if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI + +#if LWIP_HTTPD_CGI_SSI +/* we have to prototype this struct here to make it available for the handler */ +struct fs_file; + +/** Define this generic CGI handler in your application. + * It is called once for every URI with parameters. + * The parameters can be stored to the object passed as connection_state, which + * is allocated to file->state via fs_state_init() from fs_open() or fs_open_custom(). + * Content creation via SSI or complete dynamic files can retrieve the CGI params from there. + */ +extern void httpd_cgi_handler(struct fs_file *file, const char* uri, int iNumParams, + char **pcParam, char **pcValue +#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE + , void *connection_state +#endif /* LWIP_HTTPD_FILE_STATE */ + ); +#endif /* LWIP_HTTPD_CGI_SSI */ + +#endif /* LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI */ + +#if LWIP_HTTPD_SSI + +/** + * @ingroup httpd + * Function pointer for the SSI tag handler callback. + * + * This function will be called each time the HTTPD server detects a tag of the + * form in files with extensions mentioned in the g_pcSSIExtensions + * array (currently .shtml, .shtm, .ssi, .xml, .json) where "name" appears as + * one of the tags supplied to http_set_ssi_handler in the tags array. The + * returned insert string, which will be appended after the the string + * "" in file sent back to the client, should be written to pointer + * pcInsert. iInsertLen contains the size of the buffer pointed to by + * pcInsert. The iIndex parameter provides the zero-based index of the tag as + * found in the tags array and identifies the tag that is to be processed. + * + * The handler returns the number of characters written to pcInsert excluding + * any terminating NULL or HTTPD_SSI_TAG_UNKNOWN when tag is not recognized. + * + * Note that the behavior of this SSI mechanism is somewhat different from the + * "normal" SSI processing as found in, for example, the Apache web server. In + * this case, the inserted text is appended following the SSI tag rather than + * replacing the tag entirely. This allows for an implementation that does not + * require significant additional buffering of output data yet which will still + * offer usable SSI functionality. One downside to this approach is when + * attempting to use SSI within JavaScript. The SSI tag is structured to + * resemble an HTML comment but this syntax does not constitute a comment + * within JavaScript and, hence, leaving the tag in place will result in + * problems in these cases. In order to avoid these problems, define + * LWIP_HTTPD_SSI_INCLUDE_TAG as zero in your lwip options file, or use JavaScript + * style block comments in the form / * # name * / (without the spaces). + */ +typedef u16_t (*tSSIHandler)( +#if LWIP_HTTPD_SSI_RAW + const char* ssi_tag_name, +#else /* LWIP_HTTPD_SSI_RAW */ + int iIndex, +#endif /* LWIP_HTTPD_SSI_RAW */ + char *pcInsert, int iInsertLen +#if LWIP_HTTPD_SSI_MULTIPART + , u16_t current_tag_part, u16_t *next_tag_part +#endif /* LWIP_HTTPD_SSI_MULTIPART */ +#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE + , void *connection_state +#endif /* LWIP_HTTPD_FILE_STATE */ + ); + +/** Set the SSI handler function + * (if LWIP_HTTPD_SSI_RAW==1, only the first argument is used) + */ +void http_set_ssi_handler(tSSIHandler pfnSSIHandler, + const char **ppcTags, int iNumTags); + +/** For LWIP_HTTPD_SSI_RAW==1, return this to indicate the tag is unknown. + * In this case, the webserver writes a warning into the page. + * You can also just return 0 to write nothing for unknown tags. + */ +#define HTTPD_SSI_TAG_UNKNOWN 0xFFFF + +#endif /* LWIP_HTTPD_SSI */ + +#if LWIP_HTTPD_SUPPORT_POST + +/* These functions must be implemented by the application */ + +/** + * @ingroup httpd + * Called when a POST request has been received. The application can decide + * whether to accept it or not. + * + * @param connection Unique connection identifier, valid until httpd_post_end + * is called. + * @param uri The HTTP header URI receiving the POST request. + * @param http_request The raw HTTP request (the first packet, normally). + * @param http_request_len Size of 'http_request'. + * @param content_len Content-Length from HTTP header. + * @param response_uri Filename of response file, to be filled when denying the + * request + * @param response_uri_len Size of the 'response_uri' buffer. + * @param post_auto_wnd Set this to 0 to let the callback code handle window + * updates by calling 'httpd_post_data_recved' (to throttle rx speed) + * default is 1 (httpd handles window updates automatically) + * @return ERR_OK: Accept the POST request, data may be passed in + * another err_t: Deny the POST request, send back 'bad request'. + */ +err_t httpd_post_begin(void *connection, const char *uri, const char *http_request, + u16_t http_request_len, int content_len, char *response_uri, + u16_t response_uri_len, u8_t *post_auto_wnd); + +/** + * @ingroup httpd + * Called for each pbuf of data that has been received for a POST. + * ATTENTION: The application is responsible for freeing the pbufs passed in! + * + * @param connection Unique connection identifier. + * @param p Received data. + * @return ERR_OK: Data accepted. + * another err_t: Data denied, http_post_get_response_uri will be called. + */ +err_t httpd_post_receive_data(void *connection, struct pbuf *p); + +/** + * @ingroup httpd + * Called when all data is received or when the connection is closed. + * The application must return the filename/URI of a file to send in response + * to this POST request. If the response_uri buffer is untouched, a 404 + * response is returned. + * + * @param connection Unique connection identifier. + * @param response_uri Filename of response file, to be filled when denying the request + * @param response_uri_len Size of the 'response_uri' buffer. + */ +void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len); + +#if LWIP_HTTPD_POST_MANUAL_WND +void httpd_post_data_recved(void *connection, u16_t recved_len); +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + +#endif /* LWIP_HTTPD_SUPPORT_POST */ + +void httpd_init(void); + +#if HTTPD_ENABLE_HTTPS +struct altcp_tls_config; +void httpd_inits(struct altcp_tls_config *conf); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_HTTPD_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd_opts.h new file mode 100644 index 0000000..65296ef --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/httpd_opts.h @@ -0,0 +1,396 @@ +/** + * @file + * HTTP server options list + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * This version of the file has been modified by Texas Instruments to offer + * simple server-side-include (SSI) and Common Gateway Interface (CGI) + * capability. + */ + +#ifndef LWIP_HDR_APPS_HTTPD_OPTS_H +#define LWIP_HDR_APPS_HTTPD_OPTS_H + +#include "lwip/opt.h" +#include "lwip/prot/iana.h" + +/** + * @defgroup httpd_opts Options + * @ingroup httpd + * @{ + */ + +/** Set this to 1 to support CGI (old style). + * + * This old style CGI support works by registering an array of URLs and + * associated CGI handler functions (@ref http_set_cgi_handlers). + * This list is scanned just before fs_open is called from request handling. + * The handler can return a new URL that is used internally by the httpd to + * load the returned page (passed to fs_open). + * + * Use this CGI type e.g. to execute specific actions and return a page that + * does not depend on the CGI parameters. + */ +#if !defined LWIP_HTTPD_CGI || defined __DOXYGEN__ +#define LWIP_HTTPD_CGI 0 +#endif + +/** Set this to 1 to support CGI (new style). + * + * This new style CGI support works by calling a global function + * (@ref tCGIHandler) for all URLs that are found. fs_open is called first + * and the URL can not be written by the CGI handler. Instead, this handler gets + * passed the http file state, an object where it can store information derived + * from the CGI URL or parameters. This file state is later passed to SSI, so + * the SSI code can return data depending on CGI input. + * + * Use this CGI handler if you want CGI information passed on to SSI. + */ +#if !defined LWIP_HTTPD_CGI_SSI || defined __DOXYGEN__ +#define LWIP_HTTPD_CGI_SSI 0 +#endif + +/** Set this to 1 to support SSI (Server-Side-Includes) + * + * In contrast to other http servers, this only calls a preregistered callback + * function (@see http_set_ssi_handler) for each tag (in the format of + * ) encountered in SSI-enabled pages. + * SSI-enabled pages must have one of the predefined SSI-enabled file extensions. + * All files with one of these extensions are parsed when sent. + * + * A downside of the current SSI implementation is that persistent connections + * don't work, as the file length is not known in advance (and httpd currently + * relies on the Content-Length header for persistent connections). + * + * To save memory, the maximum tag length is limited (@see LWIP_HTTPD_MAX_TAG_NAME_LEN). + * To save memory, the maximum insertion string length is limited (@see + * LWIP_HTTPD_MAX_TAG_INSERT_LEN). If this is not enough, @ref LWIP_HTTPD_SSI_MULTIPART + * can be used. + */ +#if !defined LWIP_HTTPD_SSI || defined __DOXYGEN__ +#define LWIP_HTTPD_SSI 0 +#endif + +/** Set this to 1 to implement an SSI tag handler callback that gets a const char* + * to the tag (instead of an index into a pre-registered array of known tags) + * If this is 0, the SSI handler callback function is only called pre-registered tags. + */ +#if !defined LWIP_HTTPD_SSI_RAW || defined __DOXYGEN__ +#define LWIP_HTTPD_SSI_RAW 0 +#endif + +/** Set this to 0 to prevent parsing the file extension at runtime to decide + * if a file should be scanned for SSI tags or not. + * Default is 1 (file extensions are checked using the g_pcSSIExtensions array) + * Set to 2 to override this runtime test function. + * + * This is enabled by default, but if you only use a newer version of makefsdata + * supporting the "-ssi" option, this info is already present in + */ +#if !defined LWIP_HTTPD_SSI_BY_FILE_EXTENSION || defined __DOXYGEN__ +#define LWIP_HTTPD_SSI_BY_FILE_EXTENSION 1 +#endif + +/** Set this to 1 to support HTTP POST */ +#if !defined LWIP_HTTPD_SUPPORT_POST || defined __DOXYGEN__ +#define LWIP_HTTPD_SUPPORT_POST 0 +#endif + +/* The maximum number of parameters that the CGI handler can be sent. */ +#if !defined LWIP_HTTPD_MAX_CGI_PARAMETERS || defined __DOXYGEN__ +#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16 +#endif + +/** LWIP_HTTPD_SSI_MULTIPART==1: SSI handler function is called with 2 more + * arguments indicating a counter for insert string that are too long to be + * inserted at once: the SSI handler function must then set 'next_tag_part' + * which will be passed back to it in the next call. */ +#if !defined LWIP_HTTPD_SSI_MULTIPART || defined __DOXYGEN__ +#define LWIP_HTTPD_SSI_MULTIPART 0 +#endif + +/* The maximum length of the string comprising the SSI tag name + * ATTENTION: tags longer than this are ignored, not truncated! + */ +#if !defined LWIP_HTTPD_MAX_TAG_NAME_LEN || defined __DOXYGEN__ +#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8 +#endif + +/* The maximum length of string that can be returned to replace any given tag + * If this buffer is not long enough, use LWIP_HTTPD_SSI_MULTIPART. + */ +#if !defined LWIP_HTTPD_MAX_TAG_INSERT_LEN || defined __DOXYGEN__ +#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192 +#endif + +#if !defined LWIP_HTTPD_POST_MANUAL_WND || defined __DOXYGEN__ +#define LWIP_HTTPD_POST_MANUAL_WND 0 +#endif + +/** This string is passed in the HTTP header as "Server: " */ +#if !defined HTTPD_SERVER_AGENT || defined __DOXYGEN__ +#define HTTPD_SERVER_AGENT "lwIP/" LWIP_VERSION_STRING " (http://savannah.nongnu.org/projects/lwip)" +#endif + +/** Set this to 1 if you want to include code that creates HTTP headers + * at runtime. Default is off: HTTP headers are then created statically + * by the makefsdata tool. Static headers mean smaller code size, but + * the (readonly) fsdata will grow a bit as every file includes the HTTP + * header. */ +#if !defined LWIP_HTTPD_DYNAMIC_HEADERS || defined __DOXYGEN__ +#define LWIP_HTTPD_DYNAMIC_HEADERS 0 +#endif + +#if !defined HTTPD_DEBUG || defined __DOXYGEN__ +#define HTTPD_DEBUG LWIP_DBG_OFF +#endif + +/** Set this to 1 to use a memp pool for allocating + * struct http_state instead of the heap. + * If enabled, you'll need to define MEMP_NUM_PARALLEL_HTTPD_CONNS + * (and MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS for SSI) to set the size of + * the pool(s). + */ +#if !defined HTTPD_USE_MEM_POOL || defined __DOXYGEN__ +#define HTTPD_USE_MEM_POOL 0 +#endif + +/** The server port for HTTPD to use */ +#if !defined HTTPD_SERVER_PORT || defined __DOXYGEN__ +#define HTTPD_SERVER_PORT LWIP_IANA_PORT_HTTP +#endif + +/** The https server port for HTTPD to use */ +#if !defined HTTPD_SERVER_PORT_HTTPS || defined __DOXYGEN__ +#define HTTPD_SERVER_PORT_HTTPS LWIP_IANA_PORT_HTTPS +#endif + +/** Enable https support? */ +#if !defined HTTPD_ENABLE_HTTPS || defined __DOXYGEN__ +#define HTTPD_ENABLE_HTTPS 0 +#endif + +/** Maximum retries before the connection is aborted/closed. + * - number of times pcb->poll is called -> default is 4*500ms = 2s; + * - reset when pcb->sent is called + */ +#if !defined HTTPD_MAX_RETRIES || defined __DOXYGEN__ +#define HTTPD_MAX_RETRIES 4 +#endif + +/** The poll delay is X*500ms */ +#if !defined HTTPD_POLL_INTERVAL || defined __DOXYGEN__ +#define HTTPD_POLL_INTERVAL 4 +#endif + +/** Priority for tcp pcbs created by HTTPD (very low by default). + * Lower priorities get killed first when running out of memory. + */ +#if !defined HTTPD_TCP_PRIO || defined __DOXYGEN__ +#define HTTPD_TCP_PRIO TCP_PRIO_MIN +#endif + +/** Set this to 1 to enable timing each file sent */ +#if !defined LWIP_HTTPD_TIMING || defined __DOXYGEN__ +#define LWIP_HTTPD_TIMING 0 +#endif +/** Set this to 1 to enable timing each file sent */ +#if !defined HTTPD_DEBUG_TIMING || defined __DOXYGEN__ +#define HTTPD_DEBUG_TIMING LWIP_DBG_OFF +#endif + +/** Set this to one to show error pages when parsing a request fails instead + of simply closing the connection. */ +#if !defined LWIP_HTTPD_SUPPORT_EXTSTATUS || defined __DOXYGEN__ +#define LWIP_HTTPD_SUPPORT_EXTSTATUS 0 +#endif + +/** Set this to 0 to drop support for HTTP/0.9 clients (to save some bytes) */ +#if !defined LWIP_HTTPD_SUPPORT_V09 || defined __DOXYGEN__ +#define LWIP_HTTPD_SUPPORT_V09 1 +#endif + +/** Set this to 1 to enable HTTP/1.1 persistent connections. + * ATTENTION: If the generated file system includes HTTP headers, these must + * include the "Connection: keep-alive" header (pass argument "-11" to makefsdata). + */ +#if !defined LWIP_HTTPD_SUPPORT_11_KEEPALIVE || defined __DOXYGEN__ +#define LWIP_HTTPD_SUPPORT_11_KEEPALIVE 0 +#endif + +/** Set this to 1 to support HTTP request coming in in multiple packets/pbufs */ +#if !defined LWIP_HTTPD_SUPPORT_REQUESTLIST || defined __DOXYGEN__ +#define LWIP_HTTPD_SUPPORT_REQUESTLIST 1 +#endif + +#if LWIP_HTTPD_SUPPORT_REQUESTLIST +/** Number of rx pbufs to enqueue to parse an incoming request (up to the first + newline) */ +#if !defined LWIP_HTTPD_REQ_QUEUELEN || defined __DOXYGEN__ +#define LWIP_HTTPD_REQ_QUEUELEN 5 +#endif + +/** Number of (TCP payload-) bytes (in pbufs) to enqueue to parse and incoming + request (up to the first double-newline) */ +#if !defined LWIP_HTTPD_REQ_BUFSIZE || defined __DOXYGEN__ +#define LWIP_HTTPD_REQ_BUFSIZE LWIP_HTTPD_MAX_REQ_LENGTH +#endif + +/** Defines the maximum length of a HTTP request line (up to the first CRLF, + copied from pbuf into this a global buffer when pbuf- or packet-queues + are received - otherwise the input pbuf is used directly) */ +#if !defined LWIP_HTTPD_MAX_REQ_LENGTH || defined __DOXYGEN__ +#define LWIP_HTTPD_MAX_REQ_LENGTH LWIP_MIN(1023, (LWIP_HTTPD_REQ_QUEUELEN * PBUF_POOL_BUFSIZE)) +#endif +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + +/** This is the size of a static buffer used when URIs end with '/'. + * In this buffer, the directory requested is concatenated with all the + * configured default file names. + * Set to 0 to disable checking default filenames on non-root directories. + */ +#if !defined LWIP_HTTPD_MAX_REQUEST_URI_LEN || defined __DOXYGEN__ +#define LWIP_HTTPD_MAX_REQUEST_URI_LEN 63 +#endif + +/** Maximum length of the filename to send as response to a POST request, + * filled in by the application when a POST is finished. + */ +#if !defined LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN || defined __DOXYGEN__ +#define LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN 63 +#endif + +/** Set this to 0 to not send the SSI tag (default is on, so the tag will + * be sent in the HTML page */ +#if !defined LWIP_HTTPD_SSI_INCLUDE_TAG || defined __DOXYGEN__ +#define LWIP_HTTPD_SSI_INCLUDE_TAG 1 +#endif + +/** Set this to 1 to call tcp_abort when tcp_close fails with memory error. + * This can be used to prevent consuming all memory in situations where the + * HTTP server has low priority compared to other communication. */ +#if !defined LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR || defined __DOXYGEN__ +#define LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR 0 +#endif + +/** Set this to 1 to kill the oldest connection when running out of + * memory for 'struct http_state' or 'struct http_ssi_state'. + * ATTENTION: This puts all connections on a linked list, so may be kind of slow. + */ +#if !defined LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED || defined __DOXYGEN__ +#define LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED 0 +#endif + +/** Set this to 1 to send URIs without extension without headers + * (who uses this at all??) */ +#if !defined LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI || defined __DOXYGEN__ +#define LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI 0 +#endif + +/** Default: Tags are sent from struct http_state and are therefore volatile */ +#if !defined HTTP_IS_TAG_VOLATILE || defined __DOXYGEN__ +#define HTTP_IS_TAG_VOLATILE(ptr) TCP_WRITE_FLAG_COPY +#endif + +/* By default, the httpd is limited to send 2*pcb->mss to keep resource usage low + when http is not an important protocol in the device. */ +#if !defined HTTPD_LIMIT_SENDING_TO_2MSS || defined __DOXYGEN__ +#define HTTPD_LIMIT_SENDING_TO_2MSS 1 +#endif + +/* Define this to a function that returns the maximum amount of data to enqueue. + The function have this signature: u16_t fn(struct altcp_pcb* pcb); + The best place to define this is the hooks file (@see LWIP_HOOK_FILENAME) */ +#if !defined HTTPD_MAX_WRITE_LEN || defined __DOXYGEN__ +#if HTTPD_LIMIT_SENDING_TO_2MSS +#define HTTPD_MAX_WRITE_LEN(pcb) ((u16_t)(2 * altcp_mss(pcb))) +#endif +#endif + +/*------------------- FS OPTIONS -------------------*/ + +/** Set this to 1 and provide the functions: + * - "int fs_open_custom(struct fs_file *file, const char *name)" + * Called first for every opened file to allow opening files + * that are not included in fsdata(_custom).c + * - "void fs_close_custom(struct fs_file *file)" + * Called to free resources allocated by fs_open_custom(). + */ +#if !defined LWIP_HTTPD_CUSTOM_FILES || defined __DOXYGEN__ +#define LWIP_HTTPD_CUSTOM_FILES 0 +#endif + +/** Set this to 1 to support fs_read() to dynamically read file data. + * Without this (default=off), only one-block files are supported, + * and the contents must be ready after fs_open(). + */ +#if !defined LWIP_HTTPD_DYNAMIC_FILE_READ || defined __DOXYGEN__ +#define LWIP_HTTPD_DYNAMIC_FILE_READ 0 +#endif + +/** Set this to 1 to include an application state argument per file + * that is opened. This allows to keep a state per connection/file. + */ +#if !defined LWIP_HTTPD_FILE_STATE || defined __DOXYGEN__ +#define LWIP_HTTPD_FILE_STATE 0 +#endif + +/** HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for + * predefined (MSS-sized) chunks of the files to prevent having to calculate + * the checksums at runtime. */ +#if !defined HTTPD_PRECALCULATED_CHECKSUM || defined __DOXYGEN__ +#define HTTPD_PRECALCULATED_CHECKSUM 0 +#endif + +/** LWIP_HTTPD_FS_ASYNC_READ==1: support asynchronous read operations + * (fs_read_async returns FS_READ_DELAYED and calls a callback when finished). + */ +#if !defined LWIP_HTTPD_FS_ASYNC_READ || defined __DOXYGEN__ +#define LWIP_HTTPD_FS_ASYNC_READ 0 +#endif + +/** Filename (including path) to use as FS data file */ +#if !defined HTTPD_FSDATA_FILE || defined __DOXYGEN__ +/* HTTPD_USE_CUSTOM_FSDATA: Compatibility with deprecated lwIP option */ +#if defined(HTTPD_USE_CUSTOM_FSDATA) && (HTTPD_USE_CUSTOM_FSDATA != 0) +#define HTTPD_FSDATA_FILE "fsdata_custom.c" +#else +#define HTTPD_FSDATA_FILE "fsdata.c" +#endif +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_APPS_HTTPD_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/lwiperf.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/lwiperf.h new file mode 100644 index 0000000..cc86e7f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/lwiperf.h @@ -0,0 +1,100 @@ +/** + * @file + * lwIP iPerf server implementation + */ + +/* + * Copyright (c) 2014 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_APPS_LWIPERF_H +#define LWIP_HDR_APPS_LWIPERF_H + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LWIPERF_TCP_PORT_DEFAULT 5001 + +/** lwIPerf test results */ +enum lwiperf_report_type +{ + /** The server side test is done */ + LWIPERF_TCP_DONE_SERVER, + /** The client side test is done */ + LWIPERF_TCP_DONE_CLIENT, + /** Local error lead to test abort */ + LWIPERF_TCP_ABORTED_LOCAL, + /** Data check error lead to test abort */ + LWIPERF_TCP_ABORTED_LOCAL_DATAERROR, + /** Transmit error lead to test abort */ + LWIPERF_TCP_ABORTED_LOCAL_TXERROR, + /** Remote side aborted the test */ + LWIPERF_TCP_ABORTED_REMOTE +}; + +/** Control */ +enum lwiperf_client_type +{ + /** Unidirectional tx only test */ + LWIPERF_CLIENT, + /** Do a bidirectional test simultaneously */ + LWIPERF_DUAL, + /** Do a bidirectional test individually */ + LWIPERF_TRADEOFF +}; + +/** Prototype of a report function that is called when a session is finished. + This report function can show the test results. + @param report_type contains the test result */ +typedef void (*lwiperf_report_fn)(void *arg, enum lwiperf_report_type report_type, + const ip_addr_t* local_addr, u16_t local_port, const ip_addr_t* remote_addr, u16_t remote_port, + u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec); + +void* lwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port, + lwiperf_report_fn report_fn, void* report_arg); +void* lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg); +void* lwiperf_start_tcp_client(const ip_addr_t* remote_addr, u16_t remote_port, + enum lwiperf_client_type type, + lwiperf_report_fn report_fn, void* report_arg); +void* lwiperf_start_tcp_client_default(const ip_addr_t* remote_addr, + lwiperf_report_fn report_fn, void* report_arg); + +void lwiperf_abort(void* lwiperf_session); + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_LWIPERF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns.h new file mode 100644 index 0000000..20d7ee2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns.h @@ -0,0 +1,105 @@ +/** + * @file + * MDNS responder + */ + + /* + * Copyright (c) 2015 Verisure Innovation AB + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Ekman + * + */ + +#ifndef LWIP_HDR_APPS_MDNS_H +#define LWIP_HDR_APPS_MDNS_H + +#include "lwip/apps/mdns_opts.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_MDNS_RESPONDER + +enum mdns_sd_proto { + DNSSD_PROTO_UDP = 0, + DNSSD_PROTO_TCP = 1 +}; + +#define MDNS_PROBING_CONFLICT 0 +#define MDNS_PROBING_SUCCESSFUL 1 + +#define MDNS_LABEL_MAXLEN 63 + +struct mdns_host; +struct mdns_service; + +/** Callback function to add text to a reply, called when generating the reply */ +typedef void (*service_get_txt_fn_t)(struct mdns_service *service, void *txt_userdata); + +/** Callback function to let application know the result of probing network for name + * uniqueness, called with result MDNS_PROBING_SUCCESSFUL if no other node claimed + * use for the name for the netif or a service and is safe to use, or MDNS_PROBING_CONFLICT + * if another node is already using it and mdns is disabled on this interface */ +typedef void (*mdns_name_result_cb_t)(struct netif* netif, u8_t result); + +void mdns_resp_init(void); + +void mdns_resp_register_name_result_cb(mdns_name_result_cb_t cb); + +err_t mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl); +err_t mdns_resp_remove_netif(struct netif *netif); +err_t mdns_resp_rename_netif(struct netif *netif, const char *hostname); + +s8_t mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata); +err_t mdns_resp_del_service(struct netif *netif, s8_t slot); +err_t mdns_resp_rename_service(struct netif *netif, s8_t slot, const char *name); + +err_t mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len); + +void mdns_resp_restart(struct netif *netif); +void mdns_resp_announce(struct netif *netif); + +/** + * @ingroup mdns + * Announce IP settings have changed on netif. + * Call this in your callback registered by netif_set_status_callback(). + * No need to call this function when LWIP_NETIF_EXT_STATUS_CALLBACK==1, + * this handled automatically for you. + * @param netif The network interface where settings have changed. + */ +#define mdns_resp_netif_settings_changed(netif) mdns_resp_announce(netif) + +#endif /* LWIP_MDNS_RESPONDER */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_MDNS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_opts.h new file mode 100644 index 0000000..ac23220 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_opts.h @@ -0,0 +1,80 @@ +/** + * @file + * MDNS responder + */ + + /* + * Copyright (c) 2015 Verisure Innovation AB + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Ekman + * + */ + +#ifndef LWIP_HDR_APPS_MDNS_OPTS_H +#define LWIP_HDR_APPS_MDNS_OPTS_H + +#include "lwip/opt.h" + +/** + * @defgroup mdns_opts Options + * @ingroup mdns + * @{ + */ + +/** + * LWIP_MDNS_RESPONDER==1: Turn on multicast DNS module. UDP must be available for MDNS + * transport. IGMP is needed for IPv4 multicast. + */ +#ifndef LWIP_MDNS_RESPONDER +#define LWIP_MDNS_RESPONDER 0 +#endif /* LWIP_MDNS_RESPONDER */ + +/** The maximum number of services per netif */ +#ifndef MDNS_MAX_SERVICES +#define MDNS_MAX_SERVICES 1 +#endif + +/** MDNS_RESP_USENETIF_EXTCALLBACK==1: register an ext_callback on the netif + * to automatically restart probing/announcing on status or address change. + */ +#ifndef MDNS_RESP_USENETIF_EXTCALLBACK +#define MDNS_RESP_USENETIF_EXTCALLBACK LWIP_NETIF_EXT_STATUS_CALLBACK +#endif + +/** + * MDNS_DEBUG: Enable debugging for multicast DNS. + */ +#ifndef MDNS_DEBUG +#define MDNS_DEBUG LWIP_DBG_OFF +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_APPS_MDNS_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_priv.h new file mode 100644 index 0000000..9635b5b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mdns_priv.h @@ -0,0 +1,74 @@ +/** + * @file + * MDNS responder private definitions + */ + + /* + * Copyright (c) 2015 Verisure Innovation AB + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Ekman + * + */ +#ifndef LWIP_HDR_MDNS_PRIV_H +#define LWIP_HDR_MDNS_PRIV_H + +#include "lwip/apps/mdns_opts.h" +#include "lwip/pbuf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_MDNS_RESPONDER + +/* Domain struct and methods - visible for unit tests */ + +#define MDNS_DOMAIN_MAXLEN 256 +#define MDNS_READNAME_ERROR 0xFFFF + +struct mdns_domain { + /* Encoded domain name */ + u8_t name[MDNS_DOMAIN_MAXLEN]; + /* Total length of domain name, including zero */ + u16_t length; + /* Set if compression of this domain is not allowed */ + u8_t skip_compression; +}; + +err_t mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len); +u16_t mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain); +int mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b); +u16_t mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain); + +#endif /* LWIP_MDNS_RESPONDER */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_MDNS_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt.h new file mode 100644 index 0000000..f099812 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt.h @@ -0,0 +1,205 @@ +/** + * @file + * MQTT client + */ + +/* + * Copyright (c) 2016 Erik Andersson + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Andersson + * + */ +#ifndef LWIP_HDR_APPS_MQTT_CLIENT_H +#define LWIP_HDR_APPS_MQTT_CLIENT_H + +#include "lwip/apps/mqtt_opts.h" +#include "lwip/err.h" +#include "lwip/ip_addr.h" +#include "lwip/prot/iana.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct mqtt_client_s mqtt_client_t; + +#if LWIP_ALTCP && LWIP_ALTCP_TLS +struct altcp_tls_config; +#endif + +/** @ingroup mqtt + * Default MQTT port (non-TLS) */ +#define MQTT_PORT LWIP_IANA_PORT_MQTT +/** @ingroup mqtt + * Default MQTT TLS port */ +#define MQTT_TLS_PORT LWIP_IANA_PORT_SECURE_MQTT + +/*---------------------------------------------------------------------------------------------- */ +/* Connection with server */ + +/** + * @ingroup mqtt + * Client information and connection parameters */ +struct mqtt_connect_client_info_t { + /** Client identifier, must be set by caller */ + const char *client_id; + /** User name, set to NULL if not used */ + const char* client_user; + /** Password, set to NULL if not used */ + const char* client_pass; + /** keep alive time in seconds, 0 to disable keep alive functionality*/ + u16_t keep_alive; + /** will topic, set to NULL if will is not to be used, + will_msg, will_qos and will retain are then ignored */ + const char* will_topic; + /** will_msg, see will_topic */ + const char* will_msg; + /** will_qos, see will_topic */ + u8_t will_qos; + /** will_retain, see will_topic */ + u8_t will_retain; +#if LWIP_ALTCP && LWIP_ALTCP_TLS + /** TLS configuration for secure connections */ + struct altcp_tls_config *tls_config; +#endif +}; + +/** + * @ingroup mqtt + * Connection status codes */ +typedef enum +{ + /** Accepted */ + MQTT_CONNECT_ACCEPTED = 0, + /** Refused protocol version */ + MQTT_CONNECT_REFUSED_PROTOCOL_VERSION = 1, + /** Refused identifier */ + MQTT_CONNECT_REFUSED_IDENTIFIER = 2, + /** Refused server */ + MQTT_CONNECT_REFUSED_SERVER = 3, + /** Refused user credentials */ + MQTT_CONNECT_REFUSED_USERNAME_PASS = 4, + /** Refused not authorized */ + MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_ = 5, + /** Disconnected */ + MQTT_CONNECT_DISCONNECTED = 256, + /** Timeout */ + MQTT_CONNECT_TIMEOUT = 257 +} mqtt_connection_status_t; + +/** + * @ingroup mqtt + * Function prototype for mqtt connection status callback. Called when + * client has connected to the server after initiating a mqtt connection attempt by + * calling mqtt_client_connect() or when connection is closed by server or an error + * + * @param client MQTT client itself + * @param arg Additional argument to pass to the callback function + * @param status Connect result code or disconnection notification @see mqtt_connection_status_t + * + */ +typedef void (*mqtt_connection_cb_t)(mqtt_client_t *client, void *arg, mqtt_connection_status_t status); + + +/** + * @ingroup mqtt + * Data callback flags */ +enum { + /** Flag set when last fragment of data arrives in data callback */ + MQTT_DATA_FLAG_LAST = 1 +}; + +/** + * @ingroup mqtt + * Function prototype for MQTT incoming publish data callback function. Called when data + * arrives to a subscribed topic @see mqtt_subscribe + * + * @param arg Additional argument to pass to the callback function + * @param data User data, pointed object, data may not be referenced after callback return, + NULL is passed when all publish data are delivered + * @param len Length of publish data fragment + * @param flags MQTT_DATA_FLAG_LAST set when this call contains the last part of data from publish message + * + */ +typedef void (*mqtt_incoming_data_cb_t)(void *arg, const u8_t *data, u16_t len, u8_t flags); + + +/** + * @ingroup mqtt + * Function prototype for MQTT incoming publish function. Called when an incoming publish + * arrives to a subscribed topic @see mqtt_subscribe + * + * @param arg Additional argument to pass to the callback function + * @param topic Zero terminated Topic text string, topic may not be referenced after callback return + * @param tot_len Total length of publish data, if set to 0 (no publish payload) data callback will not be invoked + */ +typedef void (*mqtt_incoming_publish_cb_t)(void *arg, const char *topic, u32_t tot_len); + + +/** + * @ingroup mqtt + * Function prototype for mqtt request callback. Called when a subscribe, unsubscribe + * or publish request has completed + * @param arg Pointer to user data supplied when invoking request + * @param err ERR_OK on success + * ERR_TIMEOUT if no response was received within timeout, + * ERR_ABRT if (un)subscribe was denied + */ +typedef void (*mqtt_request_cb_t)(void *arg, err_t err); + + +err_t mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg, + const struct mqtt_connect_client_info_t *client_info); + +void mqtt_disconnect(mqtt_client_t *client); + +mqtt_client_t *mqtt_client_new(void); +void mqtt_client_free(mqtt_client_t* client); + +u8_t mqtt_client_is_connected(mqtt_client_t *client); + +void mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t, + mqtt_incoming_data_cb_t data_cb, void *arg); + +err_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub); + +/** @ingroup mqtt + *Subscribe to topic */ +#define mqtt_subscribe(client, topic, qos, cb, arg) mqtt_sub_unsub(client, topic, qos, cb, arg, 1) +/** @ingroup mqtt + * Unsubscribe to topic */ +#define mqtt_unsubscribe(client, topic, cb, arg) mqtt_sub_unsub(client, topic, 0, cb, arg, 0) + +err_t mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain, + mqtt_request_cb_t cb, void *arg); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_MQTT_CLIENT_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_opts.h new file mode 100644 index 0000000..4226d21 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_opts.h @@ -0,0 +1,103 @@ +/** + * @file + * MQTT client options + */ + +/* + * Copyright (c) 2016 Erik Andersson + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Andersson + * + */ +#ifndef LWIP_HDR_APPS_MQTT_OPTS_H +#define LWIP_HDR_APPS_MQTT_OPTS_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup mqtt_opts Options + * @ingroup mqtt + * @{ + */ + +/** + * Output ring-buffer size, must be able to fit largest outgoing publish message topic+payloads + */ +#ifndef MQTT_OUTPUT_RINGBUF_SIZE +#define MQTT_OUTPUT_RINGBUF_SIZE 256 +#endif + +/** + * Number of bytes in receive buffer, must be at least the size of the longest incoming topic + 8 + * If one wants to avoid fragmented incoming publish, set length to max incoming topic length + max payload length + 8 + */ +#ifndef MQTT_VAR_HEADER_BUFFER_LEN +#define MQTT_VAR_HEADER_BUFFER_LEN 128 +#endif + +/** + * Maximum number of pending subscribe, unsubscribe and publish requests to server . + */ +#ifndef MQTT_REQ_MAX_IN_FLIGHT +#define MQTT_REQ_MAX_IN_FLIGHT 4 +#endif + +/** + * Seconds between each cyclic timer call. + */ +#ifndef MQTT_CYCLIC_TIMER_INTERVAL +#define MQTT_CYCLIC_TIMER_INTERVAL 5 +#endif + +/** + * Publish, subscribe and unsubscribe request timeout in seconds. + */ +#ifndef MQTT_REQ_TIMEOUT +#define MQTT_REQ_TIMEOUT 30 +#endif + +/** + * Seconds for MQTT connect response timeout after sending connect request + */ +#ifndef MQTT_CONNECT_TIMOUT +#define MQTT_CONNECT_TIMOUT 100 +#endif + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_MQTT_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_priv.h new file mode 100644 index 0000000..b775913 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/mqtt_priv.h @@ -0,0 +1,104 @@ +/** + * @file + * MQTT client (private interface) + */ + +/* + * Copyright (c) 2016 Erik Andersson + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Erik Andersson + * + */ +#ifndef LWIP_HDR_APPS_MQTT_PRIV_H +#define LWIP_HDR_APPS_MQTT_PRIV_H + +#include "lwip/apps/mqtt.h" +#include "lwip/altcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Pending request item, binds application callback to pending server requests */ +struct mqtt_request_t +{ + /** Next item in list, NULL means this is the last in chain, + next pointing at itself means request is unallocated */ + struct mqtt_request_t *next; + /** Callback to upper layer */ + mqtt_request_cb_t cb; + void *arg; + /** MQTT packet identifier */ + u16_t pkt_id; + /** Expire time relative to element before this */ + u16_t timeout_diff; +}; + +/** Ring buffer */ +struct mqtt_ringbuf_t { + u16_t put; + u16_t get; + u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE]; +}; + +/** MQTT client */ +struct mqtt_client_s +{ + /** Timers and timeouts */ + u16_t cyclic_tick; + u16_t keep_alive; + u16_t server_watchdog; + /** Packet identifier generator*/ + u16_t pkt_id_seq; + /** Packet identifier of pending incoming publish */ + u16_t inpub_pkt_id; + /** Connection state */ + u8_t conn_state; + struct altcp_pcb *conn; + /** Connection callback */ + void *connect_arg; + mqtt_connection_cb_t connect_cb; + /** Pending requests to server */ + struct mqtt_request_t *pend_req_queue; + struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT]; + void *inpub_arg; + /** Incoming data callback */ + mqtt_incoming_data_cb_t data_cb; + mqtt_incoming_publish_cb_t pub_cb; + /** Input */ + u32_t msg_idx; + u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN]; + /** Output ring-buffer */ + struct mqtt_ringbuf_t output; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_MQTT_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns.h new file mode 100644 index 0000000..a326d33 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns.h @@ -0,0 +1,51 @@ +/** + * @file + * NETBIOS name service responder + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ +#ifndef LWIP_HDR_APPS_NETBIOS_H +#define LWIP_HDR_APPS_NETBIOS_H + +#include "lwip/apps/netbiosns_opts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void netbiosns_init(void); +#ifndef NETBIOS_LWIP_NAME +void netbiosns_set_name(const char* hostname); +#endif +void netbiosns_stop(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_NETBIOS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns_opts.h new file mode 100644 index 0000000..cc0da95 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/netbiosns_opts.h @@ -0,0 +1,66 @@ +/** + * @file + * NETBIOS name service responder options + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ +#ifndef LWIP_HDR_APPS_NETBIOS_OPTS_H +#define LWIP_HDR_APPS_NETBIOS_OPTS_H + +#include "lwip/opt.h" + +/** + * @defgroup netbiosns_opts Options + * @ingroup netbiosns + * @{ + */ + +/** NetBIOS name of lwip device + * This must be uppercase until NETBIOS_STRCMP() is defined to a string + * comparison function that is case insensitive. + * If you want to use the netif's hostname, use this (with LWIP_NETIF_HOSTNAME): + * (ip_current_netif() != NULL ? ip_current_netif()->hostname != NULL ? ip_current_netif()->hostname : "" : "") + * + * If this is not defined, netbiosns_set_name() can be called at runtime to change the name. + */ +#ifdef __DOXYGEN__ +#define NETBIOS_LWIP_NAME "NETBIOSLWIPDEV" +#endif + +/** Respond to NetBIOS name queries + * Default is disabled + */ +#if !defined LWIP_NETBIOS_RESPOND_NAME_QUERY || defined __DOXYGEN__ +#define LWIP_NETBIOS_RESPOND_NAME_QUERY 0 +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_APPS_NETBIOS_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp.h new file mode 100644 index 0000000..fb4a4a7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp.h @@ -0,0 +1,128 @@ +#ifndef LWIP_HDR_APPS_SMTP_H +#define LWIP_HDR_APPS_SMTP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/apps/smtp_opts.h" +#include "lwip/err.h" +#include "lwip/prot/iana.h" + +/** The default TCP port used for SMTP */ +#define SMTP_DEFAULT_PORT LWIP_IANA_PORT_SMTP +/** The default TCP port used for SMTPS */ +#define SMTPS_DEFAULT_PORT LWIP_IANA_PORT_SMTPS + +/** Email successfully sent */ +#define SMTP_RESULT_OK 0 +/** Unknown error */ +#define SMTP_RESULT_ERR_UNKNOWN 1 +/** Connection to server failed */ +#define SMTP_RESULT_ERR_CONNECT 2 +/** Failed to resolve server hostname */ +#define SMTP_RESULT_ERR_HOSTNAME 3 +/** Connection unexpectedly closed by remote server */ +#define SMTP_RESULT_ERR_CLOSED 4 +/** Connection timed out (server didn't respond in time) */ +#define SMTP_RESULT_ERR_TIMEOUT 5 +/** Server responded with an unknown response code */ +#define SMTP_RESULT_ERR_SVR_RESP 6 +/** Out of resources locally */ +#define SMTP_RESULT_ERR_MEM 7 + +/** Prototype of an smtp callback function + * + * @param arg argument specified when initiating the email + * @param smtp_result result of the mail transfer (see defines SMTP_RESULT_*) + * @param srv_err if aborted by the server, this contains the error code received + * @param err an error returned by internal lwip functions, can help to specify + * the source of the error but must not necessarily be != ERR_OK + */ +typedef void (*smtp_result_fn)(void *arg, u8_t smtp_result, u16_t srv_err, err_t err); + +/** This structure is used as argument for smtp_send_mail_int(), + * which in turn can be used with tcpip_callback() to send mail + * from interrupt context, e.g. like this: + * struct smtp_send_request *req; (to be filled) + * tcpip_try_callback(smtp_send_mail_int, (void*)req); + * + * For member description, see parameter description of smtp_send_mail(). + * When using with tcpip_callback, this structure has to stay allocated + * (e.g. using mem_malloc/mem_free) until its 'callback_fn' is called. + */ +struct smtp_send_request { + const char *from; + const char* to; + const char* subject; + const char* body; + smtp_result_fn callback_fn; + void* callback_arg; + /** If this is != 0, data is *not* copied into an extra buffer + * but used from the pointers supplied in this struct. + * This means less memory usage, but data must stay untouched until + * the callback function is called. */ + u8_t static_data; +}; + + +#if SMTP_BODYDH + +#ifndef SMTP_BODYDH_BUFFER_SIZE +#define SMTP_BODYDH_BUFFER_SIZE 256 +#endif /* SMTP_BODYDH_BUFFER_SIZE */ + +struct smtp_bodydh { + u16_t state; + u16_t length; /* Length of content in buffer */ + char buffer[SMTP_BODYDH_BUFFER_SIZE]; /* buffer for generated content */ +#ifdef SMTP_BODYDH_USER_SIZE + u8_t user[SMTP_BODYDH_USER_SIZE]; +#endif /* SMTP_BODYDH_USER_SIZE */ +}; + +enum bdh_retvals_e { + BDH_DONE = 0, + BDH_WORKING +}; + +/** Prototype of an smtp body callback function + * It receives a struct smtp_bodydh, and a buffer to write data, + * must return BDH_WORKING to be called again and BDH_DONE when + * it has finished processing. This one tries to fill one TCP buffer with + * data, your function will be repeatedly called until that happens; so if you + * know you'll be taking too long to serve your request, pause once in a while + * by writing length=0 to avoid hogging system resources + * + * @param arg argument specified when initiating the email + * @param smtp_bodydh state handling + buffer structure + */ +typedef int (*smtp_bodycback_fn)(void *arg, struct smtp_bodydh *bodydh); + +err_t smtp_send_mail_bodycback(const char *from, const char* to, const char* subject, + smtp_bodycback_fn bodycback_fn, smtp_result_fn callback_fn, void* callback_arg); + +#endif /* SMTP_BODYDH */ + + +err_t smtp_set_server_addr(const char* server); +void smtp_set_server_port(u16_t port); +#if LWIP_ALTCP && LWIP_ALTCP_TLS +struct altcp_tls_config; +void smtp_set_tls_config(struct altcp_tls_config *tls_config); +#endif +err_t smtp_set_auth(const char* username, const char* pass); +err_t smtp_send_mail(const char *from, const char* to, const char* subject, const char* body, + smtp_result_fn callback_fn, void* callback_arg); +err_t smtp_send_mail_static(const char *from, const char* to, const char* subject, const char* body, + smtp_result_fn callback_fn, void* callback_arg); +void smtp_send_mail_int(void *arg); +#ifdef LWIP_DEBUG +const char* smtp_result_str(u8_t smtp_result); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SMTP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp_opts.h new file mode 100644 index 0000000..c588fb9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/smtp_opts.h @@ -0,0 +1,80 @@ +#ifndef LWIP_HDR_APPS_SMTP_OPTS_H +#define LWIP_HDR_APPS_SMTP_OPTS_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup smtp_opts Options + * @ingroup smtp + * + * @{ + */ + +/** Set this to 1 to enable data handler callback on BODY */ +#ifndef SMTP_BODYDH +#define SMTP_BODYDH 0 +#endif + +/** SMTP_DEBUG: Enable debugging for SNTP. */ +#ifndef SMTP_DEBUG +#define SMTP_DEBUG LWIP_DBG_OFF +#endif + +/** Maximum length reserved for server name including terminating 0 byte */ +#ifndef SMTP_MAX_SERVERNAME_LEN +#define SMTP_MAX_SERVERNAME_LEN 256 +#endif + +/** Maximum length reserved for username */ +#ifndef SMTP_MAX_USERNAME_LEN +#define SMTP_MAX_USERNAME_LEN 32 +#endif + +/** Maximum length reserved for password */ +#ifndef SMTP_MAX_PASS_LEN +#define SMTP_MAX_PASS_LEN 32 +#endif + +/** Set this to 0 if you know the authentication data will not change + * during the smtp session, which saves some heap space. */ +#ifndef SMTP_COPY_AUTHDATA +#define SMTP_COPY_AUTHDATA 1 +#endif + +/** Set this to 0 to save some code space if you know for sure that all data + * passed to this module conforms to the requirements in the SMTP RFC. + * WARNING: use this with care! + */ +#ifndef SMTP_CHECK_DATA +#define SMTP_CHECK_DATA 1 +#endif + +/** Set this to 1 to enable AUTH PLAIN support */ +#ifndef SMTP_SUPPORT_AUTH_PLAIN +#define SMTP_SUPPORT_AUTH_PLAIN 1 +#endif + +/** Set this to 1 to enable AUTH LOGIN support */ +#ifndef SMTP_SUPPORT_AUTH_LOGIN +#define SMTP_SUPPORT_AUTH_LOGIN 1 +#endif + +/* Memory allocation/deallocation can be overridden... */ +#ifndef SMTP_STATE_MALLOC +#define SMTP_STATE_MALLOC(size) mem_malloc(size) +#define SMTP_STATE_FREE(ptr) mem_free(ptr) +#endif + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* SMTP_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp.h new file mode 100644 index 0000000..ab265b7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp.h @@ -0,0 +1,135 @@ +/** + * @file + * SNMP server main API - start and basic configuration + */ + +/* + * Copyright (c) 2001, 2002 Leon Woestenberg + * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Leon Woestenberg + * Martin Hentschel + * + */ +#ifndef LWIP_HDR_APPS_SNMP_H +#define LWIP_HDR_APPS_SNMP_H + +#include "lwip/apps/snmp_opts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/err.h" +#include "lwip/apps/snmp_core.h" + +/** SNMP variable binding descriptor (publicly needed for traps) */ +struct snmp_varbind +{ + /** pointer to next varbind, NULL for last in list */ + struct snmp_varbind *next; + /** pointer to previous varbind, NULL for first in list */ + struct snmp_varbind *prev; + + /** object identifier */ + struct snmp_obj_id oid; + + /** value ASN1 type */ + u8_t type; + /** object value length */ + u16_t value_len; + /** object value */ + void *value; +}; + +/** + * @ingroup snmp_core + * Agent setup, start listening to port 161. + */ +void snmp_init(void); +void snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs); + +void snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_oid); +const struct snmp_obj_id* snmp_get_device_enterprise_oid(void); + +void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable); +void snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst); + +/** Generic trap: cold start */ +#define SNMP_GENTRAP_COLDSTART 0 +/** Generic trap: warm start */ +#define SNMP_GENTRAP_WARMSTART 1 +/** Generic trap: link down */ +#define SNMP_GENTRAP_LINKDOWN 2 +/** Generic trap: link up */ +#define SNMP_GENTRAP_LINKUP 3 +/** Generic trap: authentication failure */ +#define SNMP_GENTRAP_AUTH_FAILURE 4 +/** Generic trap: EGP neighbor lost */ +#define SNMP_GENTRAP_EGP_NEIGHBOR_LOSS 5 +/** Generic trap: enterprise specific */ +#define SNMP_GENTRAP_ENTERPRISE_SPECIFIC 6 + +err_t snmp_send_trap_generic(s32_t generic_trap); +err_t snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds); +err_t snmp_send_trap(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds); + +#define SNMP_AUTH_TRAPS_DISABLED 0 +#define SNMP_AUTH_TRAPS_ENABLED 1 +void snmp_set_auth_traps_enabled(u8_t enable); +u8_t snmp_get_auth_traps_enabled(void); + +u8_t snmp_v1_enabled(void); +u8_t snmp_v2c_enabled(void); +u8_t snmp_v3_enabled(void); +void snmp_v1_enable(u8_t enable); +void snmp_v2c_enable(u8_t enable); +void snmp_v3_enable(u8_t enable); + +const char * snmp_get_community(void); +const char * snmp_get_community_write(void); +const char * snmp_get_community_trap(void); +void snmp_set_community(const char * const community); +void snmp_set_community_write(const char * const community); +void snmp_set_community_trap(const char * const community); + +void snmp_coldstart_trap(void); +void snmp_authfail_trap(void); + +typedef void (*snmp_write_callback_fct)(const u32_t* oid, u8_t oid_len, void* callback_arg); +void snmp_set_write_callback(snmp_write_callback_fct write_callback, void* callback_arg); + +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_core.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_core.h new file mode 100644 index 0000000..5a8a49f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_core.h @@ -0,0 +1,377 @@ +/** + * @file + * SNMP core API for implementing MIBs + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Christiaan Simons + * Martin Hentschel + */ + +#ifndef LWIP_HDR_APPS_SNMP_CORE_H +#define LWIP_HDR_APPS_SNMP_CORE_H + +#include "lwip/apps/snmp_opts.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip_addr.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* basic ASN1 defines */ +#define SNMP_ASN1_CLASS_UNIVERSAL 0x00 +#define SNMP_ASN1_CLASS_APPLICATION 0x40 +#define SNMP_ASN1_CLASS_CONTEXT 0x80 +#define SNMP_ASN1_CLASS_PRIVATE 0xC0 + +#define SNMP_ASN1_CONTENTTYPE_PRIMITIVE 0x00 +#define SNMP_ASN1_CONTENTTYPE_CONSTRUCTED 0x20 + +/* universal tags (from ASN.1 spec.) */ +#define SNMP_ASN1_UNIVERSAL_END_OF_CONTENT 0 +#define SNMP_ASN1_UNIVERSAL_INTEGER 2 +#define SNMP_ASN1_UNIVERSAL_OCTET_STRING 4 +#define SNMP_ASN1_UNIVERSAL_NULL 5 +#define SNMP_ASN1_UNIVERSAL_OBJECT_ID 6 +#define SNMP_ASN1_UNIVERSAL_SEQUENCE_OF 16 + +/* application specific (SNMP) tags (from SNMPv2-SMI) */ +#define SNMP_ASN1_APPLICATION_IPADDR 0 /* [APPLICATION 0] IMPLICIT OCTET STRING (SIZE (4)) */ +#define SNMP_ASN1_APPLICATION_COUNTER 1 /* [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) => u32_t */ +#define SNMP_ASN1_APPLICATION_GAUGE 2 /* [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) => u32_t */ +#define SNMP_ASN1_APPLICATION_TIMETICKS 3 /* [APPLICATION 3] IMPLICIT INTEGER (0..4294967295) => u32_t */ +#define SNMP_ASN1_APPLICATION_OPAQUE 4 /* [APPLICATION 4] IMPLICIT OCTET STRING */ +#define SNMP_ASN1_APPLICATION_COUNTER64 6 /* [APPLICATION 6] IMPLICIT INTEGER (0..18446744073709551615) */ + +/* context specific (SNMP) tags (from RFC 1905) */ +#define SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_INSTANCE 1 + +/* full ASN1 type defines */ +#define SNMP_ASN1_TYPE_END_OF_CONTENT (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_END_OF_CONTENT) +#define SNMP_ASN1_TYPE_INTEGER (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_INTEGER) +#define SNMP_ASN1_TYPE_OCTET_STRING (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_OCTET_STRING) +#define SNMP_ASN1_TYPE_NULL (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_NULL) +#define SNMP_ASN1_TYPE_OBJECT_ID (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_OBJECT_ID) +#define SNMP_ASN1_TYPE_SEQUENCE (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_UNIVERSAL_SEQUENCE_OF) +#define SNMP_ASN1_TYPE_IPADDR (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_IPADDR) +#define SNMP_ASN1_TYPE_IPADDRESS SNMP_ASN1_TYPE_IPADDR +#define SNMP_ASN1_TYPE_COUNTER (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER) +#define SNMP_ASN1_TYPE_COUNTER32 SNMP_ASN1_TYPE_COUNTER +#define SNMP_ASN1_TYPE_GAUGE (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_GAUGE) +#define SNMP_ASN1_TYPE_GAUGE32 SNMP_ASN1_TYPE_GAUGE +#define SNMP_ASN1_TYPE_UNSIGNED32 SNMP_ASN1_TYPE_GAUGE +#define SNMP_ASN1_TYPE_TIMETICKS (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_TIMETICKS) +#define SNMP_ASN1_TYPE_OPAQUE (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_OPAQUE) +#if LWIP_HAVE_INT64 +#define SNMP_ASN1_TYPE_COUNTER64 (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER64) +#endif + +#define SNMP_VARBIND_EXCEPTION_OFFSET 0xF0 +#define SNMP_VARBIND_EXCEPTION_MASK 0x0F + +/** error codes predefined by SNMP prot. */ +typedef enum { + SNMP_ERR_NOERROR = 0, +/* +outdated v1 error codes. do not use anmore! +#define SNMP_ERR_NOSUCHNAME 2 use SNMP_ERR_NOSUCHINSTANCE instead +#define SNMP_ERR_BADVALUE 3 use SNMP_ERR_WRONGTYPE,SNMP_ERR_WRONGLENGTH,SNMP_ERR_WRONGENCODING or SNMP_ERR_WRONGVALUE instead +#define SNMP_ERR_READONLY 4 use SNMP_ERR_NOTWRITABLE instead +*/ + SNMP_ERR_GENERROR = 5, + SNMP_ERR_NOACCESS = 6, + SNMP_ERR_WRONGTYPE = 7, + SNMP_ERR_WRONGLENGTH = 8, + SNMP_ERR_WRONGENCODING = 9, + SNMP_ERR_WRONGVALUE = 10, + SNMP_ERR_NOCREATION = 11, + SNMP_ERR_INCONSISTENTVALUE = 12, + SNMP_ERR_RESOURCEUNAVAILABLE = 13, + SNMP_ERR_COMMITFAILED = 14, + SNMP_ERR_UNDOFAILED = 15, + SNMP_ERR_NOTWRITABLE = 17, + SNMP_ERR_INCONSISTENTNAME = 18, + + SNMP_ERR_NOSUCHINSTANCE = SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_INSTANCE +} snmp_err_t; + +/** internal object identifier representation */ +struct snmp_obj_id +{ + u8_t len; + u32_t id[SNMP_MAX_OBJ_ID_LEN]; +}; + +struct snmp_obj_id_const_ref +{ + u8_t len; + const u32_t* id; +}; + +extern const struct snmp_obj_id_const_ref snmp_zero_dot_zero; /* administrative identifier from SNMPv2-SMI */ + +/** SNMP variant value, used as reference in struct snmp_node_instance and table implementation */ +union snmp_variant_value +{ + void* ptr; + const void* const_ptr; + u32_t u32; + s32_t s32; +#if LWIP_HAVE_INT64 + u64_t u64; +#endif +}; + + +/** +SNMP MIB node types + tree node is the only node the stack can process in order to walk the tree, + all other nodes are assumed to be leaf nodes. + This cannot be an enum because users may want to define their own node types. +*/ +#define SNMP_NODE_TREE 0x00 +/* predefined leaf node types */ +#define SNMP_NODE_SCALAR 0x01 +#define SNMP_NODE_SCALAR_ARRAY 0x02 +#define SNMP_NODE_TABLE 0x03 +#define SNMP_NODE_THREADSYNC 0x04 + +/** node "base class" layout, the mandatory fields for a node */ +struct snmp_node +{ + /** one out of SNMP_NODE_TREE or any leaf node type (like SNMP_NODE_SCALAR) */ + u8_t node_type; + /** the number assigned to this node which used as part of the full OID */ + u32_t oid; +}; + +/** SNMP node instance access types */ +typedef enum { + SNMP_NODE_INSTANCE_ACCESS_READ = 1, + SNMP_NODE_INSTANCE_ACCESS_WRITE = 2, + SNMP_NODE_INSTANCE_READ_ONLY = SNMP_NODE_INSTANCE_ACCESS_READ, + SNMP_NODE_INSTANCE_READ_WRITE = (SNMP_NODE_INSTANCE_ACCESS_READ | SNMP_NODE_INSTANCE_ACCESS_WRITE), + SNMP_NODE_INSTANCE_WRITE_ONLY = SNMP_NODE_INSTANCE_ACCESS_WRITE, + SNMP_NODE_INSTANCE_NOT_ACCESSIBLE = 0 +} snmp_access_t; + +struct snmp_node_instance; + +typedef s16_t (*node_instance_get_value_method)(struct snmp_node_instance*, void*); +typedef snmp_err_t (*node_instance_set_test_method)(struct snmp_node_instance*, u16_t, void*); +typedef snmp_err_t (*node_instance_set_value_method)(struct snmp_node_instance*, u16_t, void*); +typedef void (*node_instance_release_method)(struct snmp_node_instance*); + +#define SNMP_GET_VALUE_RAW_DATA 0x4000 /* do not use 0x8000 because return value of node_instance_get_value_method is signed16 and 0x8000 would be the signed bit */ + +/** SNMP node instance */ +struct snmp_node_instance +{ + /** prefilled with the node, get_instance() is called on; may be changed by user to any value to pass an arbitrary node between calls to get_instance() and get_value/test_value/set_value */ + const struct snmp_node* node; + /** prefilled with the instance id requested; for get_instance() this is the exact oid requested; for get_next_instance() this is the relative starting point, stack expects relative oid of next node here */ + struct snmp_obj_id instance_oid; + + /** ASN type for this object (see snmp_asn1.h for definitions) */ + u8_t asn1_type; + /** one out of instance access types defined above (SNMP_NODE_INSTANCE_READ_ONLY,...) */ + snmp_access_t access; + + /** returns object value for the given object identifier. Return values <0 to indicate an error */ + node_instance_get_value_method get_value; + /** tests length and/or range BEFORE setting */ + node_instance_set_test_method set_test; + /** sets object value, only called when set_test() was successful */ + node_instance_set_value_method set_value; + /** called in any case when the instance is not required anymore by stack (useful for freeing memory allocated in get_instance/get_next_instance methods) */ + node_instance_release_method release_instance; + + /** reference to pass arbitrary value between calls to get_instance() and get_value/test_value/set_value */ + union snmp_variant_value reference; + /** see reference (if reference is a pointer, the length of underlying data may be stored here or anything else) */ + u32_t reference_len; +}; + + +/** SNMP tree node */ +struct snmp_tree_node +{ + /** inherited "base class" members */ + struct snmp_node node; + u16_t subnode_count; + const struct snmp_node* const *subnodes; +}; + +#define SNMP_CREATE_TREE_NODE(oid, subnodes) \ + {{ SNMP_NODE_TREE, (oid) }, \ + (u16_t)LWIP_ARRAYSIZE(subnodes), (subnodes) } + +#define SNMP_CREATE_EMPTY_TREE_NODE(oid) \ + {{ SNMP_NODE_TREE, (oid) }, \ + 0, NULL } + +/** SNMP leaf node */ +struct snmp_leaf_node +{ + /** inherited "base class" members */ + struct snmp_node node; + snmp_err_t (*get_instance)(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); + snmp_err_t (*get_next_instance)(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); +}; + +/** represents a single mib with its base oid and root node */ +struct snmp_mib +{ + const u32_t *base_oid; + u8_t base_oid_len; + const struct snmp_node *root_node; +}; + +#define SNMP_MIB_CREATE(oid_list, root_node) { (oid_list), (u8_t)LWIP_ARRAYSIZE(oid_list), root_node } + +/** OID range structure */ +struct snmp_oid_range +{ + u32_t min; + u32_t max; +}; + +/** checks if incoming OID length and values are in allowed ranges */ +u8_t snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len); + +typedef enum { + SNMP_NEXT_OID_STATUS_SUCCESS, + SNMP_NEXT_OID_STATUS_NO_MATCH, + SNMP_NEXT_OID_STATUS_BUF_TO_SMALL +} snmp_next_oid_status_t; + +/** state for next_oid_init / next_oid_check functions */ +struct snmp_next_oid_state +{ + const u32_t* start_oid; + u8_t start_oid_len; + + u32_t* next_oid; + u8_t next_oid_len; + u8_t next_oid_max_len; + + snmp_next_oid_status_t status; + void* reference; +}; + +void snmp_next_oid_init(struct snmp_next_oid_state *state, + const u32_t *start_oid, u8_t start_oid_len, + u32_t *next_oid_buf, u8_t next_oid_max_len); +u8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len); +u8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, u8_t oid_len, void* reference); + +void snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len); +void snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len); +void snmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len); +void snmp_oid_append(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len); +u8_t snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len); +s8_t snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len); + +#if LWIP_IPV4 +u8_t snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip); +void snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid); +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 +u8_t snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip); +void snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid); +#endif /* LWIP_IPV6 */ +#if LWIP_IPV4 || LWIP_IPV6 +u8_t snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid); +u8_t snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid); + +u8_t snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip); +u8_t snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port); +#endif /* LWIP_IPV4 || LWIP_IPV6 */ + +struct netif; +u8_t netif_to_num(const struct netif *netif); + +snmp_err_t snmp_set_test_ok(struct snmp_node_instance* instance, u16_t value_len, void* value); /* generic function which can be used if test is always successful */ + +err_t snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value); +err_t snmp_decode_truthvalue(const s32_t *asn1_value, u8_t *bool_value); +u8_t snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count); +u8_t snmp_encode_truthvalue(s32_t *asn1_value, u32_t bool_value); + +struct snmp_statistics +{ + u32_t inpkts; + u32_t outpkts; + u32_t inbadversions; + u32_t inbadcommunitynames; + u32_t inbadcommunityuses; + u32_t inasnparseerrs; + u32_t intoobigs; + u32_t innosuchnames; + u32_t inbadvalues; + u32_t inreadonlys; + u32_t ingenerrs; + u32_t intotalreqvars; + u32_t intotalsetvars; + u32_t ingetrequests; + u32_t ingetnexts; + u32_t insetrequests; + u32_t ingetresponses; + u32_t intraps; + u32_t outtoobigs; + u32_t outnosuchnames; + u32_t outbadvalues; + u32_t outgenerrs; + u32_t outgetrequests; + u32_t outgetnexts; + u32_t outsetrequests; + u32_t outgetresponses; + u32_t outtraps; +#if LWIP_SNMP_V3 + u32_t unsupportedseclevels; + u32_t notintimewindows; + u32_t unknownusernames; + u32_t unknownengineids; + u32_t wrongdigests; + u32_t decryptionerrors; +#endif +}; + +extern struct snmp_statistics snmp_stats; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* LWIP_HDR_APPS_SNMP_CORE_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_mib2.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_mib2.h new file mode 100644 index 0000000..453e519 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_mib2.h @@ -0,0 +1,78 @@ +/** + * @file + * SNMP MIB2 API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ +#ifndef LWIP_HDR_APPS_SNMP_MIB2_H +#define LWIP_HDR_APPS_SNMP_MIB2_H + +#include "lwip/apps/snmp_opts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ +#if SNMP_LWIP_MIB2 + +#include "lwip/apps/snmp_core.h" + +extern const struct snmp_mib mib2; + +#if SNMP_USE_NETCONN +#include "lwip/apps/snmp_threadsync.h" +void snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void* arg); +extern struct snmp_threadsync_instance snmp_mib2_lwip_locks; +#endif + +#ifndef SNMP_SYSSERVICES +#define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2)) +#endif + +void snmp_mib2_set_sysdescr(const u8_t* str, const u16_t* len); /* read-only be definition */ +void snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize); +void snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen); +void snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize); +void snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen); +void snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize); +void snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen); + +#endif /* SNMP_LWIP_MIB2 */ +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNMP_MIB2_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_opts.h new file mode 100644 index 0000000..c892d22 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_opts.h @@ -0,0 +1,297 @@ +/** + * @file + * SNMP server options list + */ + +/* + * Copyright (c) 2015 Dirk Ziegelmeier + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ +#ifndef LWIP_HDR_SNMP_OPTS_H +#define LWIP_HDR_SNMP_OPTS_H + +#include "lwip/opt.h" + +/** + * @defgroup snmp_opts Options + * @ingroup snmp + * @{ + */ + +/** + * LWIP_SNMP==1: This enables the lwIP SNMP agent. UDP must be available + * for SNMP transport. + * If you want to use your own SNMP agent, leave this disabled. + * To integrate MIB2 of an external agent, you need to enable + * LWIP_MIB2_CALLBACKS and MIB2_STATS. This will give you the callbacks + * and statistics counters you need to get MIB2 working. + */ +#if !defined LWIP_SNMP || defined __DOXYGEN__ +#define LWIP_SNMP 0 +#endif + +/** + * SNMP_USE_NETCONN: Use netconn API instead of raw API. + * Makes SNMP agent run in a worker thread, so blocking operations + * can be done in MIB calls. + */ +#if !defined SNMP_USE_NETCONN || defined __DOXYGEN__ +#define SNMP_USE_NETCONN 0 +#endif + +/** + * SNMP_USE_RAW: Use raw API. + * SNMP agent does not run in a worker thread, so blocking operations + * should not be done in MIB calls. + */ +#if !defined SNMP_USE_RAW || defined __DOXYGEN__ +#define SNMP_USE_RAW 1 +#endif + +#if SNMP_USE_NETCONN && SNMP_USE_RAW +#error SNMP stack can use only one of the APIs {raw, netconn} +#endif + +#if LWIP_SNMP && !SNMP_USE_NETCONN && !SNMP_USE_RAW +#error SNMP stack needs a receive API and UDP {raw, netconn} +#endif + +#if SNMP_USE_NETCONN +/** + * SNMP_STACK_SIZE: Stack size of SNMP netconn worker thread + */ +#if !defined SNMP_STACK_SIZE || defined __DOXYGEN__ +#define SNMP_STACK_SIZE DEFAULT_THREAD_STACKSIZE +#endif + +/** + * SNMP_THREAD_PRIO: SNMP netconn worker thread priority + */ +#if !defined SNMP_THREAD_PRIO || defined __DOXYGEN__ +#define SNMP_THREAD_PRIO DEFAULT_THREAD_PRIO +#endif +#endif /* SNMP_USE_NETCONN */ + +/** + * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap + * destination is required + */ +#if !defined SNMP_TRAP_DESTINATIONS || defined __DOXYGEN__ +#define SNMP_TRAP_DESTINATIONS 1 +#endif + +/** + * Only allow SNMP write actions that are 'safe' (e.g. disabling netifs is not + * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). + * Unsafe requests are disabled by default! + */ +#if !defined SNMP_SAFE_REQUESTS || defined __DOXYGEN__ +#define SNMP_SAFE_REQUESTS 1 +#endif + +/** + * The maximum length of strings used. + */ +#if !defined SNMP_MAX_OCTET_STRING_LEN || defined __DOXYGEN__ +#define SNMP_MAX_OCTET_STRING_LEN 127 +#endif + +/** + * The maximum number of Sub ID's inside an object identifier. + * Indirectly this also limits the maximum depth of SNMP tree. + */ +#if !defined SNMP_MAX_OBJ_ID_LEN || defined __DOXYGEN__ +#define SNMP_MAX_OBJ_ID_LEN 50 +#endif + +#if !defined SNMP_MAX_VALUE_SIZE || defined __DOXYGEN__ +/** + * The minimum size of a value. + */ +#define SNMP_MIN_VALUE_SIZE (2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */ +/** + * The maximum size of a value. + */ +#define SNMP_MAX_VALUE_SIZE LWIP_MAX(LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN), sizeof(u32_t)*(SNMP_MAX_OBJ_ID_LEN)), SNMP_MIN_VALUE_SIZE) +#endif + +/** + * The snmp read-access community. Used for write-access and traps, too + * unless SNMP_COMMUNITY_WRITE or SNMP_COMMUNITY_TRAP are enabled, respectively. + */ +#if !defined SNMP_COMMUNITY || defined __DOXYGEN__ +#define SNMP_COMMUNITY "public" +#endif + +/** + * The snmp write-access community. + * Set this community to "" in order to disallow any write access. + */ +#if !defined SNMP_COMMUNITY_WRITE || defined __DOXYGEN__ +#define SNMP_COMMUNITY_WRITE "private" +#endif + +/** + * The snmp community used for sending traps. + */ +#if !defined SNMP_COMMUNITY_TRAP || defined __DOXYGEN__ +#define SNMP_COMMUNITY_TRAP "public" +#endif + +/** + * The maximum length of community string. + * If community names shall be adjusted at runtime via snmp_set_community() calls, + * enter here the possible maximum length (+1 for terminating null character). + */ +#if !defined SNMP_MAX_COMMUNITY_STR_LEN || defined __DOXYGEN__ +#define SNMP_MAX_COMMUNITY_STR_LEN LWIP_MAX(LWIP_MAX(sizeof(SNMP_COMMUNITY), sizeof(SNMP_COMMUNITY_WRITE)), sizeof(SNMP_COMMUNITY_TRAP)) +#endif + +/** + * The OID identifiying the device. This may be the enterprise OID itself or any OID located below it in tree. + */ +#if !defined SNMP_DEVICE_ENTERPRISE_OID || defined __DOXYGEN__ +#define SNMP_LWIP_ENTERPRISE_OID 26381 +/** + * IANA assigned enterprise ID for lwIP is 26381 + * @see http://www.iana.org/assignments/enterprise-numbers + * + * @note this enterprise ID is assigned to the lwIP project, + * all object identifiers living under this ID are assigned + * by the lwIP maintainers! + * @note don't change this define, use snmp_set_device_enterprise_oid() + * + * If you need to create your own private MIB you'll need + * to apply for your own enterprise ID with IANA: + * http://www.iana.org/numbers.html + */ +#define SNMP_DEVICE_ENTERPRISE_OID {1, 3, 6, 1, 4, 1, SNMP_LWIP_ENTERPRISE_OID} +/** + * Length of SNMP_DEVICE_ENTERPRISE_OID + */ +#define SNMP_DEVICE_ENTERPRISE_OID_LEN 7 +#endif + +/** + * SNMP_DEBUG: Enable debugging for SNMP messages. + */ +#if !defined SNMP_DEBUG || defined __DOXYGEN__ +#define SNMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. + */ +#if !defined SNMP_MIB_DEBUG || defined __DOXYGEN__ +#define SNMP_MIB_DEBUG LWIP_DBG_OFF +#endif + +/** + * Indicates if the MIB2 implementation of LWIP SNMP stack is used. + */ +#if !defined SNMP_LWIP_MIB2 || defined __DOXYGEN__ +#define SNMP_LWIP_MIB2 LWIP_SNMP +#endif + +/** + * Value return for sysDesc field of MIB2. + */ +#if !defined SNMP_LWIP_MIB2_SYSDESC || defined __DOXYGEN__ +#define SNMP_LWIP_MIB2_SYSDESC "lwIP" +#endif + +/** + * Value return for sysName field of MIB2. + * To make sysName field settable, call snmp_mib2_set_sysname() to provide the necessary buffers. + */ +#if !defined SNMP_LWIP_MIB2_SYSNAME || defined __DOXYGEN__ +#define SNMP_LWIP_MIB2_SYSNAME "FQDN-unk" +#endif + +/** + * Value return for sysContact field of MIB2. + * To make sysContact field settable, call snmp_mib2_set_syscontact() to provide the necessary buffers. + */ +#if !defined SNMP_LWIP_MIB2_SYSCONTACT || defined __DOXYGEN__ +#define SNMP_LWIP_MIB2_SYSCONTACT "" +#endif + +/** + * Value return for sysLocation field of MIB2. + * To make sysLocation field settable, call snmp_mib2_set_syslocation() to provide the necessary buffers. + */ +#if !defined SNMP_LWIP_MIB2_SYSLOCATION || defined __DOXYGEN__ +#define SNMP_LWIP_MIB2_SYSLOCATION "" +#endif + +/** + * This value is used to limit the repetitions processed in GetBulk requests (value == 0 means no limitation). + * This may be useful to limit the load for a single request. + * According to SNMP RFC 1905 it is allowed to not return all requested variables from a GetBulk request if system load would be too high. + * so the effect is that the client will do more requests to gather all data. + * For the stack this could be useful in case that SNMP processing is done in TCP/IP thread. In this situation a request with many + * repetitions could block the thread for a longer time. Setting limit here will keep the stack more responsive. + */ +#if !defined SNMP_LWIP_GETBULK_MAX_REPETITIONS || defined __DOXYGEN__ +#define SNMP_LWIP_GETBULK_MAX_REPETITIONS 0 +#endif + +/** + * @} + */ + +/* + ------------------------------------ + ---------- SNMPv3 options ---------- + ------------------------------------ +*/ + +/** + * LWIP_SNMP_V3==1: This enables EXPERIMENTAL SNMPv3 support. LWIP_SNMP must + * also be enabled. + * THIS IS UNDER DEVELOPMENT AND SHOULD NOT BE ENABLED IN PRODUCTS. + */ +#ifndef LWIP_SNMP_V3 +#define LWIP_SNMP_V3 0 +#endif + +#ifndef LWIP_SNMP_V3_MBEDTLS +#define LWIP_SNMP_V3_MBEDTLS LWIP_SNMP_V3 +#endif + +#ifndef LWIP_SNMP_V3_CRYPTO +#define LWIP_SNMP_V3_CRYPTO LWIP_SNMP_V3_MBEDTLS +#endif + +#ifndef LWIP_SNMP_CONFIGURE_VERSIONS +#define LWIP_SNMP_CONFIGURE_VERSIONS 0 +#endif + +#endif /* LWIP_HDR_SNMP_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_scalar.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_scalar.h new file mode 100644 index 0000000..40a060c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_scalar.h @@ -0,0 +1,113 @@ +/** + * @file + * SNMP server MIB API to implement scalar nodes + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Martin Hentschel + * + */ + +#ifndef LWIP_HDR_APPS_SNMP_SCALAR_H +#define LWIP_HDR_APPS_SNMP_SCALAR_H + +#include "lwip/apps/snmp_opts.h" +#include "lwip/apps/snmp_core.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +/** basic scalar node */ +struct snmp_scalar_node +{ + /** inherited "base class" members */ + struct snmp_leaf_node node; + u8_t asn1_type; + snmp_access_t access; + node_instance_get_value_method get_value; + node_instance_set_test_method set_test; + node_instance_set_value_method set_value; +}; + + +snmp_err_t snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); +snmp_err_t snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); + +#define SNMP_SCALAR_CREATE_NODE(oid, access, asn1_type, get_value_method, set_test_method, set_value_method) \ + {{{ SNMP_NODE_SCALAR, (oid) }, \ + snmp_scalar_get_instance, \ + snmp_scalar_get_next_instance }, \ + (asn1_type), (access), (get_value_method), (set_test_method), (set_value_method) } + +#define SNMP_SCALAR_CREATE_NODE_READONLY(oid, asn1_type, get_value_method) SNMP_SCALAR_CREATE_NODE(oid, SNMP_NODE_INSTANCE_READ_ONLY, asn1_type, get_value_method, NULL, NULL) + +/** scalar array node - a tree node which contains scalars only as children */ +struct snmp_scalar_array_node_def +{ + u32_t oid; + u8_t asn1_type; + snmp_access_t access; +}; + +typedef s16_t (*snmp_scalar_array_get_value_method)(const struct snmp_scalar_array_node_def*, void*); +typedef snmp_err_t (*snmp_scalar_array_set_test_method)(const struct snmp_scalar_array_node_def*, u16_t, void*); +typedef snmp_err_t (*snmp_scalar_array_set_value_method)(const struct snmp_scalar_array_node_def*, u16_t, void*); + +/** basic scalar array node */ +struct snmp_scalar_array_node +{ + /** inherited "base class" members */ + struct snmp_leaf_node node; + u16_t array_node_count; + const struct snmp_scalar_array_node_def* array_nodes; + snmp_scalar_array_get_value_method get_value; + snmp_scalar_array_set_test_method set_test; + snmp_scalar_array_set_value_method set_value; +}; + +snmp_err_t snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); +snmp_err_t snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); + +#define SNMP_SCALAR_CREATE_ARRAY_NODE(oid, array_nodes, get_value_method, set_test_method, set_value_method) \ + {{{ SNMP_NODE_SCALAR_ARRAY, (oid) }, \ + snmp_scalar_array_get_instance, \ + snmp_scalar_array_get_next_instance }, \ + (u16_t)LWIP_ARRAYSIZE(array_nodes), (array_nodes), (get_value_method), (set_test_method), (set_value_method) } + +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNMP_SCALAR_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_framework.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_framework.h new file mode 100644 index 0000000..47409cc --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_framework.h @@ -0,0 +1,32 @@ +/* +Generated by LwipMibCompiler +*/ + +#ifndef LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H +#define LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H + +#include "lwip/apps/snmp_opts.h" +#if LWIP_SNMP + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "lwip/apps/snmp_core.h" + +extern const struct snmp_obj_id usmNoAuthProtocol; +extern const struct snmp_obj_id usmHMACMD5AuthProtocol; +extern const struct snmp_obj_id usmHMACSHAAuthProtocol; + +extern const struct snmp_obj_id usmNoPrivProtocol; +extern const struct snmp_obj_id usmDESPrivProtocol; +extern const struct snmp_obj_id usmAESPrivProtocol; + +extern const struct snmp_mib snmpframeworkmib; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LWIP_SNMP */ +#endif /* LWIP_HDR_APPS_SNMP_FRAMEWORK_MIB_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_usm.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_usm.h new file mode 100644 index 0000000..88cfcd8 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_snmpv2_usm.h @@ -0,0 +1,24 @@ +/* +Generated by LwipMibCompiler +*/ + +#ifndef LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H +#define LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H + +#include "lwip/apps/snmp_opts.h" +#if LWIP_SNMP + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "lwip/apps/snmp_core.h" + +extern const struct snmp_mib snmpusmmib; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* LWIP_SNMP */ +#endif /* LWIP_HDR_APPS_SNMP_USER_BASED_SM_MIB_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_table.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_table.h new file mode 100644 index 0000000..4988b51 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_table.h @@ -0,0 +1,134 @@ +/** + * @file + * SNMP server MIB API to implement table nodes + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Martin Hentschel + * + */ + +#ifndef LWIP_HDR_APPS_SNMP_TABLE_H +#define LWIP_HDR_APPS_SNMP_TABLE_H + +#include "lwip/apps/snmp_opts.h" +#include "lwip/apps/snmp_core.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +/** default (customizable) read/write table */ +struct snmp_table_col_def +{ + u32_t index; + u8_t asn1_type; + snmp_access_t access; +}; + +/** table node */ +struct snmp_table_node +{ + /** inherited "base class" members */ + struct snmp_leaf_node node; + u16_t column_count; + const struct snmp_table_col_def* columns; + snmp_err_t (*get_cell_instance)(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance); + snmp_err_t (*get_next_cell_instance)(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance); + /** returns object value for the given object identifier */ + node_instance_get_value_method get_value; + /** tests length and/or range BEFORE setting */ + node_instance_set_test_method set_test; + /** sets object value, only called when set_test() was successful */ + node_instance_set_value_method set_value; +}; + +snmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); +snmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); + +#define SNMP_TABLE_CREATE(oid, columns, get_cell_instance_method, get_next_cell_instance_method, get_value_method, set_test_method, set_value_method) \ + {{{ SNMP_NODE_TABLE, (oid) }, \ + snmp_table_get_instance, \ + snmp_table_get_next_instance }, \ + (u16_t)LWIP_ARRAYSIZE(columns), (columns), \ + (get_cell_instance_method), (get_next_cell_instance_method), \ + (get_value_method), (set_test_method), (set_value_method)} + +#define SNMP_TABLE_GET_COLUMN_FROM_OID(oid) ((oid)[1]) /* first array value is (fixed) row entry (fixed to 1) and 2nd value is column, follow3ed by instance */ + + +/** simple read-only table */ +typedef enum { + SNMP_VARIANT_VALUE_TYPE_U32, + SNMP_VARIANT_VALUE_TYPE_S32, + SNMP_VARIANT_VALUE_TYPE_PTR, + SNMP_VARIANT_VALUE_TYPE_CONST_PTR +} snmp_table_column_data_type_t; + +struct snmp_table_simple_col_def +{ + u32_t index; + u8_t asn1_type; + snmp_table_column_data_type_t data_type; /* depending of what union member is used to store the value*/ +}; + +/** simple read-only table node */ +struct snmp_table_simple_node +{ + /* inherited "base class" members */ + struct snmp_leaf_node node; + u16_t column_count; + const struct snmp_table_simple_col_def* columns; + snmp_err_t (*get_cell_value)(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len); + snmp_err_t (*get_next_cell_instance_and_value)(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len); +}; + +snmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); +snmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); + +#define SNMP_TABLE_CREATE_SIMPLE(oid, columns, get_cell_value_method, get_next_cell_instance_and_value_method) \ + {{{ SNMP_NODE_TABLE, (oid) }, \ + snmp_table_simple_get_instance, \ + snmp_table_simple_get_next_instance }, \ + (u16_t)LWIP_ARRAYSIZE(columns), (columns), (get_cell_value_method), (get_next_cell_instance_and_value_method) } + +s16_t snmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value); +s16_t snmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value); +s16_t snmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value); + +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNMP_TABLE_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_threadsync.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_threadsync.h new file mode 100644 index 0000000..76f1118 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmp_threadsync.h @@ -0,0 +1,114 @@ +/** + * @file + * SNMP server MIB API to implement thread synchronization + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ + +#ifndef LWIP_HDR_APPS_SNMP_THREADSYNC_H +#define LWIP_HDR_APPS_SNMP_THREADSYNC_H + +#include "lwip/apps/snmp_opts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/apps/snmp_core.h" +#include "lwip/sys.h" + +typedef void (*snmp_threadsync_called_fn)(void* arg); +typedef void (*snmp_threadsync_synchronizer_fn)(snmp_threadsync_called_fn fn, void* arg); + + +/** Thread sync runtime data. For internal usage only. */ +struct threadsync_data +{ + union { + snmp_err_t err; + s16_t s16; + } retval; + union { + const u32_t *root_oid; + void *value; + } arg1; + union { + u8_t root_oid_len; + u16_t len; + } arg2; + const struct snmp_threadsync_node *threadsync_node; + struct snmp_node_instance proxy_instance; +}; + +/** Thread sync instance. Needed EXACTLY once for every thread to be synced into. */ +struct snmp_threadsync_instance +{ + sys_sem_t sem; + sys_mutex_t sem_usage_mutex; + snmp_threadsync_synchronizer_fn sync_fn; + struct threadsync_data data; +}; + +/** SNMP thread sync proxy leaf node */ +struct snmp_threadsync_node +{ + /* inherited "base class" members */ + struct snmp_leaf_node node; + + const struct snmp_leaf_node *target; + struct snmp_threadsync_instance *instance; +}; + +snmp_err_t snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); +snmp_err_t snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance); + +/** Create thread sync proxy node */ +#define SNMP_CREATE_THREAD_SYNC_NODE(oid, target_leaf_node, threadsync_instance) \ + {{{ SNMP_NODE_THREADSYNC, (oid) }, \ + snmp_threadsync_get_instance, \ + snmp_threadsync_get_next_instance }, \ + (target_leaf_node), \ + (threadsync_instance) } + +/** Create thread sync instance data */ +void snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn); + +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNMP_THREADSYNC_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmpv3.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmpv3.h new file mode 100644 index 0000000..e0dda64 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/snmpv3.h @@ -0,0 +1,114 @@ +/** + * @file + * Additional SNMPv3 functionality RFC3414 and RFC3826. + */ + +/* + * Copyright (c) 2016 Elias Oenal. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Elias Oenal + */ + +#ifndef LWIP_HDR_APPS_SNMP_V3_H +#define LWIP_HDR_APPS_SNMP_V3_H + +#include "lwip/apps/snmp_opts.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_SNMP && LWIP_SNMP_V3 + +typedef enum +{ + SNMP_V3_AUTH_ALGO_INVAL = 0, + SNMP_V3_AUTH_ALGO_MD5 = 1, + SNMP_V3_AUTH_ALGO_SHA = 2 +} snmpv3_auth_algo_t; + +typedef enum +{ + SNMP_V3_PRIV_ALGO_INVAL = 0, + SNMP_V3_PRIV_ALGO_DES = 1, + SNMP_V3_PRIV_ALGO_AES = 2 +} snmpv3_priv_algo_t; + +typedef enum +{ + SNMP_V3_USER_STORAGETYPE_OTHER = 1, + SNMP_V3_USER_STORAGETYPE_VOLATILE = 2, + SNMP_V3_USER_STORAGETYPE_NONVOLATILE = 3, + SNMP_V3_USER_STORAGETYPE_PERMANENT = 4, + SNMP_V3_USER_STORAGETYPE_READONLY = 5 +} snmpv3_user_storagetype_t; + +/* + * The following callback functions must be implemented by the application. + * There is a dummy implementation in snmpv3_dummy.c. + */ + +void snmpv3_get_engine_id(const char **id, u8_t *len); +err_t snmpv3_set_engine_id(const char* id, u8_t len); + +u32_t snmpv3_get_engine_boots(void); +void snmpv3_set_engine_boots(u32_t boots); + +u32_t snmpv3_get_engine_time(void); +void snmpv3_reset_engine_time(void); + +err_t snmpv3_get_user(const char* username, snmpv3_auth_algo_t *auth_algo, u8_t *auth_key, snmpv3_priv_algo_t *priv_algo, u8_t *priv_key); +u8_t snmpv3_get_amount_of_users(void); +err_t snmpv3_get_user_storagetype(const char *username, snmpv3_user_storagetype_t *storagetype); +err_t snmpv3_get_username(char *username, u8_t index); + +/* The following functions are provided by the SNMPv3 agent */ + +void snmpv3_engine_id_changed(void); +s32_t snmpv3_get_engine_time_internal(void); + +void snmpv3_password_to_key_md5( + const u8_t *password, /* IN */ + size_t passwordlen, /* IN */ + const u8_t *engineID, /* IN - pointer to snmpEngineID */ + u8_t engineLength, /* IN - length of snmpEngineID */ + u8_t *key); /* OUT - pointer to caller 16-octet buffer */ + +void snmpv3_password_to_key_sha( + const u8_t *password, /* IN */ + size_t passwordlen, /* IN */ + const u8_t *engineID, /* IN - pointer to snmpEngineID */ + u8_t engineLength, /* IN - length of snmpEngineID */ + u8_t *key); /* OUT - pointer to caller 20-octet buffer */ + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNMP_V3_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp.h new file mode 100644 index 0000000..c415253 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp.h @@ -0,0 +1,80 @@ +/** + * @file + * SNTP client API + */ + +/* + * Copyright (c) 2007-2009 Frédéric Bernon, Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Frédéric Bernon, Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_APPS_SNTP_H +#define LWIP_HDR_APPS_SNTP_H + +#include "lwip/apps/sntp_opts.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* SNTP operating modes: default is to poll using unicast. + The mode has to be set before calling sntp_init(). */ +#define SNTP_OPMODE_POLL 0 +#define SNTP_OPMODE_LISTENONLY 1 +void sntp_setoperatingmode(u8_t operating_mode); +u8_t sntp_getoperatingmode(void); + +void sntp_init(void); +void sntp_stop(void); +u8_t sntp_enabled(void); + +void sntp_setserver(u8_t idx, const ip_addr_t *addr); +const ip_addr_t* sntp_getserver(u8_t idx); + +#if SNTP_MONITOR_SERVER_REACHABILITY +u8_t sntp_getreachability(u8_t idx); +#endif /* SNTP_MONITOR_SERVER_REACHABILITY */ + +#if SNTP_SERVER_DNS +void sntp_setservername(u8_t idx, const char *server); +const char *sntp_getservername(u8_t idx); +#endif /* SNTP_SERVER_DNS */ + +#if SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 +void sntp_servermode_dhcp(int set_servers_from_dhcp); +#else /* SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 */ +#define sntp_servermode_dhcp(x) +#endif /* SNTP_GET_SERVERS_FROM_DHCP || SNTP_GET_SERVERS_FROM_DHCPV6 */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_SNTP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp_opts.h new file mode 100644 index 0000000..cb62771 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/sntp_opts.h @@ -0,0 +1,215 @@ +/** + * @file + * SNTP client options list + */ + +/* + * Copyright (c) 2007-2009 Frédéric Bernon, Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Frédéric Bernon, Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_APPS_SNTP_OPTS_H +#define LWIP_HDR_APPS_SNTP_OPTS_H + +#include "lwip/opt.h" +#include "lwip/prot/iana.h" + +/** + * @defgroup sntp_opts Options + * @ingroup sntp + * @{ + */ + +/** SNTP macro to change system time in seconds + * Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds + * instead of this one if you need the additional precision. Alternatively, + * define SNTP_SET_SYSTEM_TIME_NTP(sec, frac) in order to work with native + * NTP timestamps instead. + */ +#if !defined SNTP_SET_SYSTEM_TIME || defined __DOXYGEN__ +#define SNTP_SET_SYSTEM_TIME(sec) LWIP_UNUSED_ARG(sec) +#endif + +/** The maximum number of SNTP servers that can be set */ +#if !defined SNTP_MAX_SERVERS || defined __DOXYGEN__ +#define SNTP_MAX_SERVERS LWIP_DHCP_MAX_NTP_SERVERS +#endif + +/** Set this to 1 to implement the callback function called by dhcp when + * NTP servers are received. */ +#if !defined SNTP_GET_SERVERS_FROM_DHCP || defined __DOXYGEN__ +#define SNTP_GET_SERVERS_FROM_DHCP LWIP_DHCP_GET_NTP_SRV +#endif + +/** Set this to 1 to implement the callback function called by dhcpv6 when + * NTP servers are received. */ +#if !defined SNTP_GET_SERVERS_FROM_DHCPV6 || defined __DOXYGEN__ +#define SNTP_GET_SERVERS_FROM_DHCPV6 LWIP_DHCP6_GET_NTP_SRV +#endif + +/** Set this to 1 to support DNS names (or IP address strings) to set sntp servers + * One server address/name can be defined as default if SNTP_SERVER_DNS == 1: + * \#define SNTP_SERVER_ADDRESS "pool.ntp.org" + */ +#if !defined SNTP_SERVER_DNS || defined __DOXYGEN__ +#define SNTP_SERVER_DNS 0 +#endif + +/** + * SNTP_DEBUG: Enable debugging for SNTP. + */ +#if !defined SNTP_DEBUG || defined __DOXYGEN__ +#define SNTP_DEBUG LWIP_DBG_OFF +#endif + +/** SNTP server port */ +#if !defined SNTP_PORT || defined __DOXYGEN__ +#define SNTP_PORT LWIP_IANA_PORT_SNTP +#endif + +/** Sanity check: + * Define this to + * - 0 to turn off sanity checks (default; smaller code) + * - >= 1 to check address and port of the response packet to ensure the + * response comes from the server we sent the request to. + * - >= 2 to check returned Originate Timestamp against Transmit Timestamp + * sent to the server (to ensure response to older request). + * - >= 3 @todo: discard reply if any of the VN, Stratum, or Transmit Timestamp + * fields is 0 or the Mode field is not 4 (unicast) or 5 (broadcast). + * - >= 4 @todo: to check that the Root Delay and Root Dispersion fields are each + * greater than or equal to 0 and less than infinity, where infinity is + * currently a cozy number like one second. This check avoids using a + * server whose synchronization source has expired for a very long time. + */ +#if !defined SNTP_CHECK_RESPONSE || defined __DOXYGEN__ +#define SNTP_CHECK_RESPONSE 0 +#endif + +/** Enable round-trip delay compensation. + * Compensate for the round-trip delay by calculating the clock offset from + * the originate, receive, transmit and destination timestamps, as per RFC. + * + * The calculation requires compiler support for 64-bit integers. Also, either + * SNTP_SET_SYSTEM_TIME_US or SNTP_SET_SYSTEM_TIME_NTP has to be implemented + * for setting the system clock with sub-second precision. Likewise, either + * SNTP_GET_SYSTEM_TIME or SNTP_GET_SYSTEM_TIME_NTP needs to be implemented + * with sub-second precision. + * + * Although not strictly required, it makes sense to combine this option with + * SNTP_CHECK_RESPONSE >= 2 for sanity-checking of the received timestamps. + * Also, in order for the round-trip calculation to work, the difference + * between the local clock and the NTP server clock must not be larger than + * about 34 years. If that limit is exceeded, the implementation will fall back + * to setting the clock without compensation. In order to ensure that the local + * clock is always within the permitted range for compensation, even at first + * try, it may be necessary to store at least the current year in non-volatile + * memory. + */ +#if !defined SNTP_COMP_ROUNDTRIP || defined __DOXYGEN__ +#define SNTP_COMP_ROUNDTRIP 0 +#endif + +/** According to the RFC, this shall be a random delay + * between 1 and 5 minutes (in milliseconds) to prevent load peaks. + * This can be defined to a random generation function, + * which must return the delay in milliseconds as u32_t. + * Turned off by default. + */ +#if !defined SNTP_STARTUP_DELAY || defined __DOXYGEN__ +#ifdef LWIP_RAND +#define SNTP_STARTUP_DELAY 1 +#else +#define SNTP_STARTUP_DELAY 0 +#endif +#endif + +/** If you want the startup delay to be a function, define this + * to a function (including the brackets) and define SNTP_STARTUP_DELAY to 1. + */ +#if !defined SNTP_STARTUP_DELAY_FUNC || defined __DOXYGEN__ +#define SNTP_STARTUP_DELAY_FUNC (LWIP_RAND() % 5000) +#endif + +/** SNTP receive timeout - in milliseconds + * Also used as retry timeout - this shouldn't be too low. + * Default is 15 seconds. Must not be beolw 15 seconds by specification (i.e. 15000) + */ +#if !defined SNTP_RECV_TIMEOUT || defined __DOXYGEN__ +#define SNTP_RECV_TIMEOUT 15000 +#endif + +/** SNTP update delay - in milliseconds + * Default is 1 hour. Must not be beolw 60 seconds by specification (i.e. 60000) + */ +#if !defined SNTP_UPDATE_DELAY || defined __DOXYGEN__ +#define SNTP_UPDATE_DELAY 3600000 +#endif + +/** SNTP macro to get system time, used with SNTP_CHECK_RESPONSE >= 2 + * to send in request and compare in response. Also used for round-trip + * delay compensation if SNTP_COMP_ROUNDTRIP != 0. + * Alternatively, define SNTP_GET_SYSTEM_TIME_NTP(sec, frac) in order to + * work with native NTP timestamps instead. + */ +#if !defined SNTP_GET_SYSTEM_TIME || defined __DOXYGEN__ +#define SNTP_GET_SYSTEM_TIME(sec, us) do { (sec) = 0; (us) = 0; } while(0) +#endif + +/** Default retry timeout (in milliseconds) if the response + * received is invalid. + * This is doubled with each retry until SNTP_RETRY_TIMEOUT_MAX is reached. + */ +#if !defined SNTP_RETRY_TIMEOUT || defined __DOXYGEN__ +#define SNTP_RETRY_TIMEOUT SNTP_RECV_TIMEOUT +#endif + +/** Maximum retry timeout (in milliseconds). */ +#if !defined SNTP_RETRY_TIMEOUT_MAX || defined __DOXYGEN__ +#define SNTP_RETRY_TIMEOUT_MAX (SNTP_RETRY_TIMEOUT * 10) +#endif + +/** Increase retry timeout with every retry sent + * Default is on to conform to RFC. + */ +#if !defined SNTP_RETRY_TIMEOUT_EXP || defined __DOXYGEN__ +#define SNTP_RETRY_TIMEOUT_EXP 1 +#endif + +/** Keep a reachability shift register per server + * Default is on to conform to RFC. + */ +#if !defined SNTP_MONITOR_SERVER_REACHABILITY || defined __DOXYGEN__ +#define SNTP_MONITOR_SERVER_REACHABILITY 1 +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_APPS_SNTP_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_opts.h new file mode 100644 index 0000000..ec0b631 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_opts.h @@ -0,0 +1,106 @@ +/** + * + * @file tftp_opts.h + * + * @author Logan Gunthorpe + * + * @brief Trivial File Transfer Protocol (RFC 1350) implementation options + * + * Copyright (c) Deltatee Enterprises Ltd. 2013 + * All rights reserved. + * + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Logan Gunthorpe + * + */ + +#ifndef LWIP_HDR_APPS_TFTP_OPTS_H +#define LWIP_HDR_APPS_TFTP_OPTS_H + +#include "lwip/opt.h" +#include "lwip/prot/iana.h" + +/** + * @defgroup tftp_opts Options + * @ingroup tftp + * @{ + */ + +/** + * Enable TFTP debug messages + */ +#if !defined TFTP_DEBUG || defined __DOXYGEN__ +#define TFTP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TFTP server port + */ +#if !defined TFTP_PORT || defined __DOXYGEN__ +#define TFTP_PORT LWIP_IANA_PORT_TFTP +#endif + +/** + * TFTP timeout + */ +#if !defined TFTP_TIMEOUT_MSECS || defined __DOXYGEN__ +#define TFTP_TIMEOUT_MSECS 10000 +#endif + +/** + * Max. number of retries when a file is read from server + */ +#if !defined TFTP_MAX_RETRIES || defined __DOXYGEN__ +#define TFTP_MAX_RETRIES 5 +#endif + +/** + * TFTP timer cyclic interval + */ +#if !defined TFTP_TIMER_MSECS || defined __DOXYGEN__ +#define TFTP_TIMER_MSECS (TFTP_TIMEOUT_MSECS / 10) +#endif + +/** + * Max. length of TFTP filename + */ +#if !defined TFTP_MAX_FILENAME_LEN || defined __DOXYGEN__ +#define TFTP_MAX_FILENAME_LEN 20 +#endif + +/** + * Max. length of TFTP mode + */ +#if !defined TFTP_MAX_MODE_LEN || defined __DOXYGEN__ +#define TFTP_MAX_MODE_LEN 7 +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_APPS_TFTP_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_server.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_server.h new file mode 100644 index 0000000..efd50a0 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/apps/tftp_server.h @@ -0,0 +1,95 @@ +/** + * + * @file tftp_server.h + * + * @author Logan Gunthorpe + * + * @brief Trivial File Transfer Protocol (RFC 1350) + * + * Copyright (c) Deltatee Enterprises Ltd. 2013 + * All rights reserved. + * + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Logan Gunthorpe + * + */ + +#ifndef LWIP_HDR_APPS_TFTP_SERVER_H +#define LWIP_HDR_APPS_TFTP_SERVER_H + +#include "lwip/apps/tftp_opts.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @ingroup tftp + * TFTP context containing callback functions for TFTP transfers + */ +struct tftp_context { + /** + * Open file for read/write. + * @param fname Filename + * @param mode Mode string from TFTP RFC 1350 (netascii, octet, mail) + * @param write Flag indicating read (0) or write (!= 0) access + * @returns File handle supplied to other functions + */ + void* (*open)(const char* fname, const char* mode, u8_t write); + /** + * Close file handle + * @param handle File handle returned by open() + */ + void (*close)(void* handle); + /** + * Read from file + * @param handle File handle returned by open() + * @param buf Target buffer to copy read data to + * @param bytes Number of bytes to copy to buf + * @returns >= 0: Success; < 0: Error + */ + int (*read)(void* handle, void* buf, int bytes); + /** + * Write to file + * @param handle File handle returned by open() + * @param pbuf PBUF adjusted such that payload pointer points + * to the beginning of write data. In other words, + * TFTP headers are stripped off. + * @returns >= 0: Success; < 0: Error + */ + int (*write)(void* handle, struct pbuf* p); +}; + +err_t tftp_init(const struct tftp_context* ctx); +void tftp_cleanup(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_APPS_TFTP_SERVER_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/arch.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/arch.h new file mode 100644 index 0000000..7b5cea1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/arch.h @@ -0,0 +1,393 @@ +/** + * @file + * Support for different processor and compiler architectures + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_ARCH_H +#define LWIP_HDR_ARCH_H + +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif + +#include "arch/cc.h" + +/** + * @defgroup compiler_abstraction Compiler/platform abstraction + * @ingroup sys_layer + * All defines related to this section must not be placed in lwipopts.h, + * but in arch/cc.h! + * If the compiler does not provide memset() this file must include a + * definition of it, or include a file which defines it. + * These options cannot be \#defined in lwipopts.h since they are not options + * of lwIP itself, but options of the lwIP port to your system. + * @{ + */ + +/** Define the byte order of the system. + * Needed for conversion of network data to host byte order. + * Allowed values: LITTLE_ENDIAN and BIG_ENDIAN + */ +#ifndef BYTE_ORDER +#define BYTE_ORDER LITTLE_ENDIAN +#endif + +/** Define random number generator function of your system */ +#ifdef __DOXYGEN__ +#define LWIP_RAND() ((u32_t)rand()) +#endif + +/** Platform specific diagnostic output.\n + * Note the default implementation pulls in printf, which may + * in turn pull in a lot of standard library code. In resource-constrained + * systems, this should be defined to something less resource-consuming. + */ +#ifndef LWIP_PLATFORM_DIAG +#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0) +#include +#include +#endif + +/** Platform specific assertion handling.\n + * Note the default implementation pulls in printf, fflush and abort, which may + * in turn pull in a lot of standard library code. In resource-constrained + * systems, this should be defined to something less resource-consuming. + */ +#ifndef LWIP_PLATFORM_ASSERT +#define LWIP_PLATFORM_ASSERT(x) do {printf("Assertion \"%s\" failed at line %d in %s\n", \ + x, __LINE__, __FILE__); fflush(NULL); abort();} while(0) +#include +#include +#endif + +/** Define this to 1 in arch/cc.h of your port if you do not want to + * include stddef.h header to get size_t. You need to typedef size_t + * by yourself in this case. + */ +#ifndef LWIP_NO_STDDEF_H +#define LWIP_NO_STDDEF_H 0 +#endif + +#if !LWIP_NO_STDDEF_H +#include /* for size_t */ +#endif + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the stdint.h header. You need to typedef the generic types listed in + * lwip/arch.h yourself in this case (u8_t, u16_t...). + */ +#ifndef LWIP_NO_STDINT_H +#define LWIP_NO_STDINT_H 0 +#endif + +/* Define generic types used in lwIP */ +#if !LWIP_NO_STDINT_H +#include +/* stdint.h is C99 which should also provide support for 64-bit integers */ +#if !defined(LWIP_HAVE_INT64) && defined(UINT64_MAX) +#define LWIP_HAVE_INT64 1 +#endif +typedef uint8_t u8_t; +typedef int8_t s8_t; +typedef uint16_t u16_t; +typedef int16_t s16_t; +typedef uint32_t u32_t; +typedef int32_t s32_t; +#if LWIP_HAVE_INT64 +typedef uint64_t u64_t; +typedef int64_t s64_t; +#endif +typedef uintptr_t mem_ptr_t; +#endif + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the inttypes.h header. You need to define the format strings listed in + * lwip/arch.h yourself in this case (X8_F, U16_F...). + */ +#ifndef LWIP_NO_INTTYPES_H +#define LWIP_NO_INTTYPES_H 0 +#endif + +/* Define (sn)printf formatters for these lwIP types */ +#if !LWIP_NO_INTTYPES_H +#include +#ifndef X8_F +#define X8_F "02" PRIx8 +#endif +#ifndef U16_F +#define U16_F PRIu16 +#endif +#ifndef S16_F +#define S16_F PRId16 +#endif +#ifndef X16_F +#define X16_F PRIx16 +#endif +#ifndef U32_F +#define U32_F PRIu32 +#endif +#ifndef S32_F +#define S32_F PRId32 +#endif +#ifndef X32_F +#define X32_F PRIx32 +#endif +#ifndef SZT_F +#define SZT_F PRIuPTR +#endif +#endif + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the limits.h header. You need to define the type limits yourself in this case + * (e.g. INT_MAX, SSIZE_MAX). + */ +#ifndef LWIP_NO_LIMITS_H +#define LWIP_NO_LIMITS_H 0 +#endif + +/* Include limits.h? */ +#if !LWIP_NO_LIMITS_H +#include +#endif + +/* Do we need to define ssize_t? This is a compatibility hack: + * Unfortunately, this type seems to be unavailable on some systems (even if + * sys/types or unistd.h are available). + * Being like that, we define it to 'int' if SSIZE_MAX is not defined. + */ +#ifdef SSIZE_MAX +/* If SSIZE_MAX is defined, unistd.h should provide the type as well */ +#ifndef LWIP_NO_UNISTD_H +#define LWIP_NO_UNISTD_H 0 +#endif +#if !LWIP_NO_UNISTD_H +#include +#endif +#else /* SSIZE_MAX */ +//typedef int ssize_t; +#define SSIZE_MAX LONG_MAX +#endif /* SSIZE_MAX */ + +/* some maximum values needed in lwip code */ +#define LWIP_UINT32_MAX 0xffffffff + +/** Define this to 1 in arch/cc.h of your port if your compiler does not provide + * the ctype.h header. If ctype.h is available, a few character functions + * are mapped to the appropriate functions (lwip_islower, lwip_isdigit...), if + * not, a private implementation is provided. + */ +#ifndef LWIP_NO_CTYPE_H +#define LWIP_NO_CTYPE_H 0 +#endif + +#if LWIP_NO_CTYPE_H +#define lwip_in_range(c, lo, up) ((u8_t)(c) >= (lo) && (u8_t)(c) <= (up)) +#define lwip_isdigit(c) lwip_in_range((c), '0', '9') +#define lwip_isxdigit(c) (lwip_isdigit(c) || lwip_in_range((c), 'a', 'f') || lwip_in_range((c), 'A', 'F')) +#define lwip_islower(c) lwip_in_range((c), 'a', 'z') +#define lwip_isspace(c) ((c) == ' ' || (c) == '\f' || (c) == '\n' || (c) == '\r' || (c) == '\t' || (c) == '\v') +#define lwip_isupper(c) lwip_in_range((c), 'A', 'Z') +#define lwip_tolower(c) (lwip_isupper(c) ? (c) - 'A' + 'a' : c) +#define lwip_toupper(c) (lwip_islower(c) ? (c) - 'a' + 'A' : c) +#else +#include +#define lwip_isdigit(c) isdigit((unsigned char)(c)) +#define lwip_isxdigit(c) isxdigit((unsigned char)(c)) +#define lwip_islower(c) islower((unsigned char)(c)) +#define lwip_isspace(c) isspace((unsigned char)(c)) +#define lwip_isupper(c) isupper((unsigned char)(c)) +#define lwip_tolower(c) tolower((unsigned char)(c)) +#define lwip_toupper(c) toupper((unsigned char)(c)) +#endif + +/** C++ const_cast(val) equivalent to remove constness from a value (GCC -Wcast-qual) */ +#ifndef LWIP_CONST_CAST +#define LWIP_CONST_CAST(target_type, val) ((target_type)((ptrdiff_t)val)) +#endif + +/** Get rid of alignment cast warnings (GCC -Wcast-align) */ +#ifndef LWIP_ALIGNMENT_CAST +#define LWIP_ALIGNMENT_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) +#endif + +/** Get rid of warnings related to pointer-to-numeric and vice-versa casts, + * e.g. "conversion from 'u8_t' to 'void *' of greater size" + */ +#ifndef LWIP_PTR_NUMERIC_CAST +#define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) +#endif + +/** Avoid warnings/errors related to implicitly casting away packed attributes by doing a explicit cast */ +#ifndef LWIP_PACKED_CAST +#define LWIP_PACKED_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) +#endif + +/** Allocates a memory buffer of specified size that is of sufficient size to align + * its start address using LWIP_MEM_ALIGN. + * You can declare your own version here e.g. to enforce alignment without adding + * trailing padding bytes (see LWIP_MEM_ALIGN_BUFFER) or your own section placement + * requirements.\n + * e.g. if you use gcc and need 32 bit alignment:\n + * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[size] \_\_attribute\_\_((aligned(4)))\n + * or more portable:\n + * \#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)] + */ +#ifndef LWIP_DECLARE_MEMORY_ALIGNED +#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)] +#endif + +/** Calculate memory size for an aligned buffer - returns the next highest + * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and + * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4). + */ +#ifndef LWIP_MEM_ALIGN_SIZE +#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1U) & ~(MEM_ALIGNMENT-1U)) +#endif + +/** Calculate safe memory size for an aligned buffer when using an unaligned + * type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the + * start (e.g. if buffer is u8_t[] and actual data will be u32_t*) + */ +#ifndef LWIP_MEM_ALIGN_BUFFER +#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1U)) +#endif + +/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT + * so that ADDR % MEM_ALIGNMENT == 0 + */ +#ifndef LWIP_MEM_ALIGN +#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** Packed structs support. + * Placed BEFORE declaration of a packed struct.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_BEGIN +#define PACK_STRUCT_BEGIN +#endif /* PACK_STRUCT_BEGIN */ + +/** Packed structs support. + * Placed AFTER declaration of a packed struct.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_END +#define PACK_STRUCT_END +#endif /* PACK_STRUCT_END */ + +/** Packed structs support. + * Placed between end of declaration of a packed struct and trailing semicolon.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_STRUCT +#if defined(__GNUC__) || defined(__clang__) +#define PACK_STRUCT_STRUCT __attribute__((packed)) +#else +#define PACK_STRUCT_STRUCT +#endif +#endif /* PACK_STRUCT_STRUCT */ + +/** Packed structs support. + * Wraps u32_t and u16_t members.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_FIELD +#define PACK_STRUCT_FIELD(x) x +#endif /* PACK_STRUCT_FIELD */ + +/** Packed structs support. + * Wraps u8_t members, where some compilers warn that packing is not necessary.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_FLD_8 +#define PACK_STRUCT_FLD_8(x) PACK_STRUCT_FIELD(x) +#endif /* PACK_STRUCT_FLD_8 */ + +/** Packed structs support. + * Wraps members that are packed structs themselves, where some compilers warn that packing is not necessary.\n + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifndef PACK_STRUCT_FLD_S +#define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x) +#endif /* PACK_STRUCT_FLD_S */ + +/** PACK_STRUCT_USE_INCLUDES==1: Packed structs support using \#include files before and after struct to be packed.\n + * The file included BEFORE the struct is "arch/bpstruct.h".\n + * The file included AFTER the struct is "arch/epstruct.h".\n + * This can be used to implement struct packing on MS Visual C compilers, see + * the Win32 port in the lwIP contrib repository for reference. + * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\n + * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here. + */ +#ifdef __DOXYGEN__ +#define PACK_STRUCT_USE_INCLUDES +#endif + +/** Eliminates compiler warning about unused arguments (GCC -Wextra -Wunused). */ +#ifndef LWIP_UNUSED_ARG +#define LWIP_UNUSED_ARG(x) (void)x +#endif /* LWIP_UNUSED_ARG */ + +/** LWIP_PROVIDE_ERRNO==1: Let lwIP provide ERRNO values and the 'errno' variable. + * If this is disabled, cc.h must either define 'errno', include , + * define LWIP_ERRNO_STDINCLUDE to get included or + * define LWIP_ERRNO_INCLUDE to or equivalent. + */ +#if defined __DOXYGEN__ +#define LWIP_PROVIDE_ERRNO +#endif + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_ARCH_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/autoip.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/autoip.h new file mode 100644 index 0000000..1d85bcc --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/autoip.h @@ -0,0 +1,99 @@ +/** + * @file + * + * AutoIP Automatic LinkLocal IP Configuration + */ + +/* + * + * Copyright (c) 2007 Dominik Spies + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Dominik Spies + * + * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform + * with RFC 3927. + * + */ + +#ifndef LWIP_HDR_AUTOIP_H +#define LWIP_HDR_AUTOIP_H + +#include "lwip/opt.h" + +#if LWIP_IPV4 && LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" +/* #include "lwip/udp.h" */ +#include "lwip/etharp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** AutoIP Timing */ +#define AUTOIP_TMR_INTERVAL 100 +#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL) + +/** AutoIP state information per netif */ +struct autoip +{ + /** the currently selected, probed, announced or used LL IP-Address */ + ip4_addr_t llipaddr; + /** current AutoIP state machine state */ + u8_t state; + /** sent number of probes or announces, dependent on state */ + u8_t sent_num; + /** ticks to wait, tick is AUTOIP_TMR_INTERVAL long */ + u16_t ttw; + /** ticks until a conflict can be solved by defending */ + u8_t lastconflict; + /** total number of probed/used Link Local IP-Addresses */ + u8_t tried_llipaddr; +}; + + +void autoip_set_struct(struct netif *netif, struct autoip *autoip); +/** Remove a struct autoip previously set to the netif using autoip_set_struct() */ +#define autoip_remove_struct(netif) do { (netif)->autoip = NULL; } while (0) +err_t autoip_start(struct netif *netif); +err_t autoip_stop(struct netif *netif); +void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr); +void autoip_tmr(void); +void autoip_network_changed(struct netif *netif); +u8_t autoip_supplied_address(const struct netif *netif); + +/* for lwIP internal use by ip4.c */ +u8_t autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr); + +#define netif_autoip_data(netif) ((struct autoip*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV4 && LWIP_AUTOIP */ + +#endif /* LWIP_HDR_AUTOIP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/debug.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/debug.h new file mode 100644 index 0000000..579fd24 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/debug.h @@ -0,0 +1,159 @@ +/** + * @file + * Debug messages infrastructure + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_DEBUG_H +#define LWIP_HDR_DEBUG_H + +#include "lwip/arch.h" +#include "lwip/opt.h" + +/** + * @defgroup debugging_levels LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values + * @ingroup lwip_opts_debugmsg + * @{ + */ + +/** @name Debug level (LWIP_DBG_MIN_LEVEL) + * @{ + */ +/** Debug level: ALL messages*/ +#define LWIP_DBG_LEVEL_ALL 0x00 +/** Debug level: Warnings. bad checksums, dropped packets, ... */ +#define LWIP_DBG_LEVEL_WARNING 0x01 +/** Debug level: Serious. memory allocation failures, ... */ +#define LWIP_DBG_LEVEL_SERIOUS 0x02 +/** Debug level: Severe */ +#define LWIP_DBG_LEVEL_SEVERE 0x03 +/** + * @} + */ + +#define LWIP_DBG_MASK_LEVEL 0x03 +/* compatibility define only */ +#define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL + +/** @name Enable/disable debug messages completely (LWIP_DBG_TYPES_ON) + * @{ + */ +/** flag for LWIP_DEBUGF to enable that debug message */ +#define LWIP_DBG_ON 0x80U +/** flag for LWIP_DEBUGF to disable that debug message */ +#define LWIP_DBG_OFF 0x00U +/** + * @} + */ + +/** @name Debug message types (LWIP_DBG_TYPES_ON) + * @{ + */ +/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */ +#define LWIP_DBG_TRACE 0x40U +/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */ +#define LWIP_DBG_STATE 0x20U +/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */ +#define LWIP_DBG_FRESH 0x10U +/** flag for LWIP_DEBUGF to halt after printing this debug message */ +#define LWIP_DBG_HALT 0x08U +/** + * @} + */ + +/** + * @} + */ + +/** + * @defgroup lwip_assertions Assertion handling + * @ingroup lwip_opts_debug + * @{ + */ +/** + * LWIP_NOASSERT: Disable LWIP_ASSERT checks: + * To disable assertions define LWIP_NOASSERT in arch/cc.h. + */ +#ifdef __DOXYGEN__ +#define LWIP_NOASSERT +#undef LWIP_NOASSERT +#endif +/** + * @} + */ + +#ifndef LWIP_NOASSERT +#define LWIP_ASSERT(message, assertion) do { if (!(assertion)) { \ + LWIP_PLATFORM_ASSERT(message); }} while(0) +#else /* LWIP_NOASSERT */ +#define LWIP_ASSERT(message, assertion) +#endif /* LWIP_NOASSERT */ + +#ifndef LWIP_ERROR +#ifdef LWIP_DEBUG +#define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_DIAG((message)) +#else +#define LWIP_PLATFORM_ERROR(message) +#endif + +/* if "expression" isn't true, then print "message" and execute "handler" expression */ +#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \ + LWIP_PLATFORM_ERROR(message); handler;}} while(0) +#endif /* LWIP_ERROR */ + +/** Enable debug message printing, but only if debug message type is enabled + * AND is of correct type AND is at least LWIP_DBG_LEVEL. + */ +#ifdef __DOXYGEN__ +#define LWIP_DEBUG +#undef LWIP_DEBUG +#endif + +#ifdef LWIP_DEBUG +#define LWIP_DEBUGF(debug, message) do { \ + if ( \ + ((debug) & LWIP_DBG_ON) && \ + ((debug) & LWIP_DBG_TYPES_ON) && \ + ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ + LWIP_PLATFORM_DIAG(message); \ + if ((debug) & LWIP_DBG_HALT) { \ + while(1); \ + } \ + } \ + } while(0) + +#else /* LWIP_DEBUG */ +#define LWIP_DEBUGF(debug, message) +#endif /* LWIP_DEBUG */ + +#endif /* LWIP_HDR_DEBUG_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/def.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/def.h new file mode 100644 index 0000000..dfb266d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/def.h @@ -0,0 +1,152 @@ +/** + * @file + * various utility macros + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/** + * @defgroup perf Performance measurement + * @ingroup sys_layer + * All defines related to this section must not be placed in lwipopts.h, + * but in arch/perf.h! + * Measurement calls made throughout lwip, these can be defined to nothing. + * - PERF_START: start measuring something. + * - PERF_STOP(x): stop measuring something, and record the result. + */ + +#ifndef LWIP_HDR_DEF_H +#define LWIP_HDR_DEF_H + +/* arch.h might define NULL already */ +#include "lwip/arch.h" +#include "lwip/opt.h" +#if LWIP_PERF +#include "arch/perf.h" +#else /* LWIP_PERF */ +#define PERF_START /* null definition */ +#define PERF_STOP(x) /* null definition */ +#endif /* LWIP_PERF */ + +#ifdef __cplusplus +extern "C" { +#endif + +#define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y)) +#define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y)) + +/* Get the number of entries in an array ('x' must NOT be a pointer!) */ +#define LWIP_ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0])) + +/** Create u32_t value from bytes */ +#define LWIP_MAKEU32(a,b,c,d) (((u32_t)((a) & 0xff) << 24) | \ + ((u32_t)((b) & 0xff) << 16) | \ + ((u32_t)((c) & 0xff) << 8) | \ + (u32_t)((d) & 0xff)) + +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif + +#if BYTE_ORDER == BIG_ENDIAN +#define lwip_htons(x) ((u16_t)(x)) +#define lwip_ntohs(x) ((u16_t)(x)) +#define lwip_htonl(x) ((u32_t)(x)) +#define lwip_ntohl(x) ((u32_t)(x)) +#define PP_HTONS(x) ((u16_t)(x)) +#define PP_NTOHS(x) ((u16_t)(x)) +#define PP_HTONL(x) ((u32_t)(x)) +#define PP_NTOHL(x) ((u32_t)(x)) +#else /* BYTE_ORDER != BIG_ENDIAN */ +#ifndef lwip_htons +u16_t lwip_htons(u16_t x); +#endif +#define lwip_ntohs(x) lwip_htons(x) + +#ifndef lwip_htonl +u32_t lwip_htonl(u32_t x); +#endif +#define lwip_ntohl(x) lwip_htonl(x) + +/* These macros should be calculated by the preprocessor and are used + with compile-time constants only (so that there is no little-endian + overhead at runtime). */ +#define PP_HTONS(x) ((u16_t)((((x) & (u16_t)0x00ffU) << 8) | (((x) & (u16_t)0xff00U) >> 8))) +#define PP_NTOHS(x) PP_HTONS(x) +#define PP_HTONL(x) ((((x) & (u32_t)0x000000ffUL) << 24) | \ + (((x) & (u32_t)0x0000ff00UL) << 8) | \ + (((x) & (u32_t)0x00ff0000UL) >> 8) | \ + (((x) & (u32_t)0xff000000UL) >> 24)) +#define PP_NTOHL(x) PP_HTONL(x) +#endif /* BYTE_ORDER == BIG_ENDIAN */ + +/* Provide usual function names as macros for users, but this can be turned off */ +#ifndef LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS +#define htons(x) lwip_htons(x) +#define ntohs(x) lwip_ntohs(x) +#define htonl(x) lwip_htonl(x) +#define ntohl(x) lwip_ntohl(x) +#endif + +/* Functions that are not available as standard implementations. + * In cc.h, you can #define these to implementations available on + * your platform to save some code bytes if you use these functions + * in your application, too. + */ + +#ifndef lwip_itoa +/* This can be #defined to itoa() or snprintf(result, bufsize, "%d", number) depending on your platform */ +void lwip_itoa(char* result, size_t bufsize, int number); +#endif +#ifndef lwip_strnicmp +/* This can be #defined to strnicmp() or strncasecmp() depending on your platform */ +int lwip_strnicmp(const char* str1, const char* str2, size_t len); +#endif +#ifndef lwip_stricmp +/* This can be #defined to stricmp() or strcasecmp() depending on your platform */ +int lwip_stricmp(const char* str1, const char* str2); +#endif +#ifndef lwip_strnstr +/* This can be #defined to strnstr() depending on your platform */ +char* lwip_strnstr(const char* buffer, const char* token, size_t n); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_DEF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp.h new file mode 100644 index 0000000..c78aa0b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp.h @@ -0,0 +1,139 @@ +/** + * @file + * DHCP client API + */ + +/* + * Copyright (c) 2001-2004 Leon Woestenberg + * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Leon Woestenberg + * + */ +#ifndef LWIP_HDR_DHCP_H +#define LWIP_HDR_DHCP_H + +#include "lwip/opt.h" + +#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" +#include "lwip/udp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** period (in seconds) of the application calling dhcp_coarse_tmr() */ +#define DHCP_COARSE_TIMER_SECS 60 +/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */ +#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL) +/** period (in milliseconds) of the application calling dhcp_fine_tmr() */ +#define DHCP_FINE_TIMER_MSECS 500 + +#define DHCP_BOOT_FILE_LEN 128U + +/* AutoIP cooperation flags (struct dhcp.autoip_coop_state) */ +typedef enum { + DHCP_AUTOIP_COOP_STATE_OFF = 0, + DHCP_AUTOIP_COOP_STATE_ON = 1 +} dhcp_autoip_coop_state_enum_t; + +struct dhcp +{ + /** transaction identifier of last sent request */ + u32_t xid; + /** track PCB allocation state */ + u8_t pcb_allocated; + /** current DHCP state machine state */ + u8_t state; + /** retries of current request */ + u8_t tries; +#if LWIP_DHCP_AUTOIP_COOP + u8_t autoip_coop_state; +#endif + u8_t subnet_mask_given; + + u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ + u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ + u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ + u16_t t1_renew_time; /* #ticks with period DHCP_COARSE_TIMER_SECS until next renew try */ + u16_t t2_rebind_time; /* #ticks with period DHCP_COARSE_TIMER_SECS until next rebind try */ + u16_t lease_used; /* #ticks with period DHCP_COARSE_TIMER_SECS since last received DHCP ack */ + u16_t t0_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for lease time */ + ip_addr_t server_ip_addr; /* dhcp server address that offered this lease (ip_addr_t because passed to UDP) */ + ip4_addr_t offered_ip_addr; + ip4_addr_t offered_sn_mask; + ip4_addr_t offered_gw_addr; + + u32_t offered_t0_lease; /* lease period (in seconds) */ + u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */ + u32_t offered_t2_rebind; /* recommended rebind time (usually 87.5 of lease period) */ +#if LWIP_DHCP_BOOTP_FILE + ip4_addr_t offered_si_addr; + char boot_file_name[DHCP_BOOT_FILE_LEN]; +#endif /* LWIP_DHCP_BOOTPFILE */ +}; + + +void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp); +/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */ +#define dhcp_remove_struct(netif) netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL) +void dhcp_cleanup(struct netif *netif); +err_t dhcp_start(struct netif *netif); +err_t dhcp_renew(struct netif *netif); +err_t dhcp_release(struct netif *netif); +void dhcp_stop(struct netif *netif); +void dhcp_release_and_stop(struct netif *netif); +void dhcp_inform(struct netif *netif); +void dhcp_network_changed(struct netif *netif); +#if DHCP_DOES_ARP_CHECK +void dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr); +#endif +u8_t dhcp_supplied_address(const struct netif *netif); +/* to be called every minute */ +void dhcp_coarse_tmr(void); +/* to be called every half second */ +void dhcp_fine_tmr(void); + +#if LWIP_DHCP_GET_NTP_SRV +/** This function must exist, in other to add offered NTP servers to + * the NTP (or SNTP) engine. + * See LWIP_DHCP_MAX_NTP_SERVERS */ +extern void dhcp_set_ntp_servers(u8_t num_ntp_servers, const ip4_addr_t* ntp_server_addrs); +#endif /* LWIP_DHCP_GET_NTP_SRV */ + +#define netif_dhcp_data(netif) ((struct dhcp*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DHCP */ + +#endif /*LWIP_HDR_DHCP_H*/ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp6.h new file mode 100644 index 0000000..5cc4a01 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dhcp6.h @@ -0,0 +1,104 @@ +/** + * @file + * + * DHCPv6 client: IPv6 address autoconfiguration as per + * RFC 3315 (stateful DHCPv6) and + * RFC 3736 (stateless DHCPv6). + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + */ + +#ifndef LWIP_HDR_IP6_DHCP6_H +#define LWIP_HDR_IP6_DHCP6_H + +#include "lwip/opt.h" + +#if LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/err.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** period (in milliseconds) of the application calling dhcp6_tmr() */ +#define DHCP6_TIMER_MSECS 500 + +struct dhcp6 +{ + /** transaction identifier of last sent request */ + u32_t xid; + /** track PCB allocation state */ + u8_t pcb_allocated; + /** current DHCPv6 state machine state */ + u8_t state; + /** retries of current request */ + u8_t tries; + /** if request config is triggered while another action is active, this keeps track of it */ + u8_t request_config_pending; + /** #ticks with period DHCP6_TIMER_MSECS for request timeout */ + u16_t request_timeout; +#if LWIP_IPV6_DHCP6_STATEFUL + /* @todo: add more members here to keep track of stateful DHCPv6 data, like lease times */ +#endif /* LWIP_IPV6_DHCP6_STATEFUL */ +}; + +void dhcp6_set_struct(struct netif *netif, struct dhcp6 *dhcp6); +/** Remove a struct dhcp6 previously set to the netif using dhcp6_set_struct() */ +#define dhcp6_remove_struct(netif) netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, NULL) +void dhcp6_cleanup(struct netif *netif); + +err_t dhcp6_enable_stateful(struct netif *netif); +err_t dhcp6_enable_stateless(struct netif *netif); +void dhcp6_disable(struct netif *netif); + +void dhcp6_tmr(void); + +void dhcp6_nd6_ra_trigger(struct netif *netif, u8_t managed_addr_config, u8_t other_config); + +#if LWIP_DHCP6_GET_NTP_SRV +/** This function must exist, in other to add offered NTP servers to + * the NTP (or SNTP) engine. + * See LWIP_DHCP6_MAX_NTP_SERVERS */ +extern void dhcp6_set_ntp_servers(u8_t num_ntp_servers, const ip_addr_t* ntp_server_addrs); +#endif /* LWIP_DHCP6_GET_NTP_SRV */ + +#define netif_dhcp6_data(netif) ((struct dhcp6*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6_DHCP6 */ + +#endif /* LWIP_HDR_IP6_DHCP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dns.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dns.h new file mode 100644 index 0000000..0913415 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/dns.h @@ -0,0 +1,131 @@ +/** + * @file + * DNS API + */ + +/** + * lwip DNS resolver header file. + + * Author: Jim Pettinato + * April 2007 + + * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels. + * + * 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. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + */ + +#ifndef LWIP_HDR_DNS_H +#define LWIP_HDR_DNS_H + +#include "lwip/opt.h" + +#if LWIP_DNS + +#include "lwip/ip_addr.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** DNS timer period */ +#define DNS_TMR_INTERVAL 1000 + +/* DNS resolve types: */ +#define LWIP_DNS_ADDRTYPE_IPV4 0 +#define LWIP_DNS_ADDRTYPE_IPV6 1 +#define LWIP_DNS_ADDRTYPE_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */ +#define LWIP_DNS_ADDRTYPE_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */ +#if LWIP_IPV4 && LWIP_IPV6 +#ifndef LWIP_DNS_ADDRTYPE_DEFAULT +#define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4_IPV6 +#endif +#elif LWIP_IPV4 +#define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV4 +#else +#define LWIP_DNS_ADDRTYPE_DEFAULT LWIP_DNS_ADDRTYPE_IPV6 +#endif + +#if DNS_LOCAL_HOSTLIST +/** struct used for local host-list */ +struct local_hostlist_entry { + /** static hostname */ + const char *name; + /** static host address in network byteorder */ + ip_addr_t addr; + struct local_hostlist_entry *next; +}; +#define DNS_LOCAL_HOSTLIST_ELEM(name, addr_init) {name, addr_init, NULL} +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN +#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH +#endif +#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1)) +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ +#endif /* DNS_LOCAL_HOSTLIST */ + +#if LWIP_IPV4 +extern const ip_addr_t dns_mquery_v4group; +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 +extern const ip_addr_t dns_mquery_v6group; +#endif /* LWIP_IPV6 */ + +/** Callback which is invoked when a hostname is found. + * A function of this type must be implemented by the application using the DNS resolver. + * @param name pointer to the name that was looked up. + * @param ipaddr pointer to an ip_addr_t containing the IP address of the hostname, + * or NULL if the name could not be found (or on any other error). + * @param callback_arg a user-specified callback argument passed to dns_gethostbyname +*/ +typedef void (*dns_found_callback)(const char *name, const ip_addr_t *ipaddr, void *callback_arg); + +void dns_init(void); +void dns_tmr(void); +void dns_setserver(u8_t numdns, const ip_addr_t *dnsserver); +const ip_addr_t* dns_getserver(u8_t numdns); +err_t dns_gethostbyname(const char *hostname, ip_addr_t *addr, + dns_found_callback found, void *callback_arg); +err_t dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, + dns_found_callback found, void *callback_arg, + u8_t dns_addrtype); + + +#if DNS_LOCAL_HOSTLIST +size_t dns_local_iterate(dns_found_callback iterator_fn, void *iterator_arg); +err_t dns_local_lookup(const char *hostname, ip_addr_t *addr, u8_t dns_addrtype); +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +int dns_local_removehost(const char *hostname, const ip_addr_t *addr); +err_t dns_local_addhost(const char *hostname, const ip_addr_t *addr); +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ +#endif /* DNS_LOCAL_HOSTLIST */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DNS */ + +#endif /* LWIP_HDR_DNS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/err.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/err.h new file mode 100644 index 0000000..887d9b3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/err.h @@ -0,0 +1,117 @@ +/** + * @file + * lwIP Error codes + */ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_ERR_H +#define LWIP_HDR_ERR_H + +#include "lwip/opt.h" +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup infrastructure_errors Error codes + * @ingroup infrastructure + * @{ + */ + +/** Definitions for error constants. */ +typedef enum { +/** No error, everything OK. */ + ERR_OK = 0, +/** Out of memory error. */ + ERR_MEM = -1, +/** Buffer error. */ + ERR_BUF = -2, +/** Timeout. */ + ERR_TIMEOUT = -3, +/** Routing problem. */ + ERR_RTE = -4, +/** Operation in progress */ + ERR_INPROGRESS = -5, +/** Illegal value. */ + ERR_VAL = -6, +/** Operation would block. */ + ERR_WOULDBLOCK = -7, +/** Address in use. */ + ERR_USE = -8, +/** Already connecting. */ + ERR_ALREADY = -9, +/** Conn already established.*/ + ERR_ISCONN = -10, +/** Not connected. */ + ERR_CONN = -11, +/** Low-level netif error */ + ERR_IF = -12, + +/** Connection aborted. */ + ERR_ABRT = -13, +/** Connection reset. */ + ERR_RST = -14, +/** Connection closed. */ + ERR_CLSD = -15, +/** Illegal argument. */ + ERR_ARG = -16 +} err_enum_t; + +/** Define LWIP_ERR_T in cc.h if you want to use + * a different type for your platform (must be signed). */ +#ifdef LWIP_ERR_T +typedef LWIP_ERR_T err_t; +#else /* LWIP_ERR_T */ +typedef s8_t err_t; +#endif /* LWIP_ERR_T*/ + +/** + * @} + */ + +#ifdef LWIP_DEBUG +extern const char *lwip_strerr(err_t err); +#else +#define lwip_strerr(x) "" +#endif /* LWIP_DEBUG */ + +#if !NO_SYS +int err_to_errno(err_t err); +#endif /* !NO_SYS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_ERR_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/errno.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/errno.h new file mode 100644 index 0000000..48d6b53 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/errno.h @@ -0,0 +1,198 @@ +/** + * @file + * Posix Errno defines + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_ERRNO_H +#define LWIP_HDR_ERRNO_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LWIP_PROVIDE_ERRNO + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ + +#define EDEADLOCK EDEADLK + +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ + +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ + +#ifndef errno +extern int errno; +#endif + +#else /* LWIP_PROVIDE_ERRNO */ + +/* Define LWIP_ERRNO_STDINCLUDE if you want to include here */ +#ifdef LWIP_ERRNO_STDINCLUDE +#include +#else /* LWIP_ERRNO_STDINCLUDE */ +/* Define LWIP_ERRNO_INCLUDE to an equivalent of to include the error defines here */ +#ifdef LWIP_ERRNO_INCLUDE +#include LWIP_ERRNO_INCLUDE +#endif /* LWIP_ERRNO_INCLUDE */ +#endif /* LWIP_ERRNO_STDINCLUDE */ + +#endif /* LWIP_PROVIDE_ERRNO */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_ERRNO_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/etharp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/etharp.h new file mode 100644 index 0000000..2036b24 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/etharp.h @@ -0,0 +1,105 @@ +/** + * @file + * Ethernet output function - handles OUTGOING ethernet level traffic, implements + * ARP resolving. + * To be used in most low-level netif implementations + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (c) 2003-2004 Leon Woestenberg + * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef LWIP_HDR_NETIF_ETHARP_H +#define LWIP_HDR_NETIF_ETHARP_H + +#include "lwip/opt.h" + +#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip4_addr.h" +#include "lwip/netif.h" +#include "lwip/ip4.h" +#include "lwip/prot/ethernet.h" + +#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/prot/etharp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** 1 seconds period */ +#define ARP_TMR_INTERVAL 1000 + +#if ARP_QUEUEING +/** struct for queueing outgoing packets for unknown address + * defined here to be accessed by memp.h + */ +struct etharp_q_entry { + struct etharp_q_entry *next; + struct pbuf *p; +}; +#endif /* ARP_QUEUEING */ + +#define etharp_init() /* Compatibility define, no init needed. */ +void etharp_tmr(void); +ssize_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr, + struct eth_addr **eth_ret, const ip4_addr_t **ip_ret); +int etharp_get_entry(size_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret); +err_t etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr); +err_t etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q); +err_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr); +/** For Ethernet network interfaces, we might want to send "gratuitous ARP"; + * this is an ARP packet sent by a node in order to spontaneously cause other + * nodes to update an entry in their ARP cache. + * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */ +#define etharp_gratuitous(netif) etharp_request((netif), netif_ip4_addr(netif)) +void etharp_cleanup_netif(struct netif *netif); + +#if ETHARP_SUPPORT_STATIC_ENTRIES +err_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr); +err_t etharp_remove_static_entry(const ip4_addr_t *ipaddr); +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + +void etharp_input(struct pbuf *p, struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV4 && LWIP_ARP */ +#endif /* LWIP_ARP || LWIP_ETHERNET */ + +#endif /* LWIP_HDR_NETIF_ETHARP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ethip6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ethip6.h new file mode 100644 index 0000000..5e88dff --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ethip6.h @@ -0,0 +1,68 @@ +/** + * @file + * + * Ethernet output for IPv6. Uses ND tables for link-layer addressing. + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_ETHIP6_H +#define LWIP_HDR_ETHIP6_H + +#include "lwip/opt.h" + +#if LWIP_IPV6 && LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip6.h" +#include "lwip/ip6_addr.h" +#include "lwip/netif.h" + + +#ifdef __cplusplus +extern "C" { +#endif + + +err_t ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 && LWIP_ETHERNET */ + +#endif /* LWIP_HDR_ETHIP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp.h new file mode 100644 index 0000000..f5a31fd --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp.h @@ -0,0 +1,110 @@ +/** + * @file + * ICMP API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_ICMP_H +#define LWIP_HDR_ICMP_H + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/prot/icmp.h" + +#if LWIP_IPV6 && LWIP_ICMP6 +#include "lwip/icmp6.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** ICMP destination unreachable codes */ +enum icmp_dur_type { + /** net unreachable */ + ICMP_DUR_NET = 0, + /** host unreachable */ + ICMP_DUR_HOST = 1, + /** protocol unreachable */ + ICMP_DUR_PROTO = 2, + /** port unreachable */ + ICMP_DUR_PORT = 3, + /** fragmentation needed and DF set */ + ICMP_DUR_FRAG = 4, + /** source route failed */ + ICMP_DUR_SR = 5 +}; + +/** ICMP time exceeded codes */ +enum icmp_te_type { + /** time to live exceeded in transit */ + ICMP_TE_TTL = 0, + /** fragment reassembly time exceeded */ + ICMP_TE_FRAG = 1 +}; + +#if LWIP_IPV4 && LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +void icmp_input(struct pbuf *p, struct netif *inp); +void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); +void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); + +#endif /* LWIP_IPV4 && LWIP_ICMP */ + +#if LWIP_IPV4 && LWIP_IPV6 +#if LWIP_ICMP && LWIP_ICMP6 +#define icmp_port_unreach(isipv6, pbuf) ((isipv6) ? \ + icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT) : \ + icmp_dest_unreach(pbuf, ICMP_DUR_PORT)) +#elif LWIP_ICMP +#define icmp_port_unreach(isipv6, pbuf) do{ if(!(isipv6)) { icmp_dest_unreach(pbuf, ICMP_DUR_PORT);}}while(0) +#elif LWIP_ICMP6 +#define icmp_port_unreach(isipv6, pbuf) do{ if(isipv6) { icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT);}}while(0) +#else +#define icmp_port_unreach(isipv6, pbuf) +#endif +#elif LWIP_IPV6 && LWIP_ICMP6 +#define icmp_port_unreach(isipv6, pbuf) icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT) +#elif LWIP_IPV4 && LWIP_ICMP +#define icmp_port_unreach(isipv6, pbuf) icmp_dest_unreach(pbuf, ICMP_DUR_PORT) +#else /* (LWIP_IPV6 && LWIP_ICMP6) || (LWIP_IPV4 && LWIP_ICMP) */ +#define icmp_port_unreach(isipv6, pbuf) +#endif /* (LWIP_IPV6 && LWIP_ICMP6) || (LWIP_IPV4 && LWIP_ICMP) LWIP_IPV4*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_ICMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp6.h new file mode 100644 index 0000000..0ccb789 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/icmp6.h @@ -0,0 +1,72 @@ +/** + * @file + * + * IPv6 version of ICMP, as per RFC 4443. + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ +#ifndef LWIP_HDR_ICMP6_H +#define LWIP_HDR_ICMP6_H + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip6_addr.h" +#include "lwip/netif.h" +#include "lwip/prot/icmp6.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +void icmp6_input(struct pbuf *p, struct netif *inp); +void icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c); +void icmp6_packet_too_big(struct pbuf *p, u32_t mtu); +void icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c); +void icmp6_time_exceeded_with_addrs(struct pbuf *p, enum icmp6_te_code c, + const ip6_addr_t *src_addr, const ip6_addr_t *dest_addr); +void icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, const void *pointer); + +#endif /* LWIP_ICMP6 && LWIP_IPV6 */ + + +#ifdef __cplusplus +} +#endif + + +#endif /* LWIP_HDR_ICMP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/if_api.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/if_api.h new file mode 100644 index 0000000..b7269e2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/if_api.h @@ -0,0 +1,70 @@ +/** + * @file + * Interface Identification APIs from: + * RFC 3493: Basic Socket Interface Extensions for IPv6 + * Section 4: Interface Identification + */ + +/* + * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Joel Cunningham + * + */ +#ifndef LWIP_HDR_IF_H +#define LWIP_HDR_IF_H + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef IF_NAMESIZE +#define IF_NAMESIZE NETIF_NAMESIZE +#endif + +char * lwip_if_indextoname(unsigned int ifindex, char *ifname); +unsigned int lwip_if_nametoindex(const char *ifname); + +#if LWIP_COMPAT_SOCKETS +#define if_indextoname(ifindex, ifname) lwip_if_indextoname(ifindex,ifname) +#define if_nametoindex(ifname) lwip_if_nametoindex(ifname) +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SOCKET */ + +#endif /* LWIP_HDR_IF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/igmp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/igmp.h new file mode 100644 index 0000000..0a16db0 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/igmp.h @@ -0,0 +1,115 @@ +/** + * @file + * IGMP API + */ + +/* + * Copyright (c) 2002 CITEL Technologies Ltd. + * All rights reserved. + * + * 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 of CITEL Technologies Ltd 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 CITEL TECHNOLOGIES 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 CITEL TECHNOLOGIES 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. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. +*/ + +#ifndef LWIP_HDR_IGMP_H +#define LWIP_HDR_IGMP_H + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" + +#if LWIP_IPV4 && LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* IGMP timer */ +#define IGMP_TMR_INTERVAL 100 /* Milliseconds */ +#define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL) +#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL) + +/* Compatibility defines (don't use for new code) */ +#define IGMP_DEL_MAC_FILTER NETIF_DEL_MAC_FILTER +#define IGMP_ADD_MAC_FILTER NETIF_ADD_MAC_FILTER + +/** + * igmp group structure - there is + * a list of groups for each interface + * these should really be linked from the interface, but + * if we keep them separate we will not affect the lwip original code + * too much + * + * There will be a group for the all systems group address but this + * will not run the state machine as it is used to kick off reports + * from all the other groups + */ +struct igmp_group { + /** next link */ + struct igmp_group *next; + /** multicast address */ + ip4_addr_t group_address; + /** signifies we were the last person to report */ + u8_t last_reporter_flag; + /** current state of the group */ + u8_t group_state; + /** timer for reporting, negative is OFF */ + u16_t timer; + /** counter of simultaneous uses */ + u8_t use; +}; + +/* Prototypes */ +void igmp_init(void); +err_t igmp_start(struct netif *netif); +err_t igmp_stop(struct netif *netif); +void igmp_report_groups(struct netif *netif); +struct igmp_group *igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr); +void igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest); +err_t igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr); +err_t igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr); +err_t igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr); +err_t igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr); +void igmp_tmr(void); + +/** @ingroup igmp + * Get list head of IGMP groups for netif. + * Note: The allsystems group IP is contained in the list as first entry. + * @see @ref netif_set_igmp_mac_filter() + */ +#define netif_igmp_data(netif) ((struct igmp_group *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV4 && LWIP_IGMP */ + +#endif /* LWIP_HDR_IGMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet.h new file mode 100644 index 0000000..76f2a95 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet.h @@ -0,0 +1,169 @@ +/** + * @file + * This file (together with sockets.h) aims to provide structs and functions from + * - arpa/inet.h + * - netinet/in.h + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_INET_H +#define LWIP_HDR_INET_H + +#include "lwip/opt.h" +#include "lwip/def.h" +#include "lwip/ip_addr.h" +#include "lwip/ip6_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* If your port already typedef's in_addr_t, define _IN_ADDR_T_DECLARED + to prevent this code from redefining it. */ +#if !defined(in_addr_t) && !defined(_IN_ADDR_T_DECLARED) +typedef u32_t in_addr_t; +#endif + +struct in_addr { + in_addr_t s_addr; +}; + +struct in6_addr { + union { + u32_t u32_addr[4]; + u8_t u8_addr[16]; + } un; +#define s6_addr un.u8_addr +}; + +/** 255.255.255.255 */ +#define INADDR_NONE IPADDR_NONE +/** 127.0.0.1 */ +#define INADDR_LOOPBACK IPADDR_LOOPBACK +/** 0.0.0.0 */ +#define INADDR_ANY IPADDR_ANY +/** 255.255.255.255 */ +#define INADDR_BROADCAST IPADDR_BROADCAST + +/** This macro can be used to initialize a variable of type struct in6_addr + to the IPv6 wildcard address. */ +#define IN6ADDR_ANY_INIT {{{0,0,0,0}}} +/** This macro can be used to initialize a variable of type struct in6_addr + to the IPv6 loopback address. */ +#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}} +/** This variable is initialized by the system to contain the wildcard IPv6 address. */ +extern const struct in6_addr in6addr_any; + +/* Definitions of the bits in an (IPv4) Internet address integer. + + On subnets, host and network parts are found according to + the subnet mask, not these masks. */ +#define IN_CLASSA(a) IP_CLASSA(a) +#define IN_CLASSA_NET IP_CLASSA_NET +#define IN_CLASSA_NSHIFT IP_CLASSA_NSHIFT +#define IN_CLASSA_HOST IP_CLASSA_HOST +#define IN_CLASSA_MAX IP_CLASSA_MAX + +#define IN_CLASSB(b) IP_CLASSB(b) +#define IN_CLASSB_NET IP_CLASSB_NET +#define IN_CLASSB_NSHIFT IP_CLASSB_NSHIFT +#define IN_CLASSB_HOST IP_CLASSB_HOST +#define IN_CLASSB_MAX IP_CLASSB_MAX + +#define IN_CLASSC(c) IP_CLASSC(c) +#define IN_CLASSC_NET IP_CLASSC_NET +#define IN_CLASSC_NSHIFT IP_CLASSC_NSHIFT +#define IN_CLASSC_HOST IP_CLASSC_HOST +#define IN_CLASSC_MAX IP_CLASSC_MAX + +#define IN_CLASSD(d) IP_CLASSD(d) +#define IN_CLASSD_NET IP_CLASSD_NET /* These ones aren't really */ +#define IN_CLASSD_NSHIFT IP_CLASSD_NSHIFT /* net and host fields, but */ +#define IN_CLASSD_HOST IP_CLASSD_HOST /* routing needn't know. */ +#define IN_CLASSD_MAX IP_CLASSD_MAX + +#define IN_MULTICAST(a) IP_MULTICAST(a) + +#define IN_EXPERIMENTAL(a) IP_EXPERIMENTAL(a) +#define IN_BADCLASS(a) IP_BADCLASS(a) + +#define IN_LOOPBACKNET IP_LOOPBACKNET + + +#ifndef INET_ADDRSTRLEN +#define INET_ADDRSTRLEN IP4ADDR_STRLEN_MAX +#endif +#if LWIP_IPV6 +#ifndef INET6_ADDRSTRLEN +#define INET6_ADDRSTRLEN IP6ADDR_STRLEN_MAX +#endif +#endif + +#if LWIP_IPV4 + +#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr)) +#define inet_addr_to_ip4addr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr)) + +/* directly map this to the lwip internal functions */ +#define inet_addr(cp) ipaddr_addr(cp) +#define inet_aton(cp, addr) ip4addr_aton(cp, (ip4_addr_t*)addr) +#define inet_ntoa(addr) ip4addr_ntoa((const ip4_addr_t*)&(addr)) +#define inet_ntoa_r(addr, buf, buflen) ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen) + +#endif /* LWIP_IPV4 */ + +#if LWIP_IPV6 +#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \ + (target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \ + (target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \ + (target_in6addr)->un.u32_addr[3] = (source_ip6addr)->addr[3];} +#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr) {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \ + (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \ + (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \ + (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3]; \ + ip6_addr_clear_zone(target_ip6addr);} + +/* directly map this to the lwip internal functions */ +#define inet6_aton(cp, addr) ip6addr_aton(cp, (ip6_addr_t*)addr) +#define inet6_ntoa(addr) ip6addr_ntoa((const ip6_addr_t*)&(addr)) +#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((const ip6_addr_t*)&(addr), buf, buflen) + +#endif /* LWIP_IPV6 */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_INET_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet_chksum.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet_chksum.h new file mode 100644 index 0000000..33296d2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/inet_chksum.h @@ -0,0 +1,104 @@ +/** + * @file + * IP checksum calculation functions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_INET_CHKSUM_H +#define LWIP_HDR_INET_CHKSUM_H + +#include "lwip/opt.h" + +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +/** Swap the bytes in an u16_t: much like lwip_htons() for little-endian */ +#ifndef SWAP_BYTES_IN_WORD +#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8) +#endif /* SWAP_BYTES_IN_WORD */ + +/** Split an u32_t in two u16_ts and add them up */ +#ifndef FOLD_U32T +#define FOLD_U32T(u) ((u32_t)(((u) >> 16) + ((u) & 0x0000ffffUL))) +#endif + +#if LWIP_CHECKSUM_ON_COPY +/** Function-like macro: same as MEMCPY but returns the checksum of copied data + as u16_t */ +# ifndef LWIP_CHKSUM_COPY +# define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len) +# ifndef LWIP_CHKSUM_COPY_ALGORITHM +# define LWIP_CHKSUM_COPY_ALGORITHM 1 +# endif /* LWIP_CHKSUM_COPY_ALGORITHM */ +# else /* LWIP_CHKSUM_COPY */ +# define LWIP_CHKSUM_COPY_ALGORITHM 0 +# endif /* LWIP_CHKSUM_COPY */ +#else /* LWIP_CHECKSUM_ON_COPY */ +# define LWIP_CHKSUM_COPY_ALGORITHM 0 +#endif /* LWIP_CHECKSUM_ON_COPY */ + +#ifdef __cplusplus +extern "C" { +#endif + +u16_t inet_chksum(const void *dataptr, u16_t len); +u16_t inet_chksum_pbuf(struct pbuf *p); +#if LWIP_CHKSUM_COPY_ALGORITHM +u16_t lwip_chksum_copy(void *dst, const void *src, u16_t len); +#endif /* LWIP_CHKSUM_COPY_ALGORITHM */ + +#if LWIP_IPV4 +u16_t inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, + const ip4_addr_t *src, const ip4_addr_t *dest); +u16_t inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, + u16_t proto_len, u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest); +#endif /* LWIP_IPV4 */ + +#if LWIP_IPV6 +u16_t ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, + const ip6_addr_t *src, const ip6_addr_t *dest); +u16_t ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, + u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest); +#endif /* LWIP_IPV6 */ + + +u16_t ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len, + const ip_addr_t *src, const ip_addr_t *dest); +u16_t ip_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len, + u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_INET_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h new file mode 100644 index 0000000..6cabfc8 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h @@ -0,0 +1,100 @@ +/** + * @file + * lwIP initialization API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_INIT_H +#define LWIP_HDR_INIT_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup lwip_version Version + * @ingroup lwip + * @{ + */ + +/** X.x.x: Major version of the stack */ +#define LWIP_VERSION_MAJOR 2 +/** x.X.x: Minor version of the stack */ +#define LWIP_VERSION_MINOR 1 +/** x.x.X: Revision of the stack */ +#define LWIP_VERSION_REVISION 3 +/** For release candidates, this is set to 1..254 + * For official releases, this is set to 255 (LWIP_RC_RELEASE) + * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */ +#define LWIP_VERSION_RC LWIP_RC_RELEASE + +/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ +#define LWIP_RC_RELEASE 255 +/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions */ +#define LWIP_RC_DEVELOPMENT 0 + +#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) +#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) +#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) + +/* Some helper defines to get a version string */ +#define LWIP_VERSTR2(x) #x +#define LWIP_VERSTR(x) LWIP_VERSTR2(x) +#if LWIP_VERSION_IS_RELEASE +#define LWIP_VERSION_STRING_SUFFIX "" +#elif LWIP_VERSION_IS_DEVELOPMENT +#define LWIP_VERSION_STRING_SUFFIX "d" +#else +#define LWIP_VERSION_STRING_SUFFIX "rc" LWIP_VERSTR(LWIP_VERSION_RC) +#endif + +/** Provides the version of the stack */ +#define LWIP_VERSION ((LWIP_VERSION_MAJOR) << 24 | (LWIP_VERSION_MINOR) << 16 | \ + (LWIP_VERSION_REVISION) << 8 | (LWIP_VERSION_RC)) +/** Provides the version of the stack as string */ +#define LWIP_VERSION_STRING LWIP_VERSTR(LWIP_VERSION_MAJOR) "." LWIP_VERSTR(LWIP_VERSION_MINOR) "." LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX + +/** + * @} + */ + +/* Modules initialization */ +void lwip_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_INIT_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h.cmake.in b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h.cmake.in new file mode 100644 index 0000000..9b609b7 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/init.h.cmake.in @@ -0,0 +1,100 @@ +/** + * @file + * lwIP initialization API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_INIT_H +#define LWIP_HDR_INIT_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup lwip_version Version + * @ingroup lwip + * @{ + */ + +/** X.x.x: Major version of the stack */ +#define LWIP_VERSION_MAJOR ${LWIP_VERSION_MAJOR} +/** x.X.x: Minor version of the stack */ +#define LWIP_VERSION_MINOR ${LWIP_VERSION_MINOR} +/** x.x.X: Revision of the stack */ +#define LWIP_VERSION_REVISION ${LWIP_VERSION_REVISION} +/** For release candidates, this is set to 1..254 + * For official releases, this is set to 255 (LWIP_RC_RELEASE) + * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */ +#define LWIP_VERSION_RC ${LWIP_VERSION_RC} + +/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ +#define LWIP_RC_RELEASE 255 +/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions */ +#define LWIP_RC_DEVELOPMENT 0 + +#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) +#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) +#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) + +/* Some helper defines to get a version string */ +#define LWIP_VERSTR2(x) #x +#define LWIP_VERSTR(x) LWIP_VERSTR2(x) +#if LWIP_VERSION_IS_RELEASE +#define LWIP_VERSION_STRING_SUFFIX "" +#elif LWIP_VERSION_IS_DEVELOPMENT +#define LWIP_VERSION_STRING_SUFFIX "d" +#else +#define LWIP_VERSION_STRING_SUFFIX "rc" LWIP_VERSTR(LWIP_VERSION_RC) +#endif + +/** Provides the version of the stack */ +#define LWIP_VERSION ((LWIP_VERSION_MAJOR) << 24 | (LWIP_VERSION_MINOR) << 16 | \ + (LWIP_VERSION_REVISION) << 8 | (LWIP_VERSION_RC)) +/** Provides the version of the stack as string */ +#define LWIP_VERSION_STRING LWIP_VERSTR(LWIP_VERSION_MAJOR) "." LWIP_VERSTR(LWIP_VERSION_MINOR) "." LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX + +/** + * @} + */ + +/* Modules initialization */ +void lwip_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_INIT_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip.h new file mode 100644 index 0000000..68aed6a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip.h @@ -0,0 +1,328 @@ +/** + * @file + * IP API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_IP_H +#define LWIP_HDR_IP_H + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/netif.h" +#include "lwip/ip4.h" +#include "lwip/ip6.h" +#include "lwip/prot/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is passed as the destination address to ip_output_if (not + to ip_output), meaning that an IP header already is constructed + in the pbuf. This is used when TCP retransmits. */ +#define LWIP_IP_HDRINCL NULL + +/** pbufs passed to IP must have a ref-count of 1 as their payload pointer + gets altered as the packet is passed down the stack */ +#ifndef LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX +#define LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p) LWIP_ASSERT("p->ref == 1", (p)->ref == 1) +#endif + +#if LWIP_NETIF_USE_HINTS +#define IP_PCB_NETIFHINT ;struct netif_hint netif_hints +#else /* LWIP_NETIF_USE_HINTS */ +#define IP_PCB_NETIFHINT +#endif /* LWIP_NETIF_USE_HINTS */ + +/** This is the common part of all PCB types. It needs to be at the + beginning of a PCB type definition. It is located here so that + changes to this common part are made in one location instead of + having to change all PCB structs. */ +#define IP_PCB \ + /* ip addresses in network byte order */ \ + ip_addr_t local_ip; \ + ip_addr_t remote_ip; \ + /* Bound netif index */ \ + u8_t netif_idx; \ + /* Socket options */ \ + u8_t so_options; \ + /* Type Of Service */ \ + u8_t tos; \ + /* Time To Live */ \ + u8_t ttl \ + /* link layer address resolution hint */ \ + IP_PCB_NETIFHINT + +struct ip_pcb { + /* Common members of all PCB types */ + IP_PCB; +}; + +/* + * Option flags per-socket. These are the same like SO_XXX in sockets.h + */ +#define SOF_REUSEADDR 0x04U /* allow local address reuse */ +#define SOF_KEEPALIVE 0x08U /* keep connections alive */ +#define SOF_BROADCAST 0x20U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ + +/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */ +#define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE) + +/** Global variables of this module, kept in a struct for efficient access using base+index. */ +struct ip_globals +{ + /** The interface that accepted the packet for the current callback invocation. */ + struct netif *current_netif; + /** The interface that received the packet for the current callback invocation. */ + struct netif *current_input_netif; +#if LWIP_IPV4 + /** Header of the input packet currently being processed. */ + const struct ip_hdr *current_ip4_header; +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 + /** Header of the input IPv6 packet currently being processed. */ + struct ip6_hdr *current_ip6_header; +#endif /* LWIP_IPV6 */ + /** Total header length of current_ip4/6_header (i.e. after this, the UDP/TCP header starts) */ + u16_t current_ip_header_tot_len; + /** Source IP address of current_header */ + ip_addr_t current_iphdr_src; + /** Destination IP address of current_header */ + ip_addr_t current_iphdr_dest; +}; +extern struct ip_globals ip_data; + + +/** Get the interface that accepted the current packet. + * This may or may not be the receiving netif, depending on your netif/network setup. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip_current_netif() (ip_data.current_netif) +/** Get the interface that received the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip_current_input_netif() (ip_data.current_input_netif) +/** Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) */ +#define ip_current_header_tot_len() (ip_data.current_ip_header_tot_len) +/** Source IP address of current_header */ +#define ip_current_src_addr() (&ip_data.current_iphdr_src) +/** Destination IP address of current_header */ +#define ip_current_dest_addr() (&ip_data.current_iphdr_dest) + +#if LWIP_IPV4 && LWIP_IPV6 +/** Get the IPv4 header of the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip4_current_header() ip_data.current_ip4_header +/** Get the IPv6 header of the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip6_current_header() ((const struct ip6_hdr*)(ip_data.current_ip6_header)) +/** Returns TRUE if the current IP input packet is IPv6, FALSE if it is IPv4 */ +#define ip_current_is_v6() (ip6_current_header() != NULL) +/** Source IPv6 address of current_header */ +#define ip6_current_src_addr() (ip_2_ip6(&ip_data.current_iphdr_src)) +/** Destination IPv6 address of current_header */ +#define ip6_current_dest_addr() (ip_2_ip6(&ip_data.current_iphdr_dest)) +/** Get the transport layer protocol */ +#define ip_current_header_proto() (ip_current_is_v6() ? \ + IP6H_NEXTH(ip6_current_header()) :\ + IPH_PROTO(ip4_current_header())) +/** Get the transport layer header */ +#define ip_next_header_ptr() ((const void*)((ip_current_is_v6() ? \ + (const u8_t*)ip6_current_header() : (const u8_t*)ip4_current_header()) + ip_current_header_tot_len())) + +/** Source IP4 address of current_header */ +#define ip4_current_src_addr() (ip_2_ip4(&ip_data.current_iphdr_src)) +/** Destination IP4 address of current_header */ +#define ip4_current_dest_addr() (ip_2_ip4(&ip_data.current_iphdr_dest)) + +#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */ + +/** Get the IPv4 header of the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip4_current_header() ip_data.current_ip4_header +/** Always returns FALSE when only supporting IPv4 only */ +#define ip_current_is_v6() 0 +/** Get the transport layer protocol */ +#define ip_current_header_proto() IPH_PROTO(ip4_current_header()) +/** Get the transport layer header */ +#define ip_next_header_ptr() ((const void*)((const u8_t*)ip4_current_header() + ip_current_header_tot_len())) +/** Source IP4 address of current_header */ +#define ip4_current_src_addr() (&ip_data.current_iphdr_src) +/** Destination IP4 address of current_header */ +#define ip4_current_dest_addr() (&ip_data.current_iphdr_dest) + +#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */ + +/** Get the IPv6 header of the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip6_current_header() ((const struct ip6_hdr*)(ip_data.current_ip6_header)) +/** Always returns TRUE when only supporting IPv6 only */ +#define ip_current_is_v6() 1 +/** Get the transport layer protocol */ +#define ip_current_header_proto() IP6H_NEXTH(ip6_current_header()) +/** Get the transport layer header */ +#define ip_next_header_ptr() ((const void*)(((const u8_t*)ip6_current_header()) + ip_current_header_tot_len())) +/** Source IP6 address of current_header */ +#define ip6_current_src_addr() (&ip_data.current_iphdr_src) +/** Destination IP6 address of current_header */ +#define ip6_current_dest_addr() (&ip_data.current_iphdr_dest) + +#endif /* LWIP_IPV6 */ + +/** Union source address of current_header */ +#define ip_current_src_addr() (&ip_data.current_iphdr_src) +/** Union destination address of current_header */ +#define ip_current_dest_addr() (&ip_data.current_iphdr_dest) + +/** Gets an IP pcb option (SOF_* flags) */ +#define ip_get_option(pcb, opt) ((pcb)->so_options & (opt)) +/** Sets an IP pcb option (SOF_* flags) */ +#define ip_set_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options | (opt))) +/** Resets an IP pcb option (SOF_* flags) */ +#define ip_reset_option(pcb, opt) ((pcb)->so_options = (u8_t)((pcb)->so_options & ~(opt))) + +#if LWIP_IPV4 && LWIP_IPV6 +/** + * @ingroup ip + * Output IP packet, netif is selected by source address + */ +#define ip_output(p, src, dest, ttl, tos, proto) \ + (IP_IS_V6(dest) ? \ + ip6_output(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto) : \ + ip4_output(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto)) +/** + * @ingroup ip + * Output IP packet to specified interface + */ +#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \ + (IP_IS_V6(dest) ? \ + ip6_output_if(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \ + ip4_output_if(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif)) +/** + * @ingroup ip + * Output IP packet to interface specifying source address + */ +#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \ + (IP_IS_V6(dest) ? \ + ip6_output_if_src(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \ + ip4_output_if_src(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif)) +/** Output IP packet that already includes an IP header. */ +#define ip_output_if_hdrincl(p, src, dest, netif) \ + (IP_IS_V6(dest) ? \ + ip6_output_if(p, ip_2_ip6(src), LWIP_IP_HDRINCL, 0, 0, 0, netif) : \ + ip4_output_if(p, ip_2_ip4(src), LWIP_IP_HDRINCL, 0, 0, 0, netif)) +/** Output IP packet with netif_hint */ +#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \ + (IP_IS_V6(dest) ? \ + ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif_hint) : \ + ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif_hint)) +/** + * @ingroup ip + * Get netif for address combination. See \ref ip6_route and \ref ip4_route + */ +#define ip_route(src, dest) \ + (IP_IS_V6(dest) ? \ + ip6_route(ip_2_ip6(src), ip_2_ip6(dest)) : \ + ip4_route_src(ip_2_ip4(src), ip_2_ip4(dest))) +/** + * @ingroup ip + * Get netif for IP. + */ +#define ip_netif_get_local_ip(netif, dest) (IP_IS_V6(dest) ? \ + ip6_netif_get_local_ip(netif, ip_2_ip6(dest)) : \ + ip4_netif_get_local_ip(netif)) +#define ip_debug_print(is_ipv6, p) ((is_ipv6) ? ip6_debug_print(p) : ip4_debug_print(p)) + +err_t ip_input(struct pbuf *p, struct netif *inp); + +#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */ + +#define ip_output(p, src, dest, ttl, tos, proto) \ + ip4_output(p, src, dest, ttl, tos, proto) +#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \ + ip4_output_if(p, src, dest, ttl, tos, proto, netif) +#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \ + ip4_output_if_src(p, src, dest, ttl, tos, proto, netif) +#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \ + ip4_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) +#define ip_output_if_hdrincl(p, src, dest, netif) \ + ip4_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif) +#define ip_route(src, dest) \ + ip4_route_src(src, dest) +#define ip_netif_get_local_ip(netif, dest) \ + ip4_netif_get_local_ip(netif) +#define ip_debug_print(is_ipv6, p) ip4_debug_print(p) + +#define ip_input ip4_input + +#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */ + +#define ip_output(p, src, dest, ttl, tos, proto) \ + ip6_output(p, src, dest, ttl, tos, proto) +#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \ + ip6_output_if(p, src, dest, ttl, tos, proto, netif) +#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \ + ip6_output_if_src(p, src, dest, ttl, tos, proto, netif) +#define ip_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) \ + ip6_output_hinted(p, src, dest, ttl, tos, proto, netif_hint) +#define ip_output_if_hdrincl(p, src, dest, netif) \ + ip6_output_if(p, src, LWIP_IP_HDRINCL, 0, 0, 0, netif) +#define ip_route(src, dest) \ + ip6_route(src, dest) +#define ip_netif_get_local_ip(netif, dest) \ + ip6_netif_get_local_ip(netif, dest) +#define ip_debug_print(is_ipv6, p) ip6_debug_print(p) + +#define ip_input ip6_input + +#endif /* LWIP_IPV6 */ + +#define ip_route_get_local_ip(src, dest, netif, ipaddr) do { \ + (netif) = ip_route(src, dest); \ + (ipaddr) = ip_netif_get_local_ip(netif, dest); \ +}while(0) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_IP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4.h new file mode 100644 index 0000000..4d7228d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4.h @@ -0,0 +1,109 @@ +/** + * @file + * IPv4 API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_IP4_H +#define LWIP_HDR_IP4_H + +#include "lwip/opt.h" + +#if LWIP_IPV4 + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/ip4_addr.h" +#include "lwip/err.h" +#include "lwip/netif.h" +#include "lwip/prot/ip4.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LWIP_HOOK_IP4_ROUTE_SRC +#define LWIP_IPV4_SRC_ROUTING 1 +#else +#define LWIP_IPV4_SRC_ROUTING 0 +#endif + +/** Currently, the function ip_output_if_opt() is only used with IGMP */ +#define IP_OPTIONS_SEND (LWIP_IPV4 && LWIP_IGMP) + +#define ip_init() /* Compatibility define, no init needed. */ +struct netif *ip4_route(const ip4_addr_t *dest); +#if LWIP_IPV4_SRC_ROUTING +struct netif *ip4_route_src(const ip4_addr_t *src, const ip4_addr_t *dest); +#else /* LWIP_IPV4_SRC_ROUTING */ +#define ip4_route_src(src, dest) ip4_route(dest) +#endif /* LWIP_IPV4_SRC_ROUTING */ +err_t ip4_input(struct pbuf *p, struct netif *inp); +err_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto); +err_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif); +err_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif); +#if LWIP_NETIF_USE_HINTS +err_t ip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif_hint *netif_hint); +#endif /* LWIP_NETIF_USE_HINTS */ +#if IP_OPTIONS_SEND +err_t ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen); +err_t ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen); +#endif /* IP_OPTIONS_SEND */ + +#if LWIP_MULTICAST_TX_OPTIONS +void ip4_set_default_multicast_netif(struct netif* default_multicast_netif); +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + +#define ip4_netif_get_local_ip(netif) (((netif) != NULL) ? netif_ip_addr4(netif) : NULL) + +#if IP_DEBUG +void ip4_debug_print(struct pbuf *p); +#else +#define ip4_debug_print(p) +#endif /* IP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV4 */ + +#endif /* LWIP_HDR_IP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_addr.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_addr.h new file mode 100644 index 0000000..f244c4f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_addr.h @@ -0,0 +1,216 @@ +/** + * @file + * IPv4 address API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_IP4_ADDR_H +#define LWIP_HDR_IP4_ADDR_H + +#include "lwip/opt.h" +#include "lwip/def.h" + +#if LWIP_IPV4 + +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the aligned version of ip4_addr_t, + used as local variable, on the stack, etc. */ +struct ip4_addr { + u32_t addr; +}; + +/** ip4_addr_t uses a struct for convenience only, so that the same defines can + * operate both on ip4_addr_t as well as on ip4_addr_p_t. */ +typedef struct ip4_addr ip4_addr_t; + +/* Forward declaration to not include netif.h */ +struct netif; + +/** 255.255.255.255 */ +#define IPADDR_NONE ((u32_t)0xffffffffUL) +/** 127.0.0.1 */ +#define IPADDR_LOOPBACK ((u32_t)0x7f000001UL) +/** 0.0.0.0 */ +#define IPADDR_ANY ((u32_t)0x00000000UL) +/** 255.255.255.255 */ +#define IPADDR_BROADCAST ((u32_t)0xffffffffUL) + +/* Definitions of the bits in an Internet address integer. + + On subnets, host and network parts are found according to + the subnet mask, not these masks. */ +#define IP_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) +#define IP_CLASSA_NET 0xff000000 +#define IP_CLASSA_NSHIFT 24 +#define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET) +#define IP_CLASSA_MAX 128 + +#define IP_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) +#define IP_CLASSB_NET 0xffff0000 +#define IP_CLASSB_NSHIFT 16 +#define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET) +#define IP_CLASSB_MAX 65536 + +#define IP_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) +#define IP_CLASSC_NET 0xffffff00 +#define IP_CLASSC_NSHIFT 8 +#define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET) + +#define IP_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) +#define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */ +#define IP_CLASSD_NSHIFT 28 /* net and host fields, but */ +#define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */ +#define IP_MULTICAST(a) IP_CLASSD(a) + +#define IP_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) +#define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) + +#define IP_LOOPBACKNET 127 /* official! */ + +/** Set an IP address given by the four byte-parts */ +#define IP4_ADDR(ipaddr, a,b,c,d) (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d)) + +/** Copy IP address - faster than ip4_addr_set: no NULL check */ +#define ip4_addr_copy(dest, src) ((dest).addr = (src).addr) +/** Safely copy one IP address to another (src may be NULL) */ +#define ip4_addr_set(dest, src) ((dest)->addr = \ + ((src) == NULL ? 0 : \ + (src)->addr)) +/** Set complete address to zero */ +#define ip4_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) +/** Set address to IPADDR_ANY (no need for lwip_htonl()) */ +#define ip4_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY) +/** Set address to loopback address */ +#define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK)) +/** Check if an address is in the loopback region */ +#define ip4_addr_isloopback(ipaddr) (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) << 24)) +/** Safely copy one IP address to another and change byte order + * from host- to network-order. */ +#define ip4_addr_set_hton(dest, src) ((dest)->addr = \ + ((src) == NULL ? 0:\ + lwip_htonl((src)->addr))) +/** IPv4 only: set the IP address given as an u32_t */ +#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) +/** IPv4 only: get the IP address as an u32_t */ +#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr) + +/** Get the network address by combining host address with netmask */ +#define ip4_addr_get_network(target, host, netmask) do { ((target)->addr = ((host)->addr) & ((netmask)->addr)); } while(0) + +/** + * Determine if two address are on the same network. + * + * @arg addr1 IP address 1 + * @arg addr2 IP address 2 + * @arg mask network identifier mask + * @return !0 if the network identifiers of both address match + */ +#define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ + (mask)->addr) == \ + ((addr2)->addr & \ + (mask)->addr)) +#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) + +#define ip4_addr_isany_val(addr1) ((addr1).addr == IPADDR_ANY) +#define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1))) + +#define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif) +u8_t ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif); + +#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr) +u8_t ip4_addr_netmask_valid(u32_t netmask); + +#define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL)) + +#define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL)) + +#define ip4_addr_debug_print_parts(debug, a, b, c, d) \ + LWIP_DEBUGF(debug, ("%" U16_F ".%" U16_F ".%" U16_F ".%" U16_F, a, b, c, d)) +#define ip4_addr_debug_print(debug, ipaddr) \ + ip4_addr_debug_print_parts(debug, \ + (u16_t)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0)) +#define ip4_addr_debug_print_val(debug, ipaddr) \ + ip4_addr_debug_print_parts(debug, \ + ip4_addr1_16_val(ipaddr), \ + ip4_addr2_16_val(ipaddr), \ + ip4_addr3_16_val(ipaddr), \ + ip4_addr4_16_val(ipaddr)) + +/* Get one byte from the 4-byte address */ +#define ip4_addr_get_byte(ipaddr, idx) (((const u8_t*)(&(ipaddr)->addr))[idx]) +#define ip4_addr1(ipaddr) ip4_addr_get_byte(ipaddr, 0) +#define ip4_addr2(ipaddr) ip4_addr_get_byte(ipaddr, 1) +#define ip4_addr3(ipaddr) ip4_addr_get_byte(ipaddr, 2) +#define ip4_addr4(ipaddr) ip4_addr_get_byte(ipaddr, 3) +/* Get one byte from the 4-byte address, but argument is 'ip4_addr_t', + * not a pointer */ +#define ip4_addr_get_byte_val(ipaddr, idx) ((u8_t)(((ipaddr).addr >> (idx * 8)) & 0xff)) +#define ip4_addr1_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 0) +#define ip4_addr2_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 1) +#define ip4_addr3_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 2) +#define ip4_addr4_val(ipaddr) ip4_addr_get_byte_val(ipaddr, 3) +/* These are cast to u16_t, with the intent that they are often arguments + * to printf using the U16_F format from cc.h. */ +#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr)) +#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr)) +#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr)) +#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr)) +#define ip4_addr1_16_val(ipaddr) ((u16_t)ip4_addr1_val(ipaddr)) +#define ip4_addr2_16_val(ipaddr) ((u16_t)ip4_addr2_val(ipaddr)) +#define ip4_addr3_16_val(ipaddr) ((u16_t)ip4_addr3_val(ipaddr)) +#define ip4_addr4_16_val(ipaddr) ((u16_t)ip4_addr4_val(ipaddr)) + +#define IP4ADDR_STRLEN_MAX 16 + +/** For backwards compatibility */ +#define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr) + +u32_t ipaddr_addr(const char *cp); +int ip4addr_aton(const char *cp, ip4_addr_t *addr); +/** returns ptr to static buffer; not reentrant! */ +char *ip4addr_ntoa(const ip4_addr_t *addr); +char *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV4 */ + +#endif /* LWIP_HDR_IP_ADDR_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_frag.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_frag.h new file mode 100644 index 0000000..ed5bf14 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip4_frag.h @@ -0,0 +1,100 @@ +/** + * @file + * IP fragmentation/reassembly + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Jani Monoses + * + */ + +#ifndef LWIP_HDR_IP4_FRAG_H +#define LWIP_HDR_IP4_FRAG_H + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/ip_addr.h" +#include "lwip/ip.h" + +#if LWIP_IPV4 + +#ifdef __cplusplus +extern "C" { +#endif + +#if IP_REASSEMBLY +/* The IP reassembly timer interval in milliseconds. */ +#define IP_TMR_INTERVAL 1000 + +/** IP reassembly helper struct. + * This is exported because memp needs to know the size. + */ +struct ip_reassdata { + struct ip_reassdata *next; + struct pbuf *p; + struct ip_hdr iphdr; + u16_t datagram_len; + u8_t flags; + u8_t timer; +}; + +void ip_reass_init(void); +void ip_reass_tmr(void); +struct pbuf * ip4_reass(struct pbuf *p); +#endif /* IP_REASSEMBLY */ + +#if IP_FRAG +#if !LWIP_NETIF_TX_SINGLE_PBUF +#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED +#define LWIP_PBUF_CUSTOM_REF_DEFINED +/** A custom pbuf that holds a reference to another pbuf, which is freed + * when this custom pbuf is freed. This is used to create a custom PBUF_REF + * that points into the original pbuf. */ +struct pbuf_custom_ref { + /** 'base class' */ + struct pbuf_custom pc; + /** pointer to the original pbuf that is referenced */ + struct pbuf *original; +}; +#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */ +#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */ + +err_t ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest); +#endif /* IP_FRAG */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV4 */ + +#endif /* LWIP_HDR_IP4_FRAG_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6.h new file mode 100644 index 0000000..f894e06 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6.h @@ -0,0 +1,93 @@ +/** + * @file + * + * IPv6 layer. + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ +#ifndef LWIP_HDR_IP6_H +#define LWIP_HDR_IP6_H + +#include "lwip/opt.h" + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip6_addr.h" +#include "lwip/prot/ip6.h" +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" + +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct netif *ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest); +const ip_addr_t *ip6_select_source_address(struct netif *netif, const ip6_addr_t * dest); +err_t ip6_input(struct pbuf *p, struct netif *inp); +err_t ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, + u8_t hl, u8_t tc, u8_t nexth); +err_t ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, + u8_t hl, u8_t tc, u8_t nexth, struct netif *netif); +err_t ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, + u8_t hl, u8_t tc, u8_t nexth, struct netif *netif); +#if LWIP_NETIF_USE_HINTS +err_t ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest, + u8_t hl, u8_t tc, u8_t nexth, struct netif_hint *netif_hint); +#endif /* LWIP_NETIF_USE_HINTS */ +#if LWIP_IPV6_MLD +err_t ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value); +#endif /* LWIP_IPV6_MLD */ + +#define ip6_netif_get_local_ip(netif, dest) (((netif) != NULL) ? \ + ip6_select_source_address(netif, dest) : NULL) + +#if IP6_DEBUG +void ip6_debug_print(struct pbuf *p); +#else +#define ip6_debug_print(p) +#endif /* IP6_DEBUG */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_IP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_addr.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_addr.h new file mode 100644 index 0000000..29c2a34 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_addr.h @@ -0,0 +1,352 @@ +/** + * @file + * + * IPv6 addresses. + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * Structs and macros for handling IPv6 addresses. + * + * Please coordinate changes and requests with Ivan Delamer + * + */ +#ifndef LWIP_HDR_IP6_ADDR_H +#define LWIP_HDR_IP6_ADDR_H + +#include "lwip/opt.h" +#include "def.h" + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip6_zone.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/** This is the aligned version of ip6_addr_t, + used as local variable, on the stack, etc. */ +struct ip6_addr { + u32_t addr[4]; +#if LWIP_IPV6_SCOPES + u8_t zone; +#endif /* LWIP_IPV6_SCOPES */ +}; + +/** IPv6 address */ +typedef struct ip6_addr ip6_addr_t; + +/** Set an IPv6 partial address given by byte-parts */ +#define IP6_ADDR_PART(ip6addr, index, a,b,c,d) \ + (ip6addr)->addr[index] = PP_HTONL(LWIP_MAKEU32(a,b,c,d)) + +/** Set a full IPv6 address by passing the 4 u32_t indices in network byte order + (use PP_HTONL() for constants) */ +#define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) do { \ + (ip6addr)->addr[0] = idx0; \ + (ip6addr)->addr[1] = idx1; \ + (ip6addr)->addr[2] = idx2; \ + (ip6addr)->addr[3] = idx3; \ + ip6_addr_clear_zone(ip6addr); } while(0) + +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK2(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0])) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK3(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[1]) >> 16) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK4(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[1])) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK5(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[2]) >> 16) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK6(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[2])) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK7(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[3]) >> 16) & 0xffff)) +/** Access address in 16-bit block */ +#define IP6_ADDR_BLOCK8(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[3])) & 0xffff)) + +/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */ +#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \ + (dest).addr[1] = (src).addr[1]; \ + (dest).addr[2] = (src).addr[2]; \ + (dest).addr[3] = (src).addr[3]; \ + ip6_addr_copy_zone((dest), (src)); }while(0) +/** Safely copy one IPv6 address to another (src may be NULL) */ +#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \ + (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \ + (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \ + (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3]; \ + ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src)); }while(0) + +/** Copy packed IPv6 address to unpacked IPv6 address; zone is not set */ +#define ip6_addr_copy_from_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \ + (dest).addr[1] = (src).addr[1]; \ + (dest).addr[2] = (src).addr[2]; \ + (dest).addr[3] = (src).addr[3]; \ + ip6_addr_clear_zone(&dest); }while(0) + +/** Copy unpacked IPv6 address to packed IPv6 address; zone is lost */ +#define ip6_addr_copy_to_packed(dest, src) do{(dest).addr[0] = (src).addr[0]; \ + (dest).addr[1] = (src).addr[1]; \ + (dest).addr[2] = (src).addr[2]; \ + (dest).addr[3] = (src).addr[3]; }while(0) + +/** Set complete address to zero */ +#define ip6_addr_set_zero(ip6addr) do{(ip6addr)->addr[0] = 0; \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[2] = 0; \ + (ip6addr)->addr[3] = 0; \ + ip6_addr_clear_zone(ip6addr);}while(0) + +/** Set address to ipv6 'any' (no need for lwip_htonl()) */ +#define ip6_addr_set_any(ip6addr) ip6_addr_set_zero(ip6addr) +/** Set address to ipv6 loopback address */ +#define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[2] = 0; \ + (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \ + ip6_addr_clear_zone(ip6addr);}while(0) +/** Safely copy one IPv6 address to another and change byte order + * from host- to network-order. */ +#define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \ + (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \ + (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \ + (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]); \ + ip6_addr_set_zone((dest), (src) == NULL ? IP6_NO_ZONE : ip6_addr_zone(src));}while(0) + + +/** Compare IPv6 networks, ignoring zone information. To be used sparingly! */ +#define ip6_addr_netcmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ + ((addr1)->addr[1] == (addr2)->addr[1])) + +/** + * Determine if two IPv6 address are on the same network. + * + * @param addr1 IPv6 address 1 + * @param addr2 IPv6 address 2 + * @return 1 if the network identifiers of both address match, 0 if not + */ +#define ip6_addr_netcmp(addr1, addr2) (ip6_addr_netcmp_zoneless((addr1), (addr2)) && \ + ip6_addr_cmp_zone((addr1), (addr2))) + +/* Exact-host comparison *after* ip6_addr_netcmp() succeeded, for efficiency. */ +#define ip6_addr_nethostcmp(addr1, addr2) (((addr1)->addr[2] == (addr2)->addr[2]) && \ + ((addr1)->addr[3] == (addr2)->addr[3])) + +/** Compare IPv6 addresses, ignoring zone information. To be used sparingly! */ +#define ip6_addr_cmp_zoneless(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \ + ((addr1)->addr[1] == (addr2)->addr[1]) && \ + ((addr1)->addr[2] == (addr2)->addr[2]) && \ + ((addr1)->addr[3] == (addr2)->addr[3])) +/** + * Determine if two IPv6 addresses are the same. In particular, the address + * part of both must be the same, and the zone must be compatible. + * + * @param addr1 IPv6 address 1 + * @param addr2 IPv6 address 2 + * @return 1 if the addresses are considered equal, 0 if not + */ +#define ip6_addr_cmp(addr1, addr2) (ip6_addr_cmp_zoneless((addr1), (addr2)) && \ + ip6_addr_cmp_zone((addr1), (addr2))) + +/** Compare IPv6 address to packed address and zone */ +#define ip6_addr_cmp_packed(ip6addr, paddr, zone_idx) (((ip6addr)->addr[0] == (paddr)->addr[0]) && \ + ((ip6addr)->addr[1] == (paddr)->addr[1]) && \ + ((ip6addr)->addr[2] == (paddr)->addr[2]) && \ + ((ip6addr)->addr[3] == (paddr)->addr[3]) && \ + ip6_addr_equals_zone((ip6addr), (zone_idx))) + +#define ip6_get_subnet_id(ip6addr) (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL) + +#define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \ + ((ip6addr).addr[1] == 0) && \ + ((ip6addr).addr[2] == 0) && \ + ((ip6addr).addr[3] == 0)) +#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr))) + +#define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \ + ((ip6addr)->addr[1] == 0UL) && \ + ((ip6addr)->addr[2] == 0UL) && \ + ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) + +#define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL)) + +#define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL)) + +#define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL)) + +#define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL)) + +#define ip6_addr_isipv4mappedipv6(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL))) + +#define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) +#define ip6_addr_multicast_transient_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL)) +#define ip6_addr_multicast_prefix_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL)) +#define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL)) +#define ip6_addr_multicast_scope(ip6addr) ((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xf) +#define IP6_MULTICAST_SCOPE_RESERVED 0x0 +#define IP6_MULTICAST_SCOPE_RESERVED0 0x0 +#define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL 0x1 +#define IP6_MULTICAST_SCOPE_LINK_LOCAL 0x2 +#define IP6_MULTICAST_SCOPE_RESERVED3 0x3 +#define IP6_MULTICAST_SCOPE_ADMIN_LOCAL 0x4 +#define IP6_MULTICAST_SCOPE_SITE_LOCAL 0x5 +#define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL 0x8 +#define IP6_MULTICAST_SCOPE_GLOBAL 0xe +#define IP6_MULTICAST_SCOPE_RESERVEDF 0xf +#define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL)) +#define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL)) +#define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL)) +#define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL)) +#define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL)) +#define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL)) + +/* Scoping note: while interface-local and link-local multicast addresses do + * have a scope (i.e., they are meaningful only in the context of a particular + * interface), the following functions are not assigning or comparing zone + * indices. The reason for this is backward compatibility. Any call site that + * produces a non-global multicast address must assign a multicast address as + * appropriate itself. */ + +#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \ + ((ip6addr)->addr[1] == 0UL) && \ + ((ip6addr)->addr[2] == 0UL) && \ + ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) + +#define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ + ((ip6addr)->addr[1] == 0UL) && \ + ((ip6addr)->addr[2] == 0UL) && \ + ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL))) +#define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[2] = 0; \ + (ip6addr)->addr[3] = PP_HTONL(0x00000001UL); \ + ip6_addr_clear_zone(ip6addr); }while(0) + +#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ + ((ip6addr)->addr[1] == 0UL) && \ + ((ip6addr)->addr[2] == 0UL) && \ + ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL))) +#define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[2] = 0; \ + (ip6addr)->addr[3] = PP_HTONL(0x00000002UL); \ + ip6_addr_clear_zone(ip6addr); }while(0) + +#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ + ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ + (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) ) + +#define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \ + (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id)); \ + ip6_addr_clear_zone(ip6addr); }while(0) + +#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \ + ((ip6addr)->addr[1] == 0) && \ + ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \ + ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3]))) + +/* IPv6 address states. */ +#define IP6_ADDR_INVALID 0x00 +#define IP6_ADDR_TENTATIVE 0x08 +#define IP6_ADDR_TENTATIVE_1 0x09 /* 1 probe sent */ +#define IP6_ADDR_TENTATIVE_2 0x0a /* 2 probes sent */ +#define IP6_ADDR_TENTATIVE_3 0x0b /* 3 probes sent */ +#define IP6_ADDR_TENTATIVE_4 0x0c /* 4 probes sent */ +#define IP6_ADDR_TENTATIVE_5 0x0d /* 5 probes sent */ +#define IP6_ADDR_TENTATIVE_6 0x0e /* 6 probes sent */ +#define IP6_ADDR_TENTATIVE_7 0x0f /* 7 probes sent */ +#define IP6_ADDR_VALID 0x10 /* This bit marks an address as valid (preferred or deprecated) */ +#define IP6_ADDR_PREFERRED 0x30 +#define IP6_ADDR_DEPRECATED 0x10 /* Same as VALID (valid but not preferred) */ +#define IP6_ADDR_DUPLICATED 0x40 /* Failed DAD test, not valid */ + +#define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */ + +#define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID) +#define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE) +#define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */ +#define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED) +#define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED) +#define ip6_addr_isduplicated(addr_state) (addr_state == IP6_ADDR_DUPLICATED) + +#if LWIP_IPV6_ADDRESS_LIFETIMES +#define IP6_ADDR_LIFE_STATIC (0) +#define IP6_ADDR_LIFE_INFINITE (0xffffffffUL) +#define ip6_addr_life_isstatic(addr_life) ((addr_life) == IP6_ADDR_LIFE_STATIC) +#define ip6_addr_life_isinfinite(addr_life) ((addr_life) == IP6_ADDR_LIFE_INFINITE) +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ + +#define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \ + LWIP_DEBUGF(debug, ("%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F ":%" X16_F, \ + a, b, c, d, e, f, g, h)) +#define ip6_addr_debug_print(debug, ipaddr) \ + ip6_addr_debug_print_parts(debug, \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0), \ + (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0)) +#define ip6_addr_debug_print_val(debug, ipaddr) \ + ip6_addr_debug_print_parts(debug, \ + IP6_ADDR_BLOCK1(&(ipaddr)), \ + IP6_ADDR_BLOCK2(&(ipaddr)), \ + IP6_ADDR_BLOCK3(&(ipaddr)), \ + IP6_ADDR_BLOCK4(&(ipaddr)), \ + IP6_ADDR_BLOCK5(&(ipaddr)), \ + IP6_ADDR_BLOCK6(&(ipaddr)), \ + IP6_ADDR_BLOCK7(&(ipaddr)), \ + IP6_ADDR_BLOCK8(&(ipaddr))) + +#define IP6ADDR_STRLEN_MAX 46 + +int ip6addr_aton(const char *cp, ip6_addr_t *addr); +/** returns ptr to static buffer; not reentrant! */ +char *ip6addr_ntoa(const ip6_addr_t *addr); +char *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen); + + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_IP6_ADDR_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_frag.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_frag.h new file mode 100644 index 0000000..87e0e86 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_frag.h @@ -0,0 +1,144 @@ +/** + * @file + * + * IPv6 fragmentation and reassembly. + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ +#ifndef LWIP_HDR_IP6_FRAG_H +#define LWIP_HDR_IP6_FRAG_H + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip6_addr.h" +#include "lwip/ip6.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#if LWIP_IPV6 && LWIP_IPV6_REASS /* don't build if not configured for use in lwipopts.h */ + +/** The IPv6 reassembly timer interval in milliseconds. */ +#define IP6_REASS_TMR_INTERVAL 1000 + +/** IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) > 4, "struct + * ip6_reass_helper" is too large to be stored in the IPv6 fragment header, and + * will bleed into the header before it, which may be the IPv6 header or an + * extension header. This means that for each first fragment packet, we need to + * 1) make a copy of some IPv6 header fields (src+dest) that we need later on, + * just in case we do overwrite part of the IPv6 header, and 2) make a copy of + * the header data that we overwrote, so that we can restore it before either + * completing reassembly or sending an ICMPv6 reply. The last part is true even + * if this setting is disabled, but if it is enabled, we need to save a bit + * more data (up to the size of a pointer) because we overwrite more. */ +#ifndef IPV6_FRAG_COPYHEADER +#define IPV6_FRAG_COPYHEADER 0 +#endif + +/* With IPV6_FRAG_COPYHEADER==1, a helper structure may (or, depending on the + * presence of extensions, may not) overwrite part of the IP header. Therefore, + * we copy the fields that we need from the IP header for as long as the helper + * structure may still be in place. This is easier than temporarily restoring + * those fields in the IP header each time we need to perform checks on them. */ +#if IPV6_FRAG_COPYHEADER +#define IPV6_FRAG_SRC(ipr) ((ipr)->src) +#define IPV6_FRAG_DEST(ipr) ((ipr)->dest) +#else /* IPV6_FRAG_COPYHEADER */ +#define IPV6_FRAG_SRC(ipr) ((ipr)->iphdr->src) +#define IPV6_FRAG_DEST(ipr) ((ipr)->iphdr->dest) +#endif /* IPV6_FRAG_COPYHEADER */ + +/** IPv6 reassembly helper struct. + * This is exported because memp needs to know the size. + */ +struct ip6_reassdata { + struct ip6_reassdata *next; + struct pbuf *p; + struct ip6_hdr *iphdr; /* pointer to the first (original) IPv6 header */ +#if IPV6_FRAG_COPYHEADER + ip6_addr_p_t src; /* copy of the source address in the IP header */ + ip6_addr_p_t dest; /* copy of the destination address in the IP header */ + /* This buffer (for the part of the original header that we overwrite) will + * be slightly oversized, but we cannot compute the exact size from here. */ + u8_t orig_hdr[sizeof(struct ip6_frag_hdr) + sizeof(void*)]; +#else /* IPV6_FRAG_COPYHEADER */ + /* In this case we still need the buffer, for sending ICMPv6 replies. */ + u8_t orig_hdr[sizeof(struct ip6_frag_hdr)]; +#endif /* IPV6_FRAG_COPYHEADER */ + u32_t identification; + u16_t datagram_len; + u8_t nexth; + u8_t timer; +#if LWIP_IPV6_SCOPES + u8_t src_zone; /* zone of original packet's source address */ + u8_t dest_zone; /* zone of original packet's destination address */ +#endif /* LWIP_IPV6_SCOPES */ +}; + +#define ip6_reass_init() /* Compatibility define */ +void ip6_reass_tmr(void); +struct pbuf *ip6_reass(struct pbuf *p); + +#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */ + +#if LWIP_IPV6 && LWIP_IPV6_FRAG /* don't build if not configured for use in lwipopts.h */ + +#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED +#define LWIP_PBUF_CUSTOM_REF_DEFINED +/** A custom pbuf that holds a reference to another pbuf, which is freed + * when this custom pbuf is freed. This is used to create a custom PBUF_REF + * that points into the original pbuf. */ +struct pbuf_custom_ref { + /** 'base class' */ + struct pbuf_custom pc; + /** pointer to the original pbuf that is referenced */ + struct pbuf *original; +}; +#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */ + +err_t ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest); + +#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_IP6_FRAG_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_zone.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_zone.h new file mode 100644 index 0000000..525790e --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip6_zone.h @@ -0,0 +1,304 @@ +/** + * @file + * + * IPv6 address scopes, zones, and scoping policy. + * + * This header provides the means to implement support for IPv6 address scopes, + * as per RFC 4007. An address scope can be either global or more constrained. + * In lwIP, we say that an address "has a scope" or "is scoped" when its scope + * is constrained, in which case the address is meaningful only in a specific + * "zone." For unicast addresses, only link-local addresses have a scope; in + * that case, the scope is the link. For multicast addresses, there are various + * scopes defined by RFC 4007 and others. For any constrained scope, a system + * must establish a (potentially one-to-many) mapping between zones and local + * interfaces. For example, a link-local address is valid on only one link (its + * zone). That link may be attached to one or more local interfaces. The + * decisions on which scopes are constrained and the mapping between zones and + * interfaces is together what we refer to as the "scoping policy" - more on + * this in a bit. + * + * In lwIP, each IPv6 address has an associated zone index. This zone index may + * be set to "no zone" (IP6_NO_ZONE, 0) or an actual zone. We say that an + * address "has a zone" or "is zoned" when its zone index is *not* set to "no + * zone." In lwIP, in principle, each address should be "properly zoned," which + * means that if the address has a zone if and only if has a scope. As such, it + * is a rule that an unscoped (e.g., global) address must never have a zone. + * Even though one could argue that there is always one zone even for global + * scopes, this rule exists for implementation simplicity. Violation of the + * rule will trigger assertions or otherwise result in undesired behavior. + * + * Backward compatibility prevents us from requiring that applications always + * provide properly zoned addresses. We do enforce the rule that the in the + * lwIP link layer (everything below netif->output_ip6() and in particular ND6) + * *all* addresses are properly zoned. Thus, on the output paths down the + * stack, various places deal with the case of addresses that lack a zone. + * Some of them are best-effort for efficiency (e.g. the PCB bind and connect + * API calls' attempts to add missing zones); ultimately the IPv6 output + * handler (@ref ip6_output_if_src) will set a zone if necessary. + * + * Aside from dealing with scoped addresses lacking a zone, a proper IPv6 + * implementation must also ensure that a packet with a scoped source and/or + * destination address does not leave its zone. This is currently implemented + * in the input and forward functions. However, for output, these checks are + * deliberately omitted in order to keep the implementation lightweight. The + * routing algorithm in @ref ip6_route will take decisions such that it will + * not cause zone violations unless the application sets bad addresses, though. + * + * In terms of scoping policy, lwIP implements the default policy from RFC 4007 + * using macros in this file. This policy considers link-local unicast + * addresses and (only) interface-local and link-local multicast addresses as + * having a scope. For all these addresses, the zone is equal to the interface. + * As shown below in this file, it is possible to implement a custom policy. + */ + +/* + * Copyright (c) 2017 The MINIX 3 Project. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: David van Moolenbroek + * + */ +#ifndef LWIP_HDR_IP6_ZONE_H +#define LWIP_HDR_IP6_ZONE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup ip6_zones IPv6 Zones + * @ingroup ip6 + * @{ + */ + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +/** Identifier for "no zone". */ +#define IP6_NO_ZONE 0 + +#if LWIP_IPV6_SCOPES + +/** Zone initializer for static IPv6 address initialization, including comma. */ +#define IPADDR6_ZONE_INIT , IP6_NO_ZONE + +/** Return the zone index of the given IPv6 address; possibly "no zone". */ +#define ip6_addr_zone(ip6addr) ((ip6addr)->zone) + +/** Does the given IPv6 address have a zone set? (0/1) */ +#define ip6_addr_has_zone(ip6addr) (ip6_addr_zone(ip6addr) != IP6_NO_ZONE) + +/** Set the zone field of an IPv6 address to a particular value. */ +#define ip6_addr_set_zone(ip6addr, zone_idx) ((ip6addr)->zone = (zone_idx)) + +/** Clear the zone field of an IPv6 address, setting it to "no zone". */ +#define ip6_addr_clear_zone(ip6addr) ((ip6addr)->zone = IP6_NO_ZONE) + +/** Copy the zone field from the second IPv6 address to the first one. */ +#define ip6_addr_copy_zone(ip6addr1, ip6addr2) ((ip6addr1).zone = (ip6addr2).zone) + +/** Is the zone field of the given IPv6 address equal to the given zone index? (0/1) */ +#define ip6_addr_equals_zone(ip6addr, zone_idx) ((ip6addr)->zone == (zone_idx)) + +/** Are the zone fields of the given IPv6 addresses equal? (0/1) + * This macro must only be used on IPv6 addresses of the same scope. */ +#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) ((ip6addr1)->zone == (ip6addr2)->zone) + +/** Symbolic constants for the 'type' parameters in some of the macros. + * These exist for efficiency only, allowing the macros to avoid certain tests + * when the address is known not to be of a certain type. Dead code elimination + * will do the rest. IP6_MULTICAST is supported but currently not optimized. + * @see ip6_addr_has_scope, ip6_addr_assign_zone, ip6_addr_lacks_zone. + */ +enum lwip_ipv6_scope_type +{ + /** Unknown */ + IP6_UNKNOWN = 0, + /** Unicast */ + IP6_UNICAST = 1, + /** Multicast */ + IP6_MULTICAST = 2 +}; + +/** IPV6_CUSTOM_SCOPES: together, the following three macro definitions, + * @ref ip6_addr_has_scope, @ref ip6_addr_assign_zone, and + * @ref ip6_addr_test_zone, completely define the lwIP scoping policy. + * The definitions below implement the default policy from RFC 4007 Sec. 6. + * Should an implementation desire to implement a different policy, it can + * define IPV6_CUSTOM_SCOPES to 1 and supply its own definitions for the three + * macros instead. + */ +#ifndef IPV6_CUSTOM_SCOPES +#define IPV6_CUSTOM_SCOPES 0 +#endif /* !IPV6_CUSTOM_SCOPES */ + +#if !IPV6_CUSTOM_SCOPES + +/** + * Determine whether an IPv6 address has a constrained scope, and as such is + * meaningful only if accompanied by a zone index to identify the scope's zone. + * The given address type may be used to eliminate at compile time certain + * checks that will evaluate to false at run time anyway. + * + * This default implementation follows the default model of RFC 4007, where + * only interface-local and link-local scopes are defined. + * + * Even though the unicast loopback address does have an implied link-local + * scope, in this implementation it does not have an explicitly assigned zone + * index. As such it should not be tested for in this macro. + * + * @param ip6addr the IPv6 address (const); only its address part is examined. + * @param type address type; see @ref lwip_ipv6_scope_type. + * @return 1 if the address has a constrained scope, 0 if it does not. + */ +#define ip6_addr_has_scope(ip6addr, type) \ + (ip6_addr_islinklocal(ip6addr) || (((type) != IP6_UNICAST) && \ + (ip6_addr_ismulticast_iflocal(ip6addr) || \ + ip6_addr_ismulticast_linklocal(ip6addr)))) + +/** + * Assign a zone index to an IPv6 address, based on a network interface. If the + * given address has a scope, the assigned zone index is that scope's zone of + * the given netif; otherwise, the assigned zone index is "no zone". + * + * This default implementation follows the default model of RFC 4007, where + * only interface-local and link-local scopes are defined, and the zone index + * of both of those scopes always equals the index of the network interface. + * As such, this default implementation need not distinguish between different + * constrained scopes when assigning the zone. + * + * @param ip6addr the IPv6 address; its address part is examined, and its zone + * index is assigned. + * @param type address type; see @ref lwip_ipv6_scope_type. + * @param netif the network interface (const). + */ +#define ip6_addr_assign_zone(ip6addr, type, netif) \ + (ip6_addr_set_zone((ip6addr), \ + ip6_addr_has_scope((ip6addr), (type)) ? netif_get_index(netif) : 0)) + +/** + * Test whether an IPv6 address is "zone-compatible" with a network interface. + * That is, test whether the network interface is part of the zone associated + * with the address. For efficiency, this macro is only ever called if the + * given address is either scoped or zoned, and thus, it need not test this. + * If an address is scoped but not zoned, or zoned and not scoped, it is + * considered not zone-compatible with any netif. + * + * This default implementation follows the default model of RFC 4007, where + * only interface-local and link-local scopes are defined, and the zone index + * of both of those scopes always equals the index of the network interface. + * As such, there is always only one matching netif for a specific zone index, + * but all call sites of this macro currently support multiple matching netifs + * as well (at no additional expense in the common case). + * + * @param ip6addr the IPv6 address (const). + * @param netif the network interface (const). + * @return 1 if the address is scope-compatible with the netif, 0 if not. + */ +#define ip6_addr_test_zone(ip6addr, netif) \ + (ip6_addr_equals_zone((ip6addr), netif_get_index(netif))) + +#endif /* !IPV6_CUSTOM_SCOPES */ + +/** Does the given IPv6 address have a scope, and as such should also have a + * zone to be meaningful, but does not actually have a zone? (0/1) */ +#define ip6_addr_lacks_zone(ip6addr, type) \ + (!ip6_addr_has_zone(ip6addr) && ip6_addr_has_scope((ip6addr), (type))) + +/** + * Try to select a zone for a scoped address that does not yet have a zone. + * Called from PCB bind and connect routines, for two reasons: 1) to save on + * this (relatively expensive) selection for every individual packet route + * operation and 2) to allow the application to obtain the selected zone from + * the PCB as is customary for e.g. getsockname/getpeername BSD socket calls. + * + * Ideally, callers would always supply a properly zoned address, in which case + * this function would not be needed. It exists both for compatibility with the + * BSD socket API (which accepts zoneless destination addresses) and for + * backward compatibility with pre-scoping lwIP code. + * + * It may be impossible to select a zone, e.g. if there are no netifs. In that + * case, the address's zone field will be left as is. + * + * @param dest the IPv6 address for which to select and set a zone. + * @param src source IPv6 address (const); may be equal to dest. + */ +#define ip6_addr_select_zone(dest, src) do { struct netif *selected_netif; \ + selected_netif = ip6_route((src), (dest)); \ + if (selected_netif != NULL) { \ + ip6_addr_assign_zone((dest), IP6_UNKNOWN, selected_netif); \ + } } while (0) + +/** + * @} + */ + +#else /* LWIP_IPV6_SCOPES */ + +#define IPADDR6_ZONE_INIT +#define ip6_addr_zone(ip6addr) (IP6_NO_ZONE) +#define ip6_addr_has_zone(ip6addr) (0) +#define ip6_addr_set_zone(ip6addr, zone_idx) +#define ip6_addr_clear_zone(ip6addr) +#define ip6_addr_copy_zone(ip6addr1, ip6addr2) +#define ip6_addr_equals_zone(ip6addr, zone_idx) (1) +#define ip6_addr_cmp_zone(ip6addr1, ip6addr2) (1) +#define IPV6_CUSTOM_SCOPES 0 +#define ip6_addr_has_scope(ip6addr, type) (0) +#define ip6_addr_assign_zone(ip6addr, type, netif) +#define ip6_addr_test_zone(ip6addr, netif) (1) +#define ip6_addr_lacks_zone(ip6addr, type) (0) +#define ip6_addr_select_zone(ip6addr, src) + +#endif /* LWIP_IPV6_SCOPES */ + +#if LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG + +/** Verify that the given IPv6 address is properly zoned. */ +#define IP6_ADDR_ZONECHECK(ip6addr) LWIP_ASSERT("IPv6 zone check failed", \ + ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) == ip6_addr_has_zone(ip6addr)) + +/** Verify that the given IPv6 address is properly zoned for the given netif. */ +#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif) LWIP_ASSERT("IPv6 netif zone check failed", \ + ip6_addr_has_scope(ip6addr, IP6_UNKNOWN) ? \ + (ip6_addr_has_zone(ip6addr) && \ + (((netif) == NULL) || ip6_addr_test_zone((ip6addr), (netif)))) : \ + !ip6_addr_has_zone(ip6addr)) + +#else /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */ + +#define IP6_ADDR_ZONECHECK(ip6addr) +#define IP6_ADDR_ZONECHECK_NETIF(ip6addr, netif) + +#endif /* LWIP_IPV6_SCOPES && LWIP_IPV6_SCOPES_DEBUG */ + +#endif /* LWIP_IPV6 */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_IP6_ZONE_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip_addr.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip_addr.h new file mode 100644 index 0000000..ee7a0c9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/ip_addr.h @@ -0,0 +1,438 @@ +/** + * @file + * IP address API (common IPv4 and IPv6) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_IP_ADDR_H +#define LWIP_HDR_IP_ADDR_H + +#include "lwip/opt.h" +#include "lwip/def.h" + +#include "lwip/ip4_addr.h" +#include "lwip/ip6_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** @ingroup ipaddr + * IP address types for use in ip_addr_t.type member. + * @see tcp_new_ip_type(), udp_new_ip_type(), raw_new_ip_type(). + */ +enum lwip_ip_addr_type { + /** IPv4 */ + IPADDR_TYPE_V4 = 0U, + /** IPv6 */ + IPADDR_TYPE_V6 = 6U, + /** IPv4+IPv6 ("dual-stack") */ + IPADDR_TYPE_ANY = 46U +}; + +#if LWIP_IPV4 && LWIP_IPV6 +/** + * @ingroup ipaddr + * A union struct for both IP version's addresses. + * ATTENTION: watch out for its size when adding IPv6 address scope! + */ +typedef struct ip_addr { + union { + ip6_addr_t ip6; + ip4_addr_t ip4; + } u_addr; + /** @ref lwip_ip_addr_type */ + u8_t type; +} ip_addr_t; + +extern const ip_addr_t ip_addr_any_type; + +/** @ingroup ip4addr */ +#define IPADDR4_INIT(u32val) { { { { u32val, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V4 } +/** @ingroup ip4addr */ +#define IPADDR4_INIT_BYTES(a,b,c,d) IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d))) + +/** @ingroup ip6addr */ +#define IPADDR6_INIT(a, b, c, d) { { { { a, b, c, d } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V6 } +/** @ingroup ip6addr */ +#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_V6 } + +/** @ingroup ipaddr */ +#define IP_IS_ANY_TYPE_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY) +/** @ingroup ipaddr */ +#define IPADDR_ANY_TYPE_INIT { { { { 0ul, 0ul, 0ul, 0ul } IPADDR6_ZONE_INIT } }, IPADDR_TYPE_ANY } + +/** @ingroup ip4addr */ +#define IP_IS_V4_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4) +/** @ingroup ip6addr */ +#define IP_IS_V6_VAL(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6) +/** @ingroup ip4addr */ +#define IP_IS_V4(ipaddr) (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr))) +/** @ingroup ip6addr */ +#define IP_IS_V6(ipaddr) (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr))) + +#define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0) +#define IP_SET_TYPE(ipaddr, iptype) do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0) +#define IP_GET_TYPE(ipaddr) ((ipaddr)->type) + +#define IP_ADDR_RAW_SIZE(ipaddr) (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4 ? sizeof(ip4_addr_t) : sizeof(ip6_addr_t)) + +#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr)) +#define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr)) + +/** @ingroup ip6addr + * Convert generic ip address to specific protocol version + */ +#define ip_2_ip6(ipaddr) (&((ipaddr)->u_addr.ip6)) +/** @ingroup ip4addr + * Convert generic ip address to specific protocol version + */ +#define ip_2_ip4(ipaddr) (&((ipaddr)->u_addr.ip4)) + +/** @ingroup ip4addr */ +#define IP_ADDR4(ipaddr,a,b,c,d) do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \ + IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0) +/** @ingroup ip6addr */ +#define IP_ADDR6(ipaddr,i0,i1,i2,i3) do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \ + IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0) +/** @ingroup ip6addr */ +#define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3) IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3)) + +#define ip_clear_no4(ipaddr) do { ip_2_ip6(ipaddr)->addr[1] = \ + ip_2_ip6(ipaddr)->addr[2] = \ + ip_2_ip6(ipaddr)->addr[3] = 0; \ + ip6_addr_clear_zone(ip_2_ip6(ipaddr)); }while(0) + +/** @ingroup ipaddr */ +#define ip_addr_copy(dest, src) do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \ + ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \ + ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); ip_clear_no4(&dest); }}while(0) +/** @ingroup ip6addr */ +#define ip_addr_copy_from_ip6(dest, src) do{ \ + ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0) +/** @ingroup ip6addr */ +#define ip_addr_copy_from_ip6_packed(dest, src) do{ \ + ip6_addr_copy_from_packed(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0) +/** @ingroup ip4addr */ +#define ip_addr_copy_from_ip4(dest, src) do{ \ + ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); ip_clear_no4(&dest); }while(0) +/** @ingroup ip4addr */ +#define ip_addr_set_ip4_u32(ipaddr, val) do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \ + IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ip4addr */ +#define ip_addr_set_ip4_u32_val(ipaddr, val) do{ ip4_addr_set_u32(ip_2_ip4(&(ipaddr)), val); \ + IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }while(0) +/** @ingroup ip4addr */ +#define ip_addr_get_ip4_u32(ipaddr) (((ipaddr) && IP_IS_V4(ipaddr)) ? \ + ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0) +/** @ingroup ipaddr */ +#define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \ + ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \ + ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); ip_clear_no4(dest); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src) +/** @ingroup ipaddr */ +#define ip_addr_set_zero(ipaddr) do{ \ + ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0) +/** @ingroup ip5addr */ +#define ip_addr_set_zero_ip4(ipaddr) do{ \ + ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0) +/** @ingroup ip6addr */ +#define ip_addr_set_zero_ip6(ipaddr) do{ \ + ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_any(is_ipv6, ipaddr) do{if(is_ipv6){ \ + ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_any_val(is_ipv6, ipaddr) do{if(is_ipv6){ \ + ip6_addr_set_any(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_any(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \ + ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_loopback_val(is_ipv6, ipaddr) do{if(is_ipv6){ \ + ip6_addr_set_loopback(ip_2_ip6(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_loopback(ip_2_ip4(&(ipaddr))); IP_SET_TYPE_VAL(ipaddr, IPADDR_TYPE_V4); ip_clear_no4(&ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_set_hton(dest, src) do{if(IP_IS_V6(src)){ \ + ip6_addr_set_hton(ip_2_ip6(dest), ip_2_ip6(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \ + ip4_addr_set_hton(ip_2_ip4(dest), ip_2_ip4(src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); ip_clear_no4(ipaddr); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \ + ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \ + ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0) +/** @ingroup ipaddr */ +#define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \ + 0 : \ + ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask)) +/** @ingroup ipaddr */ +#define ip_addr_cmp(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \ + ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \ + ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2)))) +/** @ingroup ipaddr */ +#define ip_addr_cmp_zoneless(addr1, addr2) ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \ + ip6_addr_cmp_zoneless(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \ + ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2)))) +/** @ingroup ipaddr */ +#define ip_addr_isany(ipaddr) (((ipaddr) == NULL) ? 1 : ((IP_IS_V6(ipaddr)) ? \ + ip6_addr_isany(ip_2_ip6(ipaddr)) : \ + ip4_addr_isany(ip_2_ip4(ipaddr)))) +/** @ingroup ipaddr */ +#define ip_addr_isany_val(ipaddr) ((IP_IS_V6_VAL(ipaddr)) ? \ + ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \ + ip4_addr_isany_val(*ip_2_ip4(&(ipaddr)))) +/** @ingroup ipaddr */ +#define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \ + 0 : \ + ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif)) +/** @ingroup ipaddr */ +#define ip_addr_ismulticast(ipaddr) ((IP_IS_V6(ipaddr)) ? \ + ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \ + ip4_addr_ismulticast(ip_2_ip4(ipaddr))) +/** @ingroup ipaddr */ +#define ip_addr_isloopback(ipaddr) ((IP_IS_V6(ipaddr)) ? \ + ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \ + ip4_addr_isloopback(ip_2_ip4(ipaddr))) +/** @ingroup ipaddr */ +#define ip_addr_islinklocal(ipaddr) ((IP_IS_V6(ipaddr)) ? \ + ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \ + ip4_addr_islinklocal(ip_2_ip4(ipaddr))) +#define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \ + ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \ + ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0) +#define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \ + ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \ + ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0) +char *ipaddr_ntoa(const ip_addr_t *addr); +char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen); +int ipaddr_aton(const char *cp, ip_addr_t *addr); + +/** @ingroup ipaddr */ +#define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX + +/** @ingroup ipaddr */ +#define ip4_2_ipv4_mapped_ipv6(ip6addr, ip4addr) do { \ + (ip6addr)->addr[3] = (ip4addr)->addr; \ + (ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \ + (ip6addr)->addr[1] = 0; \ + (ip6addr)->addr[0] = 0; \ + ip6_addr_clear_zone(ip6addr); } while(0); + +/** @ingroup ipaddr */ +#define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr) \ + (ip4addr)->addr = (ip6addr)->addr[3]; + +#define IP46_ADDR_ANY(type) (((type) == IPADDR_TYPE_V6)? IP6_ADDR_ANY : IP4_ADDR_ANY) + +#else /* LWIP_IPV4 && LWIP_IPV6 */ + +#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb) 1 +#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1 + +#define ip_addr_set_any_val(is_ipv6, ipaddr) ip_addr_set_any(is_ipv6, &(ipaddr)) +#define ip_addr_set_loopback_val(is_ipv6, ipaddr) ip_addr_set_loopback(is_ipv6, &(ipaddr)) + +#if LWIP_IPV4 + +typedef ip4_addr_t ip_addr_t; +#define IPADDR4_INIT(u32val) { u32val } +#define IPADDR4_INIT_BYTES(a,b,c,d) IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d))) +#define IP_IS_V4_VAL(ipaddr) 1 +#define IP_IS_V6_VAL(ipaddr) 0 +#define IP_IS_V4(ipaddr) 1 +#define IP_IS_V6(ipaddr) 0 +#define IP_IS_ANY_TYPE_VAL(ipaddr) 0 +#define IP_SET_TYPE_VAL(ipaddr, iptype) +#define IP_SET_TYPE(ipaddr, iptype) +#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V4 +#define IP_ADDR_RAW_SIZE(ipaddr) sizeof(ip4_addr_t) +#define ip_2_ip4(ipaddr) (ipaddr) +#define IP_ADDR4(ipaddr,a,b,c,d) IP4_ADDR(ipaddr,a,b,c,d) + +#define ip_addr_copy(dest, src) ip4_addr_copy(dest, src) +#define ip_addr_copy_from_ip4(dest, src) ip4_addr_copy(dest, src) +#define ip_addr_set_ip4_u32(ipaddr, val) ip4_addr_set_u32(ip_2_ip4(ipaddr), val) +#define ip_addr_set_ip4_u32_val(ipaddr, val) ip_addr_set_ip4_u32(&(ipaddr), val) +#define ip_addr_get_ip4_u32(ipaddr) ip4_addr_get_u32(ip_2_ip4(ipaddr)) +#define ip_addr_set(dest, src) ip4_addr_set(dest, src) +#define ip_addr_set_ipaddr(dest, src) ip4_addr_set(dest, src) +#define ip_addr_set_zero(ipaddr) ip4_addr_set_zero(ipaddr) +#define ip_addr_set_zero_ip4(ipaddr) ip4_addr_set_zero(ipaddr) +#define ip_addr_set_any(is_ipv6, ipaddr) ip4_addr_set_any(ipaddr) +#define ip_addr_set_loopback(is_ipv6, ipaddr) ip4_addr_set_loopback(ipaddr) +#define ip_addr_set_hton(dest, src) ip4_addr_set_hton(dest, src) +#define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask) +#define ip_addr_netcmp(addr1, addr2, mask) ip4_addr_netcmp(addr1, addr2, mask) +#define ip_addr_cmp(addr1, addr2) ip4_addr_cmp(addr1, addr2) +#define ip_addr_isany(ipaddr) ip4_addr_isany(ipaddr) +#define ip_addr_isany_val(ipaddr) ip4_addr_isany_val(ipaddr) +#define ip_addr_isloopback(ipaddr) ip4_addr_isloopback(ipaddr) +#define ip_addr_islinklocal(ipaddr) ip4_addr_islinklocal(ipaddr) +#define ip_addr_isbroadcast(addr, netif) ip4_addr_isbroadcast(addr, netif) +#define ip_addr_ismulticast(ipaddr) ip4_addr_ismulticast(ipaddr) +#define ip_addr_debug_print(debug, ipaddr) ip4_addr_debug_print(debug, ipaddr) +#define ip_addr_debug_print_val(debug, ipaddr) ip4_addr_debug_print_val(debug, ipaddr) +#define ipaddr_ntoa(ipaddr) ip4addr_ntoa(ipaddr) +#define ipaddr_ntoa_r(ipaddr, buf, buflen) ip4addr_ntoa_r(ipaddr, buf, buflen) +#define ipaddr_aton(cp, addr) ip4addr_aton(cp, addr) + +#define IPADDR_STRLEN_MAX IP4ADDR_STRLEN_MAX + +#define IP46_ADDR_ANY(type) (IP4_ADDR_ANY) + +#else /* LWIP_IPV4 */ + +typedef ip6_addr_t ip_addr_t; +#define IPADDR6_INIT(a, b, c, d) { { a, b, c, d } IPADDR6_ZONE_INIT } +#define IPADDR6_INIT_HOST(a, b, c, d) { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } IPADDR6_ZONE_INIT } +#define IP_IS_V4_VAL(ipaddr) 0 +#define IP_IS_V6_VAL(ipaddr) 1 +#define IP_IS_V4(ipaddr) 0 +#define IP_IS_V6(ipaddr) 1 +#define IP_IS_ANY_TYPE_VAL(ipaddr) 0 +#define IP_SET_TYPE_VAL(ipaddr, iptype) +#define IP_SET_TYPE(ipaddr, iptype) +#define IP_GET_TYPE(ipaddr) IPADDR_TYPE_V6 +#define IP_ADDR_RAW_SIZE(ipaddr) sizeof(ip6_addr_t) +#define ip_2_ip6(ipaddr) (ipaddr) +#define IP_ADDR6(ipaddr,i0,i1,i2,i3) IP6_ADDR(ipaddr,i0,i1,i2,i3) +#define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3) IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3)) + +#define ip_addr_copy(dest, src) ip6_addr_copy(dest, src) +#define ip_addr_copy_from_ip6(dest, src) ip6_addr_copy(dest, src) +#define ip_addr_copy_from_ip6_packed(dest, src) ip6_addr_copy_from_packed(dest, src) +#define ip_addr_set(dest, src) ip6_addr_set(dest, src) +#define ip_addr_set_ipaddr(dest, src) ip6_addr_set(dest, src) +#define ip_addr_set_zero(ipaddr) ip6_addr_set_zero(ipaddr) +#define ip_addr_set_zero_ip6(ipaddr) ip6_addr_set_zero(ipaddr) +#define ip_addr_set_any(is_ipv6, ipaddr) ip6_addr_set_any(ipaddr) +#define ip_addr_set_loopback(is_ipv6, ipaddr) ip6_addr_set_loopback(ipaddr) +#define ip_addr_set_hton(dest, src) ip6_addr_set_hton(dest, src) +#define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target) +#define ip_addr_netcmp(addr1, addr2, mask) 0 +#define ip_addr_cmp(addr1, addr2) ip6_addr_cmp(addr1, addr2) +#define ip_addr_cmp_zoneless(addr1, addr2) ip6_addr_cmp_zoneless(addr1, addr2) +#define ip_addr_isany(ipaddr) ip6_addr_isany(ipaddr) +#define ip_addr_isany_val(ipaddr) ip6_addr_isany_val(ipaddr) +#define ip_addr_isloopback(ipaddr) ip6_addr_isloopback(ipaddr) +#define ip_addr_islinklocal(ipaddr) ip6_addr_islinklocal(ipaddr) +#define ip_addr_isbroadcast(addr, netif) 0 +#define ip_addr_ismulticast(ipaddr) ip6_addr_ismulticast(ipaddr) +#define ip_addr_debug_print(debug, ipaddr) ip6_addr_debug_print(debug, ipaddr) +#define ip_addr_debug_print_val(debug, ipaddr) ip6_addr_debug_print_val(debug, ipaddr) +#define ipaddr_ntoa(ipaddr) ip6addr_ntoa(ipaddr) +#define ipaddr_ntoa_r(ipaddr, buf, buflen) ip6addr_ntoa_r(ipaddr, buf, buflen) +#define ipaddr_aton(cp, addr) ip6addr_aton(cp, addr) + +#define IPADDR_STRLEN_MAX IP6ADDR_STRLEN_MAX + +#define IP46_ADDR_ANY(type) (IP6_ADDR_ANY) + +#endif /* LWIP_IPV4 */ +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + +#if LWIP_IPV4 + +extern const ip_addr_t ip_addr_any; +extern const ip_addr_t ip_addr_broadcast; + +/** + * @ingroup ip4addr + * Can be used as a fixed/const ip_addr_t + * for the IP wildcard. + * Defined to @ref IP4_ADDR_ANY when IPv4 is enabled. + * Defined to @ref IP6_ADDR_ANY in IPv6 only systems. + * Use this if you can handle IPv4 _AND_ IPv6 addresses. + * Use @ref IP4_ADDR_ANY or @ref IP6_ADDR_ANY when the IP + * type matters. + */ +#define IP_ADDR_ANY IP4_ADDR_ANY +/** + * @ingroup ip4addr + * Can be used as a fixed/const ip_addr_t + * for the IPv4 wildcard and the broadcast address + */ +#define IP4_ADDR_ANY (&ip_addr_any) +/** + * @ingroup ip4addr + * Can be used as a fixed/const ip4_addr_t + * for the wildcard and the broadcast address + */ +#define IP4_ADDR_ANY4 (ip_2_ip4(&ip_addr_any)) + +/** @ingroup ip4addr */ +#define IP_ADDR_BROADCAST (&ip_addr_broadcast) +/** @ingroup ip4addr */ +#define IP4_ADDR_BROADCAST (ip_2_ip4(&ip_addr_broadcast)) + +#endif /* LWIP_IPV4*/ + +#if LWIP_IPV6 + +extern const ip_addr_t ip6_addr_any; + +/** + * @ingroup ip6addr + * IP6_ADDR_ANY can be used as a fixed ip_addr_t + * for the IPv6 wildcard address + */ +#define IP6_ADDR_ANY (&ip6_addr_any) +/** + * @ingroup ip6addr + * IP6_ADDR_ANY6 can be used as a fixed ip6_addr_t + * for the IPv6 wildcard address + */ +#define IP6_ADDR_ANY6 (ip_2_ip6(&ip6_addr_any)) + +#if !LWIP_IPV4 +/** IPv6-only configurations */ +#define IP_ADDR_ANY IP6_ADDR_ANY +#endif /* !LWIP_IPV4 */ + +#endif + +#if LWIP_IPV4 && LWIP_IPV6 +/** @ingroup ipaddr */ +#define IP_ANY_TYPE (&ip_addr_any_type) +#else +#define IP_ANY_TYPE IP_ADDR_ANY +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_IP_ADDR_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mem.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mem.h new file mode 100644 index 0000000..ff208d2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mem.h @@ -0,0 +1,82 @@ +/** + * @file + * Heap API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_MEM_H +#define LWIP_HDR_MEM_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if MEM_LIBC_MALLOC + +#include "lwip/arch.h" + +typedef size_t mem_size_t; +#define MEM_SIZE_F SZT_F + +#elif MEM_USE_POOLS + +typedef u16_t mem_size_t; +#define MEM_SIZE_F U16_F + +#else + +/* MEM_SIZE would have to be aligned, but using 64000 here instead of + * 65535 leaves some room for alignment... + */ +#if MEM_SIZE > 64000L +typedef u32_t mem_size_t; +#define MEM_SIZE_F U32_F +#else +typedef u16_t mem_size_t; +#define MEM_SIZE_F U16_F +#endif /* MEM_SIZE > 64000 */ +#endif + +void mem_init(void); +void *mem_trim(void *mem, mem_size_t size); +void *mem_malloc(mem_size_t size); +void *mem_calloc(mem_size_t count, mem_size_t size); +void mem_free(void *mem); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_MEM_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/memp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/memp.h new file mode 100644 index 0000000..1630b26 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/memp.h @@ -0,0 +1,155 @@ +/** + * @file + * Memory pool API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef LWIP_HDR_MEMP_H +#define LWIP_HDR_MEMP_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* run once with empty definition to handle all custom includes in lwippools.h */ +#define LWIP_MEMPOOL(name,num,size,desc) +#include "lwip/priv/memp_std.h" + +/** Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */ +typedef enum { +#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name, +#include "lwip/priv/memp_std.h" + MEMP_MAX +} memp_t; + +#include "lwip/priv/memp_priv.h" +#include "lwip/stats.h" + +extern const struct memp_desc* const memp_pools[MEMP_MAX]; + +/** + * @ingroup mempool + * Declare prototype for private memory pool if it is used in multiple files + */ +#define LWIP_MEMPOOL_PROTOTYPE(name) extern const struct memp_desc memp_ ## name + +#if MEMP_MEM_MALLOC + +#define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \ + LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \ + const struct memp_desc memp_ ## name = { \ + DECLARE_LWIP_MEMPOOL_DESC(desc) \ + LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \ + LWIP_MEM_ALIGN_SIZE(size) \ + }; + +#else /* MEMP_MEM_MALLOC */ + +/** + * @ingroup mempool + * Declare a private memory pool + * Private mempools example: + * .h: only when pool is used in multiple .c files: LWIP_MEMPOOL_PROTOTYPE(my_private_pool); + * .c: + * - in global variables section: LWIP_MEMPOOL_DECLARE(my_private_pool, 10, sizeof(foo), "Some description") + * - call ONCE before using pool (e.g. in some init() function): LWIP_MEMPOOL_INIT(my_private_pool); + * - allocate: void* my_new_mem = LWIP_MEMPOOL_ALLOC(my_private_pool); + * - free: LWIP_MEMPOOL_FREE(my_private_pool, my_new_mem); + * + * To relocate a pool, declare it as extern in cc.h. Example for GCC: + * extern u8_t \_\_attribute\_\_((section(".onchip_mem"))) memp_memory_my_private_pool_base[]; + */ +#define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \ + LWIP_DECLARE_MEMORY_ALIGNED(memp_memory_ ## name ## _base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))); \ + \ + LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \ + \ + static struct memp *memp_tab_ ## name; \ + \ + const struct memp_desc memp_ ## name = { \ + DECLARE_LWIP_MEMPOOL_DESC(desc) \ + LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \ + LWIP_MEM_ALIGN_SIZE(size), \ + (num), \ + memp_memory_ ## name ## _base, \ + &memp_tab_ ## name \ + }; + +#endif /* MEMP_MEM_MALLOC */ + +/** + * @ingroup mempool + * Initialize a private memory pool + */ +#define LWIP_MEMPOOL_INIT(name) memp_init_pool(&memp_ ## name) +/** + * @ingroup mempool + * Allocate from a private memory pool + */ +#define LWIP_MEMPOOL_ALLOC(name) memp_malloc_pool(&memp_ ## name) +/** + * @ingroup mempool + * Free element from a private memory pool + */ +#define LWIP_MEMPOOL_FREE(name, x) memp_free_pool(&memp_ ## name, (x)) + +#if MEM_USE_POOLS +/** This structure is used to save the pool one element came from. + * This has to be defined here as it is required for pool size calculation. */ +struct memp_malloc_helper +{ + memp_t poolnr; +#if MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) + u16_t size; +#endif /* MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) */ +}; +#endif /* MEM_USE_POOLS */ + +void memp_init(void); + +#if MEMP_OVERFLOW_CHECK +void *memp_malloc_fn(memp_t type, const char* file, const int line); +#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__) +#else +void *memp_malloc(memp_t type); +#endif +void memp_free(memp_t type, void *mem); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_MEMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mld6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mld6.h new file mode 100644 index 0000000..2764fdd --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/mld6.h @@ -0,0 +1,99 @@ +/** + * @file + * + * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710. + * No support for MLDv2. + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_MLD6_H +#define LWIP_HDR_MLD6_H + +#include "lwip/opt.h" + +#if LWIP_IPV6_MLD && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** MLD group */ +struct mld_group { + /** next link */ + struct mld_group *next; + /** multicast address */ + ip6_addr_t group_address; + /** signifies we were the last person to report */ + u8_t last_reporter_flag; + /** current state of the group */ + u8_t group_state; + /** timer for reporting */ + u16_t timer; + /** counter of simultaneous uses */ + u8_t use; +}; + +#define MLD6_TMR_INTERVAL 100 /* Milliseconds */ + +err_t mld6_stop(struct netif *netif); +void mld6_report_groups(struct netif *netif); +void mld6_tmr(void); +struct mld_group *mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr); +void mld6_input(struct pbuf *p, struct netif *inp); +err_t mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr); +err_t mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr); +err_t mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr); +err_t mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr); + +/** @ingroup mld6 + * Get list head of MLD6 groups for netif. + * Note: The allnodes group IP is NOT in the list, since it must always + * be received for correct IPv6 operation. + * @see @ref netif_set_mld_mac_filter() + */ +#define netif_mld6_data(netif) ((struct mld_group *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6_MLD && LWIP_IPV6 */ + +#endif /* LWIP_HDR_MLD6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/nd6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/nd6.h new file mode 100644 index 0000000..c30e624 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/nd6.h @@ -0,0 +1,90 @@ +/** + * @file + * + * Neighbor discovery and stateless address autoconfiguration for IPv6. + * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 + * (Address autoconfiguration). + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_ND6_H +#define LWIP_HDR_ND6_H + +#include "lwip/opt.h" + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip6_addr.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** 1 second period */ +#define ND6_TMR_INTERVAL 1000 + +/** Router solicitations are sent in 4 second intervals (see RFC 4861, ch. 6.3.7) */ +#ifndef ND6_RTR_SOLICITATION_INTERVAL +#define ND6_RTR_SOLICITATION_INTERVAL 4000 +#endif + +struct pbuf; +struct netif; + +void nd6_tmr(void); +void nd6_input(struct pbuf *p, struct netif *inp); +void nd6_clear_destination_cache(void); +struct netif *nd6_find_route(const ip6_addr_t *ip6addr); +err_t nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp); +u16_t nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif); +#if LWIP_ND6_TCP_REACHABILITY_HINTS +void nd6_reachability_hint(const ip6_addr_t *ip6addr); +#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */ +void nd6_cleanup_netif(struct netif *netif); +#if LWIP_IPV6_MLD +void nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state); +#endif /* LWIP_IPV6_MLD */ +void nd6_restart_netif(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_ND6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netbuf.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netbuf.h new file mode 100644 index 0000000..73e5425 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netbuf.h @@ -0,0 +1,121 @@ +/** + * @file + * netbuf API (for netconn API) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_NETBUF_H +#define LWIP_HDR_NETBUF_H + +#include "lwip/opt.h" + +#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ +/* Note: Netconn API is always available when sockets are enabled - + * sockets are implemented on top of them */ + +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/ip6_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** This netbuf has dest-addr/port set */ +#define NETBUF_FLAG_DESTADDR 0x01 +/** This netbuf includes a checksum */ +#define NETBUF_FLAG_CHKSUM 0x02 +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +#define NETBUF_FLAG_UDP_BLOCL_TX_TILL_COMPLETE 0x04 +#endif + +/** "Network buffer" - contains data and addressing info */ +struct netbuf { + struct pbuf *p, *ptr; + ip_addr_t addr; + u16_t port; +#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY || LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE + u8_t flags; +#endif +#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY + u16_t toport_chksum; +#if LWIP_NETBUF_RECVINFO + ip_addr_t toaddr; +#endif /* LWIP_NETBUF_RECVINFO */ +#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */ +}; + +/* Network buffer functions: */ +struct netbuf * netbuf_new (void); +void netbuf_delete (struct netbuf *buf); +void * netbuf_alloc (struct netbuf *buf, u16_t size); +void netbuf_free (struct netbuf *buf); +err_t netbuf_ref (struct netbuf *buf, + const void *dataptr, u16_t size); +void netbuf_chain (struct netbuf *head, struct netbuf *tail); + +err_t netbuf_data (struct netbuf *buf, + void **dataptr, u16_t *len); +s8_t netbuf_next (struct netbuf *buf); +void netbuf_first (struct netbuf *buf); + + +#define netbuf_copy_partial(buf, dataptr, len, offset) \ + pbuf_copy_partial((buf)->p, (dataptr), (len), (offset)) +#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0) +#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len) +#define netbuf_len(buf) ((buf)->p->tot_len) +#define netbuf_fromaddr(buf) (&((buf)->addr)) +#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set(&((buf)->addr), fromaddr) +#define netbuf_fromport(buf) ((buf)->port) +#if LWIP_NETBUF_RECVINFO +#define netbuf_destaddr(buf) (&((buf)->toaddr)) +#define netbuf_set_destaddr(buf, destaddr) ip_addr_set(&((buf)->toaddr), destaddr) +#if LWIP_CHECKSUM_ON_COPY +#define netbuf_destport(buf) (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0) +#else /* LWIP_CHECKSUM_ON_COPY */ +#define netbuf_destport(buf) ((buf)->toport_chksum) +#endif /* LWIP_CHECKSUM_ON_COPY */ +#endif /* LWIP_NETBUF_RECVINFO */ +#if LWIP_CHECKSUM_ON_COPY +#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \ + (buf)->toport_chksum = chksum; } while(0) +#endif /* LWIP_CHECKSUM_ON_COPY */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETCONN || LWIP_SOCKET */ + +#endif /* LWIP_HDR_NETBUF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netdb.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netdb.h new file mode 100644 index 0000000..d3d15df --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netdb.h @@ -0,0 +1,150 @@ +/** + * @file + * NETDB API (sockets) + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_NETDB_H +#define LWIP_HDR_NETDB_H + +#include "lwip/opt.h" + +#if LWIP_DNS && LWIP_SOCKET + +#include "lwip/arch.h" +#include "lwip/inet.h" +#include "lwip/sockets.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* some rarely used options */ +#ifndef LWIP_DNS_API_DECLARE_H_ERRNO +#define LWIP_DNS_API_DECLARE_H_ERRNO 1 +#endif + +#ifndef LWIP_DNS_API_DEFINE_ERRORS +#define LWIP_DNS_API_DEFINE_ERRORS 1 +#endif + +#ifndef LWIP_DNS_API_DEFINE_FLAGS +#define LWIP_DNS_API_DEFINE_FLAGS 1 +#endif + +#ifndef LWIP_DNS_API_DECLARE_STRUCTS +#define LWIP_DNS_API_DECLARE_STRUCTS 1 +#endif + +#if LWIP_DNS_API_DEFINE_ERRORS +/** Errors used by the DNS API functions, h_errno can be one of them */ +#define EAI_NONAME 200 +#define EAI_SERVICE 201 +#define EAI_FAIL 202 +#define EAI_MEMORY 203 +#define EAI_FAMILY 204 + +#define HOST_NOT_FOUND 210 +#define NO_DATA 211 +#define NO_RECOVERY 212 +#define TRY_AGAIN 213 +#endif /* LWIP_DNS_API_DEFINE_ERRORS */ + +#if LWIP_DNS_API_DEFINE_FLAGS +/* input flags for struct addrinfo */ +#define AI_PASSIVE 0x01 +#define AI_CANONNAME 0x02 +#define AI_NUMERICHOST 0x04 +#define AI_NUMERICSERV 0x08 +#define AI_V4MAPPED 0x10 +#define AI_ALL 0x20 +#define AI_ADDRCONFIG 0x40 +#endif /* LWIP_DNS_API_DEFINE_FLAGS */ + +#if LWIP_DNS_API_DECLARE_STRUCTS +struct hostent { + char *h_name; /* Official name of the host. */ + char **h_aliases; /* A pointer to an array of pointers to alternative host names, + terminated by a null pointer. */ + int h_addrtype; /* Address type. */ + int h_length; /* The length, in bytes, of the address. */ + char **h_addr_list; /* A pointer to an array of pointers to network addresses (in + network byte order) for the host, terminated by a null pointer. */ +#define h_addr h_addr_list[0] /* for backward compatibility */ +}; + +struct addrinfo { + int ai_flags; /* Input flags. */ + int ai_family; /* Address family of socket. */ + int ai_socktype; /* Socket type. */ + int ai_protocol; /* Protocol of socket. */ + socklen_t ai_addrlen; /* Length of socket address. */ + struct sockaddr *ai_addr; /* Socket address of socket. */ + char *ai_canonname; /* Canonical name of service location. */ + struct addrinfo *ai_next; /* Pointer to next in list. */ +}; +#endif /* LWIP_DNS_API_DECLARE_STRUCTS */ + +#define NETDB_ELEM_SIZE (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1) + +#if LWIP_DNS_API_DECLARE_H_ERRNO +/* application accessible error code set by the DNS API functions */ +extern int h_errno; +#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/ + +struct hostent *lwip_gethostbyname(const char *name); +int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, + size_t buflen, struct hostent **result, int *h_errnop); +void lwip_freeaddrinfo(struct addrinfo *ai); +int lwip_getaddrinfo(const char *nodename, + const char *servname, + const struct addrinfo *hints, + struct addrinfo **res); + +#if LWIP_COMPAT_SOCKETS +/** @ingroup netdbapi */ +#define gethostbyname(name) lwip_gethostbyname(name) +/** @ingroup netdbapi */ +#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \ + lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop) +/** @ingroup netdbapi */ +#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo) +/** @ingroup netdbapi */ +#define getaddrinfo(nodname, servname, hints, res) \ + lwip_getaddrinfo(nodname, servname, hints, res) +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DNS && LWIP_SOCKET */ + +#endif /* LWIP_HDR_NETDB_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netif.h new file mode 100644 index 0000000..9fd6eb3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netif.h @@ -0,0 +1,686 @@ +/** + * @file + * netif API (to be used from TCPIP thread) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_NETIF_H +#define LWIP_HDR_NETIF_H + +#include "lwip/opt.h" + +#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) + +#include "lwip/err.h" + +#include "lwip/ip_addr.h" + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/stats.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Throughout this file, IP addresses are expected to be in + * the same byte order as in IP_PCB. */ + +/** Must be the maximum of all used hardware address lengths + across all types of interfaces in use. + This does not have to be changed, normally. */ +#ifndef NETIF_MAX_HWADDR_LEN +#define NETIF_MAX_HWADDR_LEN 6U +#endif + +/** The size of a fully constructed netif name which the + * netif can be identified by in APIs. Composed of + * 2 chars, 3 (max) digits, and 1 \0 + */ +#define NETIF_NAMESIZE 6 + +/** + * @defgroup netif_flags Flags + * @ingroup netif + * @{ + */ + +/** Whether the network interface is 'up'. This is + * a software flag used to control whether this network + * interface is enabled and processes traffic. + * It must be set by the startup code before this netif can be used + * (also for dhcp/autoip). + */ +#define NETIF_FLAG_UP 0x01U +/** If set, the netif has broadcast capability. + * Set by the netif driver in its init function. */ +#define NETIF_FLAG_BROADCAST 0x02U +/** If set, the interface has an active link + * (set by the network interface driver). + * Either set by the netif driver in its init function (if the link + * is up at that time) or at a later point once the link comes up + * (if link detection is supported by the hardware). */ +#define NETIF_FLAG_LINK_UP 0x04U +/** If set, the netif is an ethernet device using ARP. + * Set by the netif driver in its init function. + * Used to check input packet types and use of DHCP. */ +#define NETIF_FLAG_ETHARP 0x08U +/** If set, the netif is an ethernet device. It might not use + * ARP or TCP/IP if it is used for PPPoE only. + */ +#define NETIF_FLAG_ETHERNET 0x10U +/** If set, the netif has IGMP capability. + * Set by the netif driver in its init function. */ +#define NETIF_FLAG_IGMP 0x20U +/** If set, the netif has MLD6 capability. + * Set by the netif driver in its init function. */ +#define NETIF_FLAG_MLD6 0x40U + +/** + * @} + */ +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +#define NETIF_ENABLE_BLOCKING_TX_FOR_PACKET 0x20 +#endif + +enum lwip_internal_netif_client_data_index +{ +#if LWIP_IPV4 +#if LWIP_DHCP + LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, +#endif +#if LWIP_AUTOIP + LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, +#endif +#if LWIP_IGMP + LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, +#endif +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 +#if LWIP_IPV6_DHCP6 + LWIP_NETIF_CLIENT_DATA_INDEX_DHCP6, +#endif +#if LWIP_IPV6_MLD + LWIP_NETIF_CLIENT_DATA_INDEX_MLD6, +#endif +#endif /* LWIP_IPV6 */ + LWIP_NETIF_CLIENT_DATA_INDEX_MAX +}; + +#if LWIP_CHECKSUM_CTRL_PER_NETIF +#define NETIF_CHECKSUM_GEN_IP 0x0001 +#define NETIF_CHECKSUM_GEN_UDP 0x0002 +#define NETIF_CHECKSUM_GEN_TCP 0x0004 +#define NETIF_CHECKSUM_GEN_ICMP 0x0008 +#define NETIF_CHECKSUM_GEN_ICMP6 0x0010 +#define NETIF_CHECKSUM_CHECK_IP 0x0100 +#define NETIF_CHECKSUM_CHECK_UDP 0x0200 +#define NETIF_CHECKSUM_CHECK_TCP 0x0400 +#define NETIF_CHECKSUM_CHECK_ICMP 0x0800 +#define NETIF_CHECKSUM_CHECK_ICMP6 0x1000 +#define NETIF_CHECKSUM_ENABLE_ALL 0xFFFF +#define NETIF_CHECKSUM_DISABLE_ALL 0x0000 +#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */ + +struct netif; + +/** MAC Filter Actions, these are passed to a netif's igmp_mac_filter or + * mld_mac_filter callback function. */ +enum netif_mac_filter_action { + /** Delete a filter entry */ + NETIF_DEL_MAC_FILTER = 0, + /** Add a filter entry */ + NETIF_ADD_MAC_FILTER = 1 +}; + +/** Function prototype for netif init functions. Set up flags and output/linkoutput + * callback functions in this function. + * + * @param netif The netif to initialize + */ +typedef err_t (*netif_init_fn)(struct netif *netif); +/** Function prototype for netif->input functions. This function is saved as 'input' + * callback function in the netif struct. Call it when a packet has been received. + * + * @param p The received packet, copied into a pbuf + * @param inp The netif which received the packet + * @return ERR_OK if the packet was handled + * != ERR_OK is the packet was NOT handled, in this case, the caller has + * to free the pbuf + */ +typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp); + +#if LWIP_IPV4 +/** Function prototype for netif->output functions. Called by lwIP when a packet + * shall be sent. For ethernet netif, set this to 'etharp_output' and set + * 'linkoutput'. + * + * @param netif The netif which shall send a packet + * @param p The packet to send (p->payload points to IP header) + * @param ipaddr The IP address to which the packet shall be sent + */ +typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p, + const ip4_addr_t *ipaddr); +#endif /* LWIP_IPV4*/ + +#if LWIP_IPV6 +/** Function prototype for netif->output_ip6 functions. Called by lwIP when a packet + * shall be sent. For ethernet netif, set this to 'ethip6_output' and set + * 'linkoutput'. + * + * @param netif The netif which shall send a packet + * @param p The packet to send (p->payload points to IP header) + * @param ipaddr The IPv6 address to which the packet shall be sent + */ +typedef err_t (*netif_output_ip6_fn)(struct netif *netif, struct pbuf *p, + const ip6_addr_t *ipaddr); +#endif /* LWIP_IPV6 */ + +/** Function prototype for netif->linkoutput functions. Only used for ethernet + * netifs. This function is called by ARP when a packet shall be sent. + * + * @param netif The netif which shall send a packet + * @param p The packet to send (raw ethernet packet) + */ +typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p); +/** Function prototype for netif status- or link-callback functions. */ +typedef void (*netif_status_callback_fn)(struct netif *netif); +#if LWIP_IPV4 && LWIP_IGMP +/** Function prototype for netif igmp_mac_filter functions */ +typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif, + const ip4_addr_t *group, enum netif_mac_filter_action action); +#endif /* LWIP_IPV4 && LWIP_IGMP */ +#if LWIP_IPV6 && LWIP_IPV6_MLD +/** Function prototype for netif mld_mac_filter functions */ +typedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif, + const ip6_addr_t *group, enum netif_mac_filter_action action); +#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ + +#if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || LWIP_IPV6_DHCP6 || (LWIP_NUM_NETIF_CLIENT_DATA > 0) +#if LWIP_NUM_NETIF_CLIENT_DATA > 0 +u8_t netif_alloc_client_data_id(void); +#endif +/** @ingroup netif_cd + * Set client data. Obtain ID from netif_alloc_client_data_id(). + */ +#define netif_set_client_data(netif, id, data) netif_get_client_data(netif, id) = (data) +/** @ingroup netif_cd + * Get client data. Obtain ID from netif_alloc_client_data_id(). + */ +#define netif_get_client_data(netif, id) (netif)->client_data[(id)] +#endif + +#if (LWIP_IPV4 && LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) || (LWIP_IPV6 && (LWIP_ND6_NUM_DESTINATIONS > 0x7f)) +typedef u16_t netif_addr_idx_t; +#define NETIF_ADDR_IDX_MAX 0x7FFF +#else +typedef u8_t netif_addr_idx_t; +#define NETIF_ADDR_IDX_MAX 0x7F +#endif + +#if LWIP_NETIF_HWADDRHINT +#define LWIP_NETIF_USE_HINTS 1 +struct netif_hint { + netif_addr_idx_t addr_hint; +}; +#else /* LWIP_NETIF_HWADDRHINT */ +#define LWIP_NETIF_USE_HINTS 0 +#endif /* LWIP_NETIF_HWADDRHINT */ + +/** Generic data structure used for all lwIP network interfaces. + * The following fields should be filled in by the initialization + * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */ +struct netif { +#if !LWIP_SINGLE_NETIF + /** pointer to next in linked list */ + struct netif *next; +#endif + +#if LWIP_IPV4 + /** IP address configuration in network byte order */ + ip_addr_t ip_addr; + ip_addr_t netmask; + ip_addr_t gw; +#endif /* LWIP_IPV4 */ +#if LWIP_IPV6 + /** Array of IPv6 addresses for this netif. */ + ip_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES]; + /** The state of each IPv6 address (Tentative, Preferred, etc). + * @see ip6_addr.h */ + u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES]; +#if LWIP_IPV6_ADDRESS_LIFETIMES + /** Remaining valid and preferred lifetime of each IPv6 address, in seconds. + * For valid lifetimes, the special value of IP6_ADDR_LIFE_STATIC (0) + * indicates the address is static and has no lifetimes. */ + u32_t ip6_addr_valid_life[LWIP_IPV6_NUM_ADDRESSES]; + u32_t ip6_addr_pref_life[LWIP_IPV6_NUM_ADDRESSES]; +#endif /* LWIP_IPV6_ADDRESS_LIFETIMES */ +#endif /* LWIP_IPV6 */ + /** This function is called by the network device driver + * to pass a packet up the TCP/IP stack. */ + netif_input_fn input; +#if LWIP_IPV4 + /** This function is called by the IP module when it wants + * to send a packet on the interface. This function typically + * first resolves the hardware address, then sends the packet. + * For ethernet physical layer, this is usually etharp_output() */ + netif_output_fn output; +#endif /* LWIP_IPV4 */ + /** This function is called by ethernet_output() when it wants + * to send a packet on the interface. This function outputs + * the pbuf as-is on the link medium. */ + netif_linkoutput_fn linkoutput; +#if LWIP_IPV6 + /** This function is called by the IPv6 module when it wants + * to send a packet on the interface. This function typically + * first resolves the hardware address, then sends the packet. + * For ethernet physical layer, this is usually ethip6_output() */ + netif_output_ip6_fn output_ip6; +#endif /* LWIP_IPV6 */ +#if LWIP_NETIF_STATUS_CALLBACK + /** This function is called when the netif state is set to up or down + */ + netif_status_callback_fn status_callback; +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_LINK_CALLBACK + /** This function is called when the netif link is set to up or down + */ + netif_status_callback_fn link_callback; +#endif /* LWIP_NETIF_LINK_CALLBACK */ +#if LWIP_NETIF_REMOVE_CALLBACK + /** This function is called when the netif has been removed */ + netif_status_callback_fn remove_callback; +#endif /* LWIP_NETIF_REMOVE_CALLBACK */ + /** This field can be set by the device driver and could point + * to state information for the device. */ + void *state; +#ifdef netif_get_client_data + void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA]; +#endif +#if LWIP_NETIF_HOSTNAME + /* the hostname for this netif, NULL is a valid value */ + const char* hostname; +#endif /* LWIP_NETIF_HOSTNAME */ +#if LWIP_CHECKSUM_CTRL_PER_NETIF + u16_t chksum_flags; +#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/ + /** maximum transfer unit (in bytes) */ + u16_t mtu; +#if LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES + /** maximum transfer unit (in bytes), updated by RA */ + u16_t mtu6; +#endif /* LWIP_IPV6 && LWIP_ND6_ALLOW_RA_UPDATES */ + /** link level hardware address of this interface */ + u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; + /** number of bytes used in hwaddr */ + u8_t hwaddr_len; + /** flags (@see @ref netif_flags) */ + u8_t flags; +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE + /** flags that are used to support the feature where for UDP Tx, the adapter send routine + * returns only when the respective packet is transmitted out */ + u8_t block_tx_till_complt; +#endif + /** descriptive abbreviation */ + char name[2]; + /** number of this interface. Used for @ref if_api and @ref netifapi_netif, + * as well as for IPv6 zones */ + u8_t num; +#if LWIP_IPV6_AUTOCONFIG + /** is this netif enabled for IPv6 autoconfiguration */ + u8_t ip6_autoconfig_enabled; +#endif /* LWIP_IPV6_AUTOCONFIG */ +#if LWIP_IPV6_SEND_ROUTER_SOLICIT + /** Number of Router Solicitation messages that remain to be sent. */ + u8_t rs_count; +#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */ +#if MIB2_STATS + /** link type (from "snmp_ifType" enum from snmp_mib2.h) */ + u8_t link_type; + /** (estimate) link speed */ + u32_t link_speed; + /** timestamp at last change made (up/down) */ + u32_t ts; + /** counters */ + struct stats_mib2_netif_ctrs mib2_counters; +#endif /* MIB2_STATS */ +#if LWIP_IPV4 && LWIP_IGMP + /** This function could be called to add or delete an entry in the multicast + filter table of the ethernet MAC.*/ + netif_igmp_mac_filter_fn igmp_mac_filter; +#endif /* LWIP_IPV4 && LWIP_IGMP */ +#if LWIP_IPV6 && LWIP_IPV6_MLD + /** This function could be called to add or delete an entry in the IPv6 multicast + filter table of the ethernet MAC. */ + netif_mld_mac_filter_fn mld_mac_filter; +#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ +#if LWIP_NETIF_USE_HINTS + struct netif_hint *hints; +#endif /* LWIP_NETIF_USE_HINTS */ +#if ENABLE_LOOPBACK + /* List of packets to be queued for ourselves. */ + struct pbuf *loop_first; + struct pbuf *loop_last; +#if LWIP_LOOPBACK_MAX_PBUFS + u16_t loop_cnt_current; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + /* Used if the original scheduling failed. */ + u8_t reschedule_poll; +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ +}; + +#if LWIP_CHECKSUM_CTRL_PER_NETIF +#define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) do { \ + (netif)->chksum_flags = chksumflags; } while(0) +#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0)) +#else /* LWIP_CHECKSUM_CTRL_PER_NETIF */ +#define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) +#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) +#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */ + +#if LWIP_SINGLE_NETIF +#define NETIF_FOREACH(netif) if (((netif) = netif_default) != NULL) +#else /* LWIP_SINGLE_NETIF */ +/** The list of network interfaces. */ +extern struct netif *netif_list; +#define NETIF_FOREACH(netif) for ((netif) = netif_list; (netif) != NULL; (netif) = (netif)->next) +#endif /* LWIP_SINGLE_NETIF */ +/** The default network interface. */ +extern struct netif *netif_default; + +void netif_init(void); + +struct netif *netif_add_noaddr(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input); + +#if LWIP_IPV4 +struct netif *netif_add(struct netif *netif, + const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, + void *state, netif_init_fn init, netif_input_fn input); +void netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, + const ip4_addr_t *gw); +#else /* LWIP_IPV4 */ +struct netif *netif_add(struct netif *netif, void *state, netif_init_fn init, netif_input_fn input); +#endif /* LWIP_IPV4 */ +void netif_remove(struct netif * netif); + +/* Returns a network interface given its name. The name is of the form + "et0", where the first two letters are the "name" field in the + netif structure, and the digit is in the num field in the same + structure. */ +struct netif *netif_find(const char *name); + +void netif_set_default(struct netif *netif); + +#if LWIP_IPV4 +void netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr); +void netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask); +void netif_set_gw(struct netif *netif, const ip4_addr_t *gw); +/** @ingroup netif_ip4 */ +#define netif_ip4_addr(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->ip_addr))) +/** @ingroup netif_ip4 */ +#define netif_ip4_netmask(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->netmask))) +/** @ingroup netif_ip4 */ +#define netif_ip4_gw(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->gw))) +/** @ingroup netif_ip4 */ +#define netif_ip_addr4(netif) ((const ip_addr_t*)&((netif)->ip_addr)) +/** @ingroup netif_ip4 */ +#define netif_ip_netmask4(netif) ((const ip_addr_t*)&((netif)->netmask)) +/** @ingroup netif_ip4 */ +#define netif_ip_gw4(netif) ((const ip_addr_t*)&((netif)->gw)) +#endif /* LWIP_IPV4 */ + +#define netif_set_flags(netif, set_flags) do { (netif)->flags = (u8_t)((netif)->flags | (set_flags)); } while(0) +#define netif_clear_flags(netif, clr_flags) do { (netif)->flags = (u8_t)((netif)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define netif_is_flag_set(nefif, flag) (((netif)->flags & (flag)) != 0) +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +#define netif_set_opt_block_tx(netif, set_flags) do { (netif)->block_tx_till_complt = (u8_t)((netif)->block_tx_till_complt | (set_flags)); } while(0) +#define netif_clear_opt_block_tx(netif, clr_flags) do { (netif)->block_tx_till_complt = (u8_t)((netif)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define netif_is_opt_block_tx_set(nefif, flag) (((netif)->block_tx_till_complt & (flag)) != 0) +#endif + +void netif_set_up(struct netif *netif); +void netif_set_down(struct netif *netif); +/** @ingroup netif + * Ask if an interface is up + */ +#define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0) + +#if LWIP_NETIF_STATUS_CALLBACK +void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback); +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_REMOVE_CALLBACK +void netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback); +#endif /* LWIP_NETIF_REMOVE_CALLBACK */ + +void netif_set_link_up(struct netif *netif); +void netif_set_link_down(struct netif *netif); +/** Ask if a link is up */ +#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0) + +#if LWIP_NETIF_LINK_CALLBACK +void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback); +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#if LWIP_NETIF_HOSTNAME +/** @ingroup netif */ +#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0) +/** @ingroup netif */ +#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL) +#endif /* LWIP_NETIF_HOSTNAME */ + +#if LWIP_IGMP +/** @ingroup netif */ +#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0) +#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL) +#endif /* LWIP_IGMP */ + +#if LWIP_IPV6 && LWIP_IPV6_MLD +/** @ingroup netif */ +#define netif_set_mld_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->mld_mac_filter = function; }}while(0) +#define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL) +#define netif_mld_mac_filter(netif, addr, action) do { if((netif) && (netif)->mld_mac_filter) { (netif)->mld_mac_filter((netif), (addr), (action)); }}while(0) +#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ + +#if ENABLE_LOOPBACK +err_t netif_loop_output(struct netif *netif, struct pbuf *p); +void netif_poll(struct netif *netif); +#if !LWIP_NETIF_LOOPBACK_MULTITHREADING +void netif_poll_all(void); +#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ + +err_t netif_input(struct pbuf *p, struct netif *inp); + +#if LWIP_IPV6 +/** @ingroup netif_ip6 */ +#define netif_ip_addr6(netif, i) ((const ip_addr_t*)(&((netif)->ip6_addr[i]))) +/** @ingroup netif_ip6 */ +#define netif_ip6_addr(netif, i) ((const ip6_addr_t*)ip_2_ip6(&((netif)->ip6_addr[i]))) +void netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6); +void netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, u32_t i2, u32_t i3); +#define netif_ip6_addr_state(netif, i) ((netif)->ip6_addr_state[i]) +void netif_ip6_addr_set_state(struct netif* netif, s8_t addr_idx, u8_t state); +s8_t netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr); +void netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit); +err_t netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx); +#define netif_set_ip6_autoconfig_enabled(netif, action) do { if(netif) { (netif)->ip6_autoconfig_enabled = (action); }}while(0) +#if LWIP_IPV6_ADDRESS_LIFETIMES +#define netif_ip6_addr_valid_life(netif, i) \ + (((netif) != NULL) ? ((netif)->ip6_addr_valid_life[i]) : IP6_ADDR_LIFE_STATIC) +#define netif_ip6_addr_set_valid_life(netif, i, secs) \ + do { if (netif != NULL) { (netif)->ip6_addr_valid_life[i] = (secs); }} while (0) +#define netif_ip6_addr_pref_life(netif, i) \ + (((netif) != NULL) ? ((netif)->ip6_addr_pref_life[i]) : IP6_ADDR_LIFE_STATIC) +#define netif_ip6_addr_set_pref_life(netif, i, secs) \ + do { if (netif != NULL) { (netif)->ip6_addr_pref_life[i] = (secs); }} while (0) +#define netif_ip6_addr_isstatic(netif, i) \ + (netif_ip6_addr_valid_life((netif), (i)) == IP6_ADDR_LIFE_STATIC) +#else /* !LWIP_IPV6_ADDRESS_LIFETIMES */ +#define netif_ip6_addr_isstatic(netif, i) (1) /* all addresses are static */ +#endif /* !LWIP_IPV6_ADDRESS_LIFETIMES */ +#if LWIP_ND6_ALLOW_RA_UPDATES +#define netif_mtu6(netif) ((netif)->mtu6) +#else /* LWIP_ND6_ALLOW_RA_UPDATES */ +#define netif_mtu6(netif) ((netif)->mtu) +#endif /* LWIP_ND6_ALLOW_RA_UPDATES */ +#endif /* LWIP_IPV6 */ + +#if LWIP_NETIF_USE_HINTS +#define NETIF_SET_HINTS(netif, netifhint) (netif)->hints = (netifhint) +#define NETIF_RESET_HINTS(netif) (netif)->hints = NULL +#else /* LWIP_NETIF_USE_HINTS */ +#define NETIF_SET_HINTS(netif, netifhint) +#define NETIF_RESET_HINTS(netif) +#endif /* LWIP_NETIF_USE_HINTS */ + +u8_t netif_name_to_index(const char *name); +char * netif_index_to_name(u8_t idx, char *name); +struct netif* netif_get_by_index(u8_t idx); + +/* Interface indexes always start at 1 per RFC 3493, section 4, num starts at 0 (internal index is 0..254)*/ +#define netif_get_index(netif) ((u8_t)((netif)->num + 1)) +#define NETIF_NO_INDEX (0) + +/** + * @ingroup netif + * Extended netif status callback (NSC) reasons flags. + * May be extended in the future! + */ +typedef u16_t netif_nsc_reason_t; + +/* used for initialization only */ +#define LWIP_NSC_NONE 0x0000 +/** netif was added. arg: NULL. Called AFTER netif was added. */ +#define LWIP_NSC_NETIF_ADDED 0x0001 +/** netif was removed. arg: NULL. Called BEFORE netif is removed. */ +#define LWIP_NSC_NETIF_REMOVED 0x0002 +/** link changed */ +#define LWIP_NSC_LINK_CHANGED 0x0004 +/** netif administrative status changed.\n + * up is called AFTER netif is set up.\n + * down is called BEFORE the netif is actually set down. */ +#define LWIP_NSC_STATUS_CHANGED 0x0008 +/** IPv4 address has changed */ +#define LWIP_NSC_IPV4_ADDRESS_CHANGED 0x0010 +/** IPv4 gateway has changed */ +#define LWIP_NSC_IPV4_GATEWAY_CHANGED 0x0020 +/** IPv4 netmask has changed */ +#define LWIP_NSC_IPV4_NETMASK_CHANGED 0x0040 +/** called AFTER IPv4 address/gateway/netmask changes have been applied */ +#define LWIP_NSC_IPV4_SETTINGS_CHANGED 0x0080 +/** IPv6 address was added */ +#define LWIP_NSC_IPV6_SET 0x0100 +/** IPv6 address state has changed */ +#define LWIP_NSC_IPV6_ADDR_STATE_CHANGED 0x0200 + +/** @ingroup netif + * Argument supplied to netif_ext_callback_fn. + */ +typedef union +{ + /** Args to LWIP_NSC_LINK_CHANGED callback */ + struct link_changed_s + { + /** 1: up; 0: down */ + u8_t state; + } link_changed; + /** Args to LWIP_NSC_STATUS_CHANGED callback */ + struct status_changed_s + { + /** 1: up; 0: down */ + u8_t state; + } status_changed; + /** Args to LWIP_NSC_IPV4_ADDRESS_CHANGED|LWIP_NSC_IPV4_GATEWAY_CHANGED|LWIP_NSC_IPV4_NETMASK_CHANGED|LWIP_NSC_IPV4_SETTINGS_CHANGED callback */ + struct ipv4_changed_s + { + /** Old IPv4 address */ + const ip_addr_t* old_address; + const ip_addr_t* old_netmask; + const ip_addr_t* old_gw; + } ipv4_changed; + /** Args to LWIP_NSC_IPV6_SET callback */ + struct ipv6_set_s + { + /** Index of changed IPv6 address */ + s8_t addr_index; + /** Old IPv6 address */ + const ip_addr_t* old_address; + } ipv6_set; + /** Args to LWIP_NSC_IPV6_ADDR_STATE_CHANGED callback */ + struct ipv6_addr_state_changed_s + { + /** Index of affected IPv6 address */ + s8_t addr_index; + /** Old IPv6 address state */ + u8_t old_state; + /** Affected IPv6 address */ + const ip_addr_t* address; + } ipv6_addr_state_changed; +} netif_ext_callback_args_t; + +/** + * @ingroup netif + * Function used for extended netif status callbacks + * Note: When parsing reason argument, keep in mind that more reasons may be added in the future! + * @param netif netif that is affected by change + * @param reason change reason + * @param args depends on reason, see reason description + */ +typedef void (*netif_ext_callback_fn)(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args); + +#if LWIP_NETIF_EXT_STATUS_CALLBACK +struct netif_ext_callback; +typedef struct netif_ext_callback +{ + netif_ext_callback_fn callback_fn; + struct netif_ext_callback* next; +} netif_ext_callback_t; + +#define NETIF_DECLARE_EXT_CALLBACK(name) static netif_ext_callback_t name; +void netif_add_ext_callback(netif_ext_callback_t* callback, netif_ext_callback_fn fn); +void netif_remove_ext_callback(netif_ext_callback_t* callback); +void netif_invoke_ext_callback(struct netif* netif, netif_nsc_reason_t reason, const netif_ext_callback_args_t* args); +#else +#define NETIF_DECLARE_EXT_CALLBACK(name) +#define netif_add_ext_callback(callback, fn) +#define netif_remove_ext_callback(callback) +#define netif_invoke_ext_callback(netif, reason, args) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netifapi.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netifapi.h new file mode 100644 index 0000000..e063179 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/netifapi.h @@ -0,0 +1,161 @@ +/** + * @file + * netif API (to be used from non-TCPIP threads) + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ +#ifndef LWIP_HDR_NETIFAPI_H +#define LWIP_HDR_NETIFAPI_H + +#include "lwip/opt.h" + +#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sys.h" +#include "lwip/netif.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "lwip/priv/tcpip_priv.h" +#include "lwip/priv/api_msg.h" +#include "lwip/prot/ethernet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* API for application */ +#if LWIP_ARP && LWIP_IPV4 +/* Used for netfiapi_arp_* APIs */ +enum netifapi_arp_entry { + NETIFAPI_ARP_PERM /* Permanent entry */ + /* Other entry types can be added here */ +}; + +/** @ingroup netifapi_arp */ +err_t netifapi_arp_add(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, enum netifapi_arp_entry type); +/** @ingroup netifapi_arp */ +err_t netifapi_arp_remove(const ip4_addr_t *ipaddr, enum netifapi_arp_entry type); +#endif /* LWIP_ARP && LWIP_IPV4 */ + +err_t netifapi_netif_add(struct netif *netif, +#if LWIP_IPV4 + const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw, +#endif /* LWIP_IPV4 */ + void *state, netif_init_fn init, netif_input_fn input); + +#if LWIP_IPV4 +err_t netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, + const ip4_addr_t *netmask, const ip4_addr_t *gw); +#endif /* LWIP_IPV4*/ + +err_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, + netifapi_errt_fn errtfunc); + +/** @ingroup netifapi_netif */ +err_t netifapi_netif_name_to_index(const char *name, u8_t *index); +/** @ingroup netifapi_netif */ +err_t netifapi_netif_index_to_name(u8_t index, char *name); + +/** @ingroup netifapi_netif + * @see netif_remove() + */ +#define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL) +/** @ingroup netifapi_netif + * @see netif_set_up() + */ +#define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL) +/** @ingroup netifapi_netif + * @see netif_set_down() + */ +#define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL) +/** @ingroup netifapi_netif + * @see netif_set_default() + */ +#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL) +/** @ingroup netifapi_netif + * @see netif_set_link_up() + */ +#define netifapi_netif_set_link_up(n) netifapi_netif_common(n, netif_set_link_up, NULL) +/** @ingroup netifapi_netif + * @see netif_set_link_down() + */ +#define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL) + +/** + * @defgroup netifapi_dhcp4 DHCPv4 + * @ingroup netifapi + * To be called from non-TCPIP threads + */ +/** @ingroup netifapi_dhcp4 + * @see dhcp_start() + */ +#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) +/** + * @ingroup netifapi_dhcp4 + * @deprecated Use netifapi_dhcp_release_and_stop() instead. + */ +#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) +/** @ingroup netifapi_dhcp4 + * @see dhcp_inform() + */ +#define netifapi_dhcp_inform(n) netifapi_netif_common(n, dhcp_inform, NULL) +/** @ingroup netifapi_dhcp4 + * @see dhcp_renew() + */ +#define netifapi_dhcp_renew(n) netifapi_netif_common(n, NULL, dhcp_renew) +/** + * @ingroup netifapi_dhcp4 + * @deprecated Use netifapi_dhcp_release_and_stop() instead. + */ +#define netifapi_dhcp_release(n) netifapi_netif_common(n, NULL, dhcp_release) +/** @ingroup netifapi_dhcp4 + * @see dhcp_release_and_stop() + */ +#define netifapi_dhcp_release_and_stop(n) netifapi_netif_common(n, dhcp_release_and_stop, NULL) + +/** + * @defgroup netifapi_autoip AUTOIP + * @ingroup netifapi + * To be called from non-TCPIP threads + */ +/** @ingroup netifapi_autoip + * @see autoip_start() + */ +#define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) +/** @ingroup netifapi_autoip + * @see autoip_stop() + */ +#define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETIF_API */ + +#endif /* LWIP_HDR_NETIFAPI_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/opt.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/opt.h new file mode 100644 index 0000000..fd9d2ca --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/opt.h @@ -0,0 +1,3530 @@ +/** + * @file + * + * lwIP Options Configuration + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* + * NOTE: || defined __DOXYGEN__ is a workaround for doxygen bug - + * without this, doxygen does not see the actual #define + */ + +#if !defined LWIP_HDR_OPT_H +#define LWIP_HDR_OPT_H + +/* + * Include user defined options first. Anything not defined in these files + * will be set to standard values. Override anything you don't like! + */ +#include "lwipopts.h" +#include "lwip/debug.h" + +#ifdef __MICROBLAZE__ +#include "mb_interface.h" +#endif + +/** + * @defgroup lwip_opts Options (lwipopts.h) + * @ingroup lwip + * + * @defgroup lwip_opts_debug Debugging + * @ingroup lwip_opts + * + * @defgroup lwip_opts_infrastructure Infrastructure + * @ingroup lwip_opts + * + * @defgroup lwip_opts_callback Callback-style APIs + * @ingroup lwip_opts + * + * @defgroup lwip_opts_threadsafe_apis Thread-safe APIs + * @ingroup lwip_opts + */ + + /* + ------------------------------------ + -------------- NO SYS -------------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_nosys NO_SYS + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * NO_SYS==1: Use lwIP without OS-awareness (no thread, semaphores, mutexes or + * mboxes). This means threaded APIs cannot be used (socket, netconn, + * i.e. everything in the 'api' folder), only the callback-style raw API is + * available (and you have to watch out for yourself that you don't access + * lwIP functions/structures from more than one context at a time!) + */ +#if !defined NO_SYS || defined __DOXYGEN__ +#define NO_SYS 0 +#endif +/** + * @} + */ + +/** + * @defgroup lwip_opts_timers Timers + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * LWIP_TIMERS==0: Drop support for sys_timeout and lwip-internal cyclic timers. + * (the array of lwip-internal cyclic timers is still provided) + * (check NO_SYS_NO_TIMERS for compatibility to old versions) + */ +#if !defined LWIP_TIMERS || defined __DOXYGEN__ +#ifdef NO_SYS_NO_TIMERS +#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) +#else +#define LWIP_TIMERS 1 +#endif +#endif + +/** + * LWIP_TIMERS_CUSTOM==1: Provide your own timer implementation. + * Function prototypes in timeouts.h and the array of lwip-internal cyclic timers + * are still included, but the implementation is not. The following functions + * will be required: sys_timeouts_init(), sys_timeout(), sys_untimeout(), + * sys_timeouts_mbox_fetch() + */ +#if !defined LWIP_TIMERS_CUSTOM || defined __DOXYGEN__ +#define LWIP_TIMERS_CUSTOM 0 +#endif +/** + * @} + */ + +/** + * @defgroup lwip_opts_memcpy memcpy + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * MEMCPY: override this if you have a faster implementation at hand than the + * one included in your C library + */ +#if !defined MEMCPY || defined __DOXYGEN__ +#define MEMCPY(dst,src,len) memcpy(dst,src,len) +#endif + +/** + * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a + * call to memcpy() if the length is known at compile time and is small. + */ +#if !defined SMEMCPY || defined __DOXYGEN__ +#define SMEMCPY(dst,src,len) memcpy(dst,src,len) +#endif + +/** + * MEMMOVE: override this if you have a faster implementation at hand than the + * one included in your C library. lwIP currently uses MEMMOVE only when IPv6 + * fragmentation support is enabled. + */ +#if !defined MEMMOVE || defined __DOXYGEN__ +#define MEMMOVE(dst,src,len) memmove(dst,src,len) +#endif +/** + * @} + */ + +/* + ------------------------------------ + ----------- Core locking ----------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_lock Core locking and MPU + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * LWIP_MPU_COMPATIBLE: enables special memory management mechanism + * which makes lwip able to work on MPU (Memory Protection Unit) system + * by not passing stack-pointers to other threads + * (this decreases performance as memory is allocated from pools instead + * of keeping it on the stack) + */ +#if !defined LWIP_MPU_COMPATIBLE || defined __DOXYGEN__ +#define LWIP_MPU_COMPATIBLE 0 +#endif + +/** + * LWIP_TCPIP_CORE_LOCKING + * Creates a global mutex that is held during TCPIP thread operations. + * Can be locked by client code to perform lwIP operations without changing + * into TCPIP thread using callbacks. See LOCK_TCPIP_CORE() and + * UNLOCK_TCPIP_CORE(). + * Your system should provide mutexes supporting priority inversion to use this. + */ +#if !defined LWIP_TCPIP_CORE_LOCKING || defined __DOXYGEN__ +#define LWIP_TCPIP_CORE_LOCKING 1 +#endif + +/** + * LWIP_TCPIP_CORE_LOCKING_INPUT: when LWIP_TCPIP_CORE_LOCKING is enabled, + * this lets tcpip_input() grab the mutex for input packets as well, + * instead of allocating a message and passing it to tcpip_thread. + * + * ATTENTION: this does not work when tcpip_input() is called from + * interrupt context! + */ +#if !defined LWIP_TCPIP_CORE_LOCKING_INPUT || defined __DOXYGEN__ +#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 +#endif + +/** + * SYS_LIGHTWEIGHT_PROT==1: enable inter-task protection (and task-vs-interrupt + * protection) for certain critical regions during buffer allocation, deallocation + * and memory allocation and deallocation. + * ATTENTION: This is required when using lwIP from more than one context! If + * you disable this, you must be sure what you are doing! + */ +#if !defined SYS_LIGHTWEIGHT_PROT || defined __DOXYGEN__ +#define SYS_LIGHTWEIGHT_PROT 1 +#endif + +/** + * Macro/function to check whether lwIP's threading/locking + * requirements are satisfied during current function call. + * This macro usually calls a function that is implemented in the OS-dependent + * sys layer and performs the following checks: + * - Not in ISR (this should be checked for NO_SYS==1, too!) + * - If @ref LWIP_TCPIP_CORE_LOCKING = 1: TCPIP core lock is held + * - If @ref LWIP_TCPIP_CORE_LOCKING = 0: function is called from TCPIP thread + * @see @ref multithreading + */ +#if !defined LWIP_ASSERT_CORE_LOCKED || defined __DOXYGEN__ +#define LWIP_ASSERT_CORE_LOCKED() +#endif + +/** + * Called as first thing in the lwIP TCPIP thread. Can be used in conjunction + * with @ref LWIP_ASSERT_CORE_LOCKED to check core locking. + * @see @ref multithreading + */ +#if !defined LWIP_MARK_TCPIP_THREAD || defined __DOXYGEN__ +#define LWIP_MARK_TCPIP_THREAD() +#endif +/** + * @} + */ + +/* + ------------------------------------ + ---------- Memory options ---------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_mem Heap and memory pools + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library + * instead of the lwip internal allocator. Can save code size if you + * already use it. + */ +#if !defined MEM_LIBC_MALLOC || defined __DOXYGEN__ +#define MEM_LIBC_MALLOC 0 +#endif + +/** + * MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. + * Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution + * speed (heap alloc can be much slower than pool alloc) and usage from interrupts + * (especially if your netif driver allocates PBUF_POOL pbufs for received frames + * from interrupt)! + * ATTENTION: Currently, this uses the heap for ALL pools (also for private pools, + * not only for internal pools defined in memp_std.h)! + */ +#if !defined MEMP_MEM_MALLOC || defined __DOXYGEN__ +#define MEMP_MEM_MALLOC 0 +#endif + +/** + * MEMP_MEM_INIT==1: Force use of memset to initialize pool memory. + * Useful if pool are moved in uninitialized section of memory. This will ensure + * default values in pcbs struct are well initialized in all conditions. + */ +#if !defined MEMP_MEM_INIT || defined __DOXYGEN__ +#define MEMP_MEM_INIT 0 +#endif + +/** + * MEM_ALIGNMENT: should be set to the alignment of the CPU + * 4 byte alignment -> \#define MEM_ALIGNMENT 4 + * 2 byte alignment -> \#define MEM_ALIGNMENT 2 + */ +#if !defined MEM_ALIGNMENT || defined __DOXYGEN__ +#define MEM_ALIGNMENT 1 +#endif + +/** + * MEM_SIZE: the size of the heap memory. If the application will send + * a lot of data that needs to be copied, this should be set high. + */ +#if !defined MEM_SIZE || defined __DOXYGEN__ +#define MEM_SIZE 1600 +#endif + +/** + * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable + * amount of bytes before and after each memp element in every pool and fills + * it with a prominent default value. + * MEMP_OVERFLOW_CHECK == 0 no checking + * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed + * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time + * memp_malloc() or memp_free() is called (useful but slow!) + */ +#if !defined MEMP_OVERFLOW_CHECK || defined __DOXYGEN__ +#define MEMP_OVERFLOW_CHECK 0 +#endif + +/** + * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make + * sure that there are no cycles in the linked lists. + */ +#if !defined MEMP_SANITY_CHECK || defined __DOXYGEN__ +#define MEMP_SANITY_CHECK 0 +#endif + +/** + * MEM_OVERFLOW_CHECK: mem overflow protection reserves a configurable + * amount of bytes before and after each heap allocation chunk and fills + * it with a prominent default value. + * MEM_OVERFLOW_CHECK == 0 no checking + * MEM_OVERFLOW_CHECK == 1 checks each element when it is freed + * MEM_OVERFLOW_CHECK >= 2 checks all heap elements every time + * mem_malloc() or mem_free() is called (useful but slow!) + */ +#if !defined MEM_OVERFLOW_CHECK || defined __DOXYGEN__ +#define MEM_OVERFLOW_CHECK 0 +#endif + +/** + * MEM_SANITY_CHECK==1: run a sanity check after each mem_free() to make + * sure that the linked list of heap elements is not corrupted. + */ +#if !defined MEM_SANITY_CHECK || defined __DOXYGEN__ +#define MEM_SANITY_CHECK 0 +#endif + +/** + * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set + * of memory pools of various sizes. When mem_malloc is called, an element of + * the smallest pool that can provide the length needed is returned. + * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. + */ +#if !defined MEM_USE_POOLS || defined __DOXYGEN__ +#define MEM_USE_POOLS 0 +#endif + +/** + * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next + * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more + * reliable. */ +#if !defined MEM_USE_POOLS_TRY_BIGGER_POOL || defined __DOXYGEN__ +#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 +#endif + +/** + * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h + * that defines additional pools beyond the "standard" ones required + * by lwIP. If you set this to 1, you must have lwippools.h in your + * include path somewhere. + */ +#if !defined MEMP_USE_CUSTOM_POOLS || defined __DOXYGEN__ +#define MEMP_USE_CUSTOM_POOLS 0 +#endif + +/** + * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from + * interrupt context (or another context that doesn't allow waiting for a + * semaphore). + * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, + * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs + * with each loop so that mem_free can run. + * + * ATTENTION: As you can see from the above description, this leads to dis-/ + * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc + * can need longer. + * + * If you don't want that, at least for NO_SYS=0, you can still use the following + * functions to enqueue a deallocation call which then runs in the tcpip_thread + * context: + * - pbuf_free_callback(p); + * - mem_free_callback(m); + */ +#if !defined LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT || defined __DOXYGEN__ +#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 +#endif +/** + * @} + */ + +/* + ------------------------------------------------ + ---------- Internal Memory Pool Sizes ---------- + ------------------------------------------------ +*/ +/** + * @defgroup lwip_opts_memp Internal memory pools + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). + * If the application sends a lot of data out of ROM (or other static memory), + * this should be set high. + */ +#if !defined MEMP_NUM_PBUF || defined __DOXYGEN__ +#define MEMP_NUM_PBUF 16 +#endif + +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#if !defined MEMP_NUM_RAW_PCB || defined __DOXYGEN__ +#define MEMP_NUM_RAW_PCB 4 +#endif + +/** + * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + * per active UDP "connection". + * (requires the LWIP_UDP option) + */ +#if !defined MEMP_NUM_UDP_PCB || defined __DOXYGEN__ +#define MEMP_NUM_UDP_PCB 4 +#endif + +/** + * MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections. + * (requires the LWIP_TCP option) + */ +#if !defined MEMP_NUM_TCP_PCB || defined __DOXYGEN__ +#define MEMP_NUM_TCP_PCB 5 +#endif + +/** + * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. + * (requires the LWIP_TCP option) + */ +#if !defined MEMP_NUM_TCP_PCB_LISTEN || defined __DOXYGEN__ +#define MEMP_NUM_TCP_PCB_LISTEN 8 +#endif + +/** + * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. + * (requires the LWIP_TCP option) + */ +#if !defined MEMP_NUM_TCP_SEG || defined __DOXYGEN__ +#define MEMP_NUM_TCP_SEG 16 +#endif + +/** + * MEMP_NUM_ALTCP_PCB: the number of simultaneously active altcp layer pcbs. + * (requires the LWIP_ALTCP option) + * Connections with multiple layers require more than one altcp_pcb (e.g. TLS + * over TCP requires 2 altcp_pcbs, one for TLS and one for TCP). + */ +#if !defined MEMP_NUM_ALTCP_PCB || defined __DOXYGEN__ +#define MEMP_NUM_ALTCP_PCB MEMP_NUM_TCP_PCB +#endif + +/** + * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for + * reassembly (whole packets, not fragments!) + */ +#if !defined MEMP_NUM_REASSDATA || defined __DOXYGEN__ +#define MEMP_NUM_REASSDATA 5 +#endif + +/** + * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent + * (fragments, not whole packets!). + * This is only used with LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 + * with DMA-enabled MACs where the packet is not yet sent when netif->output + * returns. + */ +#if !defined MEMP_NUM_FRAG_PBUF || defined __DOXYGEN__ +#define MEMP_NUM_FRAG_PBUF 15 +#endif + +/** + * MEMP_NUM_ARP_QUEUE: the number of simultaneously queued outgoing + * packets (pbufs) that are waiting for an ARP request (to resolve + * their destination address) to finish. + * (requires the ARP_QUEUEING option) + */ +#if !defined MEMP_NUM_ARP_QUEUE || defined __DOXYGEN__ +#define MEMP_NUM_ARP_QUEUE 30 +#endif + +/** + * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces + * can be members at the same time (one per netif - allsystems group -, plus one + * per netif membership). + * (requires the LWIP_IGMP option) + */ +#if !defined MEMP_NUM_IGMP_GROUP || defined __DOXYGEN__ +#define MEMP_NUM_IGMP_GROUP 8 +#endif + +/** + * The number of sys timeouts used by the core stack (not apps) + * The default number of timeouts is calculated here for all enabled modules. + */ +#define LWIP_NUM_SYS_TIMEOUT_INTERNAL (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_NUM_TIMEOUTS + (LWIP_IPV6 * (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD))) + +/** + * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts. + * The default number of timeouts is calculated here for all enabled modules. + * The formula expects settings to be either '0' or '1'. + */ +#if !defined MEMP_NUM_SYS_TIMEOUT || defined __DOXYGEN__ +#define MEMP_NUM_SYS_TIMEOUT LWIP_NUM_SYS_TIMEOUT_INTERNAL +#endif + +/** + * MEMP_NUM_NETBUF: the number of struct netbufs. + * (only needed if you use the sequential API, like api_lib.c) + */ +#if !defined MEMP_NUM_NETBUF || defined __DOXYGEN__ +#define MEMP_NUM_NETBUF 2 +#endif + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#if !defined MEMP_NUM_NETCONN || defined __DOXYGEN__ +#define MEMP_NUM_NETCONN 4 +#endif + +/** + * MEMP_NUM_SELECT_CB: the number of struct lwip_select_cb. + * (Only needed if you have LWIP_MPU_COMPATIBLE==1 and use the socket API. + * In that case, you need one per thread calling lwip_select.) + */ +#if !defined MEMP_NUM_SELECT_CB || defined __DOXYGEN__ +#define MEMP_NUM_SELECT_CB 4 +#endif + +/** + * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used + * for callback/timeout API communication. + * (only needed if you use tcpip.c) + */ +#if !defined MEMP_NUM_TCPIP_MSG_API || defined __DOXYGEN__ +#define MEMP_NUM_TCPIP_MSG_API 8 +#endif + +/** + * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used + * for incoming packets. + * (only needed if you use tcpip.c) + */ +#if !defined MEMP_NUM_TCPIP_MSG_INPKT || defined __DOXYGEN__ +#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#endif + +/** + * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls + * (before freeing the corresponding memory using lwip_freeaddrinfo()). + */ +#if !defined MEMP_NUM_NETDB || defined __DOXYGEN__ +#define MEMP_NUM_NETDB 1 +#endif + +/** + * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list + * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. + */ +#if !defined MEMP_NUM_LOCALHOSTLIST || defined __DOXYGEN__ +#define MEMP_NUM_LOCALHOSTLIST 1 +#endif + +/** + * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. + */ +#if !defined PBUF_POOL_SIZE || defined __DOXYGEN__ +#define PBUF_POOL_SIZE 16 +#endif + +/** MEMP_NUM_API_MSG: the number of concurrently active calls to various + * socket, netconn, and tcpip functions + */ +#if !defined MEMP_NUM_API_MSG || defined __DOXYGEN__ +#define MEMP_NUM_API_MSG MEMP_NUM_TCPIP_MSG_API +#endif + +/** MEMP_NUM_DNS_API_MSG: the number of concurrently active calls to netconn_gethostbyname + */ +#if !defined MEMP_NUM_DNS_API_MSG || defined __DOXYGEN__ +#define MEMP_NUM_DNS_API_MSG MEMP_NUM_TCPIP_MSG_API +#endif + +/** MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA: the number of concurrently active calls + * to getsockopt/setsockopt + */ +#if !defined MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA || defined __DOXYGEN__ +#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API +#endif + +/** MEMP_NUM_NETIFAPI_MSG: the number of concurrently active calls to the + * netifapi functions + */ +#if !defined MEMP_NUM_NETIFAPI_MSG || defined __DOXYGEN__ +#define MEMP_NUM_NETIFAPI_MSG MEMP_NUM_TCPIP_MSG_API +#endif +/** + * @} + */ + +/* + --------------------------------- + ---------- ARP options ---------- + --------------------------------- +*/ +/** + * @defgroup lwip_opts_arp ARP + * @ingroup lwip_opts_ipv4 + * @{ + */ +/** + * LWIP_ARP==1: Enable ARP functionality. + */ +#if !defined LWIP_ARP || defined __DOXYGEN__ +#define LWIP_ARP 1 +#endif + +/** + * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. + */ +#if !defined ARP_TABLE_SIZE || defined __DOXYGEN__ +#define ARP_TABLE_SIZE 10 +#endif + +/** the time an ARP entry stays valid after its last update, + * for ARP_TMR_INTERVAL = 1000, this is + * (60 * 5) seconds = 5 minutes. + */ +#if !defined ARP_MAXAGE || defined __DOXYGEN__ +#define ARP_MAXAGE 300 +#endif + +/** + * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address + * resolution. By default, only the most recent packet is queued per IP address. + * This is sufficient for most protocols and mainly reduces TCP connection + * startup time. Set this to 1 if you know your application sends more than one + * packet in a row to an IP address that is not in the ARP cache. + */ +#if !defined ARP_QUEUEING || defined __DOXYGEN__ +#define ARP_QUEUEING 0 +#endif + +/** The maximum number of packets which may be queued for each + * unresolved address by other network layers. Defaults to 3, 0 means disabled. + * Old packets are dropped, new packets are queued. + */ +#if !defined ARP_QUEUE_LEN || defined __DOXYGEN__ +#define ARP_QUEUE_LEN 3 +#endif + +/** + * ETHARP_SUPPORT_VLAN==1: support receiving and sending ethernet packets with + * VLAN header. See the description of LWIP_HOOK_VLAN_CHECK and + * LWIP_HOOK_VLAN_SET hooks to check/set VLAN headers. + * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. + * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. + * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. + * Alternatively, define a function/define ETHARP_VLAN_CHECK_FN(eth_hdr, vlan) + * that returns 1 to accept a packet or 0 to drop a packet. + */ +#if !defined ETHARP_SUPPORT_VLAN || defined __DOXYGEN__ +#define ETHARP_SUPPORT_VLAN 0 +#endif + +/** LWIP_ETHERNET==1: enable ethernet support even though ARP might be disabled + */ +#if !defined LWIP_ETHERNET || defined __DOXYGEN__ +#define LWIP_ETHERNET LWIP_ARP +#endif + +/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure + * alignment of payload after that header. Since the header is 14 bytes long, + * without this padding e.g. addresses in the IP header will not be aligned + * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. + */ +#if !defined ETH_PAD_SIZE || defined __DOXYGEN__ +#define ETH_PAD_SIZE 0 +#endif + +/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table + * entries (using etharp_add_static_entry/etharp_remove_static_entry). + */ +#if !defined ETHARP_SUPPORT_STATIC_ENTRIES || defined __DOXYGEN__ +#define ETHARP_SUPPORT_STATIC_ENTRIES 0 +#endif + +/** ETHARP_TABLE_MATCH_NETIF==1: Match netif for ARP table entries. + * If disabled, duplicate IP address on multiple netifs are not supported + * (but this should only occur for AutoIP). + */ +#if !defined ETHARP_TABLE_MATCH_NETIF || defined __DOXYGEN__ +#define ETHARP_TABLE_MATCH_NETIF !LWIP_SINGLE_NETIF +#endif +/** + * @} + */ + +/* + -------------------------------- + ---------- IP options ---------- + -------------------------------- +*/ +/** + * @defgroup lwip_opts_ipv4 IPv4 + * @ingroup lwip_opts + * @{ + */ +/** + * LWIP_IPV4==1: Enable IPv4 + */ +#if !defined LWIP_IPV4 || defined __DOXYGEN__ +#define LWIP_IPV4 1 +#endif + +/** + * IP_FORWARD==1: Enables the ability to forward IP packets across network + * interfaces. If you are going to run lwIP on a device with only one network + * interface, define this to 0. + */ +#if !defined IP_FORWARD || defined __DOXYGEN__ +#define IP_FORWARD 0 +#endif + +/** + * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that + * this option does not affect outgoing packet sizes, which can be controlled + * via IP_FRAG. + */ +#if !defined IP_REASSEMBLY || defined __DOXYGEN__ +#define IP_REASSEMBLY 1 +#endif + +/** + * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note + * that this option does not affect incoming packet sizes, which can be + * controlled via IP_REASSEMBLY. + */ +#if !defined IP_FRAG || defined __DOXYGEN__ +#define IP_FRAG 1 +#endif + +#if !LWIP_IPV4 +/* disable IPv4 extensions when IPv4 is disabled */ +#undef IP_FORWARD +#define IP_FORWARD 0 +#undef IP_REASSEMBLY +#define IP_REASSEMBLY 0 +#undef IP_FRAG +#define IP_FRAG 0 +#endif /* !LWIP_IPV4 */ + +/** + * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. + * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. + * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). + */ +#if !defined IP_OPTIONS_ALLOWED || defined __DOXYGEN__ +#define IP_OPTIONS_ALLOWED 1 +#endif + +/** + * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#if !defined IP_REASS_MAXAGE || defined __DOXYGEN__ +#define IP_REASS_MAXAGE 15 +#endif + +/** + * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. + * Since the received pbufs are enqueued, be sure to configure + * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive + * packets even if the maximum amount of fragments is enqueued for reassembly! + * When IPv4 *and* IPv6 are enabled, this even changes to + * (PBUF_POOL_SIZE > 2 * IP_REASS_MAX_PBUFS)! + */ +#if !defined IP_REASS_MAX_PBUFS || defined __DOXYGEN__ +#define IP_REASS_MAX_PBUFS 10 +#endif + +/** + * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. + */ +#if !defined IP_DEFAULT_TTL || defined __DOXYGEN__ +#define IP_DEFAULT_TTL 255 +#endif + +/** + * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast + * filter per pcb on udp and raw send operations. To enable broadcast filter + * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. + */ +#if !defined IP_SOF_BROADCAST || defined __DOXYGEN__ +#define IP_SOF_BROADCAST 0 +#endif + +/** + * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast + * filter on recv operations. + */ +#if !defined IP_SOF_BROADCAST_RECV || defined __DOXYGEN__ +#define IP_SOF_BROADCAST_RECV 0 +#endif + +/** + * IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1: allow ip_forward() to send packets back + * out on the netif where it was received. This should only be used for + * wireless networks. + * ATTENTION: When this is 1, make sure your netif driver correctly marks incoming + * link-layer-broadcast/multicast packets as such using the corresponding pbuf flags! + */ +#if !defined IP_FORWARD_ALLOW_TX_ON_RX_NETIF || defined __DOXYGEN__ +#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0 +#endif +/** + * @} + */ + +/* + ---------------------------------- + ---------- ICMP options ---------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_icmp ICMP + * @ingroup lwip_opts_ipv4 + * @{ + */ +/** + * LWIP_ICMP==1: Enable ICMP module inside the IP stack. + * Be careful, disable that make your product non-compliant to RFC1122 + */ +#if !defined LWIP_ICMP || defined __DOXYGEN__ +#define LWIP_ICMP 1 +#endif + +/** + * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. + */ +#if !defined ICMP_TTL || defined __DOXYGEN__ +#define ICMP_TTL IP_DEFAULT_TTL +#endif + +/** + * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) + */ +#if !defined LWIP_BROADCAST_PING || defined __DOXYGEN__ +#define LWIP_BROADCAST_PING 0 +#endif + +/** + * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) + */ +#if !defined LWIP_MULTICAST_PING || defined __DOXYGEN__ +#define LWIP_MULTICAST_PING 0 +#endif +/** + * @} + */ + +/* + --------------------------------- + ---------- RAW options ---------- + --------------------------------- +*/ +/** + * @defgroup lwip_opts_raw RAW + * @ingroup lwip_opts_callback + * @{ + */ +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#if !defined LWIP_RAW || defined __DOXYGEN__ +#define LWIP_RAW 0 +#endif + +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#if !defined RAW_TTL || defined __DOXYGEN__ +#define RAW_TTL IP_DEFAULT_TTL +#endif +/** + * @} + */ + +/* + ---------------------------------- + ---------- DHCP options ---------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_dhcp DHCP + * @ingroup lwip_opts_ipv4 + * @{ + */ +/** + * LWIP_DHCP==1: Enable DHCP module. + */ +#if !defined LWIP_DHCP || defined __DOXYGEN__ +#define LWIP_DHCP 0 +#endif +#if !LWIP_IPV4 +/* disable DHCP when IPv4 is disabled */ +#undef LWIP_DHCP +#define LWIP_DHCP 0 +#endif /* !LWIP_IPV4 */ + +/** + * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. + */ +#if !defined DHCP_DOES_ARP_CHECK || defined __DOXYGEN__ +#define DHCP_DOES_ARP_CHECK (LWIP_DHCP && LWIP_ARP) +#endif + +/** + * LWIP_DHCP_BOOTP_FILE==1: Store offered_si_addr and boot_file_name. + */ +#if !defined LWIP_DHCP_BOOTP_FILE || defined __DOXYGEN__ +#define LWIP_DHCP_BOOTP_FILE 0 +#endif + +/** + * LWIP_DHCP_GETS_NTP==1: Request NTP servers with discover/select. For each + * response packet, an callback is called, which has to be provided by the port: + * void dhcp_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs); +*/ +#if !defined LWIP_DHCP_GET_NTP_SRV || defined __DOXYGEN__ +#define LWIP_DHCP_GET_NTP_SRV 0 +#endif + +/** + * The maximum of NTP servers requested + */ +#if !defined LWIP_DHCP_MAX_NTP_SERVERS || defined __DOXYGEN__ +#define LWIP_DHCP_MAX_NTP_SERVERS 1 +#endif + +/** + * LWIP_DHCP_MAX_DNS_SERVERS > 0: Request DNS servers with discover/select. + * DNS servers received in the response are passed to DNS via @ref dns_setserver() + * (up to the maximum limit defined here). + */ +#if !defined LWIP_DHCP_MAX_DNS_SERVERS || defined __DOXYGEN__ +#define LWIP_DHCP_MAX_DNS_SERVERS DNS_MAX_SERVERS +#endif +/** + * @} + */ + +/* + ------------------------------------ + ---------- AUTOIP options ---------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_autoip AUTOIP + * @ingroup lwip_opts_ipv4 + * @{ + */ +/** + * LWIP_AUTOIP==1: Enable AUTOIP module. + */ +#if !defined LWIP_AUTOIP || defined __DOXYGEN__ +#define LWIP_AUTOIP 0 +#endif +#if !LWIP_IPV4 +/* disable AUTOIP when IPv4 is disabled */ +#undef LWIP_AUTOIP +#define LWIP_AUTOIP 0 +#endif /* !LWIP_IPV4 */ + +/** + * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on + * the same interface at the same time. + */ +#if !defined LWIP_DHCP_AUTOIP_COOP || defined __DOXYGEN__ +#define LWIP_DHCP_AUTOIP_COOP 0 +#endif + +/** + * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes + * that should be sent before falling back on AUTOIP (the DHCP client keeps + * running in this case). This can be set as low as 1 to get an AutoIP address + * very quickly, but you should be prepared to handle a changing IP address + * when DHCP overrides AutoIP. + */ +#if !defined LWIP_DHCP_AUTOIP_COOP_TRIES || defined __DOXYGEN__ +#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 +#endif +/** + * @} + */ + +/* + ---------------------------------- + ----- SNMP MIB2 support ----- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_mib2 SNMP MIB2 callbacks + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * LWIP_MIB2_CALLBACKS==1: Turn on SNMP MIB2 callbacks. + * Turn this on to get callbacks needed to implement MIB2. + * Usually MIB2_STATS should be enabled, too. + */ +#if !defined LWIP_MIB2_CALLBACKS || defined __DOXYGEN__ +#define LWIP_MIB2_CALLBACKS 0 +#endif +/** + * @} + */ + +/* + ---------------------------------- + -------- Multicast options ------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_multicast Multicast + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options + * IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP, as well as (currently only) + * core support for the corresponding IPv6 options. + */ +#if !defined LWIP_MULTICAST_TX_OPTIONS || defined __DOXYGEN__ +#define LWIP_MULTICAST_TX_OPTIONS ((LWIP_IGMP || LWIP_IPV6_MLD) && (LWIP_UDP || LWIP_RAW)) +#endif +/** + * @} + */ + +/* + ---------------------------------- + ---------- IGMP options ---------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_igmp IGMP + * @ingroup lwip_opts_ipv4 + * @{ + */ +/** + * LWIP_IGMP==1: Turn on IGMP module. + */ +#if !defined LWIP_IGMP || defined __DOXYGEN__ +#define LWIP_IGMP 0 +#endif +#if !LWIP_IPV4 +#undef LWIP_IGMP +#define LWIP_IGMP 0 +#endif +/** + * @} + */ + +/* + ---------------------------------- + ---------- DNS options ----------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_dns DNS + * @ingroup lwip_opts_callback + * @{ + */ +/** + * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS + * transport. + */ +#if !defined LWIP_DNS || defined __DOXYGEN__ +#define LWIP_DNS 0 +#endif + +/** DNS maximum number of entries to maintain locally. */ +#if !defined DNS_TABLE_SIZE || defined __DOXYGEN__ +#define DNS_TABLE_SIZE 4 +#endif + +/** DNS maximum host name length supported in the name table. */ +#if !defined DNS_MAX_NAME_LENGTH || defined __DOXYGEN__ +#define DNS_MAX_NAME_LENGTH 256 +#endif + +/** The maximum of DNS servers + * The first server can be initialized automatically by defining + * DNS_SERVER_ADDRESS(ipaddr), where 'ipaddr' is an 'ip_addr_t*' + */ +#if !defined DNS_MAX_SERVERS || defined __DOXYGEN__ +#define DNS_MAX_SERVERS 2 +#endif + +/** DNS maximum number of retries when asking for a name, before "timeout". */ +#if !defined DNS_MAX_RETRIES || defined __DOXYGEN__ +#define DNS_MAX_RETRIES 4 +#endif + +/** DNS do a name checking between the query and the response. */ +#if !defined DNS_DOES_NAME_CHECK || defined __DOXYGEN__ +#define DNS_DOES_NAME_CHECK 1 +#endif + +/** LWIP_DNS_SECURE: controls the security level of the DNS implementation + * Use all DNS security features by default. + * This is overridable but should only be needed by very small targets + * or when using against non standard DNS servers. */ +#if !defined LWIP_DNS_SECURE || defined __DOXYGEN__ +#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT) +#endif + +/* A list of DNS security features follows */ +#define LWIP_DNS_SECURE_RAND_XID 1 +#define LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING 2 +#define LWIP_DNS_SECURE_RAND_SRC_PORT 4 + +/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, you have to define an initializer: + * \#define DNS_LOCAL_HOSTLIST_INIT {DNS_LOCAL_HOSTLIST_ELEM("host_ip4", IPADDR4_INIT_BYTES(1,2,3,4)), \ + * DNS_LOCAL_HOSTLIST_ELEM("host_ip6", IPADDR6_INIT_HOST(123, 234, 345, 456)} + * + * Instead, you can also use an external function: + * \#define DNS_LOOKUP_LOCAL_EXTERN(x) extern err_t my_lookup_function(const char *name, ip_addr_t *addr, u8_t dns_addrtype) + * that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype). + */ +#if !defined DNS_LOCAL_HOSTLIST || defined __DOXYGEN__ +#define DNS_LOCAL_HOSTLIST 0 +#endif /* DNS_LOCAL_HOSTLIST */ + +/** If this is turned on, the local host-list can be dynamically changed + * at runtime. */ +#if !defined DNS_LOCAL_HOSTLIST_IS_DYNAMIC || defined __DOXYGEN__ +#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +/** Set this to 1 to enable querying ".local" names via mDNS + * using a One-Shot Multicast DNS Query */ +#if !defined LWIP_DNS_SUPPORT_MDNS_QUERIES || defined __DOXYGEN__ +#define LWIP_DNS_SUPPORT_MDNS_QUERIES 0 +#endif +/** + * @} + */ + +/* + --------------------------------- + ---------- UDP options ---------- + --------------------------------- +*/ +/** + * @defgroup lwip_opts_udp UDP + * @ingroup lwip_opts_callback + * @{ + */ +/** + * LWIP_UDP==1: Turn on UDP. + */ +#if !defined LWIP_UDP || defined __DOXYGEN__ +#define LWIP_UDP 1 +#endif + +/** + * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) + */ +#if !defined LWIP_UDPLITE || defined __DOXYGEN__ +#define LWIP_UDPLITE 0 +#endif + +/** + * UDP_TTL: Default Time-To-Live value. + */ +#if !defined UDP_TTL || defined __DOXYGEN__ +#define UDP_TTL IP_DEFAULT_TTL +#endif + +/** + * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. + */ +#if !defined LWIP_NETBUF_RECVINFO || defined __DOXYGEN__ +#define LWIP_NETBUF_RECVINFO 0 +#endif +/** + * @} + */ + +/* + --------------------------------- + ---------- TCP options ---------- + --------------------------------- +*/ +/** + * @defgroup lwip_opts_tcp TCP + * @ingroup lwip_opts_callback + * @{ + */ +/** + * LWIP_TCP==1: Turn on TCP. + */ +#if !defined LWIP_TCP || defined __DOXYGEN__ +#define LWIP_TCP 1 +#endif + +/** + * TCP_TTL: Default Time-To-Live value. + */ +#if !defined TCP_TTL || defined __DOXYGEN__ +#define TCP_TTL IP_DEFAULT_TTL +#endif + +/** + * TCP_WND: The size of a TCP window. This must be at least + * (2 * TCP_MSS) for things to work well. + * ATTENTION: when using TCP_RCV_SCALE, TCP_WND is the total size + * with scaling applied. Maximum window value in the TCP header + * will be TCP_WND >> TCP_RCV_SCALE + */ +#if !defined TCP_WND || defined __DOXYGEN__ +#define TCP_WND (4 * TCP_MSS) +#endif + +/** + * TCP_MAXRTX: Maximum number of retransmissions of data segments. + */ +#if !defined TCP_MAXRTX || defined __DOXYGEN__ +#define TCP_MAXRTX 12 +#endif + +/** + * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. + */ +#if !defined TCP_SYNMAXRTX || defined __DOXYGEN__ +#define TCP_SYNMAXRTX 6 +#endif + +/** + * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. + * Define to 0 if your device is low on memory. + */ +#if !defined TCP_QUEUE_OOSEQ || defined __DOXYGEN__ +#define TCP_QUEUE_OOSEQ LWIP_TCP +#endif + +/** + * LWIP_TCP_SACK_OUT==1: TCP will support sending selective acknowledgements (SACKs). + */ +#if !defined LWIP_TCP_SACK_OUT || defined __DOXYGEN__ +#define LWIP_TCP_SACK_OUT 0 +#endif + +/** + * LWIP_TCP_MAX_SACK_NUM: The maximum number of SACK values to include in TCP segments. + * Must be at least 1, but is only used if LWIP_TCP_SACK_OUT is enabled. + * NOTE: Even though we never send more than 3 or 4 SACK ranges in a single segment + * (depending on other options), setting this option to values greater than 4 is not pointless. + * This is basically the max number of SACK ranges we want to keep track of. + * As new data is delivered, some of the SACK ranges may be removed or merged. + * In that case some of those older SACK ranges may be used again. + * The amount of memory used to store SACK ranges is LWIP_TCP_MAX_SACK_NUM * 8 bytes for each TCP PCB. + */ +#if !defined LWIP_TCP_MAX_SACK_NUM || defined __DOXYGEN__ +#define LWIP_TCP_MAX_SACK_NUM 4 +#endif + +/** + * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, + * you might want to increase this.) + * For the receive side, this MSS is advertised to the remote side + * when opening a connection. For the transmit size, this MSS sets + * an upper limit on the MSS advertised by the remote host. + */ +#if !defined TCP_MSS || defined __DOXYGEN__ +#define TCP_MSS 536 +#endif + +/** + * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really + * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which + * reflects the available reassembly buffer size at the remote host) and the + * largest size permitted by the IP layer" (RFC 1122) + * Setting this to 1 enables code that checks TCP_MSS against the MTU of the + * netif used for a connection and limits the MSS if it would be too big otherwise. + */ +#if !defined TCP_CALCULATE_EFF_SEND_MSS || defined __DOXYGEN__ +#define TCP_CALCULATE_EFF_SEND_MSS 1 +#endif + + +/** + * TCP_SND_BUF: TCP sender buffer space (bytes). + * To achieve good performance, this should be at least 2 * TCP_MSS. + */ +#if !defined TCP_SND_BUF || defined __DOXYGEN__ +#define TCP_SND_BUF (2 * TCP_MSS) +#endif + +/** + * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least + * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. + */ +#if !defined TCP_SND_QUEUELEN || defined __DOXYGEN__ +#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) +#endif + +/** + * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than + * TCP_SND_BUF. It is the amount of space which must be available in the + * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). + */ +#if !defined TCP_SNDLOWAT || defined __DOXYGEN__ +#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1) +#endif + +/** + * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be less + * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below + * this number, select returns writable (combined with TCP_SNDLOWAT). + */ +#if !defined TCP_SNDQUEUELOWAT || defined __DOXYGEN__ +#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5) +#endif + +/** + * TCP_OOSEQ_MAX_BYTES: The default maximum number of bytes queued on ooseq per + * pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit). + * Only valid for TCP_QUEUE_OOSEQ==1. + */ +#if !defined TCP_OOSEQ_MAX_BYTES || defined __DOXYGEN__ +#define TCP_OOSEQ_MAX_BYTES 0 +#endif + +/** + * TCP_OOSEQ_BYTES_LIMIT(pcb): Return the maximum number of bytes to be queued + * on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 && + * TCP_OOSEQ_MAX_BYTES==1. + * Use this to override TCP_OOSEQ_MAX_BYTES to a dynamic value per pcb. + */ +#if !defined TCP_OOSEQ_BYTES_LIMIT +#if TCP_OOSEQ_MAX_BYTES +#define TCP_OOSEQ_BYTES_LIMIT(pcb) TCP_OOSEQ_MAX_BYTES +#elif defined __DOXYGEN__ +#define TCP_OOSEQ_BYTES_LIMIT(pcb) +#endif +#endif + +/** + * TCP_OOSEQ_MAX_PBUFS: The default maximum number of pbufs queued on ooseq per + * pcb if TCP_OOSEQ_BYTES_LIMIT is not defined. Default is 0 (no limit). + * Only valid for TCP_QUEUE_OOSEQ==1. + */ +#if !defined TCP_OOSEQ_MAX_PBUFS || defined __DOXYGEN__ +#define TCP_OOSEQ_MAX_PBUFS 0 +#endif + +/** + * TCP_OOSEQ_PBUFS_LIMIT(pcb): Return the maximum number of pbufs to be queued + * on ooseq per pcb, given the pcb. Only valid for TCP_QUEUE_OOSEQ==1 && + * TCP_OOSEQ_MAX_PBUFS==1. + * Use this to override TCP_OOSEQ_MAX_PBUFS to a dynamic value per pcb. + */ +#if !defined TCP_OOSEQ_PBUFS_LIMIT +#if TCP_OOSEQ_MAX_PBUFS +#define TCP_OOSEQ_PBUFS_LIMIT(pcb) TCP_OOSEQ_MAX_PBUFS +#elif defined __DOXYGEN__ +#define TCP_OOSEQ_PBUFS_LIMIT(pcb) +#endif +#endif + +/** + * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. + */ +#if !defined TCP_LISTEN_BACKLOG || defined __DOXYGEN__ +#define TCP_LISTEN_BACKLOG 0 +#endif + +/** + * The maximum allowed backlog for TCP listen netconns. + * This backlog is used unless another is explicitly specified. + * 0xff is the maximum (u8_t). + */ +#if !defined TCP_DEFAULT_LISTEN_BACKLOG || defined __DOXYGEN__ +#define TCP_DEFAULT_LISTEN_BACKLOG 0xff +#endif + +/** + * TCP_OVERSIZE: The maximum number of bytes that tcp_write may + * allocate ahead of time in an attempt to create shorter pbuf chains + * for transmission. The meaningful range is 0 to TCP_MSS. Some + * suggested values are: + * + * 0: Disable oversized allocation. Each tcp_write() allocates a new + pbuf (old behaviour). + * 1: Allocate size-aligned pbufs with minimal excess. Use this if your + * scatter-gather DMA requires aligned fragments. + * 128: Limit the pbuf/memory overhead to 20%. + * TCP_MSS: Try to create unfragmented TCP packets. + * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. + */ +#if !defined TCP_OVERSIZE || defined __DOXYGEN__ +#define TCP_OVERSIZE TCP_MSS +#endif + +/** + * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. + * The timestamp option is currently only used to help remote hosts, it is not + * really used locally. Therefore, it is only enabled when a TS option is + * received in the initial SYN packet from a remote host. + */ +#if !defined LWIP_TCP_TIMESTAMPS || defined __DOXYGEN__ +#define LWIP_TCP_TIMESTAMPS 0 +#endif + +/** + * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an + * explicit window update + */ +#if !defined TCP_WND_UPDATE_THRESHOLD || defined __DOXYGEN__ +#define TCP_WND_UPDATE_THRESHOLD LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4)) +#endif + +/** + * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. + * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all + * events (accept, sent, etc) that happen in the system. + * LWIP_CALLBACK_API==1: The PCB callback function is called directly + * for the event. This is the default. + */ +#if !defined(LWIP_EVENT_API) && !defined(LWIP_CALLBACK_API) || defined __DOXYGEN__ +#define LWIP_EVENT_API 0 +#define LWIP_CALLBACK_API 1 +#else +#ifndef LWIP_EVENT_API +#define LWIP_EVENT_API 0 +#endif +#ifndef LWIP_CALLBACK_API +#define LWIP_CALLBACK_API 0 +#endif +#endif + +/** + * LWIP_WND_SCALE and TCP_RCV_SCALE: + * Set LWIP_WND_SCALE to 1 to enable window scaling. + * Set TCP_RCV_SCALE to the desired scaling factor (shift count in the + * range of [0..14]). + * When LWIP_WND_SCALE is enabled but TCP_RCV_SCALE is 0, we can use a large + * send window while having a small receive window only. + */ +#if !defined LWIP_WND_SCALE || defined __DOXYGEN__ +#define LWIP_WND_SCALE 0 +#define TCP_RCV_SCALE 0 +#endif + +/** + * LWIP_TCP_PCB_NUM_EXT_ARGS: + * When this is > 0, every tcp pcb (including listen pcb) includes a number of + * additional argument entries in an array (see tcp_ext_arg_alloc_id) + */ +#if !defined LWIP_TCP_PCB_NUM_EXT_ARGS || defined __DOXYGEN__ +#define LWIP_TCP_PCB_NUM_EXT_ARGS 0 +#endif + +/** LWIP_ALTCP==1: enable the altcp API. + * altcp is an abstraction layer that prevents applications linking against the + * tcp.h functions but provides the same functionality. It is used to e.g. add + * SSL/TLS or proxy-connect support to an application written for the tcp callback + * API without that application knowing the protocol details. + * + * With LWIP_ALTCP==0, applications written against the altcp API can still be + * compiled but are directly linked against the tcp.h callback API and then + * cannot use layered protocols. + * + * See @ref altcp_api + */ +#if !defined LWIP_ALTCP || defined __DOXYGEN__ +#define LWIP_ALTCP 0 +#endif + +/** LWIP_ALTCP_TLS==1: enable TLS support for altcp API. + * This needs a port of the functions in altcp_tls.h to a TLS library. + * A port to ARM mbedtls is provided with lwIP, see apps/altcp_tls/ directory + * and LWIP_ALTCP_TLS_MBEDTLS option. + */ +#if !defined LWIP_ALTCP_TLS || defined __DOXYGEN__ +#define LWIP_ALTCP_TLS 0 +#endif + +/** + * @} + */ + +/* + ---------------------------------- + ---------- Pbuf options ---------- + ---------------------------------- +*/ +/** + * @defgroup lwip_opts_pbuf PBUF + * @ingroup lwip_opts + * @{ + */ +/** + * PBUF_LINK_HLEN: the number of bytes that should be allocated for a + * link level header. The default is 14, the standard value for + * Ethernet. + */ +#if !defined PBUF_LINK_HLEN || defined __DOXYGEN__ +#if defined LWIP_HOOK_VLAN_SET && !defined __DOXYGEN__ +#define PBUF_LINK_HLEN (18 + ETH_PAD_SIZE) +#else /* LWIP_HOOK_VLAN_SET */ +#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) +#endif /* LWIP_HOOK_VLAN_SET */ +#endif + +/** + * PBUF_LINK_ENCAPSULATION_HLEN: the number of bytes that should be allocated + * for an additional encapsulation header before ethernet headers (e.g. 802.11) + */ +#if !defined PBUF_LINK_ENCAPSULATION_HLEN || defined __DOXYGEN__ +#define PBUF_LINK_ENCAPSULATION_HLEN 0 +#endif + +/** + * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is + * designed to accommodate single full size TCP frame in one pbuf, including + * TCP_MSS, IP header, and link header. + */ +#if !defined PBUF_POOL_BUFSIZE || defined __DOXYGEN__ +#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+PBUF_IP_HLEN+PBUF_TRANSPORT_HLEN+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN) +#endif + +/** + * LWIP_PBUF_REF_T: Refcount type in pbuf. + * Default width of u8_t can be increased if 255 refs are not enough for you. + */ +#if !defined LWIP_PBUF_REF_T || defined __DOXYGEN__ +#define LWIP_PBUF_REF_T u8_t +#endif + +/** + * LWIP_PBUF_CUSTOM_DATA: Store private data on pbufs (e.g. timestamps) + * This extends struct pbuf so user can store custom data on every pbuf. + */ +#if !defined LWIP_PBUF_CUSTOM_DATA || defined __DOXYGEN__ +#define LWIP_PBUF_CUSTOM_DATA +#endif +/** + * @} + */ + +/* + ------------------------------------------------ + ---------- Network Interfaces options ---------- + ------------------------------------------------ +*/ +/** + * @defgroup lwip_opts_netif NETIF + * @ingroup lwip_opts + * @{ + */ +/** + * LWIP_SINGLE_NETIF==1: use a single netif only. This is the common case for + * small real-life targets. Some code like routing etc. can be left out. + */ +#if !defined LWIP_SINGLE_NETIF || defined __DOXYGEN__ +#define LWIP_SINGLE_NETIF 0 +#endif + +/** + * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname + * field. + */ +#if !defined LWIP_NETIF_HOSTNAME || defined __DOXYGEN__ +#define LWIP_NETIF_HOSTNAME 0 +#endif + +/** + * LWIP_NETIF_API==1: Support netif api (in netifapi.c) + */ +#if !defined LWIP_NETIF_API || defined __DOXYGEN__ +#define LWIP_NETIF_API 0 +#endif + +/** + * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface + * changes its up/down status (i.e., due to DHCP IP acquisition) + */ +#if !defined LWIP_NETIF_STATUS_CALLBACK || defined __DOXYGEN__ +#define LWIP_NETIF_STATUS_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_EXT_STATUS_CALLBACK==1: Support an extended callback function + * for several netif related event that supports multiple subscribers. + * @see netif_ext_status_callback + */ +#if !defined LWIP_NETIF_EXT_STATUS_CALLBACK || defined __DOXYGEN__ +#define LWIP_NETIF_EXT_STATUS_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface + * whenever the link changes (i.e., link down) + */ +#if !defined LWIP_NETIF_LINK_CALLBACK || defined __DOXYGEN__ +#define LWIP_NETIF_LINK_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_REMOVE_CALLBACK==1: Support a callback function that is called + * when a netif has been removed + */ +#if !defined LWIP_NETIF_REMOVE_CALLBACK || defined __DOXYGEN__ +#define LWIP_NETIF_REMOVE_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table + * indices) in struct netif. TCP and UDP can make use of this to prevent + * scanning the ARP table for every sent packet. While this is faster for big + * ARP tables or many concurrent connections, it might be counterproductive + * if you have a tiny ARP table or if there never are concurrent connections. + */ +#if !defined LWIP_NETIF_HWADDRHINT || defined __DOXYGEN__ +#define LWIP_NETIF_HWADDRHINT 0 +#endif + +/** + * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP *tries* to put all data + * to be sent into one single pbuf. This is for compatibility with DMA-enabled + * MACs that do not support scatter-gather. + * Beware that this might involve CPU-memcpy before transmitting that would not + * be needed without this flag! Use this only if you need to! + * + * ATTENTION: a driver should *NOT* rely on getting single pbufs but check TX + * pbufs for being in one piece. If not, @ref pbuf_clone can be used to get + * a single pbuf: + * if (p->next != NULL) { + * struct pbuf *q = pbuf_clone(PBUF_RAW, PBUF_RAM, p); + * if (q == NULL) { + * return ERR_MEM; + * } + * p = q; ATTENTION: do NOT free the old 'p' as the ref belongs to the caller! + * } + */ +#if !defined LWIP_NETIF_TX_SINGLE_PBUF || defined __DOXYGEN__ +#define LWIP_NETIF_TX_SINGLE_PBUF 0 +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + +/** + * LWIP_NUM_NETIF_CLIENT_DATA: Number of clients that may store + * data in client_data member array of struct netif (max. 256). + */ +#if !defined LWIP_NUM_NETIF_CLIENT_DATA || defined __DOXYGEN__ +#define LWIP_NUM_NETIF_CLIENT_DATA 0 +#endif +/** + * @} + */ + +/* + ------------------------------------ + ---------- LOOPIF options ---------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_loop Loopback interface + * @ingroup lwip_opts_netif + * @{ + */ +/** + * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1). + * This is only needed when no real netifs are available. If at least one other + * netif is available, loopback traffic uses this netif. + */ +#if !defined LWIP_HAVE_LOOPIF || defined __DOXYGEN__ +#define LWIP_HAVE_LOOPIF (LWIP_NETIF_LOOPBACK && !LWIP_SINGLE_NETIF) +#endif + +/** + * LWIP_LOOPIF_MULTICAST==1: Support multicast/IGMP on loop interface (127.0.0.1). + */ +#if !defined LWIP_LOOPIF_MULTICAST || defined __DOXYGEN__ +#define LWIP_LOOPIF_MULTICAST 0 +#endif + +/** + * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP + * address equal to the netif IP address, looping them back up the stack. + */ +#if !defined LWIP_NETIF_LOOPBACK || defined __DOXYGEN__ +#define LWIP_NETIF_LOOPBACK 0 +#endif + +/** + * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback + * sending for each netif (0 = disabled) + */ +#if !defined LWIP_LOOPBACK_MAX_PBUFS || defined __DOXYGEN__ +#define LWIP_LOOPBACK_MAX_PBUFS 0 +#endif + +/** + * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in + * the system, as netifs must change how they behave depending on this setting + * for the LWIP_NETIF_LOOPBACK option to work. + * Setting this is needed to avoid reentering non-reentrant functions like + * tcp_input(). + * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a + * multithreaded environment like tcpip.c. In this case, netif->input() + * is called directly. + * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. + * The packets are put on a list and netif_poll() must be called in + * the main application loop. + */ +#if !defined LWIP_NETIF_LOOPBACK_MULTITHREADING || defined __DOXYGEN__ +#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) +#endif +/** + * @} + */ + +/* + ------------------------------------ + ---------- Thread options ---------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_thread Threading + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. + */ +#if !defined TCPIP_THREAD_NAME || defined __DOXYGEN__ +#define TCPIP_THREAD_NAME "tcpip_thread" +#endif + +/** + * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#if !defined TCPIP_THREAD_STACKSIZE || defined __DOXYGEN__ +#define TCPIP_THREAD_STACKSIZE 0 +#endif + +/** + * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#if !defined TCPIP_THREAD_PRIO || defined __DOXYGEN__ +#define TCPIP_THREAD_PRIO 1 +#endif + +/** + * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages + * The queue size value itself is platform-dependent, but is passed to + * sys_mbox_new() when tcpip_init is called. + */ +#if !defined TCPIP_MBOX_SIZE || defined __DOXYGEN__ +#define TCPIP_MBOX_SIZE 0 +#endif + +/** + * Define this to something that triggers a watchdog. This is called from + * tcpip_thread after processing a message. + */ +#if !defined LWIP_TCPIP_THREAD_ALIVE || defined __DOXYGEN__ +#define LWIP_TCPIP_THREAD_ALIVE() +#endif + +/** + * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. + */ +#if !defined SLIPIF_THREAD_NAME || defined __DOXYGEN__ +#define SLIPIF_THREAD_NAME "slipif_loop" +#endif + +/** + * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#if !defined SLIPIF_THREAD_STACKSIZE || defined __DOXYGEN__ +#define SLIPIF_THREAD_STACKSIZE 0 +#endif + +/** + * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#if !defined SLIPIF_THREAD_PRIO || defined __DOXYGEN__ +#define SLIPIF_THREAD_PRIO 1 +#endif + +/** + * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. + */ +#if !defined DEFAULT_THREAD_NAME || defined __DOXYGEN__ +#define DEFAULT_THREAD_NAME "lwIP" +#endif + +/** + * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#if !defined DEFAULT_THREAD_STACKSIZE || defined __DOXYGEN__ +#define DEFAULT_THREAD_STACKSIZE 0 +#endif + +/** + * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#if !defined DEFAULT_THREAD_PRIO || defined __DOXYGEN__ +#define DEFAULT_THREAD_PRIO 1 +#endif + +/** + * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#if !defined DEFAULT_RAW_RECVMBOX_SIZE || defined __DOXYGEN__ +#define DEFAULT_RAW_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#if !defined DEFAULT_UDP_RECVMBOX_SIZE || defined __DOXYGEN__ +#define DEFAULT_UDP_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#if !defined DEFAULT_TCP_RECVMBOX_SIZE || defined __DOXYGEN__ +#define DEFAULT_TCP_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. + * The queue size value itself is platform-dependent, but is passed to + * sys_mbox_new() when the acceptmbox is created. + */ +#if !defined DEFAULT_ACCEPTMBOX_SIZE || defined __DOXYGEN__ +#define DEFAULT_ACCEPTMBOX_SIZE 0 +#endif +/** + * @} + */ + +/* + ---------------------------------------------- + ---------- Sequential layer options ---------- + ---------------------------------------------- +*/ +/** + * @defgroup lwip_opts_netconn Netconn + * @ingroup lwip_opts_threadsafe_apis + * @{ + */ +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#if !defined LWIP_NETCONN || defined __DOXYGEN__ +#define LWIP_NETCONN 1 +#endif + +/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout to create + * timers running in tcpip_thread from another thread. + */ +#if !defined LWIP_TCPIP_TIMEOUT || defined __DOXYGEN__ +#define LWIP_TCPIP_TIMEOUT 0 +#endif + +/** LWIP_NETCONN_SEM_PER_THREAD==1: Use one (thread-local) semaphore per + * thread calling socket/netconn functions instead of allocating one + * semaphore per netconn (and per select etc.) + * ATTENTION: a thread-local semaphore for API calls is needed: + * - LWIP_NETCONN_THREAD_SEM_GET() returning a sys_sem_t* + * - LWIP_NETCONN_THREAD_SEM_ALLOC() creating the semaphore + * - LWIP_NETCONN_THREAD_SEM_FREE() freeing the semaphore + * The latter 2 can be invoked up by calling netconn_thread_init()/netconn_thread_cleanup(). + * Ports may call these for threads created with sys_thread_new(). + */ +#if !defined LWIP_NETCONN_SEM_PER_THREAD || defined __DOXYGEN__ +#define LWIP_NETCONN_SEM_PER_THREAD 0 +#endif + +/** LWIP_NETCONN_FULLDUPLEX==1: Enable code that allows reading from one thread, + * writing from a 2nd thread and closing from a 3rd thread at the same time. + * LWIP_NETCONN_SEM_PER_THREAD==1 is required to use one socket/netconn from + * multiple threads at once! + */ +#if !defined LWIP_NETCONN_FULLDUPLEX || defined __DOXYGEN__ +#define LWIP_NETCONN_FULLDUPLEX 0 +#endif +/** + * @} + */ + +/* + ------------------------------------ + ---------- Socket options ---------- + ------------------------------------ +*/ +/** + * @defgroup lwip_opts_socket Sockets + * @ingroup lwip_opts_threadsafe_apis + * @{ + */ +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#if !defined LWIP_SOCKET || defined __DOXYGEN__ +#define LWIP_SOCKET 1 +#endif + +/** + * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names through defines. + * LWIP_COMPAT_SOCKETS==2: Same as ==1 but correctly named functions are created. + * While this helps code completion, it might conflict with existing libraries. + * (only used if you use sockets.c) + */ +#if !defined LWIP_COMPAT_SOCKETS || defined __DOXYGEN__ +#define LWIP_COMPAT_SOCKETS 1 +#endif + +/** + * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. + * Disable this option if you use a POSIX operating system that uses the same + * names (read, write & close). (only used if you use sockets.c) + */ +#if !defined LWIP_POSIX_SOCKETS_IO_NAMES || defined __DOXYGEN__ +#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +#endif + +/** + * LWIP_SOCKET_OFFSET==n: Increases the file descriptor number created by LwIP with n. + * This can be useful when there are multiple APIs which create file descriptors. + * When they all start with a different offset and you won't make them overlap you can + * re implement read/write/close/ioctl/fnctl to send the requested action to the right + * library (sharing select will need more work though). + */ +#if !defined LWIP_SOCKET_OFFSET || defined __DOXYGEN__ +#define LWIP_SOCKET_OFFSET 0 +#endif + +/** + * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT + * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set + * in seconds. (does not require sockets.c, and will affect tcp.c) + */ +#if !defined LWIP_TCP_KEEPALIVE || defined __DOXYGEN__ +#define LWIP_TCP_KEEPALIVE 0 +#endif + +/** + * LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and + * SO_SNDTIMEO processing. + */ +#if !defined LWIP_SO_SNDTIMEO || defined __DOXYGEN__ +#define LWIP_SO_SNDTIMEO 0 +#endif + +/** + * LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and + * SO_RCVTIMEO processing. + */ +#if !defined LWIP_SO_RCVTIMEO || defined __DOXYGEN__ +#define LWIP_SO_RCVTIMEO 0 +#endif + +/** + * LWIP_SO_SNDRCVTIMEO_NONSTANDARD==1: SO_RCVTIMEO/SO_SNDTIMEO take an int + * (milliseconds, much like winsock does) instead of a struct timeval (default). + */ +#if !defined LWIP_SO_SNDRCVTIMEO_NONSTANDARD || defined __DOXYGEN__ +#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0 +#endif + +/** + * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. + */ +#if !defined LWIP_SO_RCVBUF || defined __DOXYGEN__ +#define LWIP_SO_RCVBUF 0 +#endif + +/** + * LWIP_SO_LINGER==1: Enable SO_LINGER processing. + */ +#if !defined LWIP_SO_LINGER || defined __DOXYGEN__ +#define LWIP_SO_LINGER 0 +#endif + +/** + * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. + */ +#if !defined RECV_BUFSIZE_DEFAULT || defined __DOXYGEN__ +#define RECV_BUFSIZE_DEFAULT INT_MAX +#endif + +/** + * By default, TCP socket/netconn close waits 20 seconds max to send the FIN + */ +#if !defined LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT || defined __DOXYGEN__ +#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000 +#endif + +/** + * SO_REUSE==1: Enable SO_REUSEADDR option. + */ +#if !defined SO_REUSE || defined __DOXYGEN__ +#define SO_REUSE 0 +#endif + +/** + * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets + * to all local matches if SO_REUSEADDR is turned on. + * WARNING: Adds a memcpy for every packet if passing to more than one pcb! + */ +#if !defined SO_REUSE_RXTOALL || defined __DOXYGEN__ +#define SO_REUSE_RXTOALL 0 +#endif + +/** + * LWIP_FIONREAD_LINUXMODE==0 (default): ioctl/FIONREAD returns the amount of + * pending data in the network buffer. This is the way windows does it. It's + * the default for lwIP since it is smaller. + * LWIP_FIONREAD_LINUXMODE==1: ioctl/FIONREAD returns the size of the next + * pending datagram in bytes. This is the way linux does it. This code is only + * here for compatibility. + */ +#if !defined LWIP_FIONREAD_LINUXMODE || defined __DOXYGEN__ +#define LWIP_FIONREAD_LINUXMODE 0 +#endif + +/** + * LWIP_SOCKET_SELECT==1 (default): enable select() for sockets (uses a netconn + * callback to keep track of events). + * This saves RAM (counters per socket) and code (netconn event callback), which + * should improve performance a bit). + */ +#if !defined LWIP_SOCKET_SELECT || defined __DOXYGEN__ +#define LWIP_SOCKET_SELECT 1 +#endif + +/** + * LWIP_SOCKET_POLL==1 (default): enable poll() for sockets (including + * struct pollfd, nfds_t, and constants) + */ +#if !defined LWIP_SOCKET_POLL || defined __DOXYGEN__ +#define LWIP_SOCKET_POLL 1 +#endif +/** + * @} + */ + +/* + ---------------------------------------- + ---------- Statistics options ---------- + ---------------------------------------- +*/ +/** + * @defgroup lwip_opts_stats Statistics + * @ingroup lwip_opts_debug + * @{ + */ +/** + * LWIP_STATS==1: Enable statistics collection in lwip_stats. + */ +#if !defined LWIP_STATS || defined __DOXYGEN__ +#define LWIP_STATS 1 +#endif + +#if LWIP_STATS + +/** + * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. + */ +#if !defined LWIP_STATS_DISPLAY || defined __DOXYGEN__ +#define LWIP_STATS_DISPLAY 0 +#endif + +/** + * LINK_STATS==1: Enable link stats. + */ +#if !defined LINK_STATS || defined __DOXYGEN__ +#define LINK_STATS 1 +#endif + +/** + * ETHARP_STATS==1: Enable etharp stats. + */ +#if !defined ETHARP_STATS || defined __DOXYGEN__ +#define ETHARP_STATS (LWIP_ARP) +#endif + +/** + * IP_STATS==1: Enable IP stats. + */ +#if !defined IP_STATS || defined __DOXYGEN__ +#define IP_STATS 1 +#endif + +/** + * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is + * on if using either frag or reass. + */ +#if !defined IPFRAG_STATS || defined __DOXYGEN__ +#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +#endif + +/** + * ICMP_STATS==1: Enable ICMP stats. + */ +#if !defined ICMP_STATS || defined __DOXYGEN__ +#define ICMP_STATS 1 +#endif + +/** + * IGMP_STATS==1: Enable IGMP stats. + */ +#if !defined IGMP_STATS || defined __DOXYGEN__ +#define IGMP_STATS (LWIP_IGMP) +#endif + +/** + * UDP_STATS==1: Enable UDP stats. Default is on if + * UDP enabled, otherwise off. + */ +#if !defined UDP_STATS || defined __DOXYGEN__ +#define UDP_STATS (LWIP_UDP) +#endif + +/** + * TCP_STATS==1: Enable TCP stats. Default is on if TCP + * enabled, otherwise off. + */ +#if !defined TCP_STATS || defined __DOXYGEN__ +#define TCP_STATS (LWIP_TCP) +#endif + +/** + * MEM_STATS==1: Enable mem.c stats. + */ +#if !defined MEM_STATS || defined __DOXYGEN__ +#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) +#endif + +/** + * MEMP_STATS==1: Enable memp.c pool stats. + */ +#if !defined MEMP_STATS || defined __DOXYGEN__ +#define MEMP_STATS (MEMP_MEM_MALLOC == 0) +#endif + +/** + * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). + */ +#if !defined SYS_STATS || defined __DOXYGEN__ +#define SYS_STATS (NO_SYS == 0) +#endif + +/** + * IP6_STATS==1: Enable IPv6 stats. + */ +#if !defined IP6_STATS || defined __DOXYGEN__ +#define IP6_STATS (LWIP_IPV6) +#endif + +/** + * ICMP6_STATS==1: Enable ICMP for IPv6 stats. + */ +#if !defined ICMP6_STATS || defined __DOXYGEN__ +#define ICMP6_STATS (LWIP_IPV6 && LWIP_ICMP6) +#endif + +/** + * IP6_FRAG_STATS==1: Enable IPv6 fragmentation stats. + */ +#if !defined IP6_FRAG_STATS || defined __DOXYGEN__ +#define IP6_FRAG_STATS (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS)) +#endif + +/** + * MLD6_STATS==1: Enable MLD for IPv6 stats. + */ +#if !defined MLD6_STATS || defined __DOXYGEN__ +#define MLD6_STATS (LWIP_IPV6 && LWIP_IPV6_MLD) +#endif + +/** + * ND6_STATS==1: Enable Neighbor discovery for IPv6 stats. + */ +#if !defined ND6_STATS || defined __DOXYGEN__ +#define ND6_STATS (LWIP_IPV6) +#endif + +/** + * MIB2_STATS==1: Stats for SNMP MIB2. + */ +#if !defined MIB2_STATS || defined __DOXYGEN__ +#define MIB2_STATS 0 +#endif + +#else + +#define LINK_STATS 0 +#define ETHARP_STATS 0 +#define IP_STATS 0 +#define IPFRAG_STATS 0 +#define ICMP_STATS 0 +#define IGMP_STATS 0 +#define UDP_STATS 0 +#define TCP_STATS 0 +#define MEM_STATS 0 +#define MEMP_STATS 0 +#define SYS_STATS 0 +#define LWIP_STATS_DISPLAY 0 +#define IP6_STATS 0 +#define ICMP6_STATS 0 +#define IP6_FRAG_STATS 0 +#define MLD6_STATS 0 +#define ND6_STATS 0 +#define MIB2_STATS 0 + +#endif /* LWIP_STATS */ +/** + * @} + */ + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ +/** + * @defgroup lwip_opts_checksum Checksum + * @ingroup lwip_opts_infrastructure + * @{ + */ +/** + * LWIP_CHECKSUM_CTRL_PER_NETIF==1: Checksum generation/check can be enabled/disabled + * per netif. + * ATTENTION: if enabled, the CHECKSUM_GEN_* and CHECKSUM_CHECK_* defines must be enabled! + */ +#if !defined LWIP_CHECKSUM_CTRL_PER_NETIF || defined __DOXYGEN__ +#define LWIP_CHECKSUM_CTRL_PER_NETIF 0 +#endif + +/** + * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. + */ +#if !defined CHECKSUM_GEN_IP || defined __DOXYGEN__ +#define CHECKSUM_GEN_IP 1 +#endif + +/** + * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. + */ +#if !defined CHECKSUM_GEN_UDP || defined __DOXYGEN__ +#define CHECKSUM_GEN_UDP 1 +#endif + +/** + * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. + */ +#if !defined CHECKSUM_GEN_TCP || defined __DOXYGEN__ +#define CHECKSUM_GEN_TCP 1 +#endif + +/** + * CHECKSUM_GEN_ICMP==1: Generate checksums in software for outgoing ICMP packets. + */ +#if !defined CHECKSUM_GEN_ICMP || defined __DOXYGEN__ +#define CHECKSUM_GEN_ICMP 1 +#endif + +/** + * CHECKSUM_GEN_ICMP6==1: Generate checksums in software for outgoing ICMP6 packets. + */ +#if !defined CHECKSUM_GEN_ICMP6 || defined __DOXYGEN__ +#define CHECKSUM_GEN_ICMP6 1 +#endif + +/** + * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. + */ +#if !defined CHECKSUM_CHECK_IP || defined __DOXYGEN__ +#define CHECKSUM_CHECK_IP 1 +#endif + +/** + * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. + */ +#if !defined CHECKSUM_CHECK_UDP || defined __DOXYGEN__ +#define CHECKSUM_CHECK_UDP 1 +#endif + +/** + * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. + */ +#if !defined CHECKSUM_CHECK_TCP || defined __DOXYGEN__ +#define CHECKSUM_CHECK_TCP 1 +#endif + +/** + * CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets. + */ +#if !defined CHECKSUM_CHECK_ICMP || defined __DOXYGEN__ +#define CHECKSUM_CHECK_ICMP 1 +#endif + +/** + * CHECKSUM_CHECK_ICMP6==1: Check checksums in software for incoming ICMPv6 packets + */ +#if !defined CHECKSUM_CHECK_ICMP6 || defined __DOXYGEN__ +#define CHECKSUM_CHECK_ICMP6 1 +#endif + +/** + * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from + * application buffers to pbufs. + */ +#if !defined LWIP_CHECKSUM_ON_COPY || defined __DOXYGEN__ +#define LWIP_CHECKSUM_ON_COPY 0 +#endif +/** + * @} + */ + +/* + --------------------------------------- + ---------- IPv6 options --------------- + --------------------------------------- +*/ +/** + * @defgroup lwip_opts_ipv6 IPv6 + * @ingroup lwip_opts + * @{ + */ +/** + * LWIP_IPV6==1: Enable IPv6 + */ +#if !defined LWIP_IPV6 || defined __DOXYGEN__ +#define LWIP_IPV6 0 +#endif + +/** + * IPV6_REASS_MAXAGE: Maximum time (in multiples of IP6_REASS_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#if !defined IPV6_REASS_MAXAGE || defined __DOXYGEN__ +#define IPV6_REASS_MAXAGE 60 +#endif + +/** + * LWIP_IPV6_SCOPES==1: Enable support for IPv6 address scopes, ensuring that + * e.g. link-local addresses are really treated as link-local. Disable this + * setting only for single-interface configurations. + * All addresses that have a scope according to the default policy (link-local + * unicast addresses, interface-local and link-local multicast addresses) should + * now have a zone set on them before being passed to the core API, although + * lwIP will currently attempt to select a zone on the caller's behalf when + * necessary. Applications that directly assign IPv6 addresses to interfaces + * (which is NOT recommended) must now ensure that link-local addresses carry + * the netif's zone. See the new ip6_zone.h header file for more information and + * relevant macros. For now it is still possible to turn off scopes support + * through the new LWIP_IPV6_SCOPES option. When upgrading an implementation that + * uses the core API directly, it is highly recommended to enable + * LWIP_IPV6_SCOPES_DEBUG at least for a while, to ensure e.g. proper address + * initialization. + */ +#if !defined LWIP_IPV6_SCOPES || defined __DOXYGEN__ +#define LWIP_IPV6_SCOPES (LWIP_IPV6 && !LWIP_SINGLE_NETIF) +#endif + +/** + * LWIP_IPV6_SCOPES_DEBUG==1: Perform run-time checks to verify that addresses + * are properly zoned (see ip6_zone.h on what that means) where it matters. + * Enabling this setting is highly recommended when upgrading from an existing + * installation that is not yet scope-aware; otherwise it may be too expensive. + */ +#if !defined LWIP_IPV6_SCOPES_DEBUG || defined __DOXYGEN__ +#define LWIP_IPV6_SCOPES_DEBUG 0 +#endif + +/** + * LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif. + */ +#if !defined LWIP_IPV6_NUM_ADDRESSES || defined __DOXYGEN__ +#define LWIP_IPV6_NUM_ADDRESSES 3 +#endif + +/** + * LWIP_IPV6_FORWARD==1: Forward IPv6 packets across netifs + */ +#if !defined LWIP_IPV6_FORWARD || defined __DOXYGEN__ +#define LWIP_IPV6_FORWARD 0 +#endif + +/** + * LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big. + */ +#if !defined LWIP_IPV6_FRAG || defined __DOXYGEN__ +#define LWIP_IPV6_FRAG 1 +#endif + +/** + * LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented + */ +#if !defined LWIP_IPV6_REASS || defined __DOXYGEN__ +#define LWIP_IPV6_REASS LWIP_IPV6 +#endif + +/** + * LWIP_IPV6_SEND_ROUTER_SOLICIT==1: Send router solicitation messages during + * network startup. + */ +#if !defined LWIP_IPV6_SEND_ROUTER_SOLICIT || defined __DOXYGEN__ +#define LWIP_IPV6_SEND_ROUTER_SOLICIT LWIP_IPV6 +#endif + +/** + * LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862. + */ +#if !defined LWIP_IPV6_AUTOCONFIG || defined __DOXYGEN__ +#define LWIP_IPV6_AUTOCONFIG LWIP_IPV6 +#endif + +/** + * LWIP_IPV6_ADDRESS_LIFETIMES==1: Keep valid and preferred lifetimes for each + * IPv6 address. Required for LWIP_IPV6_AUTOCONFIG. May still be enabled + * otherwise, in which case the application may assign address lifetimes with + * the appropriate macros. Addresses with no lifetime are assumed to be static. + * If this option is disabled, all addresses are assumed to be static. + */ +#if !defined LWIP_IPV6_ADDRESS_LIFETIMES || defined __DOXYGEN__ +#define LWIP_IPV6_ADDRESS_LIFETIMES LWIP_IPV6_AUTOCONFIG +#endif + +/** + * LWIP_IPV6_DUP_DETECT_ATTEMPTS=[0..7]: Number of duplicate address detection attempts. + */ +#if !defined LWIP_IPV6_DUP_DETECT_ATTEMPTS || defined __DOXYGEN__ +#define LWIP_IPV6_DUP_DETECT_ATTEMPTS 1 +#endif +/** + * @} + */ + +/** + * @defgroup lwip_opts_icmp6 ICMP6 + * @ingroup lwip_opts_ipv6 + * @{ + */ +/** + * LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC) + */ +#if !defined LWIP_ICMP6 || defined __DOXYGEN__ +#define LWIP_ICMP6 LWIP_IPV6 +#endif + +/** + * LWIP_ICMP6_DATASIZE: bytes from original packet to send back in + * ICMPv6 error messages (0 = default of IP6_MIN_MTU_LENGTH) + * ATTENTION: RFC4443 section 2.4 says IP6_MIN_MTU_LENGTH is a MUST, + * so override this only if you absolutely have to! + */ +#if !defined LWIP_ICMP6_DATASIZE || defined __DOXYGEN__ +#define LWIP_ICMP6_DATASIZE 0 +#endif + +/** + * LWIP_ICMP6_HL: default hop limit for ICMPv6 messages + */ +#if !defined LWIP_ICMP6_HL || defined __DOXYGEN__ +#define LWIP_ICMP6_HL 255 +#endif +/** + * @} + */ + +/** + * @defgroup lwip_opts_mld6 Multicast listener discovery + * @ingroup lwip_opts_ipv6 + * @{ + */ +/** + * LWIP_IPV6_MLD==1: Enable multicast listener discovery protocol. + * If LWIP_IPV6 is enabled but this setting is disabled, the MAC layer must + * indiscriminately pass all inbound IPv6 multicast traffic to lwIP. + */ +#if !defined LWIP_IPV6_MLD || defined __DOXYGEN__ +#define LWIP_IPV6_MLD LWIP_IPV6 +#endif + +/** + * MEMP_NUM_MLD6_GROUP: Max number of IPv6 multicast groups that can be joined. + * There must be enough groups so that each netif can join the solicited-node + * multicast group for each of its local addresses, plus one for MDNS if + * applicable, plus any number of groups to be joined on UDP sockets. + */ +#if !defined MEMP_NUM_MLD6_GROUP || defined __DOXYGEN__ +#define MEMP_NUM_MLD6_GROUP 4 +#endif +/** + * @} + */ + +/** + * @defgroup lwip_opts_nd6 Neighbor discovery + * @ingroup lwip_opts_ipv6 + * @{ + */ +/** + * LWIP_ND6_QUEUEING==1: queue outgoing IPv6 packets while MAC address + * is being resolved. + */ +#if !defined LWIP_ND6_QUEUEING || defined __DOXYGEN__ +#define LWIP_ND6_QUEUEING LWIP_IPV6 +#endif + +/** + * MEMP_NUM_ND6_QUEUE: Max number of IPv6 packets to queue during MAC resolution. + */ +#if !defined MEMP_NUM_ND6_QUEUE || defined __DOXYGEN__ +#define MEMP_NUM_ND6_QUEUE 20 +#endif + +/** + * LWIP_ND6_NUM_NEIGHBORS: Number of entries in IPv6 neighbor cache + */ +#if !defined LWIP_ND6_NUM_NEIGHBORS || defined __DOXYGEN__ +#define LWIP_ND6_NUM_NEIGHBORS 10 +#endif + +/** + * LWIP_ND6_NUM_DESTINATIONS: number of entries in IPv6 destination cache + */ +#if !defined LWIP_ND6_NUM_DESTINATIONS || defined __DOXYGEN__ +#define LWIP_ND6_NUM_DESTINATIONS 10 +#endif + +/** + * LWIP_ND6_NUM_PREFIXES: number of entries in IPv6 on-link prefixes cache + */ +#if !defined LWIP_ND6_NUM_PREFIXES || defined __DOXYGEN__ +#define LWIP_ND6_NUM_PREFIXES 5 +#endif + +/** + * LWIP_ND6_NUM_ROUTERS: number of entries in IPv6 default router cache + */ +#if !defined LWIP_ND6_NUM_ROUTERS || defined __DOXYGEN__ +#define LWIP_ND6_NUM_ROUTERS 3 +#endif + +/** + * LWIP_ND6_MAX_MULTICAST_SOLICIT: max number of multicast solicit messages to send + * (neighbor solicit and router solicit) + */ +#if !defined LWIP_ND6_MAX_MULTICAST_SOLICIT || defined __DOXYGEN__ +#define LWIP_ND6_MAX_MULTICAST_SOLICIT 3 +#endif + +/** + * LWIP_ND6_MAX_UNICAST_SOLICIT: max number of unicast neighbor solicitation messages + * to send during neighbor reachability detection. + */ +#if !defined LWIP_ND6_MAX_UNICAST_SOLICIT || defined __DOXYGEN__ +#define LWIP_ND6_MAX_UNICAST_SOLICIT 3 +#endif + +/** + * Unused: See ND RFC (time in milliseconds). + */ +#if !defined LWIP_ND6_MAX_ANYCAST_DELAY_TIME || defined __DOXYGEN__ +#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000 +#endif + +/** + * Unused: See ND RFC + */ +#if !defined LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT || defined __DOXYGEN__ +#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT 3 +#endif + +/** + * LWIP_ND6_REACHABLE_TIME: default neighbor reachable time (in milliseconds). + * May be updated by router advertisement messages. + */ +#if !defined LWIP_ND6_REACHABLE_TIME || defined __DOXYGEN__ +#define LWIP_ND6_REACHABLE_TIME 30000 +#endif + +/** + * LWIP_ND6_RETRANS_TIMER: default retransmission timer for solicitation messages + */ +#if !defined LWIP_ND6_RETRANS_TIMER || defined __DOXYGEN__ +#define LWIP_ND6_RETRANS_TIMER 1000 +#endif + +/** + * LWIP_ND6_DELAY_FIRST_PROBE_TIME: Delay before first unicast neighbor solicitation + * message is sent, during neighbor reachability detection. + */ +#if !defined LWIP_ND6_DELAY_FIRST_PROBE_TIME || defined __DOXYGEN__ +#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000 +#endif + +/** + * LWIP_ND6_ALLOW_RA_UPDATES==1: Allow Router Advertisement messages to update + * Reachable time and retransmission timers, and netif MTU. + */ +#if !defined LWIP_ND6_ALLOW_RA_UPDATES || defined __DOXYGEN__ +#define LWIP_ND6_ALLOW_RA_UPDATES 1 +#endif + +/** + * LWIP_ND6_TCP_REACHABILITY_HINTS==1: Allow TCP to provide Neighbor Discovery + * with reachability hints for connected destinations. This helps avoid sending + * unicast neighbor solicitation messages. + */ +#if !defined LWIP_ND6_TCP_REACHABILITY_HINTS || defined __DOXYGEN__ +#define LWIP_ND6_TCP_REACHABILITY_HINTS 1 +#endif + +/** + * LWIP_ND6_RDNSS_MAX_DNS_SERVERS > 0: Use IPv6 Router Advertisement Recursive + * DNS Server Option (as per RFC 6106) to copy a defined maximum number of DNS + * servers to the DNS module. + */ +#if !defined LWIP_ND6_RDNSS_MAX_DNS_SERVERS || defined __DOXYGEN__ +#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS 0 +#endif +/** + * @} + */ + +/** + * @defgroup lwip_opts_dhcpv6 DHCPv6 + * @ingroup lwip_opts_ipv6 + * @{ + */ +/** + * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful/stateless address autoconfiguration. + */ +#if !defined LWIP_IPV6_DHCP6 || defined __DOXYGEN__ +#define LWIP_IPV6_DHCP6 0 +#endif + +/** + * LWIP_IPV6_DHCP6_STATEFUL==1: enable DHCPv6 stateful address autoconfiguration. + * (not supported, yet!) + */ +#if !defined LWIP_IPV6_DHCP6_STATEFUL || defined __DOXYGEN__ +#define LWIP_IPV6_DHCP6_STATEFUL 0 +#endif + +/** + * LWIP_IPV6_DHCP6_STATELESS==1: enable DHCPv6 stateless address autoconfiguration. + */ +#if !defined LWIP_IPV6_DHCP6_STATELESS || defined __DOXYGEN__ +#define LWIP_IPV6_DHCP6_STATELESS LWIP_IPV6_DHCP6 +#endif + +/** + * LWIP_DHCP6_GETS_NTP==1: Request NTP servers via DHCPv6. For each + * response packet, a callback is called, which has to be provided by the port: + * void dhcp6_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs); +*/ +#if !defined LWIP_DHCP6_GET_NTP_SRV || defined __DOXYGEN__ +#define LWIP_DHCP6_GET_NTP_SRV 0 +#endif + +/** + * The maximum of NTP servers requested + */ +#if !defined LWIP_DHCP6_MAX_NTP_SERVERS || defined __DOXYGEN__ +#define LWIP_DHCP6_MAX_NTP_SERVERS 1 +#endif + +/** + * LWIP_DHCP6_MAX_DNS_SERVERS > 0: Request DNS servers via DHCPv6. + * DNS servers received in the response are passed to DNS via @ref dns_setserver() + * (up to the maximum limit defined here). + */ +#if !defined LWIP_DHCP6_MAX_DNS_SERVERS || defined __DOXYGEN__ +#define LWIP_DHCP6_MAX_DNS_SERVERS DNS_MAX_SERVERS +#endif +/** + * @} + */ + +/* + --------------------------------------- + ---------- Hook options --------------- + --------------------------------------- +*/ + +/** + * @defgroup lwip_opts_hooks Hooks + * @ingroup lwip_opts_infrastructure + * Hooks are undefined by default, define them to a function if you need them. + * @{ + */ + +/** + * LWIP_HOOK_FILENAME: Custom filename to \#include in files that provide hooks. + * Declare your hook function prototypes in there, you may also \#include all headers + * providing data types that are need in this file. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_FILENAME "path/to/my/lwip_hooks.h" +#endif + +/** + * LWIP_HOOK_TCP_ISN: + * Hook for generation of the Initial Sequence Number (ISN) for a new TCP + * connection. The default lwIP ISN generation algorithm is very basic and may + * allow for TCP spoofing attacks. This hook provides the means to implement + * the standardized ISN generation algorithm from RFC 6528 (see contrib/adons/tcp_isn), + * or any other desired algorithm as a replacement. + * Called from tcp_connect() and tcp_listen_input() when an ISN is needed for + * a new TCP connection, if TCP support (@ref LWIP_TCP) is enabled.\n + * Signature:\code{.c} + * u32_t my_hook_tcp_isn(const ip_addr_t* local_ip, u16_t local_port, const ip_addr_t* remote_ip, u16_t remote_port); + * \endcode + * - it may be necessary to use "struct ip_addr" (ip4_addr, ip6_addr) instead of "ip_addr_t" in function declarations\n + * Arguments: + * - local_ip: pointer to the local IP address of the connection + * - local_port: local port number of the connection (host-byte order) + * - remote_ip: pointer to the remote IP address of the connection + * - remote_port: remote port number of the connection (host-byte order)\n + * Return value: + * - the 32-bit Initial Sequence Number to use for the new TCP connection. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_ISN(local_ip, local_port, remote_ip, remote_port) +#endif + +/** + * LWIP_HOOK_TCP_INPACKET_PCB: + * Hook for intercepting incoming packets before they are passed to a pcb. This + * allows updating some state or even dropping a packet. + * Signature:\code{.c} + * err_t my_hook_tcp_inpkt(struct tcp_pcb *pcb, struct tcp_hdr *hdr, u16_t optlen, u16_t opt1len, u8_t *opt2, struct pbuf *p); + * \endcode + * Arguments: + * - pcb: tcp_pcb selected for input of this packet (ATTENTION: this may be + * struct tcp_pcb_listen if pcb->state == LISTEN) + * - hdr: pointer to tcp header (ATTENTION: tcp options may not be in one piece!) + * - optlen: tcp option length + * - opt1len: tcp option length 1st part + * - opt2: if this is != NULL, tcp options are split among 2 pbufs. In that case, + * options start at right after the tcp header ('(u8_t*)(hdr + 1)') for + * the first 'opt1len' bytes and the rest starts at 'opt2'. opt2len can + * be simply calculated: 'opt2len = optlen - opt1len;' + * - p: input packet, p->payload points to application data (that's why tcp hdr + * and options are passed in separately) + * Return value: + * - ERR_OK: continue input of this packet as normal + * - != ERR_OK: drop this packet for input (don't continue input processing) + * + * ATTENTION: don't call any tcp api functions that might change tcp state (pcb + * state or any pcb lists) from this callback! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_INPACKET_PCB(pcb, hdr, optlen, opt1len, opt2, p) +#endif + +/** + * LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH: + * Hook for increasing the size of the options allocated with a tcp header. + * Together with LWIP_HOOK_TCP_OUT_ADD_TCPOPTS, this can be used to add custom + * options to outgoing tcp segments. + * Signature:\code{.c} + * u8_t my_hook_tcp_out_tcpopt_length(const struct tcp_pcb *pcb, u8_t internal_option_length); + * \endcode + * Arguments: + * - pcb: tcp_pcb that transmits (ATTENTION: this may be NULL or + * struct tcp_pcb_listen if pcb->state == LISTEN) + * - internal_option_length: tcp option length used by the stack internally + * Return value: + * - a number of bytes to allocate for tcp options (internal_option_length <= ret <= 40) + * + * ATTENTION: don't call any tcp api functions that might change tcp state (pcb + * state or any pcb lists) from this callback! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH(pcb, internal_len) +#endif + +/** + * LWIP_HOOK_TCP_OUT_ADD_TCPOPTS: + * Hook for adding custom options to outgoing tcp segments. + * Space for these custom options has to be reserved via LWIP_HOOK_TCP_OUT_TCPOPT_LENGTH. + * Signature:\code{.c} + * u32_t *my_hook_tcp_out_add_tcpopts(struct pbuf *p, struct tcp_hdr *hdr, const struct tcp_pcb *pcb, u32_t *opts); + * \endcode + * Arguments: + * - p: output packet, p->payload pointing to tcp header, data follows + * - hdr: tcp header + * - pcb: tcp_pcb that transmits (ATTENTION: this may be NULL or + * struct tcp_pcb_listen if pcb->state == LISTEN) + * - opts: pointer where to add the custom options (there may already be options + * between the header and these) + * Return value: + * - pointer pointing directly after the inserted options + * + * ATTENTION: don't call any tcp api functions that might change tcp state (pcb + * state or any pcb lists) from this callback! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_TCP_OUT_ADD_TCPOPTS(p, hdr, pcb, opts) +#endif + +/** + * LWIP_HOOK_IP4_INPUT(pbuf, input_netif): + * Called from ip_input() (IPv4) + * Signature:\code{.c} + * int my_hook(struct pbuf *pbuf, struct netif *input_netif); + * \endcode + * Arguments: + * - pbuf: received struct pbuf passed to ip_input() + * - input_netif: struct netif on which the packet has been received + * Return values: + * - 0: Hook has not consumed the packet, packet is processed as normal + * - != 0: Hook has consumed the packet. + * If the hook consumed the packet, 'pbuf' is in the responsibility of the hook + * (i.e. free it when done). + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP4_INPUT(pbuf, input_netif) +#endif + +/** + * LWIP_HOOK_IP4_ROUTE(dest): + * Called from ip_route() (IPv4) + * Signature:\code{.c} + * struct netif *my_hook(const ip4_addr_t *dest); + * \endcode + * Arguments: + * - dest: destination IPv4 address + * Returns values: + * - the destination netif + * - NULL if no destination netif is found. In that case, ip_route() continues as normal. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP4_ROUTE() +#endif + +/** + * LWIP_HOOK_IP4_ROUTE_SRC(src, dest): + * Source-based routing for IPv4 - called from ip_route() (IPv4) + * Signature:\code{.c} + * struct netif *my_hook(const ip4_addr_t *src, const ip4_addr_t *dest); + * \endcode + * Arguments: + * - src: local/source IPv4 address + * - dest: destination IPv4 address + * Returns values: + * - the destination netif + * - NULL if no destination netif is found. In that case, ip_route() continues as normal. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP4_ROUTE_SRC(src, dest) +#endif + +/** + * LWIP_HOOK_IP4_CANFORWARD(src, dest): + * Check if an IPv4 can be forwarded - called from: + * ip4_input() -> ip4_forward() -> ip4_canforward() (IPv4) + * - source address is available via ip4_current_src_addr() + * - calling an output function in this context (e.g. multicast router) is allowed + * Signature:\code{.c} + * int my_hook(struct pbuf *p, u32_t dest_addr_hostorder); + * \endcode + * Arguments: + * - p: packet to forward + * - dest: destination IPv4 address + * Returns values: + * - 1: forward + * - 0: don't forward + * - -1: no decision. In that case, ip4_canforward() continues as normal. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP4_CANFORWARD(src, dest) +#endif + +/** + * LWIP_HOOK_ETHARP_GET_GW(netif, dest): + * Called from etharp_output() (IPv4) + * Signature:\code{.c} + * const ip4_addr_t *my_hook(struct netif *netif, const ip4_addr_t *dest); + * \endcode + * Arguments: + * - netif: the netif used for sending + * - dest: the destination IPv4 address + * Return values: + * - the IPv4 address of the gateway to handle the specified destination IPv4 address + * - NULL, in which case the netif's default gateway is used + * + * The returned address MUST be directly reachable on the specified netif! + * This function is meant to implement advanced IPv4 routing together with + * LWIP_HOOK_IP4_ROUTE(). The actual routing/gateway table implementation is + * not part of lwIP but can e.g. be hidden in the netif's state argument. +*/ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_ETHARP_GET_GW(netif, dest) +#endif + +/** + * LWIP_HOOK_IP6_INPUT(pbuf, input_netif): + * Called from ip6_input() (IPv6) + * Signature:\code{.c} + * int my_hook(struct pbuf *pbuf, struct netif *input_netif); + * \endcode + * Arguments: + * - pbuf: received struct pbuf passed to ip6_input() + * - input_netif: struct netif on which the packet has been received + * Return values: + * - 0: Hook has not consumed the packet, packet is processed as normal + * - != 0: Hook has consumed the packet. + * If the hook consumed the packet, 'pbuf' is in the responsibility of the hook + * (i.e. free it when done). + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP6_INPUT(pbuf, input_netif) +#endif + +/** + * LWIP_HOOK_IP6_ROUTE(src, dest): + * Called from ip_route() (IPv6) + * Signature:\code{.c} + * struct netif *my_hook(const ip6_addr_t *dest, const ip6_addr_t *src); + * \endcode + * Arguments: + * - src: source IPv6 address + * - dest: destination IPv6 address + * Return values: + * - the destination netif + * - NULL if no destination netif is found. In that case, ip6_route() continues as normal. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_IP6_ROUTE(src, dest) +#endif + +/** + * LWIP_HOOK_ND6_GET_GW(netif, dest): + * Called from nd6_get_next_hop_entry() (IPv6) + * Signature:\code{.c} + * const ip6_addr_t *my_hook(struct netif *netif, const ip6_addr_t *dest); + * \endcode + * Arguments: + * - netif: the netif used for sending + * - dest: the destination IPv6 address + * Return values: + * - the IPv6 address of the next hop to handle the specified destination IPv6 address + * - NULL, in which case a NDP-discovered router is used instead + * + * The returned address MUST be directly reachable on the specified netif! + * This function is meant to implement advanced IPv6 routing together with + * LWIP_HOOK_IP6_ROUTE(). The actual routing/gateway table implementation is + * not part of lwIP but can e.g. be hidden in the netif's state argument. +*/ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_ND6_GET_GW(netif, dest) +#endif + +/** + * LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr): + * Called from ethernet_input() if VLAN support is enabled + * Signature:\code{.c} + * int my_hook(struct netif *netif, struct eth_hdr *eth_hdr, struct eth_vlan_hdr *vlan_hdr); + * \endcode + * Arguments: + * - netif: struct netif on which the packet has been received + * - eth_hdr: struct eth_hdr of the packet + * - vlan_hdr: struct eth_vlan_hdr of the packet + * Return values: + * - 0: Packet must be dropped. + * - != 0: Packet must be accepted. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr) +#endif + +/** + * LWIP_HOOK_VLAN_SET: + * Hook can be used to set prio_vid field of vlan_hdr. If you need to store data + * on per-netif basis to implement this callback, see @ref netif_cd. + * Called from ethernet_output() if VLAN support (@ref ETHARP_SUPPORT_VLAN) is enabled.\n + * Signature:\code{.c} + * s32_t my_hook_vlan_set(struct netif* netif, struct pbuf* pbuf, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);\n + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - p: struct pbuf packet to be sent + * - src: source eth address + * - dst: destination eth address + * - eth_type: ethernet type to packet to be sent\n + * + * + * Return values: + * - <0: Packet shall not contain VLAN header. + * - 0 <= return value <= 0xFFFF: Packet shall contain VLAN header. Return value is prio_vid in host byte order. + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type) +#endif + +/** + * LWIP_HOOK_MEMP_AVAILABLE(memp_t_type): + * Called from memp_free() when a memp pool was empty and an item is now available + * Signature:\code{.c} + * void my_hook(memp_t type); + * \endcode + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_MEMP_AVAILABLE(memp_t_type) +#endif + +/** + * LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif): + * Called from ethernet_input() when an unknown eth type is encountered. + * Signature:\code{.c} + * err_t my_hook(struct pbuf* pbuf, struct netif* netif); + * \endcode + * Arguments: + * - p: rx packet with unknown eth type + * - netif: netif on which the packet has been received + * Return values: + * - ERR_OK if packet is accepted (hook function now owns the pbuf) + * - any error code otherwise (pbuf is freed) + * + * Payload points to ethernet header! + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif) +#endif + +/** + * LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr): + * Called from various dhcp functions when sending a DHCP message. + * This hook is called just before the DHCP message trailer is added, so the + * options are at the end of a DHCP message. + * Signature:\code{.c} + * void my_hook(struct netif *netif, struct dhcp *dhcp, u8_t state, struct dhcp_msg *msg, + * u8_t msg_type, u16_t *options_len_ptr); + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - dhcp: struct dhcp on that netif + * - state: current dhcp state (dhcp_state_enum_t as an u8_t) + * - msg: struct dhcp_msg that will be sent + * - msg_type: dhcp message type to be sent (u8_t) + * - options_len_ptr: pointer to the current length of options in the dhcp_msg "msg" + * (must be increased when options are added!) + * + * Options need to appended like this: + * LWIP_ASSERT("dhcp option overflow", *options_len_ptr + option_len + 2 <= DHCP_OPTIONS_LEN); + * msg->options[(*options_len_ptr)++] = <option_number>; + * msg->options[(*options_len_ptr)++] = <option_len>; + * msg->options[(*options_len_ptr)++] = <option_bytes>; + * [...] + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_DHCP_APPEND_OPTIONS(netif, dhcp, state, msg, msg_type, options_len_ptr) +#endif + +/** + * LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, option_value_offset): + * Called from dhcp_parse_reply when receiving a DHCP message. + * This hook is called for every option in the received message that is not handled internally. + * Signature:\code{.c} + * void my_hook(struct netif *netif, struct dhcp *dhcp, u8_t state, struct dhcp_msg *msg, + * u8_t msg_type, u8_t option, u8_t option_len, struct pbuf *pbuf, u16_t option_value_offset); + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - dhcp: struct dhcp on that netif + * - state: current dhcp state (dhcp_state_enum_t as an u8_t) + * - msg: struct dhcp_msg that was received + * - msg_type: dhcp message type received (u8_t, ATTENTION: only valid after + * the message type option has been parsed!) + * - option: option value (u8_t) + * - len: option data length (u8_t) + * - pbuf: pbuf where option data is contained + * - option_value_offset: offset in pbuf where option data begins + * + * A nice way to get the option contents is pbuf_get_contiguous(): + * u8_t buf[32]; + * u8_t *ptr = (u8_t*)pbuf_get_contiguous(p, buf, sizeof(buf), LWIP_MIN(option_len, sizeof(buf)), offset); + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_DHCP_PARSE_OPTION(netif, dhcp, state, msg, msg_type, option, len, pbuf, offset) +#endif + +/** + * LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len): + * Called from various dhcp6 functions when sending a DHCP6 message. + * This hook is called just before the DHCP6 message is sent, so the + * options are at the end of a DHCP6 message. + * Signature:\code{.c} + * void my_hook(struct netif *netif, struct dhcp6 *dhcp, u8_t state, struct dhcp6_msg *msg, + * u8_t msg_type, u16_t *options_len_ptr); + * \endcode + * Arguments: + * - netif: struct netif that the packet will be sent through + * - dhcp6: struct dhcp6 on that netif + * - state: current dhcp6 state (dhcp6_state_enum_t as an u8_t) + * - msg: struct dhcp6_msg that will be sent + * - msg_type: dhcp6 message type to be sent (u8_t) + * - options_len_ptr: pointer to the current length of options in the dhcp6_msg "msg" + * (must be increased when options are added!) + * + * Options need to appended like this: + * u8_t *options = (u8_t *)(msg + 1); + * LWIP_ASSERT("dhcp option overflow", sizeof(struct dhcp6_msg) + *options_len_ptr + newoptlen <= max_len); + * options[(*options_len_ptr)++] = <option_data>; + * [...] + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_DHCP6_APPEND_OPTIONS(netif, dhcp6, state, msg, msg_type, options_len_ptr, max_len) +#endif + +/** + * LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err) + * Called from socket API to implement setsockopt() for options not provided by lwIP. + * Core lock is held when this hook is called. + * Signature:\code{.c} + * int my_hook(int s, struct lwip_sock *sock, int level, int optname, const void *optval, socklen_t optlen, int *err) + * \endcode + * Arguments: + * - s: socket file descriptor + * - sock: internal socket descriptor (see lwip/priv/sockets_priv.h) + * - level: protocol level at which the option resides + * - optname: option to set + * - optval: value to set + * - optlen: size of optval + * - err: output error + * Return values: + * - 0: Hook has not consumed the option, code continues as normal (to internal options) + * - != 0: Hook has consumed the option, 'err' is returned + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_SOCKETS_SETSOCKOPT(s, sock, level, optname, optval, optlen, err) +#endif + +/** + * LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err) + * Called from socket API to implement getsockopt() for options not provided by lwIP. + * Core lock is held when this hook is called. + * Signature:\code{.c} + * int my_hook(int s, struct lwip_sock *sock, int level, int optname, void *optval, socklen_t *optlen, int *err) + * \endcode + * Arguments: + * - s: socket file descriptor + * - sock: internal socket descriptor (see lwip/priv/sockets_priv.h) + * - level: protocol level at which the option resides + * - optname: option to get + * - optval: value to get + * - optlen: size of optval + * - err: output error + * Return values: + * - 0: Hook has not consumed the option, code continues as normal (to internal options) + * - != 0: Hook has consumed the option, 'err' is returned + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_SOCKETS_GETSOCKOPT(s, sock, level, optname, optval, optlen, err) +#endif + +/** + * LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err) + * Called from netconn APIs (not usable with callback apps) allowing an + * external DNS resolver (which uses sequential API) to handle the query. + * Signature:\code{.c} + * int my_hook(const char *name, ip_addr_t *addr, u8_t addrtype, err_t *err) + * \endcode + * Arguments: + * - name: hostname to resolve + * - addr: output host address + * - addrtype: type of address to query + * - err: output error + * Return values: + * - 0: Hook has not consumed hostname query, query continues into DNS module + * - != 0: Hook has consumed the query + * + * err must also be checked to determine if the hook consumed the query, but + * the query failed + */ +#ifdef __DOXYGEN__ +#define LWIP_HOOK_NETCONN_EXTERNAL_RESOLVE(name, addr, addrtype, err) +#endif +/** + * @} + */ + +/* + --------------------------------------- + ---------- Debugging options ---------- + --------------------------------------- +*/ +/** + * @defgroup lwip_opts_debugmsg Debug messages + * @ingroup lwip_opts_debug + * @{ + */ +/** + * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is + * compared against this value. If it is smaller, then debugging + * messages are written. + * @see debugging_levels + */ +#if !defined LWIP_DBG_MIN_LEVEL || defined __DOXYGEN__ +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL +#endif + +/** + * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable + * debug messages of certain types. + * @see debugging_levels + */ +#if !defined LWIP_DBG_TYPES_ON || defined __DOXYGEN__ +#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#endif + +/** + * ETHARP_DEBUG: Enable debugging in etharp.c. + */ +#if !defined ETHARP_DEBUG || defined __DOXYGEN__ +#define ETHARP_DEBUG LWIP_DBG_OFF +#endif + +/** + * NETIF_DEBUG: Enable debugging in netif.c. + */ +#if !defined NETIF_DEBUG || defined __DOXYGEN__ +#define NETIF_DEBUG LWIP_DBG_OFF +#endif + +/** + * PBUF_DEBUG: Enable debugging in pbuf.c. + */ +#if !defined PBUF_DEBUG || defined __DOXYGEN__ +#define PBUF_DEBUG LWIP_DBG_OFF +#endif + +/** + * API_LIB_DEBUG: Enable debugging in api_lib.c. + */ +#if !defined API_LIB_DEBUG || defined __DOXYGEN__ +#define API_LIB_DEBUG LWIP_DBG_OFF +#endif + +/** + * API_MSG_DEBUG: Enable debugging in api_msg.c. + */ +#if !defined API_MSG_DEBUG || defined __DOXYGEN__ +#define API_MSG_DEBUG LWIP_DBG_OFF +#endif + +/** + * SOCKETS_DEBUG: Enable debugging in sockets.c. + */ +#if !defined SOCKETS_DEBUG || defined __DOXYGEN__ +#define SOCKETS_DEBUG LWIP_DBG_OFF +#endif + +/** + * ICMP_DEBUG: Enable debugging in icmp.c. + */ +#if !defined ICMP_DEBUG || defined __DOXYGEN__ +#define ICMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * IGMP_DEBUG: Enable debugging in igmp.c. + */ +#if !defined IGMP_DEBUG || defined __DOXYGEN__ +#define IGMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * INET_DEBUG: Enable debugging in inet.c. + */ +#if !defined INET_DEBUG || defined __DOXYGEN__ +#define INET_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP_DEBUG: Enable debugging for IP. + */ +#if !defined IP_DEBUG || defined __DOXYGEN__ +#define IP_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. + */ +#if !defined IP_REASS_DEBUG || defined __DOXYGEN__ +#define IP_REASS_DEBUG LWIP_DBG_OFF +#endif + +/** + * RAW_DEBUG: Enable debugging in raw.c. + */ +#if !defined RAW_DEBUG || defined __DOXYGEN__ +#define RAW_DEBUG LWIP_DBG_OFF +#endif + +/** + * MEM_DEBUG: Enable debugging in mem.c. + */ +#if !defined MEM_DEBUG || defined __DOXYGEN__ +#define MEM_DEBUG LWIP_DBG_OFF +#endif + +/** + * MEMP_DEBUG: Enable debugging in memp.c. + */ +#if !defined MEMP_DEBUG || defined __DOXYGEN__ +#define MEMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SYS_DEBUG: Enable debugging in sys.c. + */ +#if !defined SYS_DEBUG || defined __DOXYGEN__ +#define SYS_DEBUG LWIP_DBG_OFF +#endif + +/** + * TIMERS_DEBUG: Enable debugging in timers.c. + */ +#if !defined TIMERS_DEBUG || defined __DOXYGEN__ +#define TIMERS_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_DEBUG: Enable debugging for TCP. + */ +#if !defined TCP_DEBUG || defined __DOXYGEN__ +#define TCP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. + */ +#if !defined TCP_INPUT_DEBUG || defined __DOXYGEN__ +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. + */ +#if !defined TCP_FR_DEBUG || defined __DOXYGEN__ +#define TCP_FR_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit + * timeout. + */ +#if !defined TCP_RTO_DEBUG || defined __DOXYGEN__ +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. + */ +#if !defined TCP_CWND_DEBUG || defined __DOXYGEN__ +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. + */ +#if !defined TCP_WND_DEBUG || defined __DOXYGEN__ +#define TCP_WND_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. + */ +#if !defined TCP_OUTPUT_DEBUG || defined __DOXYGEN__ +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. + */ +#if !defined TCP_RST_DEBUG || defined __DOXYGEN__ +#define TCP_RST_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. + */ +#if !defined TCP_QLEN_DEBUG || defined __DOXYGEN__ +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#endif + +/** + * UDP_DEBUG: Enable debugging in UDP. + */ +#if !defined UDP_DEBUG || defined __DOXYGEN__ +#define UDP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCPIP_DEBUG: Enable debugging in tcpip.c. + */ +#if !defined TCPIP_DEBUG || defined __DOXYGEN__ +#define TCPIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SLIP_DEBUG: Enable debugging in slipif.c. + */ +#if !defined SLIP_DEBUG || defined __DOXYGEN__ +#define SLIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * DHCP_DEBUG: Enable debugging in dhcp.c. + */ +#if !defined DHCP_DEBUG || defined __DOXYGEN__ +#define DHCP_DEBUG LWIP_DBG_OFF +#endif + +/** + * AUTOIP_DEBUG: Enable debugging in autoip.c. + */ +#if !defined AUTOIP_DEBUG || defined __DOXYGEN__ +#define AUTOIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * DNS_DEBUG: Enable debugging for DNS. + */ +#if !defined DNS_DEBUG || defined __DOXYGEN__ +#define DNS_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP6_DEBUG: Enable debugging for IPv6. + */ +#if !defined IP6_DEBUG || defined __DOXYGEN__ +#define IP6_DEBUG LWIP_DBG_OFF +#endif + +/** + * DHCP6_DEBUG: Enable debugging in dhcp6.c. + */ +#if !defined DHCP6_DEBUG || defined __DOXYGEN__ +#define DHCP6_DEBUG LWIP_DBG_OFF +#endif +/** + * @} + */ + +/** + * LWIP_TESTMODE: Changes to make unit test possible + */ +#if !defined LWIP_TESTMODE +#define LWIP_TESTMODE 0 +#endif + +/* + -------------------------------------------------- + ---------- Performance tracking options ---------- + -------------------------------------------------- +*/ +/** + * @defgroup lwip_opts_perf Performance + * @ingroup lwip_opts_debug + * @{ + */ +/** + * LWIP_PERF: Enable performance testing for lwIP + * (if enabled, arch/perf.h is included) + */ +#if !defined LWIP_PERF || defined __DOXYGEN__ +#define LWIP_PERF 0 +#endif +/** + * @} + */ + +#endif /* LWIP_HDR_OPT_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/pbuf.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/pbuf.h new file mode 100644 index 0000000..5a4fc88 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/pbuf.h @@ -0,0 +1,326 @@ +/** + * @file + * pbuf API + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef LWIP_HDR_PBUF_H +#define LWIP_HDR_PBUF_H + +#include "lwip/opt.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type + * but they are allocated by external code (initialised by calling + * pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they + * are freed by calling pbuf_custom->custom_free_function(). + * Currently, the pbuf_custom code is only needed for one specific configuration + * of IP_FRAG, unless required by external driver/application code. */ +#ifndef LWIP_SUPPORT_CUSTOM_PBUF +#define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)) +#endif + +/** @ingroup pbuf + * PBUF_NEEDS_COPY(p): return a boolean value indicating whether the given + * pbuf needs to be copied in order to be kept around beyond the current call + * stack without risking being corrupted. The default setting provides safety: + * it will make a copy iof any pbuf chain that does not consist entirely of + * PBUF_ROM type pbufs. For setups with zero-copy support, it may be redefined + * to evaluate to true in all cases, for example. However, doing so also has an + * effect on the application side: any buffers that are *not* copied must also + * *not* be reused by the application after passing them to lwIP. For example, + * when setting PBUF_NEEDS_COPY to (0), after using udp_send() with a PBUF_RAM + * pbuf, the application must free the pbuf immediately, rather than reusing it + * for other purposes. For more background information on this, see tasks #6735 + * and #7896, and bugs #11400 and #49914. */ +#ifndef PBUF_NEEDS_COPY +#define PBUF_NEEDS_COPY(p) ((p)->type_internal & PBUF_TYPE_FLAG_DATA_VOLATILE) +#endif /* PBUF_NEEDS_COPY */ + +/* @todo: We need a mechanism to prevent wasting memory in every pbuf + (TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */ + +#define PBUF_TRANSPORT_HLEN 20 +#if LWIP_IPV6 +#define PBUF_IP_HLEN 40 +#else +#define PBUF_IP_HLEN 20 +#endif + +/** + * @ingroup pbuf + * Enumeration of pbuf layers + */ +typedef enum { + /** Includes spare room for transport layer header, e.g. UDP header. + * Use this if you intend to pass the pbuf to functions like udp_send(). + */ + PBUF_TRANSPORT = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN, + /** Includes spare room for IP header. + * Use this if you intend to pass the pbuf to functions like raw_send(). + */ + PBUF_IP = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN, + /** Includes spare room for link layer header (ethernet header). + * Use this if you intend to pass the pbuf to functions like ethernet_output(). + * @see PBUF_LINK_HLEN + */ + PBUF_LINK = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN, + /** Includes spare room for additional encapsulation header before ethernet + * headers (e.g. 802.11). + * Use this if you intend to pass the pbuf to functions like netif->linkoutput(). + * @see PBUF_LINK_ENCAPSULATION_HLEN + */ + PBUF_RAW_TX = PBUF_LINK_ENCAPSULATION_HLEN, + /** Use this for input packets in a netif driver when calling netif->input() + * in the most common case - ethernet-layer netif driver. */ + PBUF_RAW = 0 +} pbuf_layer; + + +/* Base flags for pbuf_type definitions: */ + +/** Indicates that the payload directly follows the struct pbuf. + * This makes @ref pbuf_header work in both directions. */ +#define PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS 0x80 +/** Indicates the data stored in this pbuf can change. If this pbuf needs + * to be queued, it must be copied/duplicated. */ +#define PBUF_TYPE_FLAG_DATA_VOLATILE 0x40 +/** 4 bits are reserved for 16 allocation sources (e.g. heap, pool1, pool2, etc) + * Internally, we use: 0=heap, 1=MEMP_PBUF, 2=MEMP_PBUF_POOL -> 13 types free*/ +#define PBUF_TYPE_ALLOC_SRC_MASK 0x0F +/** Indicates this pbuf is used for RX (if not set, indicates use for TX). + * This information can be used to keep some spare RX buffers e.g. for + * receiving TCP ACKs to unblock a connection) */ +#define PBUF_ALLOC_FLAG_RX 0x0100 +/** Indicates the application needs the pbuf payload to be in one piece */ +#define PBUF_ALLOC_FLAG_DATA_CONTIGUOUS 0x0200 + +#define PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP 0x00 +#define PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF 0x01 +#define PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL 0x02 +/** First pbuf allocation type for applications */ +#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MIN 0x03 +/** Last pbuf allocation type for applications */ +#define PBUF_TYPE_ALLOC_SRC_MASK_APP_MAX PBUF_TYPE_ALLOC_SRC_MASK + +/** + * @ingroup pbuf + * Enumeration of pbuf types + */ +typedef enum { + /** pbuf data is stored in RAM, used for TX mostly, struct pbuf and its payload + are allocated in one piece of contiguous memory (so the first payload byte + can be calculated from struct pbuf). + pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might + change in future versions). + This should be used for all OUTGOING packets (TX).*/ + PBUF_RAM = (PBUF_ALLOC_FLAG_DATA_CONTIGUOUS | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_HEAP), + /** pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in + totally different memory areas. Since it points to ROM, payload does not + have to be copied when queued for transmission. */ + PBUF_ROM = PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF, + /** pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change + so it has to be duplicated when queued before transmitting, depending on + who has a 'ref' to it. */ + PBUF_REF = (PBUF_TYPE_FLAG_DATA_VOLATILE | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF), + /** pbuf payload refers to RAM. This one comes from a pool and should be used + for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct + pbuf and its payload are allocated in one piece of contiguous memory (so + the first payload byte can be calculated from struct pbuf). + Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing, + you are unable to receive TCP acks! */ + PBUF_POOL = (PBUF_ALLOC_FLAG_RX | PBUF_TYPE_FLAG_STRUCT_DATA_CONTIGUOUS | PBUF_TYPE_ALLOC_SRC_MASK_STD_MEMP_PBUF_POOL) +} pbuf_type; + + +/** indicates this packet's data should be immediately passed to the application */ +#define PBUF_FLAG_PUSH 0x01U +/** indicates this is a custom pbuf: pbuf_free calls pbuf_custom->custom_free_function() + when the last reference is released (plus custom PBUF_RAM cannot be trimmed) */ +#define PBUF_FLAG_IS_CUSTOM 0x02U +/** indicates this pbuf is UDP multicast to be looped back */ +#define PBUF_FLAG_MCASTLOOP 0x04U +/** indicates this pbuf was received as link-level broadcast */ +#define PBUF_FLAG_LLBCAST 0x08U +/** indicates this pbuf was received as link-level multicast */ +#define PBUF_FLAG_LLMCAST 0x10U +/** indicates this pbuf includes a TCP FIN flag */ +#define PBUF_FLAG_TCP_FIN 0x20U + +/** Main packet buffer struct */ +struct pbuf { + /** next pbuf in singly linked pbuf chain */ + struct pbuf *next; + + /** pointer to the actual data in the buffer */ + void *payload; + + /** + * total length of this buffer and all next buffers in chain + * belonging to the same packet. + * + * For non-queue packet chains this is the invariant: + * p->tot_len == p->len + (p->next? p->next->tot_len: 0) + */ + u16_t tot_len; + + /** length of this buffer */ + u16_t len; + + /** a bit field indicating pbuf type and allocation sources + (see PBUF_TYPE_FLAG_*, PBUF_ALLOC_FLAG_* and PBUF_TYPE_ALLOC_SRC_MASK) + */ + u8_t type_internal; + + /** misc flags */ + u8_t flags; + + /** + * the reference count always equals the number of pointers + * that refer to this pbuf. This can be pointers from an application, + * the stack itself, or pbuf->next pointers from a chain. + */ + LWIP_PBUF_REF_T ref; + + /** For incoming packets, this contains the input netif's index */ + u8_t if_idx; + + /** In case the user needs to store data custom data on a pbuf */ + LWIP_PBUF_CUSTOM_DATA +}; + + +/** Helper struct for const-correctness only. + * The only meaning of this one is to provide a const payload pointer + * for PBUF_ROM type. + */ +struct pbuf_rom { + /** next pbuf in singly linked pbuf chain */ + struct pbuf *next; + + /** pointer to the actual data in the buffer */ + const void *payload; +}; + +#if LWIP_SUPPORT_CUSTOM_PBUF +/** Prototype for a function to free a custom pbuf */ +typedef void (*pbuf_free_custom_fn)(struct pbuf *p); + +/** A custom pbuf: like a pbuf, but following a function pointer to free it. */ +struct pbuf_custom { + /** The actual pbuf */ + struct pbuf pbuf; + /** This function is called when pbuf_free deallocates this pbuf(_custom) */ + pbuf_free_custom_fn custom_free_function; +}; +#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ + +/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */ +#ifndef PBUF_POOL_FREE_OOSEQ +#define PBUF_POOL_FREE_OOSEQ 1 +#endif /* PBUF_POOL_FREE_OOSEQ */ +#if LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ +extern volatile u8_t pbuf_free_ooseq_pending; +void pbuf_free_ooseq(void); +/** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ() + at regular intervals from main level to check if ooseq pbufs need to be + freed! */ +#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \ + /* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \ + ooseq queued pbufs now */ \ + pbuf_free_ooseq(); }}while(0) +#else /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ */ + /* Otherwise declare an empty PBUF_CHECK_FREE_OOSEQ */ + #define PBUF_CHECK_FREE_OOSEQ() +#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ*/ + +/* Initializes the pbuf module. This call is empty for now, but may not be in future. */ +#define pbuf_init() + +struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); +struct pbuf *pbuf_alloc_reference(void *payload, u16_t length, pbuf_type type); +#if LWIP_SUPPORT_CUSTOM_PBUF +struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, + struct pbuf_custom *p, void *payload_mem, + u16_t payload_mem_len); +#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ +void pbuf_realloc(struct pbuf *p, u16_t size); +#define pbuf_get_allocsrc(p) ((p)->type_internal & PBUF_TYPE_ALLOC_SRC_MASK) +#define pbuf_match_allocsrc(p, type) (pbuf_get_allocsrc(p) == ((type) & PBUF_TYPE_ALLOC_SRC_MASK)) +#define pbuf_match_type(p, type) pbuf_match_allocsrc(p, type) +u8_t pbuf_header(struct pbuf *p, s16_t header_size); +u8_t pbuf_header_force(struct pbuf *p, s16_t header_size); +u8_t pbuf_add_header(struct pbuf *p, size_t header_size_increment); +u8_t pbuf_add_header_force(struct pbuf *p, size_t header_size_increment); +u8_t pbuf_remove_header(struct pbuf *p, size_t header_size); +struct pbuf *pbuf_free_header(struct pbuf *q, u16_t size); +void pbuf_ref(struct pbuf *p); +u8_t pbuf_free(struct pbuf *p); +u16_t pbuf_clen(const struct pbuf *p); +void pbuf_cat(struct pbuf *head, struct pbuf *tail); +void pbuf_chain(struct pbuf *head, struct pbuf *tail); +struct pbuf *pbuf_dechain(struct pbuf *p); +err_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from); +err_t pbuf_copy_partial_pbuf(struct pbuf *p_to, const struct pbuf *p_from, u16_t copy_len, u16_t offset); +u16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset); +void *pbuf_get_contiguous(const struct pbuf *p, void *buffer, size_t bufsize, u16_t len, u16_t offset); +err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); +err_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset); +struct pbuf *pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset); +struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); +struct pbuf *pbuf_clone(pbuf_layer l, pbuf_type type, struct pbuf *p); +#if LWIP_CHECKSUM_ON_COPY +err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, + u16_t len, u16_t *chksum); +#endif /* LWIP_CHECKSUM_ON_COPY */ +#if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE +void pbuf_split_64k(struct pbuf *p, struct pbuf **rest); +#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */ + +u8_t pbuf_get_at(const struct pbuf* p, u16_t offset); +int pbuf_try_get_at(const struct pbuf* p, u16_t offset); +void pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data); +u16_t pbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n); +u16_t pbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset); +u16_t pbuf_strstr(const struct pbuf* p, const char* substr); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PBUF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/altcp_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/altcp_priv.h new file mode 100644 index 0000000..d1de9b1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/altcp_priv.h @@ -0,0 +1,159 @@ +/** + * @file + * Application layered TCP connection API (to be used from TCPIP thread)\n + * This interface mimics the tcp callback API to the application while preventing + * direct linking (much like virtual functions). + * This way, an application can make use of other application layer protocols + * on top of TCP without knowing the details (e.g. TLS, proxy connection). + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_ALTCP_PRIV_H +#define LWIP_HDR_ALTCP_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_ALTCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/altcp.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct altcp_pcb *altcp_alloc(void); +void altcp_free(struct altcp_pcb *conn); + +/* Function prototypes for application layers */ +typedef void (*altcp_set_poll_fn)(struct altcp_pcb *conn, u8_t interval); +typedef void (*altcp_recved_fn)(struct altcp_pcb *conn, u16_t len); +typedef err_t (*altcp_bind_fn)(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +typedef err_t (*altcp_connect_fn)(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port, altcp_connected_fn connected); + +typedef struct altcp_pcb *(*altcp_listen_fn)(struct altcp_pcb *conn, u8_t backlog, err_t *err); + +typedef void (*altcp_abort_fn)(struct altcp_pcb *conn); +typedef err_t (*altcp_close_fn)(struct altcp_pcb *conn); +typedef err_t (*altcp_shutdown_fn)(struct altcp_pcb *conn, int shut_rx, int shut_tx); + +typedef err_t (*altcp_write_fn)(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +typedef err_t (*altcp_output_fn)(struct altcp_pcb *conn); + +typedef u16_t (*altcp_mss_fn)(struct altcp_pcb *conn); +typedef u16_t (*altcp_sndbuf_fn)(struct altcp_pcb *conn); +typedef u16_t (*altcp_sndqueuelen_fn)(struct altcp_pcb *conn); +typedef void (*altcp_nagle_disable_fn)(struct altcp_pcb *conn); +typedef void (*altcp_nagle_enable_fn)(struct altcp_pcb *conn); +typedef int (*altcp_nagle_disabled_fn)(struct altcp_pcb *conn); + +typedef void (*altcp_setprio_fn)(struct altcp_pcb *conn, u8_t prio); + +typedef void (*altcp_dealloc_fn)(struct altcp_pcb *conn); + +typedef err_t (*altcp_get_tcp_addrinfo_fn)(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +typedef ip_addr_t *(*altcp_get_ip_fn)(struct altcp_pcb *conn, int local); +typedef u16_t (*altcp_get_port_fn)(struct altcp_pcb *conn, int local); + +#if LWIP_TCP_KEEPALIVE +typedef void (*altcp_keepalive_disable_fn)(struct altcp_pcb *conn); +typedef void (*altcp_keepalive_enable_fn)(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); +#endif + +#ifdef LWIP_DEBUG +typedef enum tcp_state (*altcp_dbg_get_tcp_state_fn)(struct altcp_pcb *conn); +#endif + +struct altcp_functions { + altcp_set_poll_fn set_poll; + altcp_recved_fn recved; + altcp_bind_fn bind; + altcp_connect_fn connect; + altcp_listen_fn listen; + altcp_abort_fn abort; + altcp_close_fn close; + altcp_shutdown_fn shutdown; + altcp_write_fn write; + altcp_output_fn output; + altcp_mss_fn mss; + altcp_sndbuf_fn sndbuf; + altcp_sndqueuelen_fn sndqueuelen; + altcp_nagle_disable_fn nagle_disable; + altcp_nagle_enable_fn nagle_enable; + altcp_nagle_disabled_fn nagle_disabled; + altcp_setprio_fn setprio; + altcp_dealloc_fn dealloc; + altcp_get_tcp_addrinfo_fn addrinfo; + altcp_get_ip_fn getip; + altcp_get_port_fn getport; +#if LWIP_TCP_KEEPALIVE + altcp_keepalive_disable_fn keepalive_disable; + altcp_keepalive_enable_fn keepalive_enable; +#endif +#ifdef LWIP_DEBUG + altcp_dbg_get_tcp_state_fn dbg_get_tcp_state; +#endif +}; + +void altcp_default_set_poll(struct altcp_pcb *conn, u8_t interval); +void altcp_default_recved(struct altcp_pcb *conn, u16_t len); +err_t altcp_default_bind(struct altcp_pcb *conn, const ip_addr_t *ipaddr, u16_t port); +err_t altcp_default_shutdown(struct altcp_pcb *conn, int shut_rx, int shut_tx); +err_t altcp_default_write(struct altcp_pcb *conn, const void *dataptr, u16_t len, u8_t apiflags); +err_t altcp_default_output(struct altcp_pcb *conn); +u16_t altcp_default_mss(struct altcp_pcb *conn); +u16_t altcp_default_sndbuf(struct altcp_pcb *conn); +u16_t altcp_default_sndqueuelen(struct altcp_pcb *conn); +void altcp_default_nagle_disable(struct altcp_pcb *conn); +void altcp_default_nagle_enable(struct altcp_pcb *conn); +int altcp_default_nagle_disabled(struct altcp_pcb *conn); +void altcp_default_setprio(struct altcp_pcb *conn, u8_t prio); +void altcp_default_dealloc(struct altcp_pcb *conn); +err_t altcp_default_get_tcp_addrinfo(struct altcp_pcb *conn, int local, ip_addr_t *addr, u16_t *port); +ip_addr_t *altcp_default_get_ip(struct altcp_pcb *conn, int local); +u16_t altcp_default_get_port(struct altcp_pcb *conn, int local); +#if LWIP_TCP_KEEPALIVE +void altcp_default_keepalive_disable(struct altcp_pcb *conn); +void altcp_default_keepalive_enable(struct altcp_pcb *conn, u32_t idle, u32_t intvl, u32_t count); +#endif +#ifdef LWIP_DEBUG +enum tcp_state altcp_default_dbg_get_tcp_state(struct altcp_pcb *conn); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ALTCP */ + +#endif /* LWIP_HDR_ALTCP_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/api_msg.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/api_msg.h new file mode 100644 index 0000000..9e8ffc9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/api_msg.h @@ -0,0 +1,272 @@ +/** + * @file + * netconn API lwIP internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_API_MSG_H +#define LWIP_HDR_API_MSG_H + +#include "lwip/opt.h" + +#include "lwip/arch.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/sys.h" +#include "lwip/igmp.h" +#include "lwip/api.h" +#include "lwip/priv/tcpip_priv.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ +/* Note: Netconn API is always available when sockets are enabled - + * sockets are implemented on top of them */ + +#if LWIP_MPU_COMPATIBLE +#if LWIP_NETCONN_SEM_PER_THREAD +#define API_MSG_M_DEF_SEM(m) *m +#else +#define API_MSG_M_DEF_SEM(m) API_MSG_M_DEF(m) +#endif +#else /* LWIP_MPU_COMPATIBLE */ +#define API_MSG_M_DEF_SEM(m) API_MSG_M_DEF(m) +#endif /* LWIP_MPU_COMPATIBLE */ + +/* For the netconn API, these values are use as a bitmask! */ +#define NETCONN_SHUT_RD 1 +#define NETCONN_SHUT_WR 2 +#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR) + +/* IP addresses and port numbers are expected to be in + * the same byte order as in the corresponding pcb. + */ +/** This struct includes everything that is necessary to execute a function + for a netconn in another thread context (mainly used to process netconns + in the tcpip_thread context to be thread safe). */ +struct api_msg { + /** The netconn which to process - always needed: it includes the semaphore + which is used to block the application thread until the function finished. */ + struct netconn *conn; + /** The return value of the function executed in tcpip_thread. */ + err_t err; + /** Depending on the executed function, one of these union members is used */ + union { + /** used for lwip_netconn_do_send */ + struct netbuf *b; + /** used for lwip_netconn_do_newconn */ + struct { + u8_t proto; + } n; + /** used for lwip_netconn_do_bind and lwip_netconn_do_connect */ + struct { + API_MSG_M_DEF_C(ip_addr_t, ipaddr); + u16_t port; + u8_t if_idx; + } bc; + /** used for lwip_netconn_do_getaddr */ + struct { + ip_addr_t API_MSG_M_DEF(ipaddr); + u16_t API_MSG_M_DEF(port); + u8_t local; + } ad; + /** used for lwip_netconn_do_write */ + struct { + /** current vector to write */ + const struct netvector *vector; + /** number of unwritten vectors */ + u16_t vector_cnt; + /** offset into current vector */ + size_t vector_off; + /** total length across vectors */ + size_t len; + /** offset into total length/output of bytes written when err == ERR_OK */ + size_t offset; + u8_t apiflags; +#if LWIP_SO_SNDTIMEO + u32_t time_started; +#endif /* LWIP_SO_SNDTIMEO */ + } w; + /** used for lwip_netconn_do_recv */ + struct { + size_t len; + } r; +#if LWIP_TCP + /** used for lwip_netconn_do_close (/shutdown) */ + struct { + u8_t shut; +#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER + u32_t time_started; +#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ + u8_t polls_left; +#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */ + } sd; +#endif /* LWIP_TCP */ +#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) + /** used for lwip_netconn_do_join_leave_group */ + struct { + API_MSG_M_DEF_C(ip_addr_t, multiaddr); + API_MSG_M_DEF_C(ip_addr_t, netif_addr); + u8_t if_idx; + enum netconn_igmp join_or_leave; + } jl; +#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ +#if TCP_LISTEN_BACKLOG + struct { + u8_t backlog; + } lb; +#endif /* TCP_LISTEN_BACKLOG */ + } msg; +#if LWIP_NETCONN_SEM_PER_THREAD + sys_sem_t* op_completed_sem; +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ +}; + +#if LWIP_NETCONN_SEM_PER_THREAD +#define LWIP_API_MSG_SEM(msg) ((msg)->op_completed_sem) +#else /* LWIP_NETCONN_SEM_PER_THREAD */ +#define LWIP_API_MSG_SEM(msg) (&(msg)->conn->op_completed) +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + + +#if LWIP_DNS +/** As lwip_netconn_do_gethostbyname requires more arguments but doesn't require a netconn, + it has its own struct (to avoid struct api_msg getting bigger than necessary). + lwip_netconn_do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg + (see netconn_gethostbyname). */ +struct dns_api_msg { + /** Hostname to query or dotted IP address string */ +#if LWIP_MPU_COMPATIBLE + char name[DNS_MAX_NAME_LENGTH]; +#else /* LWIP_MPU_COMPATIBLE */ + const char *name; +#endif /* LWIP_MPU_COMPATIBLE */ + /** The resolved address is stored here */ + ip_addr_t API_MSG_M_DEF(addr); +#if LWIP_IPV4 && LWIP_IPV6 + /** Type of resolve call */ + u8_t dns_addrtype; +#endif /* LWIP_IPV4 && LWIP_IPV6 */ + /** This semaphore is posted when the name is resolved, the application thread + should wait on it. */ + sys_sem_t API_MSG_M_DEF_SEM(sem); + /** Errors are given back here */ + err_t API_MSG_M_DEF(err); +}; +#endif /* LWIP_DNS */ + +#if LWIP_NETCONN_FULLDUPLEX +int lwip_netconn_is_deallocated_msg(void *msg); +#endif +int lwip_netconn_is_err_msg(void *msg, err_t *err); +void lwip_netconn_do_newconn (void *m); +void lwip_netconn_do_delconn (void *m); +void lwip_netconn_do_bind (void *m); +void lwip_netconn_do_bind_if (void *m); +void lwip_netconn_do_connect (void *m); +void lwip_netconn_do_disconnect (void *m); +void lwip_netconn_do_listen (void *m); +void lwip_netconn_do_send (void *m); +void lwip_netconn_do_recv (void *m); +#if TCP_LISTEN_BACKLOG +void lwip_netconn_do_accepted (void *m); +#endif /* TCP_LISTEN_BACKLOG */ +void lwip_netconn_do_write (void *m); +void lwip_netconn_do_getaddr (void *m); +void lwip_netconn_do_close (void *m); +void lwip_netconn_do_shutdown (void *m); +#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) +void lwip_netconn_do_join_leave_group(void *m); +void lwip_netconn_do_join_leave_group_netif(void *m); +#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */ + +#if LWIP_DNS +void lwip_netconn_do_gethostbyname(void *arg); +#endif /* LWIP_DNS */ + +struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback); +void netconn_free(struct netconn *conn); + +#endif /* LWIP_NETCONN || LWIP_SOCKET */ + +#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ + +/* netifapi related lwIP internal definitions */ + +#if LWIP_MPU_COMPATIBLE +#define NETIFAPI_IPADDR_DEF(type, m) type m +#else /* LWIP_MPU_COMPATIBLE */ +#define NETIFAPI_IPADDR_DEF(type, m) const type * m +#endif /* LWIP_MPU_COMPATIBLE */ + +typedef void (*netifapi_void_fn)(struct netif *netif); +typedef err_t (*netifapi_errt_fn)(struct netif *netif); + +struct netifapi_msg { + struct tcpip_api_call_data call; + struct netif *netif; + union { + struct { +#if LWIP_IPV4 + NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr); + NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask); + NETIFAPI_IPADDR_DEF(ip4_addr_t, gw); +#endif /* LWIP_IPV4 */ + void *state; + netif_init_fn init; + netif_input_fn input; + } add; + struct { + netifapi_void_fn voidfunc; + netifapi_errt_fn errtfunc; + } common; + struct { +#if LWIP_MPU_COMPATIBLE + char name[NETIF_NAMESIZE]; +#else /* LWIP_MPU_COMPATIBLE */ + char *name; +#endif /* LWIP_MPU_COMPATIBLE */ + u8_t index; + } ifs; + } msg; +}; + +#endif /* LWIP_NETIF_API */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_API_MSG_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/mem_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/mem_priv.h new file mode 100644 index 0000000..8630d75 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/mem_priv.h @@ -0,0 +1,84 @@ +/** + * @file + * lwIP internal memory implementations (do not use in application code) + */ + +/* + * Copyright (c) 2018 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_MEM_PRIV_H +#define LWIP_HDR_MEM_PRIV_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/mem.h" + +#if MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK +/* if MEM_OVERFLOW_CHECK or MEMP_OVERFLOW_CHECK is turned on, we reserve some + * bytes at the beginning and at the end of each element, initialize them as + * 0xcd and check them later. + * If MEM(P)_OVERFLOW_CHECK is >= 2, on every call to mem(p)_malloc or mem(p)_free, + * every single element in each pool/heap is checked! + * This is VERY SLOW but also very helpful. + * MEM_SANITY_REGION_BEFORE and MEM_SANITY_REGION_AFTER can be overridden in + * lwipopts.h to change the amount reserved for checking. */ +#ifndef MEM_SANITY_REGION_BEFORE +#define MEM_SANITY_REGION_BEFORE 16 +#endif /* MEM_SANITY_REGION_BEFORE*/ +#if MEM_SANITY_REGION_BEFORE > 0 +#define MEM_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SANITY_REGION_BEFORE) +#else +#define MEM_SANITY_REGION_BEFORE_ALIGNED 0 +#endif /* MEM_SANITY_REGION_BEFORE*/ +#ifndef MEM_SANITY_REGION_AFTER +#define MEM_SANITY_REGION_AFTER 16 +#endif /* MEM_SANITY_REGION_AFTER*/ +#if MEM_SANITY_REGION_AFTER > 0 +#define MEM_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SANITY_REGION_AFTER) +#else +#define MEM_SANITY_REGION_AFTER_ALIGNED 0 +#endif /* MEM_SANITY_REGION_AFTER*/ + +void mem_overflow_init_raw(void *p, size_t size); +void mem_overflow_check_raw(void *p, size_t size, const char *descr1, const char *descr2); + +#endif /* MEM_OVERFLOW_CHECK || MEMP_OVERFLOW_CHECK */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_MEMP_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_priv.h new file mode 100644 index 0000000..1f14cb1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_priv.h @@ -0,0 +1,161 @@ +/** + * @file + * memory pools lwIP internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef LWIP_HDR_MEMP_PRIV_H +#define LWIP_HDR_MEMP_PRIV_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/mem.h" +#include "lwip/priv/mem_priv.h" + +#if MEMP_OVERFLOW_CHECK + + +/* MEMP_SIZE: save space for struct memp and for sanity check */ +#define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEM_SANITY_REGION_BEFORE_ALIGNED) +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEM_SANITY_REGION_AFTER_ALIGNED) + +#else /* MEMP_OVERFLOW_CHECK */ + +/* No sanity checks + * We don't need to preserve the struct memp while not allocated, so we + * can save a little space and set MEMP_SIZE to 0. + */ +#define MEMP_SIZE 0 +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) + +#endif /* MEMP_OVERFLOW_CHECK */ + +#if !MEMP_MEM_MALLOC || MEMP_OVERFLOW_CHECK +struct memp { + struct memp *next; +#if MEMP_OVERFLOW_CHECK + const char *file; + int line; +#endif /* MEMP_OVERFLOW_CHECK */ +}; +#endif /* !MEMP_MEM_MALLOC || MEMP_OVERFLOW_CHECK */ + +#if MEM_USE_POOLS && MEMP_USE_CUSTOM_POOLS +/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */ +typedef enum { + /* Get the first (via: + MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/ + MEMP_POOL_HELPER_FIRST = ((u8_t) +#define LWIP_MEMPOOL(name,num,size,desc) +#define LWIP_MALLOC_MEMPOOL_START 1 +#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0 +#define LWIP_MALLOC_MEMPOOL_END +#include "lwip/priv/memp_std.h" + ) , + /* Get the last (via: + MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */ + MEMP_POOL_HELPER_LAST = ((u8_t) +#define LWIP_MEMPOOL(name,num,size,desc) +#define LWIP_MALLOC_MEMPOOL_START +#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size * +#define LWIP_MALLOC_MEMPOOL_END 1 +#include "lwip/priv/memp_std.h" + ) +} memp_pool_helper_t; + +/* The actual start and stop values are here (cast them over) + We use this helper type and these defines so we can avoid using const memp_t values */ +#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST) +#define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST) +#endif /* MEM_USE_POOLS && MEMP_USE_CUSTOM_POOLS */ + +/** Memory pool descriptor */ +struct memp_desc { +#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY + /** Textual description */ + const char *desc; +#endif /* LWIP_DEBUG || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY */ +#if MEMP_STATS + /** Statistics */ + struct stats_mem *stats; +#endif + + /** Element size */ + u16_t size; + +#if !MEMP_MEM_MALLOC + /** Number of elements */ + u16_t num; + + /** Base address */ + u8_t *base; + + /** First free element of each pool. Elements form a linked list. */ + struct memp **tab; +#endif /* MEMP_MEM_MALLOC */ +}; + +#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY +#define DECLARE_LWIP_MEMPOOL_DESC(desc) (desc), +#else +#define DECLARE_LWIP_MEMPOOL_DESC(desc) +#endif + +#if MEMP_STATS +#define LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(name) static struct stats_mem name; +#define LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(name) &name, +#else +#define LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(name) +#define LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(name) +#endif + +void memp_init_pool(const struct memp_desc *desc); + +#if MEMP_OVERFLOW_CHECK +void *memp_malloc_pool_fn(const struct memp_desc* desc, const char* file, const int line); +#define memp_malloc_pool(d) memp_malloc_pool_fn((d), __FILE__, __LINE__) +#else +void *memp_malloc_pool(const struct memp_desc *desc); +#endif +void memp_free_pool(const struct memp_desc* desc, void *mem); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_MEMP_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_std.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_std.h new file mode 100644 index 0000000..669ad4d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/memp_std.h @@ -0,0 +1,153 @@ +/** + * @file + * lwIP internal memory pools (do not use in application code) + * This file is deliberately included multiple times: once with empty + * definition of LWIP_MEMPOOL() to handle all includes and multiple times + * to build up various lists of mem pools. + */ + +/* + * SETUP: Make sure we define everything we will need. + * + * We have create three types of pools: + * 1) MEMPOOL - standard pools + * 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c + * 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct + * + * If the include'r doesn't require any special treatment of each of the types + * above, then will declare #2 & #3 to be just standard mempools. + */ +#ifndef LWIP_MALLOC_MEMPOOL +/* This treats "malloc pools" just like any other pool. + The pools are a little bigger to provide 'size' as the amount of user data. */ +#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))), "MALLOC_"#size) +#define LWIP_MALLOC_MEMPOOL_START +#define LWIP_MALLOC_MEMPOOL_END +#endif /* LWIP_MALLOC_MEMPOOL */ + +#ifndef LWIP_PBUF_MEMPOOL +/* This treats "pbuf pools" just like any other pool. + * Allocates buffers for a pbuf struct AND a payload size */ +#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) + LWIP_MEM_ALIGN_SIZE(payload)), desc) +#endif /* LWIP_PBUF_MEMPOOL */ + + +/* + * A list of internal pools used by LWIP. + * + * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description) + * creates a pool name MEMP_pool_name. description is used in stats.c + */ +#if LWIP_RAW +LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB") +#endif /* LWIP_RAW */ + +#if LWIP_UDP +LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB") +#endif /* LWIP_UDP */ + +#if LWIP_TCP +LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB") +LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN") +LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG") +#endif /* LWIP_TCP */ + +#if LWIP_ALTCP && LWIP_TCP +LWIP_MEMPOOL(ALTCP_PCB, MEMP_NUM_ALTCP_PCB, sizeof(struct altcp_pcb), "ALTCP_PCB") +#endif /* LWIP_ALTCP && LWIP_TCP */ + +#if LWIP_IPV4 && IP_REASSEMBLY +LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA") +#endif /* LWIP_IPV4 && IP_REASSEMBLY */ +#if (IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG) +LWIP_MEMPOOL(FRAG_PBUF, MEMP_NUM_FRAG_PBUF, sizeof(struct pbuf_custom_ref),"FRAG_PBUF") +#endif /* IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF || (LWIP_IPV6 && LWIP_IPV6_FRAG) */ + +#if LWIP_NETCONN || LWIP_SOCKET +LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF") +LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN") +#endif /* LWIP_NETCONN || LWIP_SOCKET */ + +#if NO_SYS==0 +LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API") +#if LWIP_MPU_COMPATIBLE +LWIP_MEMPOOL(API_MSG, MEMP_NUM_API_MSG, sizeof(struct api_msg), "API_MSG") +#if LWIP_DNS +LWIP_MEMPOOL(DNS_API_MSG, MEMP_NUM_DNS_API_MSG, sizeof(struct dns_api_msg), "DNS_API_MSG") +#endif +#if LWIP_SOCKET && !LWIP_TCPIP_CORE_LOCKING +LWIP_MEMPOOL(SOCKET_SETGETSOCKOPT_DATA, MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA, sizeof(struct lwip_setgetsockopt_data), "SOCKET_SETGETSOCKOPT_DATA") +#endif +#if LWIP_SOCKET && (LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL) +LWIP_MEMPOOL(SELECT_CB, MEMP_NUM_SELECT_CB, sizeof(struct lwip_select_cb), "SELECT_CB") +#endif /* LWIP_SOCKET && (LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL) */ +#if LWIP_NETIF_API +LWIP_MEMPOOL(NETIFAPI_MSG, MEMP_NUM_NETIFAPI_MSG, sizeof(struct netifapi_msg), "NETIFAPI_MSG") +#endif +#endif /* LWIP_MPU_COMPATIBLE */ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT +LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT") +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ +#endif /* NO_SYS==0 */ + +#if LWIP_IPV4 && LWIP_ARP && ARP_QUEUEING +LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE") +#endif /* LWIP_IPV4 && LWIP_ARP && ARP_QUEUEING */ + +#if LWIP_IGMP +LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP") +#endif /* LWIP_IGMP */ + +#if LWIP_TIMERS && !LWIP_TIMERS_CUSTOM +LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT") +#endif /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */ + +#if LWIP_DNS && LWIP_SOCKET +LWIP_MEMPOOL(NETDB, MEMP_NUM_NETDB, NETDB_ELEM_SIZE, "NETDB") +#endif /* LWIP_DNS && LWIP_SOCKET */ +#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC +LWIP_MEMPOOL(LOCALHOSTLIST, MEMP_NUM_LOCALHOSTLIST, LOCALHOSTLIST_ELEM_SIZE, "LOCALHOSTLIST") +#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +#if LWIP_IPV6 && LWIP_ND6_QUEUEING +LWIP_MEMPOOL(ND6_QUEUE, MEMP_NUM_ND6_QUEUE, sizeof(struct nd6_q_entry), "ND6_QUEUE") +#endif /* LWIP_IPV6 && LWIP_ND6_QUEUEING */ + +#if LWIP_IPV6 && LWIP_IPV6_REASS +LWIP_MEMPOOL(IP6_REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip6_reassdata), "IP6_REASSDATA") +#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */ + +#if LWIP_IPV6 && LWIP_IPV6_MLD +LWIP_MEMPOOL(MLD6_GROUP, MEMP_NUM_MLD6_GROUP, sizeof(struct mld_group), "MLD6_GROUP") +#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ + + +/* + * A list of pools of pbuf's used by LWIP. + * + * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description) + * creates a pool name MEMP_pool_name. description is used in stats.c + * This allocates enough space for the pbuf struct and a payload. + * (Example: pbuf_payload_size=0 allocates only size for the struct) + */ +LWIP_MEMPOOL(PBUF, MEMP_NUM_PBUF, sizeof(struct pbuf), "PBUF_REF/ROM") +LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL") + + +/* + * Allow for user-defined pools; this must be explicitly set in lwipopts.h + * since the default is to NOT look for lwippools.h + */ +#if MEMP_USE_CUSTOM_POOLS +#include "lwippools.h" +#endif /* MEMP_USE_CUSTOM_POOLS */ + +/* + * REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later + * (#undef is ignored for something that is not defined) + */ +#undef LWIP_MEMPOOL +#undef LWIP_MALLOC_MEMPOOL +#undef LWIP_MALLOC_MEMPOOL_START +#undef LWIP_MALLOC_MEMPOOL_END +#undef LWIP_PBUF_MEMPOOL diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/nd6_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/nd6_priv.h new file mode 100644 index 0000000..cc3007d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/nd6_priv.h @@ -0,0 +1,142 @@ +/** + * @file + * + * Neighbor discovery and stateless address autoconfiguration for IPv6. + * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862 + * (Address autoconfiguration). + */ + +/* + * Copyright (c) 2010 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_ND6_PRIV_H +#define LWIP_HDR_ND6_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip6_addr.h" +#include "lwip/netif.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_ND6_QUEUEING +/** struct for queueing outgoing packets for unknown address + * defined here to be accessed by memp.h + */ +struct nd6_q_entry { + struct nd6_q_entry *next; + struct pbuf *p; +}; +#endif /* LWIP_ND6_QUEUEING */ + +/** Struct for tables. */ +struct nd6_neighbor_cache_entry { + ip6_addr_t next_hop_address; + struct netif *netif; + u8_t lladdr[NETIF_MAX_HWADDR_LEN]; + /*u32_t pmtu;*/ +#if LWIP_ND6_QUEUEING + /** Pointer to queue of pending outgoing packets on this entry. */ + struct nd6_q_entry *q; +#else /* LWIP_ND6_QUEUEING */ + /** Pointer to a single pending outgoing packet on this entry. */ + struct pbuf *q; +#endif /* LWIP_ND6_QUEUEING */ + u8_t state; + u8_t isrouter; + union { + u32_t reachable_time; /* in seconds */ + u32_t delay_time; /* ticks (ND6_TMR_INTERVAL) */ + u32_t probes_sent; + u32_t stale_time; /* ticks (ND6_TMR_INTERVAL) */ + } counter; +}; + +struct nd6_destination_cache_entry { + ip6_addr_t destination_addr; + ip6_addr_t next_hop_addr; + u16_t pmtu; + u32_t age; +}; + +struct nd6_prefix_list_entry { + ip6_addr_t prefix; + struct netif *netif; + u32_t invalidation_timer; /* in seconds */ +}; + +struct nd6_router_list_entry { + struct nd6_neighbor_cache_entry *neighbor_entry; + u32_t invalidation_timer; /* in seconds */ + u8_t flags; +}; + +enum nd6_neighbor_cache_entry_state { + ND6_NO_ENTRY = 0, + ND6_INCOMPLETE, + ND6_REACHABLE, + ND6_STALE, + ND6_DELAY, + ND6_PROBE +}; + +#define ND6_HOPLIM 255 /* maximum hop limit, required in all ND packets */ + +#define ND6_2HRS 7200 /* two hours, expressed in number of seconds */ + +/* Router tables. */ +/* @todo make these static? and entries accessible through API? */ +extern struct nd6_neighbor_cache_entry neighbor_cache[]; +extern struct nd6_destination_cache_entry destination_cache[]; +extern struct nd6_prefix_list_entry prefix_list[]; +extern struct nd6_router_list_entry default_router_list[]; + +/* Default values, can be updated by a RA message. */ +extern u32_t reachable_time; +extern u32_t retrans_timer; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_ND6_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/raw_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/raw_priv.h new file mode 100644 index 0000000..d4561d4 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/raw_priv.h @@ -0,0 +1,69 @@ +/** + * @file + * raw API internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_RAW_PRIV_H +#define LWIP_HDR_RAW_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/raw.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** return codes for raw_input */ +typedef enum raw_input_state +{ + RAW_INPUT_NONE = 0, /* pbuf did not match any pcbs */ + RAW_INPUT_EATEN, /* pbuf handed off and delivered to pcb */ + RAW_INPUT_DELIVERED /* pbuf only delivered to pcb (pbuf can still be referenced) */ +} raw_input_state_t; + +/* The following functions are the lower layer interface to RAW. */ +raw_input_state_t raw_input(struct pbuf *p, struct netif *inp); + +void raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_RAW */ + +#endif /* LWIP_HDR_RAW_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/sockets_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/sockets_priv.h new file mode 100644 index 0000000..d8f9904 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/sockets_priv.h @@ -0,0 +1,175 @@ +/** + * @file + * Sockets API internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2017 Joel Cunningham, Garmin International, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Joel Cunningham + * + */ +#ifndef LWIP_HDR_SOCKETS_PRIV_H +#define LWIP_HDR_SOCKETS_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/err.h" +#include "lwip/sockets.h" +#include "lwip/sys.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define NUM_SOCKETS MEMP_NUM_NETCONN + +/** This is overridable for the rare case where more than 255 threads + * select on the same socket... + */ +#ifndef SELWAIT_T +#define SELWAIT_T u8_t +#endif + +union lwip_sock_lastdata { + struct netbuf *netbuf; + struct pbuf *pbuf; +}; + +/** Contains all internal pointers and states used for a socket */ +struct lwip_sock { + /** sockets currently are built on netconns, each socket has one netconn */ + struct netconn *conn; + /** data that was left from the previous read */ + union lwip_sock_lastdata lastdata; +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL + /** number of times data was received, set by event_callback(), + tested by the receive and select functions */ + s16_t rcvevent; + /** number of times data was ACKed (free send buffer), set by event_callback(), + tested by select */ + u16_t sendevent; + /** error happened for this socket, set by event_callback(), tested by select */ + u16_t errevent; + /** counter of how many threads are waiting for this socket using select */ + SELWAIT_T select_waiting; +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ +#if LWIP_NETCONN_FULLDUPLEX + /* counter of how many threads are using a struct lwip_sock (not the 'int') */ + u8_t fd_used; + /* status of pending close/delete actions */ + u8_t fd_free_pending; +#define LWIP_SOCK_FD_FREE_TCP 1 +#define LWIP_SOCK_FD_FREE_FREE 2 +#endif +}; + +#ifndef set_errno +#define set_errno(err) do { if (err) { errno = (err); } } while(0) +#endif + +#if !LWIP_TCPIP_CORE_LOCKING +/** Maximum optlen used by setsockopt/getsockopt */ +#define LWIP_SETGETSOCKOPT_MAXOPTLEN LWIP_MAX(16, sizeof(struct ifreq)) + +/** This struct is used to pass data to the set/getsockopt_internal + * functions running in tcpip_thread context (only a void* is allowed) */ +struct lwip_setgetsockopt_data { + /** socket index for which to change options */ + int s; + /** level of the option to process */ + int level; + /** name of the option to process */ + int optname; + /** set: value to set the option to + * get: value of the option is stored here */ +#if LWIP_MPU_COMPATIBLE + u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN]; +#else + union { + void *p; + const void *pc; + } optval; +#endif + /** size of *optval */ + socklen_t optlen; + /** if an error occurs, it is temporarily stored here */ + int err; + /** semaphore to wake up the calling task */ + void* completed_sem; +}; +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + +#ifdef __cplusplus +} +#endif + +struct lwip_sock* lwip_socket_dbg_get_socket(int fd); + +#if LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL + +#if LWIP_NETCONN_SEM_PER_THREAD +#define SELECT_SEM_T sys_sem_t* +#define SELECT_SEM_PTR(sem) (sem) +#else /* LWIP_NETCONN_SEM_PER_THREAD */ +#define SELECT_SEM_T sys_sem_t +#define SELECT_SEM_PTR(sem) (&(sem)) +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ + +/** Description for a task waiting in select */ +struct lwip_select_cb { + /** Pointer to the next waiting task */ + struct lwip_select_cb *next; + /** Pointer to the previous waiting task */ + struct lwip_select_cb *prev; +#if LWIP_SOCKET_SELECT + /** readset passed to select */ + fd_set *readset; + /** writeset passed to select */ + fd_set *writeset; + /** unimplemented: exceptset passed to select */ + fd_set *exceptset; +#endif /* LWIP_SOCKET_SELECT */ +#if LWIP_SOCKET_POLL + /** fds passed to poll; NULL if select */ + struct pollfd *poll_fds; + /** nfds passed to poll; 0 if select */ + nfds_t poll_nfds; +#endif /* LWIP_SOCKET_POLL */ + /** don't signal the same semaphore twice: set to 1 when signalled */ + int sem_signalled; + /** semaphore to wake up a task waiting for select */ + SELECT_SEM_T sem; +}; +#endif /* LWIP_SOCKET_SELECT || LWIP_SOCKET_POLL */ + +#endif /* LWIP_SOCKET */ + +#endif /* LWIP_HDR_SOCKETS_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcp_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcp_priv.h new file mode 100644 index 0000000..72f9126 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcp_priv.h @@ -0,0 +1,523 @@ +/** + * @file + * TCP internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_TCP_PRIV_H +#define LWIP_HDR_TCP_PRIV_H + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcp.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/icmp.h" +#include "lwip/err.h" +#include "lwip/ip6.h" +#include "lwip/ip6_addr.h" +#include "lwip/prot/tcp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Functions for interfacing with TCP: */ + +/* Lower layer interface to TCP: */ +void tcp_init (void); /* Initialize this module. */ +void tcp_tmr (void); /* Must be called every + TCP_TMR_INTERVAL + ms. (Typically 250 ms). */ +/* It is also possible to call these two functions at the right + intervals (instead of calling tcp_tmr()). */ +void tcp_slowtmr (void); +void tcp_fasttmr (void); + +/* Call this from a netif driver (watch out for threading issues!) that has + returned a memory error on transmit and now has free buffers to send more. + This iterates all active pcbs that had an error and tries to call + tcp_output, so use this with care as it might slow down the system. */ +void tcp_txnow (void); + +/* Only used by IP to pass a TCP segment to TCP: */ +void tcp_input (struct pbuf *p, struct netif *inp); +/* Used within the TCP code only: */ +struct tcp_pcb * tcp_alloc (u8_t prio); +void tcp_free (struct tcp_pcb *pcb); +void tcp_abandon (struct tcp_pcb *pcb, int reset); +err_t tcp_send_empty_ack(struct tcp_pcb *pcb); +err_t tcp_rexmit (struct tcp_pcb *pcb); +err_t tcp_rexmit_rto_prepare(struct tcp_pcb *pcb); +void tcp_rexmit_rto_commit(struct tcp_pcb *pcb); +void tcp_rexmit_rto (struct tcp_pcb *pcb); +void tcp_rexmit_fast (struct tcp_pcb *pcb); +u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); +err_t tcp_process_refused_data(struct tcp_pcb *pcb); + +/** + * This is the Nagle algorithm: try to combine user data to send as few TCP + * segments as possible. Only send if + * - no previously transmitted data on the connection remains unacknowledged or + * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or + * - the only unsent segment is at least pcb->mss bytes long (or there is more + * than one unsent segment - with lwIP, this can happen although unsent->len < mss) + * - or if we are in fast-retransmit (TF_INFR) + */ +#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \ + ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \ + (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \ + ((tpcb)->unsent->len >= (tpcb)->mss))) || \ + ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) \ + ) ? 1 : 0) +#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK) + + +#define TCP_SEQ_LT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0) +#define TCP_SEQ_LEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0) +#define TCP_SEQ_GT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0) +#define TCP_SEQ_GEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0) +/* is b<=a<=c? */ +#if 0 /* see bug #10548 */ +#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b)) +#endif +#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c)) + +#ifndef TCP_TMR_INTERVAL +#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */ +#endif /* TCP_TMR_INTERVAL */ + +#ifndef TCP_FAST_INTERVAL +#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */ +#endif /* TCP_FAST_INTERVAL */ + +#ifndef TCP_SLOW_INTERVAL +#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */ +#endif /* TCP_SLOW_INTERVAL */ + +#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */ +#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */ + +#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ + +#ifndef TCP_MSL +#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ +#endif + +/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ +#ifndef TCP_KEEPIDLE_DEFAULT +#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ +#endif + +#ifndef TCP_KEEPINTVL_DEFAULT +#define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */ +#endif + +#ifndef TCP_KEEPCNT_DEFAULT +#define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */ +#endif + +#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ + +#define TCP_TCPLEN(seg) ((seg)->len + (((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0) ? 1U : 0U)) + +/** Flags used on input processing, not on pcb->flags +*/ +#define TF_RESET (u8_t)0x08U /* Connection was reset. */ +#define TF_CLOSED (u8_t)0x10U /* Connection was successfully closed. */ +#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ + + +#if LWIP_EVENT_API + +#define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) ret = lwip_tcp_event(arg, (pcb),\ + LWIP_EVENT_ACCEPT, NULL, 0, err) +#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_SENT, NULL, space, ERR_OK) +#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_RECV, (p), 0, (err)) +#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_RECV, NULL, 0, ERR_OK) +#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_CONNECTED, NULL, 0, (err)) +#define TCP_EVENT_POLL(pcb,ret) do { if ((pcb)->state != SYN_RCVD) { \ + ret = lwip_tcp_event((pcb)->callback_arg, (pcb), LWIP_EVENT_POLL, NULL, 0, ERR_OK); \ + } else { \ + ret = ERR_ARG; } } while(0) +/* For event API, last state SYN_RCVD must be excluded here: the application + has not seen this pcb, yet! */ +#define TCP_EVENT_ERR(last_state,errf,arg,err) do { if (last_state != SYN_RCVD) { \ + lwip_tcp_event((arg), NULL, LWIP_EVENT_ERR, NULL, 0, (err)); } } while(0) + +#else /* LWIP_EVENT_API */ + +#define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) \ + do { \ + if((lpcb)->accept != NULL) \ + (ret) = (lpcb)->accept((arg),(pcb),(err)); \ + else (ret) = ERR_ARG; \ + } while (0) + +#define TCP_EVENT_SENT(pcb,space,ret) \ + do { \ + if((pcb)->sent != NULL) \ + (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_RECV(pcb,p,err,ret) \ + do { \ + if((pcb)->recv != NULL) { \ + (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\ + } else { \ + (ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \ + } \ + } while (0) + +#define TCP_EVENT_CLOSED(pcb,ret) \ + do { \ + if(((pcb)->recv != NULL)) { \ + (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\ + } else { \ + (ret) = ERR_OK; \ + } \ + } while (0) + +#define TCP_EVENT_CONNECTED(pcb,err,ret) \ + do { \ + if((pcb)->connected != NULL) \ + (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_POLL(pcb,ret) \ + do { \ + if((pcb)->poll != NULL) \ + (ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_ERR(last_state,errf,arg,err) \ + do { \ + LWIP_UNUSED_ARG(last_state); \ + if((errf) != NULL) \ + (errf)((arg),(err)); \ + } while (0) + +#endif /* LWIP_EVENT_API */ + +/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */ +#if TCP_OVERSIZE && defined(LWIP_DEBUG) +#define TCP_OVERSIZE_DBGCHECK 1 +#else +#define TCP_OVERSIZE_DBGCHECK 0 +#endif + +/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */ +#define TCP_CHECKSUM_ON_COPY (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP) + +/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */ +struct tcp_seg { + struct tcp_seg *next; /* used when putting segments on a queue */ + struct pbuf *p; /* buffer containing data + TCP header */ + u16_t len; /* the TCP length of this segment */ +#if TCP_OVERSIZE_DBGCHECK + u16_t oversize_left; /* Extra bytes available at the end of the last + pbuf in unsent (used for asserting vs. + tcp_pcb.unsent_oversize only) */ +#endif /* TCP_OVERSIZE_DBGCHECK */ +#if TCP_CHECKSUM_ON_COPY + u16_t chksum; + u8_t chksum_swapped; +#endif /* TCP_CHECKSUM_ON_COPY */ + u8_t flags; +#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option (only used in SYN segments) */ +#define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ +#define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is + checksummed into 'chksum' */ +#define TF_SEG_OPTS_WND_SCALE (u8_t)0x08U /* Include WND SCALE option (only used in SYN segments) */ +#define TF_SEG_OPTS_SACK_PERM (u8_t)0x10U /* Include SACK Permitted option (only used in SYN segments) */ + struct tcp_hdr *tcphdr; /* the TCP header */ +}; + +#define LWIP_TCP_OPT_EOL 0 +#define LWIP_TCP_OPT_NOP 1 +#define LWIP_TCP_OPT_MSS 2 +#define LWIP_TCP_OPT_WS 3 +#define LWIP_TCP_OPT_SACK_PERM 4 +#define LWIP_TCP_OPT_TS 8 + +#define LWIP_TCP_OPT_LEN_MSS 4 +#if LWIP_TCP_TIMESTAMPS +#define LWIP_TCP_OPT_LEN_TS 10 +#define LWIP_TCP_OPT_LEN_TS_OUT 12 /* aligned for output (includes NOP padding) */ +#else +#define LWIP_TCP_OPT_LEN_TS_OUT 0 +#endif +#if LWIP_WND_SCALE +#define LWIP_TCP_OPT_LEN_WS 3 +#define LWIP_TCP_OPT_LEN_WS_OUT 4 /* aligned for output (includes NOP padding) */ +#else +#define LWIP_TCP_OPT_LEN_WS_OUT 0 +#endif + +#if LWIP_TCP_SACK_OUT +#define LWIP_TCP_OPT_LEN_SACK_PERM 2 +#define LWIP_TCP_OPT_LEN_SACK_PERM_OUT 4 /* aligned for output (includes NOP padding) */ +#else +#define LWIP_TCP_OPT_LEN_SACK_PERM_OUT 0 +#endif + +#define LWIP_TCP_OPT_LENGTH(flags) \ + ((flags) & TF_SEG_OPTS_MSS ? LWIP_TCP_OPT_LEN_MSS : 0) + \ + ((flags) & TF_SEG_OPTS_TS ? LWIP_TCP_OPT_LEN_TS_OUT : 0) + \ + ((flags) & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT : 0) + \ + ((flags) & TF_SEG_OPTS_SACK_PERM ? LWIP_TCP_OPT_LEN_SACK_PERM_OUT : 0) + +/** This returns a TCP header option for MSS in an u32_t */ +#define TCP_BUILD_MSS_OPTION(mss) lwip_htonl(0x02040000 | ((mss) & 0xFFFF)) + +#if LWIP_WND_SCALE +#define TCPWNDSIZE_F U32_F +#define TCPWND_MAX 0xFFFFFFFFU +#define TCPWND_CHECK16(x) LWIP_ASSERT("window size > 0xFFFF", (x) <= 0xFFFF) +#define TCPWND_MIN16(x) ((u16_t)LWIP_MIN((x), 0xFFFF)) +#else /* LWIP_WND_SCALE */ +#define TCPWNDSIZE_F U16_F +#define TCPWND_MAX 0xFFFFU +#define TCPWND_CHECK16(x) +#define TCPWND_MIN16(x) x +#endif /* LWIP_WND_SCALE */ + +/* Global variables: */ +extern struct tcp_pcb *tcp_input_pcb; +extern u32_t tcp_ticks; +extern u8_t tcp_active_pcbs_changed; + +/* The TCP PCB lists. */ +union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ + struct tcp_pcb_listen *listen_pcbs; + struct tcp_pcb *pcbs; +}; +extern struct tcp_pcb *tcp_bound_pcbs; +extern union tcp_listen_pcbs_t tcp_listen_pcbs; +extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a + state in which they accept or send + data. */ +extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */ + +#define NUM_TCP_PCB_LISTS_NO_TIME_WAIT 3 +#define NUM_TCP_PCB_LISTS 4 +extern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS]; + +/* Axioms about the above lists: + 1) Every TCP PCB that is not CLOSED is in one of the lists. + 2) A PCB is only in one of the lists. + 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state. + 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state. +*/ +/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB + with a PCB list or removes a PCB from a list, respectively. */ +#ifndef TCP_DEBUG_PCB_LISTS +#define TCP_DEBUG_PCB_LISTS 0 +#endif +#if TCP_DEBUG_PCB_LISTS +#define TCP_REG(pcbs, npcb) do {\ + struct tcp_pcb *tcp_tmp_pcb; \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %"U16_F"\n", (void *)(npcb), (npcb)->local_port)); \ + for (tcp_tmp_pcb = *(pcbs); \ + tcp_tmp_pcb != NULL; \ + tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \ + } \ + LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \ + (npcb)->next = *(pcbs); \ + LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \ + *(pcbs) = (npcb); \ + LWIP_ASSERT("TCP_REG: tcp_pcbs sane", tcp_pcbs_sane()); \ + tcp_timer_needed(); \ + } while(0) +#define TCP_RMV(pcbs, npcb) do { \ + struct tcp_pcb *tcp_tmp_pcb; \ + LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (void *)(npcb), (void *)(*(pcbs)))); \ + if(*(pcbs) == (npcb)) { \ + *(pcbs) = (*pcbs)->next; \ + } else for (tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + if(tcp_tmp_pcb->next == (npcb)) { \ + tcp_tmp_pcb->next = (npcb)->next; \ + break; \ + } \ + } \ + (npcb)->next = NULL; \ + LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (void *)(npcb), (void *)(*(pcbs)))); \ + } while(0) + +#else /* LWIP_DEBUG */ + +#define TCP_REG(pcbs, npcb) \ + do { \ + (npcb)->next = *pcbs; \ + *(pcbs) = (npcb); \ + tcp_timer_needed(); \ + } while (0) + +#define TCP_RMV(pcbs, npcb) \ + do { \ + if(*(pcbs) == (npcb)) { \ + (*(pcbs)) = (*pcbs)->next; \ + } \ + else { \ + struct tcp_pcb *tcp_tmp_pcb; \ + for (tcp_tmp_pcb = *pcbs; \ + tcp_tmp_pcb != NULL; \ + tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + if(tcp_tmp_pcb->next == (npcb)) { \ + tcp_tmp_pcb->next = (npcb)->next; \ + break; \ + } \ + } \ + } \ + (npcb)->next = NULL; \ + } while(0) + +#endif /* LWIP_DEBUG */ + +#define TCP_REG_ACTIVE(npcb) \ + do { \ + TCP_REG(&tcp_active_pcbs, npcb); \ + tcp_active_pcbs_changed = 1; \ + } while (0) + +#define TCP_RMV_ACTIVE(npcb) \ + do { \ + TCP_RMV(&tcp_active_pcbs, npcb); \ + tcp_active_pcbs_changed = 1; \ + } while (0) + +#define TCP_PCB_REMOVE_ACTIVE(pcb) \ + do { \ + tcp_pcb_remove(&tcp_active_pcbs, pcb); \ + tcp_active_pcbs_changed = 1; \ + } while (0) + + +/* Internal functions: */ +struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb); +void tcp_pcb_purge(struct tcp_pcb *pcb); +void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb); + +void tcp_segs_free(struct tcp_seg *seg); +void tcp_seg_free(struct tcp_seg *seg); +struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); + +#define tcp_ack(pcb) \ + do { \ + if((pcb)->flags & TF_ACK_DELAY) { \ + tcp_clear_flags(pcb, TF_ACK_DELAY); \ + tcp_ack_now(pcb); \ + } \ + else { \ + tcp_set_flags(pcb, TF_ACK_DELAY); \ + } \ + } while (0) + +#define tcp_ack_now(pcb) \ + tcp_set_flags(pcb, TF_ACK_NOW) + +err_t tcp_send_fin(struct tcp_pcb *pcb); +err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags); + +void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); + +void tcp_rst(const struct tcp_pcb* pcb, u32_t seqno, u32_t ackno, + const ip_addr_t *local_ip, const ip_addr_t *remote_ip, + u16_t local_port, u16_t remote_port); + +u32_t tcp_next_iss(struct tcp_pcb *pcb); + +err_t tcp_keepalive(struct tcp_pcb *pcb); +err_t tcp_split_unsent_seg(struct tcp_pcb *pcb, u16_t split); +err_t tcp_zero_window_probe(struct tcp_pcb *pcb); +void tcp_trigger_input_pcb_close(void); + +#if TCP_CALCULATE_EFF_SEND_MSS +u16_t tcp_eff_send_mss_netif(u16_t sendmss, struct netif *outif, + const ip_addr_t *dest); +#define tcp_eff_send_mss(sendmss, src, dest) \ + tcp_eff_send_mss_netif(sendmss, ip_route(src, dest), dest) +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + +#if LWIP_CALLBACK_API +err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); +#endif /* LWIP_CALLBACK_API */ + +#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG +void tcp_debug_print(struct tcp_hdr *tcphdr); +void tcp_debug_print_flags(u8_t flags); +void tcp_debug_print_state(enum tcp_state s); +void tcp_debug_print_pcbs(void); +s16_t tcp_pcbs_sane(void); +#else +# define tcp_debug_print(tcphdr) +# define tcp_debug_print_flags(flags) +# define tcp_debug_print_state(s) +# define tcp_debug_print_pcbs() +# define tcp_pcbs_sane() 1 +#endif /* TCP_DEBUG */ + +/** External function (implemented in timers.c), called when TCP detects + * that a timer is needed (i.e. active- or time-wait-pcb found). */ +void tcp_timer_needed(void); + +void tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); + +#if TCP_QUEUE_OOSEQ +void tcp_free_ooseq(struct tcp_pcb *pcb); +#endif + +#if LWIP_TCP_PCB_NUM_EXT_ARGS +err_t tcp_ext_arg_invoke_callbacks_passive_open(struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP */ + +#endif /* LWIP_HDR_TCP_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcpip_priv.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcpip_priv.h new file mode 100644 index 0000000..74be634 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/priv/tcpip_priv.h @@ -0,0 +1,170 @@ +/** + * @file + * TCPIP API internal implementations (do not use in application code) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_TCPIP_PRIV_H +#define LWIP_HDR_TCPIP_PRIV_H + +#include "lwip/opt.h" + +#if !NO_SYS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcpip.h" +#include "lwip/sys.h" +#include "lwip/timeouts.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct pbuf; +struct netif; + +#if LWIP_MPU_COMPATIBLE +#define API_VAR_REF(name) (*(name)) +#define API_VAR_DECLARE(type, name) type * name +#define API_VAR_ALLOC_EXT(type, pool, name, errorblock) do { \ + name = (type *)memp_malloc(pool); \ + if (name == NULL) { \ + errorblock; \ + } \ + } while(0) +#define API_VAR_ALLOC(type, pool, name, errorval) API_VAR_ALLOC_EXT(type, pool, name, return errorval) +#define API_VAR_ALLOC_POOL(type, pool, name, errorval) do { \ + name = (type *)LWIP_MEMPOOL_ALLOC(pool); \ + if (name == NULL) { \ + return errorval; \ + } \ + } while(0) +#define API_VAR_FREE(pool, name) memp_free(pool, name) +#define API_VAR_FREE_POOL(pool, name) LWIP_MEMPOOL_FREE(pool, name) +#define API_EXPR_REF(expr) (&(expr)) +#if LWIP_NETCONN_SEM_PER_THREAD +#define API_EXPR_REF_SEM(expr) (expr) +#else +#define API_EXPR_REF_SEM(expr) API_EXPR_REF(expr) +#endif +#define API_EXPR_DEREF(expr) expr +#define API_MSG_M_DEF(m) m +#define API_MSG_M_DEF_C(t, m) t m +#else /* LWIP_MPU_COMPATIBLE */ +#define API_VAR_REF(name) name +#define API_VAR_DECLARE(type, name) type name +#define API_VAR_ALLOC_EXT(type, pool, name, errorblock) +#define API_VAR_ALLOC(type, pool, name, errorval) +#define API_VAR_ALLOC_POOL(type, pool, name, errorval) +#define API_VAR_FREE(pool, name) +#define API_VAR_FREE_POOL(pool, name) +#define API_EXPR_REF(expr) expr +#define API_EXPR_REF_SEM(expr) API_EXPR_REF(expr) +#define API_EXPR_DEREF(expr) (*(expr)) +#define API_MSG_M_DEF(m) *m +#define API_MSG_M_DEF_C(t, m) const t * m +#endif /* LWIP_MPU_COMPATIBLE */ + +err_t tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem); + +struct tcpip_api_call_data +{ +#if !LWIP_TCPIP_CORE_LOCKING + err_t err; +#if !LWIP_NETCONN_SEM_PER_THREAD + sys_sem_t sem; +#endif /* LWIP_NETCONN_SEM_PER_THREAD */ +#else /* !LWIP_TCPIP_CORE_LOCKING */ + u8_t dummy; /* avoid empty struct :-( */ +#endif /* !LWIP_TCPIP_CORE_LOCKING */ +}; +typedef err_t (*tcpip_api_call_fn)(struct tcpip_api_call_data* call); +err_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call); + +enum tcpip_msg_type { +#if !LWIP_TCPIP_CORE_LOCKING + TCPIP_MSG_API, + TCPIP_MSG_API_CALL, +#endif /* !LWIP_TCPIP_CORE_LOCKING */ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT + TCPIP_MSG_INPKT, +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ +#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS + TCPIP_MSG_TIMEOUT, + TCPIP_MSG_UNTIMEOUT, +#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */ + TCPIP_MSG_CALLBACK, + TCPIP_MSG_CALLBACK_STATIC +}; + +struct tcpip_msg { + enum tcpip_msg_type type; + union { +#if !LWIP_TCPIP_CORE_LOCKING + struct { + tcpip_callback_fn function; + void* msg; + } api_msg; + struct { + tcpip_api_call_fn function; + struct tcpip_api_call_data *arg; + sys_sem_t *sem; + } api_call; +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#if !LWIP_TCPIP_CORE_LOCKING_INPUT + struct { + struct pbuf *p; + struct netif *netif; + netif_input_fn input_fn; + } inp; +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ + struct { + tcpip_callback_fn function; + void *ctx; + } cb; +#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS + struct { + u32_t msecs; + sys_timeout_handler h; + void *arg; + } tmo; +#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */ + } msg; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* !NO_SYS */ + +#endif /* LWIP_HDR_TCPIP_PRIV_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/autoip.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/autoip.h new file mode 100644 index 0000000..fd3af8a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/autoip.h @@ -0,0 +1,78 @@ +/** + * @file + * AutoIP protocol definitions + */ + +/* + * + * Copyright (c) 2007 Dominik Spies + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Dominik Spies + * + * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform + * with RFC 3927. + * + */ + +#ifndef LWIP_HDR_PROT_AUTOIP_H +#define LWIP_HDR_PROT_AUTOIP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 169.254.0.0 */ +#define AUTOIP_NET 0xA9FE0000 +/* 169.254.1.0 */ +#define AUTOIP_RANGE_START (AUTOIP_NET | 0x0100) +/* 169.254.254.255 */ +#define AUTOIP_RANGE_END (AUTOIP_NET | 0xFEFF) + +/* RFC 3927 Constants */ +#define PROBE_WAIT 1 /* second (initial random delay) */ +#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */ +#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */ +#define PROBE_NUM 3 /* (number of probe packets) */ +#define ANNOUNCE_NUM 2 /* (number of announcement packets) */ +#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */ +#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */ +#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */ +#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */ +#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */ + +/* AutoIP client states */ +typedef enum { + AUTOIP_STATE_OFF = 0, + AUTOIP_STATE_PROBING = 1, + AUTOIP_STATE_ANNOUNCING = 2, + AUTOIP_STATE_BOUND = 3 +} autoip_state_enum_t; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_AUTOIP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp.h new file mode 100644 index 0000000..ab18dca --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp.h @@ -0,0 +1,178 @@ +/** + * @file + * DHCP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Leon Woestenberg + * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Leon Woestenberg + * + */ +#ifndef LWIP_HDR_PROT_DHCP_H +#define LWIP_HDR_PROT_DHCP_H + +#include "lwip/opt.h" +#include "lwip/arch.h" +#include "lwip/prot/ip4.h" + +#ifdef __cplusplus +extern "C" { +#endif + + /* DHCP message item offsets and length */ +#define DHCP_CHADDR_LEN 16U +#define DHCP_SNAME_OFS 44U +#define DHCP_SNAME_LEN 64U +#define DHCP_FILE_OFS 108U +#define DHCP_FILE_LEN 128U +#define DHCP_MSG_LEN 236U +#define DHCP_OPTIONS_OFS (DHCP_MSG_LEN + 4U) /* 4 byte: cookie */ + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** minimum set of fields of any DHCP message */ +struct dhcp_msg +{ + PACK_STRUCT_FLD_8(u8_t op); + PACK_STRUCT_FLD_8(u8_t htype); + PACK_STRUCT_FLD_8(u8_t hlen); + PACK_STRUCT_FLD_8(u8_t hops); + PACK_STRUCT_FIELD(u32_t xid); + PACK_STRUCT_FIELD(u16_t secs); + PACK_STRUCT_FIELD(u16_t flags); + PACK_STRUCT_FLD_S(ip4_addr_p_t ciaddr); + PACK_STRUCT_FLD_S(ip4_addr_p_t yiaddr); + PACK_STRUCT_FLD_S(ip4_addr_p_t siaddr); + PACK_STRUCT_FLD_S(ip4_addr_p_t giaddr); + PACK_STRUCT_FLD_8(u8_t chaddr[DHCP_CHADDR_LEN]); + PACK_STRUCT_FLD_8(u8_t sname[DHCP_SNAME_LEN]); + PACK_STRUCT_FLD_8(u8_t file[DHCP_FILE_LEN]); + PACK_STRUCT_FIELD(u32_t cookie); +#define DHCP_MIN_OPTIONS_LEN 68U +/** make sure user does not configure this too small */ +#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) +# undef DHCP_OPTIONS_LEN +#endif +/** allow this to be configured in lwipopts.h, but not too small */ +#if (!defined(DHCP_OPTIONS_LEN)) +/** set this to be sufficient for your options in outgoing DHCP msgs */ +# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN +#endif + PACK_STRUCT_FLD_8(u8_t options[DHCP_OPTIONS_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +/* DHCP client states */ +typedef enum { + DHCP_STATE_OFF = 0, + DHCP_STATE_REQUESTING = 1, + DHCP_STATE_INIT = 2, + DHCP_STATE_REBOOTING = 3, + DHCP_STATE_REBINDING = 4, + DHCP_STATE_RENEWING = 5, + DHCP_STATE_SELECTING = 6, + DHCP_STATE_INFORMING = 7, + DHCP_STATE_CHECKING = 8, + DHCP_STATE_PERMANENT = 9, /* not yet implemented */ + DHCP_STATE_BOUND = 10, + DHCP_STATE_RELEASING = 11, /* not yet implemented */ + DHCP_STATE_BACKING_OFF = 12 +} dhcp_state_enum_t; + +/* DHCP op codes */ +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +/* DHCP message types */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +#define DHCP_MAGIC_COOKIE 0x63825363UL + +/* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */ + +/* BootP options */ +#define DHCP_OPTION_PAD 0 +#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */ +#define DHCP_OPTION_ROUTER 3 +#define DHCP_OPTION_DNS_SERVER 6 +#define DHCP_OPTION_HOSTNAME 12 +#define DHCP_OPTION_IP_TTL 23 +#define DHCP_OPTION_MTU 26 +#define DHCP_OPTION_BROADCAST 28 +#define DHCP_OPTION_TCP_TTL 37 +#define DHCP_OPTION_NTP 42 +#define DHCP_OPTION_END 255 + +/* DHCP options */ +#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */ +#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */ +#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */ + +#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */ +#define DHCP_OPTION_MESSAGE_TYPE_LEN 1 + +#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */ +#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */ + +#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */ +#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2 + +#define DHCP_OPTION_T1 58 /* T1 renewal time */ +#define DHCP_OPTION_T2 59 /* T2 rebinding time */ +#define DHCP_OPTION_US 60 +#define DHCP_OPTION_CLIENT_ID 61 +#define DHCP_OPTION_TFTP_SERVERNAME 66 +#define DHCP_OPTION_BOOTFILE 67 + +/* possible combinations of overloading the file and sname fields with options */ +#define DHCP_OVERLOAD_NONE 0 +#define DHCP_OVERLOAD_FILE 1 +#define DHCP_OVERLOAD_SNAME 2 +#define DHCP_OVERLOAD_SNAME_FILE 3 + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_DHCP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp6.h new file mode 100644 index 0000000..0754c91 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dhcp6.h @@ -0,0 +1,138 @@ +/** + * @file + * DHCPv6 protocol definitions + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_PROT_DHCP6_H +#define LWIP_HDR_PROT_DHCP6_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define DHCP6_CLIENT_PORT 546 +#define DHCP6_SERVER_PORT 547 + + + /* DHCPv6 message item offsets and length */ +#define DHCP6_TRANSACTION_ID_LEN 3 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** minimum set of fields of any DHCPv6 message */ +struct dhcp6_msg +{ + PACK_STRUCT_FLD_8(u8_t msgtype); + PACK_STRUCT_FLD_8(u8_t transaction_id[DHCP6_TRANSACTION_ID_LEN]); + /* options follow */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +/* DHCP6 client states */ +typedef enum { + DHCP6_STATE_OFF = 0, + DHCP6_STATE_STATELESS_IDLE = 1, + DHCP6_STATE_REQUESTING_CONFIG = 2 +} dhcp6_state_enum_t; + +/* DHCPv6 message types */ +#define DHCP6_SOLICIT 1 +#define DHCP6_ADVERTISE 2 +#define DHCP6_REQUEST 3 +#define DHCP6_CONFIRM 4 +#define DHCP6_RENEW 5 +#define DHCP6_REBIND 6 +#define DHCP6_REPLY 7 +#define DHCP6_RELEASE 8 +#define DHCP6_DECLINE 9 +#define DHCP6_RECONFIGURE 10 +#define DHCP6_INFOREQUEST 11 +#define DHCP6_RELAYFORW 12 +#define DHCP6_RELAYREPL 13 +/* More message types see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */ + +/** DHCPv6 status codes */ +#define DHCP6_STATUS_SUCCESS 0 /* Success. */ +#define DHCP6_STATUS_UNSPECFAIL 1 /* Failure, reason unspecified; this status code is sent by either a client or a server to indicate a failure not explicitly specified in this document. */ +#define DHCP6_STATUS_NOADDRSAVAIL 2 /* Server has no addresses available to assign to the IA(s). */ +#define DHCP6_STATUS_NOBINDING 3 /* Client record (binding) unavailable. */ +#define DHCP6_STATUS_NOTONLINK 4 /* The prefix for the address is not appropriate for the link to which the client is attached. */ +#define DHCP6_STATUS_USEMULTICAST 5 /* Sent by a server to a client to force the client to send messages to the server using the All_DHCP_Relay_Agents_and_Servers address. */ +/* More status codes see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */ + +/** DHCPv6 DUID types */ +#define DHCP6_DUID_LLT 1 /* LLT: Link-layer Address Plus Time */ +#define DHCP6_DUID_EN 2 /* EN: Enterprise number */ +#define DHCP6_DUID_LL 3 /* LL: Link-layer Address */ +#define DHCP6_DUID_UUID 4 /* UUID (RFC 6355) */ + +/* DHCPv6 options */ +#define DHCP6_OPTION_CLIENTID 1 +#define DHCP6_OPTION_SERVERID 2 +#define DHCP6_OPTION_IA_NA 3 +#define DHCP6_OPTION_IA_TA 4 +#define DHCP6_OPTION_IAADDR 5 +#define DHCP6_OPTION_ORO 6 +#define DHCP6_OPTION_PREFERENCE 7 +#define DHCP6_OPTION_ELAPSED_TIME 8 +#define DHCP6_OPTION_RELAY_MSG 9 +#define DHCP6_OPTION_AUTH 11 +#define DHCP6_OPTION_UNICAST 12 +#define DHCP6_OPTION_STATUS_CODE 13 +#define DHCP6_OPTION_RAPID_COMMIT 14 +#define DHCP6_OPTION_USER_CLASS 15 +#define DHCP6_OPTION_VENDOR_CLASS 16 +#define DHCP6_OPTION_VENDOR_OPTS 17 +#define DHCP6_OPTION_INTERFACE_ID 18 +#define DHCP6_OPTION_RECONF_MSG 19 +#define DHCP6_OPTION_RECONF_ACCEPT 20 +/* More options see https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml */ +#define DHCP6_OPTION_DNS_SERVERS 23 /* RFC 3646 */ +#define DHCP6_OPTION_DOMAIN_LIST 24 /* RFC 3646 */ +#define DHCP6_OPTION_SNTP_SERVERS 31 /* RFC 4075 */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_DHCP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dns.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dns.h new file mode 100644 index 0000000..94782d6 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/dns.h @@ -0,0 +1,140 @@ +/** + * @file + * DNS - host name to IP address resolver. + */ + +/* + * Port to lwIP from uIP + * by Jim Pettinato April 2007 + * + * security fixes and more by Simon Goldschmidt + * + * uIP version Copyright (c) 2002-2003, Adam Dunkels. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + */ + +#ifndef LWIP_HDR_PROT_DNS_H +#define LWIP_HDR_PROT_DNS_H + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** DNS server port address */ +#ifndef DNS_SERVER_PORT +#define DNS_SERVER_PORT 53 +#endif + +/* DNS field TYPE used for "Resource Records" */ +#define DNS_RRTYPE_A 1 /* a host address */ +#define DNS_RRTYPE_NS 2 /* an authoritative name server */ +#define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */ +#define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */ +#define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */ +#define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */ +#define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */ +#define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */ +#define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */ +#define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */ +#define DNS_RRTYPE_WKS 11 /* a well known service description */ +#define DNS_RRTYPE_PTR 12 /* a domain name pointer */ +#define DNS_RRTYPE_HINFO 13 /* host information */ +#define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */ +#define DNS_RRTYPE_MX 15 /* mail exchange */ +#define DNS_RRTYPE_TXT 16 /* text strings */ +#define DNS_RRTYPE_AAAA 28 /* IPv6 address */ +#define DNS_RRTYPE_SRV 33 /* service location */ +#define DNS_RRTYPE_ANY 255 /* any type */ + +/* DNS field CLASS used for "Resource Records" */ +#define DNS_RRCLASS_IN 1 /* the Internet */ +#define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */ +#define DNS_RRCLASS_CH 3 /* the CHAOS class */ +#define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */ +#define DNS_RRCLASS_ANY 255 /* any class */ +#define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */ + +/* DNS protocol flags */ +#define DNS_FLAG1_RESPONSE 0x80 +#define DNS_FLAG1_OPCODE_STATUS 0x10 +#define DNS_FLAG1_OPCODE_INVERSE 0x08 +#define DNS_FLAG1_OPCODE_STANDARD 0x00 +#define DNS_FLAG1_AUTHORATIVE 0x04 +#define DNS_FLAG1_TRUNC 0x02 +#define DNS_FLAG1_RD 0x01 +#define DNS_FLAG2_RA 0x80 +#define DNS_FLAG2_ERR_MASK 0x0f +#define DNS_FLAG2_ERR_NONE 0x00 +#define DNS_FLAG2_ERR_NAME 0x03 + +#define DNS_HDR_GET_OPCODE(hdr) ((((hdr)->flags1) >> 3) & 0xF) + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** DNS message header */ +struct dns_hdr { + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FLD_8(u8_t flags1); + PACK_STRUCT_FLD_8(u8_t flags2); + PACK_STRUCT_FIELD(u16_t numquestions); + PACK_STRUCT_FIELD(u16_t numanswers); + PACK_STRUCT_FIELD(u16_t numauthrr); + PACK_STRUCT_FIELD(u16_t numextrarr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define SIZEOF_DNS_HDR 12 + + +/* Multicast DNS definitions */ + +/** UDP port for multicast DNS queries */ +#ifndef DNS_MQUERY_PORT +#define DNS_MQUERY_PORT 5353 +#endif + +/* IPv4 group for multicast DNS queries: 224.0.0.251 */ +#ifndef DNS_MQUERY_IPV4_GROUP_INIT +#define DNS_MQUERY_IPV4_GROUP_INIT IPADDR4_INIT_BYTES(224,0,0,251) +#endif + +/* IPv6 group for multicast DNS queries: FF02::FB */ +#ifndef DNS_MQUERY_IPV6_GROUP_INIT +#define DNS_MQUERY_IPV6_GROUP_INIT IPADDR6_INIT_HOST(0xFF020000,0,0,0xFB) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_DNS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/etharp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/etharp.h new file mode 100644 index 0000000..4d60f5d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/etharp.h @@ -0,0 +1,127 @@ +/** + * @file + * ARP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_ETHARP_H +#define LWIP_HDR_PROT_ETHARP_H + +#include "lwip/arch.h" +#include "lwip/prot/ethernet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ETHARP_HWADDR_LEN +#define ETHARP_HWADDR_LEN ETH_HWADDR_LEN +#endif + +/** + * struct ip4_addr_wordaligned is used in the definition of the ARP packet format in + * order to support compilers that don't have structure packing. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip4_addr_wordaligned { + PACK_STRUCT_FIELD(u16_t addrw[2]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** MEMCPY-like copying of IP addresses where addresses are known to be + * 16-bit-aligned if the port is correctly configured (so a port could define + * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ +#ifndef IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T +#define IPADDR_WORDALIGNED_COPY_TO_IP4_ADDR_T(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) +#endif + + /** MEMCPY-like copying of IP addresses where addresses are known to be + * 16-bit-aligned if the port is correctly configured (so a port could define + * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ +#ifndef IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T +#define IPADDR_WORDALIGNED_COPY_FROM_IP4_ADDR_T(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t)) +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** the ARP message, see RFC 826 ("Packet format") */ +struct etharp_hdr { + PACK_STRUCT_FIELD(u16_t hwtype); + PACK_STRUCT_FIELD(u16_t proto); + PACK_STRUCT_FLD_8(u8_t hwlen); + PACK_STRUCT_FLD_8(u8_t protolen); + PACK_STRUCT_FIELD(u16_t opcode); + PACK_STRUCT_FLD_S(struct eth_addr shwaddr); + PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned sipaddr); + PACK_STRUCT_FLD_S(struct eth_addr dhwaddr); + PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned dipaddr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ethip_hdr { + PACK_STRUCT_FIELD(struct eth_hdr eth); + PACK_STRUCT_FIELD(struct ip_hdr ip); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define SIZEOF_ETHARP_HDR 28 + +/* ARP message types (opcodes) */ +enum etharp_opcode { + ARP_REQUEST = 1, + ARP_REPLY = 2 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_ETHARP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ethernet.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ethernet.h new file mode 100644 index 0000000..d4c8960 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ethernet.h @@ -0,0 +1,135 @@ +/** + * @file + * Ethernet protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_ETHERNET_H +#define LWIP_HDR_PROT_ETHERNET_H + +#include "lwip/arch.h" +#include "lwip/prot/ieee.h" +#include "xlwipconfig.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if XLWIP_CONFIG_AXI_ETHERNET_ENABLE_1588 +#define IEEE_1588_PAD_SIZE 8 +#else +#define IEEE_1588_PAD_SIZE 0 +#endif + +#ifndef ETH_HWADDR_LEN +#ifdef ETHARP_HWADDR_LEN +#define ETH_HWADDR_LEN ETHARP_HWADDR_LEN /* compatibility mode */ +#else +#define ETH_HWADDR_LEN 6 +#endif +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** An Ethernet MAC address */ +struct eth_addr { + PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Initialize a struct eth_addr with its 6 bytes (takes care of correct braces) */ +#define ETH_ADDR(b0, b1, b2, b3, b4, b5) {{b0, b1, b2, b3, b4, b5}} + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** Ethernet header */ +struct eth_hdr { +#if ETH_PAD_SIZE + PACK_STRUCT_FLD_8(u8_t padding[ETH_PAD_SIZE]); +#endif +#if XLWIP_CONFIG_AXI_ETHERNET_ENABLE_1588 + PACK_STRUCT_FLD_8(u8_t padding[IEEE_1588_PAD_SIZE]); +#endif + PACK_STRUCT_FLD_S(struct eth_addr dest); + PACK_STRUCT_FLD_S(struct eth_addr src); + PACK_STRUCT_FIELD(u16_t type); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE + IEEE_1588_PAD_SIZE) + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** VLAN header inserted between ethernet header and payload + * if 'type' in ethernet header is ETHTYPE_VLAN. + * See IEEE802.Q */ +struct eth_vlan_hdr { + PACK_STRUCT_FIELD(u16_t prio_vid); + PACK_STRUCT_FIELD(u16_t tpid); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_VLAN_HDR 4 +#define VLAN_ID(vlan_hdr) (lwip_htons((vlan_hdr)->prio_vid) & 0xFFF) + +/** The 24-bit IANA IPv4-multicast OUI is 01-00-5e: */ +#define LL_IP4_MULTICAST_ADDR_0 0x01 +#define LL_IP4_MULTICAST_ADDR_1 0x00 +#define LL_IP4_MULTICAST_ADDR_2 0x5e + +/** IPv6 multicast uses this prefix */ +#define LL_IP6_MULTICAST_ADDR_0 0x33 +#define LL_IP6_MULTICAST_ADDR_1 0x33 + +#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_ETHERNET_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/iana.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/iana.h new file mode 100644 index 0000000..32890cc --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/iana.h @@ -0,0 +1,97 @@ +/** + * @file + * IANA assigned numbers (RFC 1700 and successors) + * + * @defgroup iana IANA assigned numbers + * @ingroup infrastructure + */ + +/* + * Copyright (c) 2017 Dirk Ziegelmeier. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ + +#ifndef LWIP_HDR_PROT_IANA_H +#define LWIP_HDR_PROT_IANA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup iana + * Hardware types + */ +enum lwip_iana_hwtype { + /** Ethernet */ + LWIP_IANA_HWTYPE_ETHERNET = 1 +}; + +/** + * @ingroup iana + * Port numbers + * https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt + */ +enum lwip_iana_port_number { + /** SMTP */ + LWIP_IANA_PORT_SMTP = 25, + /** DHCP server */ + LWIP_IANA_PORT_DHCP_SERVER = 67, + /** DHCP client */ + LWIP_IANA_PORT_DHCP_CLIENT = 68, + /** TFTP */ + LWIP_IANA_PORT_TFTP = 69, + /** HTTP */ + LWIP_IANA_PORT_HTTP = 80, + /** SNTP */ + LWIP_IANA_PORT_SNTP = 123, + /** NETBIOS */ + LWIP_IANA_PORT_NETBIOS = 137, + /** SNMP */ + LWIP_IANA_PORT_SNMP = 161, + /** SNMP traps */ + LWIP_IANA_PORT_SNMP_TRAP = 162, + /** HTTPS */ + LWIP_IANA_PORT_HTTPS = 443, + /** SMTPS */ + LWIP_IANA_PORT_SMTPS = 465, + /** MQTT */ + LWIP_IANA_PORT_MQTT = 1883, + /** MDNS */ + LWIP_IANA_PORT_MDNS = 5353, + /** Secure MQTT */ + LWIP_IANA_PORT_SECURE_MQTT = 8883 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IANA_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp.h new file mode 100644 index 0000000..7d19385 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp.h @@ -0,0 +1,91 @@ +/** + * @file + * ICMP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_ICMP_H +#define LWIP_HDR_PROT_ICMP_H + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ICMP_ER 0 /* echo reply */ +#define ICMP_DUR 3 /* destination unreachable */ +#define ICMP_SQ 4 /* source quench */ +#define ICMP_RD 5 /* redirect */ +#define ICMP_ECHO 8 /* echo */ +#define ICMP_TE 11 /* time exceeded */ +#define ICMP_PP 12 /* parameter problem */ +#define ICMP_TS 13 /* timestamp */ +#define ICMP_TSR 14 /* timestamp reply */ +#define ICMP_IRQ 15 /* information request */ +#define ICMP_IR 16 /* information reply */ +#define ICMP_AM 17 /* address mask request */ +#define ICMP_AMR 18 /* address mask reply */ + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +/** This is the standard ICMP header only that the u32_t data + * is split to two u16_t like ICMP echo needs it. + * This header is also used for other ICMP types that do not + * use the data part. + */ +PACK_STRUCT_BEGIN +struct icmp_echo_hdr { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u16_t seqno); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* Compatibility defines, old versions used to combine type and code to an u16_t */ +#define ICMPH_TYPE(hdr) ((hdr)->type) +#define ICMPH_CODE(hdr) ((hdr)->code) +#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) +#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_ICMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp6.h new file mode 100644 index 0000000..36989f6 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/icmp6.h @@ -0,0 +1,172 @@ +/** + * @file + * ICMP6 protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_ICMP6_H +#define LWIP_HDR_PROT_ICMP6_H + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** ICMP type */ +enum icmp6_type { + /** Destination unreachable */ + ICMP6_TYPE_DUR = 1, + /** Packet too big */ + ICMP6_TYPE_PTB = 2, + /** Time exceeded */ + ICMP6_TYPE_TE = 3, + /** Parameter problem */ + ICMP6_TYPE_PP = 4, + /** Private experimentation */ + ICMP6_TYPE_PE1 = 100, + /** Private experimentation */ + ICMP6_TYPE_PE2 = 101, + /** Reserved for expansion of error messages */ + ICMP6_TYPE_RSV_ERR = 127, + + /** Echo request */ + ICMP6_TYPE_EREQ = 128, + /** Echo reply */ + ICMP6_TYPE_EREP = 129, + /** Multicast listener query */ + ICMP6_TYPE_MLQ = 130, + /** Multicast listener report */ + ICMP6_TYPE_MLR = 131, + /** Multicast listener done */ + ICMP6_TYPE_MLD = 132, + /** Router solicitation */ + ICMP6_TYPE_RS = 133, + /** Router advertisement */ + ICMP6_TYPE_RA = 134, + /** Neighbor solicitation */ + ICMP6_TYPE_NS = 135, + /** Neighbor advertisement */ + ICMP6_TYPE_NA = 136, + /** Redirect */ + ICMP6_TYPE_RD = 137, + /** Multicast router advertisement */ + ICMP6_TYPE_MRA = 151, + /** Multicast router solicitation */ + ICMP6_TYPE_MRS = 152, + /** Multicast router termination */ + ICMP6_TYPE_MRT = 153, + /** Private experimentation */ + ICMP6_TYPE_PE3 = 200, + /** Private experimentation */ + ICMP6_TYPE_PE4 = 201, + /** Reserved for expansion of informational messages */ + ICMP6_TYPE_RSV_INF = 255 +}; + +/** ICMP destination unreachable codes */ +enum icmp6_dur_code { + /** No route to destination */ + ICMP6_DUR_NO_ROUTE = 0, + /** Communication with destination administratively prohibited */ + ICMP6_DUR_PROHIBITED = 1, + /** Beyond scope of source address */ + ICMP6_DUR_SCOPE = 2, + /** Address unreachable */ + ICMP6_DUR_ADDRESS = 3, + /** Port unreachable */ + ICMP6_DUR_PORT = 4, + /** Source address failed ingress/egress policy */ + ICMP6_DUR_POLICY = 5, + /** Reject route to destination */ + ICMP6_DUR_REJECT_ROUTE = 6 +}; + +/** ICMP time exceeded codes */ +enum icmp6_te_code { + /** Hop limit exceeded in transit */ + ICMP6_TE_HL = 0, + /** Fragment reassembly time exceeded */ + ICMP6_TE_FRAG = 1 +}; + +/** ICMP parameter code */ +enum icmp6_pp_code { + /** Erroneous header field encountered */ + ICMP6_PP_FIELD = 0, + /** Unrecognized next header type encountered */ + ICMP6_PP_HEADER = 1, + /** Unrecognized IPv6 option encountered */ + ICMP6_PP_OPTION = 2 +}; + +/** This is the standard ICMP6 header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct icmp6_hdr { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t data); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define ICMP6_HLEN 8 + +/** This is the ICMP6 header adapted for echo req/resp. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct icmp6_echo_hdr { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u16_t seqno); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_ICMP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ieee.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ieee.h new file mode 100644 index 0000000..cd4d2de --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ieee.h @@ -0,0 +1,91 @@ +/** + * @file + * IEEE assigned numbers + * + * @defgroup ieee IEEE assigned numbers + * @ingroup infrastructure + */ + +/* + * Copyright (c) 2017 Dirk Ziegelmeier. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ + +#ifndef LWIP_HDR_PROT_IEEE_H +#define LWIP_HDR_PROT_IEEE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup ieee + * A list of often ethtypes (although lwIP does not use all of them). + */ +enum lwip_ieee_eth_type { + /** Internet protocol v4 */ + ETHTYPE_IP = 0x0800U, + /** Address resolution protocol */ + ETHTYPE_ARP = 0x0806U, + /** Wake on lan */ + ETHTYPE_WOL = 0x0842U, + /** RARP */ + ETHTYPE_RARP = 0x8035U, + /** Virtual local area network */ + ETHTYPE_VLAN = 0x8100U, + /** Internet protocol v6 */ + ETHTYPE_IPV6 = 0x86DDU, + /** PPP Over Ethernet Discovery Stage */ + ETHTYPE_PPPOEDISC = 0x8863U, + /** PPP Over Ethernet Session Stage */ + ETHTYPE_PPPOE = 0x8864U, + /** Jumbo Frames */ + ETHTYPE_JUMBO = 0x8870U, + /** Process field network */ + ETHTYPE_PROFINET = 0x8892U, + /** Ethernet for control automation technology */ + ETHTYPE_ETHERCAT = 0x88A4U, + /** Link layer discovery protocol */ + ETHTYPE_LLDP = 0x88CCU, + /** Serial real-time communication system */ + ETHTYPE_SERCOS = 0x88CDU, + /** Media redundancy protocol */ + ETHTYPE_MRP = 0x88E3U, + /** Precision time protocol */ + ETHTYPE_PTP = 0x88F7U, + /** Q-in-Q, 802.1ad */ + ETHTYPE_QINQ = 0x9100U +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IEEE_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/igmp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/igmp.h new file mode 100644 index 0000000..46b81a9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/igmp.h @@ -0,0 +1,90 @@ +/** + * @file + * IGMP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_IGMP_H +#define LWIP_HDR_PROT_IGMP_H + +#include "lwip/arch.h" +#include "lwip/prot/ip4.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * IGMP constants + */ +#define IGMP_TTL 1 +#define IGMP_MINLEN 8 +#define ROUTER_ALERT 0x9404U +#define ROUTER_ALERTLEN 4 + +/* + * IGMP message types, including version number. + */ +#define IGMP_MEMB_QUERY 0x11 /* Membership query */ +#define IGMP_V1_MEMB_REPORT 0x12 /* Ver. 1 membership report */ +#define IGMP_V2_MEMB_REPORT 0x16 /* Ver. 2 membership report */ +#define IGMP_LEAVE_GROUP 0x17 /* Leave-group message */ + +/* Group membership states */ +#define IGMP_GROUP_NON_MEMBER 0 +#define IGMP_GROUP_DELAYING_MEMBER 1 +#define IGMP_GROUP_IDLE_MEMBER 2 + +/** + * IGMP packet format. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct igmp_msg { + PACK_STRUCT_FLD_8(u8_t igmp_msgtype); + PACK_STRUCT_FLD_8(u8_t igmp_maxresp); + PACK_STRUCT_FIELD(u16_t igmp_checksum); + PACK_STRUCT_FLD_S(ip4_addr_p_t igmp_group_address); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IGMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip.h new file mode 100644 index 0000000..223158f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip.h @@ -0,0 +1,59 @@ +/** + * @file + * IP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_IP_H +#define LWIP_HDR_PROT_IP_H + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IP_PROTO_ICMP 1 +#define IP_PROTO_IGMP 2 +#define IP_PROTO_UDP 17 +#define IP_PROTO_UDPLITE 136 +#define IP_PROTO_TCP 6 + +/** This operates on a void* by loading the first byte */ +#define IP_HDR_GET_VERSION(ptr) ((*(u8_t*)(ptr)) >> 4) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip4.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip4.h new file mode 100644 index 0000000..9347461 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip4.h @@ -0,0 +1,131 @@ +/** + * @file + * IPv4 protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_IP4_H +#define LWIP_HDR_PROT_IP4_H + +#include "lwip/arch.h" +#include "lwip/ip4_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** This is the packed version of ip4_addr_t, + used in network headers that are itself packed */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip4_addr_packed { + PACK_STRUCT_FIELD(u32_t addr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +typedef struct ip4_addr_packed ip4_addr_p_t; + +/* Size of the IPv4 header. Same as 'sizeof(struct ip_hdr)'. */ +#define IP_HLEN 20 +/* Maximum size of the IPv4 header with options. */ +#define IP_HLEN_MAX 60 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/* The IPv4 header */ +struct ip_hdr { + /* version / header length */ + PACK_STRUCT_FLD_8(u8_t _v_hl); + /* type of service */ + PACK_STRUCT_FLD_8(u8_t _tos); + /* total length */ + PACK_STRUCT_FIELD(u16_t _len); + /* identification */ + PACK_STRUCT_FIELD(u16_t _id); + /* fragment offset field */ + PACK_STRUCT_FIELD(u16_t _offset); +#define IP_RF 0x8000U /* reserved fragment flag */ +#define IP_DF 0x4000U /* don't fragment flag */ +#define IP_MF 0x2000U /* more fragments flag */ +#define IP_OFFMASK 0x1fffU /* mask for fragmenting bits */ + /* time to live */ + PACK_STRUCT_FLD_8(u8_t _ttl); + /* protocol*/ + PACK_STRUCT_FLD_8(u8_t _proto); + /* checksum */ + PACK_STRUCT_FIELD(u16_t _chksum); + /* source and destination IP addresses */ + PACK_STRUCT_FLD_S(ip4_addr_p_t src); + PACK_STRUCT_FLD_S(ip4_addr_p_t dest); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* Macros to get struct ip_hdr fields: */ +#define IPH_V(hdr) ((hdr)->_v_hl >> 4) +#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f) +#define IPH_HL_BYTES(hdr) ((u8_t)(IPH_HL(hdr) * 4)) +#define IPH_TOS(hdr) ((hdr)->_tos) +#define IPH_LEN(hdr) ((hdr)->_len) +#define IPH_ID(hdr) ((hdr)->_id) +#define IPH_OFFSET(hdr) ((hdr)->_offset) +#define IPH_OFFSET_BYTES(hdr) ((u16_t)((lwip_ntohs(IPH_OFFSET(hdr)) & IP_OFFMASK) * 8U)) +#define IPH_TTL(hdr) ((hdr)->_ttl) +#define IPH_PROTO(hdr) ((hdr)->_proto) +#define IPH_CHKSUM(hdr) ((hdr)->_chksum) + +/* Macros to set struct ip_hdr fields: */ +#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (u8_t)((((v) << 4) | (hl))) +#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos) +#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len) +#define IPH_ID_SET(hdr, id) (hdr)->_id = (id) +#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off) +#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl) +#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto) +#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum) + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IP4_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip6.h new file mode 100644 index 0000000..7df81ed --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/ip6.h @@ -0,0 +1,235 @@ +/** + * @file + * IPv6 protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_IP6_H +#define LWIP_HDR_PROT_IP6_H + +#include "lwip/arch.h" +#include "lwip/ip6_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IP6_MIN_MTU_LENGTH 1280 + +/** This is the packed version of ip6_addr_t, + used in network headers that are itself packed */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_addr_packed { + PACK_STRUCT_FIELD(u32_t addr[4]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +typedef struct ip6_addr_packed ip6_addr_p_t; + +#define IP6_HLEN 40 + +#define IP6_NEXTH_HOPBYHOP 0 +#define IP6_NEXTH_TCP 6 +#define IP6_NEXTH_UDP 17 +#define IP6_NEXTH_ENCAPS 41 +#define IP6_NEXTH_ROUTING 43 +#define IP6_NEXTH_FRAGMENT 44 +#define IP6_NEXTH_ICMP6 58 +#define IP6_NEXTH_NONE 59 +#define IP6_NEXTH_DESTOPTS 60 +#define IP6_NEXTH_UDPLITE 136 + +/** The IPv6 header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_hdr { + /** version / traffic class / flow label */ + PACK_STRUCT_FIELD(u32_t _v_tc_fl); + /** payload length */ + PACK_STRUCT_FIELD(u16_t _plen); + /** next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /** hop limit */ + PACK_STRUCT_FLD_8(u8_t _hoplim); + /** source and destination IP addresses */ + PACK_STRUCT_FLD_S(ip6_addr_p_t src); + PACK_STRUCT_FLD_S(ip6_addr_p_t dest); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6H_V(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f) +#define IP6H_TC(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 20) & 0xff) +#define IP6H_FL(hdr) (lwip_ntohl((hdr)->_v_tc_fl) & 0x000fffff) +#define IP6H_PLEN(hdr) (lwip_ntohs((hdr)->_plen)) +#define IP6H_NEXTH(hdr) ((hdr)->_nexth) +#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6) +#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim) +#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (lwip_htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl))) +#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = lwip_htons(plen) +#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth) +#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl) + +/* ipv6 extended options header */ +#define IP6_PAD1_OPTION 0 +#define IP6_PADN_OPTION 1 +#define IP6_ROUTER_ALERT_OPTION 5 +#define IP6_JUMBO_OPTION 194 +#define IP6_HOME_ADDRESS_OPTION 201 +#define IP6_ROUTER_ALERT_DLEN 2 +#define IP6_ROUTER_ALERT_VALUE_MLD 0 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_opt_hdr { + /* router alert option type */ + PACK_STRUCT_FLD_8(u8_t _opt_type); + /* router alert option data len */ + PACK_STRUCT_FLD_8(u8_t _opt_dlen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_OPT_HLEN 2 +#define IP6_OPT_TYPE_ACTION(hdr) ((((hdr)->_opt_type) >> 6) & 0x3) +#define IP6_OPT_TYPE_CHANGE(hdr) ((((hdr)->_opt_type) >> 5) & 0x1) +#define IP6_OPT_TYPE(hdr) ((hdr)->_opt_type) +#define IP6_OPT_DLEN(hdr) ((hdr)->_opt_dlen) + +/* Hop-by-Hop header. */ +#define IP6_HBH_HLEN 2 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_hbh_hdr { + /* next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /* header length in 8-octet units */ + PACK_STRUCT_FLD_8(u8_t _hlen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_HBH_NEXTH(hdr) ((hdr)->_nexth) + +/* Destination header. */ +#define IP6_DEST_HLEN 2 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_dest_hdr { + /* next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /* header length in 8-octet units */ + PACK_STRUCT_FLD_8(u8_t _hlen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_DEST_NEXTH(hdr) ((hdr)->_nexth) + +/* Routing header */ +#define IP6_ROUT_TYPE2 2 +#define IP6_ROUT_RPL 3 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_rout_hdr { + /* next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /* reserved */ + PACK_STRUCT_FLD_8(u8_t _hlen); + /* fragment offset */ + PACK_STRUCT_FIELD(u8_t _routing_type); + /* fragmented packet identification */ + PACK_STRUCT_FIELD(u8_t _segments_left); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_ROUT_NEXTH(hdr) ((hdr)->_nexth) +#define IP6_ROUT_TYPE(hdr) ((hdr)->_routing_type) +#define IP6_ROUT_SEG_LEFT(hdr) ((hdr)->_segments_left) + +/* Fragment header. */ +#define IP6_FRAG_HLEN 8 +#define IP6_FRAG_OFFSET_MASK 0xfff8 +#define IP6_FRAG_MORE_FLAG 0x0001 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip6_frag_hdr { + /* next header */ + PACK_STRUCT_FLD_8(u8_t _nexth); + /* reserved */ + PACK_STRUCT_FLD_8(u8_t reserved); + /* fragment offset */ + PACK_STRUCT_FIELD(u16_t _fragment_offset); + /* fragmented packet identification */ + PACK_STRUCT_FIELD(u32_t _identification); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define IP6_FRAG_NEXTH(hdr) ((hdr)->_nexth) +#define IP6_FRAG_MBIT(hdr) (lwip_ntohs((hdr)->_fragment_offset) & 0x1) +#define IP6_FRAG_ID(hdr) (lwip_ntohl((hdr)->_identification)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_IP6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/mld6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/mld6.h new file mode 100644 index 0000000..71f1dcb --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/mld6.h @@ -0,0 +1,71 @@ +/** + * @file + * MLD6 protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_MLD6_H +#define LWIP_HDR_PROT_MLD6_H + +#include "lwip/arch.h" +#include "lwip/prot/ip6.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MLD6_HBH_HLEN 8 +/** Multicast listener report/query/done message header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct mld_header { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t max_resp_delay); + PACK_STRUCT_FIELD(u16_t reserved); + PACK_STRUCT_FLD_S(ip6_addr_p_t multicast_address); + /* Options follow. */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_MLD6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/nd6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/nd6.h new file mode 100644 index 0000000..c270d07 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/nd6.h @@ -0,0 +1,274 @@ +/** + * @file + * ND6 protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_ND6_H +#define LWIP_HDR_PROT_ND6_H + +#include "lwip/arch.h" +#include "lwip/ip6_addr.h" +#include "lwip/prot/ip6.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Neighbor solicitation message header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ns_header { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t reserved); + PACK_STRUCT_FLD_S(ip6_addr_p_t target_address); + /* Options follow. */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Neighbor advertisement message header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct na_header { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FLD_8(u8_t flags); + PACK_STRUCT_FLD_8(u8_t reserved[3]); + PACK_STRUCT_FLD_S(ip6_addr_p_t target_address); + /* Options follow. */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define ND6_FLAG_ROUTER (0x80) +#define ND6_FLAG_SOLICITED (0x40) +#define ND6_FLAG_OVERRIDE (0x20) + +/** Router solicitation message header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct rs_header { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t reserved); + /* Options follow. */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Router advertisement message header. */ +#define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80) +#define ND6_RA_FLAG_OTHER_CONFIG (0x40) +#define ND6_RA_FLAG_HOME_AGENT (0x20) +#define ND6_RA_PREFERENCE_MASK (0x18) +#define ND6_RA_PREFERENCE_HIGH (0x08) +#define ND6_RA_PREFERENCE_MEDIUM (0x00) +#define ND6_RA_PREFERENCE_LOW (0x18) +#define ND6_RA_PREFERENCE_DISABLED (0x10) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ra_header { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FLD_8(u8_t current_hop_limit); + PACK_STRUCT_FLD_8(u8_t flags); + PACK_STRUCT_FIELD(u16_t router_lifetime); + PACK_STRUCT_FIELD(u32_t reachable_time); + PACK_STRUCT_FIELD(u32_t retrans_timer); + /* Options follow. */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Redirect message header. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct redirect_header { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t reserved); + PACK_STRUCT_FLD_S(ip6_addr_p_t target_address); + PACK_STRUCT_FLD_S(ip6_addr_p_t destination_address); + /* Options follow. */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Link-layer address option. */ +#define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01) +#define ND6_OPTION_TYPE_TARGET_LLADDR (0x02) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct lladdr_option { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t length); + PACK_STRUCT_FLD_8(u8_t addr[NETIF_MAX_HWADDR_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Prefix information option. */ +#define ND6_OPTION_TYPE_PREFIX_INFO (0x03) +#define ND6_PREFIX_FLAG_ON_LINK (0x80) +#define ND6_PREFIX_FLAG_AUTONOMOUS (0x40) +#define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20) +#define ND6_PREFIX_FLAG_SITE_PREFIX (0x10) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct prefix_option { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t length); + PACK_STRUCT_FLD_8(u8_t prefix_length); + PACK_STRUCT_FLD_8(u8_t flags); + PACK_STRUCT_FIELD(u32_t valid_lifetime); + PACK_STRUCT_FIELD(u32_t preferred_lifetime); + PACK_STRUCT_FLD_8(u8_t reserved2[3]); + PACK_STRUCT_FLD_8(u8_t site_prefix_length); + PACK_STRUCT_FLD_S(ip6_addr_p_t prefix); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Redirected header option. */ +#define ND6_OPTION_TYPE_REDIR_HDR (0x04) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct redirected_header_option { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t length); + PACK_STRUCT_FLD_8(u8_t reserved[6]); + /* Portion of redirected packet follows. */ + /* PACK_STRUCT_FLD_8(u8_t redirected[8]); */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** MTU option. */ +#define ND6_OPTION_TYPE_MTU (0x05) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct mtu_option { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t length); + PACK_STRUCT_FIELD(u16_t reserved); + PACK_STRUCT_FIELD(u32_t mtu); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Route information option. */ +#define ND6_OPTION_TYPE_ROUTE_INFO (24) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct route_option { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t length); + PACK_STRUCT_FLD_8(u8_t prefix_length); + PACK_STRUCT_FLD_8(u8_t preference); + PACK_STRUCT_FIELD(u32_t route_lifetime); + PACK_STRUCT_FLD_S(ip6_addr_p_t prefix); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** Recursive DNS Server Option. */ +#define ND6_OPTION_TYPE_RDNSS (25) +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct rdnss_option { + PACK_STRUCT_FLD_8(u8_t type); + PACK_STRUCT_FLD_8(u8_t length); + PACK_STRUCT_FIELD(u16_t reserved); + PACK_STRUCT_FIELD(u32_t lifetime); + PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[1]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_RDNSS_OPTION_BASE 8 /* size without addresses */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_ND6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/tcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/tcp.h new file mode 100644 index 0000000..c1d7de1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/tcp.h @@ -0,0 +1,100 @@ +/** + * @file + * TCP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_TCP_H +#define LWIP_HDR_PROT_TCP_H + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Length of the TCP header, excluding options. */ +#define TCP_HLEN 20 + +/* Fields are (of course) in network byte order. + * Some fields are converted to host byte order in tcp_input(). + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct tcp_hdr { + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); + PACK_STRUCT_FIELD(u32_t seqno); + PACK_STRUCT_FIELD(u32_t ackno); + PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); + PACK_STRUCT_FIELD(u16_t wnd); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t urgp); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* TCP header flags bits */ +#define TCP_FIN 0x01U +#define TCP_SYN 0x02U +#define TCP_RST 0x04U +#define TCP_PSH 0x08U +#define TCP_ACK 0x10U +#define TCP_URG 0x20U +#define TCP_ECE 0x40U +#define TCP_CWR 0x80U +/* Valid TCP header flags */ +#define TCP_FLAGS 0x3fU + +#define TCP_MAX_OPTION_BYTES 40 + +#define TCPH_HDRLEN(phdr) ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)) +#define TCPH_HDRLEN_BYTES(phdr) ((u8_t)(TCPH_HDRLEN(phdr) << 2)) +#define TCPH_FLAGS(phdr) ((u8_t)((lwip_ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS))) + +#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = lwip_htons(((len) << 12) | TCPH_FLAGS(phdr)) +#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS(~TCP_FLAGS)) | lwip_htons(flags)) +#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = (u16_t)(lwip_htons((u16_t)((len) << 12) | (flags))) + +#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | lwip_htons(flags)) +#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags & ~lwip_htons(flags)) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_TCP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/udp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/udp.h new file mode 100644 index 0000000..664f19a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/prot/udp.h @@ -0,0 +1,68 @@ +/** + * @file + * UDP protocol definitions + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_PROT_UDP_H +#define LWIP_HDR_PROT_UDP_H + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define UDP_HLEN 8 + +/* Fields are (of course) in network byte order. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct udp_hdr { + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ + PACK_STRUCT_FIELD(u16_t len); + PACK_STRUCT_FIELD(u16_t chksum); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_PROT_UDP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/raw.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/raw.h new file mode 100644 index 0000000..b129bd3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/raw.h @@ -0,0 +1,143 @@ +/** + * @file + * raw API (to be used from TCPIP thread)\n + * See also @ref raw_raw + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_RAW_H +#define LWIP_HDR_RAW_H + +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/def.h" +#include "lwip/ip.h" +#include "lwip/ip_addr.h" +#include "lwip/ip6_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define RAW_FLAGS_CONNECTED 0x01U +#define RAW_FLAGS_HDRINCL 0x02U +#define RAW_FLAGS_MULTICAST_LOOP 0x04U + +struct raw_pcb; + +/** Function prototype for raw pcb receive callback functions. + * @param arg user supplied argument (raw_pcb.recv_arg) + * @param pcb the raw_pcb which received data + * @param p the packet buffer that was received + * @param addr the remote IP address from which the packet was received + * @return 1 if the packet was 'eaten' (aka. deleted), + * 0 if the packet lives on + * If returning 1, the callback is responsible for freeing the pbuf + * if it's not used any more. + */ +typedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p, + const ip_addr_t *addr); + +/** the RAW protocol control block */ +struct raw_pcb { + /* Common members of all PCB types */ + IP_PCB; + + struct raw_pcb *next; + + u8_t protocol; + u8_t flags; + +#if LWIP_MULTICAST_TX_OPTIONS + /** outgoing network interface for multicast packets, by interface index (if nonzero) */ + u8_t mcast_ifindex; + /** TTL for outgoing multicast packets */ + u8_t mcast_ttl; +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + + /** receive callback function */ + raw_recv_fn recv; + /* user-supplied argument for the recv callback */ + void *recv_arg; +#if LWIP_IPV6 + /* fields for handling checksum computations as per RFC3542. */ + u16_t chksum_offset; + u8_t chksum_reqd; +#endif +}; + +/* The following functions is the application layer interface to the + RAW code. */ +struct raw_pcb * raw_new (u8_t proto); +struct raw_pcb * raw_new_ip_type(u8_t type, u8_t proto); +void raw_remove (struct raw_pcb *pcb); +err_t raw_bind (struct raw_pcb *pcb, const ip_addr_t *ipaddr); +void raw_bind_netif (struct raw_pcb *pcb, const struct netif *netif); +err_t raw_connect (struct raw_pcb *pcb, const ip_addr_t *ipaddr); +void raw_disconnect (struct raw_pcb *pcb); + +err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr); +err_t raw_sendto_if_src(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, struct netif *netif, const ip_addr_t *src_ip); +err_t raw_send (struct raw_pcb *pcb, struct pbuf *p); + +void raw_recv (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg); + +#define raw_flags(pcb) ((pcb)->flags) +#define raw_setflags(pcb,f) ((pcb)->flags = (f)) + +#define raw_set_flags(pcb, set_flags) do { (pcb)->flags = (u8_t)((pcb)->flags | (set_flags)); } while(0) +#define raw_clear_flags(pcb, clr_flags) do { (pcb)->flags = (u8_t)((pcb)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define raw_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0) + +#define raw_init() /* Compatibility define, no init needed. */ + +/* for compatibility with older implementation */ +#define raw_new_ip6(proto) raw_new_ip_type(IPADDR_TYPE_V6, proto) + +#if LWIP_MULTICAST_TX_OPTIONS +#define raw_set_multicast_netif_index(pcb, idx) ((pcb)->mcast_ifindex = (idx)) +#define raw_get_multicast_netif_index(pcb) ((pcb)->mcast_ifindex) +#define raw_set_multicast_ttl(pcb, value) ((pcb)->mcast_ttl = (value)) +#define raw_get_multicast_ttl(pcb) ((pcb)->mcast_ttl) +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_RAW */ + +#endif /* LWIP_HDR_RAW_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sio.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sio.h new file mode 100644 index 0000000..7643e19 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sio.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + */ + +/* + * This is the interface to the platform specific serial IO module + * It needs to be implemented by those platforms which need SLIP or PPP + */ + +#ifndef SIO_H +#define SIO_H + +#include "lwip/arch.h" +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* If you want to define sio_fd_t elsewhere or differently, + define this in your cc.h file. */ +#ifndef __sio_fd_t_defined +typedef void * sio_fd_t; +#endif + +/* The following functions can be defined to something else in your cc.h file + or be implemented in your custom sio.c file. */ + +#ifndef sio_open +/** + * Opens a serial device for communication. + * + * @param devnum device number + * @return handle to serial device if successful, NULL otherwise + */ +sio_fd_t sio_open(u8_t devnum); +#endif + +#ifndef sio_send +/** + * Sends a single character to the serial device. + * + * @param c character to send + * @param fd serial device handle + * + * @note This function will block until the character can be sent. + */ +void sio_send(u8_t c, sio_fd_t fd); +#endif + +#ifndef sio_recv +/** + * Receives a single character from the serial device. + * + * @param fd serial device handle + * + * @note This function will block until a character is received. + */ +u8_t sio_recv(sio_fd_t fd); +#endif + +#ifndef sio_read +/** + * Reads from the serial device. + * + * @param fd serial device handle + * @param data pointer to data buffer for receiving + * @param len maximum length (in bytes) of data to receive + * @return number of bytes actually received - may be 0 if aborted by sio_read_abort + * + * @note This function will block until data can be received. The blocking + * can be cancelled by calling sio_read_abort(). + */ +u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_tryread +/** + * Tries to read from the serial device. Same as sio_read but returns + * immediately if no data is available and never blocks. + * + * @param fd serial device handle + * @param data pointer to data buffer for receiving + * @param len maximum length (in bytes) of data to receive + * @return number of bytes actually received + */ +u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_write +/** + * Writes to the serial device. + * + * @param fd serial device handle + * @param data pointer to data to send + * @param len length (in bytes) of data to send + * @return number of bytes actually sent + * + * @note This function will block until all data can be sent. + */ +u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_read_abort +/** + * Aborts a blocking sio_read() call. + * + * @param fd serial device handle + */ +void sio_read_abort(sio_fd_t fd); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* SIO_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/snmp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/snmp.h new file mode 100644 index 0000000..8704d0b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/snmp.h @@ -0,0 +1,213 @@ +/** + * @file + * SNMP support API for implementing netifs and statitics for MIB2 + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Dirk Ziegelmeier + * + */ +#ifndef LWIP_HDR_SNMP_H +#define LWIP_HDR_SNMP_H + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct udp_pcb; +struct netif; + +/** + * @defgroup netif_mib2 MIB2 statistics + * @ingroup netif + */ + +/* MIB2 statistics functions */ +#if MIB2_STATS /* don't build if not configured for use in lwipopts.h */ +/** + * @ingroup netif_mib2 + * @see RFC1213, "MIB-II, 6. Definitions" + */ +enum snmp_ifType { + snmp_ifType_other=1, /* none of the following */ + snmp_ifType_regular1822, + snmp_ifType_hdh1822, + snmp_ifType_ddn_x25, + snmp_ifType_rfc877_x25, + snmp_ifType_ethernet_csmacd, + snmp_ifType_iso88023_csmacd, + snmp_ifType_iso88024_tokenBus, + snmp_ifType_iso88025_tokenRing, + snmp_ifType_iso88026_man, + snmp_ifType_starLan, + snmp_ifType_proteon_10Mbit, + snmp_ifType_proteon_80Mbit, + snmp_ifType_hyperchannel, + snmp_ifType_fddi, + snmp_ifType_lapb, + snmp_ifType_sdlc, + snmp_ifType_ds1, /* T-1 */ + snmp_ifType_e1, /* european equiv. of T-1 */ + snmp_ifType_basicISDN, + snmp_ifType_primaryISDN, /* proprietary serial */ + snmp_ifType_propPointToPointSerial, + snmp_ifType_ppp, + snmp_ifType_softwareLoopback, + snmp_ifType_eon, /* CLNP over IP [11] */ + snmp_ifType_ethernet_3Mbit, + snmp_ifType_nsip, /* XNS over IP */ + snmp_ifType_slip, /* generic SLIP */ + snmp_ifType_ultra, /* ULTRA technologies */ + snmp_ifType_ds3, /* T-3 */ + snmp_ifType_sip, /* SMDS */ + snmp_ifType_frame_relay +}; + +/** This macro has a precision of ~49 days because sys_now returns u32_t. \#define your own if you want ~490 days. */ +#ifndef MIB2_COPY_SYSUPTIME_TO +#define MIB2_COPY_SYSUPTIME_TO(ptrToVal) (*(ptrToVal) = (sys_now() / 10)) +#endif + +/** + * @ingroup netif_mib2 + * Increment stats member for SNMP MIB2 stats (struct stats_mib2_netif_ctrs) + */ +#define MIB2_STATS_NETIF_INC(n, x) do { ++(n)->mib2_counters.x; } while(0) +/** + * @ingroup netif_mib2 + * Add value to stats member for SNMP MIB2 stats (struct stats_mib2_netif_ctrs) + */ +#define MIB2_STATS_NETIF_ADD(n, x, val) do { (n)->mib2_counters.x += (val); } while(0) + +/** + * @ingroup netif_mib2 + * Init MIB2 statistic counters in netif + * @param netif Netif to init + * @param type one of enum @ref snmp_ifType + * @param speed your link speed here (units: bits per second) + */ +#define MIB2_INIT_NETIF(netif, type, speed) do { \ + (netif)->link_type = (type); \ + (netif)->link_speed = (speed);\ + (netif)->ts = 0; \ + (netif)->mib2_counters.ifinoctets = 0; \ + (netif)->mib2_counters.ifinucastpkts = 0; \ + (netif)->mib2_counters.ifinnucastpkts = 0; \ + (netif)->mib2_counters.ifindiscards = 0; \ + (netif)->mib2_counters.ifinerrors = 0; \ + (netif)->mib2_counters.ifinunknownprotos = 0; \ + (netif)->mib2_counters.ifoutoctets = 0; \ + (netif)->mib2_counters.ifoutucastpkts = 0; \ + (netif)->mib2_counters.ifoutnucastpkts = 0; \ + (netif)->mib2_counters.ifoutdiscards = 0; \ + (netif)->mib2_counters.ifouterrors = 0; } while(0) +#else /* MIB2_STATS */ +#ifndef MIB2_COPY_SYSUPTIME_TO +#define MIB2_COPY_SYSUPTIME_TO(ptrToVal) +#endif +#define MIB2_INIT_NETIF(netif, type, speed) +#define MIB2_STATS_NETIF_INC(n, x) +#define MIB2_STATS_NETIF_ADD(n, x, val) +#endif /* MIB2_STATS */ + +/* LWIP MIB2 callbacks */ +#if LWIP_MIB2_CALLBACKS /* don't build if not configured for use in lwipopts.h */ +/* network interface */ +void mib2_netif_added(struct netif *ni); +void mib2_netif_removed(struct netif *ni); + +#if LWIP_IPV4 && LWIP_ARP +/* ARP (for atTable and ipNetToMediaTable) */ +void mib2_add_arp_entry(struct netif *ni, ip4_addr_t *ip); +void mib2_remove_arp_entry(struct netif *ni, ip4_addr_t *ip); +#else /* LWIP_IPV4 && LWIP_ARP */ +#define mib2_add_arp_entry(ni,ip) +#define mib2_remove_arp_entry(ni,ip) +#endif /* LWIP_IPV4 && LWIP_ARP */ + +/* IP */ +#if LWIP_IPV4 +void mib2_add_ip4(struct netif *ni); +void mib2_remove_ip4(struct netif *ni); +void mib2_add_route_ip4(u8_t dflt, struct netif *ni); +void mib2_remove_route_ip4(u8_t dflt, struct netif *ni); +#endif /* LWIP_IPV4 */ + +/* UDP */ +#if LWIP_UDP +void mib2_udp_bind(struct udp_pcb *pcb); +void mib2_udp_unbind(struct udp_pcb *pcb); +#endif /* LWIP_UDP */ + +#else /* LWIP_MIB2_CALLBACKS */ +/* LWIP_MIB2_CALLBACKS support not available */ +/* define everything to be empty */ + +/* network interface */ +#define mib2_netif_added(ni) +#define mib2_netif_removed(ni) + +/* ARP */ +#define mib2_add_arp_entry(ni,ip) +#define mib2_remove_arp_entry(ni,ip) + +/* IP */ +#define mib2_add_ip4(ni) +#define mib2_remove_ip4(ni) +#define mib2_add_route_ip4(dflt, ni) +#define mib2_remove_route_ip4(dflt, ni) + +/* UDP */ +#define mib2_udp_bind(pcb) +#define mib2_udp_unbind(pcb) +#endif /* LWIP_MIB2_CALLBACKS */ + +/* for source-code compatibility reasons only, can be removed (not used internally) */ +#define NETIF_INIT_SNMP MIB2_INIT_NETIF +#define snmp_add_ifinoctets(ni,value) MIB2_STATS_NETIF_ADD(ni, ifinoctets, value) +#define snmp_inc_ifinucastpkts(ni) MIB2_STATS_NETIF_INC(ni, ifinucastpkts) +#define snmp_inc_ifinnucastpkts(ni) MIB2_STATS_NETIF_INC(ni, ifinnucastpkts) +#define snmp_inc_ifindiscards(ni) MIB2_STATS_NETIF_INC(ni, ifindiscards) +#define snmp_inc_ifinerrors(ni) MIB2_STATS_NETIF_INC(ni, ifinerrors) +#define snmp_inc_ifinunknownprotos(ni) MIB2_STATS_NETIF_INC(ni, ifinunknownprotos) +#define snmp_add_ifoutoctets(ni,value) MIB2_STATS_NETIF_ADD(ni, ifoutoctets, value) +#define snmp_inc_ifoutucastpkts(ni) MIB2_STATS_NETIF_INC(ni, ifoutucastpkts) +#define snmp_inc_ifoutnucastpkts(ni) MIB2_STATS_NETIF_INC(ni, ifoutnucastpkts) +#define snmp_inc_ifoutdiscards(ni) MIB2_STATS_NETIF_INC(ni, ifoutdiscards) +#define snmp_inc_ifouterrors(ni) MIB2_STATS_NETIF_INC(ni, ifouterrors) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_SNMP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sockets.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sockets.h new file mode 100644 index 0000000..37b9528 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sockets.h @@ -0,0 +1,693 @@ +/** + * @file + * Socket API (to be used from non-TCPIP threads) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + +#ifndef LWIP_HDR_SOCKETS_H +#define LWIP_HDR_SOCKETS_H + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/err.h" +#include "lwip/inet.h" +#include "lwip/errno.h" + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED + to prevent this code from redefining it. */ +#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED) +typedef u8_t sa_family_t; +#endif +/* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED + to prevent this code from redefining it. */ +#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED) +typedef u16_t in_port_t; +#endif + +#if LWIP_IPV4 +/* members are in network byte order */ +struct sockaddr_in { + u8_t sin_len; + sa_family_t sin_family; + in_port_t sin_port; + struct in_addr sin_addr; +#define SIN_ZERO_LEN 8 + char sin_zero[SIN_ZERO_LEN]; +}; +#endif /* LWIP_IPV4 */ + +#if LWIP_IPV6 +struct sockaddr_in6 { + u8_t sin6_len; /* length of this structure */ + sa_family_t sin6_family; /* AF_INET6 */ + in_port_t sin6_port; /* Transport layer port # */ + u32_t sin6_flowinfo; /* IPv6 flow information */ + struct in6_addr sin6_addr; /* IPv6 address */ + u32_t sin6_scope_id; /* Set of interfaces for scope */ +}; +#endif /* LWIP_IPV6 */ + +struct sockaddr { + u8_t sa_len; + sa_family_t sa_family; + char sa_data[14]; +}; + +struct sockaddr_storage { + u8_t s2_len; + sa_family_t ss_family; + char s2_data1[2]; + u32_t s2_data2[3]; +#if LWIP_IPV6 + u32_t s2_data3[3]; +#endif /* LWIP_IPV6 */ +}; + +/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED + to prevent this code from redefining it. */ +#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) +typedef u32_t socklen_t; +#endif + +#if !defined IOV_MAX +#define IOV_MAX 0xFFFF +#elif IOV_MAX > 0xFFFF +#error "IOV_MAX larger than supported by LwIP" +#endif /* IOV_MAX */ + +#if !defined(iovec) +struct iovec { + void *iov_base; + size_t iov_len; +}; +#endif + +struct msghdr { + void *msg_name; + socklen_t msg_namelen; + struct iovec *msg_iov; + int msg_iovlen; + void *msg_control; + socklen_t msg_controllen; + int msg_flags; +}; + +/* struct msghdr->msg_flags bit field values */ +#define MSG_TRUNC 0x04 +#define MSG_CTRUNC 0x08 + +/* RFC 3542, Section 20: Ancillary Data */ +struct cmsghdr { + socklen_t cmsg_len; /* number of bytes, including header */ + int cmsg_level; /* originating protocol */ + int cmsg_type; /* protocol-specific type */ +}; +/* Data section follows header and possible padding, typically referred to as + unsigned char cmsg_data[]; */ + +/* cmsg header/data alignment. NOTE: we align to native word size (double word +size on 16-bit arch) so structures are not placed at an unaligned address. +16-bit arch needs double word to ensure 32-bit alignment because socklen_t +could be 32 bits. If we ever have cmsg data with a 64-bit variable, alignment +will need to increase long long */ +#define ALIGN_H(size) (((size) + sizeof(long) - 1U) & ~(sizeof(long)-1U)) +#define ALIGN_D(size) ALIGN_H(size) + +#define CMSG_FIRSTHDR(mhdr) \ + ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ + (struct cmsghdr *)(mhdr)->msg_control : \ + (struct cmsghdr *)NULL) + +#define CMSG_NXTHDR(mhdr, cmsg) \ + (((cmsg) == NULL) ? CMSG_FIRSTHDR(mhdr) : \ + (((u8_t *)(cmsg) + ALIGN_H((cmsg)->cmsg_len) \ + + ALIGN_D(sizeof(struct cmsghdr)) > \ + (u8_t *)((mhdr)->msg_control) + (mhdr)->msg_controllen) ? \ + (struct cmsghdr *)NULL : \ + (struct cmsghdr *)((void*)((u8_t *)(cmsg) + \ + ALIGN_H((cmsg)->cmsg_len))))) + +#define CMSG_DATA(cmsg) ((void*)((u8_t *)(cmsg) + \ + ALIGN_D(sizeof(struct cmsghdr)))) + +#define CMSG_SPACE(length) (ALIGN_D(sizeof(struct cmsghdr)) + \ + ALIGN_H(length)) + +#define CMSG_LEN(length) (ALIGN_D(sizeof(struct cmsghdr)) + \ + length) + +/* Set socket options argument */ +#define IFNAMSIZ NETIF_NAMESIZE +struct ifreq { + char ifr_name[IFNAMSIZ]; /* Interface name */ +}; + +/* Socket protocol types (TCP/UDP/RAW) */ +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 + +/* + * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) + */ +#define SO_REUSEADDR 0x0004 /* Allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ + + +/* + * Additional options, not kept in so_options. + */ +#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ +#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_DONTLINGER ((int)(~SO_LINGER)) +#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ +#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ +#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ +#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ +#define SO_BINDTODEVICE 0x100b /* bind to device */ + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time in seconds */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xfff /* options for socket level */ + + +#define AF_UNSPEC 0 +#define AF_INET 2 +#if LWIP_IPV6 +#define AF_INET6 10 +#else /* LWIP_IPV6 */ +#define AF_INET6 AF_UNSPEC +#endif /* LWIP_IPV6 */ +#define PF_INET AF_INET +#define PF_INET6 AF_INET6 +#define PF_UNSPEC AF_UNSPEC + +#define IPPROTO_IP 0 +#define IPPROTO_ICMP 1 +#define IPPROTO_TCP 6 +#define IPPROTO_UDP 17 +#if LWIP_IPV6 +#define IPPROTO_IPV6 41 +#define IPPROTO_ICMPV6 58 +#endif /* LWIP_IPV6 */ +#define IPPROTO_UDPLITE 136 +#define IPPROTO_RAW 255 + +/* Flags we can use with send and recv. */ +#define MSG_PEEK 0x01 /* Peeks at an incoming message */ +#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ +#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ +#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ +#define MSG_MORE 0x10 /* Sender will send more */ +#define MSG_NOSIGNAL 0x20 /* Uninmplemented: Requests not to send the SIGPIPE signal if an attempt to send is made on a stream-oriented socket that is no longer connected. */ + + +/* + * Options for level IPPROTO_IP + */ +#define IP_TOS 1 +#define IP_TTL 2 +#define IP_PKTINFO 8 + +#if LWIP_TCP +/* + * Options for level IPPROTO_TCP + */ +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ +#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ +#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ +#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ +#endif /* LWIP_TCP */ + +#if LWIP_IPV6 +/* + * Options for level IPPROTO_IPV6 + */ +#define IPV6_CHECKSUM 7 /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */ +#define IPV6_V6ONLY 27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */ +#endif /* LWIP_IPV6 */ + +#if LWIP_UDP && LWIP_UDPLITE +/* + * Options for level IPPROTO_UDPLITE + */ +#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ +#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ +#endif /* LWIP_UDP && LWIP_UDPLITE*/ + + +#if LWIP_MULTICAST_TX_OPTIONS +/* + * Options and types for UDP multicast traffic handling + */ +#define IP_MULTICAST_TTL 5 +#define IP_MULTICAST_IF 6 +#define IP_MULTICAST_LOOP 7 +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + +#if LWIP_IGMP +/* + * Options and types related to multicast membership + */ +#define IP_ADD_MEMBERSHIP 3 +#define IP_DROP_MEMBERSHIP 4 + +typedef struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +} ip_mreq; +#endif /* LWIP_IGMP */ + +#if LWIP_IPV4 +struct in_pktinfo { + unsigned int ipi_ifindex; /* Interface index */ + struct in_addr ipi_addr; /* Destination (from header) address */ +}; +#endif /* LWIP_IPV4 */ + +#if LWIP_IPV6_MLD +/* + * Options and types related to IPv6 multicast membership + */ +#define IPV6_JOIN_GROUP 12 +#define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP +#define IPV6_LEAVE_GROUP 13 +#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP + +typedef struct ipv6_mreq { + struct in6_addr ipv6mr_multiaddr; /* IPv6 multicast addr */ + unsigned int ipv6mr_interface; /* interface index, or 0 */ +} ipv6_mreq; +#endif /* LWIP_IPV6_MLD */ + +/* + * The Type of Service provides an indication of the abstract + * parameters of the quality of service desired. These parameters are + * to be used to guide the selection of the actual service parameters + * when transmitting a datagram through a particular network. Several + * networks offer service precedence, which somehow treats high + * precedence traffic as more important than other traffic (generally + * by accepting only traffic above a certain precedence at time of high + * load). The major choice is a three way tradeoff between low-delay, + * high-reliability, and high-throughput. + * The use of the Delay, Throughput, and Reliability indications may + * increase the cost (in some sense) of the service. In many networks + * better performance for one of these parameters is coupled with worse + * performance on another. Except for very unusual cases at most two + * of these three indications should be set. + */ +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_LOWCOST 0x02 +#define IPTOS_MINCOST IPTOS_LOWCOST + +/* + * The Network Control precedence designation is intended to be used + * within a network only. The actual use and control of that + * designation is up to each network. The Internetwork Control + * designation is intended for use by gateway control originators only. + * If the actual use of these precedence designations is of concern to + * a particular network, it is the responsibility of that network to + * control the access to, and use of, those precedence designations. + */ +#define IPTOS_PREC_MASK 0xe0 +#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + + +/* + * Commands for ioctlsocket(), taken from the BSD file fcntl.h. + * lwip_ioctl only supports FIONREAD and FIONBIO, for now + * + * Ioctl's have the command encoded in the lower word, + * and the size of any in or out parameters in the upper + * word. The high 2 bits of the upper word are used + * to encode the in/out status of the parameter; for now + * we restrict parameters to at most 128 bytes. + */ +#if !defined(FIONREAD) || !defined(FIONBIO) +#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ +#define IOC_VOID 0x20000000UL /* no parameters */ +#define IOC_OUT 0x40000000UL /* copy out parameters */ +#define IOC_IN 0x80000000UL /* copy in parameters */ +#define IOC_INOUT (IOC_IN|IOC_OUT) + /* 0x20000000 distinguishes new & + old ioctl's */ +#define _IO(x,y) ((long)(IOC_VOID|((x)<<8)|(y))) + +#define _IOR(x,y,t) ((long)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))) + +#define _IOW(x,y,t) ((long)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))) +#endif /* !defined(FIONREAD) || !defined(FIONBIO) */ + +#ifndef FIONREAD +#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ +#endif +#ifndef FIONBIO +#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ +#endif + +/* Socket I/O Controls: unimplemented */ +#ifndef SIOCSHIWAT +#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ +#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ +#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ +#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ +#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ +#endif + +/* commands for fnctl */ +#ifndef F_GETFL +#define F_GETFL 3 +#endif +#ifndef F_SETFL +#define F_SETFL 4 +#endif + +/* File status flags and file access modes for fnctl, + these are bits in an int. */ +#ifndef O_NONBLOCK +#define O_NONBLOCK 1 /* nonblocking I/O */ +#endif +#ifndef O_NDELAY +#define O_NDELAY O_NONBLOCK /* same as O_NONBLOCK, for compatibility */ +#endif +#ifndef O_RDONLY +#define O_RDONLY 2 +#endif +#ifndef O_WRONLY +#define O_WRONLY 4 +#endif +#ifndef O_RDWR +#define O_RDWR (O_RDONLY|O_WRONLY) +#endif + +#ifndef SHUT_RD + #define SHUT_RD 0 + #define SHUT_WR 1 + #define SHUT_RDWR 2 +#endif + +/* FD_SET used for lwip_select */ +#ifndef FD_SET +#undef FD_SETSIZE +/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ +#define FD_SETSIZE MEMP_NUM_NETCONN +#define LWIP_SELECT_MAXNFDS (FD_SETSIZE + LWIP_SOCKET_OFFSET) +#define FDSETSAFESET(n, code) do { \ + if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \ + code; }} while(0) +#define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\ + (code) : 0) +#define FD_SET(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] = (u8_t)((p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] | (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))) +#define FD_CLR(n, p) FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] = (u8_t)((p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))) +#define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] & (1 << (((n)-LWIP_SOCKET_OFFSET) & 7))) +#define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p))) + +typedef struct fd_set +{ + unsigned char fd_bits [(FD_SETSIZE+7)/8]; +} fd_set; + +#elif FD_SETSIZE < (LWIP_SOCKET_OFFSET + MEMP_NUM_NETCONN) +#error "external FD_SETSIZE too small for number of sockets" +#else +#define LWIP_SELECT_MAXNFDS FD_SETSIZE +#endif /* FD_SET */ + +/* poll-related defines and types */ +/* @todo: find a better way to guard the definition of these defines and types if already defined */ +#if !defined(POLLIN) && !defined(POLLOUT) +#define POLLIN 0x1 +#define POLLOUT 0x2 +#define POLLERR 0x4 +#define POLLNVAL 0x8 +/* Below values are unimplemented */ +#define POLLRDNORM 0x10 +#define POLLRDBAND 0x20 +#define POLLPRI 0x40 +#define POLLWRNORM 0x80 +#define POLLWRBAND 0x100 +#define POLLHUP 0x200 +typedef unsigned int nfds_t; +struct pollfd +{ + int fd; + short events; + short revents; +}; +#endif + +/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided + * by your system, set this to 0 and include in cc.h */ +#ifndef LWIP_TIMEVAL_PRIVATE +#define LWIP_TIMEVAL_PRIVATE 1 +#endif + +#if LWIP_TIMEVAL_PRIVATE +struct timeval { + long tv_sec; /* seconds */ + long tv_usec; /* and microseconds */ +}; +#endif /* LWIP_TIMEVAL_PRIVATE */ + +#define lwip_socket_init() /* Compatibility define, no init needed. */ +void lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */ +void lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */ + +#if LWIP_COMPAT_SOCKETS == 2 +/* This helps code parsers/code completion by not having the COMPAT functions as defines */ +#define lwip_accept accept +#define lwip_bind bind +#define lwip_shutdown shutdown +#define lwip_getpeername getpeername +#define lwip_getsockname getsockname +#define lwip_setsockopt setsockopt +#define lwip_getsockopt getsockopt +#define lwip_close closesocket +#define lwip_connect connect +#define lwip_listen listen +#define lwip_recv recv +#define lwip_recvmsg recvmsg +#define lwip_recvfrom recvfrom +#define lwip_send send +#define lwip_sendmsg sendmsg +#define lwip_sendto sendto +#define lwip_socket socket +#if LWIP_SOCKET_SELECT +#define lwip_select select +#endif +#if LWIP_SOCKET_POLL +#define lwip_poll poll +#endif +#define lwip_ioctl ioctlsocket +#define lwip_inet_ntop inet_ntop +#define lwip_inet_pton inet_pton + +#if LWIP_POSIX_SOCKETS_IO_NAMES +#define lwip_read read +#define lwip_readv readv +#define lwip_write write +#define lwip_writev writev +#undef lwip_close +#define lwip_close close +#define closesocket(s) close(s) +int fcntl(int s, int cmd, ...); +#undef lwip_ioctl +#define lwip_ioctl ioctl +#define ioctlsocket ioctl +#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ +#endif /* LWIP_COMPAT_SOCKETS == 2 */ + +int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); +int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); +int lwip_shutdown(int s, int how); +int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); +int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); +int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); +int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); + int lwip_close(int s); +int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); +int lwip_listen(int s, int backlog); +ssize_t lwip_recv(int s, void *mem, size_t len, int flags); +ssize_t lwip_read(int s, void *mem, size_t len); +ssize_t lwip_readv(int s, const struct iovec *iov, int iovcnt); +ssize_t lwip_recvfrom(int s, void *mem, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen); +ssize_t lwip_recvmsg(int s, struct msghdr *message, int flags); +ssize_t lwip_sendto(int s, const void *data, size_t size, int flags, + const struct sockaddr *to, socklen_t tolen); +ssize_t lwip_send(int s, const void *dataptr, size_t size, int flags); +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +ssize_t lwip_send_blocking(int s, const void *dataptr, size_t size, int flags); +ssize_t lwip_sendto_blocking(int s, const void *data, size_t size, int flags, + const struct sockaddr *to, socklen_t tolen); +#endif +ssize_t lwip_sendmsg(int s, const struct msghdr *message, int flags); +int lwip_socket(int domain, int type, int protocol); +ssize_t lwip_write(int s, const void *dataptr, size_t size); +ssize_t lwip_writev(int s, const struct iovec *iov, int iovcnt); +#if LWIP_SOCKET_SELECT +int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, + struct timeval *timeout); +#endif +#if LWIP_SOCKET_POLL +int lwip_poll(struct pollfd *fds, nfds_t nfds, int timeout); +#endif +int lwip_ioctl(int s, long cmd, void *argp); +int lwip_fcntl(int s, int cmd, int val); +const char *lwip_inet_ntop(int af, const void *src, char *dst, socklen_t size); +int lwip_inet_pton(int af, const char *src, void *dst); + +#if LWIP_COMPAT_SOCKETS +#if LWIP_COMPAT_SOCKETS != 2 +/** @ingroup socket */ +#define accept(s,addr,addrlen) lwip_accept(s,addr,addrlen) +/** @ingroup socket */ +#define bind(s,name,namelen) lwip_bind(s,name,namelen) +/** @ingroup socket */ +#define shutdown(s,how) lwip_shutdown(s,how) +/** @ingroup socket */ +#define getpeername(s,name,namelen) lwip_getpeername(s,name,namelen) +/** @ingroup socket */ +#define getsockname(s,name,namelen) lwip_getsockname(s,name,namelen) +/** @ingroup socket */ +#define setsockopt(s,level,optname,opval,optlen) lwip_setsockopt(s,level,optname,opval,optlen) +/** @ingroup socket */ +#define getsockopt(s,level,optname,opval,optlen) lwip_getsockopt(s,level,optname,opval,optlen) +/** @ingroup socket */ +#define closesocket(s) lwip_close(s) +/** @ingroup socket */ +#define connect(s,name,namelen) lwip_connect(s,name,namelen) +/** @ingroup socket */ +#define listen(s,backlog) lwip_listen(s,backlog) +/** @ingroup socket */ +#define recv(s,mem,len,flags) lwip_recv(s,mem,len,flags) +/** @ingroup socket */ +#define recvmsg(s,message,flags) lwip_recvmsg(s,message,flags) +/** @ingroup socket */ +#define recvfrom(s,mem,len,flags,from,fromlen) lwip_recvfrom(s,mem,len,flags,from,fromlen) +/** @ingroup socket */ +#define send(s,dataptr,size,flags) lwip_send(s,dataptr,size,flags) +/** @ingroup socket */ +#define sendmsg(s,message,flags) lwip_sendmsg(s,message,flags) +/** @ingroup socket */ +#define sendto(s,dataptr,size,flags,to,tolen) lwip_sendto(s,dataptr,size,flags,to,tolen) +/** @ingroup socket */ +#define socket(domain,type,protocol) lwip_socket(domain,type,protocol) +#if LWIP_SOCKET_SELECT +/** @ingroup socket */ +#define select(maxfdp1,readset,writeset,exceptset,timeout) lwip_select(maxfdp1,readset,writeset,exceptset,timeout) +#endif +#if LWIP_SOCKET_POLL +/** @ingroup socket */ +#define poll(fds,nfds,timeout) lwip_poll(fds,nfds,timeout) +#endif +/** @ingroup socket */ +#define ioctlsocket(s,cmd,argp) lwip_ioctl(s,cmd,argp) +/** @ingroup socket */ +#define inet_ntop(af,src,dst,size) lwip_inet_ntop(af,src,dst,size) +/** @ingroup socket */ +#define inet_pton(af,src,dst) lwip_inet_pton(af,src,dst) + +#if LWIP_POSIX_SOCKETS_IO_NAMES +/** @ingroup socket */ +#define read(s,mem,len) lwip_read(s,mem,len) +/** @ingroup socket */ +#define readv(s,iov,iovcnt) lwip_readv(s,iov,iovcnt) +/** @ingroup socket */ +#define write(s,dataptr,len) lwip_write(s,dataptr,len) +/** @ingroup socket */ +#define writev(s,iov,iovcnt) lwip_writev(s,iov,iovcnt) +/** @ingroup socket */ +#define close(s) lwip_close(s) +/** @ingroup socket */ +#define fcntl(s,cmd,val) lwip_fcntl(s,cmd,val) +/** @ingroup socket */ +#define ioctl(s,cmd,argp) lwip_ioctl(s,cmd,argp) +#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ +#endif /* LWIP_COMPAT_SOCKETS != 2 */ + +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SOCKET */ + +#endif /* LWIP_HDR_SOCKETS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/stats.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/stats.h new file mode 100644 index 0000000..b570dba --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/stats.h @@ -0,0 +1,491 @@ +/** + * @file + * Statistics API (to be used from TCPIP thread) + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_STATS_H +#define LWIP_HDR_STATS_H + +#include "lwip/opt.h" + +#include "lwip/mem.h" +#include "lwip/memp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_STATS + +#ifndef LWIP_STATS_LARGE +#define LWIP_STATS_LARGE 0 +#endif + +#if LWIP_STATS_LARGE +#define STAT_COUNTER u32_t +#define STAT_COUNTER_F U32_F +#else +#define STAT_COUNTER u16_t +#define STAT_COUNTER_F U16_F +#endif + +/** Protocol related stats */ +struct stats_proto { + STAT_COUNTER xmit; /* Transmitted packets. */ + STAT_COUNTER recv; /* Received packets. */ + STAT_COUNTER fw; /* Forwarded packets. */ + STAT_COUNTER drop; /* Dropped packets. */ + STAT_COUNTER chkerr; /* Checksum error. */ + STAT_COUNTER lenerr; /* Invalid length error. */ + STAT_COUNTER memerr; /* Out of memory error. */ + STAT_COUNTER rterr; /* Routing error. */ + STAT_COUNTER proterr; /* Protocol error. */ + STAT_COUNTER opterr; /* Error in options. */ + STAT_COUNTER err; /* Misc error. */ + STAT_COUNTER cachehit; +}; + +/** IGMP stats */ +struct stats_igmp { + STAT_COUNTER xmit; /* Transmitted packets. */ + STAT_COUNTER recv; /* Received packets. */ + STAT_COUNTER drop; /* Dropped packets. */ + STAT_COUNTER chkerr; /* Checksum error. */ + STAT_COUNTER lenerr; /* Invalid length error. */ + STAT_COUNTER memerr; /* Out of memory error. */ + STAT_COUNTER proterr; /* Protocol error. */ + STAT_COUNTER rx_v1; /* Received v1 frames. */ + STAT_COUNTER rx_group; /* Received group-specific queries. */ + STAT_COUNTER rx_general; /* Received general queries. */ + STAT_COUNTER rx_report; /* Received reports. */ + STAT_COUNTER tx_join; /* Sent joins. */ + STAT_COUNTER tx_leave; /* Sent leaves. */ + STAT_COUNTER tx_report; /* Sent reports. */ +}; + +/** Memory stats */ +struct stats_mem { +#if defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY + const char *name; +#endif /* defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY */ + STAT_COUNTER err; + mem_size_t avail; + mem_size_t used; + mem_size_t max; + STAT_COUNTER illegal; +}; + +/** System element stats */ +struct stats_syselem { + STAT_COUNTER used; + STAT_COUNTER max; + STAT_COUNTER err; +}; + +/** System stats */ +struct stats_sys { + struct stats_syselem sem; + struct stats_syselem mutex; + struct stats_syselem mbox; +}; + +/** SNMP MIB2 stats */ +struct stats_mib2 { + /* IP */ + u32_t ipinhdrerrors; + u32_t ipinaddrerrors; + u32_t ipinunknownprotos; + u32_t ipindiscards; + u32_t ipindelivers; + u32_t ipoutrequests; + u32_t ipoutdiscards; + u32_t ipoutnoroutes; + u32_t ipreasmoks; + u32_t ipreasmfails; + u32_t ipfragoks; + u32_t ipfragfails; + u32_t ipfragcreates; + u32_t ipreasmreqds; + u32_t ipforwdatagrams; + u32_t ipinreceives; + + /* TCP */ + u32_t tcpactiveopens; + u32_t tcppassiveopens; + u32_t tcpattemptfails; + u32_t tcpestabresets; + u32_t tcpoutsegs; + u32_t tcpretranssegs; + u32_t tcpinsegs; + u32_t tcpinerrs; + u32_t tcpoutrsts; + + /* UDP */ + u32_t udpindatagrams; + u32_t udpnoports; + u32_t udpinerrors; + u32_t udpoutdatagrams; + + /* ICMP */ + u32_t icmpinmsgs; + u32_t icmpinerrors; + u32_t icmpindestunreachs; + u32_t icmpintimeexcds; + u32_t icmpinparmprobs; + u32_t icmpinsrcquenchs; + u32_t icmpinredirects; + u32_t icmpinechos; + u32_t icmpinechoreps; + u32_t icmpintimestamps; + u32_t icmpintimestampreps; + u32_t icmpinaddrmasks; + u32_t icmpinaddrmaskreps; + u32_t icmpoutmsgs; + u32_t icmpouterrors; + u32_t icmpoutdestunreachs; + u32_t icmpouttimeexcds; + u32_t icmpoutechos; /* can be incremented by user application ('ping') */ + u32_t icmpoutechoreps; +}; + +/** + * @ingroup netif_mib2 + * SNMP MIB2 interface stats + */ +struct stats_mib2_netif_ctrs { + /** The total number of octets received on the interface, including framing characters */ + u32_t ifinoctets; + /** The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were + * not addressed to a multicast or broadcast address at this sub-layer */ + u32_t ifinucastpkts; + /** The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were + * addressed to a multicast or broadcast address at this sub-layer */ + u32_t ifinnucastpkts; + /** The number of inbound packets which were chosen to be discarded even though no errors had + * been detected to prevent their being deliverable to a higher-layer protocol. One possible + * reason for discarding such a packet could be to free up buffer space */ + u32_t ifindiscards; + /** For packet-oriented interfaces, the number of inbound packets that contained errors + * preventing them from being deliverable to a higher-layer protocol. For character- + * oriented or fixed-length interfaces, the number of inbound transmission units that + * contained errors preventing them from being deliverable to a higher-layer protocol. */ + u32_t ifinerrors; + /** For packet-oriented interfaces, the number of packets received via the interface which + * were discarded because of an unknown or unsupported protocol. For character-oriented + * or fixed-length interfaces that support protocol multiplexing the number of transmission + * units received via the interface which were discarded because of an unknown or unsupported + * protocol. For any interface that does not support protocol multiplexing, this counter will + * always be 0 */ + u32_t ifinunknownprotos; + /** The total number of octets transmitted out of the interface, including framing characters. */ + u32_t ifoutoctets; + /** The total number of packets that higher-level protocols requested be transmitted, and + * which were not addressed to a multicast or broadcast address at this sub-layer, including + * those that were discarded or not sent. */ + u32_t ifoutucastpkts; + /** The total number of packets that higher-level protocols requested be transmitted, and which + * were addressed to a multicast or broadcast address at this sub-layer, including + * those that were discarded or not sent. */ + u32_t ifoutnucastpkts; + /** The number of outbound packets which were chosen to be discarded even though no errors had + * been detected to prevent their being transmitted. One possible reason for discarding + * such a packet could be to free up buffer space. */ + u32_t ifoutdiscards; + /** For packet-oriented interfaces, the number of outbound packets that could not be transmitted + * because of errors. For character-oriented or fixed-length interfaces, the number of outbound + * transmission units that could not be transmitted because of errors. */ + u32_t ifouterrors; +}; + +/** lwIP stats container */ +struct stats_ { +#if LINK_STATS + /** Link level */ + struct stats_proto link; +#endif +#if ETHARP_STATS + /** ARP */ + struct stats_proto etharp; +#endif +#if IPFRAG_STATS + /** Fragmentation */ + struct stats_proto ip_frag; +#endif +#if IP_STATS + /** IP */ + struct stats_proto ip; +#endif +#if ICMP_STATS + /** ICMP */ + struct stats_proto icmp; +#endif +#if IGMP_STATS + /** IGMP */ + struct stats_igmp igmp; +#endif +#if UDP_STATS + /** UDP */ + struct stats_proto udp; +#endif +#if TCP_STATS + /** TCP */ + struct stats_proto tcp; +#endif +#if MEM_STATS + /** Heap */ + struct stats_mem mem; +#endif +#if MEMP_STATS + /** Internal memory pools */ + struct stats_mem *memp[MEMP_MAX]; +#endif +#if SYS_STATS + /** System */ + struct stats_sys sys; +#endif +#if IP6_STATS + /** IPv6 */ + struct stats_proto ip6; +#endif +#if ICMP6_STATS + /** ICMP6 */ + struct stats_proto icmp6; +#endif +#if IP6_FRAG_STATS + /** IPv6 fragmentation */ + struct stats_proto ip6_frag; +#endif +#if MLD6_STATS + /** Multicast listener discovery */ + struct stats_igmp mld6; +#endif +#if ND6_STATS + /** Neighbor discovery */ + struct stats_proto nd6; +#endif +#if MIB2_STATS + /** SNMP MIB2 */ + struct stats_mib2 mib2; +#endif +}; + +/** Global variable containing lwIP internal statistics. Add this to your debugger's watchlist. */ +extern struct stats_ lwip_stats; + +/** Init statistics */ +void stats_init(void); + +#define STATS_INC(x) ++lwip_stats.x +#define STATS_DEC(x) --lwip_stats.x +#define STATS_INC_USED(x, y, type) do { lwip_stats.x.used = (type)(lwip_stats.x.used + y); \ + if (lwip_stats.x.max < lwip_stats.x.used) { \ + lwip_stats.x.max = lwip_stats.x.used; \ + } \ + } while(0) +#define STATS_GET(x) lwip_stats.x +#else /* LWIP_STATS */ +#define stats_init() +#define STATS_INC(x) +#define STATS_DEC(x) +#define STATS_INC_USED(x, y, type) +#endif /* LWIP_STATS */ + +#if TCP_STATS +#define TCP_STATS_INC(x) STATS_INC(x) +#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP") +#else +#define TCP_STATS_INC(x) +#define TCP_STATS_DISPLAY() +#endif + +#if UDP_STATS +#define UDP_STATS_INC(x) STATS_INC(x) +#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP") +#else +#define UDP_STATS_INC(x) +#define UDP_STATS_DISPLAY() +#endif + +#if ICMP_STATS +#define ICMP_STATS_INC(x) STATS_INC(x) +#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP") +#else +#define ICMP_STATS_INC(x) +#define ICMP_STATS_DISPLAY() +#endif + +#if IGMP_STATS +#define IGMP_STATS_INC(x) STATS_INC(x) +#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp, "IGMP") +#else +#define IGMP_STATS_INC(x) +#define IGMP_STATS_DISPLAY() +#endif + +#if IP_STATS +#define IP_STATS_INC(x) STATS_INC(x) +#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP") +#else +#define IP_STATS_INC(x) +#define IP_STATS_DISPLAY() +#endif + +#if IPFRAG_STATS +#define IPFRAG_STATS_INC(x) STATS_INC(x) +#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG") +#else +#define IPFRAG_STATS_INC(x) +#define IPFRAG_STATS_DISPLAY() +#endif + +#if ETHARP_STATS +#define ETHARP_STATS_INC(x) STATS_INC(x) +#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP") +#else +#define ETHARP_STATS_INC(x) +#define ETHARP_STATS_DISPLAY() +#endif + +#if LINK_STATS +#define LINK_STATS_INC(x) STATS_INC(x) +#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK") +#else +#define LINK_STATS_INC(x) +#define LINK_STATS_DISPLAY() +#endif + +#if MEM_STATS +#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y +#define MEM_STATS_INC(x) STATS_INC(mem.x) +#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y, mem_size_t) +#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x = (mem_size_t)((lwip_stats.mem.x) - (y)) +#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") +#else +#define MEM_STATS_AVAIL(x, y) +#define MEM_STATS_INC(x) +#define MEM_STATS_INC_USED(x, y) +#define MEM_STATS_DEC_USED(x, y) +#define MEM_STATS_DISPLAY() +#endif + + #if MEMP_STATS +#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i]->x) +#define MEMP_STATS_DISPLAY(i) stats_display_memp(lwip_stats.memp[i], i) +#define MEMP_STATS_GET(x, i) STATS_GET(memp[i]->x) + #else +#define MEMP_STATS_DEC(x, i) +#define MEMP_STATS_DISPLAY(i) +#define MEMP_STATS_GET(x, i) 0 +#endif + +#if SYS_STATS +#define SYS_STATS_INC(x) STATS_INC(sys.x) +#define SYS_STATS_DEC(x) STATS_DEC(sys.x) +#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1, STAT_COUNTER) +#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) +#else +#define SYS_STATS_INC(x) +#define SYS_STATS_DEC(x) +#define SYS_STATS_INC_USED(x) +#define SYS_STATS_DISPLAY() +#endif + +#if IP6_STATS +#define IP6_STATS_INC(x) STATS_INC(x) +#define IP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6, "IPv6") +#else +#define IP6_STATS_INC(x) +#define IP6_STATS_DISPLAY() +#endif + +#if ICMP6_STATS +#define ICMP6_STATS_INC(x) STATS_INC(x) +#define ICMP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp6, "ICMPv6") +#else +#define ICMP6_STATS_INC(x) +#define ICMP6_STATS_DISPLAY() +#endif + +#if IP6_FRAG_STATS +#define IP6_FRAG_STATS_INC(x) STATS_INC(x) +#define IP6_FRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6_frag, "IPv6 FRAG") +#else +#define IP6_FRAG_STATS_INC(x) +#define IP6_FRAG_STATS_DISPLAY() +#endif + +#if MLD6_STATS +#define MLD6_STATS_INC(x) STATS_INC(x) +#define MLD6_STATS_DISPLAY() stats_display_igmp(&lwip_stats.mld6, "MLDv1") +#else +#define MLD6_STATS_INC(x) +#define MLD6_STATS_DISPLAY() +#endif + +#if ND6_STATS +#define ND6_STATS_INC(x) STATS_INC(x) +#define ND6_STATS_DISPLAY() stats_display_proto(&lwip_stats.nd6, "ND") +#else +#define ND6_STATS_INC(x) +#define ND6_STATS_DISPLAY() +#endif + +#if MIB2_STATS +#define MIB2_STATS_INC(x) STATS_INC(x) +#else +#define MIB2_STATS_INC(x) +#endif + +/* Display of statistics */ +#if LWIP_STATS_DISPLAY +void stats_display(void); +void stats_display_proto(struct stats_proto *proto, const char *name); +void stats_display_igmp(struct stats_igmp *igmp, const char *name); +void stats_display_mem(struct stats_mem *mem, const char *name); +void stats_display_memp(struct stats_mem *mem, int index); +void stats_display_sys(struct stats_sys *sys); +#else /* LWIP_STATS_DISPLAY */ +#define stats_display() +#define stats_display_proto(proto, name) +#define stats_display_igmp(igmp, name) +#define stats_display_mem(mem, name) +#define stats_display_memp(mem, index) +#define stats_display_sys(sys) +#endif /* LWIP_STATS_DISPLAY */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_STATS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sys.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sys.h new file mode 100644 index 0000000..eefa8f3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/sys.h @@ -0,0 +1,578 @@ +/** + * @file + * OS abstraction layer + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + */ + +#ifndef LWIP_HDR_SYS_H +#define LWIP_HDR_SYS_H + +#include "lwip/opt.h" +#if defined (__arm__) || defined (__aarch64__) +#include "xpseudo_asm.h" +#include "xil_exception.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#if NO_SYS + +/* For a totally minimal and standalone system, we provide null + definitions of the sys_ functions. */ +typedef u8_t sys_sem_t; +typedef u8_t sys_mutex_t; +typedef u8_t sys_mbox_t; +typedef u32_t sys_prot_t; + +#define sys_sem_new(s, c) ERR_OK +#define sys_sem_signal(s) +#define sys_sem_wait(s) +#define sys_arch_sem_wait(s,t) +#define sys_sem_free(s) +#define sys_sem_valid(s) 0 +#define sys_sem_valid_val(s) 0 +#define sys_sem_set_invalid(s) +#define sys_sem_set_invalid_val(s) +#define sys_mutex_new(mu) ERR_OK +#define sys_mutex_lock(mu) +#define sys_mutex_unlock(mu) +#define sys_mutex_free(mu) +#define sys_mutex_valid(mu) 0 +#define sys_mutex_set_invalid(mu) +#define sys_mbox_new(m, s) ERR_OK +#define sys_mbox_fetch(m,d) +#define sys_mbox_tryfetch(m,d) +#define sys_mbox_post(m,d) +#define sys_mbox_trypost(m,d) +#define sys_mbox_free(m) +#define sys_mbox_valid(m) +#define sys_mbox_valid_val(m) +#define sys_mbox_set_invalid(m) +#define sys_mbox_set_invalid_val(m) + +#define sys_thread_new(n,t,a,s,p) + +#define sys_msleep(t) + +#else /* NO_SYS */ + +/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ +#define SYS_ARCH_TIMEOUT 0xffffffffUL + +/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate. + * For now we use the same magic value, but we allow this to change in future. + */ +#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT + +#include "lwip/err.h" +#include "arch/sys_arch.h" + +/** Function prototype for thread functions */ +typedef void (*lwip_thread_fn)(void *arg); + +/* Function prototypes for functions to be implemented by platform ports + (in sys_arch.c) */ + +/* Mutex functions: */ + +/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores + should be used instead */ +#ifndef LWIP_COMPAT_MUTEX +#define LWIP_COMPAT_MUTEX 0 +#endif + +#if LWIP_COMPAT_MUTEX +/* for old ports that don't have mutexes: define them to binary semaphores */ +#define sys_mutex_t sys_sem_t +#define sys_mutex_new(mutex) sys_sem_new(mutex, 1) +#define sys_mutex_lock(mutex) sys_sem_wait(mutex) +#define sys_mutex_unlock(mutex) sys_sem_signal(mutex) +#define sys_mutex_free(mutex) sys_sem_free(mutex) +#define sys_mutex_valid(mutex) sys_sem_valid(mutex) +#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex) + +#else /* LWIP_COMPAT_MUTEX */ + +/** + * @ingroup sys_mutex + * Create a new mutex. + * Note that mutexes are expected to not be taken recursively by the lwIP code, + * so both implementation types (recursive or non-recursive) should work. + * The mutex is allocated to the memory that 'mutex' + * points to (which can be both a pointer or the actual OS structure). + * If the mutex has been created, ERR_OK should be returned. Returning any + * other error will provide a hint what went wrong, but except for assertions, + * no real error handling is implemented. + * + * @param mutex pointer to the mutex to create + * @return ERR_OK if successful, another err_t otherwise + */ +err_t sys_mutex_new(sys_mutex_t *mutex); +/** + * @ingroup sys_mutex + * Blocks the thread until the mutex can be grabbed. + * @param mutex the mutex to lock + */ +void sys_mutex_lock(sys_mutex_t *mutex); +/** + * @ingroup sys_mutex + * Releases the mutex previously locked through 'sys_mutex_lock()'. + * @param mutex the mutex to unlock + */ +void sys_mutex_unlock(sys_mutex_t *mutex); +/** + * @ingroup sys_mutex + * Deallocates a mutex. + * @param mutex the mutex to delete + */ +void sys_mutex_free(sys_mutex_t *mutex); +#ifndef sys_mutex_valid +/** + * @ingroup sys_mutex + * Returns 1 if the mutes is valid, 0 if it is not valid. + * When using pointers, a simple way is to check the pointer for != NULL. + * When directly using OS structures, implementing this may be more complex. + * This may also be a define, in which case the function is not prototyped. + */ +int sys_mutex_valid(sys_mutex_t *mutex); +#endif +#ifndef sys_mutex_set_invalid +/** + * @ingroup sys_mutex + * Invalidate a mutex so that sys_mutex_valid() returns 0. + * ATTENTION: This does NOT mean that the mutex shall be deallocated: + * sys_mutex_free() is always called before calling this function! + * This may also be a define, in which case the function is not prototyped. + */ +void sys_mutex_set_invalid(sys_mutex_t *mutex); +#endif +#endif /* LWIP_COMPAT_MUTEX */ + +/* Semaphore functions: */ + +/** + * @ingroup sys_sem + * Create a new semaphore + * Creates a new semaphore. The semaphore is allocated to the memory that 'sem' + * points to (which can be both a pointer or the actual OS structure). + * The "count" argument specifies the initial state of the semaphore (which is + * either 0 or 1). + * If the semaphore has been created, ERR_OK should be returned. Returning any + * other error will provide a hint what went wrong, but except for assertions, + * no real error handling is implemented. + * + * @param sem pointer to the semaphore to create + * @param count initial count of the semaphore + * @return ERR_OK if successful, another err_t otherwise + */ +err_t sys_sem_new(sys_sem_t *sem, u8_t count); +/** + * @ingroup sys_sem + * Signals a semaphore + * @param sem the semaphore to signal + */ +void sys_sem_signal(sys_sem_t *sem); +/** + * @ingroup sys_sem + * Blocks the thread while waiting for the semaphore to be signaled. If the + * "timeout" argument is non-zero, the thread should only be blocked for the + * specified time (measured in milliseconds). If the "timeout" argument is zero, + * the thread should be blocked until the semaphore is signalled. + * + * The return value is SYS_ARCH_TIMEOUT if the semaphore wasn't signaled within + * the specified time or any other value if it was signaled (with or without + * waiting). + * Notice that lwIP implements a function with a similar name, + * sys_sem_wait(), that uses the sys_arch_sem_wait() function. + * + * @param sem the semaphore to wait for + * @param timeout timeout in milliseconds to wait (0 = wait forever) + * @return SYS_ARCH_TIMEOUT on timeout, any other value on success + */ +u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout); +/** + * @ingroup sys_sem + * Deallocates a semaphore. + * @param sem semaphore to delete + */ +void sys_sem_free(sys_sem_t *sem); +/** Wait for a semaphore - forever/no timeout */ +#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0) +#ifndef sys_sem_valid +/** + * @ingroup sys_sem + * Returns 1 if the semaphore is valid, 0 if it is not valid. + * When using pointers, a simple way is to check the pointer for != NULL. + * When directly using OS structures, implementing this may be more complex. + * This may also be a define, in which case the function is not prototyped. + */ +int sys_sem_valid(sys_sem_t *sem); +#endif +#ifndef sys_sem_set_invalid +/** + * @ingroup sys_sem + * Invalidate a semaphore so that sys_sem_valid() returns 0. + * ATTENTION: This does NOT mean that the semaphore shall be deallocated: + * sys_sem_free() is always called before calling this function! + * This may also be a define, in which case the function is not prototyped. + */ +void sys_sem_set_invalid(sys_sem_t *sem); +#endif +#ifndef sys_sem_valid_val +/** + * Same as sys_sem_valid() but taking a value, not a pointer + */ +#define sys_sem_valid_val(sem) sys_sem_valid(&(sem)) +#endif +#ifndef sys_sem_set_invalid_val +/** + * Same as sys_sem_set_invalid() but taking a value, not a pointer + */ +#define sys_sem_set_invalid_val(sem) sys_sem_set_invalid(&(sem)) +#endif + +#ifndef sys_msleep +/** + * @ingroup sys_misc + * Sleep for specified number of ms + */ +void sys_msleep(u32_t ms); /* only has a (close to) 1 ms resolution. */ +#endif + +/* Mailbox functions. */ + +/** + * @ingroup sys_mbox + * Creates an empty mailbox for maximum "size" elements. Elements stored + * in mailboxes are pointers. You have to define macros "_MBOX_SIZE" + * in your lwipopts.h, or ignore this parameter in your implementation + * and use a default size. + * If the mailbox has been created, ERR_OK should be returned. Returning any + * other error will provide a hint what went wrong, but except for assertions, + * no real error handling is implemented. + * + * @param mbox pointer to the mbox to create + * @param size (minimum) number of messages in this mbox + * @return ERR_OK if successful, another err_t otherwise + */ +err_t sys_mbox_new(sys_mbox_t *mbox, int size); +/** + * @ingroup sys_mbox + * Post a message to an mbox - may not fail + * -> blocks if full, only to be used from tasks NOT from ISR! + * + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) + */ +void sys_mbox_post(sys_mbox_t *mbox, void *msg); +/** + * @ingroup sys_mbox + * Try to post a message to an mbox - may fail if full. + * Can be used from ISR (if the sys arch layer allows this). + * Returns ERR_MEM if it is full, else, ERR_OK if the "msg" is posted. + * + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) + */ +err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg); +/** + * @ingroup sys_mbox + * Try to post a message to an mbox - may fail if full. + * To be be used from ISR. + * Returns ERR_MEM if it is full, else, ERR_OK if the "msg" is posted. + * + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) + */ +err_t sys_mbox_trypost_fromisr(sys_mbox_t *mbox, void *msg); +/** + * @ingroup sys_mbox + * Blocks the thread until a message arrives in the mailbox, but does + * not block the thread longer than "timeout" milliseconds (similar to + * the sys_arch_sem_wait() function). If "timeout" is 0, the thread should + * be blocked until a message arrives. The "msg" argument is a result + * parameter that is set by the function (i.e., by doing "*msg = + * ptr"). The "msg" parameter maybe NULL to indicate that the message + * should be dropped. + * The return values are the same as for the sys_arch_sem_wait() function: + * SYS_ARCH_TIMEOUT if there was a timeout, any other value if a messages + * is received. + * + * Note that a function with a similar name, sys_mbox_fetch(), is + * implemented by lwIP. + * + * @param mbox mbox to get a message from + * @param msg pointer where the message is stored + * @param timeout maximum time (in milliseconds) to wait for a message (0 = wait forever) + * @return SYS_ARCH_TIMEOUT on timeout, any other value if a message has been received + */ +u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout); +/* Allow port to override with a macro, e.g. special timeout for sys_arch_mbox_fetch() */ +#ifndef sys_arch_mbox_tryfetch +/** + * @ingroup sys_mbox + * This is similar to sys_arch_mbox_fetch, however if a message is not + * present in the mailbox, it immediately returns with the code + * SYS_MBOX_EMPTY. On success 0 is returned. + * To allow for efficient implementations, this can be defined as a + * function-like macro in sys_arch.h instead of a normal function. For + * example, a naive implementation could be: + * \#define sys_arch_mbox_tryfetch(mbox,msg) sys_arch_mbox_fetch(mbox,msg,1) + * although this would introduce unnecessary delays. + * + * @param mbox mbox to get a message from + * @param msg pointer where the message is stored + * @return 0 (milliseconds) if a message has been received + * or SYS_MBOX_EMPTY if the mailbox is empty + */ +u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg); +#endif +/** + * For now, we map straight to sys_arch implementation. + */ +#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg) +/** + * @ingroup sys_mbox + * Deallocates a mailbox. If there are messages still present in the + * mailbox when the mailbox is deallocated, it is an indication of a + * programming error in lwIP and the developer should be notified. + * + * @param mbox mbox to delete + */ +void sys_mbox_free(sys_mbox_t *mbox); +#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0) +#ifndef sys_mbox_valid +/** + * @ingroup sys_mbox + * Returns 1 if the mailbox is valid, 0 if it is not valid. + * When using pointers, a simple way is to check the pointer for != NULL. + * When directly using OS structures, implementing this may be more complex. + * This may also be a define, in which case the function is not prototyped. + */ +int sys_mbox_valid(sys_mbox_t *mbox); +#endif +#ifndef sys_mbox_set_invalid +/** + * @ingroup sys_mbox + * Invalidate a mailbox so that sys_mbox_valid() returns 0. + * ATTENTION: This does NOT mean that the mailbox shall be deallocated: + * sys_mbox_free() is always called before calling this function! + * This may also be a define, in which case the function is not prototyped. + */ +void sys_mbox_set_invalid(sys_mbox_t *mbox); +#endif +#ifndef sys_mbox_valid_val +/** + * Same as sys_mbox_valid() but taking a value, not a pointer + */ +#define sys_mbox_valid_val(mbox) sys_mbox_valid(&(mbox)) +#endif +#ifndef sys_mbox_set_invalid_val +/** + * Same as sys_mbox_set_invalid() but taking a value, not a pointer + */ +#define sys_mbox_set_invalid_val(mbox) sys_mbox_set_invalid(&(mbox)) +#endif + + +/** + * @ingroup sys_misc + * The only thread function: + * Starts a new thread named "name" with priority "prio" that will begin its + * execution in the function "thread()". The "arg" argument will be passed as an + * argument to the thread() function. The stack size to used for this thread is + * the "stacksize" parameter. The id of the new thread is returned. Both the id + * and the priority are system dependent. + * ATTENTION: although this function returns a value, it MUST NOT FAIL (ports have to assert this!) + * + * @param name human-readable name for the thread (used for debugging purposes) + * @param thread thread-function + * @param arg parameter passed to 'thread' + * @param stacksize stack size in bytes for the new thread (may be ignored by ports) + * @param prio priority of the new thread (may be ignored by ports) */ +sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio); + +#endif /* NO_SYS */ + +/** + * @ingroup sys_misc + * sys_init() must be called before anything else. + * Initialize the sys_arch layer. + */ +void sys_init(void); + +#ifndef sys_jiffies +/** + * Ticks/jiffies since power up. + */ +u32_t sys_jiffies(void); +#endif + +/** + * @ingroup sys_time + * Returns the current time in milliseconds, + * may be the same as sys_jiffies or at least based on it. + * Don't care for wraparound, this is only used for time diffs. + * Not implementing this function means you cannot use some modules (e.g. TCP + * timestamps, internal timeouts for NO_SYS==1). + */ +u32_t sys_now(void); + +/* Critical Region Protection */ +/* These functions must be implemented in the sys_arch.c file. + In some implementations they can provide a more light-weight protection + mechanism than using semaphores. Otherwise semaphores can be used for + implementation */ +#ifndef SYS_ARCH_PROTECT +/** SYS_LIGHTWEIGHT_PROT + * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection + * for certain critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#if SYS_LIGHTWEIGHT_PROT + +/** + * @ingroup sys_prot + * SYS_ARCH_DECL_PROTECT + * declare a protection variable. This macro will default to defining a variable of + * type sys_prot_t. If a particular port needs a different implementation, then + * this macro may be defined in sys_arch.h. + */ +#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev +/** + * @ingroup sys_prot + * SYS_ARCH_PROTECT + * Perform a "fast" protect. This could be implemented by + * disabling interrupts for an embedded system or by using a semaphore or + * mutex. The implementation should allow calling SYS_ARCH_PROTECT when + * already protected. The old protection level is returned in the variable + * "lev". This macro will default to calling the sys_arch_protect() function + * which should be implemented in sys_arch.c. If a particular port needs a + * different implementation, then this macro may be defined in sys_arch.h + */ +#ifdef __MICROBLAZE__ +#define SYS_ARCH_PROTECT(lev) lev = mfmsr(); \ + mtmsr(lev & ~0x2) +#endif + +#if defined (__arm__) || defined (__aarch64__) +#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect() +#endif +/** + * @ingroup sys_prot + * SYS_ARCH_UNPROTECT + * Perform a "fast" set of the protection level to "lev". This could be + * implemented by setting the interrupt level to "lev" within the MACRO or by + * using a semaphore or mutex. This macro will default to calling the + * sys_arch_unprotect() function which should be implemented in + * sys_arch.c. If a particular port needs a different implementation, then + * this macro may be defined in sys_arch.h + */ +#ifdef __MICROBLAZE__ +#define SYS_ARCH_UNPROTECT(lev) mtmsr(lev) +#endif + +#if defined (__arm__) || defined (__aarch64__) +#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev) +#endif +sys_prot_t sys_arch_protect(void); +void sys_arch_unprotect(sys_prot_t pval); + +#else + +#define SYS_ARCH_DECL_PROTECT(lev) +#define SYS_ARCH_PROTECT(lev) +#define SYS_ARCH_UNPROTECT(lev) + +#endif /* SYS_LIGHTWEIGHT_PROT */ + +#endif /* SYS_ARCH_PROTECT */ + +/* + * Macros to set/get and increase/decrease variables in a thread-safe way. + * Use these for accessing variable that are used from more than one thread. + */ + +#ifndef SYS_ARCH_INC +#define SYS_ARCH_INC(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var += val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_INC */ + +#ifndef SYS_ARCH_DEC +#define SYS_ARCH_DEC(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var -= val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_DEC */ + +#ifndef SYS_ARCH_GET +#define SYS_ARCH_GET(var, ret) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + ret = var; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_GET */ + +#ifndef SYS_ARCH_SET +#define SYS_ARCH_SET(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var = val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_SET */ + +#ifndef SYS_ARCH_LOCKED +#define SYS_ARCH_LOCKED(code) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + code; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_LOCKED */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_SYS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcp.h new file mode 100644 index 0000000..daf7599 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcp.h @@ -0,0 +1,500 @@ +/** + * @file + * TCP API (to be used from TCPIP thread)\n + * See also @ref tcp_raw + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_TCP_H +#define LWIP_HDR_TCP_H + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcpbase.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/icmp.h" +#include "lwip/err.h" +#include "lwip/ip6.h" +#include "lwip/ip6_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct tcp_pcb; +struct tcp_pcb_listen; + +/** Function prototype for tcp accept callback functions. Called when a new + * connection can be accepted on a listening pcb. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param newpcb The new connection pcb + * @param err An error code if there has been an error accepting. + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err); + +/** Function prototype for tcp receive callback functions. Called when data has + * been received. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb The connection pcb which received data + * @param p The received data (or NULL when the connection has been closed!) + * @param err An error code if there has been an error receiving + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb, + struct pbuf *p, err_t err); + +/** Function prototype for tcp sent callback functions. Called when sent data has + * been acknowledged by the remote side. Use it to free corresponding resources. + * This also means that the pcb has now space available to send new data. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb The connection pcb for which data has been acknowledged + * @param len The amount of bytes acknowledged + * @return ERR_OK: try to send some data by calling tcp_output + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb, + u16_t len); + +/** Function prototype for tcp poll callback functions. Called periodically as + * specified by @see tcp_poll. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb tcp pcb + * @return ERR_OK: try to send some data by calling tcp_output + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb); + +/** Function prototype for tcp error callback functions. Called when the pcb + * receives a RST or is unexpectedly closed for any other reason. + * + * @note The corresponding pcb is already freed when this callback is called! + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param err Error code to indicate why the pcb has been closed + * ERR_ABRT: aborted through tcp_abort or by a TCP timer + * ERR_RST: the connection was reset by the remote host + */ +typedef void (*tcp_err_fn)(void *arg, err_t err); + +/** Function prototype for tcp connected callback functions. Called when a pcb + * is connected to the remote side after initiating a connection attempt by + * calling tcp_connect(). + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb The connection pcb which is connected + * @param err An unused error code, always ERR_OK currently ;-) @todo! + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + * + * @note When a connection attempt fails, the error callback is currently called! + */ +typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err); + +#if LWIP_WND_SCALE +#define RCV_WND_SCALE(pcb, wnd) (((wnd) >> (pcb)->rcv_scale)) +#define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale)) +#define TCPWND16(x) ((u16_t)LWIP_MIN((x), 0xFFFF)) +#define TCP_WND_MAX(pcb) ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND))) +#else +#define RCV_WND_SCALE(pcb, wnd) (wnd) +#define SND_WND_SCALE(pcb, wnd) (wnd) +#define TCPWND16(x) (x) +#define TCP_WND_MAX(pcb) TCP_WND +#endif +/* Increments a tcpwnd_size_t and holds at max value rather than rollover */ +#define TCP_WND_INC(wnd, inc) do { \ + if ((tcpwnd_size_t)(wnd + inc) >= wnd) { \ + wnd = (tcpwnd_size_t)(wnd + inc); \ + } else { \ + wnd = (tcpwnd_size_t)-1; \ + } \ + } while(0) + +#if LWIP_TCP_SACK_OUT +/** SACK ranges to include in ACK packets. + * SACK entry is invalid if left==right. */ +struct tcp_sack_range { + /** Left edge of the SACK: the first acknowledged sequence number. */ + u32_t left; + /** Right edge of the SACK: the last acknowledged sequence number +1 (so first NOT acknowledged). */ + u32_t right; +}; +#endif /* LWIP_TCP_SACK_OUT */ + +/** Function prototype for deallocation of arguments. Called *just before* the + * pcb is freed, so don't expect to be able to do anything with this pcb! + * + * @param id ext arg id (allocated via @ref tcp_ext_arg_alloc_id) + * @param data pointer to the data (set via @ref tcp_ext_arg_set before) + */ +typedef void (*tcp_extarg_callback_pcb_destroyed_fn)(u8_t id, void *data); + +/** Function prototype to transition arguments from a listening pcb to an accepted pcb + * + * @param id ext arg id (allocated via @ref tcp_ext_arg_alloc_id) + * @param lpcb the listening pcb accepting a connection + * @param cpcb the newly allocated connection pcb + * @return ERR_OK if OK, any error if connection should be dropped + */ +typedef err_t (*tcp_extarg_callback_passive_open_fn)(u8_t id, struct tcp_pcb_listen *lpcb, struct tcp_pcb *cpcb); + +/** A table of callback functions that is invoked for ext arguments */ +struct tcp_ext_arg_callbacks { + /** @ref tcp_extarg_callback_pcb_destroyed_fn */ + tcp_extarg_callback_pcb_destroyed_fn destroy; + /** @ref tcp_extarg_callback_passive_open_fn */ + tcp_extarg_callback_passive_open_fn passive_open; +}; + +#define LWIP_TCP_PCB_NUM_EXT_ARG_ID_INVALID 0xFF + +#if LWIP_TCP_PCB_NUM_EXT_ARGS +/* This is the structure for ext args in tcp pcbs (used as array) */ +struct tcp_pcb_ext_args { + const struct tcp_ext_arg_callbacks *callbacks; + void *data; +}; +/* This is a helper define to prevent zero size arrays if disabled */ +#define TCP_PCB_EXTARGS struct tcp_pcb_ext_args ext_args[LWIP_TCP_PCB_NUM_EXT_ARGS]; +#else +#define TCP_PCB_EXTARGS +#endif + +typedef u16_t tcpflags_t; +#define TCP_ALLFLAGS 0xffffU + +/** + * members common to struct tcp_pcb and struct tcp_listen_pcb + */ +#define TCP_PCB_COMMON(type) \ + type *next; /* for the linked list */ \ + void *callback_arg; \ + TCP_PCB_EXTARGS \ + enum tcp_state state; /* TCP state */ \ + u8_t prio; \ + /* ports are in host byte order */ \ + u16_t local_port + + +/** the TCP protocol control block for listening pcbs */ +struct tcp_pcb_listen { +/** Common members of all PCB types */ + IP_PCB; +/** Protocol specific PCB members */ + TCP_PCB_COMMON(struct tcp_pcb_listen); + +#if LWIP_CALLBACK_API + /* Function to call when a listener has been connected. */ + tcp_accept_fn accept; +#endif /* LWIP_CALLBACK_API */ + +#if TCP_LISTEN_BACKLOG + u8_t backlog; + u8_t accepts_pending; +#endif /* TCP_LISTEN_BACKLOG */ +}; + + +/** the TCP protocol control block */ +struct tcp_pcb { +/** common PCB members */ + IP_PCB; +/** protocol specific PCB members */ + TCP_PCB_COMMON(struct tcp_pcb); + + /* ports are in host byte order */ + u16_t remote_port; + + tcpflags_t flags; +#define TF_ACK_DELAY 0x01U /* Delayed ACK. */ +#define TF_ACK_NOW 0x02U /* Immediate ACK. */ +#define TF_INFR 0x04U /* In fast recovery. */ +#define TF_CLOSEPEND 0x08U /* If this is set, tcp_close failed to enqueue the FIN (retried in tcp_tmr) */ +#define TF_RXCLOSED 0x10U /* rx closed by tcp_shutdown */ +#define TF_FIN 0x20U /* Connection was closed locally (FIN segment enqueued). */ +#define TF_NODELAY 0x40U /* Disable Nagle algorithm */ +#define TF_NAGLEMEMERR 0x80U /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */ +#if LWIP_WND_SCALE +#define TF_WND_SCALE 0x0100U /* Window Scale option enabled */ +#endif +#if TCP_LISTEN_BACKLOG +#define TF_BACKLOGPEND 0x0200U /* If this is set, a connection pcb has increased the backlog on its listener */ +#endif +#if LWIP_TCP_TIMESTAMPS +#define TF_TIMESTAMP 0x0400U /* Timestamp option enabled */ +#endif +#define TF_RTO 0x0800U /* RTO timer has fired, in-flight data moved to unsent and being retransmitted */ +#if LWIP_TCP_SACK_OUT +#define TF_SACK 0x1000U /* Selective ACKs enabled */ +#endif + + /* the rest of the fields are in host byte order + as we have to do some math with them */ + + /* Timers */ + u8_t polltmr, pollinterval; + u8_t last_timer; + u32_t tmr; + + /* receiver variables */ + u32_t rcv_nxt; /* next seqno expected */ + tcpwnd_size_t rcv_wnd; /* receiver window available */ + tcpwnd_size_t rcv_ann_wnd; /* receiver window to announce */ + u32_t rcv_ann_right_edge; /* announced right edge of window */ + +#if LWIP_TCP_SACK_OUT + /* SACK ranges to include in ACK packets (entry is invalid if left==right) */ + struct tcp_sack_range rcv_sacks[LWIP_TCP_MAX_SACK_NUM]; +#define LWIP_TCP_SACK_VALID(pcb, idx) ((pcb)->rcv_sacks[idx].left != (pcb)->rcv_sacks[idx].right) +#endif /* LWIP_TCP_SACK_OUT */ + + /* Retransmission timer. */ + s16_t rtime; + + u16_t mss; /* maximum segment size */ + + /* RTT (round trip time) estimation variables */ + u32_t rttest; /* RTT estimate in 500ms ticks */ + u32_t rtseq; /* sequence number being timed */ + s16_t sa, sv; /* @see "Congestion Avoidance and Control" by Van Jacobson and Karels */ + + s16_t rto; /* retransmission time-out (in ticks of TCP_SLOW_INTERVAL) */ + u8_t nrtx; /* number of retransmissions */ + + /* fast retransmit/recovery */ + u8_t dupacks; + u32_t lastack; /* Highest acknowledged seqno. */ + + /* congestion avoidance/control variables */ + tcpwnd_size_t cwnd; + tcpwnd_size_t ssthresh; + + /* first byte following last rto byte */ + u32_t rto_end; + + /* sender variables */ + u32_t snd_nxt; /* next new seqno to be sent */ + u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last + window update. */ + u32_t snd_lbb; /* Sequence number of next byte to be buffered. */ + tcpwnd_size_t snd_wnd; /* sender window */ + tcpwnd_size_t snd_wnd_max; /* the maximum sender window announced by the remote host */ + + tcpwnd_size_t snd_buf; /* Available buffer space for sending (in bytes). */ +#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3) + u16_t snd_queuelen; /* Number of pbufs currently in the send buffer. */ + +#if TCP_OVERSIZE + /* Extra bytes available at the end of the last pbuf in unsent. */ + u16_t unsent_oversize; +#endif /* TCP_OVERSIZE */ + + tcpwnd_size_t bytes_acked; + + /* These are ordered by sequence number: */ + struct tcp_seg *unsent; /* Unsent (queued) segments. */ + struct tcp_seg *unacked; /* Sent but unacknowledged segments. */ +#if TCP_QUEUE_OOSEQ + struct tcp_seg *ooseq; /* Received out of sequence segments. */ +#endif /* TCP_QUEUE_OOSEQ */ + + struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */ + +#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG + struct tcp_pcb_listen* listener; +#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */ + +#if LWIP_CALLBACK_API + /* Function to be called when more send buffer space is available. */ + tcp_sent_fn sent; + /* Function to be called when (in-sequence) data has arrived. */ + tcp_recv_fn recv; + /* Function to be called when a connection has been set up. */ + tcp_connected_fn connected; + /* Function which is called periodically. */ + tcp_poll_fn poll; + /* Function to be called whenever a fatal error occurs. */ + tcp_err_fn errf; +#endif /* LWIP_CALLBACK_API */ + +#if LWIP_TCP_TIMESTAMPS + u32_t ts_lastacksent; + u32_t ts_recent; +#endif /* LWIP_TCP_TIMESTAMPS */ + + /* idle time before KEEPALIVE is sent */ + u32_t keep_idle; +#if LWIP_TCP_KEEPALIVE + u32_t keep_intvl; + u32_t keep_cnt; +#endif /* LWIP_TCP_KEEPALIVE */ + + /* Persist timer counter */ + u8_t persist_cnt; + /* Persist timer back-off */ + u8_t persist_backoff; + /* Number of persist probes */ + u8_t persist_probe; + + /* KEEPALIVE counter */ + u8_t keep_cnt_sent; + +#if LWIP_WND_SCALE + u8_t snd_scale; + u8_t rcv_scale; +#endif +}; + +#if LWIP_EVENT_API + +enum lwip_event { + LWIP_EVENT_ACCEPT, + LWIP_EVENT_SENT, + LWIP_EVENT_RECV, + LWIP_EVENT_CONNECTED, + LWIP_EVENT_POLL, + LWIP_EVENT_ERR +}; + +err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb, + enum lwip_event, + struct pbuf *p, + u16_t size, + err_t err); + +#endif /* LWIP_EVENT_API */ + +/* Application program's interface: */ +struct tcp_pcb * tcp_new (void); +struct tcp_pcb * tcp_new_ip_type (u8_t type); + +void tcp_arg (struct tcp_pcb *pcb, void *arg); +#if LWIP_CALLBACK_API +void tcp_recv (struct tcp_pcb *pcb, tcp_recv_fn recv); +void tcp_sent (struct tcp_pcb *pcb, tcp_sent_fn sent); +void tcp_err (struct tcp_pcb *pcb, tcp_err_fn err); +void tcp_accept (struct tcp_pcb *pcb, tcp_accept_fn accept); +#endif /* LWIP_CALLBACK_API */ +void tcp_poll (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval); + +#define tcp_set_flags(pcb, set_flags) do { (pcb)->flags = (tcpflags_t)((pcb)->flags | (set_flags)); } while(0) +#define tcp_clear_flags(pcb, clr_flags) do { (pcb)->flags = (tcpflags_t)((pcb)->flags & (tcpflags_t)(~(clr_flags) & TCP_ALLFLAGS)); } while(0) +#define tcp_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0) + +#if LWIP_TCP_TIMESTAMPS +#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss) +#else /* LWIP_TCP_TIMESTAMPS */ +/** @ingroup tcp_raw */ +#define tcp_mss(pcb) ((pcb)->mss) +#endif /* LWIP_TCP_TIMESTAMPS */ +/** @ingroup tcp_raw */ +#define tcp_sndbuf(pcb) (TCPWND16((pcb)->snd_buf)) +/** @ingroup tcp_raw */ +#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen) +/** @ingroup tcp_raw */ +#define tcp_nagle_disable(pcb) tcp_set_flags(pcb, TF_NODELAY) +/** @ingroup tcp_raw */ +#define tcp_nagle_enable(pcb) tcp_clear_flags(pcb, TF_NODELAY) +/** @ingroup tcp_raw */ +#define tcp_nagle_disabled(pcb) tcp_is_flag_set(pcb, TF_NODELAY) + +#if TCP_LISTEN_BACKLOG +#define tcp_backlog_set(pcb, new_backlog) do { \ + LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", (pcb)->state == LISTEN); \ + ((struct tcp_pcb_listen *)(pcb))->backlog = ((new_backlog) ? (new_backlog) : 1); } while(0) +void tcp_backlog_delayed(struct tcp_pcb* pcb); +void tcp_backlog_accepted(struct tcp_pcb* pcb); +#else /* TCP_LISTEN_BACKLOG */ +#define tcp_backlog_set(pcb, new_backlog) +#define tcp_backlog_delayed(pcb) +#define tcp_backlog_accepted(pcb) +#endif /* TCP_LISTEN_BACKLOG */ +#define tcp_accepted(pcb) do { LWIP_UNUSED_ARG(pcb); } while(0) /* compatibility define, not needed any more */ + +void tcp_recved (struct tcp_pcb *pcb, u16_t len); +err_t tcp_bind (struct tcp_pcb *pcb, const ip_addr_t *ipaddr, + u16_t port); +void tcp_bind_netif(struct tcp_pcb *pcb, const struct netif *netif); +err_t tcp_connect (struct tcp_pcb *pcb, const ip_addr_t *ipaddr, + u16_t port, tcp_connected_fn connected); + +struct tcp_pcb * tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err); +struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog); +/** @ingroup tcp_raw */ +#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) + +void tcp_abort (struct tcp_pcb *pcb); +err_t tcp_close (struct tcp_pcb *pcb); +err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx); + +err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len, + u8_t apiflags); + +void tcp_setprio (struct tcp_pcb *pcb, u8_t prio); + +err_t tcp_output (struct tcp_pcb *pcb); + +err_t tcp_tcp_get_tcp_addrinfo(struct tcp_pcb *pcb, int local, ip_addr_t *addr, u16_t *port); + +#define tcp_dbg_get_tcp_state(pcb) ((pcb)->state) + +/* for compatibility with older implementation */ +#define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6) + +#if LWIP_TCP_PCB_NUM_EXT_ARGS +u8_t tcp_ext_arg_alloc_id(void); +void tcp_ext_arg_set_callbacks(struct tcp_pcb *pcb, uint8_t id, const struct tcp_ext_arg_callbacks * const callbacks); +void tcp_ext_arg_set(struct tcp_pcb *pcb, uint8_t id, void *arg); +void *tcp_ext_arg_get(const struct tcp_pcb *pcb, uint8_t id); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP */ + +#endif /* LWIP_HDR_TCP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpbase.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpbase.h new file mode 100644 index 0000000..0023074 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpbase.h @@ -0,0 +1,88 @@ +/** + * @file + * Base TCP API definitions shared by TCP and ALTCP\n + * See also @ref tcp_raw + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_TCPBASE_H +#define LWIP_HDR_TCPBASE_H + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#if LWIP_WND_SCALE +typedef u32_t tcpwnd_size_t; +#else +typedef u16_t tcpwnd_size_t; +#endif + +enum tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; +/* ATTENTION: this depends on state number ordering! */ +#define TCP_STATE_IS_CLOSING(state) ((state) >= FIN_WAIT_1) + +/* Flags for "apiflags" parameter in tcp_write */ +#define TCP_WRITE_FLAG_COPY 0x01 +#define TCP_WRITE_FLAG_MORE 0x02 + +#define TCP_PRIO_MIN 1 +#define TCP_PRIO_NORMAL 64 +#define TCP_PRIO_MAX 127 + +const char* tcp_debug_state_str(enum tcp_state s); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP */ + +#endif /* LWIP_HDR_TCPBASE_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpip.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpip.h new file mode 100644 index 0000000..0b8880a --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/tcpip.h @@ -0,0 +1,113 @@ +/** + * @file + * Functions to sync with TCPIP thread + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_TCPIP_H +#define LWIP_HDR_TCPIP_H + +#include "lwip/opt.h" + +#if !NO_SYS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/err.h" +#include "lwip/timeouts.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_TCPIP_CORE_LOCKING +/** The global semaphore to lock the stack. */ +extern sys_mutex_t lock_tcpip_core; +#if !defined LOCK_TCPIP_CORE || defined __DOXYGEN__ +/** Lock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */ +#define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core) +/** Unlock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */ +#define UNLOCK_TCPIP_CORE() sys_mutex_unlock(&lock_tcpip_core) +#endif /* LOCK_TCPIP_CORE */ +#else /* LWIP_TCPIP_CORE_LOCKING */ +#define LOCK_TCPIP_CORE() +#define UNLOCK_TCPIP_CORE() +#endif /* LWIP_TCPIP_CORE_LOCKING */ + +struct pbuf; +struct netif; + +/** Function prototype for the init_done function passed to tcpip_init */ +typedef void (*tcpip_init_done_fn)(void *arg); +/** Function prototype for functions passed to tcpip_callback() */ +typedef void (*tcpip_callback_fn)(void *ctx); + +/* Forward declarations */ +struct tcpip_callback_msg; + +void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg); + +err_t tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn); +err_t tcpip_input(struct pbuf *p, struct netif *inp); + +err_t tcpip_try_callback(tcpip_callback_fn function, void *ctx); +err_t tcpip_callback(tcpip_callback_fn function, void *ctx); +/** @ingroup lwip_os + * @deprecated use tcpip_try_callback() or tcpip_callback() instead + */ +#define tcpip_callback_with_block(function, ctx, block) ((block != 0)? tcpip_callback(function, ctx) : tcpip_try_callback(function, ctx)) + +struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx); +void tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg); +err_t tcpip_callbackmsg_trycallback(struct tcpip_callback_msg* msg); +err_t tcpip_callbackmsg_trycallback_fromisr(struct tcpip_callback_msg* msg); + +/* free pbufs or heap memory from another context without blocking */ +err_t pbuf_free_callback(struct pbuf *p); +err_t mem_free_callback(void *m); + +#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS +err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); +err_t tcpip_untimeout(sys_timeout_handler h, void *arg); +#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */ + +#ifdef TCPIP_THREAD_TEST +int tcpip_thread_poll_one(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !NO_SYS */ + +#endif /* LWIP_HDR_TCPIP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/timeouts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/timeouts.h new file mode 100644 index 0000000..b601f9e --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/timeouts.h @@ -0,0 +1,128 @@ +/** + * @file + * Timer implementations + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_TIMEOUTS_H +#define LWIP_HDR_TIMEOUTS_H + +#include "lwip/opt.h" +#include "lwip/err.h" +#if !NO_SYS +#include "lwip/sys.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef LWIP_DEBUG_TIMERNAMES +#ifdef LWIP_DEBUG +#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG +#else /* LWIP_DEBUG */ +#define LWIP_DEBUG_TIMERNAMES 0 +#endif /* LWIP_DEBUG*/ +#endif + +/** Returned by sys_timeouts_sleeptime() to indicate there is no timer, so we + * can sleep forever. + */ +#define SYS_TIMEOUTS_SLEEPTIME_INFINITE 0xFFFFFFFF + +/** Function prototype for a stack-internal timer function that has to be + * called at a defined interval */ +typedef void (* lwip_cyclic_timer_handler)(void); + +/** This struct contains information about a stack-internal timer function + that has to be called at a defined interval */ +struct lwip_cyclic_timer { + u32_t interval_ms; + lwip_cyclic_timer_handler handler; +#if LWIP_DEBUG_TIMERNAMES + const char* handler_name; +#endif /* LWIP_DEBUG_TIMERNAMES */ +}; + +/** This array contains all stack-internal cyclic timers. To get the number of + * timers, use lwip_num_cyclic_timers */ +extern const struct lwip_cyclic_timer lwip_cyclic_timers[]; +/** Array size of lwip_cyclic_timers[] */ +extern const int lwip_num_cyclic_timers; + +#if LWIP_TIMERS + +/** Function prototype for a timeout callback function. Register such a function + * using sys_timeout(). + * + * @param arg Additional argument to pass to the function - set up by sys_timeout() + */ +typedef void (* sys_timeout_handler)(void *arg); + +struct sys_timeo { + struct sys_timeo *next; + u32_t time; + sys_timeout_handler h; + void *arg; +#if LWIP_DEBUG_TIMERNAMES + const char* handler_name; +#endif /* LWIP_DEBUG_TIMERNAMES */ +}; + +void sys_timeouts_init(void); + +#if LWIP_DEBUG_TIMERNAMES +void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); +#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler) +#else /* LWIP_DEBUG_TIMERNAMES */ +void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg); +#endif /* LWIP_DEBUG_TIMERNAMES */ + +void sys_untimeout(sys_timeout_handler handler, void *arg); +void sys_restart_timeouts(void); +void sys_check_timeouts(void); +u32_t sys_timeouts_sleeptime(void); + +#if LWIP_TESTMODE +struct sys_timeo** sys_timeouts_get_next_timeout(void); +void lwip_cyclic_timer(void *arg); +#endif + +#endif /* LWIP_TIMERS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_TIMEOUTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/udp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/udp.h new file mode 100644 index 0000000..9a4a2e6 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwip/udp.h @@ -0,0 +1,209 @@ +/** + * @file + * UDP API (to be used from TCPIP thread)\n + * See also @ref udp_raw + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_UDP_H +#define LWIP_HDR_UDP_H + +#include "lwip/opt.h" + +#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/ip_addr.h" +#include "lwip/ip.h" +#include "lwip/ip6_addr.h" +#include "lwip/prot/udp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define UDP_FLAGS_NOCHKSUM 0x01U +#define UDP_FLAGS_UDPLITE 0x02U +#define UDP_FLAGS_CONNECTED 0x04U +#define UDP_FLAGS_MULTICAST_LOOP 0x08U +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +#define UDP_FLAGS_BLOCK_TX_TILL_COMPLETE 0x10U +#endif + +struct udp_pcb; + +/** Function prototype for udp pcb receive callback functions + * addr and port are in same byte order as in the pcb + * The callback is responsible for freeing the pbuf + * if it's not used any more. + * + * ATTENTION: Be aware that 'addr' might point into the pbuf 'p' so freeing this pbuf + * can make 'addr' invalid, too. + * + * @param arg user supplied argument (udp_pcb.recv_arg) + * @param pcb the udp_pcb which received data + * @param p the packet buffer that was received + * @param addr the remote IP address from which the packet was received + * @param port the remote port from which the packet was received + */ +typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *addr, u16_t port); + +/** the UDP protocol control block */ +struct udp_pcb { +/** Common members of all PCB types */ + IP_PCB; + +/* Protocol specific PCB members */ + + struct udp_pcb *next; + + u8_t flags; + /** ports are in host byte order */ + u16_t local_port, remote_port; + +#if LWIP_MULTICAST_TX_OPTIONS +#if LWIP_IPV4 + /** outgoing network interface for multicast packets, by IPv4 address (if not 'any') */ + ip4_addr_t mcast_ip4; +#endif /* LWIP_IPV4 */ + /** outgoing network interface for multicast packets, by interface index (if nonzero) */ + u8_t mcast_ifindex; + /** TTL for outgoing multicast packets */ + u8_t mcast_ttl; +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + +#if LWIP_UDPLITE + /** used for UDP_LITE only */ + u16_t chksum_len_rx, chksum_len_tx; +#endif /* LWIP_UDPLITE */ + + /** receive callback function */ + udp_recv_fn recv; + /** user-supplied argument for the recv callback */ + void *recv_arg; +}; +/* udp_pcbs export for external reference (e.g. SNMP agent) */ +extern struct udp_pcb *udp_pcbs; + +/* The following functions is the application layer interface to the + UDP code. */ +struct udp_pcb * udp_new (void); +struct udp_pcb * udp_new_ip_type(u8_t type); +void udp_remove (struct udp_pcb *pcb); +err_t udp_bind (struct udp_pcb *pcb, const ip_addr_t *ipaddr, + u16_t port); +void udp_bind_netif (struct udp_pcb *pcb, const struct netif* netif); +err_t udp_connect (struct udp_pcb *pcb, const ip_addr_t *ipaddr, + u16_t port); +void udp_disconnect (struct udp_pcb *pcb); +void udp_recv (struct udp_pcb *pcb, udp_recv_fn recv, + void *recv_arg); +err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port, + struct netif *netif); +err_t udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port, + struct netif *netif, const ip_addr_t *src_ip); +err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port); +err_t udp_send (struct udp_pcb *pcb, struct pbuf *p); +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE && NO_SYS +err_t udp_send_blocking(struct udp_pcb *pcb, struct pbuf *p); +err_t udp_sendto_blocking(struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port); +#endif + +#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP +err_t udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port, + struct netif *netif, u8_t have_chksum, + u16_t chksum); +err_t udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port, + u8_t have_chksum, u16_t chksum); +err_t udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, + u8_t have_chksum, u16_t chksum); +err_t udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, + const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, + u8_t have_chksum, u16_t chksum, const ip_addr_t *src_ip); +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE && NO_SYS +err_t udp_send_chksum_blocking(struct udp_pcb *pcb, struct pbuf *p, + u8_t have_chksum, u16_t chksum); +err_t udp_sendto_chksum_blocking(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip, + u16_t dst_port, u8_t have_chksum, u16_t chksum); +#endif +#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */ + +#define udp_flags(pcb) ((pcb)->flags) +#define udp_setflags(pcb, f) ((pcb)->flags = (f)) + +#define udp_set_flags(pcb, set_flags) do { (pcb)->flags = (u8_t)((pcb)->flags | (set_flags)); } while(0) +#define udp_clear_flags(pcb, clr_flags) do { (pcb)->flags = (u8_t)((pcb)->flags & (u8_t)(~(clr_flags) & 0xff)); } while(0) +#define udp_is_flag_set(pcb, flag) (((pcb)->flags & (flag)) != 0) + +/* The following functions are the lower layer interface to UDP. */ +void udp_input (struct pbuf *p, struct netif *inp); + +void udp_init (void); + +/* for compatibility with older implementation */ +#define udp_new_ip6() udp_new_ip_type(IPADDR_TYPE_V6) + +#if LWIP_MULTICAST_TX_OPTIONS +#if LWIP_IPV4 +#define udp_set_multicast_netif_addr(pcb, ip4addr) ip4_addr_copy((pcb)->mcast_ip4, *(ip4addr)) +#define udp_get_multicast_netif_addr(pcb) (&(pcb)->mcast_ip4) +#endif /* LWIP_IPV4 */ +#define udp_set_multicast_netif_index(pcb, idx) ((pcb)->mcast_ifindex = (idx)) +#define udp_get_multicast_netif_index(pcb) ((pcb)->mcast_ifindex) +#define udp_set_multicast_ttl(pcb, value) ((pcb)->mcast_ttl = (value)) +#define udp_get_multicast_ttl(pcb) ((pcb)->mcast_ttl) +#endif /* LWIP_MULTICAST_TX_OPTIONS */ + +#if UDP_DEBUG +void udp_debug_print(struct udp_hdr *udphdr); +#else +#define udp_debug_print(udphdr) +#endif + +void udp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_UDP */ + +#endif /* LWIP_HDR_UDP_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwipopts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwipopts.h new file mode 100644 index 0000000..f57e3bf --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/lwipopts.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2001, 2002 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIPOPTS_H_ +#define __LWIPOPTS_H_ + +#ifndef PROCESSOR_LITTLE_ENDIAN +#define PROCESSOR_LITTLE_ENDIAN +#endif + +#define SYS_LIGHTWEIGHT_PROT 1 + +#define NO_SYS 1 +#define LWIP_SOCKET 0 +#define LWIP_COMPAT_SOCKETS 0 +#define LWIP_NETCONN 0 + +#define NO_SYS_NO_TIMERS 1 + +#define LWIP_TCP_KEEPALIVE 0 + +#define MEM_ALIGNMENT 64 +#define MEM_SIZE 131072 +#define MEMP_NUM_PBUF 16 +#define MEMP_NUM_UDP_PCB 4 +#define MEMP_NUM_TCP_PCB 32 +#define MEMP_NUM_TCP_PCB_LISTEN 8 +#define MEMP_NUM_TCP_SEG 256 +#define MEMP_NUM_SYS_TIMEOUT 8 +#define MEMP_NUM_NETBUF 8 +#define MEMP_NUM_NETCONN 16 +#define MEMP_NUM_TCPIP_MSG_API 16 +#define MEMP_NUM_TCPIP_MSG_INPKT 64 + +#define MEMP_NUM_SYS_TIMEOUT 8 +#define PBUF_POOL_SIZE 256 +#define PBUF_POOL_BUFSIZE 1700 +#define PBUF_LINK_HLEN 16 + +#define ARP_TABLE_SIZE 10 +#define ARP_QUEUEING 1 + +#define ICMP_TTL 255 + +#define IP_OPTIONS 0 +#define IP_FORWARD 0 +#define IP_REASSEMBLY 1 +#define IP_FRAG 1 +#define IP_REASS_MAX_PBUFS 128 +#define IP_FRAG_MAX_MTU 1500 +#define IP_DEFAULT_TTL 255 +#define LWIP_CHKSUM_ALGORITHM 3 + +#define LWIP_UDP 1 +#define UDP_TTL 255 +#define LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE 0 + +#define LWIP_TCP 1 +#define TCP_MSS 1460 +#define TCP_SND_BUF 8192 +#define TCP_WND 2048 +#define TCP_TTL 255 +#define TCP_MAXRTX 12 +#define TCP_SYNMAXRTX 4 +#define TCP_QUEUE_OOSEQ 1 +#define TCP_SND_QUEUELEN 16 * TCP_SND_BUF/TCP_MSS +#define CHECKSUM_GEN_TCP 0 +#define CHECKSUM_GEN_UDP 0 +#define CHECKSUM_GEN_IP 0 +#define CHECKSUM_CHECK_TCP 0 +#define CHECKSUM_CHECK_UDP 0 +#define CHECKSUM_CHECK_IP 0 +#define LWIP_FULL_CSUM_OFFLOAD_RX 1 +#define LWIP_FULL_CSUM_OFFLOAD_TX 1 + +#define MEMP_SEPARATE_POOLS 1 +#define MEMP_NUM_FRAG_PBUF 256 +#define IP_OPTIONS_ALLOWED 0 +#define TCP_OVERSIZE TCP_MSS + +#define LWIP_DHCP 0 +#define DHCP_DOES_ARP_CHECK 0 + +#define CONFIG_LINKSPEED_AUTODETECT 1 + +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/mblaze_nt_types.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/mblaze_nt_types.h new file mode 100644 index 0000000..6b51ea9 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/mblaze_nt_types.h @@ -0,0 +1,28 @@ +/****************************************************************************** +* Copyright (c) 2002 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + + + +#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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif.h new file mode 100644 index 0000000..f4f8cf1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif.h @@ -0,0 +1,127 @@ +/** + * @file + * lwIP netif implementing an IEEE 802.1D MAC Bridge + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_NETIF_BRIDGEIF_H +#define LWIP_HDR_NETIF_BRIDGEIF_H + +#include "netif/bridgeif_opts.h" + +#include "lwip/err.h" +#include "lwip/prot/ethernet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct netif; + +#if (BRIDGEIF_MAX_PORTS < 0) || (BRIDGEIF_MAX_PORTS >= 64) +#error BRIDGEIF_MAX_PORTS must be [1..63] +#elif BRIDGEIF_MAX_PORTS < 8 +typedef u8_t bridgeif_portmask_t; +#elif BRIDGEIF_MAX_PORTS < 16 +typedef u16_t bridgeif_portmask_t; +#elif BRIDGEIF_MAX_PORTS < 32 +typedef u32_t bridgeif_portmask_t; +#elif BRIDGEIF_MAX_PORTS < 64 +typedef u64_t bridgeif_portmask_t; +#endif + +#define BR_FLOOD ((bridgeif_portmask_t)-1) + +/** @ingroup bridgeif + * Initialisation data for @ref bridgeif_init. + * An instance of this type must be passed as parameter 'state' to @ref netif_add + * when the bridge is added. + */ +typedef struct bridgeif_initdata_s { + /** MAC address of the bridge (cannot use the netif's addresses) */ + struct eth_addr ethaddr; + /** Maximum number of ports in the bridge (ports are stored in an array, this + influences memory allocated for netif->state of the bridge netif). */ + u8_t max_ports; + /** Maximum number of dynamic/learning entries in the bridge's forwarding database. + In the default implementation, this controls memory consumption only. */ + u16_t max_fdb_dynamic_entries; + /** Maximum number of static forwarding entries. Influences memory consumption! */ + u16_t max_fdb_static_entries; +} bridgeif_initdata_t; + +/** @ingroup bridgeif + * Use this for constant initialization of a bridgeif_initdat_t + * (ethaddr must be passed as ETH_ADDR()) + */ +#define BRIDGEIF_INITDATA1(max_ports, max_fdb_dynamic_entries, max_fdb_static_entries, ethaddr) {ethaddr, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries} +/** @ingroup bridgeif + * Use this for constant initialization of a bridgeif_initdat_t + * (each byte of ethaddr must be passed) + */ +#define BRIDGEIF_INITDATA2(max_ports, max_fdb_dynamic_entries, max_fdb_static_entries, e0, e1, e2, e3, e4, e5) {{e0, e1, e2, e3, e4, e5}, max_ports, max_fdb_dynamic_entries, max_fdb_static_entries} + +err_t bridgeif_init(struct netif *netif); +err_t bridgeif_add_port(struct netif *bridgeif, struct netif *portif); +err_t bridgeif_fdb_add(struct netif *bridgeif, const struct eth_addr *addr, bridgeif_portmask_t ports); +err_t bridgeif_fdb_remove(struct netif *bridgeif, const struct eth_addr *addr); + +/* FDB interface, can be replaced by own implementation */ +void bridgeif_fdb_update_src(void *fdb_ptr, struct eth_addr *src_addr, u8_t port_idx); +bridgeif_portmask_t bridgeif_fdb_get_dst_ports(void *fdb_ptr, struct eth_addr *dst_addr); +void* bridgeif_fdb_init(u16_t max_fdb_entries); + +#if BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT +#ifndef BRIDGEIF_DECL_PROTECT +/* define bridgeif protection to sys_arch_protect... */ +#include "lwip/sys.h" +#define BRIDGEIF_DECL_PROTECT(lev) SYS_ARCH_DECL_PROTECT(lev) +#define BRIDGEIF_READ_PROTECT(lev) SYS_ARCH_PROTECT(lev) +#define BRIDGEIF_READ_UNPROTECT(lev) SYS_ARCH_UNPROTECT(lev) +#define BRIDGEIF_WRITE_PROTECT(lev) +#define BRIDGEIF_WRITE_UNPROTECT(lev) +#endif +#else /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */ +#include "lwip/tcpip.h" +#define BRIDGEIF_DECL_PROTECT(lev) +#define BRIDGEIF_READ_PROTECT(lev) +#define BRIDGEIF_READ_UNPROTECT(lev) +#define BRIDGEIF_WRITE_PROTECT(lev) +#define BRIDGEIF_WRITE_UNPROTECT(lev) +#endif /* BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_BRIDGEIF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif_opts.h new file mode 100644 index 0000000..b85c301 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/bridgeif_opts.h @@ -0,0 +1,90 @@ +/** + * @file + * lwIP netif implementing an IEEE 802.1D MAC Bridge + */ + +/* + * Copyright (c) 2017 Simon Goldschmidt. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_NETIF_BRIDGEIF_OPTS_H +#define LWIP_HDR_NETIF_BRIDGEIF_OPTS_H + +#include "lwip/opt.h" + +/** + * @defgroup bridgeif_opts Options + * @ingroup bridgeif + * @{ + */ + +/** BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT==1: set port netif's 'input' function + * to call directly into bridgeif code and on top of that, directly call into + * the selected forwarding port's 'linkoutput' function. + * This means that the bridgeif input/output path is protected from concurrent access + * but as well, *all* bridge port netif's drivers must correctly handle concurrent access! + * == 0: get into tcpip_thread for every input packet (no multithreading) + * ATTENTION: as ==0 relies on tcpip.h, the default depends on NO_SYS setting + */ +#ifndef BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT +#define BRIDGEIF_PORT_NETIFS_OUTPUT_DIRECT NO_SYS +#endif + +/** BRIDGEIF_MAX_PORTS: this is used to create a typedef used for forwarding + * bit-fields: the number of bits required is this + 1 (for the internal/cpu port) + * (63 is the maximum, resulting in an u64_t for the bit mask) + * ATTENTION: this controls the maximum number of the implementation only! + * The max. number of ports per bridge must still be passed via netif_add parameter! + */ +#ifndef BRIDGEIF_MAX_PORTS +#define BRIDGEIF_MAX_PORTS 7 +#endif + +/** BRIDGEIF_DEBUG: Enable generic debugging in bridgeif.c. */ +#ifndef BRIDGEIF_DEBUG +#define BRIDGEIF_DEBUG LWIP_DBG_OFF +#endif + +/** BRIDGEIF_DEBUG: Enable FDB debugging in bridgeif.c. */ +#ifndef BRIDGEIF_FDB_DEBUG +#define BRIDGEIF_FDB_DEBUG LWIP_DBG_OFF +#endif + +/** BRIDGEIF_DEBUG: Enable forwarding debugging in bridgeif.c. */ +#ifndef BRIDGEIF_FW_DEBUG +#define BRIDGEIF_FW_DEBUG LWIP_DBG_OFF +#endif + +/** + * @} + */ + +#endif /* LWIP_HDR_NETIF_BRIDGEIF_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/etharp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/etharp.h new file mode 100644 index 0000000..b536fd2 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/etharp.h @@ -0,0 +1,3 @@ +/* ARP has been moved to core/ipv4, provide this #include for compatibility only */ +#include "lwip/etharp.h" +#include "netif/ethernet.h" diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ethernet.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ethernet.h new file mode 100644 index 0000000..49649cb --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ethernet.h @@ -0,0 +1,77 @@ +/** + * @file + * Ethernet input function - handles INCOMING ethernet level traffic + * To be used in most low-level netif implementations + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (c) 2003-2004 Leon Woestenberg + * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef LWIP_HDR_NETIF_ETHERNET_H +#define LWIP_HDR_NETIF_ETHERNET_H + +#include "lwip/opt.h" + +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/prot/ethernet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_ARP || LWIP_ETHERNET + +/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) + * to a filter function that returns the correct netif when using multiple + * netifs on one hardware interface where the netif's low-level receive + * routine cannot decide for the correct netif (e.g. when mapping multiple + * IP addresses to one hardware interface). + */ +#ifndef LWIP_ARP_FILTER_NETIF +#define LWIP_ARP_FILTER_NETIF 0 +#endif + +err_t ethernet_input(struct pbuf *p, struct netif *netif); +err_t ethernet_output(struct netif* netif, struct pbuf* p, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type); + +extern const struct eth_addr ethbroadcast, ethzero; + +#endif /* LWIP_ARP || LWIP_ETHERNET */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_ETHERNET_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ieee802154.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ieee802154.h new file mode 100644 index 0000000..54e019f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ieee802154.h @@ -0,0 +1,112 @@ +/** + * @file + * Definitions for IEEE 802.15.4 MAC frames + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef LWIP_HDR_NETIF_IEEE802154_H +#define LWIP_HDR_NETIF_IEEE802154_H + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** General MAC frame format + * This shows the full featured header, mainly for documentation. + * Some fields are omitted or shortened to achieve frame compression. + */ +struct ieee_802154_hdr { + /** See IEEE_802154_FC_* defines */ + PACK_STRUCT_FIELD(u16_t frame_control); + /** Sequence number is omitted if IEEE_802154_FC_SEQNO_SUPPR is set in frame_control */ + PACK_STRUCT_FLD_8(u8_t sequence_number); + /** Destination PAN ID is omitted if Destination Addressing Mode is 0 */ + PACK_STRUCT_FIELD(u16_t destination_pan_id); + /** Destination Address is omitted if Destination Addressing Mode is 0 */ + PACK_STRUCT_FLD_8(u8_t destination_address[8]); + /** Source PAN ID is omitted if Source Addressing Mode is 0 + or if IEEE_802154_FC_PANID_COMPR is set in frame control*/ + PACK_STRUCT_FIELD(u16_t source_pan_id); + /** Source Address is omitted if Source Addressing Mode is 0 */ + PACK_STRUCT_FLD_8(u8_t source_address[8]); + /* The rest is variable */ +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* Addressing modes (2 bits) */ +#define IEEE_802154_ADDR_MODE_NO_ADDR 0x00 /* PAN ID and address fields are not present */ +#define IEEE_802154_ADDR_MODE_RESERVED 0x01 /* Reserved */ +#define IEEE_802154_ADDR_MODE_SHORT 0x02 /* Address field contains a short address (16 bit) */ +#define IEEE_802154_ADDR_MODE_EXT 0x03 /* Address field contains an extended address (64 bit) */ + +/* IEEE 802.15.4 Frame Control definitions (2 bytes; see IEEE 802.15.4-2015 ch. 7.2.1) */ +#define IEEE_802154_FC_FT_MASK 0x0007 /* bits 0..2: Frame Type */ +#define IEEE_802154_FC_FT_BEACON 0x00 +#define IEEE_802154_FC_FT_DATA 0x01 +#define IEEE_802154_FC_FT_ACK 0x02 +#define IEEE_802154_FC_FT_MAC_CMD 0x03 +#define IEEE_802154_FC_FT_RESERVED 0x04 +#define IEEE_802154_FC_FT_MULTIPURPOSE 0x05 +#define IEEE_802154_FC_FT_FRAG 0x06 +#define IEEE_802154_FC_FT_EXT 0x07 +#define IEEE_802154_FC_SEC_EN 0x0008 /* bit 3: Security Enabled */ +#define IEEE_802154_FC_FRAME_PEND 0x0010 /* bit 4: Frame Pending */ +#define IEEE_802154_FC_ACK_REQ 0x0020 /* bit 5: AR (ACK required) */ +#define IEEE_802154_FC_PANID_COMPR 0x0040 /* bit 6: PAN ID Compression (src and dst are equal, src PAN ID omitted) */ +#define IEEE_802154_FC_RESERVED 0x0080 +#define IEEE_802154_FC_SEQNO_SUPPR 0x0100 /* bit 8: Sequence Number Suppression */ +#define IEEE_802154_FC_IE_PRESENT 0x0200 /* bit 9: IE Present */ +#define IEEE_802154_FC_DST_ADDR_MODE_MASK 0x0c00 /* bits 10..11: Destination Addressing Mode */ +#define IEEE_802154_FC_DST_ADDR_MODE_NO_ADDR (IEEE_802154_ADDR_MODE_NO_ADDR << 10) +#define IEEE_802154_FC_DST_ADDR_MODE_SHORT (IEEE_802154_ADDR_MODE_SHORT << 10) +#define IEEE_802154_FC_DST_ADDR_MODE_EXT (IEEE_802154_ADDR_MODE_EXT << 10) +#define IEEE_802154_FC_FRAME_VERSION_MASK 0x3000 /* bits 12..13: Frame Version */ +#define IEEE_802154_FC_FRAME_VERSION_GET(x) (((x) & IEEE_802154_FC_FRAME_VERSION_MASK) >> 12) +#define IEEE_802154_FC_SRC_ADDR_MODE_MASK 0xc000 /* bits 14..15: Source Addressing Mode */ +#define IEEE_802154_FC_SRC_ADDR_MODE_SHORT (IEEE_802154_ADDR_MODE_SHORT << 14) +#define IEEE_802154_FC_SRC_ADDR_MODE_EXT (IEEE_802154_ADDR_MODE_EXT << 14) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_IEEE802154_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6.h new file mode 100644 index 0000000..ecff24b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6.h @@ -0,0 +1,89 @@ +/** + * @file + * + * 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_LOWPAN6_H +#define LWIP_HDR_LOWPAN6_H + +#include "netif/lowpan6_opts.h" + +#if LWIP_IPV6 + +#include "netif/lowpan6_common.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** 1 second period for reassembly */ +#define LOWPAN6_TMR_INTERVAL 1000 + +void lowpan6_tmr(void); + +err_t lowpan6_set_context(u8_t idx, const ip6_addr_t * context); +err_t lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low); + +#if LWIP_IPV4 +err_t lowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr); +#endif /* LWIP_IPV4 */ +err_t lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr); +err_t lowpan6_input(struct pbuf * p, struct netif *netif); +err_t lowpan6_if_init(struct netif *netif); + +/* pan_id in network byte order. */ +err_t lowpan6_set_pan_id(u16_t pan_id); + +u16_t lowpan6_calc_crc(const void *buf, u16_t len); + +#if !NO_SYS +err_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp); +#endif /* !NO_SYS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_LOWPAN6_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_ble.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_ble.h new file mode 100644 index 0000000..5190e7b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_ble.h @@ -0,0 +1,78 @@ +/** + * @file + * 6LowPAN over BLE for IPv6 (RFC7668). + */ + +/* + * Copyright (c) 2017 Benjamin Aigner + * Copyright (c) 2015 Inico Technologies Ltd. , Author: Ivan Delamer + * + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * Author: Benjamin Aigner + * + * Based on the original 6lowpan implementation of lwIP ( @see 6lowpan.c) + */ + +#ifndef LWIP_HDR_LOWPAN6_BLE_H +#define LWIP_HDR_LOWPAN6_BLE_H + +#include "netif/lowpan6_opts.h" + +#if LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */ + +#include "netif/lowpan6_common.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +err_t rfc7668_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr); +err_t rfc7668_input(struct pbuf * p, struct netif *netif); +err_t rfc7668_set_local_addr_eui64(struct netif *netif, const u8_t *local_addr, size_t local_addr_len); +err_t rfc7668_set_local_addr_mac48(struct netif *netif, const u8_t *local_addr, size_t local_addr_len, int is_public_addr); +err_t rfc7668_set_peer_addr_eui64(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len); +err_t rfc7668_set_peer_addr_mac48(struct netif *netif, const u8_t *peer_addr, size_t peer_addr_len, int is_public_addr); +err_t rfc7668_set_context(u8_t index, const ip6_addr_t * context); +err_t rfc7668_if_init(struct netif *netif); + +#if !NO_SYS +err_t tcpip_rfc7668_input(struct pbuf *p, struct netif *inp); +#endif + +void ble_addr_to_eui64(uint8_t *dst, const uint8_t *src, int public_addr); +void eui64_to_ble_addr(uint8_t *dst, const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_LOWPAN6_BLE_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_common.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_common.h new file mode 100644 index 0000000..0dc13ab --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_common.h @@ -0,0 +1,82 @@ +/** + * @file + * + * Common 6LowPAN routines for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units. + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_LOWPAN6_COMMON_H +#define LWIP_HDR_LOWPAN6_COMMON_H + +#include "netif/lowpan6_opts.h" + +#if LWIP_IPV6 /* don't build if IPv6 is disabled in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/ip6_addr.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Helper define for a link layer address, which can be encoded as 0, 2 or 8 bytes */ +struct lowpan6_link_addr { + /* encoded length of the address */ + u8_t addr_len; + /* address bytes */ + u8_t addr[8]; +}; + +s8_t lowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct lowpan6_link_addr *mac_addr); + +#if LWIP_6LOWPAN_IPHC +err_t lowpan6_compress_headers(struct netif *netif, u8_t *inbuf, size_t inbuf_size, u8_t *outbuf, size_t outbuf_size, + u8_t *lowpan6_header_len_out, u8_t *hidden_header_len_out, ip6_addr_t *lowpan6_contexts, + const struct lowpan6_link_addr *src, const struct lowpan6_link_addr *dst); +struct pbuf *lowpan6_decompress(struct pbuf *p, u16_t datagram_size, ip6_addr_t *lowpan6_contexts, + struct lowpan6_link_addr *src, struct lowpan6_link_addr *dest); +#endif /* LWIP_6LOWPAN_IPHC */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 */ + +#endif /* LWIP_HDR_LOWPAN6_COMMON_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_opts.h new file mode 100644 index 0000000..32e5c5e --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/lowpan6_opts.h @@ -0,0 +1,122 @@ +/** + * @file + * 6LowPAN options list + */ + +/* + * Copyright (c) 2015 Inico Technologies Ltd. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Ivan Delamer + * + * + * Please coordinate changes and requests with Ivan Delamer + * + */ + +#ifndef LWIP_HDR_LOWPAN6_OPTS_H +#define LWIP_HDR_LOWPAN6_OPTS_H + +#include "lwip/opt.h" + +/** LWIP_6LOWPAN_NUM_CONTEXTS: define the number of compression + * contexts per netif type + */ +#ifndef LWIP_6LOWPAN_NUM_CONTEXTS +#define LWIP_6LOWPAN_NUM_CONTEXTS 10 +#endif + +/** LWIP_6LOWPAN_INFER_SHORT_ADDRESS: set this to 0 to disable creating + * short addresses for matching addresses (debug only) + */ +#ifndef LWIP_6LOWPAN_INFER_SHORT_ADDRESS +#define LWIP_6LOWPAN_INFER_SHORT_ADDRESS 1 +#endif + +/** LWIP_6LOWPAN_IPHC: set this to 0 to disable IP header compression as per + * RFC 6282 (which is mandatory for BLE) + */ +#ifndef LWIP_6LOWPAN_IPHC +#define LWIP_6LOWPAN_IPHC 1 +#endif + +/** Set this to 1 if your IEEE 802.15.4 interface can calculate and check the + * CRC in hardware. This means TX packets get 2 zero bytes added on transmission + * which are to be filled with the CRC. + */ +#ifndef LWIP_6LOWPAN_802154_HW_CRC +#define LWIP_6LOWPAN_802154_HW_CRC 0 +#endif + +/** If LWIP_6LOWPAN_802154_HW_CRC==0, this can override the default slow + * implementation of the CRC used for 6LoWPAN over IEEE 802.15.4 (which uses + * a shift register). + */ +#ifndef LWIP_6LOWPAN_CALC_CRC +#define LWIP_6LOWPAN_CALC_CRC(buf, len) lowpan6_calc_crc(buf, len) +#endif + +/** Debug level for 6LoWPAN in general */ +#ifndef LWIP_LOWPAN6_DEBUG +#define LWIP_LOWPAN6_DEBUG LWIP_DBG_OFF +#endif + +/** Debug level for 6LoWPAN over IEEE 802.15.4 */ +#ifndef LWIP_LOWPAN6_802154_DEBUG +#define LWIP_LOWPAN6_802154_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_LOWPAN6_IP_COMPRESSED_DEBUG: enable compressed IP frame + * output debugging + */ +#ifndef LWIP_LOWPAN6_IP_COMPRESSED_DEBUG +#define LWIP_LOWPAN6_IP_COMPRESSED_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_LOWPAN6_DECOMPRESSION_DEBUG: enable decompression debug output + */ +#ifndef LWIP_LOWPAN6_DECOMPRESSION_DEBUG +#define LWIP_LOWPAN6_DECOMPRESSION_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG: enable decompressed IP frame + * output debugging */ +#ifndef LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG +#define LWIP_RFC7668_IP_UNCOMPRESSED_DEBUG LWIP_DBG_OFF +#endif + +/** LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS: + * Currently, the linux kernel driver for 6lowpan sets/clears a bit in + * the address, depending on the BD address (either public or not). + * Might not be RFC7668 conform, so you may select to do that (=1) or + * not (=0) */ +#ifndef LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS +#define LWIP_RFC7668_LINUX_WORKAROUND_PUBLIC_ADDRESS 1 +#endif + + +#endif /* LWIP_HDR_LOWPAN6_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ccp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ccp.h new file mode 100644 index 0000000..b228522 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ccp.h @@ -0,0 +1,164 @@ +/* + * ccp.h - Definitions for PPP Compression Control Protocol. + * + * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 3. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: ccp.h,v 1.12 2004/11/04 10:02:26 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && CCP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef CCP_H +#define CCP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * CCP codes. + */ + +#define CCP_CONFREQ 1 +#define CCP_CONFACK 2 +#define CCP_TERMREQ 5 +#define CCP_TERMACK 6 +#define CCP_RESETREQ 14 +#define CCP_RESETACK 15 + +/* + * Max # bytes for a CCP option + */ + +#define CCP_MAX_OPTION_LENGTH 32 + +/* + * Parts of a CCP packet. + */ + +#define CCP_CODE(dp) ((dp)[0]) +#define CCP_ID(dp) ((dp)[1]) +#define CCP_LENGTH(dp) (((dp)[2] << 8) + (dp)[3]) +#define CCP_HDRLEN 4 + +#define CCP_OPT_CODE(dp) ((dp)[0]) +#define CCP_OPT_LENGTH(dp) ((dp)[1]) +#define CCP_OPT_MINLEN 2 + +#if BSDCOMPRESS_SUPPORT +/* + * Definitions for BSD-Compress. + */ + +#define CI_BSD_COMPRESS 21 /* config. option for BSD-Compress */ +#define CILEN_BSD_COMPRESS 3 /* length of config. option */ + +/* Macros for handling the 3rd byte of the BSD-Compress config option. */ +#define BSD_NBITS(x) ((x) & 0x1F) /* number of bits requested */ +#define BSD_VERSION(x) ((x) >> 5) /* version of option format */ +#define BSD_CURRENT_VERSION 1 /* current version number */ +#define BSD_MAKE_OPT(v, n) (((v) << 5) | (n)) + +#define BSD_MIN_BITS 9 /* smallest code size supported */ +#define BSD_MAX_BITS 15 /* largest code size supported */ +#endif /* BSDCOMPRESS_SUPPORT */ + +#if DEFLATE_SUPPORT +/* + * Definitions for Deflate. + */ + +#define CI_DEFLATE 26 /* config option for Deflate */ +#define CI_DEFLATE_DRAFT 24 /* value used in original draft RFC */ +#define CILEN_DEFLATE 4 /* length of its config option */ + +#define DEFLATE_MIN_SIZE 9 +#define DEFLATE_MAX_SIZE 15 +#define DEFLATE_METHOD_VAL 8 +#define DEFLATE_SIZE(x) (((x) >> 4) + 8) +#define DEFLATE_METHOD(x) ((x) & 0x0F) +#define DEFLATE_MAKE_OPT(w) ((((w) - 8) << 4) + DEFLATE_METHOD_VAL) +#define DEFLATE_CHK_SEQUENCE 0 +#endif /* DEFLATE_SUPPORT */ + +#if MPPE_SUPPORT +/* + * Definitions for MPPE. + */ + +#define CI_MPPE 18 /* config option for MPPE */ +#define CILEN_MPPE 6 /* length of config option */ +#endif /* MPPE_SUPPORT */ + +#if PREDICTOR_SUPPORT +/* + * Definitions for other, as yet unsupported, compression methods. + */ + +#define CI_PREDICTOR_1 1 /* config option for Predictor-1 */ +#define CILEN_PREDICTOR_1 2 /* length of its config option */ +#define CI_PREDICTOR_2 2 /* config option for Predictor-2 */ +#define CILEN_PREDICTOR_2 2 /* length of its config option */ +#endif /* PREDICTOR_SUPPORT */ + +typedef struct ccp_options { +#if DEFLATE_SUPPORT + unsigned int deflate :1; /* do Deflate? */ + unsigned int deflate_correct :1; /* use correct code for deflate? */ + unsigned int deflate_draft :1; /* use draft RFC code for deflate? */ +#endif /* DEFLATE_SUPPORT */ +#if BSDCOMPRESS_SUPPORT + unsigned int bsd_compress :1; /* do BSD Compress? */ +#endif /* BSDCOMPRESS_SUPPORT */ +#if PREDICTOR_SUPPORT + unsigned int predictor_1 :1; /* do Predictor-1? */ + unsigned int predictor_2 :1; /* do Predictor-2? */ +#endif /* PREDICTOR_SUPPORT */ + +#if MPPE_SUPPORT + u8_t mppe; /* MPPE bitfield */ +#endif /* MPPE_SUPPORT */ +#if BSDCOMPRESS_SUPPORT + u_short bsd_bits; /* # bits/code for BSD Compress */ +#endif /* BSDCOMPRESS_SUPPORT */ +#if DEFLATE_SUPPORT + u_short deflate_size; /* lg(window size) for Deflate */ +#endif /* DEFLATE_SUPPORT */ + u8_t method; /* code for chosen compression method */ +} ccp_options; + +extern const struct protent ccp_protent; + +void ccp_resetrequest(ppp_pcb *pcb); /* Issue a reset-request. */ + +#ifdef __cplusplus +} +#endif + +#endif /* CCP_H */ +#endif /* PPP_SUPPORT && CCP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-md5.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-md5.h new file mode 100644 index 0000000..eb0269f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-md5.h @@ -0,0 +1,36 @@ +/* + * chap-md5.h - New CHAP/MD5 implementation. + * + * Copyright (c) 2003 Paul Mackerras. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 3. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +extern const struct chap_digest_type md5_digest; + +#endif /* PPP_SUPPORT && CHAP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-new.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-new.h new file mode 100644 index 0000000..2d8cd9c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap-new.h @@ -0,0 +1,200 @@ +/* + * chap-new.c - New CHAP implementation. + * + * Copyright (c) 2003 Paul Mackerras. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 3. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef CHAP_H +#define CHAP_H + +#include "ppp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * CHAP packets begin with a standard header with code, id, len (2 bytes). + */ +#define CHAP_HDRLEN 4 + +/* + * Values for the code field. + */ +#define CHAP_CHALLENGE 1 +#define CHAP_RESPONSE 2 +#define CHAP_SUCCESS 3 +#define CHAP_FAILURE 4 + +/* + * CHAP digest codes. + */ +#define CHAP_MD5 5 +#if MSCHAP_SUPPORT +#define CHAP_MICROSOFT 0x80 +#define CHAP_MICROSOFT_V2 0x81 +#endif /* MSCHAP_SUPPORT */ + +/* + * Semi-arbitrary limits on challenge and response fields. + */ +#define MAX_CHALLENGE_LEN 64 +#define MAX_RESPONSE_LEN 64 + +/* + * These limits apply to challenge and response packets we send. + * The +4 is the +1 that we actually need rounded up. + */ +#define CHAL_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN) +#define RESP_MAX_PKTLEN (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN) + +/* bitmask of supported algorithms */ +#if MSCHAP_SUPPORT +#define MDTYPE_MICROSOFT_V2 0x1 +#define MDTYPE_MICROSOFT 0x2 +#endif /* MSCHAP_SUPPORT */ +#define MDTYPE_MD5 0x4 +#define MDTYPE_NONE 0 + +#if MSCHAP_SUPPORT +/* Return the digest alg. ID for the most preferred digest type. */ +#define CHAP_DIGEST(mdtype) \ + ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \ + ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \ + ((mdtype) & MDTYPE_MICROSOFT)? CHAP_MICROSOFT: \ + 0 +#else /* !MSCHAP_SUPPORT */ +#define CHAP_DIGEST(mdtype) \ + ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \ + 0 +#endif /* MSCHAP_SUPPORT */ + +/* Return the bit flag (lsb set) for our most preferred digest type. */ +#define CHAP_MDTYPE(mdtype) ((mdtype) ^ ((mdtype) - 1)) & (mdtype) + +/* Return the bit flag for a given digest algorithm ID. */ +#if MSCHAP_SUPPORT +#define CHAP_MDTYPE_D(digest) \ + ((digest) == CHAP_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \ + ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \ + ((digest) == CHAP_MD5)? MDTYPE_MD5: \ + 0 +#else /* !MSCHAP_SUPPORT */ +#define CHAP_MDTYPE_D(digest) \ + ((digest) == CHAP_MD5)? MDTYPE_MD5: \ + 0 +#endif /* MSCHAP_SUPPORT */ + +/* Can we do the requested digest? */ +#if MSCHAP_SUPPORT +#define CHAP_CANDIGEST(mdtype, digest) \ + ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \ + ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \ + ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \ + 0 +#else /* !MSCHAP_SUPPORT */ +#define CHAP_CANDIGEST(mdtype, digest) \ + ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \ + 0 +#endif /* MSCHAP_SUPPORT */ + +/* + * The code for each digest type has to supply one of these. + */ +struct chap_digest_type { + int code; + +#if PPP_SERVER + /* + * Note: challenge and response arguments below are formatted as + * a length byte followed by the actual challenge/response data. + */ + void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge); + int (*verify_response)(ppp_pcb *pcb, int id, const char *name, + const unsigned char *secret, int secret_len, + const unsigned char *challenge, const unsigned char *response, + char *message, int message_space); +#endif /* PPP_SERVER */ + void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name, + const unsigned char *challenge, const char *secret, int secret_len, + unsigned char *priv); + int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv); + void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len); +}; + +/* + * Each interface is described by chap structure. + */ +#if CHAP_SUPPORT +typedef struct chap_client_state { + u8_t flags; + const char *name; + const struct chap_digest_type *digest; + unsigned char priv[64]; /* private area for digest's use */ +} chap_client_state; + +#if PPP_SERVER +typedef struct chap_server_state { + u8_t flags; + u8_t id; + const char *name; + const struct chap_digest_type *digest; + int challenge_xmits; + int challenge_pktlen; + unsigned char challenge[CHAL_MAX_PKTLEN]; +} chap_server_state; +#endif /* PPP_SERVER */ +#endif /* CHAP_SUPPORT */ + +#if 0 /* UNUSED */ +/* Hook for a plugin to validate CHAP challenge */ +extern int (*chap_verify_hook)(char *name, char *ourname, int id, + const struct chap_digest_type *digest, + unsigned char *challenge, unsigned char *response, + char *message, int message_space); +#endif /* UNUSED */ + +#if PPP_SERVER +/* Called by authentication code to start authenticating the peer. */ +extern void chap_auth_peer(ppp_pcb *pcb, const char *our_name, int digest_code); +#endif /* PPP_SERVER */ + +/* Called by auth. code to start authenticating us to the peer. */ +extern void chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_code); + +/* Represents the CHAP protocol to the main pppd code */ +extern const struct protent chap_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* CHAP_H */ +#endif /* PPP_SUPPORT && CHAP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap_ms.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap_ms.h new file mode 100644 index 0000000..0795291 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/chap_ms.h @@ -0,0 +1,44 @@ +/* + * chap_ms.h - Challenge Handshake Authentication Protocol definitions. + * + * Copyright (c) 1995 Eric Rosenquist. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: chap_ms.h,v 1.13 2004/11/15 22:13:26 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && MSCHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef CHAPMS_INCLUDE +#define CHAPMS_INCLUDE + +extern const struct chap_digest_type chapms_digest; +extern const struct chap_digest_type chapms2_digest; + +#endif /* CHAPMS_INCLUDE */ + +#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eap.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eap.h new file mode 100644 index 0000000..3ee9aaf --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eap.h @@ -0,0 +1,169 @@ +/* + * eap.h - Extensible Authentication Protocol for PPP (RFC 2284) + * + * Copyright (c) 2001 by Sun Microsystems, Inc. + * All rights reserved. + * + * Non-exclusive rights to redistribute, modify, translate, and use + * this software in source and binary forms, in whole or in part, is + * hereby granted, provided that the above copyright notice is + * duplicated in any source form, and that neither the name of the + * copyright holder nor the author is used to endorse or promote + * products derived from this software. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Original version by James Carlson + * + * $Id: eap.h,v 1.2 2003/06/11 23:56:26 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && EAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef PPP_EAP_H +#define PPP_EAP_H + +#include "ppp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Packet header = Code, id, length. + */ +#define EAP_HEADERLEN 4 + + +/* EAP message codes. */ +#define EAP_REQUEST 1 +#define EAP_RESPONSE 2 +#define EAP_SUCCESS 3 +#define EAP_FAILURE 4 + +/* EAP types */ +#define EAPT_IDENTITY 1 +#define EAPT_NOTIFICATION 2 +#define EAPT_NAK 3 /* (response only) */ +#define EAPT_MD5CHAP 4 +#define EAPT_OTP 5 /* One-Time Password; RFC 1938 */ +#define EAPT_TOKEN 6 /* Generic Token Card */ +/* 7 and 8 are unassigned. */ +#define EAPT_RSA 9 /* RSA Public Key Authentication */ +#define EAPT_DSS 10 /* DSS Unilateral */ +#define EAPT_KEA 11 /* KEA */ +#define EAPT_KEA_VALIDATE 12 /* KEA-VALIDATE */ +#define EAPT_TLS 13 /* EAP-TLS */ +#define EAPT_DEFENDER 14 /* Defender Token (AXENT) */ +#define EAPT_W2K 15 /* Windows 2000 EAP */ +#define EAPT_ARCOT 16 /* Arcot Systems */ +#define EAPT_CISCOWIRELESS 17 /* Cisco Wireless */ +#define EAPT_NOKIACARD 18 /* Nokia IP smart card */ +#define EAPT_SRP 19 /* Secure Remote Password */ +/* 20 is deprecated */ + +/* EAP SRP-SHA1 Subtypes */ +#define EAPSRP_CHALLENGE 1 /* Request 1 - Challenge */ +#define EAPSRP_CKEY 1 /* Response 1 - Client Key */ +#define EAPSRP_SKEY 2 /* Request 2 - Server Key */ +#define EAPSRP_CVALIDATOR 2 /* Response 2 - Client Validator */ +#define EAPSRP_SVALIDATOR 3 /* Request 3 - Server Validator */ +#define EAPSRP_ACK 3 /* Response 3 - final ack */ +#define EAPSRP_LWRECHALLENGE 4 /* Req/resp 4 - Lightweight rechal */ + +#define SRPVAL_EBIT 0x00000001 /* Use shared key for ECP */ + +#define SRP_PSEUDO_ID "pseudo_" +#define SRP_PSEUDO_LEN 7 + +#define MD5_SIGNATURE_SIZE 16 +#define EAP_MIN_CHALLENGE_LENGTH 17 +#define EAP_MAX_CHALLENGE_LENGTH 24 +#define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH 3 /* 2^3-1 = 7, 17+7 = 24 */ + +#define EAP_STATES \ + "Initial", "Pending", "Closed", "Listen", "Identify", \ + "SRP1", "SRP2", "SRP3", "MD5Chall", "Open", "SRP4", "BadAuth" + +#define eap_client_active(pcb) ((pcb)->eap.es_client.ea_state == eapListen) +#if PPP_SERVER +#define eap_server_active(pcb) \ + ((pcb)->eap.es_server.ea_state >= eapIdentify && \ + (pcb)->eap.es_server.ea_state <= eapMD5Chall) +#endif /* PPP_SERVER */ + +/* + * Complete EAP state for one PPP session. + */ +enum eap_state_code { + eapInitial = 0, /* No EAP authentication yet requested */ + eapPending, /* Waiting for LCP (no timer) */ + eapClosed, /* Authentication not in use */ + eapListen, /* Client ready (and timer running) */ + eapIdentify, /* EAP Identify sent */ + eapSRP1, /* Sent EAP SRP-SHA1 Subtype 1 */ + eapSRP2, /* Sent EAP SRP-SHA1 Subtype 2 */ + eapSRP3, /* Sent EAP SRP-SHA1 Subtype 3 */ + eapMD5Chall, /* Sent MD5-Challenge */ + eapOpen, /* Completed authentication */ + eapSRP4, /* Sent EAP SRP-SHA1 Subtype 4 */ + eapBadAuth /* Failed authentication */ +}; + +struct eap_auth { + const char *ea_name; /* Our name */ + char ea_peer[MAXNAMELEN +1]; /* Peer's name */ + void *ea_session; /* Authentication library linkage */ + u_char *ea_skey; /* Shared encryption key */ + u_short ea_namelen; /* Length of our name */ + u_short ea_peerlen; /* Length of peer's name */ + enum eap_state_code ea_state; + u_char ea_id; /* Current id */ + u_char ea_requests; /* Number of Requests sent/received */ + u_char ea_responses; /* Number of Responses */ + u_char ea_type; /* One of EAPT_* */ + u32_t ea_keyflags; /* SRP shared key usage flags */ +}; + +#ifndef EAP_MAX_CHALLENGE_LENGTH +#define EAP_MAX_CHALLENGE_LENGTH 24 +#endif +typedef struct eap_state { + struct eap_auth es_client; /* Client (authenticatee) data */ +#if PPP_SERVER + struct eap_auth es_server; /* Server (authenticator) data */ +#endif /* PPP_SERVER */ + int es_savedtime; /* Saved timeout */ + int es_rechallenge; /* EAP rechallenge interval */ + int es_lwrechallenge; /* SRP lightweight rechallenge inter */ + u8_t es_usepseudo; /* Use SRP Pseudonym if offered one */ + int es_usedpseudo; /* Set if we already sent PN */ + int es_challen; /* Length of challenge string */ + u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH]; +} eap_state; + +/* + * Timeouts. + */ +#if 0 /* moved to ppp_opts.h */ +#define EAP_DEFTIMEOUT 3 /* Timeout (seconds) for rexmit */ +#define EAP_DEFTRANSMITS 10 /* max # times to transmit */ +#define EAP_DEFREQTIME 20 /* Time to wait for peer request */ +#define EAP_DEFALLOWREQ 20 /* max # times to accept requests */ +#endif /* moved to ppp_opts.h */ + +void eap_authwithpeer(ppp_pcb *pcb, const char *localname); +void eap_authpeer(ppp_pcb *pcb, const char *localname); + +extern const struct protent eap_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* PPP_EAP_H */ + +#endif /* PPP_SUPPORT && EAP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ecp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ecp.h new file mode 100644 index 0000000..d8808c3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ecp.h @@ -0,0 +1,62 @@ +/* + * ecp.h - Definitions for PPP Encryption Control Protocol. + * + * Copyright (c) 2002 Google, Inc. + * All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: ecp.h,v 1.2 2003/01/10 07:12:36 fcusack Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && ECP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef ECP_H +#define ECP_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ecp_options { + bool required; /* Is ECP required? */ + unsigned enctype; /* Encryption type */ +} ecp_options; + +extern fsm ecp_fsm[]; +extern ecp_options ecp_wantoptions[]; +extern ecp_options ecp_gotoptions[]; +extern ecp_options ecp_allowoptions[]; +extern ecp_options ecp_hisoptions[]; + +extern const struct protent ecp_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* ECP_H */ +#endif /* PPP_SUPPORT && ECP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eui64.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eui64.h new file mode 100644 index 0000000..5adeb48 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/eui64.h @@ -0,0 +1,102 @@ +/* + * eui64.h - EUI64 routines for IPv6CP. + * + * Copyright (c) 1999 Tommi Komulainen. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Tommi Komulainen + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: eui64.h,v 1.6 2002/12/04 23:03:32 paulus Exp $ +*/ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PPP_IPV6_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef EUI64_H +#define EUI64_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * @todo: + * + * Maybe this should be done by processing struct in6_addr directly... + */ +typedef union +{ + u8_t e8[8]; + u16_t e16[4]; + u32_t e32[2]; +} eui64_t; + +#define eui64_iszero(e) (((e).e32[0] | (e).e32[1]) == 0) +#define eui64_equals(e, o) (((e).e32[0] == (o).e32[0]) && \ + ((e).e32[1] == (o).e32[1])) +#define eui64_zero(e) (e).e32[0] = (e).e32[1] = 0; + +#define eui64_copy(s, d) memcpy(&(d), &(s), sizeof(eui64_t)) + +#define eui64_magic(e) do { \ + (e).e32[0] = magic(); \ + (e).e32[1] = magic(); \ + (e).e8[0] &= ~2; \ + } while (0) +#define eui64_magic_nz(x) do { \ + eui64_magic(x); \ + } while (eui64_iszero(x)) +#define eui64_magic_ne(x, y) do { \ + eui64_magic(x); \ + } while (eui64_equals(x, y)) + +#define eui64_get(ll, cp) do { \ + eui64_copy((*cp), (ll)); \ + (cp) += sizeof(eui64_t); \ + } while (0) + +#define eui64_put(ll, cp) do { \ + eui64_copy((ll), (*cp)); \ + (cp) += sizeof(eui64_t); \ + } while (0) + +#define eui64_set32(e, l) do { \ + (e).e32[0] = 0; \ + (e).e32[1] = lwip_htonl(l); \ + } while (0) +#define eui64_setlo32(e, l) eui64_set32(e, l) + +char *eui64_ntoa(eui64_t); /* Returns ascii representation of id */ + +#ifdef __cplusplus +} +#endif + +#endif /* EUI64_H */ +#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/fsm.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/fsm.h new file mode 100644 index 0000000..8dec700 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/fsm.h @@ -0,0 +1,182 @@ +/* + * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions. + * + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. + * + * 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. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: fsm.h,v 1.10 2004/11/13 02:28:15 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef FSM_H +#define FSM_H + +#include "ppp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Packet header = Code, id, length. + */ +#define HEADERLEN 4 + + +/* + * CP (LCP, IPCP, etc.) codes. + */ +#define CONFREQ 1 /* Configuration Request */ +#define CONFACK 2 /* Configuration Ack */ +#define CONFNAK 3 /* Configuration Nak */ +#define CONFREJ 4 /* Configuration Reject */ +#define TERMREQ 5 /* Termination Request */ +#define TERMACK 6 /* Termination Ack */ +#define CODEREJ 7 /* Code Reject */ + + +/* + * Each FSM is described by an fsm structure and fsm callbacks. + */ +typedef struct fsm { + ppp_pcb *pcb; /* PPP Interface */ + const struct fsm_callbacks *callbacks; /* Callback routines */ + const char *term_reason; /* Reason for closing protocol */ + u8_t seen_ack; /* Have received valid Ack/Nak/Rej to Req */ + /* -- This is our only flag, we might use u_int :1 if we have more flags */ + u16_t protocol; /* Data Link Layer Protocol field value */ + u8_t state; /* State */ + u8_t flags; /* Contains option bits */ + u8_t id; /* Current id */ + u8_t reqid; /* Current request id */ + u8_t retransmits; /* Number of retransmissions left */ + u8_t nakloops; /* Number of nak loops since last ack */ + u8_t rnakloops; /* Number of naks received */ + u8_t maxnakloops; /* Maximum number of nak loops tolerated + (necessary because IPCP require a custom large max nak loops value) */ + u8_t term_reason_len; /* Length of term_reason */ +} fsm; + + +typedef struct fsm_callbacks { + void (*resetci) /* Reset our Configuration Information */ + (fsm *); + int (*cilen) /* Length of our Configuration Information */ + (fsm *); + void (*addci) /* Add our Configuration Information */ + (fsm *, u_char *, int *); + int (*ackci) /* ACK our Configuration Information */ + (fsm *, u_char *, int); + int (*nakci) /* NAK our Configuration Information */ + (fsm *, u_char *, int, int); + int (*rejci) /* Reject our Configuration Information */ + (fsm *, u_char *, int); + int (*reqci) /* Request peer's Configuration Information */ + (fsm *, u_char *, int *, int); + void (*up) /* Called when fsm reaches PPP_FSM_OPENED state */ + (fsm *); + void (*down) /* Called when fsm leaves PPP_FSM_OPENED state */ + (fsm *); + void (*starting) /* Called when we want the lower layer */ + (fsm *); + void (*finished) /* Called when we don't want the lower layer */ + (fsm *); + void (*protreject) /* Called when Protocol-Reject received */ + (int); + void (*retransmit) /* Retransmission is necessary */ + (fsm *); + int (*extcode) /* Called when unknown code received */ + (fsm *, int, int, u_char *, int); + const char *proto_name; /* String name for protocol (for messages) */ +} fsm_callbacks; + + +/* + * Link states. + */ +#define PPP_FSM_INITIAL 0 /* Down, hasn't been opened */ +#define PPP_FSM_STARTING 1 /* Down, been opened */ +#define PPP_FSM_CLOSED 2 /* Up, hasn't been opened */ +#define PPP_FSM_STOPPED 3 /* Open, waiting for down event */ +#define PPP_FSM_CLOSING 4 /* Terminating the connection, not open */ +#define PPP_FSM_STOPPING 5 /* Terminating, but open */ +#define PPP_FSM_REQSENT 6 /* We've sent a Config Request */ +#define PPP_FSM_ACKRCVD 7 /* We've received a Config Ack */ +#define PPP_FSM_ACKSENT 8 /* We've sent a Config Ack */ +#define PPP_FSM_OPENED 9 /* Connection available */ + + +/* + * Flags - indicate options controlling FSM operation + */ +#define OPT_PASSIVE 1 /* Don't die if we don't get a response */ +#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ +#define OPT_SILENT 4 /* Wait for peer to speak first */ + + +/* + * Timeouts. + */ +#if 0 /* moved to ppp_opts.h */ +#define DEFTIMEOUT 3 /* Timeout time in seconds */ +#define DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ +#define DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ +#define DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ +#endif /* moved to ppp_opts.h */ + + +/* + * Prototypes + */ +void fsm_init(fsm *f); +void fsm_lowerup(fsm *f); +void fsm_lowerdown(fsm *f); +void fsm_open(fsm *f); +void fsm_close(fsm *f, const char *reason); +void fsm_input(fsm *f, u_char *inpacket, int l); +void fsm_protreject(fsm *f); +void fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen); + +#ifdef __cplusplus +} +#endif + +#endif /* FSM_H */ +#endif /* PPP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipcp.h new file mode 100644 index 0000000..5590dec --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipcp.h @@ -0,0 +1,134 @@ +/* + * ipcp.h - IP Control Protocol definitions. + * + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. + * + * 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. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: ipcp.h,v 1.14 2002/12/04 23:03:32 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef IPCP_H +#define IPCP_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Options. + */ +#define CI_ADDRS 1 /* IP Addresses */ +#if VJ_SUPPORT +#define CI_COMPRESSTYPE 2 /* Compression Type */ +#endif /* VJ_SUPPORT */ +#define CI_ADDR 3 + +#if LWIP_DNS +#define CI_MS_DNS1 129 /* Primary DNS value */ +#define CI_MS_DNS2 131 /* Secondary DNS value */ +#endif /* LWIP_DNS */ +#if 0 /* UNUSED - WINS */ +#define CI_MS_WINS1 130 /* Primary WINS value */ +#define CI_MS_WINS2 132 /* Secondary WINS value */ +#endif /* UNUSED - WINS */ + +#if VJ_SUPPORT +#define MAX_STATES 16 /* from slcompress.h */ + +#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */ +#define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */ +#define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */ + /* maxslot and slot number compression) */ + +#define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/ +#define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */ + /* compression option*/ +#endif /* VJ_SUPPORT */ + +typedef struct ipcp_options { + unsigned int neg_addr :1; /* Negotiate IP Address? */ + unsigned int old_addrs :1; /* Use old (IP-Addresses) option? */ + unsigned int req_addr :1; /* Ask peer to send IP address? */ +#if 0 /* UNUSED */ + unsigned int default_route :1; /* Assign default route through interface? */ + unsigned int replace_default_route :1; /* Replace default route through interface? */ +#endif /* UNUSED */ +#if 0 /* UNUSED - PROXY ARP */ + unsigned int proxy_arp :1; /* Make proxy ARP entry for peer? */ +#endif /* UNUSED - PROXY ARP */ +#if VJ_SUPPORT + unsigned int neg_vj :1; /* Van Jacobson Compression? */ + unsigned int old_vj :1; /* use old (short) form of VJ option? */ + unsigned int cflag :1; +#endif /* VJ_SUPPORT */ + unsigned int accept_local :1; /* accept peer's value for ouraddr */ + unsigned int accept_remote :1; /* accept peer's value for hisaddr */ +#if LWIP_DNS + unsigned int req_dns1 :1; /* Ask peer to send primary DNS address? */ + unsigned int req_dns2 :1; /* Ask peer to send secondary DNS address? */ +#endif /* LWIP_DNS */ + + u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */ +#if LWIP_DNS + u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */ +#endif /* LWIP_DNS */ +#if 0 /* UNUSED - WINS */ + u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */ +#endif /* UNUSED - WINS */ + +#if VJ_SUPPORT + u16_t vj_protocol; /* protocol value to use in VJ option */ + u8_t maxslotindex; /* values for RFC1332 VJ compression neg. */ +#endif /* VJ_SUPPORT */ +} ipcp_options; + +#if 0 /* UNUSED, already defined by lwIP */ +char *ip_ntoa (u32_t); +#endif /* UNUSED, already defined by lwIP */ + +extern const struct protent ipcp_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* IPCP_H */ +#endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipv6cp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipv6cp.h new file mode 100644 index 0000000..e668c74 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ipv6cp.h @@ -0,0 +1,191 @@ +/* + * ipv6cp.h - PPP IPV6 Control Protocol. + * + * Copyright (c) 1999 Tommi Komulainen. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Tommi Komulainen + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +/* Original version, based on RFC2023 : + + Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt, + Alain.Durand@imag.fr, IMAG, + Jean-Luc.Richier@imag.fr, IMAG-LSR. + + Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE, + Alain.Durand@imag.fr, IMAG, + Jean-Luc.Richier@imag.fr, IMAG-LSR. + + Ce travail a été fait au sein du GIE DYADE (Groupement d'Intérêt + Économique ayant pour membres BULL S.A. et l'INRIA). + + Ce logiciel informatique est disponible aux conditions + usuelles dans la recherche, c'est-à-dire qu'il peut + être utilisé, copié, modifié, distribué à l'unique + condition que ce texte soit conservé afin que + l'origine de ce logiciel soit reconnue. + + Le nom de l'Institut National de Recherche en Informatique + et en Automatique (INRIA), de l'IMAG, ou d'une personne morale + ou physique ayant participé à l'élaboration de ce logiciel ne peut + être utilisé sans son accord préalable explicite. + + Ce logiciel est fourni tel quel sans aucune garantie, + support ou responsabilité d'aucune sorte. + Ce logiciel est dérivé de sources d'origine + "University of California at Berkeley" et + "Digital Equipment Corporation" couvertes par des copyrights. + + L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG) + est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National + Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant + sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR). + + This work has been done in the context of GIE DYADE (joint R & D venture + between BULL S.A. and INRIA). + + This software is available with usual "research" terms + with the aim of retain credits of the software. + Permission to use, copy, modify and distribute this software for any + purpose and without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies, + and the name of INRIA, IMAG, or any contributor not be used in advertising + or publicity pertaining to this material without the prior explicit + permission. The software is provided "as is" without any + warranties, support or liabilities of any kind. + This software is derived from source code from + "University of California at Berkeley" and + "Digital Equipment Corporation" protected by copyrights. + + Grenoble's Institute of Computer Science and Applied Mathematics (IMAG) + is a federation of seven research units funded by the CNRS, National + Polytechnic Institute of Grenoble and University Joseph Fourier. + The research unit in Software, Systems, Networks (LSR) is member of IMAG. +*/ + +/* + * Derived from : + * + * + * ipcp.h - IP Control Protocol definitions. + * + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. + * + * 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. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: ipv6cp.h,v 1.7 2002/12/04 23:03:32 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PPP_IPV6_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef IPV6CP_H +#define IPV6CP_H + +#include "eui64.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Options. + */ +#define CI_IFACEID 1 /* Interface Identifier */ +#ifdef IPV6CP_COMP +#define CI_COMPRESSTYPE 2 /* Compression Type */ +#endif /* IPV6CP_COMP */ + +/* No compression types yet defined. + *#define IPV6CP_COMP 0x004f + */ +typedef struct ipv6cp_options { + unsigned int neg_ifaceid :1; /* Negotiate interface identifier? */ + unsigned int req_ifaceid :1; /* Ask peer to send interface identifier? */ + unsigned int accept_local :1; /* accept peer's value for iface id? */ + unsigned int opt_local :1; /* ourtoken set by option */ + unsigned int opt_remote :1; /* histoken set by option */ + unsigned int use_ip :1; /* use IP as interface identifier */ +#if 0 + unsigned int use_persistent :1; /* use uniquely persistent value for address */ +#endif +#ifdef IPV6CP_COMP + unsigned int neg_vj :1; /* Van Jacobson Compression? */ +#endif /* IPV6CP_COMP */ + +#ifdef IPV6CP_COMP + u_short vj_protocol; /* protocol value to use in VJ option */ +#endif /* IPV6CP_COMP */ + eui64_t ourid, hisid; /* Interface identifiers */ +} ipv6cp_options; + +extern const struct protent ipv6cp_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* IPV6CP_H */ +#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/lcp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/lcp.h new file mode 100644 index 0000000..18ad1cb --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/lcp.h @@ -0,0 +1,179 @@ +/* + * lcp.h - Link Control Protocol definitions. + * + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. + * + * 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. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: lcp.h,v 1.20 2004/11/14 22:53:42 carlsonj Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef LCP_H +#define LCP_H + +#include "ppp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Options. + */ +#define CI_VENDOR 0 /* Vendor Specific */ +#define CI_MRU 1 /* Maximum Receive Unit */ +#define CI_ASYNCMAP 2 /* Async Control Character Map */ +#define CI_AUTHTYPE 3 /* Authentication Type */ +#define CI_QUALITY 4 /* Quality Protocol */ +#define CI_MAGICNUMBER 5 /* Magic Number */ +#define CI_PCOMPRESSION 7 /* Protocol Field Compression */ +#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ +#define CI_FCSALTERN 9 /* FCS-Alternatives */ +#define CI_SDP 10 /* Self-Describing-Pad */ +#define CI_NUMBERED 11 /* Numbered-Mode */ +#define CI_CALLBACK 13 /* callback */ +#define CI_MRRU 17 /* max reconstructed receive unit; multilink */ +#define CI_SSNHF 18 /* short sequence numbers for multilink */ +#define CI_EPDISC 19 /* endpoint discriminator */ +#define CI_MPPLUS 22 /* Multi-Link-Plus-Procedure */ +#define CI_LDISC 23 /* Link-Discriminator */ +#define CI_LCPAUTH 24 /* LCP Authentication */ +#define CI_COBS 25 /* Consistent Overhead Byte Stuffing */ +#define CI_PREFELIS 26 /* Prefix Elision */ +#define CI_MPHDRFMT 27 /* MP Header Format */ +#define CI_I18N 28 /* Internationalization */ +#define CI_SDL 29 /* Simple Data Link */ + +/* + * LCP-specific packet types (code numbers). + */ +#define PROTREJ 8 /* Protocol Reject */ +#define ECHOREQ 9 /* Echo Request */ +#define ECHOREP 10 /* Echo Reply */ +#define DISCREQ 11 /* Discard Request */ +#define IDENTIF 12 /* Identification */ +#define TIMEREM 13 /* Time Remaining */ + +/* Value used as data for CI_CALLBACK option */ +#define CBCP_OPT 6 /* Use callback control protocol */ + +#if 0 /* moved to ppp_opts.h */ +#define DEFMRU 1500 /* Try for this */ +#define MINMRU 128 /* No MRUs below this */ +#define MAXMRU 16384 /* Normally limit MRU to this */ +#endif /* moved to ppp_opts.h */ + +/* An endpoint discriminator, used with multilink. */ +#define MAX_ENDP_LEN 20 /* maximum length of discriminator value */ +struct epdisc { + unsigned char class_; /* -- The word "class" is reserved in C++. */ + unsigned char length; + unsigned char value[MAX_ENDP_LEN]; +}; + +/* + * The state of options is described by an lcp_options structure. + */ +typedef struct lcp_options { + unsigned int passive :1; /* Don't die if we don't get a response */ + unsigned int silent :1; /* Wait for the other end to start first */ +#if 0 /* UNUSED */ + unsigned int restart :1; /* Restart vs. exit after close */ +#endif /* UNUSED */ + unsigned int neg_mru :1; /* Negotiate the MRU? */ + unsigned int neg_asyncmap :1; /* Negotiate the async map? */ +#if PAP_SUPPORT + unsigned int neg_upap :1; /* Ask for UPAP authentication? */ +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT + unsigned int neg_chap :1; /* Ask for CHAP authentication? */ +#endif /* CHAP_SUPPORT */ +#if EAP_SUPPORT + unsigned int neg_eap :1; /* Ask for EAP authentication? */ +#endif /* EAP_SUPPORT */ + unsigned int neg_magicnumber :1; /* Ask for magic number? */ + unsigned int neg_pcompression :1; /* HDLC Protocol Field Compression? */ + unsigned int neg_accompression :1; /* HDLC Address/Control Field Compression? */ +#if LQR_SUPPORT + unsigned int neg_lqr :1; /* Negotiate use of Link Quality Reports */ +#endif /* LQR_SUPPORT */ + unsigned int neg_cbcp :1; /* Negotiate use of CBCP */ +#ifdef HAVE_MULTILINK + unsigned int neg_mrru :1; /* negotiate multilink MRRU */ +#endif /* HAVE_MULTILINK */ + unsigned int neg_ssnhf :1; /* negotiate short sequence numbers */ + unsigned int neg_endpoint :1; /* negotiate endpoint discriminator */ + + u16_t mru; /* Value of MRU */ +#ifdef HAVE_MULTILINK + u16_t mrru; /* Value of MRRU, and multilink enable */ +#endif /* MULTILINK */ +#if CHAP_SUPPORT + u8_t chap_mdtype; /* which MD types (hashing algorithm) */ +#endif /* CHAP_SUPPORT */ + u32_t asyncmap; /* Value of async map */ + u32_t magicnumber; + u8_t numloops; /* Number of loops during magic number neg. */ +#if LQR_SUPPORT + u32_t lqr_period; /* Reporting period for LQR 1/100ths second */ +#endif /* LQR_SUPPORT */ + struct epdisc endpoint; /* endpoint discriminator */ +} lcp_options; + +void lcp_open(ppp_pcb *pcb); +void lcp_close(ppp_pcb *pcb, const char *reason); +void lcp_lowerup(ppp_pcb *pcb); +void lcp_lowerdown(ppp_pcb *pcb); +void lcp_sprotrej(ppp_pcb *pcb, u_char *p, int len); /* send protocol reject */ + +extern const struct protent lcp_protent; + +#if 0 /* moved to ppp_opts.h */ +/* Default number of times we receive our magic number from the peer + before deciding the link is looped-back. */ +#define DEFLOOPBACKFAIL 10 +#endif /* moved to ppp_opts.h */ + +#ifdef __cplusplus +} +#endif + +#endif /* LCP_H */ +#endif /* PPP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/magic.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/magic.h new file mode 100644 index 0000000..12a002c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/magic.h @@ -0,0 +1,130 @@ +/* + * magic.h - PPP Magic Number definitions. + * + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. + * + * 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. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: magic.h,v 1.5 2003/06/11 23:56:26 paulus Exp $ + */ +/***************************************************************************** +* randm.h - Random number generator header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* Copyright (c) 1998 Global Election Systems Inc. +* +* 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 and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE 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 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. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 98-05-29 Guy Lancaster , Global Election Systems Inc. +* Extracted from avos. +*****************************************************************************/ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef MAGIC_H +#define MAGIC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************** +*** PUBLIC FUNCTIONS *** +***********************/ + +/* + * Initialize the random number generator. + */ +void magic_init(void); + +/* + * Randomize our random seed value. To be called for truly random events + * such as user operations and network traffic. + */ +void magic_randomize(void); + +/* + * Return a new random number. + */ +u32_t magic(void); /* Returns the next magic number */ + +/* + * Fill buffer with random bytes + * + * Use the random pool to generate random data. This degrades to pseudo + * random when used faster than randomness is supplied using magic_churnrand(). + * Thus it's important to make sure that the results of this are not + * published directly because one could predict the next result to at + * least some degree. Also, it's important to get a good seed before + * the first use. + */ +void magic_random_bytes(unsigned char *buf, u32_t buf_len); + +/* + * Return a new random number between 0 and (2^pow)-1 included. + */ +u32_t magic_pow(u8_t pow); + +#ifdef __cplusplus +} +#endif + +#endif /* MAGIC_H */ + +#endif /* PPP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/mppe.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/mppe.h new file mode 100644 index 0000000..5de1128 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/mppe.h @@ -0,0 +1,181 @@ +/* + * mppe.h - Definitions for MPPE + * + * Copyright (c) 2008 Paul Mackerras. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Paul Mackerras + * ". + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && MPPE_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef MPPE_H +#define MPPE_H + +#include "netif/ppp/pppcrypt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MPPE_PAD 4 /* MPPE growth per frame */ +#define MPPE_MAX_KEY_LEN 16 /* largest key length (128-bit) */ + +/* option bits for ccp_options.mppe */ +#define MPPE_OPT_40 0x01 /* 40 bit */ +#define MPPE_OPT_128 0x02 /* 128 bit */ +#define MPPE_OPT_STATEFUL 0x04 /* stateful mode */ +/* unsupported opts */ +#define MPPE_OPT_56 0x08 /* 56 bit */ +#define MPPE_OPT_MPPC 0x10 /* MPPC compression */ +#define MPPE_OPT_D 0x20 /* Unknown */ +#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D) +#define MPPE_OPT_UNKNOWN 0x40 /* Bits !defined in RFC 3078 were set */ + +/* + * This is not nice ... the alternative is a bitfield struct though. + * And unfortunately, we cannot share the same bits for the option + * names above since C and H are the same bit. We could do a u_int32 + * but then we have to do a lwip_htonl() all the time and/or we still need + * to know which octet is which. + */ +#define MPPE_C_BIT 0x01 /* MPPC */ +#define MPPE_D_BIT 0x10 /* Obsolete, usage unknown */ +#define MPPE_L_BIT 0x20 /* 40-bit */ +#define MPPE_S_BIT 0x40 /* 128-bit */ +#define MPPE_M_BIT 0x80 /* 56-bit, not supported */ +#define MPPE_H_BIT 0x01 /* Stateless (in a different byte) */ + +/* Does not include H bit; used for least significant octet only. */ +#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT) + +/* Build a CI from mppe opts (see RFC 3078) */ +#define MPPE_OPTS_TO_CI(opts, ci) \ + do { \ + u_char *ptr = ci; /* u_char[4] */ \ + \ + /* H bit */ \ + if (opts & MPPE_OPT_STATEFUL) \ + *ptr++ = 0x0; \ + else \ + *ptr++ = MPPE_H_BIT; \ + *ptr++ = 0; \ + *ptr++ = 0; \ + \ + /* S,L bits */ \ + *ptr = 0; \ + if (opts & MPPE_OPT_128) \ + *ptr |= MPPE_S_BIT; \ + if (opts & MPPE_OPT_40) \ + *ptr |= MPPE_L_BIT; \ + /* M,D,C bits not supported */ \ + } while (/* CONSTCOND */ 0) + +/* The reverse of the above */ +#define MPPE_CI_TO_OPTS(ci, opts) \ + do { \ + const u_char *ptr = ci; /* u_char[4] */ \ + \ + opts = 0; \ + \ + /* H bit */ \ + if (!(ptr[0] & MPPE_H_BIT)) \ + opts |= MPPE_OPT_STATEFUL; \ + \ + /* S,L bits */ \ + if (ptr[3] & MPPE_S_BIT) \ + opts |= MPPE_OPT_128; \ + if (ptr[3] & MPPE_L_BIT) \ + opts |= MPPE_OPT_40; \ + \ + /* M,D,C bits */ \ + if (ptr[3] & MPPE_M_BIT) \ + opts |= MPPE_OPT_56; \ + if (ptr[3] & MPPE_D_BIT) \ + opts |= MPPE_OPT_D; \ + if (ptr[3] & MPPE_C_BIT) \ + opts |= MPPE_OPT_MPPC; \ + \ + /* Other bits */ \ + if (ptr[0] & ~MPPE_H_BIT) \ + opts |= MPPE_OPT_UNKNOWN; \ + if (ptr[1] || ptr[2]) \ + opts |= MPPE_OPT_UNKNOWN; \ + if (ptr[3] & ~MPPE_ALL_BITS) \ + opts |= MPPE_OPT_UNKNOWN; \ + } while (/* CONSTCOND */ 0) + +/* Shared MPPE padding between MSCHAP and MPPE */ +#define SHA1_PAD_SIZE 40 + +static const u8_t mppe_sha1_pad1[SHA1_PAD_SIZE] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +static const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = { + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, + 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2 +}; + +/* + * State for an MPPE (de)compressor. + */ +typedef struct ppp_mppe_state { + lwip_arc4_context arc4; + u8_t master_key[MPPE_MAX_KEY_LEN]; + u8_t session_key[MPPE_MAX_KEY_LEN]; + u8_t keylen; /* key length in bytes */ + /* NB: 128-bit == 16, 40-bit == 8! + * If we want to support 56-bit, the unit has to change to bits + */ + u8_t bits; /* MPPE control bits */ + u16_t ccount; /* 12-bit coherency count (seqno) */ + u16_t sanity_errors; /* take down LCP if too many */ + unsigned int stateful :1; /* stateful mode flag */ + unsigned int discard :1; /* stateful mode packet loss flag */ +} ppp_mppe_state; + +void mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key); +void mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options); +void mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state); +err_t mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol); +void mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state); +err_t mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb); + +#ifdef __cplusplus +} +#endif + +#endif /* MPPE_H */ +#endif /* PPP_SUPPORT && MPPE_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/arc4.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/arc4.h new file mode 100644 index 0000000..91b08e6 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/arc4.h @@ -0,0 +1,81 @@ +/** + * \file arc4.h + * + * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine + * + * Copyright (C) 2009 Paul Bakker + * + * 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 names of PolarSSL or XySSL 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. + */ + +#include "netif/ppp/ppp_opts.h" +#if LWIP_INCLUDED_POLARSSL_ARC4 + +#ifndef LWIP_INCLUDED_POLARSSL_ARC4_H +#define LWIP_INCLUDED_POLARSSL_ARC4_H + +/** + * \brief ARC4 context structure + */ +typedef struct +{ + int x; /*!< permutation index */ + int y; /*!< permutation index */ + unsigned char m[256]; /*!< permutation table */ +} +arc4_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief ARC4 key schedule + * + * \param ctx ARC4 context to be initialized + * \param key the secret key + * \param keylen length of the key + */ +void arc4_setup( arc4_context *ctx, unsigned char *key, int keylen ); + +/** + * \brief ARC4 cipher function + * + * \param ctx ARC4 context + * \param buf buffer to be processed + * \param buflen amount of data in buf + */ +void arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen ); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_INCLUDED_POLARSSL_ARC4_H */ + +#endif /* LWIP_INCLUDED_POLARSSL_ARC4 */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/des.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/des.h new file mode 100644 index 0000000..5e3a085 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/des.h @@ -0,0 +1,92 @@ +/** + * \file des.h + * + * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine + * + * Copyright (C) 2009 Paul Bakker + * + * 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 names of PolarSSL or XySSL 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. + */ + +#include "netif/ppp/ppp_opts.h" +#if LWIP_INCLUDED_POLARSSL_DES + +#ifndef LWIP_INCLUDED_POLARSSL_DES_H +#define LWIP_INCLUDED_POLARSSL_DES_H + +#define DES_ENCRYPT 1 +#define DES_DECRYPT 0 + +/** + * \brief DES context structure + */ +typedef struct +{ + int mode; /*!< encrypt/decrypt */ + unsigned long sk[32]; /*!< DES subkeys */ +} +des_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief DES key schedule (56-bit, encryption) + * + * \param ctx DES context to be initialized + * \param key 8-byte secret key + */ +void des_setkey_enc( des_context *ctx, unsigned char key[8] ); + +/** + * \brief DES key schedule (56-bit, decryption) + * + * \param ctx DES context to be initialized + * \param key 8-byte secret key + */ +void des_setkey_dec( des_context *ctx, unsigned char key[8] ); + +/** + * \brief DES-ECB block encryption/decryption + * + * \param ctx DES context + * \param input 64-bit input block + * \param output 64-bit output block + */ +void des_crypt_ecb( des_context *ctx, + const unsigned char input[8], + unsigned char output[8] ); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_INCLUDED_POLARSSL_DES_H */ + +#endif /* LWIP_INCLUDED_POLARSSL_DES */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md4.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md4.h new file mode 100644 index 0000000..a4aa1dc --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md4.h @@ -0,0 +1,97 @@ +/** + * \file md4.h + * + * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine + * + * Copyright (C) 2009 Paul Bakker + * + * 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 names of PolarSSL or XySSL 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. + */ + +#include "netif/ppp/ppp_opts.h" +#if LWIP_INCLUDED_POLARSSL_MD4 + +#ifndef LWIP_INCLUDED_POLARSSL_MD4_H +#define LWIP_INCLUDED_POLARSSL_MD4_H + +/** + * \brief MD4 context structure + */ +typedef struct +{ + unsigned long total[2]; /*!< number of bytes processed */ + unsigned long state[4]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ +} +md4_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief MD4 context setup + * + * \param ctx context to be initialized + */ +void md4_starts( md4_context *ctx ); + +/** + * \brief MD4 process buffer + * + * \param ctx MD4 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void md4_update( md4_context *ctx, const unsigned char *input, int ilen ); + +/** + * \brief MD4 final digest + * + * \param ctx MD4 context + * \param output MD4 checksum result + */ +void md4_finish( md4_context *ctx, unsigned char output[16] ); + +/** + * \brief Output = MD4( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD4 checksum result + */ +void md4( unsigned char *input, int ilen, unsigned char output[16] ); + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_INCLUDED_POLARSSL_MD4_H */ + +#endif /* LWIP_INCLUDED_POLARSSL_MD4 */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md5.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md5.h new file mode 100644 index 0000000..4d7b04d --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/md5.h @@ -0,0 +1,96 @@ +/** + * \file md5.h + * + * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine + * + * Copyright (C) 2009 Paul Bakker + * + * 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 names of PolarSSL or XySSL 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. + */ + +#include "netif/ppp/ppp_opts.h" +#if LWIP_INCLUDED_POLARSSL_MD5 + +#ifndef LWIP_INCLUDED_POLARSSL_MD5_H +#define LWIP_INCLUDED_POLARSSL_MD5_H + +/** + * \brief MD5 context structure + */ +typedef struct +{ + unsigned long total[2]; /*!< number of bytes processed */ + unsigned long state[4]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ +} +md5_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief MD5 context setup + * + * \param ctx context to be initialized + */ +void md5_starts( md5_context *ctx ); + +/** + * \brief MD5 process buffer + * + * \param ctx MD5 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void md5_update( md5_context *ctx, const unsigned char *input, int ilen ); + +/** + * \brief MD5 final digest + * + * \param ctx MD5 context + * \param output MD5 checksum result + */ +void md5_finish( md5_context *ctx, unsigned char output[16] ); + +/** + * \brief Output = MD5( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output MD5 checksum result + */ +void md5( unsigned char *input, int ilen, unsigned char output[16] ); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_INCLUDED_POLARSSL_MD5_H */ + +#endif /* LWIP_INCLUDED_POLARSSL_MD5 */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/sha1.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/sha1.h new file mode 100644 index 0000000..d8f347c --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/polarssl/sha1.h @@ -0,0 +1,96 @@ +/** + * \file sha1.h + * + * Based on XySSL: Copyright (C) 2006-2008 Christophe Devine + * + * Copyright (C) 2009 Paul Bakker + * + * 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 names of PolarSSL or XySSL 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. + */ + +#include "netif/ppp/ppp_opts.h" +#if LWIP_INCLUDED_POLARSSL_SHA1 + +#ifndef LWIP_INCLUDED_POLARSSL_SHA1_H +#define LWIP_INCLUDED_POLARSSL_SHA1_H + +/** + * \brief SHA-1 context structure + */ +typedef struct +{ + unsigned long total[2]; /*!< number of bytes processed */ + unsigned long state[5]; /*!< intermediate digest state */ + unsigned char buffer[64]; /*!< data block being processed */ +} +sha1_context; + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief SHA-1 context setup + * + * \param ctx context to be initialized + */ +void sha1_starts( sha1_context *ctx ); + +/** + * \brief SHA-1 process buffer + * + * \param ctx SHA-1 context + * \param input buffer holding the data + * \param ilen length of the input data + */ +void sha1_update( sha1_context *ctx, const unsigned char *input, int ilen ); + +/** + * \brief SHA-1 final digest + * + * \param ctx SHA-1 context + * \param output SHA-1 checksum result + */ +void sha1_finish( sha1_context *ctx, unsigned char output[20] ); + +/** + * \brief Output = SHA-1( input buffer ) + * + * \param input buffer holding the data + * \param ilen length of the input data + * \param output SHA-1 checksum result + */ +void sha1( unsigned char *input, int ilen, unsigned char output[20] ); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_INCLUDED_POLARSSL_SHA1_H */ + +#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp.h new file mode 100644 index 0000000..26ba7a3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp.h @@ -0,0 +1,698 @@ +/***************************************************************************** +* ppp.h - Network Point to Point Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* 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 and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE 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 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. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef PPP_H +#define PPP_H + +#include "lwip/def.h" +#include "lwip/stats.h" +#include "lwip/mem.h" +#include "lwip/netif.h" +#include "lwip/sys.h" +#include "lwip/timeouts.h" +#if PPP_IPV6_SUPPORT +#include "lwip/ip6_addr.h" +#endif /* PPP_IPV6_SUPPORT */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Disable non-working or rarely used PPP feature, so rarely that we don't want to bloat ppp_opts.h with them */ +#ifndef PPP_OPTIONS +#define PPP_OPTIONS 0 +#endif + +#ifndef PPP_NOTIFY +#define PPP_NOTIFY 0 +#endif + +#ifndef PPP_REMOTENAME +#define PPP_REMOTENAME 0 +#endif + +#ifndef PPP_IDLETIMELIMIT +#define PPP_IDLETIMELIMIT 0 +#endif + +#ifndef PPP_LCP_ADAPTIVE +#define PPP_LCP_ADAPTIVE 0 +#endif + +#ifndef PPP_MAXCONNECT +#define PPP_MAXCONNECT 0 +#endif + +#ifndef PPP_ALLOWED_ADDRS +#define PPP_ALLOWED_ADDRS 0 +#endif + +#ifndef PPP_PROTOCOLNAME +#define PPP_PROTOCOLNAME 0 +#endif + +#ifndef PPP_STATS_SUPPORT +#define PPP_STATS_SUPPORT 0 +#endif + +#ifndef DEFLATE_SUPPORT +#define DEFLATE_SUPPORT 0 +#endif + +#ifndef BSDCOMPRESS_SUPPORT +#define BSDCOMPRESS_SUPPORT 0 +#endif + +#ifndef PREDICTOR_SUPPORT +#define PREDICTOR_SUPPORT 0 +#endif + +/************************* +*** PUBLIC DEFINITIONS *** +*************************/ + +/* + * The basic PPP frame. + */ +#define PPP_HDRLEN 4 /* octets for standard ppp header */ +#define PPP_FCSLEN 2 /* octets for FCS */ + +/* + * Values for phase. + */ +#define PPP_PHASE_DEAD 0 +#define PPP_PHASE_MASTER 1 +#define PPP_PHASE_HOLDOFF 2 +#define PPP_PHASE_INITIALIZE 3 +#define PPP_PHASE_SERIALCONN 4 +#define PPP_PHASE_DORMANT 5 +#define PPP_PHASE_ESTABLISH 6 +#define PPP_PHASE_AUTHENTICATE 7 +#define PPP_PHASE_CALLBACK 8 +#define PPP_PHASE_NETWORK 9 +#define PPP_PHASE_RUNNING 10 +#define PPP_PHASE_TERMINATE 11 +#define PPP_PHASE_DISCONNECT 12 + +/* Error codes. */ +#define PPPERR_NONE 0 /* No error. */ +#define PPPERR_PARAM 1 /* Invalid parameter. */ +#define PPPERR_OPEN 2 /* Unable to open PPP session. */ +#define PPPERR_DEVICE 3 /* Invalid I/O device for PPP. */ +#define PPPERR_ALLOC 4 /* Unable to allocate resources. */ +#define PPPERR_USER 5 /* User interrupt. */ +#define PPPERR_CONNECT 6 /* Connection lost. */ +#define PPPERR_AUTHFAIL 7 /* Failed authentication challenge. */ +#define PPPERR_PROTOCOL 8 /* Failed to meet protocol. */ +#define PPPERR_PEERDEAD 9 /* Connection timeout */ +#define PPPERR_IDLETIMEOUT 10 /* Idle Timeout */ +#define PPPERR_CONNECTTIME 11 /* Max connect time reached */ +#define PPPERR_LOOPBACK 12 /* Loopback detected */ + +/* Whether auth support is enabled at all */ +#define PPP_AUTH_SUPPORT (PAP_SUPPORT || CHAP_SUPPORT || EAP_SUPPORT) + +/************************ +*** PUBLIC DATA TYPES *** +************************/ + +/* + * Other headers require ppp_pcb definition for prototypes, but ppp_pcb + * require some structure definition from other headers as well, we are + * fixing the dependency loop here by declaring the ppp_pcb type then + * by including headers containing necessary struct definition for ppp_pcb + */ +typedef struct ppp_pcb_s ppp_pcb; + +/* Type definitions for BSD code. */ +#ifndef __u_char_defined +typedef unsigned long u_long; +typedef unsigned int u_int; +typedef unsigned short u_short; +typedef unsigned char u_char; +#endif + +#include "fsm.h" +#include "lcp.h" +#if CCP_SUPPORT +#include "ccp.h" +#endif /* CCP_SUPPORT */ +#if MPPE_SUPPORT +#include "mppe.h" +#endif /* MPPE_SUPPORT */ +#if PPP_IPV4_SUPPORT +#include "ipcp.h" +#endif /* PPP_IPV4_SUPPORT */ +#if PPP_IPV6_SUPPORT +#include "ipv6cp.h" +#endif /* PPP_IPV6_SUPPORT */ +#if PAP_SUPPORT +#include "upap.h" +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT +#include "chap-new.h" +#endif /* CHAP_SUPPORT */ +#if EAP_SUPPORT +#include "eap.h" +#endif /* EAP_SUPPORT */ +#if VJ_SUPPORT +#include "vj.h" +#endif /* VJ_SUPPORT */ + +/* Link status callback function prototype */ +typedef void (*ppp_link_status_cb_fn)(ppp_pcb *pcb, int err_code, void *ctx); + +/* + * PPP configuration. + */ +typedef struct ppp_settings_s { + +#if PPP_SERVER && PPP_AUTH_SUPPORT + unsigned int auth_required :1; /* Peer is required to authenticate */ + unsigned int null_login :1; /* Username of "" and a password of "" are acceptable */ +#endif /* PPP_SERVER && PPP_AUTH_SUPPORT */ +#if PPP_REMOTENAME + unsigned int explicit_remote :1; /* remote_name specified with remotename opt */ +#endif /* PPP_REMOTENAME */ +#if PAP_SUPPORT + unsigned int refuse_pap :1; /* Don't proceed auth. with PAP */ +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT + unsigned int refuse_chap :1; /* Don't proceed auth. with CHAP */ +#endif /* CHAP_SUPPORT */ +#if MSCHAP_SUPPORT + unsigned int refuse_mschap :1; /* Don't proceed auth. with MS-CHAP */ + unsigned int refuse_mschap_v2 :1; /* Don't proceed auth. with MS-CHAPv2 */ +#endif /* MSCHAP_SUPPORT */ +#if EAP_SUPPORT + unsigned int refuse_eap :1; /* Don't proceed auth. with EAP */ +#endif /* EAP_SUPPORT */ +#if LWIP_DNS + unsigned int usepeerdns :1; /* Ask peer for DNS adds */ +#endif /* LWIP_DNS */ + unsigned int persist :1; /* Persist mode, always try to open the connection */ +#if PRINTPKT_SUPPORT + unsigned int hide_password :1; /* Hide password in dumped packets */ +#endif /* PRINTPKT_SUPPORT */ + unsigned int noremoteip :1; /* Let him have no IP address */ + unsigned int lax_recv :1; /* accept control chars in asyncmap */ + unsigned int noendpoint :1; /* don't send/accept endpoint discriminator */ +#if PPP_LCP_ADAPTIVE + unsigned int lcp_echo_adaptive :1; /* request echo only if the link was idle */ +#endif /* PPP_LCP_ADAPTIVE */ +#if MPPE_SUPPORT + unsigned int require_mppe :1; /* Require MPPE (Microsoft Point to Point Encryption) */ + unsigned int refuse_mppe_40 :1; /* Allow MPPE 40-bit mode? */ + unsigned int refuse_mppe_128 :1; /* Allow MPPE 128-bit mode? */ + unsigned int refuse_mppe_stateful :1; /* Allow MPPE stateful mode? */ +#endif /* MPPE_SUPPORT */ + + u16_t listen_time; /* time to listen first (ms), waiting for peer to send LCP packet */ + +#if PPP_IDLETIMELIMIT + u16_t idle_time_limit; /* Disconnect if idle for this many seconds */ +#endif /* PPP_IDLETIMELIMIT */ +#if PPP_MAXCONNECT + u32_t maxconnect; /* Maximum connect time (seconds) */ +#endif /* PPP_MAXCONNECT */ + +#if PPP_AUTH_SUPPORT + /* auth data */ + const char *user; /* Username for PAP */ + const char *passwd; /* Password for PAP, secret for CHAP */ +#if PPP_REMOTENAME + char remote_name[MAXNAMELEN + 1]; /* Peer's name for authentication */ +#endif /* PPP_REMOTENAME */ + +#if PAP_SUPPORT + u8_t pap_timeout_time; /* Timeout (seconds) for auth-req retrans. */ + u8_t pap_max_transmits; /* Number of auth-reqs sent */ +#if PPP_SERVER + u8_t pap_req_timeout; /* Time to wait for auth-req from peer */ +#endif /* PPP_SERVER */ +#endif /* PAP_SUPPPORT */ + +#if CHAP_SUPPORT + u8_t chap_timeout_time; /* Timeout (seconds) for retransmitting req */ + u8_t chap_max_transmits; /* max # times to send challenge */ +#if PPP_SERVER + u8_t chap_rechallenge_time; /* Time to wait for auth-req from peer */ +#endif /* PPP_SERVER */ +#endif /* CHAP_SUPPPORT */ + +#if EAP_SUPPORT + u8_t eap_req_time; /* Time to wait (for retransmit/fail) */ + u8_t eap_allow_req; /* Max Requests allowed */ +#if PPP_SERVER + u8_t eap_timeout_time; /* Time to wait (for retransmit/fail) */ + u8_t eap_max_transmits; /* Max Requests allowed */ +#endif /* PPP_SERVER */ +#endif /* EAP_SUPPORT */ + +#endif /* PPP_AUTH_SUPPORT */ + + u8_t fsm_timeout_time; /* Timeout time in seconds */ + u8_t fsm_max_conf_req_transmits; /* Maximum Configure-Request transmissions */ + u8_t fsm_max_term_transmits; /* Maximum Terminate-Request transmissions */ + u8_t fsm_max_nak_loops; /* Maximum number of nak loops tolerated */ + + u8_t lcp_loopbackfail; /* Number of times we receive our magic number from the peer + before deciding the link is looped-back. */ + u8_t lcp_echo_interval; /* Interval between LCP echo-requests */ + u8_t lcp_echo_fails; /* Tolerance to unanswered echo-requests */ + +} ppp_settings; + +#if PPP_SERVER +struct ppp_addrs { +#if PPP_IPV4_SUPPORT + ip4_addr_t our_ipaddr, his_ipaddr, netmask; +#if LWIP_DNS + ip4_addr_t dns1, dns2; +#endif /* LWIP_DNS */ +#endif /* PPP_IPV4_SUPPORT */ +#if PPP_IPV6_SUPPORT + ip6_addr_t our6_ipaddr, his6_ipaddr; +#endif /* PPP_IPV6_SUPPORT */ +}; +#endif /* PPP_SERVER */ + +/* + * PPP interface control block. + */ +struct ppp_pcb_s { + ppp_settings settings; + const struct link_callbacks *link_cb; + void *link_ctx_cb; + void (*link_status_cb)(ppp_pcb *pcb, int err_code, void *ctx); /* Status change callback */ +#if PPP_NOTIFY_PHASE + void (*notify_phase_cb)(ppp_pcb *pcb, u8_t phase, void *ctx); /* Notify phase callback */ +#endif /* PPP_NOTIFY_PHASE */ + void *ctx_cb; /* Callbacks optional pointer */ + struct netif *netif; /* PPP interface */ + u8_t phase; /* where the link is at */ + u8_t err_code; /* Code indicating why interface is down. */ + + /* flags */ +#if PPP_IPV4_SUPPORT + unsigned int ask_for_local :1; /* request our address from peer */ + unsigned int ipcp_is_open :1; /* haven't called np_finished() */ + unsigned int ipcp_is_up :1; /* have called ipcp_up() */ + unsigned int if4_up :1; /* True when the IPv4 interface is up. */ +#if 0 /* UNUSED - PROXY ARP */ + unsigned int proxy_arp_set :1; /* Have created proxy arp entry */ +#endif /* UNUSED - PROXY ARP */ +#endif /* PPP_IPV4_SUPPORT */ +#if PPP_IPV6_SUPPORT + unsigned int ipv6cp_is_up :1; /* have called ip6cp_up() */ + unsigned int if6_up :1; /* True when the IPv6 interface is up. */ +#endif /* PPP_IPV6_SUPPORT */ + unsigned int lcp_echo_timer_running :1; /* set if a timer is running */ +#if VJ_SUPPORT + unsigned int vj_enabled :1; /* Flag indicating VJ compression enabled. */ +#endif /* VJ_SUPPORT */ +#if CCP_SUPPORT + unsigned int ccp_all_rejected :1; /* we rejected all peer's options */ +#endif /* CCP_SUPPORT */ +#if MPPE_SUPPORT + unsigned int mppe_keys_set :1; /* Have the MPPE keys been set? */ +#endif /* MPPE_SUPPORT */ + +#if PPP_AUTH_SUPPORT + /* auth data */ +#if PPP_SERVER && defined(HAVE_MULTILINK) + char peer_authname[MAXNAMELEN + 1]; /* The name by which the peer authenticated itself to us. */ +#endif /* PPP_SERVER && defined(HAVE_MULTILINK) */ + u16_t auth_pending; /* Records which authentication operations haven't completed yet. */ + u16_t auth_done; /* Records which authentication operations have been completed. */ + +#if PAP_SUPPORT + upap_state upap; /* PAP data */ +#endif /* PAP_SUPPORT */ + +#if CHAP_SUPPORT + chap_client_state chap_client; /* CHAP client data */ +#if PPP_SERVER + chap_server_state chap_server; /* CHAP server data */ +#endif /* PPP_SERVER */ +#endif /* CHAP_SUPPORT */ + +#if EAP_SUPPORT + eap_state eap; /* EAP data */ +#endif /* EAP_SUPPORT */ +#endif /* PPP_AUTH_SUPPORT */ + + fsm lcp_fsm; /* LCP fsm structure */ + lcp_options lcp_wantoptions; /* Options that we want to request */ + lcp_options lcp_gotoptions; /* Options that peer ack'd */ + lcp_options lcp_allowoptions; /* Options we allow peer to request */ + lcp_options lcp_hisoptions; /* Options that we ack'd */ + u16_t peer_mru; /* currently negotiated peer MRU */ + u8_t lcp_echos_pending; /* Number of outstanding echo msgs */ + u8_t lcp_echo_number; /* ID number of next echo frame */ + + u8_t num_np_open; /* Number of network protocols which we have opened. */ + u8_t num_np_up; /* Number of network protocols which have come up. */ + +#if VJ_SUPPORT + struct vjcompress vj_comp; /* Van Jacobson compression header. */ +#endif /* VJ_SUPPORT */ + +#if CCP_SUPPORT + fsm ccp_fsm; /* CCP fsm structure */ + ccp_options ccp_wantoptions; /* what to request the peer to use */ + ccp_options ccp_gotoptions; /* what the peer agreed to do */ + ccp_options ccp_allowoptions; /* what we'll agree to do */ + ccp_options ccp_hisoptions; /* what we agreed to do */ + u8_t ccp_localstate; /* Local state (mainly for handling reset-reqs and reset-acks). */ + u8_t ccp_receive_method; /* Method chosen on receive path */ + u8_t ccp_transmit_method; /* Method chosen on transmit path */ +#if MPPE_SUPPORT + ppp_mppe_state mppe_comp; /* MPPE "compressor" structure */ + ppp_mppe_state mppe_decomp; /* MPPE "decompressor" structure */ +#endif /* MPPE_SUPPORT */ +#endif /* CCP_SUPPORT */ + +#if PPP_IPV4_SUPPORT + fsm ipcp_fsm; /* IPCP fsm structure */ + ipcp_options ipcp_wantoptions; /* Options that we want to request */ + ipcp_options ipcp_gotoptions; /* Options that peer ack'd */ + ipcp_options ipcp_allowoptions; /* Options we allow peer to request */ + ipcp_options ipcp_hisoptions; /* Options that we ack'd */ +#endif /* PPP_IPV4_SUPPORT */ + +#if PPP_IPV6_SUPPORT + fsm ipv6cp_fsm; /* IPV6CP fsm structure */ + ipv6cp_options ipv6cp_wantoptions; /* Options that we want to request */ + ipv6cp_options ipv6cp_gotoptions; /* Options that peer ack'd */ + ipv6cp_options ipv6cp_allowoptions; /* Options we allow peer to request */ + ipv6cp_options ipv6cp_hisoptions; /* Options that we ack'd */ +#endif /* PPP_IPV6_SUPPORT */ +}; + +/************************ + *** PUBLIC FUNCTIONS *** + ************************/ + +/* + * WARNING: For multi-threads environment, all ppp_set_* functions most + * only be called while the PPP is in the dead phase (i.e. disconnected). + */ + +#if PPP_AUTH_SUPPORT +/* + * Set PPP authentication. + * + * Warning: Using PPPAUTHTYPE_ANY might have security consequences. + * RFC 1994 says: + * + * In practice, within or associated with each PPP server, there is a + * database which associates "user" names with authentication + * information ("secrets"). It is not anticipated that a particular + * named user would be authenticated by multiple methods. This would + * make the user vulnerable to attacks which negotiate the least secure + * method from among a set (such as PAP rather than CHAP). If the same + * secret was used, PAP would reveal the secret to be used later with + * CHAP. + * + * Instead, for each user name there should be an indication of exactly + * one method used to authenticate that user name. If a user needs to + * make use of different authentication methods under different + * circumstances, then distinct user names SHOULD be employed, each of + * which identifies exactly one authentication method. + * + * Default is none auth type, unset (NULL) user and passwd. + */ +#define PPPAUTHTYPE_NONE 0x00 +#define PPPAUTHTYPE_PAP 0x01 +#define PPPAUTHTYPE_CHAP 0x02 +#define PPPAUTHTYPE_MSCHAP 0x04 +#define PPPAUTHTYPE_MSCHAP_V2 0x08 +#define PPPAUTHTYPE_EAP 0x10 +#define PPPAUTHTYPE_ANY 0xff +void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd); + +/* + * If set, peer is required to authenticate. This is mostly necessary for PPP server support. + * + * Default is false. + */ +#define ppp_set_auth_required(ppp, boolval) (ppp->settings.auth_required = boolval) +#endif /* PPP_AUTH_SUPPORT */ + +#if PPP_IPV4_SUPPORT +/* + * Set PPP interface "our" and "his" IPv4 addresses. This is mostly necessary for PPP server + * support but it can also be used on a PPP link where each side choose its own IP address. + * + * Default is unset (0.0.0.0). + */ +#define ppp_set_ipcp_ouraddr(ppp, addr) do { ppp->ipcp_wantoptions.ouraddr = ip4_addr_get_u32(addr); \ + ppp->ask_for_local = ppp->ipcp_wantoptions.ouraddr != 0; } while(0) +#define ppp_set_ipcp_hisaddr(ppp, addr) (ppp->ipcp_wantoptions.hisaddr = ip4_addr_get_u32(addr)) +#if LWIP_DNS +/* + * Set DNS server addresses that are sent if the peer asks for them. This is mostly necessary + * for PPP server support. + * + * Default is unset (0.0.0.0). + */ +#define ppp_set_ipcp_dnsaddr(ppp, index, addr) (ppp->ipcp_allowoptions.dnsaddr[index] = ip4_addr_get_u32(addr)) + +/* + * If set, we ask the peer for up to 2 DNS server addresses. Received DNS server addresses are + * registered using the dns_setserver() function. + * + * Default is false. + */ +#define ppp_set_usepeerdns(ppp, boolval) (ppp->settings.usepeerdns = boolval) +#endif /* LWIP_DNS */ +#endif /* PPP_IPV4_SUPPORT */ + +#if MPPE_SUPPORT +/* Disable MPPE (Microsoft Point to Point Encryption). This parameter is exclusive. */ +#define PPP_MPPE_DISABLE 0x00 +/* Require the use of MPPE (Microsoft Point to Point Encryption). */ +#define PPP_MPPE_ENABLE 0x01 +/* Allow MPPE to use stateful mode. Stateless mode is still attempted first. */ +#define PPP_MPPE_ALLOW_STATEFUL 0x02 +/* Refuse the use of MPPE with 40-bit encryption. Conflict with PPP_MPPE_REFUSE_128. */ +#define PPP_MPPE_REFUSE_40 0x04 +/* Refuse the use of MPPE with 128-bit encryption. Conflict with PPP_MPPE_REFUSE_40. */ +#define PPP_MPPE_REFUSE_128 0x08 +/* + * Set MPPE configuration + * + * Default is disabled. + */ +void ppp_set_mppe(ppp_pcb *pcb, u8_t flags); +#endif /* MPPE_SUPPORT */ + +/* + * Wait for up to intval milliseconds for a valid PPP packet from the peer. + * At the end of this time, or when a valid PPP packet is received from the + * peer, we commence negotiation by sending our first LCP packet. + * + * Default is 0. + */ +#define ppp_set_listen_time(ppp, intval) (ppp->settings.listen_time = intval) + +/* + * If set, we will attempt to initiate a connection but if no reply is received from + * the peer, we will then just wait passively for a valid LCP packet from the peer. + * + * Default is false. + */ +#define ppp_set_passive(ppp, boolval) (ppp->lcp_wantoptions.passive = boolval) + +/* + * If set, we will not transmit LCP packets to initiate a connection until a valid + * LCP packet is received from the peer. This is what we usually call the server mode. + * + * Default is false. + */ +#define ppp_set_silent(ppp, boolval) (ppp->lcp_wantoptions.silent = boolval) + +/* + * If set, enable protocol field compression negotiation in both the receive and + * the transmit direction. + * + * Default is true. + */ +#define ppp_set_neg_pcomp(ppp, boolval) (ppp->lcp_wantoptions.neg_pcompression = \ + ppp->lcp_allowoptions.neg_pcompression = boolval) + +/* + * If set, enable Address/Control compression in both the receive and the transmit + * direction. + * + * Default is true. + */ +#define ppp_set_neg_accomp(ppp, boolval) (ppp->lcp_wantoptions.neg_accompression = \ + ppp->lcp_allowoptions.neg_accompression = boolval) + +/* + * If set, enable asyncmap negotiation. Otherwise forcing all control characters to + * be escaped for both the transmit and the receive direction. + * + * Default is true. + */ +#define ppp_set_neg_asyncmap(ppp, boolval) (ppp->lcp_wantoptions.neg_asyncmap = \ + ppp->lcp_allowoptions.neg_asyncmap = boolval) + +/* + * This option sets the Async-Control-Character-Map (ACCM) for this end of the link. + * The ACCM is a set of 32 bits, one for each of the ASCII control characters with + * values from 0 to 31, where a 1 bit indicates that the corresponding control + * character should not be used in PPP packets sent to this system. The map is + * an unsigned 32 bits integer where the least significant bit (00000001) represents + * character 0 and the most significant bit (80000000) represents character 31. + * We will then ask the peer to send these characters as a 2-byte escape sequence. + * + * Default is 0. + */ +#define ppp_set_asyncmap(ppp, intval) (ppp->lcp_wantoptions.asyncmap = intval) + +/* + * Set a PPP interface as the default network interface + * (used to output all packets for which no specific route is found). + */ +#define ppp_set_default(ppp) netif_set_default(ppp->netif) + +#if PPP_NOTIFY_PHASE +/* + * Set a PPP notify phase callback. + * + * This can be used for example to set a LED pattern depending on the + * current phase of the PPP session. + */ +typedef void (*ppp_notify_phase_cb_fn)(ppp_pcb *pcb, u8_t phase, void *ctx); +void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb); +#endif /* PPP_NOTIFY_PHASE */ + +/* + * Initiate a PPP connection. + * + * This can only be called if PPP is in the dead phase. + * + * Holdoff is the time to wait (in seconds) before initiating + * the connection. + * + * If this port connects to a modem, the modem connection must be + * established before calling this. + */ +err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff); + +#if PPP_SERVER +/* + * Listen for an incoming PPP connection. + * + * This can only be called if PPP is in the dead phase. + * + * If this port connects to a modem, the modem connection must be + * established before calling this. + */ +err_t ppp_listen(ppp_pcb *pcb); +#endif /* PPP_SERVER */ + +/* + * Initiate the end of a PPP connection. + * Any outstanding packets in the queues are dropped. + * + * Setting nocarrier to 1 close the PPP connection without initiating the + * shutdown procedure. Always using nocarrier = 0 is still recommended, + * this is going to take a little longer time if your link is down, but + * is a safer choice for the PPP state machine. + * + * Return 0 on success, an error code on failure. + */ +err_t ppp_close(ppp_pcb *pcb, u8_t nocarrier); + +/* + * Release the control block. + * + * This can only be called if PPP is in the dead phase. + * + * You must use ppp_close() before if you wish to terminate + * an established PPP session. + * + * Return 0 on success, an error code on failure. + */ +err_t ppp_free(ppp_pcb *pcb); + +/* + * PPP IOCTL commands. + * + * Get the up status - 0 for down, non-zero for up. The argument must + * point to an int. + */ +#define PPPCTLG_UPSTATUS 0 + +/* + * Get the PPP error code. The argument must point to an int. + * Returns a PPPERR_* value. + */ +#define PPPCTLG_ERRCODE 1 + +/* + * Get the fd associated with a PPP over serial + */ +#define PPPCTLG_FD 2 + +/* + * Get and set parameters for the given connection. + * Return 0 on success, an error code on failure. + */ +err_t ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg); + +/* Get the PPP netif interface */ +#define ppp_netif(ppp) (ppp->netif) + +/* Set an lwIP-style status-callback for the selected PPP device */ +#define ppp_set_netif_statuscallback(ppp, status_cb) \ + netif_set_status_callback(ppp->netif, status_cb); + +/* Set an lwIP-style link-callback for the selected PPP device */ +#define ppp_set_netif_linkcallback(ppp, link_cb) \ + netif_set_link_callback(ppp->netif, link_cb); + +#ifdef __cplusplus +} +#endif + +#endif /* PPP_H */ + +#endif /* PPP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_impl.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_impl.h new file mode 100644 index 0000000..51ee422 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_impl.h @@ -0,0 +1,722 @@ +/***************************************************************************** +* ppp.h - Network Point to Point Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* 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 and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE 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 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. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ +#ifndef LWIP_HDR_PPP_IMPL_H +#define LWIP_HDR_PPP_IMPL_H + +#include "netif/ppp/ppp_opts.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifdef PPP_INCLUDE_SETTINGS_HEADER +#include "ppp_settings.h" +#endif + +#include /* formats */ +#include +#include +#include /* strtol() */ + +#include "lwip/netif.h" +#include "lwip/def.h" +#include "lwip/timeouts.h" + +#include "ppp.h" +#include "pppdebug.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Memory used for control packets. + * + * PPP_CTRL_PBUF_MAX_SIZE is the amount of memory we allocate when we + * cannot figure out how much we are going to use before filling the buffer. + */ +#if PPP_USE_PBUF_RAM +#define PPP_CTRL_PBUF_TYPE PBUF_RAM +#define PPP_CTRL_PBUF_MAX_SIZE 512 +#else /* PPP_USE_PBUF_RAM */ +#define PPP_CTRL_PBUF_TYPE PBUF_POOL +#define PPP_CTRL_PBUF_MAX_SIZE PBUF_POOL_BUFSIZE +#endif /* PPP_USE_PBUF_RAM */ + +/* + * The basic PPP frame. + */ +#define PPP_ADDRESS(p) (((u_char *)(p))[0]) +#define PPP_CONTROL(p) (((u_char *)(p))[1]) +#define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3]) + +/* + * Significant octet values. + */ +#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */ +#define PPP_UI 0x03 /* Unnumbered Information */ +#define PPP_FLAG 0x7e /* Flag Sequence */ +#define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */ +#define PPP_TRANS 0x20 /* Asynchronous transparency modifier */ + +/* + * Protocol field values. + */ +#define PPP_IP 0x21 /* Internet Protocol */ +#if 0 /* UNUSED */ +#define PPP_AT 0x29 /* AppleTalk Protocol */ +#define PPP_IPX 0x2b /* IPX protocol */ +#endif /* UNUSED */ +#if VJ_SUPPORT +#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */ +#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */ +#endif /* VJ_SUPPORT */ +#if PPP_IPV6_SUPPORT +#define PPP_IPV6 0x57 /* Internet Protocol Version 6 */ +#endif /* PPP_IPV6_SUPPORT */ +#if CCP_SUPPORT +#define PPP_COMP 0xfd /* compressed packet */ +#endif /* CCP_SUPPORT */ +#define PPP_IPCP 0x8021 /* IP Control Protocol */ +#if 0 /* UNUSED */ +#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */ +#define PPP_IPXCP 0x802b /* IPX Control Protocol */ +#endif /* UNUSED */ +#if PPP_IPV6_SUPPORT +#define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */ +#endif /* PPP_IPV6_SUPPORT */ +#if CCP_SUPPORT +#define PPP_CCP 0x80fd /* Compression Control Protocol */ +#endif /* CCP_SUPPORT */ +#if ECP_SUPPORT +#define PPP_ECP 0x8053 /* Encryption Control Protocol */ +#endif /* ECP_SUPPORT */ +#define PPP_LCP 0xc021 /* Link Control Protocol */ +#if PAP_SUPPORT +#define PPP_PAP 0xc023 /* Password Authentication Protocol */ +#endif /* PAP_SUPPORT */ +#if LQR_SUPPORT +#define PPP_LQR 0xc025 /* Link Quality Report protocol */ +#endif /* LQR_SUPPORT */ +#if CHAP_SUPPORT +#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */ +#endif /* CHAP_SUPPORT */ +#if CBCP_SUPPORT +#define PPP_CBCP 0xc029 /* Callback Control Protocol */ +#endif /* CBCP_SUPPORT */ +#if EAP_SUPPORT +#define PPP_EAP 0xc227 /* Extensible Authentication Protocol */ +#endif /* EAP_SUPPORT */ + +/* + * The following struct gives the addresses of procedures to call + * for a particular lower link level protocol. + */ +struct link_callbacks { + /* Start a connection (e.g. Initiate discovery phase) */ + void (*connect) (ppp_pcb *pcb, void *ctx); +#if PPP_SERVER + /* Listen for an incoming connection (Passive mode) */ + void (*listen) (ppp_pcb *pcb, void *ctx); +#endif /* PPP_SERVER */ + /* End a connection (i.e. initiate disconnect phase) */ + void (*disconnect) (ppp_pcb *pcb, void *ctx); + /* Free lower protocol control block */ + err_t (*free) (ppp_pcb *pcb, void *ctx); + /* Write a pbuf to a ppp link, only used from PPP functions to send PPP packets. */ + err_t (*write)(ppp_pcb *pcb, void *ctx, struct pbuf *p); + /* Send a packet from lwIP core (IPv4 or IPv6) */ + err_t (*netif_output)(ppp_pcb *pcb, void *ctx, struct pbuf *p, u_short protocol); + /* configure the transmit-side characteristics of the PPP interface */ + void (*send_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp); + /* confire the receive-side characteristics of the PPP interface */ + void (*recv_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp); +}; + +/* + * What to do with network protocol (NP) packets. + */ +enum NPmode { + NPMODE_PASS, /* pass the packet through */ + NPMODE_DROP, /* silently drop the packet */ + NPMODE_ERROR, /* return an error */ + NPMODE_QUEUE /* save it up for later. */ +}; + +/* + * Statistics. + */ +#if PPP_STATS_SUPPORT +struct pppstat { + unsigned int ppp_ibytes; /* bytes received */ + unsigned int ppp_ipackets; /* packets received */ + unsigned int ppp_ierrors; /* receive errors */ + unsigned int ppp_obytes; /* bytes sent */ + unsigned int ppp_opackets; /* packets sent */ + unsigned int ppp_oerrors; /* transmit errors */ +}; + +#if VJ_SUPPORT +struct vjstat { + unsigned int vjs_packets; /* outbound packets */ + unsigned int vjs_compressed; /* outbound compressed packets */ + unsigned int vjs_searches; /* searches for connection state */ + unsigned int vjs_misses; /* times couldn't find conn. state */ + unsigned int vjs_uncompressedin; /* inbound uncompressed packets */ + unsigned int vjs_compressedin; /* inbound compressed packets */ + unsigned int vjs_errorin; /* inbound unknown type packets */ + unsigned int vjs_tossed; /* inbound packets tossed because of error */ +}; +#endif /* VJ_SUPPORT */ + +struct ppp_stats { + struct pppstat p; /* basic PPP statistics */ +#if VJ_SUPPORT + struct vjstat vj; /* VJ header compression statistics */ +#endif /* VJ_SUPPORT */ +}; + +#if CCP_SUPPORT +struct compstat { + unsigned int unc_bytes; /* total uncompressed bytes */ + unsigned int unc_packets; /* total uncompressed packets */ + unsigned int comp_bytes; /* compressed bytes */ + unsigned int comp_packets; /* compressed packets */ + unsigned int inc_bytes; /* incompressible bytes */ + unsigned int inc_packets; /* incompressible packets */ + unsigned int ratio; /* recent compression ratio << 8 */ +}; + +struct ppp_comp_stats { + struct compstat c; /* packet compression statistics */ + struct compstat d; /* packet decompression statistics */ +}; +#endif /* CCP_SUPPORT */ + +#endif /* PPP_STATS_SUPPORT */ + +#if PPP_IDLETIMELIMIT +/* + * The following structure records the time in seconds since + * the last NP packet was sent or received. + */ +struct ppp_idle { + time_t xmit_idle; /* time since last NP packet sent */ + time_t recv_idle; /* time since last NP packet received */ +}; +#endif /* PPP_IDLETIMELIMIT */ + +/* values for epdisc.class */ +#define EPD_NULL 0 /* null discriminator, no data */ +#define EPD_LOCAL 1 +#define EPD_IP 2 +#define EPD_MAC 3 +#define EPD_MAGIC 4 +#define EPD_PHONENUM 5 + +/* + * Global variables. + */ +#ifdef HAVE_MULTILINK +extern u8_t multilink; /* enable multilink operation */ +extern u8_t doing_multilink; +extern u8_t multilink_master; +extern u8_t bundle_eof; +extern u8_t bundle_terminating; +#endif + +#ifdef MAXOCTETS +extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */ +extern int maxoctets_dir; /* Direction : + 0 - in+out (default) + 1 - in + 2 - out + 3 - max(in,out) */ +extern int maxoctets_timeout; /* Timeout for check of octets limit */ +#define PPP_OCTETS_DIRECTION_SUM 0 +#define PPP_OCTETS_DIRECTION_IN 1 +#define PPP_OCTETS_DIRECTION_OUT 2 +#define PPP_OCTETS_DIRECTION_MAXOVERAL 3 +/* same as previous, but little different on RADIUS side */ +#define PPP_OCTETS_DIRECTION_MAXSESSION 4 +#endif + +/* Data input may be used by CCP and ECP, remove this entry + * from struct protent to save some flash + */ +#define PPP_DATAINPUT 0 + +/* + * The following struct gives the addresses of procedures to call + * for a particular protocol. + */ +struct protent { + u_short protocol; /* PPP protocol number */ + /* Initialization procedure */ + void (*init) (ppp_pcb *pcb); + /* Process a received packet */ + void (*input) (ppp_pcb *pcb, u_char *pkt, int len); + /* Process a received protocol-reject */ + void (*protrej) (ppp_pcb *pcb); + /* Lower layer has come up */ + void (*lowerup) (ppp_pcb *pcb); + /* Lower layer has gone down */ + void (*lowerdown) (ppp_pcb *pcb); + /* Open the protocol */ + void (*open) (ppp_pcb *pcb); + /* Close the protocol */ + void (*close) (ppp_pcb *pcb, const char *reason); +#if PRINTPKT_SUPPORT + /* Print a packet in readable form */ + int (*printpkt) (const u_char *pkt, int len, + void (*printer) (void *, const char *, ...), + void *arg); +#endif /* PRINTPKT_SUPPORT */ +#if PPP_DATAINPUT + /* Process a received data packet */ + void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len); +#endif /* PPP_DATAINPUT */ +#if PRINTPKT_SUPPORT + const char *name; /* Text name of protocol */ + const char *data_name; /* Text name of corresponding data protocol */ +#endif /* PRINTPKT_SUPPORT */ +#if PPP_OPTIONS + option_t *options; /* List of command-line options */ + /* Check requested options, assign defaults */ + void (*check_options) (void); +#endif /* PPP_OPTIONS */ +#if DEMAND_SUPPORT + /* Configure interface for demand-dial */ + int (*demand_conf) (int unit); + /* Say whether to bring up link for this pkt */ + int (*active_pkt) (u_char *pkt, int len); +#endif /* DEMAND_SUPPORT */ +}; + +/* Table of pointers to supported protocols */ +extern const struct protent* const protocols[]; + + +/* Values for auth_pending, auth_done */ +#if PAP_SUPPORT +#define PAP_WITHPEER 0x1 +#define PAP_PEER 0x2 +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT +#define CHAP_WITHPEER 0x4 +#define CHAP_PEER 0x8 +#endif /* CHAP_SUPPORT */ +#if EAP_SUPPORT +#define EAP_WITHPEER 0x10 +#define EAP_PEER 0x20 +#endif /* EAP_SUPPORT */ + +/* Values for auth_done only */ +#if CHAP_SUPPORT +#define CHAP_MD5_WITHPEER 0x40 +#define CHAP_MD5_PEER 0x80 +#if MSCHAP_SUPPORT +#define CHAP_MS_SHIFT 8 /* LSB position for MS auths */ +#define CHAP_MS_WITHPEER 0x100 +#define CHAP_MS_PEER 0x200 +#define CHAP_MS2_WITHPEER 0x400 +#define CHAP_MS2_PEER 0x800 +#endif /* MSCHAP_SUPPORT */ +#endif /* CHAP_SUPPORT */ + +/* Supported CHAP protocols */ +#if CHAP_SUPPORT + +#if MSCHAP_SUPPORT +#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT | MDTYPE_MD5) +#else /* MSCHAP_SUPPORT */ +#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MD5) +#endif /* MSCHAP_SUPPORT */ + +#else /* CHAP_SUPPORT */ +#define CHAP_MDTYPE_SUPPORTED (MDTYPE_NONE) +#endif /* CHAP_SUPPORT */ + +#if PPP_STATS_SUPPORT +/* + * PPP statistics structure + */ +struct pppd_stats { + unsigned int bytes_in; + unsigned int bytes_out; + unsigned int pkts_in; + unsigned int pkts_out; +}; +#endif /* PPP_STATS_SUPPORT */ + + +/* + * PPP private functions + */ + + +/* + * Functions called from lwIP core. + */ + +/* initialize the PPP subsystem */ +int ppp_init(void); + +/* + * Functions called from PPP link protocols. + */ + +/* Create a new PPP control block */ +ppp_pcb *ppp_new(struct netif *pppif, const struct link_callbacks *callbacks, void *link_ctx_cb, + ppp_link_status_cb_fn link_status_cb, void *ctx_cb); + +/* Initiate LCP open request */ +void ppp_start(ppp_pcb *pcb); + +/* Called when link failed to setup */ +void ppp_link_failed(ppp_pcb *pcb); + +/* Called when link is normally down (i.e. it was asked to end) */ +void ppp_link_end(ppp_pcb *pcb); + +/* function called to process input packet */ +void ppp_input(ppp_pcb *pcb, struct pbuf *pb); + + +/* + * Functions called by PPP protocols. + */ + +/* function called by all PPP subsystems to send packets */ +err_t ppp_write(ppp_pcb *pcb, struct pbuf *p); + +/* functions called by auth.c link_terminated() */ +void ppp_link_terminated(ppp_pcb *pcb); + +void new_phase(ppp_pcb *pcb, int p); + +int ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp); +int ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp); + +#if PPP_IPV4_SUPPORT +int sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask); +int cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr); +#if 0 /* UNUSED - PROXY ARP */ +int sifproxyarp(ppp_pcb *pcb, u32_t his_adr); +int cifproxyarp(ppp_pcb *pcb, u32_t his_adr); +#endif /* UNUSED - PROXY ARP */ +#if LWIP_DNS +int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2); +int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2); +#endif /* LWIP_DNS */ +#if VJ_SUPPORT +int sifvjcomp(ppp_pcb *pcb, int vjcomp, int cidcomp, int maxcid); +#endif /* VJ_SUPPORT */ +int sifup(ppp_pcb *pcb); +int sifdown (ppp_pcb *pcb); +u32_t get_mask(u32_t addr); +#endif /* PPP_IPV4_SUPPORT */ + +#if PPP_IPV6_SUPPORT +int sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64); +int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64); +int sif6up(ppp_pcb *pcb); +int sif6down (ppp_pcb *pcb); +#endif /* PPP_IPV6_SUPPORT */ + +#if DEMAND_SUPPORT +int sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode); +#endif /* DEMAND_SUPPORt */ + +void netif_set_mtu(ppp_pcb *pcb, int mtu); +int netif_get_mtu(ppp_pcb *pcb); + +#if CCP_SUPPORT +#if 0 /* unused */ +int ccp_test(ppp_pcb *pcb, u_char *opt_ptr, int opt_len, int for_transmit); +#endif /* unused */ +void ccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method); +void ccp_reset_comp(ppp_pcb *pcb); +void ccp_reset_decomp(ppp_pcb *pcb); +#if 0 /* unused */ +int ccp_fatal_error(ppp_pcb *pcb); +#endif /* unused */ +#endif /* CCP_SUPPORT */ + +#if PPP_IDLETIMELIMIT +int get_idle_time(ppp_pcb *pcb, struct ppp_idle *ip); +#endif /* PPP_IDLETIMELIMIT */ + +#if DEMAND_SUPPORT +int get_loop_output(void); +#endif /* DEMAND_SUPPORT */ + +/* Optional protocol names list, to make our messages a little more informative. */ +#if PPP_PROTOCOLNAME +const char * protocol_name(int proto); +#endif /* PPP_PROTOCOLNAME */ + +/* Optional stats support, to get some statistics on the PPP interface */ +#if PPP_STATS_SUPPORT +void print_link_stats(void); /* Print stats, if available */ +void reset_link_stats(int u); /* Reset (init) stats when link goes up */ +void update_link_stats(int u); /* Get stats at link termination */ +#endif /* PPP_STATS_SUPPORT */ + + + +/* + * Inline versions of get/put char/short/long. + * Pointer is advanced; we assume that both arguments + * are lvalues and will already be in registers. + * cp MUST be u_char *. + */ +#define GETCHAR(c, cp) { \ + (c) = *(cp)++; \ +} +#define PUTCHAR(c, cp) { \ + *(cp)++ = (u_char) (c); \ +} +#define GETSHORT(s, cp) { \ + (s) = *(cp)++ << 8; \ + (s) |= *(cp)++; \ +} +#define PUTSHORT(s, cp) { \ + *(cp)++ = (u_char) ((s) >> 8); \ + *(cp)++ = (u_char) (s); \ +} +#define GETLONG(l, cp) { \ + (l) = *(cp)++ << 8; \ + (l) |= *(cp)++; (l) <<= 8; \ + (l) |= *(cp)++; (l) <<= 8; \ + (l) |= *(cp)++; \ +} +#define PUTLONG(l, cp) { \ + *(cp)++ = (u_char) ((l) >> 24); \ + *(cp)++ = (u_char) ((l) >> 16); \ + *(cp)++ = (u_char) ((l) >> 8); \ + *(cp)++ = (u_char) (l); \ +} + +#define INCPTR(n, cp) ((cp) += (n)) +#define DECPTR(n, cp) ((cp) -= (n)) + +/* + * System dependent definitions for user-level 4.3BSD UNIX implementation. + */ +#define TIMEOUT(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t)*1000, (f), (a)); } while(0) +#define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0) +#define UNTIMEOUT(f, a) sys_untimeout((f), (a)) + +#define BZERO(s, n) memset(s, 0, n) +#define BCMP(s1, s2, l) memcmp(s1, s2, l) + +#define PRINTMSG(m, l) { ppp_info("Remote message: %0.*v", l, m); } + +/* + * MAKEHEADER - Add Header fields to a packet. + */ +#define MAKEHEADER(p, t) { \ + PUTCHAR(PPP_ALLSTATIONS, p); \ + PUTCHAR(PPP_UI, p); \ + PUTSHORT(t, p); } + +/* Procedures exported from auth.c */ +void link_required(ppp_pcb *pcb); /* we are starting to use the link */ +void link_terminated(ppp_pcb *pcb); /* we are finished with the link */ +void link_down(ppp_pcb *pcb); /* the LCP layer has left the Opened state */ +void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */ +void link_established(ppp_pcb *pcb); /* the link is up; authenticate now */ +void start_networks(ppp_pcb *pcb); /* start all the network control protos */ +void continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos */ +#if PPP_AUTH_SUPPORT +#if PPP_SERVER +int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen); + /* check the user name and passwd against configuration */ +void auth_peer_fail(ppp_pcb *pcb, int protocol); + /* peer failed to authenticate itself */ +void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen); + /* peer successfully authenticated itself */ +#endif /* PPP_SERVER */ +void auth_withpeer_fail(ppp_pcb *pcb, int protocol); + /* we failed to authenticate ourselves */ +void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor); + /* we successfully authenticated ourselves */ +#endif /* PPP_AUTH_SUPPORT */ +void np_up(ppp_pcb *pcb, int proto); /* a network protocol has come up */ +void np_down(ppp_pcb *pcb, int proto); /* a network protocol has gone down */ +void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */ +#if PPP_AUTH_SUPPORT +int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server); + /* get "secret" for chap */ +#endif /* PPP_AUTH_SUPPORT */ + +/* Procedures exported from ipcp.c */ +/* int parse_dotted_ip (char *, u32_t *); */ + +/* Procedures exported from demand.c */ +#if DEMAND_SUPPORT +void demand_conf (void); /* config interface(s) for demand-dial */ +void demand_block (void); /* set all NPs to queue up packets */ +void demand_unblock (void); /* set all NPs to pass packets */ +void demand_discard (void); /* set all NPs to discard packets */ +void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/ +int loop_chars (unsigned char *, int); /* process chars from loopback */ +int loop_frame (unsigned char *, int); /* should we bring link up? */ +#endif /* DEMAND_SUPPORT */ + +/* Procedures exported from multilink.c */ +#ifdef HAVE_MULTILINK +void mp_check_options (void); /* Check multilink-related options */ +int mp_join_bundle (void); /* join our link to an appropriate bundle */ +void mp_exit_bundle (void); /* have disconnected our link from bundle */ +void mp_bundle_terminated (void); +char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */ +int str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */ +#else +#define mp_bundle_terminated() /* nothing */ +#define mp_exit_bundle() /* nothing */ +#define doing_multilink 0 +#define multilink_master 0 +#endif + +/* Procedures exported from utils.c. */ +void ppp_print_string(const u_char *p, int len, void (*printer) (void *, const char *, ...), void *arg); /* Format a string for output */ +int ppp_slprintf(char *buf, int buflen, const char *fmt, ...); /* sprintf++ */ +int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args); /* vsprintf++ */ +size_t ppp_strlcpy(char *dest, const char *src, size_t len); /* safe strcpy */ +size_t ppp_strlcat(char *dest, const char *src, size_t len); /* safe strncpy */ +void ppp_dbglog(const char *fmt, ...); /* log a debug message */ +void ppp_info(const char *fmt, ...); /* log an informational message */ +void ppp_notice(const char *fmt, ...); /* log a notice-level message */ +void ppp_warn(const char *fmt, ...); /* log a warning message */ +void ppp_error(const char *fmt, ...); /* log an error message */ +void ppp_fatal(const char *fmt, ...); /* log an error message and die(1) */ +#if PRINTPKT_SUPPORT +void ppp_dump_packet(ppp_pcb *pcb, const char *tag, unsigned char *p, int len); + /* dump packet to debug log if interesting */ +#endif /* PRINTPKT_SUPPORT */ + +/* + * Number of necessary timers analysis. + * + * PPP use at least one timer per each of its protocol, but not all protocols are + * active at the same time, thus the number of necessary timeouts is actually + * lower than enabled protocols. Here is the actual necessary timeouts based + * on code analysis. + * + * Note that many features analysed here are not working at all and are only + * there for a comprehensive analysis of necessary timers in order to prevent + * having to redo that each time we add a feature. + * + * Timer list + * + * | holdoff timeout + * | low level protocol timeout (PPPoE or PPPoL2P) + * | LCP delayed UP + * | LCP retransmit (FSM) + * | LCP Echo timer + * .| PAP or CHAP or EAP authentication + * . | ECP retransmit (FSM) + * . | CCP retransmit (FSM) when MPPE is enabled + * . | CCP retransmit (FSM) when MPPE is NOT enabled + * . | IPCP retransmit (FSM) + * . .| IP6CP retransmit (FSM) + * . . | Idle time limit + * . . | Max connect time + * . . | Max octets + * . . | CCP RACK timeout + * . . . + * PPP_PHASE_DEAD + * PPP_PHASE_HOLDOFF + * | . . . + * PPP_PHASE_INITIALIZE + * | . . . + * PPP_PHASE_ESTABLISH + * | . . . + * |. . . + * | . . + * PPP_PHASE_AUTHENTICATE + * | . . + * || . . + * PPP_PHASE_NETWORK + * | || . . + * | ||| . + * PPP_PHASE_RUNNING + * | .||||| + * | . |||| + * PPP_PHASE_TERMINATE + * | . |||| + * PPP_PHASE_NETWORK + * |. . + * PPP_PHASE_ESTABLISH + * PPP_PHASE_DISCONNECT + * PPP_PHASE_DEAD + * + * Alright, PPP basic retransmission and LCP Echo consume one timer. + * 1 + * + * If authentication is enabled one timer is necessary during authentication. + * 1 + PPP_AUTH_SUPPORT + * + * If ECP is enabled one timer is necessary before IPCP and/or IP6CP, one more + * is necessary if CCP is enabled (only with MPPE support but we don't care much + * up to this detail level). + * 1 + ECP_SUPPORT + CCP_SUPPORT + * + * If CCP is enabled it might consume a timer during IPCP or IP6CP, thus + * we might use IPCP, IP6CP and CCP timers simultaneously. + * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT + * + * When entering running phase, IPCP or IP6CP is still running. If idle time limit + * is enabled one more timer is necessary. Same for max connect time and max + * octets features. Furthermore CCP RACK might be used past this point. + * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT + * + * IPv4 or IPv6 must be enabled, therefore we don't need to take care the authentication + * and the CCP + ECP case, thus reducing overall complexity. + * 1 + LWIP_MAX(PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT, PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS + CCP_SUPPORT) + * + * We don't support PPP_IDLETIMELIMIT + PPP_MAXCONNECT + MAXOCTETS features + * and adding those defines to ppp_opts.h just for having the value always + * defined to 0 isn't worth it. + * 1 + LWIP_MAX(PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT, PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT -1 + CCP_SUPPORT) + * + * Thus, the following is enough for now. + * 1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT + */ + +#ifdef __cplusplus +} +#endif + +#endif /* PPP_SUPPORT */ +#endif /* LWIP_HDR_PPP_IMPL_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_opts.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_opts.h new file mode 100644 index 0000000..479a006 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/ppp_opts.h @@ -0,0 +1,617 @@ +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef LWIP_PPP_OPTS_H +#define LWIP_PPP_OPTS_H + +#include "lwip/opt.h" + +/** + * PPP_SUPPORT==1: Enable PPP. + */ +#ifndef PPP_SUPPORT +#define PPP_SUPPORT 0 +#endif + +/** + * PPPOE_SUPPORT==1: Enable PPP Over Ethernet + */ +#ifndef PPPOE_SUPPORT +#define PPPOE_SUPPORT 0 +#endif + +/** + * PPPOE_SCNAME_SUPPORT==1: Enable PPP Over Ethernet Service Name and Concentrator Name support + */ +#ifndef PPPOE_SCNAME_SUPPORT +#define PPPOE_SCNAME_SUPPORT 0 +#endif + +/** + * PPPOL2TP_SUPPORT==1: Enable PPP Over L2TP + */ +#ifndef PPPOL2TP_SUPPORT +#define PPPOL2TP_SUPPORT 0 +#endif + +/** + * PPPOL2TP_AUTH_SUPPORT==1: Enable PPP Over L2TP Auth (enable MD5 support) + */ +#ifndef PPPOL2TP_AUTH_SUPPORT +#define PPPOL2TP_AUTH_SUPPORT PPPOL2TP_SUPPORT +#endif + +/** + * PPPOS_SUPPORT==1: Enable PPP Over Serial + */ +#ifndef PPPOS_SUPPORT +#define PPPOS_SUPPORT PPP_SUPPORT +#endif + +/** + * LWIP_PPP_API==1: Enable PPP API (in pppapi.c) + */ +#ifndef LWIP_PPP_API +#define LWIP_PPP_API (PPP_SUPPORT && (NO_SYS == 0)) +#endif + +#if PPP_SUPPORT + +/** + * MEMP_NUM_PPP_PCB: the number of simultaneously active PPP + * connections (requires the PPP_SUPPORT option) + */ +#ifndef MEMP_NUM_PPP_PCB +#define MEMP_NUM_PPP_PCB 1 +#endif + +/** + * PPP_NUM_TIMEOUTS_PER_PCB: the number of sys_timeouts running in parallel per + * ppp_pcb. See the detailed explanation at the end of ppp_impl.h about simultaneous + * timers analysis. + */ +#ifndef PPP_NUM_TIMEOUTS_PER_PCB +#define PPP_NUM_TIMEOUTS_PER_PCB (1 + PPP_IPV4_SUPPORT + PPP_IPV6_SUPPORT + CCP_SUPPORT) +#endif + +/* The number of sys_timeouts required for the PPP module */ +#define PPP_NUM_TIMEOUTS (PPP_SUPPORT * PPP_NUM_TIMEOUTS_PER_PCB * MEMP_NUM_PPP_PCB) + +/** + * MEMP_NUM_PPPOS_INTERFACES: the number of concurrently active PPPoS + * interfaces (only used with PPPOS_SUPPORT==1) + */ +#ifndef MEMP_NUM_PPPOS_INTERFACES +#define MEMP_NUM_PPPOS_INTERFACES MEMP_NUM_PPP_PCB +#endif + +/** + * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE + * interfaces (only used with PPPOE_SUPPORT==1) + */ +#ifndef MEMP_NUM_PPPOE_INTERFACES +#define MEMP_NUM_PPPOE_INTERFACES 1 +#endif + +/** + * MEMP_NUM_PPPOL2TP_INTERFACES: the number of concurrently active PPPoL2TP + * interfaces (only used with PPPOL2TP_SUPPORT==1) + */ +#ifndef MEMP_NUM_PPPOL2TP_INTERFACES +#define MEMP_NUM_PPPOL2TP_INTERFACES 1 +#endif + +/** + * MEMP_NUM_PPP_API_MSG: Number of concurrent PPP API messages (in pppapi.c) + */ +#ifndef MEMP_NUM_PPP_API_MSG +#define MEMP_NUM_PPP_API_MSG 5 +#endif + +/** + * PPP_DEBUG: Enable debugging for PPP. + */ +#ifndef PPP_DEBUG +#define PPP_DEBUG LWIP_DBG_OFF +#endif + +/** + * PPP_INPROC_IRQ_SAFE==1 call pppos_input() using tcpip_callback(). + * + * Please read the "PPPoS input path" chapter in the PPP documentation about this option. + */ +#ifndef PPP_INPROC_IRQ_SAFE +#define PPP_INPROC_IRQ_SAFE 0 +#endif + +/** + * PRINTPKT_SUPPORT==1: Enable PPP print packet support + * + * Mandatory for debugging, it displays exchanged packet content in debug trace. + */ +#ifndef PRINTPKT_SUPPORT +#define PRINTPKT_SUPPORT 0 +#endif + +/** + * PPP_IPV4_SUPPORT==1: Enable PPP IPv4 support + */ +#ifndef PPP_IPV4_SUPPORT +#define PPP_IPV4_SUPPORT (LWIP_IPV4) +#endif + +/** + * PPP_IPV6_SUPPORT==1: Enable PPP IPv6 support + */ +#ifndef PPP_IPV6_SUPPORT +#define PPP_IPV6_SUPPORT (LWIP_IPV6) +#endif + +/** + * PPP_NOTIFY_PHASE==1: Support PPP notify phase support + * + * PPP notify phase support allows you to set a callback which is + * called on change of the internal PPP state machine. + * + * This can be used for example to set a LED pattern depending on the + * current phase of the PPP session. + */ +#ifndef PPP_NOTIFY_PHASE +#define PPP_NOTIFY_PHASE 0 +#endif + +/** + * pbuf_type PPP is using for LCP, PAP, CHAP, EAP, CCP, IPCP and IP6CP packets. + * + * Memory allocated must be single buffered for PPP to works, it requires pbuf + * that are not going to be chained when allocated. This requires setting + * PBUF_POOL_BUFSIZE to at least 512 bytes, which is quite huge for small systems. + * + * Setting PPP_USE_PBUF_RAM to 1 makes PPP use memory from heap where continuous + * buffers are required, allowing you to use a smaller PBUF_POOL_BUFSIZE. + */ +#ifndef PPP_USE_PBUF_RAM +#define PPP_USE_PBUF_RAM 0 +#endif + +/** + * PPP_FCS_TABLE: Keep a 256*2 byte table to speed up FCS calculation for PPPoS + */ +#ifndef PPP_FCS_TABLE +#define PPP_FCS_TABLE 1 +#endif + +/** + * PAP_SUPPORT==1: Support PAP. + */ +#ifndef PAP_SUPPORT +#define PAP_SUPPORT 0 +#endif + +/** + * CHAP_SUPPORT==1: Support CHAP. + */ +#ifndef CHAP_SUPPORT +#define CHAP_SUPPORT 0 +#endif + +/** + * MSCHAP_SUPPORT==1: Support MSCHAP. + */ +#ifndef MSCHAP_SUPPORT +#define MSCHAP_SUPPORT 0 +#endif +#if MSCHAP_SUPPORT +/* MSCHAP requires CHAP support */ +#undef CHAP_SUPPORT +#define CHAP_SUPPORT 1 +#endif /* MSCHAP_SUPPORT */ + +/** + * EAP_SUPPORT==1: Support EAP. + */ +#ifndef EAP_SUPPORT +#define EAP_SUPPORT 0 +#endif + +/** + * CCP_SUPPORT==1: Support CCP. + */ +#ifndef CCP_SUPPORT +#define CCP_SUPPORT 0 +#endif + +/** + * MPPE_SUPPORT==1: Support MPPE. + */ +#ifndef MPPE_SUPPORT +#define MPPE_SUPPORT 0 +#endif +#if MPPE_SUPPORT +/* MPPE requires CCP support */ +#undef CCP_SUPPORT +#define CCP_SUPPORT 1 +/* MPPE requires MSCHAP support */ +#undef MSCHAP_SUPPORT +#define MSCHAP_SUPPORT 1 +/* MSCHAP requires CHAP support */ +#undef CHAP_SUPPORT +#define CHAP_SUPPORT 1 +#endif /* MPPE_SUPPORT */ + +/** + * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef CBCP_SUPPORT +#define CBCP_SUPPORT 0 +#endif + +/** + * ECP_SUPPORT==1: Support ECP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef ECP_SUPPORT +#define ECP_SUPPORT 0 +#endif + +/** + * DEMAND_SUPPORT==1: Support dial on demand. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef DEMAND_SUPPORT +#define DEMAND_SUPPORT 0 +#endif + +/** + * LQR_SUPPORT==1: Support Link Quality Report. Do nothing except exchanging some LCP packets. + */ +#ifndef LQR_SUPPORT +#define LQR_SUPPORT 0 +#endif + +/** + * PPP_SERVER==1: Enable PPP server support (waiting for incoming PPP session). + * + * Currently only supported for PPPoS. + */ +#ifndef PPP_SERVER +#define PPP_SERVER 0 +#endif + +#if PPP_SERVER +/* + * PPP_OUR_NAME: Our name for authentication purposes + */ +#ifndef PPP_OUR_NAME +#define PPP_OUR_NAME "lwIP" +#endif +#endif /* PPP_SERVER */ + +/** + * VJ_SUPPORT==1: Support VJ header compression. + */ +#ifndef VJ_SUPPORT +#define VJ_SUPPORT 1 +#endif +/* VJ compression is only supported for TCP over IPv4 over PPPoS. */ +#if !PPPOS_SUPPORT || !PPP_IPV4_SUPPORT || !LWIP_TCP +#undef VJ_SUPPORT +#define VJ_SUPPORT 0 +#endif /* !PPPOS_SUPPORT */ + +/** + * PPP_MD5_RANDM==1: Use MD5 for better randomness. + * Enabled by default if CHAP, EAP, or L2TP AUTH support is enabled. + */ +#ifndef PPP_MD5_RANDM +#define PPP_MD5_RANDM (CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT) +#endif + +/** + * PolarSSL embedded library + * + * + * lwIP contains some files fetched from the latest BSD release of + * the PolarSSL project (PolarSSL 0.10.1-bsd) for ciphers and encryption + * methods we need for lwIP PPP support. + * + * The PolarSSL files were cleaned to contain only the necessary struct + * fields and functions needed for lwIP. + * + * The PolarSSL API was not changed at all, so if you are already using + * PolarSSL you can choose to skip the compilation of the included PolarSSL + * library into lwIP. + * + * If you are not using the embedded copy you must include external + * libraries into your arch/cc.h port file. + * + * Beware of the stack requirements which can be a lot larger if you are not + * using our cleaned PolarSSL library. + */ + +/** + * LWIP_USE_EXTERNAL_POLARSSL: Use external PolarSSL library + */ +#ifndef LWIP_USE_EXTERNAL_POLARSSL +#define LWIP_USE_EXTERNAL_POLARSSL 0 +#endif + +/** + * LWIP_USE_EXTERNAL_MBEDTLS: Use external mbed TLS library + */ +#ifndef LWIP_USE_EXTERNAL_MBEDTLS +#define LWIP_USE_EXTERNAL_MBEDTLS 0 +#endif + +/* + * PPP Timeouts + */ + +/** + * FSM_DEFTIMEOUT: Timeout time in seconds + */ +#ifndef FSM_DEFTIMEOUT +#define FSM_DEFTIMEOUT 6 +#endif + +/** + * FSM_DEFMAXTERMREQS: Maximum Terminate-Request transmissions + */ +#ifndef FSM_DEFMAXTERMREQS +#define FSM_DEFMAXTERMREQS 2 +#endif + +/** + * FSM_DEFMAXCONFREQS: Maximum Configure-Request transmissions + */ +#ifndef FSM_DEFMAXCONFREQS +#define FSM_DEFMAXCONFREQS 10 +#endif + +/** + * FSM_DEFMAXNAKLOOPS: Maximum number of nak loops + */ +#ifndef FSM_DEFMAXNAKLOOPS +#define FSM_DEFMAXNAKLOOPS 5 +#endif + +/** + * UPAP_DEFTIMEOUT: Timeout (seconds) for retransmitting req + */ +#ifndef UPAP_DEFTIMEOUT +#define UPAP_DEFTIMEOUT 6 +#endif + +/** + * UPAP_DEFTRANSMITS: Maximum number of auth-reqs to send + */ +#ifndef UPAP_DEFTRANSMITS +#define UPAP_DEFTRANSMITS 10 +#endif + +#if PPP_SERVER +/** + * UPAP_DEFREQTIME: Time to wait for auth-req from peer + */ +#ifndef UPAP_DEFREQTIME +#define UPAP_DEFREQTIME 30 +#endif +#endif /* PPP_SERVER */ + +/** + * CHAP_DEFTIMEOUT: Timeout (seconds) for retransmitting req + */ +#ifndef CHAP_DEFTIMEOUT +#define CHAP_DEFTIMEOUT 6 +#endif + +/** + * CHAP_DEFTRANSMITS: max # times to send challenge + */ +#ifndef CHAP_DEFTRANSMITS +#define CHAP_DEFTRANSMITS 10 +#endif + +#if PPP_SERVER +/** + * CHAP_DEFRECHALLENGETIME: If this option is > 0, rechallenge the peer every n seconds + */ +#ifndef CHAP_DEFRECHALLENGETIME +#define CHAP_DEFRECHALLENGETIME 0 +#endif +#endif /* PPP_SERVER */ + +/** + * EAP_DEFREQTIME: Time to wait for peer request + */ +#ifndef EAP_DEFREQTIME +#define EAP_DEFREQTIME 6 +#endif + +/** + * EAP_DEFALLOWREQ: max # times to accept requests + */ +#ifndef EAP_DEFALLOWREQ +#define EAP_DEFALLOWREQ 10 +#endif + +#if PPP_SERVER +/** + * EAP_DEFTIMEOUT: Timeout (seconds) for rexmit + */ +#ifndef EAP_DEFTIMEOUT +#define EAP_DEFTIMEOUT 6 +#endif + +/** + * EAP_DEFTRANSMITS: max # times to transmit + */ +#ifndef EAP_DEFTRANSMITS +#define EAP_DEFTRANSMITS 10 +#endif +#endif /* PPP_SERVER */ + +/** + * LCP_DEFLOOPBACKFAIL: Default number of times we receive our magic number from the peer + * before deciding the link is looped-back. + */ +#ifndef LCP_DEFLOOPBACKFAIL +#define LCP_DEFLOOPBACKFAIL 10 +#endif + +/** + * LCP_ECHOINTERVAL: Interval in seconds between keepalive echo requests, 0 to disable. + */ +#ifndef LCP_ECHOINTERVAL +#define LCP_ECHOINTERVAL 0 +#endif + +/** + * LCP_MAXECHOFAILS: Number of unanswered echo requests before failure. + */ +#ifndef LCP_MAXECHOFAILS +#define LCP_MAXECHOFAILS 3 +#endif + +/** + * PPP_MAXIDLEFLAG: Max Xmit idle time (in ms) before resend flag char. + */ +#ifndef PPP_MAXIDLEFLAG +#define PPP_MAXIDLEFLAG 100 +#endif + +/** + * PPP Packet sizes + */ + +/** + * PPP_MRU: Default MRU + */ +#ifndef PPP_MRU +#define PPP_MRU 1500 +#endif + +/** + * PPP_DEFMRU: Default MRU to try + */ +#ifndef PPP_DEFMRU +#define PPP_DEFMRU 1500 +#endif + +/** + * PPP_MAXMRU: Normally limit MRU to this (pppd default = 16384) + */ +#ifndef PPP_MAXMRU +#define PPP_MAXMRU 1500 +#endif + +/** + * PPP_MINMRU: No MRUs below this + */ +#ifndef PPP_MINMRU +#define PPP_MINMRU 128 +#endif + +/** + * PPPOL2TP_DEFMRU: Default MTU and MRU for L2TP + * Default = 1500 - PPPoE(6) - PPP Protocol(2) - IPv4 header(20) - UDP Header(8) + * - L2TP Header(6) - HDLC Header(2) - PPP Protocol(2) - MPPE Header(2) - PPP Protocol(2) + */ +#if PPPOL2TP_SUPPORT +#ifndef PPPOL2TP_DEFMRU +#define PPPOL2TP_DEFMRU 1450 +#endif +#endif /* PPPOL2TP_SUPPORT */ + +/** + * MAXNAMELEN: max length of hostname or name for auth + */ +#ifndef MAXNAMELEN +#define MAXNAMELEN 256 +#endif + +/** + * MAXSECRETLEN: max length of password or secret + */ +#ifndef MAXSECRETLEN +#define MAXSECRETLEN 256 +#endif + +/* ------------------------------------------------------------------------- */ + +/* + * Build triggers for embedded PolarSSL + */ +#if !LWIP_USE_EXTERNAL_POLARSSL && !LWIP_USE_EXTERNAL_MBEDTLS + +/* CHAP, EAP, L2TP AUTH and MD5 Random require MD5 support */ +#if CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT || PPP_MD5_RANDM +#define LWIP_INCLUDED_POLARSSL_MD5 1 +#endif /* CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT || PPP_MD5_RANDM */ + +#if MSCHAP_SUPPORT + +/* MSCHAP require MD4 support */ +#define LWIP_INCLUDED_POLARSSL_MD4 1 +/* MSCHAP require SHA1 support */ +#define LWIP_INCLUDED_POLARSSL_SHA1 1 +/* MSCHAP require DES support */ +#define LWIP_INCLUDED_POLARSSL_DES 1 + +/* MS-CHAP support is required for MPPE */ +#if MPPE_SUPPORT +/* MPPE require ARC4 support */ +#define LWIP_INCLUDED_POLARSSL_ARC4 1 +#endif /* MPPE_SUPPORT */ + +#endif /* MSCHAP_SUPPORT */ + +#endif /* !LWIP_USE_EXTERNAL_POLARSSL && !LWIP_USE_EXTERNAL_MBEDTLS */ + +/* Default value if unset */ +#ifndef LWIP_INCLUDED_POLARSSL_MD4 +#define LWIP_INCLUDED_POLARSSL_MD4 0 +#endif /* LWIP_INCLUDED_POLARSSL_MD4 */ +#ifndef LWIP_INCLUDED_POLARSSL_MD5 +#define LWIP_INCLUDED_POLARSSL_MD5 0 +#endif /* LWIP_INCLUDED_POLARSSL_MD5 */ +#ifndef LWIP_INCLUDED_POLARSSL_SHA1 +#define LWIP_INCLUDED_POLARSSL_SHA1 0 +#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */ +#ifndef LWIP_INCLUDED_POLARSSL_DES +#define LWIP_INCLUDED_POLARSSL_DES 0 +#endif /* LWIP_INCLUDED_POLARSSL_DES */ +#ifndef LWIP_INCLUDED_POLARSSL_ARC4 +#define LWIP_INCLUDED_POLARSSL_ARC4 0 +#endif /* LWIP_INCLUDED_POLARSSL_ARC4 */ + +#endif /* PPP_SUPPORT */ + +/* Default value if unset */ +#ifndef PPP_NUM_TIMEOUTS +#define PPP_NUM_TIMEOUTS 0 +#endif /* PPP_NUM_TIMEOUTS */ + +#endif /* LWIP_PPP_OPTS_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppapi.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppapi.h new file mode 100644 index 0000000..913d93f --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppapi.h @@ -0,0 +1,137 @@ +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef LWIP_PPPAPI_H +#define LWIP_PPPAPI_H + +#include "netif/ppp/ppp_opts.h" + +#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sys.h" +#include "lwip/netif.h" +#include "lwip/priv/tcpip_priv.h" +#include "netif/ppp/ppp.h" +#if PPPOS_SUPPORT +#include "netif/ppp/pppos.h" +#endif /* PPPOS_SUPPORT */ + +#ifdef __cplusplus +extern "C" { +#endif + +struct pppapi_msg_msg { + ppp_pcb *ppp; + union { +#if PPP_NOTIFY_PHASE + struct { + ppp_notify_phase_cb_fn notify_phase_cb; + } setnotifyphasecb; +#endif /* PPP_NOTIFY_PHASE */ +#if PPPOS_SUPPORT + struct { + struct netif *pppif; + pppos_output_cb_fn output_cb; + ppp_link_status_cb_fn link_status_cb; + void *ctx_cb; + } serialcreate; +#endif /* PPPOS_SUPPORT */ +#if PPPOE_SUPPORT + struct { + struct netif *pppif; + struct netif *ethif; + const char *service_name; + const char *concentrator_name; + ppp_link_status_cb_fn link_status_cb; + void *ctx_cb; + } ethernetcreate; +#endif /* PPPOE_SUPPORT */ +#if PPPOL2TP_SUPPORT + struct { + struct netif *pppif; + struct netif *netif; + API_MSG_M_DEF_C(ip_addr_t, ipaddr); + u16_t port; +#if PPPOL2TP_AUTH_SUPPORT + const u8_t *secret; + u8_t secret_len; +#endif /* PPPOL2TP_AUTH_SUPPORT */ + ppp_link_status_cb_fn link_status_cb; + void *ctx_cb; + } l2tpcreate; +#endif /* PPPOL2TP_SUPPORT */ + struct { + u16_t holdoff; + } connect; + struct { + u8_t nocarrier; + } close; + struct { + u8_t cmd; + void *arg; + } ioctl; + } msg; +}; + +struct pppapi_msg { + struct tcpip_api_call_data call; + struct pppapi_msg_msg msg; +}; + +/* API for application */ +err_t pppapi_set_default(ppp_pcb *pcb); +#if PPP_NOTIFY_PHASE +err_t pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb); +#endif /* PPP_NOTIFY_PHASE */ +#if PPPOS_SUPPORT +ppp_pcb *pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, ppp_link_status_cb_fn link_status_cb, void *ctx_cb); +#endif /* PPPOS_SUPPORT */ +#if PPPOE_SUPPORT +ppp_pcb *pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name, + const char *concentrator_name, ppp_link_status_cb_fn link_status_cb, + void *ctx_cb); +#endif /* PPPOE_SUPPORT */ +#if PPPOL2TP_SUPPORT +ppp_pcb *pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port, + const u8_t *secret, u8_t secret_len, + ppp_link_status_cb_fn link_status_cb, void *ctx_cb); +#endif /* PPPOL2TP_SUPPORT */ +err_t pppapi_connect(ppp_pcb *pcb, u16_t holdoff); +#if PPP_SERVER +err_t pppapi_listen(ppp_pcb *pcb); +#endif /* PPP_SERVER */ +err_t pppapi_close(ppp_pcb *pcb, u8_t nocarrier); +err_t pppapi_free(ppp_pcb *pcb); +err_t pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_PPP_API */ + +#endif /* LWIP_PPPAPI_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppcrypt.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppcrypt.h new file mode 100644 index 0000000..c0230bb --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppcrypt.h @@ -0,0 +1,144 @@ +/* + * pppcrypt.c - PPP/DES linkage for MS-CHAP and EAP SRP-SHA1 + * + * Extracted from chap_ms.c by James Carlson. + * + * Copyright (c) 1995 Eric Rosenquist. All rights reserved. + * + * 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. The name(s) of the authors of this software must not be used to + * endorse or promote products derived from this software without + * prior written permission. + * + * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +/* This header file is included in all PPP modules needing hashes and/or ciphers */ + +#ifndef PPPCRYPT_H +#define PPPCRYPT_H + +/* + * If included PolarSSL copy is not used, user is expected to include + * external libraries in arch/cc.h (which is included by lwip/arch.h). + */ +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Map hashes and ciphers functions to PolarSSL + */ +#if !LWIP_USE_EXTERNAL_MBEDTLS + +#include "netif/ppp/polarssl/md4.h" +#define lwip_md4_context md4_context +#define lwip_md4_init(context) +#define lwip_md4_starts md4_starts +#define lwip_md4_update md4_update +#define lwip_md4_finish md4_finish +#define lwip_md4_free(context) + +#include "netif/ppp/polarssl/md5.h" +#define lwip_md5_context md5_context +#define lwip_md5_init(context) +#define lwip_md5_starts md5_starts +#define lwip_md5_update md5_update +#define lwip_md5_finish md5_finish +#define lwip_md5_free(context) + +#include "netif/ppp/polarssl/sha1.h" +#define lwip_sha1_context sha1_context +#define lwip_sha1_init(context) +#define lwip_sha1_starts sha1_starts +#define lwip_sha1_update sha1_update +#define lwip_sha1_finish sha1_finish +#define lwip_sha1_free(context) + +#include "netif/ppp/polarssl/des.h" +#define lwip_des_context des_context +#define lwip_des_init(context) +#define lwip_des_setkey_enc des_setkey_enc +#define lwip_des_crypt_ecb des_crypt_ecb +#define lwip_des_free(context) + +#include "netif/ppp/polarssl/arc4.h" +#define lwip_arc4_context arc4_context +#define lwip_arc4_init(context) +#define lwip_arc4_setup arc4_setup +#define lwip_arc4_crypt arc4_crypt +#define lwip_arc4_free(context) + +#endif /* !LWIP_USE_EXTERNAL_MBEDTLS */ + +/* + * Map hashes and ciphers functions to mbed TLS + */ +#if LWIP_USE_EXTERNAL_MBEDTLS + +#define lwip_md4_context mbedtls_md4_context +#define lwip_md4_init mbedtls_md4_init +#define lwip_md4_starts mbedtls_md4_starts +#define lwip_md4_update mbedtls_md4_update +#define lwip_md4_finish mbedtls_md4_finish +#define lwip_md4_free mbedtls_md4_free + +#define lwip_md5_context mbedtls_md5_context +#define lwip_md5_init mbedtls_md5_init +#define lwip_md5_starts mbedtls_md5_starts +#define lwip_md5_update mbedtls_md5_update +#define lwip_md5_finish mbedtls_md5_finish +#define lwip_md5_free mbedtls_md5_free + +#define lwip_sha1_context mbedtls_sha1_context +#define lwip_sha1_init mbedtls_sha1_init +#define lwip_sha1_starts mbedtls_sha1_starts +#define lwip_sha1_update mbedtls_sha1_update +#define lwip_sha1_finish mbedtls_sha1_finish +#define lwip_sha1_free mbedtls_sha1_free + +#define lwip_des_context mbedtls_des_context +#define lwip_des_init mbedtls_des_init +#define lwip_des_setkey_enc mbedtls_des_setkey_enc +#define lwip_des_crypt_ecb mbedtls_des_crypt_ecb +#define lwip_des_free mbedtls_des_free + +#define lwip_arc4_context mbedtls_arc4_context +#define lwip_arc4_init mbedtls_arc4_init +#define lwip_arc4_setup mbedtls_arc4_setup +#define lwip_arc4_crypt(context, buffer, length) mbedtls_arc4_crypt(context, length, buffer, buffer) +#define lwip_arc4_free mbedtls_arc4_free + +#endif /* LWIP_USE_EXTERNAL_MBEDTLS */ + +void pppcrypt_56_to_64_bit_key(u_char *key, u_char *des_key); + +#ifdef __cplusplus +} +#endif + +#endif /* PPPCRYPT_H */ + +#endif /* PPP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppdebug.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppdebug.h new file mode 100644 index 0000000..5e6741b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppdebug.h @@ -0,0 +1,88 @@ +/***************************************************************************** +* pppdebug.h - System debugging utilities. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1998 Global Election Systems Inc. +* portions Copyright (c) 2001 by Cognizant Pty Ltd. +* +* 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 and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE 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 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. +* +****************************************************************************** +* REVISION HISTORY (please don't use tabs!) +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 98-07-29 Guy Lancaster , Global Election Systems Inc. +* Original. +* +***************************************************************************** +*/ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef PPPDEBUG_H +#define PPPDEBUG_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Trace levels. */ +#define LOG_CRITICAL (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE) +#define LOG_ERR (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE) +#define LOG_NOTICE (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING) +#define LOG_WARNING (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING) +#define LOG_INFO (PPP_DEBUG) +#define LOG_DETAIL (PPP_DEBUG) +#define LOG_DEBUG (PPP_DEBUG) + +#if PPP_DEBUG + +#define MAINDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define SYSDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define FSMDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define LCPDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define IPCPDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define IPV6CPDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define UPAPDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define CHAPDEBUG(a) LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a) +#define PPPDEBUG(a, b) LWIP_DEBUGF(a, b) + +#else /* PPP_DEBUG */ + +#define MAINDEBUG(a) +#define SYSDEBUG(a) +#define FSMDEBUG(a) +#define LCPDEBUG(a) +#define IPCPDEBUG(a) +#define IPV6CPDEBUG(a) +#define UPAPDEBUG(a) +#define CHAPDEBUG(a) +#define PPPDEBUG(a, b) + +#endif /* PPP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* PPPDEBUG_H */ + +#endif /* PPP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppoe.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppoe.h new file mode 100644 index 0000000..acdd3ea --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppoe.h @@ -0,0 +1,187 @@ +/***************************************************************************** +* pppoe.h - PPP Over Ethernet implementation for lwIP. +* +* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. +* +* 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 and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE 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 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. +* +****************************************************************************** +* REVISION HISTORY +* +* 06-01-01 Marc Boucher +* Ported to lwIP. +*****************************************************************************/ + + + +/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ + +/*- + * Copyright (c) 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Martin Husemann . + * + * 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. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef PPP_OE_H +#define PPP_OE_H + +#include "ppp.h" +#include "lwip/etharp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct pppoehdr { + PACK_STRUCT_FLD_8(u8_t vertype); + PACK_STRUCT_FLD_8(u8_t code); + PACK_STRUCT_FIELD(u16_t session); + PACK_STRUCT_FIELD(u16_t plen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct pppoetag { + PACK_STRUCT_FIELD(u16_t tag); + PACK_STRUCT_FIELD(u16_t len); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +#define PPPOE_STATE_INITIAL 0 +#define PPPOE_STATE_PADI_SENT 1 +#define PPPOE_STATE_PADR_SENT 2 +#define PPPOE_STATE_SESSION 3 +/* passive */ +#define PPPOE_STATE_PADO_SENT 1 + +#define PPPOE_HEADERLEN sizeof(struct pppoehdr) +#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ + +#define PPPOE_TAG_EOL 0x0000 /* end of list */ +#define PPPOE_TAG_SNAME 0x0101 /* service name */ +#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ +#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ +#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ +#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ +#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ +#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ +#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ +#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ + +#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ +#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ +#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ +#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ +#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ + +#ifndef PPPOE_MAX_AC_COOKIE_LEN +#define PPPOE_MAX_AC_COOKIE_LEN 64 +#endif + +struct pppoe_softc { + struct pppoe_softc *next; + struct netif *sc_ethif; /* ethernet interface we are using */ + ppp_pcb *pcb; /* PPP PCB */ + + struct eth_addr sc_dest; /* hardware address of concentrator */ + u16_t sc_session; /* PPPoE session id */ + u8_t sc_state; /* discovery phase or session connected */ + +#if PPPOE_SCNAME_SUPPORT + const char *sc_service_name; /* if != NULL: requested name of service */ + const char *sc_concentrator_name; /* if != NULL: requested concentrator id */ +#endif /* PPPOE_SCNAME_SUPPORT */ + u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */ + u8_t sc_ac_cookie_len; /* length of cookie data */ +#ifdef PPPOE_SERVER + u8_t *sc_hunique; /* content of host unique we must echo back */ + u8_t sc_hunique_len; /* length of host unique */ +#endif + u8_t sc_padi_retried; /* number of PADI retries already done */ + u8_t sc_padr_retried; /* number of PADR retries already done */ +}; + + +#define pppoe_init() /* compatibility define, no initialization needed */ + +ppp_pcb *pppoe_create(struct netif *pppif, + struct netif *ethif, + const char *service_name, const char *concentrator_name, + ppp_link_status_cb_fn link_status_cb, void *ctx_cb); + +/* + * Functions called from lwIP + * DO NOT CALL FROM lwIP USER APPLICATION. + */ +void pppoe_disc_input(struct netif *netif, struct pbuf *p); +void pppoe_data_input(struct netif *netif, struct pbuf *p); + +#ifdef __cplusplus +} +#endif + +#endif /* PPP_OE_H */ + +#endif /* PPP_SUPPORT && PPPOE_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppol2tp.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppol2tp.h new file mode 100644 index 0000000..1221ca1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppol2tp.h @@ -0,0 +1,209 @@ +/** + * @file + * Network Point to Point Protocol over Layer 2 Tunneling Protocol header file. + * + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PPPOL2TP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef PPPOL2TP_H +#define PPPOL2TP_H + +#include "ppp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Timeout */ +#define PPPOL2TP_CONTROL_TIMEOUT (5*1000) /* base for quick timeout calculation */ +#define PPPOL2TP_SLOW_RETRY (60*1000) /* persistent retry interval */ + +#define PPPOL2TP_MAXSCCRQ 4 /* retry SCCRQ four times (quickly) */ +#define PPPOL2TP_MAXICRQ 4 /* retry IRCQ four times */ +#define PPPOL2TP_MAXICCN 4 /* retry ICCN four times */ + +/* L2TP header flags */ +#define PPPOL2TP_HEADERFLAG_CONTROL 0x8000 +#define PPPOL2TP_HEADERFLAG_LENGTH 0x4000 +#define PPPOL2TP_HEADERFLAG_SEQUENCE 0x0800 +#define PPPOL2TP_HEADERFLAG_OFFSET 0x0200 +#define PPPOL2TP_HEADERFLAG_PRIORITY 0x0100 +#define PPPOL2TP_HEADERFLAG_VERSION 0x0002 + +/* Mandatory bits for control: Control, Length, Sequence, Version 2 */ +#define PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY (PPPOL2TP_HEADERFLAG_CONTROL|PPPOL2TP_HEADERFLAG_LENGTH|PPPOL2TP_HEADERFLAG_SEQUENCE|PPPOL2TP_HEADERFLAG_VERSION) +/* Forbidden bits for control: Offset, Priority */ +#define PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN (PPPOL2TP_HEADERFLAG_OFFSET|PPPOL2TP_HEADERFLAG_PRIORITY) + +/* Mandatory bits for data: Version 2 */ +#define PPPOL2TP_HEADERFLAG_DATA_MANDATORY (PPPOL2TP_HEADERFLAG_VERSION) + +/* AVP (Attribute Value Pair) header */ +#define PPPOL2TP_AVPHEADERFLAG_MANDATORY 0x8000 +#define PPPOL2TP_AVPHEADERFLAG_HIDDEN 0x4000 +#define PPPOL2TP_AVPHEADERFLAG_LENGTHMASK 0x03ff + +/* -- AVP - Message type */ +#define PPPOL2TP_AVPTYPE_MESSAGE 0 /* Message type */ + +/* Control Connection Management */ +#define PPPOL2TP_MESSAGETYPE_SCCRQ 1 /* Start Control Connection Request */ +#define PPPOL2TP_MESSAGETYPE_SCCRP 2 /* Start Control Connection Reply */ +#define PPPOL2TP_MESSAGETYPE_SCCCN 3 /* Start Control Connection Connected */ +#define PPPOL2TP_MESSAGETYPE_STOPCCN 4 /* Stop Control Connection Notification */ +#define PPPOL2TP_MESSAGETYPE_HELLO 6 /* Hello */ +/* Call Management */ +#define PPPOL2TP_MESSAGETYPE_OCRQ 7 /* Outgoing Call Request */ +#define PPPOL2TP_MESSAGETYPE_OCRP 8 /* Outgoing Call Reply */ +#define PPPOL2TP_MESSAGETYPE_OCCN 9 /* Outgoing Call Connected */ +#define PPPOL2TP_MESSAGETYPE_ICRQ 10 /* Incoming Call Request */ +#define PPPOL2TP_MESSAGETYPE_ICRP 11 /* Incoming Call Reply */ +#define PPPOL2TP_MESSAGETYPE_ICCN 12 /* Incoming Call Connected */ +#define PPPOL2TP_MESSAGETYPE_CDN 14 /* Call Disconnect Notify */ +/* Error reporting */ +#define PPPOL2TP_MESSAGETYPE_WEN 15 /* WAN Error Notify */ +/* PPP Session Control */ +#define PPPOL2TP_MESSAGETYPE_SLI 16 /* Set Link Info */ + +/* -- AVP - Result code */ +#define PPPOL2TP_AVPTYPE_RESULTCODE 1 /* Result code */ +#define PPPOL2TP_RESULTCODE 1 /* General request to clear control connection */ + +/* -- AVP - Protocol version (!= L2TP Header version) */ +#define PPPOL2TP_AVPTYPE_VERSION 2 +#define PPPOL2TP_VERSION 0x0100 /* L2TP Protocol version 1, revision 0 */ + +/* -- AVP - Framing capabilities */ +#define PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES 3 /* Bearer capabilities */ +#define PPPOL2TP_FRAMINGCAPABILITIES 0x00000003 /* Async + Sync framing */ + +/* -- AVP - Bearer capabilities */ +#define PPPOL2TP_AVPTYPE_BEARERCAPABILITIES 4 /* Bearer capabilities */ +#define PPPOL2TP_BEARERCAPABILITIES 0x00000003 /* Analog + Digital Access */ + +/* -- AVP - Tie breaker */ +#define PPPOL2TP_AVPTYPE_TIEBREAKER 5 + +/* -- AVP - Host name */ +#define PPPOL2TP_AVPTYPE_HOSTNAME 7 /* Host name */ +#define PPPOL2TP_HOSTNAME "lwIP" /* FIXME: make it configurable */ + +/* -- AVP - Vendor name */ +#define PPPOL2TP_AVPTYPE_VENDORNAME 8 /* Vendor name */ +#define PPPOL2TP_VENDORNAME "lwIP" /* FIXME: make it configurable */ + +/* -- AVP - Assign tunnel ID */ +#define PPPOL2TP_AVPTYPE_TUNNELID 9 /* Assign Tunnel ID */ + +/* -- AVP - Receive window size */ +#define PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE 10 /* Receive window size */ +#define PPPOL2TP_RECEIVEWINDOWSIZE 8 /* FIXME: make it configurable */ + +/* -- AVP - Challenge */ +#define PPPOL2TP_AVPTYPE_CHALLENGE 11 /* Challenge */ + +/* -- AVP - Cause code */ +#define PPPOL2TP_AVPTYPE_CAUSECODE 12 /* Cause code*/ + +/* -- AVP - Challenge response */ +#define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE 13 /* Challenge response */ +#define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE 16 + +/* -- AVP - Assign session ID */ +#define PPPOL2TP_AVPTYPE_SESSIONID 14 /* Assign Session ID */ + +/* -- AVP - Call serial number */ +#define PPPOL2TP_AVPTYPE_CALLSERIALNUMBER 15 /* Call Serial Number */ + +/* -- AVP - Framing type */ +#define PPPOL2TP_AVPTYPE_FRAMINGTYPE 19 /* Framing Type */ +#define PPPOL2TP_FRAMINGTYPE 0x00000001 /* Sync framing */ + +/* -- AVP - TX Connect Speed */ +#define PPPOL2TP_AVPTYPE_TXCONNECTSPEED 24 /* TX Connect Speed */ +#define PPPOL2TP_TXCONNECTSPEED 100000000 /* Connect speed: 100 Mbits/s */ + +/* L2TP Session state */ +#define PPPOL2TP_STATE_INITIAL 0 +#define PPPOL2TP_STATE_SCCRQ_SENT 1 +#define PPPOL2TP_STATE_ICRQ_SENT 2 +#define PPPOL2TP_STATE_ICCN_SENT 3 +#define PPPOL2TP_STATE_DATA 4 + +#define PPPOL2TP_OUTPUT_DATA_HEADER_LEN 6 /* Our data header len */ + +/* + * PPPoL2TP interface control block. + */ +typedef struct pppol2tp_pcb_s pppol2tp_pcb; +struct pppol2tp_pcb_s { + ppp_pcb *ppp; /* PPP PCB */ + u8_t phase; /* L2TP phase */ + struct udp_pcb *udp; /* UDP L2TP Socket */ + struct netif *netif; /* Output interface, used as a default route */ + ip_addr_t remote_ip; /* LNS IP Address */ + u16_t remote_port; /* LNS port */ +#if PPPOL2TP_AUTH_SUPPORT + const u8_t *secret; /* Secret string */ + u8_t secret_len; /* Secret string length */ + u8_t secret_rv[16]; /* Random vector */ + u8_t challenge_hash[16]; /* Challenge response */ + u8_t send_challenge; /* Boolean whether the next sent packet should contains a challenge response */ +#endif /* PPPOL2TP_AUTH_SUPPORT */ + + u16_t tunnel_port; /* Tunnel port */ + u16_t our_ns; /* NS to peer */ + u16_t peer_nr; /* NR from peer */ + u16_t peer_ns; /* Expected NS from peer */ + u16_t source_tunnel_id; /* Tunnel ID assigned by peer */ + u16_t remote_tunnel_id; /* Tunnel ID assigned to peer */ + u16_t source_session_id; /* Session ID assigned by peer */ + u16_t remote_session_id; /* Session ID assigned to peer */ + + u8_t sccrq_retried; /* number of SCCRQ retries already done */ + u8_t icrq_retried; /* number of ICRQ retries already done */ + u8_t iccn_retried; /* number of ICCN retries already done */ +}; + + +/* Create a new L2TP session. */ +ppp_pcb *pppol2tp_create(struct netif *pppif, + struct netif *netif, const ip_addr_t *ipaddr, u16_t port, + const u8_t *secret, u8_t secret_len, + ppp_link_status_cb_fn link_status_cb, void *ctx_cb); + +#ifdef __cplusplus +} +#endif + +#endif /* PPPOL2TP_H */ +#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppos.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppos.h new file mode 100644 index 0000000..380a965 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/pppos.h @@ -0,0 +1,126 @@ +/** + * @file + * Network Point to Point Protocol over Serial header file. + * + */ + +/* + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PPPOS_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef PPPOS_H +#define PPPOS_H + +#include "lwip/sys.h" + +#include "ppp.h" +#include "vj.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* PPP packet parser states. Current state indicates operation yet to be + * completed. */ +enum { + PDIDLE = 0, /* Idle state - waiting. */ + PDSTART, /* Process start flag. */ + PDADDRESS, /* Process address field. */ + PDCONTROL, /* Process control field. */ + PDPROTOCOL1, /* Process protocol field 1. */ + PDPROTOCOL2, /* Process protocol field 2. */ + PDDATA /* Process data byte. */ +}; + +/* PPPoS serial output callback function prototype */ +typedef u32_t (*pppos_output_cb_fn)(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx); + +/* + * Extended asyncmap - allows any character to be escaped. + */ +typedef u8_t ext_accm[32]; + +/* + * PPPoS interface control block. + */ +typedef struct pppos_pcb_s pppos_pcb; +struct pppos_pcb_s { + /* -- below are data that will NOT be cleared between two sessions */ + ppp_pcb *ppp; /* PPP PCB */ + pppos_output_cb_fn output_cb; /* PPP serial output callback */ + + /* -- below are data that will be cleared between two sessions + * + * last_xmit must be the first member of cleared members, because it is + * used to know which part must not be cleared. + */ + u32_t last_xmit; /* Time of last transmission. */ + ext_accm out_accm; /* Async-Ctl-Char-Map for output. */ + + /* flags */ + unsigned int open :1; /* Set if PPPoS is open */ + unsigned int pcomp :1; /* Does peer accept protocol compression? */ + unsigned int accomp :1; /* Does peer accept addr/ctl compression? */ + + /* PPPoS rx */ + ext_accm in_accm; /* Async-Ctl-Char-Map for input. */ + struct pbuf *in_head, *in_tail; /* The input packet. */ + u16_t in_protocol; /* The input protocol code. */ + u16_t in_fcs; /* Input Frame Check Sequence value. */ + u8_t in_state; /* The input process state. */ + u8_t in_escaped; /* Escape next character. */ +}; + +/* Create a new PPPoS session. */ +ppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, + ppp_link_status_cb_fn link_status_cb, void *ctx_cb); + +#if !NO_SYS && !PPP_INPROC_IRQ_SAFE +/* Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread. */ +err_t pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l); +#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */ + +/* PPP over Serial: this is the input function to be called for received data. */ +void pppos_input(ppp_pcb *ppp, u8_t* data, int len); + + +/* + * Functions called from lwIP + * DO NOT CALL FROM lwIP USER APPLICATION. + */ +#if !NO_SYS && !PPP_INPROC_IRQ_SAFE +err_t pppos_input_sys(struct pbuf *p, struct netif *inp); +#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */ + +#ifdef __cplusplus +} +#endif + +#endif /* PPPOS_H */ +#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/upap.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/upap.h new file mode 100644 index 0000000..540d981 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/upap.h @@ -0,0 +1,131 @@ +/* + * upap.h - User/Password Authentication Protocol definitions. + * + * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. + * + * 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. The name "Carnegie Mellon University" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For permission or any legal + * details, please contact + * Office of Technology Transfer + * Carnegie Mellon University + * 5000 Forbes Avenue + * Pittsburgh, PA 15213-3890 + * (412) 268-4387, fax: (412) 268-7395 + * tech-transfer@andrew.cmu.edu + * + * 4. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by Computing Services + * at Carnegie Mellon University (http://www.cmu.edu/computing/)." + * + * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: upap.h,v 1.8 2002/12/04 23:03:33 paulus Exp $ + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && PAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef UPAP_H +#define UPAP_H + +#include "ppp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Packet header = Code, id, length. + */ +#define UPAP_HEADERLEN 4 + + +/* + * UPAP codes. + */ +#define UPAP_AUTHREQ 1 /* Authenticate-Request */ +#define UPAP_AUTHACK 2 /* Authenticate-Ack */ +#define UPAP_AUTHNAK 3 /* Authenticate-Nak */ + + +/* + * Client states. + */ +#define UPAPCS_INITIAL 0 /* Connection down */ +#define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */ +#define UPAPCS_PENDING 2 /* Connection down, have requested auth */ +#define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */ +#define UPAPCS_OPEN 4 /* We've received an Ack */ +#define UPAPCS_BADAUTH 5 /* We've received a Nak */ + +/* + * Server states. + */ +#define UPAPSS_INITIAL 0 /* Connection down */ +#define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */ +#define UPAPSS_PENDING 2 /* Connection down, have requested auth */ +#define UPAPSS_LISTEN 3 /* Listening for an Authenticate */ +#define UPAPSS_OPEN 4 /* We've sent an Ack */ +#define UPAPSS_BADAUTH 5 /* We've sent a Nak */ + + +/* + * Timeouts. + */ +#if 0 /* moved to ppp_opts.h */ +#define UPAP_DEFTIMEOUT 3 /* Timeout (seconds) for retransmitting req */ +#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ +#endif /* moved to ppp_opts.h */ + +/* + * Each interface is described by upap structure. + */ +#if PAP_SUPPORT +typedef struct upap_state { + const char *us_user; /* User */ + u8_t us_userlen; /* User length */ + const char *us_passwd; /* Password */ + u8_t us_passwdlen; /* Password length */ + u8_t us_clientstate; /* Client state */ +#if PPP_SERVER + u8_t us_serverstate; /* Server state */ +#endif /* PPP_SERVER */ + u8_t us_id; /* Current id */ + u8_t us_transmits; /* Number of auth-reqs sent */ +} upap_state; +#endif /* PAP_SUPPORT */ + + +void upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password); +#if PPP_SERVER +void upap_authpeer(ppp_pcb *pcb); +#endif /* PPP_SERVER */ + +extern const struct protent pap_protent; + +#ifdef __cplusplus +} +#endif + +#endif /* UPAP_H */ +#endif /* PPP_SUPPORT && PAP_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/vj.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/vj.h new file mode 100644 index 0000000..77d9976 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/ppp/vj.h @@ -0,0 +1,169 @@ +/* + * Definitions for tcp compression routines. + * + * $Id: vj.h,v 1.7 2010/02/22 17:52:09 goldsimon Exp $ + * + * Copyright (c) 1989 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: + * - Initial distribution. + */ + +#include "netif/ppp/ppp_opts.h" +#if PPP_SUPPORT && VJ_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#ifndef VJ_H +#define VJ_H + +#include "lwip/ip.h" +#include "lwip/priv/tcp_priv.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define MAX_SLOTS 16 /* must be > 2 and < 256 */ +#define MAX_HDR 128 + +/* + * Compressed packet format: + * + * The first octet contains the packet type (top 3 bits), TCP + * 'push' bit, and flags that indicate which of the 4 TCP sequence + * numbers have changed (bottom 5 bits). The next octet is a + * conversation number that associates a saved IP/TCP header with + * the compressed packet. The next two octets are the TCP checksum + * from the original datagram. The next 0 to 15 octets are + * sequence number changes, one change per bit set in the header + * (there may be no changes and there are two special cases where + * the receiver implicitly knows what changed -- see below). + * + * There are 5 numbers which can change (they are always inserted + * in the following order): TCP urgent pointer, window, + * acknowlegement, sequence number and IP ID. (The urgent pointer + * is different from the others in that its value is sent, not the + * change in value.) Since typical use of SLIP links is biased + * toward small packets (see comments on MTU/MSS below), changes + * use a variable length coding with one octet for numbers in the + * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the + * range 256 - 65535 or 0. (If the change in sequence number or + * ack is more than 65535, an uncompressed packet is sent.) + */ + +/* + * Packet types (must not conflict with IP protocol version) + * + * The top nibble of the first octet is the packet type. There are + * three possible types: IP (not proto TCP or tcp with one of the + * control flags set); uncompressed TCP (a normal IP/TCP packet but + * with the 8-bit protocol field replaced by an 8-bit connection id -- + * this type of packet syncs the sender & receiver); and compressed + * TCP (described above). + * + * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and + * is logically part of the 4-bit "changes" field that follows. Top + * three bits are actual packet type. For backward compatibility + * and in the interest of conserving bits, numbers are chosen so the + * IP protocol version number (4) which normally appears in this nibble + * means "IP packet". + */ + +/* packet types */ +#define TYPE_IP 0x40 +#define TYPE_UNCOMPRESSED_TCP 0x70 +#define TYPE_COMPRESSED_TCP 0x80 +#define TYPE_ERROR 0x00 + +/* Bits in first octet of compressed packet */ +#define NEW_C 0x40 /* flag bits for what changed in a packet */ +#define NEW_I 0x20 +#define NEW_S 0x08 +#define NEW_A 0x04 +#define NEW_W 0x02 +#define NEW_U 0x01 + +/* reserved, special-case values of above */ +#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ +#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ +#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) + +#define TCP_PUSH_BIT 0x10 + + +/* + * "state" data for each active tcp conversation on the wire. This is + * basically a copy of the entire IP/TCP header from the last packet + * we saw from the conversation together with a small identifier + * the transmit & receive ends of the line use to locate saved header. + */ +struct cstate { + struct cstate *cs_next; /* next most recently used state (xmit only) */ + u16_t cs_hlen; /* size of hdr (receive only) */ + u8_t cs_id; /* connection # associated with this state */ + u8_t cs_filler; + union { + char csu_hdr[MAX_HDR]; + struct ip_hdr csu_ip; /* ip/tcp hdr from most recent packet */ + } vjcs_u; +}; +#define cs_ip vjcs_u.csu_ip +#define cs_hdr vjcs_u.csu_hdr + + +struct vjstat { + u32_t vjs_packets; /* outbound packets */ + u32_t vjs_compressed; /* outbound compressed packets */ + u32_t vjs_searches; /* searches for connection state */ + u32_t vjs_misses; /* times couldn't find conn. state */ + u32_t vjs_uncompressedin; /* inbound uncompressed packets */ + u32_t vjs_compressedin; /* inbound compressed packets */ + u32_t vjs_errorin; /* inbound unknown type packets */ + u32_t vjs_tossed; /* inbound packets tossed because of error */ +}; + +/* + * all the state data for one serial line (we need one of these per line). + */ +struct vjcompress { + struct cstate *last_cs; /* most recently used tstate */ + u8_t last_recv; /* last rcvd conn. id */ + u8_t last_xmit; /* last sent conn. id */ + u16_t flags; + u8_t maxSlotIndex; + u8_t compressSlot; /* Flag indicating OK to compress slot ID. */ +#if LINK_STATS + struct vjstat stats; +#endif + struct cstate tstate[MAX_SLOTS]; /* xmit connection states */ + struct cstate rstate[MAX_SLOTS]; /* receive connection states */ +}; + +/* flag values */ +#define VJF_TOSS 1U /* tossing rcvd frames because of input err */ + +extern void vj_compress_init (struct vjcompress *comp); +extern u8_t vj_compress_tcp (struct vjcompress *comp, struct pbuf **pb); +extern void vj_uncompress_err (struct vjcompress *comp); +extern int vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp); +extern int vj_uncompress_tcp (struct pbuf **nb, struct vjcompress *comp); + +#ifdef __cplusplus +} +#endif + +#endif /* VJ_H */ + +#endif /* PPP_SUPPORT && VJ_SUPPORT */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/slipif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/slipif.h new file mode 100644 index 0000000..46d2010 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/slipif.h @@ -0,0 +1,86 @@ +/** + * @file + * + * SLIP netif API + */ + +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * 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 of the Institute 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 INSTITUTE 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 INSTITUTE 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef LWIP_HDR_NETIF_SLIPIF_H +#define LWIP_HDR_NETIF_SLIPIF_H + +#include "lwip/opt.h" +#include "lwip/netif.h" + +/** Set this to 1 to start a thread that blocks reading on the serial line + * (using sio_read()). + */ +#ifndef SLIP_USE_RX_THREAD +#define SLIP_USE_RX_THREAD !NO_SYS +#endif + +/** Set this to 1 to enable functions to pass in RX bytes from ISR context. + * If enabled, slipif_received_byte[s]() process incoming bytes and put assembled + * packets on a queue, which is fed into lwIP from slipif_poll(). + * If disabled, slipif_poll() polls the serial line (using sio_tryread()). + */ +#ifndef SLIP_RX_FROM_ISR +#define SLIP_RX_FROM_ISR 0 +#endif + +/** Set this to 1 (default for SLIP_RX_FROM_ISR) to queue incoming packets + * received by slipif_received_byte[s]() as long as PBUF_POOL pbufs are available. + * If disabled, packets will be dropped if more than one packet is received. + */ +#ifndef SLIP_RX_QUEUE +#define SLIP_RX_QUEUE SLIP_RX_FROM_ISR +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +err_t slipif_init(struct netif * netif); +void slipif_poll(struct netif *netif); +#if SLIP_RX_FROM_ISR +void slipif_process_rxqueue(struct netif *netif); +void slipif_received_byte(struct netif *netif, u8_t data); +void slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len); +#endif /* SLIP_RX_FROM_ISR */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_HDR_NETIF_SLIPIF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xadapter.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xadapter.h new file mode 100644 index 0000000..1ec90f0 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xadapter.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __XADAPTER_H_ +#define __XADAPTER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwipopts.h" + +#if !NO_SYS +#include "lwip/sys.h" +#endif + +#include "lwip/netif.h" +#include "lwip/ip.h" + +#include "netif/xtopology.h" + +struct xemac_s { + enum xemac_types type; + int topology_index; + void *state; +#if !NO_SYS + sys_sem_t sem_rx_data_available; +#if defined(__arm__) && !defined(ARMR5) + TimerHandle_t xTimer; +#endif +#endif +}; + +enum ethernet_link_status { + ETH_LINK_UNDEFINED = 0, + ETH_LINK_UP, + ETH_LINK_DOWN, + ETH_LINK_NEGOTIATING +}; + +void eth_link_detect(struct netif *netif); +void lwip_raw_init(); +int xemacif_input(struct netif *netif); +void xemacif_input_thread(struct netif *netif); +struct netif * xemac_add(struct netif *netif, + ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw, + unsigned char *mac_ethernet_address, + UINTPTR mac_baseaddr); +#if defined (__arm__) || defined (__aarch64__) +void xemacpsif_resetrx_on_no_rxdata(struct netif *netif); +#endif + +/* global lwip debug variable used for debugging */ +extern int lwip_runtime_debug; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xaxiemacif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xaxiemacif.h new file mode 100644 index 0000000..b2a432e --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xaxiemacif.h @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2010 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __NETIF_XAXIEMACIF_H__ +#define __NETIF_XAXIEMACIF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xlwipconfig.h" +#include "lwip/netif.h" +#include "netif/etharp.h" +#include "netif/xadapter.h" + +#include "xparameters.h" +#include "xstatus.h" + +#include "xaxiethernet.h" +#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO +#include "xllfifo.h" +#elif XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_MCDMA +#include "xmcdma.h" +#else +#include "xaxidma.h" +#include "xaxidma_hw.h" +#endif + +#include "netif/xpqueue.h" +#include "xlwipconfig.h" + +#if XLWIP_CONFIG_INCLUDE_AXIETH_ON_ZYNQ == 1 +#define AXIDMA_TX_INTR_PRIORITY_SET_IN_GIC 0xA0 +#define AXIDMA_RX_INTR_PRIORITY_SET_IN_GIC 0xA0 +#define AXIETH_INTR_PRIORITY_SET_IN_GIC 0xA0 +#define TRIG_TYPE_RISING_EDGE_SENSITIVE 0x3 + +#define INTC_DIST_BASE_ADDR XPAR_SCUGIC_0_DIST_BASEADDR +#endif + +void xaxiemacif_setmac(u32_t index, u8_t *addr); +u8_t* xaxiemacif_getmac(u32_t index); +err_t xaxiemacif_init(struct netif *netif); +int xaxiemacif_input(struct netif *netif); + +unsigned get_IEEE_phy_speed(XAxiEthernet *xaxiemacp); +void enable_sgmii_clock(XAxiEthernet *xaxiemacp); +unsigned configure_IEEE_phy_speed(XAxiEthernet *xaxiemacp, unsigned speed); +unsigned phy_setup_axiemac (XAxiEthernet *xaxiemacp); + +/* xaxiemacif_hw.c */ +void xaxiemac_error_handler(XAxiEthernet * Temac); + +/* structure within each netif, encapsulating all information required for + * using a particular temac instance + */ +typedef struct { +#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO + XLlFifo axififo; +#elif defined(XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_MCDMA) + XMcdma aximcdma; +#else + XAxiDma axidma; +#endif + XAxiEthernet axi_ethernet; + + /* queue to store overflow packets */ + pq_queue_t *recv_q; + pq_queue_t *send_q; + + /* pointers to memory holding buffer descriptors (used only with SDMA) */ + void *rx_bdspace; + void *tx_bdspace; + + enum ethernet_link_status eth_link_status; +} xaxiemacif_s; + +extern xaxiemacif_s xaxiemacif; + +#ifndef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO +s32_t xaxiemac_is_tx_space_available(xaxiemacif_s *emac); +#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_MCDMA +s32_t process_sent_bds(XMcdma_ChanCtrl *Tx_Chan); +#else +s32_t process_sent_bds(XAxiDma_BdRing *txring); +#endif +#endif + +/* xaxiemacif_dma.c/xaxiemacif_mcdma.c */ +#ifndef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO +#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_MCDMA +XStatus init_axi_mcdma(struct xemac_s *xemac); +XStatus axi_mcdma_sgsend(xaxiemacif_s *xaxiemacif, struct pbuf *p); +#else +XStatus init_axi_dma(struct xemac_s *xemac); +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +XStatus axidma_sgsend(xaxiemacif_s *xaxiemacif, struct pbuf *p, + u32_t block_till_tx_complete, u32_t *to_block_index); +#else +XStatus axidma_sgsend(xaxiemacif_s *xaxiemacif, struct pbuf *p); +#endif +#endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __NETIF_XAXIEMACIF_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacliteif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacliteif.h new file mode 100644 index 0000000..e92aad3 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacliteif.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __NETIF_XEMACLITEIF_H__ +#define __NETIF_XEMACLITEIF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/netif.h" +#include "netif/etharp.h" +#include "netif/xpqueue.h" +#include "xemaclite.h" +#include "xemaclite_i.h" +#include "xstatus.h" + +/* structure within each netif, encapsulating all information required for + * using a particular emaclite instance + */ +typedef struct { + XEmacLite *instance; + + /* queue to store overflow packets */ + pq_queue_t *recv_q; + pq_queue_t *send_q; + + enum ethernet_link_status eth_link_status; +} xemacliteif_s; + +void xemacliteif_setmac(u32_t index, u8_t *addr); +u8_t* xemacliteif_getmac(u32_t index); +err_t xemacliteif_init(struct netif *netif); +int xemacliteif_input(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* __NETIF_XEMACLITEIF_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacpsif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacpsif.h new file mode 100644 index 0000000..c380ec4 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xemacpsif.h @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2010 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __NETIF_XEMACPSIF_H__ +#define __NETIF_XEMACPSIF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xlwipconfig.h" +#include "lwip/netif.h" +#include "netif/etharp.h" +#include "lwip/sys.h" +#include "netif/xadapter.h" + +#include "xstatus.h" +#include "sleep.h" +#include "xparameters.h" +#include "xparameters_ps.h" /* defines XPAR values */ +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" +#include "xil_exception.h" +#include "xpseudo_asm.h" +#include "xil_cache.h" +#include "xil_printf.h" +#include "xscugic.h" +#include "xemacps.h" /* defines XEmacPs API */ + +#include "netif/xpqueue.h" +#include "xlwipconfig.h" + +#if defined (__aarch64__) && (EL1_NONSECURE == 1) +#include "xil_smc.h" +#endif + +#define ZYNQ_EMACPS_0_BASEADDR 0xE000B000 +#define ZYNQ_EMACPS_1_BASEADDR 0xE000C000 + +#define ZYNQMP_EMACPS_0_BASEADDR 0xFF0B0000 +#define ZYNQMP_EMACPS_1_BASEADDR 0xFF0C0000 +#define ZYNQMP_EMACPS_2_BASEADDR 0xFF0D0000 +#define ZYNQMP_EMACPS_3_BASEADDR 0xFF0E0000 + +#define CRL_APB_GEM0_REF_CTRL 0xFF5E0050 +#define CRL_APB_GEM1_REF_CTRL 0xFF5E0054 +#define CRL_APB_GEM2_REF_CTRL 0xFF5E0058 +#define CRL_APB_GEM3_REF_CTRL 0xFF5E005C + +#define CRL_APB_GEM_DIV0_MASK 0x00003F00 +#define CRL_APB_GEM_DIV0_SHIFT 8 +#define CRL_APB_GEM_DIV1_MASK 0x003F0000 +#define CRL_APB_GEM_DIV1_SHIFT 16 + +#define VERSAL_EMACPS_0_BASEADDR 0xFF0C0000 +#define VERSAL_EMACPS_1_BASEADDR 0xFF0D0000 + +#define VERSAL_CRL_GEM0_REF_CTRL 0xFF5E0118 +#define VERSAL_CRL_GEM1_REF_CTRL 0xFF5E011C + +#define VERSAL_CRL_GEM_DIV_MASK 0x0003FF00 +#define VERSAL_CRL_APB_GEM_DIV_SHIFT 8 + +#define VERSAL_NET_EMACPS_0_BASEADDR 0xF19E0000 +#define VERSAL_NET_EMACPS_1_BASEADDR 0xF19F0000 + +#ifdef XPAR_PSX_CRL_0_S_AXI_BASEADDR +#define VERSAL_NET_CRL_GEM0_REF_CTRL ( XPAR_PSX_CRL_0_S_AXI_BASEADDR + 0x118) +#define VERSAL_NET_CRL_GEM1_REF_CTRL ( XPAR_PSX_CRL_0_S_AXI_BASEADDR + 0x11C) +#endif + +#define VERSAL_NET_CRL_GEM_DIV_MASK VERSAL_CRL_GEM_DIV_MASK +#define VERSAL_NET_CRL_APB_GEM_DIV_SHIFT VERSAL_CRL_APB_GEM_DIV_SHIFT + +#if defined (ARMR5) || (__aarch64__) || (ARMA53_32) || (__MICROBLAZE__) +#if defined (USE_JUMBO_FRAMES) +#define ZYNQMP_USE_JUMBO +#endif +#endif + +#define GEM_VERSION_ZYNQMP 7 +#define GEM_VERSION_VERSAL 0x107 + +#define MAX_FRAME_SIZE_JUMBO (XEMACPS_MTU_JUMBO + XEMACPS_HDR_SIZE + XEMACPS_TRL_SIZE) + +void xemacpsif_setmac(u32_t index, u8_t *addr); +u8_t* xemacpsif_getmac(u32_t index); +err_t xemacpsif_init(struct netif *netif); +s32_t xemacpsif_input(struct netif *netif); + +/* xaxiemacif_hw.c */ +void xemacps_error_handler(XEmacPs * Temac); + +/* structure within each netif, encapsulating all information required for + * using a particular temac instance + */ +typedef struct { + XEmacPs emacps; + + /* queue to store overflow packets */ + pq_queue_t *recv_q; + pq_queue_t *send_q; + + /* pointers to memory holding buffer descriptors (used only with SDMA) */ + void *rx_bdspace; + void *tx_bdspace; + + unsigned int last_rx_frms_cntr; + enum ethernet_link_status eth_link_status; +} xemacpsif_s; + +extern xemacpsif_s xemacpsif; + +s32_t xemacps_is_tx_space_available(xemacpsif_s *emac); + +/* xemacpsif_dma.c */ + +void xemacps_process_sent_bds(xemacpsif_s *xemacpsif, XEmacPs_BdRing *txring); +u32_t phy_setup_emacps (XEmacPs *xemacpsp, u32_t phy_addr); +#ifdef SGMII_FIXED_LINK +u32_t pcs_setup_emacps (XEmacPs *xemacps); +#endif +void detect_phy(XEmacPs *xemacpsp); +void emacps_send_handler(void *arg); +#if LWIP_UDP_OPT_BLOCK_TX_TILL_COMPLETE +XStatus emacps_sgsend(xemacpsif_s *xemacpsif, struct pbuf *p, + u32_t block_till_tx_complete, u32_t *to_block_index); +#else +XStatus emacps_sgsend(xemacpsif_s *xemacpsif, struct pbuf *p); +#endif +void emacps_recv_handler(void *arg); +void emacps_error_handler(void *arg,u8 Direction, u32 ErrorWord); +void setup_rx_bds(xemacpsif_s *xemacpsif, XEmacPs_BdRing *rxring); +void HandleTxErrors(struct xemac_s *xemac); +void HandleEmacPsError(struct xemac_s *xemac); +XEmacPs_Config *xemacps_lookup_config(unsigned mac_base); +void init_emacps(xemacpsif_s *xemacps, struct netif *netif); +void setup_isr (struct xemac_s *xemac); +XStatus init_dma(struct xemac_s *xemac); +void start_emacps (xemacpsif_s *xemacps); +void free_txrx_pbufs(xemacpsif_s *xemacpsif); +void free_onlytx_pbufs(xemacpsif_s *xemacpsif); +void init_emacps_on_error (xemacpsif_s *xemacps, struct netif *netif); +void clean_dma_txdescs(struct xemac_s *xemac); +void resetrx_on_no_rxdata(xemacpsif_s *xemacpsif); +void reset_dma(struct xemac_s *xemac); + +#ifdef __cplusplus +} +#endif + +#endif /* __NETIF_XAXIEMACIF_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xlltemacif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xlltemacif.h new file mode 100644 index 0000000..100432b --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xlltemacif.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __NETIF_XLLTEMACIF_H__ +#define __NETIF_XLLTEMACIF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/netif.h" +#include "netif/etharp.h" +#include "netif/xadapter.h" + +#include "xparameters.h" +#include "xstatus.h" +#include "xlltemac.h" +#include "xlldma.h" +#include "xllfifo.h" +#include "xlldma_bdring.h" + +#include "netif/xpqueue.h" +#include "xlwipconfig.h" + +void xlltemacif_setmac(u32_t index, u8_t *addr); +u8_t* xlltemacif_getmac(u32_t index); +err_t xlltemacif_init(struct netif *netif); +int xlltemacif_input(struct netif *netif); +unsigned get_IEEE_phy_speed(XLlTemac *xlltemacp); +unsigned Phy_Setup (XLlTemac *xlltemacp); +unsigned configure_IEEE_phy_speed(XLlTemac *xlltemacp, unsigned speed); + +/* xlltemacif_hw.c */ +void xlltemac_error_handler(XLlTemac * Temac); + +/* structure within each netif, encapsulating all information required for + * using a particular temac instance + */ +typedef struct { + XLlDma lldma; + XLlFifo llfifo; + XLlTemac lltemac; + + /* queue to store overflow packets */ + pq_queue_t *recv_q; + pq_queue_t *send_q; + + /* pointers to memory holding buffer descriptors (used only with SDMA) */ + void *rx_bdspace; + void *tx_bdspace; + + enum ethernet_link_status eth_link_status; +} xlltemacif_s; + +extern xlltemacif_s xlltemacif; + +/* xlltemacif_sdma.c */ +XStatus init_sdma(struct xemac_s *xemac); +int process_sent_bds(XLlDma_BdRing *txring); +void lldma_send_handler(void *arg); +XStatus lldma_sgsend(xlltemacif_s *xlltemacif, struct pbuf *p); + +#ifdef __cplusplus +} +#endif + +#endif /* __NETIF_XLLTEMACIF_H__ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xpqueue.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xpqueue.h new file mode 100644 index 0000000..b416f62 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xpqueue.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __LWIP_PBUF_QUEUE_H_ +#define __LWIP_PBUF_QUEUE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "debug.h" + +#define PQ_QUEUE_SIZE 4096 + +typedef struct { + void *data[PQ_QUEUE_SIZE]; + int head, tail, len; +} pq_queue_t; + +pq_queue_t* pq_create_queue(); +int pq_enqueue(pq_queue_t *q, void *p); +void* pq_dequeue(pq_queue_t *q); +int pq_qlength(pq_queue_t *q); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xtopology.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xtopology.h new file mode 100644 index 0000000..9fa79fd --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/xtopology.h @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __XTOPOLOGY_H_ +#define __XTOPOLOGY_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "xil_types.h" + +enum xemac_types { xemac_type_unknown = -1, xemac_type_xps_emaclite, xemac_type_xps_ll_temac, xemac_type_axi_ethernet, xemac_type_emacps }; + +struct xtopology_t { + UINTPTR emac_baseaddr; + enum xemac_types emac_type; +#ifndef SDT + UINTPTR intc_baseaddr; + unsigned intc_emac_intr; /* valid only for xemac_type_xps_emaclite */ + UINTPTR scugic_baseaddr; /* valid only for Zynq */ + unsigned scugic_emac_intr; /* valid only for GEM */ +#endif +}; + +extern int xtopology_n_emacs; +extern struct xtopology_t xtopology[]; + +int xtopology_find_index(unsigned base); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/zepif.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/zepif.h new file mode 100644 index 0000000..2a801b4 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/netif/zepif.h @@ -0,0 +1,81 @@ +/** + * @file + * + * A netif implementing the ZigBee Eencapsulation Protocol (ZEP). + * This is used to tunnel 6LowPAN over UDP. + */ + +/* + * Copyright (c) 2018 Simon Goldschmidt + * All rights reserved. + * + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#ifndef LWIP_HDR_ZEPIF_H +#define LWIP_HDR_ZEPIF_H + +#include "lwip/opt.h" +#include "netif/lowpan6.h" + +#if LWIP_IPV6 && LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZEPIF_DEFAULT_UDP_PORT 17754 + +/** Pass this struct as 'state' to netif_add to control the behaviour + * of this netif. If NULL is passed, default behaviour is chosen */ +struct zepif_init { + /** The UDP port used to ZEP frames from (0 = default) */ + u16_t zep_src_udp_port; + /** The UDP port used to ZEP frames to (0 = default) */ + u16_t zep_dst_udp_port; + /** The IP address to sed ZEP frames from (NULL = ANY) */ + const ip_addr_t *zep_src_ip_addr; + /** The IP address to sed ZEP frames to (NULL = BROADCAST) */ + const ip_addr_t *zep_dst_ip_addr; + /** If != NULL, the udp pcb is bound to this netif */ + const struct netif *zep_netif; + /** MAC address of the 6LowPAN device */ + u8_t addr[6]; +}; + +err_t zepif_init(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IPV6 && LWIP_UDP */ + +#endif /* LWIP_HDR_ZEPIF_H */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/pm_api_version.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/pm_api_version.h new file mode 100644 index 0000000..d5d2838 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/pm_api_version.h @@ -0,0 +1,269 @@ +/****************************************************************************** +* Copyright (c) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + +/*****************************************************************************/ +/** + * @file pm_api_version.h + * + * @addtogroup xpm_versal_apis XilPM APIs + *****************************************************************************/ + + +#ifndef PM_API_VERSION_H_ +#define PM_API_VERSION_H_ + +/*****************************************************************************/ +/** + * @section EEMI_API_DETAIL XilPM EEMI API Version Detail + * + * This section provides details of EEMI API version and it's history for PM APIs of XilPM library. + * + * | NAME | ID | Platform | Version| Description | + * |----------------------------|-------|---------------|:------:|---------------------------------------------------------------------------| + * | PM_GET_API_VERSION | 0x1 | Both | 1 | The API is used to request the version number of the API | + * | PM_SET_CONFIGURATION | 0x2 | ZynqMP | 1 | The API is used to configure the power management framework | + * | ^ | ^ | ^ | ^ | Note: Deprecated in Versal but supported in ZynqMP | + * | PM_GET_NODE_STATUS | 0x3 | Both | 1 | The API is used to obtain information about current status of a device | + * | PM_GET_OP_CHARACTERISTIC | 0x4 | Both | 2 | V1 - The API is used to get operating characteristics of a device | + * | ^ | ^ | ^ | ^ | V2 - Added support of bitmask functionality, user can check the supported\n "type" first before performing the actual functionality | + * | PM_REGISTER_NOTIFIER | 0x5 | Both | 2 | V1 - The API is used to register a subsystem to be notified about the\n device event | + * | ^ | ^ | ^ | ^ | V2 - Added support of event management functionality | + * | ^ | ^ | ^ | ^ | Note: V2 is supported in Versal but ZynqMP supports only V1 | + * | PM_REQUEST_SUSPEND | 0x6 | Both | 1 | The API is used to send suspend request to another subsystem | + * | PM_SELF_SUSPEND | 0x7 | Both | 2 | V1 - The API is used to suspend a child subsystem | + * | ^ | ^ | ^ | ^ | V2 - Added support of cpu idle functionality during force powerdown | + * | ^ | ^ | ^ | ^ | Note: V2 is supported in Versal but ZynqMP supports only V1 | + * | PM_FORCE_POWERDOWN | 0x8 | Both | 2 | V1 - The API is used to Powerdown other processor or node | + * | ^ | ^ | ^ | ^ | V2 - Added support of cpu idle functionality during force powerdown | + * | ^ | ^ | ^ | ^ | Note: V2 is supported in Versal but ZynqMP supports only V1 | + * | PM_ABORT_SUSPEND | 0x9 | Both | 1 | The API is used by a subsystem to abort suspend of a child subsystem | + * | PM_REQUEST_WAKEUP | 0xA | Both | 1 | The API is used to start-up and wake-up a child subsystem | + * | PM_SET_WAKEUP_SOURCE | 0xB | Both | 1 | The API is used to set wakeup source | + * | PM_SYSTEM_SHUTDOWN | 0xC | Both | 1 | The API is used to shutdown or restart the system | + * | PM_REQUEST_NODE | 0xD | Both | 2 | V1 - The API is used to request the usage of a device | + * | ^ | ^ | ^ | ^ | V2 - Added support of security policy handling during request device | + * | ^ | ^ | ^ | ^ | Note: V2 is supported in Versal but ZynqMP supports only V1 | + * | PM_RELEASE_NODE | 0xE | Both | 2 | V1 - The API is used to release the usage of a device | + * | ^ | ^ | ^ | ^ | V2 - Added support of security policy handling during request device | + * | ^ | ^ | ^ | ^ | Note: V2 is supported in Versal but ZynqMP supports only V1 | + * | PM_SET_REQUIREMENT | 0xF | Both | 1 | The API is used to announce a change in requirement for a specific slave\n node which is currently in use | + * | PM_SET_MAX_LATENCY | 0x10 | Both | 1 | The API is used to set maximum allowed latency for the device | + * | PM_RESET_ASSERT | 0x11 | Both | 1 | The API is used to reset or de-reset a device | + * | PM_RESET_GET_STATUS | 0x12 | Both | 1 | The API is used to read the device reset state | + * | PM_MMIO_WRITE | 0x13 | ZynqMP | 1 | The API is used to write a value into a register | + * | ^ | ^ | ^ | ^ | Note: Deprecated in Versal but supported in ZynqMP | + * | PM_MMIO_READ | 0x14 | ZynqMP | 1 | The API is used to read a value from a register | + * | ^ | ^ | ^ | ^ | Note: Deprecated in Versal but supported in ZynqMP | + * | PM_INIT_FINALIZE | 0x15 | Both | 1 | The API is used to initialize subsystem and release unused devices | + * | PM_GET_CHIPID | 0x18 | Both | 1 | The API is used to request the version and ID code of a chip | + * | PM_PINCTRL_REQUEST | 0x1C | Both | 1 | The API is used to request the pin | + * | PM_PINCTRL_RELEASE | 0x1D | Both | 1 | The API is used to release the pin | + * | PM_PINCTRL_GET_FUNCTION | 0x1E | Both | 1 | The API is used to read the pin function | + * | PM_PINCTRL_SET_FUNCTION | 0x1F | Both | 1 | The API is used to set the pin function | + * | PM_PINCTRL_CONFIG_PARAM_GET| 0x20 | Both | 1 | The API is used to read the pin parameter value | + * | PM_PINCTRL_CONFIG_PARAM_SET| 0x21 | Both | 2 | V1 - The API is used to set the pin parameter value | + * | ^ | ^ | ^ | ^ | V2 - Added support of MIO tri-state controlling functionality | + * | ^ | ^ | ^ | ^ | Note: V2 is supported in ZynqMP but Versal supports only V1 | + * | PM_IOCTL | 0x22 | Both | 3 | V1 - The API is used to perform driver-like IOCTL functions on shared\n system devices | + * | ^ | ^ | ^ | ^ | V2 - Added support of bitmask functionality, user can check the supported\n ID first before performing the actual functionality | + * | ^ | ^ | ^ | ^ | V3 - Add support of zeroization of AIE data and program memory separately | + * | ^ | ^ | ^ | ^ | Note: V3 is supported in Versal but ZynqMP supports only V2 | + * | PM_QUERY_DATA | 0x23 | Both | 2 | V1 - The API is used to query information about the platform resources | + * | ^ | ^ | ^ | ^ | V2 - Added support of bitmask functionality, user can check the supported\n ID first before performing the actual functionality | + * | PM_CLOCK_ENABLE | 0x24 | Both | 1 | The API is used to enable the clock | + * | PM_CLOCK_DISABLE | 0x25 | Both | 1 | The API is used to disable the clock | + * | PM_CLOCK_GETSTATE | 0x26 | Both | 1 | The API is used to read the clock state | + * | PM_CLOCK_SETDIVIDER | 0x27 | Both | 1 | The API is used to set the divider value of the clock | + * | PM_CLOCK_GETDIVIDER | 0x28 | Both | 1 | The API is used to read the clock divider | + * | PM_CLOCK_SETPARENT | 0x2B | Both | 1 | The API is used to set the parent of the clock | + * | PM_CLOCK_GETPARENT | 0x2C | Both | 1 | The API is used to read the clock parent | + * | PM_PLL_SET_PARAM | 0x30 | Both | 1 | The API is used to set the parameter of PLL clock | + * | PM_PLL_GET_PARAM | 0x31 | Both | 1 | The API is used to read the parameter of PLL clock | + * | PM_PLL_SET_MODE | 0x32 | Both | 1 | The API is used to set the mode of PLL clock | + * | PM_PLL_GET_MODE | 0x33 | Both | 1 | The API is used to read the mode of PLL clock | + * | PM_REGISTER_ACCESS | 0x34 | ZynqMP | 1 | The API is used for register read/write access data | + * | ^ | ^ | ^ | ^ | Note: Deprecated in Versal but supported in ZynqMP | + * | PM_EFUSE_ACCESS | 0x35 | ZynqMP | 1 | The API is used to provide access to efuse memory | + * | ^ | ^ | ^ | ^ | Note: Deprecated in Versal but supported in ZynqMP | + * | PM_FEATURE_CHECK | 0x3F | Both | 2 | V1 - The API is used to return supported version of the given API | + * | ^ | ^ | ^ | ^ | V2 - Added support of bitmask payload functionality | + * + *****************************************************************************/ + +/*****************************************************************************/ +/** + * @section IOCTL_ID_DETAIL XilPM IOCTL IDs Detail + * + * This section provides the details of the IOCTL IDs which are supported across the different platforms and their brief descriptions. + * + * | Name | ID | Platform | Description | + * |------------------------------------|-------|---------------|---------------------------------------| + * | IOCTL_GET_RPU_OPER_MODE | 0 | Both | Get RPU mode | + * | IOCTL_SET_RPU_OPER_MODE | 1 | Both | Set RPU mode | + * | IOCTL_RPU_BOOT_ADDR_CONFIG | 2 | Both | RPU boot address config | + * | IOCTL_TCM_COMB_CONFIG | 3 | Both | TCM config | + * | IOCTL_SET_TAPDELAY_BYPASS | 4 | Both | TAP delay bypass | + * | IOCTL_SET_SGMII_MODE | 5 | ZynqMP | SGMII mode | + * | IOCTL_SD_DLL_RESET | 6 | Both | SD DLL reset | + * | IOCTL_SET_SD_TAPDELAY | 7 | Both | SD TAP delay | + * | IOCTL_SET_PLL_FRAC_MODE | 8 | Both | Set PLL frac mode | + * | IOCTL_GET_PLL_FRAC_MODE | 9 | Both | Get PLL frac mode | + * | IOCTL_SET_PLL_FRAC_DATA | 10 | Both | Set PLL frac data | + * | IOCTL_GET_PLL_FRAC_DATA | 11 | Both | Get PLL frac data | + * | IOCTL_WRITE_GGS | 12 | Both | Write GGS | + * | IOCTL_READ_GGS | 13 | Both | Read GGS | + * | IOCTL_WRITE_PGGS | 14 | Both | Write PGGS | + * | IOCTL_READ_PGGS | 15 | Both | Read PGGS | + * | IOCTL_ULPI_RESET | 16 | ZynqMP | ULPI reset | + * | IOCTL_SET_BOOT_HEALTH_STATUS | 17 | Both | Set boot status | + * | IOCTL_AFI | 18 | ZynqMP | AFI | + * | IOCTL_PROBE_COUNTER_READ | 19 | Versal | Probe counter read | + * | IOCTL_PROBE_COUNTER_WRITE | 20 | Versal | Probe counter write | + * | IOCTL_OSPI_MUX_SELECT | 21 | Versal | OSPI mux select | + * | IOCTL_USB_SET_STATE | 22 | Versal | USB set state | + * | IOCTL_GET_LAST_RESET_REASON | 23 | Versal | Get last reset reason | + * | IOCTL_AIE_ISR_CLEAR | 24 | Versal | AIE ISR clear | + * | IOCTL_REGISTER_SGI | 25 | None | Register SGI to ATF | + * | IOCTL_SET_FEATURE_CONFIG | 26 | ZynqMP | Set runtime feature config | + * | IOCTL_GET_FEATURE_CONFIG | 27 | ZynqMP | Get runtime feature config | + * | IOCTL_READ_REG | 28 | Versal | Read a 32-bit register | + * | IOCTL_MASK_WRITE_REG | 29 | Versal | RMW a 32-bit register | + * | IOCTL_SET_SD_CONFIG | 30 | ZynqMP | Set SD config register value | + * | IOCTL_SET_GEM_CONFIG | 31 | ZynqMP | Set GEM config register value | + * | IOCTL_SET_USB_CONFIG | 32 | ZynqMP | Set USB config register value | + * | IOCTL_AIE_OPS | 33 | Versal | AIE1/AIEML Run Time Operations | + * | IOCTL_GET_QOS | 34 | Versal | Get Device QoS value | + * | IOCTL_GET_APU_OPER_MODE | 35 | Versal | Get APU operation mode | + * | IOCTL_SET_APU_OPER_MODE | 36 | Versal | Set APU operation mode | + * | IOCTL_PREPARE_DDR_SHUTDOWN | 37 | Versal | Prepare DDR for shut down | + * | IOCTL_GET_SSIT_TEMP | 38 | Versal | Get secondary SLR min/max temperature | + * + *****************************************************************************/ + +/*****************************************************************************/ +/** + * @section QUERY_ID_DETAIL XilPM QUERY IDs Detail + * + * This section provides the details of the QUERY IDs which are supported across the different platforms and their brief descriptions. + * + * | Name | ID | Platform | Description | + * |--------------------------------------------|-------|---------------|---------------------------------------| + * | XPM_QID_INVALID | 0 | Both | Invalid Query ID | + * | XPM_QID_CLOCK_GET_NAME | 1 | Both | Get clock name | + * | XPM_QID_CLOCK_GET_TOPOLOGY | 2 | Both | Get clock topology | + * | XPM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS | 3 | Both | Get clock fixedfactor parameter | + * | XPM_QID_CLOCK_GET_MUXSOURCES | 4 | Both | Get clock mux sources | + * | XPM_QID_CLOCK_GET_ATTRIBUTES | 5 | Both | Get clock attributes | + * | XPM_QID_PINCTRL_GET_NUM_PINS | 6 | Both | Get total pins | + * | XPM_QID_PINCTRL_GET_NUM_FUNCTIONS | 7 | Both | Get total pin functions | + * | XPM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS | 8 | Both | Get total pin function groups | + * | XPM_QID_PINCTRL_GET_FUNCTION_NAME | 9 | Both | Get pin function name | + * | XPM_QID_PINCTRL_GET_FUNCTION_GROUPS | 10 | Both | Get pin function groups | + * | XPM_QID_PINCTRL_GET_PIN_GROUPS | 11 | Both | Get pin groups | + * | XPM_QID_CLOCK_GET_NUM_CLOCKS | 12 | Both | Get number of clocks | + * | XPM_QID_CLOCK_GET_MAX_DIVISOR | 13 | Both | Get max clock divisor | + * | XPM_QID_PLD_GET_PARENT | 14 | Versal | Get PLD parent | + * | XPM_QID_PINCTRL_GET_ATTRIBUTES | 15 | Versal | Get pin attributes | + * + *****************************************************************************/ + + +/*****************************************************************************/ +/** + * @section GET_OP_CHAR_DETAIL XilPM GET_OP_CHAR IDs Detail + * + * This section provides the details of the GET_OP_CHAR IDs which are supported across the different platforms and their brief descriptions. + * + * | Name | ID | Platform | Description | + * |------------------------------------|-------|---------------|-----------------------------------------------| + * | PM_OPCHAR_TYPE_POWER | 1 | ZynqMP | Operating characteristic ID power | + * | PM_OPCHAR_TYPE_TEMP | 2 | Versal | Operating characteristic ID temperature | + * | PM_OPCHAR_TYPE_LATENCY | 3 | Both | Operating characteristic ID latency | + * + *****************************************************************************/ + + +/** + * PM API IDs + */ +typedef enum { + PM_API_MIN, /**< 0x0 */ + PM_GET_API_VERSION, /**< 0x1 */ + PM_SET_CONFIGURATION, /**< 0x2 */ + PM_GET_NODE_STATUS, /**< 0x3 */ + PM_GET_OP_CHARACTERISTIC, /**< 0x4 */ + PM_REGISTER_NOTIFIER, /**< 0x5 */ + PM_REQUEST_SUSPEND, /**< 0x6 */ + PM_SELF_SUSPEND, /**< 0x7 */ + PM_FORCE_POWERDOWN, /**< 0x8 */ + PM_ABORT_SUSPEND, /**< 0x9 */ + PM_REQUEST_WAKEUP, /**< 0xA */ + PM_SET_WAKEUP_SOURCE, /**< 0xB */ + PM_SYSTEM_SHUTDOWN, /**< 0xC */ + PM_REQUEST_NODE, /**< 0xD */ + PM_RELEASE_NODE, /**< 0xE */ + PM_SET_REQUIREMENT, /**< 0xF */ + PM_SET_MAX_LATENCY, /**< 0x10 */ + PM_RESET_ASSERT, /**< 0x11 */ + PM_RESET_GET_STATUS, /**< 0x12 */ + PM_MMIO_WRITE, /**< 0x13 */ + PM_MMIO_READ, /**< 0x14 */ + PM_INIT_FINALIZE, /**< 0x15 */ + PM_FPGA_LOAD, /**< 0x16 */ + PM_FPGA_GET_STATUS, /**< 0x17 */ + PM_GET_CHIPID, /**< 0x18 */ + PM_SECURE_RSA_AES, /**< 0x19 */ + PM_SECURE_SHA, /**< 0x1A */ + PM_SECURE_RSA, /**< 0x1B */ + PM_PINCTRL_REQUEST, /**< 0x1C */ + PM_PINCTRL_RELEASE, /**< 0x1D */ + PM_PINCTRL_GET_FUNCTION, /**< 0x1E */ + PM_PINCTRL_SET_FUNCTION, /**< 0x1F */ + PM_PINCTRL_CONFIG_PARAM_GET, /**< 0x20 */ + PM_PINCTRL_CONFIG_PARAM_SET, /**< 0x21 */ + PM_IOCTL, /**< 0x22 */ + PM_QUERY_DATA, /**< 0x23 */ + PM_CLOCK_ENABLE, /**< 0x24 */ + PM_CLOCK_DISABLE, /**< 0x25 */ + PM_CLOCK_GETSTATE, /**< 0x26 */ + PM_CLOCK_SETDIVIDER, /**< 0x27 */ + PM_CLOCK_GETDIVIDER, /**< 0x28 */ + PM_CLOCK_SETRATE, /**< 0x29 */ + PM_CLOCK_GETRATE, /**< 0x2A */ + PM_CLOCK_SETPARENT, /**< 0x2B */ + PM_CLOCK_GETPARENT, /**< 0x2C */ + PM_SECURE_IMAGE, /**< 0x2D */ + PM_FPGA_READ, /**< 0x2E */ + PM_SECURE_AES, /**< 0x2F */ + PM_PLL_SET_PARAMETER, /**< 0x30 */ + PM_PLL_GET_PARAMETER, /**< 0x31 */ + PM_PLL_SET_MODE, /**< 0x32 */ + PM_PLL_GET_MODE, /**< 0x33 */ + PM_REGISTER_ACCESS, /**< 0x34 */ + PM_EFUSE_ACCESS, /**< 0x35 */ + PM_ADD_SUBSYSTEM, /**< 0x36 */ + PM_DESTROY_SUBSYSTEM, /**< 0x37 */ + PM_DESCRIBE_NODES, /**< 0x38 */ + PM_ADD_NODE, /**< 0x39 */ + PM_ADD_NODE_PARENT, /**< 0x3A */ + PM_ADD_NODE_NAME, /**< 0x3B */ + PM_ADD_REQUIREMENT, /**< 0x3C */ + PM_SET_CURRENT_SUBSYSTEM, /**< 0x3D */ + PM_INIT_NODE, /**< 0x3E */ + PM_FEATURE_CHECK, /**< 0x3F */ + PM_ISO_CONTROL, /**< 0x40 */ + PM_ACTIVATE_SUBSYSTEM, /**< 0x41 */ + PM_SET_NODE_ACCESS, /**< 0x42 */ + PM_BISR, /**< 0x43 */ + PM_APPLY_TRIM, /**< 0x44 */ + PM_NOC_CLOCK_ENABLE, /**< 0x45 */ + PM_IF_NOC_CLOCK_ENABLE, /**< 0x46 */ + PM_FORCE_HOUSECLEAN, /**< 0x47 */ + PM_FPGA_GET_VERSION, /**< 0x48 */ + PM_FPGA_GET_FEATURE_LIST, /**< 0x49 */ + PM_API_MAX /**< 0x4A */ +} XPm_ApiId; + +#endif /* PM_API_VERSION_H_ */ diff --git a/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/profile.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/profile.h new file mode 100644 index 0000000..27b3df1 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/profile.h @@ -0,0 +1,105 @@ +/****************************************************************************** +* Copyright (c) 2002 - 2020 Xilinx, Inc. All rights reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + + +#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/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/sleep.h b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/sleep.h new file mode 100644 index 0000000..0d881b6 --- /dev/null +++ b/2.FW/Zynq/proj_cal/Vitis/NewInstCal_bsp/export/NewInstCal_bsp/sw/NewInstCal_bsp/standalone_domain/bspinclude/include/sleep.h @@ -0,0 +1,109 @@ +/****************************************************************************** +* Copyright (C) 2014 - 2022 Xilinx, Inc. All rights reserved. +* Copyright (C) 2022 - 2023 Advanced Micro Devices, Inc. All Rights Reserved. +* SPDX-License-Identifier: MIT +******************************************************************************/ + + +/*****************************************************************************/ +/** +* @file sleep.h +* +* This header file contains ARM Cortex A53,A9,R5,Microblaze specific sleep +* related APIs. +* +*

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⁣5d4wG&ke|)Y=n-rp_JDWe+V4|Uh?8%)uL0H+}$t4fNn zF$Y`Iq%v#{Ovx!Mpx?YHZdNJTA12QrZ4WuY7PVU`!%5il2fdr+f? z$SX%wLdhvSi*VQm8&_Dz~03=C`vVIoN{trU}NE8n7udVo1xb~=_( z(+Ep+AY!7@THD~9!`#}YC{ir9nW!{~8Y3DezrTybSK;Jg5g=~(ba#7oz_n);-&#j^nfQ%h0vVh` z@muWh=a~npDPjaYSnwhKGJpbA;#Vk~T|+eDd@|;Gm}VuyVMHG7NNB<~g-0w_Q<4!% zkt+<0a3RLbk94^a+3>fbqRx0njJ$0kCLWmFfGAQxj0?+>vr=iiGak9BH163gdy_bvQC;!Pjfk zgtJ|MSZi6S0pzd}_8@6-V~%k2mM~)lUKAY_L@J|GCX2|Gl4#G5_BRzc9A^8q!fs4_ zG0#9(r8wTWGAWnlJoP!pbv-1=4kJI$m4Z4NVWn@-;6uE^x14C>eUvcn>$O4wZ8&Y< z-hl>3ECGR#3P#Xa?Ry|_KKbVgA?mL2SS~P2!&1@EGi68cTc>rp?zti|!x1^g*MF}= zK-XQJfNR}pOw^Qys~*~ub@+xXuPtuoK|4W3&XQJ+rE%5Wmk|!h$Pr~DRoIMElrdDn zdxZ?Gn+VqiMio_2n*&tTjYrnMU`!y0(-aQKdI+UU zu|WB8B6TUs7jdz9S-x{rP~v_`I?l9@GX_112lm}4Skisgm$V$x!6<6xS!RM2FQYe( zSeh+US((TtO>>*6kI2l*rpD|zRI}s*pZAJ;R7wYBX}T;TXfP1M267;y!ZszzkB0M+ zKZ{$Q$7(c6Poi(45G;=q%sW+93QdA*8!{bktuf+GL3Sb==poMB$8(UO>qvZBxYitzev_5+nZ` zoIRYST#f5=XZrzB!i-q6Ed3}MUaDmshtoV@8p*uEVlSs78>Sz}^9x*g_U(j&%99s| z7+8C_^m6VT>w+AHPrXLxtDq9rQZCGLHT5Ah=7jZgaF$)q@UVpV7Im>+FWyDLXnkbT z)C)R_Dg`4t#vr>T3=i-t2IGHmvIOr5cp^xdy&o0?<{LhztJto7BjY?21Bs^XH;I^oJ#4+W#Q#v(M;-* zhge=9C4tu`c~*p=$L7$nJy6TmYVwp0F7&wlo~qQxG4FJs21n@%J}(jc;bHSk5bdS3 zzVLhYqS_Ng6@NuM5$*r%4{)ap8_DQ;6$AgDFND^NhjN z);AxGQohvHR-H!7Nql1%^M(!sa=jC<0|A4UUO-BMp z`eCjcFzf5)ZK%NH-Fy#5hB&S|Yg7$J)ycV;!KlG;&orsN*B#b_+bA-o7CKoUoe{9y@;@n}j*j(7Sj}-`Xh>*Q- zlz)EH$m3Vz3>7WS7PwDC*wJ;@EKgH~oZI%TT)B_?rX$@oKw{{;wPWUj+M?ehkV$M1 zJZ3iIx@dDW7t*D$V+@9{ZPM0n`VJ;-iPjlR{xiOy$knlxeNjr68Su^^st ziJ$eLQsA5iFibdZ!vYd+<9@HJyp1sAwQGn{K&CE21eq0Sp7kS}y{}1bypS`#amNhg z8Nh%U2!pcD-|^77pH2^HxMtXdztqHLkVn77&4YLaL5k~N5k@(-#1s`n#6grMNf*m- zsTYGI`T(s{Mh9>UcLKnWl}Gkk^HSV#1sG0R#sYV~Sm#k!XDt!b9d|kt!2D&&yS)gl zmcIoo9aie*vv|hoE7e)RxhFU2q8jIUht+0n5XMPEj5hH@V)%Nc7&nxB(E&ZNT84qn zK_O`>xl6$zWq4J|O|Tixq+`ivo98bQ3Tx!>(j4G_Xz7Sl1rAbwUxO4kO@qzTr>sk% zfG>w}G1MIF<#ufzla;ev#_D*9;3i6m)Uzos4=@Sv8OSGT* zBRwm*84sg!L+Ix^9zydp#CghIPq^d(mHhI&7>KRr%XNc9LhZ7>=7ON;W9Nw;;kZVA zzK?VdEW2TzR8+>3!|9v_l_!J#h^HEkiCm-x4UeZ!ay7#=-{(e+Hfkl4AvdT^K>8W( zGHcWdQ;gXa)bZ`1{$za$9JsTr_KlF2M7ucV;t&NUFkEFH9&d3|Y6C=1pdR4^2#Q8I zng!UIo=6wDMN`ZK_&6HNA*T$V$80dsIu>FZppoeC_a3>m*b{}Chv3>=pC?f!NQL+D z)B_Sp1e*k&L5;_<2fnBWUE1-Ob3Hj6AQELhve_Gb2p^!}DnfCL$`vq26xSb6eu_EB#+J%KSq!ddq6J15 zMxw(P0K}N;Cxff$kEM-khzBXEMaR)Vkd<#6#K5A?Y{2tKcuJ$yxmic3oC{7c{)6&x zW%=)r|BMJL4CPpaa25!ib`hpnwo(}9==3Q^j@KMoTE)CaWoanrqK|;{mqc38co%r$ z+OGVNPp7crtJ_s0Q;H=cq|3b@lDIMli>Jvvb=(IxJD<-Yf)SdVm`a{YRPh7cPBKhl zaDsavE0Z7y`*5y04;dEULqTfJBss$gXikRy0<;apdM7$Hv=g}0Z2 zi!S_!EDiSjsvg|&wvljU5H?sFHV->vtiulU>@cHui9cE=FiUI}IT!9vi*?vne&l>! zxRqFCO_jrRS>+GEUFBCVBU(|CIi5im6c002Px44sQQ6#bBpard)6^rY%+yFw>}y0* z7oT-1n;`comN}+Hh&IfDhwhjx)3)HOQSOSW1r3NTB%#ErgokRv6Wr0>;7XpA!bh4o zxtpyAjU)24l}0Km$xe2P?l-G8U78QB-v)50Zz3P%-HMe5J^%UJw8>4Ul z-?Rx&C4C{O#z<~eLq}QtjrT>rqP9&n!YyltSBE1zW;aFawaunYx_|%FRAsb2RhcU? z>vWT`y@}4|2`EeZO*$K-J91Jbx@GxbKlI{U_JT*XcAv+@9Ih*?Rde}OG-9DdcSO)# z-0fw@X;xps!xWfDS*G~;rAt>|mG9>jf(~bkw>Q?j8(*(!Hfoz_?Nmk%iC1w%ZJik& z`P5z7y0E@XpXDs#)m|MmwChoLm*RvU6&_c7XM%rv7n`L|6wM2~;z*^dmAYD)QSNBC zYQ$vb>-H^b^rCB3UWOneKkT3!j#J_A-BWto(Ia=;quFf*o@PFBv>*c&8QJE)V2$1| zu;R4S+Wn6qud_1e>iQ9zT$%Hik$-^wtuFzuwlcW?B4kFxf>SN zZ20>xf4VokUg?LvIPkM`H(Y%6vA^8?HyakVU3B$Z7iKQpJ$3cZUs*LXbMc0Ezx(~i zW}ec#62U=ROa-DK6!3-{b%OPH_y4(^MrNREDkZc z>aB;?tVxHVdf>{1g>&Ec(!x~V;8k1B-7>Y|*s+=4-f;C+%qq-I;Ysh0&c3y{b;N}0 zm8O9e)f)@PUiqC3+qYlT`qqYXuDS?C47mpL5k)_f%(V+{T_a zww_)1*Bg(uKJnsxb4R}U$&Xi`LEC#jFgNr)edM&WF?M-4F;dU)*mZlWGhcsk=JU_~ zw14U!f84X;`tr!vrdK>z-f$5e zJG%QXj=i#N!%v?V+GjsjBfB)Fb!iLpXZ`^qC_8VWC+49GK?0NF> zBgGev&*_`)`jzYpFJ$SPfB9#^6PBHDR)HtAgNN3vN~e|j&dkEXjoBj$Bd^mlo0%t1 zAN=f0e#2E~5}oq>sJ>!Oc=FQJt$ORawb}LSvpQN)pFVc%+3jn#pLxf^v#T!Na_rZB z`q#&1rZ)V|?iUZ&URwRYRX6XMb;6SuKDzMP-3vc@IrEMeQ}y3iaqnHill0!@Uw>h) zI=$kaK-4HRhT{X~$|NhO^IWN30cjWK>^SxjH{@mSL?>X)33lmp<|GIPL z@Bhi49K3$_%qcVEc@iwlt(l2d9FKl_cwy$sZO{JXGdqtl?cQ+wnV%h<`Sx0pPe4?I z4^#=0<}U%?`A&OX*|s$No|)u4VW*xx*iMp0e$;;*GQkTZd0 zO8k{^72Y7hr-KMeR!W!KCl+-SJMS2LGd-HZA_>}dR1SjsR&A;*)<-E-?irO@c-br` zz*;xj>`W&V9juCuO=<5SO(WB~Y8jYW_3tp|(gAcar5Xj}Ig%`e$K1$OM?26AAk*zGw^=hz`Cm@j~ zyitWc65DYSpW}apm_ckOH~ZuhmSBAWrW#u%>%CQ6w;X2-*IP%hH8$OXx02`K=%lrj zC%oFJ;Hv5}$8oFE-Dk@h{CC%*F;BcNqERZz;k6|)XLTlPmXr+Wc%3Ib8p#ra-Qtk&OAB(-+Egc+dP5am0hj){9V^NW8nvW&vFhn zL&KOH&_fLKq&400rT-nU8z)W$jtWmeV~8OvT2G~B`wmcvukevL37aO)Z(KWpth17i z_@L+6cQRHh{BG-Ro^0RVDdC|azl(UnF!-klPXG=1wIuUv7x<9#-uXH_ku!S#^}($_ zW)YwM#1Ec-{&g+yH4^_eZtv}Fy=CK5?MmYK7hl}CapSJ-8y|b@+us?R-st6g2~WC@ zx+XlaaTr(N@#qOW8BMbMLg?_sj}wF8SeJSmF(<5#FG(iT9y>yF?fp9z#JGTQp2d4V z$Bb+s9WR%Xal(Z98BTe=8c$SHMpq0*#stD^zT4Jay!00&+r7uQOr9Z@DaX1?&R{O# z$$g*S{3E7*@9Y0lD)qW)>hPpIJ>C13+zCAC=@}i}SSoK!rB#!fb4m6)yd_ZcYzii5blL4o58`7p}lDy%D&q&~cd`4xzZ2V&nR43O2=M(cs zzp7P;z5x%_!A*Qu()etDJrLRro{o4^&fgCjB((MQdcTXbXx?57k)M;pC=y?X9F}jh zh+jnSuhE^(>F~$64f#6p;ztp_2*n3tSN?W6@58Wu;cA=-w0pUHDE=2wU*c==269*8 zY+;Ni!PjA2U%Nfz=l|!>sQ7HeS<7v5))Ei*VjPesjvsi>!&Po09Jpq7@2aAr(hXF9 zFWSIxm$Q@=np~&EXXFj5cc$;)cwH2M_vaql=MGQI@6RQA-&tnTVbrsxMwNU3WQ?c-_l0vdA7SAg)OuQmku44fWADpu_x72Nb-f)Csp!_9H5}Q zY)_{EnxBqVMaVariaj!K9BTz#zQY+7oy+cmme`4?)CkAKhnr8?1#V&9V4h$`Xu=xG zdY;7a<~O%_(r7fgcrqpySIoDuo~{Y-wRj@4mr%PYA>D|*4UgKAd=_B!CtsB(0)_ah zg(pp}b>qgRJYl=5wQ=Jw%af6JGf$qsx6Ko7cLydkvm{>|oQ2m=ike2aAzvKGj*TrW zc%R6x1<5!uY$<^l!jpv{@I1lS4_I&Sg5_k}Wt>ay-u&j+XW^*`HH7p`0p^L3^k$N= z1Fy{!58R?$+@e^9+`sMGm6UOdQY5AwrQP=J@~s5dYAsxl3TY+9ZEWAZ^~YzN(f8C6 zTwax0zqWhVt{0!bH<_F9=g`{<^|fdLejFDAFA5!aLJ5Ly>()ZT6QOMaIg9-}ov;V- z@kqjR2e}j7)uJ{}5X(Fv{42Ffm0213C0xg6VMD?Zow@PBHct?(n#rxeYw$$uG=P(J zj`2y6XSa-t)bG6-PYURr&GMKP8`Ev|JR#vp*ElJcH~;A0!;{m0w^VvD)zjw5X5X-} z;7JSGW0dq{GCnavSu$dtSX=fyp|M1FwRw`Y2!-*L%i)HvA;RtS?6Y52ELZ$6CcjpBNJI<@iG6W4oF5>K?M5gNV> zslSyg`jGf(JjY5M?eK_%|1u6&eSYsVQqCg|aWL^Y86@W$yL?9a^wDr+TUU5sG%lai z@BKmok0I2bU*b2Cui~T9`(^CHH~M%3qdL?dkLB=eLIJ#hlgrX`hn&v{x#O$(c%yt7GafE$+oiOt2PFU(6TTesY_dovs9*keBdsvE-2Z=Ru>wi07mWT>1m7OI-TG~K6 zjJI--z`Ai50P!Un*%n zY`UYurK7168jZO!+>Y_#MC5FI#STIN=Pz*=mNpLPlGa2DWmhUHaLFLD3C;Wq2M5cZPJi&QUNa+5T_hP2Ad}uz{nw0bfF`xggIX$q+CoKY`+T)#|f4r zQXUAUunh*?^)YREEevu@Bf-`q5o(Hk#)RA~fpFC$ZbEK|rU(_z;@A38V5IZ6d>!v% z3g#r&gQ0~uF6}q+#sDSS%`WLepB(!`$S2|98CsB#rFrWY`AK$CLDwctr1)=j%Y#e7 zH_qq5;^ZQd@pHh+U8KpfNqVWx(_pty+8{n|<9tv`MaoJXS3NwhdeS{i4l(FC)|E&_ zr9PjYXYQoSmRk>u;x?6{1B9(|rKp7S8W!#`(3-{1GKE$Q?2%HLqFF&hx`mf8fmCT6 zF3M55WMS>}bBS>{G(ar>Me&I7CoE&4ObVws**dU)(9sYVv&L!|)zT{qB(ZnEayy2w zFEIwe!uk=2dz0tC&<2xy3FJ8t1%udS=c4L77^c}Fy23INj35?y!Mrx*YiuR3eYZzc3EP=;2)wr?Uii)|1UMH92iLizZO_r7@GDsqjrQG6HCq)qc3YY>B2 zZz?F};)p>gOvf*)-P=qL)A8*N&rS_%_iR57sRF6KLDitU3ER3bAxQR$4OfYDV}whc zIJp5@j)-L&AgA;FQ!UV&-!DWVw@x%8xH}B z$9D*88b=Ix7*!?JAJ7OnE$-he+D;$>U7Xw)K?(~av;sNAc`PfjJnW3%<%@V=O7Mu~ zwZ$axA$fTf(0L+ffpsK`L=~izRSs=?45UFXRsB-`xVBQOjVlred_MW{9h9Jf{zpBS zf&Dd<+8|?w;4#jaEIN)v%#D~`8&Wj30(}p{MlpU&J3yGC8-|dN#~ZijM0Z+JFYA741NyqtcZX>=t#V z=;~GL3?1e&6M~1Q8Ml#*Tn;fzH5~uptE)8_C70&jS<8_Q*^J;f6!_0h)P*@7EPjUY z;|CEOaSBKQBYRPzQi;_zOBOyN5D3W@LxlgR^6WT*r`;(oXwO5yT6tU%fv{G-ML@w2 zaI-uSN7kUFz*rL_L#Rw)g4C$eAVSdgVC8q!PX38T{Q$5y`%mzN3>yO93qUqG(8zNG z;*8w!fUsC_%X2H~X2=49yi@)OD$@Wmj$Oa7hP>Q1kee{7>^Km@vF%)mJHbQI_`xDr zSrp)@3>nkFTM}`Gg3~KIII+reWK_lXM1#gOVT8&lNQU-uOAcK^MDV{(b36vI^;%TB z2_YS}%tB~5pS&$`-XXUOPzGE!5t??e1o)Rrg_dQ`I5Jslhg^euXV4hh!A|5^&>gr& z6PQPeu*O*(8l(dihs-F>E!17z@ksGozC(#eDtB-cp>Wzs5j?p2l$QS2-QgOt&T)Ii zLc=!12665guHpbVpi%ePdOz1yG(e1XJ&#@JG-EIh8hp7;oP(PN9!nIm@Ku=!QG4UI zB99>Rl~BWZRl|(Xq#GuB$T%0`z)ec#R__eXFCa9wGS?`3fJ^TK2bn`IoWuSfc>7~g z1!AoAfU;ucOrQ#~%tp@aZC6Wb);WU2Sxf>D7noT>CvCD!X}sxU;C^UkO`s5vA1hxF zC~EE&dQj2Bzzi>*MQ<6FJLRAQ_|I8E*fNj9&_D!oj62{q(2!-k#Tos}k0 z)d;yvM6(wXy>29wx@bZjr&>6d&GM+zkO~ll;{zGdBwkV~90pc{EInn+iA`W#AlJxP z?Gz2nb9ytROSo+uGPVu2=&ihc4|CNpsyXb6+(UsmKxaH;qz^C%Ea*7l`y@wa7)7=o zCL>8_DM1CCQlG_;4JSBi-m;=gH4(JP&v+K)rXZy;-V^XXaRnR{BI%pB6T{>RHJ&)o zIgaMZ6n9Gc2Zh|FQQGQ72tod=s>4whan{KUHZC+dS7=0R(mgYa*%{PB_AnEf9S*gM z^E>7ck0QBKamC05L7K{9j~Ph3>@-PG6LFjFFMV0(I5EWJPdS)kAx@x>AaIv!XgR{8 zRhE{MK0`;_=%RqWPsPc4_J&nMdTKD9Y*JMwCZi|35qyt#HptG zvFom-Q-fcxX1Lb#P~RkI^?IVc#;wjdU9h7t4lgBTM9jdR(48LCX>hsFj(d2yW`Y#< z`JfY`1v&Uh!jGf9XASjE$w?_{b^xPYj*1_x(e zAq;1f2F)ypsWr}Vv*2kv&k8bka~(#Q6^hGdK86Ruh2hsqiwonkClkGm31^e9u4>f<&}1h*)J8OF~jJRByteqD`IoWH1GUth#* z=Qb~iJ6n=pnU-Rx@nR~f3z;zv&UZ(}iHWgW%a@+sNt z5C-XqkSAR{PmnOq&O)7P5Cqj#d=!D~t}@K!S!d$=M*W7bUia~W z+L1hGh-6Xefmy(c8MUOKa{=WExnM_=NwP^xr~Nv9HPj{2Ew@&&d}oTgfeqji$RhaoOhN!ZPLgibP|4g<^!yiOLw>n@fyk0iU~{$$<=u*e;H_sI9Jtr zUNHHAJaY5oA@y5i!h8_onIVib#C*LVyV|^)VMBpU;mc5f+lcb-gL5`m{br4Y-80 z#Ze_j497(V=7*QUq|XAr6&wG^jE36@5X##F3}zfx{(DF=3RqYO4_Tu&BLJGhBt&Ue z>`Ip05mU=Z=0G)6iAG(hU}+c>W}0Z63D06yu=4(A)Yxcwn}op9i5mAv0OY}Fw3%c% zlO#B{fmY~;>7&Qzz8b8ppX$6HMoEo(ya?>KzB<2}k#nx;u#-O((<5}Qip~85VMBO+ zHqfq$I~ar{BicEink9Z^Ct#y4lgsEfnWo(ylmezXs}D+cG# z2iys5$u*Ilr277LhgldXv~r`mV`ad#TM@P!8nKYaVmT@T8N{InMiA?ObR45&t+^to zke??)P)hW+09*S2<9~RC?K>bnl$*p@An@Esa*+ZP8Z6<~%DT_Pvj3WqYIrsu;Vy)- zyz~IAGM)qli7re7o-mR&K;Bf04G_SfmGL5y?4{0^bokHuO863oo!kY|M>OFHPySm< zi7;Xqh?eVM0DN30;5_9hcw3IICh||S6SgotqLt;#E|^+79*#0^mD1TMtIHu>J8-3$ z3g2@bXR2TbW~g*Qh+!Gmi=t9TMom>FX)el6alTMz==JF^L)l_Lqk%NTJjwJc_+Q>b z<+Pw<+MVace?RQPke265RWTB#CPYG_ZBr}!y&DLKs?3MaFmSx>%!nBt*i(7XHu4TeMR z|Do+|;N&Q-d(qQ9y{n$ywbZ)|Vl4|%J1ls1k;T9YY-6IWT@UhxaGjB|D`YM~3vnEU z>+rylk<7)bn$b#(MuaR_A;iulBVA)8*+Il1b}l3^U>y7UIf0k(k((Dj%yaICbDvGD z4;+Yh-ua*E?)g{&{`kEk?R3}IsZ-}vovP}t(`QC#74OM>W1MievG`?a3#1$Sxuj@>~PONp4jU@^MzdS++CIQ8NCPgeHT6zAIO>h z2dlYEP{DjdTf@g@skKv%j_TlU!%Yzx&W|_2!e++!^N`-ZwYLbI)#v%4NvJ=`nM= z;APM$g9lVHFYhgtD!0|mOo>WPcd4}d_Fbh)>G5>-Wcl#&-a{p`w`3|Mr*s_?XUeAM z*+2Y0bF1z@Y<|tRq1R+q3<->RxxvaF4oRUv6T}aP^f}SVp~-&%vkS#wAYq;vZHAPajD; zQ1eW8ssD$@Sw529w{~hDZR!@8I2&@qRwneGl-jnB`p@S*hYJa5t$4ZJsu}skLWIz3Hl|ElU+=rQ?fE~N;BzF$zSrgxo#H^gl=b-*So9a zJCE&(KBb%9SIBVjebU zc6%oEsYYZgmz-zMLW^=_7vZt0_$*_1UHmXUf-~iq2PIEC9DD6ZV|27wbg!aO*c3_) z3V7tX0XDzWvX)06$miwsrb48Y9@{c4Hca#{$BrJQ_r~Y@QGcIM_%Dq{W6Lt0Pu4V+ zt@@aaYc$SZ#-#F^`bY!*2&v$5u}k~IKcZhjbk~X0Q)hDN&U~q- zx=wVR@ULi=u=aMNqp)pa2tEdW_*CrcO+5wPeDM+37Q}Xlyg^aZ-1ew0a;xe_nr`tA znSiy68jEEjdl03x+*+L)*1}pO6Q^+kKL54@XFXoxwZm(#H5$i8Ydp1lyCJLUy0|Wh zK&eXQ2#4Jomp4jr)HGw{tIY+YCwrd!*fFNe%B0bhNl3>UTaLm4ZTU;FOhP(sRAeIM zStd36p6=(8NqhpoC7+eaJAbuVB9=*`g|B)N8#$HrBV;0A@YBaK zFlMn#o7@$OwRbng;gvQi9?K~ztMOj=>dH&059Mtl}STnGB&n- z`4lCQXaaihUWk@ zE$7{3n_g#`SP5FPBboddK1UOo@c0y&NN^!Tt+2dXYV$TzRuV?S2>&2<6#rWUB}Ni=59*{5k%j_1D-Mek*^E zSXxT{Bplf;Ch@fNpX0RHUNEN3;;aKF@&f043r>W^=cDx*>3+DC#>+E=u<(e(@FAI` z|E3MM`j|u;KOFNkYGaZ=q9TB|(?y0!Vkq^Vr+8?@+y&~cz6?TVWduQznGl@N6 zzVtp1Pw4Z=XZ`K-Uk3j8;E z`>Dm>Bd-R4A8HwX9&Om#3`%@TcJl+DK^oeU*b7E&K%Jm%E0utQ!QlNhm$l)ok*$Qw?x``#0n|4x6#_IDT020j!88AVyNLKUZ063 zXvv4!qBY!!=k3DNn8(`UQ&+@kyjBpM*jeW7!l&}P)*0^f!`2$^Y-6YYwNuyk=IOCa zbcakZtJ|5~@}MsFihz;V7lNS;PY2kwfa7%L`*~#|Ym2t{Rp-TN%2)~)mwD^(sbuie zggf#5+%lmV%`z!A!!gJbu$YV!4clG-Q}f8F@FXDLVfjhNNoRT|-o@cgnVk0FIE`%G z`Nd`4I^5asf7-BZgPpGdRwm8xsp@+xdX$1p}|)%Pb-tfx~u;^ahf8$)+#P4^LF7*9-k`w_T%K|mx;_3PBdqAMkJ{Xs$9gFZp>Gv&)AIDXuZUGy{-I@O*$@5Fv zUN4uc6UCRJ>*Gm2n;zp1Bitd%!>%#8+B%}P$W`HS2B*(Sy2TTx$9PN8b$3TS32$TC zlX@cj=aPla>-`Ed3|$@t6T8N9W#(yK<9NRMxR#n>!fll9ci@HnBm?XkNnWtF-~kwm zFLg!aud$;ZSJv6hFyr)>ua0~?#HS6N&0nf7$dXznmyBidtnERP}{T%Lrb9$YOQxR+lgcM0hBpn#TNuRSu-b#>Jq z8AHA0*Mfb{Az&vafqL^6u}O*-FZ%>k^ELq$T^%eVC1B#Dr0gA?c91rcrgoI}zAk&c z87S-)0z053MK^C{+Y1JHswGlDx3)vVw!Roqd#VK`zfGkOffP~pUN@r!+A=F@BeV&+ z`J5<*)_jiqhS=5vqDulv4-hOWi3ezE&EG$OnD`v6KvLL^iPdq8#1_b+jLYD@1v-MK z0u^1g+(}!M$RvuV?nPagI;imQzlCb`lhpgBpgJQ?35&$s1jy!;a(t864rpT5E+D@!J9G#pV(Q80OpX zcnP25YdyNNuj6t4S1$Qjk(I5)Y$%bsyZ}WtQM_DKoQjN?o!s_*BIhTPkV@_rfr_rR z}%N54B^--avSY zs>N3za$(?TB`w3p<^(TlWzO6~D>aTS3hIKe-0SPMl!Q}V-UeQKGWVqYFr=(KW|QI31a|?7y1AX@L2k>PZq^-i??nDk?WWyb zF2Nv=>BXnBoPm$v1jB(oRSH74s~9>CcGlsF-At19m|fZ#KiC(Fv5)k&7zja<%}CiXPb2URd)e{T7x5q zw9m;5?yWeq_1`69(ZXwQ+f#FWVl!B-@UMrE_UsWK`Kal4hN4bz6QF-p}c z2T{@4M#ERCDGx;?Wk-OIIaW3mgJr#`bC4-l6^9FCnOj;i%4CQ_P%vd(#&B|&V4e>g zi;6ow(KC*SjHD1Su-6H(zbKaM9zO2yhIPtpaxd-+sh_Vv~DxoerxaDyg$Q& zX3q7_RMZ^DWXpE&0T0OO=NrW{dw_C>{KvhIdPhKssAEJ^IHO<~t;G|#x0K1?u_FNS zFV`}=WiH^UwHIFF=ysapcF&aEgJ+o19-7eQjT*TX<7A1O0dt8WC(pe*OZZBJrlFdm z&8(ie$wNhd{WtfRa(KJDk?B#lyAu=6FV>Y)cDNeR*|u_cJvnHGc^+~dT^nHO&Qtjb zD$n!qPq{q9T<-bhIntjm@+w&N2VKym9)_#F=6Krd zm4(+~dDJ_P>QObmzI*Pxo!{kqMWJOl!ytuEJALo_+U5zxQ$jzbev>0-3L-ogqKr&p zLOGuh4I6=wn?A)_QqujfV4z`mU5!!0TaC~U2cj}fF!CGiim>|SdRSpdeh1^0!%)-f zUF!E>CNwz|DidboA%^OCfP~7ufJ ziISZvc#tPwyNr$sJlKX zc<0az;cULQWZ-tr-vb?FIp<ftVm!eXGX~IDw zbDfof<2x-+QFVM%hsyM2xHdt_e?+nd41L#=jU=yg8TBx2lRQ#pjvHyZ0w#BN84jgF z6Fs-LfNx8An2jj)VO9-}>IJ|0kV}PiSx42coxSPUy;t4CR?< zzSRctEDdKuqU2AL=n#Z_?Nla#PBT)?J!tR=&r_FsL)v&$N0qV4(4stfq~y6vp*NxT zX9Yc>2XmL9oRdNpw5cAlJh6Ruz#MF96!L}g_)tC{LoyviQ0a4&rv@d9f{i0j?09Hm zFd}#mphG5^TR@hOyaX&tHRLF17H%Uo$PaHvec$o1Ze&f%y@gjliZKpdK*5}LwU_r!=k|G& zg1wi~1?|fN8{S{YI@0CYDa+TaR?21GPcYNEIYhaS=$fbTykwU~KBgtD^ICI1z}gLb z%W$R2m4%0e8koj}cpxYSg+IizgP^ei09x02xe2a%+MtsBJ-4U>diOlA6#sdLR%S6FGX&{4r>GM+eqM+ zb|m0Lr14KZfV~!U5u%gkIS^ue4BPHy8GM@~#UtKSvmR|`PA;{Wn6RaE#L@{~F>ece z0q?zDBb9scniYHJ2n>M=VWR9Un1xe3V(?&9z!!`*J-*uf{uHioyWGUa<&ESjHDk!~ zp4VE8cRY?V#FHg*j$k#0U8xeknyysuV4-4=FVY5Q3mTmeLXtdz>#A>nXvO_`-qlYd z22UO?Nvd)v#S^C;sy=r&N2X{6j^GI=)2@Kk0S67?9|I?(tDC&T*p1V z*c+_8{305uJk#4vBll2vHIkjo<}A;%7kC%{`TEOG-;~3HTCV24rcAzq9~L2{*7!L; za5AZ47;Np=7wAc))k@E=>$N-zDeX|7*5TD|@!E}{|6FF`L?0aocRe(^Qu79dT{634 z@5m!0Gf`qf_uQ#bMTrGfQ&h{$(KL3*2TX>=Q8Fdt&4f-R&B<)QK25m=0~!hCO=nJ zesF29rp#*zKQ&?;#og&Hv*+a+wr9KDxh$1ZjyGpiP(u@H%=i*@cRS8yRaP;>yiI@R zN&1zEnHj_FSisRlO}b5AF_ z>zY;TZdkQu%hZiQbz66Cd{YMH)P~cq3znXoI`p`g8OYr0b~jH1;O$4rq0%_ZWGWXH zAF5Wjt@p!;Pga9hi@D+k#}5o-vaodN!j)^zxN_{4b?a7LGxnDsICT7hC09T2U#d6G z2CIus*UHytKf7kt2mbitg@uKkv$uY#nz`Ah5B>4pxSoAqd8IelxVne?=5PMdm;T|Z zU)a>R`VVJ!EZng3hJSnXdkc?#{ObR8J&%)3nc=>v4_yC=OJ;X&_|4h7{`JLcW*a-J z$B(r??Vq&4n6n9qc0y|noGCccHb-I(k^Gu?%%t9U+qr+wmV;jOiFuh+jZhZ zwf5W{!zZfMu$c~$hvDDz3AqpLHDMS4X%!O`{=zZ9-SI_{`s$dKlt)(=RN!EzVANd4?nl& zkGBP7mH};gs2Z%z@X}*j5EPdC#q}?9Ij?1$%wDo)_L@tVt=z^k*_7L`=~eCkQ~tQ# z*4ulsKeu7(-aV`C^*ruNkxnW_GSPnUYUme>+aMDv7FZ?^7O5Eak&8{Pcf-=9-@kIr z^p#_?OM_Kcjs4~Mf3a}Kd#`%*p6ZTS9w)isOJAR@uDNRLk7rpXTV{7GF>5a-fBAi- zn65j%a<}JahIlSo*7eB3!uNVse&AD?*;{6B`0d&Mz3{DtM>k#lKW|;jZCO6NVPfZX zJ8qfXx#QEfJUp_nYPK;}K7Ks#Pg_$;ZF{C#yZgR9-?1_&KY5U4Qrf-yq5o%J?Tpgh zcYa4?a@(HtfnTp4dgk+opRH7mKY8HqHht&i5@fRbpSRstIsC+Ze|*-zJ-2k}^S_(> zpDdFp9w+NqCcK$;*Uip8>R-Ko?B-s7+ooW{bWM0$q=n_)g1hwj4}Imo2M6cR{`#}~ z9(tyFc+&%4NSM9|;&b#d{Phd=^kgSkD;)Wj#m@qL@_1UHu?09@;Ch0FoHK^KjHYGy zE)UD^s;)d!pTJJ=g(8a;6WrGSyLXHqf$ zu6K2vXj=80;vYj-SLzs@sXr)r1fl(xI+oqOY&unh#o3P=Dyr|ubZm3vZVc^{=g1~B z;cdJyhG`b#3HsDI-tE0(QS2$8Qznqd58hNJ8#|+aLKq#jOLlB}6Pe(sZzK~nlZx&8 zYSE?E)-!5xIDHe<;mc(s_64J8FU~5H%xbnRV&f$?V11*FMsMOp<;>A7KaosQ$5O{e z&%EN7B@ZA<>*@*u8cl71Od60$fcjef8S?J6xm%$oZzG{JMvnl`mcAQ5dF}&0xlB}i zLU|FKc3Nl5PXpFYj_@Ruwlpe)I^Z`{_&J3wu9ZnW%3mYv)36ny@GEhchruW?2@dhU z(;|}#om5?9q9rf#o!QtjHr+UOEaH8qG+Jb`WlQ7CTX#wxK$Ldk1jmma+XC7F*+nwx z1WQi^&wK$m2M(D$a?8&5KDNEX?_?`n>GeEl`81TDDBjM5PE)TDGjHm}BEw+t;a(3HKr;V@)Vtth=^s(NY@D!_WM7 zag2_n;P>n;Wpd&~vH0yXZ~Se^BM9w3tGkXBNk3*~BK5V)L}3SDALdYt?lN+1jEXPF z;E|E@PybJa!Z=0#7p)y*^D1_TD#C&He<5rHIXzRc*M3xh{84;lUzmXG_<1S=zCo0a z{X9m5**BusMs|^~LFC~2LU90UkQclb-}qeY=h50#Dv8Gi)q=9V4>^3M&v}_<|F0P5 z`<-wQWq<>;!51WG{&T4-^3PbX&%ZtEUy=IZk1;3&f5q4TBG-!b&uHWQzxpV*3Hf-? z%JZw1{Che53DC~*%VU3wRLp?(m^bTjjd&pGQQOyF%WdSn0sKY^9o+BmOau>$!K0R| z^~V@PH>O|%7}+br zUnA@s6T8Ye#C!WK4%jMMJ4>Q>eEB8~|BJ5pe3UX4htP;Chj&O_jI)c}*jHpGoPmEu z5`T=Vd%N!zzl^s=*KPK?y4PLL+f^U=wo)Yz`@=Y&l<##DUy-rD#cN6YFA8tq7cwN+ zfHrv>wS7I~`4sFRV>)=3m&dm;Nk006ckV|YgQcSQ-D=m{S9S452wgG^vDzs>lVwwp zJ=UASOFO^)ZL9IbVtO?B4n$wGi2aqxyW+xj);D>|g3wN# z8tc;)Z`i9mG`@=57aI6(!_mf=%=a%m!u4beP;E+lL$0RPtSfhI|DAl(pzD zK)!epEgKa-Y0*CzrQ69w(8RpkD%qon9N+6<+VWvD9jiuV6M3a%eK-RuvPgqIuiKl) z9&5Z5`KN1-WU?JHf!)@RBbh+9d5oeO z=8N^T{rj=CQk-6?h)nEak`~M4wTM^FgL%#idvlFR#>F>18jYi32`fGsN%VQma>2LX zQnv6WGKtreNqhwPEf+1DhGlzGCUPIkB<7v?Uj)>XB?`A9ti|clBE=NdE4HSVIsnlM zfJ7#ZKeaMh>clf}0`XxFO$tYx zCg7d1zPq)Qil)()bjA0^C`rc(scur|!x|>?vS61sG6_M^dVW&#l4h z^{F7zU92-s8$HUpEB1$)=&o8!v&GNN8pCf>ci~5L7hZbR-a;nzBDed<5qxi0VVrEo zcN-uRJ*hdD*4S+-WUYDi78adKCawIbCGioA6)$>qS&KwiCbGY1yf8Kb|t^WOSn59<=<`V?^Y2W)#0Df`fE(;Ptr?qm}Syv<^e9x);L@N=8*SLoo5 zzF*n>#r?`IsY?>yYJ;bubh$Kb^lCGNsQYW8U0VGrayatKsFSdNzmjy5gvGxi*I)aq zicQA|Z1vY@IR2FW8WB`+nEyU(aUqZ3dS?eM9XQ*3K5{y2EG5je)sQ~WPHT6oPsxt_ zg0D4fPDSIQ`rd>dEwPm9#cgcc zgDn7FK%u|6;>RV6Oh*X`_(S#1sCF<(nRXKDZK3E5nShpG6NPYfV~Sc(%;3kJgKl-3 zbR~y9UAvK844N!Wm6jODq;3N;q&h+42QM_`rWvQ&o74_qS=%9o1X|)!(Pw)p%J0ap z#zI8L2_2x~pQL0bxZ|BM?GO!gz*{u{B&e2qEYy>5vvT2>Wt)nUyeM5oG4cwtC5LR% zlHXRqi!1!oeDA0z@=Y5muoy`Ui^@fVDk`zK?TdPhtk$A@O|HohZY|x3sXZ+G=z4Z> zTx;+rhR(WTK%=~v!9rmx()d_%3n=+@F&dhAjYJR1oyCbijqscEIRS+q-+KF}G{4)(+MO;GVoggObwEkp!U z#JVJDaYXjKumkDsU>lp5rdgP`_+YVR$Z`;1`3bP6B8;p%qce{J#&69PLu*V#jy=>Z z8-Ia{j_+_FijobDWRT+l0Ao?*=>1WuvKQ+>Kr!-alrsh;%Wr^`Ok_xQq2C%th{I=X zRW{bzAxc~XH8ObBZhNd>F^J1aIaE}OvmssCJC)5*U_aIzK|gsF63ogr&e&EM$!~HF zb#(zB(rS`H-i`aoizQ@EZtT$sWB^DGHKYvVSD|aHJ^?lzWf3{cnPUM@6Amwxye>IF zAyxp|(c!qXIb(48uFLijq*)}|slx@IdfJB#S?k!+!sCb_g^T7Ia7+^SbxQa>9^c9t z9Vx{{LOE*bGzX9X(4XW!7kEt^pYuR}L(nIbb}`)0Y9OZ>*aI@&*W9BDO0;Av??r zVMdP*tcA$mr5Tw*KEvBd-K}Wev?_@STb#k=oZ$q8uCH9}D2fh6fJAvrX0+B^J5s?( z4u@NT*U7NJkstRo?<<Q*w>cXUgCy=n;8{(P*sDl1QJf(#bj04#)OU7}5}7eV7(rJFe`W zn}T)+5lz&mC1~Uq_uAlDuj6%rO_9#f@*gV0p1s12=HA48+7=WTCpoOV>Q4k6_e~gr z$pOd#6mM;)rO4cJ0+}!RS7EQom^4Q<;oOV5Ngz88!oT12p%*2f~>TdZLB0G zsZ1IJl)FnjaxK6-gVA#Zkq!X=1LP}t9C!jfqKALgl zysIZibGr#`v>BKxxkG;IOGRVAfpyTUwxXB{1w0(X{PV|o9AmJEKmn!1Tt1#3PT%$)dXHW>>+E`gwn{nXvpbxl{;%Hz<{UHvu z`euSs2&#GVCuBf4TE-9>27XCK;;K!DGZrQB;t%VYJV#3>cNo zOtGjmZv7fb6_pyt`Sb;3F$gL06iAXWz$U34=ugZ_d3LrNTd zfH+|GQMZhj2MGmy(IO^(C8O7TjhTgX#HhsZpR91L#7 z#To_U)pMbr4JzXQ#k|c>v;Bt$9L)*q3^3I4{KMJ|3u|jBjw6A#1E7(iYt@uAm`W3J zqnvB|`N}F*lVzFXU||iW0)=JXBR%&gFu%1W%#lH;3p2U$e z0XntkIB=xMvzkXeXpp|#GwCk0f;B#=ULGTT8b$Da)cWm$-^8Leoab~N6FKmPb&BKU zJsBqv)kDG!%m`QmBr3)5YMl#Uc>opw%4K-qWTB{J^=9Ok17>@dHA1UcqCD+hH-^6y*ys|M#(_qN^^2g z;vkVK0~P-ekB2H3_wj~?RPGRo?XMYzVsW_(t6m`I1rxVNQAIH|c~!3Uur$ce*M%u1L$Q?w7-8 zm-`0_ozqt}bbDDfXo6Lmd535!Xc@2rtmgqt_6yRyq2g%>&Q3_qzY9n%&c0-dFxEoo zaApV>GMYvV&0{;Na*V&;jRB7Afvo-}YJ?4%!8wg)znByjN?$W3Eg`s{%oTBdPf35p@S8tqwALUuf_~VL(h8<_f4-F4rm)9e%Td|Lm zzRWGiVznVebB)Ykv4i3jRgL$R?<~-UEF9|O>FSC%!`zs`b~9iudM>jl+&B?wsEy*L z9y}~EFXnNclI$MS^)dxs;z3(##9=%d)Mg?kkz1~`eq1hMAi&_K`4o~t`)PvOV=8%p zAIh6TPg1a$i!li^WRDvR zQM$XAtC2QD_1WrW9NX@N&zrQQYtPr(zcAzuKB;-ZF~K8d1}P#G@TEI9AfX{C5_;}r z(Ct}jPX(q@XQCWD;IPX*-rgcUCPV}yZIMyK4e|1J&SfSHFrSi)7&S6?XA@reTvgXDXnp2xrnw2CMMm*uMxDEBS=OMcFojX^pqwv-(|&)3o8^U zhVlZwln1X6uVu1}!GZpwL(E+~_Ym;?wD0Fw{c>jsnGb%3)dP;Ja6JlZyn+L6aK}^` z9#*;35Tj4yK}^!KU5#JXs8fgf3UVJ&<2s_CBGRJ#b{vMXAXeNRDm+d(A}NFp=QXENLaLa${n z1#q#Tk!_l#kCzAG6gk7X$gS3LI8w$d)Nga2dG#@B8s zkg%y8v=a%4+fvC~6}UcDq9B@=PW_OJ?W3T!LYzLCL*^hWJse}EE`km`Ucc20kDywD z+s-Kb7mrg6OZ>&OBPoHqzyG%p&P|D?6Zi13^-5@tH7-7h3#A6RhB z9O_aD!?@n)lSl%_%$1~!kmm8qX3p{FS~HYD5MRlP1keBMQ)D#9aZ4>>0E$-Tn)%Vr zZn%Wig_D@8qk~pf(9!bq+d!-j)i`Xwk{ux zWl{pBEtG(YYZhQFW$c}xP2zzc4=1cXhe-HxY157poK-FP?J&b4j4T=n<7VkS{1Ymv zvuvPM^ViEF`zBz0fJxpOOldNHXR>a zi)b{G;t)1r02_`$<`RLmtdy?v>H3vd=(U%GIj?u>dhMxH+VzTo@^X&4MrGVd8e-j8 z(yR=)$U}@V42o`+b=zt;!=qT3WnD9u=EtEY*n73QJ*7y{h6$>)`8)rJomrTXXWHC&tl5q zxNXt%q=;KZ)kB4IoQlf2s*l%tTJ7?9>ZESVG-nWk#H}#ixGJ4?`qKxn&xIN%tTC_} zn3J{|?i<|RC6UZM4i7QSZY{uLF_(9AMcz4kj)H+Ntlo|7JdV>X<#8`G5C$^@${15TuTo-p*qAvJku)gzqWt?*F~Bz*xO@6Mv#a39^?{n& z9OH3Zr&jT&hJ4Jc)bCY-;xm-%4-Pw#aZsS1@zd@aR<6zy`&7Y@4i2TRtygGckV|bN zKeur;=d#Lk-_VrtSvR}O_gB&rO7(bC+(vbXJA{eGhWWbRWy}n2dHGWOC{?b2Aj(za ztfpOqoW_cicZ9;m(hOmxW#HG5IqU4w5n!SGAx>c)hpPjva>W0~~-e28zV~|_F zdic@V9ka8a8lGMH3lBCv{=S)q^VRA@-Tu?RvTpX4k#$#J`WNm)FPCV~!S`E#c2p{1 zS;&9YlP4>OH=Tb7R%fiIOS@8gz!x4Mdk=8fDRr}cVc2*4)t=nbdviTsd9LD2oilv> z!t2-EID7R5XHM`q!Eb+|n%;CY9enqA&(L#UIvl{);->QtJM(w;P-)HyPQowb`Mld2 z_`<&9$NwPr%AZKiY`&m6`x)#E?zIsD@9{I8yGoU9(&uzK&V1HV%;M|PLE zDZ8Yt)}LdkbRF!qmz4HBd7?D*k4Fwwmp|v`Hmw=%IsT)4@B97V8K#TBTuv`{()-N* z9;YmAFY_|NiFvi_V|%z$bd^$brCp{xS6Uc({hFIMPqIvIS$9eQ>U(dvX7+otv)i|n zA(N@q&cf_1v&%oVb=}fWA9-VT&5nnsTyuP*GN-Sbz2@ReH(&Z_&o8JFb!P`l(r$R5 z6#eD&-26(lvf=!_7$+WdR~O5~#f~L?0K<0|^1H6HZ`+MM#ADnkeEx1`i_<8STVyXCyYd;hdt-FwEG+^%!pQ8Gan?b=h`#ceg>&oQ^em{)djFI!UD zrGI^|x9;r2)y#8&vuSCrXWNc_182NrFj&iNTfWrUN0}ZT9+6C3D3B6#$FA@0p;F2- zB@g4oE5&v)P-WkiGo%1sm?(Q2pM&>4#y``d@FHMk!uz-B=_8zFv8Oe+Iyx=>x)O-b zkhX_o{H%$xN00I~gug|c@huh+-6iiUWTCV*^64lWy{F>y#(64AJe~G#*G*AhFZ{D~ z<#)h(CggQi?QP?ZYL z619kDj=ZjzUYnrN8VWwFu{dlyI^eX=K_;z!?K))=`TC3T30=Q_lWY1+48n>X1oq?`db{Ped|l^u8cx zyWc`4@F&-3ynYmCqp4ioxRdlQGz zJ;qwjZOT&yV*$-y1AflpKSCZzJ_U5QLUNu{r^ zQzk`)8?b({?ppsh%Yd>)CXIy07VJ0?nM`Bl7Lc`5VVV5+SR#`wn5YRfZS9SEJzn9p z%EbDNT<+LWV22lq6s!RsYikrS{47%$r zWzuMzNc?-M+7ezQTiq28_@?e!B$Ei2C<+>HvH2qs8^FkJP#BQd1X3{^aBO;P|A_eY z@L9#nSgjmqY>#bIwh6uO#ENsmWtrh!76d#4LKgS4963^vYeH$WOd@m+p^8a(> z53w^(Qg=%@#u?|Abofhb_0P!R*#BZ%dfe8|{J@9&Wc@$JG$S0-6Sp;{C+3xuR}nqd z=Fb;fJkA2ULF?Oat|a~w<8;bLwtr++FatP$$=c|JWjtqex02Zi8^5jAo)ME$;?oe} zt&z{d(1tmGS;E)mOVat_-*Jhpe>2IOQOPIq@U3_gmHSYC;s;Wmgf`QO&Uh*D`547r zOV;NjMLsAwoZzr^**3=M@Xxr~Yx-vlmG!?Ew}sO$KziKPMgAP~mAuEhL$0R?{2}eZ zsR$SKaq-O7(6$xjQD4j}E`Jls^Ywz92Y=D;9c%pHPef1Esxlutl;Ijg+TboV~saP zd7Sj}I6*{m&_ck<3ye%K$iSZ>@C&HJ+chu{~ z@eETfd1c-9COA9&GB&U4B|frGZ2C)F6mBgKKaDnicapC&e{^+mrM7x&E%hTGUJk&X z(Qu49*JfV?HXeQyl}}g`x5uY#c}}-qhPA#5aaEGR`aGn>F0wTq`C|J>;GrhIB!1$4 zdG4Hqqk1Kb_}Kn2O@8>p7Mn}CiPPe;e2r*n$C=P%%Y#NsD`+(0cdqIoB9V|#EBC~8C9UW?NfIt3_t+e`!hzR(`w+9GZ{sfyYkg3VBC zH#)UgTP?5f?d~>=VX8@4>*`1HDY92|t69jBEdBxqyBMTtev_{C}nMB&( z_EQPVztGO!1XLn(#RW~&ScMJ_kaOoM${S@P9GxOL+st+3Yz8HbQ~udp23Z(S77se{ zkxEH*+<klzrmy+kUqdgNaVh>7nC2>ErI zi=t5ufc!cthfvXz7#|NV`Oa}pM|2lV$FRhcDje!7IARFJ>)atcp8*COP#YI4aH%L1 zdRTXdu=TSfan6XkJ~{WmDEcHJE=TSZPEANARBWx2#^WBTVHyS_2pv0=)Tp4#lLFda zI8M*weY>ZN__XyLXJHO;E|1F_5al68Qy1PJg^bWMj4kDP=*hI#IeqjSkApZ|B5W<0P&7NS*mF*$sT&W$5%WdcG;8}}!;w}SEH;{b}o^v|Pi4@Vwd zp9#a8$_exWpoJgLb8xt0g2rp*0&sQr$*DrO=tqZLefd<1<~B>`Fix3p#E&aHS7ct} zAUJCLc?}jAIux0l!Z=#HT(vjA^})mel(_!P-QJL^h3iTa&Vu^XP0gWitO(*kFQDZ# zkVxB!(U-I_ge5hT<9kD9pi9%ZSC%{m)p^=?GFi)HPxHwU$>lbI_7Zo>c+JO5y;w zso1^QRLPY36k2C=sKW6sZXoowQk+T28Eu2X0{T3`i}Rnp#w)hI`8nfw6GJ$IZj~eY zmzEon@or59lH+XvNyZs6Y6=hRdOW(PC`)uFds31CAOjI26TC1Qhq4tStSXMclq6tg z_(y|OvgnnZfKpMFHeM>S;`F3X5H0&9!ZFFRSN7`t6DFd?l~bP);0~Hv3mUM*kT|*F zf#7mSk8|n?9#o;}eK{@#vWudNqjsC<;Fz-QKny4OLbXPb%eXgsHhaJWJg0>evKBgy z$jP<^VQrD2dd?Jjilo&r=;Dr@RADp2EY8L_f?tzmv0Rj>2iNDGqUx%SdLUsR3c~o& ztL_S`BG;*sosTPu>CosRl{y%r`43%r4!tzXHwSqP^rK32Qv(Du5gV2oIzV8aKS*Li zU1r2t2nO!nxU&9VF8Mh5;6jD?%2lTBW;x!eSXOINRY7d|$N$w<8PIZTP?;Z82xN5` zOD{&6FPn5%`Gc;B-iZr<4FR_~^!-U+r^Zo&k<7Sab6h7_(-kPPUWJQ3@I!I;szFs~ z!Qlo^u--IE77xagBkx0$8@4r&XmXpAK)7dX6_PD@dK|Cq9Z`}YD_~8SHSn8cAw2)l zGS}A~uv~fQ8+ga1p|LrOGna?z>Lyc^iF;0>MHf2obc=o*X7mL@H!8HC586vnYANDA zW4kc-Dy$jkG|9oblSCnL-nv~N#5i=ii{RV}wZhy{a>D(q_N+Ap{!qdJ0`8)u#wE`L z-!eEUpHqA|q~x}N#Rbe9*>Nca!X~}P8LMM5Dvtsojq`ZzonV<>3Pc&G2@ite5To=* zBvY5tR!D(n3LItobqyGXauB1EWPCST?u`r{L-Ae)b3FQpd4XWN>wrT@QC!^J>i$WsVHkI z%2dIAnVFQ#7%mFF>vwtHU{Q~7yjwPI1qGQMbPu<&%w7B-xAUVss(D~>eKp3fWh^2U zb#knHnY$#TjVYdkr2hBW6`9s~mVplr@E#9CO5h3?H=1ZN&{&Oe)5f{gDhR+QLqiJK zu&R8SU<_AL%oO~GDo)wAA!Sh~u;O+rMvPiLG1yi$DN0LB+w9@lOWLY!o<#y-y6u#Z zFC;=v;9t(mFpbW{Emd$q#iV1zY6ToidwII96F$ppcn)X%#v_MEkBlGV_erPlM57aa zjk%D=udMq~8|$uaaukMBI765bvlCp4n()hktFt(L+*6lcd&c|kpKvD`cQAB?<4Xr{ z54vR@j1F9(@=VUF0$+sw1lP=CJ)1kooEabB^_yaj*j4=@f(dcA;nJ>)V@dVX@=Vzg zx|UZG3N(R795WYa_|p+p?z@k>W~2LsfR(sE#Hr=I-1odG0#3&2qHTGuMncLHNzBQU zVDCw&5RbbaE0S=+D6Kq&1INQf)e8>bFM?=}&qr}0m}sfOivmvsVyHaBabPg3fbLb{ z<|*!rjz2k2XWg9JoN~Ey8fU31Mn>Jozbfwz zO6N5P?E;BpD=PcC6hy|^O9cH}ME(JP;b9Hwn zKBTMoufnY{UYRk6s>)sCE*5Zw#q0KmOHDrg*g;68)ADf z0Bx5q^DrIq;b3)u>oZQ@eDC|r_|rG?u$h|pYaUSsANM%~MFhMgvaF%KU*mg+Ij5+m zD$G|L{mZ{flj)_pcQcP}B@B1DN1h6-Fep5frG5-T#TZuG>SGieWm_`GgH|6~!f=2jYpS^eIOUzjl6;T1zJ zvO=Tu8xQ?O6WFUYX!qVV2iqC$c~s~Q2Ul|RJ*V^fM~kOpRT#v1o1Dv&0rg)vL12W! z;R3dbUsbxsvbC+sual=8RwG1zVA+a5r-Q@)LsXlGLRu zw5un@CJ8+h>@H4n8jCBuJjG)>_N2zUWrIb^`f;-BOX~Tq>wgn0%<;atrH9 zY9`v4?H80}Eg+`JEeRtZSLIr_@6AyStff?%hCH}YKF2B7nRTuY0T#&5S7_dLQj=ws zmSz2GoG!cTvY;`X)jTno?FUxcAoM|nazqdz_knP+w4afp{R zHu(pXpTneM=xaO{ipts8KS#Wt)*~kBl2^>>a1cIj9rze5qgPsW;>j|lWOK15{J2xo zj`_G@DvZ?0N_3FLn6}floNVYz^Ci!eWR^$eE?2zVRM4^ojJTSOZ3EjcS(Y;cc_VeV zN@bACDCdB1#?>TGgx$$^&`h!0?fdSXi1xD~uQ;Lsq2&_@q+uQ44c#a^3qgopks1hT zbvWcJ6|!y$2R#K77*;$3YIPnPA`eDgUAZnbnNcV>M6ynk4)!isu&`$5JcEkpP9^mX z@jpL{HLL&5aINA+FsJ+C&lm`56^HYM^$fSt9WQDudjsfEqXV8K`RnkjPO_o;&$RGc)LTH)=8Wk_Lm-iz(Q(YM~=c$DvnPP z3@vYB5h;JT#si_}MCfEz=DFspeauq_1{4gobF_g=uHc#-$2FRZau=@qZg9Pm86O`a z>!cul`Xfrqa>-b>G>MMHC8<1!a*j05fpc(B=j1X5O+d)zckwVzIWtI&o)rRYTX;;@ zM<%ezVztPzSpONDfmO{AvqI0uB|5=ABk`uDs5qr4fMIznWEE?XOQK1Hc&mn8TSLAfPI=Tf zmAOQX6#9p!Z|q&FR+1CuSA_v@Sa`mAS`YBh8oEGXEilRZ_|yNE+~w}-f!wdI4Tf@; zoRL45=Lo-xC*r=5m8_ecLCxD5-y2mU-x^3wojy*NO|xd4SU>k9FBaX)^Bz52UvtIf zQyC^n^W;>gLEb>QPJx3H{+^UFAk?_&4TXV+rrb38oI7kbI!fE-Ym}Slvf1|VxVXGF zxN-L!D@)$uY}m+ym)q(&Sq~O`4sE6<@LcFT|K+vr;kk0uh0UB-t@OKT!+D{X7WG_$ zyfK!l2S0HnyV<5&Cb}Z=XI6~-ebFmo7?_gb8B^B{J>%_}KhU*%WG+Jos+9*z&}UMk zXYfTqc_DYl+7+%W$+`tqptFI$QTZcZ{^-V$6{~B?4M%v==3y{3n)q959TsY z_|QMRAUe2ilGo4b2z?aUP;Be_E^{jht9M=P>HIsed{|D9LQ8`0rVP@3^e%gt>iJTas7 zhxg>S(x2_FjTS3WW2@EV9d2?lT!Nbac8)J;(p7n%nrL!)Gqce(uq0{^A|3>2|Tr4W@1m{7q|evkSAI*tzc0 zC-T9HS@;~Bo!vHj!|bO&ee1oC-n?b?^xwX3)ru9%m-b~I9ee#p1IuUs<@;|u@WU%U z{rabfmTo_J*2&p5H#~f4W8I_Merw(KAK&oVbyxlBd#?J(sy~`twR-*0^Dnyj;o0C< zSHJcZuH^ri9s8}n_|PX$E?su>4KM!pdyjnL*Kj~I#n-2e9oBrtfH&*l(o!r`& zgJ+)iKlJ-0$i(c~eec6N7k)hZ(hF;Qg5%xXmSEe4AXhwh_+oGA#hIWl{L%H_TUdR~ zYdiOS_jvj6H;$wafQ6;Zn zzIk@4Sdwva+n!zDeYHx@KXCNkA3Xci5AHtx`+ric9N(orgG83e9<%TGv*z&f2P)M^ zw|(w`tMB>}%|RyIho&wLa#!YZvnOY7*?HA3{AgQ$|Ll~vVd~yXZk^q9&CXBHK5)ma zTP`{4#rLgRbxF71clXJi3$O2(oi*QYJn+Nfl}oo0t-SGM^;@%-eEbhDZQQ!B@PXN{ z{@D%Hvo877u50`ijoDQrn+~5hcEjtlm;TbnAA59mVaJx)o&WL3|JZVJ(^((h^ytEi z&#im(#akP%HeUb!tv57&Z>D|Qi^ynwA_fLG|(DUDbpGK!-QtxO? zJ^bi3A3O73s?}#$CRhH^>@A#HwcnOpyS>1FAkdwy-x8?T%!|l+7Z&VM9Y3E;LK+?YaqORkA(i^jhl<7G zmaeg2OQDc@iaKO++UH=rwQO|l@zee;KgO+20OyhkR){sP?p0cS)>wc{{K=H?5Fj!c zot}nFG>6@Z0s?S348%*4zJp4OUEanW0^E@&P1sI#rWD}!uh}WgWveUvSm$~WVgTT zUDKnHAE!>4v_N7L+98uI+Z)qYzSc-&GAX^HmXu>?U@i9u!+T#l`Ut`{y0h)4hNj(P zC)oDKG#9pyHd4pN#!lq>`g+I2|6`j>*8dH>5jLimd}HN5o;U&BW&1E>@`mt7)hyP? zu6NR=XKf~=K+ZgB-a97sPCv#nff~s?Y}2=M+gKyL_JPqiVwu#qkLHxZ8$;B9-l~vw z*=bBlV`mu2Wba>J_Se(XM~}uleKVO@r4{vfN_ewaCRv(Za{sbKCR$`7Ro8Koh3+!& z+SS*$4`f(Irg-UGhtdBueM=Ztu z71w{%`cYi|QTs}-|Jph6)5z;|*ii~Tc|J8x{r7M^>&LBK;#UTZ%n+kUUP5pMkkoV|@&wH;6r>uI$KhJbV%2iYL5$b&(HOvc3~xYltiC89xGh$}sW! zXf`9<^nEBFN0Rs`|7J&a;o+?H?U-)*NsRpZ#r_ zdNtU>ov4^f_1QO_E#SKF5&iCWH+84IdKl6FA93#kCRcUc37+@*RrC6(QNL;mxe-F# zE_c{cTTu#2A_U{s?RFvBn9nJRmXI~F)ObB!g-r3b*t1CrIv@Z84V$x1Q!}7 z7V?hef8)#=uPC$F%Ojao3*Tx%a*L(=D)_%(thz>b?8# z+;h*l_uPA5-Sdv-+Hm}=Kd_I)^A!18vv_I&g|Q8}l6jTYlhddxevcQ`J869nsJs^C z)3lP!0pF9b`wsA4SUe4EqBZfVOp!JY3^1+NXZxu+FmMxj4{|F~|BK~4#bQ3{xBe6P zkBgTwr@0q=I&+R*;J*~ko^99TgiSA@t*sn@m?jaQm+18AEG4{aLZ88duHp{6Dot#` z0Vk7wtM}_HCFdi!Lnc<2N`$>aM{eAh$H5Vv_ic$zfa+Q-6F^bJPG4r4M*ExyPmUbV z_4B&S$z)+6k;$^JvEr&X*NdKSaK475F*WWLafG>C`czFG7#VQ)H20d!rWZEydMm&F z`s^my`rkCLjMrb*2d|Y$=3IVHe>(Src9w~`_&;XO-E`B&jZx~a{pBWnTc*4K7;ZqF zm;0tQ|2Ub@R&I@+Y-`{WGD*|gAdv~6A>W(BacnRsGP0fwlwjDUoy#Cou z;OI@wfAKRGc`B2$XEWyx?Ag>N6PDxY&|Ln=rcEM~e1fxcy(3_ft4gEl>0MVVolF#K ztn9$RK)L00vjbAyMKY1nk}}zb=uVkHcMUXokHQq-jU$Ty!(<7W1PysBHYTeEu5rCy zkBFB{ZfmJTceU1mO^>fq<3;~7p}CMrT{lo#(&TA_Een}!+t!e~^*D5t$fU??Bc}C< z>!0oC9qsy?UfA;E0bZ~tGU(~qwCO;!sinJWA`@Eq#bQzRFL{Svbl2HbCQ22x!g7yC zxYjDk!Uy-6F!CJgiQyzDMGRk#HSnOkPfW8D^YK zUx0Gr+mPV&}kx z(GGu#ft2Tv*Wj>mZAP-gC;k>EZGOj-_VOM68r#yb0_*_Q6$W(V(d_|CxuE@U5|Sg9 zZICW1lno`}+4gAT0)W;kM7JV4p^@B#?V0-ijM{@Hy=#XCB`I3ex|Vx1!S7P;jpQaw z$TrlDztv35_l76BMk9^lLdK=F$C2T1^>-zi9Qb?M#)Kp_3(A_ahfp#B;x5~F7AO#PlUYFJmwrVZk(`l?q?_LjdnpexW=o=T; zVu4C?2`vsZb=Q=H^pb2^Dy|!Ja)Zn&jczMz?`*qGnkTR&Tb=8?m8Dsvd7XpqJm9K) z0N?ElP;K{ZknpXw7qc;yG~5lK!la>ubmc--zjZV*0WZyEjk5rOt;Sz^45!bTG3eT2 zZAi7EUI&zXQoePl5`ea9!E{7+g29*Wj5{AJ5>Q7(Actf;%M1G(H!X=;cSi^$oLdA= z$|GDZ5qPImtVnJ7u$z0Hb?gHOY}NP(6p|YOSAU%K5)`P-xKwIC?AS$Wd-qn-2aKyy zab?Qh=6NNi2JLf09HL=3tQkFS5vP3P<6dz+a)T~{1P2mDLJ*qkhbBo8YD|kd8)IqA zS#S1AC4D6USmh+mKv8RUV9oj7obp`Wv5rSV$()Bf96DAu-S+poWC9pkhNZM%8{nXy6EG`y&j{%V z<75J&#hwXrv1e|0j~bUaH8+e0Btb4iSe<)9UWp@mJ$clD^)4_4I2r+(fn4YSk|{@$ zR75yj&7bQ6FojXa8E+hxK4nXm%P2=v?9#!tK~qj+QbG_PxF5VO=~S)|a%p>`kcXSc zn1eF>tGgzRBhjaR4K5m6lF95BaxwwO!2Tg9OEe*j16&&I<8}0k5hU1JC*?bym5{+X z9-F}V70mfiUgh~?-y3SBZ_nzWhquN9Ic!uQd5P=+gr13ta%M3frI%7olaUk~NVGMvR;l-ewMM|B! zE!}o6fXA*fc9k2tXg%Q`M+GHIMVMUW28)GZmF7W8mL`mWk_%39o~_1?j#4=7Pokd~ zJO#3STcZye&|#T@AWlY0bw+tK@B1a1%o9dl7TVZq6P!HM$g{GnmD~lof^b_irWnIG zxn9X645A{!2}?8q_m;Ip1Y6|w5p3V;?ELVN#e9TeB1L;FlH(XvwOF*|@ zh1(z>Vfo#|^1lV#QS9RzE15pyG)IgFx&c|^O~(vQi=~q(VFU6(6Izrx^jW?t$f3O! zg>r%c2a-fWs4O8HM>Fl9?!D9Xm)00>NHg$JHo_ze><~%;1BUPuENe#Tnao%gw*m?b z>)0YJyLS+yxMP(DQPbK6C_F*Zlb~bC{^H(1FGDi|#vl!oQk{^sC+)b5HkbgWW2J>T z4Z_HuCe*JzV37Q_3u)Y1K1jPvgM-r?ldso8pVbQxB&)8v=QPfPoVkI45!6V%fcpEt8 zY|NyIfXEKifV&ZPLSDn*}XQZam(a7}V(+y2Tp3l3;S zgBs)HI+zr2&Wjj<9-iP)%<}{um@sMHEK`9)Vgx_30oJSMJjT2{{Cd`fLFE67RbPGuR2RuGlzA}gjCI3#NVLP z&hg9smBJjOP*W&mThdin5OlI4HdI%bkQfYziqTh*l^RN1R;VgY`AR`%oZAFhq#Z#6_00k=IvvWC{2MfCHq0DkELt-22L?{Wu9+^E71 zGH2gwS;4jmZhJKUslZpm#WxZ!e9J26^9FCfMEM)SxbI1gw|Gore?q39fGmW8QpAPA zz5;V7JaY2rkUz}>kf}F;T6=+Xi^l>(vnQ(|PaSpXsKtC{;mCL zgwQu+1Y4rNfHh7#*poHMUTr#!muw~e9@0jd3?r8qJ&f0QT%PyGh$scxSCR) zw=<27nrtU{kU|)Z@fHY~jcsF0gPgU@<+frVmQeYFEMnh-T_q|n*@;zzCe7$mW$x&t zZ}b(@&jWcY$yt&XNPtI=tRaF>@i2|`X9rmkDHDd?cr6`c1W_7KadUWWX@;d0MleW) zUV{--3{;m*FrZ_dhgGh*?CBOJ}ttiUz&^jr)xz(7`XoVwYc=V3W*hXk4ckZbln zj!a@Yz`viH70+Jif*wu0mwU9U55QA`2iBW3#=!)>Oqwx>p+Cu+;{MVLhTDcY-^ZS> z^`qPm-I|gG6^tMul$8fT!7E?-`!p-+UM7_r*5bCuoGs%0CI(w#<=F=lfB@|m0XlFi zNdRC#pTCCdWI;1DS%YwA4cTrKx>dgIPF9520RpVL(L%0$zT_ai)l_*>3sdnH8UF7z z^#BtEuSl$Qs0u&gUhx9pX^0iQ;=6EI_#a?*ED%1QWNLv;+A%Z~c%iDK&DYa%k(pL; z9)A+krB9>Z(b!4Bulm)htN?Qfu4`@T4X5E|5$U-2b<5 zM|xCaWJ*U1icA)|0=BwXRyr7ul@|<$JlhZT=9IS?N*lmS{$K>-qEC4~Cu{WgLLhuh z`U}}HAkb@g$>3$F*AH?*FpoOrSwkYbZZK0erFVkNs!(e`m(yiYy%s|BA?ZiRhkGWh zHtSMZKuE(fQGivb%kN=zg$dtgg^+{D!H74Ww%XRqgnEh0IC8Wd9q$>0vbaf)UxAPC1`oIFkyC zSUilI%CAlqhlYnpm#&-6?9zvY>QIJbgTQPjv#qCwB2(rA9du`uPy=Od=@bB6$kb z=9y)&*QZ8QUipO^X}bm`qtmNRE>dfwa0Ab`{&H^!@7WNz=sz!(q=mQ~=7U@gOt&&L z6E1rwYVf13K3z@ zCpa?av$n0w9zPsZjj7~)=J^Gc%J+{}Dktx*82>Qu&HT#Y*?;|IQ~OY*@}8>r&GXFB ziZORrj`=Um6>eTv3t!k*3s;;hct8F2G4=F4YpPcrkGx#w=)%Ix%*^g}cg^kp!1BTt zZ}dlFXL7q|4nDX1s;i=C#qz$P+ThAS_P;}a(ruHR$YkI4gA2Efy?Vg2^NB}K|Lt5s z4|vDE|CzroeCOyIx`=7mJV4P`UYsjDGs5GzzkW!dLH^6$d?{^;o3fiJ*^ zWZ~GSe{ihu^rvde-uKd+w|$^+?0YX%3Qt$oSl^aCCVKJ3We+}iy7IBrXU2A3v+(@C zjH27O7qTm&9LuCPFloEsr5odG-~Kr@wN`Dv?UjXFUpc+=fm`?gP5GKbU-_fnS(Zu0 zs|C5k%$rJuw|`#cZd18Md>29{9Il#b(D%QaFjL_^1etL6>wD0^&*b(m%=N8U_t3GA zzqeMHI$7wuW8bpE)^)>kSA90>i!VI-(o5H}P-cD)GNE!|bYb94N)X7xaO~ah|7)5oP?}G zk;ln1bEhE_VwueS2qJ3o^xGksBEHl;lTW&c~X+$t#Wnc!b2Nw!CSR z+_>|V>7Sec#rHNl$+c448CRUKRf=ej4J$i^W%AP+cRhF+2CsnA^ZQDC1Zw^Rl%Ib- zIoo>qxV^T6O^d~5psiW)Cm(J$AAVSH;-qV7{d&qYziwOB%Gcbs{aRS}mG@XY{?-@| zLGm)qyl|?S;Lj56JbjvJEpMcrv+R#$2F<0!rf zU7nUqR{p8Iwu4Or-HncTD-t;eK83XreDYZOv6@X_VLQtt@UktLG}5##nMmogdp0)r z?795;&h{z!t}zuYI3zN8W#=ibMA{^Iw{b7o1RKvF;bq*e{zQlNR=jdfVsEbU(Nr|SG?ppm(du@l7?&^$x_~GXh zneaFXLo1V&IEL5i2395=<0JvrwJ*R!l8ui@)tk+rcDB6ng>w0#Z?)P79mBk;7YVv6 zFT4fs)~{#XWygt~D`2 z@Sv+a!bnf(fqzD!4>o-li0z-XXS^l(p&|tvzGYVYF{b_--%qtWIRA>hbVL;O9r2Mt zzQEVu?Q4VJc;dToFCi?x46lT}W8%vY=>-?&rR?#&#Uq2*v8Fy2XDbq))OU;ciG+_t zxvp?@@(#t?LlO->Xs_*H(-_Akz>&nlUt)&$+wU({iWzA${55h|Tl>O0wAl$--+y}r zZS>=^*#SF7)S38qw5x%HH)adt$>HZ<*d?ZI|BI#glWwmY!4OLdlL=_Gfz|F5O|g(b6kJ9PUNvQdw z_i?s(PCp;m_SyWZE#Bhn#=n$Inv24nJOp&h1U1&>YGp!QGHJcrp!fey;u1(?l1R0i zMqAfw%A^(k1!dBX?^l%xmM=bKqnI^Nyh^rM=YeFLko{?x$4k5lL-*OFFD;_4TPDBC zIO)OstT0>>nVfsM`SbOk1IH0+$>g#X)`qkN*=*a~to^OsJop91iPUjEnJm@je~xh? zZyOh|>zngK(!PFPrzpy&i$;sH8~;)=`PIe=WCFF^F-|_$syCtQl4a+WiLqn7@_sd<#zBa+gy+}yH4Y{-T_$|6l`1Jvyw*Klsx3LP;_RG~m zlA;NE)uhZxuG(GC3%Wa^6FPH?*^B8FuDLP*iLbYp5k zLX&*}*9l2l!W_F24=kx+CO3E#9~P($ImR zTL`}>7<=g|9>?Z-I_7ZW|%5vw~wZQ!+IX<=;x*FPwI&2bBqAL4vO8dCNu z$ERo0T(%*BO(Z$9qZn6RNcCBO#vd}8PDnmOs%{dDp)G7&a1pc#%+VGDw@Qj|Y=&}{kje#x3T5*cm!t0PK~I85xlg;Qvn{QvBTNI&6QQ+EFv#X0k@tjr`@*Wl zV0bpNZNpEKzbtr!)A}i159kBS$}9>3g9l>rI!jWR}T zsgTtWG|gg|C#!?Bgle|4db5GV1fZ`(*8hbk|9#~kfS<@|$#3wb=Yv~t%`^g=OW7vD z-(z4(Ozk+8a@=_PbCwR`axj3GqD-HT!;VPB9weDb&n$ z^Ez67k)xc!s*N5pCtlPQq4+`>CgW95;-83bq()uNd=RWf(>@!x}VjTm2ZXEcDGd@Nt6>2q%VV zf~Onpah@%~-t2Vj`!zXEt>}n9=|vgC$bBplEYX}9N2AdaIYC+`kgelBv7*V#DQg+S zsG$YmO-F=_WKs8VRk%d~3<*WxDPl4_N&_>jkscbFW7c^wkA!G42&QLm@CoN8vy&dD za~pTm38y|hQ}J%l8S1UbsW#wq@Sv~ljU22-bsF6#aNQC)ZM`X_m-q6}3dJpwhb~r= zqqIIkB6rb~+=&S9`9rxf^}5nSBtGI|IZ8z^dx6yOEuGb)>NsPX)Rw%+1e`g9ksoJR z$t}KuV01w%g*rT?;*9wiMypf}&}}DiCNWS!V3_5=Dvh1wkKwQfR~`Wk&rca7;#szI z3=v|NY#i8zE51<)&jOMoypkO~n{SN{6D%64IF?1CJKD}+&Akz74#=z~VLk;{N;1lm zN1vq3YkS(yX#?njDeQqKOX0(yMn}QFHuKL$8j!3wJ)m5whv&IrR>nDT)Y;!D9 z)MRTbiM}mLf^Q!+^`?`f;SX2-n8og5VigC5dn#Io-wljtUzR~IJ3oRr7|C$03QzIl zxEDykBCgM@bWIH#3b>#;WtJ|DBosLwECNMny=q0c=J0Sd1qmxo=g#5USHpKTtXs9m zDOFYLLuMS8C0K6v)8DejG&MO?${A1s`#3yAbIMXAYmbWZb+kZ(qefzsjCRz^`SKBV z?=~Jq-f%y;c6d4Rhwy6-sEQ4bUwbGS^>RhubF*!)EVL=E;;3KUR$C3>UTD&g_Tk2e zRtvWa@IvPULx^2t9)d=z8Ec5P8Z$U~!(rh3u*~W6#t&;K@aBvn8aBS{7r8PX6+!LD zyq}zmuMHV)$*eu)h^WB6g3qde^MIlxl_zNLI+ET^amLO)R2bD6Vb345nTXNH!6 zodN)K7!GFx*c}PywWa8IEXy_>O5ayDztmgihF3{6RLNrCB8;Vv{6}-r;c{RViWLQ^ z9nLKgg(zivFftb80{>5n{F;JcnL#%BVm#G4TF<$akw-Xn#oq;>t8yomdKBym$*-aj zq3;Jg&nn-bU=JtDFQFt|-zXf1#%MXks-&MIa0(txR0^03vO!aDIB&q%OVD{4jQ>9v ziu}hpR8>`|u~3%0aBan@ygmV5rk!MX@Vs#Xs6*uBt6C1<>WW4sI|hjy9p~1ZFf1SA zSGoP@D?$UKHoh@gdQX+n);`>)FbGBvU-oG(2m<5Tmx(x{{p!b+eXPz54+k5=Jj!a+ z<84-#Ft77cW!pe$eao|i1Pp)TN}hW8X2j+2>IAi=s88Xw#9@&F&C=tJJ;=HXJ}`s5 z@ho?U_=?%EYWxhXn0U{TUaw+$&G#@&Su*)*T;owI=i&nDD=-gKzi0UlKs;ShI7KHu zeG)YAbb>y3i;Qui6Jor^AC@o1YIX(POUwOUMczE!JD=ly(-5tsq5NbhDteMNJh({> zD0!}9DuhVUS#WX~Jvi1+5_;ivj9=56xX&En^>FN)iMQ0jt}teOX}mnuBN1w>`exr~ zV2f@ZHy&N38Ox*8g8}U~&^c7kLs((>{yJ7==AL?Q#r#@`?np3X_tB13nnsvZ1%=6B zGuaQ~FxR-@B5YU!tei!7M#AVjy#$;?b?MuFh4BRC+9b0m+c!buL%zSv3+l^{jt4{2 z@77l~yzINw@0LjC!#f-FYxDIAWh>*w?+XLql-L4HcNt+6_G#2qNR&~CRZ6`FaR&dK z-+Wfg+-;}faW*~6H1gu6CzQ6x$MA%ORT$jN0Flff_Sg-td`}o_(v4MFUUq!p$*R=I zLre!e=8G7pb|2({yTHlf(kN7&?%NsA|2s=b1SFSsI!*RTG(OLq9C?BpQW} z_0p4GPCs=q>$VA$XBztI;AIW!#9SepCIb;O=HLYH&1Doho$(rQ67=Y{2$hA^QSf|_XQ72b zEy(+WIgJYO3x2RwL^;G&+!(0kKKeI0GhrdzZ>J9GDe~6}v{}uDs;q`hF4p<{QIBWC zK_lp;3*nB{35vye!n{# zi#|eOxkTn|+*wR{&1`JG$3s3=CrQ$0XGu0gCZK6E&sV#TH_ z2`W!m8kzLbP){S4$HRLXyf;+(aqbQZWA+lmjUCFD#Re?&ueJ;e1n0DL{vbYykrZH@ z!{y@$6}b#gaVpP?tdXe^ zWhcoR)#E*c66N$-Q1r?anCUcJ3+c)Vj4=Q?(d#iL{RZy<;WV|%T|5pk$~AIG<^0b} z8ZTTkrRu!cBuoc}@QN=+tO>o(0V9jEF^m~mqd=9+;(Zla=&~}nHAr=qGK-{+7tO~q zk}m&s#iK9iLr0s%AtTIk1eRM8vGT2yG=#tj}uDaOD7sG=hecaSDc&CJc zYeYTHD`eJSgRHLoOrh!r#=~4CO4MiwCLF()d#g`8?GT7$-gB;on->7{@@*jVurIVm z^UT{Y2DkX0U;$Et-KLU0zlJ>4@|pvee%l+$5LOR$jxj`^_bTI7w^<0{S#O@@7F6*9 zcJD%I43B8a*6LIUf(-Y8tfx+fv+wm}0n-=OSMfY{|19<(+~e>E3Mi+sMwXKsnycWB z$hs^V&NNgHo^^PS9?kXNkgbKx-^1MZNcyBdIj?Z_0;7Z^!x$Xv5k@{ueP!d!h+h*V zM{R1QiMFy%Wy1j%F~Fjrb$i^JPh@(YgdCkE(LmQ4wug)X@{FQ8FgIGp^JXTj~r zEawe&jt12kS?Q5MvXXof#uXf+2Ch zPx^`0*m5F$SZUz}9q4?X;HN zZ_nq`XE7vgWc+or%P(Bo=-DQ<wMH>=y^N4pCu6s8;8q{yerl=$fl}Hje)5 zrMYnT$HGW$yDIXxm-DQ!p88(S@1tAM0@D-VX{GY}9=m{ajvmaK`tnIHTcwd*BZlf8 z9$8fEz_^o2`&embRqRcpvGfPK`r{xAn@?_VWvWsO8{fdFWZHADy%rXH%jdrMxOb&a zh9MPBMrvg=^qm~*u8fig9Zyz|4)Qge-$uuKM{loiMISm`H!wrX^nR~lDjt34h@SRY z8pmT#v51&fRq>}9;YWC2M_VxqOwUCa5VU$lZfbdMii)QSxB64@>QnyK zVUA0$$e##z>EN9w&WzGeLF2%eW8NP7dZdTjn4c<#Q(rsv)N*gj{ULN0lSqw;C;n<^ z_iS*APHp677u2Wb{zhF#h0*++>ZjGU6}_s=>)xpc;{M~@Wp@Rer>=^oawC6rFDbR} zZ&6d^4^IETCS@6O008Hlv@#Iu}nE1 zh#b!RaN(zK{os%PFo`_)rE6~8{rh*lx`CqOZ&2~JABS@<9zJ^0Gv}&vpZWI5r=R(6 z`#v-G(A!R*7MWD;z8f;Z^~ZbX>R);2>6^TIg(Hp}-gh+G_tnBTzO7j%ftnv@nd~nY z%$BjSv6(%a_Ut*dFf;R;yFak!k^G&j*S+hvu8v;ZKUY}s8*Bb9*Z}@Yc0wo_pnvyUHJ&nORWl)*V{dJ+^LPYSo@SAKNee@fpGcUh#=9&+_eda-y3G@2yCx2Ld@#%-2`Q!g~?(@eU z+V&s*;SophNfB$!|#}kA!{L0j_xo{`g=w;y?B-OPdg zxy#S&W|{1uvFOF^bA|1{F+8>X&V^lj-oG0%8U5+iGpxA3a{2aaR;}B<_KnXy@K?9Z z%$(2-Fd}k9b{5qgig1uN9w9au7&V}~(XP?cS>p1V({g;#xNY0qLYY~r4vD$1l2fj`j z*tv=4moQU=DyE&t)WdYGexLQd*83dJc82_c$2p&#Z%P`&sZ*=p_i*$1CidW2%%{qo z@!{0J{7bggF6pynfw*c7pcYI=+ZPav|%qxv#0z{%g*@}>8S!g*xU5Fc)hwwMl?^n88OrvCmS z>`;F-nK*zQ*T8_-G+CJto^dm`>UQRC$poGo>yU~5+~+Q8mx%|NG@H#s_;n{D_y%TZ zC_KYP8w`FJ+>ow)SSB^dL@e~`WLSLqktRj&-ga(JOD5a4@xrLN{)P7T^qkxBmH zZz~oz4wUzBj+RVZThVJ+CIe0;1nWk@_$$d|Vf)S(29{&rZ$T3<;X8#cnPi{c#E^vB zX;1%t0hz$w5i)_DTQ(+lj=N4cF^!Gq!gl8Sn-L$^#PYa_ak9SYpK2aL+O{dLB@=SC z$pVT$H{T4I*l^v&*W^2M+G+tUsj#<%CrH>>wAohTyms5)*>nHmX9rj&n>KB1miNG4 zP}8NfWMaJ$3eq-czSI?yJQwvnRgwPo_`v)O0=DY~mHKg~hKz#5Y>A`>W{g0*&3 zb!y@#b&-j1%De10H`VLFXmyv9$u_IInh!tUOsrGGf@Yw4SiAY=zx+$S<7E}%eJc(D z=&qGqicggy9i6n~5e55cx_0(AnfZCk5NZT=kPfw{d(yySx~OyDKgmefz=?4b4E zXv^X8Hh3y)tEIt+Oq>tGG~fGmX6WQ{q7+7D5@U6H4{vm}9=W8)8)~*)2N{$cYJX_|%Tc~Ao zDSjGnw=}~qBZmd2^YtkH85zeN%-c2_O;_hEa7y?Rsau;JJ>nbE`HZx*plu&qwXfBt zq|H!^+$OqZ_Q;^LmGi9)IG^*!NQrHxqvH;JMEp1IB{OL48Ux4W*8!d_|Kv~F!nz2> z62j*pd{EO9mtDp&1N1_%+;g_n^3j&)sO0aao}PRj&ZZ^a4Z^InR7KKx6m~(W2zu+ibRec7Qg(uds|z<`cvv$Mym$7NMKq zztL(Vm!h!l!j;!s*klskE`W$>1sdYiru!W1l0-XkpqVMc!?#<{@ZV*ZWzJ!SAJ}#& z(Z)OrfP?37Ncb)7i6`)3TOKWunOH==Cg02`4)-^~gd#mwv z`EPEr7Wf2Tl0Rz#a~N)GlL_qKBl(fB!SjU@-;R(;D7Lbgr5Ke)y*!Uhuf&hRXmhOy znLOgxSCZbVnA+6NHId1tp0k-uc~9EPC$JJ`*mmi*fsN-nWCCdZT-v~M6nLtX23u=X zzw{KX?>RT{i_3(vn6XTIj6FK^$Rp1)eb-;VzG-E$Y0tTHU;lbb3XUH4*Sx8`r(Gru zUJFf=l}R&^$yBHR?bZy4yVknQ7$w(+d|!5;eWtYchVTN9L?#xLe6vgp{5NJ}FT=|Q z#-UqT94L;3B^y#4ZUdR5cCM~%=U67^&b4H+zIpa6Ja(^dUfOJKJeQ6qV=NYolf-83 z>znX1h7shKV(^`7-lV6wzqJ;E=Y_BanWXD#Dr$mk!^F=wuL_^owCRQBKy%Y;>aGEn z$$98X`$scXjo#Eta z{Vuw2FzDiA8=u(r4aUxfu-nG3*p08d-fn2c$6s*wl@!Mfx|22u2VM4x!QDw6_S&mj zG=!by?bYEA{I0gPd{Cl|nYOlDI$CrkejRPOVnS!)Kk^d_-!1=)2_)f9sLfsBTeBmZWJN$PM{m6TiLkFmXtf%tnwe&g&P>nUAzl=C#_Gq#+i=Zd!9)=9N) z+rXD^)fuVX)xMeqNB`{H=s>%xElU{ei$QfqQ0uKXZ2%mmJM#Q6@IiN@(+V^#UD@k_ z=Fj75gq8-K-YNNpOzd4dv^>h8 zUe(48mByoKHZ7Ar{)u3^LcatptzMS4zr_f9XVP#BbaE5e(WK5(WurUd^+50>L-#cyO!J*LyI$h1 z8;rfIK0=li?F~WNtlTAHZ|_pC1y&Jsb5f^aYrK65+`#nNgBr6xT^b44_DWEOB#XtO*4Y1$HgEY$>pEf9_R*r(e z^O=uqN-!$?qf8j)Z9!Lkv7;v{{!8VC<6XeM!)vhsSI_qX%~y>tTsco17(D-ym_~;4 zSc`)gr#?6mk2ds$_IDDO#opmjeqZe|q_&g~9fX_x-yIkZ<2~NX;%7kSogRo{= z<1*6`B$CqjkD*Io57eL@Ef`_O#aFZzKbdk4Pdi*&JRAwECCrb(1S9pAEmAMELrS?E zt`Y#wYHQr5eb>WaME4m4f!b4^Ru$}P9f1|k;H+4jp&^PVP!tE?Jj(ifuZ*T%np7vJ zGNioN-|E2*1#qMeVfbRt0x=lAX#O&jjDZQAFgUzzGdlqZ6&7rKO;WO#5svbx38M_b zVGr6;MLYbGlu@n_n&Y9Yl5%kcXwp+yhKW^yieZ@wrunh6s^#{`JDe5n(bRx*)DYk; zPlbl#5j46^Tez(n2XMI$K!Wy^QmOzLH;y$`LaN4i%x35kB+N^WK#&JG6G%Ar2Wg>= zd}$y5DcH_rZt>Apk9v(@(KfMH$wk587TU$4P|#Um56d#7d;yH`;OsJhMH!EBr7W98 zq*Tr$E7KYPZOV2dQbJX(+om_p5uQpgF!k`ry>Id#@;NepouX!lK^L%4{TA+ zw<>*O}QVz5aE@KHY3 zRvljQRI`WE75olU!UC1#Xlo_Fjvik#nc9cpBeUGccGExxiqnlE$3N?B3rF{e?l&-D z3|P0GBv>qh-{IA>ysv^c3wd*7STu%eCUl2{L(Npw1dWHGSQW}7NdOq+l;n9pUa*gL z^bc3K3KXa^&3+v?s%r@*Q6lybdC?=QFay_AbITMc4BNqyu;rUc`kicNA#Z~S$;8W? zUP<#+2+vK-mzu!Ih$}&Kxc$NJhAC&sDQQii!52_T#$Ywf>adM`C=wu4kp?Z$Ifw2d6nf} zb*irB8{A_eF^kJ{vf+WiU8|NKt)V=u-9qK#OqnMxVH9_5PS0>9hS4M+%$U`hVkCYQ zp+s%AK*={(WtfWpk!a4S>Z!0mlT~$Uw8{y-oJcmpe*s1Ydj<6EP#P5yP7Ra%tgT%Y zMl3j&p*zdS|7=|2RTJt94O%>#$1GvQ@b__{AT%Kl zECr_ced8-k9X#T{0@;ZdXu)E;D(uHwQ7pxXL)QW{n9N3=i4Ax|0?~xr6Q(&5>pk#F z(C}wg)B;yr_siTNRb1yqANY!%GsNpdGZ^|93p_9eXM+zlk{1LhJ7N{-oNR`I-YWAy zsMz{}TDyU6Y*b2H0^)H)@jkxdaZ~*f7GMCElZM{oSJxWKUq)-;a4=Nd?v)Kv|4w`8 zhjkQA<{nHHIkNBZEAdj*=jEGAa`mx3HjdOV2qWe|Otr|LW`=UxW0Ny|JkM0jDz*Ia zS?R4Fq>9eOE$|0fM|(v*4^-34__|;X14NXA{E*ooW5Xk>x|S)D!O|<=26@2?ADsz{ zy_5$^vGVf~%c*PXkgePkX5o{ARmGLSqJ=5HFs7m@QutB$th$Z|##YXjt$k#qujZ*D z6-G@&YTn}#G#U7^{_&u;K-7pu$*u9VuR)QAhgPk}RwBFvB5mwVjQRm4_;k!{$Uu`B z;Dmgn17U6k_;j=^H(K(m&~}WPy%e|`4{<<|kduepq{DHKGSXxp3lH*#Q9MJ4s)_O~ z8MIegl}~$oMW^>hrTWmme2w|C&VEf7N`&B2j9aJ39DChx(WupbQfMz%%5DD?*7mk zT>ZZf`=R{{c^)8U<(DOv#Zu031wmLG%J&YI2`fw$E1M_;bb%hp59$(}APxpaW@>4& zOogF1*q~8QKevBKhkuHaAy2*$|>ms z0uz(d<=cZvgh9AtHNaOMx3O0b;_*mcq7+?}H?_PRE)HDg5CzdkVlWMy;D0A?hS`$3 zkxH3alBNq7rq^7(BQC0)9`^xWJD>v~Mad&?O?jOwQK^t{2SN^kx4(@%2V7-A6>luE zOg_i?%Zj5)AYw559q!FK$9vCsTE|0nE6D2;?w1iZNU|AoIM9=Hiqj9~b$^M%$MHx2 z=Ue1xl43PMYETx$F{lZB@wdqMrnyZy&<05)h@ekc1#tI8O_0Kklh(`?TO`Tc%WEH& zHD1_4@*G3@h?gsKb4`pkyD^o5Mno_~7xQ{AFn0Hmbe?QFz}; z5X+eAO}gHF<0G^`esJD~ATQkY`F-4`M%nXKfrmjT`c8CLoQsR-IsUvd%!}Y8!BURp zsnD9L#nJ{h(llhuiJ4nC$eU@_*YP}Ia^)#2J|1VeZE-jRe}mJ6-speE6h~AW4%k?F zqPi@YnCB?3KaOM1t0|8Q*ZO$X1mzHjdWn%W7x&uZE*$+N@5f|i*#QBX#*wkj;3uNc-MZNN*T{4htWK9AX)3FOTpA-sQN zJufZ=SCVH~`CsUHJk5DQ)-b(Si@zi#<+W^tNBXD&4HWzS1m3qIUBRcu4p8&djtujk zn_hYll7SzGtqeYt5L0Np@J~^NfCsN_ zEuWOh102P3O_}HWf-D2TqcHXBNLFVJQd9_cfJYwUWm$-aFn+p!w3yrz?$~NTL7z!e zB^bmC)L@E-RjlUwVbnyaoM??39cVyMYeJ<8#rpQxkFqR_pz5p%GL4zu5@&o&Ek4uUH$DJXsV7!MZdg&02$JxL{7- zB!^-wvn8KhthkQC7wD#xEQq^DgyjSR@O!+vu{`s2f}jJ|hUdu64FXpda;y+Xw?ZC1 zc9IT?yadm%z*dW|I(m!pBhhT-Aj(h4YukGF<5iUXLqnsvAa`+0d-GG7zR4(e*)ql- zqW5@MgX9ctpfyS!LQ_vAX~6d%>#cnyY#is-at8`}raYsiUUfx&>W#Bl_6NE0Drh!L z@VQ`R{{}yr=uPNLU|R9|Td!lJ!7P<`aewCyF{+|W!C$tVR+M&(mT7xVPp_h2*92sz z{atj^ZtjB{fiUkJlQp)CPI8 z7yQmLmPtW;D*I5fENAb61{PGTmJF{DxY36_@7tP2J>!+8qFeQw|0SLSYl3im%rw1J z*z&1A7$h$_PeAY7&K-Tn)LP~_HchFlxNjR-Pvz;V)ssW4;LLPJmGu?=?2~@z_v9g} zh)Ve@MsiUc&4s=3^M#K4Q zdC&OMkDkom`deFK^=R&aZTa%97kRLs8p-)P)ycWlZ_GsMILix0a~I$lMGps987oGOAAJBAJ| ztiGmy_sqw`}eOmdTcxgEO}sJoM_pSH3iQ zW^88W@u?`<*IS6EdRITN{|)P|PyNayu<*X8cHefxnHk=u9{=J`XKuaggCD%|Z^st) z{N|zE%`vt5M>8`Y*t!4J=Vmtj+UkP~_ujVq>WQoF`bl%)?^o~s(p$N2h!8&SM{2OJ zWqTr%=?4}L9{k{U-+$Lt`@Xh&?7|&qo?94O)qmzo*RBl5au;Ujsl4A0x34qHp8AJn z;d2k|_4j}Fs5kfQ(daiSYi4F{ona=uh2|@7 z!`$KBcVx~BdcA{(7Mj;wd($C;87_0@(9FIm=EKZBKbl@a;}<7wWto_Zz3htBGgD)$ zcdpvBfo1XrResz4d+zzk_R*f}SvLDuMBm&zHg@gU>eZ`1w)3`EZk^e4*Ua3$w;mgc zFFacDs|G#?4;=cNGml(z`fojtN$$Jg%N2$AyS<+`7oPk1nScC`y;of|wra)fcgWIx<79(r}}&96>9H*@E~&rk6tU;V(?1=01J6Z#T(>CR7Gd*{K0F<$fk z=%YWKx$~}fmDfBsc4p7--!apC=h*Ha9UR-ebLLAwoZ0l->t6lgnccTuwtN4pXMVQ( zJ6F$q>DojlKbVWArot_o6PeubsaFoJz5dBU^R{=M**$jC{xb^;W7ll`Pp7V3Nn?J0 zHW#Y>QDN)ylgl>z-m=2(HEW`MFU|G!vP^6n8x@v`@iOMi{Hjk_z1FL@hRlkK^$TBF`xI(XO)n z$Ezj)*~{R&FF7Zlm9kGX&wgDKN;jJaw&6T{K-<2Zp~yYw>b4295L3DQ$Rnsf3yL+l zCvJ(48=rban59y}8>ph5l53l7B}0FL?Si6 zo`k!Br%;q=2V*btvjUgZT9hKIWv%nPlMtBzq`nNxqj=7pvu~5h#lOiidHB*xQBHC@ zDB{7VDU&L!Y6*&=c}VIw59Il?d}kt)V%mprR9f@(<^#>=w{45*WyoY3s#H?%`D9Y3 zLx=1sWX`QsAuMRlf8cyu0Q>-*!dB}&;iC?bep)& zJ5DI6-Maz4`(X2^Q+()&Cyd}t zs$NMNzB*;H>Df(te)963J)O3gI2YbIPI$YLl>CK2bCIAH*IO~lT}!PflD<-J$wW@5 zOD*{WJw2P2&|M$?6suE->7k!1&X?5pQR zCf0ALlL_mtA_~?OolhnJ)?J*VKkdIvr#%lZ0Ns^GU)U>FkKn~pGRbZ#pZG+%oY-QP z#6Mg)mC5=>!a(@N%1C_?%4IYTKCjoNS1FBe!v|MDd$( zP4L05qw@=C#4n_?&E(~??DZ2{zS!g zISAW6_+y0qV&cCsji+AVW&B3oLXhI2+8u3l5$bcKbpUJvt?$L)mDGnLS)Y@)h+U)j zMMPP-BK-cx#O{&HSe&Q>Z6Q||>>oYkOY9pH`^VVYTmp~SP1a0Sd`DV;jXB#!>vJ-- z=?tv>W5O$GQ;avuqdv1WK>f}(Gij5|)gkD5m`BoCv1$hBN%?lV9sAtpn+rT9Ik$GY zf=ek?)R^ITVxMLuuBdMPe6{>~z44Qmyd`tG=j+}6zqa1I^(O<(GVj!}R_oP+yZGk%^|0ab7Orw$ zkN3haZp-dl%XbpSS^*Z9;=k75@xKLCsMo1&ZP4AO?r^HhoaWWj;ArIh({;8bBI{i@ zX`?6&k%_g*Z^5KI!6CfX%;s)l{;YRqN`V!)qpKy8|LGs!edqu~H@!c3`R13mtxw(# z;(YJE*~`GXJ*gp?W2TLD8=&69DkpeBEscQFHKlOLb`(T}>@!Jw13#=YTrdY>I99`8eV1xwGm*&P)>AtjsZ;q^U`ae{Db zj*kF;K!CqjVHw^zPF%}XR`wsqI7Y zW6Z;V$BEeJrLch@EZ*j5n*lPxII;N|d2P|AdWmsz-T!stZTWnu)J^Y+Ph9YcZR@SC zbn$fVWP&vfzWb@s&}8>3O~_>Z*|W`N`@1v?PL6UiDAJOZdRUw50j!%K}5%mtQ5Etzbkpn>OyiA>VG z4t(7imPyZRUAqCVO+o{O;jARr z?lyGSmC%r0Z_rDpZ$^CTS21a8lK$ncdb@2tTk&#jx0}Q@@RD#hR8(ge`_%SpH(Ws_ zgX{dXv1+0~j?ucnvStavVE1`><38?OfMbJ^uZx3`qqP73~z{SsZMI`3}+5r;L z-H~LMEC5B8GiVcxA=)9ylY*!jdHmRw&;?6ycG{_^#q3h;wI+&e$*tKxE9mZs#bCN4 zUJrb|M9UXL8(%wFyolkyKyPfTaZ&MfS}<*qZ6Ie*yUUr5&_4wh%liKhn2+Dp72_@D z)Oo>lM=SxR>n=HGl8B~VU8UeDviVzFnkC4hvkUz~9qRR{l;guoK-xbTl%HTxBt&uI z9HpJZcU{rtX~EK%Uk}26#J5UXZ_q~23X+r@=t&Nxw56tCTDO{zN7#(4&MdH9riddaYQoF#Q93taW3zA`BDnYqrzym2%!_C3 zGabubi{m`tj%^C-oSm5O8JFhr_~Z^0BSIx3!br)$80@2A^1*WCxUBC{6>dwAZPpgo zG-0h6B?L%9zdWGU%kZWsBS9ufsf15J?l5cl>jVj-4fvRqcVaJL((?yB*nA{Wpy9s&nP}EG3!*r4^ioRyfK> zBl!0diFA@=`{N|QWPCGgYf9?V z9?nXVZ>jGB(;fglnm-H@SYeW3NjC2g5$S9xhB)`Rk=4k|eB?v)g@L}%A?+`wbBMA*KRV|bl zN=LuJ5!~)^HcJzlGZ`gq1^4Y^K`|f@VEWa^wLK1o5rZ4U|BsO$z%Od3HQJ=)X9Jv# z4enZZKpuWDk?%?fW(D;f=LL)+$`tVbOgjk$f zwem?`;ImA?7ghx2Oe!Cnz>}%H`qCF|-eko56TtAk>PmMnhvd~bZc~Z46!}gb!zMDZ z>jLf4JsG)4PV@h<_df7-9e2IpoY9eTbgW88%C)Mxjx)XpzZ*3Tx3SWuuCYhr)`$?w zwIeIW1V`!S^_c*v8(ce>^m-)JaHHl0wHvx^mlrPC&<3~L_VG$zKMf@6TNb)(AB4B1 zK(|SN$7lD^4=+t=n?RcC?(h4XIe+fa)nD5wbp5q;X685lf4`aE%sF@d&_5Z0gETO6 zQ4ub#6>bxPwPHG$Fh)!%<5M=7zOINH=^r*T9OSR&6I7}Sr^`Lf!(vhiXJjWNnuaZu zI{!T)g{BA(3zVBnUPNpIx0QJUetast=_^$_%NyRw)hs30uZ_h3)!D9l%Ob8}Ow{8ZH_2cH1McDFy#< z|4bm>N)n;yj`S{$g6_raHp&L}hKBJNmrkv%Fv5m=4e3h5z0Jk~9cZbkBjO8{wNi;GLIsg5f%wMpsrgW=<%trt zbAvVL9URHS{xzaWe^z*}pYN4{=e}153N09I7(3+^r5sW6;i57I`#Qx=v4uK=r{ZSPiSJOkN<)%PmWYxYYUA9NqjH{SRp!@m~w{KM|%wts*Q6S5bcdZj$ z>G32H8k;*b%Wi-=mh1@zXf)(od98Pqx(4nuf&;1_(7bKSAD-4ou1xWGC#NAM@aqhg z8AUhBLIDbJ7Hw}_3{qrng?^Xzk-h&U^}p!|lX!YjP~L|;dWGo8uCz$qOWvwjDMfl%6p3rWfEE=F3(Sh+nzzhBGBkEY$1Oe3Rh+b=lzn+d z705~N>lIQ7G$&BgvLr-h*Qcaq-!RFX8f7%3Q8Ez}sFWqNh(M@FOkjJRn8_|*X+g>w zWTI^8vYTiUIH6+xAy6o3+iEOADK(pDl*&Vk8uPZ9sBr@t8c-4)6T+KOHu%OdM0r~& zU;Z89IP3v7)73>|n9r~n;8R*~9=vdKKV{FhaG-&b_}vrH$X{sO7d@h{{vs)w`}=X* zUkrM&Dw`o3JiRDb$#Oc8A->Ov(cwV*U92%&XkXlq5!8kfofS?&LMHt^bLc@sTUSt|BofScX;6+26VVl0vK*AB2g12+1P!VfyZ6BH&Ykdl{EhR81 z@hUVafakdQ(V6;#DhMLCns!r&JiLR6?z>P!YMmWudiFwcTXuvoaL`}Lw_B zPBdU6y=F{AZL)$(MvWH*s$BN=LXDx5PbX_iag}vFJ>NZp7S6W|kb_?co?YgKqdM$sr?p_`nhig-ge!IaL2xcrEg)M>xlzgu5*jX#(nWhEsO?DQ9$DZo8VC z7(B=A{c$o1@M>oSw5t4oJtf7cFqA#M|M_Zho@C>7mTA064nJB8iPl=i7$cxk84&hL z=}|oDllHTh4R1XARWsnvN@JO@n*hoeVJ@X$|32!j{NkASWzDz_iCe@yhab|-`qS@T zVltqyr$BY1naOP>`3}ifNP4KP7T7MrF+G9(l%>E6c1oqHBfK}$4~jc=+yD$r<&wo6 zl!HbTIzk(dCU(KRc})dFN*>^9hVx~bZwv(e=$61TnP{3VYU=(cW$^peAgb=<6e8oH z2vp!1L;aSlV~~b-NPIGwp|a{P83QjWV)a+3myG{Mmt2-n>%vJY(xk#2ZNY)65GP>Y zD#nK7gDg zwSVzRX=tuFgFdHt-WA5PFOvqMcc@S9l(+q%@V`WzNj>=Jf?)MFWA6QOk+^y1)ve*% zVp(&DK`I1yqhI!Eg?nxTXs}Ox_%&nERivz@3N$GmHsK_H;GSh2<|`_rELF9QPH&nc zquWcuFI`=`vEe^@S6#_Jn4CCLpN%tk_y+YyC$|57@!WiPm(b6N`3cfdxGPd(5gcyq zHl)FXKd+cBC)f z8xMb3=%MMI&qX6aSOPOz0acQz{%9DC;{HY-BUKy5d^4QCy%PNC;gezTw}(pA$(^Bm zgho5+C+HaHCyd#z|HkY)|NOUZ{?fOC`@a6gN1yz2+|Fo7CNI`L@u6#KcQ&0&R_Q0p zvSyr=a&n6IB3}8`6G3=#s?>k;{>IYdXMg(OyH1Ak)ZkSICr{3XCkv&6lcV!tfo7V8 zlVNy*;vC=ryvoHR_hwiS0rK$3Z)3u{}Z+-Ed;r!J2Rnh;FaAX$gXhBe$!cll%~mF)yFxjPqmxpZ z2*~7@zV*@hzy3q-OMm{&`CoeH|McjSUve_}<)yoxx#!58wg0$jnFL{ZO7%}+AIJ#- znH(Ir^62xApMA&OZzSHInu1K`!;_PxgMMK)9QA{!i)4jxIAKR1-S?lV?f8MI*Iret z5w{*c`&4b)^R+XzuO#acmuj`8yK7IMUV8lKixZR23&=!NORwE`^v>GA9XGvgbYXsf zm)~Fb(23eMzZ(7C|M2vw+TB0g{J@S=OZ#rwcJ|qK%W&5K^^-3?@c6M?w*S}gL)5m^vbm_(CmR^h&@BaF`zWMmqK7Z@GHhACJc_7{sbkT6xsn~|~zIKJ{ z%6on+n!IO=UiXg*Md~EvmrJru(~LILFnPsj*{&Mx-2ESTJ@H}e8}isE-Ydj(8~*bB zyw2A5&*6@vxExw3{0z)Z0k{*$>=h?hW=oQJXhR4g%;U-=+<8nYIK*buA z!ndDzES3rD2nx|~o*87;AYVwVAd?c$6IGtP3A{Rap14vDiK*OJNd_0q!X+#F7y zK1=04efsce?8V?U-jiO3TXX$XEECZA-bMkLH2GE~n?qaTgxn1ChO`aP9_b}2$h~F+9Tyuk#yI#Oy9v>s^}-p=Hb)3JDp4p z+t}Z3VzqxpCaeu{Nl<@3iC{4+6E$rFc3S#0`6}{3=^2@H+MHHEi^mx6Cluqt?e)uJ zOxU{x$M{REbz2|%VXh*0Pv4+gw09VyDUjPAvwQsp)BT9?hrE@rQvUH?#6A_<$$TSu zjc4vtjOm<48YfAE_a}}ecRm()FJ;!B>D7S`c)SaEaNB)}!rt2`?j|?+V~-#9 zGd_6S-9dP_Hb=4dFWryWKK%^Z`lEcvpGL?lVtaglV!Y=vrn|ai;#kCcHs2xKosVLM z_fls3lYNaH*cZv^2mE2OQ*=u*?LJ3Gcl#fc{g9E4_kLnuV>k9S#{PWoW3mrZ+x?Dl zzN-K{F6W6c@YAvtVzUqZ+1@AC-OU;S$T{&Kk(_9SO6xTS~dz{+~4 zlh2RY@mpl=@JDIJbRatV!VCCJCAoe0f;B_g9~GK4PC&MneC=F^9-39Dz4SF0cH2E113XG0GZ$>!&aG`&W;;w-}2FIpM^|zeSH7^;;s7=nV_SpbdxXHC22s zIGHpON?Nl;eyZI3M>{w6!S?lv{?kq-i_Qlx#c*4hV81N(sEYmx7vCi5HTbzSwU^UD z*yet;5i66R?VN8ps+{vFHdP5V%IGe~w5TC8_CzZZ!-0$n(av=D zVSBMmAQDc+>aN9DCb90)G{aG)A|;Pg+tTzP6QsjoS!aFW3x}IuBbiXpq}P3yVb$$< z;>Rb+;C$s^}L8We)S~rK@<=<1+2c3DY z1(PQv(0KyGB&N<#Vb8iPz!8%tt_aoQvPW;UL58g>gvdjs*7KH$c!M*MH^0TN11e8Q zC~a%N$*LSNM%xk~69G<-)7}&{<5Dx(1dvub5)8L|_3A-AZ#c z)>%g@;tE(%aqgK9 z)M9?DDDjQrvR}(nRzh6ImbRNzJgsj+j@_D{=|`8=-MenhHxIX#p896P*&3S+MYDGR zFP$N`gYr26zg2{|$uE;hDLFDBD=EA~3AfykKPKT1-&9-AVCB!2>~sF`@8xHnyb3ah zJ-~+M8t@)PE-q^C!nGI{SOaUpmWWr#`lvJN;zuQ$yyAp8s>_TiSbfYJvaEv{8rfS4 z+CgO+Y{jV9Pz$wCX^#DRPp*^76)ki63f$ zZ94H_FKk~*5UU~l8DU2lqETl^fxSuyP!cmP@wiMurp{;;E}=NcDtu_*p@oh#o2ZBl z>^iOmewTpf$}o6nI~mkMOmHIFdHQWQw^?lEdl51f(y4U?bW-kR`h$$@nq@88>nx5y4nuel&GJHO)C9(|C(AjuKSyG^s;snuVgAxkE+aQMpZ+p}B-~h!H$B$0R zDF(%2grtZRk2w}PwzTQjtynVvg6KR6$TCLrgP#`&U88x*M&Vi2uGwLqS>V)*sI9uU zvtzf9!~$t0R>v|Xc$!boh-|ZmHNGb`okOeuNE=XDA`=4cHtszK4FqA}!e8801J}A> zZ{Pu&#M5y5b1jYAlr_(LJn6Z{nw(7AwAvCa>^ztQl#+t82kdb~!_UMoXKPKKBgWL^ za1GlhED`BidOgl^l@eaUC0xQKT*4(>!X;e7C0xQKT*4(>!aq~slgqyVtokL0VEVtE z23afcKX*L&iag~)LWSjIUG>GqtD>MD+f&l(#klLDSgD{8g9sdtIG=$C;ONAkUX_ zL|apFIAPt%@7}FuT*lZR?k?S8Cg~`l+J?`$lk|6K{^3RzhvHBz_=x?f>xNy+>1&zB z+7dU5btTLwYv$u^7G7}0?2OCv-P2gn#`pFR2tca9I|_EaoT#U1cirgrI}V|0^>~l zZn&6|3C3@6+K@VN!e)OCUIBVlX9iMikK35e(w8}xLnk)V>dfGFfh>4$FC$YeZ4Kib z*0fm6*c0fSJ6nI1vA2aCDC6OBrC%l$Kdp~W$uBoZCO0^1yHc(Om2+cNgU-<)1IWa| zi)9k?D9%$m(<0GC&bypibAZpwhE)~VICX_A`3jMuIu z=Li}{Xtgef!6V-u988dd>%9R0=FpD z#}zo5t;zDc7Pv&Lp~Wm^W3tUZ!$l1j%JyC+Tb@okPt@0)I-O&7&gn0sYz}?TCf2l! z1`nC$(7Nx>2!vHQ%pO+UIYFhFl{m$m!%_dyB&Atj!R1*t*ua2B|3W|rK*m&r(99hr zkjL1#;^SMjp`fNB@Lm$wTa)L6w*bi?8!2oq{KzBivWlO!7Pw6+btzjRjTK$kuz*!# zwq-c@S-#4%VJ!9ZrOdu{KF+gWVFPb(i>F{Ga|Ea{?Q1UbYZ zJB+pai$29#z+5|+=gz2BxU|%0%eS1)A!?Fn0v<6${tieBBdiROj#a5yUx!70ntY?$ zFs`^ZPvJK^ou~R~0|1uy~=Y$HAg<;Ara5K^OMs(eY>33x5M(w$jg+)3qJ2?H}sbvmUO?7`7ih3`XQxPr+wg#esRdgWoN22BnHSp=cSq0>o8@Z1Lc4#G_!EK#G#z zgT$;ahRMX(Z#W969@Vb$UCggVj)Tq~fq^|@et?haxAQ?{zhF7p!~R)eWRNNEGMGH! z{IGRQa6vqkAxb;FjFnMR9J`Tnjuo;9AFfLew@@W zsyWp30BbyDc*6n3H+=b=5k*6z7A1!W)Ds6djaj5`#yRpB&R<+{e}N{ELA<)^$7dlZ zR5K8zI?j01b{z4CB10N@T9?Y)Wa645WCUTZkbDOIuwVh6Kl;CdrxA(j5>dQ47ej+4 zv!q(SE>?z7HF}A{ju1`eK!vJ?bJkHCVi>caN64_y6DeJ)NHGdZP?_{)H6RWeBojq$ zD}x`9jv*`Q%mK=X@4?{!6@Q}ttyk-EfPo_-b=5_2P)bS-$6)e{$&UzoV&L*?W;8b| zA%0f+l3Tf(t<|ZdlA2$%b%>2gw)L_IUt~3UzU0fZ}aGfOA2mrU!-W zp#G^8Qln|b9I0NUrdDPcP{KVU76e|+KQHdXlx--O94gUkmGDa+gdoA*mgqrH zTH!;1L)^Al-}&f-=ZOgYM8hTnd->zQ0+NUP(TxRWoh`84lcz`b`(B9}vF|TrPAu>j ztX72@=C=pfx$i}oDD~51({NMAJE~8EGY;sWW-(Mo7tx4YRY)!B4IhJPmRh50xPVo~N|nG;w&iZz8F@PHI)8yoO6^WX=jWBbREw*D@t( z2Lv}L^@;`A00v*hMy9t0fl;;=NjX{yw3FXghTRDO{!W4Yn`NhRxhjUgvIJ%EI?+jW z_N`tFcET^>iycTCA~?@{{yp(*Zl`#JupR zEuMks30R{O!Vqs7rbGporGhY9X36BsuAJcN;n5=)jO*j1h>K|2rl+T2k|dMHVn}2x zI?6!vLC68>X7G#dlPo$P-$Ycek^YE@M2OwA93H_WNyG1X(jeOkBxUU0cBA6gRmEHJCQ>HZK0rgNV?lZ5q0J(q_$XJ2rCYm!0Ff(!I3;O3wx%6 zZ5G`JXOzn23P+ZpMN2`U!1sxR-dLpUt8be^`&osNbf8%5)Z_)vZ4l3!Bo^_2T|muv z28B?{#pHGl1JgSYEj(&E@x4OqoA{)dgveAVwvS6a?%VAALGGVDz8>2(ApM?BH4|); z9sM2OJRaU6A1>{&BWqe;QqHR%tj#r%-j+je3zZ13%6o4DubolWB3--@jvz-oS?et=*~hoqKlIw5-ddl6>5JqC8(-H(e1=7Dyr(&KJK0& z_+H4D`4vJE0!JD|32 zr{WAw7Vo~Lzk)9WEq&!tY80+-wga>ZzJ2>w4?P$hxB%TmY~4w{+}!6$8aunVBs+E# zY50cjDt48$I2X>JlVsN8wsZ1B$Byd4QL(FDEEaU}Ez!v27fVO#zt5cmO>D9pBB^bo zbMvAUE)Z$5lk~Kliu{rBE>o_1(-FPZC~Csg;Yn0CJUFUHW=Hmv&iQ+en6e0og{Clm zjaP_{&(BwB+BQzFg>sH{*O>GR^XPAP%+DWH;+=|UVGwuN45sJjPgP4#9^AVlyk+Y9 zs#AVw?=gMot#^E=ICag{U;SFGcI=uve{kQg@7uHE%B`uv8KMHkQfrj~_cTaZl}^PXFbZYbW1&=ds$pV@p3IxPLU#-ZoeXyzn+o+5&EEO#aL3fXZE~vDKh->S ztai&iKm7VnY}>cv%2!{xR6ACyExoJOC0k|E`?2!2FzTtNDYqh#Nv-x!X{zr6$mFu0 zWSMwjo!SQ%WMA#BJ@WE}Qm=ShFZxN}(_alsTHY7SWQk;QWa`*I?*Gf5sck=c7geOT zbmq)gmSn*Xg-_Kvc`{T}*90Hhx3skVOl@H@3{M^|9n`(2?&=*m)O&99zAY!B(qdtB zettCSUMRea;@8gH`Tp9zeJ{Rc&r@F<72)Ur$>h|&!;^R2vGnZ|VeiSQ@ZjX>`!73n zXiN2QI6BHQsXg@cnY&+k_8+&5j=m?@iaAOi_B`WfzP5jV3pr}u++2zs602XTZ0!-+ zjf^VxW$0xCZVv8fvK7B2Y!uyfdye#3`pew4b66bq{bsYjpU1MM*g{^Rbt6aHwsu(rWa29GBGFcbs4evs{ zpZI@cWrA|2GHD(beV1L;D`|Ujd&X)k0^dIhPcJ8hO0lkMKDvjmN|2vf0 zE@EAl8(gzCEeRZ{67zXpn}MF@r%q*(#UYXnQs2FMEt%LeyR(2ynoXK!kW3nmrmSI{ zvjrwkXbWTN_8aASqs#RZlzZz|P=5G_pL)v5Q+vIS(Kbq{MP`@WKe5$^2x72wun z21upY>a{ui*X1&yzQMZdy6d33Div~NbeFwX0WuL8nb_MOEH2+|`Ji$#LD^*^Lt)^2 zdTZ+AIWOlE_mczsj27dZ9($}Va03@)lIMGJ#|^$4qj!!I)3o(T?$WV$-&i-Ba0_AM z#i)oO{O;GTv&LZkQnB$?3%5>exldX3;k&Y;4lu!vr0mY0HBa_FA5t3QX7|uPuGbiu6aa_58yNF6YWMJ1QxH1-Q zqepyikIRc?65sm+x@Yh2c@^q%n=6|$`Tn2|-1j5wok-vX(up+R93W%Ur4OFG%D3T} zhcS;L(G?&*@tE%ox=qv}6TUBK=u;@C%{PyxXYYx?yR~6HV$(xbC|4cVpyn#T6z`+9Y1N?5@db75V^oFgEwY?H#=CI_qQ0#`l@<9Wxz$ zRznF>6jc?+&%itdjnXits=!7&1=IA`-ybz#f*1BKv~TQIg69*2cn=@OcS7Cj>!MH% zrMOuz_zn-Jb(fDBDX?0wtM$9j}7T;A&sSDi^xvg zSSCxJw~|cae&T%5PZ)o~wc=m5t2|RLvYw{ljHZ9~ST$usSj4qo3s+px8gKKs+)Wzt z;C{j*yBB}ui{~-!eyso86x>gM&UOus-dmc_Vj`m9TTO?Xw^gX0kU2pf@C45w51LUF z`$JOvZxh@tL^;A`T7=GGw2hR^(d_g;F2_nT;eOI0lOogqWWVi?#q4{DK#wg84Q;wi zCbq4tg$pN>SN)HvJ=>?bpR6Vm>L*SnM#TYIPz=;@nsEk7=~fS8`-xa&nF#Rg36hC+ zx=ZquIkZx4h(_i&jfTifr{i+0B$Jg8YI=BnhlELRrf2Em-8O*hkzO30Nel^h2H^n> z|C#WHiI#AiNAxLI#@}SK)Bhb?7GGI<*VkQ{el?E4z<$PE+M0^}9bMS{hF+KALp$Lf z(R}_n)43hC!u^6h!_Q1Qu^FfD%w^%^&Ww8<_=w^G`%3OW0){$v(#z zGdcH16cf}(6uS3?z$^a5<|*%I)9?6#EsJxDj?aID%P#MC5rnVVShlax(XsE4>L!Vf z>9Opga3#=9+qd{+L{)M8yg4^vgOCZH<-*Bs%CBv@ZK3jn6gqh%1DG{GpLJMZ09r=G zq9mERbZSlQiDkJfb!_`$;?AV!ptJTC2Oe>Fq(v3Fn1Z{GWNs3NU#>0?drszO^j_cxQ5MK#A4TZx59xoChpRjc9+r*19FGmTQJh z;mSRE$_mJqR`cKL`J*OjZQ|I_4;#bE9MR5HYxM9HfFda)+O`HRu1&RV+G<^9mIrOVBP9m6}*J5 zwM#^P!Ryzp9RKr`85z-yU3u`G8vhZbVs44GYUSM5G2?ScR% z%R-abTo`x5kFbF}zmiNxu)rc%5Mx~4s`c-3e#_(+!&o-i`hgu44RWr<0G*mj;2GD4 zV4gyT%vc%+Jt{ zwgQ+NV4{bMw6(Hsi8MSB;B{C@TUMJQZ*$1PkHw8nG|e{j8GItPYg6G}O@iA+yHY0? zf_tFZMPuY;l7Q<5(y6%8*%futi3j_-Y<*hSuf+WDc`<6zO@o9RCMKOHwttOsGFkQq zj$1Ax;g-6^&Mb^G>twTKv<2klHE<=7;L;g80C!9iHZjNWIGVQpat2SO#Y}`?CgzPs zI7-d5D_aXx-tDQZ3Sbz@ZO*XbhKVhSm*gJ~;RC;fe_5y% z>c> z8FY&aHA{f%_&%{Ag266651<9;CtC0y)#9%}g3}?^=axf`PjLucVMAi5cj<1TpQv<# zrO8Vxoe?ei31CYRL#NgS5hs_ObT*c^rcFV9+gVJ5a!J#-G~_vJb80PL((;N3goxNG zaWBF@Y{X13FYa?SBR$Bqxxqzn>R#kw;;)OCbg(S6+sl!>r8gnrPwb zr-hyEa-aoP-ywTYRz1o}*pJ1xPVf+}LN}){me%;3q9)OBL9hZ?#6PdJ*5CJA#WK%! z=9x)|n*}!dZ-U!xBziMo)*fIWBwtQa~_M9J+) z%oaIbzAft(8gqeCVwNi_dkYVVjg$80R*ZNQR$H#IbK}tVelX^&wL~6O=*I-FHMJoG zc5P~17oU`wy`Iv*T8f<_7{HWpyApNK-4J9kp_0kr z`JnqTA%-x*HPFf_gAUAb$?`do)H?m4&jAH@g{KmkYEYz?J%zI)_?<2=(PiW_0sla0 zbeqDs&WgaojgQU)uVQ44Dn<@tH;M^j0rdC?G;KejA9OK`w0%i z5qgF-9&;a&;0UIXA1*$2sqhCJGVgCNb=@+tl~J(ykUd+OKBNWqf;&(+tm`89-AN$8 zsH7bM>c&W`>qRiE6lq?6h4l>^!O(&(p&a;lk*$~_4HDn`216zMRIXZ4poegUGCBs$ z(ucg@M-*R8X$&bdkE&}(-2_3mQV~91<&jFmdP;OEawyVt6qoWLE6^i6#K$}=`&l`* z^#`|@y2>(b4VbW)_O$?#X60C~Mg?DBIiU67zo1$`FO0IcX%=YAcL^}`Y$zrcH4Urd z!BA`a-5j>OeFU36hkcJV2M~s$P%>Cci+zmudGk_|JHu5Qu38TVG?`t8@ZLoI*+q|r zW{(8o1j0#r4KY+F(rzo9QDb3aO7sllctNj4aRV{dAdMInd{a*wsf0LMMa(iKlg{Bcd0L#?#w<zhE>_oro%DP zh-*R9Yp`wf$`TgnkEXZL4V6Mk@~MGOKY94A zN2I^)%_)7e==-0Ac(hC!fGg{Dp|^04k-n+;m^6(UAB9NDq>}3U!>Cpv(uHe*(^|86qh!8*FCj1%jn;EFq2L<Pvd99SC(r$&e;Gs2|NHbs&3!z+E8wvBMs=Yc6G1)x*UqnG{ofMcoGm_u>w)3fEhtG+p9u% z@{EO=4QWUXN9MPyAedf%<5&?x=SGI64wO!aQg_@mvFfe#B&qS zoZdm5cYgj5_JNE@buRGdheg+XfxHUA{@Gvq>Dy!}D(wnNa>S@@{uj9!=XFKiDzTMw z;e9$3Rm?OWgiaDTyC&oiy|YJ-32)&Gad1B8gTghWnH;}fd^1gMbxhBPr>dpu!Em@d z8x$y~1(FH%lRbAVee;^yU;iRRfGkuve^QpJgQw=hzmX$1CBLDBjmi1aO~Xk)Id|^G zb4T9v6L;2{wKF4kp82VmzIk{bJhx-%RO#g9zx4|7dfD9-gd_twSo$wt>N9WaEp=V} z(I1-cJyj_ES)zMXK#a$!Eb|YX5~V{2_kH?~$M^MqbpN#vJn(uM_75IE`@l=TaQ5gg zY`c3`c=gmZAFDmIcWK+6|N9D=`!#~M4T2=?+<$8r76!$_`%lh?-|Q+?rydMt0bex+ z=6flG^!LvmsqN}~?{|C~T$TeG_qrqV{54-WHnn$h-D~dtiexg0eo`pUivkJN$>gD* zeCbnn-~1OpF5Elgqzq0@c8jU!AL#wkRB+Q&lECC-ChWpS9Mcey}_VE_J&%HJb5$AL|%OkGNFEw@UtAqvQHED=N@?A zR8<`k`;MM`e9z>szu{94%)h=M`v>nnyF@Y>DQ&ywRB-j7Yd*I0_%%zFo}c<5$)6-r zNT<8_eT)>>P8q6!VB!6fVes5ksY?AMpm~t!8kh?QiA(;{A04ShTNa*jqGg%T`-yq! z(6hB;*B@E8Oyc#N(NTVi=bFj-&K2&Q$#rn?(Z`z2cV^d&?*2qmzztoO&d)ZD9dE3P zauqxAIy=jxvYY8Ssuir@#iGx#70MbTnf}=qrsJ^_pLf|$S+~})k45tn)?D9S0<1-S ztaWqt97N{-=pnV9(wYIhouFnKa6}cmYNe($YUreXh*) z`PR3vKlW?SCi_@VW1rUAGSPS#B++Lh8m2WshfK=6rvruEtV|R?v5x+9JDDt&g2Nl= zC24+#c^^S6lNXO3eXhBLFKd_sWKnN*^6KPtZME0`?Au5tlPVM9{IKm`-`d=ND{NLK zSPPxXgqr5=m1WYwoS4SLq*P=2niIrFZBUzrqe3Po31bnjyFNdeX!_ffOd62MHqqCr zyDO*u$65 zg$O+5HlI0{&)mRgJl<$(>2W!3OVeK$;(d;yZ1>=act2u!=5E0gZ9DBHB7O}` z_Uy&+gN{ch}Abn$s#BgLn(&a5C4%ab_Ylou`^?eaOnJVTwWOq}_SxtZ%bEqz@`_irsj z^>{KL5$K+*DF|9->3LMe;ZD(6me3FgdEOYj{faAYy2h zSh?EtUpU)=v{_lM59$7`R%rS=jz1axx*^RV=15$?LAHOa#7A+x}5ku0J?> z+D{aI(QnsRV%?RM$#yvI z{onGW3xs@4Ep(pXpj%wg3L9xJK0jKaa^}kf?`QIaoO@NMJONN`Y-=FtoQmIzE%0K~ z5Mnm=6S#dtWKwl%Bypc7@)A#4Ro-JotUKW9xMEAZv0$S~nye$cIa9|Lo1XQEe3Mfm zk^OnaS#!BZ{92vwZ5LIS2PmXl&YnZQ&*$Ce53F}YstV65uUD-#U0&}}o)AM>BVL-f zI*c>9sWbm$IVzWFnha93iyT3|3x`H&;*FZ9%R9kDxXa0U>!!K(AWovMWG#;i!M(7uo zAn{3GS?Wfitbq^Fnfx;~(5dz1#g+fM)vcVFQ6!1270c<7V#7Yu0H|^Nr-j{!Xq=zm z;Mgye1M|i;%s3%`&RH0W{=C4&cT(I4bShXz%SZw{>-H>7uD5A!4oTWq{z7ca?mu2% z)^VYALg8&!mZ<0t_rsAd`^UexYIfNyu4>Ik;}at;)KbDqO~#Q$wn&liJrzM9stETc zJE8uMOZ%UY6=b|yAdyc|&cM^8DcT29}GM-Dv3uOg+S!?>cWJYB^7L<{hl`pJZG zbR~H1o9lD9Mau3B;w0@E0rZ$eDX2Y{;Dup7(R!Pdi%8|+uu45&HuQZtN3dnQP%T4? zOj=s_aW84f!Rt?cgt2flG8=dd5t*{pc_;HMFtF;(jlkpyjOEHWhFZfNW91aqLU#MG z*!I@+Is!JGBTas#j9Nl)pL1n389EbFuPo3%Vk;gkQ)*B^P=bqRY=DOKjMIe`w<)hw z!b`Y>OSptfxP(i%giE-DOSptfxP(i%giE-D|NlTLdU(Dkx^7IrVtS4)#EkV9pNr|M zVlDqwAT=Am8s4CV*V*+uLWKVq9?(eh-60GwdM`|J^O5YmbyQqY6DOF25E2NG;NA%Y zx8P1=3GNoG3GVLJ9Uut~fyUjT(ctbD+}+(>8fY4}zuDQDv%52A_W#*;&O80y>38m} zs(atB>eanf^{l?HyAdj+A9HOY-p@Wc1o+-QA(_5&-?Xw(%mw6VXGsY z;Bd6Uu)_^$ey}oJ9kDmmYpnQP`It`ENK+Gp$}HRFY5S7vc0}&(OoT~P$)dG!}WW9^b=Df@3p=9F7(9OR;M&Ux*b+H zfB#3g_m-&M45_cs9_`baS8E;kxnJF)FvWiazjd*_qo0^iZcdlI8rIa0|1(b2=G$DA zJ(hgMsA7lX&8>W9Wn>)0$PNRF@~W{tneqzsli$u@=@r+ijBMTgA;@M>2O8O6$psIu zJ_|CT`rZ;3+EqiLU1a-u)0d^ki>?;i-=*evm3cq+=wArw#8;z>pS)wSAr|Zgf8{z? z3E!y9u@%9T&CSqoX7otkC(H$#p#wH!C&=~G0(U0O$5msRMb^KNNq?Bw!ozu(^yU1K z&k}wf9k;AW>SeN$7-6=2RZ!xV^KVZ&#J0xnC6}*lM$QEwVR`Y}t`0flAT{?_yYI(H zNY5XGujm#97H@Bb@~>EQOCq`Nah!gku?G_IpL#Z|%vP8^=cUCvVI2e14_bi9^mJ6; zdkZ=@t?>|>D^)RsY%l_4jMYC1Op(MZs}Kk1kL)sJ#usYHlg)g9+^BBdhz(Bl5+w-4 zb^e}b`Np6mo|*hx*J$;L1OFT=fX{R?o!o+o#-}etpOhqNf#jyo5EU3)mT{xu+Rhj4 zQ$tDs;_E9&;0U?5wz@p`rP-Ym{Ob1$l-}I%(cf)xC7Nx?xZ)j2>v^~2eQKNRsJ+7C z;yp(Si$$*-6^+xqh&WsDud>Wq|)g-;nAANkB<$ zM96(fBI^Pt19(Q3@8uW%OjGiu*u?`jNBuYFj_E@jx8&xM-$%$k6~rg@oDLmI5OjAbAKKT9liOp z$vzd`mu$7g^Rv?I|N7B4lsT}b&J1)r(*%oRQ)I5GVM+H}(xf3^Bo_%4{# zCk>t3xWnhqw2YL=hZ_7p7M5$f=*4Q}IJ64$$>cwu^KoCkEOW|tDCy;=~lqKHXX4hdfDL5DWEo=nUOcWf6UztwYytlH%see>SnIqm%g%_nJt@ zVocahN!ZrBU$-}UX)3f4jibQWu1)q#lS&j&N7icOm;Rwv-=AT8sq!5X1XW9Yl=f$pIxgC?Nr6~_Zz`!nUwaupCU zdruE6k)Pd)9^WFVY28-}_uMp9{{$co7OzF!Xue|mdxGE77e^>#m1909X6|e3e*O_7 zpSiPqg>A~FoG2^?^9TbR_joX1-U{Bk1;Rqkvl+&MiLo8gk8%1jSGTAgjiNfuK1sC& z8&^=~4_qd6%7(XGh2jaaoESZ}g-2FHmt|YBGJ__TpoS1KpDL zqVYzOh`EXkrw9GXs9Ddw{u<3?ho+tsJ!0>!Qpe@HW>B+|<<{Y_y-Q&7^Mv<>4Ont#R(q&@xl;`Rn= zzq$e;RGW`YoMRMh&g@>rfJL~Jt2sSrF<2XqQ|rjhgY9~Z_Z;XWZbDg@0@OOSC8KQ5 z&Lfh;cK#}}C58pJ=z3~6@NjhasyV&b;Oia>AZ&bZ#vv@8+Yo@sFdnLXPIdlp@`@1Z zATv+0^TmM!4=cTL7Am{Mu~GDf(Eh;tJ1CZ_hVN|&-GxdSU8$RYCB7;@^YJmWb}Fji zXqe=^->MQc7s2rQ@I`t)1N`4d$UJG~^=tSP+@fO6AD?U{bd2?_(Kj#f&J&4!(5ONKtiB*WFr95fYJDwrJoTLOI7B1ZYLak;@Nqz6^z3=nnJDQ9p|A3N<4K@_E@jzc(T`-FhVCMkS9o6?!@Xzw z6InPEKad#Ey01?rW0q61ZB}M7%*{W^wpE|r_)iqCQv51UiKTyd1I;gP39+e>Pu)|)Ns_% z8!NTFQ}wJlA(6&D0!0Em!{3hwk(rLUeT8L>WN*$Ql-^Fxx$x95VzxP5*JzxI5XSY^ z;{3*?NF)>B_Uwym@xf@K!wvtveuyD*z7ll8e|hes1UZX@t{?ToCOR0C$NOg0YdQx^ zCmU^kbI-o5+3Isxh97YuAREBRVwKH<`^${w^Dy~Y;fkxVD#&BSuP4qqpVRN!K}UjT zVy7_4tlKPH$nM>$07vz)(2Bl|?j^m_a6-|tHtVvJ{eCiR65f4vJJNr55b~GXZ8&G6 z+tO2Wb~*yCJbeT58MFc2;UZ8Wxs)|k77%!`1>|6;zh5ZbK(`T*-t@%S{5ZmX+_LQf zIrY!u5|Yy#U4=g#)f=rY*DTC}p5hMS#{xd?`*#bi9SZ=+{S=RUM%ghk$%7EX@Zt8~ zIG_Hq+rboC#}=C1d<|JTU6L!hvOVjKs7fLxPKb$KZG_S>b&^a>$h%X&``e_vj;ah; z>f7Cq&<=?`Hi7{(&iQJo5(Qx{8*t0%xrM_D>PqZ5X!Ww- z6p{z+pF*}|oTy>o`qg_KydfnLwO>`9P>WV5%qUD#&hYiNLPQR#C-IAL`UIFd7sAIK zuWrtYB(-OO-sZXW$T_zt)?*0F-J-Pm=_*WUq_s+mTof}&qr4m-bd6v4vk!dJ237F> zQse4ow?9--Rd91`19sb=(~C^=LsabA^jS-T?sL=wA%?{f&HJH2JMhR8)}tk2rLb|80^2lx5Bt8wlHv3}i?+NDH78q2{yZadE#HHcUEJv%Jf7Oum$#Aq??>k^>o>U` zQ~dng#%B}0y0!8+1 z^>X@N*t@;a=<>P;D?6lVt?X9VDf3j1vJCB8QhfzWT*xp0`M~WZ*@;gS&cDWiG(O<_1UP=#vl5|%4_T@@hqRt!GykG` z$Q-*=;KJj}upfr_Sxzd)59ab2g!#PhxVyPs$C{aW3TbWKE&P0A;${OBcu*1+0v$BP zm^yPuN26sN3p28zAw!7LyVviNs=EE4y|!mn6M>A+b%ji0TI9PgHqJf?LeqG;U+$cG zF2o*ZC{{>thDV)#>+MObZhzEbOlW@j%Rjb zwg>#GWR>GN&<`RiPqlu`W@gSZg|8I;{d~)w7+l~y)wh&_aFOgx2(x6Vtg9IP#TG%d-VG?liNn8NuPyAC3 zhmUgq?VP^i88zMFrb<=R?uMR{=@)}rJjMG?N0C+4 zT95EQXaJkZenp(K(MjHb&1?|cUAD8w-HM$geN#x3L7yW;HfS&2BcmR^Hzxap3^)~k zek+Q9j$;?;nI!bhcuA|)O~QBF`AH_>x}dSaM6g0Xde#FniFo+TH-%I%`ZoBFg946?d2XTrK|9s4|{LNQOv#DrXDoq z+g8dE+#dJ3ok14fMP;BP=Pgp$KMC-K^#mDOhSr!)WWKL&fe20A5%Kl7o1B>@U4;%B zInd+V1g*~J*K1wnTplEPg4Vzi!x#9HP()l9<;T3)|G;H_Z?%`@X17X8ay48xe zjg4;@7A;f`y&)?jxGpmzH4l6dTF@P~N6+2}evw3=43y`*3taZ|6F%DhZYE(S3ND); zXA@&CvRt~27;Md0nBHDfP8$H+NWJS9N2Jt$29f1CtO8Zl)2AK2EN6Q82JW#N-#+D zFgeXRYXndB9;?lCE0YvT&d#peVz5MJIi_>{q8OhEU$(s$;FCr-*x8%0(0R~rz7*Se z+nPYwbjx`96l{FS#6G8+p*rapE;M;;adeBttJp`p1nz4LBTtF#<$ja5d3j`u3i<2h zPGad5C^Z(u9UE!$!ATaENqoDSJdccU+zjD9Wu)`ut`z@L#Qk!30s$as2iL*ElNlAQbI z(sVnvST+P*FpVr(H;w+&=N7|$XuJvfND1~s zB3LxIA+M_YRMph`upOA^{$VlNNZYn*R7+2&kVu=c0yd;Brd38yOYkZPSB)uwc6OI@ zg|raceT(pq;-)d2DoxiQ1%8gR=7#CCP3)M;$zDO{sr&u*ih2cKv37>8$lyU?-pzXW zPXv#paK$}l66qEuhC><58YhzQxp6o#RoDJ}k54?n#9kB1{#PH5H^raWjcg^+e}b&i za!h+HAtj(6pN+bj%i=CC1qi`W9Q>{yAby%ROE@gA`S#pshqvR})m8?)AU+*Y6@`_f zWtBb?ww?L1b(igoKNElS8@+K)yp#JF_6rViAtnWK!GJm{KA9@A*D$kKJL;4U-3k4{ zr+^O<(*~zx_X(Lc(69Y#A(Q#Tj#e60rQWrDD)|g2jF+@DWGYu#bi-2ollnJ>c?eKa^I5N$)Q|w!Pvy@ zi;t<-nzAI?w(+LF8+BL`j=bF4-MaWZ$;^q7c1X!CHZJBwEPW3&bO%i#vXW)8g?35) z-*}o$ew7p~7(1XfUNM$NzX&Dg&~AI=X^%AfMR%j{Cz@s6k#C&V@s;a6&15Yvj2OOt z?oH>7u}?w%>KvqlYH{6~)LP%uS9;6h>P=qq3^KB&PacZ)cYo@>`J5U;)T$hh@nwSG zoR9_ot)oDJ=_nz`$XpV)Flqs!?u_7tM$Ek}6|>7qZFU@z{be`;ip_1L{^>Asqf6YW z)=1<9S#`hU2osIPFYyn9xeW7vJWKy(KcgJZ7zcUuQz5Y4xNFQ`i#>zByd~w8Y8D}v z3eh29$9DNBR*@6*r#4|8`~rZ9cZ-|z+H2jOs+8OTB&tG*ePDi#v;V6VuG@%g4yDws z%0*h>pOX^A-sKyc=b0sZrFAyyMh^AS1phq|-TN!SttLz|7JP&|+tbWW#Eva3CU6cnMcrTefZ?}8BNl*uBn2QJH1{tH9dpIYmWV;9)oyJuesTg&&PFhQ9EWg zaify=U(8s{#K7G9q_giw8ur!bm~g#b9J=SDvFkEOp~Zj{^eHf!wox06@QTeV{@tX3 zUq3E))JGjKF5_!IKbnm@itk<|JRB?$ZyYb|};|4}EsXcB`x|CfE`FxGv%Db4VuE%z=?^gtpFBn=s*VTlk$u#zDQ0m$QObiAntIr93^qqW{ zW*%Ks@}fNDQJ5L3QI*{NYL94^Q);rCezee8K};758HGt1SAVKO*p?_GV?E5Q_BQH?Ku=*76~X{cOMT3m3L1mR~@aRO><&_OiTM7~)Q4y0l|1kV(ppb*Ql zjv2LJ;uh|kZWG&1l6P{*N7)z}GOUv6#>@MzZu1J`ny|O)nf9K+XvRcry>4@4y@-@U z)-UOGSn%C*PAqRnR89iQUxFR_Xa0}B_**;81xgl*CRab(u!E03d5Ed+E44AWs^Gb? zy4w@axx24?_UarA2$)nh`o|g&3pbmMAeq$kb~IwhO*q)(qI=yV~mg$Q8*i zq@KAVDXD2dk<7lQ#>w%=SliPi%bq%f8LBEq`t5@)E>e)1q z?JtdvMAA#`NqyIZT_aHFncNs;Q0Tubt7{pDg5PPz^@jeYcC$TY>d@8L=U>S; zijfXTkc|7n^;~q4d_40#@v(ybOnFme`n!&5K4DQ&UB7Xbr=1L3Ovkp8M*e#HW_(maIzU{MDiSyqN53<$=t+Vfoy3`$# zQiUIOwm{P$gTj|R=Y@hm1HuE@U}wH0K%T)d3UTH^n z)OPRN2S2`-_^|u=a<#(55yQ%PFCRJkdfI2$_3YeETpR?@=mHTwveP^%rchqLpnK$J z`pz5SK-W;xv9T4eldNkL5?7s3e!(#GbCE7bIW$Z9t0=b)Z{FD-l8mt&!#z!|%6Hhq zzy*Fj=dNfmw}(Bwu8A$j&)FJQs8XMDo*xUkHdr5T>AMl4IQ!}uOlx|1FSf zd2I-(<9+s))|)xQ)Rv1JL%;Q-i7<%w5h`n!x8urHm^YXS{-MtZUHQ$;_s+*3tjso7qn;`7H?(_02AQkR|D?YVL z-bL`Dlyb&25w~5Dnkok%`Cu+QQr%-kwdt~Kr-3-(ru9U*9Dv=kmpKdcydP3Ko)ZGz zOfSqE%n{w)1VyqgS8eVjfCkLkoJg+lp&!qDw3~_yR0vM607uD5N%QbqNkl+v7U&}z z0CXUz-gFtsHQeV=$hz#Jd_C*&0M8k&dODWp!bLVwM&YisiJ`Xh2Y?ju)tK>(P#;qp z$0onP&Xr!SeHDkInm-k+eV&|GC2RUk>QW1l$kuWCNF{7r$X;Gvo}sXN^=^tDc!!M{ zO13^z6{0|uEO>XtQv;J6E_gDMT|!0~bHA0wXhL9&&ZL(g-~DQPIySKgq5^6O`P?Q8 z0bQI&mBHKR`ZrG-Dy1Ngw0Cns+-E6#%hf*cwtMYqrkQue(Op3f2Xiexb$f?GzWgf| zli;>tli>|A#6WV>s1eV;(?`*{ZmAdQAxh0<&5CQEX`Y|-9ftS6m1;0+P`y%J(W~=q z)37LrI-6D+Z=UAGNE#V`>e-mlGfC3FTiim$5ycORhy>xbUD_J1Dz1K@*p!}D9GN5WH7OOyZPW+Rpl#N54_G-BJ& zeAY&X+u6kHaq7;>Umq+N zl>fD0`}k$KQ?^&H(|#wz!i>dYW4FU3_$SXEyCSbgZzrQ4lewGzgsKm}eI&=cSec%5 zerj{v{9xfu3w#pU9a>Dv3C&xoGVlu3bygF#V&9>qcOEg8RW>M{oki#!GM~1L#W`Of z-C>9!uDWlfTIu*Hxa3g!y2}X~L=%Dx|Wm@m(K_ ze4a2p*l<+A0PNM^TPG}Je-B?gD7hU@*oQY?m&(f<-o<&WvLb(8wIUI#g61y9@Hr;> zU3CvuSpg0x6u4v%oR>R?FJ=`Rx_Y5Cczt8A9Bt8g5^ZJ=`yg;vG8jU}4`gzoCR|=N z&@&!tEN$BHUcGi^-LlAYPP)w2-8&M@rQy-MA=I$G=+gj|&V}j}+zg3UB9Ff5&;k_Jesx`DQFC%eM72L$VL+7!D_JE55b) zot6PTckqKmEJ)@ zZQ~P5I=ah7CiBhC<(Y0Z`Xmd^Y7eEv6E4KG^r%UEaSl4CpAa^U*2h$z*q43W)mLh~ zdD#^YedHq)5zb5f_s~2LGAyf#>PnO+0lIp!ZTj~lxz2*@4!$kml`m8t-`hAk;BWuP zNAMJX-O)A*9^E&;o_ygbO7~a=fH7=hBp(ifd!w2^E#N*=biFGDZ_$$Sv-rfBfioM- zN1ZA3*n4rO7H(yMoM+@Z>A@{z^rpte89pb+yDPdTTmUkCsE@zbFAXiZ6b+?2%|+HY zc7ef+y5=!Z96LGJbgp>4-*hCu)h{*whp~(c#5mxL^#&2!_OWd zfrhdI0=U@ssfM9R8ROu8wyH|MXRpT=emL`yvU^oIZ}L=_w(4TDv5CO6yqteEf=R+Fq9TW|uwf293O>Bx7;%=|ua+<=Ovv zG>29y*JF8#gN3g3Ly@jA{rbr7qETQ^#|&)m%|xkf1U-oANe2&|1G; zGws{vcrAOp^K>NJ^1G8-up^-&zq?e9>>ob8CwUos}?UZ+d06`^cs(# z){___qu@XDfJI|R0N3B<4m#k_tv_pGN8H9PB}F)o%pqjw@}dG)-JZXANKx^;BXyM~ zkN7?-rX(?AbrmG!z(pR(#mC62w1Y8XwK?k7zzO_(^uRPuMvAZje@cLrX1wBDd7xlh z+l^0~Z7ZE=g?PIC<*onDBiX!tD){PU8+6pIBAwC8MlC(6fx5O~FE18~l?)xiYwNVrvl zJn3}qwfpFb^Xc^ebJr_j1N=E%A)riv{_UXlK@@eq*;F5yD)R*h6369ZD=Y+EcXh-Zn?cK?r%n-JeG&Sur zUT-cJj9D~vC{FL@PzBd3bl@I`jE7}4rX!0Nc-XV5hc^A$m|H8d>W5|WZJM+p;f9sh zXdt5!j|FFAm+=txyFHNp1QmF|T~Zm4`3yF9;Z!37sDecGDk zPM_gse607)yf52n+#m>c8|-T1rjT_iSQg z?IoO76L<_J_sC6^KFQz8$0>qo@}1V7D}wyjAsI-oVy{Us`03<6={DlZmra+^ql^yG zP@(Sr#kz>3JlD5p?Uj|&F~8>5-gGb8-;aLVqt~0m95*W?4-c&1t5n^I+NN`bfxG;H zisy|T6)C2p2@drqLM}s(!tmPJ{F#s{k0n3(U3*|-5)xr%8>uDlOud;TLw>qrp}Mm* zM2a9~dsUvPJVqxVki&MlIqWoj+Lr397Vci*dgH_kYH^-0s02DdJp-#jAOY1LuYnl> zr|qAq&&0ZpJVY`-9$XGWGaK0}g@X3g_iJ^!z`@!x*hnF-|ip0eP~cB8Lm9nX)i z4T(wG9-qi?p3UvyIXplUBoNQ_U(erUTuYKva5s10rU3<+vn!hUBJ5|o4xc?s4Z<$R zUwxcKzJ8_=Nv>t0G7tiI_6+-@$?Y}Iwa9~;ar5=D;W4^nMbb*{)xR~&ukBZKw9abJ zJH{vp7NF5wy*u4+UxFZ@O^h{7)7;cVf3f@acFbqb3SsDR195RM|FKAavv4tiUSnV- zvh0!bKZJ)*OqZYBhU<-kpA}}y8!n%d)^$QF{u@jG{leOz4}KSY$-9H$yMVjatbfsj zQX-3=N3cOj%qLeg>`8nv2B?Hb|1Y6Dd)7=e6z=ZZTWSe>7T(!y*=MnYX+ZrycuoWK z=Pnvc8Q~vrgC_RHAl%uxRw=|HtZl|`9``o-(&FJi#Hi3DG|xt*whiI_chdgLmA+J| zb<}7*;W5S!?JnDz|7kDbOR<3ZAJqWQkZQoQucp>RQTqJ5i}Po(0EX04INJZC)&JS8 z7_=pMlgs`K!aqR<@qA6w`5Gmhu%L5dzF9IOB@m-CO6>oi4t-Dj)l=yrNreAw@L3>u zD;o>ht`!cjOiaRzLci6eJS=~){pk!%um8Vr|G#Py`?KEqxpHkb^4S@am8Rzdw6s~P zPx^l#>;F|l|NsC0drLqga^;Z={Q7?jA&k8&B}U4yk^-MStFJc)qDq7^UjE;40F=!4 zlnZ$NqX=vICIfErOnB!SxEu8B*4*KW#_b)U;kI*Cwdk?*LI174Uce&sC z>)K53X&KOf{Zy2B8sX%8*N;u7aHLq=T}=X;1CsZ2J+86;l`~foj1Qf>O4EYtsVhoj zq`faK4{h*fFm-{%;fJ88He^C^lR-<>^hjsZ^{A*KKQZl`Mzbc%4;K+3!@r!%h6~NO zrin8d_{Fa*(a>6^Wm+oU&!FHN2!K&k?Poi;_*2gcSuQBx*cCRcJqM}@d?DOEU=tz1 zjniSj;3g?=nL(lC0n-6no>G$)$ODOK^4g$c0bEst_?PRD0UPewOrv1bg zBuhsI17Kkq!!YhcSB+W|;Y+@mg`=lU=^`c|5mixk_(IOr`@99~)AJ6`<>hsZB6(a| zQ`IlMa}wDF>d@ppzraQ76CI$6jxOOZT9@MDN^=t{gcQ-K72LhJZQkLMhLG3y8V(zY zt5~r3kz3@%V+W~KmC|^8CzoG34EiNuTp;@8z9xzoM8el7Wu=lyS zR@OrW+=Z*5$>KIE#{4vuE}hq;WeR;#!U$YBE6VLLX-YgM+e@iI}#Q*2wAn z6FE+yH`E4YO}|%mKE-1zdjHg`vF4&1hU&7p{%TQ=X*SFmawB~KA`FMTNX6&{!ZK%Y z@1qwiCn#?}aI*+(fG)q3r9qU#*D6VAir&CQ4=0~6;YnL zp9SYua;7}LyO0%JsgiB3)qU!Y(n#88$I&vuE^abEylnn!GljrL{1z>U;84G_Sz6HJ zTWKtAs=ez#akwSTWK;kBC9l9q+vj-RR@n*i2bnLWKbhWYzfzV9SQ)@sys2tdP(7q47yANBIq8A$PJ^fw(Z?}B?0I2f(<5~V;HbOJrR0gy zO*_aV#{)333-ER?D+Zz2`BDn&3umz^ziK0Lp73q~z|w{31xICb(lb}}Da%S@-Days zTX~(cTL*A8raMNa5YuBV@Tr<#7{|hq8iA3&=&7z~rlE$vAqAXuK1d=1B{iX_W@h+x zeCwWc(ZNuKPlk4x#feAQBAy{NZa4@kQ3>mqNeKVRc89Klgeu? zi$(pM^g!RCC=JbMXotn|MQX_aE9k9Xfhe{nLDyLKD`th=Ax(OKj#1{`}i42 zaBe5Bz?*1!rV9p-9Oo+#Pz4QSZ|!J>piO!(0;+xK;rav8sQ0z4&Fa-fy%9x9C}VIM zt_oCfdray-_sz#Jx#pce^Z=O!9{2YKmVe{51nL@Ag#ciU>(11Y=w?MaeV{6yHV%UN z@PFDa)d!QOb;^kU%U;vGHh&^g-Tpa$ChR4@!!}1>NhKxj%x~xrnKaPWcKDMj9SFPp z4{_0~$Vnd)!zJ1PqwiOC(>`BFl{T6g2}TfDkz zP_-vDG!q$X)XF@SMH}H;+|t-9A`GLsQg=BE1C%!dm&!?UGy*T!5ZT;?zf*35z`3E} z&g|i8M(@aU1}imQBq>TiJ_ftmJHnH(P@3=S$gMw>p2>Wwr5;_lE?)(AkSawnsG1|hdxEpknDe2py<$K4JRG0 z8j_~|dMm9|VWNl@n|nK5TbuIyl&i9uHJgWj|IEN*IKDm@ZMt;xR!y_1&3kv<_;R{F z%egKIGlqB3MU~Rcn;ofwc6xX4pV75;_no)vDxrhy0Njhd-{i(O8UInCrV>@gy;}<1 zHG4YmabE~1Td6@g5nezw5!J$cygb2iY?mZKPO9R+Ts6$G=G|#bY`M|8DoxD}MHTaP zs4hY-J>K>fGc$$fSBIYJgquBMB@b6mn@PTpnJ(Z^*;69DQ(nLt>-ZE7Wfq80y;Gw}*x;Xk)AS zC~ES}cfq-nq*$qFa?6xuw~@{X8TV{4x!Zt_~=$)I+f zN+>B(;}%Rxp$;ovK%}>hQ&INy$03$*!jviJ+;$mH*|gIXS#G0?bcFuWhj=L2X59Xh z2BanW^wDrdtv*5dM5}La{cHf=YPYxcTKh(p9_B6p+TiA#OFo1h3XNuPC}gHa&W}&; zy4N@PL_9wYb-zP-I1ZKB+nrc}+b&m2m>q2Y1Vr883!lq<)zw|!>CYXj3(O5P<$icL!uU)bbC z4L0XYUR&}AQKrp!f1p3an2HNrRdcCg2ImIkRs?I%pS;{Z*~^skK!*wHhX+w_W*mjm zOlLan(lI~T9*7LcDCL{6ZDus9mo~4UGQ$llu`RB`h7QXs4_E4@zftz44Z5W@HE}+s zB0YeU*pbV*@khTsZ53d4*o`nAy`bG+Y06;EQ8~*hu5#T{E{l7C@yC&xcn}JE2T+R9 zUR!R+x8PsD@n`d)Ik4SBi_P)rt$)#hI{~wFYkX**NF< zGzQA_<^-<2$=w)0DGJ30W}upQjX+T2=NHH5Mf8_wRPce_p{SWT+iQeX&k5;k`dHdh z#NyUR#F$9pLS`kmP7vHN!LGT z(&l8tSmjlquqN__S#IhaldTD+jqOd}!@s@M?Z61ruJ&K6mD|A@3_VgXku>v~s}A=2 zXv{J2cNP7u5v2$U_qg#_u*XY-3nyH^t&5$w*8O^;0($EUJ*3R_&kKowedkikp)Q6Y zVy>Fxc}&IoZ0_!GpRYv+FY@>rpd>QP__-4u<5a;s(ud(F1<$SFU3d@!jWMe9gQiYT zciRIwB~p0bPJW?u)4FNukM}OxA@J3E8#x+{X+GL;0FgvvW0j6RzjblphC4Z-#(dX+{or=47B35ecQSc9_~&s zVDwigBBA;x?k5{u3j3##Qsil2Q-3XhG;7!;=93RwSfD>@gJ0@g_tqr_v<73c)=I_j zh{?*ft(c64ep*tgC@6KyoYziU+H`VrKJZRxnpfb-(Wy=(l6MiL4L!Y}$*H>YgK@X1 zwauSK4u;r9@vef@t5C*QQIh%%x8EMGGAg|v^8iuIWJtVUvhfBgc1Ll(z49uU;?@eGyMcXdMfl=RB6-#5=H=iuB zwyvm%g}HnSMzk938C>4U?)N}7RisO&qH{h{EG?;CV)q<<6Jx{}+SD;TcK;Uuqk=;E zbMTOO>od7md(AJgtJ&Q65a_5OD;qvbSE(q*@*k*lUY^!hlcJ8hc8`0WnrxD-MjXm{ zR|)vb7%!Q01oyV5 z_RW@$3DV6L8s`)ds?fZlY4g~VJ07MW3b>683oh-XPWUmj6{R4x4N?tE#^-UFiVFXu zdM7O^>d4jo6K}GT0c)FRQjhiC>I(#(5Y27O{`a3dh}h$S@p z!+@dxBr0(eAr~{J>co$iUd-8pirfCDp}N@GQ=xAnLXLB_n|Q54vsQ(U2M1qLWm9*wk5UceV=aIrZju)rCh{*$U6nuX%Ovlc{Qx91!!x(# zGKyhfr<0qau7EaLa8D4Oy(q8+F!?f$@lw6VS9}%xDP>a4&aBoM^Y~NfMu`UlQITK8 zz>!XvlHH?(S-yJO7puSlS(T)7@E}Iu)WMc-BYlkWd|U)K5btDpJ)+mF&eb8d1vuau zD@rTA48$yK>-V^gR_)KooSaDPcA_p8w+#!ZHR8J6N|=$WVYgchp+HxLU1=0$R~yz% z8=e7BwnTS-Y0^+ZI4jplVG)C{tkX+B|f1SzptSz>gFxFa4>$VQJ#gU3A8wP`{q@P5{Ws6eb?qA6&6t_Ul(ezokO4sgo*t zn3{}4+VxG7@BPR*qg#u}*K~C{RF2Bu%rzrwu#IHn3v95dMtY)5new*4R6~J7^W|f$ z?%Oz=MP3@G7*s)^L0ZI)QcquY8|mYI_B>xwq9J1PihR?7|N5pQL(>5tf&5qK+sboZ zR=q6Xy&1vI!VUya(&Ezf2lg#M`|_cmnrfE!TNX`jcD6HGF3M6INS_`g=`&i7i)Tkt zlMEkw9UhYgqO3e0iza*Jl?0C?b@fF}T%3<*g-PU;aHxdRKZOY`>XhT|A8if-n(yYw zSNP9~aZ5$~u8K1RU3PvW9G*s=?&j7;i|Xb9aGD&b;d)J9Cmi<6?y17|DUJ-O=${~bz7t{16Cn)7~-@!}!FAtDKeb!J=Df_7;BgR+4GAw>#?PaWq( zcC_yGM+JLui`ZkiW=kV5>b<1LinVo zGKX>%ev~cw+{&}K2CY>C-G%ZkTgH`q(Z#qh=0(#VW@; zyZ|=7S;Ir%U9{@{c6Vc5O2b_Swt=)nj1j|Y=dS> z&M{D2pILIjmQ?ON32hkXCRbzXoHCd#J)!Z?wLqHyXt$1&Pvc$-$<% z)qpv90(voJf!nQFRRU2DG}e&`IgEBEkl9+qSKv3f^5Ez2cGUGFDqPzW!(8 zUURmMEoJ7+mqP}!i053@@pU_}m|Z?Q5u!!lIgVevTzR_r%CR&P)8RD-hy6mWp}%m$ z#tfNjjXW%5K%bb+3iv&geSgXFqKl){9i!Ivr|tr>Ih?yNv-)u;DqN$sUu{KeuAKWV zC!b?{IE8EFlA~X<{bAWPANG-pA7ax?ICq`*n(UWOoTc7pm;qpQikCjW zKKBAvud1!B+lI35nA{-MBAQ2pZ%UW$Op3J3U;?5i7)5dxEng)U%RS4!aZKVx-4GNj zp4osiDKLm!w2yP=qyoYrkc@( z{TsIip)t9feW|pVcry+yz#!RlZvkXOx=5~RS2;qkmAX&A?Nh=}1L_#~Cl^)Ezq55^ zsN_T!G@5Q7WO0tdhp(DuWA1uxJqn&w@iJoSmi;zb5TXzkugmZ@NQB4{iq3Kv8cdL| z)rZ#C(AtGF?bB(MK*-5`|JJ1;@LE1@zv_8jI=Hc^?QU~wO8(M$qDYY(!mA8KcDC@+ zYkC{5+JG(xWc^m&Y2VlgdpcWB4{J8I1fN=KL3;0n5l2cgM-4{Fq@-1}zEVldw2w;H z=?1DfBcys|h8Ah2H#T}JHs&Hxt^oU*SNB3QphL(x&9vKsBG>ewthlrDAZuW>cS=iV zltz4fvEGGsfV-^=XMvy<$B72KR?E&iB`sk=7?@a}dZcp6MlXBL_C{V_fOMf|XXOD3 ze))slt{wkp0aC2=mowAb@I zabh)Ir|V=uLt?FOX7$k{$labIk$1Mc8320)i+Tn0scV+s_!8DC66b_gt(GuIx4c;K z-2AZsKw2{-Qc+U@c0N=CU0`Pk!Z2!i8JUHOoHCsD9B-EF+%Kbi>GNE?(D$>32)sV` z6xj~wB`VM<4o>8u{DEJM*Gz_|-q+~pya`Rc8lfU)S|DgOF8z-kJBUwM?^ROcTq;9> z5n-(un_PP2cho@!)5i%l+4#^Ftu|$#YMjwe35*@8CSy*}kR6Ze$a_t_C!G zyJ@tl-;`ygF>dgBKT14sO@A%Xa5C|2NU@@Y&tvlI>y=$;Ce%7uz&`7C0>aIqfoC5dlz+Xtu5+U^2?^3IVo57*ZW;ZErsVjyMmNcdPUa|X}a)ih$W!MQj2 zOye1<2!H>@PF*ci>hKivFK${#G=oMuZ9MIf4e)fdoL@C zJ*tIZ*+X`IuxtHmzcxVqKh7lAEf;Jv0ciB+Ds-35`XE5KH}z{xOQI!yc-k>+5y)*e z&gpE9cQc^DrGT^ma=zHMAZvJfmG1GDy2f6qcatqS-U#1X$4!sQ}XVcP&u^GY0XBpoBaovZ#Rl zX8rIc#iW#x>w)N+v0P{T|AVFPjB6tMzusL}SyzQsLm#$Rl5(pub zuogsW2pvL^-h;GILQ#76US@FJFyZySP2_30ku# z35M=&p1^q3M7l~9RjT}Nqg(^nyCM{|My(k?tbbG{>nbV!?X=N;{L$)1Lc-*2K|-;C z*zL*?LR zAR6@QoG>Go7Jx*mF{ZW)d#52I*v23=oDdf}GQof38H&>N30WkCO6@B1x4X={H&R?+ z&S!DOOdEJQ)3^FQ9$C@yt@Y4sR>!Dhm&Wy*z-?GkK%C^a2lC;MynK}W$me+Pwykr# zPj-5s=L(772nszrr=(QT<5;~BXYWv?>Xz3;0~9UKLN4t_yeoZlTv zPhZAxT?AngIY6hwULMgPJ=2xpZDsU?1(d1>g*vQiO<4UTiK`fItq+XM=`{Tr@;yY^$fZE#N1Reb*zE^*N+w1{B)nZM`^m?#YuvyInj%SYaFp!}Cr))PWQ z0H-s1m^8wPNm^_kD=@kz``3SKdfuyHSwUfQT*Y!pecTY=Vei~LXGXnq2R&8gva%$( zsU?OBG=tWR8blq|WXh+vcqp|QK1^2(wSr7aMTQm4;v@OACS{v<^+y5jT5I+(sC(&i zjNh#S?~p{>05J-FLm{`%Cw|kaaAIaIAMjv2d5fWFZ{9m29LmxLffHSVCJau1dT<2^C2e@{!R@p;BlFfVY zFUCKY{zgiOFSMKX5f8Tq+RLvFSM6|{?G~g^EPu%aM;}7H7tLQQ=HOv)-cJfv0AKH} z79r-bOhB5vcRvHss-uV}(Jzx4&SFP)FV&;HYDWKbIm6+A0GBkvoj?OrEyvLyd7^iMH}f7BkJ~p1+g5C_gmMX>A^>(?L`=KujQhYv!2c( z`oGXiS(AaLDh(_Q5mBzDd;Qmd418xzM)FWs+TkU$&)(oO5%HVvY(oofHzjs&!^+b! znq^Ov+5EO?H=NZ=^3O z|4!?_PJ$vt12z4Sa!~09>Du;lN5!Oo&O+5R=@SZFceCzx+^Y~FNhq=Ki5TZ0Uim{@ zIBck>L5}MIhVz4f9UDO2?jp#_f?;>gJix|me1dkR#-{o&tJITZ%pU5MkD!DU zgkHt{6a*Wy@EJv8bMnP|P_d3p+D!&tsejhL``Ps?Yu$5U9)LKONjkpkH`%SV3|4%; zGk=Zie581@Ox~*;F;+6t#RhDI7LKhXCwy5UdrTn@bQmYEEJK$`PCN$vr?(JNgy~$4 z{KvtuyMDk`c|y3>ZAKJ?#LMdyu7Xo|n6^CODWg}p6|VAeowPzati&vJsRXT0dDaJQufUGdLTu4me?OeKEZ*5~Aca`v%Q>>>ESPb?r-_Kk~f zg#*%S%5b-E)N|Yb0a$}J3T~szzX%tAnziu4b)8N#9@-unSk&gUdgeA17Lw{8{kd3t z1PgY0H%nnCduT>Jau{0XsrSSD`=e_PGqy!o8KL&&1TKl7j7LpB?@nuI_`h?MD^0PU z-S!fSX}W~USHxYU_l?U#+sT>-C5=dKzX}%%tf)ks7V+sa`9%zoNsnKmh54P z(U+mz$(OQTUSX((3Wd$;azqs0niBWhzY-f}oJG9`E}iQRIn$|(KJ3TG zZ;FyWv^6wJ+QhvZzPHBL9(nk=gGpMwq$_L&6>CHGwj@lL4=Q`sw-#9?hYijtI3YjX z?4yY7tFe5F7MHrMj5k4kA|v~mVys>E_Gq>l_4!!XE8Y={l@iTwCe@Hcc(CKfVo=W4I@ysCSPo)KCMABgN_oh_!ldtnH_N_> zKz(NUpnAeW5Dv4!4{J&);`dO>LbU-rIfog?^#+Eb9wKypfS0PH zOLp<9lIUp@HkN#tZ*PpH3+$U@1chr`=bMG%$#bn+Llt*` zddg5XhyP+8Q{)t*luHvQlq@Y_Zl(CBS19Gb82g?qYEZn%Vqi(*F65eg63v|}(zdn0 z_V*!d-}}}NbB*7O+eBL>_`oY#nw?0JaB=e0c49?A@mO!ENWGR7T2OA~hGr50#1Ru~ zKHQ6WL}Df$8{CkzPM44>6ljFrPfilOd1BS{+r2U~+uPB}EzVc-Ym%IV2&o&44AF&} zC4Ira`6Gt8Vzt~~_998>X`{@-O6%y(x) zEsu^GCTm8H;I#m7f8pmGO~mE(Nb6CA0S2)}gFw7&GV`pl1}&z|=^~qyILhUI*|>63 zfN}AZfq3KQ>`yJt!pa!j^h`c1I0mCWe94*0=lCk^enu*30xBKww12tV0kCF@e@sNa zFg33go-iFxdE*?`kzJIjtJYdF4NVSA6PEYA1KUHyOK)XNECm4P_bYRF^ZsA(aCfMC z>a-)6-lTtd@f>Mvp<`F4TW9U_Tyq0)whc%oI<7UNTv~Il%dKoi7l-23;xZcm>{#7h zB(y0~;-q4d7(LWgF=hk9R-TPVa$MNVWpg3dJtkCc!&UsPz?F-~+EZ1&s*M3JS}OBO zmz+|%fZfW=$%-Q<@+L4pRCZ_c?Hhk>8;XVfN-^}WQab7jYhAlGL88UMLk_vmk==j- z!DK&T86tq#zSMw2i5bLHNsI7*1?-$g3i|}D_DA%d8${Q(Bj!1+6nxm(kMxM6ImC+G z_90cTqrQC-VbC1txzNfa!kZ||Zy?OioZKWZ1Q2xX{W73A?DSC=eWqY;@<6&RseOgE zR*ZK=7{YA}F9uLCy6K6gwz#nNenQKi7F7pujvu3$C1Jl9G?)J~4b0yuCGHIdT_6#x zCryS!0H7Q}oUF0RhJCEZ@f`st=c^z{5ldyJUjMEjU7uNi0(d@!l3|WN3K^$pl+E>* zO7kpQ>pNZaB6H_^Nl@%4*5PqdS4p2z&b&g{Q*3Mawy8_1a?G^ge)+@tk@-Q~iPl5j z#ZNJKn)15xmO?7|6VOF@N4N!L5k#eyG(-Y) z)n71P)^tftGUeRdFq?U(F0&vRAu9v)9MQam_<4*Wcb0IDb?`-+juSC5Bk_srN>q>2 zJJKBQ+uo(`vgAZrRtm05(zO}NHeee&e_zp7qymc_XljubQZRM7*DAen8Wp3@m($9u z%`ch^;WAw}cv4092T>YVqpI=dyNRG)x;lqxaKAaZDfz*c{A5W_$}Jt!7Y|tom*O?W zA~X`(-}x5BmA`Z6%{DjIWjBS4Ui@MZQk@yJnMt}gEc?4}fq68C;FEKLma(b>hMn*s zGrgkO3vdF}!|(ig1aCi!sh8#xwo2KU2poFlWNdz=)A)@{$(HW+J~y}PEWeNWw?_Hl z*r!TzPsbr$h?Of|?U3(SK996&#A9Eb3~s zn(tP5gdKDin6ZulId(ZOnWn6Rt;8-JXcG~q&fzfXC5;zxV@ddXTatZ2kBlNy=QOA?#-22Q8%lC(<&5Wo{ zJM1@I&r|5xXu!VQurhtS3O@w~IC`8Kk`5DbeG{PKIt~3%{_YsM_FcYoxuwl(hD}tI zSkSE7&kAgZQ^ zf~!oK`_A|Q{AppJm5}*p@Lwe#H(?psl;Q#G`r2b}qP~@#g!lV{M5NPb-fP3W;n1TA z=fOTknYl>j-wMKwnMe*j7@&YOgRL4dUtYts=pXCJfrzP z7B7x9KqFH@Y*~-_nYWwa4)fKN?2IM^!i7ej61PPx!z^$C5St)!6ov~=NiihRpGof4 zc4HL+MG&huJWji+@MJaDf!WzM+Ca_@@_B4Oc_LQm!64ySjR~@WKWr{O3Vlt(D*0s5 zJJK;#x>l(Mo?yR481Y&|$k|rJx7B^%x7MMXE9>$bn(do8VFtrVHM{vhg0c*L$svVF79$H?ATP<#Ge&M&eDWv87Y z*Cw1riHchvb}Gwqn0Xb@3p z(tB;c5TnX%rjemThYyL8N(#2-FPtF-y1|W<0b70AUXM#!BLNi?msyB!I&h6C06WI( zvVLqd!RlRTDxvm~F{L(lYxz@5wwc&r*8=wtK!p|KrwY`1SQHcyk+A``y*1ViptAwf zN*lM8U&`)gCk2q1O`k*{=gZ8IxfpN}JhneWIzjI_haT11Qbw>^S@qeaG?AerJr;U+ zRGVtIchIiy1RVe1t^E#nz6rUYC0l@vK*-ptKVKgCsz=*jaTMd9pvsQhC6j2gM4(^q z{M6NlwmIoSo^lPwJBi8o1qd0Ot17H*4*m8Oz|BK!V*I(n{0WIQnUn7p6H&2$P1aX%w#~;oudY<0li;el`;614Ji>jjlE3ZU zxyS7bt9ei2?YK%o(qhAZC0;auO5gU}Ns-2Z&QN8OEFTkfHD4t#TGo{E!w5AG<~|X> zxsz{!C3TD1OF9BFCYeGtyiDfH>u$%B%uPm3OVPJj%4}st8Hllma{s9-m(>w|XbaPH zr7J0iH^c*Eoim~=)lB!EPxkN(ZTW7RDq^$)>aNWM2~oBMX6iGS<<_&!!@E+v|`(KjTb@ zYkfNK?2gT?hiu7+2hzh0U(H?)qe&1odP9c)>ez`K@D#Q2Ko?2s2jF-Nf_REQR4Xwi z?tQ**4+ykZ1H!Kjr>&k@V_po$#y;a6ZZ)l`QH%QOR0WChuTJY-0l#Jo#EYuVoR!P{69$U0w!*@p}GXF=v>jeUM#CE%dFL2&;G#Ns(&SS z4`yaHy9Pp!k(_2wF*dh(w+^3eV^ZGUEW|lid$mCFpQ%tkHQwP{{$|TMU0T!0t?2a( z@>ULjQuy!n^XTRWIsuUKotpY%TMyg|ZKfCa=37l~1g6UpD|!7m$Ba(os!aSCYQbFR zg7pEjOfl2EBe={MR5=DLU)!=jt=16wskJ3w)A&a=mtlbBuU;HOqM7oTN^@X{D57L! z>s~8OZri@)LJ1_lc#(PXw-EL9SKg5k+!nh93i;ZFJQ*0+$q*+}rJ=WZbf8`%m6TZ$ z=$p$al8sXU-n+bXqrE9)Lg{<}6!Pst;ZVjp-Ip_D`8W2tLPys%?nE&0WY*7XZqvK5 z!Pt>GnZwaFcXjZ2fT*(H#-u@K;#a${4?t6|balVZ-2AS}iv=dY!$pXtJ`v-Omh{e_ z?{<2`-(l^(RetuRBv~Qdvk3{l1e+i$_`)WNLX9Y8#)|{Vv%V1r_NII8_?G#+3O#W5 z`Eg8EDV24XWA8lHKw`fNxPdHmRx?E(9{yj-`}_s-c?L<=sqa}9r7~vr>5$ofN;hvP zx@K0|1P@blUGd@rGq}7B;oB^szbQi3B-XCrARdIEhEs$2rG^Vw3gj5Q9(ZKAmVda@ zfq;;S@V~28tOqmKRtm=4jUg`OqX5T!^l0<2lw$!Zc~gHKxVjY7hrf^{l&OZ*fs+VP zr&xgBs;Y`V2y#fl5|8AB`NtBSdTr^VD_eIQ5DmV})?QUP>oF@?Fzd}idy1B(&uK=| zpYTLo*W3V$rka+xUOhESM7jg%krc3d(EXg8BE9oQ`gY+e%-9B?{EZkGU=$Eciou$O`WHk0F+wFV)wKsN~uc@qRX^N&a69?KfI$svmj7NJ+K&+mBN|o(@vAWX>)yJVqi?6h=rm6M)FadS<0HWL3h>* z&j_e3q`rOPexe4);HF1~?l$YdGW7<0mDzm)yN!ZV#=IooZYabBHwfZ=60J@Mpk40# zlx$;nt$UdgG}Au$-8b#7^$R_C znQ%x_7`mQJVLrH)OKSKm;&afrR}^^aP_V$0rP%H2O&swr7$MRFL;ExFHC%6`;IoY( z7kmA1al_e`5Gsd{b;u(fuE*o%uA$yPzkClyagrvQzM&>2-e2D_7IY=m`ydcBKn`h! zy3jCfM;KNn9>S%Dt|`mz?%;`940my0B{I^)dKVohRVb{@(F^Pr9(3rH@c zEnrHx=|B_2a}28*_os@@g(hDHxUHpZ1yzTrO{h#LhdYc<19;TG*zz3S8&y!2h#lWyEwe8kA=6j4J-q1&nCG31(L+CZPv30P5&LyQa(}FTX^alw+UhwK{xHLU!%I&!;TfhLf3*Ol zUkT)=kVMmb#xREW?x!5|=i#&l4k@432W3>`ulJRXG`Bp#0Kt`5A#R5~k?pr2L4@yndfz*iQ|CG>-_mE! zvAjWsOsU~~i8aHw!J7=4JxSNnJq#V1AXUUPD^wjCak~n`9~2oieKb=yAigH2cCri% zMFE(A?!i$ybv}yTa1*F%sz%7OX-*d{JUa+b$}&l&oKk!1;{Z$N4@p9KLCsqzubTL( zKBq3Vuaskhe9AtGOLd8cTU($j%NA4_OFlq`xnaho3c>efy`BCcCtkv^I}|~wh7iJc zEP)d@2qI;6&UZ|LL znf`ASgwWYFYUYOE97n3g&LsG4=Ho{lib$iu0eK2#a_5nDdgP_jlj4a4w&c0#ac>?I zcoWggQR$MOP+Y&bM#Ox36=#*~w#=+MUl{rGQ>WQZz%+Lf4sN+1Gqi1D+cPa9vl&NA z&sv3aLl2@2!w#A;Vfpx$v-4%G`Q3T;aVZ-))Jgdx}RlD-&pL z%g}{h!X6%c6bx^n6<^Hk&DlRc$Caxfqc7+Hsy#(I9rW%(&iETfl%m4*`L_NvX8ghK zdPMo}v88a;3!>5z27UcA5+)}j%ddH&TG6`?M^qTO2n7z0iSvUCh1D-<%2)1EO8PiMW%|B@|98x>Fm%|x^!}hudnF1bBE6cu;4(}BYC}_| z4M@K?aI*3$g4+8Ua)qsSD}w#S5eM+EWLWCb_sTFG=o$6G>#o`w%Cg{g|+Uc!~(37nTqubKq^qx-R1CtnPvy`eF=p$9Rbj~w) zs(n|z&6`SOdY6-g5sban0w^h}V!!zq3p;xUHG?L9Jw!Ar@LgB{t5*XuyDxNU%-CG) zVCx6`!?zm}Cd(`NlHi@`M<%rWpZyTcpk<(cp2Km^kgi>Sm)8=FbH-kGlY5arQ$T#4 zUvM#ovQf8`5YLElIQ%J#k8hgDnz>;auldH`{`&AQZjyk3ZCH0-rOeukK!;A0ji)AG zr`9^i!wu%s)?ad8%1Y;oBy)zg^VCVMTENBRMamUz&>=UssS2yjfB~P0+q0VcxHawk zJ~H>;wuSWu!V^S^#}zo|HM<56z^P&YmVEfK{fmpFge4*`ySq+=f%dXSk{l21Ah^SR zc1cU!A(5 zl2qKtt=uM7E+n7JE4C;j*Xayi))ISY(r2q;9yO*;oQfDqzYZ%ZNJ*$<=*Y6_8mxv* z)TN__)o>f?5yNLOQ1=JQ$t>XV-;1zE+}!91mF3+O|0fa&c?!wkJWkyP6E||<9jP}> z-@UyI`_rH8!G1IrwJTWVKX%jJ~0xA%Ck~s zknD)p-ns@PtD@SQamR0>Hyfeb{HwN;R!NC)>-$A!q`+=VKI;v_OTJxPNCd|plaPm5 zrQsVr52*B5Ul_}Y;&JDNBT=4 z_Vni~9fcp>I?(uDr|CxMr{3XOYxC)v_@={v+l9t1PnB6WBR8j(-|E>**_>2>ngaKZ z?%NtfL5&%?lMB>D1K8Ph`a;VI*p^Z>AK0IFrQ}Azj8lw(9P)))ou)mR_jfOuNgtz? zs;#@tel;^&#qT&yPn~l;;hi1t*M(thRqg&cAhtJ`=gwkQLi7)9^jyo24pe_Snb#`w7f~{2CChMjpgY+CY(5PFfmQYGw#I zxBjTwqd|Nob5;d5p_OpyTBOS3VlMrJRh$Q-m~xvxIeh#1d9W*Ido|Jp`4wf_y)wIB zBI`#b{OjsiRV%Cqcw)Li=RayCANKyt#;Dvdw`K`x&@!a@(QNRkOie&y+$ny}m6v}o zIk;aAYq;oi`IMd#46{ZMPrk3mN)P>}{IQu=l8jr7DY9_xb^DM0)0=y8&n* zr^e^w)J+vk2G!*8WV#in)pl(6T~`eou|SR1^VrVA>UZuFM-FG2a@me;KFs>STP~qD zo9-3RJw}$B`#Nea7L?tW4~MIO-L6p6T?L=L{ksZob*BXRxc>Etz_q`+VLhid_%^U; zp~_V7>4D!M44+dEGeywLXSYdtr~pB`*5UrTY;i1`T*uf20cG>}l0y1le4wziUlIF_ zOX|}%5a6MoNLhZ@lWmHXI9a1};(nzbu)-6=#<5}BstQ*}r3PU+wF+yTp-HErH`>3d zmIs^Ed)c`+dzHQI2yXXW8$3ZryUO#Uz-@I&-9#Y54W}HR=#6|ZxrS0|AVtf3!wAb| zn*I-ypVLZR#o9?dKO{J-q8X`q{&Was)?6@ z?tD!MlfD_PKwX5gCvzYvF6t~8gMpo@7c$Y%Xo@!7sl2Ez@Gr9y2^TC2p8{kXFFl0q78{qo+36^rr@fm0Ty{3ruXgp_l&rnX=k;t~(j;BNEePaJHokA~ zF&y`2x)5XiNqx$7!G8dr@YY}lV1ceV1mw3M%GTvW8YtOtPIuk-erHJ!RscSN2GyyURg$xbufwaLa5r5)=53SMXJo^w-tY4E%s zPlIOBKABWGQ#IKbDk(SGg?oj8+P=j&>{-xzda}$BTFtNqTpld@ojPO4W=+Ut#AdyN zQ=Mw7mABhR!k&vAY!%id>l3YZCQP%$pPm_(1_rfFXy`Hi3F+FDPB^u5n=FVCkP|cO zY?M;1G(nUp4Svo1vruxRX6i2Y*ZTuXr@cA_Ybd}u$}A430nuJ&NtM&#kFJl6=DvQM z)V)#fH8P`i${CrI9cAi1Xsj<=S4e(~Ze`l@EJ7I;TM>Af5h5C;W(xKMJwHWGrtEr; zM9^g-$)K#&1=#}-LrMt)uV=h$W!kwa1rQ;^pF7D;!PK(Ii?E}uD-aY#Y=fRY^hzqI zh2$DQS5FDen#csuU ztg&e}e%N29sa`_x2UFp%TkPtAZsKw`ir&{1roF!-V9@jr7U6L}DCpePB|EiNSWD+# zf8Wry$F`Kz1>2hA|KbUW3VsJWXF_wvCawjV9NCGN7YaZnGv4*tC3MT0`v#|VRsvfp zMR@AuQ%(bv4N+WE^1z6RJ>!MC{j!$3YZa?krL&Wzp&e>rkGI=HmLXEA^Az0$-aVteCk zdfksJ=+*kq-hKwdLA$V^L-GpaiThwSk`l2M*iXtq48CK<+CPu$sf>Ku9G;H!fu*!;u6 zuU{NFS_g)Q7cDa|`X0~&v_BmvbKbYssQ;!cKV6bv_(8vAHvI$0?YH~^CT63o zSIb*%O9BMKr>(yQ_-iMQ(anTob>2nRP03y-o5dHWxSm+Qd-q(cDvxH$(>8Fwau~lJ zFabxk>afWnB}_D-H|Kp)I|I95v@M1Se#y8Yu^_5=bD(Nb1~t?7J2!X!PbEdA3;(dm zaS`EGXV(2rn>P>A&ynEa+t#{JNz#W|iG;+b{9iJi07zG_M_eP+TWx?J4rzyd+20o;&#F)KpUum3cklh%_|OY-R7SQOfK9VLv66n;OI&%5N_9 zdf}r_U!4ZX=XK4MSIs_eOZaRY>)PVmxM@1`E3ItHUK%5Khm^0`guDLZ08T@b<7qt& zY~#i>Y#s{!x*71l@kMK47du$ywzb#=sh4yeR_M>}&VIzW=rXV*qnS3J4m-m>8Vy+MdHr9gntxfs&UiBQ~*pt}ez+;+ZASbz?EDe7F5XDdAFV=IF_x4Q^z? z&4Zq1BkTrGVyPAADn2+-vngFB;s)|B7kj|y2?~0Cb5Qde(ScyGB>G< z@HUCW8gG~LvH$&jltR~byz67_(v|XuQA`$VdaIQ_w}s|Y_hZ)_U{tteBoF(35(i9+ zob`39#W6Z2n3#Nw$JqJnKAEGrlt}u5*M6I+S8-&9Q6#~1-Hx6ckbbs3`PiW6o?!== z<*m2WV0dzQv(scI7AK`J*n8kol&8U}eTb}mZT>gpnP^MDPU6ZB;<%QWsVvim#P&1I z3?{fnO(0}Xx^mfn@=8?Xn|D9FHf%T~*Jhtz{fyZ|{=vq=6V9Ek<7B5PlQ|)Adnyy; z_P26Cr2x@ zWoG;pl~O+PUmYFDPZA4tsi;v~H-43hJEOX{h;`&L`0GXMh489VG$c>)P3ukQNf?#e zp!yD+QM_>K=RK#F0Y?Y63=M>&C zEk10a<>+K;gjp`@x$^AVJrYJU7)0w^8}Vss2(uTzASweD2M_6C4X%df(jNT%_{U-Iy9tU%WzEYV|Cmj$@9L)yjUzbGfw|jdVC$ z&pyJAT=ZN)52!N`#IrYk<%HJWtT-2%i|Z!OSt((9IX zUc>LY0MvzBltz_}$V^X9bn}2-Wy*>uMKVyw?mQo8Br&vOm@$7zvWy&qE!&Lt*LR4- zBC7A&G`}aW&{eOQhDP+gdUV&taG(4~i_;A*Dz%fQ0)7UT!m)VXfEk&Dk+s;D(}U&B zSNNSH#-8bi0qLAGE9Y;c)t%FW?^zg3-;H1E>Zg2)!V5KlO!)@67a7!~=UP;{D{fN8nc&Yihw&m4L#N+?7 z!2J{71Xy)pk$w%wO>rXJ^>$)rifC57DJ5uP<1~mUS;8+k5=KOgI@=OmlT!CHSAU)H zbw+^)br3eRm4C$xS8pH-+?IYPFou4()&%;k?RJJeBzt$tXN%$O4jcH#KWoVohK-Vk zKw61+`t8`hlz)G{F0^?lCbl$Ed4utz3OsCFcJ2H-k3`4Amr)vgw$I-R35FnwDvX1Lo~(+Bk7kSkildLa?w%@VK_3b-{?mc1fa_G`K|=LkTgtj zNhnnJ65%~L!wJVbO}5?ju^<}Ad1rqT8CY)X4QZ)vytCr5j~Gh12OGH*J8Bm&#sZSM ze%S%%yUisHWqFlkXS}xM@FTChE=u8|tI>jco88Ch>5rBsjASxAGTS8GfX4|P)^RWRgHSwD6^(KyCr-cTPuDZy#f&*yuc9hTPKR9erJIP3E7eY%#PgR9-CDgQ5$YQ$HDJXk=X(-lTv!=SHoqaKsfI~ zjh6K2TpZZj1fTt~J_YZm%xvSS{iurXS&8tXZVP%dWoRl;HZH#b^Ajq02+%sADtk9+ z8#(erbFDL>bS5Frd70U;h3~KD>^48hAL`^%7}lk-nS*hsKaY`MeoQ{*0gV^@EaxFV ztGPXWZBB=0zL9Ny9u$n-G4-3jf8Kcl=;wplkf>&&e;vH%V{!KM_4-dDr*GJsg4-nr zb(Z>ljQid_v^Y?M&aMW?li3ecv=^a!MV&B0WSSucg!ccCFXnpATpB#O~8+J+ISIM+hl`OAI$Xnf$x0qd1c(r(p}HP z-9Rq)0^6!UYXcUzTn{}uUUDTLHb>qg*o)P!V;Fh>vHg3*r=C@9qGPH$#9=Ni&3=bPMX%$LSFR0 zs7xrYspwhzm$9P4|DqXGYU$Zd-h?kjOO=Os`l+cHvp8=B+HPL^(hPd_n=&qW`qs@R zhoNg51=NQwRX{2hC4HCirp|3WyV-x6v+lCYR>a0~II?e=ml8&q7`Y>r1P7c3mN~mz z!Yu;wSZU~HHrlur@^E=nzGf`_x~D!oe`x0c&ibbpjj^AJn?DyVXffHisxUnJ-%& z=}TsZ`#3*^?U8!wKgKBqeIw_w!g)YSqc4U!r_)k0PJyJGh6(V=s#-b2*o%Rg4htCL zwm~tKYb!INIo@dsR>~8^#iD z5t{q*gZQpjybkzvxNp7!#(C}UL4x*0eAn~6OBQKcVL&=w;%>BVkZ$0NmZ^_l;OJl0 zr(I8Mbp|%iE-dr)4YV1rOgxaxHo|T0P41NB?sQ2(TKiC=Rr43>Ve)s75~+ix-Z!ix zaIL`>aT}<6pntF6cK2@hT*S$ZAz;o+PG!FPIqK`E9Nhd4?a6(3Y`B>B8?Sbj+bHHz~z?EN9$*n|`H0cOm^u)GvhH`wR zHF)P*!s(kM3~~}R+JAj~!HX$~?xpp%l;mrn1Pl9$l1}!})N~h|8X)HIlxXq=0mc`M zx%*cb-eh@_Va=W29+6kB#v_FvtAqN0Sy zl(>+8?qaV}H!0OWuyq3br>3`zjUrXnwbqO3hdVuEjE3H5xOmlEC3wBwfcmP~%31|9 z>U*^(cvgBd&trsU#gR$&b(KAN4uiVdQvy!^O_}SxW8E*TAOlz|hi(wLR@U%|( z%hH(R;y*U@Xk@_^Y^vJS?yh!?P56EpwL{wj-I#B4e=yHMuip22m((iP5qGLBHj09R zjv*I4jJQB!HR*V&PQ{erlqlFNyG~SfWsh4Z(PFOb6UkL+rXXA12!Vbzn7`*>(m37Q zqh%J`b8t;9g4*W-6)COJ}(57W{p~F%q0^z zlmn#i{W)68;9NRwI~#xX+gL5KfN!^jebjW@1b6|paILdR&C8h`QEPU^UW4rA-bh~M zsKouwUt&S%rTU@$^_*)z8mG0FIgYHpPqKUZ<(ITTS?yEaJQo@)&*$aFZPmERR|TYZ zZ|-X4rDBWU?N|S%52I_x&LSoxY_9|66&sFiNbg3_!&v&@?^#5|r_AdUF(k z-pz|{J^p-Jn8kKB(RHNQ_I$=BtQ(38`MK_Hcxs@spe3d>l5SWa^N7>Uz{x)k{hIIc zL($Y4ydv_wVCu}kRV%MOK(AVMF{yT_>PD42HS~Y|WI1UfQdWewVcZTib8wtJdj5Hi z&m#==UaXr(4%TJ*u?cc_ zHhoTj=JWDW-06vKPORhGF%Jqh7 zjmRoP7whM_%=~A8!3JUPKuu>|ehFEFUUM?5Es~G6*Rh)lP2`DY+?HY;{qkI;40RJ2 zWu=pm?)Z!gb*AaGh2Ha?bW#yy*nW7080`Et?d&ob+T`3j zYa)_tbE}Ig%)P?7r$6CEG}bxmJ8`IX$EGfV2Kvi=bQhGC^Y)8AL7|5@*?lNQt6ba& z8@@&Lvkq2S*8#+?XA6?I!E9uR`k`Ch1xl_2U&1u>IpE=-@ub#?8{$TE6Xz8Jp=y0QwAWlUEqj>@$8Hp}J=X(QLd!}7u&7Wn=0 z08;I3yv^oV%JJRMnu<-CQ*&J5gw06XGQIi<1bf~9N7iwSHocaka>Le^biLEBcgX~7 z^%3oEx{WF2ePr!+&dNW1*pQ?YFvPfN;GqEq9v2HJj}U#2h880hHKz}|3riGKIMd z7B~N+t|4@E#=B_>05@GjNL9iQW;nacQU`WwR@WC=&dTq^*484AsZ_iU=QtMPD(QA~)hV7vjxi$in#Z)PFh!SZ=Q{%SZ0%p2 zC3I90qZcN-rsw?vkV2Q`De=)uVRCjl-nWI1B<4q^CpP!jO3oK1aDIm zbFIib)?oYqk8j(ko-rcwNl{QWo=fm9OCg>$n$o-Tc%5NA0Z)En#>&G?8y59Q&zR7- zZ*T5a%?+i8&*jLcK#GNiy))fZYZj3Oze{pkfR5g;+a&Nrk6pE-l??G2sz8GiGRynd z97b;J{M~ubeWq;->>AG;+fS5BTlDf=DaCZ$v!$&ip#<)Yh~VFcj86S{D3iog|Eeg@ zu{)_9&2JykPmu+(l2{`h5AoLeXp8v*hNX%LySD`{$7OlF3Nsr%=3m{}-fn~<3&gA? zvAdVo0}b5;ESL$LI>mBOy3x3inB$S!2SWFbWnJ#?f?mtI1#q0&o$&_Q}fS||Zxp(ga+QF;qV4G;qN z{O^75-Fe^dybo_=7zPHy?6XexK6|gZQe8^AwQuf$uY4)OH4wZ~Rj1`s1mCg&f9@B*62uLq42elL& zbw5sG1BEtkwGnoBPvNl? zg88ou{UxUTA97mp@Hs8P&#Cb3-Lv@S?ncE1ePaeYH>M>Y&$W5RiQ;5^-$>2Td3WR* zx@x@yXt)PCT=Fv~{Q03#eH?ia&03yv**)f!tLH|z&YYWAM+LLStHrq z6Hxyv&xE7hkh2ZD0H^&|=+G|a{c+7Q>Mp3dnUxOV2ChX0@P9Wo|&j zOj}m0kC<>>Y1XEim2`8gz;>8gTUu9`nmVNT>3+POcGzZsM$Y$23mEQ8fW=!Pq=soDEBB! zs(cF7?a_V!%D*#fhzFQxtjl0aY=UCw*R@RnQ%y6t93NSan~IuF2-}K1O#(LfQ0$rK@MZUo0tDBV};jB$j*5cVNd!;x3 zOe0TO7yLw_8-9vwWAcegx(}BV8=8?%RX6M8l{TXSn{Mms?61zeKA%!Wjg5bvxjlY= zaPp$aICaWVJq z={E+b0bwCAvOpEJ)Gq_dqJA1DzY`_GsgyYzVA{}Du*O)bD8j1bUH3eYywK2Vkzcej z=%*7j)#N$`S1>#cHS6X!x!IMI4y%dNQUev(7#?>+NOdU-!)O$d z`znHYYvqTh?fqT9p=Y-Bt)Ee8i0W>v#Dv6ch7hRrr=lzILJ2qZDzMgvGL=VJcpy!P zzGBicq+o^f-mmdTJ56HqOt>D?G2N$m2FnP z&?ne?>zgl9L~w}~w&@b^oDRiiJhE7Ql^tX&|$0~8K z_AAMrtX(C6>;Z95`iidSVqsR7s0+nZ#N?VOLv=Be0rc) zb9p66#WLMi#jaX&du1h{z8DMYw(_6%0?stLec0kp17qfzHP%3RWJn;EbEh9xNwCfg)n9r zvoz<~)F?yL_n2RSO<@Z`*uBYjjm^k~svnJf2x|INgJljq$jq)Lo&X0t4m*lY=@_3@#QEpNb{p8ZBA*$0w!li zct7~R>{~fz9a9D4)DR~br6fe_c1h36=Y6aYf)wxo(5#%*z&mX)1U0C4A#J9rFsJl( z8!=iD?O}h8fQQFUoAc z>sH9rU7o4aTTk$$>{kOrgy(u;vxs9#XsQ?fM9HsiW|ST>e7BRT*g*g^O;rc=npflC zZxI-exQNLk$Thsh^vqHL6a~jG2C$$UqQDO+p)1g3ni^y)tE0icYx%Ybpl9V$Ge%8> zZTFP-hz`7w^Y)0sO+>Cn>TPO`*QQeA!|XdqJMAnWt$TV+t{$b80fx%O=tCoqBV)&L zxpW8VjRZ_Wl%^!#WaEeTPY5Vri)0rWhs6ctjsAQAQrTx7h$utmO|Ch~n16clgm4uI z`qNANJlTyFerq*V*!iG99${0HKS(F8VZ$RNMOhkWq*ry!UeBW@pH;FpZAp}ghvu)^ zp>oaUl2AnUu4&uMlJTEHoO3T3A4k`NS&thmusO|r{M0BebJeb7XM^SEh{TA+MkBSa zs%w#pK90~-++YeU&S1_CoJ)megHmDtTJj(11$+$J9qvbwy4ocxzY`kz8~e!$iIlr9 z?T^S9#fbJITb1kiB|2BX*79(6^j$4Ci*OmdNa@^X**ni__&v*PJ|8B^}2r-xA{%AGw$57b7j|A zwXIw}sIXtq^8AG;_f3;q(H!k#?uECoj&JH&;;2sEHP6<(amjAsaOFu)Q$LJ1Uqcl- zX#I$JxYiYKqB2rX!(7o_Qp4m98J~z8W}6Xs_^E^(m=fN0d%@zfnR5^P4u{HidhVy% zh(S)OZTSsPb<@DGq=njv@G-!6Xy53p+sZ+HfFew6?G8pFotmolkr^Bm>IW`)IlYWdZI6FAgipNb}50WtR;Q+^`4U#ug&{ryjM!xE2DAw zp~OK@c#qhFt>NIej;eo#Mkwd0Y9BfhVy)^qvjg` zHCmz{6F+^|oS0X3^mpSqpPw-@!r$SESa(*+94Ncvb>-cyh7uruvlXd0z9O$)wn&qa z_hO)DHuQ+yCtgamhekD-$*@G`ionjZX2grl{hXi)&lAbi`CX+=I2ADUx)v*>?dyQisYPYyH6#a8E4K@F_&uoQ_JS5q3}ot(5Hp=X!Bs76CdPJ0&2A>$dj6MG}p0`3UXDIa}WclnmEkdXR?A(JfW$$_lUfrUARZ z5*HX@zv4d^$xbWc-xXNb5xEhOH;DRmwAm+0*eRsuc%V_)mt3D1tba;$I}B@JPaqj z+yUrU_cQ5P;>iph44Toul{Rf7Iz9y{D;RRwk~Oj3>^>9+4hieIG%7JTU2Ic%L3%>E z|HvGj#mEOzwbS1(W945ynW<|Amtek!oPIMf^aw~;wwp7^fj|Ld zhkb5lOGwM{)Y%X#wrs5&Kkhj!AdGsA@QYt>dT?*bp_Euq?-|1`^3WB%4luBWC1p9* ze(bu2p5*q`t*>W89#<_)>Hu!IfvY1#2vNCjb_(GvQFG3cDZrxaMW1zq+{=?^`+Oti z{?oO}^z`q`y5#gpnBM$xXc~t>pd&WZw?~41Az7A2#Dec;EfAGmVeh?nI9SNJg@bN9 zjZZh1oD#%g?s)4|{v6J5?)>27)V4OgwdgE{Y3~|Mh^XC9Xt!BrC$D_hP{<(CS%)Z{ zUsuL=KYU*k8lU0g>MT*3D)tLbqy?4(nsjQI4_jEf53X4Xy7@NkRH{DLHDI#!C91*e z)Di6hn=yueuy<-}iCyeRxf!1yZXYdNH14byXa-I!UHsWBPyD*lezJFrWf*Z^Ib0pB zXqD}vekydY%Oij1Bw1?#b~Xb!_|)G6&-6a(LMFj$ozWvI(EA(T8PYmiW`3?U6Q7x9`CA(*ik9Y1 zl<0y&%$z za>!2K(qj4AT@>XUB`p3}!{hz-(27iSNDHy>A_-X7h?qW<#G@q!yPzc^#@4q9_i2Lo zzkXj+wa)8K#3l5980&Xt4ncM?vOwVGsXp>CQC;uE$Y=uUr7b;e+aFi+sPl4ol| z%v_U}jkuQ0vovwq-!{$ung)DJbxac}Kux8ybk(_h_Vsuta;9n~WesGR58k&WL10G# zPe!!xFyj$M2oJcSp7)==bGSPwo7}_?(M=x`j!(0u--x84ku_@SzJhxSjaGBMFWJ!N z3#R}5s%J}%4SMIQ^jd4m`dmmpxf!I&*6+x>dOK&a6oh(7Bl0YldA4yy)u<>K=X|`+gc9HxOKl-cZ_1rlnxN>>RSU9z9X8atqBJO?rUHlUH;i z<2<`0D!10v9j#$M5ra2h&*}_aSYuO$4oFgqJZ#zXJx5x$;AV1$p7q<~!^_H9sKH`x zR%twCc}A~TQAVS?A!;nlDAlNdnI?OySf6nP^Nv0do`;FP$Kd&qlfPS(L`3$nKH=4PAVe7c0q01aA3u{h`PLHiZzR~Vc{<> zl2VAiB$zQ?ELCWOzG8MGc~-r;O!%?6UD4q+>oe53^4y{qnMMM~9z2~^^%yh1qW;|K?G(jh=}QU-4&-0 z3QV%&J*wdKWoI`uz6~UI@I#43F8FLlsujqWq~0LF9E+gK?e(A!?eahBK|?rzghii! zoeAA)Yc0bEuZo18cK<4~Y#2PvY}ht!+~Vp9PlUG%g6!sKw24oTcmcIe(=#5o{KUNX zi%`T2^vgD&_BcywfQc6sKwF1|)8X{ekGu)QXT*MlS~@kH0YODQ%-=b{2`+l*9MfSY zx26Xh3VA_~pR@)0FgH}uL4Z=Jul&(`CKmzDjuja$>a<9<^`sJ(%(ch-tZ_GGx11Ha zqwrs)+|6Bgl_mX47M~pxFrUppYJ_@LFco=AuR5^h&_!Q7c6BbNC@T}3YBen>BCwu* zkw41GjQ4o?@=CwYaW*ibvtU)RMHky&z7X8P0yXymydTFH{c@a5w zWh~x}y)nbPt21BxJ#aD_`jDZ&V!O=1`8T7bJjmViz}u4`#57z{2*Ycj>GpcyShe`Ac;oHLc!>VeX9t=_T`$d zE9?S(R81}g4cB}R+5!%`5Ow)BIqY)ZJhnC*{I1(XM4yR#o7Q*{mI<^Z2?wU0U-js+#d~n)C_2K zqW5KGd}p>{B-nBoU8Rp5$POt9&FJ-TgVPQcoX_U7I!1w{SoQYIH`IL(j^J48 z)uJNnG2<*qai_pCu3%+9LUlKdF0y{c?8E9^I{YT&yaLjMJKS(@yjW(eL^~dJb`gqp z$J|e2+%I7mY)>8-G!izJ&dM4MsEf`aV#BeP{zqXjmS+5)Ev>A!i$auJNK5D+O8h)* zQ$g5wHi~5;VEyaKZ*#pXE4F6@qOz9^agBKK^`&P`5{I$J4L*&}Aj2ujE15SVJLL!l zn**0Ems2l4Cl8lG=7wX6pnJ)t53-+s0d$LX)?UMx;Xi7x*$hYC`2g7^GjVmAjull9 z>sHAs>)XP;sH8*Ghh``zwoX%Zy4YYy^YlDviiJF%ZFdB6E&%k5Chmd?8 zTbVrbZhytpBArh0o!aPA3)9HxR+~%f197C0&1&XBPs*bJ;kl~LYmW6Y{vU`b7p!OT zzUj^`Fx{2q80pdszCa~?+mPnC-nKqq?nDV0G{}z_NKWk^Q-z7TX{w7?vD)^m*w$qj zMLHEtSbR)|H(3Iug{@`Pz^|1EtdnU+jlSK$*LYn2(BP_r%RI^j>k-+^fL@QaX{l~m zFmQz+>kZ4Vv7eDchUuDE-_)_*9GLCUwBJPR`ZE_3pOtv*swgTKik&Ne*w)vqB+;|P zDW$z&WRDJzxtMk}ukcR9yMUSEkFRQY$Sde%J;3Wm^z;6j;r-yXFna^x+dMbyH1t13 z@<*TbP2%}M@ey_W_nH#e;Hc1ui=V!zjC_wd0b%otsVC|^FzfUJf66nrq}Kt9;5>$L zbN&^-#z>bC+l-e;k4IFSxDPtigt7EouRKhBP?~U>s?Fk4f*n_{(KlSpXW*HfFXGf> zFULm#pFUHw9~S+oK`=Q@8tDQv*JvAr#z2R4TZOL)QnRX7%t)b6GUM1Wy;WxWejg~hBybM`u_i{EX7Y+e|{wV#1J;+&CB2iKh_vLnE zHmjslL!Y{bScXFC@Z-74Y}qY9IqMgVCtZ*goZIegn{Sb7hOwL1RvX>GB!R9_k4?hm z`8h7aJ<~N}FLs``%bC)wWYQCk9C*`o)Y6YtJCYbpEru6mn(og;KZV)RkEV1s833Xy zb^CL*u}`w8!d&wXcN}(QUgeQ3ugIq|dP`{=8ckBFOPXidh9UP%^`Jf*IWNMSZO2leok`+>Py+C1vLbauDDO78Vy&vMps z{iS4|w|C#NC)e0$;U;IbYJ%+kIAgqeBIs3W>)Uvw9NkbCp!^&L`ZE#=-C>#zOP`_- z8~f3I7Vh3VXDl>pQsya=uRGnoOod9RcpFTsy=b-%0{VK+FluIBthWxpw%GO1K7aBW zg13Or&uuG33$TMt$VKYO^1J?@n|-^=i)HTD1Qdh1>=5t>-WiP$f2eDAIxi z5+}}kgKKF8WIT4$voF)|S#qcCM^zUN4$@$dGzHB4;*YDOv82aXR;xHIPV;U}XJ2ZG z{-yTi#{_ZT*1!hhbR=V2>g-A19HZ-JjF1`e!hzrk6@Ea;#L7CAp-lCgzm+p{pb{F% z%eu|y7Mx_JY3&ouG%vC z^Ts3j%a6Tal)?EjGJmpp>)f`oKXxvQLKNh6ITt&s(aAqe@hi`1N}!hL#*{~it*?L; z7T-7!ZKj3w7}(k~X6_{yj;)RZ_zEA1^{51)r{5e1VCo% zffcO9bC2mi1TVIi=%r4(n(odnK>XKg%NDL?EV*n#iOM)l8cCkE6@rUqKa5O2g8gc5 z&o0o@l=)1rr>6?r&@vOeR7v0D;s1SDxB50RL*_pp6Sl_zn=$E5kds^s+tPm4Lh9*|NB{efT%Uw=1~T98+Dx^2H6%w4Mq(1$|VV z>ELyp6{!$H_;WUb%iBr-DXU`BM_)DyUe@GPqvMzScIVGvcF|kxLN93h8oh=NzFBuE z_%-NIcO}Kvvl(>My&TaUbDZdt6EN-q1mMSc4x}sVCITZ1pj7pVDKGp)E6rN~mS}Q{OvRWCObZ-guQ= zC@<+jj#X8+cJF^RUJaDx1ur|+U?Od^MO+Y}&^0=W`!be#)Y;~Icpy&H14Nng%zvu) zh5PG4CgTrhWzycIIM3HEs39ew;7!WO&+nBo*Olz06*GO7D;^)#c~2 z1M^@Ohn#vCCzU0>u@ygwM=B3YW$;b1)trgZvoL9|jJeKdh$4*qDtx34z$%q(YG@DO zP3eA0m~nPOvzD00!v~E0WKXjCUxLN?Sue?`h*N$gNlKxU3kw!gKtD}igpsC;re@V_ zA~+o$`sQzCSQn9q8=K!cp$d8PBsA{Ux;^44UI;S$aLnxKY1+83h^oXij2V*RfR**= zQ97=hhn~DcO87XXPzUgPKWpou8pU$rl*<^$9jHhoJZ>Br5#Cc!rr_Sk(q#C`L^bJgVQf-O2#>mmJEoJ8FzJ+8#z z<%1=?@j&PSWD>jLq3ZKdaPm}Ge}p%RcAx>I&YU8dC-5j$Hc2KE^{4ZDQNP z@UiF+38-dAG^-U3^Ey{Fx-8k)06q-1hjC3xL}k(k3;q@|bSgd|f$7wm9Q`?tzC?ar zu3}>n3NQ4s(k7St`$S`=#h&~|i5~qT-bX9<6aqQKqR2)kwTOVNqCrN(YvyBjgTR5+ zOstEMSUEipU58H|{k0Fm4GVxQ*T5{?^~GpNdKwOWLD+VLdK?=hCb(*ZZuwmPj1_&^ z@@SV)b?m)BCvVI$mxi|xr8$Fs^wS5yz%^=t)YxoX)Drlo_$xYB%~*tYyo^%msi(4k z*b{uxMJ{^`KETcRS!I)sXGbS&aInWY6z!SkK=0B%gM9;sQqY>Y)XWT)%K>idcbZ{4 z>9oFYXlru(IO2WTk3zu`!LgOcUUu~L$-bURm1X!I(R)-*aC;B4{*IQH z^tZl?pS_zlfB{wXh4 zmb|#UR}Nr4J6Aaj*MR(P6E4Xq*e^il2X6$e*c$ouWoOO;mI!M>4)KDFk5E4i*OT}{ zqix6$xv_=I!{~y73x{)~NA~B>Y!0(Mr%v+PLX$ZiFv6N!T7n4`NNk$v4mQI@5Txdo zHK137+$EPk-L88lkVd`YX}wj6gS{UN{tl>Hx@#D_{6~}L^l$CnOEQPL#9FekNG?VD z)sZ3KSIMl80aJ*1jWv^v2V^oKfIiYyl^dpl4bbfpm`8QG+256<#(6Gh0sGGV& z;d+n-Kd)1_q_NREzL!Sz59gU2YQ+I&-z+7Vs8pJ9NcilwhlfT)fR{6R=Kz3kv7r^jqr%laYO9;R2eKW5IthVleHR3{UuiAek)Bc2kj_L3mQ^a z?c4Atl*oK@!ltGHu8TJ%<~p9IjiVn-f0<2eHiOkE8A64Z4U`n+A}svvs=3obQFITe z8<@W|Ax`3NaC_b7)Rk5E#f0vaTKflaHxC@KYgnQE^VV=Ze~E6$9J7n) zGH5&>3c36RQ^)s#mlF`MmK-?twEmWFb4d>)#Zap1OrSPPxfxA1vMR>d%-i0T*Y7gS zx$Rg%hB*p@MA;w-$?c7U{KL4m^&U3zTex25Gt1L>6MFnoTfkVnp!8E-5k=v<2=+?Q zXqJ2j*A&Cy4hGY2@pWCyA*$rbysvJrOwlqZ;bGf0Bu>RGq4cH-xzjA+tnE$hf94U9 zl~@_>a6KDjVw9aIv!jk~k3wm0%T!|jJkmf&*DuUK(?0#+PR3Wt(R&_-EwS_`z zM_DeshO&>?y~{{-PT?@a1hsTlyZze|IR}55F1unyKaQ%TPls%0doYHB`5BR}I`OxE zB^QT}%;~%eYfnP~GQi4~$!`IZX#pje+VF4@-pHdUj9e;HHzKwK+TSa<;`DQsE!ec2YCI|%me86_HDcO2)$c0{)-5CFXJ)TYuavwy zB?vHK^ectn1^CLbKJQS2#&mRhxALpgvz0_62NV7*y`Jh|y?)E z$w-&>zUSyMmz_40?QxZXgL|yfmpJxy<6Z%*kpi-YsJw{m_hZ$RGTwz}`r9pD*Se7icUxK|540&d7z6~!D8Y05ND)j+_B?rNq%3wm z2p7u|w6)y^gJoLE?kzUVUi{vGp_lj<#E;hhl;;JuYC3qFUe^-ynO_uauL#Kr>6o=6 zQjeK2K=yxxKyYPq3YU7Yk`pHwx#L7gxlnLsw)xzR{vT$`%Rilx;8YJKOB7vPRX;#At`g;04)FY6}8lOL}5(FhJrH3q8oS!cL2si9GwM!*~ zi9i#mTMMJc1O2tPG$=cBo<{m+cQi^kirvyR=1+v_;XP3Y_r!pvuu2Z2<2An7qgW*(dOre%RjG)#KVr(u;Mvt=?FTG?dR1WESSCK}oU za^SR|tVI$`T}I{lgo(($dQXvSmvdC2h-1<`z=Laz-X>#U$HUwlp&V=EJOA^VLVWj zU2>ybWE$ z$LMwstDN}umfGtk~ykV)C69xlhq~hzA~xbQ|&x9PGMAQOFGmXOV>C{6n+p zBQ?T#DeLRF(qq-xyOy=PD3K&pS%c1j?idR$n~nEr4ARZNl^F6)fUG#9$W?apS-3cI zw$XZNv14Zs_Nqb*aH@kN2lS&c))u0|Js&l6tV`Kn2#w9+XI-87hi40|OZ+2}9PBn! zkgOBFQy##zh+U^(RK-oG?Ck0e9cxGW5W51R??=mw_y`(I;VcB>6;*eQwd0TPkhgnN zue}n8hN?D2NRQopG!bCeDE)03Oz?pW8y%N7IHXfG>25UD2(=7Ssf{*X{LHeVUq9ME zc{QvyTnkoZmfW;xG~8)`;;*CPujGOkLOYNSMEo)YulKiu%)tA&1p4#(Ri0)iE__j*By!Plh~eZn575)M?ot% zvlav$Uh+GVVos$pn*V;^NOO7#y7QMk$@=y^0kmb4&4d8N@Da$T>7+$uIbVPltL!h? zBe$)T_UlN4KF%Ymln!ka?aYTSdQR!B?Q{n8XTL#@4Uh7wi~Mn-VEhpFB5)$2n<1FW zQ-9keF(PUH79>HEONpLCpz)l0S&_J{RJef9sZK8k)Qb@PkzTevW09ZrESG# z@6aBkuPWFX7#NSCZoi0c?T;1x3>c9^&IUL^ro4WF4UD4fz(GMebP{l)1GRUZ8eDVr zL4=u`!l%PmTlSDa{a6)NY{WZ0i8!*PdwAl`)ry_VJ*fC$sDKYzQV$y`tCQhglNA-5)XU@K2<*m81&ePlR;(m+0b-Tfn8P z6>ai9#Nw0cY)WUdK{Mx7x8^s0tR+v4)8Xjb+@L8hqOx97hPuK?NRXSR=Y4(2spHE@ zecCeAPb@h}oep@Fy!ip(X3vsMr2g%d?z|I(MwBZwAO%(MKy0;i*r;?p0hrrT0PT-z z%Eq(vKbW+=>a|8xrU)A)*NumBCa+$lUJlRB*)cSau@T$325%Ht~AZ@?Z>l%9pI!} zMt7=Aii+612xE1Gk0yejn~V1c_r}&~YMtxfNb43d@!>_lS zAcyP~@U?gKdtPW@1cf$R0?c9hes+R~?5-m{2~TG4D)L;}Ii;p8fpGYE%#4>{2rwrG3{kSQ^E9JJHhAEC|Fm=~K{P21oP%-R zxdg6*Z7f;GX-HX`HKyv2)D>RJt?^-VE=hJ-X&UhPMNG(F*Z1K$LIbyS=z0BafBN|| zQ~fn_XVoLkYe~sXfEM+bdsARU67^8FpvMShII6x}hy|{K?G6?5^?c z9cHPai=H)1+LBjDeosBYtA*st3j4)weZd@`z@}Yy0M$ZdV}`9&YmQ#siMb9)v%AOw z%c}o8`dKOg5B#lWCNEU|@`bWw&+%D2;22GW#{~hi;BnsjQq=#nlQyR8cmdT4dI*Ub z%k!2zy^qJYuSW}u|50M#!;^krc@De!zg(yP`zt~V4{-lxP*rhUlQR(H^507Z<`8G` z4+ldYJ+WLPOLHE~T91GAwiy?If3-tKLh`-C2hcb66%e20G!Nj}DT|0CZ^1+V)xauq zR(Tard?)W#Jy(`*ar2FuN88k(gTv0V_|Kwj;5!YK!N_!JsX;CBZhb()|iB zlt|kl~=O2>1?Qe7M0Vd71?B=y^l^ zoyPvZg{X3H=AI}N3haw&D1!o1rD8^1hp0pie6f9|Hdn_=mth1pXoL|91o&V`E(JUdtu9ji$|i>_Mj3NLg$g z@gyRe6HJ%cp&)Zr@ui*PUT{w~{^v^N|0E6m&l3{={^LIc{vq%Wfqw}6e~rM~*!%IZ zRx(FEmS7X>)v)`&E5Y6D?=0XY*KmE27ut_&gBv zgUaxroX`8@xz3-1AW@2~eXttCx3+7K{?_D{`xHNao59IdedkZm;giS@-wT|X?t%VR zo$C3V6|4V|xA(vD^ZPc;x?WFX^DGLepWS)g^rmPZoQ?ayLaF0E<^lpG}mDnWd8uru z^q*(YNqoc<-5K*8`PFL~Ao`8lgZ=9G%(*liG_=okpWD)fOsS?)Lu<`p{u_00NrOSh zroa@&^TwhV=g(sYCq}tjd=wYe&s8jSZ~A8r5_cNvWu?3OztkRXba=Lnrcq6&X`5)ca5 z34-T$Sy=lCokKYbGjg*s^E)hUnRw`*j`Z3P_sg1q#<^KpIhO$fRV;BHa&dvc_aDCe zD|s_BU?8=!iW%~z^?FA-(PF(n^HJR@_Tb`t@2mL2`DW@;mQbL$*nG5B;Ocjo4SeOC zv-2kBv;Eb$SC!WhVaeXzR~Fi2J4)3h6ZuAx^xK*ug&>&uE#v zoJPCs5?TxFLca<0Fj}HRq$N3NZzjixv>sOQ1nfpnK~_imiw5^-$6Yo~t^WG$-wBAl zm`iWI2v|5eYfbgKcmHwT$<>h(R#!LoY=Z1UYYQ7|{LSk-1&kSZG-TEdT?0KY(;A2s zpCM*_6jEHcdIvwVZ{^FMQ0s7HTHwM&E*bCWnyKvDNtLA_m^ zoA|Cn?9&&0<^6(;%t`RRU#yut8r|_udhz1v!G|PJ2h%I>d>%)OY;B#fvu~~LP;u(` zJs1t=?wtKp4Ek7H$x;9KbtE^8HN)+}J&Rz4#?4V<*WqII78NG@vAOvz(eRM~5CeHd z)(dvfo)&*ND=Pj(N6*^gF*r|(4aHlT(PUntm8OfjACZ(=3Tp{|2i`BV0!46FA#)uv z826;T*fWeRCw$StUopw^z58>24+0k0I3_ej55~ji*JK9Bmd8`9pcmr^PCeVimNFE$HyX#bZ9j76KVAfLmcMi5) zzjY^NRsStv9+0l}^T`pp2&HOFMDlan0l7K>)j?$8*2dl`g%RCjS2R^rfGHdalDl5X zzusQY(eAW4&q`Y;vjN*P-FbiB_RR(KNyG5@zC~ud;&+<4&q0 z*q=4d(-HH=ug+mv*@{+5+w zdOm1_KSQD7_SGo9>ABttyZ48!KDMyhv7mbzWCD<^uTNU z-jQryw7e&l>%F*O(nTBcJqPL+38HcX zqhG++-)l{eF0R|YyrKYl=_KUMZK=wh{ie7}@*TBmoVBuLq`9=+BSz*Tn$JfXj(q{4 z891MI*xMNHo#IGl@f>R1^@pA+{cTA-(>(Z7`lEs?Dz4iS&nvwXT|)V<9F+(^sUN9- z_UF2t(I2Dq-)c^cynlP?#qPb))BEwA(#S#KOSCN6>2pu>Jss}bUw0MV3^m<&3&iLi zq+z>ex8>PICp4FDoWDIOKniW$+aU9DZ%*U<6p!AV%Gy2YuLm1mIfT)cO+_gkoE%%d zRQpch2oY-#t%Ob;U0wFsgsEBjAY`atJG8WT201IvM`qqf-Bo!jTl@aeCG)-j*(#k1 zE{nf%fB^CHLw(Lx5|732?y$O}7hHRaEEiVV&SDDr$R|c?p?4Xfn)&~TyycV^)fD$ea)jz0mC{eRPDbCfF2+cbCwZKu(>Uj|`}-)KK3BRL%pCu!8!AM}7CNOKNvrM}VmGwf{J6|ntuBrBVh zF}vM*iBBgb2x!o9b!;g3GIIDyC+iLH{TJRpE2~mL*_KN?hQ^jx*X1pLR+b3zAoG8b z%m?RuDU#*?l`qhnSA;v**}&rtRt2V?tik8qtR@l*%m1n<24u-5^EWA*UYSI@D6fvK zyx|eaeUQgq-_BU3vGIrPw5(1A>ucmudw!APr?i;#Vu3@&$!C}2w8r;R|9AQB*ISlu z+j;BjBjoRUdTSxJr0KzEhbfM?90B?zUqC%2KORk=&lW^?h$o0Hm<(R`&HG_GY*Bd? zIUN&J!;bTEGfqCNiD0&W5C^W6eC+h;pq46c`a&p7l}q50%avD8k;rU;6_~Va{WV7= zYVezr{CCgpgv5Lj+fCU5;@W;CJQC~wC3f` zP}4xB&o7+`!!xs-Ljw^M!C3wm?_Pj!_Ht?q@7!4==~X!368Op*mg~O*x!~v5v*Pz= zpw?wGNNaAs`h(khanS71B&TRzT-5F1L_JxwcA8|3>CibtS}Et)@2*uh=-l>1$!fQo z!GZI7S*6oe%cJyXnnR9sC!Es}FPi4jn-eh2A=d}ZCHSiKK*6}Vh@IkjbnaH`GvBi2 ziok3r@p}5$)yV>T4|0v39uCWzWm$Hs%Y1__$(LP1lWRMtk6vnP$MA1noh(^2ycL+R zwE@3V{b_BcFA`(pHm39Yw)u^Bmd{0Q6kuYGy~w_K;ToGZF&E|LQ~$kwJ*Os*xP4{Y zWyTGeh^v}T$`tXYzZP=6k1nx>*>&;G?>{EBZ)iTGOb{u|BTC_0QC~;szJb?2=j1S% zPEq}~nyLQg`2123g;p@;gx6)x&0*g1j@Lb4V-1g68(%A=diO;pmbUSl$X42X3HQAJ zv}}t@HrmY%x!aA{-SzTIH?oevKT30(>V9;=`z9i1@wPj8o#I=ro3}GPvI4!Z<`3M- zd$>yTw)y;JJ(iex$v^eaD?u;SNj4sY$nIcn<%aKG!#*f^p93ySB2~DDw6iP_Z_&Sd zc=71ww?mOge*^uX!{IR$FYVt{(DhSm9GG)H=q7YIwVUXy278HzGPUFrJylUfpAxbbuZpMKNGS={5LuH!mu_RFKvaL0rXV+lU5 zhJNmE96u&G>NbXC_9HLqHuS2x0$BaCwhr&v{ODXzXFU6FM ze>{Vc^E~(H73_dU#PuP1=z=ySZLcLXaq+YX-zY86JxtWSnnb5h>og|ZS{d=q_NG7w zwDVcLXhfUk3vHG=s(VR7aY=S^r73IBQbckfVu8l8%0#oF@r@u<&hpR0Gw`tC8e%eY zIeD_D+|w;-?&NibxgF>-J8%giFbmEG1na-P?Qhq)g=RWlO(j zwR4kv*7$zCONs)-)UEN16ho4id?{O}J5UmFD_9qmsMGU0VX`FhT8C2x!(jK7fIjV) zX|I>>MzxsTdHq&7+DFjLBs1@?p41KOQ~=NP;4>5j44EbsZzt%u%Gdqm7*oQKH2&MT zQ+I_{)BcJ*_2ea;c?!0rBfGiH#vv;wiOrb&aIQ&h!hv(pLoYLK{UPu0>ZeK# zMXUT+ZB1W{E<-wlhL23g{tv{B>wUh#_dXfk8f064lxQ!z;TgPdqtaQ8u`}HEW*C|v zSKbbsetTOp?>lFFv*w%jTrH@JTg?^5Cqs2vUnEh^)7L4It@P4FUdz3DnX4A>w#g`= zZ(@|5OY@RbL7p;Dp^`UsL)x*lkcT1I>gCo?h6s%ciu4l-s(JyLkCqZM%kY?iT8O-! zgS{OR_S)&1ClGrVro_7j8R2zJNyR;Mx|!l?X;k~-Y^<`)8`0luE^+IOfy(*2&(cL@*g)7`%VuRa-LL0r@{@d*|R>y5?;(wr$(CZQHhO+jg>J+qRwT z*gJN1?BvVyyyyMZIp>e_&-uQpd#a}ATHR}P&%LT<&0M`&n%yRTmi3CO@$!kAl}36~ zYh@v$9_Iyv<|6uLoQDhh7Zxls4x=tZNpPE0CnJU9KsTFF{aqDd2x3|!P>N*nxxgy}Jm?qPI4_BKg*}=)XAucR~qHZX%7Ei}Q z8D(rg(X7X2J#2!#;mvtZo>uf<8TyjS_p?6g_D#l7S;NCmr^S9ABN-pBPHfSa^W-ea z71?rHFR^cYMnNn=bKu^Kf6(oPZuda{U47}TVJYT!821@!&0BJ*%Ztobi z$U&3F1~p-v;zL&vO_-94N&jAjOuW7}`ueSH1$sIxlvAqOXHAhZkD-F@*BAvdyukao zVQ7I8iCz@v7YcN%(jatzNf!wmdN?f1(;=`b>C}m1;Zs0b7H{?6tCo>gVlE1DW)xsR z3D?+|Q`Wx9nmumiuY~Badn=Ayr)VNjs)1VV7YNfV-Q#wi?TNE_!bc(jFJ|*WjlOOvtL` zEc-4#vgzL{4T2MLXn8P~=6`E-39x0lXVHA93;U<1h#W(hk6|I~|baeNh0$ zGbiW?m+4r0($4|hKR?v5WL-ItB7cAESkwlvplb!_tO+PFq5UbeX-#NCiOFYnsJotT z&ameuo+->^fw7o7q5=k+B23e6U-BAMqic+?cg`9|S<9jzu@MDDj6ZEQ8#9M}zx~_< z?IWNm0U3E;&)+;SdXpm&1&sSGs}colzQ@mOJkNAwd%xzJ287E<56&C zgLjScH}t1gdRB~M6Z8Q~lG993fl{qBd!d8yIFf7ybxj|p{um&pSQ*8Lm9|EN)1KTQ@5BXn2$0wqDreMDZqMd)kwj*LJTfcQZVZjxZEjdo9+{XpjJCQH~!Y1^#ke`>5L9Gdx3u6&y;zaKvG)xMZuHO|1oI_gQKFV4 z3ovTd!Bi;0*Oh_)BB2chjKmC;+C&1KN8vzf1QyL@5;P97+R9Kt!X!(a zKb&0dupSpuVmaH61Jh~Zv|buO!(pNo(6zZJsuSZcOt^rc++E7Up%+Hs=tc(y7(!#W zX4ITDs5vYl>CS?nWUc7j7q95`YnSR26^8`0iT^Ey*oG>=CJ@Z z$wh*biH-tChbz4YM~4;(P9{Hj2tI{?56zxvP`*1n(V={fc_TuD8NRgjy*Y=Xp2SJsV)MyqVq)uGkb+-ia1cMph0tx10k-A<4n zTt|6ZrcL&+i1mxze9&9mtMr?LtwT*cLhTI}0*LyITro=@Jz)};Bh_K>WV(%SBZkd9 z(C?|tM@CgLF(^?2#{}$5xu8dA%W|?XfyERN5sOn{PC&fC$D&xA0NvT?fw9q~Rk z7-8-`H#L|Nh+asPQve%}Fd0PPV^Pl20H0!yV$$%vy7DdC;Atp>`P^x@@8&dGY}vV; z*qH7PH+@((o47#E?cW-1%H+2=tEK@qxT6Mpt46n~)<5{aCfR6U_%te3e5Kk z&?AJo5x~p{WY~fXF2RLV;6f-fBMh+tF)qOkD{vzS&j`e9KnzQ8BM@H+#IOJ}+7Tld z|D3e|Gp@i4N0K1K?>fH+tOh~@X6SA@)1P9Bo3B>FgaX*$v*};AcJL-&%yZtpbAy(R z2b6JD%D1TgvZ~-4spR{u=v!LzCL{fbsrIOiyKLX0+PAFqiB_d0?h<Cl_7a3<(PRlO#8!Aw=Is%mA@3ORR`$-HYSms3A{8C935nP35w zxr$Ef*hp10eVSUsWuiMs1U;sz(<0MY^#`vsSRgHeLegcZI4?B4R#A1CNC^^6m!Xt! z8Azy%PUBQmUDyy?T4E|BTZzbGBCe#;+6>Rq;#(SiQ&2t@E&xVvIuu8Q$qJ@#+LIjc z$Yd2wI0Y*-QAC9C3QQO_e9pHqjsgsLTUPS->)Hf92W-TGF%3h->M)#WC&FNH_Alo& zaSN}ITtK{uEoK4t3HD&ubRT93b~iW=66Ps@ zZPIL*72U=Og6%cK1Bp7f_{z$*&TFMlursk$`%F}@Q@Tup`s*Y}u(MG)uy~VM^!%}6)bGHA0W;QRHfS` zJ%CcvWvV4uUUP*c&eT?&IZu)Vji$>~NwBzV1esy$7HVl^rfu0HFpshw7-KSrdVDxY z;umGGh?5@8LhdonRQ=Cg(fBtwp6bh53@dK6#~&bY?8Re6C` zclML9dK0~YSiIG~$sO#f6ROv;nobklfh5K=+0$Ku+F?oI!N?Y^wpmSyTza*Wlawdk z6BB`VxEF^eVsKckNd-UXao2Iq!J_+#-Kky~)F?5j!6~=g@!8M==F<&)_NU+Tm7(|h zYWyyHTaUrn6Wul2`|hTXrf=dj`I|o%{AT)2{Bzn<#aveRK@>ECT5c1vGmlRkd-1i;1uO?rYVec!~svwvRG;n^?R83CSn=ntDO znS+?CX^vH)FoTRgEYJYh$VFqTV90XEl3p0Fn#hyU)9AgaDVmssC*ZCx5%KwjP_s1L z1$icxg3pj1PXSO(UQiN%#RaIV5p8MW-)b(05Sj?O9>N9RV(wvMX3YW|<4W`4dMl}C zP2!oGrXotQoo(a=w!1Pq7A%3zTb1iI#`IJ`j+`I3^tkRUjQOC1VF@(C?JF z$Mg;-V9?K$x-W1f*}nqEy$Fy455|U1fshD~5;g%IC42}RYIqm;XYbX3;68B0ath~w zN*QKU%|cL68u9H7rP|kbI4?-E{`he{?nX;c0%JomQj7yBj7=$MBe-HXKN0Co9=LW> zlXN}GijvvF!8vnaaB~_4W6Qy;{_hGibQoI!B-&~m*^wT3l>)CeSoAEF3V!-PVH4Ey zCaH#qTFvo9n%v=-6Kbh4?F{;JE$*&+8QivETny?}Cin)dwWVHtuvgWPp*O^SKzWE#ek3SdLq8%K$0(3|eZMjdLnE1s6F{I@nXW-#xl%tnLg>NTY$68^ zRqkcE3P@b8aUf`+64taWip|;nVuy?3gvpqsL0~&I81fcqFyx0<+UG#0%Npm15C3Qd za}yuDQWWu!O`dU8{zQ(uqX~r#x{jdnu|<}>yXt(gw>feaVoX?Gp^Uskp6{Mc=I=Ie z@nFMy%9a+Bbq?5=HZPNP3s{($loCd7;kHthIiWYXpwG9*&51Kf=9Sj8H*+ZzO(}6H z7W*cxVv5=PY^Y}vCWjBPvP%YvnuRO_1O7x{u};;q!}~=jpiV~$B1oU1waAtihKSl8 zOi3xIa2nom1WZ*Cspyon0ZWwj#G7L5HacJX&V6g>toiEb65!Wp$Qp`J50>mlAiiX3 zXQkn6YMY=kTzU?6CkvBE2@W84M@f4{&=D7a!UQK2BE$LL)7jdwDGa!7kl# zeFUm3JA|8%i-=o$C!oBvTBgZ1Vx`*qDdCvx?Az)A4vGp*1L)3`{a(C|4e0_>2Ft+LGK2E)&%%TT$eFQR{gMF#9ZR zxq~bBF8FeesqW_)EEt}^jN8Z$WUbPhcfB3mufz3tx$abz1bhkW=fxS8gwxE|EThU` znDp?C!lfeLp14iPBe{qq#` zNT^KReAl)6ZG#84=n2(YPdJ%_-BM4`?&1SJR3glYL5JHi;6O}b7c-nI;P@8GC9g#F z8|sL1PJw2DYHAq@4xmS<9=#4Hcl+^H?q@3%*)^57agP+=r_mi~rxY&GVcrF`1}b;bDk36B7%N@9>i@uvf%ulbT+9Nk?@+V`U(aKIH@?BXy5| zOE3hG^tEm_c>rey?otl{9L^@8G)tTIxj>8Rd_hj7xp>k2i*Twf{-?b7DQbU8vmD%KeafiQv^u3_~B zZea|>2IO1n?D%F9{KRY@ zIrLxInB8g^R8GogY%J#GvopslQOpscOBFD!c!x1H;FfyS(hICtb^A*Wi6vVPl}FOL z(nU@e_2Z7P-PpZO>s^Va;Wh*Gvcf6W*CLz#8$9qR&Wd=}Ub@qIpp2S9E?$^m#Z`jD zS|Y@o+O&(0Ei=CAail#y_YQR6DfC(F+2~ZN^(L!92bzniz+5!zsP_tKstP%s?B2<` z_h6=)NZd22$Efa}1i3QUBFyHFn0li3oQ)16Jhzo@v*{~se>RDK;|vicJG|{Ib~T?S z9qc#nLXxG5Nn6FjEn(GEv1%(>yXCLg=w8*6whX~7!D*{whv4b0R&bHxy-Pz#ooecvEV_AxiX{&0tlXcDb+abX*9UCcS)~$Z6Fkf!KppdJ zShcgjjxFavFO`lmpvUq?H-%)X3&;YM8Wt1RtF;#k4uCdeT6W`_=AX?j*CrAjp_+zr z>SSYWn+;uM*R&Ty2E-ixBkQ})tgbH@K+sp$wCX*?4~9jNyQF|MQN-oWmdU8P2hAb| zkcTntO;W;yo?Xzu=blFinfJ;>pvBKUXLs%Fg4xfGegp1jaXZg_;~cqVk=;BSP!jov zMo%}Zb1?B`93*p25bt^#1Bf5G0Lx|4hc$pmk7bG>v%8)gZX24w$jPCYfiQ~{*mpqp z0!_Te%y`QUwu1Fc&omQhtn^|pYI$81&*G0G>uQ|M?hspiV~F*lirmXsgd1~+YN1L3 z1G@yGy;p_mD@4Fz3}LnnGmc&8ag8~5diq?MSM_12 z21vPr6PRH*UK?w~JupE63aZ)MJn@?=D-9HD7QYO}o+tLRYtvt^(ilFNaqHXV^@)D!d!pZb|83FV=@2Gg zCsAwZ9SzD~Nu8WDNY3ky7_u@*Hl0JavCaSJ&Cn<@c58C~ zH@x;dq{#P3pUw7E?r1{|fwv#kN#p&_j_sYo9mpOUik}0*7i1~0li$g;3)HrK`hwzS zW3ID{AIX({|Ax%=&>C0bo!HAtSBvaoX~Z?zIi(fUvzrsw%vJ7$3zkx_t?ucmSF}b< z?oyn#0ly33-8|apUJIDFL6F?)`AS8l!$8Zpg~VOSyW&)>(q60zKO|Y?&;6IEBtCFU zT|DMtE2`ITguGysrQY7L&8-b}U)u*W#6dI%jrX^_&1aX@FQD4^pbb^`KYm6{CWyCh z3-Ko_qI8Tz>Dy5@C7!aPwYkl?ifEF8S5d{)b=oyXR&#vwm?5c6_58nni?a*=@> zy#>)_5PdJgi41&{5a6!2!DpZT&=x|Q%d@pR@nWsZR_7*a2d9$Il8ec6v`BKJe7q}d z@14?X-S_2Jo_Mh;m0>;__?*I@Hz zh%ibr{SGL9S}FocRh2|Eacv7*2-<_xCoRStlt+#?)6F^zeR$>qRn1ep`KuX3S-$>v zMO`vrkBg0$nN z979n%D)%^Pd@|v5PH*II>4K{$S)LK!FA~T6wKuv|+2WJ;(%|PVrgIXc3Dm!a6e)Km zQba|YC(`N(ulk1zP-3FyQ=K+WnKRDV$?uXZ#RCXsu@~aO$gbFN^t+b7Hr03*p9qMD zS}&=~Vm%xR?G7B9I$m|Xv3P0m7lDL+<*dYm8J@ABbZr?~)o@5mjl}R-mEnU+{kA2z zZrzZp?;Y72GiybFn*8lZgJ-{ifrVlhYbHwLTbH_$eCvV@lN1)WIUA4Xh1V_d+m_N-0 zxAql3o4c)BR%5TxcGB`OPj1*ji*r?v-INt{q216z&$3>dX$z=g+bu`H&#BQ*;jp#> zi>Bp-&;s158H-L>kySPCe-&}Z3ax+iCaj$E?1C3Mei|FMV9K@?oQ_-7Jyy2{xKsCd z{}(S>NL|*u(6j}-QS+u&jox0V?xk>2qvHeM6M|n$mdSomJ&`d>tg{K zXbk-@XTc3Os_U~7LjtG~`vFmR?2rktZQmadDL#ezEjwdI?yrtTzZYUVSL#!<(R6p4 zEdHd07L&a&N6Rr0kTN@z72dGb$WW)4Si1s&XL#D0@3+(<|J^(T;gB6GI4wq=&vxPM z&$$3B)mgoA0m>$_Xq2oXSGs7|7)x zQ36g(&vQY1Ng#RSR3vo6`mhm!xt86YDfR)Jh=6sF�(6skk#e&%L9^$bC`0zI>XX*5lgH(QHlx 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