From 72709b9b424a9a03acc047a2206744ac189c2f43 Mon Sep 17 00:00:00 2001 From: pvvx Date: Mon, 26 Sep 2016 17:55:41 +0300 Subject: [PATCH] Initial commit --- .cproject | 359 ++ .gitignore | 5 + .project | 27 + ...ilg.gnuarmeclipse.managedbuild.cross.prefs | 3 + .settings/language.settings.xml | 25 + .settings/org.eclipse.cdt.codan.core.prefs | 67 + .settings/org.eclipse.cdt.core.prefs | 29 + .settings/org.eclipse.core.resources.prefs | 2 + JLink-RTL00ConsoleROM.bat | 3 + JLink-RdFullFlash.bat | 3 + JLink-Reset.bat | 3 + JLink-RunRAM.bat | 3 + JLinkGDB-RdFullFlash.bat | 6 + JLinkGDB-RunRAM.bat | 16 + JLinkGDB-WrFlash.bat | 6 + LICENSE | 36 + Makefile | 78 + README.md | 42 + flasher/RTL00ConsoleROM.JLinkScript | 6 + flasher/RTL00Console_ROM.bin | Bin 0 -> 600 bytes flasher/RTL_FFlash.JLinkScript | 17 + flasher/RTL_Reset.JLinkScript | 5 + flasher/RTL_RunRAM.JLinkScript | 6 + flasher/ameba1.cfg | 124 + flasher/cortex.ocd | 89 + flasher/gdb_flasher.jlink | 200 + flasher/gdb_init.jlink | 9 + flasher/gdb_rdflash.jlink | 16 + flasher/gdb_run_ram.jlink | 11 + flasher/gdb_wrflash.jlink | 160 + flasher/openocd/Check_Jtag.sh | 77 + flasher/openocd/SetupGDB_NORMAL.sh | 20 + flasher/openocd/ram_all.bin | Bin 0 -> 325680 bytes flasher/openocd/rtl_gdb_debug.txt | 57 + flasher/openocd/rtl_gdb_debug_jlink.txt | 58 + flasher/openocd/rtl_gdb_debug_openocd.txt | 57 + flasher/openocd/rtl_gdb_flash_write.txt | 199 + flasher/openocd/rtl_gdb_flash_write_jlink.txt | 199 + .../openocd/rtl_gdb_flash_write_openocd.txt | 198 + flasher/openocd/rtl_gdb_ramdebug.txt | 113 + flasher/openocd/rtl_gdb_ramdebug_jlink.txt | 112 + flasher/openocd/rtl_gdb_ramdebug_openocd.txt | 59 + flasher/openocd/target_NORMAL.axf | Bin 0 -> 1764234 bytes flasher/openocd/target_NORMALB.axf | Bin 0 -> 1764234 bytes flasher/openocd/target_NORMALC.axf | Bin 0 -> 1626794 bytes flasher/rtl8710.ocd | 336 ++ flasher/rtl8710_flasher.bin | Bin 0 -> 968 bytes lib/basic_types.h | 501 +++ lib/cpu/cortex/core_cm3.h | 1661 ++++++++ lib/cpu/cortex/core_cmFunc.h | 636 +++ lib/cpu/cortex/core_cmInstr.h | 688 ++++ lib/cpu/cortex/cortex.c | 1069 +++++ lib/cpu/cortex/cortex.h | 79 + lib/cpu/cortex/cortex.ocd | 14 + lib/cpu/rtl8710/export-rom_v03.txt | 737 ++++ lib/cpu/rtl8710/rtl8710.h | 13 + lib/cpu/rtl8710/rtl8710.ld | 85 + lib/cpu/rtl8710/rtl8710.ocd | 332 ++ lib/cpu/rtl8710/rtl8710_gpio.h | 37 + lib/cpu/rtl8710/rtl8710_int.h | 53 + lib/cpu/rtl8710/rtl8710_log_uart.h | 76 + lib/cpu/rtl8710/rtl8710_peri_on.h | 128 + lib/cpu/rtl8710/rtl8710_spi.h | 100 + lib/cpu/rtl8710/rtl8710_sys.h | 106 + lib/cpu/rtl8710/rtl8710_timer.h | 35 + lib/fwlib/hal_adc.h | 319 ++ lib/fwlib/hal_api.h | 126 + lib/fwlib/hal_common.h | 17 + lib/fwlib/hal_crypto.h | 213 + lib/fwlib/hal_dac.h | 313 ++ lib/fwlib/hal_diag.h | 107 + lib/fwlib/hal_efuse.h | 22 + lib/fwlib/hal_gdma.h | 141 + lib/fwlib/hal_gpio.h | 236 ++ lib/fwlib/hal_i2c.h | 585 +++ lib/fwlib/hal_i2s.h | 347 ++ lib/fwlib/hal_irqn.h | 112 + lib/fwlib/hal_mii.h | 118 + lib/fwlib/hal_misc.h | 30 + lib/fwlib/hal_nfc.h | 22 + lib/fwlib/hal_pcm.h | 104 + lib/fwlib/hal_peri_on.h | 451 +++ lib/fwlib/hal_pinmux.h | 64 + lib/fwlib/hal_platform.h | 102 + lib/fwlib/hal_pwm.h | 57 + lib/fwlib/hal_sdio.h | 252 ++ lib/fwlib/hal_sdr_controller.h | 188 + lib/fwlib/hal_soc_ps_monitor.h | 278 ++ lib/fwlib/hal_spi_flash.h | 254 ++ lib/fwlib/hal_ssi.h | 309 ++ lib/fwlib/hal_timer.h | 58 + lib/fwlib/hal_uart.h | 204 + lib/fwlib/hal_usb.h | 15 + lib/fwlib/hal_util.h | 252 ++ lib/fwlib/hal_vector_table.h | 53 + .../usb_otg/include/Rtl8195a_otg_zero.h | 35 + lib/fwlib/ram_lib/usb_otg/include/cdc.h | 211 + lib/fwlib/ram_lib/usb_otg/include/dwc_list.h | 594 +++ lib/fwlib/ram_lib/usb_otg/include/dwc_os.h | 1098 ++++++ .../ram_lib/usb_otg/include/dwc_otg_adp.h | 82 + .../ram_lib/usb_otg/include/dwc_otg_attr.h | 85 + .../ram_lib/usb_otg/include/dwc_otg_cil.h | 1499 +++++++ .../ram_lib/usb_otg/include/dwc_otg_common.h | 82 + .../ram_lib/usb_otg/include/dwc_otg_core_if.h | 746 ++++ .../ram_lib/usb_otg/include/dwc_otg_dbg.h | 115 + .../ram_lib/usb_otg/include/dwc_otg_driver.h | 115 + .../ram_lib/usb_otg/include/dwc_otg_hcd.h | 804 ++++ .../ram_lib/usb_otg/include/dwc_otg_hcd_if.h | 412 ++ .../ram_lib/usb_otg/include/dwc_otg_os_dep.h | 5 + .../ram_lib/usb_otg/include/dwc_otg_pcd.h | 268 ++ .../ram_lib/usb_otg/include/dwc_otg_pcd_if.h | 366 ++ .../ram_lib/usb_otg/include/dwc_otg_regs.h | 2560 ++++++++++++ lib/fwlib/ram_lib/usb_otg/include/errno.h | 149 + lib/fwlib/ram_lib/usb_otg/include/hal_otg.h | 21 + lib/fwlib/ram_lib/usb_otg/include/hcd.h | 164 + .../ram_lib/usb_otg/include/rtl8195a_otg.h | 99 + lib/fwlib/ram_lib/usb_otg/include/usb.h | 2108 ++++++++++ lib/fwlib/ram_lib/usb_otg/include/usb_ch9.h | 562 +++ lib/fwlib/ram_lib/usb_otg/include/usb_defs.h | 378 ++ .../ram_lib/usb_otg/include/usb_gadget.h | 960 +++++ .../ram_lib/usb_otg/include/usb_ulinker.h | 74 + .../wlan_ram_map/rom/rom_wlan_ram_map.h | 9 + lib/fwlib/rtl8195a/rtl8195a.h | 157 + lib/fwlib/rtl8195a/rtl8195a_adc.h | 350 ++ lib/fwlib/rtl8195a/rtl8195a_dac.h | 294 ++ lib/fwlib/rtl8195a/rtl8195a_gdma.h | 522 +++ lib/fwlib/rtl8195a/rtl8195a_gpio.h | 352 ++ lib/fwlib/rtl8195a/rtl8195a_i2c.h | 851 ++++ lib/fwlib/rtl8195a/rtl8195a_i2s.h | 617 +++ lib/fwlib/rtl8195a/rtl8195a_mii.h | 674 ++++ lib/fwlib/rtl8195a/rtl8195a_nfc.h | 153 + lib/fwlib/rtl8195a/rtl8195a_pcm.h | 449 +++ lib/fwlib/rtl8195a/rtl8195a_peri_on.h | 1251 ++++++ lib/fwlib/rtl8195a/rtl8195a_pwm.h | 37 + lib/fwlib/rtl8195a/rtl8195a_sdio.h | 1019 +++++ lib/fwlib/rtl8195a/rtl8195a_sdio_host.h | 295 ++ lib/fwlib/rtl8195a/rtl8195a_sdr.h | 379 ++ lib/fwlib/rtl8195a/rtl8195a_spi_flash.h | 990 +++++ lib/fwlib/rtl8195a/rtl8195a_ssi.h | 498 +++ lib/fwlib/rtl8195a/rtl8195a_sys_on.h | 1093 ++++++ lib/fwlib/rtl8195a/rtl8195a_timer.h | 222 ++ lib/fwlib/rtl8195a/rtl8195a_uart.h | 532 +++ lib/fwlib/rtl8195a/rtl8195a_wdt.h | 86 + lib/fwlib/rtl8195a/src/rtl8195a_adc.c | 387 ++ lib/fwlib/rtl8195a/src/rtl8195a_dac.c | 269 ++ lib/fwlib/rtl8195a/src/rtl8195a_gdma.c | 291 ++ lib/fwlib/rtl8195a/src/rtl8195a_gpio.c | 53 + lib/fwlib/rtl8195a/src/rtl8195a_i2c.c | 408 ++ lib/fwlib/rtl8195a/src/rtl8195a_i2s.c | 395 ++ lib/fwlib/rtl8195a/src/rtl8195a_mii.c | 325 ++ lib/fwlib/rtl8195a/src/rtl8195a_nfc.c | 1921 +++++++++ lib/fwlib/rtl8195a/src/rtl8195a_pcm.c | 360 ++ lib/fwlib/rtl8195a/src/rtl8195a_pwm.c | 219 ++ lib/fwlib/rtl8195a/src/rtl8195a_sdio_device.c | 3177 +++++++++++++++ lib/fwlib/rtl8195a/src/rtl8195a_ssi.c | 1271 ++++++ lib/fwlib/rtl8195a/src/rtl8195a_timer.c | 323 ++ lib/fwlib/rtl8195a/src/rtl8195a_uart.c | 1013 +++++ lib/fwlib/rtl8195a_usb.h | 111 + lib/fwlib/src/hal_32k.c | 293 ++ lib/fwlib/src/hal_adc.c | 1603 ++++++++ lib/fwlib/src/hal_common.c | 23 + lib/fwlib/src/hal_dac.c | 1450 +++++++ lib/fwlib/src/hal_gdma.c | 574 +++ lib/fwlib/src/hal_gpio.c | 145 + lib/fwlib/src/hal_i2c.c | 2694 +++++++++++++ lib/fwlib/src/hal_i2s.c | 535 +++ lib/fwlib/src/hal_mii.c | 42 + lib/fwlib/src/hal_nfc.c | 20 + lib/fwlib/src/hal_pcm.c | 28 + lib/fwlib/src/hal_pwm.c | 131 + lib/fwlib/src/hal_sdr_controller.c | 971 +++++ lib/fwlib/src/hal_soc_ps_monitor.c | 3449 +++++++++++++++++ lib/fwlib/src/hal_ssi.c | 377 ++ lib/fwlib/src/hal_timer.c | 32 + lib/fwlib/src/hal_uart.c | 871 +++++ lib/libc/assert.h | 7 + lib/libc/ctype.h | 7 + lib/libc/libc.c | 863 +++++ lib/libc/stddef.h | 7 + lib/libc/stdio.h | 111 + lib/libc/stdlib.h | 7 + lib/libc/string.h | 7 + lib/libc/time.h | 7 + lib/mask.h | 19 + lib/rom_lib.h | 113 + lib/rtl_consol.h | 133 + lib/rtl_std_lib/include/rt_lib_rom.h | 255 ++ lib/rtl_std_lib/include/rtl_lib.h | 141 + .../libc/rom/string/rom_libc_string.h | 45 + .../rtl8195a/rom/rom_libgloss_retarget.h | 37 + lib/strproc.h | 106 + lib/va_list.h | 37 + main.c | 119 + 193 files changed, 64744 insertions(+) create mode 100644 .cproject create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/ilg.gnuarmeclipse.managedbuild.cross.prefs create mode 100644 .settings/language.settings.xml create mode 100644 .settings/org.eclipse.cdt.codan.core.prefs create mode 100644 .settings/org.eclipse.cdt.core.prefs create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 JLink-RTL00ConsoleROM.bat create mode 100644 JLink-RdFullFlash.bat create mode 100644 JLink-Reset.bat create mode 100644 JLink-RunRAM.bat create mode 100644 JLinkGDB-RdFullFlash.bat create mode 100644 JLinkGDB-RunRAM.bat create mode 100644 JLinkGDB-WrFlash.bat create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 flasher/RTL00ConsoleROM.JLinkScript create mode 100644 flasher/RTL00Console_ROM.bin create mode 100644 flasher/RTL_FFlash.JLinkScript create mode 100644 flasher/RTL_Reset.JLinkScript create mode 100644 flasher/RTL_RunRAM.JLinkScript create mode 100644 flasher/ameba1.cfg create mode 100644 flasher/cortex.ocd create mode 100644 flasher/gdb_flasher.jlink create mode 100644 flasher/gdb_init.jlink create mode 100644 flasher/gdb_rdflash.jlink create mode 100644 flasher/gdb_run_ram.jlink create mode 100644 flasher/gdb_wrflash.jlink create mode 100644 flasher/openocd/Check_Jtag.sh create mode 100644 flasher/openocd/SetupGDB_NORMAL.sh create mode 100644 flasher/openocd/ram_all.bin create mode 100644 flasher/openocd/rtl_gdb_debug.txt create mode 100644 flasher/openocd/rtl_gdb_debug_jlink.txt create mode 100644 flasher/openocd/rtl_gdb_debug_openocd.txt create mode 100644 flasher/openocd/rtl_gdb_flash_write.txt create mode 100644 flasher/openocd/rtl_gdb_flash_write_jlink.txt create mode 100644 flasher/openocd/rtl_gdb_flash_write_openocd.txt create mode 100644 flasher/openocd/rtl_gdb_ramdebug.txt create mode 100644 flasher/openocd/rtl_gdb_ramdebug_jlink.txt create mode 100644 flasher/openocd/rtl_gdb_ramdebug_openocd.txt create mode 100644 flasher/openocd/target_NORMAL.axf create mode 100644 flasher/openocd/target_NORMALB.axf create mode 100644 flasher/openocd/target_NORMALC.axf create mode 100644 flasher/rtl8710.ocd create mode 100644 flasher/rtl8710_flasher.bin create mode 100644 lib/basic_types.h create mode 100644 lib/cpu/cortex/core_cm3.h create mode 100644 lib/cpu/cortex/core_cmFunc.h create mode 100644 lib/cpu/cortex/core_cmInstr.h create mode 100644 lib/cpu/cortex/cortex.c create mode 100644 lib/cpu/cortex/cortex.h create mode 100644 lib/cpu/cortex/cortex.ocd create mode 100644 lib/cpu/rtl8710/export-rom_v03.txt create mode 100644 lib/cpu/rtl8710/rtl8710.h create mode 100644 lib/cpu/rtl8710/rtl8710.ld create mode 100644 lib/cpu/rtl8710/rtl8710.ocd create mode 100644 lib/cpu/rtl8710/rtl8710_gpio.h create mode 100644 lib/cpu/rtl8710/rtl8710_int.h create mode 100644 lib/cpu/rtl8710/rtl8710_log_uart.h create mode 100644 lib/cpu/rtl8710/rtl8710_peri_on.h create mode 100644 lib/cpu/rtl8710/rtl8710_spi.h create mode 100644 lib/cpu/rtl8710/rtl8710_sys.h create mode 100644 lib/cpu/rtl8710/rtl8710_timer.h create mode 100644 lib/fwlib/hal_adc.h create mode 100644 lib/fwlib/hal_api.h create mode 100644 lib/fwlib/hal_common.h create mode 100644 lib/fwlib/hal_crypto.h create mode 100644 lib/fwlib/hal_dac.h create mode 100644 lib/fwlib/hal_diag.h create mode 100644 lib/fwlib/hal_efuse.h create mode 100644 lib/fwlib/hal_gdma.h create mode 100644 lib/fwlib/hal_gpio.h create mode 100644 lib/fwlib/hal_i2c.h create mode 100644 lib/fwlib/hal_i2s.h create mode 100644 lib/fwlib/hal_irqn.h create mode 100644 lib/fwlib/hal_mii.h create mode 100644 lib/fwlib/hal_misc.h create mode 100644 lib/fwlib/hal_nfc.h create mode 100644 lib/fwlib/hal_pcm.h create mode 100644 lib/fwlib/hal_peri_on.h create mode 100644 lib/fwlib/hal_pinmux.h create mode 100644 lib/fwlib/hal_platform.h create mode 100644 lib/fwlib/hal_pwm.h create mode 100644 lib/fwlib/hal_sdio.h create mode 100644 lib/fwlib/hal_sdr_controller.h create mode 100644 lib/fwlib/hal_soc_ps_monitor.h create mode 100644 lib/fwlib/hal_spi_flash.h create mode 100644 lib/fwlib/hal_ssi.h create mode 100644 lib/fwlib/hal_timer.h create mode 100644 lib/fwlib/hal_uart.h create mode 100644 lib/fwlib/hal_usb.h create mode 100644 lib/fwlib/hal_util.h create mode 100644 lib/fwlib/hal_vector_table.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/Rtl8195a_otg_zero.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/cdc.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_list.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_os.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_adp.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_attr.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_cil.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_common.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_core_if.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_dbg.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_driver.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd_if.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_os_dep.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd_if.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/dwc_otg_regs.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/errno.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/hal_otg.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/hcd.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/rtl8195a_otg.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/usb.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/usb_ch9.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/usb_defs.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/usb_gadget.h create mode 100644 lib/fwlib/ram_lib/usb_otg/include/usb_ulinker.h create mode 100644 lib/fwlib/ram_lib/wlan/realtek/wlan_ram_map/rom/rom_wlan_ram_map.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_adc.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_dac.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_gdma.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_gpio.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_i2c.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_i2s.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_mii.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_nfc.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_pcm.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_peri_on.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_pwm.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_sdio.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_sdio_host.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_sdr.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_spi_flash.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_ssi.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_sys_on.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_timer.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_uart.h create mode 100644 lib/fwlib/rtl8195a/rtl8195a_wdt.h create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_adc.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_dac.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_gdma.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_gpio.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_i2c.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_i2s.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_mii.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_nfc.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_pcm.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_pwm.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_sdio_device.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_ssi.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_timer.c create mode 100644 lib/fwlib/rtl8195a/src/rtl8195a_uart.c create mode 100644 lib/fwlib/rtl8195a_usb.h create mode 100644 lib/fwlib/src/hal_32k.c create mode 100644 lib/fwlib/src/hal_adc.c create mode 100644 lib/fwlib/src/hal_common.c create mode 100644 lib/fwlib/src/hal_dac.c create mode 100644 lib/fwlib/src/hal_gdma.c create mode 100644 lib/fwlib/src/hal_gpio.c create mode 100644 lib/fwlib/src/hal_i2c.c create mode 100644 lib/fwlib/src/hal_i2s.c create mode 100644 lib/fwlib/src/hal_mii.c create mode 100644 lib/fwlib/src/hal_nfc.c create mode 100644 lib/fwlib/src/hal_pcm.c create mode 100644 lib/fwlib/src/hal_pwm.c create mode 100644 lib/fwlib/src/hal_sdr_controller.c create mode 100644 lib/fwlib/src/hal_soc_ps_monitor.c create mode 100644 lib/fwlib/src/hal_ssi.c create mode 100644 lib/fwlib/src/hal_timer.c create mode 100644 lib/fwlib/src/hal_uart.c create mode 100644 lib/libc/assert.h create mode 100644 lib/libc/ctype.h create mode 100644 lib/libc/libc.c create mode 100644 lib/libc/stddef.h create mode 100644 lib/libc/stdio.h create mode 100644 lib/libc/stdlib.h create mode 100644 lib/libc/string.h create mode 100644 lib/libc/time.h create mode 100644 lib/mask.h create mode 100644 lib/rom_lib.h create mode 100644 lib/rtl_consol.h create mode 100644 lib/rtl_std_lib/include/rt_lib_rom.h create mode 100644 lib/rtl_std_lib/include/rtl_lib.h create mode 100644 lib/rtl_std_lib/libc/rom/string/rom_libc_string.h create mode 100644 lib/rtl_std_lib/libgloss/rtl8195a/rom/rom_libgloss_retarget.h create mode 100644 lib/strproc.h create mode 100644 lib/va_list.h create mode 100644 main.c diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..f06b3f8 --- /dev/null +++ b/.cproject @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + + test + true + true + true + + + make + + flash + true + true + true + + + make + + all + true + true + true + + + make + + clean + true + true + true + + + make + + reset + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f96103d --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +test.elf +test.bin +flash.bin +ram.bin + diff --git a/.project b/.project new file mode 100644 index 0000000..254468e --- /dev/null +++ b/.project @@ -0,0 +1,27 @@ + + + RTL00ConsoleROM + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/.settings/ilg.gnuarmeclipse.managedbuild.cross.prefs b/.settings/ilg.gnuarmeclipse.managedbuild.cross.prefs new file mode 100644 index 0000000..f23196a --- /dev/null +++ b/.settings/ilg.gnuarmeclipse.managedbuild.cross.prefs @@ -0,0 +1,3 @@ +buildTools.path=D\:\\MCU\\GNU_Tools_ARM_Embedded\\5.4_2016q2\\bin +eclipse.preferences.version=1 +toolchain.path.1287942917=D\:\\MCU\\GNU_Tools_ARM_Embedded\\5.4_2016q2 diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml new file mode 100644 index 0000000..3b93ad4 --- /dev/null +++ b/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.cdt.codan.core.prefs b/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..77386c2 --- /dev/null +++ b/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,67 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..18b8a76 --- /dev/null +++ b/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,29 @@ +eclipse.preferences.version=1 +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/MINGW_HOME/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/MINGW_HOME/operation=append +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/MINGW_HOME/value=C\:\\MinGW +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/OOCD_HOME/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/OOCD_HOME/operation=append +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/OOCD_HOME/value=D\:\\MCU\\OpenOCD\\bin +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/PATH/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/PATH/operation=replace +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/PATH/value=${TL_PATH}\\bin;${MINGW_HOME}\\mingw64\\bin;${MINGW_HOME}\\bin;${MSYS_HOME}\\bin;${OCD_PATH};C\:/Program Files (x86)/Java/jre1.8.0_101/bin/client;C\:/Program Files (x86)/Java/jre1.8.0_101/bin;C\:/Program Files (x86)/Java/jre1.8.0_101/lib/i386;C\:\\MinGW\\mingw64\\bin;C\:\\MinGW\\msys\\1.0\\bin;C\:\\MinGW\\bin;D\:\\MCU\\STMicroelectronics\\st_toolset\\asm;C\:\\Python27;C\:\\Utils\\FarUtils;C\:\\Utils\\FarUtils\\HIEW810;C\:\\Windows;C\:\\Windows\\system32;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0;D\:\\MCU\\Microchip\\xc32\\v1.42\\bin;D\:\\MCU\\Microchip\\mplabc30\\v3.31\\bin;D\:\\MCU\\Microchip\\MPLAB C32 Suite\\bin;D\:\\MCU\\Microchip\\mplabc32\\v1.12\\bin;D\:\\MCU\\Microchip\\mcc18\\mpasm;D\:\\MCU\\Microchip\\mcc18\\bin;D\:\\WRK\\TortoiseGit\\bin;C\:\\Utils\\TortoiseSVN\\binC\:\\Program Files (x86)\\Git\\cmd;C\:\\Program Files (x86)\\Borland\\Delphi7\\Bin;C\:\\Program Files (x86)\\Borland\\Delphi7\\Projects\\Bpl\\;C\:\\Program Files (x86)\\Common Files\\Microsoft Shared\\Windows Live;C\:\\Program Files (x86)\\ATI Technologies\\ATI.ACE\\Core-Static;C\:\\Program Files (x86)\\Common Files\\Acronis\\SnapAPI;C\:\\Program Files (x86)\\Windows Live\\Shared;C\:\\Program Files (x86)\\IVI Foundation\\VISA\\WinNT\\Bin;C\:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit;C\:\\Program Files (x86)\\Microsoft SDKs\\TypeScript\\1.0;C\:\\Program Files (x86)\\IVI Foundation\\VISA\\WinNT\\Bin;C\:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn;C\:\\Program Files\\Common Files\\Microsoft Shared\\Windows Live;C\:\\Program Files\\Microsoft SQL Server\\120\\Tools\\Binn;C\:\\Program Files\\Microsoft DNX\\Dnvm;C\:\\Program Files\\IVI Foundation\\VISA\\Win64\\Bin;D\:\\Automation\\Samcoon\\SKWorkshop\\Marco\\HMI\\bin;D\:\\Automation\\Samcoon\\SKWorkshop\\Marco\\X86\\bin;D\:\\Automation\\Samcoon\\SK035AE\\SKWorkshop\\Marco\\HMI\\bin;D\:\\Automation\\Samcoon\\SK035AE\\SKWorkshop\\Marco\\X86\\bin;C\:\\Users\\PVV\\.dnx\\bin;C\:\\ProgramData\\chocolatey\\bin;C\:\\ProgramData\\Oracle\\Java\\javapath;C\:\\Program Files (x86)\\QuickTime\\QTSystem;C\:\\Program Files\\nodejs;D\:\\WRK\\TortoiseGit\\bin;C\:\\Utils\\TortoiseSVN\\bin;C\:\\Program Files (x86)\\Git\\cmd;D\:\\MentorGraphics\\Sourcery_CodeBench_Lite_for_MIPS_ELF\\bin;C\:\\Eclipse +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/TL_PATH/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/TL_PATH/operation=replace +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/TL_PATH/value=D\:\\MCU\\GNU_Tools_ARM_Embedded\\5.4_2016q2\\bin +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/append=true +environment/project/cdt.managedbuild.config.gnu.mingw.exe.debug.2135385807/appendContributed=true +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/MINGW_HOME/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/MINGW_HOME/operation=append +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/MINGW_HOME/value=C\:\\MinGW +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/OOCD_HOME/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/OOCD_HOME/operation=append +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/OOCD_HOME/value=D\:\\MCU\\OpenOCD\\bin +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/PATH/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/PATH/operation=replace +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/PATH/value=${TL_PATH}\\bin;${MINGW_HOME}\\mingw64\\bin;${MINGW_HOME}\\bin;${MSYS_HOME}\\bin;${OCD_PATH};C\:/Program Files (x86)/Java/jre1.8.0_101/bin/client;C\:/Program Files (x86)/Java/jre1.8.0_101/bin;C\:/Program Files (x86)/Java/jre1.8.0_101/lib/i386;C\:\\MinGW\\mingw64\\bin;C\:\\MinGW\\msys\\1.0\\bin;C\:\\MinGW\\bin;D\:\\MCU\\STMicroelectronics\\st_toolset\\asm;C\:\\Python27;C\:\\Utils\\FarUtils;C\:\\Utils\\FarUtils\\HIEW810;C\:\\Windows;C\:\\Windows\\system32;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0;D\:\\MCU\\Microchip\\xc32\\v1.42\\bin;D\:\\MCU\\Microchip\\mplabc30\\v3.31\\bin;D\:\\MCU\\Microchip\\MPLAB C32 Suite\\bin;D\:\\MCU\\Microchip\\mplabc32\\v1.12\\bin;D\:\\MCU\\Microchip\\mcc18\\mpasm;D\:\\MCU\\Microchip\\mcc18\\bin;D\:\\WRK\\TortoiseGit\\bin;C\:\\Utils\\TortoiseSVN\\binC\:\\Program Files (x86)\\Git\\cmd;C\:\\Program Files (x86)\\Borland\\Delphi7\\Bin;C\:\\Program Files (x86)\\Borland\\Delphi7\\Projects\\Bpl\\;C\:\\Program Files (x86)\\Common Files\\Microsoft Shared\\Windows Live;C\:\\Program Files (x86)\\ATI Technologies\\ATI.ACE\\Core-Static;C\:\\Program Files (x86)\\Common Files\\Acronis\\SnapAPI;C\:\\Program Files (x86)\\Windows Live\\Shared;C\:\\Program Files (x86)\\IVI Foundation\\VISA\\WinNT\\Bin;C\:\\Program Files (x86)\\Windows Kits\\8.1\\Windows Performance Toolkit;C\:\\Program Files (x86)\\Microsoft SDKs\\TypeScript\\1.0;C\:\\Program Files (x86)\\IVI Foundation\\VISA\\WinNT\\Bin;C\:\\Program Files\\Microsoft SQL Server\\110\\Tools\\Binn;C\:\\Program Files\\Common Files\\Microsoft Shared\\Windows Live;C\:\\Program Files\\Microsoft SQL Server\\120\\Tools\\Binn;C\:\\Program Files\\Microsoft DNX\\Dnvm;C\:\\Program Files\\IVI Foundation\\VISA\\Win64\\Bin;D\:\\Automation\\Samcoon\\SKWorkshop\\Marco\\HMI\\bin;D\:\\Automation\\Samcoon\\SKWorkshop\\Marco\\X86\\bin;D\:\\Automation\\Samcoon\\SK035AE\\SKWorkshop\\Marco\\HMI\\bin;D\:\\Automation\\Samcoon\\SK035AE\\SKWorkshop\\Marco\\X86\\bin;C\:\\Users\\PVV\\.dnx\\bin;C\:\\ProgramData\\chocolatey\\bin;C\:\\ProgramData\\Oracle\\Java\\javapath;C\:\\Program Files (x86)\\QuickTime\\QTSystem;C\:\\Program Files\\nodejs;D\:\\WRK\\TortoiseGit\\bin;C\:\\Utils\\TortoiseSVN\\bin;C\:\\Program Files (x86)\\Git\\cmd;D\:\\MentorGraphics\\Sourcery_CodeBench_Lite_for_MIPS_ELF\\bin;C\:\\Eclipse +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/TL_PATH/delimiter=; +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/TL_PATH/operation=replace +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/TL_PATH/value=D\:\\MCU\\GNU_Tools_ARM_Embedded\\5.4_2016q2\\bin +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/append=true +environment/project/cdt.managedbuild.config.gnu.mingw.exe.release.601511714/appendContributed=true diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/JLink-RTL00ConsoleROM.bat b/JLink-RTL00ConsoleROM.bat new file mode 100644 index 0000000..09767bd --- /dev/null +++ b/JLink-RTL00ConsoleROM.bat @@ -0,0 +1,3 @@ +@echo off +PATH=D:\MCU\SEGGER\JLink_V610a;%PATH% +start JLink.exe -Device CORTEX-M3 -If SWD -Speed 4000 flasher\RTL00ConsoleROM.JLinkScript diff --git a/JLink-RdFullFlash.bat b/JLink-RdFullFlash.bat new file mode 100644 index 0000000..843e924 --- /dev/null +++ b/JLink-RdFullFlash.bat @@ -0,0 +1,3 @@ +@echo off +PATH=D:\MCU\SEGGER\JLink_V610a;%PATH% +JLink.exe -Device CORTEX-M3 -If SWD -Speed 4000 flasher/RTL_FFlash.JLinkScript diff --git a/JLink-Reset.bat b/JLink-Reset.bat new file mode 100644 index 0000000..df222c9 --- /dev/null +++ b/JLink-Reset.bat @@ -0,0 +1,3 @@ +@echo off +PATH=D:\MCU\SEGGER\JLink_V610a;%PATH% +start JLink.exe -Device CORTEX-M3 -If SWD -Speed 1000 flasher\RTL_Reset.JLinkScript diff --git a/JLink-RunRAM.bat b/JLink-RunRAM.bat new file mode 100644 index 0000000..253941d --- /dev/null +++ b/JLink-RunRAM.bat @@ -0,0 +1,3 @@ +@echo off +PATH=D:\MCU\SEGGER\JLink_V610a;%PATH% +start JLink.exe -Device CORTEX-M3 -If SWD -Speed 4000 flasher\RTL_RunRAM.JLinkScript diff --git a/JLinkGDB-RdFullFlash.bat b/JLinkGDB-RdFullFlash.bat new file mode 100644 index 0000000..7d1edbf --- /dev/null +++ b/JLinkGDB-RdFullFlash.bat @@ -0,0 +1,6 @@ +@echo off +PATH=D:\MCU\GNU_Tools_ARM_Embedded\5.2_2015q4\bin;D:\MCU\SEGGER\JLink_V610a;%PATH% +start JLinkGDBServer.exe -device Cortex-M3 -if SWD -ir -endian little -speed 1000 +arm-none-eabi-gdb.exe -x flasher/gdb_rdflash.jlink +taskkill /F /IM JLinkGDBServer.exe + diff --git a/JLinkGDB-RunRAM.bat b/JLinkGDB-RunRAM.bat new file mode 100644 index 0000000..3292010 --- /dev/null +++ b/JLinkGDB-RunRAM.bat @@ -0,0 +1,16 @@ +@echo off +PATH=D:\MCU\GNU_Tools_ARM_Embedded\5.2_2015q4\bin;D:\MCU\SEGGER\JLink_V610a;%PATH% +@if exist test.elf goto run +echo File 'build\obj\build.axf' not found! +echo Build project... +mingw32-make.exe -f Makefile all +@if not exist test.elf goto err +:run +start JLinkGDBServer.exe -device Cortex-M3 -if SWD -ir -endian little -speed 1000 +arm-none-eabi-gdb.exe --help >xxx.txt +arm-none-eabi-gdb.exe -x flasher/gdb_run_ram.jlink +taskkill /F /IM JLinkGDBServer.exe +goto end +:err +echo Error! +:end \ No newline at end of file diff --git a/JLinkGDB-WrFlash.bat b/JLinkGDB-WrFlash.bat new file mode 100644 index 0000000..56418e5 --- /dev/null +++ b/JLinkGDB-WrFlash.bat @@ -0,0 +1,6 @@ +@echo off +PATH=D:\MCU\GNU_Tools_ARM_Embedded\5.2_2015q4\bin;D:\MCU\SEGGER\JLink_V610a;%PATH% +start JLinkGDBServer.exe -device Cortex-M3 -if SWD -ir -endian little -speed 3500 +arm-none-eabi-gdb.exe -x flasher/gdb_wrflash.jlink +taskkill /F /IM JLinkGDBServer.exe + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4843131 --- /dev/null +++ b/LICENSE @@ -0,0 +1,36 @@ +THE BEER-WARE LICENSE + +As long as you retain this notice you can do whatever you want +with this stuff. If we meet some day, and you think this stuff +is worth it, you can buy me a beer in return. + + Rebane, rebane@alkohol.ee + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1d650a2 --- /dev/null +++ b/Makefile @@ -0,0 +1,78 @@ +LIBDIR = lib +FILENAME_PREFIX = test +ADDRESS = 0x10001000 +tmp?=/tmp +#ADDRESS = 0x10000BC8 + +#FLASHER = stlink-v2-1 +#FLASHER = stlink-v2 +FLASHER = Jlink +ifeq ($(FLASHER), Jlink) +# Jlink FLASHER_SPEED ..4000 kHz +FLASHER_SPEED = 3500 +else +ifeq ($(FLASHER),stlink-v2) +# stlink-v2 FLASHER_SPEED ..1800 kHz +FLASHER_SPEED = 1800 +else +# ? FLASHER_SPEED ..500 kHz ? +FLASHER_SPEED = 500 +endif +endif + +#FLASH_TOOLDIR = tools/openocd + +CC_PARAMS = -Wall -g3 -Os -mlittle-endian -mlong-calls -mthumb -mcpu=cortex-m3 -mfloat-abi=soft -mthumb-interwork -ffunction-sections -ffreestanding -fsingle-precision-constant -fshort-wchar -fno-short-enums -Ddouble=float -nostartfiles -nostdlib +LINK_PARAMS = -Wstrict-aliasing=0 -Wl,--gc-sections -Wl,-Map=$(FILENAME_PREFIX).map -Wl,-Trtl8710.ld -Wl,-defsym -Wl,seg0_size_1k=0x002c +#-Wl,--entry=start_init -Wl,--section-start=.text=$(ADDRESS) +BASE_PARAMS = -DCORTEX_INTERRUPT_MAX=32 -I$(LIBDIR) -I$(LIBDIR)/cpu/rtl8710 -I$(LIBDIR)/cpu/cortex -I$(LIBDIR)/fwlib +LIBC_PARAMS = -L$(LIBDIR)/cpu/rtl8710 -I$(LIBDIR)/libc $(LIBDIR)/libc/libc.c -DLIBC_PRINTF $(LIBDIR)/cpu/cortex/cortex.c +#-lgcc +#$(LIBDIR)/libc/libc.c -DLIBC_PRINTF $(LIBDIR)/cpu/cortex/cortex.c +FIRMWARE_PARAMS = main.c + +#--------------------------- +# User defined +#--------------------------- +# + or set in PATH D:\MCU\GNU_Tools_ARM_Embedded\5.4_2016q2\bin; +GCC_PATH=d:/MCU/GNU_Tools_ARM_Embedded/5.4_2016q2/bin/ +#--------------------------- +# Default +#--------------------------- +# Compilation tools +CROSS_COMPILE = $(GCC_PATH)arm-none-eabi- +AR = $(CROSS_COMPILE)ar +CC = $(CROSS_COMPILE)gcc +AS = $(CROSS_COMPILE)as +NM = $(CROSS_COMPILE)nm +LD = $(CROSS_COMPILE)ld +GDB = $(CROSS_COMPILE)gdb +SIZE = $(CROSS_COMPILE)size +OBJCOPY = $(CROSS_COMPILE)objcopy +OBJDUMP = $(CROSS_COMPILE)objdump +STRIP = $(CROSS_COMPILE)strip + +all: firmware + +firmware: + $(CC) $(CC_PARAMS) $(BASE_PARAMS) $(LIBC_PARAMS) $(LINK_PARAMS) $(FIRMWARE_PARAMS) -o $(FILENAME_PREFIX).elf + $(OBJCOPY) -j .header -j .text -j .data -Obinary $(FILENAME_PREFIX).elf $(RAM1_IMAGE) ram.bin + $(OBJCOPY) -j .fheader -j .header -j .text -j .data -Obinary $(FILENAME_PREFIX).elf $(RAM1_IMAGE) flash.bin + $(OBJDUMP) -S $(FILENAME_PREFIX).elf >$(FILENAME_PREFIX).asm + +size: + $(SIZE) -A -x $(FILENAME_PREFIX).elf + +clean: + rm -rf *.bin test.elf test.asm flash.bin ram.bin test.map + +test: + #openocd -f interface/$(FLASHER).cfg -c "adapter_khz $(FLASHER_SPEED)" -f $(LIBDIR)/cpu/rtl8710/rtl8710.ocd -f $(LIBDIR)/cpu/cortex/cortex.ocd -c "init" -c "reset halt" -c "load_image $(FILENAME_PREFIX).bin $(ADDRESS) bin" -c "cortex_bootstrap $(ADDRESS)" -c "shutdown" + +flash: + #openocd -f interface/$(FLASHER).cfg -c "adapter_khz $(FLASHER_SPEED)" -f $(LIBDIR)/cpu/rtl8710/rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_flash_auto_erase 1" -c "rtl8710_flash_auto_verify 1" -c "rtl8710_flash_write flash.bin 0" -c "rtl8710_reboot" -c "reset run" -c shutdown + +reset: + #openocd -f interface/$(FLASHER).cfg -c "adapter_khz $(FLASHER_SPEED)" -f $(LIBDIR)/cpu/rtl8710/rtl8710.ocd -c "init" -c "reset halt" -c "rtl8710_reboot" -c shutdown + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b578179 --- /dev/null +++ b/README.md @@ -0,0 +1,42 @@ +# RTL-00 Test Load to RAM + RTL Console ROM + +Testing RTL8710 + J-Link/STlink + +## pins: +* UART RX: GB0 +* UART TX: GB1 +* LED: GC4 +* SWDIO: GE3 +* SWCLK: GE4 +## building: +``` +make +``` +## flashing: +``` +JLinkGDB-WrFlash.bat +``` +## reset: +``` +JLink-Reset.bat +``` +``` +## Runing in ram: +``` +JLink-RunRAM.bat +JLinkGDB-RunRAM.bat +``` +## Read FullFlash +``` +JLink-RdFullFlash.bat +``` +## Debug RAM +``` +export project to Eclipse... +``` +## RTL00 Console ROM +``` +JLink-RTL00ConsoleROM.bat +``` + + diff --git a/flasher/RTL00ConsoleROM.JLinkScript b/flasher/RTL00ConsoleROM.JLinkScript new file mode 100644 index 0000000..5b85200 --- /dev/null +++ b/flasher/RTL00ConsoleROM.JLinkScript @@ -0,0 +1,6 @@ +h +loadbin flasher/RTL00Console_ROM.bin 0x10000ba8 +r +w4 0x40000210,0x4011117 +g +q \ No newline at end of file diff --git a/flasher/RTL00Console_ROM.bin b/flasher/RTL00Console_ROM.bin new file mode 100644 index 0000000000000000000000000000000000000000..e83cb165765b0706201fe3e2eb5bfcbadaf693d5 GIT binary patch literal 600 zcmbO^bJ{ffGiiSg7@uK&ddD!yf{B6Q1UG|#4#R&icnM^G1!6`X1_53mmIPwuO0f=* zBuFjCRt5zI?-}l@Kyi+(j7V%IBsMb=n+48p-pb;pu#?e^QR#+)8qkbnIVNrX8-?4L z6jXpb6>t9!|Ba*)ls%MzJQz;grtGWertIPWp}}Q^yJA*S*5a%OSqu~8J%GIIr0m7n z53(61$O3s+etZy=@woEii{h0ZKMYs6OLjhL1^~0Mt#SYW literal 0 HcmV?d00001 diff --git a/flasher/RTL_FFlash.JLinkScript b/flasher/RTL_FFlash.JLinkScript new file mode 100644 index 0000000..a9ed900 --- /dev/null +++ b/flasher/RTL_FFlash.JLinkScript @@ -0,0 +1,17 @@ +h +r +w4 0x40000230,0x0000D3C4 +w4 0x40000210,0x00200113 +w4 0x400002C0,0x00110001 +w4 0x40006008,0 +w4 0x4000602C,0 +w4 0x40006010,1 +w4 0x40006014,2 +w4 0x40006018,0 +w4 0x4000601C,0 +w4 0x4000604C,0 +savebin fullflash.bin 0x98000000 0x100000 +w4 0x40000210,0x211157 +r +g +q \ No newline at end of file diff --git a/flasher/RTL_Reset.JLinkScript b/flasher/RTL_Reset.JLinkScript new file mode 100644 index 0000000..303f367 --- /dev/null +++ b/flasher/RTL_Reset.JLinkScript @@ -0,0 +1,5 @@ +h +r +w4 0x40000210,0x00211157 +g +q \ No newline at end of file diff --git a/flasher/RTL_RunRAM.JLinkScript b/flasher/RTL_RunRAM.JLinkScript new file mode 100644 index 0000000..7c955fb --- /dev/null +++ b/flasher/RTL_RunRAM.JLinkScript @@ -0,0 +1,6 @@ +h +loadbin ram.bin 0x10000bc8 +r +w4 0x40000210,0x4011117 +g +q \ No newline at end of file diff --git a/flasher/ameba1.cfg b/flasher/ameba1.cfg new file mode 100644 index 0000000..f3ee2db --- /dev/null +++ b/flasher/ameba1.cfg @@ -0,0 +1,124 @@ +# Main file for Ameba1 series Cortex-M3 parts +# +# !!!!!! +# + +set CHIPNAME rtl8195a +set CHIPSERIES ameba1 + +# Adapt based on what transport is active. +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + error "CHIPNAME not set. Please do not include ameba1.cfg directly." +} + +if { [info exists CHIPSERIES] } { + # Validate chip series is supported + if { $CHIPSERIES != "ameba1" } { + error "Unsupported chip series specified." + } + set _CHIPSERIES $CHIPSERIES +} else { + error "CHIPSERIES not set. Please do not include ameba1.cfg directly." +} + +if { [info exists CPUTAPID] } { + # Allow user override + set _CPUTAPID $CPUTAPID +} else { + # Ameba1 use a Cortex M3 core. + if { $_CHIPSERIES == "ameba1" } { + if { [using_jtag] } { + set _CPUTAPID 0x4ba00477 + } { + set _CPUTAPID 0x2ba01477 + } + } +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -chain-position $_TARGETNAME + + +# Run with *real slow* clock by default since the +# boot rom could have been playing with the PLL, so +# we have no idea what clock the target is running at. +adapter_khz 1000 + +# delays on reset lines +adapter_nsrst_delay 200 +if {[using_jtag]} { + jtag_ntrst_delay 200 +} + + +# Ameba1 (Cortex M3 core) support SYSRESETREQ +if {![using_hla]} { + # if srst is not fitted use SYSRESETREQ to + # perform a soft reset + cortex_m reset_config sysresetreq +} + +$_TARGETNAME configure -event reset-init {ameba1_init} + +# Ameba1 SDRAM enable +proc ameba1_init { } { + # init System + mww 0x40000014 0x00000021 + sleep 10 + mww 0x40000304 0x1fc00002 + sleep 10 + mww 0x40000250 0x00000400 + sleep 10 + mww 0x40000340 0x00000000 + sleep 10 + mww 0x40000230 0x0000dcc4 + sleep 10 + mww 0x40000210 0x00011117 + sleep 10 + mww 0x40000210 0x00011157 + sleep 10 + mww 0x400002c0 0x00110011 + sleep 10 + mww 0x40000320 0xffffffff + sleep 10 + # init SDRAM + mww 0x40000040 0x00fcc702 + sleep 10 + mdw 0x40000040 + mww 0x40005224 0x00000001 + sleep 10 + mww 0x40005004 0x00000208 + sleep 10 + mww 0x40005008 0xffffd000 + sleep 13 + mww 0x40005020 0x00000022 + sleep 13 + mww 0x40005010 0x09006201 + sleep 13 + mww 0x40005014 0x00002611 + sleep 13 + mww 0x40005018 0x00068413 + sleep 13 + mww 0x4000501c 0x00000042 + sleep 13 + mww 0x4000500c 0x700 ;# set Idle + sleep 20 + mww 0x40005000 0x1 ;# start init + sleep 100 + mdw 0x40005000 + mww 0x4000500c 0x600 ;# enter memory mode + sleep 30 + + mww 0x40005008 0x00000000 ;# 0xf00 + ;# mww 0x40005008 0x00000f00 + sleep 3 + mww 0x40000300 0x0006005e ;# 0x5e + ;# mww 0x40000300 0x0000005e + sleep 3 +} diff --git a/flasher/cortex.ocd b/flasher/cortex.ocd new file mode 100644 index 0000000..37f2921 --- /dev/null +++ b/flasher/cortex.ocd @@ -0,0 +1,89 @@ +proc cortex_bootstrap {start} { + # disable interrupts + reg faultmask 0x01 + set vectors "" + mem2array vectors 32 $start 2 + reg sp $vectors(0) + reg pc $vectors(1) + resume +} + +proc cortex_reboot {} { + set ddd [ format "0x%08x" [ rtl8710_flasher_mrw [ expr 0x40000210 ] ] ] +# set aaa [ format "0x%08x" [ expr 0x40000210 ] ] + echo "CLK_CTRL1 = $ddd" +# echo "# Set processor clock to default before system reset" + set ddd [ format "0x%08x" [ rtl8710_flasher_mrw [ expr 0x40000014 ] ] ] +# set aaa [ format "0x%08x" [ expr 0x40000014 ] ] + echo "SOC_FUNC_EN = $ddd" +# mww 0x40000014 0x00000021 + sleep 10 + echo "# Reboot (system reset)" + mww 0xE000ED0C 0x05FA0007 +} + +proc init_system {} { +# Set processor clock to default before system reset +# CLK_CTRL1 +# mww 0x40000014 0x00000011 + mww 0x40000014 0x00000021 + sleep 10 +# PESOC_SOC_CTRL +# mww 0x40000304 0x1fc00001 + mww 0x40000304 0x1fc00002 + sleep 10 +# PESOC_CLK_SEL + mww 0x40000250 0x00000400 + sleep 10 +# GPIO_PULL_CTRL4 + mww 0x40000340 0x00000000 + sleep 10 +# PESOC_CLK_CTRL +# mww 0x40000230 0x0000d3c4 + mww 0x40000230 0x0000dcc4 + sleep 10 +# SOC_FUNC_EN: FUN|OCP|LXBUS|FLASH|CPU|LOG_UART|GTIMER|SECURITY_ENGINE +# mww 0x40000210 0x00211117 + mww 0x40000210 0x00011117 + sleep 10 +# SOC_FUNC_EN: FUN|OCP|LXBUS|FLASH|CPU|LOG_UART|GTIMER|SECURITY_ENGINE + MEM_CTRL + mww 0x40000210 0x00011157 + sleep 10 +# CPU_PERIPHERAL_CTRL SPI_FLASH_PIN_EN|SDR_PIN_EN|SWD_PIN_EN|LOG_UART_PIN_EN ? +# mww 0x400002c0 0x00110000 + mww 0x400002c0 0x00110011 + sleep 10 +# GPIO_SHTDN_CTRL +# mww 0x40000320 0x00000033 + mww 0x40000320 0xffffffff + sleep 10 + + mww 0x40005008 0x00000000 + sleep 10 +# PESOC_MEM_CTRL + mww 0x40000300 0x0006005e + sleep 10 + + # set baudrate to 38400 +# mww 0x40003010 0x00000080 +# mww 0x40003008 0x00000022 +# mww 0x4000300C 0x00000000 +# mww 0x40003010 0x00000000 +} + +proc boot_from_flash {} { + echo "# skip sdram init, it has been init in openocd config" + mww 0x40000210 0x211157 +} + +proc boot_from_ram {} { + echo "# boot from ram, igonore loading flash" + mww 0x40000210 0x8011157 +} + +proc restart_from_falsh {} { + init + init_system + boot_from_flash + cortex_reboot +} diff --git a/flasher/gdb_flasher.jlink b/flasher/gdb_flasher.jlink new file mode 100644 index 0000000..a542653 --- /dev/null +++ b/flasher/gdb_flasher.jlink @@ -0,0 +1,200 @@ +#################################### +# J-LINK GDB SERVER initialization # +#################################### +define InitJlink +printf "Jlink Init:\n" +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +#set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 +target remote localhost:2331 +set remotetimeout 10000 +monitor device Cortex-M3 +monitor endian little +monitor reset +# Set max speed +monitor speed 4000 +set mem inaccessible-by-default off +# Setup GDB FOR FASTER DOWNLOADS +set remote memory-write-packet-size 8192 +set remote memory-write-packet-size fixed +end +############# +# Boot_Flash +define SetBootFlash +printf "SetBoot = Flash:\n" +monitor long 0x40000210 = 0x211157 +end +# Boot RAM start_addr0() Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x80000000 ) +define SetBootCall0 +printf "SetBoot = Call0:\n" +monitor long 0x40000210 = 0x80011117 +end +# Boot RAM start_addr1() Run if ( v40000210 & 0x20000000 ) +define SetBootCall1 +printf "SetBoot = Call1:\n" +monitor long 0x40000210 = 0x20011117 +end +# Boot RAM start_addr2() Run if ( v40000210 & 0x10000000 ) +define SetBootCall2 +printf "SetBoot = Call2:\n" +monitor long 0x40000210 = 0x10011117 +end +# Boot RAM start_addr3() Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x8000000 ) +define SetBootCall3 +printf "SetBoot = Call3:\n" +monitor long 0x40000210 = 0x8011117 +end +# Boot RAM start_addr4() Init console, Run if ( v40000210 & 0x4000000 ) +define SetBootCall4 +printf "SetBoot = Call4:\n" +monitor long 0x40000210 = 0x4011117 +end +# CPU CLK 166 MHz? +define SetClk166MHz +printf "SetCLK 166.66MHz:\n" +monitor long 0x40000014 = 0x00000011 +end +# CPU CLK 83 MHz? +define SetClk83MHz +printf "SetCLK 83.33MHz:\n" +monitor long 0x40000014 = 0x00000021 +end +############### +# System Init # +############### +define SystemInit +printf "System Init:\n" +monitor long 0x40000304 = 0x1FC00002 +monitor long 0x40000250 = 0x400 +monitor long 0x40000340 = 0x0 +monitor long 0x40000230 = 0xdcc4 +monitor long 0x40000210 = 0x11117 +monitor long 0x40000210 = 0x11157 +monitor long 0x400002c0 = 0x110011 +monitor long 0x40000320 = 0xffffffff +end +############ +# SPI Init # +############ +define SPI_Init +printf "Init SPI:\n" +#enable spi flash peripheral clock +set $Temp = {int}(0x40000230) +set $Temp = ($Temp | 0x300) +set {int}(0x40000230) = $Temp +#enable spi flash peripheral +set $Temp = {int}(0x40000210) +set $Temp = ($Temp | 0x10) +set {int}(0x40000210) = $Temp +#select spi flash pinout (0 - internal), enable spi flash pins +set $Temp = {int}(0x400002C0) +set $Temp = (($Temp & 0xFFFFFFF8) | 1) +set {int}(0x400002C0) = $Temp +#disable SPI FLASH operation +monitor long 0x40006008 = 0 +#disable all interrupts +monitor long 0x4000602C = 0 +#use first "slave select" pin +monitor long 0x40006010 = 1 +#baud rate, default value +monitor long 0x40006014 = 2 +#tx fifo threshold +monitor long 0x40006018 = 0 +#rx fifo threshold +monitor long 0x4000601C = 0 +#disable DMA +monitor long 0x4000604C = 0 +set $SPI_FLASH_BASE = 0x98000000 +end +################### +# SetFirwareSize # +################### +define SetFirwareSize +set $rambuffer = 0x10000300 +set $Image2Addr = 0 +set $Image2Size = 0 +printf "Get ImagesSize:\n" +restore $arg0 binary $rambuffer 0 0x20 +set $Image1Size = {int}($rambuffer+0x10) + 32 +set $Image1LoadAddr = {int}($rambuffer+0x14) +#set $Image2Addr = {short}($rambuffer+0x18) * 1024 +if $Image1Size != 0 && $Image1Size < 0x1000000 + if $Image2Addr == 0 + set $Image2Addr = $Image1Size + end +# printf "Image1Size = %d\n", $Image1Size +# printf "Image1LoadAddr = 0x%08x\n", $Image1LoadAddr +# printf "Image2FlashAddr = 0x%08x\n", $Image2Addr +# set $parms1 = $rambuffer - $Image2Addr +# set $parms3 = $Image2Addr + 0x08 +# restore $arg0 binary $parms1 $Image2Addr $parms3 +# set $Image2Size = {int}($rambuffer) +# set $Image2LoadAddr = {int}($rambuffer+0x4) + if $Image2Size != 0xFFFFFFFF && $Image2Size != 0 + set $Image2Size = $Image2Size + 16 + printf "Image2Size = %d\n", $Image2Size + printf "Image2LoadAddr = 0x%08x\n", $Image2LoadAddr + set $FirmwareSize = $Image2Addr + $Image2Size + printf "FirmwareSize = %d\n", $FirmwareSize + else + set $Image2Size = 0 + printf "Image2 - None\n" + set $FirmwareSize = $Image1Size + printf "FirmwareSize = %d\n", $FirmwareSize + end +else + set $Image1Size = 0 + set $Image2Size = 0 + set $Image2Addr = 0 + set $FirmwareSize = 0 + printf "Image not format Firmware!\n" +end +end +##################### +# Flash Images Info # +##################### +define FlashImagesInfo +printf "Flash Info:\n" +set $Image1Size = {int}($SPI_FLASH_BASE + 0x10) + 32 +set $Image1LoadAddr = {int}($SPI_FLASH_BASE + 0x14) +if $Image1LoadAddr == 0xFFFFFFFF +printf "Image1 - None\n" +else +set $Image2FlashAddr = {short}($SPI_FLASH_BASE + 0x18) * 1024 +if $Image2FlashAddr == 0 +$Image2FlashAddr = $Image1Size +end +set $Image2Size = {int}($Image2FlashAddr + $SPI_FLASH_BASE) +set $Image2LoadAddr = {int}($Image2FlashAddr + $SPI_FLASH_BASE + 0x4) +printf "Image1Size = %d\n", $Image1Size +printf "Image1LoadAddr = 0x%08x\n", $Image1LoadAddr +printf "Image2FlashAddr = 0x%08x\n", $Image2FlashAddr +if $Image2Size != 0xFFFFFFFF +printf "Image2Size = %d\n", $Image2Size +printf "Image2LoadAddr = 0x%08x\n", $Image2LoadAddr +else +printf "Image2 - None\n" +end +end +end diff --git a/flasher/gdb_init.jlink b/flasher/gdb_init.jlink new file mode 100644 index 0000000..e22a9fd --- /dev/null +++ b/flasher/gdb_init.jlink @@ -0,0 +1,9 @@ +# +# J-LINK GDB SERVER initialization +# +source -v flasher/gdb_flasher.jlink +InitJlink +SetBootFlash +monitor reset +monitor go +quit \ No newline at end of file diff --git a/flasher/gdb_rdflash.jlink b/flasher/gdb_rdflash.jlink new file mode 100644 index 0000000..04af402 --- /dev/null +++ b/flasher/gdb_rdflash.jlink @@ -0,0 +1,16 @@ +# GDB Jlink read fullflash +# Init +source -v flasher/gdb_flasher.jlink +InitJlink +SystemInit +SPI_Init +FlashImagesInfo +# Read FullFlash +printf "Read FullFlash:\n" +set $dumpstartaddr = $SPI_FLASH_BASE +set $dumpendaddr = $SPI_FLASH_BASE + 0x100000 +printf "Start addr of dumping = 0x%08x\n", $dumpstartaddr +printf "End addr of dumping = 0x%08x\n", $dumpendaddr +dump binary memory fullflash.bin $dumpstartaddr $dumpendaddr +printf "FullFlash saved in 'fullflash.bin' - OK.\n" +quit diff --git a/flasher/gdb_run_ram.jlink b/flasher/gdb_run_ram.jlink new file mode 100644 index 0000000..4367ee3 --- /dev/null +++ b/flasher/gdb_run_ram.jlink @@ -0,0 +1,11 @@ +# +# J-LINK GDB SERVER initialization +# +source -v flasher/gdb_flasher.jlink +InitJlink +SetBootCall4 +load test.elf +monitor reset +monitor go +quit + diff --git a/flasher/gdb_wrflash.jlink b/flasher/gdb_wrflash.jlink new file mode 100644 index 0000000..f8fd472 --- /dev/null +++ b/flasher/gdb_wrflash.jlink @@ -0,0 +1,160 @@ +############### +# FlasherInit # +############### +define FlasherInit +set $rtl8710_flasher_capacity = 0 +set $rtl8710_flasher_auto_erase = 1 +set $rtl8710_flasher_auto_verify = 1 +set $rtl8710_flasher_firmware_ptr = 0x10001000 +set $rtl8710_flasher_buffer = 0x10008000 +#262144 +set $rtl8710_flasher_buffer_size = 425984 +set $rtl8710_flasher_sector_size = 4096 +set $rtl8710_flasher_auto_erase_sector = 0xFFFFFFFF +end +############### +# FlasherWait # +############### +define FlasherWait +set $fresult = {int}($rtl8710_flasher_buffer) +while ($fresult != 0) +set $fresult = {int}($rtl8710_flasher_buffer) +end +end +############### +# FlasherLoad # +############### +define FlasherLoad +if $rtl8710_flasher_capacity == 0 + printf "initializing RTL8710 flasher\n" + restore $arg0 binary $rtl8710_flasher_firmware_ptr 0 968 + monitor reset + set $pc = $rtl8710_flasher_firmware_ptr + set $sp = 0x1ffffffc + set {int}($rtl8710_flasher_buffer + 0x08) = 0 + set {int}($rtl8710_flasher_buffer + 0x00) = 1 + #continue + monitor go + FlasherWait + set $id = {int}($rtl8710_flasher_buffer + 0x0C) + if ($id == 0x1420c2) + set $rtl8710_flasher_capacity = 1 << (($id >> 16) & 0x0ff) + printf "Flash ID = 0x%08x : MX25L8006E (%d kbytes)\n", $id, $rtl8710_flasher_capacity>>10 + else + set $rtl8710_flasher_capacity = 1024*1024) + error "Flash ID = 0x%08x : ?\n", $id + end + printf "RTL8710 flasher initialized\n" +else +printf "reinitializing RTL8710 flasher\n" +end +end +################## +# FlasherWrBlock # +################## +define FlasherWrBlock +#printf "FlashWrBlock 0x%08x, 0x%08x\n", $arg0, $arg1 +set {int}($rtl8710_flasher_buffer + 0x04) = 4 +set {int}($rtl8710_flasher_buffer + 0x08) = 0 +set {int}($rtl8710_flasher_buffer + 0x10) = $arg0 +set {int}($rtl8710_flasher_buffer + 0x14) = $arg1 +set {int}($rtl8710_flasher_buffer + 0x00) = 1 +FlasherWait +set $status = {int}($rtl8710_flasher_buffer + 0x08) +if $status > 0 + error "write error, offset 0x%08x", $arg0 +end +end +################## +# FlasherVrBlock # +################## +define FlasherVrBlock +#printf "FlashVrBlock 0x%08x, 0x%08x\n", $arg0, $arg1 +set {int}($rtl8710_flasher_buffer + 0x04) = 5 +set {int}($rtl8710_flasher_buffer + 0x08) = 0 +set {int}($rtl8710_flasher_buffer + 0x10) = $arg0 +set {int}($rtl8710_flasher_buffer + 0x14) = $arg1 +set {int}($rtl8710_flasher_buffer + 0x00) = 1 +FlasherWait +set $status = {int}($rtl8710_flasher_buffer + 0x08) +if $status > 0 + set $status = {int}($rtl8710_flasher_buffer + 0x0C) + set $status = {int}($status + $arg0) + error "verify error, offset 0x%08x", $status +end +end +################# +# FlashSecErase # +################# +define FlashSecErase +#printf "FlashSecErase 0x%08x, 0x%08x\n", $rtl8710_flasher_buffer, $arg0 +set {int}($rtl8710_flasher_buffer + 0x04) = 2 +set {int}($rtl8710_flasher_buffer + 0x08) = 0 +set {int}($rtl8710_flasher_buffer + 0x10) = $arg0 +set {int}($rtl8710_flasher_buffer + 0x00) = 1 +FlasherWait +end +################ +# FlasherWrite # +################ +define FlasherWrite +set $sector = 0 +set $offset = 0 +set $size = $arg2 +while $offset < $size + set $len = $size - $offset + if $len > $rtl8710_flasher_buffer_size + set $len = $rtl8710_flasher_buffer_size + end + set $flash_offset = $arg1 + $offset + printf "write offset 0x%08x\n", $flash_offset + set $parms1 = $rtl8710_flasher_buffer + 0x20 - $offset - $arg1 + set $parms2 = $offset + $arg1 + set $parms3 = $offset + $len + $arg1 + restore $arg0 binary $parms1 $parms2 $parms3 + if $rtl8710_flasher_auto_erase != 0 + set $count_i = $flash_offset + while $count_i < ($flash_offset + $len) + set $sector = $count_i/$rtl8710_flasher_sector_size + if $rtl8710_flasher_auto_erase_sector != $sector + set $parms1 = $sector * $rtl8710_flasher_sector_size + printf "erase sector %d at 0x%08x\n", $sector, $parms1 + FlashSecErase $parms1 + set $rtl8710_flasher_auto_erase_sector = $sector + end + set $count_i = $count_i + 1 + end + end + FlasherWrBlock $flash_offset $len + printf "wrote %d bytes at 0x%08x\n", $len, $flash_offset + if $rtl8710_flasher_auto_verify != 0 + printf "verify offset 0x%08x len %d\n", $flash_offset, $len + FlasherVrBlock $flash_offset $len + end + set $offset = $offset + $rtl8710_flasher_buffer_size +end +end +######################################### +source -v flasher/gdb_flasher.jlink +InitJlink +SystemInit +SetClk166MHz +SPI_Init +FlashImagesInfo +SetFirwareSize flash.bin +if $FirmwareSize == 0 + error "FirmwareSize = 0!" +end +FlasherInit +FlasherLoad flasher/rtl8710_flasher.bin +if $Image1Size != 0 + printf "Write Image1 size %d to Flash addr 0x00000000:\n", $Image1Size + FlasherWrite flash.bin 0 $Image1Size + if $Image2Size != 0 && $Image2Addr >= $Image1Size + printf "Write Image2 size %d to Flash addr 0x%08x:\n", $Image2Size, $Image2Addr + FlasherWrite flash.bin $Image2Addr $Image2Size + end +end +FlashImagesInfo +quit + diff --git a/flasher/openocd/Check_Jtag.sh b/flasher/openocd/Check_Jtag.sh new file mode 100644 index 0000000..e5a80d4 --- /dev/null +++ b/flasher/openocd/Check_Jtag.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +#=============================================================================== +CURRENT_UTILITY_DIR=$(pwd) +GDBSCPTFILE="../../../component/soc/realtek/8195a/misc/gcc_utility/rtl_gdb_flash_write.txt" + +#=============================================================================== +RLXSTS=$(ps -W | grep "rlx_probe_driver.exe" | grep -v "grep" | wc -l) +echo $RLXSTS +JLKSTS=$(ps -W | grep "JLinkGDBServer.exe" | grep -v "grep" | wc -l) +echo $JLKSTS + +echo $CURRENT_UTILITY_DIR + +#=============================================================================== +#make the new string for being written +if [ $RLXSTS = 1 ] +then + echo "probe get" + + #------------------------------------------- + LINE_NUMBER=$(grep -n "monitor reset " $GDBSCPTFILE | awk -F":" '{print $1}') + DEFAULT_STR=$(grep -n "monitor reset " $GDBSCPTFILE | awk -F":" '{print $2}') + #echo $LINE_NUMBER + echo $DEFAULT_STR + STRLEN_DFT=$(expr length "$DEFAULT_STR") + DEFAULT_STR="#monitor reset 1" + echo $DEFAULT_STR + #------------------------------------------- + SED_PARA="$LINE_NUMBER""c""$DEFAULT_STR" + sed -i "$SED_PARA" $GDBSCPTFILE + + #=========================================== + LINE_NUMBER=$(grep -n "monitor sleep " $GDBSCPTFILE | awk -F":" '{print $1}') + DEFAULT_STR=$(grep -n "monitor sleep " $GDBSCPTFILE | awk -F":" '{print $2}') + #echo $LINE_NUMBER + echo $DEFAULT_STR + STRLEN_DFT=$(expr length "$DEFAULT_STR") + DEFAULT_STR="#monitor sleep 20" + echo $DEFAULT_STR + #------------------------------------------- + SED_PARA="$LINE_NUMBER""c""$DEFAULT_STR" + sed -i "$SED_PARA" $GDBSCPTFILE +else + +if [ $JLKSTS = 1 ] +then + echo "jlink get" + + #------------------------------------------- + LINE_NUMBER=$(grep -n "monitor reset " $GDBSCPTFILE | awk -F":" '{print $1}') + DEFAULT_STR=$(grep -n "monitor reset " $GDBSCPTFILE | awk -F":" '{print $2}') + #echo $LINE_NUMBER + echo $DEFAULT_STR + STRLEN_DFT=$(expr length "$DEFAULT_STR") + DEFAULT_STR="monitor reset 1" + echo $DEFAULT_STR + #------------------------------------------- + SED_PARA="$LINE_NUMBER""c""$DEFAULT_STR" + sed -i "$SED_PARA" $GDBSCPTFILE + + #=========================================== + LINE_NUMBER=$(grep -n "monitor sleep " $GDBSCPTFILE | awk -F":" '{print $1}') + DEFAULT_STR=$(grep -n "monitor sleep " $GDBSCPTFILE | awk -F":" '{print $2}') + #echo $LINE_NUMBER + echo $DEFAULT_STR + STRLEN_DFT=$(expr length "$DEFAULT_STR") + DEFAULT_STR="monitor sleep 20" + echo $DEFAULT_STR + #------------------------------------------- + SED_PARA="$LINE_NUMBER""c""$DEFAULT_STR" + sed -i "$SED_PARA" $GDBSCPTFILE + +fi +fi + +#=============================================================================== diff --git a/flasher/openocd/SetupGDB_NORMAL.sh b/flasher/openocd/SetupGDB_NORMAL.sh new file mode 100644 index 0000000..ba44ef8 --- /dev/null +++ b/flasher/openocd/SetupGDB_NORMAL.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +#=============================================================================== +CURRENT_UTILITY_DIR=$(pwd) +echo "..." +echo $CURRENT_UTILITY_DIR +RAMFILENAME="./application/Debug/bin/ram_all.bin" +echo $RAMFILENAME +#RAMFILENAME="ram_2.bin" +GDBSCPTFILE="../../../component/soc/realtek/8195a/misc/gcc_utility/rtl_gdb_flash_write.txt" + +#=============================================================================== +#get file size +RAM_FILE_SIZE=$(stat -c %s $RAMFILENAME) +RAM_FILE_SIZE_HEX=`echo "obase=16; $RAM_FILE_SIZE"|bc` + +echo "size "$RAM_FILE_SIZE" --> 0x"$RAM_FILE_SIZE_HEX + +echo "set \$RamFileSize = 0x$RAM_FILE_SIZE_HEX" > fwsize.gdb +exit diff --git a/flasher/openocd/ram_all.bin b/flasher/openocd/ram_all.bin new file mode 100644 index 0000000000000000000000000000000000000000..c2f934356c65067d6a6915a12b99d442d88f506d GIT binary patch literal 325680 zcmeFa4|tQul`lN6B-^sEu}DY)iIa>02Lb*g8wkdU6Unk=3;aj1O$?!|BwMnjU`s-h zvFUA7C#4(GHg`$4?V7gf(%p8SG;Mc*ZSIn`)J|{qYuaw_LbL3qO?q+n>)s@!yA_1S z0uucF&dmEtG8jVkYrpS4_t6XEdEYZLXJ*d)JLk-q(SZY>|NQ;`F!1iw+JDgh+iNv_ ziF(FfTENT|Y*sv{%9*)%`CPYr&&~TN(8%V0^z(qdrx`oAc9iK5Hi10InZL@!H}8-M zD2yHjj^h6sAV+~5 z1#%R~QQ-e{3It1;S*v5uoy`0_xD`AD)57NSU)x}q5Bvv(kxql2g=>HMjdeE+|F7Tt z&pft3f^vUz6v$EF4@`jVBHq!P%7dm`S=sE& z-vN3kkbKydw6SELvW(uw@y5zt;j=UQ5&GFY+u7M&%77BICly8U!ap~@NCEcoyxEyA z&L)Glq?skXBJH{HD5V9Ka|~}U0!MgONrum#O7-L^V@mQ*6eX%l)}&6QTJu;i8RX~2 z-AONSNFV9&-N$(T{;fQ3|EZKE&#*s_7wqpmce9P{*YhV+3)u@?+0VFc|F=>_j6GBG zk}i33%J9tW%(mG)KqaI&rRP>}GHgpKEIA}4pV5;WXajZ2)SjJB_FzA368gz4@HkfpEEd5r9Na}!6`$rGymjjXUSRP z12U!#v~Hr1eEmt~E|&b&ESqL`y<1_JWR*&}#W_3k(@UM_J{+B$IeAG*{(APV!xrbU zH=<~^4}U*;tn$sI{Zz_mfZMzG5DPw;GBVvanaLYvD^I0T`j=7|6?d)QFLIR0uYQ)$r#x;=G?O-vop9W#RpueR!f ztW1}THXb=+^ZX#xm^ABt;4@AtWk1;2cy2uQgMRWE{1>^hY<6bzC60W|HtMqvd>^&# z{KO%pe0JvJmrkW#dF+R+ucVlla@RfkGGZhyJ&pQL6&Ow`%VbYpb7^+wTeHu1KIW_g zg>@&t;rzO@WV$oS7W~|4SoXY&>REY-efc|QE|%zzQ|o_o_8ZP`v~iT*c=Gu(tYq=z zfvS5if0If@pmEn~d&oip#1luijJbwO6CpR7X< zXXZMul6>TXl01CryTG_)QnYfJ8*O_QZF=DnAC4C)pQE&hF#&&Kl6s z^B((xvONEcS*dffc9LzFK$u5PIJ2$6MLfN%rMpjO{VxasPWf z$i7UYyA~t*C0=v;?96(UE1rt}t!y0|a;X3$l6vR$_0PA;_Cm^K?_GMm6{YD++Pa8V zUci>Tr!1#$tvs*3`;V`)WP8eXID;!6xLm+x#T=1$2xI9_wl#ONj!wqDMDm1}nO`Ym z=HN2C>zSGMMh!Y$po8tz{ybO$?wUz=Fh&zSaAbAyg8f*#JFqN zHyGeGRqHtcO$<-5Yk07hcZUYU^}IY@!Cm12Uw6V6OK=;vj+I;M#!RfMXLD~TOmV}z zeM2F?#3NJr5+ktyFm-S1c0@-ULpvRj@IYvg6>sl$yPSk>M|s==Ok=BLel39ncLYOG z?rP#rUuY=cFBau!?Ck8}1F^_3cMkdD!TR!eF(sI<{G#*-E$-~GbD!TIqmqtsSI2|) zHdm90nTnmhgm0)m9N`0_reb^#MSOnV+17+_UhW4-gLO3bW?;o4XSH_qb`5a_ZwrKx z3_hVrM0j_Xy*fQ?{sl%%dv*^0g|-XSncf{5IxZM;=zO?-jD( z-a}J{U%t8Ei6ZCCPSeSszNtLHKEK>atJ+5tj9E52^Jf>qb?jl>TyfNEdi7Ll8mXoX zhLdH8^Cg5oez9c5sZ^ryRBGQ+gSRedwAFc88DYZU)rLl?Dyyx9xZ_MgLBQkD{Ueo-xO;zc-W!HlZ225<}F_ z?L^xv`c#EVH)?O<7TW40@nkqOyR`xvm8}_V%HL3&a{g{!cQE>7eXBX%(0h%2GP2Rfz z&aD+x36=-hiVn1VaU zZYXk`)-{?y>EGb{8)G+^@V(6BHI&)CRI>%BS^St1EIap+MW$)#+s_>=Go;^nnc|Iu zgL}8}R4SNHJtFTU=(D`!ovn*ll7mLCwKDGY>N)ok-Aqo!`RAzHPcBUlm%QU$iheZu zWXga5R`hhr;C(WcXMU2_$8uJ+WOBCZmgBt2IBDSK<3Fg%Kk+m|mRJ@~DqP14rhkhN zJ=Y&Etty(#;|%<80W(eOD)UZAdbVPdv@^7zF$&bD9_G6WAzTF8LuIaR|TjPyr`W{!k(ay* zH+tCt(?qKST*v+!r+W`875d}Pyj93P-fZ|8`?BuopQgRU&wd93&)L1C7v0c~xN zC+=O0vJ^FAzA*w~yh)j8jv6KkgYG7qvC#B`BaNpO^orz)MPB8=zNo^L1208ca&;=x zejmM{@CAaiVW38yh3%g`xA|{a#eX}&_}SM_r3^PSP&V2^^A2RK#p=85RBGx*dPlp1 z9yTW4ZZcvF6ex|q8h?()b3sau^W&G;Vf5%@r&8Z82cPLxERbt&`sB`K=VoJ{>^GkH z3*PFpoz*S72RZHAX?EN=t+U*4qK?1hdyDV$*7AM6oxBzG8_Jv7qqFSWSu|-or;FOo z8KV38qb)R}fBeu>XqoB0pQa3ujttIX=ihm6O6nI_gXoDjESdb;TMP1xHaY7mYplV% z6Oc6_gLWqGG3lns*P}=JQ-up{rxn|qNATBMmRDFTx%{$D7-eWyw3y=KE9ilT-$d`SJFYp@Q&F z|Lm7kLvBDWnLG|Q&S3l>!WeidWoEQ8SafXRD#IqUS+r%B*E*mebav+T?}Aonv7?wD zkN%3S+z%=loVCGXr$x8Qu<*1_*LcnrQ`Xda^G~b|I?jzRUrQ7!ym@;0^J|0jt}irC zqvdN}-J@Hx7F2YcV4Ttj1>@IE>mxzgzblOLnL7PA+q=KudTHio-#0j)5pj#1(H4>u zmiU-$cIKIjH@31dh8`Einh1HrHv4XJ_6r?oSCO-oa)u6RcIMQqR?k$;?94yS&d&S> z8kb+b-q5N9T}BsEK${}q^#TXUEF_zhA`coppX~Vfp+}t?f}d!|x_QLP*~P-t8^KRH z6^rq$9~%~)n4S5-g{{pd%m@}Q#%Y-~XmnW7+bp2+u?rtw98kE1&`-4OhlVadr)jwzq%a$=o$ z%H=et>a8Vbw}L7ymljM93aS*GWM3#b`#r1ScV_!|&83<8OK${GI+Sb#B{PVUZ4f0A ze34$tU?g*)ZC9{z;zVX=o|qjj&96+o>Mzw-oO`tftNNwRaVOQ+IOAw7c#9Q&%31i< zPx7sMjL*-`K{b-~F)W6J)AoY671-|j>npv%1|!FS)|ttDrlxqE7x?!dlA(g92v@=xB@`ro&i zoEx21=cSov-&@i;we6Y4r6TO+lQ$u3wR7X`R;Qlk`p!!;2aZvy!jlD{sDzEzKq>(C zPah*1iarAR8PH#_vfAE&qkhTJXPzzlZQ(d%(!Frhr$|QX9*IUHkSZY+^7e>7P^La$ zHCZtM`ypBO#e9hn#H0bph1?hR^H`uivKxYHBpl#A+C3-{ACY1gP?wj~>3h#^tWTi!{jI2Z95S4{Qia&#ynx^@7 zl5gyZL|{0Yh?7+6jztDzzF}U?n`0#0;5!lMPXzqj9t-%YWSKOakns~E@hggzEfY`? zIv#9y_=ZUCt><`2w-7-BeoJF0L5(SdV~2YS#DBc5s^>(sE?*+hAO!O+f78hD@E*sW zAr&A<)dq1ygiASJ%66K}mYuJV*Fs^b7qAGm#29aoGQUtP@K79z2BDhB#zne^OdYxt zkyxOi;Xa6ZqRb8Del9f@coWIyue(Th)rw}*M8pK0K5*sLzS|s&U0zw{7gy4QPY zW&{#YMLLxYdk@Mo%q+$!W=rZIUa&ID5I<-0TKtSp_ghHE@3r)i&)~nrFU?dy_C-jL zb~&)VymJ(DP%W_jI*%puzz5xTp18+aFZ&5(@}6-1SLdn|Ey4SO ztg17qTcAJDnKUf?IW(W0Nu{VWnZJ;@obLz!CAD}QeE5Dq3cr2v{Ds1cw>J6j=scaj z^kYHS>82G;r+-+$zI3SR8AuZ?rwxUT)A}km@NNvURnG^DCV{(9U_AZ6!bRAdVNWfd zTzIC)wD63qR>*+L(}ymeNiGc@zWBQ{ zwo+Fq$rsqG^49q#9@dG_vq`{p_R}`&wh+Z~m4YibFIC@-jxpbohkyR?p^ImeQ>8Y; z;frU_*iIYV6zfsz&x6XB4qrSc(mcwS?$q8D^8utk3%Jp7)VK9vn?k)bM?Y`<#ipq}zv%eXA>zHC#Lm_$#Ff0QTSRiU?lWjb>kUEn znLH=>9S$zX`jBmQ^|N%IiZ~$Ri5{@cLLS$di3<{O#y25_5&8_p za?6P&p!kx>oA7thaT7+!H_o%<((|^{M#x8R9H()PElM_eq}dD^&a>WJB4^zz_1bbE!+oc|g)51dDDGrjC&<)o4N z7!y3S%_?H$ovcBuX}%iRK5@SBtQj)nyD0@S`s3r@p&gDB5*KOGr-3Ve{$r(u&#<>1 zXXr~NTgve1!nc0N*;}7t2Y<)B3(hDD^1OK>9AV!JmKIqS{ERSQmrih1M}gx3=rM{b zkG`z0_P@-7#b*{9#|^Kf4AH`GEj(HHg}ehLXJ16D`_9XB52Ji<@Qo&vGJDSYH&3GVu zPzH7he-$>1zdDpa58hGcYdiscMADoh{_&af#6LbIQWUXQU#He1snv>knoStJh6&;| z3zTR}ZEG!hz|;|v5Ui~=o0MQphvV!`=ZFT=cZR^xKWM{cLvTmDxOS(=wjg3gKYmAC+U%2G+&zO$Ees1z20ufFgE-rzT5yFo%TYSaDHn=7r<^Q zmyAD!eGY_?e6knsAENVJh;KyrR=oeT7|Opt`m0s@v3K(B?495(o4PpmBoeX6&=75b zghL6z^KGX9u|MJJbaY8=`#o4)vHEGMcdV;goTj#I^G2bySBnFNq9-&AzRMSnQx@4_ z4+dhPfjuIKg9qvIyF<}HeYyW0-s6ip!U=4?_%Bb>73k+yik*mHHv=0ABVrSW5@pg~ zRu@WB^8wQkivSKdggjKdC=3cF%SG%0GRdlE2R3R1$1G!m|L6(C6G&4}TOGr`M1L@A zR|e%597maCIjFp}PqC;_`kz=w{*(eI>=LFH+0jq2hp>odO-L3TTA@Xxy*h-y(Uv>G zX?)X8ddYDEP!i}^4w<2`;>up=M6q{^_+{tDA5d*9$bZ;Q-+h-`KL|SquGv2r4t?(R z@#ogI-iwiFY|J}ea@Md2HU;MQW?s2ehgF2_#~Q$<3QH%Cy`ezj4@@f1N33njbMl}$ z`B=$q$9c%=GA=pvyYcFqepZGQ#CzR#@V%L%m-5amVM@@nPj_yt@yPGIo&PXdc>5Ej ziq{+TdTWl61wt(_)=l1#G?Wxg{`PI-_;24X9G{)}$H{0*Y3mCQlV0G3zS~@;pf1>D z>|#1^VGy+xJm1Y(dV^x@F*OY_^Or)*+y9Z{0l6vL?74?@L>6!TTM_@TFT?muzBXH{43! zrH2cX|8mio{Kk8xF|Up)3ko$Zcf z=l9v9RzCXuTKaw3*t5+1^xKSm8a{uOPn(Xc>PUhfx|>R{cmCGHyx5YB7Vqn=ZB>9=+-OG8aJ96e+Sf>D z&E#3%)ar2K7qP8vH4FDsir6!-NF1vsS>#jrLAbeGp55WYMbN=u}n zwxfEJPY-o$9h@Exqk!eX<---gQ72yncLUswaQLlqb`#vqaJRs5xH7n9aLeIVz?H+@ z1-BB;0=Ei|GNlY_;nu?8r?T04xVzytz}3NRgtNif;Tqu_a7}Q{a89@uxK=n9+_h$l zO$a{-_Z7Imfcs0huflx|?yulL&+g^;&1H|h$J4#7yQjI`)6?AD<0(d?P?%$Gn4_)P z-sS1+v3t5*EgklrEnUqbs)*Y)H*Qz6qw~S$d14b@+uXQKjV+$;=AIr`M@t5uZ3h<} zmm0R)*08;;`N6j43TK2-hdw}uiyhizCpa=m&vVlTeUir&CScv z+2M3umYu*=mYrW&!*&_bVy&pDs9kkgzKDxopGP-s3iOQ(;-{+loNP6GS#ez9fyn#C z>Gj3JSH`i=Ex*0VF}IEE+2yu3I9lx;9nEbP>m#+R(sa5k&Q8x@AfeIciZG1$?U8|j zK*ACXjIF8|^o7FWO_H67#GwC94;&yeW3s3!^CA;h` z4Q^LQhrPYo5*VwuTdDLiPCa*pcl(Aye(ny1d53Q}pp_lz%lpgwk#V_SgSqGC>F(@B zF9hav#%h@%}M@lQf{P zrc6FGPc?06cYC^;TU?m6x~Q@;PF9mPHE6*C357S$#nIg4>bU|(b9Os4r*Uk5(B8JC zIjgLVz~%QPd^FvR@knCCFk<_f;W-qk}zpt?{REm}QyH+pI+xZB}b$E)yU#mPcY&xazTo>JAaC9Ug@&$+G4~+3ZEEb7XaraQb7Y~4ciA3Oua&a&RB9pAT(lGTzF-K67 zP>EH%8r;+8%QTQ0HsXsVJT#iLM3=*}6RBZ+kx0TrNH0s%74Z21+Gw@*Yazs6bkovJ zJ}uwm({fIJm+I3pPv5kxlkZl2TKegGlj_@4pV$n76PrQ){i@$aJ|%ttj*xf55y7{> zdEtC;eQ^D7ez*YK0Nfy46mAz>3@#2wbNdJ!%?YD$<8Y6{JqGu2xV>(vgcuI90Ztk!*wl#Zt-QBzfZO)@Zz6AKbVNWEQ zh*t%PYgM^7drxmKn8V>=U)WFc?v=Q@yW2dDHdk{;&voExyEd-I?j}zUxY747R8JP7 zE6a5Kc(!EWK|kw#K%F~!+w2|Sx7ytxlS(wf43CBeLY{bt#-T^@%%Z>duFpK;)H%aCt~Q(TODS!h~fMd4(*)qG?cibvrA zzlu{^69xTT9nMa*UZ!GGugmGeD#*JNzQjnpo_CFe!=W$+fvLFRnh&}i;qQzB&@nPx&#i(krs8Z^ISp~(P+{eMN`~)D`8C0g#uL$0l@)1T@3l5`ce|Pd zS~X0rWwJk_Q&BK_RC%0wl1vYIS*&;IIBt7)x4X5=-rbyzN%^eHj;Hp~?q-K)bMv-2 z@$Qzgt0>Ri4UOpn5stgFaZo20!Rh4eYKp=*F)Kw@C`wsB- zkyt&aoH@D}20>qd2Zp1GJydB^vDycFsozGl9w_E#Q!%<1I&pZA+ugJ%3)-vkJEMV^ zFA>U4L4vYX#6i!DQ&M#0>@)%$;Zj*ti!%A z*c3P%bu?Zp)fzZ8u15l}8Tnxvn zsM-iKwSd>fc$phQb=G7}QRfy^w+k7k$G4anA>nvp@p!17(_bMWNP0Eyuntn7Qro@peP~8y(BkxA%~vO=GVO&J^?_Jq7|RD1u$py5D{5bo`$g%Z2n@w(85V8W zp52$-U7hW&Zim(f+q1?%dqdNfE_)Ana7^o144S&PkA@OK&rl$|L&Nn@HZE7MyUX>U zpbVAyp)6bvH9#t8w|6vcciX!lb%BlUR@a2BnhYg~Bqbpz_KHWN@57^-@e@h)iw{jM7mZ$fxPwhgl60l=fdRpp*f{LF1C+ z^i8oS(C!aLh@gSHt#T zB%at&u^k*JCTOf~6pzzWnGhcSKoK!0RJ8GEpdWKTYE7v)^aUX>Es01pO0zfTYQiuj zTn>lDx)0MFh#r76!()M6BY}7VTH^@Vp0J-=G!64Q(a!NzVlGVM8Pf1{Q{=u8sA*z6 z9{O+~lW=VSxEt$ALeg$I zaTMKnudO1@nYIcbF-92HG?9-W5#mYCL*}i)Y8o=EgxVegrvo_G0%t4$9*NJ7Pxj!s z_|{zo-+E1fmQ`*$-q%40l>`wq6?wZF#>U2~vK(ZwULk`KeJMZqLf(Z>A{c$s5>GxY z1?1PN{#w;vr~2zvpVYz>&#wBaOxWvCznfHF%xj3(rGATf3*YVP_d}}xfa>?EK8bdO zUzH(y*Vr2!_}(h;QP>~)F%`E3e7gg@t+NF^tLs6RqnR}z)6i%%7J~2@3=Bo73@SgB z9gowZL<8AWyqr^h)P|h5zXjz$w6)#tL2;WE|5(}sc z1=b))9v{?EUUJPL$r5_aK>tWAl-R=)d!hjgX;D^Pp>rh0udAmQgVt5giT&e!am-&* zZHk51R7?fK%%+x1@QRd=$>rX?j@!5Nbb_bT_~G8>t!I8Mih5}P& zHDseGT);Ez>xcA4Wyh%Z(M(rAG+@2A&nN+P4G1S(6%m#W-s z{7nJy;q&C6wGsB-(h-PDA-F0}$fTF$q@|muZLet6EL@UTpCjvA%KfUGdli`*WdSE3 zxa^8T#;AoFxa^bgScV6uP@+49N5G-cdX^0v4MYhv7Z&wZk4Am9GTtco#weI4tTcWw zGwD1vC4txqLN4I?DUg+;cbJL=*GGd8OSw+!6ogVCkRYK?m9<4>#5_e(KP_}BFOh~p03n9{3iy_e%^jV+ z8MqLwNOORmFL0qTf@9CrUeAOii+n41H@?V6PZc@RI|+{RLldMB z1@)tpmoyGN~q0Wi&gu(UFFclN@0EQq|Wo_9Q4Gj$m zjUM8S#09}9st~IoJ`aSj@ek6<;VVf^WXX;zcH*)VP=qX8nQ&?^ELqfE6i3pjO6!a? zQN-tgliV#Pk*qLv+L;rdVDrVzp0Wr9@)Zp%)jzZxYQ%s#h~!-;e?$a|EVf22Te9cw z4w{&lyJWR!N3!Bd#K1@$Ur;d&DF$nKNT{7?J}1deOs6OcT8fqgFd%pwvO80wppYE8 z&xUL2i;yw39gz{kuo#MDIdJ zOl8zmOR|16d(sYSdg;JN);c}UnnyS!H<@9JNQY6OwTYTj_NUBC&=94Bj$Bkb6pkmr zOrWfoAJpicM8pHyOFmN2)KnZxU{Adt+zQqg3Ls^i(6|fHhUN$2V*|rG)U~+bcwEXm8o3Nqg!lksCE__e_2+hZbgXE z5asGbklrCAn)}FN0eyc?da4EH7VINHrzpA-SH~1Me>we-zK-Y_iwq3~V)K+iO)cgM zG6qu-sDz>fbMs6y$LUs{8$PE@R3U$`ABBk$hXP`vA?C)n!w3yJqn*?^Qr;yDWh4|_ zkvDXy!=W%b&OBl1;iC5Mu-s{XCcc+;WrZdjI%iXHDAJ!8+73$q zM~kbsnMT$QZG3lZX=|$xvyj@)H9j?yraPTR%wTiyA;ee0`EGQ!gM;b7q+LiUl#GAKVqMmE4V>JVF%9qIt zv>;t;Mop0wFFGuZWwL39`cQnkTcw~@X~acepz>k5Qh_9=BqDK-sIs8TC`LWu%z!Pc z>NACDYJN~4?}0UgiUUYJi7{+-j|O7YU%(R+j%@Jzp}4%QNc>LY&#oJ2an&%j-j2>K z9X(y!(#hxGM*8mNj_!1zTkZzZa;BA=>aOl2%H6^DD|~kOPzGmL^8;!8*uxpFkhexbgj{@?)yM!;-}?xMa6FdL47 zHsGnX@zXwM<5smI3WOsggF(b`L(f7>OgrWrSc=jbfc_B+40?va4~6=DBu!s)UvqBU zN@(q`89k$4N7MP^L74n-KXlQIj0R!7hF!SM4(_zO+F)TweYGRP#YSjG!zdIvg1u>? zgm@rF$w=yZ6O2Pi#V*1~TWaqY8*W^4BVHrw5uZRm8E%jO;bEzKRSbZ74lBCWx`tG>Bq7g8TNz% zD9@-m7FqP%zD00d@;0bH;`M@r2#Bs^CHxHmWgeTs<|_xoyRPvMz0*@Xkuut3XsxYcZ!16p8jY1UD?kaHbtp%RaHOB4z`@ zI%4x*-Ql{t-C&?VmN7Jm3Y6HGQCX6??VA-Z7Kje*@nl6Lol|@VryVNl3FUrLYRIh| z(jSwlq1r|w9>^}Xd89yG4l9;WKc@Y7U>BAS!7h_O90yHB{4TlEq%qQhW7kq3GZU-C zOjd~<(@Mb`p#+UvoUl83s9BT)oh2;;!hT)bI$FQ6ikSUuI%dBU4@1c-xP7j!ofI@k zNBs{T%82~3^y?N1@FaqygVmTjikAfz`{^E>xu6{<3Zth8E(Es#ZWkP_V>heceej9# zp-rtI93>)`2S+yau=euM?l8Rr1pC;!s=GH-)z;RMqw@gy%!JsB;Yx5yz^MK+LG$AW zv=kQqUu7I`oGrm=fpvJJe|S^O%%D?rdP81*fqZ~ppI@}Z>K#+<_bEsDz+Oj6Dd{;N zO1(s?)B_=souDfcrq?Vs1aXfH3()Ri%nzAwsNb=7qP9J#6dIuM-b4yTJSsfCvyY&} zw97U?JH@f*k+2{{qdS?k427^!jP3+UQs`ZXLBN^}{jJbs#l|=i0B==Qwfqk|y(re@ zFwV}vVlNV|_JhX=#NyRd*lINEP$ICiIv(qP?eX!X!&h}86nfhw_H_dnL%&y)wo zi%lHafX5NLG@&SD9Wr@F`BibGtPJZ1dcmk%v^n-BbT-&5+N04SFfO#eRu?Ny5Q8lc7x9Rb-2HW%YOgq%{ucjxEBCl1%KmW zo%u(2fA1!p`DwiW3Vu2K&%qzQMQ2`gqt5)(MLP2dxX&Tp8Ng9B@$A5R9>Pz+UxYMe z@XsU8uLuwP7vQ(Ujllg5@qPtY2t37bx5JgeodK*8{=dV26Yk&OYVf@tE&v?s;XVr2 z4wnaa67bvM|2zDRa3@fQZz0V__)AgVlL-3};9mpmcDORQT@()Y0Ne=NN8vsJm!Vr6 z(+QE*6N>GMLvg@ZCM-=;kGA$?!lZ!gNuWVN5w*SL#EBUxs&(!P;CV4dk1AwE7+Cx?&J8|| zQ0!Au*OjIPq#Xi3fq6C%_9g{wh_=OTz2GHW zq}U=pUyO~Ot<_yyv85G9g`?QX)T~QMI;RLdb3?<@Z~`p0FsYMhC{7gl%!OkADHQU= z#?%Fb^1ot%nG-|n4Tz_mOvNw+RIfcoU0~0REkM-0Up zRSVp{Xoyw=ch6R)okgXrOvN~Wh8{bByrBaICxOFW0^S`OgvN_b4x&avZiX$3cw{;U z_{sxc@|H|@D|9Kr&lJ{0OxjW{z{C=P|rDc`!S6`Yik zYH`K%;1nMhIZiYKr9p?ZMmo$nuZnk`UfHG4x#v2PziU8gxf;H7+F~% z&;p|nG~N(rJCz5$VqgcoxS)06-96p)qRlg5Lhq}_?Tv+Z2<0u}tG!p%wt-vlhsfxN zy0_R_Aw?*L;OwhjUne3W*HAClti5kBUdz(ibwWAqTp1LDzKns~i zZ3(B%$V^<$HS?s4?ectpv@};|@|=^_5{7uvK;rW%3++Zi$X})A+e5p0IOIVh6U+sO z;_yq8R@J7chl(~#G*E^M+8x6y8P}?lFX|Rj!WC9*XZ*V}nkVy(7JMC|EFAuB^3J z9hq5uJH67(fz`?tVGeBVJg{~1z}8;@YZc3Hv$z4FOXaWBwn>+5zBm=Z$)8PssL zG_~8&Kf*g4>Updnjy^y*M{|&}oo-@KLr6}S^-rg1YYPd+Qg$M-MYvAYV1Wr53=e~& z(2{}HA{~u`Mj==`gn5?eA!-h+GD5;2Vl8@6JTTtgaVRgh2%-UDmtjL2)5zHQ8rj{^Y*@K zaNkZMihl%=#c;oBJTyMEi&u{~A37=jWb#zw%t4h^M~!|xW7S<_*&?4R)QQfb#wU7- zcr+nYr{@GglkB#*0+*`e6-{&1yrt?)Gn~&(!l2St<+L=d2QVkZgDR;}Ihx#JuGp^H zp2&t)>|EjGrJE*NmKBEOTZmZNSW{!*z78!tvbj7k9TwZQC43bO#oKXuzf17(kgv3& zkS3gtFv>|vjYD)IjW8C1Zh2LJn3rRm&UJ}P1H>9F@Tqa(MPg-YG}83Nd8EI8B#M&_ zLgPk#Jv)9TrdC|;>Uu!fC__PawYV6JToNul*aY^u@kLqYEj>*t#a%sZBoErRV~NDs z4pg+G-Idk{(&(2)RLvx^bJs9kep6GmURX{c&^0_*%SlwEq~H|813nNDHY_$dKVY<| z*BzlpK%jx$lE5Jo3Hg#L2ua(iHik5m2C#}1V@D5@AZ$25YLe&z{$jQb7Ly&FteB4f zOQFd*5EWEjOO}nvJDcBpeFi}|9 z13SBB-rmd~!6TN%xqk@!NPH+79i*2`*at&EY2}lJp}T2B)r)A&?pwQ7=*DB%N0c*F zQ+H1z%#^9KvhHZ8pNy*0hhk}qUY#QCA{3)aYNx0#T^=GSg=y&W0MXy^Clhexu&of~ z!6~cEV8;NvT09v$lSa-0#1c^*dd6I^^wUaF&zmqvxjX2?l@%CbWGWfqjiEu>5KCu4 zY3+#waR#)*#@(^VAdWurYD{R95Z?)TKGu$16B+_d0hq{3-pntRj+wcLO40FPJJd=v zmg(4jM!!UmfZx&>O0+|65Ch)f-h!TnSE!{MeIx!Z$j(Bx0At%UGCaJ;v1dpHVAtKZ z2U<`0DW-Ta18Q~8&Q;VK+AcwViTyYg#lfD=RHPmQJCSl;T+h*iVg^($5rop7iycq>uqx7}N_E zEH)Y{D&f-Sa0Hu;j)G(8;xtT!+EK`6G!%=2ho)>u4~+RiQ&0jT?5j6#Bm zj3S7L03QDyPBtfGr%ZD=eTznyHp5xpfiT5Jx-9mB@}q90%>q{zL2fya!FEhlvtp2Q zTmd8w0n16C3){V}CT#$Tk>54u81{Dsz=;L?a{_3>=nX~1R54F5W(?8&B!4s?f*!)$ z3)^Svu4&YI-2zjdp}43Zzhq&dQTZ$N=?S9Ck}a#SU{!A;y33Z$4B1FJ1fZfxvgCWwU@jDUy9>dG_Xk77?k9^2hbqehIM z3hEcxQ_QZA+hukiJZcQAEwMUeq%b?jIV#T!C$Iu^S|f zdpL||`aS)LF&2}?#t>eBUDz#KQ0#S<~~E{kd-1Td_j{ee|t8Q}Nw zI>?;hc1Vgs2d}$k^lJw4`)~%iLRj}hJQe43#n=F}(jOW`pM&55eMCRU#e^ZUZe>lv zyruHKaz8m!`nya6$h#9Y@(h5r6Q>XQv8NC=kwH8i;=r~uMkP*Lmz8y?meIsGA*4To ztu>gHAf8+{jjjLXk;*kOu$OQ{)X&QV*2zICDrjb39t=~{vw{hd$HLT7t+*8dr zS=M@d&AiLA#o6^y?{H$&*|6$?frk^}KkD|>R1XXc-s^E}*fY8^{?YqadRB(-s(qw! zX!tJA&in7ihRj)oY$Rr9&6}9Q%}q?vvFSFQVy3-)E0|HS%{tfSfDWZN+Hs{$YgegP0tF;TY$Di)inM>gJ z!`BQX7OC-XfZqc6jp{eGJ3TkS{SDwZi!XVha#j`>6wf;=^lhPv&Il{jOt{U{ZmwFSR>vj={so)XxX>znZ^30&#d4a%{3a~7jD@BJvsv#&5E!riiJC8% z6S{DrX#tX?AH$r`YoVfyKtTg5`KC^orloPMQYG;uNC#O%pjKR}{|lWr}W@jxEY64@+Lng z=h$sulz4{!OlPJsyI?~48{uao{C}HYHZJ+DF?7GY8PrrzL;NK|V7UfgE3|4?wN7`B z#)zE^hz&y-HI^9l$ip2Ty3in6B8 zYHhfHZFP1&*qZ@k(LAXCs{R@MH{lNHkK%7k-54UHso|)9gsB}vr#=Ss3(o$Ly~cjY zZdEoY8S5$Nx`1g{IDIbi}U682#C2~m9EK^(89VWlUPZb$a|f=9#rB!k~VwB#OQDL^#>u1 zcJ7q;NfIEP^Y-pql3Kd0qzH(_un1v+6Vf1dhDhv%z&;{O83Saw4U;W0h^^oxUgJ_G zNJy&jov52YXcY)+e_sf-y2$CP+v$pOCxM$n7emgf<+zzj5s>JL%m$Y#wkL zYtuD?H`K1RUn97tuCDpo!Om+0*VWWsBNX+$7Vf&*nrkFRxf`z)TvLPKp6+%B+XC0! z?!qlR9>WV z!)O?KH-S47k4}m*#DMG5;tqvqEI7SuY&gAVKN?$}4WoCBO{aH_Ri}6DDJouAVqSE^ zjaf_E_@j?~eD5dz`0?!JPJ>|`ZrnqHrFnddl@9!JT2D5hnw{e`=P|u`lfioF6j+1Fn_@9>fy0gw;QmCTB zyDvM#rW5elmC(S^{&kmjMov#~6b13q=gkO@L4{|Z4I_9S;PgNVDG!XvPnHk3!f|i$ zWoNkx2+zvdl_>n2bFM}Kr#ok|4$A^pp^Asfqn^hCl(GK+9dMN6is!ciPAxFcgZSyY ziPT`xy8x$r)jNhnh~TAH%&w&N((W#z03ibdo)}9X(G~Fx^cQfdmsIA66Jg@qiUwEj zI1=%N%&f-O?gpU%F=$nI)>%QZwvLX;-bU9IWCO^;h=B#fVI8am*4nMYTPHnO-HIRz zr3-&lK9Noq!Td-b$RK63APg*$GBLo(VY8X^)F!CQU~e=hR5hjrZzRu!k?t~qn-y?F zgj_T;NQoVw+l<8pPHC)}lc4mLJ_jnbwhY%v(W)nEvUaSHQMEYRp0?uRG2f`Ld*4AE zp)^r3A$I?Im?CjO1~8ZHZnZFy`P}RTyHBsQ7mTy7m{8rV+c;KuTJ~g|?7|9W8u5tF zL|iC-gFc#<=%o)Yg0g-ZE9zE{{Fw_1_Sj)HMXKVUrx9;d{%hPg90nu9=*k~)osYxO z?q=dpu~bWn11ah&h@5qvSe`5!eQy?Zq z9C4D#Lq~*E<)FAi3H^jvVh9KGf#rEO7*opwNmk89|0>6ku5M-iJ|~YzPNNe#)!GY{ z6S5CX&$9~))~lv)H!M?v=C96 zYbB)tE^7g5!uDN5jr&)y#mQ-DRCiI*MH4W}QryS}62e%3YA7yAp@Wp^J|+*EG>*jg zh|#9uPKS4auaD5#Q=zvOc;msy$dF*!A^3r4L}j0Uw=dkEML_ff+L95c=hVar9E3x2 z)^oaOL7dWy3vL6SbVLJpf@+`Q>?RF#H6bErl65}MUu;b z*=b}S%F09w#34|ej~b1M9|0MOiuRlnmN}D+6Z@H)LR1=t;@YoSc<7Qic|VBSlwvao zBAAtq1=L{S5%>2wdpQXz;v7!a9}{bZWK)dIC}|fc#Y7XM?uJXHcl)Dsyb7z+?f~vt zU>Jy)3)a@|R6+Dc!V+B^o;i^jqDu(XokNK*Yrv!JV+o00jvzS$$VnwV%?M;-V+DeG zc50}u#Pph-8_s@YJ~7ABy*8{7lTvTUpT5_LxM)>Z;8536TJ@k+Xe8?csS|0!i4Vze ztAHW(ya{pCGO#Cx-mZp1-gVO@BjOXcwJ~9|qyFJtV`MdjDP?3hDol5>L-B56eK0fF zi7_WL7dLyiWBk#lrMw(^6o-_QT`evEvEE`ih5@n1fm4Ds1E>iJ)H&cE&W81fi=&*r zA=J%|(=@{(F4PrcDj^7)ycEu3&&p90qA?9HF{v&9@l>st(89oq0$dKRs>8Se7XhEp z@je=z2#N2M-?A4Wt@t#7JTQj_Ge|`s1qQMa>7dSlo=#OJ$!b#69{lc2Ol`I?@f$8A zYO4@L13M#ri{%Qa%n9lXn5GdiQN%<*+{z`gix0|M(otS{+n($P&@NqHy}-_88YayK z(f&BDA`%KdSvbVQasta3*}nD%TlnQsVAJ5-(%mcxA?o8s_rjR#!DWGIC}o({XVEVl zn>opbvgc}~Xzf{NZJ!6;>1=AJvrK9^YOR?sj!xSZ7!LcWS2;H0y20?E3l|WIs99lz zA{|K8K^WrKK2lRd{i5z}y5*9}A%2al-O;__k#)iXDp0d7JH!oUj@vl~j_ZNVFxl*< zAD4ofMTOIlnGa4t>hM^T&?D&sU5o5hO{@*1$b4a>c!(;Z!{Lx-tEa8DmG(^`ux z(jb$GtzNwv7s&arXkowtxy8cENBF8$xB^sy#SM)FR^e(A`^cC`L5-4~hTxP$g6E{6 zpXhKk)o&-@4xsN5m+INm*~TebiQXOD<3T_-E*G&kAOR*i>2@H(cAWgg`WC=kR_THf za3!JGfiLi4&4Vi09`_b}hV+ z@|48MI%$bY4S)zz-%9YByR!n;Wd*FQ%?hYf1B662A1VblV{X! z5cPS)Kg^-Jk-upu#YJi$;*_rvB+I8Q4JaGt6Ons8CQ8f)HK=L8TDK~_W)iIC5$Xb% zsnTGY)ObzZBh+UCR_k2&`gM=gt`h<4(gB#)_}WLT1g*(LCn%;n0nNk}=Qtp>kll~E zbTS$kys4cGH4$6vl?afD;eN81&x274nptr@gDSd{xhq$9jB(x~+&?#F4PvTu(zPSj zW}$3ywamq`HiPAguyt7p!Sc%{Mp65BqLJsKS)W1kJ~8jkLMj+fF}u#iwjqNpJ4zEI z1PmFv6$C#)BDcz@n_<>c_sY~S5-xTo(pQm+EvY#W+PP7!>(iU*cG@Bjj738@BufMG zsy}ZuUt%ons-lEsB@+4D-Sfqxel31@2D*|Dng^v77i|gwZa(a|;}K@KV(bnEKoxW( zbuSz{G@~XyPp#KDW=dXTO8z~ook5Pq7axZ z%b|x%XQ{2<6d9>wE0Skf$J&jt_Y4ce1Q0BU%j5% z$$J1B?blNbpBlNl+Yt$j(eDaeM-J*>r2$NA!Uvtt!ereo`wHeuAFdW6i&!Yu=1g1& zibY^FMJvvgU5Mty!B_-J6uR*gr3jAV=KCR><@8&i4qj)itl{u$tm`V*i(f#htfik~ zsa&^;5`6RnN%;X$zJ*U@^IR0N;4 zt`ffzekBPq!E3J-Tnhq&?6`oPE_RU&;kA&}UJKc}%5~QYu0`XC%Q)UAH|W>qnk9Mq zaqt?N0Qx;b%$*d7g%WF47{@5-G|`nM7C)65$JIgDRjmZ;6H8d>wk+({;I&3voHb9X z`EON{ato|^=x!SvY88Ua816Ee0}xm5#73gpg>Vc%-lExl2uW{?SY-R?`gmd#g$k!l zXrQuT;MLO#BWwg;p=457B&XE-n3yvX>kIk)fpB&*Hv7BRo)g<_>Yw8;efzV~)(UfG zOT3cV7QoK3Xf2y6x|@v`Z)CQGu!}6Q;V0yq@DuW__zC$o{Dk}i%(nPJHh$A~Hg&TX zrlkXHeCZHlx5e0a=^kdgW1KO*4?icrAG?1O_!;@XVB?l=u&LG0ForW|)FQ!Q47wKXc^?k$RKOGvRj^f6`1^Et&9_-kc+=MR;s zUH__#k6lv6KlaLrV+TL_&^^n{n!)XK+utpR6)x>LlB35Utsv7TLYP@R&QVe$`5nTx z-GlZ(yfa%3=E`jb^Dx{CaPye}VRwig4y!XfrF!9U@mD8-ItkQCpk4y?5~!Czg9I8R z&>(?%5|}4}c@mf}f%y`cFM$OTSRjD~5@?h_qXZfyuuuXEC9qHeO%iC5K$8S6kiZ2J zxIhAn?hw^1lE5MfEWT9$izTpF0vFydfD7*z1X)Nx07~KT{|*4j6F{8=>LgGnfqKeF zr|2b6FM$RLG)SO90`nv=PXhBKFkb@mB`{wC3nZ{W0t+P2D1k-^G)iEhEK;Ea7D}K= z0!O9QMd%$7~DtT#^LtD?SuO?+;O;nf_nw-HMnWG z-@q-yJnDvf0M15pXA$f!;1a+aTmal~QM`NM{BUHHu^8c{aBXm7aN}_M;64lYCAfod zC?wq-N*3s_m0EF^WpzcBwRYXzb@lh&XY&sPA07%vV~O2kAO6TAVYOOGqdEQqVK7*AM(j|JK4jmMSc`d#{m*&6E!i}PSh^w^!7 zZwo%OM_Ik}xKhTJZQEsW{vt~7gJ-zZheyPn=Nj{y$z{VZ9-_clO7xj|V?irdSJr;lV(Lrq4_aSL?T@~g`s~3M zQxp4NOnudT^b9L8p4gk(H@-LZ#Q4(Iqb-I*$KFUjt}Hj4d4{cWA_O>|K$%Ntmj^q~ zvFPo6HzqG!FgW)gX3GngJ^4l{)BkBvYmsYw*`j38yNczt<0fFqPh&FT?akMzPE?nt z-^OpZ{}*OH|0Xm0;V0m1aM9-$wCR)Q-di42mfhNSmy?z2&#YiKB$Zhn)a}tb+3I(W z>ys-ktqtD3>kQ~c_&}G=#}Dbg@$onESd0Q2YOfw0D7P>dN-V&npj-0O6tXQcn`lU{E6u#Yfv1@Q@G?>|@5Zb{fS_ zBeu7UZRcX!J7TpRr_~M$D2leW&I7GhK)F|{7WD|h)d|edyX>V}W7l*SZKxKS zOV$fhODRKwn>O^gce>M^D{D0#I;UbV(Oxmg*lmLhqj66u-CL{o@MzW2L6%K&C%Y;{ zj!ARJdDR!0oJ3!OE6rmZekRdA%o{ZWu@fQ1fcCrigT^#B+h#rc{eFkdf)Py$rexsJKc1J`ua+_Hlub6s;Qs2QyBc6XW^ z=>Q6V5}IxZ6=LP)5dm zS80OCs$zwd?)QgiMS_R6{4G5{*Y>QC ziUC357IO=@CDD#Hfy&AAX3U*_<+ft9%jOzXR22cRa9QcYVM2bRf)C=7_Puc{a zlH9b3w1CEA7u(PVdM`CI$;0Nb4ZdDM7;ncRyYd2eBVVq(tT znu{sGvmW>+bJ7ey8TZ*=N)<{WR(Koj0?b_KTvWCb_}93Nz_@X^#%LV2VZ>}3jP7lM z!e{aje4E^hGZP2WyG$OFo6U?JnB(f-$XHAs4x>T%&-zSuplFzfZzyy6oQgq}eMZIB zZXPt4<+2Y_MvM~O+b@#%Kgc_2ld(t(|JF9NoSg{4axq`uAaGHcuB?fSv_?$HNbV1!m29a)=5Q?_%=_}cPIwE5P2AUGxSVK3zV30dil z=YccG$VPoLw@a}rNsKbIN9B!XGrikWqB${r@7%20pc-huS+^;_TO(8q*KME%G{P^^ zl0;TRyED8Gj=mtKr?G*Qr7<4m(PBwG^<03{@WqH9%@*jwWFbMKpQe{k620j~A;~)> zJ=*cZWy2Ta2H07ezQeVi+8A!>AZ0Mu(nZ&5;akn^d|gNulEJa2d(%??(7^;!>~BIU zrMz73ooR_4idXDflh#oDPR9#&#f5Z?Zl9j^47v%#WnE4e}Us_v2LwEyq1J0&|&ToJB^b1ebfLi&_-Z6evz9U zqL@UlFOAKf(zmyEm5edYkWtI!8H$o5x@_qn2dtq4{a1dHitD>e;?hZY#7~JJ+;&9^ zsVx?CvKw>gfD~`#EQ~KY(j1`&q9gBziL?T~UOz5%lKFRwUlV#Eyjj(Gi#prFG(S#l zv%mB%eXfl;S|`K{gfC6TYq1+`@M$c{2A} z!`J;bVWE%<|7+oRnRjr$@jRsw-GIV!EA(VoF)$uq9Nq%nN4SZ1Gvs4*&-P#AG){O0 zWq4mMxxHJ}$?C>sNF~K;Si^ffeT2x9(UC*Z@%I0Hir(*1?D{7u`0r9|o=7phla}`z zY&~uG9nT(#jyw@n$a8TzxcCl9NA+){G|Xb!vO|icux3&_Fyk7#83Qel)DKLgCT%BD z`vKtb5n#g?n%Zs?GpKVN^Z+G(Mvbp{J*d@smLbx$%rR<8$UG-=d4a32T$u?Dkc=Hl z-9_wUo@+ZDpyO3SoKP|No@TF*;Im>p0Ct_vDpR@zvIX^ck;q`b@ebMf;Jd|jmz2-1 z$Y6KndAU6Jty>161OH>oE{%C)YkT_{kyUaL)Y(7RI0a50zK z_|&K$U{}CLB;ntoCm9n`71`(Tpv!w$iaKKWYYd@JLYH;*R5QUHSqER8;B|yoPkDpV z7j{xvROTlgW`WL+jyw`o=14xe;Oh={_6=X*S*3~KjUA(soY*z0uscfMNF+0DS9Ii5 za2asy<+z?=$2{z?i_tQIUFF?ZrIek(r~2LrEIsU-0vyE#^jeIyRW+n$@2hRW7-F>f zeYHEJIQ|lT<9T+U6FJD*Nao$;5Se${5J}1IyDFVOc%i5i-wBSDcdCZoVJ>XsW|5Td z%PGGdGn6J_WsdI|Pca49MJm-(wbLBbt~YDv3G}X6LK@aXw9CrwYp}<7$^M0`mLz71 zW2umYuk6125V}y*V4vhAYfK-P&_iO>gnO06I>-oV5l^HqHAYB-5mKP<<9y*3o>v36 zWKG!(m(0J|@9Zxywp?BE6+J#*kW!{n1Q|qdAG?y3#YMm6Xc5iU#rCjQ#rF!>I9jj^?57|8% zix~IgrOma;o=ogc*&;eK$*ptijwH$}=#R!8MXM?EpS;}zROX|Uy6LE(YP& z;Dh$Z*VUoisTz1UP({5rq^7soC-!$um=Px?mrimpQl37| zNnu`SJjKNX=cTevU~(z;x(5?HYt;iC25@t_D8U`)++RayUarv{(YeP*;J~P=nT&E- zgco8b_C>dJ0EA`;{hS2NkakfF7o|9vN;m)ydZbJLi=FgxDj@!-MbA{)@&zX2`4;P?Sl-OE# zI>5$L;w89hxU)Co)?g#k_?XD*s7w|vqplFuF(=2q8CEpj^!%%bp8fA0Xgd}#3+O!+ zgUU4OWqN<>H_}qG5SsdFddhaSl@(%Ldg;P6y7% zzYlHL?;$0CFP~F+*_UmeIcpT_UUV!Il?sKMdF2<57nZBsQ#~s^onwKUZDRqEE?6e& zAEK?x24ODhp0@5l^~!bsJ{I_v^p2iCp5lt6uM-BB709XdPnFvS9lY7yTRpY9ZS0$o z=5Exq812cd7e*_8F{d{TPJpdiq>xkV@=Ko=;Q?Ss!{(esuK(h2KJAw}Mu?0%qn zouk_ID7{Q%6cxh*YiYwhZqA(sIS!mu73x{zsu(`ECe5uR)EQq>;w~@t{CZ5a{nws~ z!Tq|AB(Clw^i?-hrmGlKq^(`|+o3X57kEbL;CYQI5M9tJ94sy!ESZ_y%|e4zGRUdu zCT0(I$cp4{+e~VvIuI?S_9S;>-N@_{*e3cwYk*b%I>71j{a%SXcUht;FH7n=3R)*y z7FMbzXrHo}ET-wQlw4UcxKfiM((2@HO+Xi;32-s=><^{nx-u_=^r%Js7{029ViYve zr&Q|aDgp{cYccUx4E|2RHr?)xnOoS)E_s+y9Jq}7j#9;gnq=lc@!$u#n1GTi8&v4d z4{>l+s=uh1J?0)df1FzA{iLOkUv{0(gKPkPJux=l~Sp^&>}) z(5@8B4yrqYicXJriYMcjmw8_B#Ftw=lqs&_FJqjk=$nO{YK$sTdoqN&L7TO1u(D{& zU{TVklX?v&zEx7ID5A!Rh`qti(_$A0vi>^k@AQYWW5nj;x z>Nr0;R!Y{rM9)#zJ2#lbq~aIb`YEP?*`MxN>*?*F8_DjY$o6T+dpA^B^vhApbAyZm z{-Rf%x^7MY_VTw3PIgCU>$)eAP{AKIM$NkJX~aLD&S7^_VqYC)*yF%1?9Sb;IOuS% zN}dkDYwbdVqhc_|$a?xal8RV&KcxNr92JP&Oem#9z`HsF)SSC~bbegU9bRZ@tPf2y z4R3<3Sy4oEUL^fqr2n$c{*AsSI#L~_&0j!2O2un@2v7)%**K;*W6HX7mC*0h|k>Msk$+xxWB0C#`LvxF5T$z(k*o6+8ZjCZlGTV zjk8rZ;%CsinV0iC^viVKV}nZJvBAj#y?d6I7slJIIm!(^&rs08>i16*h$i+0|N4wO zhBJ@P z+4zAUqphDM#JLh78N~bN3A$3fqrN1?PkUlq@re8S3$iX-6R9M!w(*!R2{*BxVLp<% zv*fjL+9vWf(bp5*K?wBDBfb|dw?7@aBIUlcic=*PPcygarscTeWfe5IQ*h36(!PCS zyfjCQ#n~P*X20Mn27jRZwj;5JjM`PnR!2sVj2RiJ`!L&LkTcbw*R3gnkA%+i(6GxP+L!=}O>pI4d~DyIvf4!(R_-{&#W|uQ zh7k0R5h|Um@`Y!$E-f(mHqN04KOk#62V7NRZ)StL(1NoY_zCWK@FXJpWTM^bP6nkh z;CSk@WM9+zBK9$zoRH#JAm)vpX*bncEg9Z<7L9ijVrGpd<9Fuh*=u@R5`4xt6QN&C zbdWIg=wjNNalk-Td%PU8Kumm7gI$#FyYHGeH4|SHZ&KZoo6?_IP3c8I&KitovO-@E zeLznI5$(y*9n;>@~G5Q9O7`fi%Za z6AA4-MRjjO8O;FcpXSkbkvvTkd16rhtvs1)Nq;EQOKqHx>R=k!2ChNTplnbzs2gG$ zG!5DYT|;cc0`XsipSSY@bC?#_L|C)h8}HJWrFjgs@hEp)Fs@C1HqOO1HqxTwJ#`08;vCM>ejKOS=5$?30!DE1%7L12(fNh=*nrdsO&C|UMcsPAH z!^Ji0jm;&K$`V~k$j!U2`U!qF!q$?4qwIzXuitDyiVfte^V~M!ayy-)>+Ud|FeHe(#%w}@I6JgiAZ|&>;#uInU)9-@ zB;sV@B0Dg0MAT}0gre>Yh(<5Qbw7Ko`$xX<$q7_aSibe z`i6vtB$Yx~;9+{!p^Z;>&2BdfN{qlKA;z5OHF+{r45a1s+PtnL8Lw`~eDSmBkpDrr zSEJ)`s+Os>4LAe+bzn7{YH9A~Z)=6Gx%=x55^4?bkbIXS{NU&|Nn=si~L9Yk$5EVoA zAqiqe#3ML?bnm{Sum3d_OXEIH=*L`;HZPp?6a`OQR3jOC@? zX>!bg?_!?oO_O69Ct_5VJHCD9_+&Zmh3~~}IG!lS)&0%b7h-%@0-gb!s{%d1H9rDg z3b?kO(w_&k0c!EB5?}_X0oTBb2~9YcH?-wKrkO^o`M& z4XP`u<|WSgA|F)=wk|d&{c@fsRmJwqmvLR`8>fdnPYUAZ$#JDVRr6frP(e|0&3oNH z8{_b9hk})J>8TLRkoFJ}(%OGqE$BX|Nsw=iF(_f&o zsDUhjjP*m|Ry!xKUVRt6pki67H(opyvMm!YCW!CBHY82;ALQ%@bNz&Op^!+%Kk|k@ z0q&N_5q~_~O_4T#g7^l~rmJ4-xFNC^yzUnN<{qZ>M}cE9rwEVZ5&j5a z9bB@mYzHq-a!?I)!#`SE=8LXKWBWP*oK2iRMmKAKjk<`ro!+ZPO}9mKSXUCntT1sE zh{=~@94NaEuobWtKy_*zJKN@qSrLtsw9o)d#h|3saMf^EMAiu^#7~MO$QtN_$kPir z1NaIc0`SkLvG(MY?PxP%^j9cx_VZ8L%=VaMY|QpO3VyH-E$E%1xW}z<^K*|5C zFHBD&+IOg{7?ezU^2F$tX|zS(N6NN98!+0Vk^B0sHwJY+8UDsk#^onyA6-ZvuIpGJ z{(0Wks z)%_LfJr58&x3t9z^bzMbI$D9b@atd>k)ts0EOKv(eRKL>|PI2{ttE)qzq62wgtVS4W(K?$6`A3Et@B+z?EIj6rj zzmnI$^CoG_guSK;J}%-2RU;-DDm;-z3BZ0dA(oj z)05Te=O)ji%llMWJ&z(b>BJ*w!*iiL&m~m`R{V?Y>k$4og!@&=2sgC<7~v-ozN*q8 zd{=uF!jB^Sv5G@DshzBS4}}!X4?1b%e6cM=nIAyC_mp2&z29?pnF*ZcUGH5;a~IbA zUe(zi67#0F5;3KS=~JDQW7@rCh*^r5ORCr9m{zY7F@=cfSG^|3SbQ)0OAt3F^rHU` zxUrm}W+-O~ti1XwEFEi^w;7C{gF99aty|JvX(PFS>>~8|FdhUK(|Im zeiWfw37uAhu9c7jub_pWzmXwR*B!%G-=OxUp^cA@^?kw5ya1_rzWDGM!TD7g!x>?8cOmYo>W^~Vd9PE@AqMT* z#CrWJ^x+Jk7a#(3h@%~G21?xC{Q>q(M6X37pXoH!U52%u_@~0(JmH@L|K}6_1o(3v zCAO4_<&?o-^kh((ps}&|<&;5bR0NFFd~x2GL0F1i;(Re@40@(KgHV%UFs`r4srhP6 zP8Dcuj5g)hoLn=!Ca;RvNK~SoZO{{Z4j}8^vsm{u^13%4>jUM)3#Yy z>|h$%My^rOsBBaROu`#JJxp7kCd~x?E(bAR!=S=H- z@!}}csyR%FPeY?sClp@MHfKXqLD$ELbwR9s<|SUbIZk{ksD%G^?X;`m;;Yz=@cok=lz|a%lRRCdUX^zecv77B zi8Q(03ipaMMb>DMbyw)rp{ZwA>7L0!Ezl^>UJY-L! z^^N~R=_Q2SaB~0zCyzP~w{haO(e(~a{P}1#exDy*=OSm2#Omfnz{4mxakQ$O%KW0k zD$ErJqm^Au4kf-+N9V(KA+SX8jW1hn7x<@GHL3#d=fu^c&&uwDqxVahb(@8y!Vgf+ z_251D9SV|iE<|;QZRq)YY24i{Efp&8^>UE#v%a8IyRi1D+S9dEec?vBzIG#1??C*A z!F>`-?Smd_pG5QfB*seB7a{)b;9kVfCNgJ#b>sq8-<$N)x_4i`2^br|s7+&p_zu;7|Nnz~q%6Cz#;&gCY!Y`#>c; zzON6GneGV=)Ea8n)E+_)dGyeY^2lso6%=dd)o!Rgfp{{~cL%T4X4h8NzK$@F)XIV- z;Ae%$IDIkZ=1GjB7w{E8{}^;GfHJ^Zz%zhmz)`?CfYb;%9{IfR7eXK7X^$y4Ktnbk z`+tMr$(S#$3GxEgq@cN`@GO}}g_uXlU1XkeHIVm_uclMIoD*nSHdF;w$Ztgs0r{@4 znJ+qmX3T6dpUp^5^3`<4l+!{?nG)16U(ChG{~GD?gRfQ(tRXejpoY(&k0E);T&+Yt zD{L2DY&+kcEfA^tBPr&n^04ZN`t=>xrct1+BZ}7{v*N^2Q_8*$>y+t-?2JTD5Bju_ zz=&LMS|UE^>`~S!z)x@=;wNZJE&Mf|`DHJ)k&$kds<4JRyoajU_Ia*(R0oT3r_5$9p#9>Z9ELhZUcX#)*T7%S7CJQ4@aO zjz&k?Lt03S2B!hxuBdzc%=NEUe=3g*(?sn_$JnGukn3~)i6E;pw2$DOiiroh<0IK)fqDAk!(qSbQ`MUu&Z&pw_+6SqJ64 z#AJM7fSqsTP!d98k?6>f9MU)m?ruar#s0WJ{43(GPV7Gj&3=IX5ggv4RYI4J$H(dQ z3DB^J@5uz`B!vw#_ z`< zPHeNsTuBxZVMR{QyWcYG+eY}&s+*Uo*O4lh9;nCnjM`KoCx;2p3>%=?n?By8t$}1? zQ~{&!j>QmuWir+L#ZTIJe?$&fctQcKOM&=MMBSyxx%0B3c@aWCLYhLPDTIGzMBSc% zxuk5)LuduQjQH4AT6ByNi!CeK7!$b;?Ph_ffPR3aBl^vVSt0m(vjq#{gW+o(QE2EB z#?Jed%`+yxp2gQJd>ssb*%1YuGGizG(_KpJ?OCiTpuL6y@p2e-P_(EUQ#4OP?TM)U zl&{M_sZ0qirbQ52zu~$v(2Rjka*Y0vG3_j1-^dCRV*^9;%kk<%_AT z1YudtJV%c)nSuk^?J_#uMsKK5J z+tmj9G;gXiwe-ZzbMd5BYG8^p1*O~`UY#)o?xHZ6l?%eKpeO5zQ}ic0uLHgU3<9nJ zzVMq5V_km|XU^zz8$bs?Suc~}W&ju*P@hBmFu=PBvIXLD0QHSXhq%jt^MH>465tv@ z-+O`mn(HX%lGS-LFu*Ix}>m%n&g!jI7hI8>a1Ls^TtMq60Bkwr?p$#I#6ha

H6_w*UXgzu+k2%jtbDR2uAQKr6= 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 TA{kKiYqK5>{wK^4=sfx#Jyzi6 literal 0 HcmV?d00001 diff --git a/flasher/openocd/rtl_gdb_debug.txt b/flasher/openocd/rtl_gdb_debug.txt new file mode 100644 index 0000000..74a699f --- /dev/null +++ b/flasher/openocd/rtl_gdb_debug.txt @@ -0,0 +1,57 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :2331 + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +monitor reset 1 +monitor sleep 20 +monitor clrbp +#=============================================================================== +#Load flash download file +file ./build/obj/application.axf + +#skip sdram init, it has been init in openocd config +set {int}0x40000210=0x211157 +#x /1xw 0x40000210 + +b main +continue +clear main +#Load the file +#lo + + + + diff --git a/flasher/openocd/rtl_gdb_debug_jlink.txt b/flasher/openocd/rtl_gdb_debug_jlink.txt new file mode 100644 index 0000000..5ff47a5 --- /dev/null +++ b/flasher/openocd/rtl_gdb_debug_jlink.txt @@ -0,0 +1,58 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :2331 + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +monitor reset 1 +monitor sleep 20 +monitor clrbp +#=============================================================================== +#Load flash download file +file ./build/obj/application.axf +#file ./application/Debug/bin/application.axf + +#skip sdram init, it has been init in openocd config +set {int}0x40000210=0x211157 +#x /1xw 0x40000210 + +b main +continue +clear main +#Load the file +#lo + + + + diff --git a/flasher/openocd/rtl_gdb_debug_openocd.txt b/flasher/openocd/rtl_gdb_debug_openocd.txt new file mode 100644 index 0000000..cb697af --- /dev/null +++ b/flasher/openocd/rtl_gdb_debug_openocd.txt @@ -0,0 +1,57 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :3333 + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +monitor reset init +monitor sleep 20 +monitor halt +#=============================================================================== +#Load flash download file +file ./application/Debug/bin/application.axf + +#skip sdram init, it has been init in openocd config +set {int}0x40000210=0x211157 +#x /1xw 0x40000210 + +b main +continue +clear main +#Load the file +#lo + + + + diff --git a/flasher/openocd/rtl_gdb_flash_write.txt b/flasher/openocd/rtl_gdb_flash_write.txt new file mode 100644 index 0000000..488c1e2 --- /dev/null +++ b/flasher/openocd/rtl_gdb_flash_write.txt @@ -0,0 +1,199 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :2331 + +#=============================================================================== +#set file path +set $BINFILE = "./application/Debug/bin/ram_all.bin" + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +#set JTAG and external SRAM +monitor reset 1 +monitor sleep 20 +monitor clrbp +#=============================================================================== +#Variables declaration (1) +#binary file size +set $RamFileSize = 0x0000 +source fwsize.gdb +printf "-------------------------------\n" +printf "RamFileSize: %x\n",$RamFileSize +printf "-------------------------------\n" + +#=============================================================================== +set $FLASHDATBUFSIZE = 0x800 + +#=============================================================================== +#define PERI_ON_BASE 0x40000000 +set $PERI_ON_BASE = 0x40000000 +#define REG_SOC_PERI_FUNC0_EN 0x0218 +set $REG_SOC_PERI_FUNC0_EN = 0x0210 + +#define SPI_FLASH_BASE 0x4000000 +set $SPI_FLASH_BASE = 0x98000000 + +#------------------------------------------------------------------ +set $Temp = 0x0 + +#=============================================================================== +#Load flash download file +file ../../../component/soc/realtek/8195a/misc/gcc_utility/target_NORMAL.axf + +#Load the file +lo + +printf "Load flash controller.\n" + +#=============================================================================== +#Set for executing flash controller funciton +set $Temp = {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) +p /x $Temp + +set $Temp = ($Temp | (0x01 << 27)) +p /x $Temp + +set {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) = $Temp +printf "....\n" +printf "wakeup bit(%x):%x\n", ($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN), {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) +#=============================================================================== +#Direct the startup wake function to flash program function +#the function pointer address +#set $testpointer = 0x200006b4 +#set $testpointer2 = 0x200006b8 +#set $FuntionPointer = 0x200006c4 +#set $FPTemp = 0x200a08e9 +#set {int}($FuntionPointer) = $FPTemp +#printf "testpointer(%x):%x\n", $testpointer, {int}$testpointer +#printf "testpointer2(%x):%x\n", $testpointer2, {int}$testpointer2 +#printf "FuntionPointer(%x):%x\n", $FuntionPointer, {int}$FuntionPointer + +#=============================================================================== +#Load file +# restore filename [binary] bias start end +# Restore the contents of file filename into memory. +# The restore command can automatically recognize any known bfd file format, except for raw binary. +# To restore a raw binary file you must specify the optional keyword binary after the filename. +#=============================================================================== + +set $LoopNum = ($RamFileSize / $FLASHDATBUFSIZE) +printf "LoopNum = %x\n", $LoopNum +set $TailSize = ($RamFileSize % $FLASHDATBUFSIZE) +printf "TailSize = %x\n", $TailSize + +printf "global variables\n" + +set $FLASHDATSRC = 0x0 +set $FILESTARTADDR = 0X0 +set $FILEENDADDR = $FILESTARTADDR + $FLASHDATBUFSIZE + +#b RtlFlashProgram:StartOfFlashBlockWrite +b rtl_flash_download.c:489 +b rtl_flash_download.c:524 +#b Rtl_flash_control.c:RtlFlashProgram + +#continue to 489 +c + +# Mode 0: erase full chip, Mode 1: skip calibration section and erase to firmware size +set EraseMode=1 +print EraseMode +set FirmwareSize=$RamFileSize +print FirmwareSize + +#continue to 524 +c + +#printf "...\n" +set $FLASHDATSRC = FlashDatSrc +printf "FlashDatSrc:%x\n", $FLASHDATSRC + +printf "FlashBlockWriteSize " +set FlashBlockWriteSize = $FLASHDATBUFSIZE +#p /x FlashBlockWriteSize +printf "FlashBlockWriteSize:%x\n", FlashBlockWriteSize + +printf "FlashAddrForWrite" +set FlashAddrForWrite = 0x0 + + + +printf "Flash write start...\n" +set $LoopCnt = 0 +while ($LoopCnt < $LoopNum) + p /x FlashAddrForWrite + restore ./application/Debug/bin/ram_all.bin binary ($FLASHDATSRC-$FILESTARTADDR) $FILESTARTADDR $FILEENDADDR + c + + printf "FILEENDADDR" + p /x $FILEENDADDR + set FlashBlockWriteSize = $FLASHDATBUFSIZE + set FlashAddrForWrite = $FILEENDADDR + set $FILESTARTADDR = $FILEENDADDR + set $FILEENDADDR = $FILESTARTADDR + $FLASHDATBUFSIZE + + set $LoopCnt = $LoopCnt + 0x01 +end + +#set FlashBlockWriteSize = $FLASHDATBUFSIZE +#set FlashAddrForWrite = $FILEENDADDR +#set $FILESTARTADDR = $FILEENDADDR +set $FILEENDADDR = $FILESTARTADDR + $TailSize +restore ./application/Debug/bin/ram_all.bin binary ($FLASHDATSRC-$FILESTARTADDR) $FILESTARTADDR $FILEENDADDR +c + +#Set complete flas +set FlashWriteComplete = 0x1 + +printf "dump for check\n" + +set $LoopCnt = 0 +set $dumpaddr = 0 + +set $dumpstartaddr = $SPI_FLASH_BASE +set $dumpendaddr = $SPI_FLASH_BASE + $RamFileSize +printf "start addr of dumping" +p /x $dumpstartaddr +printf "end addr of dumping" +p /x $dumpendaddr +dump binary memory ./application/Debug/bin/dump.bin $dumpstartaddr $dumpendaddr + + +delete +b rtl_flash_download.c:556 +c + +quit +#=============================================================================== + diff --git a/flasher/openocd/rtl_gdb_flash_write_jlink.txt b/flasher/openocd/rtl_gdb_flash_write_jlink.txt new file mode 100644 index 0000000..488c1e2 --- /dev/null +++ b/flasher/openocd/rtl_gdb_flash_write_jlink.txt @@ -0,0 +1,199 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :2331 + +#=============================================================================== +#set file path +set $BINFILE = "./application/Debug/bin/ram_all.bin" + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +#set JTAG and external SRAM +monitor reset 1 +monitor sleep 20 +monitor clrbp +#=============================================================================== +#Variables declaration (1) +#binary file size +set $RamFileSize = 0x0000 +source fwsize.gdb +printf "-------------------------------\n" +printf "RamFileSize: %x\n",$RamFileSize +printf "-------------------------------\n" + +#=============================================================================== +set $FLASHDATBUFSIZE = 0x800 + +#=============================================================================== +#define PERI_ON_BASE 0x40000000 +set $PERI_ON_BASE = 0x40000000 +#define REG_SOC_PERI_FUNC0_EN 0x0218 +set $REG_SOC_PERI_FUNC0_EN = 0x0210 + +#define SPI_FLASH_BASE 0x4000000 +set $SPI_FLASH_BASE = 0x98000000 + +#------------------------------------------------------------------ +set $Temp = 0x0 + +#=============================================================================== +#Load flash download file +file ../../../component/soc/realtek/8195a/misc/gcc_utility/target_NORMAL.axf + +#Load the file +lo + +printf "Load flash controller.\n" + +#=============================================================================== +#Set for executing flash controller funciton +set $Temp = {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) +p /x $Temp + +set $Temp = ($Temp | (0x01 << 27)) +p /x $Temp + +set {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) = $Temp +printf "....\n" +printf "wakeup bit(%x):%x\n", ($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN), {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) +#=============================================================================== +#Direct the startup wake function to flash program function +#the function pointer address +#set $testpointer = 0x200006b4 +#set $testpointer2 = 0x200006b8 +#set $FuntionPointer = 0x200006c4 +#set $FPTemp = 0x200a08e9 +#set {int}($FuntionPointer) = $FPTemp +#printf "testpointer(%x):%x\n", $testpointer, {int}$testpointer +#printf "testpointer2(%x):%x\n", $testpointer2, {int}$testpointer2 +#printf "FuntionPointer(%x):%x\n", $FuntionPointer, {int}$FuntionPointer + +#=============================================================================== +#Load file +# restore filename [binary] bias start end +# Restore the contents of file filename into memory. +# The restore command can automatically recognize any known bfd file format, except for raw binary. +# To restore a raw binary file you must specify the optional keyword binary after the filename. +#=============================================================================== + +set $LoopNum = ($RamFileSize / $FLASHDATBUFSIZE) +printf "LoopNum = %x\n", $LoopNum +set $TailSize = ($RamFileSize % $FLASHDATBUFSIZE) +printf "TailSize = %x\n", $TailSize + +printf "global variables\n" + +set $FLASHDATSRC = 0x0 +set $FILESTARTADDR = 0X0 +set $FILEENDADDR = $FILESTARTADDR + $FLASHDATBUFSIZE + +#b RtlFlashProgram:StartOfFlashBlockWrite +b rtl_flash_download.c:489 +b rtl_flash_download.c:524 +#b Rtl_flash_control.c:RtlFlashProgram + +#continue to 489 +c + +# Mode 0: erase full chip, Mode 1: skip calibration section and erase to firmware size +set EraseMode=1 +print EraseMode +set FirmwareSize=$RamFileSize +print FirmwareSize + +#continue to 524 +c + +#printf "...\n" +set $FLASHDATSRC = FlashDatSrc +printf "FlashDatSrc:%x\n", $FLASHDATSRC + +printf "FlashBlockWriteSize " +set FlashBlockWriteSize = $FLASHDATBUFSIZE +#p /x FlashBlockWriteSize +printf "FlashBlockWriteSize:%x\n", FlashBlockWriteSize + +printf "FlashAddrForWrite" +set FlashAddrForWrite = 0x0 + + + +printf "Flash write start...\n" +set $LoopCnt = 0 +while ($LoopCnt < $LoopNum) + p /x FlashAddrForWrite + restore ./application/Debug/bin/ram_all.bin binary ($FLASHDATSRC-$FILESTARTADDR) $FILESTARTADDR $FILEENDADDR + c + + printf "FILEENDADDR" + p /x $FILEENDADDR + set FlashBlockWriteSize = $FLASHDATBUFSIZE + set FlashAddrForWrite = $FILEENDADDR + set $FILESTARTADDR = $FILEENDADDR + set $FILEENDADDR = $FILESTARTADDR + $FLASHDATBUFSIZE + + set $LoopCnt = $LoopCnt + 0x01 +end + +#set FlashBlockWriteSize = $FLASHDATBUFSIZE +#set FlashAddrForWrite = $FILEENDADDR +#set $FILESTARTADDR = $FILEENDADDR +set $FILEENDADDR = $FILESTARTADDR + $TailSize +restore ./application/Debug/bin/ram_all.bin binary ($FLASHDATSRC-$FILESTARTADDR) $FILESTARTADDR $FILEENDADDR +c + +#Set complete flas +set FlashWriteComplete = 0x1 + +printf "dump for check\n" + +set $LoopCnt = 0 +set $dumpaddr = 0 + +set $dumpstartaddr = $SPI_FLASH_BASE +set $dumpendaddr = $SPI_FLASH_BASE + $RamFileSize +printf "start addr of dumping" +p /x $dumpstartaddr +printf "end addr of dumping" +p /x $dumpendaddr +dump binary memory ./application/Debug/bin/dump.bin $dumpstartaddr $dumpendaddr + + +delete +b rtl_flash_download.c:556 +c + +quit +#=============================================================================== + diff --git a/flasher/openocd/rtl_gdb_flash_write_openocd.txt b/flasher/openocd/rtl_gdb_flash_write_openocd.txt new file mode 100644 index 0000000..c5ec61b --- /dev/null +++ b/flasher/openocd/rtl_gdb_flash_write_openocd.txt @@ -0,0 +1,198 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :3333 + +#=============================================================================== +#set file path +set $BINFILE = "./application/Debug/bin/ram_all.bin" + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +#set JTAG and external SRAM +monitor reset init +monitor halt +monitor sleep 20 +#=============================================================================== +#Variables declaration (1) +#binary file size +set $RamFileSize = 0x0000 +source fwsize.gdb +printf "-------------------------------\n" +printf "RamFileSize: %x\n",$RamFileSize +printf "-------------------------------\n" + +#=============================================================================== +set $FLASHDATBUFSIZE = 0x800 + +#=============================================================================== +#define PERI_ON_BASE 0x40000000 +set $PERI_ON_BASE = 0x40000000 +#define REG_SOC_PERI_FUNC0_EN 0x0218 +set $REG_SOC_PERI_FUNC0_EN = 0x0210 + +#define SPI_FLASH_BASE 0x4000000 +set $SPI_FLASH_BASE = 0x98000000 + +#------------------------------------------------------------------ +set $Temp = 0x0 + +#=============================================================================== +#Load flash download file +file ../../../component/soc/realtek/8195a/misc/gcc_utility/target_NORMAL.axf + +#Load the file +lo + +printf "Load flash controller.\n" +#=============================================================================== +#Set for executing flash controller funciton +set $Temp = {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) +p /x $Temp + +set $Temp = ($Temp | (0x01 << 27)) +p /x $Temp + +set {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) = $Temp +printf "....\n" +printf "wakeup bit(%x):%x\n", ($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN), {int}($PERI_ON_BASE+$REG_SOC_PERI_FUNC0_EN) +#=============================================================================== +#Direct the startup wake function to flash program function +#the function pointer address +#set $testpointer = 0x200006b4 +#set $testpointer2 = 0x200006b8 +#set $FuntionPointer = 0x200006c4 +#set $FPTemp = 0x200a08e9 +#set {int}($FuntionPointer) = $FPTemp +#printf "testpointer(%x):%x\n", $testpointer, {int}$testpointer +#printf "testpointer2(%x):%x\n", $testpointer2, {int}$testpointer2 +#printf "FuntionPointer(%x):%x\n", $FuntionPointer, {int}$FuntionPointer + +#=============================================================================== +#Load file +# restore filename [binary] bias start end +# Restore the contents of file filename into memory. +# The restore command can automatically recognize any known bfd file format, except for raw binary. +# To restore a raw binary file you must specify the optional keyword binary after the filename. +#=============================================================================== + +set $LoopNum = ($RamFileSize / $FLASHDATBUFSIZE) +printf "LoopNum = %x\n", $LoopNum +set $TailSize = ($RamFileSize % $FLASHDATBUFSIZE) +printf "TailSize = %x\n", $TailSize + +printf "global variables\n" + +set $FLASHDATSRC = 0x0 +set $FILESTARTADDR = 0X0 +set $FILEENDADDR = $FILESTARTADDR + $FLASHDATBUFSIZE + +#b RtlFlashProgram:StartOfFlashBlockWrite +b rtl_flash_download.c:489 +b rtl_flash_download.c:524 +#b Rtl_flash_control.c:RtlFlashProgram + +#continue to 489 +c + +# Mode 0: erase full chip, Mode 1: skip calibration section and erase to firmware size +set EraseMode=1 +print EraseMode +set FirmwareSize=$RamFileSize +print FirmwareSize + +#continue to 524 +c + +#printf "...\n" +set $FLASHDATSRC = FlashDatSrc +printf "FlashDatSrc:%x\n", $FLASHDATSRC + +printf "FlashBlockWriteSize " +set FlashBlockWriteSize = $FLASHDATBUFSIZE +#p /x FlashBlockWriteSize +printf "FlashBlockWriteSize:%x\n", FlashBlockWriteSize + +printf "FlashAddrForWrite" +set FlashAddrForWrite = 0x0 + + + +printf "Flash write start...\n" +set $LoopCnt = 0 +while ($LoopCnt < $LoopNum) + p /x FlashAddrForWrite + restore ./application/Debug/bin/ram_all.bin binary ($FLASHDATSRC-$FILESTARTADDR) $FILESTARTADDR $FILEENDADDR + c + + printf "FILEENDADDR" + p /x $FILEENDADDR + set FlashBlockWriteSize = $FLASHDATBUFSIZE + set FlashAddrForWrite = $FILEENDADDR + set $FILESTARTADDR = $FILEENDADDR + set $FILEENDADDR = $FILESTARTADDR + $FLASHDATBUFSIZE + + set $LoopCnt = $LoopCnt + 0x01 +end + +#set FlashBlockWriteSize = $FLASHDATBUFSIZE +#set FlashAddrForWrite = $FILEENDADDR +#set $FILESTARTADDR = $FILEENDADDR +set $FILEENDADDR = $FILESTARTADDR + $TailSize +restore ./application/Debug/bin/ram_all.bin binary ($FLASHDATSRC-$FILESTARTADDR) $FILESTARTADDR $FILEENDADDR +c + +#Set complete flas +set FlashWriteComplete = 0x1 + +printf "dump for check\n" + +set $LoopCnt = 0 +set $dumpaddr = 0 + +set $dumpstartaddr = $SPI_FLASH_BASE +set $dumpendaddr = $SPI_FLASH_BASE + $RamFileSize +printf "start addr of dumping" +p /x $dumpstartaddr +printf "end addr of dumping" +p /x $dumpendaddr +dump binary memory ./application/Debug/bin/dump.bin $dumpstartaddr $dumpendaddr + + +delete +b rtl_flash_download.c:556 +c + +quit +#=============================================================================== + diff --git a/flasher/openocd/rtl_gdb_ramdebug.txt b/flasher/openocd/rtl_gdb_ramdebug.txt new file mode 100644 index 0000000..a2a11bf --- /dev/null +++ b/flasher/openocd/rtl_gdb_ramdebug.txt @@ -0,0 +1,113 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :2331 + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +monitor reset 1 +monitor sleep 20 +monitor clrbp +#=============================================================================== +#Init SDRAM here + # init System +monitor MemU32 0x40000014=0x00000021 +monitor sleep 10 +monitor MemU32 0x40000304=0x1fc00002 +monitor sleep 10 +monitor MemU32 0x40000250=0x00000400 +monitor sleep 10 +monitor MemU32 0x40000340=0x00000000 +monitor sleep 10 +monitor MemU32 0x40000230=0x0000dcc4 +monitor sleep 10 +monitor MemU32 0x40000210=0x00011117 +monitor sleep 10 +monitor MemU32 0x40000210=0x00011157 +monitor sleep 10 +monitor MemU32 0x400002c0=0x00110011 +monitor sleep 10 +monitor MemU32 0x40000320=0xffffffff +monitor sleep 10 + # init SDRAM +monitor MemU32 0x40000040=0x00fcc702 +monitor sleep 10 +monitor MemU32 0x40000040 +monitor MemU32 0x40005224=0x00000001 +monitor sleep 10 +monitor MemU32 0x40005004=0x00000208 +monitor sleep 10 +monitor MemU32 0x40005008=0xffffd000 +monitor sleep 13 +monitor MemU32 0x40005020=0x00000022 +monitor sleep 13 +monitor MemU32 0x40005010=0x09006201 +monitor sleep 13 +monitor MemU32 0x40005014=0x00002611 +monitor sleep 13 +monitor MemU32 0x40005018=0x00068413 +monitor sleep 13 +monitor MemU32 0x4000501c=0x00000042 +monitor sleep 13 +monitor MemU32 0x4000500c=0x700 +monitor sleep 20 +monitor MemU32 0x40005000=0x1 +monitor sleep 100 +monitor MemU32 0x40005000 +monitor MemU32 0x4000500c=0x600 +monitor sleep 30 + +monitor MemU32 0x40005008=0x00000000 +monitor sleep 3 +monitor MemU32 0x40000300=0x0006005e +monitor sleep 3 +#=============================================================================== +#Load flash download file +#file ./application/Debug/bin/application.axf +file ./build/obj/application.axf + +#boot from ram, igonore loading flash +monitor MemU32 0x40000210=0x8011157 + +#Load the file +lo + +#Run to main +b main +continue +clear main + + + + + diff --git a/flasher/openocd/rtl_gdb_ramdebug_jlink.txt b/flasher/openocd/rtl_gdb_ramdebug_jlink.txt new file mode 100644 index 0000000..9dd4fa1 --- /dev/null +++ b/flasher/openocd/rtl_gdb_ramdebug_jlink.txt @@ -0,0 +1,112 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :2331 + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +monitor reset 1 +monitor sleep 20 +monitor clrbp +#=============================================================================== +#Init SDRAM here + # init System +monitor MemU32 0x40000014=0x00000021 +monitor sleep 10 +monitor MemU32 0x40000304=0x1fc00002 +monitor sleep 10 +monitor MemU32 0x40000250=0x00000400 +monitor sleep 10 +monitor MemU32 0x40000340=0x00000000 +monitor sleep 10 +monitor MemU32 0x40000230=0x0000dcc4 +monitor sleep 10 +monitor MemU32 0x40000210=0x00011117 +monitor sleep 10 +monitor MemU32 0x40000210=0x00011157 +monitor sleep 10 +monitor MemU32 0x400002c0=0x00110011 +monitor sleep 10 +monitor MemU32 0x40000320=0xffffffff +monitor sleep 10 + # init SDRAM +monitor MemU32 0x40000040=0x00fcc702 +monitor sleep 10 +monitor MemU32 0x40000040 +monitor MemU32 0x40005224=0x00000001 +monitor sleep 10 +monitor MemU32 0x40005004=0x00000208 +monitor sleep 10 +monitor MemU32 0x40005008=0xffffd000 +monitor sleep 13 +monitor MemU32 0x40005020=0x00000022 +monitor sleep 13 +monitor MemU32 0x40005010=0x09006201 +monitor sleep 13 +monitor MemU32 0x40005014=0x00002611 +monitor sleep 13 +monitor MemU32 0x40005018=0x00068413 +monitor sleep 13 +monitor MemU32 0x4000501c=0x00000042 +monitor sleep 13 +monitor MemU32 0x4000500c=0x700 +monitor sleep 20 +monitor MemU32 0x40005000=0x1 +monitor sleep 100 +monitor MemU32 0x40005000 +monitor MemU32 0x4000500c=0x600 +monitor sleep 30 + +monitor MemU32 0x40005008=0x00000000 +monitor sleep 3 +monitor MemU32 0x40000300=0x0006005e +monitor sleep 3 +#=============================================================================== +#Load flash download file +file ./application/Debug/bin/application.axf + +#boot from ram, igonore loading flash +monitor MemU32 0x40000210=0x8011157 + +#Load the file +lo + +#Run to main +b main +continue +clear main + + + + + diff --git a/flasher/openocd/rtl_gdb_ramdebug_openocd.txt b/flasher/openocd/rtl_gdb_ramdebug_openocd.txt new file mode 100644 index 0000000..f01640a --- /dev/null +++ b/flasher/openocd/rtl_gdb_ramdebug_openocd.txt @@ -0,0 +1,59 @@ +# GDB script for loading ram.bin process + +#=============================================================================== +#set GDB connection +set remotetimeout 100000 +target remote :3333 + +#=============================================================================== +#Message display setting +#disable all messages + +set verbose off +set complaints 0 +set confirm off +set exec-done-display off +show exec-done-display +set trace-commands off +#set debug aix-thread off +#set debug dwarf2-die 0 +set debug displaced off +set debug expression 0 +set debug frame 0 +set debug infrun 0 +set debug observer 0 +set debug overload 0 +set debugvarobj 0 +set pagination off +set print address off +set print symbol-filename off +set print symbol off +set print pretty off +set print object off +#set debug notification off +set debug parser off +set debug remote 0 + +#=============================================================================== +monitor reset init +monitor sleep 20 +monitor halt +#=============================================================================== +#Load flash download file +file ./application/Debug/bin/application.axf + +#boot from ram, igonore loading flash +set {int}0x40000210=0x8011157 + +#Load the file +lo + +#Run to main +b main +continue +clear main + + + + + diff --git a/flasher/openocd/target_NORMAL.axf b/flasher/openocd/target_NORMAL.axf new file mode 100644 index 0000000000000000000000000000000000000000..1a8347a847ab23e10e665677b750233973df10ec GIT binary patch literal 1764234 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

lZQ~WoYS%ZHw)#(E5Ae;4E-9i7BxSk_q4<;xr+J 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˷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

=`kIbIh>!mX2napruUcL^P6Qn(=_st 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

-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ⅈ}!vMOUanphO#W5(?oOXuDe+0Nmq;kcsIv++$SzB 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

!kpO1L(|CT`brX zQ9I4!w4G#;ob{5SC54*wSuYKA{B0&3i2PJ{ne zhX9p+2>>m}frARmsC2I>R@Q&ZQP`RQ6%GPW=!%KL%Rv!^Hxr=3_W|&)#}KreKCcbH zz~S>8$J9zDRJ%CG!nuX34|=BTnui)2I)lhmkn|wZP!A$HeQG znce?0=K}5CXtB@aM5IMOmw_pjHvrTZa@k>|Y_9;KoZ5~@iz%s17xU;DGw%i{ubwd% zs85LHctqni#Hf5C@JjVu9d}I0k&E}ZxA8G>v9qOTIh^d|Sq!;Wp8Ei|0I!qy(^`0= zh~LZcrj6i_0q@msA@H^$k0PpwmmbCySjobkImk1sHZrIcXbJBi%DvBq11-UwNbV3% z)`h@ZgOk-CKnZ|ia`G<)R>aU!b|qySn~$YH(-P1|QjEm>)xfeh;!punXI?z#LH->4 z@EIL`t060du5u&w{|V*;1bzVU5dnUD@>c-eILj+=%l%7baYonRT}W_-S44nwJ{B%? z#bmlS9IR|k_a+0tUpIE_sZcbZ2K=a`Q!i$DPGq+ND0I2fsb6GycIpoauv6E1&*{|D zpF3269&T67#{gYNznsP@e8D|Lo5 zyLagfuT|I0@GB+5*P~ExX5}RCgIOpu$0HfJSF{zV$rYe2(0Zujq}FpzRL=s@^FGAS z5*~YDbjDlv0h+PhqdYI7fF26AyZ6PW8tPupL6}_cXU-w+m2Q%HH@nPE5APPF%ISNT zrr%CY_i6a5d4M0#u$;noi=GClb!qMA!oa}4l&Ws>=vx#&MGd$~4A8eFZkCFSy7yD` zd|X4wC#}7l*Ufo8 z-qh$Me&@^mk|~huBsW9P68st99pxTMf#A*lrHnpuAEmwEYCsY1j~Z7RMj8{k#Ftnf zW8VSLRC(4B{CgH9ipk491}yjyI@U=5odFcqLa_$;W&Z-oG*IwY#B3+Afci%JE=xzB zpA6bk@UzAO*bg9YC;(MnOriV=z}d@iDEk=Kj_ZhR#$hqA>|Fqk0x05byY5h1LAB3% zK7pB89YE`J9QKiz-5uB>VA*8=-UA@x&tQ~U$1?p)8IN~<0y8)s|4D%3F-40hB4g0G zpF#u2;!yzj*LN3Kr%_$@Biq0u?8E?`#NT-Un?BxWy!9e-7*cU@}MJ z=h$}Pr#5&NHh?JSXs>}O!`OEK3SEhO-kFf0Jnl2t!67UifDB<l`WFEd38qSTDr07&VWfxU}BoLPa~(XE`mYD zBuZn=0Va)=2hk$@&{(b0oW@#DCwR_zj83=`RgLuy$kJFR0Z3!zLqh?z=*9|tUe#EG z$)YWrJ@>EzHdX`hi%FEmY7I;ps|0{#@oOLyqUCe_7*ii2SD0D^tNke@Bm4Dw*(^z#6>Wa1!8w@kz zzqXRtw;6(aX8Q0R*O6Z`g5x3384;l?8o8I;4sZQyOrVT$o+ z$!Zvn?rweOvp!e!pVZf^dg7Mr`kJnW5y;lwsON72(1R<9n8dUGj*Eok{quATWn-BH zJ$$#*+zFs@9L^dEU_8wo2;dBWyxss*xlzOu`TZOm>&iv zW5^>AdxT=cyJ8DX9{H-TJ0J2rb7Fa_AQ$H6ZqQQG!rs^j^=`o?M7Z75U9 zGEUpp2SeJnH37CQMT;pSZQBi)wC(u-_$TdDITHzpABLQpSu?xXG%8>hyPg2s=?(ye zuIN8$r|nP~ZKoRN20i3Z*MB$UII%edKgZI~iM~RdEhRP&!Jc9gB{n|-lh`DD>zq43 zLYb5Jxv}XAhQwwu0mg=+g|3*y=S5H?J|6<$pUfgsC!=$+_Bp=e$acw+-yu*;qGU;r z@0={jhiDi4kR>nBP-e-+U`m!e2%ylFsLGPVAWN2f3P7@?02(?_i_Q|?_f=Uk1mtzJ zWwWP*wlGUFz%M3IA~6z}L}Cg6ePTkHT`c2d$r>;u67LXTBq&-;5s5SZCkJU}lO z__{TReZxRo0c(m$%)bm+lc_kEt4g!y8`d;-U) zzySc~{RrR)fENHrw_S#6zh$*^z3Xt^lmEJ;JKZOnAZ1!DQW#0fI?TI zDy_c(S<>1(?WFZaXxKz8I;|Uljz5Xwevq?i%VtkK+QPKX1HYI=iDD0662&0^B&`pi zOcBdCX?-~u62*B07)6Q}Q$!-T2AD+fE&%+Kw0;$%(5Ltzt=F<cWIL=IzNKFd=3_u_Wvb1eg$80TjBT|0E%bswc!Q)CUX9U~cqMuK6FZ zdo(JnY1tAFjBfrq&gd2Y#_LO74vo;4fTHd{UjwcW;2{bWtwY?@Cf}=c?k>>w&?gr# zI&&RKONb4`Pi^oGY6-DJpuI$~eE^Qpbyp($ZBTvyr8l3m7op59s{g|)Pt=otM;Sh2 zZ%Tkq-8%s&rieUfKNpxhXrDlU58599z&~ks+_;k*wSm z{U?=&tLH(blLs?k0zR!&;z#98=?b2+&OxOZ!L(s~hd~mf<~3suYjzr+I?AZyZ{%<7O}w3Q6K^W~(N95l$xXPMfa{e6_sLDW2g$#&0%h+L z{zt(3$y3hA2%$PrUamUAJc&U*7VvR#Hb51M}6B`!r z=ml*6{u}sThUvPxhBqQ#(pE2luI<|D($=okFNxK0f4Ww`ELP<5tmOcg<)Wl`+w{6Iebmb7r76SRq7nRCgw}f$hmwA1>3)l zhkm6>w?INxg3kjki){Zi`Zrt%-g`Gv0;{#~iIc#UfJJPZD;8sv70rV{L-m-Jn@+iP zfQ|2Q9pN!1;!4JOqip&0`URE)n69{gBjRelz+$F$1j|&xH27?qz8Ns{f8j??WEWU( zn*@xh)?l2q4eMnFH;m6ZqjWNR4OYKkShzFXy>&$49KcT0ACw`A9MOLl#?MnajgWY>4=Z4WD! zUEeLfN#L_&*LSNH&PD-iBs2#t+4bGxh-g_?qHM_80&cA3gQ2!1yS`gjLQkBv1{%Uv zeVhy9t!x}4)}JVqV9BoUR&QuavWj6_vh@VGwXJucEya>u-!0ko-TDEPdY0_^Zk-F6 z`qnN`8d$RHyVV3W?!)GMQ2LZ%>0My0kKp(L!$P(j2MtT_`fmM!vacDI-u2zmyS`g` z*LSNDyrYJ74FBGT_k-#7zy>Jp?D~Ek2!8J>97FP^+3kSzr)grZN13p1)CZtAyS`Td zba#Dc%ecF~?*%z%pF0Y=FCpyg0_z(~Z85T`x-)h*dn-I7h!E!kAv+I<;= zDVwTWdQ){vZ>nzTP1P;Esk)^%Rk!q}>XzPA-EuZnx13GYt!Kw!+EQU!EiUJOuXPKQ zS5yQoXH#|SJHgYe=%(t{-)yRG$*Ouw-ej^8w=#>;a5SwP96gq7s&3uM0mQl&N53VT zs#~(Dy7f#v{I*^J-Lh5y4jFMzEJ3^igXCi*))@44Y`ur0vd&vUt-Y2(s}Z*kh&QlO zwL+B6R-ryxkNH(iCPCUw5j^d_uJ?pi`;TW_A zLI=_xh10CgklANg%~5ZKvYLZaVOj==2>xtHBlgXqvLbAqk7_E?tRntHiQS~4$n`9V z?1~LRIyX3T1!}hWwbkIP=i!}Ua}$H$Y{Fif8yE!V5Dwbh3NAQzJ>XdTPr_Fdw(W;8 z#0Dz}*Rro~0eBwaIGfwQ1?MxR!}eCnEFhd_cx*TrTu6^&KZ4;agV**BKoK`Q3ofNO zum=xVg4a<#*XCws!Q}@*F0#2%S#SmIDY2j22>5!!J#B7&7F?Iw!>uOmF( zzL$D#COpxui(m$CAw1b$Px^Yo)9v}B-?|0xY@VYK0P!t?A7 zl;1>nzTJ>|?jXFt=Ke&%&4d@)W4Zvolkhe69OOc93*klfztFJ3t%Mibw^PqH!b@y^ z7BF}h;cIO_>%E)sQu}S{zlZR3c2CN0C%nwwPT%h(yxhK<^c{p(*gsMKPQuq4o^M$3 zuJZyM$!=x~o`mMo;A^i2(Q49Cud@{l-BO1cd9QA%BZPyxrQV=StZu0{Ne}CmdW&$P zZmG8!$rRmE?+{MaE%h$pG~H6~5zf>tb(C6SW1xInkm zM{J!=x}`oQT&P>>6M9{wTk2E7#k!?FBiu!|)Cs~}b?baVxJ0+kmxR0N);USIyKbGY z2=~yf@Gaq)8rFzK59my%z*W}n&j&L> zw#TY1h5=1Vn}ZudkWA*H`CKnXwA#HvdMgVlFJyfDF&WpqQz@Z37`10Q+_nGCEih`| z?QkE|TwD-U6>e{&oCF)!60ZrD%TlGJs6;&bXo$`n*rKRR07n8O5P(XpFHi$-1&y6M5rGlWSfZ4 zW~iMFol^foG4*AT;Kl}_^3px(q|bAb5_NupL^7_Prs4P(f!!2<^~0`(^~1$_TE3mv z50z?e$hCertuKHD+WJwnehE>rel)Frn5bBPF|B`*s8~OS)_)E(X)x4wfKIVK(}${4 z=7R+5hYIyC#%b&ChQxnqeLXd1G0bhN#C)3G;2JT1O)Ye4$yuV zp1|u%Yve0BG@p1pMkcIr=XkRbc+&m~%x7Jj2aC<$gM@VP#yXy?6l!FiQ0uzXeL~IA z)LfT(La5y}wYy6V`x%R|nmW{_76^5LE_I1ek7()!m%2-+r!;l9 zOMP3Ysq@9&7hI|lpbdRB^_WY|7V3CS{mG@43U!&L#@dc$(}lWSQ`24QMxpXeOvJ3f zr5+HfcY#pPajD-5HB(bZyVR5*Ei2K~nJ%?RsG~J?rAr+v)Mc8w#igzk>RwIV>rx*P z>QPO7-K8EA>KRQv;ZlP!v>|n&*!zb|%@t~irY0iYq=g0xb+V>5bEy?VU9G7_E_Itw zcWdfEm-?zuk7(+6mwH;Lr!{rHOU<;r$oN#Gd~^sS1z(H$jNM|D?iOj_AJE;RbDY~P zR!O&bAleO9OE)-8{KlmyyGAY}ns|XrPhKnUxpo7dG#$EpP$Uk|W`!vmX~JZqkx--K z>2dPvJO>^JACBBn)+3Icmn=tJTlL0ew6Vh?;Fap>sGVEI&QY{Oy6fFy=RD$K=RIQQ zZBaY7i=B_tPQDz=Ilb7K5~3{yAkmh|npjREqP3pUdPqmB6GS4!D;0N9)q}`GV#SA1 zD;^aq5`3`Yn-!4VBUZE~F41~StQZ13Wg+zWJilOM&4)VJf~GQ3RtvQosC}!bN&7&( zNaH@wbQ+iP1xPS=o>1K&ax}+j@}&3_hOt$HyTjV;cy{_3W^C_D$5YBjQ<#AD#_{F6~(u>Rivp3YDH^RZ){xgW6u>K2K&W zJ$nKqcy@tM|JJkPkoY&xhO#i)tP7axg!b$N;Nh4oqRoDQI_=pB@$3Rvnp)5d?>3zf zPi6quZSe3X65wQeOVs51;C)~zQFPQL7O>VB1Voziu)-sgx{DtbkeAjy?o>8t85Aru!f~O zOA30_sed0+_+?XC?-4MYad^UK`l9u}EcHJg)&H94e~-9)Lg#g<|994BqU=7mzQkJe zHyfmCLqZ9O@cMOj>vwgnIS|>TYaN>Cdi}1{S`Xi>)n30ZUbiQH4x9V~sdW%>Y2pvX zswu#eWWvErtv6(_}t2Z_JK zvR{c6hoe?}EmnL-E53)mL#`DE#EKNCuNDgEq+>CkqVI&+KRDBt`(=niUiAz z#cyIoYvPnwXT*wgiAyYg7b`9Yo-_vhGANQ*;Y(pId5h@bvd zs#8%b9uh0AXDzae$D>l~y~GzV5BCWEBJh+QDDU&s$MHp7HwWdUqrg9KZCNO`cu`3; zTOM(2VbZAm+Lj+7w@Izc;YrD3DJkNvGm32#8YRNtzBZyyt z_E&L&Urk#!pscp#<7&1XqE^?IJXTxh6iC%<8SU6IhP|eP9xF~meiwUPAK?!J zo|2BK1tuNa5eFxzDbqpHXRQ6zsQfU2&vOvP->yboEmWSzzOF{yBh*Hisd(X&+gN_M zSzmB|g#!F)@1fG(K4hg$^LATpDBSG?c z7}|@fs7Xsfoi6xaLc0r$>$ITHlM+_sog>`y@RBaf@Owd+5 z%@amYhpsO~*4`ji^h|ZF2ukR7MXd-)sE)Ii$&eoobKRg+0H0V5-vWGr#(kbrR+#b( zNa(=GoSPj%_K4So`VNAyvl{gzs0i+hLW*9FEE7Fpm9fZn;CEKTzX$$^#_^C-%u9rN9kiDnK?W^ds0`Zi zYScnd5g0#AaoyyGPGY_e-AFBwUQHqzx(dxJ5FV&HbllDeI?HR8(4pI}c@rI8jnI9n zc{M_}lU+4SXFbCj@>BO{z{9knowi~qL|)cbTpzWfomlZ|)QSSJ;%nlsasX*BR>a1; zR&)?6ngLJR0$nqpNZjtr3hNxIX~i*3To_A_7#L znNM^A(V?_x0nvAf$~D14qD>Qk$|cG*M28DXRf~w;L^PY7VlmNRB2az{MJ*w^l4!+Z zpz{69FNyLAg<1-SF{1>^hagJ6pE-#rpF1e|e&(%2rJa{k_zY3GOq0)PHc7?+ZLMMN z;8pv{h7xt0FYvjowWP+NcbI8a)T2V>Od+L;niRYV>;43fp19Id&~8Z`z$g`ld(YE3 zIhB*0G8b%p8XQwi+a^$_Iyk4QJAf~$hCc`VHo>E{71d^K>Fdz*YceL+VLfGFp#L4I z$uopEQ}e#9$tw`v7R`%o!~jGqTPe1`ta;frdC!R3r@-qd3=9Fgn5-!cZWa>;)f7K2 z)f8#oRW*4jby@B*@}?Qr*W_(yxun(LZL7&Rl*~de=t9rbQ?PM$jc6UC`$>Di8&H!`BL1BK!{@mWz4uaK z%a)@loIRkyt`ic@HQ{RE-^I30$<`8EYwA2Mc`z2d=bWPYIf3JYSJ-^^`eDs-)5)mA z2Z}Q2RM0e|?i3T>vsS;cFO_%{A0O_z6>#OaOn0m;kx{M;y-3e6ddMhu8}WMVkv(OU zdy}|a3iT5FG;!&Zy=Bx(u5B7=8=K)nI~n*km(1-aiD1g2O1En+1`D=H*IX-9PU3H^ zM%^S-cFhN>QBMh#GtGll)H*xhhj=QJWF!oH!xZ&ol}J)73ZAKkp94G=jypyq9Rl7^ zUZ)eoH)xA>Xlq zVIR=g4f_%a`#A`k4*PWy_VvW&>UWt$?|I_aaC){}@K1oJKg`x#Avm@WkVd#(8X*_o zcT9N|mH9lYFtPkunu*w#AO!ym^kwYadBs_xbw5P z1ARUZXE@I}R&n0b{Wenh1pH_<>QJHH2UowZq9)A;H3U=G|D4;cM^a&U(iSi>Ycf^~ z;{`A}*JP9n<7+Sm)?_3KBM}~7QIl~*@~Hrf`NF_3x=q426r^glgt?Z<$l#(lz2A#c z8C(>nH+)ellZ)bF3jF(^MX9>?LAY@a&$_kt0>mP?Qhcy7OSbk3{im(H>L+k%$|9VJ zoKv3!o_vta zf~$oR*r$L5eZ^qZ{Ccx|w%OC{EQopLdRVNK;5HtLNAk!oID5L_d~V>g&CVJ(d{@>8 z$QrkRtZ@s-8n=L~aSPmJ!OwuKaSPO3<8}~Af?i~e;g{u6zI56ZkmXSUSsoRT#yg*gJ^vD7l;bngrgaF6-STZZ^4p*epzH+1K0?ZuwY=m2-O0`V_0#Ri)RPUTYzQ= z%>+9jUt~8z%RmndV%SvZ7KjE06E;KbNI##jCo~<30v8bWhVEzCp@e-QUZDgoB;sd6XYPI3{!%;gN)`&@9$9if|}YL_HT1jtzCk+$12+s_jrAWiBDT zR;U?ec;>`D9^X*UWrV|_CWOZkjt_lIcs#Q;67sU_gjfVKF%(bwMAB12-(dC}xRP+) zP%7zH5l#&~Pn)L@ZV)<3`ZRXIw9pfjpF#bZp>dR%Nw{(7bIQ!3e3s#PfynF?h;7iz zW{6drK~Xts_(pu@9Y2hiZ-Q$x@~Q4Xn?anT>2{lEu>h)Y#v@<=4M9xg?`g&9822pm_yk|bMH#j~? zpZpV3pxo!V6#{pOfWyOr=)`=maKd^<(^(MXW?v4Gi36jhKCDryt&uocm-^Ky)wWux z8=|GS$}DP!YGWks(xq}WUA3uJ>g8yuJ~c|UHj+>3QqZJYSCv2rM#1HbWsb z5kKU?O;IQIh!dC749SDN;)LMh#N%St3i5BEnNJA56L|7?=+e#3;1x0L?x3Il(lKLI zi|&x>KEXwn!x>usreInHfF4cW1>c1sF!1#YAc*pvP$`Yw=1hOm)bfeUr1f6u@d*)j2TEq3B15ZZ_z8t*)uKy@_Jh>mW&bd#NU4RMKP zhTQUeiuej9LZ;jzJqbLy61sGbNhEXGdQ%zk9{RBg>)NI3+Yzm=r_|TDfoVi!AnPUi zy93wt_mTR^PuU^*IVM1HUn(B29ih_wT5-b|*OALb@g-5k6GZV6;-i>#SBT+vMJu{e zDx!Sy6H*b=0wa@t^CVuyF%MVk3ZH?%2@KkZ+^kr)!ZlLi3sHsZM4{l1F;X{+0r?H# z8P5#r7BOH8af$4D;WtYopLJCVe+BV=l)qK*#74mTlfOamvBaOE{>_4KB|d`uI|ct7 zc;fKQl6t2Q9HvAGyFTW~b>@Q}gQ*aSJso1=S`c+IX8x76L+j}#^fDIV@;waLW&)S1&t}lgm z;?|Y$K+SZiqd`6CQnOuEGeOlZ^1FkgC(644Jap4$!ay}(M4jB$z>AULTP@K=7mXTN zCm9(r*wyFSm6!vnu50qY@k+o$U2EOCP$*hgw$wF*5;G0HgGb&p9C5ZQ72X8Rd)eX5 z(7dt2n;Wh53%6D`CW&iVZkiE`%#}cb5v{dCN^gmlZX!a}QsxP;y6KY4qiDfh(*7?; z3l4V*y3JSjQ?PiV2O(O>U~TBkzj9RS=#f#0{i^3y;P^tP?e?usa&=fg9l0&1ltK?j zCBdcd6v@?KA^CD9EEfDi;vLv`x(I$HaDCqF>XGy2;DlD>mI!wxrI!-#CirIJo7uCv z3;qc3x}9Jd98g6}rDMGTQ2&RfMzq|8!_3hJonwJd3l+4Z@NeV09*ex>IZStSa(LLt#kNL-$NDU(!r3eA3(k zmpdQaFWjOf!i-twGM9qs59`i9i`i_(taL5e2p-Pia4l6N#FE7Og?cUQYg0w7^ERkG z1?R&}SNj*Bj?>yLw2MFH*UXq-8?(`V0Ig?V-W-+IyCKW z$f16qF4|Hgs>f-JE?VjqMF68kPfF3LkkDOsoGz{0=B~2>tZQ{i5~Bsr$l$vnT5z*d zFq%9MfwkW$2x7G0t5Wc}Xu%J3!D_AY0eHXbl0uCZ%@$+7juz!7f}y#pvHTbY@`YGN zVzgkn6ifzJds(Inn$Z@k+Y&rE!JrMJ#VS|~gW2<|(21VagBeGfVfbOR!ILLvBKn*R zW}DFo^&-gV{0SzpX^s7X%OCx;e2VYSd@0QA?N%nARr`5#ET6;-wkm z(vAB1EmOH}Rt=oDOzXiKr5fG`i;bjqyaCb=W4?2PY#PP^ZZx;g6Tr}&v(Y0dvS7u%-PqBH^{vCy-?8E;_L!~dW$pO zdW-IBrrralUnum9y9A6oR#S2`!7b#)$c;3Ao2Ix__<#MfsK4`fR3R^m2I8(Wp<;{w z|9@FD2Z7j+trva9|L2!Q0|WWSt-LH67;!uF`n_9m)Gv!Z45<3cqJdGTK#`Y41Ebdh z)Gvz$E@sQdN6YxQ_#MTaN`|-gLZAgS^EIT+WhoZunFO?okuvEaH2hqa8tr5juYIRFvtU{ zrEPvME7Tiau@3E^-@8Ppl#tp8Kz0MD0Y!a5hq4>6XJRuDnuP%B*I#4Ouf~A%f9LgA z`cexcj}i9)1}CqTCEG?>UnhcOeT!4vJk$CSbMN_H>v#NH7_@wth%O0RHvX+lv-T$A zAgi*Bb ze7TRLR3J6sOG*xLaDQsTAPQgL;J(y^t;B~qxHmQ7H{usMxQDpHUgZvMrY00p-$fe7 zBs7wXXCKyZwFNGaS4V^?ssrDG)-|vI z+fyz_xs*`c5s2CsgB=RXux9UvgQ0lBUVAbs4@C$EZEpM>lFgN4ZEpGix1cQ;%CIn~+r3eJD3cW$c6VxMOtKfEpHMUhq+lq!9YvX- zp{ClP-taiojAV+2@jtd5oEjU-<%GgMfd&q>)}o6+54F*@FPRCr?PnNDg7$ElmB(Hj zYwxDIcFeRK+orGilrOUPGX`f7F0o&v-vxww+UYFYo^W5gCt?=rK&wmbb@Zkq%__Ht zvutO2HrP%kTuAw$_QIzDpUu&AxXq2uLq&u~*xUp?R7`ke;)9Gt7sBZJqY@us@va*6 zk4pTQ7M5t#H!5)tjp?RQ@2JGvku0I^f_jZnHZL7RJ&2ArJS(WE=Vb_y-`kNvYX!%% zLw$Z^&>keS??Ff!_811FpFYWYsPG&)8QN!9*SUma?e7`bQp$(z+h}}$!in~aq?Zv+ zvFEbv0LrJ@CS}S=PqWuBnCB7BG(4SI*+6_I0ai_fB}v{|;X%Ou$3DLhQk-920+sIR zoa*D`F=lL%XEE!N$C#FWj2S17F=Oj_wvr={F)ewFY3aw9G4dGG?8h%uS@IauDp|>n zC66&J{TMS=9%Gv4HAOh&VVbEQW7>R-Y3j$AHXmb}`Z1=>$C##mjA`>Rrl}ue+I);@ z>c^NiA7h&OF{aJOn5KS=Y4b6rsUKt7e2i(1V2j7te2i(1By8DyjA@P{9J2Ws)6|bK zZ9c{{^T3KK3#7V@#WmF-`p#)8=DLbAk_TooMqh zrl}ue+I);@>c^Ni@28mhF{aJOn5KS=Y4c{asUKt7e2i)8$Cx%BW19Lgrp?EgX7$II z=IlJg*6(FA#0J+GMxJ@~$BgzHSgc`Iu)PhtGvRrJz4l&uG@o$Lj#&$MfzIUSgcp(? zwvXKm_!`2A_Qza?wdgcdrr3$pvp5C$pK2#p0$xIyG}}k|wS+V6=Ls(*oNa$Vo!1f0 zvAZ(D%LwN>(@yG?Tnw^3-~;W}Y04_9Snj-%FOYgJrq1Qu|IF|007A@nFvM%#v;Y+A zd>E^&JF)7-w0?qCuXPx3(Be|8u+@JxXDxjZq7i^#f=XruD>4_~*6m;=iB~ z^EH@WbK55Btb{{`wGXu@>s)F!Vt$7&UUTR3WDh~C4C`VXl{JxZvu5GwF=CiyUi0B& z6xxl_hIJ)O$NGQ>lz7d@GcYJw8(^?uHA1z@;`%$&>H|@al|iR0AC5ljF%iQx}|f=Yh@-)kP5Kt?ku(Gf>5E@MsR zAB)M54ezZmgJ{G(jN)F?t8OP}fauyOmBevjq}R06&*Yp~UBASsd4EYnty z)W|3B$;=ZZEi#-Iwi6^XGLrS=3zCfnWt*R+PK&wc(%i>E37Z{Mzj&D2g5GqLNsSRX zg2#sq>-D@BM=nL|{PJ?4mLv zsNhS)+3YG)LL+iJjVTdCMINOG-2^csm(sWHf_VNP>fSUwifU^cuHDr`Djkwe6OxdG z%n2b05Fmswk0Js}m=O?>NkCA9Fb@JEpdu1PMU2cMA}A^%DtZu65CKsUQ5+D#gNlNR zis-@bzSpkmBZsA?m35W=O%HX>Rs1`g)P$H%yjlk`+ z&|TF>2wwM%h%I^-k`wRhrOFu9A*P_W;>N}ZTI`^Y0C#XDbJ$lvSnvZ5Uq1m6LEbFq zx?Vsac#?zEUqFlzXhp9EsK=zY#`ugL2+cy*AoXc=ba0S1^+ALY{D@Hx7N=G4EX~{` zz!kioP7P7_V&P>5WuG@pIPReA^o9%Y1ZA%`LV!0YyNa6y_=2*3xJ6PB7OYL5#t0`o z*n*=tPJllsyN(G0B7(B-C>2mmkJUt-Lp@fLrDkvhM&G6iz!4a>SgvIP;)6#Rg8oH& zQm`Gt!-{+J)Zk_6ESEaX3^t|*j|j*Ke!+ySkO`L`oKLYwrP>ONz&lJ&xmt%L2KMXr z1?14{CM7x&R*GH!QRy*A>k(GtWoaA1LiYTZpxR0<7R_3vPax&pT0$d-O_k$hB^S-W)QZ+{GN(T70 z&3>6|UZisEm%BmYThgtA>I_nD#75JTPi@iDA<@q&iJs7+HPt2~X z>FTk#(@U;`rTIC^1-w72rur04sCHVKk|VWr+mLj7k?v0EMAZseR0WDc!#0cArEyrZ zh}j0TIv#ShW};?PAxC}#U~=qJaDI|;A55n3+HYnm#y7b@Q`b4vu0rjssV_OyQlSph z)OQ_fxlm_m>S>3%N2tp+^$&-7R;bTuYBanRAL7&K!vRgL?NHkY^^B&rbf{y5>P5VW zqNhV$Ce&O_9pzAW36*blhwL2=^$e-0Lo`+Tk4Xo`NK+p?j8sjP3SmMQ;~!(?iAPfT zVLI)G2H;0`g427sAk3Ew5G^)m$zv+2!+;M3SlsrLx+995%M zIn(hz;lqGg+u;65q$vd#X2S9j9IuUJy$|Y7Le=?R!OQK@U$zXl4pbJnr=K~Gp6by+{GfuS_0l?N2An^BzdLQ*jH8K zglKF8kH3I*qTUDmgJZ$TMe=!VAv{5cZ}(|ruutP@)T7O?W;=ZbK!um>gn=7Jz~E0u zz{ZU1LK^8gg=AjtwVJZl2rg|d}5Vs{3%^E10zQmx~u-ct!%-H+L{e&->T|K znM~$AVBB0u{V4EEN4=Nh(|J%IaHt_q12VgF3L1RPwXf z_&ZXe@H&7xx02K#;N^}~$b-?KZmcA=9QZ|zvB}EX0Jygj`z_$l93!Ewj)MBLLk;EN zYf!CPSJp@HIqdp`ss}t1xK1V93%H%FWf$dYnR%nZ7*LhbLKw5bD6PsED2#`|xUVW> zwlG$MvCd{x48~?qpBJk3>;&-Jj#Q|Y;-AMaqa11|1HC}~#i2SG$X*62?!QXjtiP*c zV~>%?FaKHksk=bs{RWsnyeEOBg8Lcp;tTcFquAb_bSds5cHtkprMW5265=blQ}8Ej zh;w95aoWXQMfE&j*;RZkE5f$Kvak5Ji#v-E#ImzEBa6f(g1NW&M%IbX5HI5%@jF?< zeM~(65#Y13in~ZGyOZx_!5D{&kvUN@;Gc8xsH}*%&otokg2xfZT?_o9+?iMooYe=h z)IcCC|EZY01A((_JPFNdz>RG@8F(J>Rh94};NF$+QsCh>o(TC(z!NKQ`fI@K3p`|X z@(Os<$yCf}*B8*nvkX$5tX?BG4D6-XlGQHwSu$?ZB$ljpHMs|ltqUw!z1Cz_n-fb` zuQRz19xj+!?PhW(Jdb!Zv)bL{!uV-o$!ZUiYvY5&lGUCj_tIyHC9AznX4PL0ShCtj za1&z5YF`sIV%!d#brSL1fCKN zAE<T^s$Lzq}NqRV(hq}icMu;W);$`T$kz1k*fH_`AH!R(WuF%aonMm&?x*|90 zbFYR#?aVTsKc{*P)aZ0^jeon<`@`VygGXxB^bc7r6j+hdRPjE9hi z6FPVM!0h#s zE7Os+`8K^#Wja!~+opG^Oh@W2+Vo*Uuaq?xTxR-bR8~L-$u@n3O~)8i(#o;9&sElH zZ)CLq{Y{}EX{RJGl_3FzmM>A{38-6=^ctnDQ2dJm_^)yRvU9s@j_ z9@B|sdJOb%db~)S^9Xcr@bJvSQQ`&Vz=J&8Y!);GzHK@1je>_0%Vu=2hnvxP#P@LX zev^mOYaQ`;`Zh%HZelt38Rmh9#+Ss2>~FZ>^hWk{T!G8 zfOvPWTIl@(u1k5m4yKW{2h?*q8r&giB=b<(V_y3LKH)6upcGU-H`-(NMs*}sqMi}z zL~L0bR8X^8A=b7wo`@d00(Y;3X93?-2`>dM)!1Vmk$i3dN%DE#&ZogClBV;?Ty}j8 zxLkc$$C<9_lE1TzU-FkJ`AcmKEcwfl{0$_Q>6tCRmmNne)3dhV`-x?G=6E?hpC*>+ zS;u<;**Zon(=%7_Z@`k@qwwhy{Hvzk*6>O48(ZW|KXL|h`nB+mA(zvyEx2__l<7x= zG+%-sCea-bV&+-vmo;grO`3#+CL{RAHTIbK*(}pskY2DwIKdhMziDI4 zV~6{|qj2Y(PAHRk3javxzjK`eJud}%BmB|@`m-chuq60`B=|}4CBeT)g2S5tOM(6> z1=>b13-mWB&`H2qJ^(LU`ee#78`E}4M!I2$^ptJo zGS+M=Tj?=i?N%it&2}$xwSAr?AdW2OptCQd*#BxgO8o|#17mQvB{ocO1Q{ZTWQ;z}k^3iEL z>?W(tzwpb2Je_IeFsmQ%Nx?XlcMkTlMuK|Lp@t3@PlD=$9VCgz(-#11352S1^q5_M zBw+)Q+(Cag*YfspVtNlyvA@7}g+q;<18$^e&TfQQBi?^#8uit3=JJBh`wS?2@)mHp z`m4T^_g^IMZ!mVr^KX*pFNr137bVYs5lfzbmprF61(r&@B)J|dn7RH#a=nOHHUKiG?GzXTkQE~x%Y71Z)8<*hzErDfhOu=}-pOJMI@pP@L z^N;YeE&>k`>?D!YnAcJNm88;v=T^e~fS21^vSQ_~IeQ7HO#MdvyT$G}PbUR@LbYs!>l5nLfEd@A`on5USq4j|TRbr!hnFw5(qIPKW3bu$oth zW_jPhmftZbHA91KK)uS3$fuI9Q^#v=&hjc{F~}- zP~UfCWsOb;4ug798)Q*t9R>bbW4>j~$hr)IiTY#Jau4Qx6W5tEmY0)d#e!Z%r?LYTE?DL)Vu)d-8MCpq3l9T46enpTA;DfQ3`d} z8PwMts?1`Vnh)whp~@`Y2KZ?Od<*a=N5{!e`Vml_30q$sEXSN#WXX2%Q*f?3B=hq> zjhy*;pT+Is^Qd<{Kkv7=9ej^i=I0WN+re|d4P<_nS=Y&H=ZYQ-Fh&@G{^!g6$(nshaEqRKtWkrN6J% z8qS1F--m&>l`6KMLqMg@H2pojs?I&2F12-J8_Kh7M%Dq4H#(+d)ad0gPKHIn(xIkl;^w)qL z9VMCcRLb6u@NH^ED9Iy1)*F*4nkk3bGAnn1wNRUtczyz2>DZO3r`^k-ZgZ$o^`yqU zgA#G5As_mH`bi~=rNHN}luCXGR8F%96gYNX99v8Vo%ze)rE7YnbKwaGuwN6ZPDn%G zPL5Ql_gJ1H}{T##>uOvns#90&} za^feC0c2DswOo~`&V%=3NHo1OCO9I77S@TKxlSCeuk@CHk@_w$emGy~%>EH_rFSRh zkDmP_{ha+j0~hinSTE@G!@s)4FN@;bjxJ2s#)_v_)jq$Xy&>A>y|7s%2S;yw2@$IrV+REg1qPXe-nobO6C;SZNAxzQKk+H3&1(^sit{)(wuv3D2jDHZuF#G4Gu zMLXs#laz)VKsgDfEI}-z=?NaJ6?uN4yvJM}G>vBOqupGd92E6GJvk^R0vR=)$41uv zVN~84{llm>bz$HB`>J8pA4dIO_`bZW;kMg-{|R{PowC;4ZtMtdY}rux4neH7d2ev|ZD*v|BSLAu;dn(hCH z^xH_!@lRlT9R18S%uNKh$0FV^H84nxh) z({(=?Le-ci#ap>h=#j4zq!IMSbg6cjD(Q4t@zFMXMvN+w8-i$IgSPTItVD{HCRDs1 zirP*w;Yq;2x3tq-Lcbc)QK~)(|57I)un|`FX-l0jOY|?FcYO!WD98pPDftEmRG{?p zCJo;MZgj7)I;rm7eW@3IzjGYLe`V| zlH4tTH6(Jr`TL?}W0LGHbT z62zb6ZUT%gM5pV}BfQd{cLqTxypresDxSxwUd)7FiR*OxY3=%t*uKWg<~Typ_t(%v zO>s6#(ObddZ9r~K`htAUaJ*rQ4yJSl<}6V`!PfvMNSdol?bf`Pp~XmhI(UhkrFbv~ z$3XQ7PO@F+Ya^@kTr`WOja^B>**14YWo{>jyAWI!;Pb+*D8S$fTkXIVjHI-OH$gliZrZcH;Z)|J_Y$t-3{Mwste|R>1IpF>{2oNameg4 zG3)7yZn&AYU(r(loXE|yddNw`53tPo<->!Rh7R@!$6T}-944KHt~Lw)o#Ppib=p7r zmh>KQxoQ>W__tpC>&E^i>?g!O!7@xwihtw4uOR?7&9B4@c^M@SH^VCH1X4-|Prffs#$#2Xw|d>b17`(%&|3)Eo9-YK7iBMc zlu)Le>`3FT#eH+!uPXiXjj~<=?pf9KoQ_Sv3~=YFWam1BP_`zrf4z@TwkEQR-Au^6 zow{KIbbla}f*r)!S?xMNnXNYxrV`3TAIy##0VZ<~t#0BrP7O%rE?Nx{&|mK>hEeYZ z2nPGvIT~R}4xR0*-e*k2an}%AV4fDx+X305kbA4mef)n?p9BGx?Q0@nZwjcn%hvqp zO2#pp;SCp$f>Vq}2`w_G8rH>3>ta^gWFw7(+=AssJ11@NEG>>Zp~x9WlZhGF?=R53toBehbb|{HOHv3E! zb|{24HrwZygxIb*Ap|?y?CdJ+P<{r2%`F38nMZ%H4hW70jk}lYDrm8bLAzC(h?t58 z%}z0r`ISx`tg(YD>~5B58K+Qi80JK|!It1dgD~YPBtnrqXGZpj<9EqSB1)fW|Yhb3>+ zwuZo%vf@B-S;w$$Gc9?ewsi*#d#vi1-(D*cT%R=r-iBH7Ms2GDMk(C79lCx?-l%QK z8?~*&kc_l$hn*D2diru$E+X1ErR=6_jL4-l%QqH)>n@joMZ|dfRPS`XLFHextTE7NH+D ztjo}S&#?3xwJrTdZHr5z$i^3rW#-@qI$!e^Sb6rbtVa(rf3e8Y04wH}{Y)+T&rTU+s2+uDxL9BU^& z>sS}iV}W%EpA9Ty9S-BH`_XP>dC@Mk_&CSLRuG>>Ry;nNSjqS-wleYA)T)i`+AhPY zi?7!Ws}a6X(M|F7hGDhF*B-;V3SVy;Ru_D|Wmw(uwb!uv;%lE_-GHyR4Qmd*_8Zm~ zBnh?uJibu-FX8Kb!+Hz64-D%#&=JG>5?>!0)>r8Kgkenw?@Plnkb;wj<;B-mhP431 zQ-&1*bQ))m@b$G}#pCPWhQ-CsdBYlluOAI-C9M2pSUe%{vtjWua~BM&6kop>)--(m zYFM-J^_yYsK|*FLYd^l`DC;o3<|^wbzV1}kr}&zutdsbqUiqj}8rM0D4zeeSEqM^9hiA%UFewdgx5xLJ*3Jgmlg*aRVx9$+JqXOu)T8N`J+Nt6J6-`ayh9dG#d zwL#P8=0is#6*v2`>C&4P^K*C zhbR(LjSs!`z565D%c3t~H|#t74!AKYdL6-g1o0~RJtV^SzCyG~D*9!7`99zxH%CQd zD`ohO5a9O|!N#ydTh+ONOEH3bL8q338C|r4F$%lc`-e$1=pF*SD0f)hmO$32R7hHb zGMK$XX&kXAw`DCR%X)&W8u(OJ8a}aY!>4Jj#1_VFZIG?d)A;mS&&pQlHMGO5H)Shy z80~QDezg5C7@qhf4Nh1~gDVU!!?9ATzEAeLm4Xl!@79>dQy$j z`ttJS(Yih8Ptb3XHhUW*Eh9mlfUjz|_R)+{4f#qnlkqHN7S zh2>kp2f*cuEB_>MN&j4R5{^e|p_^RM+rh&a2`o?WG2oPZXr}Tm%YnJ53%tz%`JuIP zZE+M9Kj}L`^K`@SXZE3SH5wUw;KD34GCxN{^~v}aUrz#O4T9Pt{EO(@)S>b(m08(T z&Zc5E)l%j`JXM~~+C3E)Cw^8X;?HXF2Oe?6=uPSoiP6M5HrQWOe& zC`yk(FzGi;d9_sz;`_qiq^+L-KP&id;2f#3Z8EGlqgscx>HMMJT=g$j?IB$-l^AIQ zs|ucCa&H4|6O6*|S*)|~l%gw_v^#5Y5TM;TE8Xv-JIRkj?t8(10w;?*=f#~lJ%C%V zo_`d4oOli8e-d1)rwg~Z!Zx2XDoGp3T;v@BX{wNLV?hgH923S#Fcvwo%SlSP2oh?? z6;@m!hhOP!Vy|`dBa8opNV}uJ<%+MsPO2V2J6CSszY!k9?;Q_Z*To6P8BnJkN&rY`oBv0 zUlr=VQ>g!Iq_qp29A4Z}odv7D$)}nE={G5U;doa9yNBt`b*=(>w*>e+@j#d38M3jP zcJK;8hDc8iXm9wG6`hSy;*HtM$;KGzQ{vwU*|2)hzg5To8gMFcsjCL`buYb)6rt-w zVxz&w4F7w@11hsMq#DX^^?oEa8X5E^QYo{(8p_Er*Cm2<%6$yDT&>6UJ*hMW?K@p; zXTq_hAOuiGQ)B^cY!_&kvO%@9N1~`ZNWOcWTJ7v{JSLHpTo!lEy%9iq8 z!SNrlA{U8fU8cnS5te|A@L|_qfQ{MCXoS`c(8Rm6nCCu_DWS|dS1mXw6K5&eMGSWa zxGV9mo^&<2jIglz=msfl>TnuX7l~A>J0B%nyc3d~eWOH#SK+~A9p#+?XRb{RE2t>& z6c_T8s(OkjUz<&vQ>li>3ezU`!(5ouSJ$nF7cb}pGr6yE<58}bV%Mn?yj>FfI9%5m zeM$0AyN{F6mj%xtmW;k48GV*mX8KOa;b~&Y>8pYV^aYl@z9#yg0yq7gj4*x2~l)NuQdp31^=7Z3Yy#GRR$@?HgH=7X# z%)DW+z5^nX6r(PZ(rhP4+=mqJM}vF281clM^ZIdW?(AoDBKlN;a{~ zoJ_$t0qdEQWy;Lyt4BFoo@V?IrS%#^@HSu>$vxqw~vz^JUhw5u*q8&VnuMfgRGi4Fl;{FNS{h{n) zo*qcLz6obR;C_6JiorRGIC&$f2HpFPFm;ZHOAwAD)rZsNP@|zN($y4CYT1 zELS7w{8JOqe$D&>Bm50I&)WrFA248m3qK>}TgO@l+uFTmt=|EyaLyQCnJ8!%6BnNos#sO6rVA)Om9+zNQl= zdVqfvybo9>`GO=h{st$>zX)zeEH&|~By}WkbM8?}(BEA4socHMXO@FyjywPSlqklaKOMyo@%mrH62(x#-w;a_ z!z7BR!FCi6!RBuK<40nTz-E?%C5jG^vZL4snH`K`qC0OXbs$`640cHrN5Qb8(94Zb z7^k`YnXAKK2)lF`8{(b8xKqODiw=_-JOtT!;`S6^9o7QDhlnMtg@P{ z`m<0^lH>nZCDM0+Wm~!*Iv45TE_X-hG-g|(IA0M(By7ePKxVJII00?$+{Qte(a3b? zZZD+=I5J}fOJu=E5#AC=$>|uE(emoGun@fl6pvY6!!%ma$CkITAmd&X>aq}Z24!m< z6zXz^Di+UxCKdgyJf z`npA=zHSkzuUkag*DWIL>lTsrb&E**x<#aY-6GPyZV_o;w}=c~w}|}vb&H({E6jzI z(QRc!<2nY{iIH+0BT}woM5dw+T#<4eBT}woM9OuHNV$#?Dc3O~BT*ru%>ll&x zI)+O>t0<^aH^TlZ$*S6f9;$DKRkfPQt)58U8m2g==lG$9T2HTHx(>%d>EmqHc%8D+ zG=gdx!2xaQLdep=3QLD7EXng-w59heEJ+iV`mx`++EOFa@#)SAOYWb7;8^j{W3H%(`7 zDDVUHP~*nH85?PTig7D!*TSt?ZEErQw~=%d%Kc9ogkV`W&S3RY=J{fh1$R-cHL}hakx_GC8-IlI#90X}Q*iw0Ke55jP_((P(r; zBRdI=?ArLqjeuMc{#!bNGabPtXyiHUI@EX?lseQpfJR0#v`}#|P^?IZk&&;-c{bTj zMSda3e7-a50V@cMb7xQ_6x(xdOG-f7h<^;|MISux2-+8Ph*!sIj>I}<5E`zsk-2ki z$(J0lLEwtm?P%mV>}<*>uZM7@u8fS)Ai#Itj6mOQCo@Vl`QKH^`7=PiZ2LYFuGdpv z_k@qv%M7NwoAD2qQ`Gz?(7?;wxV0hiTg_MpWxbU!Wh=21F6ym>TecF<1E)>kMm$VZ z-vdrB#{L$^PTa4aBOfP%HFAwY_V>Ut61h~|3T-2jkAYliG>rOO?|AHc`U|+K@fLeu zgOXAWo`vP8Vr(Wq0G3^u$7nc!k+pq;5*~APtZ6h-%{O9i7o`+a5W#(U1bs3J)$6xI zsv)jEMeHTP=!z5Jrt$GyYp&JrrmteEDc_)&B$Qq1ZZz;RDqi9{V`a0-mdb z2t15yBTpwb4U20dk6s&DTpM{hx1vZG*G8T$l!-9H-SPPLGhY!hvRpn@+W=UNE%2HD za9JCLyKA9sj_3}vUAqbSLx|Wv3W)p)*>{I$nv=kZdJBCUQA07DOr|{8&>Y_agWHQE zVeV}Wzq`z&xl{j!PmOUY*)U(lI9jn!isfhUsXf|-RyBGNz$sevJ==;u4P^aNf{&Uq z(pGiQtpt*>*dgf`G=shIG0QM->;YyX&6tCv>BlB0+)aXS3lk&bTbhW z6JXv;cC%=Rn)gWa5}M&|5~{1WkYentsjO;Y%M&wnBrt~zuPnM1vq7y_svj7!vj`q% z-eY6g+`u4Whq3ttn{mr%O5T2kH8Fe_Ia9dyb-eWH7$Jv zn8^q(!9X|-oXMiQI2C};oNNYC+u`Lff~YYPb{*B3HgREz-Cm+*x#EMoa#xZbg(qZT zWdzy0KFfjief`~tB`SSi|D(i-jH0?k@d|MMh%jJ%Z@=oBKbzbd*b?BYe?IG7#o`_V zeD$tNzwbfMOWAuJbrgZur1KxcOilX#JsS+cHP&U+c0?tN8ld3H2u=I|bqOF{@pigO z@w@dv_N?uQh-y1gtyc;)4t5rF>g$uA^=8l;(3)1z3O0b&;4D7sV--8e4N-Z6TN19* zsd`Vs^J1m`1iScKw9D0hn8QfYn@Ww$M{l_g5;qh41TnV(IDFtnU>|VaB4(+j@c$zI zfby->O5~~StuCWcDr|o!KH)WG^uUZSgqw|WK|iB?^_a_DAT=lg37%FKgQMrzK|lOJ z4%}Pu4@V#O!O?${e!UD&FLabUjJQ8S!Y>es#c};wm#2xv@qyy_yTIDf8^uxYZMf`M z0^3-;%!X|^fs;esnc9hPbs#uPgeRoRMEU~tEOKE)^k-(p#ji7O?>f^%T zL{j;q$8h&4lvNWoo@v;jU-(QnE_?@Eu4-A1D=$e`7elVREUr8>&T-`x;co-ZyM?y& z3!i)34s6o(e+mChVD0K|?P{M!Md*q58p$Bbh&Jj45|=@&KYAJ({Y7AW?Z~FGAnI)e ziIKYDDI=XkE!6-@2(Qs=;Km6DHj=1Na1X_;5sqNxM?mRvz57Qx zpUDZFC08kfI9@AGZ3tXjFdo@NW*xbtc>|bDIXRz$u@lIw8s^%Bo-0kxJM`r2kxI5q z%;`{qO9oU5Bk_SkdR=>qL(E1Apd1dtdMyC+5&Ty|;^;LR4ARe9g6sH3vw%%Rf#?M< z2CiO#i?#xD7TAN|P`$!wInJf_fYIrDw9D0AW?^D~v~QQdHp0i;%UFM?@q$khpJ(6` zBuhyX?7)w}#zh7`*|i2XDhDoG^@LI#6{>3~YCM`)T2TwlacNUV9R}Hzl%r zVI}W%;(daj1a7n(vV9=Pl!gs68tkrWyrH`17ATx?DH;v`0qt`2YRK?6VrU->)q5X& z`n_Holheq}E`lgNyP#Pq>J~gw2)B(E2e8R^Bbx2TqUmw7Gq0TKbf-^;wolG<`s7TfPtJ7uT0k<)w{0{A z$0uhxefmtNPoL@Z=`)=^eWuf=&vg3qnNFWR)9JI%bo%Twoj&_ar_Vmq>9fyt`s_2E zKKo3kFLb8US8=8jVGd(h`q&~&jsaCb^*f1m)+r28If@&_B{wcb??rgupy0yg0iMa{F*-v zy;kGaxtudMV!TZ*cF5}$$xCch76tOg7TR$|CZN0H>APo>tMER-R(-7tmKK$Z2IfXhGS? zSP&}mK~G`HiDayS?y?i>Ajdz35V~4>MhEcOxvOU19FwML6bl-vv1@#Xi8lZw)@8 zG)9^<_8DPi2*>StA`(4WJ({7Ai%nZbKP|O&oKSs|XBRU})(S^4PA4$_(5xd@Av) z5FG;?JxS|Qbpvn^r)};LL&3>FJ-Qg`UKND$!-PFUaPAb)JZ}2#aWe}12nvOuESF;M zYw?2nrys9bFpRqh`xO}YJtn)je;Q!} z2iBWT*wBIR32fxR(iz}hAJUD(YzbZ;(tT_eVMsS)HepEj$vNn}x|%^phq}~y1hX$o z0(#kWQaV%uI((-S&`=5JPhts3<684zm`NNi0d*o|K*J@Vw7Ur5l!m(m!YK`JnolmA z($KX4kO679PGCqk_HJ@Rx_9407}EXoUI}O+14=d(gSm_g4j7>`SPn$5)pTy#Zo3Zw zbmB-Ro2-dPfdiv(teqk^XuLvp2E|i^{cqryTZZ3as8r#*%8VK#shuipSDCv;18i+n zn#~QXF`3*nll{8NB3N!2A{w?B9*=g=Dk50bykCG~$5Bz^nEUYt`yPhMG=G2@v+T&! zxVA)`(`MQFsc}FjZUx#iHBKf-w#iC{rRnjPk({LfE|{)~ z<#O2UntbdFc8GlJ%aQ3uf)}ad9dBAd6@!muDcJb6r;(TnZu82lNmIz0IK@aD3|8OD ztm)LEPe$TM@FrB|P1U@eQ;qoX;KgGEAJly53@&Y(8ggj{B-~|-rh2zkGNB5jWB9Zm z?8B8fa8y*oyhhTu;2};s498c@>T8fq*;Kl*7m)2+ihTMoHCnI)x?!T%R>q(lsU#m3 z5YaN&-DI!}F-Xxe+TCP;#{y&PgF!73{$lc_R!W5bGH?y4#O`*n$i}FbFpq=D>d@%= zCAvB^+5)7jL*tKtSslHrR7dYCs>8v$I{H+p4hK2a(YK;H3J@@>BNeNSit6}T^#~0` zF(hy+X)7(D(>jUi=I>S$2ZMWk6_#Xt@)RRsJ6PsS!#lYWTMr=)ToO-!yUgx%3e53# zRq68p3glZbxvk|nUU;QTqq{T8sM*AyAn`$Eb-R4TsfHNAbCr4pQA`^sj~?KK%0rhj z_9%MC7l$F2l4xzz>H^1A8VJcO1lh51g(~d7jFgT&hZrjQYEV4p);QBh=3#nD$6nZ; z&A35RaZ<;jVzV}9f~Mj!i$lfMZT{Vw+N6StjoiJfG_}4%?ZMubzM!dHLR9wlpLaC1 zxlN7h(F?t~)JaWlUqME9KJ~jMUtK{)e-SExRS*JcZIdP3EYKue3+EX*KdP%HBDRq6 z)<83^3q2UGuG88nj?pf3VX_*o$r%-7xG+QUt{U`(3t5r~7=a6O)B~EFXp;^2f`!@1 zg;)aUqmS>g!Q{g1aHWOW-ah{)7G~ysaK&B9{RtLuT&VwVtFyZxb`1YM9)|p7uf}{& zU}N*&R%78?(NCE2L^Ob`e~RIW78VR{gtpPFww!21;?(U z@GwdYfuY#Bgu@B%3%N8x?Dme`NZ!rlJp~?oyGQ~OSw|VU_{T!yKOx^{(YJGui@swd zrD!8@DYn^iMN#0@gp&1HG&%v0D}~tvWdQLBFv@Y_W|d_n>+our0a7%rjRe^oVcr>u z>{#Y!zQg{@sQxDXtJV?}%&cyvk;v=C#$TB1rg76fp(#{tvz|hO8-Z*8E#Rrq{{zQ1 zcpol2_}}J_SB`FcoIku07q$)`KEubPop!L&_!kG8hRA!6OObDFSaS5^eWC!Qa5?%3 zm!qF>Ir<5gqn~hn^yBa64shKh)5;yqPK<~G-ggzG1A&OAcOaG3*%_`0l_Ht$7@DoN z9ZmI#QmX+XWx4#xzaSJT*N{KqfJVvae?s2_7utT6nfdl!9UHW;gutpYJJHbu2fUhiuPx?G{x?4cA@P``O_b%^#B$m z(tsKE6C6b|y;VMnbC9n36);#`0_;sIsw75C_NMi%DC8Ovro7o#^@xSxzBKe6II%D; z;52{{oI%s$)nJ(2g{>PVRBu#ljBFUj(^}F4Sc#u{iBjyT2Vm??xI{*K69}+J6!6%C z0N8Q~IQ1|9Zd(%20p4aHV;35U zj!05ADCa;)s*i^G7(P&e^k6tFN_|BcwK#Z;;ew814p_-wgQjo`yGmi47ZiCj8cLi` z;LoPc!A--qi3h<>rU}(s z3~ZzUM^FqL6a(plp~yP9ADS7muFJqy4Qsy4F*XNO&qSltNVgeAmU@tJ#4E)lz0aP@ z)f*n%B(rLc(3zUEFrO`ni1KR1JHf_f8t+?J9f*-4b0Ru0%Xe7&5~xEpZV zNcg`S<`1!peAN|Q)Vvq8el=&~(@36(Pt_~Y5lMOocnB0RPK%+^8m(KPlfmN)##S0& z2)HRF{b{f{^b3XE9h>2vIIRRGeteL=!)88FS$C$x&SZBqO|xyptgt4c+bq?EAv93x z2!!GbB{Q#LyPh5Mvd|xc&>VP}U02I-WAg%V9obPfP~?9@zU(U-%BhgN)xeV3hH{PO zR^Zx_*+Qj{8)x59y94btR_x0xyEwBp-}Q$Z2Q}U~D;HJSM64}_wj}lkcz7BAxDc}i zhgb=rN+nA_cKFuh07NOVLc!Jaitu$Z8FL?f8!u1>*39!=y?J&&r14qMdnMJ=Bt zPnC;U79xKcSdB@^Uk$dDe1A4r^3&0%OEIa|O`Z zwy3==YWbY>?Vu9Co>UD~Q`jpf{TZ@_yA0eMa)+pg9PVXu>m34zBWWSEwTqb6=ApEU zDh1k5wWWH`QH@y()$|CcvC4h|8P&pTi>#N)QZJlhF%aMuhSW(yWkICRg+=P+qD$zZ zC?UXMwP#@ZB3q!dEihdyOc4vPo6cxxcewCv+dPY4q;I!X@2YGYS9u)MyKMgBnlBYj zO`D&&&o&)$Sf%tiB`&i|S(Zvo?bapQ_p!Q4g2!Vr51!?&9sM%Y?>yM3Dnz%6Us z^PpKxoQ9_jJ^eblW_dXoQTxZ*7!J=M?m%6S`*o*7X(YOLXHNP3Qc zA>|v9p6@?L`9jhQ{A1y|w=wC3{`OnZE+W0y|1$k)LV62-U;0o?dK>>f(wmar!Ou77 zd7F{m$^QuH%}MX-chP1G(o6iisN0hCUj8}kw-xFA{4*&d2UG(iCXXF%c-xRZ*#9Bv zZ7Dy@-;eU`NFV8srJeSqkMUp2emjsp&Oemxt4J^PZ>4-k(x>=ynZv6|pW*);)$i>@ z`fUHZl(~lVdH%**(e6z8LjMZd??U<_Ki?$j?MnI*e;>+ROZqZ@IAyLQeYt-z^DKvR z<^Fd_FCl%ke>-)%Q+~aF34QB9`bPh8%Jd|CvwshDdy&4?pGkjYO}Ndd=Jxh`3I$^Y zAb{7_<5O8T!ht&s^AF1PV>w9~zlDaBv1uPOhduElHUG;M3~n}fxk*$bjL6wAt}eI~ zXB2*&g{AMf+a{1g=K{^qC)#(jJ&lsTxF{1ii&)gJE-FReHWB-}iz0(L$*C0ChkoPt zgA7)c(kSmV`@tl}J^K5RA@#aq59%as+69ceRSWU>6Z2wXZ&4N_~A z@^Q0oNE7|)1}J-|jsAHSAy(yskEOYe>H-}=OueN?a2K-w5jHo7MF+VfG&imfq`CX) zgnulvT7w-w612wH!_-{f$VPp*zrhV$r`b_2>4yrXT4@TD5+~g>1}uhL3gIL;+lTqu zOU(rJII}reF|$;9PAfhO#ahpwCX4a>WGnI!MMm{?qIjOU9Vd$0p!BI${5GUGj*0^z z%O1y5ai&(R#<83yu2LzyvBWpl>-0E}x5Vv(Y_0V3l%%tN5thB@z^3c5$o(4146qY4 z`D}Fl7&ZA<5b69tP2{pJ6%YCrLB34@7(oXa^a@FI1ep2Sg_CqaN?-+Dn1D_aW$afl zJ7s{ij))?;uM%crYO6=7_YGiLI_zMNikFt5A3n7mCurFz_w61xjU=c&jDEdz&2Iba zu18>@pu6ThUWV^+7?%osf(6zbPt1=@Hhw;6<_6qJU51A0p3VoksUGo9;HxFb8PB0Hij7y%Si{C!XdFeu z$W$G$tyN#CC9oI3g-+Dz9PHU^y~~~aS9Imluh7+>zzCiEsR zETgkN0VmVu6ocb2-S`QaxDW1GaNF5jJfR+3qk@}#8C;}&=>H^;=7obYE;uNtY8&y? zR=r?Gs0s)Z4p5oRJ2C~rvpLv9LpkB-_TCIeOmXlg{9oMQNzh& z%{&X~9PWmIxjFfjST-rKidCMz5w@k`;^hYT>wxnfVZqdt0{~aqpnR#%1gW2?VCR3& zZAhZ1KMY*=b*8?#8V?WZakvZ6*ov(MZo7X5?#Q^l13?*Q?@#*=V_RLHL;smn0&Ui$ zyo~z=AQ|_hC+%@>h6aXW9IPIMIS!#7iU@lsaFas8dT_~Uh%~!O`Qie2&OANFt<<$T zPt4I}{G(?0#G(e0r)%|1!6gm3Q-&n7q`Ehh99=6xsveCP7PU_>tP=cy8n}>UTgW&H zSV3Nm}5~DgrT;1hTb2Ex1x)A-+N&t>8)rk}8-+9Cs^> z<}m&dQMCy8?!zYVVMeq9#Lf6$#5hTPgAuI-rAkDFl?-N2)7&jp{K>44$eyPK4pkAz zsU)yi3!JMWkY6E?w){#53M!bWlZ%`qll6{~VQns!(D;s)94_g=<6Jz7SoD0FEVWT> z6L6Dr!l&$F;+#_<{2TGLoU4-+`3;`Zb9t(0cLypSKOE<$HCFjJxMLY3nCqo+B8G28c9l_KY(s&K9&d~ef%3Hw67vL)E^$$B(T+&O< zgzKb5!FMJAw1Uo{RV1K=oq#DwKy7soLr>8wMTQ;2b4%sQ8->tYvp7;*488j^2&KzY zg6{@iNGz$*{0+oSv^;e`BbMUQ{6C1#aFLVZB0q5};>%$1q{&?r&4KF-#l3DS-9`J8 zfU};1KOfm~V6UHb0{EifE4GuKNybDY-6*&$f#PC34$(2VkHS!Gbrm<0V_cFpMz>r? z_(3SbF%sb!^r#~oBOb&&3(O-D=rRLsh>KVZV_aMr+ybmUzE$KO2G0NC8Srlt`R(Kn zABFR><0Qf_fwKmp@15wlVl>+5(eO=@Q-j!=OoE7PO?XoKbUa+`2-F!JL$!rKKuPn^$=UKE_S4g0cuIE~nGmPU4F zjF0zQ7zO(g(ch9H%dFb!Lwa{yN6x61=*Z_sJCPq3&#plSdVr2g8cmZ%D9!2hkuOlI^o;Bl}0DlffA)hlBpMsCT4qUsdjz&{7YEmwvJvRhLucbVIF&n+N0NVtS2-^+8x{B(;AZO~%R{)- z&32XM&lpY%_p|?beD=%M*Jc-L|jWowQH6+hVIE?I9Hq1W)a0%t zb0gQXh~%8=I1dU3JB6gDFdw2k>Sa9E zw;mdG*}y`?xRwq6ByK7if&OT?%8bBp`F2N-!#D2Vx+8kJG*;gcoR7wH5Dngs#_woU z=Pz=NKuiI;!b-L)x~d^N&l>t{NDb_1ur7)n2>vT5sL3MG(_L16hnIrWA>JLo!Rnde zwnbxxX;TksQ>p_5utX#m!yY@yHuT0n8KN-PlQp=@L$`6WAdPOck;!6&Tl#p_f#Y(! zjDI;~j^H0l$|tdvsVQSRo+A?f3ici{t`lwoEFzS#EhV=Xp^WcDa>oNE$Y@R?7kP}` z4yzoOi7;D39s4p>0RJ!WMT1q@de2E8ao&QbV!>cqgqEd>kl3r#osY)ea_Y*#d zrISV%!soM@PUpgpQzS#EOW4d5>KQh(gnB)j*+P{%tS!_|w2(t;wTb7^%wre2;P`-D zDZrsd(xX(ilv)p3ExEuMF6we^(=SHlvS@@*<%(#vimoCnx{4x|B_EVNE-+35V$<9Td2e@J_<{Sn_Zl!UPiCdDem;jM{Tjo<;t`Mv zm`I80A9WF&Oc+o99*yj%llZ&}FzO>TO3?@$K*MX6VC%ao@H*P+`T+Nus$T|;MMuJn zS$1Jo8q>}$#<7b+{(v;V2cn>hq4-+HF8ZO-Eb3Z(zCg?E$i6x^i zb2>{Hwy2Snt|e$DEE{YlPM8btpn;1B1_tKa28t+wGrJy8NL|L;~$QNJY(7 zAvl#V>jfxnB6llceh3~SluCL^YUMRRsidb^Ea`+&Nt?wop_I~Qa)$uwT6&r;m}MJh zrnIHyr^~=K%Z|-T<6dkWJY9kTQ(O5wk96LT=Z(4u#$4z}eUHXVXk<_%$lq<82SRyK zbq7>W;9tG;2UMe|8uc$IQ9F|jYBxcnwj(JPI)efWEadah&Ssk4=xEUbYGagG0B@F9 zKw}FVtmfTpu$n()gVp>C8!Y8&yU<`Ur=d~XG3%7{%xso)I69Kf3i!;O zle31xhDi-wnCWbkaV&HZ$;g9etnrQz@|eRgRc$#VE)2$`z`Ir|!h2^Sl`&646Z2=7 zt<3t?<;$bW7$zUwJ1cW1YP(O*#OVmIS8JYK`J9ia{B2+|ldo1`at?rb1k8Hy=u^!! z%OV&Tt4i3o8$YK7*uVdiE)918Ggjt5rfe!5wtI!)nEqhG<3i0>5|4Pyc(R6RF4I&I zsab|t^j>2y)MP&5E&(p9#yPmPQKt*`*=iaHxs*!T%Xv6=37UF?lFKEJtoa^ylwysP z@tidqwu=;pB=W_wvKMVu|gctFg$eaH9-!=XR)^TLo&>-?aJU3a5x)<%s(X z!Mz>q(U|K;G3VEKqJwe8ILzDbb3m&A-FVxxbHiG@1MLoME2}x_SF!D~+OXY`ZPU7n z?W@^#TQ5+)6WboEFX{5Q8Lu^v?ark8jPNl4Vcr%B+cQ6}h`0aa&`&FJcf#kzEQ5U*uj$q1nK0x+A+9z9JJF34+E-2v=I}fT9MWHG6>gR`YkHLX|3<#=$kv8SJ!_O*~7739ng#O!Gqc2HVmIT8fhk*CS|v zMn{c6!$?&3Q}%JCj)qJd#q(h4_ZIA>lIyaQ!P4V$;FOMYfQQIn9so`qK>kn{XB^J) zrLjV2@)%YG_yOOK@GSis(Efs~kwNYxaHrrOZyAWf)gj?l-|cXxfir{L5w5xpw|0n2 z&Mb0oc6D*M&4tS{TM5oKa>uw9lN*ac>IQCl1R68gaM_ehM>H!Pl$Eq#q|w9drby6}NF;Oo73x7#RSmqDAQ~>(R+QCM-%E86tS}di9Wk?r5 zGDj*xW7VD4S{{+%-3VUlI+n!>8BVio#~rD6(d45x-g!srF!Iao;ck<96WNd1utVw$ z7Q;##c1r!0!mDi9HT7-m?$v4=mZZ+5@ERNTlJu{JHik$mzcY~t~;Tg#{$TsY97;`>99quzo<#Cm!VS3UJtu?f5H`N z*<^{z*a{UFvb&Hf@49|<9K8>0+tIG8a@nK1Z08-TvMDF}TSQ+*c{cPHbA;Y=UC~{p z!^&rA;s-Z4S)!V7lM<~srWdGHuJ$9B^{yc~$QgeSrt9Sj+zXBG2<6wS)d}O?0*obB zU}M1ga*!NDT^wT;$Z>KEWpRwzz^!7pp>DX>P|jXM#V!ZeXvn<^+F+YyduBFFr`0&_ zL$JD=*>E67Jf2onuSWbet+ach!-jRJ81DtkEZaA;a696_QCAA$XpFU5qsFSccZz{$ z=HQkVtRVNzGzxcXkv3Wcr!64EC9(*-Gt(&A4}lM|@dz!E;B^JCu(madj)HR@9R8#X z=3SFb(cL#wbdN#zBqU;L8^$`3;QKKsSIR!*6Fxw!$q%+zV_e86gam_zh^N$;WN1$z zWfZI3j4oexc^skn?PZj5aXDI#QeEa`0mnf`sV-CfIH8PEJ;L`0Wt0S-18gdzRG+#z zd%=}qs!!oggcsRq0XrE9sK=sF)v+k7G#1icNJ$xs!q8YGz*~$3-=g~WvEWVYg_&C7 z9WC(>Ls0+$Cj6`;!GuFKlk=h(i?6kQgs;hk5WXx6z zA#@D?mU!kD8+6vg9lo)IdEI5VSF9@a#rZw1n2@G>2G7Jevc6z;?2$`UlDqJe7G z{b&qBqe(u*3M8}oDV}xJI>!B+DgZ^q3I2^*g0N8ZgcOxFF>e zQb;`##B8d6^}D0~jiY|eAzT5bdQpt6dImBav1u}WVWdg=KN+RLA{za=Fv<>T9&AZS z&p1Y#H2f#kt|0cO>ZcPN)lVGNPVd^`%tE6{pMO#x4dN`SfBu}KewU=CRToqJ#E*{pOlnd64M+V4sxSN}^`#(6RefB5qLQIZe9u=@20Y#)00hvUM2*{`rQ4mCfqN1X_@7w2A2&mnEul29>*3*^Z+h^~y z&p!L?Gv28qGQz_=rDW{W#Z4j0L4uCwM5!9TsXmXPjD5};@YCAD=wg%F!XMf@&}Vc;w4y-IFeKP-LmgG1iBdlcZAM8ggyY{GOvDxIS)cOm(h#@ zDZW_OSyNfOx|)W!Pfw2LDDZ(z7fo;B#7$65{Wvz{I;=?N_Pr&1QKZXC zELm1!MS2n>FiuQQmZjK-cs&~F;_1n<7CR(%=yz1%VoVWVqXtPyEbAkkCn0q{GPHV6 z!aE$~HbR>$bKF>F@gfmI$+55q3#L_&_y`h5M52c*lCT^q;&Lb?w;gipDTf*STagPb z$|hofcnut`5iB$T7hCp%Zo68P6(jEsNN|zRKqNwo1g-<@)c`A|)jw#9-B^@ulSSFY z(nT4hv{rfyV-6oCWMs1W|K363v0_Xp1ilvUbbtd?2z)IKGl{f>z$Kwqk(Llp^iI&~ zBGWgL{~Gxc1K)^z!eQ_k1m6m~F~~$&s(q_-t=1286^V+=5*5=xtGM`1va7cFUfSj# z;HieZQnn!#v6f5;njdZikpxwUF0!NI$I_^%mkuAWp`Qr+v7x!tt5*jCZ0BtvV7IfZ z#f45Wj!KS8@KT~o&WbK~1oSwSj{`t! z&`EO2aZI+sLqT)MIWE*{P|43Tj!qb=qpq8g{5t8AHjPd4Z`5{5Xk%f!RG$0nfI)}w zhgZp_mdBnl6KU1>MfJ20r*aO(pgx1AB23*y`KgASh#Ua}|D`Zispo1v6j5SyfUaN; z(tZO!SOuW^Q3$5;Xli^%>^ty>CsiI|k-Xv;{02YGAQC(a&>bKxBv#pp@`p3GCKfM7 z)^*JOm2u=|i$ff-crJ2?#Y}yg^0viKi7G9X7E@0qo8yAPPa}!NZ-Xxu|4c!#m?BLn zcG1X=wJokji>uMvv=Cb?m9s~ctqrpDX124&s6WXTVoSDabgovfFAU=G)&r1dq}dyj zEi<%wLu}SR70a=3!webowt+Xw=4}h{Hj&2(w;tU{jUR_tuPRn6t=@dFcqDh(E={-?`Or9>5n3cn}5voXgSi;yC$~XA{3|Irl?h7 zw;S{*(qB+IAkq($UZiLqq`yx3(br1(pMz$MmzTr9sAKR^Q~d<>)pqCyU_m0@;RY){ zq7`4ObTxA)j!_h?sEK^drPSKW#_rH^mHf^QJsBEaR$A)ELrXY2bQilWDwj=lQ#I)# zwse6`RZ~Sz0ZmK03iml>>1&&zYq~>!75dY=h^23`jJ-@R4Eam^Qz-dPmTFb>HPT}F z43VyMJmeomHwDeNXU~w_13=M+Swa1@=xn#Z2+KJFyvR>qqK_@;-U;Rt?P07D+By9PY@CSfyEs?O%!In*yS}N>W zxV>HN6utQ*=(CKA7ew0;(u>Gfbn+>TeiApE99Ted zT~U}UQTdWXjfUq7lO;Z0w&|;d$5WgDvIHAYl0`0MbIDqT=Nn zDjIjiXn{YynzKrRt>VLwinAdV&QG8sBq}Omkz!l17uioxMGxobkcxU>ixuq&XhlD& z2#Jb{u{TsCAV#Y)PGg*_p`scqQjJcm#;j=}wq%=sBindnd63zfIll~*{7)9htgjL< z`yPO_kf^9QAu4jZqjz9|=&ZzX56@qP20zEb^MzVYU&T$imCK8{IYSh)=^vPQ!&uH} z#q4)0lP~npawaM6{kL+l$k1|TD&~`aU`_;co?^c82j(P9Bx#5Pt}reO7q^jZE5t&% zyAxfH3ufoS1N;|Dp!0=wabp!b4F1JQa8aSD)vJlz9NA+M#TRyNUMg9Vtzv?gedu{%X zzu?zFKyrA$Cj3%&pd#W7aSEKVcm|z;i}>^feS-BPa?-L&7%;gRkcFX0+NLkIRre8r zQq{IU;ImtlW2;iCoE?D5r~H-j9E39ko-Qj;#xI?~XT6U8e=S@uExbPa0CoRatuS$P z;Iw>~Qzi~h8e4Gj8dGf_tbx_Ov>#rxk9!-@dDO(w&&i3S$)}--qrcGoL90zjf018I zzDyhggujJ+nK%Xr{}^aBaSU>6Luyvg$#A7DddChB%w@rtpkb7)8G=+?^ z>ChB%uT6)hkkLY83Q69?8RkA`U3&(TIlH#*-;u}9=OuvG@N)&v~Xh6AL9 zL}gGbK#DygKZfkJSi%2j-vlyoEwO&e=@avqPWv;<;v9ZrD87m1CvuriDJHfD^pD^ zzbNkETe&i|7~RFB%YR@_gx;!(SuX7sdvP^HtLH{2am;Bi+#YhKf?AhZ6^6=B!vnGV@+fnLIY!m=l{qf^%XIrQTKu=coeI@e|+hS&zMhwobBj z*`AOY(e?y;0Yw&<6;WfqEiu!U*!q_e+iZywf0U4UHx4n)GOqoRZnkbYn0JRm%Pjy*&Sr9)@wy~W>xpC?y*~LR?i!jH2URkqVUyNIUNz~C zmf20``A}O^3UW3RHFV%9gjZvKi@NV^Nn)%LDkJS%Ka~Q$ElAD41tb6dsolR z_qD0likr_t_$&PJ#vD}9T!4Rm4$;jtx6|pa09ShMMujy`A%1mF8h#DW518KYM)pV$ zBb>2(R3ah=*cnf#MO*;eS&`}k5f3swfjBN=4{_2`;Dm@bh?7}-V#H&_!P&rrA{@l2 z#KSbP@L{MF3!R#S1v=AclviI0tVifNMe!ss?zxrMhD9jchFq_HnCZ(HPm%gV5QKB6 z&*eOUUwMV8S6@%j(ECebjF6%`l%ls$7yVBCBjk<3f~B{Vr}^}8%=M`%JsX)UDg9F# zg14?5WUg8|S6c0QVX|4K<7$x>Ei$zzvl-J#0GAbNGd%{EMC;E+#*dI%UT#`xK#zS7 zGPakdH^gx-7O{(`$28aUM&$hc3!LD#u!;I#f@o6M#hJ+08uRreT1EPh zTC#de&G8OUd~OVB##i{M_#|pi&U1>piQMOr))?G`%>XM1-T~MSP-zgvR^m@mJ`2gz zyMVPPb0sYY&n}+!pny-2ybh`EK2p5bi2}Yu+F;~K_#I$1Kyo;2N!d~#JSLqck3z8* z4V4_EKu1ui7odyI!hdOUlPz8xtW)`rzEVJ@iHmshtj9DtU7v+amF0ntX%ZfrL8r_0 z8^ymwz8v097k-nkLCXUu(a1RfH(PHY^m+S* zcynxeLm^kz>g6;4g08A;k2_&+5o(JI^q%s8D(+k0mXNze|1HEVcM05TPSlb0 z9Ph%zqVj^cd8I~)VhXr165`Va4Im?m)0j1`Cpc{EzDVYqv+=|eU-zzF=*>wbsUIZR zTJje7!_z}=oQ>N6bC~mSl@skM66Zq_aj)3|o0R}|Xw&fyd0s8Bb;PkoRIOgkE;sRn zSYO+jOUi0DCYEOX(dP4hI=-H}l@u;7sTZq%w^iSqtjYV_*&;GnMJu{ph|X0{koFGI z&9o?aY1|Mbl%te(7aZ@<&Mn3Wr{n9a7J{5Nr`VvUx*XGKviwn!iqhB_;&USMPs``R?;pUcf zv!g`0S%^j;l$(X@15&xUm2&fzLhDDE&u6{jrM|bgc?;Yej=I6k^~>ELBS^#sMY-K?4jZVlvu|99bGgjiQ-tBmP_iu4*7GD=2 z-fyOrm(}fNBzWlXSbaJg!xg2|Z#tVi?r%VGY=Jns7Q;vmCH%V1MvbGK;?jBGoU2^fLDy;OtvV~{mB>xjb)`@H0a57C+CN=7yc`0b!%JS7 z;bqYM|LgGLP~XZLf@=J4BTbo)3*9`z+&rSV=qs+)&87IcZa?tsT>BlU|MtMM^D2bG zsUSk%gxcy=9Xk6-gMQLiu%W_dqcE{nbr4Qv*zQ$g)czLea){{~4tBs#8OO3Rt10h8 zD1RB9(IYP#aIx~Epg~M*ruk%G&qqQyB3pBDS^ZFmeO5zXcWg3BT-8AX#TI5zY?ZbrI&IXn6v~$heK<= zw6x(9ppXr}vP{FjGWGvP!{0L76vEp76bofu!d?tf_Y3&Bj@jl*{Oe&ehqtA#l61W; zDjvb6O(OD2t0omgBC^YPO%Jj`Ib11#89_ifY2H*e7nJg!DCvawKqs6hQ4{Ddk@F*z z`tBQ!Pv7)?2AnF01@-Z#zQrI1k(3vQ^j!_|5s(&b=}%j>fbw5NavKDpm+FQ`8%Pf@ zR*!-i6JnH)L~{6d*bu}5BoZV8)FG$>&;ua01GI#*`^(JKEzX`Ukg+~palfuVfH)Ob z+%IS-wi@>rqpXNLA`VfJ6S6dY8tWT50Uyh-5x;2R4%_%F27WcKAye+ zhWgWM&T&k551iD{31=t{9mfBQ2k? z3Dar#E1(nD7Rk^t6VZ(4u`9)*9NeW99f^Mf4*VQ~R3f?MQ$YO&s(dwo^zQ-c0^Cl} z44{CZJ-|N+dH}pl&>!G5!94)K0wj$C2roYszwuY_!`g7L#qIJsYcgBa=GoHPsIU3f zfNb(i@ZvDvyEmc5^enU&I&4?W??a%56N&_NGc85N5Z>SCp`I{0?r?~G9goGLbxr?g zNYQoAF8mYZ@L|S&UnYeEhgr#m=zvTS6r{>1Xg+{j*2U#4N2Z3y_JMTq4 zjt|A~S?IrWh5yft52o`dtd>tNxMgD2*Ge?ah3l88ror7Unn(KYTK3;AXc>wI+S?ETw=OwUhquBFogdSxh^eBbc^K4Wq$DU`WmCCW_Rl0z3qX3fZp7#Z437{}0 z_+%-f@6zduF2khbZ9x=!q~q=4NN4?k5li~nF4~(#Qo7+T_PTB${kYntt%HK?>~*`N z$ALtr3*gC7Ee4%Y%Y#sPGUae+DX7>7ki3iF9{`sKmH?Fh5nweyGlGo({Rv(Nm`cEN zfF%HNod3dOkKlI)Nc`uMRTBv{QpSIHw~Va191Zd)<_z1;{Pq`0 z`Dm@9OBFCeUn%AH9Gz90B1M*5&KAQ7`Pi(p3ujzT!Yog=e6GV;fd6R{4%15@!9O=$ zYzMvREC%-Alnv=+nb(jU-s>%-nq~tqBVLC)%&;GktVPs9y6I*feD0BNZ^8FEk?!d7 zHk{lskFYny^-kP@MEdmm7gEE3I0Wq!In9fBF&AvX&WI}`LfBnySe~X&rL-4{@qC2l z7(qqTuyxm>vZ(%)AqRr`KBV{tlNN+$IZheOfP7C;cqa25a46w81O|l zmh8e7I$44iok8&;h;O#Vi$vUqdK4*fe0AiIpn$(E?J1U=R{mJHNMY16oN5M{s+KrG z6ypY&QZj~;Atv2zjl*-7rZ^}17pf}n()H`MaCsMnwWtzm>J_duJ%nz;YW4~b`AZ=S zBVeC!`qz>Rw|&D!|47&xg7`?24fCMDhA`!>@Gi`TFDms5rz!p(w8X|;6c*P+Jwt~t zwJpiTG)PO9mRe#X92_VV^DiYYmcYJe%GkGD*+)x45DvB>tqwt0Z9^EiLJYKE^hz;W znfgy3*Xo^qC^S5rs=qPk1fdJAhY z)ow|?5SF!`DlN&Nm?|ylL#>iy)|Hk}SS$Z4)!^NmE*Hk|34pJlan*OD4zl<- z*1AX`R9Yc;?Zft9YEcg|`}1}s7D5NDcwQ<&E1nm_X@yF&hT(2A7n@VX!v^68{P}Fp zeNr?3cXtbxHs5rj6w|%??5sB+jN30dU`rI0G}Ki@RyUO`4OPd7EjEHJ3i)#>f18La zYixWUA8HNZ!6-rD0AsPEE_O-h@2E?oO6Rw+)I(tl`;Jbc9KH8`7Ihzb(e1Wb_m#Tn zKB3QIP|`gixIjj330hePL=*YY0j_%Ku;4=9G9sBZ7@!jzX#*mUtLj zsx7_~tm#Kc8VGpB!$G6M3DW#%uS50cd_=AdM*=z}RrOL= znVzYzW`|?CaIh|5i~j z=q9_vn9-k1i*3BQ3_i>zv(snJxq&~tA;W<~Nmy{5ExYjs-`|`D?g{G!v*LRZuX4w? z<-aT3@eQbdnOmz!Lz_UN5`CDYDMv7ic|-~ZA#P2c1ep{p(cQ_|CYdZ54+}BlF_rlfJM&`69P<+{`5^Ptk~tex@_tc( zwId8z${GaJa)9}(4%c~}-7{Pn5RipITjcV~SY2Kg1!GF=sdq7WsP$@_c zaWg&yYXw*txG`2c1%Us82WYj^rB_G(uByZ*?Gl|b6#N3gB=lHCrDFk`iNV-((Z9yR zL0aMxI~17oArEva+PSe%^Fbv~LOwck63nXl0kl(* zakn_3BOW!Wb`fdjFZ^9`6aGxn`MaW88JzJ0QdU8826~Y84nYL!{4)UFTZ=p+5oiq6`&hH9|At`I-B5bfI|d%0OmD-X#nv6b-3W02?OF_rM@8ieRzVW6`Gd4 z7p5`N&LJrUS1+bY<1cKdWp9BzquzkU;5ZiMnv4sua^3=qJ<_JNs$6`rf@%2X87g@% zE7=cex1;cC-2u#B_`9Mk&fs@I3TWndfQJEceus(++0@G?xzHKkm*K=IJ(aqbEB)bk z9F(KM3RwzoM%E;B4MklCl`3=BKV?ze{x{H=zZBIERNX9i;UY||C$srWvRvK)Mm?F) z6@3-7mh%Y8V~f!<1zuLSz*(O)F$!qjCQjWo)jYfsqTZ2G{k67vHDyMw{<|`-rc9+{ zK(WVV3AGATrWmVeJbc*>#?6C*R9V00np|pJgIGOT+bg;PgDS^BX(8h#ig6Qd<8XmV zYfy_rO0l?(b_GX?Z9DLMX+yZKm@`mo=xGSg3GoC8OwvMp0iqGiJVP-D{=ZEYO`ksm z%_$%oiP1uKASp{HA^Qu-)sv7@LDn6FI?X}BjWA*T&N*rcQg0LQ|IYedCMnJrGD8O` zD=HyJgKUHW`#K8`<4Z6ko_C;9^BB){^k<-3#dD4q)l^R5+w<6Ne{@aaUXGO&)Pf}q z8RjbA4E3q7svt|3dr=a@s)8&|9s;FWDnV$yYn^6jgmmOwNh6XyO_5uMi|r82VxkNc zpMa8~BE|vBwVV-U44fziPLj5pWVfA+yWADfsA2a?qxHb9pfW!TkqI4@mjX;BcoyI+ zK&=-6GTy*XV<)`51x0^PW0>Q1q=?`w0%lzgkVTmcW;+L}mSp7^VW7MsR_7_RGRKDi zzD|Pwny{+5;PsdB5}pcEL1L#KMOn^AN!51}Mx529}FMyP9nvm2DCm=*6M6+6!GqKs?@TlKwp0h#4C`6qtkSx%|{yJ=WR*rjx_o`U-%dpvX_HTuOAmaUxUY- z8IB+=NhoM12<)kBxdMZj9^=R3fkjB}$mMzD$Eq30PH}dA}u+wZ^ zT2<~s4pGz2D4=HpxfkFGP?+hIYJE%v2LALa*83rDUKN@iN879 zROK$a1gtY-#76^T;G@@()(K@++X!I(!rv7);nkAP-xbx$;EZ>WG8!2(_)e-B1jhj$ zBlrSfH$dGHa7;2v$@mT_-;#9=APsLn%5Yf%ToIjN5z-F8_R7lv5_|yb02&dz4A2{(_BH_ALNufH9s!$X z)IJ1&$8T$&mVdiuoWsA9Ae!+#fD>!;jNbr80_3`J7%(~yZ_wc()0ZfHB}06tIVcXL zw?f)nNL6kGun9o+5|nZxi$2yRV>%h>p+p(eo8gLtjOmkjX##U9_mbt1r4h63GM7Sm z4elr9Cq2ZGedHqMJqg}g$tzhKBikUA_2|u6LmbJvHI(&z$y$d8RLr)8RoZO^<58u1 zkyZ?L<-q`+Xs#Q;&6o(P3#gnCkmo4J=HoP@c8!|odIY>8rE6?R*JNZ8UEu-fB3E=} zgUWgGhA!NDHG|3~(;eA+;X%%EbD+hZFS3j5w8bio8MN$UcH#zGaAB^NU2Laq52bb0 zvd5z&PG*P8C@iqkzACG*&`$gVn zmgu1*5N@RceDXW{0QlSsj}gA@OqKNnSRDKQVP}=;Tos|_`|}XsT<~H@cUS6W3D~T` zx~t%G0eM9D_;w1%6=kAcyVODx{fJUmLRx5{@WsGnu(>oShkhpNQHXryDW|E;VXBG& znXGs!IS8z4xNjaqRfhzGQ+=d$Lt9sF4loX&S`7g67yhoe3G>6s<}dtRQLPNl=!}$w z$e7Uw;9Y{@0LKXO0K72(QvntM)P4{EZ(JLju>jybq|_~GguMo8kg*ae74a&+jDG>t zB;Z^6niISO(39YOfEfT<-MHH@5TF7XCy}(CNwRhrgQ~RyOV18Z1lOM9ijW$b<0jKr z@?v{Va{|;%r@oYw_&mq;7M`hxkA~@?pB{i-umwkwaOOYJc71fm##&t!l1XV>Y zYb=*t$=jg0UR~)?=R)o5ov<)ZgPF>6)qe{4tB_Ev$VPGC@~Bmj9|(zqKSf62-n~@p z-d1_Ied|sNOX$^d>N*cpJ-JA;Mz||U%hiuHo`sNpi?mz;QS^1t;=rvFFjCQh$27{(Kj!|KSnD@5HB zB}B54l?jLC1oasfiZc#Hy-5mtAw?ah2{_e1>b66|!ezma<#bvFhr(AO)?AJpK6P(H zIn7&l?~Y@2_d(z~oRLNW6tJ;QyK5(*Gjm27ii50DkVURcEwhj;v(kDVbZOZ`kd-5N zYvkjw!M2=>G{*VelGYt*XqvJu`WOT_ zOtqJ9p|#2sn8K=Y`S$aF$R+C*WRj&^Xx+lhdy$!AWD=Y&K_x|s<@PQLQIm5RQe_Xv zq84m}*Ji2Btv(caedvR;O0VK7qz?Ay$Szb%Y|6mvs0IeMc+O;L^}1;&99^`d3=DhW z-6Y(irl`6JqJVo9qDU>LCKBxx z0u$JH@FWJ%hY%U9z}&S=3PbT~ItQ z{Q&3~-d-8o&jDFzk|(QvfW0(F7F%<`QH8tRlz;cppFpEI)ix zM1v26`(Us=V0A||IAEnADHPtFAjzSsnWQ1GRo!`b+8wO2@u4+Yg+cN)r0&O`KHF13 zU%Z7hM-cUV6(AKrEjoXM$az{Y$8!i`ExG8_WyRSGGP2^Nh>!7NuQ;cfmej1g^%3wIAqa47wNC{2Dm#{oo|=6Y91aH8>>|`Y1Vae-A@%^kVOTbE9F`H}a4fgx zv1xQi*~;cr2aD@44ntDWGDc`oo8Cr4)wi#ajzDe>0`;Y<@_M;KY7l5BT@>Go;2?0# zzS{Vro#mRk+KAy@A(iEK8PC;?BiCi1Zzbb*q(_T-j%u3Ox261Ot7%qxTZ)Y^Whulv zH<}wyA?lRs7V=R)ttu~fau~|Njl@`^yjC4S+6-w|5JQ#Q0~}5T=mD@a4WK{38vwN@ z0ALk1wf1xYd#BcZNWhk<8H)gpLndP-K!?fz8vq_l2iO8|o?sV1W(GhJz>5T@0Im_7 z2WXNB@Et(YDgf62<`cLPO&b7m0|3`xb#4McqXK|5fMHW~t>rxsR-3Ih5Ey|!eSerQ z9o6F0b{4ryL3&6+rni+L_|ZeCj;hnqQCcv6s~C3mQ5!Ow<0J=qA zSjL(4S7hNdX9x4Hsann`uz2dgWSMXg<5SrWIU^Y4Eb`7?sQmSjsVU=_KUj+}KWXV&vM3L2wHaIbe*EM2v0c>B^AS`;l!sBseh6 zD4T6QisIC=G-L&{*(w)-#|)dwWXM@*Cx)cZ9K5Tc1j+}|k@4=RDsW_ZH}*tz;5M%f zvdGOy2K6D5bAEw5FST-fvk&i3H8m~0h9U~6E5|(&y2?yTXOUH=C5jxxUuaq)BR!NT zahRTC$6u^CcYyNkhiT=o`gdWGX$GZ+az%3 z;!p46_Efd&oPunkjUYWFAsRnjwx(Xt!Z z0)75WfEDWm0j@QsC;`=jRJXukP#(Mi0lMfPB4EdSD|nRUzVs(*RYw~Q2|8?d*= z+0OrEwr#dVIHo!T{Y@28ic26tgX@MQI3RS3n1Yv^FVuqJnMOjW&t?B^E9(^!E#n=f zEP#nsY9EpiWp?$INHRoN)ny@(Tb1NwL4tz=%y2H;G?n{f$*Q%f!UafM{d27HjRZZh z1_mw24!|E~bCQk5XhtGI5OJE_7z}R?9wC;Zy6U-Fb}J;&`(DUEFPBiseUXN;c&H=^ zxQ&M^gLeAQSaslCnS;Qei9eJv4%r%_j9M(C6U!I{2HU0o4TbFsDIC(M_P}lR@vt2q zf_($sn9AlVg&S>!O{s7`6gCsaC(y`h%logLTlh7ej<`=M+d)-iM?v;8lJbU^GA$nHe8}dJa^^X@H9W zwZ8%|7WS5{8g-n9n4aMLrY4khN>+I*w*c@ofD&?LtJVxu_6v|_OCE(V8*Vy+VHeVF zKFdY>V%X#zreA`mvBuS%jcDX4r1giQ${ztt2S^V|WSm3F0;FVI26&O+SAZP==-|ho zha2dgP{L_Mofo3?Y!liU3L}K0EK0D`YztxIBILK5R}N@Q=R(MP8F8kQUXAL{C@-;Z z<~|N4o4cg+X6_P)q+zjJ;&=%1s=2=t3>BYJTYIFp)%R_Kdq+rnC&P{+)_$2@lBL>v z1VipDDy7%7j_|HhaSC1AzIGSMUpvs~vOsoUb64y+s{^ zRGv^DLJ}P>hbejkyVK@u1=~Ke)a#)0m0p&ER`}xEf5Z9$@df>G7=Q3ZZf(?IFc^&e z$*=%-k|<&^h-M1V-o| z>x5WsTlYCRACMTP8K2YCUqN(cwQ52~Q~ViUR1SxpjHYN;4WI`=wI3m%-%}QU3#M(-BHnuFa36X8>tw1AV%kG zc;m?z^=wR6{b5ww^QL+gyPN$U7n~9F4sGiyTr^PcdH5b~<@0u%nhIZj-uwsZ^(x#qBD% z_Ld2*tB?J!!FBUPX8-lIRDbpIkXs(@S1${>4VLe~pF~oUdTq*~5Zw%qryT>~=CQCx zZ?YY=tRyeJ*bZ-P!&9m7_1$noxIDjEi5Z*0xe@Yyol1<#0+Kx?BgvOY%BPYOneQ~n zaCz7>aWqIzF39@^V+D}70m4;4diyhPGEL;m_#*k`ijF30YiN4!0$yve5R>6ZJJL?t=E&A;HDh-21p~*j|X{#z&s;PglLRX2qdWI4~); zL(rXD8V%SbS;^$`t5qs)kQ9}VBsUzO}4f_)kG8P@R7kosFce&9{Jp?pGlgvmPT}GCKI2!L3{KX+u@izX*ssq zG5n$Ba4=)HTpl$nftysz)FyCH*~w|aqXH3Uw#fh@xS)CzZ}l(kEfzlwg1`=)jQ!> zNBc9WoZZyx;p~B)tK9!I(A#f{TMDr&_zT;?AN8g2) zl&y^bvgFB_-Y+3%H<11wc+`*uV>dtDj|YePG7G=U7R^Vn`_hgXkc;LE5QM7Nf)pN0 zB9;DB-sO2Alj(QyzxAI~zcY4TUi&x*~D5xT66= zH?HS)=&AtkYgsTjPDaKG`5r`$M7fZXs7AP?Lr6s@(^d%wYI#TyO^TVVpIb5c60#7 zd7A3ZgSeg*l16*hg1IhdD=3l|x|l=YI=(^I4wY1S$q+vV9^M{5{*E1S|8fD4%duz( zW+^6W{h-64eT9BwFD8q&tI_A_B{z>adIHwb|NWVAy}_LnbB1k)V*8o$zaD0cs%emx z$I6Ws9aY9*I7h{!>s4?re9LsNzX=KcnRD@@g*oq+-+$rPt#gt$%QE*M!6V~}bFBx) zgv+=RF5^nLj4Rg6-$j<9#2LG$t%bBCMiomwO-*Ax=v{s9nr z1zS5L_?XY)Qp$9(G`yMTu&Md90&Mpk+Qzk|{=NQ%@^3+z(S7Ms`1+@osBpy`=yj-d zyAh-(652?Lo9E;X!*xHdC>YZaqel8bGK{c2bQH%uqy9LiI9+Yfu!efA(i};V#&D}6!A7YKx&^S9q4@H6aiRH;IReDdE>l_Q2xh$0>JdJ=LK>1cj8p_(7C9)>LH z<4~XER-e&cjZ~M@`6%}~<~lTzf@n8#j4mgc@;hPGQ-I6pK)2I4{S}B6oP<5j=19T| z;P4wku4c3!0p`o}h_^f}bbh20dz}1rIKvn^4i!2cCq`{85_gDc<#5!ZJq{3sX9f7i zxwlZX>#5}+d{6l`Ejj4wXEcJ(tX|)MG0NBjdCfX`6vVwk7}kIzAV$mQb)44xk3ftu zMtNYc6?g~4SYt~)*yNvg0Ysj0Ph(9hcKSD-1vSp7jWUYD{GCxT*LY(HsIy`IIIK!s z`9?|v=EX4o#rHr>G+dQnjobh58BmjquE`i(!~MDMf|_i+hsbdI{7rU%Dlopn$=W8L z|7Tiqzp=6vsuJsebSJ1O#@yOCyN~scWO-AKqwrHgoWBkwXBih;VD78nkN*tR8Y2}h z$WQin{u$Dlf%9 zpVYq$Iy*nbAIbV{R60}qyP59=p{AwyZ~GL~CXt+(;(w6TOG3>`@t;FUu9tq$2q2{Lehnxeo)wmtuKQG0p|+&>t9$@zzfeUf z{)`VneQZ3Kjw`?^en0k*u46)do#M}WAJj$TcoST{N{JpaF;8=SZ7^J~r1*c>4c;YV z4d#-oDgGDP4iS8%hvp0VpWX*5QYb6v-^g~5w{&U#pnnUat-PZe+C32T?_(X}9P43q zT+nar0+lQI5`zBm^n6>PDg`xT4;}MVYXqjp$zU~JKY*Tek+E)U-3WMTAmN&efZuc` z-1Zvaw^&MHg%5w2B{V&-9%Gl!JYc*IO_uL4(%&~a0&CWrUxGL&gl>&TieZ$T?M}FG88dqOsg&iNS{;V(!z-?^K~N!!`4J zV=xpu@quvjiWF$7ygvvLrUlNRiJa!I#x@rC={+dpH(_bkQXPg}7ecqzd_nUZ^oU_C zMF%!@Askxyr!Wlp%w3KbOss*Ld;-=Ug=fv4JS)^IFv3B2!2eg=pn)#!HuJvK$b!OMmF`YPv*TY2i5|oE^WYZd}Q17r#0*es% zVVwm|+YQ)7;9QKjVO^_)VJ$Tk0$z8!zQAVh^Jw<=-=R>=q^<4_a0nW+eKRb@JKhG> zZp~P*7kRt$2Hp5x@LifG@)PF$p^C0~qAH`iY3BMb(0P2sPV>+`!2advzHYP9m%!1( zpvNovJpp2$`Hc^GV~7J4hL0JhdCC*VRTwsWlIDq}#R(O-qV>eFlO=2M{ShJVusa;+ z&QfsLorJ1jg`McVv@8A{j4j@+}+nuOP^iH(*svbSs?ngyJssTJI(hXe5ecA5teSK&2c!=cVRb^*9%ePFM-9^+MbtzN)B^Er(6;kBm$ z2h0SF58-wG2^?n@6KC%RPB62mr|yry$>t;Hfa_Jnq?x8w)H%9w5{}>x?9anLfk79b zz%@aqK`|rmu8nzBr{^^50*rRe(PJ15Rwk^5yp@k=g@HxBOA65>hM5Cq(J0 zKk}OhpStM2GJF;sVHefERET~pBgAq;LbFSS=Mro-$gswp-{-ynlrGbqgW|l(}g%4uv!Qc5`A?zY{8Bc;^9ef8`-ZePm zX;v&ojfmYw8(_ogv=77{k#bo7#sC?ySHz;Nz09-ESP!un>kZTE@a>OMg*^7~QE@~O^tHCm3E77iNlCCVtf`nKSuLb75hd__GXtYNf2H6PRLA&6N z6FSJ0#i`YCyRCD~qJTIe%N7S$j?uA7`L`^%>l5auO z5-F@7SZG+JT`iomwTEa}L?cIgq*5bn31?F&!58jH5Pt8o&37kOeG=IU|=MAz4xXo$^A8#tLr^1ALMrz(P;&5{+ zEb(R#N0?2~rrs*VUUS!3{8l55G-oq!4TfYn&FBj^MJB(GawTj|hic_Q@D+oVG7fo! zbv48a(~R0MH!_vY5I-A1nHgC%vmC6gi};GHt}H)-6?0?_COg$8r2(MCL8@lVL8iz$ z4x}VLff3LdnKK4B>2uUpONzp;p0w>7#DCIwnCD1}Lz6i*<4K4{-qsS5@&7=5e34CF z12!+C)gqgzQt!ch8kwv7RfKg+WOHJ-c{gQR5PLDVB6DQh`>AIKW|`#3F5ws{m7cCj zPa&c>vYXPg4nZH;UFo?4ohGt}=rOyT1MW!^e44QniX!{G10r!RWSo)xbD=Y771~lu zy7~=kbRK>;lJ=l3j->t=+fbu@R5vUJlCqDx3qV{Hrs#V^bdnbTK75-Hd2KzCl%>Bb zOP^qkuZyMDmvk#0GGLXh4PS%M^*K80>^;b)F?4DS6ks}aMz%7pg0Qxtvq!d(89}p} z(M@fI(5atL@yz{)^1weSB4v()t_Q_$q3`uymg>EvY+9EYM+G~OmjpIH_|K= zB#nNLY`QdS7-MaO!QSJvc9jP)Ql!EyiNa9^W6x_9Fd*)gJUP}YILL^^rWbh{SXr0B zxzAt_HntX_%_7GbjEP(;NRNy)*qDQ?4>o|vGuRV`S<}cFCr-?_z9lhUR2RgwZ#@Ao zi#2j!=QP!jgwn8hmp3~hKdqh24f}PxWZciDnP`k=C7(Hkdv6_)Pa69mVR2O#`IOO+ zQ-&4$3W&wF1Gz7WTw*)$D*gPlF$YqNcJem{-xqqMC5Yh}GV1;7)Xn*Zenv zE2=ZMls>#d7UlS&`tlila|DI%!SOfnr|42qBRJnW%?YSW)JS5tc>qx#HHtmJtCeH3 zzZkLvrH{bKlI%O45Df)KP>Syar%%m1NqmynX?{k0ir8(QBR);+H7^l=LhLiYC;pT; zVE#;8OdMxkC;p5$L5r^i*Jb+7t}ZR?92s_DUlH4dT_m;(yF_dkCVO4Gu**!h3;Ukf zF6;;51j~gZ0Uy5A0wURpAW=?;G%ZkPFYBD7UxyvmSUA8J6s*MzyKk`OOV_jDPi!=Y z;X-eQWO7>1kD!bBCW+Zzs|5DqvI=9wXElEV zzXhT?VDTH{xD%7+#8~5L&J-ca$KdM=zNun!Y|O}^Ag0N{TE)ssh17JBYG}QD5k#R7 zjjR;rpCQC;)+ttJrVx!|hE2f5%~`q&&TA4gVf;|dH(Q97G5KhbIfC2Aj0c`8_;#y2 zjP*Sr+3&Efu+9$(ai>)m-O=|qA$nPB5&XV+LiDz{T<|?4L?4Um1>fI==o`ZYgYRJ> z?y_FQ5bJwHh<;W*+We>x{jD!zK+G3nfVGzu_=gY!t>-R-SRlk8s}=Js6k@RT3R>6q zm=Hs(nmn6%T!^7oHpXb*A|ZxZyV-_M=&==W@TLZgI}r{tU|3qpXsFM1SOdtG9i%mg zdlVcp+=DO~%;C^!-j7kr8bYi_4C`(=gfh=zz_3OPPhc1M8%A<#9v|LL=Rra^1zx*B2y2xMF+JCNHoxcNw0yp|8WrQ zAjUjXNOaYMqt1hv&iT7H#7aOEGG<5Mg8EM&W}v5OqxIl<8ak6io*rCBvDpmZd_Ab6 z=UQ_}Ow@yn4eJ3Cll0&gG?T@*P->I);6}{9*59bQKo2&fo92--O%GnifNMR}Jx9}K z>cKnrfOs|$4Y5}ba`kF$_#pwex#+<()@KtJzgP6&!_4y*+a&>K{H(&;B+`uFAsYG) zy;I!?-c56MkjOHELnyYBM2-S7yHT>X#R&4q&Dujlw;91y4!J8lH8&{aps`Pm3orPW7C{9*(zV^Fa^Ch@BgY|qLaBXP|L_MsDxllaXD z)?^h%{%=W@*GDDc9#eh-;&cSkq2UfheqcgUctS$%qe*eQh5DtZ>gE}10UTA&(Y$?H3z|Bac3p%%WA zcBXqtoU$|Z_zc8pA>5jG^*5kCk%9tU5r6%B#d?#9P{0AhcSdIbY8KZOzOy=q33p81 zy%>YfiIms6J6_j(7j>>6eAb7ECEq1ERtZ=Z%<+9Ivq+qr!1_vrs9>ejoXcWCLJW`1 zeBTR^Z2ii?`Ukxw3`nz9B1n8`MtcyMR^1p7m1ULK8(!jRpvPGWH7&>L_JNEHf!I;r ze-dHot7cS92-Tv7y$tMyc=XjWvIC{HsBN&W`PMzf;AG2UuRv9{uEEMqvmQs6^3^w3 zznRu?5)DQ3TMd)YnCbN35CWK-@0G0_)HT5M6~>WHms?@pThov8qyc zA(pAi_K?c1wECeN`g$6@F@6=HnvbJ~fwAa6alSqVhi7a1B?$DjtMvrq<1T~av)g(V zoypfvtzosmT^Mhd`34#sZ7d!r`UcCHm1bFNgCWNEXkDkZ86C(sR0y|ap)>gIF|v@w zYbBlsF+zwm>+c9$-$)@ETag$xeWQfvX*I&=;Ja7s8Es8L?E6Lwk#9L*wr`9WfCW9e zqsEI_(pFKLZy@Zus{0-?P9%m5eAqUy8@0@rS~;zF#?n88@LA!=7-3!F#Q&lYc~&09HVIK+ zwV>EbLd>*=()+K73+7pOV_fp7Ygvz2_4a}|XcWUa3;h4)3h4u*goN(Dz8zGNn6OFr z4`iz!l}fy-``5tDzK@04uKN$Lg2$xl2Xw!L@NuDvbbsCj@J@&)4(t9+n1g+%B;PUJ z?_(677Rj@^-=d#C5$e3|zrc?0spR`w_nWNEXL3cf1n1;V7dluuF5YRYG&MHmoGmmA zhc+F*7fqV%?;VdMbK~bYN$SHO#f=hgB9@lv{xN;YS%co=A4{kO=UoTR;~cg?4<5i+ zY)+vkv{@OxR zx0<7_ah+$Sc^iqEZAx2mWP&WaPf~5BHy|f zD5ZmTjPr~p1sp6b@{zCLc|1_C57a9IwF{tS>H!U{&$>@##Su$5Y zZTJ^qN$j63)KbIG#iM_Y+;qLn@E2bIHCL!-4F4RA7JjwQSZ??qWrfv7V};@8r9{8l zX{Ld^;eLl;^SF6J~$WnpVQS`P{fdYUR>z5 ziqJ{@|I*oS16tx@P|oPNfmC$lkKcj%q(Mh{(&71(Cml1tVz1J{!@2V-1#(oaZ_NZN+tyh++A9I0r=5)=^qI1Nm!gqCzhKhczB zEySp-CB2VG(UaD}Rs#==fgQah3Eaf3(Cmy}I)suhV3^mE8o;Hv-uNaM(aYN--H66A zE_!7FAnyObZ$+JgypGrJaF6>ai$^r~U$uy`(ti(Z`%sF|}7`O#~Loo1WQfuALI zo0;fR(QA3HfY;nw4E#LPedY|bQS^G^fO!{O6#XyC#F>$Be)Ps=zzJr_cHkG7o@_S6 zTo%2F>1pPCL|*huOwTm?vwp9<0bJeO^Cj?Rre~S&62C^AV}1;`M{gl+V6KI8qTe8H zY-+S&D{-!QFMY6$xRrSZPL6(yxSctAFYtEaPUf$>fp-vhHS;h!MDHZ-X@)WVUE0>$ zj6iRW-g^YNpZWe};C){M4>EtG{CJrmn5uDNI_dsTuxsrJ=oB>{GF8d1jBJmot zBZlzkOGYN1jWeHRUA{>L-e7vrC!@dRBh;JB1JqM82KZGom;U_m@4#EkhcU@U|Fju+ zn>iVayy&YZfw!ASXxq=f0`D^SqO(N*l3WFwD>I5RzjgpVV9ueQYx%%MW-qqsZ_9xX zTbCF!Q97?`AG5Y0rlT!=GdQQL-)NCvXVr?Wu~?NwN9#r4oV5lpc4PGW5ZUML%Y+QZ z2rgz3`;6~!$rnnQf)v#o*wCTWM?~%wrpS+U5|5M1Y>#u5Fc}LX9>J5(h;7gh-rK@s zY$%?cd{UAbCO49Apr;5hdXxZ0qEf3T3Xc&~hG!SN5UHwQMvvlitWg7p$GK7X98MTTicg=R$oGZC zf*4d~R5JWZN%3Yww8$D!z}9AeQ!G1B z-b6x*s~9t}5g1#&DkhIFFt`WC(Fn~Piyd?zpC@0s`8Wo|z$9AeHsdfr2PPATn`1HP z1g2BoYo5bA7ntF%&3Q5Ljdw8r#I!1a(xmq>5NJtvVyx1W?#8c?Gzq`Xq^~jJx|4o9 zk69?`p|9ZCr1mg#yOuQIbDlvZZT}4aVCLKkT`{-QzW7uKJIlu}qpduqE3dAcYVqG< zGx4Wo|XR(j6-EaY}1VXX%nc3xzee4otD`JF;eS8l1n)x$k)YwJD zPA&B-41@021-@#S=RUg(#=`TFfOC)>`@{ic)r&s~*O`O5JK^vem62_GzhidjI zdRW=SzCfI2{=OghMdC~|9fNo5CgSR5XDo}xc8Z-ur!JK{TM&qMxv<+h!Hw=jK#Ub$@-E%puSp9kDo zi``26h#tftgBJTHi3M0UQaLkARc9#r?GWtQS@RL})7X!Qzc%~t1U^!(CJtwVud&>Zc|+P29J=lUaf}tfQRF=s z&0~*~z)|Fc{UA<|z!~GXVh|@ucyVIM);+}v`S27WD@?`W&Sr{E0bPZDzd&KetrF$*L{Dt%!B=Hm0{GHq2b&HpC9IH8DS23iofOd^=*7*^BAz ziA}Q~aR=fsEp;>qcU)thuBT5LJX(uuiUC4PYxz24I#xxhmb&vG?2j9897I|LxFl{M z582ZeU=)iR#8kEY=55GQHHVgR<#R3+k*c+-tssAu(<;6?ZZVu#1YjpECW-5g0M!rVtM@FB}D)O8H^t2N-hWrV+0( zJ6r&sPJA{v2B8vHNH^jl!n*fB%pj4a%VBujob}LzD+)XekDE)Pu`Y+HKrUbqNiQz~qm=Lmj|g<{;R6r1M^9wBEl3w^{H ztVh?rM&eOt@HzVSb&4%;20z9~7xym5f( zl!I~XBSywSUJz((2GeNhhg97U_aHIO=qWo;pc)alu9a&E%s-)db(}rM zr~<#lkNM5SR`6-)cgD}ZA2LZXNY;|7U{=wS4q>V?l8(S#4$W8!q4+0yLMDF6WmG@@ zwXd=fnLHhh-_jn*nwfn7_zfmI%}3#Z_^rgQ3i)I2(c<3}ar1FhIer^)m^l`MPyAb~ zm)m^)L*TcGJ!UGxDSkU~xLFY+di)N$$ZM8EB**V(y3hO)y&(Pov1Pu8!6*KGV!wF` z@e+TKINBUQ`45;kU^YJoe26&CY>)mK{}FM5xfx*?FBeXdO+SJtUap&@n1{XuK21GA z^I0@tyj*ZkGnZiCjsJ{cn`u7Ibh$E8-8862E{xPLFQM_`zo1N(SsgJF|0T=HF~4Q{ zIqGa+K7mM#|BASwnacDF#Er~s+I*4tHuFu^{cGaJra_rY)RSv^5o+<@Fuj#InST40 z5#7#ww-~sD>7C5Y=&bSI6L&UGfgOK^xQm%e|Nl&UyLBh^J9J)P>uL=_%*Q+B2&JF( z1Y5u*`-VYQHw;+uVZs?^4JF~x87m{K2VhTpgb<^x`w%nnk&-9Rn#|(M2{F!EL?1*6 zG2XhD6;v04CRm?h-xhBPC*N9s3WQ((2C-3~h0(-vbMW&!Xgk*9o1nmCs}Zj&nfD?( zt=m|0&Gf=}t1&U|P)FohO^DrQE7)YoaO^WDUIuPPwQ-u!6pE}|s*Zo+8~Dy@!3RRj z0A*SuJb*VA1Ggb|o1+ogR$F498AX{6#Bt_2%5)@7Ht(TKC*n+#M|xHl;w+PA+g3N? z1||=^t?tCRTHrN=(i$sQzfc#630N3dE#y2-vmS+ytd?>F=d@N~$gx@p$89B`URG;4 zX7XAs5cgJFIgN_5rXcXGcA_l7+Ij{=dug&(mRyJKAbHwZCcV~Ch@NuE#_B9*l7p;= z5s_9mxpFnklFO*wg&1uWP+JcvC*K-{RORv3! zm}`Zz3Ip_CP|o>%;HB^X|S~*@qV-9J19Nh8Re0aT5 zI`RL|_8wqX60t%8uR6rz&2ndLXsDKH< zG>E9EsF+bv(Ln`uFrmXJI+#XOX2hHo^S{=vQ*|$j?>q1FeE-a2vsdk1yLRmgC$IY( zqVfwTHAhid9gLw@)&v2lveJKG*TVlX1cg&sp>fu;*Z~Tc-3>YDfIJs2=Q{F&chGp@ zg_QlE1L_uDL^(6~D~_av7xQul7Zh0Ig_lsy4Td1!g_lyU8}xex@(RlJf^OR&Uq%_P zV6*N@%G!(7LBoZsI-=dYop8O=FC4EXc7=+&X5mTEeZ(<1SQnlg-ACN`1Hc4X5t+Id zHl)Id0>bw?c+7Ej@4|JtO)yoeb#JVnABdCub@@;^^wTiC;^z*|?>;;AE z6i0ieAMRyxZ zqdO&AtNk#CbLB3HbFCk?#eyijUt(G3hhH!g4+^@;4@YpeZ5FiN58uS*70bS;j{slSAfBSW0x~tzR@6^Gj=lnOxv0P5n{;_z{!mP^@}hH9 z)}e5>op$HR>o|A|;ue7OB{E<4!oi~G0s)ztAL|q?6_6wELKZDkd>1kguNEPF8&%Ow zD(GgzTQ7#5z7C^YbW7y#Aq-a0t&zW*FmH-(i~RA0kfIF&^7L-FE4p1kzHWjozUU4C z1-c<7deNN%igk!Y6`7$g=PO!8cZ;G*^Bt0+dnA}@c_XsuUNf{h&SY&AaEIpGB}Mm{ zfz?kk&if_n_vl8LMnw+@xL5bXvMbsoV59zo0X!(+K7Bm0SoDy9`*kTcm7<3QJfJYG_-2YwSAzs{)h+0z#lU)=vOJe4EzchwMMofo~)N?DE#xY*_t zOpp>(aQVe|Zw%4O!Q|zMNfoS2TF1<4#m6dQZ_$-o1$N zi&)W@>XF0Yf$wn?eJ#gHPp{#4nziC=Rp{3M{BZieMt^s|6GeHiD!F9NiF;%@-I3JCRcTnN8O0QveWHj1~m5zQ7o=0yM{ z;5q#*+lj}fA_Kd_!Sv?GxWw{Qcoyem5aapX)>znTA5ey%9kK9n>ayhF^X^!

QE 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%0D#z;)8B+sO11BBTIb)pm@FrIi@ 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 (8PAVFIC+FBnrr8S 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

lZQ~WoYS%ZHw)#(E5Ae;4E-9i7BxSk_q4<;xr+J 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˷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

=`kIbIh>!mX2napruUcL^P6Qn(=_st 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

-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ⅈ}!vMOUanphO#W5(?oOXuDe+0Nmq;kcsIv++$SzB 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

!kpO1L(|CT`brX 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

QE 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%0D#z;)8B+sO11BBTIb)pm@FrIi@ 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 (8PAVFIC+FBnrr8S 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�UG7`hBV4Y-PQ&#w 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

#bm%h}O&EzPeQiour?vt%Qw+ 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 e`LmfWD5> 16) & 0xFF}]}] + set rtl8710_flasher_ready 1 + echo "RTL8710 flasher initialized" + } + return "" +} + +proc rtl8710_flasher_mrw {reg} { + set value "" + mem2array value 32 $reg 1 + return $value(0) +} + +proc rtl8710_flasher_wait {} { + global rtl8710_flasher_buffer + while {[rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x00}]]} { } +} + +proc rtl8710_flasher_load_block {local_filename offset len} { + global rtl8710_flasher_buffer + load_image $local_filename [expr {$rtl8710_flasher_buffer + 0x20 - $offset}] bin [expr {$rtl8710_flasher_buffer + 0x20}] $len +} + +proc rtl8710_flasher_read_block {offset len} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_read + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_read + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x14}] $len + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]] + if {[expr {$status > 0}]} { + error "read error, offset $offset" + } +} + +proc rtl8710_flasher_write_block {offset len} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_write + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_write + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x14}] $len + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]] + if {[expr {$status > 0}]} { + error "write error, offset $offset" + } +} + +proc rtl8710_flasher_verify_block {offset len} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_verify + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_verify + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x14}] $len + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]] + if {[expr {$status > 0}]} { + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]] + set status [expr {$status + $offset}] + error "verify error, offset $status" + } +} + +proc rtl8710_flash_read_id {} { + global rtl8710_flasher_buffer + global rtl8710_flasher_capacity + global rtl8710_flasher_command_read_id + rtl8710_flasher_init + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_read_id + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set id [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]] + set manufacturer_id [format "0x%02X" [expr {$id & 0xFF}]] + set memory_type [format "0x%02X" [expr {($id >> 8) & 0xFF}]] + set memory_capacity [expr {2 ** [expr {($id >> 16) & 0xFF}]}] + echo "manufacturer ID: $manufacturer_id, memory type: $memory_type, memory capacity: $memory_capacity bytes" +} + +proc rtl8710_flash_mass_erase {} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_mass_erase + rtl8710_flasher_init + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_mass_erase + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait +} + +proc rtl8710_flash_sector_erase {offset} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_sector_erase + rtl8710_flasher_init + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_sector_erase + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait +} + +proc rtl8710_flash_read {local_filename loc size} { + global rtl8710_flasher_buffer + global rtl8710_flasher_buffer_size + rtl8710_flasher_init + for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { + set len [expr {$size - $offset}] + if {[expr {$len > $rtl8710_flasher_buffer_size}]} { + set len $rtl8710_flasher_buffer_size + } + set flash_offset [expr {$loc + $offset}] + echo "read offset $flash_offset" + rtl8710_flasher_read_block $flash_offset $len + dump_image _rtl8710_flasher.bin [expr {$rtl8710_flasher_buffer + 0x20}] $len + exec dd conv=notrunc if=_rtl8710_flasher.bin "of=$local_filename" bs=1 "seek=$offset" + echo "read $len bytes" + } +} + +proc rtl8710_flash_write {local_filename loc} { + global rtl8710_flasher_buffer_size + global rtl8710_flasher_sector_size + global rtl8710_flasher_auto_erase + global rtl8710_flasher_auto_verify + global rtl8710_flasher_auto_erase_sector + rtl8710_flasher_init + set sector 0 + set size [file size $local_filename] + for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { + set len [expr {$size - $offset}] + if {[expr {$len > $rtl8710_flasher_buffer_size}]} { + set len $rtl8710_flasher_buffer_size + } + set flash_offset [expr {$loc + $offset}] + echo "write offset $flash_offset" + rtl8710_flasher_load_block $local_filename $offset $len + if {[expr {$rtl8710_flasher_auto_erase != 0}]} { + for {set i $flash_offset} {$i < [expr {$flash_offset + $len}]} {incr i} { + set sector [expr {$i / $rtl8710_flasher_sector_size}] + if {[expr {$rtl8710_flasher_auto_erase_sector != $sector}]} { + echo "erase sector $sector" + rtl8710_flash_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}] + set rtl8710_flasher_auto_erase_sector $sector + } + } + } + rtl8710_flasher_write_block $flash_offset $len + echo "wrote $len bytes" + if {[expr {$rtl8710_flasher_auto_verify != 0}]} { + echo "verify offset $flash_offset" + rtl8710_flasher_verify_block $flash_offset $len + } + } +} + +proc rtl8710_flash_verify {local_filename loc} { + global rtl8710_flasher_buffer_size + rtl8710_flasher_init + set size [file size $local_filename] + for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { + set len [expr {$size - $offset}] + if {[expr {$len > $rtl8710_flasher_buffer_size}]} { + set len $rtl8710_flasher_buffer_size + } + set flash_offset [expr {$loc + $offset}] + echo "read offset $flash_offset" + rtl8710_flasher_load_block $local_filename $offset $len + echo "verify offset $flash_offset" + rtl8710_flasher_verify_block $flash_offset $len + } +} + +proc rtl8710_flash_auto_erase {on} { + global rtl8710_flasher_auto_erase + if {[expr {$on != 0}]} { + set rtl8710_flasher_auto_erase 1 + echo "auto erase on" + } else { + set rtl8710_flasher_auto_erase 0 + echo "auto erase off" + } +} + +proc rtl8710_flash_auto_verify {on} { + global rtl8710_flasher_auto_verify + if {[expr {$on != 0}]} { + set rtl8710_flasher_auto_verify 1 + echo "auto verify on" + } else { + set rtl8710_flasher_auto_verify 0 + echo "auto verify off" + } +} + +proc rtl8710_reboot {} { + echo "# Set processor clock to default before system reset" + mww 0x40000014 0x00000021 + sleep 10 + echo "# Reboot (system reset)" + mww 0xE000ED0C 0x05FA0007 +} + diff --git a/flasher/rtl8710_flasher.bin b/flasher/rtl8710_flasher.bin new file mode 100644 index 0000000000000000000000000000000000000000..6c7e36d4c99d89ba7a7263e641d5777eedd594d1 GIT binary patch literal 968 zcmZ`%O-vI(6rSxb&|*etj4YCDx0tjgCWM4|@IbSa4($R>BvBL&Q{_9rWE=u=9ys6vrhY{{E8@KjdW9ml-cADxdwMfvCP(#GTT_L zyp|U51d`9|S)xuS<4%RUZc6jEC_D3i(=T4;#B&(5=iKg2s!#8qc>% zP>IDUpA&ki{oDNG?YPUii5&>~rzA_^*+d7^?L8gfid@f8g>!s>tX?`(QDC;+`aW7g zn@EQ|ORWe`w;*hdBmC|>!U)g+>kFK%1BW4Q1QY-V02=^p>KX8cz-T1DZ_%T!Uj*qR4|~&dx`r1NGJTDXEHed}y2H1hHz;-E4$KzITwld*a3*M`Ky+i)Fz-%(?`g&%rx*?!__|s&~kgb0p~-$1J1Wjl+w? z;9DdnSjgb{ZW4t4WL=31s5<{N8vP9!RmB4JGEGvWreK7ZK3ma{J?&`*H*s*ofp=}@ zNDJJ^agmc#6x?gGHJ`~5Y97yc&ZSk?|EtBB+p8DU`umqC*Evshosj8)JM-32+gp9< z!}z0I+PSGtqiWgU-c+P~JpEWQ4Ib?zBID+hPl;3C{v^ddtogth-H<}^=97;&n}PqK KwogEIZT|;|PH&e0 literal 0 HcmV?d00001 diff --git a/lib/basic_types.h b/lib/basic_types.h new file mode 100644 index 0000000..754c3e4 --- /dev/null +++ b/lib/basic_types.h @@ -0,0 +1,501 @@ +/****************************************************************************** + * + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA + * + * + ******************************************************************************/ +#ifndef __BASIC_TYPES_H__ +#define __BASIC_TYPES_H__ + +//#define PLATFORM_FREERTOS +#include + +#define PLATFORM_LITTLE_ENDIAN 0 +#define PLATFORM_BIG_ENDIAN 1 + +#define SYSTEM_ENDIAN PLATFORM_LITTLE_ENDIAN + +#define SUCCESS 0 +#define FAIL (-1) + +#undef _SUCCESS +#define _SUCCESS 1 + +#undef _FAIL +#define _FAIL 0 + +#ifndef FALSE + #define FALSE 0 +#endif + +#ifndef TRUE + #define TRUE (!FALSE) +#endif + +#define _TRUE TRUE +#define _FALSE FALSE + +#ifndef NULL +#define NULL 0 +#endif + +#ifdef __GNUC__ +#define __weak __attribute__((weak)) +#define likely(x) __builtin_expect ((x), 1) +#define unlikely(x) __builtin_expect ((x), 0) +#endif + +typedef unsigned int uint; +typedef signed int sint; + +#ifdef __ICCARM__ +typedef signed long long __int64_t; +typedef unsigned long long __uint64_t; +#endif + +#define s8 int8_t +#define u8 uint8_t +#define s16 int16_t +#define u16 uint16_t +#define s32 int32_t +#define u32 uint32_t +#define s64 int64_t +#define u64 uint64_t + +#ifdef CONFIG_MBED_ENABLED +typedef unsigned int BOOL; +#else +#ifndef BOOL +typedef unsigned char BOOL; +#endif +#ifndef bool +#ifndef __cplusplus +typedef unsigned char bool; +#endif +#endif +#endif + +#define UCHAR uint8_t +#define USHORT uint16_t +#define UINT uint32_t +#define ULONG uint32_t + +typedef struct { volatile int counter; } atomic_t; + +typedef enum _RTK_STATUS_ { + _EXIT_SUCCESS = 0, + _EXIT_FAILURE = 1 +}RTK_STATUS, *PRTK_STATUS; + +#define IN +#define OUT +#define VOID void +#define INOUT +#define NDIS_OID uint +#define NDIS_STATUS uint + +#ifndef PVOID +typedef void * PVOID; +#endif + +typedef u32 dma_addr_t; + +typedef void (*proc_t)(void*); + +typedef unsigned int __kernel_size_t; +typedef int __kernel_ssize_t; + +typedef __kernel_size_t SIZE_T; +typedef __kernel_ssize_t SSIZE_T; +#define FIELD_OFFSET(s,field) ((SSIZE_T)&((s*)(0))->field) + +#define MEM_ALIGNMENT_OFFSET (sizeof (SIZE_T)) +#define MEM_ALIGNMENT_PADDING (sizeof(SIZE_T) - 1) + +#define SIZE_PTR SIZE_T +#define SSIZE_PTR SSIZE_T + +#ifndef ON +#define ON 1 +#endif + +#ifndef OFF +#define OFF 0 +#endif + +#ifndef ENABLE +#define ENABLE 1 +#endif + +#ifndef DISABLE +#define DISABLE 0 +#endif + + +#define BIT0 0x0001 +#define BIT1 0x0002 +#define BIT2 0x0004 +#define BIT3 0x0008 +#define BIT4 0x0010 +#define BIT5 0x0020 +#define BIT6 0x0040 +#define BIT7 0x0080 +#define BIT8 0x0100 +#define BIT9 0x0200 +#define BIT10 0x0400 +#define BIT11 0x0800 +#define BIT12 0x1000 +#define BIT13 0x2000 +#define BIT14 0x4000 +#define BIT15 0x8000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +#define BIT_(__n) (1<<(__n)) + +#ifndef BIT +#define BIT(__n) (1<<(__n)) +#endif + +#if defined (__ICCARM__) +#define STRINGIFY(s) #s +#define SECTION(_name) _Pragma( STRINGIFY(location=_name)) +#define ALIGNMTO(_bound) _Pragma( STRINGIFY(data_alignment=##_bound##)) +#define _PACKED_ __packed +#define _LONG_CALL_ +#define _LONG_CALL_ROM_ +#define _WEAK __weak +#else +#define SECTION(_name) __attribute__ ((__section__(_name))) +#define ALIGNMTO(_bound) __attribute__ ((aligned (_bound))) +#define _PACKED_ __attribute__ ((packed)) +#define _LONG_CALL_ __attribute__ ((long_call)) +#define _LONG_CALL_ROM_ _LONG_CALL_ +#define _WEAK __attribute__ ((weak)) +#endif + + + +//port from fw by thomas +// TODO: Belows are Sync from SD7-Driver. It is necessary to check correctness + +#define SWAP32(x) ((u32)( \ + (((u32)(x) & (u32)0x000000ff) << 24) | \ + (((u32)(x) & (u32)0x0000ff00) << 8) | \ + (((u32)(x) & (u32)0x00ff0000) >> 8) | \ + (((u32)(x) & (u32)0xff000000) >> 24))) + +#define WAP16(x) ((u16)( \ + (((u16)(x) & (u16)0x00ff) << 8) | \ + (((u16)(x) & (u16)0xff00) >> 8))) + +#if SYSTEM_ENDIAN == PLATFORM_LITTLE_ENDIAN +#ifndef rtk_le16_to_cpu +#define rtk_cpu_to_le32(x) ((u32)(x)) +#define rtk_le32_to_cpu(x) ((u32)(x)) +#define rtk_cpu_to_le16(x) ((u16)(x)) +#define rtk_le16_to_cpu(x) ((u16)(x)) +#define rtk_cpu_to_be32(x) SWAP32((x)) +#define rtk_be32_to_cpu(x) SWAP32((x)) +#define rtk_cpu_to_be16(x) WAP16((x)) +#define rtk_be16_to_cpu(x) WAP16((x)) +#endif + +#elif SYSTEM_ENDIAN == PLATFORM_BIG_ENDIAN +#ifndef rtk_le16_to_cpu +#define rtk_cpu_to_le32(x) SWAP32((x)) +#define rtk_le32_to_cpu(x) SWAP32((x)) +#define rtk_cpu_to_le16(x) WAP16((x)) +#define rtk_le16_to_cpu(x) WAP16((x)) +#define rtk_cpu_to_be32(x) ((__u32)(x)) +#define rtk_be32_to_cpu(x) ((__u32)(x)) +#define rtk_cpu_to_be16(x) ((__u16)(x)) +#define rtk_be16_to_cpu(x) ((__u16)(x)) +#endif +#endif + + +/* + * Call endian free function when + * 1. Read/write packet content. + * 2. Before write integer to IO. + * 3. After read integer from IO. +*/ + +// +// Byte Swapping routine. +// +#define EF1Byte (u8) +#define EF2Byte le16_to_cpu +#define EF4Byte le32_to_cpu + +// +// Read LE format data from memory +// +#define ReadEF1Byte(_ptr) EF1Byte(*((u8 *)(_ptr))) +#define ReadEF2Byte(_ptr) EF2Byte(*((u16 *)(_ptr))) +#define ReadEF4Byte(_ptr) EF4Byte(*((u32 *)(_ptr))) + +// +// Write LE data to memory +// +#define WriteEF1Byte(_ptr, _val) (*((u8 *)(_ptr)))=EF1Byte(_val) +#define WriteEF2Byte(_ptr, _val) (*((u16 *)(_ptr)))=EF2Byte(_val) +#define WriteEF4Byte(_ptr, _val) (*((u32 *)(_ptr)))=EF4Byte(_val) + +// +// Example: +// BIT_LEN_MASK_32(0) => 0x00000000 +// BIT_LEN_MASK_32(1) => 0x00000001 +// BIT_LEN_MASK_32(2) => 0x00000003 +// BIT_LEN_MASK_32(32) => 0xFFFFFFFF +// +#define BIT_LEN_MASK_32(__BitLen) \ + (0xFFFFFFFF >> (32 - (__BitLen))) +// +// Example: +// BIT_OFFSET_LEN_MASK_32(0, 2) => 0x00000003 +// BIT_OFFSET_LEN_MASK_32(16, 2) => 0x00030000 +// +#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_32(__BitLen) << (__BitOffset)) + +// +// Description: +// Return 4-byte value in host byte ordering from +// 4-byte pointer in litten-endian system. +// +#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + (EF4Byte(*((u32 *)(__pStart)))) + +// +// Description: +// Translate subfield (continuous bits in little-endian) of 4-byte value in litten byte to +// 4-byte value in host byte ordering. +// +#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_32(__BitLen) \ + ) + +// +// Description: +// Mask subfield (continuous bits in little-endian) of 4-byte value in litten byte oredering +// and return the result in 4-byte value in host byte ordering. +// +#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P4BYTE_TO_HOST_4BYTE(__pStart) \ + & \ + ( ~ BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \ + ) + +// +// Description: +// Set subfield of little-endian 4-byte value to specified value. +// +#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u32 *)(__pStart)) = \ + EF4Byte( \ + LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \ + ); + + +#define BIT_LEN_MASK_16(__BitLen) \ + (0xFFFF >> (16 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_16(__BitLen) << (__BitOffset)) + +#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + (EF2Byte(*((u16 *)(__pStart)))) + +#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_16(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P2BYTE_TO_HOST_2BYTE(__pStart) \ + & \ + ( ~ BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u16 *)(__pStart)) = \ + EF2Byte( \ + LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \ + ); + +#define BIT_LEN_MASK_8(__BitLen) \ + (0xFF >> (8 - (__BitLen))) + +#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \ + (BIT_LEN_MASK_8(__BitLen) << (__BitOffset)) + +#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + (EF1Byte(*((u8 *)(__pStart)))) + +#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \ + & \ + BIT_LEN_MASK_8(__BitLen) \ + ) + +#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + & \ + ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \ + ) + +#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \ + *((u8 *)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \ + | \ + ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \ + ); + +//pclint +#define LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ + ( \ + LE_P1BYTE_TO_HOST_1BYTE(__pStart) \ + ) + +//pclint +#define SET_BITS_TO_LE_1BYTE_8BIT(__pStart, __BitOffset, __BitLen, __Value) \ +{ \ + *((pu1Byte)(__pStart)) = \ + EF1Byte( \ + LE_BITS_CLEARED_TO_1BYTE_8BIT(__pStart, __BitOffset, __BitLen) \ + | \ + ((u1Byte)__Value) \ + ); \ +} + +// Get the N-bytes aligment offset from the current length +#define N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment)) + +typedef unsigned char BOOLEAN,*PBOOLEAN; + +#define TEST_FLAG(__Flag,__testFlag) (((__Flag) & (__testFlag)) != 0) +#define SET_FLAG(__Flag, __setFlag) ((__Flag) |= __setFlag) +#define CLEAR_FLAG(__Flag, __clearFlag) ((__Flag) &= ~(__clearFlag)) +#define CLEAR_FLAGS(__Flag) ((__Flag) = 0) +#define TEST_FLAGS(__Flag, __testFlags) (((__Flag) & (__testFlags)) == (__testFlags)) + +/* Define compilor specific symbol */ +// +// inline function +// + +#if defined ( __ICCARM__ ) +#define __inline__ inline +#define __inline inline +#define __inline_definition //In dialect C99, inline means that a function's definition is provided + //only for inlining, and that there is another definition + //(without inline) somewhere else in the program. + //That means that this program is incomplete, because if + //add isn't inlined (for example, when compiling without optimization), + //then main will have an unresolved reference to that other definition. + + // Do not inline function is the function body is defined .c file and this + // function will be called somewhere else, otherwise there is compile error +#elif defined ( __CC_ARM ) +#define __inline__ __inline //__linine__ is not supported in keil compilor, use __inline instead +#define inline __inline +#define __inline_definition // for dialect C99 +#elif defined ( __GNUC__ ) +#define __inline__ inline +#define __inline inline +#define __inline_definition inline +#endif + +// +// pack +// + +#if defined (__ICCARM__) + +#define RTW_PACK_STRUCT_BEGIN _Pragma( STRINGIFY(pack(1))) +#define RTW_PACK_STRUCT_STRUCT +#define RTW_PACK_STRUCT_END _Pragma( STRINGIFY(pack())) +//#define RTW_PACK_STRUCT_USE_INCLUDES + +#elif defined (__CC_ARM) + +#define RTW_PACK_STRUCT_BEGIN __packed +#define RTW_PACK_STRUCT_STRUCT +#define RTW_PACK_STRUCT_END + +#elif defined (__GNUC__) + +#define RTW_PACK_STRUCT_BEGIN +#define RTW_PACK_STRUCT_STRUCT __attribute__ ((__packed__)) +#define RTW_PACK_STRUCT_END + +#elif defined(PLATFORM_WINDOWS) + +#define RTW_PACK_STRUCT_BEGIN +#define RTW_PACK_STRUCT_STRUCT +#define RTW_PACK_STRUCT_END +#define RTW_PACK_STRUCT_USE_INCLUDES +#endif + +// for standard library +#ifdef __ICCARM__ +#define __extension__ /* Ignore */ +#define __restrict /* Ignore */ +#endif + +typedef struct _RAM_START_FUNCTION_ { + VOID (*RamStartFun) (VOID); +}RAM_START_FUNCTION, *PRAM_START_FUNCTION; + +typedef struct _RAM_FUNCTION_START_TABLE_ { + VOID (*RamStartFun) (VOID); + VOID (*RamWakeupFun) (VOID); + VOID (*RamPatchFun0) (VOID); + VOID (*RamPatchFun1) (VOID); + VOID (*RamPatchFun2) (VOID); +}RAM_FUNCTION_START_TABLE, *PRAM_FUNCTION_START_TABLE; + +#endif// __BASIC_TYPES_H__ diff --git a/lib/cpu/cortex/core_cm3.h b/lib/cpu/cortex/core_cm3.h new file mode 100644 index 0000000..361a590 --- /dev/null +++ b/lib/cpu/cortex/core_cm3.h @@ -0,0 +1,1661 @@ +/**************************************************************************//** + * @file core_cm3.h + * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +#ifndef __CORE_CM3_H_GENERIC +#define __CORE_CM3_H_GENERIC + +/** \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** \ingroup Cortex_M3 + @{ + */ + +/* CMSIS CM3 definitions */ +#define __CM3_CMSIS_VERSION_MAIN (0x03) /*!< [31:16] CMSIS HAL main version */ +#define __CM3_CMSIS_VERSION_SUB (0x20) /*!< [15:0] CMSIS HAL sub version */ +#define __CM3_CMSIS_VERSION ((__CM3_CMSIS_VERSION_MAIN << 16) | \ + __CM3_CMSIS_VERSION_SUB ) /*!< CMSIS HAL version number */ + +#define __CORTEX_M (0x03) /*!< Cortex-M Core */ + + + +#if defined ( __CC_ARM ) + #define __ASM __asm /*!< asm keyword for ARM Compiler */ + #define __INLINE __inline /*!< inline keyword for ARM Compiler */ + #define __STATIC_INLINE static __inline + +#elif defined ( __ICCARM__ ) + #define __ASM __asm /*!< asm keyword for IAR Compiler */ + #define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */ + #define __STATIC_INLINE static inline + +#elif defined ( __TMS470__ ) + #define __ASM __asm /*!< asm keyword for TI CCS Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __GNUC__ ) + #define __ASM __asm /*!< asm keyword for GNU Compiler */ + #define __INLINE inline /*!< inline keyword for GNU Compiler */ + #define __STATIC_INLINE static inline + +#elif defined ( __TASKING__ ) + #define __ASM __asm /*!< asm keyword for TASKING Compiler */ + #define __INLINE inline /*!< inline keyword for TASKING Compiler */ + #define __STATIC_INLINE static inline + +#endif + +/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all +*/ +#define __FPU_USED 0 + +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TMS470__ ) + #if defined __TI__VFP_SUPPORT____ + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #endif +#endif + +#include /* standard types definitions */ +//#include /* rlx basic types definitions */ +#include /* Core Instruction Access */ +#include /* Core Function Access */ +//#include "hal_irqn.h" + +#endif /* __CORE_CM3_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM3_H_DEPENDANT +#define __CORE_CM3_H_DEPENDANT + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM3_REV + #define __CM3_REV 0x0200 + #warning "__CM3_REV not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0 + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 4 + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0 + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/*@} end of group Cortex_M3 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + ******************************************************************************/ +/** \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ +#else + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ +#endif + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + + +/** \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + + +/** \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ +#if (__CORTEX_M != 0x04) + uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */ +#else + uint32_t _reserved0:7; /*!< bit: 9..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ +#endif + uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */ + uint32_t IT:2; /*!< bit: 25..26 saved IT state (read 0) */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + + +/** \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/*@} end of group CMSIS_CORE */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IO uint32_t ISER[8]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24]; + __IO uint32_t ICER[8]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24]; + __IO uint32_t ISPR[8]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24]; + __IO uint32_t ICPR[8]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24]; + __IO uint32_t IABR[8]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56]; + __IO uint8_t IP[240]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644]; + __O uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0 /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL << NVIC_STIR_INTID_Pos) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __I uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IO uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IO uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IO uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IO uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IO uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IO uint8_t SHP[12]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IO uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IO uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IO uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IO uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IO uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IO uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IO uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __I uint32_t PFR[2]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __I uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __I uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __I uint32_t MMFR[4]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __I uint32_t ISAR[5]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5]; + __IO uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0 /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL << SCB_CPUID_REVISION_Pos) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31 /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11 /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#if (__CM3_REV < 0x0201) /* core r2p1 */ +#define SCB_VTOR_TBLBASE_Pos 29 /*!< SCB VTOR: TBLBASE Position */ +#define SCB_VTOR_TBLBASE_Msk (1UL << SCB_VTOR_TBLBASE_Pos) /*!< SCB VTOR: TBLBASE Mask */ + +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#else +#define SCB_VTOR_TBLOFF_Pos 7 /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ +#endif + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16 /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8 /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0 /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL << SCB_AIRCR_VECTRESET_Pos) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4 /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9 /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8 /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4 /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1 /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0 /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL << SCB_CCR_NONBASETHRDENA_Pos) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18 /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17 /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16 /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15 /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14 /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13 /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12 /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11 /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10 /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8 /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7 /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3 /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1 /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0 /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL << SCB_SHCSR_MEMFAULTACT_Pos) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Registers Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16 /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8 /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0 /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL << SCB_CFSR_MEMFAULTSR_Pos) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* SCB Hard Fault Status Registers Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31 /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30 /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1 /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1]; + __I uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ +#if ((defined __CM3_REV) && (__CM3_REV >= 0x200)) + __IO uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +#else + uint32_t RESERVED1[1]; +#endif +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0 /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL << SCnSCB_ICTR_INTLINESNUM_Pos) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2 /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1 /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0 /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL << SCnSCB_ACTLR_DISMCYCINT_Pos) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IO uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IO uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __I uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0 /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL << SysTick_CTRL_ENABLE_Pos) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0 /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0 /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31 /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __O union + { + __O uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __O uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __O uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864]; + __IO uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15]; + __IO uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15]; + __IO uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29]; + __O uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __I uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IO uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43]; + __O uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __I uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6]; + __I uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __I uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __I uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __I uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __I uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __I uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __I uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __I uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __I uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __I uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __I uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __I uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0 /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL << ITM_TPR_PRIVMASK_Pos) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23 /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16 /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10 /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8 /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4 /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3 /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2 /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1 /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0 /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL << ITM_TCR_ITMENA_Pos) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0 /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL << ITM_IWR_ATVALIDM_Pos) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0 /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL << ITM_IRR_ATREADYM_Pos) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0 /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL << ITM_IMCR_INTEGRATION_Pos) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2 /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1 /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0 /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL << ITM_LSR_Present_Pos) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IO uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IO uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IO uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IO uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IO uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IO uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __I uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IO uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IO uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IO uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1]; + __IO uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IO uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IO uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1]; + __IO uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IO uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IO uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1]; + __IO uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IO uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IO uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28 /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27 /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26 /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25 /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24 /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22 /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21 /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20 /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19 /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18 /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17 /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16 /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12 /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10 /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9 /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5 /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1 /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0 /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL << DWT_CTRL_CYCCNTENA_Pos) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0 /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL << DWT_CPICNT_CPICNT_Pos) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0 /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL << DWT_EXCCNT_EXCCNT_Pos) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0 /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL << DWT_SLEEPCNT_SLEEPCNT_Pos) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0 /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL << DWT_LSUCNT_LSUCNT_Pos) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0 /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL << DWT_FOLDCNT_FOLDCNT_Pos) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0 /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL << DWT_MASK_MASK_Pos) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24 /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16 /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12 /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10 /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9 /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8 /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7 /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5 /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0 /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL << DWT_FUNCTION_FUNCTION_Pos) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IO uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IO uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2]; + __IO uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55]; + __IO uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131]; + __I uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IO uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __I uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759]; + __I uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __I uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __I uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1]; + __I uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __I uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IO uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39]; + __IO uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IO uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8]; + __I uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __I uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0 /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL << TPI_ACPR_PRESCALER_Pos) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0 /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL << TPI_SPPR_TXMODE_Pos) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3 /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2 /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1 /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0 /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL << TPI_FFSR_FlInProg_Pos) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8 /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1 /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0 /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL << TPI_TRIGGER_TRIGGER_Pos) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29 /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27 /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26 /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24 /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16 /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8 /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0 /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL << TPI_FIFO0_ETM0_Pos) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0 /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL << TPI_ITATBCTR2_ATREADY_Pos) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29 /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27 /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26 /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24 /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16 /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8 /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0 /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL << TPI_FIFO1_ITM0_Pos) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0 /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL << TPI_ITATBCTR0_ATREADY_Pos) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0 /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL << TPI_ITCTRL_Mode_Pos) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11 /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10 /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9 /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6 /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5 /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0 /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL << TPI_DEVID_NrTraceInput_Pos) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_SubType_Pos 0 /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL << TPI_DEVTYPE_SubType_Pos) /*!< TPI DEVTYPE: SubType Mask */ + +#define TPI_DEVTYPE_MajorType_Pos 4 /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if (__MPU_PRESENT == 1) +/** \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __I uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IO uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IO uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IO uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IO uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IO uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IO uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IO uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IO uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IO uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IO uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +/* MPU Type Register */ +#define MPU_TYPE_IREGION_Pos 16 /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8 /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0 /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL << MPU_TYPE_SEPARATE_Pos) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register */ +#define MPU_CTRL_PRIVDEFENA_Pos 2 /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1 /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0 /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL << MPU_CTRL_ENABLE_Pos) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register */ +#define MPU_RNR_REGION_Pos 0 /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL << MPU_RNR_REGION_Pos) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register */ +#define MPU_RBAR_ADDR_Pos 5 /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4 /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0 /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL << MPU_RBAR_REGION_Pos) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register */ +#define MPU_RASR_ATTRS_Pos 16 /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28 /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24 /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19 /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18 /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17 /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16 /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8 /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1 /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0 /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL << MPU_RASR_ENABLE_Pos) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IO uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __O uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IO uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IO uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5 /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register */ +#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register */ +#define CoreDebug_DEMCR_TRCENA_Pos 24 /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19 /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18 /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17 /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16 /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9 /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8 /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7 /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6 /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5 /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4 /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Cortex-M3 Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +//#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +//#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if (__MPU_PRESENT == 1) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +/** \brief Set Priority Grouping + + The function sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8)); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** \brief Get Priority Grouping + + The function reads the priority grouping field from the NVIC Interrupt Controller. + + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t NVIC_GetPriorityGrouping(void) +{ + return ((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos); /* read priority grouping field */ +} + + +/** \brief Enable External Interrupt + + The function enables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn) +{ + NVIC->ISER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */ +} + + +/** \brief Disable External Interrupt + + The function disables a device-specific interrupt in the NVIC interrupt controller. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn) +{ + NVIC->ICER[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */ +} + + +/** \brief Get Pending Interrupt + + The function reads the pending register in the NVIC and returns the pending bit + for the specified interrupt. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + */ +__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + return((uint32_t) ((NVIC->ISPR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */ +} + + +/** \brief Set Pending Interrupt + + The function sets the pending bit of an external interrupt. + + \param [in] IRQn Interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ISPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */ +} + + +/** \brief Clear Pending Interrupt + + The function clears the pending bit of an external interrupt. + + \param [in] IRQn External interrupt number. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + NVIC->ICPR[((uint32_t)(IRQn) >> 5)] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */ +} + + +/** \brief Get Active Interrupt + + The function reads the active register in NVIC and returns the active bit. + + \param [in] IRQn Interrupt number. + + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + */ +__STATIC_INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn) +{ + return((uint32_t)((NVIC->IABR[(uint32_t)(IRQn) >> 5] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if active else 0 */ +} + + +/** \brief Set Interrupt Priority + + The function sets the priority of an interrupt. + + \note The priority cannot be set for every core interrupt. + + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + */ +__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if(IRQn < 0) { + SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M System Interrupts */ + else { + NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */ +} + + +/** \brief Get Interrupt Priority + + The function reads the priority of an interrupt. The interrupt + number can be positive to specify an external (device specific) + interrupt, or negative to specify an internal (core) interrupt. + + + \param [in] IRQn Interrupt number. + \return Interrupt Priority. Value is aligned automatically to the implemented + priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn) +{ + + if(IRQn < 0) { + return((uint32_t)(SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M system interrupts */ + else { + return((uint32_t)(NVIC->IP[(uint32_t)(IRQn)] >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */ +} + + +/** \brief Encode Priority + + The function encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the samllest possible priority group is set. + + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + return ( + ((PreemptPriority & ((1 << (PreemptPriorityBits)) - 1)) << SubPriorityBits) | + ((SubPriority & ((1 << (SubPriorityBits )) - 1))) + ); +} + + +/** \brief Decode Priority + + The function decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the samllest possible priority group is set. + + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & 0x07); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7 - PriorityGroupTmp) > __NVIC_PRIO_BITS) ? __NVIC_PRIO_BITS : 7 - PriorityGroupTmp; + SubPriorityBits = ((PriorityGroupTmp + __NVIC_PRIO_BITS) < 7) ? 0 : PriorityGroupTmp - 7 + __NVIC_PRIO_BITS; + + *pPreemptPriority = (Priority >> SubPriorityBits) & ((1 << (PreemptPriorityBits)) - 1); + *pSubPriority = (Priority ) & ((1 << (SubPriorityBits )) - 1); +} + + +/** \brief System Reset + + The function initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + while(1); /* wait until reset */ +} + + +/** \brief Set Vector Table Offset + + + The function sets Vector Table Offset register. + + \param [in] TableAddress Vector table address. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetVectorTable(uint32_t TableAddress) +{ + SCB->VTOR = TableAddress; +} + + +/** \brief Set Vector Table Offset + + + The function sets Vector Table Offset register. + + \param [in] TableAddress Vector table address. Value cannot be negative. + */ +__STATIC_INLINE void NVIC_SetCCR(void) +{ + uint32_t reg_value; + + reg_value = SCB->CCR; + reg_value |= SCB_CCR_DIV_0_TRP_Msk | SCB_CCR_UNALIGN_TRP_Msk; + SCB->CCR = reg_value; +} + + +/*@} end of CMSIS_Core_NVICFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if (__Vendor_SysTickConfig == 0) + +/** \brief System Tick Configuration + + The function initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + + \param [in] ticks Number of ticks between two interrupts. + + \return 0 Function succeeded. + \return 1 Function failed. + + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ + + SysTick->LOAD = ticks - 1; /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY 0x5AA55AA5 /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** \brief ITM Send Character + + The function transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + + \param [in] ch Character to transmit. + + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if ((ITM->TCR & ITM_TCR_ITMENA_Msk) && /* ITM enabled */ + (ITM->TER & (1UL << 0) ) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0].u32 == 0); + ITM->PORT[0].u8 = (uint8_t) ch; + } + return (ch); +} + + +/** \brief ITM Receive Character + + The function inputs a character via the external variable \ref ITM_RxBuffer. + + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) { + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** \brief ITM Check Character + + The function checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) { + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) { + return (0); /* no character available */ + } else { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + +#endif /* __CORE_CM3_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ + +#ifdef __cplusplus +} +#endif diff --git a/lib/cpu/cortex/core_cmFunc.h b/lib/cpu/cortex/core_cmFunc.h new file mode 100644 index 0000000..0a18faf --- /dev/null +++ b/lib/cpu/cortex/core_cmFunc.h @@ -0,0 +1,636 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V3.20 + * @date 25. February 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp"); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp"); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory"); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + __ASM volatile (""); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + /* Empty asm statement works as a scheduling barrier */ + __ASM volatile (""); + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc"); + __ASM volatile (""); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ diff --git a/lib/cpu/cortex/core_cmInstr.h b/lib/cpu/cortex/core_cmInstr.h new file mode 100644 index 0000000..d213f0e --- /dev/null +++ b/lib/cpu/cortex/core_cmInstr.h @@ -0,0 +1,688 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V3.20 + * @date 05. March 2013 + * + * @note + * + ******************************************************************************/ +/* Copyright (c) 2009 - 2013 ARM LIMITED + + All rights reserved. + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + - Neither the name of ARM 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 COPYRIGHT HOLDERS AND 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. + ---------------------------------------------------------------------------*/ + + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constrant "l" + * Otherwise, use general registers, specified by constrant "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (short)__builtin_bswap16(value); +#else + uint32_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +#endif +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << (32 - op2)); +} + + +/** \brief Breakpoint + + This function causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ diff --git a/lib/cpu/cortex/cortex.c b/lib/cpu/cortex/cortex.c new file mode 100644 index 0000000..8c4fd13 --- /dev/null +++ b/lib/cpu/cortex/cortex.c @@ -0,0 +1,1069 @@ +#include +#include "cortex.h" + +#ifndef CORTEX_INTERRUPT_MAX +#define CORTEX_INTERRUPT_MAX 256 +#endif + +extern uint8_t __text_end__, __data_beg__, __data_end__, __bss_beg__, __bss_end__, STACK_TOP; + +extern int main(int argc, char *argv[]); + +static void crt0(void); + +static void __attribute__((interrupt)) CORTEX_Default_Handler(void){ +} + +static void crt_empty(void){ +} + +void __attribute__((weak, alias("crt_empty"))) crt1(void); +void __attribute__((weak, alias("crt_empty"))) crt2(void); +void __attribute__((weak, alias("crt_empty"))) crt3(void); +void __attribute__((weak, alias("crt_empty"))) crt4(void); +void __attribute__((weak, alias("crt_empty"))) crt5(void); + +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_NMI_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_HardFault_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_MemManage_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_BusFault_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_UsageFault_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_SVC_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_DebugMon_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_PendSV_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_SysTick_Handler(void); + +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_0_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_1_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_2_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_3_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_4_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_5_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_6_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_7_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_8_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_9_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_10_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_11_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_12_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_13_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_14_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_15_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_16_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_17_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_18_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_19_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_20_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_21_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_22_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_23_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_24_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_25_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_26_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_27_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_28_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_29_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_30_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_31_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_32_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_33_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_34_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_35_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_36_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_37_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_38_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_39_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_40_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_41_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_42_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_43_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_44_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_45_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_46_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_47_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_48_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_49_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_50_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_51_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_52_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_53_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_54_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_55_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_56_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_57_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_58_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_59_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_60_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_61_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_62_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_63_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_64_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_65_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_66_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_67_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_68_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_69_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_70_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_71_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_72_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_73_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_74_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_75_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_76_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_77_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_78_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_79_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_80_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_81_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_82_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_83_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_84_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_85_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_86_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_87_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_88_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_89_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_90_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_91_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_92_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_93_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_94_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_95_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_96_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_97_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_98_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_99_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_100_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_101_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_102_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_103_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_104_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_105_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_106_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_107_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_108_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_109_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_110_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_111_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_112_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_113_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_114_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_115_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_116_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_117_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_118_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_119_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_120_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_121_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_122_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_123_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_124_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_125_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_126_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_127_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_128_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_129_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_130_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_131_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_132_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_133_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_134_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_135_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_136_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_137_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_138_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_139_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_140_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_141_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_142_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_143_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_144_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_145_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_146_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_147_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_148_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_149_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_150_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_151_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_152_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_153_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_154_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_155_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_156_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_157_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_158_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_159_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_160_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_161_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_162_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_163_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_164_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_165_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_166_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_167_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_168_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_169_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_170_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_171_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_172_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_173_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_174_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_175_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_176_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_177_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_178_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_179_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_180_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_181_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_182_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_183_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_184_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_185_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_186_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_187_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_188_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_189_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_190_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_191_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_192_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_193_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_194_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_195_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_196_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_197_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_198_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_199_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_200_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_201_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_202_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_203_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_204_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_205_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_206_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_207_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_208_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_209_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_210_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_211_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_212_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_213_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_214_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_215_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_216_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_217_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_218_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_219_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_220_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_221_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_222_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_223_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_224_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_225_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_226_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_227_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_228_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_229_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_230_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_231_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_232_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_233_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_234_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_235_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_236_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_237_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_238_Handler(void); +void __attribute__((weak, alias("CORTEX_Default_Handler"))) CORTEX_INTERRUPT_239_Handler(void); + +uint32_t *cortex_vectors[] __attribute__((section(".vectors"))) = { + (uint32_t *)&STACK_TOP, + (uint32_t *)crt0, + (uint32_t *)CORTEX_NMI_Handler, + (uint32_t *)CORTEX_HardFault_Handler, + (uint32_t *)CORTEX_MemManage_Handler, + (uint32_t *)CORTEX_BusFault_Handler, + (uint32_t *)CORTEX_UsageFault_Handler, + (uint32_t *)0, + (uint32_t *)0, + (uint32_t *)0, + (uint32_t *)0, + (uint32_t *)CORTEX_SVC_Handler, + (uint32_t *)CORTEX_DebugMon_Handler, + (uint32_t *)0, + (uint32_t *)CORTEX_PendSV_Handler, + (uint32_t *)CORTEX_SysTick_Handler, +#if (CORTEX_INTERRUPT_MAX > 0) + (uint32_t *)CORTEX_INTERRUPT_0_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 1) + (uint32_t *)CORTEX_INTERRUPT_1_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 2) + (uint32_t *)CORTEX_INTERRUPT_2_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 3) + (uint32_t *)CORTEX_INTERRUPT_3_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 4) + (uint32_t *)CORTEX_INTERRUPT_4_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 5) + (uint32_t *)CORTEX_INTERRUPT_5_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 6) + (uint32_t *)CORTEX_INTERRUPT_6_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 7) + (uint32_t *)CORTEX_INTERRUPT_7_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 8) + (uint32_t *)CORTEX_INTERRUPT_8_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 9) + (uint32_t *)CORTEX_INTERRUPT_9_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 10) + (uint32_t *)CORTEX_INTERRUPT_10_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 11) + (uint32_t *)CORTEX_INTERRUPT_11_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 12) + (uint32_t *)CORTEX_INTERRUPT_12_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 13) + (uint32_t *)CORTEX_INTERRUPT_13_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 14) + (uint32_t *)CORTEX_INTERRUPT_14_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 15) + (uint32_t *)CORTEX_INTERRUPT_15_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 16) + (uint32_t *)CORTEX_INTERRUPT_16_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 17) + (uint32_t *)CORTEX_INTERRUPT_17_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 18) + (uint32_t *)CORTEX_INTERRUPT_18_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 19) + (uint32_t *)CORTEX_INTERRUPT_19_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 20) + (uint32_t *)CORTEX_INTERRUPT_20_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 21) + (uint32_t *)CORTEX_INTERRUPT_21_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 22) + (uint32_t *)CORTEX_INTERRUPT_22_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 23) + (uint32_t *)CORTEX_INTERRUPT_23_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 24) + (uint32_t *)CORTEX_INTERRUPT_24_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 25) + (uint32_t *)CORTEX_INTERRUPT_25_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 26) + (uint32_t *)CORTEX_INTERRUPT_26_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 27) + (uint32_t *)CORTEX_INTERRUPT_27_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 28) + (uint32_t *)CORTEX_INTERRUPT_28_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 29) + (uint32_t *)CORTEX_INTERRUPT_29_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 30) + (uint32_t *)CORTEX_INTERRUPT_30_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 31) + (uint32_t *)CORTEX_INTERRUPT_31_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 32) + (uint32_t *)CORTEX_INTERRUPT_32_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 33) + (uint32_t *)CORTEX_INTERRUPT_33_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 34) + (uint32_t *)CORTEX_INTERRUPT_34_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 35) + (uint32_t *)CORTEX_INTERRUPT_35_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 36) + (uint32_t *)CORTEX_INTERRUPT_36_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 37) + (uint32_t *)CORTEX_INTERRUPT_37_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 38) + (uint32_t *)CORTEX_INTERRUPT_38_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 39) + (uint32_t *)CORTEX_INTERRUPT_39_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 40) + (uint32_t *)CORTEX_INTERRUPT_40_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 41) + (uint32_t *)CORTEX_INTERRUPT_41_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 42) + (uint32_t *)CORTEX_INTERRUPT_42_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 43) + (uint32_t *)CORTEX_INTERRUPT_43_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 44) + (uint32_t *)CORTEX_INTERRUPT_44_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 45) + (uint32_t *)CORTEX_INTERRUPT_45_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 46) + (uint32_t *)CORTEX_INTERRUPT_46_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 47) + (uint32_t *)CORTEX_INTERRUPT_47_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 48) + (uint32_t *)CORTEX_INTERRUPT_48_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 49) + (uint32_t *)CORTEX_INTERRUPT_49_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 50) + (uint32_t *)CORTEX_INTERRUPT_50_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 51) + (uint32_t *)CORTEX_INTERRUPT_51_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 52) + (uint32_t *)CORTEX_INTERRUPT_52_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 53) + (uint32_t *)CORTEX_INTERRUPT_53_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 54) + (uint32_t *)CORTEX_INTERRUPT_54_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 55) + (uint32_t *)CORTEX_INTERRUPT_55_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 56) + (uint32_t *)CORTEX_INTERRUPT_56_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 57) + (uint32_t *)CORTEX_INTERRUPT_57_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 58) + (uint32_t *)CORTEX_INTERRUPT_58_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 59) + (uint32_t *)CORTEX_INTERRUPT_59_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 60) + (uint32_t *)CORTEX_INTERRUPT_60_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 61) + (uint32_t *)CORTEX_INTERRUPT_61_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 62) + (uint32_t *)CORTEX_INTERRUPT_62_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 63) + (uint32_t *)CORTEX_INTERRUPT_63_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 64) + (uint32_t *)CORTEX_INTERRUPT_64_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 65) + (uint32_t *)CORTEX_INTERRUPT_65_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 66) + (uint32_t *)CORTEX_INTERRUPT_66_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 67) + (uint32_t *)CORTEX_INTERRUPT_67_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 68) + (uint32_t *)CORTEX_INTERRUPT_68_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 69) + (uint32_t *)CORTEX_INTERRUPT_69_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 70) + (uint32_t *)CORTEX_INTERRUPT_70_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 71) + (uint32_t *)CORTEX_INTERRUPT_71_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 72) + (uint32_t *)CORTEX_INTERRUPT_72_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 73) + (uint32_t *)CORTEX_INTERRUPT_73_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 74) + (uint32_t *)CORTEX_INTERRUPT_74_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 75) + (uint32_t *)CORTEX_INTERRUPT_75_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 76) + (uint32_t *)CORTEX_INTERRUPT_76_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 77) + (uint32_t *)CORTEX_INTERRUPT_77_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 78) + (uint32_t *)CORTEX_INTERRUPT_78_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 79) + (uint32_t *)CORTEX_INTERRUPT_79_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 80) + (uint32_t *)CORTEX_INTERRUPT_80_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 81) + (uint32_t *)CORTEX_INTERRUPT_81_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 82) + (uint32_t *)CORTEX_INTERRUPT_82_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 83) + (uint32_t *)CORTEX_INTERRUPT_83_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 84) + (uint32_t *)CORTEX_INTERRUPT_84_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 85) + (uint32_t *)CORTEX_INTERRUPT_85_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 86) + (uint32_t *)CORTEX_INTERRUPT_86_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 87) + (uint32_t *)CORTEX_INTERRUPT_87_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 88) + (uint32_t *)CORTEX_INTERRUPT_88_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 89) + (uint32_t *)CORTEX_INTERRUPT_89_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 90) + (uint32_t *)CORTEX_INTERRUPT_90_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 91) + (uint32_t *)CORTEX_INTERRUPT_91_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 92) + (uint32_t *)CORTEX_INTERRUPT_92_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 93) + (uint32_t *)CORTEX_INTERRUPT_93_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 94) + (uint32_t *)CORTEX_INTERRUPT_94_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 95) + (uint32_t *)CORTEX_INTERRUPT_95_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 96) + (uint32_t *)CORTEX_INTERRUPT_96_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 97) + (uint32_t *)CORTEX_INTERRUPT_97_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 98) + (uint32_t *)CORTEX_INTERRUPT_98_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 99) + (uint32_t *)CORTEX_INTERRUPT_99_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 100) + (uint32_t *)CORTEX_INTERRUPT_100_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 101) + (uint32_t *)CORTEX_INTERRUPT_101_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 102) + (uint32_t *)CORTEX_INTERRUPT_102_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 103) + (uint32_t *)CORTEX_INTERRUPT_103_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 104) + (uint32_t *)CORTEX_INTERRUPT_104_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 105) + (uint32_t *)CORTEX_INTERRUPT_105_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 106) + (uint32_t *)CORTEX_INTERRUPT_106_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 107) + (uint32_t *)CORTEX_INTERRUPT_107_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 108) + (uint32_t *)CORTEX_INTERRUPT_108_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 109) + (uint32_t *)CORTEX_INTERRUPT_109_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 110) + (uint32_t *)CORTEX_INTERRUPT_110_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 111) + (uint32_t *)CORTEX_INTERRUPT_111_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 112) + (uint32_t *)CORTEX_INTERRUPT_112_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 113) + (uint32_t *)CORTEX_INTERRUPT_113_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 114) + (uint32_t *)CORTEX_INTERRUPT_114_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 115) + (uint32_t *)CORTEX_INTERRUPT_115_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 116) + (uint32_t *)CORTEX_INTERRUPT_116_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 117) + (uint32_t *)CORTEX_INTERRUPT_117_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 118) + (uint32_t *)CORTEX_INTERRUPT_118_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 119) + (uint32_t *)CORTEX_INTERRUPT_119_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 120) + (uint32_t *)CORTEX_INTERRUPT_120_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 121) + (uint32_t *)CORTEX_INTERRUPT_121_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 122) + (uint32_t *)CORTEX_INTERRUPT_122_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 123) + (uint32_t *)CORTEX_INTERRUPT_123_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 124) + (uint32_t *)CORTEX_INTERRUPT_124_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 125) + (uint32_t *)CORTEX_INTERRUPT_125_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 126) + (uint32_t *)CORTEX_INTERRUPT_126_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 127) + (uint32_t *)CORTEX_INTERRUPT_127_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 128) + (uint32_t *)CORTEX_INTERRUPT_128_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 129) + (uint32_t *)CORTEX_INTERRUPT_129_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 130) + (uint32_t *)CORTEX_INTERRUPT_130_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 131) + (uint32_t *)CORTEX_INTERRUPT_131_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 132) + (uint32_t *)CORTEX_INTERRUPT_132_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 133) + (uint32_t *)CORTEX_INTERRUPT_133_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 134) + (uint32_t *)CORTEX_INTERRUPT_134_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 135) + (uint32_t *)CORTEX_INTERRUPT_135_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 136) + (uint32_t *)CORTEX_INTERRUPT_136_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 137) + (uint32_t *)CORTEX_INTERRUPT_137_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 138) + (uint32_t *)CORTEX_INTERRUPT_138_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 139) + (uint32_t *)CORTEX_INTERRUPT_139_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 140) + (uint32_t *)CORTEX_INTERRUPT_140_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 141) + (uint32_t *)CORTEX_INTERRUPT_141_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 142) + (uint32_t *)CORTEX_INTERRUPT_142_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 143) + (uint32_t *)CORTEX_INTERRUPT_143_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 144) + (uint32_t *)CORTEX_INTERRUPT_144_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 145) + (uint32_t *)CORTEX_INTERRUPT_145_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 146) + (uint32_t *)CORTEX_INTERRUPT_146_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 147) + (uint32_t *)CORTEX_INTERRUPT_147_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 148) + (uint32_t *)CORTEX_INTERRUPT_148_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 149) + (uint32_t *)CORTEX_INTERRUPT_149_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 150) + (uint32_t *)CORTEX_INTERRUPT_150_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 151) + (uint32_t *)CORTEX_INTERRUPT_151_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 152) + (uint32_t *)CORTEX_INTERRUPT_152_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 153) + (uint32_t *)CORTEX_INTERRUPT_153_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 154) + (uint32_t *)CORTEX_INTERRUPT_154_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 155) + (uint32_t *)CORTEX_INTERRUPT_155_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 156) + (uint32_t *)CORTEX_INTERRUPT_156_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 157) + (uint32_t *)CORTEX_INTERRUPT_157_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 158) + (uint32_t *)CORTEX_INTERRUPT_158_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 159) + (uint32_t *)CORTEX_INTERRUPT_159_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 160) + (uint32_t *)CORTEX_INTERRUPT_160_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 161) + (uint32_t *)CORTEX_INTERRUPT_161_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 162) + (uint32_t *)CORTEX_INTERRUPT_162_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 163) + (uint32_t *)CORTEX_INTERRUPT_163_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 164) + (uint32_t *)CORTEX_INTERRUPT_164_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 165) + (uint32_t *)CORTEX_INTERRUPT_165_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 166) + (uint32_t *)CORTEX_INTERRUPT_166_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 167) + (uint32_t *)CORTEX_INTERRUPT_167_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 168) + (uint32_t *)CORTEX_INTERRUPT_168_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 169) + (uint32_t *)CORTEX_INTERRUPT_169_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 170) + (uint32_t *)CORTEX_INTERRUPT_170_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 171) + (uint32_t *)CORTEX_INTERRUPT_171_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 172) + (uint32_t *)CORTEX_INTERRUPT_172_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 173) + (uint32_t *)CORTEX_INTERRUPT_173_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 174) + (uint32_t *)CORTEX_INTERRUPT_174_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 175) + (uint32_t *)CORTEX_INTERRUPT_175_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 176) + (uint32_t *)CORTEX_INTERRUPT_176_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 177) + (uint32_t *)CORTEX_INTERRUPT_177_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 178) + (uint32_t *)CORTEX_INTERRUPT_178_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 179) + (uint32_t *)CORTEX_INTERRUPT_179_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 180) + (uint32_t *)CORTEX_INTERRUPT_180_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 181) + (uint32_t *)CORTEX_INTERRUPT_181_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 182) + (uint32_t *)CORTEX_INTERRUPT_182_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 183) + (uint32_t *)CORTEX_INTERRUPT_183_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 184) + (uint32_t *)CORTEX_INTERRUPT_184_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 185) + (uint32_t *)CORTEX_INTERRUPT_185_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 186) + (uint32_t *)CORTEX_INTERRUPT_186_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 187) + (uint32_t *)CORTEX_INTERRUPT_187_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 188) + (uint32_t *)CORTEX_INTERRUPT_188_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 189) + (uint32_t *)CORTEX_INTERRUPT_189_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 190) + (uint32_t *)CORTEX_INTERRUPT_190_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 191) + (uint32_t *)CORTEX_INTERRUPT_191_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 192) + (uint32_t *)CORTEX_INTERRUPT_192_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 193) + (uint32_t *)CORTEX_INTERRUPT_193_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 194) + (uint32_t *)CORTEX_INTERRUPT_194_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 195) + (uint32_t *)CORTEX_INTERRUPT_195_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 196) + (uint32_t *)CORTEX_INTERRUPT_196_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 197) + (uint32_t *)CORTEX_INTERRUPT_197_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 198) + (uint32_t *)CORTEX_INTERRUPT_198_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 199) + (uint32_t *)CORTEX_INTERRUPT_199_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 200) + (uint32_t *)CORTEX_INTERRUPT_200_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 201) + (uint32_t *)CORTEX_INTERRUPT_201_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 202) + (uint32_t *)CORTEX_INTERRUPT_202_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 203) + (uint32_t *)CORTEX_INTERRUPT_203_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 204) + (uint32_t *)CORTEX_INTERRUPT_204_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 205) + (uint32_t *)CORTEX_INTERRUPT_205_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 206) + (uint32_t *)CORTEX_INTERRUPT_206_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 207) + (uint32_t *)CORTEX_INTERRUPT_207_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 208) + (uint32_t *)CORTEX_INTERRUPT_208_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 209) + (uint32_t *)CORTEX_INTERRUPT_209_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 210) + (uint32_t *)CORTEX_INTERRUPT_210_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 211) + (uint32_t *)CORTEX_INTERRUPT_211_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 212) + (uint32_t *)CORTEX_INTERRUPT_212_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 213) + (uint32_t *)CORTEX_INTERRUPT_213_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 214) + (uint32_t *)CORTEX_INTERRUPT_214_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 215) + (uint32_t *)CORTEX_INTERRUPT_215_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 216) + (uint32_t *)CORTEX_INTERRUPT_216_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 217) + (uint32_t *)CORTEX_INTERRUPT_217_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 218) + (uint32_t *)CORTEX_INTERRUPT_218_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 219) + (uint32_t *)CORTEX_INTERRUPT_219_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 220) + (uint32_t *)CORTEX_INTERRUPT_220_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 221) + (uint32_t *)CORTEX_INTERRUPT_221_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 222) + (uint32_t *)CORTEX_INTERRUPT_222_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 223) + (uint32_t *)CORTEX_INTERRUPT_223_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 224) + (uint32_t *)CORTEX_INTERRUPT_224_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 225) + (uint32_t *)CORTEX_INTERRUPT_225_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 226) + (uint32_t *)CORTEX_INTERRUPT_226_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 227) + (uint32_t *)CORTEX_INTERRUPT_227_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 228) + (uint32_t *)CORTEX_INTERRUPT_228_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 229) + (uint32_t *)CORTEX_INTERRUPT_229_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 230) + (uint32_t *)CORTEX_INTERRUPT_230_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 231) + (uint32_t *)CORTEX_INTERRUPT_231_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 232) + (uint32_t *)CORTEX_INTERRUPT_232_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 233) + (uint32_t *)CORTEX_INTERRUPT_233_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 234) + (uint32_t *)CORTEX_INTERRUPT_234_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 235) + (uint32_t *)CORTEX_INTERRUPT_235_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 236) + (uint32_t *)CORTEX_INTERRUPT_236_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 237) + (uint32_t *)CORTEX_INTERRUPT_237_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 238) + (uint32_t *)CORTEX_INTERRUPT_238_Handler, +#endif +#if (CORTEX_INTERRUPT_MAX > 239) + (uint32_t *)CORTEX_INTERRUPT_239_Handler, +#endif +}; + +static void crt0(void){ + uint8_t *m, *n; + uint32_t i; + crt1(); + // disable all interrupts + cortex_interrupts_disable(); + for(i = 0; i < CORTEX_INTERRUPT_MAX; i++)cortex_interrupt_disable(i); + crt2(); +//#ifndef __ARM_ARCH_6M__ // if not cortex m0 + // locate interrupt vectors + SCB->VTOR = (uint32_t)&cortex_vectors[0]; +//#endif + // http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/ch01s01s04.html + // kuidagi oleks vaja detektida, et mitte-FPU puhul seda ei teeks: http://stackoverflow.com/questions/2224334/gcc-dump-preprocessor-defines + SCB->CPACR |= ((((uint32_t)0x03) << 20) | (((uint32_t)0x03) << 22)); /* set CP10 and CP11 Full Access */ + __asm__("dsb"); // wait for store to complete + __asm__("isb"); // reset pipeline + crt3(); + for(m = &__data_beg__, n = &__text_end__; m < &__data_end__; m++, n++){ + *m = *n; + } + crt4(); + for(m = &__bss_beg__; m < &__bss_end__; m++){ + *m = 0; + } + crt5(); + // set stack pointer back to cortex_vectors[0] + __asm__("mov r2, %0": : "r" (cortex_vectors)); + __asm__("ldr r3, [r2, #0]"); + __asm__("mov sp, r3"); + // jump to main + __asm__("mov r3, %0": : "r" (main)); + __asm__("bx r3"); +} + +void cortex_bootstrap(void *start){ + uint32_t i; + cortex_interrupts_disable(); + for(i = 0; i < CORTEX_INTERRUPT_MAX; i++)cortex_interrupt_disable(i); + // set stack pointer to ((uint32_t *)start)[0] + __asm__("mov r2, %0": : "r" (start)); + __asm__("ldr r3, [r2, #0]"); + __asm__("mov sp, r3"); + // jump to ((uint32_t *)start)[1] + __asm__("ldr r3, [r2, #4]"); + __asm__("bx r3"); + while(1); +} + +void cortex_reboot(){ + SCB->AIRCR = (SCB->AIRCR & (((uint32_t)0x07) << 8)) | (((uint32_t)0x05FA) << 16) | SCB_AIRCR_SYSRESETREQ; + while(1); +} + diff --git a/lib/cpu/cortex/cortex.h b/lib/cpu/cortex/cortex.h new file mode 100644 index 0000000..d4c12a0 --- /dev/null +++ b/lib/cpu/cortex/cortex.h @@ -0,0 +1,79 @@ +#ifndef _CORTEX_H_ +#define _CORTEX_H_ + +#include + +typedef struct{ + volatile uint32_t ISER[8]; + uint32_t RESERVED1[24]; + volatile uint32_t ICER[8]; + uint32_t RESERVED2[24]; + volatile uint32_t ISPR[8]; + uint32_t RESERVED3[24]; + volatile uint32_t ICPR[8]; + uint32_t RESERVED4[24]; + volatile uint32_t IABR[8]; + uint32_t RESERVED5[56]; + volatile uint32_t IPR[32]; +}NVIC_TypeDef; + +typedef struct{ + uint32_t RESERVED1[2]; + volatile uint32_t ACTLR; + uint32_t RESERVED2[829]; + volatile const uint32_t CPUID; + volatile uint32_t ICSR; + volatile uint32_t VTOR; + volatile uint32_t AIRCR; + volatile uint32_t SCR; + volatile uint32_t CCR; + volatile uint32_t SHPR[3]; + volatile uint32_t SHCSR; + volatile uint32_t CFSR; + volatile uint32_t HFSR; + volatile uint32_t DFSR; + volatile uint32_t MMFAR; + volatile uint32_t BFAR; + volatile uint32_t AFSR; + volatile const uint32_t PFR[2]; + volatile const uint32_t DFR; + volatile const uint32_t AFR; + volatile const uint32_t MMFR[4]; + volatile const uint32_t ISAR[5]; + uint32_t RESERVED3[5]; + volatile uint32_t CPACR; +}SCB_TypeDef; + +#define NVIC ((NVIC_TypeDef *)0xE000E100) +#define SCB ((SCB_TypeDef *)0xE000E000) + +// SCB_AIRCR +#define SCB_AIRCR_VECTRESET (((uint32_t)0x0001) << 0) +#define SCB_AIRCR_VECTCLRACTIVE (((uint32_t)0x0001) << 1) +#define SCB_AIRCR_SYSRESETREQ (((uint32_t)0x0001) << 2) +#define SCB_AIRCR_PRIGROUP (((uint32_t)0x0007) << 8) +#define SCB_AIRCR_VECTKEY (((uint32_t)0xFFFF) << 16) +#define SCB_AIRCR_VECTKEYSTAT (((uint32_t)0xFFFF) << 16) + +// SCB_CPACR +#define SCB_CPACR_CP10 (((uint32_t)0x03) << 20) +#define SCB_CPACR_CP11 (((uint32_t)0x03) << 22) + +#define cortex_interrupt_set_priority(i, p) (NVIC->IPR[(i) >> 2] = ((NVIC->IPR[(i) >> 2] & ~(((uint32_t)0xFF) << (((i) & 0x03) << 3))) | (((uint32_t)p) << (((i) & 0x03) << 3)))) +#define cortex_interrupt_enable(i) (NVIC->ISER[(i) >> 5] = (((uint32_t)0x01) << ((i) & 0x1F))) +#define cortex_interrupt_disable(i) (NVIC->ICER[(i) >> 5] = (((uint32_t)0x01) << ((i) & 0x1F))) +#define cortex_interrupt_clear(i) (NVIC->ICPR[(i) >> 5] = (((uint32_t)0x01) << ((i) & 0x1F))) +#define cortex_interrupts_disable() __asm__("cpsid f") +#define cortex_interrupts_enable() __asm__("cpsie f") + +#define interrupts_disable() __asm__("cpsid f") +#define interrupts_enable() __asm__("cpsie f") + +#define CORTEX_ISR(n) _CORTEX_ISR(n) +#define _CORTEX_ISR(n) void __attribute__((interrupt)) CORTEX_INTERRUPT_##n##_Handler() + +void cortex_bootstrap(void *start) __attribute__ ((noreturn)); +void cortex_reboot() __attribute__ ((noreturn)); + +#endif + diff --git a/lib/cpu/cortex/cortex.ocd b/lib/cpu/cortex/cortex.ocd new file mode 100644 index 0000000..2e631af --- /dev/null +++ b/lib/cpu/cortex/cortex.ocd @@ -0,0 +1,14 @@ +proc cortex_bootstrap {start} { + # disable interrupts + reg faultmask 0x01 + set vectors "" + mem2array vectors 32 $start 2 + reg sp $vectors(0) + reg pc $vectors(1) + resume +} + +proc cortex_reboot {} { + mww 0xE000ED0C 0x05FA0007 +} + diff --git a/lib/cpu/rtl8710/export-rom_v03.txt b/lib/cpu/rtl8710/export-rom_v03.txt new file mode 100644 index 0000000..2c94191 --- /dev/null +++ b/lib/cpu/rtl8710/export-rom_v03.txt @@ -0,0 +1,737 @@ +SECTIONS +{ + __vectors_table = 0x0; + Reset_Handler = 0x101; + NMI_Handler = 0x109; + HardFault_Handler = 0x10d; + MemManage_Handler = 0x121; + BusFault_Handler = 0x125; + UsageFault_Handler = 0x129; + HalLogUartInit = 0x201; + HalSerialPutcRtl8195a = 0x2d9; + HalSerialGetcRtl8195a = 0x309; + HalSerialGetIsrEnRegRtl8195a = 0x329; + HalSerialSetIrqEnRegRtl8195a = 0x335; + HalCpuClkConfig = 0x341; + HalGetCpuClk = 0x355; + HalRomInfo = 0x39d; + HalGetRomInfo = 0x3b5; + HalResetVsr = 0x3c5; + HalDelayUs = 0x899; + HalNMIHandler = 0x8e1; + HalHardFaultHandler = 0x911; + HalMemManageHandler = 0xc09; + HalBusFaultHandler = 0xc39; + HalUsageFaultHandler = 0xc69; + HalUart0PinCtrlRtl8195A = 0xcfd; + HalUart1PinCtrlRtl8195A = 0xdc9; + HalUart2PinCtrlRtl8195A = 0xe9d; + HalSPI0PinCtrlRtl8195A = 0xf75; + HalSPI1PinCtrlRtl8195A = 0x1015; + HalSPI2PinCtrlRtl8195A = 0x10e5; + HalSPI0MCSPinCtrlRtl8195A = 0x11b5; + HalI2C0PinCtrlRtl8195A = 0x1275; + HalI2C1PinCtrlRtl8195A = 0x1381; + HalI2C2PinCtrlRtl8195A = 0x1459; + HalI2C3PinCtrlRtl8195A = 0x1529; + HalI2S0PinCtrlRtl8195A = 0x1639; + HalI2S1PinCtrlRtl8195A = 0x176d; + HalPCM0PinCtrlRtl8195A = 0x1845; + HalPCM1PinCtrlRtl8195A = 0x1949; + HalSDIODPinCtrlRtl8195A = 0x1a1d; + HalSDIOHPinCtrlRtl8195A = 0x1a6d; + HalMIIPinCtrlRtl8195A = 0x1ab9; + HalWLLEDPinCtrlRtl8195A = 0x1b51; + HalWLANT0PinCtrlRtl8195A = 0x1c0d; + HalWLANT1PinCtrlRtl8195A = 0x1c61; + HalWLBTCOEXPinCtrlRtl8195A = 0x1cb5; + HalWLBTCMDPinCtrlRtl8195A = 0x1d05; + HalNFCPinCtrlRtl8195A = 0x1d59; + HalPWM0PinCtrlRtl8195A = 0x1da9; + HalPWM1PinCtrlRtl8195A = 0x1ead; + HalPWM2PinCtrlRtl8195A = 0x1fb5; + HalPWM3PinCtrlRtl8195A = 0x20b1; + HalETE0PinCtrlRtl8195A = 0x21b9; + HalETE1PinCtrlRtl8195A = 0x22c1; + HalETE2PinCtrlRtl8195A = 0x23c9; + HalETE3PinCtrlRtl8195A = 0x24d1; + HalEGTIMPinCtrlRtl8195A = 0x25d9; + HalSPIFlashPinCtrlRtl8195A = 0x2679; + HalSDRPinCtrlRtl8195A = 0x2725; + HalJTAGPinCtrlRtl8195A = 0x280d; + HalTRACEPinCtrlRtl8195A = 0x2861; + HalLOGUartPinCtrlRtl8195A = 0x28b9; + HalLOGUartIRPinCtrlRtl8195A = 0x291d; + HalSICPinCtrlRtl8195A = 0x2981; + HalEEPROMPinCtrlRtl8195A = 0x29d9; + HalDEBUGPinCtrlRtl8195A = 0x2a31; + HalPinCtrlRtl8195A = 0x2b39; + SpicRxCmdRtl8195A = 0x2e5d; + SpicWaitBusyDoneRtl8195A = 0x2ea5; + SpicGetFlashStatusRtl8195A = 0x2eb5; + SpicWaitWipDoneRtl8195A = 0x2f55; + SpicTxCmdRtl8195A = 0x2f6d; + SpicSetFlashStatusRtl8195A = 0x2fc1; + SpicCmpDataForCalibrationRtl8195A = 0x3049; + SpicLoadInitParaFromClockRtl8195A = 0x3081; + SpicInitRtl8195A = 0x30e5; + SpicEraseFlashRtl8195A = 0x31bd; + SpiFlashApp = 0x3279; + HalPeripheralIntrHandle = 0x33b5; + HalSysOnIntrHandle = 0x3439; + HalWdgIntrHandle = 0x3485; + HalTimer0IntrHandle = 0x34d5; + HalTimer1IntrHandle = 0x3525; + HalI2C3IntrHandle = 0x3575; + HalTimer2To7IntrHandle = 0x35c5; + HalSpi0IntrHandle = 0x3615; + HalGpioIntrHandle = 0x3665; + HalUart0IntrHandle = 0x36b5; + HalSpiFlashIntrHandle = 0x3705; + HalUsbOtgIntrHandle = 0x3755; + HalSdioHostIntrHandle = 0x37a5; + HalI2s0OrPcm0IntrHandle = 0x37f5; + HalI2s1OrPcm1IntrHandle = 0x3845; + HalWlDmaIntrHandle = 0x3895; + HalWlProtocolIntrHandle = 0x38e5; + HalCryptoIntrHandle = 0x3935; + HalGmacIntrHandle = 0x3985; + HalGdma0Ch0IntrHandle = 0x39d5; + HalGdma0Ch1IntrHandle = 0x3a25; + HalGdma0Ch2IntrHandle = 0x3a75; + HalGdma0Ch3IntrHandle = 0x3ac5; + HalGdma0Ch4IntrHandle = 0x3b15; + HalGdma0Ch5IntrHandle = 0x3b65; + HalGdma1Ch0IntrHandle = 0x3bb5; + HalGdma1Ch1IntrHandle = 0x3c05; + HalGdma1Ch2IntrHandle = 0x3c55; + HalGdma1Ch3IntrHandle = 0x3ca5; + HalGdma1Ch4IntrHandle = 0x3cf5; + HalGdma1Ch5IntrHandle = 0x3d45; + HalSdioDeviceIntrHandle = 0x3d95; + VectorTableInitRtl8195A = 0x3de5; + VectorTableInitForOSRtl8195A = 0x4019; + VectorIrqRegisterRtl8195A = 0x4029; + VectorIrqUnRegisterRtl8195A = 0x4091; + VectorIrqEnRtl8195A = 0x40f1; + VectorIrqDisRtl8195A = 0x418d; + _UartRxDmaIrqHandle = 0x422d; + HalRuartPutCRtl8195a = 0x4281; + HalRuartGetCRtl8195a = 0x429d; + HalRuartRTSCtrlRtl8195a = 0x42bd; + HalRuartGetDebugValueRtl8195a = 0x42e1; + HalRuartGetIMRRtl8195a = 0x43e1; + HalRuartSetIMRRtl8195a = 0x442d; + _UartIrqHandle = 0x4465; + HalRuartDmaInitRtl8195a = 0x4681; + HalRuartIntDisableRtl8195a = 0x4845; + HalRuartDeInitRtl8195a = 0x4855; + HalRuartIntEnableRtl8195a = 0x4985; + _UartTxDmaIrqHandle = 0x4995; + HalRuartRegIrqRtl8195a = 0x49d1; + HalRuartAdapterLoadDefRtl8195a = 0x4a4d; + HalRuartTxGdmaLoadDefRtl8195a = 0x4add; + HalRuartRxGdmaLoadDefRtl8195a = 0x4bc9; + RuartLock = 0x4cc9; + RuartUnLock = 0x4ced; + HalRuartIntSendRtl8195a = 0x4d09; + HalRuartDmaSendRtl8195a = 0x4e35; + HalRuartStopSendRtl8195a = 0x4f89; + HalRuartIntRecvRtl8195a = 0x504d; + HalRuartDmaRecvRtl8195a = 0x51ad; + HalRuartStopRecvRtl8195a = 0x52cd; + RuartIsTimeout = 0x5385; + HalRuartSendRtl8195a = 0x53b1; + HalRuartRecvRtl8195a = 0x5599; + RuartResetRxFifoRtl8195a = 0x5751; + HalRuartResetRxFifoRtl8195a = 0x5775; + HalRuartInitRtl8195a = 0x5829; + HalGdmaOnOffRtl8195a = 0x5df1; + HalGdmaChIsrEnAndDisRtl8195a = 0x5e0d; + HalGdmaChEnRtl8195a = 0x5e51; + HalGdmaChDisRtl8195a = 0x5e6d; + HalGdamChInitRtl8195a = 0x5e91; + HalGdmaChSetingRtl8195a = 0x5ebd; + HalGdmaChIsrCleanRtl8195a = 0x6419; + HalGdmaChCleanAutoSrcRtl8195a = 0x64a1; + HalGdmaChCleanAutoDstRtl8195a = 0x6501; + HalEFUSEPowerSwitch8195AROM = 0x6561; + HALEFUSEOneByteReadROM = 0x65f9; + HALEFUSEOneByteWriteROM = 0x6699; + rtl_memcmpb_v1_00 = 0x681d; + rtl_random_v1_00 = 0x6861; + rtl_align_to_be32_v1_00 = 0x6881; + rtl_memsetw_v1_00 = 0x6899; + rtl_memsetb_v1_00 = 0x68ad; + rtl_memcpyw_v1_00 = 0x68bd; + rtl_memcpyb_v1_00 = 0x68dd; + rtl_memDump_v1_00 = 0x68f5; + rtl_AES_set_encrypt_key = 0x6901; + rtl_cryptoEngine_AES_set_decrypt_key = 0x6c11; + rtl_cryptoEngine_set_security_mode_v1_00 = 0x6c95; + rtl_cryptoEngine_init_v1_00 = 0x6ea9; + rtl_cryptoEngine_exit_v1_00 = 0x7055; + rtl_cryptoEngine_reset_v1_00 = 0x70b1; + rtl_cryptoEngine_v1_00 = 0x70ed; + rtl_crypto_cipher_init_v1_00 = 0x7c69; + rtl_crypto_cipher_encrypt_v1_00 = 0x7c89; + rtl_crypto_cipher_decrypt_v1_00 = 0x7cad; + HalSsiPinmuxEnableRtl8195a = 0x7cd5; + HalSsiEnableRtl8195a = 0x7e45; + HalSsiDisableRtl8195a = 0x7ef9; + HalSsiLoadSettingRtl8195a = 0x7fad; + HalSsiSetInterruptMaskRtl8195a = 0x8521; + HalSsiGetInterruptMaskRtl8195a = 0x85c9; + HalSsiSetSclkPolarityRtl8195a = 0x863d; + HalSsiSetSclkPhaseRtl8195a = 0x8715; + HalSsiWriteRtl8195a = 0x87e9; + HalSsiSetDeviceRoleRtl8195a = 0x8861; + HalSsiSetRxFifoThresholdLevelRtl8195a = 0x88c9; + HalSsiSetTxFifoThresholdLevelRtl8195a = 0x8941; + HalSsiReadRtl8195a = 0x89b9; + HalSsiGetRxFifoLevelRtl8195a = 0x8a2d; + HalSsiGetTxFifoLevelRtl8195a = 0x8aa5; + HalSsiGetStatusRtl8195a = 0x8b1d; + HalSsiWriteableRtl8195a = 0x8b91; + HalSsiReadableRtl8195a = 0x8c09; + HalSsiBusyRtl8195a = 0x8c81; + HalSsiReadInterruptRtl8195a = 0x8cf9; + HalSsiWriteInterruptRtl8195a = 0x8efd; + HalSsiSetSlaveEnableRegisterRtl8195a = 0x9009; + HalSsiGetInterruptStatusRtl8195a = 0x90d9; + HalSsiInterruptEnableRtl8195a = 0x914d; + HalSsiInterruptDisableRtl8195a = 0x9299; + HalSsiGetRawInterruptStatusRtl8195a = 0x93e9; + HalSsiGetSlaveEnableRegisterRtl8195a = 0x945d; + HalSsiInitRtl8195a = 0x94d1; + _SsiReadInterrupt = 0x9ba5; + _SsiWriteInterrupt = 0x9db1; + _SsiIrqHandle = 0x9eb1; + HalI2CWrite32 = 0xa061; + HalI2CRead32 = 0xa09d; + HalI2CDeInit8195a = 0xa0dd; + HalI2CSendRtl8195a = 0xa1f1; + HalI2CReceiveRtl8195a = 0xa25d; + HalI2CEnableRtl8195a = 0xa271; + HalI2CIntrCtrl8195a = 0xa389; + HalI2CReadRegRtl8195a = 0xa3a1; + HalI2CWriteRegRtl8195a = 0xa3b1; + HalI2CSetCLKRtl8195a = 0xa3c5; + HalI2CMassSendRtl8195a = 0xa6e9; + HalI2CClrIntrRtl8195a = 0xa749; + HalI2CClrAllIntrRtl8195a = 0xa761; + HalI2CInit8195a = 0xa775; + HalI2CDMACtrl8195a = 0xaa31; + RtkI2CIoCtrl = 0xaa61; + RtkI2CPowerCtrl = 0xaa65; + HalI2COpInit = 0xaa69; + I2CIsTimeout = 0xac65; + I2CTXGDMAISRHandle = 0xb435; + I2CRXGDMAISRHandle = 0xb4c1; + RtkI2CIrqInit = 0xb54d; + RtkI2CIrqDeInit = 0xb611; + RtkI2CPinMuxInit = 0xb675; + RtkI2CPinMuxDeInit = 0xb7c9; + RtkI2CDMAInit = 0xb955; + RtkI2CInit = 0xbc95; + RtkI2CDMADeInit = 0xbdad; + RtkI2CDeInit = 0xbe4d; + RtkI2CSendUserAddr = 0xbee5; + RtkI2CSend = 0xc07d; + RtkI2CLoadDefault = 0xce51; + RtkSalI2COpInit = 0xcf21; + HalI2SWrite32 = 0xcf65; + HalI2SRead32 = 0xcf85; + HalI2SDeInitRtl8195a = 0xcfa9; + HalI2STxRtl8195a = 0xcfc9; + HalI2SRxRtl8195a = 0xd011; + HalI2SEnableRtl8195a = 0xd05d; + HalI2SIntrCtrlRtl8195a = 0xd0b1; + HalI2SReadRegRtl8195a = 0xd0d1; + HalI2SClrIntrRtl8195a = 0xd0dd; + HalI2SClrAllIntrRtl8195a = 0xd0fd; + HalI2SInitRtl8195a = 0xd11d; + GPIO_GetIPPinName_8195a = 0xd2e5; + GPIO_GetChipPinName_8195a = 0xd331; + GPIO_PullCtrl_8195a = 0xd39d; + GPIO_FuncOn_8195a = 0xd421; + GPIO_FuncOff_8195a = 0xd481; + GPIO_Int_Mask_8195a = 0xd4e9; + GPIO_Int_SetType_8195a = 0xd511; + HAL_GPIO_IrqHandler_8195a = 0xd5fd; + HAL_GPIO_MbedIrqHandler_8195a = 0xd645; + HAL_GPIO_UserIrqHandler_8195a = 0xd6a1; + HAL_GPIO_IntCtrl_8195a = 0xd6cd; + HAL_GPIO_Init_8195a = 0xd805; + HAL_GPIO_DeInit_8195a = 0xdac1; + HAL_GPIO_ReadPin_8195a = 0xdbd1; + HAL_GPIO_WritePin_8195a = 0xdc91; + HAL_GPIO_RegIrq_8195a = 0xddad; + HAL_GPIO_UnRegIrq_8195a = 0xddf5; + HAL_GPIO_UserRegIrq_8195a = 0xde15; + HAL_GPIO_UserUnRegIrq_8195a = 0xdef9; + HAL_GPIO_MaskIrq_8195a = 0xdfc1; + HAL_GPIO_UnMaskIrq_8195a = 0xe061; + HAL_GPIO_IntDebounce_8195a = 0xe101; + HAL_GPIO_GetIPPinName_8195a = 0xe1c1; + HAL_GPIO_PullCtrl_8195a = 0xe1c9; + DumpForOneBytes = 0xe259; + CmdRomHelp = 0xe419; + CmdWriteWord = 0xe491; + CmdDumpHelfWord = 0xe505; + CmdDumpWord = 0xe5f1; + CmdDumpByte = 0xe6f5; + CmdSpiFlashTool = 0xe751; + GetRomCmdNum = 0xe7a9; + CmdWriteByte = 0xe7ad; + Isspace = 0xe7ed; + Strtoul = 0xe801; + ArrayInitialize = 0xe8b1; + GetArgc = 0xe8c9; + GetArgv = 0xe8f9; + UartLogCmdExecute = 0xe95d; + UartLogShowBackSpace = 0xe9fd; + UartLogRecallOldCmd = 0xea39; + UartLogHistoryCmd = 0xea71; + UartLogCmdChk = 0xeadd; + UartLogIrqHandle = 0xebf5; + RtlConsolInit = 0xecc5; + RtlConsolTaskRom = 0xed49; + RtlExitConsol = 0xed79; + RtlConsolRom = 0xedcd; + HalTimerOpInit = 0xee0d; + HalTimerIrq2To7Handle = 0xee59; + HalGetTimerIdRtl8195a = 0xef09; + HalTimerInitRtl8195a = 0xef3d; + HalTimerDisRtl8195a = 0xf069; + HalTimerEnRtl8195a = 0xf089; + HalTimerReadCountRtl8195a = 0xf0a9; + HalTimerIrqClearRtl8195a = 0xf0bd; + HalTimerDumpRegRtl8195a = 0xf0d1; + VSprintf = 0xf129; + DiagPrintf = 0xf39d; + DiagSPrintf = 0xf3b9; + DiagSnPrintf = 0xf3d1; + prvDiagPrintf = 0xf3ed; + prvDiagSPrintf = 0xf40d; + _memcmp = 0xf429; + _memcpy = 0xf465; + _memset = 0xf511; + Rand = 0xf585; + _strncpy = 0xf60d; + _strcpy = 0xf629; + prvStrCpy = 0xf639; + _strlen = 0xf651; + _strnlen = 0xf669; + prvStrLen = 0xf699; + _strcmp = 0xf6b1; + _strncmp = 0xf6d1; + prvStrCmp = 0xf719; + StrUpr = 0xf749; + prvAtoi = 0xf769; + prvStrStr = 0xf7bd; + _strsep = 0xf7d5; + skip_spaces = 0xf815; + skip_atoi = 0xf831; + _parse_integer_fixup_radix = 0xf869; + _parse_integer = 0xf8bd; + simple_strtoull = 0xf915; + simple_strtoll = 0xf945; + simple_strtoul = 0xf965; + simple_strtol = 0xf96d; + _vsscanf = 0xf985; + _sscanf = 0xff71; + div_u64 = 0xff91; + div_s64 = 0xff99; + div_u64_rem = 0xffa1; + div_s64_rem = 0xffb1; + _strpbrk = 0xffc1; + _strchr = 0xffed; + aes_set_key = 0x10005; + aes_encrypt = 0x103d1; + aes_decrypt = 0x114a5; + AES_WRAP = 0x125c9; + AES_UnWRAP = 0x12701; + crc32_get = 0x12861; + arc4_byte = 0x12895; + rt_arc4_init = 0x128bd; + rt_arc4_crypt = 0x12901; + rt_md5_init = 0x131c1; + rt_md5_append = 0x131f5; + rt_md5_final = 0x1327d; + rt_md5_hmac = 0x132d5; + rtw_get_bit_value_from_ieee_value = 0x13449; + rtw_is_cckrates_included = 0x13475; + rtw_is_cckratesonly_included = 0x134b5; + rtw_check_network_type = 0x134dd; + rtw_set_fixed_ie = 0x1350d; + rtw_set_ie = 0x1352d; + rtw_get_ie = 0x1355d; + rtw_set_supported_rate = 0x13591; + rtw_get_rateset_len = 0x13611; + rtw_get_wpa_ie = 0x1362d; + rtw_get_wpa2_ie = 0x136c9; + rtw_get_wpa_cipher_suite = 0x13701; + rtw_get_wpa2_cipher_suite = 0x13769; + rtw_parse_wpa_ie = 0x137d1; + rtw_parse_wpa2_ie = 0x138ad; + rtw_get_sec_ie = 0x13965; + rtw_get_wps_ie = 0x13a15; + rtw_get_wps_attr = 0x13a99; + rtw_get_wps_attr_content = 0x13b49; + rtw_ieee802_11_parse_elems = 0x13b91; + str_2char2num = 0x13d9d; + key_2char2num = 0x13db9; + convert_ip_addr = 0x13dd1; + rom_psk_PasswordHash = 0x13e9d; + rom_psk_CalcGTK = 0x13ed5; + rom_psk_CalcPTK = 0x13f69; + wep_80211_encrypt = 0x14295; + wep_80211_decrypt = 0x142f5; + tkip_micappendbyte = 0x14389; + rtw_secmicsetkey = 0x143d9; + rtw_secmicappend = 0x14419; + rtw_secgetmic = 0x14435; + rtw_seccalctkipmic = 0x1449d; + tkip_phase1 = 0x145a5; + tkip_phase2 = 0x14725; + tkip_80211_encrypt = 0x14941; + tkip_80211_decrypt = 0x149d5; + aes1_encrypt = 0x14a8d; + aesccmp_construct_mic_iv = 0x14c65; + aesccmp_construct_mic_header1 = 0x14ccd; + aesccmp_construct_mic_header2 = 0x14d21; + aesccmp_construct_ctr_preload = 0x14db5; + aes_80211_encrypt = 0x14e29; + aes_80211_decrypt = 0x151ad; + _sha1_process_message_block = 0x155b9; + _sha1_pad_message = 0x15749; + rt_sha1_init = 0x157e5; + rt_sha1_update = 0x15831; + rt_sha1_finish = 0x158a9; + rt_hmac_sha1 = 0x15909; + rom_aes_128_cbc_encrypt = 0x15a65; + rom_aes_128_cbc_decrypt = 0x15ae1; + rom_rijndaelKeySetupEnc = 0x15b5d; + rom_aes_decrypt_init = 0x15c39; + rom_aes_internal_decrypt = 0x15d15; + rom_aes_decrypt_deinit = 0x16071; + rom_aes_encrypt_init = 0x16085; + rom_aes_internal_encrypt = 0x1609d; + rom_aes_encrypt_deinit = 0x16451; + bignum_init = 0x17b35; + bignum_deinit = 0x17b61; + bignum_get_unsigned_bin_len = 0x17b81; + bignum_get_unsigned_bin = 0x17b85; + bignum_set_unsigned_bin = 0x17c21; + bignum_cmp = 0x17cd1; + bignum_cmp_d = 0x17cd5; + bignum_add = 0x17cfd; + bignum_sub = 0x17d0d; + bignum_mul = 0x17d1d; + bignum_exptmod = 0x17d2d; + WPS_realloc = 0x17d51; + os_zalloc = 0x17d99; + rom_hmac_sha256_vector = 0x17dc1; + rom_hmac_sha256 = 0x17ebd; + rom_sha256_vector = 0x18009; + phy_CalculateBitShift = 0x18221; + PHY_SetBBReg_8195A = 0x18239; + PHY_QueryBBReg_8195A = 0x18279; + ROM_odm_QueryRxPwrPercentage = 0x1829d; + ROM_odm_EVMdbToPercentage = 0x182bd; + ROM_odm_SignalScaleMapping_8195A = 0x182e5; + ROM_odm_FalseAlarmCounterStatistics = 0x183cd; + ROM_odm_SetEDCCAThreshold = 0x18721; + ROM_odm_SetTRxMux = 0x18749; + ROM_odm_SetCrystalCap = 0x18771; + ROM_odm_GetDefaultCrytaltalCap = 0x187d5; + ROM_ODM_CfoTrackingReset = 0x187e9; + ROM_odm_CfoTrackingFlow = 0x18811; + curve25519_donna = 0x1965d; + aes_test_alignment_detection = 0x1a391; + aes_mode_reset = 0x1a3ed; + aes_ecb_encrypt = 0x1a3f9; + aes_ecb_decrypt = 0x1a431; + aes_cbc_encrypt = 0x1a469; + aes_cbc_decrypt = 0x1a579; + aes_cfb_encrypt = 0x1a701; + aes_cfb_decrypt = 0x1a9e5; + aes_ofb_crypt = 0x1acc9; + aes_ctr_crypt = 0x1af7d; + aes_encrypt_key128 = 0x1b289; + aes_encrypt_key192 = 0x1b2a5; + aes_encrypt_key256 = 0x1b2c1; + aes_encrypt_key = 0x1b2e1; + aes_decrypt_key128 = 0x1b351; + aes_decrypt_key192 = 0x1b36d; + aes_decrypt_key256 = 0x1b389; + aes_decrypt_key = 0x1b3a9; + aes_init = 0x1b419; + CRYPTO_chacha_20 = 0x1b41d; + CRYPTO_poly1305_init = 0x1bc25; + CRYPTO_poly1305_update = 0x1bd09; + CRYPTO_poly1305_finish = 0x1bd8d; + rom_sha512_starts = 0x1ceb5; + rom_sha512_update = 0x1d009; + rom_sha512_finish = 0x1d011; + rom_sha512 = 0x1d261; + rom_sha512_hmac_starts = 0x1d299; + rom_sha512_hmac_update = 0x1d35d; + rom_sha512_hmac_finish = 0x1d365; + rom_sha512_hmac_reset = 0x1d3b5; + rom_sha512_hmac = 0x1d3d1; + rom_sha512_hkdf = 0x1d40d; + rom_ed25519_gen_keypair = 0x1d501; + rom_ed25519_gen_signature = 0x1d505; + rom_ed25519_verify_signature = 0x1d51d; + rom_ed25519_crypto_sign_seed_keypair = 0x1d521; + rom_ed25519_crypto_sign_detached = 0x1d579; + rom_ed25519_crypto_sign_verify_detached = 0x1d655; + rom_ed25519_ge_double_scalarmult_vartime = 0x1f86d; + rom_ed25519_ge_frombytes_negate_vartime = 0x1fc35; + rom_ed25519_ge_p3_tobytes = 0x207d5; + rom_ed25519_ge_scalarmult_base = 0x20821; + rom_ed25519_ge_tobytes = 0x209e1; + rom_ed25519_sc_muladd = 0x20a2d; + rom_ed25519_sc_reduce = 0x2603d; + rtl_memchr_v1_00 = 0x28a4d; + rtl_memcmp_v1_00 = 0x28ae1; + rtl_memcpy_v1_00 = 0x28b49; + __aeabi_memcpy = 0x28b49; + __aeabi_memcpy4 = 0x28b49; + rtl_memmove_v1_00 = 0x28bed; + rtl_memset_v1_00 = 0x28cb5; + __aeabi_memset = 0x28cb5; + rtl_strcat_v1_00 = 0x28d49; + rtl_strchr_v1_00 = 0x28d91; + rtl_strcmp_v1_00 = 0x28e55; + rtl_strcpy_v1_00 = 0x28ec9; + rtl_strlen_v1_00 = 0x28f15; + rtl_strncat_v1_00 = 0x28f69; + rtl_strncmp_v1_00 = 0x28fc5; + rtl_strncpy_v1_00 = 0x2907d; + rtl_strstr_v1_00 = 0x293cd; + rtl_strsep_v1_00 = 0x2960d; + rtl_strtok_v1_00 = 0x29619; + rtl__strtok_r_v1_00 = 0x2962d; + rtl_strtok_r_v1_00 = 0x29691; + rtl_close_v1_00 = 0x29699; + rtl_fstat_v1_00 = 0x296ad; + rtl_isatty_v1_00 = 0x296c1; + rtl_lseek_v1_00 = 0x296d5; + rtl_open_v1_00 = 0x296e9; + rtl_read_v1_00 = 0x296fd; + rtl_write_v1_00 = 0x29711; + rtl_sbrk_v1_00 = 0x29725; + rtl_ltoa_v1_00 = 0x297bd; + rtl_ultoa_v1_00 = 0x29855; + rtl_dtoi_v1_00 = 0x298c5; + rtl_dtoi64_v1_00 = 0x29945; + rtl_dtoui_v1_00 = 0x299dd; + rtl_ftol_v1_00 = 0x299e5; + rtl_itof_v1_00 = 0x29a51; + rtl_itod_v1_00 = 0x29ae9; + rtl_i64tod_v1_00 = 0x29b79; + rtl_uitod_v1_00 = 0x29c55; + rtl_ftod_v1_00 = 0x29d2d; + rtl_dtof_v1_00 = 0x29de9; + rtl_uitof_v1_00 = 0x29e89; + rtl_fadd_v1_00 = 0x29f65; + rtl_fsub_v1_00 = 0x2a261; + rtl_fmul_v1_00 = 0x2a559; + rtl_fdiv_v1_00 = 0x2a695; + rtl_dadd_v1_00 = 0x2a825; + rtl_dsub_v1_00 = 0x2aed9; + rtl_dmul_v1_00 = 0x2b555; + rtl_ddiv_v1_00 = 0x2b8ad; + rtl_dcmpeq_v1_00 = 0x2be4d; + rtl_dcmplt_v1_00 = 0x2bebd; + rtl_dcmpgt_v1_00 = 0x2bf51; + rtl_dcmple_v1_00 = 0x2c049; + rtl_fcmplt_v1_00 = 0x2c139; + rtl_fcmpgt_v1_00 = 0x2c195; + rtl_cos_f32_v1_00 = 0x2c229; + rtl_sin_f32_v1_00 = 0x2c435; + rtl_fabs_v1_00 = 0x2c639; + rtl_fabsf_v1_00 = 0x2c641; + rtl_dtoa_r_v1_00 = 0x2c77d; + __rom_mallocr_init_v1_00 = 0x2d7d1; + rtl_free_r_v1_00 = 0x2d841; + rtl_malloc_r_v1_00 = 0x2da31; + rtl_realloc_r_v1_00 = 0x2df55; + rtl_memalign_r_v1_00 = 0x2e331; + rtl_valloc_r_v1_00 = 0x2e421; + rtl_pvalloc_r_v1_00 = 0x2e42d; + rtl_calloc_r_v1_00 = 0x2e441; + rtl_cfree_r_v1_00 = 0x2e4a9; + rtl_Balloc_v1_00 = 0x2e515; + rtl_Bfree_v1_00 = 0x2e571; + rtl_i2b_v1_00 = 0x2e585; + rtl_multadd_v1_00 = 0x2e599; + rtl_mult_v1_00 = 0x2e629; + rtl_pow5mult_v1_00 = 0x2e769; + rtl_hi0bits_v1_00 = 0x2e809; + rtl_d2b_v1_00 = 0x2e845; + rtl_lshift_v1_00 = 0x2e901; + rtl_cmp_v1_00 = 0x2e9bd; + rtl_diff_v1_00 = 0x2ea01; + rtl_sread_v1_00 = 0x2eae9; + rtl_seofread_v1_00 = 0x2eb39; + rtl_swrite_v1_00 = 0x2eb3d; + rtl_sseek_v1_00 = 0x2ebc1; + rtl_sclose_v1_00 = 0x2ec11; + rtl_sbrk_r_v1_00 = 0x2ec41; + rtl_fflush_r_v1_00 = 0x2ef8d; + rtl_vfprintf_r_v1_00 = 0x2f661; + rtl_fpclassifyd = 0x30c15; + CpkClkTbl = 0x30c68; + ROM_IMG1_VALID_PATTEN = 0x30c80; + SpicCalibrationPattern = 0x30c88; + SpicInitCPUCLK = 0x30c98; + BAUDRATE = 0x30ca8; + OVSR = 0x30d1c; + DIV = 0x30d90; + OVSR_ADJ = 0x30e04; + __AES_rcon = 0x30e78; + __AES_Te4 = 0x30ea0; + I2CDmaChNo = 0x312a0; + _GPIO_PinMap_Chip2IP_8195a = 0x312b4; + _GPIO_PinMap_PullCtrl_8195a = 0x3136c; + _GPIO_SWPORT_DDR_TBL = 0x31594; + _GPIO_EXT_PORT_TBL = 0x31598; + _GPIO_SWPORT_DR_TBL = 0x3159c; + UartLogRomCmdTable = 0x316a0; + _HalRuartOp = 0x31700; + _HalGdmaOp = 0x31760; + RTW_WPA_OUI_TYPE = 0x3540c; + WPA_CIPHER_SUITE_NONE = 0x35410; + WPA_CIPHER_SUITE_WEP40 = 0x35414; + WPA_CIPHER_SUITE_TKIP = 0x35418; + WPA_CIPHER_SUITE_CCMP = 0x3541c; + WPA_CIPHER_SUITE_WEP104 = 0x35420; + RSN_CIPHER_SUITE_NONE = 0x35424; + RSN_CIPHER_SUITE_WEP40 = 0x35428; + RSN_CIPHER_SUITE_TKIP = 0x3542c; + RSN_CIPHER_SUITE_CCMP = 0x35430; + RSN_CIPHER_SUITE_WEP104 = 0x35434; + RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X = 0x35444; + RSN_AUTH_KEY_MGMT_UNSPEC_802_1X = 0x35448; + RSN_VERSION_BSD = 0x3544c; + rom_wps_Te0 = 0x35988; + rom_wps_rcons = 0x35d88; + rom_wps_Td4s = 0x35d94; + rom_wps_Td0 = 0x35e94; + __rom_b_cut_end__ = 0x4467c; + __rom_c_cut_text_start__ = 0x4467c; + HalInitPlatformLogUartV02 = 0x4467d; + HalReInitPlatformLogUartV02 = 0x4471d; + HalInitPlatformTimerV02 = 0x44755; + HalShowBuildInfoV02 = 0x447cd; + SpicReleaseDeepPowerDownFlashRtl8195A = 0x44831; + HalSpiInitV02 = 0x4488d; + HalBootFlowV02 = 0x44a29; + HalInitialROMCodeGlobalVarV02 = 0x44ae5; + HalResetVsrV02 = 0x44b41; + HalI2CSendRtl8195aV02 = 0x44ce1; + HalI2CSetCLKRtl8195aV02 = 0x44d59; + RtkI2CSendV02 = 0x4508d; + RtkI2CReceiveV02 = 0x459a1; + HalI2COpInitV02 = 0x461ed; + I2CISRHandleV02 = 0x463e9; + RtkSalI2COpInitV02 = 0x46be1; + SpicLoadInitParaFromClockRtl8195AV02 = 0x46c25; + SpiFlashAppV02 = 0x46c85; + SpicInitRtl8195AV02 = 0x46dc5; + SpicEraseFlashRtl8195AV02 = 0x46ea1; + HalTimerIrq2To7HandleV02 = 0x46f5d; + HalTimerIrqRegisterRtl8195aV02 = 0x46fe1; + HalTimerInitRtl8195aV02 = 0x4706d; + HalTimerReadCountRtl8195aV02 = 0x471b5; + HalTimerReLoadRtl8195aV02 = 0x471d1; + HalTimerIrqUnRegisterRtl8195aV02 = 0x4722d; + HalTimerDeInitRtl8195aV02 = 0x472c1; + HalTimerOpInitV02 = 0x472f9; + GPIO_LockV02 = 0x47345; + GPIO_UnLockV02 = 0x47379; + GPIO_Int_Clear_8195aV02 = 0x473a5; + HAL_GPIO_IntCtrl_8195aV02 = 0x473b5; + FindElementIndexV02 = 0x47541; + HalRuartInitRtl8195aV02 = 0x4756d; + DramInit_rom = 0x47619; + ChangeRandSeed_rom = 0x47979; + Sdr_Rand2_rom = 0x47985; + MemTest_rom = 0x479dd; + SdrCalibration_rom = 0x47a45; + SdrControllerInit_rom = 0x47d99; + SDIO_EnterCritical = 0x47e39; + SDIO_ExitCritical = 0x47e85; + SDIO_IRQ_Handler_Rom = 0x47ec5; + SDIO_Interrupt_Init_Rom = 0x47f31; + SDIO_Device_Init_Rom = 0x47f81; + SDIO_Interrupt_DeInit_Rom = 0x48215; + SDIO_Device_DeInit_Rom = 0x48255; + SDIO_Enable_Interrupt_Rom = 0x48281; + SDIO_Disable_Interrupt_Rom = 0x482a1; + SDIO_Clear_ISR_Rom = 0x482c1; + SDIO_Alloc_Rx_Pkt_Rom = 0x482d9; + SDIO_Free_Rx_Pkt_Rom = 0x48331; + SDIO_Recycle_Rx_BD_Rom = 0x48355; + SDIO_RX_IRQ_Handler_BH_Rom = 0x484f1; + SDIO_RxTask_Rom = 0x4851d; + SDIO_Process_H2C_IOMsg_Rom = 0x4856d; + SDIO_Send_C2H_IOMsg_Rom = 0x4859d; + SDIO_Process_RPWM_Rom = 0x485b5; + SDIO_Reset_Cmd_Rom = 0x485e9; + SDIO_Rx_Data_Transaction_Rom = 0x48611; + SDIO_Send_C2H_PktMsg_Rom = 0x48829; + SDIO_Register_Tx_Callback_Rom = 0x488f5; + SDIO_ReadMem_Rom = 0x488fd; + SDIO_WriteMem_Rom = 0x489a9; + SDIO_SetMem_Rom = 0x48a69; + SDIO_TX_Pkt_Handle_Rom = 0x48b29; + SDIO_TX_FIFO_DataReady_Rom = 0x48c69; + SDIO_IRQ_Handler_BH_Rom = 0x48d95; + SDIO_TxTask_Rom = 0x48e9d; + SDIO_TaskUp_Rom = 0x48eed; + SDIO_Boot_Up = 0x48f55; + __rom_c_cut_text_end__ = 0x49070; + __rom_c_cut_rodata_start__ = 0x49070; + BAUDRATE_v02 = 0x49070; + OVSR_v02 = 0x490fc; + DIV_v02 = 0x49188; + OVSR_ADJ_v02 = 0x49214; + SdrDramInfo_rom = 0x492a0; + SdrDramTiming_rom = 0x492b4; + SdrDramModeReg_rom = 0x492e8; + SdrDramDev_rom = 0x49304; + __rom_c_cut_rodata_end__ = 0x49314; + NewVectorTable = 0x10000000; + UserIrqFunTable = 0x10000100; + UserIrqDataTable = 0x10000200; + __rom_bss_start__ = 0x10000300; + CfgSysDebugWarn = 0x10000300; + CfgSysDebugInfo = 0x10000304; + CfgSysDebugErr = 0x10000308; + ConfigDebugWarn = 0x1000030c; + ConfigDebugInfo = 0x10000310; + ConfigDebugErr = 0x10000314; + HalTimerOp = 0x10000318; + GPIOState = 0x10000334; + gTimerRecord = 0x1000034c; + SSI_DBG_CONFIG = 0x10000350; + _pHAL_Gpio_Adapter = 0x10000354; + Timer2To7VectorTable = 0x10000358; + pUartLogCtl = 0x10000384; + UartLogBuf = 0x10000388; + UartLogCtl = 0x10000408; + UartLogHistoryBuf = 0x10000430; + ArgvArray = 0x100006ac; + rom_wlan_ram_map = 0x100006d4; + FalseAlmCnt = 0x100006e0; + ROMInfo = 0x10000720; + DM_CfoTrack = 0x10000738; + rom_libgloss_ram_map = 0x10000760; + rtl_errno = 0x10000bc4; + _rtl_impure_ptr = 0x10001c60; +} diff --git a/lib/cpu/rtl8710/rtl8710.h b/lib/cpu/rtl8710/rtl8710.h new file mode 100644 index 0000000..8eb9ec9 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710.h @@ -0,0 +1,13 @@ +#ifndef _RTL8710_H_ +#define _RTL8710_H_ + +#include "rtl8710_sys.h" +#include "rtl8710_int.h" +#include "rtl8710_peri_on.h" +#include "rtl8710_timer.h" +#include "rtl8710_gpio.h" +//#include "rtl8710_log_uart.h" +//#include "rtl8710_spi.h" + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710.ld b/lib/cpu/rtl8710/rtl8710.ld new file mode 100644 index 0000000..e337076 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710.ld @@ -0,0 +1,85 @@ + +ENTRY(start_init) + +MEMORY{ + tcm (rwx) : ORIGIN = 0x1FFF0000, LENGTH = 64k + ram (rwx) : ORIGIN = 0x10000ba8, LENGTH = 0x70000 - 0x0ba8 +/* flash (rx) : ORIGIN = 0x98000000, LENGTH = 1024k */ +} + +PROVIDE(STACK_TOP = 0x1FFF0000 + 64k - 4); + +SECTIONS{ + __rom_bss_start__ = 0x10000300; + __rom_bss_end__ = 0x10000bc8; + + .fheader : { + flash_head = ABSOLUTE(.); + LONG(0x96969999) + LONG(0xFC66CC3F) + LONG(0x03CC33C0) + LONG(0x6231DCE5) + FirmvareSize = ABSOLUTE(.); + LONG(__seg0_end__ - __seg0_start__) + LONG(__seg0_start__) + SHORT(seg0_size_1k) + SHORT(0xFFFF) + LONG(0xFFFFFFFF) +/* *(.fheader.data) */ + } > ram + + .header : { + __seg0_start__ = ABSOLUTE(.); + boot_head = ABSOLUTE(.); + KEEP(*(.header.data*)) + . = ALIGN(4); + __seg0_size__ = ABSOLUTE(.); + LONG(__seg0_end__ - __seg0_start__) + . = ALIGN(4); + KEEP(*(.header.code*)) + *(.header*) + } > ram + + .text : { + . = ALIGN(4); + *(.vector.data*) *(.vector.code*) *(.vector*) + __text_beg__ = ABSOLUTE(.); + *(.text) *(.text*) *(.rodata) *(.rodata*) *(.glue_7) *(.glue_7t) *(.eh_frame) *(.ARM.extab*) + . = ALIGN(4); + __text_end__ = ABSOLUTE(.); + } >ram + + .data : { + . = ALIGN(4); + __data_beg__ = ABSOLUTE(.); + *(.ram_vectors) *(.data) *(.data*) *(.ram_func) . = ALIGN(4); + __data_end__ = ABSOLUTE(.); + . = ALIGN(4); + __seg0_end__ = ABSOLUTE(.); + } >ram + + .bss : { + . = ALIGN(4); + __bss_beg__ = ABSOLUTE(.); + *(.bss) *(COMMON) . = ALIGN(4); + __bss_end__ = ABSOLUTE(.); + } >ram + + .ARM.exidx : { + ___exidx_start = ABSOLUTE(.); + *(.ARM.exidx*) ; + ___exidx_end = ABSOLUTE(.); + } >ram + + .ARM.extab : { + *(.ARM.extab*) + } >ram + + . = ALIGN(4); + + end = .; + PROVIDE (end = .); +} + +INCLUDE "export-rom_v03.txt" + diff --git a/lib/cpu/rtl8710/rtl8710.ocd b/lib/cpu/rtl8710/rtl8710.ocd new file mode 100644 index 0000000..adfb0f5 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710.ocd @@ -0,0 +1,332 @@ +# +# OpenOCD script for RTL8710 +# Copyright (C) 2016 Rebane, rebane@alkohol.ee +# + +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME rtl8710 +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x800 +} + +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x2ba01477 +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_TARGETNAME + +$_TARGETNAME configure -work-area-phys 0x10001000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +# adapter_khz 500 +adapter_nsrst_delay 100 + +if {![using_hla]} { + cortex_m reset_config sysresetreq +} + +set rtl8710_flasher_firmware_ptr 0x10001000 +set rtl8710_flasher_buffer 0x10008000 +set rtl8710_flasher_buffer_size 262144 +set rtl8710_flasher_sector_size 4096 + +array set rtl8710_flasher_code { + 0 0xB671B57F 1 0x25FF4B58 2 0x6B196B1A 3 0x7040F042 4 0x69D96318 5 0xF4414E55 + 6 0x69D97480 7 0xF8D361DC 8 0xF8C32120 9 0xF8D35120 10 0xF8C31124 11 0x47B05124 + 12 0x47B04E4F 13 0x47984B4F 14 0x60104A4F 15 0x484F47B0 16 0x60012100 17 0x2C006804 + 18 0x4D4DD0FC 19 0xB93E682E 20 0x60264C49 21 0x47B04E46 22 0x47984B46 23 0xE7ED6020 + 24 0x2B01682B 25 0x4E42D109 26 0x4C4647B0 27 0x47A02006 28 0x47904A45 29 0x47A020C7 + 30 0x682AE00D 31 0xD10E2A02 32 0x47B04E3B 33 0x20064C3F 34 0x483F47A0 35 0x493F4780 + 36 0x68084D3F 37 0x47B047A8 38 0x47A02004 39 0x6828E7CE 40 0xD1132803 41 0x47A04C32 + 42 0x24004838 43 0x4E396805 44 0x68311960 45 0xD206428C 46 0x4B384A37 47 0x221018A1 + 48 0x34104798 49 0x4D2AE7F3 50 0xE7B847A8 51 0x29046829 52 0x2400D11B 53 0x6806482F + 54 0xD2B042B4 55 0x47A84D24 56 0x20064E28 57 0x4B2847B0 58 0x49284798 59 0x680A4B2A + 60 0x18A018E1 61 0xF44F4B2A 62 0x47987280 63 0x200447A8 64 0xF50447B0 65 0x47A87480 + 66 0x682CE7E4 67 0xD1232C05 68 0x47984B17 69 0x4D1F2400 70 0x4294682A 71 0x481BD28F + 72 0x68012210 73 0x18604E1D 74 0x47B04669 75 0x1B19682B 76 0xBF282910 77 0x23002110 + 78 0xD011428B 79 0xF81D4A16 80 0x18A05003 81 0x42B55CC6 82 0x3301D101 83 0x4A15E7F4 + 84 0x60112101 85 0xE7726054 86 0x25014E12 87 0xE76E6035 88 0x47A84D03 89 0xE7D63410 + 90 0x40000200 91 0x100011BD 92 0x100013DD 93 0x10001289 94 0x1000800C 95 0x10008000 + 96 0x10008004 97 0x1000130D 98 0x100013ED 99 0x10008010 100 0x10001335 101 0x10008014 + 102 0x10008020 103 0x10001221 104 0x10001375 105 0x10008008 106 0x6A5A4B03 107 0xD0FB0512 + 108 0x0060F893 109 0xBF004770 110 0x40006000 111 0x6B194B17 112 0xF4416B1A 113 0x63187040 + 114 0x69186919 115 0x0110F041 116 0xF8D36119 117 0x220000C0 118 0x0106F020 119 0x00C0F8D3 + 120 0x10C0F8C3 121 0x00C0F8D3 122 0x0101F040 123 0x00C0F8D3 124 0x10C0F8C3 125 0x43BCF503 + 126 0x609A6899 127 0x20016AD9 128 0x691962DA 129 0x69596118 130 0x61592102 131 0x619A6999 + 132 0x61DA69D9 133 0x64DA6CD9 134 0xBF004770 135 0x40000200 136 0x460EB570 137 0xB34A4614 + 138 0xF3C04B15 139 0x681A4507 140 0x7240F44F 141 0x685A601A 142 0xF3C02103 143 0x2C102207 + 144 0x2410BF28 145 0x605CB2C0 146 0x1060F883 147 0x5060F883 148 0xF8832101 149 0xF8832060 + 150 0x689A0060 151 0x60992500 152 0x47984B08 153 0x35015570 154 0x42A2B2AA 155 0x4804D3F8 + 156 0xF0116A81 157 0xD1FA0301 158 0x60836881 159 0xBD704620 160 0x40006000 161 0x100011A9 + 162 0x4C10B5F8 163 0x68232003 164 0x7340F44F 165 0x68636023 166 0x60602101 167 0x68A3229F + 168 0x60A14D0B 169 0x2060F884 170 0x460647A8 171 0x460747A8 172 0x040347A8 173 0x2707EA43 + 174 0x0006EA47 175 0x4B036AA1 176 0x0201F011 177 0x6899D1FA 178 0xBDF8609A 179 0x40006000 + 180 0x100011A9 181 0x4C0BB510 182 0x68232001 183 0x7340F44F 184 0x68636023 185 0x60602105 + 186 0x60A068A2 187 0xF8844A06 188 0x47901060 189 0x4B036AA1 190 0x0201F011 191 0x6899D1FA + 192 0xBD10609A 193 0x40006000 194 0x100011A9 195 0x21014B08 196 0xF44F681A 197 0x601A7280 + 198 0x6099689A 199 0x0060F883 200 0x48036A9A 201 0x0101F012 202 0x6883D1FA 203 0x47706081 + 204 0x40006000 205 0x21014B0E 206 0xF44F681A 207 0x601A7280 208 0x2220689A 209 0xF8836099 + 210 0xF3C02060 211 0xF3C04107 212 0xB2C02207 213 0x1060F883 214 0x2060F883 215 0x0060F883 + 216 0x4A036A99 217 0x0001F011 218 0x6893D1FA 219 0x47706090 220 0x40006000 221 0xB36AB530 + 222 0x25014B17 223 0xF44F681C 224 0x601C7480 225 0x2402689C 226 0xF883609D 227 0xF3C04060 + 228 0xF3C04507 229 0xB2C02407 230 0x5060F883 231 0x7F80F5B2 232 0xF44FBF28 233 0xF8837280 + 234 0xF8834060 235 0x20000060 236 0x4C095C0D 237 0xF8843001 238 0xB2855060 239 0xD3F74295 + 240 0x07496A99 241 0x6AA0D5FC 242 0xF0104B03 243 0xD1FA0101 244 0x60996898 245 0xBD304610 + 246 0x40006000 247 0x4B02B508 248 0x07C04798 249 0xBD08D4FB 250 0x100012D5 251 0x4B04B508 + 252 0xF0004798 253 0xB2C10002 254 0xD0F82900 255 0xBF00BD08 256 0x100012D5 +} + +set rtl8710_flasher_command_read_id 0 +set rtl8710_flasher_command_mass_erase 1 +set rtl8710_flasher_command_sector_erase 2 +set rtl8710_flasher_command_read 3 +set rtl8710_flasher_command_write 4 +set rtl8710_flasher_command_verify 5 + +set rtl8710_flasher_ready 0 +set rtl8710_flasher_capacity 0 +set rtl8710_flasher_auto_erase 0 +set rtl8710_flasher_auto_verify 0 +set rtl8710_flasher_auto_erase_sector 0xFFFFFFFF + +proc rtl8710_flasher_init {} { + global rtl8710_flasher_firmware_ptr + global rtl8710_flasher_buffer + global rtl8710_flasher_capacity + global rtl8710_flasher_ready + global rtl8710_flasher_code + + if {[expr {$rtl8710_flasher_ready == 0}]} { + echo "initializing RTL8710 flasher" + halt + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + array2mem rtl8710_flasher_code 32 $rtl8710_flasher_firmware_ptr [array size rtl8710_flasher_code] + reg faultmask 0x01 + reg sp 0x20000000 + reg pc $rtl8710_flasher_firmware_ptr + resume + rtl8710_flasher_wait + set id [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]] + set rtl8710_flasher_capacity [expr {2 ** [expr {($id >> 16) & 0xFF}]}] + set rtl8710_flasher_ready 1 + echo "RTL8710 flasher initialized" + } + return "" +} + +proc rtl8710_flasher_mrw {reg} { + set value "" + mem2array value 32 $reg 1 + return $value(0) +} + +proc rtl8710_flasher_wait {} { + global rtl8710_flasher_buffer + while {[rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x00}]]} { } +} + +proc rtl8710_flasher_load_block {local_filename offset len} { + global rtl8710_flasher_buffer + load_image $local_filename [expr {$rtl8710_flasher_buffer + 0x20 - $offset}] bin [expr {$rtl8710_flasher_buffer + 0x20}] $len +} + +proc rtl8710_flasher_read_block {offset len} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_read + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_read + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x14}] $len + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]] + if {[expr {$status > 0}]} { + error "read error, offset $offset" + } +} + +proc rtl8710_flasher_write_block {offset len} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_write + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_write + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x14}] $len + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]] + if {[expr {$status > 0}]} { + error "write error, offset $offset" + } +} + +proc rtl8710_flasher_verify_block {offset len} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_verify + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_verify + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x14}] $len + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x08}]] + if {[expr {$status > 0}]} { + set status [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]] + set status [expr {$status + $offset}] + error "verify error, offset $status" + } +} + +proc rtl8710_flash_read_id {} { + global rtl8710_flasher_buffer + global rtl8710_flasher_capacity + global rtl8710_flasher_command_read_id + rtl8710_flasher_init + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_read_id + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait + set id [rtl8710_flasher_mrw [expr {$rtl8710_flasher_buffer + 0x0C}]] + set manufacturer_id [format "0x%02X" [expr {$id & 0xFF}]] + set memory_type [format "0x%02X" [expr {($id >> 8) & 0xFF}]] + set memory_capacity [expr {2 ** [expr {($id >> 16) & 0xFF}]}] + echo "manufacturer ID: $manufacturer_id, memory type: $memory_type, memory capacity: $memory_capacity bytes" +} + +proc rtl8710_flash_mass_erase {} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_mass_erase + rtl8710_flasher_init + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_mass_erase + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait +} + +proc rtl8710_flash_sector_erase {offset} { + global rtl8710_flasher_buffer + global rtl8710_flasher_command_sector_erase + rtl8710_flasher_init + mww [expr {$rtl8710_flasher_buffer + 0x04}] $rtl8710_flasher_command_sector_erase + mww [expr {$rtl8710_flasher_buffer + 0x08}] 0x00000000 + mww [expr {$rtl8710_flasher_buffer + 0x10}] $offset + mww [expr {$rtl8710_flasher_buffer + 0x00}] 0x00000001 + rtl8710_flasher_wait +} + +proc rtl8710_flash_read {local_filename loc size} { + global rtl8710_flasher_buffer + global rtl8710_flasher_buffer_size + rtl8710_flasher_init + for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { + set len [expr {$size - $offset}] + if {[expr {$len > $rtl8710_flasher_buffer_size}]} { + set len $rtl8710_flasher_buffer_size + } + set flash_offset [expr {$loc + $offset}] + echo "read offset $flash_offset" + rtl8710_flasher_read_block $flash_offset $len + dump_image /tmp/_rtl8710_flasher.bin [expr {$rtl8710_flasher_buffer + 0x20}] $len + exec dd conv=notrunc if=/tmp/_rtl8710_flasher.bin "of=$local_filename" bs=1 "seek=$offset" + echo "read $len bytes" + } +} + +proc rtl8710_flash_write {local_filename loc} { + global rtl8710_flasher_buffer_size + global rtl8710_flasher_sector_size + global rtl8710_flasher_auto_erase + global rtl8710_flasher_auto_verify + global rtl8710_flasher_auto_erase_sector + rtl8710_flasher_init + set sector 0 + set size [file size $local_filename] + for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { + set len [expr {$size - $offset}] + if {[expr {$len > $rtl8710_flasher_buffer_size}]} { + set len $rtl8710_flasher_buffer_size + } + set flash_offset [expr {$loc + $offset}] + echo "write offset $flash_offset" + rtl8710_flasher_load_block $local_filename $offset $len + if {[expr {$rtl8710_flasher_auto_erase != 0}]} { + for {set i $flash_offset} {$i < [expr {$flash_offset + $len}]} {incr i} { + set sector [expr {$i / $rtl8710_flasher_sector_size}] + if {[expr {$rtl8710_flasher_auto_erase_sector != $sector}]} { + echo "erase sector $sector" + rtl8710_flash_sector_erase [expr {$sector * $rtl8710_flasher_sector_size}] + set rtl8710_flasher_auto_erase_sector $sector + } + } + } + rtl8710_flasher_write_block $flash_offset $len + echo "wrote $len bytes" + if {[expr {$rtl8710_flasher_auto_verify != 0}]} { + echo "verify offset $flash_offset" + rtl8710_flasher_verify_block $flash_offset $len + } + } +} + +proc rtl8710_flash_verify {local_filename loc} { + global rtl8710_flasher_buffer_size + rtl8710_flasher_init + set size [file size $local_filename] + for {set offset 0} {$offset < $size} {set offset [expr {$offset + $rtl8710_flasher_buffer_size}]} { + set len [expr {$size - $offset}] + if {[expr {$len > $rtl8710_flasher_buffer_size}]} { + set len $rtl8710_flasher_buffer_size + } + set flash_offset [expr {$loc + $offset}] + echo "read offset $flash_offset" + rtl8710_flasher_load_block $local_filename $offset $len + echo "verify offset $flash_offset" + rtl8710_flasher_verify_block $flash_offset $len + } +} + +proc rtl8710_flash_auto_erase {on} { + global rtl8710_flasher_auto_erase + if {[expr {$on != 0}]} { + set rtl8710_flasher_auto_erase 1 + echo "auto erase on" + } else { + set rtl8710_flasher_auto_erase 0 + echo "auto erase off" + } +} + +proc rtl8710_flash_auto_verify {on} { + global rtl8710_flasher_auto_verify + if {[expr {$on != 0}]} { + set rtl8710_flasher_auto_verify 1 + echo "auto verify on" + } else { + set rtl8710_flasher_auto_verify 0 + echo "auto verify off" + } +} + +proc rtl8710_reboot {} { + mww 0xE000ED0C 0x05FA0007 +} + diff --git a/lib/cpu/rtl8710/rtl8710_gpio.h b/lib/cpu/rtl8710/rtl8710_gpio.h new file mode 100644 index 0000000..8f92fd1 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_gpio.h @@ -0,0 +1,37 @@ +#ifndef _RTL8710_GPIO_H_ +#define _RTL8710_GPIO_H_ + +#include + +typedef struct{ + volatile uint32_t SWPORTA_DR; + volatile uint32_t SWPORTA_DDR; + volatile uint32_t SWPORTA_CTRL; + volatile uint32_t SWPORTB_DR; + volatile uint32_t SWPORTB_DDR; + volatile uint32_t SWPORTB_CTRL; + volatile uint32_t SWPORTC_DR; + volatile uint32_t SWPORTC_DDR; + volatile uint32_t SWPORTC_CTRL; + uint32_t RESERVED1[3]; + volatile uint32_t INTEN; + volatile uint32_t INTMASK; + volatile uint32_t INTTYPE_LEVEL; + volatile uint32_t INT_POLARITY; + volatile uint32_t INTSTATUS; + volatile uint32_t RAW_INTSTATUS; + volatile uint32_t DEBOUNCE; + volatile uint32_t PORTA_EOI; + volatile uint32_t EXT_PORTA; + volatile uint32_t EXT_PORTB; + volatile uint32_t EXT_PORTC; + uint32_t RESERVED2[1]; + volatile uint32_t LS_SYNC; +}__attribute__((packed)) GPIO_TypeDef; + +#define GPIO ((GPIO_TypeDef *)0x40001000) + +#define GPIO_PORTA_GC4 (((uint32_t)1) << 8) + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710_int.h b/lib/cpu/rtl8710/rtl8710_int.h new file mode 100644 index 0000000..8ec2b8e --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_int.h @@ -0,0 +1,53 @@ +#ifndef _RTL8710_INT_H_ +#define _RTL8710_INT_H_ + +#define SYSTEM_ON_INT 0 +#define WDG_INT 1 +#define TIMER0_INT 2 +#define TIMER1_INT 3 +#define I2C3_INT 4 +#define TIMER2_7_INT 5 +#define SPI0_INT 6 +#define GPIO_INT 7 +#define UART0_INT 8 +#define SPI_FLASH_INT 9 +#define USB_OTG_INT 10 +#define SDIO_HOST_INT 11 +#define SDIO_DEVICE_INT 12 +#define I2S0_PCM0_INT 13 +#define I2S1_PCM1_INT 14 +#define WL_DMA_INT 15 +#define WL_PROTOCOL_INT 16 +#define CRYPTO_INT 17 +#define GMAC_INT 18 +#define PERIPHERAL_INT 19 +#define GDMA0_CHANNEL0_INT 20 +#define GDMA0_CHANNEL1_INT 21 +#define GDMA0_CHANNEL2_INT 22 +#define GDMA0_CHANNEL3_INT 23 +#define GDMA0_CHANNEL4_INT 24 +#define GDMA0_CHANNEL5_INT 25 +#define GDMA1_CHANNEL0_INT 26 +#define GDMA1_CHANNEL1_INT 27 +#define GDMA1_CHANNEL2_INT 28 +#define GDMA1_CHANNEL3_INT 29 +#define GDMA1_CHANNEL4_INT 30 +#define GDMA1_CHANNEL5_INT 31 +#define I2C0_INT 64 +#define I2C1_INT 65 +#define I2C2_INT 66 +#define SPI1_INT 72 +#define SPI2_INT 73 +#define UART1_INT 80 +#define UART2_INT 81 +#define LOG_UART_INT 88 +#define ADC_INT 89 +#define DAC0_INT 91 +#define DAC1_INT 92 +#define LP_EXTENSION_INT 93 +#define PTA_TRX_INT 95 +#define RXI300_INT 96 +#define NFC_INT 97 + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710_log_uart.h b/lib/cpu/rtl8710/rtl8710_log_uart.h new file mode 100644 index 0000000..8147d9b --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_log_uart.h @@ -0,0 +1,76 @@ +#ifndef _RTL8710_LOG_UART_H_ +#define _RTL8710_LOG_UART_H_ + +#include + +typedef struct{ + union{ + volatile uint32_t RBR; + volatile uint32_t THR; + volatile uint32_t DLL; + volatile uint32_t RBR_THR_DLL; + }; + union{ + volatile uint32_t IER; + volatile uint32_t DLH; + volatile uint32_t IER_DLH; + }; + union{ + volatile uint32_t IIR; + volatile uint32_t FCR; + volatile uint32_t IIR_FCR; + }; + volatile uint32_t LCR; + volatile uint32_t MCR; + volatile uint32_t LSR; + volatile uint32_t MSR; + uint32_t RESERVED1[24]; + volatile uint32_t USR; +}__attribute__((packed)) LOG_UART_TypeDef; + +#define LOG_UART ((LOG_UART_TypeDef *)0x40003000) + +// LOG_UART_IER +#define LOG_UART_IER_ERBFI (((uint32_t)0x01) << 0) +#define LOG_UART_IER_ETBEI (((uint32_t)0x01) << 1) +#define LOG_UART_IER_ELSI (((uint32_t)0x01) << 2) +#define LOG_UART_IER_EDSSI (((uint32_t)0x01) << 3) + +// LOG_UART_FCR +#define LOG_UART_FCR_FIFOE (((uint32_t)0x01) << 0) +#define LOG_UART_FCR_RFIFOR (((uint32_t)0x01) << 1) +#define LOG_UART_FCR_XFIFOR (((uint32_t)0x01) << 2) +#define LOG_UART_FCR_DMAM (((uint32_t)0x01) << 3) +#define LOG_UART_FCR_TET (((uint32_t)0x03) << 4) +#define LOG_UART_FCR_RT (((uint32_t)0x03) << 6) + +// LOG_UART_LCR +#define LOG_UART_LCR_DLS (((uint32_t)0x03) << 0) +#define LOG_UART_LCR_STOP (((uint32_t)0x01) << 2) +#define LOG_UART_LCR_PEN (((uint32_t)0x01) << 3) +#define LOG_UART_LCR_EPS (((uint32_t)0x01) << 4) +#define LOG_UART_LCR_STICK_PAR (((uint32_t)0x01) << 5) +#define LOG_UART_LCR_BC (((uint32_t)0x01) << 6) +#define LOG_UART_LCR_DLAB (((uint32_t)0x01) << 7) + +// LOG_UART_MCR +#define LOG_UART_MCR_DTR (((uint32_t)0x01) << 0) +#define LOG_UART_MCR_RTS (((uint32_t)0x01) << 1) +#define LOG_UART_MCR_OUT1 (((uint32_t)0x01) << 2) +#define LOG_UART_MCR_OUT2 (((uint32_t)0x01) << 3) +#define LOG_UART_MCR_LOOPBACK (((uint32_t)0x01) << 4) +#define LOG_UART_MCR_AFCE (((uint32_t)0x01) << 5) + +// LOG_UART_LSR +#define LOG_UART_LSR_DR (((uint32_t)0x01) << 0) +#define LOG_UART_LSR_OE (((uint32_t)0x01) << 1) +#define LOG_UART_LSR_PE (((uint32_t)0x01) << 2) +#define LOG_UART_LSR_FE (((uint32_t)0x01) << 3) +#define LOG_UART_LSR_BI (((uint32_t)0x01) << 4) +#define LOG_UART_LSR_THRE (((uint32_t)0x01) << 5) +#define LOG_UART_LSR_TEMT (((uint32_t)0x01) << 6) +#define LOG_UART_LSR_RFE (((uint32_t)0x01) << 7) +#define LOG_UART_LSR_ADDR_RCVD (((uint32_t)0x01) << 8) + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710_peri_on.h b/lib/cpu/rtl8710/rtl8710_peri_on.h new file mode 100644 index 0000000..3152e4b --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_peri_on.h @@ -0,0 +1,128 @@ +#ifndef _RTL8710_PERI_ON_H_ +#define _RTL8710_PERI_ON_H_ + +#include + +typedef struct{ + volatile uint32_t PEON_PWR_CTRL; // 0x0200 + volatile uint32_t PON_ISO_CTRL; // 0x0204 + uint32_t RESERVED1[2]; + volatile uint32_t SOC_FUNC_EN; // 0x0210 + volatile uint32_t SOC_HCI_COM_FUNC_EN; // 0x0214 + volatile uint32_t SOC_PERI_FUNC0_EN; // 0x0218 + volatile uint32_t SOC_PERI_FUNC1_EN; // 0x021C + volatile uint32_t SOC_PERI_DB_FUNC0_EN; // 0x0220 + uint32_t RESERVED2[3]; + volatile uint32_t PESOC_CLK_CTRL; // 0x0230 + volatile uint32_t PESOC_PERI_CLK_CTRL0; // 0x0234 + volatile uint32_t PESOC_PERI_CLK_CTRL1; // 0x0238 + volatile uint32_t PESOC_CLK_CTRL3; // 0x023C + volatile uint32_t PESOC_HCI_CLK_CTRL0; // 0x0240 + volatile uint32_t PESOC_COM_CLK_CTRL1; // 0x0244 + volatile uint32_t PESOC_HW_ENG_CLK_CTRL; // 0x0248 + uint32_t RESERVED3[1]; + volatile uint32_t PESOC_CLK_SEL; // 0x0250 + uint32_t RESERVED4[6]; + volatile uint32_t SYS_ANACK_CAL_CTRL; // 0x026C + volatile uint32_t OSC32K_CTRL; // 0x0270 + volatile uint32_t OSC32K_REG_CTRL0; // 0x0274 + volatile uint32_t OSC32K_REG_CTRL1; // 0x0278 + volatile uint32_t THERMAL_METER_CTRL; // 0x027C + volatile uint32_t UART_MUX_CTRL; // 0x0280 + volatile uint32_t SPI_MUX_CTRL; // 0x0284 + volatile uint32_t I2C_MUX_CTRL; // 0x0288 + volatile uint32_t I2S_MUX_CTRL; // 0x028C + uint32_t RESERVED5[4]; + volatile uint32_t HCI_PINMUX_CTRL; // 0x02A0 + volatile uint32_t WL_PINMUX_CTRL; // 0x02A4 + volatile uint32_t BT_PINMUX_CTRL; // 0x02A8 + volatile uint32_t PWM_PINMUX_CTRL; // 0x02AC + uint32_t RESERVED6[4]; + volatile uint32_t CPU_PERIPHERAL_CTRL; // 0x02C0 + uint32_t RESERVED7[7]; + volatile uint32_t HCI_CTRL_STATUS_0; // 0x02E0 + volatile uint32_t HCI_CTRL_STATUS_1; // 0x02E4 + uint32_t RESERVED8[6]; + volatile uint32_t PESOC_MEM_CTRL; // 0x0300 + volatile uint32_t PESOC_SOC_CTRL; // 0x0304 + volatile uint32_t PESOC_PERI_CTRL; // 0x0308 + uint32_t RESERVED9[5]; + volatile uint32_t GPIO_SHTDN_CTRL; // 0x0320 + volatile uint32_t GPIO_DRIVING_CTRL; // 0x0324 + uint32_t RESERVED10[2]; + volatile uint32_t GPIO_PULL_CTRL0; // 0x0330 + volatile uint32_t GPIO_PULL_CTRL1; // 0x0334 + volatile uint32_t GPIO_PULL_CTRL2; // 0x0338 + volatile uint32_t GPIO_PULL_CTRL3; // 0x033C + volatile uint32_t GPIO_PULL_CTRL4; // 0x0340 + volatile uint32_t GPIO_PULL_CTRL5; // 0x0344 + volatile uint32_t GPIO_PULL_CTRL6; // 0x0348 + uint32_t RESERVED11[5]; + volatile uint32_t PERI_PWM0_CTRL; // 0x0360 + volatile uint32_t PERI_PWM1_CTRL; // 0x0364 + volatile uint32_t PERI_PWM2_CTRL; // 0x0368 + volatile uint32_t PERI_PWM3_CTRL; // 0x036C + volatile uint32_t PERI_TIM_EVT_CTRL; // 0x0370 + volatile uint32_t PERI_EGTIM_CTRL; // 0x0374 + uint32_t RESERVED12[30]; + volatile uint32_t PEON_CFG; // 0x03F0 + volatile uint32_t PEON_STATUS; // 0x03F4 +}__attribute__((packed)) PERI_ON_TypeDef; + +#define PERI_ON ((PERI_ON_TypeDef *)0x40000200) + +// PERI_ON_SOC_FUNC_EN +#define PERI_ON_SOC_FUNC_EN_FUN (((uint32_t)0x01) << 0) +#define PERI_ON_SOC_FUNC_EN_OCP (((uint32_t)0x01) << 1) +#define PERI_ON_SOC_FUNC_EN_LXBUS (((uint32_t)0x01) << 2) +#define PERI_ON_SOC_FUNC_EN_FLASH (((uint32_t)0x01) << 4) +#define PERI_ON_SOC_FUNC_EN_MEM_CTRL (((uint32_t)0x01) << 6) +#define PERI_ON_SOC_FUNC_EN_CPU (((uint32_t)0x01) << 8) +#define PERI_ON_SOC_FUNC_EN_LOG_UART (((uint32_t)0x01) << 12) +#define PERI_ON_SOC_FUNC_EN_GDMA0 (((uint32_t)0x01) << 13) +#define PERI_ON_SOC_FUNC_EN_GDMA1 (((uint32_t)0x01) << 14) +#define PERI_ON_SOC_FUNC_EN_GTIMER (((uint32_t)0x01) << 16) +#define PERI_ON_SOC_FUNC_EN_SECURITY_ENGINE (((uint32_t)0x01) << 20) + +// PERI_ON_SOC_PERI_FUNC1_EN +#define PERI_ON_SOC_PERI_FUNC1_EN_ADC0 (((uint32_t)0x01) << 0) +#define PERI_ON_SOC_PERI_FUNC1_EN_DAC0 (((uint32_t)0x01) << 4) +#define PERI_ON_SOC_PERI_FUNC1_EN_DAC1 (((uint32_t)0x01) << 5) +#define PERI_ON_SOC_PERI_FUNC1_EN_GPIO (((uint32_t)0x01) << 8) + +// PERI_ON_PESOC_CLK_CTRL +#define PERI_ON_CLK_CTRL_CKE_OCP (((uint32_t)0x01) << 0) +#define PERI_ON_CLK_CTRL_CKE_PLFM (((uint32_t)0x01) << 2) +#define PERI_ON_CLK_CTRL_ACTCK_TRACE_EN (((uint32_t)0x01) << 4) +#define PERI_ON_CLK_CTRL_SLPCK_TRACE_EN (((uint32_t)0x01) << 5) +#define PERI_ON_CLK_CTRL_ACTCK_VENDOR_REG_EN (((uint32_t)0x01) << 6) +#define PERI_ON_CLK_CTRL_SLPCK_VENDOR_REG_EN (((uint32_t)0x01) << 7) +#define PERI_ON_CLK_CTRL_ACTCK_FLASH_EN (((uint32_t)0x01) << 8) +#define PERI_ON_CLK_CTRL_SLPCK_FLASH_EN (((uint32_t)0x01) << 9) +#define PERI_ON_CLK_CTRL_ACTCK_SDR_EN (((uint32_t)0x01) << 10) +#define PERI_ON_CLK_CTRL_SLPCK_SDR_EN (((uint32_t)0x01) << 11) +#define PERI_ON_CLK_CTRL_ACTCK_LOG_UART_EN (((uint32_t)0x01) << 12) +#define PERI_ON_CLK_CTRL_SLPCK_LOG_UART_EN (((uint32_t)0x01) << 13) +#define PERI_ON_CLK_CTRL_ACTCK_TIMER_EN (((uint32_t)0x01) << 14) +#define PERI_ON_CLK_CTRL_SLPCK_TIMER_EN (((uint32_t)0x01) << 15) +#define PERI_ON_CLK_CTRL_ACTCK_GDMA0_EN (((uint32_t)0x01) << 16) +#define PERI_ON_CLK_CTRL_SLPCK_GDMA0_EN (((uint32_t)0x01) << 17) +#define PERI_ON_CLK_CTRL_ACTCK_GDMA1_EN (((uint32_t)0x01) << 18) +#define PERI_ON_CLK_CTRL_SLPCK_GDMA1_EN (((uint32_t)0x01) << 19) +#define PERI_ON_CLK_CTRL_ACTCK_GPIO_EN (((uint32_t)0x01) << 24) +#define PERI_ON_CLK_CTRL_SLPCK_GPIO_EN (((uint32_t)0x01) << 25) +#define PERI_ON_CLK_CTRL_ACTCK_BTCMD_EN (((uint32_t)0x01) << 28) +#define PERI_ON_CLK_CTRL_SLPCK_BTCMD_EN (((uint32_t)0x01) << 29) + +// PERI_ON_CPU_PERIPHERAL_CTRL +#define PERI_ON_CPU_PERIPHERAL_CTRL_SPI_FLASH_PIN_EN (((uint32_t)0x01) << 0) +#define PERI_ON_CPU_PERIPHERAL_CTRL_SPI_FLASH_PIN_SEL (((uint32_t)0x03) << 1) +#define PERI_ON_CPU_PERIPHERAL_CTRL_SDR_PIN_EN (((uint32_t)0x01) << 4) +#define PERI_ON_CPU_PERIPHERAL_CTRL_SWD_PIN_EN (((uint32_t)0x01) << 16) +#define PERI_ON_CPU_PERIPHERAL_CTRL_TRACE_PIN_EN (((uint32_t)0x01) << 17) +#define PERI_ON_CPU_PERIPHERAL_CTRL_LOG_UART_PIN_EN (((uint32_t)0x01) << 20) +#define PERI_ON_CPU_PERIPHERAL_CTRL_LOG_UART_IR_EN (((uint32_t)0x01) << 21) +#define PERI_ON_CPU_PERIPHERAL_CTRL_LOG_UART_PIN_SEL (((uint32_t)0x03) << 22) + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710_spi.h b/lib/cpu/rtl8710/rtl8710_spi.h new file mode 100644 index 0000000..9ba24b5 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_spi.h @@ -0,0 +1,100 @@ +#ifndef _RTL8710_SPI_H_ +#define _RTL8710_SPI_H_ + +#include + +typedef struct{ + volatile uint32_t CTRLR0; + volatile uint32_t CTRLR1; + volatile uint32_t SSIENR; + volatile uint32_t MWCR; + volatile uint32_t SER; + volatile uint32_t BAUDR; + volatile uint32_t TXFTLR; + volatile uint32_t RXFTLR; + volatile uint32_t TXFLR; + volatile uint32_t RXFLR; + volatile uint32_t SR; + volatile uint32_t IMR; + volatile uint32_t ISR; + volatile uint32_t RISR; + volatile uint32_t TXOICR; + volatile uint32_t RXOICR; + volatile uint32_t RXUICR; + volatile uint32_t MSTICR; + volatile uint32_t ICR; + volatile uint32_t DMACR; + volatile uint32_t DMATDLR; + volatile uint32_t DMARDLR; + volatile uint32_t IDR; + volatile uint32_t SSI_COMP_VERSION; + union{ + struct{ + union{ + volatile uint8_t DR; + volatile uint8_t DR8; + }; + uint8_t RESERVED1[3]; + }__attribute__((packed)); + struct{ + volatile uint16_t DR16; + uint16_t RESERVED2[1]; + }__attribute__((packed)); + volatile uint32_t DR32; + }; + uint32_t RESERVED3[31]; + volatile uint32_t READ_FAST_SINGLE; + volatile uint32_t READ_DUAL_DATA; + volatile uint32_t READ_DUAL_ADDR_DATA; + volatile uint32_t READ_QUAD_DATA; + union{ + volatile uint32_t READ_QUAD_ADDR_DATA; + volatile uint32_t RX_SAMPLE_DLY; + }; + volatile uint32_t WRITE_SIGNLE; + volatile uint32_t WRITE_DUAL_DATA; + volatile uint32_t WRITE_DUAL_ADDR_DATA; + volatile uint32_t WRITE_QUAD_DATA; + volatile uint32_t WRITE_QUAD_ADDR_DATA; + volatile uint32_t WRITE_ENABLE; + volatile uint32_t READ_STATUS; + volatile uint32_t CTRLR2; + volatile uint32_t FBAUDR; + volatile uint32_t ADDR_LENGTH; + volatile uint32_t AUTO_LENGTH; + volatile uint32_t VALID_CMD; + volatile uint32_t FLASE_SIZE; + volatile uint32_t FLUSH_FIFO; +}__attribute__((packed)) SPI_TypeDef; + +#define SPI_FLASH ((SPI_TypeDef *)0x40006000) + +// SPI_CTRLR0 +#define SPI_CTRLR0_FRF (((uint32_t)0x03) << 4) +#define SPI_CTRLR0_SCPH (((uint32_t)0x01) << 6) +#define SPI_CTRLR0_SCPOL (((uint32_t)0x01) << 7) +#define SPI_CTRLR0_TMOD (((uint32_t)0x03) << 8) +#define SPI_CTRLR0_SLV_OE (((uint32_t)0x01) << 10) +#define SPI_CTRLR0_SRL (((uint32_t)0x01) << 11) +#define SPI_CTRLR0_CFS (((uint32_t)0x0F) << 12) +#define SPI_CTRLR0_ADDR_CH (((uint32_t)0x03) << 16) +#define SPI_CTRLR0_DATA_CH (((uint32_t)0x03) << 18) +#define SPI_CTRLR0_CMD_CH (((uint32_t)0x03) << 20) +#define SPI_CTRLR0_FAST_RD (((uint32_t)0x01) << 22) +#define SPI_CTRLR0_SHIFT_CK_MTIMES (((uint32_t)0x1F) << 23) + +// SPI_SER +#define SPI_SER_SS0 (((uint32_t)0x01) << 0) +#define SPI_SER_SS1 (((uint32_t)0x01) << 1) +#define SPI_SER_SS2 (((uint32_t)0x01) << 2) + +// SPI_SR +#define SPI_SR_SSI (((uint32_t)0x01) << 0) +#define SPI_SR_TFNF (((uint32_t)0x01) << 1) +#define SPI_SR_TFE (((uint32_t)0x01) << 2) +#define SPI_SR_RFNE (((uint32_t)0x01) << 3) +#define SPI_SR_RFF (((uint32_t)0x01) << 4) +#define SPI_SR_TXE (((uint32_t)0x01) << 5) + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710_sys.h b/lib/cpu/rtl8710/rtl8710_sys.h new file mode 100644 index 0000000..83eb229 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_sys.h @@ -0,0 +1,106 @@ +#ifndef _RTL8710_SYS_H_ +#define _RTL8710_SYS_H_ + +#include + +// ~/programming/rtl8710/doc/registers/8195a/fwlib/rtl8195a/rtl8195a_sys_on.h + +typedef struct{ + volatile uint16_t PWR_CTRL; // 0x0000 + volatile uint16_t ISO_CTRL; // 0x0002 + uint32_t RESERVED1[1]; + volatile uint32_t FUNC_EN; // 0x0008 + uint32_t RESERVED2[1]; + volatile uint32_t CLK_CTRL0; // 0x0010 + volatile uint32_t CLK_CTRL1; // 0x0014 + uint32_t RESERVED3[2]; + volatile uint32_t EFUSE_SYSCFG0; // 0x0020 + volatile uint32_t EFUSE_SYSCFG1; // 0x0024 + volatile uint32_t EFUSE_SYSCFG2; // 0x0028 + volatile uint32_t EFUSE_SYSCFG3; // 0x002C + volatile uint32_t EFUSE_SYSCFG4; // 0x0030 + volatile uint32_t EFUSE_SYSCFG5; // 0x0034 + volatile uint32_t EFUSE_SYSCFG6; // 0x0038 + volatile uint32_t EFUSE_SYSCFG7; // 0x003C + volatile uint32_t REGU_CTRL0; // 0x0040 + uint32_t RESERVED4[1]; + volatile uint32_t SWR_CTRL0; // 0x0048 + volatile uint32_t SWR_CTRL1; // 0x004C + uint32_t RESERVED5[4]; + volatile uint32_t XTAL_CTRL0; // 0x0060 + volatile uint32_t XTAL_CTRL1; // 0x0064 + uint32_t RESERVED6[2]; + volatile uint32_t SYSPLL_CTRL0; // 0x0070 + volatile uint32_t SYSPLL_CTRL1; // 0x0074 + volatile uint32_t SYSPLL_CTRL2; // 0x0078 + uint32_t RESERVED7[5]; + volatile uint32_t ANA_TIM_CTRL; // 0x0090 + volatile uint32_t DSLP_TIM_CTRL; // 0x0094 + volatile uint32_t DSLP_TIM_CAL_CTRL; // 0x0098 + uint32_t RESERVED8[1]; + volatile uint32_t DEBUG_CTRL; // 0x00A0 + volatile uint32_t PINMUX_CTRL; // 0x00A4 + volatile uint32_t GPIO_DSTBY_WAKE_CTRL0; // 0x00A8 + volatile uint32_t GPIO_DSTBY_WAKE_CTRL1; // 0x00AC + uint32_t RESERVED9[3]; + volatile uint32_t DEBUG_REG; // 0x00BC + uint32_t RESERVED10[8]; + volatile uint32_t EEPROM_CTRL0; // 0x00E0 + volatile uint32_t EEPROM_CTRL1; // 0x00E4 + volatile uint32_t EFUSE_CTRL; // 0x00E8 + volatile uint32_t EFUSE_TEST; // 0x00EC + volatile uint32_t DSTBY_INFO0; // 0x00F0 + volatile uint32_t DSTBY_INFO1; // 0x00F4 + volatile uint32_t DSTBY_INFO2; // 0x00F8 + volatile uint32_t DSTBY_INFO3; // 0x00FC + volatile uint32_t SLP_WAKE_EVENT_MSK0; // 0x0100 + volatile uint32_t SLP_WAKE_EVENT_MSK1; // 0x0104 + volatile uint32_t SLP_WAKE_EVENT_STATUS0; // 0x0108 + volatile uint32_t SLP_WAKE_EVENT_STATUS1; // 0x010C + volatile uint32_t SNF_WAKE_EVENT_MSK0; // 0x0110 + volatile uint32_t SNF_WAKE_EVENT_STATUS; // 0x0114 + volatile uint32_t PWRMGT_CTRL; // 0x0118 + uint32_t RESERVED11[1]; + volatile uint32_t PWRMGT_OPTION; // 0x0120 + volatile uint32_t PWRMGT_OPTION_EXT; // 0x0124 + uint32_t RESERVED12[2]; + volatile uint32_t DSLP_WEVENT; // 0x0130 + volatile uint32_t PERI_MONITOR; // 0x0134 + uint32_t RESERVED13[46]; + volatile uint32_t SYSTEM_CFG0; // 0x01F0 + volatile uint32_t SYSTEM_CFG1; // 0x01F4 + volatile uint32_t SYSTEM_CFG2; // 0x01F8 +}__attribute__((packed)) SYS_TypeDef; + +#define SYS ((SYS_TypeDef *)0x40000000) + +// SYS_PWR_CTRL +#define SYS_PWR_CTRL_PEON_EN (((uint16_t)0x01) << 0) +#define SYS_PWR_CTRL_RET_MEM_EN (((uint16_t)0x01) << 1) +#define SYS_PWR_CTRL_SOC_EN (((uint16_t)0x01) << 2) + +// SYS_ISO_CTRL +#define SYS_ISO_CTRL_PEON (((uint16_t)0x01) << 0) +#define SYS_ISO_CTRL_RET_MEM (((uint16_t)0x01) << 1) +#define SYS_ISO_CTRL_SOC (((uint16_t)0x01) << 2) +#define SYS_ISO_CTRL_SYSPLL (((uint16_t)0x01) << 7) + +// SYS_FUNC_EN +#define SYS_FUNC_EN_FEN_EELDR (((uint32_t)0x01) << 0) +#define SYS_FUNC_EN_SOC_SYSPEON_EN (((uint32_t)0x01) << 4) +#define SYS_FUNC_EN_FEN_SIC (((uint32_t)0x01) << 24) +#define SYS_FUNC_EN_FEN_SIC_MST (((uint32_t)0x01) << 25) +#define SYS_FUNC_EN_PWRON_TRAP_SHTDN_N (((uint32_t)0x01) << 30) +#define SYS_FUNC_EN_AMACRO_EN (((uint32_t)0x01) << 31) + +// SYS_CLK_CTRL0 +#define SYS_CLK_CTRL0_CK_SYSREG_EN (((uint32_t)0x01) << 0) +#define SYS_CLK_CTRL0_CK_EELDR_EN (((uint32_t)0x01) << 1) +#define SYS_CLK_CTRL0_SOC_OCP_IOBUS_CK_EN (((uint32_t)0x01) << 2) + +// SYS_CLK_CTRL1 +#define SYS_CLK_CTRL1_PESOC_EELDR_CK_SEL (((uint32_t)0x01) << 0) +#define SYS_CLK_CTRL1_PESOC_OCP_CPU_CK_SEL (((uint32_t)0x07) << 4) + +#endif + diff --git a/lib/cpu/rtl8710/rtl8710_timer.h b/lib/cpu/rtl8710/rtl8710_timer.h new file mode 100644 index 0000000..a4f7ef9 --- /dev/null +++ b/lib/cpu/rtl8710/rtl8710_timer.h @@ -0,0 +1,35 @@ +#ifndef _RTL8710_TIMER_H_ +#define _RTL8710_TIMER_H_ + +#include + +typedef struct{ + volatile uint32_t TIM0_LOAD_COUNT; + volatile uint32_t TIM0_CURRENT_VALUE; + volatile uint32_t TIM0_CONTROL; + volatile uint32_t TIM0_EOI; + volatile uint32_t TIM0_IS; + volatile uint32_t TIM1_LOAD_COUNT; + volatile uint32_t TIM1_CURRENT_VALUE; + volatile uint32_t TIM1_CONTROL; + volatile uint32_t TIM1_EOI; + volatile uint32_t TIM1_IS; + uint32_t RESERVED1[30]; + volatile uint32_t TIMS_IS; + volatile uint32_t TIMS_EOI; + volatile uint32_t TIMS_RAW_IS; + volatile uint32_t TIMS_COMP_VERSION; + volatile uint32_t TIM0_LOAD_COUNT2; + volatile uint32_t TIM1_LOAD_COUNT2; +}__attribute__((packed)) TIMER_TypeDef; + +#define TIMER ((TIMER_TypeDef *)0x40002000) + +// TIMER_CONTROL +#define TIMER_CONTROL_ENABLE (((uint32_t)0x01) << 0) +#define TIMER_CONTROL_MODE (((uint32_t)0x01) << 1) +#define TIMER_CONTROL_IM (((uint32_t)0x01) << 2) +#define TIMER_CONTROL_PWM (((uint32_t)0x01) << 3) + +#endif + diff --git a/lib/fwlib/hal_adc.h b/lib/fwlib/hal_adc.h new file mode 100644 index 0000000..a509dc3 --- /dev/null +++ b/lib/fwlib/hal_adc.h @@ -0,0 +1,319 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_ADC_H_ +#define _HAL_ADC_H_ + +#include "rtl8195a.h" +#include "rtl8195a_adc.h" +#include "hal_gdma.h" + +//================ ADC Configuration ========================= +#define ADC_INTR_OP_TYPE 1 +#define ADC_DMA_OP_TYPE 1 + +// ADC SAL management macros +#define SAL_ADC_USER_CB_NUM (sizeof(SAL_ADC_USER_CB) / sizeof(PSAL_ADC_USERCB_ADPT)) + +// ADC used module. +// Please set the ADC module flag to 1 to enable the related +#define ADC0_USED 1 +#define ADC1_USED 1 +#define ADC2_USED 1 +#define ADC3_USED 1 + + +//================ Debug MSG Definition ======================= +#define ADC_PREFIX "RTL8195A[adc]: " +#define ADC_PREFIX_LVL " [ADC_DBG]: " + +typedef enum _ADC_DBG_LVL_ { + HAL_ADC_LVL = 0x01, + SAL_ADC_LVL = 0x02, + VERI_ADC_LVL = 0x04, +}ADC_DBG_LVL,*PADC_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_ADC_HAL + + #define DBG_8195A_ADC(...) do{ \ + _DbgDump("\r"ADC_PREFIX __VA_ARGS__);\ + }while(0) + + + #define ADCDBGLVL 0xFF + #define DBG_8195A_ADC_LVL(LVL,...) do{\ + if (LVL&ADCDBGLVL){\ + _DbgDump("\r"ADC_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_ADC_LOG_PERD 100 + #define DBG_8195A_ADC(...) + #define DBG_8195A_ADC_LVL(...) +#endif +#endif + + +//================ ADC HAL Related Enumeration ================== +// ADC Module Selection +typedef enum _ADC_MODULE_SEL_ { + ADC0_SEL = 0x0, + ADC1_SEL = 0x1, + ADC2_SEL = 0x2, + ADC3_SEL = 0x3, +}ADC_MODULE_SEL,*PADC_MODULE_SEL; + +// ADC module status +typedef enum _ADC_MODULE_STATUS_ { + ADC_DISABLE = 0x0, + ADC_ENABLE = 0x1, +}ADC_MODULE_STATUS, *PADC_MODULE_STATUS; + +// ADC Data Endian +typedef enum _ADC_DATA_ENDIAN_ { + ADC_DATA_ENDIAN_LITTLE = 0x0, + ADC_DATA_ENDIAN_BIG = 0x1, +}ADC_DATA_ENDIAN,*PADC_DATA_ENDIAN; + +// ADC Debug Select +typedef enum _ADC_DEBUG_SEL_ { + ADC_DBG_SEL_DISABLE = 0x0, + ADC_DBG_SEL_ENABLE = 0x1, +}ADC_DEBUG_SEL,*PADC_DEBUG_SEL; + +typedef enum _ADC_COMPARE_SET_ { + ADC_COMP_SMALLER_THAN = 0x0, + ADC_COMP_GREATER_THAN = 0x1, +}ADC_COMPARE_SET, *PADC_COMPARE_SET; + +// ADC feature status +typedef enum _ADC_FEATURE_STATUS_{ + ADC_FEATURE_DISABLED = 0, + ADC_FEATURE_ENABLED = 1, +}ADC_FEATURE_STATUS,*PADC_FEATURE_STATUS; + +// ADC operation type +typedef enum _ADC_OP_TYPE_ { + ADC_RDREG_TYPE = 0x0, + ADC_DMA_TYPE = 0x1, + ADC_INTR_TYPE = 0x2, +}ADC_OP_TYPE, *PADC_OP_TYPE; + +// ADC device status +typedef enum _ADC_DEVICE_STATUS_ { + ADC_STS_UNINITIAL = 0x00, + ADC_STS_INITIALIZED = 0x01, + ADC_STS_IDLE = 0x02, + + ADC_STS_TX_READY = 0x03, + ADC_STS_TX_ING = 0x04, + + ADC_STS_RX_READY = 0x05, + ADC_STS_RX_ING = 0x06, + + ADC_STS_ERROR = 0x07, + ADC_STS_FULL = 0x08, +}ADC_DEVICE_STATUS, *PADC_DEVICE_STATUS; + +// ADC error type +typedef enum _ADC_ERR_TYPE_ { + ADC_ERR_FIFO_RD_ERROR = 0x40, //ADC FIFO read error +}ADC_ERR_TYPE, *PADC_ERR_TYPE; + +// ADC initial status +typedef enum _ADC_INITAIL_STATUS_ { + ADC0_INITED = 0x1, + ADC1_INITED = 0x2, + ADC2_INITED = 0x4, + ADC3_INITED = 0x8, +}ADC_INITAIL_STATUS, *PADC_INITAIL_STATUS; + + +//================ ADC HAL Data Structure ====================== +// ADC HAL initial data structure +typedef struct _HAL_ADC_INIT_DAT_ { + u8 ADCIdx; //ADC index used + u8 ADCEn; //ADC module enable + u8 ADCEndian; //ADC endian selection, + //but actually it's for 32-bit ADC data swap control + //1'b0: no swap, + //1'b1: swap the upper 16-bit and the lower 16-bit + u8 ADCBurstSz; //ADC DMA operation threshold + + u8 ADCCompOnly; //ADC compare mode only enable (without FIFO enable) + u8 ADCOneShotEn; //ADC one-shot mode enable + u8 ADCOverWREn; //ADC overwrite mode enable + u8 ADCOneShotTD; //ADC one shot mode threshold + + u16 ADCCompCtrl; //ADC compare mode control, + //1'b0:less than the compare threshold + //1'b1:greater than the compare threshod + u16 ADCCompTD; //ADC compare mode threshold + + u8 ADCDataRate; //ADC down sample data rate, + u8 ADCAudioEn; //ADC audio mode enable + u8 ADCEnManul; //ADC enable manually + u8 ADCDbgSel; + + u32 RSVD0; + + u32 *ADCData; //ADC data pointer + u32 ADCPWCtrl; //ADC0 power control + u32 ADCIntrMSK; //ADC Interrupt Mask + u32 ADCAnaParAd3; //ADC analog parameter 3 + u32 ADCInInput; //ADC Input is internal? +}HAL_ADC_INIT_DAT,*PHAL_ADC_INIT_DAT; + +// ADC HAL Operations +typedef struct _HAL_ADC_OP_ { + RTK_STATUS (*HalADCInit) (VOID *Data); //HAL ADC initialization + RTK_STATUS (*HalADCDeInit) (VOID *Data); //HAL ADC de-initialization + RTK_STATUS (*HalADCEnable) (VOID *Data); //HAL ADC de-initialization + u32 (*HalADCReceive) (VOID *Data); //HAL ADC receive + RTK_STATUS (*HalADCIntrCtrl) (VOID *Data); //HAL ADC interrupt control + u32 (*HalADCReadReg) (VOID *Data, u8 ADCReg);//HAL ADC read register +}HAL_ADC_OP, *PHAL_ADC_OP; + +// ADC user callback adapter +typedef struct _SAL_ADC_USERCB_ADPT_ { + VOID (*USERCB) (VOID *Data); + u32 USERData; +}SAL_ADC_USERCB_ADPT, *PSAL_ADC_USERCB_ADPT; + +// ADC user callback structure +typedef struct _SAL_ADC_USER_CB_ { + PSAL_ADC_USERCB_ADPT pTXCB; //ADC Transmit Callback + PSAL_ADC_USERCB_ADPT pTXCCB; //ADC Transmit Complete Callback + PSAL_ADC_USERCB_ADPT pRXCB; //ADC Receive Callback + PSAL_ADC_USERCB_ADPT pRXCCB; //ADC Receive Complete Callback + PSAL_ADC_USERCB_ADPT pRDREQCB; //ADC Read Request Callback + PSAL_ADC_USERCB_ADPT pERRCB; //ADC Error Callback + PSAL_ADC_USERCB_ADPT pDMATXCB; //ADC DMA Transmit Callback + PSAL_ADC_USERCB_ADPT pDMATXCCB; //ADC DMA Transmit Complete Callback + PSAL_ADC_USERCB_ADPT pDMARXCB; //ADC DMA Receive Callback + PSAL_ADC_USERCB_ADPT pDMARXCCB; //ADC DMA Receive Complete Callback +}SAL_ADC_USER_CB, *PSAL_ADC_USER_CB; + +// ADC Transmit Buffer +typedef struct _SAL_ADC_TRANSFER_BUF_ { + u32 DataLen; //ADC Transmfer Length + u32 *pDataBuf; //ADC Transfer Buffer Pointer + u32 RSVD; // +}SAL_ADC_TRANSFER_BUF,*PSAL_ADC_TRANSFER_BUF; + +typedef struct _SAL_ADC_DMA_USER_DEF_ { + + u8 TxDatSrcWdth; + u8 TxDatDstWdth; + u8 TxDatSrcBstSz; + u8 TxDatDstBstSz; + + u8 TxChNo; + u8 LlpCtrl; + u16 RSVD0; + + u32 MaxMultiBlk; + u32 pLlix; + u32 pBlockSizeList; +}SAL_ADC_DMA_USER_DEF, *PSAL_ADC_DMA_USER_DEF; + +// Software API Level ADC Handler +typedef struct _SAL_ADC_HND_ { + u8 DevNum; //ADC device number + u8 PinMux; //ADC pin mux seletion + u8 OpType; //ADC operation type selection + volatile u8 DevSts; //ADC device status + + u32 ADCExd; //ADC extended options: + //bit 0: example + //bit 31~bit 1: Reserved + u32 ErrType; // + u32 TimeOut; //ADC IO Timeout count + + PHAL_ADC_INIT_DAT pInitDat; //Pointer to ADC initial data struct + PSAL_ADC_TRANSFER_BUF pRXBuf; //Pointer to ADC TX buffer + PSAL_ADC_USER_CB pUserCB; //Pointer to ADC User Callback +}SAL_ADC_HND, *PSAL_ADC_HND; + +// ADC SAL handle private +typedef struct _SAL_ADC_HND_PRIV_ { + VOID **ppSalADCHnd; //Pointer to SAL_ADC_HND pointer + SAL_ADC_HND SalADCHndPriv; //Private SAL_ADC_HND +}SAL_ADC_HND_PRIV, *PSAL_ADC_HND_PRIV; + +//ADC SAL management adapter +typedef struct _SAL_ADC_MNGT_ADPT_ { + PSAL_ADC_HND_PRIV pSalHndPriv; //Pointer to SAL_ADC_HND + PHAL_ADC_INIT_DAT pHalInitDat; //Pointer to HAL ADC initial data( HAL_ADC_INIT_DAT ) + PHAL_ADC_OP pHalOp; //Pointer to HAL ADC operation( HAL_ADC_OP ) + VOID (*pHalOpInit)(VOID*);//Pointer to HAL ADC initialize function + + PIRQ_HANDLE pIrqHnd; //Pointer to IRQ handler in SAL layer( IRQ_HANDLE ) + VOID (*pSalIrqFunc)(VOID*); //Used for SAL ADC interrupt function + + PSAL_ADC_DMA_USER_DEF pDMAConf; //Pointer to DAC User Define DMA config + PHAL_GDMA_ADAPTER pHalGdmaAdp; + PHAL_GDMA_OP pHalGdmaOp; + PIRQ_HANDLE pIrqGdmaHnd; + VOID (*pHalGdmaOpInit)(VOID*); //Pointer to HAL DAC initialize function + PSAL_ADC_USER_CB pUserCB; //Pointer to SAL user callbacks (SAL_ADC_USER_CB ) + VOID (*pSalDMAIrqFunc)(VOID*); //Used for SAL DAC interrupt function +}SAL_ADC_MNGT_ADPT, *PSAL_ADC_MNGT_ADPT; + + +//================ ADC HAL Function Prototype =================== +// ADC HAL inline function +// For checking I2C input index valid or not +static inline RTK_STATUS +RtkADCIdxChk( + IN u8 ADCIdx +) +{ +#if !ADC0_USED + if (ADCIdx == ADC0_SEL) + return _EXIT_FAILURE; +#endif + +#if !ADC1_USED + if (ADCIdx == ADC1_SEL) + return _EXIT_FAILURE; +#endif + +#if !ADC2_USED + if (ADCIdx == ADC2_SEL) + return _EXIT_FAILURE; +#endif + +#if !ADC3_USED + if (ADCIdx == ADC3_SEL) + return _EXIT_FAILURE; +#endif + + return _EXIT_SUCCESS; +} + +VOID HalADCOpInit(IN VOID *Data); +PSAL_ADC_HND RtkADCGetSalHnd(IN u8 DACIdx); +RTK_STATUS RtkADCFreeSalHnd(IN PSAL_ADC_HND pSalADCHND); +RTK_STATUS RtkADCLoadDefault(IN VOID *Data); +RTK_STATUS RtkADCInit(IN VOID *Data); +RTK_STATUS RtkADCDeInit(IN VOID *Data); +//RTK_STATUS RtkADCReceive(IN VOID *Data); +u32 RtkADCReceive(IN VOID *Data); +u32 RtkADCReceiveBuf(IN VOID *Data,IN u32 *pBuf); + +PSAL_ADC_MNGT_ADPT RtkADCGetMngtAdpt(IN u8 ADCIdx); +RTK_STATUS RtkADCFreeMngtAdpt(IN PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt); +VOID ADCISRHandle(IN VOID *Data); +VOID ADCGDMAISRHandle(IN VOID *Data); +HAL_Status RtkADCDisablePS(IN VOID *Data); +HAL_Status RtkADCEnablePS(IN VOID *Data); + +#endif diff --git a/lib/fwlib/hal_api.h b/lib/fwlib/hal_api.h new file mode 100644 index 0000000..c50b6e7 --- /dev/null +++ b/lib/fwlib/hal_api.h @@ -0,0 +1,126 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#ifndef _HAL_API_H_ +#define _HAL_API_H_ + +#include "basic_types.h" +#include "hal_irqn.h" + +#define HAL_READ32(base, addr) \ + rtk_le32_to_cpu(*((volatile u32*)(base + addr))) + +#define HAL_WRITE32(base, addr, value32) \ + ((*((volatile u32*)(base + addr))) = rtk_cpu_to_le32(value32)) + + +#define HAL_READ16(base, addr) \ + rtk_le16_to_cpu(*((volatile u16*)(base + addr))) + +#define HAL_WRITE16(base, addr, value) \ + ((*((volatile u16*)(base + addr))) = rtk_cpu_to_le16(value)) + + +#define HAL_READ8(base, addr) \ + (*((volatile u8*)(base + addr))) + +#define HAL_WRITE8(base, addr, value) \ + ((*((volatile u8*)(base + addr))) = value) + +#if 0 +// These "extern _LONG_CALL_" function declaration are for RAM code building only +// For ROM code building, thses code should be marked off +extern _LONG_CALL_ u8 +HalPinCtrlRtl8195A( + IN u32 Function, + IN u32 PinLocation, + IN BOOL Operation + ); + +extern _LONG_CALL_ VOID +HalSerialPutcRtl8195a( + IN u8 c + ); + +extern _LONG_CALL_ u8 +HalSerialGetcRtl8195a( + IN BOOL PullMode + ); + +extern _LONG_CALL_ u32 +HalSerialGetIsrEnRegRtl8195a(VOID); + +extern _LONG_CALL_ VOID +HalSerialSetIrqEnRegRtl8195a ( + IN u32 SetValue + ); + +extern _LONG_CALL_ VOID +VectorTableInitForOSRtl8195A( + IN VOID *PortSVC, + IN VOID *PortPendSVH, + IN VOID *PortSysTick + ); + +extern _LONG_CALL_ BOOL +VectorIrqRegisterRtl8195A( + IN PIRQ_HANDLE pIrqHandle + ); + +extern _LONG_CALL_ BOOL +VectorIrqUnRegisterRtl8195A( + IN PIRQ_HANDLE pIrqHandle + ); + +extern _LONG_CALL_ VOID +VectorIrqEnRtl8195A( + IN PIRQ_HANDLE pIrqHandle + ); + +extern _LONG_CALL_ VOID +VectorIrqDisRtl8195A( + IN PIRQ_HANDLE pIrqHandle + ); +#endif + +extern BOOLEAN SpicFlashInitRtl8195A(u8 SpicBitMode); +extern VOID InitWDGIRQ(VOID); + +#define PinCtrl HalPinCtrlRtl8195A + +#define DiagPutChar HalSerialPutcRtl8195a +#define DiagGetChar HalSerialGetcRtl8195a +#define DiagGetIsrEnReg HalSerialGetIsrEnRegRtl8195a +#define DiagSetIsrEnReg HalSerialSetIrqEnRegRtl8195a + +#define InterruptForOSInit VectorTableInitForOSRtl8195A +#define InterruptRegister VectorIrqRegisterRtl8195A +#define InterruptUnRegister VectorIrqUnRegisterRtl8195A + +#define InterruptEn VectorIrqEnRtl8195A +#define InterruptDis VectorIrqDisRtl8195A + +#define SpicFlashInit SpicFlashInitRtl8195A +#define Calibration32k En32KCalibration +#define WDGInit InitWDGIRQ + +typedef enum _HAL_Status +{ + HAL_OK = 0x00, + HAL_BUSY = 0x01, + HAL_TIMEOUT = 0x02, + HAL_ERR_PARA = 0x03, // error with invaild parameters + HAL_ERR_MEM = 0x04, // error with memory allocation failed + HAL_ERR_HW = 0x05, // error with hardware error + + HAL_ERR_UNKNOWN = 0xee // unknown error + +} HAL_Status; + + +#endif //_HAL_API_H_ diff --git a/lib/fwlib/hal_common.h b/lib/fwlib/hal_common.h new file mode 100644 index 0000000..113c1a1 --- /dev/null +++ b/lib/fwlib/hal_common.h @@ -0,0 +1,17 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_COMMON_H_ +#define _HAL_COMMON_H_ + +//================= Function Prototype START =================== +HAL_Status HalCommonInit(void); +//================= Function Prototype END =================== + +#endif diff --git a/lib/fwlib/hal_crypto.h b/lib/fwlib/hal_crypto.h new file mode 100644 index 0000000..0224448 --- /dev/null +++ b/lib/fwlib/hal_crypto.h @@ -0,0 +1,213 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef __HAL_CRYPTO_H__ +#define __HAL_CRYPTO_H__ + + +#include "hal_api.h" +#include "basic_types.h" + + +#define CRYPTO_MAX_MSG_LENGTH 16000 +#define CRYPTO_MD5_DIGEST_LENGTH 16 +#define CRYPTO_SHA1_DIGEST_LENGTH 20 +#define CRYPTO_SHA2_DIGEST_LENGTH 32 + + +typedef enum _SHA2_TYPE_ { + SHA2_NONE = 0, + SHA2_224 = 224/8, + SHA2_256 = 256/8, + SHA2_384 = 384/8, + SHA2_512 = 512/8 +} SHA2_TYPE; + + +#define _ERRNO_CRYPTO_DESC_NUM_SET_OutRange -2 +#define _ERRNO_CRYPTO_BURST_NUM_SET_OutRange -3 +#define _ERRNO_CRYPTO_NULL_POINTER -4 +#define _ERRNO_CRYPTO_ENGINE_NOT_INIT -5 +#define _ERRNO_CRYPTO_ADDR_NOT_4Byte_Aligned -6 +#define _ERRNO_CRYPTO_KEY_OutRange -7 +#define _ERRNO_CRYPTO_MSG_OutRange -8 +#define _ERRNO_CRYPTO_IV_OutRange -9 +#define _ERRNO_CRYPTO_AUTH_TYPE_NOT_MATCH -10 +#define _ERRNO_CRYPTO_CIPHER_TYPE_NOT_MATCH -11 +#define _ERRNO_CRYPTO_KEY_IV_LEN_DIFF -12 + + + +// +// External API Functions +// + + +// Crypto Engine +extern int rtl_cryptoEngine_init(void); +extern void rtl_cryptoEngine_info(void); + + + +// +// Authentication +// + +// md5 + +extern int rtl_crypto_md5(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + +extern int rtl_crypto_md5_init(void); +extern int rtl_crypto_md5_process(IN const u8* message, const IN u32 msglen, OUT u8* pDigest); + + +// sha1 +extern int rtl_crypto_sha1(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + +extern int rtl_crypto_sha1_init(void); +extern int rtl_crypto_sha1_process(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + +// sha2 + +extern int rtl_crypto_sha2(IN const SHA2_TYPE sha2type, + IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + +extern int rtl_crypto_sha2_init(IN const SHA2_TYPE sha2type); +extern int rtl_crypto_sha2_process(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + + +// HMAC-md5 +extern int rtl_crypto_hmac_md5(IN const u8* message, IN const u32 msglen, + IN const u8* key, IN const u32 keylen, OUT u8* pDigest); + +extern int rtl_crypto_hmac_md5_init(IN const u8* key, IN const u32 keylen); +extern int rtl_crypto_hmac_md5_process(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + + +// HMAC-sha1 +extern int rtl_crypto_hmac_sha1(IN const u8* message, IN const u32 msglen, + IN const u8* key, IN const u32 keylen, OUT u8* pDigest); + +extern int rtl_crypto_hmac_sha1_init(IN const u8* key, IN const u32 keylen); +extern int rtl_crypto_hmac_sha1_process(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + + +// HMAC-sha2 +extern int rtl_crypto_hmac_sha2(IN const SHA2_TYPE sha2type, IN const u8* message, IN const u32 msglen, + IN const u8* key, IN const u32 keylen, OUT u8* pDigest); + +extern int rtl_crypto_hmac_sha2_init(IN const SHA2_TYPE sha2type, IN const u8* key, IN const u32 keylen); +extern int rtl_crypto_hmac_sha2_process(IN const u8* message, IN const u32 msglen, OUT u8* pDigest); + + +// +// Cipher Functions +// + +// AES - CBC + +extern int rtl_crypto_aes_cbc_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_aes_cbc_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_aes_cbc_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// AES - ECB + +extern int rtl_crypto_aes_ecb_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_aes_ecb_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_aes_ecb_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// AES - CTR + +extern int rtl_crypto_aes_ctr_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_aes_ctr_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_aes_ctr_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// 3DES - CBC + +extern int rtl_crypto_3des_cbc_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_3des_cbc_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_3des_cbc_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// 3DES - ECB + +extern int rtl_crypto_3des_ecb_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_3des_ecb_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_3des_ecb_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// DES - CBC + +extern int rtl_crypto_des_cbc_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_des_cbc_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_des_cbc_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// DES - ECB + +extern int rtl_crypto_des_ecb_init(IN const u8* key, IN const u32 keylen); + +extern int rtl_crypto_des_ecb_encrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + +extern int rtl_crypto_des_ecb_decrypt( + IN const u8* message, IN const u32 msglen, + IN const u8* iv, IN const u32 ivlen, OUT u8* pResult); + + +// +// C functions in ROM +// + +extern int rtl_memcmpb(const u8 *dst, const u8 *src, int bytes); +extern int rtl_memcpyb(u8 *dst, const u8 *src, int bytes); + +#endif /* __HAL_CRYPTO_H__ */ + diff --git a/lib/fwlib/hal_dac.h b/lib/fwlib/hal_dac.h new file mode 100644 index 0000000..f8b3c8f --- /dev/null +++ b/lib/fwlib/hal_dac.h @@ -0,0 +1,313 @@ +//====================================================== +// Routines to access hardware +// +// Copyright (c) 2013 Realtek Semiconductor Corp. +// +// This module is a confidential and proprietary property of RealTek and +// possession or use of this module requires written permission of RealTek. +//====================================================== +#ifndef _HAL_DAC_H_ +#define _HAL_DAC_H_ + +#include "rtl8195a.h" +#include "rtl8195a_dac.h" +#include "hal_api.h" +#include "hal_gdma.h" + +//================ DAC Configuration ========================= +#define DAC_INTR_OP_TYPE 1 +#define DAC_DMA_OP_TYPE 1 + +// DAC SAL management macros +#define SAL_DAC_USER_CB_NUM (sizeof(SAL_DAC_USER_CB) / sizeof(PSAL_DAC_USERCB_ADPT)) + +// DAC SAL used module. +// Please set the DAC module flag to 1 to enable the related DAC module functions. +#define DAC0_USED 1 +#define DAC1_USED 1 + + +//================ Debug MSG Definition ======================= +#define DAC_PREFIX "RTL8195A[dac]: " +#define DAC_PREFIX_LVL " [DAC_DBG]: " + +typedef enum _DAC_DBG_LVL_ { + HAL_DAC_LVL = 0x00, + SAL_DAC_LVL = 0x02, + VERI_DAC_LVL = 0x04, +}DAC_DBG_LVL,*PDAC_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_DAC_HAL + + #define DBG_8195A_DAC(...) do{ \ + _DbgDump("\r"DAC_PREFIX __VA_ARGS__);\ + }while(0) + + + #define DACDBGLVL 0xFF + #define DBG_8195A_DAC_LVL(LVL,...) do{\ + if (LVL&DACDBGLVL){\ + _DbgDump("\r"DAC_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_DAC_LOG_PERD 100 + #define DBG_8195A_DAC(...) + #define DBG_8195A_DAC_LVL(...) +#endif +#endif + + +//================ DAC HAL Related Enumeration ================== +// DAC Module Selection +typedef enum _DAC_MODULE_SEL_ { + DAC0_SEL = 0x0, + DAC1_SEL = 0x1, +}DAC_MODULE_SEL,*PDAC_MODULE_SEL; + +// DAC module status +typedef enum _DAC_MODULE_STATUS_ { + DAC_DISABLE = 0x0, + DAC_ENABLE = 0x1, +}DAC_MODULE_STATUS, *PDAC_MODULE_STATUS; + +// DAC Data Rate +typedef enum _DAC_DATA_RATE_ { + DAC_DATA_RATE_10K = 0x0, + DAC_DATA_RATE_250K = 0x1, +}DAC_DATA_RATE,*PDAC_DATA_RATE; + +// DAC Data Endian +typedef enum _DAC_DATA_ENDIAN_ { + DAC_DATA_ENDIAN_LITTLE = 0x0, + DAC_DATA_ENDIAN_BIG = 0x1, +}DAC_DATA_ENDIAN,*PDAC_DATA_ENDIAN; + +// DAC Debug Select +typedef enum _DAC_DEBUG_SEL_ { + DAC_DBG_SEL_DISABLE = 0x0, + DAC_DBG_SEL_ENABLE = 0x1, +}DAC_DEBUG_SEL,*PDAC_DEBUG_SEL; + +// DAC Dsc Debug Select +typedef enum _DAC_DSC_DEBUG_SEL_ { + DAC_DSC_DBG_SEL_DISABLE = 0x0, + DAC_DSC_DBG_SEL_ENABLE = 0x1, +}DAC_DSC_DEBUG_SEL,*PDAC_DSC_DEBUG_SEL; + + +// DAC Bypass Dsc Debug Select +typedef enum _DAC_BYPASS_DSC_SEL_ { + DAC_BYPASS_DSC_SEL_DISABLE = 0x0, + DAC_BYPASS_DSC_SEL_ENABLE = 0x1, +}DAC_BYPASS_DSC_SEL,*PDAC_BYPASS_DSC_SEL; + +// DAC feature status +typedef enum _DAC_FEATURE_STATUS_{ + DAC_FEATURE_DISABLED = 0, + DAC_FEATURE_ENABLED = 1, +}DAC_FEATURE_STATUS,*PDAC_FEATURE_STATUS; + +// DAC operation type +typedef enum _DAC_OP_TYPE_ { + DAC_POLL_TYPE = 0x0, + DAC_DMA_TYPE = 0x1, + DAC_INTR_TYPE = 0x2, +}DAC_OP_TYPE, *PDAC_OP_TYPE; + +// DAC device status +typedef enum _DAC_Device_STATUS_ { + DAC_STS_UNINITIAL = 0x00, + DAC_STS_INITIALIZED = 0x01, + DAC_STS_IDLE = 0x02, + + DAC_STS_TX_READY = 0x03, + DAC_STS_TX_ING = 0x04, + + DAC_STS_RX_READY = 0x05, + DAC_STS_RX_ING = 0x06, + + DAC_STS_ERROR = 0x07, +}DAC_Device_STATUS, *PDAC_Device_STATUS; + +//DAC device error type +typedef enum _DAC_ERR_TYPE_ { + DAC_ERR_FIFO_OVER = 0x04, //DAC FIFO overflow. + DAC_ERR_FIFO_STOP = 0x08, //DAC FIFO is completely empty, and it will be stopped automatically. + DAC_ERR_FIFO_WRFAIL = 0x10, //When DAC is NOT enabled, a write operation attempts to access DAC register. + DAC_ERR_FIFO_DSC_OVER0 = 0x20, + DAC_ERR_FIFO_DSC_OVER1 = 0x40, +}DAC_ERR_TYPE, *PDAC_ERR_TYPE; + +// DAC data input method +typedef enum _DAC_INPUT_TYPE_{ + DAC_INPUT_SINGLE_WR = 0x1, //DAC input by using single register write + DAC_INPUT_DMA_ONEBLK = 0x2, //DAC input by using single DMA block + DAC_INPUT_DMA_LLP = 0x3, //DAC input by using DMA linked list mode +}DAC_INPUT_TYPE,*PDAC_INPUT_TYPE; + + + + +//====================================================== +// DAC HAL initial data structure +typedef struct _HAL_DAC_INIT_DAT_ { + u8 DACIdx; //DAC index used + u8 DACEn; //DAC module enable + u8 DACDataRate; //DAC data rate, 1'b0:10KHz, 1'b1:250KHz + u8 DACEndian; //DAC endian selection, + //but actually it's for 32-bit DAC data swap control + //1'b0: no swap, + //1'b1: swap the upper 16-bit and the lower 16-bit + u8 DACFilterSet; //DAC filter settle + u8 DACBurstSz; //DAC burst size + u8 DACDbgSel; //DAC debug sel + u8 DACDscDbgSel; //DAC debug dsc sel + + u8 DACBPDsc; //DAC bypass delta sigma for loopback + u8 DACDeltaSig; //DAC bypass value of delta sigma + u16 RSVD1; + + + + u32 *DACData; //DAC data pointer + u32 DACPWCtrl; //DAC0 and DAC1 power control + u32 DACAnaCtrl0; //DAC anapar_da control 0 + u32 DACAnaCtrl1; //DAC anapar_da control 1 + u32 DACIntrMSK; //DAC Interrupt Mask +}HAL_DAC_INIT_DAT,*PHAL_DAC_INIT_DAT; + +// DAC HAL Operations +typedef struct _HAL_DAC_OP_ { + RTK_STATUS (*HalDACInit) (VOID *Data); //HAL DAC initialization + RTK_STATUS (*HalDACDeInit) (VOID *Data); //HAL DAC de-initialization + RTK_STATUS (*HalDACEnable) (VOID *Data); //HAL DAC de-initialization + u8 (*HalDACSend) (VOID *Data); //HAL DAC receive + RTK_STATUS (*HalDACIntrCtrl) (VOID *Data); //HAL DAC interrupt control + u32 (*HalDACReadReg) (VOID *Data, u8 DACReg);//HAL DAC read register +}HAL_DAC_OP, *PHAL_DAC_OP; + +// DAC user callback adapter +typedef struct _SAL_DAC_USERCB_ADPT_ { + VOID (*USERCB) (VOID *Data); + u32 USERData; +}SAL_DAC_USERCB_ADPT, *PSAL_DAC_USERCB_ADPT; + +// DAC user callback structure +typedef struct _SAL_DAC_USER_CB_ { + PSAL_DAC_USERCB_ADPT pTXCB; //DAC Transmit Callback + PSAL_DAC_USERCB_ADPT pTXCCB; //DAC Transmit Complete Callback + PSAL_DAC_USERCB_ADPT pRXCB; //DAC Receive Callback + PSAL_DAC_USERCB_ADPT pRXCCB; //DAC Receive Complete Callback + PSAL_DAC_USERCB_ADPT pRDREQCB; //DAC Read Request Callback + PSAL_DAC_USERCB_ADPT pERRCB; //DAC Error Callback + PSAL_DAC_USERCB_ADPT pDMATXCB; //DAC DMA Transmit Callback + PSAL_DAC_USERCB_ADPT pDMATXCCB; //DAC DMA Transmit Complete Callback + PSAL_DAC_USERCB_ADPT pDMARXCB; //DAC DMA Receive Callback + PSAL_DAC_USERCB_ADPT pDMARXCCB; //DAC DMA Receive Complete Callback +}SAL_DAC_USER_CB, *PSAL_DAC_USER_CB; + +// DAC Transmit Buffer +typedef struct _SAL_DAC_TRANSFER_BUF_ { + u32 DataLen; //DAC Transmfer Length + u32 *pDataBuf; //DAC Transfer Buffer Pointer + u32 RSVD; // +}SAL_DAC_TRANSFER_BUF,*PSAL_DAC_TRANSFER_BUF; + +typedef struct _SAL_DAC_DMA_USER_DEF_ { + + u8 TxDatSrcWdth; + u8 TxDatDstWdth; + u8 TxDatSrcBstSz; + u8 TxDatDstBstSz; + + u8 TxChNo; + u8 LlpCtrl; + u16 RSVD0; + + u32 MaxMultiBlk; + u32 pLlix; + u32 pBlockSizeList; +}SAL_DAC_DMA_USER_DEF, *PSAL_DAC_DMA_USER_DEF; + +// Software API Level DAC Handler +typedef struct _SAL_DAC_HND_ { + u8 DevNum; //DAC device number + u8 PinMux; //DAC pin mux seletion + u8 OpType; //DAC operation type selection + volatile u8 DevSts; //DAC device status + + u8 DACInType; //DAC input type + u8 RSVD0; + u16 RSVD1; + + u32 DACExd; //DAC extended options: + //bit 0: example + //bit 31~bit 1: Reserved + u32 ErrType; // + u32 TimeOut; //DAC IO Timeout count + + PHAL_DAC_INIT_DAT pInitDat; //Pointer to DAC initial data struct + PSAL_DAC_TRANSFER_BUF pTXBuf; //Pointer to DAC TX buffer + PSAL_DAC_USER_CB pUserCB; //Pointer to DAC User Callback + PSAL_DAC_DMA_USER_DEF pDMAConf; //Pointer to DAC User Define DMA Config +}SAL_DAC_HND, *PSAL_DAC_HND; + +// DAC SAL handle private +typedef struct _SAL_DAC_HND_PRIV_ { + VOID **ppSalDACHnd; //Pointer to SAL_DAC_HND pointer + SAL_DAC_HND SalDACHndPriv; //Private SAL_DAC_HND +}SAL_DAC_HND_PRIV, *PSAL_DAC_HND_PRIV; + +//DAC SAL management adapter +typedef struct _SAL_DAC_MNGT_ADPT_ { + PSAL_DAC_HND_PRIV pSalHndPriv; //Pointer to SAL_DAC_HND + PHAL_DAC_INIT_DAT pHalInitDat; //Pointer to HAL DAC initial data( HAL_I2C_INIT_DAT ) + PHAL_DAC_OP pHalOp; //Pointer to HAL DAC operation( HAL_DAC_OP ) + VOID (*pHalOpInit)(VOID*); //Pointer to HAL DAC initialize function + PIRQ_HANDLE pIrqHnd; //Pointer to IRQ handler in SAL layer( IRQ_HANDLE ) + PSAL_DAC_USER_CB pUserCB; //Pointer to SAL user callbacks (SAL_DAC_USER_CB ) + VOID (*pSalIrqFunc)(VOID*); //Used for SAL DAC interrupt function + + PSAL_DAC_DMA_USER_DEF pDMAConf; //Pointer to DAC User Define DMA config + PHAL_GDMA_ADAPTER pHalGdmaAdp; + PHAL_GDMA_OP pHalGdmaOp; + VOID (*pHalGdmaOpInit)(VOID*); //Pointer to HAL DAC initialize function + PIRQ_HANDLE pIrqGdmaHnd; + VOID (*pSalDMAIrqFunc)(VOID*); //Used for SAL DAC interrupt function +}SAL_DAC_MNGT_ADPT, *PSAL_DAC_MNGT_ADPT; + + +//================ DAC HAL Function Prototype =================== +// DAC HAL inline function +// For checking DAC input index valid or not +static inline RTK_STATUS +RtkDACIdxChk( + IN u8 DACIdx +) +{ +#if !DAC0_USED + if (DACIdx == DAC0_SEL) + return _EXIT_FAILURE; +#endif + +#if !DAC1_USED + if (DACIdx == DAC1_SEL) + return _EXIT_FAILURE; +#endif + + return _EXIT_SUCCESS; +} + +VOID HalDACOpInit(IN VOID *Data); +RTK_STATUS RtkDACLoadDefault(IN VOID *Data); +RTK_STATUS RtkDACInit(IN VOID *Data); +RTK_STATUS RtkDACDeInit(IN VOID *Data); +RTK_STATUS RtkDACSend(IN VOID *Data); +PSAL_DAC_HND RtkDACGetSalHnd(IN u8 DACIdx); +RTK_STATUS RtkDACFreeSalHnd(IN PSAL_DAC_HND pSalDACHND); +PSAL_DAC_MNGT_ADPT RtkDACGetMngtAdpt(IN u8 DACIdx); +RTK_STATUS RtkDACFreeMngtAdpt(IN PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt); + +#endif diff --git a/lib/fwlib/hal_diag.h b/lib/fwlib/hal_diag.h new file mode 100644 index 0000000..77ba818 --- /dev/null +++ b/lib/fwlib/hal_diag.h @@ -0,0 +1,107 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_DIAG_H_ +#define _HAL_DIAG_H_ + + +//Register offset +#define UART_REV_BUF_OFF 0x00 +#define UART_TRAN_HOLD_OFF 0x00 +#define UART_DLH_OFF 0x04 +#define UART_DLL_OFF 0x00 +#define UART_INTERRUPT_EN_REG_OFF 0x04 +#define UART_INTERRUPT_IDEN_REG_OFF 0x08 +#define UART_FIFO_CTL_REG_OFF 0x08 +#define UART_LINE_CTL_REG_OFF 0x0c +#define UART_MODEM_CTL_REG_OFF 0x10 +#define UART_LINE_STATUS_REG_OFF 0x14 +#define UART_MODEM_STATUS_REG_OFF 0x18 +#define UART_FIFO_ACCESS_REG_OFF 0x70 +#define UART_STATUS_REG_OFF 0x7c +#define UART_TFL_OFF 0x80 +#define UART_RFL_OFF 0x84 + + +//Buad rate +#define UART_BAUD_RATE_2400 2400 +#define UART_BAUD_RATE_4800 4800 +#define UART_BAUD_RATE_9600 9600 +#define UART_BAUD_RATE_19200 19200 +#define UART_BAUD_RATE_38400 38400 +#define UART_BAUD_RATE_57600 57600 +#define UART_BAUD_RATE_115200 115200 +#define UART_BAUD_RATE_921600 921600 +#define UART_BAUD_RATE_1152000 1152000 + +#define UART_PARITY_ENABLE 0x08 +#define UART_PARITY_DISABLE 0 + +#define UART_DATA_LEN_5BIT 0x0 +#define UART_DATA_LEN_6BIT 0x1 +#define UART_DATA_LEN_7BIT 0x2 +#define UART_DATA_LEN_8BIT 0x3 + +#define UART_STOP_1BIT 0x0 +#define UART_STOP_2BIT 0x4 + + +#define HAL_UART_READ32(addr) HAL_READ32(LOG_UART_REG_BASE, addr) +#define HAL_UART_WRITE32(addr, value) HAL_WRITE32(LOG_UART_REG_BASE, addr, value) +#define HAL_UART_READ16(addr) HAL_READ16(LOG_UART_REG_BASE, addr) +#define HAL_UART_WRITE16(addr, value) HAL_WRITE16(LOG_UART_REG_BASE, addr, value) +#define HAL_UART_READ8(addr) HAL_READ8(LOG_UART_REG_BASE, addr) +#define HAL_UART_WRITE8(addr, value) HAL_WRITE8(LOG_UART_REG_BASE, addr, value) + +typedef struct _LOG_UART_ADAPTER_ { + u32 BaudRate; + u32 FIFOControl; + u32 IntEnReg; + u8 Parity; + u8 Stop; + u8 DataLength; +}LOG_UART_ADAPTER, *PLOG_UART_ADAPTER; + +typedef struct _COMMAND_TABLE_ { + const u8* cmd; + u16 ArgvCnt; + u32 (*func)(u16 argc, u8* argv[]); + const u8* msg; +}COMMAND_TABLE, *PCOMMAND_TABLE; + +//VOID +//HalLogUartHandle(void); + +/* +extern _LONG_CALL_ROM_ u32 +HalLogUartInit( + IN LOG_UART_ADAPTER UartAdapter + ); +*/ + +extern _LONG_CALL_ROM_ VOID +HalSerialPutcRtl8195a( + IN u8 c + ); + +extern _LONG_CALL_ROM_ u8 +HalSerialGetcRtl8195a( + IN BOOL PullMode + ); + +extern _LONG_CALL_ROM_ u32 +HalSerialGetIsrEnRegRtl8195a(VOID); + +extern _LONG_CALL_ROM_ VOID +HalSerialSetIrqEnRegRtl8195a ( + IN u32 SetValue +); + + +#endif//_HAL_DIAG_H_ diff --git a/lib/fwlib/hal_efuse.h b/lib/fwlib/hal_efuse.h new file mode 100644 index 0000000..aca819d --- /dev/null +++ b/lib/fwlib/hal_efuse.h @@ -0,0 +1,22 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_EFUSE_H_ +#define _HAL_EFUSE_H_ + +_LONG_CALL_ROM_ extern VOID HalEFUSEPowerSwitch8195AROM(IN u8 bWrite, IN u8 PwrState, IN u8 L25OutVoltage); +_LONG_CALL_ extern u32 HALEFUSEOneByteReadROM(IN u32 CtrlSetting, IN u16 Addr, OUT u8 *Data, IN u8 L25OutVoltage); +_LONG_CALL_ extern u32 HALEFUSEOneByteWriteROM(IN u32 CtrlSetting, IN u16 Addr, IN u8 Data, IN u8 L25OutVoltage); + +#define EFUSERead8 HALEFUSEOneByteReadROM +#define EFUSEWrite8 HALEFUSEOneByteWriteROM + +#define L25EOUTVOLTAGE 7 +#endif + diff --git a/lib/fwlib/hal_gdma.h b/lib/fwlib/hal_gdma.h new file mode 100644 index 0000000..d7294e6 --- /dev/null +++ b/lib/fwlib/hal_gdma.h @@ -0,0 +1,141 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_GDMA_H_ +#define _HAL_GDMA_H_ + +#include "rtl8195a_gdma.h" + +typedef struct _GDMA_CH_LLI_ELE_ { + u32 Sarx; + u32 Darx; + u32 Llpx; + u32 CtlxLow; + u32 CtlxUp; + u32 Temp; +}GDMA_CH_LLI_ELE, *PGDMA_CH_LLI_ELE; +#if 1 +#if 0 +typedef struct _GDMA_CH_LLI_ { + PGDMA_CH_LLI_ELE pLliEle; + PGDMA_CH_LLI pNextLli; +}GDMA_CH_LLI, *PGDMA_CH_LLI; + +typedef struct _BLOCK_SIZE_LIST_ { + u32 BlockSize; + PBLOCK_SIZE_LIST pNextBlockSiz; +}BLOCK_SIZE_LIST, *PBLOCK_SIZE_LIST; +#else +struct GDMA_CH_LLI { + PGDMA_CH_LLI_ELE pLliEle; + struct GDMA_CH_LLI *pNextLli; +}; + +struct BLOCK_SIZE_LIST { + u32 BlockSize; + struct BLOCK_SIZE_LIST *pNextBlockSiz; +}; + +#endif + +#endif +typedef struct _HAL_GDMA_ADAPTER_ { + u32 ChSar; + u32 ChDar; + GDMA_CHANNEL_NUM ChEn; + GDMA_CTL_REG GdmaCtl; + GDMA_CFG_REG GdmaCfg; + u32 PacketLen; + u32 BlockLen; + u32 MuliBlockCunt; + u32 MaxMuliBlock; + struct GDMA_CH_LLI *pLlix; + struct BLOCK_SIZE_LIST *pBlockSizeList; + + PGDMA_CH_LLI_ELE pLli; + u32 NextPlli; + u8 TestItem; + u8 ChNum; + u8 GdmaIndex; + u8 IsrCtrl:1; + u8 GdmaOnOff:1; + u8 Llpctrl:1; + u8 Lli0:1; + u8 Rsvd4to7:4; + u8 GdmaIsrType; +}HAL_GDMA_ADAPTER, *PHAL_GDMA_ADAPTER; + +typedef struct _HAL_GDMA_CHNL_ { + u8 GdmaIndx; + u8 GdmaChnl; + u8 IrqNum; + u8 Reserved; +}HAL_GDMA_CHNL, *PHAL_GDMA_CHNL; + +typedef struct _HAL_GDMA_BLOCK_ { + u32 SrcAddr; + u32 DstAddr; + u32 BlockLength; + u32 SrcOffset; + u32 DstOffset; +}HAL_GDMA_BLOCK, *PHAL_GDMA_BLOCK; + +typedef struct _HAL_GDMA_OP_ { + VOID (*HalGdmaOnOff)(VOID *Data); + BOOL (*HalGdamChInit)(VOID *Data); + BOOL (*HalGdmaChSeting)(VOID *Data); + BOOL (*HalGdmaChBlockSeting)(VOID *Data); + VOID (*HalGdmaChDis)(VOID *Data); + VOID (*HalGdmaChEn)(VOID *Data); + VOID (*HalGdmaChIsrEnAndDis) (VOID *Data); + u8 (*HalGdmaChIsrClean)(VOID *Data); + VOID (*HalGdmaChCleanAutoSrc)(VOID *Data); + VOID (*HalGdmaChCleanAutoDst)(VOID *Data); +}HAL_GDMA_OP, *PHAL_GDMA_OP; + +typedef struct _HAL_GDMA_OBJ_ { + HAL_GDMA_ADAPTER HalGdmaAdapter; + IRQ_HANDLE GdmaIrqHandle; + volatile GDMA_CH_LLI_ELE GdmaChLli[16]; + struct GDMA_CH_LLI Lli[16]; + struct BLOCK_SIZE_LIST BlockSizeList[16]; + u8 Busy; // is transfering + u8 BlockNum; +} HAL_GDMA_OBJ, *PHAL_GDMA_OBJ; + +VOID HalGdmaOpInit(IN VOID *Data); +VOID HalGdmaOn(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaOff(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +BOOL HalGdmaChInit(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaChDis(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaChEn(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +BOOL HalGdmaChSeting(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +BOOL HalGdmaChBlockSeting(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaChIsrEn(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaChIsrDis(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +u8 HalGdmaChIsrClean(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaChCleanAutoSrc(PHAL_GDMA_ADAPTER pHalGdmaAdapter); +VOID HalGdmaChCleanAutoDst(PHAL_GDMA_ADAPTER pHalGdmaAdapter); + +extern HAL_Status HalGdmaChnlRegister (u8 GdmaIdx, u8 ChnlNum); +extern VOID HalGdmaChnlUnRegister (u8 GdmaIdx, u8 ChnlNum); +extern PHAL_GDMA_CHNL HalGdmaChnlAlloc (HAL_GDMA_CHNL *pChnlOption); +extern VOID HalGdmaChnlFree (HAL_GDMA_CHNL *pChnl); +extern BOOL HalGdmaMemCpyInit(PHAL_GDMA_OBJ pHalGdmaObj); +extern VOID HalGdmaMemCpyDeInit(PHAL_GDMA_OBJ pHalGdmaObj); +extern VOID* HalGdmaMemCpy(PHAL_GDMA_OBJ pHalGdmaObj, void* pDest, void* pSrc, u32 len); +extern VOID HalGdmaMemAggr(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock); +extern BOOL HalGdmaMemCpyAggrInit(PHAL_GDMA_OBJ pHalGdmaObj); + +extern const HAL_GDMA_OP _HalGdmaOp; +extern const HAL_GDMA_CHNL GDMA_Chnl_Option[]; +extern const HAL_GDMA_CHNL GDMA_Multi_Block_Chnl_Option[]; +extern const u16 HalGdmaChnlEn[6]; + +#endif diff --git a/lib/fwlib/hal_gpio.h b/lib/fwlib/hal_gpio.h new file mode 100644 index 0000000..3046336 --- /dev/null +++ b/lib/fwlib/hal_gpio.h @@ -0,0 +1,236 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_GPIO_H_ +#define _HAL_GPIO_H_ + +#define HAL_GPIO_PIN_INT_MODE 0x80 + +typedef enum { + _PORT_A = 0, + _PORT_B = 1, + _PORT_C = 2, + _PORT_D = 3, + _PORT_E = 4, + _PORT_F = 5, + _PORT_G = 6, + _PORT_H = 7, + _PORT_I = 8, + _PORT_J = 9, + _PORT_K = 10, + + _PORT_MAX +} HAL_GPIO_PORT_NAME; + +typedef enum { + _PA_0 = (_PORT_A<<4|0), + _PA_1 = (_PORT_A<<4|1), + _PA_2 = (_PORT_A<<4|2), + _PA_3 = (_PORT_A<<4|3), + _PA_4 = (_PORT_A<<4|4), + _PA_5 = (_PORT_A<<4|5), + _PA_6 = (_PORT_A<<4|6), + _PA_7 = (_PORT_A<<4|7), + + _PB_0 = (_PORT_B<<4|0), + _PB_1 = (_PORT_B<<4|1), + _PB_2 = (_PORT_B<<4|2), + _PB_3 = (_PORT_B<<4|3), + _PB_4 = (_PORT_B<<4|4), + _PB_5 = (_PORT_B<<4|5), + _PB_6 = (_PORT_B<<4|6), + _PB_7 = (_PORT_B<<4|7), + + _PC_0 = (_PORT_C<<4|0), + _PC_1 = (_PORT_C<<4|1), + _PC_2 = (_PORT_C<<4|2), + _PC_3 = (_PORT_C<<4|3), + _PC_4 = (_PORT_C<<4|4), + _PC_5 = (_PORT_C<<4|5), + _PC_6 = (_PORT_C<<4|6), + _PC_7 = (_PORT_C<<4|7), + _PC_8 = (_PORT_C<<4|8), + _PC_9 = (_PORT_C<<4|9), + + _PD_0 = (_PORT_D<<4|0), + _PD_1 = (_PORT_D<<4|1), + _PD_2 = (_PORT_D<<4|2), + _PD_3 = (_PORT_D<<4|3), + _PD_4 = (_PORT_D<<4|4), + _PD_5 = (_PORT_D<<4|5), + _PD_6 = (_PORT_D<<4|6), + _PD_7 = (_PORT_D<<4|7), + _PD_8 = (_PORT_D<<4|8), + _PD_9 = (_PORT_D<<4|9), + + _PE_0 = (_PORT_E<<4|0), + _PE_1 = (_PORT_E<<4|1), + _PE_2 = (_PORT_E<<4|2), + _PE_3 = (_PORT_E<<4|3), + _PE_4 = (_PORT_E<<4|4), + _PE_5 = (_PORT_E<<4|5), + _PE_6 = (_PORT_E<<4|6), + _PE_7 = (_PORT_E<<4|7), + _PE_8 = (_PORT_E<<4|8), + _PE_9 = (_PORT_E<<4|9), + _PE_A = (_PORT_E<<4|10), + + _PF_0 = (_PORT_F<<4|0), + _PF_1 = (_PORT_F<<4|1), + _PF_2 = (_PORT_F<<4|2), + _PF_3 = (_PORT_F<<4|3), + _PF_4 = (_PORT_F<<4|4), + _PF_5 = (_PORT_F<<4|5), +// _PF_6 = (_PORT_F<<4|6), +// _PF_7 = (_PORT_F<<4|7), + + _PG_0 = (_PORT_G<<4|0), + _PG_1 = (_PORT_G<<4|1), + _PG_2 = (_PORT_G<<4|2), + _PG_3 = (_PORT_G<<4|3), + _PG_4 = (_PORT_G<<4|4), + _PG_5 = (_PORT_G<<4|5), + _PG_6 = (_PORT_G<<4|6), + _PG_7 = (_PORT_G<<4|7), + + _PH_0 = (_PORT_H<<4|0), + _PH_1 = (_PORT_H<<4|1), + _PH_2 = (_PORT_H<<4|2), + _PH_3 = (_PORT_H<<4|3), + _PH_4 = (_PORT_H<<4|4), + _PH_5 = (_PORT_H<<4|5), + _PH_6 = (_PORT_H<<4|6), + _PH_7 = (_PORT_H<<4|7), + + _PI_0 = (_PORT_I<<4|0), + _PI_1 = (_PORT_I<<4|1), + _PI_2 = (_PORT_I<<4|2), + _PI_3 = (_PORT_I<<4|3), + _PI_4 = (_PORT_I<<4|4), + _PI_5 = (_PORT_I<<4|5), + _PI_6 = (_PORT_I<<4|6), + _PI_7 = (_PORT_I<<4|7), + + _PJ_0 = (_PORT_J<<4|0), + _PJ_1 = (_PORT_J<<4|1), + _PJ_2 = (_PORT_J<<4|2), + _PJ_3 = (_PORT_J<<4|3), + _PJ_4 = (_PORT_J<<4|4), + _PJ_5 = (_PORT_J<<4|5), + _PJ_6 = (_PORT_J<<4|6), +// _PJ_7 = (_PORT_J<<4|7), + + _PK_0 = (_PORT_K<<4|0), + _PK_1 = (_PORT_K<<4|1), + _PK_2 = (_PORT_K<<4|2), + _PK_3 = (_PORT_K<<4|3), + _PK_4 = (_PORT_K<<4|4), + _PK_5 = (_PORT_K<<4|5), + _PK_6 = (_PORT_K<<4|6), +// _PK_7 = (_PORT_K<<4|7), + + // Not connected + _PIN_NC = (int)0xFFFFFFFF +} HAL_PIN_NAME; + +typedef enum +{ + GPIO_PIN_LOW = 0, + GPIO_PIN_HIGH = 1, + GPIO_PIN_ERR = 2 // read Pin error +} HAL_GPIO_PIN_STATE; + +typedef enum { + DIN_PULL_NONE = 0, //floating or high impedance ? + DIN_PULL_LOW = 1, + DIN_PULL_HIGH = 2, + + DOUT_PUSH_PULL = 3, + DOUT_OPEN_DRAIN = 4, + + INT_LOW = (5|HAL_GPIO_PIN_INT_MODE), // Interrupt Low level trigger + INT_HIGH = (6|HAL_GPIO_PIN_INT_MODE), // Interrupt High level trigger + INT_FALLING = (7|HAL_GPIO_PIN_INT_MODE), // Interrupt Falling edge trigger + INT_RISING = (8|HAL_GPIO_PIN_INT_MODE) // Interrupt Rising edge trigger +} HAL_GPIO_PIN_MODE; + +enum { + GPIO_PORT_A = 0, + GPIO_PORT_B = 1, + GPIO_PORT_C = 2, + GPIO_PORT_D = 3 +}; + +typedef enum { + hal_PullNone = 0, + hal_PullUp = 1, + hal_PullDown = 2, + hal_OpenDrain = 3, + hal_PullDefault = hal_PullNone +} HAL_PinMode; + +typedef struct _HAL_GPIO_PORT_ { + u32 out_data; // to write the GPIO port + u32 in_data; // to read the GPIO port + u32 dir; // config each pin direction +}HAL_GPIO_PORT, *PHAL_GPIO_PORT; + +#define HAL_GPIO_PIN_NAME(port,pin) (((port)<<5)|(pin)) +#define HAL_GPIO_GET_PORT_BY_NAME(x) ((x>>5) & 0x03) +#define HAL_GPIO_GET_PIN_BY_NAME(x) (x & 0x1f) + +typedef struct _HAL_GPIO_PIN_ { + HAL_GPIO_PIN_MODE pin_mode; + u32 pin_name; // Pin: [7:5]: port number, [4:0]: pin number +}HAL_GPIO_PIN, *PHAL_GPIO_PIN; + +typedef struct _HAL_GPIO_OP_ { +#if defined(__ICCARM__) + void* dummy; +#endif +}HAL_GPIO_OP, *PHAL_GPIO_OP; + +typedef void (*GPIO_IRQ_FUN)(VOID *Data, u32 Id); +typedef void (*GPIO_USER_IRQ_FUN)(u32 Id); + +typedef struct _HAL_GPIO_ADAPTER_ { + IRQ_HANDLE IrqHandle; // GPIO HAL IRQ Handle + GPIO_USER_IRQ_FUN UserIrqHandler; // GPIO IRQ Handler + GPIO_IRQ_FUN PortA_IrqHandler[32]; // The interrupt handler triggered by Port A[x] + VOID *PortA_IrqData[32]; + VOID (*EnterCritical)(void); + VOID (*ExitCritical)(void); + u32 Local_Gpio_Dir[3]; // to record direction setting: 0- IN, 1- Out + u8 Gpio_Func_En; // Is GPIO HW function enabled ? + u8 Locked; +}HAL_GPIO_ADAPTER, *PHAL_GPIO_ADAPTER; + +u32 +HAL_GPIO_GetPinName( + u32 chip_pin +); + +VOID +HAL_GPIO_PullCtrl( + u32 pin, + u32 mode +); + +VOID +HAL_GPIO_Init( + HAL_GPIO_PIN *GPIO_Pin +); + +VOID +HAL_GPIO_Irq_Init( + HAL_GPIO_PIN *GPIO_Pin +); + +#endif // end of "#define _HAL_GPIO_H_" + diff --git a/lib/fwlib/hal_i2c.h b/lib/fwlib/hal_i2c.h new file mode 100644 index 0000000..5fadbe3 --- /dev/null +++ b/lib/fwlib/hal_i2c.h @@ -0,0 +1,585 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_I2C_H_ //#ifndef _HAL_I2C_H_ +#define _HAL_I2C_H_ + +#include "rtl8195a_i2c.h" +#include "hal_gdma.h" + +//================= I2C CONFIGURATION START ================== +// I2C SAL User Configuration Flags + +// I2C SAL operation types +#define I2C_POLL_OP_TYPE 1 +#define I2C_INTR_OP_TYPE 1 +#define I2C_DMA_OP_TYPE 1 + +// I2C supports user register address +#define I2C_USER_REG_ADDR 1 //I2C User specific register address by using + //the first I2C data as the register + //address + +// I2C SAL used module. Please set the I2C module flag to 1 to enable the related +// I2C module functions. +#define I2C0_USED 1 +#define I2C1_USED 1 +#define I2C2_USED 1 +#define I2C3_USED 1 +//================= I2C CONFIGURATION END =================== + + +//================= I2C HAL START ========================== +// I2C debug output +#define I2C_PREFIX "RTL8195A[i2c]: " +#define I2C_PREFIX_LVL " [i2c_DBG]: " + +typedef enum _I2C_DBG_LVL_ { + HAL_I2C_LVL = 0x01, + SAL_I2C_LVL = 0x02, + VERI_I2C_LVL = 0x03, +}I2C_DBG_LVL,*PI2C_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_I2C_HAL +#define DBG_I2C_LOG_PERD 100 + + #define I2CDBGLVL 0xFF + #define DBG_8195A_I2C(...) do{ \ + _DbgDump("\r"I2C_PREFIX __VA_ARGS__);\ + }while(0) + + #define DBG_8195A_I2C_LVL(LVL,...) do{\ + if (LVL&I2CDBGLVL){\ + _DbgDump("\r"I2C_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_I2C_LOG_PERD 100 + #define DBG_8195A_I2C(...) + #define DBG_8195A_I2C_LVL(...) +#endif +#else + #define DBG_I2C_LOG_PERD 100 + #define DBG_8195A_I2C(...) + #define DBG_8195A_I2C_LVL(...) +#endif + +//====================================================== +// I2C HAL related enumeration +// I2C Module Selection +typedef enum _I2C_MODULE_SEL_ { + I2C0_SEL = 0x0, + I2C1_SEL = 0x1, + I2C2_SEL = 0x2, + I2C3_SEL = 0x3, +}I2C_MODULE_SEL,*PI2C_MODULE_SEL; + +// I2C HAL initial data structure +typedef struct _HAL_I2C_INIT_DAT_ { + u8 I2CIdx; //I2C index used + u8 I2CEn; //I2C module enable + u8 I2CMaster; //Master or Slave mode + u8 I2CAddrMod; //I2C addressing mode(7-bit, 10-bit) + + u8 I2CSpdMod; //I2C speed mode(Standard, Fast, High) + u8 I2CSetup; //I2C SDA setup time + u8 I2CRXTL; //I2C RX FIFO Threshold + u8 I2CTXTL; //I2C TX FIFO Threshold + + u8 I2CBusLd; //I2C bus load (pf) for high speed mode + u8 I2CReSTR; //I2C restart support + u8 I2CGC; //I2C general support + u8 I2CStartB; //I2C start byte support + + u8 I2CSlvNoAck; //I2C slave no ack support + u8 I2CDMACtrl; //I2C DMA feature support + u8 I2CCmd; //I2C Command + u8 I2CDataLen; //I2C Data Length + + u8 I2CSlvAckGC; //I2C slave acks to General Call + u8 I2CStop; //I2C issues STOP bit or not + u16 RSVD0; + + u8 *I2CRWData; //I2C Read/Write data pointer + + u16 I2CIntrMSK; //I2C Interrupt Mask + u16 I2CIntrClr; //I2C Interrupt register to clear + + u16 I2CAckAddr; //I2C target address in I2C Master mode, + //ack address in I2C Slave mode + u16 I2CSdaHd; //I2C SDA hold time + + u32 I2CClk; //I2C bus clock (in kHz) + + u8 I2CTxDMARqLv; //I2C TX DMA Empty Level + u8 I2CRxDMARqLv; //I2C RX DMA Full Level + u16 RSVD1; //Reserved +}HAL_I2C_INIT_DAT,*PHAL_I2C_INIT_DAT; + +// I2C HAL Operations +typedef struct _HAL_I2C_OP_ { + HAL_Status (*HalI2CInit) (VOID *Data); //HAL I2C initialization + HAL_Status (*HalI2CDeInit) (VOID *Data); //HAL I2C de-initialization + HAL_Status (*HalI2CSend) (VOID *Data); //HAL I2C send + u8 (*HalI2CReceive) (VOID *Data); //HAL I2C receive + HAL_Status (*HalI2CEnable) (VOID *Data); //HAL I2C enable module + HAL_Status (*HalI2CIntrCtrl) (VOID *Data); //HAL I2C interrupt control + u32 (*HalI2CReadReg) (VOID *Data, u8 I2CReg);//HAL I2C read register + HAL_Status (*HalI2CWriteReg) (VOID *Data, u8 I2CReg, u32 RegVal);//HAL I2C write register + HAL_Status (*HalI2CSetCLK) (VOID *Data); //HAL I2C set bus clock + HAL_Status (*HalI2CMassSend) (VOID *Data); //HAL I2C mass send + HAL_Status (*HalI2CClrIntr) (VOID *Data); //HAL I2C clear interrupts + HAL_Status (*HalI2CClrAllIntr) (VOID *Data); //HAL I2C clear all interrupts + HAL_Status (*HalI2CDMACtrl) (VOID *Data); //HAL I2C DMA control +}HAL_I2C_OP, *PHAL_I2C_OP; +//================= I2C HAL END =========================== + + +//================= I2C SAL START ========================== +//I2C SAL Macros + +//====================================================== +// I2C SAL related enumerations +// I2C Extend Features +typedef enum _I2C_EXD_SUPPORT_{ + I2C_EXD_RESTART = 0x1, //BIT_0, RESTART bit + I2C_EXD_GENCALL = 0x2, //BIT_1, Master generates General Call. All "send" operations generate General Call addresss + I2C_EXD_STARTB = 0x4, //BIT_2, Using START BYTE, instead of START Bit + I2C_EXD_SLVNOACK = 0x8, //BIT_3, Slave no ack to master + I2C_EXD_BUS400PF = 0x10, //BIT_4, I2C bus loading is 400pf + I2C_EXD_SLVACKGC = 0x20, //BIT_5, Slave acks to a General Call + I2C_EXD_USER_REG = 0x40, //BIT_6, Using User Register Address + I2C_EXD_USER_TWOB = 0x80, //BIT_7, User Register Address is 2-byte + I2C_EXD_MTR_ADDR_RTY= 0x100, //BIT_8, Master retries to send start condition and Slave address when the slave doesn't ack + // the address. + I2C_EXD_MTR_ADDR_UPD= 0x200, //BIT_9, Master dynamically updates slave address + I2C_EXD_MTR_HOLD_BUS= 0x400, //BIT_10, Master doesn't generate STOP when the FIFO is empty. This would make Master hold + // the bus. +}I2C_EXD_SUPPORT,*PI2C_EXD_SUPPORT; + +// I2C operation type +typedef enum _I2C_OP_TYPE_ { + I2C_POLL_TYPE = 0x0, + I2C_DMA_TYPE = 0x1, + I2C_INTR_TYPE = 0x2, +}I2C_OP_TYPE, *PI2C_OP_TYPE; + +// I2C pinmux selection +typedef enum _I2C_PINMUX_ { + I2C_PIN_S0 = 0x0, + I2C_PIN_S1 = 0x1, + I2C_PIN_S2 = 0x2, + I2C_PIN_S3 = 0x3, //Only valid for I2C0 and I2C3 +}I2C_PINMUX, *PI2C_PINMUX; + +// I2C module status +typedef enum _I2C_MODULE_STATUS_ { + I2C_DISABLE = 0x0, + I2C_ENABLE = 0x1, +}I2C_MODULE_STATUS, *PI2C_MODULE_STATUS; + +// I2C device status +typedef enum _I2C_Device_STATUS_ { + I2C_STS_UNINITIAL = 0x00, + I2C_STS_INITIALIZED = 0x01, + I2C_STS_IDLE = 0x02, + + I2C_STS_TX_READY = 0x03, + I2C_STS_TX_ING = 0x04, + + I2C_STS_RX_READY = 0x05, + I2C_STS_RX_ING = 0x06, + + I2C_STS_ERROR = 0x10, + I2C_STS_TIMEOUT = 0x11, +}I2C_Device_STATUS, *PI2C_Device_STATUS; + +// I2C feature status +typedef enum _I2C_FEATURE_STATUS_{ + I2C_FEATURE_DISABLED = 0, + I2C_FEATURE_ENABLED = 1, +}I2C_FEATURE_STATUS,*PI2C_FEATURE_STATUS; + +// I2C device mode +typedef enum _I2C_DEV_MODE_ { + I2C_SLAVE_MODE = 0x0, + I2C_MASTER_MODE = 0x1, +}I2C_DEV_MODE, *PI2C_DEV_MODE; + +// I2C Bus Transmit/Receive +typedef enum _I2C_DIRECTION_ { + I2C_ONLY_TX = 0x1, + I2C_ONLY_RX = 0x2, + I2C_TXRX = 0x3, +}I2C_DIRECTION, *PI2C_DIRECTION; + +//I2C DMA module number +typedef enum _I2C_DMA_MODULE_SEL_ { + I2C_DMA_MODULE_0 = 0x0, + I2C_DMA_MODULE_1 = 0x1 +}I2C_DMA_MODULE_SEL, *PI2C_DMA_MODULE_SEL; + +// I2C0 DMA peripheral number +typedef enum _I2C0_DMA_PERI_NUM_ { + I2C0_DMA_TX_NUM = 0x8, + I2C0_DMA_RX_NUM = 0x9, +}I2C0_DMA_PERI_NUM,*PI2C0_DMA_PERI_NUM; + +// I2C1 DMA peripheral number +typedef enum _I2C1_DMA_PERI_NUM_ { + I2C1_DMA_TX_NUM = 0xA, + I2C1_DMA_RX_NUM = 0xB, +}I2C1_DMA_PERI_NUM,*PI2C1_DMA_PERI_NUM; + +// I2C0 DMA module used +typedef enum _I2C0_DMA_MODULE_ { + I2C0_DMA0 = 0x0, + I2C0_DMA1 = 0x1, +}I2C0_DMA_MODULE,*PI2C0_DMA_MODULE; + +// I2C0 DMA module used +typedef enum _I2C1_DMA_MODULE_ { + I2C1_DMA0 = 0x0, + I2C1_DMA1 = 0x1, +}I2C1_DMA_MODULE,*PI2C1_DMA_MODULE; + +// I2C command type +typedef enum _I2C_COMMAND_TYPE_ { + I2C_WRITE_CMD = 0x0, + I2C_READ_CMD = 0x1, +}I2C_COMMAND_TYPE,*PI2C_COMMAND_TYPE; + +// I2C STOP BIT +typedef enum _I2C_STOP_TYPE_ { + I2C_STOP_DIS = 0x0, + I2C_STOP_EN = 0x1, +}I2C_STOP_TYPE, *PI2C_STOP_TYPE; + +// I2C error type +typedef enum _I2C_ERR_TYPE_ { + I2C_ERR_RX_UNDER = 0x01, //I2C RX FIFO Underflow + I2C_ERR_RX_OVER = 0x02, //I2C RX FIFO Overflow + I2C_ERR_TX_OVER = 0x04, //I2C TX FIFO Overflow + I2C_ERR_TX_ABRT = 0x08, //I2C TX terminated + I2C_ERR_SLV_TX_NACK = 0x10, //I2C slave transmission terminated by master NACK, + //but there are data in slave TX FIFO + I2C_ERR_USER_REG_TO = 0x20, + + I2C_ERR_RX_CMD_TO = 0x21, + I2C_ERR_RX_FF_TO = 0x22, + I2C_ERR_TX_CMD_TO = 0x23, + I2C_ERR_TX_FF_TO = 0x24, + + I2C_ERR_TX_ADD_TO = 0x25, + I2C_ERR_RX_ADD_TO = 0x26, +}I2C_ERR_TYPE, *PI2C_ERR_TYPE; + +// I2C Time Out type +typedef enum _I2C_TIMEOUT_TYPE_ { + I2C_TIMEOOUT_DISABLE = 0x00, + I2C_TIMEOOUT_ENDLESS = 0xFFFFFFFF, +}I2C_TIMEOUT_TYPE, *PI2C_TIMEOUT_TYPE; + +//====================================================== +// SAL I2C related data structures +// I2C user callback adapter +typedef struct _SAL_I2C_USERCB_ADPT_ { + VOID (*USERCB) (VOID *Data); + u32 USERData; +}SAL_I2C_USERCB_ADPT, *PSAL_I2C_USERCB_ADPT; + +// I2C user callback structure +typedef struct _SAL_I2C_USER_CB_ { + PSAL_I2C_USERCB_ADPT pTXCB; //I2C Transmit Callback + PSAL_I2C_USERCB_ADPT pTXCCB; //I2C Transmit Complete Callback + PSAL_I2C_USERCB_ADPT pRXCB; //I2C Receive Callback + PSAL_I2C_USERCB_ADPT pRXCCB; //I2C Receive Complete Callback + PSAL_I2C_USERCB_ADPT pRDREQCB; //I2C Read Request Callback + PSAL_I2C_USERCB_ADPT pERRCB; //I2C Error Callback + PSAL_I2C_USERCB_ADPT pDMATXCB; //I2C DMA Transmit Callback + PSAL_I2C_USERCB_ADPT pDMATXCCB; //I2C DMA Transmit Complete Callback + PSAL_I2C_USERCB_ADPT pDMARXCB; //I2C DMA Receive Callback + PSAL_I2C_USERCB_ADPT pDMARXCCB; //I2C DMA Receive Complete Callback + PSAL_I2C_USERCB_ADPT pGENCALLCB; //I2C General Call Callback +}SAL_I2C_USER_CB, *PSAL_I2C_USER_CB; + +// I2C Transmit Buffer +typedef struct _SAL_I2C_TRANSFER_BUF_ { + u16 DataLen; //I2C Transmfer Length + u16 TargetAddr; //I2C Target Address. It's only valid in Master Mode. + u32 RegAddr; //I2C Register Address. It's only valid in Master Mode. + u32 RSVD; // + u8 *pDataBuf; //I2C Transfer Buffer Pointer +}SAL_I2C_TRANSFER_BUF,*PSAL_I2C_TRANSFER_BUF; + +typedef struct _SAL_I2C_DMA_USER_DEF_ { + u8 TxDatSrcWdth; + u8 TxDatDstWdth; + u8 TxDatSrcBstSz; + u8 TxDatDstBstSz; + u8 TxChNo; + u8 RSVD0; + u16 RSVD1; + u8 RxDatSrcWdth; + u8 RxDatDstWdth; + u8 RxDatSrcBstSz; + u8 RxDatDstBstSz; + u8 RxChNo; + u8 RSVD2; + u16 RSVD3; +}SAL_I2C_DMA_USER_DEF, *PSAL_I2C_DMA_USER_DEF; + +// RTK I2C OP +typedef struct _RTK_I2C_OP_ { + HAL_Status (*Init) (VOID *Data); + HAL_Status (*DeInit) (VOID *Data); + HAL_Status (*Send) (VOID *Data); + HAL_Status (*Receive) (VOID *Data); + HAL_Status (*IoCtrl) (VOID *Data); + HAL_Status (*PowerCtrl) (VOID *Data); +}RTK_I2C_OP, *PRTK_I2C_OP; + +// Software API Level I2C Handler +typedef struct _SAL_I2C_HND_ { + u8 DevNum; //I2C device number + u8 PinMux; //I2C pin mux seletion + u8 OpType; //I2C operation type selection + volatile u8 DevSts; //I2C device status + + u8 I2CMaster; //I2C Master or Slave mode + u8 I2CAddrMod; //I2C 7-bit or 10-bit mode + u8 I2CSpdMod; //I2C SS/ FS/ HS speed mode + u8 I2CAckAddr; //I2C target address in Master + //mode or ack address in Slave + //mode + + u16 I2CClk; //I2C bus clock + u8 MasterRead; //I2C Master Read Supported, + //An Address will be sent before + //read data back. + + u8 I2CDmaSel; //I2C DMA module select + // 0 for DMA0, + // 1 for DMA1 + u8 I2CTxDMARqLv; //I2C TX DMA Empty Level + u8 I2CRxDMARqLv; //I2C RX DMA Full Level + u16 RSVD0; //Reserved + + u32 AddRtyTimeOut; //I2C TimeOut Value for master send address retry + //(Originally Reserved.) + + u32 I2CExd; //I2C extended options: + //bit 0: I2C RESTART supported, + // 0 for NOT supported, + // 1 for supported + //bit 1: I2C General Call supported + // 0 for NOT supported, + // 1 for supported + //bit 2: I2C START Byte supported + // 0 for NOT supported, + // 1 for supported + //bit 3: I2C Slave-No-Ack + // supported + // 0 for NOT supported, + // 1 for supported + //bit 4: I2C bus loading, + // 0 for 100pf, + // 1 for 400pf + //bit 5: I2C slave ack to General + // Call + //bit 6: I2C User register address + //bit 7: I2C 2-Byte User register + // address + //bit 8: I2C slave address no ack retry, + // It's only for Master mode, + // when slave doesn't ack the + // address + //bit 31~bit 8: Reserved + u32 ErrType; // + u32 TimeOut; //I2C IO Timeout count, in ms + + PHAL_I2C_INIT_DAT pInitDat; //Pointer to I2C initial data struct + PSAL_I2C_TRANSFER_BUF pTXBuf; //Pointer to I2C TX buffer + PSAL_I2C_TRANSFER_BUF pRXBuf; //Pointer to I2C RX buffer + PSAL_I2C_USER_CB pUserCB; //Pointer to I2C User Callback + PSAL_I2C_DMA_USER_DEF pDMAConf; //Pointer to I2C User Define DMA config +}SAL_I2C_HND, *PSAL_I2C_HND; + + + +//====================================================== +// I2C SAL Function Prototypes + +// For checking I2C input index valid or not +static inline HAL_Status +RtkI2CIdxChk( + IN u8 I2CIdx +) +{ + if (I2CIdx > I2C3_SEL) + return HAL_ERR_UNKNOWN; + + return HAL_OK; +} +#if 0 +//For checking I2C operation type valid or not +static inline HAL_Status +RtkI2COpTypeChk( + IN VOID *Data +) +{ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + + if (pSalI2CHND->OpType == I2C_POLL_TYPE) + return HAL_ERR_UNKNOWN; + + if (pSalI2CHND->OpType == I2C_DMA_TYPE) + return HAL_ERR_UNKNOWN; + + if (pSalI2CHND->OpType == I2C_INTR_TYPE) + return HAL_ERR_UNKNOWN; + + pSalI2CHND = pSalI2CHND; + + return HAL_OK; +} +#endif +//For checking I2C DMA available or not +static inline HAL_Status +RtkI2CDMAChk( + IN VOID *Data +) +{ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + + if (pSalI2CHND->OpType == I2C_DMA_TYPE) { + if (pSalI2CHND->DevNum >= I2C2_SEL) + return HAL_ERR_UNKNOWN; + } + else { + return HAL_ERR_UNKNOWN; + } + + return HAL_OK; +} + +//For checking I2C DMA available or not +static inline HAL_Status +RtkI2CDMAInitChk( + IN VOID *Data +) +{ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + + if (pSalI2CHND->OpType != I2C_DMA_TYPE) { + return HAL_ERR_UNKNOWN; + } + else { + return HAL_OK; + } + +} + +//====================================================== +//SAL I2C management function prototype +_LONG_CALL_ROM_ HAL_Status RtkI2CLoadDefault(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status RtkI2CInit(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status RtkI2CDeInit(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status RtkI2CSend(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status RtkI2CReceive(IN VOID *Data); +_LONG_CALL_ROM_ VOID RtkSalI2COpInit(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status RtkI2CSendUserAddr(IN VOID *Data,IN u8 MtrWr); +_LONG_CALL_ROM_ HAL_Status RtkI2CIoCtrl(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status RtkI2CPowerCtrl(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CInitForPS(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CDeInitForPS(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CDisablePS(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CEnablePS(IN VOID *Data); +//================= I2C SAL END =========================== + + +//================= I2C SAL MANAGEMENT START ================= +// I2C SAL management macros +#define SAL_USER_CB_NUM (sizeof(SAL_I2C_USER_CB) / sizeof(PSAL_I2C_USERCB_ADPT)) + +//====================================================== +// I2C SAL management data structures +// I2C SAL handle private +typedef struct _SAL_I2C_HND_PRIV_ { + VOID **ppSalI2CHnd; //Pointer to SAL_I2C_HND pointer + SAL_I2C_HND SalI2CHndPriv; //Private SAL_I2C_HND +}SAL_I2C_HND_PRIV, *PSAL_I2C_HND_PRIV; + +//I2C SAL management adapter +typedef struct _SAL_I2C_MNGT_ADPT_ { + PSAL_I2C_HND_PRIV pSalHndPriv; //Pointer to SAL_I2C_HND + PHAL_I2C_INIT_DAT pHalInitDat; //Pointer to HAL I2C initial data( HAL_I2C_INIT_DAT ) + PHAL_I2C_OP pHalOp; //Pointer to HAL I2C operation( HAL_I2C_OP ) + VOID (*pHalOpInit)(VOID*); //Pointer to HAL I2C initialize function + PIRQ_HANDLE pIrqHnd; //Pointer to IRQ handler in SAL layer( IRQ_HANDLE ) + PSAL_I2C_USER_CB pUserCB; //Pointer to SAL user callbacks (SAL_I2C_USER_CB ) + volatile u32 MstRDCmdCnt; //Used for Master Read command count + volatile u32 InnerTimeOut; //Used for SAL internal timeout count + VOID (*pSalIrqFunc)(VOID*); //Used for SAL I2C interrupt function + + PSAL_I2C_DMA_USER_DEF pDMAConf; //Pointer to I2C User Define DMA config + PHAL_GDMA_ADAPTER pHalTxGdmaAdp; //Pointer to HAL_GDMA_ADAPTER + PHAL_GDMA_ADAPTER pHalRxGdmaAdp; //Pointer to HAL_GDMA_ADAPTER + PHAL_GDMA_OP pHalGdmaOp; //Pointer to HAL_GDMA_OP + VOID (*pHalGdmaOpInit)(VOID*); //Pointer to HAL I2C initialize function + PIRQ_HANDLE pIrqTxGdmaHnd; //Pointer to IRQ handler for Tx GDMA + PIRQ_HANDLE pIrqRxGdmaHnd; //Pointer to IRQ handler for Rx GDMA + VOID (*pSalDMATxIrqFunc)(VOID*); //Used for SAL I2C interrupt function + VOID (*pSalDMARxIrqFunc)(VOID*); //Used for SAL I2C interrupt function + u32 RSVD; //Reserved +}SAL_I2C_MNGT_ADPT, *PSAL_I2C_MNGT_ADPT; + +//====================================================== +//SAL I2C management function prototype +PSAL_I2C_MNGT_ADPT RtkI2CGetMngtAdpt(IN u8 I2CIdx); +HAL_Status RtkI2CFreeMngtAdpt(IN PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt); +PSAL_I2C_HND RtkI2CGetSalHnd(IN u8 I2CIdx); +HAL_Status RtkI2CFreeSalHnd(IN PSAL_I2C_HND pSalI2CHND); +u32 RtkSalI2CSts(IN VOID *Data); + +extern _LONG_CALL_ VOID I2CISRHandle(IN VOID *Data); +extern _LONG_CALL_ VOID I2CTXGDMAISRHandle(IN VOID *Data); +extern _LONG_CALL_ VOID I2CRXGDMAISRHandle(IN VOID *Data); +extern HAL_Status I2CIsTimeout (IN u32 StartCount, IN u32 TimeoutCnt); +extern HAL_TIMER_OP HalTimerOp; +//====================================================== +// Function Prototypes +_LONG_CALL_ VOID HalI2COpInit(IN VOID *Data); +//================= I2C SAL MANAGEMENT END ================== + +//================= Rtl8195a I2C V02 function prototype ============ +_LONG_CALL_ VOID HalI2COpInitV02(IN VOID *Data); +_LONG_CALL_ VOID I2CISRHandleV02(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CSendV02(IN VOID *Data); +_LONG_CALL_ HAL_Status RtkI2CReceiveV02(IN VOID *Data); +_LONG_CALL_ VOID RtkSalI2COpInitV02(IN VOID *Data); +//================= Rtl8195a I2C V02 function prototype END========== + +//====================================================== +//SAL I2C patch function prototype +HAL_Status RtkI2CSend_Patch(IN VOID *Data); +HAL_Status RtkI2CReceive_Patch(IN VOID *Data); +VOID HalI2COpInit_Patch(IN VOID *Data); +VOID I2CISRHandle_Patch(IN VOID *Data); + +#ifndef CONFIG_RELEASE_BUILD_LIBRARIES +#define RtkI2CSend RtkI2CSend_Patch +#define RtkI2CReceive RtkI2CReceive_Patch +#endif +HAL_Status RtkI2CSend_Patch(IN VOID *Data); +HAL_Status RtkI2CReceive_Patch(IN VOID *Data); +//================= I2C SAL END =========================== + +#endif //#ifndef _HAL_I2C_H_ diff --git a/lib/fwlib/hal_i2s.h b/lib/fwlib/hal_i2s.h new file mode 100644 index 0000000..92eef0e --- /dev/null +++ b/lib/fwlib/hal_i2s.h @@ -0,0 +1,347 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_I2S_H_ +#define _HAL_I2S_H_ + +#include "rtl8195a_i2s.h" + +/* User Define Flags */ + +#define I2S_MAX_ID 1 // valid I2S index 0 ~ I2S_MAX_ID + +/**********************************************************************/ +/* I2S HAL initial data structure */ +typedef struct _HAL_I2S_INIT_DAT_ { + u8 I2SIdx; /*I2S index used*/ + u8 I2SEn; /*I2S module enable tx/rx/tx+rx*/ + u8 I2SMaster; /*I2S Master or Slave mode*/ + u8 I2SWordLen; /*I2S Word length 16 or 24bits*/ + + u8 I2SChNum; /*I2S Channel number mono or stereo*/ + u8 I2SPageNum; /*I2S Page Number 2~4*/ + u16 I2SPageSize; /*I2S page Size 1~4096 word*/ + + u8 *I2STxData; /*I2S Tx data pointer*/ + + u8 *I2SRxData; /*I2S Rx data pointer*/ + + u32 I2STxIntrMSK; /*I2S Tx Interrupt Mask*/ + u32 I2STxIntrClr; /*I2S Tx Interrupt register to clear */ + + u32 I2SRxIntrMSK; /*I2S Rx Interrupt Mask*/ + u32 I2SRxIntrClr; /*I2S Rx Interrupt register to clear*/ + + u16 I2STxIdx; /*I2S TX page index */ + u16 I2SRxIdx; /*I2S RX page index */ + + u16 I2SHWTxIdx; /*I2S HW TX page index */ + u16 I2SHWRxIdx; /*I2S HW RX page index */ + + + u16 I2SRate; /*I2S sample rate*/ + u8 I2STRxAct; /*I2S tx rx act*/ +}HAL_I2S_INIT_DAT, *PHAL_I2S_INIT_DAT; + +/**********************************************************************/ +/* I2S Data Structures */ +/* I2S Module Selection */ +typedef enum _I2S_MODULE_SEL_ { + I2S0_SEL = 0x0, + I2S1_SEL = 0x1, +}I2S_MODULE_SEL,*PI2S_MODULE_SEL; +/* +typedef struct _HAL_I2S_ADAPTER_ { + u32 Enable:1; + I2S_CTL_REG I2sCtl; + I2S_SETTING_REG I2sSetting; + u32 abc; + u8 I2sIndex; +}HAL_I2S_ADAPTER, *PHAL_I2S_ADAPTER; +*/ +/* I2S HAL Operations */ +typedef struct _HAL_I2S_OP_ { + RTK_STATUS (*HalI2SInit) (VOID *Data); + RTK_STATUS (*HalI2SDeInit) (VOID *Data); + RTK_STATUS (*HalI2STx) (VOID *Data, u8 *pBuff); + RTK_STATUS (*HalI2SRx) (VOID *Data, u8 *pBuff); + RTK_STATUS (*HalI2SEnable) (VOID *Data); + RTK_STATUS (*HalI2SIntrCtrl) (VOID *Data); + u32 (*HalI2SReadReg) (VOID *Data, u8 I2SReg); + RTK_STATUS (*HalI2SSetRate) (VOID *Data); + RTK_STATUS (*HalI2SSetWordLen) (VOID *Data); + RTK_STATUS (*HalI2SSetChNum) (VOID *Data); + RTK_STATUS (*HalI2SSetPageNum) (VOID *Data); + RTK_STATUS (*HalI2SSetPageSize) (VOID *Data); + + RTK_STATUS (*HalI2SClrIntr) (VOID *Data); + RTK_STATUS (*HalI2SClrAllIntr) (VOID *Data); + RTK_STATUS (*HalI2SDMACtrl) (VOID *Data); +/* + VOID (*HalI2sOnOff)(VOID *Data); + BOOL (*HalI2sInit)(VOID *Data); + BOOL (*HalI2sSetting)(VOID *Data); + BOOL (*HalI2sEn)(VOID *Data); + BOOL (*HalI2sIsrEnAndDis) (VOID *Data); + BOOL (*HalI2sDumpReg)(VOID *Data); + BOOL (*HalI2s)(VOID *Data); +*/ +}HAL_I2S_OP, *PHAL_I2S_OP; + + +/**********************************************************************/ + +/* I2S Pinmux Selection */ +#if 0 +typedef enum _I2S0_PINMUX_ { + I2S0_TO_S0 = 0x0, + I2S0_TO_S1 = 0x1, + I2S0_TO_S2 = 0x2, +}I2S0_PINMUX, *PI2S0_PINMUX; + +typedef enum _I2S1_PINMUX_ { + I2S1_TO_S0 = 0x0, + I2S1_TO_S1 = 0x1, +}I2S1_PINMUX, *PI2S1_PINMUX; +#endif + +typedef enum _I2S_PINMUX_ { + I2S_S0 = 0, + I2S_S1 = 1, + I2S_S2 = 2, + I2S_S3 = 3 +}I2S_PINMUX, *PI2S_PINMUX; + + +/* I2S Module Status */ +typedef enum _I2S_MODULE_STATUS_ { + I2S_DISABLE = 0x0, + I2S_ENABLE = 0x1, +}I2S_MODULE_STATUS, *PI2S_MODULE_STATUS; + + +/* I2S Device Status */ +typedef enum _I2S_Device_STATUS_ { + I2S_STS_UNINITIAL = 0x00, + I2S_STS_INITIALIZED = 0x01, + I2S_STS_IDLE = 0x02, + + I2S_STS_TX_READY = 0x03, + I2S_STS_TX_ING = 0x04, + + I2S_STS_RX_READY = 0x05, + I2S_STS_RX_ING = 0x06, + + I2S_STS_TRX_READY = 0x07, + I2S_STS_TRX_ING = 0x08, + + I2S_STS_ERROR = 0x09, +}I2S_Device_STATUS, *PI2S_Device_STATUS; + + +/* I2S Feature Status */ +typedef enum _I2S_FEATURE_STATUS_{ + I2S_FEATURE_DISABLED = 0, + I2S_FEATURE_ENABLED = 1, +}I2S_FEATURE_STATUS,*PI2S_FEATURE_STATUS; + +/* I2S Device Mode */ +typedef enum _I2S_DEV_MODE_ { + I2S_MASTER_MODE = 0x0, + I2S_SLAVE_MODE = 0x1 +}I2S_DEV_MODE, *PI2S_DEV_MODE; + +/* I2S Word Length */ +typedef enum _I2S_WORD_LEN_ { + I2S_WL_16 = 0x0, + I2S_WL_24 = 0x1, +}I2S_WORD_LEN, *PI2S_WORD_LEN; + +/* I2S Bus Transmit/Receive */ +typedef enum _I2S_DIRECTION_ { + I2S_ONLY_RX = 0x0, + I2S_ONLY_TX = 0x1, + I2S_TXRX = 0x2 +}I2S_DIRECTION, *PI2S_DIRECTION; + +/* I2S Channel number */ +typedef enum _I2S_CH_NUM_ { + I2S_CH_STEREO = 0x0, + I2S_CH_RSVD = 0x1, + I2S_CH_MONO = 0x2 +}I2S_CH_NUM, *PI2S_CH_NUM; + +/* I2S Page number */ +typedef enum _I2S_PAGE_NUM_ { + I2S_1PAGE = 0x0, + I2S_2PAGE = 0x1, + I2S_3PAGE = 0x2, + I2S_4PAGE = 0x3 +}I2S_PAGE_NUM, *PI2S_PAGE_NUM; + +/* I2S Sample rate*/ +typedef enum _I2S_SAMPLE_RATE_ { + I2S_SR_8KHZ = 0x00, // /12 + I2S_SR_16KHZ = 0x01, // /6 + I2S_SR_24KHZ = 0x02, // /4 + I2S_SR_32KHZ = 0x03, // /3 + I2S_SR_48KHZ = 0x05, // /2 + I2S_SR_96KHZ = 0x06, // x1, base 96kHz + I2S_SR_7p35KHZ = 0x10, + I2S_SR_11p02KHZ = 0x11, + I2S_SR_22p05KHZ = 0x12, + I2S_SR_29p4KHZ = 0x13, + I2S_SR_44p1KHZ = 0x15, + I2S_SR_88p2KHZ = 0x16 // x1, base 88200Hz +}I2S_SAMPLE_RATE, *PI2S_SAMPLE_RATE; + +/* I2S TX interrupt mask/status */ +typedef enum _I2S_TX_IMR_ { + I2S_TX_INT_PAGE0_OK = (1<<0), + I2S_TX_INT_PAGE1_OK = (1<<1), + I2S_TX_INT_PAGE2_OK = (1<<2), + I2S_TX_INT_PAGE3_OK = (1<<3), + I2S_TX_INT_FULL = (1<<4), + I2S_TX_INT_EMPTY = (1<<5) +} I2S_TX_IMR, *PI2S_TX_IMR; + +/* I2S RX interrupt mask/status */ +typedef enum _I2S_RX_IMR_ { + I2S_RX_INT_PAGE0_OK = (1<<0), + I2S_RX_INT_PAGE1_OK = (1<<1), + I2S_RX_INT_PAGE2_OK = (1<<2), + I2S_RX_INT_PAGE3_OK = (1<<3), + I2S_RX_INT_EMPTY = (1<<4), + I2S_RX_INT_FULL = (1<<5) +} I2S_RX_IMR, *PI2S_RX_IMR; + +/* I2S User Callbacks */ +typedef struct _SAL_I2S_USER_CB_{ + VOID (*TXCB) (VOID *Data); + VOID (*TXCCB) (VOID *Data); + VOID (*RXCB) (VOID *Data); + VOID (*RXCCB) (VOID *Data); + VOID (*RDREQCB) (VOID *Data); + VOID (*ERRCB) (VOID *Data); + VOID (*GENCALLCB) (VOID *Data); +}SAL_I2S_USER_CB,*PSAL_I2S_USER_CB; + +typedef struct _I2S_USER_CB_{ + VOID (*TxCCB)(uint32_t id, char *pbuf); + u32 TxCBId; + VOID (*RxCCB)(uint32_t id, char *pbuf); + u32 RxCBId; +}I2S_USER_CB,*PI2S_USER_CB; + +/* Software API Level I2S Handler */ +typedef struct _HAL_I2S_ADAPTER_{ + u8 DevNum; //I2S device number + u8 PinMux; //I2S pin mux seletion + u8 RSVD0; //Reserved + volatile u8 DevSts; //I2S device status + + u32 RSVD2; //Reserved + u32 I2SExd; //I2S extended options: + //bit 0: I2C RESTART supported, + // 0 for NOT supported, + // 1 for supported + //bit 1: I2C General Call supported + // 0 for NOT supported, + // 1 for supported + //bit 2: I2C START Byte supported + // 0 for NOT supported, + // 1 for supported + //bit 3: I2C Slave-No-Ack + // supported + // 0 for NOT supported, + // 1 for supported + //bit 4: I2C bus loading, + // 0 for 100pf, + // 1 for 400pf + //bit 5: I2C slave ack to General + // Call + //bit 6: I2C User register address + //bit 7: I2C 2-Byte User register + // address + //bit 31~bit 8: Reserved + u32 ErrType; // + u32 TimeOut; //I2S IO Timeout count + + PHAL_I2S_INIT_DAT pInitDat; //Pointer to I2S initial data struct + I2S_USER_CB UserCB; //Pointer to I2S User Callback + IRQ_HANDLE IrqHandle; // Irq Handler + + u32* TxPageList[4]; // The Tx DAM buffer: pointer of each page + u32* RxPageList[4]; // The Tx DAM buffer: pointer of each page +}HAL_I2S_ADAPTER, *PHAL_I2S_ADAPTER; + +typedef struct _HAL_I2S_DEF_SETTING_{ + u8 I2SMaster; // Master or Slave mode + u8 DevSts; //I2S device status + u8 I2SChNum; //I2S Channel number mono or stereo + u8 I2SPageNum; //I2S Page number 2~4 + u8 I2STRxAct; //I2S tx rx act, tx only or rx only or tx+rx + u8 I2SWordLen; //I2S Word length 16bit or 24bit + u16 I2SPageSize; //I2S Page size 1~4096 word + + u16 I2SRate; //I2S sample rate 8k ~ 96khz + + u32 I2STxIntrMSK; /*I2S Tx Interrupt Mask*/ + u32 I2SRxIntrMSK; /*I2S Rx Interrupt Mask*/ +}HAL_I2S_DEF_SETTING, *PHAL_I2S_DEF_SETTING; + + + +/**********************************************************************/ +HAL_Status +RtkI2SLoadDefault(IN VOID *Adapter, IN VOID *Setting); + +HAL_Status +RtkI2SInit(IN VOID *Data); + +HAL_Status +RtkI2SDeInit(IN VOID *Data); + +HAL_Status +RtkI2SEnable(IN VOID *Data); + +HAL_Status +RtkI2SDisable(IN VOID *Data); + +extern HAL_Status +HalI2SInit( IN VOID *Data); + +extern VOID +HalI2SDeInit( IN VOID *Data); + +extern HAL_Status +HalI2SDisable( IN VOID *Data); + +extern HAL_Status +HalI2SEnable( IN VOID *Data); + + + + +/**********************************************************************/ + + +VOID I2S0ISRHandle(VOID *Data); +VOID I2S1ISRHandle(VOID *Data); + + +/**********************************************************************/ + +VOID HalI2SOpInit( + IN VOID *Data +); + + +#endif + diff --git a/lib/fwlib/hal_irqn.h b/lib/fwlib/hal_irqn.h new file mode 100644 index 0000000..0741358 --- /dev/null +++ b/lib/fwlib/hal_irqn.h @@ -0,0 +1,112 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_IRQN_H_ +#define _HAL_IRQN_H_ + +#define PERIPHERAL_IRQ_BASE_NUM 64 + +typedef enum _IRQn_Type_ { +#if 0 +/****** Cortex-M3 Processor Exceptions Numbers ********/ + NON_MASKABLE_INT_IRQ = -14, + HARD_FAULT_IRQ = -13, + MEM_MANAGE_FAULT_IRQ = -12, + BUS_FAULT_IRQ = -11, + USAGE_FAULT_IRQ = -10, + SVCALL_IRQ = -5, + DEBUG_MONITOR_IRQ = -4, + PENDSVC_IRQ = -2, + SYSTICK_IRQ = -1, +#else +/****** Cortex-M3 Processor Exceptions Numbers ********/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault, all classes of Fault */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ +#endif +/****** RTL8195A Specific Interrupt Numbers ************/ + SYSTEM_ON_IRQ = 0, + WDG_IRQ = 1, + TIMER0_IRQ = 2, + TIMER1_IRQ = 3, + I2C3_IRQ = 4, + TIMER2_7_IRQ = 5, + SPI0_IRQ = 6, + GPIO_IRQ = 7, + UART0_IRQ = 8, + SPI_FLASH_IRQ = 9, + USB_OTG_IRQ = 10, + SDIO_HOST_IRQ = 11, + SDIO_DEVICE_IRQ = 12, + I2S0_PCM0_IRQ = 13, + I2S1_PCM1_IRQ = 14, + WL_DMA_IRQ = 15, + WL_PROTOCOL_IRQ = 16, + CRYPTO_IRQ = 17, + GMAC_IRQ = 18, + PERIPHERAL_IRQ = 19, + GDMA0_CHANNEL0_IRQ = 20, + GDMA0_CHANNEL1_IRQ = 21, + GDMA0_CHANNEL2_IRQ = 22, + GDMA0_CHANNEL3_IRQ = 23, + GDMA0_CHANNEL4_IRQ = 24, + GDMA0_CHANNEL5_IRQ = 25, + GDMA1_CHANNEL0_IRQ = 26, + GDMA1_CHANNEL1_IRQ = 27, + GDMA1_CHANNEL2_IRQ = 28, + GDMA1_CHANNEL3_IRQ = 29, + GDMA1_CHANNEL4_IRQ = 30, + GDMA1_CHANNEL5_IRQ = 31, + +/****** RTL8195A Peripheral Interrupt Numbers ************/ + I2C0_IRQ = 64,// 0 + 64, + I2C1_IRQ = 65,// 1 + 64, + I2C2_IRQ = 66,// 2 + 64, + SPI1_IRQ = 72,// 8 + 64, + SPI2_IRQ = 73,// 9 + 64, + UART1_IRQ = 80,// 16 + 64, + UART2_IRQ = 81,// 17 + 64, + UART_LOG_IRQ = 88,// 24 + 64, + ADC_IRQ = 89,// 25 + 64, + DAC0_IRQ = 91,// 27 + 64, + DAC1_IRQ = 92,// 28 + 64, + //RXI300_IRQ = 93// 29 + 64 + LP_EXTENSION_IRQ = 93,// 29+64 + + PTA_TRX_IRQ = 95,// 31+64 + RXI300_IRQ = 96,// 0+32 + 64 + NFC_IRQ = 97// 1+32+64 +} IRQn_Type, *PIRQn_Type; + + +typedef VOID (*HAL_VECTOR_FUN) (VOID); + +typedef enum _VECTOR_TABLE_TYPE_{ + DEDECATED_VECTRO_TABLE, + PERIPHERAL_VECTOR_TABLE +}VECTOR_TABLE_TYPE, *PVECTOR_TABLE_TYPE; + + +typedef u32 (*IRQ_FUN)(VOID *Data); + +typedef struct _IRQ_HANDLE_ { + IRQ_FUN IrqFun; + IRQn_Type IrqNum; + u32 Data; + u32 Priority; +}IRQ_HANDLE, *PIRQ_HANDLE; + + +#endif //_HAL_IRQN_H_ diff --git a/lib/fwlib/hal_mii.h b/lib/fwlib/hal_mii.h new file mode 100644 index 0000000..ede51e0 --- /dev/null +++ b/lib/fwlib/hal_mii.h @@ -0,0 +1,118 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_MII_H_ +#define _HAL_MII_H_ + +#include "rtl8195a_mii.h" + + +/** + * LOG Configurations + */ + +#define NOLOG + +#define LOG_TAG "NoTag" +#define LOG_INFO_HEADER "I" +#define LOG_DEBUG_HEADER "D" +#define LOG_ERROR_HEADER "E" +#define LOG_TEST_HEADER "T" + +#define IDENT_TWO_SPACE " " +#define IDENT_FOUR_SPACE " " + +#define LOG_INFO(...) do {\ + DiagPrintf("\r"LOG_INFO_HEADER"/"LOG_TAG": " __VA_ARGS__);\ +}while(0) + +#define LOG_DEBUG(...) do {\ + DiagPrintf("\r"LOG_DEBUG_HEADER"/"LOG_TAG": " __VA_ARGS__);\ +}while(0) + +#define LOG_ERROR(...) do {\ + DiagPrintf("\r"LOG_ERROR_HEADER"/"LOG_TAG": " __VA_ARGS__);\ +}while(0) + +#ifdef NOLOG + #define LOGI + #define LOGD + #define LOGE + #define LOGI2 + #define LOGD2 + #define LOGE2 + #define LOGI4 + #define LOGD4 + #define LOGE4 +#else + #define LOGI LOG_INFO + #define LOGD LOG_DEBUG + #define LOGE LOG_ERROR + #define LOGI2(...) LOG_INFO(IDENT_TWO_SPACE __VA_ARGS__) + #define LOGD2(...) LOG_DEBUG(IDENT_TWO_SPACE __VA_ARGS__) + #define LOGE2(...) LOG_ERROR(IDENT_TWO_SPACE __VA_ARGS__) + #define LOGI4(...) LOG_INFO(IDENT_FOUR_SPACE __VA_ARGS__) + #define LOGD4(...) LOG_DEBUG(IDENT_FOUR_SPACE __VA_ARGS__) + #define LOGE4(...) LOG_ERROR(IDENT_FOUR_SPACE __VA_ARGS__) +#endif + +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_CYAN "\x1b[36m" +#define ANSI_COLOR_YELLOW "\x1b[33m" +#define ANSI_COLOR_MAGENTA "\x1b[35m" +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_BLUE "\x1b[34m" +#define ANSI_COLOR_RESET "\x1b[0m" + +#define DBG_ENTRANCE LOGI(ANSI_COLOR_GREEN "=> %s() <%s>\n" ANSI_COLOR_RESET, \ + __func__, __FILE__) + + +// GMAC MII Configurations +#ifdef LOG_TAG +#undef LOG_TAG +#define LOG_TAG "MII" +#endif + + +typedef struct _HAL_MII_ADAPTER_ { + u32 InterruptMask; + PPHY_MODE_INFO pPhyModeInfo; +}HAL_MII_ADAPTER, *PHAL_MII_ADAPTER; + +typedef struct _HAL_MII_OP_ { + BOOL (*HalMiiGmacInit)(VOID *Data); + BOOL (*HalMiiInit)(VOID *Data); + BOOL (*HalMiiGmacReset)(VOID *Data); + BOOL (*HalMiiGmacEnablePhyMode)(VOID *Data); + u32 (*HalMiiGmacXmit)(VOID *Data); + VOID (*HalMiiGmacCleanTxRing)(VOID *Data); + VOID (*HalMiiGmacFillTxInfo)(VOID *Data); + VOID (*HalMiiGmacFillRxInfo)(VOID *Data); + VOID (*HalMiiGmacTx)(VOID *Data); + VOID (*HalMiiGmacRx)(VOID *Data); + VOID (*HalMiiGmacSetDefaultEthIoCmd)(VOID *Data); + VOID (*HalMiiGmacInitIrq)(VOID *Data); + u32 (*HalMiiGmacGetInterruptStatus)(VOID); + VOID (*HalMiiGmacClearInterruptStatus)(u32 IsrStatus); +}HAL_MII_OP, *PHAL_MII_OP; + +VOID HalMiiOpInit(IN VOID *Data); + +typedef struct _MII_ADAPTER_ { + PHAL_MII_OP pHalMiiOp; + PHAL_MII_ADAPTER pHalMiiAdapter; + PTX_INFO pTx_Info; + PRX_INFO pRx_Info; + VOID* TxBuffer; + VOID* RxBuffer; +}MII_ADAPTER, *PMII_ADAPTER; + +#endif + diff --git a/lib/fwlib/hal_misc.h b/lib/fwlib/hal_misc.h new file mode 100644 index 0000000..1d72114 --- /dev/null +++ b/lib/fwlib/hal_misc.h @@ -0,0 +1,30 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _MISC_H_ +#define _MISC_H_ + +#include + +#ifdef CONFIG_TIMER_MODULE +extern _LONG_CALL_ u32 HalDelayUs(u32 us); +#endif + +extern _LONG_CALL_ u32 HalGetCpuClk(VOID); +extern _LONG_CALL_ u8 HalGetRomInfo(VOID); + +extern _LONG_CALL_ void *_memset( void *s, int c, SIZE_T n ); +extern _LONG_CALL_ void *_memcpy( void *s1, const void *s2, SIZE_T n ); +extern _LONG_CALL_ int _memcmp( const void *av, const void *bv, SIZE_T len ); + +extern _LONG_CALL_ SIZE_T _strlen(const char *s); +extern _LONG_CALL_ int _strcmp(const char *cs, const char *ct); + + +#endif //_MISC_H_ diff --git a/lib/fwlib/hal_nfc.h b/lib/fwlib/hal_nfc.h new file mode 100644 index 0000000..b73dada --- /dev/null +++ b/lib/fwlib/hal_nfc.h @@ -0,0 +1,22 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_NFC_H_ +#define _HAL_NFC_H_ + +#include "rtl8195a_nfc.h" + + +VOID HalNFCOpInit( + IN VOID *Data +); + + +#endif + diff --git a/lib/fwlib/hal_pcm.h b/lib/fwlib/hal_pcm.h new file mode 100644 index 0000000..fa34432 --- /dev/null +++ b/lib/fwlib/hal_pcm.h @@ -0,0 +1,104 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_PCM_H_ +#define _HAL_PCM_H_ + +#include "rtl8195a_pcm.h" +/* +typedef struct _GDMA_CH_LLI_ELE_ { + u32 Sarx; + u32 Darx; + u32 Llpx; + u32 CtlxLow; + u32 CtlxUp; + u32 Temp; +}GDMA_CH_LLI_ELE, *PGDMA_CH_LLI_ELE; +#if 1 +#if 0 +typedef struct _GDMA_CH_LLI_ { + PGDMA_CH_LLI_ELE pLliEle; + PGDMA_CH_LLI pNextLli; +}GDMA_CH_LLI, *PGDMA_CH_LLI; + +typedef struct _BLOCK_SIZE_LIST_ { + u32 BlockSize; + PBLOCK_SIZE_LIST pNextBlockSiz; +}BLOCK_SIZE_LIST, *PBLOCK_SIZE_LIST; +#else +struct GDMA_CH_LLI { + PGDMA_CH_LLI_ELE pLliEle; + struct GDMA_CH_LLI *pNextLli; +}; + +struct BLOCK_SIZE_LIST { + u32 BlockSize; + struct BLOCK_SIZE_LIST *pNextBlockSiz; +}; + +#endif + +#endif +typedef struct _HAL_GDMA_ADAPTER_ { + u32 ChSar; + u32 ChDar; + GDMA_CHANNEL_NUM ChEn; + GDMA_CTL_REG GdmaCtl; + GDMA_CFG_REG GdmaCfg; + u32 PacketLen; + u32 BlockLen; + u32 MuliBlockCunt; + u32 MaxMuliBlock; + struct GDMA_CH_LLI *pLlix; + struct BLOCK_SIZE_LIST *pBlockSizeList; + + PGDMA_CH_LLI_ELE pLli; + u32 NextPlli; + u8 TestItem; + u8 ChNum; + u8 GdmaIndex; + u8 IsrCtrl:1; + u8 GdmaOnOff:1; + u8 Llpctrl:1; + u8 Lli0:1; + u8 Rsvd4to7:4; + u8 GdmaIsrType; +}HAL_GDMA_ADAPTER, *PHAL_GDMA_ADAPTER; + +*/ + +typedef struct _HAL_PCM_ADAPTER_ { + u32 Enable:1; + PCM_CTL_REG PcmCtl; + PCM_CHCNR03_REG PcmChCNR03; + PCM_TSR03_REG PcmTSR03; + PCM_BSIZE03_REG PcmBSize03; + u32 abc; + u8 PcmIndex; + u8 PcmCh; +}HAL_PCM_ADAPTER, *PHAL_PCM_ADAPTER; + + +typedef struct _HAL_PCM_OP_ { + VOID (*HalPcmOnOff)(VOID *Data); + BOOL (*HalPcmInit)(VOID *Data); + BOOL (*HalPcmSetting)(VOID *Data); + BOOL (*HalPcmEn)(VOID *Data); + BOOL (*HalPcmIsrEnAndDis) (VOID *Data); + BOOL (*HalPcmDumpReg)(VOID *Data); + BOOL (*HalPcm)(VOID *Data); +}HAL_PCM_OP, *PHAL_PCM_OP; + + +VOID HalPcmOpInit( + IN VOID *Data +); + + +#endif diff --git a/lib/fwlib/hal_peri_on.h b/lib/fwlib/hal_peri_on.h new file mode 100644 index 0000000..abcbdd0 --- /dev/null +++ b/lib/fwlib/hal_peri_on.h @@ -0,0 +1,451 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_PERI_ON_H_ +#define _HAL_PERI_ON_H_ + +#define MASK_ALLON 0xFFFFFFFF + +#define HAL_PERI_ON_READ32(addr) HAL_READ32(PERI_ON_BASE, addr) +#define HAL_PERI_ON_WRITE32(addr, value) HAL_WRITE32(PERI_ON_BASE, addr, value) +#define HAL_PERI_ON_READ16(addr) HAL_READ16(PERI_ON_BASE, addr) +#define HAL_PERI_ON_WRITE16(addr, value) HAL_WRITE16(PERI_ON_BASE, addr, value) +#define HAL_PERI_ON_READ8(addr) HAL_READ8(PERI_ON_BASE, addr) +#define HAL_PERI_ON_WRITE8(addr, value) HAL_WRITE8(PERI_ON_BASE, addr, value) +#define HAL_PERL_ON_FUNC_CTRL(addr,value,ctrl) \ + HAL_PERI_ON_WRITE32(addr, ((HAL_PERI_ON_READ32(addr) & (~value))|((MASK_ALLON - ctrl + 1) & value))) +#define HAL_PERL_ON_PIN_SEL(addr,mask,value) \ + HAL_PERI_ON_WRITE32(addr, ((HAL_PERI_ON_READ32(addr) & (~mask)) | value)) + +//40 REG_SYS_REGU_CTRL0 +#define LDO25M_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_REGU_CTRL0, BIT_SYS_REGU_LDO25M_EN, ctrl) + +//A0 SYS_DEBUG_CTRL +#define DEBUG_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_DEBUG_CTRL, BIT_SYS_DBG_PIN_EN, ctrl) + +//A4 SYS_PINMUX_CTRL +#define SIC_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_PINMUX_CTRL, BIT_SIC_PIN_EN, ctrl) +#define EEPROM_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SYS_PINMUX_CTRL, BIT_EEPROM_PIN_EN, ctrl) + + +//210 SOV_FUNC_EN +#define LXBUS_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_LXBUS_EN, ctrl) +#define FLASH_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI_FLASH_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_FLASH_EN, ctrl);} + +#define MEM_CTRL_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDR_SDRAM_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_MEM_CTRL_EN, ctrl);} + +#define LOC_UART_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(LOG_UART_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_LOG_UART_EN, ctrl);} + +#define GDMA0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(GDMA0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_GDMA0_EN, ctrl);} + +#define GDMA1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(GDMA1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_GDMA1_EN, ctrl);} + +#define GTIMER_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(TIMER_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_GTIMER_EN, ctrl);} + +#define SECURITY_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(CRYPTO_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_FUNC_EN, BIT_SOC_SECURITY_ENGINE_EN, ctrl);} + +//214 SOC_HCI_COM_FUNC_EN +#define SDIOD_ON_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDIO_DEVICE_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOD_ON_EN, ctrl);} + +#define SDIOD_OFF_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDIO_DEVICE_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOD_OFF_EN, ctrl);} + +#define SDIOH_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SDIO_HOST_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOH_EN, ctrl);} + +#define SDIO_ON_RST_MASK(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SDIOD_ON_RST_MUX, ctrl) +#define OTG_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(USB_OTG_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_OTG_EN, ctrl);} + +#define OTG_RST_MASK(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_OTG_RST_MUX, ctrl) +#define MII_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(MII_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_MII_EN, ctrl);} + +#define MII_MUX_SEL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_SM_SEL, ctrl) +#define WL_MACON_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(WIFI_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_HCI_COM_FUNC_EN, BIT_SOC_HCI_WL_MACON_EN, ctrl);} + +//218 SOC_PERI_FUNC0_EN +#define UART0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_UART0_EN, ctrl);} + +#define UART1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_UART1_EN, ctrl);} + +#define UART2_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_UART2_EN, ctrl);} + +#define SPI0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_SPI0_EN, ctrl);} + +#define SPI1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_SPI1_EN, ctrl);} + +#define SPI2_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(SPI2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_SPI2_EN, ctrl);} + +#define I2C0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C0_EN, ctrl);} + +#define I2C1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C1_EN, ctrl);} + +#define I2C2_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C2_EN, ctrl);} + +#define I2C3_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2C3_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2C3_EN, ctrl);} + +#define I2S0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2S0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2S0_EN, ctrl);} + +#define I2S1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(I2S1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_I2S1_EN, ctrl);} + +#define PCM0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(PCM0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_PCM0_EN, ctrl);} + +#define PCM1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(PCM1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC0_EN, BIT_PERI_PCM1_EN, ctrl);} + +//21C SOC_PERI_FUNC1_EN +#define ADC0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(ADC_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_ADC0_EN, ctrl);} + +#define DAC0_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(DAC_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_DAC0_EN, ctrl);} + +#define DAC1_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(DAC_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_DAC1_EN, ctrl);} + +#define GPIO_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(GPIO_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_FUNC1_EN, BIT_PERI_GPIO_EN, ctrl);} + +//220 SOC_PERI_BD_FUNC0_EN +#define UART0_BD_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART0_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_BD_FUNC0_EN, BIT_PERI_UART0_BD_EN, ctrl);} + +#define UART1_BD_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART1_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_BD_FUNC0_EN, BIT_PERI_UART1_BD_EN, ctrl);} + +#define UART2_BD_FCTRL(ctrl) { \ + if (!ctrl) { \ + HAL_READ32(UART2_REG_BASE,0);\ + }\ + HAL_PERL_ON_FUNC_CTRL(REG_SOC_PERI_BD_FUNC0_EN, BIT_PERI_UART2_BD_EN, ctrl);} + +//230 PESOC_CLK_CTRL +#define ACTCK_CPU_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_CKE_PLFM, ctrl) +#define ACTCK_TRACE_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_TRACE_EN, ctrl) +#define SLPCK_TRACE_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_TRACE_EN, ctrl) +#define ACTCK_VENDOR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_VENDOR_REG_EN, ctrl) +#define SLPCK_VENDOR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_VENDOR_REG_EN, ctrl) +#define ACTCK_FLASH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_FLASH_EN, ctrl) +#define SLPCK_FLASH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_FLASH_EN, ctrl) +#define ACTCK_SDR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_SDR_EN, ctrl) +#define SLPCK_SDR_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_SDR_EN, ctrl) +#define ACTCK_LOG_UART_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_LOG_UART_EN, ctrl) +#define SLPCK_LOG_UART_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_LOG_UART_EN, ctrl) +#define ACTCK_TIMER_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_TIMER_EN, ctrl) +#define SLPCK_TIMER_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_TIMER_EN, ctrl) +#define ACTCK_GDMA0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_GDMA0_EN, ctrl) +#define SLPCK_GDMA0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_GDMA0_EN, ctrl) +#define ACTCK_GDMA1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_GDMA1_EN, ctrl) +#define SLPCK_GDMA1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_GDMA1_EN, ctrl) +#define ACTCK_GPIO_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_GPIO_EN, ctrl) +#define SLPCK_GPIO_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_GPIO_EN, ctrl) +#define ACTCK_BTCMD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_ACTCK_BTCMD_EN, ctrl) +#define SLPCK_BTCMD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_CLK_CTRL, BIT_SOC_SLPCK_BTCMD_EN, ctrl) + +//234 PESOC_PERI_CLK_CTRL0 +#define ACTCK_UART0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_UART0_EN, ctrl) +#define SLPCK_UART0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_UART0_EN, ctrl) +#define ACTCK_UART1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_UART1_EN, ctrl) +#define SLPCK_UART1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_UART1_EN, ctrl) +#define ACTCK_UART2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_UART2_EN, ctrl) +#define SLPCK_UART2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_UART2_EN, ctrl) +#define ACTCK_SPI0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_SPI0_EN, ctrl) +#define SLPCK_SPI0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_SPI0_EN, ctrl) +#define ACTCK_SPI1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_SPI1_EN, ctrl) +#define SLPCK_SPI1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_SPI1_EN, ctrl) +#define ACTCK_SPI2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_ACTCK_SPI2_EN, ctrl) +#define SLPCK_SPI2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL0, BIT_SOC_SLPCK_SPI2_EN, ctrl) + +//238 PESOC_PERI_CLK_CTRL1 +#define ACTCK_I2C0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C0_EN, ctrl) +#define SLPCK_I2C0_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C0_EN, ctrl) +#define ACTCK_I2C1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C1_EN, ctrl) +#define SLPCK_I2C1_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C1_EN, ctrl) +#define ACTCK_I2C2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C2_EN, ctrl) +#define SLPCK_I2C2_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C2_EN, ctrl) +#define ACTCK_I2C3_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2C3_EN, ctrl) +#define SLPCK_I2C3_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2C3_EN, ctrl) +#define ACTCK_I2S_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_I2S_EN, ctrl) +#define SLPCK_I2S_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_I2S_EN, ctrl) +#define ACTCK_PCM_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_PCM_EN, ctrl) +#define SLPCK_PCM_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_PCM_EN, ctrl) +#define ACTCK_ADC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_ADC_EN, ctrl) +#define SLPCK_ADC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_ADC_EN, ctrl) +#define ACTCK_DAC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_ACTCK_DAC_EN, ctrl) +#define SLPCK_DAC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CLK_CTRL1, BIT_SOC_SLPCK_DAC_EN, ctrl) + +//240 PESOC_HCI_CLK_CTRL0 +#define ACTCK_SDIOD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_SDIO_DEV_EN, ctrl) +#define SLPCK_SDIOD_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_SDIO_DEV_EN, ctrl) +#define ACTCK_SDIOH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_SDIO_HST_EN, ctrl) +#define SLPCK_SDIOH_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_SDIO_HST_EN, ctrl) +#define ACTCK_OTG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_OTG_EN, ctrl) +#define SLPCK_OTG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_OTG_EN, ctrl) +#define ACTCK_MII_MPHY_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_ACTCK_MII_MPHY_EN, ctrl) +#define SLPCK_MII_MPHY_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_HCI_CLK_CTRL0, BIT_SOC_SLPCK_MII_MPHY_EN, ctrl) + +//244 PESOC_COM_CLK_CTRL1 +#define ACTCK_WL_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_ACTCK_WL_EN, ctrl) +#define SLPCK_WL_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_SLPCK_WL_EN, ctrl) +#define ACTCK_SEC_ENG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_ACTCK_SECURITY_ENG_EN, ctrl) +#define SLPCK_SEC_ENG_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_SLPCK_SECURITY_ENG_EN, ctrl) +#define ACTCK_NFC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_ACTCK_NFC_EN, ctrl) +#define SLPCK_NFC_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_SLPCK_NFC_EN, ctrl) +#define NFC_CAL_CCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_COM_CLK_CTRL1, BIT_SOC_NFC_CAL_EN, ctrl) + +//250 REG_PERI_CLK_SEL +#define TRACE_CLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_TRACE_CK_SEL << BIT_SHIFT_PESOC_TRACE_CK_SEL), BIT_PESOC_TRACE_CK_SEL(num)) +#define FLASH_CLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_FLASH_CK_SEL << BIT_SHIFT_PESOC_FLASH_CK_SEL), BIT_PESOC_FLASH_CK_SEL(num)) +#define SDR_CLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_SDR_CK_SEL << BIT_SHIFT_PESOC_SDR_CK_SEL), BIT_PESOC_SDR_CK_SEL(num)) +#define I2C_SCLK_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_CLK_SEL, (BIT_MASK_PESOC_PERI_SCLK_SEL << BIT_SHIFT_PESOC_PERI_SCLK_SEL), BIT_PESOC_PERI_SCLK_SEL(num)) + +//270 REG_OSC32K_CTRL +#define OSC32K_CKGEN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_OSC32K_CTRL, BIT_32K_POW_CKGEN_EN, ctrl) + +//280 REG_UART_MUX_CTRL +#define UART0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_UART_MUX_CTRL, BIT_UART0_PIN_EN, ctrl) +#define UART0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_UART_MUX_CTRL, (BIT_MASK_UART0_PIN_SEL << BIT_SHIFT_UART0_PIN_SEL), BIT_UART0_PIN_SEL(num)) +#define UART1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_UART_MUX_CTRL, BIT_UART1_PIN_EN, ctrl) +#define UART1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_UART_MUX_CTRL, (BIT_MASK_UART1_PIN_SEL << BIT_SHIFT_UART1_PIN_SEL), BIT_UART1_PIN_SEL(num)) +#define UART2_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_UART_MUX_CTRL, BIT_UART2_PIN_EN, ctrl) +#define UART2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_UART_MUX_CTRL, (BIT_MASK_UART2_PIN_SEL << BIT_SHIFT_UART2_PIN_SEL), BIT_UART2_PIN_SEL(num)) + +//284 REG_SPI_MUX_CTRL +#define SPI0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI0_PIN_EN, ctrl) +#define SPI0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_SPI_MUX_CTRL, (BIT_MASK_SPI0_PIN_SEL << BIT_SHIFT_SPI0_PIN_SEL), BIT_SPI0_PIN_SEL(num)) +#define SPI1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI1_PIN_EN, ctrl) +#define SPI1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_SPI_MUX_CTRL, (BIT_MASK_SPI1_PIN_SEL << BIT_SHIFT_SPI1_PIN_SEL), BIT_SPI1_PIN_SEL(num)) +#define SPI2_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI2_PIN_EN, ctrl) +#define SPI2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_SPI_MUX_CTRL, (BIT_MASK_SPI2_PIN_SEL << BIT_SHIFT_SPI2_PIN_SEL), BIT_SPI2_PIN_SEL(num)) +#define SPI0_MULTI_CS_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_SPI_MUX_CTRL, BIT_SPI0_MULTI_CS_EN, ctrl) + +//288 REG_I2C_MUX_CTRL +#define I2C0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C0_PIN_EN, ctrl) +#define I2C0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C0_PIN_SEL << BIT_SHIFT_I2C0_PIN_SEL), BIT_I2C0_PIN_SEL(num)) +#define I2C1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C1_PIN_EN, ctrl) +#define I2C1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C1_PIN_SEL << BIT_SHIFT_I2C1_PIN_SEL), BIT_I2C1_PIN_SEL(num)) +#define I2C2_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C2_PIN_EN, ctrl) +#define I2C2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C2_PIN_SEL << BIT_SHIFT_I2C2_PIN_SEL), BIT_I2C2_PIN_SEL(num)) +#define I2C3_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2C_MUX_CTRL, BIT_I2C3_PIN_EN, ctrl) +#define I2C3_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2C_MUX_CTRL, (BIT_MASK_I2C3_PIN_SEL << BIT_SHIFT_I2C3_PIN_SEL), BIT_I2C3_PIN_SEL(num)) + +//28C REG_I2S_MUX_CTRL +#define I2S0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S0_PIN_EN, ctrl) +#define I2S0_MCK_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S0_MCK_EN, ctrl) +#define I2S0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_I2S0_PIN_SEL << BIT_SHIFT_I2S0_PIN_SEL), BIT_I2S0_PIN_SEL(num)) +#define I2S1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S1_PIN_EN, ctrl) +#define I2S1_MCK_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_I2S1_MCK_EN, ctrl) +#define I2S1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_I2S1_PIN_SEL << BIT_SHIFT_I2S1_PIN_SEL), BIT_I2S1_PIN_SEL(num)) +#define PCM0_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_PCM0_PIN_EN, ctrl) +#define PCM0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_PCM0_PIN_SEL << BIT_SHIFT_PCM0_PIN_SEL), BIT_PCM0_PIN_SEL(num)) +#define PCM1_PIN_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_I2S_MUX_CTRL, BIT_PCM1_PIN_EN, ctrl) +#define PCM1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_I2S_MUX_CTRL, (BIT_MASK_PCM1_PIN_SEL << BIT_SHIFT_PCM1_PIN_SEL), BIT_PCM1_PIN_SEL(num)) + +//2A0 HCI_PINMUX_CTRL +#define SDIOD_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_HCI_PINMUX_CTRL, BIT_HCI_SDIOD_PIN_EN, ctrl) +#define SDIOH_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_HCI_PINMUX_CTRL, BIT_HCI_SDIOH_PIN_EN, ctrl) +#define MII_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_HCI_PINMUX_CTRL, BIT_HCI_MII_PIN_EN, ctrl) + +//2A4 WL_PINMUX_CTRL +#define LED_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_LED_PIN_EN, ctrl) +#define LED_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_WL_PINMUX_CTRL, (BIT_MASK_WL_LED_PIN_SEL << BIT_SHIFT_WL_LED_PIN_SEL), BIT_WL_LED_PIN_SEL(num)) +#define ANT0_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_ANT0_PIN_EN, ctrl) +#define ANT1_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_ANT1_PIN_EN, ctrl) +#define BTCOEX_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_BTCOEX_PIN_EN, ctrl) +#define BTCMD_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_WL_BTCMD_PIN_EN, ctrl) +#define NFC_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_WL_PINMUX_CTRL, BIT_NFC_PIN_EN, ctrl) + +//2AC PWM_PINMUX_CTRL +#define PWM0_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM0_PIN_EN, ctrl) +#define PWM0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM0_PIN_SEL << BIT_SHIFT_PWM0_PIN_SEL), BIT_PWM0_PIN_SEL(num)) +#define PWM1_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM1_PIN_EN, ctrl) +#define PWM1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM1_PIN_SEL << BIT_SHIFT_PWM1_PIN_SEL), BIT_PWM1_PIN_SEL(num)) +#define PWM2_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM2_PIN_EN, ctrl) +#define PWM2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM2_PIN_SEL << BIT_SHIFT_PWM2_PIN_SEL), BIT_PWM2_PIN_SEL(num)) +#define PWM3_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_PWM3_PIN_EN, ctrl) +#define PWM3_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_PWM3_PIN_SEL << BIT_SHIFT_PWM3_PIN_SEL), BIT_PWM3_PIN_SEL(num)) +#define ETE0_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE0_PIN_EN, ctrl) +#define ETE0_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE0_PIN_SEL << BIT_SHIFT_ETE0_PIN_SEL), BIT_ETE0_PIN_SEL(num)) +#define ETE1_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE1_PIN_EN, ctrl) +#define ETE1_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE1_PIN_SEL << BIT_SHIFT_ETE1_PIN_SEL), BIT_ETE1_PIN_SEL(num)) +#define ETE2_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE2_PIN_EN, ctrl) +#define ETE2_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE2_PIN_SEL << BIT_SHIFT_ETE2_PIN_SEL), BIT_ETE2_PIN_SEL(num)) +#define ETE3_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PWM_PINMUX_CTRL, BIT_ETE3_PIN_EN, ctrl) +#define ETE3_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PWM_PINMUX_CTRL, (BIT_MASK_ETE3_PIN_SEL << BIT_SHIFT_ETE3_PIN_SEL), BIT_ETE3_PIN_SEL(num)) + +//2C0 CPU_PERIPHERAL_CTRL +#define SPI_FLASH_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_SPI_FLSH_PIN_EN, ctrl) +#define SPI_FLASH_PIN_SEL(num) HAL_PERL_ON_PIN_SEL(REG_CPU_PERIPHERAL_CTRL, (BIT_MASK_SPI_FLSH_PIN_SEL << BIT_SHIFT_SPI_FLSH_PIN_SEL), BIT_SPI_FLSH_PIN_SEL(num)) +#define SDR_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_SDR_PIN_EN, ctrl) +#define TRACE_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_TRACE_PIN_EN, ctrl) +#define LOG_UART_PIN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_LOG_UART_PIN_EN, ctrl) +#define LOG_UART_IR_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_CPU_PERIPHERAL_CTRL, BIT_LOG_UART_IR_EN, ctrl) + +//300 REG_PESOC_MEM_CTRL +#define SDR_DDL_FCTRL(ctrl) HAL_PERL_ON_PIN_SEL(REG_PESOC_MEM_CTRL, (BIT_MASK_PESOC_SDR_DDL_CTRL << BIT_SHIFT_PESOC_SDR_DDL_CTRL), BIT_PESOC_SDR_DDL_CTRL(ctrl)) +#define FLASH_DDL_FCTRL(ctrl) HAL_PERL_ON_PIN_SEL(REG_PESOC_MEM_CTRL, (BIT_MASK_PESOC_FLASH_DDL_CTRL << BIT_SHIFT_PESOC_FLASH_DDL_CTRL), BIT_PESOC_FLASH_DDL_CTRL(ctrl)) + +//304 REG_PESOC_SOC_CTRL +#define SRAM_MUX_CFG(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_SOC_CTRL, (BIT_MASK_PESOC_SRAM_MUX_CFG << BIT_SHIFT_PESOC_SRAM_MUX_CFG), BIT_PESOC_SRAM_MUX_CFG(num)) +#define LX_WL_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_LX_WL_SWAP_SEL, ctrl) +#define LX_MST_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_LX_MST_SWAP_SEL, ctrl) +#define LX_SLV_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_LX_SLV_SWAP_SEL, ctrl) +#define MII_LX_WRAPPER_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_MII_LX_WRAPPER_EN, ctrl) +#define MII_LX_MST_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_MII_LX_MST_SWAP_SEL, ctrl) +#define MII_LX_SLV_SWAP_CTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_SOC_CTRL, BIT_PESOC_MII_LX_SLV_SWAP_SEL, ctrl) +#define GDMA_CFG(num) HAL_PERL_ON_PIN_SEL(REG_PESOC_SOC_CTRL, (BIT_MASK_PESOC_GDMA_CFG << BIT_SHIFT_PESOC_GDMA_CFG), BIT_PESOC_GDMA_CFG(num)) + +//308 PESOC_PERI_CTRL +#define SPI_RN_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PESOC_PERI_CTRL, BIT_SOC_FUNC_SPI_RN, ctrl) + +//320 GPIO_SHTDN_CTRL +#define GPIO_GPA_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPA_SHTDN_N, ctrl) +#define GPIO_GPB_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPB_SHTDN_N, ctrl) +#define GPIO_GPC_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPC_SHTDN_N, ctrl) +#define GPIO_GPD_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPD_SHTDN_N, ctrl) +#define GPIO_GPE_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPE_SHTDN_N, ctrl) +#define GPIO_GPF_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPF_SHTDN_N, ctrl) +#define GPIO_GPG_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPG_SHTDN_N, ctrl) +#define GPIO_GPH_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPH_SHTDN_N, ctrl) +#define GPIO_GPI_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPI_SHTDN_N, ctrl) +#define GPIO_GPJ_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPJ_SHTDN_N, ctrl) +#define GPIO_GPK_SHTDN_N_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_GPIO_SHTDN_CTRL, BIT_GPIO_GPK_SHTDN_N, ctrl) + +//374 +#define EGTIM_FCTRL(ctrl) HAL_PERL_ON_FUNC_CTRL(REG_PERI_EGTIM_CTRL, BIT_PERI_EGTIM_EN, ctrl) +#define EGTIM_RSIG_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_REF_SIG_SEL << BIT_SHIFT_PERI_EGTIM_REF_SIG_SEL), BIT_PERI_EGTIM_REF_SIG_SEL(num)) +#define EGTIME_PIN_G0_OPT_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_PIN_GROUP0_OPT_SEL << BIT_SHIFT_PERI_EGTIM_PIN_GROUP0_OPT_SEL), BIT_PERI_EGTIM_PIN_GROUP0_OPT_SEL(num)) +#define EGTIME_PIN_G1_OPT_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_PIN_GROUP1_OPT_SEL << BIT_SHIFT_PERI_EGTIM_PIN_GROUP1_OPT_SEL), BIT_PERI_EGTIM_PIN_GROUP1_OPT_SEL(num)) +#define EGTIME_PIN_G2_OPT_SEL(num) HAL_PERL_ON_PIN_SEL(REG_PERI_EGTIM_CTRL, (BIT_MASK_PERI_EGTIM_PIN_GROUP2_OPT_SEL << BIT_SHIFT_PERI_EGTIM_PIN_GROUP2_OPT_SEL), BIT_PERI_EGTIM_PIN_GROUP2_OPT_SEL(num)) + + +#endif //_HAL_PERI_ON_H_ + diff --git a/lib/fwlib/hal_pinmux.h b/lib/fwlib/hal_pinmux.h new file mode 100644 index 0000000..68b2c80 --- /dev/null +++ b/lib/fwlib/hal_pinmux.h @@ -0,0 +1,64 @@ +#ifndef _HAL_PINMUX_ +#define _HAL_PINMUX_ + + +//Function Index +#define UART0 0 +#define UART1 1 +#define UART2 2 +#define SPI0 8 +#define SPI1 9 +#define SPI2 10 +#define SPI0_MCS 15 +#define I2C0 16 +#define I2C1 17 +#define I2C2 18 +#define I2C3 19 +#define I2S0 24 +#define I2S1 25 +#define PCM0 28 +#define PCM1 29 +#define ADC0 32 +#define DAC0 36 +#define DAC1 37 +#define SDIOD 64 +#define SDIOH 65 +#define USBOTG 66 +#define MII 88 +#define WL_LED 96 +#define WL_ANT0 104 +#define WL_ANT1 105 +#define WL_BTCOEX 108 +#define WL_BTCMD 109 +#define NFC 112 +#define PWM0 160 +#define PWM1 161 +#define PWM2 162 +#define PWM3 163 +#define ETE0 164 +#define ETE1 165 +#define ETE2 166 +#define ETE3 167 +#define EGTIM 168 +#define SPI_FLASH 196 +#define SDR 200 +#define JTAG 216 +#define TRACE 217 +#define LOG_UART 220 +#define LOG_UART_IR 221 +#define SIC 224 +#define EEPROM 225 +#define DEBUG 226 + +//Location Index(Pin Mux Selection) +#define S0 0 +#define S1 1 +#define S2 2 +#define S3 3 + +_LONG_CALL_ u8 +HalPinCtrlRtl8195A( + IN u32 Function, + IN u32 PinLocation, + IN BOOL Operation); +#endif //_HAL_PINMUX_ \ No newline at end of file diff --git a/lib/fwlib/hal_platform.h b/lib/fwlib/hal_platform.h new file mode 100644 index 0000000..d0979d7 --- /dev/null +++ b/lib/fwlib/hal_platform.h @@ -0,0 +1,102 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _HAL_PLATFORM_ +#define _HAL_PLATFORM_ + +#define ROMVERSION 0x03 +#define ROMINFORMATION (ROMVERSION) + +#define SYSTEM_CLK PLATFORM_CLOCK + +#define SDR_SDRAM_BASE 0x30000000 +#define SYSTEM_CTRL_BASE 0x40000000 +#define PERI_ON_BASE 0x40000000 +#define VENDOR_REG_BASE 0x40002800 +#define SPI_FLASH_BASE 0x98000000 +#define SDR_CTRL_BASE 0x40005000 + +#define PERIPHERAL_IRQ_STATUS 0x04 +#define PERIPHERAL_IRQ_MODE 0x08 +#define PERIPHERAL_IRQ_EN 0x0C +#define LP_PERI_EXT_IRQ_STATUS 0x24 +#define LP_PERI_EXT_IRQ_MODE 0x28 +#define LP_PERI_EXT_IRQ_EN 0x2C + +#define PERIPHERAL_IRQ_ALL_LEVEL 0 + +#define TIMER_CLK 32*1000 + +//3 Peripheral IP Base Address +#define GPIO_REG_BASE 0x40001000 +#define TIMER_REG_BASE 0x40002000 +#define NFC_INTERFACE_BASE 0x40002400 +#define LOG_UART_REG_BASE 0x40003000 +#define I2C2_REG_BASE 0x40003400 +#define I2C3_REG_BASE 0x40003800 +#define SPI_FLASH_CTRL_BASE 0x40006000 +#define ADC_REG_BASE 0x40010000 +#define DAC_REG_BASE 0x40011000 +#define UART0_REG_BASE 0x40040000 +#define UART1_REG_BASE 0x40040400 +#define UART2_REG_BASE 0x40040800 +#define SPI0_REG_BASE 0x40042000 +#define SPI1_REG_BASE 0x40042400 +#define SPI2_REG_BASE 0x40042800 +#define I2C0_REG_BASE 0x40044000 +#define I2C1_REG_BASE 0x40044400 +#define SDIO_DEVICE_REG_BASE 0x40050000 +#define MII_REG_BASE 0x40050000 +#define SDIO_HOST_REG_BASE 0x40058000 +#define GDMA0_REG_BASE 0x40060000 +#define GDMA1_REG_BASE 0x40061000 +#define I2S0_REG_BASE 0x40062000 +#define I2S1_REG_BASE 0x40063000 +#define PCM0_REG_BASE 0x40064000 +#define PCM1_REG_BASE 0x40065000 +#define CRYPTO_REG_BASE 0x40070000 +#define WIFI_REG_BASE 0x40080000 +#define USB_OTG_REG_BASE 0x400C0000 + +#define GDMA1_REG_OFF 0x1000 +#define I2S1_REG_OFF 0x1000 +#define PCM1_REG_OFF 0x1000 +#define SSI_REG_OFF 0x400 +#define RUART_REG_OFF 0x400 + +#define CPU_CLK_TYPE_NO 6 + +enum _BOOT_TYPE_ { + BOOT_FROM_FLASH = 0, + BOOT_FROM_SDIO = 1, + BOOT_FROM_USB = 2, + BOOT_FROM_RSVD = 3, +}; + +enum _EFUSE_CPU_CLK_ { + #if 1 + CLK_200M = 0, + CLK_100M = 1, + CLK_50M = 2, + CLK_25M = 3, + CLK_12_5M = 4, + CLK_4M = 5, + #else + CLK_25M = 0, + CLK_200M = 1, + CLK_100M = 2, + CLK_50M = 3, + CLK_12_5M = 4, + CLK_4M = 5, + #endif +}; + + +#endif //_HAL_PLATFORM_ diff --git a/lib/fwlib/hal_pwm.h b/lib/fwlib/hal_pwm.h new file mode 100644 index 0000000..ff74413 --- /dev/null +++ b/lib/fwlib/hal_pwm.h @@ -0,0 +1,57 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_PWM_H_ +#define _HAL_PWM_H_ + +#define MAX_PWM_CTRL_PIN 4 +// the minimum tick time for G-timer is 61 us (clock source = 32768Hz, reload value=1 and reload takes extra 1T) +//#define GTIMER_TICK_US 31 // micro-second, 1000000/32768 ~= 30.5 +#define MIN_GTIMER_TIMEOUT 61 // in micro-sec, use this value to set the g-timer to generate tick for PWM. 61=(1000000/32768)*2 +#define PWM_GTIMER_TICK_TIME 61 // in micro-sec, use this value to set the g-timer to generate tick for PWM. 61=(1000000/32768)*2 + +typedef struct _HAL_PWM_ADAPTER_ { + u8 pwm_id; // the PWM ID, 0~3 + u8 sel; // PWM Pin selection, 0~3 + u8 gtimer_id; // using G-Timer ID, there are 7 G-timer, but we prefer to use timer 3~6 + u8 enable; // is enabled +// u32 timer_value; // the G-Timer auto-reload value, source clock is 32768Hz, reload will takes extra 1 tick. To set the time of a tick of PWM + u32 tick_time; // the tick time for the G-timer + u32 period; // the period of a PWM control cycle, in PWM tick + u32 pulsewidth; // the pulse width in a period of a PWM control cycle, in PWM tick. To control the ratio +// float duty_ratio; // the dyty ratio = pulswidth/period +}HAL_PWM_ADAPTER, *PHAL_PWM_ADAPTER; + + +extern HAL_Status +HAL_Pwm_Init( + u32 pwm_id, + u32 sel +); + +extern void +HAL_Pwm_Enable( + u32 pwm_id +); + +extern void +HAL_Pwm_Disable( + u32 pwm_id +); + +extern void +HAL_Pwm_SetDuty( + u32 pwm_id, + u32 period, + u32 pulse_width +); + + +#endif + diff --git a/lib/fwlib/hal_sdio.h b/lib/fwlib/hal_sdio.h new file mode 100644 index 0000000..7fa7980 --- /dev/null +++ b/lib/fwlib/hal_sdio.h @@ -0,0 +1,252 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_SDIO_H_ +#define _HAL_SDIO_H_ + +#include "rtl8195a_sdio.h" + +#if !SDIO_BOOT_DRIVER +#include "mailbox.h" +#endif +#define PURE_SDIO_INIC 0 // is a pure SDIO iNIC device or a SDIO iNIC + peripheral device + +#if SDIO_BOOT_DRIVER +typedef struct _HAL_SDIO_ADAPTER_ { + u8 *pTXBDAddr; /* The TX_BD start address */ + PSDIO_TX_BD pTXBDAddrAligned; /* The TX_BD start address, it must be 4-bytes aligned */ + PSDIO_TX_BD_HANDLE pTXBDHdl; /* point to the allocated memory for TX_BD Handle array */ + u16 TXBDWPtr; /* The SDIO TX(Host->Device) BD local write index, different with HW maintained write Index. */ + u16 TXBDRPtr; /* The SDIO TX(Host->Device) BD read index */ + u16 TXBDRPtrReg; /* The SDIO TX(Host->Device) BD read index has been write to HW register */ + u16 reserve1; + + u8 *pRXBDAddr; /* The RX_BD start address */ + PSDIO_RX_BD pRXBDAddrAligned; /* The RX_BD start address, it must be 8-bytes aligned */ + PSDIO_RX_BD_HANDLE pRXBDHdl; /* point to the allocated memory for RX_BD Handle array */ + u16 RXBDWPtr; /* The SDIO RX(Device->Host) BD write index */ + u16 RXBDRPtr; /* The SDIO RX(Device->Host) BD local read index, different with HW maintained Read Index. */ + u16 IntMask; /* The Interrupt Mask */ + u16 IntStatus; /* The Interrupt Status */ + u32 Events; /* The Event to the SDIO Task */ + + u32 EventSema; /* Semaphore for SDIO events, use to wakeup the SDIO task */ + u8 CCPWM; /* the value write to register CCPWM, which will sync to Host HCPWM */ + u8 reserve2; + u16 CCPWM2; /* the value write to register CCPWM2, which will sync to Host HCPWM2 */ + + s8 (*Tx_Callback)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize); /* to hook the WLan driver TX callback function to handle a Packet TX */ + VOID *pTxCb_Adapter; /* a pointer will be used to call the TX Callback function, + which is from the TX CallBack function register */ + s8 (*pTxCallback_Backup)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize); // Use to back up the registered TX Callback function, for MP/Normal mode switch + VOID *pTxCb_Adapter_Backup; // Backup the pTxCb_Adapter, for MP/Normal mode switch + _LIST FreeTxPktList; /* The list to queue free Tx packets handler */ + _LIST RxPktList; /* The list to queue RX packets */ + _LIST FreeRxPktList; /* The list to queue free Rx packets handler */ + SDIO_TX_PACKET *pTxPktHandler; /* to store allocated TX Packet handler memory address */ + SDIO_RX_PACKET *pRxPktHandler; /* to store allocated RX Packet handler memory address */ + u32 RxInQCnt; /* The packet count for Rx In Queue */ + u32 MemAllocCnt; // Memory allocated count, for debug only + u32 MAllocFailedCnt; // MemAlloc Failed count, for debugging + +// VOID *pHalOp; /* point to HAL operation function table */ +} HAL_SDIO_ADAPTER, *PHAL_SDIO_ADAPTER; + +extern BOOL SDIO_Device_Init_Rom( + IN PHAL_SDIO_ADAPTER pSDIODev +); +extern VOID SDIO_Device_DeInit_Rom( + IN PHAL_SDIO_ADAPTER pSDIODev +); +extern VOID SDIO_Send_C2H_IOMsg_Rom( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 *C2HMsg +); +extern u8 SDIO_Send_C2H_PktMsg_Rom( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u8 *C2HMsg, + IN u16 MsgLen +); +extern VOID SDIO_Register_Tx_Callback_Rom( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN s8 (*Tx_Callback)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize), + IN VOID *pAdapter +); +extern s8 SDIO_Rx_Callback_Rom( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN VOID *pData, + IN u16 Offset, + IN u16 Length, + IN u8 CmdType +); + +#else // else of "#if SDIO_BOOT_DRIVER" +typedef struct _HAL_SDIO_ADAPTER_ { +// u8 *pTxBuff; /* point to the SDIO TX Buffer */ +// u8 *pTxBuffAligned; /* point to the SDIO TX Buffer with 4-bytes aligned */ +// u32 TXFifoRPtr; /* The SDIO TX(Host->Device) FIFO buffer read pointer */ + + u8 *pTXBDAddr; /* The TX_BD start address */ + PSDIO_TX_BD pTXBDAddrAligned; /* The TX_BD start address, it must be 4-bytes aligned */ + PSDIO_TX_BD_HANDLE pTXBDHdl; /* point to the allocated memory for TX_BD Handle array */ + u16 TXBDWPtr; /* The SDIO TX(Host->Device) BD local write index, different with HW maintained write Index. */ + u16 TXBDRPtr; /* The SDIO TX(Host->Device) BD read index */ + u16 TXBDRPtrReg; /* The SDIO TX(Host->Device) BD read index has been write to HW register */ + + u8 *pRXBDAddr; /* The RX_BD start address */ + PSDIO_RX_BD pRXBDAddrAligned; /* The RX_BD start address, it must be 8-bytes aligned */ + PSDIO_RX_BD_HANDLE pRXBDHdl; /* point to the allocated memory for RX_BD Handle array */ + u16 RXBDWPtr; /* The SDIO RX(Device->Host) BD write index */ + u16 RXBDRPtr; /* The SDIO RX(Device->Host) BD local read index, different with HW maintained Read Index. */ + u16 IntMask; /* The Interrupt Mask */ + u16 IntStatus; /* The Interrupt Status */ + u32 Events; /* The Event to the SDIO Task */ + + u8 CCPWM; /* the value write to register CCPWM, which will sync to Host HCPWM */ + u8 reserve1; + u16 CCPWM2; /* the value write to register CCPWM2, which will sync to Host HCPWM2 */ + u8 CRPWM; /* sync from Host HRPWM */ + u8 reserve2; + u16 CRPWM2; /* sync from Host HRPWM2 */ + +#if !TASK_SCHEDULER_DISABLED + _Sema TxSema; /* Semaphore for SDIO TX, use to wakeup the SDIO TX task */ + _Sema RxSema; /* Semaphore for SDIO RX, use to wakeup the SDIO RX task */ +#else + u32 EventSema; /* Semaphore for SDIO events, use to wakeup the SDIO task */ +#endif + s8 (*Tx_Callback)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize); /* to hook the WLan driver TX callback function to handle a Packet TX */ + VOID *pTxCb_Adapter; /* a pointer will be used to call the TX Callback function, + which is from the TX CallBack function register */ + s8 (*pTxCallback_Backup)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize); // Use to back up the registered TX Callback function, for MP/Normal mode switch + VOID *pTxCb_Adapter_Backup; // Backup the pTxCb_Adapter, for MP/Normal mode switch +#if (CONFIG_INIC_EN == 0) + _LIST FreeTxPktList; /* The list to queue free Tx packets handler */ + SDIO_TX_PACKET *pTxPktHandler; /* to store allocated TX Packet handler memory address */ +#endif + _LIST RxPktList; /* The list to queue RX packets */ + _LIST FreeRxPktList; /* The list to queue free Rx packets handler */ +// _LIST RecyclePktList; /* The list to queue packets handler to be recycled */ + SDIO_RX_PACKET *pRxPktHandler; /* to store allocated RX Packet handler memory address */ + _Mutex RxMutex; /* The Mutex to protect RxPktList */ + u32 RxInQCnt; /* The packet count for Rx In Queue */ +#if SDIO_DEBUG + _Mutex StatisticMutex; /* The Mutex to protect Statistic data */ + u32 MemAllocCnt; // Memory allocated count, for debug only + u32 MAllocFailedCnt; // MemAlloc Failed count, for debugging +#endif + VOID *pHalOp; /* point to HAL operation function table */ + RTL_MAILBOX *pMBox; /* the Mail box for other driver module can send message to SDIO driver */ + +#ifdef PLATFORM_FREERTOS + xTaskHandle xSDIOTxTaskHandle; /* The handle of the SDIO Task for TX, can be used to delte the task */ + xTaskHandle xSDIORxTaskHandle; /* The handle of the SDIO Task speical for RX, can be used to delte the task */ +#endif + u8 RxFifoBusy; /* is the RX BD fetch hardware busy */ + +#if SDIO_MP_MODE +#if !TASK_SCHEDULER_DISABLED + u32 MP_Events; /* The Event to the SDIO Task */ + _Sema MP_EventSema; /* Semaphore for SDIO events, use to wakeup the SDIO task */ + RTL_MAILBOX *pMP_MBox; /* the Mail box for communication with other driver module */ +#ifdef PLATFORM_FREERTOS + xTaskHandle MP_TaskHandle; /* The handle of the MP loopback Task, can be used to delte the task */ +#endif // end of "#ifdef PLATFORM_FREERTOS" +#endif // end of "#if !TASK_SCHEDULER_DISABLED" + // for MP mode + RTL_TIMER *pPeriodTimer; /* a timer to calculate throughput periodically */ + u8 MP_ModeEn; /* is in MP mode */ + u8 MP_LoopBackEn; /* is loop-back enabled */ + u8 MP_ContinueTx; /* is continue TX test enabled */ + u8 MP_ContinueRx; /* is continue RX test enabled */ + u8 MP_ContinueRxMode; /* continue RX test mode: static RX Buf, Dyna-Allocate RX Buf, Pre-Allocate RX Buf */ + u8 MP_CRxInfinite; /* is non-stop SDIO RX, no packet count limit */ + u16 MP_CRxSize; /* SDIO RX test packet size */ + u8 *pMP_CRxBuf; // the buffer for continye RX test + u32 MP_CRxPktCnt; /* SDIO RX test packet count */ + u32 MP_CRxPktPendingCnt; /* SDIO RX test packet pening count */ + u32 MP_TxPktCnt; /* SDIO TX packet count */ + u32 MP_RxPktCnt; /* SDIO RX packet count */ + u32 MP_TxByteCnt; /* SDIO TX Byte count */ + u32 MP_RxByteCnt; /* SDIO RX Byte count */ + u32 MP_TxDropCnt; /* SDIO TX Drop packet count */ + u32 MP_RxDropCnt; /* SDIO RX Drop packet count */ + + u32 MP_TxPktCntInPeriod; /* SDIO TX packet count in a period */ + u32 MP_RxPktCntInPeriod; /* SDIO RX packet count in a period */ + u32 MP_TxByteCntInPeriod; /* SDIO TX Byte count in a period */ + u32 MP_RxByteCntInPeriod; /* SDIO RX Byte count in a period */ + + u32 MP_TxAvgTPWin[SDIO_AVG_TP_WIN_SIZE]; /* a window of SDIO TX byte count history, for average throughput calculation */ + u32 MP_RxAvgTPWin[SDIO_AVG_TP_WIN_SIZE]; /* a window of SDIO RX byte count history, for average throughput calculation */ + u32 MP_TxAvgTPWinSum; /* The sum of all byte-count in the window */ + u32 MP_RxAvgTPWinSum; /* The sum of all byte-count in the window */ + u8 OldestTxAvgWinIdx; /* the index of the oldest TX byte count log */ + u8 TxAvgWinCnt; /* the number of log in the Window */ + u8 OldestRxAvgWinIdx; /* the index of the oldest RX byte count log */ + u8 RxAvgWinCnt; /* the number of log in the Window */ + + _LIST MP_RxPktList; /* The list to queue RX packets, for MP loopback test */ +#endif // end of '#if SDIO_MP_MODE' +} HAL_SDIO_ADAPTER, *PHAL_SDIO_ADAPTER; +#endif // end of "#else of "#if SDIO_BOOT_DRIVER"" + + +typedef struct _HAL_SDIO_OP_ { + BOOL (*HalSdioDevInit)(PHAL_SDIO_ADAPTER pSDIODev); + VOID (*HalSdioDevDeInit)(PHAL_SDIO_ADAPTER pSDIODev); + VOID (*HalSdioSendC2HIOMsg)(PHAL_SDIO_ADAPTER pSDIODev, u32 *C2HMsg); + u8 (*HalSdioSendC2HPktMsg)(PHAL_SDIO_ADAPTER pSDIODev, u8 *C2HMsg, u16 MsgLen); + VOID (*HalSdioRegTxCallback)(PHAL_SDIO_ADAPTER pSDIODev,s8 (*CallbackFun)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize), VOID *pAdapter); + s8 (*HalSdioRxCallback)(PHAL_SDIO_ADAPTER pSDIODev, VOID *pData, u16 Offset, u16 PktSize, u8 CmdType); +#if SDIO_MP_MODE + VOID (*HalSdioDevMPApp)(PHAL_SDIO_ADAPTER pSDIODev, u16 argc, u8 *argv[]); +#endif +}HAL_SDIO_OP, *PHAL_SDIO_OP; + + +extern BOOL SDIO_Device_Init( + IN PHAL_SDIO_ADAPTER pSDIODev +); +extern VOID SDIO_Device_DeInit( + IN PHAL_SDIO_ADAPTER pSDIODev +); +extern VOID SDIO_Send_C2H_IOMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 *C2HMsg +); +extern u8 SDIO_Send_C2H_PktMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u8 *C2HMsg, + IN u16 MsgLen +); +extern VOID SDIO_Register_Tx_Callback( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN s8 (*Tx_Callback)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize), + IN VOID *pAdapter +); +extern s8 SDIO_Rx_Callback( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN VOID *pData, + IN u16 Offset, + IN u16 Length, + IN u8 CmdType +); +#if SDIO_MP_MODE +extern VOID SDIO_DeviceMPApp( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u16 argc, + IN u8 *argv[] +); +#endif + +extern PHAL_SDIO_ADAPTER pgSDIODev; +extern VOID HalSdioInit(VOID); +extern VOID HalSdioDeInit(VOID); +#endif // #ifndef _HAL_SDIO_H_ diff --git a/lib/fwlib/hal_sdr_controller.h b/lib/fwlib/hal_sdr_controller.h new file mode 100644 index 0000000..79487a2 --- /dev/null +++ b/lib/fwlib/hal_sdr_controller.h @@ -0,0 +1,188 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_SDR_CONTROLLER_H_ +#define _HAL_SDR_CONTROLLER_H_ + +typedef enum _DRAM_TYPE_ { + DRAM_DDR_1 = 1, + DRAM_DDR_2 = 2, + DRAM_DDR_3 = 3, + DRAM_DDR_4 = 4, + DRAM_SDR = 8 +}DRAM_TYPE; + +typedef enum _DRAM_COLADDR_WTH_ { + DRAM_COLADDR_8B = 0, + DRAM_COLADDR_9B = 1, + DRAM_COLADDR_10B = 2, + DRAM_COLADDR_11B = 3, + DRAM_COLADDR_12B = 4, + DRAM_COLADDR_13B = 5, + DRAM_COLADDR_14B = 6, + DRAM_COLADDR_15B = 7, + DRAM_COLADDR_16B = 8 +}DRAM_COLADDR_WTH; + +typedef enum _DRAM_BANK_SIZE_ { + DRAM_BANK_2 = 0, + DRAM_BANK_4 = 1, + DRAM_BANK_8 = 2 +}DRAM_BANK_SIZE; + +typedef enum _DRAM_DQ_WIDTH_ { + DRAM_DQ_16 = 0, + DRAM_DQ_32 = 1, + DRAM_HALF_DQ32 = 2 +}DRAM_DQ_WIDTH; + +typedef enum _MODE0_BST_LEN_ { + BST_LEN_4 = 0, + BST_LEN_FLY = 1, + BST_LEN_8 = 2 +}MODE0_BST_LEN; + +typedef enum _MODE0_BST_TYPE_ { + SENQUENTIAL = 0, + INTERLEAVE = 1 +}MODE0_BST_TYPE; + +typedef enum _DFI_RATIO_TYPE_ { + DFI_RATIO_1 = 0, // DFI= 1:1, or SDR + DFI_RATIO_2 = 1, + DFI_RATIO_4 = 2 +}DFI_RATIO_TYPE; + +typedef struct _DRAM_INFO_ { + DRAM_TYPE DeviceType; + DRAM_COLADDR_WTH ColAddrWth; + DRAM_BANK_SIZE Bank; + DRAM_DQ_WIDTH DqWidth; +}DRAM_INFO; + +typedef struct _DRAM_MODE_REG_INFO_ { + MODE0_BST_LEN BstLen; + MODE0_BST_TYPE BstType; + //enum mode0_cas rd_cas; + u32 Mode0Cas; + u32 Mode0Wr; + u32 Mode1DllEnN; + u32 Mode1AllLat; + u32 Mode2Cwl; +}DRAM_MODE_REG_INFO; + +typedef struct _DRAM_TIMING_INFO_ { + u32 TrfcPs; + u32 TrefiPs; + u32 WrMaxTck; + u32 TrcdPs; + u32 TrpPs; + u32 TrasPs; + u32 TrrdTck; + u32 TwrPs; + u32 TwtrTck; + //u32 TrtpPs; + u32 TmrdTck; + u32 TrtpTck; + u32 TccdTck; + u32 TrcPs; +}DRAM_TIMING_INFO; + + +typedef struct _DRAM_DEVICE_INFO_ { + DRAM_INFO *Dev; + DRAM_MODE_REG_INFO *ModeReg; + DRAM_TIMING_INFO *Timing; + u32 DdrPeriodPs; + DFI_RATIO_TYPE *DfiRate; +}DRAM_DEVICE_INFO; + + +//====================================================== +//DRAM Info +#ifdef CONFIG_FPGA + #define DRAM_INFO_TYPE DRAM_SDR + #define DRAM_INFO_COL_ADDR_WTH DRAM_COLADDR_9B + #define DRAM_INFO_BANK_SZ DRAM_BANK_4 + #define DRAM_INFO_DQ_WTH DRAM_DQ_16 +#else + #define DRAM_INFO_TYPE DRAM_SDR + #define DRAM_INFO_COL_ADDR_WTH DRAM_COLADDR_8B + #define DRAM_INFO_BANK_SZ DRAM_BANK_2 + #define DRAM_INFO_DQ_WTH DRAM_DQ_16 +#endif + +//====================================================== +//DRAM Timing +#ifdef CONFIG_SDR_100MHZ +#define DRAM_TIMING_TCK 10000 //ps +#endif +#ifdef CONFIG_SDR_50MHZ +#define DRAM_TIMING_TCK 20000 //ps +#endif +#ifdef CONFIG_SDR_25MHZ +#define DRAM_TIMING_TCK 40000 //ps +#endif +#ifdef CONFIG_SDR_12_5MHZ +#define DRAM_TIMING_TCK 80000 //ps +#endif + +#if 1 +#define DRAM_TIMING_TREF 64000 //us +#define DRAM_ROW_NUM 8192 //depends on row bit number + +#define DRAM_TIMING_TRFC 60000 //ps +#define DRAM_TIMING_TREFI ((u32)((DRAM_TIMING_TREF*1000)/DRAM_ROW_NUM)*1000) //ps +#define DRAM_TIMING_TWRMAXTCK 2 //tck +#define DRAM_TIMING_TRCD 15000 //ps +#define DRAM_TIMING_TRP 15000 //ps +#define DRAM_TIMING_TRAS 42000 //ps +#define DRAM_TIMING_TRRD 2 //tck +#define DRAM_TIMING_TWR ((u32)(DRAM_TIMING_TCK*2)) +#define DRAM_TIMING_TWTR 0 //tck +#define DRAM_TIMING_TMRD 2 //tck +#define DRAM_TIMING_TRTP 0 //tck +#define DRAM_TIMING_TCCD 1 //tck +#define DRAM_TIMING_TRC 60000 //ps +#else + +#define DRAM_TIMING_TREF 66000 //us +#define DRAM_ROW_NUM 8192 //depends on row bit number + +#define DRAM_TIMING_TRFC 66000 //ps +#define DRAM_TIMING_TREFI 63999800 +#define DRAM_TIMING_TWRMAXTCK 2 //tck +#define DRAM_TIMING_TRCD 15000 //ps +#define DRAM_TIMING_TRP 15000 //ps +#define DRAM_TIMING_TRAS 37000 //ps +#define DRAM_TIMING_TRRD 2 //tck +#define DRAM_TIMING_TWR 7000 +#define DRAM_TIMING_TWTR 0 //tck +#define DRAM_TIMING_TMRD 2 //tck +#define DRAM_TIMING_TRTP 0 //tck +#define DRAM_TIMING_TCCD 1 //tck +#define DRAM_TIMING_TRC 60000 //ps +#endif + +#define HAL_SDR_WRITE32(addr, value32) HAL_WRITE32(SDR_CTRL_BASE, addr, value32) +#define HAL_SDR_WRITE16(addr, value16) HAL_WRITE16(SDR_CTRL_BASE, addr, value16) +#define HAL_SDR_WRITE8(addr, value8) HAL_WRITE8(SDR_CTRL_BASE, addr, value8) +#define HAL_SDR_READ32(addr) HAL_READ32(SDR_CTRL_BASE, addr) +#define HAL_SDR_READ16(addr) HAL_READ16(SDR_CTRL_BASE, addr) +#define HAL_SDR_READ8(addr) HAL_READ8(SDR_CTRL_BASE, addr) + +#define HAL_SDRAM_WRITE32(addr, value32) HAL_WRITE32(SDR_SDRAM_BASE, addr, value32) +#define HAL_SDRAM_WRITE16(addr, value16) HAL_WRITE16(SDR_SDRAM_BASE, addr, value16) +#define HAL_SDRAM_WRITE8(addr, value8) HAL_WRITE8(SDR_SDRAM_BASE, addr, value8) +#define HAL_SDRAM_READ32(addr) HAL_READ32(SDR_SDRAM_BASE, addr) +#define HAL_SDRAM_READ16(addr) HAL_READ16(SDR_SDRAM_BASE, addr) +#define HAL_SDRAM_READ8(addr) HAL_READ8(SDR_SDRAM_BASE, addr) + + +#endif // end of "#ifndef _HAL_SDR_CONTROLLER_H_" diff --git a/lib/fwlib/hal_soc_ps_monitor.h b/lib/fwlib/hal_soc_ps_monitor.h new file mode 100644 index 0000000..9e43093 --- /dev/null +++ b/lib/fwlib/hal_soc_ps_monitor.h @@ -0,0 +1,278 @@ +#ifndef _HAL_SOCPWR_ +#define _HAL_SOCPWR_ + + + +#define MAX_BACKUP_SIZE 129 +#define MAXFUNC 10 +#define FSTREG 0xFF + +#define REG_VDR_ANACK_CAL_CTRL 0xA0 + +#define PS_MASK 0xFFFFFFFF + +//pwr state +#define HWACT 0 +#define HWCG 1 +#define HWINACT 2 +#define UNDEF 3 +#define ALLMET 0xff + +//SLP +#define SLP_STIMER BIT0 +#define SLP_GTIMER BIT1 +#define SLP_GPIO BIT2 +#define SLP_WL BIT3 +#define SLP_NFC BIT4 +#define SLP_SDIO BIT5 +#define SLP_USB BIT6 +#define SLP_TIMER33 BIT7 + +//DSTBY +#define DSTBY_STIMER BIT0 +#define DSTBY_NFC BIT1 +#define DSTBY_TIMER33 BIT2 +#define DSTBY_GPIO BIT3 + +//DS wake event +#define DS_TIMER33 BIT0 +#define DS_GPIO BIT1 + +enum power_state_idx{ + ACT = 0, + WFE = 1, + WFI = 2, + SNOOZE = 3, + SLPCG = 4, + SLPPG = 5, + DSTBY = 6, + DSLP = 7, + INACT = 8, + MAXSTATE = 9 +}; + +enum clk_idx{ + ANACK = 0, + A33CK = 1, +}; + + +typedef struct _power_state_{ + u8 FuncIdx; + u8 PowerState; +}POWER_STATE, *pPOWER_STATE; + +typedef struct _reg_power_state_{ + u8 FuncIdx; + u8 PwrState; +}REG_POWER_STATE, *pPREG_POWER_STATE; + +#if 0 +typedef struct _power_state_{ + u8 FuncIdx; + u8 PowerState; + u32 ReqDuration; + u32 RegCount; + u32 RemainDuration; +}POWER_STATE, *pPOWER_STATE; + +typedef struct _reg_power_state_{ + u8 FuncIdx; + u8 PwrState; + u32 ReqDuration; + //u8 StateIdx; +}REG_POWER_STATE, *pPREG_POWER_STATE; +#endif + +typedef struct _power_mgn_{ + u8 ActFuncCount; + POWER_STATE PwrState[MAXFUNC]; + u8 CurrentState; + u8 SDREn; + u32 MSPbackup[MAX_BACKUP_SIZE]; + u32 CPURegbackup[25]; + u32 CPUPSP; + u32 WakeEventFlag; + BOOL SleepFlag; + //u32 CPUReg[13]; + //u32 MSBackUp[128]; +}Power_Mgn, *pPower_Mgn; + +typedef struct _SYS_ADAPTER_ { + u8 function; +}SYS_ADAPTER, *PSYS_ADAPTER; + +extern Power_Mgn PwrAdapter; + +u8 ChangeSoCPwrState( + IN u8 RequestState, + IN u32 ReqCount +); + +VOID PrintCPU(VOID); +void WakeFromSLPPG(void); +VOID SOCPSTestApp(VOID *Data); + + +__inline static VOID +CPURegBackUp( + VOID +) +{ +#if defined (__ICCARM__) + // TODO: IAR has different way using assembly +#elif defined (__GNUC__) + //backup cpu reg + #if 0 + asm volatile + ( + "PUSH {PSR, PC, LR, R12,R3,R2,R1,R0}\n" + ); + #endif + #if 0 + asm volatile + ( + "PUSH {r0,r1,r2,r3,r4}\n" + ); + #endif + + asm volatile + ( + + "MOV %0, r0\n" + :"=r"(PwrAdapter.CPURegbackup[0]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r1\n" + :"=r"(PwrAdapter.CPURegbackup[1]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r2\n" + :"=r"(PwrAdapter.CPURegbackup[2]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r3\n" + :"=r"(PwrAdapter.CPURegbackup[3]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r4\n" + :"=r"(PwrAdapter.CPURegbackup[4]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r5\n" + :"=r"(PwrAdapter.CPURegbackup[5]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r6\n" + :"=r"(PwrAdapter.CPURegbackup[6]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r7\n" + :"=r"(PwrAdapter.CPURegbackup[7]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r8\n" + :"=r"(PwrAdapter.CPURegbackup[8]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r9\n" + :"=r"(PwrAdapter.CPURegbackup[9]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r10\n" + :"=r"(PwrAdapter.CPURegbackup[10]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r11\n" + :"=r"(PwrAdapter.CPURegbackup[11]) + ::"memory" + ); + asm volatile + ( + "MOV %0, r12\n" + :"=r"(PwrAdapter.CPURegbackup[12]) + ::"memory" + ); + + asm volatile + ( + "MOV %0, r13\n" + :"=r"(PwrAdapter.CPURegbackup[13]) + ::"memory" + ); + asm volatile + ( + //"MOV %0, r14\n" + "LDR %0, =SLPPG_WAKEUP_POINT\n" + "ADD %0, #1\n" + :"=r"(PwrAdapter.CPURegbackup[14]) + ::"memory" + ); + asm volatile + ( + "LDR %0, =SLPPG_WAKEUP_POINT\n" + "ADD %0, #1\n" + :"=r"(PwrAdapter.CPURegbackup[15]) + ::"memory" + ); + asm volatile + ( + "MRS %0, PSR\n" + :"=r"(PwrAdapter.CPURegbackup[16]) + ::"memory" + ); + +#if 1 + asm volatile + ( + "mov %0, r13\n" + "MOV %1, PC\n" + "MRS %2, CONTROL\n" + "MRS %3, PSP\n" + "MRS %4, MSP\n" + :"=r"(PwrAdapter.CPURegbackup[24]),"=r"(PwrAdapter.CPURegbackup[23]),"=r"(PwrAdapter.CPURegbackup[22]),"=r"(PwrAdapter.CPURegbackup[21]),"=r"(PwrAdapter.CPURegbackup[20]) + ::"memory" + ); +#endif + #ifdef CONFIG_SOC_PS_VERIFY + PrintCPU(); + #endif //#ifdef CONFIG_SOC_PS_VERIFY +#endif //#elif defined (__GNUC__) +} + +VOID RegPowerState(REG_POWER_STATE RegPwrState); + +#endif //_HAL_SOCPWR_ diff --git a/lib/fwlib/hal_spi_flash.h b/lib/fwlib/hal_spi_flash.h new file mode 100644 index 0000000..6a06a5b --- /dev/null +++ b/lib/fwlib/hal_spi_flash.h @@ -0,0 +1,254 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _HAL_SPIFLASH__ +#define _HAL_SPIFLASH__ +//====================================================== +// Header files + +#define SPIC_CALIBRATION_IN_NVM 1 // if store the SPIC calibration data in the NVM +#ifndef CONFIG_IMAGE_SEPARATE // Store SPIC Calibration only for seprated image +#undef SPIC_CALIBRATION_IN_NVM +#define SPIC_CALIBRATION_IN_NVM 0 +#endif + +//====================================================== +// Definition +#define HAL_SPI_WRITE32(addr, value32) HAL_WRITE32(SPI_FLASH_CTRL_BASE, addr, value32) +#define HAL_SPI_WRITE16(addr, value16) HAL_WRITE16(SPI_FLASH_CTRL_BASE, addr, value16) +#define HAL_SPI_WRITE8(addr, value8) HAL_WRITE8(SPI_FLASH_CTRL_BASE, addr, value8) +#define HAL_SPI_READ32(addr) HAL_READ32(SPI_FLASH_CTRL_BASE, addr) +#define HAL_SPI_READ16(addr) HAL_READ16(SPI_FLASH_CTRL_BASE, addr) +#define HAL_SPI_READ8(addr) HAL_READ8(SPI_FLASH_CTRL_BASE, addr) + +typedef struct _SPIC_PARA_MODE_ { + u8 Valid:1; // valid + u8 CpuClk:3; // CPU clock + u8 BitMode:2; // Bit mode + u8 Reserved:2; // reserved +} SPIC_PARA_MODE, *PSPIC_PARA_MODE; + +typedef struct _SPIC_INIT_PARA_ { + u8 BaudRate; + u8 RdDummyCyle; + u8 DelayLine; + union { + u8 Rsvd; + u8 Valid; + SPIC_PARA_MODE Mode; + }; +#if defined(E_CUT_ROM_DOMAIN) || (!defined(CONFIG_RELEASE_BUILD_LIBRARIES)) + u8 id[3]; + u8 flashtype; +#endif +}SPIC_INIT_PARA, *PSPIC_INIT_PARA; + + +enum _SPIC_BIT_MODE_ { + SpicOneBitMode = 0, + SpicDualBitMode = 1, + SpicQuadBitMode = 2, +}; + +//====================================================== +// Flash type used +#define FLASH_OTHERS 0 +#define FLASH_MXIC 1 +#define FLASH_WINBOND 2 +#define FLASH_MICRON 3 + +#define FLASH_MXIC_MX25L4006E 1 +#define FLASH_MXIC_MX25L8073E 0 + +// The below parts are based on the flash characteristics +//====== Flash Command Definition ====== +#if FLASH_MXIC_MX25L4006E + #define FLASH_CMD_WREN 0x06 //write enable + #define FLASH_CMD_WRDI 0x04 //write disable + #define FLASH_CMD_WRSR 0x01 //write status register + #define FLASH_CMD_RDID 0x9F //read idenfication + #define FLASH_CMD_RDSR 0x05 //read status register + #define FLASH_CMD_READ 0x03 //read data + #define FLASH_CMD_FREAD 0x0B //fast read data + #define FLASH_CMD_RDSFDP 0x5A //Read SFDP + #define FLASH_CMD_RES 0xAB //Read Electronic ID + #define FLASH_CMD_REMS 0x90 //Read Electronic Manufacturer & Device ID + #define FLASH_CMD_DREAD 0x3B //Double Output Mode command + #define FLASH_CMD_SE 0x20 //Sector Erase + #define FLASH_CMD_BE 0xD8 //Block Erase(or 0x52) + #define FLASH_CMD_CE 0x60 //Chip Erase(or 0xC7) + #define FLASH_CMD_PP 0x02 //Page Program + #define FLASH_CMD_DP 0xB9 //Deep Power Down + #define FLASH_CMD_RDP 0xAB //Release from Deep Power-Down +#elif FLASH_MXIC_MX25L8073E + #define FLASH_CMD_WREN 0x06 //write enable + #define FLASH_CMD_WRDI 0x04 //write disable + #define FLASH_CMD_WRSR 0x01 //write status register + #define FLASH_CMD_RDID 0x9F //read idenfication + #define FLASH_CMD_RDSR 0x05 //read status register + #define FLASH_CMD_READ 0x03 //read data + #define FLASH_CMD_FREAD 0x0B //fast read data + #define FLASH_CMD_RDSFDP 0x5A //Read SFDP + #define FLASH_CMD_RES 0xAB //Read Electronic ID + #define FLASH_CMD_REMS 0x90 //Read Electronic Manufacturer & Device ID + #define FLASH_CMD_DREAD 0x3B //Double Output Mode command + #define FLASH_CMD_SE 0x20 //Sector Erase + #define FLASH_CMD_BE 0x52 //Block Erase + #define FLASH_CMD_CE 0x60 //Chip Erase(or 0xC7) + #define FLASH_CMD_PP 0x02 //Page Program + #define FLASH_CMD_DP 0xB9 //Deep Power Down + #define FLASH_CMD_RDP 0xAB //Release from Deep Power-Down + #define FLASH_CMD_2READ 0xBB // 2 x I/O read command + #define FLASH_CMD_4READ 0xEB // 4 x I/O read command + #define FLASH_CMD_QREAD 0x6B // 1I / 4O read command + #define FLASH_CMD_4PP 0x38 //quad page program + #define FLASH_CMD_FF 0xFF //Release Read Enhanced + #define FLASH_CMD_REMS2 0xEF // read ID for 2x I/O mode + #define FLASH_CMD_REMS4 0xDF // read ID for 4x I/O mode + #define FLASH_CMD_ENSO 0xB1 // enter secured OTP + #define FLASH_CMD_EXSO 0xC1 // exit secured OTP + #define FLASH_CMD_RDSCUR 0x2B // read security register + #define FLASH_CMD_WRSCUR 0x2F // write security register +#else + #define FLASH_CMD_WREN 0x06 //write enable + #define FLASH_CMD_WRDI 0x04 //write disable + #define FLASH_CMD_WRSR 0x01 //write status register + #define FLASH_CMD_RDID 0x9F //read idenfication + #define FLASH_CMD_RDSR 0x05 //read status register + #define FLASH_CMD_READ 0x03 //read data + #define FLASH_CMD_FREAD 0x0B //fast read data + #define FLASH_CMD_RDSFDP 0x5A //Read SFDP + #define FLASH_CMD_RES 0xAB //Read Electronic ID + #define FLASH_CMD_REMS 0x90 //Read Electronic Manufacturer & Device ID + #define FLASH_CMD_DREAD 0x3B //Double Output Mode command + #define FLASH_CMD_SE 0x20 //Sector Erase + #define FLASH_CMD_BE 0x52 //Block Erase + #define FLASH_CMD_CE 0x60 //Chip Erase(or 0xC7) + #define FLASH_CMD_PP 0x02 //Page Program + #define FLASH_CMD_DP 0xB9 //Deep Power Down + #define FLASH_CMD_RDP 0xAB //Release from Deep Power-Down + #define FLASH_CMD_2READ 0xBB // 2 x I/O read command + #define FLASH_CMD_4READ 0xEB // 4 x I/O read command + #define FLASH_CMD_QREAD 0x6B // 1I / 4O read command + #define FLASH_CMD_4PP 0x38 //quad page program + #define FLASH_CMD_FF 0xFF //Release Read Enhanced + #define FLASH_CMD_REMS2 0xEF // read ID for 2x I/O mode + #define FLASH_CMD_REMS4 0xDF // read ID for 4x I/O mode + #define FLASH_CMD_ENSO 0xB1 // enter secured OTP + #define FLASH_CMD_EXSO 0xC1 // exit secured OTP + #define FLASH_CMD_RDSCUR 0x2B // read security register + #define FLASH_CMD_WRSCUR 0x2F // write security register +#endif //#if FLASH_MXIC_MX25L4006E +// ============================ + +// ===== Flash Parameter Definition ===== +#if FLASH_MXIC_MX25L4006E + #define FLASH_RD_2IO_EN 0 + #define FLASH_RD_2O_EN 1 + #define FLASH_RD_4IO_EN 0 + #define FLASH_RD_4O_EN 0 + #define FLASH_WR_2IO_EN 0 + #define FLASH_WR_2O_EN 0 + #define FLASH_WR_4IO_EN 0 + #define FLASH_WR_4O_EN 0 + + #define FLASH_DM_CYCLE_2O 0x08 + #define FLASH_VLD_DUAL_CMDS (BIT_WR_BLOCKING | BIT_RD_DUAL_I) + #define FLASH_VLD_QUAD_CMDS (0) + +#elif FLASH_MXIC_MX25L8073E //This flash model is just for prototype, if you want to use it, + //the code MUST be rechecked according to the flash spec. + #define FLASH_RD_2IO_EN 1 + #define FLASH_RD_2O_EN 0 + #define FLASH_RD_4IO_EN 1 + #define FLASH_RD_4O_EN 0 + #define FLASH_WR_2IO_EN 1 + #define FLASH_WR_2O_EN 0 + #define FLASH_WR_4IO_EN 1 + #define FLASH_WR_4O_EN 0 + + #define FLASH_DM_CYCLE_2O 0x08 + #define FLASH_DM_CYCLE_2IO 0x04 + #define FLASH_DM_CYCLE_4O 0x08 + #define FLASH_DM_CYCLE_4IO 0x04 + + #define FLASH_VLD_DUAL_CMDS (BIT_WR_BLOCKING | BIT_RD_DUAL_IO) + #define FLASH_VLD_QUAD_CMDS (BIT_WR_BLOCKING | BIT_WR_QUAD_II | BIT_RD_QUAD_IO) +#else + #define FLASH_RD_2IO_EN 1 + #define FLASH_RD_2O_EN 0 + #define FLASH_RD_4IO_EN 1 + #define FLASH_RD_4O_EN 0 + #define FLASH_WR_2IO_EN 1 + #define FLASH_WR_2O_EN 0 + #define FLASH_WR_4IO_EN 1 + #define FLASH_WR_4O_EN 0 + + #define FLASH_DM_CYCLE_2O 0x08 + #define FLASH_DM_CYCLE_2IO 0x04 + #define FLASH_DM_CYCLE_4O 0x08 + #define FLASH_DM_CYCLE_4IO 0x04 + + #define FLASH_VLD_DUAL_CMDS (BIT_WR_BLOCKING | BIT_RD_DUAL_IO) + #define FLASH_VLD_QUAD_CMDS (BIT_WR_BLOCKING | BIT_WR_QUAD_II | BIT_RD_QUAD_IO) +#endif +#if 0 +//====================================================== +// Function prototype +BOOLEAN SpicFlashInitRtl8195A(u8 SpicBitMode); + +_LONG_CALL_ +extern VOID SpicLoadInitParaFromClockRtl8195A(u8 CpuClkMode, u8 BaudRate, PSPIC_INIT_PARA pSpicInitPara); + +// spi-flash controller initialization +_LONG_CALL_ +extern VOID SpicInitRtl8195A(u8 InitBaudRate, u8 SpicBitMode); + +// wait sr[0] = 0, wait transmission done +_LONG_CALL_ +extern VOID SpicWaitBusyDoneRtl8195A(VOID); + +// wait spi-flash status register[0] = 0 +//_LONG_CALL_ +//extern VOID SpicWaitWipDoneRtl8195A(SPIC_INIT_PARA SpicInitPara); +#endif + +//====================================================== +// ROM Function prototype +_LONG_CALL_ VOID SpiFlashAppV02(IN VOID *Data); +_LONG_CALL_ROM_ VOID SpicInitRtl8195AV02(IN u8 InitBaudRate,IN u8 SpicBitMode); + +_LONG_CALL_ROM_ VOID SpicEraseFlashRtl8195AV02(VOID); + +_LONG_CALL_ROM_ VOID SpicLoadInitParaFromClockRtl8195AV02(IN u8 CpuClkMode,IN u8 BaudRate,IN PSPIC_INIT_PARA pSpicInitPara); + + +VOID SpicBlockEraseFlashRtl8195A(IN u32 Address); +VOID SpicSectorEraseFlashRtl8195A(IN u32 Address); +VOID SpicDieEraseFlashRtl8195A(IN u32 Address); +VOID SpicWriteProtectFlashRtl8195A(IN u32 Protect); +VOID SpicWaitWipDoneRefinedRtl8195A(IN SPIC_INIT_PARA SpicInitPara); +VOID SpicWaitOperationDoneRtl8195A(IN SPIC_INIT_PARA SpicInitPara); +VOID SpicRxCmdRefinedRtl8195A(IN u8 cmd,IN SPIC_INIT_PARA SpicInitPara); +u8 SpicGetFlashStatusRefinedRtl8195A(IN SPIC_INIT_PARA SpicInitPara); +VOID SpicInitRefinedRtl8195A(IN u8 InitBaudRate,IN u8 SpicBitMode); +u32 SpicWaitWipRtl8195A(VOID); +u32 SpicOneBitCalibrationRtl8195A(IN u8 SysCpuClk); +VOID SpicDisableRtl8195A(VOID); +VOID SpicDeepPowerDownFlashRtl8195A(VOID); +VOID SpicUserProgramRtl8195A(IN u8 * data, IN SPIC_INIT_PARA SpicInitPara, IN u32 addr, IN u32 * LengthInfo); + +#if SPIC_CALIBRATION_IN_NVM +VOID SpicNVMCalLoad(u8 BitMode, u8 CpuClk); +VOID SpicNVMCalLoadAll(void); +VOID SpicNVMCalStore(u8 BitMode, u8 CpuClk); +#endif // #if SPIC_CALIBRATION_IN_NVM + +#endif //_HAL_SPIFLASH__ diff --git a/lib/fwlib/hal_ssi.h b/lib/fwlib/hal_ssi.h new file mode 100644 index 0000000..5248234 --- /dev/null +++ b/lib/fwlib/hal_ssi.h @@ -0,0 +1,309 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_SSI_H_ +#define _HAL_SSI_H_ + +#include "rtl8195a_ssi.h" + +/** + * LOG Configurations + */ + +extern u32 SSI_DBG_CONFIG; +extern uint8_t SPI0_IS_AS_SLAVE; + + +#define SSI_DBG_ENTRANCE(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_ENTRANCE)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE ANSI_COLOR_GREEN __VA_ARGS__ ANSI_COLOR_RESET); \ +}while(0) + +#define SSI_DBG_INIT(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INIT)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INIT_V(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INIT_V)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INIT_VV(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INIT_VV)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_PINMUX(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_PINMUX)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_ENDIS(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_ENDIS)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_V(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_V)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_HNDLR(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_HNDLR)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_READ(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_READ)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_INT_WRITE(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_INT_WRITE)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_STATUS(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_STATUS)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_FIFO(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_FIFO)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_READ(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_READ)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_WRITE(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_WRITE)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +#define SSI_DBG_SLV_CTRL(...) do {\ + if (unlikely(SSI_DBG_CONFIG & DBG_TYPE_SLV_CTRL)) \ + DBG_SSI_INFO(IDENT_FOUR_SPACE __VA_ARGS__); \ +}while(0) + +typedef enum _SSI_DBG_TYPE_LIST_ { + DBG_TYPE_ENTRANCE = 1 << 0, + DBG_TYPE_INIT = 1 << 1, + DBG_TYPE_INIT_V = 1 << 2, + DBG_TYPE_INIT_VV = 1 << 3, + DBG_TYPE_PINMUX = 1 << 4, + DBG_TYPE_ENDIS = 1 << 5, + DBG_TYPE_INT = 1 << 6, + DBG_TYPE_INT_V = 1 << 7, + DBG_TYPE_INT_HNDLR = 1 << 8, + DBG_TYPE_INT_READ = 1 << 9, + DBG_TYPE_INT_WRITE = 1 << 10, + DBG_TYPE_STATUS = 1 << 11, + DBG_TYPE_FIFO = 1 << 12, + DBG_TYPE_READ = 1 << 13, + DBG_TYPE_WRITE = 1 << 14, + DBG_TYPE_SLV_CTRL = 1 << 15 +} SSI_DBG_TYPE_LIST, *PSSI_DBG_TYPE_LIST; + + typedef struct _SSI_DMA_CONFIG_ { + VOID *pHalGdmaOp; + VOID *pTxHalGdmaAdapter; + VOID *pRxHalGdmaAdapter; + u8 RxDmaBurstSize; + u8 TxDmaBurstSize; + u8 RxDmaEnable; + u8 TxDmaEnable; + IRQ_HANDLE RxGdmaIrqHandle; + IRQ_HANDLE TxGdmaIrqHandle; +}SSI_DMA_CONFIG, *PSSI_DMA_CONFIG; + +/** + * DesignWare SSI Configurations + */ +typedef struct _HAL_SSI_ADAPTOR_ { + SSI_DMA_CONFIG DmaConfig; + IRQ_HANDLE IrqHandle; + // + VOID (*RxCompCallback)(VOID *Para); + VOID *RxCompCbPara; + VOID *RxData; + VOID (*TxCompCallback)(VOID *Para); + VOID *TxCompCbPara; + VOID *TxData; + u32 DmaRxDataLevel; + u32 DmaTxDataLevel; + u32 InterruptPriority; + u32 RxLength; + u32 RxLengthRemainder; + u32 RxThresholdLevel; + u32 TxLength; + u32 TxThresholdLevel; + u32 SlaveSelectEnable; + // + u16 ClockDivider; + u16 DataFrameNumber; + // + u8 ControlFrameSize; + u8 DataFrameFormat; + u8 DataFrameSize; + u8 DmaControl; + u8 Index; + u8 InterruptMask; + u8 MicrowireDirection; + u8 MicrowireHandshaking; + u8 MicrowireTransferMode; + u8 PinmuxSelect; + u8 Role; + u8 SclkPhase; + u8 SclkPolarity; + u8 SlaveOutputEnable; + u8 TransferMode; + u8 TransferMechanism; + + // Extend + u32 Reserved1; + u8 DefaultRxThresholdLevel; +}HAL_SSI_ADAPTOR, *PHAL_SSI_ADAPTOR; + +typedef struct _HAL_SSI_OP_{ + HAL_Status (*HalSsiPinmuxEnable)(VOID *Adaptor); + HAL_Status (*HalSsiPinmuxDisable)(VOID *Adaptor); + HAL_Status (*HalSsiEnable)(VOID *Adaptor); + HAL_Status (*HalSsiDisable)(VOID *Adaptor); + HAL_Status (*HalSsiInit)(VOID *Adaptor); + HAL_Status (*HalSsiSetSclkPolarity)(VOID *Adaptor); + HAL_Status (*HalSsiSetSclkPhase)(VOID *Adaptor); + HAL_Status (*HalSsiWrite)(VOID *Adaptor, u32 value); + HAL_Status (*HalSsiLoadSetting)(VOID *Adaptor, VOID *Setting); + HAL_Status (*HalSsiSetInterruptMask)(VOID *Adaptor); + HAL_Status (*HalSsiSetDeviceRole)(VOID *Adaptor, u32 Role); + HAL_Status (*HalSsiInterruptEnable)(VOID *Adaptor); + HAL_Status (*HalSsiInterruptDisable)(VOID *Adaptor); + HAL_Status (*HalSsiReadInterrupt)(VOID *Adaptor, VOID *RxData, u32 Length); + HAL_Status (*HalSsiSetRxFifoThresholdLevel)(VOID *Adaptor); + HAL_Status (*HalSsiSetTxFifoThresholdLevel)(VOID *Adaptor); + HAL_Status (*HalSsiWriteInterrupt)(VOID *Adaptor, u8 *TxData, u32 Length); + HAL_Status (*HalSsiSetSlaveEnableRegister)(VOID *Adaptor, u32 SlaveIndex); + u32 (*HalSsiBusy)(VOID *Adaptor); + u32 (*HalSsiReadable)(VOID *Adaptor); + u32 (*HalSsiWriteable)(VOID *Adaptor); + u32 (*HalSsiGetInterruptMask)(VOID *Adaptor); + u32 (*HalSsiGetRxFifoLevel)(VOID *Adaptor); + u32 (*HalSsiGetTxFifoLevel)(VOID *Adaptor); + u32 (*HalSsiGetStatus)(VOID *Adaptor); + u32 (*HalSsiGetInterruptStatus)(VOID *Adaptor); + u32 (*HalSsiRead)(VOID *Adaptor); + u32 (*HalSsiGetRawInterruptStatus)(VOID *Adaptor); + u32 (*HalSsiGetSlaveEnableRegister)(VOID *Adaptor); +}HAL_SSI_OP, *PHAL_SSI_OP; + +typedef struct _DW_SSI_DEFAULT_SETTING_ { + VOID (*RxCompCallback)(VOID *Para); + VOID *RxCompCbPara; + VOID *RxData; + VOID (*TxCompCallback)(VOID *Para); + VOID *TxCompCbPara; + VOID *TxData; + u32 DmaRxDataLevel; + u32 DmaTxDataLevel; + u32 InterruptPriority; + u32 RxLength; + u32 RxLengthRemainder; + u32 RxThresholdLevel; + u32 TxLength; + u32 TxThresholdLevel; + u32 SlaveSelectEnable; + // + u16 ClockDivider; + u16 DataFrameNumber; + // + u8 ControlFrameSize; + u8 DataFrameFormat; + u8 DataFrameSize; + u8 DmaControl; + //u8 Index; + u8 InterruptMask; + u8 MicrowireDirection; + u8 MicrowireHandshaking; + u8 MicrowireTransferMode; + //u8 PinmuxSelect; + //u8 Role; + u8 SclkPhase; + u8 SclkPolarity; + u8 SlaveOutputEnable; + u8 TransferMode; + u8 TransferMechanism; +} DW_SSI_DEFAULT_SETTING, *PDW_SSI_DEFAULT_SETTING; + + +struct spi_s { + HAL_SSI_ADAPTOR spi_adp; + HAL_SSI_OP spi_op; + u32 irq_handler; + u32 irq_id; + u32 dma_en; + u32 state; + u8 sclk; +#ifdef CONFIG_GDMA_EN + HAL_GDMA_ADAPTER spi_gdma_adp_tx; + HAL_GDMA_ADAPTER spi_gdma_adp_rx; +#endif +}; + +VOID HalSsiOpInit(VOID *Adaptor); +static __inline__ VOID HalSsiSetSclk( + IN PHAL_SSI_ADAPTOR pHalSsiAdapter, + IN u32 ClkRate) +{ + HalSsiSetSclkRtl8195a((VOID*)pHalSsiAdapter, ClkRate); +} + +HAL_Status HalSsiInit(VOID * Data); +HAL_Status HalSsiDeInit(VOID * Data); +HAL_Status HalSsiEnable(VOID * Data); +HAL_Status HalSsiDisable(VOID * Data); + + +#ifdef CONFIG_GDMA_EN +HAL_Status HalSsiTxGdmaInit(PHAL_SSI_OP pHalSsiOp, PHAL_SSI_ADAPTOR pHalSsiAdapter); +VOID HalSsiTxGdmaDeInit(PHAL_SSI_ADAPTOR pHalSsiAdapter); +HAL_Status HalSsiRxGdmaInit(PHAL_SSI_OP pHalSsiOp, PHAL_SSI_ADAPTOR pHalSsiAdapter); +VOID HalSsiRxGdmaDeInit(PHAL_SSI_ADAPTOR pHalSsiAdapter); + +static __inline__ VOID +HalSsiDmaInit( + IN PHAL_SSI_ADAPTOR pHalSsiAdapter +) +{ + HalSsiDmaInitRtl8195a((void *)pHalSsiAdapter); +} + +static __inline__ HAL_Status HalSsiDmaSend(VOID *Adapter, u8 *pTxData, u32 Length) +{ + return (HalSsiDmaSendRtl8195a(Adapter, pTxData, Length)); +} + +static __inline__ HAL_Status HalSsiDmaRecv(VOID *Adapter, u8 *pRxData, u32 Length) +{ + return (HalSsiDmaRecvRtl8195a(Adapter, pRxData, Length)); +} + + +#endif // end of "#ifdef CONFIG_GDMA_EN" + +#endif + diff --git a/lib/fwlib/hal_timer.h b/lib/fwlib/hal_timer.h new file mode 100644 index 0000000..8bf7f7e --- /dev/null +++ b/lib/fwlib/hal_timer.h @@ -0,0 +1,58 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_TIMER_H_ +#define _HAL_TIMER_H_ +#include "basic_types.h" +#include "hal_platform.h" +#include "rtl8195a_timer.h" + +#define GTIMER_CLK_HZ (32768) +#define GTIMER_TICK_US (1000000/GTIMER_CLK_HZ) + +typedef enum _TIMER_MODE_ { + FREE_RUN_MODE = 0, + USER_DEFINED = 1 +}TIMER_MODE, *PTIMER_MODE; + + +typedef struct _TIMER_ADAPTER_ { + + u32 TimerLoadValueUs; + u32 TimerIrqPriority; + TIMER_MODE TimerMode; + IRQ_HANDLE IrqHandle; + u8 TimerId; + u8 IrqDis; + +}TIMER_ADAPTER, *PTIMER_ADAPTER; + + +typedef struct _HAL_TIMER_OP_ { + u32 (*HalGetTimerId)(u32 *TimerId); + BOOL (*HalTimerInit)(VOID *Data); + u32 (*HalTimerReadCount)(u32 TimerId); + VOID (*HalTimerIrqClear)(u32 TimerId); + VOID (*HalTimerDis)(u32 TimerId); + VOID (*HalTimerEn)(u32 TimerId); + VOID (*HalTimerDumpReg)(u32 TimerId); +}HAL_TIMER_OP, *PHAL_TIMER_OP; + +VOID HalTimerOpInit_Patch( + IN VOID *Data +); + + +//====================================================== +// ROM Function prototype +_LONG_CALL_ VOID HalTimerOpInitV02(IN VOID *Data); + +//pvxx #define HalTimerOpInit HalTimerOpInit_Patch + +#endif diff --git a/lib/fwlib/hal_uart.h b/lib/fwlib/hal_uart.h new file mode 100644 index 0000000..625382d --- /dev/null +++ b/lib/fwlib/hal_uart.h @@ -0,0 +1,204 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_UART_H_ +#define _HAL_UART_H_ + +#include "rtl8195a_uart.h" + +/** + * RUART Configurations + */ +#define UART_WAIT_FOREVER 0xffffffff + +typedef struct _UART_DMA_CONFIG_ { + u8 TxDmaEnable; + u8 RxDmaEnable; + u8 TxDmaBurstSize; + u8 RxDmaBurstSize; + VOID *pHalGdmaOp; + VOID *pTxHalGdmaAdapter; + VOID *pRxHalGdmaAdapter; + IRQ_HANDLE TxGdmaIrqHandle; + IRQ_HANDLE RxGdmaIrqHandle; +}UART_DMA_CONFIG, *PUART_DMA_CONFIG; + +typedef struct _HAL_RUART_ADAPTER_ { + u32 BaudRate; + u32 FlowControl; + u32 FifoControl; + u32 Interrupts; + u32 TxCount; // how many byte to TX + u32 RxCount; // how many bytes to RX + u8 *pTxBuf; + u8 *pRxBuf; + HAL_UART_State State; // UART state + u8 Status; // Transfer Status + u8 Locked; // is UART locked for operation + u8 UartIndex; + u8 WordLen; // word length select: 0 -> 7 bits, 1 -> 8 bits + u8 StopBit; // word length select: 0 -> 1 stop bit, 1 -> 2 stop bit + u8 Parity; // parity check enable + u8 ParityType; // parity check type + u8 StickParity; + u8 ModemStatus; // the modem status + u8 DmaEnable; + u8 TestCaseNumber; + u8 PinmuxSelect; + BOOL PullMode; + IRQ_HANDLE IrqHandle; + PUART_DMA_CONFIG DmaConfig; + VOID (*ModemStatusInd)(VOID *pAdapter); // modem status indication interrupt handler + VOID (*TxTDCallback)(VOID *pAdapter); // User Tx Done callback function + VOID (*RxDRCallback)(VOID *pAdapter); // User Rx Data ready callback function + VOID (*TxCompCallback)(VOID *para); // User Tx complete callback function + VOID (*RxCompCallback)(VOID *para); // User Rx complete callback function + VOID *TxTDCbPara; // the pointer agrument for TxTDCallback + VOID *RxDRCbPara; // the pointer agrument for RxDRCallback + VOID *TxCompCbPara; // the pointer argument for TxCompCbPara + VOID *RxCompCbPara; // the pointer argument for RxCompCallback + VOID (*EnterCritical)(void); + VOID (*ExitCritical)(void); + + //1 New member only can be added below: members above must be fixed for ROM code + u32 *pDefaultBaudRateTbl; // point to the table of pre-defined baud rate + u8 *pDefaultOvsrRTbl; // point to the table of OVSR for pre-defined baud rate + u16 *pDefaultDivTbl; // point to the table of DIV for pre-defined baud rate + u8 *pDefOvsrAdjBitTbl_10; // point to the table of OVSR-Adj bits for 10 bits + u8 *pDefOvsrAdjBitTbl_9; // point to the table of OVSR-Adj bits for 9 bits + u8 *pDefOvsrAdjBitTbl_8; // point to the table of OVSR-Adj bits for 8 bits + u16 *pDefOvsrAdjTbl_10; // point to the table of OVSR-Adj for pre-defined baud rate + u16 *pDefOvsrAdjTbl_9; // point to the table of OVSR-Adj for pre-defined baud rate + u16 *pDefOvsrAdjTbl_8; // point to the table of OVSR-Adj for pre-defined baud rate + u32 BaudRateUsing; // Current using Baud-Rate + +#if CONFIG_CHIP_E_CUT + u8 TxState; + u8 RxState; + u32 TxInitSize; // how many byte to TX at atart + u32 RxInitSize; // how many bytes to RX at start + + VOID (*RuartEnterCritical)(VOID *para); // enter critical: disable UART interrupt + VOID (*RuartExitCritical)(VOID *para); // exit critical: re-enable UART interrupt + VOID (*TaskYield)(VOID *para); // User Task Yield: do a context switch while waitting + VOID *TaskYieldPara; // the agrument (pointer) for TaskYield +#endif // #if CONFIG_CHIP_E_CUT +}HAL_RUART_ADAPTER, *PHAL_RUART_ADAPTER; + +typedef struct _HAL_RUART_OP_ { + VOID (*HalRuartAdapterLoadDef)(VOID *pAdp, u8 UartIdx); // Load UART adapter default setting + VOID (*HalRuartTxGdmaLoadDef)(VOID *pAdp, VOID *pCfg); // Load TX GDMA default setting + VOID (*HalRuartRxGdmaLoadDef)(VOID *pAdp, VOID *pCfg); // Load RX GDMA default setting + HAL_Status (*HalRuartResetRxFifo)(VOID *Data); + HAL_Status (*HalRuartInit)(VOID *Data); + VOID (*HalRuartDeInit)(VOID *Data); + HAL_Status (*HalRuartPutC)(VOID *Data, u8 TxData); + u32 (*HalRuartSend)(VOID *Data, u8 *pTxData, u32 Length, u32 Timeout); + HAL_Status (*HalRuartIntSend)(VOID *Data, u8 *pTxData, u32 Length); + HAL_Status (*HalRuartDmaSend)(VOID *Data, u8 *pTxData, u32 Length); + HAL_Status (*HalRuartStopSend)(VOID *Data); + HAL_Status (*HalRuartGetC)(VOID *Data, u8 *pRxByte); + u32 (*HalRuartRecv)(VOID *Data, u8 *pRxData, u32 Length, u32 Timeout); + HAL_Status (*HalRuartIntRecv)(VOID *Data, u8 *pRxData, u32 Length); + HAL_Status (*HalRuartDmaRecv)(VOID *Data, u8 *pRxData, u32 Length); + HAL_Status (*HalRuartStopRecv)(VOID *Data); + u8 (*HalRuartGetIMR)(VOID *Data); + VOID (*HalRuartSetIMR)(VOID *Data); + u32 (*HalRuartGetDebugValue)(VOID *Data, u32 DbgSel); + VOID (*HalRuartDmaInit)(VOID *Data); + VOID (*HalRuartRTSCtrl)(VOID *Data, BOOLEAN RtsCtrl); + VOID (*HalRuartRegIrq)(VOID *Data); + VOID (*HalRuartIntEnable)(VOID *Data); + VOID (*HalRuartIntDisable)(VOID *Data); +}HAL_RUART_OP, *PHAL_RUART_OP; + +typedef struct _RUART_DATA_ { + PHAL_RUART_ADAPTER pHalRuartAdapter; + BOOL PullMode; + u8 BinaryData; + u8 SendBuffer; + u8 RecvBuffer; +}RUART_DATA, *PRUART_DATA; + +typedef struct _RUART_ADAPTER_ { + PHAL_RUART_OP pHalRuartOp; + PHAL_RUART_ADAPTER pHalRuartAdapter; + PUART_DMA_CONFIG pHalRuartDmaCfg; +}RUART_ADAPTER, *PRUART_ADAPTER; + +extern VOID +HalRuartOpInit( + IN VOID *Data +); + +extern HAL_Status +HalRuartTxGdmaInit( + PHAL_RUART_OP pHalRuartOp, + PHAL_RUART_ADAPTER pHalRuartAdapter, + PUART_DMA_CONFIG pUartGdmaConfig +); + +extern VOID +HalRuartTxGdmaDeInit( + PUART_DMA_CONFIG pUartGdmaConfig +); + +extern HAL_Status +HalRuartRxGdmaInit( + PHAL_RUART_OP pHalRuartOp, + PHAL_RUART_ADAPTER pHalRuartAdapter, + PUART_DMA_CONFIG pUartGdmaConfig +); + +extern VOID +HalRuartRxGdmaDeInit( + PUART_DMA_CONFIG pUartGdmaConfig +); + +extern HAL_Status +HalRuartResetTxFifo( + VOID *Data +); + +extern HAL_Status +HalRuartSetBaudRate( + IN VOID *Data +); + +extern HAL_Status +HalRuartInit( + IN VOID *Data +); + +extern VOID +HalRuartDeInit( + IN VOID *Data +); + +extern HAL_Status +HalRuartDisable( + IN VOID *Data +); + +extern HAL_Status +HalRuartEnable( + IN VOID *Data +); + +HAL_Status +HalRuartFlowCtrl( + IN VOID *Data +); + +extern const HAL_RUART_OP _HalRuartOp; +extern HAL_Status RuartLock (PHAL_RUART_ADAPTER pHalRuartAdapter); +extern VOID RuartUnLock (PHAL_RUART_ADAPTER pHalRuartAdapter); + +#endif + diff --git a/lib/fwlib/hal_usb.h b/lib/fwlib/hal_usb.h new file mode 100644 index 0000000..3de8fa2 --- /dev/null +++ b/lib/fwlib/hal_usb.h @@ -0,0 +1,15 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_USB_H_ +#define _HAL_USB_H_ + +#include "rtl8195a_usb.h" + +#endif //_HAL_USB_H_ \ No newline at end of file diff --git a/lib/fwlib/hal_util.h b/lib/fwlib/hal_util.h new file mode 100644 index 0000000..183eb4c --- /dev/null +++ b/lib/fwlib/hal_util.h @@ -0,0 +1,252 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#ifndef _HAL_UTIL_H_ +#define _HAL_UTIL_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Simple doubly linked list implementation. + * + * Some of the internal functions ("__xxx") are useful when + * manipulating whole lists rather than single entries, as + * sometimes we already know the next/prev entries and we can + * generate better code by using them directly rather than + * using the generic single-entry routines. + */ +struct LIST_HEADER { + struct LIST_HEADER *Next, *Prev; +}; + +typedef struct LIST_HEADER _LIST; + +//#define RTL_LIST_HEAD_INIT(name) { &(name), &(name) } + +#define RTL_INIT_LIST_HEAD(ptr) do { \ + (ptr)->Next = (ptr); (ptr)->Prev = (ptr); \ +} while (0) + + +/* + * Insert a new entry between two known consecutive entries. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ + static __inline__ VOID + __List_Add( + IN struct LIST_HEADER * New, + IN struct LIST_HEADER * Prev, + IN struct LIST_HEADER * Next +) +{ + Next->Prev = New; + New->Next = Next; + New->Prev = Prev; + Prev->Next = New; +} + +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ + static __inline__ VOID + __List_Del( + IN struct LIST_HEADER * Prev, + IN struct LIST_HEADER * Next + ) +{ + Next->Prev = Prev; + Prev->Next = Next; +} + +/** + * ListDel - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty on entry does not return true after this, the entry is in an undefined state. + */ +static __inline__ VOID +ListDel( + IN struct LIST_HEADER *Entry +) +{ + __List_Del(Entry->Prev, Entry->Next); +} + +/** + * ListDelInit - deletes entry from list and reinitialize it. + * @entry: the element to delete from the list. + */ +static __inline__ VOID +ListDelInit( + IN struct LIST_HEADER *Entry +) +{ + __List_Del(Entry->Prev, Entry->Next); + RTL_INIT_LIST_HEAD(Entry); + +} + +/** + * ListEmpty - tests whether a list is empty + * @head: the list to test. + */ +static __inline__ u32 +ListEmpty( + IN struct LIST_HEADER *Head +) +{ + return Head->Next == Head; +} + +/** + * ListSplice - join two lists + * @list: the new list to add. + * @head: the place to add it in the first list. + */ +static __inline__ VOID +ListSplice( + IN struct LIST_HEADER *List, + IN struct LIST_HEADER *Head +) +{ + struct LIST_HEADER *First = List->Next; + + if (First != List) { + struct LIST_HEADER *Last = List->Prev; + struct LIST_HEADER *At = Head->Next; + + First->Prev = Head; + Head->Next = First; + + Last->Next = At; + At->Prev = Last; + } +} + +static __inline__ VOID +ListAdd( + IN struct LIST_HEADER *New, + IN struct LIST_HEADER *head +) +{ + __List_Add(New, head, head->Next); +} + + +static __inline__ VOID +ListAddTail( + IN struct LIST_HEADER *New, + IN struct LIST_HEADER *head +) +{ + __List_Add(New, head->Prev, head); +} + +static __inline VOID +RtlInitListhead( + IN _LIST *list +) +{ + RTL_INIT_LIST_HEAD(list); +} + + +/* +For the following list_xxx operations, +caller must guarantee the atomic context. +Otherwise, there will be racing condition. +*/ +static __inline u32 +RtlIsListEmpty( + IN _LIST *phead +) +{ + + if (ListEmpty(phead)) + return _TRUE; + else + return _FALSE; + +} + +static __inline VOID +RtlListInsertHead( + IN _LIST *plist, + IN _LIST *phead +) +{ + ListAdd(plist, phead); +} + +static __inline VOID +RtlListInsertTail( + IN _LIST *plist, + IN _LIST *phead +) +{ + ListAddTail(plist, phead); +} + + +static __inline _LIST +*RtlListGetNext( + IN _LIST *plist +) +{ + return plist->Next; +} + +static __inline VOID +RtlListDelete( + IN _LIST *plist +) +{ + ListDelInit(plist); +} + +#define RTL_LIST_CONTAINOR(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) + +#ifndef CONTAINER_OF +#define CONTAINER_OF(ptr, type, member) \ + ((type *)((char *)(ptr)-(SIZE_T)(&((type *)0)->member))) +#endif +/* +#define list_entry(ptr, type, member) \ + CONTAINER_OF(ptr, type, member) + +#define list_first_entry(ptr, type, member) \ + list_entry((ptr)->Next, type, member) + +#define list_next_entry(pos, member, type) \ + list_entry((pos)->member.Next, type, member) + +#define list_for_each_entry(pos, head, member, type) \ + for (pos = list_first_entry(head, type, member); \ + &pos->member != (head); \ + pos = list_next_entry(pos, member, type)) +#define list_for_each(pos, head) \ + for (pos = (head)->Next; pos != (head); pos = pos->Next) +*/ + +#ifndef BIT + #define BIT(x) ( 1 << (x)) +#endif + +#ifdef __cplusplus +} +#endif + +#endif //_HAL_UTIL_H_ diff --git a/lib/fwlib/hal_vector_table.h b/lib/fwlib/hal_vector_table.h new file mode 100644 index 0000000..e1eb2fb --- /dev/null +++ b/lib/fwlib/hal_vector_table.h @@ -0,0 +1,53 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _HAL_VECTOR_TABLE_H_ +#define _HAL_VECTOR_TABLE_H_ + + + + +extern _LONG_CALL_ROM_ VOID +VectorTableInitRtl8195A( + IN u32 StackP +); + +extern _LONG_CALL_ROM_ VOID +VectorTableInitForOSRtl8195A( + IN VOID *PortSVC, + IN VOID *PortPendSVH, + IN VOID *PortSysTick +); + +extern _LONG_CALL_ROM_ BOOL +VectorIrqRegisterRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + +extern _LONG_CALL_ROM_ BOOL +VectorIrqUnRegisterRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + + +extern _LONG_CALL_ROM_ VOID +VectorIrqEnRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + +extern _LONG_CALL_ROM_ VOID +VectorIrqDisRtl8195A( + IN PIRQ_HANDLE pIrqHandle +); + + +extern _LONG_CALL_ROM_ VOID +HalPeripheralIntrHandle(VOID); +#endif //_HAL_VECTOR_TABLE_H_ diff --git a/lib/fwlib/ram_lib/usb_otg/include/Rtl8195a_otg_zero.h b/lib/fwlib/ram_lib/usb_otg/include/Rtl8195a_otg_zero.h new file mode 100644 index 0000000..ef24f40 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/Rtl8195a_otg_zero.h @@ -0,0 +1,35 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef RTL8195A_OTG_ZERO_H +#define RTL8195A_OTG_ZERO_H + +#include "usb_ch9.h" +#include "usb_gadget.h" + +struct zero_dev { + //ModifiedByJD spinlock_t lock; + struct usb_gadget *gadget; + struct usb_request *req; /* for control responses */ + + /* when configured, we have one of two configs: + * - source data (in to host) and sink it (out from host) + * - or loop it back (out from host back in to host) + */ + u8 config; + struct usb_ep *in_ep, *out_ep, *status_ep;//ModifiedByJD + + const struct usb_endpoint_descriptor + *in, *out, *status; //ModifiedByJD + /* autoresume timer */ + //ModifiedByJD struct timer_list resume; +}; + + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/cdc.h b/lib/fwlib/ram_lib/usb_otg/include/cdc.h new file mode 100644 index 0000000..a374ff9 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/cdc.h @@ -0,0 +1,211 @@ + +//#include "../otg/osk/sys-support.h" //ModifiedByJD + +/* + * USB Communications Device Class (CDC) definitions + * + * CDC says how to talk to lots of different types of network adapters, + * notably ethernet adapters and various modems. It's used mostly with + * firmware based USB peripherals. + */ + +#define USB_CDC_SUBCLASS_ACM 0x02 +#define USB_CDC_SUBCLASS_ETHERNET 0x06 +#define USB_CDC_SUBCLASS_WHCM 0x08 +#define USB_CDC_SUBCLASS_DMM 0x09 +#define USB_CDC_SUBCLASS_MDLM 0x0a +#define USB_CDC_SUBCLASS_OBEX 0x0b + +#define USB_CDC_PROTO_NONE 0 + +#define USB_CDC_ACM_PROTO_AT_V25TER 1 +#define USB_CDC_ACM_PROTO_AT_PCCA101 2 +#define USB_CDC_ACM_PROTO_AT_PCCA101_WAKE 3 +#define USB_CDC_ACM_PROTO_AT_GSM 4 +#define USB_CDC_ACM_PROTO_AT_3G 5 +#define USB_CDC_ACM_PROTO_AT_CDMA 6 +#define USB_CDC_ACM_PROTO_VENDOR 0xff + +/*-------------------------------------------------------------------------*/ +//#define UPACKED __attribute__ ((packed)) +#define UPACKED +/* + * Class-Specific descriptors ... there are a couple dozen of them + */ + +#define USB_CDC_HEADER_TYPE 0x00 /* header_desc */ +#define USB_CDC_CALL_MANAGEMENT_TYPE 0x01 /* call_mgmt_descriptor */ +#define USB_CDC_ACM_TYPE 0x02 /* acm_descriptor */ +#define USB_CDC_UNION_TYPE 0x06 /* union_desc */ +#define USB_CDC_COUNTRY_TYPE 0x07 +#define USB_CDC_NETWORK_TERMINAL_TYPE 0x0a /* network_terminal_desc */ +#define USB_CDC_ETHERNET_TYPE 0x0f /* ether_desc */ +#define USB_CDC_WHCM_TYPE 0x11 +#define USB_CDC_MDLM_TYPE 0x12 /* mdlm_desc */ +#define USB_CDC_MDLM_DETAIL_TYPE 0x13 /* mdlm_detail_desc */ +#define USB_CDC_DMM_TYPE 0x14 +#define USB_CDC_OBEX_TYPE 0x15 + +//ModifiedByJD (>>>) modify the data type to useable ones. +/* "Header Functional Descriptor" from CDC spec 5.2.3.1 */ +struct usb_cdc_header_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u16 bcdCDC; +} UPACKED; + +/* "Call Management Descriptor" from CDC spec 5.2.3.2 */ +struct usb_cdc_call_mgmt_descriptor { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 bmCapabilities; +#define USB_CDC_CALL_MGMT_CAP_CALL_MGMT 0x01 +#define USB_CDC_CALL_MGMT_CAP_DATA_INTF 0x02 + + u8 bDataInterface; +} UPACKED; + +/* "Abstract Control Management Descriptor" from CDC spec 5.2.3.3 */ +struct usb_cdc_acm_descriptor { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 bmCapabilities; +} UPACKED; + +/* "Union Functional Descriptor" from CDC spec 5.2.3.8 */ +struct usb_cdc_union_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 bMasterInterface0; + u8 bSlaveInterface0; + /* ... and there could be other slave interfaces */ +} UPACKED; + +/* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */ +struct usb_cdc_network_terminal_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 bEntityId; + u8 iName; + u8 bChannelIndex; + u8 bPhysicalInterface; +} UPACKED; + +/* "Ethernet Networking Functional Descriptor" from CDC spec 5.2.3.16 */ +struct usb_cdc_ether_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u8 iMACAddress; + u32 bmEthernetStatistics; + u16 wMaxSegmentSize; + u16 wNumberMCFilters; + u8 bNumberPowerFilters; +} UPACKED; + +/* "MDLM Functional Descriptor" from CDC WMC spec 6.7.2.3 */ +struct usb_cdc_mdlm_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + u16 bcdVersion; + u8 bGUID[16]; +}UPACKED; + +/* "MDLM Detail Functional Descriptor" from CDC WMC spec 6.7.2.4 */ +struct usb_cdc_mdlm_detail_desc { + u8 bLength; + u8 bDescriptorType; + u8 bDescriptorSubType; + + /* type is associated with mdlm_desc.bGUID */ + u8 bGuidDescriptorType; + u8 bDetailData[0]; +} UPACKED; + +/*-------------------------------------------------------------------------*/ + +/* + * Class-Specific Control Requests (6.2) + * + * section 3.6.2.1 table 4 has the ACM profile, for modems. + * section 3.8.2 table 10 has the ethernet profile. + * + * Microsoft's RNDIS stack for Ethernet is a vendor-specific CDC ACM variant, + * heavily dependent on the encapsulated (proprietary) command mechanism. + */ + +#define USB_CDC_SEND_ENCAPSULATED_COMMAND 0x00 +#define USB_CDC_GET_ENCAPSULATED_RESPONSE 0x01 +#define USB_CDC_REQ_SET_LINE_CODING 0x20 +#define USB_CDC_REQ_GET_LINE_CODING 0x21 +#define USB_CDC_REQ_SET_CONTROL_LINE_STATE 0x22 +#define USB_CDC_REQ_SEND_BREAK 0x23 +#define USB_CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40 +#define USB_CDC_SET_ETHERNET_PM_PATTERN_FILTER 0x41 +#define USB_CDC_GET_ETHERNET_PM_PATTERN_FILTER 0x42 +#define USB_CDC_SET_ETHERNET_PACKET_FILTER 0x43 +#define USB_CDC_GET_ETHERNET_STATISTIC 0x44 + +/* Line Coding Structure from CDC spec 6.2.13 */ +struct usb_cdc_line_coding { + u32 dwDTERate; + u8 bCharFormat; +#define USB_CDC_1_STOP_BITS 0 +#define USB_CDC_1_5_STOP_BITS 1 +#define USB_CDC_2_STOP_BITS 2 + + u8 bParityType; +#define USB_CDC_NO_PARITY 0 +#define USB_CDC_ODD_PARITY 1 +#define USB_CDC_EVEN_PARITY 2 +#define USB_CDC_MARK_PARITY 3 +#define USB_CDC_SPACE_PARITY 4 + + u8 bDataBits; +} UPACKED; + +/* table 62; bits in multicast filter */ +#define USB_CDC_PACKET_TYPE_PROMISCUOUS (1 << 0) +#define USB_CDC_PACKET_TYPE_ALL_MULTICAST (1 << 1) /* no filter */ +#define USB_CDC_PACKET_TYPE_DIRECTED (1 << 2) +#define USB_CDC_PACKET_TYPE_BROADCAST (1 << 3) +#define USB_CDC_PACKET_TYPE_MULTICAST (1 << 4) /* filtered */ + + +/*-------------------------------------------------------------------------*/ + +/* + * Class-Specific Notifications (6.3) sent by interrupt transfers + * + * section 3.8.2 table 11 of the CDC spec lists Ethernet notifications + * section 3.6.2.1 table 5 specifies ACM notifications, accepted by RNDIS + * RNDIS also defines its own bit-incompatible notifications + */ + +#define USB_CDC_NOTIFY_NETWORK_CONNECTION 0x00 +#define USB_CDC_NOTIFY_RESPONSE_AVAILABLE 0x01 +#define USB_CDC_NOTIFY_SERIAL_STATE 0x20 +#define USB_CDC_NOTIFY_SPEED_CHANGE 0x2a + +struct usb_cdc_notification { + u8 bmRequestType; + u8 bNotificationType; + u16 wValue; + u16 wIndex; + u16 wLength; +}UPACKED; +//ModifiedByJD (<<<) + diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_list.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_list.h new file mode 100644 index 0000000..89cc325 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_list.h @@ -0,0 +1,594 @@ +/* $OpenBSD: queue.h,v 1.26 2004/05/04 16:59:32 grange Exp $ */ +/* $NetBSD: queue.h,v 1.11 1996/05/16 05:17:14 mycroft Exp $ */ + +/* + * Copyright (c) 1991, 1993 + * The Regents of the University of California. 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 University 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 REGENTS 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 REGENTS 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. + * + * @(#)queue.h 8.5 (Berkeley) 8/20/94 + */ + +#ifndef _DWC_LIST_H_ +#define _DWC_LIST_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/** @file + * + * This file defines linked list operations. It is derived from BSD with + * only the MACRO names being prefixed with DWC_. This is because a few of + * these names conflict with those on Linux. For documentation on use, see the + * inline comments in the source code. The original license for this source + * code applies and is preserved in the dwc_list.h source file. + */ + +/* + * This file defines five types of data structures: singly-linked lists, + * lists, simple queues, tail queues, and circular queues. + * + * + * A singly-linked list is headed by a single forward pointer. The elements + * are singly linked for minimum space and pointer manipulation overhead at + * the expense of O(n) removal for arbitrary elements. New elements can be + * added to the list after an existing element or at the head of the list. + * Elements being removed from the head of the list should use the explicit + * macro for this purpose for optimum efficiency. A singly-linked list may + * only be traversed in the forward direction. Singly-linked lists are ideal + * for applications with large datasets and few or no removals or for + * implementing a LIFO queue. + * + * A list is headed by a single forward pointer (or an array of forward + * pointers for a hash table header). The elements are doubly linked + * so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before + * or after an existing element or at the head of the list. A list + * may only be traversed in the forward direction. + * + * A simple queue is headed by a pair of pointers, one the head of the + * list and the other to the tail of the list. The elements are singly + * linked to save space, so elements can only be removed from the + * head of the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the + * list. A simple queue may only be traversed in the forward direction. + * + * A tail queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or + * after an existing element, at the head of the list, or at the end of + * the list. A tail queue may be traversed in either direction. + * + * A circle queue is headed by a pair of pointers, one to the head of the + * list and the other to the tail of the list. The elements are doubly + * linked so that an arbitrary element can be removed without a need to + * traverse the list. New elements can be added to the list before or after + * an existing element, at the head of the list, or at the end of the list. + * A circle queue may be traversed in either direction, but has a more + * complex end of list detection. + * + * For details on the use of these macros, see the queue(3) manual page. + */ + +/* + * Double-linked List. + */ + +typedef struct dwc_list_link { + struct dwc_list_link *next; + struct dwc_list_link *prev; +} dwc_list_link_t; + +#define DWC_LIST_INIT(link) do { \ + (link)->next = (link); \ + (link)->prev = (link); \ +} while (0) + +#define DWC_LIST_FIRST(link) ((link)->next) +#define DWC_LIST_LAST(link) ((link)->prev) +#define DWC_LIST_END(link) (link) +#define DWC_LIST_NEXT(link) ((link)->next) +#define DWC_LIST_PREV(link) ((link)->prev) +#define DWC_LIST_EMPTY(link) \ + (DWC_LIST_FIRST(link) == DWC_LIST_END(link)) +#define DWC_LIST_ENTRY(link, type, field) \ + (type *)((uint8_t *)(link) - (size_t)(&((type *)0)->field)) + +#if 0 +#define DWC_LIST_INSERT_HEAD(list, link) do { \ + (link)->next = (list)->next; \ + (link)->prev = (list); \ + (list)->next->prev = (link); \ + (list)->next = (link); \ +} while (0) + +#define DWC_LIST_INSERT_TAIL(list, link) do { \ + (link)->next = (list); \ + (link)->prev = (list)->prev; \ + (list)->prev->next = (link); \ + (list)->prev = (link); \ +} while (0) +#else +#define DWC_LIST_INSERT_HEAD(list, link) do { \ + dwc_list_link_t *__next__ = (list)->next; \ + __next__->prev = (link); \ + (link)->next = __next__; \ + (link)->prev = (list); \ + (list)->next = (link); \ +} while (0) + +#define DWC_LIST_INSERT_TAIL(list, link) do { \ + dwc_list_link_t *__prev__ = (list)->prev; \ + (list)->prev = (link); \ + (link)->next = (list); \ + (link)->prev = __prev__; \ + __prev__->next = (link); \ +} while (0) +#endif + +#if 0 +static inline void __list_add(struct list_head *new, + struct list_head *prev, + struct list_head *next) +{ + next->prev = new; + new->next = next; + new->prev = prev; + prev->next = new; +} + +static inline void list_add(struct list_head *new, struct list_head *head) +{ + __list_add(new, head, head->next); +} + +static inline void list_add_tail(struct list_head *new, struct list_head *head) +{ + __list_add(new, head->prev, head); +} + +static inline void __list_del(struct list_head * prev, struct list_head * next) +{ + next->prev = prev; + prev->next = next; +} + +static inline void list_del(struct list_head *entry) +{ + __list_del(entry->prev, entry->next); + entry->next = LIST_POISON1; + entry->prev = LIST_POISON2; +} +#endif + +#define DWC_LIST_REMOVE(link) do { \ + (link)->next->prev = (link)->prev; \ + (link)->prev->next = (link)->next; \ +} while (0) + +#define DWC_LIST_REMOVE_INIT(link) do { \ + DWC_LIST_REMOVE(link); \ + DWC_LIST_INIT(link); \ +} while (0) + +#define DWC_LIST_MOVE_HEAD(list, link) do { \ + DWC_LIST_REMOVE(link); \ + DWC_LIST_INSERT_HEAD(list, link); \ +} while (0) + +#define DWC_LIST_MOVE_TAIL(list, link) do { \ + DWC_LIST_REMOVE(link); \ + DWC_LIST_INSERT_TAIL(list, link); \ +} while (0) + +#define DWC_LIST_FOREACH(var, list) \ + for((var) = DWC_LIST_FIRST(list); \ + (var) != DWC_LIST_END(list); \ + (var) = DWC_LIST_NEXT(var)) + +#define DWC_LIST_FOREACH_SAFE(var, var2, list) \ + for((var) = DWC_LIST_FIRST(list), (var2) = DWC_LIST_NEXT(var); \ + (var) != DWC_LIST_END(list); \ + (var) = (var2), (var2) = DWC_LIST_NEXT(var2)) + +#define DWC_LIST_FOREACH_REVERSE(var, list) \ + for((var) = DWC_LIST_LAST(list); \ + (var) != DWC_LIST_END(list); \ + (var) = DWC_LIST_PREV(var)) + +/* + * Singly-linked List definitions. + */ +#define DWC_SLIST_HEAD(name, type) \ +struct name { \ + struct type *slh_first; /* first element */ \ +} + +#define DWC_SLIST_HEAD_INITIALIZER(head) \ + { NULL } + +#define DWC_SLIST_ENTRY(type) \ +struct { \ + struct type *sle_next; /* next element */ \ +} + +/* + * Singly-linked List access methods. + */ +#define DWC_SLIST_FIRST(head) ((head)->slh_first) +#define DWC_SLIST_END(head) NULL +#define DWC_SLIST_EMPTY(head) (SLIST_FIRST(head) == SLIST_END(head)) +#define DWC_SLIST_NEXT(elm, field) ((elm)->field.sle_next) + +#define DWC_SLIST_FOREACH(var, head, field) \ + for((var) = SLIST_FIRST(head); \ + (var) != SLIST_END(head); \ + (var) = SLIST_NEXT(var, field)) + +#define DWC_SLIST_FOREACH_PREVPTR(var, varp, head, field) \ + for((varp) = &SLIST_FIRST((head)); \ + ((var) = *(varp)) != SLIST_END(head); \ + (varp) = &SLIST_NEXT((var), field)) + +/* + * Singly-linked List functions. + */ +#define DWC_SLIST_INIT(head) { \ + SLIST_FIRST(head) = SLIST_END(head); \ +} + +#define DWC_SLIST_INSERT_AFTER(slistelm, elm, field) do { \ + (elm)->field.sle_next = (slistelm)->field.sle_next; \ + (slistelm)->field.sle_next = (elm); \ +} while (0) + +#define DWC_SLIST_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.sle_next = (head)->slh_first; \ + (head)->slh_first = (elm); \ +} while (0) + +#define DWC_SLIST_REMOVE_NEXT(head, elm, field) do { \ + (elm)->field.sle_next = (elm)->field.sle_next->field.sle_next; \ +} while (0) + +#define DWC_SLIST_REMOVE_HEAD(head, field) do { \ + (head)->slh_first = (head)->slh_first->field.sle_next; \ +} while (0) + +#define DWC_SLIST_REMOVE(head, elm, type, field) do { \ + if ((head)->slh_first == (elm)) { \ + SLIST_REMOVE_HEAD((head), field); \ + } \ + else { \ + struct type *curelm = (head)->slh_first; \ + while( curelm->field.sle_next != (elm) ) \ + curelm = curelm->field.sle_next; \ + curelm->field.sle_next = \ + curelm->field.sle_next->field.sle_next; \ + } \ +} while (0) + +/* + * Simple queue definitions. + */ +#define DWC_SIMPLEQ_HEAD(name, type) \ +struct name { \ + struct type *sqh_first; /* first element */ \ + struct type **sqh_last; /* addr of last next element */ \ +} + +#define DWC_SIMPLEQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).sqh_first } + +#define DWC_SIMPLEQ_ENTRY(type) \ +struct { \ + struct type *sqe_next; /* next element */ \ +} + +/* + * Simple queue access methods. + */ +#define DWC_SIMPLEQ_FIRST(head) ((head)->sqh_first) +#define DWC_SIMPLEQ_END(head) NULL +#define DWC_SIMPLEQ_EMPTY(head) (SIMPLEQ_FIRST(head) == SIMPLEQ_END(head)) +#define DWC_SIMPLEQ_NEXT(elm, field) ((elm)->field.sqe_next) + +#define DWC_SIMPLEQ_FOREACH(var, head, field) \ + for((var) = SIMPLEQ_FIRST(head); \ + (var) != SIMPLEQ_END(head); \ + (var) = SIMPLEQ_NEXT(var, field)) + +/* + * Simple queue functions. + */ +#define DWC_SIMPLEQ_INIT(head) do { \ + (head)->sqh_first = NULL; \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (0) + +#define DWC_SIMPLEQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.sqe_next = (head)->sqh_first) == NULL) \ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (head)->sqh_first = (elm); \ +} while (0) + +#define DWC_SIMPLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.sqe_next = NULL; \ + *(head)->sqh_last = (elm); \ + (head)->sqh_last = &(elm)->field.sqe_next; \ +} while (0) + +#define DWC_SIMPLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.sqe_next = (listelm)->field.sqe_next) == NULL)\ + (head)->sqh_last = &(elm)->field.sqe_next; \ + (listelm)->field.sqe_next = (elm); \ +} while (0) + +#define DWC_SIMPLEQ_REMOVE_HEAD(head, field) do { \ + if (((head)->sqh_first = (head)->sqh_first->field.sqe_next) == NULL) \ + (head)->sqh_last = &(head)->sqh_first; \ +} while (0) + +/* + * Tail queue definitions. + */ +#define DWC_TAILQ_HEAD(name, type) \ +struct name { \ + struct type *tqh_first; /* first element */ \ + struct type **tqh_last; /* addr of last next element */ \ +} + +#define DWC_TAILQ_HEAD_INITIALIZER(head) \ + { NULL, &(head).tqh_first } + +#define DWC_TAILQ_ENTRY(type) \ +struct { \ + struct type *tqe_next; /* next element */ \ + struct type **tqe_prev; /* address of previous next element */ \ +} + +/* + * tail queue access methods + */ +#define DWC_TAILQ_FIRST(head) ((head)->tqh_first) +#define DWC_TAILQ_END(head) NULL +#define DWC_TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) +#define DWC_TAILQ_LAST(head, headname) \ + (*(((struct headname *)((head)->tqh_last))->tqh_last)) +/* XXX */ +#define DWC_TAILQ_PREV(elm, headname, field) \ + (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) +#define DWC_TAILQ_EMPTY(head) \ + (TAILQ_FIRST(head) == TAILQ_END(head)) + +#define DWC_TAILQ_FOREACH(var, head, field) \ + for((var) = TAILQ_FIRST(head); \ + (var) != TAILQ_END(head); \ + (var) = TAILQ_NEXT(var, field)) + +#define DWC_TAILQ_FOREACH_REVERSE(var, head, headname, field) \ + for((var) = TAILQ_LAST(head, headname); \ + (var) != TAILQ_END(head); \ + (var) = TAILQ_PREV(var, headname, field)) + +/* + * Tail queue functions. + */ +#define DWC_TAILQ_INIT(head) do { \ + (head)->tqh_first = NULL; \ + (head)->tqh_last = &(head)->tqh_first; \ +} while (0) + +#define DWC_TAILQ_INSERT_HEAD(head, elm, field) do { \ + if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ + (head)->tqh_first->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (head)->tqh_first = (elm); \ + (elm)->field.tqe_prev = &(head)->tqh_first; \ +} while (0) + +#define DWC_TAILQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.tqe_next = NULL; \ + (elm)->field.tqe_prev = (head)->tqh_last; \ + *(head)->tqh_last = (elm); \ + (head)->tqh_last = &(elm)->field.tqe_next; \ +} while (0) + +#define DWC_TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ + if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ + (elm)->field.tqe_next->field.tqe_prev = \ + &(elm)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm)->field.tqe_next; \ + (listelm)->field.tqe_next = (elm); \ + (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ +} while (0) + +#define DWC_TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ + (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ + (elm)->field.tqe_next = (listelm); \ + *(listelm)->field.tqe_prev = (elm); \ + (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ +} while (0) + +#define DWC_TAILQ_REMOVE(head, elm, field) do { \ + if (((elm)->field.tqe_next) != NULL) \ + (elm)->field.tqe_next->field.tqe_prev = \ + (elm)->field.tqe_prev; \ + else \ + (head)->tqh_last = (elm)->field.tqe_prev; \ + *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ +} while (0) + +#define DWC_TAILQ_REPLACE(head, elm, elm2, field) do { \ + if (((elm2)->field.tqe_next = (elm)->field.tqe_next) != NULL) \ + (elm2)->field.tqe_next->field.tqe_prev = \ + &(elm2)->field.tqe_next; \ + else \ + (head)->tqh_last = &(elm2)->field.tqe_next; \ + (elm2)->field.tqe_prev = (elm)->field.tqe_prev; \ + *(elm2)->field.tqe_prev = (elm2); \ +} while (0) + +/* + * Circular queue definitions. + */ +#define DWC_CIRCLEQ_HEAD(name, type) \ +struct name { \ + struct type *cqh_first; /* first element */ \ + struct type *cqh_last; /* last element */ \ +} + +#define DWC_CIRCLEQ_HEAD_INITIALIZER(head) \ + { DWC_CIRCLEQ_END(&head), DWC_CIRCLEQ_END(&head) } + +#define DWC_CIRCLEQ_ENTRY(type) \ +struct { \ + struct type *cqe_next; /* next element */ \ + struct type *cqe_prev; /* previous element */ \ +} + +/* + * Circular queue access methods + */ +#define DWC_CIRCLEQ_FIRST(head) ((head)->cqh_first) +#define DWC_CIRCLEQ_LAST(head) ((head)->cqh_last) +#define DWC_CIRCLEQ_END(head) ((void *)(head)) +#define DWC_CIRCLEQ_NEXT(elm, field) ((elm)->field.cqe_next) +#define DWC_CIRCLEQ_PREV(elm, field) ((elm)->field.cqe_prev) +#define DWC_CIRCLEQ_EMPTY(head) \ + (DWC_CIRCLEQ_FIRST(head) == DWC_CIRCLEQ_END(head)) + +#define DWC_CIRCLEQ_EMPTY_ENTRY(elm, field) (((elm)->field.cqe_next == NULL) && ((elm)->field.cqe_prev == NULL)) + +#define DWC_CIRCLEQ_FOREACH(var, head, field) \ + for((var) = DWC_CIRCLEQ_FIRST(head); \ + (var) != DWC_CIRCLEQ_END(head); \ + (var) = DWC_CIRCLEQ_NEXT(var, field)) + +#define DWC_CIRCLEQ_FOREACH_SAFE(var, var2, head, field) \ + for((var) = DWC_CIRCLEQ_FIRST(head), var2 = DWC_CIRCLEQ_NEXT(var, field); \ + (var) != DWC_CIRCLEQ_END(head); \ + (var) = var2, var2 = DWC_CIRCLEQ_NEXT(var, field)) + +#define DWC_CIRCLEQ_FOREACH_REVERSE(var, head, field) \ + for((var) = DWC_CIRCLEQ_LAST(head); \ + (var) != DWC_CIRCLEQ_END(head); \ + (var) = DWC_CIRCLEQ_PREV(var, field)) + +/* + * Circular queue functions. + */ +#define DWC_CIRCLEQ_INIT(head) do { \ + (head)->cqh_first = DWC_CIRCLEQ_END(head); \ + (head)->cqh_last = DWC_CIRCLEQ_END(head); \ +} while (0) + +#define DWC_CIRCLEQ_INIT_ENTRY(elm, field) do { \ + (elm)->field.cqe_next = NULL; \ + (elm)->field.cqe_prev = NULL; \ +} while (0) + +#define DWC_CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm)->field.cqe_next; \ + (elm)->field.cqe_prev = (listelm); \ + if ((listelm)->field.cqe_next == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm); \ + else \ + (listelm)->field.cqe_next->field.cqe_prev = (elm); \ + (listelm)->field.cqe_next = (elm); \ +} while (0) + +#define DWC_CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ + (elm)->field.cqe_next = (listelm); \ + (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ + if ((listelm)->field.cqe_prev == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm); \ + else \ + (listelm)->field.cqe_prev->field.cqe_next = (elm); \ + (listelm)->field.cqe_prev = (elm); \ +} while (0) + +#define DWC_CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ + (elm)->field.cqe_next = (head)->cqh_first; \ + (elm)->field.cqe_prev = DWC_CIRCLEQ_END(head); \ + if ((head)->cqh_last == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm); \ + else \ + (head)->cqh_first->field.cqe_prev = (elm); \ + (head)->cqh_first = (elm); \ +} while (0) + +#define DWC_CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ + (elm)->field.cqe_next = DWC_CIRCLEQ_END(head); \ + (elm)->field.cqe_prev = (head)->cqh_last; \ + if ((head)->cqh_first == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm); \ + else \ + (head)->cqh_last->field.cqe_next = (elm); \ + (head)->cqh_last = (elm); \ +} while (0) + +#define DWC_CIRCLEQ_REMOVE(head, elm, field) do { \ + if ((elm)->field.cqe_next == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_last = (elm)->field.cqe_prev; \ + else \ + (elm)->field.cqe_next->field.cqe_prev = \ + (elm)->field.cqe_prev; \ + if ((elm)->field.cqe_prev == DWC_CIRCLEQ_END(head)) \ + (head)->cqh_first = (elm)->field.cqe_next; \ + else \ + (elm)->field.cqe_prev->field.cqe_next = \ + (elm)->field.cqe_next; \ +} while (0) + +#define DWC_CIRCLEQ_REMOVE_INIT(head, elm, field) do { \ + DWC_CIRCLEQ_REMOVE(head, elm, field); \ + DWC_CIRCLEQ_INIT_ENTRY(elm, field); \ +} while (0) + +#define DWC_CIRCLEQ_REPLACE(head, elm, elm2, field) do { \ + if (((elm2)->field.cqe_next = (elm)->field.cqe_next) == \ + DWC_CIRCLEQ_END(head)) \ + (head).cqh_last = (elm2); \ + else \ + (elm2)->field.cqe_next->field.cqe_prev = (elm2); \ + if (((elm2)->field.cqe_prev = (elm)->field.cqe_prev) == \ + DWC_CIRCLEQ_END(head)) \ + (head).cqh_first = (elm2); \ + else \ + (elm2)->field.cqe_prev->field.cqe_next = (elm2); \ +} while (0) + +#ifdef __cplusplus +} +#endif + +#endif /* _DWC_LIST_H_ */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_os.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_os.h new file mode 100644 index 0000000..fd79775 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_os.h @@ -0,0 +1,1098 @@ +/* ========================================================================= + * $File: //dwh/usb_iip/dev/software/dwc_common_port_2/dwc_os.h $ + * $Revision: #14 $ + * $Date: 2010/11/04 $ + * $Change: 1621695 $ + * + * Synopsys Portability Library Software and documentation + * (hereinafter, "Software") is an Unsupported proprietary work of + * Synopsys, Inc. unless otherwise expressly agreed to in writing + * between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product + * under any End User Software License Agreement or Agreement for + * Licensed Product with Synopsys or any supplement thereto. You are + * permitted to use and redistribute this Software in source and binary + * forms, with or without modification, provided that redistributions + * of source code must retain this notice. You may not view, use, + * disclose, copy or distribute this file or any information contained + * herein except pursuant to this license grant from Synopsys. If you + * do not agree with this notice, including the disclaimer below, then + * you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" + * BASIS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE HEREBY DISCLAIMED. IN NO EVENT SHALL + * SYNOPSYS 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 _DWC_OS_H_ +#define _DWC_OS_H_ + +#include "basic_types.h" +#include +//#include "va_list.h" +#include + +#include "diag.h" +#include "dwc_otg_dbg.h" + +#ifdef __cplusplus +extern "C" { +#endif +extern +_LONG_CALL_ u32 +DiagPrintf( + IN const char *fmt, ... +); + + +/** @file + * + * DWC portability library, low level os-wrapper functions + * + */ + +/* These basic types need to be defined by some OS header file or custom header + * file for your specific target architecture. + * + * uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t + * + * Any custom or alternate header file must be added and enabled here. + */ +#if 0//8195A_PORTING +#else +#define DWC_OS_PORTING 1 +#endif + +#include "errno.h" + +/** @name Primitive Types and Values */ + +/** We define a boolean type for consistency. Can be either YES or NO */ +typedef uint8_t dwc_bool_t; +#define YES 1 +#define NO 0 + +/** Compile Flag Definition */ +#define __OTG_LITTLE_ENDIAN +#undef DWC_CRYPTOLIB +#undef DWC_DEBUG_REGS +#undef DWC_DEBUG_MEMORY +#undef DWC_UTFLIB +#undef CONFIG_DEBUG_MUTEXES + + + +#ifdef DWC_OS_PORTING + +/** @name Error Codes */ +#define DWC_E_INVALID EINVAL +#define DWC_E_NO_MEMORY ENOMEM +#define DWC_E_NO_DEVICE ENODEV +#define DWC_E_NOT_SUPPORTED EOPNOTSUPP +#define DWC_E_TIMEOUT ETIMEDOUT +#define DWC_E_BUSY EBUSY +#define DWC_E_AGAIN EAGAIN +#define DWC_E_RESTART ERESTART +#define DWC_E_ABORT ECONNABORTED +#define DWC_E_SHUTDOWN ESHUTDOWN +#define DWC_E_NO_DATA ENODATA +#define DWC_E_DISCONNECT ECONNRESET +#define DWC_E_UNKNOWN EINVAL +#define DWC_E_NO_STREAM_RES ENOSR +#define DWC_E_COMMUNICATION ECOMM +#define DWC_E_OVERFLOW EOVERFLOW +#define DWC_E_PROTOCOL EPROTO +#define DWC_E_IN_PROGRESS EINPROGRESS +#define DWC_E_PIPE EPIPE +#define DWC_E_IO EIO +#define DWC_E_NO_SPACE ENOSPC + +#else + +/** @name Error Codes */ +#define DWC_E_INVALID 1001 +#define DWC_E_NO_MEMORY 1002 +#define DWC_E_NO_DEVICE 1003 +#define DWC_E_NOT_SUPPORTED 1004 +#define DWC_E_TIMEOUT 1005 +#define DWC_E_BUSY 1006 +#define DWC_E_AGAIN 1007 +#define DWC_E_RESTART 1008 +#define DWC_E_ABORT 1009 +#define DWC_E_SHUTDOWN 1010 +#define DWC_E_NO_DATA 1011 +#define DWC_E_DISCONNECT 2000 +#define DWC_E_UNKNOWN 3000 +#define DWC_E_NO_STREAM_RES 4001 +#define DWC_E_COMMUNICATION 4002 +#define DWC_E_OVERFLOW 4003 +#define DWC_E_PROTOCOL 4004 +#define DWC_E_IN_PROGRESS 4005 +#define DWC_E_PIPE 4006 +#define DWC_E_IO 4007 +#define DWC_E_NO_SPACE 4008 + +#endif + + +/** @name Tracing/Logging Functions + * + * These function provide the capability to add tracing, debugging, and error + * messages, as well exceptions as assertions. The WUDEV uses these + * extensively. These could be logged to the main console, the serial port, an + * internal buffer, etc. These functions could also be no-op if they are too + * expensive on your system. By default undefining the DEBUG macro already + * no-ops some of these functions. */ + +/** Returns non-zero if in interrupt context. */ +extern _LONG_CALL_ dwc_bool_t DWC_IN_IRQ(void); +#define dwc_in_irq DWC_IN_IRQ + +/** Returns "IRQ" if DWC_IN_IRQ is true. */ +extern _LONG_CALL_ char *dwc_irq(void); + +/** Returns non-zero if in bottom-half context. */ +extern _LONG_CALL_ dwc_bool_t DWC_IN_BH(void); +#define dwc_in_bh DWC_IN_BH + +/** Returns "BH" if DWC_IN_BH is true. */ +extern _LONG_CALL_ char *dwc_bh(void); + +/** + * A vprintf() clone. Just call vprintf if you've got it. + */ +#if 0 +extern void DWC_VPRINTF(char *format, va_list args); +#define dwc_vprintf DWC_VPRINTF +#endif +/** + * A vsnprintf() clone. Just call vprintf if you've got it. + */ +extern _LONG_CALL_ int DWC_VSNPRINTF(char *str, int size, char *format, va_list args); +#define dwc_vsnprintf DWC_VSNPRINTF + +/** + * printf() clone. Just call printf if you've go it. + */ +#define DWC_PRINTF(format...) do{ DBG_8195A_OTG(format); }while(0) + +//extern void DWC_PRINTF(char *format, ...) +/* This provides compiler level static checking of the parameters if you're + * using GCC. */ +#if 0 +#ifdef __GNUC__ + __attribute__ ((format(printf, 1, 2))); +#else + ; +#endif +#endif +#define dwc_printf DWC_PRINTF + +/** + * sprintf() clone. Just call sprintf if you've got it. + */ +extern _LONG_CALL_ int DWC_SPRINTF(char *string, char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(prvDiagPrintf, 2, 3))); +#else + ; +#endif +#define dwc_sprintf DWC_SPRINTF + +/** + * snprintf() clone. Just call snprintf if you've got it. + */ +extern _LONG_CALL_ int DWC_SNPRINTF(char *string, int size, char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(prvDiagPrintf, 3, 4))); +#else + ; +#endif +#define dwc_snprintf DWC_SNPRINTF + +/** + * Prints a WARNING message. On systems that don't differentiate between + * warnings and regular log messages, just print it. Indicates that something + * may be wrong with the driver. Works like printf(). + * + * Use the DWC_WARN macro to call this function. + */ +extern _LONG_CALL_ void __DWC_WARN(char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(prvDiagPrintf, 1, 2))); +#else + ; +#endif + +/** + * Prints an error message. On systems that don't differentiate between errors + * and regular log messages, just print it. Indicates that something went wrong + * with the driver. Works like printf(). + * + * Use the DWC_ERROR macro to call this function. + */ +extern _LONG_CALL_ void __DWC_ERROR(char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(prvDiagPrintf, 1, 2))); +#else + ; +#endif + +/** + * Prints an exception error message and takes some user-defined action such as + * print out a backtrace or trigger a breakpoint. Indicates that something went + * abnormally wrong with the driver such as programmer error, or other + * exceptional condition. It should not be ignored so even on systems without + * printing capability, some action should be taken to notify the developer of + * it. Works like printf(). + */ +extern _LONG_CALL_ void DWC_EXCEPTION(char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(prvDiagPrintf, 1, 2))); +#else + ; +#endif +#define dwc_exception DWC_EXCEPTION + +#ifdef OTGDEBUG +/** + * Prints out a debug message. Used for logging/trace messages. + * + * Use the DWC_DEBUG macro to call this function + */ +extern _LONG_CALL_ void __DWC_DEBUG(char *format, ...); +#if 0 +#ifdef __GNUC__ + __attribute__ ((format(printf, 1, 2))); +#else + ; +#endif +#endif +#else +#define __DWC_DEBUG(...) +#endif + +/** + * Prints out a Debug message. + */ +#define DWC_DEBUG(fmt, args...) DBG_8195A_OTG("\n\rDWC_DEBUG:" fmt, ## args) +#define dwc_debug DWC_DEBUG +/** + * Prints out an informative message. + */ +#define DWC_INFO(_format, _args...) DBG_8195A_OTG_INFO("INFO:%s: " _format "\n", \ + dwc_irq(), ## _args) +#define dwc_info DWC_INFO +/** + * Prints out a warning message. + */ +#define DWC_WARN(_format, _args...) DBG_8195A_OTG_WARN("WARN:%s: " _format "\n", \ + dwc_irq(), ## _args) +#define dwc_warn DWC_WARN +/** + * Prints out an error message. + */ +#define DWC_ERROR(_format, _args...) DBG_8195A_OTG_ERR("ERROR:%s: " _format "\n", \ + dwc_irq(), ## _args) + +#define dwc_error DWC_ERROR + +#define DWC_PROTO_ERROR(_format, _args...) DBG_8195A_OTG_ERR("ERROR:%s: " _format "\n", \ + dwc_irq(), ## _args) +#define dwc_proto_error DWC_PROTO_ERROR + +#ifdef OTGDEBUG +/** Prints out a exception error message if the _expr expression fails. Disabled + * if DEBUG is not enabled. */ +#define DWC_ASSERT(_expr, _format, _args...) do { \ + if (!(_expr)) { DBG_8195A_OTG("%s: " _format "\n", dwc_irq(), \ + ## _args); } \ + } while (0) +#else +#define DWC_ASSERT(_x...) +#endif +#define dwc_assert DWC_ASSERT + + +/** @name Byte Ordering + * The following functions are for conversions between processor's byte ordering + * and specific ordering you want. + */ + +/** Converts 32 bit data in CPU byte ordering to little endian. */ +extern _LONG_CALL_ uint32_t DWC_CPU_TO_LE32(uint32_t *p); +#define dwc_cpu_to_le32 DWC_CPU_TO_LE32 + +/** Converts 32 bit data in CPU byte orderint to big endian. */ +extern _LONG_CALL_ uint32_t DWC_CPU_TO_BE32(uint32_t *p); +#define dwc_cpu_to_be32 DWC_CPU_TO_BE32 + +/** Converts 32 bit little endian data to CPU byte ordering. */ +extern _LONG_CALL_ uint32_t DWC_LE32_TO_CPU(uint32_t *p); +#define dwc_le32_to_cpu DWC_LE32_TO_CPU + +/** Converts 32 bit big endian data to CPU byte ordering. */ +extern _LONG_CALL_ uint32_t DWC_BE32_TO_CPU(uint32_t *p); +#define dwc_be32_to_cpu DWC_BE32_TO_CPU + +/** Converts 16 bit data in CPU byte ordering to little endian. */ +extern _LONG_CALL_ uint16_t DWC_CPU_TO_LE16(uint16_t *p); +#define dwc_cpu_to_le16 DWC_CPU_TO_LE16 + +/** Converts 16 bit data in CPU byte orderint to big endian. */ +extern _LONG_CALL_ uint16_t DWC_CPU_TO_BE16(uint16_t *p); +#define dwc_cpu_to_be16 DWC_CPU_TO_BE16 + +/** Converts 16 bit little endian data to CPU byte ordering. */ +extern _LONG_CALL_ uint16_t DWC_LE16_TO_CPU(uint16_t *p); +#define dwc_le16_to_cpu DWC_LE16_TO_CPU + +/** Converts 16 bit bi endian data to CPU byte ordering. */ +extern _LONG_CALL_ uint16_t DWC_BE16_TO_CPU(uint16_t *p); +#define dwc_be16_to_cpu DWC_BE16_TO_CPU + + +/** @name Register Read/Write + * + * The following six functions should be implemented to read/write registers of + * 32-bit and 64-bit sizes. All modules use this to read/write register values. + * The reg value is a pointer to the register calculated from the void *base + * variable passed into the driver when it is started. */ + + +/** @cond */ + +/** @name Some convenience MACROS used internally. Define DWC_DEBUG_REGS to log the + * register writes. */ + +#ifdef DWC_OS_PORTING + +# ifdef DWC_DEBUG_REGS +XXXX +#define dwc_define_read_write_reg_n(_reg,_container_type) \ +static inline uint32_t dwc_read_##_reg##_n(_container_type *container, int num) { \ + return DWC_READ_REG32(&container->regs->_reg[num]); \ +} \ +static inline void dwc_write_##_reg##_n(_container_type *container, int num, uint32_t data) { \ + DWC_DEBUG("WRITING %8s[%d]: %p: %08x", #_reg, num, \ + &(((uint32_t*)container->regs->_reg)[num]), data); \ + DWC_WRITE_REG32(&(((uint32_t*)container->regs->_reg)[num]), data); \ +} + +#define dwc_define_read_write_reg(_reg,_container_type) \ +static inline uint32_t dwc_read_##_reg(_container_type *container) { \ + return DWC_READ_REG32(&container->regs->_reg); \ +} \ +static inline void dwc_write_##_reg(_container_type *container, uint32_t data) { \ + DWC_DEBUG("WRITING %11s: %p: %08x", #_reg, &container->regs->_reg, data); \ + DWC_WRITE_REG32(&container->regs->_reg, data); \ +} + +# else /* DWC_DEBUG_REGS */ + +#define dwc_define_read_write_reg_n(_reg,_container_type) \ +static inline uint32_t dwc_read_##_reg##_n(_container_type *container, int num) { \ + return DWC_READ_REG32(&container->regs->_reg[num]); \ +} \ +static inline void dwc_write_##_reg##_n(_container_type *container, int num, uint32_t data) { \ + DWC_WRITE_REG32(&(((uint32_t*)container->regs->_reg)[num]), data); \ +} + +#define dwc_define_read_write_reg(_reg,_container_type) \ +static inline uint32_t dwc_read_##_reg(_container_type *container) { \ + return DWC_READ_REG32(&container->regs->_reg); \ +} \ +static inline void dwc_write_##_reg(_container_type *container, uint32_t data) { \ + DWC_WRITE_REG32(&container->regs->_reg, data); \ +} + +# endif /* DWC_DEBUG_REGS */ + +#endif /* DWC_OS_PORTING */ + + +/** @endcond */ + + +#ifdef DWC_CRYPTOLIB +XXX +/** @name Crypto Functions + * + * These are the low-level cryptographic functions used by the driver. */ + +/** Perform AES CBC */ +extern _LONG_CALL_ int DWC_AES_CBC(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t iv[16], uint8_t *out); +#define dwc_aes_cbc DWC_AES_CBC + +/** Fill the provided buffer with random bytes. These should be cryptographic grade random numbers. */ +extern _LONG_CALL_ void DWC_RANDOM_BYTES(uint8_t *buffer, uint32_t length); +#define dwc_random_bytes DWC_RANDOM_BYTES + +/** Perform the SHA-256 hash function */ +extern _LONG_CALL_ int DWC_SHA256(uint8_t *message, uint32_t len, uint8_t *out); +#define dwc_sha256 DWC_SHA256 + +/** Calculated the HMAC-SHA256 */ +extern _LONG_CALL_ int DWC_HMAC_SHA256(uint8_t *message, uint32_t messagelen, uint8_t *key, uint32_t keylen, uint8_t *out); +#define dwc_hmac_sha256 DWC_HMAC_SHA256 + +#endif /* DWC_CRYPTOLIB */ + + +/** @name Memory Allocation + * + * These function provide access to memory allocation. There are only 2 DMA + * functions and 3 Regular memory functions that need to be implemented. None + * of the memory debugging routines need to be implemented. The allocation + * routines all ZERO the contents of the memory. + * + * Defining DWC_DEBUG_MEMORY turns on memory debugging and statistic gathering. + * This checks for memory leaks, keeping track of alloc/free pairs. It also + * keeps track of how much memory the driver is using at any given time. */ + +#define DWC_PAGE_SIZE 4096 +#define DWC_PAGE_OFFSET(addr) (((uint32_t)addr) & 0xfff) +#define DWC_PAGE_ALIGNED(addr) ((((uint32_t)addr) & 0xfff) == 0) + +#define DWC_INVALID_DMA_ADDR 0x0 + +#ifdef DWC_OS_PORTING +/** Type for a DMA address */ +typedef dma_addr_t dwc_dma_t; +#endif + +#if 0//defined(DWC_FREEBSD) || defined(DWC_NETBSD) +typedef bus_addr_t dwc_dma_t; +#endif + +#if 0//def DWC_FREEBSD +typedef struct dwc_dmactx { + struct device *dev; + bus_dma_tag_t dma_tag; + bus_dmamap_t dma_map; + bus_addr_t dma_paddr; + void *dma_vaddr; +} dwc_dmactx_t; +#endif + +#if 0//def DWC_NETBSD +typedef struct dwc_dmactx { + struct device *dev; + bus_dma_tag_t dma_tag; + bus_dmamap_t dma_map; + bus_dma_segment_t segs[1]; + int nsegs; + bus_addr_t dma_paddr; + void *dma_vaddr; +} dwc_dmactx_t; +#endif + +/* @todo these functions will be added in the future */ +#if 0 +/** + * Creates a DMA pool from which you can allocate DMA buffers. Buffers + * allocated from this pool will be guaranteed to meet the size, alignment, and + * boundary requirements specified. + * + * @param[in] size Specifies the size of the buffers that will be allocated from + * this pool. + * @param[in] align Specifies the byte alignment requirements of the buffers + * allocated from this pool. Must be a power of 2. + * @param[in] boundary Specifies the N-byte boundary that buffers allocated from + * this pool must not cross. + * + * @returns A pointer to an internal opaque structure which is not to be + * accessed outside of these library functions. Use this handle to specify + * which pools to allocate/free DMA buffers from and also to destroy the pool, + * when you are done with it. + */ +extern dwc_pool_t *DWC_DMA_POOL_CREATE(uint32_t size, uint32_t align, uint32_t boundary); + +/** + * Destroy a DMA pool. All buffers allocated from that pool must be freed first. + */ +extern void DWC_DMA_POOL_DESTROY(dwc_pool_t *pool); + +/** + * Allocate a buffer from the specified DMA pool and zeros its contents. + */ +extern void *DWC_DMA_POOL_ALLOC(dwc_pool_t *pool, uint64_t *dma_addr); + +/** + * Free a previously allocated buffer from the DMA pool. + */ +extern void DWC_DMA_POOL_FREE(dwc_pool_t *pool, void *vaddr, void *daddr); +#endif + +/** Allocates a DMA capable buffer and zeroes its contents. */ +extern _LONG_CALL_ void *__DWC_DMA_ALLOC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr); + +/** Allocates a DMA capable buffer and zeroes its contents in atomic contest */ +extern _LONG_CALL_ void *__DWC_DMA_ALLOC_ATOMIC(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr); + +/** Frees a previously allocated buffer. */ +extern _LONG_CALL_ void __DWC_DMA_FREE(void *dma_ctx, uint32_t size, void *virt_addr, dwc_dma_t dma_addr); + +/** Allocates a block of memory and zeroes its contents. */ +extern _LONG_CALL_ void *__DWC_ALLOC(void *mem_ctx, uint32_t size); + +/** Allocates a block of memory and zeroes its contents, in an atomic manner + * which can be used inside interrupt context. The size should be sufficiently + * small, a few KB at most, such that failures are not likely to occur. Can just call + * __DWC_ALLOC if it is atomic. */ +extern _LONG_CALL_ void *__DWC_ALLOC_ATOMIC(void *mem_ctx, uint32_t size); + +/** Frees a previously allocated buffer. */ +extern _LONG_CALL_ void __DWC_FREE(void *mem_ctx, void *addr); + +#ifndef DWC_DEBUG_MEMORY + +#define DWC_ALLOC(_size_) __DWC_ALLOC(NULL, _size_) +#define DWC_ALLOC_ATOMIC(_size_) __DWC_ALLOC_ATOMIC(NULL, _size_) +#define DWC_FREE(_addr_) __DWC_FREE(NULL, _addr_) + +#ifdef DWC_OS_PORTING +#define DWC_DMA_ALLOC(_size_,_dma_) __DWC_DMA_ALLOC(NULL, _size_, _dma_) +#define DWC_DMA_ALLOC_ATOMIC(_size_,_dma_) __DWC_DMA_ALLOC_ATOMIC(NULL, _size_,_dma_) +#define DWC_DMA_FREE(_size_,_virt_,_dma_) __DWC_DMA_FREE(NULL, _size_, _virt_, _dma_) +#endif + +#if defined(DWC_FREEBSD) || defined(DWC_NETBSD) +XXX +#define DWC_DMA_ALLOC __DWC_DMA_ALLOC +#define DWC_DMA_FREE __DWC_DMA_FREE +#endif + +#else /* DWC_DEBUG_MEMORY */ +XXX +extern void *dwc_alloc_debug(void *mem_ctx, uint32_t size, char const *func, int line); +extern void *dwc_alloc_atomic_debug(void *mem_ctx, uint32_t size, char const *func, int line); +extern void dwc_free_debug(void *mem_ctx, void *addr, char const *func, int line); +extern void *dwc_dma_alloc_debug(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr, + char const *func, int line); +extern void *dwc_dma_alloc_atomic_debug(void *dma_ctx, uint32_t size, dwc_dma_t *dma_addr, + char const *func, int line); +extern void dwc_dma_free_debug(void *dma_ctx, uint32_t size, void *virt_addr, + dwc_dma_t dma_addr, char const *func, int line); + +extern int dwc_memory_debug_start(void *mem_ctx); +extern void dwc_memory_debug_stop(void); +extern void dwc_memory_debug_report(void); + +#endif /* DWC_DEBUG_MEMORY */ + +#define dwc_alloc(_ctx_,_size_) DWC_ALLOC(_size_) +#define dwc_alloc_atomic(_ctx_,_size_) DWC_ALLOC_ATOMIC(_size_) +#define dwc_free(_ctx_,_addr_) DWC_FREE(_addr_) + +#ifdef DWC_OS_PORTING +/* Linux doesn't need any extra parameters for DMA buffer allocation, so we + * just throw away the DMA context parameter. + */ +#define dwc_dma_alloc(_ctx_,_size_,_dma_) DWC_DMA_ALLOC(_size_, _dma_) +#define dwc_dma_alloc_atomic(_ctx_,_size_,_dma_) DWC_DMA_ALLOC_ATOMIC(_size_, _dma_) +#define dwc_dma_free(_ctx_,_size_,_virt_,_dma_) DWC_DMA_FREE(_size_, _virt_, _dma_) +#endif + +#if 0//defined(DWC_FREEBSD) || defined(DWC_NETBSD) +/** BSD needs several extra parameters for DMA buffer allocation, so we pass + * them in using the DMA context parameter. + */ +#define dwc_dma_alloc DWC_DMA_ALLOC +#define dwc_dma_free DWC_DMA_FREE +#endif + + +/** @name Memory and String Processing */ + +/** memset() clone */ +extern _LONG_CALL_ void *DWC_MEMSET(void *dest, uint8_t byte, uint32_t size); +#define dwc_memset DWC_MEMSET + +/** memcpy() clone */ +extern _LONG_CALL_ void *DWC_MEMCPY(void *dest, void const *src, uint32_t size); +#define dwc_memcpy DWC_MEMCPY + +/** memmove() clone */ +extern _LONG_CALL_ void *DWC_MEMMOVE(void *dest, void *src, uint32_t size); +#define dwc_memmove DWC_MEMMOVE + +/** memcmp() clone */ +extern _LONG_CALL_ int DWC_MEMCMP(void *m1, void *m2, uint32_t size); +#define dwc_memcmp DWC_MEMCMP + +/** strcmp() clone */ +extern _LONG_CALL_ int DWC_STRCMP(void *s1, void *s2); +#define dwc_strcmp DWC_STRCMP + +/** strncmp() clone */ +extern _LONG_CALL_ int DWC_STRNCMP(void *s1, void *s2, uint32_t size); +#define dwc_strncmp DWC_STRNCMP + +/** strlen() clone, for NULL terminated ASCII strings */ +extern _LONG_CALL_ int DWC_STRLEN(char const *str); +#define dwc_strlen DWC_STRLEN + +/** strcpy() clone, for NULL terminated ASCII strings */ +extern _LONG_CALL_ char *DWC_STRCPY(char *to, const char *from); +#define dwc_strcpy DWC_STRCPY + +/** strdup() clone. If you wish to use memory allocation debugging, this + * implementation of strdup should use the DWC_* memory routines instead of + * calling a predefined strdup. Otherwise the memory allocated by this routine + * will not be seen by the debugging routines. */ +extern _LONG_CALL_ char *DWC_STRDUP(char const *str); +#define dwc_strdup(_ctx_,_str_) DWC_STRDUP(_str_) + +/** NOT an atoi() clone. Read the description carefully. Returns an integer + * converted from the string str in base 10 unless the string begins with a "0x" + * in which case it is base 16. String must be a NULL terminated sequence of + * ASCII characters and may optionally begin with whitespace, a + or -, and a + * "0x" prefix if base 16. The remaining characters must be valid digits for + * the number and end with a NULL character. If any invalid characters are + * encountered or it returns with a negative error code and the results of the + * conversion are undefined. On sucess it returns 0. Overflow conditions are + * undefined. An example implementation using atoi() can be referenced from the + * Linux implementation. */ +extern _LONG_CALL_ int DWC_ATOI(const char *str, int32_t *value); +#define dwc_atoi DWC_ATOI + +/** Same as above but for unsigned. */ +extern _LONG_CALL_ int DWC_ATOUI(const char *str, uint32_t *value); +#define dwc_atoui DWC_ATOUI + +#ifdef DWC_UTFLIB +XXX +/** This routine returns a UTF16LE unicode encoded string from a UTF8 string. */ +extern int DWC_UTF8_TO_UTF16LE(uint8_t const *utf8string, uint16_t *utf16string, unsigned len); +#define dwc_utf8_to_utf16le DWC_UTF8_TO_UTF16LE +#endif + + +/** @name Wait queues + * + * Wait queues provide a means of synchronizing between threads or processes. A + * process can block on a waitq if some condition is not true, waiting for it to + * become true. When the waitq is triggered all waiting process will get + * unblocked and the condition will be check again. Waitqs should be triggered + * every time a condition can potentially change.*/ +//struct dwc_waitq; + +/** Type for a waitq */ +//typedef struct dwc_waitq dwc_waitq_t; + +/** The type of waitq condition callback function. This is called every time + * condition is evaluated. */ +//typedef int (*dwc_waitq_condition_t)(void *data); + +/** Allocate a waitq */ +//extern dwc_waitq_t *DWC_WAITQ_ALLOC(void); +//#define dwc_waitq_alloc(_ctx_) DWC_WAITQ_ALLOC() + +/** Free a waitq */ +//extern void DWC_WAITQ_FREE(dwc_waitq_t *wq); +//#define dwc_waitq_free DWC_WAITQ_FREE + +/** Check the condition and if it is false, block on the waitq. When unblocked, check the + * condition again. The function returns when the condition becomes true. The return value + * is 0 on condition true, DWC_WAITQ_ABORTED on abort or killed, or DWC_WAITQ_UNKNOWN on error. */ +//extern int32_t DWC_WAITQ_WAIT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, void *data); +//#define dwc_waitq_wait DWC_WAITQ_WAIT + +/** Check the condition and if it is false, block on the waitq. When unblocked, + * check the condition again. The function returns when the condition become + * true or the timeout has passed. The return value is 0 on condition true or + * DWC_TIMED_OUT on timeout, or DWC_WAITQ_ABORTED, or DWC_WAITQ_UNKNOWN on + * error. */ +//extern int32_t DWC_WAITQ_WAIT_TIMEOUT(dwc_waitq_t *wq, dwc_waitq_condition_t cond, +// void *data, int32_t msecs); +//#define dwc_waitq_wait_timeout DWC_WAITQ_WAIT_TIMEOUT + +/** Trigger a waitq, unblocking all processes. This should be called whenever a condition + * has potentially changed. */ +//extern void DWC_WAITQ_TRIGGER(dwc_waitq_t *wq); +//#define dwc_waitq_trigger DWC_WAITQ_TRIGGER + +/** Unblock all processes waiting on the waitq with an ABORTED result. */ +//extern void DWC_WAITQ_ABORT(dwc_waitq_t *wq); +//#define dwc_waitq_abort DWC_WAITQ_ABORT + + +/** @name Threads + * + * A thread must be explicitly stopped. It must check DWC_THREAD_SHOULD_STOP + * whenever it is woken up, and then return. The DWC_THREAD_STOP function + * returns the value from the thread. + */ + +/** @name Work queues + * + * Workqs are used to queue a callback function to be called at some later time, + * in another thread. */ +//struct dwc_workq; + +/** Type for a workq */ +typedef struct dwc_workq dwc_workq_t; + +/** The type of the callback function to be called. */ +//typedef void (*dwc_work_callback_t)(void *data); + +/** Allocate a workq */ +//extern dwc_workq_t *DWC_WORKQ_ALLOC(char *name); +//#define dwc_workq_alloc(_ctx_,_name_) DWC_WORKQ_ALLOC(_name_) + +/** Free a workq. All work must be completed before being freed. */ +//extern void DWC_WORKQ_FREE(dwc_workq_t *workq); +//#define dwc_workq_free DWC_WORKQ_FREE + +/** Schedule a callback on the workq, passing in data. The function will be + * scheduled at some later time. */ +//extern void DWC_WORKQ_SCHEDULE(dwc_workq_t *workq, dwc_work_callback_t cb, +// void *data, char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(printf, 4, 5))); +#else + ; +#endif +//#define dwc_workq_schedule DWC_WORKQ_SCHEDULE + +/** Schedule a callback on the workq, that will be called until at least + * given number miliseconds have passed. */ +//extern void DWC_WORKQ_SCHEDULE_DELAYED(dwc_workq_t *workq, dwc_work_callback_t cb, +// void *data, uint32_t time, char *format, ...) +#if 0//def __GNUC__ + __attribute__ ((format(printf, 5, 6))); +#else + ; +#endif +//#define dwc_workq_schedule_delayed DWC_WORKQ_SCHEDULE_DELAYED + +/** The number of processes in the workq */ +//extern int DWC_WORKQ_PENDING(dwc_workq_t *workq); +//#define dwc_workq_pending DWC_WORKQ_PENDING + +/** Blocks until all the work in the workq is complete or timed out. Returns < + * 0 on timeout. */ +//extern int DWC_WORKQ_WAIT_WORK_DONE(dwc_workq_t *workq, int timeout); +//#define dwc_workq_wait_work_done DWC_WORKQ_WAIT_WORK_DONE + + + + +/** @name Tasklets + * + */ + +//struct dwc_tasklet; + +/** Type for a tasklet */ +typedef struct dwc_tasklet dwc_tasklet_t; + +/** The type of the callback function to be called */ +//typedef void (*dwc_tasklet_callback_t)(void *data); + +/** Allocates a tasklet */ +//extern dwc_tasklet_t *DWC_TASK_ALLOC(char *name, dwc_tasklet_callback_t cb, void *data); +//#define dwc_task_alloc(_ctx_,_name_,_cb_,_data_) DWC_TASK_ALLOC(_name_, _cb_, _data_) + +/** Frees a tasklet */ +//extern void DWC_TASK_FREE(dwc_tasklet_t *task); +//#define dwc_task_free DWC_TASK_FREE + +/** Schedules a tasklet to run */ +//extern void DWC_TASK_SCHEDULE(dwc_tasklet_t *task); +//#define dwc_task_schedule DWC_TASK_SCHEDULE + + +/** @name Timer + * + * Callbacks must be small and atomic. + */ +struct dwc_timer; + +/** Type for a timer */ +typedef struct dwc_timer dwc_timer_t; + +/** The type of the callback function to be called */ +typedef void (*dwc_timer_callback_t)(void *data); + +/** Allocates a timer */ +extern _LONG_CALL_ dwc_timer_t *DWC_TIMER_ALLOC(char *name, dwc_timer_callback_t cb, void *data); +#define dwc_timer_alloc(_ctx_,_name_,_cb_,_data_) DWC_TIMER_ALLOC(_name_,_cb_,_data_) + +/** Frees a timer */ +extern _LONG_CALL_ void DWC_TIMER_FREE(dwc_timer_t *timer); +#define dwc_timer_free DWC_TIMER_FREE + +/** Schedules the timer to run at time ms from now. And will repeat at every + * repeat_interval msec therafter + * + * Modifies a timer that is still awaiting execution to a new expiration time. + * The mod_time is added to the old time. */ +extern _LONG_CALL_ void DWC_TIMER_SCHEDULE(dwc_timer_t *timer, uint32_t time); +#define dwc_timer_schedule DWC_TIMER_SCHEDULE + +/** Disables the timer from execution. */ +extern _LONG_CALL_ void DWC_TIMER_CANCEL(dwc_timer_t *timer); +#define dwc_timer_cancel DWC_TIMER_CANCEL + + +/** @name Spinlocks + * + * These locks are used when the work between the lock/unlock is atomic and + * short. Interrupts are also disabled during the lock/unlock and thus they are + * suitable to lock between interrupt/non-interrupt context. They also lock + * between processes if you have multiple CPUs or Preemption. If you don't have + * multiple CPUS or Preemption, then the you can simply implement the + * DWC_SPINLOCK and DWC_SPINUNLOCK to disable and enable interrupts. Because + * the work between the lock/unlock is atomic, the process context will never + * change, and so you never have to lock between processes. */ + +struct dwc_spinlock; + +/** Type for a spinlock */ +typedef struct dwc_spinlock dwc_spinlock_t; + +/** Type for the 'flags' argument to spinlock funtions */ +typedef unsigned long dwc_irqflags_t; + +/** Returns an initialized lock variable. This function should allocate and + * initialize the OS-specific data structure used for locking. This data + * structure is to be used for the DWC_LOCK and DWC_UNLOCK functions and should + * be freed by the DWC_FREE_LOCK when it is no longer used. */ +extern _LONG_CALL_ dwc_spinlock_t *DWC_SPINLOCK_ALLOC(void); +#define dwc_spinlock_alloc(_ctx_) DWC_SPINLOCK_ALLOC() + +/** Frees an initialized lock variable. */ +extern _LONG_CALL_ void DWC_SPINLOCK_FREE(dwc_spinlock_t *lock); +#define dwc_spinlock_free(_ctx_,_lock_) DWC_SPINLOCK_FREE(_lock_) + +/** Disables interrupts and blocks until it acquires the lock. + * + * @param lock Pointer to the spinlock. + * @param flags Unsigned long for irq flags storage. + */ +extern _LONG_CALL_ void DWC_SPINLOCK_IRQSAVE(dwc_spinlock_t *lock, dwc_irqflags_t *flags); +#define dwc_spinlock_irqsave DWC_SPINLOCK_IRQSAVE + +/** Re-enables the interrupt and releases the lock. + * + * @param lock Pointer to the spinlock. + * @param flags Unsigned long for irq flags storage. Must be the same as was + * passed into DWC_LOCK. + */ +extern _LONG_CALL_ void DWC_SPINUNLOCK_IRQRESTORE(dwc_spinlock_t *lock, dwc_irqflags_t flags); +#define dwc_spinunlock_irqrestore DWC_SPINUNLOCK_IRQRESTORE + +/** Blocks until it acquires the lock. + * + * @param lock Pointer to the spinlock. + */ +extern _LONG_CALL_ void DWC_SPINLOCK(dwc_spinlock_t *lock); +#define dwc_spinlock DWC_SPINLOCK + +/** Releases the lock. + * + * @param lock Pointer to the spinlock. + */ +extern _LONG_CALL_ void DWC_SPINUNLOCK(dwc_spinlock_t *lock); +#define dwc_spinunlock DWC_SPINUNLOCK + + +/** @name Mutexes + * + * Unlike spinlocks Mutexes lock only between processes and the work between the + * lock/unlock CAN block, therefore it CANNOT be called from interrupt context. + */ + +struct dwc_mutex; + +/** Type for a mutex */ +typedef struct dwc_mutex dwc_mutex_t; + +/* For Linux Mutex Debugging make it inline because the debugging routines use + * the symbol to determine recursive locking. This makes it falsely think + * recursive locking occurs. */ +#if defined(DWC_OS_PORTING) && defined(CONFIG_DEBUG_MUTEXES) +#define DWC_MUTEX_ALLOC_LINUX_DEBUG(__mutexp) ({ \ + __mutexp = (dwc_mutex_t *)DWC_ALLOC(sizeof(struct mutex)); \ + mutex_init((struct mutex *)__mutexp); \ +}) +#endif + +/** Allocate a mutex */ +extern _LONG_CALL_ dwc_mutex_t *DWC_MUTEX_ALLOC(void); +#define dwc_mutex_alloc(_ctx_) DWC_MUTEX_ALLOC() + +/* For memory leak debugging when using Linux Mutex Debugging */ +#if defined(DWC_OS_PORTING) && defined(CONFIG_DEBUG_MUTEXES) +XXX +#define DWC_MUTEX_FREE(__mutexp) do { \ + mutex_destroy((struct mutex *)__mutexp); \ + DWC_FREE(__mutexp); \ +} while(0) +#else +/** Free a mutex */ +extern _LONG_CALL_ void DWC_MUTEX_FREE(dwc_mutex_t *mutex); +#define dwc_mutex_free(_ctx_,_mutex_) DWC_MUTEX_FREE(_mutex_) +#endif + +/** Lock a mutex */ +extern _LONG_CALL_ void DWC_MUTEX_LOCK(dwc_mutex_t *mutex); +#define dwc_mutex_lock DWC_MUTEX_LOCK + +/** Non-blocking lock returns 1 on successful lock. */ +extern _LONG_CALL_ int DWC_MUTEX_TRYLOCK(dwc_mutex_t *mutex); +#define dwc_mutex_trylock DWC_MUTEX_TRYLOCK + +/** Unlock a mutex */ +extern _LONG_CALL_ void DWC_MUTEX_UNLOCK(dwc_mutex_t *mutex); +#define dwc_mutex_unlock DWC_MUTEX_UNLOCK + + +/** @name Time */ + +/** Microsecond delay. + * + * @param usecs Microseconds to delay. + */ +extern _LONG_CALL_ void DWC_UDELAY(uint32_t usecs); +#define dwc_udelay DWC_UDELAY + +/** Millisecond delay. + * + * @param msecs Milliseconds to delay. + */ +extern _LONG_CALL_ void DWC_MDELAY(uint32_t msecs); +#define dwc_mdelay DWC_MDELAY + +/** Non-busy waiting. + * Sleeps for specified number of milliseconds. + * + * @param msecs Milliseconds to sleep. + */ +extern _LONG_CALL_ void DWC_MSLEEP(uint32_t msecs); +#define dwc_msleep DWC_MSLEEP + +extern _LONG_CALL_ void DWC_ENTER_CRITICAL(VOID); +extern _LONG_CALL_ void DWC_EXIT_CRITICAL(VOID); + +/** + * Returns number of milliseconds since boot. + */ +//extern uint32_t DWC_TIME(void); +//#define dwc_time DWC_TIME + + + + +/* @mainpage DWC Portability and Common Library + * + * This is the documentation for the DWC Portability and Common Library. + * + * @section intro Introduction + * + * The DWC Portability library consists of wrapper calls and data structures to + * all low-level functions which are typically provided by the OS. The WUDEV + * driver uses only these functions. In order to port the WUDEV driver, only + * the functions in this library need to be re-implemented, with the same + * behavior as documented here. + * + * The Common library consists of higher level functions, which rely only on + * calling the functions from the DWC Portability library. These common + * routines are shared across modules. Some of the common libraries need to be + * used directly by the driver programmer when porting WUDEV. Such as the + * parameter and notification libraries. + * + * @section low Portability Library OS Wrapper Functions + * + * Any function starting with DWC and in all CAPS is a low-level OS-wrapper that + * needs to be implemented when porting, for example DWC_MUTEX_ALLOC(). All of + * these functions are included in the dwc_os.h file. + * + * There are many functions here covering a wide array of OS services. Please + * see dwc_os.h for details, and implementation notes for each function. + * + * @section common Common Library Functions + * + * Any function starting with dwc and in all lowercase is a common library + * routine. These functions have a portable implementation and do not need to + * be reimplemented when porting. The common routines can be used by any + * driver, and some must be used by the end user to control the drivers. For + * example, you must use the Parameter common library in order to set the + * parameters in the WUDEV module. + * + * The common libraries consist of the following: + * + * - Connection Contexts - Used internally and can be used by end-user. See dwc_cc.h + * - Parameters - Used internally and can be used by end-user. See dwc_params.h + * - Notifications - Used internally and can be used by end-user. See dwc_notifier.h + * - Lists - Used internally and can be used by end-user. See dwc_list.h + * - Memory Debugging - Used internally and can be used by end-user. See dwc_os.h + * - Modpow - Used internally only. See dwc_modpow.h + * - DH - Used internally only. See dwc_dh.h + * - Crypto - Used internally only. See dwc_crypto.h + * + * + * @section prereq Prerequistes For dwc_os.h + * @subsection types Data Types + * + * The dwc_os.h file assumes that several low-level data types are pre defined for the + * compilation environment. These data types are: + * + * - uint8_t - unsigned 8-bit data type + * - int8_t - signed 8-bit data type + * - uint16_t - unsigned 16-bit data type + * - int16_t - signed 16-bit data type + * - uint32_t - unsigned 32-bit data type + * - int32_t - signed 32-bit data type + * - uint64_t - unsigned 64-bit data type + * - int64_t - signed 64-bit data type + * + * Ensure that these are defined before using dwc_os.h. The easiest way to do + * that is to modify the top of the file to include the appropriate header. + * This is already done for the Linux environment. If the DWC_OS_PORTING macro is + * defined, the correct header will be added. A standard header is + * also used for environments where standard C headers are available. + * + * @subsection stdarg Variable Arguments + * + * Variable arguments are provided by a standard C header . it is + * available in Both the Linux and ANSI C enviornment. An equivalent must be + * provided in your enviornment in order to use dwc_os.h with the debug and + * tracing message functionality. + * + * @subsection thread Threading + * + * WUDEV Core must be run on an operating system that provides for multiple + * threads/processes. Threading can be implemented in many ways, even in + * embedded systems without an operating system. At the bare minimum, the + * system should be able to start any number of processes at any time to handle + * special work. It need not be a pre-emptive system. Process context can + * change upon a call to a blocking function. The hardware interrupt context + * that calls the module's ISR() function must be differentiable from process + * context, even if your processes are impemented via a hardware interrupt. + * Further locking mechanism between process must exist (or be implemented), and + * process context must have a way to disable interrupts for a period of time to + * lock them out. If all of this exists, the functions in dwc_os.h related to + * threading should be able to be implemented with the defined behavior. + * + */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _DWC_OS_H_ */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_adp.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_adp.h new file mode 100644 index 0000000..eafa399 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_adp.h @@ -0,0 +1,82 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_adp.h $ + * $Revision: #8 $ + * $Date: 2013/04/09 $ + * $Change: 2201932 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 __DWC_OTG_ADP_H__ +#define __DWC_OTG_ADP_H__ + +/** + * @file + * + * This file contains the Attach Detect Protocol interfaces and defines + * (functions) and structures for Linux. + * + */ + +#define DWC_OTG_ADP_UNATTACHED 0 +#define DWC_OTG_ADP_ATTACHED 1 +#define DWC_OTG_ADP_UNKOWN 2 +#define HOST_RTIM_THRESHOLD 5 +#define DEVICE_RTIM_THRESHOLD 3 + +typedef struct dwc_otg_adp { + uint32_t adp_started; + uint32_t initial_probe; + int32_t probe_timer_values[2]; + uint32_t probe_enabled; + uint32_t sense_enabled; + dwc_timer_t *sense_timer; + uint32_t sense_timer_started; + dwc_timer_t *vbuson_timer; + uint32_t vbuson_timer_started; + uint32_t attached; + uint32_t probe_counter; + uint32_t gpwrdn; +} dwc_otg_adp_t; + +/** + * Attach Detect Protocol functions + */ + +extern void dwc_otg_adp_write_reg(dwc_otg_core_if_t * core_if, uint32_t value); +extern uint32_t dwc_otg_adp_read_reg(dwc_otg_core_if_t * core_if); +extern uint32_t dwc_otg_adp_probe_start(dwc_otg_core_if_t * core_if); +extern uint32_t dwc_otg_adp_sense_start(dwc_otg_core_if_t * core_if); +extern uint32_t dwc_otg_adp_probe_stop(dwc_otg_core_if_t * core_if); +extern uint32_t dwc_otg_adp_sense_stop(dwc_otg_core_if_t * core_if); +extern void dwc_otg_adp_start(dwc_otg_core_if_t * core_if, uint8_t is_host); +extern void dwc_otg_adp_init(dwc_otg_core_if_t * core_if); +extern void dwc_otg_adp_remove(dwc_otg_core_if_t * core_if); +extern int32_t dwc_otg_adp_handle_intr(dwc_otg_core_if_t * core_if); +extern int32_t dwc_otg_adp_handle_srp_intr(dwc_otg_core_if_t * core_if); + +#endif //__DWC_OTG_ADP_H__ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_attr.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_attr.h new file mode 100644 index 0000000..06a4e77 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_attr.h @@ -0,0 +1,85 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_attr.h $ + * $Revision: #13 $ + * $Date: 2010/06/21 $ + * $Change: 1532021 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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. + * ========================================================================== */ + +#if !defined(__DWC_OTG_ATTR_H__) +#define __DWC_OTG_ATTR_H__ + +/** @file + * This file contains the interface to the Linux device attributes. + */ +extern struct device_attribute dev_attr_regoffset; +extern struct device_attribute dev_attr_regvalue; + +extern struct device_attribute dev_attr_mode; +extern struct device_attribute dev_attr_hnpcapable; +extern struct device_attribute dev_attr_srpcapable; +extern struct device_attribute dev_attr_hnp; +extern struct device_attribute dev_attr_srp; +extern struct device_attribute dev_attr_buspower; +extern struct device_attribute dev_attr_bussuspend; +extern struct device_attribute dev_attr_mode_ch_tim_en; +extern struct device_attribute dev_attr_fr_interval; +extern struct device_attribute dev_attr_busconnected; +extern struct device_attribute dev_attr_gotgctl; +extern struct device_attribute dev_attr_gusbcfg; +extern struct device_attribute dev_attr_grxfsiz; +extern struct device_attribute dev_attr_gnptxfsiz; +extern struct device_attribute dev_attr_gpvndctl; +extern struct device_attribute dev_attr_ggpio; +extern struct device_attribute dev_attr_guid; +extern struct device_attribute dev_attr_gsnpsid; +extern struct device_attribute dev_attr_devspeed; +extern struct device_attribute dev_attr_enumspeed; +extern struct device_attribute dev_attr_hptxfsiz; +extern struct device_attribute dev_attr_hprt0; +#ifdef CONFIG_USB_DWC_OTG_LPM +extern struct device_attribute dev_attr_lpm_response; +extern struct device_attribute devi_attr_sleep_status; +#endif + +void dwc_otg_attr_create( +#ifdef LM_INTERFACE + struct lm_device *dev +#elif PCI_INTERFACE + struct pci_dev *dev +#endif + ); + +void dwc_otg_attr_remove( +#ifdef LM_INTERFACE + struct lm_device *dev +#elif PCI_INTERFACE + struct pci_dev *dev +#endif + ); +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_cil.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_cil.h new file mode 100644 index 0000000..f563209 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_cil.h @@ -0,0 +1,1499 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.h $ + * $Revision: #128 $ + * $Date: 2013/05/16 $ + * $Change: 2231774 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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. + * ========================================================================== */ + +#if !defined(__DWC_CIL_H__) +#define __DWC_CIL_H__ + +#include "dwc_list.h" +#include "dwc_otg_dbg.h" +#include "dwc_otg_regs.h" + +#include "dwc_otg_core_if.h" +#include "dwc_otg_adp.h" +#include "rtl8195a_otg.h" +/** + * @file + * This file contains the interface to the Core Interface Layer. + */ +//#define DWC_DEVICE_ONLY 0 + +#ifdef DWC_UTE_CFI + +#define MAX_DMA_DESCS_PER_EP 256 + +/** + * Enumeration for the data buffer mode + */ +typedef enum _data_buffer_mode { + BM_STANDARD = 0, /* data buffer is in normal mode */ + BM_SG = 1, /* data buffer uses the scatter/gather mode */ + BM_CONCAT = 2, /* data buffer uses the concatenation mode */ + BM_CIRCULAR = 3, /* data buffer uses the circular DMA mode */ + BM_ALIGN = 4 /* data buffer is in buffer alignment mode */ +} data_buffer_mode_e; +#endif //DWC_UTE_CFI + +/** Macros defined for DWC OTG HW Release version */ + +#define OTG_CORE_REV_2_60a 0x4F54260A +#define OTG_CORE_REV_2_71a 0x4F54271A +#define OTG_CORE_REV_2_72a 0x4F54272A +#define OTG_CORE_REV_2_80a 0x4F54280A +#define OTG_CORE_REV_2_81a 0x4F54281A +#define OTG_CORE_REV_2_90a 0x4F54290A +#define OTG_CORE_REV_2_91a 0x4F54291A +#define OTG_CORE_REV_2_92a 0x4F54292A +#define OTG_CORE_REV_2_93a 0x4F54293A +#define OTG_CORE_REV_2_94a 0x4F54294A +#define OTG_CORE_REV_3_00a 0x4F54300A +#define OTG_CORE_REV_3_10a 0x4F54310A + +/** + * Information for each ISOC packet. + */ +typedef struct iso_pkt_info { + uint32_t offset; + uint32_t length; + int32_t status; +} iso_pkt_info_t; + +/** + * The dwc_ep structure represents the state of a single + * endpoint when acting in device mode. It contains the data items + * needed for an endpoint to be activated and transfer packets. + */ +typedef struct dwc_ep { + /** EP number used for register address lookup */ + uint8_t num; + /** EP direction 0 = OUT */ + unsigned is_in:1; + /** EP active. */ + unsigned active:1; + + /** + * Periodic Tx FIFO # for IN EPs For INTR EP set to 0 to use non-periodic + * Tx FIFO. If dedicated Tx FIFOs are enabled Tx FIFO # FOR IN EPs*/ + unsigned tx_fifo_num:4; + /** EP type: 0 - Control, 1 - ISOC, 2 - BULK, 3 - INTR */ + unsigned type:2; +#define DWC_OTG_EP_TYPE_CONTROL 0 +#define DWC_OTG_EP_TYPE_ISOC 1 +#define DWC_OTG_EP_TYPE_BULK 2 +#define DWC_OTG_EP_TYPE_INTR 3 + + /** DATA start PID for INTR and BULK EP */ + unsigned data_pid_start:1; + /** Frame (even/odd) for ISOC EP */ + unsigned even_odd_frame:1; + /** Max Packet bytes */ + unsigned maxpacket:11; + + /** Max Transfer size */ + uint32_t maxxfer; + + /** @name Transfer state */ + /** @{ */ + + /** + * Pointer to the beginning of the transfer buffer -- do not modify + * during transfer. + */ + dwc_dma_t dma_addr; + + dwc_dma_t dma_desc_addr; + dwc_otg_dev_dma_desc_t *desc_addr; + + /* Additional desc chain for ISO transfers */ + dwc_dma_t dma_desc_addr1; + dwc_otg_dev_dma_desc_t *desc_addr1; + /* Flag indicating which one of two ISO desc chains currently is in use */ + uint8_t use_add_buf; + + uint8_t *start_xfer_buff; + /** pointer to the transfer buffer */ + uint8_t *xfer_buff; + /** Number of bytes to transfer */ + unsigned xfer_len:19; + /** Number of bytes transferred. */ + unsigned xfer_count:19; + /** Sent ZLP */ + unsigned sent_zlp:1; + /** Total len for control transfer */ + unsigned total_len:19; + + /** stall clear flag */ + unsigned stall_clear_flag:1; + + /** SETUP pkt cnt rollover flag for EP0 out*/ + unsigned stp_rollover; + +#ifdef DWC_UTE_CFI + /* The buffer mode */ + data_buffer_mode_e buff_mode; + + /* The chain of DMA descriptors. + * MAX_DMA_DESCS_PER_EP will be allocated for each active EP. + */ + dwc_otg_dma_desc_t *descs; + + /* The DMA address of the descriptors chain start */ + dma_addr_t descs_dma_addr; + /** This variable stores the length of the last enqueued request */ + uint32_t cfi_req_len; +#endif //DWC_UTE_CFI + +/** Max DMA Descriptor count for any EP */ +#define MAX_DMA_DESC_CNT 256 + /** Allocated DMA Desc count */ + uint32_t desc_cnt; + + /** First ISO Desc in use in the first chain*/ + uint32_t iso_desc_first; + /** Last ISO Desc in use in the second chain */ + uint32_t iso_desc_second; + /** Flag indicated that iso transfers were started */ + uint8_t iso_transfer_started; + + /** bInterval */ + uint32_t bInterval; + /** Next frame num to setup next ISOC transfer */ + uint32_t frame_num; + /** Indicates SOF number overrun in DSTS */ + uint8_t frm_overrun; + +#ifdef DWC_UTE_PER_IO + /** Next frame num for which will be setup DMA Desc */ + uint32_t xiso_frame_num; + /** bInterval */ + uint32_t xiso_bInterval; + /** Count of currently active transfers - shall be either 0 or 1 */ + int xiso_active_xfers; + int xiso_queued_xfers; +#endif +#ifdef DWC_EN_ISOC + /** + * Variables specific for ISOC EPs + * + */ + /** DMA addresses of ISOC buffers */ + dwc_dma_t dma_addr0; + dwc_dma_t dma_addr1; + + dwc_dma_t iso_dma_desc_addr; + dwc_otg_dev_dma_desc_t *iso_desc_addr; + + /** pointer to the transfer buffers */ + uint8_t *xfer_buff0; + uint8_t *xfer_buff1; + + /** number of ISOC Buffer is processing */ + uint32_t proc_buf_num; + /** Interval of ISOC Buffer processing */ + uint32_t buf_proc_intrvl; + /** Data size for regular frame */ + uint32_t data_per_frame; + + /* todo - pattern data support is to be implemented in the future */ + /** Data size for pattern frame */ + uint32_t data_pattern_frame; + /** Frame number of pattern data */ + uint32_t sync_frame; + + /** bInterval */ + uint32_t bInterval; + /** ISO Packet number per frame */ + uint32_t pkt_per_frm; + /** Next frame num for which will be setup DMA Desc */ + uint32_t next_frame; + /** Number of packets per buffer processing */ + uint32_t pkt_cnt; + /** Info for all isoc packets */ + iso_pkt_info_t *pkt_info; + /** current pkt number */ + uint32_t cur_pkt; + /** current pkt number */ + uint8_t *cur_pkt_addr; + /** current pkt number */ + uint32_t cur_pkt_dma_addr; +#endif /* DWC_EN_ISOC */ + +/** @} */ +} dwc_ep_t; + +/* + * Reasons for halting a host channel. + */ +typedef enum dwc_otg_halt_status { + DWC_OTG_HC_XFER_NO_HALT_STATUS, + DWC_OTG_HC_XFER_COMPLETE, + DWC_OTG_HC_XFER_URB_COMPLETE, + DWC_OTG_HC_XFER_ACK, + DWC_OTG_HC_XFER_NAK, + DWC_OTG_HC_XFER_NYET, + DWC_OTG_HC_XFER_STALL, + DWC_OTG_HC_XFER_XACT_ERR, + DWC_OTG_HC_XFER_FRAME_OVERRUN, + DWC_OTG_HC_XFER_BABBLE_ERR, + DWC_OTG_HC_XFER_DATA_TOGGLE_ERR, + DWC_OTG_HC_XFER_AHB_ERR, + DWC_OTG_HC_XFER_PERIODIC_INCOMPLETE, + DWC_OTG_HC_XFER_URB_DEQUEUE +} dwc_otg_halt_status_e; + +/** + * Host channel descriptor. This structure represents the state of a single + * host channel when acting in host mode. It contains the data items needed to + * transfer packets to an endpoint via a host channel. + */ +typedef struct dwc_hc { + /** Host channel number used for register address lookup */ + uint8_t hc_num; + + /** Device to access */ + unsigned dev_addr:7; + + /** EP to access */ + unsigned ep_num:4; + + /** EP direction. 0: OUT, 1: IN */ + unsigned ep_is_in:1; + + /** + * EP speed. + * One of the following values: + * - DWC_OTG_EP_SPEED_LOW + * - DWC_OTG_EP_SPEED_FULL + * - DWC_OTG_EP_SPEED_HIGH + */ + unsigned speed:2; +#define DWC_OTG_EP_SPEED_LOW 0 +#define DWC_OTG_EP_SPEED_FULL 1 +#define DWC_OTG_EP_SPEED_HIGH 2 + + /** + * Endpoint type. + * One of the following values: + * - DWC_OTG_EP_TYPE_CONTROL: 0 + * - DWC_OTG_EP_TYPE_ISOC: 1 + * - DWC_OTG_EP_TYPE_BULK: 2 + * - DWC_OTG_EP_TYPE_INTR: 3 + */ + unsigned ep_type:2; + + /** Max packet size in bytes */ + unsigned max_packet:11; + + /** + * PID for initial transaction. + * 0: DATA0,
+ * 1: DATA2,
+ * 2: DATA1,
+ * 3: MDATA (non-Control EP), + * SETUP (Control EP) + */ + unsigned data_pid_start:2; +#define DWC_OTG_HC_PID_DATA0 0 +#define DWC_OTG_HC_PID_DATA2 1 +#define DWC_OTG_HC_PID_DATA1 2 +#define DWC_OTG_HC_PID_MDATA 3 +#define DWC_OTG_HC_PID_SETUP 3 + + /** Number of periodic transactions per (micro)frame */ + unsigned multi_count:2; + + /** @name Transfer State */ + /** @{ */ + + /** Pointer to the current transfer buffer position. */ + uint8_t *xfer_buff; + /** + * In Buffer DMA mode this buffer will be used + * if xfer_buff is not DWORD aligned. + */ + dwc_dma_t align_buff; + /** Total number of bytes to transfer. */ + uint32_t xfer_len; + /** Number of bytes transferred so far. */ + uint32_t xfer_count; + /** Packet count at start of transfer.*/ + uint16_t start_pkt_count; + + /** + * Flag to indicate whether the transfer has been started. Set to 1 if + * it has been started, 0 otherwise. + */ + uint8_t xfer_started; + + /** + * Set to 1 to indicate that a PING request should be issued on this + * channel. If 0, process normally. + */ + uint8_t do_ping; + + /** + * Set to 1 to indicate that the error count for this transaction is + * non-zero. Set to 0 if the error count is 0. + */ + uint8_t error_state; + + /** + * Set to 1 to indicate that this channel should be halted the next + * time a request is queued for the channel. This is necessary in + * slave mode if no request queue space is available when an attempt + * is made to halt the channel. + */ + uint8_t halt_on_queue; + + /** + * Set to 1 if the host channel has been halted, but the core is not + * finished flushing queued requests. Otherwise 0. + */ + uint8_t halt_pending; + + /** + * Reason for halting the host channel. + */ + dwc_otg_halt_status_e halt_status; + + /* + * Split settings for the host channel + */ + uint8_t do_split; /**< Enable split for the channel */ + uint8_t complete_split; /**< Enable complete split */ + uint8_t hub_addr; /**< Address of high speed hub */ + + uint8_t port_addr; /**< Port of the low/full speed device */ + /** Split transaction position + * One of the following values: + * - DWC_HCSPLIT_XACTPOS_MID + * - DWC_HCSPLIT_XACTPOS_BEGIN + * - DWC_HCSPLIT_XACTPOS_END + * - DWC_HCSPLIT_XACTPOS_ALL */ + uint8_t xact_pos; + + /** Set when the host channel does a short read. */ + uint8_t short_read; + + /** + * Number of requests issued for this channel since it was assigned to + * the current transfer (not counting PINGs). + */ + uint8_t requests; + + /** + * Queue Head for the transfer being processed by this channel. + */ + struct dwc_otg_qh *qh; + + /** @} */ + + /** Entry in list of host channels. */ + DWC_CIRCLEQ_ENTRY(dwc_hc) hc_list_entry; + + /** @name Descriptor DMA support */ + /** @{ */ + + /** Number of Transfer Descriptors */ + uint16_t ntd; + + /** Descriptor List DMA address */ + dwc_dma_t desc_list_addr; + + /** Scheduling micro-frame bitmap. */ + uint8_t schinfo; + + /** @} */ +} dwc_hc_t; + +/** + * The following parameters may be specified when starting the module. These + * parameters define how the DWC_otg controller should be configured. + */ +typedef struct dwc_otg_core_params { + int32_t opt; + + /** + * Specifies the OTG capabilities. The driver will automatically + * detect the value for this parameter if none is specified. + * 0 - HNP and SRP capable (default) + * 1 - SRP Only capable + * 2 - No HNP/SRP capable + */ + int32_t otg_cap; + + /** + * Specifies whether to use slave or DMA mode for accessing the data + * FIFOs. The driver will automatically detect the value for this + * parameter if none is specified. + * 0 - Slave + * 1 - DMA (default, if available) + */ + int32_t dma_enable; + + /** + * When DMA mode is enabled specifies whether to use address DMA or DMA + * Descriptor mode for accessing the data FIFOs in device mode. The driver + * will automatically detect the value for this if none is specified. + * 0 - address DMA + * 1 - DMA Descriptor(default, if available) + */ + int32_t dma_desc_enable; + /** The DMA Burst size (applicable only for External DMA + * Mode). 1, 4, 8 16, 32, 64, 128, 256 (default 32) + */ + int32_t dma_burst_size; /* Translate this to GAHBCFG values */ + + /** + * Specifies the maximum speed of operation in host and device mode. + * The actual speed depends on the speed of the attached device and + * the value of phy_type. The actual speed depends on the speed of the + * attached device. + * 0 - High Speed (default) + * 1 - Full Speed + */ + int32_t speed; + /** Specifies whether low power mode is supported when attached + * to a Full Speed or Low Speed device in host mode. + * 0 - Don't support low power mode (default) + * 1 - Support low power mode + */ + int32_t host_support_fs_ls_low_power; + + /** Specifies the PHY clock rate in low power mode when connected to a + * Low Speed device in host mode. This parameter is applicable only if + * HOST_SUPPORT_FS_LS_LOW_POWER is enabled. If PHY_TYPE is set to FS + * then defaults to 6 MHZ otherwise 48 MHZ. + * + * 0 - 48 MHz + * 1 - 6 MHz + */ + int32_t host_ls_low_power_phy_clk; + + /** + * 0 - Use cC FIFO size parameters + * 1 - Allow dynamic FIFO sizing (default) + */ + int32_t enable_dynamic_fifo; + + /** Total number of 4-byte words in the data FIFO memory. This + * memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic + * Tx FIFOs. + * 32 to 32768 (default 8192) + * Note: The total FIFO memory depth in the FPGA configuration is 8192. + */ + int32_t data_fifo_size; + + /** Number of 4-byte words in the Rx FIFO in device mode when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1064) + */ + int32_t dev_rx_fifo_size; + + /** Number of 4-byte words in the non-periodic Tx FIFO in device mode + * when dynamic FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ + int32_t dev_nperio_tx_fifo_size; + + /** Number of 4-byte words in each of the periodic Tx FIFOs in device + * mode when dynamic FIFO sizing is enabled. + * 4 to 768 (default 256) + */ + uint32_t dev_perio_tx_fifo_size[MAX_PERIO_FIFOS]; + + /** Number of 4-byte words in the Rx FIFO in host mode when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ + int32_t host_rx_fifo_size; + + /** Number of 4-byte words in the non-periodic Tx FIFO in host mode + * when Dynamic FIFO sizing is enabled in the core. + * 16 to 32768 (default 1024) + */ + int32_t host_nperio_tx_fifo_size; + + /** Number of 4-byte words in the host periodic Tx FIFO when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ + int32_t host_perio_tx_fifo_size; + + /** The maximum transfer size supported in bytes. + * 2047 to 65,535 (default 65,535) + */ + int32_t max_transfer_size; + + /** The maximum number of packets in a transfer. + * 15 to 511 (default 511) + */ + int32_t max_packet_count; + + /** The number of host channel registers to use. + * 1 to 16 (default 12) + * Note: The FPGA configuration supports a maximum of 12 host channels. + */ + int32_t host_channels; + + /** The number of endpoints in addition to EP0 available for device + * mode operations. + * 1 to 15 (default 6 IN and OUT) + * Note: The FPGA configuration supports a maximum of 6 IN and OUT + * endpoints in addition to EP0. + */ + int32_t dev_endpoints; + + /** + * Specifies the type of PHY interface to use. By default, the driver + * will automatically detect the phy_type. + * + * 0 - Full Speed PHY + * 1 - UTMI+ (default) + * 2 - ULPI + */ + int32_t phy_type; + + /** + * Specifies the UTMI+ Data Width. This parameter is + * applicable for a PHY_TYPE of UTMI+ or ULPI. (For a ULPI + * PHY_TYPE, this parameter indicates the data width between + * the MAC and the ULPI Wrapper.) Also, this parameter is + * applicable only if the OTG_HSPHY_WIDTH cC parameter was set + * to "8 and 16 bits", meaning that the core has been + * configured to work at either data path width. + * + * 8 or 16 bits (default 16) + */ + int32_t phy_utmi_width; + + /** + * Specifies whether the ULPI operates at double or single + * data rate. This parameter is only applicable if PHY_TYPE is + * ULPI. + * + * 0 - single data rate ULPI interface with 8 bit wide data + * bus (default) + * 1 - double data rate ULPI interface with 4 bit wide data + * bus + */ + int32_t phy_ulpi_ddr; + + /** + * Specifies whether to use the internal or external supply to + * drive the vbus with a ULPI phy. + */ + int32_t phy_ulpi_ext_vbus; + + /** + * Specifies whether to use the I2Cinterface for full speed PHY. This + * parameter is only applicable if PHY_TYPE is FS. + * 0 - No (default) + * 1 - Yes + */ + int32_t i2c_enable; + + int32_t ulpi_fs_ls; + + int32_t ts_dline; + + /** + * Specifies whether dedicated transmit FIFOs are + * enabled for non periodic IN endpoints in device mode + * 0 - No + * 1 - Yes + */ + int32_t en_multiple_tx_fifo; + + /** Number of 4-byte words in each of the Tx FIFOs in device + * mode when dynamic FIFO sizing is enabled. + * 4 to 768 (default 256) + */ + uint32_t dev_tx_fifo_size[MAX_TX_FIFOS]; + + /** Thresholding enable flag- + * bit 0 - enable non-ISO Tx thresholding + * bit 1 - enable ISO Tx thresholding + * bit 2 - enable Rx thresholding + */ + uint32_t thr_ctl; + + /** Thresholding length for Tx + * FIFOs in 32 bit DWORDs + */ + uint32_t tx_thr_length; + + /** Thresholding length for Rx + * FIFOs in 32 bit DWORDs + */ + uint32_t rx_thr_length; + + /** + * Specifies whether LPM (Link Power Management) support is enabled + */ + int32_t lpm_enable; + + /** + * Specifies whether LPM Errata (Link Power Management) support is enabled + */ + int32_t besl_enable; + + /** + * Specifies the baseline besl value + */ + int32_t baseline_besl; + + /** + * Specifies the deep besl value + */ + int32_t deep_besl; + /** Per Transfer Interrupt + * mode enable flag + * 1 - Enabled + * 0 - Disabled + */ + int32_t pti_enable; + + /** Multi Processor Interrupt + * mode enable flag + * 1 - Enabled + * 0 - Disabled + */ + int32_t mpi_enable; + + /** IS_USB Capability + * 1 - Enabled + * 0 - Disabled + */ + int32_t ic_usb_cap; + + /** AHB Threshold Ratio + * 2'b00 AHB Threshold = MAC Threshold + * 2'b01 AHB Threshold = 1/2 MAC Threshold + * 2'b10 AHB Threshold = 1/4 MAC Threshold + * 2'b11 AHB Threshold = 1/8 MAC Threshold + */ + int32_t ahb_thr_ratio; + + /** ADP Support + * 1 - Enabled + * 0 - Disabled + */ + int32_t adp_supp_enable; + + /** HFIR Reload Control + * 0 - The HFIR cannot be reloaded dynamically. + * 1 - Allow dynamic reloading of the HFIR register during runtime. + */ + int32_t reload_ctl; + + /** DCFG: Enable device Out NAK + * 0 - The core does not set NAK after Bulk Out transfer complete. + * 1 - The core sets NAK after Bulk OUT transfer complete. + */ + int32_t dev_out_nak; + + /** DCFG: Enable Continue on BNA + * After receiving BNA interrupt the core disables the endpoint,when the + * endpoint is re-enabled by the application the core starts processing + * 0 - from the DOEPDMA descriptor + * 1 - from the descriptor which received the BNA. + */ + int32_t cont_on_bna; + + /** GAHBCFG: AHB Single Support + * This bit when programmed supports SINGLE transfers for remainder + * data in a transfer for DMA mode of operation. + * 0 - in this case the remainder data will be sent using INCR burst size. + * 1 - in this case the remainder data will be sent using SINGLE burst size. + */ + int32_t ahb_single; + + /** Core Power down mode + * 0 - No Power Down is enabled + * 1 - Reserved + * 2 - Complete Power Down (Hibernation) + */ + int32_t power_down; + + /** OTG revision supported + * 0 - OTG 1.3 revision + * 1 - OTG 2.0 revision + */ + int32_t otg_ver; + +} dwc_otg_core_params_t; + +#ifdef OTGDEBUG +struct dwc_otg_core_if; +typedef struct hc_xfer_info { + struct dwc_otg_core_if *core_if; + dwc_hc_t *hc; +} hc_xfer_info_t; +#endif + +typedef struct ep_xfer_info { + struct dwc_otg_core_if *core_if; + dwc_ep_t *ep; + uint8_t state; +} ep_xfer_info_t; +/* + * Device States + */ +typedef enum dwc_otg_lx_state { + /** On state */ + DWC_OTG_L0, + /** LPM sleep state*/ + DWC_OTG_L1, + /** USB suspend state*/ + DWC_OTG_L2, + /** Off state*/ + DWC_OTG_L3 +} dwc_otg_lx_state_e; + +struct dwc_otg_global_regs_backup { + uint32_t gotgctl_local; + uint32_t gintmsk_local; + uint32_t gahbcfg_local; + uint32_t gusbcfg_local; + uint32_t grxfsiz_local; + uint32_t gnptxfsiz_local; +#ifdef CONFIG_USB_DWC_OTG_LPM + uint32_t glpmcfg_local; +#endif + uint32_t gi2cctl_local; + uint32_t hptxfsiz_local; + uint32_t pcgcctl_local; + uint32_t gdfifocfg_local; + uint32_t dtxfsiz_local[MAX_EPS_CHANNELS]; + uint32_t gpwrdn_local; + uint32_t xhib_pcgcctl; + uint32_t xhib_gpwrdn; +}; + +struct dwc_otg_host_regs_backup { + uint32_t hcfg_local; + uint32_t haintmsk_local; + uint32_t hcintmsk_local[MAX_EPS_CHANNELS]; + uint32_t hprt0_local; + uint32_t hfir_local; +}; + +struct dwc_otg_dev_regs_backup { + uint32_t dcfg; + uint32_t dctl; + uint32_t daintmsk; + uint32_t diepmsk; + uint32_t doepmsk; + uint32_t diepctl[MAX_EPS_CHANNELS]; + uint32_t dieptsiz[MAX_EPS_CHANNELS]; + uint32_t diepdma[MAX_EPS_CHANNELS]; +}; +/** + * The dwc_otg_core_if structure contains information needed to manage + * the DWC_otg controller acting in either host or device mode. It + * represents the programming view of the controller as a whole. + */ +struct dwc_otg_core_if { + /** Parameters that define how the core should be configured.*/ + dwc_otg_core_params_t *core_params; + + /** Core Global registers starting at offset 000h. */ + dwc_otg_core_global_regs_t *core_global_regs; + + /** Device-specific information */ + dwc_otg_dev_if_t *dev_if; + /** Host-specific information */ + dwc_otg_host_if_t *host_if; + + /** Value from SNPSID register */ + uint32_t snpsid; + + /* + * Set to 1 if the core PHY interface bits in USBCFG have been + * initialized. + */ + uint8_t phy_init_done; + + /* + * SRP Success flag, set by srp success interrupt in FS I2C mode + */ + uint8_t srp_success; + uint8_t srp_timer_started; + /** Timer for SRP. If it expires before SRP is successful + * clear the SRP. */ + dwc_timer_t *srp_timer; + +#ifdef DWC_DEV_SRPCAP + /* This timer is needed to power on the hibernated host core if SRP is not + * initiated on connected SRP capable device for limited period of time + */ + uint8_t pwron_timer_started; + dwc_timer_t *pwron_timer; +#endif + /* Common configuration information */ + /** Power and Clock Gating Control Register */ + volatile uint32_t *pcgcctl; +#define DWC_OTG_PCGCCTL_OFFSET 0xE00 + + /** Push/pop addresses for endpoints or host channels.*/ + uint32_t *data_fifo[MAX_EPS_CHANNELS]; +#define DWC_OTG_DATA_FIFO_OFFSET 0x1000 +#define DWC_OTG_DATA_FIFO_SIZE 0x1000 + + /** Total RAM for FIFOs (Bytes) */ + uint16_t total_fifo_size; + /** Size of Rx FIFO (Bytes) */ + uint16_t rx_fifo_size; + /** Size of Non-periodic Tx FIFO (Bytes) */ + uint16_t nperio_tx_fifo_size; + + /** 1 if DMA is enabled, 0 otherwise. */ + uint8_t dma_enable; + + /** 1 if DMA descriptor is enabled, 0 otherwise. */ + uint8_t dma_desc_enable; + + /** 1 if PTI Enhancement mode is enabled, 0 otherwise. */ + uint8_t pti_enh_enable; + + /** 1 if MPI Enhancement mode is enabled, 0 otherwise. */ + uint8_t multiproc_int_enable; + + /** 1 if dedicated Tx FIFOs are enabled, 0 otherwise. */ + uint8_t en_multiple_tx_fifo; + + /** Set to 1 if multiple packets of a high-bandwidth transfer is in + * process of being queued */ + uint8_t queuing_high_bandwidth; + + /** Hardware Configuration -- stored here for convenience.*/ + hwcfg1_data_t hwcfg1; + hwcfg2_data_t hwcfg2; + hwcfg3_data_t hwcfg3; + hwcfg4_data_t hwcfg4; + fifosize_data_t hptxfsiz; + + /** Host and Device Configuration -- stored here for convenience.*/ + hcfg_data_t hcfg; + dcfg_data_t dcfg; + + /** The operational State, during transations + * (a_host>>a_peripherial and b_device=>b_host) this may not + * match the core but allows the software to determine + * transitions. + */ + uint8_t op_state; + + /** Test mode for PET testing */ + uint8_t test_mode; + + /** + * Set to 1 if the HCD needs to be restarted on a session request + * interrupt. This is required if no connector ID status change has + * occurred since the HCD was last disconnected. + */ + uint8_t restart_hcd_on_session_req; + + /** HCD callbacks */ + /** A-Device is a_host */ +#define A_HOST (1) + /** A-Device is a_suspend */ +#define A_SUSPEND (2) + /** A-Device is a_peripherial */ +#define A_PERIPHERAL (3) + /** B-Device is operating as a Peripheral. */ +#define B_PERIPHERAL (4) + /** B-Device is operating as a Host. */ +#define B_HOST (5) + + /** HCD callbacks */ + struct dwc_otg_cil_callbacks *hcd_cb; + /** PCD callbacks */ + struct dwc_otg_cil_callbacks *pcd_cb; + + /** Device mode Periodic Tx FIFO Mask */ + uint32_t p_tx_msk; + /** Device mode Periodic Tx FIFO Mask */ + uint32_t tx_msk; + + /** Workqueue object used for handling several interrupts */ + dwc_workq_t *wq_otg; + + /** Timer object used for handling "Wakeup Detected" Interrupt */ + dwc_timer_t *wkp_timer; + /** This arrays used for debug purposes for DEV OUT NAK enhancement */ + uint32_t start_doeptsiz_val[MAX_EPS_CHANNELS]; + ep_xfer_info_t ep_xfer_info[MAX_EPS_CHANNELS]; + dwc_timer_t *ep_xfer_timer[MAX_EPS_CHANNELS]; +#ifdef OTGDEBUG + uint32_t start_hcchar_val[MAX_EPS_CHANNELS]; + + hc_xfer_info_t hc_xfer_info[MAX_EPS_CHANNELS]; + dwc_timer_t *hc_xfer_timer[MAX_EPS_CHANNELS]; + + uint32_t hfnum_7_samples; + uint64_t hfnum_7_frrem_accum; + uint32_t hfnum_0_samples; + uint64_t hfnum_0_frrem_accum; + uint32_t hfnum_other_samples; + uint64_t hfnum_other_frrem_accum; +#endif + +#ifdef DWC_UTE_CFI + uint16_t pwron_rxfsiz; + uint16_t pwron_gnptxfsiz; + uint16_t pwron_txfsiz[15]; + + uint16_t init_rxfsiz; + uint16_t init_gnptxfsiz; + uint16_t init_txfsiz[15]; +#endif + + /** Lx state of device */ + dwc_otg_lx_state_e lx_state; + + /** Saved Core Global registers */ + struct dwc_otg_global_regs_backup *gr_backup; + /** Saved Host registers */ + struct dwc_otg_host_regs_backup *hr_backup; + /** Saved Device registers */ + struct dwc_otg_dev_regs_backup *dr_backup; + + /** Power Down Enable */ + uint32_t power_down; + + /** ADP support Enable */ + uint32_t adp_enable; + + /** ADP structure object */ + dwc_otg_adp_t adp; + + /** hibernation/suspend flag */ + int hibernation_suspend; + + /** Device mode extended hibernation flag */ + int xhib; + + /** OTG revision supported */ + uint32_t otg_ver; + + /** OTG status flag used for HNP polling */ + uint8_t otg_sts; + + /** Pointer to either hcd->lock or pcd->lock */ + dwc_spinlock_t *lock; + + /** Start predict NextEP based on Learning Queue if equal 1, + * also used as counter of disabled NP IN EP's */ + uint8_t start_predict; + + /** NextEp sequence, including EP0: nextep_seq[] = EP if non-periodic and + * active, 0xff otherwise */ + uint8_t nextep_seq[MAX_EPS_CHANNELS]; + + /** Index of fisrt EP in nextep_seq array which should be re-enabled **/ + uint8_t first_in_nextep_seq; + + /** Frame number while entering to ISR - needed for ISOCs **/ + uint32_t frame_num; + + /** Flag to not perform ADP probing if IDSTS event happened */ + uint8_t stop_adpprb; + +}; + +#ifdef OTGDEBUG +/* + * This function is called when transfer is timed out. + */ +extern void hc_xfer_timeout(void *ptr); +#endif + +/* + * This function is called when transfer is timed out on endpoint. + */ +extern void ep_xfer_timeout(void *ptr); + +/* + * The following functions are functions for works + * using during handling some interrupts + */ +extern void w_conn_id_status_change(void *p); + +extern void w_wakeup_detected(void *p); + +/** Saves global register values into system memory. */ +extern int dwc_otg_save_global_regs(dwc_otg_core_if_t * core_if); +/** Saves device register values into system memory. */ +extern int dwc_otg_save_dev_regs(dwc_otg_core_if_t * core_if); +/** Saves host register values into system memory. */ +extern int dwc_otg_save_host_regs(dwc_otg_core_if_t * core_if); +/** Restore global register values. */ +extern int dwc_otg_restore_global_regs(dwc_otg_core_if_t * core_if); +/** Restore host register values. */ +extern int dwc_otg_restore_host_regs(dwc_otg_core_if_t * core_if, int reset); +/** Restore device register values. */ +extern int dwc_otg_restore_dev_regs(dwc_otg_core_if_t * core_if, + int rem_wakeup); +extern int restore_lpm_i2c_regs(dwc_otg_core_if_t * core_if); +extern int restore_essential_regs(dwc_otg_core_if_t * core_if, int rmode, + int is_host); + +extern int dwc_otg_host_hibernation_restore(dwc_otg_core_if_t * core_if, + int restore_mode, int reset); +extern int dwc_otg_device_hibernation_restore(dwc_otg_core_if_t * core_if, + int rem_wakeup, int reset); + +/* + * The following functions support initialization of the CIL driver component + * and the DWC_otg controller. + */ +extern void dwc_otg_core_host_init(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_core_dev_init(dwc_otg_core_if_t * _core_if); + +/** @name Device CIL Functions + * The following functions support managing the DWC_otg controller in device + * mode. + */ +/**@{*/ +extern void dwc_otg_wakeup(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_read_setup_packet(dwc_otg_core_if_t * _core_if, + uint32_t * _dest); +extern uint32_t dwc_otg_get_frame_number(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_ep0_activate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep); +extern void dwc_otg_ep_activate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep); +extern void dwc_otg_ep_deactivate(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep); +extern void dwc_otg_ep_start_transfer(dwc_otg_core_if_t * _core_if, + dwc_ep_t * _ep); +extern void dwc_otg_ep_start_zl_transfer(dwc_otg_core_if_t * _core_if, + dwc_ep_t * _ep); +extern void dwc_otg_ep0_start_transfer(dwc_otg_core_if_t * _core_if, + dwc_ep_t * _ep); +extern void dwc_otg_ep0_continue_transfer(dwc_otg_core_if_t * _core_if, + dwc_ep_t * _ep); +extern void dwc_otg_ep_write_packet(dwc_otg_core_if_t * _core_if, + dwc_ep_t * _ep, int _dma); +extern void dwc_otg_ep_set_stall(dwc_otg_core_if_t * _core_if, dwc_ep_t * _ep); +extern void dwc_otg_ep_clear_stall(dwc_otg_core_if_t * _core_if, + dwc_ep_t * _ep); +extern void dwc_otg_enable_device_interrupts(dwc_otg_core_if_t * _core_if); + +#ifdef DWC_EN_ISOC +extern void dwc_otg_iso_ep_start_frm_transfer(dwc_otg_core_if_t * core_if, + dwc_ep_t * ep); +extern void dwc_otg_iso_ep_start_buf_transfer(dwc_otg_core_if_t * core_if, + dwc_ep_t * ep); +#endif /* DWC_EN_ISOC */ +/**@}*/ + +/** @name Host CIL Functions + * The following functions support managing the DWC_otg controller in host + * mode. + */ +/**@{*/ +extern void dwc_otg_hc_init(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc); +extern void dwc_otg_hc_halt(dwc_otg_core_if_t * _core_if, + dwc_hc_t * _hc, dwc_otg_halt_status_e _halt_status); +extern void dwc_otg_hc_cleanup(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc); +extern void dwc_otg_hc_start_transfer(dwc_otg_core_if_t * _core_if, + dwc_hc_t * _hc); +extern int dwc_otg_hc_continue_transfer(dwc_otg_core_if_t * _core_if, + dwc_hc_t * _hc); +extern void dwc_otg_hc_do_ping(dwc_otg_core_if_t * _core_if, dwc_hc_t * _hc); +extern void dwc_otg_hc_write_packet(dwc_otg_core_if_t * _core_if, + dwc_hc_t * _hc); +extern void dwc_otg_enable_host_interrupts(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_disable_host_interrupts(dwc_otg_core_if_t * _core_if); + +extern void dwc_otg_hc_start_transfer_ddma(dwc_otg_core_if_t * core_if, + dwc_hc_t * hc); + +extern uint32_t calc_frame_interval(dwc_otg_core_if_t * core_if); +extern int dwc_otg_check_haps_status(dwc_otg_core_if_t * core_if); + +/* Macro used to clear one channel interrupt */ +#define clear_hc_int(_hc_regs_, _intr_) \ +do { \ + hcint_data_t hcint_clear = {.d32 = 0}; \ + hcint_clear.b._intr_ = 1; \ + DWC_WRITE_REG32(&(_hc_regs_)->hcint, hcint_clear.d32); \ +} while (0) + +/* + * Macro used to disable one channel interrupt. Channel interrupts are + * disabled when the channel is halted or released by the interrupt handler. + * There is no need to handle further interrupts of that type until the + * channel is re-assigned. In fact, subsequent handling may cause crashes + * because the channel structures are cleaned up when the channel is released. + */ +#define disable_hc_int(_hc_regs_, _intr_) \ +do { \ + hcintmsk_data_t hcintmsk = {.d32 = 0}; \ + hcintmsk.b._intr_ = 1; \ + DWC_MODIFY_REG32(&(_hc_regs_)->hcintmsk, hcintmsk.d32, 0); \ +} while (0) + +/** + * This function Reads HPRT0 in preparation to modify. It keeps the + * WC bits 0 so that if they are read as 1, they won't clear when you + * write it back + */ +static inline uint32_t dwc_otg_read_hprt0(dwc_otg_core_if_t * _core_if) +{ + hprt0_data_t hprt0; + hprt0.d32 = DWC_READ_REG32(_core_if->host_if->hprt0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; + hprt0.b.prtovrcurrchng = 0; + return hprt0.d32; +} + +/**@}*/ + +/** @name Common CIL Functions + * The following functions support managing the DWC_otg controller in either + * device or host mode. + */ +/**@{*/ + +extern void dwc_otg_read_packet(dwc_otg_core_if_t * core_if, + uint8_t * dest, uint16_t bytes); + +extern void dwc_otg_flush_tx_fifo(dwc_otg_core_if_t * _core_if, const int _num); +extern void dwc_otg_flush_rx_fifo(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_core_reset(dwc_otg_core_if_t * _core_if); + +/** + * This function returns the Core Interrupt register. + */ +static inline uint32_t dwc_otg_read_core_intr(dwc_otg_core_if_t * core_if) +{ + return (DWC_READ_REG32(&core_if->core_global_regs->gintsts) & + DWC_READ_REG32(&core_if->core_global_regs->gintmsk)); +} + +/** + * This function returns the OTG Interrupt register. + */ +static inline uint32_t dwc_otg_read_otg_intr(dwc_otg_core_if_t * core_if) +{ + return (DWC_READ_REG32(&core_if->core_global_regs->gotgint)); +} + +/** + * This function reads the Device All Endpoints Interrupt register and + * returns the IN endpoint interrupt bits. + */ +static inline uint32_t dwc_otg_read_dev_all_in_ep_intr(dwc_otg_core_if_t * + core_if) +{ + + uint32_t v; + + if (core_if->multiproc_int_enable) { + v = DWC_READ_REG32(&core_if->dev_if-> + dev_global_regs->deachint) & + DWC_READ_REG32(&core_if-> + dev_if->dev_global_regs->deachintmsk); + } else { + v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) & + DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk); + } + return (v & 0xffff); +} + +/** + * This function reads the Device All Endpoints Interrupt register and + * returns the OUT endpoint interrupt bits. + */ +static inline uint32_t dwc_otg_read_dev_all_out_ep_intr(dwc_otg_core_if_t * + core_if) +{ + uint32_t v; + + if (core_if->multiproc_int_enable) { + v = DWC_READ_REG32(&core_if->dev_if-> + dev_global_regs->deachint) & + DWC_READ_REG32(&core_if-> + dev_if->dev_global_regs->deachintmsk); + } else { + v = DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daint) & + DWC_READ_REG32(&core_if->dev_if->dev_global_regs->daintmsk); + } + + return ((v & 0xffff0000) >> 16); +} + +/** + * This function returns the Device IN EP Interrupt register + */ +static inline uint32_t dwc_otg_read_dev_in_ep_intr(dwc_otg_core_if_t * core_if, + dwc_ep_t * ep) +{ + dwc_otg_dev_if_t *dev_if = core_if->dev_if; + uint32_t v, msk, emp; + + if (core_if->multiproc_int_enable) { + msk = + DWC_READ_REG32(&dev_if-> + dev_global_regs->diepeachintmsk[ep->num]); + emp = + DWC_READ_REG32(&dev_if-> + dev_global_regs->dtknqr4_fifoemptymsk); + msk |= ((emp >> ep->num) & 0x1) << 7; + v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk; + } else { + msk = DWC_READ_REG32(&dev_if->dev_global_regs->diepmsk); + emp = + DWC_READ_REG32(&dev_if-> + dev_global_regs->dtknqr4_fifoemptymsk); + msk |= ((emp >> ep->num) & 0x1) << 7; + v = DWC_READ_REG32(&dev_if->in_ep_regs[ep->num]->diepint) & msk; + } + + return v; +} + +/** + * This function returns the Device OUT EP Interrupt register + */ +static inline uint32_t dwc_otg_read_dev_out_ep_intr(dwc_otg_core_if_t * + _core_if, dwc_ep_t * _ep) +{ + dwc_otg_dev_if_t *dev_if = _core_if->dev_if; + uint32_t v; + doepmsk_data_t msk = {.d32 = 0 }; + + if (_core_if->multiproc_int_enable) { + msk.d32 = + DWC_READ_REG32(&dev_if-> + dev_global_regs->doepeachintmsk[_ep->num]); + if (_core_if->pti_enh_enable) { + msk.b.pktdrpsts = 1; + } + v = DWC_READ_REG32(&dev_if-> + out_ep_regs[_ep->num]->doepint) & msk.d32; + } else { + msk.d32 = DWC_READ_REG32(&dev_if->dev_global_regs->doepmsk); + if (_core_if->pti_enh_enable) { + msk.b.pktdrpsts = 1; + } + v = DWC_READ_REG32(&dev_if-> + out_ep_regs[_ep->num]->doepint) & msk.d32; + } + return v; +} + +/** + * This function returns the Host All Channel Interrupt register + */ +static inline uint32_t dwc_otg_read_host_all_channels_intr(dwc_otg_core_if_t * + _core_if) +{ + return (DWC_READ_REG32(&_core_if->host_if->host_global_regs->haint)); +} + +static inline uint32_t dwc_otg_read_host_channel_intr(dwc_otg_core_if_t * + _core_if, dwc_hc_t * _hc) +{ + return (DWC_READ_REG32 + (&_core_if->host_if->hc_regs[_hc->hc_num]->hcint)); +} + +/** + * This function returns the mode of the operation, host or device. + * + * @return 0 - Device Mode, 1 - Host Mode + */ +static inline uint32_t dwc_otg_mode(dwc_otg_core_if_t * _core_if) +{ + return (DWC_READ_REG32(&_core_if->core_global_regs->gintsts) & 0x1); +} + +/**@}*/ + +/** + * DWC_otg CIL callback structure. This structure allows the HCD and + * PCD to register functions used for starting and stopping the PCD + * and HCD for role change on for a DRD. + */ +typedef struct dwc_otg_cil_callbacks { + /** Start function for role change */ + int (*start) (void *_p); + /** Stop Function for role change */ + int (*stop) (void *_p); + /** Disconnect Function for role change */ + int (*disconnect) (void *_p); + /** Resume/Remote wakeup Function */ + int (*resume_wakeup) (void *_p); + /** Suspend function */ + int (*suspend) (void *_p); + /** Session Start (SRP) */ + int (*session_start) (void *_p); +#ifdef CONFIG_USB_DWC_OTG_LPM + /** Sleep (switch to L0 state) */ + int (*sleep) (void *_p); +#endif + /** Pointer passed to start() and stop() */ + void *p; +} dwc_otg_cil_callbacks_t; + +extern void dwc_otg_cil_register_pcd_callbacks(dwc_otg_core_if_t * _core_if, + dwc_otg_cil_callbacks_t * _cb, + void *_p); +extern void dwc_otg_cil_register_hcd_callbacks(dwc_otg_core_if_t * _core_if, + dwc_otg_cil_callbacks_t * _cb, + void *_p); + +void dwc_otg_initiate_srp(void * core_if); + +////////////////////////////////////////////////////////////////////// +/** Start the HCD. Helper function for using the HCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_hcd_start(dwc_otg_core_if_t * core_if) +{ + if (core_if->hcd_cb && core_if->hcd_cb->start) { + core_if->hcd_cb->start(core_if->hcd_cb->p); + } +} + +/** Stop the HCD. Helper function for using the HCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_hcd_stop(dwc_otg_core_if_t * core_if) +{ + if (core_if->hcd_cb && core_if->hcd_cb->stop) { + core_if->hcd_cb->stop(core_if->hcd_cb->p); + } +} + +/** Disconnect the HCD. Helper function for using the HCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_hcd_disconnect(dwc_otg_core_if_t * core_if) +{ + if (core_if->hcd_cb && core_if->hcd_cb->disconnect) { + core_if->hcd_cb->disconnect(core_if->hcd_cb->p); + } +} + +/** Inform the HCD the a New Session has begun. Helper function for + * using the HCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_hcd_session_start(dwc_otg_core_if_t * core_if) +{ + if (core_if->hcd_cb && core_if->hcd_cb->session_start) { + core_if->hcd_cb->session_start(core_if->hcd_cb->p); + } +} + +#ifdef CONFIG_USB_DWC_OTG_LPM +/** + * Inform the HCD about LPM sleep. + * Helper function for using the HCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_hcd_sleep(dwc_otg_core_if_t * core_if) +{ + if (core_if->hcd_cb && core_if->hcd_cb->sleep) { + core_if->hcd_cb->sleep(core_if->hcd_cb->p); + } +} +#endif + +/** Resume the HCD. Helper function for using the HCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_hcd_resume(dwc_otg_core_if_t * core_if) +{ + if (core_if->hcd_cb && core_if->hcd_cb->resume_wakeup) { + core_if->hcd_cb->resume_wakeup(core_if->hcd_cb->p); + } +} + +/** Start the PCD. Helper function for using the PCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_pcd_start(dwc_otg_core_if_t * core_if) +{ + if (core_if->pcd_cb && core_if->pcd_cb->start) { + core_if->pcd_cb->start(core_if->pcd_cb->p); + } +} + +/** Stop the PCD. Helper function for using the PCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_pcd_stop(dwc_otg_core_if_t * core_if) +{ + if (core_if->pcd_cb && core_if->pcd_cb->stop) { + core_if->pcd_cb->stop(core_if->pcd_cb->p); + } +} + +/** Suspend the PCD. Helper function for using the PCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_pcd_suspend(dwc_otg_core_if_t * core_if) +{ + if (core_if->pcd_cb && core_if->pcd_cb->suspend) { + core_if->pcd_cb->suspend(core_if->pcd_cb->p); + } +} + +/** Resume the PCD. Helper function for using the PCD callbacks. + * + * @param core_if Programming view of DWC_otg controller. + */ +static inline void cil_pcd_resume(dwc_otg_core_if_t * core_if) +{ + if (core_if->pcd_cb && core_if->pcd_cb->resume_wakeup) { + core_if->pcd_cb->resume_wakeup(core_if->pcd_cb->p); + } +} + +////////////////////////////////////////////////////////////////////// + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_common.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_common.h new file mode 100644 index 0000000..67af33e --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_common.h @@ -0,0 +1,82 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#include "basic_types.h" +#include +//#include "va_list.h" +#include + +#include "diag.h" +#include "dwc_otg_dbg.h" +#include "dwc_os.h" + + +typedef struct _RAM_OTG_FUNCTION_TABLE_ { + VOID* (*RamMemSet) (void *dest, int byte, SIZE_T size); + VOID* (*RamMemCpy) (void *dest, void const *src, SIZE_T size); + int (*RamMemCmp) (void const*m1, void const *m2, SIZE_T size); + int (*RamStrnCmp) (const char *s1, const char *s2, SIZE_T size); + int (*RamStrCmp) (const char *s1, const char *s2); + SIZE_T (*RamStrLen) (char const *str); + char* (*RamStrCpy) (char *to, char const *from); + char* (*RamStrDup) (char const *str); + int (*RamAtoi) (const char *str, int32_t *value); + int (*RamAtoui) (const char *str, uint32_t *value); + int (*RamVsnPrintf) (char *str, int size, const char *format, ...); + u32 (*RamSPrintf) (u8 *buf, const char *fmt, ...); + int (*RamSnPrintf) (char *dst, int count, const char * src, ...); + u8* (*RamZmalloc) (u32 sz); + u8* (*RamZmallocAtomic) (u32 sz); + VOID (*RamMfree) (u8 *pbuf, u32 sz); + dwc_spinlock_t* (*RamSpinlockAlloc) (void); + VOID (*RamSpinlockFree) (dwc_spinlock_t *lock); + VOID (*RamSpinlock) (dwc_spinlock_t *lock); + VOID (*RamSpinUnlock) (dwc_spinlock_t *lock); + VOID (*RamSpinIrqSave) (dwc_spinlock_t *lock, dwc_irqflags_t *flags); + VOID (*RamSpinIrqRestore) (dwc_spinlock_t *lock, dwc_irqflags_t flags); + dwc_mutex_t*(*RamMutexAlloc) (void); + VOID (*RamMutexFree) (dwc_mutex_t *mutex); + VOID (*RamMutexLock) (dwc_mutex_t *mutex); + int (*RamMutexTryLock) (dwc_mutex_t *mutex); + VOID (*RamMutexUnLock) (dwc_mutex_t *mutex); + uint32_t(*RamUDelay) (uint32_t usecs); + void (*RamMSleep) (uint32_t msecs); + VOID (*timer_callback) (unsigned long data); + dwc_timer_t *(*RamTimerAlloc) (char *name, dwc_timer_callback_t cb, void *data); + VOID (*RamTimerFree) (dwc_timer_t *timer); + VOID (*RamTimerSche) (dwc_timer_t *timer, uint32_t time_ms); + VOID (*RamTimerCancel) (dwc_timer_t *timer); + VOID (*RamEnterCritical) (void); + VOID (*RamExitCritical) (void); +}RAM_OTG_FUNCTION_TABLE, *PRAM_OTG_FUNCTION_TABLE; + + + +// Global Variable +extern RAM_OTG_FUNCTION_TABLE gRamOTGFunTbl; + +// Funtion Prototype +// ROM +_LONG_CALL_ void dwc_otg_wrapper_reset(IN VOID); +_LONG_CALL_ void dwc_otg_wrapper_init_boot(IN VOID); +_LONG_CALL_ void dwc_otg_power_init(IN VOID); + +_LONG_CALL_ VOID RtlInitListhead_Otg(IN _LIST *list); +_LONG_CALL_ u32 RtlIsListEmpty_Otg(IN _LIST *phead); +_LONG_CALL_ VOID RtlListInsertHead_Otg(IN _LIST *plist,IN _LIST *phead); +_LONG_CALL_ VOID RtlListInsertTail_Otg(IN _LIST *plist,IN _LIST *phead); +_LONG_CALL_ _LIST *RtlListGetNext_Otg(IN _LIST *plist); +_LONG_CALL_ VOID RtlListDelete_Otg(IN _LIST *plist); + +extern _LONG_CALL_ char *DWC_STRDUP_ROM(char const *str); +extern _LONG_CALL_ int DWC_ATOI_ROM(const char *str, int32_t *value); +extern _LONG_CALL_ int DWC_ATOUI_ROM(const char *str, uint32_t *value); +// RAM +void dwc_otg_wrapper_init(IN VOID); + + diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_core_if.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_core_if.h new file mode 100644 index 0000000..b3f79b0 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_core_if.h @@ -0,0 +1,746 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_core_if.h $ + * $Revision: #15 $ + * $Date: 2012/12/10 $ + * $Change: 2123206 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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. + * ========================================================================== */ +#if !defined(__DWC_CORE_IF_H__) +#define __DWC_CORE_IF_H__ + +#include "dwc_os.h" + +/** @file + * This file defines DWC_OTG Core API + */ + +struct dwc_otg_core_if; +typedef struct dwc_otg_core_if dwc_otg_core_if_t; + +/** Maximum number of Periodic FIFOs */ +#define MAX_PERIO_FIFOS 15 +/** Maximum number of Periodic FIFOs */ +#define MAX_TX_FIFOS 15 + +/** Maximum number of Endpoints/HostChannels */ +#define MAX_EPS_CHANNELS 16 + +extern dwc_otg_core_if_t *dwc_otg_cil_init(const uint32_t * _reg_base_addr); +extern void dwc_otg_core_init(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_cil_remove(dwc_otg_core_if_t * _core_if); + +extern void dwc_otg_enable_global_interrupts(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_disable_global_interrupts(dwc_otg_core_if_t * _core_if); + +extern uint8_t dwc_otg_is_device_mode(dwc_otg_core_if_t * _core_if); +extern uint8_t dwc_otg_is_host_mode(dwc_otg_core_if_t * _core_if); + +extern uint8_t dwc_otg_is_dma_enable(dwc_otg_core_if_t * core_if); + +/** This function should be called on every hardware interrupt. */ +extern int32_t dwc_otg_handle_common_intr(void *otg_dev); + +/** @name OTG Core Parameters */ +/** @{ */ + +/** + * Specifies the OTG capabilities. The driver will automatically + * detect the value for this parameter if none is specified. + * 0 - HNP and SRP capable (default) + * 1 - SRP Only capable + * 2 - No HNP/SRP capable + */ +extern int dwc_otg_set_param_otg_cap(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_param_otg_cap(dwc_otg_core_if_t * core_if); +#define DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE 0 +#define DWC_OTG_CAP_PARAM_SRP_ONLY_CAPABLE 1 +#define DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE 2 +#define dwc_param_otg_cap_default DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE + +extern int dwc_otg_set_param_opt(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_param_opt(dwc_otg_core_if_t * core_if); +#define dwc_param_opt_default 1 + +/** + * Specifies whether to use slave or DMA mode for accessing the data + * FIFOs. The driver will automatically detect the value for this + * parameter if none is specified. + * 0 - Slave + * 1 - DMA (default, if available) + */ +extern int dwc_otg_set_param_dma_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_dma_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_dma_enable_default 1 + +/** + * When DMA mode is enabled specifies whether to use + * address DMA or DMA Descritor mode for accessing the data + * FIFOs in device mode. The driver will automatically detect + * the value for this parameter if none is specified. + * 0 - address DMA + * 1 - DMA Descriptor(default, if available) + */ +extern int dwc_otg_set_param_dma_desc_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_dma_desc_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_dma_desc_enable_default 1 + +/** The DMA Burst size (applicable only for External DMA + * Mode). 1, 4, 8 16, 32, 64, 128, 256 (default 32) + */ +extern int dwc_otg_set_param_dma_burst_size(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_dma_burst_size(dwc_otg_core_if_t * core_if); +#define dwc_param_dma_burst_size_default 32 + +/** + * Specifies the maximum speed of operation in host and device mode. + * The actual speed depends on the speed of the attached device and + * the value of phy_type. The actual speed depends on the speed of the + * attached device. + * 0 - High Speed (default) + * 1 - Full Speed + */ +extern int dwc_otg_set_param_speed(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_param_speed(dwc_otg_core_if_t * core_if); +#define dwc_param_speed_default 0 +#define DWC_SPEED_PARAM_HIGH 0 +#define DWC_SPEED_PARAM_FULL 1 + +/** Specifies whether low power mode is supported when attached + * to a Full Speed or Low Speed device in host mode. + * 0 - Don't support low power mode (default) + * 1 - Support low power mode + */ +extern int dwc_otg_set_param_host_support_fs_ls_low_power(dwc_otg_core_if_t * + core_if, int32_t val); +extern int32_t dwc_otg_get_param_host_support_fs_ls_low_power(dwc_otg_core_if_t + * core_if); +#define dwc_param_host_support_fs_ls_low_power_default 0 + +/** Specifies the PHY clock rate in low power mode when connected to a + * Low Speed device in host mode. This parameter is applicable only if + * HOST_SUPPORT_FS_LS_LOW_POWER is enabled. If PHY_TYPE is set to FS + * then defaults to 6 MHZ otherwise 48 MHZ. + * + * 0 - 48 MHz + * 1 - 6 MHz + */ +extern int dwc_otg_set_param_host_ls_low_power_phy_clk(dwc_otg_core_if_t * + core_if, int32_t val); +extern int32_t dwc_otg_get_param_host_ls_low_power_phy_clk(dwc_otg_core_if_t * + core_if); +#define dwc_param_host_ls_low_power_phy_clk_default 0 +#define DWC_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ 0 +#define DWC_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ 1 + +/** + * 0 - Use cC FIFO size parameters + * 1 - Allow dynamic FIFO sizing (default) + */ +extern int dwc_otg_set_param_enable_dynamic_fifo(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_enable_dynamic_fifo(dwc_otg_core_if_t * + core_if); +#define dwc_param_enable_dynamic_fifo_default 1 + +/** Total number of 4-byte words in the data FIFO memory. This + * memory includes the Rx FIFO, non-periodic Tx FIFO, and periodic + * Tx FIFOs. + * 32 to 32768 (default 8192) + * Note: The total FIFO memory depth in the FPGA configuration is 8192. + */ +extern int dwc_otg_set_param_data_fifo_size(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_data_fifo_size(dwc_otg_core_if_t * core_if); +#define dwc_param_data_fifo_size_default 8192 + +/** Number of 4-byte words in the Rx FIFO in device mode when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1064) + */ +extern int dwc_otg_set_param_dev_rx_fifo_size(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_dev_rx_fifo_size(dwc_otg_core_if_t * core_if); +#define dwc_param_dev_rx_fifo_size_default 1064 + +/** Number of 4-byte words in the non-periodic Tx FIFO in device mode + * when dynamic FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ +extern int dwc_otg_set_param_dev_nperio_tx_fifo_size(dwc_otg_core_if_t * + core_if, int32_t val); +extern int32_t dwc_otg_get_param_dev_nperio_tx_fifo_size(dwc_otg_core_if_t * + core_if); +#define dwc_param_dev_nperio_tx_fifo_size_default 1024 + +/** Number of 4-byte words in each of the periodic Tx FIFOs in device + * mode when dynamic FIFO sizing is enabled. + * 4 to 768 (default 256) + */ +extern int dwc_otg_set_param_dev_perio_tx_fifo_size(dwc_otg_core_if_t * core_if, + int32_t val, int fifo_num); +extern int32_t dwc_otg_get_param_dev_perio_tx_fifo_size(dwc_otg_core_if_t * + core_if, int fifo_num); +#define dwc_param_dev_perio_tx_fifo_size_default 256 + +/** Number of 4-byte words in the Rx FIFO in host mode when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ +extern int dwc_otg_set_param_host_rx_fifo_size(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_host_rx_fifo_size(dwc_otg_core_if_t * core_if); +#define dwc_param_host_rx_fifo_size_default 1024 + +/** Number of 4-byte words in the non-periodic Tx FIFO in host mode + * when Dynamic FIFO sizing is enabled in the core. + * 16 to 32768 (default 1024) + */ +extern int dwc_otg_set_param_host_nperio_tx_fifo_size(dwc_otg_core_if_t * + core_if, int32_t val); +extern int32_t dwc_otg_get_param_host_nperio_tx_fifo_size(dwc_otg_core_if_t * + core_if); +#define dwc_param_host_nperio_tx_fifo_size_default 1024 + +/** Number of 4-byte words in the host periodic Tx FIFO when dynamic + * FIFO sizing is enabled. + * 16 to 32768 (default 1024) + */ +extern int dwc_otg_set_param_host_perio_tx_fifo_size(dwc_otg_core_if_t * + core_if, int32_t val); +extern int32_t dwc_otg_get_param_host_perio_tx_fifo_size(dwc_otg_core_if_t * + core_if); +#define dwc_param_host_perio_tx_fifo_size_default 1024 + +/** The maximum transfer size supported in bytes. + * 2047 to 65,535 (default 65,535) + */ +extern int dwc_otg_set_param_max_transfer_size(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_max_transfer_size(dwc_otg_core_if_t * core_if); +#define dwc_param_max_transfer_size_default 65535 + +/** The maximum number of packets in a transfer. + * 15 to 511 (default 511) + */ +extern int dwc_otg_set_param_max_packet_count(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_max_packet_count(dwc_otg_core_if_t * core_if); +#define dwc_param_max_packet_count_default 511 + +/** The number of host channel registers to use. + * 1 to 16 (default 12) + * Note: The FPGA configuration supports a maximum of 12 host channels. + */ +extern int dwc_otg_set_param_host_channels(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_host_channels(dwc_otg_core_if_t * core_if); +#define dwc_param_host_channels_default 12 + +/** The number of endpoints in addition to EP0 available for device + * mode operations. + * 1 to 15 (default 6 IN and OUT) + * Note: The FPGA configuration supports a maximum of 6 IN and OUT + * endpoints in addition to EP0. + */ +extern int dwc_otg_set_param_dev_endpoints(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_dev_endpoints(dwc_otg_core_if_t * core_if); +#define dwc_param_dev_endpoints_default 6 + +/** + * Specifies the type of PHY interface to use. By default, the driver + * will automatically detect the phy_type. + * + * 0 - Full Speed PHY + * 1 - UTMI+ (default) + * 2 - ULPI + */ +extern int dwc_otg_set_param_phy_type(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_param_phy_type(dwc_otg_core_if_t * core_if); +#define DWC_PHY_TYPE_PARAM_FS 0 +#define DWC_PHY_TYPE_PARAM_UTMI 1 +#define DWC_PHY_TYPE_PARAM_ULPI 2 +#define dwc_param_phy_type_default DWC_PHY_TYPE_PARAM_UTMI + +/** + * Specifies the UTMI+ Data Width. This parameter is + * applicable for a PHY_TYPE of UTMI+ or ULPI. (For a ULPI + * PHY_TYPE, this parameter indicates the data width between + * the MAC and the ULPI Wrapper.) Also, this parameter is + * applicable only if the OTG_HSPHY_WIDTH cC parameter was set + * to "8 and 16 bits", meaning that the core has been + * configured to work at either data path width. + * + * 8 or 16 bits (default 16) + */ +extern int dwc_otg_set_param_phy_utmi_width(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_phy_utmi_width(dwc_otg_core_if_t * core_if); +#define dwc_param_phy_utmi_width_default 16 + +/** + * Specifies whether the ULPI operates at double or single + * data rate. This parameter is only applicable if PHY_TYPE is + * ULPI. + * + * 0 - single data rate ULPI interface with 8 bit wide data + * bus (default) + * 1 - double data rate ULPI interface with 4 bit wide data + * bus + */ +extern int dwc_otg_set_param_phy_ulpi_ddr(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_phy_ulpi_ddr(dwc_otg_core_if_t * core_if); +#define dwc_param_phy_ulpi_ddr_default 0 + +/** + * Specifies whether to use the internal or external supply to + * drive the vbus with a ULPI phy. + */ +extern int dwc_otg_set_param_phy_ulpi_ext_vbus(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_phy_ulpi_ext_vbus(dwc_otg_core_if_t * core_if); +#define DWC_PHY_ULPI_INTERNAL_VBUS 0 +#define DWC_PHY_ULPI_EXTERNAL_VBUS 1 +#define dwc_param_phy_ulpi_ext_vbus_default DWC_PHY_ULPI_INTERNAL_VBUS + +/** + * Specifies whether to use the I2Cinterface for full speed PHY. This + * parameter is only applicable if PHY_TYPE is FS. + * 0 - No (default) + * 1 - Yes + */ +extern int dwc_otg_set_param_i2c_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_i2c_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_i2c_enable_default 0 + +extern int dwc_otg_set_param_ulpi_fs_ls(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_ulpi_fs_ls(dwc_otg_core_if_t * core_if); +#define dwc_param_ulpi_fs_ls_default 0 + +extern int dwc_otg_set_param_ts_dline(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_param_ts_dline(dwc_otg_core_if_t * core_if); +#define dwc_param_ts_dline_default 0 + +/** + * Specifies whether dedicated transmit FIFOs are + * enabled for non periodic IN endpoints in device mode + * 0 - No + * 1 - Yes + */ +extern int dwc_otg_set_param_en_multiple_tx_fifo(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_en_multiple_tx_fifo(dwc_otg_core_if_t * + core_if); +#define dwc_param_en_multiple_tx_fifo_default 1 + +/** Number of 4-byte words in each of the Tx FIFOs in device + * mode when dynamic FIFO sizing is enabled. + * 4 to 768 (default 256) + */ +//extern int dwc_otg_set_param_dev_tx_fifo_size(dwc_otg_core_if_t * core_if, +// int fifo_num, int32_t val); +extern int dwc_otg_set_param_dev_tx_fifo_size(dwc_otg_core_if_t * core_if, int32_t val, + int fifo_num); + +extern int32_t dwc_otg_get_param_dev_tx_fifo_size(dwc_otg_core_if_t * core_if, + int fifo_num); +#define dwc_param_dev_tx_fifo_size_default 256 + +/** Thresholding enable flag- + * bit 0 - enable non-ISO Tx thresholding + * bit 1 - enable ISO Tx thresholding + * bit 2 - enable Rx thresholding + */ +extern int dwc_otg_set_param_thr_ctl(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_thr_ctl(dwc_otg_core_if_t * core_if, int fifo_num); +#define dwc_param_thr_ctl_default 0 + +/** Thresholding length for Tx + * FIFOs in 32 bit DWORDs + */ +extern int dwc_otg_set_param_tx_thr_length(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_tx_thr_length(dwc_otg_core_if_t * core_if); +#define dwc_param_tx_thr_length_default 64 + +/** Thresholding length for Rx + * FIFOs in 32 bit DWORDs + */ +extern int dwc_otg_set_param_rx_thr_length(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_rx_thr_length(dwc_otg_core_if_t * core_if); +#define dwc_param_rx_thr_length_default 64 + +/** + * Specifies whether LPM (Link Power Management) support is enabled + */ +extern int dwc_otg_set_param_lpm_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_lpm_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_lpm_enable_default 1 + +/** + * Specifies whether LPM Errata (Link Power Management) support is enabled + */ +extern int dwc_otg_set_param_besl_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_besl_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_besl_enable_default 0 + +/** + * Specifies baseline_besl default value + */ +extern int dwc_otg_set_param_baseline_besl(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_baseline_besl(dwc_otg_core_if_t * core_if); +#define dwc_param_baseline_besl_default 0 + +/** + * Specifies deep_besl default value + */ +extern int dwc_otg_set_param_deep_besl(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_deep_besl(dwc_otg_core_if_t * core_if); +#define dwc_param_deep_besl_default 15 + +/** + * Specifies whether PTI enhancement is enabled + */ +extern int dwc_otg_set_param_pti_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_pti_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_pti_enable_default 0 + +/** + * Specifies whether MPI enhancement is enabled + */ +extern int dwc_otg_set_param_mpi_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_mpi_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_mpi_enable_default 0 + +/** + * Specifies whether ADP capability is enabled + */ +extern int dwc_otg_set_param_adp_enable(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_adp_enable(dwc_otg_core_if_t * core_if); +#define dwc_param_adp_enable_default 0 + +/** + * Specifies whether IC_USB capability is enabled + */ + +extern int dwc_otg_set_param_ic_usb_cap(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_ic_usb_cap(dwc_otg_core_if_t * core_if); +#define dwc_param_ic_usb_cap_default 0 + +extern int dwc_otg_set_param_ahb_thr_ratio(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_ahb_thr_ratio(dwc_otg_core_if_t * core_if); +#define dwc_param_ahb_thr_ratio_default 0 + +extern int dwc_otg_set_param_power_down(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_power_down(dwc_otg_core_if_t * core_if); +#define dwc_param_power_down_default 0 + +extern int dwc_otg_set_param_reload_ctl(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_reload_ctl(dwc_otg_core_if_t * core_if); +#define dwc_param_reload_ctl_default 0 + +extern int dwc_otg_set_param_dev_out_nak(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_dev_out_nak(dwc_otg_core_if_t * core_if); +#define dwc_param_dev_out_nak_default 0 + +extern int dwc_otg_set_param_cont_on_bna(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_cont_on_bna(dwc_otg_core_if_t * core_if); +#define dwc_param_cont_on_bna_default 0 + +extern int dwc_otg_set_param_ahb_single(dwc_otg_core_if_t * core_if, + int32_t val); +extern int32_t dwc_otg_get_param_ahb_single(dwc_otg_core_if_t * core_if); +#define dwc_param_ahb_single_default 0 + +extern int dwc_otg_set_param_otg_ver(dwc_otg_core_if_t * core_if, int32_t val); +extern int32_t dwc_otg_get_param_otg_ver(dwc_otg_core_if_t * core_if); +#define dwc_param_otg_ver_default 0 + +/** @} */ + +/** @name Access to registers and bit-fields */ + +/** + * Dump core registers and SPRAM + */ +extern void dwc_otg_dump_dev_registers(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_dump_spram(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_dump_host_registers(dwc_otg_core_if_t * _core_if); +extern void dwc_otg_dump_global_registers(dwc_otg_core_if_t * _core_if); + +/** + * Get host negotiation status. + */ +extern uint32_t dwc_otg_get_hnpstatus(dwc_otg_core_if_t * core_if); + +/** + * Get srp status + */ +extern uint32_t dwc_otg_get_srpstatus(dwc_otg_core_if_t * core_if); + +/** + * Set hnpreq bit in the GOTGCTL register. + */ +extern void dwc_otg_set_hnpreq(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get Content of SNPSID register. + */ +extern uint32_t dwc_otg_get_gsnpsid(dwc_otg_core_if_t * core_if); + +/** + * Get current mode. + * Returns 0 if in device mode, and 1 if in host mode. + */ +extern uint32_t dwc_otg_get_mode(dwc_otg_core_if_t * core_if); + +/** + * Get value of hnpcapable field in the GUSBCFG register + */ +extern uint32_t dwc_otg_get_hnpcapable(dwc_otg_core_if_t * core_if); +/** + * Set value of hnpcapable field in the GUSBCFG register + */ +extern void dwc_otg_set_hnpcapable(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of srpcapable field in the GUSBCFG register + */ +extern uint32_t dwc_otg_get_srpcapable(dwc_otg_core_if_t * core_if); +/** + * Set value of srpcapable field in the GUSBCFG register + */ +extern void dwc_otg_set_srpcapable(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of devspeed field in the DCFG register + */ +extern uint32_t dwc_otg_get_devspeed(dwc_otg_core_if_t * core_if); +/** + * Set value of devspeed field in the DCFG register + */ +extern void dwc_otg_set_devspeed(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get the value of busconnected field from the HPRT0 register + */ +extern uint32_t dwc_otg_get_busconnected(dwc_otg_core_if_t * core_if); + +/** + * Gets the device enumeration Speed. + */ +extern uint32_t dwc_otg_get_enumspeed(dwc_otg_core_if_t * core_if); + +/** + * Get value of prtpwr field from the HPRT0 register + */ +extern uint32_t dwc_otg_get_prtpower(dwc_otg_core_if_t * core_if); + +/** + * Get value of flag indicating core state - hibernated or not + */ +extern uint32_t dwc_otg_get_core_state(dwc_otg_core_if_t * core_if); + +/** + * Set value of prtpwr field from the HPRT0 register + */ +extern void dwc_otg_set_prtpower(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of prtsusp field from the HPRT0 regsiter + */ +extern uint32_t dwc_otg_get_prtsuspend(dwc_otg_core_if_t * core_if); +/** + * Set value of prtpwr field from the HPRT0 register + */ +extern void dwc_otg_set_prtsuspend(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of ModeChTimEn field from the HCFG regsiter + */ +extern uint32_t dwc_otg_get_mode_ch_tim(dwc_otg_core_if_t * core_if); +/** + * Set value of ModeChTimEn field from the HCFG regsiter + */ +extern void dwc_otg_set_mode_ch_tim(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of Fram Interval field from the HFIR regsiter + */ +extern uint32_t dwc_otg_get_fr_interval(dwc_otg_core_if_t * core_if); +/** + * Set value of Frame Interval field from the HFIR regsiter + */ +extern void dwc_otg_set_fr_interval(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Set value of prtres field from the HPRT0 register + *FIXME Remove? + */ +extern void dwc_otg_set_prtresume(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of rmtwkupsig bit in DCTL register + */ +extern uint32_t dwc_otg_get_remotewakesig(dwc_otg_core_if_t * core_if); + +/** + * Get value of besl_reject bit in DCTL register + */ + +extern uint32_t dwc_otg_get_beslreject(dwc_otg_core_if_t * core_if); + +/** + * Set value of besl_reject bit in DCTL register + */ + +extern void dwc_otg_set_beslreject(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of prt_sleep_sts field from the GLPMCFG register + */ +extern uint32_t dwc_otg_get_lpm_portsleepstatus(dwc_otg_core_if_t * core_if); + +/** + * Get value of rem_wkup_en field from the GLPMCFG register + */ +extern uint32_t dwc_otg_get_lpm_remotewakeenabled(dwc_otg_core_if_t * core_if); + +/** + * Get value of appl_resp field from the GLPMCFG register + */ +extern uint32_t dwc_otg_get_lpmresponse(dwc_otg_core_if_t * core_if); +/** + * Set value of appl_resp field from the GLPMCFG register + */ +extern void dwc_otg_set_lpmresponse(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of hsic_connect field from the GLPMCFG register + */ +extern uint32_t dwc_otg_get_hsic_connect(dwc_otg_core_if_t * core_if); +/** + * Set value of hsic_connect field from the GLPMCFG register + */ +extern void dwc_otg_set_hsic_connect(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * Get value of inv_sel_hsic field from the GLPMCFG register. + */ +extern uint32_t dwc_otg_get_inv_sel_hsic(dwc_otg_core_if_t * core_if); +/** + * Set value of inv_sel_hsic field from the GLPMFG register. + */ +extern void dwc_otg_set_inv_sel_hsic(dwc_otg_core_if_t * core_if, uint32_t val); +/** + * Set value of hird_thresh field from the GLPMFG register. + */ +extern void dwc_otg_set_hirdthresh(dwc_otg_core_if_t * core_if, uint32_t val); +/** + * Get value of hird_thresh field from the GLPMFG register. + */ +extern uint32_t dwc_otg_get_hirdthresh(dwc_otg_core_if_t * core_if); + + +/* + * Some functions for accessing registers + */ + +/** + * GOTGCTL register + */ +extern uint32_t dwc_otg_get_gotgctl(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_gotgctl(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * GUSBCFG register + */ +extern uint32_t dwc_otg_get_gusbcfg(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_gusbcfg(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * GRXFSIZ register + */ +extern uint32_t dwc_otg_get_grxfsiz(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_grxfsiz(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * GNPTXFSIZ register + */ +extern uint32_t dwc_otg_get_gnptxfsiz(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_gnptxfsiz(dwc_otg_core_if_t * core_if, uint32_t val); + +extern uint32_t dwc_otg_get_gpvndctl(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_gpvndctl(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * GGPIO register + */ +extern uint32_t dwc_otg_get_ggpio(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_ggpio(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * GUID register + */ +extern uint32_t dwc_otg_get_guid(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_guid(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * HPRT0 register + */ +extern uint32_t dwc_otg_get_hprt0(dwc_otg_core_if_t * core_if); +extern void dwc_otg_set_hprt0(dwc_otg_core_if_t * core_if, uint32_t val); + +/** + * GHPTXFSIZE + */ +extern uint32_t dwc_otg_get_hptxfsiz(dwc_otg_core_if_t * core_if); + +/** @} */ + +#endif /* __DWC_CORE_IF_H__ */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_dbg.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_dbg.h new file mode 100644 index 0000000..8bfc6dd --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_dbg.h @@ -0,0 +1,115 @@ +/* ========================================================================== + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 __DWC_OTG_DBG_H__ +#define __DWC_OTG_DBG_H__ +#include "section_config.h" + +//#define OTGDEBUG 0 +#undef OTGDEBUG +#define VERBOSE 1 + +/** @file + * This file defines debug levels. + * Debugging support vanishes in non-debug builds. + */ + +/** + * The Debug Level bit-mask variable. + */ +extern uint32_t g_dbg_lvl; +/** + * Set the Debug Level variable. + */ +extern _LONG_CALL_ uint32_t SET_DEBUG_LEVEL(const uint32_t new); + +/** When debug level has the DBG_CIL bit set, display CIL Debug messages. */ +#define DBG_CIL (0x2) +/** When debug level has the DBG_CILV bit set, display CIL Verbose debug + * messages */ +#define DBG_CILV (0x20) +/** When debug level has the DBG_PCD bit set, display PCD (Device) debug + * messages */ +#define DBG_PCD (0x4) +/** When debug level has the DBG_PCDV set, display PCD (Device) Verbose debug + * messages */ +#define DBG_PCDV (0x40) +/** When debug level has the DBG_HCD bit set, display Host debug messages */ +#define DBG_HCD (0x8) +/** When debug level has the DBG_HCDV bit set, display Verbose Host debug + * messages */ +#define DBG_HCDV (0x80) +/** When debug level has the DBG_HCD_URB bit set, display enqueued URBs in host + * mode. */ +#define DBG_HCD_URB (0x800) + +/** When debug level has any bit set, display debug messages */ +#define DBG_ANY (0xFF) + +/** All debug messages off */ +#define DBG_OFF 0 + +/** Prefix string for DWC_DEBUG print macros. */ +#define USB_DWC "DWC_otg: " + +/** + * Print a debug message when the Global debug level variable contains + * the bit defined in lvl. + * + * @param[in] lvl - Debug level, use one of the DBG_ constants above. + * @param[in] x - like printf + * + * Example:

+ * + * DWC_DEBUGPL( DBG_ANY, "%s(%p)\n", __func__, _reg_base_addr); + * + *
+ * results in:
+ * + * usb-DWC_otg: dwc_otg_cil_init(ca867000) + * + */ +#ifdef OTGDEBUG + +//# define DWC_DEBUGPL(lvl, x...) do{ if ((lvl)&g_dbg_lvl)__DWC_DEBUG(USB_DWC x ); }while(0) +# define DWC_DEBUGPL(lvl, x...) do{ if ((lvl)&g_dbg_lvl)DBG_8195A_OTG(x); }while(0) + +# define DWC_DEBUGP(x...) DWC_DEBUGPL(DBG_ANY, x ) + +# define CHK_DEBUG_LEVEL(level) ((level) & g_dbg_lvl) + +#else + +# define DWC_DEBUGPL(lvl, x...) do{}while(0) +# define DWC_DEBUGP(x...) + +# define CHK_DEBUG_LEVEL(level) (0) + +#endif /*DEBUG*/ +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_driver.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_driver.h new file mode 100644 index 0000000..e354b23 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_driver.h @@ -0,0 +1,115 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_driver.h $ + * $Revision: #19 $ + * $Date: 2010/11/15 $ + * $Change: 1627671 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 __DWC_OTG_DRIVER_H__ +#define __DWC_OTG_DRIVER_H__ + +/** @file + * This file contains the interface to the Linux driver. + */ +//#include "dwc_otg_os_dep.h" +#include "dwc_otg_core_if.h" + + +/* Type declarations */ +struct dwc_otg_pcd; +struct dwc_otg_hcd; + +/** + * This structure is a wrapper that encapsulates the driver components used to + * manage a single DWC_otg controller. + */ +typedef struct dwc_otg_device { + /** Structure containing OS-dependent stuff. KEEP THIS STRUCT AT THE + * VERY BEGINNING OF THE DEVICE STRUCT. OSes such as FreeBSD and NetBSD + * require this. */ + //struct os_dependent os_dep; + /** Base address returned from ioremap() */ + void *base; + uint32_t reg_offset; + /** Pointer to the core interface structure. */ + dwc_otg_core_if_t *core_if; + + /** Pointer to the PCD structure. */ + struct dwc_otg_pcd *pcd; + + /** Pointer to the HCD structure. */ + struct dwc_otg_hcd *hcd; + + /** Flag to indicate whether the common IRQ handler is installed. */ + uint8_t common_irq_installed; + +} dwc_otg_device_t; + +/*We must clear S3C24XX_EINTPEND external interrupt register + * because after clearing in this register trigerred IRQ from + * H/W core in kernel interrupt can be occured again before OTG + * handlers clear all IRQ sources of Core registers because of + * timing latencies and Low Level IRQ Type. + */ +#ifdef CONFIG_MACH_IPMATE +#define S3C2410X_CLEAR_EINTPEND() \ +do { \ + __raw_writel(1UL << 11,S3C24XX_EINTPEND); \ +} while (0) +#else +#define S3C2410X_CLEAR_EINTPEND() do { } while (0) +#endif + + +typedef struct USB_OTG_DRV_ADP { + dwc_otg_device_t *otgdev; + IRQ_HANDLE *pIrqHnd; +#if !TASK_SCHEDULER_DISABLED + _Sema Sema; +#else + u32 Sema; +#endif +#ifdef PLATFORM_FREERTOS + xTaskHandle OTGTask; +#else + u32 OTGTask; +#endif + +}USB_OTG_DRV_ADP,*PUSB_OTG_DRV_ADP; + + + +typedef struct _DWC_OTG_ADAPTER_ { + u32 temp0; + dwc_otg_device_t *otgdev; + u8 TestItem; +}DWC_OTG_ADAPTER, *PDWC_OTG_ADAPTER; + + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd.h new file mode 100644 index 0000000..3e5ea24 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd.h @@ -0,0 +1,804 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd.h $ + * $Revision: #58 $ + * $Date: 2011/09/15 $ + * $Change: 1846647 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 DWC_DEVICE_ONLY +#ifndef __DWC_HCD_H__ +#define __DWC_HCD_H__ + +//#include "dwc_otg_os_dep.h" +#include "usb.h" +#include "dwc_otg_hcd_if.h" +#include "dwc_otg_core_if.h" +#include "dwc_list.h" +#include "dwc_otg_cil.h" + +/** + * @file + * + * This file contains the structures, constants, and interfaces for + * the Host Contoller Driver (HCD). + * + * The Host Controller Driver (HCD) is responsible for translating requests + * from the USB Driver into the appropriate actions on the DWC_otg controller. + * It isolates the USBD from the specifics of the controller by providing an + * API to the USBD. + */ + +struct dwc_otg_hcd_pipe_info { + uint8_t dev_addr; + uint8_t ep_num; + uint8_t pipe_type; + uint8_t pipe_dir; + uint16_t mps; +}; + +struct dwc_otg_hcd_iso_packet_desc { + uint32_t offset; + uint32_t length; + uint32_t actual_length; + uint32_t status; +}; + +struct dwc_otg_qtd; + +struct dwc_otg_hcd_urb { + void *priv; + struct dwc_otg_qtd *qtd; + void *buf; + dwc_dma_t dma; + void *setup_packet; + dwc_dma_t setup_dma; + uint32_t length; + uint32_t actual_length; + uint32_t status; + uint32_t error_count; + uint32_t packet_count; + uint32_t flags; + uint16_t interval; + struct dwc_otg_hcd_pipe_info pipe_info; + struct dwc_otg_hcd_iso_packet_desc iso_descs[0]; +}; + +static inline uint8_t dwc_otg_hcd_get_ep_num(struct dwc_otg_hcd_pipe_info *pipe) +{ + return pipe->ep_num; +} + +static inline uint8_t dwc_otg_hcd_get_pipe_type(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return pipe->pipe_type; +} + +static inline uint16_t dwc_otg_hcd_get_mps(struct dwc_otg_hcd_pipe_info *pipe) +{ + return pipe->mps; +} + +static inline uint8_t dwc_otg_hcd_get_dev_addr(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return pipe->dev_addr; +} + +static inline uint8_t dwc_otg_hcd_is_pipe_isoc(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return (pipe->pipe_type == UE_ISOCHRONOUS); +} + +static inline uint8_t dwc_otg_hcd_is_pipe_int(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return (pipe->pipe_type == UE_INTERRUPT); +} + +static inline uint8_t dwc_otg_hcd_is_pipe_bulk(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return (pipe->pipe_type == UE_BULK); +} + +static inline uint8_t dwc_otg_hcd_is_pipe_control(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return (pipe->pipe_type == UE_CONTROL); +} + +static inline uint8_t dwc_otg_hcd_is_pipe_in(struct dwc_otg_hcd_pipe_info *pipe) +{ + return (pipe->pipe_dir == UE_DIR_IN); +} + +static inline uint8_t dwc_otg_hcd_is_pipe_out(struct dwc_otg_hcd_pipe_info + *pipe) +{ + return (!dwc_otg_hcd_is_pipe_in(pipe)); +} + +static inline void dwc_otg_hcd_fill_pipe(struct dwc_otg_hcd_pipe_info *pipe, + uint8_t devaddr, uint8_t ep_num, + uint8_t pipe_type, uint8_t pipe_dir, + uint16_t mps) +{ + pipe->dev_addr = devaddr; + pipe->ep_num = ep_num; + pipe->pipe_type = pipe_type; + pipe->pipe_dir = pipe_dir; + pipe->mps = mps; +} + +/** + * Phases for control transfers. + */ +typedef enum dwc_otg_control_phase { + DWC_OTG_CONTROL_SETUP, + DWC_OTG_CONTROL_DATA, + DWC_OTG_CONTROL_STATUS +} dwc_otg_control_phase_e; + +/** Transaction types. */ +typedef enum dwc_otg_transaction_type { + DWC_OTG_TRANSACTION_NONE, + DWC_OTG_TRANSACTION_PERIODIC, + DWC_OTG_TRANSACTION_NON_PERIODIC, + DWC_OTG_TRANSACTION_ALL +} dwc_otg_transaction_type_e; + +struct dwc_otg_qh; + +/** + * A Queue Transfer Descriptor (QTD) holds the state of a bulk, control, + * interrupt, or isochronous transfer. A single QTD is created for each URB + * (of one of these types) submitted to the HCD. The transfer associated with + * a QTD may require one or multiple transactions. + * + * A QTD is linked to a Queue Head, which is entered in either the + * non-periodic or periodic schedule for execution. When a QTD is chosen for + * execution, some or all of its transactions may be executed. After + * execution, the state of the QTD is updated. The QTD may be retired if all + * its transactions are complete or if an error occurred. Otherwise, it + * remains in the schedule so more transactions can be executed later. + */ +typedef struct dwc_otg_qtd { + /** + * Determines the PID of the next data packet for the data phase of + * control transfers. Ignored for other transfer types.
+ * One of the following values: + * - DWC_OTG_HC_PID_DATA0 + * - DWC_OTG_HC_PID_DATA1 + */ + uint8_t data_toggle; + + /** Current phase for control transfers (Setup, Data, or Status). */ + dwc_otg_control_phase_e control_phase; + + /** Keep track of the current split type + * for FS/LS endpoints on a HS Hub */ + uint8_t complete_split; + + /** How many bytes transferred during SSPLIT OUT */ + uint32_t ssplit_out_xfer_count; + + /** + * Holds the number of bus errors that have occurred for a transaction + * within this transfer. + */ + uint8_t error_count; + + /** + * Index of the next frame descriptor for an isochronous transfer. A + * frame descriptor describes the buffer position and length of the + * data to be transferred in the next scheduled (micro)frame of an + * isochronous transfer. It also holds status for that transaction. + * The frame index starts at 0. + */ + uint16_t isoc_frame_index; + + /** Position of the ISOC split on full/low speed */ + uint8_t isoc_split_pos; + + /** Position of the ISOC split in the buffer for the current frame */ + uint16_t isoc_split_offset; + + /** URB for this transfer */ + struct dwc_otg_hcd_urb *urb; + + struct dwc_otg_qh *qh; + + /** This list of QTDs */ + DWC_CIRCLEQ_ENTRY(dwc_otg_qtd) qtd_list_entry; + + /** Indicates if this QTD is currently processed by HW. */ + uint8_t in_process; + + /** Number of DMA descriptors for this QTD */ + uint8_t n_desc; + + /** + * Last activated frame(packet) index. + * Used in Descriptor DMA mode only. + */ + uint16_t isoc_frame_index_last; + +} dwc_otg_qtd_t; + +DWC_CIRCLEQ_HEAD(dwc_otg_qtd_list, dwc_otg_qtd); + +/** + * A Queue Head (QH) holds the static characteristics of an endpoint and + * maintains a list of transfers (QTDs) for that endpoint. A QH structure may + * be entered in either the non-periodic or periodic schedule. + */ +typedef struct dwc_otg_qh { + /** + * Endpoint type. + * One of the following values: + * - UE_CONTROL + * - UE_BULK + * - UE_INTERRUPT + * - UE_ISOCHRONOUS + */ + uint8_t ep_type; + uint8_t ep_is_in; + + /** wMaxPacketSize Field of Endpoint Descriptor. */ + uint16_t maxp; + + /** + * Device speed. + * One of the following values: + * - DWC_OTG_EP_SPEED_LOW + * - DWC_OTG_EP_SPEED_FULL + * - DWC_OTG_EP_SPEED_HIGH + */ + uint8_t dev_speed; + + /** + * Determines the PID of the next data packet for non-control + * transfers. Ignored for control transfers.
+ * One of the following values: + * - DWC_OTG_HC_PID_DATA0 + * - DWC_OTG_HC_PID_DATA1 + */ + uint8_t data_toggle; + + /** Ping state if 1. */ + uint8_t ping_state; + + /** + * List of QTDs for this QH. + */ + struct dwc_otg_qtd_list qtd_list; + + /** Host channel currently processing transfers for this QH. */ + struct dwc_hc *channel; + + /** Full/low speed endpoint on high-speed hub requires split. */ + uint8_t do_split; + + /** @name Periodic schedule information */ + /** @{ */ + + /** Bandwidth in microseconds per (micro)frame. */ + uint16_t usecs; + + /** Interval between transfers in (micro)frames. */ + uint16_t interval; + + /** + * (micro)frame to initialize a periodic transfer. The transfer + * executes in the following (micro)frame. + */ + uint16_t sched_frame; + + /** (micro)frame at which last start split was initialized. */ + uint16_t start_split_frame; + + /** @} */ + + /** + * Used instead of original buffer if + * it(physical address) is not dword-aligned. + */ + uint8_t *dw_align_buf; + dwc_dma_t dw_align_buf_dma; + + /** Entry for QH in either the periodic or non-periodic schedule. */ + dwc_list_link_t qh_list_entry; + + /** @name Descriptor DMA support */ + /** @{ */ + + /** Descriptor List. */ + dwc_otg_host_dma_desc_t *desc_list; + + /** Descriptor List physical address. */ + dwc_dma_t desc_list_dma; + + /** + * Xfer Bytes array. + * Each element corresponds to a descriptor and indicates + * original XferSize size value for the descriptor. + */ + uint32_t *n_bytes; + + /** Actual number of transfer descriptors in a list. */ + uint16_t ntd; + + /** First activated isochronous transfer descriptor index. */ + uint8_t td_first; + /** Last activated isochronous transfer descriptor index. */ + uint8_t td_last; + + /** @} */ + +} dwc_otg_qh_t; + +DWC_CIRCLEQ_HEAD(hc_list, dwc_hc); + +/** + * This structure holds the state of the HCD, including the non-periodic and + * periodic schedules. + */ +struct dwc_otg_hcd { + /** The DWC otg device pointer */ + struct dwc_otg_device *otg_dev; + /** DWC OTG Core Interface Layer */ + dwc_otg_core_if_t *core_if; + + /** Function HCD driver callbacks */ + struct dwc_otg_hcd_function_ops *fops; + + /** Internal DWC HCD Flags */ + volatile union dwc_otg_hcd_internal_flags { + uint32_t d32; + struct { + unsigned port_connect_status_change:1; + unsigned port_connect_status:1; + unsigned port_reset_change:1; + unsigned port_enable_change:1; + unsigned port_suspend_change:1; + unsigned port_over_current_change:1; + unsigned port_l1_change:1; + unsigned reserved:26; + } b; + } flags; + + /** + * Inactive items in the non-periodic schedule. This is a list of + * Queue Heads. Transfers associated with these Queue Heads are not + * currently assigned to a host channel. + */ + dwc_list_link_t non_periodic_sched_inactive; + + /** + * Active items in the non-periodic schedule. This is a list of + * Queue Heads. Transfers associated with these Queue Heads are + * currently assigned to a host channel. + */ + dwc_list_link_t non_periodic_sched_active; + + /** + * Pointer to the next Queue Head to process in the active + * non-periodic schedule. + */ + dwc_list_link_t *non_periodic_qh_ptr; + + /** + * Inactive items in the periodic schedule. This is a list of QHs for + * periodic transfers that are _not_ scheduled for the next frame. + * Each QH in the list has an interval counter that determines when it + * needs to be scheduled for execution. This scheduling mechanism + * allows only a simple calculation for periodic bandwidth used (i.e. + * must assume that all periodic transfers may need to execute in the + * same frame). However, it greatly simplifies scheduling and should + * be sufficient for the vast majority of OTG hosts, which need to + * connect to a small number of peripherals at one time. + * + * Items move from this list to periodic_sched_ready when the QH + * interval counter is 0 at SOF. + */ + dwc_list_link_t periodic_sched_inactive; + + /** + * List of periodic QHs that are ready for execution in the next + * frame, but have not yet been assigned to host channels. + * + * Items move from this list to periodic_sched_assigned as host + * channels become available during the current frame. + */ + dwc_list_link_t periodic_sched_ready; + + /** + * List of periodic QHs to be executed in the next frame that are + * assigned to host channels. + * + * Items move from this list to periodic_sched_queued as the + * transactions for the QH are queued to the DWC_otg controller. + */ + dwc_list_link_t periodic_sched_assigned; + + /** + * List of periodic QHs that have been queued for execution. + * + * Items move from this list to either periodic_sched_inactive or + * periodic_sched_ready when the channel associated with the transfer + * is released. If the interval for the QH is 1, the item moves to + * periodic_sched_ready because it must be rescheduled for the next + * frame. Otherwise, the item moves to periodic_sched_inactive. + */ + dwc_list_link_t periodic_sched_queued; + + /** + * Total bandwidth claimed so far for periodic transfers. This value + * is in microseconds per (micro)frame. The assumption is that all + * periodic transfers may occur in the same (micro)frame. + */ + uint16_t periodic_usecs; + + /** + * Frame number read from the core at SOF. The value ranges from 0 to + * DWC_HFNUM_MAX_FRNUM. + */ + uint16_t frame_number; + + /** + * Count of periodic QHs, if using several eps. For SOF enable/disable. + */ + uint16_t periodic_qh_count; + + /** + * Free host channels in the controller. This is a list of + * dwc_hc_t items. + */ + struct hc_list free_hc_list; + /** + * Number of host channels assigned to periodic transfers. Currently + * assuming that there is a dedicated host channel for each periodic + * transaction and at least one host channel available for + * non-periodic transactions. + */ + int periodic_channels; + + /** + * Number of host channels assigned to non-periodic transfers. + */ + int non_periodic_channels; + + /** + * Array of pointers to the host channel descriptors. Allows accessing + * a host channel descriptor given the host channel number. This is + * useful in interrupt handlers. + */ + struct dwc_hc *hc_ptr_array[MAX_EPS_CHANNELS]; + + /** + * Buffer to use for any data received during the status phase of a + * control transfer. Normally no data is transferred during the status + * phase. This buffer is used as a bit bucket. + */ + uint8_t *status_buf; + + /** + * DMA address for status_buf. + */ + dma_addr_t status_buf_dma; +#define DWC_OTG_HCD_STATUS_BUF_SIZE 64 + + /** + * Connection timer. An OTG host must display a message if the device + * does not connect. Started when the VBus power is turned on via + * sysfs attribute "buspower". + */ + dwc_timer_t *conn_timer; + + /* Tasket to do a reset */ + //dwc_tasklet_t *reset_tasklet; + + /* */ + dwc_spinlock_t *lock; + + /** + * Private data that could be used by OS wrapper. + */ + void *priv; + + uint8_t otg_port; + + /** Frame List */ + uint32_t *frame_list; + + /** Frame List DMA address */ + dma_addr_t frame_list_dma; + +#ifdef OTGDEBUG + uint32_t frrem_samples; + uint64_t frrem_accum; + + uint32_t hfnum_7_samples_a; + uint64_t hfnum_7_frrem_accum_a; + uint32_t hfnum_0_samples_a; + uint64_t hfnum_0_frrem_accum_a; + uint32_t hfnum_other_samples_a; + uint64_t hfnum_other_frrem_accum_a; + + uint32_t hfnum_7_samples_b; + uint64_t hfnum_7_frrem_accum_b; + uint32_t hfnum_0_samples_b; + uint64_t hfnum_0_frrem_accum_b; + uint32_t hfnum_other_samples_b; + uint64_t hfnum_other_frrem_accum_b; +#endif +}; + +/** @name Transaction Execution Functions */ +/** @{ */ +extern dwc_otg_transaction_type_e dwc_otg_hcd_select_transactions(dwc_otg_hcd_t + * hcd); +extern void dwc_otg_hcd_queue_transactions(dwc_otg_hcd_t * hcd, + dwc_otg_transaction_type_e tr_type); + +/** @} */ + +/** @name Interrupt Handler Functions */ +/** @{ */ +extern int32_t dwc_otg_hcd_handle_intr(dwc_otg_hcd_t * dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_sof_intr(dwc_otg_hcd_t * dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_rx_status_q_level_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_np_tx_fifo_empty_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_perio_tx_fifo_empty_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_incomplete_periodic_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_port_intr(dwc_otg_hcd_t * dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_conn_id_status_change_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_disconnect_intr(dwc_otg_hcd_t * dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_hc_intr(dwc_otg_hcd_t * dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_hc_n_intr(dwc_otg_hcd_t * dwc_otg_hcd, + uint32_t num); +extern int32_t dwc_otg_hcd_handle_session_req_intr(dwc_otg_hcd_t * dwc_otg_hcd); +extern int32_t dwc_otg_hcd_handle_wakeup_detected_intr(dwc_otg_hcd_t * + dwc_otg_hcd); +/** @} */ + +/** @name Schedule Queue Functions */ +/** @{ */ + +/* Implemented in dwc_otg_hcd_queue.c */ +extern dwc_otg_qh_t *dwc_otg_hcd_qh_create(dwc_otg_hcd_t * hcd, + dwc_otg_hcd_urb_t * urb, int atomic_alloc); +extern void dwc_otg_hcd_qh_free(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern int dwc_otg_hcd_qh_add(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_qh_remove(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_qh_deactivate(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh, + int sched_csplit); + +/** Remove and free a QH */ +static inline void dwc_otg_hcd_qh_remove_and_free(dwc_otg_hcd_t * hcd, + dwc_otg_qh_t * qh) +{ + dwc_irqflags_t flags; + DWC_SPINLOCK_IRQSAVE(hcd->lock, &flags); + dwc_otg_hcd_qh_remove(hcd, qh); + DWC_SPINUNLOCK_IRQRESTORE(hcd->lock, flags); + dwc_otg_hcd_qh_free(hcd, qh); +} + +/** Allocates memory for a QH structure. + * @return Returns the memory allocate or NULL on error. */ +static inline dwc_otg_qh_t *dwc_otg_hcd_qh_alloc(int atomic_alloc) +{ + if (atomic_alloc) + return (dwc_otg_qh_t *) DWC_ALLOC_ATOMIC(sizeof(dwc_otg_qh_t)); + else + return (dwc_otg_qh_t *) DWC_ALLOC(sizeof(dwc_otg_qh_t)); +} + +extern dwc_otg_qtd_t *dwc_otg_hcd_qtd_create(dwc_otg_hcd_urb_t * urb, + int atomic_alloc); +extern void dwc_otg_hcd_qtd_init(dwc_otg_qtd_t * qtd, dwc_otg_hcd_urb_t * urb); +extern int dwc_otg_hcd_qtd_add(dwc_otg_qtd_t * qtd, dwc_otg_hcd_t * dwc_otg_hcd, + dwc_otg_qh_t ** qh, int atomic_alloc); + +/** Allocates memory for a QTD structure. + * @return Returns the memory allocate or NULL on error. */ +static inline dwc_otg_qtd_t *dwc_otg_hcd_qtd_alloc(int atomic_alloc) +{ + if (atomic_alloc) + return (dwc_otg_qtd_t *) DWC_ALLOC_ATOMIC(sizeof(dwc_otg_qtd_t)); + else + return (dwc_otg_qtd_t *) DWC_ALLOC(sizeof(dwc_otg_qtd_t)); +} + +/** Frees the memory for a QTD structure. QTD should already be removed from + * list. + * @param qtd QTD to free.*/ +static inline void dwc_otg_hcd_qtd_free(dwc_otg_qtd_t * qtd) +{ + DWC_FREE(qtd); +} + +/** Removes a QTD from list. + * @param hcd HCD instance. + * @param qtd QTD to remove from list. + * @param qh QTD belongs to. + */ +static inline void dwc_otg_hcd_qtd_remove(dwc_otg_hcd_t * hcd, + dwc_otg_qtd_t * qtd, + dwc_otg_qh_t * qh) +{ + DWC_CIRCLEQ_REMOVE(&qh->qtd_list, qtd, qtd_list_entry); +} + +/** Remove and free a QTD + * Need to disable IRQ and hold hcd lock while calling this function out of + * interrupt servicing chain */ +static inline void dwc_otg_hcd_qtd_remove_and_free(dwc_otg_hcd_t * hcd, + dwc_otg_qtd_t * qtd, + dwc_otg_qh_t * qh) +{ + dwc_otg_hcd_qtd_remove(hcd, qtd, qh); + dwc_otg_hcd_qtd_free(qtd); +} + +/** @} */ + +/** @name Descriptor DMA Supporting Functions */ +/** @{ */ + +extern void dwc_otg_hcd_start_xfer_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_complete_xfer_ddma(dwc_otg_hcd_t * hcd, + dwc_hc_t * hc, + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_halt_status_e halt_status); + +extern int dwc_otg_hcd_qh_init_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +extern void dwc_otg_hcd_qh_free_ddma(dwc_otg_hcd_t * hcd, dwc_otg_qh_t * qh); +void reset_tasklet_func(void *data); + +/** @} */ + +/** @name Internal Functions */ +/** @{ */ +dwc_otg_qh_t *dwc_urb_to_qh(dwc_otg_hcd_urb_t * urb); +/** @} */ + +#ifdef CONFIG_USB_DWC_OTG_LPM +extern int dwc_otg_hcd_get_hc_for_lpm_tran(dwc_otg_hcd_t * hcd, + uint8_t devaddr); +extern void dwc_otg_hcd_free_hc_from_lpm(dwc_otg_hcd_t * hcd); +#endif + +/** Gets the QH that contains the list_head */ +#define dwc_list_to_qh(_list_head_ptr_) container_of(_list_head_ptr_, dwc_otg_qh_t, qh_list_entry) + +/** Gets the QTD that contains the list_head */ +#define dwc_list_to_qtd(_list_head_ptr_) container_of(_list_head_ptr_, dwc_otg_qtd_t, qtd_list_entry) + +/** Check if QH is non-periodic */ +#define dwc_qh_is_non_per(_qh_ptr_) ((_qh_ptr_->ep_type == UE_BULK) || \ + (_qh_ptr_->ep_type == UE_CONTROL)) + +/** High bandwidth multiplier as encoded in highspeed endpoint descriptors */ +#define dwc_hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03)) + +/** Packet size for any kind of endpoint descriptor */ +#define dwc_max_packet(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff) + +/** + * Returns true if _frame1 is less than or equal to _frame2. The comparison is + * done modulo DWC_HFNUM_MAX_FRNUM. This accounts for the rollover of the + * frame number when the max frame number is reached. + */ +static inline int dwc_frame_num_le(uint16_t frame1, uint16_t frame2) +{ + return ((frame2 - frame1) & DWC_HFNUM_MAX_FRNUM) <= + (DWC_HFNUM_MAX_FRNUM >> 1); +} + +/** + * Returns true if _frame1 is greater than _frame2. The comparison is done + * modulo DWC_HFNUM_MAX_FRNUM. This accounts for the rollover of the frame + * number when the max frame number is reached. + */ +static inline int dwc_frame_num_gt(uint16_t frame1, uint16_t frame2) +{ + return (frame1 != frame2) && + (((frame1 - frame2) & DWC_HFNUM_MAX_FRNUM) < + (DWC_HFNUM_MAX_FRNUM >> 1)); +} + +/** + * Increments _frame by the amount specified by _inc. The addition is done + * modulo DWC_HFNUM_MAX_FRNUM. Returns the incremented value. + */ +static inline uint16_t dwc_frame_num_inc(uint16_t frame, uint16_t inc) +{ + return (frame + inc) & DWC_HFNUM_MAX_FRNUM; +} + +static inline uint16_t dwc_full_frame_num(uint16_t frame) +{ + return (frame & DWC_HFNUM_MAX_FRNUM) >> 3; +} + +static inline uint16_t dwc_micro_frame_num(uint16_t frame) +{ + return frame & 0x7; +} + +void dwc_otg_hcd_save_data_toggle(dwc_hc_t * hc, + dwc_otg_hc_regs_t * hc_regs, + dwc_otg_qtd_t * qtd); + +#ifdef OTGDEBUG +/** + * Macro to sample the remaining PHY clocks left in the current frame. This + * may be used during debugging to determine the average time it takes to + * execute sections of code. There are two possible sample points, "a" and + * "b", so the _letter argument must be one of these values. + * + * To dump the average sample times, read the "hcd_frrem" sysfs attribute. For + * example, "cat /sys/devices/lm0/hcd_frrem". + */ +#define dwc_sample_frrem(_hcd, _qh, _letter) \ +{ \ + hfnum_data_t hfnum; \ + dwc_otg_qtd_t *qtd; \ + qtd = list_entry(_qh->qtd_list.next, dwc_otg_qtd_t, qtd_list_entry); \ + if (usb_pipeint(qtd->urb->pipe) && _qh->start_split_frame != 0 && !qtd->complete_split) { \ + hfnum.d32 = DWC_READ_REG32(&_hcd->core_if->host_if->host_global_regs->hfnum); \ + switch (hfnum.b.frnum & 0x7) { \ + case 7: \ + _hcd->hfnum_7_samples_##_letter++; \ + _hcd->hfnum_7_frrem_accum_##_letter += hfnum.b.frrem; \ + break; \ + case 0: \ + _hcd->hfnum_0_samples_##_letter++; \ + _hcd->hfnum_0_frrem_accum_##_letter += hfnum.b.frrem; \ + break; \ + default: \ + _hcd->hfnum_other_samples_##_letter++; \ + _hcd->hfnum_other_frrem_accum_##_letter += hfnum.b.frrem; \ + break; \ + } \ + } \ +} +#else +#define dwc_sample_frrem(_hcd, _qh, _letter) +#endif +#endif +#endif /* DWC_DEVICE_ONLY */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd_if.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd_if.h new file mode 100644 index 0000000..b3dc806 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_hcd_if.h @@ -0,0 +1,412 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_hcd_if.h $ + * $Revision: #12 $ + * $Date: 2011/10/26 $ + * $Change: 1873028 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 DWC_DEVICE_ONLY +#ifndef __DWC_HCD_IF_H__ +#define __DWC_HCD_IF_H__ + +#include "dwc_otg_core_if.h" + +/** @file + * This file defines DWC_OTG HCD Core API. + */ + +struct dwc_otg_hcd; +typedef struct dwc_otg_hcd dwc_otg_hcd_t; + +struct dwc_otg_hcd_urb; +typedef struct dwc_otg_hcd_urb dwc_otg_hcd_urb_t; + +/** @name HCD Function Driver Callbacks */ +/** @{ */ + +/** This function is called whenever core switches to host mode. */ +typedef int (*dwc_otg_hcd_start_cb_t) (dwc_otg_hcd_t * hcd); + +/** This function is called when device has been disconnected */ +typedef int (*dwc_otg_hcd_disconnect_cb_t) (dwc_otg_hcd_t * hcd); + +/** Wrapper provides this function to HCD to core, so it can get hub information to which device is connected */ +typedef int (*dwc_otg_hcd_hub_info_from_urb_cb_t) (dwc_otg_hcd_t * hcd, + void *urb_handle, + uint32_t * hub_addr, + uint32_t * port_addr); +/** Via this function HCD core gets device speed */ +typedef int (*dwc_otg_hcd_speed_from_urb_cb_t) (dwc_otg_hcd_t * hcd, + void *urb_handle); + +/** This function is called when urb is completed */ +typedef int (*dwc_otg_hcd_complete_urb_cb_t) (dwc_otg_hcd_t * hcd, + void *urb_handle, + dwc_otg_hcd_urb_t * dwc_otg_urb, + int32_t status); + +/** Via this function HCD core gets b_hnp_enable parameter */ +typedef int (*dwc_otg_hcd_get_b_hnp_enable) (dwc_otg_hcd_t * hcd); + +struct dwc_otg_hcd_function_ops { + dwc_otg_hcd_start_cb_t start; + dwc_otg_hcd_disconnect_cb_t disconnect; + dwc_otg_hcd_hub_info_from_urb_cb_t hub_info; + dwc_otg_hcd_speed_from_urb_cb_t speed; + dwc_otg_hcd_complete_urb_cb_t complete; + dwc_otg_hcd_get_b_hnp_enable get_b_hnp_enable; +}; +/** @} */ + +/** @name HCD Core API */ +/** @{ */ +/** This function allocates dwc_otg_hcd structure and returns pointer on it. */ +extern dwc_otg_hcd_t *dwc_otg_hcd_alloc_hcd(void); + +/** This function should be called to initiate HCD Core. + * + * @param hcd The HCD + * @param core_if The DWC_OTG Core + * + * Returns -DWC_E_NO_MEMORY if no enough memory. + * Returns 0 on success + */ +extern int dwc_otg_hcd_init(dwc_otg_hcd_t * hcd, dwc_otg_core_if_t * core_if); + +/** Frees HCD + * + * @param hcd The HCD + */ +extern void dwc_otg_hcd_remove(dwc_otg_hcd_t * hcd); + +/** This function should be called on every hardware interrupt. + * + * @param dwc_otg_hcd The HCD + * + * Returns non zero if interrupt is handled + * Return 0 if interrupt is not handled + */ +extern int32_t dwc_otg_hcd_handle_intr(dwc_otg_hcd_t * dwc_otg_hcd); + +/** + * Returns private data set by + * dwc_otg_hcd_set_priv_data function. + * + * @param hcd The HCD + */ +extern void *dwc_otg_hcd_get_priv_data(dwc_otg_hcd_t * hcd); + +/** + * Set private data. + * + * @param hcd The HCD + * @param priv_data pointer to be stored in private data + */ +extern void dwc_otg_hcd_set_priv_data(dwc_otg_hcd_t * hcd, void *priv_data); + +/** + * This function initializes the HCD Core. + * + * @param hcd The HCD + * @param fops The Function Driver Operations data structure containing pointers to all callbacks. + * + * Returns -DWC_E_NO_DEVICE if Core is currently is in device mode. + * Returns 0 on success + */ +extern int dwc_otg_hcd_start(dwc_otg_hcd_t * hcd, + struct dwc_otg_hcd_function_ops *fops); + +/** + * Halts the DWC_otg host mode operations in a clean manner. USB transfers are + * stopped. + * + * @param hcd The HCD + */ +extern void dwc_otg_hcd_stop(dwc_otg_hcd_t * hcd); + +/** + * Handles hub class-specific requests. + * + * @param dwc_otg_hcd The HCD + * @param typeReq Request Type + * @param wValue wValue from control request + * @param wIndex wIndex from control request + * @param buf data buffer + * @param wLength data buffer length + * + * Returns -DWC_E_INVALID if invalid argument is passed + * Returns 0 on success + */ +extern int dwc_otg_hcd_hub_control(dwc_otg_hcd_t * dwc_otg_hcd, + uint16_t typeReq, uint16_t wValue, + uint16_t wIndex, uint8_t * buf, + uint16_t wLength); + +/** + * Returns otg port number. + * + * @param hcd The HCD + */ +extern uint32_t dwc_otg_hcd_otg_port(dwc_otg_hcd_t * hcd); + +/** + * Returns OTG version - either 1.3 or 2.0. + * + * @param core_if The core_if structure pointer + */ +extern uint16_t dwc_otg_get_otg_version(dwc_otg_core_if_t * core_if); + +/** + * Returns 1 if currently core is acting as B host, and 0 otherwise. + * + * @param hcd The HCD + */ +extern uint32_t dwc_otg_hcd_is_b_host(dwc_otg_hcd_t * hcd); + +/** + * Returns current frame number. + * + * @param hcd The HCD + */ +extern int dwc_otg_hcd_get_frame_number(dwc_otg_hcd_t * hcd); + +/** + * Dumps hcd state. + * + * @param hcd The HCD + */ +extern void dwc_otg_hcd_dump_state(dwc_otg_hcd_t * hcd); + +/** + * Dump the average frame remaining at SOF. This can be used to + * determine average interrupt latency. Frame remaining is also shown for + * start transfer and two additional sample points. + * Currently this function is not implemented. + * + * @param hcd The HCD + */ +extern void dwc_otg_hcd_dump_frrem(dwc_otg_hcd_t * hcd); + +/** + * Sends LPM transaction to the local device. + * + * @param hcd The HCD + * @param devaddr Device Address + * @param hird Host initiated resume duration + * @param bRemoteWake Value of bRemoteWake field in LPM transaction + * + * Returns negative value if sending LPM transaction was not succeeded. + * Returns 0 on success. + */ +extern int dwc_otg_hcd_send_lpm(dwc_otg_hcd_t * hcd, uint8_t devaddr, + uint8_t hird, uint8_t bRemoteWake); + +/* URB interface */ + +/** + * Allocates memory for dwc_otg_hcd_urb structure. + * Allocated memory should be freed by call of DWC_FREE. + * + * @param hcd The HCD + * @param iso_desc_count Count of ISOC descriptors + * @param atomic_alloc Specefies whether to perform atomic allocation. + */ +extern dwc_otg_hcd_urb_t *dwc_otg_hcd_urb_alloc(dwc_otg_hcd_t * hcd, + int iso_desc_count, + int atomic_alloc); + +/** + * Set pipe information in URB. + * + * @param hcd_urb DWC_OTG URB + * @param devaddr Device Address + * @param ep_num Endpoint Number + * @param ep_type Endpoint Type + * @param ep_dir Endpoint Direction + * @param mps Max Packet Size + */ +extern void dwc_otg_hcd_urb_set_pipeinfo(dwc_otg_hcd_urb_t * hcd_urb, + uint8_t devaddr, uint8_t ep_num, + uint8_t ep_type, uint8_t ep_dir, + uint16_t mps); + +/* Transfer flags */ +#define URB_GIVEBACK_ASAP 0x1 +#define URB_SEND_ZERO_PACKET 0x2 + +/** + * Sets dwc_otg_hcd_urb parameters. + * + * @param urb DWC_OTG URB allocated by dwc_otg_hcd_urb_alloc function. + * @param urb_handle Unique handle for request, this will be passed back + * to function driver in completion callback. + * @param buf The buffer for the data + * @param dma The DMA buffer for the data + * @param buflen Transfer length + * @param sp Buffer for setup data + * @param sp_dma DMA address of setup data buffer + * @param flags Transfer flags + * @param interval Polling interval for interrupt or isochronous transfers. + */ +extern void dwc_otg_hcd_urb_set_params(dwc_otg_hcd_urb_t * urb, + void *urb_handle, void *buf, + dwc_dma_t dma, uint32_t buflen, void *sp, + dwc_dma_t sp_dma, uint32_t flags, + uint16_t interval); + +/** Gets status from dwc_otg_hcd_urb + * + * @param dwc_otg_urb DWC_OTG URB + */ +extern uint32_t dwc_otg_hcd_urb_get_status(dwc_otg_hcd_urb_t * dwc_otg_urb); + +/** Gets actual length from dwc_otg_hcd_urb + * + * @param dwc_otg_urb DWC_OTG URB + */ +extern uint32_t dwc_otg_hcd_urb_get_actual_length(dwc_otg_hcd_urb_t * + dwc_otg_urb); + +/** Gets error count from dwc_otg_hcd_urb. Only for ISOC URBs + * + * @param dwc_otg_urb DWC_OTG URB + */ +extern uint32_t dwc_otg_hcd_urb_get_error_count(dwc_otg_hcd_urb_t * + dwc_otg_urb); + +/** Set ISOC descriptor offset and length + * + * @param dwc_otg_urb DWC_OTG URB + * @param desc_num ISOC descriptor number + * @param offset Offset from beginig of buffer. + * @param length Transaction length + */ +extern void dwc_otg_hcd_urb_set_iso_desc_params(dwc_otg_hcd_urb_t * dwc_otg_urb, + int desc_num, uint32_t offset, + uint32_t length); + +/** Get status of ISOC descriptor, specified by desc_num + * + * @param dwc_otg_urb DWC_OTG URB + * @param desc_num ISOC descriptor number + */ +extern uint32_t dwc_otg_hcd_urb_get_iso_desc_status(dwc_otg_hcd_urb_t * + dwc_otg_urb, int desc_num); + +/** Get actual length of ISOC descriptor, specified by desc_num + * + * @param dwc_otg_urb DWC_OTG URB + * @param desc_num ISOC descriptor number + */ +extern uint32_t dwc_otg_hcd_urb_get_iso_desc_actual_length(dwc_otg_hcd_urb_t * + dwc_otg_urb, + int desc_num); + +/** Queue URB. After transfer is completes, the complete callback will be called with the URB status + * + * @param dwc_otg_hcd The HCD + * @param dwc_otg_urb DWC_OTG URB + * @param ep_handle Out parameter for returning endpoint handle + * @param atomic_alloc Flag to do atomic allocation if needed + * + * Returns -DWC_E_NO_DEVICE if no device is connected. + * Returns -DWC_E_NO_MEMORY if there is no enough memory. + * Returns 0 on success. + */ +extern int dwc_otg_hcd_urb_enqueue(dwc_otg_hcd_t * dwc_otg_hcd, + dwc_otg_hcd_urb_t * dwc_otg_urb, + void **ep_handle, int atomic_alloc); + +/** De-queue the specified URB + * + * @param dwc_otg_hcd The HCD + * @param dwc_otg_urb DWC_OTG URB + */ +extern int dwc_otg_hcd_urb_dequeue(dwc_otg_hcd_t * dwc_otg_hcd, + dwc_otg_hcd_urb_t * dwc_otg_urb); + +/** Frees resources in the DWC_otg controller related to a given endpoint. + * Any URBs for the endpoint must already be dequeued. + * + * @param hcd The HCD + * @param ep_handle Endpoint handle, returned by dwc_otg_hcd_urb_enqueue function + * @param retry Number of retries if there are queued transfers. + * + * Returns -DWC_E_INVALID if invalid arguments are passed. + * Returns 0 on success + */ +extern int dwc_otg_hcd_endpoint_disable(dwc_otg_hcd_t * hcd, void *ep_handle, + int retry); + +/* Resets the data toggle in qh structure. This function can be called from + * usb_clear_halt routine. + * + * @param hcd The HCD + * @param ep_handle Endpoint handle, returned by dwc_otg_hcd_urb_enqueue function + * + * Returns -DWC_E_INVALID if invalid arguments are passed. + * Returns 0 on success + */ +extern int dwc_otg_hcd_endpoint_reset(dwc_otg_hcd_t * hcd, void *ep_handle); + +/** Returns 1 if status of specified port is changed and 0 otherwise. + * + * @param hcd The HCD + * @param port Port number + */ +extern int dwc_otg_hcd_is_status_changed(dwc_otg_hcd_t * hcd, int port); + +/** Call this function to check if bandwidth was allocated for specified endpoint. + * Only for ISOC and INTERRUPT endpoints. + * + * @param hcd The HCD + * @param ep_handle Endpoint handle + */ +extern int dwc_otg_hcd_is_bandwidth_allocated(dwc_otg_hcd_t * hcd, + void *ep_handle); + +/** Call this function to check if bandwidth was freed for specified endpoint. + * + * @param hcd The HCD + * @param ep_handle Endpoint handle + */ +extern int dwc_otg_hcd_is_bandwidth_freed(dwc_otg_hcd_t * hcd, void *ep_handle); + +/** Returns bandwidth allocated for specified endpoint in microseconds. + * Only for ISOC and INTERRUPT endpoints. + * + * @param hcd The HCD + * @param ep_handle Endpoint handle + */ +extern uint8_t dwc_otg_hcd_get_ep_bandwidth(dwc_otg_hcd_t * hcd, + void *ep_handle); + +/** @} */ + +#endif /* __DWC_HCD_IF_H__ */ +#endif /* DWC_DEVICE_ONLY */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_os_dep.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_os_dep.h new file mode 100644 index 0000000..4c23670 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_os_dep.h @@ -0,0 +1,5 @@ +#ifndef _DWC_OS_DEP_H_ +#define _DWC_OS_DEP_H_ +#include "errno.h" + +#endif /* _DWC_OS_DEP_H_ */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd.h new file mode 100644 index 0000000..4a99b34 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd.h @@ -0,0 +1,268 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd.h $ + * $Revision: #49 $ + * $Date: 2013/05/16 $ + * $Change: 2231774 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 DWC_HOST_ONLY +#if !defined(__DWC_PCD_H__) +#define __DWC_PCD_H__ + +#include "dwc_otg_os_dep.h" +#include "usb.h" +#include "dwc_otg_cil.h" +#include "dwc_otg_pcd_if.h" +struct cfiobject; + +/** + * @file + * + * This file contains the structures, constants, and interfaces for + * the Perpherial Contoller Driver (PCD). + * + * The Peripheral Controller Driver (PCD) for Linux will implement the + * Gadget API, so that the existing Gadget drivers can be used. For + * the Mass Storage Function driver the File-backed USB Storage Gadget + * (FBS) driver will be used. The FBS driver supports the + * Control-Bulk (CB), Control-Bulk-Interrupt (CBI), and Bulk-Only + * transports. + * + */ + +/** Invalid DMA Address */ +#define DWC_DMA_ADDR_INVALID (~(dwc_dma_t)0) + +/** Max Transfer size for any EP */ +#define DDMA_MAX_TRANSFER_SIZE 65535 + +/** + * Get the pointer to the core_if from the pcd pointer. + */ +#define GET_CORE_IF( _pcd ) (_pcd->core_if) + +/** + * States of EP0. + */ +typedef enum ep0_state { + EP0_DISCONNECT, /* no host */ + EP0_IDLE, + EP0_IN_DATA_PHASE, + EP0_OUT_DATA_PHASE, + EP0_IN_STATUS_PHASE, + EP0_OUT_STATUS_PHASE, + EP0_STALL, +} ep0state_e; + +/** Fordward declaration.*/ +struct dwc_otg_pcd; + +/** DWC_otg iso request structure. + * + */ +typedef struct usb_iso_request dwc_otg_pcd_iso_request_t; + +#ifdef DWC_UTE_PER_IO + +/** + * This shall be the exact analogy of the same type structure defined in the + * usb_gadget.h. Each descriptor contains + */ +struct dwc_iso_pkt_desc_port { + uint32_t offset; + uint32_t length; /* expected length */ + uint32_t actual_length; + uint32_t status; +}; + +struct dwc_iso_xreq_port { + /** transfer/submission flag */ + uint32_t tr_sub_flags; + /** Start the request ASAP */ +#define DWC_EREQ_TF_ASAP 0x00000002 + /** Just enqueue the request w/o initiating a transfer */ +#define DWC_EREQ_TF_ENQUEUE 0x00000004 + + /** + * count of ISO packets attached to this request - shall + * not exceed the pio_alloc_pkt_count + */ + uint32_t pio_pkt_count; + /** count of ISO packets allocated for this request */ + uint32_t pio_alloc_pkt_count; + /** number of ISO packet errors */ + uint32_t error_count; + /** reserved for future extension */ + uint32_t res; + /** Will be allocated and freed in the UTE gadget and based on the CFC value */ + struct dwc_iso_pkt_desc_port *per_io_frame_descs; +}; +#endif +/** DWC_otg request structure. + * This structure is a list of requests. + */ +typedef struct dwc_otg_pcd_request { + void *priv; + void *buf; + dwc_dma_t dma; + uint32_t length; + uint32_t actual; + unsigned sent_zlp:1; + /** + * Used instead of original buffer if + * it(physical address) is not dword-aligned. + **/ + uint8_t *dw_align_buf; + dwc_dma_t dw_align_buf_dma; + + DWC_CIRCLEQ_ENTRY(dwc_otg_pcd_request) queue_entry; +#ifdef DWC_UTE_PER_IO + struct dwc_iso_xreq_port ext_req; + //void *priv_ereq_nport; /* */ +#endif +} dwc_otg_pcd_request_t; + +DWC_CIRCLEQ_HEAD(req_list, dwc_otg_pcd_request); + +/** PCD EP structure. + * This structure describes an EP, there is an array of EPs in the PCD + * structure. + */ +typedef struct dwc_otg_pcd_ep { + /** USB EP Descriptor */ + const usb_endpoint_descriptor_t *desc; + + /** queue of dwc_otg_pcd_requests. */ + struct req_list queue; + unsigned stopped:1; + unsigned disabling:1; + unsigned dma:1; + unsigned queue_sof:1; + +#ifdef DWC_EN_ISOC + /** ISOC req handle passed */ + void *iso_req_handle; +#endif //_EN_ISOC_ + + /** DWC_otg ep data. */ + dwc_ep_t dwc_ep; + + /** Pointer to PCD */ + struct dwc_otg_pcd *pcd; + + void *priv; +} dwc_otg_pcd_ep_t; + +/** DWC_otg PCD Structure. + * This structure encapsulates the data for the dwc_otg PCD. + */ +struct dwc_otg_pcd { + const struct dwc_otg_pcd_function_ops *fops; + /** The DWC otg device pointer */ + struct dwc_otg_device *otg_dev; + /** Core Interface */ + dwc_otg_core_if_t *core_if; + /** State of EP0 */ + ep0state_e ep0state; + /** EP0 Request is pending */ + unsigned ep0_pending:1; + /** Indicates when SET CONFIGURATION Request is in process */ + unsigned request_config:1; + /** The state of the Remote Wakeup Enable. */ + unsigned remote_wakeup_enable:1; + /** The state of the B-Device HNP Enable. */ + unsigned b_hnp_enable:1; + /** The state of A-Device HNP Support. */ + unsigned a_hnp_support:1; + /** The state of the A-Device Alt HNP support. */ + unsigned a_alt_hnp_support:1; + /** Count of pending Requests */ + unsigned request_pending; + + /** SETUP packet for EP0 + * This structure is allocated as a DMA buffer on PCD initialization + * with enough space for up to 3 setup packets. + */ + union { + usb_device_request_t req; + uint32_t d32[2]; + } *setup_pkt; + + dwc_dma_t setup_pkt_dma_handle; + + /* Additional buffer and flag for CTRL_WR premature case */ + uint8_t *backup_buf; + unsigned data_terminated; + + /** 2-byte dma buffer used to return status from GET_STATUS */ + uint16_t *status_buf; + dwc_dma_t status_buf_dma_handle; + + /** EP0 */ + dwc_otg_pcd_ep_t ep0; + + /** Array of IN EPs. */ + dwc_otg_pcd_ep_t in_ep[MAX_EPS_CHANNELS - 1]; + /** Array of OUT EPs. */ + dwc_otg_pcd_ep_t out_ep[MAX_EPS_CHANNELS - 1]; + /** number of valid EPs in the above array. */ +// unsigned num_eps : 4; + dwc_spinlock_t *lock; + + /** Tasklet to defer starting of TEST mode transmissions until + * Status Phase has been completed. + */ + dwc_tasklet_t *test_mode_tasklet; + + /** Tasklet to delay starting of xfer in DMA mode */ + dwc_tasklet_t *start_xfer_tasklet; + + /** The test mode to enter when the tasklet is executed. */ + unsigned test_mode; + /** The cfi_api structure that implements most of the CFI API + * and OTG specific core configuration functionality + */ +#ifdef DWC_UTE_CFI + struct cfiobject *cfi; +#endif + +}; + +//FIXME this functions should be static, and this prototypes should be removed +extern void dwc_otg_request_nuke(dwc_otg_pcd_ep_t * ep); +extern void dwc_otg_request_done(dwc_otg_pcd_ep_t * ep, + dwc_otg_pcd_request_t * req, int32_t status); + +void dwc_otg_iso_buffer_done(dwc_otg_pcd_t * pcd, dwc_otg_pcd_ep_t * ep, + void *req_handle); +extern void dwc_otg_pcd_start_iso_ddma(dwc_otg_core_if_t * core_if, + dwc_otg_pcd_ep_t * ep); + +extern void do_test_mode(void *data); +#endif +#endif /* DWC_HOST_ONLY */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd_if.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd_if.h new file mode 100644 index 0000000..cfde306 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_pcd_if.h @@ -0,0 +1,366 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_pcd_if.h $ + * $Revision: #13 $ + * $Date: 2012/12/12 $ + * $Change: 2125019 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 DWC_HOST_ONLY + +#if !defined(__DWC_PCD_IF_H__) +#define __DWC_PCD_IF_H__ + +//#include "dwc_os.h" +#include "dwc_otg_core_if.h" + +/** @file + * This file defines DWC_OTG PCD Core API. + */ + +struct dwc_otg_pcd; +typedef struct dwc_otg_pcd dwc_otg_pcd_t; + +/** Maxpacket size for EP0 */ +#define MAX_EP0_SIZE 64 +/** Maxpacket size for any EP */ +#define MAX_PACKET_SIZE 2048 + +/** @name Function Driver Callbacks */ +/** @{ */ + +/** This function will be called whenever a previously queued request has + * completed. The status value will be set to -DWC_E_SHUTDOWN to indicated a + * failed or aborted transfer, or -DWC_E_RESTART to indicate the device was reset, + * or -DWC_E_TIMEOUT to indicate it timed out, or -DWC_E_INVALID to indicate invalid + * parameters. */ +typedef int (*dwc_completion_cb_t) (dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle, int32_t status, + uint32_t actual); +/** + * This function will be called whenever a previousle queued ISOC request has + * completed. Count of ISOC packets could be read using dwc_otg_pcd_get_iso_packet_count + * function. + * The status of each ISOC packet could be read using dwc_otg_pcd_get_iso_packet_* + * functions. + */ +typedef int (*dwc_isoc_completion_cb_t) (dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle, int proc_buf_num); +/** This function should handle any SETUP request that cannot be handled by the + * PCD Core. This includes most GET_DESCRIPTORs, SET_CONFIGS, Any + * class-specific requests, etc. The function must non-blocking. + * + * Returns 0 on success. + * Returns -DWC_E_NOT_SUPPORTED if the request is not supported. + * Returns -DWC_E_INVALID if the setup request had invalid parameters or bytes. + * Returns -DWC_E_SHUTDOWN on any other error. */ +typedef int (*dwc_setup_cb_t) (dwc_otg_pcd_t * pcd, uint8_t * bytes); +/** This is called whenever the device has been disconnected. The function + * driver should take appropriate action to clean up all pending requests in the + * PCD Core, remove all endpoints (except ep0), and initialize back to reset + * state. */ +typedef int (*dwc_disconnect_cb_t) (dwc_otg_pcd_t * pcd); +/** This function is called when device has been connected. */ +typedef int (*dwc_connect_cb_t) (dwc_otg_pcd_t * pcd, int speed); +/** This function is called when device has been suspended */ +typedef int (*dwc_suspend_cb_t) (dwc_otg_pcd_t * pcd); +/** This function is called when device has received LPM tokens, i.e. + * device has been sent to sleep state. */ +typedef int (*dwc_sleep_cb_t) (dwc_otg_pcd_t * pcd); +/** This function is called when device has been resumed + * from suspend(L2) or L1 sleep state. */ +typedef int (*dwc_resume_cb_t) (dwc_otg_pcd_t * pcd); +/** This function is called whenever hnp params has been changed. + * User can call get_b_hnp_enable, get_a_hnp_support, get_a_alt_hnp_support functions + * to get hnp parameters. */ +typedef int (*dwc_hnp_params_changed_cb_t) (dwc_otg_pcd_t * pcd); +/** This function is called whenever USB RESET is detected. */ +typedef int (*dwc_reset_cb_t) (dwc_otg_pcd_t * pcd); + +typedef int (*cfi_setup_cb_t) (dwc_otg_pcd_t * pcd, void *ctrl_req_bytes); + +/** + * + * @param ep_handle Void pointer to the usb_ep structure + * @param ereq_port Pointer to the extended request structure created in the + * portable part. + */ +typedef int (*xiso_completion_cb_t) (dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle, int32_t status, + void *ereq_port); +/** Function Driver Ops Data Structure */ +struct dwc_otg_pcd_function_ops { + dwc_connect_cb_t connect; + dwc_disconnect_cb_t disconnect; + dwc_setup_cb_t setup; + dwc_completion_cb_t complete; + dwc_isoc_completion_cb_t isoc_complete; + dwc_suspend_cb_t suspend; + dwc_sleep_cb_t sleep; + dwc_resume_cb_t resume; + dwc_reset_cb_t reset; + dwc_hnp_params_changed_cb_t hnp_changed; + cfi_setup_cb_t cfi_setup; +#ifdef DWC_UTE_PER_IO + xiso_completion_cb_t xisoc_complete; +#endif +}; +/** @} */ + +/** @name Function Driver Functions */ +/** @{ */ + +/** Call this function to get pointer on dwc_otg_pcd_t, + * this pointer will be used for all PCD API functions. + * + * @param core_if The DWC_OTG Core + */ +extern dwc_otg_pcd_t *dwc_otg_pcd_init(dwc_otg_core_if_t * core_if); + +/** Frees PCD allocated by dwc_otg_pcd_init + * + * @param pcd The PCD + */ +extern void dwc_otg_pcd_remove(dwc_otg_pcd_t * pcd); + +/** Call this to bind the function driver to the PCD Core. + * + * @param pcd Pointer on dwc_otg_pcd_t returned by dwc_otg_pcd_init function. + * @param fops The Function Driver Ops data structure containing pointers to all callbacks. + */ +extern void dwc_otg_pcd_start(dwc_otg_pcd_t * pcd, + const struct dwc_otg_pcd_function_ops *fops); + +/** Enables an endpoint for use. This function enables an endpoint in + * the PCD. The endpoint is described by the ep_desc which has the + * same format as a USB ep descriptor. The ep_handle parameter is used to refer + * to the endpoint from other API functions and in callbacks. Normally this + * should be called after a SET_CONFIGURATION/SET_INTERFACE to configure the + * core for that interface. + * + * Returns -DWC_E_INVALID if invalid parameters were passed. + * Returns -DWC_E_SHUTDOWN if any other error ocurred. + * Returns 0 on success. + * + * @param pcd The PCD + * @param ep_desc Endpoint descriptor + * @param ep_handle Handle on endpoint, that will be used to identify endpoint. + */ +extern int dwc_otg_pcd_ep_enable(dwc_otg_pcd_t * pcd, + const uint8_t * ep_desc, void *ep_handle); + +/** Disable the endpoint referenced by ep_handle. + * + * Returns -DWC_E_INVALID if invalid parameters were passed. + * Returns -DWC_E_SHUTDOWN if any other error occurred. + * Returns 0 on success. */ +extern int dwc_otg_pcd_ep_disable(dwc_otg_pcd_t * pcd, void *ep_handle); + +/** Queue a data transfer request on the endpoint referenced by ep_handle. + * After the transfer is completes, the complete callback will be called with + * the request status. + * + * @param pcd The PCD + * @param ep_handle The handle of the endpoint + * @param buf The buffer for the data + * @param dma_buf The DMA buffer for the data + * @param buflen The length of the data transfer + * @param zero Specifies whether to send zero length last packet. + * @param req_handle Set this handle to any value to use to reference this + * request in the ep_dequeue function or from the complete callback + * @param atomic_alloc If driver need to perform atomic allocations + * for internal data structures. + * + * Returns -DWC_E_INVALID if invalid parameters were passed. + * Returns -DWC_E_SHUTDOWN if any other error ocurred. + * Returns 0 on success. */ +extern int dwc_otg_pcd_ep_queue(dwc_otg_pcd_t * pcd, void *ep_handle, + uint8_t * buf, dwc_dma_t dma_buf, + uint32_t buflen, int zero, void *req_handle, + int atomic_alloc); +#ifdef DWC_UTE_PER_IO +/** + * + * @param ereq_nonport Pointer to the extended request part of the + * usb_request structure defined in usb_gadget.h file. + */ +extern int dwc_otg_pcd_xiso_ep_queue(dwc_otg_pcd_t * pcd, void *ep_handle, + uint8_t * buf, dwc_dma_t dma_buf, + uint32_t buflen, int zero, + void *req_handle, int atomic_alloc, + void *ereq_nonport); + +#endif + +/** De-queue the specified data transfer that has not yet completed. + * + * Returns -DWC_E_INVALID if invalid parameters were passed. + * Returns -DWC_E_SHUTDOWN if any other error ocurred. + * Returns 0 on success. */ +extern int dwc_otg_pcd_ep_dequeue(dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle); + +/** Halt (STALL) an endpoint or clear it. + * + * Returns -DWC_E_INVALID if invalid parameters were passed. + * Returns -DWC_E_SHUTDOWN if any other error ocurred. + * Returns -DWC_E_AGAIN if the STALL cannot be sent and must be tried again later + * Returns 0 on success. */ +extern int dwc_otg_pcd_ep_halt(dwc_otg_pcd_t * pcd, void *ep_handle, int value); + +/** This function should be called on every hardware interrupt */ +extern int32_t dwc_otg_pcd_handle_intr(dwc_otg_pcd_t * pcd); + +/** This function returns current frame number */ +extern int dwc_otg_pcd_get_frame_number(dwc_otg_pcd_t * pcd); + +/** + * Start isochronous transfers on the endpoint referenced by ep_handle. + * For isochronous transfers duble buffering is used. + * After processing each of buffers comlete callback will be called with + * status for each transaction. + * + * @param pcd The PCD + * @param ep_handle The handle of the endpoint + * @param buf0 The virtual address of first data buffer + * @param buf1 The virtual address of second data buffer + * @param dma0 The DMA address of first data buffer + * @param dma1 The DMA address of second data buffer + * @param sync_frame Data pattern frame number + * @param dp_frame Data size for pattern frame + * @param data_per_frame Data size for regular frame + * @param start_frame Frame number to start transfers, if -1 then start transfers ASAP. + * @param buf_proc_intrvl Interval of ISOC Buffer processing + * @param req_handle Handle of ISOC request + * @param atomic_alloc Specefies whether to perform atomic allocation for + * internal data structures. + * + * Returns -DWC_E_NO_MEMORY if there is no enough memory. + * Returns -DWC_E_INVALID if incorrect arguments are passed to the function. + * Returns -DW_E_SHUTDOWN for any other error. + * Returns 0 on success + */ +extern int dwc_otg_pcd_iso_ep_start(dwc_otg_pcd_t * pcd, void *ep_handle, + uint8_t * buf0, uint8_t * buf1, + dwc_dma_t dma0, dwc_dma_t dma1, + int sync_frame, int dp_frame, + int data_per_frame, int start_frame, + int buf_proc_intrvl, void *req_handle, + int atomic_alloc); + +/** Stop ISOC transfers on endpoint referenced by ep_handle. + * + * @param pcd The PCD + * @param ep_handle The handle of the endpoint + * @param req_handle Handle of ISOC request + * + * Returns -DWC_E_INVALID if incorrect arguments are passed to the function + * Returns 0 on success + */ +int dwc_otg_pcd_iso_ep_stop(dwc_otg_pcd_t * pcd, void *ep_handle, + void *req_handle); + +/** Get ISOC packet status. + * + * @param pcd The PCD + * @param ep_handle The handle of the endpoint + * @param iso_req_handle Isochronoush request handle + * @param packet Number of packet + * @param status Out parameter for returning status + * @param actual Out parameter for returning actual length + * @param offset Out parameter for returning offset + * + */ +extern void dwc_otg_pcd_get_iso_packet_params(dwc_otg_pcd_t * pcd, + void *ep_handle, + void *iso_req_handle, int packet, + int *status, int *actual, + int *offset); + +/** Get ISOC packet count. + * + * @param pcd The PCD + * @param ep_handle The handle of the endpoint + * @param iso_req_handle + */ +extern int dwc_otg_pcd_get_iso_packet_count(dwc_otg_pcd_t * pcd, + void *ep_handle, + void *iso_req_handle); + +/** This function starts the SRP Protocol if no session is in progress. If + * a session is already in progress, but the device is suspended, + * remote wakeup signaling is started. + */ +extern int dwc_otg_pcd_wakeup(dwc_otg_pcd_t * pcd); + +/** This function returns 1 if LPM support is enabled, and 0 otherwise. */ +extern int dwc_otg_pcd_is_lpm_enabled(dwc_otg_pcd_t * pcd); + +/** This function returns 1 if LPM Errata support is enabled, and 0 otherwise. */ +extern int dwc_otg_pcd_is_besl_enabled(dwc_otg_pcd_t * pcd); + +/** This function returns baseline_besl module parametr. */ +extern int dwc_otg_pcd_get_param_baseline_besl(dwc_otg_pcd_t * pcd); + +/** This function returns deep_besl module parametr. */ +extern int dwc_otg_pcd_get_param_deep_besl(dwc_otg_pcd_t * pcd); + +/** This function returns 1 if remote wakeup is allowed and 0, otherwise. */ +extern int dwc_otg_pcd_get_rmwkup_enable(dwc_otg_pcd_t * pcd); + +/** Initiate SRP */ +extern void dwc_otg_pcd_initiate_srp(dwc_otg_pcd_t * pcd); + +/** Starts remote wakeup signaling. */ +extern void dwc_otg_pcd_remote_wakeup(dwc_otg_pcd_t * pcd, int set); + +/** Starts micorsecond soft disconnect. */ +extern void dwc_otg_pcd_disconnect_us(dwc_otg_pcd_t * pcd, int no_of_usecs); +/** This function returns whether device is dualspeed.*/ +extern uint32_t dwc_otg_pcd_is_dualspeed(dwc_otg_pcd_t * pcd); + +/** This function returns whether device is otg. */ +extern uint32_t dwc_otg_pcd_is_otg(dwc_otg_pcd_t * pcd); + +/** These functions allow to get hnp parameters */ +extern uint32_t get_b_hnp_enable(dwc_otg_pcd_t * pcd); +extern uint32_t get_a_hnp_support(dwc_otg_pcd_t * pcd); +extern uint32_t get_a_alt_hnp_support(dwc_otg_pcd_t * pcd); + +/** CFI specific Interface functions */ +/** Allocate a cfi buffer */ +extern uint8_t *cfiw_ep_alloc_buffer(dwc_otg_pcd_t * pcd, void *pep, + dwc_dma_t * addr, size_t buflen, + int flags); + +/******************************************************************************/ + +/** @} */ + +#endif /* __DWC_PCD_IF_H__ */ + +#endif /* DWC_HOST_ONLY */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_regs.h b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_regs.h new file mode 100644 index 0000000..1d01cd7 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/dwc_otg_regs.h @@ -0,0 +1,2560 @@ +/* ========================================================================== + * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_regs.h $ + * $Revision: #99 $ + * $Date: 2012/12/10 $ + * $Change: 2123206 $ + * + * Synopsys HS OTG Linux Software Driver and documentation (hereinafter, + * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless + * otherwise expressly agreed to in writing between Synopsys and you. + * + * The Software IS NOT an item of Licensed Software or Licensed Product under + * any End User Software License Agreement or Agreement for Licensed Product + * with Synopsys or any supplement thereto. You are permitted to use and + * redistribute this Software in source and binary forms, with or without + * modification, provided that redistributions of source code must retain this + * notice. You may not view, use, disclose, copy or distribute this file or + * any information contained herein except pursuant to this license grant from + * Synopsys. If you do not agree with this notice, including the disclaimer + * below, then you are not authorized to use the Software. + * + * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS 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 __DWC_OTG_REGS_H__ +#define __DWC_OTG_REGS_H__ + +#include "dwc_otg_core_if.h" + + + + +/** + * @file + * + * This file contains the data structures for accessing the DWC_otg core registers. + * + * The application interfaces with the HS OTG core by reading from and + * writing to the Control and Status Register (CSR) space through the + * AHB Slave interface. These registers are 32 bits wide, and the + * addresses are 32-bit-block aligned. + * CSRs are classified as follows: + * - Core Global Registers + * - Device Mode Registers + * - Device Global Registers + * - Device Endpoint Specific Registers + * - Host Mode Registers + * - Host Global Registers + * - Host Port CSRs + * - Host Channel Specific Registers + * + * Only the Core Global registers can be accessed in both Device and + * Host modes. When the HS OTG core is operating in one mode, either + * Device or Host, the application must not access registers from the + * other mode. When the core switches from one mode to another, the + * registers in the new mode of operation must be reprogrammed as they + * would be after a power-on reset. + */ + +/****************************************************************************/ +/** DWC_otg Core registers . + * The dwc_otg_core_global_regs structure defines the size + * and relative field offsets for the Core Global registers. + */ +typedef struct dwc_otg_core_global_regs { + /** OTG Control and Status Register. Offset: 000h */ + volatile uint32_t gotgctl; + /** OTG Interrupt Register. Offset: 004h */ + volatile uint32_t gotgint; + /**Core AHB Configuration Register. Offset: 008h */ + volatile uint32_t gahbcfg; + +#define DWC_GLBINTRMASK 0x0001 +#define DWC_DMAENABLE 0x0020 +#define DWC_NPTXEMPTYLVL_EMPTY 0x0080 +#define DWC_NPTXEMPTYLVL_HALFEMPTY 0x0000 +#define DWC_PTXEMPTYLVL_EMPTY 0x0100 +#define DWC_PTXEMPTYLVL_HALFEMPTY 0x0000 + + /**Core USB Configuration Register. Offset: 00Ch */ + volatile uint32_t gusbcfg; + /**Core Reset Register. Offset: 010h */ + volatile uint32_t grstctl; + /**Core Interrupt Register. Offset: 014h */ + volatile uint32_t gintsts; + /**Core Interrupt Mask Register. Offset: 018h */ + volatile uint32_t gintmsk; + /**Receive Status Queue Read Register (Read Only). Offset: 01Ch */ + volatile uint32_t grxstsr; + /**Receive Status Queue Read & POP Register (Read Only). Offset: 020h*/ + volatile uint32_t grxstsp; + /**Receive FIFO Size Register. Offset: 024h */ + volatile uint32_t grxfsiz; + /**Non Periodic Transmit FIFO Size Register. Offset: 028h */ + volatile uint32_t gnptxfsiz; + /**Non Periodic Transmit FIFO/Queue Status Register (Read + * Only). Offset: 02Ch */ + volatile uint32_t gnptxsts; + /**I2C Access Register. Offset: 030h */ + volatile uint32_t gi2cctl; + /**PHY Vendor Control Register. Offset: 034h */ + volatile uint32_t gpvndctl; + /**General Purpose Input/Output Register. Offset: 038h */ + volatile uint32_t ggpio; + /**User ID Register. Offset: 03Ch */ + volatile uint32_t guid; + /**Synopsys ID Register (Read Only). Offset: 040h */ + volatile uint32_t gsnpsid; + /**User HW Config1 Register (Read Only). Offset: 044h */ + volatile uint32_t ghwcfg1; + /**User HW Config2 Register (Read Only). Offset: 048h */ + volatile uint32_t ghwcfg2; +#define DWC_SLAVE_ONLY_ARCH 0 +#define DWC_EXT_DMA_ARCH 1 +#define DWC_INT_DMA_ARCH 2 + +#define DWC_MODE_HNP_SRP_CAPABLE 0 +#define DWC_MODE_SRP_ONLY_CAPABLE 1 +#define DWC_MODE_NO_HNP_SRP_CAPABLE 2 +#define DWC_MODE_SRP_CAPABLE_DEVICE 3 +#define DWC_MODE_NO_SRP_CAPABLE_DEVICE 4 +#define DWC_MODE_SRP_CAPABLE_HOST 5 +#define DWC_MODE_NO_SRP_CAPABLE_HOST 6 + + /**User HW Config3 Register (Read Only). Offset: 04Ch */ + volatile uint32_t ghwcfg3; + /**User HW Config4 Register (Read Only). Offset: 050h*/ + volatile uint32_t ghwcfg4; + /** Core LPM Configuration register Offset: 054h*/ + volatile uint32_t glpmcfg; + /** Global PowerDn Register Offset: 058h */ + volatile uint32_t gpwrdn; + /** Global DFIFO SW Config Register Offset: 05Ch */ + volatile uint32_t gdfifocfg; + /** ADP Control Register Offset: 060h */ + volatile uint32_t adpctl; + /** Reserved Offset: 064h-0FFh */ + volatile uint32_t reserved39[39]; + /** Host Periodic Transmit FIFO Size Register. Offset: 100h */ + volatile uint32_t hptxfsiz; + /** Device Periodic Transmit FIFO#n Register if dedicated fifos are disabled, + otherwise Device Transmit FIFO#n Register. + * Offset: 104h + (FIFO_Number-1)*04h, 1 <= FIFO Number <= 15 (1<=n<=15). */ + volatile uint32_t dtxfsiz[15]; +} dwc_otg_core_global_regs_t; + +/** + * This union represents the bit fields of the Core OTG Control + * and Status Register (GOTGCTL). Set the bits using the bit + * fields then write the d32 value to the register. + */ +typedef union gotgctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned sesreqscs:1; + unsigned sesreq:1; + unsigned vbvalidoven:1; + unsigned vbvalidovval:1; + unsigned avalidoven:1; + unsigned avalidovval:1; + unsigned bvalidoven:1; + unsigned bvalidovval:1; + unsigned hstnegscs:1; + unsigned hnpreq:1; + unsigned hstsethnpen:1; + unsigned devhnpen:1; + unsigned reserved12_15:4; + unsigned conidsts:1; + unsigned dbnctime:1; + unsigned asesvld:1; + unsigned bsesvld:1; + unsigned otgver:1; + unsigned reserved1:1; + unsigned multvalidbc:5; + unsigned chirpen:1; + unsigned reserved28_31:4; + } b; +} gotgctl_data_t; + +/** + * This union represents the bit fields of the Core OTG Interrupt Register + * (GOTGINT). Set/clear the bits using the bit fields then write the d32 + * value to the register. + */ +typedef union gotgint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Current Mode */ + unsigned reserved0_1:2; + + /** Session End Detected */ + unsigned sesenddet:1; + + unsigned reserved3_7:5; + + /** Session Request Success Status Change */ + unsigned sesreqsucstschng:1; + /** Host Negotiation Success Status Change */ + unsigned hstnegsucstschng:1; + + unsigned reserved10_16:7; + + /** Host Negotiation Detected */ + unsigned hstnegdet:1; + /** A-Device Timeout Change */ + unsigned adevtoutchng:1; + /** Debounce Done */ + unsigned debdone:1; + /** Multi-Valued input changed */ + unsigned mvic:1; + + unsigned reserved31_21:11; + + } b; +} gotgint_data_t; + +/** + * This union represents the bit fields of the Core AHB Configuration + * Register (GAHBCFG). Set/clear the bits using the bit fields then + * write the d32 value to the register. + */ +typedef union gahbcfg_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned glblintrmsk:1; +#define DWC_GAHBCFG_GLBINT_ENABLE 1 + + unsigned hburstlen:4; +#define DWC_GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define DWC_GAHBCFG_INT_DMA_BURST_INCR 1 +#define DWC_GAHBCFG_INT_DMA_BURST_INCR4 3 +#define DWC_GAHBCFG_INT_DMA_BURST_INCR8 5 +#define DWC_GAHBCFG_INT_DMA_BURST_INCR16 7 + + unsigned dmaenable:1; +#define DWC_GAHBCFG_DMAENABLE 1 + unsigned reserved:1; + unsigned nptxfemplvl_txfemplvl:1; + unsigned ptxfemplvl:1; +#define DWC_GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define DWC_GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 + unsigned reserved9_20:12; + unsigned remmemsupp:1; + unsigned notialldmawrit:1; + unsigned ahbsingle:1; + unsigned reserved24_31:8; + } b; +} gahbcfg_data_t; + +/** + * This union represents the bit fields of the Core USB Configuration + * Register (GUSBCFG). Set the bits using the bit fields then write + * the d32 value to the register. + */ +typedef union gusbcfg_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned toutcal:3; + unsigned phyif:1; + unsigned ulpi_utmi_sel:1; + unsigned fsintf:1; + unsigned physel:1; + unsigned ddrsel:1; + unsigned srpcap:1; + unsigned hnpcap:1; + unsigned usbtrdtim:4; + unsigned reserved1:1; + unsigned phylpwrclksel:1; + unsigned otgutmifssel:1; + unsigned ulpi_fsls:1; + unsigned ulpi_auto_res:1; + unsigned ulpi_clk_sus_m:1; + unsigned ulpi_ext_vbus_drv:1; + unsigned ulpi_int_vbus_indicator:1; + unsigned term_sel_dl_pulse:1; + unsigned indicator_complement:1; + unsigned indicator_pass_through:1; + unsigned ulpi_int_prot_dis:1; + unsigned ic_usb_cap:1; + unsigned ic_traffic_pull_remove:1; + unsigned tx_end_delay:1; + unsigned force_host_mode:1; + unsigned force_dev_mode:1; + unsigned reserved31:1; + } b; +} gusbcfg_data_t; + +/** + * This union represents the bit fields of the Core Reset Register + * (GRSTCTL). Set/clear the bits using the bit fields then write the + * d32 value to the register. + */ +typedef union grstctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Core Soft Reset (CSftRst) (Device and Host) + * + * The application can flush the control logic in the + * entire core using this bit. This bit resets the + * pipelines in the AHB Clock domain as well as the + * PHY Clock domain. + * + * The state machines are reset to an IDLE state, the + * control bits in the CSRs are cleared, all the + * transmit FIFOs and the receive FIFO are flushed. + * + * The status mask bits that control the generation of + * the interrupt, are cleared, to clear the + * interrupt. The interrupt status bits are not + * cleared, so the application can get the status of + * any events that occurred in the core after it has + * set this bit. + * + * Any transactions on the AHB are terminated as soon + * as possible following the protocol. Any + * transactions on the USB are terminated immediately. + * + * The configuration settings in the CSRs are + * unchanged, so the software doesn't have to + * reprogram these registers (Device + * Configuration/Host Configuration/Core System + * Configuration/Core PHY Configuration). + * + * The application can write to this bit, any time it + * wants to reset the core. This is a self clearing + * bit and the core clears this bit after all the + * necessary logic is reset in the core, which may + * take several clocks, depending on the current state + * of the core. + */ + unsigned csftrst:1; + /** Hclk Soft Reset + * + * The application uses this bit to reset the control logic in + * the AHB clock domain. Only AHB clock domain pipelines are + * reset. + */ + unsigned hsftrst:1; + /** Host Frame Counter Reset (Host Only)
+ * + * The application can reset the (micro)frame number + * counter inside the core, using this bit. When the + * (micro)frame counter is reset, the subsequent SOF + * sent out by the core, will have a (micro)frame + * number of 0. + */ + unsigned hstfrm:1; + /** In Token Sequence Learning Queue Flush + * (INTknQFlsh) (Device Only) + */ + unsigned intknqflsh:1; + /** RxFIFO Flush (RxFFlsh) (Device and Host) + * + * The application can flush the entire Receive FIFO + * using this bit. The application must first + * ensure that the core is not in the middle of a + * transaction. The application should write into + * this bit, only after making sure that neither the + * DMA engine is reading from the RxFIFO nor the MAC + * is writing the data in to the FIFO. The + * application should wait until the bit is cleared + * before performing any other operations. This bit + * will takes 8 clocks (slowest of PHY or AHB clock) + * to clear. + */ + unsigned rxfflsh:1; + /** TxFIFO Flush (TxFFlsh) (Device and Host). + * + * This bit is used to selectively flush a single or + * all transmit FIFOs. The application must first + * ensure that the core is not in the middle of a + * transaction. The application should write into + * this bit, only after making sure that neither the + * DMA engine is writing into the TxFIFO nor the MAC + * is reading the data out of the FIFO. The + * application should wait until the core clears this + * bit, before performing any operations. This bit + * will takes 8 clocks (slowest of PHY or AHB clock) + * to clear. + */ + unsigned txfflsh:1; + + /** TxFIFO Number (TxFNum) (Device and Host). + * + * This is the FIFO number which needs to be flushed, + * using the TxFIFO Flush bit. This field should not + * be changed until the TxFIFO Flush bit is cleared by + * the core. + * - 0x0 : Non Periodic TxFIFO Flush + * - 0x1 : Periodic TxFIFO #1 Flush in device mode + * or Periodic TxFIFO in host mode + * - 0x2 : Periodic TxFIFO #2 Flush in device mode. + * - ... + * - 0xF : Periodic TxFIFO #15 Flush in device mode + * - 0x10: Flush all the Transmit NonPeriodic and + * Transmit Periodic FIFOs in the core + */ + unsigned txfnum:5; + /** Reserved */ + unsigned reserved11_29:19; + /** DMA Request Signal. Indicated DMA request is in + * probress. Used for debug purpose. */ + unsigned dmareq:1; + /** AHB Master Idle. Indicates the AHB Master State + * Machine is in IDLE condition. */ + unsigned ahbidle:1; + } b; +} grstctl_t; + +/** + * This union represents the bit fields of the Core Interrupt Mask + * Register (GINTMSK). Set/clear the bits using the bit fields then + * write the d32 value to the register. + */ +typedef union gintmsk_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned reserved0:1; + unsigned modemismatch:1; + unsigned otgintr:1; + unsigned sofintr:1; + unsigned rxstsqlvl:1; + unsigned nptxfempty:1; + unsigned ginnakeff:1; + unsigned goutnakeff:1; + unsigned ulpickint:1; + unsigned i2cintr:1; + unsigned erlysuspend:1; + unsigned usbsuspend:1; + unsigned usbreset:1; + unsigned enumdone:1; + unsigned isooutdrop:1; + unsigned eopframe:1; + unsigned restoredone:1; + unsigned epmismatch:1; + unsigned inepintr:1; + unsigned outepintr:1; + unsigned incomplisoin:1; + unsigned incomplisoout:1; + unsigned fetsusp:1; + unsigned resetdet:1; + unsigned portintr:1; + unsigned hcintr:1; + unsigned ptxfempty:1; + unsigned lpmtranrcvd:1; + unsigned conidstschng:1; + unsigned disconnect:1; + unsigned sessreqintr:1; + unsigned wkupintr:1; + } b; +} gintmsk_data_t; +/** + * This union represents the bit fields of the Core Interrupt Register + * (GINTSTS). Set/clear the bits using the bit fields then write the + * d32 value to the register. + */ +typedef union gintsts_data { + /** raw register data */ + uint32_t d32; +#define DWC_SOF_INTR_MASK 0x0008 + /** register bits */ + struct { +#define DWC_HOST_MODE 1 + unsigned curmode:1; + unsigned modemismatch:1; + unsigned otgintr:1; + unsigned sofintr:1; + unsigned rxstsqlvl:1; + unsigned nptxfempty:1; + unsigned ginnakeff:1; + unsigned goutnakeff:1; + unsigned ulpickint:1; + unsigned i2cintr:1; + unsigned erlysuspend:1; + unsigned usbsuspend:1; + unsigned usbreset:1; + unsigned enumdone:1; + unsigned isooutdrop:1; + unsigned eopframe:1; + unsigned restoredone:1; + unsigned epmismatch:1; + unsigned inepint:1; + unsigned outepintr:1; + unsigned incomplisoin:1; + unsigned incomplisoout:1; + unsigned fetsusp:1; + unsigned resetdet:1; + unsigned portintr:1; + unsigned hcintr:1; + unsigned ptxfempty:1; + unsigned lpmtranrcvd:1; + unsigned conidstschng:1; + unsigned disconnect:1; + unsigned sessreqintr:1; + unsigned wkupintr:1; + } b; +} gintsts_data_t; + +/** + * This union represents the bit fields in the Device Receive Status Read and + * Pop Registers (GRXSTSR, GRXSTSP) Read the register into the d32 + * element then read out the bits using the bit elements. + */ +typedef union device_grxsts_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned epnum:4; + unsigned bcnt:11; + unsigned dpid:2; + +#define DWC_STS_DATA_UPDT 0x2 // OUT Data Packet +#define DWC_STS_XFER_COMP 0x3 // OUT Data Transfer Complete + +#define DWC_DSTS_GOUT_NAK 0x1 // Global OUT NAK +#define DWC_DSTS_SETUP_COMP 0x4 // Setup Phase Complete +#define DWC_DSTS_SETUP_UPDT 0x6 // SETUP Packet + unsigned pktsts:4; + unsigned fn:4; + unsigned reserved25_31:7; + } b; +} device_grxsts_data_t; + +/** + * This union represents the bit fields in the Host Receive Status Read and + * Pop Registers (GRXSTSR, GRXSTSP) Read the register into the d32 + * element then read out the bits using the bit elements. + */ +typedef union host_grxsts_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned chnum:4; + unsigned bcnt:11; + unsigned dpid:2; + + unsigned pktsts:4; +#define DWC_GRXSTS_PKTSTS_IN 0x2 +#define DWC_GRXSTS_PKTSTS_IN_XFER_COMP 0x3 +#define DWC_GRXSTS_PKTSTS_DATA_TOGGLE_ERR 0x5 +#define DWC_GRXSTS_PKTSTS_CH_HALTED 0x7 + + unsigned reserved21_31:11; + } b; +} host_grxsts_data_t; + +/** + * This union represents the bit fields in the FIFO Size Registers (HPTXFSIZ, + * GNPTXFSIZ, DPTXFSIZn, DIEPTXFn). Read the register into the d32 element + * then read out the bits using the bit elements. + */ +typedef union fifosize_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned startaddr:16; + unsigned depth:16; + } b; +} fifosize_data_t; + +/** + * This union represents the bit fields in the Non-Periodic Transmit + * FIFO/Queue Status Register (GNPTXSTS). Read the register into the + * d32 element then read out the bits using the bit + * elements. + */ +typedef union gnptxsts_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned nptxfspcavail:16; + unsigned nptxqspcavail:8; + /** Top of the Non-Periodic Transmit Request Queue + * - bit 24 - Terminate (Last entry for the selected + * channel/EP) + * - bits 26:25 - Token Type + * - 2'b00 - IN/OUT + * - 2'b01 - Zero Length OUT + * - 2'b10 - PING/Complete Split + * - 2'b11 - Channel Halt + * - bits 30:27 - Channel/EP Number + */ + unsigned nptxqtop_terminate:1; + unsigned nptxqtop_token:2; + unsigned nptxqtop_chnep:4; + unsigned reserved:1; + } b; +} gnptxsts_data_t; + +/** + * This union represents the bit fields in the Transmit + * FIFO Status Register (DTXFSTS). Read the register into the + * d32 element then read out the bits using the bit + * elements. + */ +typedef union dtxfsts_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned txfspcavail:16; + unsigned reserved:16; + } b; +} dtxfsts_data_t; + +/** + * This union represents the bit fields in the I2C Control Register + * (I2CCTL). Read the register into the d32 element then read out the + * bits using the bit elements. + */ +typedef union gi2cctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned rwdata:8; + unsigned regaddr:8; + unsigned addr:7; + unsigned i2cen:1; + unsigned ack:1; + unsigned i2csuspctl:1; + unsigned i2cdevaddr:2; + unsigned i2cdatse0:1; + unsigned reserved:1; + unsigned rw:1; + unsigned bsydne:1; + } b; +} gi2cctl_data_t; + +/** + * This union represents the bit fields in the PHY Vendor Control Register + * (GPVNDCTL). Read the register into the d32 element then read out the + * bits using the bit elements. + */ +typedef union gpvndctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned regdata:8; + unsigned vctrl:8; + unsigned regaddr16_21:6; + unsigned regwr:1; + unsigned reserved23_24:2; + unsigned newregreq:1; + unsigned vstsbsy:1; + unsigned vstsdone:1; + unsigned reserved28_30:3; + unsigned disulpidrvr:1; + } b; +} gpvndctl_data_t; + +/** + * This union represents the bit fields in the General Purpose + * Input/Output Register (GGPIO). + * Read the register into the d32 element then read out the + * bits using the bit elements. + */ +typedef union ggpio_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned gpi:16; + unsigned gpo:16; + } b; +} ggpio_data_t; + +/** + * This union represents the bit fields in the User ID Register + * (GUID). Read the register into the d32 element then read out the + * bits using the bit elements. + */ +typedef union guid_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned rwdata:32; + } b; +} guid_data_t; + +/** + * This union represents the bit fields in the Synopsys ID Register + * (GSNPSID). Read the register into the d32 element then read out the + * bits using the bit elements. + */ +typedef union gsnpsid_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned rwdata:32; + } b; +} gsnpsid_data_t; + +/** + * This union represents the bit fields in the User HW Config1 + * Register. Read the register into the d32 element then read + * out the bits using the bit elements. + */ +typedef union hwcfg1_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned ep_dir0:2; + unsigned ep_dir1:2; + unsigned ep_dir2:2; + unsigned ep_dir3:2; + unsigned ep_dir4:2; + unsigned ep_dir5:2; + unsigned ep_dir6:2; + unsigned ep_dir7:2; + unsigned ep_dir8:2; + unsigned ep_dir9:2; + unsigned ep_dir10:2; + unsigned ep_dir11:2; + unsigned ep_dir12:2; + unsigned ep_dir13:2; + unsigned ep_dir14:2; + unsigned ep_dir15:2; + } b; +} hwcfg1_data_t; + +/** + * This union represents the bit fields in the User HW Config2 + * Register. Read the register into the d32 element then read + * out the bits using the bit elements. + */ +typedef union hwcfg2_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /* GHWCFG2 */ + unsigned op_mode:3; +#define DWC_HWCFG2_OP_MODE_HNP_SRP_CAPABLE_OTG 0 +#define DWC_HWCFG2_OP_MODE_SRP_ONLY_CAPABLE_OTG 1 +#define DWC_HWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE_OTG 2 +#define DWC_HWCFG2_OP_MODE_SRP_CAPABLE_DEVICE 3 +#define DWC_HWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE 4 +#define DWC_HWCFG2_OP_MODE_SRP_CAPABLE_HOST 5 +#define DWC_HWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST 6 + + unsigned architecture:2; + unsigned point2point:1; + unsigned hs_phy_type:2; +#define DWC_HWCFG2_HS_PHY_TYPE_NOT_SUPPORTED 0 +#define DWC_HWCFG2_HS_PHY_TYPE_UTMI 1 +#define DWC_HWCFG2_HS_PHY_TYPE_ULPI 2 +#define DWC_HWCFG2_HS_PHY_TYPE_UTMI_ULPI 3 + + unsigned fs_phy_type:2; + unsigned num_dev_ep:4; + unsigned num_host_chan:4; + unsigned perio_ep_supported:1; + unsigned dynamic_fifo:1; + unsigned multi_proc_int:1; + unsigned reserved21:1; + unsigned nonperio_tx_q_depth:2; + unsigned host_perio_tx_q_depth:2; + unsigned dev_token_q_depth:5; + unsigned otg_enable_ic_usb:1; + } b; +} hwcfg2_data_t; + +/** + * This union represents the bit fields in the User HW Config3 + * Register. Read the register into the d32 element then read + * out the bits using the bit elements. + */ +typedef union hwcfg3_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /* GHWCFG3 */ + unsigned xfer_size_cntr_width:4; + unsigned packet_size_cntr_width:3; + unsigned otg_func:1; + unsigned i2c:1; + unsigned vendor_ctrl_if:1; + unsigned optional_features:1; + unsigned synch_reset_type:1; + unsigned adp_supp:1; + unsigned otg_enable_hsic:1; + unsigned bc_support:1; + unsigned otg_lpm_en:1; + unsigned dfifo_depth:16; + } b; +} hwcfg3_data_t; + +/** + * This union represents the bit fields in the User HW Config4 + * Register. Read the register into the d32 element then read + * out the bits using the bit elements. + */ +typedef union hwcfg4_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned num_dev_perio_in_ep:4; + unsigned power_optimiz:1; + unsigned min_ahb_freq:1; + unsigned hiber:1; + unsigned xhiber:1; + unsigned reserved:6; + unsigned utmi_phy_data_width:2; + unsigned num_dev_mode_ctrl_ep:4; + unsigned iddig_filt_en:1; + unsigned vbus_valid_filt_en:1; + unsigned a_valid_filt_en:1; + unsigned b_valid_filt_en:1; + unsigned session_end_filt_en:1; + unsigned ded_fifo_en:1; + unsigned num_in_eps:4; + unsigned desc_dma:1; + unsigned desc_dma_dyn:1; + } b; +} hwcfg4_data_t; + +/** + * This union represents the bit fields of the Core LPM Configuration + * Register (GLPMCFG). Set the bits using bit fields then write + * the d32 value to the register. + */ +typedef union glpmctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** LPM-Capable (LPMCap) (Device and Host) + * The application uses this bit to control + * the DWC_otg core LPM capabilities. + */ + unsigned lpm_cap_en:1; + /** LPM response programmed by application (AppL1Res) (Device) + * Handshake response to LPM token pre-programmed + * by device application software. + */ + unsigned appl_resp:1; + /** Host Initiated Resume Duration (HIRD) (Device and Host) + * In Host mode this field indicates the value of HIRD + * to be sent in an LPM transaction. + * In Device mode this field is updated with the + * Received LPM Token HIRD bmAttribute + * when an ACK/NYET/STALL response is sent + * to an LPM transaction. + */ + unsigned hird:4; + /** RemoteWakeEnable (bRemoteWake) (Device and Host) + * In Host mode this bit indicates the value of remote + * wake up to be sent in wIndex field of LPM transaction. + * In Device mode this field is updated with the + * Received LPM Token bRemoteWake bmAttribute + * when an ACK/NYET/STALL response is sent + * to an LPM transaction. + */ + unsigned rem_wkup_en:1; + /** Enable utmi_sleep_n (EnblSlpM) (Device and Host) + * The application uses this bit to control + * the utmi_sleep_n assertion to the PHY when in L1 state. + */ + unsigned en_utmi_sleep:1; + /** HIRD Threshold (HIRD_Thres) (Device and Host) + */ + unsigned hird_thres:5; + /** LPM Response (CoreL1Res) (Device and Host) + * In Host mode this bit contains handsake response to + * LPM transaction. + * In Device mode the response of the core to + * LPM transaction received is reflected in these two bits. + - 0x0 : ERROR (No handshake response) + - 0x1 : STALL + - 0x2 : NYET + - 0x3 : ACK + */ + unsigned lpm_resp:2; + /** Port Sleep Status (SlpSts) (Device and Host) + * This bit is set as long as a Sleep condition + * is present on the USB bus. + */ + unsigned prt_sleep_sts:1; + /** Sleep State Resume OK (L1ResumeOK) (Device and Host) + * Indicates that the application or host + * can start resume from Sleep state. + */ + unsigned sleep_state_resumeok:1; + /** LPM channel Index (LPM_Chnl_Indx) (Host) + * The channel number on which the LPM transaction + * has to be applied while sending + * an LPM transaction to the local device. + */ + unsigned lpm_chan_index:4; + /** LPM Retry Count (LPM_Retry_Cnt) (Host) + * Number host retries that would be performed + * if the device response was not valid response. + */ + unsigned retry_count:3; + /** Send LPM Transaction (SndLPM) (Host) + * When set by application software, + * an LPM transaction containing two tokens + * is sent. + */ + unsigned send_lpm:1; + /** LPM Retry status (LPM_RetryCnt_Sts) (Host) + * Number of LPM Host Retries still remaining + * to be transmitted for the current LPM sequence + */ + unsigned retry_count_sts:3; + /** Enable Best Effort Service Latency (BESL) (Device and Host) + * This bit enables the BESL features as defined in the LPM errata + */ + unsigned en_besl:1; + + unsigned reserved29:1; + /** In host mode once this bit is set, the host + * configures to drive the HSIC Idle state on the bus. + * It then waits for the device to initiate the Connect sequence. + * In device mode once this bit is set, the device waits for + * the HSIC Idle line state on the bus. Upon receving the Idle + * line state, it initiates the HSIC Connect sequence. + */ + unsigned hsic_connect:1; + /** This bit overrides and functionally inverts + * the if_select_hsic input port signal. + */ + unsigned inv_sel_hsic:1; + } b; +} glpmcfg_data_t; + +/** + * This union represents the bit fields of the Core ADP Timer, Control and + * Status Register (ADPTIMCTLSTS). Set the bits using bit fields then write + * the d32 value to the register. + */ +typedef union adpctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Probe Discharge (PRB_DSCHG) + * These bits set the times for TADP_DSCHG. + * These bits are defined as follows: + * 2'b00 - 4 msec + * 2'b01 - 8 msec + * 2'b10 - 16 msec + * 2'b11 - 32 msec + */ + unsigned prb_dschg:2; + /** Probe Delta (PRB_DELTA) + * These bits set the resolution for RTIM value. + * The bits are defined in units of 32 kHz clock cycles as follows: + * 2'b00 - 1 cycles + * 2'b01 - 2 cycles + * 2'b10 - 3 cycles + * 2'b11 - 4 cycles + * For example if this value is chosen to 2'b01, it means that RTIM + * increments for every 3(three) 32Khz clock cycles. + */ + unsigned prb_delta:2; + /** Probe Period (PRB_PER) + * These bits sets the TADP_PRD as shown in Figure 4 as follows: + * 2'b00 - 0.625 to 0.925 sec (typical 0.775 sec) + * 2'b01 - 1.25 to 1.85 sec (typical 1.55 sec) + * 2'b10 - 1.9 to 2.6 sec (typical 2.275 sec) + * 2'b11 - Reserved + */ + unsigned prb_per:2; + /** These bits capture the latest time it took for VBUS to ramp from + * VADP_SINK to VADP_PRB. + * 0x000 - 1 cycles + * 0x001 - 2 cycles + * 0x002 - 3 cycles + * etc + * 0x7FF - 2048 cycles + * A time of 1024 cycles at 32 kHz corresponds to a time of 32 msec. + */ + unsigned rtim:11; + /** Enable Probe (EnaPrb) + * When programmed to 1'b1, the core performs a probe operation. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned enaprb:1; + /** Enable Sense (EnaSns) + * When programmed to 1'b1, the core performs a Sense operation. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned enasns:1; + /** ADP Reset (ADPRes) + * When set, ADP controller is reset. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adpres:1; + /** ADP Enable (ADPEn) + * When set, the core performs either ADP probing or sensing + * based on EnaPrb or EnaSns. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adpen:1; + /** ADP Probe Interrupt (ADP_PRB_INT) + * When this bit is set, it means that the VBUS + * voltage is greater than VADP_PRB or VADP_PRB is reached. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adp_prb_int:1; + /** + * ADP Sense Interrupt (ADP_SNS_INT) + * When this bit is set, it means that the VBUS voltage is greater than + * VADP_SNS value or VADP_SNS is reached. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adp_sns_int:1; + /** ADP Tomeout Interrupt (ADP_TMOUT_INT) + * This bit is relevant only for an ADP probe. + * When this bit is set, it means that the ramp time has + * completed ie ADPCTL.RTIM has reached its terminal value + * of 0x7FF. This is a debug feature that allows software + * to read the ramp time after each cycle. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adp_tmout_int:1; + /** ADP Probe Interrupt Mask (ADP_PRB_INT_MSK) + * When this bit is set, it unmasks the interrupt due to ADP_PRB_INT. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adp_prb_int_msk:1; + /** ADP Sense Interrupt Mask (ADP_SNS_INT_MSK) + * When this bit is set, it unmasks the interrupt due to ADP_SNS_INT. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adp_sns_int_msk:1; + /** ADP Timoeout Interrupt Mask (ADP_TMOUT_MSK) + * When this bit is set, it unmasks the interrupt due to ADP_TMOUT_INT. + * This bit is valid only if OTG_Ver = 1'b1. + */ + unsigned adp_tmout_int_msk:1; + /** Access Request + * 2'b00 - Read/Write Valid (updated by the core) + * 2'b01 - Read + * 2'b00 - Write + * 2'b00 - Reserved + */ + unsigned ar:2; + /** Reserved */ + unsigned reserved29_31:3; + } b; +} adpctl_data_t; + +//////////////////////////////////////////// +// Device Registers +/** + * Device Global Registers. Offsets 800h-BFFh + * + * The following structures define the size and relative field offsets + * for the Device Mode Registers. + * + * These registers are visible only in Device mode and must not be + * accessed in Host mode, as the results are unknown. + */ +typedef struct dwc_otg_dev_global_regs { + /** Device Configuration Register. Offset 800h */ + volatile uint32_t dcfg; + /** Device Control Register. Offset: 804h */ + volatile uint32_t dctl; + /** Device Status Register (Read Only). Offset: 808h */ + volatile uint32_t dsts; + /** Reserved. Offset: 80Ch */ + uint32_t unused; + /** Device IN Endpoint Common Interrupt Mask + * Register. Offset: 810h */ + volatile uint32_t diepmsk; + /** Device OUT Endpoint Common Interrupt Mask + * Register. Offset: 814h */ + volatile uint32_t doepmsk; + /** Device All Endpoints Interrupt Register. Offset: 818h */ + volatile uint32_t daint; + /** Device All Endpoints Interrupt Mask Register. Offset: + * 81Ch */ + volatile uint32_t daintmsk; + /** Device IN Token Queue Read Register-1 (Read Only). + * Offset: 820h */ + volatile uint32_t dtknqr1; + /** Device IN Token Queue Read Register-2 (Read Only). + * Offset: 824h */ + volatile uint32_t dtknqr2; + /** Device VBUS discharge Register. Offset: 828h */ + volatile uint32_t dvbusdis; + /** Device VBUS Pulse Register. Offset: 82Ch */ + volatile uint32_t dvbuspulse; + /** Device IN Token Queue Read Register-3 (Read Only). / + * Device Thresholding control register (Read/Write) + * Offset: 830h */ + volatile uint32_t dtknqr3_dthrctl; + /** Device IN Token Queue Read Register-4 (Read Only). / + * Device IN EPs empty Inr. Mask Register (Read/Write) + * Offset: 834h */ + volatile uint32_t dtknqr4_fifoemptymsk; + /** Device Each Endpoint Interrupt Register (Read Only). / + * Offset: 838h */ + volatile uint32_t deachint; + /** Device Each Endpoint Interrupt mask Register (Read/Write). / + * Offset: 83Ch */ + volatile uint32_t deachintmsk; + /** Device Each In Endpoint Interrupt mask Register (Read/Write). / + * Offset: 840h */ + volatile uint32_t diepeachintmsk[MAX_EPS_CHANNELS]; + /** Device Each Out Endpoint Interrupt mask Register (Read/Write). / + * Offset: 880h */ + volatile uint32_t doepeachintmsk[MAX_EPS_CHANNELS]; +} dwc_otg_device_global_regs_t; + +/** + * This union represents the bit fields in the Device Configuration + * Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. Write the + * d32 member to the dcfg register. + */ +typedef union dcfg_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Device Speed */ + unsigned devspd:2; + /** Non Zero Length Status OUT Handshake */ + unsigned nzstsouthshk:1; +#define DWC_DCFG_SEND_STALL 1 + + unsigned ena32khzs:1; + /** Device Addresses */ + unsigned devaddr:7; + /** Periodic Frame Interval */ + unsigned perfrint:2; +#define DWC_DCFG_FRAME_INTERVAL_80 0 +#define DWC_DCFG_FRAME_INTERVAL_85 1 +#define DWC_DCFG_FRAME_INTERVAL_90 2 +#define DWC_DCFG_FRAME_INTERVAL_95 3 + + /** Enable Device OUT NAK for bulk in DDMA mode */ + unsigned endevoutnak:1; + + unsigned reserved14_17:4; + /** In Endpoint Mis-match count */ + unsigned epmscnt:5; + /** Enable Descriptor DMA in Device mode */ + unsigned descdma:1; + unsigned perschintvl:2; + unsigned resvalid:6; + } b; +} dcfg_data_t; + +/** + * This union represents the bit fields in the Device Control + * Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union dctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Remote Wakeup */ + unsigned rmtwkupsig:1; + /** Soft Disconnect */ + unsigned sftdiscon:1; + /** Global Non-Periodic IN NAK Status */ + unsigned gnpinnaksts:1; + /** Global OUT NAK Status */ + unsigned goutnaksts:1; + /** Test Control */ + unsigned tstctl:3; + /** Set Global Non-Periodic IN NAK */ + unsigned sgnpinnak:1; + /** Clear Global Non-Periodic IN NAK */ + unsigned cgnpinnak:1; + /** Set Global OUT NAK */ + unsigned sgoutnak:1; + /** Clear Global OUT NAK */ + unsigned cgoutnak:1; + /** Power-On Programming Done */ + unsigned pwronprgdone:1; + /** Reserved */ + unsigned reserved:1; + /** Global Multi Count */ + unsigned gmc:2; + /** Ignore Frame Number for ISOC EPs */ + unsigned ifrmnum:1; + /** NAK on Babble */ + unsigned nakonbble:1; + /** Enable Continue on BNA */ + unsigned encontonbna:1; + /** Enable deep sleep besl reject feature*/ + unsigned besl_reject:1; + + unsigned reserved17_31:13; + } b; +} dctl_data_t; + +/** + * This union represents the bit fields in the Device Status + * Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union dsts_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Suspend Status */ + unsigned suspsts:1; + /** Enumerated Speed */ + unsigned enumspd:2; +#define DWC_DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DWC_DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DWC_DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DWC_DSTS_ENUMSPD_FS_PHY_48MHZ 3 + /** Erratic Error */ + unsigned errticerr:1; + unsigned reserved4_7:4; + /** Frame or Microframe Number of the received SOF */ + unsigned soffn:14; + unsigned reserved22_31:10; + } b; +} dsts_data_t; + +/** + * This union represents the bit fields in the Device IN EP Interrupt + * Register and the Device IN EP Common Mask Register. + * + * - Read the register into the d32 member then set/clear the + * bits using the bit elements. + */ +typedef union diepint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Transfer complete mask */ + unsigned xfercompl:1; + /** Endpoint disable mask */ + unsigned epdisabled:1; + /** AHB Error mask */ + unsigned ahberr:1; + /** TimeOUT Handshake mask (non-ISOC EPs) */ + unsigned timeout:1; + /** IN Token received with TxF Empty mask */ + unsigned intktxfemp:1; + /** IN Token Received with EP mismatch mask */ + unsigned intknepmis:1; + /** IN Endpoint NAK Effective mask */ + unsigned inepnakeff:1; + /** Reserved */ + unsigned emptyintr:1; + + unsigned txfifoundrn:1; + + /** BNA Interrupt mask */ + unsigned bna:1; + + unsigned reserved10_12:3; + /** BNA Interrupt mask */ + unsigned nak:1; + + unsigned reserved14_31:18; + } b; +} diepint_data_t; + +/** + * This union represents the bit fields in the Device IN EP + * Common/Dedicated Interrupt Mask Register. + */ +typedef union diepint_data diepmsk_data_t; + +/** + * This union represents the bit fields in the Device OUT EP Interrupt + * Registerand Device OUT EP Common Interrupt Mask Register. + * + * - Read the register into the d32 member then set/clear the + * bits using the bit elements. + */ +typedef union doepint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Transfer complete */ + unsigned xfercompl:1; + /** Endpoint disable */ + unsigned epdisabled:1; + /** AHB Error */ + unsigned ahberr:1; + /** Setup Phase Done (contorl EPs) */ + unsigned setup:1; + /** OUT Token Received when Endpoint Disabled */ + unsigned outtknepdis:1; + + unsigned stsphsercvd:1; + /** Back-to-Back SETUP Packets Received */ + unsigned back2backsetup:1; + + unsigned reserved7:1; + /** OUT packet Error */ + unsigned outpkterr:1; + /** BNA Interrupt */ + unsigned bna:1; + + unsigned reserved10:1; + /** Packet Drop Status */ + unsigned pktdrpsts:1; + /** Babble Interrupt */ + unsigned babble:1; + /** NAK Interrupt */ + unsigned nak:1; + /** NYET Interrupt */ + unsigned nyet:1; + /** Bit indicating setup packet received */ + unsigned sr:1; + + unsigned reserved16_31:16; + } b; +} doepint_data_t; + +/** + * This union represents the bit fields in the Device OUT EP + * Common/Dedicated Interrupt Mask Register. + */ +typedef union doepint_data doepmsk_data_t; + +/** + * This union represents the bit fields in the Device All EP Interrupt + * and Mask Registers. + * - Read the register into the d32 member then set/clear the + * bits using the bit elements. + */ +typedef union daint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** IN Endpoint bits */ + unsigned in:16; + /** OUT Endpoint bits */ + unsigned out:16; + } ep; + struct { + /** IN Endpoint bits */ + unsigned inep0:1; + unsigned inep1:1; + unsigned inep2:1; + unsigned inep3:1; + unsigned inep4:1; + unsigned inep5:1; + unsigned inep6:1; + unsigned inep7:1; + unsigned inep8:1; + unsigned inep9:1; + unsigned inep10:1; + unsigned inep11:1; + unsigned inep12:1; + unsigned inep13:1; + unsigned inep14:1; + unsigned inep15:1; + /** OUT Endpoint bits */ + unsigned outep0:1; + unsigned outep1:1; + unsigned outep2:1; + unsigned outep3:1; + unsigned outep4:1; + unsigned outep5:1; + unsigned outep6:1; + unsigned outep7:1; + unsigned outep8:1; + unsigned outep9:1; + unsigned outep10:1; + unsigned outep11:1; + unsigned outep12:1; + unsigned outep13:1; + unsigned outep14:1; + unsigned outep15:1; + } b; +} daint_data_t; + +/** + * This union represents the bit fields in the Device IN Token Queue + * Read Registers. + * - Read the register into the d32 member. + * - READ-ONLY Register + */ +typedef union dtknq1_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** In Token Queue Write Pointer */ + unsigned intknwptr:5; + /** Reserved */ + unsigned reserved05_06:2; + /** write pointer has wrapped. */ + unsigned wrap_bit:1; + /** EP Numbers of IN Tokens 0 ... 4 */ + unsigned epnums0_5:24; + } b; +} dtknq1_data_t; + +/** + * This union represents Threshold control Register + * - Read and write the register into the d32 member. + * - READ-WRITABLE Register + */ +typedef union dthrctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** non ISO Tx Thr. Enable */ + unsigned non_iso_thr_en:1; + /** ISO Tx Thr. Enable */ + unsigned iso_thr_en:1; + /** Tx Thr. Length */ + unsigned tx_thr_len:9; + /** AHB Threshold ratio */ + unsigned ahb_thr_ratio:2; + /** Reserved */ + unsigned reserved13_15:3; + /** Rx Thr. Enable */ + unsigned rx_thr_en:1; + /** Rx Thr. Length */ + unsigned rx_thr_len:9; + unsigned reserved26:1; + /** Arbiter Parking Enable*/ + unsigned arbprken:1; + /** Reserved */ + unsigned reserved28_31:4; + } b; +} dthrctl_data_t; + +/** + * Device Logical IN Endpoint-Specific Registers. Offsets + * 900h-AFCh + * + * There will be one set of endpoint registers per logical endpoint + * implemented. + * + * These registers are visible only in Device mode and must not be + * accessed in Host mode, as the results are unknown. + */ +typedef struct dwc_otg_dev_in_ep_regs { + /** Device IN Endpoint Control Register. Offset:900h + + * (ep_num * 20h) + 00h */ + volatile uint32_t diepctl; + /** Reserved. Offset:900h + (ep_num * 20h) + 04h */ + uint32_t reserved04; + /** Device IN Endpoint Interrupt Register. Offset:900h + + * (ep_num * 20h) + 08h */ + volatile uint32_t diepint; + /** Reserved. Offset:900h + (ep_num * 20h) + 0Ch */ + uint32_t reserved0C; + /** Device IN Endpoint Transfer Size + * Register. Offset:900h + (ep_num * 20h) + 10h */ + volatile uint32_t dieptsiz; + /** Device IN Endpoint DMA Address Register. Offset:900h + + * (ep_num * 20h) + 14h */ + volatile uint32_t diepdma; + /** Device IN Endpoint Transmit FIFO Status Register. Offset:900h + + * (ep_num * 20h) + 18h */ + volatile uint32_t dtxfsts; + /** Device IN Endpoint DMA Buffer Register. Offset:900h + + * (ep_num * 20h) + 1Ch */ + volatile uint32_t diepdmab; +} dwc_otg_dev_in_ep_regs_t; + +/** + * Device Logical OUT Endpoint-Specific Registers. Offsets: + * B00h-CFCh + * + * There will be one set of endpoint registers per logical endpoint + * implemented. + * + * These registers are visible only in Device mode and must not be + * accessed in Host mode, as the results are unknown. + */ +typedef struct dwc_otg_dev_out_ep_regs { + /** Device OUT Endpoint Control Register. Offset:B00h + + * (ep_num * 20h) + 00h */ + volatile uint32_t doepctl; + /** Reserved. Offset:B00h + (ep_num * 20h) + 04h */ + uint32_t reserved04; + /** Device OUT Endpoint Interrupt Register. Offset:B00h + + * (ep_num * 20h) + 08h */ + volatile uint32_t doepint; + /** Reserved. Offset:B00h + (ep_num * 20h) + 0Ch */ + uint32_t reserved0C; + /** Device OUT Endpoint Transfer Size Register. Offset: + * B00h + (ep_num * 20h) + 10h */ + volatile uint32_t doeptsiz; + /** Device OUT Endpoint DMA Address Register. Offset:B00h + * + (ep_num * 20h) + 14h */ + volatile uint32_t doepdma; + /** Reserved. Offset:B00h + * (ep_num * 20h) + 18h */ + uint32_t unused; + /** Device OUT Endpoint DMA Buffer Register. Offset:B00h + * + (ep_num * 20h) + 1Ch */ + uint32_t doepdmab; +} dwc_otg_dev_out_ep_regs_t; + +/** + * This union represents the bit fields in the Device EP Control + * Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union depctl_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Maximum Packet Size + * IN/OUT EPn + * IN/OUT EP0 - 2 bits + * 2'b00: 64 Bytes + * 2'b01: 32 + * 2'b10: 16 + * 2'b11: 8 */ + unsigned mps:11; +#define DWC_DEP0CTL_MPS_64 0 +#define DWC_DEP0CTL_MPS_32 1 +#define DWC_DEP0CTL_MPS_16 2 +#define DWC_DEP0CTL_MPS_8 3 + + /** Next Endpoint + * IN EPn/IN EP0 + * OUT EPn/OUT EP0 - reserved */ + unsigned nextep:4; + + /** USB Active Endpoint */ + unsigned usbactep:1; + + /** Endpoint DPID (INTR/Bulk IN and OUT endpoints) + * This field contains the PID of the packet going to + * be received or transmitted on this endpoint. The + * application should program the PID of the first + * packet going to be received or transmitted on this + * endpoint , after the endpoint is + * activated. Application use the SetD1PID and + * SetD0PID fields of this register to program either + * D0 or D1 PID. + * + * The encoding for this field is + * - 0: D0 + * - 1: D1 + */ + unsigned dpid:1; + + /** NAK Status */ + unsigned naksts:1; + + /** Endpoint Type + * 2'b00: Control + * 2'b01: Isochronous + * 2'b10: Bulk + * 2'b11: Interrupt */ + unsigned eptype:2; + + /** Snoop Mode + * OUT EPn/OUT EP0 + * IN EPn/IN EP0 - reserved */ + unsigned snp:1; + + /** Stall Handshake */ + unsigned stall:1; + + /** Tx Fifo Number + * IN EPn/IN EP0 + * OUT EPn/OUT EP0 - reserved */ + unsigned txfnum:4; + + /** Clear NAK */ + unsigned cnak:1; + /** Set NAK */ + unsigned snak:1; + /** Set DATA0 PID (INTR/Bulk IN and OUT endpoints) + * Writing to this field sets the Endpoint DPID (DPID) + * field in this register to DATA0. Set Even + * (micro)frame (SetEvenFr) (ISO IN and OUT Endpoints) + * Writing to this field sets the Even/Odd + * (micro)frame (EO_FrNum) field to even (micro) + * frame. + */ + unsigned setd0pid:1; + /** Set DATA1 PID (INTR/Bulk IN and OUT endpoints) + * Writing to this field sets the Endpoint DPID (DPID) + * field in this register to DATA1 Set Odd + * (micro)frame (SetOddFr) (ISO IN and OUT Endpoints) + * Writing to this field sets the Even/Odd + * (micro)frame (EO_FrNum) field to odd (micro) frame. + */ + unsigned setd1pid:1; + + /** Endpoint Disable */ + unsigned epdis:1; + /** Endpoint Enable */ + unsigned epena:1; + } b; +} depctl_data_t; + +/** + * This union represents the bit fields in the Device EP Transfer + * Size Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union deptsiz_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Transfer size */ + unsigned xfersize:19; +/** Max packet count for EP (pow(2,10)-1) */ +#define MAX_PKT_CNT 1023 + /** Packet Count */ + unsigned pktcnt:10; + /** Multi Count - Periodic IN endpoints */ + unsigned mc:2; + unsigned reserved:1; + } b; +} deptsiz_data_t; + +/** + * This union represents the bit fields in the Device EP 0 Transfer + * Size Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union deptsiz0_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Transfer size */ + unsigned xfersize:7; + /** Reserved */ + unsigned reserved7_18:12; + /** Packet Count */ + unsigned pktcnt:2; + /** Reserved */ + unsigned reserved21_28:8; + /**Setup Packet Count (DOEPTSIZ0 Only) */ + unsigned supcnt:2; + unsigned reserved31; + } b; +} deptsiz0_data_t; + +///////////////////////////////////////////////// +// DMA Descriptor Specific Structures +// + +/** Buffer status definitions */ + +#define BS_HOST_READY 0x0 +#define BS_DMA_BUSY 0x1 +#define BS_DMA_DONE 0x2 +#define BS_HOST_BUSY 0x3 + +/** Receive/Transmit status definitions */ + +#define RTS_SUCCESS 0x0 +#define RTS_BUFFLUSH 0x1 +#define RTS_RESERVED 0x2 +#define RTS_BUFERR 0x3 + +/** + * This union represents the bit fields in the DMA Descriptor + * status quadlet. Read the quadlet into the d32 member then + * set/clear the bits using the bit, b_iso_out and + * b_iso_in elements. + */ +typedef union dev_dma_desc_sts { + /** raw register data */ + uint32_t d32; + /** quadlet bits */ + struct { + /** Received number of bytes */ + unsigned bytes:16; + /** NAK bit - only for OUT EPs */ + unsigned nak:1; + unsigned reserved17_22:6; + /** Multiple Transfer - only for OUT EPs */ + unsigned mtrf:1; + /** Setup Packet received - only for OUT EPs */ + unsigned sr:1; + /** Interrupt On Complete */ + unsigned ioc:1; + /** Short Packet */ + unsigned sp:1; + /** Last */ + unsigned l:1; + /** Receive Status */ + unsigned sts:2; + /** Buffer Status */ + unsigned bs:2; + } b; + +//#ifdef DWC_EN_ISOC + /** iso out quadlet bits */ + struct { + /** Received number of bytes */ + unsigned rxbytes:11; + + unsigned reserved11:1; + /** Frame Number */ + unsigned framenum:11; + /** Received ISO Data PID */ + unsigned pid:2; + /** Interrupt On Complete */ + unsigned ioc:1; + /** Short Packet */ + unsigned sp:1; + /** Last */ + unsigned l:1; + /** Receive Status */ + unsigned rxsts:2; + /** Buffer Status */ + unsigned bs:2; + } b_iso_out; + + /** iso in quadlet bits */ + struct { + /** Transmited number of bytes */ + unsigned txbytes:12; + /** Frame Number */ + unsigned framenum:11; + /** Transmited ISO Data PID */ + unsigned pid:2; + /** Interrupt On Complete */ + unsigned ioc:1; + /** Short Packet */ + unsigned sp:1; + /** Last */ + unsigned l:1; + /** Transmit Status */ + unsigned txsts:2; + /** Buffer Status */ + unsigned bs:2; + } b_iso_in; +//#endif /* DWC_EN_ISOC */ +} dev_dma_desc_sts_t; + +/** + * DMA Descriptor structure + * + * DMA Descriptor structure contains two quadlets: + * Status quadlet and Data buffer pointer. + */ +typedef struct dwc_otg_dev_dma_desc { + /** DMA Descriptor status quadlet */ + dev_dma_desc_sts_t status; + /** DMA Descriptor data buffer pointer */ + uint32_t buf; +} dwc_otg_dev_dma_desc_t; + +/** + * The dwc_otg_dev_if structure contains information needed to manage + * the DWC_otg controller acting in device mode. It represents the + * programming view of the device-specific aspects of the controller. + */ +typedef struct dwc_otg_dev_if { + /** Pointer to device Global registers. + * Device Global Registers starting at offset 800h + */ + dwc_otg_device_global_regs_t *dev_global_regs; +#define DWC_DEV_GLOBAL_REG_OFFSET 0x800 + + /** + * Device Logical IN Endpoint-Specific Registers 900h-AFCh + */ + dwc_otg_dev_in_ep_regs_t *in_ep_regs[MAX_EPS_CHANNELS]; +#define DWC_DEV_IN_EP_REG_OFFSET 0x900 +#define DWC_EP_REG_OFFSET 0x20 + + /** Device Logical OUT Endpoint-Specific Registers B00h-CFCh */ + dwc_otg_dev_out_ep_regs_t *out_ep_regs[MAX_EPS_CHANNELS]; +#define DWC_DEV_OUT_EP_REG_OFFSET 0xB00 + + /* Device configuration information */ + uint8_t speed; /**< Device Speed 0: Unknown, 1: LS, 2:FS, 3: HS */ + uint8_t num_in_eps; /**< Number # of Tx EP range: 0-15 exept ep0 */ + uint8_t num_out_eps; /**< Number # of Rx EP range: 0-15 exept ep 0*/ + + /** Size of periodic FIFOs (Bytes) */ + uint16_t perio_tx_fifo_size[MAX_PERIO_FIFOS]; + + /** Size of Tx FIFOs (Bytes) */ + uint16_t tx_fifo_size[MAX_TX_FIFOS]; + + /** Thresholding enable flags and length varaiables **/ + uint16_t rx_thr_en; + uint16_t iso_tx_thr_en; + uint16_t non_iso_tx_thr_en; + + uint16_t rx_thr_length; + uint16_t tx_thr_length; + + /** + * Pointers to the DMA Descriptors for EP0 Control + * transfers (virtual and physical) + */ + + /** 2 descriptors for SETUP packets */ + dwc_dma_t dma_setup_desc_addr[2]; + dwc_otg_dev_dma_desc_t *setup_desc_addr[2]; + + /** Pointer to Descriptor with latest SETUP packet */ + dwc_otg_dev_dma_desc_t *psetup; + + /** Index of current SETUP handler descriptor */ + uint32_t setup_desc_index; + + /** Descriptor for Data In or Status In phases */ + dwc_dma_t dma_in_desc_addr; + dwc_otg_dev_dma_desc_t *in_desc_addr; + + /** Descriptor for Data Out or Status Out phases */ + dwc_dma_t dma_out_desc_addr; + dwc_otg_dev_dma_desc_t *out_desc_addr; + + /** Setup Packet Detected - if set clear NAK when queueing */ + uint32_t spd; + /** Isoc ep pointer on which incomplete happens */ + void *isoc_ep; + +} dwc_otg_dev_if_t; + +///////////////////////////////////////////////// +// Host Mode Register Structures +// +/** + * The Host Global Registers structure defines the size and relative + * field offsets for the Host Mode Global Registers. Host Global + * Registers offsets 400h-7FFh. +*/ +typedef struct dwc_otg_host_global_regs { + /** Host Configuration Register. Offset: 400h */ + volatile uint32_t hcfg; + /** Host Frame Interval Register. Offset: 404h */ + volatile uint32_t hfir; + /** Host Frame Number / Frame Remaining Register. Offset: 408h */ + volatile uint32_t hfnum; + /** Reserved. Offset: 40Ch */ + uint32_t reserved40C; + /** Host Periodic Transmit FIFO/ Queue Status Register. Offset: 410h */ + volatile uint32_t hptxsts; + /** Host All Channels Interrupt Register. Offset: 414h */ + volatile uint32_t haint; + /** Host All Channels Interrupt Mask Register. Offset: 418h */ + volatile uint32_t haintmsk; + /** Host Frame List Base Address Register . Offset: 41Ch */ + volatile uint32_t hflbaddr; +} dwc_otg_host_global_regs_t; + +/** + * This union represents the bit fields in the Host Configuration Register. + * Read the register into the d32 member then set/clear the bits using + * the bit elements. Write the d32 member to the hcfg register. + */ +typedef union hcfg_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + /** FS/LS Phy Clock Select */ + unsigned fslspclksel:2; +#define DWC_HCFG_30_60_MHZ 0 +#define DWC_HCFG_48_MHZ 1 +#define DWC_HCFG_6_MHZ 2 + + /** FS/LS Only Support */ + unsigned fslssupp:1; + unsigned reserved3_6:4; + /** Enable 32-KHz Suspend Mode */ + unsigned ena32khzs:1; + /** Resume Validation Periiod */ + unsigned resvalid:8; + unsigned reserved16_22:7; + /** Enable Scatter/gather DMA in Host mode */ + unsigned descdma:1; + /** Frame List Entries */ + unsigned frlisten:2; + /** Enable Periodic Scheduling */ + unsigned perschedena:1; + unsigned reserved27_30:4; + unsigned modechtimen:1; + } b; +} hcfg_data_t; + +/** + * This union represents the bit fields in the Host Frame Remaing/Number + * Register. + */ +typedef union hfir_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + unsigned frint:16; + unsigned hfirrldctrl:1; + unsigned reserved:15; + } b; +} hfir_data_t; + +/** + * This union represents the bit fields in the Host Frame Remaing/Number + * Register. + */ +typedef union hfnum_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + unsigned frnum:16; +#define DWC_HFNUM_MAX_FRNUM 0x3FFF + unsigned frrem:16; + } b; +} hfnum_data_t; + +typedef union hptxsts_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + unsigned ptxfspcavail:16; + unsigned ptxqspcavail:8; + /** Top of the Periodic Transmit Request Queue + * - bit 24 - Terminate (last entry for the selected channel) + * - bits 26:25 - Token Type + * - 2'b00 - Zero length + * - 2'b01 - Ping + * - 2'b10 - Disable + * - bits 30:27 - Channel Number + * - bit 31 - Odd/even microframe + */ + unsigned ptxqtop_terminate:1; + unsigned ptxqtop_token:2; + unsigned ptxqtop_chnum:4; + unsigned ptxqtop_odd:1; + } b; +} hptxsts_data_t; + +/** + * This union represents the bit fields in the Host Port Control and Status + * Register. Read the register into the d32 member then set/clear the + * bits using the bit elements. Write the d32 member to the + * hprt0 register. + */ +typedef union hprt0_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned prtconnsts:1; + unsigned prtconndet:1; + unsigned prtena:1; + unsigned prtenchng:1; + unsigned prtovrcurract:1; + unsigned prtovrcurrchng:1; + unsigned prtres:1; + unsigned prtsusp:1; + unsigned prtrst:1; + unsigned reserved9:1; + unsigned prtlnsts:2; + unsigned prtpwr:1; + unsigned prttstctl:4; + unsigned prtspd:2; +#define DWC_HPRT0_PRTSPD_HIGH_SPEED 0 +#define DWC_HPRT0_PRTSPD_FULL_SPEED 1 +#define DWC_HPRT0_PRTSPD_LOW_SPEED 2 + unsigned reserved19_31:13; + } b; +} hprt0_data_t; + +/** + * This union represents the bit fields in the Host All Interrupt + * Register. + */ +typedef union haint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned ch0:1; + unsigned ch1:1; + unsigned ch2:1; + unsigned ch3:1; + unsigned ch4:1; + unsigned ch5:1; + unsigned ch6:1; + unsigned ch7:1; + unsigned ch8:1; + unsigned ch9:1; + unsigned ch10:1; + unsigned ch11:1; + unsigned ch12:1; + unsigned ch13:1; + unsigned ch14:1; + unsigned ch15:1; + unsigned reserved:16; + } b; + + struct { + unsigned chint:16; + unsigned reserved:16; + } b2; +} haint_data_t; + +/** + * This union represents the bit fields in the Host All Interrupt + * Register. + */ +typedef union haintmsk_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned ch0:1; + unsigned ch1:1; + unsigned ch2:1; + unsigned ch3:1; + unsigned ch4:1; + unsigned ch5:1; + unsigned ch6:1; + unsigned ch7:1; + unsigned ch8:1; + unsigned ch9:1; + unsigned ch10:1; + unsigned ch11:1; + unsigned ch12:1; + unsigned ch13:1; + unsigned ch14:1; + unsigned ch15:1; + unsigned reserved:16; + } b; + + struct { + unsigned chint:16; + unsigned reserved:16; + } b2; +} haintmsk_data_t; + +/** + * Host Channel Specific Registers. 500h-5FCh + */ +typedef struct dwc_otg_hc_regs { + /** Host Channel 0 Characteristic Register. Offset: 500h + (chan_num * 20h) + 00h */ + volatile uint32_t hcchar; + /** Host Channel 0 Split Control Register. Offset: 500h + (chan_num * 20h) + 04h */ + volatile uint32_t hcsplt; + /** Host Channel 0 Interrupt Register. Offset: 500h + (chan_num * 20h) + 08h */ + volatile uint32_t hcint; + /** Host Channel 0 Interrupt Mask Register. Offset: 500h + (chan_num * 20h) + 0Ch */ + volatile uint32_t hcintmsk; + /** Host Channel 0 Transfer Size Register. Offset: 500h + (chan_num * 20h) + 10h */ + volatile uint32_t hctsiz; + /** Host Channel 0 DMA Address Register. Offset: 500h + (chan_num * 20h) + 14h */ + volatile uint32_t hcdma; + volatile uint32_t reserved; + /** Host Channel 0 DMA Buffer Address Register. Offset: 500h + (chan_num * 20h) + 1Ch */ + volatile uint32_t hcdmab; +} dwc_otg_hc_regs_t; + +/** + * This union represents the bit fields in the Host Channel Characteristics + * Register. Read the register into the d32 member then set/clear the + * bits using the bit elements. Write the d32 member to the + * hcchar register. + */ +typedef union hcchar_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + /** Maximum packet size in bytes */ + unsigned mps:11; + + /** Endpoint number */ + unsigned epnum:4; + + /** 0: OUT, 1: IN */ + unsigned epdir:1; + + unsigned reserved:1; + + /** 0: Full/high speed device, 1: Low speed device */ + unsigned lspddev:1; + + /** 0: Control, 1: Isoc, 2: Bulk, 3: Intr */ + unsigned eptype:2; + + /** Packets per frame for periodic transfers. 0 is reserved. */ + unsigned multicnt:2; + + /** Device address */ + unsigned devaddr:7; + + /** + * Frame to transmit periodic transaction. + * 0: even, 1: odd + */ + unsigned oddfrm:1; + + /** Channel disable */ + unsigned chdis:1; + + /** Channel enable */ + unsigned chen:1; + } b; +} hcchar_data_t; + +typedef union hcsplt_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + /** Port Address */ + unsigned prtaddr:7; + + /** Hub Address */ + unsigned hubaddr:7; + + /** Transaction Position */ + unsigned xactpos:2; +#define DWC_HCSPLIT_XACTPOS_MID 0 +#define DWC_HCSPLIT_XACTPOS_END 1 +#define DWC_HCSPLIT_XACTPOS_BEGIN 2 +#define DWC_HCSPLIT_XACTPOS_ALL 3 + + /** Do Complete Split */ + unsigned compsplt:1; + + /** Reserved */ + unsigned reserved:14; + + /** Split Enble */ + unsigned spltena:1; + } b; +} hcsplt_data_t; + +/** + * This union represents the bit fields in the Host All Interrupt + * Register. + */ +typedef union hcint_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** Transfer Complete */ + unsigned xfercomp:1; + /** Channel Halted */ + unsigned chhltd:1; + /** AHB Error */ + unsigned ahberr:1; + /** STALL Response Received */ + unsigned stall:1; + /** NAK Response Received */ + unsigned nak:1; + /** ACK Response Received */ + unsigned ack:1; + /** NYET Response Received */ + unsigned nyet:1; + /** Transaction Err */ + unsigned xacterr:1; + /** Babble Error */ + unsigned bblerr:1; + /** Frame Overrun */ + unsigned frmovrun:1; + /** Data Toggle Error */ + unsigned datatglerr:1; + /** Buffer Not Available (only for DDMA mode) */ + unsigned bna:1; + /** Exessive transaction error (only for DDMA mode) */ + unsigned xcs_xact:1; + /** Frame List Rollover interrupt */ + unsigned frm_list_roll:1; + /** Reserved */ + unsigned reserved14_31:18; + } b; +} hcint_data_t; + +/** + * This union represents the bit fields in the Host Channel Interrupt Mask + * Register. Read the register into the d32 member then set/clear the + * bits using the bit elements. Write the d32 member to the + * hcintmsk register. + */ +typedef union hcintmsk_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + unsigned xfercompl:1; + unsigned chhltd:1; + unsigned ahberr:1; + unsigned stall:1; + unsigned nak:1; + unsigned ack:1; + unsigned nyet:1; + unsigned xacterr:1; + unsigned bblerr:1; + unsigned frmovrun:1; + unsigned datatglerr:1; + unsigned bna:1; + unsigned xcs_xact:1; + unsigned frm_list_roll:1; + unsigned reserved14_31:18; + } b; +} hcintmsk_data_t; + +/** + * This union represents the bit fields in the Host Channel Transfer Size + * Register. Read the register into the d32 member then set/clear the + * bits using the bit elements. Write the d32 member to the + * hcchar register. + */ + +typedef union hctsiz_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + /** Total transfer size in bytes */ + unsigned xfersize:19; + + /** Data packets to transfer */ + unsigned pktcnt:10; + + /** + * Packet ID for next data packet + * 0: DATA0 + * 1: DATA2 + * 2: DATA1 + * 3: MDATA (non-Control), SETUP (Control) + */ + unsigned pid:2; +#define DWC_HCTSIZ_DATA0 0 +#define DWC_HCTSIZ_DATA1 2 +#define DWC_HCTSIZ_DATA2 1 +#define DWC_HCTSIZ_MDATA 3 +#define DWC_HCTSIZ_SETUP 3 + + /** Do PING protocol when 1 */ + unsigned dopng:1; + } b; + + /** register bits */ + struct { + /** Scheduling information */ + unsigned schinfo:8; + + /** Number of transfer descriptors. + * Max value: + * 64 in general, + * 256 only for HS isochronous endpoint. + */ + unsigned ntd:8; + + /** Data packets to transfer */ + unsigned reserved16_28:13; + + /** + * Packet ID for next data packet + * 0: DATA0 + * 1: DATA2 + * 2: DATA1 + * 3: MDATA (non-Control) + */ + unsigned pid:2; + + /** Do PING protocol when 1 */ + unsigned dopng:1; + } b_ddma; +} hctsiz_data_t; + +/** + * This union represents the bit fields in the Host DMA Address + * Register used in Descriptor DMA mode. + */ +typedef union hcdma_data { + /** raw register data */ + uint32_t d32; + /** register bits */ + struct { + unsigned reserved0_2:3; + /** Current Transfer Descriptor. Not used for ISOC */ + unsigned ctd:8; + /** Start Address of Descriptor List */ + unsigned dma_addr:21; + } b; +} hcdma_data_t; + +/** + * This union represents the bit fields in the DMA Descriptor + * status quadlet for host mode. Read the quadlet into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union host_dma_desc_sts { + /** raw register data */ + uint32_t d32; + /** quadlet bits */ + + /* for non-isochronous */ + struct { + /** Number of bytes */ + unsigned n_bytes:17; + /** QTD offset to jump when Short Packet received - only for IN EPs */ + unsigned qtd_offset:6; + /** + * Set to request the core to jump to alternate QTD if + * Short Packet received - only for IN EPs + */ + unsigned a_qtd:1; + /** + * Setup Packet bit. When set indicates that buffer contains + * setup packet. + */ + unsigned sup:1; + /** Interrupt On Complete */ + unsigned ioc:1; + /** End of List */ + unsigned eol:1; + unsigned reserved27:1; + /** Rx/Tx Status */ + unsigned sts:2; +#define DMA_DESC_STS_PKTERR 1 + unsigned reserved30:1; + /** Active Bit */ + unsigned a:1; + } b; + /* for isochronous */ + struct { + /** Number of bytes */ + unsigned n_bytes:12; + unsigned reserved12_24:13; + /** Interrupt On Complete */ + unsigned ioc:1; + unsigned reserved26_27:2; + /** Rx/Tx Status */ + unsigned sts:2; + unsigned reserved30:1; + /** Active Bit */ + unsigned a:1; + } b_isoc; +} host_dma_desc_sts_t; + +#define MAX_DMA_DESC_SIZE 131071 +#define MAX_DMA_DESC_NUM_GENERIC 64 +#define MAX_DMA_DESC_NUM_HS_ISOC 256 +#define MAX_FRLIST_EN_NUM 64 +/** + * Host-mode DMA Descriptor structure + * + * DMA Descriptor structure contains two quadlets: + * Status quadlet and Data buffer pointer. + */ +typedef struct dwc_otg_host_dma_desc { + /** DMA Descriptor status quadlet */ + host_dma_desc_sts_t status; + /** DMA Descriptor data buffer pointer */ + uint32_t buf; +} dwc_otg_host_dma_desc_t; + +/** OTG Host Interface Structure. + * + * The OTG Host Interface Structure structure contains information + * needed to manage the DWC_otg controller acting in host mode. It + * represents the programming view of the host-specific aspects of the + * controller. + */ +typedef struct dwc_otg_host_if { + /** Host Global Registers starting at offset 400h.*/ + dwc_otg_host_global_regs_t *host_global_regs; +#define DWC_OTG_HOST_GLOBAL_REG_OFFSET 0x400 + + /** Host Port 0 Control and Status Register */ + volatile uint32_t *hprt0; +#define DWC_OTG_HOST_PORT_REGS_OFFSET 0x440 + + /** Host Channel Specific Registers at offsets 500h-5FCh. */ + dwc_otg_hc_regs_t *hc_regs[MAX_EPS_CHANNELS]; +#define DWC_OTG_HOST_CHAN_REGS_OFFSET 0x500 +#define DWC_OTG_CHAN_REGS_OFFSET 0x20 + + /* Host configuration information */ + /** Number of Host Channels (range: 1-16) */ + uint8_t num_host_channels; + /** Periodic EPs supported (0: no, 1: yes) */ + uint8_t perio_eps_supported; + /** Periodic Tx FIFO Size (Only 1 host periodic Tx FIFO) */ + uint16_t perio_tx_fifo_size; + +} dwc_otg_host_if_t; + +/** + * This union represents the bit fields in the Power and Clock Gating Control + * Register. Read the register into the d32 member then set/clear the + * bits using the bit elements. + */ +typedef union pcgcctl_data { + /** raw register data */ + uint32_t d32; + + /** register bits */ + struct { + /** Stop Pclk */ + unsigned stoppclk:1; + /** Gate Hclk */ + unsigned gatehclk:1; + /** Power Clamp */ + unsigned pwrclmp:1; + /** Reset Power Down Modules */ + unsigned rstpdwnmodule:1; + /** Reserved */ + unsigned reserved:1; + /** Enable Sleep Clock Gating (Enbl_L1Gating) */ + unsigned enbl_sleep_gating:1; + /** PHY In Sleep (PhySleep) */ + unsigned phy_in_sleep:1; + /** Deep Sleep*/ + unsigned deep_sleep:1; + unsigned resetaftsusp:1; + unsigned restoremode:1; + unsigned enbl_extnd_hiber:1; + unsigned extnd_hiber_pwrclmp:1; + unsigned extnd_hiber_switch:1; + unsigned ess_reg_restored:1; + unsigned prt_clk_sel:2; + unsigned port_power:1; + unsigned max_xcvrselect:2; + unsigned max_termsel:1; + unsigned mac_dev_addr:7; + unsigned p2hd_dev_enum_spd:2; + unsigned p2hd_prt_spd:2; + unsigned if_dev_mode:1; + } b; +} pcgcctl_data_t; + +/** + * This union represents the bit fields in the Global Data FIFO Software + * Configuration Register. Read the register into the d32 member then + * set/clear the bits using the bit elements. + */ +typedef union gdfifocfg_data { + /* raw register data */ + uint32_t d32; + /** register bits */ + struct { + /** OTG Data FIFO depth */ + unsigned gdfifocfg:16; + /** Start address of EP info controller */ + unsigned epinfobase:16; + } b; +} gdfifocfg_data_t; + +/** + * This union represents the bit fields in the Global Power Down Register + * Register. Read the register into the d32 member then set/clear the + * bits using the bit elements. + */ +typedef union gpwrdn_data { + /* raw register data */ + uint32_t d32; + + /** register bits */ + struct { + /** PMU Interrupt Select */ + unsigned pmuintsel:1; + /** PMU Active */ + unsigned pmuactv:1; + /** Restore */ + unsigned restore:1; + /** Power Down Clamp */ + unsigned pwrdnclmp:1; + /** Power Down Reset */ + unsigned pwrdnrstn:1; + /** Power Down Switch */ + unsigned pwrdnswtch:1; + /** Disable VBUS */ + unsigned dis_vbus:1; + /** Line State Change */ + unsigned lnstschng:1; + /** Line state change mask */ + unsigned lnstchng_msk:1; + /** Reset Detected */ + unsigned rst_det:1; + /** Reset Detect mask */ + unsigned rst_det_msk:1; + /** Disconnect Detected */ + unsigned disconn_det:1; + /** Disconnect Detect mask */ + unsigned disconn_det_msk:1; + /** Connect Detected*/ + unsigned connect_det:1; + /** Connect Detected Mask*/ + unsigned connect_det_msk:1; + /** SRP Detected */ + unsigned srp_det:1; + /** SRP Detect mask */ + unsigned srp_det_msk:1; + /** Status Change Interrupt */ + unsigned sts_chngint:1; + /** Status Change Interrupt Mask */ + unsigned sts_chngint_msk:1; + /** Line State */ + unsigned linestate:2; + /** Indicates current mode(status of IDDIG signal) */ + unsigned idsts:1; + /** B Session Valid signal status*/ + unsigned bsessvld:1; + /** ADP Event Detected */ + unsigned adp_int:1; + /** Multi Valued ID pin */ + unsigned mult_val_id_bc:5; + /** Reserved 24_31 */ + unsigned reserved29_31:3; + } b; +} gpwrdn_data_t; + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/errno.h b/lib/fwlib/ram_lib/usb_otg/include/errno.h new file mode 100644 index 0000000..2fbccce --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/errno.h @@ -0,0 +1,149 @@ +#ifndef _GENERIC_ERRNO_H +#define _GENERIC_ERRNO_H + +#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 /* Argument 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 */ +#define ECANCELED 125 /* Operation Canceled */ +#define ENOKEY 126 /* Required key not available */ +#define EKEYEXPIRED 127 /* Key has expired */ +#define EKEYREVOKED 128 /* Key has been revoked */ +#define EKEYREJECTED 129 /* Key was rejected by service */ + +/* for robust mutexes */ +#define EOWNERDEAD 130 /* Owner died */ +#define ENOTRECOVERABLE 131 /* State not recoverable */ + +#define ERFKILL 132 /* Operation not possible due to RF-kill */ + +#define EHWPOISON 133 /* Memory page has hardware error */ + + +#define ENOTSUPP 524 /* Operation is not supported */ + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/hal_otg.h b/lib/fwlib/ram_lib/usb_otg/include/hal_otg.h new file mode 100644 index 0000000..5c0f669 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/hal_otg.h @@ -0,0 +1,21 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _HAL_OTG_H_ +#define _HAL_OTG_H_ + +#include "rtl8195a_otg.h" +#include "dwc_otg_regs.h" + + + + + + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/hcd.h b/lib/fwlib/ram_lib/usb_otg/include/hcd.h new file mode 100644 index 0000000..d261441 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/hcd.h @@ -0,0 +1,164 @@ +#ifndef _HCD_H_ +#define _HCD_H_ + + +struct hc_driver { + const char *description; /* "ehci-hcd" etc */ +const char *product_desc; /* product/vendor string */ +size_t hcd_priv_size; /* size of private data */ + +/* irq handler */ +//irqreturn_t (*irq) (struct usb_hcd *hcd); + +int flags; +#define HCD_MEMORY 0x0001 /* HC regs use memory (else I/O) */ +#define HCD_LOCAL_MEM 0x0002 /* HC needs local memory */ +#define HCD_SHARED 0x0004 /* Two (or more) usb_hcds share HW */ +#define HCD_USB11 0x0010 /* USB 1.1 */ +#define HCD_USB2 0x0020 /* USB 2.0 */ +#define HCD_USB3 0x0040 /* USB 3.0 */ +#define HCD_MASK 0x0070 + + /* called to init HCD and root hub */ + int (*reset) (struct usb_hcd *hcd); + int (*start) (struct usb_hcd *hcd); + + /* NOTE: these suspend/resume calls relate to the HC as + * a whole, not just the root hub; they're for PCI bus glue. + */ + /* called after suspending the hub, before entering D3 etc */ +// int (*pci_suspend)(struct usb_hcd *hcd, bool do_wakeup); + + /* called after entering D0 (etc), before resuming the hub */ +// int (*pci_resume)(struct usb_hcd *hcd, bool hibernated); + + /* cleanly make HCD stop writing memory and doing I/O */ + void (*stop) (struct usb_hcd *hcd); + + /* shutdown HCD */ + // void (*shutdown) (struct usb_hcd *hcd); + + /* return current frame number */ + int (*get_frame_number) (struct usb_hcd *hcd); + + /* manage i/o requests, device state */ + int (*urb_enqueue)(struct usb_hcd *hcd, + struct urb *urb);//, gfp_t mem_flags); + int (*urb_dequeue)(struct usb_hcd *hcd, + struct urb *urb, int status); + + /* + * (optional) these hooks allow an HCD to override the default DMA + * mapping and unmapping routines. In general, they shouldn't be + * necessary unless the host controller has special DMA requirements, + * such as alignment contraints. If these are not specified, the + * general usb_hcd_(un)?map_urb_for_dma functions will be used instead + * (and it may be a good idea to call these functions in your HCD + * implementation) + */ + #if 0 + int (*map_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb, + gfp_t mem_flags); + void (*unmap_urb_for_dma)(struct usb_hcd *hcd, struct urb *urb); + #endif + /* hw synch, freeing endpoint resources that urb_dequeue can't */ + void (*endpoint_disable)(struct usb_hcd *hcd, + struct usb_host_endpoint *ep); + + /* (optional) reset any endpoint state such as sequence number + and current window */ + void (*endpoint_reset)(struct usb_hcd *hcd, + struct usb_host_endpoint *ep); + + /* root hub support */ + int (*hub_status_data) (struct usb_hcd *hcd, char *buf); + int (*hub_control) (struct usb_hcd *hcd, + u16 typeReq, u16 wValue, u16 wIndex, + char *buf, u16 wLength); + #if 0 + int (*bus_suspend)(struct usb_hcd *); + int (*bus_resume)(struct usb_hcd *); + int (*start_port_reset)(struct usb_hcd *, unsigned port_num); + + /* force handover of high-speed port to full-speed companion */ + void (*relinquish_port)(struct usb_hcd *, int); + /* has a port been handed over to a companion? */ + int (*port_handed_over)(struct usb_hcd *, int); + + /* CLEAR_TT_BUFFER completion callback */ + void (*clear_tt_buffer_complete)(struct usb_hcd *, + struct usb_host_endpoint *); + + /* xHCI specific functions */ + /* Called by usb_alloc_dev to alloc HC device structures */ + int (*alloc_dev)(struct usb_hcd *, struct usb_device *); + /* Called by usb_disconnect to free HC device structures */ + void (*free_dev)(struct usb_hcd *, struct usb_device *); + /* Change a group of bulk endpoints to support multiple stream IDs */ + int (*alloc_streams)(struct usb_hcd *hcd, struct usb_device *udev, + struct usb_host_endpoint **eps, unsigned int num_eps, + unsigned int num_streams, gfp_t mem_flags); + /* Reverts a group of bulk endpoints back to not using stream IDs. + * Can fail if we run out of memory. + */ + int (*free_streams)(struct usb_hcd *hcd, struct usb_device *udev, + struct usb_host_endpoint **eps, unsigned int num_eps, + gfp_t mem_flags); + + /* Bandwidth computation functions */ + /* Note that add_endpoint() can only be called once per endpoint before + * check_bandwidth() or reset_bandwidth() must be called. + * drop_endpoint() can only be called once per endpoint also. + * A call to xhci_drop_endpoint() followed by a call to + * xhci_add_endpoint() will add the endpoint to the schedule with + * possibly new parameters denoted by a different endpoint descriptor + * in usb_host_endpoint. A call to xhci_add_endpoint() followed by a + * call to xhci_drop_endpoint() is not allowed. + */ + /* Allocate endpoint resources and add them to a new schedule */ + int (*add_endpoint)(struct usb_hcd *, struct usb_device *, + struct usb_host_endpoint *); + /* Drop an endpoint from a new schedule */ + int (*drop_endpoint)(struct usb_hcd *, struct usb_device *, + struct usb_host_endpoint *); + /* Check that a new hardware configuration, set using + * endpoint_enable and endpoint_disable, does not exceed bus + * bandwidth. This must be called before any set configuration + * or set interface requests are sent to the device. + */ + int (*check_bandwidth)(struct usb_hcd *, struct usb_device *); + /* Reset the device schedule to the last known good schedule, + * which was set from a previous successful call to + * check_bandwidth(). This reverts any add_endpoint() and + * drop_endpoint() calls since that last successful call. + * Used for when a check_bandwidth() call fails due to resource + * or bandwidth constraints. + */ + void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); + /* Returns the hardware-chosen device address */ + int (*address_device)(struct usb_hcd *, struct usb_device *udev); + /* Notifies the HCD after a hub descriptor is fetched. + * Will block. + */ + int (*update_hub_device)(struct usb_hcd *, struct usb_device *hdev, + struct usb_tt *tt, gfp_t mem_flags); + int (*reset_device)(struct usb_hcd *, struct usb_device *); + /* Notifies the HCD after a device is connected and its + * address is set + */ + int (*update_device)(struct usb_hcd *, struct usb_device *); + int (*set_usb2_hw_lpm)(struct usb_hcd *, struct usb_device *, int); + /* USB 3.0 Link Power Management */ + /* Returns the USB3 hub-encoded value for the U1/U2 timeout. */ + int (*enable_usb3_lpm_timeout)(struct usb_hcd *, + struct usb_device *, enum usb3_link_state state); + /* The xHCI host controller can still fail the command to + * disable the LPM timeouts, so this can return an error code. + */ + int (*disable_usb3_lpm_timeout)(struct usb_hcd *, + struct usb_device *, enum usb3_link_state state); + int (*find_raw_port_number)(struct usb_hcd *, int); + #endif +}; + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/rtl8195a_otg.h b/lib/fwlib/ram_lib/usb_otg/include/rtl8195a_otg.h new file mode 100644 index 0000000..ec8e7ec --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/rtl8195a_otg.h @@ -0,0 +1,99 @@ + +#ifndef _RTL8195A_OTG_H_ +#define _RTL8195A_OTG_H_ + +#include "dwc_otg_core_if.h" +#include "rtl8195a.h" + +#define HAL_OTG_READ32(addr) HAL_READ32(USB_OTG_REG_BASE, (u32)addr) +#define HAL_OTG_WRITE32(addr, value) HAL_WRITE32(USB_OTG_REG_BASE, (u32)addr, value) + +#define HAL_OTG_MODIFY32(addr, clrmsk, setmsk) HAL_WRITE32(USB_OTG_REG_BASE,(u32)addr,\ + ((HAL_READ32(USB_OTG_REG_BASE, (u32)addr) & (~clrmsk)) | setmsk)) + +#define DWC_READ_REG32(_reg_) HAL_OTG_READ32((u32)_reg_) +#define DWC_WRITE_REG32(_reg_, _val_) HAL_OTG_WRITE32((u32)_reg_,_val_) +#define DWC_MODIFY_REG32(_reg_,_cmsk_,_smsk_) HAL_OTG_MODIFY32((u32)_reg_,_cmsk_,_smsk_) + + +//This part is added for RTK power sequence +#if 1 +//3 SYS_ON reg + +//#define REG_SYS_FUNC_EN 0x08 +#define BIT_SHIFT_SOC_SYSPEON_EN 4 +#define BIT_MASK_SOC_SYSPEON_EN 0x1 +#define BIT_SOC_SYSPEON_EN_OTG(x)(((x) & BIT_MASK_SOC_SYSPEON_EN) << BIT_SHIFT_SOC_SYSPEON_EN) +#define BIT_INVC_SOC_SYSPEON_EN (~(BIT_MASK_SOC_SYSPEON_EN << BIT_SHIFT_SOC_SYSPEON_EN)) + + +//3 Peri_ON reg +#define REG_OTG_PWCSEQ_OFFSET_OTG 0x40000000 +#define REG_OTG_PWCSEQ_PWC_OTG 0x200 +#define REG_OTG_PWCSEQ_ISO_OTG 0x204 +#define REG_SOC_HCI_COM_FUNC_EN_OTG 0x214 +#define REG_PESOC_HCI_CLK_CTRL0_OTG 0x240 +#endif + +//#define REG_PON_ISO_CTRL 0x204 + + +#define REG_OTG_PWCSEQ_IP_OFF 0x30004 //This is in OTG IP + +//4 REG_OTG_PWCSEQ_PWC +#define BIT_SHIFT_PWC_USBD_EN 0 +#define BIT_MASK_PWC_USBD_EN 0x1 +#define BIT_PWC_USBD_EN(x)(((x) & BIT_MASK_PWC_USBD_EN) << BIT_SHIFT_PWC_USBD_EN) +#define BIT_INVC_PWC_USBD_EN (~(BIT_MASK_PWC_USBD_EN << BIT_SHIFT_PWC_USBD_EN)) + +#define BIT_SHIFT_PWC_UPLV_EN 1 +#define BIT_MASK_PWC_UPLV_EN 0x1 +#define BIT_PWC_UPLV_EN(x)(((x) & BIT_MASK_PWC_UPLV_EN) << BIT_SHIFT_PWC_UPLV_EN) +#define BIT_INVC_PWC_UPLV_EN (~(BIT_MASK_PWC_UPLV_EN << BIT_SHIFT_PWC_UPLV_EN)) + +#define BIT_SHIFT_PWC_UPHV_EN 2 +#define BIT_MASK_PWC_UPHV_EN 0x1 +#define BIT_PWC_UPHV_EN(x)(((x) & BIT_MASK_PWC_UPHV_EN) << BIT_SHIFT_PWC_UPHV_EN) +#define BIT_INVC_PWC_UPHV_EN (~(BIT_MASK_PWC_UPHV_EN << BIT_SHIFT_PWC_UPHV_EN)) + +//4 REG_OTG_PWCSEQ_ISO +#define BIT_SHIFT_ISO_USBD_EN 0 +#define BIT_MASK_ISO_USBD_EN 0x1 +#define BIT_ISO_USBD_EN(x)(((x) & BIT_MASK_ISO_USBD_EN) << BIT_SHIFT_ISO_USBD_EN) +#define BIT_INVC_ISO_USBD_EN (~(BIT_MASK_ISO_USBD_EN << BIT_SHIFT_ISO_USBD_EN)) + +#define BIT_SHIFT_ISO_USBA_EN 1 +#define BIT_MASK_ISO_USBA_EN 0x1 +#define BIT_ISO_USBA_EN(x)(((x) & BIT_MASK_ISO_USBA_EN) << BIT_SHIFT_ISO_USBA_EN) +#define BIT_INVC_ISO_USBA_EN (~(BIT_MASK_ISO_USBA_EN << BIT_SHIFT_ISO_USBA_EN)) + +//4 REG_SOC_HCI_COM_FUNC_EN +#define BIT_SHIFT_SOC_HCI_OTG_EN 4 +#define BIT_MASK_SOC_HCI_OTG_EN 0x1 +#define BIT_SOC_HCI_OTG_EN_OTG(x)(((x) & BIT_MASK_SOC_HCI_OTG_EN) << BIT_SHIFT_SOC_HCI_OTG_EN) +#define BIT_INVC_SOC_HCI_OTG_EN (~(BIT_MASK_SOC_HCI_OTG_EN << BIT_SHIFT_SOC_HCI_OTG_EN)) + +//4 REG_PESOC_HCI_CLK_CTRL0 +#define BIT_SHIFT_SOC_ACTCK_OTG_EN 4 +#define BIT_MASK_SOC_ACTCK_OTG_EN 0x1 +#define BIT_SOC_ACTCK_OTG_EN_OTG(x)(((x) & BIT_MASK_SOC_ACTCK_OTG_EN) << BIT_SHIFT_SOC_ACTCK_OTG_EN) +#define BIT_INVC_SOC_ACTCK_OTG_EN (~(BIT_MASK_SOC_ACTCK_OTG_EN << BIT_SHIFT_SOC_ACTCK_OTG_EN)) + + +//4 REG_OTG_PWCSEQ_OTG +#define BIT_SHIFT_UPLL_CKRDY 5 +#define BIT_MASK_UPLL_CKRDY 0x1 +#define BIT_UPLL_CKRDY(x)(((x) & BIT_MASK_UPLL_CKRDY) << BIT_SHIFT_UPLL_CKRDY) +#define BIT_INVC_UPLL_CKRDY (~(BIT_MASK_UPLL_CKRDY << BIT_SHIFT_UPLL_CKRDY)) + +#define BIT_SHIFT_USBOTG_EN 8 +#define BIT_MASK_USBOTG_EN 0x1 +#define BIT_USBOTG_EN(x)(((x) & BIT_MASK_USBOTG_EN) << BIT_SHIFT_USBOTG_EN) +#define BIT_INVC_USBOTG_EN (~(BIT_MASK_USBOTG_EN << BIT_SHIFT_USBOTG_EN)) + +#define BIT_SHIFT_USBPHY_EN 9 +#define BIT_MASK_USBPHY_EN 0x1 +#define BIT_USBPHY_EN(x)(((x) & BIT_MASK_USBPHY_EN) << BIT_SHIFT_USBPHY_EN) +#define BIT_INVC_USBPHY_EN (~(BIT_MASK_USBPHY_EN << BIT_SHIFT_USBPHY_EN)) + +#endif diff --git a/lib/fwlib/ram_lib/usb_otg/include/usb.h b/lib/fwlib/ram_lib/usb_otg/include/usb.h new file mode 100644 index 0000000..551e5d8 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/usb.h @@ -0,0 +1,2108 @@ +/* + * Copyright (c) 1998 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Lennart Augustsson (lennart@augustsson.net) at + * Carlstedt Research & Technology. + * + * 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. + */ + +/* Modified by Synopsys, Inc, 12/12/2007 */ + + +#ifndef _USB_H_ +#define _USB_H_ +#include "basic_types.h" +#include "osdep_service.h" +//#include "osdep_api.h" +#include "hal_util.h" + +#include "errno.h" +#include "diag.h" +#include "usb_ch9.h" +#include "usb_defs.h" + +/* + * The USB records contain some unaligned little-endian word + * components. The U[SG]ETW macros take care of both the alignment + * and endian problem and should always be used to access non-byte + * values. + */ +typedef u8 uByte; +typedef u8 uWord[2]; +typedef u8 uDWord[4]; + +#define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h)) +#define UCONSTW(x) { (x) & 0xff, ((x) >> 8) & 0xff } +#define UCONSTDW(x) { (x) & 0xff, ((x) >> 8) & 0xff, \ + ((x) >> 16) & 0xff, ((x) >> 24) & 0xff } + +#if 1 +#define UGETW(w) ((w)[0] | ((w)[1] << 8)) +#define USETW(w,v) ((w)[0] = (u_int8_t)(v), (w)[1] = (u_int8_t)((v) >> 8)) +#define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24)) +#define USETDW(w,v) ((w)[0] = (u_int8_t)(v), \ + (w)[1] = (u_int8_t)((v) >> 8), \ + (w)[2] = (u_int8_t)((v) >> 16), \ + (w)[3] = (u_int8_t)((v) >> 24)) +#else +/* + * On little-endian machines that can handle unanliged accesses + * (e.g. i386) these macros can be replaced by the following. + */ +#define UGETW(w) (*(u_int16_t *)(w)) +#define USETW(w,v) (*(u_int16_t *)(w) = (v)) +#define UGETDW(w) (*(u_int32_t *)(w)) +#define USETDW(w,v) (*(u_int32_t *)(w) = (v)) +#endif + +/* + * Macros for accessing UAS IU fields, which are big-endian + */ +#define IUSETW2(w,h,l) ((w)[0] = (u_int8_t)(h), (w)[1] = (u_int8_t)(l)) +#define IUCONSTW(x) { ((x) >> 8) & 0xff, (x) & 0xff } +#define IUCONSTDW(x) { ((x) >> 24) & 0xff, ((x) >> 16) & 0xff, \ + ((x) >> 8) & 0xff, (x) & 0xff } +#define IUGETW(w) (((w)[0] << 8) | (w)[1]) +#define IUSETW(w,v) ((w)[0] = (u_int8_t)((v) >> 8), (w)[1] = (u_int8_t)(v)) +#define IUGETDW(w) (((w)[0] << 24) | ((w)[1] << 16) | ((w)[2] << 8) | (w)[3]) +#define IUSETDW(w,v) ((w)[0] = (u_int8_t)((v) >> 24), \ + (w)[1] = (u_int8_t)((v) >> 16), \ + (w)[2] = (u_int8_t)((v) >> 8), \ + (w)[3] = (u_int8_t)(v)) + +//#define UPACKED __attribute__((__packed__)) +#define UPACKED +typedef struct { + uByte bmRequestType; + uByte bRequest; + uWord wValue; + uWord wIndex; + uWord wLength; +} UPACKED usb_device_request_t; + +#define UT_GET_DIR(a) ((a) & 0x80) +#define UT_WRITE 0x00 +#define UT_READ 0x80 + +#define UT_GET_TYPE(a) ((a) & 0x60) +#define UT_STANDARD 0x00 +#define UT_CLASS 0x20 +#define UT_VENDOR 0x40 + +#define UT_GET_RECIPIENT(a) ((a) & 0x1f) +#define UT_DEVICE 0x00 +#define UT_INTERFACE 0x01 +#define UT_ENDPOINT 0x02 +#define UT_OTHER 0x03 + +#define UT_READ_DEVICE (UT_READ | UT_STANDARD | UT_DEVICE) +#define UT_READ_INTERFACE (UT_READ | UT_STANDARD | UT_INTERFACE) +#define UT_READ_ENDPOINT (UT_READ | UT_STANDARD | UT_ENDPOINT) +#define UT_WRITE_DEVICE (UT_WRITE | UT_STANDARD | UT_DEVICE) +#define UT_WRITE_INTERFACE (UT_WRITE | UT_STANDARD | UT_INTERFACE) +#define UT_WRITE_ENDPOINT (UT_WRITE | UT_STANDARD | UT_ENDPOINT) +#define UT_READ_CLASS_DEVICE (UT_READ | UT_CLASS | UT_DEVICE) +#define UT_READ_CLASS_INTERFACE (UT_READ | UT_CLASS | UT_INTERFACE) +#define UT_READ_CLASS_OTHER (UT_READ | UT_CLASS | UT_OTHER) +#define UT_READ_CLASS_ENDPOINT (UT_READ | UT_CLASS | UT_ENDPOINT) +#define UT_WRITE_CLASS_DEVICE (UT_WRITE | UT_CLASS | UT_DEVICE) +#define UT_WRITE_CLASS_INTERFACE (UT_WRITE | UT_CLASS | UT_INTERFACE) +#define UT_WRITE_CLASS_OTHER (UT_WRITE | UT_CLASS | UT_OTHER) +#define UT_WRITE_CLASS_ENDPOINT (UT_WRITE | UT_CLASS | UT_ENDPOINT) +#define UT_READ_VENDOR_DEVICE (UT_READ | UT_VENDOR | UT_DEVICE) +#define UT_READ_VENDOR_INTERFACE (UT_READ | UT_VENDOR | UT_INTERFACE) +#define UT_READ_VENDOR_OTHER (UT_READ | UT_VENDOR | UT_OTHER) +#define UT_READ_VENDOR_ENDPOINT (UT_READ | UT_VENDOR | UT_ENDPOINT) +#define UT_WRITE_VENDOR_DEVICE (UT_WRITE | UT_VENDOR | UT_DEVICE) +#define UT_WRITE_VENDOR_INTERFACE (UT_WRITE | UT_VENDOR | UT_INTERFACE) +#define UT_WRITE_VENDOR_OTHER (UT_WRITE | UT_VENDOR | UT_OTHER) +#define UT_WRITE_VENDOR_ENDPOINT (UT_WRITE | UT_VENDOR | UT_ENDPOINT) + +/* Requests */ +#define UR_GET_STATUS 0x00 +#define USTAT_STANDARD_STATUS 0x00 +#define WUSTAT_WUSB_FEATURE 0x01 +#define WUSTAT_CHANNEL_INFO 0x02 +#define WUSTAT_RECEIVED_DATA 0x03 +#define WUSTAT_MAS_AVAILABILITY 0x04 +#define WUSTAT_CURRENT_TRANSMIT_POWER 0x05 +#define UR_CLEAR_FEATURE 0x01 +#define UR_SET_FEATURE 0x03 +#define UR_SET_AND_TEST_FEATURE 0x0c +#define UR_SET_ADDRESS 0x05 +#define UR_GET_DESCRIPTOR 0x06 +#define UDESC_DEVICE 0x01 +#define UDESC_CONFIG 0x02 +#define UDESC_STRING 0x03 +#define UDESC_INTERFACE 0x04 +#define UDESC_ENDPOINT 0x05 +#define UDESC_SS_USB_COMPANION 0x30 +#define UDESC_DEVICE_QUALIFIER 0x06 +#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 +#define UDESC_INTERFACE_POWER 0x08 +#define UDESC_OTG 0x09 +#define WUDESC_SECURITY 0x0c +#define WUDESC_KEY 0x0d +#define WUD_GET_KEY_INDEX(_wValue_) ((_wValue_) & 0xf) +#define WUD_GET_KEY_TYPE(_wValue_) (((_wValue_) & 0x30) >> 4) +#define WUD_KEY_TYPE_ASSOC 0x01 +#define WUD_KEY_TYPE_GTK 0x02 +#define WUD_GET_KEY_ORIGIN(_wValue_) (((_wValue_) & 0x40) >> 6) +#define WUD_KEY_ORIGIN_HOST 0x00 +#define WUD_KEY_ORIGIN_DEVICE 0x01 +#define WUDESC_ENCRYPTION_TYPE 0x0e +#define WUDESC_BOS 0x0f +#define WUDESC_DEVICE_CAPABILITY 0x10 +#define WUDESC_WIRELESS_ENDPOINT_COMPANION 0x11 +#define UDESC_BOS 0x0f +#define UDESC_DEVICE_CAPABILITY 0x10 +#define UDESC_CS_DEVICE 0x21 /* class specific */ +#define UDESC_CS_CONFIG 0x22 +#define UDESC_CS_STRING 0x23 +#define UDESC_CS_INTERFACE 0x24 +#define UDESC_CS_ENDPOINT 0x25 +#define UDESC_HUB 0x29 +#define UR_SET_DESCRIPTOR 0x07 +#define UR_GET_CONFIG 0x08 +#define UR_SET_CONFIG 0x09 +#define UR_GET_INTERFACE 0x0a +#define UR_SET_INTERFACE 0x0b +#define UR_SYNCH_FRAME 0x0c +#define WUR_SET_ENCRYPTION 0x0d +#define WUR_GET_ENCRYPTION 0x0e +#define WUR_SET_HANDSHAKE 0x0f +#define WUR_GET_HANDSHAKE 0x10 +#define WUR_SET_CONNECTION 0x11 +#define WUR_SET_SECURITY_DATA 0x12 +#define WUR_GET_SECURITY_DATA 0x13 +#define WUR_SET_WUSB_DATA 0x14 +#define WUDATA_DRPIE_INFO 0x01 +#define WUDATA_TRANSMIT_DATA 0x02 +#define WUDATA_TRANSMIT_PARAMS 0x03 +#define WUDATA_RECEIVE_PARAMS 0x04 +#define WUDATA_TRANSMIT_POWER 0x05 +#define WUR_LOOPBACK_DATA_WRITE 0x15 +#define WUR_LOOPBACK_DATA_READ 0x16 +#define WUR_SET_INTERFACE_DS 0x17 + +/* Feature numbers */ +#define UF_ENDPOINT_HALT 0 +#define UF_DEVICE_REMOTE_WAKEUP 1 +#define UF_TEST_MODE 2 +#define UF_DEVICE_B_HNP_ENABLE 3 +#define UF_DEVICE_A_HNP_SUPPORT 4 +#define UF_DEVICE_A_ALT_HNP_SUPPORT 5 +#define WUF_WUSB 3 +#define WUF_TX_DRPIE 0x0 +#define WUF_DEV_XMIT_PACKET 0x1 +#define WUF_COUNT_PACKETS 0x2 +#define WUF_CAPTURE_PACKETS 0x3 +#define UF_FUNCTION_SUSPEND 0 +#define UF_U1_ENABLE 48 +#define UF_U2_ENABLE 49 +#define UF_LTM_ENABLE 50 + +/* Class requests from the USB 2.0 hub spec, table 11-15 */ +#define UCR_CLEAR_HUB_FEATURE (0x2000 | UR_CLEAR_FEATURE) +#define UCR_CLEAR_PORT_FEATURE (0x2300 | UR_CLEAR_FEATURE) +#define UCR_GET_HUB_DESCRIPTOR (0xa000 | UR_GET_DESCRIPTOR) +#define UCR_GET_HUB_STATUS (0xa000 | UR_GET_STATUS) +#define UCR_GET_PORT_STATUS (0xa300 | UR_GET_STATUS) +#define UCR_SET_HUB_FEATURE (0x2000 | UR_SET_FEATURE) +#define UCR_SET_PORT_FEATURE (0x2300 | UR_SET_FEATURE) +#define UCR_SET_AND_TEST_PORT_FEATURE (0xa300 | UR_SET_AND_TEST_FEATURE) + + + + + + + + +#define USB_MAX_STRING_LEN 128 +#define USB_LANGUAGE_TABLE 0 /* # of the string language id table */ + +/* Hub specific request */ +#define UR_GET_BUS_STATE 0x02 +#define UR_CLEAR_TT_BUFFER 0x08 +#define UR_RESET_TT 0x09 +#define UR_GET_TT_STATE 0x0a +#define UR_STOP_TT 0x0b + +/* Hub features */ +#define UHF_C_HUB_LOCAL_POWER 0 +#define UHF_C_HUB_OVER_CURRENT 1 +#define UHF_PORT_CONNECTION 0 +#define UHF_PORT_ENABLE 1 +#define UHF_PORT_SUSPEND 2 +#define UHF_PORT_OVER_CURRENT 3 +#define UHF_PORT_RESET 4 +#define UHF_PORT_L1 5 +#define UHF_PORT_POWER 8 +#define UHF_PORT_LOW_SPEED 9 +#define UHF_PORT_HIGH_SPEED 10 +#define UHF_C_PORT_CONNECTION 16 +#define UHF_C_PORT_ENABLE 17 +#define UHF_C_PORT_SUSPEND 18 +#define UHF_C_PORT_OVER_CURRENT 19 +#define UHF_C_PORT_RESET 20 +#define UHF_C_PORT_L1 23 +#define UHF_PORT_TEST 21 +#define UHF_PORT_INDICATOR 22 + + + + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uWord bcdUSB; + uByte bDeviceClass; + uByte bDeviceSubClass; + uByte bDeviceProtocol; + uByte bMaxPacketSize0; + uByte bNumConfigurations; + uByte bReserved; +} UPACKED usb_device_qualifier_t; +#define USB_DEVICE_QUALIFIER_SIZE 10 + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bmAttributes; +#define UOTG_SRP 0x01 +#define UOTG_HNP 0x02 +} UPACKED usb_otg_descriptor_t; + +/* OTG feature selectors */ +#define UOTG_B_HNP_ENABLE 3 +#define UOTG_A_HNP_SUPPORT 4 +#define UOTG_A_ALT_HNP_SUPPORT 5 + +typedef struct { + uWord wStatus; +/* Device status flags */ +#define UDS_SELF_POWERED 0x0001 +#define UDS_REMOTE_WAKEUP 0x0002 +/* Endpoint status flags */ +#define UES_HALT 0x0001 +} UPACKED usb_status_t; + +typedef struct { + uWord wHubStatus; +#define UHS_LOCAL_POWER 0x0001 +#define UHS_OVER_CURRENT 0x0002 + uWord wHubChange; +} UPACKED usb_hub_status_t; + +typedef struct { + uWord wPortStatus; +#define UPS_CURRENT_CONNECT_STATUS 0x0001 +#define UPS_PORT_ENABLED 0x0002 +#define UPS_SUSPEND 0x0004 +#define UPS_OVERCURRENT_INDICATOR 0x0008 +#define UPS_RESET 0x0010 +#define UPS_PORT_POWER 0x0100 +#define UPS_LOW_SPEED 0x0200 +#define UPS_HIGH_SPEED 0x0400 +#define UPS_PORT_TEST 0x0800 +#define UPS_PORT_INDICATOR 0x1000 + uWord wPortChange; +#define UPS_C_CONNECT_STATUS 0x0001 +#define UPS_C_PORT_ENABLED 0x0002 +#define UPS_C_SUSPEND 0x0004 +#define UPS_C_OVERCURRENT_INDICATOR 0x0008 +#define UPS_C_PORT_RESET 0x0010 +} UPACKED usb_port_status_t; + + +/* Device class codes */ +#define UDCLASS_IN_INTERFACE 0x00 +#define UDCLASS_COMM 0x02 +#define UDCLASS_HUB 0x09 +#define UDSUBCLASS_HUB 0x00 +#define UDPROTO_FSHUB 0x00 +#define UDPROTO_HSHUBSTT 0x01 +#define UDPROTO_HSHUBMTT 0x02 +#define UDCLASS_DIAGNOSTIC 0xdc +#define UDCLASS_WIRELESS 0xe0 +#define UDSUBCLASS_RF 0x01 +#define UDPROTO_BLUETOOTH 0x01 +#define UDCLASS_VENDOR 0xff + +/* Interface class codes */ +#define UICLASS_UNSPEC 0x00 + +#define UICLASS_AUDIO 0x01 +#define UISUBCLASS_AUDIOCONTROL 1 +#define UISUBCLASS_AUDIOSTREAM 2 +#define UISUBCLASS_MIDISTREAM 3 + +#define UICLASS_CDC 0x02 /* communication */ +#define UISUBCLASS_DIRECT_LINE_CONTROL_MODEL 1 +#define UISUBCLASS_ABSTRACT_CONTROL_MODEL 2 +#define UISUBCLASS_TELEPHONE_CONTROL_MODEL 3 +#define UISUBCLASS_MULTICHANNEL_CONTROL_MODEL 4 +#define UISUBCLASS_CAPI_CONTROLMODEL 5 +#define UISUBCLASS_ETHERNET_NETWORKING_CONTROL_MODEL 6 +#define UISUBCLASS_ATM_NETWORKING_CONTROL_MODEL 7 +#define UIPROTO_CDC_AT 1 + +#define UICLASS_HID 0x03 +#define UISUBCLASS_BOOT 1 +#define UIPROTO_BOOT_KEYBOARD 1 + +#define UICLASS_PHYSICAL 0x05 + +#define UICLASS_IMAGE 0x06 + +#define UICLASS_PRINTER 0x07 +#define UISUBCLASS_PRINTER 1 +#define UIPROTO_PRINTER_UNI 1 +#define UIPROTO_PRINTER_BI 2 +#define UIPROTO_PRINTER_1284 3 + +#define UICLASS_MASS 0x08 +#define UISUBCLASS_RBC 1 +#define UISUBCLASS_SFF8020I 2 +#define UISUBCLASS_QIC157 3 +#define UISUBCLASS_UFI 4 +#define UISUBCLASS_SFF8070I 5 +#define UISUBCLASS_SCSI 6 +#define UIPROTO_MASS_CBI_I 0 +#define UIPROTO_MASS_CBI 1 +#define UIPROTO_MASS_BBB_OLD 2 /* Not in the spec anymore */ +#define UIPROTO_MASS_BBB 80 /* 'P' for the Iomega Zip drive */ + +#define UICLASS_HUB 0x09 +#define UISUBCLASS_HUB 0 +#define UIPROTO_FSHUB 0 +#define UIPROTO_HSHUBSTT 0 /* Yes, same as previous */ +#define UIPROTO_HSHUBMTT 1 + +#define UICLASS_CDC_DATA 0x0a +#define UISUBCLASS_DATA 0 +#define UIPROTO_DATA_ISDNBRI 0x30 /* Physical iface */ +#define UIPROTO_DATA_HDLC 0x31 /* HDLC */ +#define UIPROTO_DATA_TRANSPARENT 0x32 /* Transparent */ +#define UIPROTO_DATA_Q921M 0x50 /* Management for Q921 */ +#define UIPROTO_DATA_Q921 0x51 /* Data for Q921 */ +#define UIPROTO_DATA_Q921TM 0x52 /* TEI multiplexer for Q921 */ +#define UIPROTO_DATA_V42BIS 0x90 /* Data compression */ +#define UIPROTO_DATA_Q931 0x91 /* Euro-ISDN */ +#define UIPROTO_DATA_V120 0x92 /* V.24 rate adaption */ +#define UIPROTO_DATA_CAPI 0x93 /* CAPI 2.0 commands */ +#define UIPROTO_DATA_HOST_BASED 0xfd /* Host based driver */ +#define UIPROTO_DATA_PUF 0xfe /* see Prot. Unit Func. Desc.*/ +#define UIPROTO_DATA_VENDOR 0xff /* Vendor specific */ + +#define UICLASS_SMARTCARD 0x0b + +/*#define UICLASS_FIRM_UPD 0x0c*/ + +#define UICLASS_SECURITY 0x0d + +#define UICLASS_DIAGNOSTIC 0xdc + +#define UICLASS_WIRELESS 0xe0 +#define UISUBCLASS_RF 0x01 +#define UIPROTO_BLUETOOTH 0x01 + +#define UICLASS_APPL_SPEC 0xfe +#define UISUBCLASS_FIRMWARE_DOWNLOAD 1 +#define UISUBCLASS_IRDA 2 +#define UIPROTO_IRDA 0 + +#define UICLASS_VENDOR 0xff + +#define USB_HUB_MAX_DEPTH 5 + +/* + * Minimum time a device needs to be powered down to go through + * a power cycle. XXX Are these time in the spec? + */ +#define USB_POWER_DOWN_TIME 200 /* ms */ +#define USB_PORT_POWER_DOWN_TIME 100 /* ms */ + +#if 0 +/* These are the values from the spec. */ +#define USB_PORT_RESET_DELAY 10 /* ms */ +#define USB_PORT_ROOT_RESET_DELAY 50 /* ms */ +#define USB_PORT_RESET_RECOVERY 10 /* ms */ +#define USB_PORT_POWERUP_DELAY 100 /* ms */ +#define USB_SET_ADDRESS_SETTLE 2 /* ms */ +#define USB_RESUME_DELAY (20*5) /* ms */ +#define USB_RESUME_WAIT 10 /* ms */ +#define USB_RESUME_RECOVERY 10 /* ms */ +#define USB_EXTRA_POWER_UP_TIME 0 /* ms */ +#else +/* Allow for marginal (i.e. non-conforming) devices. */ +#define USB_PORT_RESET_DELAY 50 /* ms */ +#define USB_PORT_ROOT_RESET_DELAY 250 /* ms */ +#define USB_PORT_RESET_RECOVERY 250 /* ms */ +#define USB_PORT_POWERUP_DELAY 300 /* ms */ +#define USB_SET_ADDRESS_SETTLE 10 /* ms */ +#define USB_RESUME_DELAY (50*5) /* ms */ +#define USB_RESUME_WAIT 50 /* ms */ +#define USB_RESUME_RECOVERY 50 /* ms */ +#define USB_EXTRA_POWER_UP_TIME 20 /* ms */ +#endif + +#define USB_MIN_POWER 100 /* mA */ +#define USB_MAX_POWER 500 /* mA */ + +#define USB_BUS_RESET_DELAY 100 /* ms XXX?*/ + +#define USB_UNCONFIG_NO 0 +#define USB_UNCONFIG_INDEX (-1) + +/*** ioctl() related stuff ***/ + +struct usb_ctl_request { + int ucr_addr; + usb_device_request_t ucr_request; + void *ucr_data; + int ucr_flags; +#define USBD_SHORT_XFER_OK 0x04 /* allow short reads */ + int ucr_actlen; /* actual length transferred */ +}; + +struct usb_alt_interface { + int uai_config_index; + int uai_interface_index; + int uai_alt_no; +}; + +#define USB_CURRENT_CONFIG_INDEX (-1) +#define USB_CURRENT_ALT_INDEX (-1) + + + +struct usb_full_desc { + int ufd_config_index; + u16 ufd_size; + u8 *ufd_data; +}; + + +struct usb_ctl_report_desc { + int ucrd_size; + u8 ucrd_data[1024]; /* filled data size will vary */ +}; + +typedef struct { u32 cookie; } usb_event_cookie_t; + +#define USB_MAX_DEVNAMES 4 +#define USB_MAX_DEVNAMELEN 16 +struct usb_device_info { + u8 udi_bus; + u8 udi_addr; /* device address */ + usb_event_cookie_t udi_cookie; + char udi_product[USB_MAX_STRING_LEN]; + char udi_vendor[USB_MAX_STRING_LEN]; + char udi_release[8]; + u16 udi_productNo; + u16 udi_vendorNo; + u16 udi_releaseNo; + u8 udi_class; + u8 udi_subclass; + u8 udi_protocol; + u8 udi_config; + u8 udi_speed; +#if 0 +#define USB_SPEED_UNKNOWN 0 +#define USB_SPEED_LOW 1 +#define USB_SPEED_FULL 2 +#define USB_SPEED_HIGH 3 +#define USB_SPEED_VARIABLE 4 +#define USB_SPEED_SUPER 5 +#endif + int udi_power; /* power consumption in mA, 0 if selfpowered */ + int udi_nports; + char udi_devnames[USB_MAX_DEVNAMES][USB_MAX_DEVNAMELEN]; + u8 udi_ports[16];/* hub only: addresses of devices on ports */ +#define USB_PORT_ENABLED 0xff +#define USB_PORT_SUSPENDED 0xfe +#define USB_PORT_POWERED 0xfd +#define USB_PORT_DISABLED 0xfc +}; + +struct usb_ctl_report { + int ucr_report; + u8 ucr_data[1024]; /* filled data size will vary */ +}; + +struct usb_device_stats { + u32 uds_requests[4]; /* indexed by transfer type UE_* */ +}; + +#define WUSB_MIN_IE 0x80 +#define WUSB_WCTA_IE 0x80 +#define WUSB_WCONNECTACK_IE 0x81 +#define WUSB_WHOSTINFO_IE 0x82 +#define WUHI_GET_CA(_bmAttributes_) ((_bmAttributes_) & 0x3) +#define WUHI_CA_RECONN 0x00 +#define WUHI_CA_LIMITED 0x01 +#define WUHI_CA_ALL 0x03 +#define WUHI_GET_MLSI(_bmAttributes_) (((_bmAttributes_) & 0x38) >> 3) +#define WUSB_WCHCHANGEANNOUNCE_IE 0x83 +#define WUSB_WDEV_DISCONNECT_IE 0x84 +#define WUSB_WHOST_DISCONNECT_IE 0x85 +#define WUSB_WRELEASE_CHANNEL_IE 0x86 +#define WUSB_WWORK_IE 0x87 +#define WUSB_WCHANNEL_STOP_IE 0x88 +#define WUSB_WDEV_KEEPALIVE_IE 0x89 +#define WUSB_WISOCH_DISCARD_IE 0x8A +#define WUSB_WRESETDEVICE_IE 0x8B +#define WUSB_WXMIT_PACKET_ADJUST_IE 0x8C +#define WUSB_MAX_IE 0x8C + +/* Device Notification Types */ + +#define WUSB_DN_MIN 0x01 +#define WUSB_DN_CONNECT 0x01 +# define WUSB_DA_OLDCONN 0x00 +# define WUSB_DA_NEWCONN 0x01 +# define WUSB_DA_SELF_BEACON 0x02 +# define WUSB_DA_DIR_BEACON 0x04 +# define WUSB_DA_NO_BEACON 0x06 +#define WUSB_DN_DISCONNECT 0x02 +#define WUSB_DN_EPRDY 0x03 +#define WUSB_DN_MASAVAILCHANGED 0x04 +#define WUSB_DN_REMOTEWAKEUP 0x05 +#define WUSB_DN_SLEEP 0x06 +#define WUSB_DN_ALIVE 0x07 +#define WUSB_DN_MAX 0x07 + + +/* WUSB Handshake Data. Used during the SET/GET HANDSHAKE requests */ +typedef struct wusb_hndshk_data { + uByte bMessageNumber; + uByte bStatus; + uByte tTKID[3]; + uByte bReserved; + uByte CDID[16]; + uByte Nonce[16]; + uByte MIC[8]; +} UPACKED wusb_hndshk_data_t; +#define WUSB_HANDSHAKE_LEN_FOR_MIC 38 + +/* WUSB Connection Context */ +typedef struct wusb_conn_context { + uByte CHID [16]; + uByte CDID [16]; + uByte CK [16]; +} UPACKED wusb_conn_context_t; + +/* WUSB Security Descriptor */ +typedef struct wusb_security_desc { + uByte bLength; + uByte bDescriptorType; + uWord wTotalLength; + uByte bNumEncryptionTypes; +} UPACKED wusb_security_desc_t; + +/* WUSB Encryption Type Descriptor */ +typedef struct wusb_encrypt_type_desc { + uByte bLength; + uByte bDescriptorType; + + uByte bEncryptionType; +#define WUETD_UNSECURE 0 +#define WUETD_WIRED 1 +#define WUETD_CCM_1 2 +#define WUETD_RSA_1 3 + + uByte bEncryptionValue; + uByte bAuthKeyIndex; +} UPACKED wusb_encrypt_type_desc_t; + +/* WUSB Key Descriptor */ +typedef struct wusb_key_desc { + uByte bLength; + uByte bDescriptorType; + uByte tTKID[3]; + uByte bReserved; + uByte KeyData[1]; /* variable length */ +} UPACKED wusb_key_desc_t; + +/* WUSB BOS Descriptor (Binary device Object Store) */ +typedef struct wusb_bos_desc { + uByte bLength; + uByte bDescriptorType; + uWord wTotalLength; + uByte bNumDeviceCaps; +} UPACKED wusb_bos_desc_t; + +#define USB_DEVICE_CAPABILITY_20_EXTENSION 0x02 +typedef struct usb_dev_cap_20_ext_desc { + uByte bLength; + uByte bDescriptorType; + uByte bDevCapabilityType; +#define USB_20_EXT_LPM 0x02 + uDWord bmAttributes; +} UPACKED usb_dev_cap_20_ext_desc_t; + +#define USB_DEVICE_CAPABILITY_SS_USB 0x03 +typedef struct usb_dev_cap_ss_usb { + uByte bLength; + uByte bDescriptorType; + uByte bDevCapabilityType; +#define USB_DC_SS_USB_LTM_CAPABLE 0x02 + uByte bmAttributes; +#define USB_DC_SS_USB_SPEED_SUPPORT_LOW 0x01 +#define USB_DC_SS_USB_SPEED_SUPPORT_FULL 0x02 +#define USB_DC_SS_USB_SPEED_SUPPORT_HIGH 0x04 +#define USB_DC_SS_USB_SPEED_SUPPORT_SS 0x08 + uWord wSpeedsSupported; + uByte bFunctionalitySupport; + uByte bU1DevExitLat; + uWord wU2DevExitLat; +} UPACKED usb_dev_cap_ss_usb_t; + +#define USB_DEVICE_CAPABILITY_CONTAINER_ID 0x04 +typedef struct usb_dev_cap_container_id { + uByte bLength; + uByte bDescriptorType; + uByte bDevCapabilityType; + uByte bReserved; + uByte containerID[16]; +} UPACKED usb_dev_cap_container_id_t; + +/* Device Capability Type Codes */ +#define WUSB_DEVICE_CAPABILITY_WIRELESS_USB 0x01 + +/* Device Capability Descriptor */ +typedef struct wusb_dev_cap_desc { + uByte bLength; + uByte bDescriptorType; + uByte bDevCapabilityType; + uByte caps[1]; /* Variable length */ +} UPACKED wusb_dev_cap_desc_t; + +/* Device Capability Descriptor */ +typedef struct wusb_dev_cap_uwb_desc { + uByte bLength; + uByte bDescriptorType; + uByte bDevCapabilityType; + uByte bmAttributes; + uWord wPHYRates; /* Bitmap */ + uByte bmTFITXPowerInfo; + uByte bmFFITXPowerInfo; + uWord bmBandGroup; + uByte bReserved; +} UPACKED wusb_dev_cap_uwb_desc_t; + +/* Wireless USB Endpoint Companion Descriptor */ +typedef struct wusb_endpoint_companion_desc { + uByte bLength; + uByte bDescriptorType; + uByte bMaxBurst; + uByte bMaxSequence; + uWord wMaxStreamDelay; + uWord wOverTheAirPacketSize; + uByte bOverTheAirInterval; + uByte bmCompAttributes; +} UPACKED wusb_endpoint_companion_desc_t; + +/* Wireless USB Numeric Association M1 Data Structure */ +typedef struct wusb_m1_data { + uByte version; + uWord langId; + uByte deviceFriendlyNameLength; + uByte sha_256_m3[32]; + uByte deviceFriendlyName[256]; +} UPACKED wusb_m1_data_t; + +typedef struct wusb_m2_data { + uByte version; + uWord langId; + uByte hostFriendlyNameLength; + uByte pkh[384]; + uByte hostFriendlyName[256]; +} UPACKED wusb_m2_data_t; + +typedef struct wusb_m3_data { + uByte pkd[384]; + uByte nd; +} UPACKED wusb_m3_data_t; + +typedef struct wusb_m4_data { + uDWord _attributeTypeIdAndLength_1; + uWord associationTypeId; + + uDWord _attributeTypeIdAndLength_2; + uWord associationSubTypeId; + + uDWord _attributeTypeIdAndLength_3; + uDWord length; + + uDWord _attributeTypeIdAndLength_4; + uDWord associationStatus; + + uDWord _attributeTypeIdAndLength_5; + uByte chid[16]; + + uDWord _attributeTypeIdAndLength_6; + uByte cdid[16]; + + uDWord _attributeTypeIdAndLength_7; + uByte bandGroups[2]; +} UPACKED wusb_m4_data_t; + + + +/* Original Host */ +/* USB directions */ +#define USB_DIR_OUT 0 +#define USB_DIR_IN 0x80 + +/* Endpoints */ +#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 + +#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ + + + + + +#if 1 +#define UGETW(w) ((w)[0] | ((w)[1] << 8)) +#define USETW(w,v) ((w)[0] = (u_int8_t)(v), (w)[1] = (u_int8_t)((v) >> 8)) +#define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24)) +#define USETDW(w,v) ((w)[0] = (u_int8_t)(v), \ + (w)[1] = (u_int8_t)((v) >> 8), \ + (w)[2] = (u_int8_t)((v) >> 16), \ + (w)[3] = (u_int8_t)((v) >> 24)) +#else +/* + * On little-endian machines that can handle unanliged accesses + * (e.g. i386) these macros can be replaced by the following. + */ +#define UGETW(w) (*(u_int16_t *)(w)) +#define USETW(w,v) (*(u_int16_t *)(w) = (v)) +#define UGETDW(w) (*(u_int32_t *)(w)) +#define USETDW(w,v) (*(u_int32_t *)(w) = (v)) +#endif + +//#define UPACKED __attribute__((__packed__)) + + + + + + +/* Everything is aribtrary */ +#define USB_ALTSETTINGALLOC 4 +#define USB_MAXALTSETTING 128 /* Hard limit */ + +#define USB_MAX_DEVICE 3 // at least 2: 1 for the root hub device, 1 for usb device +#define USB_MAXCONFIG 8 +#define USB_MAXINTERFACES 8 +#define USB_MAXENDPOINTS 16 +#define USB_MAXCHILDREN 8 /* This is arbitrary */ +#define USB_MAX_HUB 2 + +#define USB_MAXIADS (USB_MAXINTERFACES/2) + +#define USB_CNTL_TIMEOUT 5000 /* 100ms timeout */ + + + + +/* Requests */ +#define UR_GET_STATUS 0x00 +#define USTAT_STANDARD_STATUS 0x00 +#define WUSTAT_WUSB_FEATURE 0x01 +#define WUSTAT_CHANNEL_INFO 0x02 +#define WUSTAT_RECEIVED_DATA 0x03 +#define WUSTAT_MAS_AVAILABILITY 0x04 +#define WUSTAT_CURRENT_TRANSMIT_POWER 0x05 +#define UR_CLEAR_FEATURE 0x01 +#define UR_SET_FEATURE 0x03 +#define UR_SET_AND_TEST_FEATURE 0x0c +#define UR_SET_ADDRESS 0x05 +#define UR_GET_DESCRIPTOR 0x06 +#define UDESC_DEVICE 0x01 +#define UDESC_CONFIG 0x02 +#define UDESC_STRING 0x03 +#define UDESC_INTERFACE 0x04 +#define UDESC_ENDPOINT 0x05 +#define UDESC_SS_USB_COMPANION 0x30 +#define UDESC_DEVICE_QUALIFIER 0x06 +#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 +#define UDESC_INTERFACE_POWER 0x08 +#define UDESC_OTG 0x09 +#define WUDESC_SECURITY 0x0c +#define WUDESC_KEY 0x0d +#define WUD_GET_KEY_INDEX(_wValue_) ((_wValue_) & 0xf) +#define WUD_GET_KEY_TYPE(_wValue_) (((_wValue_) & 0x30) >> 4) +#define WUD_KEY_TYPE_ASSOC 0x01 +#define WUD_KEY_TYPE_GTK 0x02 +#define WUD_GET_KEY_ORIGIN(_wValue_) (((_wValue_) & 0x40) >> 6) +#define WUD_KEY_ORIGIN_HOST 0x00 +#define WUD_KEY_ORIGIN_DEVICE 0x01 +#define WUDESC_ENCRYPTION_TYPE 0x0e +#define WUDESC_BOS 0x0f +#define WUDESC_DEVICE_CAPABILITY 0x10 +#define WUDESC_WIRELESS_ENDPOINT_COMPANION 0x11 +#define UDESC_BOS 0x0f +#define UDESC_DEVICE_CAPABILITY 0x10 +#define UDESC_CS_DEVICE 0x21 /* class specific */ +#define UDESC_CS_CONFIG 0x22 +#define UDESC_CS_STRING 0x23 +#define UDESC_CS_INTERFACE 0x24 +#define UDESC_CS_ENDPOINT 0x25 +#define UDESC_HUB 0x29 +#define UR_SET_DESCRIPTOR 0x07 +#define UR_GET_CONFIG 0x08 +#define UR_SET_CONFIG 0x09 +#define UR_GET_INTERFACE 0x0a +#define UR_SET_INTERFACE 0x0b +#define UR_SYNCH_FRAME 0x0c +#define WUR_SET_ENCRYPTION 0x0d +#define WUR_GET_ENCRYPTION 0x0e +#define WUR_SET_HANDSHAKE 0x0f +#define WUR_GET_HANDSHAKE 0x10 +#define WUR_SET_CONNECTION 0x11 +#define WUR_SET_SECURITY_DATA 0x12 +#define WUR_GET_SECURITY_DATA 0x13 +#define WUR_SET_WUSB_DATA 0x14 +#define WUDATA_DRPIE_INFO 0x01 +#define WUDATA_TRANSMIT_DATA 0x02 +#define WUDATA_TRANSMIT_PARAMS 0x03 +#define WUDATA_RECEIVE_PARAMS 0x04 +#define WUDATA_TRANSMIT_POWER 0x05 +#define WUR_LOOPBACK_DATA_WRITE 0x15 +#define WUR_LOOPBACK_DATA_READ 0x16 +#define WUR_SET_INTERFACE_DS 0x17 + + +/* Hub features */ +#define UHF_C_HUB_LOCAL_POWER 0 +#define UHF_C_HUB_OVER_CURRENT 1 +#define UHF_PORT_CONNECTION 0 +#define UHF_PORT_ENABLE 1 +#define UHF_PORT_SUSPEND 2 +#define UHF_PORT_OVER_CURRENT 3 +#define UHF_PORT_RESET 4 +#define UHF_PORT_L1 5 +#define UHF_PORT_POWER 8 +#define UHF_PORT_LOW_SPEED 9 +#define UHF_PORT_HIGH_SPEED 10 +#define UHF_C_PORT_CONNECTION 16 +#define UHF_C_PORT_ENABLE 17 +#define UHF_C_PORT_SUSPEND 18 +#define UHF_C_PORT_OVER_CURRENT 19 +#define UHF_C_PORT_RESET 20 +#define UHF_C_PORT_L1 23 +#define UHF_PORT_TEST 21 +#define UHF_PORT_INDICATOR 22 + + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bDescriptorSubtype; +} UPACKED usb_descriptor_t; + +typedef struct { + uByte bLength; + uByte bDescriptorType; +} UPACKED usb_descriptor_header_t; + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uWord bcdUSB; +#define UD_USB_2_0 0x0200 +#define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0) + uByte bDeviceClass; + uByte bDeviceSubClass; + uByte bDeviceProtocol; + uByte bMaxPacketSize; + /* The fields below are not part of the initial descriptor. */ + uWord idVendor; + uWord idProduct; + uWord bcdDevice; + uByte iManufacturer; + uByte iProduct; + uByte iSerialNumber; + uByte bNumConfigurations; +} UPACKED usb_device_descriptor_t; + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uWord wTotalLength; + uByte bNumInterface; + uByte bConfigurationValue; + uByte iConfiguration; +#define UC_ATT_ONE (1 << 7) /* must be set */ +#define UC_ATT_SELFPOWER (1 << 6) /* self powered */ +#define UC_ATT_WAKEUP (1 << 5) /* can wakeup */ +#define UC_ATT_BATTERY (1 << 4) /* battery powered */ + uByte bmAttributes; +#define UC_BUS_POWERED 0x80 +#define UC_SELF_POWERED 0x40 +#define UC_REMOTE_WAKEUP 0x20 + uByte bMaxPower; /* max current in 2 mA units */ +#define UC_POWER_FACTOR 2 +} UPACKED usb_config_descriptor_t; +#define USB_CONFIG_DESCRIPTOR_SIZE 9 + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bInterfaceNumber; + uByte bAlternateSetting; + uByte bNumEndpoints; + uByte bInterfaceClass; + uByte bInterfaceSubClass; + uByte bInterfaceProtocol; + uByte iInterface; +} UPACKED usb_interface_descriptor_t; +#define USB_INTERFACE_DESCRIPTOR_SIZE 9 + + + +/* String descriptor */ + + +/* device request (setup) */ +struct devrequest { + unsigned char requesttype; + unsigned char request; + unsigned short value; + unsigned short index; + unsigned short length; +} UPACKED; + +/* All standard descriptors have these 2 fields in common */ + + +/* Device descriptor */ + + +/* Endpoint descriptor */ + + +/* Interface descriptor */ + + +/* Configuration descriptor information.. */ + + +/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */ + +enum { + /* Maximum packet size; encoded as 0,1,2,3 = 8,16,32,64 */ + PACKET_SIZE_8 = 0, + PACKET_SIZE_16 = 1, + PACKET_SIZE_32 = 2, + PACKET_SIZE_64 = 3, +}; + + + + +struct usb_host_endpoint { + struct usb_endpoint_descriptor desc; + _list urb_list; + void *hcpriv; + unsigned char *extra; /* Extra descriptors */ + int extralen; + int enabled; +}; + +/* host-side wrapper for one interface setting's parsed descriptors */ +struct usb_host_interface { + struct usb_interface_descriptor desc; + + int extralen; + unsigned char *extra; /* Extra descriptors */ + + /* array of desc.bNumEndpoint endpoints associated with this + * interface setting. these will be in no particular order. + */ + struct usb_host_endpoint *endpoint; + + char *string; /* iInterface string, if present */ +}; + +struct usb_interface { + /* array of alternate settings for this interface, + * stored in no particular order */ + struct usb_host_interface *altsetting; + + struct usb_host_interface *cur_altsetting; /* the currently + * active alternate setting */ + unsigned num_altsetting; /* number of alternate settings */ + + /* If there is an interface association descriptor then it will list + * the associated interfaces */ + struct usb_interface_assoc_descriptor *intf_assoc; + +// int minor; /* minor number this interface is +// * bound to */ + unsigned ep_devs_created:1; /* endpoint "devices" exist */ + unsigned unregistering:1; /* unregistration is in progress */ + unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ + unsigned reset_running:1; + unsigned resetting_device:1; /* true: bandwidth alloc after reset */ + + void *dev_prive_data;/* interface specific device info i.e struct v4l2_device pointer */ + + void *driver; + void *drv_priv; // functional driver priv data + void *usb_dev; +}; +#define to_usb_interface(d) container_of(d, struct usb_interface, usb_dev) + +struct usb_interface_cache { + unsigned num_altsetting; /* number of alternate settings */ + + /* variable-length array of alternate settings for this interface, + * stored in no particular order */ + struct usb_host_interface altsetting[0]; +}; + +struct usb_host_config { + struct usb_config_descriptor desc; + + char *string; /* iConfiguration string, if present */ + + /* List of any Interface Association Descriptors in this + * configuration. */ + struct usb_interface_assoc_descriptor *intf_assoc[USB_MAXIADS]; + + /* the interfaces associated with this configuration, + * stored in no particular order */ + struct usb_interface *interface[USB_MAXINTERFACES]; + + /* Interface information available even when this is not the + * active configuration */ + struct usb_interface_cache *intf_cache[USB_MAXINTERFACES]; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + + + +struct usb_device { + int devnum; + u32 route; + enum usb_device_state state; + enum usb_device_speed speed; + + unsigned int toggle[2]; + + struct usb_device *parent; + struct usb_device *children[USB_MAXCHILDREN]; + void *hcd; + struct usb_host_endpoint ep0; + + struct usb_device_descriptor descriptor; + struct usb_host_config *config; + + struct usb_host_config *actconfig; + struct usb_host_endpoint *ep_in[16]; + struct usb_host_endpoint *ep_out[16]; + int configno; /* selected config number */ + + char **rawdescriptors; + unsigned int rawdeslen[USB_MAXCONFIG]; + +// unsigned short bus_mA; + u8 portnum; + u8 level; + + unsigned can_submit:1; + unsigned persist_enabled:1; + unsigned have_langid:1; + unsigned authorized:1; + unsigned authenticated:1; + int string_langid; + + /* static strings from the device */ +// char *product; +// char *manufacturer; +// char *serial; + + int maxchild; + + u32 quirks; + atomic_t urbnum; + +// unsigned long active_duration; + + char mf[32]; /* manufacturer */ + char prod[32]; /* product */ + char serial[32]; /* serial number */ + + _mutex Mutex; +}; + +/* + * urb->transfer_flags: + * + * Note: URB_DIR_IN/OUT is automatically set in usb_submit_urb(). + */ +#define URB_SHORT_NOT_OK 0x0001 /* report short reads as errors */ +#define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame + * ignored */ +#define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ +#define URB_NO_FSBR 0x0020 /* UHCI-specific */ +#define URB_ZERO_PACKET 0x0040 /* Finish bulk OUT with short packet */ +#define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt + * needed */ +#define URB_FREE_BUFFER 0x0100 /* Free transfer buffer with the URB */ + +/* The following flags are used internally by usbcore and HCDs */ +#define URB_DIR_IN 0x0200 /* Transfer from device to host */ +#define URB_DIR_OUT 0 +#define URB_DIR_MASK URB_DIR_IN + +#define URB_DMA_MAP_SINGLE 0x00010000 /* Non-scatter-gather mapping */ +#define URB_DMA_MAP_PAGE 0x00020000 /* HCD-unsupported S-G */ +#define URB_DMA_MAP_SG 0x00040000 /* HCD-supported S-G */ +#define URB_MAP_LOCAL 0x00080000 /* HCD-local-memory mapping */ +#define URB_SETUP_MAP_SINGLE 0x00100000 /* Setup packet DMA mapped */ +#define URB_SETUP_MAP_LOCAL 0x00200000 /* HCD-local setup packet */ +#define URB_DMA_SG_COMBINED 0x00400000 /* S-G entries were combined */ +#define URB_ALIGNED_TEMP_BUFFER 0x00800000 /* Temp buffer was alloc'd */ + +struct usb_iso_packet_descriptor { + unsigned int offset; + unsigned int length; /* expected length */ + unsigned int actual_length; + int status; +}; + +struct urb; + +typedef void (*usb_complete_t)(struct urb *); + +struct urb { + /* private: usb core and host controller only fields in the urb */ + void *hcpriv; /* private data for host controller */ + atomic_t use_count; /* concurrent submissions counter */ + atomic_t reject; /* submissions will fail */ + int unlinked; /* unlink error code */ + + /* public: documented fields in the urb that can be used by drivers */ + _list urb_list; /* list head for use by the urb's + * current owner */ + + struct usb_device *dev; /* (in) pointer to associated device */ + struct usb_host_endpoint *ep; /* (internal) pointer to endpoint */ + unsigned int pipe; /* (in) pipe information */ + unsigned int stream_id; /* (in) stream ID */ + int status; /* (return) non-ISO status */ + unsigned int transfer_flags; /* (in) URB_SHORT_NOT_OK | ...*/ + void *transfer_buffer; /* (in) associated data buffer */ + dma_addr_t transfer_dma; /* (in) dma addr for transfer_buffer */ + u32 transfer_buffer_length; /* (in) data buffer length */ + u32 actual_length; /* (return) actual transfer length */ + unsigned char *setup_packet; /* (in) setup packet (control only) */ + + int start_frame; /* (modify) start frame (ISO) */ + int number_of_packets; /* (in) number of ISO packets */ + int interval; /* (modify) transfer interval + * (INT/ISO) */ + int error_count; /* (return) number of ISO errors */ + void *context; /* (in) context for completion */ + _mutex Mutex; // mutext for atomic or link-list operation + usb_complete_t complete; /* (in) completion routine */ + unsigned int iso_packets; + struct usb_iso_packet_descriptor iso_frame_desc[0]; + /* (in) ISO ONLY */ +}; + +struct usb_hcd { + + /* + * housekeeping + */ + void *rhdev; /* self usb_dev */ + const char *product_desc; /* product/vendor string */ + int speed; /* Speed for this roothub. + * May be different from + * hcd->driver->flags & HCD_MASK + */ + + struct urb *status_urb; /* the current status urb */ + + /* + * hardware info/state + */ + + + + /* Flags that need to be manipulated atomically because they can + * change while the host controller is running. Always use + * set_bit() or clear_bit() to change their values. + */ + unsigned long flags; + + /* Flags that get set only during HCD registration or removal. */ + unsigned rh_registered:1;/* is root hub registered? */ + unsigned rh_pollable:1; /* may we poll the root hub? */ + unsigned msix_enabled:1; /* driver has MSI-X enabled? */ + + /* The next flag is a stopgap, to be removed when all the HCDs + * support the new root-hub polling mechanism. */ + unsigned uses_new_polling:1; + unsigned authorized_default:1; + unsigned has_tt:1; /* Integrated TT in root hub */ + + + /* bandwidth_mutex should be taken before adding or removing + * any new bus bandwidth constraints: + * 1. Before adding a configuration for a new device. + * 2. Before removing the configuration to put the device into + * the addressed state. + * 3. Before selecting a different configuration. + * 4. Before selecting an alternate interface setting. + * + * bandwidth_mutex should be dropped after a successful control message + * to the device, or resetting the bandwidth after a failed attempt. + */ + _mutex bandwidth_mutex; + + int state; + + int devnum_next; /* Next open device number in + * round-robin allocation */ + + _mutex hcd_urb_list_lock; + _mutex hcd_urb_unlink_lock; + _mutex hcd_root_hub_lock; // mutext for atomic or link-list operation + + /* The HC driver's private data is stored at the end of + * this structure. + */ +#ifdef __ICCARM__ + #pragma pack(64) + unsigned long hcd_priv[0]; +#elif defined (__GNUC__) + unsigned long hcd_priv[0]; + __attribute__ ((aligned(sizeof(s64)))); +#endif +}; + + +#define le16_to_cpu rtk_le16_to_cpu +#define cpu_to_le16 rtk_cpu_to_le16 + +#if 0 +/* + * Calling this entity a "pipe" is glorifying it. A USB pipe + * is something embarrassingly simple: it basically consists + * of the following information: + * - device number (7 bits) + * - endpoint number (4 bits) + * - current Data0/1 state (1 bit) + * - direction (1 bit) + * - speed (2 bits) + * - max packet size (2 bits: 8, 16, 32 or 64) + * - pipe type (2 bits: control, interrupt, bulk, isochronous) + * + * That's 18 bits. Really. Nothing more. And the USB people have + * documented these eighteen bits as some kind of glorious + * virtual data structure. + * + * Let's not fall in that trap. We'll just encode it as a simple + * unsigned int. The encoding is: + * + * - max size: bits 0-1 (00 = 8, 01 = 16, 10 = 32, 11 = 64) + * - direction: bit 7 (0 = Host-to-Device [Out], + * (1 = Device-to-Host [In]) + * - device: bits 8-14 + * - endpoint: bits 15-18 + * - Data0/1: bit 19 + * - speed: bit 26 (0 = Full, 1 = Low Speed, 2 = High) + * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, + * 10 = control, 11 = bulk) + * + * Why? Because it's arbitrary, and whatever encoding we select is really + * up to us. This one happens to share a lot of bit positions with the UHCI + * specification, so that much of the uhci driver can just mask the bits + * appropriately. + */ +/* Create various pipes... */ +#define create_pipe(dev,endpoint) \ + (((dev)->devnum << 8) | (endpoint << 15) | \ + ((dev)->speed << 26) | (dev)->maxpacketsize) +#define default_pipe(dev) ((dev)->speed << 26) + +#define usb_sndctrlpipe(dev, endpoint) ((PIPE_CONTROL << 30) | \ + create_pipe(dev, endpoint)) +#define usb_rcvctrlpipe(dev, endpoint) ((PIPE_CONTROL << 30) | \ + create_pipe(dev, endpoint) | \ + USB_DIR_IN) +#define usb_sndisocpipe(dev, endpoint) ((PIPE_ISOCHRONOUS << 30) | \ + create_pipe(dev, endpoint)) +#define usb_rcvisocpipe(dev, endpoint) ((PIPE_ISOCHRONOUS << 30) | \ + create_pipe(dev, endpoint) | \ + USB_DIR_IN) +#define usb_sndbulkpipe(dev, endpoint) ((PIPE_BULK << 30) | \ + create_pipe(dev, endpoint)) +#define usb_rcvbulkpipe(dev, endpoint) ((PIPE_BULK << 30) | \ + create_pipe(dev, endpoint) | \ + USB_DIR_IN) +#define usb_sndintpipe(dev, endpoint) ((PIPE_INTERRUPT << 30) | \ + create_pipe(dev, endpoint)) +#define usb_rcvintpipe(dev, endpoint) ((PIPE_INTERRUPT << 30) | \ + create_pipe(dev, endpoint) | \ + USB_DIR_IN) +#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | \ + default_pipe(dev)) +#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | \ + default_pipe(dev) | \ + USB_DIR_IN) + +/* The D0/D1 toggle bits */ +#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> ep) & 1) +#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << ep)) +#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = \ + ((dev)->toggle[out] & \ + ~(1 << ep)) | ((bit) << ep)) + +/* Endpoint halt control/status */ +#define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1) +#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep))) +#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep))) +#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep))) + +#define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : \ + USB_PID_OUT) + +#define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1) +#define usb_pipein(pipe) (((pipe) >> 7) & 1) +#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f) +#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff) +#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf) +#define usb_pipedata(pipe) (((pipe) >> 19) & 1) +#define usb_pipespeed(pipe) (((pipe) >> 26) & 3) +#define usb_pipeslow(pipe) (usb_pipespeed(pipe) == USB_SPEED_LOW) +#define usb_pipetype(pipe) (((pipe) >> 30) & 3) +#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) +#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT) +#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL) +#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK) + +#else +/* ----------------------------------------------------------------------- */ + +/* + * For various legacy reasons, Linux has a small cookie that's paired with + * a struct usb_device to identify an endpoint queue. Queue characteristics + * are defined by the endpoint's descriptor. This cookie is called a "pipe", + * an unsigned int encoded as: + * + * - direction: bit 7 (0 = Host-to-Device [Out], + * 1 = Device-to-Host [In] ... + * like endpoint bEndpointAddress) + * - device address: bits 8-14 ... bit positions known to uhci-hcd + * - endpoint: bits 15-18 ... bit positions known to uhci-hcd + * - pipe type: bits 30-31 (00 = isochronous, 01 = interrupt, + * 10 = control, 11 = bulk) + * + * Given the device address and endpoint descriptor, pipes are redundant. + */ + +/* NOTE: these are not the standard USB_ENDPOINT_XFER_* values!! */ +/* (yet ... they're the values used by usbfs) */ + +#define usb_pipein(pipe) (((pipe) & USB_DIR_IN) >> 7) +#define usb_pipeout(pipe) (!usb_pipein(pipe)) + +#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f) +#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf) + +#define usb_pipetype(pipe) (((pipe) >> 30) & 3) +#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS) +#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT) +#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL) +#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK) + +static inline unsigned int __create_pipe(struct usb_device *dev, + unsigned int endpoint) +{ + return (dev->devnum << 8) | (endpoint << 15); +} + +#define usb_sndaddr0pipe() (PIPE_CONTROL << 30) +#define usb_rcvaddr0pipe() ((PIPE_CONTROL << 30) | USB_DIR_IN) + +/* Create various pipes... */ +#define usb_sndctrlpipe(dev, endpoint) \ + ((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint)) +#define usb_rcvctrlpipe(dev, endpoint) \ + ((PIPE_CONTROL << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) +#define usb_sndisocpipe(dev, endpoint) \ + ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint)) +#define usb_rcvisocpipe(dev, endpoint) \ + ((PIPE_ISOCHRONOUS << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) +#define usb_sndbulkpipe(dev, endpoint) \ + ((PIPE_BULK << 30) | __create_pipe(dev, endpoint)) +#define usb_rcvbulkpipe(dev, endpoint) \ + ((PIPE_BULK << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) +#define usb_sndintpipe(dev, endpoint) \ + ((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint)) +#define usb_rcvintpipe(dev, endpoint) \ + ((PIPE_INTERRUPT << 30) | __create_pipe(dev, endpoint) | USB_DIR_IN) + +static inline struct usb_host_endpoint * +usb_pipe_endpoint(struct usb_device *dev, unsigned int pipe) +{ + struct usb_host_endpoint **eps; + eps = usb_pipein(pipe) ? dev->ep_in : dev->ep_out; + return eps[usb_pipeendpoint(pipe)]; +} + +/* The D0/D1 toggle bits ... USE WITH CAUTION (they're almost hcd-internal) */ +#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> (ep)) & 1) +#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << (ep))) +#define usb_settoggle(dev, ep, out, bit) \ + ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << (ep))) | \ + ((bit) << (ep))) +#endif + +/************************************************************************* + * Hub Stuff + */ +struct usb_port_status { + unsigned short wPortStatus; + unsigned short wPortChange; +} UPACKED; + +struct usb_hub_status { + unsigned short wHubStatus; + unsigned short wHubChange; +}UPACKED; + + +/* Hub descriptor */ +struct usb_hub_descriptor { + unsigned char bLength; + unsigned char bDescriptorType; + unsigned char bNbrPorts; + unsigned short wHubCharacteristics; + unsigned char bPwrOn2PwrGood; + unsigned char bHubContrCurrent; + unsigned char DeviceRemovable[(USB_MAXCHILDREN+1+7)/8]; + unsigned char PortPowerCtrlMask[(USB_MAXCHILDREN+1+7)/8]; + /* DeviceRemovable and PortPwrCtrlMask want to be variable-length + bitmaps that hold max 255 entries. (bit0 is ignored) */ +}UPACKED; + + +struct usb_hub_device { + struct usb_device *pusb_dev; + struct usb_hub_descriptor desc; +}; + +/*-------------------------------------------------------------------------*/ + +/** + * usb_endpoint_num - get the endpoint's number + * @epd: endpoint to be checked + * + * Returns @epd's number: 0 to 15. + */ +static inline int usb_endpoint_num(const struct usb_endpoint_descriptor *epd) +{ + return epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; +} + +/** + * usb_endpoint_type - get the endpoint's transfer type + * @epd: endpoint to be checked + * + * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according + * to @epd's transfer type. + */ +static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd) +{ + return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; +} + +/** + * usb_endpoint_dir_in - check if the endpoint has IN direction + * @epd: endpoint to be checked + * + * Returns true if the endpoint is of type IN, otherwise it returns false. + */ +static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); +} + +/** + * usb_endpoint_dir_out - check if the endpoint has OUT direction + * @epd: endpoint to be checked + * + * Returns true if the endpoint is of type OUT, otherwise it returns false. + */ +static inline int usb_endpoint_dir_out( + const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); +} + +#define usb_endpoint_out(ep_dir) (!((ep_dir) & USB_DIR_IN)) + +/** + * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type + * @epd: endpoint to be checked + * + * Returns true if the endpoint is of type bulk, otherwise it returns false. + */ +static inline int usb_endpoint_xfer_bulk( + const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == + USB_ENDPOINT_XFER_BULK); +} + +/** + * usb_endpoint_xfer_control - check if the endpoint has control transfer type + * @epd: endpoint to be checked + * + * Returns true if the endpoint is of type control, otherwise it returns false. + */ +static inline int usb_endpoint_xfer_control( + const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == + USB_ENDPOINT_XFER_CONTROL); +} + +/** + * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type + * @epd: endpoint to be checked + * + * Returns true if the endpoint is of type interrupt, otherwise it returns + * false. + */ +static inline int usb_endpoint_xfer_int( + const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == + USB_ENDPOINT_XFER_INT); +} + +/** + * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type + * @epd: endpoint to be checked + * + * Returns true if the endpoint is of type isochronous, otherwise it returns + * false. + */ +static inline int usb_endpoint_xfer_isoc( + const struct usb_endpoint_descriptor *epd) +{ + return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == + USB_ENDPOINT_XFER_ISOC); +} + +/** + * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN + * @epd: endpoint to be checked + * + * Returns true if the endpoint has bulk transfer type and IN direction, + * otherwise it returns false. + */ +static inline int usb_endpoint_is_bulk_in( + const struct usb_endpoint_descriptor *epd) +{ + return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd); +} + +/** + * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT + * @epd: endpoint to be checked + * + * Returns true if the endpoint has bulk transfer type and OUT direction, + * otherwise it returns false. + */ +static inline int usb_endpoint_is_bulk_out( + const struct usb_endpoint_descriptor *epd) +{ + return usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd); +} + +/** + * usb_endpoint_is_int_in - check if the endpoint is interrupt IN + * @epd: endpoint to be checked + * + * Returns true if the endpoint has interrupt transfer type and IN direction, + * otherwise it returns false. + */ +static inline int usb_endpoint_is_int_in( + const struct usb_endpoint_descriptor *epd) +{ + return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd); +} + +/** + * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT + * @epd: endpoint to be checked + * + * Returns true if the endpoint has interrupt transfer type and OUT direction, + * otherwise it returns false. + */ +static inline int usb_endpoint_is_int_out( + const struct usb_endpoint_descriptor *epd) +{ + return usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd); +} + +/** + * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN + * @epd: endpoint to be checked + * + * Returns true if the endpoint has isochronous transfer type and IN direction, + * otherwise it returns false. + */ +static inline int usb_endpoint_is_isoc_in( + const struct usb_endpoint_descriptor *epd) +{ + return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd); +} + +/** + * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT + * @epd: endpoint to be checked + * + * Returns true if the endpoint has isochronous transfer type and OUT direction, + * otherwise it returns false. + */ +static inline int usb_endpoint_is_isoc_out( + const struct usb_endpoint_descriptor *epd) +{ + return usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd); +} + +/** + * usb_endpoint_maxp - get endpoint's max packet size + * @epd: endpoint to be checked + * + * Returns @epd's max packet + */ +static inline int usb_endpoint_maxp(const struct usb_endpoint_descriptor *epd) +{ + return rtk_le16_to_cpu(epd->wMaxPacketSize); +} + +/** + * usb_urb_dir_in - check if an URB describes an IN transfer + * @urb: URB to be checked + * + * Returns 1 if @urb describes an IN transfer (device-to-host), + * otherwise 0. + */ +static inline int usb_urb_dir_in(struct urb *urb) +{ + return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_IN; +} + +/** + * usb_urb_dir_out - check if an URB describes an OUT transfer + * @urb: URB to be checked + * + * Returns 1 if @urb describes an OUT transfer (host-to-device), + * otherwise 0. + */ +static inline int usb_urb_dir_out(struct urb *urb) +{ + return (urb->transfer_flags & URB_DIR_MASK) == URB_DIR_OUT; +} + +/** + * usb_get_dev - increments the reference count of the usb device structure + * @dev: the device being referenced + * + * Each live reference to a device should be refcounted. + * + * Drivers for USB interfaces should normally record such references in + * their probe() methods, when they bind to an interface, and release + * them by calling usb_put_dev(), in their disconnect() methods. + * + * A pointer to the device with the incremented reference counter is returned. + */ +static inline void *usb_get_dev(struct usb_device *dev) +{ + return dev; +} + +/** + * usb_put_dev - release a use of the usb device structure + * @dev: device that's been disconnected + * + * Must be called when a user of a device is finished with it. When the last + * user of the device calls this function, the memory of the device is freed. + */ +static inline void usb_put_dev(struct usb_device *dev) +{ +} + +/** + * usb_get_intf - increments the reference count of the usb interface structure + * @intf: the interface being referenced + * + * Each live reference to a interface must be refcounted. + * + * Drivers for USB interfaces should normally record such references in + * their probe() methods, when they bind to an interface, and release + * them by calling usb_put_intf(), in their disconnect() methods. + * + * A pointer to the interface with the incremented reference counter is + * returned. + */ +static inline void *usb_get_intf(struct usb_interface *intf) +{ + return intf; +} + +/** + * usb_put_intf - release a use of the usb interface structure + * @intf: interface that's been decremented + * + * Must be called when a user of an interface is finished with it. When the + * last user of the interface calls this function, the memory of the interface + * is freed. + */ +static inline void usb_put_intf(struct usb_interface *intf) +{ +} + +static inline void *usb_get_intfdata(struct usb_interface *intf) +{ + return (intf->drv_priv); +} + +static inline void usb_set_intfdata(struct usb_interface *intf, void *data) +{ + intf->drv_priv = data; +} + +static inline struct usb_device *interface_to_usbdev(struct usb_interface *intf) +{ + return intf->usb_dev; +} + +static inline struct usb_driver *interface_to_usbdri(struct usb_interface *intf) +{ + return intf->driver; +} + +/*-------------------------------------------------------------------------*/ + +/*=====================================================*/ + + +#ifdef DWC_HOST_ONLY +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bEndpointAddress; +#define UE_GET_DIR(a) ((a) & 0x80) +#define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) +#define UE_DIR_IN 0x01 +#define UE_DIR_OUT 0x00 +#define UE_ADDR 0x0f +#define UE_GET_ADDR(a) ((a) & UE_ADDR) + uByte bmAttributes; +#define UE_XFERTYPE 0x03 +#define UE_CONTROL 0x00 +#define UE_ISOCHRONOUS 0x01 +#define UE_BULK 0x02 +#define UE_INTERRUPT 0x03 +#define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) +#if 0 +#define UE_ISO_TYPE 0x0c +#define UE_ISO_ASYNC 0x04 +#define UE_ISO_ADAPT 0x08 +#define UE_ISO_SYNC 0x0c +#define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) +#endif + uWord wMaxPacketSize; + uByte bInterval; +} usb_endpoint_descriptor_t;//UPACKED usb_endpoint_descriptor_t; +#define USB_ENDPOINT_DESCRIPTOR_SIZE 7 +#endif +#ifdef DWC_DEVICE_ONLY +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bEndpointAddress; +#define UE_GET_DIR(a) ((a) & 0x80) +#define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) +#define UE_DIR_IN 0x80 +#define UE_DIR_OUT 0x00 +#define UE_ADDR 0x0f +#define UE_GET_ADDR(a) ((a) & UE_ADDR) + uByte bmAttributes; +#define UE_XFERTYPE 0x03 +#define UE_CONTROL 0x00 +#define UE_ISOCHRONOUS 0x01 +#define UE_BULK 0x02 +#define UE_INTERRUPT 0x03 +#define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE) +#define UE_ISO_TYPE 0x0c +#define UE_ISO_ASYNC 0x04 +#define UE_ISO_ADAPT 0x08 +#define UE_ISO_SYNC 0x0c +#define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE) + uWord wMaxPacketSize; + uByte bInterval; +} UPACKED usb_endpoint_descriptor_t; +#endif + +typedef struct ss_endpoint_companion_descriptor { + uByte bLength; + uByte bDescriptorType; + uByte bMaxBurst; +#define USSE_GET_MAX_STREAMS(a) ((a) & 0x1f) +#define USSE_SET_MAX_STREAMS(a, b) ((a) | ((b) & 0x1f)) +#define USSE_GET_MAX_PACKET_NUM(a) ((a) & 0x03) +#define USSE_SET_MAX_PACKET_NUM(a, b) ((a) | ((b) & 0x03)) + uByte bmAttributes; + uWord wBytesPerInterval; +} UPACKED ss_endpoint_companion_descriptor_t; +#define USB_SS_ENDPOINT_COMPANION_DESCRIPTOR_SIZE 6 + +typedef struct { + uByte bLength; + uByte bDescriptorType; + uWord bString[127]; +} UPACKED usb_string_descriptor_t; +#define USB_MAX_STRING_LEN 128 +#define USB_LANGUAGE_TABLE 0 /* # of the string language id table */ + + +/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ + +/* USB_DT_OTG (from OTG 1.0a supplement) */ + +/* from usb_otg_descriptor.bmAttributes */ +#define USB_OTG_SRP (1 << 0) +#define USB_OTG_HNP (1 << 1) /* swap host/device roles */ + + +extern int usb_init(void); +extern int usb_stop(void); +extern void usb_disable_asynch(int disable); +extern unsigned short usb_maxpacket(struct usb_device *udev, int pipe, int is_out); +extern int usb_set_interface(struct usb_device *dev, int interface, int alternate); +extern int usb_set_configuration(struct usb_device *dev, int configuration); + +extern int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol); +extern int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id); +extern int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type, + unsigned char id, void *buf, int size); +extern int usb_get_class_descriptor(struct usb_device *dev, int ifnum, + unsigned char type, unsigned char id, void *buf, int size); +extern int usb_string(struct usb_device *dev, int index, char *buf, int size); + +extern void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status); +extern struct usb_hcd *usb_create_hcd(unsigned int priv_size); +extern int usb_add_hcd(struct usb_hcd *hcd); + +extern struct urb *usb_alloc_urb(int iso_packets); +extern void usb_free_urb(struct urb *urb); +extern void usb_kill_urb(struct urb *urb); +extern void usb_fill_control_urb(struct urb *urb, + struct usb_device *dev, + unsigned int pipe, + unsigned char *setup_packet, + void *transfer_buffer, + int buffer_length, + usb_complete_t complete_fn, + void *context); +extern void usb_fill_bulk_urb(struct urb *urb, + struct usb_device *dev, + unsigned int pipe, + void *transfer_buffer, + int buffer_length, + usb_complete_t complete_fn, + void *context); +extern void usb_fill_int_urb(struct urb *urb, + struct usb_device *dev, + unsigned int pipe, + void *transfer_buffer, + int buffer_length, + usb_complete_t complete_fn, + void *context, + int interval); +extern int usb_submit_urb(struct urb *urb); + +extern void usb_reset_endpoint(struct usb_device *dev, unsigned int epaddr); +extern void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf, + bool reset_hardware); +extern void usb_enable_interface(struct usb_device *dev, + struct usb_interface *intf, bool reset_eps); + +extern int usb_control_msg(struct usb_device *dev, unsigned int pipe, u8 request, + u8 requesttype, u16 value, u16 index, void *data, + u16 size, int timeout); +extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout); +extern int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe, + void *data, int len, int *actual_length, int timeout); +extern int usb_get_descriptor(struct usb_device *dev, unsigned char type, + unsigned char index, void *buf, int size); +extern int usb_get_device_descriptor(struct usb_device *dev, unsigned int size); +extern int usb_clear_halt(struct usb_device *dev, int pipe); + +extern _sema CtrlUrbCompSema; /* Semaphore for for Control URB Complete waiting */ +extern _sema UrbKillSema; /* Semaphore for for URB Kill waiting */ + +typedef unsigned long kernel_ulong_t; + +struct usb_device_id { + /* which fields to match against? */ + u16 match_flags; + + /* Used for product specific matches; range is inclusive */ + u16 idVendor; + u16 idProduct; + u16 bcdDevice_lo; + u16 bcdDevice_hi; + + /* Used for device class matches */ + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + + /* Used for interface class matches */ + u8 bInterfaceClass; + u8 bInterfaceSubClass; + u8 bInterfaceProtocol; + + /* Used for vendor-specific interface matches */ + u8 bInterfaceNumber; + + /* not matched against */ +#ifdef __ICCARM__ + #pragma pack(64) + kernel_ulong_t driver_info; +#elif defined (__GNUC__) + kernel_ulong_t driver_info; + __attribute__((aligned(sizeof(kernel_ulong_t)))); +#endif +}; + +/* Some useful macros to use to create struct usb_device_id */ +#define USB_DEVICE_ID_MATCH_VENDOR 0x0001 +#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002 +#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004 +#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008 +#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010 +#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020 +#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040 +#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080 +#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100 +#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200 +#define USB_DEVICE_ID_MATCH_INT_NUMBER 0x0400 + +#define USB_DEVICE_ID_MATCH_DEVICE \ + (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT) +#define USB_DEVICE_ID_MATCH_DEV_RANGE \ + (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI) +#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION \ + (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE) +#define USB_DEVICE_ID_MATCH_DEV_INFO \ + (USB_DEVICE_ID_MATCH_DEV_CLASS | \ + USB_DEVICE_ID_MATCH_DEV_SUBCLASS | \ + USB_DEVICE_ID_MATCH_DEV_PROTOCOL) +#define USB_DEVICE_ID_MATCH_INT_INFO \ + (USB_DEVICE_ID_MATCH_INT_CLASS | \ + USB_DEVICE_ID_MATCH_INT_SUBCLASS | \ + USB_DEVICE_ID_MATCH_INT_PROTOCOL) +/** + * USB_DEVICE - macro used to describe a specific usb device + * @vend: the 16 bit USB Vendor ID + * @prod: the 16 bit USB Product ID + * + * This macro is used to create a struct usb_device_id that matches a + * specific device. + */ +#define USB_DEVICE(vend, prod) \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE, \ + .idVendor = (vend), \ + .idProduct = (prod) + +/** + * USB_DEVICE_VER - describe a specific usb device with a version range + * @vend: the 16 bit USB Vendor ID + * @prod: the 16 bit USB Product ID + * @lo: the bcdDevice_lo value + * @hi: the bcdDevice_hi value + * + * This macro is used to create a struct usb_device_id that matches a + * specific device, with a version range. + */ +#define USB_DEVICE_VER(vend, prod, lo, hi) \ + .match_flags = USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, \ + .idVendor = (vend), \ + .idProduct = (prod), \ + .bcdDevice_lo = (lo), \ + .bcdDevice_hi = (hi) + +/** + * USB_INTERFACE_INFO - macro used to describe a class of usb interfaces + * @cl: bInterfaceClass value + * @sc: bInterfaceSubClass value + * @pr: bInterfaceProtocol value + * + * This macro is used to create a struct usb_device_id that matches a + * specific class of interfaces. + */ +#define USB_INTERFACE_INFO(cl, sc, pr) \ + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO, \ + .bInterfaceClass = (cl), \ + .bInterfaceSubClass = (sc), \ + .bInterfaceProtocol = (pr) + +#endif /* _USB_H_ */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/usb_ch9.h b/lib/fwlib/ram_lib/usb_otg/include/usb_ch9.h new file mode 100644 index 0000000..d5a0871 --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/usb_ch9.h @@ -0,0 +1,562 @@ +/* + * This file holds USB constants and structures that are needed for USB + * device APIs. These are used by the USB device model, which is defined + * in chapter 9 of the USB 2.0 specification. Linux has several APIs in C + * that need these: + * + * - the master/host side Linux-USB kernel driver API; + * - the "usbfs" user space API; and + * - the Linux "gadget" slave/device/peripheral side driver API. + * + * USB 2.0 adds an additional "On The Go" (OTG) mode, which lets systems + * act either as a USB master/host or as a USB slave/device. That means + * the master and slave side APIs benefit from working well together. + * + * There's also "Wireless USB", using low power short range radios for + * peripheral interconnection but otherwise building on the USB framework. + */ + + +#ifndef _USB_CH9_H_ +#define _USB_CH9_H_ + +//#include /* __u8 etc */ +//#include "../otg/osk/sys-support.h" + +/*-------------------------------------------------------------------------*/ + +/* CONTROL REQUEST SUPPORT */ + +/* + * USB directions + * + * This bit flag is used in endpoint descriptors' bEndpointAddress field. + * It's also one of three fields in control requests bRequestType. + */ +//#define USB_DIR_OUT 0 /* to device */ +//#define USB_DIR_IN 0x80 /* to host */ + +/* + * USB types, the second of three bRequestType fields + */ +#define USB_TYPE_MASK (0x03 << 5) +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +/* + * USB recipients, the third of three bRequestType fields + */ +#define USB_RECIP_MASK 0x1f +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 +/* From Wireless USB 1.0 */ +#define USB_RECIP_PORT 0x04 +#define USB_RECIP_RPIPE 0x05 + +/* + * Standard requests, for the bRequest field of a SETUP packet. + * + * These are qualified by the bRequestType field, so that for example + * TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved + * by a GET_STATUS request. + */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_REQ_SET_ENCRYPTION 0x0D /* Wireless USB */ +#define USB_REQ_GET_ENCRYPTION 0x0E +#define USB_REQ_RPIPE_ABORT 0x0E +#define USB_REQ_SET_HANDSHAKE 0x0F +#define USB_REQ_RPIPE_RESET 0x0F +#define USB_REQ_GET_HANDSHAKE 0x10 +#define USB_REQ_SET_CONNECTION 0x11 +#define USB_REQ_SET_SECURITY_DATA 0x12 +#define USB_REQ_GET_SECURITY_DATA 0x13 +#define USB_REQ_SET_WUSB_DATA 0x14 +#define USB_REQ_LOOPBACK_DATA_WRITE 0x15 +#define USB_REQ_LOOPBACK_DATA_READ 0x16 +#define USB_REQ_SET_INTERFACE_DS 0x17 + +/* + * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and + * are read as a bit array returned by USB_REQ_GET_STATUS. (So there + * are at most sixteen features of each type.) + */ +#define USB_DEVICE_SELF_POWERED 0 /* (read only) */ +#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ +#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ +#define USB_DEVICE_BATTERY 2 /* (wireless) */ +#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ +#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ +#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ +#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ +#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ + +#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ + + +/** + * struct usb_ctrlrequest - SETUP data for a USB device control request + * @bRequestType: matches the USB bmRequestType field + * @bRequest: matches the USB bRequest field + * @wValue: matches the USB wValue field (le16 byte order) + * @wIndex: matches the USB wIndex field (le16 byte order) + * @wLength: matches the USB wLength field (le16 byte order) + * + * This structure is used to send control requests to a USB device. It matches + * the different fields of the USB 2.0 Spec section 9.3, table 9-2. See the + * USB spec for a fuller description of the different fields, and what they are + * used for. + * + * Note that the driver for any interface can issue control requests. + * For most devices, interfaces don't coordinate with each other, so + * such requests may be made at any time. + */ +struct usb_ctrlrequest { + u8 bRequestType; + u8 bRequest; + u16 wValue; + u16 wIndex; + u16 wLength; +}; + +/*-------------------------------------------------------------------------*/ + +/* + * STANDARD DESCRIPTORS ... as returned by GET_DESCRIPTOR, or + * (rarely) accepted by SET_DESCRIPTOR. + * + * Note that all multi-byte values here are encoded in little endian + * byte order "on the wire". But when exposed through Linux-USB APIs, + * they've been converted to cpu byte order. + */ + +/* + * Descriptor types ... USB 2.0 spec table 9.5 + */ +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 +#define USB_DT_DEVICE_QUALIFIER 0x06 +#define USB_DT_OTHER_SPEED_CONFIG 0x07 +#define USB_DT_INTERFACE_POWER 0x08 +/* these are from a minor usb 2.0 revision (ECN) */ +#define USB_DT_OTG 0x09 +#define USB_DT_DEBUG 0x0a +#define USB_DT_INTERFACE_ASSOCIATION 0x0b +/* these are from the Wireless USB spec */ +#define USB_DT_SECURITY 0x0c +#define USB_DT_KEY 0x0d +#define USB_DT_ENCRYPTION_TYPE 0x0e +#define USB_DT_BOS 0x0f +#define USB_DT_DEVICE_CAPABILITY 0x10 +#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 +#define USB_DT_WIRE_ADAPTER 0x21 +#define USB_DT_RPIPE 0x22 + +/* conventional codes for class-specific descriptors */ +#define USB_DT_CS_DEVICE 0x21 +#define USB_DT_CS_CONFIG 0x22 +#define USB_DT_CS_STRING 0x23 +#define USB_DT_CS_INTERFACE 0x24 +#define USB_DT_CS_ENDPOINT 0x25 + +/* All standard descriptors have these 2 fields at the beginning */ +struct usb_descriptor_header { + u8 bLength; + u8 bDescriptorType; +}; + + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_DEVICE: Device descriptor */ +struct usb_device_descriptor { + u8 bLength; + u8 bDescriptorType; + + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + u8 bMaxPacketSize0; + u16 idVendor; + u16 idProduct; + u16 bcdDevice; + u8 iManufacturer; + u8 iProduct; + u8 iSerialNumber; + u8 bNumConfigurations; +}; + +#define USB_DT_DEVICE_SIZE 18 + + +/* + * Device and/or Interface Class codes + * as found in bDeviceClass or bInterfaceClass + * and defined by www.usb.org documents + */ +#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ +#define USB_CLASS_AUDIO 1 +#define USB_CLASS_COMM 2 +#define USB_CLASS_HID 3 +#define USB_CLASS_PHYSICAL 5 +#define USB_CLASS_STILL_IMAGE 6 +#define USB_CLASS_PRINTER 7 +#define USB_CLASS_MASS_STORAGE 8 +#define USB_CLASS_HUB 9 +#define USB_CLASS_CDC_DATA 0x0a +#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ +#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ +#define USB_CLASS_VIDEO 0x0e +#define USB_CLASS_WIRELESS_CONTROLLER 0xe0 +#define USB_CLASS_APP_SPEC 0xfe +#define USB_CLASS_VENDOR_SPEC 0xff + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_CONFIG: Configuration descriptor information. + * + * USB_DT_OTHER_SPEED_CONFIG is the same descriptor, except that the + * descriptor type is different. Highspeed-capable devices can look + * different depending on what speed they're currently running. Only + * devices with a USB_DT_DEVICE_QUALIFIER have any OTHER_SPEED_CONFIG + * descriptors. + */ +struct usb_config_descriptor { + u8 bLength; + u8 bDescriptorType; + + u16 wTotalLength; + u8 bNumInterfaces; + u8 bConfigurationValue; + u8 iConfiguration; + u8 bmAttributes; + u8 bMaxPower; +}; + +#define USB_DT_CONFIG_SIZE 9 + +/* from config descriptor bmAttributes */ +#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ +#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ +#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ +#define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_STRING: String descriptor */ +struct usb_string_descriptor { + u8 bLength; + u8 bDescriptorType; + + u16 wData[1]; /* UTF-16LE encoded */ +}; + +/* note that "string" zero is special, it holds language codes that + * the device supports, not Unicode characters. + */ + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_INTERFACE: Interface descriptor */ +struct usb_interface_descriptor { + u8 bLength; + u8 bDescriptorType; + + u8 bInterfaceNumber; + u8 bAlternateSetting; + u8 bNumEndpoints; + u8 bInterfaceClass; + u8 bInterfaceSubClass; + u8 bInterfaceProtocol; + u8 iInterface; +}; + +#define USB_DT_INTERFACE_SIZE 9 + +/*-------------------------------------------------------------------------*/ + +/* Endpoint descriptor */ +struct usb_endpoint_descriptor { + u8 bLength; + u8 bDescriptorType; + u8 bEndpointAddress; + u8 bmAttributes; + u16 wMaxPacketSize; + u8 bInterval; + u8 bRefresh; + u8 bSynchAddress; + + unsigned char *extra; /* Extra descriptors */ + int extralen; +}; + +#define USB_DT_ENDPOINT_SIZE 7 +#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ + + +/* + * Endpoints + */ +#if 0 +#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 +#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 +#endif + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ +struct usb_qualifier_descriptor { + u8 bLength; + u8 bDescriptorType; + + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + u8 bMaxPacketSize0; + u8 bNumConfigurations; + u8 bRESERVED; +}; + + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_OTG (from OTG 1.0a supplement) */ +struct usb_otg_descriptor { + u8 bLength; + u8 bDescriptorType; + + u8 bmAttributes; /* support for HNP, SRP, etc */ +}; + +/* from usb_otg_descriptor.bmAttributes */ +#define USB_OTG_SRP (1 << 0) +#define USB_OTG_HNP (1 << 1) /* swap host/device roles */ + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_DEBUG: for special highspeed devices, replacing serial console */ +struct usb_debug_descriptor { + u8 bLength; + u8 bDescriptorType; + + /* bulk endpoints with 8 byte maxpacket */ + u8 bDebugInEndpoint; + u8 bDebugOutEndpoint; +}; + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_INTERFACE_ASSOCIATION: groups interfaces */ +struct usb_interface_assoc_descriptor { + u8 bLength; + u8 bDescriptorType; + + u8 bFirstInterface; + u8 bInterfaceCount; + u8 bFunctionClass; + u8 bFunctionSubClass; + u8 bFunctionProtocol; + u8 iFunction; +}; + + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_SECURITY: group of wireless security descriptors, including + * encryption types available for setting up a CC/association. + */ +struct usb_security_descriptor { + u8 bLength; + u8 bDescriptorType; + + u16 wTotalLength; + u8 bNumEncryptionTypes; +}; + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_KEY: used with {GET,SET}_SECURITY_DATA; only public keys + * may be retrieved. + */ +struct usb_key_descriptor { + u8 bLength; + u8 bDescriptorType; + + u8 tTKID[3]; + u8 bReserved; + u8 bKeyData[0]; +}; + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_ENCRYPTION_TYPE: bundled in DT_SECURITY groups */ +struct usb_encryption_descriptor { + u8 bLength; + u8 bDescriptorType; + + u8 bEncryptionType; +#define USB_ENC_TYPE_UNSECURE 0 +#define USB_ENC_TYPE_WIRED 1 /* non-wireless mode */ +#define USB_ENC_TYPE_CCM_1 2 /* aes128/cbc session */ +#define USB_ENC_TYPE_RSA_1 3 /* rsa3072/sha1 auth */ + u8 bEncryptionValue; /* use in SET_ENCRYPTION */ + u8 bAuthKeyIndex; +}; + + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_BOS: group of wireless capabilities */ +struct usb_bos_descriptor { + u8 bLength; + u8 bDescriptorType; + + u16 wTotalLength; + u8 bNumDeviceCaps; +}; + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_DEVICE_CAPABILITY: grouped with BOS */ +struct usb_dev_cap_header { + u8 bLength; + u8 bDescriptorType; + u8 bDevCapabilityType; +}; + +#define USB_CAP_TYPE_WIRELESS_USB 1 + +struct usb_wireless_cap_descriptor { /* Ultra Wide Band */ + u8 bLength; + u8 bDescriptorType; + u8 bDevCapabilityType; + + u8 bmAttributes; +#define USB_WIRELESS_P2P_DRD (1 << 1) +#define USB_WIRELESS_BEACON_MASK (3 << 2) +#define USB_WIRELESS_BEACON_SELF (1 << 2) +#define USB_WIRELESS_BEACON_DIRECTED (2 << 2) +#define USB_WIRELESS_BEACON_NONE (3 << 2) + u16 wPHYRates; /* bit rates, Mbps */ +#define USB_WIRELESS_PHY_53 (1 << 0) /* always set */ +#define USB_WIRELESS_PHY_80 (1 << 1) +#define USB_WIRELESS_PHY_107 (1 << 2) /* always set */ +#define USB_WIRELESS_PHY_160 (1 << 3) +#define USB_WIRELESS_PHY_200 (1 << 4) /* always set */ +#define USB_WIRELESS_PHY_320 (1 << 5) +#define USB_WIRELESS_PHY_400 (1 << 6) +#define USB_WIRELESS_PHY_480 (1 << 7) + u8 bmTFITXPowerInfo; /* TFI power levels */ + u8 bmFFITXPowerInfo; /* FFI power levels */ + u16 bmBandGroup; + u8 bReserved; +}; + +/*-------------------------------------------------------------------------*/ + +/* USB_DT_WIRELESS_ENDPOINT_COMP: companion descriptor associated with + * each endpoint descriptor for a wireless device + */ +struct usb_wireless_ep_comp_descriptor { + u8 bLength; + u8 bDescriptorType; + + u8 bMaxBurst; + u8 bMaxSequence; + u16 wMaxStreamDelay; + u16 wOverTheAirPacketSize; + u8 bOverTheAirInterval; + u8 bmCompAttributes; +#define USB_ENDPOINT_SWITCH_MASK 0x03 /* in bmCompAttributes */ +#define USB_ENDPOINT_SWITCH_NO 0 +#define USB_ENDPOINT_SWITCH_SWITCH 1 +#define USB_ENDPOINT_SWITCH_SCALE 2 +}; + +/*-------------------------------------------------------------------------*/ + +/* USB_REQ_SET_HANDSHAKE is a four-way handshake used between a wireless + * host and a device for connection set up, mutual authentication, and + * exchanging short lived session keys. The handshake depends on a CC. + */ +struct usb_handshake { + u8 bMessageNumber; + u8 bStatus; + u8 tTKID[3]; + u8 bReserved; + u8 CDID[16]; + u8 nonce[16]; + u8 MIC[8]; +}; + + +/*-------------------------------------------------------------------------*/ + +/* USB_REQ_SET_CONNECTION modifies or revokes a connection context (CC). + * A CC may also be set up using non-wireless secure channels (including + * wired USB!), and some devices may support CCs with multiple hosts. + */ +struct usb_connection_context { + u8 CHID[16]; /* persistent host id */ + u8 CDID[16]; /* device id (unique w/in host context) */ + u8 CK[16]; /* connection key */ +}; + +/*-------------------------------------------------------------------------*/ + +#if 1 + + + + +enum usb_device_state { + /* NOTATTACHED isn't in the USB spec, and this state acts + * the same as ATTACHED ... but it's clearer this way. + */ + USB_STATE_NOTATTACHED = 0, + + /* chapter 9 and authentication (wireless) device states */ + USB_STATE_ATTACHED, + USB_STATE_POWERED, /* wired */ + USB_STATE_UNAUTHENTICATED, /* auth */ + USB_STATE_RECONNECTING, /* auth */ + USB_STATE_DEFAULT, /* limited function */ + USB_STATE_ADDRESS, + USB_STATE_CONFIGURED, /* most functions */ + + USB_STATE_SUSPENDED + + /* NOTE: there are actually four different SUSPENDED + * states, returning to POWERED, DEFAULT, ADDRESS, or + * CONFIGURED respectively when SOF tokens flow again. + */ +}; +#endif +#endif /* __LINUX_USB_CH9_H */ + diff --git a/lib/fwlib/ram_lib/usb_otg/include/usb_defs.h b/lib/fwlib/ram_lib/usb_otg/include/usb_defs.h new file mode 100644 index 0000000..d57bc9f --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/usb_defs.h @@ -0,0 +1,378 @@ +/* + * (C) Copyright 2001 + * Denis Peter, MPL AG Switzerland + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * Note: Part of this code has been derived from linux + * + */ +#ifndef _USB_DEFS_H_ +#define _USB_DEFS_H_ +/* USB constants */ + +/* Device and/or Interface Class codes */ +#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ +#define USB_CLASS_AUDIO 1 +#define USB_CLASS_COMM 2 +#define USB_CLASS_HID 3 +#define USB_CLASS_PHYSICAL 5 +#define USB_CLASS_STILL_IMAGE 6 + +#define USB_CLASS_PRINTER 7 +#define USB_CLASS_MASS_STORAGE 8 +#define USB_CLASS_HUB 9 +#define USB_CLASS_CDC_DATA 0x0a + +#define USB_CLASS_DATA 10 +#define USB_CLASS_CSCID 0x0b /* chip+ smart card */ +#define USB_CLASS_CONTENT_SEC 0x0d /* content security */ +#define USB_CLASS_VIDEO 0x0e +#define USB_CLASS_WIRELESS_CONTROLLER 0xe0 +#define USB_CLASS_APP_SPEC 0xfe + +#define USB_CLASS_VENDOR_SPEC 0xff + +/* some HID sub classes */ +#define USB_SUB_HID_NONE 0 +#define USB_SUB_HID_BOOT 1 + +/* some UID Protocols */ +#define USB_PROT_HID_NONE 0 +#define USB_PROT_HID_KEYBOARD 1 +#define USB_PROT_HID_MOUSE 2 + + +/* Sub STORAGE Classes */ +#define US_SC_RBC 1 /* Typically, flash devices */ +#define US_SC_8020 2 /* CD-ROM */ +#define US_SC_QIC 3 /* QIC-157 Tapes */ +#define US_SC_UFI 4 /* Floppy */ +#define US_SC_8070 5 /* Removable media */ +#define US_SC_SCSI 6 /* Transparent */ +#define US_SC_MIN US_SC_RBC +#define US_SC_MAX US_SC_SCSI + +/* STORAGE Protocols */ +#define US_PR_CB 1 /* Control/Bulk w/o interrupt */ +#define US_PR_CBI 0 /* Control/Bulk/Interrupt */ +#define US_PR_BULK 0x50 /* bulk only */ + +/* USB types */ +#define USB_TYPE_STANDARD (0x00 << 5) +#define USB_TYPE_CLASS (0x01 << 5) +#define USB_TYPE_VENDOR (0x02 << 5) +#define USB_TYPE_RESERVED (0x03 << 5) + +/* USB recipients */ +#define USB_RECIP_DEVICE 0x00 +#define USB_RECIP_INTERFACE 0x01 +#define USB_RECIP_ENDPOINT 0x02 +#define USB_RECIP_OTHER 0x03 + + +#define USB_DT_CS_DEVICE 0x21 +#define USB_DT_CS_CONFIG 0x22 +#define USB_DT_CS_STRING 0x23 +#define USB_DT_CS_INTERFACE 0x24 +#define USB_DT_CS_ENDPOINT 0x25 + + +/* USB directions */ +#define USB_DIR_OUT 0 /* to device */ +#define USB_DIR_IN 0x80 /* to host */ + +#if 0 +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, /* enumerating */ + USB_SPEED_LOW, + USB_SPEED_FULL, /* usb 1.1 */ + USB_SPEED_HIGH, /* usb 2.0 */ +}; +#else +enum usb_device_speed { + USB_SPEED_UNKNOWN = 0, /* enumerating */ + USB_SPEED_LOW, USB_SPEED_FULL, /* usb 1.1 */ + USB_SPEED_HIGH, /* usb 2.0 */ + USB_SPEED_VARIABLE, /* wireless (usb 2.5) */ +}; + +#endif +/* Descriptor types */ +#define USB_DT_DEVICE 0x01 +#define USB_DT_CONFIG 0x02 +#define USB_DT_STRING 0x03 +#define USB_DT_INTERFACE 0x04 +#define USB_DT_ENDPOINT 0x05 +#define USB_DT_DEVICE_QUALIFIER 0x06 +#define USB_DT_OTHER_SPEED_CONFIG 0x07 +#define USB_DT_INTERFACE_POWER 0x08 +/* these are from a minor usb 2.0 revision (ECN) */ +#define USB_DT_OTG 0x09 +#define USB_DT_DEBUG 0x0a +#define USB_DT_INTERFACE_ASSOCIATION 0x0b +/* these are from the Wireless USB spec */ +#define USB_DT_SECURITY 0x0c +#define USB_DT_KEY 0x0d +#define USB_DT_ENCRYPTION_TYPE 0x0e +#define USB_DT_BOS 0x0f +#define USB_DT_DEVICE_CAPABILITY 0x10 +#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11 +#define USB_DT_WIRE_ADAPTER 0x21 +#define USB_DT_RPIPE 0x22 + +//#define USB_DT_INTERFACE_ASSOCIATION 0x0b + +#define USB_DT_HID (USB_TYPE_CLASS | 0x01) +#define USB_DT_REPORT (USB_TYPE_CLASS | 0x02) +#define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03) +#define USB_DT_HUB (USB_TYPE_CLASS | 0x09) + +/* Descriptor sizes per descriptor type */ +#define USB_DT_DEVICE_SIZE 18 +#define USB_DT_CONFIG_SIZE 9 +#define USB_DT_INTERFACE_SIZE 9 +#define USB_DT_ENDPOINT_SIZE 7 +#define USB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ +#define USB_DT_HUB_NONVAR_SIZE 7 +#define USB_DT_HID_SIZE 9 + +/* Endpoints */ +#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ +#define USB_ENDPOINT_DIR_MASK 0x80 + +#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ +#define USB_ENDPOINT_XFER_CONTROL 0 +#define USB_ENDPOINT_XFER_ISOC 1 +#define USB_ENDPOINT_XFER_BULK 2 +#define USB_ENDPOINT_XFER_INT 3 + +#define USB_ENDPOINT_HALT 0 /* IN/OUT will STALL */ + +/* USB Packet IDs (PIDs) */ +#define USB_PID_UNDEF_0 0xf0 +#define USB_PID_OUT 0xe1 +#define USB_PID_ACK 0xd2 +#define USB_PID_DATA0 0xc3 +#define USB_PID_UNDEF_4 0xb4 +#define USB_PID_SOF 0xa5 +#define USB_PID_UNDEF_6 0x96 +#define USB_PID_UNDEF_7 0x87 +#define USB_PID_UNDEF_8 0x78 +#define USB_PID_IN 0x69 +#define USB_PID_NAK 0x5a +#define USB_PID_DATA1 0x4b +#define USB_PID_PREAMBLE 0x3c +#define USB_PID_SETUP 0x2d +#define USB_PID_STALL 0x1e +#define USB_PID_UNDEF_F 0x0f + +/* Standard requests */ +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +/* HID requests */ +#define USB_REQ_GET_REPORT 0x01 +#define USB_REQ_GET_IDLE 0x02 +#define USB_REQ_GET_PROTOCOL 0x03 +#define USB_REQ_SET_REPORT 0x09 +#define USB_REQ_SET_IDLE 0x0A +#define USB_REQ_SET_PROTOCOL 0x0B + + +/* "pipe" definitions */ + +#define PIPE_ISOCHRONOUS 0 +#define PIPE_INTERRUPT 1 +#define PIPE_CONTROL 2 +#define PIPE_BULK 3 +#define PIPE_DEVEP_MASK 0x0007ff00 + +#define USB_ISOCHRONOUS 0 +#define USB_INTERRUPT 1 +#define USB_CONTROL 2 +#define USB_BULK 3 + +/* USB-status codes: */ +#define USB_ST_ACTIVE 0x1 /* TD is active */ +#define USB_ST_STALLED 0x2 /* TD is stalled */ +#define USB_ST_BUF_ERR 0x4 /* buffer error */ +#define USB_ST_BABBLE_DET 0x8 /* Babble detected */ +#define USB_ST_NAK_REC 0x10 /* NAK Received*/ +#define USB_ST_CRC_ERR 0x20 /* CRC/timeout Error */ +#define USB_ST_BIT_ERR 0x40 /* Bitstuff error */ +#define USB_ST_NOT_PROC 0x80000000L /* Not yet processed */ + + +/************************************************************************* + * Hub defines + */ + +/* + * Hub request types + */ + +#define USB_RT_HUB (USB_TYPE_CLASS | USB_RECIP_DEVICE) +#define USB_RT_PORT (USB_TYPE_CLASS | USB_RECIP_OTHER) + +/* + * Hub Class feature numbers + */ +#define C_HUB_LOCAL_POWER 0 +#define C_HUB_OVER_CURRENT 1 + +/* + * Port feature numbers + */ +#define USB_PORT_FEAT_CONNECTION 0 +#define USB_PORT_FEAT_ENABLE 1 +#define USB_PORT_FEAT_SUSPEND 2 +#define USB_PORT_FEAT_OVER_CURRENT 3 +#define USB_PORT_FEAT_RESET 4 +#define USB_PORT_FEAT_POWER 8 +#define USB_PORT_FEAT_LOWSPEED 9 +#define USB_PORT_FEAT_HIGHSPEED 10 +#define USB_PORT_FEAT_C_CONNECTION 16 +#define USB_PORT_FEAT_C_ENABLE 17 +#define USB_PORT_FEAT_C_SUSPEND 18 +#define USB_PORT_FEAT_C_OVER_CURRENT 19 +#define USB_PORT_FEAT_C_RESET 20 + +/* wPortStatus bits */ +#define USB_PORT_STAT_CONNECTION 0x0001 +#define USB_PORT_STAT_ENABLE 0x0002 +#define USB_PORT_STAT_SUSPEND 0x0004 +#define USB_PORT_STAT_OVERCURRENT 0x0008 +#define USB_PORT_STAT_RESET 0x0010 +#define USB_PORT_STAT_POWER 0x0100 +#define USB_PORT_STAT_LOW_SPEED 0x0200 +#define USB_PORT_STAT_HIGH_SPEED 0x0400 /* support for EHCI */ +#define USB_PORT_STAT_SPEED \ + (USB_PORT_STAT_LOW_SPEED | USB_PORT_STAT_HIGH_SPEED) + +/* wPortChange bits */ +#define USB_PORT_STAT_C_CONNECTION 0x0001 +#define USB_PORT_STAT_C_ENABLE 0x0002 +#define USB_PORT_STAT_C_SUSPEND 0x0004 +#define USB_PORT_STAT_C_OVERCURRENT 0x0008 +#define USB_PORT_STAT_C_RESET 0x0010 + +/* wHubCharacteristics (masks) */ +#define HUB_CHAR_LPSM 0x0003 +#define HUB_CHAR_COMPOUND 0x0004 +#define HUB_CHAR_OCPM 0x0018 + +/* + *Hub Status & Hub Change bit masks + */ +#define HUB_STATUS_LOCAL_POWER 0x0001 +#define HUB_STATUS_OVERCURRENT 0x0002 + +#define HUB_CHANGE_LOCAL_POWER 0x0001 +#define HUB_CHANGE_OVERCURRENT 0x0002 + +/* Struct USB_HCD defination */ +// for flags +#define HCD_FLAG_HW_ACCESSIBLE 0 /* at full power */ +#define HCD_FLAG_POLL_RH 2 /* poll for rh status? */ +#define HCD_FLAG_POLL_PENDING 3 /* status has changed? */ +#define HCD_FLAG_WAKEUP_PENDING 4 /* root hub is resuming? */ +#define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */ +#define HCD_FLAG_DEAD 6 /* controller has died? */ + +/* The flags can be tested using these macros; they are likely to + * be slightly faster than test_bit(). + */ +#define HCD_HW_ACCESSIBLE(hcd) ((hcd)->flags & (1U << HCD_FLAG_HW_ACCESSIBLE)) +#define HCD_POLL_RH(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_RH)) +#define HCD_POLL_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_POLL_PENDING)) +#define HCD_WAKEUP_PENDING(hcd) ((hcd)->flags & (1U << HCD_FLAG_WAKEUP_PENDING)) +#define HCD_RH_RUNNING(hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING)) +#define HCD_DEAD(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD)) + +// for state +#define __ACTIVE 0x01 +#define __SUSPEND 0x04 +#define __TRANSIENT 0x80 + +#define HC_STATE_HALT 0 +#define HC_STATE_RUNNING (__ACTIVE) +#define HC_STATE_QUIESCING (__SUSPEND|__TRANSIENT|__ACTIVE) +#define HC_STATE_RESUMING (__SUSPEND|__TRANSIENT) +#define HC_STATE_SUSPENDED (__SUSPEND) + +#define HC_IS_RUNNING(state) ((state) & __ACTIVE) +#define HC_IS_SUSPENDED(state) ((state) & __SUSPEND) + +/* + * USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and + * are read as a bit array returned by USB_REQ_GET_STATUS. (So there + * are at most sixteen features of each type.) Hubs may also support a + * new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend. + */ +#define USB_DEVICE_SELF_POWERED 0 /* (read only) */ +#define USB_DEVICE_REMOTE_WAKEUP 1 /* dev may initiate wakeup */ +#define USB_DEVICE_TEST_MODE 2 /* (wired high speed only) */ +#define USB_DEVICE_BATTERY 2 /* (wireless) */ +#define USB_DEVICE_B_HNP_ENABLE 3 /* (otg) dev may initiate HNP */ +#define USB_DEVICE_WUSB_DEVICE 3 /* (wireless)*/ +#define USB_DEVICE_A_HNP_SUPPORT 4 /* (otg) RH port supports HNP */ +#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /* (otg) other RH port does */ +#define USB_DEVICE_DEBUG_MODE 6 /* (special devices only) */ + +/* (shifted) direction/type/recipient from the USB 2.0 spec, table 9.2 */ +#define DeviceRequest \ + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) +#define DeviceOutRequest \ + ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_DEVICE)<<8) + +#define InterfaceRequest \ + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) + +#define EndpointRequest \ + ((USB_DIR_IN|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) +#define EndpointOutRequest \ + ((USB_DIR_OUT|USB_TYPE_STANDARD|USB_RECIP_INTERFACE)<<8) + +/* class requests from the USB 2.0 hub spec, table 11-15 */ +/* GetBusState and SetHubDescriptor are optional, omitted */ +#define ClearHubFeature (0x2000 | USB_REQ_CLEAR_FEATURE) +#define ClearPortFeature (0x2300 | USB_REQ_CLEAR_FEATURE) +#define GetHubDescriptor (0xa000 | USB_REQ_GET_DESCRIPTOR) +#define GetHubStatus (0xa000 | USB_REQ_GET_STATUS) +#define GetPortStatus (0xa300 | USB_REQ_GET_STATUS) +#define SetHubFeature (0x2000 | USB_REQ_SET_FEATURE) +#define SetPortFeature (0x2300 | USB_REQ_SET_FEATURE) + +/* from config descriptor bmAttributes */ +#define USB_CONFIG_ATT_ONE (1 << 7) /* must be set */ +#define USB_CONFIG_ATT_SELFPOWER (1 << 6) /* self powered */ +#define USB_CONFIG_ATT_WAKEUP (1 << 5) /* can wakeup */ +#define USB_CONFIG_ATT_BATTERY (1 << 4) /* battery powered */ + +#endif /*_USB_DEFS_H_ */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/usb_gadget.h b/lib/fwlib/ram_lib/usb_otg/include/usb_gadget.h new file mode 100644 index 0000000..9a96f8a --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/usb_gadget.h @@ -0,0 +1,960 @@ +/* + * + * + * We call the USB code inside a Linux-based peripheral device a "gadget" + * driver, except for the hardware-specific bus glue. One USB host can + * master many USB gadgets, but the gadgets are only slaved to one host. + * + * + * (C) Copyright 2002-2004 by David Brownell + * All Rights Reserved. + * + * This software is licensed under the GNU GPL version 2. + */ + +#ifndef __USB_GADGET_H +#define __USB_GADGET_H + +//#include "xlinux.h" + +//#ifdef __KERNEL__ +#include "osdep_api.h" +#include "usb_ch9.h" +//#include "usb_gadget.h" +#include "rtl8195a_otg_zero.h" +//#include "../otg/lm.h" + +#if 1//defined(CONFIG_RTL_ULINKER) +#include "usb_ulinker.h" +#endif + + +#include "hal_util.h" +#include "usb.h" + +typedef unsigned int gfp_t; +//struct usb_ep; +/** + * struct usb_ep - device side representation of USB endpoint + * @name:identifier for the endpoint, such as "ep-a" or "ep9in-bulk" + * @ops: Function pointers used to access hardware-specific operations. + * @ep_list:the gadget's ep_list holds all of its endpoints + * @maxpacket:The maximum packet size used on this endpoint. The initial + * value can sometimes be reduced (hardware allowing), according to + * the endpoint descriptor used to configure the endpoint. + * @driver_data:for use by the gadget driver. all other fields are + * read-only to gadget drivers. + * + * the bus controller driver lists all the general purpose endpoints in + * gadget->ep_list. the control endpoint (gadget->ep0) is not in that list, + * and is accessed only in response to a driver setup() callback. + */ +struct usb_ep { + void *driver_data; + + const char *name; + const struct usb_ep_ops *ops; + _LIST ep_list;//ModifiedByJD + unsigned maxpacket:16; + const struct usb_endpoint_descriptor *desc; +}; + + +typedef void (*usb_req_complete_t)(struct usb_ep *, struct usb_request *); + + +/** + * struct usb_request - describes one i/o request + * @buf: Buffer used for data. Always provide this; some controllers + * only use PIO, or don't use DMA for some endpoints. + * @dma: DMA address corresponding to 'buf'. If you don't set this + * field, and the usb controller needs one, it is responsible + * for mapping and unmapping the buffer. + * @length: Length of that data + * @no_interrupt: If true, hints that no completion irq is needed. + * Helpful sometimes with deep request queues that are handled + * directly by DMA controllers. + * @zero: If true, when writing data, makes the last packet be "short" + * by adding a zero length packet as needed; + * @short_not_ok: When reading data, makes short packets be + * treated as errors (queue stops advancing till cleanup). + * @complete: Function called when request completes, so this request and + * its buffer may be re-used. + * Reads terminate with a short packet, or when the buffer fills, + * whichever comes first. When writes terminate, some data bytes + * will usually still be in flight (often in a hardware fifo). + * Errors (for reads or writes) stop the queue from advancing + * until the completion function returns, so that any transfers + * invalidated by the error may first be dequeued. + * @context: For use by the completion callback + * @list: For use by the gadget driver. + * @status: Reports completion code, zero or a negative errno. + * Normally, faults block the transfer queue from advancing until + * the completion callback returns. + * Code "-ESHUTDOWN" indicates completion caused by device disconnect, + * or when the driver disabled the endpoint. + * @actual: Reports bytes transferred to/from the buffer. For reads (OUT + * transfers) this may be less than the requested length. If the + * short_not_ok flag is set, short reads are treated as errors + * even when status otherwise indicates successful completion. + * Note that for writes (IN transfers) some data bytes may still + * reside in a device-side FIFO when the request is reported as + * complete. + * + * These are allocated/freed through the endpoint they're used with. The + * hardware's driver can add extra per-request data to the memory it returns, + * which often avoids separate memory allocations (potential failures), + * later when the request is queued. + * + * Request flags affect request handling, such as whether a zero length + * packet is written (the "zero" flag), whether a short read should be + * treated as an error (blocking request queue advance, the "short_not_ok" + * flag), or hinting that an interrupt is not required (the "no_interrupt" + * flag, for use with deep request queues). + * + * Bulk endpoints can use any size buffers, and can also be used for interrupt + * transfers. interrupt-only endpoints can be much less functional. + */ + // NOTE this is analagous to 'struct urb' on the host side, + // except that it's thinner and promotes more pre-allocation. + +struct usb_request { + void *buf; + unsigned length; + dma_addr_t dma; + + unsigned no_interrupt:1; + unsigned zero:1; + unsigned short_not_ok:1; + + usb_req_complete_t complete; + void *context; + _LIST list;//ModifiedByJD + + int status; + unsigned actual; +}; + +/*-------------------------------------------------------------------------*/ + +/* endpoint-specific parts of the api to the usb controller hardware. + * unlike the urb model, (de)multiplexing layers are not required. + * (so this api could slash overhead if used on the host side...) + * + * note that device side usb controllers commonly differ in how many + * endpoints they support, as well as their capabilities. + */ +struct usb_ep_ops { + int (*enable) (struct usb_ep *ep, + const struct usb_endpoint_descriptor *desc); + int (*disable) (struct usb_ep *ep); + + struct usb_request *(*alloc_request) (struct usb_ep *ep, + gfp_t gfp_flags); + void (*free_request) (struct usb_ep *ep, struct usb_request *req); + + void *(*alloc_buffer) (struct usb_ep *ep, unsigned bytes, + dma_addr_t *dma, gfp_t gfp_flags); + void (*free_buffer) (struct usb_ep *ep, void *buf, dma_addr_t dma, + unsigned bytes); + // NOTE: on 2.6, drivers may also use dma_map() and + // dma_sync_single_*() to directly manage dma overhead. + + int (*queue) (struct usb_ep *ep, struct usb_request *req, + gfp_t gfp_flags); + int (*dequeue) (struct usb_ep *ep, struct usb_request *req); + + int (*set_halt) (struct usb_ep *ep, int value); + int (*fifo_status) (struct usb_ep *ep); + void (*fifo_flush) (struct usb_ep *ep); +}; + +/*-------------------------------------------------------------------------*/ + +/** + * usb_ep_enable - configure endpoint, making it usable + * @ep:the endpoint being configured. may not be the endpoint named "ep0". + * drivers discover endpoints through the ep_list of a usb_gadget. + * @desc:descriptor for desired behavior. caller guarantees this pointer + * remains valid until the endpoint is disabled; the data byte order + * is little-endian (usb-standard). + * + * when configurations are set, or when interface settings change, the driver + * will enable or disable the relevant endpoints. while it is enabled, an + * endpoint may be used for i/o until the driver receives a disconnect() from + * the host or until the endpoint is disabled. + * + * the ep0 implementation (which calls this routine) must ensure that the + * hardware capabilities of each endpoint match the descriptor provided + * for it. for example, an endpoint named "ep2in-bulk" would be usable + * for interrupt transfers as well as bulk, but it likely couldn't be used + * for iso transfers or for endpoint 14. some endpoints are fully + * configurable, with more generic names like "ep-a". (remember that for + * USB, "in" means "towards the USB master".) + * + * returns zero, or a negative error code. + */ +static inline int +usb_ep_enable (struct usb_ep *ep, const struct usb_endpoint_descriptor *desc) +{ + return ep->ops->enable (ep, desc); +} + +/** + * usb_ep_disable - endpoint is no longer usable + * @ep:the endpoint being unconfigured. may not be the endpoint named "ep0". + * + * no other task may be using this endpoint when this is called. + * any pending and uncompleted requests will complete with status + * indicating disconnect (-ESHUTDOWN) before this call returns. + * gadget drivers must call usb_ep_enable() again before queueing + * requests to the endpoint. + * + * returns zero, or a negative error code. + */ +static inline int +usb_ep_disable (struct usb_ep *ep) +{ + return ep->ops->disable (ep); +} + +/** + * usb_ep_alloc_request - allocate a request object to use with this endpoint + * @ep:the endpoint to be used with with the request + * @gfp_flags:GFP_* flags to use + * + * Request objects must be allocated with this call, since they normally + * need controller-specific setup and may even need endpoint-specific + * resources such as allocation of DMA descriptors. + * Requests may be submitted with usb_ep_queue(), and receive a single + * completion callback. Free requests with usb_ep_free_request(), when + * they are no longer needed. + * + * Returns the request, or null if one could not be allocated. + */ +static inline struct usb_request * +usb_ep_alloc_request (struct usb_ep *ep, gfp_t gfp_flags) +{ + return ep->ops->alloc_request (ep, gfp_flags); +} + +/** + * usb_ep_free_request - frees a request object + * @ep:the endpoint associated with the request + * @req:the request being freed + * + * Reverses the effect of usb_ep_alloc_request(). + * Caller guarantees the request is not queued, and that it will + * no longer be requeued (or otherwise used). + */ +static inline void +usb_ep_free_request (struct usb_ep *ep, struct usb_request *req) +{ + ep->ops->free_request (ep, req); +} +#if 0 +/** + * usb_ep_alloc_buffer - allocate an I/O buffer + * @ep:the endpoint associated with the buffer + * @len:length of the desired buffer + * @dma:pointer to the buffer's DMA address; must be valid + * @gfp_flags:GFP_* flags to use + * + * Returns a new buffer, or null if one could not be allocated. + * The buffer is suitably aligned for dma, if that endpoint uses DMA, + * and the caller won't have to care about dma-inconsistency + * or any hidden "bounce buffer" mechanism. No additional per-request + * DMA mapping will be required for such buffers. + * Free it later with usb_ep_free_buffer(). + * + * You don't need to use this call to allocate I/O buffers unless you + * want to make sure drivers don't incur costs for such "bounce buffer" + * copies or per-request DMA mappings. + */ +static inline void * +usb_ep_alloc_buffer (struct usb_ep *ep, unsigned len, dma_addr_t *dma, + gfp_t gfp_flags) +{ + return ep->ops->alloc_buffer (ep, len, dma, gfp_flags); +} + +/** + * usb_ep_free_buffer - frees an i/o buffer + * @ep:the endpoint associated with the buffer + * @buf:CPU view address of the buffer + * @dma:the buffer's DMA address + * @len:length of the buffer + * + * reverses the effect of usb_ep_alloc_buffer(). + * caller guarantees the buffer will no longer be accessed + */ +static inline void +usb_ep_free_buffer (struct usb_ep *ep, void *buf, dma_addr_t dma, unsigned len) +{ + ep->ops->free_buffer (ep, buf, dma, len); +} +#endif +/** + * usb_ep_queue - queues (submits) an I/O request to an endpoint. + * @ep:the endpoint associated with the request + * @req:the request being submitted + * @gfp_flags: GFP_* flags to use in case the lower level driver couldn't + * pre-allocate all necessary memory with the request. + * + * This tells the device controller to perform the specified request through + * that endpoint (reading or writing a buffer). When the request completes, + * including being canceled by usb_ep_dequeue(), the request's completion + * routine is called to return the request to the driver. Any endpoint + * (except control endpoints like ep0) may have more than one transfer + * request queued; they complete in FIFO order. Once a gadget driver + * submits a request, that request may not be examined or modified until it + * is given back to that driver through the completion callback. + * + * Each request is turned into one or more packets. The controller driver + * never merges adjacent requests into the same packet. OUT transfers + * will sometimes use data that's already buffered in the hardware. + * Drivers can rely on the fact that the first byte of the request's buffer + * always corresponds to the first byte of some USB packet, for both + * IN and OUT transfers. + * + * Bulk endpoints can queue any amount of data; the transfer is packetized + * automatically. The last packet will be short if the request doesn't fill it + * out completely. Zero length packets (ZLPs) should be avoided in portable + * protocols since not all usb hardware can successfully handle zero length + * packets. (ZLPs may be explicitly written, and may be implicitly written if + * the request 'zero' flag is set.) Bulk endpoints may also be used + * for interrupt transfers; but the reverse is not true, and some endpoints + * won't support every interrupt transfer. (Such as 768 byte packets.) + * + * Interrupt-only endpoints are less functional than bulk endpoints, for + * example by not supporting queueing or not handling buffers that are + * larger than the endpoint's maxpacket size. They may also treat data + * toggle differently. + * + * Control endpoints ... after getting a setup() callback, the driver queues + * one response (even if it would be zero length). That enables the + * status ack, after transfering data as specified in the response. Setup + * functions may return negative error codes to generate protocol stalls. + * (Note that some USB device controllers disallow protocol stall responses + * in some cases.) When control responses are deferred (the response is + * written after the setup callback returns), then usb_ep_set_halt() may be + * used on ep0 to trigger protocol stalls. + * + * For periodic endpoints, like interrupt or isochronous ones, the usb host + * arranges to poll once per interval, and the gadget driver usually will + * have queued some data to transfer at that time. + * + * Returns zero, or a negative error code. Endpoints that are not enabled + * report errors; errors will also be + * reported when the usb peripheral is disconnected. + */ +static inline int +usb_ep_queue (struct usb_ep *ep, struct usb_request *req, gfp_t gfp_flags) +{ + DBG_8195A_OTG("%s, gfp_flags = %x\n",__func__, gfp_flags); + return ep->ops->queue (ep, req, gfp_flags); +} + +/** + * usb_ep_dequeue - dequeues (cancels, unlinks) an I/O request from an endpoint + * @ep:the endpoint associated with the request + * @req:the request being canceled + * + * if the request is still active on the endpoint, it is dequeued and its + * completion routine is called (with status -ECONNRESET); else a negative + * error code is returned. + * + * note that some hardware can't clear out write fifos (to unlink the request + * at the head of the queue) except as part of disconnecting from usb. such + * restrictions prevent drivers from supporting configuration changes, + * even to configuration zero (a "chapter 9" requirement). + */ +static inline int usb_ep_dequeue (struct usb_ep *ep, struct usb_request *req) +{ + return ep->ops->dequeue (ep, req); +} +#if 0 +/** + * usb_ep_set_halt - sets the endpoint halt feature. + * @ep: the non-isochronous endpoint being stalled + * + * Use this to stall an endpoint, perhaps as an error report. + * Except for control endpoints, + * the endpoint stays halted (will not stream any data) until the host + * clears this feature; drivers may need to empty the endpoint's request + * queue first, to make sure no inappropriate transfers happen. + * + * Note that while an endpoint CLEAR_FEATURE will be invisible to the + * gadget driver, a SET_INTERFACE will not be. To reset endpoints for the + * current altsetting, see usb_ep_clear_halt(). When switching altsettings, + * it's simplest to use usb_ep_enable() or usb_ep_disable() for the endpoints. + * + * Returns zero, or a negative error code. On success, this call sets + * underlying hardware state that blocks data transfers. + * Attempts to halt IN endpoints will fail (returning -EAGAIN) if any + * transfer requests are still queued, or if the controller hardware + * (usually a FIFO) still holds bytes that the host hasn't collected. + */ +static inline int +usb_ep_set_halt (struct usb_ep *ep) +{ + return ep->ops->set_halt (ep, 1); +} + +/** + * usb_ep_clear_halt - clears endpoint halt, and resets toggle + * @ep:the bulk or interrupt endpoint being reset + * + * Use this when responding to the standard usb "set interface" request, + * for endpoints that aren't reconfigured, after clearing any other state + * in the endpoint's i/o queue. + * + * Returns zero, or a negative error code. On success, this call clears + * the underlying hardware state reflecting endpoint halt and data toggle. + * Note that some hardware can't support this request (like pxa2xx_udc), + * and accordingly can't correctly implement interface altsettings. + */ +static inline int +usb_ep_clear_halt (struct usb_ep *ep) +{ + return ep->ops->set_halt (ep, 0); +} + +/** + * usb_ep_fifo_status - returns number of bytes in fifo, or error + * @ep: the endpoint whose fifo status is being checked. + * + * FIFO endpoints may have "unclaimed data" in them in certain cases, + * such as after aborted transfers. Hosts may not have collected all + * the IN data written by the gadget driver (and reported by a request + * completion). The gadget driver may not have collected all the data + * written OUT to it by the host. Drivers that need precise handling for + * fault reporting or recovery may need to use this call. + * + * This returns the number of such bytes in the fifo, or a negative + * errno if the endpoint doesn't use a FIFO or doesn't support such + * precise handling. + */ +static inline int +usb_ep_fifo_status (struct usb_ep *ep) +{ + if (ep->ops->fifo_status) + return ep->ops->fifo_status (ep); + else + return -EOPNOTSUPP; +} + +/** + * usb_ep_fifo_flush - flushes contents of a fifo + * @ep: the endpoint whose fifo is being flushed. + * + * This call may be used to flush the "unclaimed data" that may exist in + * an endpoint fifo after abnormal transaction terminations. The call + * must never be used except when endpoint is not being used for any + * protocol translation. + */ +static inline void +usb_ep_fifo_flush (struct usb_ep *ep) +{ + if (ep->ops->fifo_flush) + ep->ops->fifo_flush (ep); +} +#endif + +/*-------------------------------------------------------------------------*/ +/** + * struct usb_gadget - represents a usb slave device + * @ops: Function pointers used to access hardware-specific operations. + * @ep0: Endpoint zero, used when reading or writing responses to + * driver setup() requests + * @ep_list: List of other endpoints supported by the device. + * @speed: Speed of current connection to USB host. + * @is_dualspeed: True if the controller supports both high and full speed + * operation. If it does, the gadget driver must also support both. + * @is_otg: True if the USB device port uses a Mini-AB jack, so that the + * gadget driver must provide a USB OTG descriptor. + * @is_a_peripheral: False unless is_otg, the "A" end of a USB cable + * is in the Mini-AB jack, and HNP has been used to switch roles + * so that the "A" device currently acts as A-Peripheral, not A-Host. + * @a_hnp_support: OTG device feature flag, indicating that the A-Host + * supports HNP at this port. + * @a_alt_hnp_support: OTG device feature flag, indicating that the A-Host + * only supports HNP on a different root port. + * @b_hnp_enable: OTG device feature flag, indicating that the A-Host + * enabled HNP support. + * @name: Identifies the controller hardware type. Used in diagnostics + * and sometimes configuration. + * @dev: Driver model state for this abstract device. + * + * Gadgets have a mostly-portable "gadget driver" implementing device + * functions, handling all usb configurations and interfaces. Gadget + * drivers talk to hardware-specific code indirectly, through ops vectors. + * That insulates the gadget driver from hardware details, and packages + * the hardware endpoints through generic i/o queues. The "usb_gadget" + * and "usb_ep" interfaces provide that insulation from the hardware. + * + * Except for the driver data, all fields in this structure are + * read-only to the gadget driver. That driver data is part of the + * "driver model" infrastructure in 2.6 (and later) kernels, and for + * earlier systems is grouped in a similar structure that's not known + * to the rest of the kernel. + * + * Values of the three OTG device feature flags are updated before the + * setup() call corresponding to USB_REQ_SET_CONFIGURATION, and before + * driver suspend() calls. They are valid only when is_otg, and when the + * device is acting as a B-Peripheral (so is_a_peripheral is false). + */ + +struct usb_gadget { + /* readonly to gadget driver */ + const struct usb_gadget_ops *ops; + struct usb_ep *ep0; + _LIST ep_list; /* of usb_ep */ //ModifiedByJD + enum usb_device_speed speed; + enum usb_device_speed max_speed; + unsigned is_dualspeed:1; + unsigned is_otg:1; + unsigned is_a_peripheral:1; + unsigned b_hnp_enable:1; + unsigned a_hnp_support:1; + unsigned a_alt_hnp_support:1; + const char *name; + struct zero_dev dev; + void *driver_data; + void *device; +}; + + + +//struct usb_gadget; + +/* the rest of the api to the controller hardware: device operations, + * which don't involve endpoints (or i/o). + */ +struct usb_gadget_ops { + int (*get_frame)(struct usb_gadget *); + int (*wakeup)(struct usb_gadget *); + int (*set_selfpowered) (struct usb_gadget *, int is_selfpowered); + int (*vbus_session) (struct usb_gadget *, int is_active); + int (*vbus_draw) (struct usb_gadget *, unsigned mA); + int (*pullup) (struct usb_gadget *, int is_on); + int (*ioctl)(struct usb_gadget *, + unsigned code, unsigned long param); +}; + + +#if 0 //wei add +static inline void * +dev_get_drvdata (struct device *dev) +{ + return dev->driver_data; +} + +static inline void +dev_set_drvdata (struct device *dev, void *data) +{ + dev->driver_data = data; +} +#endif +#if 0 +static inline void set_gadget_data (struct usb_gadget *gadget, void *data) + { dev_set_drvdata (gadget->dev, data); } +// { gadget->dev->driver_data = data; } +static inline void *get_gadget_data (struct usb_gadget *gadget) + { return dev_get_drvdata (gadget->dev); } +// { return gadget->dev->driver_data;} +#endif + +/* iterates the non-control endpoints; 'tmp' is a struct usb_ep pointer */ +#define gadget_for_each_ep(tmp,gadget) \ + list_for_each_entry(tmp, &(gadget)->ep_list, ep_list) + +#if 0 +/** + * usb_gadget_frame_number - returns the current frame number + * @gadget: controller that reports the frame number + * + * Returns the usb frame number, normally eleven bits from a SOF packet, + * or negative errno if this device doesn't support this capability. + */ +static inline int usb_gadget_frame_number (struct usb_gadget *gadget) +{ + return gadget->ops->get_frame(gadget); +} + +/** + * usb_gadget_wakeup - tries to wake up the host connected to this gadget + * @gadget: controller used to wake up the host + * + * Returns zero on success, else negative error code if the hardware + * doesn't support such attempts, or its support has not been enabled + * by the usb host. Drivers must return device descriptors that report + * their ability to support this, or hosts won't enable it. + * + * This may also try to use SRP to wake the host and start enumeration, + * even if OTG isn't otherwise in use. OTG devices may also start + * remote wakeup even when hosts don't explicitly enable it. + */ +static inline int usb_gadget_wakeup (struct usb_gadget *gadget) +{ + if (!gadget->ops->wakeup) + return -EOPNOTSUPP; + return gadget->ops->wakeup (gadget); +} + +/** + * usb_gadget_set_selfpowered - sets the device selfpowered feature. + * @gadget:the device being declared as self-powered + * + * this affects the device status reported by the hardware driver + * to reflect that it now has a local power supply. + * + * returns zero on success, else negative errno. + */ +static inline int +usb_gadget_set_selfpowered (struct usb_gadget *gadget) +{ +xprintf("%s %s[%d]\n",__FILE__,__FUNCTION__,__LINE__); + if (!gadget->ops->set_selfpowered) + return -EOPNOTSUPP; + return gadget->ops->set_selfpowered (gadget, 1); +} + +/** + * usb_gadget_clear_selfpowered - clear the device selfpowered feature. + * @gadget:the device being declared as bus-powered + * + * this affects the device status reported by the hardware driver. + * some hardware may not support bus-powered operation, in which + * case this feature's value can never change. + * + * returns zero on success, else negative errno. + */ +static inline int +usb_gadget_clear_selfpowered (struct usb_gadget *gadget) +{ + if (!gadget->ops->set_selfpowered) + return -EOPNOTSUPP; + return gadget->ops->set_selfpowered (gadget, 0); +} + +/** + * usb_gadget_vbus_connect - Notify controller that VBUS is powered + * @gadget:The device which now has VBUS power. + * + * This call is used by a driver for an external transceiver (or GPIO) + * that detects a VBUS power session starting. Common responses include + * resuming the controller, activating the D+ (or D-) pullup to let the + * host detect that a USB device is attached, and starting to draw power + * (8mA or possibly more, especially after SET_CONFIGURATION). + * + * Returns zero on success, else negative errno. + */ +static inline int +usb_gadget_vbus_connect(struct usb_gadget *gadget) +{ + if (!gadget->ops->vbus_session) + return -EOPNOTSUPP; + return gadget->ops->vbus_session (gadget, 1); +} +#endif +/** + * usb_gadget_vbus_draw - constrain controller's VBUS power usage + * @gadget:The device whose VBUS usage is being described + * @mA:How much current to draw, in milliAmperes. This should be twice + * the value listed in the configuration descriptor bMaxPower field. + * + * This call is used by gadget drivers during SET_CONFIGURATION calls, + * reporting how much power the device may consume. For example, this + * could affect how quickly batteries are recharged. + * + * Returns zero on success, else negative errno. + */ +static inline int +usb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA) +{ + if (!gadget->ops->vbus_draw) + return -1;//ModifiedByJD + return gadget->ops->vbus_draw (gadget, mA); +} +#if 0 +/** + * usb_gadget_vbus_disconnect - notify controller about VBUS session end + * @gadget:the device whose VBUS supply is being described + * + * This call is used by a driver for an external transceiver (or GPIO) + * that detects a VBUS power session ending. Common responses include + * reversing everything done in usb_gadget_vbus_connect(). + * + * Returns zero on success, else negative errno. + */ +static inline int +usb_gadget_vbus_disconnect(struct usb_gadget *gadget) +{ + if (!gadget->ops->vbus_session) + return -EOPNOTSUPP; + return gadget->ops->vbus_session (gadget, 0); +} + +/** + * usb_gadget_connect - software-controlled connect to USB host + * @gadget:the peripheral being connected + * + * Enables the D+ (or potentially D-) pullup. The host will start + * enumerating this gadget when the pullup is active and a VBUS session + * is active (the link is powered). This pullup is always enabled unless + * usb_gadget_disconnect() has been used to disable it. + * + * Returns zero on success, else negative errno. + */ +static inline int +usb_gadget_connect (struct usb_gadget *gadget) +{ + if (!gadget->ops->pullup) + return -EOPNOTSUPP; + return gadget->ops->pullup (gadget, 1); +} + +/** + * usb_gadget_disconnect - software-controlled disconnect from USB host + * @gadget:the peripheral being disconnected + * + * Disables the D+ (or potentially D-) pullup, which the host may see + * as a disconnect (when a VBUS session is active). Not all systems + * support software pullup controls. + * + * This routine may be used during the gadget driver bind() call to prevent + * the peripheral from ever being visible to the USB host, unless later + * usb_gadget_connect() is called. For example, user mode components may + * need to be activated before the system can talk to hosts. + * + * Returns zero on success, else negative errno. + */ +static inline int +usb_gadget_disconnect (struct usb_gadget *gadget) +{ + if (!gadget->ops->pullup) + return -EOPNOTSUPP; + return gadget->ops->pullup (gadget, 0); +} + +#endif + +/*-------------------------------------------------------------------------*/ + +/** + * struct usb_gadget_driver - driver for usb 'slave' devices + * @function: String describing the gadget's function + * @speed: Highest speed the driver handles. + * @bind: Invoked when the driver is bound to a gadget, usually + * after registering the driver. + * At that point, ep0 is fully initialized, and ep_list holds + * the currently-available endpoints. + * Called in a context that permits sleeping. + * @setup: Invoked for ep0 control requests that aren't handled by + * the hardware level driver. Most calls must be handled by + * the gadget driver, including descriptor and configuration + * management. The 16 bit members of the setup data are in + * USB byte order. Called in_interrupt; this may not sleep. Driver + * queues a response to ep0, or returns negative to stall. + * @disconnect: Invoked after all transfers have been stopped, + * when the host is disconnected. May be called in_interrupt; this + * may not sleep. Some devices can't detect disconnect, so this might + * not be called except as part of controller shutdown. + * @unbind: Invoked when the driver is unbound from a gadget, + * usually from rmmod (after a disconnect is reported). + * Called in a context that permits sleeping. + * @suspend: Invoked on USB suspend. May be called in_interrupt. + * @resume: Invoked on USB resume. May be called in_interrupt. + * @driver: Driver model state for this driver. + * + * Devices are disabled till a gadget driver successfully bind()s, which + * means the driver will handle setup() requests needed to enumerate (and + * meet "chapter 9" requirements) then do some useful work. + * + * If gadget->is_otg is true, the gadget driver must provide an OTG + * descriptor during enumeration, or else fail the bind() call. In such + * cases, no USB traffic may flow until both bind() returns without + * having called usb_gadget_disconnect(), and the USB host stack has + * initialized. + * + * Drivers use hardware-specific knowledge to configure the usb hardware. + * endpoint addressing is only one of several hardware characteristics that + * are in descriptors the ep0 implementation returns from setup() calls. + * + * Except for ep0 implementation, most driver code shouldn't need change to + * run on top of different usb controllers. It'll use endpoints set up by + * that ep0 implementation. + * + * The usb controller driver handles a few standard usb requests. Those + * include set_address, and feature flags for devices, interfaces, and + * endpoints (the get_status, set_feature, and clear_feature requests). + * + * Accordingly, the driver's setup() callback must always implement all + * get_descriptor requests, returning at least a device descriptor and + * a configuration descriptor. Drivers must make sure the endpoint + * descriptors match any hardware constraints. Some hardware also constrains + * other descriptors. (The pxa250 allows only configurations 1, 2, or 3). + * + * The driver's setup() callback must also implement set_configuration, + * and should also implement set_interface, get_configuration, and + * get_interface. Setting a configuration (or interface) is where + * endpoints should be activated or (config 0) shut down. + * + * (Note that only the default control endpoint is supported. Neither + * hosts nor devices generally support control traffic except to ep0.) + * + * Most devices will ignore USB suspend/resume operations, and so will + * not provide those callbacks. However, some may need to change modes + * when the host is not longer directing those activities. For example, + * local controls (buttons, dials, etc) may need to be re-enabled since + * the (remote) host can't do that any longer; or an error state might + * be cleared, to make the device behave identically whether or not + * power is maintained. + */ +struct usb_gadget_driver { + char *function; + enum usb_device_speed *speed; + int (*bind)(struct usb_gadget *, + struct usb_gadget_driver *); + void (*unbind)(struct usb_gadget *); + int (*setup)(struct usb_gadget *, const struct usb_ctrlrequest *); + //CommentedByJD int (*setup)(dwc_otg_pcd_t *, const struct usb_ctrlrequest *);//ModifiedByJD + void (*disconnect)(struct usb_gadget *); + void (*suspend)(struct usb_gadget *); + void (*resume)(struct usb_gadget *); + + // FIXME support safe rmmod +// struct device_driver *driver; + void * driver; +}; + + + +/*-------------------------------------------------------------------------*/ + +/* driver modules register and unregister, as usual. + * these calls must be made in a context that can sleep. + * + * these will usually be implemented directly by the hardware-dependent + * usb bus interface driver, which will only support a single driver. + */ + +/** + * usb_gadget_register_driver - register a gadget driver + * @driver:the driver being registered + * + * Call this in your gadget driver's module initialization function, + * to tell the underlying usb controller driver about your driver. + * The driver's bind() function will be called to bind it to a + * gadget before this registration call returns. It's expected that + * the bind() functions will be in init sections. + * This function must be called in a context that can sleep. + */ +int usb_gadget_register_driver (struct usb_gadget_driver *driver); + +/** + * usb_gadget_unregister_driver - unregister a gadget driver + * @driver:the driver being unregistered + * + * Call this in your gadget driver's module cleanup function, + * to tell the underlying usb controller that your driver is + * going away. If the controller is connected to a USB host, + * it will first disconnect(). The driver is also requested + * to unbind() and clean up any device state, before this procedure + * finally returns. It's expected that the unbind() functions + * will in in exit sections, so may not be linked in some kernels. + * This function must be called in a context that can sleep. + */ +int usb_gadget_unregister_driver (struct usb_gadget_driver *driver); + +/** + * usb_free_descriptors - free descriptors returned by usb_copy_descriptors() + * @v: vector of descriptors + */ +static inline void usb_free_descriptors(struct usb_descriptor_header **v) +{ + RtlMfree((u8 *)v, sizeof(struct usb_descriptor_header)); +} + +/*-------------------------------------------------------------------------*/ + +/* utility to simplify dealing with string descriptors */ + +/** + * struct usb_string - wraps a C string and its USB id + * @id:the (nonzero) ID for this string + * @s:the string, in UTF-8 encoding + * + * If you're using usb_gadget_get_string(), use this to wrap a string + * together with its ID. + */ +struct usb_string { + u8 id; + const char *s; +}; + +/** + * struct usb_gadget_strings - a set of USB strings in a given language + * @language:identifies the strings' language (0x0409 for en-us) + * @strings:array of strings with their ids + * + * If you're using usb_gadget_get_string(), use this to wrap all the + * strings for a given language. + */ +struct usb_gadget_strings { + u16 language; /* 0x0409 for en-us */ + struct usb_string *strings; +}; + + +/** + * gadget_is_dualspeed - return true iff the hardware handles high speed + * @g: controller that might support both high and full speeds + */ +static inline int gadget_is_dualspeed(struct usb_gadget *g) +{ + return g->max_speed >= USB_SPEED_HIGH; +} +#if 0 +/** + * gadget_is_superspeed() - return true if the hardware handles superspeed + * @g: controller that might support superspeed + */ +static inline int gadget_is_superspeed(struct usb_gadget *g) +{ + return g->max_speed >= USB_SPEED_SUPER; +} +#endif +/* put descriptor for string with that id into buf (buflen >= 256) */ +int usb_gadget_get_string (struct usb_gadget_strings *table, int id, u8 *buf); + +/*-------------------------------------------------------------------------*/ + +/* utility to simplify managing config descriptors */ + +/* write vector of descriptors into buffer */ +int usb_descriptor_fillbuf(void *, unsigned, + const struct usb_descriptor_header **); + +/* build config descriptor from single descriptor vector */ +int usb_gadget_config_buf(const struct usb_config_descriptor *config, + void *buf, unsigned buflen, const struct usb_descriptor_header **desc); + +/*-------------------------------------------------------------------------*/ + +static inline void set_gadget_data(struct usb_gadget *gadget, void *data) + { gadget->driver_data = data; } +static inline void *get_gadget_data(struct usb_gadget *gadget) + { return gadget->driver_data; } + +/* utility wrapping a simple endpoint selection policy */ +#if 1 +extern struct usb_ep *usb_ep_autoconfig (struct usb_gadget *, + struct usb_endpoint_descriptor *);// ULINKER_DEVINIT; + +extern void usb_ep_autoconfig_reset (struct usb_gadget *);// ULINKER_DEVINIT; +#endif +//#endif /* __KERNEL__ */ + +#endif /* __LINUX_USB_GADGET_H */ diff --git a/lib/fwlib/ram_lib/usb_otg/include/usb_ulinker.h b/lib/fwlib/ram_lib/usb_otg/include/usb_ulinker.h new file mode 100644 index 0000000..afcfeaf --- /dev/null +++ b/lib/fwlib/ram_lib/usb_otg/include/usb_ulinker.h @@ -0,0 +1,74 @@ +#ifndef __LINUX_USB_ULINKER_H +#define __LINUX_USB_ULINKER_H + +//#include "linux/autoconf.h" + +//#ifndef CONFIG_RTL_ULINKER_CUSTOMIZATION +#if 1//ModifiedByJD +#define ULINKER_ETHER_VID 0x0BDA +#define ULINKER_ETHER_PID 0x8195 +#define ULINKER_MANUFACTURER "Realtek Semicoonductor Corp." + +#define ULINKER_WINTOOLS_GUID "1CACC490-055C-4035-A026-1DAB0BDA8196" +#define ULINKER_WINTOOLS_DISPLAY_NAME "Realtek RTL8196EU Universal Linker" +#define ULINKER_WINTOOLS_CONTACT "nicfae@realtek.com.tw" +#define ULINKER_WINTOOLS_DISPLAY_VERSION "v1.0.0.0" +#define ULINKER_WINTOOLS_HELP_LINK "http://www.realtek.com.tw" +#define ULINKER_WINTOOLS_PUBLISHER ULINKER_MANUFACTURER +#define ULINKER_WINTOOLS_TARGET_DIR ULINKER_WINTOOLS_DISPLAY_NAME +#else +#define ULINKER_ETHER_VID CONFIG_RTL_ULINKER_VID +#define ULINKER_ETHER_PID CONFIG_RTL_ULINKER_PID +#define ULINKER_STORAGE_VID CONFIG_RTL_ULINKER_VID_S +#define ULINKER_STORAGE_PID CONFIG_RTL_ULINKER_PID_S +#define ULINKER_MANUFACTURER CONFIG_RTL_ULINKER_MANUFACTURE + +#define ULINKER_WINTOOLS_GUID CONFIG_RTL_ULINKER_WINTOOLS_GUID +#define ULINKER_WINTOOLS_DISPLAY_NAME CONFIG_RTL_ULINKER_WINTOOLS_DISPLAY_NAME +#define ULINKER_WINTOOLS_CONTACT CONFIG_RTL_ULINKER_WINTOOLS_CONTACT +#define ULINKER_WINTOOLS_DISPLAY_VERSION CONFIG_RTL_ULINKER_WINTOOLS_DISPLAY_VERSION +#define ULINKER_WINTOOLS_HELP_LINK CONFIG_RTL_ULINKER_WINTOOLS_HELP_LINK +#define ULINKER_WINTOOLS_PUBLISHER ULINKER_MANUFACTURER +#define ULINKER_WINTOOLS_TARGET_DIR ULINKER_WINTOOLS_DISPLAY_NAME +#endif + +//------------------------------------------------ +// if you don't have a specific PID for storage, don't change following define of storage mode. +// +// begin: don't change +#ifndef ULINKER_STORAGE_VID +#define ULINKER_STORAGE_VID 0x0BDA +#define ULINKER_STORAGE_PID 0x8197 +#endif + +#define ULINKER_STORAGE_VID_STR "USB Ether " +#define ULINKER_STORAGE_PID_DISK_STR "Driver DISC" +#define ULINKER_STORAGE_PID_CDROM_STR "Driver CDROM" + +#define ULINKER_WINTOOLS_DRIVER_PATH "Driver" +// end: don't change +//------------------------------------------------ + + +//---------------------------------------------------------------------- +#if defined(CONFIG_RTL_ULINKER) + +#define ULINKER_DEVINIT +#define ULINKER_DEVINITDATA +#define ULINKER_DEVINITCONST +#define ULINKER_DEVEXIT +#define ULINKER_DEVEXITDATA +#define ULINKER_DEVEXITCONST + +#else + +#define ULINKER_DEVINIT __devinit +#define ULINKER_DEVINITDATA __devinitdata +#define ULINKER_DEVINITCONST __devinitconst +#define ULINKER_DEVEXIT __devexit +#define ULINKER_DEVEXITDATA __devexitdata +#define ULINKER_DEVEXITCONST __devexitconst + +#endif + +#endif /* __LINUX_USB_ULINKER_H */ diff --git a/lib/fwlib/ram_lib/wlan/realtek/wlan_ram_map/rom/rom_wlan_ram_map.h b/lib/fwlib/ram_lib/wlan/realtek/wlan_ram_map/rom/rom_wlan_ram_map.h new file mode 100644 index 0000000..2944d18 --- /dev/null +++ b/lib/fwlib/ram_lib/wlan/realtek/wlan_ram_map/rom/rom_wlan_ram_map.h @@ -0,0 +1,9 @@ +#ifndef ROM_WLAN_RAM_MAP_H +#define ROM_WLAN_RAM_MAP_H + +struct _rom_wlan_ram_map { + unsigned char * (*rtw_malloc)(unsigned int sz); + void (*rtw_mfree)(unsigned char *pbuf, unsigned int sz); +}; + +#endif /* ROM_WLAN_RAM_MAP_H */ diff --git a/lib/fwlib/rtl8195a/rtl8195a.h b/lib/fwlib/rtl8195a/rtl8195a.h new file mode 100644 index 0000000..83c47e7 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a.h @@ -0,0 +1,157 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#ifndef _HAL_8195A_H_ +#define _HAL_8195A_H_ + +#include "platform_autoconf.h" +#include "basic_types.h" +#include "section_config.h" +#include "rtl8195a_sys_on.h" +#include "rtl8195a_peri_on.h" +#include "hal_platform.h" +#include "hal_pinmux.h" +#include "hal_api.h" +#include "hal_peri_on.h" +#include "hal_misc.h" +#include "hal_irqn.h" +#include "hal_vector_table.h" +#include "hal_diag.h" +#include "hal_spi_flash.h" +#include "hal_timer.h" +#include "hal_util.h" +#include "hal_efuse.h" +#include "hal_soc_ps_monitor.h" +#include "diag.h" +#include "hal_common.h" +#include "hal_soc_ps_monitor.h" + +/* ---------------------------------------------------------------------------- + -- Cortex M3 Core Configuration + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Cortex_Core_Configuration Cortex M0 Core Configuration + * @{ + */ + +#define __CM3_REV 0x0200 /**< Core revision r0p0 */ +#define __MPU_PRESENT 1 /**< Defines if an MPU is present or not */ +#define __NVIC_PRIO_BITS 4 /**< Number of priority bits implemented in the NVIC */ +#define __Vendor_SysTickConfig 1 /**< Vendor specific implementation of SysTickConfig is defined */ + +#include "core_cm3.h" + +#ifdef CONFIG_TIMER_EN +#include "hal_timer.h" +#endif + +#ifdef CONFIG_GDMA_EN +#include "hal_gdma.h" +#include "rtl8195a_gdma.h" +#endif + +#ifdef CONFIG_GPIO_EN +#include "hal_gpio.h" +#include "rtl8195a_gpio.h" +#endif + +#ifdef CONFIG_SPI_COM_EN +#include "hal_ssi.h" +#include "rtl8195a_ssi.h" +#endif + +#ifdef CONFIG_UART_EN +#include "hal_uart.h" +#include "rtl8195a_uart.h" +#endif + +#ifdef CONFIG_I2C_EN +#include "hal_i2c.h" +#include "rtl8195a_i2c.h" +#endif + +#ifdef CONFIG_PCM_EN +#include "hal_pcm.h" +#include "rtl8195a_pcm.h" +#endif + +#ifdef CONFIG_PWM_EN +#include "hal_pwm.h" +#include "rtl8195a_pwm.h" +#endif + +#ifdef CONFIG_I2S_EN +#include "hal_i2s.h" +#include "rtl8195a_i2s.h" +#endif + +#ifdef CONFIG_DAC_EN +#include "hal_dac.h" +#include "rtl8195a_dac.h" +#endif + + +#include "hal_adc.h" +#include "rtl8195a_adc.h" + + +#ifdef CONFIG_SDR_EN +#endif + +#ifdef CONFIG_SPIC_EN +#endif + +#ifdef CONFIG_SDIO_DEVICE_EN +#include "hal_sdio.h" +#endif + +#ifdef CONFIG_NFC_EN +#include "hal_nfc.h" +#include "rtl8195a_nfc.h" +#endif + +#ifdef CONFIG_WDG +#include "rtl8195a_wdt.h" +#endif + +#ifdef CONFIG_USB_EN +#include "hal_usb.h" +#include "rtl8195a_usb.h" +#endif + + +// firmware information, located at the header of Image2 +#define FW_VERSION (0x0100) +#define FW_SUBVERSION (0x0001) +#define FW_CHIP_ID (0x8195) +#define FW_CHIP_VER (0x01) +#define FW_BUS_TYPE (0x01) // the iNIC firmware type: USB/SDIO +#define FW_INFO_RSV1 (0x00) // the firmware information reserved +#define FW_INFO_RSV2 (0x00) // the firmware information reserved +#define FW_INFO_RSV3 (0x00) // the firmware information reserved +#define FW_INFO_RSV4 (0x00) // the firmware information reserved + +#define FLASH_RESERVED_DATA_BASE 0x8000 // reserve 32K for Image1 +#define FLASH_SYSTEM_DATA_ADDR 0x9000 // reserve 32K+4K for Image1 + Reserved data +// Flash Map for Calibration data +#define FLASH_CAL_DATA_BASE 0xA000 +#define FLASH_CAL_DATA_ADDR(_offset) (FLASH_CAL_DATA_BASE + _offset) +#define FLASH_CAL_DATA_SIZE 0x1000 +#define FLASH_SECTOR_SIZE 0x1000 +// SPIC Calibration Data +#define FLASH_SPIC_PARA_OFFSET 0x80 +#define FLASH_SPIC_PARA_BASE (FLASH_SYSTEM_DATA_ADDR+FLASH_SPIC_PARA_OFFSET) +// SDRC Calibration Data +#define FLASH_SDRC_PARA_OFFSET 0x180 +#define FLASH_SDRC_PARA_BASE (FLASH_SYSTEM_DATA_ADDR+FLASH_SDRC_PARA_OFFSET) +// ADC Calibration Data +#define FLASH_ADC_PARA_OFFSET 0x200 +#define FLASH_ADC_PARA_BASE (FLASH_SYSTEM_DATA_ADDR+FLASH_ADC_PARA_OFFSET) + +#endif //_HAL_8195A_H_ diff --git a/lib/fwlib/rtl8195a/rtl8195a_adc.h b/lib/fwlib/rtl8195a/rtl8195a_adc.h new file mode 100644 index 0000000..48240b0 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_adc.h @@ -0,0 +1,350 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_ADC_H_ +#define _RTL8195A_ADC_H_ + + +//================ Register Bit Field ========================== +//2 REG_ADC_FIFO_READ + +#define BIT_SHIFT_ADC_FIFO_RO 0 +#define BIT_MASK_ADC_FIFO_RO 0xffffffffL +#define BIT_ADC_FIFO_RO(x) (((x) & BIT_MASK_ADC_FIFO_RO) << BIT_SHIFT_ADC_FIFO_RO) +#define BIT_CTRL_ADC_FIFO_RO(x) (((x) & BIT_MASK_ADC_FIFO_RO) << BIT_SHIFT_ADC_FIFO_RO) +#define BIT_GET_ADC_FIFO_RO(x) (((x) >> BIT_SHIFT_ADC_FIFO_RO) & BIT_MASK_ADC_FIFO_RO) + + +//2 REG_ADC_CONTROL + +#define BIT_SHIFT_ADC_DBG_SEL 24 +#define BIT_MASK_ADC_DBG_SEL 0x7 +#define BIT_ADC_DBG_SEL(x) (((x) & BIT_MASK_ADC_DBG_SEL) << BIT_SHIFT_ADC_DBG_SEL) +#define BIT_CTRL_ADC_DBG_SEL(x) (((x) & BIT_MASK_ADC_DBG_SEL) << BIT_SHIFT_ADC_DBG_SEL) +#define BIT_GET_ADC_DBG_SEL(x) (((x) >> BIT_SHIFT_ADC_DBG_SEL) & BIT_MASK_ADC_DBG_SEL) + + +#define BIT_SHIFT_ADC_THRESHOLD 16 +#define BIT_MASK_ADC_THRESHOLD 0x3f +#define BIT_ADC_THRESHOLD(x) (((x) & BIT_MASK_ADC_THRESHOLD) << BIT_SHIFT_ADC_THRESHOLD) +#define BIT_CTRL_ADC_THRESHOLD(x) (((x) & BIT_MASK_ADC_THRESHOLD) << BIT_SHIFT_ADC_THRESHOLD) +#define BIT_GET_ADC_THRESHOLD(x) (((x) >> BIT_SHIFT_ADC_THRESHOLD) & BIT_MASK_ADC_THRESHOLD) + + +#define BIT_SHIFT_ADC_BURST_SIZE 8 +#define BIT_MASK_ADC_BURST_SIZE 0x1f +#define BIT_ADC_BURST_SIZE(x) (((x) & BIT_MASK_ADC_BURST_SIZE) << BIT_SHIFT_ADC_BURST_SIZE) +#define BIT_CTRL_ADC_BURST_SIZE(x) (((x) & BIT_MASK_ADC_BURST_SIZE) << BIT_SHIFT_ADC_BURST_SIZE) +#define BIT_GET_ADC_BURST_SIZE(x) (((x) >> BIT_SHIFT_ADC_BURST_SIZE) & BIT_MASK_ADC_BURST_SIZE) + +#define BIT_ADC_ENDIAN BIT(3) +#define BIT_SHIFT_ADC_ENDIAN 3 +#define BIT_MASK_ADC_ENDIAN 0x1 +#define BIT_CTRL_ADC_ENDIAN(x) (((x) & BIT_MASK_ADC_ENDIAN) << BIT_SHIFT_ADC_ENDIAN) + +#define BIT_ADC_OVERWRITE BIT(2) +#define BIT_SHIFT_ADC_OVERWRITE 2 +#define BIT_MASK_ADC_OVERWRITE 0x1 +#define BIT_CTRL_ADC_OVERWRITE(x) (((x) & BIT_MASK_ADC_OVERWRITE) << BIT_SHIFT_ADC_OVERWRITE) + +#define BIT_ADC_ONESHOT BIT(1) +#define BIT_SHIFT_ADC_ONESHOT 1 +#define BIT_MASK_ADC_ONESHOT 0x1 +#define BIT_CTRL_ADC_ONESHOT(x) (((x) & BIT_MASK_ADC_ONESHOT) << BIT_SHIFT_ADC_ONESHOT) + +#define BIT_ADC_COMP_ONLY BIT(0) +#define BIT_SHIFT_ADC_COMP_ONLY 0 +#define BIT_MASK_ADC_COMP_ONLY 0x1 +#define BIT_CTRL_ADC_COMP_ONLY(x) (((x) & BIT_MASK_ADC_COMP_ONLY) << BIT_SHIFT_ADC_COMP_ONLY) + + +//2 REG_ADC_INTR_EN +#define BIT_ADC_AWAKE_CPU_EN BIT(7) +#define BIT_SHIFT_ADC_AWAKE_CPU_EN 7 +#define BIT_MASK_ADC_AWAKE_CPU_EN 0x1 +#define BIT_CTRL_ADC_AWAKE_CPU_EN(x) (((x) & BIT_MASK_ADC_AWAKE_CPU_EN) << BIT_SHIFT_ADC_AWAKE_CPU_EN) + +#define BIT_ADC_FIFO_RD_ERROR_EN BIT(6) +#define BIT_SHIFT_ADC_FIFO_RD_ERROR_EN 6 +#define BIT_MASK_ADC_FIFO_RD_ERROR_EN 0x1 +#define BIT_CTRL_ADC_FIFO_RD_ERROR_EN(x) (((x) & BIT_MASK_ADC_FIFO_RD_ERROR_EN) << BIT_SHIFT_ADC_FIFO_RD_ERROR_EN) + +#define BIT_ADC_FIFO_RD_REQ_EN BIT(5) +#define BIT_SHIFT_ADC_FIFO_RD_REQ_EN 5 +#define BIT_MASK_ADC_FIFO_RD_REQ_EN 0x1 +#define BIT_CTRL_ADC_FIFO_RD_REQ_EN(x) (((x) & BIT_MASK_ADC_FIFO_RD_REQ_EN) << BIT_SHIFT_ADC_FIFO_RD_REQ_EN) + +#define BIT_ADC_FIFO_FULL_EN BIT(4) +#define BIT_SHIFT_ADC_FIFO_FULL_EN 4 +#define BIT_MASK_ADC_FIFO_FULL_EN 0x1 +#define BIT_CTRL_ADC_FIFO_FULL_EN(x) (((x) & BIT_MASK_ADC_FIFO_FULL_EN) << BIT_SHIFT_ADC_FIFO_FULL_EN) + +#define BIT_ADC_COMP_3_EN BIT(3) +#define BIT_SHIFT_ADC_COMP_3_EN 3 +#define BIT_MASK_ADC_COMP_3_EN 0x1 +#define BIT_CTRL_ADC_COMP_3_EN(x) (((x) & BIT_MASK_ADC_COMP_3_EN) << BIT_SHIFT_ADC_COMP_3_EN) + +#define BIT_ADC_COMP_2_EN BIT(2) +#define BIT_SHIFT_ADC_COMP_2_EN 2 +#define BIT_MASK_ADC_COMP_2_EN 0x1 +#define BIT_CTRL_ADC_COMP_2_EN(x) (((x) & BIT_MASK_ADC_COMP_2_EN) << BIT_SHIFT_ADC_COMP_2_EN) + +#define BIT_ADC_COMP_1_EN BIT(1) +#define BIT_SHIFT_ADC_COMP_1_EN 1 +#define BIT_MASK_ADC_COMP_1_EN 0x1 +#define BIT_CTRL_ADC_COMP_1_EN(x) (((x) & BIT_MASK_ADC_COMP_1_EN) << BIT_SHIFT_ADC_COMP_1_EN) + +#define BIT_ADC_COMP_0_EN BIT(0) +#define BIT_SHIFT_ADC_COMP_0_EN 0 +#define BIT_MASK_ADC_COMP_0_EN 0x1 +#define BIT_CTRL_ADC_COMP_0_EN(x) (((x) & BIT_MASK_ADC_COMP_0_EN) << BIT_SHIFT_ADC_COMP_0_EN) + + +//2 REG_ADC_INTR_STS +#define BIT_ADC_FIFO_THRESHOLD BIT(7) +#define BIT_SHIFT_ADC_FIFO_THRESHOLD 7 +#define BIT_MASK_ADC_FIFO_THRESHOLD 0x1 +#define BIT_CTRL_ADC_FIFO_THRESHOLD(x) (((x) & BIT_MASK_ADC_FIFO_THRESHOLD) << BIT_SHIFT_ADC_FIFO_THRESHOLD) + +#define BIT_ADC_FIFO_RD_ERROR_ST BIT(6) +#define BIT_SHIFT_ADC_FIFO_RD_ERROR_ST 6 +#define BIT_MASK_ADC_FIFO_RD_ERROR_ST 0x1 +#define BIT_CTRL_ADC_FIFO_RD_ERROR_ST(x) (((x) & BIT_MASK_ADC_FIFO_RD_ERROR_ST) << BIT_SHIFT_ADC_FIFO_RD_ERROR_ST) + +#define BIT_ADC_FIFO_RD_REQ_ST BIT(5) +#define BIT_SHIFT_ADC_FIFO_RD_REQ_ST 5 +#define BIT_MASK_ADC_FIFO_RD_REQ_ST 0x1 +#define BIT_CTRL_ADC_FIFO_RD_REQ_ST(x) (((x) & BIT_MASK_ADC_FIFO_RD_REQ_ST) << BIT_SHIFT_ADC_FIFO_RD_REQ_ST) + +#define BIT_ADC_FIFO_FULL_ST BIT(4) +#define BIT_SHIFT_ADC_FIFO_FULL_ST 4 +#define BIT_MASK_ADC_FIFO_FULL_ST 0x1 +#define BIT_CTRL_ADC_FIFO_FULL_ST(x) (((x) & BIT_MASK_ADC_FIFO_FULL_ST) << BIT_SHIFT_ADC_FIFO_FULL_ST) + +#define BIT_ADC_COMP_3_ST BIT(3) +#define BIT_SHIFT_ADC_COMP_3_ST 3 +#define BIT_MASK_ADC_COMP_3_ST 0x1 +#define BIT_CTRL_ADC_COMP_3_ST(x) (((x) & BIT_MASK_ADC_COMP_3_ST) << BIT_SHIFT_ADC_COMP_3_ST) + +#define BIT_ADC_COMP_2_ST BIT(2) +#define BIT_SHIFT_ADC_COMP_2_ST 2 +#define BIT_MASK_ADC_COMP_2_ST 0x1 +#define BIT_CTRL_ADC_COMP_2_ST(x) (((x) & BIT_MASK_ADC_COMP_2_ST) << BIT_SHIFT_ADC_COMP_2_ST) + +#define BIT_ADC_COMP_1_ST BIT(1) +#define BIT_SHIFT_ADC_COMP_1_ST 1 +#define BIT_MASK_ADC_COMP_1_ST 0x1 +#define BIT_CTRL_ADC_COMP_1_ST(x) (((x) & BIT_MASK_ADC_COMP_1_ST) << BIT_SHIFT_ADC_COMP_1_ST) + +#define BIT_ADC_COMP_0_ST BIT(0) +#define BIT_SHIFT_ADC_COMP_0_ST 0 +#define BIT_MASK_ADC_COMP_0_ST 0x1 +#define BIT_CTRL_ADC_COMP_0_ST(x) (((x) & BIT_MASK_ADC_COMP_0_ST) << BIT_SHIFT_ADC_COMP_0_ST) + + +//2 REG_ADC_COMP_VALUE_L + +#define BIT_SHIFT_ADC_COMP_TH_1 16 +#define BIT_MASK_ADC_COMP_TH_1 0xffff +#define BIT_ADC_COMP_TH_1(x) (((x) & BIT_MASK_ADC_COMP_TH_1) << BIT_SHIFT_ADC_COMP_TH_1) +#define BIT_CTRL_ADC_COMP_TH_1(x) (((x) & BIT_MASK_ADC_COMP_TH_1) << BIT_SHIFT_ADC_COMP_TH_1) +#define BIT_GET_ADC_COMP_TH_1(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_1) & BIT_MASK_ADC_COMP_TH_1) + + +#define BIT_SHIFT_ADC_COMP_TH_0 0 +#define BIT_MASK_ADC_COMP_TH_0 0xffff +#define BIT_ADC_COMP_TH_0(x) (((x) & BIT_MASK_ADC_COMP_TH_0) << BIT_SHIFT_ADC_COMP_TH_0) +#define BIT_CTRL_ADC_COMP_TH_0(x) (((x) & BIT_MASK_ADC_COMP_TH_0) << BIT_SHIFT_ADC_COMP_TH_0) +#define BIT_GET_ADC_COMP_TH_0(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_0) & BIT_MASK_ADC_COMP_TH_0) + + +//2 REG_ADC_COMP_VALUE_H + +#define BIT_SHIFT_ADC_COMP_TH_3 16 +#define BIT_MASK_ADC_COMP_TH_3 0xffff +#define BIT_ADC_COMP_TH_3(x) (((x) & BIT_MASK_ADC_COMP_TH_3) << BIT_SHIFT_ADC_COMP_TH_3) +#define BIT_CTRL_ADC_COMP_TH_3(x) (((x) & BIT_MASK_ADC_COMP_TH_3) << BIT_SHIFT_ADC_COMP_TH_3) +#define BIT_GET_ADC_COMP_TH_3(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_3) & BIT_MASK_ADC_COMP_TH_3) + + +#define BIT_SHIFT_ADC_COMP_TH_2 0 +#define BIT_MASK_ADC_COMP_TH_2 0xffff +#define BIT_ADC_COMP_TH_2(x) (((x) & BIT_MASK_ADC_COMP_TH_2) << BIT_SHIFT_ADC_COMP_TH_2) +#define BIT_CTRL_ADC_COMP_TH_2(x) (((x) & BIT_MASK_ADC_COMP_TH_2) << BIT_SHIFT_ADC_COMP_TH_2) +#define BIT_GET_ADC_COMP_TH_2(x) (((x) >> BIT_SHIFT_ADC_COMP_TH_2) & BIT_MASK_ADC_COMP_TH_2) + + +//2 REG_ADC_COMP_SET + +#define BIT_SHIFT_ADC_GREATER_THAN 0 +#define BIT_MASK_ADC_GREATER_THAN 0xf +#define BIT_ADC_GREATER_THAN(x) (((x) & BIT_MASK_ADC_GREATER_THAN) << BIT_SHIFT_ADC_GREATER_THAN) +#define BIT_CTRL_ADC_GREATER_THAN(x) (((x) & BIT_MASK_ADC_GREATER_THAN) << BIT_SHIFT_ADC_GREATER_THAN) +#define BIT_GET_ADC_GREATER_THAN(x) (((x) >> BIT_SHIFT_ADC_GREATER_THAN) & BIT_MASK_ADC_GREATER_THAN) + + +//2 REG_ADC_POWER + +#define BIT_SHIFT_ADC_PWR_CUT_CNTR 16 +#define BIT_MASK_ADC_PWR_CUT_CNTR 0xff +#define BIT_ADC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_ADC_PWR_CUT_CNTR) << BIT_SHIFT_ADC_PWR_CUT_CNTR) +#define BIT_CTRL_ADC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_ADC_PWR_CUT_CNTR) << BIT_SHIFT_ADC_PWR_CUT_CNTR) +#define BIT_GET_ADC_PWR_CUT_CNTR(x) (((x) >> BIT_SHIFT_ADC_PWR_CUT_CNTR) & BIT_MASK_ADC_PWR_CUT_CNTR) + +#define BIT_ADC_FIFO_ON_ST BIT(11) +#define BIT_SHIFT_ADC_FIFO_ON_ST 11 +#define BIT_MASK_ADC_FIFO_ON_ST 0x1 +#define BIT_CTRL_ADC_FIFO_ON_ST(x) (((x) & BIT_MASK_ADC_FIFO_ON_ST) << BIT_SHIFT_ADC_FIFO_ON_ST) + +#define BIT_ADC_ISO_ON_ST BIT(10) +#define BIT_SHIFT_ADC_ISO_ON_ST 10 +#define BIT_MASK_ADC_ISO_ON_ST 0x1 +#define BIT_CTRL_ADC_ISO_ON_ST(x) (((x) & BIT_MASK_ADC_ISO_ON_ST) << BIT_SHIFT_ADC_ISO_ON_ST) + +#define BIT_ADC_PWR33_ON_ST BIT(9) +#define BIT_SHIFT_ADC_PWR33_ON_ST 9 +#define BIT_MASK_ADC_PWR33_ON_ST 0x1 +#define BIT_CTRL_ADC_PWR33_ON_ST(x) (((x) & BIT_MASK_ADC_PWR33_ON_ST) << BIT_SHIFT_ADC_PWR33_ON_ST) + +#define BIT_ADC_PWR12_ON_ST BIT(8) +#define BIT_SHIFT_ADC_PWR12_ON_ST 8 +#define BIT_MASK_ADC_PWR12_ON_ST 0x1 +#define BIT_CTRL_ADC_PWR12_ON_ST(x) (((x) & BIT_MASK_ADC_PWR12_ON_ST) << BIT_SHIFT_ADC_PWR12_ON_ST) + +#define BIT_ADC_ISO_MANUAL BIT(3) +#define BIT_SHIFT_ADC_ISO_MANUAL 3 +#define BIT_MASK_ADC_ISO_MANUAL 0x1 +#define BIT_CTRL_ADC_ISO_MANUAL(x) (((x) & BIT_MASK_ADC_ISO_MANUAL) << BIT_SHIFT_ADC_ISO_MANUAL) + +#define BIT_ADC_PWR33_MANUAL BIT(2) +#define BIT_SHIFT_ADC_PWR33_MANUAL 2 +#define BIT_MASK_ADC_PWR33_MANUAL 0x1 +#define BIT_CTRL_ADC_PWR33_MANUAL(x) (((x) & BIT_MASK_ADC_PWR33_MANUAL) << BIT_SHIFT_ADC_PWR33_MANUAL) + +#define BIT_ADC_PWR12_MANUAL BIT(1) +#define BIT_SHIFT_ADC_PWR12_MANUAL 1 +#define BIT_MASK_ADC_PWR12_MANUAL 0x1 +#define BIT_CTRL_ADC_PWR12_MANUAL(x) (((x) & BIT_MASK_ADC_PWR12_MANUAL) << BIT_SHIFT_ADC_PWR12_MANUAL) + +#define BIT_ADC_PWR_AUTO BIT(0) +#define BIT_SHIFT_ADC_PWR_AUTO 0 +#define BIT_MASK_ADC_PWR_AUTO 0x1 +#define BIT_CTRL_ADC_PWR_AUTO(x) (((x) & BIT_MASK_ADC_PWR_AUTO) << BIT_SHIFT_ADC_PWR_AUTO) + + +//2 REG_ADC_ANAPAR_AD0 + +#define BIT_SHIFT_ADC_ANAPAR_AD0 2 +#define BIT_MASK_ADC_ANAPAR_AD0 0x3fffffff +#define BIT_ADC_ANAPAR_AD0(x) (((x) & BIT_MASK_ADC_ANAPAR_AD0) << BIT_SHIFT_ADC_ANAPAR_AD0) +#define BIT_CTRL_ADC_ANAPAR_AD0(x) (((x) & BIT_MASK_ADC_ANAPAR_AD0) << BIT_SHIFT_ADC_ANAPAR_AD0) +#define BIT_GET_ADC_ANAPAR_AD0(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD0) & BIT_MASK_ADC_ANAPAR_AD0) + +#define BIT_ADC_AUDIO_EN BIT(1) +#define BIT_SHIFT_ADC_AUDIO_EN 1 +#define BIT_MASK_ADC_AUDIO_EN 0x1 +#define BIT_CTRL_ADC_AUDIO_EN(x) (((x) & BIT_MASK_ADC_AUDIO_EN) << BIT_SHIFT_ADC_AUDIO_EN) + +#define BIT_ADC_EN_MANUAL BIT(0) +#define BIT_SHIFT_ADC_EN_MANUAL 0 +#define BIT_MASK_ADC_EN_MANUAL 0x1 +#define BIT_CTRL_ADC_EN_MANUAL(x) (((x) & BIT_MASK_ADC_EN_MANUAL) << BIT_SHIFT_ADC_EN_MANUAL) + + +//2 REG_ADC_ANAPAR_AD1 + +#define BIT_SHIFT_ADC_ANAPAR_AD1 0 +#define BIT_MASK_ADC_ANAPAR_AD1 0xffffffffL +#define BIT_ADC_ANAPAR_AD1(x) (((x) & BIT_MASK_ADC_ANAPAR_AD1) << BIT_SHIFT_ADC_ANAPAR_AD1) +#define BIT_CTRL_ADC_ANAPAR_AD1(x) (((x) & BIT_MASK_ADC_ANAPAR_AD1) << BIT_SHIFT_ADC_ANAPAR_AD1) +#define BIT_GET_ADC_ANAPAR_AD1(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD1) & BIT_MASK_ADC_ANAPAR_AD1) + + +//2 REG_ADC_ANAPAR_AD2 + +#define BIT_SHIFT_ADC_ANAPAR_AD2 0 +#define BIT_MASK_ADC_ANAPAR_AD2 0xffffffffL +#define BIT_ADC_ANAPAR_AD2(x) (((x) & BIT_MASK_ADC_ANAPAR_AD2) << BIT_SHIFT_ADC_ANAPAR_AD2) +#define BIT_CTRL_ADC_ANAPAR_AD2(x) (((x) & BIT_MASK_ADC_ANAPAR_AD2) << BIT_SHIFT_ADC_ANAPAR_AD2) +#define BIT_GET_ADC_ANAPAR_AD2(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD2) & BIT_MASK_ADC_ANAPAR_AD2) + + +//2 REG_ADC_ANAPAR_AD3 + +#define BIT_SHIFT_ADC_ANAPAR_AD3 0 +#define BIT_MASK_ADC_ANAPAR_AD3 0xffffffffL +#define BIT_ADC_ANAPAR_AD3(x) (((x) & BIT_MASK_ADC_ANAPAR_AD3) << BIT_SHIFT_ADC_ANAPAR_AD3) +#define BIT_CTRL_ADC_ANAPAR_AD3(x) (((x) & BIT_MASK_ADC_ANAPAR_AD3) << BIT_SHIFT_ADC_ANAPAR_AD3) +#define BIT_GET_ADC_ANAPAR_AD3(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD3) & BIT_MASK_ADC_ANAPAR_AD3) + + +//2 REG_ADC_ANAPAR_AD4 + +#define BIT_SHIFT_ADC_ANAPAR_AD4 0 +#define BIT_MASK_ADC_ANAPAR_AD4 0xffffffffL +#define BIT_ADC_ANAPAR_AD4(x) (((x) & BIT_MASK_ADC_ANAPAR_AD4) << BIT_SHIFT_ADC_ANAPAR_AD4) +#define BIT_CTRL_ADC_ANAPAR_AD4(x) (((x) & BIT_MASK_ADC_ANAPAR_AD4) << BIT_SHIFT_ADC_ANAPAR_AD4) +#define BIT_GET_ADC_ANAPAR_AD4(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD4) & BIT_MASK_ADC_ANAPAR_AD4) + + +//2 REG_ADC_ANAPAR_AD5 + +#define BIT_SHIFT_ADC_ANAPAR_AD5 0 +#define BIT_MASK_ADC_ANAPAR_AD5 0xffffffffL +#define BIT_ADC_ANAPAR_AD5(x) (((x) & BIT_MASK_ADC_ANAPAR_AD5) << BIT_SHIFT_ADC_ANAPAR_AD5) +#define BIT_CTRL_ADC_ANAPAR_AD5(x) (((x) & BIT_MASK_ADC_ANAPAR_AD5) << BIT_SHIFT_ADC_ANAPAR_AD5) +#define BIT_GET_ADC_ANAPAR_AD5(x) (((x) >> BIT_SHIFT_ADC_ANAPAR_AD5) & BIT_MASK_ADC_ANAPAR_AD5) + + +//2 REG_ADC_CALI_DATA + +#define BIT_SHIFT_ADC_CALI_DATA_6 16 +#define BIT_MASK_ADC_CALI_DATA_6 0xffff +#define BIT_ADC_CALI_DATA_6(x) (((x) & BIT_MASK_ADC_CALI_DATA_6) << BIT_SHIFT_ADC_CALI_DATA_6) +#define BIT_CTRL_ADC_CALI_DATA_6(x) (((x) & BIT_MASK_ADC_CALI_DATA_6) << BIT_SHIFT_ADC_CALI_DATA_6) +#define BIT_GET_ADC_CALI_DATA_6(x) (((x) >> BIT_SHIFT_ADC_CALI_DATA_6) & BIT_MASK_ADC_CALI_DATA_6) + + +#define BIT_SHIFT_ADC_CALI_DATA_0 0 +#define BIT_MASK_ADC_CALI_DATA_0 0xffff +#define BIT_ADC_CALI_DATA_0(x) (((x) & BIT_MASK_ADC_CALI_DATA_0) << BIT_SHIFT_ADC_CALI_DATA_0) +#define BIT_CTRL_ADC_CALI_DATA_0(x) (((x) & BIT_MASK_ADC_CALI_DATA_0) << BIT_SHIFT_ADC_CALI_DATA_0) +#define BIT_GET_ADC_CALI_DATA_0(x) (((x) >> BIT_SHIFT_ADC_CALI_DATA_0) & BIT_MASK_ADC_CALI_DATA_0) + +//================ Register Reg Field ========================= +#define REG_ADC_FIFO_READ 0x0000 +#define REG_ADC_CONTROL 0x0004 +#define REG_ADC_INTR_EN 0x0008 +#define REG_ADC_INTR_STS 0x000C +#define REG_ADC_COMP_VALUE_L 0x0010 +#define REG_ADC_COMP_VALUE_H 0x0014 +#define REG_ADC_COMP_SET 0x0018 +#define REG_ADC_POWER 0x001C +#define REG_ADC_ANAPAR_AD0 0x0020 +#define REG_ADC_ANAPAR_AD1 0x0024 +#define REG_ADC_ANAPAR_AD2 0x0028 +#define REG_ADC_ANAPAR_AD3 0x002C +#define REG_ADC_ANAPAR_AD4 0x0030 +#define REG_ADC_ANAPAR_AD5 0x0034 +#define REG_ADC_CALI_DATA 0x0038 + +//================ ADC HAL related enumeration ================== + +//================ ADC Function Prototypes ===================== +#define HAL_ADC_WRITE32(addr, value) HAL_WRITE32(ADC_REG_BASE,addr,value) +#define HAL_ADC_READ32(addr) HAL_READ32(ADC_REG_BASE,addr) + +RTK_STATUS HalADCInit8195a(IN VOID *Data); +RTK_STATUS HalADCDeInit8195a(IN VOID *Data); +RTK_STATUS HalADCEnableRtl8195a(IN VOID *Data); +RTK_STATUS HalADCIntrCtrl8195a(IN VOID *Data); +u32 HalADCReceiveRtl8195a(IN VOID *Data); +u32 HalADCReadRegRtl8195a(IN VOID *Data,IN u8 I2CReg); + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_dac.h b/lib/fwlib/rtl8195a/rtl8195a_dac.h new file mode 100644 index 0000000..c3a9861 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_dac.h @@ -0,0 +1,294 @@ +#ifndef _RTL8195A_DAC_H_ +#define _RTL8195A_DAC_H_ + +//================ Register Bit Field ========================== +//2 REG_DAC0_FIFO_WR + +#define BIT_SHIFT_DAC0_FIFO_WO 0 +#define BIT_MASK_DAC0_FIFO_WO 0xffffffffL +#define BIT_DAC0_FIFO_WO(x) (((x) & BIT_MASK_DAC0_FIFO_WO) << BIT_SHIFT_DAC0_FIFO_WO) +#define BIT_CTRL_DAC0_FIFO_WO(x) (((x) & BIT_MASK_DAC0_FIFO_WO) << BIT_SHIFT_DAC0_FIFO_WO) +#define BIT_GET_DAC0_FIFO_WO(x) (((x) >> BIT_SHIFT_DAC0_FIFO_WO) & BIT_MASK_DAC0_FIFO_WO) + + +//2 REG_DAC_CTRL + +#define BIT_SHIFT_DAC_DELTA_SIGMA 25 +#define BIT_MASK_DAC_DELTA_SIGMA 0x7 +#define BIT_DAC_DELTA_SIGMA(x) (((x) & BIT_MASK_DAC_DELTA_SIGMA) << BIT_SHIFT_DAC_DELTA_SIGMA) +#define BIT_CTRL_DAC_DELTA_SIGMA(x) (((x) & BIT_MASK_DAC_DELTA_SIGMA) << BIT_SHIFT_DAC_DELTA_SIGMA) +#define BIT_GET_DAC_DELTA_SIGMA(x) (((x) >> BIT_SHIFT_DAC_DELTA_SIGMA) & BIT_MASK_DAC_DELTA_SIGMA) + +#define BIT_DAC_BYPASS_DSC BIT(24) +#define BIT_SHIFT_DAC_BYPASS_DSC 24 +#define BIT_MASK_DAC_BYPASS_DSC 0x1 +#define BIT_CTRL_DAC_BYPASS_DSC(x) (((x) & BIT_MASK_DAC_BYPASS_DSC) << BIT_SHIFT_DAC_BYPASS_DSC) + + +#define BIT_SHIFT_DAC_DSC_DBG_SEL 19 +#define BIT_MASK_DAC_DSC_DBG_SEL 0x3 +#define BIT_DAC_DSC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DSC_DBG_SEL) << BIT_SHIFT_DAC_DSC_DBG_SEL) +#define BIT_CTRL_DAC_DSC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DSC_DBG_SEL) << BIT_SHIFT_DAC_DSC_DBG_SEL) +#define BIT_GET_DAC_DSC_DBG_SEL(x) (((x) >> BIT_SHIFT_DAC_DSC_DBG_SEL) & BIT_MASK_DAC_DSC_DBG_SEL) + + +#define BIT_SHIFT_DAC_DBG_SEL 16 +#define BIT_MASK_DAC_DBG_SEL 0x7 +#define BIT_DAC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DBG_SEL) << BIT_SHIFT_DAC_DBG_SEL) +#define BIT_CTRL_DAC_DBG_SEL(x) (((x) & BIT_MASK_DAC_DBG_SEL) << BIT_SHIFT_DAC_DBG_SEL) +#define BIT_GET_DAC_DBG_SEL(x) (((x) >> BIT_SHIFT_DAC_DBG_SEL) & BIT_MASK_DAC_DBG_SEL) + + +#define BIT_SHIFT_DAC_BURST_SIZE 8 +#define BIT_MASK_DAC_BURST_SIZE 0xf +#define BIT_DAC_BURST_SIZE(x) (((x) & BIT_MASK_DAC_BURST_SIZE) << BIT_SHIFT_DAC_BURST_SIZE) +#define BIT_CTRL_DAC_BURST_SIZE(x) (((x) & BIT_MASK_DAC_BURST_SIZE) << BIT_SHIFT_DAC_BURST_SIZE) +#define BIT_GET_DAC_BURST_SIZE(x) (((x) >> BIT_SHIFT_DAC_BURST_SIZE) & BIT_MASK_DAC_BURST_SIZE) + +#define BIT_DAC_FILTER_SETTLE BIT(4) +#define BIT_SHIFT_DAC_FILTER_SETTLE 4 +#define BIT_MASK_DAC_FILTER_SETTLE 0x1 +#define BIT_CTRL_DAC_FILTER_SETTLE(x) (((x) & BIT_MASK_DAC_FILTER_SETTLE) << BIT_SHIFT_DAC_FILTER_SETTLE) + +#define BIT_DAC_OV_OPTION BIT(3) +#define BIT_SHIFT_DAC_OV_OPTION 3 +#define BIT_MASK_DAC_OV_OPTION 0x1 +#define BIT_CTRL_DAC_OV_OPTION(x) (((x) & BIT_MASK_DAC_OV_OPTION) << BIT_SHIFT_DAC_OV_OPTION) + +#define BIT_DAC_ENDIAN BIT(2) +#define BIT_SHIFT_DAC_ENDIAN 2 +#define BIT_MASK_DAC_ENDIAN 0x1 +#define BIT_CTRL_DAC_ENDIAN(x) (((x) & BIT_MASK_DAC_ENDIAN) << BIT_SHIFT_DAC_ENDIAN) + +#define BIT_DAC_SPEED BIT(1) +#define BIT_SHIFT_DAC_SPEED 1 +#define BIT_MASK_DAC_SPEED 0x1 +#define BIT_CTRL_DAC_SPEED(x) (((x) & BIT_MASK_DAC_SPEED) << BIT_SHIFT_DAC_SPEED) + +#define BIT_DAC_FIFO_EN BIT(0) +#define BIT_SHIFT_DAC_FIFO_EN 0 +#define BIT_MASK_DAC_FIFO_EN 0x1 +#define BIT_CTRL_DAC_FIFO_EN(x) (((x) & BIT_MASK_DAC_FIFO_EN) << BIT_SHIFT_DAC_FIFO_EN) + + +//2 REG_DAC_INTR_CTRL +#define BIT_DAC_DSC_OVERFLOW1_EN BIT(6) +#define BIT_SHIFT_DAC_DSC_OVERFLOW1_EN 6 +#define BIT_MASK_DAC_DSC_OVERFLOW1_EN 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW1_EN(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW1_EN) << BIT_SHIFT_DAC_DSC_OVERFLOW1_EN) + +#define BIT_DAC_DSC_OVERFLOW0_EN BIT(5) +#define BIT_SHIFT_DAC_DSC_OVERFLOW0_EN 5 +#define BIT_MASK_DAC_DSC_OVERFLOW0_EN 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW0_EN(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW0_EN) << BIT_SHIFT_DAC_DSC_OVERFLOW0_EN) + +#define BIT_DAC__WRITE_ERROR_EN BIT(4) +#define BIT_SHIFT_DAC__WRITE_ERROR_EN 4 +#define BIT_MASK_DAC__WRITE_ERROR_EN 0x1 +#define BIT_CTRL_DAC__WRITE_ERROR_EN(x) (((x) & BIT_MASK_DAC__WRITE_ERROR_EN) << BIT_SHIFT_DAC__WRITE_ERROR_EN) + +#define BIT_DAC_FIFO_STOP_EN BIT(3) +#define BIT_SHIFT_DAC_FIFO_STOP_EN 3 +#define BIT_MASK_DAC_FIFO_STOP_EN 0x1 +#define BIT_CTRL_DAC_FIFO_STOP_EN(x) (((x) & BIT_MASK_DAC_FIFO_STOP_EN) << BIT_SHIFT_DAC_FIFO_STOP_EN) + +#define BIT_DAC_FIFO_OVERFLOW_EN BIT(2) +#define BIT_SHIFT_DAC_FIFO_OVERFLOW_EN 2 +#define BIT_MASK_DAC_FIFO_OVERFLOW_EN 0x1 +#define BIT_CTRL_DAC_FIFO_OVERFLOW_EN(x) (((x) & BIT_MASK_DAC_FIFO_OVERFLOW_EN) << BIT_SHIFT_DAC_FIFO_OVERFLOW_EN) + +#define BIT_DAC_FIFO_WR_REQ_EN BIT(1) +#define BIT_SHIFT_DAC_FIFO_WR_REQ_EN 1 +#define BIT_MASK_DAC_FIFO_WR_REQ_EN 0x1 +#define BIT_CTRL_DAC_FIFO_WR_REQ_EN(x) (((x) & BIT_MASK_DAC_FIFO_WR_REQ_EN) << BIT_SHIFT_DAC_FIFO_WR_REQ_EN) + +#define BIT_DAC_FIFO_FULL_EN BIT(0) +#define BIT_SHIFT_DAC_FIFO_FULL_EN 0 +#define BIT_MASK_DAC_FIFO_FULL_EN 0x1 +#define BIT_CTRL_DAC_FIFO_FULL_EN(x) (((x) & BIT_MASK_DAC_FIFO_FULL_EN) << BIT_SHIFT_DAC_FIFO_FULL_EN) + + +//2 REG_DAC_INTR_STS +#define BIT_DAC_DSC_OVERFLOW1_ST BIT(6) +#define BIT_SHIFT_DAC_DSC_OVERFLOW1_ST 6 +#define BIT_MASK_DAC_DSC_OVERFLOW1_ST 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW1_ST(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW1_ST) << BIT_SHIFT_DAC_DSC_OVERFLOW1_ST) + +#define BIT_DAC_DSC_OVERFLOW0_ST BIT(5) +#define BIT_SHIFT_DAC_DSC_OVERFLOW0_ST 5 +#define BIT_MASK_DAC_DSC_OVERFLOW0_ST 0x1 +#define BIT_CTRL_DAC_DSC_OVERFLOW0_ST(x) (((x) & BIT_MASK_DAC_DSC_OVERFLOW0_ST) << BIT_SHIFT_DAC_DSC_OVERFLOW0_ST) + +#define BIT_DAC__WRITE_ERROR_ST BIT(4) +#define BIT_SHIFT_DAC__WRITE_ERROR_ST 4 +#define BIT_MASK_DAC__WRITE_ERROR_ST 0x1 +#define BIT_CTRL_DAC__WRITE_ERROR_ST(x) (((x) & BIT_MASK_DAC__WRITE_ERROR_ST) << BIT_SHIFT_DAC__WRITE_ERROR_ST) + +#define BIT_DAC_FIFO_STOP_ST BIT(3) +#define BIT_SHIFT_DAC_FIFO_STOP_ST 3 +#define BIT_MASK_DAC_FIFO_STOP_ST 0x1 +#define BIT_CTRL_DAC_FIFO_STOP_ST(x) (((x) & BIT_MASK_DAC_FIFO_STOP_ST) << BIT_SHIFT_DAC_FIFO_STOP_ST) + +#define BIT_DAC_FIFO_OVERFLOW_ST BIT(2) +#define BIT_SHIFT_DAC_FIFO_OVERFLOW_ST 2 +#define BIT_MASK_DAC_FIFO_OVERFLOW_ST 0x1 +#define BIT_CTRL_DAC_FIFO_OVERFLOW_ST(x) (((x) & BIT_MASK_DAC_FIFO_OVERFLOW_ST) << BIT_SHIFT_DAC_FIFO_OVERFLOW_ST) + +#define BIT_DAC_FIFO_WR_REQ_ST BIT(1) +#define BIT_SHIFT_DAC_FIFO_WR_REQ_ST 1 +#define BIT_MASK_DAC_FIFO_WR_REQ_ST 0x1 +#define BIT_CTRL_DAC_FIFO_WR_REQ_ST(x) (((x) & BIT_MASK_DAC_FIFO_WR_REQ_ST) << BIT_SHIFT_DAC_FIFO_WR_REQ_ST) + +#define BIT_DAC_FIFO_FULL_ST BIT(0) +#define BIT_SHIFT_DAC_FIFO_FULL_ST 0 +#define BIT_MASK_DAC_FIFO_FULL_ST 0x1 +#define BIT_CTRL_DAC_FIFO_FULL_ST(x) (((x) & BIT_MASK_DAC_FIFO_FULL_ST) << BIT_SHIFT_DAC_FIFO_FULL_ST) + + +//2 REG_DAC_PWR_CTRL + +#define BIT_SHIFT_DAC_PWR_CUT_CNTR 16 +#define BIT_MASK_DAC_PWR_CUT_CNTR 0xff +#define BIT_DAC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_DAC_PWR_CUT_CNTR) << BIT_SHIFT_DAC_PWR_CUT_CNTR) +#define BIT_CTRL_DAC_PWR_CUT_CNTR(x) (((x) & BIT_MASK_DAC_PWR_CUT_CNTR) << BIT_SHIFT_DAC_PWR_CUT_CNTR) +#define BIT_GET_DAC_PWR_CUT_CNTR(x) (((x) >> BIT_SHIFT_DAC_PWR_CUT_CNTR) & BIT_MASK_DAC_PWR_CUT_CNTR) + +#define BIT_ST_DAC_FIFO_ON BIT(11) +#define BIT_SHIFT_ST_DAC_FIFO_ON 11 +#define BIT_MASK_ST_DAC_FIFO_ON 0x1 +#define BIT_CTRL_ST_DAC_FIFO_ON(x) (((x) & BIT_MASK_ST_DAC_FIFO_ON) << BIT_SHIFT_ST_DAC_FIFO_ON) + +#define BIT_ST_DAC_ISO_ON BIT(10) +#define BIT_SHIFT_ST_DAC_ISO_ON 10 +#define BIT_MASK_ST_DAC_ISO_ON 0x1 +#define BIT_CTRL_ST_DAC_ISO_ON(x) (((x) & BIT_MASK_ST_DAC_ISO_ON) << BIT_SHIFT_ST_DAC_ISO_ON) + +#define BIT_ST_DAC_PWR33_ON BIT(9) +#define BIT_SHIFT_ST_DAC_PWR33_ON 9 +#define BIT_MASK_ST_DAC_PWR33_ON 0x1 +#define BIT_CTRL_ST_DAC_PWR33_ON(x) (((x) & BIT_MASK_ST_DAC_PWR33_ON) << BIT_SHIFT_ST_DAC_PWR33_ON) + +#define BIT_ST_DAC_PWR12_ON BIT(8) +#define BIT_SHIFT_ST_DAC_PWR12_ON 8 +#define BIT_MASK_ST_DAC_PWR12_ON 0x1 +#define BIT_CTRL_ST_DAC_PWR12_ON(x) (((x) & BIT_MASK_ST_DAC_PWR12_ON) << BIT_SHIFT_ST_DAC_PWR12_ON) + +#define BIT_DAC_ISO_MANU BIT(3) +#define BIT_SHIFT_DAC_ISO_MANU 3 +#define BIT_MASK_DAC_ISO_MANU 0x1 +#define BIT_CTRL_DAC_ISO_MANU(x) (((x) & BIT_MASK_DAC_ISO_MANU) << BIT_SHIFT_DAC_ISO_MANU) + +#define BIT_DAC_PWR33_MANU BIT(2) +#define BIT_SHIFT_DAC_PWR33_MANU 2 +#define BIT_MASK_DAC_PWR33_MANU 0x1 +#define BIT_CTRL_DAC_PWR33_MANU(x) (((x) & BIT_MASK_DAC_PWR33_MANU) << BIT_SHIFT_DAC_PWR33_MANU) + +#define BIT_DAC_PWR12_MANU BIT(1) +#define BIT_SHIFT_DAC_PWR12_MANU 1 +#define BIT_MASK_DAC_PWR12_MANU 0x1 +#define BIT_CTRL_DAC_PWR12_MANU(x) (((x) & BIT_MASK_DAC_PWR12_MANU) << BIT_SHIFT_DAC_PWR12_MANU) + +#define BIT_DAC_PWR_AUTO BIT(0) +#define BIT_SHIFT_DAC_PWR_AUTO 0 +#define BIT_MASK_DAC_PWR_AUTO 0x1 +#define BIT_CTRL_DAC_PWR_AUTO(x) (((x) & BIT_MASK_DAC_PWR_AUTO) << BIT_SHIFT_DAC_PWR_AUTO) + + +//2 REG_DAC_ANAPAR_DA0 + +#define BIT_SHIFT_PWR_ALL_CNTR 12 +#define BIT_MASK_PWR_ALL_CNTR 0xfffff +#define BIT_PWR_ALL_CNTR(x) (((x) & BIT_MASK_PWR_ALL_CNTR) << BIT_SHIFT_PWR_ALL_CNTR) +#define BIT_CTRL_PWR_ALL_CNTR(x) (((x) & BIT_MASK_PWR_ALL_CNTR) << BIT_SHIFT_PWR_ALL_CNTR) +#define BIT_GET_PWR_ALL_CNTR(x) (((x) >> BIT_SHIFT_PWR_ALL_CNTR) & BIT_MASK_PWR_ALL_CNTR) + + +#define BIT_SHIFT_PWR_FUP_CNTR 0 +#define BIT_MASK_PWR_FUP_CNTR 0xfff +#define BIT_PWR_FUP_CNTR(x) (((x) & BIT_MASK_PWR_FUP_CNTR) << BIT_SHIFT_PWR_FUP_CNTR) +#define BIT_CTRL_PWR_FUP_CNTR(x) (((x) & BIT_MASK_PWR_FUP_CNTR) << BIT_SHIFT_PWR_FUP_CNTR) +#define BIT_GET_PWR_FUP_CNTR(x) (((x) >> BIT_SHIFT_PWR_FUP_CNTR) & BIT_MASK_PWR_FUP_CNTR) + + +//2 REG_DAC_ANAPAR_DA1 +#define BIT_FUP_EN BIT(31) +#define BIT_SHIFT_FUP_EN 31 +#define BIT_MASK_FUP_EN 0x1 +#define BIT_CTRL_FUP_EN(x) (((x) & BIT_MASK_FUP_EN) << BIT_SHIFT_FUP_EN) + + +#define BIT_SHIFT_ANAPAR_DA 8 +#define BIT_MASK_ANAPAR_DA 0x7fffff +#define BIT_ANAPAR_DA(x) (((x) & BIT_MASK_ANAPAR_DA) << BIT_SHIFT_ANAPAR_DA) +#define BIT_CTRL_ANAPAR_DA(x) (((x) & BIT_MASK_ANAPAR_DA) << BIT_SHIFT_ANAPAR_DA) +#define BIT_GET_ANAPAR_DA(x) (((x) >> BIT_SHIFT_ANAPAR_DA) & BIT_MASK_ANAPAR_DA) + +#define BIT_D_POW_DACVREF BIT(7) +#define BIT_SHIFT_D_POW_DACVREF 7 +#define BIT_MASK_D_POW_DACVREF 0x1 +#define BIT_CTRL_D_POW_DACVREF(x) (((x) & BIT_MASK_D_POW_DACVREF) << BIT_SHIFT_D_POW_DACVREF) + +#define BIT_D_POW_VREF2 BIT(6) +#define BIT_SHIFT_D_POW_VREF2 6 +#define BIT_MASK_D_POW_VREF2 0x1 +#define BIT_CTRL_D_POW_VREF2(x) (((x) & BIT_MASK_D_POW_VREF2) << BIT_SHIFT_D_POW_VREF2) + +#define BIT_D_POW_MBIAS BIT(5) +#define BIT_SHIFT_D_POW_MBIAS 5 +#define BIT_MASK_D_POW_MBIAS 0x1 +#define BIT_CTRL_D_POW_MBIAS(x) (((x) & BIT_MASK_D_POW_MBIAS) << BIT_SHIFT_D_POW_MBIAS) + +#define BIT_D_POW_DIV4 BIT(4) +#define BIT_SHIFT_D_POW_DIV4 4 +#define BIT_MASK_D_POW_DIV4 0x1 +#define BIT_CTRL_D_POW_DIV4(x) (((x) & BIT_MASK_D_POW_DIV4) << BIT_SHIFT_D_POW_DIV4) + +#define BIT_D_POW_DF1SE_R BIT(3) +#define BIT_SHIFT_D_POW_DF1SE_R 3 +#define BIT_MASK_D_POW_DF1SE_R 0x1 +#define BIT_CTRL_D_POW_DF1SE_R(x) (((x) & BIT_MASK_D_POW_DF1SE_R) << BIT_SHIFT_D_POW_DF1SE_R) + +#define BIT_D_POW_DF2SE_L BIT(2) +#define BIT_SHIFT_D_POW_DF2SE_L 2 +#define BIT_MASK_D_POW_DF2SE_L 0x1 +#define BIT_CTRL_D_POW_DF2SE_L(x) (((x) & BIT_MASK_D_POW_DF2SE_L) << BIT_SHIFT_D_POW_DF2SE_L) + +#define BIT_D_POW_DAC_R BIT(1) +#define BIT_SHIFT_D_POW_DAC_R 1 +#define BIT_MASK_D_POW_DAC_R 0x1 +#define BIT_CTRL_D_POW_DAC_R(x) (((x) & BIT_MASK_D_POW_DAC_R) << BIT_SHIFT_D_POW_DAC_R) + +#define BIT_D_POW_DAC_L BIT(0) +#define BIT_SHIFT_D_POW_DAC_L 0 +#define BIT_MASK_D_POW_DAC_L 0x1 +#define BIT_CTRL_D_POW_DAC_L(x) (((x) & BIT_MASK_D_POW_DAC_L) << BIT_SHIFT_D_POW_DAC_L) + + +//================ Register Reg Field ========================= +#define REG_DAC0_FIFO_WR 0x0000 +#define REG_DAC_CTRL 0x0004 +#define REG_DAC_INTR_CTRL 0x0008 +#define REG_DAC_INTR_STS 0x000C +#define REG_DAC_PWR_CTRL 0x0010 +#define REG_DAC_ANAPAR_DA0 0x0014 +#define REG_DAC_ANAPAR_DA1 0x0018 + + +//================ DAC HAL related enumeration ================== + + +//================ DAC HAL Macro =========================== +#define HAL_DAC_WRITE32(dacidx, addr, value) HAL_WRITE32(DAC_REG_BASE+dacidx*0x800 \ + ,addr,value) +#define HAL_DAC_READ32(dacidx, addr) HAL_READ32(DAC_REG_BASE+dacidx*0x800,addr) + + +//================ DAC Function Prototypes ===================== +RTK_STATUS HalDACInit8195a(IN VOID *Data); +RTK_STATUS HalDACDeInit8195a(IN VOID *Data); +RTK_STATUS HalDACEnableRtl8195a(IN VOID *Data); +RTK_STATUS HalDACIntrCtrl8195a(IN VOID *Data); +u8 HalDACSendRtl8195a(IN VOID *Data); +u32 HalDACReadRegRtl8195a(IN VOID *Data,IN u8 I2CReg); + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_gdma.h b/lib/fwlib/rtl8195a/rtl8195a_gdma.h new file mode 100644 index 0000000..f8a4f95 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_gdma.h @@ -0,0 +1,522 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_GDMA_H_ +#define _RTL8195A_GDMA_H_ + +// Define GDMA Handshake interface with peripheral, 0 -> GDMA0, 1-> GDMA1 +// Set this Hnadshake interface map to register REG_PESOC_SOC_CTRL +#define GDMA_HANDSHAKE_UART0_TX 0 +#define GDMA_HANDSHAKE_UART0_RX 1 +#define GDMA_HANDSHAKE_UART1_TX 2 +#define GDMA_HANDSHAKE_UART1_RX 3 +#define GDMA_HANDSHAKE_UART2_TX 14 // Only on GDMA 0, hardware fixed +#define GDMA_HANDSHAKE_UART2_RX 14 // Only on GDMA 1, hardware fixed + +#define GDMA_HANDSHAKE_SSI0_TX 4 +#define GDMA_HANDSHAKE_SSI0_RX 5 +#define GDMA_HANDSHAKE_SSI1_TX 6 +#define GDMA_HANDSHAKE_SSI1_RX 7 +#define GDMA_HANDSHAKE_SSI2_TX 15 // Only on GDMA 0, hardware fixed +#define GDMA_HANDSHAKE_SSI2_RX 15 // Only on GDMA 1, hardware fixed + +#define GDMA_HANDSHAKE_I2C0_TX 8 +#define GDMA_HANDSHAKE_I2C0_RX 9 +#define GDMA_HANDSHAKE_I2C1_TX 10 +#define GDMA_HANDSHAKE_I2C1_RX 11 + +#define GDMA_HANDSHAKE_ADC 12 +#define GDMA_HANDSHAKE_DAC0 13 // Only on GDMA 0, hardware fixed +#define GDMA_HANDSHAKE_DAC1 13 // Only on GDMA 1, hardware fixed + +#define HAL_GDMAX_READ32(GdmaIndex, addr) \ + HAL_READ32(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr) +#define HAL_GDMAX_WRITE32(GdmaIndex, addr, value) \ + HAL_WRITE32((GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF)), addr, value) +#define HAL_GDMAX_READ16(GdmaIndex, addr) \ + HAL_READ16(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr) +#define HAL_GDMAX_WRITE16(GdmaIndex, addr, value) \ + HAL_WRITE16(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr, value) +#define HAL_GDMAX_READ8(GdmaIndex, addr) \ + HAL_READ8(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr) +#define HAL_GDMAX_WRITE8(GdmaIndex, addr, value) \ + HAL_WRITE8(GDMA0_REG_BASE+ (GdmaIndex*GDMA1_REG_OFF), addr, value) + + +#define GDMA_CH_MAX 0x06 + +#define REG_GDMA_CH_OFF 0x058 +#define REG_GDMA_CH_SAR 0x000 +#define REG_GDMA_CH_DAR 0x008 +#define REG_GDMA_CH_LLP 0x010 +#define REG_GDMA_CH_CTL 0x018 +#define REG_GDMA_CH_SSTAT 0x020 +#define REG_GDMA_CH_DSTAT 0x028 +#define REG_GDMA_CH_SSTATAR 0x030 +#define REG_GDMA_CH_DSTATAR 0x038 +#define REG_GDMA_CH_CFG 0x040 +#define REG_GDMA_CH_SGR 0x048 +#define REG_GDMA_CH_DSR 0x050 + +//3 Interrupt Registers +#define REG_GDMA_RAW_INT_BASE 0x2C0 +#define REG_GDMA_RAW_INT_TFR 0x2C0 +#define REG_GDMA_RAW_INT_BLOCK 0x2c8 +#define REG_GDMA_RAW_INT_SRC_TRAN 0x2D0 +#define REG_GDMA_RAW_INT_DST_TRAN 0x2D8 +#define REG_GDMA_RAW_INT_ERR 0x2E0 + +#define REG_GDMA_STATUS_INT_BASE 0x2E8 +#define REG_GDMA_STATUS_INT_TFR 0x2E8 +#define REG_GDMA_STATUS_INT_BLOCK 0x2F0 +#define REG_GDMA_STATUS_INT_SRC_TRAN 0x2F8 +#define REG_GDMA_STATUS_INT_DST_TRAN 0x300 +#define REG_GDMA_STATUS_INT_ERR 0x308 + +#define REG_GDMA_MASK_INT_BASE 0x310 +#define REG_GDMA_MASK_INT_TFR 0x310 +#define REG_GDMA_MASK_INT_BLOCK 0x318 +#define REG_GDMA_MASK_INT_SRC_TRAN 0x320 +#define REG_GDMA_MASK_INT_DST_TRAN 0x328 +#define REG_GDMA_MASK_INT_INT_ERR 0x330 + +#define REG_GDMA_CLEAR_INT_BASE 0x338 +#define REG_GDMA_CLEAR_INT_TFR 0x338 +#define REG_GDMA_CLEAR_INT_BLOCK 0x340 +#define REG_GDMA_CLEAR_INT_SRC_TRAN 0x348 +#define REG_GDMA_CLEAR_INT_DST_TRAN 0x350 +#define REG_GDMA_CLEAR_INT_ERR 0x358 +#define REG_GDMA_STATUS_INT 0x360 + +//3 Software handshaking Registers +#define REG_GDMA_REQ_SRC 0x368 +#define REG_GDMA_REQ_DST 0x370 +#define REG_GDMA_REQ_SGL_REQ 0x378 +#define REG_GDMA_REQ_DST_REQ 0x380 +#define REG_GDMA_REQ_LST_SRC 0x388 +#define REG_GDMA_REQ_LST_DST 0x390 + +//3 Miscellaneous Registers +#define REG_GDMA_DMAC_CFG 0x398 +#define REG_GDMA_CH_EN 0x3A0 +#define REG_GDMA_DMA_ID 0x3A8 +#define REG_GDMA_DMA_TEST 0x3B0 +#define REG_GDMA_DMA_COM_PARAMS6 0x3C8 +#define REG_GDMA_DMA_COM_PARAMS5 0x3D0 +#define REG_GDMA_DMA_COM_PARAMS4 0x3D8 +#define REG_GDMA_DMA_COM_PARAMS3 0x3E0 +#define REG_GDMA_DMA_COM_PARAMS2 0x3E8 +#define REG_GDMA_DMA_COM_PARAMS1 0x3F0 +#define REG_GDMA_DMA_COM_PARAMS0 0x3F8 + +//3 CTL Register Bit Control +#define BIT_SHIFT_CTLX_LO_INT_EN 0 +#define BIT_MASK_CTLX_LO_INT_EN 0x1 +#define BIT_CTLX_LO_INT_EN(x)(((x) & BIT_MASK_CTLX_LO_INT_EN) << BIT_SHIFT_CTLX_LO_INT_EN) +#define BIT_INVC_CTLX_LO_INT_EN (~(BIT_MASK_CTLX_LO_INT_EN << BIT_SHIFT_CTLX_LO_INT_EN)) + +#define BIT_SHIFT_CTLX_LO_DST_TR_WIDTH 1 +#define BIT_MASK_CTLX_LO_DST_TR_WIDTH 0x7 +#define BIT_CTLX_LO_DST_TR_WIDTH(x) (((x) & BIT_MASK_CTLX_LO_DST_TR_WIDTH) << BIT_SHIFT_CTLX_LO_DST_TR_WIDTH) +#define BIT_INVC_CTLX_LO_DST_TR_WIDTH (~(BIT_MASK_CTLX_LO_DST_TR_WIDTH << BIT_SHIFT_CTLX_LO_DST_TR_WIDTH)) + +#define BIT_SHIFT_CTLX_LO_SRC_TR_WIDTH 4 +#define BIT_MASK_CTLX_LO_SRC_TR_WIDTH 0x7 +#define BIT_CTLX_LO_SRC_TR_WIDTH(x) (((x) & BIT_MASK_CTLX_LO_SRC_TR_WIDTH) << BIT_SHIFT_CTLX_LO_SRC_TR_WIDTH) +#define BIT_INVC_CTLX_LO_SRC_TR_WIDTH (~(BIT_MASK_CTLX_LO_SRC_TR_WIDTH << BIT_SHIFT_CTLX_LO_SRC_TR_WIDTH)) + +#define BIT_SHIFT_CTLX_LO_DINC 7 +#define BIT_MASK_CTLX_LO_DINC 0x3 +#define BIT_CTLX_LO_DINC(x)(((x) & BIT_MASK_CTLX_LO_DINC) << BIT_SHIFT_CTLX_LO_DINC) +#define BIT_INVC_CTLX_LO_DINC (~(BIT_MASK_CTLX_LO_DINC << BIT_SHIFT_CTLX_LO_DINC)) + +#define BIT_SHIFT_CTLX_LO_SINC 9 +#define BIT_MASK_CTLX_LO_SINC 0x3 +#define BIT_CTLX_LO_SINC(x)(((x) & BIT_MASK_CTLX_LO_SINC) << BIT_SHIFT_CTLX_LO_SINC) +#define BIT_INVC_CTLX_LO_SINC (~(BIT_MASK_CTLX_LO_SINC << BIT_SHIFT_CTLX_LO_SINC)) + +#define BIT_SHIFT_CTLX_LO_DEST_MSIZE 11 +#define BIT_MASK_CTLX_LO_DEST_MSIZE 0x7 +#define BIT_CTLX_LO_DEST_MSIZE(x)(((x) & BIT_MASK_CTLX_LO_DEST_MSIZE) << BIT_SHIFT_CTLX_LO_DEST_MSIZE) +#define BIT_INVC_CTLX_LO_DEST_MSIZE (~(BIT_MASK_CTLX_LO_DEST_MSIZE << BIT_SHIFT_CTLX_LO_DEST_MSIZE)) + +#define BIT_SHIFT_CTLX_LO_SRC_MSIZE 14 +#define BIT_MASK_CTLX_LO_SRC_MSIZE 0x7 +#define BIT_CTLX_LO_SRC_MSIZE(x)(((x) & BIT_MASK_CTLX_LO_SRC_MSIZE) << BIT_SHIFT_CTLX_LO_SRC_MSIZE) +#define BIT_INVC_CTLX_LO_SRC_MSIZE (~(BIT_MASK_CTLX_LO_SRC_MSIZE << BIT_SHIFT_CTLX_LO_SRC_MSIZE)) + + +#define BIT_SHIFT_CTLX_LO_SRC_GATHER_EN 17 +#define BIT_MASK_CTLX_LO_SRC_GATHER_EN 0x1 +#define BIT_CTLX_LO_SRC_GATHER_EN(x)(((x) & BIT_MASK_CTLX_LO_SRC_GATHER_EN) << BIT_SHIFT_CTLX_LO_SRC_GATHER_EN) +#define BIT_INVC_CTLX_LO_SRC_GATHER_EN (~(BIT_MASK_CTLX_LO_SRC_GATHER_EN << BIT_SHIFT_CTLX_LO_SRC_GATHER_EN)) + + +#define BIT_SHIFT_CTLX_LO_DST_SCATTER_EN 18 +#define BIT_MASK_CTLX_LO_DST_SCATTER_EN 0x1 +#define BIT_CTLX_LO_DST_SCATTER_EN(x)(((x) & BIT_MASK_CTLX_LO_DST_SCATTER_EN) << BIT_SHIFT_CTLX_LO_DST_SCATTER_EN) +#define BIT_INVC_CTLX_LO_DST_SCATTER_EN (~(BIT_MASK_CTLX_LO_DST_SCATTER_EN << BIT_SHIFT_CTLX_LO_DST_SCATTER_EN)) + + +#define BIT_SHIFT_CTLX_LO_TT_FC 20 +#define BIT_MASK_CTLX_LO_TT_FC 0x7 +#define BIT_CTLX_LO_TT_FC(x)(((x) & BIT_MASK_CTLX_LO_TT_FC) << BIT_SHIFT_CTLX_LO_TT_FC) +#define BIT_INVC_CTLX_LO_TT_FC (~(BIT_MASK_CTLX_LO_TT_FC << BIT_SHIFT_CTLX_LO_TT_FC)) + + +#define BIT_SHIFT_CTLX_LO_DMS 23 +#define BIT_MASK_CTLX_LO_DMS 0x3 +#define BIT_CTLX_LO_DMS(x)(((x) & BIT_MASK_CTLX_LO_DMS) << BIT_MASK_CTLX_LO_DMS) +#define BIT_INVC_CTLX_LO_DMS (~(BIT_MASK_CTLX_LO_DMS << BIT_SHIFT_CTLX_LO_DMS)) + + +#define BIT_SHIFT_CTLX_LO_SMS 25 +#define BIT_MASK_CTLX_LO_SMS 0x3 +#define BIT_CTLX_LO_SMS(x)(((x) & BIT_MASK_CTLX_LO_SMS) << BIT_SHIFT_CTLX_LO_SMS) +#define BIT_INVC_CTLX_LO_SMS (~(BIT_MASK_CTLX_LO_SMS << BIT_SHIFT_CTLX_LO_SMS)) + + +#define BIT_SHIFT_CTLX_LO_LLP_DST_EN 27 +#define BIT_MASK_CTLX_LO_LLP_DST_EN 0x1 +#define BIT_CTLX_LO_LLP_DST_EN(x)(((x) & BIT_MASK_CTLX_LO_LLP_DST_EN) << BIT_SHIFT_CTLX_LO_LLP_DST_EN) +#define BIT_INVC_CTLX_LO_LLP_DST_EN (~(BIT_MASK_CTLX_LO_LLP_DST_EN << BIT_SHIFT_CTLX_LO_LLP_DST_EN)) + +#define BIT_SHIFT_CTLX_LO_LLP_SRC_EN 28 +#define BIT_MASK_CTLX_LO_LLP_SRC_EN 0x1 +#define BIT_CTLX_LO_LLP_SRC_EN(x)(((x) & BIT_MASK_CTLX_LO_LLP_SRC_EN) << BIT_SHIFT_CTLX_LO_LLP_SRC_EN) +#define BIT_INVC_CTLX_LO_LLP_SRC_EN (~(BIT_MASK_CTLX_LO_LLP_SRC_EN << BIT_SHIFT_CTLX_LO_LLP_SRC_EN)) + + +#define BIT_SHIFT_CTLX_UP_BLOCK_BS 0 +#define BIT_MASK_CTLX_UP_BLOCK_BS 0xFFF +#define BIT_CTLX_UP_BLOCK_BS(x)(((x) & BIT_MASK_CTLX_UP_BLOCK_BS) << BIT_SHIFT_CTLX_UP_BLOCK_BS) +#define BIT_INVC_CTLX_UP_BLOCK_BS (~(BIT_MASK_CTLX_UP_BLOCK_BS << BIT_SHIFT_CTLX_UP_BLOCK_BS)) + + +#define BIT_SHIFT_CTLX_UP_DONE 12 +#define BIT_MASK_CTLX_UP_DONE 0x1 +#define BIT_CTLX_UP_DONE(x)(((x) & BIT_MASK_CTLX_UP_DONE) << BIT_SHIFT_CTLX_UP_DONE) +#define BIT_INVC_CTLX_UP_DONE (~(BIT_MASK_CTLX_UP_DONE << BIT_SHIFT_CTLX_UP_DONE)) + + +//3 CFG Register Bit Control +#define BIT_SHIFT_CFGX_LO_CH_PRIOR 5 +#define BIT_MASK_CFGX_LO_CH_PRIOR 0x7 +#define BIT_CFGX_LO_CH_PRIOR(x)(((x) & BIT_MASK_CFGX_LO_CH_PRIOR) << BIT_SHIFT_CFGX_LO_CH_PRIOR) +#define BIT_INVC_CFGX_LO_CH_PRIOR (~(BIT_MASK_CFGX_LO_CH_PRIOR << BIT_SHIFT_CFGX_LO_CH_PRIOR)) + + +#define BIT_SHIFT_CFGX_LO_CH_SUSP 8 +#define BIT_MASK_CFGX_LO_CH_SUSP 0x1 +#define BIT_CFGX_LO_CH_SUSP(x)(((x) & BIT_MASK_CFGX_LO_CH_SUSP) << BIT_SHIFT_CFGX_LO_CH_SUSP) +#define BIT_INVC_CFGX_LO_CH_SUSP (~(BIT_MASK_CFGX_LO_CH_SUSP << BIT_SHIFT_CFGX_LO_CH_SUSP)) + + +#define BIT_SHIFT_CFGX_LO_FIFO_EMPTY 9 +#define BIT_MASK_CFGX_LO_FIFO_EMPTY 0x1 +#define BIT_CFGX_LO_FIFO_EMPTY(x)(((x) & BIT_MASK_CFGX_LO_FIFO_EMPTY) << BIT_SHIFT_CFGX_LO_FIFO_EMPTY) +#define BIT_INVC_CFGX_LO_FIFO_EMPTY (~(BIT_MASK_CFGX_LO_FIFO_EMPTY << BIT_SHIFT_CFGX_LO_FIFO_EMPTY)) + + +#define BIT_SHIFT_CFGX_LO_HS_SEL_DST 10 +#define BIT_MASK_CFGX_LO_HS_SEL_DST 0x1 +#define BIT_CFGX_LO_HS_SEL_DST(x)(((x) & BIT_MASK_CFGX_LO_HS_SEL_DST) << BIT_SHIFT_CFGX_LO_HS_SEL_DST) +#define BIT_INVC_CFGX_LO_HS_SEL_DST (~(BIT_MASK_CFGX_LO_HS_SEL_DST << BIT_SHIFT_CFGX_LO_HS_SEL_DST)) + +#define BIT_SHIFT_CFGX_LO_HS_SEL_SRC 11 +#define BIT_MASK_CFGX_LO_HS_SEL_SRC 0x1 +#define BIT_CFGX_LO_HS_SEL_SRC(x)(((x) & BIT_MASK_CFGX_LO_HS_SEL_SRC) << BIT_SHIFT_CFGX_LO_HS_SEL_SRC) +#define BIT_INVC_CFGX_LO_HS_SEL_SRC (~(BIT_MASK_CFGX_LO_HS_SEL_SRC << BIT_SHIFT_CFGX_LO_HS_SEL_SRC)) + +#define BIT_SHIFT_CFGX_LO_LOCK_CH_L 12 +#define BIT_MASK_CFGX_LO_LOCK_CH_L 0x3 +#define BIT_CFGX_LO_LOCK_CH_L(x)(((x) & BIT_MASK_CFGX_LO_LOCK_CH_L) << BIT_SHIFT_CFGX_LO_LOCK_CH_L) +#define BIT_INVC_CFGX_LO_LOCK_CH_L (~(BIT_MASK_CFGX_LO_LOCK_CH_L << BIT_SHIFT_CFGX_LO_LOCK_CH_L)) + +#define BIT_SHIFT_CFGX_LO_LOCK_B_L 14 +#define BIT_MASK_CFGX_LO_LOCK_B_L 0x3 +#define BIT_CFGX_LO_LOCK_B_L(x)(((x) & BIT_MASK_CFGX_LO_LOCK_B_L) << BIT_SHIFT_CFGX_LO_LOCK_B_L) +#define BIT_INVC_CFGX_LO_LOCK_B_L (~(BIT_MASK_CFGX_LO_LOCK_B_L << BIT_SHIFT_CFGX_LO_LOCK_B_L)) + +#define BIT_SHIFT_CFGX_LO_LOCK_CH 16 +#define BIT_MASK_CFGX_LO_LOCK_CH 0x1 +#define BIT_CFGX_LO_LOCK_CH(x)(((x) & BIT_MASK_CFGX_LO_LOCK_CH) << BIT_SHIFT_CFGX_LO_LOCK_CH) +#define BIT_INVC_CFGX_LO_LOCK_CH (~(BIT_MASK_CFGX_LO_LOCK_CH << BIT_SHIFT_CFGX_LO_LOCK_CH)) + +#define BIT_SHIFT_CFGX_LO_LOCK_B 17 +#define BIT_MASK_CFGX_LO_LOCK_B 0x1 +#define BIT_CFGX_LO_LOCK_B(x)(((x) & BIT_MASK_CFGX_LO_LOCK_B) << BIT_SHIFT_CFGX_LO_LOCK_B) +#define BIT_INVC_CFGX_LO_LOCK_B (~(BIT_MASK_CFGX_LO_LOCK_B << BIT_SHIFT_CFGX_LO_LOCK_B)) + +#define BIT_SHIFT_CFGX_LO_DST_HS_POL 18 +#define BIT_MASK_CFGX_LO_DST_HS_POL 0x1 +#define BIT_CFGX_LO_DST_HS_POL(x)(((x) & BIT_MASK_CFGX_LO_DST_HS_POL) << BIT_SHIFT_CFGX_LO_DST_HS_POL) +#define BIT_INVC_CFGX_LO_DST_HS_POL (~(BIT_MASK_CFGX_LO_DST_HS_POL << BIT_SHIFT_CFGX_LO_DST_HS_POL)) + +#define BIT_SHIFT_CFGX_LO_SRC_HS_POL 19 +#define BIT_MASK_CFGX_LO_SRC_HS_POL 0x1 +#define BIT_CFGX_LO_SRC_HS_POL(x)(((x) & BIT_MASK_CFGX_LO_SRC_HS_POL) << BIT_SHIFT_CFGX_LO_SRC_HS_POL) +#define BIT_INVC_CFGX_LO_SRC_HS_POL (~(BIT_MASK_CFGX_LO_SRC_HS_POL << BIT_SHIFT_CFGX_LO_SRC_HS_POL)) + +#define BIT_SHIFT_CFGX_LO_MAX_ABRST 20 +#define BIT_MASK_CFGX_LO_MAX_ABRST 0x3FF +#define BIT_CFGX_LO_MAX_ABRST(x)(((x) & BIT_MASK_CFGX_LO_MAX_ABRST) << BIT_SHIFT_CFGX_LO_MAX_ABRST) +#define BIT_INVC_CFGX_LO_MAX_ABRST (~(BIT_MASK_CFGX_LO_MAX_ABRST << BIT_SHIFT_CFGX_LO_MAX_ABRST)) + +#define BIT_SHIFT_CFGX_LO_RELOAD_SRC 30 +#define BIT_MASK_CFGX_LO_RELOAD_SRC 0x1 +#define BIT_CFGX_LO_RELOAD_SRC(x)(((x) & BIT_MASK_CFGX_LO_RELOAD_SRC) << BIT_SHIFT_CFGX_LO_RELOAD_SRC) +#define BIT_INVC_CFGX_LO_RELOAD_SRC (~(BIT_MASK_CFGX_LO_RELOAD_SRC << BIT_SHIFT_CFGX_LO_RELOAD_SRC)) + +#define BIT_SHIFT_CFGX_LO_RELOAD_DST 31 +#define BIT_MASK_CFGX_LO_RELOAD_DST 0x1 +#define BIT_CFGX_LO_RELOAD_DST(x)(((x) & BIT_MASK_CFGX_LO_RELOAD_DST) << BIT_SHIFT_CFGX_LO_RELOAD_DST) +#define BIT_INVC_CFGX_LO_RELOAD_DST (~(BIT_MASK_CFGX_LO_RELOAD_DST << BIT_SHIFT_CFGX_LO_RELOAD_DST)) + +#define BIT_SHIFT_CFGX_UP_FCMODE 0 +#define BIT_MASK_CFGX_UP_FCMODE 0x1 +#define BIT_CFGX_UP_FCMODE(x)(((x) & BIT_MASK_CFGX_UP_FCMODE) << BIT_SHIFT_CFGX_UP_FCMODE) +#define BIT_INVC_CFGX_UP_FCMODE (~(BIT_MASK_CFGX_UP_FCMODE << BIT_SHIFT_CFGX_UP_FCMODE)) + +#define BIT_SHIFT_CFGX_UP_FIFO_MODE 1 +#define BIT_MASK_CFGX_UP_FIFO_MODE 0x1 +#define BIT_CFGX_UP_FIFO_MODE(x)(((x) & BIT_MASK_CFGX_UP_FIFO_MODE) << BIT_SHIFT_CFGX_UP_FIFO_MODE) +#define BIT_INVC_CFGX_UP_FIFO_MODE (~(BIT_MASK_CFGX_UP_FIFO_MODE << BIT_SHIFT_CFGX_UP_FIFO_MODE)) + +#define BIT_SHIFT_CFGX_UP_PROTCTL 2 +#define BIT_MASK_CFGX_UP_PROTCTL 0x7 +#define BIT_CFGX_UP_PROTCTL(x)(((x) & BIT_MASK_CFGX_UP_PROTCTL) << BIT_SHIFT_CFGX_UP_PROTCTL) +#define BIT_INVC_CFGX_UP_PROTCTL (~(BIT_MASK_CFGX_UP_PROTCTL << BIT_SHIFT_CFGX_UP_PROTCTL)) + +#define BIT_SHIFT_CFGX_UP_DS_UPD_EN 5 +#define BIT_MASK_CFGX_UP_DS_UPD_EN 0x1 +#define BIT_CFGX_UP_DS_UPD_EN(x)(((x) & BIT_MASK_CFGX_UP_DS_UPD_EN) << BIT_SHIFT_CFGX_UP_DS_UPD_EN) +#define BIT_INVC_CFGX_UP_DS_UPD_EN (~(BIT_MASK_CFGX_UP_DS_UPD_EN << BIT_SHIFT_CFGX_UP_DS_UPD_EN)) + +#define BIT_SHIFT_CFGX_UP_SS_UPD_EN 6 +#define BIT_MASK_CFGX_UP_SS_UPD_EN 0x1 +#define BIT_CFGX_UP_SS_UPD_EN(x)(((x) & BIT_MASK_CFGX_UP_SS_UPD_EN) << BIT_SHIFT_CFGX_UP_SS_UPD_EN) +#define BIT_INVC_CFGX_UP_SS_UPD_EN (~(BIT_MASK_CFGX_UP_SS_UPD_EN << BIT_SHIFT_CFGX_UP_SS_UPD_EN)) + +#define BIT_SHIFT_CFGX_UP_SRC_PER 7 +#define BIT_MASK_CFGX_UP_SRC_PER 0xF +#define BIT_CFGX_UP_SRC_PER(x)(((x) & BIT_MASK_CFGX_UP_SRC_PER) << BIT_SHIFT_CFGX_UP_SRC_PER) +#define BIT_INVC_CFGX_UP_SRC_PER (~(BIT_MASK_CFGX_UP_SRC_PER << BIT_SHIFT_CFGX_UP_SRC_PER)) + +#define BIT_SHIFT_CFGX_UP_DEST_PER 11 +#define BIT_MASK_CFGX_UP_DEST_PER 0xF +#define BIT_CFGX_UP_DEST_PER(x)(((x) & BIT_MASK_CFGX_UP_DEST_PER) << BIT_SHIFT_CFGX_UP_DEST_PER) +#define BIT_INVC_CFGX_UP_DEST_PER (~(BIT_MASK_CFGX_UP_DEST_PER << BIT_SHIFT_CFGX_UP_DEST_PER)) + +typedef enum _GDMA_CHANNEL_NUM_ { + GdmaNoCh = 0x0000, + GdmaCh0 = 0x0101, + GdmaCh1 = 0x0202, + GdmaCh2 = 0x0404, + GdmaCh3 = 0x0808, + GdmaCh4 = 0x1010, + GdmaCh5 = 0x2020, + GdmaCh6 = 0x4040, + GdmaCh7 = 0x8080, + GdmaAllCh = 0xffff +}GDMA_CHANNEL_NUM, *PGDMA_CHANNEL_NUM; + + +//3 CTL register struct + +typedef enum _GDMA_CTL_TT_FC_TYPE_ { + TTFCMemToMem = 0x00, + TTFCMemToPeri = 0x01, + TTFCPeriToMem = 0x02 +}GDMA_CTL_TT_FC_TYPE, *PGDMA_CTL_TT_FC_TYPE; + +//Max type = Bus Width +typedef enum _GDMA_CTL_TR_WIDTH_ { + TrWidthOneByte = 0x00, + TrWidthTwoBytes = 0x01, + TrWidthFourBytes = 0x02 +}GDMA_CTL_TR_WIDTH, *PGDMA_CTL_TR_WIDTH; + +typedef enum _GDMA_CTL_MSIZE_ { + MsizeOne = 0x00, + MsizeFour = 0x01, + MsizeEight = 0x02 +}GDMA_CTL_MSIZE, *PGDMA_CTL_MSIZE; + +typedef enum _GDMA_INC_TYPE_ { + IncType = 0x00, + DecType = 0x01, + NoChange = 0x02 +}GDMA_INC_TYPE, *PGDMA_INC_TYPE; + + +typedef struct _GDMA_CTL_REG_ { + GDMA_CTL_TT_FC_TYPE TtFc; + GDMA_CTL_TR_WIDTH DstTrWidth; + GDMA_CTL_TR_WIDTH SrcTrWidth; + GDMA_INC_TYPE Dinc; + GDMA_INC_TYPE Sinc; + GDMA_CTL_MSIZE DestMsize; + GDMA_CTL_MSIZE SrcMsize; + + u8 IntEn :1; // Bit 0 + u8 SrcGatherEn :1; // Bit 1 + u8 DstScatterEn :1; // Bit 2 + u8 LlpDstEn :1; // Bit 3 + u8 LlpSrcEn :1; // Bit 4 + u8 Done :1; // Bit 5 + u8 Rsvd6To7 :2; //Bit 6 -7 + u16 BlockSize; + +}GDMA_CTL_REG, *PGDMA_CTL_REG; + + +//3 CFG Register Structure + +typedef enum _GDMA_CH_PRIORITY_ { + Prior0 = 0, + Prior1 = 1, + Prior2 = 2, + Prior3 = 3, + Prior4 = 4, + Prior5 = 5, + Prior6 = 6, + Prior7 = 7 +}GDMA_CH_PRIORITY, *PGDMA_CH_PRIORITY; + +typedef enum _GDMA_LOCK_LEVEL_ { + OverComplDmaTransfer = 0x00, + OverComplDmaBlockTransfer = 0x01, + OverComplDmaTransation = 0x02 +}GDMA_LOCK_LEVEL, *PGDMA_LOCK_LEVEL; + + +typedef struct _GDMA_CFG_REG_ { + GDMA_CH_PRIORITY ChPrior; + GDMA_LOCK_LEVEL LockBL; + GDMA_LOCK_LEVEL LockChL; + u16 MaxAbrst; + u8 SrcPer; + u8 DestPer; + u16 ChSusp :1; //Bit 0 + u16 FifoEmpty :1; //Bit 1 + u16 HsSelDst :1; //Bit 2 + u16 HsSelSrc :1; //Bit 3 + u16 LockCh :1; //Bit 4 + u16 LockB :1; //Bit 5 + u16 DstHsPol :1; //Bit 6 + u16 SrcHsPol :1; //Bit 7 + u16 ReloadSrc :1; //Bit 8 + u16 ReloadDst :1; //Bit 9 + u16 FifoMode :1; //Bit 10 + u16 DsUpdEn :1; //Bit 11 + u16 SsUpdEn :1; //Bit 12 + u16 Rsvd13To15 :3; +}GDMA_CFG_REG, *PGDMA_CFG_REG; + +typedef enum _GDMA_ISR_TYPE_ { + TransferType = 0x1, + BlockType = 0x2, + SrcTransferType = 0x4, + DstTransferType = 0x8, + ErrType = 0x10 +}GDMA_ISR_TYPE, *PGDMA_ISR_TYPE; + + +VOID +HalGdmaOnOffRtl8195a ( + IN VOID *Data +); + +BOOL +HalGdamChInitRtl8195a( + IN VOID *Data +); + +BOOL +HalGdmaChSetingRtl8195a( + IN VOID *Data +); + +BOOL +HalGdmaChBlockSetingRtl8195a( + IN VOID *Data +); + + +VOID +HalGdmaChDisRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChEnRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChIsrEnAndDisRtl8195a ( + IN VOID *Data +); + +u8 +HalGdmaChIsrCleanRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChCleanAutoSrcRtl8195a ( + IN VOID *Data +); + +VOID +HalGdmaChCleanAutoDstRtl8195a ( + IN VOID *Data +); + +u32 +HalGdmaQueryDArRtl8195a( + IN VOID *Data +); + +u32 +HalGdmaQuerySArRtl8195a( + IN VOID *Data +); + +BOOL +HalGdmaQueryChEnRtl8195a ( + IN VOID *Data +); + +#ifdef CONFIG_CHIP_E_CUT +_LONG_CALL_ BOOL +HalGdmaChBlockSetingRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ u32 +HalGdmaQueryDArRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ u32 +HalGdmaQuerySArRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ BOOL +HalGdmaQueryChEnRtl8195a_V04 ( + IN VOID *Data +); + +#endif // #ifdef CONFIG_CHIP_E_CUT + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_gpio.h b/lib/fwlib/rtl8195a/rtl8195a_gpio.h new file mode 100644 index 0000000..a5ba6cc --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_gpio.h @@ -0,0 +1,352 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_GPIO_H_ +#define _RTL8195A_GPIO_H_ + +#include "hal_api.h" +#include "hal_gpio.h" + +#define GPIO_PORTA_DR 0x00 // data register +#define GPIO_PORTA_DDR 0x04 // data direction +#define GPIO_PORTA_CTRL 0x08 // data source control, we should keep it as default: data source from software + +#define GPIO_PORTB_DR 0x0c // data register +#define GPIO_PORTB_DDR 0x10 // data direction +#define GPIO_PORTB_CTRL 0x14 // data source control, we should keep it as default: data source from software + +#define GPIO_PORTC_DR 0x18 // data register +#define GPIO_PORTC_DDR 0x1c // data direction +#define GPIO_PORTC_CTRL 0x20 // data source control, we should keep it as default: data source from software + +//1 Only the PORTA can be configured to generate interrupts +#define GPIO_INT_EN 0x30 // Interrupt enable register +#define GPIO_INT_MASK 0x34 // Interrupt mask +#define GPIO_INT_TYPE 0x38 // Interrupt type(level/edge) register +#define GPIO_INT_POLARITY 0x3C // Interrupt polarity(Active low/high) register +#define GPIO_INT_STATUS 0x40 // Interrupt status +#define GPIO_INT_RAWSTATUS 0x44 // Interrupt status without mask +#define GPIO_DEBOUNCE 0x48 // Interrupt signal debounce +#define GPIO_PORTA_EOI 0x4c // Clear interrupt + +#define GPIO_EXT_PORTA 0x50 // GPIO IN read or OUT read back +#define GPIO_EXT_PORTB 0x54 // GPIO IN read or OUT read back +#define GPIO_EXT_PORTC 0x58 // GPIO IN read or OUT read back + +#define GPIO_INT_SYNC 0x60 // Is level-sensitive interrupt being sync sith PCLK + +enum { + HAL_GPIO_HIGHZ = 0, + HAL_GPIO_PULL_LOW = 1, + HAL_GPIO_PULL_HIGH = 2 +}; + +//====================================================== +// ROM Function prototype +extern PHAL_GPIO_ADAPTER _pHAL_Gpio_Adapter; + +static __inline HAL_Status +GPIO_Lock ( + VOID +) +{ + HAL_Status Status; + + if (_pHAL_Gpio_Adapter->EnterCritical) { + _pHAL_Gpio_Adapter->EnterCritical(); + } + + if(_pHAL_Gpio_Adapter->Locked) { + Status = HAL_BUSY; + } + else { + _pHAL_Gpio_Adapter->Locked = 1; + Status = HAL_OK; + } + + if (_pHAL_Gpio_Adapter->ExitCritical) { + _pHAL_Gpio_Adapter->ExitCritical(); + } + + return Status; +} + + +static __inline VOID +GPIO_UnLock ( + VOID +) +{ + if (_pHAL_Gpio_Adapter->EnterCritical) { + _pHAL_Gpio_Adapter->EnterCritical(); + } + + _pHAL_Gpio_Adapter->Locked = 0; + + if (_pHAL_Gpio_Adapter->ExitCritical) { + _pHAL_Gpio_Adapter->ExitCritical(); + } +} + + +_LONG_CALL_ extern u32 +HAL_GPIO_IrqHandler_8195a( + IN VOID *pData +); + +_LONG_CALL_ extern u32 +HAL_GPIO_MbedIrqHandler_8195a( + IN VOID *pData +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_IntCtrl_8195a( + HAL_GPIO_PIN *GPIO_Pin, + u32 En +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_Init_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_DeInit_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +_LONG_CALL_ HAL_GPIO_PIN_STATE +HAL_GPIO_ReadPin_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_WritePin_8195a( + HAL_GPIO_PIN *GPIO_Pin, + HAL_GPIO_PIN_STATE Pin_State +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_RegIrq_8195a( + IN PIRQ_HANDLE pIrqHandle +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_UnRegIrq_8195a( + IN PIRQ_HANDLE pIrqHandle +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_UserRegIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin, + VOID *IrqHandler, + VOID *IrqData +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_UserUnRegIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_MaskIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_UnMaskIrq_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_IntDebounce_8195a( + HAL_GPIO_PIN *GPIO_Pin, + u8 Enable +); + +_LONG_CALL_ u32 +HAL_GPIO_GetIPPinName_8195a( + u32 chip_pin +); + +_LONG_CALL_ HAL_Status +HAL_GPIO_PullCtrl_8195a( + u32 chip_pin, + u8 pull_type +); + +_LONG_CALL_ u32 +GPIO_GetChipPinName_8195a( + u32 port, + u32 pin +); + +_LONG_CALL_ VOID +GPIO_PullCtrl_8195a( + u32 chip_pin, + u8 pull_type +); + +_LONG_CALL_ VOID +GPIO_Int_SetType_8195a( + u8 pin_num, + u8 int_mode +); + + +_LONG_CALL_ HAL_Status HAL_GPIO_IntCtrl_8195aV02(HAL_GPIO_PIN *GPIO_Pin, u32 En); +_LONG_CALL_ u32 GPIO_Int_Clear_8195aV02(u32 irq_clr); + +HAL_Status +HAL_GPIO_ClearISR_8195a( + HAL_GPIO_PIN *GPIO_Pin +); + + +/********** HAL In-Line Functions **********/ + +/** + * @brief De-Initializes a GPIO Pin, reset it as default setting. + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @retval HAL_Status + */ +static __inline VOID +HAL_GPIO_DeInit( + HAL_GPIO_PIN *GPIO_Pin +) +{ + HAL_GPIO_DeInit_8195a(GPIO_Pin); +} + +/** + * @brief Reads the specified input port pin. + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @retval The input port pin current status(High or Low). + */ +static __inline s32 +HAL_GPIO_ReadPin( + HAL_GPIO_PIN *GPIO_Pin +) +{ + return (s32)HAL_GPIO_ReadPin_8195a(GPIO_Pin); +} + +/** + * @brief Write the specified output port pin. + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @param Pin_State: The state going to be set to the assigned GPIO pin. + * + * @retval None + */ +static __inline VOID +HAL_GPIO_WritePin( + HAL_GPIO_PIN *GPIO_Pin, + u32 Value +) +{ + HAL_GPIO_WritePin_8195a(GPIO_Pin, (HAL_GPIO_PIN_STATE)Value); +} + +/** + * @brief To register a user interrupt handler for a specified pin + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @param IrqHandler: The IRQ handler to be assigned to the specified pin + * + * @param IrqData: The pointer will be pass the the IRQ handler + * + * @retval None + */ +static __inline VOID +HAL_GPIO_UserRegIrq( + HAL_GPIO_PIN *GPIO_Pin, + VOID *IrqHandler, + VOID *IrqData +) +{ + HAL_GPIO_UserRegIrq_8195a(GPIO_Pin, IrqHandler, IrqData); +} + +/** + * @brief To un-register a user interrupt handler for a specified pin + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @retval None + */ +static __inline VOID +HAL_GPIO_UserUnRegIrq( + HAL_GPIO_PIN *GPIO_Pin +) +{ + HAL_GPIO_UserUnRegIrq_8195a(GPIO_Pin); +} + + +/** + * @brief Enable/Disable GPIO interrupt + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin initialization. + * + * @param En: Enable (1) or Disable (0) + * + * @retval HAL_Status + */ +static __inline VOID +HAL_GPIO_IntCtrl( + HAL_GPIO_PIN *GPIO_Pin, + u32 En +) +{ + HAL_GPIO_IntCtrl_8195a(GPIO_Pin, En); +} + +/** + * @brief Mask the interrupt of a specified pin + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @retval None + */ +static __inline VOID +HAL_GPIO_MaskIrq( + HAL_GPIO_PIN *GPIO_Pin +) +{ + HAL_GPIO_MaskIrq_8195a(GPIO_Pin); +} + + +/** + * @brief UnMask the interrupt of a specified pin + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @retval None + */ +static __inline VOID +HAL_GPIO_UnMaskIrq( + HAL_GPIO_PIN *GPIO_Pin +) +{ + HAL_GPIO_ClearISR_8195a(GPIO_Pin); + HAL_GPIO_UnMaskIrq_8195a(GPIO_Pin); +} + + +#endif // end of "#define _RTL8195A_GPIO_H_" + diff --git a/lib/fwlib/rtl8195a/rtl8195a_i2c.h b/lib/fwlib/rtl8195a/rtl8195a_i2c.h new file mode 100644 index 0000000..4e34db8 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_i2c.h @@ -0,0 +1,851 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_I2C_H_ +#define _RTL8195A_I2C_H_ + +#include "hal_api.h" + +//================ Register Bit Field ================== +//2 REG_DW_I2C_IC_CON +#define BIT_IC_CON_IC_SLAVE_DISABLE BIT(6) +#define BIT_SHIFT_IC_CON_IC_SLAVE_DISABLE 6 +#define BIT_MASK_IC_CON_IC_SLAVE_DISABLE 0x1 +#define BIT_CTRL_IC_CON_IC_SLAVE_DISABLE(x) (((x) & BIT_MASK_IC_CON_IC_SLAVE_DISABLE) << BIT_SHIFT_IC_CON_IC_SLAVE_DISABLE) + +#define BIT_IC_CON_IC_RESTART_EN BIT(5) +#define BIT_SHIFT_IC_CON_IC_RESTART_EN 5 +#define BIT_MASK_IC_CON_IC_RESTART_EN 0x1 +#define BIT_CTRL_IC_CON_IC_RESTART_EN(x) (((x) & BIT_MASK_IC_CON_IC_RESTART_EN) << BIT_SHIFT_IC_CON_IC_RESTART_EN) + +#define BIT_IC_CON_IC_10BITADDR_MASTER BIT(4) +#define BIT_SHIFT_IC_CON_IC_10BITADDR_MASTER 4 +#define BIT_MASK_IC_CON_IC_10BITADDR_MASTER 0x1 +#define BIT_CTRL_IC_CON_IC_10BITADDR_MASTER(x) (((x) & BIT_MASK_IC_CON_IC_10BITADDR_MASTER) << BIT_SHIFT_IC_CON_IC_10BITADDR_MASTER) + +#define BIT_IC_CON_IC_10BITADDR_SLAVE BIT(3) +#define BIT_SHIFT_IC_CON_IC_10BITADDR_SLAVE 3 +#define BIT_MASK_IC_CON_IC_10BITADDR_SLAVE 0x1 +#define BIT_CTRL_IC_CON_IC_10BITADDR_SLAVE(x) (((x) & BIT_MASK_IC_CON_IC_10BITADDR_SLAVE) << BIT_SHIFT_IC_CON_IC_10BITADDR_SLAVE) + + +#define BIT_SHIFT_IC_CON_SPEED 1 +#define BIT_MASK_IC_CON_SPEED 0x3 +#define BIT_IC_CON_SPEED(x) (((x) & BIT_MASK_IC_CON_SPEED) << BIT_SHIFT_IC_CON_SPEED) +#define BIT_CTRL_IC_CON_SPEED(x) (((x) & BIT_MASK_IC_CON_SPEED) << BIT_SHIFT_IC_CON_SPEED) +#define BIT_GET_IC_CON_SPEED(x) (((x) >> BIT_SHIFT_IC_CON_SPEED) & BIT_MASK_IC_CON_SPEED) + +#define BIT_IC_CON_MASTER_MODE BIT(0) +#define BIT_SHIFT_IC_CON_MASTER_MODE 0 +#define BIT_MASK_IC_CON_MASTER_MODE 0x1 +#define BIT_CTRL_IC_CON_MASTER_MODE(x) (((x) & BIT_MASK_IC_CON_MASTER_MODE) << BIT_SHIFT_IC_CON_MASTER_MODE) + + +//2 REG_DW_I2C_IC_TAR +#define BIT_IC_TAR_IC_10BITADDR_MASTER BIT(12) +#define BIT_SHIFT_IC_TAR_IC_10BITADDR_MASTER 12 +#define BIT_MASK_IC_TAR_IC_10BITADDR_MASTER 0x1 +#define BIT_CTRL_IC_TAR_IC_10BITADDR_MASTER(x) (((x) & BIT_MASK_IC_TAR_IC_10BITADDR_MASTER) << BIT_SHIFT_IC_TAR_IC_10BITADDR_MASTER) + +#define BIT_IC_TAR_SPECIAL BIT(11) +#define BIT_SHIFT_IC_TAR_SPECIAL 11 +#define BIT_MASK_IC_TAR_SPECIAL 0x1 +#define BIT_CTRL_IC_TAR_SPECIAL(x) (((x) & BIT_MASK_IC_TAR_SPECIAL) << BIT_SHIFT_IC_TAR_SPECIAL) + +#define BIT_IC_TAR_GC_OR_START BIT(10) +#define BIT_SHIFT_IC_TAR_GC_OR_START 10 +#define BIT_MASK_IC_TAR_GC_OR_START 0x1 +#define BIT_CTRL_IC_TAR_GC_OR_START(x) (((x) & BIT_MASK_IC_TAR_GC_OR_START) << BIT_SHIFT_IC_TAR_GC_OR_START) + + +#define BIT_SHIFT_IC_TAR 0 +#define BIT_MASK_IC_TAR 0x3ff +#define BIT_IC_TAR(x) (((x) & BIT_MASK_IC_TAR) << BIT_SHIFT_IC_TAR) +#define BIT_CTRL_IC_TAR(x) (((x) & BIT_MASK_IC_TAR) << BIT_SHIFT_IC_TAR) +#define BIT_GET_IC_TAR(x) (((x) >> BIT_SHIFT_IC_TAR) & BIT_MASK_IC_TAR) + + +//2 REG_DW_I2C_IC_SAR + +#define BIT_SHIFT_IC_SAR 0 +#define BIT_MASK_IC_SAR 0x3ff +#define BIT_IC_SAR(x) (((x) & BIT_MASK_IC_SAR) << BIT_SHIFT_IC_SAR) +#define BIT_CTRL_IC_SAR(x) (((x) & BIT_MASK_IC_SAR) << BIT_SHIFT_IC_SAR) +#define BIT_GET_IC_SAR(x) (((x) >> BIT_SHIFT_IC_SAR) & BIT_MASK_IC_SAR) + + +//2 REG_DW_I2C_IC_HS_MADDR + +#define BIT_SHIFT_IC_HS_MADDR 0 +#define BIT_MASK_IC_HS_MADDR 0x7 +#define BIT_IC_HS_MADDR(x) (((x) & BIT_MASK_IC_HS_MADDR) << BIT_SHIFT_IC_HS_MADDR) +#define BIT_CTRL_IC_HS_MADDR(x) (((x) & BIT_MASK_IC_HS_MADDR) << BIT_SHIFT_IC_HS_MADDR) +#define BIT_GET_IC_HS_MADDR(x) (((x) >> BIT_SHIFT_IC_HS_MADDR) & BIT_MASK_IC_HS_MADDR) + + +//2 REG_DW_I2C_IC_DATA_CMD +#define BIT_IC_DATA_CMD_RESTART BIT(10) +#define BIT_SHIFT_IC_DATA_CMD_RESTART 10 +#define BIT_MASK_IC_DATA_CMD_RESTART 0x1 +#define BIT_CTRL_IC_DATA_CMD_RESTART(x) (((x) & BIT_MASK_IC_DATA_CMD_RESTART) << BIT_SHIFT_IC_DATA_CMD_RESTART) + +#define BIT_IC_DATA_CMD_STOP BIT(9) +#define BIT_SHIFT_IC_DATA_CMD_STOP 9 +#define BIT_MASK_IC_DATA_CMD_STOP 0x1 +#define BIT_CTRL_IC_DATA_CMD_STOP(x) (((x) & BIT_MASK_IC_DATA_CMD_STOP) << BIT_SHIFT_IC_DATA_CMD_STOP) + +#define BIT_IC_DATA_CMD_CMD BIT(8) +#define BIT_SHIFT_IC_DATA_CMD_CMD 8 +#define BIT_MASK_IC_DATA_CMD_CMD 0x1 +#define BIT_CTRL_IC_DATA_CMD_CMD(x) (((x) & BIT_MASK_IC_DATA_CMD_CMD) << BIT_SHIFT_IC_DATA_CMD_CMD) + + +#define BIT_SHIFT_IC_DATA_CMD_DAT 0 +#define BIT_MASK_IC_DATA_CMD_DAT 0xff +#define BIT_IC_DATA_CMD_DAT(x) (((x) & BIT_MASK_IC_DATA_CMD_DAT) << BIT_SHIFT_IC_DATA_CMD_DAT) +#define BIT_CTRL_IC_DATA_CMD_DAT(x) (((x) & BIT_MASK_IC_DATA_CMD_DAT) << BIT_SHIFT_IC_DATA_CMD_DAT) +#define BIT_GET_IC_DATA_CMD_DAT(x) (((x) >> BIT_SHIFT_IC_DATA_CMD_DAT) & BIT_MASK_IC_DATA_CMD_DAT) + + +//2 REG_DW_I2C_IC_SS_SCL_HCNT + +#define BIT_SHIFT_IC_SS_SCL_HCNT 0 +#define BIT_MASK_IC_SS_SCL_HCNT 0xffff +#define BIT_IC_SS_SCL_HCNT(x) (((x) & BIT_MASK_IC_SS_SCL_HCNT) << BIT_SHIFT_IC_SS_SCL_HCNT) +#define BIT_CTRL_IC_SS_SCL_HCNT(x) (((x) & BIT_MASK_IC_SS_SCL_HCNT) << BIT_SHIFT_IC_SS_SCL_HCNT) +#define BIT_GET_IC_SS_SCL_HCNT(x) (((x) >> BIT_SHIFT_IC_SS_SCL_HCNT) & BIT_MASK_IC_SS_SCL_HCNT) + + +//2 REG_DW_I2C_IC_SS_SCL_LCNT + +#define BIT_SHIFT_IC_SS_SCL_LCNT 0 +#define BIT_MASK_IC_SS_SCL_LCNT 0xffff +#define BIT_IC_SS_SCL_LCNT(x) (((x) & BIT_MASK_IC_SS_SCL_LCNT) << BIT_SHIFT_IC_SS_SCL_LCNT) +#define BIT_CTRL_IC_SS_SCL_LCNT(x) (((x) & BIT_MASK_IC_SS_SCL_LCNT) << BIT_SHIFT_IC_SS_SCL_LCNT) +#define BIT_GET_IC_SS_SCL_LCNT(x) (((x) >> BIT_SHIFT_IC_SS_SCL_LCNT) & BIT_MASK_IC_SS_SCL_LCNT) + + +//2 REG_DW_I2C_IC_FS_SCL_HCNT + +#define BIT_SHIFT_IC_FS_SCL_HCNT 0 +#define BIT_MASK_IC_FS_SCL_HCNT 0xffff +#define BIT_IC_FS_SCL_HCNT(x) (((x) & BIT_MASK_IC_FS_SCL_HCNT) << BIT_SHIFT_IC_FS_SCL_HCNT) +#define BIT_CTRL_IC_FS_SCL_HCNT(x) (((x) & BIT_MASK_IC_FS_SCL_HCNT) << BIT_SHIFT_IC_FS_SCL_HCNT) +#define BIT_GET_IC_FS_SCL_HCNT(x) (((x) >> BIT_SHIFT_IC_FS_SCL_HCNT) & BIT_MASK_IC_FS_SCL_HCNT) + + +//2 REG_DW_I2C_IC_FS_SCL_LCNT + +#define BIT_SHIFT_IC_FS_SCL_LCNT 0 +#define BIT_MASK_IC_FS_SCL_LCNT 0xffff +#define BIT_IC_FS_SCL_LCNT(x) (((x) & BIT_MASK_IC_FS_SCL_LCNT) << BIT_SHIFT_IC_FS_SCL_LCNT) +#define BIT_CTRL_IC_FS_SCL_LCNT(x) (((x) & BIT_MASK_IC_FS_SCL_LCNT) << BIT_SHIFT_IC_FS_SCL_LCNT) +#define BIT_GET_IC_FS_SCL_LCNT(x) (((x) >> BIT_SHIFT_IC_FS_SCL_LCNT) & BIT_MASK_IC_FS_SCL_LCNT) + + +//2 REG_DW_I2C_IC_HS_SCL_HCNT + +#define BIT_SHIFT_IC_HS_SCL_HCNT 0 +#define BIT_MASK_IC_HS_SCL_HCNT 0xffff +#define BIT_IC_HS_SCL_HCNT(x) (((x) & BIT_MASK_IC_HS_SCL_HCNT) << BIT_SHIFT_IC_HS_SCL_HCNT) +#define BIT_CTRL_IC_HS_SCL_HCNT(x) (((x) & BIT_MASK_IC_HS_SCL_HCNT) << BIT_SHIFT_IC_HS_SCL_HCNT) +#define BIT_GET_IC_HS_SCL_HCNT(x) (((x) >> BIT_SHIFT_IC_HS_SCL_HCNT) & BIT_MASK_IC_HS_SCL_HCNT) + + +//2 REG_DW_I2C_IC_HS_SCL_LCNT + +#define BIT_SHIFT_IC_HS_SCL_LCNT 0 +#define BIT_MASK_IC_HS_SCL_LCNT 0xffff +#define BIT_IC_HS_SCL_LCNT(x) (((x) & BIT_MASK_IC_HS_SCL_LCNT) << BIT_SHIFT_IC_HS_SCL_LCNT) +#define BIT_CTRL_IC_HS_SCL_LCNT(x) (((x) & BIT_MASK_IC_HS_SCL_LCNT) << BIT_SHIFT_IC_HS_SCL_LCNT) +#define BIT_GET_IC_HS_SCL_LCNT(x) (((x) >> BIT_SHIFT_IC_HS_SCL_LCNT) & BIT_MASK_IC_HS_SCL_LCNT) + + +//2 REG_DW_I2C_IC_INTR_STAT +#define BIT_IC_INTR_STAT_R_GEN_CALL BIT(11) +#define BIT_SHIFT_IC_INTR_STAT_R_GEN_CALL 11 +#define BIT_MASK_IC_INTR_STAT_R_GEN_CALL 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_GEN_CALL(x) (((x) & BIT_MASK_IC_INTR_STAT_R_GEN_CALL) << BIT_SHIFT_IC_INTR_STAT_R_GEN_CALL) + +#define BIT_IC_INTR_STAT_R_START_DET BIT(10) +#define BIT_SHIFT_IC_INTR_STAT_R_START_DET 10 +#define BIT_MASK_IC_INTR_STAT_R_START_DET 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_START_DET(x) (((x) & BIT_MASK_IC_INTR_STAT_R_START_DET) << BIT_SHIFT_IC_INTR_STAT_R_START_DET) + +#define BIT_IC_INTR_STAT_R_STOP_DET BIT(9) +#define BIT_SHIFT_IC_INTR_STAT_R_STOP_DET 9 +#define BIT_MASK_IC_INTR_STAT_R_STOP_DET 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_STOP_DET(x) (((x) & BIT_MASK_IC_INTR_STAT_R_STOP_DET) << BIT_SHIFT_IC_INTR_STAT_R_STOP_DET) + +#define BIT_IC_INTR_STAT_R_ACTIVITY BIT(8) +#define BIT_SHIFT_IC_INTR_STAT_R_ACTIVITY 8 +#define BIT_MASK_IC_INTR_STAT_R_ACTIVITY 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_ACTIVITY(x) (((x) & BIT_MASK_IC_INTR_STAT_R_ACTIVITY) << BIT_SHIFT_IC_INTR_STAT_R_ACTIVITY) + +#define BIT_IC_INTR_STAT_R_RX_DONE BIT(7) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_DONE 7 +#define BIT_MASK_IC_INTR_STAT_R_RX_DONE 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_DONE(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_DONE) << BIT_SHIFT_IC_INTR_STAT_R_RX_DONE) + +#define BIT_IC_INTR_STAT_R_TX_ABRT BIT(6) +#define BIT_SHIFT_IC_INTR_STAT_R_TX_ABRT 6 +#define BIT_MASK_IC_INTR_STAT_R_TX_ABRT 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_TX_ABRT(x) (((x) & BIT_MASK_IC_INTR_STAT_R_TX_ABRT) << BIT_SHIFT_IC_INTR_STAT_R_TX_ABRT) + +#define BIT_IC_INTR_STAT_R_RD_REQ BIT(5) +#define BIT_SHIFT_IC_INTR_STAT_R_RD_REQ 5 +#define BIT_MASK_IC_INTR_STAT_R_RD_REQ 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RD_REQ(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RD_REQ) << BIT_SHIFT_IC_INTR_STAT_R_RD_REQ) + +#define BIT_IC_INTR_STAT_R_TX_EMPTY BIT(4) +#define BIT_SHIFT_IC_INTR_STAT_R_TX_EMPTY 4 +#define BIT_MASK_IC_INTR_STAT_R_TX_EMPTY 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_TX_EMPTY(x) (((x) & BIT_MASK_IC_INTR_STAT_R_TX_EMPTY) << BIT_SHIFT_IC_INTR_STAT_R_TX_EMPTY) + +#define BIT_IC_INTR_STAT_R_TX_OVER BIT(3) +#define BIT_SHIFT_IC_INTR_STAT_R_TX_OVER 3 +#define BIT_MASK_IC_INTR_STAT_R_TX_OVER 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_TX_OVER(x) (((x) & BIT_MASK_IC_INTR_STAT_R_TX_OVER) << BIT_SHIFT_IC_INTR_STAT_R_TX_OVER) + +#define BIT_IC_INTR_STAT_R_RX_FULL BIT(2) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_FULL 2 +#define BIT_MASK_IC_INTR_STAT_R_RX_FULL 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_FULL(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_FULL) << BIT_SHIFT_IC_INTR_STAT_R_RX_FULL) + +#define BIT_IC_INTR_STAT_R_RX_OVER BIT(1) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_OVER 1 +#define BIT_MASK_IC_INTR_STAT_R_RX_OVER 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_OVER(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_OVER) << BIT_SHIFT_IC_INTR_STAT_R_RX_OVER) + +#define BIT_IC_INTR_STAT_R_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_INTR_STAT_R_RX_UNDER 0 +#define BIT_MASK_IC_INTR_STAT_R_RX_UNDER 0x1 +#define BIT_CTRL_IC_INTR_STAT_R_RX_UNDER(x) (((x) & BIT_MASK_IC_INTR_STAT_R_RX_UNDER) << BIT_SHIFT_IC_INTR_STAT_R_RX_UNDER) + + +//2 REG_DW_I2C_IC_INTR_MASK +#define BIT_IC_INTR_MASK_M_GEN_CALL BIT(11) +#define BIT_SHIFT_IC_INTR_MASK_M_GEN_CALL 11 +#define BIT_MASK_IC_INTR_MASK_M_GEN_CALL 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_GEN_CALL(x) (((x) & BIT_MASK_IC_INTR_MASK_M_GEN_CALL) << BIT_SHIFT_IC_INTR_MASK_M_GEN_CALL) + +#define BIT_IC_INTR_MASK_M_START_DET BIT(10) +#define BIT_SHIFT_IC_INTR_MASK_M_START_DET 10 +#define BIT_MASK_IC_INTR_MASK_M_START_DET 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_START_DET(x) (((x) & BIT_MASK_IC_INTR_MASK_M_START_DET) << BIT_SHIFT_IC_INTR_MASK_M_START_DET) + +#define BIT_IC_INTR_MASK_M_STOP_DET BIT(9) +#define BIT_SHIFT_IC_INTR_MASK_M_STOP_DET 9 +#define BIT_MASK_IC_INTR_MASK_M_STOP_DET 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_STOP_DET(x) (((x) & BIT_MASK_IC_INTR_MASK_M_STOP_DET) << BIT_SHIFT_IC_INTR_MASK_M_STOP_DET) + +#define BIT_IC_INTR_MASK_M_ACTIVITY BIT(8) +#define BIT_SHIFT_IC_INTR_MASK_M_ACTIVITY 8 +#define BIT_MASK_IC_INTR_MASK_M_ACTIVITY 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_ACTIVITY(x) (((x) & BIT_MASK_IC_INTR_MASK_M_ACTIVITY) << BIT_SHIFT_IC_INTR_MASK_M_ACTIVITY) + +#define BIT_IC_INTR_MASK_M_RX_DONE BIT(7) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_DONE 7 +#define BIT_MASK_IC_INTR_MASK_M_RX_DONE 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_DONE(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_DONE) << BIT_SHIFT_IC_INTR_MASK_M_RX_DONE) + +#define BIT_IC_INTR_MASK_M_TX_ABRT BIT(6) +#define BIT_SHIFT_IC_INTR_MASK_M_TX_ABRT 6 +#define BIT_MASK_IC_INTR_MASK_M_TX_ABRT 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_TX_ABRT(x) (((x) & BIT_MASK_IC_INTR_MASK_M_TX_ABRT) << BIT_SHIFT_IC_INTR_MASK_M_TX_ABRT) + +#define BIT_IC_INTR_MASK_M_RD_REQ BIT(5) +#define BIT_SHIFT_IC_INTR_MASK_M_RD_REQ 5 +#define BIT_MASK_IC_INTR_MASK_M_RD_REQ 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RD_REQ(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RD_REQ) << BIT_SHIFT_IC_INTR_MASK_M_RD_REQ) + +#define BIT_IC_INTR_MASK_M_TX_EMPTY BIT(4) +#define BIT_SHIFT_IC_INTR_MASK_M_TX_EMPTY 4 +#define BIT_MASK_IC_INTR_MASK_M_TX_EMPTY 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_TX_EMPTY(x) (((x) & BIT_MASK_IC_INTR_MASK_M_TX_EMPTY) << BIT_SHIFT_IC_INTR_MASK_M_TX_EMPTY) + +#define BIT_IC_INTR_MASK_M_TX_OVER BIT(3) +#define BIT_SHIFT_IC_INTR_MASK_M_TX_OVER 3 +#define BIT_MASK_IC_INTR_MASK_M_TX_OVER 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_TX_OVER(x) (((x) & BIT_MASK_IC_INTR_MASK_M_TX_OVER) << BIT_SHIFT_IC_INTR_MASK_M_TX_OVER) + +#define BIT_IC_INTR_MASK_M_RX_FULL BIT(2) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_FULL 2 +#define BIT_MASK_IC_INTR_MASK_M_RX_FULL 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_FULL(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_FULL) << BIT_SHIFT_IC_INTR_MASK_M_RX_FULL) + +#define BIT_IC_INTR_MASK_M_RX_OVER BIT(1) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_OVER 1 +#define BIT_MASK_IC_INTR_MASK_M_RX_OVER 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_OVER(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_OVER) << BIT_SHIFT_IC_INTR_MASK_M_RX_OVER) + +#define BIT_IC_INTR_MASK_M_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_INTR_MASK_M_RX_UNDER 0 +#define BIT_MASK_IC_INTR_MASK_M_RX_UNDER 0x1 +#define BIT_CTRL_IC_INTR_MASK_M_RX_UNDER(x) (((x) & BIT_MASK_IC_INTR_MASK_M_RX_UNDER) << BIT_SHIFT_IC_INTR_MASK_M_RX_UNDER) + + +//2 REG_DW_I2C_IC_RAW_INTR_STAT +#define BIT_IC_RAW_INTR_STAT_GEN_CALL BIT(11) +#define BIT_SHIFT_IC_RAW_INTR_STAT_GEN_CALL 11 +#define BIT_MASK_IC_RAW_INTR_STAT_GEN_CALL 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_GEN_CALL(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_GEN_CALL) << BIT_SHIFT_IC_RAW_INTR_STAT_GEN_CALL) + +#define BIT_IC_RAW_INTR_STAT_START_DET BIT(10) +#define BIT_SHIFT_IC_RAW_INTR_STAT_START_DET 10 +#define BIT_MASK_IC_RAW_INTR_STAT_START_DET 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_START_DET(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_START_DET) << BIT_SHIFT_IC_RAW_INTR_STAT_START_DET) + +#define BIT_IC_RAW_INTR_STAT_STOP_DET BIT(9) +#define BIT_SHIFT_IC_RAW_INTR_STAT_STOP_DET 9 +#define BIT_MASK_IC_RAW_INTR_STAT_STOP_DET 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_STOP_DET(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_STOP_DET) << BIT_SHIFT_IC_RAW_INTR_STAT_STOP_DET) + +#define BIT_IC_RAW_INTR_STAT_ACTIVITY BIT(8) +#define BIT_SHIFT_IC_RAW_INTR_STAT_ACTIVITY 8 +#define BIT_MASK_IC_RAW_INTR_STAT_ACTIVITY 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_ACTIVITY(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_ACTIVITY) << BIT_SHIFT_IC_RAW_INTR_STAT_ACTIVITY) + +#define BIT_IC_RAW_INTR_STAT_RX_DONE BIT(7) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_DONE 7 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_DONE 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_DONE(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_DONE) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_DONE) + +#define BIT_IC_RAW_INTR_STAT_TX_ABRT BIT(6) +#define BIT_SHIFT_IC_RAW_INTR_STAT_TX_ABRT 6 +#define BIT_MASK_IC_RAW_INTR_STAT_TX_ABRT 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_TX_ABRT(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_TX_ABRT) << BIT_SHIFT_IC_RAW_INTR_STAT_TX_ABRT) + +#define BIT_IC_RAW_INTR_STAT_RD_REQ BIT(5) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RD_REQ 5 +#define BIT_MASK_IC_RAW_INTR_STAT_RD_REQ 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RD_REQ(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RD_REQ) << BIT_SHIFT_IC_RAW_INTR_STAT_RD_REQ) + +#define BIT_IC_RAW_INTR_STAT_TX_EMPTY BIT(4) +#define BIT_SHIFT_IC_RAW_INTR_STAT_TX_EMPTY 4 +#define BIT_MASK_IC_RAW_INTR_STAT_TX_EMPTY 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_TX_EMPTY(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_TX_EMPTY) << BIT_SHIFT_IC_RAW_INTR_STAT_TX_EMPTY) + +#define BIT_IC_RAW_INTR_STAT_TX_OVER BIT(3) +#define BIT_SHIFT_IC_RAW_INTR_STAT_TX_OVER 3 +#define BIT_MASK_IC_RAW_INTR_STAT_TX_OVER 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_TX_OVER(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_TX_OVER) << BIT_SHIFT_IC_RAW_INTR_STAT_TX_OVER) + +#define BIT_IC_RAW_INTR_STAT_RX_FULL BIT(2) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_FULL 2 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_FULL 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_FULL(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_FULL) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_FULL) + +#define BIT_IC_RAW_INTR_STAT_RX_OVER BIT(1) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_OVER 1 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_OVER 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_OVER(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_OVER) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_OVER) + +#define BIT_IC_RAW_INTR_STAT_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_RAW_INTR_STAT_RX_UNDER 0 +#define BIT_MASK_IC_RAW_INTR_STAT_RX_UNDER 0x1 +#define BIT_CTRL_IC_RAW_INTR_STAT_RX_UNDER(x) (((x) & BIT_MASK_IC_RAW_INTR_STAT_RX_UNDER) << BIT_SHIFT_IC_RAW_INTR_STAT_RX_UNDER) + + +//2 REG_DW_I2C_IC_RX_TL + +#define BIT_SHIFT_IC_RX_TL 0 +#define BIT_MASK_IC_RX_TL 0xff +#define BIT_IC_RX_TL(x) (((x) & BIT_MASK_IC_RX_TL) << BIT_SHIFT_IC_RX_TL) +#define BIT_CTRL_IC_RX_TL(x) (((x) & BIT_MASK_IC_RX_TL) << BIT_SHIFT_IC_RX_TL) +#define BIT_GET_IC_RX_TL(x) (((x) >> BIT_SHIFT_IC_RX_TL) & BIT_MASK_IC_RX_TL) + + +//2 REG_DW_I2C_IC_TX_TL + +#define BIT_SHIFT_IC_TX_TL 0 +#define BIT_MASK_IC_TX_TL 0xff +#define BIT_IC_TX_TL(x) (((x) & BIT_MASK_IC_TX_TL) << BIT_SHIFT_IC_TX_TL) +#define BIT_CTRL_IC_TX_TL(x) (((x) & BIT_MASK_IC_TX_TL) << BIT_SHIFT_IC_TX_TL) +#define BIT_GET_IC_TX_TL(x) (((x) >> BIT_SHIFT_IC_TX_TL) & BIT_MASK_IC_TX_TL) + + +//2 REG_DW_I2C_IC_CLR_INTR +#define BIT_IC_CLR_INTR BIT(0) +#define BIT_SHIFT_IC_CLR_INTR 0 +#define BIT_MASK_IC_CLR_INTR 0x1 +#define BIT_CTRL_IC_CLR_INTR(x) (((x) & BIT_MASK_IC_CLR_INTR) << BIT_SHIFT_IC_CLR_INTR) + + +//2 REG_DW_I2C_IC_CLR_RX_UNDER +#define BIT_IC_CLR_RX_UNDER BIT(0) +#define BIT_SHIFT_IC_CLR_RX_UNDER 0 +#define BIT_MASK_IC_CLR_RX_UNDER 0x1 +#define BIT_CTRL_IC_CLR_RX_UNDER(x) (((x) & BIT_MASK_IC_CLR_RX_UNDER) << BIT_SHIFT_IC_CLR_RX_UNDER) + + +//2 REG_DW_I2C_IC_CLR_RX_OVER +#define BIT_IC_CLR_RX_OVER BIT(0) +#define BIT_SHIFT_IC_CLR_RX_OVER 0 +#define BIT_MASK_IC_CLR_RX_OVER 0x1 +#define BIT_CTRL_IC_CLR_RX_OVER(x) (((x) & BIT_MASK_IC_CLR_RX_OVER) << BIT_SHIFT_IC_CLR_RX_OVER) + + +//2 REG_DW_I2C_IC_CLR_TX_OVER +#define BIT_IC_CLR_TX_OVER BIT(0) +#define BIT_SHIFT_IC_CLR_TX_OVER 0 +#define BIT_MASK_IC_CLR_TX_OVER 0x1 +#define BIT_CTRL_IC_CLR_TX_OVER(x) (((x) & BIT_MASK_IC_CLR_TX_OVER) << BIT_SHIFT_IC_CLR_TX_OVER) + + +//2 REG_DW_I2C_IC_CLR_RD_REQ +#define BIT_IC_CLR_RD_REQ BIT(0) +#define BIT_SHIFT_IC_CLR_RD_REQ 0 +#define BIT_MASK_IC_CLR_RD_REQ 0x1 +#define BIT_CTRL_IC_CLR_RD_REQ(x) (((x) & BIT_MASK_IC_CLR_RD_REQ) << BIT_SHIFT_IC_CLR_RD_REQ) + + +//2 REG_DW_I2C_IC_CLR_TX_ABRT +#define BIT_CLR_RD_REQ BIT(0) +#define BIT_SHIFT_CLR_RD_REQ 0 +#define BIT_MASK_CLR_RD_REQ 0x1 +#define BIT_CTRL_CLR_RD_REQ(x) (((x) & BIT_MASK_CLR_RD_REQ) << BIT_SHIFT_CLR_RD_REQ) + + +//2 REG_DW_I2C_IC_CLR_RX_DONE +#define BIT_IC_CLR_RX_DONE BIT(0) +#define BIT_SHIFT_IC_CLR_RX_DONE 0 +#define BIT_MASK_IC_CLR_RX_DONE 0x1 +#define BIT_CTRL_IC_CLR_RX_DONE(x) (((x) & BIT_MASK_IC_CLR_RX_DONE) << BIT_SHIFT_IC_CLR_RX_DONE) + + +//2 REG_DW_I2C_IC_CLR_ACTIVITY +#define BIT_IC_CLR_ACTIVITY BIT(0) +#define BIT_SHIFT_IC_CLR_ACTIVITY 0 +#define BIT_MASK_IC_CLR_ACTIVITY 0x1 +#define BIT_CTRL_IC_CLR_ACTIVITY(x) (((x) & BIT_MASK_IC_CLR_ACTIVITY) << BIT_SHIFT_IC_CLR_ACTIVITY) + + +//2 REG_DW_I2C_IC_CLR_STOP_DET +#define BIT_IC_CLR_STOP_DET BIT(0) +#define BIT_SHIFT_IC_CLR_STOP_DET 0 +#define BIT_MASK_IC_CLR_STOP_DET 0x1 +#define BIT_CTRL_IC_CLR_STOP_DET(x) (((x) & BIT_MASK_IC_CLR_STOP_DET) << BIT_SHIFT_IC_CLR_STOP_DET) + + +//2 REG_DW_I2C_IC_CLR_START_DET +#define BIT_IC_CLR_START_DET BIT(0) +#define BIT_SHIFT_IC_CLR_START_DET 0 +#define BIT_MASK_IC_CLR_START_DET 0x1 +#define BIT_CTRL_IC_CLR_START_DET(x) (((x) & BIT_MASK_IC_CLR_START_DET) << BIT_SHIFT_IC_CLR_START_DET) + + +//2 REG_DW_I2C_IC_CLR_GEN_CALL +#define BIT_IC_CLR_GEN_CALL BIT(0) +#define BIT_SHIFT_IC_CLR_GEN_CALL 0 +#define BIT_MASK_IC_CLR_GEN_CALL 0x1 +#define BIT_CTRL_IC_CLR_GEN_CALL(x) (((x) & BIT_MASK_IC_CLR_GEN_CALL) << BIT_SHIFT_IC_CLR_GEN_CALL) + + +//2 REG_DW_I2C_IC_ENABLE +#define BIT_IC_ENABLE BIT(0) +#define BIT_SHIFT_IC_ENABLE 0 +#define BIT_MASK_IC_ENABLE 0x1 +#define BIT_CTRL_IC_ENABLE(x) (((x) & BIT_MASK_IC_ENABLE) << BIT_SHIFT_IC_ENABLE) + + +//2 REG_DW_I2C_IC_STATUS +#define BIT_IC_STATUS_SLV_ACTIVITY BIT(6) +#define BIT_SHIFT_IC_STATUS_SLV_ACTIVITY 6 +#define BIT_MASK_IC_STATUS_SLV_ACTIVITY 0x1 +#define BIT_CTRL_IC_STATUS_SLV_ACTIVITY(x) (((x) & BIT_MASK_IC_STATUS_SLV_ACTIVITY) << BIT_SHIFT_IC_STATUS_SLV_ACTIVITY) + +#define BIT_IC_STATUS_MST_ACTIVITY BIT(5) +#define BIT_SHIFT_IC_STATUS_MST_ACTIVITY 5 +#define BIT_MASK_IC_STATUS_MST_ACTIVITY 0x1 +#define BIT_CTRL_IC_STATUS_MST_ACTIVITY(x) (((x) & BIT_MASK_IC_STATUS_MST_ACTIVITY) << BIT_SHIFT_IC_STATUS_MST_ACTIVITY) + +#define BIT_IC_STATUS_RFF BIT(4) +#define BIT_SHIFT_IC_STATUS_RFF 4 +#define BIT_MASK_IC_STATUS_RFF 0x1 +#define BIT_CTRL_IC_STATUS_RFF(x) (((x) & BIT_MASK_IC_STATUS_RFF) << BIT_SHIFT_IC_STATUS_RFF) + +#define BIT_IC_STATUS_RFNE BIT(3) +#define BIT_SHIFT_IC_STATUS_RFNE 3 +#define BIT_MASK_IC_STATUS_RFNE 0x1 +#define BIT_CTRL_IC_STATUS_RFNE(x) (((x) & BIT_MASK_IC_STATUS_RFNE) << BIT_SHIFT_IC_STATUS_RFNE) + +#define BIT_IC_STATUS_TFE BIT(2) +#define BIT_SHIFT_IC_STATUS_TFE 2 +#define BIT_MASK_IC_STATUS_TFE 0x1 +#define BIT_CTRL_IC_STATUS_TFE(x) (((x) & BIT_MASK_IC_STATUS_TFE) << BIT_SHIFT_IC_STATUS_TFE) + +#define BIT_IC_STATUS_TFNF BIT(1) +#define BIT_SHIFT_IC_STATUS_TFNF 1 +#define BIT_MASK_IC_STATUS_TFNF 0x1 +#define BIT_CTRL_IC_STATUS_TFNF(x) (((x) & BIT_MASK_IC_STATUS_TFNF) << BIT_SHIFT_IC_STATUS_TFNF) + +#define BIT_IC_STATUS_ACTIVITY BIT(0) +#define BIT_SHIFT_IC_STATUS_ACTIVITY 0 +#define BIT_MASK_IC_STATUS_ACTIVITY 0x1 +#define BIT_CTRL_IC_STATUS_ACTIVITY(x) (((x) & BIT_MASK_IC_STATUS_ACTIVITY) << BIT_SHIFT_IC_STATUS_ACTIVITY) + + +//2 REG_DW_I2C_IC_TXFLR + +#define BIT_SHIFT_IC_TXFLR 0 +#define BIT_MASK_IC_TXFLR 0x3f +#define BIT_IC_TXFLR(x) (((x) & BIT_MASK_IC_TXFLR) << BIT_SHIFT_IC_TXFLR) +#define BIT_CTRL_IC_TXFLR(x) (((x) & BIT_MASK_IC_TXFLR) << BIT_SHIFT_IC_TXFLR) +#define BIT_GET_IC_TXFLR(x) (((x) >> BIT_SHIFT_IC_TXFLR) & BIT_MASK_IC_TXFLR) + + +//2 REG_DW_I2C_IC_RXFLR + +#define BIT_SHIFT_IC_RXFLR 0 +#define BIT_MASK_IC_RXFLR 0x1f +#define BIT_IC_RXFLR(x) (((x) & BIT_MASK_IC_RXFLR) << BIT_SHIFT_IC_RXFLR) +#define BIT_CTRL_IC_RXFLR(x) (((x) & BIT_MASK_IC_RXFLR) << BIT_SHIFT_IC_RXFLR) +#define BIT_GET_IC_RXFLR(x) (((x) >> BIT_SHIFT_IC_RXFLR) & BIT_MASK_IC_RXFLR) + + +//2 REG_DW_I2C_IC_SDA_HOLD + +#define BIT_SHIFT_IC_SDA_HOLD 0 +#define BIT_MASK_IC_SDA_HOLD 0xffff +#define BIT_IC_SDA_HOLD(x) (((x) & BIT_MASK_IC_SDA_HOLD) << BIT_SHIFT_IC_SDA_HOLD) +#define BIT_CTRL_IC_SDA_HOLD(x) (((x) & BIT_MASK_IC_SDA_HOLD) << BIT_SHIFT_IC_SDA_HOLD) +#define BIT_GET_IC_SDA_HOLD(x) (((x) >> BIT_SHIFT_IC_SDA_HOLD) & BIT_MASK_IC_SDA_HOLD) + + +//2 REG_DW_I2C_IC_TX_ABRT_SOURCE +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX BIT(15) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX 15 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVRD_INTX) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST BIT(14) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST 14 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLV_ARBLOST) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO BIT(13) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO 13 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SLVFLUSH_TXFIFO) + +#define BIT_IC_TX_ABRT_SOURCE_ARB_LOST BIT(12) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ARB_LOST 12 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ARB_LOST 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ARB_LOST(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ARB_LOST) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ARB_LOST) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS BIT(11) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS 11 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_MASTER_DIS) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT BIT(10) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT 10 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10B_RD_NORSTRT) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT BIT(9) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT 9 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_NORSTRT) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT BIT(8) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT 8 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_NORSTRT) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET BIT(7) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET 7 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_SBYTE_ACKDET) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET BIT(6) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET 6 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_HS_ACKDET) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ BIT(5) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ 5 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_READ) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK BIT(4) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK 4 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_GCALL_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK BIT(3) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK 3 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_TXDATA_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK BIT(2) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK 2 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR2_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK BIT(1) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK 1 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_10ADDR1_NOACK) + +#define BIT_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK BIT(0) +#define BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK 0 +#define BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK 0x1 +#define BIT_CTRL_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK(x) (((x) & BIT_MASK_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK) << BIT_SHIFT_IC_TX_ABRT_SOURCE_ABRT_7B_ADDR_NOACK) + + +//2 REG_DW_I2C_IC_SLV_DATA_NACK_ONLY +#define BIT_IC_SLV_DATA_NACK_ONLY BIT(0) +#define BIT_SHIFT_IC_SLV_DATA_NACK_ONLY 0 +#define BIT_MASK_IC_SLV_DATA_NACK_ONLY 0x1 +#define BIT_CTRL_IC_SLV_DATA_NACK_ONLY(x) (((x) & BIT_MASK_IC_SLV_DATA_NACK_ONLY) << BIT_SHIFT_IC_SLV_DATA_NACK_ONLY) + + +//2 REG_DW_I2C_IC_DMA_CR +#define BIT_IC_DMA_CR_TDMAE BIT(1) +#define BIT_SHIFT_IC_DMA_CR_TDMAE 1 +#define BIT_MASK_IC_DMA_CR_TDMAE 0x1 +#define BIT_CTRL_IC_DMA_CR_TDMAE(x) (((x) & BIT_MASK_IC_DMA_CR_TDMAE) << BIT_SHIFT_IC_DMA_CR_TDMAE) + +#define BIT_IC_DMA_CR_RDMAE BIT(0) +#define BIT_SHIFT_IC_DMA_CR_RDMAE 0 +#define BIT_MASK_IC_DMA_CR_RDMAE 0x1 +#define BIT_CTRL_IC_DMA_CR_RDMAE(x) (((x) & BIT_MASK_IC_DMA_CR_RDMAE) << BIT_SHIFT_IC_DMA_CR_RDMAE) + + +//2 REG_DW_I2C_IC_DMA_TDLR + +#define BIT_SHIFT_IC_DMA_TDLR_DMATDL 0 +#define BIT_MASK_IC_DMA_TDLR_DMATDL 0x1f +#define BIT_IC_DMA_TDLR_DMATDL(x) (((x) & BIT_MASK_IC_DMA_TDLR_DMATDL) << BIT_SHIFT_IC_DMA_TDLR_DMATDL) +#define BIT_CTRL_IC_DMA_TDLR_DMATDL(x) (((x) & BIT_MASK_IC_DMA_TDLR_DMATDL) << BIT_SHIFT_IC_DMA_TDLR_DMATDL) +#define BIT_GET_IC_DMA_TDLR_DMATDL(x) (((x) >> BIT_SHIFT_IC_DMA_TDLR_DMATDL) & BIT_MASK_IC_DMA_TDLR_DMATDL) + + +//2 REG_DW_I2C_IC_DMA_RDLR + +#define BIT_SHIFT_IC_DMA_RDLR_DMARDL 0 +#define BIT_MASK_IC_DMA_RDLR_DMARDL 0xf +#define BIT_IC_DMA_RDLR_DMARDL(x) (((x) & BIT_MASK_IC_DMA_RDLR_DMARDL) << BIT_SHIFT_IC_DMA_RDLR_DMARDL) +#define BIT_CTRL_IC_DMA_RDLR_DMARDL(x) (((x) & BIT_MASK_IC_DMA_RDLR_DMARDL) << BIT_SHIFT_IC_DMA_RDLR_DMARDL) +#define BIT_GET_IC_DMA_RDLR_DMARDL(x) (((x) >> BIT_SHIFT_IC_DMA_RDLR_DMARDL) & BIT_MASK_IC_DMA_RDLR_DMARDL) + + +//2 REG_DW_I2C_IC_SDA_SETUP + +#define BIT_SHIFT_IC_SDA_SETUP 0 +#define BIT_MASK_IC_SDA_SETUP 0xff +#define BIT_IC_SDA_SETUP(x) (((x) & BIT_MASK_IC_SDA_SETUP) << BIT_SHIFT_IC_SDA_SETUP) +#define BIT_CTRL_IC_SDA_SETUP(x) (((x) & BIT_MASK_IC_SDA_SETUP) << BIT_SHIFT_IC_SDA_SETUP) +#define BIT_GET_IC_SDA_SETUP(x) (((x) >> BIT_SHIFT_IC_SDA_SETUP) & BIT_MASK_IC_SDA_SETUP) + + +//2 REG_DW_I2C_IC_ACK_GENERAL_CALL +#define BIT_IC_ACK_GENERAL_CALL BIT(0) +#define BIT_SHIFT_IC_ACK_GENERAL_CALL 0 +#define BIT_MASK_IC_ACK_GENERAL_CALL 0x1 +#define BIT_CTRL_IC_ACK_GENERAL_CALL(x) (((x) & BIT_MASK_IC_ACK_GENERAL_CALL) << BIT_SHIFT_IC_ACK_GENERAL_CALL) + + +//2 REG_DW_I2C_IC_ENABLE_STATUS +#define BIT_IC_ENABLE_STATUS_SLV_RX_DATA_LOST BIT(2) +#define BIT_SHIFT_IC_ENABLE_STATUS_SLV_RX_DATA_LOST 2 +#define BIT_MASK_IC_ENABLE_STATUS_SLV_RX_DATA_LOST 0x1 +#define BIT_CTRL_IC_ENABLE_STATUS_SLV_RX_DATA_LOST(x) (((x) & BIT_MASK_IC_ENABLE_STATUS_SLV_RX_DATA_LOST) << BIT_SHIFT_IC_ENABLE_STATUS_SLV_RX_DATA_LOST) + +#define BIT_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY BIT(1) +#define BIT_SHIFT_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY 1 +#define BIT_MASK_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY 0x1 +#define BIT_CTRL_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY(x) (((x) & BIT_MASK_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY) << BIT_SHIFT_IC_ENABLE_STATUS_SLV_DISABLED_WHILE_BUSY) + +#define BIT_IC_ENABLE_STATUS_IC_EN BIT(0) +#define BIT_SHIFT_IC_ENABLE_STATUS_IC_EN 0 +#define BIT_MASK_IC_ENABLE_STATUS_IC_EN 0x1 +#define BIT_CTRL_IC_ENABLE_STATUS_IC_EN(x) (((x) & BIT_MASK_IC_ENABLE_STATUS_IC_EN) << BIT_SHIFT_IC_ENABLE_STATUS_IC_EN) + + +//2 REG_DW_I2C_IC_COMP_PARAM_1 + +#define BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH 16 +#define BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH 0xff +#define BIT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) +#define BIT_CTRL_IC_COMP_PARAM_1_TX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) +#define BIT_GET_IC_COMP_PARAM_1_TX_BUFFER_DEPTH(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) & BIT_MASK_IC_COMP_PARAM_1_TX_BUFFER_DEPTH) + + +#define BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH 8 +#define BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH 0xff +#define BIT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) +#define BIT_CTRL_IC_COMP_PARAM_1_RX_BUFFER_DEPTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) << BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) +#define BIT_GET_IC_COMP_PARAM_1_RX_BUFFER_DEPTH(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) & BIT_MASK_IC_COMP_PARAM_1_RX_BUFFER_DEPTH) + +#define BIT_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS BIT(7) +#define BIT_SHIFT_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS 7 +#define BIT_MASK_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS) << BIT_SHIFT_IC_COMP_PARAM_1_ADD_ENCODED_PARAMS) + +#define BIT_IC_COMP_PARAM_1_HAS_DMA BIT(6) +#define BIT_SHIFT_IC_COMP_PARAM_1_HAS_DMA 6 +#define BIT_MASK_IC_COMP_PARAM_1_HAS_DMA 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_HAS_DMA(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_HAS_DMA) << BIT_SHIFT_IC_COMP_PARAM_1_HAS_DMA) + +#define BIT_IC_COMP_PARAM_1_INTR_IO BIT(5) +#define BIT_SHIFT_IC_COMP_PARAM_1_INTR_IO 5 +#define BIT_MASK_IC_COMP_PARAM_1_INTR_IO 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_INTR_IO(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_INTR_IO) << BIT_SHIFT_IC_COMP_PARAM_1_INTR_IO) + +#define BIT_IC_COMP_PARAM_1_HC_COUNT_VALUES BIT(4) +#define BIT_SHIFT_IC_COMP_PARAM_1_HC_COUNT_VALUES 4 +#define BIT_MASK_IC_COMP_PARAM_1_HC_COUNT_VALUES 0x1 +#define BIT_CTRL_IC_COMP_PARAM_1_HC_COUNT_VALUES(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_HC_COUNT_VALUES) << BIT_SHIFT_IC_COMP_PARAM_1_HC_COUNT_VALUES) + + +#define BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE 2 +#define BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE 0x3 +#define BIT_IC_COMP_PARAM_1_MAX_SPEED_MODE(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE) << BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE) +#define BIT_CTRL_IC_COMP_PARAM_1_MAX_SPEED_MODE(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE) << BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE) +#define BIT_GET_IC_COMP_PARAM_1_MAX_SPEED_MODE(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_MAX_SPEED_MODE) & BIT_MASK_IC_COMP_PARAM_1_MAX_SPEED_MODE) + + +#define BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH 0 +#define BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH 0x3 +#define BIT_IC_COMP_PARAM_1_APB_DATA_WIDTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH) << BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH) +#define BIT_CTRL_IC_COMP_PARAM_1_APB_DATA_WIDTH(x) (((x) & BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH) << BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH) +#define BIT_GET_IC_COMP_PARAM_1_APB_DATA_WIDTH(x) (((x) >> BIT_SHIFT_IC_COMP_PARAM_1_APB_DATA_WIDTH) & BIT_MASK_IC_COMP_PARAM_1_APB_DATA_WIDTH) + + +//2 REG_DW_I2C_IC_COMP_VERSION + +#define BIT_SHIFT_IC_COMP_VERSION 0 +#define BIT_MASK_IC_COMP_VERSION 0xffffffffL +#define BIT_IC_COMP_VERSION(x) (((x) & BIT_MASK_IC_COMP_VERSION) << BIT_SHIFT_IC_COMP_VERSION) +#define BIT_CTRL_IC_COMP_VERSION(x) (((x) & BIT_MASK_IC_COMP_VERSION) << BIT_SHIFT_IC_COMP_VERSION) +#define BIT_GET_IC_COMP_VERSION(x) (((x) >> BIT_SHIFT_IC_COMP_VERSION) & BIT_MASK_IC_COMP_VERSION) + + +//2 REG_DW_I2C_IC_COMP_TYPE + +#define BIT_SHIFT_IC_COMP_TYPE 0 +#define BIT_MASK_IC_COMP_TYPE 0xffffffffL +#define BIT_IC_COMP_TYPE(x) (((x) & BIT_MASK_IC_COMP_TYPE) << BIT_SHIFT_IC_COMP_TYPE) +#define BIT_CTRL_IC_COMP_TYPE(x) (((x) & BIT_MASK_IC_COMP_TYPE) << BIT_SHIFT_IC_COMP_TYPE) +#define BIT_GET_IC_COMP_TYPE(x) (((x) >> BIT_SHIFT_IC_COMP_TYPE) & BIT_MASK_IC_COMP_TYPE) + +//======================== Register Address Definition ======================== +#define REG_DW_I2C_IC_CON 0x0000 +#define REG_DW_I2C_IC_TAR 0x0004 +#define REG_DW_I2C_IC_SAR 0x0008 +#define REG_DW_I2C_IC_HS_MADDR 0x000C +#define REG_DW_I2C_IC_DATA_CMD 0x0010 +#define REG_DW_I2C_IC_SS_SCL_HCNT 0x0014 +#define REG_DW_I2C_IC_SS_SCL_LCNT 0x0018 +#define REG_DW_I2C_IC_FS_SCL_HCNT 0x001C +#define REG_DW_I2C_IC_FS_SCL_LCNT 0x0020 +#define REG_DW_I2C_IC_HS_SCL_HCNT 0x0024 +#define REG_DW_I2C_IC_HS_SCL_LCNT 0x0028 +#define REG_DW_I2C_IC_INTR_STAT 0x002C +#define REG_DW_I2C_IC_INTR_MASK 0x0030 +#define REG_DW_I2C_IC_RAW_INTR_STAT 0x0034 +#define REG_DW_I2C_IC_RX_TL 0x0038 +#define REG_DW_I2C_IC_TX_TL 0x003C +#define REG_DW_I2C_IC_CLR_INTR 0x0040 +#define REG_DW_I2C_IC_CLR_RX_UNDER 0x0044 +#define REG_DW_I2C_IC_CLR_RX_OVER 0x0048 +#define REG_DW_I2C_IC_CLR_TX_OVER 0x004C +#define REG_DW_I2C_IC_CLR_RD_REQ 0x0050 +#define REG_DW_I2C_IC_CLR_TX_ABRT 0x0054 +#define REG_DW_I2C_IC_CLR_RX_DONE 0x0058 +#define REG_DW_I2C_IC_CLR_ACTIVITY 0x005C +#define REG_DW_I2C_IC_CLR_STOP_DET 0x0060 +#define REG_DW_I2C_IC_CLR_START_DET 0x0064 +#define REG_DW_I2C_IC_CLR_GEN_CALL 0x0068 +#define REG_DW_I2C_IC_ENABLE 0x006C +#define REG_DW_I2C_IC_STATUS 0x0070 +#define REG_DW_I2C_IC_TXFLR 0x0074 +#define REG_DW_I2C_IC_RXFLR 0x0078 +#define REG_DW_I2C_IC_SDA_HOLD 0x007C +#define REG_DW_I2C_IC_TX_ABRT_SOURCE 0x0080 +#define REG_DW_I2C_IC_SLV_DATA_NACK_ONLY 0x0084 +#define REG_DW_I2C_IC_DMA_CR 0x0088 +#define REG_DW_I2C_IC_DMA_TDLR 0x008C +#define REG_DW_I2C_IC_DMA_RDLR 0x0090 +#define REG_DW_I2C_IC_SDA_SETUP 0x0094 +#define REG_DW_I2C_IC_ACK_GENERAL_CALL 0x0098 +#define REG_DW_I2C_IC_ENABLE_STATUS 0x009C +#define REG_DW_I2C_IC_COMP_PARAM_1 0x00F4 +#define REG_DW_I2C_IC_COMP_VERSION 0x00F8 +#define REG_DW_I2C_IC_COMP_TYPE 0x00FC + +//====================================================== +// I2C related enumeration +// I2C Address Mode +typedef enum _I2C_ADDR_MODE_ { + I2C_ADDR_7BIT = 0, + I2C_ADDR_10BIT = 1, +}I2C_ADDR_MODE,*PI2C_ADDR_MODE; + +// I2C Speed Mode +typedef enum _I2C_SPD_MODE_ { + I2C_SS_MODE = 1, + I2C_FS_MODE = 2, + I2C_HS_MODE = 3, +}I2C_SPD_MODE,*PI2C_SPD_MODE; + +//I2C Timing Parameters +#define I2C_SS_MIN_SCL_HTIME 4000 //the unit is ns. +#define I2C_SS_MIN_SCL_LTIME 4700 //the unit is ns. + +#define I2C_FS_MIN_SCL_HTIME 600 //the unit is ns. +#define I2C_FS_MIN_SCL_LTIME 1300 //the unit is ns. + +#define I2C_HS_MIN_SCL_HTIME_100 60 //the unit is ns, with bus loading = 100pf +#define I2C_HS_MIN_SCL_LTIME_100 120 //the unit is ns., with bus loading = 100pf + +#define I2C_HS_MIN_SCL_HTIME_400 160 //the unit is ns, with bus loading = 400pf +#define I2C_HS_MIN_SCL_LTIME_400 320 //the unit is ns., with bus loading = 400pf + + +//====================================================== +//I2C Essential functions and macros +_LONG_CALL_ROM_ VOID HalI2CWrite32(IN u8 I2CIdx, IN u8 I2CReg, IN u32 I2CVal); +_LONG_CALL_ROM_ u32 HalI2CRead32(IN u8 I2CIdx, IN u8 I2CReg); + +#define HAL_I2C_WRITE32(I2CIdx, addr, value) HalI2CWrite32(I2CIdx,addr,value) +#define HAL_I2C_READ32(I2CIdx, addr) HalI2CRead32(I2CIdx,addr) + +// Rtl8195a I2C function prototypes +_LONG_CALL_ HAL_Status HalI2CEnableRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CInit8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CDeInit8195a(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status HalI2CSetCLKRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CMassSendRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CSendRtl8195a(IN VOID *Data); +_LONG_CALL_ u8 HalI2CReceiveRtl8195a(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status HalI2CIntrCtrl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CClrIntrRtl8195a(IN VOID *Data); +_LONG_CALL_ROM_ HAL_Status HalI2CClrAllIntrRtl8195a(IN VOID *Data); +_LONG_CALL_ HAL_Status HalI2CDMACtrl8195a(IN VOID *Data); +_LONG_CALL_ u32 HalI2CReadRegRtl8195a(IN VOID *Data, IN u8 I2CReg); +_LONG_CALL_ HAL_Status HalI2CWriteRegRtl8195a(IN VOID *Data, IN u8 I2CReg, IN u32 RegVal); + +//Rtl8195a I2C V02 function prototype +_LONG_CALL_ HAL_Status HalI2CSendRtl8195aV02(IN VOID *Data); +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) || defined(CONFIG_CHIP_C_CUT) +_LONG_CALL_ HAL_Status HalI2CSetCLKRtl8195aV02(IN VOID *Data); +#elif defined(CONFIG_CHIP_E_CUT) +_LONG_CALL_ROM_ HAL_Status HalI2CSetCLKRtl8195aV02(IN VOID *Data); +#endif +//Rtl8195a I2C V02 function prototype END + +HAL_Status HalI2CInit8195a_Patch(IN VOID *Data); +HAL_Status HalI2CSendRtl8195a_Patch(IN VOID *Data); +HAL_Status HalI2CSetCLKRtl8195a_Patch(IN VOID *Data); + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_i2s.h b/lib/fwlib/rtl8195a/rtl8195a_i2s.h new file mode 100644 index 0000000..33a0bf8 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_i2s.h @@ -0,0 +1,617 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_I2S_H_ +#define _RTL8195A_I2S_H_ + + +//=============== Register Bit Field Definition ==================== +// REG_I2S_CONTROL +#define BIT_CTLX_I2S_EN BIT(0) +#define BIT_SHIFT_CTLX_I2S_EN 0 +#define BIT_MASK_CTLX_I2S_EN 0x1 +#define BIT_CTRL_CTLX_I2S_EN(x) (((x) & BIT_MASK_CTLX_I2S_EN) << BIT_SHIFT_CTLX_I2S_EN) + +#define BIT_SHIFT_CTLX_I2S_TRX_ACT 1 +#define BIT_MASK_CTLX_I2S_TRX_ACT 0x3 +#define BIT_CTRL_CTLX_I2S_TRX_ACT(x) (((x) & BIT_MASK_CTLX_I2S_TRX_ACT) << BIT_SHIFT_CTLX_I2S_TRX_ACT) +#define BIT_GET_CTLX_I2S_TRX_ACT(x) (((x) >> BIT_SHIFT_CTLX_I2S_TRX_ACT) & BIT_MASK_CTLX_I2S_TRX_ACT) + +#define BIT_SHIFT_CTLX_I2S_CH_NUM 3 +#define BIT_MASK_CTLX_I2S_CH_NUM 0x3 +#define BIT_CTRL_CTLX_I2S_CH_NUM(x) (((x) & BIT_MASK_CTLX_I2S_CH_NUM) << BIT_SHIFT_CTLX_I2S_CH_NUM) +#define BIT_GET_CTLX_I2S_CH_NUM(x) (((x) >> BIT_SHIFT_CTLX_I2S_CH_NUM) & BIT_MASK_CTLX_I2S_CH_NUM) + +#define BIT_CTLX_I2S_WL BIT(6) +#define BIT_SHIFT_CTLX_I2S_WL 6 +#define BIT_MASK_CTLX_I2S_WL 0x1 +#define BIT_CTRL_CTLX_I2S_WL(x) (((x) & BIT_MASK_CTLX_I2S_WL) << BIT_SHIFT_CTLX_I2S_WL) + +#define BIT_CTLX_I2S_LRSWAP BIT(10) +#define BIT_SHIFT_CTLX_I2S_LRSWAP 10 +#define BIT_MASK_CTLX_I2S_LRSWAP 0x1 +#define BIT_CTRL_CTLX_I2S_LRSWAP(x) (((x) & BIT_MASK_CTLX_I2S_LRSWAP) << BIT_SHIFT_CTLX_I2S_LRSWAP) + +#define BIT_CTLX_I2S_SCK_INV BIT(11) +#define BIT_SHIFT_CTLX_I2S_SCK_INV 11 +#define BIT_MASK_CTLX_I2S_SCK_INV 0x1 +#define BIT_CTRL_CTLX_I2S_SCK_INV(x) (((x) & BIT_MASK_CTLX_I2S_SCK_INV) << BIT_SHIFT_CTLX_I2S_SCK_INV) + +#define BIT_CTLX_I2S_ENDIAN_SWAP BIT(12) +#define BIT_SHIFT_CTLX_I2S_ENDIAN_SWAP 12 +#define BIT_MASK_CTLX_I2S_ENDIAN_SWAP 0x1 +#define BIT_CTRL_CTLX_I2S_ENDIAN_SWAP(x) (((x) & BIT_MASK_CTLX_I2S_ENDIAN_SWAP) << BIT_SHIFT_CTLX_I2S_ENDIAN_SWAP) + +#define BIT_CTLX_I2S_SLAVE_MODE BIT(29) +#define BIT_SHIFT_CTLX_I2S_SLAVE_MODE 29 +#define BIT_MASK_CTLX_I2S_SLAVE_MODE 0x1 +#define BIT_CTRL_CTLX_I2S_SLAVE_MODE(x) (((x) & BIT_MASK_CTLX_I2S_SLAVE_MODE) << BIT_SHIFT_CTLX_I2S_SLAVE_MODE) + +#define BIT_CTLX_I2S_CLK_SRC BIT(30) +#define BIT_SHIFT_CTLX_I2S_CLK_SRC 30 +#define BIT_MASK_CTLX_I2S_CLK_SRC 0x1 +#define BIT_CTRL_CTLX_I2S_CLK_SRC(x) (((x) & BIT_MASK_CTLX_I2S_CLK_SRC) << BIT_SHIFT_CTLX_I2S_CLK_SRC) + +#define BIT_CTLX_I2S_SW_RSTN BIT(31) +#define BIT_SHIFT_CTLX_I2S_SW_RSTN 31 +#define BIT_MASK_CTLX_I2S_SW_RSTN 0x1 +#define BIT_CTRL_CTLX_I2S_SW_RSTN(x) (((x) & BIT_MASK_CTLX_I2S_SW_RSTN) << BIT_SHIFT_CTLX_I2S_SW_RSTN) + +// REG_I2S_SETTING +#define BIT_SHIFT_SETTING_I2S_PAGE_SZ 0 +#define BIT_MASK_SETTING_I2S_PAGE_SZ 0xFFF +#define BIT_CTRL_SETTING_I2S_PAGE_SZ(x) (((x) & BIT_MASK_SETTING_I2S_PAGE_SZ) << BIT_SHIFT_SETTING_I2S_PAGE_SZ) +#define BIT_GET_SETTING_I2S_PAGE_SZ(x) (((x) >> BIT_SHIFT_SETTING_I2S_PAGE_SZ) & BIT_MASK_SETTING_I2S_PAGE_SZ) + +#define BIT_SHIFT_SETTING_I2S_PAGE_NUM 12 +#define BIT_MASK_SETTING_I2S_PAGE_NUM 0x3 +#define BIT_CTRL_SETTING_I2S_PAGE_NUM(x) (((x) & BIT_MASK_SETTING_I2S_PAGE_NUM) << BIT_SHIFT_SETTING_I2S_PAGE_NUM) +#define BIT_GET_SETTING_I2S_PAGE_NUM(x) (((x) >> BIT_SHIFT_SETTING_I2S_PAGE_NUM) & BIT_MASK_SETTING_I2S_PAGE_NUM) + +#define BIT_SHIFT_SETTING_I2S_SAMPLE_RATE 14 +#define BIT_MASK_SETTING_I2S_SAMPLE_RATE 0x7 +#define BIT_CTRL_SETTING_I2S_SAMPLE_RATE(x) (((x) & BIT_MASK_SETTING_I2S_SAMPLE_RATE) << BIT_SHIFT_SETTING_I2S_SAMPLE_RATE) +#define BIT_GET_SETTING_I2S_SAMPLE_RATE(x) (((x) >> BIT_SHIFT_SETTING_I2S_SAMPLE_RATE) & BIT_MASK_SETTING_I2S_SAMPLE_RATE) + +// i2s trx page own bit +#define BIT_PAGE_I2S_OWN_BIT BIT(31) +#define BIT_SHIFT_PAGE_I2S_OWN_BIT 31 +#define BIT_MASK_PAGE_I2S_OWN_BIT 0x1 +#define BIT_CTRL_PAGE_I2S_OWN_BIT(x) (((x) & BIT_MASK_PAGE_I2S_OWN_BIT) << BIT_SHIFT_PAGE_I2S_OWN_BIT) + +//=============== Register Address Definition ==================== +#define REG_I2S_PAGE_OWN_OFF 0x004 + +#define REG_I2S_CTL 0x000 +#define REG_I2S_TX_PAGE_PTR 0x004 +#define REG_I2S_RX_PAGE_PTR 0x008 +#define REG_I2S_SETTING 0x00C + +#define REG_I2S_TX_MASK_INT 0x010 +#define REG_I2S_TX_STATUS_INT 0x014 +#define REG_I2S_RX_MASK_INT 0x018 +#define REG_I2S_RX_STATUS_INT 0x01c + + +#define REG_I2S_TX_PAGE0_OWN 0x020 +#define REG_I2S_TX_PAGE1_OWN 0x024 +#define REG_I2S_TX_PAGE2_OWN 0x028 +#define REG_I2S_TX_PAGE3_OWN 0x02C +#define REG_I2S_RX_PAGE0_OWN 0x030 +#define REG_I2S_RX_PAGE1_OWN 0x034 +#define REG_I2S_RX_PAGE2_OWN 0x038 +#define REG_I2S_RX_PAGE3_OWN 0x03C + +/*I2S Essential Functions and Macros*/ +VOID +HalI2SWrite32( + IN u8 I2SIdx, + IN u8 I2SReg, + IN u32 I2SVal +); + +u32 +HalI2SRead32( + IN u8 I2SIdx, + IN u8 I2SReg +); + +/* +#define HAL_I2SX_READ32(I2sIndex, addr) \ + HAL_READ32(I2S0_REG_BASE+ (I2sIndex*I2S1_REG_OFF), addr) +#define HAL_I2SX_WRITE32(I2sIndex, addr, value) \ + HAL_WRITE32((I2S0_REG_BASE+ (I2sIndex*I2S1_REG_OFF)), addr, value) +*/ + +#define HAL_I2S_WRITE32(I2SIdx, addr, value) HalI2SWrite32(I2SIdx,addr,value) +#define HAL_I2S_READ32(I2SIdx, addr) HalI2SRead32(I2SIdx,addr) + +/* I2S debug output*/ +#define I2S_PREFIX "RTL8195A[i2s]: " +#define I2S_PREFIX_LVL " [i2s_DBG]: " + +typedef enum _I2S_DBG_LVL_ { + HAL_I2S_LVL = 0x01, + SAL_I2S_LVL = 0x02, + VERI_I2S_LVL = 0x03, +}I2S_DBG_LVL,*PI2S_DBG_LVL; + +#ifdef CONFIG_DEBUG_LOG +#ifdef CONFIG_DEBUG_LOG_I2S_HAL + + #define DBG_8195A_I2S(...) do{ \ + _DbgDump("\r"I2S_PREFIX __VA_ARGS__);\ + }while(0) + + + #define I2SDBGLVL 0xFF + #define DBG_8195A_I2S_LVL(LVL,...) do{\ + if (LVL&I2SDBGLVL){\ + _DbgDump("\r"I2S_PREFIX_LVL __VA_ARGS__);\ + }\ + }while(0) +#else + #define DBG_I2S_LOG_PERD 100 + #define DBG_8195A_I2S(...) + #define DBG_8195A_I2S_LVL(...) +#endif +#else + #define DBG_I2S_LOG_PERD 100 + #define DBG_8195A_I2S(...) + #define DBG_8195A_I2S_LVL(...) +#endif + +/* +#define REG_I2S_PAGE_OWN_OFF 0x004 +#define REG_I2S_CTL 0x000 +#define REG_I2S_TX_PAGE_PTR 0x004 +#define REG_I2S_RX_PAGE_PTR 0x008 +#define REG_I2S_SETTING 0x00C + +#define REG_I2S_TX_MASK_INT 0x010 +#define REG_I2S_TX_STATUS_INT 0x014 +#define REG_I2S_RX_MASK_INT 0x018 +#define REG_I2S_RX_STATUS_INT 0x01c + + + +#define REG_I2S_TX_PAGE0_OWN 0x020 +#define REG_I2S_TX_PAGE1_OWN 0x024 +#define REG_I2S_TX_PAGE2_OWN 0x028 +#define REG_I2S_TX_PAGE3_OWN 0x02C +#define REG_I2S_RX_PAGE0_OWN 0x030 +#define REG_I2S_RX_PAGE1_OWN 0x034 +#define REG_I2S_RX_PAGE2_OWN 0x038 +#define REG_I2S_RX_PAGE3_OWN 0x03C +*/ +/* template +#define BIT_SHIFT_CTLX_ 7 +#define BIT_MASK_CTLX_ 0x1 +#define BIT_CTLX_(x) (((x) & BIT_MASK_CTLX_) << BIT_SHIFT_CTLX_) +#define BIT_INV_CTLX_ (~(BIT_MASK_CTLX_ << BIT_SHIFT_CTLX_)) +*//* +#define BIT_SHIFT_CTLX_IIS_EN 0 +#define BIT_MASK_CTLX_IIS_EN 0x1 +#define BIT_CTLX_IIS_EN(x) (((x) & BIT_MASK_CTLX_IIS_EN) << BIT_SHIFT_CTLX_IIS_EN) +#define BIT_INV_CTLX_IIS_EN (~(BIT_MASK_CTLX_IIS_EN << BIT_SHIFT_CTLX_IIS_EN)) + +#define BIT_SHIFT_CTLX_TRX 1 +#define BIT_MASK_CTLX_TRX 0x3 +#define BIT_CTLX_TRX(x) (((x) & BIT_MASK_CTLX_TRX) << BIT_SHIFT_CTLX_TRX) +#define BIT_INV_CTLX_TRX (~(BIT_MASK_CTLX_TRX << BIT_SHIFT_CTLX_TRX)) + +#define BIT_SHIFT_CTLX_CH_NUM 3 +#define BIT_MASK_CTLX_CH_NUM 0x3 +#define BIT_CTLX_CH_NUM(x) (((x) & BIT_MASK_CTLX_CH_NUM) << BIT_SHIFT_CTLX_CH_NUM) +#define BIT_INV_CTLX_CH_NUM (~(BIT_MASK_CTLX_CH_NUM << BIT_SHIFT_CTLX_CH_NUM)) + +#define BIT_SHIFT_CTLX_EDGE_SW 5 +#define BIT_MASK_CTLX_EDGE_SW 0x1 +#define BIT_CTLX_EDGE_SW(x) (((x) & BIT_MASK_CTLX_EDGE_SW) << BIT_SHIFT_CTLX_EDGE_SW) +#define BIT_INV_CTLX_EDGE_SW (~(BIT_MASK_CTLX_EDGE_SW << BIT_SHIFT_CTLX_EDGE_SW)) + +#define BIT_SHIFT_CTLX_WL 6 +#define BIT_MASK_CTLX_WL 0x1 +#define BIT_CTLX_WL(x) (((x) & BIT_MASK_CTLX_WL) << BIT_SHIFT_CTLX_WL) +#define BIT_INV_CTLX_WL (~(BIT_MASK_CTLX_WL << BIT_SHIFT_CTLX_WL)) + +#define BIT_SHIFT_CTLX_LOOP_BACK 7 +#define BIT_MASK_CTLX_LOOP_BACK 0x1 +#define BIT_CTLX_LOOP_BACK(x) (((x) & BIT_MASK_CTLX_LOOP_BACK) << BIT_SHIFT_CTLX_LOOP_BACK) +#define BIT_INV_CTLX_LOOP_BACK (~(BIT_MASK_CTLX_LOOP_BACK << BIT_SHIFT_CTLX_LOOP_BACK)) + + +#define BIT_SHIFT_CTLX_FORMAT 8 +#define BIT_MASK_CTLX_FORMAT 0x3 +#define BIT_CTLX_FORMAT(x) (((x) & BIT_MASK_CTLX_FORMAT) << BIT_SHIFT_CTLX_FORMAT) +#define BIT_INV_CTLX_FORMAT (~(BIT_MASK_CTLX_FORMAT << BIT_SHIFT_CTLX_FORMAT)) + +#define BIT_SHIFT_CTLX_LRSWAP 10 +#define BIT_MASK_CTLX_LRSWAP 0x1 +#define BIT_CTLX_LRSWAP(x) (((x) & BIT_MASK_CTLX_LRSWAP) << BIT_SHIFT_CTLX_LRSWAP) +#define BIT_INV_CTLX_LRSWAP (~(BIT_MASK_CTLX_LRSWAP << BIT_SHIFT_CTLX_LRSWAP)) + +#define BIT_SHIFT_CTLX_SCK_INV 11 +#define BIT_MASK_CTLX_SCK_INV 0x1 +#define BIT_CTLX_SCK_INV(x) (((x) & BIT_MASK_CTLX_SCK_INV) << BIT_SHIFT_CTLX_SCK_INV) +#define BIT_INV_CTLX_SCK_INV (~(BIT_MASK_CTLX_SCK_INV << BIT_SHIFT_CTLX_SCK_INV)) + +#define BIT_SHIFT_CTLX_ENDIAN_SWAP 12 +#define BIT_MASK_CTLX_ENDIAN_SWAP 0x1 +#define BIT_CTLX_ENDIAN_SWAP(x) (((x) & BIT_MASK_CTLX_ENDIAN_SWAP) << BIT_SHIFT_CTLX_ENDIAN_SWAP) +#define BIT_INV_CTLX_ENDIAN_SWAP (~(BIT_MASK_CTLX_ENDIAN_SWAP << BIT_SHIFT_CTLX_ENDIAN_SWAP)) + + +#define BIT_SHIFT_CTLX_DEBUG_SWITCH 15 +#define BIT_MASK_CTLX_DEBUG_SWITCH 0x3 +#define BIT_CTLX_DEBUG_SWITCH(x) (((x) & BIT_MASK_CTLX_DEBUG_SWITCH) << BIT_SHIFT_CTLX_DEBUG_SWITCH) +#define BIT_INV_CTLX_DEBUG_SWITCH (~(BIT_MASK_CTLX_DEBUG_SWITCH << BIT_SHIFT_CTLX_DEBUG_SWITCH)) + +#define BIT_SHIFT_CTLX_SLAVE_SEL 29 +#define BIT_MASK_CTLX_SLAVE_SEL 0x1 +#define BIT_CTLX_SLAVE_SEL(x) (((x) & BIT_MASK_CTLX_SLAVE_SEL) << BIT_SHIFT_CTLX_SLAVE_SEL) +#define BIT_INV_CTLX_SLAVE_SEL (~(BIT_MASK_CTLX_SLAVE_SEL << BIT_SHIFT_CTLX_SLAVE_SEL)) + + +#define BIT_SHIFT_CTLX_CLK_SRC 30 +#define BIT_MASK_CTLX_CLK_SRC 0x1 +#define BIT_CTLX_CLK_SRC(x) (((x) & BIT_MASK_CTLX_CLK_SRC) << BIT_SHIFT_CTLX_CLK_SRC) +#define BIT_INV_CTLX_CLK_SRC (~(BIT_MASK_CTLX_CLK_SRC << BIT_SHIFT_CTLX_CLK_SRC)) + + + +#define BIT_SHIFT_CTLX_SW_RSTN 31 +#define BIT_MASK_CTLX_SW_RSTN 0x1 +#define BIT_CTLX_SW_RSTN(x) (((x) & BIT_MASK_CTLX_SW_RSTN) << BIT_SHIFT_CTLX_SW_RSTN) +#define BIT_INV_CTLX_SW_RSTN (~(BIT_MASK_CTLX_SW_RSTN << BIT_SHIFT_CTLX_SW_RSTN)) + + +#define BIT_SHIFT_SETTING_PAGE_SZ 0 +#define BIT_MASK_SETTING_PAGE_SZ 0xFFF +#define BIT_SETTING_PAGE_SZ(x) (((x) & BIT_MASK_SETTING_PAGE_SZ) << BIT_SHIFT_SETTING_PAGE_SZ) +#define BIT_INV_SETTING_PAGE_SZ (~(BIT_MASK_SETTING_PAGE_SZ << BIT_SHIFT_SETTING_PAGE_SZ)) + +#define BIT_SHIFT_SETTING_PAGE_NUM 12 +#define BIT_MASK_SETTING_PAGE_NUM 0x3 +#define BIT_SETTING_PAGE_NUM(x) (((x) & BIT_MASK_SETTING_PAGE_NUM) << BIT_SHIFT_SETTING_PAGE_NUM) +#define BIT_INV_SETTING_PAGE_NUM (~(BIT_MASK_SETTING_PAGE_NUM << BIT_SHIFT_SETTING_PAGE_NUM)) + +#define BIT_SHIFT_SETTING_SAMPLE_RATE 14 +#define BIT_MASK_SETTING_SAMPLE_RATE 0x7 +#define BIT_SETTING_SAMPLE_RATE(x) (((x) & BIT_MASK_SETTING_SAMPLE_RATE) << BIT_SHIFT_SETTING_SAMPLE_RATE) +#define BIT_INV_SETTING_SAMPLE_RATE (~(BIT_MASK_SETTING_SAMPLE_RATE << BIT_SHIFT_SETTING_SAMPLE_RATE)) +*/ + +typedef enum _I2S_CTL_FORMAT { + FormatI2s = 0x00, + FormatLeftJustified = 0x01, + FormatRightJustified = 0x02 +}I2S_CTL_FORMAT, *PI2S_CTL_FORMAT; + +typedef enum _I2S_CTL_CHNUM { + ChannelStereo = 0x00, + Channel5p1 = 0x01, + ChannelMono = 0x02 +}I2S_CTL_CHNUM, *PI2S_CTL_CHNUM; + +typedef enum _I2S_CTL_TRX_ACT { + RxOnly = 0x00, + TxOnly = 0x01, + TXRX = 0x02 +}I2S_CTL_TRX_ACT, *PI2S_CTL_TRX_ACT; +/* +typedef struct _I2S_CTL_REG_ { + I2S_CTL_FORMAT Format; + I2S_CTL_CHNUM ChNum; + I2S_CTL_TRX_ACT TrxAct; + + u32 I2s_En :1; // Bit 0 + u32 Rsvd1to4 :4; // Bit 1-4 is TrxAct, ChNum + u32 EdgeSw :1; // Bit 5 Edge switch + u32 WordLength :1; // Bit 6 + u32 LoopBack :1; // Bit 7 + u32 Rsvd8to9 :2; // Bit 8-9 is Format + u32 DacLrSwap :1; // Bit 10 + u32 SckInv :1; // Bit 11 + u32 EndianSwap :1; // Bit 12 + u32 Rsvd13to14 :2; // Bit 11-14 + u32 DebugSwitch :2; // Bit 15-16 + u32 Rsvd17to28 :12; // Bit 17-28 + u32 SlaveMode :1; // Bit 29 + u32 SR44p1KHz :1; // Bit 30 + u32 SwRstn :1; // Bit 31 +} I2S_CTL_REG, *PI2S_CTL_REG; +*/ +typedef enum _I2S_SETTING_PAGE_NUM { + I2s1Page = 0x00, + I2s2Page = 0x01, + I2s3Page = 0x02, + I2s4Page = 0x03 +}I2S_SETTING_PAGE_NUM, *PI2S_SETTING_PAGE_NUM; + +//sampling rate +typedef enum _I2S_SETTING_SR { + I2sSR8K = 0x00, + I2sSR16K = 0x01, + I2sSR24K = 0x02, + I2sSR32K = 0x03, + I2sSR48K = 0x05, + I2sSR44p1K = 0x15, + I2sSR96K = 0x06, + I2sSR88p2K = 0x16 +}I2S_SETTING_SR, *PI2S_SETTING_SR; +/* +typedef struct _I2S_SETTING_REG_ { + I2S_SETTING_PAGE_NUM PageNum; + I2S_SETTING_SR SampleRate; + + u32 PageSize:12; // Bit 0-11 +}I2S_SETTING_REG, *PI2S_SETTING_REG; + +typedef enum _I2S_TX_ISR { + I2sTxP0OK = 0x01, + I2sTxP1OK = 0x02, + I2sTxP2OK = 0x04, + I2sTxP3OK = 0x08, + I2sTxPageUn = 0x10, + I2sTxFifoEmpty = 0x20 +}I2S_TX_ISR, *PI2S_TX_ISR; + +typedef enum _I2S_RX_ISR { + I2sRxP0OK = 0x01, + I2sRxP1OK = 0x02, + I2sRxP2OK = 0x04, + I2sRxP3OK = 0x08, + I2sRxPageUn = 0x10, + I2sRxFifoFull = 0x20 +}I2S_RX_ISR, *PI2S_RX_ISR; +*/ + +/* Hal I2S function prototype*/ +RTK_STATUS +HalI2SInitRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SInitRtl8195a_Patch( + IN VOID *Data +); + +RTK_STATUS +HalI2SDeInitRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2STxRtl8195a( + IN VOID *Data, + IN u8 *pBuff +); + +RTK_STATUS +HalI2SRxRtl8195a( + IN VOID *Data, + OUT u8 *pBuff +); + +RTK_STATUS +HalI2SEnableRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SIntrCtrlRtl8195a( + IN VOID *Data +); + +u32 +HalI2SReadRegRtl8195a( + IN VOID *Data, + IN u8 I2SReg +); + +RTK_STATUS +HalI2SSetRateRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetWordLenRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetChNumRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetPageNumRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetPageSizeRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetDirectionRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SSetDMABufRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SClrIntrRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SClrAllIntrRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SDMACtrlRtl8195a( + IN VOID *Data +); + +u8 +HalI2SGetTxPageRtl8195a( + IN VOID *Data +); + +u8 +HalI2SGetRxPageRtl8195a( + IN VOID *Data +); + +RTK_STATUS +HalI2SPageSendRtl8195a( + IN VOID *Data, + IN u8 PageIdx +); + +#if 0 +RTK_STATUS +HalI2SPageRecvRtl8195a( + IN VOID *Data, + IN u8 PageIdx +); +#else +RTK_STATUS +HalI2SPageRecvRtl8195a( + IN VOID *Data +); +#endif + +RTK_STATUS +HalI2SClearAllOwnBitRtl8195a( + IN VOID *Data +); + + +// HAL functions Wrapper +static __inline VOID +HalI2SSetRate( + IN VOID *Data +) +{ + HalI2SSetRateRtl8195a(Data); +} + +static __inline VOID +HalI2SSetWordLen( + IN VOID *Data +) +{ + HalI2SSetWordLenRtl8195a(Data); +} + +static __inline VOID +HalI2SSetChNum( + IN VOID *Data +) +{ + HalI2SSetChNumRtl8195a(Data); +} + +static __inline VOID +HalI2SSetPageNum( + IN VOID *Data +) +{ + HalI2SSetPageNumRtl8195a(Data); +} + +static __inline VOID +HalI2SSetPageSize( + IN VOID *Data +) +{ + HalI2SSetPageSizeRtl8195a(Data); +} + +static __inline VOID +HalI2SSetDirection( + IN VOID *Data +) +{ + HalI2SSetDirectionRtl8195a(Data); +} + +static __inline VOID +HalI2SSetDMABuf( + IN VOID *Data +) +{ + HalI2SSetDMABufRtl8195a(Data); +} + +static __inline u8 +HalI2SGetTxPage( + IN VOID *Data +) +{ + return HalI2SGetTxPageRtl8195a(Data); +} + +static __inline u8 +HalI2SGetRxPage( + IN VOID *Data +) +{ + return HalI2SGetRxPageRtl8195a(Data); +} + +static __inline VOID +HalI2SPageSend( + IN VOID *Data, + IN u8 PageIdx +) +{ + HalI2SPageSendRtl8195a(Data, PageIdx); +} + +#if 0 +static __inline VOID +HalI2SPageRecv( + IN VOID *Data, + IN u8 PageIdx +) +{ + HalI2SPageRecvRtl8195a(Data, PageIdx); +} +#else +static __inline VOID +HalI2SPageRecv( + IN VOID *Data +) +{ + HalI2SPageRecvRtl8195a(Data); +} +#endif + +static __inline VOID +HalI2SClearAllOwnBit( + IN VOID *Data +) +{ + HalI2SClearAllOwnBitRtl8195a(Data); +} + +#endif /* _RTL8195A_I2S_H_ */ + + diff --git a/lib/fwlib/rtl8195a/rtl8195a_mii.h b/lib/fwlib/rtl8195a/rtl8195a_mii.h new file mode 100644 index 0000000..56ebbdc --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_mii.h @@ -0,0 +1,674 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_MII_H_ +#define _RTL8195A_MII_H_ + +#include "basic_types.h" +#include "hal_api.h" + + +#define ETHERNET_REG_BASE 0x40050000 +#define ETHERNET_MODULE_BASE ETHERNET_REG_BASE + 0x0000 +#define CPU_INTERFACE_BASE ETHERNET_REG_BASE + 0x1300 + +/* Ethernet Module registers */ +#define REG_RTL_MII_IDR0 0x0000 // Table 2 IDR0 (Offset 0000h-0003h, R/W) +#define REG_RTL_MII_IDR4 0x0004 // Table 3 IDR4 (Offset 0004h-0007h, R/W) +#define REG_RTL_MII_MAR0 0x0008 // Table 4 MAR0 (Offset 0008h-000bh, R/W) +#define REG_RTL_MII_MAR4 0x000C // Table 5 MAR4 (Offset 000ch-000fh, R/W) +#define REG_RTL_MII_CR 0x0038 // Table 21 Command Register (COM_REG, Offset 0038-003Bh, R/W) +#define REG_RTL_MII_IMRISR 0x003C // Table 22 + Table 23 +#define REG_RTL_MII_TCR 0x0040 // Table 24 Transmit Configuration Register (TC_REG, Offset 0040h-0043h, R/W) +#define REG_RTL_MII_RCR 0x0044 // Table 25 Receive Configuration Register (RC_REG, Offset 0044h-0047h, R/W) +#define REG_RTL_MII_CTCR 0x0048 // Table 26 CPU Tag Control Register (CPUTAG_REG, Offset 0048h-004bh, R/W) +#define REG_RTL_MII_CONFIG 0x004C // Table 27 Configuration Register (CONFIG_REG, Offset 004ch-004fh, R/W) +#define REG_RTL_MII_CTCR1 0x0050 // Table 28 CPUTAG1 Register (CPUTAG1_REG, Offset 0050h-0053h, R/W) +#define REG_RTL_MII_MSR 0x0058 // Table 29 Media Status Register (MS_reg: Offset 0058h – 005bh, R/W) +#define REG_RTL_MII_MIIAR 0x005C // Table 30 MII Access Register (MIIA_REG, Offset 005c-005fh, R/W) +#define REG_RTL_MII_VR 0x0064 // Table 32 VLAN Register (VLAN_REG, Offset 0064-0067h, R/W) +#define REG_RTL_MII_IMR0 0x00D0 // Table 50 IMR0_REG (IMR0_REG, Offset D0h-D3h) +#define REG_RTL_MII_IMR1 0x00D4 // Table 51 IMR1_REG (IMR1_REG, Offset d4h-d7h) +#define REG_RTL_MII_ISR1 0x00D8 // Table 52 ISR1 Register (ISR1_REG, Offset D8h-DBh) +#define REG_RTL_MII_INTR 0x00DC // Table 53 Interrupt routing register (INTR_REG, Offset DCh-DFh) +#define REG_RTL_MII_CCR 0x00E4 // Table xx Clock Control Register (CLKCTL_REG, Offset E4h-E7h) + +/* CPU Interface registers */ +#define REG_RTL_MII_TXFDP1 0x1300 // Table 55 TxFDP1 register (TXFDP1_REG, offset 1300h-1303h) +#define REG_RTL_MII_TXCDO1 0x1304 // Table 56 TxCDO1 register (TXCDO1_REG, offset 1304h-1305h) +#define REG_RTL_MII_TXFDP2 0x1310 // Table 57 TxFDP2 register (TXFDP2_REG, offset 1310h-1313h) +#define REG_RTL_MII_TXCDO2 0x1314 // Table 58 TxCDO2 register (TXCDO2_REG, offset 1314h-1315h) +#define REG_RTL_MII_TXFDP3 0x1320 // Table 59 TxFDP3 register (TXFDP3_REG, offset 1320h-1323h) +#define REG_RTL_MII_TXCDO3 0x1324 // Table 60 TxCDO3 register (TXCDO3_REG, offset 1324h-1325h) +#define REG_RTL_MII_TXFDP4 0x1330 // Table 61 TxFDP4 register (TXFDP4_REG, offset 1330h-1333h) +#define REG_RTL_MII_TXCDO4 0x1334 // Table 62 TxCDO4 register (TXCDO4_REG, offset 1334h-1335h) +#define REG_RTL_MII_TXFDP5 0x1340 // Table 63 TxFDP5 register (TXFDP5_REG, offset 1340h-1343h) +#define REG_RTL_MII_TXCDO5 0x1344 // Table 64 TxCDO5 register (TXCDO5_REG, offset 1344h-1345h) +#define REG_RTL_MII_RXFDP2 0x1390 // Table 66 RxFDP2 register (RXFDP#_REG, offset 1390h-1393h) +#define REG_RTL_MII_RXFDP1 0x13F0 // Table 71 RxFDP1 register (RXFDP1_REG, offset 13F0h-13F3h) +#define REG_RTL_MII_RXRS1 0x13F6 // Table 73 Rx Ring Size1 register (RX_RS1_REG, offset 13F6h-13F7h) + +#define REG_RTL_MII_RX_PSE1 0x142C // Table 77 Rx_Pse_Des_Thres_1_h (RX_PSE1_REG, Offset 142ch) +#define REG_RTL_MII_ETNRXCPU1 0x1430 // Table 79 EhtrntRxCPU_Des_Num1 (ETNRXCPU1_REG, Offset 1430h-1433h) +#define REG_RTL_MII_IOCMD 0x1434 // Table 80 Ethernet_IO_CMD (ETN_IO_CMD_REG, Offset 1434h-1437h) +#define REG_RTL_MII_IOCMD1 0x1438 // Table 81 Ethernet_IO_CMD1 (IO_CMD1_REG: Offset 1438h-143bh) + + +#define HAL_MII_READ32(addr) \ + HAL_READ32(ETHERNET_REG_BASE, addr) +#define HAL_MII_WRITE32(addr, value) \ + HAL_WRITE32(ETHERNET_REG_BASE, addr, value) +#define HAL_MII_READ16(addr) \ + HAL_READ16(ETHERNET_REG_BASE, addr) +#define HAL_MII_WRITE16(addr, value) \ + HAL_WRITE16(ETHERNET_REG_BASE, addr, value) +#define HAL_MII_READ8(addr) \ + HAL_READ8(ETHERNET_REG_BASE, addr) +#define HAL_MII_WRITE8(addr, value) \ + HAL_WRITE8(ETHERNET_REG_BASE, addr, value) + +#define CMD_CONFIG 0x00081000 + +//2014-04-29 yclin (disable [27] r_en_precise_dma) +// #define CMD1_CONFIG 0x39000000 +#define CMD1_CONFIG 0x31000000 + +// #define MAX_RX_DESC_SIZE 6 +#define MAX_RX_DESC_SIZE 1 +#define MAX_TX_DESC_SIZE 5 + +// 0058h +#define BIT_SHIFT_MSR_FORCE_SPEED_SELECT 16 +#define BIT_MASK_MSR_FORCE_SPEED_SELECT 0x3 +#define BIT_MSR_FORCE_SPEED_SELECT(x)(((x) & BIT_MASK_MSR_FORCE_SPEED_SELECT) << BIT_SHIFT_MSR_FORCE_SPEED_SELECT) +#define BIT_INVC_MSR_FORCE_SPEED_SELECT (~(BIT_MASK_MSR_FORCE_SPEED_SELECT << BIT_SHIFT_MSR_FORCE_SPEED_SELECT)) + +#define BIT_SHIFT_MSR_FORCE_SPEED_MODE_ENABLE 10 +#define BIT_MASK_MSR_FORCE_SPEED_MODE_ENABLE 0x1 +#define BIT_MSR_FORCE_SPEED_MODE_ENABLE(x)(((x) & BIT_MASK_MSR_FORCE_SPEED_MODE_ENABLE) << BIT_SHIFT_MSR_FORCE_SPEED_MODE_ENABLE) +#define BIT_INVC_MSR_FORCE_SPEED_MODE_ENABLE (~(BIT_MASK_MSR_FORCE_SPEED_MODE_ENABLE << BIT_SHIFT_MSR_FORCE_SPEED_MODE_ENABLE)) + +// 1434h +#define BIT_SHIFT_IOCMD_RXENABLE 5 +#define BIT_MASK_IOCMD_RXENABLE 0x1 +#define BIT_IOCMD_RXENABLE(x)(((x) & BIT_MASK_IOCMD_RXENABLE) << BIT_SHIFT_IOCMD_RXENABLE) +#define BIT_INVC_IOCMD_RXENABLE (~(BIT_MASK_IOCMD_RXENABLE << BIT_SHIFT_IOCMD_RXENABLE)) + +#define BIT_SHIFT_IOCMD_TXENABLE 4 +#define BIT_MASK_IOCMD_TXENABLE 0x1 +#define BIT_IOCMD_TXENABLE(x)(((x) & BIT_MASK_IOCMD_TXENABLE) << BIT_SHIFT_IOCMD_TXENABLE) +#define BIT_INVC_IOCMD_TXENABLE (~(BIT_MASK_IOCMD_TXENABLE << BIT_SHIFT_IOCMD_TXENABLE)) + +#define BIT_SHIFT_IOCMD_FIRST_DMATX_ENABLE 0 +#define BIT_MASK_IOCMD_FIRST_DMATX_ENABLE 0x1 +#define BIT_IOCMD_FIRST_DMATX_ENABLE(x)(((x) & BIT_MASK_IOCMD_FIRST_DMATX_ENABLE) << BIT_SHIFT_IOCMD_FIRST_DMATX_ENABLE) +#define BIT_INVC_IOCMD_FIRST_DMATX_ENABLE (~(BIT_MASK_IOCMD_FIRST_DMATX_ENABLE << BIT_SHIFT_IOCMD_FIRST_DMATX_ENABLE)) + +// 1438h +#define BIT_SHIFT_IOCMD1_FIRST_DMARX_ENABLE 16 +#define BIT_MASK_IOCMD1_FIRST_DMARX_ENABLE 0x1 +#define BIT_IOCMD1_FIRST_DMARX_ENABLE(x)(((x) & BIT_MASK_IOCMD1_FIRST_DMARX_ENABLE) << BIT_SHIFT_IOCMD1_FIRST_DMARX_ENABLE) +#define BIT_INVC_IOCMD1_FIRST_DMARX_ENABLE (~(BIT_MASK_IOCMD1_FIRST_DMARX_ENABLE << BIT_SHIFT_IOCMD1_FIRST_DMARX_ENABLE)) + + +/** + * 1.4.1.7 Tx command descriptor used in RL6266 + * 5 dobule words + */ +typedef struct _TX_INFO_ { + union { + struct { + u32 own:1; //31 + u32 eor:1; //30 + u32 fs:1; //29 + u32 ls:1; //28 + u32 ipcs:1; //27 + u32 l4cs:1; //26 + u32 keep:1; //25 + u32 blu:1; //24 + u32 crc:1; //23 + u32 vsel:1; //22 + u32 dislrn:1; //21 + u32 cputag_ipcs:1; //20 + u32 cputag_l4cs:1; //19 + u32 cputag_psel:1; //18 + u32 rsvd:1; //17 + u32 data_length:17; //0~16 + } bit; + u32 dw; //double word + } opts1; + + u32 addr; + + union { + struct { + u32 cputag:1; //31 + u32 aspri:1; //30 + u32 cputag_pri:3; //27~29 + u32 tx_vlan_action:2; //25~26 + u32 tx_pppoe_action:2; //23~24 + u32 tx_pppoe_idx:3; //20~22 + u32 efid:1; //19 + u32 enhance_fid:3; //16~18 + u32 vidl:8; // 8~15 + u32 prio:3; // 5~7 + u32 cfi:1; // 4 + u32 vidh:4; // 0~3 + } bit; + u32 dw; //double word + } opts2; + + union { + struct { + u32 extspa:3; //29~31 + u32 tx_portmask:6; //23~28 + u32 tx_dst_stream_id:7; //16~22 + u32 rsvd:14; // 2~15 + u32 l34keep:1; // 1 + u32 ptp:1; // 0 + } bit; + u32 dw; //double word + } opts3; + + union { + struct { + u32 lgsen:1; //31 + u32 lgmss:11; //20~30 + u32 rsvd:20; // 0~19 + } bit; + u32 dw; //double word + } opts4; + +} TX_INFO, *PTX_INFO; + +typedef struct _RX_INFO_ { + union{ + struct{ + u32 own:1; //31 + u32 eor:1; //30 + u32 fs:1; //29 + u32 ls:1; //28 + u32 crcerr:1; //27 + u32 ipv4csf:1; //26 + u32 l4csf:1; //25 + u32 rcdf:1; //24 + u32 ipfrag:1; //23 + u32 pppoetag:1; //22 + u32 rwt:1; //21 + u32 pkttype:4; //20-17 + u32 l3routing:1; //16 + u32 origformat:1; //15 + u32 pctrl:1; //14 +#ifdef CONFIG_RG_JUMBO_FRAME + u32 data_length:14; //13~0 +#else + u32 rsvd:2; //13~12 + u32 data_length:12; //11~0 +#endif + }bit; + u32 dw; //double word + }opts1; + + u32 addr; + + union{ + struct{ + u32 cputag:1; //31 + u32 ptp_in_cpu_tag_exist:1; //30 + u32 svlan_tag_exist:1; //29 + u32 rsvd_2:2; //27~28 + u32 pon_stream_id:7; //20~26 + u32 rsvd_1:3; //17~19 + u32 ctagva:1; //16 + u32 cvlan_tag:16; //15~0 + }bit; + u32 dw; //double word + }opts2; + + union{ + struct{ + u32 src_port_num:5; //27~31 + u32 dst_port_mask:6; //21~26 + u32 reason:8; //13~20 + u32 internal_priority:3; //10~12 + u32 ext_port_ttl_1:5; //5~9 + u32 rsvd:5; //4~0 + }bit; + u32 dw; //double word + }opts3; +} RX_INFO, *PRX_INFO; + +/** + * GMAC_STATUS_REGS + */ +// TX/RX Descriptor Common +#define BIT_SHIFT_GMAC_DESCOWN 31 +#define BIT_MASK_GMAC_DESCOWN 0x1 +#define BIT_GMAC_DESCOWN(x)(((x) & BIT_MASK_GMAC_DESCOWN) << BIT_SHIFT_GMAC_DESCOWN) +#define BIT_INVC_GMAC_DESCOWN (~(BIT_MASK_GMAC_DESCOWN << BIT_SHIFT_GMAC_DESCOWN)) + +#define BIT_SHIFT_GMAC_RINGEND 30 +#define BIT_MASK_GMAC_RINGEND 0x1 +#define BIT_GMAC_RINGEND(x)(((x) & BIT_MASK_GMAC_RINGEND) << BIT_SHIFT_GMAC_RINGEND) +#define BIT_INVC_GMAC_RINGEND (~(BIT_MASK_GMAC_RINGEND << BIT_SHIFT_GMAC_RINGEND)) + +#define BIT_SHIFT_GMAC_FIRSTFRAG 29 +#define BIT_MASK_GMAC_FIRSTFRAG 0x1 +#define BIT_GMAC_FIRSTFRAG(x)(((x) & BIT_MASK_GMAC_FIRSTFRAG) << BIT_SHIFT_GMAC_FIRSTFRAG) +#define BIT_INVC_GMAC_FIRSTFRAG (~(BIT_MASK_GMAC_FIRSTFRAG << BIT_SHIFT_GMAC_FIRSTFRAG)) + +#define BIT_SHIFT_GMAC_LASTFRAG 28 +#define BIT_MASK_GMAC_LASTFRAG 0x1 +#define BIT_GMAC_LASTFRAG(x)(((x) & BIT_MASK_GMAC_LASTFRAG) << BIT_SHIFT_GMAC_LASTFRAG) +#define BIT_INVC_GMAC_LASTFRAG (~(BIT_MASK_GMAC_LASTFRAG << BIT_SHIFT_GMAC_LASTFRAG)) + +// TX Descriptor opts1 +#define BIT_SHIFT_GMAC_IPCS 27 +#define BIT_MASK_GMAC_IPCS 0x1 +#define BIT_GMAC_IPCS(x)(((x) & BIT_MASK_GMAC_IPCS) << BIT_SHIFT_GMAC_IPCS) +#define BIT_INVC_GMAC_IPCS (~(BIT_MASK_GMAC_IPCS << BIT_SHIFT_GMAC_IPCS)) + +#define BIT_SHIFT_GMAC_L4CS 26 +#define BIT_MASK_GMAC_L4CS 0x1 +#define BIT_GMAC_L4CS(x)(((x) & BIT_MASK_GMAC_L4CS) << BIT_SHIFT_GMAC_L4CS) +#define BIT_INVC_GMAC_L4CS (~(BIT_MASK_GMAC_L4CS << BIT_SHIFT_GMAC_L4CS)) + +#define BIT_SHIFT_GMAC_KEEP 25 +#define BIT_MASK_GMAC_KEEP 0x1 +#define BIT_GMAC_KEEP(x)(((x) & BIT_MASK_GMAC_KEEP) << BIT_SHIFT_GMAC_KEEP) +#define BIT_INVC_GMAC_KEEP (~(BIT_MASK_GMAC_KEEP << BIT_SHIFT_GMAC_KEEP)) + +#define BIT_SHIFT_GMAC_BLU 24 +#define BIT_MASK_GMAC_BLU 0x1 +#define BIT_GMAC_BLU(x)(((x) & BIT_MASK_GMAC_BLU) << BIT_SHIFT_GMAC_BLU) +#define BIT_INVC_GMAC_BLU (~(BIT_MASK_GMAC_BLU << BIT_SHIFT_GMAC_BLU)) + +#define BIT_SHIFT_GMAC_TXCRC 23 +#define BIT_MASK_GMAC_TXCRC 0x1 +#define BIT_GMAC_TXCRC(x)(((x) & BIT_MASK_GMAC_TXCRC) << BIT_SHIFT_GMAC_TXCRC) +#define BIT_INVC_GMAC_TXCRC (~(BIT_MASK_GMAC_TXCRC << BIT_SHIFT_GMAC_TXCRC)) + +#define BIT_SHIFT_GMAC_VSEL 22 +#define BIT_MASK_GMAC_VSEL 0x1 +#define BIT_GMAC_VSEL(x)(((x) & BIT_MASK_GMAC_VSEL) << BIT_SHIFT_GMAC_VSEL) +#define BIT_INVC_GMAC_VSEL (~(BIT_MASK_GMAC_VSEL << BIT_SHIFT_GMAC_VSEL)) + +#define BIT_SHIFT_GMAC_DISLRN 21 +#define BIT_MASK_GMAC_DISLRN 0x1 +#define BIT_GMAC_DISLRN(x)(((x) & BIT_MASK_GMAC_DISLRN) << BIT_SHIFT_GMAC_DISLRN) +#define BIT_INVC_GMAC_DISLRN (~(BIT_MASK_GMAC_DISLRN << BIT_SHIFT_GMAC_DISLRN)) + +#define BIT_SHIFT_GMAC_CPUTAG_IPCS 20 +#define BIT_MASK_GMAC_CPUTAG_IPCS 0x1 +#define BIT_GMAC_CPUTAG_IPCS(x)(((x) & BIT_MASK_GMAC_CPUTAG_IPCS) << BIT_SHIFT_GMAC_CPUTAG_IPCS) +#define BIT_INVC_GMAC_CPUTAG_IPCS (~(BIT_MASK_GMAC_CPUTAG_IPCS << BIT_SHIFT_GMAC_CPUTAG_IPCS)) + +#define BIT_SHIFT_GMAC_CPUTAG_L4CS 19 +#define BIT_MASK_GMAC_CPUTAG_L4CS 0x1 +#define BIT_GMAC_CPUTAG_L4CS(x)(((x) & BIT_MASK_GMAC_CPUTAG_L4CS) << BIT_SHIFT_GMAC_CPUTAG_L4CS) +#define BIT_INVC_GMAC_CPUTAG_L4CS (~(BIT_MASK_GMAC_CPUTAG_L4CS << BIT_SHIFT_GMAC_CPUTAG_L4CS)) + +#define BIT_SHIFT_GMAC_CPUTAG_PSEL 18 +#define BIT_MASK_GMAC_CPUTAG_PSEL 0x1 +#define BIT_GMAC_CPUTAG_PSEL(x)(((x) & BIT_MASK_GMAC_CPUTAG_PSEL) << BIT_SHIFT_GMAC_CPUTAG_PSEL) +#define BIT_INVC_GMAC_CPUTAG_PSEL (~(BIT_MASK_GMAC_CPUTAG_PSEL << BIT_SHIFT_GMAC_CPUTAG_PSEL)) + + +#if 0 +enum RE8670_STATUS_REGS +{ + /*TX/RX share */ + DescOwn = (1 << 31), /* Descriptor is owned by NIC */ + RingEnd = (1 << 30), /* End of descriptor ring */ + FirstFrag = (1 << 29), /* First segment of a packet */ + LastFrag = (1 << 28), /* Final segment of a packet */ + + /*Tx descriptor opt1*/ + IPCS = (1 << 27), + L4CS = (1 << 26), + KEEP = (1 << 25), + BLU = (1 << 24), + TxCRC = (1 << 23), + VSEL = (1 << 22), + DisLrn = (1 << 21), + CPUTag_ipcs = (1 << 20), + CPUTag_l4cs = (1 << 19), + + /*Tx descriptor opt2*/ + CPUTag = (1 << 31), + aspri = (1 << 30), + CPRI = (1 << 27), + TxVLAN_int = (0 << 25), //intact + TxVLAN_ins = (1 << 25), //insert + TxVLAN_rm = (2 << 25), //remove + TxVLAN_re = (3 << 25), //remark + //TxPPPoEAct = (1 << 23), + TxPPPoEAct = 23, + //TxPPPoEIdx = (1 << 20), + TxPPPoEIdx = 20, + Efid = (1 << 19), + //Enhan_Fid = (1 << 16), + Enhan_Fid = 16, + /*Tx descriptor opt3*/ + SrcExtPort = 29, + TxDesPortM = 23, + TxDesStrID = 16, + TxDesVCM = 0, + /*Tx descriptor opt4*/ + /*Rx descriptor opt1*/ + CRCErr = (1 << 27), + IPV4CSF = (1 << 26), + L4CSF = (1 << 25), + RCDF = (1 << 24), + IP_FRAG = (1 << 23), + PPPoE_tag = (1 << 22), + RWT = (1 << 21), + PktType = (1 << 17), + RxProtoIP = 1, + RxProtoPPTP = 2, + RxProtoICMP = 3, + RxProtoIGMP = 4, + RxProtoTCP = 5, + RxProtoUDP = 6, + RxProtoIPv6 = 7, + RxProtoICMPv6 = 8, + RxProtoTCPv6 = 9, + RxProtoUDPv6 = 10, + L3route = (1 << 16), + OrigFormat = (1 << 15), + PCTRL = (1 << 14), + /*Rx descriptor opt2*/ + PTPinCPU = (1 << 30), + SVlanTag = (1 << 29), + /*Rx descriptor opt3*/ + SrcPort = (1 << 27), + DesPortM = (1 << 21), + Reason = (1 << 13), + IntPriority = (1 << 10), + ExtPortTTL = (1 << 5), +}; + +enum _DescStatusBit { + DescOwn = (1 << 31), /* Descriptor is owned by NIC */ + RingEnd = (1 << 30), /* End of descriptor ring */ + FirstFrag = (1 << 29), /* First segment of a packet */ + LastFrag = (1 << 28), /* Final segment of a packet */ + + /* Tx private */ + LargeSend = (1 << 27), /* TCP Large Send Offload (TSO) */ + MSSShift = 16, /* MSS value position */ + MSSMask = 0xfff, /* MSS value + LargeSend bit: 12 bits */ + IPCS = (1 << 18), /* Calculate IP checksum */ + UDPCS = (1 << 17), /* Calculate UDP/IP checksum */ + TCPCS = (1 << 16), /* Calculate TCP/IP checksum */ + TxVlanTag = (1 << 17), /* Add VLAN tag */ + + /* Rx private */ + PID1 = (1 << 18), /* Protocol ID bit 1/2 */ + PID0 = (1 << 17), /* Protocol ID bit 2/2 */ + +#define RxProtoUDP (PID1) +#define RxProtoTCP (PID0) +#define RxProtoIP (PID1 | PID0) +#define RxProtoMask RxProtoIP + + IPFail = (1 << 16), /* IP checksum failed */ + UDPFail = (1 << 15), /* UDP/IP checksum failed */ + TCPFail = (1 << 14), /* TCP/IP checksum failed */ + RxVlanTag = (1 << 16), /* VLAN tag available */ +}; +#endif + +typedef struct _PHY_MODE_INFO_ { + u8 PhyAddress; + u8 PhyMode; + u8 PhyInterface; +} PHY_MODE_INFO, *PPHY_MODE_INFO; + +typedef enum _PHY_MODE_SWITCH_ { + PHY_MODE_DISABLE = 0, + PHY_MODE_ENABLE = 1 +} PHY_MODE_SWITCH, *PPHY_MODE_SWITCH; + +typedef enum _PHY_INTERFACE_SELECT_ { + PHY_INTERFACE_ONE_WORKS = 0, + PHY_INTERFACE_ZERO_WORKS = 1 +} PHY_INTERFACE_SELECT, *PPHY_INTERFACE_SELECT; + +typedef enum _GMAC_MSR_FORCE_SPEED_ { + FORCE_SPD_100M = 0, + FORCE_SPD_10M = 1, + FORCE_SPD_GIGA = 2, + NO_FORCE_SPD = 3 +}GMAC_MSR_FORCE_SPEED, *PGMAC_MSR_FORCE_SPEED; + +// typedef enum _GMAC_INTERRUPT_MASK_ { +// GMAC_IMR_ROK = BIT0, +// GMAC_IMR_CNT_WRAP = BIT1, +// GMAC_IMR_RER_RUNT = BIT2, +// // BIT3 Reserved +// GMAC_IMR_RER_OVF = BIT4, +// GMAC_IMR_RDU = BIT5, +// GMAC_IMR_TOK_TI = BIT6, +// GMAC_IMR_TER = BIT7, +// GMAC_IMR_LINKCHG = BIT8, +// GMAC_IMR_TDU = BIT9, +// GMAC_IMR_SWINT = BIT10, +// GMAC_IMR_RDU2 = BIT11, +// GMAC_IMR_RDU3 = BIT12, +// GMAC_IMR_RDU4 = BIT13, +// GMAC_IMR_RDU5 = BIT14, +// GMAC_IMR_RDU6 = BIT15, +// } GMAC_INTERRUPT_MASK, *PGMAC_INTERRUPT_MASK; + +typedef enum _GMAC_INTERRUPT_MASK_ { + GMAC_IMR_ROK = BIT16, + GMAC_IMR_CNT_WRAP = BIT17, + GMAC_IMR_RER_RUNT = BIT18, + // BIT19 Reserved + GMAC_IMR_RER_OVF = BIT20, + GMAC_IMR_RDU = BIT21, + GMAC_IMR_TOK_TI = BIT22, + GMAC_IMR_TER = BIT23, + GMAC_IMR_LINKCHG = BIT24, + GMAC_IMR_TDU = BIT25, + GMAC_IMR_SWINT = BIT26, + GMAC_IMR_RDU2 = BIT27, + GMAC_IMR_RDU3 = BIT28, + GMAC_IMR_RDU4 = BIT29, + GMAC_IMR_RDU5 = BIT30, + GMAC_IMR_RDU6 = BIT31, +} GMAC_INTERRUPT_MASK, *PGMAC_INTERRUPT_MASK; + +typedef enum _GMAC_INTERRUPT_STATUS_ { + GMAC_ISR_ROK = BIT0, + GMAC_ISR_CNT_WRAP = BIT1, + GMAC_ISR_RER_RUNT = BIT2, + // BIT3 Reserved + GMAC_ISR_RER_OVF = BIT4, + GMAC_ISR_RDU = BIT5, + GMAC_ISR_TOK_TI = BIT6, + GMAC_ISR_TER = BIT7, + GMAC_ISR_LINKCHG = BIT8, + GMAC_ISR_TDU = BIT9, + GMAC_ISR_SWINT = BIT10, + GMAC_ISR_RDU2 = BIT11, + GMAC_ISR_RDU3 = BIT12, + GMAC_ISR_RDU4 = BIT13, + GMAC_ISR_RDU5 = BIT14, + GMAC_ISR_RDU6 = BIT15, +} GMAC_INTERRUPT_STATUS, *PGMAC_INTERRUPT_STATUS; + +typedef enum _GMAC_TX_VLAN_ACTION_ { + INTACT = 0, + INSERT_VLAN_HDR = 1, + REMOVE_VLAN_HDR = 2, + REMARKING_VID = 3 +}GMAC_TX_VLAN_ACTION, *PGMAC_TX_VLAN_ACTION; + +typedef enum _GMAC_RX_PACKET_TYPE_ { + TYPE_ETHERNET = 0, + TYPE_IPV4 = 1, + TYPE_IPV4_PPTP = 2, + TYPE_IPV4_ICMP = 3, + TYPE_IPV4_IGMP = 4, + TYPE_IPV4_TCP = 5, + TYPE_IPV4_UDP = 6, + TYPE_IPV6 = 7, + TYPE_ICMPV6 = 8, + TYPE_IPV6_TCP = 9, + TYPE_IPV6_UDP = 10 +}GMAC_RX_PACKET_TYPE, *PGMAC_RX_PACKET_TYPE; + + +/* + +// Memory Map of DW_apb_ssi +#define REG_DW_SSI_CTRLR0 0x00 // 16 bits +#define REG_DW_SSI_CTRLR1 0x04 // 16 bits +#define REG_DW_SSI_SSIENR 0x08 // 1 bit +#define REG_DW_SSI_RX_SAMPLE_DLY 0xF0 // 8 bits +#define REG_DW_SSI_RSVD_0 0xF4 // 32 bits +#define REG_DW_SSI_RSVD_1 0xF8 // 32 bits +#define REG_DW_SSI_RSVD_2 0xFC // 32 bits + +// CTRLR0 0x00 // 16 bits, 6.2.1 +// DFS Reset Value: 0x7 +#define BIT_SHIFT_CTRLR0_DFS 0 +#define BIT_MASK_CTRLR0_DFS 0xF +#define BIT_CTRLR0_DFS(x)(((x) & BIT_MASK_CTRLR0_DFS) << BIT_SHIFT_CTRLR0_DFS) +#define BIT_INVC_CTRLR0_DFS (~(BIT_MASK_CTRLR0_DFS << BIT_SHIFT_CTRLR0_DFS)) + +#define BIT_SHIFT_CTRLR0_FRF 4 +#define BIT_MASK_CTRLR0_FRF 0x3 +#define BIT_CTRLR0_FRF(x)(((x) & BIT_MASK_CTRLR0_FRF) << BIT_SHIFT_CTRLR0_FRF) +#define BIT_INVC_CTRLR0_FRF (~(BIT_MASK_CTRLR0_FRF << BIT_SHIFT_CTRLR0_FRF)) + +#define BIT_SHIFT_CTRLR0_SCPH 6 +#define BIT_MASK_CTRLR0_SCPH 0x1 +#define BIT_CTRLR0_SCPH(x)(((x) & BIT_MASK_CTRLR0_SCPH) << BIT_SHIFT_CTRLR0_SCPH) +#define BIT_INVC_CTRLR0_SCPH (~(BIT_MASK_CTRLR0_SCPH << BIT_SHIFT_CTRLR0_SCPH)) + +// CTRLR1 0x04 // 16 bits +#define BIT_SHIFT_CTRLR1_NDF 0 +#define BIT_MASK_CTRLR1_NDF 0xFFFF +#define BIT_CTRLR1_NDF(x)(((x) & BIT_MASK_CTRLR1_NDF) << BIT_SHIFT_CTRLR1_NDF) +#define BIT_INVC_CTRLR1_NDF (~(BIT_MASK_CTRLR1_NDF << BIT_SHIFT_CTRLR1_NDF)) + +// TXFLTR 0x18 // Variable Length +#define BIT_SHIFT_TXFTLR_TFT 0 +#define BIT_MASK_TXFTLR_TFT 0x3F // (TX_ABW-1):0 +#define BIT_TXFTLR_TFT(x)(((x) & BIT_MASK_TXFTLR_TFT) << BIT_SHIFT_TXFTLR_TFT) +#define BIT_INVC_TXFTLR_TFT (~(BIT_MASK_TXFTLR_TFT << BIT_SHIFT_TXFTLR_TFT)) + +// TXFLR 0x20 // see [READ ONLY] +#define BIT_MASK_TXFLR_TXTFL 0x7F // (TX_ABW):0 + +// RXFLR 0x24 // see [READ ONLY] +#define BIT_MASK_RXFLR_RXTFL 0x7F // (RX_ABW):0 + +// SR 0x28 // 7 bits [READ ONLY] +#define BIT_SR_BUSY BIT0 +#define BIT_SR_TFNF BIT1 +#define BIT_SR_TFE BIT2 +#define BIT_SR_RFNE BIT3 +#define BIT_SR_RFF BIT4 +#define BIT_SR_TXE BIT5 +#define BIT_SR_DCOL BIT6 + +#define BIT_IMR_TXEIM BIT0 +#define BIT_IMR_TXOIM BIT1 +#define BIT_IMR_RXUIM BIT2 +#define BIT_IMR_RXOIM BIT3 +#define BIT_IMR_RXFIM BIT4 +#define BIT_IMR_MSTIM BIT5 + +// ISR 0x30 // 6 bits [READ ONLY] +#define BIT_ISR_TXEIS BIT0 +#define BIT_ISR_TXOIS BIT1 +#define BIT_ISR_RXUIS BIT2 +#define BIT_ISR_RXOIS BIT3 +#define BIT_ISR_RXFIS BIT4 +#define BIT_ISR_MSTIS BIT5 + +*/ + +BOOL +HalMiiGmacInitRtl8195a( + IN VOID *Data + ); + +BOOL +HalMiiInitRtl8195a( + IN VOID *Data + ); + +BOOL +HalMiiGmacResetRtl8195a( + IN VOID *Data + ); + +BOOL +HalMiiGmacEnablePhyModeRtl8195a( + IN VOID *Data + ); + +u32 +HalMiiGmacXmitRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacCleanTxRingRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacFillTxInfoRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacFillRxInfoRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacTxRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacRxRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacSetDefaultEthIoCmdRtl8195a( + IN VOID *Data + ); + +VOID +HalMiiGmacInitIrqRtl8195a( + IN VOID *Data + ); + +u32 +HalMiiGmacGetInterruptStatusRtl8195a( + VOID + ); + +VOID +HalMiiGmacClearInterruptStatusRtl8195a( + u32 IsrStatus + ); + +#endif + diff --git a/lib/fwlib/rtl8195a/rtl8195a_nfc.h b/lib/fwlib/rtl8195a/rtl8195a_nfc.h new file mode 100644 index 0000000..a1c12b6 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_nfc.h @@ -0,0 +1,153 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_NFC_H_ +#define _RTL8195A_NFC_H_ + +#include "hal_api.h" +//#include "osdep_api.h" +#ifdef CONFIG_NFC_VERIFY +#include "../test/nfc/rtl8195a_nfc_test.h" +#endif + +#if CONFIG_NFC_NORMAL +//===================== Register Bit Field Definition ===================== +// TODO: +//===================== Register Address Definition ===================== +//TODO: +//#include "osdep_api.h" +#define N2A_Q_LENGTH 10 +#define N2ARLENGTH 4 +//#define NFCTAGLENGTH 36 // maximum 36*4=144 bytes +#define NFCTAG_BASE 0x7F000 +#define NFCTAG_PAGESIZE 256 +#define NFCTAG_MAXPAGEIDX 16//(4*(1024/NFCTAG_PAGESIZE)) +#define A2NWCLENGTH 4 + +#define FLASHAPPLENGTH 31 +#define FLASHAPP_BASE 0x7E000 +#define FLASH_PAGESIZE 128 +#define FLASH_MAXPAGEIDX 32//(4*(1024/FLASH_PAGESIZE)) + +typedef struct _A2N_CATCH_W_ { + //u8 Vaild; + u8 A2NCatchRPage; + u32 A2NCatchWData[A2NWCLENGTH]; +}A2N_CATCH_W_QUEUE, *PA2N_CATCH_W_QUEUE; + +typedef struct _A2N_MAILBOX_Q_ { + u8 Length; + u8 Response; + u32 Content[A2NWCLENGTH+1]; +}A2N_MAILBOX_Q,*PA2N_MAILBOX_Q; + +typedef struct _N2A_CATCH_R_ { + u8 Vaild; + u8 N2ACatchRPage; + u32 N2ACatchRData[N2ARLENGTH]; +}N2A_CATCH_R_QUEUE, *PN2A_CATCH_R_QUEUE; + + +typedef struct _N2A_R_ { + u8 Vaild; + u8 N2ARPage; +}N2A_R_QUEUE, *PN2A_R_QUEUE; + +typedef struct _N2A_W_ { + u8 Vaild; + u8 N2AWPage; + u32 N2AWData; +}N2A_W_QUEUE, *PN2A_W_QUEUE; + +typedef struct _NFC_ADAPTER_ { + u8 Function; + u32 NFCIsr; + u8 N2ABoxOpen; + u8 A2NSeq; + //u8 NFCTagFlashWIdx; + //u8 NFCTagFlashRIdx; +// u32 NFCTag[NFCTAGLENGTH]; +#if !TASK_SCHEDULER_DISABLED + void * VeriSema; +#else + u32 VeriSema; +#endif +#ifdef PLATFORM_FREERTOS + void * NFCTask; +#else + u32 NFCTask; +#endif +#ifdef CONFIG_NFC_VERIFY + //N2A Write Tag + u8 N2AWQRIdx; + u8 N2AWQWIdx; + N2A_W_QUEUE N2AWQ[N2A_Q_LENGTH]; + //N2A Read Tag + u8 N2ARQRIdx; + u8 N2ARQWIdx; + N2A_R_QUEUE N2ARQ[N2A_Q_LENGTH]; + //N2A Read Catch + u8 N2ARCRIdx; + u8 N2ARCWIdx; + N2A_CATCH_R_QUEUE N2ACatchR[N2A_Q_LENGTH]; +#endif + //A2N Write Catch + //u8 A2NWCRIdx; + //u8 A2NWCWIdx; + //A2N_CATCH_W_QUEUE A2NCatchW[N2A_Q_LENGTH]; + + //A2N Write mailbox queue + u8 A2NWMailBox; + u8 A2NWQRIdx; + u8 A2NWQWIdx; + A2N_MAILBOX_Q A2NMAILQ[N2A_Q_LENGTH]; + + u8 TaskStop; + void *nfc_obj; +}NFC_ADAPTER, *PNFC_ADAPTER; + +typedef enum _N2A_CMD_ { + TAG_READ = 0, + TAG_WRITE = 1, + CATCH_READ_DATA = 2, + NFC_R_PRESENT = 4, + N2A_MAILBOX_STATE = 5, + EXT_CLK_REQ = 6, + MAX_N2ACMD +} N2A_CMD, *PN2A_CMD; + +typedef enum _A2N_CMD_ { + TAG_READ_DATA = 0, + CATCH_READ = 2, + CATCH_WRITE = 3, + A2N_MAILBOX_STATE = 4, + CONFIRM_N2A_BOX_STATE = 5, + EXT_CLK_RSP = 6, + MAX_A2NCMD +} A2N_CMD, *PA2N_CMD; + +// Callback event defination +typedef enum _NFC_HAL_EVENT_ { + NFC_HAL_READER_PRESENT = (1<<0), + NFC_HAL_READ = (1<<1), + NFC_HAL_WRITE = (1<<2), + NFC_HAL_ERR = (1<<3), + NFC_HAL_CACHE_RD = (1<<4) +}NFC_CB_EVENT, *PNFC_CB_EVENT; + +VOID A2NWriteCatch(IN VOID *pNFCAdapte, IN u8 N2AWPage, + IN u8 Length, IN u32 *WData); +VOID A2NReadCatch(IN VOID *pNFCAdapte, IN u8 A2NRPage); +VOID HalNFCDmemInit(IN u32 *pTagData, IN u32 TagLen); +VOID HalNFCInit(PNFC_ADAPTER pNFCAdp); +VOID HalNFCDeinit(PNFC_ADAPTER pNFCAdp); +VOID HalNFCFwDownload(VOID); +#endif //CONFIG_NFC_NORMAL +#endif // #ifndef _RTL8195A_NFC_H_ \ No newline at end of file diff --git a/lib/fwlib/rtl8195a/rtl8195a_pcm.h b/lib/fwlib/rtl8195a/rtl8195a_pcm.h new file mode 100644 index 0000000..c2bd793 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_pcm.h @@ -0,0 +1,449 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_PCM_H_ +#define _RTL8195A_PCM_H_ + +#include "basic_types.h" +#include "hal_api.h" + +#define HAL_PCMX_READ32(PcmIndex, addr) \ + HAL_READ32(PCM0_REG_BASE+ (PcmIndex*PCM1_REG_OFF), addr) +#define HAL_PCMX_WRITE32(PcmIndex, addr, value) \ + HAL_WRITE32((PCM0_REG_BASE+ (PcmIndex*PCM1_REG_OFF)), addr, value) + +#define REG_PCM_TRXBSA_OFF 0x004 +#define REG_PCM_CTL 0x000 +#define REG_PCM_CHCNR03 0x004 +#define REG_PCM_TSR03 0x008 +#define REG_PCM_BSIZE03 0x00C + +#define REG_PCM_CH0TXBSA 0x010 +#define REG_PCM_CH1TXBSA 0x014 +#define REG_PCM_CH2TXBSA 0x018 +#define REG_PCM_CH3TXBSA 0x01c +#define REG_PCM_CH0RXBSA 0x020 +#define REG_PCM_CH1RXBSA 0x024 +#define REG_PCM_CH2RXBSA 0x028 +#define REG_PCM_CH3RXBSA 0x02c + +#define REG_PCM_IMR03 0x030 +#define REG_PCM_ISR03 0x034 + +#define REG_PCM_CHCNR47 0x038 +#define REG_PCM_TSR47 0x03c +#define REG_PCM_BSIZE47 0x040 +#define REG_PCM_CH4TXBSA 0x044 +#define REG_PCM_CH5TXBSA 0x048 +#define REG_PCM_CH6TXBSA 0x04c +#define REG_PCM_CH7TXBSA 0x050 +#define REG_PCM_CH4RXBSA 0x054 +#define REG_PCM_CH5RXBSA 0x058 +#define REG_PCM_CH6RXBSA 0x05c +#define REG_PCM_CH7RXBSA 0x060 + +#define REG_PCM_IMR47 0x064 +#define REG_PCM_ISR47 0x068 + +#define REG_PCM_CHCNR811 0x06c +#define REG_PCM_TSR811 0x070 +#define REG_PCM_BSIZE811 0x074 +#define REG_PCM_CH8TXBSA 0x078 +#define REG_PCM_CH9TXBSA 0x07c +#define REG_PCM_CH10TXBSA 0x080 +#define REG_PCM_CH11TXBSA 0x084 +#define REG_PCM_CH8RXBSA 0x088 +#define REG_PCM_CH9RXBSA 0x08c +#define REG_PCM_CH10RXBSA 0x090 +#define REG_PCM_CH11RXBSA 0x094 + +#define REG_PCM_IMR811 0x098 +#define REG_PCM_ISR811 0x09c + +#define REG_PCM_CHCNR1215 0x0a0 +#define REG_PCM_TSR1215 0x0a4 +#define REG_PCM_BSIZE1215 0x0a8 +#define REG_PCM_CH12TXBSA 0x0ac +#define REG_PCM_CH13TXBSA 0x0b0 +#define REG_PCM_CH14TXBSA 0x0b4 +#define REG_PCM_CH15TXBSA 0x0b8 +#define REG_PCM_CH12RXBSA 0x0bc +#define REG_PCM_CH13RXBSA 0x0c0 +#define REG_PCM_CH14RXBSA 0x0c4 +#define REG_PCM_CH15RXBSA 0x0c8 + +#define REG_PCM_IMR1215 0x0cc +#define REG_PCM_ISR1215 0x0d0 + +#define REG_PCM_INTMAP 0x0d4 +#define REG_PCM_WTSR03 0x0d8 +#define REG_PCM_WTSR47 0x0dc + +#define REG_PCM_RX_BUFOW 0x0e0 + +/* template +#define BIT_SHIFT_CTLX_ 7 +#define BIT_MASK_CTLX_ 0x1 +#define BIT_CTLX_(x) (((x) & BIT_MASK_CTLX_) << BIT_SHIFT_CTLX_) +#define BIT_INV_CTLX_ (~(BIT_MASK_CTLX_ << BIT_SHIFT_CTLX_)) +*/ +#define BIT_SHIFT_CTLX_SLAVE_SEL 8 +#define BIT_MASK_CTLX_SLAVE_SEL 0x1 +#define BIT_CTLX_SLAVE_SEL(x) (((x) & BIT_MASK_CTLX_SLAVE_SEL) << BIT_SHIFT_CTLX_SLAVE_SEL) +#define BIT_INV_CTLX_SLAVE_SEL (~(BIT_MASK_CTLX_SLAVE_SEL << BIT_SHIFT_CTLX_SLAVE_SEL)) + +#define BIT_SHIFT_CTLX_FSINV 9 +#define BIT_MASK_CTLX_FSINV 0x1 +#define BIT_CTLX_FSINV(x) (((x) & BIT_MASK_CTLX_FSINV) << BIT_SHIFT_CTLX_FSINV) +#define BIT_INV_CTLX_FSINV (~(BIT_MASK_CTLX_FSINV << BIT_SHIFT_CTLX_FSINV)) + +#define BIT_SHIFT_CTLX_PCM_EN 12 +#define BIT_MASK_CTLX_PCM_EN 0x1 +#define BIT_CTLX_PCM_EN(x) (((x) & BIT_MASK_CTLX_PCM_EN) << BIT_SHIFT_CTLX_PCM_EN) +#define BIT_INV_CTLX_PCM_EN (~(BIT_MASK_CTLX_PCM_EN << BIT_SHIFT_CTLX_PCM_EN)) + +#define BIT_SHIFT_CTLX_LINEARMODE 13 +#define BIT_MASK_CTLX_LINEARMODE 0x1 +#define BIT_CTLX_LINEARMODE(x) (((x) & BIT_MASK_CTLX_LINEARMODE) << BIT_SHIFT_CTLX_LINEARMODE) +#define BIT_INV_CTLX_LINEARMODE (~(BIT_MASK_CTLX_LINEARMODE << BIT_SHIFT_CTLX_LINEARMODE)) + +#define BIT_SHIFT_CTLX_LOOP_BACK 14 +#define BIT_MASK_CTLX_LOOP_BACK 0x1 +#define BIT_CTLX_LOOP_BACK(x) (((x) & BIT_MASK_CTLX_LOOP_BACK) << BIT_SHIFT_CTLX_LOOP_BACK) +#define BIT_INV_CTLX_LOOP_BACK (~(BIT_MASK_CTLX_LOOP_BACK << BIT_SHIFT_CTLX_LOOP_BACK)) + +#define BIT_SHIFT_CTLX_ENDIAN_SWAP 17 +#define BIT_MASK_CTLX_ENDIAN_SWAP 0x1 +#define BIT_CTLX_ENDIAN_SWAP(x) (((x) & BIT_MASK_CTLX_ENDIAN_SWAP) << BIT_SHIFT_CTLX_ENDIAN_SWAP) +#define BIT_INV_CTLX_ENDIAN_SWAP (~(BIT_MASK_CTLX_ENDIAN_SWAP << BIT_SHIFT_CTLX_ENDIAN_SWAP)) + +#define BIT_SHIFT_CHCNR03_CH0RE 24 +#define BIT_MASK_CHCNR03_CH0RE 0x1 +#define BIT_CHCNR03_CH0RE(x) (((x) & BIT_MASK_CHCNR03_CH0RE) << BIT_SHIFT_CHCNR03_CH0RE) +#define BIT_INV_CHCNR03_CH0RE (~(BIT_MASK_CHCNR03_CH0RE << BIT_SHIFT_CHCNR03_CH0RE)) + +#define BIT_SHIFT_CHCNR03_CH0TE 25 +#define BIT_MASK_CHCNR03_CH0TE 0x1 +#define BIT_CHCNR03_CH0TE(x) (((x) & BIT_MASK_CHCNR03_CH0TE) << BIT_SHIFT_CHCNR03_CH0TE) +#define BIT_INV_CHCNR03_CH0TE (~(BIT_MASK_CHCNR03_CH0TE << BIT_SHIFT_CHCNR03_CH0TE)) + +#define BIT_SHIFT_CHCNR03_CH1RE 16 +#define BIT_MASK_CHCNR03_CH1RE 0x1 +#define BIT_CHCNR03_CH1RE(x) (((x) & BIT_MASK_CHCNR03_CH1RE) << BIT_SHIFT_CHCNR03_CH1RE) +#define BIT_INV_CHCNR03_CH1RE (~(BIT_MASK_CHCNR03_CH1RE << BIT_SHIFT_CHCNR03_CH1RE)) + +#define BIT_SHIFT_CHCNR03_CH1TE 17 +#define BIT_MASK_CHCNR03_CH1TE 0x1 +#define BIT_CHCNR03_CH1TE(x) (((x) & BIT_MASK_CHCNR03_CH1TE) << BIT_SHIFT_CHCNR03_CH1TE) +#define BIT_INV_CHCNR03_CH1TE (~(BIT_MASK_CHCNR03_CH1TE << BIT_SHIFT_CHCNR03_CH1TE)) + +#define BIT_SHIFT_CHCNR03_CH2RE 8 +#define BIT_MASK_CHCNR03_CH2RE 0x1 +#define BIT_CHCNR03_CH2RE(x) (((x) & BIT_MASK_CHCNR03_CH2RE) << BIT_SHIFT_CHCNR03_CH2RE) +#define BIT_INV_CHCNR03_CH2RE (~(BIT_MASK_CHCNR03_CH2RE << BIT_SHIFT_CHCNR03_CH2RE)) + +#define BIT_SHIFT_CHCNR03_CH2TE 9 +#define BIT_MASK_CHCNR03_CH2TE 0x1 +#define BIT_CHCNR03_CH2TE(x) (((x) & BIT_MASK_CHCNR03_CH2TE) << BIT_SHIFT_CHCNR03_CH2TE) +#define BIT_INV_CHCNR03_CH2TE (~(BIT_MASK_CHCNR03_CH2TE << BIT_SHIFT_CHCNR03_CH2TE)) + +#define BIT_SHIFT_CHCNR03_CH3RE 0 +#define BIT_MASK_CHCNR03_CH3RE 0x1 +#define BIT_CHCNR03_CH3RE(x) (((x) & BIT_MASK_CHCNR03_CH3RE) << BIT_SHIFT_CHCNR03_CH3RE) +#define BIT_INV_CHCNR03_CH3RE (~(BIT_MASK_CHCNR03_CH3RE << BIT_SHIFT_CHCNR03_CH3RE)) + +#define BIT_SHIFT_CHCNR03_CH3TE 1 +#define BIT_MASK_CHCNR03_CH3TE 0x1 +#define BIT_CHCNR03_CH3TE(x) (((x) & BIT_MASK_CHCNR03_CH3TE) << BIT_SHIFT_CHCNR03_CH3TE) +#define BIT_INV_CHCNR03_CH3TE (~(BIT_MASK_CHCNR03_CH3TE << BIT_SHIFT_CHCNR03_CH3TE)) + +#define BIT_SHIFT_CHCNR03_CH0MUA 26 +#define BIT_MASK_CHCNR03_CH0MUA 0x1 +#define BIT_CHCNR03_CH0MUA(x) (((x) & BIT_MASK_CHCNR03_CH0MUA) << BIT_SHIFT_CHCNR03_CH0MUA) +#define BIT_INV_CHCNR03_CH0MUA (~(BIT_MASK_CHCNR03_CH0MUA << BIT_SHIFT_CHCNR03_CH0MUA)) + +#define BIT_SHIFT_CHCNR03_CH0BAND 27 +#define BIT_MASK_CHCNR03_CH0BAND 0x1 +#define BIT_CHCNR03_CH0BAND(x) (((x) & BIT_MASK_CHCNR03_CH0BAND) << BIT_SHIFT_CHCNR03_CH0BAND) +#define BIT_INV_CHCNR03_CH0BAND (~(BIT_MASK_CHCNR03_CH0BAND << BIT_SHIFT_CHCNR03_CH0BAND)) + +#define BIT_SHIFT_TSR03_CH0TSA 24 +#define BIT_MASK_TSR03_CH0TSA 0x1F +#define BIT_TSR03_CH0TSA(x) (((x) & BIT_MASK_TSR03_CH0TSA) << BIT_SHIFT_TSR03_CH0TSA) +#define BIT_INV_TSR03_CH0TSA (~(BIT_MASK_TSR03_CH0TSA << BIT_SHIFT_TSR03_CH0TSA)) + +#define BIT_SHIFT_BSIZE03_CH0BSIZE 24 +#define BIT_MASK_BSIZE03_CH0BSIZE 0xFF +#define BIT_BSIZE03_CH0BSIZE(x) (((x) & BIT_MASK_BSIZE03_CH0BSIZE) << BIT_SHIFT_BSIZE03_CH0BSIZE) +#define BIT_INV_BSIZE03_CH0BSIZE (~(BIT_MASK_BSIZE03_CH0BSIZE << BIT_SHIFT_BSIZE03_CH0BSIZE)) + +typedef struct _PCM_CTL_REG_ { + u32 FCNT :8; // Bit 0-7 + u32 SlaveMode :1; // Bit 8 + u32 FsInv :1; // Bit 9 + u32 Rsvd10to11 :1; // Bit 10-11 + u32 Pcm_En :1; // Bit 12 + u32 LinearMode :1; // Bit 13 + u32 LoopBack :1; // Bit 14 + u32 Rsvd15to16 :2; // Bit 15-16 + u32 EndianSwap :1; // Bit 17 + u32 Rsvd18to31 :14; // Bit 18-31 +} PCM_CTL_REG, *PPCM_CTL_REG; + + + +typedef struct _PCM_CHCNR03_REG_ { + u32 CH3RE :1; // Bit 0 + u32 CH3TE :1; // Bit 1 + u32 CH3MuA :1; // Bit 2 + u32 CH3Band :1; // Bit 3 + u32 CH3SlicSel:4; // Bit 4-7 + u32 CH2RE :1; // Bit 8 + u32 CH2TE :1; // Bit 9 + u32 CH2MuA :1; // Bit 10 + u32 CH2Band :1; // Bit 11 + u32 CH2SlicSel:4; // Bit 12-15 + u32 CH1RE :1; // Bit 16 + u32 CH1TE :1; // Bit 17 + u32 CH1MuA :1; // Bit 18 + u32 CH1Band :1; // Bit 19 + u32 CH1SlicSel:4; // Bit 20-23 + u32 CH0RE :1; // Bit 24 + u32 CH0TE :1; // Bit 25 + u32 CH0MuA :1; // Bit 26 + u32 CH0Band :1; // Bit 27 + u32 CH0SlicSel:4; // Bit 28-31 +}PCM_CHCNR03_REG, *PPCM_CHCNR03_REG; + +typedef struct _PCM_TSR03_REG_ { + u32 CH3TSA :5; // Bit 0-4 + u32 Rsvd5to7 :3; // Bit 5-7 + u32 CH2TSA :5; // Bit 8-12 + u32 Rsvd13to15:3; // Bit 13-15 + u32 CH1TSA :5; // Bit 16-20 + u32 Rsvd21to23:3; // Bit 21-23 + u32 CH0TSA :5; // Bit 24-28 + u32 Rsvd29to31:3; // Bit 29-31 +}PCM_TSR03_REG, *PPCM_TSR03_REG; + +typedef struct _PCM_BSIZE03_REG_ { + u32 CH3BSize :8; // Bit 0-7 + u32 CH2BSize :8; // Bit 8-15 + u32 CH1BSize :8; // Bit 16-23 + u32 CH0BSize :8; // Bit 24-31 +}PCM_BSIZE03_REG, *PPCM_BSIZE03_REG; + +typedef struct _PCM_ISR03_REG_ { + u32 CH3RXP1UA :1; // Bit 0 + u32 CH3RXP0UA :1; // Bit 1 + u32 CH3TXP1UA :1; // Bit 2 + u32 CH3TXP0UA :1; // Bit 3 + u32 CH3RXP1IP :1; // Bit 4 + u32 CH3RXP0IP :1; // Bit 5 + u32 CH3TXP1IP :1; // Bit 6 + u32 CH3TXP0IP :1; // Bit 7 + u32 CH2RXP1UA :1; // Bit 8 + u32 CH2RXP0UA :1; // Bit 9 + u32 CH2TXP1UA :1; // Bit 10 + u32 CH2TXP0UA :1; // Bit 11 + u32 CH2RXP1IP :1; // Bit 12 + u32 CH2RXP0IP :1; // Bit 13 + u32 CH2TXP1IP :1; // Bit 14 + u32 CH2TXP0IP :1; // Bit 15 + u32 CH1RXP1UA :1; // Bit 16 + u32 CH1RXP0UA :1; // Bit 17 + u32 CH1TXP1UA :1; // Bit 18 + u32 CH1TXP0UA :1; // Bit 19 + u32 CH1RXP1IP :1; // Bit 20 + u32 CH1RXP0IP :1; // Bit 21 + u32 CH1TXP1IP :1; // Bit 22 + u32 CH1TXP0IP :1; // Bit 23 + u32 CH0RXP1UA :1; // Bit 24 + u32 CH0RXP0UA :1; // Bit 25 + u32 CH0TXP1UA :1; // Bit 26 + u32 CH0TXP0UA :1; // Bit 27 + u32 CH0RXP1IP :1; // Bit 28 + u32 CH0RXP0IP :1; // Bit 29 + u32 CH0TXP1IP :1; // Bit 30 + u32 CH0TXP0IP :1; // Bit 31 +}PCM_ISR03_REG, *PPCM_ISR03_REG; + +typedef enum _PCM_ISR015 { + PcmCh3P1RBU = 0x00000001, //ch0-3 + PcmCh3P0RBU = 0x00000002, + PcmCh3P1TBU = 0x00000004, + PcmCh3P0TBU = 0x00000008, + PcmCh3P1ROK = 0x00000010, + PcmCh3P0ROK = 0x00000020, + PcmCh3P1TOK = 0x00000040, + PcmCh3P0TOK = 0x00000080, + PcmCh2P1RBU = 0x00000100, + PcmCh2P0RBU = 0x00000200, + PcmCh2P1TBU = 0x00000400, + PcmCh2P0TBU = 0x00000800, + PcmCh2P1ROK = 0x00001000, + PcmCh2P0ROK = 0x00002000, + PcmCh2P1TOK = 0x00004000, + PcmCh2P0TOK = 0x00008000, + PcmCh1P1RBU = 0x00010000, + PcmCh1P0RBU = 0x00020000, + PcmCh1P1TBU = 0x00040000, + PcmCh1P0TBU = 0x00080000, + PcmCh1P1ROK = 0x00100000, + PcmCh1P0ROK = 0x00200000, + PcmCh1P1TOK = 0x00400000, + PcmCh1P0TOK = 0x00800000, + PcmCh0P1RBU = 0x01000000, + PcmCh0P0RBU = 0x02000000, + PcmCh0P1TBU = 0x04000000, + PcmCh0P0TBU = 0x08000000, + PcmCh0P1ROK = 0x10000000, + PcmCh0P0ROK = 0x20000000, + PcmCh0P1TOK = 0x40000000, + PcmCh0P0TOK = 0x80000000, + + PcmCh7P1RBU = 0x00000001, //ch4-7 + PcmCh7P0RBU = 0x00000002, + PcmCh7P1TBU = 0x00000004, + PcmCh7P0TBU = 0x00000008, + PcmCh7P1ROK = 0x00000010, + PcmCh7P0ROK = 0x00000020, + PcmCh7P1TOK = 0x00000040, + PcmCh7P0TOK = 0x00000080, + PcmCh6P1RBU = 0x00000100, + PcmCh6P0RBU = 0x00000200, + PcmCh6P1TBU = 0x00000400, + PcmCh6P0TBU = 0x00000800, + PcmCh6P1ROK = 0x00001000, + PcmCh6P0ROK = 0x00002000, + PcmCh6P1TOK = 0x00004000, + PcmCh6P0TOK = 0x00008000, + PcmCh5P1RBU = 0x00010000, + PcmCh5P0RBU = 0x00020000, + PcmCh5P1TBU = 0x00040000, + PcmCh5P0TBU = 0x00080000, + PcmCh5P1ROK = 0x00100000, + PcmCh5P0ROK = 0x00200000, + PcmCh5P1TOK = 0x00400000, + PcmCh5P0TOK = 0x00800000, + PcmCh4P1RBU = 0x01000000, + PcmCh4P0RBU = 0x02000000, + PcmCh4P1TBU = 0x04000000, + PcmCh4P0TBU = 0x08000000, + PcmCh4P1ROK = 0x10000000, + PcmCh4P0ROK = 0x20000000, + PcmCh4P1TOK = 0x40000000, + PcmCh4P0TOK = 0x80000000, + + PcmCh11P1RBU = 0x00000001, //ch8-11 + PcmCh11P0RBU = 0x00000002, + PcmCh11P1TBU = 0x00000004, + PcmCh11P0TBU = 0x00000008, + PcmCh11P1ROK = 0x00000010, + PcmCh11P0ROK = 0x00000020, + PcmCh11P1TOK = 0x00000040, + PcmCh11P0TOK = 0x00000080, + PcmCh10P1RBU = 0x00000100, + PcmCh10P0RBU = 0x00000200, + PcmCh10P1TBU = 0x00000400, + PcmCh10P0TBU = 0x00000800, + PcmCh10P1ROK = 0x00001000, + PcmCh10P0ROK = 0x00002000, + PcmCh10P1TOK = 0x00004000, + PcmCh10P0TOK = 0x00008000, + PcmCh9P1RBU = 0x00010000, + PcmCh9P0RBU = 0x00020000, + PcmCh9P1TBU = 0x00040000, + PcmCh9P0TBU = 0x00080000, + PcmCh9P1ROK = 0x00100000, + PcmCh9P0ROK = 0x00200000, + PcmCh9P1TOK = 0x00400000, + PcmCh9P0TOK = 0x00800000, + PcmCh8P1RBU = 0x01000000, + PcmCh8P0RBU = 0x02000000, + PcmCh8P1TBU = 0x04000000, + PcmCh8P0TBU = 0x08000000, + PcmCh8P1ROK = 0x10000000, + PcmCh8P0ROK = 0x20000000, + PcmCh8P1TOK = 0x40000000, + PcmCh8P0TOK = 0x80000000, + + PcmCh15P1RBU = 0x00000001, //ch12-15 + PcmCh15P0RBU = 0x00000002, + PcmCh15P1TBU = 0x00000004, + PcmCh15P0TBU = 0x00000008, + PcmCh15P1ROK = 0x00000010, + PcmCh15P0ROK = 0x00000020, + PcmCh15P1TOK = 0x00000040, + PcmCh15P0TOK = 0x00000080, + PcmCh14P1RBU = 0x00000100, + PcmCh14P0RBU = 0x00000200, + PcmCh14P1TBU = 0x00000400, + PcmCh14P0TBU = 0x00000800, + PcmCh14P1ROK = 0x00001000, + PcmCh14P0ROK = 0x00002000, + PcmCh14P1TOK = 0x00004000, + PcmCh14P0TOK = 0x00008000, + PcmCh13P1RBU = 0x00010000, + PcmCh13P0RBU = 0x00020000, + PcmCh13P1TBU = 0x00040000, + PcmCh13P0TBU = 0x00080000, + PcmCh13P1ROK = 0x00100000, + PcmCh13P0ROK = 0x00200000, + PcmCh13P1TOK = 0x00400000, + PcmCh13P0TOK = 0x00800000, + PcmCh12P1RBU = 0x01000000, + PcmCh12P0RBU = 0x02000000, + PcmCh12P1TBU = 0x04000000, + PcmCh12P0TBU = 0x08000000, + PcmCh12P1ROK = 0x10000000, + PcmCh12P0ROK = 0x20000000, + PcmCh12P1TOK = 0x40000000, + PcmCh12P0TOK = 0x80000000 +}PCM_ISR015, *PPCM_ISR015; + +VOID +HalPcmOnOffRtl8195a( + IN VOID *Data +); + +BOOL +HalPcmInitRtl8195a( + IN VOID *Data +); + +BOOL +HalPcmSettingRtl8195a( + IN VOID *Data +); + +BOOL +HalPcmEnRtl8195a( + IN VOID *Data +); + +BOOL +HalPcmIsrEnAndDisRtl8195a( + IN VOID *Data +); + +BOOL +HalPcmDumpRegRtl8195a( + IN VOID *Data +); + +BOOL +HalPcmRtl8195a( + IN VOID *Data +); + +#endif /* _RTL8195A_PCM_H_ */ + + diff --git a/lib/fwlib/rtl8195a/rtl8195a_peri_on.h b/lib/fwlib/rtl8195a/rtl8195a_peri_on.h new file mode 100644 index 0000000..da99b98 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_peri_on.h @@ -0,0 +1,1251 @@ +#ifndef __INC_RTL8195A_PERI_ON_H +#define __INC_RTL8195A_PERI_ON_H + +#define CPU_OPT_WIDTH 0x1F + +//2 REG_NOT_VALID + +//2 REG_PEON_PWR_CTRL +#define BIT_SOC_UAHV_EN BIT(2) +#define BIT_SOC_UALV_EN BIT(1) +#define BIT_SOC_USBD_EN BIT(0) + +//2 REG_PON_ISO_CTRL + +//2 REG_NOT_VALID +#define BIT_ISO_OSC32K_EN BIT(4) +//#define BIT_ISO_USBA_EN BIT(1) +//#define BIT_ISO_USBD_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SOC_FUNC_EN +#define BIT_SOC_SECURITY_ENGINE_EN BIT(20) +#define BIT_SOC_GTIMER_EN BIT(16) +#define BIT_SOC_GDMA1_EN BIT(14) +#define BIT_SOC_GDMA0_EN BIT(13) +#define BIT_SOC_LOG_UART_EN BIT(12) +#define BIT_SOC_CPU_EN BIT(8) +#define BIT_SOC_MEM_CTRL_EN BIT(6) +#define BIT_SOC_FLASH_EN BIT(4) +#define BIT_SOC_LXBUS_EN BIT(2) +#define BIT_SOC_OCP_EN BIT(1) +#define BiT_SOC_FUN_EN BIT(0) + +//2 REG_SOC_HCI_COM_FUNC_EN +#define BIT_SOC_HCI_WL_MACON_EN BIT(16) +#define BIT_SOC_HCI_SM_SEL BIT(13) +#define BIT_SOC_HCI_MII_EN BIT(12) +#define BIT_SOC_HCI_OTG_RST_MUX BIT(5) +#define BIT_SOC_HCI_OTG_EN BIT(4) +#define BIT_SOC_HCI_SDIOD_ON_RST_MUX BIT(3) +#define BIT_SOC_HCI_SDIOH_EN BIT(2) +#define BIT_SOC_HCI_SDIOD_OFF_EN BIT(1) +#define BIT_SOC_HCI_SDIOD_ON_EN BIT(0) + +//2 REG_SOC_PERI_FUNC0_EN +#define BIT_PERI_PCM1_EN BIT(29) +#define BIT_PERI_PCM0_EN BIT(28) +#define BIT_PERI_I2S1_EN BIT(25) +#define BIT_PERI_I2S0_EN BIT(24) +#define BIT_PERI_I2C3_EN BIT(19) +#define BIT_PERI_I2C2_EN BIT(18) +#define BIT_PERI_I2C1_EN BIT(17) +#define BIT_PERI_I2C0_EN BIT(16) +#define BIT_PERI_SPI2_EN BIT(10) +#define BIT_PERI_SPI1_EN BIT(9) +#define BIT_PERI_SPI0_EN BIT(8) +#define BIT_PERI_UART2_EN BIT(2) +#define BIT_PERI_UART1_EN BIT(1) +#define BIT_PERI_UART0_EN BIT(0) + +//2 REG_SOC_PERI_FUNC1_EN +#define BIT_PERI_GPIO_EN BIT(8) +#define BIT_PERI_DAC1_EN BIT(5) +#define BIT_PERI_DAC0_EN BIT(4) +#define BIT_PERI_ADC0_EN BIT(0) + +//2 REG_SOC_PERI_BD_FUNC0_EN +#define BIT_PERI_UART2_BD_EN BIT(2) +#define BIT_PERI_UART1_BD_EN BIT(1) +#define BIT_PERI_UART0_BD_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_PESOC_CLK_CTRL +#define BIT_SOC_SLPCK_BTCMD_EN BIT(29) +#define BIT_SOC_ACTCK_BTCMD_EN BIT(28) +#define BIT_SOC_SLPCK_GPIO_EN BIT(25) +#define BIT_SOC_ACTCK_GPIO_EN BIT(24) +#define BIT_SOC_SLPCK_GDMA1_EN BIT(19) +#define BIT_SOC_ACTCK_GDMA1_EN BIT(18) +#define BIT_SOC_SLPCK_GDMA0_EN BIT(17) +#define BIT_SOC_ACTCK_GDMA0_EN BIT(16) +#define BIT_SOC_SLPCK_TIMER_EN BIT(15) +#define BIT_SOC_ACTCK_TIMER_EN BIT(14) +#define BIT_SOC_SLPCK_LOG_UART_EN BIT(13) +#define BIT_SOC_ACTCK_LOG_UART_EN BIT(12) +#define BIT_SOC_SLPCK_SDR_EN BIT(11) +#define BIT_SOC_ACTCK_SDR_EN BIT(10) +#define BIT_SOC_SLPCK_FLASH_EN BIT(9) +#define BIT_SOC_ACTCK_FLASH_EN BIT(8) +#define BIT_SOC_SLPCK_VENDOR_REG_EN BIT(7) +#define BIT_SOC_ACTCK_VENDOR_REG_EN BIT(6) +#define BIT_SOC_SLPCK_TRACE_EN BIT(5) +#define BIT_SOC_ACTCK_TRACE_EN BIT(4) +#define BIT_SOC_CKE_PLFM BIT(2) +#define BIT_SOC_CKE_OCP BIT(0) + +//2 REG_PESOC_PERI_CLK_CTRL0 +#define BIT_SOC_SLPCK_SPI2_EN BIT(21) +#define BIT_SOC_ACTCK_SPI2_EN BIT(20) +#define BIT_SOC_SLPCK_SPI1_EN BIT(19) +#define BIT_SOC_ACTCK_SPI1_EN BIT(18) +#define BIT_SOC_SLPCK_SPI0_EN BIT(17) +#define BIT_SOC_ACTCK_SPI0_EN BIT(16) +#define BIT_SOC_SLPCK_UART2_EN BIT(5) +#define BIT_SOC_ACTCK_UART2_EN BIT(4) +#define BIT_SOC_SLPCK_UART1_EN BIT(3) +#define BIT_SOC_ACTCK_UART1_EN BIT(2) +#define BIT_SOC_SLPCK_UART0_EN BIT(1) +#define BIT_SOC_ACTCK_UART0_EN BIT(0) + +//2 REG_PESOC_PERI_CLK_CTRL1 +#define BIT_SOC_SLPCK_DAC_EN BIT(29) +#define BIT_SOC_ACTCK_DAC_EN BIT(28) +#define BIT_SOC_SLPCK_ADC_EN BIT(25) +#define BIT_SOC_ACTCK_ADC_EN BIT(24) +#define BIT_SOC_SLPCK_PCM_EN BIT(21) +#define BIT_SOC_ACTCK_PCM_EN BIT(20) +#define BIT_SOC_SLPCK_I2S_EN BIT(17) +#define BIT_SOC_ACTCK_I2S_EN BIT(16) +#define BIT_SOC_SLPCK_I2C3_EN BIT(7) +#define BIT_SOC_ACTCK_I2C3_EN BIT(6) +#define BIT_SOC_SLPCK_I2C2_EN BIT(5) +#define BIT_SOC_ACTCK_I2C2_EN BIT(4) +#define BIT_SOC_SLPCK_I2C1_EN BIT(3) +#define BIT_SOC_ACTCK_I2C1_EN BIT(2) +#define BIT_SOC_SLPCK_I2C0_EN BIT(1) +#define BIT_SOC_ACTCK_I2C0_EN BIT(0) + +//2 REG_PESOC_CLK_CTRL3 + +//2 REG_PESOC_HCI_CLK_CTRL0 +#define BIT_SOC_SLPCK_MII_MPHY_EN BIT(25) +#define BIT_SOC_ACTCK_MII_MPHY_EN BIT(24) +#define BIT_SOC_SLPCK_OTG_EN BIT(5) +#define BIT_SOC_ACTCK_OTG_EN BIT(4) +#define BIT_SOC_SLPCK_SDIO_HST_EN BIT(3) +#define BIT_SOC_ACTCK_SDIO_HST_EN BIT(2) +#define BIT_SOC_SLPCK_SDIO_DEV_EN BIT(1) +#define BIT_SOC_ACTCK_SDIO_DEV_EN BIT(0) + +//2 REG_PESOC_COM_CLK_CTRL1 +#define BIT_SOC_NFC_CAL_EN BIT(18) +#define BIT_SOC_SLPCK_NFC_EN BIT(17) +#define BIT_SOC_ACTCK_NFC_EN BIT(16) +#define BIT_SOC_SLPCK_SECURITY_ENG_EN BIT(5) +#define BIT_SOC_ACTCK_SECURITY_ENG_EN BIT(4) +#define BIT_SOC_SLPCK_WL_EN BIT(1) +#define BIT_SOC_ACTCK_WL_EN BIT(0) + +//2 REG_PESOC_HW_ENG_CLK_CTRL + +//2 REG_RSVD + +//2 REG_PESOC_CLK_SEL +#define BIT_PESOC_SPI1_SCLK_SEL BIT(18) + +#define BIT_SHIFT_PESOC_PERI_SCLK_SEL 16 +#define BIT_MASK_PESOC_PERI_SCLK_SEL 0x3 +#define BIT_PESOC_PERI_SCLK_SEL(x) (((x) & BIT_MASK_PESOC_PERI_SCLK_SEL) << BIT_SHIFT_PESOC_PERI_SCLK_SEL) + + +#define BIT_SHIFT_PESOC_SDR_CK_SEL 10 +#define BIT_MASK_PESOC_SDR_CK_SEL 0x3 +#define BIT_PESOC_SDR_CK_SEL(x) (((x) & BIT_MASK_PESOC_SDR_CK_SEL) << BIT_SHIFT_PESOC_SDR_CK_SEL) + + +#define BIT_SHIFT_PESOC_FLASH_CK_SEL 8 +#define BIT_MASK_PESOC_FLASH_CK_SEL 0x3 +#define BIT_PESOC_FLASH_CK_SEL(x) (((x) & BIT_MASK_PESOC_FLASH_CK_SEL) << BIT_SHIFT_PESOC_FLASH_CK_SEL) + + +#define BIT_SHIFT_PESOC_TRACE_CK_SEL 4 +#define BIT_MASK_PESOC_TRACE_CK_SEL 0x3 +#define BIT_PESOC_TRACE_CK_SEL(x) (((x) & BIT_MASK_PESOC_TRACE_CK_SEL) << BIT_SHIFT_PESOC_TRACE_CK_SEL) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_SYS_ANACK_CAL_CTRL +#define BIT_SYS_ANACK_CAL_CMD BIT(15) +#define BIT_SYS_ANACK_CAL_SEL BIT(14) + +#define BIT_SHIFT_SYS_ANACK_CAL_RPT 0 +#define BIT_MASK_SYS_ANACK_CAL_RPT 0x3fff +#define BIT_SYS_ANACK_CAL_RPT(x) (((x) & BIT_MASK_SYS_ANACK_CAL_RPT) << BIT_SHIFT_SYS_ANACK_CAL_RPT) + + +//2 REG_OSC32K_CTRL + +#define BIT_SHIFT_32K_BIAS_CURRENT 16 +#define BIT_MASK_32K_BIAS_CURRENT 0xffff +#define BIT_32K_BIAS_CURRENT(x) (((x) & BIT_MASK_32K_BIAS_CURRENT) << BIT_SHIFT_32K_BIAS_CURRENT) + + +#define BIT_SHIFT_32K_RESISTOR_COM 2 +#define BIT_MASK_32K_RESISTOR_COM 0x3 +#define BIT_32K_RESISTOR_COM(x) (((x) & BIT_MASK_32K_RESISTOR_COM) << BIT_SHIFT_32K_RESISTOR_COM) + +#define BIT_32K_DBG_SEL BIT(1) +#define BIT_32K_POW_CKGEN_EN BIT(0) + +//2 REG_OSC32K_REG_CTRL0 +#define BIT_32K_REG_INDIRT_CMD BIT(23) + +#define BIT_SHIFT_32K_REG_INDIRT_ADDR 16 +#define BIT_MASK_32K_REG_INDIRT_ADDR 0x3f +#define BIT_32K_REG_INDIRT_ADDR(x) (((x) & BIT_MASK_32K_REG_INDIRT_ADDR) << BIT_SHIFT_32K_REG_INDIRT_ADDR) + + +#define BIT_SHIFT_32K_REG_INDIRT_WDATA 0 +#define BIT_MASK_32K_REG_INDIRT_WDATA 0xffff +#define BIT_32K_REG_INDIRT_WDATA(x) (((x) & BIT_MASK_32K_REG_INDIRT_WDATA) << BIT_SHIFT_32K_REG_INDIRT_WDATA) + + +//2 REG_OSC32K_REG_CTRL1 + +#define BIT_SHIFT_32K_REG_INDIRT_RDATA 0 +#define BIT_MASK_32K_REG_INDIRT_RDATA 0xffff +#define BIT_32K_REG_INDIRT_RDATA(x) (((x) & BIT_MASK_32K_REG_INDIRT_RDATA) << BIT_SHIFT_32K_REG_INDIRT_RDATA) + + +//2 REG_THERMAL_METER_CTRL + +#define BIT_SHIFT_TEMP_VALUE 24 +#define BIT_MASK_TEMP_VALUE 0x3f +#define BIT_TEMP_VALUE(x) (((x) & BIT_MASK_TEMP_VALUE) << BIT_SHIFT_TEMP_VALUE) + + +#define BIT_SHIFT_TEMP_DELTA 16 +#define BIT_MASK_TEMP_DELTA 0x3f +#define BIT_TEMP_DELTA(x) (((x) & BIT_MASK_TEMP_DELTA) << BIT_SHIFT_TEMP_DELTA) + +#define BIT_THERMAL_METER_EN BIT(15) +#define BIT_THERMAL_METER_VALID BIT(14) + +#define BIT_SHIFT_THERMAL_METER_TIMER 0 +#define BIT_MASK_THERMAL_METER_TIMER 0xfff +#define BIT_THERMAL_METER_TIMER(x) (((x) & BIT_MASK_THERMAL_METER_TIMER) << BIT_SHIFT_THERMAL_METER_TIMER) + + +//2 REG_UART_MUX_CTRL + +#define BIT_SHIFT_UART2_PIN_SEL 9 +#define BIT_MASK_UART2_PIN_SEL 0x7 +#define BIT_UART2_PIN_SEL(x) (((x) & BIT_MASK_UART2_PIN_SEL) << BIT_SHIFT_UART2_PIN_SEL) + +#define BIT_UART2_PIN_EN BIT(8) + +#define BIT_SHIFT_UART1_PIN_SEL 5 +#define BIT_MASK_UART1_PIN_SEL 0x7 +#define BIT_UART1_PIN_SEL(x) (((x) & BIT_MASK_UART1_PIN_SEL) << BIT_SHIFT_UART1_PIN_SEL) + +#define BIT_UART1_PIN_EN BIT(4) + +#define BIT_SHIFT_UART0_PIN_SEL 1 +#define BIT_MASK_UART0_PIN_SEL 0x7 +#define BIT_UART0_PIN_SEL(x) (((x) & BIT_MASK_UART0_PIN_SEL) << BIT_SHIFT_UART0_PIN_SEL) + +#define BIT_UART0_PIN_EN BIT(0) + +//2 REG_SPI_MUX_CTRL +#define BIT_SPI0_MULTI_CS_EN BIT(28) + +#define BIT_SHIFT_SPI2_PIN_SEL 9 +#define BIT_MASK_SPI2_PIN_SEL 0x7 +#define BIT_SPI2_PIN_SEL(x) (((x) & BIT_MASK_SPI2_PIN_SEL) << BIT_SHIFT_SPI2_PIN_SEL) + +#define BIT_SPI2_PIN_EN BIT(8) + +#define BIT_SHIFT_SPI1_PIN_SEL 5 +#define BIT_MASK_SPI1_PIN_SEL 0x7 +#define BIT_SPI1_PIN_SEL(x) (((x) & BIT_MASK_SPI1_PIN_SEL) << BIT_SHIFT_SPI1_PIN_SEL) + +#define BIT_SPI1_PIN_EN BIT(4) + +#define BIT_SHIFT_SPI0_PIN_SEL 1 +#define BIT_MASK_SPI0_PIN_SEL 0x7 +#define BIT_SPI0_PIN_SEL(x) (((x) & BIT_MASK_SPI0_PIN_SEL) << BIT_SHIFT_SPI0_PIN_SEL) + +#define BIT_SPI0_PIN_EN BIT(0) + +//2 REG_I2C_MUX_CTRL + +#define BIT_SHIFT_I2C3_PIN_SEL 13 +#define BIT_MASK_I2C3_PIN_SEL 0x7 +#define BIT_I2C3_PIN_SEL(x) (((x) & BIT_MASK_I2C3_PIN_SEL) << BIT_SHIFT_I2C3_PIN_SEL) + +#define BIT_I2C3_PIN_EN BIT(12) + +#define BIT_SHIFT_I2C2_PIN_SEL 9 +#define BIT_MASK_I2C2_PIN_SEL 0x7 +#define BIT_I2C2_PIN_SEL(x) (((x) & BIT_MASK_I2C2_PIN_SEL) << BIT_SHIFT_I2C2_PIN_SEL) + +#define BIT_I2C2_PIN_EN BIT(8) + +#define BIT_SHIFT_I2C1_PIN_SEL 5 +#define BIT_MASK_I2C1_PIN_SEL 0x7 +#define BIT_I2C1_PIN_SEL(x) (((x) & BIT_MASK_I2C1_PIN_SEL) << BIT_SHIFT_I2C1_PIN_SEL) + +#define BIT_I2C1_PIN_EN BIT(4) + +#define BIT_SHIFT_I2C0_PIN_SEL 1 +#define BIT_MASK_I2C0_PIN_SEL 0x7 +#define BIT_I2C0_PIN_SEL(x) (((x) & BIT_MASK_I2C0_PIN_SEL) << BIT_SHIFT_I2C0_PIN_SEL) + +#define BIT_I2C0_PIN_EN BIT(0) + +//2 REG_I2S_MUX_CTRL/ REG_PCM_MUX_CTRL + +//2 REG_NOT_VALID + +#define BIT_SHIFT_PCM1_PIN_SEL 21 +#define BIT_MASK_PCM1_PIN_SEL 0x7 +#define BIT_PCM1_PIN_SEL(x) (((x) & BIT_MASK_PCM1_PIN_SEL) << BIT_SHIFT_PCM1_PIN_SEL) + +#define BIT_PCM1_PIN_EN BIT(20) + +#define BIT_SHIFT_PCM0_PIN_SEL 17 +#define BIT_MASK_PCM0_PIN_SEL 0x7 +#define BIT_PCM0_PIN_SEL(x) (((x) & BIT_MASK_PCM0_PIN_SEL) << BIT_SHIFT_PCM0_PIN_SEL) + +#define BIT_PCM0_PIN_EN BIT(16) + +//2 REG_NOT_VALID + +#define BIT_SHIFT_I2S1_PIN_SEL 6 +#define BIT_MASK_I2S1_PIN_SEL 0x3 +#define BIT_I2S1_PIN_SEL(x) (((x) & BIT_MASK_I2S1_PIN_SEL) << BIT_SHIFT_I2S1_PIN_SEL) + +#define BIT_I2S1_MCK_EN BIT(5) +#define BIT_I2S1_PIN_EN BIT(4) + +#define BIT_SHIFT_I2S0_PIN_SEL 2 +#define BIT_MASK_I2S0_PIN_SEL 0x3 +#define BIT_I2S0_PIN_SEL(x) (((x) & BIT_MASK_I2S0_PIN_SEL) << BIT_SHIFT_I2S0_PIN_SEL) + +#define BIT_I2S0_MCK_EN BIT(1) +#define BIT_I2S0_PIN_EN BIT(0) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_HCI_PINMUX_CTRL +#define BIT_HCI_MII_PIN_EN BIT(24) +#define BIT_HCI_SDIOH_PIN_EN BIT(1) +#define BIT_HCI_SDIOD_PIN_EN BIT(0) + +//2 REG_WL_PINMUX_CTRL +#define BIT_NFC_PIN_EN BIT(16) +#define BIT_WL_BTCMD_PIN_EN BIT(13) +#define BIT_WL_BTCOEX_PIN_EN BIT(12) +#define BIT_WL_ANT1_PIN_EN BIT(9) +#define BIT_WL_ANT0_PIN_EN BIT(8) + +#define BIT_SHIFT_WL_LED_PIN_SEL 1 +#define BIT_MASK_WL_LED_PIN_SEL 0x3 +#define BIT_WL_LED_PIN_SEL(x) (((x) & BIT_MASK_WL_LED_PIN_SEL) << BIT_SHIFT_WL_LED_PIN_SEL) + +#define BIT_WL_LED_PIN_EN BIT(0) + +//2 REG_BT_PINMUX_CTRL + +//2 REG_PWM_PINMUX_CTRL + +#define BIT_SHIFT_ETE3_PIN_SEL 29 +#define BIT_MASK_ETE3_PIN_SEL 0x3 +#define BIT_ETE3_PIN_SEL(x) (((x) & BIT_MASK_ETE3_PIN_SEL) << BIT_SHIFT_ETE3_PIN_SEL) + +#define BIT_ETE3_PIN_EN BIT(28) + +#define BIT_SHIFT_ETE2_PIN_SEL 25 +#define BIT_MASK_ETE2_PIN_SEL 0x3 +#define BIT_ETE2_PIN_SEL(x) (((x) & BIT_MASK_ETE2_PIN_SEL) << BIT_SHIFT_ETE2_PIN_SEL) + +#define BIT_ETE2_PIN_EN BIT(24) + +#define BIT_SHIFT_ETE1_PIN_SEL 21 +#define BIT_MASK_ETE1_PIN_SEL 0x3 +#define BIT_ETE1_PIN_SEL(x) (((x) & BIT_MASK_ETE1_PIN_SEL) << BIT_SHIFT_ETE1_PIN_SEL) + +#define BIT_ETE1_PIN_EN BIT(20) + +#define BIT_SHIFT_ETE0_PIN_SEL 17 +#define BIT_MASK_ETE0_PIN_SEL 0x3 +#define BIT_ETE0_PIN_SEL(x) (((x) & BIT_MASK_ETE0_PIN_SEL) << BIT_SHIFT_ETE0_PIN_SEL) + +#define BIT_ETE0_PIN_EN BIT(16) + +#define BIT_SHIFT_PWM3_PIN_SEL 13 +#define BIT_MASK_PWM3_PIN_SEL 0x3 +#define BIT_PWM3_PIN_SEL(x) (((x) & BIT_MASK_PWM3_PIN_SEL) << BIT_SHIFT_PWM3_PIN_SEL) + +#define BIT_PWM3_PIN_EN BIT(12) + +#define BIT_SHIFT_PWM2_PIN_SEL 9 +#define BIT_MASK_PWM2_PIN_SEL 0x3 +#define BIT_PWM2_PIN_SEL(x) (((x) & BIT_MASK_PWM2_PIN_SEL) << BIT_SHIFT_PWM2_PIN_SEL) + +#define BIT_PWM2_PIN_EN BIT(8) + +#define BIT_SHIFT_PWM1_PIN_SEL 5 +#define BIT_MASK_PWM1_PIN_SEL 0x3 +#define BIT_PWM1_PIN_SEL(x) (((x) & BIT_MASK_PWM1_PIN_SEL) << BIT_SHIFT_PWM1_PIN_SEL) + +#define BIT_PWM1_PIN_EN BIT(4) + +#define BIT_SHIFT_PWM0_PIN_SEL 1 +#define BIT_MASK_PWM0_PIN_SEL 0x3 +#define BIT_PWM0_PIN_SEL(x) (((x) & BIT_MASK_PWM0_PIN_SEL) << BIT_SHIFT_PWM0_PIN_SEL) + +#define BIT_PWM0_PIN_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_CPU_PERIPHERAL_CTRL + +#define BIT_SHIFT_LOG_UART_PIN_SEL 22 +#define BIT_MASK_LOG_UART_PIN_SEL 0x3 +#define BIT_LOG_UART_PIN_SEL(x) (((x) & BIT_MASK_LOG_UART_PIN_SEL) << BIT_SHIFT_LOG_UART_PIN_SEL) + +#define BIT_LOG_UART_IR_EN BIT(21) +#define BIT_LOG_UART_PIN_EN BIT(20) +#define BIT_TRACE_PIN_EN BIT(17) +#define BIT_SDR_PIN_EN BIT(4) + +#define BIT_SHIFT_SPI_FLSH_PIN_SEL 1 +#define BIT_MASK_SPI_FLSH_PIN_SEL 0x3 +#define BIT_SPI_FLSH_PIN_SEL(x) (((x) & BIT_MASK_SPI_FLSH_PIN_SEL) << BIT_SHIFT_SPI_FLSH_PIN_SEL) + +#define BIT_SPI_FLSH_PIN_EN BIT(0) + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_HCI_CTRL_STATUS_0 + +//2 REG_HCI_CTRL_STATUS_1 + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_PESOC_MEM_CTRL + +#define BIT_SHIFT_PESOC_SDR_DDL_CTRL 16 +#define BIT_MASK_PESOC_SDR_DDL_CTRL 0xff +#define BIT_PESOC_SDR_DDL_CTRL(x) (((x) & BIT_MASK_PESOC_SDR_DDL_CTRL) << BIT_SHIFT_PESOC_SDR_DDL_CTRL) + + +#define BIT_SHIFT_PESOC_FLASH_DDL_CTRL 0 +#define BIT_MASK_PESOC_FLASH_DDL_CTRL 0xff +#define BIT_PESOC_FLASH_DDL_CTRL(x) (((x) & BIT_MASK_PESOC_FLASH_DDL_CTRL) << BIT_SHIFT_PESOC_FLASH_DDL_CTRL) + + +//2 REG_PESOC_SOC_CTRL + +#define BIT_SHIFT_PESOC_GDMA_CFG 16 +#define BIT_MASK_PESOC_GDMA_CFG 0x1fff +#define BIT_PESOC_GDMA_CFG(x) (((x) & BIT_MASK_PESOC_GDMA_CFG) << BIT_SHIFT_PESOC_GDMA_CFG) + +#define BIT_PESOC_MII_LX_SLV_SWAP_SEL BIT(13) +#define BIT_PESOC_MII_LX_MST_SWAP_SEL BIT(12) +#define BIT_PESOC_MII_LX_WRAPPER_EN BIT(11) +#define BIT_PESOC_LX_SLV_SWAP_SEL BIT(10) +#define BIT_PESOC_LX_MST_SWAP_SEL BIT(9) +#define BIT_PESOC_LX_WL_SWAP_SEL BIT(8) + +#define BIT_SHIFT_PESOC_SRAM_MUX_CFG 0 +#define BIT_MASK_PESOC_SRAM_MUX_CFG 0x7 +#define BIT_PESOC_SRAM_MUX_CFG(x) (((x) & BIT_MASK_PESOC_SRAM_MUX_CFG) << BIT_SHIFT_PESOC_SRAM_MUX_CFG) + + +//2 REG_PESOC_PERI_CTRL +#define BIT_SOC_FUNC_SPI_RN BIT(8) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_FW_CTRL_INT0 BIT(24) + +//2 REG_NOT_VALID + +//2 REG_GPIO_SHTDN_CTRL +#define BIT_GPIO_GPK_SHTDN_N BIT(10) +#define BIT_GPIO_GPJ_SHTDN_N BIT(9) +#define BIT_GPIO_GPI_SHTDN_N BIT(8) +#define BIT_GPIO_GPH_SHTDN_N BIT(7) +#define BIT_GPIO_GPG_SHTDN_N BIT(6) +#define BIT_GPIO_GPF_SHTDN_N BIT(5) +#define BIT_GPIO_GPE_SHTDN_N BIT(4) +#define BIT_GPIO_GPD_SHTDN_N BIT(3) +#define BIT_GPIO_GPC_SHTDN_N BIT(2) +#define BIT_GPIO_GPB_SHTDN_N BIT(1) +#define BIT_GPIO_GPA_SHTDN_N BIT(0) + +//2 REG_GPIO_DRIVING_CTRL +#define BIT_GPIO_GPK_DRV_SEL BIT(20) +#define BIT_GPIO_GPJ_DRV_SEL BIT(18) +#define BIT_GPIO_GPI_DRV_SEL BIT(16) +#define BIT_GPIO_GPH_DRV_SEL BIT(14) +#define BIT_GPIO_GPG_DRV_SEL BIT(12) +#define BIT_GPIO_GPF_DRV_SEL BIT(10) +#define BIT_GPIO_GPE_DRV_SEL BIT(8) +#define BIT_GPIO_GPD_DRV_SEL BIT(6) +#define BIT_GPIO_GPC_DRV_SEL BIT(4) +#define BIT_GPIO_GPB_DRV_SEL BIT(2) +#define BIT_GPIO_GPA_DRV_SEL BIT(0) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_GPIO_PULL_CTRL0 + +#define BIT_SHIFT_GPIO_GPB7_PULL_CTRL 30 +#define BIT_MASK_GPIO_GPB7_PULL_CTRL 0x3 +#define BIT_GPIO_GPB7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB7_PULL_CTRL) << BIT_SHIFT_GPIO_GPB7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPB6_PULL_CTRL 0x3 +#define BIT_GPIO_GPB6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB6_PULL_CTRL) << BIT_SHIFT_GPIO_GPB6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPB5_PULL_CTRL 0x3 +#define BIT_GPIO_GPB5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB5_PULL_CTRL) << BIT_SHIFT_GPIO_GPB5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPB4_PULL_CTRL 0x3 +#define BIT_GPIO_GPB4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB4_PULL_CTRL) << BIT_SHIFT_GPIO_GPB4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPB3_PULL_CTRL 0x3 +#define BIT_GPIO_GPB3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB3_PULL_CTRL) << BIT_SHIFT_GPIO_GPB3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPB2_PULL_CTRL 0x3 +#define BIT_GPIO_GPB2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB2_PULL_CTRL) << BIT_SHIFT_GPIO_GPB2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPB1_PULL_CTRL 0x3 +#define BIT_GPIO_GPB1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB1_PULL_CTRL) << BIT_SHIFT_GPIO_GPB1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPB0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPB0_PULL_CTRL 0x3 +#define BIT_GPIO_GPB0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPB0_PULL_CTRL) << BIT_SHIFT_GPIO_GPB0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPA7_PULL_CTRL 0x3 +#define BIT_GPIO_GPA7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA7_PULL_CTRL) << BIT_SHIFT_GPIO_GPA7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPA6_PULL_CTRL 0x3 +#define BIT_GPIO_GPA6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA6_PULL_CTRL) << BIT_SHIFT_GPIO_GPA6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPA5_PULL_CTRL 0x3 +#define BIT_GPIO_GPA5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA5_PULL_CTRL) << BIT_SHIFT_GPIO_GPA5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPA4_PULL_CTRL 0x3 +#define BIT_GPIO_GPA4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA4_PULL_CTRL) << BIT_SHIFT_GPIO_GPA4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPA3_PULL_CTRL 0x3 +#define BIT_GPIO_GPA3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA3_PULL_CTRL) << BIT_SHIFT_GPIO_GPA3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPA2_PULL_CTRL 0x3 +#define BIT_GPIO_GPA2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA2_PULL_CTRL) << BIT_SHIFT_GPIO_GPA2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPA1_PULL_CTRL 0x3 +#define BIT_GPIO_GPA1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA1_PULL_CTRL) << BIT_SHIFT_GPIO_GPA1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPA0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPA0_PULL_CTRL 0x3 +#define BIT_GPIO_GPA0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPA0_PULL_CTRL) << BIT_SHIFT_GPIO_GPA0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL1 + +#define BIT_SHIFT_GPIO_GPD7_PULL_CTRL 29 +#define BIT_MASK_GPIO_GPD7_PULL_CTRL 0x7 +#define BIT_GPIO_GPD7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD7_PULL_CTRL) << BIT_SHIFT_GPIO_GPD7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPD6_PULL_CTRL 0x3 +#define BIT_GPIO_GPD6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD6_PULL_CTRL) << BIT_SHIFT_GPIO_GPD6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPD5_PULL_CTRL 0x3 +#define BIT_GPIO_GPD5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD5_PULL_CTRL) << BIT_SHIFT_GPIO_GPD5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPD4_PULL_CTRL 0x3 +#define BIT_GPIO_GPD4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD4_PULL_CTRL) << BIT_SHIFT_GPIO_GPD4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPD3_PULL_CTRL 0x3 +#define BIT_GPIO_GPD3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD3_PULL_CTRL) << BIT_SHIFT_GPIO_GPD3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPD2_PULL_CTRL 0x3 +#define BIT_GPIO_GPD2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD2_PULL_CTRL) << BIT_SHIFT_GPIO_GPD2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPD1_PULL_CTRL 0x3 +#define BIT_GPIO_GPD1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD1_PULL_CTRL) << BIT_SHIFT_GPIO_GPD1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPD0_PULL_CTRL 0x3 +#define BIT_GPIO_GPD0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD0_PULL_CTRL) << BIT_SHIFT_GPIO_GPD0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPC7_PULL_CTRL 0x3 +#define BIT_GPIO_GPC7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC7_PULL_CTRL) << BIT_SHIFT_GPIO_GPC7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPC6_PULL_CTRL 0x3 +#define BIT_GPIO_GPC6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC6_PULL_CTRL) << BIT_SHIFT_GPIO_GPC6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPC5_PULL_CTRL 0x3 +#define BIT_GPIO_GPC5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC5_PULL_CTRL) << BIT_SHIFT_GPIO_GPC5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPC4_PULL_CTRL 0x3 +#define BIT_GPIO_GPC4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC4_PULL_CTRL) << BIT_SHIFT_GPIO_GPC4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPC3_PULL_CTRL 0x3 +#define BIT_GPIO_GPC3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC3_PULL_CTRL) << BIT_SHIFT_GPIO_GPC3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPC2_PULL_CTRL 0x3 +#define BIT_GPIO_GPC2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC2_PULL_CTRL) << BIT_SHIFT_GPIO_GPC2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPC1_PULL_CTRL 0x3 +#define BIT_GPIO_GPC1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC1_PULL_CTRL) << BIT_SHIFT_GPIO_GPC1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPC0_PULL_CTRL 0x3 +#define BIT_GPIO_GPC0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC0_PULL_CTRL) << BIT_SHIFT_GPIO_GPC0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL2 + +#define BIT_SHIFT_GPIO_GPF5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPF5_PULL_CTRL 0x3 +#define BIT_GPIO_GPF5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF5_PULL_CTRL) << BIT_SHIFT_GPIO_GPF5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPF4_PULL_CTRL 0x3 +#define BIT_GPIO_GPF4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF4_PULL_CTRL) << BIT_SHIFT_GPIO_GPF4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPF3_PULL_CTRL 0x3 +#define BIT_GPIO_GPF3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF3_PULL_CTRL) << BIT_SHIFT_GPIO_GPF3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPF2_PULL_CTRL 0x3 +#define BIT_GPIO_GPF2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF2_PULL_CTRL) << BIT_SHIFT_GPIO_GPF2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPF1_PULL_CTRL 0x3 +#define BIT_GPIO_GPF1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF1_PULL_CTRL) << BIT_SHIFT_GPIO_GPF1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPF0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPF0_PULL_CTRL 0x3 +#define BIT_GPIO_GPF0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPF0_PULL_CTRL) << BIT_SHIFT_GPIO_GPF0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPE7_PULL_CTRL 0x3 +#define BIT_GPIO_GPE7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE7_PULL_CTRL) << BIT_SHIFT_GPIO_GPE7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPE6_PULL_CTRL 0x3 +#define BIT_GPIO_GPE6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE6_PULL_CTRL) << BIT_SHIFT_GPIO_GPE6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPE5_PULL_CTRL 0x3 +#define BIT_GPIO_GPE5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE5_PULL_CTRL) << BIT_SHIFT_GPIO_GPE5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPE4_PULL_CTRL 0x3 +#define BIT_GPIO_GPE4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE4_PULL_CTRL) << BIT_SHIFT_GPIO_GPE4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPE3_PULL_CTRL 0x3 +#define BIT_GPIO_GPE3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE3_PULL_CTRL) << BIT_SHIFT_GPIO_GPE3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPE2_PULL_CTRL 0x3 +#define BIT_GPIO_GPE2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE2_PULL_CTRL) << BIT_SHIFT_GPIO_GPE2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPE1_PULL_CTRL 0x3 +#define BIT_GPIO_GPE1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE1_PULL_CTRL) << BIT_SHIFT_GPIO_GPE1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPE0_PULL_CTRL 0x3 +#define BIT_GPIO_GPE0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE0_PULL_CTRL) << BIT_SHIFT_GPIO_GPE0_PULL_CTRL) + + +//2 REG_NOT_VALID + +#define BIT_SHIFT_GPIO_GPH7_PULL_CTRL 30 +#define BIT_MASK_GPIO_GPH7_PULL_CTRL 0x3 +#define BIT_GPIO_GPH7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH7_PULL_CTRL) << BIT_SHIFT_GPIO_GPH7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPH6_PULL_CTRL 0x3 +#define BIT_GPIO_GPH6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH6_PULL_CTRL) << BIT_SHIFT_GPIO_GPH6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPH5_PULL_CTRL 0x3 +#define BIT_GPIO_GPH5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH5_PULL_CTRL) << BIT_SHIFT_GPIO_GPH5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPH4_PULL_CTRL 0x3 +#define BIT_GPIO_GPH4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH4_PULL_CTRL) << BIT_SHIFT_GPIO_GPH4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPH3_PULL_CTRL 0x3 +#define BIT_GPIO_GPH3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH3_PULL_CTRL) << BIT_SHIFT_GPIO_GPH3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPH2_PULL_CTRL 0x3 +#define BIT_GPIO_GPH2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH2_PULL_CTRL) << BIT_SHIFT_GPIO_GPH2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPH1_PULL_CTRL 0x3 +#define BIT_GPIO_GPH1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH1_PULL_CTRL) << BIT_SHIFT_GPIO_GPH1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPH0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPH0_PULL_CTRL 0x3 +#define BIT_GPIO_GPH0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPH0_PULL_CTRL) << BIT_SHIFT_GPIO_GPH0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPG7_PULL_CTRL 0x3 +#define BIT_GPIO_GPG7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG7_PULL_CTRL) << BIT_SHIFT_GPIO_GPG7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPG6_PULL_CTRL 0x3 +#define BIT_GPIO_GPG6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG6_PULL_CTRL) << BIT_SHIFT_GPIO_GPG6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPG5_PULL_CTRL 0x3 +#define BIT_GPIO_GPG5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG5_PULL_CTRL) << BIT_SHIFT_GPIO_GPG5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPG4_PULL_CTRL 0x3 +#define BIT_GPIO_GPG4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG4_PULL_CTRL) << BIT_SHIFT_GPIO_GPG4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPG3_PULL_CTRL 0x3 +#define BIT_GPIO_GPG3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG3_PULL_CTRL) << BIT_SHIFT_GPIO_GPG3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPG2_PULL_CTRL 0x3 +#define BIT_GPIO_GPG2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG2_PULL_CTRL) << BIT_SHIFT_GPIO_GPG2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPG1_PULL_CTRL 0x3 +#define BIT_GPIO_GPG1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG1_PULL_CTRL) << BIT_SHIFT_GPIO_GPG1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPG0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPG0_PULL_CTRL 0x3 +#define BIT_GPIO_GPG0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPG0_PULL_CTRL) << BIT_SHIFT_GPIO_GPG0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL4 + +#define BIT_SHIFT_GPIO_GPJ6_PULL_CTRL 28 +#define BIT_MASK_GPIO_GPJ6_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ6_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ5_PULL_CTRL 26 +#define BIT_MASK_GPIO_GPJ5_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ5_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ4_PULL_CTRL 24 +#define BIT_MASK_GPIO_GPJ4_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ4_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ3_PULL_CTRL 22 +#define BIT_MASK_GPIO_GPJ3_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ3_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ2_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPJ2_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ2_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ1_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPJ1_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ1_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPJ0_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPJ0_PULL_CTRL 0x3 +#define BIT_GPIO_GPJ0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPJ0_PULL_CTRL) << BIT_SHIFT_GPIO_GPJ0_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI7_PULL_CTRL 14 +#define BIT_MASK_GPIO_GPI7_PULL_CTRL 0x3 +#define BIT_GPIO_GPI7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI7_PULL_CTRL) << BIT_SHIFT_GPIO_GPI7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI6_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPI6_PULL_CTRL 0x3 +#define BIT_GPIO_GPI6_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI6_PULL_CTRL) << BIT_SHIFT_GPIO_GPI6_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPI5_PULL_CTRL 0x3 +#define BIT_GPIO_GPI5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI5_PULL_CTRL) << BIT_SHIFT_GPIO_GPI5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPI4_PULL_CTRL 0x3 +#define BIT_GPIO_GPI4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI4_PULL_CTRL) << BIT_SHIFT_GPIO_GPI4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPI3_PULL_CTRL 0x3 +#define BIT_GPIO_GPI3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI3_PULL_CTRL) << BIT_SHIFT_GPIO_GPI3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPI2_PULL_CTRL 0x3 +#define BIT_GPIO_GPI2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI2_PULL_CTRL) << BIT_SHIFT_GPIO_GPI2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPI1_PULL_CTRL 0x3 +#define BIT_GPIO_GPI1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI1_PULL_CTRL) << BIT_SHIFT_GPIO_GPI1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPI0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPI0_PULL_CTRL 0x3 +#define BIT_GPIO_GPI0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPI0_PULL_CTRL) << BIT_SHIFT_GPIO_GPI0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL5 + +#define BIT_SHIFT_GPIO_GPEA_PULL_CTRL 20 +#define BIT_MASK_GPIO_GPEA_PULL_CTRL 0x3 +#define BIT_GPIO_GPEA_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPEA_PULL_CTRL) << BIT_SHIFT_GPIO_GPEA_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE9_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPE9_PULL_CTRL 0x3 +#define BIT_GPIO_GPE9_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE9_PULL_CTRL) << BIT_SHIFT_GPIO_GPE9_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPE8_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPE8_PULL_CTRL 0x3 +#define BIT_GPIO_GPE8_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPE8_PULL_CTRL) << BIT_SHIFT_GPIO_GPE8_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK7_PULL_CTRL 12 +#define BIT_MASK_GPIO_GPK7_PULL_CTRL 0x3 +#define BIT_GPIO_GPK7_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK7_PULL_CTRL) << BIT_SHIFT_GPIO_GPK7_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK5_PULL_CTRL 10 +#define BIT_MASK_GPIO_GPK5_PULL_CTRL 0x3 +#define BIT_GPIO_GPK5_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK5_PULL_CTRL) << BIT_SHIFT_GPIO_GPK5_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK4_PULL_CTRL 8 +#define BIT_MASK_GPIO_GPK4_PULL_CTRL 0x3 +#define BIT_GPIO_GPK4_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK4_PULL_CTRL) << BIT_SHIFT_GPIO_GPK4_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK3_PULL_CTRL 6 +#define BIT_MASK_GPIO_GPK3_PULL_CTRL 0x3 +#define BIT_GPIO_GPK3_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK3_PULL_CTRL) << BIT_SHIFT_GPIO_GPK3_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK2_PULL_CTRL 4 +#define BIT_MASK_GPIO_GPK2_PULL_CTRL 0x3 +#define BIT_GPIO_GPK2_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK2_PULL_CTRL) << BIT_SHIFT_GPIO_GPK2_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK1_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPK1_PULL_CTRL 0x3 +#define BIT_GPIO_GPK1_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK1_PULL_CTRL) << BIT_SHIFT_GPIO_GPK1_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPK0_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPK0_PULL_CTRL 0x3 +#define BIT_GPIO_GPK0_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPK0_PULL_CTRL) << BIT_SHIFT_GPIO_GPK0_PULL_CTRL) + + +//2 REG_GPIO_PULL_CTRL6 + +#define BIT_SHIFT_GPIO_GPD9_PULL_CTRL 18 +#define BIT_MASK_GPIO_GPD9_PULL_CTRL 0x3 +#define BIT_GPIO_GPD9_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD9_PULL_CTRL) << BIT_SHIFT_GPIO_GPD9_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPD8_PULL_CTRL 16 +#define BIT_MASK_GPIO_GPD8_PULL_CTRL 0x3 +#define BIT_GPIO_GPD8_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPD8_PULL_CTRL) << BIT_SHIFT_GPIO_GPD8_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC9_PULL_CTRL 2 +#define BIT_MASK_GPIO_GPC9_PULL_CTRL 0x3 +#define BIT_GPIO_GPC9_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC9_PULL_CTRL) << BIT_SHIFT_GPIO_GPC9_PULL_CTRL) + + +#define BIT_SHIFT_GPIO_GPC8_PULL_CTRL 0 +#define BIT_MASK_GPIO_GPC8_PULL_CTRL 0x3 +#define BIT_GPIO_GPC8_PULL_CTRL(x) (((x) & BIT_MASK_GPIO_GPC8_PULL_CTRL) << BIT_SHIFT_GPIO_GPC8_PULL_CTRL) + + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_PERI_PWM0_CTRL +#define BIT_PERI_PWM0_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM0_GT_SEL 24 +#define BIT_MASK_PERI_PWM0_GT_SEL 0xf +#define BIT_PERI_PWM0_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM0_GT_SEL) << BIT_SHIFT_PERI_PWM0_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM0_DUTY 12 +#define BIT_MASK_PERI_PWM0_DUTY 0x3ff +#define BIT_PERI_PWM0_DUTY(x) (((x) & BIT_MASK_PERI_PWM0_DUTY) << BIT_SHIFT_PERI_PWM0_DUTY) + + +#define BIT_SHIFT_PERI_PWM0_PERIOD 0 +#define BIT_MASK_PERI_PWM0_PERIOD 0x3ff +#define BIT_PERI_PWM0_PERIOD(x) (((x) & BIT_MASK_PERI_PWM0_PERIOD) << BIT_SHIFT_PERI_PWM0_PERIOD) + + +//2 REG_PERI_PWM1_CTRL +#define BIT_PERI_PWM1_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM1_GT_SEL 24 +#define BIT_MASK_PERI_PWM1_GT_SEL 0xf +#define BIT_PERI_PWM1_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM1_GT_SEL) << BIT_SHIFT_PERI_PWM1_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM1_DUTY 12 +#define BIT_MASK_PERI_PWM1_DUTY 0x3ff +#define BIT_PERI_PWM1_DUTY(x) (((x) & BIT_MASK_PERI_PWM1_DUTY) << BIT_SHIFT_PERI_PWM1_DUTY) + + +#define BIT_SHIFT_PERI_PWM1_PERIOD 0 +#define BIT_MASK_PERI_PWM1_PERIOD 0x3ff +#define BIT_PERI_PWM1_PERIOD(x) (((x) & BIT_MASK_PERI_PWM1_PERIOD) << BIT_SHIFT_PERI_PWM1_PERIOD) + + +//2 REG_PERI_PWM2_CTRL +#define BIT_PERI_PWM2_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM2_GT_SEL 24 +#define BIT_MASK_PERI_PWM2_GT_SEL 0xf +#define BIT_PERI_PWM2_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM2_GT_SEL) << BIT_SHIFT_PERI_PWM2_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM2_DUTY 12 +#define BIT_MASK_PERI_PWM2_DUTY 0x3ff +#define BIT_PERI_PWM2_DUTY(x) (((x) & BIT_MASK_PERI_PWM2_DUTY) << BIT_SHIFT_PERI_PWM2_DUTY) + + +#define BIT_SHIFT_PERI_PWM2_PERIOD 0 +#define BIT_MASK_PERI_PWM2_PERIOD 0x3ff +#define BIT_PERI_PWM2_PERIOD(x) (((x) & BIT_MASK_PERI_PWM2_PERIOD) << BIT_SHIFT_PERI_PWM2_PERIOD) + + +//2 REG_PERI_PWM3_CTRL +#define BIT_PERI_PWM3_EN BIT(31) + +#define BIT_SHIFT_PERI_PWM3_GT_SEL 24 +#define BIT_MASK_PERI_PWM3_GT_SEL 0xf +#define BIT_PERI_PWM3_GT_SEL(x) (((x) & BIT_MASK_PERI_PWM3_GT_SEL) << BIT_SHIFT_PERI_PWM3_GT_SEL) + + +#define BIT_SHIFT_PERI_PWM3_DUTY 12 +#define BIT_MASK_PERI_PWM3_DUTY 0x3ff +#define BIT_PERI_PWM3_DUTY(x) (((x) & BIT_MASK_PERI_PWM3_DUTY) << BIT_SHIFT_PERI_PWM3_DUTY) + + +#define BIT_SHIFT_PERI_PWM3_PERIOD 0 +#define BIT_MASK_PERI_PWM3_PERIOD 0x3ff +#define BIT_PERI_PWM3_PERIOD(x) (((x) & BIT_MASK_PERI_PWM3_PERIOD) << BIT_SHIFT_PERI_PWM3_PERIOD) + + +//2 REG_PERI_TIM_EVT_CTRL +#define BIT_PERI_GT_EVT3_EN BIT(31) + +#define BIT_SHIFT_PERI_GT_EVT3_SRC_SEL 28 +#define BIT_MASK_PERI_GT_EVT3_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT3_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT3_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT3_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT3_PULSE_DUR 24 +#define BIT_MASK_PERI_GT_EVT3_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT3_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT3_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT3_PULSE_DUR) + +#define BIT_PERI_GT_EVT2_EN BIT(23) + +#define BIT_SHIFT_PERI_GT_EVT2_SRC_SEL 20 +#define BIT_MASK_PERI_GT_EVT2_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT2_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT2_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT2_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT2_PULSE_DUR 16 +#define BIT_MASK_PERI_GT_EVT2_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT2_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT2_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT2_PULSE_DUR) + +#define BIT_PERI_GT_EVT1_EN BIT(15) + +#define BIT_SHIFT_PERI_GT_EVT1_SRC_SEL 12 +#define BIT_MASK_PERI_GT_EVT1_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT1_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT1_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT1_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT1_PULSE_DUR 8 +#define BIT_MASK_PERI_GT_EVT1_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT1_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT1_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT1_PULSE_DUR) + +#define BIT_PERI_GT_EVT0_EN BIT(7) + +#define BIT_SHIFT_PERI_GT_EVT0_SRC_SEL 4 +#define BIT_MASK_PERI_GT_EVT0_SRC_SEL 0x7 +#define BIT_PERI_GT_EVT0_SRC_SEL(x) (((x) & BIT_MASK_PERI_GT_EVT0_SRC_SEL) << BIT_SHIFT_PERI_GT_EVT0_SRC_SEL) + + +#define BIT_SHIFT_PERI_GT_EVT0_PULSE_DUR 0 +#define BIT_MASK_PERI_GT_EVT0_PULSE_DUR 0xf +#define BIT_PERI_GT_EVT0_PULSE_DUR(x) (((x) & BIT_MASK_PERI_GT_EVT0_PULSE_DUR) << BIT_SHIFT_PERI_GT_EVT0_PULSE_DUR) + + +//2 REG_PERI_EGTIM_CTRL + +#define BIT_SHIFT_PERI_EGTIM_PIN_GROUP2_OPT_SEL 12 +#define BIT_MASK_PERI_EGTIM_PIN_GROUP2_OPT_SEL 0x3 +#define BIT_PERI_EGTIM_PIN_GROUP2_OPT_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_PIN_GROUP2_OPT_SEL) << BIT_SHIFT_PERI_EGTIM_PIN_GROUP2_OPT_SEL) + + +#define BIT_SHIFT_PERI_EGTIM_PIN_GROUP1_OPT_SEL 10 +#define BIT_MASK_PERI_EGTIM_PIN_GROUP1_OPT_SEL 0x3 +#define BIT_PERI_EGTIM_PIN_GROUP1_OPT_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_PIN_GROUP1_OPT_SEL) << BIT_SHIFT_PERI_EGTIM_PIN_GROUP1_OPT_SEL) + + +#define BIT_SHIFT_PERI_EGTIM_PIN_GROUP0_OPT_SEL 8 +#define BIT_MASK_PERI_EGTIM_PIN_GROUP0_OPT_SEL 0x3 +#define BIT_PERI_EGTIM_PIN_GROUP0_OPT_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_PIN_GROUP0_OPT_SEL) << BIT_SHIFT_PERI_EGTIM_PIN_GROUP0_OPT_SEL) + + +//2 REG_NOT_VALID + +#define BIT_SHIFT_PERI_EGTIM_REF_SIG_SEL 4 +#define BIT_MASK_PERI_EGTIM_REF_SIG_SEL 0x3 +#define BIT_PERI_EGTIM_REF_SIG_SEL(x) (((x) & BIT_MASK_PERI_EGTIM_REF_SIG_SEL) << BIT_SHIFT_PERI_EGTIM_REF_SIG_SEL) + +#define BIT_PERI_EGTIM_EN BIT(0) + +//2 REG_NOT_VALID + +//2 REG_PEON_CFG + +//2 REG_PEON_STATUS +#define BIT_PEON_SDIO_ALDN BIT(0) + + +//========== Register Address Definition ==================// +#define REG_PEON_PWR_CTRL 0x0200 +#define REG_PON_ISO_CTRL 0x0204 +#define REG_SOC_FUNC_EN 0x0210 +#define REG_SOC_HCI_COM_FUNC_EN 0x0214 +#define REG_SOC_PERI_FUNC0_EN 0x0218 +#define REG_SOC_PERI_FUNC1_EN 0x021C +#define REG_SOC_PERI_BD_FUNC0_EN 0x0220 +#define REG_PESOC_CLK_CTRL 0x0230 +#define REG_PESOC_PERI_CLK_CTRL0 0x0234 +#define REG_PESOC_PERI_CLK_CTRL1 0x0238 +#define REG_PESOC_CLK_CTRL3 0x023C +#define REG_PESOC_HCI_CLK_CTRL0 0x0240 +#define REG_PESOC_COM_CLK_CTRL1 0x0244 +#define REG_PESOC_HW_ENG_CLK_CTRL 0x0248 +#define REG_PESOC_CLK_SEL 0x0250 +#define REG_SYS_ANACK_CAL_CTRL 0x026C +#define REG_OSC32K_CTRL 0x0270 +#define REG_OSC32K_REG_CTRL0 0x0274 +#define REG_OSC32K_REG_CTRL1 0x0278 +#define REG_THERMAL_METER_CTRL 0x027C +#define REG_UART_MUX_CTRL 0x0280 +#define REG_SPI_MUX_CTRL 0x0284 +#define REG_I2C_MUX_CTRL 0x0288 +#define REG_I2S_MUX_CTRL 0x028C +#define REG_HCI_PINMUX_CTRL 0x02A0 +#define REG_WL_PINMUX_CTRL 0x02A4 +#define REG_BT_PINMUX_CTRL 0x02A8 +#define REG_PWM_PINMUX_CTRL 0x02AC +#define REG_CPU_PERIPHERAL_CTRL 0x02C0 +#define REG_HCI_CTRL_STATUS_0 0x02E0 +#define REG_HCI_CTRL_STATUS_1 0x02E4 +#define REG_PESOC_MEM_CTRL 0x0300 +#define REG_PESOC_SOC_CTRL 0x0304 +#define REG_PESOC_PERI_CTRL 0x0308 +#define REG_GPIO_SHTDN_CTRL 0x0320 +#define REG_GPIO_DRIVING_CTRL 0x0324 +#define REG_GPIO_PULL_CTRL0 0x0330 +#define REG_GPIO_PULL_CTRL1 0x0334 +#define REG_GPIO_PULL_CTRL2 0x0338 +#define REG_GPIO_PULL_CTRL3 0x033C +#define REG_GPIO_PULL_CTRL4 0x0340 +#define REG_GPIO_PULL_CTRL5 0x0344 +#define REG_GPIO_PULL_CTRL6 0x0348 +#define REG_PERI_PWM0_CTRL 0x0360 +#define REG_PERI_PWM1_CTRL 0x0364 +#define REG_PERI_PWM2_CTRL 0x0368 +#define REG_PERI_PWM3_CTRL 0x036C +#define REG_PERI_TIM_EVT_CTRL 0x0370 +#define REG_PERI_EGTIM_CTRL 0x0374 +#define REG_PEON_CFG 0x03F0 +#define REG_PEON_STATUS 0x03F4 + + +#endif // end of "#ifndef __INC_RTL8195A_PERI_ON_H" diff --git a/lib/fwlib/rtl8195a/rtl8195a_pwm.h b/lib/fwlib/rtl8195a/rtl8195a_pwm.h new file mode 100644 index 0000000..ddf166b --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_pwm.h @@ -0,0 +1,37 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_PWM_H_ +#define _RTL8195A_PWM_H_ + +extern void +HAL_Pwm_SetDuty_8195a( + HAL_PWM_ADAPTER *pPwmAdapt, + u32 period, + u32 pulse_width +); + +extern HAL_Status +HAL_Pwm_Init_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +); + +extern void +HAL_Pwm_Enable_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +); + +extern void +HAL_Pwm_Disable_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +); + + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_sdio.h b/lib/fwlib/rtl8195a/rtl8195a_sdio.h new file mode 100644 index 0000000..33ec5c4 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_sdio.h @@ -0,0 +1,1019 @@ + /* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_SDIO_H_ +#define _RTL8195A_SDIO_H_ + +#include "hal_api.h" +#include "hal_util.h" +#if defined(CONFIG_SDIO_BOOT_SIM) || defined(CONFIG_SDIO_BOOT_ROM) +#define SDIO_BOOT_DRIVER 1 // is this SDIO driver works for booting +#else +#include "osdep_api.h" +#define SDIO_BOOT_DRIVER 0 // is this SDIO driver works for booting +#endif + +#if defined(__IAR_SYSTEMS_ICC__) //for IAR SDK +#include "autoconf.h" +#endif + +#ifndef CONFIG_INIC_EN +#define CONFIG_INIC_EN 0 +#endif +#if CONFIG_INIC_EN +#define CONFIG_INIC_SKB_TX 0 //use SKB for trx to improve the throughput +#define CONFIG_INIC_SKB_RX 0 +#endif + +#ifndef PRIORITIE_OFFSET //PRIORITIE_OFFSET in FreeRTOSConfig.h +#define PRIORITIE_OFFSET 0 +#endif + +#define SDIO_DEBUG 0 +#define SDIO_MP_MODE 0 // if includes MP mode function +#define SDIO_MAX_WAIT_RX_DMA 100 // Wait RX DMA done +#define SDIO_RX_PKT_SIZE_OVER_16K 0 /* is support SDIO RX packet size > 16K. if true, + a big packet will be transmited via multiple RX_BD */ +#define SDIO_MAILBOX_SIZE 10 // the maximum number of message block can be stored in this mailbox +#define SDIO_PERIODICAL_TIMER_INTERVAL 2000 // in ms, the interval of SDIO periodical timer +#define SDIO_AVG_TP_WIN_SIZE 20 // the number of entry to log the byte count for every periodical timer statistic, to calculate throughput + +#define HAL_SDIO_READ32(addr) HAL_READ32(SDIO_DEVICE_REG_BASE, addr) +#define HAL_SDIO_WRITE32(addr, value) HAL_WRITE32(SDIO_DEVICE_REG_BASE, addr, value) +#define HAL_SDIO_READ16(addr) HAL_READ16(SDIO_DEVICE_REG_BASE, addr) +#define HAL_SDIO_WRITE16(addr, value) HAL_WRITE16(SDIO_DEVICE_REG_BASE, addr, value) +#define HAL_SDIO_READ8(addr) HAL_READ8(SDIO_DEVICE_REG_BASE, addr) +#define HAL_SDIO_WRITE8(addr, value) HAL_WRITE8(SDIO_DEVICE_REG_BASE, addr, value) + +/***** Register Address *****/ +#define REG_SPDIO_TXBD_ADDR 0xA0 // 4 Bytes +#define REG_SPDIO_TXBD_SIZE 0xA4 // 4 Bytes +#define REG_SPDIO_TXBD_WPTR 0xA8 // 2 Bytes +#define REG_SPDIO_TXBD_RPTR 0xAC // 2 Bytes +#define REG_SPDIO_RXBD_ADDR 0xB0 // 4 Bytes +#define REG_SPDIO_RXBD_SIZE 0xB4 // 2 Bytes +#define REG_SPDIO_RXBD_C2H_WPTR 0xB6 // 2 Bytes +#define REG_SPDIO_RXBD_C2H_RPTR 0xB8 // 2 Bytes +#define REG_SPDIO_HCI_RX_REQ 0xBA // 1 Byte +#define REG_SPDIO_CPU_RST_DMA 0xBB // 1 Byte +#define REG_SPDIO_RX_REQ_ADDR 0xBC // 2 Bytes +#define REG_SPDIO_CPU_INT_MASK 0xC0 // 2 Bytes +#define REG_SPDIO_CPU_INT_STAS 0xC2 // 2 Bytes +#define REG_SPDIO_CCPWM 0xC4 // 1 Byts +#define REG_SPDIO_CPU_IND 0xC5 // 1 Byte +#define REG_SPDIO_CCPWM2 0xC6 // 2 Bytes +#define REG_SPDIO_CPU_H2C_MSG 0xC8 // 4 Bytes +#define REG_SPDIO_CPU_C2H_MSG 0xCC // 4 Bytes +#define REG_SPDIO_CRPWM 0xD0 // 1 Bytes +#define REG_SPDIO_CRPWM2 0xD2 // 2 Bytes +#define REG_SPDIO_AHB_DMA_CTRL 0xD4 // 4 Bytes +#define REG_SPDIO_RXBD_CNT 0xD8 // 4 Bytes +#define REG_SPDIO_TX_BUF_UNIT_SZ 0xD9 // 1 Bytes +#define REG_SPDIO_RX_BD_FREE_CNT 0xDA // 2 Bytes +#define REG_SPDIO_CPU_H2C_MSG_EXT 0xDC // 4 Bytes +#define REG_SPDIO_CPU_C2H_MSG_EXT 0xE0 // 4 Bytes + +// Register REG_SPDIO_CPU_RST_DMA +#define BIT_CPU_RST_SDIO_DMA BIT(7) + +// Register REG_SPDIO_CPU_INT_MASK, REG_SPDIO_CPU_INT_STAS +#define BIT_TXFIFO_H2C_OVF BIT(0) +#define BIT_H2C_BUS_RES_FAIL BIT(1) +#define BIT_H2C_DMA_OK BIT(2) +#define BIT_C2H_DMA_OK BIT(3) +#define BIT_H2C_MSG_INT BIT(4) +#define BIT_RPWM1_INT BIT(5) +#define BIT_RPWM2_INT BIT(6) +#define BIT_SDIO_RST_CMD_INT BIT(7) +#define BIT_RXBD_FLAG_ERR_INT BIT(8) +#define BIT_RX_BD_AVAI_INT BIT(9) +#define BIT_HOST_WAKE_CPU_INT BIT(10) + +// Register REG_SPDIO_CPU_IND +#define BIT_SYSTEM_TRX_RDY_IND BIT(0) + +// Register REG_SPDIO_HCI_RX_REQ +#define BIT_HCI_RX_REQ BIT(0) + +/* Register for SOC_HCI_COM_FUN_EN */ +#define BIT_SOC_HCI_SDIOD_OFF_EN BIT(1) // SDIO Function Block on Power_Off domain +#define BIT_SOC_HCI_SDIOD_ON_EN BIT(0) // SDIO Function Block on Power_On domain + +/* Register REG_PESOC_HCI_CLK_CTRL0 */ +#define BIT_SOC_SLPCK_SDIO_HST_EN BIT(3) // SDIO_HST clock enable when CPU sleep command +#define BIT_SOC_ACTCK_SDIO_HST_EN BIT(2) // SDIO_HST clock enable in CPU run mode +#define BIT_SOC_SLPCK_SDIO_DEV_EN BIT(1) // SDIO_DEV clock enable when CPU sleep command +#define BIT_SOC_ACTCK_SDIO_DEV_EN BIT(0) // SDIO_DEV clock enable in CPU run mode + +/***** Structer for each Register *****/ +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) +// Little Endian +// Register REG_SPDIO_HCI_RX_REQ @ 0xBA +typedef struct _SPDIO_HCI_RX_REQ { + u8 HCI_RX_REQ:1; /* bit[0], CPU trigger this bit to enable SDIO IP RX transfer by fetch BD info */ + u8 Reserved:7; /* bit[7:1], Reserved */ +} SPDIO_HCI_RX_REQ, *PSPDIO_HCI_RX_REQ; + +// Register REG_SPDIO_CPU_RST_DMA @ 0xBB +typedef struct _SPDIO_CPU_RST_DMA { + u8 Reserved:7; /* bit[6:0], Reserved */ + u8 CPU_RST_SDIO:1; /* bit[7], CPU set this bit to reset SDIO DMA */ +} SPDIO_CPU_RST_DMA, *PSPDIO_CPU_RST_DMA; + +// Register REG_SPDIO_CPU_INT_MASK @ 0xC0 +typedef struct _SPDIO_CPU_INT_MASK { + u16 TXFIFO_H2C_OVF:1; /* bit[0], set 0 to mask TXFIFO_H2C_OVF_INT */ + u16 H2C_BUS_RES_FAIL:1; /* bit[1], set 0 to mask H2C_BUS_RES_FAIL_INT */ + u16 H2C_DMA_OK:1; /* bit[2], set 0 to mask H2C_DMA_OK_INT */ + u16 C2H_DMA_OK:1; /* bit[3], set 0 to mask C2H_DMA_OK_INT */ + u16 H2C_MSG_INT:1; /* bit[4], set 0 to mask H2C_MSG_INT_INT */ + u16 RPWM_INT:1; /* bit[5], set 0 to mask RPWM_INT */ + u16 RPWM2_INT:1; /* bit[6], set 0 to mask RPWM2_INT */ + u16 SDIO_RST_CMD_INT:1; /* bit[7], set 0 to mask SDIO_RST_CMD_INT */ + u16 BD_FLAG_ERR_INT:1; /* bit[8], set 0 to mask BD_FLAG_ERR_INT */ + u16 Reserved:7; /* bit[15:9], Reserved */ +} SPDIO_CPU_INT_MASK, *PSPDIO_CPU_INT_MASK; + +// Register REG_SPDIO_CPU_INT_STATUS @ 0xC2 +typedef struct _SPDIO_CPU_INT_STAS { + u16 TXFIFO_H2C_OVF:1; /* bit[0], set 0 to mask TXFIFO_H2C_OVF_INT */ + u16 H2C_BUS_RES_FAIL:1; /* bit[1], set 0 to mask H2C_BUS_RES_FAIL_INT */ + u16 H2C_DMA_OK:1; /* bit[2], set 0 to mask H2C_DMA_OK_INT */ + u16 C2H_DMA_OK:1; /* bit[3], set 0 to mask C2H_DMA_OK_INT */ + u16 H2C_MSG_INT:1; /* bit[4], set 0 to mask H2C_MSG_INT_INT */ + u16 RPWM_INT:1; /* bit[5], set 0 to mask RPWM_INT */ + u16 RPWM2_INT:1; /* bit[6], set 0 to mask RPWM2_INT */ + u16 SDIO_RST_CMD_INT:1; /* bit[7], set 0 to mask SDIO_RST_CMD_INT */ + u16 BD_FLAG_ERR_INT:1; /* bit[8], set 0 to mask BD_FLAG_ERR_INT */ + u16 Reserved:7; /* bit[15:9], Reserved */ +} SPDIO_CPU_INT_STAS, *PSPDIO_CPU_INT_STAS; + +// Register REG_SPDIO_CCPWM @ 0xC4 +typedef struct _SPDIO_CCPWM { + u8 :1; /* bit[0] */ + u8 WLAN_TRX:1; /* bit[1], 0: WLAN Off; 1: WLAN On */ + u8 RPS_ST:1; /* bit[2], 0/1: AP Register Sleep/Active state */ + u8 WWLAN:1; /* bit[3], 0/1: "Wake on WLAN"/"Normal" state */ + u8 Reserved:3; /* bit[6:4], Reserved */ + u8 TOGGLING:1; /* bit[7], issue interrupt when 0->1 or 1->0 */ +} SPDIO_CCPWM, *PSPDIO_CCPWM; + +// Register REG_SPDIO_CPU_IND @ 0xC5 +typedef struct _SPDIO_CPU_IND { + u8 SYS_TRX_RDY:1; /* bit[0], To indicate the Host system that CPU is ready for TRX + , to be sync to 0x87[0] */ + u8 Reserved:7; /* bit[7:1], Reserved */ +} SPDIO_CPU_IND, *PSPDIO_CPU_IND; + +// Register REG_SPDIO_CPU_H2C_MSG @ 0xC8 +typedef struct _SPDIO_CPU_H2C_MSG { + u32 CPU_H2C_MSG:30; /* bit[30:0], Host CPU to FW message, sync from REG_SDIO_H2C_MSG */ + u32 Reserved:1; /* bit[31], Reserved */ +} SPDIO_CPU_H2C_MSG, *PSPDIO_CPU_H2C_MSG; + +// Register REG_SPDIO_CPU_C2H_MSG @ 0xCC +typedef struct _SPDIO_CPU_C2H_MSG { + u32 CPU_C2H_MSG:30; /* bit[30:0], FW to Host CPU message, sync to REG_SDIO_C2H_MSG */ + u32 Reserved:1; /* bit[31], Reserved */ +} SPDIO_CPU_C2H_MSG, *PSPDIO_CPU_C2H_MSG; + +// Register REG_SPDIO_CRPWM @ 0xD0 +typedef struct _SPDIO_CRPWM { + u8 :1; /* bit[0] */ + u8 WLAN_TRX:1; /* bit[1], 0: WLAN Off; 1: WLAN On */ + u8 RPS_ST:1; /* bit[2], 0/1: AP Register Sleep/Active state */ + u8 WWLAN:1; /* bit[3], 0/1: "Wake on WLAN"/"Normal" state */ + u8 Reserved:3; /* bit[6:4], Reserved */ + u8 TOGGLING:1; /* bit[7], issue interrupt when 0->1 or 1->0 */ +} SPDIO_CRPWM, *PSPDIO_CRPWM; + +// Register REG_SPDIO_AHB_DMA_CTRL @ 0xD4 +typedef struct _SPDIO_AHB_DMA_CTRL { + u32 TXFF_WLEVEL:7; /* bit[6:0], SPDIO TX FIFO water level */ + u32 :1; /* bit[7] */ + u32 RXFF_WLEVEL:7; /* bit[14:8], SPDIO RX FIFO water level */ + u32 :1; /* bit[15] */ + u32 AHB_DMA_CS:4; /* bit[19:16], AHB DMA state */ + u32 :1; /* bit[20] */ + u32 AHB_MASTER_RDY:1; /* bit[21], AHB Master Hready signal */ + u32 AHB_DMA_TRANS:2; /* bit[23:22], AHB DMA Trans value, for debugging */ + u32 AHB_BUSY_WAIT_CNT:4; /* bit[27:24], timeout for AHB controller to wait busy */ + u32 AHB_BURST_TYPE:3; /* bit[30:28], AHB burst type */ + u32 DISPATCH_TXAGG:1; /* bit[31], Enable to dispatch aggregated TX packet */ +} SPDIO_AHB_DMA_CTRL, *PSPDIO_AHB_DMA_CTRL; + +#else /* else of '#if LITTLE_ENDIAN' */ +// Big Endian +typedef struct _SPDIO_HCI_RX_REQ { + u8 Reserved:7; /* bit[7:1], Reserved */ + u8 HCI_RX_REQ:1; /* bit[0], CPU trigger this bit to enable SDIO IP RX transfer by fetch BD info */ +} SPDIO_HCI_RX_REQ, *PSPDIO_HCI_RX_REQ; + +// Register REG_SPDIO_CPU_RST_DMA @ 0xBB +typedef struct _SPDIO_CPU_RST_DMA { + u8 CPU_RST_SDIO:1; /* bit[7], CPU set this bit to reset SDIO DMA */ + u8 Reserved:7; /* bit[6:0], Reserved */ +} SPDIO_CPU_RST_DMA, *PSPDIO_CPU_RST_DMA; + +// Register REG_SPDIO_CPU_INT_MASK @ 0xC0 +typedef struct _SPDIO_CPU_INT_MASK { + u16 Reserved:7; /* bit[15:9], Reserved */ + u16 BD_FLAG_ERR_INT:1; /* bit[8], set 0 to mask BD_FLAG_ERR_INT */ + u16 SDIO_RST_CMD_INT:1; /* bit[7], set 0 to mask SDIO_RST_CMD_INT */ + u16 RPWM2_INT:1; /* bit[6], set 0 to mask RPWM2_INT */ + u16 RPWM_INT:1; /* bit[5], set 0 to mask RPWM_INT */ + u16 H2C_MSG_INT:1; /* bit[4], set 0 to mask H2C_MSG_INT_INT */ + u16 C2H_DMA_OK:1; /* bit[3], set 0 to mask C2H_DMA_OK_INT */ + u16 H2C_DMA_OK:1; /* bit[2], set 0 to mask H2C_DMA_OK_INT */ + u16 H2C_BUS_RES_FAIL:1; /* bit[1], set 0 to mask H2C_BUS_RES_FAIL_INT */ + u16 TXFIFO_H2C_OVF:1; /* bit[0], set 0 to mask TXFIFO_H2C_OVF_INT */ +} SPDIO_CPU_INT_MASK, *PSPDIO_CPU_INT_MASK; + +// Register REG_SPDIO_CPU_INT_STAS @ 0xC2 +typedef struct _SPDIO_CPU_INT_STAS { + u16 Reserved:7; /* bit[15:9], Reserved */ + u16 BD_FLAG_ERR_INT:1; /* bit[8], set 0 to mask BD_FLAG_ERR_INT */ + u16 SDIO_RST_CMD_INT:1; /* bit[7], set 0 to mask SDIO_RST_CMD_INT */ + u16 RPWM2_INT:1; /* bit[6], set 0 to mask RPWM2_INT */ + u16 RPWM_INT:1; /* bit[5], set 0 to mask RPWM_INT */ + u16 H2C_MSG_INT:1; /* bit[4], set 0 to mask H2C_MSG_INT_INT */ + u16 C2H_DMA_OK:1; /* bit[3], set 0 to mask C2H_DMA_OK_INT */ + u16 H2C_DMA_OK:1; /* bit[2], set 0 to mask H2C_DMA_OK_INT */ + u16 H2C_BUS_RES_FAIL:1; /* bit[1], set 0 to mask H2C_BUS_RES_FAIL_INT */ + u16 TXFIFO_H2C_OVF:1; /* bit[0], set 0 to mask TXFIFO_H2C_OVF_INT */ +} SPDIO_CPU_INT_STAS, *PSPDIO_CPU_INT_STAS; + +// Register REG_SPDIO_CCPWM @ 0xC4 +typedef struct _SPDIO_CCPWM { + u8 TOGGLING:1; /* bit[7], issue interrupt when 0->1 or 1->0 */ + u8 Reserved:3; /* bit[6:4], Reserved */ + u8 WWLAN:1; /* bit[3], 0/1: "Wake on WLAN"/"Normal" state */ + u8 RPS_ST:1; /* bit[2], 0/1: AP Register Sleep/Active state */ + u8 WLAN_TRX:1; /* bit[1], 0: WLAN Off; 1: WLAN On */ + u8 :1; /* bit[0] */ +} SPDIO_CCPWM, *PSPDIO_CCPWM; + +// Register REG_SPDIO_CPU_IND @ 0xC5 +typedef struct _SPDIO_CPU_IND { + u8 Reserved:7; /* bit[7:1], Reserved */ + u8 SYS_TRX_RDY:1; /* bit[0], To indicate the Host system that CPU is ready for TRX + , to be sync to 0x87[0] */ +} SPDIO_CPU_IND, *PSPDIO_CPU_IND; + +// Register REG_SPDIO_CPU_H2C_MSG @ 0xC8 +typedef struct _SPDIO_CPU_H2C_MSG { + u32 Reserved:1; /* bit[31], Reserved */ + u32 CPU_H2C_MSG:30; /* bit[30:0], Host CPU to FW message */ +} SPDIO_CPU_H2C_MSG, *PSPDIO_CPU_H2C_MSG; + +// Register REG_SPDIO_CPU_C2H_MSG @ 0xCC +typedef struct _SPDIO_CPU_C2H_MSG { + u32 Reserved:1; /* bit[31], Reserved */ + u32 CPU_C2H_MSG:30; /* bit[30:0], FW to Host CPU message, sync to REG_SDIO_C2H_MSG */ +} SPDIO_CPU_C2H_MSG, *PSPDIO_CPU_C2H_MSG; + +// Register REG_SPDIO_CRPWM @ 0xD0 +typedef struct _SPDIO_CRPWM { + u8 TOGGLING:1; /* bit[7], issue interrupt when 0->1 or 1->0 */ + u8 Reserved:3; /* bit[6:4], Reserved */ + u8 WWLAN:1; /* bit[3], 0/1: "Wake on WLAN"/"Normal" state */ + u8 RPS_ST:1; /* bit[2], 0/1: AP Register Sleep/Active state */ + u8 WLAN_TRX:1; /* bit[1], 0: WLAN Off; 1: WLAN On */ + u8 :1; /* bit[0] */ +} SPDIO_CRPWM, *PSPDIO_CRPWM; + +// Register REG_SPDIO_AHB_DMA_CTRL @ 0xD4 +typedef struct _SPDIO_AHB_DMA_CTRL { + u32 DISPATCH_TXAGG:1; /* bit[31], Enable to dispatch aggregated TX packet */ + u32 AHB_BURST_TYPE:3; /* bit[30:28], AHB burst type */ + u32 AHB_BUSY_WAIT_CNT:4; /* bit[27:24], timeout for AHB controller to wait busy */ + u32 AHB_DMA_TRANS:2; /* bit[23:22], AHB DMA Trans value, for debugging */ + u32 AHB_MASTER_RDY:1; /* bit[21], AHB Master Hready signal */ + u32 :1; /* bit[20] */ + u32 AHB_DMA_CS:4; /* bit[19:16], AHB DMA state */ + u32 :1; /* bit[15] */ + u32 RXFF_WLEVEL:7; /* bit[14:8], SPDIO RX FIFO water level */ + u32 :1; /* bit[7] */ + u32 TXFF_WLEVEL:7; /* bit[6:0], SPDIO TX FIFO water level */ +} SPDIO_AHB_DMA_CTRL, *PSPDIO_AHB_DMA_CTRL; + +#endif /* end of '#if LITTLE_ENDIAN' */ + + +//#define TX_FIFO_ADDR 0x0000 +//#define TX_FIFO_SIZE 0x8000 + +//TX BD setting +#if SDIO_BOOT_DRIVER +// for build ROM library +#define SDIO_TX_BD_NUM 2 // Number of TX BD +#define SDIO_TX_BD_BUF_SIZE (2048+32) // the size of a TX BD pointed buffer, WLan header = 26 bytes +#define SDIO_TX_PKT_NUM 10 // Number of TX packet handler + +//RX BD setting +#define RX_BD_FREE_TH 4 // trigger the interrupt when free RX BD over this threshold + +#define MAX_RX_BD_BUF_SIZE 16380 // the Maximum size for a RX_BD point to, make it 4-bytes aligned + +#define SDIO_RX_PKT_NUM 3 // Number of RX packet handler +//#define SDIO_RX_BD_NUM 10 // Number of RX BD, to make 32K of bus aggregation, it needs 22 RX_BD at least +#define SDIO_RX_BD_NUM (SDIO_RX_PKT_NUM*2) // Number of RX BD, to make 32K of bus aggregation, it needs 22 RX_BD at least +#define SDIO_RX_BD_BUF_SIZE (2048+24) // the size of a RX BD pointed buffer, sizeof(RX Desc) = 26 bytes +#define MIN_RX_BD_SEND_PKT 2 /* the minum needed RX_BD to send a Packet to Host, we need 2: + one for RX_Desc, the other for payload */ + +// CCPWM2 bit map definition for Firmware download +#define SDIO_INIT_DONE (BIT0) +#define SDIO_MEM_WR_DONE (BIT1) +#define SDIO_MEM_RD_DONE (BIT2) +#define SDIO_MEM_ST_DONE (BIT3) + +#define SDIO_CPWM2_TOGGLE (BIT15) + +#else +#if CONFIG_INIC_EN +//TX BD setting +#define SDIO_TX_BD_NUM 34 // Number of TX BD +#define SDIO_TX_BD_BUF_SIZE 1540 //1514+24 +//#define SDIO_TX_PKT_NUM 1 // not used + +//RX BD setting +#define RX_BD_FREE_TH 5 // trigger the interrupt when free RX BD over this threshold +#define SDIO_RX_BD_BUF_SIZE 1540 //1514+24 +#define MAX_RX_BD_BUF_SIZE 16380 // the Maximum size for a RX_BD point to, make it 4-bytes aligned +#define SDIO_RX_BD_NUM 34 // Number of RX BD, to make 32K of bus aggregation, it needs 22 RX_BD at least +#define SDIO_RX_PKT_NUM 128 // Number of RX packet handler +#define MIN_RX_BD_SEND_PKT 2 /* the minum needed RX_BD to send a Packet to Host, we need 2: + one for RX_Desc, the other for payload */ + +#else +#define SDIO_TX_BD_NUM 24 // Number of TX BD +#define SDIO_TX_BD_BUF_SIZE (2048+32) // the size of a TX BD pointed buffer, WLan header = 26 bytes +#define SDIO_TX_PKT_NUM 128 // Number of TX packet handler + +//RX BD setting +#define RX_BD_FREE_TH 5 // trigger the interrupt when free RX BD over this threshold + +#define SDIO_RX_BD_BUF_SIZE 2048 +#define MAX_RX_BD_BUF_SIZE 16380 // the Maximum size for a RX_BD point to, make it 4-bytes aligned + +//#define SDIO_TX_FIFO_SIZE (1024*64) // 64K +#define SDIO_RX_BD_NUM 24 // Number of RX BD, to make 32K of bus aggregation, it needs 22 RX_BD at least +#define SDIO_RX_PKT_NUM 128 // Number of RX packet handler +#define MIN_RX_BD_SEND_PKT 2 /* the minum needed RX_BD to send a Packet to Host, we need 2: + one for RX_Desc, the other for payload */ +#endif +#endif + +#define SDIO_IRQ_PRIORITY 10 + +/* SDIO Events */ +#define SDIO_EVENT_IRQ BIT(0) // Interrupt triggered +#define SDIO_EVENT_RX_PKT_RDY BIT(1) // A new SDIO packet ready +#define SDIO_EVENT_C2H_DMA_DONE BIT(2) // Interrupt of C2H DMA done triggered +#define SDIO_EVENT_DUMP BIT(3) // SDIO status dump periodically Enable +#define SDIO_EVENT_TXBD_REFILL BIT(4) // To refill TX BD buffer +#define SDIO_EVENT_EXIT BIT(28) // Request to exit the SDIO task +#define SDIO_EVENT_MP_STOPPED BIT(29) // The SDIO task is stopped +#define SDIO_EVENT_TX_STOPPED BIT(30) // The SDIO task is stopped +#define SDIO_EVENT_RX_STOPPED BIT(31) // The SDIO task is stopped + +#define SDIO_TASK_PRIORITY 1 // it can be 0(lowest) ~ configMAX_PRIORITIES-1(highest) +#define SDIO_MP_TASK_PRIORITY 2 // it can be 0(lowest) ~ configMAX_PRIORITIES-1(highest) +//#if SDIO_TASK_PRIORITY > (configMAX_PRIORITIES - 1) +#if SDIO_TASK_PRIORITY > (4 - 1) +#error "SDIO Task Priority Should be 0~(configMAX_PRIORITIES-1)" +#endif + +//#define TX_RX_PACKET_SIZE 0x144 + +typedef struct _SDIO_TX_BD_ { + u32 Address; /* The TX buffer physical address, it must be 4-bytes aligned */ +}SDIO_TX_BD, *PSDIO_TX_BD; + +#define TX_BD_STRUCTURE_SIZE (sizeof(SDIO_TX_BD)) + + +/* The RX Buffer Descriptor format */ + +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) +typedef struct _SDIO_RX_BD_ { + u32 BuffSize:14; /* bit[13:0], RX Buffer Size, Maximum 16384-1 */ + u32 LS:1; /* bit[14], is the Last Segment ? */ + u32 FS:1; /* bit[15], is the First Segment ? */ + u32 Seq:16; /* bit[31:16], The sequence number, it's no use for now */ + u32 PhyAddr; /* The RX buffer physical address, it must be 4-bytes aligned */ +} SDIO_RX_BD, *PSDIO_RX_BD; +#else +typedef struct _SDIO_RX_BD_ { + u32 Seq:16; /* bit[31:16], The sequence number, be used for ?? */ + u32 FS:1; /* bit[15], is the First Segment ? */ + u32 LS:1; /* bit[14], is the Last Segment ? */ + u32 BuffSize:14; /* bit[13:0], RX Buffer Size, Maximum 16384 */ + u32 PhyAddr; /* The RX buffer physical address, it must be 4-bytes aligned */ +} SDIO_RX_BD, *PSDIO_RX_BD; +#endif +#define RX_BD_STRUCTURE_SIZE (sizeof(SDIO_RX_BD)) + +// TODO: This data structer just for test, we should modify it for the normal driver +typedef struct _SDIO_TX_DESC{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 txpktsize:16; // bit[15:0] + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number +#else + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 txpktsize:16; // bit[15:0] +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the packet type + u32 rsvd0:24; +#else + u32 rsvd0:24; + u32 type:8; // bit[7:0], the packet type +#endif + + // u4Byte 2 + u32 rsvd1; + + // u4Byte 3 + u32 rsvd2; + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_TX_DESC, *PSDIO_TX_DESC; + +// TX Desc for Memory Write command +typedef struct _SDIO_TX_DESC_MW{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 txpktsize:16; // bit[15:0] + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number +#else + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 txpktsize:16; // bit[15:0] +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the packet type + u32 reply:1; // bit[8], request to send a reply message + u32 rsvd0:23; +#else + u32 rsvd0:23; + u32 reply:1; // bit[8], request to send a reply message + u32 type:8; // bit[7:0], the packet type +#endif + + // u4Byte 2 + u32 start_addr; // memory write start address + + // u4Byte 3 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 write_len:16; // bit[15:0], the length to write + u32 rsvd2:16; // bit[31:16] +#else + u32 rsvd2:16; // bit[31:16] + u32 write_len:16; // bit[15:0], the length to write +#endif + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_TX_DESC_MW, *PSDIO_TX_DESC_MW; + +// TX Desc for Memory Read command +typedef struct _SDIO_TX_DESC_MR{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 txpktsize:16; // bit[15:0] + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number +#else + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 txpktsize:16; // bit[15:0] +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the packet type + u32 rsvd0:24; +#else + u32 rsvd0:24; + u32 type:8; // bit[7:0], the packet type +#endif + + // u4Byte 2 + u32 start_addr; // memory write start address + + // u4Byte 3 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 read_len:16; // bit[15:0], the length to read + u32 rsvd2:16; // bit[31:16] +#else + u32 rsvd2:16; // bit[31:16] + u32 read_len:16; // bit[15:0], the length to read +#endif + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_TX_DESC_MR, *PSDIO_TX_DESC_MR; + +// TX Desc for Memory Set command +typedef struct _SDIO_TX_DESC_MS{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 txpktsize:16; // bit[15:0] + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number +#else + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 txpktsize:16; // bit[15:0] +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the packet type + u32 data:8; // bit[8:15], the value to be written to the memory + u32 reply:1; // bit[16], request to send a reply message + u32 rsvd0:15; +#else + u32 rsvd0:15; + u32 reply:1; // bit[16], request to send a reply message + u32 data:8; // bit[8:15], the value to be written to the memory + u32 type:8; // bit[7:0], the packet type +#endif + + // u4Byte 2 + u32 start_addr; // memory write start address + + // u4Byte 3 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 write_len:16; // bit[15:0], the length to write + u32 rsvd2:16; // bit[31:16] +#else + u32 rsvd2:16; // bit[31:16] + u32 write_len:16; // bit[15:0], the length to write +#endif + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_TX_DESC_MS, *PSDIO_TX_DESC_MS; + +// TX Desc for Jump to Start command +typedef struct _SDIO_TX_DESC_JS{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 txpktsize:16; // bit[15:0] + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number +#else + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 txpktsize:16; // bit[15:0] +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the packet type + u32 rsvd0:24; +#else + u32 rsvd0:24; + u32 type:8; // bit[7:0], the packet type +#endif + + // u4Byte 2 + u32 start_fun; // the pointer of the startup function + + // u4Byte 3 + u32 rsvd2; + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_TX_DESC_JS, *PSDIO_TX_DESC_JS; + + +#define SIZE_TX_DESC (sizeof(SDIO_TX_DESC)) +// define the TX BD buffer size with unite of 64 byets +/* Be carefull!! the setting of hardware's TX BD buffer size may exceed the real size of + the TX BD buffer size, and then it may cause the hardware DMA write the buffer overflow */ +#define SDIO_TX_BUF_SZ_UNIT 64 +#define SDIO_TX_BD_BUF_USIZE ((((SDIO_TX_BD_BUF_SIZE+sizeof(SDIO_TX_DESC)-1)/SDIO_TX_BUF_SZ_UNIT)+1)&0xff) + +typedef struct _SDIO_TX_BD_BUFFER_ { + SDIO_TX_DESC TX_Desc; + u8 TX_Buffer[SDIO_TX_BD_BUF_SIZE]; +}SDIO_TX_BD_BUFFER, *PSDIO_TX_BD_BUFFER; + + +// TODO: This data structer just for test, we should modify it for the normal driver +typedef struct _SDIO_RX_DESC{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 pkt_len:16; // bit[15:0], the packet size + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 rsvd0:6; // bit[29:24] + u32 icv:1; // bit[30], ICV error + u32 crc:1; // bit[31], CRC error +#else + u32 crc:1; // bit[31], CRC error + u32 icv:1; // bit[30], ICV error + u32 rsvd0:6; // bit[29:24] + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 pkt_len:16; // bit[15:0], the packet size +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the type of this packet + u32 rsvd1:24; // bit[31:8] +#else + u32 rsvd1:24; // bit[31:8] + u32 type:8; // bit[7:0], the type of this packet +#endif + + // u4Byte 2 + u32 rsvd2; + + // u4Byte 3 + u32 rsvd3; + + // u4Byte 4 + u32 rsvd4; + + // u4Byte 5 + u32 rsvd5; +} SDIO_RX_DESC, *PSDIO_RX_DESC; + +// For memory read command +typedef struct _SDIO_RX_DESC_MR{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 pkt_len:16; // bit[15:0], the packet size + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 rsvd0:8; // bit[31:24] +#else + u32 rsvd0:8; // bit[31:24] + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 pkt_len:16; // bit[15:0], the packet size +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the type of this packet + u32 rsvd1:24; // bit[31:8] +#else + u32 rsvd1:24; // bit[31:8] + u32 type:8; // bit[7:0], the type of this packet +#endif + + // u4Byte 2 + u32 start_addr; + + // u4Byte 3 + u32 rsvd2; + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_RX_DESC_MR, *PSDIO_RX_DESC_MR; + +// For memory write reply command +typedef struct _SDIO_RX_DESC_MW{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 pkt_len:16; // bit[15:0], the packet size + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 rsvd0:8; // bit[31:24] +#else + u32 rsvd0:8; // bit[31:24] + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 pkt_len:16; // bit[15:0], the packet size +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the type of this packet + u32 rsvd1:24; // bit[31:8] +#else + u32 rsvd1:24; // bit[31:8] + u32 type:8; // bit[7:0], the type of this packet +#endif + + // u4Byte 2 + u32 start_addr; + + // u4Byte 3 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 write_len:16; // bit[15:0], the type of this packet + u32 result:8; // bit[23:16], the result of memory write command + u32 rsvd2:8; // bit[31:24] +#else + u32 rsvd2:8; // bit[31:24] + u32 result:8; // bit[23:16], the result of memory write command + u32 write_len:16; // bit[15:0], the type of this packet +#endif + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_RX_DESC_MW, *PSDIO_RX_DESC_MW; + +// For memory set reply command +typedef struct _SDIO_RX_DESC_MS{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 pkt_len:16; // bit[15:0], the packet size + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 rsvd0:8; // bit[31:24] +#else + u32 rsvd0:8; // bit[31:24] + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 pkt_len:16; // bit[15:0], the packet size +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the type of this packet + u32 rsvd1:24; // bit[31:8] +#else + u32 rsvd1:24; // bit[31:8] + u32 type:8; // bit[7:0], the type of this packet +#endif + + // u4Byte 2 + u32 start_addr; + + // u4Byte 3 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 write_len:16; // bit[15:0], the type of this packet + u32 result:8; // bit[23:16], the result of memory write command + u32 rsvd2:8; // bit[31:24] +#else + u32 rsvd2:8; // bit[31:24] + u32 result:8; // bit[23:16], the result of memory write command + u32 write_len:16; // bit[15:0], the type of this packet +#endif + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} SDIO_RX_DESC_MS, *PSDIO_RX_DESC_MS; + +#define SIZE_RX_DESC (sizeof(SDIO_RX_DESC)) + +typedef struct _SDIO_RX_BD_BUFFER_ { + SDIO_RX_DESC RX_Desc; + u8 RX_Buffer[SDIO_RX_BD_BUF_SIZE]; +}SDIO_RX_BD_BUFFER, *PSDIO_RX_BD_BUFFER; + + +/* The data structer for a packet fordwarding to the WLan driver to transmit it */ +// TODO: This data structer just for test, we may need modify it for the normal driver +typedef struct _SDIO_TX_PACKET_ { + u8 *pHeader; // Point to the 1st byte of the packets + u16 PktSize; // the size (bytes) of this packet + _LIST list; // the link list to chain packets + u8 isDyna; // is Dynamic allocated +} SDIO_TX_PACKET, *PSDIO_TX_PACKET; + +/* the data structer to bind a TX_BD with a TX Packet */ +typedef struct _SDIO_TX_BD_HANDLE_ { + SDIO_TX_BD *pTXBD; // Point to the TX_BD buffer +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX + struct sk_buff *skb; +#endif +#endif + SDIO_TX_PACKET *pPkt; // point to the Tx Packet + u8 isPktEnd; // For a packet over 1 BD , this flag to indicate is this BD contains a packet end + u8 isFree; // is this TX BD free +} SDIO_TX_BD_HANDLE, *PSDIO_TX_BD_HANDLE; + +/* The data structer for a packet which from the WLan driver to send to the Host */ +// TODO: This data structer just for test, we may need modify it for the normal driver + +#if SDIO_BOOT_DRIVER +typedef struct _SDIO_RX_PACKET_ { +// SDIO_RX_DESC RxDesc; // The RX Descriptor for this packet, to be send to Host ahead this packet + u8 *pData; // point to the head of payload of this packet + u16 Offset; // the offset from the pData to the payload buffer + _LIST list; // the link list to chain packets + u8 PktBuf[SDIO_RX_BD_BUF_SIZE]; // the Rx_Desc + payload data buffer, the first 24 bytes is reserved for RX_DESC +} SDIO_RX_PACKET, *PSDIO_RX_PACKET; +#else +typedef struct _SDIO_RX_PACKET_ { + SDIO_RX_DESC RxDesc; // The RX Descriptor for this packet, to be send to Host ahead this packet +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_RX + struct sk_buff *skb; +#endif +#endif + u8 *pData; // point to the head of payload of this packet + u16 Offset; // the offset from the pData to the payload buffer + _LIST list; // the link list to chain packets + u8 isDyna; // is Dynamic allocated +} SDIO_RX_PACKET, *PSDIO_RX_PACKET; +#endif + +/* the data structer to bind a RX_BD with a RX Packet */ +typedef struct _SDIO_RX_BD_HANDLE_ { + SDIO_RX_BD *pRXBD; // Point to the RX_BD buffer + SDIO_RX_PACKET *pPkt; // point to the Rx Packet + u8 isPktEnd; // For a packet over 1 BD , this flag to indicate is this BD contains a packet end + u8 isFree; // is this RX BD free (DMA done and its RX packet has been freed) +} SDIO_RX_BD_HANDLE, *PSDIO_RX_BD_HANDLE; + +#if SDIO_MP_MODE +typedef struct _SDIO_MP_CMD_ { + u8 cmd_name[16]; + u32 cmd_type; +} SDIO_MP_CMD, *PSDIO_MP_CMD; + +typedef enum _SDIO_MP_CMD_TYPE_{ + SDIO_MP_START=1, + SDIO_MP_STOP=2, + SDIO_MP_LOOPBACK=3, + SDIO_MP_STATUS=4, + SDIO_MP_READ_REG8=5, + SDIO_MP_READ_REG16=6, + SDIO_MP_READ_REG32=7, + SDIO_MP_WRITE_REG8=8, + SDIO_MP_WRITE_REG16=9, + SDIO_MP_WRITE_REG32=10, + SDIO_MP_WAKEUP=11, // wakeup the SDIO task manually, for debugging + SDIO_MP_DUMP=12, // start/stop to dump the SDIO status periodically + SDIO_MP_CTX=13, // setup continue TX test + SDIO_MP_CRX=14, // setup continue RX test + SDIO_MP_CRX_DA=15, // setup continue RX with dynamic allocate RX Buf test + SDIO_MP_CRX_STOP=16, // setup continue RX test + SDIO_MP_DBG_MSG=17, // Debug message On/Off + +}SDIO_MP_CMD_TYPE; + +typedef enum _SDIO_CRX_MODE_{ + SDIO_CRX_STATIC_BUF = 1, + SDIO_CRX_DYNA_BUF = 2, +} SDIO_CRX_MODE; + +typedef struct _SDIO_MP_RX_PACKET_ { + _LIST list; // this member MUST be the 1st one, the link list to chain packets + u8 *pData; // point to the head of payload of this packet + u16 Offset; // the offset from the pData to the payload + u16 DataLen; // the data length of this packet +} SDIO_MP_RX_PACKET, *PSDIO_MP_RX_PACKET; + +#endif // end of '#if SDIO_MP_MODE' + +#define SDIO_CMD_TX_ETH 0x83 // request to TX a 802.3 packet +#define SDIO_CMD_TX_WLN 0x81 // request to TX a 802.11 packet +#define SDIO_CMD_H2C 0x11 // H2C(host to device) command packet +#define SDIO_CMD_MEMRD 0x51 // request to read a block of memory data +#define SDIO_CMD_MEMWR 0x53 // request to write a block of memory +#define SDIO_CMD_MEMST 0x55 // request to set a block of memory with a value +#define SDIO_CMD_STARTUP 0x61 // request to jump to the start up function + +#define SDIO_CMD_RX_ETH 0x82 // indicate a RX 802.3 packet +#define SDIO_CMD_RX_WLN 0x80 // indicate a RX 802.11 packet +#define SDIO_CMD_C2H 0x10 // C2H(device to host) command packet +#define SDIO_CMD_MEMRD_RSP 0x50 // response to memory block read command +#define SDIO_CMD_MEMWR_RSP 0x52 // response to memory write command +#define SDIO_CMD_MEMST_RSP 0x54 // response to memory set command +#define SDIO_CMD_STARTED 0x60 // indicate the program has jumped to the given function + +enum SDIO_RPWM2_BITS { + RPWM2_ACT_BIT = BIT0, // Active + RPWM2_SLEEP_BIT = 0, // Sleep + RPWM2_DSTANDBY_BIT = BIT1, // Deep Standby + RPWM2_PG_BIT = 0, // Power Gated + RPWM2_FBOOT_BIT = BIT2, // fast reboot + RPWM2_NBOOT_BIT = 0, // normal reboot + RPWM2_WKPIN_A5_BIT = BIT3, // enable GPIO A5 wakeup + RPWM2_WKPIN_C7_BIT = BIT4, // enable GPIO C7 wakeup + RPWM2_WKPIN_D5_BIT = BIT5, // enable GPIO D5 wakeup + RPWM2_WKPIN_E3_BIT = BIT6, // enable GPIO E3 wakeup + RPWM2_PIN_A5_LV_BIT = BIT7, // GPIO A5 wakeup level + RPWM2_PIN_C7_LV_BIT = BIT8, // GPIO C7 wakeup level + RPWM2_PIN_D5_LV_BIT = BIT9, // GPIO D5 wakeup level + RPWM2_PIN_E3_LV_BIT = BIT10, // GPIO E3 wakeup level + RPWM2_CG_BIT = BIT11, // Clock Gated + RPWM2_ACK_BIT = BIT14, // Acknowledge + RPWM2_TOGGLE_BIT = BIT15, // Toggle bit +}; + +enum SDIO_CPWM2_BITS { + CPWM2_ACT_BIT = BIT0, // Active + CPWM2_DSTANDBY_BIT = BIT1, // Deep Standby + CPWM2_FBOOT_BIT = BIT2, // fast reboot + CPWM2_INIC_FW_RDY_BIT = BIT3, // is the iNIC FW(1) or Boot FW(0) + + CPWM2_TOGGLE_BIT = BIT15, // Toggle bit +}; + +#ifdef CONFIG_SDIO_DEVICE_VERIFY + +#define TX_BD_STRUCTURE_NUM 10 +#define RX_BD_STRUCTURE_NUM 10 +#define TX_BD_BUFFER_SIZE 0x1000//0x2000//0x800 +#define RX_BD_BUFFER_SIZE 0x400//0x800 + +#define SDIO_RAM_ADDR_BASE 0x20080000 +#define SDIO_BUFFER_HEAD(addr) SDIO_RAM_ADDR_BASE + addr +#define HAL_SDIO_BUFFER_READ8(addr) HAL_READ8(SDIO_RAM_ADDR_BASE, addr) +#define HAL_SDIO_BUFFER_READ32(addr) HAL_READ32(SDIO_RAM_ADDR_BASE, addr) +#define HAL_SDIO_BUFFER_WRITE32(addr, value) HAL_WRITE32(SDIO_RAM_ADDR_BASE, addr, value) + +//#define RX_BD_ADDR 0x8000 +//#define RX_BUFFER_ADDR 0x8050 + +typedef enum _SDIO_TEST_FUNC_ { + SDIO_TEST_INIT, // 0 + SDIO_TEST_INT_ON, // 1 + SDIO_TEST_INT_OFF, // 2 + SDIO_HCI_RX_REQ, // 3 + SDIO_RESET_TXFIFIO, // 4 + SDIO_CPU_RST_DMA, // 5 + SDIO_CPU_CLR_INT_REG, // 6 + SDIO_TIMER_TEST, // 7 + SDIO_TEST_DEBUG, // 8 + SDIO_TEST, // 9 + SDIO_HELP = 0xff +}SDIO_TEST_FUNC, *PSDIO_TEST_FUNC; + +typedef struct _SDIO_TEST_ADAPTER_ { + u32 TXWritePtr; + u32 TXReadPtr; + u16 RXWritePtr; + u16 RXReadPtr; + u16 IntMask; + u16 IntStatus; +} SDIO_TEST_ADAPTER, *PSDIO_TEST_ADAPTER; + + +VOID +MovePKTToRX( + IN u32 Source, IN u32 Destination, IN u32 PKTSize +); + +BOOL +PacketProcess( + IN SDIO_TEST_ADAPTER *pDevStatus +); + +VOID +SdioDeviceIrqHandleFunc( + IN VOID *DATA +); + +VOID +SdioDeviceTestApp( + IN u32 Data +); + +VOID +InitRXBD(VOID); + +VOID +InitTXFIFO(VOID); + +VOID +IrqRegister(VOID); + +#endif // end of "#ifdef CONFIG_SDIO_DEVICE_VERIFY" + +#endif /* #ifndef _RTL8195A_SDIO_H_ */ diff --git a/lib/fwlib/rtl8195a/rtl8195a_sdio_host.h b/lib/fwlib/rtl8195a/rtl8195a_sdio_host.h new file mode 100644 index 0000000..ee1f892 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_sdio_host.h @@ -0,0 +1,295 @@ + /* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_SDIO_HOST_H_ +#define _RTL8195A_SDIO_HOST_H_ + +#include "hal_api.h" +#include "osdep_api.h" + + + + +#ifdef CONFIG_SDIO_HOST_VERIFY + +#define HAL_MMC_HOST_READ32(addr) HAL_READ32(SDIO_HOST_REG_BASE, addr) +#define HAL_MMC_HOST_WRITE32(addr, value) HAL_WRITE32(SDIO_HOST_REG_BASE, addr, value) +#define HAL_MMC_HOST_READ16(addr) HAL_READ16(SDIO_HOST_REG_BASE, addr) +#define HAL_MMC_HOST_WRITE16(addr, value) HAL_WRITE16(SDIO_HOST_REG_BASE, addr, value) +#define HAL_MMC_HOST_READ8(addr) HAL_READ8(SDIO_HOST_REG_BASE, addr) +#define HAL_MMC_HOST_WRITE8(addr, value) HAL_WRITE8(SDIO_HOST_REG_BASE, addr, value) + +/* RTL8195A Register */ +// REG_SOC_HCI_COM_FUNC_EN (0x214) +#define SD_DEVICE_IP_ON_BLK BIT0 +#define SD_DEVICE_IP_OFF_BLK BIT1 +#define SD_HOST_IP_BLK BIT2 + +// REG_PESOC_HCI_CLK_CTRL0 (0x240) +#define SD_HOST_CLKEN_IN_CPU_RUN_MODE BIT2 + +// REG_HCI_PINMUX_CTRL (0x2A0) +#define SD_DEVICE_MODE_PINMUX_EN BIT0 +#define SD_HOST_MODE_PINMUX_EN BIT1 + +// 0x40059000 +#define SD_HOST_CARD_DETECT_CIRCUIT BIT10 + + + +/* SD Host Register */ +#define REG_SDMA_SYS_ADDR_ARG 0x00 // 4byte +#define REG_BLOCK_SIZE 0x04 // 2byte +#define REG_BLOCK_COUNT 0x06 // 2byte +#define REG_ARGUMENT1 0x08 // 4byte +#define REG_TRANSFER_MODE 0x0C // 2byte +#define REG_COMMAND 0x0E // 2byte +#define REG_RESPONSE0 0x10 // 4byte +#define REG_RESPONSE2 0x14 // 4byte +#define REG_RESPONSE4 0x18 // 4byte +#define REG_RESPONSE6 0x1C // 4byte +#define REG_BUFFER_DATA_PORT 0x20 // 4byte +#define REG_PRESENT_STATE 0x24 // 4byte +#define REG_HOST_CONTROL1 0x28 // 1byte +#define REG_POWER_CONTROL 0x29 // 1byte +#define REG_BLOCK_GAP_CONTROL 0x2A // 1byte +#define REG_WAKEUP_CONTROL 0x2B // 1byte +#define REG_CLOCK_CONTROL 0x2C // 2byte +#define REG_TIMEOUT_CONTROL 0x2E // 1byte +#define REG_SW_RESET 0x2F // 1byte +#define REG_NORMAL_INT_STATUS 0x30 // 2byte +#define REG_ERROR_INT_STATUS 0x32 // 2byte +#define REG_NORMAL_INT_STATUS_ENABLE 0x34 // 2byte +#define REG_ERROR_INT_STATUS_ENABLE 0x36 // 2byte +#define REG_NORMAL_INT_SIGNAL_ENABLE 0x38 // 2byte +#define REG_ERROR_INT_SIGNAL_ENABLE 0x3A // 2byte +#define REG_CAPABILITIES 0x40 // 8byte +#define REG_ADMA_ADDRESS 0x58 // 8byte + +// Transfer Mode (0x0C) +#define BIT_DMA_EN BIT0 +#define BIT_BLK_CNT_EN BIT1 +#define BIT_AUTO_CMD12_EN BIT2 +#define BIT_AUTO_CMD23_EN BIT3 +#define BIT_READ_TRANS BIT4 +#define BIT_MULTI_BLK BIT5 + +// Present State (0x24) +#define BIT_CMD_INHIBIT_CMD BIT0 +#define BIT_CMD_INHIBIT_DAT BIT1 +#define BIT_CARD_INSERTED BIT16 +#define BIT_WRITE_PROTECT_SWITCH_PIN BIT19 + +// Power Control (0x29) +#define BIT_POWER_33 0xE +#define BIT_POWER_30 0xC +#define BIT_POWER_18 0xA + +// Clock Control (0x2C) +#define BIT_INTERNAL_CLK_EN BIT0 +#define BIT_INTERNAL_CLK_STABLE BIT1 +#define BIT_SD_CLK_EN BIT2 + +// Software Reset (0x2F) +#define BIT_SW_RESET_ALL BIT0 +#define BIT_SW_RESET_CMD_LINE BIT1 +#define BIT_SW_RESET_DAT_LINE BIT2 + +// Norma Interrupt Status (0x30) +#define BIT_COMMAND_COMPLETE BIT0 +#define BIT_TRANSFER_COMPLETE BIT1 +#define BIT_BLOCK_GAP_EVENT BIT2 +#define BIT_DMA_INT BIT3 +#define BIT_BUFFER_WRITE_RDY BIT4 +#define BIT_BUFFER_READ_RDY BIT5 +#define BIT_CARD_INSERTION BIT6 +#define BIT_CARD_REMOVAL BIT7 +#define BIT_CARD_INT BIT8 +#define BIT_ERROR_INT BIT15 + +// Error Interrupt Status (0x32) +#define BIT_DATA_TIME_OUT_ERROR BIT4 +#define BIT_DATA_CRC_ERROR BIT5 +#define BIT_ADMA_ERROR BIT9 + +// Capabilities (0x40) +#define BIT_VDD_33 BIT24 +#define BIT_VDD_30 BIT25 +#define BIT_VDD_18 BIT26 + + +#define ENABLE 1 +#define DISABLE 0 + +#define ADMA_DESC_NUM 50 + +#define BUFFER_UNIT_SIZE 512 + +typedef enum _MMC_HOST_TEST_FUNC_ { + MMC_HOST_TEST_HW_INIT, // 0 + MMC_HOST_TEST_CARD_INIT, // 1 + MMC_HOST_TEST_SEND_CMD, // 2 + MMC_HOST_TEST_DEBUG, // 3 + MMC_HOST_TEST_SW_RESET, // 4 + MMC_HOST_TEST_READ_SINGLE, // 5 + MMC_HOST_TEST_WRITE_SINGLE, // 6 + MMC_HOST_TEST_READ_MULTI, // 7 + MMC_HOST_TEST_WRITE_MULTI, // 8 + MMC_HOST_TEST_SINGLE_LONGRUN, // 9 + MMC_HOST_TEST_MULTI_LONGRUN, // 10 + MMC_HOST_TEST_CARD_DETECTION, // 11 + MMC_HOST_TEST_WRITE_PROTECT, // 12 + MMC_HOST_TEST_REGISTER_RW // 13 +}MMC_HOST_TEST_FUNC; + +typedef enum _RESPONSE_TYPE_ { + No_Response, // 00b + Response_136, // 01b + Response_48, // 10b + Response_48_Busy // 11b +}RESPONSE_TYPE; + +typedef enum _COMMAND_TYPE_ { + Normal, // 00b + Suspend, // 01b + Resume, // 10b + Abort // 11b +}COMMAND_TYPE; + +typedef enum _DATA_PRESENT_ { + No_Data_Present, // 00b + Data_Present, // 01b +}DATA_PRESENT; + +typedef enum _SUPPLY_VOLTAGE_ { + MMC_VDD_27_28 = BIT15, + MMC_VDD_28_29 = BIT16, + MMC_VDD_29_30 = BIT17, + MMC_VDD_30_31 = BIT18, + MMC_VDD_31_32 = BIT19, + MMC_VDD_32_33 = BIT20, + MMC_VDD_33_34 = BIT21, + MMC_VDD_34_35 = BIT22, + MMC_VDD_35_36 = BIT23, +}SUPPLY_VOLTAGE; + +typedef enum _COMMAND_INDEX_ { + GO_IDLE_STATE = 0, + ALL_SEND_CID = 2, + SEND_RELATIVE_ADDR = 3, + SET_BUS_WIDTH = 6, + SELECT_CARD = 7, + SEND_IF_COND = 8, + SEND_CSD = 9, + STOP_TRANSMISSION = 12, + SEND_STATUS = 13, + READ_SINGLE_BLOCK = 17, + READ_MULTIPLE_BLOCK = 18, + WRITE_BLOCK = 24, + WRITE_MULTIPLE_BLOCK = 25, + SD_SEND_OP_COND = 41, + APP_CMD = 55, +}COMMAND_INDEX; + +typedef enum _TRANSFER_CONFIG_ { + Read_Data = 0, + Write_Data = 1, + Single_Block = 0, + Multiple_Block = 1, +}TRANSFER_CONFIG; + +typedef enum _ERROR_STATUS_ { + General_Error, // 0 + CRC_Error, // 1 + TIME_OUT_ERROR, // 2 + CRC_Error_NeedCMD12, // 3 + Transfer_OK // 4 +}ERROR_STATUS; + +typedef enum _CARD_CURRENT_STATE_ { + IDLE_STATE, + READY_STATE, + IDENT_STATE, + STBY_STATE, + TRAN_STATE, + DATA_STATE, + RCV_STATE, + PRG_STATE, + DIS_STATE, + UNKNOWN_STATE +}CARD_CURRENT_STATE; + +typedef struct _COMMAND_FORMAT_ +{ + u16 Resp_Type:2; + u16 Rsvd0:1; + u16 CMD_CRC_Chk:1; + u16 CMD_Idx_Chk:1; + u16 Data_Present:1; + u16 CMD_Type:2; + u16 CMD_Idx:6; + u16 Rsvd1:2; +}COMMAND_FORMAT, *PCOMMAND_FPRMAT; + +typedef struct _MMC_COMMAND +{ + COMMAND_FORMAT Cmd_Format; + u32 Arg; +}MMC_COMMAND; + +typedef struct _MMC_HOST_ +{ + u32 OCR_Avail; + u32 Resp[4]; + u32 CID[4]; + u32 RCA; +}MMC_HOST, *PMMC_HOST; + +typedef struct _ADMA_ATTR_ +{ + u16 Valid:1; + u16 End:1; + u16 Int:1; + u16 Rsvd1:1; + u16 Act1:1; + u16 Act2:1; + u16 Rsvd2:10; +}ADMA_ATTR, *PADMA_ATTR; +// 24 bytes +typedef struct _ADMA_DESC_TABLE_ +{ + // 1st buffer desc + ADMA_ATTR Attribute1; + u16 Length1; + u32 Address1; + // 2nd buffer desc + ADMA_ATTR Attribute2; + u16 Length2; + u32 Address2; + // 3rd buffer desc + ADMA_ATTR Attribute3; + u16 Length3; + u32 Address3; +}ADMA_DESC_TABLE, *PADMA_DESC_TABLE; +// 1024 bytes +typedef struct _ADMA_BUFFER_ +{ + u8 Data1[512]; /* 1st buffer */ + u8 Data2[512]; /* 2nd buffer */ +}ADMA_BUFFER, *PADMA_BUFFER; + + +VOID +SdHostTestApp( + IN u8 *argv[] +); +#endif // end of "#ifdef CONFIG_SDIO_HOST_VERIFY" + +#endif /* #ifndef _RTL8195A_SDIO_HOST_H_ */ diff --git a/lib/fwlib/rtl8195a/rtl8195a_sdr.h b/lib/fwlib/rtl8195a/rtl8195a_sdr.h new file mode 100644 index 0000000..05a13fa --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_sdr.h @@ -0,0 +1,379 @@ +#ifndef _RTL8195A_SDR_H +#define _RTL8195A_SDR_H + +#define MS_0_CTRL_BASE BSP_MS_I_DRAMC_0_BASE +#define MS_0_CTRL_PHY_BASE (BSP_MS_I_DRAMC_0_BASE) +#define MS_0_WRAP_BASE (MS_0_CTRL_BASE + 0x200) + +#define MS_1_CTRL_BASE BSP_MS_I_DRAMC_1_BASE +#define MS_1_CTRL_PHY_BASE (BSP_MS_I_DRAMC_1_BASE) +#define MS_1_WRAP_BASE (MS_1_CTRL_BASE + 0x200) + +#define MS_PCTL_CCR_OFFSET 0x000 +#define MS_PCTL_DCR_OFFSET 0x004 +#define MS_PCTL_IOCR_OFFSET 0x008 +#define MS_PCTL_CSR_OFFSET 0x00c +#define MS_PCTL_DRR_OFFSET 0x010 +#define MS_PCTL_TPR0_OFFSET 0x014 +#define MS_PCTL_TPR1_OFFSET 0x018 +#define MS_PCTL_TPR2_OFFSET 0x01c +#define MS_PCTL_MR_OFFSET 0x020 +#define MS_PCTL_EMR1_OFFSET 0x024 +#define MS_PCTL_EMR2_OFFSET 0x028 +#define MS_PCTL_EMR3_OFFSET 0x02c +#define MS_PCTL_CSR2_OFFSET 0x030 +#define MS_PCTL_SRST_OFFSET 0x034 +#define MS_PCTL_DTR2_OFFSET 0x038 +#define MS_PCTL_DTR3_OFFSET 0x03c +#define MS_PCTL_GDLLCR_OFFSET 0x040 +#define MS_PCTL_DLLCR0_OFFSET 0x044 +#define MS_PCTL_DLLCR1_OFFSET 0x048 +#define MS_PCTL_DLLCR2_OFFSET 0x04c +#define MS_PCTL_DLLCR3_OFFSET 0x050 +#define MS_PCTL_DLLCR4_OFFSET 0x054 +#define MS_PCTL_DLLCR5_OFFSET 0x058 +#define MS_PCTL_DLLCR6_OFFSET 0x05c +#define MS_PCTL_DLLCR7_OFFSET 0x060 +#define MS_PCTL_DLLCR8_OFFSET 0x064 +#define MS_PCTL_DQTR0_OFFSET 0x068 +#define MS_PCTL_DQTR1_OFFSET 0x06c +#define MS_PCTL_DQTR2_OFFSET 0x070 +#define MS_PCTL_DQTR3_OFFSET 0x074 +#define MS_PCTL_DQTR4_OFFSET 0x078 +#define MS_PCTL_DQTR5_OFFSET 0x07c +#define MS_PCTL_DQTR6_OFFSET 0x080 +#define MS_PCTL_DQTR7_OFFSET 0x084 +#define MS_PCTL_DQSTR_OFFSET 0x088 +#define MS_PCTL_DQSBTR_OFFSET 0x08c +#define MS_PCTL_ODTCR_OFFSET 0x090 +#define MS_PCTL_DTR0_OFFSET 0x094 +#define MS_PCTL_DTR1_OFFSET 0x098 +#define MS_PCTL_DTAR_OFFSET 0x09c +#define MS_PCTL_ZQCR0_OFFSET 0x0a0 +#define MS_PCTL_ZQCR1_OFFSET 0x0a4 +#define MS_PCTL_ZQSR_OFFSET 0x0a8 +#define MS_PCTL_RSLR0_OFFSET 0x0ac +#define MS_PCTL_RSLR1_OFFSET 0x0b0 +#define MS_PCTL_RSLR2_OFFSET 0x0b4 +#define MS_PCTL_RSLR3_OFFSET 0x0b8 +#define MS_PCTL_RDGR0_OFFSET 0x0bc +#define MS_PCTL_RDGR1_OFFSET 0x0c0 +#define MS_PCTL_RDGR2_OFFSET 0x0c4 +#define MS_PCTL_RDGR3_OFFSET 0x0c8 +#define MS_PCTL_MXSL_OFFSET 0x0cc + +#define MS_PCTL_BCR_OFFSET 0x0d0 +#define MS_PCTL_BALR0_OFFSET 0x0d4 +#define MS_PCTL_BALR1_OFFSET 0x0d8 +#define MS_PCTL_BDR0_OFFSET 0x0dc +#define MS_PCTL_BDR1_OFFSET 0x0e0 +#define MS_PCTL_BBR_OFFSET 0x0e4 +#define MS_PCTL_BSR_OFFSET 0x0e8 +#define MS_PCTL_BYR_OFFSET 0x0ec +#define MS_PCTL_BFA_OFFSET 0x0f0 +#define MS_PCTL_IDR_OFFSET 0x0f8 +#define MS_PCTL_ERR_OFFSET 0x0fc + +#define MS_WRAP_SCR_OFFSET 0x224 +#define MS_WRAP_QCR_OFFSET 0x230 +#define MS_WRAP_PCR_OFFSET 0x234 +#define MS_WRAP_QTR0_OFFSET 0x240 +#define MS_WRAP_QTR1_OFFSET 0x244 +#define MS_WRAP_QTR2_OFFSET 0x248 +#define MS_WRAP_QTR3_OFFSET 0x24c +#define MS_WRAP_QTR4_OFFSET 0x250 +#define MS_WRAP_QTR5_OFFSET 0x254 +#define MS_WRAP_QTR6_OFFSET 0x258 +#define MS_WRAP_QTR7_OFFSET 0x25c +#define MS_WRAP_QTR8_OFFSET 0x260 +#define MS_WRAP_QTR9_OFFSET 0x264 +#define MS_WRAP_QTR10_OFFSET 0x268 +#define MS_WRAP_QTR11_OFFSET 0x26c +#define MS_WRAP_QTR12_OFFSET 0x270 +#define MS_WRAP_QTR13_OFFSET 0x274 +#define MS_WRAP_QTR14_OFFSET 0x278 +#define MS_WRAP_QTR15_OFFSET 0x27c + +#define MS_PHY_DLY0 0x100 +#define MS_PHY_DLY1_RST 0x104 +#define MS_PHY_DLY_CLK 0x108 +#define MS_PHY_DLY_ST 0x10c +#define MS_PHY_DLY_NUM 0x100 + +#define PCTL_CCR_INIT_BFO 0 +#define PCTL_CCR_INIT_BFW 1 +#define PCTL_CCR_DTT_BFO 1 +#define PCTL_CCR_DTT_BFW 1 +#define PCTL_CCR_BTT_BFO 2 +#define PCTL_CCR_BTT_BFW 1 +#define PCTL_CCR_DPIT_BFO 3 +#define PCTL_CCR_DPIT_BFW 1 +#define PCTL_CCR_FLUSH_FIFO_BFO 8 +#define PCTL_CCR_FLUSH_FIFO_BFW 1 + +#define PCTL_DCR_DDR3_BFO 0 +#define PCTL_DCR_DDR3_BFW 1 +#define PCTL_DCR_SDR_BFO 1 +#define PCTL_DCR_SDR_BFW 1 +#define PCTL_DCR_DQ32_BFO 4 +#define PCTL_DCR_DQ32_BFW 1 +#define PCTL_DCR_DFI_RATE_BFO 8 +#define PCTL_DCR_DFI_RATE_BFW 3 + +#define PCTL_IOCR_RD_PIPE_BFO 8 +#define PCTL_IOCR_RD_PIPE_BFW 4 +#define PCTL_IOCR_TPHY_WD_BFO 12 +#define PCTL_IOCR_TPHY_WD_BFW 5 +#define PCTL_IOCR_TPHY_WL_BFO 17 +#define PCTL_IOCR_TPHY_WL_BFW 3 +#define PCTL_IOCR_TPHY_RD_EN_BFO 20 +#define PCTL_IOCR_TPHY_RD_EN_BFW 5 + +#define PCTL_CSR_MEM_IDLE_BFO 8 +#define PCTL_CSR_MEM_IDLE_BFW 1 +#define PCTL_CSR_DT_IDLE_BFO 9 +#define PCTL_CSR_DT_IDLE_BFW 1 +#define PCTL_CSR_BIST_IDLE_BFO 10 +#define PCTL_CSR_BIST_IDLE_BFW 1 +#define PCTL_CSR_DT_FAIL_BFO 11 +#define PCTL_CSR_DT_FAIL_BFW 1 +#define PCTL_CSR_BT_FAIL_BFO 12 +#define PCTL_CSR_BT_FAIL_BFW 1 + +#define PCTL_DRR_TRFC_BFO 0 +#define PCTL_DRR_TRFC_BFW 7 +#define PCTL_DRR_TREF_BFO 8 +#define PCTL_DRR_TREF_BFW 24 +#define PCTL_DRR_REF_NUM_BFO 24 +#define PCTL_DRR_REF_NUM_BFW 4 +#define PCTL_DRR_REF_DIS_BFO 28 +#define PCTL_DRR_REF_DIS_BFW 1 + +#define PCTL_TPR0_TRP_BFO 0 +#define PCTL_TPR0_TRP_BFW 4 +#define PCTL_TPR0_TRAS_BFO 4 +#define PCTL_TPR0_TRAS_BFW 5 +#define PCTL_TPR0_TWR_BFO 9 +#define PCTL_TPR0_TWR_BFW 4 +#define PCTL_TPR0_TRTP_BFO 13 +#define PCTL_TPR0_TRTP_BFW 3 + +#define PCTL_TPR1_TRRD_BFO 0 +#define PCTL_TPR1_TRRD_BFW 4 +#define PCTL_TPR1_TRC_BFO 4 +#define PCTL_TPR1_TRC_BFW 6 +#define PCTL_TPR1_TRCD_BFO 10 +#define PCTL_TPR1_TRCD_BFW 4 +#define PCTL_TPR1_TCCD_BFO 14 +#define PCTL_TPR1_TCCD_BFW 3 +#define PCTL_TPR1_TWTR_BFO 17 +#define PCTL_TPR1_TWTR_BFW 3 +#define PCTL_TPR1_TRTW_BFO 20 +#define PCTL_TPR1_TRTW_BFW 4 + +#define PCTL_TPR2_INIT_REF_NUM_BFO 0 +#define PCTL_TPR2_INIT_REF_NUM_BFW 4 +#define PCTL_TPR2_INIT_NS_EN_BFO 4 +#define PCTL_TPR2_INIT_NS_EN_BFW 1 +#define PCTL_TPR2_TMRD_BFO 5 +#define PCTL_TPR2_TMRD_BFW 2 + +#define PCTL_MR_BL_BFO 0 +#define PCTL_MR_BL_BFW 3 +#define PCTL_MR_BT_BFO 3 +#define PCTL_MR_BT_BFW 1 +#define PCTL_MR_CAS_BFO 4 +#define PCTL_MR_CAS_BFW 3 +#define PCTL_MR_OP_BFO 8 +#define PCTL_MR_OP_BFW 12 + +#define PCTL_EMR1_ADDLAT_BFO 3 +#define PCTL_EMR1_ADDLAT_BFW 3 + +#define PCTL_CMD_DPIN_RSTN_BFO 0 +#define PCTL_CMD_DPIN_RSTN_BFW 1 +#define PCTL_CMD_DPIN_CKE_BFO 1 +#define PCTL_CMD_DPIN_CKE_BFW 1 +#define PCTL_CMD_DPIN_ODT_BFO 2 +#define PCTL_CMD_DPIN_ODT_BFW 1 + +#define PCTL_BCR_STOP_BFO 0 +#define PCTL_BCR_STOP_BFW 1 +#define PCTL_BCR_CMP_BFO 1 +#define PCTL_BCR_CMP_BFW 1 +#define PCTL_BCR_LOOP_BFO 2 +#define PCTL_BCR_LOOP_BFW 1 +#define PCTL_BCR_DIS_MASK_BFO 3 +#define PCTL_BCR_DIS_MASK_BFW 1 +#define PCTL_BCR_AT_STOP_BFO 4 +#define PCTL_BCR_AT_STOP_BFW 1 +#define PCTL_BCR_FLUSH_CMD_BFO 8 +#define PCTL_BCR_FLUSH_CMD_BFW 1 +#define PCTL_BCR_FLUSH_WD_BFO 9 +#define PCTL_BCR_FLUSH_WD_BFW 1 +#define PCTL_BCR_FLUSH_RGD_BFO 10 +#define PCTL_BCR_FLUSH_RGD_BFW 1 +#define PCTL_BCR_FLUSH_RD_BFO 11 +#define PCTL_BCR_FLUSH_RD_BFW 1 +#define PCTL_BCR_FLUSH_RD_EXPC_BFO 16 +#define PCTL_BCR_FLUSH_RD_EXPC_BFW 14 + +#define PCTL_BST_ERR_FST_TH_BFO 0 +#define PCTL_BST_ERR_FST_TH_BFW 12 +#define PCTL_BST_ERR_CNT_BFO 16 +#define PCTL_BST_ERR_CNT_BFW 14 + +#define PCTL_BSRAM0_CMD_LEVEL_BFO 0 +#define PCTL_BSRAM0_CMD_LEVEL_BFW 12 +#define PCTL_BSRAM0_WD_LEVEL_BFO 16 +#define PCTL_BSRAM0_WD_LEVEL_BFW 14 + +#define PCTL_BSRAM1_RG_LEVEL_BFO 0 +#define PCTL_BSRAM1_RG_LEVEL_BFW 14 +#define PCTL_BSRAM1_RD_LEVEL_BFO 16 +#define PCTL_BSRAM1_RD_LEVEL_BFW 14 + +#define WRAP_MISC_PAGE_SIZE_BFO 0 +#define WRAP_MISC_PAGE_SIZE_BFW 4 +#define WRAP_MISC_BANK_SIZE_BFO 4 +#define WRAP_MISC_BANK_SIZE_BFW 2 +#define WRAP_MISC_BST_SIZE_BFO 6 +#define WRAP_MISC_BST_SIZE_BFW 2 +#define WRAP_MISC_DDR_PARAL_BFO 8 +#define WRAP_MISC_DDR_PARAL_BFW 1 + +struct ms_rxi310_portmap { + volatile unsigned int ccr; /* 0x000 */ + volatile unsigned int dcr; /* 0x004 */ + volatile unsigned int iocr; /* 0x008 */ + volatile unsigned int csr; /* 0x00c */ + volatile unsigned int drr; /* 0x010 */ + volatile unsigned int tpr0; /* 0x014 */ + volatile unsigned int tpr1; /* 0x018 */ + volatile unsigned int tpr2; /* 0x01c */ + volatile unsigned int mr; /* 0x020 */ + volatile unsigned int emr1; /* 0x024 */ + volatile unsigned int emr2; /* 0x028 */ + volatile unsigned int emr3; /* 0x02c */ + volatile unsigned int cdpin; /* 0x030 */ + volatile unsigned int tdpin; /* 0x034 */ + volatile unsigned int dtr2; /* 0x038 */ + volatile unsigned int dtr3; /* 0x03c */ + volatile unsigned int gdllcr; /* 0x040 */ + volatile unsigned int dllcr0; /* 0x044 */ + volatile unsigned int dllcr1; /* 0x048 */ + volatile unsigned int dllcr2; /* 0x04c */ + volatile unsigned int dllcr3; /* 0x050 */ + volatile unsigned int dllcr4; /* 0x054 */ + volatile unsigned int dllcr5; /* 0x058 */ + volatile unsigned int dllcr6; /* 0x05c */ + volatile unsigned int dllcr7; /* 0x060 */ + volatile unsigned int dllcr8; /* 0x064 */ + volatile unsigned int dqtr0; /* 0x068 */ + volatile unsigned int dqtr1; /* 0x06c */ + volatile unsigned int dqtr2; /* 0x070 */ + volatile unsigned int dqtr3; /* 0x074 */ + volatile unsigned int dqtr4; /* 0x078 */ + volatile unsigned int dqtr5; /* 0x07c */ + volatile unsigned int dqtr6; /* 0x080 */ + volatile unsigned int dqtr7; /* 0x084 */ + volatile unsigned int dqstr; /* 0x088 */ + volatile unsigned int dqsbtr; /* 0x08c */ + volatile unsigned int odtcr; /* 0x090 */ + volatile unsigned int dtr0; /* 0x094 */ + volatile unsigned int dtr1; /* 0x098 */ + volatile unsigned int dtar; /* 0x09c */ + volatile unsigned int zqcr0; /* 0x0a0 */ + volatile unsigned int zqcr1; /* 0x0a4 */ + volatile unsigned int zqsr; /* 0x0a8 */ + volatile unsigned int rslr0; /* 0x0ac */ + volatile unsigned int rslr1; /* 0x0b0 */ + volatile unsigned int rslr2; /* 0x0b4 */ + volatile unsigned int rslr3; /* 0x0b8 */ + volatile unsigned int rdgr0; /* 0x0bc */ + volatile unsigned int rdgr1; /* 0x0c0 */ + volatile unsigned int rdgr2; /* 0x0c4 */ + volatile unsigned int rdgr3; /* 0x0c8 */ + volatile unsigned int mxsl; /* 0x0cc */ + volatile unsigned int bcr; /* 0x0d0 */ + volatile unsigned int bst; /* 0x0d4 */ + volatile unsigned int bsram0; /* 0x0d8 */ + volatile unsigned int bsram1; /* 0x0dc */ + volatile unsigned int bdr1; /* 0x0e0 */ + volatile unsigned int bbr; /* 0x0e4 */ + volatile unsigned int bsr; /* 0x0e8 */ + volatile unsigned int byr; /* 0x0ec */ + volatile unsigned int bfa; /* 0x0f0 */ + volatile unsigned int pctl_svn; /* 0x0f4 */ + volatile unsigned int pctl_idr; /* 0x0f8 */ + volatile unsigned int err; /* 0x0fc */ + + // SDR_PHY CONTROL REGISTER + volatile unsigned int phy_dly0; /* 0x100 */ + volatile unsigned int phy_dly1_rst; /* 0x104 */ + volatile unsigned int phy_dly_clk; /* 0x108 */ + volatile unsigned int phy_dly_st; /* 0x10c */ + volatile unsigned int phy_dly_num; /* 0x110 */ + volatile unsigned int reserved0[68]; + + // WRAP CONTROL REGISTER + volatile unsigned int misc; /* 0x224 */ + volatile unsigned int cq_ver; /* 0x228 */ + volatile unsigned int cq_mon; /* 0x22c */ + volatile unsigned int wq_ver; /* 0x230 */ + volatile unsigned int wq_mon; /* 0x234 */ + volatile unsigned int rq_ver; /* 0x240 */ + volatile unsigned int rq_mon; /* 0x244 */ + volatile unsigned int reserved1[22]; + volatile unsigned int wwrap_idr; /* 0x2a0 */ + volatile unsigned int wrap_svn; /* 0x2a4 */ + +}; //ms_rxi310_portmap + +#define QFIFO_CMD_BANK_BFO (35 - QFIFO_CMD_WRRD_BFO) // [38:35] +#define QFIFO_CMD_BANK_BFW 4 +#define QFIFO_CMD_PAGE_BFO (20 - QFIFO_CMD_WRRD_BFO) // [34:20] +#define QFIFO_CMD_PAGE_BFW 15 +#define QFIFO_CMD_COLU_BFO (7 - QFIFO_CMD_WRRD_BFO) // [19: 7] +#define QFIFO_CMD_COLU_BFW 13 // [19: 7] +#define QFIFO_BST_LEN_BFO (3 - QFIFO_CMD_WRRD_BFO) // [6:3] +#define QFIFO_BST_LEN_BFW 4 // [6:3] +#define QFIFO_CMD_WRRD_BFO 2 // [2], remove bit[1:0] +#define QFIFO_CMD_WRRD_BFW 1 // [2], remove bit[1:0] + +//====================================================// + +#define REG_SDR_CCR 0x00 +#define REG_SDR_DCR 0x04 +#define REG_SDR_IOCR 0x08 +#define REG_SDR_CSR 0x0C +#define REG_SDR_DRR 0x10 +#define REG_SDR_TPR0 0x14 +#define REG_SDR_TPR1 0x18 +#define REG_SDR_TPR2 0x1C +#define REG_SDR_MR 0x20 +#define REG_SDR_EMR1 0x24 +#define REG_SDR_EMR2 0x28 +#define REG_SDR_EMR3 0x2C +#define REG_SDR_CMD_DPIN 0x30 +#define REG_SDR_TIE_DPIN 0x34 +#define REG_SDR_BCR 0xD0 +#define REG_SDR_BST 0xD4 +#define REG_SDR_BSRAM0 0xD8 +#define REG_SDR_BSRAM1 0xDC +#define REG_SDR_PCTL_SVN_ID 0xF4 +#define REG_SDR_PCTL_IDR 0xF8 +#define REG_SDR_DLY0 0x100 + +#define REG_SDR_DLY1 0x104 +#define REG_SDR_DCM_RST 0x104 + +#define REG_SDR_DLY_CLK_PHA 0x108 +#define REG_SDR_DLY_ST 0x10C + +#define REG_SDR_MISC 0x224 +#define REG_SDR_OCP_WRAP_IDR 0x2A0 +#define REG_SDR_OCP_WRAP_VERSION 0x2A4 + + +#endif // end of "#ifndef _RTL8195A_SDR_H" diff --git a/lib/fwlib/rtl8195a/rtl8195a_spi_flash.h b/lib/fwlib/rtl8195a/rtl8195a_spi_flash.h new file mode 100644 index 0000000..1ac2c16 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_spi_flash.h @@ -0,0 +1,990 @@ +#ifndef _RTL8195A_SPI_FLASH_H +#define _RTL8195A_SPI_FLASH_H + +#define CPU_OPT_WIDTH 0x1F + +//2 REG_NOT_VALID + +//2 REG_SPIC_CTRLR0 + +#define BIT_SHIFT_CK_MTIMES 23 +#define BIT_MASK_CK_MTIMES 0x1f +#define BIT_CK_MTIMES(x) (((x) & BIT_MASK_CK_MTIMES) << BIT_SHIFT_CK_MTIMES) +#define BIT_CTRL_CK_MTIMES(x) (((x) & BIT_MASK_CK_MTIMES) << BIT_SHIFT_CK_MTIMES) +#define BIT_GET_CK_MTIMES(x) (((x) >> BIT_SHIFT_CK_MTIMES) & BIT_MASK_CK_MTIMES) + +#define BIT_FAST_RD BIT(22) +#define BIT_SHIFT_FAST_RD 22 +#define BIT_MASK_FAST_RD 0x1 +#define BIT_CTRL_FAST_RD(x) (((x) & BIT_MASK_FAST_RD) << BIT_SHIFT_FAST_RD) + + +#define BIT_SHIFT_CMD_CH 20 +#define BIT_MASK_CMD_CH 0x3 +#define BIT_CMD_CH(x) (((x) & BIT_MASK_CMD_CH) << BIT_SHIFT_CMD_CH) +#define BIT_CTRL_CMD_CH(x) (((x) & BIT_MASK_CMD_CH) << BIT_SHIFT_CMD_CH) +#define BIT_GET_CMD_CH(x) (((x) >> BIT_SHIFT_CMD_CH) & BIT_MASK_CMD_CH) + + +#define BIT_SHIFT_DATA_CH 18 +#define BIT_MASK_DATA_CH 0x3 +#define BIT_DATA_CH(x) (((x) & BIT_MASK_DATA_CH) << BIT_SHIFT_DATA_CH) +#define BIT_CTRL_DATA_CH(x) (((x) & BIT_MASK_DATA_CH) << BIT_SHIFT_DATA_CH) +#define BIT_GET_DATA_CH(x) (((x) >> BIT_SHIFT_DATA_CH) & BIT_MASK_DATA_CH) + + +#define BIT_SHIFT_ADDR_CH 16 +#define BIT_MASK_ADDR_CH 0x3 +#define BIT_ADDR_CH(x) (((x) & BIT_MASK_ADDR_CH) << BIT_SHIFT_ADDR_CH) +#define BIT_CTRL_ADDR_CH(x) (((x) & BIT_MASK_ADDR_CH) << BIT_SHIFT_ADDR_CH) +#define BIT_GET_ADDR_CH(x) (((x) >> BIT_SHIFT_ADDR_CH) & BIT_MASK_ADDR_CH) + + +#define BIT_SHIFT_TMOD 8 +#define BIT_MASK_TMOD 0x3 +#define BIT_TMOD(x) (((x) & BIT_MASK_TMOD) << BIT_SHIFT_TMOD) +#define BIT_CTRL_TMOD(x) (((x) & BIT_MASK_TMOD) << BIT_SHIFT_TMOD) +#define BIT_GET_TMOD(x) (((x) >> BIT_SHIFT_TMOD) & BIT_MASK_TMOD) + +#define BIT_SCPOL BIT(7) +#define BIT_SHIFT_SCPOL 7 +#define BIT_MASK_SCPOL 0x1 +#define BIT_CTRL_SCPOL(x) (((x) & BIT_MASK_SCPOL) << BIT_SHIFT_SCPOL) + +#define BIT_SCPH BIT(6) +#define BIT_SHIFT_SCPH 6 +#define BIT_MASK_SCPH 0x1 +#define BIT_CTRL_SCPH(x) (((x) & BIT_MASK_SCPH) << BIT_SHIFT_SCPH) + +//2 REG_SPIC_CTRLR1 + +#define BIT_SHIFT_NDF 0 +#define BIT_MASK_NDF 0xfff +#define BIT_NDF(x) (((x) & BIT_MASK_NDF) << BIT_SHIFT_NDF) +#define BIT_CTRL_NDF(x) (((x) & BIT_MASK_NDF) << BIT_SHIFT_NDF) +#define BIT_GET_NDF(x) (((x) >> BIT_SHIFT_NDF) & BIT_MASK_NDF) + + +//2 REG_SPIC_SSIENR +#define BIT_ATCK_CMD BIT(1) +#define BIT_SHIFT_ATCK_CMD 1 +#define BIT_MASK_ATCK_CMD 0x1 +#define BIT_CTRL_ATCK_CMD(x) (((x) & BIT_MASK_ATCK_CMD) << BIT_SHIFT_ATCK_CMD) + +#define BIT_SPIC_EN BIT(0) +#define BIT_SHIFT_SPIC_EN 0 +#define BIT_MASK_SPIC_EN 0x1 +#define BIT_CTRL_SPIC_EN(x) (((x) & BIT_MASK_SPIC_EN) << BIT_SHIFT_SPIC_EN) + +//2 REG_SPIC_MWCR + +//2 REG_SPIC_SER +#define BIT_SER BIT(0) +#define BIT_SHIFT_SER 0 +#define BIT_MASK_SER 0x1 +#define BIT_CTRL_SER(x) (((x) & BIT_MASK_SER) << BIT_SHIFT_SER) + +//2 REG_SPIC_BAUDR + +#define BIT_SHIFT_SCKDV 0 +#define BIT_MASK_SCKDV 0xffff +#define BIT_SCKDV(x) (((x) & BIT_MASK_SCKDV) << BIT_SHIFT_SCKDV) +#define BIT_CTRL_SCKDV(x) (((x) & BIT_MASK_SCKDV) << BIT_SHIFT_SCKDV) +#define BIT_GET_SCKDV(x) (((x) >> BIT_SHIFT_SCKDV) & BIT_MASK_SCKDV) + + +//2 REG_SPIC_TXFTLR + +#define BIT_SHIFT_TFT 0 +#define BIT_MASK_TFT 0x1f +#define BIT_TFT(x) (((x) & BIT_MASK_TFT) << BIT_SHIFT_TFT) +#define BIT_CTRL_TFT(x) (((x) & BIT_MASK_TFT) << BIT_SHIFT_TFT) +#define BIT_GET_TFT(x) (((x) >> BIT_SHIFT_TFT) & BIT_MASK_TFT) + + +//2 REG_SPIC_RXFTLR + +#define BIT_SHIFT_RFT 0 +#define BIT_MASK_RFT 0x1f +#define BIT_RFT(x) (((x) & BIT_MASK_RFT) << BIT_SHIFT_RFT) +#define BIT_CTRL_RFT(x) (((x) & BIT_MASK_RFT) << BIT_SHIFT_RFT) +#define BIT_GET_RFT(x) (((x) >> BIT_SHIFT_RFT) & BIT_MASK_RFT) + + +//2 REG_SPIC_TXFLR + +#define BIT_SHIFT_TXFL 0 +#define BIT_MASK_TXFL 0x3f +#define BIT_TXFL(x) (((x) & BIT_MASK_TXFL) << BIT_SHIFT_TXFL) +#define BIT_CTRL_TXFL(x) (((x) & BIT_MASK_TXFL) << BIT_SHIFT_TXFL) +#define BIT_GET_TXFL(x) (((x) >> BIT_SHIFT_TXFL) & BIT_MASK_TXFL) + + +//2 REG_SPIC_RXFLR + +#define BIT_SHIFT_RXFL 0 +#define BIT_MASK_RXFL 0x3f +#define BIT_RXFL(x) (((x) & BIT_MASK_RXFL) << BIT_SHIFT_RXFL) +#define BIT_CTRL_RXFL(x) (((x) & BIT_MASK_RXFL) << BIT_SHIFT_RXFL) +#define BIT_GET_RXFL(x) (((x) >> BIT_SHIFT_RXFL) & BIT_MASK_RXFL) + + +//2 REG_SPIC_SR +#define BIT_TXE BIT(5) +#define BIT_SHIFT_TXE 5 +#define BIT_MASK_TXE 0x1 +#define BIT_CTRL_TXE(x) (((x) & BIT_MASK_TXE) << BIT_SHIFT_TXE) + +#define BIT_RFF BIT(4) +#define BIT_SHIFT_RFF 4 +#define BIT_MASK_RFF 0x1 +#define BIT_CTRL_RFF(x) (((x) & BIT_MASK_RFF) << BIT_SHIFT_RFF) + +#define BIT_RFNE BIT(3) +#define BIT_SHIFT_RFNE 3 +#define BIT_MASK_RFNE 0x1 +#define BIT_CTRL_RFNE(x) (((x) & BIT_MASK_RFNE) << BIT_SHIFT_RFNE) + +#define BIT_TFE BIT(2) +#define BIT_SHIFT_TFE 2 +#define BIT_MASK_TFE 0x1 +#define BIT_CTRL_TFE(x) (((x) & BIT_MASK_TFE) << BIT_SHIFT_TFE) + +#define BIT_TFNF BIT(1) +#define BIT_SHIFT_TFNF 1 +#define BIT_MASK_TFNF 0x1 +#define BIT_CTRL_TFNF(x) (((x) & BIT_MASK_TFNF) << BIT_SHIFT_TFNF) + +#define BIT_BUSY BIT(0) +#define BIT_SHIFT_BUSY 0 +#define BIT_MASK_BUSY 0x1 +#define BIT_CTRL_BUSY(x) (((x) & BIT_MASK_BUSY) << BIT_SHIFT_BUSY) + +//2 REG_SPIC_IMR +#define BIT_TXSIM BIT(9) +#define BIT_SHIFT_TXSIM 9 +#define BIT_MASK_TXSIM 0x1 +#define BIT_CTRL_TXSIM(x) (((x) & BIT_MASK_TXSIM) << BIT_SHIFT_TXSIM) + +#define BIT_ACEIM BIT(8) +#define BIT_SHIFT_ACEIM 8 +#define BIT_MASK_ACEIM 0x1 +#define BIT_CTRL_ACEIM(x) (((x) & BIT_MASK_ACEIM) << BIT_SHIFT_ACEIM) + +#define BIT_BYEIM BIT(7) +#define BIT_SHIFT_BYEIM 7 +#define BIT_MASK_BYEIM 0x1 +#define BIT_CTRL_BYEIM(x) (((x) & BIT_MASK_BYEIM) << BIT_SHIFT_BYEIM) + +#define BIT_WBEIM BIT(6) +#define BIT_SHIFT_WBEIM 6 +#define BIT_MASK_WBEIM 0x1 +#define BIT_CTRL_WBEIM(x) (((x) & BIT_MASK_WBEIM) << BIT_SHIFT_WBEIM) + +#define BIT_FSEIM BIT(5) +#define BIT_SHIFT_FSEIM 5 +#define BIT_MASK_FSEIM 0x1 +#define BIT_CTRL_FSEIM(x) (((x) & BIT_MASK_FSEIM) << BIT_SHIFT_FSEIM) + +#define BIT_RXFIM BIT(4) +#define BIT_SHIFT_RXFIM 4 +#define BIT_MASK_RXFIM 0x1 +#define BIT_CTRL_RXFIM(x) (((x) & BIT_MASK_RXFIM) << BIT_SHIFT_RXFIM) + +#define BIT_RXOIM BIT(3) +#define BIT_SHIFT_RXOIM 3 +#define BIT_MASK_RXOIM 0x1 +#define BIT_CTRL_RXOIM(x) (((x) & BIT_MASK_RXOIM) << BIT_SHIFT_RXOIM) + +#define BIT_RXUIM BIT(2) +#define BIT_SHIFT_RXUIM 2 +#define BIT_MASK_RXUIM 0x1 +#define BIT_CTRL_RXUIM(x) (((x) & BIT_MASK_RXUIM) << BIT_SHIFT_RXUIM) + +#define BIT_TXOIM BIT(1) +#define BIT_SHIFT_TXOIM 1 +#define BIT_MASK_TXOIM 0x1 +#define BIT_CTRL_TXOIM(x) (((x) & BIT_MASK_TXOIM) << BIT_SHIFT_TXOIM) + +#define BIT_TXEIM BIT(0) +#define BIT_SHIFT_TXEIM 0 +#define BIT_MASK_TXEIM 0x1 +#define BIT_CTRL_TXEIM(x) (((x) & BIT_MASK_TXEIM) << BIT_SHIFT_TXEIM) + +//2 REG_SPIC_ISR +#define BIT_TXSIS BIT(9) +#define BIT_SHIFT_TXSIS 9 +#define BIT_MASK_TXSIS 0x1 +#define BIT_CTRL_TXSIS(x) (((x) & BIT_MASK_TXSIS) << BIT_SHIFT_TXSIS) + +#define BIT_ACEIS BIT(8) +#define BIT_SHIFT_ACEIS 8 +#define BIT_MASK_ACEIS 0x1 +#define BIT_CTRL_ACEIS(x) (((x) & BIT_MASK_ACEIS) << BIT_SHIFT_ACEIS) + +#define BIT_BYEIS BIT(7) +#define BIT_SHIFT_BYEIS 7 +#define BIT_MASK_BYEIS 0x1 +#define BIT_CTRL_BYEIS(x) (((x) & BIT_MASK_BYEIS) << BIT_SHIFT_BYEIS) + +#define BIT_WBEIS BIT(6) +#define BIT_SHIFT_WBEIS 6 +#define BIT_MASK_WBEIS 0x1 +#define BIT_CTRL_WBEIS(x) (((x) & BIT_MASK_WBEIS) << BIT_SHIFT_WBEIS) + +#define BIT_FSEIS BIT(5) +#define BIT_SHIFT_FSEIS 5 +#define BIT_MASK_FSEIS 0x1 +#define BIT_CTRL_FSEIS(x) (((x) & BIT_MASK_FSEIS) << BIT_SHIFT_FSEIS) + +#define BIT_RXFIS BIT(4) +#define BIT_SHIFT_RXFIS 4 +#define BIT_MASK_RXFIS 0x1 +#define BIT_CTRL_RXFIS(x) (((x) & BIT_MASK_RXFIS) << BIT_SHIFT_RXFIS) + +#define BIT_RXOIS BIT(3) +#define BIT_SHIFT_RXOIS 3 +#define BIT_MASK_RXOIS 0x1 +#define BIT_CTRL_RXOIS(x) (((x) & BIT_MASK_RXOIS) << BIT_SHIFT_RXOIS) + +#define BIT_RXUIS BIT(2) +#define BIT_SHIFT_RXUIS 2 +#define BIT_MASK_RXUIS 0x1 +#define BIT_CTRL_RXUIS(x) (((x) & BIT_MASK_RXUIS) << BIT_SHIFT_RXUIS) + +#define BIT_TXOIS BIT(1) +#define BIT_SHIFT_TXOIS 1 +#define BIT_MASK_TXOIS 0x1 +#define BIT_CTRL_TXOIS(x) (((x) & BIT_MASK_TXOIS) << BIT_SHIFT_TXOIS) + +#define BIT_TXEIS BIT(0) +#define BIT_SHIFT_TXEIS 0 +#define BIT_MASK_TXEIS 0x1 +#define BIT_CTRL_TXEIS(x) (((x) & BIT_MASK_TXEIS) << BIT_SHIFT_TXEIS) + +//2 REG_SPIC_RISR +#define BIT_ACEIR BIT(8) +#define BIT_SHIFT_ACEIR 8 +#define BIT_MASK_ACEIR 0x1 +#define BIT_CTRL_ACEIR(x) (((x) & BIT_MASK_ACEIR) << BIT_SHIFT_ACEIR) + +#define BIT_BYEIR BIT(7) +#define BIT_SHIFT_BYEIR 7 +#define BIT_MASK_BYEIR 0x1 +#define BIT_CTRL_BYEIR(x) (((x) & BIT_MASK_BYEIR) << BIT_SHIFT_BYEIR) + +#define BIT_WBEIR BIT(6) +#define BIT_SHIFT_WBEIR 6 +#define BIT_MASK_WBEIR 0x1 +#define BIT_CTRL_WBEIR(x) (((x) & BIT_MASK_WBEIR) << BIT_SHIFT_WBEIR) + +#define BIT_FSEIR BIT(5) +#define BIT_SHIFT_FSEIR 5 +#define BIT_MASK_FSEIR 0x1 +#define BIT_CTRL_FSEIR(x) (((x) & BIT_MASK_FSEIR) << BIT_SHIFT_FSEIR) + +#define BIT_RXFIR BIT(4) +#define BIT_SHIFT_RXFIR 4 +#define BIT_MASK_RXFIR 0x1 +#define BIT_CTRL_RXFIR(x) (((x) & BIT_MASK_RXFIR) << BIT_SHIFT_RXFIR) + +#define BIT_RXOIR BIT(3) +#define BIT_SHIFT_RXOIR 3 +#define BIT_MASK_RXOIR 0x1 +#define BIT_CTRL_RXOIR(x) (((x) & BIT_MASK_RXOIR) << BIT_SHIFT_RXOIR) + +#define BIT_RXUIR BIT(2) +#define BIT_SHIFT_RXUIR 2 +#define BIT_MASK_RXUIR 0x1 +#define BIT_CTRL_RXUIR(x) (((x) & BIT_MASK_RXUIR) << BIT_SHIFT_RXUIR) + +#define BIT_TXOIR BIT(1) +#define BIT_SHIFT_TXOIR 1 +#define BIT_MASK_TXOIR 0x1 +#define BIT_CTRL_TXOIR(x) (((x) & BIT_MASK_TXOIR) << BIT_SHIFT_TXOIR) + +#define BIT_TXEIR BIT(0) +#define BIT_SHIFT_TXEIR 0 +#define BIT_MASK_TXEIR 0x1 +#define BIT_CTRL_TXEIR(x) (((x) & BIT_MASK_TXEIR) << BIT_SHIFT_TXEIR) + +//2 REG_SPIC_TXOICR +#define BIT_TXOICR BIT(0) +#define BIT_SHIFT_TXOICR 0 +#define BIT_MASK_TXOICR 0x1 +#define BIT_CTRL_TXOICR(x) (((x) & BIT_MASK_TXOICR) << BIT_SHIFT_TXOICR) + +//2 REG_SPIC_RXOICR +#define BIT_RXOCIR BIT(0) +#define BIT_SHIFT_RXOCIR 0 +#define BIT_MASK_RXOCIR 0x1 +#define BIT_CTRL_RXOCIR(x) (((x) & BIT_MASK_RXOCIR) << BIT_SHIFT_RXOCIR) + +//2 REG_SPC_RXUICR +#define BIT_RXUICR BIT(0) +#define BIT_SHIFT_RXUICR 0 +#define BIT_MASK_RXUICR 0x1 +#define BIT_CTRL_RXUICR(x) (((x) & BIT_MASK_RXUICR) << BIT_SHIFT_RXUICR) + +//2 REG_SPIC_MSTICR +#define BIT_MSTICR BIT(0) +#define BIT_SHIFT_MSTICR 0 +#define BIT_MASK_MSTICR 0x1 +#define BIT_CTRL_MSTICR(x) (((x) & BIT_MASK_MSTICR) << BIT_SHIFT_MSTICR) + +//2 REG_SPIC_ICR + +#define BIT_SHIFT_ICR 0 +#define BIT_MASK_ICR 0xff +#define BIT_ICR(x) (((x) & BIT_MASK_ICR) << BIT_SHIFT_ICR) +#define BIT_CTRL_ICR(x) (((x) & BIT_MASK_ICR) << BIT_SHIFT_ICR) +#define BIT_GET_ICR(x) (((x) >> BIT_SHIFT_ICR) & BIT_MASK_ICR) + + +//2 REG_SPIC_DMACR + +//2 REG_SPIC_DMATDLR0 + +//2 REG_SPIC_DMATDLR1 + +//2 REG_SPIC_IDR + +#define BIT_SHIFT_IDCODE 0 +#define BIT_MASK_IDCODE 0xffffffffL +#define BIT_IDCODE(x) (((x) & BIT_MASK_IDCODE) << BIT_SHIFT_IDCODE) +#define BIT_CTRL_IDCODE(x) (((x) & BIT_MASK_IDCODE) << BIT_SHIFT_IDCODE) +#define BIT_GET_IDCODE(x) (((x) >> BIT_SHIFT_IDCODE) & BIT_MASK_IDCODE) + + +//2 REG_SPIC_VERSION + +#define BIT_SHIFT_SPIC_VERSION 0 +#define BIT_MASK_SPIC_VERSION 0xffffffffL +#define BIT_SPIC_VERSION(x) (((x) & BIT_MASK_SPIC_VERSION) << BIT_SHIFT_SPIC_VERSION) +#define BIT_CTRL_SPIC_VERSION(x) (((x) & BIT_MASK_SPIC_VERSION) << BIT_SHIFT_SPIC_VERSION) +#define BIT_GET_SPIC_VERSION(x) (((x) >> BIT_SHIFT_SPIC_VERSION) & BIT_MASK_SPIC_VERSION) + + +//2 REG_SPIC_DR0 + +#define BIT_SHIFT_DR0 0 +#define BIT_MASK_DR0 0xffffffffL +#define BIT_DR0(x) (((x) & BIT_MASK_DR0) << BIT_SHIFT_DR0) +#define BIT_CTRL_DR0(x) (((x) & BIT_MASK_DR0) << BIT_SHIFT_DR0) +#define BIT_GET_DR0(x) (((x) >> BIT_SHIFT_DR0) & BIT_MASK_DR0) + + +//2 REG_SPIC_DR1 + +#define BIT_SHIFT_DR1 0 +#define BIT_MASK_DR1 0xffffffffL +#define BIT_DR1(x) (((x) & BIT_MASK_DR1) << BIT_SHIFT_DR1) +#define BIT_CTRL_DR1(x) (((x) & BIT_MASK_DR1) << BIT_SHIFT_DR1) +#define BIT_GET_DR1(x) (((x) >> BIT_SHIFT_DR1) & BIT_MASK_DR1) + + +//2 REG_SPIC_DR2 + +#define BIT_SHIFT_DR2 0 +#define BIT_MASK_DR2 0xffffffffL +#define BIT_DR2(x) (((x) & BIT_MASK_DR2) << BIT_SHIFT_DR2) +#define BIT_CTRL_DR2(x) (((x) & BIT_MASK_DR2) << BIT_SHIFT_DR2) +#define BIT_GET_DR2(x) (((x) >> BIT_SHIFT_DR2) & BIT_MASK_DR2) + + +//2 REG_SPIC_DR3 + +#define BIT_SHIFT_DR3 0 +#define BIT_MASK_DR3 0xffffffffL +#define BIT_DR3(x) (((x) & BIT_MASK_DR3) << BIT_SHIFT_DR3) +#define BIT_CTRL_DR3(x) (((x) & BIT_MASK_DR3) << BIT_SHIFT_DR3) +#define BIT_GET_DR3(x) (((x) >> BIT_SHIFT_DR3) & BIT_MASK_DR3) + + +//2 REG_SPIC_DR4 + +#define BIT_SHIFT_DR4 0 +#define BIT_MASK_DR4 0xffffffffL +#define BIT_DR4(x) (((x) & BIT_MASK_DR4) << BIT_SHIFT_DR4) +#define BIT_CTRL_DR4(x) (((x) & BIT_MASK_DR4) << BIT_SHIFT_DR4) +#define BIT_GET_DR4(x) (((x) >> BIT_SHIFT_DR4) & BIT_MASK_DR4) + + +//2 REG_SPIC_DR5 + +#define BIT_SHIFT_DR5 0 +#define BIT_MASK_DR5 0xffffffffL +#define BIT_DR5(x) (((x) & BIT_MASK_DR5) << BIT_SHIFT_DR5) +#define BIT_CTRL_DR5(x) (((x) & BIT_MASK_DR5) << BIT_SHIFT_DR5) +#define BIT_GET_DR5(x) (((x) >> BIT_SHIFT_DR5) & BIT_MASK_DR5) + + +//2 REG_SPIC_DR6 + +#define BIT_SHIFT_DR6 0 +#define BIT_MASK_DR6 0xffffffffL +#define BIT_DR6(x) (((x) & BIT_MASK_DR6) << BIT_SHIFT_DR6) +#define BIT_CTRL_DR6(x) (((x) & BIT_MASK_DR6) << BIT_SHIFT_DR6) +#define BIT_GET_DR6(x) (((x) >> BIT_SHIFT_DR6) & BIT_MASK_DR6) + + +//2 REG_SPIC_DR7 + +#define BIT_SHIFT_DR7 0 +#define BIT_MASK_DR7 0xffffffffL +#define BIT_DR7(x) (((x) & BIT_MASK_DR7) << BIT_SHIFT_DR7) +#define BIT_CTRL_DR7(x) (((x) & BIT_MASK_DR7) << BIT_SHIFT_DR7) +#define BIT_GET_DR7(x) (((x) >> BIT_SHIFT_DR7) & BIT_MASK_DR7) + + +//2 REG_SPIC_DR8 + +#define BIT_SHIFT_DR8 0 +#define BIT_MASK_DR8 0xffffffffL +#define BIT_DR8(x) (((x) & BIT_MASK_DR8) << BIT_SHIFT_DR8) +#define BIT_CTRL_DR8(x) (((x) & BIT_MASK_DR8) << BIT_SHIFT_DR8) +#define BIT_GET_DR8(x) (((x) >> BIT_SHIFT_DR8) & BIT_MASK_DR8) + + +//2 REG_SPIC_DR9 + +#define BIT_SHIFT_DR9 0 +#define BIT_MASK_DR9 0xffffffffL +#define BIT_DR9(x) (((x) & BIT_MASK_DR9) << BIT_SHIFT_DR9) +#define BIT_CTRL_DR9(x) (((x) & BIT_MASK_DR9) << BIT_SHIFT_DR9) +#define BIT_GET_DR9(x) (((x) >> BIT_SHIFT_DR9) & BIT_MASK_DR9) + + +//2 REG_SPIC_DR10 + +#define BIT_SHIFT_DR10 0 +#define BIT_MASK_DR10 0xffffffffL +#define BIT_DR10(x) (((x) & BIT_MASK_DR10) << BIT_SHIFT_DR10) +#define BIT_CTRL_DR10(x) (((x) & BIT_MASK_DR10) << BIT_SHIFT_DR10) +#define BIT_GET_DR10(x) (((x) >> BIT_SHIFT_DR10) & BIT_MASK_DR10) + + +//2 REG_SPIC_DR11 + +#define BIT_SHIFT_DR11 0 +#define BIT_MASK_DR11 0xffffffffL +#define BIT_DR11(x) (((x) & BIT_MASK_DR11) << BIT_SHIFT_DR11) +#define BIT_CTRL_DR11(x) (((x) & BIT_MASK_DR11) << BIT_SHIFT_DR11) +#define BIT_GET_DR11(x) (((x) >> BIT_SHIFT_DR11) & BIT_MASK_DR11) + + +//2 REG_SPIC_DR12 + +#define BIT_SHIFT_DR12 0 +#define BIT_MASK_DR12 0xffffffffL +#define BIT_DR12(x) (((x) & BIT_MASK_DR12) << BIT_SHIFT_DR12) +#define BIT_CTRL_DR12(x) (((x) & BIT_MASK_DR12) << BIT_SHIFT_DR12) +#define BIT_GET_DR12(x) (((x) >> BIT_SHIFT_DR12) & BIT_MASK_DR12) + + +//2 REG_SPIC_DR13 + +#define BIT_SHIFT_DR13 0 +#define BIT_MASK_DR13 0xffffffffL +#define BIT_DR13(x) (((x) & BIT_MASK_DR13) << BIT_SHIFT_DR13) +#define BIT_CTRL_DR13(x) (((x) & BIT_MASK_DR13) << BIT_SHIFT_DR13) +#define BIT_GET_DR13(x) (((x) >> BIT_SHIFT_DR13) & BIT_MASK_DR13) + + +//2 REG_SPIC_DR14 + +#define BIT_SHIFT_DR14 0 +#define BIT_MASK_DR14 0xffffffffL +#define BIT_DR14(x) (((x) & BIT_MASK_DR14) << BIT_SHIFT_DR14) +#define BIT_CTRL_DR14(x) (((x) & BIT_MASK_DR14) << BIT_SHIFT_DR14) +#define BIT_GET_DR14(x) (((x) >> BIT_SHIFT_DR14) & BIT_MASK_DR14) + + +//2 REG_SPIC_DR15 + +#define BIT_SHIFT_DR15 0 +#define BIT_MASK_DR15 0xffffffffL +#define BIT_DR15(x) (((x) & BIT_MASK_DR15) << BIT_SHIFT_DR15) +#define BIT_CTRL_DR15(x) (((x) & BIT_MASK_DR15) << BIT_SHIFT_DR15) +#define BIT_GET_DR15(x) (((x) >> BIT_SHIFT_DR15) & BIT_MASK_DR15) + + +//2 REG_SPIC_DR16 + +#define BIT_SHIFT_DR16 0 +#define BIT_MASK_DR16 0xffffffffL +#define BIT_DR16(x) (((x) & BIT_MASK_DR16) << BIT_SHIFT_DR16) +#define BIT_CTRL_DR16(x) (((x) & BIT_MASK_DR16) << BIT_SHIFT_DR16) +#define BIT_GET_DR16(x) (((x) >> BIT_SHIFT_DR16) & BIT_MASK_DR16) + + +//2 REG_SPIC_DR17 + +#define BIT_SHIFT_DR17 0 +#define BIT_MASK_DR17 0xffffffffL +#define BIT_DR17(x) (((x) & BIT_MASK_DR17) << BIT_SHIFT_DR17) +#define BIT_CTRL_DR17(x) (((x) & BIT_MASK_DR17) << BIT_SHIFT_DR17) +#define BIT_GET_DR17(x) (((x) >> BIT_SHIFT_DR17) & BIT_MASK_DR17) + + +//2 REG_SPIC_DR18 + +#define BIT_SHIFT_DR18 0 +#define BIT_MASK_DR18 0xffffffffL +#define BIT_DR18(x) (((x) & BIT_MASK_DR18) << BIT_SHIFT_DR18) +#define BIT_CTRL_DR18(x) (((x) & BIT_MASK_DR18) << BIT_SHIFT_DR18) +#define BIT_GET_DR18(x) (((x) >> BIT_SHIFT_DR18) & BIT_MASK_DR18) + + +//2 REG_SPIC_DR19 + +#define BIT_SHIFT_DR19 0 +#define BIT_MASK_DR19 0xffffffffL +#define BIT_DR19(x) (((x) & BIT_MASK_DR19) << BIT_SHIFT_DR19) +#define BIT_CTRL_DR19(x) (((x) & BIT_MASK_DR19) << BIT_SHIFT_DR19) +#define BIT_GET_DR19(x) (((x) >> BIT_SHIFT_DR19) & BIT_MASK_DR19) + + +//2 REG_SPIC_DR20 + +#define BIT_SHIFT_DR20 0 +#define BIT_MASK_DR20 0xffffffffL +#define BIT_DR20(x) (((x) & BIT_MASK_DR20) << BIT_SHIFT_DR20) +#define BIT_CTRL_DR20(x) (((x) & BIT_MASK_DR20) << BIT_SHIFT_DR20) +#define BIT_GET_DR20(x) (((x) >> BIT_SHIFT_DR20) & BIT_MASK_DR20) + + +//2 REG_SPIC_DR21 + +#define BIT_SHIFT_DR21 0 +#define BIT_MASK_DR21 0xffffffffL +#define BIT_DR21(x) (((x) & BIT_MASK_DR21) << BIT_SHIFT_DR21) +#define BIT_CTRL_DR21(x) (((x) & BIT_MASK_DR21) << BIT_SHIFT_DR21) +#define BIT_GET_DR21(x) (((x) >> BIT_SHIFT_DR21) & BIT_MASK_DR21) + + +//2 REG_SPIC_DR22 + +#define BIT_SHIFT_DR22 0 +#define BIT_MASK_DR22 0xffffffffL +#define BIT_DR22(x) (((x) & BIT_MASK_DR22) << BIT_SHIFT_DR22) +#define BIT_CTRL_DR22(x) (((x) & BIT_MASK_DR22) << BIT_SHIFT_DR22) +#define BIT_GET_DR22(x) (((x) >> BIT_SHIFT_DR22) & BIT_MASK_DR22) + + +//2 REG_SPIC_DR23 + +#define BIT_SHIFT_DR23 0 +#define BIT_MASK_DR23 0xffffffffL +#define BIT_DR23(x) (((x) & BIT_MASK_DR23) << BIT_SHIFT_DR23) +#define BIT_CTRL_DR23(x) (((x) & BIT_MASK_DR23) << BIT_SHIFT_DR23) +#define BIT_GET_DR23(x) (((x) >> BIT_SHIFT_DR23) & BIT_MASK_DR23) + + +//2 REG_SPIC_DR24 + +#define BIT_SHIFT_DR24 0 +#define BIT_MASK_DR24 0xffffffffL +#define BIT_DR24(x) (((x) & BIT_MASK_DR24) << BIT_SHIFT_DR24) +#define BIT_CTRL_DR24(x) (((x) & BIT_MASK_DR24) << BIT_SHIFT_DR24) +#define BIT_GET_DR24(x) (((x) >> BIT_SHIFT_DR24) & BIT_MASK_DR24) + + +//2 REG_SPIC_DR25 + +#define BIT_SHIFT_DR25 0 +#define BIT_MASK_DR25 0xffffffffL +#define BIT_DR25(x) (((x) & BIT_MASK_DR25) << BIT_SHIFT_DR25) +#define BIT_CTRL_DR25(x) (((x) & BIT_MASK_DR25) << BIT_SHIFT_DR25) +#define BIT_GET_DR25(x) (((x) >> BIT_SHIFT_DR25) & BIT_MASK_DR25) + + +//2 REG_SPIC_DR26 + +#define BIT_SHIFT_DR26 0 +#define BIT_MASK_DR26 0xffffffffL +#define BIT_DR26(x) (((x) & BIT_MASK_DR26) << BIT_SHIFT_DR26) +#define BIT_CTRL_DR26(x) (((x) & BIT_MASK_DR26) << BIT_SHIFT_DR26) +#define BIT_GET_DR26(x) (((x) >> BIT_SHIFT_DR26) & BIT_MASK_DR26) + + +//2 REG_SPIC_DR27 + +#define BIT_SHIFT_DR27 0 +#define BIT_MASK_DR27 0xffffffffL +#define BIT_DR27(x) (((x) & BIT_MASK_DR27) << BIT_SHIFT_DR27) +#define BIT_CTRL_DR27(x) (((x) & BIT_MASK_DR27) << BIT_SHIFT_DR27) +#define BIT_GET_DR27(x) (((x) >> BIT_SHIFT_DR27) & BIT_MASK_DR27) + + +//2 REG_SPIC_DR28 + +#define BIT_SHIFT_DR28 0 +#define BIT_MASK_DR28 0xffffffffL +#define BIT_DR28(x) (((x) & BIT_MASK_DR28) << BIT_SHIFT_DR28) +#define BIT_CTRL_DR28(x) (((x) & BIT_MASK_DR28) << BIT_SHIFT_DR28) +#define BIT_GET_DR28(x) (((x) >> BIT_SHIFT_DR28) & BIT_MASK_DR28) + + +//2 REG_SPIC_DR29 + +#define BIT_SHIFT_DR29 0 +#define BIT_MASK_DR29 0xffffffffL +#define BIT_DR29(x) (((x) & BIT_MASK_DR29) << BIT_SHIFT_DR29) +#define BIT_CTRL_DR29(x) (((x) & BIT_MASK_DR29) << BIT_SHIFT_DR29) +#define BIT_GET_DR29(x) (((x) >> BIT_SHIFT_DR29) & BIT_MASK_DR29) + + +//2 REG_SPIC_DR30 + +#define BIT_SHIFT_DR30 0 +#define BIT_MASK_DR30 0xffffffffL +#define BIT_DR30(x) (((x) & BIT_MASK_DR30) << BIT_SHIFT_DR30) +#define BIT_CTRL_DR30(x) (((x) & BIT_MASK_DR30) << BIT_SHIFT_DR30) +#define BIT_GET_DR30(x) (((x) >> BIT_SHIFT_DR30) & BIT_MASK_DR30) + + +//2 REG_SPIC_DR31 + +#define BIT_SHIFT_DR31 0 +#define BIT_MASK_DR31 0xffffffffL +#define BIT_DR31(x) (((x) & BIT_MASK_DR31) << BIT_SHIFT_DR31) +#define BIT_CTRL_DR31(x) (((x) & BIT_MASK_DR31) << BIT_SHIFT_DR31) +#define BIT_GET_DR31(x) (((x) >> BIT_SHIFT_DR31) & BIT_MASK_DR31) + + +//2 REG_SPIC_READ_FAST_SINGLE + +#define BIT_SHIFT_FRD_CMD 0 +#define BIT_MASK_FRD_CMD 0xff +#define BIT_FRD_CMD(x) (((x) & BIT_MASK_FRD_CMD) << BIT_SHIFT_FRD_CMD) +#define BIT_CTRL_FRD_CMD(x) (((x) & BIT_MASK_FRD_CMD) << BIT_SHIFT_FRD_CMD) +#define BIT_GET_FRD_CMD(x) (((x) >> BIT_SHIFT_FRD_CMD) & BIT_MASK_FRD_CMD) + + +//2 REG_SPIC_READ_DUAL_DATA + +#define BIT_SHIFT_RD_DUAL_O_CMD 0 +#define BIT_MASK_RD_DUAL_O_CMD 0xff +#define BIT_RD_DUAL_O_CMD(x) (((x) & BIT_MASK_RD_DUAL_O_CMD) << BIT_SHIFT_RD_DUAL_O_CMD) +#define BIT_CTRL_RD_DUAL_O_CMD(x) (((x) & BIT_MASK_RD_DUAL_O_CMD) << BIT_SHIFT_RD_DUAL_O_CMD) +#define BIT_GET_RD_DUAL_O_CMD(x) (((x) >> BIT_SHIFT_RD_DUAL_O_CMD) & BIT_MASK_RD_DUAL_O_CMD) + + +//2 REG_SPIC_READ_DUAL_ADDR_DATA + +#define BIT_SHIFT_RD_DUAL_IO_CMD 0 +#define BIT_MASK_RD_DUAL_IO_CMD 0xff +#define BIT_RD_DUAL_IO_CMD(x) (((x) & BIT_MASK_RD_DUAL_IO_CMD) << BIT_SHIFT_RD_DUAL_IO_CMD) +#define BIT_CTRL_RD_DUAL_IO_CMD(x) (((x) & BIT_MASK_RD_DUAL_IO_CMD) << BIT_SHIFT_RD_DUAL_IO_CMD) +#define BIT_GET_RD_DUAL_IO_CMD(x) (((x) >> BIT_SHIFT_RD_DUAL_IO_CMD) & BIT_MASK_RD_DUAL_IO_CMD) + + +//2 REG_SPIC_READ_QUAD_DATA + +#define BIT_SHIFT_RD_QUAD_O_CMD 0 +#define BIT_MASK_RD_QUAD_O_CMD 0xff +#define BIT_RD_QUAD_O_CMD(x) (((x) & BIT_MASK_RD_QUAD_O_CMD) << BIT_SHIFT_RD_QUAD_O_CMD) +#define BIT_CTRL_RD_QUAD_O_CMD(x) (((x) & BIT_MASK_RD_QUAD_O_CMD) << BIT_SHIFT_RD_QUAD_O_CMD) +#define BIT_GET_RD_QUAD_O_CMD(x) (((x) >> BIT_SHIFT_RD_QUAD_O_CMD) & BIT_MASK_RD_QUAD_O_CMD) + + +//2 REG_SPIC_READ_QUAD_ADDR_DATA + +#define BIT_SHIFT_RD_QUAD_IO_CMD 0 +#define BIT_MASK_RD_QUAD_IO_CMD 0xff +#define BIT_RD_QUAD_IO_CMD(x) (((x) & BIT_MASK_RD_QUAD_IO_CMD) << BIT_SHIFT_RD_QUAD_IO_CMD) +#define BIT_CTRL_RD_QUAD_IO_CMD(x) (((x) & BIT_MASK_RD_QUAD_IO_CMD) << BIT_SHIFT_RD_QUAD_IO_CMD) +#define BIT_GET_RD_QUAD_IO_CMD(x) (((x) >> BIT_SHIFT_RD_QUAD_IO_CMD) & BIT_MASK_RD_QUAD_IO_CMD) + + +//2 REG_SPIC_WRITE_SIGNLE + +#define BIT_SHIFT_WR_CMD 0 +#define BIT_MASK_WR_CMD 0xff +#define BIT_WR_CMD(x) (((x) & BIT_MASK_WR_CMD) << BIT_SHIFT_WR_CMD) +#define BIT_CTRL_WR_CMD(x) (((x) & BIT_MASK_WR_CMD) << BIT_SHIFT_WR_CMD) +#define BIT_GET_WR_CMD(x) (((x) >> BIT_SHIFT_WR_CMD) & BIT_MASK_WR_CMD) + + +//2 REG_SPIC_WRITE_DUAL_DATA + +#define BIT_SHIFT_WR_DUAL_I_CMD 0 +#define BIT_MASK_WR_DUAL_I_CMD 0xff +#define BIT_WR_DUAL_I_CMD(x) (((x) & BIT_MASK_WR_DUAL_I_CMD) << BIT_SHIFT_WR_DUAL_I_CMD) +#define BIT_CTRL_WR_DUAL_I_CMD(x) (((x) & BIT_MASK_WR_DUAL_I_CMD) << BIT_SHIFT_WR_DUAL_I_CMD) +#define BIT_GET_WR_DUAL_I_CMD(x) (((x) >> BIT_SHIFT_WR_DUAL_I_CMD) & BIT_MASK_WR_DUAL_I_CMD) + + +//2 REG_SPIC_WRITE_DUAL_ADDR_DATA + +#define BIT_SHIFT_WR_DUAL_II_CMD 0 +#define BIT_MASK_WR_DUAL_II_CMD 0xff +#define BIT_WR_DUAL_II_CMD(x) (((x) & BIT_MASK_WR_DUAL_II_CMD) << BIT_SHIFT_WR_DUAL_II_CMD) +#define BIT_CTRL_WR_DUAL_II_CMD(x) (((x) & BIT_MASK_WR_DUAL_II_CMD) << BIT_SHIFT_WR_DUAL_II_CMD) +#define BIT_GET_WR_DUAL_II_CMD(x) (((x) >> BIT_SHIFT_WR_DUAL_II_CMD) & BIT_MASK_WR_DUAL_II_CMD) + + +//2 REG_SPIC_WRITE_QUAD_DATA + +#define BIT_SHIFT_WR_QUAD_I_CMD 0 +#define BIT_MASK_WR_QUAD_I_CMD 0xff +#define BIT_WR_QUAD_I_CMD(x) (((x) & BIT_MASK_WR_QUAD_I_CMD) << BIT_SHIFT_WR_QUAD_I_CMD) +#define BIT_CTRL_WR_QUAD_I_CMD(x) (((x) & BIT_MASK_WR_QUAD_I_CMD) << BIT_SHIFT_WR_QUAD_I_CMD) +#define BIT_GET_WR_QUAD_I_CMD(x) (((x) >> BIT_SHIFT_WR_QUAD_I_CMD) & BIT_MASK_WR_QUAD_I_CMD) + + +//2 REG_SPIC_WRITE_QUAD_ADDR_DATA + +#define BIT_SHIFT_WR_QUAD_II_CMD 0 +#define BIT_MASK_WR_QUAD_II_CMD 0xff +#define BIT_WR_QUAD_II_CMD(x) (((x) & BIT_MASK_WR_QUAD_II_CMD) << BIT_SHIFT_WR_QUAD_II_CMD) +#define BIT_CTRL_WR_QUAD_II_CMD(x) (((x) & BIT_MASK_WR_QUAD_II_CMD) << BIT_SHIFT_WR_QUAD_II_CMD) +#define BIT_GET_WR_QUAD_II_CMD(x) (((x) >> BIT_SHIFT_WR_QUAD_II_CMD) & BIT_MASK_WR_QUAD_II_CMD) + + +//2 REG_SPIC_WRITE_ENABLE + +#define BIT_SHIFT_WR_EN_CMD 0 +#define BIT_MASK_WR_EN_CMD 0xff +#define BIT_WR_EN_CMD(x) (((x) & BIT_MASK_WR_EN_CMD) << BIT_SHIFT_WR_EN_CMD) +#define BIT_CTRL_WR_EN_CMD(x) (((x) & BIT_MASK_WR_EN_CMD) << BIT_SHIFT_WR_EN_CMD) +#define BIT_GET_WR_EN_CMD(x) (((x) >> BIT_SHIFT_WR_EN_CMD) & BIT_MASK_WR_EN_CMD) + + +//2 REG_SPIC_READ_STATUS + +#define BIT_SHIFT_RD_ST_CMD 0 +#define BIT_MASK_RD_ST_CMD 0xff +#define BIT_RD_ST_CMD(x) (((x) & BIT_MASK_RD_ST_CMD) << BIT_SHIFT_RD_ST_CMD) +#define BIT_CTRL_RD_ST_CMD(x) (((x) & BIT_MASK_RD_ST_CMD) << BIT_SHIFT_RD_ST_CMD) +#define BIT_GET_RD_ST_CMD(x) (((x) >> BIT_SHIFT_RD_ST_CMD) & BIT_MASK_RD_ST_CMD) + + +//2 REG_SPIC_CTRLR2 + +#define BIT_SHIFT_FIFO_ENTRY 4 +#define BIT_MASK_FIFO_ENTRY 0xf +#define BIT_FIFO_ENTRY(x) (((x) & BIT_MASK_FIFO_ENTRY) << BIT_SHIFT_FIFO_ENTRY) +#define BIT_CTRL_FIFO_ENTRY(x) (((x) & BIT_MASK_FIFO_ENTRY) << BIT_SHIFT_FIFO_ENTRY) +#define BIT_GET_FIFO_ENTRY(x) (((x) >> BIT_SHIFT_FIFO_ENTRY) & BIT_MASK_FIFO_ENTRY) + +#define BIT_WR_SEQ BIT(3) +#define BIT_SHIFT_WR_SEQ 3 +#define BIT_MASK_WR_SEQ 0x1 +#define BIT_CTRL_WR_SEQ(x) (((x) & BIT_MASK_WR_SEQ) << BIT_SHIFT_WR_SEQ) + +#define BIT_WPN_DNUM BIT(2) +#define BIT_SHIFT_WPN_DNUM 2 +#define BIT_MASK_WPN_DNUM 0x1 +#define BIT_CTRL_WPN_DNUM(x) (((x) & BIT_MASK_WPN_DNUM) << BIT_SHIFT_WPN_DNUM) + +#define BIT_WPN_SET BIT(1) +#define BIT_SHIFT_WPN_SET 1 +#define BIT_MASK_WPN_SET 0x1 +#define BIT_CTRL_WPN_SET(x) (((x) & BIT_MASK_WPN_SET) << BIT_SHIFT_WPN_SET) + +#define BIT_SO_DUM BIT(0) +#define BIT_SHIFT_SO_DUM 0 +#define BIT_MASK_SO_DUM 0x1 +#define BIT_CTRL_SO_DUM(x) (((x) & BIT_MASK_SO_DUM) << BIT_SHIFT_SO_DUM) + +//2 REG_SPIC_FBAUDR + +#define BIT_SHIFT_FSCKDV 0 +#define BIT_MASK_FSCKDV 0xfff +#define BIT_FSCKDV(x) (((x) & BIT_MASK_FSCKDV) << BIT_SHIFT_FSCKDV) +#define BIT_CTRL_FSCKDV(x) (((x) & BIT_MASK_FSCKDV) << BIT_SHIFT_FSCKDV) +#define BIT_GET_FSCKDV(x) (((x) >> BIT_SHIFT_FSCKDV) & BIT_MASK_FSCKDV) + + +//2 REG_SPIC_ADDR_LENGTH + +#define BIT_SHIFT_ADDR_PHASE_LENGTH 0 +#define BIT_MASK_ADDR_PHASE_LENGTH 0x3 +#define BIT_ADDR_PHASE_LENGTH(x) (((x) & BIT_MASK_ADDR_PHASE_LENGTH) << BIT_SHIFT_ADDR_PHASE_LENGTH) +#define BIT_CTRL_ADDR_PHASE_LENGTH(x) (((x) & BIT_MASK_ADDR_PHASE_LENGTH) << BIT_SHIFT_ADDR_PHASE_LENGTH) +#define BIT_GET_ADDR_PHASE_LENGTH(x) (((x) >> BIT_SHIFT_ADDR_PHASE_LENGTH) & BIT_MASK_ADDR_PHASE_LENGTH) + + +//2 REG_SPIC_AUTO_LENGTH + +#define BIT_SHIFT_CS_H_WR_DUM_LEN 28 +#define BIT_MASK_CS_H_WR_DUM_LEN 0xf +#define BIT_CS_H_WR_DUM_LEN(x) (((x) & BIT_MASK_CS_H_WR_DUM_LEN) << BIT_SHIFT_CS_H_WR_DUM_LEN) +#define BIT_CTRL_CS_H_WR_DUM_LEN(x) (((x) & BIT_MASK_CS_H_WR_DUM_LEN) << BIT_SHIFT_CS_H_WR_DUM_LEN) +#define BIT_GET_CS_H_WR_DUM_LEN(x) (((x) >> BIT_SHIFT_CS_H_WR_DUM_LEN) & BIT_MASK_CS_H_WR_DUM_LEN) + + +#define BIT_SHIFT_CS_H_RD_DUM_LEN 26 +#define BIT_MASK_CS_H_RD_DUM_LEN 0x3 +#define BIT_CS_H_RD_DUM_LEN(x) (((x) & BIT_MASK_CS_H_RD_DUM_LEN) << BIT_SHIFT_CS_H_RD_DUM_LEN) +#define BIT_CTRL_CS_H_RD_DUM_LEN(x) (((x) & BIT_MASK_CS_H_RD_DUM_LEN) << BIT_SHIFT_CS_H_RD_DUM_LEN) +#define BIT_GET_CS_H_RD_DUM_LEN(x) (((x) >> BIT_SHIFT_CS_H_RD_DUM_LEN) & BIT_MASK_CS_H_RD_DUM_LEN) + + +#define BIT_SHIFT_AUTO_DUM_LEN 18 +#define BIT_MASK_AUTO_DUM_LEN 0xff +#define BIT_AUTO_DUM_LEN(x) (((x) & BIT_MASK_AUTO_DUM_LEN) << BIT_SHIFT_AUTO_DUM_LEN) +#define BIT_CTRL_AUTO_DUM_LEN(x) (((x) & BIT_MASK_AUTO_DUM_LEN) << BIT_SHIFT_AUTO_DUM_LEN) +#define BIT_GET_AUTO_DUM_LEN(x) (((x) >> BIT_SHIFT_AUTO_DUM_LEN) & BIT_MASK_AUTO_DUM_LEN) + + +#define BIT_SHIFT_AUTO_ADDR__LENGTH 16 +#define BIT_MASK_AUTO_ADDR__LENGTH 0x3 +#define BIT_AUTO_ADDR__LENGTH(x) (((x) & BIT_MASK_AUTO_ADDR__LENGTH) << BIT_SHIFT_AUTO_ADDR__LENGTH) +#define BIT_CTRL_AUTO_ADDR__LENGTH(x) (((x) & BIT_MASK_AUTO_ADDR__LENGTH) << BIT_SHIFT_AUTO_ADDR__LENGTH) +#define BIT_GET_AUTO_ADDR__LENGTH(x) (((x) >> BIT_SHIFT_AUTO_ADDR__LENGTH) & BIT_MASK_AUTO_ADDR__LENGTH) + + +#define BIT_SHIFT_RD_DUMMY_LENGTH 0 +#define BIT_MASK_RD_DUMMY_LENGTH 0xffff +#define BIT_RD_DUMMY_LENGTH(x) (((x) & BIT_MASK_RD_DUMMY_LENGTH) << BIT_SHIFT_RD_DUMMY_LENGTH) +#define BIT_CTRL_RD_DUMMY_LENGTH(x) (((x) & BIT_MASK_RD_DUMMY_LENGTH) << BIT_SHIFT_RD_DUMMY_LENGTH) +#define BIT_GET_RD_DUMMY_LENGTH(x) (((x) >> BIT_SHIFT_RD_DUMMY_LENGTH) & BIT_MASK_RD_DUMMY_LENGTH) + + +//2 REG_SPIC_VALID_CMD +#define BIT_WR_BLOCKING BIT(9) +#define BIT_SHIFT_WR_BLOCKING 9 +#define BIT_MASK_WR_BLOCKING 0x1 +#define BIT_CTRL_WR_BLOCKING(x) (((x) & BIT_MASK_WR_BLOCKING) << BIT_SHIFT_WR_BLOCKING) + +#define BIT_WR_QUAD_II BIT(8) +#define BIT_SHIFT_WR_QUAD_II 8 +#define BIT_MASK_WR_QUAD_II 0x1 +#define BIT_CTRL_WR_QUAD_II(x) (((x) & BIT_MASK_WR_QUAD_II) << BIT_SHIFT_WR_QUAD_II) + +#define BIT_WR_QUAD_I BIT(7) +#define BIT_SHIFT_WR_QUAD_I 7 +#define BIT_MASK_WR_QUAD_I 0x1 +#define BIT_CTRL_WR_QUAD_I(x) (((x) & BIT_MASK_WR_QUAD_I) << BIT_SHIFT_WR_QUAD_I) + +#define BIT_WR_DUAL_II BIT(6) +#define BIT_SHIFT_WR_DUAL_II 6 +#define BIT_MASK_WR_DUAL_II 0x1 +#define BIT_CTRL_WR_DUAL_II(x) (((x) & BIT_MASK_WR_DUAL_II) << BIT_SHIFT_WR_DUAL_II) + +#define BIT_WR_DUAL_I BIT(5) +#define BIT_SHIFT_WR_DUAL_I 5 +#define BIT_MASK_WR_DUAL_I 0x1 +#define BIT_CTRL_WR_DUAL_I(x) (((x) & BIT_MASK_WR_DUAL_I) << BIT_SHIFT_WR_DUAL_I) + +#define BIT_RD_QUAD_IO BIT(4) +#define BIT_SHIFT_RD_QUAD_IO 4 +#define BIT_MASK_RD_QUAD_IO 0x1 +#define BIT_CTRL_RD_QUAD_IO(x) (((x) & BIT_MASK_RD_QUAD_IO) << BIT_SHIFT_RD_QUAD_IO) + +#define BIT_RD_QUAD_O BIT(3) +#define BIT_SHIFT_RD_QUAD_O 3 +#define BIT_MASK_RD_QUAD_O 0x1 +#define BIT_CTRL_RD_QUAD_O(x) (((x) & BIT_MASK_RD_QUAD_O) << BIT_SHIFT_RD_QUAD_O) + +#define BIT_RD_DUAL_IO BIT(2) +#define BIT_SHIFT_RD_DUAL_IO 2 +#define BIT_MASK_RD_DUAL_IO 0x1 +#define BIT_CTRL_RD_DUAL_IO(x) (((x) & BIT_MASK_RD_DUAL_IO) << BIT_SHIFT_RD_DUAL_IO) + +#define BIT_RD_DUAL_I BIT(1) +#define BIT_SHIFT_RD_DUAL_I 1 +#define BIT_MASK_RD_DUAL_I 0x1 +#define BIT_CTRL_RD_DUAL_I(x) (((x) & BIT_MASK_RD_DUAL_I) << BIT_SHIFT_RD_DUAL_I) + +#define BIT_FRD_SINGEL BIT(0) +#define BIT_SHIFT_FRD_SINGEL 0 +#define BIT_MASK_FRD_SINGEL 0x1 +#define BIT_CTRL_FRD_SINGEL(x) (((x) & BIT_MASK_FRD_SINGEL) << BIT_SHIFT_FRD_SINGEL) + +//2 REG_SPIC_FLASE_SIZE + +#define BIT_SHIFT_FLASE_SIZE 0 +#define BIT_MASK_FLASE_SIZE 0xf +#define BIT_FLASE_SIZE(x) (((x) & BIT_MASK_FLASE_SIZE) << BIT_SHIFT_FLASE_SIZE) +#define BIT_CTRL_FLASE_SIZE(x) (((x) & BIT_MASK_FLASE_SIZE) << BIT_SHIFT_FLASE_SIZE) +#define BIT_GET_FLASE_SIZE(x) (((x) >> BIT_SHIFT_FLASE_SIZE) & BIT_MASK_FLASE_SIZE) + + +//2 REG_SPIC_FLUSH_FIFO +#define BIT_FLUSH_FIFO BIT(0) +#define BIT_SHIFT_FLUSH_FIFO 0 +#define BIT_MASK_FLUSH_FIFO 0x1 +#define BIT_CTRL_FLUSH_FIFO(x) (((x) & BIT_MASK_FLUSH_FIFO) << BIT_SHIFT_FLUSH_FIFO) + +//=================== Register Address Definition ============================// +#define REG_SPIC_CTRLR0 0x0000//O +#define REG_SPIC_CTRLR1 0x0004//O +#define REG_SPIC_SSIENR 0x0008//O +#define REG_SPIC_MWCR 0x000C +#define REG_SPIC_SER 0x0010//O +#define REG_SPIC_BAUDR 0x0014//O +#define REG_SPIC_TXFTLR 0x0018 +#define REG_SPIC_RXFTLR 0x001C//O +#define REG_SPIC_TXFLR 0x0020//O +#define REG_SPIC_RXFLR 0x0024 +#define REG_SPIC_SR 0x0028 +#define REG_SPIC_IMR 0x002C//O +#define REG_SPIC_ISR 0x0030 +#define REG_SPIC_RISR 0x0034 +#define REG_SPIC_TXOICR 0x0038 +#define REG_SPIC_RXOICR 0x003C +#define REG_SPC_RXUICR 0x0040 +#define REG_SPIC_MSTICR 0x0044 +#define REG_SPIC_ICR 0x0048 +#define REG_SPIC_DMACR 0x004C +#define REG_SPIC_DMATDLR0 0x0050 +#define REG_SPIC_DMATDLR1 0x0054 +#define REG_SPIC_IDR 0x0058 +#define REG_SPIC_VERSION 0x005C +#define REG_SPIC_DR0 0x0060 +#define REG_SPIC_DR1 0x0064 +#define REG_SPIC_DR2 0x0068 +#define REG_SPIC_DR3 0x006C +#define REG_SPIC_DR4 0x0070 +#define REG_SPIC_DR5 0x0074 +#define REG_SPIC_DR6 0x0078 +#define REG_SPIC_DR7 0x007C +#define REG_SPIC_DR8 0x0080 +#define REG_SPIC_DR9 0x0084 +#define REG_SPIC_DR10 0x0088 +#define REG_SPIC_DR11 0x008C +#define REG_SPIC_DR12 0x0090 +#define REG_SPIC_DR13 0x0094 +#define REG_SPIC_DR14 0x0098 +#define REG_SPIC_DR15 0x009C +#define REG_SPIC_DR16 0x00A0 +#define REG_SPIC_DR17 0x00A4 +#define REG_SPIC_DR18 0x00A8 +#define REG_SPIC_DR19 0x00AC +#define REG_SPIC_DR20 0x00B0 +#define REG_SPIC_DR21 0x00B4 +#define REG_SPIC_DR22 0x00B8 +#define REG_SPIC_DR23 0x00BC +#define REG_SPIC_DR24 0x00C0 +#define REG_SPIC_DR25 0x00C4 +#define REG_SPIC_DR26 0x00C8 +#define REG_SPIC_DR27 0x00CC +#define REG_SPIC_DR28 0x00D0 +#define REG_SPIC_DR29 0x00D4 +#define REG_SPIC_DR30 0x00D8 +#define REG_SPIC_DR31 0x00DC +#define REG_SPIC_READ_FAST_SINGLE 0x00E0//O +#define REG_SPIC_READ_DUAL_DATA 0x00E4//O +#define REG_SPIC_READ_DUAL_ADDR_DATA 0x00E8//O +#define REG_SPIC_READ_QUAD_DATA 0x00EC//O +#define REG_SPIC_READ_QUAD_ADDR_DATA 0x00F0//O +#define REG_SPIC_WRITE_SIGNLE 0x00F4//O +#define REG_SPIC_WRITE_DUAL_DATA 0x00F8//O +#define REG_SPIC_WRITE_DUAL_ADDR_DATA 0x00FC//O +#define REG_SPIC_WRITE_QUAD_DATA 0x0100//O +#define REG_SPIC_WRITE_QUAD_ADDR_DATA 0x0104//O +#define REG_SPIC_WRITE_ENABLE 0x0108//O +#define REG_SPIC_READ_STATUS 0x010C//O +#define REG_SPIC_CTRLR2 0x0110//O +#define REG_SPIC_FBAUDR 0x0114//O +#define REG_SPIC_ADDR_LENGTH 0x0118//O +#define REG_SPIC_AUTO_LENGTH 0x011C//O +#define REG_SPIC_VALID_CMD 0x0120//O +#define REG_SPIC_FLASE_SIZE 0x0124//O +#define REG_SPIC_FLUSH_FIFO 0x0128//O + +#endif // end of "#ifndef _RTL8195A_SPI_FLASH_H" diff --git a/lib/fwlib/rtl8195a/rtl8195a_ssi.h b/lib/fwlib/rtl8195a/rtl8195a_ssi.h new file mode 100644 index 0000000..3e940e2 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_ssi.h @@ -0,0 +1,498 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_SSI_H_ +#define _RTL8195A_SSI_H_ + +#define SSI_DUMMY_DATA 0x00 // for master mode, we need to push a Dummy data to TX FIFO for read + +#define SSI_CLK_SPI1 (PLATFORM_CLOCK/2) +#define SSI_CLK_SPI0_2 (PLATFORM_CLOCK/4) + +/* Parameters of DW_apb_ssi for RTL8195A */ +#define SSI_TX_FIFO_DEPTH 64 +#define TX_ABW 6 // 1-8, log2(SSI_TX_FIFO_DEPTH) +#define SSI_RX_FIFO_DEPTH 64 +#define RX_ABW 6 // 1-8, log2(SSI_RX_FIFO_DEPTH) + +#define SSI0_REG_BASE 0x40042000 +#define SSI1_REG_BASE 0x40042400 +#define SSI2_REG_BASE 0x40042800 + +/* Memory Map of DW_apb_ssi */ +#define REG_DW_SSI_CTRLR0 0x00 // 16 bits +#define REG_DW_SSI_CTRLR1 0x04 // 16 bits +#define REG_DW_SSI_SSIENR 0x08 // 1 bit +#define REG_DW_SSI_MWCR 0x0C // 3 bits +#define REG_DW_SSI_SER 0x10 // +#define REG_DW_SSI_BAUDR 0x14 // 16 bits +#define REG_DW_SSI_TXFTLR 0x18 // TX_ABW +#define REG_DW_SSI_RXFTLR 0x1C // RX_ABW +#define REG_DW_SSI_TXFLR 0x20 // +#define REG_DW_SSI_RXFLR 0x24 // +#define REG_DW_SSI_SR 0x28 // 7 bits +#define REG_DW_SSI_IMR 0x2C // +#define REG_DW_SSI_ISR 0x30 // 6 bits +#define REG_DW_SSI_RISR 0x34 // 6 bits +#define REG_DW_SSI_TXOICR 0x38 // 1 bits +#define REG_DW_SSI_RXOICR 0x3C // 1 bits +#define REG_DW_SSI_RXUICR 0x40 // 1 bits +#define REG_DW_SSI_MSTICR 0x44 // 1 bits +#define REG_DW_SSI_ICR 0x48 // 1 bits +#define REG_DW_SSI_DMACR 0x4C // 2 bits +#define REG_DW_SSI_DMATDLR 0x50 // TX_ABW +#define REG_DW_SSI_DMARDLR 0x54 // RX_ABW +#define REG_DW_SSI_IDR 0x58 // 32 bits +#define REG_DW_SSI_COMP_VERSION 0x5C // 32 bits +#define REG_DW_SSI_DR 0x60 // 16 bits 0x60-0xEC +#define REG_DW_SSI_RX_SAMPLE_DLY 0xF0 // 8 bits +#define REG_DW_SSI_RSVD_0 0xF4 // 32 bits +#define REG_DW_SSI_RSVD_1 0xF8 // 32 bits +#define REG_DW_SSI_RSVD_2 0xFC // 32 bits + +// CTRLR0 0x00 // 16 bits, 6.2.1 +// DFS Reset Value: 0x7 +#define BIT_SHIFT_CTRLR0_DFS 0 +#define BIT_MASK_CTRLR0_DFS 0xF +#define BIT_CTRLR0_DFS(x)(((x) & BIT_MASK_CTRLR0_DFS) << BIT_SHIFT_CTRLR0_DFS) +#define BIT_INVC_CTRLR0_DFS (~(BIT_MASK_CTRLR0_DFS << BIT_SHIFT_CTRLR0_DFS)) + +#define BIT_SHIFT_CTRLR0_FRF 4 +#define BIT_MASK_CTRLR0_FRF 0x3 +#define BIT_CTRLR0_FRF(x)(((x) & BIT_MASK_CTRLR0_FRF) << BIT_SHIFT_CTRLR0_FRF) +#define BIT_INVC_CTRLR0_FRF (~(BIT_MASK_CTRLR0_FRF << BIT_SHIFT_CTRLR0_FRF)) + +#define BIT_SHIFT_CTRLR0_SCPH 6 +#define BIT_MASK_CTRLR0_SCPH 0x1 +#define BIT_CTRLR0_SCPH(x)(((x) & BIT_MASK_CTRLR0_SCPH) << BIT_SHIFT_CTRLR0_SCPH) +#define BIT_INVC_CTRLR0_SCPH (~(BIT_MASK_CTRLR0_SCPH << BIT_SHIFT_CTRLR0_SCPH)) + +#define BIT_SHIFT_CTRLR0_SCPOL 7 +#define BIT_MASK_CTRLR0_SCPOL 0x1 +#define BIT_CTRLR0_SCPOL(x)(((x) & BIT_MASK_CTRLR0_SCPOL) << BIT_SHIFT_CTRLR0_SCPOL) +#define BIT_INVC_CTRLR0_SCPOL (~(BIT_MASK_CTRLR0_SCPOL << BIT_SHIFT_CTRLR0_SCPOL)) + +#define BIT_SHIFT_CTRLR0_TMOD 8 +#define BIT_MASK_CTRLR0_TMOD 0x3 +#define BIT_CTRLR0_TMOD(x)(((x) & BIT_MASK_CTRLR0_TMOD) << BIT_SHIFT_CTRLR0_TMOD) +#define BIT_INVC_CTRLR0_TMOD (~(BIT_MASK_CTRLR0_TMOD << BIT_SHIFT_CTRLR0_TMOD)) + +#define BIT_SHIFT_CTRLR0_SLV_OE 10 +#define BIT_MASK_CTRLR0_SLV_OE 0x1 +#define BIT_CTRLR0_SLV_OE(x)(((x) & BIT_MASK_CTRLR0_SLV_OE) << BIT_SHIFT_CTRLR0_SLV_OE) +#define BIT_INVC_CTRLR0_SLV_OE (~(BIT_MASK_CTRLR0_SLV_OE << BIT_SHIFT_CTRLR0_SLV_OE)) + +#define BIT_SHIFT_CTRLR0_SRL 11 +#define BIT_MASK_CTRLR0_SRL 0x1 +#define BIT_CTRLR0_SRL(x)(((x) & BIT_MASK_CTRLR0_SRL) << BIT_SHIFT_CTRLR0_SRL) +#define BIT_INVC_CTRLR0_SRL (~(BIT_MASK_CTRLR0_SRL << BIT_SHIFT_CTRLR0_SRL)) + +#define BIT_SHIFT_CTRLR0_CFS 12 +#define BIT_MASK_CTRLR0_CFS 0xF +#define BIT_CTRLR0_CFS(x)(((x) & BIT_MASK_CTRLR0_CFS) << BIT_SHIFT_CTRLR0_CFS) +#define BIT_INVC_CTRLR0_CFS (~(BIT_MASK_CTRLR0_CFS << BIT_SHIFT_CTRLR0_CFS)) + +// CTRLR1 0x04 // 16 bits +#define BIT_SHIFT_CTRLR1_NDF 0 +#define BIT_MASK_CTRLR1_NDF 0xFFFF +#define BIT_CTRLR1_NDF(x)(((x) & BIT_MASK_CTRLR1_NDF) << BIT_SHIFT_CTRLR1_NDF) +#define BIT_INVC_CTRLR1_NDF (~(BIT_MASK_CTRLR1_NDF << BIT_SHIFT_CTRLR1_NDF)) + +// SSIENR 0x08 // 1 bit +#define BIT_SHIFT_SSIENR_SSI_EN 0 +#define BIT_MASK_SSIENR_SSI_EN 0x1 +#define BIT_SSIENR_SSI_EN(x)(((x) & BIT_MASK_SSIENR_SSI_EN) << BIT_SHIFT_SSIENR_SSI_EN) +#define BIT_INVC_SSIENR_SSI_EN (~(BIT_MASK_SSIENR_SSI_EN << BIT_SHIFT_SSIENR_SSI_EN)) + +// MWCR 0x0c // 3 bits +#define BIT_SHIFT_MWCR_MWMOD 0 +#define BIT_MASK_MWCR_MWMOD 0x1 +#define BIT_MWCR_MWMOD(x)(((x) & BIT_MASK_MWCR_MWMOD) << BIT_SHIFT_MWCR_MWMOD) +#define BIT_INVC_MWCR_MWMOD (~(BIT_MASK_MWCR_MWMOD << BIT_SHIFT_MWCR_MWMOD)) + +#define BIT_SHIFT_MWCR_MDD 1 +#define BIT_MASK_MWCR_MDD 0x1 +#define BIT_MWCR_MDD(x)(((x) & BIT_MASK_MWCR_MDD) << BIT_SHIFT_MWCR_MDD) +#define BIT_INVC_MWCR_MDD (~(BIT_MASK_MWCR_MDD << BIT_SHIFT_MWCR_MDD)) + +#define BIT_SHIFT_MWCR_MHS 2 +#define BIT_MASK_MWCR_MHS 0x1 +#define BIT_MWCR_MHS(x)(((x) & BIT_MASK_MWCR_MHS) << BIT_SHIFT_MWCR_MHS) +#define BIT_INVC_MWCR_MHS (~(BIT_MASK_MWCR_MHS << BIT_SHIFT_MWCR_MHS)) + +// SER 0x10 // Variable Length +#define BIT_SHIFT_SER_SER 0 +#define BIT_MASK_SER_SER 0xFF +#define BIT_SER_SER(x)(((x) & BIT_MASK_SER_SER) << BIT_SHIFT_SER_SER) +#define BIT_INVC_SER_SER (~(BIT_MASK_SER_SER << BIT_SHIFT_SER_SER)) + +// BAUDR 0x14 // 16 bits +#define BIT_SHIFT_BAUDR_SCKDV 0 +#define BIT_MASK_BAUDR_SCKDV 0xFFFF +#define BIT_BAUDR_SCKDV(x)(((x) & BIT_MASK_BAUDR_SCKDV) << BIT_SHIFT_BAUDR_SCKDV) +#define BIT_INVC_BAUDR_SCKDV (~(BIT_MASK_BAUDR_SCKDV << BIT_SHIFT_BAUDR_SCKDV)) + +// TXFLTR 0x18 // Variable Length +#define BIT_SHIFT_TXFTLR_TFT 0 +#define BIT_MASK_TXFTLR_TFT 0x3F // (TX_ABW-1):0 +#define BIT_TXFTLR_TFT(x)(((x) & BIT_MASK_TXFTLR_TFT) << BIT_SHIFT_TXFTLR_TFT) +#define BIT_INVC_TXFTLR_TFT (~(BIT_MASK_TXFTLR_TFT << BIT_SHIFT_TXFTLR_TFT)) + +// RXFLTR 0x1c // Variable Length +#define BIT_SHIFT_RXFTLR_RFT 0 +#define BIT_MASK_RXFTLR_RFT 0x3F // (RX_ABW-1):0 +#define BIT_RXFTLR_RFT(x)(((x) & BIT_MASK_RXFTLR_RFT) << BIT_SHIFT_RXFTLR_RFT) +#define BIT_INVC_RXFTLR_RFT (~(BIT_MASK_RXFTLR_RFT << BIT_SHIFT_RXFTLR_RFT)) + +// TXFLR 0x20 // see [READ ONLY] +#define BIT_MASK_TXFLR_TXTFL 0x7F // (TX_ABW):0 + +// RXFLR 0x24 // see [READ ONLY] +#define BIT_MASK_RXFLR_RXTFL 0x7F // (RX_ABW):0 + +// SR 0x28 // 7 bits [READ ONLY] +#define BIT_SR_BUSY BIT0 +#define BIT_SR_TFNF BIT1 +#define BIT_SR_TFE BIT2 +#define BIT_SR_RFNE BIT3 +#define BIT_SR_RFF BIT4 +#define BIT_SR_TXE BIT5 +#define BIT_SR_DCOL BIT6 + +// IMR 0x2c // see +#define BIT_SHIFT_IMR_TXEIM 0 +#define BIT_MASK_IMR_TXEIM 0x1 +// #define BIT_IMR_TXEIM(x)(((x) & BIT_MASK_IMR_TXEIM) << BIT_SHIFT_IMR_TXEIM) +#define BIT_INVC_IMR_TXEIM (~(BIT_MASK_IMR_TXEIM << BIT_SHIFT_IMR_TXEIM)) + +#define BIT_SHIFT_IMR_TXOIM 1 +#define BIT_MASK_IMR_TXOIM 0x1 +// #define BIT_IMR_TXOIM(x)(((x) & BIT_MASK_IMR_TXOIM) << BIT_SHIFT_IMR_TXOIM) +#define BIT_INVC_IMR_TXOIM (~(BIT_MASK_IMR_TXOIM << BIT_SHIFT_IMR_TXOIM)) + +#define BIT_SHIFT_IMR_RXUIM 2 +#define BIT_MASK_IMR_RXUIM 0x1 +// #define BIT_IMR_RXUIM(x)(((x) & BIT_MASK_IMR_RXUIM) << BIT_SHIFT_IMR_RXUIM) +#define BIT_INVC_IMR_RXUIM (~(BIT_MASK_IMR_RXUIM << BIT_SHIFT_IMR_RXUIM)) + +#define BIT_SHIFT_IMR_RXOIM 3 +#define BIT_MASK_IMR_RXOIM 0x1 +// #define BIT_IMR_RXOIM(x)(((x) & BIT_MASK_IMR_RXOIM) << BIT_SHIFT_IMR_RXOIM) +#define BIT_INVC_IMR_RXOIM (~(BIT_MASK_IMR_RXOIM << BIT_SHIFT_IMR_RXOIM)) + +#define BIT_SHIFT_IMR_RXFIM 4 +#define BIT_MASK_IMR_RXFIM 0x1 +// #define BIT_IMR_RXFIM(x)(((x) & BIT_MASK_IMR_RXFIM) << BIT_SHIFT_IMR_RXFIM) +#define BIT_INVC_IMR_RXFIM (~(BIT_MASK_IMR_RXFIM << BIT_SHIFT_IMR_RXFIM)) + +#define BIT_SHIFT_IMR_MSTIM 5 +#define BIT_MASK_IMR_MSTIM 0x1 +// #define BIT_IMR_MSTIM(x)(((x) & BIT_MASK_IMR_MSTIM) << BIT_SHIFT_IMR_MSTIM) +#define BIT_INVC_IMR_MSTIM (~(BIT_MASK_IMR_MSTIM << BIT_SHIFT_IMR_MSTIM)) + +#define BIT_IMR_TXEIM BIT0 +#define BIT_IMR_TXOIM BIT1 +#define BIT_IMR_RXUIM BIT2 +#define BIT_IMR_RXOIM BIT3 +#define BIT_IMR_RXFIM BIT4 +#define BIT_IMR_MSTIM BIT5 + +// ISR 0x30 // 6 bits [READ ONLY] +#define BIT_ISR_TXEIS BIT0 +#define BIT_ISR_TXOIS BIT1 +#define BIT_ISR_RXUIS BIT2 +#define BIT_ISR_RXOIS BIT3 +#define BIT_ISR_RXFIS BIT4 +#define BIT_ISR_MSTIS BIT5 + +// RISR 0x34 // 6 bits [READ ONLY] +#define BIT_RISR_TXEIR BIT0 +#define BIT_RISR_TXOIR BIT1 +#define BIT_RISR_RXUIR BIT2 +#define BIT_RISR_RXOIR BIT3 +#define BIT_RISR_RXFIR BIT4 +#define BIT_RISR_MSTIR BIT5 + +// TXOICR 0x38 // 1 bits [READ ONLY] +// RXOICR 0x3c // 1 bits [READ ONLY] +// RXUICR 0x40 // 1 bits [READ ONLY] +// MSTICR 0x44 // 1 bits [READ ONLY] +// ICR 0x48 // 1 bits [READ ONLY] + +// DMACR 0x4c // 2 bits +#define BIT_SHIFT_DMACR_RDMAE 0 +#define BIT_MASK_DMACR_RDMAE 0x1 +#define BIT_DMACR_RDMAE(x)(((x) & BIT_MASK_DMACR_RDMAE) << BIT_SHIFT_DMACR_RDMAE) +#define BIT_INVC_DMACR_RDMAE (~(BIT_MASK_DMACR_RDMAE << BIT_SHIFT_DMACR_RDMAE)) + +#define BIT_SHIFT_DMACR_TDMAE 1 +#define BIT_MASK_DMACR_TDMAE 0x1 +#define BIT_DMACR_TDMAE(x)(((x) & BIT_MASK_DMACR_TDMAE) << BIT_SHIFT_DMACR_TDMAE) +#define BIT_INVC_DMACR_TDMAE (~(BIT_MASK_DMACR_TDMAE << BIT_SHIFT_DMACR_TDMAE)) + +// DMATDLR 0x50 +#define BIT_SHIFT_DMATDLR_DMATDL 0 +#define BIT_MASK_DMATDLR_DMATDL 0x3F // (TX_ABW-1):0 +#define BIT_DMATDLR_DMATDL(x)(((x) & BIT_MASK_DMATDLR_DMATDL) << BIT_SHIFT_DMATDLR_DMATDL) +#define BIT_INVC_DMATDLR_DMATDL (~(BIT_MASK_DMATDLR_DMATDL << BIT_SHIFT_DMATDLR_DMATDL)) + +// DMARDLR 0x54 +#define BIT_SHIFT_DMARDLR_DMARDL 0 +#define BIT_MASK_DMARDLR_DMARDL 0x3F // (RX_ABW-1):0 +#define BIT_DMARDLR_DMARDL(x)(((x) & BIT_MASK_DMARDLR_DMARDL) << BIT_SHIFT_DMARDLR_DMARDL) +#define BIT_INVC_DMARDLR_DMARDL (~(BIT_MASK_DMARDLR_DMARDL << BIT_SHIFT_DMARDLR_DMARDL)) + +// IDR 0x58 // 32 bits [READ ONLY] +// COMP_VERSION 0x5c // 32 bits [READ ONLY] + +// DR 0x60 // 16 bits 0x60-0xEC +#define BIT_SHIFT_DR_DR 0 +#define BIT_MASK_DR_DR 0xFFFF +#define BIT_DR_DR(x)(((x) & BIT_MASK_DR_DR) << BIT_SHIFT_DR_DR) +#define BIT_INVC_DR_DR (~(BIT_MASK_DR_DR << BIT_SHIFT_DR_DR)) + +// RX_SAMPLE_DLY 0xF0 // 8 bits +#define BIT_SHIFT_RX_SAMPLE_DLY_RSD 0 +#define BIT_MASK_RX_SAMPLE_DLY_RSD 0xFFFF +#define BIT_RX_SAMPLE_DLY_RSD(x)(((x) & BIT_MASK_RX_SAMPLE_DLY_RSD) << BIT_SHIFT_RX_SAMPLE_DLY_RSD) +#define BIT_INVC_RX_SAMPLE_DLY_RSD (~(BIT_MASK_RX_SAMPLE_DLY_RSD << BIT_SHIFT_RX_SAMPLE_DLY_RSD)) + +// RSVD_0 0xF4 // 32 bits +// RSVD_1 0xF8 // 32 bits +// RSVD_2 0xFC // 32 bits + +// SSI0 Pinmux +#define BIT_SHIFT_SSI0_PIN_EN 0 +#define BIT_MASK_SSI0_PIN_EN 0x1 +#define BIT_SSI0_PIN_EN(x)(((x) & BIT_MASK_SSI0_PIN_EN) << BIT_SHIFT_SSI0_PIN_EN) +#define BIT_INVC_SSI0_PIN_EN (~(BIT_MASK_SSI0_PIN_EN << BIT_SHIFT_SSI0_PIN_EN)) + +#define BIT_SHIFT_SSI0_PIN_SEL 1 +#define BIT_MASK_SSI0_PIN_SEL 0x7 +#define BIT_SSI0_PIN_SEL(x)(((x) & BIT_MASK_SSI0_PIN_SEL) << BIT_SHIFT_SSI0_PIN_SEL) +#define BIT_INVC_SSI0_PIN_SEL (~(BIT_MASK_SSI0_PIN_SEL << BIT_SHIFT_SSI0_PIN_SEL)) + +// SSI1 Pinmux +#define BIT_SHIFT_SSI1_PIN_EN 4 +#define BIT_MASK_SSI1_PIN_EN 0x1 +#define BIT_SSI1_PIN_EN(x)(((x) & BIT_MASK_SSI1_PIN_EN) << BIT_SHIFT_SSI1_PIN_EN) +#define BIT_INVC_SSI1_PIN_EN (~(BIT_MASK_SSI1_PIN_EN << BIT_SHIFT_SSI1_PIN_EN)) + +#define BIT_SHIFT_SSI1_PIN_SEL 5 +#define BIT_MASK_SSI1_PIN_SEL 0x7 +#define BIT_SSI1_PIN_SEL(x)(((x) & BIT_MASK_SSI1_PIN_SEL) << BIT_SHIFT_SSI1_PIN_SEL) +#define BIT_INVC_SSI1_PIN_SEL (~(BIT_MASK_SSI1_PIN_SEL << BIT_SHIFT_SSI1_PIN_SEL)) + +// SSI2 Pinmux +#define BIT_SHIFT_SSI2_PIN_EN 8 +#define BIT_MASK_SSI2_PIN_EN 0x1 +#define BIT_SSI2_PIN_EN(x)(((x) & BIT_MASK_SSI2_PIN_EN) << BIT_SHIFT_SSI2_PIN_EN) +#define BIT_INVC_SSI2_PIN_EN (~(BIT_MASK_SSI2_PIN_EN << BIT_SHIFT_SSI2_PIN_EN)) + +#define BIT_SHIFT_SSI2_PIN_SEL 9 +#define BIT_MASK_SSI2_PIN_SEL 0x7 +#define BIT_SSI2_PIN_SEL(x)(((x) & BIT_MASK_SSI2_PIN_SEL) << BIT_SHIFT_SSI2_PIN_SEL) +#define BIT_INVC_SSI2_PIN_SEL (~(BIT_MASK_SSI2_PIN_SEL << BIT_SHIFT_SSI2_PIN_SEL)) + +// SSI0 Multiple Chip Selection (Pinmux Select is controlled by BIT_SSI0_PIN_SEL) +#define BIT_SHIFT_SSI0_MULTI_CS_EN 28 +#define BIT_MASK_SSI0_MULTI_CS_EN 0x1 +#define BIT_SSI0_MULTI_CS_EN(x)(((x) & BIT_MASK_SSI0_MULTI_CS_EN) << BIT_SHIFT_SSI0_MULTI_CS_EN) +#define BIT_INVC_SSI0_MULTI_CS_EN (~(BIT_MASK_SSI0_MULTI_CS_EN << BIT_SHIFT_SSI0_MULTI_CS_EN)) + + +#define HAL_SSI_READ32(SsiIndex, addr) \ + HAL_READ32(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr) +#define HAL_SSI_WRITE32(SsiIndex, addr, value) \ + HAL_WRITE32(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr, value) +#define HAL_SSI_READ16(SsiIndex, addr) \ + HAL_READ16(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr) +#define HAL_SSI_WRITE16(SsiIndex, addr, value) \ + HAL_WRITE16(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr, value) +#define HAL_SSI_READ8(SsiIndex, addr) \ + HAL_READ8(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr) +#define HAL_SSI_WRITE8(SsiIndex, addr, value) \ + HAL_WRITE8(SPI0_REG_BASE+ (SsiIndex*SSI_REG_OFF), addr, value) + + +// SSI Pinmux Select +typedef enum _SSI0_PINMUX_SELECT_ { + SSI0_MUX_TO_GPIOE = S0, + SSI0_MUX_TO_GPIOC = S1 +}SSI0_PINMUX_SELECT, *PSSI0_PINMUX_SELECT; + +typedef enum _SSI1_PINMUX_SELECT_ { + SSI1_MUX_TO_GPIOA = S0, + SSI1_MUX_TO_GPIOB = S1, + SSI1_MUX_TO_GPIOD = S2 +}SSI1_PINMUX_SELECT, *PSSI1_PINMUX_SELECT; + +typedef enum _SSI2_PINMUX_SELECT_ { + SSI2_MUX_TO_GPIOG = S0, + SSI2_MUX_TO_GPIOE = S1, + SSI2_MUX_TO_GPIOD = S2 +}SSI2_PINMUX_SELECT, *PSSI2_PINMUX_SELECT; + +typedef enum _SSI0_MULTI_CS_PINMUX_SELECT_ { + SSI0_CS_MUX_TO_GPIOE = S0, + SSI0_CS_MUX_TO_GPIOC = S1 +}SSI0_MULTI_CS_PINMUX_SELECT, *PSSI0_MULTI_CS_PINMUX_SELECT; + +typedef enum _SSI_CTRLR0_TMOD_ { + TMOD_TR = 0, + TMOD_TO = 1, + TMOD_RO = 2, + TMOD_EEPROM_R = 3 +}SSI_CTRLR0_TMOD, *PSSI_CTRLR0_TMOD; + +typedef enum _SSI_CTRLR0_SCPOL_ { + SCPOL_INACTIVE_IS_LOW = 0, + SCPOL_INACTIVE_IS_HIGH = 1 +}SSI_CTRLR0_SCPOL, *PSSI_CTRLR0_SCPOL; + +typedef enum _SSI_CTRLR0_SCPH_ { + SCPH_TOGGLES_IN_MIDDLE = 0, + SCPH_TOGGLES_AT_START = 1 +}SSI_CTRLR0_SCPH, *PSSI_CTRLR0_SCPH; + +typedef enum _SSI_CTRLR0_DFS_ { + DFS_4_BITS = 3, + DFS_5_BITS = 4, + DFS_6_BITS = 5, + DFS_7_BITS = 6, + DFS_8_BITS = 7, + DFS_9_BITS = 8, + DFS_10_BITS = 9, + DFS_11_BITS = 10, + DFS_12_BITS = 11, + DFS_13_BITS = 12, + DFS_14_BITS = 13, + DFS_15_BITS = 14, + DFS_16_BITS = 15, +}SSI_CTRLR0_DFS, *PSSI_CTRLR0_DFS; + +typedef enum _SSI_CTRLR0_CFS_ { + CFS_1_BIT = 0, + CFS_2_BITS = 1, + CFS_3_BITS = 2, + CFS_4_BITS = 3, + CFS_5_BITS = 4, + CFS_6_BITS = 5, + CFS_7_BITS = 6, + CFS_8_BITS = 7, + CFS_9_BITS = 8, + CFS_10_BITS = 9, + CFS_11_BITS = 10, + CFS_12_BITS = 11, + CFS_13_BITS = 12, + CFS_14_BITS = 13, + CFS_15_BITS = 14, + CFS_16_BITS = 15 +}SSI_CTRLR0_CFS, *PSSI_CTRLR0_CFS; + +typedef enum _SSI_CTRLR0_SLV_OE_ { + SLV_TXD_ENABLE = 0, + SLV_TXD_DISABLE = 1 +}SSI_CTRLR0_SLV_OE, *PSSI_CTRLR0_SLV_OE; + +typedef enum _SSI_ROLE_SELECT_ { + SSI_SLAVE = 0, + SSI_MASTER = 1 +}SSI_ROLE_SELECT, *PSSI_ROLE_SELECT; + +typedef enum _SSI_FRAME_FORMAT_ { + FRF_MOTOROLA_SPI = 0, + FRF_TI_SSP = 1, + FRF_NS_MICROWIRE = 2, + FRF_RSVD = 3 +}SSI_FRAME_FORMAT, *PSSI_FRAME_FORMAT; + +typedef enum _SSI_DMACR_ENABLE_ { + SSI_NODMA = 0, + SSI_RXDMA_ENABLE = 1, + SSI_TXDMA_ENABLE = 2, + SSI_TRDMA_ENABLE = 3 +}SSI_DMACR_ENABLE, *PSSI_DMACR_ENABLE; + +typedef enum _SSI_MWCR_HANDSHAKE_ { + MW_HANDSHAKE_DISABLE = 0, + MW_HANDSHAKE_ENABLE = 1 +}SSI_MWCR_HANDSHAKE, *PSSI_MWCR_HANDSHAKE; + +typedef enum _SSI_MWCR_DIRECTION_ { + MW_DIRECTION_SLAVE_TO_MASTER = 0, + MW_DIRECTION_MASTER_TO_SLAVE = 1 +}SSI_MWCR_DIRECTION, *PSSI_MWCR_DIRECTION; + +typedef enum _SSI_MWCR_TMOD_ { + MW_TMOD_NONSEQUENTIAL = 0, + MW_TMOD_SEQUENTIAL = 1 +}SSI_MWCR_TMOD, *PSSI_MWCR_TMOD; + +typedef enum _SSI_DATA_TRANSFER_MECHANISM_ { + SSI_DTM_BASIC, + SSI_DTM_INTERRUPT, + SSI_DTM_DMA +}SSI_DATA_TRANSFER_MECHANISM, *PSSI_DATA_TRANSFER_MECHANISM; + + +_LONG_CALL_ HAL_Status HalSsiPinmuxEnableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiEnableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiDisableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiInitRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetSclkPolarityRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetSclkPhaseRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiWriteRtl8195a(VOID *Adaptor, u32 value); +_LONG_CALL_ HAL_Status HalSsiLoadSettingRtl8195a(VOID *Adaptor, VOID *Setting); +_LONG_CALL_ HAL_Status HalSsiSetInterruptMaskRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetDeviceRoleRtl8195a(VOID *Adaptor, u32 Role); +_LONG_CALL_ HAL_Status HalSsiInterruptEnableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiInterruptDisableRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiReadInterruptRtl8195a(VOID *Adaptor, VOID *RxData, u32 Length); +_LONG_CALL_ HAL_Status HalSsiSetRxFifoThresholdLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiSetTxFifoThresholdLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ HAL_Status HalSsiWriteInterruptRtl8195a(VOID *Adaptor, VOID *TxData, u32 Length); +_LONG_CALL_ HAL_Status HalSsiSetSlaveEnableRegisterRtl8195a(VOID *Adaptor, u32 SlaveIndex); +_LONG_CALL_ u32 HalSsiBusyRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiWriteableRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiReadableRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetInterruptMaskRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetRxFifoLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetTxFifoLevelRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetStatusRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetInterruptStatusRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiReadRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetRawInterruptStatusRtl8195a(VOID *Adaptor); +_LONG_CALL_ u32 HalSsiGetSlaveEnableRegisterRtl8195a(VOID *Adaptor); + +_LONG_CALL_ VOID _SsiReadInterrupt(VOID *Adaptor); +_LONG_CALL_ VOID _SsiWriteInterrupt(VOID *Adaptor); +_LONG_CALL_ u32 _SsiIrqHandle(VOID *Adaptor); + +// ROM code patch +VOID _SsiReadInterruptRtl8195a(VOID *Adapter); +VOID _SsiWriteInterruptRtl8195a(VOID *Adapter); +HAL_Status HalSsiInitRtl8195a_Patch(VOID *Adaptor); +HAL_Status HalSsiPinmuxEnableRtl8195a_Patch(VOID *Adaptor); +HAL_Status HalSsiPinmuxDisableRtl8195a(VOID *Adaptor); +HAL_Status HalSsiDeInitRtl8195a(VOID * Adapter); +HAL_Status HalSsiClockOffRtl8195a(VOID * Adapter); +HAL_Status HalSsiClockOnRtl8195a(VOID * Adapter); +VOID HalSsiSetSclkRtl8195a(VOID *Adapter, u32 ClkRate); +HAL_Status HalSsiIntReadRtl8195a(VOID *Adapter, VOID *RxData, u32 Length); +HAL_Status HalSsiIntWriteRtl8195a(VOID *Adapter, u8 *pTxData, u32 Length); +#ifdef CONFIG_GDMA_EN +VOID HalSsiTxGdmaLoadDefRtl8195a(VOID *Adapter); +VOID HalSsiRxGdmaLoadDefRtl8195a(VOID *Adapter); +VOID HalSsiDmaInitRtl8195a(VOID *Adapter); +HAL_Status HalSsiDmaSendRtl8195a(VOID *Adapter, u8 *pTxData, u32 Length); +HAL_Status HalSsiDmaRecvRtl8195a(VOID *Adapter, u8 *pRxData, u32 Length); +#endif // end of "#ifdef CONFIG_GDMA_EN" + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_sys_on.h b/lib/fwlib/rtl8195a/rtl8195a_sys_on.h new file mode 100644 index 0000000..2c5ef62 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_sys_on.h @@ -0,0 +1,1093 @@ +#ifndef __INC_RTL8195A_SYS_ON_BIT_H +#define __INC_RTL8195A_SYS_ON_BIT_H + +#define CPU_OPT_WIDTH 0x1F + +//2 REG_NOT_VALID + +//2 REG_SYS_PWR_CTRL + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_PWR_SOC_EN BIT(2) +#define BIT_SYS_PWR_RET_MEM_EN BIT(1) +#define BIT_SYS_PWR_PEON_EN BIT(0) + +//2 REG_SYS_ISO_CTRL + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_ISO_SYSPLL BIT(7) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_ISO_SOC BIT(2) +#define BIT_SYS_ISO_RET_MEM BIT(1) +#define BIT_SYS_ISO_PEON BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_FUNC_EN +#define BIT_SYS_AMACRO_EN BIT(31) +#define BIT_SYS_PWRON_TRAP_SHTDN_N BIT(30) +#define BIT_SYS_FEN_SIC_MST BIT(25) +#define BIT_SYS_FEN_SIC BIT(24) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SOC_SYSPEON_EN BIT(4) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_FEN_EELDR BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_CLK_CTRL0 + +//2 REG_NOT_VALID +#define BIT_SOC_OCP_IOBUS_CK_EN BIT(2) +#define BIT_SYSON_CK_EELDR_EN BIT(1) +#define BIT_SYSON_CK_SYSREG_EN BIT(0) + +//2 REG_SYS_CLK_CTRL1 + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +#define BIT_SHIFT_PESOC_OCP_CPU_CK_SEL 4 +#define BIT_MASK_PESOC_OCP_CPU_CK_SEL 0x7 +#define BIT_PESOC_OCP_CPU_CK_SEL(x) (((x) & BIT_MASK_PESOC_OCP_CPU_CK_SEL) << BIT_SHIFT_PESOC_OCP_CPU_CK_SEL) + + +//2 REG_NOT_VALID +#define BIT_PESOC_EELDR_CK_SEL BIT(0) + +//2 REG_SYS_SWR_CTRL3 + +//2 REG_RSV_CTRL + +//2 REG_RF_CTRL + +//2 REG_SYS_EFUSE_SYSCFG0 + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_05_00 24 +#define BIT_MASK_SYS_EEROM_SWR_PAR_05_00 0x3f +#define BIT_SYS_EEROM_SWR_PAR_05_00(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_05_00) << BIT_SHIFT_SYS_EEROM_SWR_PAR_05_00) + + +#define BIT_SHIFT_SYS_EEROM_LDO_PAR_07_04 20 +#define BIT_MASK_SYS_EEROM_LDO_PAR_07_04 0xf +#define BIT_SYS_EEROM_LDO_PAR_07_04(x) (((x) & BIT_MASK_SYS_EEROM_LDO_PAR_07_04) << BIT_SHIFT_SYS_EEROM_LDO_PAR_07_04) + +#define BIT_SYS_CHIPPDN_EN BIT(17) +#define BIT_SYS_EEROM_B12V_EN BIT(16) + +#define BIT_SHIFT_SYS_EEROM_VID1 8 +#define BIT_MASK_SYS_EEROM_VID1 0xff +#define BIT_SYS_EEROM_VID1(x) (((x) & BIT_MASK_SYS_EEROM_VID1) << BIT_SHIFT_SYS_EEROM_VID1) + + +#define BIT_SHIFT_SYS_EEROM_VID0 0 +#define BIT_MASK_SYS_EEROM_VID0 0xff +#define BIT_SYS_EEROM_VID0(x) (((x) & BIT_MASK_SYS_EEROM_VID0) << BIT_SHIFT_SYS_EEROM_VID0) + + +//2 REG_SYS_EFUSE_SYSCFG1 + +#define BIT_SHIFT_SYS_PDSPL_STL 24 +#define BIT_MASK_SYS_PDSPL_STL 0x3 +#define BIT_SYS_PDSPL_STL(x) (((x) & BIT_MASK_SYS_PDSPL_STL) << BIT_SHIFT_SYS_PDSPL_STL) + + +#define BIT_SHIFT_SYS_PDSOC_STL 22 +#define BIT_MASK_SYS_PDSOC_STL 0x3 +#define BIT_SYS_PDSOC_STL(x) (((x) & BIT_MASK_SYS_PDSOC_STL) << BIT_SHIFT_SYS_PDSOC_STL) + + +#define BIT_SHIFT_SYS_PDPON_STL 20 +#define BIT_MASK_SYS_PDPON_STL 0x3 +#define BIT_SYS_PDPON_STL(x) (((x) & BIT_MASK_SYS_PDPON_STL) << BIT_SHIFT_SYS_PDPON_STL) + + +#define BIT_SHIFT_SYS_SWREG_XRT 18 +#define BIT_MASK_SYS_SWREG_XRT 0x3 +#define BIT_SYS_SWREG_XRT(x) (((x) & BIT_MASK_SYS_SWREG_XRT) << BIT_SHIFT_SYS_SWREG_XRT) + + +#define BIT_SHIFT_SYS_SWSLC_STL 16 +#define BIT_MASK_SYS_SWSLC_STL 0x3 +#define BIT_SYS_SWSLC_STL(x) (((x) & BIT_MASK_SYS_SWSLC_STL) << BIT_SHIFT_SYS_SWSLC_STL) + + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_46_45 14 +#define BIT_MASK_SYS_EEROM_SWR_PAR_46_45 0x3 +#define BIT_SYS_EEROM_SWR_PAR_46_45(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_46_45) << BIT_SHIFT_SYS_EEROM_SWR_PAR_46_45) + + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_40_39 12 +#define BIT_MASK_SYS_EEROM_SWR_PAR_40_39 0x3 +#define BIT_SYS_EEROM_SWR_PAR_40_39(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_40_39) << BIT_SHIFT_SYS_EEROM_SWR_PAR_40_39) + + +#define BIT_SHIFT_SYS_EEROM_SWR_PAR_33_26 4 +#define BIT_MASK_SYS_EEROM_SWR_PAR_33_26 0xff +#define BIT_SYS_EEROM_SWR_PAR_33_26(x) (((x) & BIT_MASK_SYS_EEROM_SWR_PAR_33_26) << BIT_SHIFT_SYS_EEROM_SWR_PAR_33_26) + + +#define BIT_SHIFT_SYS_EEROM_SWSLD_VOL 0 +#define BIT_MASK_SYS_EEROM_SWSLD_VOL 0x7 +#define BIT_SYS_EEROM_SWSLD_VOL(x) (((x) & BIT_MASK_SYS_EEROM_SWSLD_VOL) << BIT_SHIFT_SYS_EEROM_SWSLD_VOL) + + +//2 REG_SYS_EFUSE_SYSCFG2 + +#define BIT_SHIFT_SYS_EERROM_ANAPAR_SPLL_24_15 21 +#define BIT_MASK_SYS_EERROM_ANAPAR_SPLL_24_15 0x3ff +#define BIT_SYS_EERROM_ANAPAR_SPLL_24_15(x) (((x) & BIT_MASK_SYS_EERROM_ANAPAR_SPLL_24_15) << BIT_SHIFT_SYS_EERROM_ANAPAR_SPLL_24_15) + + +#define BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_05_02 16 +#define BIT_MASK_SYS_EEROM_ANAPAR_SPLL_05_02 0xf +#define BIT_SYS_EEROM_ANAPAR_SPLL_05_02(x) (((x) & BIT_MASK_SYS_EEROM_ANAPAR_SPLL_05_02) << BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_05_02) + + +#define BIT_SHIFT_SYS_EEROM_XTAL_STEL_SEL 12 +#define BIT_MASK_SYS_EEROM_XTAL_STEL_SEL 0x3 +#define BIT_SYS_EEROM_XTAL_STEL_SEL(x) (((x) & BIT_MASK_SYS_EEROM_XTAL_STEL_SEL) << BIT_SHIFT_SYS_EEROM_XTAL_STEL_SEL) + + +#define BIT_SHIFT_SYS_EEROM_XTAL_FREQ_SEL 8 +#define BIT_MASK_SYS_EEROM_XTAL_FREQ_SEL 0xf +#define BIT_SYS_EEROM_XTAL_FREQ_SEL(x) (((x) & BIT_MASK_SYS_EEROM_XTAL_FREQ_SEL) << BIT_SHIFT_SYS_EEROM_XTAL_FREQ_SEL) + + +//2 REG_SYS_EFUSE_SYSCFG3 + +#define BIT_SHIFT_SYS_DBG_PINGP_EN 28 +#define BIT_MASK_SYS_DBG_PINGP_EN 0xf +#define BIT_SYS_DBG_PINGP_EN(x) (((x) & BIT_MASK_SYS_DBG_PINGP_EN) << BIT_SHIFT_SYS_DBG_PINGP_EN) + + +#define BIT_SHIFT_SYS_DBG_SEL 16 +#define BIT_MASK_SYS_DBG_SEL 0xfff +#define BIT_SYS_DBG_SEL(x) (((x) & BIT_MASK_SYS_DBG_SEL) << BIT_SHIFT_SYS_DBG_SEL) + + +#define BIT_SHIFT_SYS_DBGBY3_LOC_SEL 14 +#define BIT_MASK_SYS_DBGBY3_LOC_SEL 0x3 +#define BIT_SYS_DBGBY3_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY3_LOC_SEL) << BIT_SHIFT_SYS_DBGBY3_LOC_SEL) + + +#define BIT_SHIFT_SYS_DBGBY2_LOC_SEL 12 +#define BIT_MASK_SYS_DBGBY2_LOC_SEL 0x3 +#define BIT_SYS_DBGBY2_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY2_LOC_SEL) << BIT_SHIFT_SYS_DBGBY2_LOC_SEL) + + +#define BIT_SHIFT_SYS_DBGBY1_LOC_SEL 10 +#define BIT_MASK_SYS_DBGBY1_LOC_SEL 0x3 +#define BIT_SYS_DBGBY1_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY1_LOC_SEL) << BIT_SHIFT_SYS_DBGBY1_LOC_SEL) + + +#define BIT_SHIFT_SYS_DBGBY0_LOC_SEL 8 +#define BIT_MASK_SYS_DBGBY0_LOC_SEL 0x3 +#define BIT_SYS_DBGBY0_LOC_SEL(x) (((x) & BIT_MASK_SYS_DBGBY0_LOC_SEL) << BIT_SHIFT_SYS_DBGBY0_LOC_SEL) + +#define BIT_SYS_EEROM_ANAPAR_SPLL_49 BIT(3) + +#define BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_27_25 0 +#define BIT_MASK_SYS_EEROM_ANAPAR_SPLL_27_25 0x7 +#define BIT_SYS_EEROM_ANAPAR_SPLL_27_25(x) (((x) & BIT_MASK_SYS_EEROM_ANAPAR_SPLL_27_25) << BIT_SHIFT_SYS_EEROM_ANAPAR_SPLL_27_25) + + +//2 REG_SYS_EFUSE_SYSCFG4 + +#define BIT_SHIFT_SYS_GPIOA_E2 1 +#define BIT_MASK_SYS_GPIOA_E2 0x7 +#define BIT_SYS_GPIOA_E2(x) (((x) & BIT_MASK_SYS_GPIOA_E2) << BIT_SHIFT_SYS_GPIOA_E2) + +#define BIT_SYS_GPIOA_H3L1 BIT(0) + +//2 REG_SYS_EFUSE_SYSCFG5 + +//2 REG_NOT_VALID + +//2 REG_SYS_EFUSE_SYSCFG6 + +#define BIT_SHIFT_SYS_SPIC_INIT_BAUD_RATE_SEL 26 +#define BIT_MASK_SYS_SPIC_INIT_BAUD_RATE_SEL 0x3 +#define BIT_SYS_SPIC_INIT_BAUD_RATE_SEL(x) (((x) & BIT_MASK_SYS_SPIC_INIT_BAUD_RATE_SEL) << BIT_SHIFT_SYS_SPIC_INIT_BAUD_RATE_SEL) + + +#define BIT_SHIFT_SYS_CPU_CLK_SEL 24 +#define BIT_MASK_SYS_CPU_CLK_SEL 0x3 +#define BIT_SYS_CPU_CLK_SEL(x) (((x) & BIT_MASK_SYS_CPU_CLK_SEL) << BIT_SHIFT_SYS_CPU_CLK_SEL) + + +//2 REG_SYS_EFUSE_SYSCFG7 +#define BIT_SYS_MEM_RMV_SIGN BIT(31) +#define BIT_SYS_MEM_RMV_1PRF1 BIT(29) +#define BIT_SYS_MEM_RMV_1PRF0 BIT(28) +#define BIT_SYS_MEM_RMV_1PSR BIT(27) +#define BIT_SYS_MEM_RMV_1PHSR BIT(26) +#define BIT_SYS_MEM_RMV_ROM BIT(25) + +#define BIT_SHIFT_SYS_MEM_RME_CPU 22 +#define BIT_MASK_SYS_MEM_RME_CPU 0x7 +#define BIT_SYS_MEM_RME_CPU(x) (((x) & BIT_MASK_SYS_MEM_RME_CPU) << BIT_SHIFT_SYS_MEM_RME_CPU) + + +#define BIT_SHIFT_SYS_MEM_RME_WLAN 19 +#define BIT_MASK_SYS_MEM_RME_WLAN 0x7 +#define BIT_SYS_MEM_RME_WLAN(x) (((x) & BIT_MASK_SYS_MEM_RME_WLAN) << BIT_SHIFT_SYS_MEM_RME_WLAN) + +#define BIT_SYS_MEM_RME_USB BIT(18) +#define BIT_SYS_MEM_RME_SDIO BIT(17) + +//2 REG_SYS_REGU_CTRL0 + +#define BIT_SHIFT_SYS_REGU_LDO25M_ADJ 20 +#define BIT_MASK_SYS_REGU_LDO25M_ADJ 0xf +#define BIT_SYS_REGU_LDO25M_ADJ(x) (((x) & BIT_MASK_SYS_REGU_LDO25M_ADJ) << BIT_SHIFT_SYS_REGU_LDO25M_ADJ) + +#define BIT_SYS_REGU_ANACK_4M_EN BIT(19) +#define BIT_SYS_REGU_ANACK_4M_SEL BIT(18) +#define BIT_SYS_REGU_PC_EF_EN BIT(17) +#define BIT_SYS_REGU_LDOH12_SLP_EN BIT(16) + +#define BIT_SHIFT_SYS_REGU_LDOH12_ADJ 12 +#define BIT_MASK_SYS_REGU_LDOH12_ADJ 0xf +#define BIT_SYS_REGU_LDOH12_ADJ(x) (((x) & BIT_MASK_SYS_REGU_LDOH12_ADJ) << BIT_SHIFT_SYS_REGU_LDOH12_ADJ) + + +#define BIT_SHIFT_SYS_REGU_LDO25E_ADJ 8 +#define BIT_MASK_SYS_REGU_LDO25E_ADJ 0xf +#define BIT_SYS_REGU_LDO25E_ADJ(x) (((x) & BIT_MASK_SYS_REGU_LDO25E_ADJ) << BIT_SHIFT_SYS_REGU_LDO25E_ADJ) + +#define BIT_SYS_REGU_DSLEPM_EN BIT(7) +#define BIT_SYS_REGU_PC_33V_EN BIT(3) +#define BIT_SYS_REGU_PC_EF25_EN BIT(2) +#define BIT_SYS_REGU_LDO25M_EN BIT(1) +#define BIT_SYS_REGU_LDO25E_EN BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_SWR_CTRL0 + +#define BIT_SHIFT_SYS_SWR12_COMP_R2 30 +#define BIT_MASK_SYS_SWR12_COMP_R2 0x3 +#define BIT_SYS_SWR12_COMP_R2(x) (((x) & BIT_MASK_SYS_SWR12_COMP_R2) << BIT_SHIFT_SYS_SWR12_COMP_R2) + + +#define BIT_SHIFT_SYS_SWR12_COMP_R1 28 +#define BIT_MASK_SYS_SWR12_COMP_R1 0x3 +#define BIT_SYS_SWR12_COMP_R1(x) (((x) & BIT_MASK_SYS_SWR12_COMP_R1) << BIT_SHIFT_SYS_SWR12_COMP_R1) + + +#define BIT_SHIFT_SYS_SWR12_COMP_C3 26 +#define BIT_MASK_SYS_SWR12_COMP_C3 0x3 +#define BIT_SYS_SWR12_COMP_C3(x) (((x) & BIT_MASK_SYS_SWR12_COMP_C3) << BIT_SHIFT_SYS_SWR12_COMP_C3) + + +#define BIT_SHIFT_SYS_SWR12_COMP_C2 24 +#define BIT_MASK_SYS_SWR12_COMP_C2 0x3 +#define BIT_SYS_SWR12_COMP_C2(x) (((x) & BIT_MASK_SYS_SWR12_COMP_C2) << BIT_SHIFT_SYS_SWR12_COMP_C2) + + +#define BIT_SHIFT_SYS_SWR12_COMP_C1 22 +#define BIT_MASK_SYS_SWR12_COMP_C1 0x3 +#define BIT_SYS_SWR12_COMP_C1(x) (((x) & BIT_MASK_SYS_SWR12_COMP_C1) << BIT_SHIFT_SYS_SWR12_COMP_C1) + +#define BIT_SYS_SWR12_COMP_TYPE_L BIT(21) +#define BIT_SYS_SWR12_FPWM_MD BIT(20) + +#define BIT_SHIFT_SYS_SPSLDO_VOL 17 +#define BIT_MASK_SYS_SPSLDO_VOL 0x7 +#define BIT_SYS_SPSLDO_VOL(x) (((x) & BIT_MASK_SYS_SPSLDO_VOL) << BIT_SHIFT_SYS_SPSLDO_VOL) + + +#define BIT_SHIFT_SYS_SWR12_IN 14 +#define BIT_MASK_SYS_SWR12_IN 0x7 +#define BIT_SYS_SWR12_IN(x) (((x) & BIT_MASK_SYS_SWR12_IN) << BIT_SHIFT_SYS_SWR12_IN) + + +#define BIT_SHIFT_SYS_SWR12_STD 12 +#define BIT_MASK_SYS_SWR12_STD 0x3 +#define BIT_SYS_SWR12_STD(x) (((x) & BIT_MASK_SYS_SWR12_STD) << BIT_SHIFT_SYS_SWR12_STD) + + +#define BIT_SHIFT_SYS_SWR12_VOL 8 +#define BIT_MASK_SYS_SWR12_VOL 0xf +#define BIT_SYS_SWR12_VOL(x) (((x) & BIT_MASK_SYS_SWR12_VOL) << BIT_SHIFT_SYS_SWR12_VOL) + + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID +#define BIT_SYS_SWR_EN BIT(1) +#define BIT_SYS_SWR_LDO_EN BIT(0) + +//2 REG_SYS_SWR_CTRL1 +#define BIT_SYS_SW12_PFM_SEL BIT(25) +#define BIT_SYS_SW12_AUTO_ZCD_L BIT(24) +#define BIT_SYS_SW12_AUTO_MODE BIT(23) +#define BIT_SYS_SW12_LDOF_L BIT(22) +#define BIT_SYS_SW12_OCPS_L BIT(21) + +#define BIT_SHIFT_SYS_SW12_TBOX 17 +#define BIT_MASK_SYS_SW12_TBOX 0x3 +#define BIT_SYS_SW12_TBOX(x) (((x) & BIT_MASK_SYS_SW12_TBOX) << BIT_SHIFT_SYS_SW12_TBOX) + + +#define BIT_SHIFT_SYS_SW12_NONOVRLAP_DLY 15 +#define BIT_MASK_SYS_SW12_NONOVRLAP_DLY 0x3 +#define BIT_SYS_SW12_NONOVRLAP_DLY(x) (((x) & BIT_MASK_SYS_SW12_NONOVRLAP_DLY) << BIT_SHIFT_SYS_SW12_NONOVRLAP_DLY) + +#define BIT_SYS_SW12_CLAMP_DUTY BIT(14) +#define BIT_SYS_SWR12_BYPASS_SSR BIT(13) +#define BIT_SYS_SWR12_ZCDOUT_EN BIT(12) +#define BIT_SYS_SWR12_POW_ZCD BIT(11) +#define BIT_SYS_SW12_AREN BIT(10) + +#define BIT_SHIFT_SYS_SWR12_OCP_CUR 7 +#define BIT_MASK_SYS_SWR12_OCP_CUR 0x7 +#define BIT_SYS_SWR12_OCP_CUR(x) (((x) & BIT_MASK_SYS_SWR12_OCP_CUR) << BIT_SHIFT_SYS_SWR12_OCP_CUR) + +#define BIT_SYS_SWR12_OCP_EN BIT(6) + +#define BIT_SHIFT_SYS_SWR12_SAWTOOTH_CF_L 4 +#define BIT_MASK_SYS_SWR12_SAWTOOTH_CF_L 0x3 +#define BIT_SYS_SWR12_SAWTOOTH_CF_L(x) (((x) & BIT_MASK_SYS_SWR12_SAWTOOTH_CF_L) << BIT_SHIFT_SYS_SWR12_SAWTOOTH_CF_L) + + +#define BIT_SHIFT_SYS_SWR12_SAWTOOTH_CFC_L 2 +#define BIT_MASK_SYS_SWR12_SAWTOOTH_CFC_L 0x3 +#define BIT_SYS_SWR12_SAWTOOTH_CFC_L(x) (((x) & BIT_MASK_SYS_SWR12_SAWTOOTH_CFC_L) << BIT_SHIFT_SYS_SWR12_SAWTOOTH_CFC_L) + + +#define BIT_SHIFT_SYS_SWR12_COMP_R3 0 +#define BIT_MASK_SYS_SWR12_COMP_R3 0x3 +#define BIT_SYS_SWR12_COMP_R3(x) (((x) & BIT_MASK_SYS_SWR12_COMP_R3) << BIT_SHIFT_SYS_SWR12_COMP_R3) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_SYS_XTAL_CTRL0 +#define BIT_SYS_XTAL_XQSEL BIT(31) +#define BIT_SYS_XTAL_XQSEL_RF BIT(30) + +#define BIT_SHIFT_SYS_XTAL_SC_XO 24 +#define BIT_MASK_SYS_XTAL_SC_XO 0x3f +#define BIT_SYS_XTAL_SC_XO(x) (((x) & BIT_MASK_SYS_XTAL_SC_XO) << BIT_SHIFT_SYS_XTAL_SC_XO) + + +#define BIT_SHIFT_SYS_XTAL_SC_XI 18 +#define BIT_MASK_SYS_XTAL_SC_XI 0x3f +#define BIT_SYS_XTAL_SC_XI(x) (((x) & BIT_MASK_SYS_XTAL_SC_XI) << BIT_SHIFT_SYS_XTAL_SC_XI) + + +#define BIT_SHIFT_SYS_XTAL_GMN 13 +#define BIT_MASK_SYS_XTAL_GMN 0x1f +#define BIT_SYS_XTAL_GMN(x) (((x) & BIT_MASK_SYS_XTAL_GMN) << BIT_SHIFT_SYS_XTAL_GMN) + + +#define BIT_SHIFT_SYS_XTAL_GMP 8 +#define BIT_MASK_SYS_XTAL_GMP 0x1f +#define BIT_SYS_XTAL_GMP(x) (((x) & BIT_MASK_SYS_XTAL_GMP) << BIT_SHIFT_SYS_XTAL_GMP) + +#define BIT_SYS_XTAL_EN BIT(1) +#define BIT_SYS_XTAL_BGMB_EN BIT(0) + +//2 REG_SYS_XTAL_CTRL1 + +#define BIT_SHIFT_SYS_XTAL_COUNTER_MUX 25 +#define BIT_MASK_SYS_XTAL_COUNTER_MUX 0x3 +#define BIT_SYS_XTAL_COUNTER_MUX(x) (((x) & BIT_MASK_SYS_XTAL_COUNTER_MUX) << BIT_SHIFT_SYS_XTAL_COUNTER_MUX) + +#define BIT_SYS_XTAL_DELAY_SYSPLL BIT(24) +#define BIT_SYS_XTAL_DELAY_USB BIT(23) +#define BIT_SYS_XTAL_DELAY_WLAFE BIT(22) +#define BIT_SYS_XTAL_AGPIO_SEL BIT(21) + +#define BIT_SHIFT_SYS_XTAL_DRV_AGPIO 19 +#define BIT_MASK_SYS_XTAL_DRV_AGPIO 0x3 +#define BIT_SYS_XTAL_DRV_AGPIO(x) (((x) & BIT_MASK_SYS_XTAL_DRV_AGPIO) << BIT_SHIFT_SYS_XTAL_DRV_AGPIO) + + +#define BIT_SHIFT_SYS_XTAL_AGPIO 16 +#define BIT_MASK_SYS_XTAL_AGPIO 0x7 +#define BIT_SYS_XTAL_AGPIO(x) (((x) & BIT_MASK_SYS_XTAL_AGPIO) << BIT_SHIFT_SYS_XTAL_AGPIO) + + +#define BIT_SHIFT_SYS_XTAL_DRV_SYSPLL 14 +#define BIT_MASK_SYS_XTAL_DRV_SYSPLL 0x3 +#define BIT_SYS_XTAL_DRV_SYSPLL(x) (((x) & BIT_MASK_SYS_XTAL_DRV_SYSPLL) << BIT_SHIFT_SYS_XTAL_DRV_SYSPLL) + +#define BIT_SYS_XTAL_GATE_SYSPLL BIT(13) + +#define BIT_SHIFT_SYS_XTAL_DRV_USB 11 +#define BIT_MASK_SYS_XTAL_DRV_USB 0x3 +#define BIT_SYS_XTAL_DRV_USB(x) (((x) & BIT_MASK_SYS_XTAL_DRV_USB) << BIT_SHIFT_SYS_XTAL_DRV_USB) + +#define BIT_SYS_XTAL_GATE_USB BIT(10) + +#define BIT_SHIFT_SYS_XTAL_DRV_WLAFE 8 +#define BIT_MASK_SYS_XTAL_DRV_WLAFE 0x3 +#define BIT_SYS_XTAL_DRV_WLAFE(x) (((x) & BIT_MASK_SYS_XTAL_DRV_WLAFE) << BIT_SHIFT_SYS_XTAL_DRV_WLAFE) + +#define BIT_SYS_XTAL_GATE_WLAFE BIT(7) + +#define BIT_SHIFT_SYS_XTAL_DRV_RF2 5 +#define BIT_MASK_SYS_XTAL_DRV_RF2 0x3 +#define BIT_SYS_XTAL_DRV_RF2(x) (((x) & BIT_MASK_SYS_XTAL_DRV_RF2) << BIT_SHIFT_SYS_XTAL_DRV_RF2) + +#define BIT_SYS_XTAL_GATE_RF2 BIT(4) + +#define BIT_SHIFT_SYS_XTAL_DRV_RF1 3 +#define BIT_MASK_SYS_XTAL_DRV_RF1 0x3 +#define BIT_SYS_XTAL_DRV_RF1(x) (((x) & BIT_MASK_SYS_XTAL_DRV_RF1) << BIT_SHIFT_SYS_XTAL_DRV_RF1) + +#define BIT_SYS_XTAL_GATE_RF1 BIT(1) + +#define BIT_SHIFT_SYS_XTAL_LDO 0 +#define BIT_MASK_SYS_XTAL_LDO 0x3 +#define BIT_SYS_XTAL_LDO(x) (((x) & BIT_MASK_SYS_XTAL_LDO) << BIT_SHIFT_SYS_XTAL_LDO) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_SYS_SYSPLL_CTRL0 + +#define BIT_SHIFT_SYS_SYSPLL_LPF_R3 29 +#define BIT_MASK_SYS_SYSPLL_LPF_R3 0x7 +#define BIT_SYS_SYSPLL_LPF_R3(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_R3) << BIT_SHIFT_SYS_SYSPLL_LPF_R3) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_CS 27 +#define BIT_MASK_SYS_SYSPLL_LPF_CS 0x3 +#define BIT_SYS_SYSPLL_LPF_CS(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_CS) << BIT_SHIFT_SYS_SYSPLL_LPF_CS) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_CP 25 +#define BIT_MASK_SYS_SYSPLL_LPF_CP 0x3 +#define BIT_SYS_SYSPLL_LPF_CP(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_CP) << BIT_SHIFT_SYS_SYSPLL_LPF_CP) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_C3 23 +#define BIT_MASK_SYS_SYSPLL_LPF_C3 0x3 +#define BIT_SYS_SYSPLL_LPF_C3(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_C3) << BIT_SHIFT_SYS_SYSPLL_LPF_C3) + +#define BIT_SYS_SYSPLL_WDOG_ENB BIT(22) +#define BIT_SYS_SYSPLL_CKTST_EN BIT(21) + +#define BIT_SHIFT_SYS_SYSPLL_MONCK_SEL 18 +#define BIT_MASK_SYS_SYSPLL_MONCK_SEL 0x7 +#define BIT_SYS_SYSPLL_MONCK_SEL(x) (((x) & BIT_MASK_SYS_SYSPLL_MONCK_SEL) << BIT_SHIFT_SYS_SYSPLL_MONCK_SEL) + + +#define BIT_SHIFT_SYS_SYSPLL_CP_IOFFSET 13 +#define BIT_MASK_SYS_SYSPLL_CP_IOFFSET 0x1f +#define BIT_SYS_SYSPLL_CP_IOFFSET(x) (((x) & BIT_MASK_SYS_SYSPLL_CP_IOFFSET) << BIT_SHIFT_SYS_SYSPLL_CP_IOFFSET) + +#define BIT_SYS_SYSPLL_CP_IDOUBLE BIT(12) + +#define BIT_SHIFT_SYS_SYSPLL_CP_BIAS 9 +#define BIT_MASK_SYS_SYSPLL_CP_BIAS 0x7 +#define BIT_SYS_SYSPLL_CP_BIAS(x) (((x) & BIT_MASK_SYS_SYSPLL_CP_BIAS) << BIT_SHIFT_SYS_SYSPLL_CP_BIAS) + +#define BIT_SYS_SYSPLL_FREF_EDGE BIT(8) +#define BIT_SYS_SYSPLL_EN BIT(1) +#define BIT_SYS_SYSPLL_LVPC_EN BIT(0) + +//2 REG_SYS_SYSPLL_CTRL1 +#define BIT_SYS_SYSPLL_CK500K_SEL BIT(15) +#define BIT_SYS_SYSPLL_CK200M_EN BIT(14) +#define BIT_SYS_SYSPLL_CKSDR_EN BIT(13) + +#define BIT_SHIFT_SYS_SYSPLL_CKSDR_DIV 11 +#define BIT_MASK_SYS_SYSPLL_CKSDR_DIV 0x3 +#define BIT_SYS_SYSPLL_CKSDR_DIV(x) (((x) & BIT_MASK_SYS_SYSPLL_CKSDR_DIV) << BIT_SHIFT_SYS_SYSPLL_CKSDR_DIV) + +#define BIT_SYS_SYSPLL_CK24P576_EN BIT(9) +#define BIT_SYS_SYSPLL_CK22P5792_EN BIT(8) +#define BIT_SYS_SYSPLL_CK_PS_EN BIT(6) + +#define BIT_SHIFT_SYS_SYSPLL_CK_PS_SEL 3 +#define BIT_MASK_SYS_SYSPLL_CK_PS_SEL 0x7 +#define BIT_SYS_SYSPLL_CK_PS_SEL(x) (((x) & BIT_MASK_SYS_SYSPLL_CK_PS_SEL) << BIT_SHIFT_SYS_SYSPLL_CK_PS_SEL) + + +#define BIT_SHIFT_SYS_SYSPLL_LPF_RS 0 +#define BIT_MASK_SYS_SYSPLL_LPF_RS 0x7 +#define BIT_SYS_SYSPLL_LPF_RS(x) (((x) & BIT_MASK_SYS_SYSPLL_LPF_RS) << BIT_SHIFT_SYS_SYSPLL_LPF_RS) + + +//2 REG_SYS_SYSPLL_CTRL2 + +#define BIT_SHIFT_XTAL_DRV_RF_LATCH 0 +#define BIT_MASK_XTAL_DRV_RF_LATCH 0xffffffffL +#define BIT_XTAL_DRV_RF_LATCH(x) (((x) & BIT_MASK_XTAL_DRV_RF_LATCH) << BIT_SHIFT_XTAL_DRV_RF_LATCH) + + +//2 REG_RSVD + +//2 REG_RSVD + +#define BIT_SHIFT_PESOC_CPU_OCP_CK_SEL 0 +#define BIT_MASK_PESOC_CPU_OCP_CK_SEL 0x7 +#define BIT_PESOC_CPU_OCP_CK_SEL(x) (((x) & BIT_MASK_PESOC_CPU_OCP_CK_SEL) << BIT_SHIFT_PESOC_CPU_OCP_CK_SEL) + + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_ + +//2 REG_SYS_ANA_TIM_CTRL + +#define BIT_SHIFT_SYS_ANACK_TU_TIME 16 +#define BIT_MASK_SYS_ANACK_TU_TIME 0x3f +#define BIT_SYS_ANACK_TU_TIME(x) (((x) & BIT_MASK_SYS_ANACK_TU_TIME) << BIT_SHIFT_SYS_ANACK_TU_TIME) + +#define BIT_SYS_DSBYCNT_EN BIT(15) + +#define BIT_SHIFT_SYS_DSTDY_TIM_SCAL 8 +#define BIT_MASK_SYS_DSTDY_TIM_SCAL 0xf +#define BIT_SYS_DSTDY_TIM_SCAL(x) (((x) & BIT_MASK_SYS_DSTDY_TIM_SCAL) << BIT_SHIFT_SYS_DSTDY_TIM_SCAL) + + +#define BIT_SHIFT_SYS_DSTBY_TIM_PERIOD 0 +#define BIT_MASK_SYS_DSTBY_TIM_PERIOD 0xff +#define BIT_SYS_DSTBY_TIM_PERIOD(x) (((x) & BIT_MASK_SYS_DSTBY_TIM_PERIOD) << BIT_SHIFT_SYS_DSTBY_TIM_PERIOD) + + +//2 REG_SYS_DSLP_TIM_CTRL + +#define BIT_SHIFT_SYS_REGU_ASIF_EN 24 +#define BIT_MASK_SYS_REGU_ASIF_EN 0xff +#define BIT_SYS_REGU_ASIF_EN(x) (((x) & BIT_MASK_SYS_REGU_ASIF_EN) << BIT_SHIFT_SYS_REGU_ASIF_EN) + + +#define BIT_SHIFT_SYS_REGU_ASIF_THP_DA 20 +#define BIT_MASK_SYS_REGU_ASIF_THP_DA 0x3 +#define BIT_SYS_REGU_ASIF_THP_DA(x) (((x) & BIT_MASK_SYS_REGU_ASIF_THP_DA) << BIT_SHIFT_SYS_REGU_ASIF_THP_DA) + + +#define BIT_SHIFT_SYS_REGU_ASIF_TPD_CK 18 +#define BIT_MASK_SYS_REGU_ASIF_TPD_CK 0x3 +#define BIT_SYS_REGU_ASIF_TPD_CK(x) (((x) & BIT_MASK_SYS_REGU_ASIF_TPD_CK) << BIT_SHIFT_SYS_REGU_ASIF_TPD_CK) + + +#define BIT_SHIFT_SYS_REGU_ASIF_TSP_DA 16 +#define BIT_MASK_SYS_REGU_ASIF_TSP_DA 0x3 +#define BIT_SYS_REGU_ASIF_TSP_DA(x) (((x) & BIT_MASK_SYS_REGU_ASIF_TSP_DA) << BIT_SHIFT_SYS_REGU_ASIF_TSP_DA) + +#define BIT_SYS_REGU_ASIF_POLL BIT(15) +#define BIT_SYS_REGU_ASIF_MODE BIT(14) +#define BIT_SYS_REGU_ASIF_WE BIT(12) + +#define BIT_SHIFT_SYS_REGU_ASIF_AD 8 +#define BIT_MASK_SYS_REGU_ASIF_AD 0xf +#define BIT_SYS_REGU_ASIF_AD(x) (((x) & BIT_MASK_SYS_REGU_ASIF_AD) << BIT_SHIFT_SYS_REGU_ASIF_AD) + + +#define BIT_SHIFT_SYS_REGU_ASIF_WD 0 +#define BIT_MASK_SYS_REGU_ASIF_WD 0xff +#define BIT_SYS_REGU_ASIF_WD(x) (((x) & BIT_MASK_SYS_REGU_ASIF_WD) << BIT_SHIFT_SYS_REGU_ASIF_WD) + + +//2 REG_SYS_DSLP_TIM_CAL_CTRL +#define BIT_SYS_DSLP_TIM_EN BIT(24) + +#define BIT_SHIFT_SYS_DSLP_TIM_PERIOD 0 +#define BIT_MASK_SYS_DSLP_TIM_PERIOD 0x7fffff +#define BIT_SYS_DSLP_TIM_PERIOD(x) (((x) & BIT_MASK_SYS_DSLP_TIM_PERIOD) << BIT_SHIFT_SYS_DSLP_TIM_PERIOD) + + +//2 REG_RSVD + +//2 REG_SYS_DEBUG_CTRL +#define BIT_SYS_DBG_PIN_EN BIT(0) + +//2 REG_SYS_PINMUX_CTRL +#define BIT_EEPROM_PIN_EN BIT(4) +#define BIT_SIC_PIN_EN BIT(0) + +//2 REG_SYS_GPIO_DSTBY_WAKE_CTRL0 +#define BIT_SYS_GPIOE3_WEVENT_STS BIT(27) +#define BIT_SYS_GPIOD5_WEVENT_STS BIT(26) +#define BIT_SYS_GPIOC7_WEVENT_STS BIT(25) +#define BIT_SYS_GPIOA5_WEVENT_STS BIT(24) +#define BIT_SYS_GPIO_GPE3_PULL_CTRL_EN BIT(19) +#define BIT_SYS_GPIO_GPD5_PULL_CTRL_EN BIT(18) +#define BIT_SYS_GPIO_GPC7_PULL_CTRL_EN BIT(17) +#define BIT_SYS_GPIO_GPA5_PULL_CTRL_EN BIT(16) +#define BIT_SYS_GPIOE3_WINT_MODE BIT(11) +#define BIT_SYS_GPIOD5_WINT_MODE BIT(10) +#define BIT_SYS_GPIOC7_WINT_MODE BIT(9) +#define BIT_SYS_GPIOA5_WINT_MODE BIT(8) +#define BIT_SYS_GPIOE3_PIN_EN BIT(3) +#define BIT_SYS_GPIOD5_PIN_EN BIT(2) +#define BIT_SYS_GPIOC7_PIN_EN BIT(1) +#define BIT_SYS_GPIOA5_PIN_EN BIT(0) + +//2 REG_SYS_GPIO_DSTBY_WAKE_CTRL1 +#define BIT_SYS_GPIOE3_SHTDN_N BIT(19) +#define BIT_SYS_GPIOD5_SHTDN_N BIT(18) +#define BIT_SYS_GPIOC7_SHTDN_N BIT(17) +#define BIT_SYS_GPIOA5_SHTDN_N BIT(16) + +#define BIT_SHIFT_SYS_WINT_DEBOUNCE_TIM_SCAL 8 +#define BIT_MASK_SYS_WINT_DEBOUNCE_TIM_SCAL 0x3 +#define BIT_SYS_WINT_DEBOUNCE_TIM_SCAL(x) (((x) & BIT_MASK_SYS_WINT_DEBOUNCE_TIM_SCAL) << BIT_SHIFT_SYS_WINT_DEBOUNCE_TIM_SCAL) + +#define BIT_SYS_GPIOE3_WINT_DEBOUNCE_EN BIT(3) +#define BIT_SYS_GPIOD5_WINT_DEBOUNCE_EN BIT(2) +#define BIT_SYS_GPIOC7_WINT_DEBOUNCE_EN BIT(1) +#define BIT_SYS_GPIOA5_WINT_DEBOUNCE_EN BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_DEBUG_REG + +#define BIT_SHIFT_SYS_DBG_VALUE 0 +#define BIT_MASK_SYS_DBG_VALUE 0xffffffffL +#define BIT_SYS_DBG_VALUE(x) (((x) & BIT_MASK_SYS_DBG_VALUE) << BIT_SHIFT_SYS_DBG_VALUE) + + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_SYS_EEPROM_CTRL0 + +#define BIT_SHIFT_EFUSE_UNLOCK 24 +#define BIT_MASK_EFUSE_UNLOCK 0xff +#define BIT_EFUSE_UNLOCK(x) (((x) & BIT_MASK_EFUSE_UNLOCK) << BIT_SHIFT_EFUSE_UNLOCK) + + +//2 REG_NOT_VALID +#define BIT_SYS_EFUSE_LDALL BIT(16) + +#define BIT_SHIFT_SYS_EEPROM_VPDIDX 8 +#define BIT_MASK_SYS_EEPROM_VPDIDX 0xff +#define BIT_SYS_EEPROM_VPDIDX(x) (((x) & BIT_MASK_SYS_EEPROM_VPDIDX) << BIT_SHIFT_SYS_EEPROM_VPDIDX) + + +#define BIT_SHIFT_SYS_EEPROM_MD 6 +#define BIT_MASK_SYS_EEPROM_MD 0x3 +#define BIT_SYS_EEPROM_MD(x) (((x) & BIT_MASK_SYS_EEPROM_MD) << BIT_SHIFT_SYS_EEPROM_MD) + +#define BIT_SYS_AUTOLOAD_SUS BIT(5) +#define BIT_SYS_EEPROM_SEL BIT(4) +#define BIT_SYS_EEPROM_EECS BIT(3) +#define BIT_SYS_EEPROM_EESK BIT(2) +#define BIT_SYS_EEPROM_EEDI BIT(1) +#define BIT_SYS_EEPROM_EEDO BIT(0) + +//2 REG_SYS_EEPROM_CTRL1 + +#define BIT_SHIFT_SYS_EEPROM_VPD 0 +#define BIT_MASK_SYS_EEPROM_VPD 0xffffffffL +#define BIT_SYS_EEPROM_VPD(x) (((x) & BIT_MASK_SYS_EEPROM_VPD) << BIT_SHIFT_SYS_EEPROM_VPD) + + +//2 REG_SYS_EFUSE_CTRL +#define BIT_SYS_EF_RWFLAG BIT(31) + +#define BIT_SHIFT_SYS_EF_PGPD 28 +#define BIT_MASK_SYS_EF_PGPD 0x7 +#define BIT_SYS_EF_PGPD(x) (((x) & BIT_MASK_SYS_EF_PGPD) << BIT_SHIFT_SYS_EF_PGPD) + + +#define BIT_SHIFT_SYS_EF_RDT 24 +#define BIT_MASK_SYS_EF_RDT 0xf +#define BIT_SYS_EF_RDT(x) (((x) & BIT_MASK_SYS_EF_RDT) << BIT_SHIFT_SYS_EF_RDT) + + +#define BIT_SHIFT_SYS_EF_PGTS 20 +#define BIT_MASK_SYS_EF_PGTS 0xf +#define BIT_SYS_EF_PGTS(x) (((x) & BIT_MASK_SYS_EF_PGTS) << BIT_SHIFT_SYS_EF_PGTS) + +#define BIT_SYS_EF_PDWN BIT(19) +#define BIT_SYS_EF_ALDEN BIT(18) + +#define BIT_SHIFT_SYS_EF_ADDR 8 +#define BIT_MASK_SYS_EF_ADDR 0x3ff +#define BIT_SYS_EF_ADDR(x) (((x) & BIT_MASK_SYS_EF_ADDR) << BIT_SHIFT_SYS_EF_ADDR) + + +#define BIT_SHIFT_SYS_EF_DATA 0 +#define BIT_MASK_SYS_EF_DATA 0xff +#define BIT_SYS_EF_DATA(x) (((x) & BIT_MASK_SYS_EF_DATA) << BIT_SHIFT_SYS_EF_DATA) + + +//2 REG_SYS_EFUSE_TEST +#define BIT_SYS_EF_CRES_SEL BIT(26) + +#define BIT_SHIFT_SYS_EF_SCAN_START 16 +#define BIT_MASK_SYS_EF_SCAN_START 0x1ff +#define BIT_SYS_EF_SCAN_START(x) (((x) & BIT_MASK_SYS_EF_SCAN_START) << BIT_SHIFT_SYS_EF_SCAN_START) + + +#define BIT_SHIFT_SYS_EF_SCAN_END 12 +#define BIT_MASK_SYS_EF_SCAN_END 0xf +#define BIT_SYS_EF_SCAN_END(x) (((x) & BIT_MASK_SYS_EF_SCAN_END) << BIT_SHIFT_SYS_EF_SCAN_END) + +#define BIT_SYS_EF_FORCE_PGMEN BIT(11) + +#define BIT_SHIFT_SYS_EF_CELL_SEL 8 +#define BIT_MASK_SYS_EF_CELL_SEL 0x3 +#define BIT_SYS_EF_CELL_SEL(x) (((x) & BIT_MASK_SYS_EF_CELL_SEL) << BIT_SHIFT_SYS_EF_CELL_SEL) + +#define BIT_SYS_EF_TRPT BIT(7) + +#define BIT_SHIFT_SYS_EF_SCAN_TTHD 0 +#define BIT_MASK_SYS_EF_SCAN_TTHD 0x7f +#define BIT_SYS_EF_SCAN_TTHD(x) (((x) & BIT_MASK_SYS_EF_SCAN_TTHD) << BIT_SHIFT_SYS_EF_SCAN_TTHD) + + +//2 REG_SYS_DSTBY_INFO0 + +//2 REG_NOT_VALID + +//2 REG_SYS_DSTBY_INFO1 + +//2 REG_SYS_DSTBY_INFO2 + +//2 REG_NOT_VALID + +//2 REG_SYS_DSTBY_INFO3 + +//2 REG_SYS_SLP_WAKE_EVENT_MSK0 +#define BIT_SYSON_WEVT_GPIO_DSTBY_MSK BIT(29) +#define BIT_SYSON_WEVT_A33_MSK BIT(28) +#define BIT_SYSON_WEVT_ADC_MSK BIT(26) +#define BIT_SYSON_WEVT_I2C_MSK BIT(24) +#define BIT_SYSON_WEVT_SPI_MSK BIT(22) +#define BIT_SYSON_WEVT_UART_MSK BIT(20) +#define BIT_SYSON_WEVT_USB_MSK BIT(16) +#define BIT_SYSON_WEVT_SDIO_MSK BIT(14) +#define BIT_SYSON_WEVT_NFC_MSK BIT(9) +#define BIT_SYSON_WEVT_WLAN_MSK BIT(8) +#define BIT_SYSON_WEVT_GPIO_MSK BIT(4) +#define BIT_SYSON_WEVT_CHIP_EN_MSK BIT(3) +#define BIT_SYSON_WEVT_OVER_CURRENT_MSK BIT(2) +#define BIT_SYSON_WEVT_GTIM_MSK BIT(1) +#define BIT_SYSON_WEVT_SYSTIM_MSK BIT(0) + +//2 REG_SYS_SLP_WAKE_EVENT_MSK1 + +//2 REG_SYS_SLP_WAKE_EVENT_STATUS0 +#define BIT_SYSON_WEVT_GPIO_DSTBY_STS BIT(29) +#define BIT_SYSON_WEVT_A33_STS BIT(28) +#define BIT_SYSON_WEVT_ADC_STS BIT(26) +#define BIT_SYSON_WEVT_I2C_STS BIT(24) +#define BIT_SYSON_WEVT_SPI_STS BIT(22) +#define BIT_SYSON_WEVT_UART_STS BIT(20) +#define BIT_SYSON_WEVT_USB_STS BIT(16) +#define BIT_SYSON_WEVT_SDIO_STS BIT(14) +#define BIT_SYSON_WEVT_NFC_STS BIT(9) +#define BIT_SYSON_WEVT_WLAN_STS BIT(8) +#define BIT_SYSON_WEVT_GPIO_STS BIT(4) +#define BIT_SYSON_WEVT_CHIP_EN_STS BIT(3) +#define BIT_SYSON_WEVT_OVER_CURRENT_STS BIT(2) +#define BIT_SYSON_WEVT_GTIM_STS BIT(1) +#define BIT_SYSON_WEVT_SYSTIM_STS BIT(0) + +//2 REG_SYS_SLP_WAKE_EVENT_STATUS1 + +//2 REG_SYS_SNF_WAKE_EVENT_MSK0 + +#define BIT_SHIFT_SYS_WKPERI_IMR0 1 +#define BIT_MASK_SYS_WKPERI_IMR0 0x7fffffffL +#define BIT_SYS_WKPERI_IMR0(x) (((x) & BIT_MASK_SYS_WKPERI_IMR0) << BIT_SHIFT_SYS_WKPERI_IMR0) + +#define BIT_SYSON_SNFEVT_ADC_MSK BIT(0) + +//2 REG_SYS_SNF_WAKE_EVENT_STATUS + +#define BIT_SHIFT_SYS_WKPERI_ISR0 1 +#define BIT_MASK_SYS_WKPERI_ISR0 0x7fffffffL +#define BIT_SYS_WKPERI_ISR0(x) (((x) & BIT_MASK_SYS_WKPERI_ISR0) << BIT_SHIFT_SYS_WKPERI_ISR0) + +#define BIT_SYSON_SNFEVT_ADC_STS BIT(0) + +//2 REG_SYS_PWRMGT_CTRL +#define BIT_SYSON_REGU_DSLP BIT(7) + +//2 REG_NOT_VALID +#define BIT_SYSON_PM_CMD_SLP BIT(2) +#define BIT_SYSON_PM_CMD_DSTBY BIT(1) +#define BIT_SYSON_PM_CMD_DSLP BIT(0) + +//2 REG_RSVD + +//2 REG_SYS_PWRMGT_OPTION +#define BIT_SYSON_PMOPT_NORM_SYSCLK_SEL BIT(30) +#define BIT_SYSON_PMOPT_NORM_SYSPLL_EN BIT(29) +#define BIT_SYSON_PMOPT_NORM_XTAL_EN BIT(28) +#define BIT_SYSON_PMOPT_NORM_EN_SOC BIT(27) +#define BIT_SYSON_PMOPT_NORM_EN_PWM BIT(26) +#define BIT_SYSON_PMOPT_NORM_EN_SWR BIT(25) +#define BIT_SYSON_PMOPT_NORM_LPLDO_SEL BIT(24) +#define BIT_SYSON_PMOPT_SNZ_SYSCLK_SEL BIT(22) +#define BIT_SYSON_PMOPT_SNZ_SYSPLL_EN BIT(21) +#define BIT_SYSON_PMOPT_SNZ_XTAL_EN BIT(20) +#define BIT_SYSON_PMOPT_SNZ_EN_SOC BIT(19) +#define BIT_SYSON_PMOPT_SNZ_EN_PWM BIT(18) +#define BIT_SYSON_PMOPT_SNZ_EN_SWR BIT(17) +#define BIT_SYSON_PMOPT_SNZ_LPLDO_SEL BIT(16) +#define BIT_SYSON_PMOPT_SLP_SYSCLK_SEL BIT(14) +#define BIT_SYSON_PMOPT_SLP_SYSPLL_EN BIT(13) +#define BIT_SYSON_PMOPT_SLP_XTAL_EN BIT(12) +#define BIT_SYSON_PMOPT_SLP_EN_SOC BIT(11) +#define BIT_SYSON_PMOPT_SLP_EN_PWM BIT(10) +#define BIT_SYSON_PMOPT_SLP_EN_SWR BIT(9) +#define BIT_SYSON_PMOPT_SLP_LPLDO_SEL BIT(8) +#define BIT_SYSON_PMOPT_DSTBY_SYSCLK_SEL BIT(6) +#define BIT_SYSON_PMOPT_DSTBY_SYSPLL_EN BIT(5) +#define BIT_SYSON_PMOPT_DSTBY_XTAL_EN BIT(4) +#define BIT_SYSON_PMOPT_DSTBY_EN_SOC BIT(3) +#define BIT_SYSON_PMOPT_DSTBY_EN_PWM BIT(2) +#define BIT_SYSON_PMOPT_DSTBY_EN_SWR BIT(1) +#define BIT_SYSON_PMOPT_DSTBY_LPLDO_SEL BIT(0) + +//2 REG_SYS_PWRMGT_OPTION_EXT +#define BIT_SYSON_PMOPT_SLP_ANACK_SEL BIT(2) +#define BIT_SYSON_PMOPT_SLP_ANACK_EN BIT(1) +#define BIT_SYSON_PMOPT_SLP_SWR_ADJ BIT(0) + +//2 REG_SYS_DSLP_WEVENT +#define BIT_SYSON_DSLP_GPIO BIT(2) +#define BIT_SYSON_DSLP_NFC BIT(1) +#define BIT_SYSON_DSLP_WTIMER33 BIT(0) + +//2 REG_SYS_PERI_MONITOR +#define BIT_SYSON_ISO33_NFC BIT(0) + +//2 REG_SYS_SYSTEM_CFG0 +#define BIT_SYSCFG_BD_PKG_SEL BIT(31) + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +#define BIT_SHIFT_VENDOR_ID 8 +#define BIT_MASK_VENDOR_ID 0xf +#define BIT_VENDOR_ID(x) (((x) & BIT_MASK_VENDOR_ID) << BIT_SHIFT_VENDOR_ID) + + +#define BIT_SHIFT_CHIP_VER 4 +#define BIT_MASK_CHIP_VER 0xf +#define BIT_CHIP_VER(x) (((x) & BIT_MASK_CHIP_VER) << BIT_SHIFT_CHIP_VER) + + +#define BIT_SHIFT_RF_RL_ID 0 +#define BIT_MASK_RF_RL_ID 0xf +#define BIT_RF_RL_ID(x) (((x) & BIT_MASK_RF_RL_ID) << BIT_SHIFT_RF_RL_ID) + + +//2 REG_SYS_SYSTEM_CFG1 + +#define BIT_SHIFT_SYSCFG_TRP_ICFG 28 +#define BIT_MASK_SYSCFG_TRP_ICFG 0xf +#define BIT_SYSCFG_TRP_ICFG(x) (((x) & BIT_MASK_SYSCFG_TRP_ICFG) << BIT_SHIFT_SYSCFG_TRP_ICFG) + +#define BIT_SYSCFG_TRP_BOOT_SEL_ BIT(27) +#define BIT_SysCFG_TRP_SPSLDO_SEL BIT(26) +#define BIT_V15_VLD BIT(16) +#define BIT_SYS_SYSPLL_CLK_RDY BIT(9) +#define BIT_SYS_XCLK_VLD BIT(8) +#define BIT_SYSCFG_ALDN_STS BIT(0) + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + +//2 REG_RSVD + +//2 REG_NOT_VALID + +//2 REG_NOT_VALID + + +//================= Register Address Definition =====================// +#define REG_SYS_PWR_CTRL 0x0000 +#define REG_SYS_ISO_CTRL 0x0002 +#define REG_SYS_FUNC_EN 0x0008 +#define REG_SYS_CLK_CTRL0 0x0010 +#define REG_SYS_CLK_CTRL1 0x0014 +#define REG_SYS_EFUSE_SYSCFG0 0x0020 +#define REG_SYS_EFUSE_SYSCFG1 0x0024 +#define REG_SYS_EFUSE_SYSCFG2 0x0028 +#define REG_SYS_EFUSE_SYSCFG3 0x002C +#define REG_SYS_EFUSE_SYSCFG4 0x0030 +#define REG_SYS_EFUSE_SYSCFG5 0x0034 +#define REG_SYS_EFUSE_SYSCFG6 0x0038 +#define REG_SYS_EFUSE_SYSCFG7 0x003C +#define REG_SYS_REGU_CTRL0 0x0040 +#define REG_SYS_SWR_CTRL0 0x0048 +#define REG_SYS_SWR_CTRL1 0x004C +#define REG_SYS_XTAL_CTRL0 0x0060 +#define REG_SYS_XTAL_CTRL1 0x0064 +#define REG_SYS_SYSPLL_CTRL0 0x0070 +#define REG_SYS_SYSPLL_CTRL1 0x0074 +#define REG_SYS_SYSPLL_CTRL2 0x0078 +#define REG_SYS_ANA_TIM_CTRL 0x0090 +#define REG_SYS_DSLP_TIM_CTRL 0x0094 +#define REG_SYS_DSLP_TIM_CAL_CTRL 0x0098 +#define REG_SYS_DEBUG_CTRL 0x00A0 +#define REG_SYS_PINMUX_CTRL 0x00A4 +#define REG_SYS_GPIO_DSTBY_WAKE_CTRL0 0x00A8 +#define REG_SYS_GPIO_DSTBY_WAKE_CTRL1 0x00AC +#define REG_SYS_DEBUG_REG 0x00BC +#define REG_SYS_EEPROM_CTRL0 0x00E0 +#define REG_SYS_EEPROM_CTRL1 0x00E4 +#define REG_SYS_EFUSE_CTRL 0x00E8 +#define REG_SYS_EFUSE_TEST 0x00EC +#define REG_SYS_DSTBY_INFO0 0x00F0 +#define REG_SYS_DSTBY_INFO1 0x00F4 +#define REG_SYS_DSTBY_INFO2 0x00F8 +#define REG_SYS_DSTBY_INFO3 0x00FC +#define REG_SYS_SLP_WAKE_EVENT_MSK0 0x0100 +#define REG_SYS_SLP_WAKE_EVENT_MSK1 0x0104 +#define REG_SYS_SLP_WAKE_EVENT_STATUS0 0x0108 +#define REG_SYS_SLP_WAKE_EVENT_STATUS1 0x010C +#define REG_SYS_SNF_WAKE_EVENT_MSK0 0x0110 +#define REG_SYS_SNF_WAKE_EVENT_STATUS 0x0114 +#define REG_SYS_PWRMGT_CTRL 0x0118 +#define REG_SYS_PWRMGT_OPTION 0x0120 +#define REG_SYS_PWRMGT_OPTION_EXT 0x0124 +#define REG_SYS_DSLP_WEVENT 0x0130 +#define REG_SYS_PERI_MONITOR 0x0134 +#define REG_SYS_SYSTEM_CFG0 0x01F0 +#define REG_SYS_SYSTEM_CFG1 0x01F4 +#define REG_SYS_SYSTEM_CFG2 0x01F8 + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_timer.h b/lib/fwlib/rtl8195a/rtl8195a_timer.h new file mode 100644 index 0000000..da4a540 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_timer.h @@ -0,0 +1,222 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_TIMER_H_ +#define _RTL8195A_TIMER_H_ + + +#define TIMER_TICK_US 31 + +#define TIMER_LOAD_COUNT_OFF 0x00 +#define TIMER_CURRENT_VAL_OFF 0x04 +#define TIMER_CTL_REG_OFF 0x08 +#define TIMER_EOI_OFF 0x0c +#define TIMER_INT_STATUS_OFF 0x10 +#define TIMER_INTERVAL 0x14 +#define TIMERS_INT_STATUS_OFF 0xa0 +#define TIMERS_EOI_OFF 0xa4 +#define TIMERS_RAW_INT_STATUS_OFF 0xa8 +#define TIMERS_COMP_VER_OFF 0xac + +#define MAX_TIMER_VECTOR_TABLE_NUM 6 + +#define HAL_TIMER_READ32(addr) (*((volatile u32*)(TIMER_REG_BASE + addr)))//HAL_READ32(TIMER_REG_BASE, addr) +#define HAL_TIMER_WRITE32(addr, value) ((*((volatile u32*)(TIMER_REG_BASE + addr))) = value)//HAL_WRITE32(TIMER_REG_BASE, addr, value) +#define HAL_TIMER_READ16(addr) (*((volatile u16*)(TIMER_REG_BASE + addr)))//HAL_READ16(TIMER_REG_BASE, addr) +#define HAL_TIMER_WRITE16(addr, value) ((*((volatile u16*)(TIMER_REG_BASE + addr))) = value)//HAL_WRITE16(TIMER_REG_BASE, addr, value) +#define HAL_TIMER_READ8(addr) (*((volatile u8*)(TIMER_REG_BASE + addr)))//HAL_READ8(TIMER_REG_BASE, addr) +#define HAL_TIMER_WRITE8(addr, value) ((*((volatile u8*)(TIMER_REG_BASE + addr))) = value)//HAL_WRITE8(TIMER_REG_BASE, addr, value) + +_LONG_CALL_ u32 +HalGetTimerIdRtl8195a( + IN u32 *TimerID +); + +_LONG_CALL_ BOOL +HalTimerInitRtl8195a( + IN VOID *Data +); + +_LONG_CALL_ u32 +HalTimerReadCountRtl8195a( + IN u32 TimerId +); + +_LONG_CALL_ VOID +HalTimerIrqClearRtl8195a( + IN u32 TimerId +); + +_LONG_CALL_ VOID +HalTimerDisRtl8195a( + IN u32 TimerId +); + +_LONG_CALL_ VOID +HalTimerEnRtl8195a( + IN u32 TimerId +); + +_LONG_CALL_ VOID +HalTimerDumpRegRtl8195a( + IN u32 TimerId +); + +// ROM Code patch +HAL_Status +HalTimerInitRtl8195a_Patch( + IN VOID *Data +); + +u32 +HalTimerReadCountRtl8195a_Patch( + IN u32 TimerId +); + +VOID +HalTimerReLoadRtl8195a_Patch( + IN u32 TimerId, + IN u32 LoadUs +); + +u32 +HalTimerReadCountRtl8195a_Patch( + IN u32 TimerId +); + +VOID +HalTimerIrqEnRtl8195a( + IN u32 TimerId +); + +VOID +HalTimerIrqDisRtl8195a( + IN u32 TimerId +); + +VOID +HalTimerEnRtl8195a_Patch( + IN u32 TimerId +); + +VOID +HalTimerDisRtl8195a_Patch( + IN u32 TimerId +); + +VOID +HalTimerDeInitRtl8195a_Patch( + IN VOID *Data +); + +#ifdef CONFIG_CHIP_C_CUT + +__weak _LONG_CALL_ +VOID +HalTimerIrq2To7HandleV02( + IN VOID *Data +); + +__weak _LONG_CALL_ +HAL_Status +HalTimerIrqRegisterRtl8195aV02( + IN VOID *Data +); + +__weak _LONG_CALL_ +HAL_Status +HalTimerInitRtl8195aV02( + IN VOID *Data +); + +__weak _LONG_CALL_ +u32 +HalTimerReadCountRtl8195aV02( + IN u32 TimerId +); + +__weak _LONG_CALL_ +VOID +HalTimerReLoadRtl8195aV02( + IN u32 TimerId, + IN u32 LoadUs +); + +__weak _LONG_CALL_ +HAL_Status +HalTimerIrqUnRegisterRtl8195aV02( + IN VOID *Data +); + +__weak _LONG_CALL_ +VOID +HalTimerDeInitRtl8195aV02( + IN VOID *Data +); + +#endif // end of "#ifdef CONFIG_CHIP_C_CUT" + +// HAL functions wrapper +static __inline HAL_Status +HalTimerInit( + IN VOID *Data +) +{ + return (HalTimerInitRtl8195a_Patch(Data)); +} + +static __inline VOID +HalTimerEnable( + IN u32 TimerId +) +{ + HalTimerIrqEnRtl8195a(TimerId); + HalTimerEnRtl8195a_Patch(TimerId); +} + +static __inline VOID +HalTimerDisable( + IN u32 TimerId +) +{ + HalTimerDisRtl8195a_Patch(TimerId); +} + +static __inline VOID +HalTimerReLoad( + IN u32 TimerId, + IN u32 LoadUs +) +{ + HalTimerReLoadRtl8195a_Patch(TimerId, LoadUs); +} + +#ifndef CONFIG_CHIP_C_CUT + +static __inline VOID +HalTimerDeInit( + IN VOID *Data +) +{ + HalTimerDeInitRtl8195a_Patch(Data); +} + +#else + +static __inline VOID +HalTimerDeInit( + IN VOID *Data +) +{ + HalTimerDeInitRtl8195aV02(Data); +} + +#endif // end of "#ifndef CONFIG_CHIP_C_CUT" + +#endif //_RTL8195A_TIMER_H_ diff --git a/lib/fwlib/rtl8195a/rtl8195a_uart.h b/lib/fwlib/rtl8195a/rtl8195a_uart.h new file mode 100644 index 0000000..c13191c --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_uart.h @@ -0,0 +1,532 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#ifndef _RTL8195A_UART_H_ +#define _RTL8195A_UART_H_ + +#define MAX_UART_INDEX 2 + +#define RUART_DLL_OFF 0x00 +#define RUART_DLM_OFF 0x04 //RW, DLAB = 1 +#define RUART_INTERRUPT_EN_REG_OFF 0x04 +#define RUART_IER_ERBI 0x01 //BIT0, Enable Received Data Available Interrupt (rx trigger) +#define RUART_IER_ETBEI (1<<1) //BIT1, Enable Transmitter FIFO Empty Interrupt (tx fifo empty) +#define RUART_IER_ELSI (1<<2) //BIT2, Enable Receiver Line Status Interrupt (receiver line status) +#define RUART_IER_EDSSI (1<<3) //BIT3, Enable Modem Status Interrupt (modem status transition) + +#define RUART_INT_ID_REG_OFF 0x08 //[R] +#define RUART_IIR_INT_PEND 0x01 +#define RUART_IIR_INT_ID (0x07<<1) //011(3), 010(2), 110(6), 001(1), 000(0) +#define RUART_FIFO_CTL_REG_OFF 0x08 //[W] +#define RUART_FIFO_CTL_REG_CLEAR_RXFIFO (1<<1) //BIT1, 0x02, Write 1 clear +#define RUART_FIFO_CTL_REG_CLEAR_TXFIFO (1<<2) //BIT2, 0x04, Write 1 clear +#define RUART_FIFO_CTL_REG_DMA_ENABLE 0x08 //BIT3 + +#define FIFO_CTL_DEFAULT_WITH_FIFO_DMA 0xC9 +#define FIFO_CTL_DEFAULT_WITH_FIFO 0xC1 + +#define RUART_MODEM_CTL_REG_OFF 0x10 +#define RUART_MCR_RTS BIT1 +#define RUART_MCL_AUTOFLOW_ENABLE (1<<5) //BIT5, 0x20 + +#define RUART_LINE_CTL_REG_OFF 0x0C +#define RUART_LINE_CTL_REG_DLAB_ENABLE (1<<7) //BIT7, 0x80 + +#define RUART_LINE_STATUS_REG_OFF 0x14 +#define RUART_LINE_STATUS_REG_DR 0x01 //BIT0, Data Ready indicator +#define RUART_LINE_STATUS_ERR_OVERRUN (1<<1) //BIT1, Over Run +#define RUART_LINE_STATUS_ERR_PARITY (1<<2) //BIT2, Parity error +#define RUART_LINE_STATUS_ERR_FRAMING (1<<3) //BIT3, Framing error +#define RUART_LINE_STATUS_ERR_BREAK (1<<4) //BIT4, Break interrupt error +#define RUART_LINE_STATUS_REG_THRE (1<<5) //BIT5, 0x20, Transmit Holding Register Empty Interrupt enable +#define RUART_LINE_STATUS_REG_TEMT (1<<6) //BIT6, 0x40, Transmitter Empty indicator(bit) +#define RUART_LINE_STATUS_ERR_RXFIFO (1<<7) //BIT7, RX FIFO error +#define RUART_LINE_STATUS_ERR (RUART_LINE_STATUS_ERR_OVERRUN|RUART_LINE_STATUS_ERR_PARITY| \ + RUART_LINE_STATUS_ERR_FRAMING|RUART_LINE_STATUS_ERR_BREAK| \ + RUART_LINE_STATUS_ERR_RXFIFO) //Line status error + +#define RUART_MODEM_STATUS_REG_OFF 0x18 //Modem Status Register +#define RUART_SCRATCH_PAD_REG_OFF 0x1C //Scratch Pad Register +#define RUART_SP_REG_RXBREAK_INT_STATUS (1<<7) //BIT7, 0x80, Write 1 clear +#define RUART_SP_REG_DBG_SEL (0x0F<<8) //[11:8], Debug port selection +#define RUART_SP_REG_XFACTOR_ADJ (0x7FF<<16) //[26:16] + +#define RUART_STS_REG_OFF 0x20 +#define RUART_STS_REG_RESET_RCV (1<<3) //BIT3, 0x08, Reset Uart Receiver +#define RUART_STS_REG_XFACTOR 0xF<<4 + +#define RUART_REV_BUF_REG_OFF 0x24 //Receiver Buffer Register +#define RUART_TRAN_HOLD_REG_OFF 0x24 //Transmitter Holding Register + +#define RUART_MISC_CTL_REG_OFF 0x28 +#define RUART_TXDMA_BURSTSIZE_MASK 0xF8 //7:3 +#define RUART_RXDMA_BURSTSIZE_MASK 0x1F00 //12:8 + +#define RUART_DEBUG_REG_OFF 0x3C + +// RUART_LINE_CTL_REG_OFF (0x0C) +#define BIT_SHIFT_LCR_WLS 0 // word length select: 0: 7 bits, 1: 8bits +#define BIT_MASK_LCR_WLS_8BITS 0x1 +#define BIT_LCR_WLS(x)(((x) & BIT_MASK_LCR_WLS_8BITS) << BIT_SHIFT_LCR_WLS) +#define BIT_CLR_LCR_WLS (~(BIT_MASK_LCR_WLS_8BITS << BIT_SHIFT_LCR_WLS)) + +#define BIT_SHIFT_LCR_STB 2 // Stop bit select: 0: no stop bit, 1: 1 stop bit +#define BIT_MASK_LCR_STB_EN 0x1 +#define BIT_LCR_STB_EN(x)(((x) & BIT_MASK_LCR_STB_EN) << BIT_SHIFT_LCR_STB) +#define BIT_INVC_LCR_STB_EN (~(BIT_MASK_LCR_STB_EN << BIT_SHIFT_LCR_STB)) + +#define BIT_SHIFT_LCR_PARITY_EN 3 +#define BIT_MASK_LCR_PARITY_EN 0x1 +#define BIT_LCR_PARITY_EN(x)(((x) & BIT_MASK_LCR_PARITY_EN) << BIT_SHIFT_LCR_PARITY_EN) +#define BIT_INVC_LCR_PARITY_EN (~(BIT_MASK_LCR_PARITY_EN << BIT_SHIFT_LCR_PARITY_EN)) + +#define BIT_SHIFT_LCR_PARITY_TYPE 4 +#define BIT_MASK_LCR_PARITY_TYPE 0x1 +#define BIT_LCR_PARITY_TYPE(x)(((x) & BIT_MASK_LCR_PARITY_TYPE) << BIT_SHIFT_LCR_PARITY_TYPE) +#define BIT_INVC_LCR_PARITY_TYPE (~(BIT_MASK_LCR_PARITY_TYPE << BIT_SHIFT_LCR_PARITY_TYPE)) + +#define BIT_SHIFT_LCR_STICK_PARITY_EN 5 +#define BIT_MASK_LCR_STICK_PARITY_EN 0x1 +#define BIT_LCR_STICK_PARITY_EN(x)(((x) & BIT_MASK_LCR_STICK_PARITY_EN) << BIT_SHIFT_LCR_STICK_PARITY_EN) +#define BIT_INVC_LCR_STICK_PARITY_EN (~(BIT_MASK_LCR_STICK_PARITY_EN << BIT_SHIFT_LCR_STICK_PARITY_EN)) + +#define BIT_SHIFT_LCR_BREAK_CTRL 6 +#define BIT_MASK_LCR_BREAK_CTRL 0x1 +#define BIT_UART_LCR_BREAK_CTRL ((BIT_MASK_LCR_BREAK_CTRL) << BIT_SHIFT_LCR_BREAK_CTRL) + +#define RUART_BAUD_RATE_2400 2400 +#define RUART_BAUD_RATE_4800 4800 +#define RUART_BAUD_RATE_9600 9600 +#define RUART_BAUD_RATE_19200 19200 +#define RUART_BAUD_RATE_38400 38400 +#define RUART_BAUD_RATE_57600 57600 +#define RUART_BAUD_RATE_115200 115200 +#define RUART_BAUD_RATE_921600 921600 +#define RUART_BAUD_RATE_1152000 1152000 + +#define HAL_RUART_READ32(UartIndex, addr) \ + HAL_READ32(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr) +#define HAL_RUART_WRITE32(UartIndex, addr, value) \ + HAL_WRITE32(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr, value) +#define HAL_RUART_READ16(UartIndex, addr) \ + HAL_READ16(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr) +#define HAL_RUART_WRITE16(UartIndex, addr, value) \ + HAL_WRITE16(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr, value) +#define HAL_RUART_READ8(UartIndex, addr) \ + HAL_READ8(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr) +#define HAL_RUART_WRITE8(UartIndex, addr, value) \ + HAL_WRITE8(UART0_REG_BASE+ (UartIndex*RUART_REG_OFF), addr, value) + +#define UART_OVSR_POOL_MIN 1000 +#define UART_OVSR_POOL_MAX 2090 +#define DIVISOR_RESOLUTION 10 +#define JITTER_LIMIT 100 +#define UART_SCLK (200000000*5/12) + +typedef struct _RUART_SPEED_SETTING_ { + u32 BaudRate; + u32 Ovsr; + u32 Div; + u16 Ovsr_adj; + u8 Ovsr_adj_max_bits; // 9: No parity, 10: with Parity + u8 Ovsr_adj_bits; + u16 *Ovsr_adj_map; + u32 max_err; // 10 ~ 100: 30 + u32 Ovsr_min; // 10 ~ 20: 1000 + u32 Ovsr_max; // 10 ~ 20: 2000 + u32 divisor_resolution; // 1 ~ 20: 10 + u32 jitter_lim; // 50 ~ 100: 100 + u32 sclk; // 83.33333 MHz +}RUART_SPEED_SETTING, *PRUART_SPEED_SETTING; + +typedef enum _UART_RXFIFO_TRIGGER_LEVEL_ { + OneByte = 0x00, + FourBytes = 0x01, + EightBytes = 0x10, + FourteenBytes = 0x11 +}UART_RXFIFO_TRIGGER_LEVEL, *PUART_RXFIFO_TRIGGER_LEVEL; + +typedef enum _RUART0_PINMUX_SELECT_ { + RUART0_MUX_TO_GPIOC = S0, + RUART0_MUX_TO_GPIOE = S1, + RUART0_MUX_TO_GPIOA = S2 +}RUART0_PINMUX_SELECT, *PRUART0_PINMUX_SELECT; + +typedef enum _RUART1_PINMUX_SELECT_ { + RUART1_MUX_TO_GPIOD = S0, + RUART1_MUX_TO_GPIOE = S1, + RUART1_MUX_TO_GPIOB = S2 +}RUART1_PINMUX_SELECT, *PRUART1_PINMUX_SELECT; + +typedef enum _RUART2_PINMUX_SELECT_ { + RUART2_MUX_TO_GPIOA = S0, + RUART2_MUX_TO_GPIOC = S1, + RUART2_MUX_TO_GPIOD = S2 +}RUART2_PINMUX_SELECT, *PRUART2_PINMUX_SELECT; + +typedef enum _RUART_FLOW_CONTROL_ { + AUTOFLOW_DISABLE = 0, + AUTOFLOW_ENABLE = 1 +}RUART_FLOW_CONTROL, *PRUART_FLOW_CONTROL; + +typedef enum _RUART_WORD_LEN_SEL_ { + RUART_WLS_7BITS = 0, + RUART_WLS_8BITS = 1 +}RUART_WORD_LEN_SEL, *PRUART_WORD_LEN_SEL; + +typedef enum _RUART_STOP_BITS_ { + RUART_STOP_BIT_1 = 0, + RUART_STOP_BIT_2 = 1 +}RUART_STOP_BITS, *PRUART_STOP_BITS; + +typedef enum _RUART_PARITY_CONTROL_ { + RUART_PARITY_DISABLE = 0, + RUART_PARITY_ENABLE = 1 +}RUART_PARITY_CONTROL, *PRUART_PARITY_CONTROL; + +typedef enum _RUART_PARITY_TYPE_ { + RUART_ODD_PARITY = 0, + RUART_EVEN_PARITY = 1 +}RUART_PARITY_TYPE, *PRUART_PARITY_TYPE; + +typedef enum _RUART_STICK_PARITY_CONTROL_ { + RUART_STICK_PARITY_DISABLE = 0, + RUART_STICK_PARITY_ENABLE = 1 +}RUART_STICK_PARITY_CONTROL, *PRUART_STICK_PARITY_CONTROL; + +typedef enum _UART_INT_ID_ { + ModemStatus = 0, + TxFifoEmpty = 1, + ReceiverDataAvailable = 2, + ReceivLineStatus = 3, + TimeoutIndication = 6 +}UART_INT_ID, *PUART_INT_ID; + +typedef enum _HAL_UART_State_ +{ + HAL_UART_STATE_NULL = 0x00, // UART hardware not been initial yet + HAL_UART_STATE_READY = 0x10, // UART is initialed, ready to use + HAL_UART_STATE_BUSY = 0x20, // UART hardware is busy on configuration + HAL_UART_STATE_BUSY_TX = 0x21, // UART is buzy on TX + HAL_UART_STATE_BUSY_RX = 0x22, // UART is busy on RX + HAL_UART_STATE_BUSY_TX_RX = 0x23, // UART is busy on TX an RX + HAL_UART_STATE_TIMEOUT = 0x30, // Transfer timeout + HAL_UART_STATE_ERROR = 0x40 // UART Error +}HAL_UART_State, *PHAL_UART_State; + +typedef enum _HAL_UART_Status_ +{ + HAL_UART_STATUS_OK = 0x00, // Transfer OK + HAL_UART_STATUS_TIMEOUT = 0x01, // Transfer Timeout + HAL_UART_STATUS_ERR_OVERRUN = 0x02, // RX Over run + HAL_UART_STATUS_ERR_PARITY = 0x04, // Parity error + HAL_UART_STATUS_ERR_FRAM = 0x08, // Framing Error + HAL_UART_STATUS_ERR_BREAK = 0x10, // Break Interrupt + HAL_UART_STATUS_ERR_PARA = 0x20, // Parameter error + HAL_UART_STATUS_ERR_RXFIFO = 0x80, // RX FIFO error +}HAL_UART_Status, *PHAL_UART_Status; + +u32 +HalRuartGetDebugValueRtl8195a( + IN VOID* Data, + IN u32 DbgSel + ); + +#if 0 +u32 +FindElementIndex( + u32 Element, + u32* Array + ); +#endif + +VOID +RuartResetRxFifoRtl8195a( + IN u8 UartIndex + ); +#if 0 +VOID +RuartBusDomainEnableRtl8195a( + IN u8 UartIndex + ); +#endif + +HAL_Status +HalRuartResetRxFifoRtl8195a( + IN VOID *Data + ); + +HAL_Status +HalRuartInitRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartDeInitRtl8195a( + IN VOID *Data ///< RUART Adapter + ); + +HAL_Status +HalRuartPutCRtl8195a( + IN VOID *Data, + IN u8 TxData + ); + +u32 +HalRuartSendRtl8195a( + IN VOID *Data, + IN u8 *pTxData, + IN u32 Length, + IN u32 Timeout + ); + +HAL_Status +HalRuartIntSendRtl8195a( + IN VOID *Data, // PHAL_RUART_ADAPTER + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send + ); + +HAL_Status +HalRuartDmaSendRtl8195a( + IN VOID *Data, // PHAL_RUART_ADAPTER + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send +); + +HAL_Status +HalRuartStopSendRtl8195a( + IN VOID *Data // PHAL_RUART_ADAPTER +); + +HAL_Status +HalRuartGetCRtl8195a( + IN VOID *Data, + OUT u8 *pRxByte + ); + +u32 +HalRuartRecvRtl8195a( + IN VOID *Data, + IN u8 *pRxData, + IN u32 Length, + IN u32 Timeout + ); + +HAL_Status +HalRuartIntRecvRtl8195a( + IN VOID *Data, ///< RUART Adapter + IN u8 *pRxData, ///< Rx buffer + IN u32 Length // buffer length + ); + +HAL_Status +HalRuartDmaRecvRtl8195a( + IN VOID *Data, ///< RUART Adapter + IN u8 *pRxData, ///< Rx buffer + IN u32 Length // buffer length + ); + +HAL_Status +HalRuartStopRecvRtl8195a( + IN VOID *Data // PHAL_RUART_ADAPTER +); + +u8 +HalRuartGetIMRRtl8195a( + IN VOID *Data + ); + +_LONG_CALL_ VOID +HalRuartSetIMRRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartDmaInitRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartRTSCtrlRtl8195a( + IN VOID *Data, + IN BOOLEAN RtsCtrl + ); + +VOID +HalRuartRegIrqRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartIntEnableRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartIntDisableRtl8195a( + IN VOID *Data + ); + +VOID +HalRuartAdapterLoadDefRtl8195a( + IN VOID *pAdp, + IN u8 UartIdx +); + +VOID +HalRuartTxGdmaLoadDefRtl8195a( + IN VOID *pAdp, + IN VOID *pCfg +); + +VOID +HalRuartRxGdmaLoadDefRtl8195a( + IN VOID *pAdp, + IN VOID *pCfg +); + +_LONG_CALL_ HAL_Status HalRuartIntSendRtl8195aV02( + IN VOID *Data, // PHAL_RUART_ADAPTER + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send +); + +_LONG_CALL_ HAL_Status +HalRuartIntRecvRtl8195aV02( + IN VOID *Data, ///< RUART Adapter + IN u8 *pRxData, ///< Rx buffer + IN u32 Length // buffer length +); + +_LONG_CALL_ s32 +FindElementIndex_v02( + u32 Element, ///< RUART Baudrate + u32* Array, ///< Pre-defined Baudrate Array + u32 ElementNo +); + +_LONG_CALL_ HAL_Status HalRuartInitRtl8195a_v02(IN VOID *Data); + +// New added function 2015/04/20 +HAL_Status +HalRuartResetTxFifoRtl8195a( + IN VOID *Data ///< RUART Adapter + ); + +HAL_Status +HalRuartSetBaudRateRtl8195a( + IN VOID *Data + ); + +HAL_Status +HalRuartEnableRtl8195a( + IN VOID *Data +); + +HAL_Status +HalRuartDisableRtl8195a( + IN VOID *Data +); + +HAL_Status +HalRuartFlowCtrlRtl8195a( + IN VOID *Data +); + +HAL_Status +HalRuartDmaSendRtl8195a_Patch( + IN VOID *Data, + IN u8 *pTxData, + IN u32 Length +); + +HAL_Status +RuartIsTimeout ( + u32 StartCount, + u32 TimeoutCnt +); + +HAL_Status +HalRuartStopRecvRtl8195a_Patch( + IN VOID *Data +); + +HAL_Status +HalRuartStopSendRtl8195a_Patch( + IN VOID *Data +); + +VOID +HalRuartEnterCriticalRtl8195a( + IN VOID *Data +); + +VOID +HalRuartExitCriticalRtl8195a( + IN VOID *Data +); + +#if CONFIG_CHIP_E_CUT +_LONG_CALL_ HAL_Status +HalRuartSetBaudRateRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ HAL_Status +HalRuartInitRtl8195a_V04( + IN VOID *Data ///< RUART Adapter +); + +_LONG_CALL_ HAL_Status +HalRuartEnableRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ HAL_Status +HalRuartDisableRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ HAL_Status +HalRuartFlowCtrlRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ HAL_Status +HalRuartDmaSendRtl8195a_V04( + IN VOID *Data, + IN u8 *pTxData, + IN u32 Length +); + +_LONG_CALL_ HAL_Status +HalRuartStopRecvRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ HAL_Status +HalRuartStopSendRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ VOID +HalRuartEnterCriticalRtl8195a_V04( + IN VOID *Data +); + +_LONG_CALL_ VOID +HalRuartExitCriticalRtl8195a_V04( + IN VOID *Data +); + +#endif // #if CONFIG_CHIP_E_CUT + +#endif diff --git a/lib/fwlib/rtl8195a/rtl8195a_wdt.h b/lib/fwlib/rtl8195a/rtl8195a_wdt.h new file mode 100644 index 0000000..edbedd2 --- /dev/null +++ b/lib/fwlib/rtl8195a/rtl8195a_wdt.h @@ -0,0 +1,86 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2014 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_WDT_H_ +#define _RTL8195A_WDT_H_ + +#define WDGTIMERELY (10*1024) //us + +typedef struct _WDG_REG_ { + u16 WdgScalar; + u8 WdgEnByte; + u8 WdgClear:1; + u8 WdgCunLimit:4; + u8 Rsvd:1; + u8 WdgMode:1; + u8 WdgToISR:1; +}WDG_REG, *PWDG_REG; + +typedef struct _WDG_ADAPTER_ { + + WDG_REG Ctrl; + IRQ_HANDLE IrqHandle; + TIMER_ADAPTER WdgGTimer; + VOID (*UserCallback)(u32 callback_id); // User callback function + u32 callback_id; +}WDG_ADAPTER, *PWDG_ADAPTER; + +typedef enum _WDG_CNTLMT_ { + CNT1H = 0, + CNT3H = 1, + CNT7H = 2, + CNTFH = 3, + CNT1FH = 4, + CNT3FH = 5, + CNT7FH = 6, + CNTFFH = 7, + CNT1FFH = 8, + CNT3FFH = 9, + CNT7FFH = 10, + CNTFFFH = 11 +}WDG_CNTLMT, *PWDG_CNTLMT; + + +typedef enum _WDG_MODE_ { + INT_MODE = 0, + RESET_MODE = 1 +}WDG_MODE, *PWDG_MODE; + +extern VOID +WDGInitial( + IN u32 Period +); + +extern VOID +WDGIrqInitial( + VOID +); + +extern VOID +WDGIrqInitial( + VOID +); + +extern VOID +WDGStop( + VOID +); + +extern VOID +WDGRefresh( + VOID +); + +extern VOID +WDGIrqCallBackReg( + IN VOID *CallBack, + IN u32 Id +); + +#endif //_RTL8195A_WDT_H_ diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_adc.c b/lib/fwlib/rtl8195a/src/rtl8195a_adc.c new file mode 100644 index 0000000..62656aa --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_adc.c @@ -0,0 +1,387 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "platform_autoconf.h" +#include "diag.h" +#include "rtl8195a_adc.h" +#include "hal_adc.h" + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CInit8195a +// +// Description: +// To initialize I2C module by using the given data. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the DeInit process. +// _EXIT_SUCCESS if the initialization succeeded. +// _EXIT_FAILURE if the initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalADCInit8195a( + IN VOID *Data +) +{ + PHAL_ADC_INIT_DAT pHalAdcInitData = (PHAL_ADC_INIT_DAT)Data; + u32 AdcTempDat; + u8 AdcTempIdx = pHalAdcInitData->ADCIdx; + + /* Enable ADC power cut */ +/* + AdcTempDat = HAL_ADC_READ32(REG_ADC_POWER); + AdcTempDat |= BIT_ADC_PWR_AUTO; + HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat); +*/ + + /* ADC Control register set-up*/ + AdcTempDat = 0; + AdcTempDat |= (BIT_CTRL_ADC_COMP_ONLY(pHalAdcInitData->ADCCompOnly) | + BIT_CTRL_ADC_ONESHOT(pHalAdcInitData->ADCOneShotEn) | + BIT_CTRL_ADC_OVERWRITE(pHalAdcInitData->ADCOverWREn) | + BIT_CTRL_ADC_ENDIAN(pHalAdcInitData->ADCEndian) | + BIT_CTRL_ADC_BURST_SIZE(pHalAdcInitData->ADCBurstSz) | + BIT_CTRL_ADC_THRESHOLD(pHalAdcInitData->ADCOneShotTD) | + BIT_CTRL_ADC_DBG_SEL(pHalAdcInitData->ADCDbgSel)); + HAL_ADC_WRITE32(REG_ADC_CONTROL,AdcTempDat); + + DBG_8195A_ADC_LVL(HAL_ADC_LVL,"REG_ADC_CONTROL:%x\n", HAL_ADC_READ32(REG_ADC_CONTROL)); + + /* ADC compare value and compare method setting*/ + switch (AdcTempIdx) { + case ADC0_SEL: + AdcTempDat = HAL_ADC_READ32(REG_ADC_COMP_VALUE_L); + AdcTempDat &= ~(BIT_ADC_COMP_TH_0(0xFFFF)); + AdcTempDat |= BIT_CTRL_ADC_COMP_TH_0(pHalAdcInitData->ADCCompTD); + HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_L, AdcTempDat); + break; + + case ADC1_SEL: + AdcTempDat = HAL_ADC_READ32(REG_ADC_COMP_VALUE_L); + AdcTempDat &= ~(BIT_ADC_COMP_TH_1(0xFFFF)); + AdcTempDat |= BIT_CTRL_ADC_COMP_TH_1(pHalAdcInitData->ADCCompTD); + HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_L, AdcTempDat); + break; + + case ADC2_SEL: + AdcTempDat = HAL_ADC_READ32(REG_ADC_COMP_VALUE_H); + AdcTempDat &= ~(BIT_ADC_COMP_TH_2(0xFFFF)); + AdcTempDat |= BIT_CTRL_ADC_COMP_TH_2(pHalAdcInitData->ADCCompTD); + HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_H, AdcTempDat); + break; + + case ADC3_SEL: + AdcTempDat = HAL_ADC_READ32(REG_ADC_COMP_VALUE_H); + AdcTempDat &= ~(BIT_ADC_COMP_TH_3(0xFFFF)); + AdcTempDat |= BIT_CTRL_ADC_COMP_TH_3(pHalAdcInitData->ADCCompTD); + HAL_ADC_WRITE32(REG_ADC_COMP_VALUE_H, AdcTempDat); + break; + default: + return _EXIT_FAILURE; + } + + /* ADC compare mode setting */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_COMP_SET); + AdcTempDat &= (~(0x01 << pHalAdcInitData->ADCIdx)); + AdcTempDat |= (BIT_CTRL_ADC_COMP_0_EN(pHalAdcInitData->ADCCompCtrl) << + pHalAdcInitData->ADCIdx); + HAL_ADC_WRITE32(REG_ADC_COMP_SET, AdcTempDat); + + /* ADC audio mode set-up */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + AdcTempDat &= ~(BIT_ADC_AUDIO_EN); + AdcTempDat |= BIT_CTRL_ADC_AUDIO_EN(pHalAdcInitData->ADCAudioEn); + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, AdcTempDat); + + /* ADC enable manually setting */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + AdcTempDat &= ~(BIT_ADC_EN_MANUAL); + AdcTempDat |= BIT_CTRL_ADC_EN_MANUAL(pHalAdcInitData->ADCEnManul); + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, AdcTempDat); + + + /* ADC analog parameter 0 */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + DBG_ADC_INFO("AD0:%x\n", AdcTempDat); + //AdcTempDat |= (BIT0); + if (pHalAdcInitData->ADCInInput == 1){ + AdcTempDat &= (~BIT14); + } + else { + AdcTempDat |= (BIT14); + } + AdcTempDat &= (~(BIT3|BIT2)); + + /* Adjust VCM for C-Cut*/ +#ifdef CONFIG_CHIP_C_CUT + AdcTempDat |= (BIT22); +#endif + + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, AdcTempDat); + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + DBG_ADC_INFO("AD0:%x\n", AdcTempDat); + + /* ADC analog parameter 1 */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD1); + AdcTempDat &= (~BIT1); + AdcTempDat |= (BIT2|BIT0); + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD1, AdcTempDat); + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD1); + DBG_ADC_INFO("AD1:%x\n", AdcTempDat); + + /* ADC analog parameter 2 */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD2); + DBG_ADC_INFO("AD2:%x\n", AdcTempDat); + AdcTempDat = 0x67884400; + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD2, AdcTempDat); + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD2); + DBG_ADC_INFO("AD2:%x\n", AdcTempDat); + + /* ADC analog parameter 3 */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD3); + DBG_ADC_INFO("AD3:%x\n", AdcTempDat); + AdcTempDat = 0x77780039; + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD3, AdcTempDat); + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD3); + DBG_ADC_INFO("AD3:%x\n", AdcTempDat); + + /* ADC analog parameter 4 */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD4); + DBG_ADC_INFO("AD4:%x\n", AdcTempDat); + AdcTempDat = 0x0004d501; + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD4, AdcTempDat); + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD4); + DBG_ADC_INFO("AD4:%x\n", AdcTempDat); + + /* ADC analog parameter 5 */ + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD5); + DBG_ADC_INFO("AD5:%x\n", AdcTempDat); + AdcTempDat = 0x1E010800; + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD5, AdcTempDat); + AdcTempDat = HAL_ADC_READ32(REG_ADC_ANAPAR_AD5); + DBG_ADC_INFO("AD5:%x\n", AdcTempDat); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CInit8195a +// +// Description: +// To initialize I2C module by using the given data. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the DeInit process. +// _EXIT_SUCCESS if the initialization succeeded. +// _EXIT_FAILURE if the initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalADCDeInit8195a( + IN VOID *Data +) +{ + u32 AdcTempDat; + + AdcTempDat = HAL_ADC_READ32(REG_ADC_POWER); + AdcTempDat &= ~(BIT_ADC_PWR_AUTO); + HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CIntrCtrl8195a +// +// Description: +// Modify the I2C interrupt mask according to the given value +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the de-initialization succeeded. +// _EXIT_FAILURE if the de-initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalADCEnableRtl8195a( + IN VOID *Data +){ + PHAL_ADC_INIT_DAT pHalAdcInitData = (PHAL_ADC_INIT_DAT)Data; + u32 AdcTempDat; + DBG_ADC_INFO("HalADCEnableRtl8195a\n"); + + AdcTempDat = HAL_ADC_READ32(REG_ADC_POWER); + + AdcTempDat &= (~BIT_ADC_PWR_AUTO); + AdcTempDat |= 0x02; + HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat); + AdcTempDat |= 0x04; + HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat); + AdcTempDat &= (~0x08); + HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat); + + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_POWER); + DBG_ADC_INFO("HalADCEnableRtl8195a, power reg:%x\n",AdcTempDat); + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CIntrCtrl8195a +// +// Description: +// Modify the I2C interrupt mask according to the given value +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the de-initialization succeeded. +// _EXIT_FAILURE if the de-initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalADCIntrCtrl8195a( + IN VOID *Data +){ + PHAL_ADC_INIT_DAT pHalAdcInitData = (PHAL_ADC_INIT_DAT)Data; + + HAL_ADC_WRITE32(REG_ADC_INTR_EN, pHalAdcInitData->ADCIntrMSK); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CReceiveRtl8195a +// +// Description: +// Directly read one data byte a I2C data fifo. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The first data fifo content. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +u32 +HalADCReceiveRtl8195a( + IN VOID *Data +){ + u32 AdcTempDat; + + AdcTempDat = HAL_ADC_READ32(REG_ADC_FIFO_READ); + + return (AdcTempDat); +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CReadRegRtl8195a +// +// Description: +// Directly read a I2C register according to the register offset. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// [in] I2CReg - +// The I2C register offset. +// +// Return: +// The register content in u32 format. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +u32 +HalADCReadRegRtl8195a( + IN VOID *Data, + IN u8 I2CReg +){ + u32 AdcTempDat; + + AdcTempDat = HAL_ADC_READ32(I2CReg); + return (AdcTempDat); +} + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_dac.c b/lib/fwlib/rtl8195a/src/rtl8195a_dac.c new file mode 100644 index 0000000..a9bc7a7 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_dac.c @@ -0,0 +1,269 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "rtl8195a_dac.h" +#include "hal_dac.h" + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalDACInit8195a +// +// Description: +// To initialize DAC module by using the given data. +// +// Arguments: +// [in] VOID *Data - +// The DAC parameter data struct. +// +// Return: +// The status of the DeInit process. +// _EXIT_SUCCESS if the initialization succeeded. +// _EXIT_FAILURE if the initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-15. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalDACInit8195a( + IN VOID *Data +){ + PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)Data; + u32 DacTempDat; + u8 DacTempIdx = pHalDacInitData->DACIdx; + + /* Enable DAC power cut */ + DacTempDat = HAL_DAC_READ32(0, REG_DAC_PWR_CTRL); + DacTempDat |= BIT_DAC_PWR_AUTO; + + HAL_DAC_WRITE32(0, REG_DAC_PWR_CTRL, DacTempDat); + + /* Disable DAC module first */ + HAL_DAC_WRITE32(DacTempIdx, REG_DAC_CTRL, 0); + + /* Setup DAC module */ + DacTempDat = 0; + DacTempDat |= (BIT_CTRL_DAC_SPEED(pHalDacInitData->DACDataRate) | + BIT_CTRL_DAC_ENDIAN(pHalDacInitData->DACEndian) | + BIT_CTRL_DAC_FILTER_SETTLE(pHalDacInitData->DACFilterSet) | + BIT_CTRL_DAC_BURST_SIZE(pHalDacInitData->DACBurstSz) | + BIT_CTRL_DAC_DBG_SEL(pHalDacInitData->DACDbgSel) | + BIT_CTRL_DAC_DSC_DBG_SEL(pHalDacInitData->DACDscDbgSel) | + BIT_CTRL_DAC_BYPASS_DSC(pHalDacInitData->DACBPDsc) | + BIT_CTRL_DAC_DELTA_SIGMA(pHalDacInitData->DACDeltaSig)); + + HAL_DAC_WRITE32(DacTempIdx, REG_DAC_CTRL, DacTempDat); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CInit8195a +// +// Description: +// To initialize I2C module by using the given data. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the DeInit process. +// _EXIT_SUCCESS if the initialization succeeded. +// _EXIT_FAILURE if the initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalDACDeInit8195a( + IN VOID *Data +){ + PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)Data; + u32 DacTempDat; + + DacTempDat = HAL_DAC_READ32(pHalDacInitData->DACIdx, REG_DAC_CTRL); + DacTempDat &= (~BIT_DAC_FIFO_EN); + HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC_CTRL ,DacTempDat); + + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CIntrCtrl8195a +// +// Description: +// Modify the I2C interrupt mask according to the given value +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the de-initialization succeeded. +// _EXIT_FAILURE if the de-initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalDACEnableRtl8195a( + IN VOID *Data +){ + PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)Data; + u32 DacTempDat; + u8 DacTempIdx = pHalDacInitData->DACIdx; + + DacTempDat = HAL_DAC_READ32(DacTempIdx, REG_DAC_CTRL); + DacTempDat &= (~BIT_DAC_FIFO_EN); + + DacTempDat |= BIT_CTRL_DAC_FIFO_EN(pHalDacInitData->DACEn); + HAL_DAC_WRITE32(DacTempIdx, REG_DAC_CTRL, DacTempDat); + + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CIntrCtrl8195a +// +// Description: +// Modify the I2C interrupt mask according to the given value +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the de-initialization succeeded. +// _EXIT_FAILURE if the de-initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +HalDACIntrCtrl8195a( + IN VOID *Data +){ + PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)Data; + + HAL_DAC_WRITE32(pHalDacInitData->DACIdx, REG_DAC_INTR_CTRL, pHalDacInitData->DACIntrMSK); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CReceiveRtl8195a +// +// Description: +// Directly read one data byte a I2C data fifo. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The first data fifo content. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +u8 +HalDACSendRtl8195a( + IN VOID *Data +){ + + + return (0); +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalDACReadRegRtl8195a +// +// Description: +// +// +// Arguments: +// [in] VOID *Data - +// The DAC parameter data struct. +// [in] I2CReg - +// The DAC register offset. +// +// Return: +// The DAC register content in u32 format. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-15. +// +//--------------------------------------------------------------------------------------------------- +u32 +HalDACReadRegRtl8195a( + IN VOID *Data, + IN u8 I2CReg +){ + PHAL_DAC_INIT_DAT pHalDacInitData = (PHAL_DAC_INIT_DAT)Data; + + //DBG_8195A_DAC("dac read reg idx:%x\n",pHalDacInitData->DACIdx); + //DBG_8195A_DAC("dac read reg offset:%x\n",I2CReg); + + return (u32)HAL_DAC_READ32(pHalDacInitData->DACIdx, I2CReg); +} + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_gdma.c b/lib/fwlib/rtl8195a/src/rtl8195a_gdma.c new file mode 100644 index 0000000..3c5f8dd --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_gdma.c @@ -0,0 +1,291 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "rtl8195a_gdma.h" +#include "hal_gdma.h" + +#ifndef CONFIG_CHIP_E_CUT +BOOL +HalGdmaChBlockSetingRtl8195a( + IN VOID *Data +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + PGDMA_CH_LLI_ELE pLliEle; + struct GDMA_CH_LLI *pGdmaChLli; + struct BLOCK_SIZE_LIST *pGdmaChBkLi; + u32 MultiBlockCount = pHalGdmaAdapter->MaxMuliBlock; + u32 CtlxLow, CtlxUp, CfgxLow, CfgxUp; + u8 GdmaIndex = pHalGdmaAdapter->GdmaIndex; + u8 ChNum = pHalGdmaAdapter->ChNum; + u32 ChEn = pHalGdmaAdapter->ChEn; + u8 GdmaChIsrBitmap = (ChEn & 0xFF); + u8 PendingIsrIndex; + + + pLliEle = pHalGdmaAdapter->pLlix->pLliEle; + pGdmaChLli = pHalGdmaAdapter->pLlix->pNextLli; + pGdmaChBkLi = pHalGdmaAdapter->pBlockSizeList; + + + //4 1) Check chanel is avaliable + if (HAL_GDMAX_READ32(GdmaIndex, REG_GDMA_CH_EN) & ChEn) { + //4 Disable Channel + DBG_GDMA_WARN("Channel had used; Disable Channel!!!!\n"); + + HalGdmaChDisRtl8195a(Data); + + } + + //4 2) Check if there are the pending isr; TFR, Block, Src Tran, Dst Tran, Error + for (PendingIsrIndex=0; PendingIsrIndex<5;PendingIsrIndex++) { + + u32 PendRaw, PendStstus; + PendRaw = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_RAW_INT_BASE + PendingIsrIndex*8)); + PendStstus = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_STATUS_INT_BASE + PendingIsrIndex*8)); + + if ((PendRaw & GdmaChIsrBitmap) || (PendStstus & GdmaChIsrBitmap)) { + //4 Clear Pending Isr + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CLEAR_INT_BASE + PendingIsrIndex*8), + (PendStstus & (GdmaChIsrBitmap)) + ); + + } + } + + //4 Fill in SARx register + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_SAR + ChNum*REG_GDMA_CH_OFF), + (pHalGdmaAdapter->ChSar) + ); + + + //4 Fill in DARx register + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_DAR + ChNum*REG_GDMA_CH_OFF), + (pHalGdmaAdapter->ChDar) + ); + + + + //4 3) Process CTLx + CtlxLow = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_CH_CTL + ChNum*REG_GDMA_CH_OFF)); + + //4 Clear Config low register bits + CtlxLow &= (BIT_INVC_CTLX_LO_INT_EN & + BIT_INVC_CTLX_LO_DST_TR_WIDTH & + BIT_INVC_CTLX_LO_SRC_TR_WIDTH & + BIT_INVC_CTLX_LO_DINC & + BIT_INVC_CTLX_LO_SINC & + BIT_INVC_CTLX_LO_DEST_MSIZE & + BIT_INVC_CTLX_LO_SRC_MSIZE & + BIT_INVC_CTLX_LO_TT_FC & + BIT_INVC_CTLX_LO_LLP_DST_EN & + BIT_INVC_CTLX_LO_LLP_SRC_EN); + + CtlxUp = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_CH_CTL + ChNum*REG_GDMA_CH_OFF + 4)); + + //4 Clear Config upper register bits + CtlxUp &= (BIT_INVC_CTLX_UP_BLOCK_BS & + BIT_INVC_CTLX_UP_DONE); + + + CtlxLow = BIT_CTLX_LO_INT_EN(pHalGdmaAdapter->GdmaCtl.IntEn) | + BIT_CTLX_LO_DST_TR_WIDTH(pHalGdmaAdapter->GdmaCtl.DstTrWidth) | + BIT_CTLX_LO_SRC_TR_WIDTH(pHalGdmaAdapter->GdmaCtl.SrcTrWidth) | + BIT_CTLX_LO_DINC(pHalGdmaAdapter->GdmaCtl.Dinc) | + BIT_CTLX_LO_SINC(pHalGdmaAdapter->GdmaCtl.Sinc) | + BIT_CTLX_LO_DEST_MSIZE(pHalGdmaAdapter->GdmaCtl.DestMsize) | + BIT_CTLX_LO_SRC_MSIZE(pHalGdmaAdapter->GdmaCtl.SrcMsize) | + BIT_CTLX_LO_TT_FC(pHalGdmaAdapter->GdmaCtl.TtFc) | + BIT_CTLX_LO_LLP_DST_EN(pHalGdmaAdapter->GdmaCtl.LlpDstEn) | + BIT_CTLX_LO_LLP_SRC_EN(pHalGdmaAdapter->GdmaCtl.LlpSrcEn) | + CtlxLow; + + CtlxUp = BIT_CTLX_UP_BLOCK_BS(pGdmaChBkLi->BlockSize) | + BIT_CTLX_UP_DONE(pHalGdmaAdapter->GdmaCtl.Done) | + CtlxUp; + + //4 Fill in CTLx register + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_CTL + ChNum*REG_GDMA_CH_OFF), + CtlxLow + ); + + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_CTL + ChNum*REG_GDMA_CH_OFF +4), + CtlxUp + ); + + //4 4) Program CFGx + + CfgxLow = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_CH_CFG + ChNum*REG_GDMA_CH_OFF)); + + CfgxLow &= (BIT_INVC_CFGX_LO_CH_PRIOR & + BIT_INVC_CFGX_LO_CH_SUSP & + BIT_INVC_CFGX_LO_HS_SEL_DST & + BIT_INVC_CFGX_LO_HS_SEL_SRC & + BIT_INVC_CFGX_LO_LOCK_CH_L & + BIT_INVC_CFGX_LO_LOCK_B_L & + BIT_INVC_CFGX_LO_LOCK_CH & + BIT_INVC_CFGX_LO_LOCK_B & + BIT_INVC_CFGX_LO_RELOAD_SRC & + BIT_INVC_CFGX_LO_RELOAD_DST); + + CfgxUp = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_CH_CFG + ChNum*REG_GDMA_CH_OFF + 4)); + + CfgxUp &= (BIT_INVC_CFGX_UP_FIFO_MODE & + BIT_INVC_CFGX_UP_DS_UPD_EN & + BIT_INVC_CFGX_UP_SS_UPD_EN & + BIT_INVC_CFGX_UP_SRC_PER & + BIT_INVC_CFGX_UP_DEST_PER); + + CfgxLow = BIT_CFGX_LO_CH_PRIOR(pHalGdmaAdapter->GdmaCfg.ChPrior) | + BIT_CFGX_LO_CH_SUSP(pHalGdmaAdapter->GdmaCfg.ChSusp) | + BIT_CFGX_LO_HS_SEL_DST(pHalGdmaAdapter->GdmaCfg.HsSelDst) | + BIT_CFGX_LO_HS_SEL_SRC(pHalGdmaAdapter->GdmaCfg.HsSelSrc) | + BIT_CFGX_LO_LOCK_CH_L(pHalGdmaAdapter->GdmaCfg.LockChL) | + BIT_CFGX_LO_LOCK_B_L(pHalGdmaAdapter->GdmaCfg.LockBL) | + BIT_CFGX_LO_LOCK_CH(pHalGdmaAdapter->GdmaCfg.LockCh) | + BIT_CFGX_LO_LOCK_B(pHalGdmaAdapter->GdmaCfg.LockB) | + BIT_CFGX_LO_RELOAD_SRC(pHalGdmaAdapter->GdmaCfg.ReloadSrc) | + BIT_CFGX_LO_RELOAD_DST(pHalGdmaAdapter->GdmaCfg.ReloadDst) | + CfgxLow; + + CfgxUp = BIT_CFGX_UP_FIFO_MODE(pHalGdmaAdapter->GdmaCfg.FifoMode) | + BIT_CFGX_UP_DS_UPD_EN(pHalGdmaAdapter->GdmaCfg.DsUpdEn) | + BIT_CFGX_UP_SS_UPD_EN(pHalGdmaAdapter->GdmaCfg.SsUpdEn) | + BIT_CFGX_UP_SRC_PER(pHalGdmaAdapter->GdmaCfg.SrcPer) | + BIT_CFGX_UP_DEST_PER(pHalGdmaAdapter->GdmaCfg.DestPer) | + CfgxUp; + + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_CFG + ChNum*REG_GDMA_CH_OFF), + CfgxLow + ); + + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_CFG + ChNum*REG_GDMA_CH_OFF +4), + CfgxUp + ); + + + + //4 Check 4 Bytes Alignment + if ((u32)(pLliEle) & 0x3) { + DBG_GDMA_WARN("LLi Addr: 0x%x not 4 bytes alignment!!!!\n", + pHalGdmaAdapter->pLli); + return _FALSE; + } + + HAL_GDMAX_WRITE32(GdmaIndex, + (REG_GDMA_CH_LLP + ChNum*REG_GDMA_CH_OFF), + pLliEle + ); + + //4 Update the first llp0 + pLliEle->CtlxLow = CtlxLow; + pLliEle->CtlxUp = CtlxUp; + pLliEle->Llpx = (u32)pGdmaChLli->pLliEle; + DBG_GDMA_INFO("Block Count %d\n", MultiBlockCount); + + pGdmaChBkLi = pGdmaChBkLi->pNextBlockSiz; + + while (MultiBlockCount > 1) { + MultiBlockCount--; + DBG_GDMA_INFO("Block Count %d\n", MultiBlockCount); + pLliEle = pGdmaChLli->pLliEle; + + if (NULL == pLliEle) { + DBG_GDMA_ERR("pLliEle Null Point!!!!!\n"); + return _FALSE; + } + + //4 Clear the last element llp enable bit + if (1 == MultiBlockCount) { + if (((pHalGdmaAdapter->Rsvd4to7) & 0x01) == 1){ + CtlxLow &= (BIT_INVC_CTLX_LO_LLP_DST_EN & + BIT_INVC_CTLX_LO_LLP_SRC_EN); + } + } + //4 Update block size for transfer + CtlxUp &= (BIT_INVC_CTLX_UP_BLOCK_BS); + CtlxUp |= BIT_CTLX_UP_BLOCK_BS(pGdmaChBkLi->BlockSize); + + //4 Update tje Lli and Block size list point to next llp + pGdmaChLli = pGdmaChLli->pNextLli; + pGdmaChBkLi = pGdmaChBkLi->pNextBlockSiz; + + //4 Updatethe Llpx context + pLliEle->CtlxLow = CtlxLow; + pLliEle->CtlxUp = CtlxUp; + pLliEle->Llpx = (u32)(pGdmaChLli->pLliEle); + + } + + return _TRUE; +} + +u32 +HalGdmaQueryDArRtl8195a( + IN VOID *Data +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + u8 GdmaIndex = pHalGdmaAdapter->GdmaIndex; + u8 ChNum = pHalGdmaAdapter->ChNum; + u32 dar; + + dar = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_CH_DAR + ChNum*REG_GDMA_CH_OFF)); + + return dar; +} + +u32 +HalGdmaQuerySArRtl8195a( + IN VOID *Data +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + u8 GdmaIndex = pHalGdmaAdapter->GdmaIndex; + u8 ChNum = pHalGdmaAdapter->ChNum; + u32 dar; + + dar = HAL_GDMAX_READ32(GdmaIndex, + (REG_GDMA_CH_SAR + ChNum*REG_GDMA_CH_OFF)); + + return dar; +} + +BOOL +HalGdmaQueryChEnRtl8195a ( + IN VOID *Data +) +{ + + PHAL_GDMA_ADAPTER pHalGdmaAdapter = Data; + + if (HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, REG_GDMA_CH_EN) & (pHalGdmaAdapter->ChEn)) { + return 1; + } else { + return 0; + } +} + +#endif diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_gpio.c b/lib/fwlib/rtl8195a/src/rtl8195a_gpio.c new file mode 100644 index 0000000..ccb7696 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_gpio.c @@ -0,0 +1,53 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include "hal_gpio.h" +#include "rtl8195a_gpio.h" +#include "gpio_irq_api.h" + +extern PHAL_GPIO_ADAPTER _pHAL_Gpio_Adapter; + +/** + * @brief Clear the pending interrupt of a specified pin + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin. + * + * @retval None + */ +HAL_Status +HAL_GPIO_ClearISR_8195a( + HAL_GPIO_PIN *GPIO_Pin +) +{ + u8 port_num; + u8 pin_num; + HAL_GPIO_PIN_MODE pin_mode; + + port_num = HAL_GPIO_GET_PORT_BY_NAME(GPIO_Pin->pin_name); + pin_num = HAL_GPIO_GET_PIN_BY_NAME(GPIO_Pin->pin_name); + pin_mode = GPIO_Pin->pin_mode; + + if ((pin_mode & HAL_GPIO_PIN_INT_MODE)==0 || (port_num != GPIO_PORT_A)) { + DBG_GPIO_WARN("HAL_GPIO_ClearISR_8195a: This pin(%x:%x) is'nt an interrupt pin\n", GPIO_Pin->pin_name, GPIO_Pin->pin_mode); + return HAL_ERR_PARA; + } + + if (GPIO_Lock() != HAL_OK) { + return HAL_BUSY; + } + + // Clear pending interrupt before unmask it + HAL_WRITE32(GPIO_REG_BASE, GPIO_PORTA_EOI, (1<I2CIdx; + u8 *pDat = pHalI2CInitData->I2CRWData; + u8 I2CCmd = pHalI2CInitData->I2CCmd; + u8 I2CStop = pHalI2CInitData->I2CStop; + u8 I2CReSTR= pHalI2CInitData->I2CReSTR; + + DBG_I2C_INFO("HalI2CSendRtl8195a\n"); + DBG_I2C_INFO("I2C Index: %x\n",I2CIdx); + + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_DATA_CMD, + *(pDat) | + BIT_CTRL_IC_DATA_CMD_RESTART(I2CReSTR)| + BIT_CTRL_IC_DATA_CMD_CMD(I2CCmd) | + BIT_CTRL_IC_DATA_CMD_STOP(I2CStop)); + + return (HAL_OK); +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CInit8195a +// +// Description: +// To initialize I2C module by using the given data. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the DeInit process. +// _EXIT_SUCCESS if the initialization succeeded. +// _EXIT_FAILURE if the initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +HAL_Status +HalI2CInit8195a_Patch( + IN VOID *Data +) +{ + PHAL_I2C_INIT_DAT pHalI2CInitData = (PHAL_I2C_INIT_DAT)Data; + + u8 Master; + u8 I2CIdx; + u8 SpdMd; + u8 AddrMd; + u8 ReSTR; + u8 StartByte; + u8 Specical; + u8 GC; + u16 I2CAckAddr; + u16 SdaHd; + u8 SdaSetup; + u8 RXTL; + u8 TXTL; + u8 SlvNoAck; + u32 INTRMsk; + u8 TxDMARqLv; + u8 RxDMARqLv; + + /* Get the I2C parameters*/ + I2CIdx = pHalI2CInitData->I2CIdx; + SpdMd = pHalI2CInitData->I2CSpdMod; + AddrMd = pHalI2CInitData->I2CAddrMod; + I2CAckAddr = pHalI2CInitData->I2CAckAddr; + Master = pHalI2CInitData->I2CMaster; + SdaHd = pHalI2CInitData->I2CSdaHd; + SdaSetup = pHalI2CInitData->I2CSetup; + + ReSTR = pHalI2CInitData->I2CReSTR; + GC = pHalI2CInitData->I2CGC; + StartByte = pHalI2CInitData->I2CStartB; + SlvNoAck = pHalI2CInitData->I2CSlvNoAck; + + RXTL = pHalI2CInitData->I2CRXTL; + TXTL = pHalI2CInitData->I2CTXTL; + + TxDMARqLv = pHalI2CInitData->I2CTxDMARqLv; + RxDMARqLv = pHalI2CInitData->I2CRxDMARqLv; + + /* Disable the IC first */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_ENABLE,BIT_CTRL_IC_ENABLE(0)); + + /* Master case*/ + if (Master) { + /*RESTART MUST be set in these condition in Master mode. + But it might be NOT compatible in old slaves.*/ + if ((AddrMd == I2C_ADDR_10BIT) || (SpdMd == I2C_HS_MODE)) + ReSTR = 1; + + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_CON, + (BIT_CTRL_IC_CON_IC_SLAVE_DISABLE(1) | + BIT_CTRL_IC_CON_IC_RESTART_EN(ReSTR) | + BIT_CTRL_IC_CON_IC_10BITADDR_MASTER(AddrMd) | + BIT_CTRL_IC_CON_SPEED(SpdMd) | + BIT_CTRL_IC_CON_MASTER_MODE(Master))); + + DBG_I2C_INFO("Init master, IC_CON%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_CON, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_CON)); + + + /* To set target addr.*/ + Specical = 0; + if ((GC!=0) || (StartByte!=0)) + Specical = 1; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_TAR, + (BIT_CTRL_IC_TAR_IC_10BITADDR_MASTER(AddrMd) | + BIT_CTRL_IC_TAR_SPECIAL(Specical) | + BIT_CTRL_IC_TAR_GC_OR_START(StartByte) | + BIT_CTRL_IC_TAR(I2CAckAddr))); + + /* To Set I2C clock*/ + HalI2CSetCLKRtl8195a_Patch(pHalI2CInitData); + + + DBG_I2C_INFO("Init master, IC_TAR%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_TAR, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_TAR)); + + } /*if (Master)*/ + else { + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_CON, + BIT_CTRL_IC_CON_IC_10BITADDR_SLAVE(AddrMd) | + BIT_CTRL_IC_CON_IC_SLAVE_DISABLE(Master) | + BIT_CTRL_IC_CON_SPEED(SpdMd)| + BIT_CTRL_IC_CON_MASTER_MODE(Master)); + + DBG_I2C_INFO("Init slave, IC_CON%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_CON, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_CON)); + + + /* To set slave addr. */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SAR,BIT_CTRL_IC_SAR(I2CAckAddr)); + + DBG_I2C_INFO("Init slave, IC_SAR%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_SAR, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_SAR)); + + + /* To set slave no ack */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SLV_DATA_NACK_ONLY,BIT_CTRL_IC_SLV_DATA_NACK_ONLY(SlvNoAck)); + + /* Set ack general call. */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_ACK_GENERAL_CALL,BIT_CTRL_IC_ACK_GENERAL_CALL(pHalI2CInitData->I2CSlvAckGC)); + + + + DBG_I2C_INFO("Init slave, I2C_IC_ACK_GC%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_ACK_GENERAL_CALL, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_ACK_GENERAL_CALL)); + + /* to set SDA hold time */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SDA_HOLD,BIT_CTRL_IC_SDA_HOLD(SdaHd)); + //4 + /* to set SDA setup time */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SDA_SETUP,BIT_CTRL_IC_SDA_SETUP(SdaSetup)); + } + + /* To set TX_Empty Level */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_TX_TL,TXTL); + + /* To set RX_Full Level */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_RX_TL,RXTL); + + /* To set TX/RX FIFO level */ + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_DMA_TDLR,TxDMARqLv); + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_DMA_RDLR,RxDMARqLv); + + + DBG_I2C_INFO("Init i2c dev, I2C_IC_DMA_TDLR%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_DMA_TDLR, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_DMA_TDLR)); + DBG_I2C_INFO("Init i2c dev, I2C_IC_DMA_RDLR%d[%2x]: %x\n", I2CIdx, REG_DW_I2C_IC_DMA_RDLR, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_DMA_RDLR)); + + + /*I2C Clear all interrupts first*/ + HalI2CClrAllIntrRtl8195a(pHalI2CInitData); + + /*I2C Disable all interrupts first*/ + INTRMsk = pHalI2CInitData->I2CIntrMSK; + pHalI2CInitData->I2CIntrMSK = 0; + HalI2CIntrCtrl8195a(pHalI2CInitData); + pHalI2CInitData->I2CIntrMSK = INTRMsk; + + return HAL_OK; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// HalI2CSetCLKRtl8195a +// +// Description: +// To set I2C bus clock rate. +// +// Arguments: +// [in] VOID *Data - +// The I2C parameter data struct. +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the de-initialization succeeded. +// _EXIT_FAILURE if the de-initialization failed. +// +// Note: +// None +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-02-18. +// +//--------------------------------------------------------------------------------------------------- +HAL_Status +HalI2CSetCLKRtl8195a_Patch( + IN VOID *Data +) +{ + PHAL_I2C_INIT_DAT pHalI2CInitData = (PHAL_I2C_INIT_DAT)Data; + u8 SpdMd = pHalI2CInitData->I2CSpdMod; + u32 I2CClk = pHalI2CInitData->I2CClk; + u8 I2CIdx = pHalI2CInitData->I2CIdx; + u32 ICHLcnt; + u32 ICHtime; + u32 ICLtime; + + /* Get the IC-Clk setting first for the following process*/ +#ifdef CONFIG_FPGA + u32 IcClk = SYSTEM_CLK/1000000; +#else + u32 IcClk; + u32 ClkSELTmp = 0; + u32 CpuClkTmp = 0; + + #if defined(CONFIG_CHIP_A_CUT) + CpuClkTmp = StartupHalGetCpuClk(); + #elif (defined(CONFIG_CHIP_B_CUT) || defined(CONFIG_CHIP_C_CUT)) + CpuClkTmp = HalGetCpuClk(); + #endif + + DBG_I2C_INFO("%s, CPU Clk:%x\n",__func__, CpuClkTmp); + + ClkSELTmp = HAL_READ32(PERI_ON_BASE, REG_PESOC_CLK_SEL); + ClkSELTmp &= (~(BIT_PESOC_PERI_SCLK_SEL(3))); + HAL_WRITE32(PERI_ON_BASE,REG_PESOC_CLK_SEL,ClkSELTmp); + IcClk = (CpuClkTmp/1000000)>>1; + +#if 0 + if ((I2CClk > 0) && (I2CClk <= 400)) { + ClkSELTmp &= (~(BIT_PESOC_PERI_SCLK_SEL(3))); + HAL_WRITE32(PERI_ON_BASE,REG_PESOC_CLK_SEL,ClkSELTmp); + IcClk = ClkSELTmp/1000000; /*actually it's 12.5MHz*/ + } + else { + ClkSELTmp &= (~(BIT_PESOC_PERI_SCLK_SEL(3))); + HAL_WRITE32(PERI_ON_BASE,REG_PESOC_CLK_SEL,ClkSELTmp); + IcClk = 100; + } +#endif +#endif + + switch (SpdMd) + { + case I2C_SS_MODE: + { + ICHtime = ((1000000/I2CClk)*I2C_SS_MIN_SCL_HTIME)/(I2C_SS_MIN_SCL_HTIME+I2C_SS_MIN_SCL_LTIME); + ICLtime = ((1000000/I2CClk)*I2C_SS_MIN_SCL_LTIME)/(I2C_SS_MIN_SCL_HTIME+I2C_SS_MIN_SCL_LTIME); + + ICHLcnt = (ICHtime * IcClk)/1000; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SS_SCL_HCNT,ICHLcnt); + + + DBG_I2C_INFO("IC_SS_SCL_HCNT%d[%2x]: %x\n", I2CIdx, + REG_DW_I2C_IC_SS_SCL_HCNT, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_SS_SCL_HCNT)); + + + ICHLcnt = (ICLtime * IcClk)/1000; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SS_SCL_LCNT,ICHLcnt); + + + DBG_I2C_INFO("IC_SS_SCL_LCNT%d[%2x]: %x\n", I2CIdx, + REG_DW_I2C_IC_SS_SCL_LCNT, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_SS_SCL_LCNT)); + + break; + } + + case I2C_FS_MODE: + { + ICHtime = ((1000000/I2CClk)*I2C_FS_MIN_SCL_HTIME)/(I2C_FS_MIN_SCL_HTIME+I2C_FS_MIN_SCL_LTIME); + ICLtime = ((1000000/I2CClk)*I2C_FS_MIN_SCL_LTIME)/(I2C_FS_MIN_SCL_HTIME+I2C_FS_MIN_SCL_LTIME); + + ICHLcnt = (ICHtime * IcClk)/1000; + if (ICHLcnt>4)/*this part is according to the fine-tune result*/ + ICHLcnt -= 4; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_FS_SCL_HCNT,ICHLcnt); + + + DBG_I2C_INFO("IC_FS_SCL_HCNT%d[%2x]: %x\n", I2CIdx, + REG_DW_I2C_IC_FS_SCL_HCNT, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_FS_SCL_HCNT)); + + + ICHLcnt = (ICLtime * IcClk)/1000; + if (ICHLcnt>3)/*this part is according to the fine-tune result*/ + ICHLcnt -= 3; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_FS_SCL_LCNT,ICHLcnt); + + + DBG_I2C_INFO("IC_FS_SCL_LCNT%d[%2x]: %x\n", I2CIdx, + REG_DW_I2C_IC_FS_SCL_LCNT, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_FS_SCL_LCNT)); + + break; + } + + case I2C_HS_MODE: + { + ICHLcnt = 400; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SS_SCL_HCNT,ICHLcnt); + + ICHLcnt = 470; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_SS_SCL_LCNT,ICHLcnt); + + ICHLcnt = 60; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_FS_SCL_HCNT,ICHLcnt); + + ICHLcnt = 130; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_FS_SCL_LCNT,ICHLcnt); + + ICHtime = ((1000000/I2CClk)*I2C_HS_MIN_SCL_HTIME_100)/(I2C_HS_MIN_SCL_HTIME_100+I2C_HS_MIN_SCL_LTIME_100); + ICLtime = ((1000000/I2CClk)*I2C_HS_MIN_SCL_LTIME_100)/(I2C_HS_MIN_SCL_HTIME_100+I2C_HS_MIN_SCL_LTIME_100); + + + DBG_I2C_INFO("ICHtime:%x\n",ICHtime); + DBG_I2C_INFO("ICLtime:%x\n",ICLtime); + + + ICHLcnt = (ICHtime * IcClk)/1000; + if (ICHLcnt>8)/*this part is according to the fine-tune result*/ + ICHLcnt -= 3; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_HS_SCL_HCNT,ICHLcnt); + + + DBG_I2C_INFO("IC_HS_SCL_HCNT%d[%2x]: %x\n", I2CIdx, + REG_DW_I2C_IC_HS_SCL_HCNT, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_HS_SCL_HCNT)); + + + ICHLcnt = (ICLtime * IcClk)/1000; + if (ICHLcnt>6)/*this part is according to the fine-tune result*/ + ICHLcnt -= 6; + HAL_I2C_WRITE32(I2CIdx,REG_DW_I2C_IC_HS_SCL_LCNT,ICHLcnt); + + + DBG_I2C_INFO("IC_HS_SCL_LCNT%d[%2x]: %x\n", I2CIdx, + REG_DW_I2C_IC_HS_SCL_LCNT, HAL_I2C_READ32(I2CIdx,REG_DW_I2C_IC_HS_SCL_LCNT)); + + + break; + } + + default: + break; + } + + return HAL_OK; +} +#endif \ No newline at end of file diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_i2s.c b/lib/fwlib/rtl8195a/src/rtl8195a_i2s.c new file mode 100644 index 0000000..553934a --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_i2s.c @@ -0,0 +1,395 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "rtl8195a_i2s.h" +#include "hal_i2s.h" + +extern void * +_memset( void *s, int c, SIZE_T n ); + +RTK_STATUS +HalI2SInitRtl8195a_Patch( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + + u8 I2SIdx; + //u8 I2SEn; + u8 I2SMaster; + u8 I2SWordLen; + u8 I2SChNum; + u8 I2SPageNum; + u16 I2SPageSize; + u16 I2SRate; + u32 I2STxIntrMSK; + u32 I2SRxIntrMSK; + u8 I2STRxAct; + u8 *I2STxData; + u8 *I2SRxData; + + u32 Tmp; + + I2SIdx = pHalI2SInitData->I2SIdx; + //I2SEn = pHalI2SInitData->I2SEn; + I2SMaster = pHalI2SInitData->I2SMaster; + I2SWordLen = pHalI2SInitData->I2SWordLen; + I2SChNum = pHalI2SInitData->I2SChNum; + I2SPageNum = pHalI2SInitData->I2SPageNum; + I2SPageSize = pHalI2SInitData->I2SPageSize; + I2SRate = pHalI2SInitData->I2SRate; + I2STRxAct = pHalI2SInitData->I2STRxAct; + I2STxData = pHalI2SInitData->I2STxData; + I2SRxData = pHalI2SInitData->I2SRxData; + + + /* Disable the I2S first, and reset to default */ + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, BIT_CTRL_CTLX_I2S_EN(0) | + BIT_CTRL_CTLX_I2S_SW_RSTN(1)); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, BIT_CTRL_CTLX_I2S_EN(0) | + BIT_CTRL_CTLX_I2S_SW_RSTN(0)); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, BIT_CTRL_CTLX_I2S_EN(0) | + BIT_CTRL_CTLX_I2S_SW_RSTN(1)); + + Tmp = HAL_I2S_READ32(I2SIdx, REG_I2S_CTL); + Tmp |= BIT_CTRL_CTLX_I2S_ENDIAN_SWAP(1); + + if (I2SRate&0x10) + { + Tmp |= BIT_CTRL_CTLX_I2S_CLK_SRC(1); + } + + Tmp |= (BIT_CTRL_CTLX_I2S_WL(I2SWordLen) | BIT_CTRL_CTLX_I2S_CH_NUM(I2SChNum) | + BIT_CTRL_CTLX_I2S_SLAVE_MODE(I2SMaster) | BIT_CTRL_CTLX_I2S_TRX_ACT(I2STRxAct)); + /* set 44.1khz clock source, word length, channel number, master or slave, trx act */ + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, Tmp); + + Tmp = BIT_CTRL_SETTING_I2S_PAGE_SZ(I2SPageSize) | BIT_CTRL_SETTING_I2S_PAGE_NUM(I2SPageNum) | + BIT_CTRL_SETTING_I2S_SAMPLE_RATE(I2SRate); + /* set page size, page number, sample rate */ + HAL_I2S_WRITE32(I2SIdx, REG_I2S_SETTING, Tmp); + + /* need tx rx buffer? need rx page own bit */ + if (I2STxData != NULL) { + HAL_I2S_WRITE32(I2SIdx, REG_I2S_TX_PAGE_PTR, (u32)I2STxData); + } + + if (I2SRxData != NULL) { + HAL_I2S_WRITE32(I2SIdx, REG_I2S_RX_PAGE_PTR, (u32)I2SRxData); + } + + pHalI2SInitData->I2STxIdx = 0; + pHalI2SInitData->I2SRxIdx = 0; + pHalI2SInitData->I2SHWTxIdx = 0; + pHalI2SInitData->I2SHWRxIdx = 0; + /* I2S Clear all interrupts first */ + HalI2SClrAllIntrRtl8195a(pHalI2SInitData); + + /* I2S Disable all interrupts first */ + I2STxIntrMSK = pHalI2SInitData->I2STxIntrMSK; + I2SRxIntrMSK = pHalI2SInitData->I2SRxIntrMSK; + pHalI2SInitData->I2STxIntrMSK = 0; + pHalI2SInitData->I2SRxIntrMSK = 0; + HalI2SIntrCtrlRtl8195a(pHalI2SInitData); + pHalI2SInitData->I2STxIntrMSK = I2STxIntrMSK; + pHalI2SInitData->I2SRxIntrMSK = I2SRxIntrMSK; + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetRateRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_CTL); + reg_value &= ~(BIT_MASK_CTLX_I2S_CLK_SRC << BIT_SHIFT_CTLX_I2S_CLK_SRC); + if (pHalI2SInitData->I2SRate&0x10) + { + reg_value |= BIT_CTRL_CTLX_I2S_CLK_SRC(1); + } + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, reg_value); + + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_SETTING); + reg_value &= ~(BIT_MASK_SETTING_I2S_SAMPLE_RATE << BIT_SHIFT_SETTING_I2S_SAMPLE_RATE); + reg_value |= BIT_CTRL_SETTING_I2S_SAMPLE_RATE(pHalI2SInitData->I2SRate); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_SETTING, reg_value); + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetWordLenRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + + I2SIdx = pHalI2SInitData->I2SIdx; + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_CTL); + reg_value &= ~(BIT_MASK_CTLX_I2S_WL << BIT_SHIFT_CTLX_I2S_WL); + reg_value |= BIT_CTRL_CTLX_I2S_WL(pHalI2SInitData->I2SWordLen); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, reg_value); + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetChNumRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + + I2SIdx = pHalI2SInitData->I2SIdx; + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_CTL); + reg_value &= ~(BIT_MASK_CTLX_I2S_CH_NUM << BIT_SHIFT_CTLX_I2S_CH_NUM); + reg_value |= BIT_CTRL_CTLX_I2S_CH_NUM(pHalI2SInitData->I2SChNum); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, reg_value); + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetPageNumRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_SETTING); + reg_value &= ~(BIT_MASK_SETTING_I2S_PAGE_NUM << BIT_SHIFT_SETTING_I2S_PAGE_NUM); + reg_value |= BIT_CTRL_SETTING_I2S_PAGE_NUM(pHalI2SInitData->I2SPageNum); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_SETTING, reg_value); + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetPageSizeRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_SETTING); + reg_value &= ~(BIT_MASK_SETTING_I2S_PAGE_SZ << BIT_SHIFT_SETTING_I2S_PAGE_SZ); + reg_value |= BIT_CTRL_SETTING_I2S_PAGE_SZ(pHalI2SInitData->I2SPageSize); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_SETTING, reg_value); + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetDirectionRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_CTL); + reg_value &= ~(BIT_MASK_CTLX_I2S_TRX_ACT << BIT_SHIFT_CTLX_I2S_TRX_ACT); + reg_value |= BIT_CTRL_CTLX_I2S_TRX_ACT(pHalI2SInitData->I2STRxAct); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_CTL, reg_value); + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SSetDMABufRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 reg_value; + u32 page_num; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg_value = HAL_I2S_READ32(I2SIdx, REG_I2S_SETTING); + reg_value &= ~(BIT_MASK_SETTING_I2S_PAGE_SZ << BIT_SHIFT_SETTING_I2S_PAGE_SZ); + reg_value &= ~(BIT_MASK_SETTING_I2S_PAGE_NUM << BIT_SHIFT_SETTING_I2S_PAGE_NUM); + reg_value |= BIT_CTRL_SETTING_I2S_PAGE_SZ(pHalI2SInitData->I2SPageSize); + reg_value |= BIT_CTRL_SETTING_I2S_PAGE_NUM(pHalI2SInitData->I2SPageNum); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_SETTING, reg_value); + + page_num = pHalI2SInitData->I2SPageNum + 1; + if (pHalI2SInitData->I2STxData) { + HAL_I2S_WRITE32(I2SIdx, REG_I2S_TX_PAGE_PTR, (uint32_t)pHalI2SInitData->I2STxData); + pHalI2SInitData->I2STxIntrMSK = (1<I2STxIntrMSK = 0; + } + + if (pHalI2SInitData->I2SRxData) { + HAL_I2S_WRITE32(I2SIdx, REG_I2S_RX_PAGE_PTR, (uint32_t)pHalI2SInitData->I2SRxData); + pHalI2SInitData->I2SRxIntrMSK = (1<I2SRxIntrMSK = 0; + + } + + // According to the page number to modify the ISR mask + HalI2SIntrCtrlRtl8195a(pHalI2SInitData); + + return _EXIT_SUCCESS; +} + +u8 +HalI2SGetTxPageRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + + u8 I2SIdx; + u16 I2STxIdx = pHalI2SInitData->I2STxIdx; + u32 reg; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg = HAL_I2S_READ32(I2SIdx, REG_I2S_TX_PAGE0_OWN+(I2STxIdx<<2)); + if ((reg & (1<<31)) == 0) { + return I2STxIdx; + } else { + return 0xFF; + } +} + +u8 +HalI2SGetRxPageRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + + u8 I2SIdx; + u16 I2SRxIdx = pHalI2SInitData->I2SRxIdx; + u32 reg; + + I2SIdx = pHalI2SInitData->I2SIdx; + + reg = HAL_I2S_READ32(I2SIdx, REG_I2S_RX_PAGE0_OWN+(I2SRxIdx << 2)); + if ((reg & (1<<31)) == 0) { + return I2SRxIdx; + } else { + return 0xFF; + } +} + +RTK_STATUS +HalI2SPageSendRtl8195a( + IN VOID *Data, + IN u8 PageIdx +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u16 I2STxIdx = pHalI2SInitData->I2STxIdx; + u8 I2SPageNum = pHalI2SInitData->I2SPageNum; + u8 I2SIdx; + + if (I2STxIdx != PageIdx) { + DBG_I2S_ERR("HalI2SPageSendRtl8195a: UnExpected Page Index. TxPage=%d, Expected:%d\r\n", + PageIdx, I2STxIdx); + } + + I2SIdx = pHalI2SInitData->I2SIdx; + + HAL_I2S_WRITE32(I2SIdx, REG_I2S_TX_PAGE0_OWN+4*PageIdx, 1<<31); + I2STxIdx = PageIdx+1; + if (I2STxIdx > I2SPageNum) { + I2STxIdx = 0; + } + pHalI2SInitData->I2STxIdx = I2STxIdx; + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SPageRecvRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u16 I2SRxIdx = pHalI2SInitData->I2SRxIdx; + u8 I2SPageNum = pHalI2SInitData->I2SPageNum; + u32 reg; + u8 I2SIdx; + + I2SIdx = pHalI2SInitData->I2SIdx; + reg = HAL_I2S_READ32(I2SIdx, REG_I2S_RX_PAGE0_OWN+(I2SRxIdx << 2)); + if ((reg & (1<<31)) != 0) { + DBG_I2S_ERR("HalI2SPageRecvRtl8195a: No Idle Rx Page\r\n"); + return _EXIT_FAILURE; + } + + HAL_I2S_WRITE32(I2SIdx, REG_I2S_RX_PAGE0_OWN+(I2SRxIdx<<2), 1<<31); + I2SRxIdx += 1; + if (I2SRxIdx > I2SPageNum) { + I2SRxIdx = 0; + } + pHalI2SInitData->I2SRxIdx = I2SRxIdx; + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SClearAllOwnBitRtl8195a( + IN VOID *Data +) +{ + PHAL_I2S_INIT_DAT pHalI2SInitData = (PHAL_I2S_INIT_DAT)Data; + u8 I2SIdx; + u32 i; + + I2SIdx = pHalI2SInitData->I2SIdx; + + for (i=0;i<4;i++) { + HAL_I2S_WRITE32(I2SIdx, REG_I2S_TX_PAGE0_OWN+(i<<2), 0); + HAL_I2S_WRITE32(I2SIdx, REG_I2S_RX_PAGE0_OWN+(i<<2), 0); + } + + return _EXIT_SUCCESS; +} + +RTK_STATUS +HalI2SDMACtrlRtl8195a( + IN VOID *Data +) +{ + + return _EXIT_SUCCESS; +} + + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_mii.c b/lib/fwlib/rtl8195a/src/rtl8195a_mii.c new file mode 100644 index 0000000..4f43d03 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_mii.c @@ -0,0 +1,325 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "rtl8195a_mii.h" +#include "hal_mii.h" + + + +VOID MiiIrqHandle (IN VOID *Data); + +VOID MiiIrqHandle (IN VOID *Data) { + u32 RegValue = HalMiiGmacGetInterruptStatusRtl8195a(); +#ifdef CONFIG_MII_VERIFY + extern volatile u8 isRxOK; + extern volatile u8 isTxOK; + extern volatile u8 RxIntCnt; + + +// DBG_8195A("ISR = 0x%08X\n", RegValue); + if(RegValue & GMAC_ISR_ROK) { + HalMiiGmacClearInterruptStatusRtl8195a(0x00410001); + isRxOK = 1; + RxIntCnt++; + } + + if(RegValue & GMAC_ISR_TOK_TI) { + HalMiiGmacClearInterruptStatusRtl8195a(0x00410040); + isTxOK = 1; + } +#else + +#endif +} + + +VOID +ConfigDebugPort_E4(u32 DebugSelect) { + u32 RegValue; + + + RegValue = HAL_MII_READ32(REG_RTL_MII_CCR); + RegValue |= DebugSelect << 2; + HAL_MII_WRITE32(REG_RTL_MII_CCR, RegValue); +} + + +/** + * MII Initialize. + * + * MII Initialize. + * + * Initialization Steps: + * I. Rtl8195A Board Configurations: + * 1. MII Function Enable & AHB mux + * + * @return runtime status value. + */ +BOOL +HalMiiGmacInitRtl8195a( + IN VOID *Data + ) +{ + u32 RegValue; + + + /* 1. enable MII Pinmux & disable SDIO Host/Device mode Pinmux */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_HCI_PINMUX_CTRL); + RegValue |= BIT24; + RegValue &= ~(BIT0 | BIT1); // Important! + HAL_WRITE32(PERI_ON_BASE, REG_HCI_PINMUX_CTRL, RegValue); + + /* 2. enable MII IP block (214, 12) */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN); + RegValue |= BIT12; + HAL_WRITE32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN, RegValue); + + /* 3. Lexra2AHB Function Enable (304, 11) */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_PESOC_SOC_CTRL); + RegValue |= BIT11; + HAL_WRITE32(PERI_ON_BASE, REG_PESOC_SOC_CTRL, RegValue); + + /* 4. enable MII bus clock (240, 24|25) */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_PESOC_HCI_CLK_CTRL0); + RegValue |= (BIT24 | BIT25); + HAL_WRITE32(PERI_ON_BASE, REG_PESOC_HCI_CLK_CTRL0, RegValue); + + /* 5. */ + RegValue = HAL_READ32(SYSTEM_CTRL_BASE, 0x74) & 0xFFFFC7FF; + HAL_WRITE32(SYSTEM_CTRL_BASE, 0x74, (RegValue | 0x00003000)); + + /* 6. AHB mux: select MII (214, 13) */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN); + RegValue |= BIT13; + HAL_WRITE32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN, RegValue); + + /* 7. Vendor Register Clock Enable (230, 6|7) */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_PESOC_CLK_CTRL); + RegValue |= (BIT6 | BIT7); + HAL_WRITE32(PERI_ON_BASE, REG_PESOC_CLK_CTRL, RegValue); + + /* 8. Enable GMAC Lexra Timeout (090, 16|17|18) */ + RegValue = HAL_READ32(VENDOR_REG_BASE, 0x0090); + RegValue |= (BIT16 | BIT17 | BIT18); + HAL_WRITE32(VENDOR_REG_BASE, 0x0090, RegValue); + + /* 9. Endian Swap Control (304, 12|13) */ + RegValue = HAL_READ32(PERI_ON_BASE, REG_PESOC_SOC_CTRL); + RegValue |= (BIT12 | BIT13); + HAL_WRITE32(PERI_ON_BASE, REG_PESOC_SOC_CTRL, RegValue); + + return _TRUE; +} + + +BOOL +HalMiiInitRtl8195a( + IN VOID *Data + ) +{ + return _TRUE; +} + + +BOOL +HalMiiGmacResetRtl8195a( + IN VOID *Data + ) +{ + HAL_MII_WRITE32(REG_RTL_MII_CR, (HAL_MII_READ32(REG_RTL_MII_CR) | BIT0)); + + return _TRUE; +} + + +BOOL +HalMiiGmacEnablePhyModeRtl8195a( + IN VOID *Data + ) +{ + return _TRUE; +} + + +u32 +HalMiiGmacXmitRtl8195a( + IN VOID *Data + ) +{ + return 0; +} + + +VOID +HalMiiGmacCleanTxRingRtl8195a( + IN VOID *Data + ) +{ +} + + +VOID +HalMiiGmacFillTxInfoRtl8195a( + IN VOID *Data + ) +{ + PMII_ADAPTER pMiiAdapter = (PMII_ADAPTER) Data; + PTX_INFO pTx_Info = pMiiAdapter->pTx_Info; + VOID* TxBuffer = pMiiAdapter->TxBuffer; + + + pTx_Info->opts1.dw = 0xBC8001FE; + /* pTx_Info->opts1.dw = 0xBC800080; // size: 128 */ + + pTx_Info->addr = (u32)TxBuffer; + pTx_Info->opts2.dw = 0x0400279F; + pTx_Info->opts3.dw = 0x00000000; + /* pTx_Info->opts4.dw = 0x57800000; */ + pTx_Info->opts4.dw = 0x1FE00000; + + HAL_MII_WRITE32(REG_RTL_MII_TXFDP1, pTx_Info); +} + + +VOID +HalMiiGmacFillRxInfoRtl8195a( + IN VOID *Data + ) +{ + PMII_ADAPTER pMiiAdapter = (PMII_ADAPTER) Data; + PRX_INFO pRx_Info = pMiiAdapter->pRx_Info; + VOID* RxBuffer = pMiiAdapter->RxBuffer; + + + /* pRx_Info->opts1.dw = 0x80000200; //Data Length: 4095(FFF), 512(200) */ + pRx_Info->opts1.dw = 0x800001FC; //Data Length: 4095(FFF), 512(200) + /* pRx_Info->opts1.dw = 0x8000007F; */ + + pRx_Info->addr = (u32)RxBuffer; + pRx_Info->opts2.dw = 0x00000000; + pRx_Info->opts3.dw = 0x00000000; + + HAL_MII_WRITE32(REG_RTL_MII_RXFDP1, pRx_Info); +} + + +VOID +HalMiiGmacTxRtl8195a( + IN VOID *Data + ) +{ + u32 RegValue; + + + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD); + RegValue |= BIT_IOCMD_TXENABLE(1); + HAL_MII_WRITE32(REG_RTL_MII_IOCMD, RegValue); + + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD); + RegValue |= BIT_IOCMD_FIRST_DMATX_ENABLE(1); + HAL_MII_WRITE32(REG_RTL_MII_IOCMD, RegValue); +} + + +VOID +HalMiiGmacRxRtl8195a( + IN VOID *Data + ) +{ + u32 RegValue; + + + RegValue = HAL_MII_READ32(REG_RTL_MII_TCR); + + HAL_MII_WRITE32(REG_RTL_MII_TCR, 0x00000D00); // loopback R2T mode + + RegValue = HAL_MII_READ32(REG_RTL_MII_RCR); + HAL_MII_WRITE32(REG_RTL_MII_RCR, 0x0000007F); + + RegValue = HAL_MII_READ32(REG_RTL_MII_ETNRXCPU1); + HAL_MII_WRITE32(REG_RTL_MII_ETNRXCPU1, 0x1F0A0F00); + + RegValue = HAL_MII_READ32(REG_RTL_MII_RX_PSE1); + HAL_MII_WRITE32(REG_RTL_MII_RX_PSE1, 0x00000022); + + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD1); + RegValue |= BIT_IOCMD1_FIRST_DMARX_ENABLE(1); + HAL_MII_WRITE32(REG_RTL_MII_IOCMD1, RegValue); + + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD); + RegValue |= BIT_IOCMD_RXENABLE(1); + HAL_MII_WRITE32(REG_RTL_MII_IOCMD, RegValue); +} + + +VOID +HalMiiGmacSetDefaultEthIoCmdRtl8195a( + IN VOID *Data + ) +{ + u32 RegValue; + + + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD); + HAL_MII_WRITE32(REG_RTL_MII_IOCMD, CMD_CONFIG); + + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD1); + HAL_MII_WRITE32(REG_RTL_MII_IOCMD1, CMD1_CONFIG); + + //2014-04-29 yclin (disable 0x40051438[27] r_en_precise_dma) { + RegValue = HAL_MII_READ32(REG_RTL_MII_IOCMD1); + RegValue = RegValue & 0xF7FFFFFF; + HAL_MII_WRITE32(REG_RTL_MII_IOCMD1, RegValue); + // } +} + + +VOID +HalMiiGmacInitIrqRtl8195a( + IN VOID *Data + ) +{ + IRQ_HANDLE MiiIrqHandle_Master; + PMII_ADAPTER pMiiAdapter = (PMII_ADAPTER) Data; + + + MiiIrqHandle_Master.Data = (u32) (pMiiAdapter); + MiiIrqHandle_Master.IrqNum = GMAC_IRQ; + MiiIrqHandle_Master.IrqFun = (IRQ_FUN) MiiIrqHandle; + MiiIrqHandle_Master.Priority = 0; + InterruptRegister(&MiiIrqHandle_Master); + InterruptEn(&MiiIrqHandle_Master); +} + + +u32 +HalMiiGmacGetInterruptStatusRtl8195a( + VOID + ) +{ + u32 RegValue; + + + RegValue = HAL_MII_READ32(REG_RTL_MII_IMRISR); + + return RegValue; +} + + +VOID +HalMiiGmacClearInterruptStatusRtl8195a( + u32 IsrStatus + ) +{ + HAL_MII_WRITE32(REG_RTL_MII_IMRISR, IsrStatus); +} + + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_nfc.c b/lib/fwlib/rtl8195a/src/rtl8195a_nfc.c new file mode 100644 index 0000000..875e51e --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_nfc.c @@ -0,0 +1,1921 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" + +//#include "autoconf.h" +//#include "diag.h" +//#include "hal_peri_on.h" +#include "rtl8195a_nfc.h" +#include "osdep_api.h" +//#include "hal_nfc.h" +//#include "rtl8195a_peri_on.h" +//#include "rtl8195a_sys_on.h" +//#include "hal_platform.h" + +#ifdef CONFIG_NFC_NORMAL + +extern void nfc_tagwrite_callback(PNFC_ADAPTER pNFCAdp, uint32_t page, uint32_t wr_data); +extern void nfc_event_callback(PNFC_ADAPTER pNFCAdp, uint32_t event); +extern void nfc_tagread_callback(PNFC_ADAPTER pNFCAdp, uint32_t page); +extern void nfc_cache_read_callback(PNFC_ADAPTER pNFCAdp, uint32_t start_pg, uint32_t *pbuf); + +extern VOID SpicLoadInitParaFromClockRtl8195A(u8 CpuClkMode, u8 BaudRate, PSPIC_INIT_PARA pSpicInitPara); +extern VOID SpicSectorEraseFlashRtl8195A(u32 Address); +extern VOID SpicWaitBusyDoneRtl8195A(VOID); +extern VOID SpicWaitWipDoneRtl8195A(SPIC_INIT_PARA SpicInitPara); + + +VOID WriteA2NMailbox(IN VOID *pNFCAdapte); +VOID A2NWriteInQueue(IN VOID *pNFCAdapte, IN VOID *pBuff); +VOID A2NWriteDeQueue(IN VOID *pNFCAdapte); +VOID N2AReadTag(IN VOID *pNFCAdapte, IN u8 N2ARPage); +u32 HalNFCRead32(IN u32 Addr); +VOID HalNFCWrite32(IN u32 Addr, IN u32 Data); +VOID N2AWriteTag(IN VOID *pNFCAdapte, IN u8 N2AWPage); +VOID N2AReadCatch(IN VOID *pNFCAdapte, IN u8 N2ACatchRPage); +VOID NFCReaderPresent(IN VOID *pNFCAdapte, IN u8 State); +VOID N2AMailboxState(IN VOID *pNFCAdapte, IN u8 State, IN u8 Seq); +VOID NFC25MClkReq(IN VOID *pNFCAdapte, IN u8 OP, IN u8 Seq); + +//demo +u8 NFCFWIMEM[]={ +0x01, 0x10, 0x00, 0x65, 0x00, 0x68, 0xA8, 0xB9, 0x00, 0x65, 0x40, 0xF0, 0x20, 0x69, 0x89, 0xB9, +0x00, 0x65, 0x13, 0xF7, 0x20, 0x6A, 0x80, 0xF0, 0x08, 0x4A, 0x7E, 0xF0, 0x2D, 0x68, 0x7E, 0xF0, +0x0C, 0x48, 0x00, 0xDA, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x13, 0xF7, 0x20, 0x6A, +0x08, 0x4A, 0x00, 0x9A, 0x00, 0x65, 0x00, 0xF0, 0x20, 0x69, 0xFF, 0xF4, 0x1F, 0x49, 0x2C, 0xE8, +0x00, 0xDA, 0x00, 0x65, 0x13, 0xF7, 0x20, 0x6A, 0x80, 0xF0, 0x04, 0x4A, 0x00, 0x68, 0x00, 0xDA, +0x00, 0x65, 0x13, 0xF7, 0x20, 0x6A, 0x80, 0xF0, 0x00, 0x4A, 0x02, 0xF0, 0x20, 0x68, 0xFF, 0x48, +0x00, 0xDA, 0x00, 0x65, 0x10, 0xF0, 0x20, 0x68, 0x00, 0xF4, 0x01, 0x48, 0x00, 0xE8, 0x00, 0x65, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xDF, 0xF7, 0x04, 0x63, 0x0E, 0xD2, 0x0D, 0xD3, 0x0C, 0xD0, 0x0B, 0xD1, 0x0A, 0xD4, 0x09, 0xD5, +0x08, 0xD6, 0x07, 0xD7, 0x58, 0x67, 0x06, 0xD2, 0x05, 0x62, 0x8D, 0xB8, 0xAE, 0xB8, 0xC8, 0xB8, +0xEC, 0xB8, 0x00, 0x18, 0x28, 0x01, 0x00, 0x65, 0x00, 0x6A, 0xAA, 0xB9, 0x06, 0x92, 0x1A, 0x65, +0x05, 0x92, 0xFA, 0x65, 0x0E, 0x92, 0x0D, 0x93, 0x0C, 0x90, 0x0B, 0x91, 0x0A, 0x94, 0x09, 0x95, +0x08, 0x96, 0x07, 0x97, 0x20, 0xF0, 0x1C, 0x63, 0x00, 0xBA, 0x00, 0x65, 0x00, 0xF0, 0x20, 0x6A, +0xFF, 0x4A, 0x60, 0x9A, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x13, 0xF7, 0x20, 0x6A, 0x50, 0x4A, 0x00, 0x9A, 0x00, 0x65, 0x10, 0xF0, 0x20, 0x69, 0xFF, 0x49, +0x2C, 0xE8, 0x00, 0xDA, 0x00, 0x65, 0x34, 0xB8, 0x00, 0xF4, 0x00, 0x68, 0x2D, 0xE8, 0x90, 0xB9, +0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x14, 0xB8, 0x00, 0xF4, 0x00, 0x69, 0x2C, 0xE8, 0xFB, 0x20, +0x00, 0x65, 0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x1F, 0x48, 0x00, 0xE8, 0x00, 0x65, 0x10, 0xF0, +0x30, 0x6A, 0xC0, 0xF2, 0x00, 0x4A, 0x10, 0xF0, 0x30, 0x6B, 0xA0, 0xF6, 0x08, 0x4B, 0x00, 0x68, +0x00, 0xDA, 0x01, 0xDA, 0x02, 0xDA, 0x03, 0xDA, 0x10, 0x4A, 0x63, 0xEA, 0xF9, 0x61, 0x00, 0x65, +0x10, 0xF0, 0x30, 0x68, 0xE0, 0xF2, 0x00, 0x48, 0xB8, 0x65, 0x00, 0x65, 0x10, 0xF0, 0x30, 0x68, +0xE0, 0xF5, 0x08, 0x48, 0xB8, 0x65, 0x00, 0x68, 0xA8, 0xB9, 0x0C, 0xB8, 0x00, 0x65, 0x1F, 0xF7, +0x01, 0x69, 0x2D, 0xE8, 0xDF, 0xF7, 0x20, 0x69, 0xFF, 0x49, 0x2C, 0xE8, 0x88, 0xB9, 0x00, 0x65, +0x10, 0xF0, 0x20, 0x68, 0x40, 0xF5, 0x05, 0x48, 0x00, 0xE8, 0x00, 0x65, 0x20, 0xBA, 0x00, 0x65, +0xF9, 0x63, 0x0D, 0x62, 0x0C, 0xD1, 0x04, 0x01, 0x8A, 0xD9, 0xAB, 0xD9, 0xCC, 0xD9, 0xED, 0xD9, +0x6A, 0x99, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x43, 0x32, 0x45, 0xD9, 0x6D, 0x99, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x43, 0x32, 0x44, 0xD9, 0x6A, 0x99, 0x7C, 0x6A, 0x6C, 0xEA, 0x4B, 0x32, +0x43, 0xD9, 0x64, 0x99, 0x45, 0x99, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3A, 0x01, 0xB9, 0x65, +0x09, 0x97, 0x08, 0x91, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x04, 0x01, +0x86, 0xD9, 0xA7, 0xD9, 0x66, 0x99, 0x47, 0x99, 0x6C, 0xEA, 0x43, 0xD9, 0x63, 0x99, 0x80, 0x6A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCD, 0x02, 0x63, 0x99, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, +0x00, 0x18, 0x99, 0x03, 0x63, 0x99, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xA0, 0x03, +0x63, 0x99, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x06, 0x03, 0x63, 0x99, 0x08, 0x6A, +0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x21, 0x04, 0xB9, 0x65, 0x05, 0x97, 0x04, 0x91, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x04, 0x01, 0x20, 0x6A, 0x49, 0xC1, +0x00, 0x6A, 0x48, 0xC1, 0x60, 0x6C, 0x00, 0x18, 0x73, 0x02, 0x00, 0x18, 0x7E, 0x01, 0x00, 0x18, +0x6E, 0x01, 0x00, 0x18, 0x92, 0x01, 0x00, 0x18, 0x5E, 0x01, 0x00, 0x18, 0x66, 0x01, 0x0A, 0x6C, +0x00, 0x18, 0xFD, 0x06, 0xFF, 0x17, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x48, 0x9A, 0x00, 0x6B, 0x60, 0xCA, 0xB9, 0x65, +0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x4C, 0x9A, 0x00, 0xF4, 0x00, 0x6B, 0x60, 0xDA, +0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x01, 0x6B, 0x00, 0xF6, 0x64, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x50, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x54, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0xB9, 0x65, +0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x5C, 0x9A, 0x07, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x40, 0x9A, 0xFF, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x44, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0xB9, 0x65, +0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, +0x60, 0x33, 0xC0, 0xF0, 0x6C, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF0, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x7E, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x62, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x54, 0x9A, 0x40, 0x9A, 0x42, 0xD9, +0x62, 0x99, 0x00, 0xF2, 0x01, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF0, 0x54, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x62, 0x99, 0x00, 0xF4, 0x03, 0x6A, +0x4B, 0xEA, 0x6C, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, +0x54, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x62, 0x99, 0x00, 0xF4, 0x02, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x54, 0x9A, 0x62, 0x99, 0x60, 0xDA, +0x00, 0x6A, 0x41, 0xD9, 0x1D, 0x10, 0x00, 0x6A, 0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, 0x01, 0x4A, +0x40, 0xD9, 0x40, 0x99, 0x64, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF0, 0x58, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0xA0, 0x6A, 0x6C, 0xEA, +0x42, 0xD9, 0x42, 0x99, 0xA0, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, +0x41, 0x99, 0x0A, 0x5A, 0x58, 0x67, 0xDF, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x48, 0x9A, 0x01, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x5C, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0xE0, 0xF0, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, +0x44, 0x9A, 0x24, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, +0x48, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x01, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x62, 0x99, +0x0A, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, +0x48, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, +0x4C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF0, 0x50, 0x9A, 0x6C, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF0, 0x4C, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF0, 0x54, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF0, 0x58, 0x9A, 0x6C, 0xEA, 0x42, 0xD9, 0x62, 0x99, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, 0x5C, 0x9A, 0x6D, 0xEA, 0x42, 0xD9, 0x62, 0x99, 0x04, 0xF0, +0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF0, 0x54, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF0, 0x54, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF1, 0x40, 0x9A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF0, 0x54, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x80, 0xF7, 0x00, 0x6A, +0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, +0x62, 0x99, 0x60, 0xDA, 0x62, 0x99, 0x01, 0xF0, 0x00, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x62, 0x99, +0x01, 0xF0, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF1, 0x44, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x09, 0x6A, 0x6D, 0xEA, +0x42, 0xD9, 0x62, 0x99, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x44, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x62, 0x99, 0x10, 0x6A, +0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x44, 0x9A, +0x62, 0x99, 0x60, 0xDA, 0x62, 0x99, 0x11, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x42, 0xD9, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x44, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x48, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, +0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0xF1, 0x48, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF0, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x7F, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x62, 0x99, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x40, 0x9A, +0x42, 0xD9, 0x62, 0x99, 0x10, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF0, 0x50, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF1, 0x4C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x07, 0x6A, 0x6D, 0xEA, +0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x4C, 0x9A, 0x62, 0x99, +0x60, 0xDA, 0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0xD1, +0x3D, 0x67, 0x44, 0x67, 0x20, 0xF0, 0x40, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0xF1, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x82, 0x6A, 0x44, 0xD9, 0x64, 0x99, 0xFF, 0x6A, +0x6C, 0xEA, 0x42, 0xD9, 0x64, 0x99, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x42, 0x32, 0x43, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x54, 0x9A, 0x80, 0x6B, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x58, 0x9A, 0x62, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x50, 0x9A, 0x63, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x54, 0x9A, 0x03, 0x6B, 0x60, 0xDA, +0xB9, 0x65, 0x07, 0x91, 0x04, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x00, 0x6A, +0x41, 0xC1, 0x26, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x5C, 0x9A, +0x40, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x0C, 0x22, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x58, 0x9A, 0x40, 0x9A, 0x00, 0xF6, 0x40, 0x32, +0x00, 0xF6, 0x43, 0x32, 0x13, 0x10, 0x00, 0x6A, 0x40, 0xC1, 0x03, 0x10, 0x40, 0xA1, 0x01, 0x4A, +0x40, 0xC1, 0x40, 0xA1, 0x0A, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x41, 0xA1, 0x01, 0x4A, 0x41, 0xC1, +0x41, 0xA1, 0x64, 0x5A, 0x58, 0x67, 0xD6, 0x2A, 0x01, 0x6A, 0x4B, 0xEA, 0xB9, 0x65, 0x03, 0x91, +0x02, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x44, 0x67, 0x50, 0xC1, 0x00, 0x6A, +0x41, 0xC9, 0x2C, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF1, 0x5C, 0x9A, +0x60, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x14, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0xF1, 0x58, 0x9A, 0x70, 0xA1, 0x60, 0xDA, 0x00, 0x6A, 0x40, 0xC9, 0x03, 0x10, 0x40, 0xA9, +0x01, 0x4A, 0x40, 0xC9, 0x40, 0x89, 0x00, 0x52, 0x58, 0x67, 0xF9, 0x22, 0x00, 0x6A, 0x15, 0x10, +0x00, 0x6A, 0x40, 0xC9, 0x03, 0x10, 0x40, 0xA9, 0x01, 0x4A, 0x40, 0xC9, 0x40, 0xA9, 0xE0, 0xF3, +0x08, 0x5A, 0x58, 0x67, 0xF8, 0x2A, 0x41, 0xA9, 0x01, 0x4A, 0x41, 0xC9, 0x41, 0xA9, 0x02, 0xF0, +0x00, 0x5A, 0x58, 0x67, 0xCF, 0x2A, 0x01, 0x6A, 0x4B, 0xEA, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF1, 0x40, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x42, 0x99, 0x01, 0x6B, 0x6E, 0xEA, +0x20, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x50, 0x9A, 0x04, 0x6B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF1, 0x44, 0x9A, 0x40, 0x9A, +0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x01, 0x6B, 0x00, 0xF6, +0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x50, 0x9A, 0x03, 0x6B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF1, 0x48, 0x9A, 0x40, 0x9A, +0x42, 0xD9, 0x42, 0x99, 0x01, 0x6B, 0x6E, 0xEA, 0x33, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF1, 0x4C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF1, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xD9, 0x60, 0x99, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF1, 0x54, 0x9A, 0x6D, 0xEA, 0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF1, 0x50, 0x9A, 0x60, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF6, 0x5C, 0x9A, 0x2E, 0xF5, 0x10, 0x5A, 0x58, 0x67, 0x08, 0x22, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x54, 0x9A, 0x03, 0x6B, 0x60, 0xDA, +0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD1, 0x04, 0x01, +0x00, 0xF3, 0x00, 0x6A, 0x49, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, +0x00, 0x4A, 0x40, 0xD9, 0x47, 0x41, 0x1D, 0x4A, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xA0, 0xF0, 0x4C, 0x9A, 0x40, 0x9A, 0x47, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xA0, 0xF0, 0x4C, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF1, 0x58, 0x9A, 0x40, 0x9A, 0x48, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF1, 0x5C, 0x9A, 0x40, 0x9A, 0x46, 0xD9, 0x66, 0x99, 0x80, 0x6A, 0x6D, 0xEA, +0x46, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF1, 0x5C, 0x9A, 0x66, 0x99, +0x60, 0xDA, 0x68, 0x99, 0x01, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x1B, 0x22, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x40, 0x9A, 0x88, 0x99, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, +0x60, 0x33, 0x00, 0xF1, 0x60, 0x9B, 0x6D, 0xE4, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF1, 0x44, 0x9A, 0x40, 0x9A, 0x46, 0xD9, 0x66, 0x99, 0x0F, 0x6A, 0x6C, 0xEA, +0x44, 0xD9, 0x68, 0x99, 0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x80, 0xF0, 0x1F, 0x22, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x44, 0x9A, 0x40, 0x9A, 0x46, 0xD9, 0x66, 0x99, +0x40, 0x6A, 0x6C, 0xEA, 0x80, 0xF0, 0x0D, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF1, 0x48, 0x9A, 0x40, 0x9A, 0x49, 0xD9, 0x42, 0x99, 0x60, 0xA2, 0x20, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x46, 0xC1, 0x46, 0xA1, 0x56, 0x32, 0x46, 0xC1, 0x42, 0x99, 0x02, 0x4A, 0x40, 0xA2, +0x45, 0xC1, 0x46, 0xA1, 0x7B, 0x22, 0x42, 0x99, 0x02, 0x4A, 0x40, 0xA2, 0x45, 0xC1, 0x42, 0x99, +0x40, 0xA2, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x6B, 0x4E, 0xEB, 0x2F, 0x23, 0x03, 0x52, +0x78, 0x67, 0x02, 0x23, 0x20, 0x22, 0x6A, 0x10, 0x03, 0x6B, 0x4E, 0xEB, 0x31, 0x23, 0x04, 0x6B, +0x6E, 0xEA, 0x64, 0x2A, 0x42, 0x99, 0x02, 0x4A, 0x40, 0xA2, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, 0x80, 0xF6, 0x64, 0xC2, 0x42, 0x99, 0x02, 0x4A, 0x40, 0xA2, +0x01, 0x6B, 0x6E, 0xEA, 0x50, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x01, 0x6B, +0x80, 0xF6, 0x64, 0xC2, 0x4B, 0x10, 0x42, 0x99, 0x01, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x45, 0xA1, +0x00, 0x6C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x5B, 0x0E, 0x40, 0x10, 0x42, 0x99, 0x01, 0x4A, +0x40, 0xA2, 0x62, 0x67, 0x45, 0xA1, 0x02, 0x6C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x5B, 0x0E, +0x46, 0xA1, 0x05, 0x6B, 0x6E, 0xEA, 0x1C, 0x2A, 0x45, 0xA1, 0x26, 0x5A, 0x58, 0x67, 0x2D, 0x22, +0x00, 0x6A, 0x45, 0xD9, 0x11, 0x10, 0x65, 0xA1, 0x45, 0x99, 0x49, 0xE3, 0x48, 0x32, 0x60, 0x99, +0x49, 0xE3, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x40, 0xF1, 0x68, 0x9B, 0x60, 0x9B, +0x60, 0xDA, 0x45, 0x99, 0x01, 0x4A, 0x45, 0xD9, 0x45, 0x99, 0x04, 0x5A, 0x58, 0x67, 0xEB, 0x2A, +0x46, 0xA1, 0x02, 0x6B, 0x6E, 0xEA, 0x12, 0x2A, 0x45, 0xA1, 0x48, 0x32, 0x60, 0x99, 0x49, 0xE3, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x40, 0xF1, 0x68, 0x9B, 0x60, 0x9B, 0x60, 0xDA, +0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF1, 0x58, 0x9A, 0x68, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x40, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x20, 0xF1, 0x78, 0x9B, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xA0, 0xF0, 0x4C, 0x9A, 0x67, 0x99, 0x60, 0xDA, 0xB9, 0x65, 0x0B, 0x97, 0x0A, 0x91, 0x06, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF1, 0x4C, 0x9A, 0x40, 0x9A, 0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, +0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, +0x50, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x02, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x42, 0xD9, +0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x05, 0x5A, +0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x50, 0x9A, +0x62, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x54, 0x9A, +0x40, 0x9A, 0x40, 0xD9, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, +0x41, 0x99, 0x05, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF1, 0x54, 0x9A, 0x80, 0x99, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x40, 0xF1, +0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, +0x41, 0xD9, 0x41, 0x99, 0x05, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF1, 0x5C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, +0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x05, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x40, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x02, 0x6B, 0x64, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x48, 0x9A, 0x00, 0x6B, 0x60, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x54, 0xA2, 0x61, 0x42, 0xFF, 0x6A, +0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x74, 0xC2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x5C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, +0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x32, 0x5A, +0x58, 0x67, 0xF9, 0x2A, 0x62, 0x99, 0x01, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x5C, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, +0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, 0x48, 0x9A, 0x40, 0x9A, 0x42, 0xD9, +0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x05, 0x5A, +0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF0, 0x48, 0x9A, +0x82, 0x99, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, +0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x05, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x00, 0x6A, +0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x05, 0x5A, 0x58, 0x67, +0xF9, 0x2A, 0x62, 0x99, 0x01, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF1, 0x50, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x00, 0x6A, 0x4E, 0xC1, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x44, 0x9A, 0x40, 0xAA, 0x46, 0xC9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x44, 0x9A, 0x00, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x48, 0x9A, 0x40, 0xAA, 0x45, 0xC9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x48, 0x9A, 0x65, 0xA9, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x50, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x70, 0xC2, 0x65, 0xA9, +0x08, 0x6A, 0x6C, 0xEA, 0x43, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, +0x04, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, +0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, +0x04, 0x4A, 0x52, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x72, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF2, 0x48, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF0, 0x48, 0x9A, 0x0B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x65, 0xA9, 0x01, 0x6A, +0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xE0, 0xF0, 0x0B, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x51, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x71, 0xC2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x54, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x63, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x43, 0xAA, 0x62, 0x67, 0x1F, 0xF7, +0x00, 0x6A, 0x6C, 0xEA, 0x27, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, +0x04, 0x4A, 0x43, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x69, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x43, 0xAA, 0xFF, 0x6B, 0x6C, 0xEA, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x20, 0xF6, 0x04, 0x4B, 0x43, 0xCB, 0x01, 0x6A, +0x4E, 0xC1, 0x0A, 0x10, 0x00, 0x6A, 0x4E, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x20, 0xF6, 0x04, 0x4A, 0x00, 0x6B, 0x69, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x20, 0xF6, 0x04, 0x4A, 0x43, 0xAA, 0x0B, 0x5A, 0x58, 0x67, 0x3F, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF1, 0x40, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x20, 0xF6, 0x04, 0x4B, 0x63, 0xAB, 0x83, 0x67, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x60, 0xF1, 0x78, 0x9B, 0x6D, 0xE4, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x20, 0xF6, 0x04, 0x4A, 0x00, 0x6B, 0x63, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x01, 0x6B, 0x6B, 0xEB, 0x40, 0xF6, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xA0, 0xF0, 0x48, 0x9A, 0x01, 0x6B, 0x60, 0xCA, 0x43, 0x10, 0x00, 0x6A, 0x4F, 0xC1, 0x0F, 0x10, +0x4F, 0xA1, 0x48, 0x32, 0x61, 0x99, 0x49, 0xE3, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x60, 0xF1, 0x7C, 0x9B, 0x60, 0x9B, 0x60, 0xDA, 0x4F, 0xA1, 0x01, 0x4A, 0x4F, 0xC1, 0x8F, 0xA1, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x43, 0xAA, 0x62, 0x67, +0x4E, 0xA1, 0x49, 0xE3, 0x03, 0x4A, 0x00, 0x52, 0x78, 0x67, 0x01, 0x23, 0x03, 0x4A, 0x4B, 0x32, +0x42, 0xEC, 0x58, 0x67, 0xDD, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, +0x60, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x73, 0xC2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x03, 0x6B, 0x20, 0xF6, 0x64, 0xDA, +0x65, 0xA9, 0x02, 0x6A, 0x6C, 0xEA, 0x11, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x20, 0xF6, 0x04, 0x4A, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x6C, 0xC2, 0x65, 0xA9, 0x04, 0x6A, 0x6C, 0xEA, +0x11, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x4D, 0xA2, +0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, +0x04, 0x4A, 0x6D, 0xC2, 0x65, 0xA9, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x22, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x4F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, +0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x6F, 0xC2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF1, 0x44, 0x9A, 0x66, 0xA9, 0x60, 0xCA, +0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x82, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF1, 0x40, 0x9A, 0x62, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x50, 0x9A, 0x03, 0x6B, 0x60, 0xDA, +0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x82, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF1, 0x44, 0x9A, 0x62, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x54, 0x9A, 0x03, 0x6B, 0x60, 0xDA, +0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x50, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0xB9, 0x65, +0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x54, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0xB9, 0x65, +0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x84, 0xD9, +0xA5, 0xD9, 0xC6, 0xD9, 0x64, 0x99, 0x46, 0x99, 0x49, 0xE3, 0x40, 0xD9, 0x0A, 0x10, 0x44, 0x99, +0x65, 0x99, 0x60, 0xA3, 0x60, 0xC2, 0x44, 0x99, 0x01, 0x4A, 0x44, 0xD9, 0x45, 0x99, 0x01, 0x4A, +0x45, 0xD9, 0x65, 0x99, 0x40, 0x99, 0x43, 0xEB, 0x58, 0x67, 0xF1, 0x2A, 0x44, 0x99, 0xB9, 0x65, +0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x84, 0xD9, +0xA5, 0xD9, 0x64, 0x99, 0x45, 0x99, 0x49, 0xE3, 0x40, 0xD9, 0x06, 0x10, 0x44, 0x99, 0x00, 0x6B, +0x60, 0xC2, 0x44, 0x99, 0x01, 0x4A, 0x44, 0xD9, 0x64, 0x99, 0x40, 0x99, 0x43, 0xEB, 0x58, 0x67, +0xF5, 0x2A, 0x44, 0x99, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x03, 0xD1, +0x3D, 0x67, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0x00, 0x6A, 0x40, 0xD9, 0x0F, 0x10, 0x64, 0x99, +0x40, 0x99, 0x49, 0xE3, 0x60, 0xA2, 0x85, 0x99, 0x40, 0x99, 0x49, 0xE4, 0x40, 0xA2, 0x6E, 0xEA, +0x02, 0x22, 0x00, 0x6A, 0x09, 0x10, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, 0x60, 0x99, 0x46, 0x99, +0x43, 0xEB, 0x58, 0x67, 0xEC, 0x2A, 0x01, 0x6A, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, +0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x44, 0x67, 0xA3, 0xD9, 0x48, 0xC1, 0x43, 0x99, 0x60, 0xAA, +0xFF, 0x6A, 0x4C, 0xEB, 0x48, 0xA1, 0x6E, 0xEA, 0x48, 0xC1, 0x48, 0xA1, 0x50, 0x32, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x48, 0x81, 0x6E, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, +0x43, 0x32, 0x48, 0xC1, 0x43, 0x99, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, +0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, 0x48, 0xA1, 0x40, 0x32, 0x40, 0x32, 0x40, 0x32, +0x43, 0x32, 0x43, 0x32, 0x6E, 0xEA, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, 0x48, 0xA1, +0x4C, 0x32, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x6E, 0xEA, 0x40, 0x33, 0x60, 0x33, +0x63, 0x33, 0x63, 0x33, 0x48, 0xA1, 0x52, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x6E, 0xEA, 0x40, 0x33, +0x60, 0x33, 0x63, 0x33, 0x63, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x43, 0x99, 0x60, 0xCA, +0x43, 0x99, 0x40, 0xAA, 0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, +0x06, 0xD1, 0x04, 0x01, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x44, 0x99, 0x01, 0x6B, +0x4E, 0xEB, 0x04, 0x23, 0x02, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x32, 0x10, 0x6C, 0xF3, 0x03, 0x6A, +0x41, 0xC9, 0x04, 0x10, 0x01, 0x6A, 0x4B, 0xEA, 0x41, 0xC9, 0x00, 0x65, 0x45, 0x99, 0x40, 0x82, +0x40, 0xC1, 0x45, 0x99, 0x01, 0x4A, 0x45, 0xD9, 0x60, 0xA1, 0x42, 0x41, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0x58, 0x05, 0x46, 0x99, 0xFF, 0x4A, 0x46, 0xD9, 0x46, 0x99, 0xEF, 0x2A, 0x44, 0x99, +0x02, 0x6B, 0x6E, 0xEA, 0x06, 0x2A, 0x41, 0xA9, 0x4F, 0xEB, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, +0x41, 0xC9, 0x61, 0xA9, 0xFF, 0x6A, 0x4C, 0xEB, 0x47, 0x99, 0x60, 0xC2, 0x41, 0xA9, 0x42, 0x33, +0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x48, 0x99, 0x60, 0xC2, 0x00, 0x65, +0xB9, 0x65, 0x03, 0x97, 0x02, 0x91, 0x02, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, +0x08, 0xD1, 0x06, 0x01, 0x84, 0xD9, 0x65, 0x67, 0x46, 0x67, 0x74, 0xC1, 0x58, 0xC1, 0x58, 0xA1, +0x01, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0xA4, 0x99, 0x74, 0xA1, 0x43, 0x41, 0x84, 0x41, 0x04, 0xD4, +0x01, 0x6C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x7F, 0x05, 0x0A, 0x10, 0xA4, 0x99, 0x74, 0xA1, +0x43, 0x41, 0x84, 0x41, 0x04, 0xD4, 0x02, 0x6C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x7F, 0x05, +0x43, 0xA1, 0x40, 0xC9, 0x40, 0xA9, 0x40, 0x32, 0x40, 0xC9, 0x44, 0xA1, 0x62, 0x67, 0x40, 0xA9, +0x6D, 0xEA, 0x40, 0xC9, 0x40, 0xA9, 0xB9, 0x65, 0x03, 0x97, 0x02, 0x91, 0x02, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x86, 0xD9, 0x46, 0x99, 0x40, 0xD9, 0x40, 0x99, 0x77, 0xF0, +0x24, 0x6B, 0x4D, 0xE3, 0x40, 0x9B, 0x62, 0xD9, 0x41, 0xD9, 0x41, 0x99, 0xB9, 0x65, 0x05, 0x91, +0x03, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x86, 0xD9, 0xA7, 0xD9, 0x46, 0x99, +0x40, 0xD9, 0x47, 0x99, 0x41, 0xD9, 0x41, 0x99, 0x60, 0x99, 0x77, 0xF0, 0x24, 0x6A, 0x69, 0xE2, +0x40, 0xDA, 0x42, 0xD9, 0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x01, 0xD1, +0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x44, 0x9A, 0x61, 0x42, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF1, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0xC0, 0xF2, 0x64, 0x9B, 0x60, 0xDA, 0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, +0x0C, 0x4A, 0x02, 0x6B, 0x64, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, +0x0C, 0x4A, 0x00, 0x6B, 0x61, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, +0x4C, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, +0x50, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, +0x54, 0x9A, 0xA7, 0xF7, 0x07, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, 0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x60, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x0C, 0x4A, 0x6C, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, +0x00, 0x4A, 0x61, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x6D, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x62, 0xA2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6E, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x63, 0xA2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6F, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x64, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x0C, 0x4A, 0x70, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, +0x00, 0x4A, 0x65, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x71, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x66, 0xA2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x72, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x67, 0xA2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x73, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x68, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x0C, 0x4A, 0x74, 0xC2, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0x00, 0x65, +0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, +0x06, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, +0x5C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, +0x58, 0x9A, 0x00, 0xF4, 0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF1, 0x54, 0x9A, 0x87, 0xF7, 0x07, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, 0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x40, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x1B, 0x6B, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, +0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x48, 0x9A, 0x02, 0x6B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x0B, 0x6B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x4C, 0x9A, 0x02, 0x6B, +0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x44, 0x6B, +0x60, 0xDA, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x03, 0xD1, +0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, +0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x5C, 0x9A, 0x01, 0x6B, +0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, +0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x54, 0x9A, +0x87, 0xF7, 0x07, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, 0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x40, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x1B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x10, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x48, 0x9A, 0x02, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x0B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0xB9, 0x65, +0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x5C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, 0x05, 0x6B, 0x60, 0xCA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x54, 0x9A, 0x87, 0xF7, 0x07, 0x6B, +0x6B, 0xEB, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, +0x00, 0xF4, 0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, +0x40, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x48, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x44, 0x9A, 0x1B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF2, 0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x48, 0x9A, 0x02, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x0B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD1, 0x04, 0x01, 0x44, 0x67, 0x20, 0xF0, +0x50, 0xC1, 0x00, 0x6A, 0x5C, 0xC1, 0x00, 0x6A, 0x43, 0xD9, 0x00, 0x6A, 0x42, 0xD9, 0x00, 0x6A, +0x44, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x40, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x54, 0x9A, 0x40, 0x9A, 0x46, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x54, 0x9A, 0x10, 0xF0, 0x10, 0x6B, +0x60, 0x33, 0x60, 0x33, 0xE0, 0xF1, 0x78, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x54, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xE0, 0xF1, +0x7C, 0x9B, 0x60, 0xDA, 0x00, 0x6A, 0x51, 0xC9, 0x03, 0x10, 0x51, 0xA9, 0x01, 0x4A, 0x51, 0xC9, +0x51, 0xA9, 0x0A, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x00, 0x18, 0xEC, 0x05, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x40, 0x9A, 0xFF, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x44, 0x9A, 0x01, 0x6B, 0x60, 0xCA, 0x01, 0x10, 0x00, 0x65, +0x00, 0x18, 0x78, 0x08, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, +0x40, 0x9A, 0x45, 0xD9, 0x45, 0x99, 0x22, 0xF2, 0x14, 0x6B, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, +0x62, 0x67, 0xFF, 0x6A, 0x4C, 0xEB, 0x45, 0x99, 0x22, 0xF2, 0x15, 0x6C, 0x8E, 0xEA, 0x01, 0x5A, +0x58, 0x67, 0x82, 0x67, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, +0x45, 0x99, 0x22, 0xF2, 0x16, 0x6C, 0x8E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x6D, 0xEA, 0x2D, 0x22, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x4C, 0x9A, 0x40, 0x9A, 0x44, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x4C, 0x9A, 0x64, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x50, 0x9A, 0x80, 0xF4, 0x00, 0x6B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x54, 0x9A, 0x40, 0x9A, +0x44, 0xD9, 0x64, 0x99, 0x80, 0x6A, 0x6D, 0xEA, 0x44, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF2, 0x54, 0x9A, 0x64, 0x99, 0x60, 0xDA, 0x45, 0x99, 0x02, 0xF1, 0x11, 0x6B, +0x6E, 0xEA, 0x12, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF1, 0x0C, 0x4A, +0x82, 0x67, 0x00, 0x18, 0x71, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, +0x48, 0x9A, 0x24, 0xF2, 0x02, 0x6B, 0x60, 0xDA, 0x45, 0x99, 0x26, 0xF3, 0x12, 0x6C, 0x8E, 0xEA, +0x39, 0x2A, 0x00, 0x6A, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, +0x04, 0x4A, 0x4D, 0xA2, 0x45, 0xD9, 0x45, 0x99, 0x40, 0x32, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x53, 0xA2, 0x65, 0x99, 0x6D, 0xEA, 0x45, 0xD9, +0x45, 0x99, 0x40, 0x32, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, +0x04, 0x4A, 0x43, 0xAA, 0x65, 0x99, 0x6D, 0xEA, 0x45, 0xD9, 0x45, 0x99, 0x40, 0x32, 0x45, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x54, 0xA2, 0x65, 0x99, +0x6D, 0xEA, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, +0x65, 0x99, 0x60, 0xDA, 0x45, 0x99, 0x26, 0xF3, 0x13, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x60, 0x99, 0x60, 0x9B, 0x60, 0xDA, +0x40, 0x99, 0x04, 0x4A, 0x40, 0xD9, 0x45, 0x99, 0x26, 0xF3, 0x14, 0x6C, 0x8E, 0xEA, 0x39, 0x2A, +0x00, 0x6A, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, +0x51, 0xA2, 0x45, 0xD9, 0x45, 0x99, 0x40, 0x32, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x52, 0xA2, 0x65, 0x99, 0x6D, 0xEA, 0x45, 0xD9, 0x45, 0x99, +0x40, 0x32, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, +0x50, 0xA2, 0x65, 0x99, 0x6D, 0xEA, 0x45, 0xD9, 0x45, 0x99, 0x40, 0x32, 0x45, 0xD9, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x4C, 0xA2, 0x65, 0x99, 0x6D, 0xEA, +0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x65, 0x99, +0x60, 0xDA, 0x45, 0x99, 0x26, 0xF3, 0x15, 0x6B, 0x6E, 0xEA, 0x0D, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x80, 0xF6, 0x6C, 0x9B, 0x60, 0xDA, 0x45, 0x99, 0x26, 0xF3, 0x16, 0x6C, 0x8E, 0xEA, 0x0D, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, +0x60, 0x33, 0x60, 0x33, 0xA0, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x45, 0x99, 0x26, 0xF3, 0x17, 0x6B, +0x6E, 0xEA, 0x0D, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x80, 0xF6, 0x68, 0x9B, 0x60, 0xDA, 0x45, 0x99, +0x26, 0xF3, 0x18, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x01, 0x6B, 0xC0, 0xF2, 0x68, 0xDA, 0x45, 0x99, 0x26, 0xF3, 0x19, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x02, 0x6B, 0xC0, 0xF2, 0x68, 0xDA, 0x45, 0x99, +0x46, 0xF3, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0x6B, 0xC0, 0xF2, 0x68, 0xDA, 0x45, 0x99, 0x46, 0xF3, 0x01, 0x6B, 0x6E, 0xEA, 0x0D, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, +0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, 0x68, 0x9B, 0x60, 0xDA, 0x45, 0x99, 0x22, 0xF2, 0x14, 0x6C, +0x8E, 0xEA, 0x2E, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, +0xAA, 0xF5, 0x0A, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, +0x54, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x00, 0xF2, 0x78, 0x9B, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x5C, 0x9A, 0x10, 0xF0, 0x10, 0x6B, +0x60, 0x33, 0x60, 0x33, 0x20, 0xF2, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF2, 0x44, 0x9A, 0x00, 0xF3, 0x00, 0x6B, 0x60, 0xDA, 0x00, 0x18, 0x27, 0x01, +0x45, 0x99, 0x22, 0xF2, 0x15, 0x6B, 0x6E, 0xEA, 0x37, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x93, 0xF1, 0x19, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF2, 0x48, 0x9A, 0xAF, 0xF3, 0x1C, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x4C, 0x9A, 0x00, 0x6B, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x5C, 0x9A, 0x10, 0xF0, 0x10, 0x6B, +0x60, 0x33, 0x60, 0x33, 0x20, 0xF2, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF2, 0x54, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x20, 0xF2, +0x6C, 0x9B, 0x60, 0xDA, 0x00, 0x18, 0x27, 0x01, 0x45, 0x99, 0x22, 0xF2, 0x16, 0x6C, 0x8E, 0xEA, +0x3C, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x93, 0xF1, +0x19, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x5C, 0x9A, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x20, 0xF2, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x54, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, +0x60, 0x33, 0x20, 0xF2, 0x70, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x20, 0xF2, 0x48, 0x9A, 0xAF, 0xF3, 0x1C, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF2, 0x54, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x20, 0xF2, 0x78, 0x9B, 0x60, 0xDA, 0x00, 0x18, 0x27, 0x01, 0x45, 0x99, 0x24, 0xF2, 0x16, 0x6B, +0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x01, 0x6B, 0x80, 0xF6, +0x68, 0xDA, 0x45, 0x99, 0x24, 0xF2, 0x15, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x02, 0x6B, 0x80, 0xF6, 0x68, 0xDA, 0x45, 0x99, 0x24, 0xF2, 0x14, 0x6B, +0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x03, 0x6B, 0x80, 0xF6, +0x68, 0xDA, 0x45, 0x99, 0x44, 0xF2, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x01, 0x6B, 0xC0, 0xF2, 0x6C, 0xDA, 0x45, 0x99, 0x44, 0xF2, 0x01, 0x6B, +0x6E, 0xEA, 0x0D, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, 0x6C, 0x9B, 0x60, 0xDA, 0x45, 0x99, +0x44, 0xF2, 0x02, 0x6C, 0x8E, 0xEA, 0x0E, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0xF2, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x80, 0xF6, 0x0C, 0x4B, +0x64, 0xAB, 0x60, 0xDA, 0x45, 0x99, 0x44, 0xF2, 0x03, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x01, 0x6B, 0xA0, 0xF0, 0x64, 0xDA, 0x45, 0x99, 0x44, 0xF2, +0x04, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, +0xA0, 0xF0, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x44, 0x9A, +0x12, 0xF0, 0x03, 0x6B, 0x6E, 0xEA, 0x7F, 0xF5, 0x12, 0x2A, 0x00, 0x18, 0x86, 0x09, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x68, 0x15, +0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x04, 0x01, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x20, 0xF2, 0x5C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x10, 0x6A, 0x6C, 0xEA, 0x71, 0x22, +0x00, 0x6A, 0x40, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF6, 0x44, 0x9A, +0x61, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF6, 0x64, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF6, 0x64, 0x9A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF2, 0x40, 0x9A, 0x63, 0xEA, 0x58, 0x67, 0x5C, 0x22, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, 0xA0, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xA0, 0xF0, 0x44, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x04, 0x6C, 0x00, 0x6D, +0x00, 0x18, 0x5B, 0x0E, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x02, 0x6B, 0x64, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x48, 0x9A, +0x01, 0x6B, 0x6E, 0xEA, 0x09, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, +0x48, 0x9A, 0x22, 0xF2, 0x16, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x09, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x22, 0xF2, 0x15, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x48, 0x9A, 0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x22, 0xF2, 0x14, 0x6B, 0x60, 0xDA, +0x09, 0x10, 0x01, 0x6A, 0x40, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, +0xA0, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x44, 0xAA, 0x02, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x0B, 0x2A, 0x40, 0xA1, 0x01, 0x6B, 0x6E, 0xEA, +0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x41, 0x9A, +0x61, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x61, 0xDA, +0x08, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x00, 0x6B, +0x61, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x41, 0x9A, +0x11, 0x5A, 0x58, 0x67, 0xE0, 0xF0, 0x12, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x0C, 0x4A, 0x00, 0x6B, 0x61, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF2, 0x44, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, 0x02, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, +0x42, 0xD9, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, +0x0A, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, +0x44, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, +0x41, 0xD9, 0x41, 0x99, 0x0A, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, +0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x82, 0x99, 0x01, 0x6B, 0x8D, 0xEB, +0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, +0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, +0x48, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, +0x41, 0xD9, 0x41, 0x99, 0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF2, 0x48, 0x9A, 0x07, 0x6B, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x11, 0x10, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x4C, 0x9A, 0x40, 0x9A, 0x42, 0xD9, +0x62, 0x99, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x41, 0x99, 0x01, 0x4A, +0x41, 0xD9, 0x61, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x50, 0x9A, +0x43, 0xEB, 0x58, 0x67, 0xE5, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0x52, 0x09, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x44, 0x9A, 0x01, 0x6B, 0x60, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x40, 0x9A, 0x42, 0xD9, 0x62, 0x99, +0x01, 0x6A, 0x6D, 0xEA, 0x42, 0xD9, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, 0x41, 0x99, 0x01, 0x4A, +0x41, 0xD9, 0x41, 0x99, 0x0A, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x62, 0x99, 0x60, 0xDA, 0x00, 0x6A, 0x41, 0xD9, 0x03, 0x10, +0x41, 0x99, 0x01, 0x4A, 0x41, 0xD9, 0x41, 0x99, 0x0A, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x2E, 0x10, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x4C, 0x9A, 0x27, 0x22, 0x01, 0x10, +0x00, 0x65, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF2, 0x5C, 0x9A, 0x40, 0x9A, +0x42, 0xD9, 0x62, 0x99, 0x10, 0x6A, 0x6C, 0xEA, 0x18, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF2, 0x4C, 0x9A, 0x61, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF2, 0x6C, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x4C, 0x9A, +0x02, 0xF0, 0x01, 0x5A, 0x58, 0x67, 0xDC, 0x2A, 0x01, 0x10, 0x00, 0x65, 0xB9, 0x65, 0x05, 0x97, +0x04, 0x91, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x04, 0x01, +0x00, 0x6A, 0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, 0x40, 0x99, 0x32, 0x5A, +0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x4C, 0x9A, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x40, 0xF2, 0x74, 0x9B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF0, 0x44, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x16, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x44, 0xAA, 0x02, 0x6B, +0x6E, 0xEA, 0x0C, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x01, 0x6B, 0x64, 0xCA, 0x04, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x5B, 0x0E, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x01, 0x6B, 0x64, 0xCA, 0xB9, 0x65, 0x03, 0x97, +0x02, 0x91, 0x02, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x02, 0x6B, 0x64, 0xCA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x4C, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0xB9, 0x65, +0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x04, 0x01, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x4C, 0x9A, 0x1C, 0xF0, 0x00, 0x4A, +0x0E, 0x5A, 0x78, 0x67, 0x20, 0xF1, 0x00, 0x23, 0x48, 0x33, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x80, 0xF1, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x00, 0x18, 0xDF, 0x0C, +0x44, 0xC1, 0x44, 0xA1, 0x01, 0x6B, 0x6E, 0xEA, 0x00, 0xF1, 0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x01, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x08, 0x11, 0x00, 0x18, +0x23, 0x0A, 0x44, 0xC1, 0x44, 0xA1, 0x02, 0x2A, 0x00, 0x6A, 0x02, 0x11, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x44, 0x9A, 0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x01, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0xF0, 0x10, 0x01, 0x6C, +0x00, 0x18, 0x33, 0x0A, 0x44, 0xC1, 0x44, 0xA1, 0x0A, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x00, 0x6A, 0xE1, 0x10, 0x44, 0xA1, +0x01, 0x6B, 0x6E, 0xEA, 0x0A, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, +0x01, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x00, 0x6A, 0xD3, 0x10, 0x44, 0xA1, 0x02, 0x6B, 0x6E, 0xEA, +0x0A, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x0C, 0x6B, 0x80, 0xF6, +0x6C, 0xDA, 0x00, 0x6A, 0xC5, 0x10, 0x44, 0xA1, 0x07, 0x6B, 0x6E, 0xEA, 0x0A, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x03, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x00, 0x6A, +0xB7, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, +0x6C, 0xDA, 0x00, 0x6A, 0xAD, 0x10, 0x02, 0x6C, 0x00, 0x18, 0x20, 0x0B, 0x44, 0xC1, 0x44, 0xA1, +0x0A, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, +0x6C, 0xDA, 0x00, 0x6A, 0x9D, 0x10, 0x44, 0xA1, 0x01, 0x6B, 0x6E, 0xEA, 0x0A, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x03, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x00, 0x6A, +0x8F, 0x10, 0x44, 0xA1, 0x02, 0x6B, 0x6E, 0xEA, 0x12, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x04, 0xF0, 0x0C, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF2, 0x44, 0x9A, 0x07, 0x6B, 0x60, 0xCA, 0x00, 0x6A, 0x79, 0x10, 0x44, 0xA1, +0x07, 0x6B, 0x6E, 0xEA, 0x12, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, +0x0C, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, +0x44, 0x9A, 0x07, 0x6B, 0x60, 0xCA, 0x00, 0x6A, 0x63, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x00, 0x6A, 0x59, 0x10, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x4B, 0xA2, 0x12, 0x22, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x44, 0x9A, 0x05, 0x6B, 0x60, 0xCA, 0x00, 0x6A, +0x3F, 0x10, 0x00, 0x18, 0xBF, 0x0C, 0x44, 0xC1, 0x44, 0xA1, 0x03, 0x6B, 0x6E, 0xEA, 0x12, 0x2A, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x44, 0x9A, 0x05, 0x6B, 0x60, 0xCA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x0D, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, +0x00, 0x6A, 0x26, 0x10, 0x44, 0xA1, 0x12, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x04, 0xF0, 0x00, 0x6B, 0x80, 0xF6, 0x6C, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0xF2, 0x44, 0x9A, 0x05, 0x6B, 0x60, 0xCA, 0x00, 0x6A, 0x12, 0x10, 0x44, 0xA1, 0x02, 0x6B, +0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x04, 0xF0, 0x0C, 0x6B, +0x80, 0xF6, 0x6C, 0xDA, 0x00, 0x6A, 0x04, 0x10, 0x00, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x10, +0xB9, 0x65, 0x03, 0x97, 0x02, 0x91, 0x02, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x04, 0xD1, 0x04, 0x01, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x40, 0xA2, +0x26, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x4C, 0x06, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x40, 0xA2, 0x52, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x4C, 0x06, +0x01, 0x6A, 0xB9, 0x65, 0x01, 0x97, 0x00, 0x91, 0x01, 0x63, 0x00, 0xEF, 0xFA, 0x63, 0x0B, 0x62, +0x0A, 0xD1, 0x04, 0x01, 0x44, 0x67, 0x20, 0xF0, 0x40, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x40, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x40, 0xA2, 0x93, 0x6B, 0x6E, 0xEA, 0xA0, 0xF1, 0x14, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x70, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, +0x00, 0x6C, 0x00, 0x18, 0x41, 0x0C, 0x07, 0x6A, 0xA6, 0x11, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x20, 0x5A, 0x58, 0x67, 0x02, 0x22, 0x00, 0x6A, +0x9A, 0x11, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, +0x68, 0x5A, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x8E, 0x11, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x20, 0x6B, 0x6E, 0xEA, 0x4D, 0x2A, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x78, 0x6B, 0x6B, 0xEB, 0x40, 0xF6, 0x60, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6C, 0xA2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x61, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6D, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x62, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, +0x0C, 0x4A, 0x6E, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, +0x63, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6F, 0xA2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x64, 0xC2, 0x40, 0xA1, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x40, 0xF6, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xCE, 0x0B, 0x01, 0x6A, 0x37, 0x11, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x40, 0xA2, 0x30, 0x6C, 0x8E, 0xEA, 0x0E, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x04, 0x2A, 0x00, 0x18, 0x29, 0x0D, 0x02, 0x6A, +0x22, 0x11, 0x00, 0x6A, 0x20, 0x11, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, +0x00, 0x4A, 0x41, 0xA2, 0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x16, 0x22, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x52, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, +0x62, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x43, 0xAA, +0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0xFF, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x49, 0xA2, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, +0xEA, 0x10, 0x40, 0xA1, 0xE0, 0x4A, 0x53, 0x32, 0x43, 0xC1, 0x00, 0x6A, 0x42, 0xC1, 0x2C, 0x10, +0x42, 0xA1, 0x0F, 0x2A, 0x42, 0xA1, 0x62, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x88, 0x6B, 0x6E, 0xEA, 0x1A, 0x22, 0x00, 0x6A, +0xD2, 0x10, 0x42, 0xA1, 0x62, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, +0x00, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x42, 0xA1, 0x8F, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x49, 0xE4, 0x4C, 0xA2, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, +0xBA, 0x10, 0x42, 0xA1, 0x01, 0x4A, 0x42, 0xC1, 0x62, 0xA1, 0x43, 0xA1, 0x43, 0xEB, 0x58, 0x67, +0xCF, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x61, 0xA2, +0x0F, 0x6A, 0x6C, 0xEA, 0x48, 0xC1, 0x48, 0xA1, 0x40, 0x22, 0x48, 0xA1, 0x08, 0x6B, 0x4B, 0xE3, +0x48, 0xC1, 0x43, 0xA1, 0x14, 0x2A, 0x48, 0xA1, 0x88, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, +0x4A, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x42, 0xA2, +0x62, 0x67, 0x48, 0xA1, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x49, 0xC1, 0x20, 0x10, 0x43, 0xA1, +0x6F, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, +0x4C, 0xA2, 0x62, 0x67, 0x48, 0xA1, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x4A, 0xC1, 0x43, 0xA1, +0x62, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x49, 0xE3, +0x40, 0xA2, 0x62, 0x67, 0x48, 0xA1, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x49, 0xC1, 0x6A, 0xA1, +0x49, 0xA1, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x66, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6F, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x64, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, +0x0C, 0x4A, 0x6E, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, +0x63, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6D, 0xA2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x62, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x6C, 0xA2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x61, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x78, 0x6B, 0x6B, 0xEB, 0x40, 0xF6, 0x60, 0xC2, 0x00, 0x6A, 0x42, 0xC1, 0x12, 0x10, +0x42, 0xA1, 0x83, 0xA1, 0x62, 0xA1, 0x71, 0xE4, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x40, 0xF6, 0x00, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x91, 0x67, 0x49, 0xE4, 0x70, 0xC2, 0x42, 0xA1, +0x01, 0x4A, 0x42, 0xC1, 0x62, 0xA1, 0x43, 0xA1, 0x05, 0x6C, 0x4B, 0xE4, 0x42, 0xEB, 0x58, 0x67, +0xE7, 0x2A, 0x40, 0xA1, 0x67, 0x41, 0x09, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCE, 0x0B, +0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xB9, 0x65, 0x07, 0x97, 0x06, 0x91, 0x04, 0x63, 0x00, 0xEF, +0xFA, 0x63, 0x0B, 0x62, 0x0A, 0xD1, 0x04, 0x01, 0x44, 0x67, 0x20, 0xF0, 0x40, 0xC1, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x40, 0xC1, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x40, 0xA2, 0x95, 0x6B, 0x6E, 0xEA, 0x20, 0xF1, +0x1D, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, +0x70, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x01, 0x6C, 0x00, 0x18, 0x41, 0x0C, 0x07, 0x6A, 0x2F, 0x11, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x20, 0x6B, +0x6E, 0xEA, 0x52, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x70, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x60, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x71, 0xA2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x61, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x72, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x62, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, +0x0C, 0x4A, 0x73, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, +0x63, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x74, 0xA2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x64, 0xC2, 0x40, 0xA1, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x40, 0xF6, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, +0x00, 0x18, 0xCE, 0x0B, 0x01, 0x6A, 0xD3, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x40, 0xA2, 0x30, 0x6C, 0x8E, 0xEA, 0x0E, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x04, 0x2A, 0x00, 0x18, 0x29, 0x0D, 0x02, 0x6A, +0xBE, 0x10, 0x00, 0x6A, 0xBC, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, +0x00, 0x4A, 0x41, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x16, 0x22, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x52, 0x33, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, +0x04, 0x4A, 0x43, 0xAA, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x99, 0x10, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x04, 0x4A, 0x49, 0xA2, 0x6E, 0xEA, +0x02, 0x22, 0x00, 0x6A, 0x84, 0x10, 0x40, 0xA1, 0xE0, 0x4A, 0x53, 0x32, 0x42, 0xC1, 0x00, 0x6A, +0x41, 0xC1, 0x1B, 0x10, 0x41, 0xA1, 0x62, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x41, 0xA1, 0x84, 0x42, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x49, 0xE4, 0x4C, 0xA2, 0x6E, 0xEA, 0x02, 0x22, +0x00, 0x6A, 0x65, 0x10, 0x41, 0xA1, 0x01, 0x4A, 0x41, 0xC1, 0x61, 0xA1, 0x42, 0xA1, 0x43, 0xEB, +0x58, 0x67, 0xE0, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, +0x61, 0xA2, 0x0F, 0x6A, 0x6C, 0xEA, 0x45, 0xC1, 0x45, 0xA1, 0x2A, 0x22, 0x45, 0xA1, 0x08, 0x6B, +0x4B, 0xE3, 0x45, 0xC1, 0x42, 0xA1, 0x64, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x4C, 0xA2, 0x62, 0x67, 0x45, 0xA1, 0x83, 0x67, 0x84, 0xEA, +0x44, 0x67, 0x44, 0xC1, 0x42, 0xA1, 0x62, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x45, 0xA1, 0x83, 0x67, 0x84, 0xEA, +0x44, 0x67, 0x43, 0xC1, 0x64, 0xA1, 0x43, 0xA1, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x27, 0x10, +0x00, 0x6A, 0x41, 0xC1, 0x13, 0x10, 0x41, 0xA1, 0x62, 0xA1, 0x84, 0x43, 0x61, 0xA1, 0x71, 0xE4, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x80, 0xF6, 0x0C, 0x4B, 0x6D, 0xE4, 0x6C, 0xA3, +0x91, 0x67, 0x49, 0xE4, 0x68, 0xC2, 0x41, 0xA1, 0x01, 0x4A, 0x41, 0xC1, 0x61, 0xA1, 0x42, 0xA1, +0x05, 0x6C, 0x4B, 0xE4, 0x42, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x40, 0xA1, 0x67, 0x41, 0x01, 0x4B, +0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCE, 0x0B, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xB9, 0x65, +0x07, 0x97, 0x06, 0x91, 0x04, 0x63, 0x00, 0xEF, 0xFA, 0x63, 0x0B, 0xD1, 0x3D, 0x67, 0x8C, 0xD9, +0x45, 0x67, 0x20, 0xF0, 0x54, 0xC1, 0x00, 0x6A, 0x46, 0xC9, 0x00, 0x6A, 0x41, 0xD9, 0x4C, 0x99, +0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, +0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, +0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x40, 0x9A, +0x08, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x5C, 0x9A, +0x01, 0x6B, 0x60, 0xC2, 0x20, 0xF0, 0x74, 0xA1, 0x0F, 0x6A, 0x6C, 0xEA, 0x20, 0x22, 0x20, 0xF0, +0x54, 0xA1, 0x0F, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x4B, 0xE3, 0x46, 0xC9, 0x46, 0xA9, 0x40, 0x32, +0x46, 0xC9, 0x20, 0xF0, 0x54, 0xA1, 0xE0, 0x4A, 0x53, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, +0x66, 0xA9, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x04, 0x4A, 0x46, 0xC9, 0x66, 0xA9, +0xFF, 0x6A, 0x6C, 0xEA, 0x45, 0xC9, 0x45, 0xA9, 0x01, 0x4A, 0x45, 0xC9, 0x10, 0x10, 0x20, 0xF0, +0x54, 0xA1, 0xE0, 0x4A, 0x53, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x66, 0xA9, 0x4F, 0xE3, +0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x05, 0x4A, 0x46, 0xC9, 0x46, 0xA9, 0x45, 0xC9, 0x46, 0xA9, +0x05, 0x6B, 0x6E, 0xEA, 0x09, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, +0x40, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x08, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x40, 0x9A, 0x48, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x4C, 0x9A, 0x66, 0xA9, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF2, 0x48, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x1B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x48, 0x9A, 0x02, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x0B, 0x6B, 0x60, 0xDA, 0x45, 0xA9, 0x05, 0x5A, +0x58, 0x67, 0x0A, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, +0x60, 0x99, 0x60, 0x9B, 0x60, 0xDA, 0x13, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x50, 0x9A, 0x60, 0x99, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x60, 0x99, 0x04, 0x4B, 0x60, 0x9B, 0x60, 0xDA, 0x00, 0x6A, +0x44, 0xD9, 0x0D, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x44, 0x9A, +0x12, 0xF0, 0x04, 0x6B, 0x6E, 0xEA, 0x09, 0x22, 0x44, 0x99, 0x01, 0x4A, 0x44, 0xD9, 0x44, 0x99, +0xE5, 0xF7, 0x1F, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0xB9, 0x65, 0x0B, 0x91, +0x06, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x06, 0xD1, 0x04, 0x01, 0x44, 0x67, 0x50, 0xC1, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xD9, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x4C, 0x9A, 0x04, 0xF0, 0x01, 0x6B, 0x6E, 0xEA, +0x26, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x42, 0xA2, +0x88, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x3F, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x62, 0x67, 0x40, 0xF6, 0x03, 0x4B, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF6, 0x18, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x03, 0x6E, 0x00, 0x18, 0x47, 0x05, 0x01, 0x6B, +0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x28, 0x10, 0x00, 0x6C, 0x00, 0x18, 0x75, 0x0C, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x4C, 0x9A, 0x04, 0xF0, 0x03, 0x6B, 0x6E, 0xEA, +0x1A, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x62, 0x67, 0x40, 0xF6, 0x02, 0x4B, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x1C, 0x4A, 0x83, 0x67, 0xA2, 0x67, +0x04, 0x6E, 0x00, 0x18, 0x47, 0x05, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x04, 0x10, +0x01, 0x6C, 0x00, 0x18, 0x75, 0x0C, 0x00, 0x10, 0xB9, 0x65, 0x03, 0x97, 0x02, 0x91, 0x02, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x44, 0x67, 0x50, 0xC1, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x5C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, 0x07, 0x6B, 0x60, 0xCA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x40, 0x9A, 0x08, 0x6B, 0x60, 0xC2, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, +0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, 0x1B, 0x6B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, 0x02, 0x6B, +0x6E, 0xEA, 0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x48, 0x9A, +0x02, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x44, 0x9A, +0x0B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x4C, 0x9A, +0x01, 0x6B, 0x60, 0xCA, 0x50, 0xA1, 0x09, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x50, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0x08, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x00, 0x6A, 0x40, 0xD9, 0x0D, 0x10, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x44, 0x9A, 0x12, 0xF0, 0x04, 0x6B, +0x6E, 0xEA, 0x0E, 0x22, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, 0x60, 0x99, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x58, 0x9A, 0x63, 0xEA, 0x58, 0x67, 0xE9, 0x22, 0x01, 0x10, +0x00, 0x65, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x01, 0xD1, +0x3D, 0x67, 0xB9, 0x65, 0x01, 0x91, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, +0x04, 0xD1, 0x04, 0x01, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x40, 0xA2, +0x50, 0x6B, 0x4E, 0xEB, 0x11, 0x23, 0x51, 0x52, 0x78, 0x67, 0x07, 0x23, 0x1A, 0x6B, 0x4E, 0xEB, +0x23, 0x23, 0x30, 0x6B, 0x6E, 0xEA, 0x18, 0x22, 0x23, 0x10, 0x60, 0x6B, 0x4E, 0xEB, 0x18, 0x23, +0xA2, 0x6B, 0x6E, 0xEA, 0x0D, 0x22, 0x1C, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x02, 0x22, 0x00, 0x6A, 0x13, 0x10, 0x03, 0x6A, 0x11, 0x10, +0x00, 0x18, 0xEB, 0x0C, 0x01, 0x6A, 0x0D, 0x10, 0x00, 0x18, 0x29, 0x0D, 0x02, 0x6A, 0x09, 0x10, +0x00, 0x18, 0x87, 0x06, 0x04, 0x6A, 0x05, 0x10, 0x00, 0x18, 0xC2, 0x06, 0x04, 0x6A, 0x01, 0x10, +0x00, 0x6A, 0xB9, 0x65, 0x01, 0x97, 0x00, 0x91, 0x01, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, +0x04, 0xD1, 0x04, 0x01, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x40, 0xA2, +0x52, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x00, 0x18, 0x4C, 0x06, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, +0xB9, 0x65, 0x01, 0x97, 0x00, 0x91, 0x01, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, +0x08, 0xD1, 0x04, 0x01, 0x01, 0x6A, 0x42, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x42, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, +0x00, 0x4A, 0x41, 0xA2, 0x41, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, +0x00, 0x4A, 0x4A, 0xA2, 0x40, 0xC1, 0x41, 0xA1, 0x2A, 0x5A, 0x58, 0x67, 0x01, 0x6B, 0x6E, 0xEA, +0x62, 0x67, 0xFF, 0x6A, 0x4C, 0xEB, 0x41, 0xA1, 0x02, 0x5A, 0x58, 0x67, 0x82, 0x67, 0xFF, 0x6A, +0x8C, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x82, 0x0D, +0x00, 0x6A, 0x42, 0x10, 0x42, 0xA1, 0x28, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x48, 0x32, 0x44, 0xC1, 0x00, 0x6A, 0x43, 0xC1, 0x18, 0x10, +0x64, 0xA1, 0x43, 0xA1, 0x51, 0xE3, 0x43, 0xA1, 0x62, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x43, 0xA1, 0x01, 0x4A, 0x43, 0xC1, +0x43, 0xA1, 0x04, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xA0, 0xF0, 0x44, 0x9A, 0x01, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x5B, 0x0E, +0x0A, 0x6C, 0x00, 0x18, 0x82, 0x0D, 0x01, 0x6A, 0xB9, 0x65, 0x05, 0x97, 0x04, 0x91, 0x03, 0x63, +0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x08, 0xD1, 0x04, 0x01, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, 0x00, 0x4A, 0x41, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF1, 0x5C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, 0x07, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x40, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, 0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x2A, 0x5A, 0x58, 0x67, 0x07, 0x2A, +0x00, 0x6C, 0x00, 0x18, 0x82, 0x0D, 0x00, 0x6A, 0x62, 0x67, 0x43, 0x67, 0x6F, 0x10, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x48, 0x32, 0x61, 0x99, +0x49, 0xE3, 0x41, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, +0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, +0x44, 0x9A, 0x1B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x48, 0x9A, 0x02, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x44, 0x9A, 0x0B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x4C, 0x9A, 0x10, 0x6B, 0x60, 0xCA, 0x00, 0x6A, 0x48, 0xC1, 0x0F, 0x10, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x68, 0xA1, 0x68, 0x33, 0x81, 0x99, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x48, 0xA1, 0x01, 0x4A, 0x48, 0xC1, 0x48, 0xA1, 0x04, 0x5A, +0x58, 0x67, 0xED, 0x2A, 0x00, 0x6A, 0x40, 0xD9, 0x0D, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x20, 0xF6, 0x44, 0x9A, 0x12, 0xF0, 0x04, 0x6B, 0x6E, 0xEA, 0x0E, 0x22, 0x40, 0x99, +0x01, 0x4A, 0x40, 0xD9, 0x60, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, +0x58, 0x9A, 0x63, 0xEA, 0x58, 0x67, 0xE9, 0x22, 0x01, 0x10, 0x00, 0x65, 0xB9, 0x65, 0x05, 0x97, +0x04, 0x91, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x44, 0x67, +0x50, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x5C, 0x9A, 0x01, 0x6B, +0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF1, 0x58, 0x9A, 0x00, 0xF4, +0x05, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, 0x40, 0x9A, +0x00, 0x6B, 0x60, 0xC2, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x12, 0xF0, 0x06, 0x6B, +0x20, 0xF6, 0x64, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x48, 0x9A, +0x01, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xE0, 0xF1, +0x44, 0x9A, 0x1B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x48, 0x9A, 0x02, 0x6B, 0x6E, 0xEA, 0x10, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x48, 0x9A, 0x02, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x44, 0x9A, 0x0B, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xE0, 0xF1, 0x4C, 0x9A, 0x00, 0xF4, 0x00, 0x6B, 0x60, 0xCA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xE0, 0xF1, 0x50, 0x9A, 0x70, 0xA1, 0x60, 0xDA, 0x00, 0x6A, 0x40, 0xD9, 0x0D, 0x10, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x20, 0xF6, 0x44, 0x9A, 0x12, 0xF0, 0x04, 0x6B, +0x6E, 0xEA, 0x09, 0x22, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, 0x40, 0x99, 0xE5, 0xF7, 0x1F, 0x5A, +0x58, 0x67, 0xEE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, +0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, +0x44, 0x9A, 0x40, 0x9A, 0x41, 0xD9, 0x61, 0x99, 0x02, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x41, 0xD9, +0x00, 0x6A, 0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, 0x40, 0x99, 0x0A, 0x5A, +0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, +0x61, 0x99, 0x60, 0xDA, 0x00, 0x6A, 0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, +0x40, 0x99, 0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF2, 0x5C, 0x9A, 0x40, 0x9A, 0x41, 0xD9, 0x00, 0x6A, 0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, +0x01, 0x4A, 0x40, 0xD9, 0x40, 0x99, 0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x61, 0x99, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF2, 0x40, 0x9A, 0x6D, 0xEA, 0x41, 0xD9, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x5C, 0x9A, 0x61, 0x99, 0x60, 0xDA, 0x00, 0x6A, +0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, 0x40, 0x99, 0x32, 0x5A, 0x58, 0x67, +0xF9, 0x2A, 0x61, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF2, 0x44, 0x9A, +0x6C, 0xEA, 0x41, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x5C, 0x9A, +0x61, 0x99, 0x60, 0xDA, 0x00, 0x6A, 0x40, 0xD9, 0x03, 0x10, 0x40, 0x99, 0x01, 0x4A, 0x40, 0xD9, +0x40, 0x99, 0x32, 0x5A, 0x58, 0x67, 0xF9, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x60, 0xF2, 0x48, 0x9A, 0x40, 0x9A, 0x41, 0xD9, 0x61, 0x99, 0x01, 0x6A, 0x6D, 0xEA, 0x41, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF2, 0x48, 0x9A, 0x61, 0x99, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x40, 0x9A, 0x41, 0xD9, +0x61, 0x99, 0x01, 0x6A, 0x6D, 0xEA, 0x41, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF2, 0x44, 0x9A, 0x61, 0x99, 0x60, 0xDA, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, +0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, +0x44, 0x9A, 0x40, 0x9A, 0x40, 0xD9, 0x60, 0x99, 0x02, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x40, 0xD9, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x60, 0x99, 0x60, 0xDA, +0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x40, 0x9A, 0x40, 0xD9, 0x60, 0x99, +0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x40, 0xF2, 0x44, 0x9A, 0x60, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x60, 0xF2, 0x4C, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x60, 0xF2, 0x70, 0x9B, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF2, 0x48, 0x9A, 0x40, 0x9A, +0x40, 0xD9, 0x60, 0x99, 0x02, 0x6A, 0x6D, 0xEA, 0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x60, 0xF2, 0x48, 0x9A, 0x60, 0x99, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x60, 0xF2, 0x4C, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x60, 0xF2, +0x74, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, +0x40, 0x9A, 0x40, 0xD9, 0x60, 0x99, 0x02, 0x6A, 0x6D, 0xEA, 0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x60, 0x99, 0x60, 0xDA, 0xB9, 0x65, 0x03, 0x91, +0x02, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x03, 0xD1, 0x3D, 0x67, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, 0x40, 0x9A, 0x40, 0xD9, 0x60, 0x99, 0x03, 0x6A, 0x4B, 0xEA, +0x6C, 0xEA, 0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF2, 0x44, 0x9A, +0x60, 0x99, 0x60, 0xDA, 0xB9, 0x65, 0x03, 0x91, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0xD1, +0x3D, 0x67, 0x64, 0x67, 0x45, 0x67, 0x20, 0xF0, 0x60, 0xC1, 0x20, 0xF0, 0x44, 0xC1, 0x00, 0x6A, +0x43, 0xD9, 0x00, 0x6A, 0x48, 0xC1, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, +0x50, 0x9A, 0x40, 0x9A, 0x40, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, +0x50, 0x9A, 0x00, 0x6B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF0, +0x00, 0x4A, 0x41, 0xD9, 0x48, 0xA1, 0x45, 0xD9, 0x20, 0xF0, 0x40, 0xA1, 0x04, 0x6B, 0x6E, 0xEA, +0x20, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x50, 0xA2, 0x62, 0x67, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x44, 0xAA, 0x6E, 0xEA, +0xA0, 0xF1, 0x1D, 0x22, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, +0x64, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x70, 0xC2, 0x00, 0x6A, 0x43, 0xD9, 0x0E, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x60, 0xF2, 0x58, 0x9A, 0x40, 0x9A, 0x45, 0xD9, 0x65, 0x99, 0xFF, 0x6A, 0x6C, 0xEA, 0x40, 0x6B, +0x6E, 0xEA, 0x13, 0x22, 0x63, 0x99, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x60, 0xF2, +0x5C, 0x9A, 0x63, 0xEA, 0x58, 0x67, 0x01, 0x6B, 0x6E, 0xEA, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, +0x63, 0x99, 0x01, 0x4B, 0x63, 0xD9, 0xE0, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x48, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, +0x60, 0xF2, 0x78, 0x9B, 0x60, 0x9B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF2, 0x40, 0x9A, 0x61, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x40, 0x9A, 0x80, 0x6B, +0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, 0xC0, 0xF2, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, 0x40, 0x9A, 0x10, 0xF0, +0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, 0x60, 0x9B, 0x60, 0x34, 0x10, 0xF0, 0x10, 0x6B, +0x60, 0x33, 0x60, 0x33, 0x80, 0xF2, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0xDA, 0x01, 0x6A, 0x48, 0xC1, +0x20, 0xF0, 0x40, 0xA1, 0x01, 0x6B, 0x4E, 0xEB, 0x39, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, +0x0A, 0x22, 0xFE, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x80, 0xF0, 0x0E, 0x23, 0x04, 0x6B, 0x6E, 0xEA, +0xA0, 0xF0, 0x0A, 0x22, 0xF5, 0x10, 0x20, 0xF0, 0x44, 0xA1, 0x45, 0xD9, 0x45, 0x99, 0x40, 0x32, +0x40, 0x32, 0x00, 0xF5, 0x00, 0x4A, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF2, 0x40, 0x9A, 0x65, 0x99, 0x60, 0xDA, 0x00, 0x6A, 0x44, 0xD9, 0x12, 0x10, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, 0x40, 0x9A, 0x20, 0xF0, 0x84, 0xA1, 0x64, 0x99, +0x6D, 0xE4, 0x68, 0x33, 0x81, 0x99, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x44, 0x99, 0x01, 0x4A, +0x44, 0xD9, 0x44, 0x99, 0x04, 0x5A, 0x58, 0x67, 0xEA, 0x2A, 0xCA, 0x10, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x41, 0xA2, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x40, 0x9A, 0x61, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF2, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x40, 0x9A, 0x80, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x00, 0x6B, 0xC0, 0xF2, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, +0x40, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, 0x60, 0x9B, 0x60, 0x34, +0x65, 0x99, 0x60, 0x33, 0x60, 0x33, 0x6D, 0xE4, 0x41, 0x4B, 0x60, 0xDA, 0x00, 0x6A, 0x45, 0xD9, +0x00, 0x6A, 0x44, 0xD9, 0x14, 0x10, 0x45, 0x99, 0x40, 0x32, 0x45, 0xD9, 0x05, 0x6B, 0x44, 0x99, +0x4F, 0xE3, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x40, 0xF6, 0x00, 0x4A, 0x49, 0xE3, +0x40, 0xA2, 0x65, 0x99, 0x49, 0xE3, 0x45, 0xD9, 0x44, 0x99, 0x01, 0x4A, 0x44, 0xD9, 0x44, 0x99, +0x04, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, +0x40, 0x9A, 0x65, 0x99, 0x60, 0xDA, 0x6C, 0x10, 0x20, 0xF0, 0x44, 0xA1, 0x45, 0xD9, 0x45, 0x99, +0x40, 0x32, 0x40, 0x32, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, +0x40, 0x9A, 0x85, 0x99, 0x00, 0xF2, 0x02, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, 0x40, 0x9A, 0x20, 0xF0, 0x64, 0xA1, 0x68, 0x33, 0x81, 0x99, +0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x4C, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0xC0, 0xF2, 0x40, 0x9A, 0x61, 0x42, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x40, 0x9A, 0x80, 0x6B, +0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, 0xC0, 0xF2, +0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF6, 0x0C, 0x4A, 0x44, 0xAA, +0x01, 0x6B, 0x6E, 0xEA, 0x16, 0x2A, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, +0x40, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, 0x60, 0x9B, 0x60, 0x34, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x80, 0xF2, 0x68, 0x9B, 0x6D, 0xE4, 0x60, 0xDA, +0x0F, 0x10, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, 0x40, 0x9A, 0x10, 0xF0, +0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, 0x60, 0x9B, 0x60, 0x33, 0x24, 0x4B, 0x60, 0xDA, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x40, 0x9A, 0x61, 0x42, 0x10, 0xF0, +0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xC0, 0xF2, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0xC0, 0xF2, 0x40, 0x9A, 0x80, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x00, 0x6B, 0xC0, 0xF2, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, +0x40, 0x32, 0x80, 0xF2, 0x40, 0x9A, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xC0, 0xF2, +0x60, 0x9B, 0x60, 0x33, 0x25, 0x4B, 0x60, 0xDA, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF2, 0x4C, 0x9A, 0x40, 0x9A, 0x45, 0xD9, 0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, +0x80, 0xF2, 0x4C, 0x9A, 0x85, 0x99, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x01, 0x10, 0x00, 0x65, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0x00, 0xF2, 0x50, 0x9A, 0x60, 0x99, 0x60, 0xDA, +0xB9, 0x65, 0x07, 0x91, 0x04, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0xD1, 0x3D, 0x67, 0x86, 0xD9, +0xA7, 0xD9, 0x00, 0x6A, 0x41, 0xD9, 0x41, 0x99, 0x42, 0xD9, 0x46, 0x99, 0x43, 0xD9, 0x34, 0x10, +0x41, 0xA1, 0x30, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x41, 0xA1, 0x3A, 0x5A, 0x58, 0x67, 0x04, 0x22, +0x41, 0xA1, 0xD0, 0x4A, 0x40, 0xC1, 0x1A, 0x10, 0x41, 0xA1, 0x61, 0x5A, 0x58, 0x67, 0x08, 0x2A, +0x41, 0xA1, 0x67, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x41, 0xA1, 0xA9, 0x4A, 0x40, 0xC1, 0x0E, 0x10, +0x41, 0xA1, 0x41, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x41, 0xA1, 0x47, 0x5A, 0x58, 0x67, 0x04, 0x22, +0x41, 0xA1, 0xC9, 0x4A, 0x40, 0xC1, 0x02, 0x10, 0x00, 0x6A, 0x1F, 0x10, 0x41, 0x99, 0x50, 0x33, +0x40, 0xA1, 0x49, 0xE3, 0x42, 0xD9, 0x62, 0x99, 0x41, 0x99, 0x43, 0xEB, 0x58, 0x67, 0x02, 0x22, +0x00, 0x6A, 0x13, 0x10, 0x42, 0x99, 0x41, 0xD9, 0x43, 0x99, 0x40, 0xA2, 0x41, 0xC1, 0x00, 0x6A, +0x61, 0xA1, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x63, 0x99, 0x01, 0x4B, 0x63, 0xD9, +0xBF, 0x2A, 0x47, 0x99, 0x61, 0x99, 0x60, 0xDA, 0x01, 0x6A, 0xB9, 0x65, 0x05, 0x91, 0x03, 0x63, +0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, 0x18, 0xD1, 0x04, 0x01, 0x96, 0xD9, 0xB7, 0xD9, +0xD8, 0xD9, 0x56, 0x99, 0x4B, 0xD9, 0xB5, 0x11, 0x57, 0x99, 0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, +0x10, 0x22, 0x56, 0x99, 0x08, 0x22, 0x57, 0x99, 0x60, 0x82, 0x4B, 0x99, 0x60, 0xC2, 0x4B, 0x99, +0x01, 0x4A, 0x4B, 0xD9, 0xA3, 0x11, 0x57, 0x99, 0x40, 0x82, 0x82, 0x67, 0x00, 0x18, 0xAD, 0x02, +0x9D, 0x11, 0x57, 0x99, 0x01, 0x4A, 0x57, 0xD9, 0x57, 0x99, 0x40, 0x82, 0x73, 0x6B, 0x6E, 0xEA, +0x1D, 0x2A, 0x58, 0x99, 0x40, 0x9A, 0x4C, 0xD9, 0x58, 0x99, 0x04, 0x4A, 0x58, 0xD9, 0x12, 0x10, +0x56, 0x99, 0x08, 0x22, 0x4C, 0x99, 0x60, 0x82, 0x4B, 0x99, 0x60, 0xC2, 0x4B, 0x99, 0x01, 0x4A, +0x4B, 0xD9, 0x05, 0x10, 0x4C, 0x99, 0x40, 0x82, 0x82, 0x67, 0x00, 0x18, 0xAD, 0x02, 0x4C, 0x99, +0x01, 0x4A, 0x4C, 0xD9, 0x4C, 0x99, 0x40, 0x82, 0xEB, 0x2A, 0x78, 0x11, 0x47, 0x41, 0x2D, 0x4A, +0x4A, 0xD9, 0x00, 0x6A, 0x49, 0xD9, 0x04, 0x6A, 0x48, 0xD9, 0x57, 0x99, 0x40, 0x82, 0x23, 0x6B, +0x6E, 0xEA, 0x05, 0x2A, 0x01, 0x6A, 0x49, 0xD9, 0x57, 0x99, 0x01, 0x4A, 0x57, 0xD9, 0x57, 0x99, +0x40, 0x82, 0x68, 0x6B, 0x6E, 0xEA, 0x05, 0x2A, 0x0C, 0x6A, 0x48, 0xD9, 0x57, 0x99, 0x01, 0x4A, +0x57, 0xD9, 0x57, 0x99, 0x40, 0x82, 0x68, 0x6B, 0x6E, 0xEA, 0x05, 0x2A, 0x04, 0x6A, 0x48, 0xD9, +0x57, 0x99, 0x01, 0x4A, 0x57, 0xD9, 0x57, 0x99, 0x60, 0x82, 0x20, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x78, 0x6B, 0x6E, 0xEA, 0x4F, 0x2A, 0x58, 0x99, 0x47, 0xD9, +0x47, 0x99, 0x40, 0x9A, 0x46, 0xD9, 0x47, 0x99, 0x04, 0x4A, 0x47, 0xD9, 0x57, 0x99, 0x60, 0x82, +0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x45, 0xD9, 0x47, 0x99, 0x58, 0xD9, +0x49, 0x99, 0x36, 0x22, 0x4A, 0x99, 0x30, 0x6B, 0x60, 0xC2, 0x4A, 0x99, 0x01, 0x4A, 0x4A, 0xD9, +0x45, 0x99, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x4A, 0x99, 0x60, 0xC2, 0x4A, 0x99, 0x01, 0x4A, 0x4A, 0xD9, +0x1F, 0x10, 0x66, 0x99, 0x48, 0x99, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x10, 0xF0, 0x10, 0x6A, +0x40, 0x32, 0x40, 0x32, 0x80, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x45, 0x99, 0x00, 0xF6, +0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, +0x4A, 0x99, 0x60, 0xC2, 0x4A, 0x99, 0x01, 0x4A, 0x4A, 0xD9, 0x48, 0x99, 0xFC, 0x4A, 0x48, 0xD9, +0x48, 0x99, 0x00, 0x52, 0x58, 0x67, 0xDD, 0x22, 0xDE, 0x10, 0x57, 0x99, 0x40, 0x82, 0x64, 0x6B, +0x6E, 0xEA, 0x62, 0x2A, 0x58, 0x99, 0x40, 0x9A, 0x44, 0xD9, 0x58, 0x99, 0x04, 0x4A, 0x58, 0xD9, +0x44, 0x99, 0x00, 0x52, 0x58, 0x67, 0x09, 0x22, 0x4A, 0x99, 0x2D, 0x6B, 0x60, 0xC2, 0x4A, 0x99, +0x01, 0x4A, 0x4A, 0xD9, 0x44, 0x99, 0x4B, 0xEA, 0x44, 0xD9, 0x4A, 0x99, 0x4C, 0xD9, 0x64, 0x99, +0x10, 0xF0, 0x10, 0x6A, 0x40, 0x32, 0x40, 0x32, 0xA0, 0xF2, 0x50, 0x9A, 0x58, 0xEB, 0x10, 0xEA, +0x4B, 0x34, 0xC0, 0xF7, 0x63, 0x32, 0x4B, 0xE4, 0x44, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x4B, 0xE3, +0xFF, 0x6B, 0x6C, 0xEA, 0x67, 0x42, 0x29, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, +0x00, 0xF6, 0x63, 0x33, 0x4A, 0x99, 0x60, 0xC2, 0x4A, 0x99, 0x01, 0x4A, 0x4A, 0xD9, 0x44, 0x99, +0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0xA0, 0xF2, 0x70, 0x9B, 0x78, 0xEA, 0x10, 0xEB, +0x6B, 0x33, 0xC0, 0xF7, 0x43, 0x32, 0x4B, 0xE3, 0x44, 0xD9, 0x44, 0x99, 0xD0, 0x2A, 0x4A, 0x99, +0x43, 0xD9, 0x11, 0x10, 0x43, 0x99, 0x40, 0x82, 0x44, 0xD9, 0x4C, 0x99, 0x60, 0x82, 0x43, 0x99, +0x60, 0xC2, 0x44, 0x99, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x4C, 0x99, 0x60, 0xC2, +0x4C, 0x99, 0x01, 0x4A, 0x4C, 0xD9, 0x43, 0x99, 0xFF, 0x4A, 0x43, 0xD9, 0x63, 0x99, 0x4C, 0x99, +0x63, 0xEA, 0x58, 0x67, 0xE7, 0x2A, 0x77, 0x10, 0x57, 0x99, 0x40, 0x82, 0x40, 0x6B, 0x6E, 0xEA, +0x2C, 0x2A, 0x58, 0x99, 0x41, 0xD9, 0x41, 0x99, 0x40, 0x9A, 0x52, 0xD9, 0x41, 0x99, 0x04, 0x4A, +0x41, 0xD9, 0x41, 0x99, 0x58, 0xD9, 0x47, 0x41, 0x41, 0x4A, 0x42, 0xD9, 0x13, 0x10, 0x42, 0x99, +0x40, 0xA2, 0x8A, 0x99, 0x10, 0xF0, 0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x80, 0xF2, 0x10, 0x4B, +0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x7C, 0x10, 0x6A, 0x99, 0x49, 0xE3, 0x4A, 0xD9, 0x42, 0x99, +0x01, 0x4A, 0x42, 0xD9, 0x47, 0x41, 0x41, 0x4A, 0x64, 0x42, 0x42, 0x99, 0x63, 0xEA, 0x58, 0x67, +0xE6, 0x2A, 0x4A, 0x99, 0xFF, 0x4A, 0x4A, 0xD9, 0x46, 0x10, 0x57, 0x99, 0x40, 0x82, 0x21, 0x6B, +0x6E, 0xEA, 0x26, 0x2A, 0x58, 0x99, 0x40, 0x9A, 0x4C, 0xD9, 0x58, 0x99, 0x04, 0x4A, 0x58, 0xD9, +0x4C, 0x99, 0x06, 0x4A, 0x40, 0xD9, 0x13, 0x10, 0x4C, 0x99, 0x40, 0x82, 0x8A, 0x99, 0x10, 0xF0, +0x10, 0x6B, 0x60, 0x33, 0x60, 0x33, 0x80, 0xF2, 0x14, 0x4B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0x7C, 0x10, 0x6A, 0x99, 0x49, 0xE3, 0x4A, 0xD9, 0x4C, 0x99, 0x01, 0x4A, 0x4C, 0xD9, 0x6C, 0x99, +0x40, 0x99, 0x43, 0xEB, 0x58, 0x67, 0xE8, 0x2A, 0x4A, 0x99, 0xFF, 0x4A, 0x4A, 0xD9, 0x1B, 0x10, +0x57, 0x99, 0x40, 0x82, 0x63, 0x6B, 0x6E, 0xEA, 0x0F, 0x2A, 0x58, 0x99, 0x40, 0x9A, 0x00, 0xF6, +0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x4A, 0x99, 0x60, 0xC2, 0x4A, 0x99, 0x01, 0x4A, 0x4A, 0xD9, +0x58, 0x99, 0x04, 0x4A, 0x58, 0xD9, 0x07, 0x10, 0x57, 0x99, 0x60, 0x82, 0x4A, 0x99, 0x60, 0xC2, +0x4A, 0x99, 0x01, 0x4A, 0x4A, 0xD9, 0x47, 0x41, 0x2D, 0x4A, 0x4C, 0xD9, 0x12, 0x10, 0x56, 0x99, +0x08, 0x22, 0x4C, 0x99, 0x60, 0x82, 0x4B, 0x99, 0x60, 0xC2, 0x4B, 0x99, 0x01, 0x4A, 0x4B, 0xD9, +0x05, 0x10, 0x4C, 0x99, 0x40, 0x82, 0x82, 0x67, 0x00, 0x18, 0xAD, 0x02, 0x4C, 0x99, 0x01, 0x4A, +0x4C, 0xD9, 0x6C, 0x99, 0x4A, 0x99, 0x43, 0xEB, 0x58, 0x67, 0xE9, 0x2A, 0x57, 0x99, 0x01, 0x4A, +0x57, 0xD9, 0x57, 0x99, 0x40, 0x82, 0x5F, 0xF6, 0x07, 0x2A, 0x56, 0x99, 0x03, 0x22, 0x4B, 0x99, +0x00, 0x6B, 0x60, 0xC2, 0x6B, 0x99, 0x56, 0x99, 0x4B, 0xE3, 0xB9, 0x65, 0x15, 0x97, 0x14, 0x91, +0x0B, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x04, 0xD1, 0x04, 0x01, 0xA3, 0xD9, 0xC4, 0xD9, +0xE5, 0xD9, 0x82, 0xD9, 0x62, 0x99, 0x47, 0x41, 0x01, 0x4A, 0x04, 0x4A, 0x00, 0x6C, 0xA3, 0x67, +0xC2, 0x67, 0x00, 0x18, 0x89, 0x0F, 0xB9, 0x65, 0x01, 0x97, 0x00, 0x91, 0x01, 0x63, 0x00, 0xEF, +0xFD, 0x63, 0x05, 0x62, 0x04, 0xD1, 0x04, 0x01, 0x82, 0xD9, 0xC4, 0xD9, 0xE5, 0xD9, 0xA3, 0xD9, +0x63, 0x99, 0x47, 0x41, 0x05, 0x4A, 0x04, 0x4A, 0x82, 0x99, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, +0x89, 0x0F, 0xB9, 0x65, 0x01, 0x97, 0x00, 0x91, 0x01, 0x63, 0x00, 0xEF, +}; + + +u8 NFCFWDMEM[]={ +0x58, 0x53, 0x9B, 0x18, 0x22, 0xB6, 0x28, 0x80, 0x3C, 0x48, 0x00, 0x00, 0xE1, 0x11, 0x12, 0x00, +0x01, 0x03, 0xA0, 0x10, 0x44, 0x03, 0x00, 0xFE, 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, +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, 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, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x93, 0x84, 0x00, 0x00, 0x9F, +0x08, 0x10, 0x00, 0x90, 0x1C, 0x10, 0x00, 0x90, 0x60, 0x20, 0x00, 0x90, 0x48, 0x20, 0x00, 0x90, +0x04, 0x20, 0x00, 0x90, 0x00, 0x20, 0x00, 0x90, 0x54, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0x0F, 0x00, +0x50, 0x00, 0x00, 0x94, 0x74, 0x00, 0x00, 0x94, 0x70, 0x01, 0x00, 0x94, 0x58, 0x00, 0x00, 0x94, +0xFF, 0xAF, 0x0E, 0x00, 0x1C, 0x04, 0x00, 0x94, 0x5C, 0x00, 0x00, 0x94, 0x08, 0x08, 0x00, 0x94, +0xFF, 0xFF, 0xFE, 0xFF, 0x6C, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0x03, 0xFC, 0x00, 0x00, 0x34, 0x00, +0x00, 0x00, 0x00, 0x20, 0x04, 0x04, 0x00, 0x94, 0x70, 0x00, 0x00, 0x94, 0x28, 0x00, 0x00, 0x94, +0x04, 0x00, 0x00, 0x90, 0x0C, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x90, 0x14, 0x00, 0x00, 0x90, +0x10, 0x10, 0x00, 0x90, 0x0C, 0x10, 0x00, 0x90, 0x24, 0x10, 0x00, 0x90, 0x20, 0x10, 0x00, 0x90, +0x54, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x9F, 0x0C, 0x00, 0x00, 0x9F, +0xFC, 0x00, 0x00, 0x9F, 0x64, 0x00, 0x00, 0x9F, 0x60, 0x00, 0x00, 0x9F, 0x7C, 0x00, 0x00, 0x90, +0x2C, 0x00, 0x00, 0x94, 0x14, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0xFE, 0x20, 0x01, 0x00, 0x94, +0x24, 0x01, 0x00, 0x94, 0x22, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x93, 0x10, 0x00, 0x00, 0x93, +0x0C, 0x00, 0x00, 0x94, 0x0A, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x93, +0x00, 0x10, 0x00, 0x90, 0x14, 0x10, 0x00, 0x90, 0xC4, 0x01, 0x64, 0xB8, 0x68, 0x65, 0x6C, 0x6C, +0x6F, 0x0A, 0x00, 0x00, 0x6F, 0x26, 0x00, 0x80, 0x9F, 0x26, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, +0x27, 0x27, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, +0x79, 0x28, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, 0x79, 0x28, 0x00, 0x80, +0x79, 0x28, 0x00, 0x80, 0xCF, 0x27, 0x00, 0x80, 0x4D, 0x26, 0x00, 0x80, 0x14, 0x00, 0x00, 0x9F, +0x12, 0x00, 0x00, 0x93, 0x14, 0x00, 0x00, 0x93, 0x16, 0x00, 0x00, 0x93, 0x10, 0x00, 0x00, 0x93, +0x26, 0x00, 0x00, 0x93, 0x5C, 0x00, 0x00, 0x94, 0x0C, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0x93, +0x0C, 0x00, 0x00, 0x93, 0x20, 0x00, 0x00, 0x9F, 0x00, 0x00, 0x34, 0x12, 0x01, 0x00, 0x34, 0x12, +0x22, 0x00, 0x00, 0x93, 0x18, 0x00, 0x00, 0x93, 0xFC, 0x00, 0x00, 0x9F, 0x80, 0x00, 0x00, 0x9F, +0x84, 0x00, 0x00, 0x9F, 0x0C, 0x00, 0x00, 0x9F, 0x03, 0x01, 0xD0, 0x00, 0x50, 0x00, 0x00, 0x9F, +0xF2, 0x00, 0x00, 0xA0, 0x08, 0x00, 0x00, 0x9F, 0x10, 0x00, 0x00, 0x9F, 0x02, 0x01, 0x70, 0x00, +0x01, 0x01, 0x70, 0x00, 0x88, 0x00, 0x00, 0x9F, 0x6C, 0xB0, 0x6C, 0xB0, 0x24, 0x01, 0x00, 0x94, +0x00, 0x00, 0x20, 0x00, 0x2C, 0x00, 0x00, 0x94, 0x28, 0x00, 0x00, 0x94, 0x68, 0x01, 0x00, 0x94, +0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0xFF, 0x02, 0x00, 0x6C, 0x00, 0x00, 0x94, +0x00, 0x00, 0x02, 0x00, 0xFF, 0xFF, 0xFD, 0xFF, 0x20, 0x01, 0x00, 0x94, 0x70, 0x00, 0x00, 0x94, +0x00, 0xD0, 0x80, 0x3D, 0x00, 0x90, 0x80, 0x3D, 0x5C, 0x00, 0x00, 0x9F, 0xFF, 0xFF, 0xFF, 0x00, +0x58, 0x00, 0x00, 0x9F, 0x25, 0x00, 0x01, 0x00, 0x24, 0x00, 0x01, 0x00, 0x68, 0x00, 0x00, 0x9F, +0x25, 0x64, 0x2E, 0x00, 0x25, 0x68, 0x68, 0x58, 0x3A, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, +0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, +0x67, 0x66, 0x66, 0x66, +}; + + +//NFC_ADAPTER NFCAdapter; +IRQ_FUN LpPeriIrqFunTable[32]; +u32 LpPeriIrqDataTable[32]; + +VOID +WriteA2NMailbox( + IN VOID *pNFCAdapte +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER) pNFCAdapte; + u8 i = 0; + u32 RegTemp; + + if (!(pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQRIdx].Response)) { + pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQRIdx].Content[0] = + (pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQRIdx].Content[0]|(pNFCAdp->A2NSeq << 8)); + pNFCAdp->A2NSeq++; + } + + for(i = 0; i < pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQRIdx].Length; i++) { + HalDelayUs(30); + HAL_WRITE32(NFC_INTERFACE_BASE, 0x10, pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQRIdx].Content[i]); + } + + HalDelayUs(30); + RegTemp = HAL_READ32(NFC_INTERFACE_BASE,0x24)|BIT1; + HAL_WRITE32(NFC_INTERFACE_BASE, 0x24, RegTemp); + + RegTemp = (HAL_READ32(NFC_INTERFACE_BASE,0x24)&(~BIT1)); + HAL_WRITE32(NFC_INTERFACE_BASE, 0x24, RegTemp); +} + +VOID +A2NWriteInQueue( + IN VOID *pNFCAdapte, + IN VOID *pBuff +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER) pNFCAdapte; + PA2N_MAILBOX_Q pA2NWData = (PA2N_MAILBOX_Q) pBuff; + u8 Idx; + + //Q full handle + if ((pNFCAdp->A2NWQWIdx == (pNFCAdp->A2NWQRIdx - 1))|| + ((pNFCAdp->A2NWQRIdx == 0)&&(pNFCAdp->A2NWQWIdx == N2A_Q_LENGTH - 1))){ + + DBG_8195A("A2N write Mailbox Queue full !!\n"); + } + + for (Idx = 0; Idx < pA2NWData->Length; Idx++) { + pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQWIdx].Content[Idx] = pA2NWData->Content[Idx]; + } + + pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQWIdx].Length = pA2NWData->Length; + pNFCAdp->A2NMAILQ[pNFCAdp->A2NWQWIdx].Response = pA2NWData->Response; + pNFCAdp->A2NWQWIdx++; + + if (pNFCAdp->A2NWQWIdx == N2A_Q_LENGTH){ + pNFCAdp->A2NWQWIdx = 0; + } + + //check qu and enable task + if (pNFCAdp->A2NWQWIdx != pNFCAdp->A2NWQRIdx){ + pNFCAdp->A2NWMailBox = TRUE; + RtlUpSema(&(pNFCAdp->VeriSema)); + } + + + #if 0 + { + u8 i = 0; + u8 j = 0; + DBG_8195A("A2N idx = 0x%x \n", pNFCAdp->A2NWMailBox); + DBG_8195A("A2N write R idx = 0x%x \n", pNFCAdp->A2NWQRIdx); + DBG_8195A("A2N write W idx = 0x%x \n", pNFCAdp->A2NWQWIdx); + + for(i = 0;iA2NWQWIdx;i++) { + + DBG_8195A("A2N write queue %d, length = 0x%x \n", i, pNFCAdp->A2NMAILQ[i].Length); + DBG_8195A("A2N write queue %d, response = 0x%x \n", i, pNFCAdp->A2NMAILQ[i].Response); + for(j = 0;j < 5; j++) { + DBG_8195A("A2N write queue %d, data = 0x%x \n", i, pNFCAdp->A2NMAILQ[i].Content[j]); + } + } + } + #endif +} + +VOID +A2NWriteDeQueue( + IN VOID *pNFCAdapte +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER) pNFCAdapte; + u32 TimeIdx = 0; + + while(((HAL_READ32(NFC_INTERFACE_BASE, 0x14)>>1) & 0xf)!= 0){ + DBG_8195A("A2N Mailbox W MISC 0x%08x\n", ((HAL_READ32(NFC_INTERFACE_BASE, 0x14)>>1) & 0xf)); + HalDelayUs(30); + TimeIdx++; + if (TimeIdx > 10000){ + + DBG_8195A("A2N Mailbox write timeout\n"); + + //check qu and enable task + if (pNFCAdp->A2NWQWIdx != pNFCAdp->A2NWQRIdx){ + pNFCAdp->A2NWMailBox = TRUE; + RtlUpSema(&(pNFCAdp->VeriSema)); + } + return; + } + }; + + WriteA2NMailbox(pNFCAdapte); + + pNFCAdp->A2NWQRIdx++; + if (pNFCAdp->A2NWQRIdx == N2A_Q_LENGTH) { + pNFCAdp->A2NWQRIdx = 0; + } + + //check qu and enable task + if (pNFCAdp->A2NWQWIdx != pNFCAdp->A2NWQRIdx){ + pNFCAdp->A2NWMailBox = TRUE; + RtlUpSema(&(pNFCAdp->VeriSema)); + } + else { + pNFCAdp->A2NWMailBox = FALSE; + } +} + + +//cmd 0 +VOID +N2AReadTag( + IN VOID *pNFCAdapte, + IN u8 N2ARPage +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + + nfc_tagread_callback (pNFCAdp, N2ARPage); +} + +VOID +A2NWriteCatch( + IN VOID *pNFCAdapte, + IN u8 N2AWPage, + IN u8 Length, + IN u32 *WData +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + u8 Idx; + A2N_MAILBOX_Q DataTemp; + + DataTemp.Length = Length+1; + DataTemp.Response = 0; + DataTemp.Content[0] = (CATCH_WRITE|(DataTemp.Length<<5)|(N2AWPage<<16)); + for (Idx = 0; Idx < Length; Idx++) { + DataTemp.Content[Idx+1] = WData[Idx]; + } + A2NWriteInQueue(pNFCAdp, &DataTemp); +} + + +VOID +A2NReadCatch( + IN VOID *pNFCAdapte, + IN u8 A2NRPage +) +{ + A2N_MAILBOX_Q DataTemp; + + DataTemp.Length = 1; + DataTemp.Response = 0; + DataTemp.Content[0] = (CATCH_READ|(DataTemp.Length<<5)|(A2NRPage<<16)); + + A2NWriteInQueue((PNFC_ADAPTER)pNFCAdapte, &DataTemp); +} + +//cmd 1 +VOID +N2AWriteTag( + IN VOID *pNFCAdapte, + IN u8 N2AWPage +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + u32 wr_data; + + wr_data = HAL_READ32(NFC_INTERFACE_BASE, 0x18); + nfc_tagwrite_callback(pNFCAdp, N2AWPage, wr_data); +} + + +//cmd 3 +VOID +N2AReadCatch( + IN VOID *pNFCAdapte, + IN u8 N2ACatchRPage +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + u32 TagBuf[4]; + + TagBuf[0] = HAL_READ32(NFC_INTERFACE_BASE, 0x18); + TagBuf[1] = HAL_READ32(NFC_INTERFACE_BASE, 0x18); + TagBuf[2] = HAL_READ32(NFC_INTERFACE_BASE, 0x18); + TagBuf[3] = HAL_READ32(NFC_INTERFACE_BASE, 0x18); + + nfc_cache_read_callback(pNFCAdp, N2ACatchRPage, TagBuf); +} + +//cmd 4 +VOID +NFCReaderPresent( + IN VOID *pNFCAdapte, + IN u8 State +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + + if (State) { + DBG_8195A("NFC Reader Present\n"); + + //call app + nfc_event_callback(pNFCAdp, NFC_HAL_READER_PRESENT); + } +} + + +//cmd 5 +VOID +N2AMailboxState( + IN VOID *pNFCAdapte, + IN u8 State, + IN u8 Seq +) +{ + A2N_MAILBOX_Q MailData; + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + + pNFCAdp->N2ABoxOpen = State; + DBG_8195A("N2A Mailbox State = %d\n", pNFCAdp->N2ABoxOpen); + + if (State) { + MailData.Length = 1; + MailData.Response = 1; + MailData.Content[0] = (CONFIRM_N2A_BOX_STATE)|(0x1<<5)|((Seq|BIT7)<<8)|(ON<<16); + //WriteA2NMailbox(1, &MailData, 1); + A2NWriteInQueue(pNFCAdp, &MailData); + } +} + + +//cmd 6 +VOID +NFC25MClkReq( + IN VOID *pNFCAdapte, + IN u8 OP, + IN u8 Seq +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + A2N_MAILBOX_Q MailData; + u32 RegTemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1); + if (OP) { + RegTemp = ((RegTemp & 0xFFFFC7FF)|(BIT_SYS_SYSPLL_CKSDR_EN|BIT_SYS_SYSPLL_CKSDR_DIV(2))); + } + else { + RegTemp = RegTemp & 0xFFFFC7FF; + } + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, RegTemp); + + //write mailbox + MailData.Length = 1; + MailData.Response = 1; + MailData.Content[0] = (EXT_CLK_RSP)|(0x1<<5)|((Seq|BIT7)<<8)|(ON<<16); + //WriteA2NMailbox(pNFCAdp, &MailData); + A2NWriteInQueue(pNFCAdp, &MailData); +} + + +VOID +NFCRoutine( + IN VOID *pNFCAdapte +) +{ + u32 N2ARData, N2AMISC; + u8 N2ARB2; + u8 Seq; + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + + //N2A MEM DATA + if (pNFCAdp->NFCIsr & (BIT0|BIT6)) { + pNFCAdp->NFCIsr &= ~(BIT6|BIT0); + + N2AMISC = ((HAL_READ32(NFC_INTERFACE_BASE, 0x1c)>>1)&0xf); + //DBG_8195A("NFC 0x1C = 0x%x \n", N2AMISC); + while (N2AMISC != 0){ + + N2ARData = HAL_READ32(NFC_INTERFACE_BASE, 0x18); + N2ARB2 = ((u8)(N2ARData>>16)); + Seq = (u8)(N2ARData>>8); + //DBG_8195A("NFC 0x18 = 0x%x \n", N2ARData); + + switch(N2ARData & 0x1F) { + case TAG_READ: + //get data + N2AReadTag(pNFCAdapte, N2ARB2); + //call app + + break; + case TAG_WRITE: + //get data + N2AWriteTag(pNFCAdapte, N2ARB2); + //call app + + break; + case CATCH_READ_DATA: + //get data + N2AReadCatch(pNFCAdapte, N2ARB2); + //call app + + break; + case NFC_R_PRESENT: + NFCReaderPresent(pNFCAdapte, N2ARB2); + break; + case N2A_MAILBOX_STATE: + N2AMailboxState(pNFCAdapte, N2ARB2, Seq); + break; + case EXT_CLK_REQ: + NFC25MClkReq(pNFCAdapte, N2ARB2, Seq); + break; + default: + break; + } + + N2AMISC = ((HAL_READ32(NFC_INTERFACE_BASE, 0x1c)>>1)&0xf); + } + } + + if(pNFCAdp->A2NWMailBox){ + A2NWriteDeQueue(pNFCAdp); + } + //enable int + //A2NWRITE32(0x68, 0xff00); +} + + +VOID +NFCTaskHandle( + IN VOID *pNFCAdapte +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + + #if !TASK_SCHEDULER_DISABLED//#if !TASK_SCHEDULER_DISABLED(>>) + for (;;)//start of for(;;) + { + //4 waiting for start command + RtlDownSema(&(pNFCAdp->VeriSema)); + + if (pNFCAdp->TaskStop) { + break; // task stopping, break the for loop + } + NFCRoutine(pNFCAdapte); + + }//end of for(;;) + + pNFCAdp->TaskStop = 0; +#if ( INCLUDE_vTaskDelete == 1 ) + vTaskDelete(NULL); +#endif + #endif +} + +VOID +LPIrqHandle( + IN VOID *pNFCAdapte +) +{ + u32 LpIrqStatus, CheckIndex, ExactIrqStatus, TableIndex; + + //DBG_8195A("Enter ISR\n"); + + LpIrqStatus = HAL_READ32(VENDOR_REG_BASE, LP_PERI_EXT_IRQ_STATUS); + + //Save exact IRQ status + ExactIrqStatus = LpIrqStatus & + HAL_READ32(VENDOR_REG_BASE, LP_PERI_EXT_IRQ_EN); + + //Check exact IRQ function + for(CheckIndex = 0;CheckIndex<32;CheckIndex++) { + if (ExactIrqStatus & BIT_(CheckIndex)) { + TableIndex = CheckIndex; + LpPeriIrqFunTable[TableIndex]((VOID *)(LpPeriIrqDataTable[TableIndex])); + } + } + + //Clear sub-rout IRQ + HAL_WRITE32(VENDOR_REG_BASE, LP_PERI_EXT_IRQ_STATUS, LpIrqStatus); + +} + +VOID +NFCIrqHandle( + IN VOID *pNFCAdapte +) +{ + PNFC_ADAPTER pNFCAdp = (PNFC_ADAPTER)pNFCAdapte; + u32 ISR = HalNFCRead32(0x68); + pNFCAdp->NFCIsr = (((u8)((ISR&0xbf00)>>8))&((u8)ISR)); + //DBG_8195A("A2N 0x68 = 0x%x\n", ISR); + + //stop int + //ISR = ISR&0xff; + + HalNFCWrite32(0x68, ISR); + + //DBG_8195A("After clean ISR A2N 0x68 = 0x%x\n", A2NREAD32(0x68)); + RtlUpSema(&(pNFCAdp->VeriSema)); +} + +VOID HalNFCDmemInit( + IN u32 *pTagData, + IN u32 TagLen +) +{ + if (pTagData == NULL) { + return; + } + + u32 pgidx, dmemidx; + for (pgidx = 0, dmemidx = 0; pgidx> 0); + NFCFWDMEM[dmemidx++] = (u8)((pTagData[pgidx] & 0x0000FF00) >> 8); + NFCFWDMEM[dmemidx++] = (u8)((pTagData[pgidx] & 0x00FF0000) >> 16); + NFCFWDMEM[dmemidx++] = (u8)((pTagData[pgidx] & 0xFF000000) >> 24); + } +} + +VOID +HalNFCInit( + PNFC_ADAPTER pNFCAdp +) +{ + u32 Rtemp = 0; + + _memset(pNFCAdp, 0, sizeof(NFC_ADAPTER)); + + //Enable NFC clk 0x244[17:16] = 3 + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_PESOC_COM_CLK_CTRL1)|0x00030000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_PESOC_COM_CLK_CTRL1, Rtemp); + + //Enable A33 interface + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //Enabel NFC and release IOS33_Ameba + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009401); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //polling ISO33_NFC 0x134 [0] = 0 + while ( (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PERI_MONITOR)&BIT0) != 0 ){}; + + //DBG_8195A("NFC Initialization Finish\n"); + + //CLK 25M + { + u32 RegTemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1); + + RegTemp = ((RegTemp & 0xFFFFC7FF)|(BIT_SYS_SYSPLL_CKSDR_EN|BIT_SYS_SYSPLL_CKSDR_DIV(2))); + //RegTemp = ((RegTemp & 0xFFFFC7FF)|BIT13|BIT12); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, RegTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, 0x244, HAL_READ32(SYSTEM_CTRL_BASE, 0x244)|BIT18); + } + + + //Init INT + { + IRQ_HANDLE NfcHandle; + NfcHandle.Data = (u32) (pNFCAdp); + NfcHandle.IrqNum = LP_EXTENSION_IRQ;//NFC_IRQ; + NfcHandle.IrqFun = (IRQ_FUN) LPIrqHandle; + NfcHandle.Priority = 3; + + InterruptRegister(&NfcHandle); + InterruptEn(&NfcHandle); + + LpPeriIrqFunTable[1] = (IRQ_FUN)((u32)NFCIrqHandle | 0x1); + + LpPeriIrqDataTable[1] = (u32)(pNFCAdp); + //level trigger + HAL_WRITE32(VENDOR_REG_BASE, LP_PERI_EXT_IRQ_MODE,0); + //enable imr + HAL_WRITE32(VENDOR_REG_BASE, LP_PERI_EXT_IRQ_EN, + (HAL_READ32(VENDOR_REG_BASE, LP_PERI_EXT_IRQ_EN) | BIT1)); + HalNFCWrite32(0x68, 0xBF00); + + } + + #if !TASK_SCHEDULER_DISABLED + { + u32 NFCTmpSts; + //create task + RtlInitSema(&(pNFCAdp->VeriSema),0); + NFCTmpSts = xTaskCreate( NFCTaskHandle, (const char *)"NFC_TASK", + ((1024*4)/sizeof(portBASE_TYPE)), (void *)pNFCAdp, 1, &(pNFCAdp->NFCTask)); + if (pdTRUE != NFCTmpSts ) { + DBG_NFC_ERR("HalNFCInit: Create Task Err(%d)!!\n", NFCTmpSts); + } + } + #endif + +} + +VOID +HalNFCDeinit( + PNFC_ADAPTER pNFCAdp +) +{ + u32 i; + u32 Rtemp = 0; + + pNFCAdp->TaskStop = 1; + RtlUpSema(&(pNFCAdp->VeriSema)); + // wait sometime for the task be stooped + for(i=0;i<1000;i++) { + if (pNFCAdp->TaskStop == 0) { + break; + } + else { + RtlMsleepOS(100); + } + } + //4 free the task semaphore + RtlFreeSema(&(pNFCAdp->VeriSema)); + _memset(pNFCAdp, 0, sizeof(NFC_ADAPTER)); + + //4 Disable NFC clk + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_PESOC_COM_CLK_CTRL1)&0xFFFCFFFF; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_PESOC_COM_CLK_CTRL1, Rtemp); + + //4 Enable A33 interface + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009404); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); +} + + +u32 +HalNFCRead32( + IN u32 Addr +) +{ + //byte0: test type, byte1: Base address, byte2: offset + + u32 Rtemp = 0; + u32 Idxtemp = 0; + + //full addr + HAL_WRITE32(NFC_INTERFACE_BASE, 0x0, (0x1f000000+Addr)); + //R_cmd + HAL_WRITE32(NFC_INTERFACE_BASE, 0x4, 0x2f); + #if 1 + //polling 0x4[7]=1 + while(1) { + if( (HAL_READ32(NFC_INTERFACE_BASE, 0x4)&BIT7) == 0 ){ + Idxtemp++; + if((Idxtemp)%10000 == 0) { + DBG_8195A("Idxtemp: 0x%x\n", Idxtemp); + } + if (Idxtemp > 0x0fffff) { + DBG_8195A("A2N_OCP_MISC_R_IN_WHILE: 0x%x\r\n", HAL_READ32(NFC_INTERFACE_BASE, 0x4)); + DBG_8195A("Read FAIL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1\r\n"); + return 0; + } + } + else { + //DBG_8195A("A2N_OCP_MISC_R_IN_WHILE: 0x%x\n", HAL_READ32(NFC_INTERFACE_BASE, 0x4)); + HAL_WRITE32(NFC_INTERFACE_BASE, 0x4, BIT7); + Rtemp = HAL_READ32(NFC_INTERFACE_BASE, 0xc); + break; + } + } + #endif + //DBG_8195A("A2N_MEM_MISC: 0x%x\n", Rtemp); + return Rtemp; +} + +VOID +HalNFCWrite32( + IN u32 Addr, + IN u32 Data +) +{ + //byte0: test type, byte1: Base address, byte2: offset, byte3:value + u32 Idxtemp = 0; + + //full addr + HAL_WRITE32(NFC_INTERFACE_BASE, 0x0, 0x1f000000+Addr); + //full data + HAL_WRITE32(NFC_INTERFACE_BASE, 0x8, Data); + //W_cmd + HAL_WRITE32(NFC_INTERFACE_BASE, 0x4, 0x1f); + + //polling 0x4[7]=1 + while(1) { + if( (HAL_READ32(NFC_INTERFACE_BASE, 0x4)&BIT7) == 0 ){ + Idxtemp++; + if((Idxtemp)%10000 == 0) { + DBG_8195A("Idxtemp: 0x%x\n", Idxtemp); + } + if (Idxtemp > 0x0fffff) { + DBG_8195A("A2N_OCP_MISC_R_IN_WHILE: 0x%x\r\n", HAL_READ32(NFC_INTERFACE_BASE, 0x4)); + DBG_8195A("write FAIL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1\r\n"); + return; + } + } + else { + //DBG_8195A("A2N_OCP_MISC_W_IN_WHILE: 0x%x\n", HAL_READ32(NFC_INTERFACE_BASE, 0x4)); + HAL_WRITE32(NFC_INTERFACE_BASE, 0x4, BIT7); + break; + } + } +} + +VOID +HalNFCFwFullMEM( + IN VOID *Data, + IN u32 NFCFwLength +) +{ + u32 *NFCFW; + NFCFW = (u32*) Data; + u32 Idx, NFCFwTemp, RTemp; + u8 Temp = (NFCFwLength%4); + u32 IdxTemp = ((NFCFwLength-Temp)/4); + u8 MEMTemp = 0; +// u8 MEMCnt = 0; + + u32 FWChkSum = 0; + + HalNFCWrite32(0x4C, 0x0); + + //write fw to MEM + for (Idx = 0; Idx < IdxTemp; Idx++ ) { + + NFCFwTemp = *(NFCFW+Idx); + HAL_WRITE32(NFC_INTERFACE_BASE, 0x10, NFCFwTemp); + + //cal chksum + FWChkSum ^= NFCFwTemp; + MEMTemp++; + HalDelayUs(1); + + if (MEMTemp == 8) { + + MEMTemp = 0; + + //check mem empty + while(1){ + + RTemp = HAL_READ32(NFC_INTERFACE_BASE, 0x14); +// MEMCnt = (((u8)(RTemp & 0x1e)) >> 1); + + if ( RTemp & BIT6) { + break; + } + else { + } + } + } + } + + HalDelayUs(200); + + while(1){ + RTemp = HAL_READ32(NFC_INTERFACE_BASE, 0x14); + if ( RTemp & BIT6) { + break; + } + else { + } + } + + //write chksum + HAL_WRITE32(NFC_INTERFACE_BASE, 0x10, FWChkSum); + + while(1){ + RTemp = HAL_READ32(NFC_INTERFACE_BASE, 0x14); + if ( RTemp & BIT6) { + break; + } + else { + } + } +} + + +VOID +HalNFCFwDownload( + VOID +) +{ + u32 Rtemp = 0; + + //switch free run clock from 500K to 80M + HalNFCWrite32(0x88, 0xf06cf06c); + + //2 Download NFC FW + //3 Download IMEM + //setting fw download + HalNFCWrite32(0x48, 0x1); + + //reset NFC CPU + HalNFCWrite32(0x20, 0x1234FFFF); + + //switch IMEM + HAL_WRITE32(NFC_INTERFACE_BASE, 0x14, 0); + + //write fw to MEM + HalNFCFwFullMEM(NFCFWIMEM,sizeof(NFCFWIMEM)); + HalDelayUs(100); + + Rtemp = HalNFCRead32(0x48); + if(Rtemp & BIT1) { + //DBG_8195A("NFC FW Download IMEM SUCCESS \n"); + } + else { + DBG_8195A("NFC FW Download IMEM FAIL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n"); + return; + } + + //3 Download DMEM + //setting fw download + HalNFCWrite32(0x48, 0x1); + + //switch DMEM + HAL_WRITE32(NFC_INTERFACE_BASE, 0x14, 1); + + //write fw to MEM + HalNFCFwFullMEM(NFCFWDMEM,sizeof(NFCFWDMEM)); + + HalDelayUs(100); + Rtemp = HalNFCRead32(0x48); + if(Rtemp & BIT1) { + //DBG_8195A("NFC FW Download DMEM SUCCESS \n"); + } + else { + DBG_8195A("NFC FW Download DMEM FAIL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! \n"); + return; + } + + //Reset CPU + HalNFCWrite32(0x48, 0x80); + + DBG_8195A("NFC REBOOT SUCCESS \n"); +} + +#endif //CONFIG_NFC_EN diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_pcm.c b/lib/fwlib/rtl8195a/src/rtl8195a_pcm.c new file mode 100644 index 0000000..abf6b18 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_pcm.c @@ -0,0 +1,360 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "platform_autoconf.h" +#include "diag.h" +#include "rtl8195a_pcm.h" +#include "hal_pcm.h" + +extern void * +_memset( void *s, int c, SIZE_T n ); + +VOID +HalPcmOnOffRtl8195a ( + IN VOID *Data +) +{ + PHAL_PCM_ADAPTER pHalPcmAdapter = (PHAL_PCM_ADAPTER) Data; + //todo on off pcm + +} + +//default sampling rate 8khz, linear, 10ms frame size, time slot 0 , tx+rx +// master mode, enable endian swap +// Question: need local tx/rx page? +BOOL +HalPcmInitRtl8195a( + IN VOID *Data +) +{ + + PHAL_PCM_ADAPTER pHalPcmAdapter = (PHAL_PCM_ADAPTER) Data; + _memset((void *)pHalPcmAdapter, 0, sizeof(HAL_PCM_ADAPTER)); + + //4 1) Initial PcmChCNR03 Register + pHalPcmAdapter->PcmChCNR03.CH0MuA = 0; + pHalPcmAdapter->PcmChCNR03.CH0Band = 0; + + + //4 1) Initial PcmTSR03 Register + pHalPcmAdapter->PcmTSR03.CH0TSA = 0; + + //4 1) Initial PcmBSize03 Register + pHalPcmAdapter->PcmBSize03.CH0BSize = 39; // 40word= 8khz*0.01s*1ch*2byte/4byte + + + //4 2) Initial Ctl Register + + pHalPcmAdapter->PcmCtl.Pcm_En = 1; + pHalPcmAdapter->PcmCtl.SlaveMode = 0; + pHalPcmAdapter->PcmCtl.FsInv = 0; + pHalPcmAdapter->PcmCtl.LinearMode = 0; + pHalPcmAdapter->PcmCtl.LoopBack = 0; + pHalPcmAdapter->PcmCtl.EndianSwap = 1; + + return _TRUE; +} + + +BOOL +HalPcmSettingRtl8195a( + IN VOID *Data +) +{ + + PHAL_PCM_ADAPTER pHalPcmAdapter = (PHAL_PCM_ADAPTER) Data; + u8 PcmIndex = pHalPcmAdapter->PcmIndex; + u8 PcmCh = pHalPcmAdapter->PcmCh; + u32 RegCtl, RegChCNR03, RegTSR03, RegBSize03; + u32 Isr03; + + PcmCh=0; + //4 1) Check Pcm index is avaliable + if (HAL_PCMX_READ32(PcmIndex, REG_PCM_CHCNR03) & (BIT24|BIT25)) { + //4 Pcm index is running, stop first + DBG_8195A_DMA("Error, PCM %d ch%d is running; stop first!\n", PcmIndex, PcmCh); + + return _FALSE; + } + + //4 2) Check if there are the pending isr + + + Isr03 = HAL_PCMX_READ32(PcmIndex, REG_PCM_ISR03); + Isr03 &= 0xff000000; + //4 Clear Pending Isr + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_ISR03, Isr03); + //} + + + //4 3) Process RegCtl + RegCtl = HAL_PCMX_READ32(PcmIndex, REG_PCM_CTL); + + //4 Clear Ctl register bits + RegCtl &= ( BIT_INV_CTLX_SLAVE_SEL & + BIT_INV_CTLX_FSINV & + BIT_INV_CTLX_PCM_EN & + BIT_INV_CTLX_LINEARMODE & + BIT_INV_CTLX_LOOP_BACK & + BIT_INV_CTLX_ENDIAN_SWAP); + + RegCtl = BIT_CTLX_SLAVE_SEL(pHalPcmAdapter->PcmCtl.SlaveMode) | + BIT_CTLX_FSINV(pHalPcmAdapter->PcmCtl.FsInv) | + BIT_CTLX_PCM_EN(pHalPcmAdapter->PcmCtl.Pcm_En) | + BIT_CTLX_LINEARMODE(pHalPcmAdapter->PcmCtl.LinearMode) | + BIT_CTLX_LOOP_BACK(pHalPcmAdapter->PcmCtl.LoopBack) | + BIT_CTLX_ENDIAN_SWAP(pHalPcmAdapter->PcmCtl.EndianSwap) | + RegCtl; + + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_CTL, RegCtl); + //4 4) Program ChCNR03 Register + + RegChCNR03 = HAL_PCMX_READ32(PcmIndex, REG_PCM_CHCNR03); + + RegChCNR03 &= (BIT_INV_CHCNR03_CH0RE & + BIT_INV_CHCNR03_CH0TE & + BIT_INV_CHCNR03_CH0MUA & + BIT_INV_CHCNR03_CH0BAND); + + RegChCNR03 = BIT_CHCNR03_CH0RE(pHalPcmAdapter->PcmChCNR03.CH0RE) | + BIT_CHCNR03_CH0TE(pHalPcmAdapter->PcmChCNR03.CH0TE) | + BIT_CHCNR03_CH0MUA(pHalPcmAdapter->PcmChCNR03.CH0MuA) | + BIT_CHCNR03_CH0BAND(pHalPcmAdapter->PcmChCNR03.CH0Band) | + RegChCNR03; + + DBG_8195A_DMA("RegChCNR03 data:0x%x\n", RegChCNR03); + + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_CHCNR03, RegChCNR03); + // time slot + RegTSR03 = HAL_PCMX_READ32(PcmIndex, REG_PCM_TSR03); + + RegTSR03 &= (BIT_INV_TSR03_CH0TSA); + RegTSR03 = BIT_TSR03_CH0TSA(pHalPcmAdapter->PcmTSR03.CH0TSA) | + RegTSR03; + + DBG_8195A_DMA("RegTSR03 data:0x%x\n", RegTSR03); + + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_TSR03, RegTSR03); + + // buffer size + RegBSize03 = HAL_PCMX_READ32(PcmIndex, REG_PCM_BSIZE03); + + RegBSize03 &= (BIT_INV_BSIZE03_CH0BSIZE); + RegBSize03 = BIT_BSIZE03_CH0BSIZE(pHalPcmAdapter->PcmBSize03.CH0BSize) | + RegBSize03; + + DBG_8195A_DMA("RegBSize03 data:0x%x\n", RegBSize03); + + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_BSIZE03, RegBSize03); + + + + + return _TRUE; +} + +BOOL +HalPcmEnRtl8195a( + IN VOID *Data +) +{ + + PHAL_PCM_ADAPTER pHalPcmAdapter = (PHAL_PCM_ADAPTER) Data; + u8 PcmIndex = pHalPcmAdapter->PcmIndex; + u8 PcmCh = pHalPcmAdapter->PcmCh; + u32 RegChCNR03; + + PcmCh=0; + pHalPcmAdapter->Enable = 1; + + + //4 1) Check Pcm index is avaliable + RegChCNR03 = HAL_PCMX_READ32(PcmIndex, REG_PCM_CHCNR03); + if (RegChCNR03 & (BIT24|BIT25)) { + //4 Pcm index is running, stop first + DBG_8195A_DMA("Error, PCM %d ch%d is running; stop first!\n", PcmIndex, PcmCh); + + return _FALSE; + } + + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_CHCNR03, RegChCNR03|BIT24|BIT25); + pHalPcmAdapter->PcmChCNR03.CH0RE = 1; + pHalPcmAdapter->PcmChCNR03.CH0TE = 1; + + return _TRUE; +} + +BOOL +HalPcmDisRtl8195a( + IN VOID *Data +) +{ + + PHAL_PCM_ADAPTER pHalPcmAdapter = (PHAL_PCM_ADAPTER) Data; + u8 PcmIndex = pHalPcmAdapter->PcmIndex; + u8 PcmCh = pHalPcmAdapter->PcmCh; + u32 RegChCNR03; + + PcmCh=0; + pHalPcmAdapter->Enable = 0; + + + RegChCNR03 = HAL_PCMX_READ32(PcmIndex, REG_PCM_CHCNR03); + + HAL_PCMX_WRITE32(PcmIndex, REG_PCM_CHCNR03, RegChCNR03&(~(BIT24|BIT25))); + pHalPcmAdapter->PcmChCNR03.CH0RE = 0; + pHalPcmAdapter->PcmChCNR03.CH0TE = 0; + + return _TRUE; +} + + + +BOOL +HalPcmIsrEnAndDisRtl8195a ( + IN VOID *Data +) +{ +/* + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + u32 IsrMask, Addr, IsrCtrl; + u8 IsrTypeIndex = 0; + + for (IsrTypeIndex=0; IsrTypeIndex<5; IsrTypeIndex++) { + + if (BIT_(IsrTypeIndex) & pHalGdmaAdapter->GdmaIsrType) { + Addr = (REG_GDMA_MASK_INT_BASE + IsrTypeIndex*8); + + IsrMask = HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, Addr); + + IsrCtrl = ((pHalGdmaAdapter->IsrCtrl)?(pHalGdmaAdapter->ChEn | IsrMask): + ((~pHalGdmaAdapter->ChEn) & IsrMask)); + + HAL_GDMAX_WRITE32(pHalGdmaAdapter->GdmaIndex, + Addr, + IsrCtrl + ); + + } + } +*/ + return _TRUE; +} + + + +BOOL +HalPcmDumpRegRtl8195a ( + IN VOID *Data +) +{ +/* + PHAL_GDMA_ADAPTER pHalGdmaAdapter = Data; + HAL_GDMAX_WRITE32(pHalGdmaAdapter->GdmaIndex, + REG_GDMA_CH_EN, + (HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, REG_GDMA_CH_EN)| + (pHalGdmaAdapter->ChEn)) + ); +*/ + return _TRUE; +} + +BOOL +HalPcmRtl8195a ( + IN VOID *Data +) +{ +/* PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + HAL_GDMAX_WRITE32(pHalGdmaAdapter->GdmaIndex, + REG_GDMA_CH_EN, + (HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, REG_GDMA_CH_EN)& + ~(pHalGdmaAdapter->ChEn)) + ); +*/ + return _TRUE; +} +/* +u8 +HalGdmaChIsrCleanRtl8195a ( + IN VOID *Data +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + u32 IsrStatus; + u8 IsrTypeIndex = 0, IsrActBitMap = 0; + + for (IsrTypeIndex=0; IsrTypeIndex<5; IsrTypeIndex++) { + + IsrStatus = HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, + (REG_GDMA_RAW_INT_BASE + IsrTypeIndex*8)); + +// DBG_8195A_DMA("Isr Type %d: Isr Status 0x%x\n", IsrTypeIndex, IsrStatus); + + IsrStatus = (IsrStatus & (pHalGdmaAdapter->ChEn & 0xFF)); + + if (BIT_(IsrTypeIndex) & pHalGdmaAdapter->GdmaIsrType) { + HAL_GDMAX_WRITE32(pHalGdmaAdapter->GdmaIndex, + (REG_GDMA_CLEAR_INT_BASE+ (IsrTypeIndex*8)), + (IsrStatus)// & (pHalGdmaAdapter->ChEn & 0xFF)) + ); + IsrActBitMap |= BIT_(IsrTypeIndex); + + } + + } + return IsrActBitMap; + +} + + +VOID +HalGdmaChCleanAutoSrcRtl8195a ( + IN VOID *Data +) +{ + u32 CfgxLow; + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + CfgxLow = HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, + (REG_GDMA_CH_CFG + pHalGdmaAdapter->ChNum*REG_GDMA_CH_OFF)); + + CfgxLow &= BIT_INVC_CFGX_LO_RELOAD_SRC; + + HAL_GDMAX_WRITE32(pHalGdmaAdapter->GdmaIndex, + (REG_GDMA_CH_CFG + pHalGdmaAdapter->ChNum*REG_GDMA_CH_OFF), + CfgxLow + ); + + DBG_8195A_DMA("CFG Low data:0x%x\n", + HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, (REG_GDMA_CH_CFG + pHalGdmaAdapter->ChNum*REG_GDMA_CH_OFF))); +} + +VOID +HalGdmaChCleanAutoDstRtl8195a ( + IN VOID *Data +) +{ + u32 CfgxLow; + PHAL_GDMA_ADAPTER pHalGdmaAdapter = (PHAL_GDMA_ADAPTER) Data; + CfgxLow = HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, + (REG_GDMA_CH_CFG + pHalGdmaAdapter->ChNum*REG_GDMA_CH_OFF)); + + CfgxLow &= BIT_INVC_CFGX_LO_RELOAD_DST; + + HAL_GDMAX_WRITE32(pHalGdmaAdapter->GdmaIndex, + (REG_GDMA_CH_CFG + pHalGdmaAdapter->ChNum*REG_GDMA_CH_OFF), + CfgxLow + ); + DBG_8195A_DMA("CFG Low data:0x%x\n", + HAL_GDMAX_READ32(pHalGdmaAdapter->GdmaIndex, (REG_GDMA_CH_CFG + pHalGdmaAdapter->ChNum*REG_GDMA_CH_OFF))); + +} +*/ + + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_pwm.c b/lib/fwlib/rtl8195a/src/rtl8195a_pwm.c new file mode 100644 index 0000000..dd5163e --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_pwm.c @@ -0,0 +1,219 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "hal_peri_on.h" + +#ifdef CONFIG_PWM_EN +#include "rtl8195a_pwm.h" +#include "hal_pwm.h" + +extern HAL_PWM_ADAPTER PWMPin[]; + +extern HAL_TIMER_OP HalTimerOp; + +/** + * @brief Configure a G-Timer to generate a tick with certain time. + * + * @param pwm_id: the PWM pin index + * @param tick_time: the time (micro-second) of a tick + * + * @retval None + */ +void +Pwm_SetTimerTick_8195a( + HAL_PWM_ADAPTER *pPwmAdapt, + u32 tick_time +) +{ + TIMER_ADAPTER TimerAdapter; + + + if (tick_time <= MIN_GTIMER_TIMEOUT) { + tick_time = MIN_GTIMER_TIMEOUT; + } + else { + tick_time = (((tick_time-1)/TIMER_TICK_US)+1) * TIMER_TICK_US; + } + + // Initial a G-Timer for the PWM pin + if (pPwmAdapt->tick_time != tick_time) { + TimerAdapter.IrqDis = 1; // Disable Irq + TimerAdapter.IrqHandle.IrqFun = (IRQ_FUN) NULL; + TimerAdapter.IrqHandle.IrqNum = TIMER2_7_IRQ; + TimerAdapter.IrqHandle.Priority = 0; + TimerAdapter.IrqHandle.Data = (u32)NULL; + TimerAdapter.TimerId = pPwmAdapt->gtimer_id; + TimerAdapter.TimerIrqPriority = 0; + TimerAdapter.TimerLoadValueUs = tick_time-1; + TimerAdapter.TimerMode = 1; // auto-reload with user defined value + + HalTimerOp.HalTimerInit((VOID*) &TimerAdapter); + pPwmAdapt->tick_time = tick_time; + DBG_PWM_INFO("%s: Timer_Id=%d Count=%d\n", __FUNCTION__, pPwmAdapt->gtimer_id, tick_time); + } + +} + + +/** + * @brief Set the duty ratio of the PWM pin. + * + * @param pwm_id: the PWM pin index + * @param period: the period time, in micro-second. + * @param pulse_width: the pulse width time, in micro-second. + * + * @retval None + */ +void +HAL_Pwm_SetDuty_8195a( + HAL_PWM_ADAPTER *pPwmAdapt, + u32 period, + u32 pulse_width +) +{ + u32 RegAddr; + u32 RegValue; + u32 period_tick; + u32 pulsewidth_tick; + u32 tick_time; + u8 timer_id; + u8 pwm_id; + + pwm_id = pPwmAdapt->pwm_id; + // Adjust the tick time to a proper value + if (period < (MIN_GTIMER_TIMEOUT*2)) { + DBG_PWM_ERR ("HAL_Pwm_SetDuty_8195a: Invalid PWM period(%d), too short!!\n", period); + tick_time = MIN_GTIMER_TIMEOUT; + period = MIN_GTIMER_TIMEOUT*2; + } + else { + tick_time = period / 0x3fc; + if (tick_time < MIN_GTIMER_TIMEOUT) { + tick_time = MIN_GTIMER_TIMEOUT; + } + } + + Pwm_SetTimerTick_8195a(pPwmAdapt, tick_time); + tick_time = pPwmAdapt->tick_time; +#if 0 + // Check if current tick time needs adjustment + if ((pPwmAdapt->tick_time << 12) <= period) { + // need a longger tick time + } + else if ((pPwmAdapt->tick_time >> 2) >= period) { + // need a shorter tick time + } +#endif + period_tick = period/tick_time; + if (period_tick == 0) { + period_tick = 1; + } + + if (pulse_width >= period) { +// pulse_width = period-1; + pulse_width = period; + } + pulsewidth_tick = pulse_width/tick_time; + if (pulsewidth_tick == 0) { +// pulsewidth_tick = 1; + } + + timer_id = pPwmAdapt->gtimer_id; + + pPwmAdapt->period = period_tick & 0x3ff; + pPwmAdapt->pulsewidth = pulsewidth_tick & 0x3ff; + + RegAddr = REG_PERI_PWM0_CTRL + (pwm_id*4); + RegValue = BIT31 | (timer_id<<24) | (pulsewidth_tick<<12) | period_tick; + + HAL_WRITE32(PERI_ON_BASE, RegAddr, RegValue); +} + +/** + * @brief Initializes and enable a PWM control pin. + * + * @param pwm_id: the PWM pin index + * @param sel: pin mux selection + * @param timer_id: the G-timer index assigned to this PWM + * + * @retval HAL_Status + */ +HAL_Status +HAL_Pwm_Init_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +) +{ + u32 pwm_id; + u32 pin_sel; + + pwm_id = pPwmAdapt->pwm_id; + pin_sel = pPwmAdapt->sel; + // Initial a G-Timer for the PWM pin + Pwm_SetTimerTick_8195a(pPwmAdapt, MIN_GTIMER_TIMEOUT); + + // Set default duty ration + HAL_Pwm_SetDuty_8195a(pPwmAdapt, 20000, 10000); + + // Configure the Pin Mux + PinCtrl((PWM0+pwm_id), pin_sel, 1); + + return HAL_OK; +} + + +/** + * @brief Enable a PWM control pin. + * + * @param pwm_id: the PWM pin index + * + * @retval None + */ +void +HAL_Pwm_Enable_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +) +{ + u32 pwm_id; + + pwm_id = pPwmAdapt->pwm_id; + // Configure the Pin Mux + if (!pPwmAdapt->enable) { + PinCtrl((PWM0+pwm_id), pPwmAdapt->sel, 1); + HalTimerOp.HalTimerEn(pPwmAdapt->gtimer_id); + pPwmAdapt->enable = 1; + } +} + + +/** + * @brief Disable a PWM control pin. + * + * @param pwm_id: the PWM pin index + * + * @retval None + */ +void +HAL_Pwm_Disable_8195a( + HAL_PWM_ADAPTER *pPwmAdapt +) +{ + u32 pwm_id; + + pwm_id = pPwmAdapt->pwm_id; + // Configure the Pin Mux + if (pPwmAdapt->enable) { + PinCtrl((PWM0+pwm_id), pPwmAdapt->sel, 0); + HalTimerOp.HalTimerDis(pPwmAdapt->gtimer_id); + pPwmAdapt->enable = 0; + } +} + +#endif //CONFIG_PWM_EN diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_sdio_device.c b/lib/fwlib/rtl8195a/src/rtl8195a_sdio_device.c new file mode 100644 index 0000000..1b9980e --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_sdio_device.c @@ -0,0 +1,3177 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include "hal_sdio.h" +#include "mailbox.h" + +#if CONFIG_INIC_EN +#include "freertos_pmu.h" +extern struct sk_buff *rltk_wlan_alloc_skb(unsigned int total_len); +extern unsigned char *skb_put(struct sk_buff * skb, unsigned int len); +extern void inic_sdio_free_data(unsigned char *data); +#if (CONFIG_INIC_SKB_TX == 0) //pre-allocated memory for SDIO TX BD +ALIGNMTO(4) char inic_TX_Buf[SDIO_TX_BD_NUM][SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT]; +#endif +#endif + +extern PHAL_SDIO_ADAPTER pgSDIODev; + +#ifdef CONFIG_SOC_PS_MODULE +//extern RAM_START_FUNCTION gRamWakeupFun; +extern u8 __ram_start_table_start__[]; +extern _LONG_CALL_ VOID HalCpuClkConfig(u8 CpuType); +extern _LONG_CALL_ VOID VectorTableInitRtl8195A(u32 StackP); +extern _LONG_CALL_ VOID HalReInitPlatformLogUartV02(VOID); +extern _LONG_CALL_ VOID HalInitPlatformTimerV02(VOID); +extern VOID InfraStart(VOID); +extern VOID SleepPG(u8 Option, u32 SDuration); +extern VOID PSHalInitPlatformLogUart(VOID); +extern VOID HalReInitPlatformTimer(VOID); +extern VOID DeepStandby(u8 Option, u32 SDuration, u8 GpioOption); +extern VOID QueryRegPwrState(u8 FuncIdx, u8* RegState, u8* HwState); +#endif + +/****************************************************************************** + * Function Prototype Declaration + ******************************************************************************/ +BOOL SDIO_Device_Init( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Device_DeInit( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_IRQ_Handler( + IN VOID *pData +); + +VOID SDIO_Interrupt_Init( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Interrupt_DeInit( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Enable_Interrupt( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 IntMask +); + +VOID SDIO_Disable_Interrupt( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 IntMask +); + +VOID SDIO_Clear_ISR( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 IntMask +); + +VOID SDIO_TxTask( + IN VOID *pData +); + +VOID SDIO_RxTask( + IN VOID *pData +); + +static __inline VOID SDIO_Wakeup_Task( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +static VOID SDIO_SetEvent( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 Event +); + +static VOID SDIO_ClearEvent( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 Event +); + +static BOOL SDIO_IsEventPending( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 Event +); + +VOID SDIO_IRQ_Handler_BH( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_RX_IRQ_Handler_BH( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_TX_BD_Buf_Refill( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_TX_FIFO_DataReady( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +PSDIO_RX_PACKET SDIO_Alloc_Rx_Pkt( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Free_Rx_Pkt( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN PSDIO_RX_PACKET pPkt +); + +VOID SDIO_Recycle_Rx_BD ( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Process_H2C_IOMsg( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Send_C2H_IOMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 *C2HMsg +); + +VOID SDIO_Process_H2C_PktMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u8 *H2CMsg +); + +u8 SDIO_Send_C2H_PktMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u8 *C2HMsg, + IN u16 MsgLen +); + +u8 SDIO_Process_RPWM( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +u8 SDIO_Process_RPWM2( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Reset_Cmd( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Return_Rx_Data( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_Register_Tx_Callback( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN s8 (*CallbackFun)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize), + IN VOID *pAdapter +); + +s8 SDIO_Rx_Callback( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN VOID *pData, + IN u16 Offset, + IN u16 Length, + IN u8 CmdType +); + +s8 SDIO_Handle_MsgBlk( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN MSG_BLK *pMblk +); + +#if SDIO_MP_MODE +VOID SDIO_PeriodicalTimerCallback( + void *pContex +); + +u8 SDIO_MapMPCmd( + IN char *CmdStr, + IN u16 *Offset +); + +VOID SDIO_DumpMPStatus( + IN PHAL_SDIO_ADAPTER pSDIODev + ); + +VOID SDIO_StatisticDump( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +s8 SDIO_MP_Loopback( + IN VOID *pAdapter, + IN u8 *pData, + IN u16 Offset, + IN u16 PktSize +); + +s8 SDIO_MP_ContinueTx( + IN VOID *pAdapter, + IN u8 *pData, + IN u16 Offset, + IN u16 PktSize +); + +VOID SDIO_MP_ContinueRx( + IN PHAL_SDIO_ADAPTER pSDIODev +); + +VOID SDIO_DeviceMPApp( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u16 argc, + IN u8 *argv[] +); +#endif /* endof '#if SDIO_MP_MODE' */ + +/****************************************************************************** + * Global Variable Declaration + ******************************************************************************/ + +#if SDIO_MP_MODE +const SDIO_MP_CMD SDIO_MPCmdTable[] = { + {"mp_start", SDIO_MP_START}, + {"mp_stop", SDIO_MP_STOP}, + {"mp_loopback", SDIO_MP_LOOPBACK}, + {"status", SDIO_MP_STATUS}, + {"read_reg8", SDIO_MP_READ_REG8}, + {"read_reg16", SDIO_MP_READ_REG16}, + {"read_reg32", SDIO_MP_READ_REG32}, + {"write_reg8", SDIO_MP_WRITE_REG8}, + {"write_reg16", SDIO_MP_WRITE_REG16}, + {"write_reg32", SDIO_MP_WRITE_REG32}, + {"wakeup", SDIO_MP_WAKEUP}, + {"dump", SDIO_MP_DUMP}, + {"ctx", SDIO_MP_CTX}, + {"crx", SDIO_MP_CRX}, + {"crx_da", SDIO_MP_CRX_DA}, + {"crx_stop", SDIO_MP_CRX_STOP}, + {"dbg_msg", SDIO_MP_DBG_MSG} +}; + +const u8 MP_WlanHdr[]={ + 0x88,0x01,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff, + 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x00,0x01,0x10,0x00,0x06,0x00}; +#endif + +/****************************************************************************** + * External Function & Variable Declaration + ******************************************************************************/ +extern PHAL_SDIO_ADAPTER pgSDIODev; + +extern u32 Strtoul( + IN const u8 *nptr, + IN u8 **endptr, + IN u32 base +); + +/****************************************************************************** + * Function: SDIO_Device_Init + * Desc: SDIO device driver initialization. + * 1. Allocate SDIO TX FIFO buffer and initial TX related register. + * 2. Allocate SDIO RX Buffer Descriptor and RX Buffer. Initial RX related + * register. + * 3. Register the Interrupt function. + * 4. Create the SDIO Task and allocate resource(Semaphore). + * + ******************************************************************************/ +BOOL SDIO_Device_Init( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + int i; + SDIO_TX_PACKET *pTxPkt; + SDIO_RX_PACKET *pPkt; + SDIO_TX_BD_HANDLE *pTxBdHdl; + SDIO_RX_BD_HANDLE *pRxBdHdl; + int ret; + u32 reg_value; + + DBG_SDIO_INFO("SDIO_Device_Init==>\n"); + + // Clean boot from wakeup bit + reg_value = HAL_READ32(PERI_ON_BASE, REG_SOC_FUNC_EN); + reg_value &= ~(BIT(29)); + HAL_WRITE32(PERI_ON_BASE, REG_SOC_FUNC_EN, reg_value); + + /* SDIO Function Enable */ + SDIOD_ON_FCTRL(ON); + SDIOD_OFF_FCTRL(ON); + + /* Enable Clock for SDIO function */ + ACTCK_SDIOD_CCTRL(ON); + SLPCK_SDIOD_CCTRL(ON); + + // Reset SDIO DMA + HAL_SDIO_WRITE8(REG_SPDIO_CPU_RST_DMA, BIT_CPU_RST_SDIO_DMA); + + /* Initial SDIO TX BD */ + DBG_SDIO_INFO("Tx BD Init==>\n"); + +// TODO: initial TX BD + pSDIODev->pTXBDAddr = RtlZmalloc((SDIO_TX_BD_NUM * sizeof(SDIO_TX_BD))+3); + if (NULL == pSDIODev->pTXBDAddr) { + DBG_SDIO_ERR("SDIO_Device_Init: Malloc for TX_BD Err!!\n"); + goto SDIO_INIT_ERR; + } + pSDIODev->pTXBDAddrAligned = (PSDIO_TX_BD)(((((u32)pSDIODev->pTXBDAddr - 1) >> 2) + 1) << 2); // Make it 4-bytes aligned + HAL_SDIO_WRITE32(REG_SPDIO_TXBD_ADDR, pSDIODev->pTXBDAddrAligned); + HAL_SDIO_WRITE16(REG_SPDIO_TXBD_SIZE, SDIO_TX_BD_NUM); + /* Set TX_BUFF_UNIT_SIZE */ +#if 0 + reg = HAL_SDIO_READ32(REG_SPDIO_RXBD_CNT); + reg &= ~((0xff)<<8); + reg |= (SDIO_TX_BD_BUF_USIZE<<8); + HAL_SDIO_WRITE32(REG_SPDIO_RXBD_CNT, reg); +#endif + HAL_SDIO_WRITE8(REG_SPDIO_TX_BUF_UNIT_SZ, SDIO_TX_BD_BUF_USIZE); + + DBG_SDIO_INFO("Tx BD Buf Unit Size(%d), Reg=0x%x\n", SDIO_TX_BD_BUF_USIZE, HAL_SDIO_READ8(REG_SPDIO_TX_BUF_UNIT_SZ)); + + /* Set DISPATCH_TXAGG_PKT */ + HAL_SDIO_WRITE32(REG_SPDIO_AHB_DMA_CTRL, HAL_SDIO_READ32(REG_SPDIO_AHB_DMA_CTRL)|BIT31); + // Reset HW TX BD pointer + pSDIODev->TXBDWPtr = HAL_SDIO_READ32(REG_SPDIO_TXBD_WPTR); + pSDIODev->TXBDRPtr = pSDIODev->TXBDWPtr; + pSDIODev->TXBDRPtrReg = pSDIODev->TXBDWPtr; + HAL_SDIO_WRITE32(REG_SPDIO_TXBD_RPTR, pSDIODev->TXBDRPtrReg); + + DBG_SDIO_INFO("TXBDWPtr=0x%x TXBDRPtr=0x%x\n", pSDIODev->TXBDWPtr, pSDIODev->TXBDRPtr); + + pSDIODev->pTXBDHdl = (PSDIO_TX_BD_HANDLE)RtlZmalloc(SDIO_TX_BD_NUM * sizeof(SDIO_TX_BD_HANDLE)); + if (NULL == pSDIODev->pTXBDHdl) { + DBG_SDIO_ERR("SDIO_Device_Init: Malloc for TX_BD Handle Err!!\n"); + goto SDIO_INIT_ERR; + } + + for (i=0;ipTXBDHdl + i; + pTxBdHdl->pTXBD = pSDIODev->pTXBDAddrAligned + i; +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX +//allocate wlan skb here + pTxBdHdl->skb = rltk_wlan_alloc_skb(SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); + DBG_SDIO_INFO("SDIO_Device_Init: pTxBdHdl->pkt @ 0x%x\n", pTxBdHdl->skb); + if(pTxBdHdl->skb) + pTxBdHdl->pTXBD->Address = (u32)pTxBdHdl->skb->tail; + else + DBG_SDIO_ERR("SDIO_Device_Init: rltk_wlan_alloc_skb (%d) failed!!\n", SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); +#else + pTxBdHdl->pTXBD->Address = (u32)(&inic_TX_Buf[i][0]); +#endif +#else + // Allocate buffer for each TX BD + pTxBdHdl->pTXBD->Address = (u32)RtlMalloc(SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); +#if SDIO_DEBUG + pSDIODev->MemAllocCnt++; +#endif +#endif + if (NULL == (u32*)(pTxBdHdl->pTXBD->Address)) { + // Memory Allocate Failed + int j; + + for (j=0;jpTXBDHdl + j; + pTxBdHdl->pTXBD = pSDIODev->pTXBDAddrAligned + j; + if (pTxBdHdl->pTXBD->Address) { +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX + //free wlan skb here + dev_kfree_skb_any(pTxBdHdl->skb); +#endif + pTxBdHdl->pTXBD->Address =(u32)NULL; +#else + RtlMfree((u8 *)pTxBdHdl->pTXBD->Address, (SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT)); +#endif + } + } + goto SDIO_INIT_ERR; + } + pTxBdHdl->isFree = 1; + DBG_SDIO_INFO("TX_BD%d @ 0x%x 0x%x\n", i, pTxBdHdl, pTxBdHdl->pTXBD); + } + +#if (CONFIG_INIC_EN == 0) + RtlInitListhead(&pSDIODev->FreeTxPktList); // Init the list for free packet handler + /* Allocate memory for TX Packets handler */ + pSDIODev->pTxPktHandler = (SDIO_TX_PACKET *)(RtlZmalloc(sizeof(SDIO_TX_PACKET)*SDIO_TX_PKT_NUM)); + if (NULL == pSDIODev->pTxPktHandler) { + DBG_SDIO_ERR("SDIO_Device_Init: Malloc for TX PKT Handler Err!!\n"); + goto SDIO_INIT_ERR; + } + /* Add all TX packet handler into the Free Queue(list) */ + for (i=0;ipTxPktHandler + i; + RtlListInsertTail(&pTxPkt->list, &pSDIODev->FreeTxPktList); + } +#endif + /* Init RX BD and RX Buffer */ + pSDIODev->pRXBDAddr = RtlZmalloc((SDIO_RX_BD_NUM * sizeof(SDIO_RX_BD))+7); + if (NULL == pSDIODev->pRXBDAddr) { + DBG_SDIO_ERR("SDIO_Device_Init: Malloc for RX_BD Err!!\n"); + goto SDIO_INIT_ERR; + } + pSDIODev->pRXBDAddrAligned = (PSDIO_RX_BD)(((((u32)pSDIODev->pRXBDAddr - 1) >> 3) + 1) << 3); // Make it 8-bytes aligned + HAL_SDIO_WRITE32(REG_SPDIO_RXBD_ADDR, pSDIODev->pRXBDAddrAligned); + HAL_SDIO_WRITE16(REG_SPDIO_RXBD_SIZE, SDIO_RX_BD_NUM); + + // Set the threshold of free RX BD count to trigger interrupt + HAL_SDIO_WRITE16(REG_SPDIO_RX_BD_FREE_CNT, RX_BD_FREE_TH); + DBG_SDIO_INFO("Rx BD Free Cnt(%d), Reg=0x%x\n", RX_BD_FREE_TH, HAL_SDIO_READ16(REG_SPDIO_RX_BD_FREE_CNT)); + + pSDIODev->pRXBDHdl = (PSDIO_RX_BD_HANDLE)RtlZmalloc(SDIO_RX_BD_NUM * sizeof(SDIO_RX_BD_HANDLE)); + if (NULL == pSDIODev->pRXBDHdl) { + DBG_SDIO_ERR("SDIO_Device_Init: Malloc for RX_BD Handle Err!!\n"); + goto SDIO_INIT_ERR; + } + + for (i=0;ipRXBDHdl + i; + pRxBdHdl->pRXBD = pSDIODev->pRXBDAddrAligned + i; + pRxBdHdl->isFree = 1; + DBG_SDIO_INFO("RX_BD%d @ 0x%x 0x%x\n", i, pRxBdHdl, pRxBdHdl->pRXBD); + } + + + RtlInitListhead(&pSDIODev->FreeRxPktList); // Init the list for free packet handler + /* Allocate memory for RX Packets handler */ + pSDIODev->pRxPktHandler = (SDIO_RX_PACKET *)(RtlZmalloc(sizeof(SDIO_RX_PACKET)*SDIO_RX_PKT_NUM)); + if (NULL == pSDIODev->pRxPktHandler) { + DBG_SDIO_ERR("SDIO_Device_Init: Malloc for RX PKT Handler Err!!\n"); + goto SDIO_INIT_ERR; + } + /* Add all RX packet handler into the Free Queue(list) */ + for (i=0;ipRxPktHandler + i; + RtlListInsertTail(&pPkt->list, &pSDIODev->FreeRxPktList); + } + RtlInitListhead(&pSDIODev->RxPktList); // Init the list for RX packet to be send to the SDIO bus +// RtlInitListhead(&pSDIODev->RecyclePktList); // Init the list for packet to be recycled after the SDIO RX DMA is done + + RtlMutexInit(&pSDIODev->RxMutex); +#if SDIO_DEBUG + RtlMutexInit(&pSDIODev->StatisticMutex); +#endif + /* Create a Semaphone for SDIO Sync control */ +#if !TASK_SCHEDULER_DISABLED + RtlInitSema(&(pSDIODev->TxSema), 0); + if (NULL == pSDIODev->TxSema){ + DBG_SDIO_ERR("SDIO_Device_Init Create Semaphore Err!!\n"); + goto SDIO_INIT_ERR; + } + + RtlInitSema(&(pSDIODev->RxSema), 0); + if (NULL == pSDIODev->RxSema){ + DBG_SDIO_ERR("SDIO_Device_Init Create RX Semaphore Err!!\n"); + goto SDIO_INIT_ERR; + } + + /* create a Mailbox for other driver module to send message to SDIO driver */ + pSDIODev->pMBox = RtlMailboxCreate(MBOX_ID_SDIO, SDIO_MAILBOX_SIZE, &(pSDIODev->RxSema)); + if (NULL == pSDIODev->pMBox) { + DBG_SDIO_ERR("SDIO_Device_Init Create Mailbox Err!!\n"); + goto SDIO_INIT_ERR; + } +#if SDIO_MP_MODE + pSDIODev->pPeriodTimer = RtlTimerCreate("SDIO_Periodical", SDIO_PERIODICAL_TIMER_INTERVAL, SDIO_PeriodicalTimerCallback, pSDIODev, 1); +#endif + /* Create the SDIO task */ +#ifdef PLATFORM_FREERTOS + ret = xTaskCreate( SDIO_TxTask, "SDIO_TX_TASK", ((1024*2)/sizeof(portBASE_TYPE)), (void *)pSDIODev, SDIO_TASK_PRIORITY + PRIORITIE_OFFSET, &pSDIODev->xSDIOTxTaskHandle); + if (pdTRUE != ret ) + { + DBG_SDIO_ERR("SDIO_Device_Init: Create Task Err(%d)!!\n", ret); + goto SDIO_INIT_ERR; + } + + ret = xTaskCreate( SDIO_RxTask, "SDIO_RX_TASK", ((1024*1)/sizeof(portBASE_TYPE)), (void *)pSDIODev, SDIO_TASK_PRIORITY + PRIORITIE_OFFSET, &pSDIODev->xSDIORxTaskHandle); + if (pdTRUE != ret ) + { + DBG_SDIO_ERR("SDIO_Device_Init: Create RX Task Err(%d)!!\n", ret); + goto SDIO_INIT_ERR; + } + +#endif +#endif // end of "#if !TASK_SCHEDULER_DISABLED" +#if SDIO_MP_MODE +//1 for MP mode test only + pSDIODev->MP_ModeEn = 1; +// SDIO_Register_Tx_Callback(pSDIODev, (VOID *)SDIO_MP_Loopback, (VOID *) pSDIODev); +// pSDIODev->MP_LoopBackEn = 1; +//End +#endif +#if TASK_SCHEDULER_DISABLED + /* enable the interrupt */ + SDIO_Interrupt_Init(pSDIODev); + + /* Indicate the Host system that the TX/RX is ready */ + HAL_SDIO_WRITE8(REG_SPDIO_CPU_IND, \ + HAL_SDIO_READ8(REG_SPDIO_CPU_IND)|BIT_SYSTEM_TRX_RDY_IND); +#endif + pSDIODev->CRPWM = HAL_SDIO_READ8(REG_SPDIO_CRPWM); + pSDIODev->CRPWM2 = HAL_SDIO_READ16(REG_SPDIO_CRPWM2); + + // Indicate Host this is a iNIC FW + pSDIODev->CCPWM2 |= CPWM2_INIC_FW_RDY_BIT; + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); + +#if !PURE_SDIO_INIC +#ifdef CONFIG_SOC_PS_MODULE + { + REG_POWER_STATE SDIOPwrState; + + // To register a new peripheral device power state + SDIOPwrState.FuncIdx = SDIOD; + SDIOPwrState.PwrState = ACT; + RegPowerState(SDIOPwrState); + } +#endif +#endif + + DBG_SDIO_INFO("<==SDIO_Device_Init\n"); + + return SUCCESS; + + SDIO_INIT_ERR: +#if !TASK_SCHEDULER_DISABLED + if (pSDIODev->TxSema) { + RtlFreeSema(&pSDIODev->TxSema); + pSDIODev->TxSema = NULL; + } + + if (pSDIODev->RxSema) { + RtlFreeSema(&pSDIODev->RxSema); + pSDIODev->RxSema = NULL; + } +#endif + + if (pSDIODev->RxMutex) { + RtlMutexFree(&pSDIODev->RxMutex); + } +#if SDIO_DEBUG + if (pSDIODev->StatisticMutex) { + RtlMutexFree(&pSDIODev->StatisticMutex); + } +#endif + if (pSDIODev->pRxPktHandler) { + RtlMfree((u8*)pSDIODev->pRxPktHandler, sizeof(SDIO_RX_PACKET)*SDIO_RX_PKT_NUM); + pSDIODev->pRxPktHandler = NULL; + } + + if (pSDIODev->pRXBDHdl) { + RtlMfree((u8 *)pSDIODev->pRXBDHdl, SDIO_RX_BD_NUM * sizeof(SDIO_RX_BD_HANDLE)); + pSDIODev->pRXBDHdl = NULL; + } + + if (pSDIODev->pRXBDAddr) { + RtlMfree((u8 *)pSDIODev->pRXBDAddr, (SDIO_RX_BD_NUM * sizeof(SDIO_RX_BD))+7); + pSDIODev->pRXBDAddr = NULL; + } +#if (CONFIG_INIC_EN == 0) + if (pSDIODev->pTxPktHandler) { + RtlMfree((u8 *)pSDIODev->pTxPktHandler, (sizeof(SDIO_TX_PACKET)*SDIO_TX_PKT_NUM)); + pSDIODev->pTxPktHandler = NULL; + } +#endif + if ((pSDIODev->pTXBDHdl) && (pSDIODev->pTXBDAddr)) { + for (i=0;ipTXBDHdl + i; + if (pTxBdHdl->pTXBD->Address) { + +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX + //free wlan skb here + dev_kfree_skb_any(pTxBdHdl->skb); +#endif +#else + RtlMfree((u8 *)pTxBdHdl->pTXBD->Address, (SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT)); +#endif + pTxBdHdl->pTXBD->Address = (u32)NULL; + } + } + } + + if (pSDIODev->pTXBDHdl) { + RtlMfree((u8 *)pSDIODev->pTXBDHdl, (SDIO_TX_BD_NUM * sizeof(SDIO_TX_BD_HANDLE))); + pSDIODev->pTXBDHdl = NULL; + } + + if (pSDIODev->pTXBDAddr) { + RtlMfree(pSDIODev->pTXBDAddr, ((SDIO_TX_BD_NUM * sizeof(SDIO_TX_BD))+3)); + pSDIODev->pTXBDAddr = NULL; + pSDIODev->pTXBDAddrAligned = NULL; + } + +#if !TASK_SCHEDULER_DISABLED + if (pSDIODev->pMBox) { + RtlMailboxDel(pSDIODev->pMBox); + pSDIODev->pMBox = NULL; + } +#if SDIO_MP_MODE + if (pSDIODev->pPeriodTimer) { + RtlTimerDelete(pSDIODev->pPeriodTimer); + pSDIODev->pPeriodTimer = NULL; + } +#endif +#endif + return FAIL; +} + + +/****************************************************************************** + * Function: SDIO_Device_DeInit + * Desc: SDIO device driver free resource. This function should be called in + * a task. + * 1. Free TX FIFO buffer + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +//TODO: Call this function in a task + +VOID SDIO_Device_DeInit( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + int i=0; + SDIO_TX_BD_HANDLE *pTxBdHdl; + + if (NULL == pSDIODev) + return; + + // Indicate the Host that Ameba is InActived + pSDIODev->CCPWM2 = HAL_SDIO_READ16(REG_SPDIO_CCPWM2); + pSDIODev->CCPWM2 &= ~(CPWM2_ACT_BIT); + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); + +#if !TASK_SCHEDULER_DISABLED + /* Exit the SDIO task */ +#if 0 + // if this function is called by TX Task, then the TX task cannot be stopped + while (1) { + SDIO_SetEvent(pSDIODev, SDIO_EVENT_EXIT); + SDIO_Wakeup_Task(pSDIODev); + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_TX_STOPPED) && + SDIO_IsEventPending(pSDIODev, (u32)SDIO_EVENT_RX_STOPPED)) { + SDIO_ClearEvent(pSDIODev, SDIO_EVENT_EXIT); + break; // break the while loop + } + RtlMsleepOS(10); + i++; + if (i> 100) { + DBG_SDIO_ERR("SDIO_Device_DeInit: Delete SDIO Task Failed with Timeout\n"); + break; + } + } +#endif +#if SDIO_MP_MODE + if (pSDIODev->pPeriodTimer) { + RtlTimerDelete(pSDIODev->pPeriodTimer); + pSDIODev->pPeriodTimer = NULL; + } +#endif + /* Delete the Mailbox */ + if (pSDIODev->pMBox) { + RtlMailboxDel(pSDIODev->pMBox); + pSDIODev->pMBox = NULL; + } + + /* Delete the Semaphore */ + if (pSDIODev->TxSema) { + RtlFreeSema(&pSDIODev->TxSema); + pSDIODev->TxSema = NULL; + } + + if (pSDIODev->RxSema) { + RtlFreeSema(&pSDIODev->RxSema); + pSDIODev->RxSema = NULL; + } +#endif + + if (pSDIODev->RxMutex) { + RtlMutexFree(&pSDIODev->RxMutex); + } +#if SDIO_DEBUG + if (pSDIODev->StatisticMutex) { + RtlMutexFree(&pSDIODev->StatisticMutex); + } +#endif + if (pSDIODev->pRxPktHandler) { + RtlMfree((u8*)pSDIODev->pRxPktHandler, sizeof(SDIO_RX_PACKET)*SDIO_RX_PKT_NUM); + pSDIODev->pRxPktHandler = NULL; + } + + if (pSDIODev->pRXBDHdl) { + RtlMfree((u8 *)pSDIODev->pRXBDHdl, SDIO_RX_BD_NUM * sizeof(SDIO_RX_BD_HANDLE)); + pSDIODev->pRXBDHdl = NULL; + } + + /* Free RX BD */ + if (pSDIODev->pRXBDAddr) { + RtlMfree((u8 *)pSDIODev->pRXBDAddr, (SDIO_RX_BD_NUM * sizeof(SDIO_RX_BD))+7); + pSDIODev->pRXBDAddr = NULL; + } + + /* Free TX FIFO Buffer */ + for (i=0;ipTXBDHdl + i; + if (pTxBdHdl->pTXBD->Address) { +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX + //free wlan skb here + dev_kfree_skb_any(pTxBdHdl->skb); +#endif +#else + RtlMfree((u8 *)pTxBdHdl->pTXBD->Address, (SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT)); +#endif + pTxBdHdl->pTXBD->Address = (u32)NULL; + } + } +#if (CONFIG_INIC_EN == 0) + if (pSDIODev->pTxPktHandler) { + RtlMfree((u8 *)pSDIODev->pTxPktHandler, (sizeof(SDIO_TX_PACKET)*SDIO_TX_PKT_NUM)); + pSDIODev->pTxPktHandler = NULL; + } +#endif + if (pSDIODev->pTXBDHdl) { + RtlMfree((u8 *)pSDIODev->pTXBDHdl, (SDIO_TX_BD_NUM * sizeof(SDIO_TX_BD_HANDLE))); + pSDIODev->pTXBDHdl = NULL; + } + + if (pSDIODev->pTXBDAddr) { + RtlMfree(pSDIODev->pTXBDAddr, ((SDIO_TX_BD_NUM * sizeof(SDIO_TX_BD))+3)); + pSDIODev->pTXBDAddr = NULL; + pSDIODev->pTXBDAddrAligned = NULL; + } + SDIO_Disable_Interrupt(pSDIODev, 0xffff); + SDIO_Interrupt_DeInit(pSDIODev); + + // Reset SDIO DMA + HAL_SDIO_WRITE8(REG_SPDIO_CPU_RST_DMA, BIT_CPU_RST_SDIO_DMA); + + /* Enable Clock for SDIO function */ +// ACTCK_SDIOD_CCTRL(OFF); + + /* SDIO Function Enable */ +// SDIOD_ON_FCTRL(OFF); + SDIOD_OFF_FCTRL(OFF); +} + +#if TASK_SCHEDULER_DISABLED +/****************************************************************************** + * Function: SDIO_TaskUp + * Desc: For the Task scheduler no running case, use this function to run the + * SDIO task main loop. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_TaskUp( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u16 ISRStatus; + +// DiagPrintf("SDIO_TaskUp==>\n"); + pSDIODev->EventSema++; + if (pSDIODev->EventSema > 1000) { + pSDIODev->EventSema = 1000; + } + if (pSDIODev->EventSema == 1) { + while (pSDIODev->EventSema > 0) { + ISRStatus = HAL_SDIO_READ16(REG_SPDIO_CPU_INT_STAS); + pSDIODev->IntStatus |= ISRStatus; + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_STAS, ISRStatus); // clean the ISR + SDIO_SetEvent(pSDIODev, SDIO_EVENT_IRQ|SDIO_EVENT_C2H_DMA_DONE); + + SDIO_TxTask(pSDIODev); + SDIO_RxTask(pSDIODev); + + pSDIODev->EventSema--; + } + } +// DiagPrintf("<==SDIO_TaskUp\n"); +} +#endif + +/****************************************************************************** + * Function: SDIO_IRQ_Handler + * Desc: SDIO device interrupt service routine + * 1. Read & clean the interrupt status + * 2. Wake up the SDIO task to handle the IRQ event + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_IRQ_Handler( + IN VOID *pData +) +{ + PHAL_SDIO_ADAPTER pSDIODev = pData; + u16 ISRStatus; + + ISRStatus = HAL_SDIO_READ16(REG_SPDIO_CPU_INT_STAS); + DBG_SDIO_INFO("%s:ISRStatus=0x%x\n", __FUNCTION__, ISRStatus); + + pSDIODev->IntStatus |= ISRStatus; + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_STAS, ISRStatus); // clean the ISR +#if !TASK_SCHEDULER_DISABLED + if (ISRStatus & BIT_C2H_DMA_OK) { + SDIO_SetEvent(pSDIODev, SDIO_EVENT_C2H_DMA_DONE); + RtlUpSemaFromISR(&pSDIODev->RxSema); + } + + if (ISRStatus & ~BIT_C2H_DMA_OK) { + SDIO_SetEvent(pSDIODev, SDIO_EVENT_IRQ); + RtlUpSemaFromISR(&pSDIODev->TxSema); + } +#else + SDIO_SetEvent(pSDIODev, SDIO_EVENT_IRQ|SDIO_EVENT_C2H_DMA_DONE); + SDIO_TaskUp(pSDIODev); +#endif +} + +/****************************************************************************** + * Function: SDIO_Interrupt_Init + * Desc: SDIO device interrupt initialization. + * 1. Register the ISR + * 2. Initial the IMR register + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Interrupt_Init( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + IRQ_HANDLE SdioIrqHandle; + + pSDIODev->IntMask = BIT_H2C_DMA_OK | BIT_C2H_DMA_OK | BIT_H2C_MSG_INT | BIT_RPWM1_INT | \ + BIT_RPWM2_INT |BIT_H2C_BUS_RES_FAIL | BIT_RXBD_FLAG_ERR_INT; + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_STAS, pSDIODev->IntMask); // Clean pending interrupt first + + SdioIrqHandle.Data = (u32) pSDIODev; + SdioIrqHandle.IrqNum = SDIO_DEVICE_IRQ; + SdioIrqHandle.IrqFun = (IRQ_FUN) SDIO_IRQ_Handler; + SdioIrqHandle.Priority = SDIO_IRQ_PRIORITY; + + InterruptRegister(&SdioIrqHandle); + InterruptEn(&SdioIrqHandle); + + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_MASK, pSDIODev->IntMask); +} + +/****************************************************************************** + * Function: SDIO_Interrupt_DeInit + * Desc: SDIO device interrupt De-Initial. + * 1. UnRegister the ISR + * 2. Initial the IMR register with 0 + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Interrupt_DeInit( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + IRQ_HANDLE SdioIrqHandle; + + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_STAS, 0xffff); // Clean pending interrupt first + + SdioIrqHandle.Data = (u32) pSDIODev; + SdioIrqHandle.IrqNum = SDIO_DEVICE_IRQ; + SdioIrqHandle.Priority = SDIO_IRQ_PRIORITY; + + InterruptDis(&SdioIrqHandle); + InterruptUnRegister(&SdioIrqHandle); +} + +/****************************************************************************** + * Function: SDIO_Enable_Interrupt + * Desc: SDIO enable interrupt by modify the interrupt mask + * + * Para: + * pSDIODev: The SDIO device data structor. + * IntMask: The bit map to enable the interrupt. + ******************************************************************************/ +__inline VOID SDIO_Enable_Interrupt( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 IntMask +) +{ + RtlEnterCritical(); + pSDIODev->IntMask |= IntMask; + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_MASK, pSDIODev->IntMask); + RtlExitCritical(); +} + +/****************************************************************************** + * Function: SDIO_Disable_Interrupt + * Desc: SDIO disable interrupt by modify the interrupt mask + * + * Para: + * pSDIODev: The SDIO device data structor. + * IntMask: The bit map to disable the interrupt. + ******************************************************************************/ +__inline VOID SDIO_Disable_Interrupt( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 IntMask +) +{ + RtlEnterCritical(); + pSDIODev->IntMask &= ~IntMask; + HAL_SDIO_WRITE16(REG_SPDIO_CPU_INT_MASK, pSDIODev->IntMask); + RtlExitCritical(); +} + +/****************************************************************************** + * Function: SDIO_Clear_ISR + * Desc: SDIO clear ISR bit map. + * + * Para: + * pSDIODev: The SDIO device data structor. + * IntMask: The bit map to be clean. + ******************************************************************************/ +__inline VOID SDIO_Clear_ISR( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 IntMask +) +{ + RtlEnterCritical(); + pSDIODev->IntStatus &= ~IntMask; + RtlExitCritical(); +} + +/****************************************************************************** + * Function: SDIO_TxTask + * Desc: The SDIO task handler. This is the main function of the SDIO device + * driver. + * 1. Handle interrupt events. + * * SDIO TX data ready + * * Error handling + * 2. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_TxTask( + IN VOID *pData +) +{ + PHAL_SDIO_ADAPTER pSDIODev = pData; + + /* Initial resource */ +#if !TASK_SCHEDULER_DISABLED + /* enable the interrupt */ + SDIO_Interrupt_Init(pSDIODev); + + // Update the power state indication + pSDIODev->CCPWM2 = HAL_SDIO_READ16(REG_SPDIO_CCPWM2); + pSDIODev->CCPWM2 |= CPWM2_ACT_BIT; + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); + + /* Indicate the Host system that the TX/RX is ready */ + HAL_SDIO_WRITE8(REG_SPDIO_CPU_IND, \ + HAL_SDIO_READ8(REG_SPDIO_CPU_IND)|BIT_SYSTEM_TRX_RDY_IND); +#if SDIO_MP_MODE + if (pSDIODev->pPeriodTimer) { + RtlTimerStart(pSDIODev->pPeriodTimer, 0); + } +#endif +#endif + +#if !TASK_SCHEDULER_DISABLED + for (;;) +#endif + { + /* Task blocked and wait the semaphore(events) here */ +#if !TASK_SCHEDULER_DISABLED + RtlDownSema(&pSDIODev->TxSema); +#endif + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_IRQ)) { + SDIO_ClearEvent(pSDIODev, SDIO_EVENT_IRQ); + SDIO_IRQ_Handler_BH(pSDIODev); + } + + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_TXBD_REFILL)) { + SDIO_ClearEvent(pSDIODev, SDIO_EVENT_TXBD_REFILL); + SDIO_TX_BD_Buf_Refill(pSDIODev); + } + +#if !TASK_SCHEDULER_DISABLED + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_EXIT)) { + break; // break the loop to exit the task + } +#endif + } + +#if !TASK_SCHEDULER_DISABLED +#if SDIO_MP_MODE + if (pSDIODev->pPeriodTimer) { + RtlTimerStop(pSDIODev->pPeriodTimer, 0); + } +#endif + SDIO_SetEvent(pSDIODev, SDIO_EVENT_TX_STOPPED); + DBG_SDIO_INFO("SDIO TX Task Stopped!\n"); +#if ( INCLUDE_vTaskDelete == 1 ) + vTaskDelete(NULL); +#endif +#endif +} + +/****************************************************************************** + * Function: SDIO_RxTask + * Desc: The SDIO RX task handler. This is the main function of the SDIO device + * driver to handle SDIO RX. + * 1. Handle interrupt events. + * * SDIO RX done + * 2. Send RX data back to the host by fill RX_BD to hardware. + * 3. Handle messages from mailbox + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_RxTask( + IN VOID *pData +) +{ + PHAL_SDIO_ADAPTER pSDIODev = pData; + MSG_BLK Mblk; + +#if !TASK_SCHEDULER_DISABLED + for (;;) +#endif + { + /* Task blocked and wait the semaphore(events) here */ +#if !TASK_SCHEDULER_DISABLED + RtlDownSema(&pSDIODev->RxSema); +#endif + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_C2H_DMA_DONE)) { + SDIO_ClearEvent(pSDIODev, SDIO_EVENT_C2H_DMA_DONE); + SDIO_RX_IRQ_Handler_BH(pSDIODev); + } + +#if SDIO_MP_MODE + if (pSDIODev->MP_ContinueRx) { + SDIO_MP_ContinueRx(pSDIODev); + } +#endif // end of "#if SDIO_MP_MODE" + + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_RX_PKT_RDY)) { + SDIO_ClearEvent(pSDIODev, SDIO_EVENT_RX_PKT_RDY); + SDIO_Return_Rx_Data(pSDIODev); + } + +#if !TASK_SCHEDULER_DISABLED + /* handle message block in the mailbox */ + do { + if (_SUCCESS == RtlMailboxReceive(MBOX_ID_SDIO, &Mblk, MBOX_WAIT_NONE, 0)) { + SDIO_Handle_MsgBlk(pSDIODev, &Mblk); + } + else { + break; // no more message pending, break the while loop + } + } while (1); + + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_EXIT)) { + break; // break the loop to exit the task + } +#endif + } + +#if !TASK_SCHEDULER_DISABLED + SDIO_SetEvent(pSDIODev, (u32)SDIO_EVENT_RX_STOPPED); + DBG_SDIO_INFO("SDIO RX Task Stopped!\n"); +#if ( INCLUDE_vTaskDelete == 1 ) + vTaskDelete(NULL); +#endif +#endif +} + + +/****************************************************************************** + * Function: SDIO_Wakeup_Task + * Desc: Send a semaphore to wake up the task. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +static __inline VOID SDIO_Wakeup_Task( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ +#if !TASK_SCHEDULER_DISABLED + RtlUpSema(&pSDIODev->TxSema); + RtlUpSema(&pSDIODev->RxSema); +#else + SDIO_TaskUp(pSDIODev); +#endif +} + +/****************************************************************************** + * Function: SDIO_SetEvent + * Desc: Set an event and wake up SDIO task to handle it. + * + * Para: + * pSDIODev: The SDIO device data structor. + * Event: The event to be set. + ******************************************************************************/ +static VOID SDIO_SetEvent( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 Event +) +{ + RtlEnterCritical(); + pSDIODev->Events |= Event; + RtlExitCritical(); +} + +/****************************************************************************** + * Function: SDIO_ClearEvent + * Desc: Clean a SDIO event. + * + * Para: + * pSDIODev: The SDIO device data structor. + * Event: The event to be cleaned. + ******************************************************************************/ +static VOID SDIO_ClearEvent( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 Event +) +{ + RtlEnterCritical(); + pSDIODev->Events &= ~Event; + RtlExitCritical(); +} + +/****************************************************************************** + * Function: SDIO_IsEventPending + * Desc: To check is a event pending. + * + * Para: + * pSDIODev: The SDIO device data structor. + * Event: The event to check. + ******************************************************************************/ +static BOOL SDIO_IsEventPending( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 Event +) +{ + BOOL ret; + + RtlEnterCritical(); + ret = (pSDIODev->Events & Event) ? 1:0; + RtlExitCritical(); + + return ret; +} + +/****************************************************************************** + * Function: SDIO_IRQ_Handler_BH + * Desc: Process the SDIO IRQ, the button helf. + * 1. SDIO TX data ready. + * 2. H2C command ready. + * 3. Host driver RPWM status updated. + * 4. SDIO RX data transfer done. + * 5. SDIO HW/BUS errors. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_IRQ_Handler_BH( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u32 IntStatus; + + DBG_SDIO_INFO("%s @1 IntStatus=0x%x\n", __FUNCTION__, pSDIODev->IntStatus); + + RtlEnterCritical(); + IntStatus = pSDIODev->IntStatus; + RtlExitCritical(); + + if (IntStatus & BIT_H2C_DMA_OK) { + SDIO_Clear_ISR(pSDIODev, BIT_H2C_DMA_OK); + SDIO_Disable_Interrupt(pSDIODev, BIT_H2C_DMA_OK); + SDIO_TX_FIFO_DataReady(pSDIODev); + SDIO_Enable_Interrupt(pSDIODev, BIT_H2C_DMA_OK); + } + + if (IntStatus & BIT_H2C_MSG_INT) { + SDIO_Clear_ISR(pSDIODev, BIT_H2C_MSG_INT); + SDIO_Process_H2C_IOMsg(pSDIODev); + } + + if (IntStatus & BIT_RPWM1_INT) { + SDIO_Clear_ISR(pSDIODev, BIT_RPWM1_INT); + SDIO_Process_RPWM(pSDIODev); + } + + if (IntStatus & BIT_RPWM2_INT) { + SDIO_Clear_ISR(pSDIODev, BIT_RPWM2_INT); + SDIO_Process_RPWM2(pSDIODev); + } + + if (IntStatus & BIT_SDIO_RST_CMD_INT) { + SDIO_Clear_ISR(pSDIODev, BIT_SDIO_RST_CMD_INT); + SDIO_Reset_Cmd(pSDIODev); + } + + DBG_SDIO_INFO("%s @2 IntStatus=0x%x\n", __FUNCTION__, pSDIODev->IntStatus); +} + +/****************************************************************************** + * Function: SDIO_RX_IRQ_Handler_BH + * Desc: Process the SDIO RX IRQ, the button helf. + * 1. SDIO RX data transfer done. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_RX_IRQ_Handler_BH( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u32 IntStatus; + + RtlEnterCritical(); + IntStatus = pSDIODev->IntStatus; + RtlExitCritical(); + + if (IntStatus & BIT_C2H_DMA_OK) { + SDIO_Clear_ISR(pSDIODev, BIT_C2H_DMA_OK); + RtlDownMutex(&pSDIODev->RxMutex); + pSDIODev->RxFifoBusy = 0; + RtlUpMutex(&pSDIODev->RxMutex); + SDIO_Recycle_Rx_BD(pSDIODev); +// SDIO_Return_Rx_Data(pSDIODev); + } +} + + +/****************************************************************************** + * Function: SDIO_TX_BD_Buf_Refill + * Desc: To refill all TX BD buffer. + * 1. Check all TX BD buffer + * 2. Allocate a new buffer for TX BD buffer is invalid + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_TX_BD_Buf_Refill( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u32 i,j; + PSDIO_TX_BD_HANDLE pTxBdHdl; + #define WAIT_TIMEOUT 100 + + for (i=0;ipTXBDHdl + pSDIODev->TXBDRPtrReg; + if (NULL == (u32*)(pTxBdHdl->pTXBD->Address)) { + for (j=0;jskb = rltk_wlan_alloc_skb(SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); + if(pTxBdHdl->skb) + pTxBdHdl->pTXBD->Address = (u32)pTxBdHdl->skb->tail; +#endif +#else + pTxBdHdl->pTXBD->Address = (u32)RtlMalloc(SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); +#endif + if (NULL == (u32*)(pTxBdHdl->pTXBD->Address)) { + DBG_SDIO_WARN("%s Alloc Mem(size=%d) Failed\n", __FUNCTION__, SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); + RtlMsleepOS(20); + } + else { +#if SDIO_DEBUG + pSDIODev->MemAllocCnt++; +#endif + pSDIODev->TXBDRPtrReg++; + if (pSDIODev->TXBDRPtrReg >= SDIO_TX_BD_NUM) { + pSDIODev->TXBDRPtrReg = 0; + } + HAL_SDIO_WRITE16(REG_SPDIO_TXBD_RPTR, pSDIODev->TXBDRPtrReg); + break; // break the for loop + } + } + if (j == WAIT_TIMEOUT) { + break; // break the for loop + } + } + else { + break; // break the for loop + } + } + + if (pSDIODev->TXBDRPtrReg != pSDIODev->TXBDRPtr) { + DBG_SDIO_ERR("SDIO_TX_BD_Buf_Refill Err: TXBDRPtrReg=%d TXBDRPtr=%d\n", pSDIODev->TXBDRPtrReg, pSDIODev->TXBDRPtr); + } +} + + +/****************************************************************************** + * Function: SDIO_TX_FIFO_DataReady + * Desc: Handle the SDIO FIFO data ready interrupt. + * 1. Send those data to the target driver via callback fun., like WLan. + * 2. Allocate a buffer for the TX BD + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_TX_FIFO_DataReady( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + PSDIO_TX_BD_HANDLE pTxBdHdl; + PSDIO_TX_DESC pTxDesc; + volatile u16 TxBDWPtr=0; + u32 processed_pkt_cnt=0; + u8 isForceBreak=0; + s8 ret=FAIL; + u32 mem_alloc_failed=0; + u32 reg; + + +// DBG_SDIO_INFO("SDIO_TX_FIFO_DataReady==>\n"); + + TxBDWPtr = HAL_SDIO_READ16(REG_SPDIO_TXBD_WPTR); + if (TxBDWPtr == pSDIODev->TXBDRPtr) { + if ((pSDIODev->IntStatus & BIT_TXFIFO_H2C_OVF) == 0) { + DBG_SDIO_WARN("SDIO TX Data Read False Triggered!!, TXBDWPtr=0x%x\n", TxBDWPtr); + return; + } + else { + reg = HAL_SDIO_READ32(REG_SPDIO_AHB_DMA_CTRL); + DBG_SDIO_WARN("SDIO TX Overflow Case: Reg DMA_CTRL==0x%x %x %x %x\n", (reg>> 24)&0xff , (reg>>16)&0xff, (reg>>8)&0xff, (reg)&0xff); + } + } + + do { + DBG_SDIO_INFO("SDIO_TX_DataReady: TxBDWPtr=%d TxBDRPtr=%d\n", TxBDWPtr, pSDIODev->TXBDRPtr); + pTxBdHdl = pSDIODev->pTXBDHdl + pSDIODev->TXBDRPtr; + pTxDesc = (PSDIO_TX_DESC)(pTxBdHdl->pTXBD->Address); + + DBG_SDIO_INFO("SDIO_TX_DataReady: PktSz=%d Offset=%d\n", pTxDesc->txpktsize, pTxDesc->offset); + if ((pTxDesc->txpktsize + pTxDesc->offset) <= (SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT)) { + // use the callback function to fordward this packet to target(WLan) driver + if (pSDIODev->Tx_Callback) { +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX + ret = pSDIODev->Tx_Callback(pSDIODev->pTxCb_Adapter, (u8*)pTxBdHdl->skb, pTxDesc->offset, pTxDesc->txpktsize); // includes TX Desc +#else + ret = pSDIODev->Tx_Callback(pSDIODev->pTxCb_Adapter, (u8*)pTxBdHdl->pTXBD->Address, pTxDesc->offset, pTxDesc->txpktsize); // includes TX Desc +#endif +#else + ret = pSDIODev->Tx_Callback(pSDIODev->pTxCb_Adapter, (u8*)pTxBdHdl->pTXBD->Address, pTxDesc->offset, pTxDesc->txpktsize); // includes TX Desc +#endif +#if 0 + ret = pSDIODev->Tx_Callback(pSDIODev->pTxCb_Adapter, // doesn't include TX Desc + (u8*)(pTxBdHdl->pTXBD->Address+pTxDesc->offset), + pTxDesc->txpktsize); +#endif + } + else { + ret = FAIL; + DBG_SDIO_ERR("SDIO TX_Callback is Null!\n"); + } + } + else { + // Invalid packet, Just drop it + DBG_SDIO_WARN("SDIO_TX_DataReady Err: Incorrect TxDesc, PktSz=%d Offset=%d BufSize=%d\n", pTxDesc->txpktsize, pTxDesc->offset, \ + (SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT)); + ret = SUCCESS; // pretend we call the TX callback OK + } + processed_pkt_cnt++; + if (SUCCESS != ret) { + // may be is caused by TX queue is full, so we skip it and try again later + isForceBreak = 1; + break; // break the while loop + } + else { +#if SDIO_MP_MODE + pSDIODev->MP_TxPktCnt++; + pSDIODev->MP_TxByteCnt += pTxDesc->txpktsize; + + pSDIODev->MP_TxPktCntInPeriod++; + pSDIODev->MP_TxByteCntInPeriod += pTxDesc->txpktsize; +#endif + pSDIODev->TXBDRPtr++; + if (pSDIODev->TXBDRPtr >= SDIO_TX_BD_NUM) { + pSDIODev->TXBDRPtr = 0; + } + + // allocate a new buffer for this TX BD + // buf once if the memory allocation failed, we will try it later + if (mem_alloc_failed == 0) { +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_TX//or use bss for tx bd, not need to re-allocate memory + //allocate wlan skb for each TX BD + pTxBdHdl->skb = rltk_wlan_alloc_skb(SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); + if(pTxBdHdl->skb) + pTxBdHdl->pTXBD->Address = (u32)pTxBdHdl->skb->tail; + else + pTxBdHdl->pTXBD->Address = (u32)NULL; +#endif +#else + // Allocate buffer for each TX BD + pTxBdHdl->pTXBD->Address = (u32)RtlMalloc(SDIO_TX_BD_BUF_USIZE*SDIO_TX_BUF_SZ_UNIT); +#endif + if (NULL == (u32*)(pTxBdHdl->pTXBD->Address)) { + // memory allocate error + // once memory allocate failed, stop to allocate new buffer for TX BD buffer + //, we refill TX BD buffer later + DBG_SDIO_WARN("%s: Alloc new TX BD Buf Failed\n", __FUNCTION__); + mem_alloc_failed++; + SDIO_SetEvent(pSDIODev, SDIO_EVENT_TXBD_REFILL); + } + else { +#if SDIO_DEBUG + pSDIODev->MemAllocCnt++; +#endif + pSDIODev->TXBDRPtrReg = pSDIODev->TXBDRPtr; + HAL_SDIO_WRITE16(REG_SPDIO_TXBD_RPTR, pSDIODev->TXBDRPtrReg); + } + } + else { + pTxBdHdl->pTXBD->Address = (u32)NULL; + } + } + + TxBDWPtr = HAL_SDIO_READ16(REG_SPDIO_TXBD_WPTR); + if (isForceBreak) { + break; // break the TX FIFO DMA Done processing + } + } while (pSDIODev->TXBDRPtr != TxBDWPtr); + + // if not all TX data were processed, set an event to trigger SDIO_Task to process them later + if (isForceBreak) { + DBG_SDIO_WARN("SDIO_TX Force Break: TXBDWP=0x%x TXBDRP=0x%x\n", TxBDWPtr, pSDIODev->TXBDRPtr); + RtlEnterCritical(); + if ((pSDIODev->IntStatus & BIT_TXFIFO_H2C_OVF) != 0) { + if (pSDIODev->TXBDRPtr != TxBDWPtr) { + pSDIODev->IntStatus &= ~BIT_TXFIFO_H2C_OVF; + } + } + pSDIODev->IntStatus |= BIT_H2C_DMA_OK; + RtlExitCritical(); + SDIO_SetEvent(pSDIODev, SDIO_EVENT_IRQ); +#if !TASK_SCHEDULER_DISABLED + RtlUpSema(&pSDIODev->TxSema); +#else + SDIO_TaskUp(pSDIODev); +#endif + } + else { + if ((pSDIODev->IntStatus & BIT_TXFIFO_H2C_OVF) != 0) { + SDIO_Clear_ISR(pSDIODev, BIT_TXFIFO_H2C_OVF); + } + } +} + +/****************************************************************************** + * Function: SDIO_Alloc_Rx_Pkt + * Desc: Allocate a RX Packet Handle from the queue. + * + * Para: + * pSDIODev: The SDIO device data structor. + * + * Return: + * The allocated RX packet handler. + ******************************************************************************/ +PSDIO_RX_PACKET SDIO_Alloc_Rx_Pkt( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + _LIST *plist; + SDIO_RX_PACKET *pPkt; + u32 loop_cnt; + + RtlDownMutex(&pSDIODev->RxMutex); + if (RtlIsListEmpty(&pSDIODev->FreeRxPktList)) { + RtlUpMutex(&pSDIODev->RxMutex); + loop_cnt = 0; + do { + pPkt =(SDIO_RX_PACKET *)RtlZmalloc(sizeof(SDIO_RX_PACKET)); + if (NULL != pPkt) { + pPkt->isDyna = 1; // this packet handler is dynamic allocated + DBG_SDIO_WARN("Warn! No Free RX PKT, Use Dyna Alloc\n"); + } + else { + RtlMsleepOS(10); + loop_cnt++; + if (loop_cnt > 100) { + DBG_SDIO_ERR("SDIO_Alloc_Rx_Pkt: Err!! Allocate RX PKT Failed!!\n"); + break; + } + } + }while (NULL == pPkt); + return pPkt; + } + + plist = RtlListGetNext(&pSDIODev->FreeRxPktList); + pPkt = CONTAINER_OF(plist, SDIO_RX_PACKET, list); + + RtlListDelete(&pPkt->list); + RtlUpMutex(&pSDIODev->RxMutex); + return pPkt; +} + +/****************************************************************************** + * Function: SDIO_Free_Rx_Pkt + * Desc: Put a RX Packet Handle back to the queue. + * + * Para: + * pSDIODev: The SDIO device data structor. + * pPkt: The packet handler to be free. + * + ******************************************************************************/ +VOID SDIO_Free_Rx_Pkt( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN PSDIO_RX_PACKET pPkt +) +{ + if (pPkt->isDyna) { + RtlMfree((u8 *)pPkt, sizeof(SDIO_RX_PACKET)); + } + else { + RtlDownMutex(&pSDIODev->RxMutex); + RtlListInsertTail(&pPkt->list, &pSDIODev->FreeRxPktList); + RtlUpMutex(&pSDIODev->RxMutex); + } +} + +/****************************************************************************** + * Function: SDIO_Recycle_Rx_BD + * Desc: To recycle some RX BD when C2H RX DMA done. + * 1. Free the RX packet. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Recycle_Rx_BD ( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + SDIO_RX_BD_HANDLE *pRxBdHdl; + SDIO_RX_BD *pRXBD; + u32 PktSize; + u32 FreeCnt=0; // for debugging + + DBG_SDIO_INFO("SDIO_Recycle_Rx_BD==> %d %d\n", HAL_SDIO_READ16(REG_SPDIO_RXBD_C2H_RPTR), pSDIODev->RXBDRPtr); + SDIO_Disable_Interrupt(pSDIODev, BIT_C2H_DMA_OK); + while (HAL_SDIO_READ16(REG_SPDIO_RXBD_C2H_RPTR) != pSDIODev->RXBDRPtr) + { + pRxBdHdl = pSDIODev->pRXBDHdl + pSDIODev->RXBDRPtr; + pRXBD = pSDIODev->pRXBDAddrAligned + pSDIODev->RXBDRPtr; + if (!pRxBdHdl->isFree) { + if (pRxBdHdl->isPktEnd && (NULL != pRxBdHdl->pPkt)) { + /* Free this packet */ + // TODO: The RX_DESC format may needs to be refined + PktSize = pRxBdHdl->pPkt->RxDesc.pkt_len; +#if SDIO_MP_MODE + if ((pSDIODev->MP_CRxPktPendingCnt > 0)) { + pSDIODev->MP_CRxPktPendingCnt--; + } + + if (((pSDIODev->MP_CRxPktCnt == 0) && (pSDIODev->MP_CRxPktPendingCnt == 0)) || + (SDIO_CRX_DYNA_BUF == pSDIODev->MP_ContinueRxMode)) +#endif + { +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_RX + dev_kfree_skb_any(pRxBdHdl->pPkt->skb); + pRxBdHdl->pPkt->skb = NULL; +#else + inic_sdio_free_data((u8 *) (pRxBdHdl->pPkt->pData)); +#endif + pRxBdHdl->pPkt->pData = NULL; +#else + RtlMfree((u8 *) (pRxBdHdl->pPkt->pData), (pRxBdHdl->pPkt->Offset+PktSize)); // free packet buffer +#if SDIO_DEBUG + RtlDownMutex(&pSDIODev->StatisticMutex); + pSDIODev->MemAllocCnt--; + RtlUpMutex(&pSDIODev->StatisticMutex); +#endif +#endif +#if SDIO_MP_MODE + pSDIODev->pMP_CRxBuf = NULL; +#endif + } + + _memset((void *)&(pRxBdHdl->pPkt->RxDesc), 0, sizeof(SDIO_RX_DESC)); + RtlDownMutex(&pSDIODev->RxMutex); + RtlListInsertTail(&pRxBdHdl->pPkt->list, &pSDIODev->FreeRxPktList); // Put packet handle to free queue + RtlUpMutex(&pSDIODev->RxMutex); + FreeCnt++; + pRxBdHdl->isPktEnd = 0; + pRxBdHdl->pPkt = NULL; + DBG_SDIO_INFO("SDIO_Recycle_Rx_BD: Recycle Pkt, RXBDRPtr=%d\n", pSDIODev->RXBDRPtr); +#if SDIO_MP_MODE + pSDIODev->MP_RxPktCnt++; + pSDIODev->MP_RxByteCnt += PktSize; + + pSDIODev->MP_RxPktCntInPeriod++; + pSDIODev->MP_RxByteCntInPeriod += PktSize; +#endif + } + _memset((void *)pRXBD , 0, sizeof(SDIO_RX_BD)); // clean this RX_BD + pRxBdHdl->isFree = 1; + } + else { + DBG_SDIO_WARN("SDIO_Recycle_Rx_BD: Warring, Recycle a Free RX_BD,RXBDRPtr=%d\n",pSDIODev->RXBDRPtr); + } + pSDIODev->RXBDRPtr++; + if (pSDIODev->RXBDRPtr >= SDIO_RX_BD_NUM) { + pSDIODev->RXBDRPtr -= SDIO_RX_BD_NUM; + } + } + SDIO_Enable_Interrupt(pSDIODev, BIT_C2H_DMA_OK); + DBG_SDIO_INFO("<==SDIO_Recycle_Rx_BD(%d)\n", FreeCnt); + +} + +/****************************************************************************** + * Function: SDIO_Process_H2C_IOMsg + * Desc: Handle the interrupt for HC2 message ready. Read the H2C_MSG register + * and process the H2C message. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Process_H2C_IOMsg( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u32 H2CMsg; + + // TODO: define H2C message type & format, currently we have 30 bits message only, may needs to extend the HW register + H2CMsg = HAL_SDIO_READ32(REG_SPDIO_CPU_H2C_MSG); + DBG_SDIO_INFO("H2C_MSG: 0x%x\n", H2CMsg); + // TODO: May needs to handle endian free + switch (H2CMsg) + { + default: + break; + } + // TODO: Some H2C message needs to be fordward to WLan driver +} + +/****************************************************************************** + * Function: SDIO_Send_C2H_IOMsg + * Desc: Send C2H message to the Host. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Send_C2H_IOMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u32 *C2HMsg +) +{ + u32 TmpC2HMsg; + + // TODO: define C2H message type & format, currently we have 30 bits message only, may needs to extend the HW register + + // TODO: May needs to handle endian free + TmpC2HMsg = HAL_SDIO_READ32(REG_SPDIO_CPU_C2H_MSG); + TmpC2HMsg = ((TmpC2HMsg ^ (u32)BIT(31)) & (u32)BIT(31)) | *C2HMsg; + HAL_SDIO_WRITE32(REG_SPDIO_CPU_C2H_MSG, TmpC2HMsg); +} + +/****************************************************************************** + * Function: SDIO_Process_H2C_PktMsg + * Desc: Handle the packet H2C message which from block write(CMD53). + * + * Para: + * pSDIODev: The SDIO device data structor. + * H2CMsg: point to the buffer of the H2C message received. + ******************************************************************************/ +VOID SDIO_Process_H2C_PktMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u8 *H2CMsg +) +{ + + // TODO: define H2C message type & format + DBG_SDIO_INFO("H2C_MSG: 0x%x\n", *H2CMsg); + // TODO: May needs to handle endian free + // TODO: Some H2C message needs to be fordward to WLan driver +} + +/****************************************************************************** + * Function: SDIO_Send_C2H_PktMsg + * Desc: To send a C2H message to the Host through the block read command. + * + * Para: + * pSDIODev: The SDIO device data structor. + * H2CMsg: point to the buffer of the H2C message received. + * MsgLen: The length of this message. + ******************************************************************************/ +u8 SDIO_Send_C2H_PktMsg( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u8 *C2HMsg, + IN u16 MsgLen +) +{ + u8 *MsgBuf; + PSDIO_RX_DESC pRxDesc; + SDIO_RX_PACKET *pPkt; + + // TODO: define H2C message type & format + DBG_SDIO_INFO("C2H_MSG: 0x%x\n", *C2HMsg); + // TODO: May needs to handle endian free + + MsgBuf = RtlZmalloc(MsgLen); + if (NULL == MsgBuf) { + DBG_SDIO_ERR("SDIO_Send_C2H_PktMsg: Malloc Err!!\n"); + return FAIL; + } + _memcpy((void *)(MsgBuf), (void *)C2HMsg, MsgLen); + + pPkt = SDIO_Alloc_Rx_Pkt(pSDIODev); + if (pPkt == NULL) { + DBG_SDIO_ERR("RX Callback Err!! No Free RX PKT!\n"); + return FAIL; + } + pRxDesc = &pPkt->RxDesc; + pRxDesc->type = SDIO_CMD_C2H; + pRxDesc->pkt_len = MsgLen; + pRxDesc->offset = sizeof(SDIO_RX_DESC); + pPkt->pData = MsgBuf; + pPkt->Offset = 0; + RtlDownMutex(&pSDIODev->RxMutex); + RtlListInsertTail(&pPkt->list, &pSDIODev->RxPktList); + pSDIODev->RxInQCnt++; + RtlUpMutex(&pSDIODev->RxMutex); + SDIO_SetEvent(pSDIODev, SDIO_EVENT_RX_PKT_RDY); +#if !TASK_SCHEDULER_DISABLED + if (pSDIODev->RxInQCnt == 1) { + RtlUpSema(&pSDIODev->RxSema); + } +#else + SDIO_TaskUp(pSDIODev); +#endif + + return SUCCESS; + +} + +#ifdef CONFIG_SOC_PS_MODULE +/****************************************************************************** + * Function: SDIO_Wakeup_From_PG + * Desc: To handle the process of system wakeup from power gated. + * + * Para: None + ******************************************************************************/ +VOID SDIO_Wakeup_From_PG(VOID) +{ + ConfigDebugErr = 0xffffffff; + ConfigDebugInfo = _DBG_SDIO_; + ConfigDebugWarn = _DBG_SDIO_; + + HalCpuClkConfig(CLK_200M); + VectorTableInitRtl8195A(0x1FFFFFFC); + +#if CONFIG_CHIP_C_CUT + HalReInitPlatformLogUartV02(); +#else + PSHalInitPlatformLogUart(); +#endif + +#ifdef CONFIG_TIMER_MODULE +#if CONFIG_CHIP_C_CUT + HalInitPlatformTimerV02(); +#else + HalReInitPlatformTimer(); +#endif +// HalDelayUs(1000); +#endif + + InfraStart(); +} +#endif + +#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1) +VOID SDIO_Pre_Sleep_Callback(u32 expected_idle_time){ + /* Indicate the Host system that the TX/RX is not ready */ + HAL_SDIO_WRITE8(REG_SPDIO_CPU_IND, \ + HAL_SDIO_READ8(REG_SPDIO_CPU_IND)&~BIT_SYSTEM_TRX_RDY_IND); +} +VOID SDIO_Post_Sleep_Callback(u32 expected_idle_time){ + /* Indicate the Host system that the TX/RX is ready */ + HAL_SDIO_WRITE8(REG_SPDIO_CPU_IND, \ + HAL_SDIO_READ8(REG_SPDIO_CPU_IND)|BIT_SYSTEM_TRX_RDY_IND); +} +#endif + +/****************************************************************************** + * Function: SDIO_Process_RPWM + * Desc: To handle RPWM interrupt. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +u8 SDIO_Process_RPWM( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u8 rpwm; + + rpwm = HAL_SDIO_READ8(REG_SPDIO_CRPWM); + + DBG_SDIO_INFO ("RPWM1: 0x%x\n", rpwm); + // TODO: forward this RPWM message to WLan + return 0; +} + +/****************************************************************************** + * Function: SDIO_Process_RPWM + * Desc: To handle RPWM interrupt. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +u8 SDIO_Process_RPWM2( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u16 rpwm; + u32 reg_value;; + PRAM_FUNCTION_START_TABLE pRamStartFun = (PRAM_FUNCTION_START_TABLE) __ram_start_table_start__; + + rpwm = HAL_SDIO_READ16(REG_SPDIO_CRPWM2); + + DBG_SDIO_INFO ("RPWM2: 0x%x\n", rpwm); + +#ifdef CONFIG_SOC_PS_MODULE + if ((rpwm&RPWM2_TOGGLE_BIT) != (pSDIODev->CRPWM2&RPWM2_TOGGLE_BIT)) { + pSDIODev->CRPWM2 = rpwm; + // Tgoole bit changed, means it's a new RPWM command + if ((rpwm & RPWM2_ACT_BIT) == 0) { + // request to enter sleep mode + pSDIODev->CCPWM2 = HAL_SDIO_READ16(REG_SPDIO_CCPWM2); + pSDIODev->CCPWM2 &= ~(CPWM2_ACT_BIT); + +#if PURE_SDIO_INIC + SDIO_Device_DeInit(pSDIODev); +#endif + if ((rpwm & RPWM2_DSTANDBY_BIT) == 0) { + pSDIODev->CCPWM2 &= ~(CPWM2_DSTANDBY_BIT); + if((rpwm & RPWM2_CG_BIT)){ + //enter clock gated state + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); +#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1) + add_wakeup_event(SLEEP_WAKEUP_BY_SDIO); + register_pre_sleep_callback(SDIO_Pre_Sleep_Callback); + register_post_sleep_callback(SDIO_Post_Sleep_Callback); + release_wakelock(WAKELOCK_SDIO_DEVICE); +#endif + } + else{ + // enter power gated state + if ((rpwm & RPWM2_FBOOT_BIT)) { + pSDIODev->CCPWM2 |= CPWM2_FBOOT_BIT; + // setup the trap to call the wakeup callback when booting + reg_value = HAL_READ32(PERI_ON_BASE, REG_SOC_FUNC_EN); + reg_value |= BIT(29); + HAL_WRITE32(PERI_ON_BASE, REG_SOC_FUNC_EN, reg_value); + // Assign the RAM start address after boot from wakeup + pRamStartFun->RamWakeupFun = SDIO_Wakeup_From_PG; + } + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); + +#if PURE_SDIO_INIC + SleepPG(SLP_SDIO, 0); +#endif + } + } else { + // enter Deep Standby state + pSDIODev->CCPWM2 |= CPWM2_DSTANDBY_BIT; + pSDIODev->CCPWM2 &= ~(CPWM2_FBOOT_BIT); + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); +#if PURE_SDIO_INIC + { + u8 gpio_option, i; + u16 gpio_pin, gpio_en, gpio_act, gpio_lv; + + + gpio_option = 0; + gpio_pin = RPWM2_WKPIN_A5_BIT; + gpio_lv = RPWM2_PIN_A5_LV_BIT; + gpio_en = BIT0; + gpio_act = BIT4; + // Loop 4 to check 4 GPIO wake up event + for (i=0;i<4;i++) { + if (rpwm & gpio_pin) { + gpio_option |= gpio_en; + if (rpwm & gpio_lv) { + // Active High + gpio_option |= gpio_act; + } + } + gpio_pin = gpio_pin << 1; + gpio_lv = gpio_lv << 1; + gpio_en = gpio_en << 1; + gpio_act = gpio_act << 1; + } + + DeepStandby(DSTBY_GPIO, 0, gpio_option); + } +#endif + } +#if !PURE_SDIO_INIC + { + REG_POWER_STATE SDIOPwrState; + u8 HwState; + + SDIOPwrState.FuncIdx = SDIOD; + QueryRegPwrState(SDIOD, &(SDIOPwrState.PwrState), &HwState); + + if (SDIOPwrState.PwrState == ACT) { + SDIOPwrState.PwrState = INACT; + RegPowerState(SDIOPwrState); + } + } +#endif + } else { +#if !PURE_SDIO_INIC + +#if defined(configUSE_WAKELOCK_PMU) && (configUSE_WAKELOCK_PMU == 1) + acquire_wakelock(WAKELOCK_SDIO_DEVICE); +#endif + + // Request to Active SDIO iNIC + REG_POWER_STATE SDIOPwrState; + + // Let the power management task know SDIO is in active + SDIOPwrState.FuncIdx = SDIOD; + SDIOPwrState.PwrState = ACT; + RegPowerState(SDIOPwrState); + + pSDIODev->CCPWM2 |= CPWM2_ACT_BIT; + pSDIODev->CCPWM2 ^= CPWM2_TOGGLE_BIT; + HAL_SDIO_WRITE16(REG_SPDIO_CCPWM2, pSDIODev->CCPWM2); +#endif + } + } +#endif // #ifdef CONFIG_SOC_PS_MODULE + return 0; +} + +/****************************************************************************** + * Function: SDIO_Reset_Cmd + * Desc: Handle the SDIO Reset Command interrupt. We did nothing currently. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Reset_Cmd( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + // TODO: + return; +} + +/****************************************************************************** + * Function: SDIO_Return_Rx_Data + * Desc: To send all packets in the RX packet list to the Host system via the + * SDIO bus. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_Return_Rx_Data( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + SDIO_RX_PACKET *pPkt=NULL; + SDIO_RX_DESC *pRxDesc; + SDIO_RX_BD_HANDLE *pRxBdHdl; + _LIST *plist; + SDIO_RX_BD *pRXBD; + u32 Offset=0; + u16 RxBdWrite=0; // to count how much RX_BD used in a Transaction + u16 RxBdRdPtr=0; // RX_BD read pointer + u32 pkt_size; + u8 isForceBreak=0; + u8 isListEmpty; +#if SDIO_RX_PKT_SIZE_OVER_16K + u8 needed_rxbd_num; +#endif + +// DBG_SDIO_INFO("SDIO_Return_Rx_Data==> RXBDWPtr=%d\n", pSDIODev->RXBDWPtr); + RtlDownMutex(&pSDIODev->RxMutex); + if (RtlIsListEmpty(&pSDIODev->RxPktList)) { + RtlUpMutex(&pSDIODev->RxMutex); +// DBG_SDIO_INFO("SDIO_Return_Rx_Data: Queue is empty\n"); + return; + } + + if (pSDIODev->RxFifoBusy) { + RtlUpMutex(&pSDIODev->RxMutex); + SDIO_SetEvent(pSDIODev, SDIO_EVENT_RX_PKT_RDY); + return; + } + RtlUpMutex(&pSDIODev->RxMutex); + + RxBdRdPtr = pSDIODev->RXBDRPtr; + + // since we always need to wait the HW to fetch RX BD done, + // so it seems no need to check the RX BD Read Pointer again +#if 0 + /* Check if we shoule handle the RX_BD recycle ? */ + if (RxBdRdPtr != HAL_SDIO_READ16(REG_SPDIO_RXBD_C2H_RPTR)) { + SDIO_Recycle_Rx_BD(pSDIODev); + RxBdRdPtr = pSDIODev->RXBDRPtr; + } +#endif + do { + /* check if RX_BD available */ + RtlDownMutex(&pSDIODev->RxMutex); + plist = RtlListGetNext(&pSDIODev->RxPktList); + RtlUpMutex(&pSDIODev->RxMutex); + pPkt = CONTAINER_OF(plist, SDIO_RX_PACKET, list); + pRxDesc = &(pPkt->RxDesc); +#if SDIO_RX_PKT_SIZE_OVER_16K + needed_rxbd_num = ((pRxDesc->pkt_len - 1)/MAX_RX_BD_BUF_SIZE) + MIN_RX_BD_SEND_PKT; +#endif + if (RxBdRdPtr != pSDIODev->RXBDWPtr) { + if (pSDIODev->RXBDWPtr > RxBdRdPtr) { +#if SDIO_RX_PKT_SIZE_OVER_16K + if ((pSDIODev->RXBDWPtr - RxBdRdPtr) >= (SDIO_RX_BD_NUM - needed_rxbd_num)) +#else + if ((pSDIODev->RXBDWPtr - RxBdRdPtr) >= (SDIO_RX_BD_NUM - MIN_RX_BD_SEND_PKT)) +#endif + { + DBG_SDIO_WARN("SDIO_Return_Rx_Data: No Available RX_BD, ReadPtr=%d WritePtr=%d\n", \ + RxBdRdPtr, pSDIODev->RXBDWPtr); + isForceBreak = 1; + break; // break the while loop + } + } + else { +#if SDIO_RX_PKT_SIZE_OVER_16K + if ((RxBdRdPtr - pSDIODev->RXBDWPtr) <= needed_rxbd_num) +#else + if ((RxBdRdPtr - pSDIODev->RXBDWPtr) <= MIN_RX_BD_SEND_PKT) +#endif + { + DBG_SDIO_WARN("SDIO_Return_Rx_Data: No Available RX_BD, ReadPtr=%d WritePtr=%d\n", RxBdRdPtr, pSDIODev->RXBDWPtr); + isForceBreak = 1; + break; // break the while loop + } + } + } + + RtlDownMutex(&pSDIODev->RxMutex); + RtlListDelete(&pPkt->list); // remove it from the SDIO RX packet Queue + pSDIODev->RxInQCnt--; + RtlUpMutex(&pSDIODev->RxMutex); + + // TODO: Add RX_DESC before the packet + + /* a SDIO RX packet will use at least 2 RX_BD, the 1st one is for RX_Desc, + other RX_BDs are for packet payload */ + /* Use a RX_BD to transmit RX_Desc */ + pRXBD = pSDIODev->pRXBDAddrAligned + pSDIODev->RXBDWPtr; // get the RX_BD head + pRxBdHdl = pSDIODev->pRXBDHdl + pSDIODev->RXBDWPtr; + if (!pRxBdHdl->isFree) { + DBG_SDIO_ERR("SDIO_Return_Rx_Data: Allocated a non-free RX_BD\n"); + } + pRxBdHdl->isFree = 0; + pRxBdHdl->pPkt = pPkt; + pRXBD->FS = 1; + pRXBD->PhyAddr = (u32)((u8 *)pRxDesc); + pRXBD->BuffSize = sizeof(SDIO_RX_DESC); + pRxBdHdl->isPktEnd = 0; + pSDIODev->RXBDWPtr += 1; + if (pSDIODev->RXBDWPtr >= SDIO_RX_BD_NUM) { + pSDIODev->RXBDWPtr -= SDIO_RX_BD_NUM; + } + RxBdWrite++; + + /* Take RX_BD to transmit packet payload */ + pkt_size = pRxDesc->pkt_len; + Offset = 0; + do { + pRXBD = pSDIODev->pRXBDAddrAligned + pSDIODev->RXBDWPtr; // get the RX_BD head + pRxBdHdl = pSDIODev->pRXBDHdl + pSDIODev->RXBDWPtr; + pRxBdHdl->isFree = 0; + pRxBdHdl->pPkt = pPkt; + pRXBD->FS = 0; + pRXBD->PhyAddr = (u32)(((u8 *)pPkt->pData)+pPkt->Offset); +#if SDIO_RX_PKT_SIZE_OVER_16K + if ((pkt_size - Offset) <= MAX_RX_BD_BUF_SIZE) { + pRXBD->BuffSize = pkt_size - Offset; + pRxBdHdl->isPktEnd = 1; + } + else { + pRXBD->BuffSize = MAX_RX_BD_BUF_SIZE; + pRxBdHdl->isPktEnd = 0; + DBG_SDIO_INFO("SDIO_Return_Rx_Data: Split RX_BD, Offset=%d PktSize=%d\n", \ + Offset, pkt_size); + } +#else + if (pkt_size > MAX_RX_BD_BUF_SIZE) { + // if come to here, please enable "SDIO_RX_PKT_SIZE_OVER_16K" + DBG_SDIO_ERR("SDIO_Return_Rx_Data: The Packet Size bigger than 16K\n"); + pkt_size = MAX_RX_BD_BUF_SIZE; + } + pRXBD->BuffSize = pkt_size; + pRxBdHdl->isPktEnd = 1; +#endif + Offset += pRXBD->BuffSize; + // Move the RX_BD Write pointer forward + RxBdWrite++; + pSDIODev->RXBDWPtr += 1; + if (pSDIODev->RXBDWPtr >= SDIO_RX_BD_NUM) { + pSDIODev->RXBDWPtr -= SDIO_RX_BD_NUM; + } + + if (Offset >= pkt_size) { + pRXBD->LS = 1; +// HAL_SDIO_WRITE16(REG_SPDIO_RXBD_C2H_WPTR, pSDIODev->RXBDWPtr); +// HAL_SDIO_WRITE8(REG_SPDIO_HCI_RX_REQ, BIT_HCI_RX_REQ); +// DBG_SDIO_INFO("SDIO_Return_Rx_Data:RXBDWPtr=%d\n", pSDIODev->RXBDWPtr); + } + } while (Offset < pkt_size); + + if (RxBdWrite >= (SDIO_RX_BD_NUM - MIN_RX_BD_SEND_PKT)) { + isForceBreak = 1; + break; // break the while loop + } + + RtlDownMutex(&pSDIODev->RxMutex); + isListEmpty = RtlIsListEmpty(&pSDIODev->RxPktList); + RtlUpMutex(&pSDIODev->RxMutex); + } while(!isListEmpty); + + if (RxBdWrite > 0) { + RtlDownMutex(&pSDIODev->RxMutex); + HAL_SDIO_WRITE16(REG_SPDIO_RXBD_C2H_WPTR, pSDIODev->RXBDWPtr); + HAL_SDIO_WRITE8(REG_SPDIO_HCI_RX_REQ, BIT_HCI_RX_REQ); + pSDIODev->RxFifoBusy = 1; + RtlUpMutex(&pSDIODev->RxMutex); + } + + if (isForceBreak) { +// SDIO_Recycle_Rx_BD(pSDIODev); + // function end with insufficient resource, set event to try again later + SDIO_SetEvent(pSDIODev, SDIO_EVENT_RX_PKT_RDY); +#if !TASK_SCHEDULER_DISABLED + RtlMsleepOS(1); // no resource, sleep a while + RtlUpSema(&pSDIODev->RxSema); +#else + SDIO_TaskUp(pSDIODev); +#endif + } + DBG_SDIO_INFO("SDIO_Return_Rx_Data(%d)<==\n", RxBdWrite); + +} + +/****************************************************************************** + * Function: SDIO_Register_Tx_Callback + * Desc: For a TX data target driver to register its TX callback function, so + * the SDIO driver can use it to fordward a TX packet to the target driver. + * + * Para: + * pSDIODev: point to the SDIO device handler + * CallbackFun: The function pointer of the callback + * pAdapter: a pointer will be use to call the registered CallBack function. + * It can be used to point to a handler of the caller, like WLan + * Adapter. + ******************************************************************************/ +VOID SDIO_Register_Tx_Callback( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN s8 (*CallbackFun)(VOID *pAdapter, u8 *pPkt, u16 Offset, u16 PktSize), + IN VOID *pAdapter +) +{ + pSDIODev->Tx_Callback = CallbackFun; + pSDIODev->pTxCb_Adapter = pAdapter; +} + +/****************************************************************************** + * Function: SDIO_Rx_Callback + * Desc: The callback function for an packet receiving, which be called from + * the Target (WLan) driver to send a packet to the SDIO host. + * + * Para: + * pSDIODev: Point to the SDIO device data structer. + * pData: Point to the head of the data to be return to the Host system. + * Length: The length of the data to be send, in byte. + * + * Return: + * The result, SUCCESS or FAIL. + ******************************************************************************/ +s8 SDIO_Rx_Callback( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN VOID *pData, + IN u16 Offset, + IN u16 PktSize, + IN u8 CmdType +) +{ + PSDIO_RX_DESC pRxDesc; + SDIO_RX_PACKET *pPkt; +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_RX + struct sk_buff *skb = (struct sk_buff *)pData; +#endif +#endif + + pPkt = SDIO_Alloc_Rx_Pkt(pSDIODev); + if (pPkt == NULL) { + DBG_SDIO_ERR("RX Callback Err!! No Free RX PKT!\n"); + return FAIL; + } + pRxDesc = &pPkt->RxDesc; + pRxDesc->type = CmdType; + pRxDesc->pkt_len = PktSize; +#if CONFIG_INIC_EN +#if CONFIG_INIC_SKB_RX + pRxDesc->offset = sizeof(SDIO_RX_DESC)+Offset;//for data alignment reason + pPkt->skb = skb; + pPkt->pData = skb->data; + pPkt->Offset = 0; +#else //CONFIG_INIC_SKB_RX + pRxDesc->offset = sizeof(SDIO_RX_DESC); + pPkt->pData = pData; + pPkt->Offset = Offset; +#endif//CONFIG_INIC_SKB_RX +#else //CONFIG_INIC_EN + pRxDesc->offset = sizeof(SDIO_RX_DESC); + pPkt->pData = pData; + pPkt->Offset = Offset; +#endif //CONFIG_INIC_EN + RtlDownMutex(&pSDIODev->RxMutex); + RtlListInsertTail(&pPkt->list, &pSDIODev->RxPktList); + pSDIODev->RxInQCnt++; + RtlUpMutex(&pSDIODev->RxMutex); + SDIO_SetEvent(pSDIODev, SDIO_EVENT_RX_PKT_RDY); +#if !TASK_SCHEDULER_DISABLED + if (pSDIODev->RxInQCnt == 1) { + RtlUpSema(&pSDIODev->RxSema); + } +#else + SDIO_TaskUp(pSDIODev); +#endif + + return SUCCESS; +} + +/****************************************************************************** + * Function: SDIO_Handle_MsgBlk + * Desc: Process a message block. + * + * Para: + * pSDIODev: Point to the SDIO device data structer. + * MSG_BLK: The message block to be processed. + * Length: The length of the data to be send, in byte. + * + * Return: + * The result, SUCCESS or FAIL. + ******************************************************************************/ +s8 SDIO_Handle_MsgBlk( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN MSG_BLK *pMblk +) +{ + s8 ret=SUCCESS; + + DBG_SDIO_INFO("SDIO_Handle_MsgBlk==> MsgType=%d\n", pMblk->MsgType); + switch (pMblk->MsgType) { + case MSG_SDIO_RX_PKT: + ret = SDIO_Rx_Callback(pSDIODev, pMblk->pBuf, pMblk->Reserved, pMblk->DateLen, SDIO_CMD_RX_ETH); //pMblk->Reserved = Offset + if (SUCCESS != ret) { + // failed to send this packet to the host, drop it + RtlMfree((u8 *) pMblk->pBuf, (pMblk->Reserved + pMblk->DateLen)); // pMblk->Reserved = Offset +#if SDIO_DEBUG + RtlDownMutex(&pSDIODev->StatisticMutex); + pSDIODev->MemAllocCnt--; + RtlUpMutex(&pSDIODev->StatisticMutex); +#endif +#if SDIO_MP_MODE + pSDIODev->MP_RxDropCnt++; +#endif + } + break; + + case MSG_SDIO_C2H: + break; + + case MSG_SDIO_RPWM: + break; + + default: + DBG_SDIO_WARN("SDIO_Handle_MsgBlk: UnKnown MsgType %d\n", pMblk->MsgType); + break; + } + + return ret; +} + +#if SDIO_MP_MODE + +/****************************************************************************** + * Function: SDIO_PeriodicalTimerCallback + * Desc: The callback function of the 1 Sec timer. It be used to statistic the + * throughput and update the status or something need to do periodically. + * + * Para: + * pContex: this pointer actually is the pointer of the SDIO device. + * + * Return: None + ******************************************************************************/ +VOID SDIO_PeriodicalTimerCallback( + void *pContex +) +{ + PHAL_SDIO_ADAPTER pSDIODev = pContex; + + if (SDIO_IsEventPending(pSDIODev, SDIO_EVENT_DUMP)) { + SDIO_StatisticDump(pSDIODev); +} +} + +#if !TASK_SCHEDULER_DISABLED +/****************************************************************************** + * Function: SDIO_MP_Task + * Desc: The SDIO MP test task handler. This is the main function of the SDIO + * device MP test mode. + * + * Para: + * pSDIODev: The SDIO device data structor. + ******************************************************************************/ +VOID SDIO_MP_Task( + IN VOID *pData +) +{ + PHAL_SDIO_ADAPTER pSDIODev = pData; + MSG_BLK Mblk_r; + MSG_BLK Mblk_w; + SDIO_MP_RX_PACKET *pRxPkt; + _LIST *plist; + int malloc_err_cnt=0; + + DiagPrintf("SDIO_MP_Task Started...\n"); + RtlInitListhead(&pSDIODev->MP_RxPktList); + + /* Initial resource */ + for (;;) + { + /* Task blocked and wait the semaphore(events) here */ + RtlDownSema(&pSDIODev->MP_EventSema); + /* handle message block in the mailbox */ + do { + if (_SUCCESS == RtlMailboxReceive(MBOX_ID_SDIO_MP, &Mblk_r, MBOX_WAIT_NONE, 0)) { + switch (Mblk_r.MsgType) { + case MSG_SDIO_MP_LOOP_TXPKT: + pRxPkt = NULL; + malloc_err_cnt = 0; + do { + pRxPkt = (SDIO_MP_RX_PACKET *)RtlZmalloc(sizeof(SDIO_MP_RX_PACKET)); + if (NULL != pRxPkt) { + pRxPkt->pData = Mblk_r.pBuf; + pRxPkt->Offset = Mblk_r.Reserved; + pRxPkt->DataLen = Mblk_r.DateLen; + RtlListInsertTail(&pRxPkt->list, &pSDIODev->MP_RxPktList); + } + else { + RtlMsleepOS(10); + malloc_err_cnt++; + if (malloc_err_cnt > 100) { + DBG_SDIO_ERR("SDIO_MP_Task: Malloc for Rx Pkt Failed\n"); + // no memory to handle this packet, drop it + RtlMfree(Mblk_r.pBuf, (Mblk_r.Reserved+Mblk_r.DateLen)); + pSDIODev->MP_RxDropCnt++; +#if SDIO_DEBUG + RtlDownMutex(&pSDIODev->StatisticMutex); + pSDIODev->MemAllocCnt--; + RtlUpMutex(&pSDIODev->StatisticMutex); +#endif + break; // break the while loop + } + } + }while (NULL == pRxPkt); + break; + + default: + DBG_SDIO_WARN("SDIO_MP_TASK: UnKnown MsgType %d\n", Mblk_r.MsgType); + break; + } + } + else { + break; // no more message pending, break the while loop + } + } while (1); + + while (!RtlIsListEmpty(&pSDIODev->MP_RxPktList)) { + plist = RtlListGetNext(&pSDIODev->MP_RxPktList); + pRxPkt = CONTAINER_OF(plist, SDIO_MP_RX_PACKET, list); + RtlListDelete(&pRxPkt->list); + + Mblk_w.MsgType = MSG_SDIO_RX_PKT; + Mblk_w.pBuf = pRxPkt->pData; + Mblk_w.Reserved = pRxPkt->Offset; + Mblk_w.DateLen = pRxPkt->DataLen; + if (_SUCCESS != RtlMailboxSendToBack(MBOX_ID_SDIO, &Mblk_w, 2000, 0)) { + DBG_SDIO_ERR("SDIO_MP_Task: Send MSG_SDIO_RX_PKT FAILED\n"); + RtlListInsertHead(&pRxPkt->list, &pSDIODev->MP_RxPktList); + break; + } + else { + RtlMfree((u8 *)pRxPkt, sizeof(SDIO_MP_RX_PACKET)); + } + } + + RtlEnterCritical(); + if (pSDIODev->MP_Events & SDIO_EVENT_EXIT) { + pSDIODev->MP_Events &= ~SDIO_EVENT_EXIT; + RtlExitCritical(); + DBG_SDIO_INFO("SDIO_MP_Task Exiting...\n"); + break; // break the loop to exit the task + } + RtlExitCritical(); + } + + RtlEnterCritical(); + pSDIODev->MP_Events |= SDIO_EVENT_MP_STOPPED; + RtlExitCritical(); + DBG_SDIO_INFO("SDIO_MP_Task Stoped!\n"); +#if ( INCLUDE_vTaskDelete == 1 ) + vTaskDelete(NULL); +#endif +} +#endif // end of "#if !TASK_SCHEDULER_DISABLED" + +/****************************************************************************** + * Function: SDIO_MapMPCmd + * Desc: Map a MP command string to a MP command type. + * + * Para: + * CmdStr: point to the command string buffer + * + * return: + * The MP command type + * + ******************************************************************************/ +u8 SDIO_MapMPCmd( + IN char *CmdStr, + IN u16 *Offset +) +{ + char cmd_str[16]; + u16 i; + u16 str_len=0; + u16 entry_num; + u8 mp_cmd=0xff; + + for (i=0;i<16;i++) { + if ((' ' != *(CmdStr+i)) && ('=' != *(CmdStr+i)) && (*(CmdStr+i))) { + cmd_str[i] = *(CmdStr+i); + str_len++; + } + else { + break; + } + } + + *Offset = str_len+1; + + entry_num = sizeof(SDIO_MPCmdTable)/sizeof(SDIO_MP_CMD); + + for (i=0;iMP_ModeEn); + DiagPrintf("MP_Loopback=%d\n", pSDIODev->MP_LoopBackEn); + DiagPrintf("TX: Packet Count=%d, Byte Count=%d\n", pSDIODev->MP_TxPktCnt, pSDIODev->MP_TxByteCnt); + DiagPrintf("TX: TX_BD_WPTR=%d, TX_BD_RPTR=%d\n", HAL_SDIO_READ16(REG_SPDIO_TXBD_WPTR), HAL_SDIO_READ16(REG_SPDIO_TXBD_RPTR)); + DiagPrintf("RX: Packet Count=%d, Byte Count=%d\n", pSDIODev->MP_RxPktCnt, pSDIODev->MP_RxByteCnt); + DiagPrintf("RX: RXBDWPtr=%d, RXBDRPtr=%d\n", pSDIODev->RXBDWPtr, pSDIODev->RXBDRPtr); +#if SDIO_DEBUG + DiagPrintf("RX: InQueueCount=%d MemAllocatedCnt=%d\n", pSDIODev->RxInQCnt, pSDIODev->MemAllocCnt); +#endif + DiagPrintf("TxDropPkt=%d RxDropPkt=%d\n", pSDIODev->MP_TxDropCnt, pSDIODev->MP_RxDropCnt); +} + +/****************************************************************************** + * Function: SDIO_StatisticDump + * Desc: Periodical dump SDIO throughput and other status. + * + * Para: + * pSDIODev: The SDIO device data structor. + * + * return: None + * + ******************************************************************************/ +VOID SDIO_StatisticDump( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + unsigned long tp; // throughput + u32 oldest_byte_cnt; + u32 tx_avg_tp=0; // in Kbps + u32 rx_avg_tp=0; // in Kbps + + // calculate the TX throughput + if (pSDIODev->TxAvgWinCnt >= SDIO_AVG_TP_WIN_SIZE) { + // flush the oldest one and add the newest one + oldest_byte_cnt = pSDIODev->MP_TxAvgTPWin[pSDIODev->OldestTxAvgWinIdx]; + + if (pSDIODev->MP_TxAvgTPWinSum >= oldest_byte_cnt) { + pSDIODev->MP_TxAvgTPWinSum -= oldest_byte_cnt; + pSDIODev->MP_TxAvgTPWin[pSDIODev->OldestTxAvgWinIdx] = pSDIODev->MP_TxByteCntInPeriod; + pSDIODev->OldestTxAvgWinIdx++; + if (SDIO_AVG_TP_WIN_SIZE <= pSDIODev->OldestTxAvgWinIdx) { + pSDIODev->OldestTxAvgWinIdx = 0; + } + + if (0 == pSDIODev->MP_TxAvgTPWinSum) { + // reset the statistic + pSDIODev->TxAvgWinCnt = 0; + pSDIODev->OldestTxAvgWinIdx = 0; + } + } + else { + pSDIODev->MP_TxAvgTPWinSum = 0; + // reset the statistic + if (pSDIODev->MP_TxByteCntInPeriod > 0) + pSDIODev->TxAvgWinCnt = 1; + else + pSDIODev->TxAvgWinCnt = 0; + pSDIODev->OldestTxAvgWinIdx = 0; + } + pSDIODev->MP_TxAvgTPWinSum += pSDIODev->MP_TxByteCntInPeriod; + tx_avg_tp = (pSDIODev->MP_TxAvgTPWinSum << 3) / (SDIO_PERIODICAL_TIMER_INTERVAL * SDIO_AVG_TP_WIN_SIZE); + } + else { + if ((pSDIODev->MP_TxAvgTPWinSum > 0) || (pSDIODev->MP_TxByteCntInPeriod > 0)) { + pSDIODev->MP_TxAvgTPWinSum += pSDIODev->MP_TxByteCntInPeriod; + pSDIODev->MP_TxAvgTPWin[pSDIODev->TxAvgWinCnt] = pSDIODev->MP_TxByteCntInPeriod; + pSDIODev->TxAvgWinCnt++; + tx_avg_tp = (pSDIODev->MP_TxAvgTPWinSum << 3) / (SDIO_PERIODICAL_TIMER_INTERVAL * pSDIODev->TxAvgWinCnt); + } + } + + // calculate the RX throughput + if (pSDIODev->RxAvgWinCnt >= SDIO_AVG_TP_WIN_SIZE) { + // flush the oldest one and add the newest one + oldest_byte_cnt = pSDIODev->MP_RxAvgTPWin[pSDIODev->OldestRxAvgWinIdx]; + if (pSDIODev->MP_RxAvgTPWinSum >= oldest_byte_cnt) { + pSDIODev->MP_RxAvgTPWinSum -= oldest_byte_cnt; + pSDIODev->MP_RxAvgTPWin[pSDIODev->OldestRxAvgWinIdx] = pSDIODev->MP_RxByteCntInPeriod; + pSDIODev->OldestRxAvgWinIdx++; + if (SDIO_AVG_TP_WIN_SIZE <= pSDIODev->OldestRxAvgWinIdx) { + pSDIODev->OldestRxAvgWinIdx = 0; + } + + if (0 == pSDIODev->MP_RxAvgTPWinSum) { + // reset the statistic + pSDIODev->RxAvgWinCnt = 0; + pSDIODev->OldestRxAvgWinIdx = 0; + } + } + else { + pSDIODev->MP_RxAvgTPWinSum = 0; + // reset the statistic + if (pSDIODev->MP_RxByteCntInPeriod > 0) + pSDIODev->RxAvgWinCnt = 1; + else + pSDIODev->RxAvgWinCnt = 0; + + pSDIODev->OldestRxAvgWinIdx = 0; + } + pSDIODev->MP_RxAvgTPWinSum += pSDIODev->MP_RxByteCntInPeriod; + + rx_avg_tp = (pSDIODev->MP_RxAvgTPWinSum << 3) / (SDIO_PERIODICAL_TIMER_INTERVAL * SDIO_AVG_TP_WIN_SIZE); + } + else { + if ((pSDIODev->MP_RxAvgTPWinSum > 0) || (pSDIODev->MP_RxByteCntInPeriod > 0)) { + pSDIODev->MP_RxAvgTPWinSum += pSDIODev->MP_RxByteCntInPeriod; + pSDIODev->MP_RxAvgTPWin[pSDIODev->RxAvgWinCnt] = pSDIODev->MP_RxByteCntInPeriod; + pSDIODev->RxAvgWinCnt++; + rx_avg_tp = (pSDIODev->MP_RxAvgTPWinSum << 3) / (SDIO_PERIODICAL_TIMER_INTERVAL * pSDIODev->RxAvgWinCnt); + } + } + + if ((pSDIODev->MP_TxByteCntInPeriod > 0) || (pSDIODev->MP_RxByteCntInPeriod > 0)) { + DiagPrintf("SDIO Dump:\n"); + tp = (pSDIODev->MP_TxByteCntInPeriod << 3)/(SDIO_PERIODICAL_TIMER_INTERVAL/1000); + if (tp > 1000) { + DiagPrintf("TX: Packet Count=%d, Byte Count=%d, TP=%d Kbps\n", pSDIODev->MP_TxPktCntInPeriod, pSDIODev->MP_TxByteCntInPeriod, tp/1000); + } + else { + DiagPrintf("TX: Packet Count=%d, Byte Count=%d, TP=%d bps\n", pSDIODev->MP_TxPktCntInPeriod, pSDIODev->MP_TxByteCntInPeriod, tp); + } + tp = (pSDIODev->MP_RxByteCntInPeriod << 3)/(SDIO_PERIODICAL_TIMER_INTERVAL/1000); + if (tp > 1000) { + DiagPrintf("RX: Packet Count=%d, Byte Count=%d, TP=%d Kbps\n", pSDIODev->MP_RxPktCntInPeriod, pSDIODev->MP_RxByteCntInPeriod, tp/1000); + } + else { + DiagPrintf("RX: Packet Count=%d, Byte Count=%d, TP=%d bps\n", pSDIODev->MP_RxPktCntInPeriod, pSDIODev->MP_RxByteCntInPeriod, tp); + } + + pSDIODev->MP_TxPktCntInPeriod = 0; + pSDIODev->MP_TxByteCntInPeriod = 0; + pSDIODev->MP_RxPktCntInPeriod = 0; + pSDIODev->MP_RxByteCntInPeriod = 0; + } + + if ((tx_avg_tp > 0) || (rx_avg_tp > 0)) { + DiagPrintf("TX Avg TP=%d Kbps, RX Avg TP=%d Kbps\n", tx_avg_tp, rx_avg_tp); + } +} + +/****************************************************************************** + * Function: SDIO_MP_Loopback + * Desc: The loopback test function for MP mode. + * + * Para: + * pAdapter: a pointer which got from the callback function register, + * here it point to the SDIO device itself. + * pData: The pointer of the SDIO TX data buffer. + * PktSize: The size (in byte) of this SDIO TX data. + * + * return: + * The result of this function, SUCCESS or FAILED. + * + ******************************************************************************/ +s8 SDIO_MP_Loopback( + IN VOID *pAdapter, + IN u8 *pData, + IN u16 Offset, + IN u16 PktSize +) +{ +#if TASK_SCHEDULER_DISABLED + PHAL_SDIO_ADAPTER pSDIODev=(PHAL_SDIO_ADAPTER)pAdapter; +#endif + s8 ret; + + MSG_BLK MBlk; + +// DBG_SDIO_INFO("SDIO_MP_Loopback==>\n"); + + +#if TASK_SCHEDULER_DISABLED + ret = SDIO_Rx_Callback(pSDIODev, pData, Offset, PktSize, SDIO_CMD_RX_ETH); +#else + // Mailbox test, use message to replace call SDIO_Rx_Callback directly + MBlk.MsgType = MSG_SDIO_MP_LOOP_TXPKT; + MBlk.pBuf = pData; + MBlk.Reserved = (u8)Offset; + MBlk.DateLen = PktSize; + if (_SUCCESS == RtlMailboxSendToBack(MBOX_ID_SDIO_MP, &MBlk, 2000, 0)) { + ret = SUCCESS; + } + else { + DBG_SDIO_ERR("SDIO_MP_Loopback FAILED\n"); + ret = FAIL; + } +#endif + return ret; +} + +/****************************************************************************** + * Function: SDIO_MP_ContinueTx + * Desc: The continue TX test function for MP mode. We just drop the TX packet. + * + * Para: + * pAdapter: a pointer which got from the callback function register, + * here it point to the SDIO device itself. + * pData: The pointer of the SDIO TX data buffer. + * PktSize: The size (in byte) of this SDIO TX data. + * + * return: + * The result of this function, SUCCESS or FAILED. + * + ******************************************************************************/ +s8 SDIO_MP_ContinueTx( + IN VOID *pAdapter, + IN u8 *pData, + IN u16 Offset, + IN u16 PktSize +) +{ + PHAL_SDIO_ADAPTER pSDIODev=(PHAL_SDIO_ADAPTER)pAdapter; + + RtlMfree(pData, (Offset+PktSize)); +#if SDIO_DEBUG + RtlDownMutex(&pSDIODev->StatisticMutex); + pSDIODev->MemAllocCnt--; + RtlUpMutex(&pSDIODev->StatisticMutex); +#endif + return SUCCESS; +} + +/****************************************************************************** + * Function: SDIO_MP_ContinueRx + * Desc: Process Continue RX test. + * + * Para: + * pSDIODev: The SDIO device adapter. + * + * return: None + * + ******************************************************************************/ +VOID SDIO_MP_ContinueRx( + IN PHAL_SDIO_ADAPTER pSDIODev +) +{ + u8 *pRxBuf=NULL; + s8 ret; + + while (1) { + if (pSDIODev->MP_CRxPktPendingCnt > 10) { + break; + } + + if (pSDIODev->MP_ContinueRxMode == SDIO_CRX_STATIC_BUF) { + pRxBuf = pSDIODev->pMP_CRxBuf; + } + else if (pSDIODev->MP_ContinueRxMode == SDIO_CRX_DYNA_BUF) { + pRxBuf = RtlMalloc(pSDIODev->MP_CRxSize+26); // 26: Wlan header +#if SDIO_DEBUG + pSDIODev->MemAllocCnt++; +#endif + if (NULL != pRxBuf) { + _memcpy(pRxBuf, MP_WlanHdr, 26); + _memset((pRxBuf+26), 0x3E, pSDIODev->MP_CRxSize); + } + } + + if (NULL != pRxBuf) { + ret = SDIO_Rx_Callback(pSDIODev, pRxBuf, 0, pSDIODev->MP_CRxSize+26, SDIO_CMD_RX_ETH); + if (SUCCESS == ret) { + if (pSDIODev->MP_CRxPktCnt > 0) { + pSDIODev->MP_CRxPktCnt--; + pSDIODev->MP_CRxPktPendingCnt++; + if (0 == pSDIODev->MP_CRxPktCnt) { + pSDIODev->MP_ContinueRx = 0; + break; // break the while loop + } + } + if (pSDIODev->MP_CRxPktPendingCnt > 10) { + break; + } + } + else { + if (pSDIODev->MP_ContinueRxMode == SDIO_CRX_DYNA_BUF) { + RtlMfree(pRxBuf, pSDIODev->MP_CRxSize+26); +#if SDIO_DEBUG + pSDIODev->MemAllocCnt--; +#endif + } +#if !TASK_SCHEDULER_DISABLED + RtlMsleepOS(10); // no resource, sleep a while + RtlUpSema(&pSDIODev->RxSema); +#else + SDIO_TaskUp(pSDIODev); +#endif + break; + } + } + else { +#if !TASK_SCHEDULER_DISABLED + RtlMsleepOS(10); // no resource, sleep a while + RtlUpSema(&pSDIODev->RxSema); +#else + SDIO_TaskUp(pSDIODev); +#endif + break; + } + } +} + +/****************************************************************************** + * Function: SDIO_DeviceMPApp + * Desc: To handle SDIO MP command + * + * Para: + * pData: point to the command buffer + * + ******************************************************************************/ +VOID SDIO_DeviceMPApp( + IN PHAL_SDIO_ADAPTER pSDIODev, + IN u16 argc, + IN u8 *argv[] +) +{ + u8 cmd_type; + u16 offset=0; + u32 arg1, arg2; + int ret; + int i; + + DBG_SDIO_INFO("==>MP_App: arg_num=%d cmd_str=%s\n", argc, (char *)argv[0]); + + cmd_type = SDIO_MapMPCmd((char *)argv[0], &offset); + DBG_SDIO_INFO("MP_App: MP_Cmdtype=%d\n", cmd_type); + + switch (cmd_type) + { + case SDIO_MP_START: + if (!pSDIODev->MP_ModeEn) { + pSDIODev->MP_ModeEn = 1; + pSDIODev->MP_TxPktCnt = 0; /* SDIO TX packet count */ + pSDIODev->MP_RxPktCnt = 0; /* SDIO RX packet count */ + pSDIODev->MP_TxByteCnt = 0; /* SDIO TX Byte count */ + pSDIODev->MP_RxByteCnt = 0; /* SDIO RX Byte count */ + DiagPrintf("SDIO MP Started!\n"); + } + else { + DiagPrintf("In SDIO MP Mode already!\n"); + } + break; + + case SDIO_MP_STOP: + pSDIODev->MP_ModeEn = 0; + DiagPrintf("SDIO MP Stoped!\n"); + break; + + case SDIO_MP_LOOPBACK: + DBG_SDIO_INFO("MP_App: argv[1]=%s\n", argv[1]); + if (pSDIODev->MP_ModeEn == 0) { + DiagPrintf("Not in MP mode!! Please start MP mode first.\n"); + break; + } + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 10); + if (arg1) { + if (pSDIODev->MP_LoopBackEn == 0) { + // Create a Task for MP loopback test +#if !TASK_SCHEDULER_DISABLED + RtlInitSema(&(pSDIODev->MP_EventSema), 0); + if (NULL == pSDIODev->MP_EventSema){ + DBG_SDIO_ERR("SDIO MP_Loopback Create Semaphore Err!!\n"); + break; // break the switch case + } + + /* create a Mailbox for other driver module to send message to SDIO driver */ + pSDIODev->pMP_MBox = RtlMailboxCreate(MBOX_ID_SDIO_MP, SDIO_MAILBOX_SIZE, &(pSDIODev->MP_EventSema)); + if (NULL == pSDIODev->pMBox) { + DBG_SDIO_ERR("SDIO MP_Loopback Create Mailbox Err!!\n"); + break; // break the switch case + } + + /* Create the SDIO task */ +#ifdef PLATFORM_FREERTOS + ret = xTaskCreate( SDIO_MP_Task, "SDIO_MP_TASK", ((256*4)/sizeof(portBASE_TYPE)), (void *)pSDIODev, SDIO_MP_TASK_PRIORITY, &pSDIODev->MP_TaskHandle); + if (pdTRUE != ret ) + { + DBG_SDIO_ERR("SDIO MP Create Task Err(%d)!!\n", ret); + break; + } +#endif + DiagPrintf("SDIO MP Task Created\n"); +#endif // end of "#if !TASK_SCHEDULER_DISABLED" + + // Backup origional TX Callback function + pSDIODev->pTxCallback_Backup = pSDIODev->Tx_Callback; + pSDIODev->pTxCb_Adapter_Backup = (VOID *)pSDIODev->pTxCb_Adapter; + DiagPrintf("Register SDIO TX Callback with Loopback function\n"); + SDIO_Register_Tx_Callback(pSDIODev, &SDIO_MP_Loopback, (VOID *) pSDIODev); + pSDIODev->MP_LoopBackEn = 1; + } + else { + DiagPrintf("SDIO MP LoopBack is On already!\n"); + } + } + else { + if (pSDIODev->MP_LoopBackEn) { + // Restore origional TX Callback function + DiagPrintf("Restore SDIO TX Callback...\n"); + SDIO_Register_Tx_Callback(pSDIODev, pSDIODev->pTxCallback_Backup, pSDIODev->pTxCb_Adapter_Backup); + pSDIODev->MP_LoopBackEn = 0; +#if !TASK_SCHEDULER_DISABLED + /* Exit the SDIO task */ + if (pSDIODev->MP_TaskHandle) { + RtlEnterCritical(); + pSDIODev->MP_Events |= SDIO_EVENT_EXIT; + RtlExitCritical(); + RtlUpSema(&pSDIODev->MP_EventSema); + i=0; + while (1) { + RtlEnterCritical(); + if (pSDIODev->MP_Events & SDIO_EVENT_MP_STOPPED) { + RtlExitCritical(); + break; + } + RtlExitCritical(); + RtlMsleepOS(10); + i++; + if (i> 100) { + DBG_SDIO_ERR("Delete SDIO MP Task Failed with Timeout\n"); + break; + } + } + } + + /* Delete the Mailbox */ + if (pSDIODev->pMP_MBox) { + RtlMailboxDel(pSDIODev->pMP_MBox); + pSDIODev->pMP_MBox = NULL; + } + + /* Delete the Semaphore */ + if (pSDIODev->MP_EventSema) { + RtlFreeSema(&pSDIODev->MP_EventSema); + pSDIODev->MP_EventSema = NULL; + } + DiagPrintf("SDIO MP Task Deleted\n"); +#endif + + } + } + DiagPrintf("SDIO MP LoopBack=%d\n", pSDIODev->MP_LoopBackEn); + break; + + case SDIO_MP_STATUS: + SDIO_DumpMPStatus(pSDIODev); + break; + + case SDIO_MP_READ_REG8: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 16); + DiagPrintf("SDIO_Reg[%x]=%x\n", arg1, HAL_SDIO_READ8(arg1)); + break; + + case SDIO_MP_READ_REG16: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 16); + DiagPrintf("SDIO_Reg[%x]=%x\n", arg1, HAL_SDIO_READ16(arg1)); + break; + + case SDIO_MP_READ_REG32: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 16); + DiagPrintf("SDIO_Reg[%x]=%x\n", arg1, HAL_SDIO_READ32(arg1)); + break; + + case SDIO_MP_WRITE_REG8: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 16); + arg2 = Strtoul((const u8*)(argv[2]), (u8 **)NULL, 16); + HAL_SDIO_WRITE8(arg1, arg2); + DiagPrintf("Write Reg[%x]=%x, Readback:%x\n", arg1, arg2, HAL_SDIO_READ8(arg1)); + break; + + case SDIO_MP_WRITE_REG16: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 16); + arg2 = Strtoul((const u8*)(argv[2]), (u8 **)NULL, 16); + HAL_SDIO_WRITE16(arg1, arg2); + DiagPrintf("Write Reg[%x]=%x, Readback:%x\n", arg1, arg2, HAL_SDIO_READ16(arg1)); + break; + + case SDIO_MP_WRITE_REG32: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 16); + arg2 = Strtoul((const u8*)(argv[2]), (u8 **)NULL, 16); + HAL_SDIO_WRITE32(arg1, arg2); + DiagPrintf("Write Reg[%x]=%x, Readback:%x\n", arg1, arg2, HAL_SDIO_READ32(arg1)); + break; + + case SDIO_MP_WAKEUP: + SDIO_Wakeup_Task(pSDIODev); + break; + + case SDIO_MP_DUMP: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 10); + if (arg1) { + if (!SDIO_IsEventPending(pSDIODev, SDIO_EVENT_DUMP)) { + // reset statistic + for (i=0;iMP_TxAvgTPWin[i] = 0; + pSDIODev->MP_RxAvgTPWin[i] = 0; + } + pSDIODev->MP_TxAvgTPWinSum = 0; + pSDIODev->MP_RxAvgTPWinSum = 0; + pSDIODev->OldestTxAvgWinIdx = 0; + pSDIODev->OldestRxAvgWinIdx = 0; + pSDIODev->TxAvgWinCnt = 0; + pSDIODev->RxAvgWinCnt = 0; + } + SDIO_SetEvent(pSDIODev, SDIO_EVENT_DUMP); + } + else { + SDIO_ClearEvent(pSDIODev, SDIO_EVENT_DUMP); + } + DiagPrintf("SDIO Dump %d\n", arg1); + break; + + case SDIO_MP_CTX: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 10); + if (arg1) { + if (!pSDIODev->MP_ContinueTx) { + // Backup origional TX Callback function + pSDIODev->pTxCallback_Backup = pSDIODev->Tx_Callback; + pSDIODev->pTxCb_Adapter_Backup = (VOID *)pSDIODev->pTxCb_Adapter; + DiagPrintf("Register SDIO TX Callback with Continue TX Test function\n"); + SDIO_Register_Tx_Callback(pSDIODev, &SDIO_MP_ContinueTx, (VOID *) pSDIODev); + pSDIODev->MP_ContinueTx = 1; + } + DiagPrintf("SDIO Continue TX Test Enabled\n"); + } + else { + if (pSDIODev->MP_ContinueTx) { + // Restore origional TX Callback function + DiagPrintf("Restore SDIO TX Callback...\n"); + SDIO_Register_Tx_Callback(pSDIODev, pSDIODev->pTxCallback_Backup, pSDIODev->pTxCb_Adapter_Backup); + pSDIODev->MP_ContinueTx = 0; + DiagPrintf("SDIO Continue TX Test Disabled\n"); + } + else { + DiagPrintf("SDIO Continue TX Test Didn't Enabled\n"); + } + } + break; + + case SDIO_MP_CRX: + case SDIO_MP_CRX_DA: + if(SDIO_MP_CRX == cmd_type) { + pSDIODev->MP_ContinueRxMode = SDIO_CRX_STATIC_BUF; + } + else if (SDIO_MP_CRX_DA == cmd_type) { + pSDIODev->MP_ContinueRxMode = SDIO_CRX_DYNA_BUF; + } + + if (pSDIODev->MP_ContinueRx) { + DiagPrintf("SDIO Continue RX Test Running\n"); + break; + } + pSDIODev->MP_ContinueRx = 1; + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 10); + if (arg1 < 16) { + DiagPrintf("SDIO RX Test Min Pkt Size is 16\n"); + arg1 = 16; + } + + if (arg1 > 4096) { + DiagPrintf("SDIO RX Test Max Pkt Size is 4096\n"); + arg1 = 4096; + } + pSDIODev->MP_CRxSize = arg1; + arg2 = Strtoul((const u8*)(argv[2]), (u8 **)NULL, 10); + pSDIODev->MP_CRxPktCnt = arg2; + if (arg2 == 0) { + pSDIODev->MP_CRxInfinite = 1; + } + + if (SDIO_CRX_STATIC_BUF == pSDIODev->MP_ContinueRxMode) { + if (NULL == pSDIODev->pMP_CRxBuf) { + pSDIODev->pMP_CRxBuf = RtlMalloc(pSDIODev->MP_CRxSize+26); // 26: Wlan header + DiagPrintf("SDIO RX Test: pBuf @ 0x%x\n", (u32)pSDIODev->pMP_CRxBuf); + if (((u32)(pSDIODev->pMP_CRxBuf) & 0x03) != 0) { + DiagPrintf("SDIO RX Test: pBuf Not 4-bytes Aligned!!\n"); + } +#if SDIO_DEBUG + pSDIODev->MemAllocCnt++; +#endif + if (NULL != pSDIODev->pMP_CRxBuf) { + _memcpy(pSDIODev->pMP_CRxBuf, MP_WlanHdr, 26); + _memset((pSDIODev->pMP_CRxBuf+26), 0x3E, pSDIODev->MP_CRxSize); + } + } + + if (pSDIODev->pMP_CRxBuf) { + DiagPrintf("SDIO RX Test(Static RX Buf): PktSize=%d, PktCount=%d\n", pSDIODev->MP_CRxSize, pSDIODev->MP_CRxPktCnt); + SDIO_Wakeup_Task(pSDIODev); + } + else { + pSDIODev->MP_ContinueRx = 0; + pSDIODev->MP_CRxInfinite= 0; + pSDIODev->MP_CRxPktCnt = 0; + DiagPrintf("SDIO RX Test: Mem Allocate Failed\n"); + } + } + + if (SDIO_CRX_DYNA_BUF == pSDIODev->MP_ContinueRxMode) { + DiagPrintf("SDIO RX Test(Dyna-Allocate RX Buf): PktSize=%d, PktCount=%d\n", pSDIODev->MP_CRxSize, pSDIODev->MP_CRxPktCnt); + SDIO_Wakeup_Task(pSDIODev); + } + + break; + + case SDIO_MP_CRX_STOP: + pSDIODev->MP_ContinueRx = 0; + pSDIODev->MP_CRxPktCnt = 0; + pSDIODev->MP_CRxInfinite= 0; + DiagPrintf("SDIO RX Test Stopping...\n"); + break; + + case SDIO_MP_DBG_MSG: + arg1 = Strtoul((const u8*)(argv[1]), (u8 **)NULL, 10); + if (arg1) { + ConfigDebugInfo |= _DBG_SDIO_; + ConfigDebugWarn |= _DBG_SDIO_; + DiagPrintf("SDIO Debug Message On.\n"); + } + else { + ConfigDebugInfo &= ~_DBG_SDIO_; + ConfigDebugWarn &= ~_DBG_SDIO_; + DiagPrintf("SDIO Debug Message Off.\n"); + } + break; + + default: + DiagPrintf("SDIO_DeviceMPApp: Unknown Cmd=%s\n", argv[0]); + DiagPrintf("==== SDIO Command Help ====\n"); + DiagPrintf("SDIO mp_start : Enter MP mode\n"); + DiagPrintf("SDIO mp_stop : Exit MP mode(Switch back to Normal mode)\n"); + DiagPrintf("SDIO mp_loopback <1/0> : enable/disable data path loopback test\n"); + DiagPrintf("SDIO ctx <1/0> : Start/Stop SDIO continue TX test\n"); + DiagPrintf("SDIO crx : Start SDIO continue RX test with static RX Buffer\n"); + DiagPrintf("SDIO crx_da : Start SDIO continue RX test with Dynamic Allocate RX Buffer\n"); + DiagPrintf("SDIO crx_stop : Stop SDIO continue RX test\n"); + DiagPrintf("SDIO status : Dump current SDIO driver status\n"); + DiagPrintf("SDIO read_reg8 : Read SDIO register via 1-byte access\n"); + DiagPrintf("SDIO read_reg16 : Read SDIO register via 2-bytes access\n"); + DiagPrintf("SDIO read_reg32 : Read SDIO register via 4-bytes access\n"); + DiagPrintf("SDIO write_reg8 : Write SDIO register via 1-byte access\n"); + DiagPrintf("SDIO write_reg16 : Write SDIO register via 2-bytes access\n"); + DiagPrintf("SDIO write_reg32 : Write SDIO register via 4-bytes access\n"); + DiagPrintf("SDIO dump <1/0> : Start/Stop to dump SDIO throughput statistic periodically.\n"); + break; + } +} +#endif /* endof '#if SDIO_MP_MODE' */ + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_ssi.c b/lib/fwlib/rtl8195a/src/rtl8195a_ssi.c new file mode 100644 index 0000000..dbf2bb5 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_ssi.c @@ -0,0 +1,1271 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include "rtl8195a_ssi.h" +#include "hal_ssi.h" + +extern _LONG_CALL_ +HAL_Status HalSsiInitRtl8195a(VOID *Adaptor); + +extern _LONG_CALL_ +u32 HalGetCpuClk(VOID); + + +VOID _SsiReadInterruptRtl8195a(VOID *Adapter) +{ + SSI_DBG_ENTRANCE("_SsiReadInterrupt()\n"); + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + u32 ReceiveLevel; + volatile u32 Readable = HalSsiReadableRtl8195a(Adapter); + u8 Index = pHalSsiAdapter->Index; + + while (Readable) { + ReceiveLevel = HalSsiGetRxFifoLevelRtl8195a(Adapter); + + while (ReceiveLevel--) { + if (pHalSsiAdapter->RxData != NULL) { + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + *((u16*)(pHalSsiAdapter->RxData)) = (u16)(HAL_SSI_READ32(Index, REG_DW_SSI_DR)); + pHalSsiAdapter->RxData = (VOID*)(((u16*)pHalSsiAdapter->RxData) + 1); + } + else { + // 8~4 bits mode + *((u8*)(pHalSsiAdapter->RxData)) = (u8)(HAL_SSI_READ32(Index, REG_DW_SSI_DR)); + pHalSsiAdapter->RxData = (VOID*)(((u8*)pHalSsiAdapter->RxData) + 1); + } + } + else { + // for Master mode, doing TX also will got RX data, so drop the dummy data + HAL_SSI_READ32(Index, REG_DW_SSI_DR); + } + + if (pHalSsiAdapter->RxLength > 0) { + pHalSsiAdapter->RxLength--; + } +#if 0 + else if (pHalSsiAdapter->RxLengthRemainder > 0) { + pHalSsiAdapter->RxLengthRemainder--; + } + + // Fixed length receive Complete. (RxLength & RxLengthRemainder == 0) + if ((pHalSsiAdapter->RxLength == 0) && (pHalSsiAdapter->RxLengthRemainder == 0)) { + break; + } +#endif + if (pHalSsiAdapter->RxLength == 0) { + break; + } + } + + if (pHalSsiAdapter->RxLength == 0) { + break; + } + + Readable = HalSsiReadableRtl8195a(Adapter); + } + + if ((pHalSsiAdapter->RxLength > 0) && + (pHalSsiAdapter->RxLength < (pHalSsiAdapter->RxThresholdLevel+1))) { + SSI_DBG_INT_READ("Setting Rx FIFO Threshold Level to 1\n"); + pHalSsiAdapter->RxThresholdLevel = 0; + HalSsiSetRxFifoThresholdLevelRtl8195a((VOID*)pHalSsiAdapter); + } + + if (pHalSsiAdapter->RxLength == 0) { + DBG_SSI_INFO("_SsiReadInterruptRtl8195a: RX_Done\r\n"); + pHalSsiAdapter->InterruptMask &= ~(BIT_IMR_RXFIM | BIT_IMR_RXOIM | BIT_IMR_RXUIM); + HalSsiSetInterruptMaskRtl8195a((VOID*)pHalSsiAdapter); +// if (pHalSsiAdapter->RxData != NULL) { + if (pHalSsiAdapter->RxCompCallback != NULL) { + pHalSsiAdapter->RxCompCallback(pHalSsiAdapter->RxCompCbPara); + } +// } + } + +} + + +VOID _SsiWriteInterruptRtl8195a(VOID *Adapter) +{ + SSI_DBG_ENTRANCE("_SsiWriteInterrupt()\n"); + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + u32 Writeable = HalSsiWriteableRtl8195a(Adapter); + u32 TxWriteMax = SSI_TX_FIFO_DEPTH - pHalSsiAdapter->TxThresholdLevel; + u8 Index = pHalSsiAdapter->Index; + + if (Writeable) { + /* Disable Tx FIFO Empty IRQ */ + pHalSsiAdapter->InterruptMask &= ~ BIT_IMR_TXEIM; + HalSsiSetInterruptMaskRtl8195a((VOID*)pHalSsiAdapter); + + while (TxWriteMax--) { + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + if (pHalSsiAdapter->TxData != NULL) { + HAL_SSI_WRITE16(Index, REG_DW_SSI_DR, *((u16*)(pHalSsiAdapter->TxData))); + pHalSsiAdapter->TxData = (VOID*)(((u16*)pHalSsiAdapter->TxData) + 1); + } + else { + // For master mode: Push a dummy to TX FIFO for Read + if (pHalSsiAdapter->Role == SSI_MASTER) { + HAL_SSI_WRITE16(Index, REG_DW_SSI_DR, (u16)SSI_DUMMY_DATA); // Dummy byte + } + } + } + else { + // 8~4 bits mode + if (pHalSsiAdapter->TxData != NULL) { + HAL_SSI_WRITE8(Index, REG_DW_SSI_DR, *((u8*)(pHalSsiAdapter->TxData))); + pHalSsiAdapter->TxData = (VOID*)(((u8*)pHalSsiAdapter->TxData) + 1); + } + else { + // For master mode: Push a dummy to TX FIFO for Read + if (pHalSsiAdapter->Role == SSI_MASTER) { + HAL_SSI_WRITE8(Index, REG_DW_SSI_DR, (u8)SSI_DUMMY_DATA); // Dummy byte + } + } + } + + pHalSsiAdapter->TxLength--; + + if (pHalSsiAdapter->TxLength == 0) + break; + } + + /* Enable Tx FIFO Empty IRQ */ + pHalSsiAdapter->InterruptMask |= BIT_IMR_TXEIM; + HalSsiSetInterruptMaskRtl8195a((VOID*)pHalSsiAdapter); + } + + if (pHalSsiAdapter->TxLength == 0) { + DBG_SSI_INFO("_SsiWriteInterruptRtl8195a: TX_Done\r\n"); + pHalSsiAdapter->InterruptMask &= ~(BIT_IMR_TXOIM | BIT_IMR_TXEIM); + HalSsiSetInterruptMaskRtl8195a((VOID*)pHalSsiAdapter); + // If it's not a dummy TX for master read SPI, then call the TX_done callback + if (pHalSsiAdapter->TxData != NULL) { + if (pHalSsiAdapter->TxCompCallback != NULL) { + pHalSsiAdapter->TxCompCallback(pHalSsiAdapter->TxCompCbPara); + } + } + } +} + + +u32 _SsiIrqHandleRtl8195a(VOID *Adaptor) +{ + SSI_DBG_ENTRANCE("_SsiIrqHandle()\n"); + PHAL_SSI_ADAPTOR pHalSsiAdaptor = (PHAL_SSI_ADAPTOR) Adaptor; + u32 InterruptStatus = HalSsiGetInterruptStatusRtl8195a(Adaptor); + u8 Index = pHalSsiAdaptor->Index; + + if (InterruptStatus & BIT_ISR_TXOIS) { + SSI_DBG_INT_HNDLR("[INT][SSI%d] Transmit FIFO Overflow Interrupt\n", Index); + HAL_SSI_READ32(Index, REG_DW_SSI_TXOICR); + } + + if (InterruptStatus & BIT_ISR_RXUIS) { + SSI_DBG_INT_HNDLR("[INT][SSI%d] Receive FIFO Underflow Interrupt\n", Index); + HAL_SSI_READ32(Index, REG_DW_SSI_RXUICR); + } + + if (InterruptStatus & BIT_ISR_RXOIS) { + SSI_DBG_INT_HNDLR("[INT][SSI%d] Receive FIFO Overflow Interrupt\n", Index); + HAL_SSI_READ32(Index, REG_DW_SSI_RXOICR); + } + + if (InterruptStatus & BIT_ISR_MSTIS) { + SSI_DBG_INT_HNDLR("[INT][SSI%d] Multi-Master Contention Interrupt\n", Index); + /* Another master is actively transferring data */ + /* TODO: Do reading data... */ + HAL_SSI_READ32(Index, REG_DW_SSI_MSTICR); + } + + if ((InterruptStatus & BIT_ISR_RXFIS) ) { + SSI_DBG_INT_HNDLR("[INT][SSI%d] Receive FIFO Full Interrupt\n", Index); + _SsiReadInterruptRtl8195a(Adaptor); + } + + if (InterruptStatus & BIT_ISR_TXEIS) { + /* Tx FIFO is empty, need to transfer data */ + SSI_DBG_INT_HNDLR("[INT][SSI%d] Transmit FIFO Empty Interrupt\n", Index); + _SsiWriteInterruptRtl8195a(Adaptor); + } + + return 0; +} + +HAL_Status HalSsiInitRtl8195a_Patch(VOID *Adaptor) +{ + SSI_DBG_ENTRANCE("HalSsiInitRtl8195a()\n"); + PHAL_SSI_ADAPTOR pHalSsiAdaptor = (PHAL_SSI_ADAPTOR) Adaptor; + volatile IRQn_Type IrqNum; + u32 IRQ_UNKNOWN = -999; + u32 Ctrlr0Value = 0; + u32 Ctrlr1Value = 0; + u32 SerValue = 0; + u32 BaudrValue = 0; + u32 TxftlrValue = 0; + u32 RxftlrValue = 0; + u32 MwcrValue = 0; + u8 MicrowireTransferMode = pHalSsiAdaptor->MicrowireTransferMode; + u8 DataFrameFormat = pHalSsiAdaptor->DataFrameFormat; + u8 TransferMode = pHalSsiAdaptor->TransferMode; + u8 Index = pHalSsiAdaptor->Index; + u8 Role = pHalSsiAdaptor->Role; + + if (Index > 2) { + DBG_SSI_ERR("HalSsiInitRtl8195a: Invalid SSI Idx %d\r\n", Index); + return HAL_ERR_PARA; + } + HalSsiPinmuxEnableRtl8195a_Patch(pHalSsiAdaptor); + HalSsiDisableRtl8195a(Adaptor); + + /* REG_DW_SSI_CTRLR0 */ + Ctrlr0Value |= BIT_CTRLR0_DFS(pHalSsiAdaptor->DataFrameSize); + Ctrlr0Value |= BIT_CTRLR0_FRF(pHalSsiAdaptor->DataFrameFormat); + Ctrlr0Value |= BIT_CTRLR0_SCPH(pHalSsiAdaptor->SclkPhase); + Ctrlr0Value |= BIT_CTRLR0_SCPOL(pHalSsiAdaptor->SclkPolarity); + Ctrlr0Value |= BIT_CTRLR0_TMOD(pHalSsiAdaptor->TransferMode); + Ctrlr0Value |= BIT_CTRLR0_CFS(pHalSsiAdaptor->ControlFrameSize); + + if (Role == SSI_SLAVE) + Ctrlr0Value |= BIT_CTRLR0_SLV_OE(pHalSsiAdaptor->SlaveOutputEnable); + + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_CTRLR0 Value: %X\n", Index, Ctrlr0Value); + + HAL_SSI_WRITE32(Index, REG_DW_SSI_CTRLR0, Ctrlr0Value); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_CTRLR0(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_CTRLR0, + HAL_SSI_READ32(Index, REG_DW_SSI_CTRLR0)); + + /* REG_DW_SSI_TXFTLR */ + TxftlrValue = BIT_TXFTLR_TFT(pHalSsiAdaptor->TxThresholdLevel); + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_TXFTLR Value: %X\n", Index, TxftlrValue); + + HAL_SSI_WRITE32(Index, REG_DW_SSI_TXFTLR, TxftlrValue); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_TXFTLR(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_TXFTLR, + HAL_SSI_READ32(Index, REG_DW_SSI_TXFTLR)); + + /* REG_DW_SSI_RXFTLR */ + RxftlrValue = BIT_RXFTLR_RFT(pHalSsiAdaptor->RxThresholdLevel); + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_RXFTLR Value: %X\n", Index, RxftlrValue); + + HAL_SSI_WRITE32(Index, REG_DW_SSI_RXFTLR, RxftlrValue); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_RXFTLR(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_RXFTLR, + HAL_SSI_READ32(Index, REG_DW_SSI_RXFTLR)); + /** + * Master Only + * REG_DW_SSI_CTRLR1, REG_DW_SSI_SER, REG_DW_SSI_BAUDR + */ + if (Role & SSI_MASTER) { + if ((TransferMode == TMOD_RO) || (TransferMode == TMOD_EEPROM_R) || + ((DataFrameFormat == FRF_NS_MICROWIRE) && (MicrowireTransferMode == MW_TMOD_SEQUENTIAL))) { + Ctrlr1Value = BIT_CTRLR1_NDF(pHalSsiAdaptor->DataFrameNumber); + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_CTRLR1 Value: %X\n", Index, Ctrlr1Value); + + HAL_SSI_WRITE32(Index, REG_DW_SSI_CTRLR1, Ctrlr1Value); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_CTRLR1(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_CTRLR1, + HAL_SSI_READ32(Index, REG_DW_SSI_CTRLR1)); + } + + SerValue = BIT_SER_SER(1 << (pHalSsiAdaptor->SlaveSelectEnable)); + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_SER Value: %X\n", Index, SerValue); + + //HAL_SSI_WRITE32(Index, REG_DW_SSI_SER, SerValue); + HalSsiSetSlaveEnableRegisterRtl8195a(Adaptor, pHalSsiAdaptor->SlaveSelectEnable); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_SER(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_SER, + HalSsiGetSlaveEnableRegisterRtl8195a(Adaptor)); + + BaudrValue = BIT_BAUDR_SCKDV(pHalSsiAdaptor->ClockDivider); + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_BAUDR Value: %X\n", Index, BaudrValue); + + HAL_SSI_WRITE32(Index, REG_DW_SSI_BAUDR, BaudrValue); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_BAUDR(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_BAUDR, + HAL_SSI_READ32(Index, REG_DW_SSI_BAUDR)); + } + + // Microwire + MwcrValue |= BIT_MWCR_MWMOD(pHalSsiAdaptor->MicrowireTransferMode); + MwcrValue |= BIT_MWCR_MDD(pHalSsiAdaptor->MicrowireDirection); + MwcrValue |= BIT_MWCR_MHS(pHalSsiAdaptor->MicrowireHandshaking); + SSI_DBG_INIT("[1] Set SSI%d REG_DW_SSI_MWCR Value: %X\n", Index, MwcrValue); + + HAL_SSI_WRITE32(Index, REG_DW_SSI_MWCR, MwcrValue); + + SSI_DBG_INIT("[2] SSI%d REG_DW_SSI_MWCR(%X) = %X\n", Index, + SSI0_REG_BASE + (SSI_REG_OFF * Index) + REG_DW_SSI_MWCR, + HAL_SSI_READ32(Index, REG_DW_SSI_MWCR)); + + SSI_DBG_INIT("SSI%d TransferMechanism: %d\n", Index, pHalSsiAdaptor->TransferMechanism); + if (pHalSsiAdaptor->TransferMechanism == SSI_DTM_INTERRUPT) + { + SSI_DBG_INIT("SSI%d Interrupt initialize, Interrupt: %X\n", Index, pHalSsiAdaptor->InterruptMask); + switch (Index) { + case 0: + IrqNum = SPI0_IRQ; + break; + case 1: + IrqNum = SPI1_IRQ; + break; + case 2: + IrqNum = SPI2_IRQ; + break; + default: + IrqNum = IRQ_UNKNOWN; + break; + } + + if (likely(IrqNum != IRQ_UNKNOWN)) { + /* REG_DW_SSI_IMR */ + HalSsiSetInterruptMaskRtl8195a(Adaptor); + + pHalSsiAdaptor->IrqHandle.Data = (u32)pHalSsiAdaptor; + pHalSsiAdaptor->IrqHandle.IrqFun = (IRQ_FUN)_SsiIrqHandleRtl8195a; + pHalSsiAdaptor->IrqHandle.IrqNum = (IRQn_Type)IrqNum; + pHalSsiAdaptor->IrqHandle.Priority = pHalSsiAdaptor->InterruptPriority; + + InterruptRegister(&pHalSsiAdaptor->IrqHandle); + InterruptEn(&pHalSsiAdaptor->IrqHandle); + } + else { + SSI_DBG_INIT("Unknown SSI Index.\n"); + pHalSsiAdaptor->TransferMechanism = SSI_DTM_BASIC; + } + } + + HalSsiEnableRtl8195a(Adaptor); + + return HAL_OK; +} + +HAL_Status HalSsiPinmuxEnableRtl8195a_Patch(VOID *Adaptor) +{ + SSI_DBG_ENTRANCE("HalSsiPinmuxEnableRtl8195a()\n"); + PHAL_SSI_ADAPTOR pHalSsiAdaptor = (PHAL_SSI_ADAPTOR) Adaptor; + volatile HAL_Status Result; + u32 PinmuxSelect = pHalSsiAdaptor->PinmuxSelect; + u8 Index = pHalSsiAdaptor->Index; + + SSI_DBG_PINMUX("[1] SSI%d REG_SSI_MUX_CTRL(%X) = %X\n", Index, + PERI_ON_BASE + REG_SPI_MUX_CTRL, + HAL_READ32(PERI_ON_BASE, REG_SPI_MUX_CTRL)); + + switch (Index) + { + case 0: + { + ACTCK_SPI0_CCTRL(ON); + SLPCK_SPI0_CCTRL(ON); + PinCtrl(SPI0, PinmuxSelect, ON); + SPI0_FCTRL(ON); + Result = HAL_OK; + break; + } + case 1: + { + ACTCK_SPI1_CCTRL(ON); + SLPCK_SPI1_CCTRL(ON); + PinCtrl(SPI1, PinmuxSelect, ON); + SPI1_FCTRL(ON); + Result = HAL_OK; + break; + } + case 2: + { + ACTCK_SPI2_CCTRL(ON); + SLPCK_SPI2_CCTRL(ON); + PinCtrl(SPI2, PinmuxSelect, ON); + SPI2_FCTRL(ON); + Result = HAL_OK; + break; + } + default: + { + DBG_SSI_ERR("Invalid SSI Index %d!\n", Index); + Result = HAL_ERR_PARA; + break; + } + } + + SSI_DBG_PINMUX("[2] SSI%d REG_SSI_MUX_CTRL(%X) = %X\n", Index, + PERI_ON_BASE + REG_SPI_MUX_CTRL, + HAL_READ32(PERI_ON_BASE, REG_SPI_MUX_CTRL)); + + return Result; +} + +HAL_Status HalSsiPinmuxDisableRtl8195a(VOID *Adaptor) +{ + SSI_DBG_ENTRANCE("HalSsiPinmuxEnableRtl8195a()\n"); + PHAL_SSI_ADAPTOR pHalSsiAdaptor = (PHAL_SSI_ADAPTOR) Adaptor; + volatile HAL_Status Result; + u32 PinmuxSelect = pHalSsiAdaptor->PinmuxSelect; + u8 Index = pHalSsiAdaptor->Index; + + SSI_DBG_PINMUX("[1] SSI%d REG_SSI_MUX_CTRL(%X) = %X\n", Index, + PERI_ON_BASE + REG_SPI_MUX_CTRL, + HAL_READ32(PERI_ON_BASE, REG_SPI_MUX_CTRL)); + + switch (Index) + { + case 0: + { + ACTCK_SPI0_CCTRL(OFF); + SLPCK_SPI0_CCTRL(OFF); + PinCtrl(SPI0, PinmuxSelect, OFF); + SPI0_FCTRL(OFF); + Result = HAL_OK; + break; + } + case 1: + { + ACTCK_SPI1_CCTRL(OFF); + SLPCK_SPI1_CCTRL(OFF); + PinCtrl(SPI1, PinmuxSelect, OFF); + SPI1_FCTRL(OFF); + Result = HAL_OK; + break; + } + case 2: + { + ACTCK_SPI2_CCTRL(OFF); + SLPCK_SPI2_CCTRL(OFF); + PinCtrl(SPI2, PinmuxSelect, OFF); + SPI2_FCTRL(OFF); + Result = HAL_OK; + break; + } + default: + { + DBG_SSI_ERR("Invalid SSI Index %d!\n", Index); + Result = HAL_ERR_PARA; + break; + } + } + + SSI_DBG_PINMUX("[2] SSI%d REG_SSI_MUX_CTRL(%X) = %X\n", Index, + PERI_ON_BASE + REG_SPI_MUX_CTRL, + HAL_READ32(PERI_ON_BASE, REG_SPI_MUX_CTRL)); + + return Result; +} + +HAL_Status HalSsiDeInitRtl8195a(VOID *Adapter) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + u8 Index; + volatile HAL_Status Result; + + Index = pHalSsiAdapter->Index; + + if(Index > 2){ + DBG_SSI_ERR("Invalid SSI Index %d!\n", Index); + return HAL_ERR_PARA; + } + + HalSsiInterruptDisableRtl8195a(pHalSsiAdapter); + HalSsiDisableRtl8195a(pHalSsiAdapter); + + Result = HalSsiPinmuxDisableRtl8195a(pHalSsiAdapter); + if(Result != HAL_OK){ + DBG_SSI_ERR("Pinmux Disable Error\n"); + return Result; + } + + return Result; +} + +HAL_Status HalSsiClockOnRtl8195a(VOID *Adapter) +{ + PHAL_SSI_ADAPTOR pHalSsiAdaptor = (PHAL_SSI_ADAPTOR) Adapter; + volatile HAL_Status Result; + u8 Index = pHalSsiAdaptor->Index; + + switch (Index) + { + case 0: + { + ACTCK_SPI0_CCTRL(ON); + SLPCK_SPI0_CCTRL(ON); + Result = HAL_OK; + break; + } + case 1: + { + ACTCK_SPI1_CCTRL(ON); + SLPCK_SPI1_CCTRL(ON); + Result = HAL_OK; + break; + } + case 2: + { + ACTCK_SPI2_CCTRL(ON); + SLPCK_SPI2_CCTRL(ON); + Result = HAL_OK; + break; + } + default: + { + DBG_SSI_ERR("Invalid SSI Index %d!\n", Index); + Result = HAL_ERR_PARA; + break; + } + } + return Result; +} + +HAL_Status HalSsiClockOffRtl8195a(VOID *Adapter) +{ + PHAL_SSI_ADAPTOR pHalSsiAdaptor = (PHAL_SSI_ADAPTOR) Adapter; + volatile HAL_Status Result; + u8 Index = pHalSsiAdaptor->Index; + + switch (Index) + { + case 0: + { + ACTCK_SPI0_CCTRL(OFF); + SLPCK_SPI0_CCTRL(OFF); + Result = HAL_OK; + break; + } + case 1: + { + ACTCK_SPI1_CCTRL(OFF); + SLPCK_SPI1_CCTRL(OFF); + Result = HAL_OK; + break; + } + case 2: + { + ACTCK_SPI2_CCTRL(OFF); + SLPCK_SPI2_CCTRL(OFF); + Result = HAL_OK; + break; + } + default: + { + DBG_SSI_ERR("Invalid SSI Index %d!\n", Index); + Result = HAL_ERR_PARA; + break; + } + } + return Result; + +} + +VOID HalSsiSetSclkRtl8195a(VOID *Adapter, u32 ClkRate) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + u32 ssi_clk; + u32 ClockDivider; + u32 SsiEn; + u32 RegValue; + u32 SystemClock; + u8 spi_idx = pHalSsiAdapter->Index; + + // Set SCLK Freq only available for Master mode + // For Slave mode, the baud rate is depends on the Master side, max rate = ssi_clk/2 + // Fsclk_out = Fssi_clk/SCKDV + SystemClock = HalGetCpuClk(); + + if (spi_idx == 1) { + ssi_clk = SystemClock >> 1; + RegValue = HAL_READ32(SYSTEM_CTRL_BASE, 0x250); + if (ClkRate > (ssi_clk/2)) { + // Use High speed clock: Fixed Freq. + RegValue |= BIT18; + ssi_clk = (200000000*5/6) >> 1; + } + else { + // Use Normal speed clock: CPU_Clk/2 + RegValue &= ~BIT18; + } + HAL_WRITE32(SYSTEM_CTRL_BASE, 0x250, RegValue); + } + else { + ssi_clk = SystemClock >> 2; + } + + if (pHalSsiAdapter->Role == SSI_MASTER) { + if (ClkRate > (ssi_clk/2)) { + DBG_SSI_ERR("spi_frequency: Freq %d is too high, available highest Freq=%d\r\n", ClkRate, (ssi_clk/2)); + ClockDivider = 2; + } + else { + ClockDivider = ssi_clk/ClkRate + 1; + if ((ssi_clk%ClkRate) > (ClkRate/2)) { + ClockDivider++; + } + if (ClockDivider >= 0xFFFF) { + // devider is 16 bits + ClockDivider = 0xFFFE; + } + ClockDivider &= 0xFFFE; // bit 0 always is 0 + } + DBG_SSI_INFO("spi_frequency: Set SCLK Freq=%d\r\n", (ssi_clk/ClockDivider)); + pHalSsiAdapter->ClockDivider = ClockDivider; + + SsiEn = HAL_SSI_READ32(spi_idx, REG_DW_SSI_SSIENR); // Backup SSI_EN register + + // Disable SSI first, so we can modify the Clock Divider + RegValue = SsiEn & BIT_INVC_SSIENR_SSI_EN; + HAL_SSI_WRITE32(spi_idx, REG_DW_SSI_SSIENR, RegValue); + HAL_SSI_WRITE32(spi_idx, REG_DW_SSI_BAUDR, (pHalSsiAdapter->ClockDivider & 0xFFFF)); + // recover the SSI_EN setting + HAL_SSI_WRITE32(spi_idx, REG_DW_SSI_SSIENR, SsiEn); + } + else { + if (ClkRate > (ssi_clk/10)) { + DBG_SSI_ERR("spi_frequency: Freq %d is too high, available highest Freq=%d\r\n", ClkRate, (ssi_clk/10)); + } + } +} + +HAL_Status HalSsiIntReadRtl8195a(VOID *Adapter, VOID *RxData, u32 Length) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + u32 RxFifoThresholdLevel; + u8 Index = pHalSsiAdapter->Index; + + DBG_SSI_INFO("HalSsiIntReadRtl8195a: Idx=%d, RxData=0x%x, Len=0x%x\r\n", Index, RxData, Length); + if (HalSsiBusyRtl8195a(Adapter)) { + // As a Slave mode, if the peer(Master) side is power off, the BUSY flag is always on + DBG_SSI_WARN("HalSsiIntReadRtl8195a: SSI%d is busy\n", Index); + return HAL_BUSY; + } + + if (Length == 0) { + SSI_DBG_INT_READ("SSI%d RxData addr: 0x%X, Length: %d\n", Index, RxData, Length); + return HAL_ERR_PARA; + } + + if (Length > (pHalSsiAdapter->DefaultRxThresholdLevel)) { + RxFifoThresholdLevel = pHalSsiAdapter->DefaultRxThresholdLevel; + } + else { + RxFifoThresholdLevel = 0; + } + + if (pHalSsiAdapter->RxThresholdLevel != RxFifoThresholdLevel) { + DBG_SSI_INFO("Setting Rx FIFO Threshold Level to %d\n", RxFifoThresholdLevel); + pHalSsiAdapter->RxThresholdLevel = RxFifoThresholdLevel; + HalSsiSetRxFifoThresholdLevelRtl8195a((VOID*)pHalSsiAdapter); + } + + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + pHalSsiAdapter->RxLength = Length >> 1; // 2 bytes(16 bit) every transfer + } + else { + // 8~4 bits mode + pHalSsiAdapter->RxLength = Length; // 1 byte(8 bit) every transfer + } + + pHalSsiAdapter->RxData = RxData; + DBG_SSI_INFO("SSI%d RxData addr: 0x%X, Length: %d\n", Index, + pHalSsiAdapter->RxData, pHalSsiAdapter->RxLength); + + pHalSsiAdapter->InterruptMask |= BIT_IMR_RXFIM | BIT_IMR_RXOIM | BIT_IMR_RXUIM; + HalSsiSetInterruptMaskRtl8195a((VOID*)pHalSsiAdapter); + + return HAL_OK; +} + + +HAL_Status +HalSsiIntWriteRtl8195a( + IN VOID *Adapter, // PHAL_SSI_ADAPTOR + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send +) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + + DBG_SSI_INFO("HalSsiIntWriteRtl8195a: Idx=%d, RxData=0x%x, Len=0x%x\r\n", pHalSsiAdapter->Index, pTxData, Length); + if ((Length == 0)) { + DBG_SSI_ERR("HalSsiIntSendRtl8195a: Err: pTxData=0x%x, Length=%d\n", pTxData, Length); + return HAL_ERR_PARA; + } + + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + pHalSsiAdapter->TxLength = Length >> 1; // 2 bytes(16 bit) every transfer + } + else { + // 8~4 bits mode + pHalSsiAdapter->TxLength = Length; // 1 byte(8 bit) every transfer + } + + pHalSsiAdapter->TxData = (void*)pTxData; + pHalSsiAdapter->InterruptMask |= BIT_IMR_TXOIM | BIT_IMR_TXEIM; + HalSsiSetInterruptMaskRtl8195a((VOID*)pHalSsiAdapter); + + return HAL_OK; +} + +#ifdef CONFIG_GDMA_EN +/** + * GDMA IRQ Handler + */ +VOID SsiTxGdmaIrqHandle (VOID *Data) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data; + PSSI_DMA_CONFIG pDmaConfig = &pHalSsiAdapter->DmaConfig;; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter; + pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp; + + /* Maintain Block Count */ +#if 0 + u8 IsrTypeMap = 0; + /* Clear Pending ISR */ + IsrTypeMap = pHalGdmaOp->HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); + + if (IsrTypeMap & BlockType) { + DBG_SSI_WARN("DMA Block %d\n",pHalGdmaAdapter->MuliBlockCunt); + pHalGdmaAdapter->MuliBlockCunt++; + } +#else + /* Clear Pending ISR */ + pHalGdmaOp->HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); +#endif + +#if 0 + /* Set SSI DMA Disable */ + HAL_SSI_WRITE32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR, \ + (HAL_SSI_READ32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR) & ~SSI_TXDMA_ENABLE)); +#endif + pHalGdmaOp->HalGdmaChDis((VOID*)(pHalGdmaAdapter)); + // Call user TX complete callback + if (NULL != pHalSsiAdapter->TxCompCallback) { + pHalSsiAdapter->TxCompCallback(pHalSsiAdapter->TxCompCbPara); + } +} + +VOID SsiRxGdmaIrqHandle (VOID *Data) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data; + PSSI_DMA_CONFIG pDmaConfig = &pHalSsiAdapter->DmaConfig;; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter; + pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp; + + /* Maintain Block Count */ +#if 0 + u8 IsrTypeMap = 0; + /* Clear Pending ISR */ + IsrTypeMap = pHalGdmaOp->HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); + + if (IsrTypeMap & BlockType) { + DBG_SSI_WARN("DMA Block %d\n",pHalGdmaAdapter->MuliBlockCunt); + pHalGdmaAdapter->MuliBlockCunt++; + } +#else + /* Clear Pending ISR */ + pHalGdmaOp->HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); + +#endif + + /* Set SSI DMA Disable */ + HAL_SSI_WRITE32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR, \ + (HAL_SSI_READ32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR) & ~SSI_RXDMA_ENABLE)); + pHalGdmaOp->HalGdmaChDis((VOID*)(pHalGdmaAdapter)); + // Call user RX complete callback + if (NULL != pHalSsiAdapter->RxCompCallback) { + pHalSsiAdapter->RxCompCallback(pHalSsiAdapter->RxCompCbPara); + } + +} + +VOID +HalSsiTxGdmaLoadDefRtl8195a( + IN VOID *Adapter +) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + u8 *pDst; + u8 DmaIdx; + u8 DmaCh; + u8 DstPer; + u8 ssi_idx; + u32 DmaChEn; + IRQn_Type IrqNum; + + if ((NULL == pHalSsiAdapter)) { + return; + } + pDmaConfig = &pHalSsiAdapter->DmaConfig; + + ssi_idx = pHalSsiAdapter->Index; + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter; + if (NULL == pHalGdmaAdapter) { + DBG_SSI_ERR("HalSsiTxGdmaLoadDefRtl8195a: HalGdmaAdapter is NULL\r\n"); + return; + } + _memset((void *)pHalGdmaAdapter, 0, sizeof(HAL_GDMA_ADAPTER)); + + pHalSsiAdapter->DmaControl |= SSI_TXDMA_ENABLE; + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + pHalSsiAdapter->DmaTxDataLevel = 48; // When TX FIFO entity number <=48 then DMA Request asserted + } + else { + // 8~4 bits mode + pHalSsiAdapter->DmaTxDataLevel = 56; // When TX FIFO entity number <=56 then DMA Request asserted + } + + switch (ssi_idx) { + case 0: + pDst = (u8*) (SSI0_REG_BASE + REG_DW_SSI_DR); + DmaIdx = 0; + DmaCh = 1; + DmaChEn = GdmaCh1; + IrqNum = GDMA0_CHANNEL1_IRQ; + DstPer = GDMA_HANDSHAKE_SSI0_TX; + break; + + case 1: + pDst = (u8*) (SSI1_REG_BASE + REG_DW_SSI_DR); + DmaIdx = 1; + DmaCh = 1; + DmaChEn = GdmaCh1; + IrqNum = GDMA1_CHANNEL1_IRQ; + DstPer = GDMA_HANDSHAKE_SSI1_TX; + break; + + case 2: + pDst = (u8*) (SSI2_REG_BASE + REG_DW_SSI_DR); + DmaIdx = 0; // SPI2 TX only can use GDMA0 + DmaCh = 3; + DmaChEn = GdmaCh3; + IrqNum = GDMA0_CHANNEL3_IRQ; + DstPer = GDMA_HANDSHAKE_SSI2_TX; + break; + + default: + return; + } + + pHalGdmaAdapter->GdmaCtl.TtFc = TTFCMemToPeri; + pHalGdmaAdapter->GdmaCtl.Done = 1; + pHalGdmaAdapter->MuliBlockCunt = 0; + pHalGdmaAdapter->MaxMuliBlock = 1; + pHalGdmaAdapter->GdmaCfg.DestPer = DstPer; + pHalGdmaAdapter->ChDar = (u32)pDst; + pHalGdmaAdapter->GdmaIndex = DmaIdx; + pHalGdmaAdapter->ChNum = DmaCh; + pHalGdmaAdapter->ChEn = DmaChEn; + pHalGdmaAdapter->GdmaIsrType = (BlockType|TransferType|ErrType); + pHalGdmaAdapter->IsrCtrl = ENABLE; + pHalGdmaAdapter->GdmaOnOff = ON; + + pHalGdmaAdapter->GdmaCtl.IntEn = 1; + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeOne; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.Dinc = NoChange; + pHalGdmaAdapter->GdmaCtl.Sinc = IncType; + + pDmaConfig->TxGdmaIrqHandle.Data = (u32)pHalSsiAdapter; + pDmaConfig->TxGdmaIrqHandle.IrqNum = IrqNum; + pDmaConfig->TxGdmaIrqHandle.IrqFun = (IRQ_FUN)SsiTxGdmaIrqHandle; + pDmaConfig->TxGdmaIrqHandle.Priority = 0x10; +} + + +VOID +HalSsiRxGdmaLoadDefRtl8195a( + IN VOID *Adapter +) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + u8 *pSrc; + u8 DmaIdx; + u8 DmaCh; + u8 SrcPer; + u8 ssi_idx; + u32 DmaChEn; + IRQn_Type IrqNum; + + if ((NULL == pHalSsiAdapter)) { + return; + } + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + + ssi_idx = pHalSsiAdapter->Index; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter; + if (NULL == pHalGdmaAdapter) { + return; + } + + _memset((void *)pHalGdmaAdapter, 0, sizeof(HAL_GDMA_ADAPTER)); + + pHalSsiAdapter->DmaControl |= SSI_RXDMA_ENABLE; + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + pHalSsiAdapter->DmaRxDataLevel = 7; // RX FIFO stored bytes > (DMARDLR(7) + 1) then request DMA transfer + } + else { + // 8~4 bits mode + pHalSsiAdapter->DmaRxDataLevel = 3; // RX FIFO stored bytes > (DMARDLR(3) + 1) then request DMA transfer + } + switch (ssi_idx) { + case 0: + pSrc = (u8*) (SSI0_REG_BASE + REG_DW_SSI_DR); + DmaIdx = 0; + DmaCh = 2; + DmaChEn = GdmaCh2; + SrcPer = GDMA_HANDSHAKE_SSI0_RX; + IrqNum = GDMA0_CHANNEL2_IRQ; + break; + + case 1: + pSrc = (u8*) (SSI1_REG_BASE + REG_DW_SSI_DR); + DmaIdx = 1; + DmaCh = 2; + DmaChEn = GdmaCh2; + SrcPer = GDMA_HANDSHAKE_SSI1_RX; + IrqNum = GDMA1_CHANNEL2_IRQ; + break; + + case 2: + pSrc = (u8*) (SSI2_REG_BASE + REG_DW_SSI_DR); + DmaIdx = 1; // SSI2 RX only can use GDMA1 + DmaCh = 3; + DmaChEn = GdmaCh3; + SrcPer = GDMA_HANDSHAKE_SSI2_RX; + IrqNum = GDMA1_CHANNEL3_IRQ; + break; + + default: + return; + } + + pHalGdmaAdapter->GdmaCtl.TtFc = TTFCPeriToMem; + pHalGdmaAdapter->GdmaCtl.Done = 1; + pHalGdmaAdapter->GdmaCfg.ReloadSrc = 1; + pHalGdmaAdapter->GdmaCfg.SrcPer = SrcPer; + pHalGdmaAdapter->MuliBlockCunt = 0; + pHalGdmaAdapter->MaxMuliBlock = 1; + pHalGdmaAdapter->ChSar = (u32)pSrc; + pHalGdmaAdapter->GdmaIndex = DmaIdx; + pHalGdmaAdapter->ChNum = DmaCh; + pHalGdmaAdapter->ChEn = DmaChEn; + pHalGdmaAdapter->GdmaIsrType = (BlockType|TransferType|ErrType); + pHalGdmaAdapter->IsrCtrl = ENABLE; + pHalGdmaAdapter->GdmaOnOff = ON; + + pHalGdmaAdapter->GdmaCtl.IntEn = 1; + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthTwoBytes; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.Dinc = IncType; + pHalGdmaAdapter->GdmaCtl.Sinc = NoChange; + + pDmaConfig->RxGdmaIrqHandle.Data = (u32)pHalSsiAdapter; + pDmaConfig->RxGdmaIrqHandle.IrqNum = IrqNum; + pDmaConfig->RxGdmaIrqHandle.IrqFun = (IRQ_FUN)SsiRxGdmaIrqHandle; + pDmaConfig->RxGdmaIrqHandle.Priority = 0x10; +} + +VOID +HalSsiDmaInitRtl8195a( + IN VOID *Adapter +) +{ + u32 RegValue; + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pTxHalGdmaAdapter; + PHAL_GDMA_ADAPTER pRxHalGdmaAdapter; + u8 ssi_idx; + u32 hdk_tx_bit; + u32 hdk_rx_bit; + u32 DmatdlrValue = 0; + u32 DmardlrValue = 0; + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + pTxHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter; + pRxHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter; + ssi_idx = pHalSsiAdapter->Index; + + // Set REG_PESOC_SOC_CTRL[28:16] to configure the GDMA handshake connection + // SSI2 handshake connection is hardware fixed + if (ssi_idx != 2) { + hdk_tx_bit = 16+pTxHalGdmaAdapter->GdmaCfg.DestPer; + hdk_rx_bit = 16+pRxHalGdmaAdapter->GdmaCfg.SrcPer; + } + else { + hdk_tx_bit = 0; + hdk_rx_bit = 0; + } + + HalSsiDisableRtl8195a(pHalSsiAdapter); + + RegValue = HAL_READ32(PERI_ON_BASE, REG_PESOC_SOC_CTRL); + if (pHalSsiAdapter->DmaControl & SSI_TXDMA_ENABLE) { + // TX DMA is enabled + if (pTxHalGdmaAdapter->GdmaIndex ==0) { + ACTCK_GDMA0_CCTRL(ON); + GDMA0_FCTRL(ON); + if (hdk_tx_bit != 0) { + RegValue &= ~(1<DmaTxDataLevel); + HAL_SSI_WRITE32(ssi_idx, REG_DW_SSI_DMATDLR, DmatdlrValue); + + /* Set SSI DMA Enable */ + HAL_SSI_WRITE32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR, \ + (HAL_SSI_READ32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR) | SSI_TXDMA_ENABLE)); + } + + if (pHalSsiAdapter->DmaControl & SSI_RXDMA_ENABLE) { + // RX DMA is enabled + if (pRxHalGdmaAdapter->GdmaIndex ==0) { + ACTCK_GDMA0_CCTRL(ON); + GDMA0_FCTRL(ON); + if (hdk_rx_bit != 0) { + RegValue &= ~(1<DmaRxDataLevel); + HAL_SSI_WRITE32(ssi_idx, REG_DW_SSI_DMARDLR, DmardlrValue); + // the RX DMA will be enabled at read start. + } + + HAL_WRITE32(PERI_ON_BASE, REG_PESOC_SOC_CTRL, RegValue); + + HalSsiEnableRtl8195a(pHalSsiAdapter); +} + +HAL_Status +HalSsiDmaSendRtl8195a( + IN VOID *Adapter, // PHAL_SSI_ADAPTOR + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send +) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + + + if ((pTxData == NULL) || (Length == 0)) { + DBG_SSI_ERR("HalSsiDmaSendRtl8195a: Err: pTxData=0x%x, Length=%d\n", pTxData, Length); + return HAL_ERR_PARA; + } + pDmaConfig = &pHalSsiAdapter->DmaConfig; + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter; + + pHalSsiAdapter->TxLength = Length; + pHalSsiAdapter->TxData = (void*)pTxData; + + // Cofigure GDMA transfer + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + if (((Length & 0x03)==0) && + (((u32)(pTxData) & 0x03)==0)) { + // 4-bytes aligned, move 4 bytes each transfer + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthTwoBytes; + pHalGdmaAdapter->GdmaCtl.BlockSize = Length >> 2; + } + else if (((Length & 0x01)==0) && + (((u32)(pTxData) & 0x01)==0)) { + // 2-bytes aligned, move 2 bytes each transfer + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthTwoBytes; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthTwoBytes; + pHalGdmaAdapter->GdmaCtl.BlockSize = Length >> 1; + } + else { + DBG_SSI_ERR("HalSsiDmaSendRtl8195a: Aligment Err: pTxData=0x%x, Length=%d\n", pTxData, Length); + return HAL_ERR_PARA; + } + } + else { + // 8~4 bits mode + if (((Length & 0x03)==0) && + (((u32)(pTxData) & 0x03)==0)) { + // 4-bytes aligned, move 4 bytes each transfer + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeOne; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.BlockSize = Length >> 2; + } + else { + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.BlockSize = Length; + } + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte; + } + + DBG_SSI_INFO("SrcMsize=%d SrcTrWidth=%d DestMsize=%d DstTrWidth=%d BlockSize=%d\n", \ + pHalGdmaAdapter->GdmaCtl.SrcMsize, pHalGdmaAdapter->GdmaCtl.SrcTrWidth, \ + pHalGdmaAdapter->GdmaCtl.DestMsize, pHalGdmaAdapter->GdmaCtl.DstTrWidth, \ + pHalGdmaAdapter->GdmaCtl.BlockSize); + + if (pHalGdmaAdapter->GdmaCtl.BlockSize > 4096) { + // over Maximum block size 4096 + DBG_SSI_ERR("HalSsiDmaSendRtl8195a: GDMA Block Size(%d) too big\n", pHalGdmaAdapter->GdmaCtl.BlockSize); + return HAL_ERR_PARA; + } + + pHalGdmaAdapter->ChSar = (u32)pTxData; + + // Enable GDMA for TX + pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp; + pHalGdmaOp->HalGdmaChSeting((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChEn((VOID*)(pHalGdmaAdapter)); + +#if 0 + /* Set SSI DMA Enable */ + // TODO: protect the enable DMA register, it may collision with the DMA disable in the GDMA done ISR + HAL_SSI_WRITE32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR, \ + (HAL_SSI_READ32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR) | SSI_TXDMA_ENABLE)); +#endif + + return HAL_OK; +} + +HAL_Status +HalSsiDmaRecvRtl8195a( + IN VOID *Adapter, // PHAL_SSI_ADAPTOR + IN u8 *pRxData, ///< Rx buffer + IN u32 Length // buffer length +) +{ + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Adapter; + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + + if ((pRxData == NULL) || (Length == 0)) { + DBG_SSI_ERR("HalRuartDmaRecvRtl8195a: Null Err: pRxData=0x%x, Length=%d\n", pRxData, Length); + return HAL_ERR_PARA; + } + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter; + + pHalSsiAdapter->RxLength = Length; + pHalSsiAdapter->RxData = (void*)pRxData; + + // Cofigure GDMA transfer + if ((pHalSsiAdapter->DataFrameSize+1) > 8) { + // 16~9 bits mode + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthTwoBytes; + pHalGdmaAdapter->GdmaCtl.BlockSize = Length >> 1; + + if (((Length & 0x03)==0) && + (((u32)(pRxData) & 0x03)==0)) { + // 4-bytes aligned, move 4 bytes each transfer + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; + } + else if (((Length & 0x01)==0) && + (((u32)(pRxData) & 0x01)==0)) { + // 2-bytes aligned, move 2 bytes each transfer + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthTwoBytes; + } + else { + DBG_SSI_ERR("HalSsiDmaSendRtl8195a: Aligment Err: pTxData=0x%x, Length=%d\n", pRxData, Length); + return HAL_ERR_PARA; + } + } + else { + // 8~4 bits mode + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.BlockSize = Length; + if (((Length & 0x03)==0) && + (((u32)(pRxData) & 0x03)==0)) { + // 4-bytes aligned, move 4 bytes each transfer + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeOne; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; + } + else { + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte; + } + } + + if (pHalGdmaAdapter->GdmaCtl.BlockSize > 4096) { + // over Maximum block size 4096 + DBG_SSI_ERR("HalRuartDmaRecvRtl8195a: GDMA Block Size(%d) too big\n", pHalGdmaAdapter->GdmaCtl.BlockSize); + return HAL_ERR_PARA; + } + + pHalGdmaAdapter->ChDar = (u32)pRxData; + + // Enable GDMA for RX + pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp; + pHalGdmaOp->HalGdmaChSeting((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChEn((VOID*)(pHalGdmaAdapter)); + + /* Set SSI DMA Enable */ + // TODO: protect the enable DMA register, it may collision with the DMA disable in the GDMA TX done ISR + HAL_SSI_WRITE32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR, \ + (HAL_SSI_READ32(pHalSsiAdapter->Index, REG_DW_SSI_DMACR) | SSI_RXDMA_ENABLE)); + + return HAL_OK; +} + +#endif // end of "#ifdef CONFIG_GDMA_EN" diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_timer.c b/lib/fwlib/rtl8195a/src/rtl8195a_timer.c new file mode 100644 index 0000000..86aca78 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_timer.c @@ -0,0 +1,323 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#include "rtl8195a.h" +#include "rtl8195a_timer.h" + +extern u32 gTimerRecord; +extern IRQ_FUN Timer2To7VectorTable[MAX_TIMER_VECTOR_TABLE_NUM]; + +#ifdef CONFIG_CHIP_A_CUT +HAL_RAM_BSS_SECTION u32 gTimerRecord; +#endif + +#ifdef CONFIG_CHIP_C_CUT +extern u32 Timer2To7HandlerData[MAX_TIMER_VECTOR_TABLE_NUM]; +#else +u32 Timer2To7HandlerData[MAX_TIMER_VECTOR_TABLE_NUM]; +#endif + +VOID +HalTimerIrq2To7Handle_Patch( + IN VOID *Data +) +{ + u32 TimerIrqStatus = 0, CheckIndex; + IRQ_FUN pHandler; + + TimerIrqStatus = HAL_TIMER_READ32(TIMERS_INT_STATUS_OFF); + + DBG_TIMER_INFO("%s:TimerIrqStatus: 0x%x\n",__FUNCTION__, TimerIrqStatus); + + for (CheckIndex = 2; CheckIndex<8; CheckIndex++) { + + //3 Check IRQ status bit and Timer X IRQ enable bit + if ((TimerIrqStatus & BIT_(CheckIndex)) && + (HAL_TIMER_READ32(TIMER_INTERVAL*CheckIndex + TIMER_CTL_REG_OFF) & BIT0)) { + //3 Execute Timer callback function + pHandler = Timer2To7VectorTable[CheckIndex-2]; + if (pHandler != NULL) { + pHandler((void*)Timer2To7HandlerData[CheckIndex-2]); + } + //3 Clear Timer ISR + HAL_TIMER_READ32(TIMER_INTERVAL*CheckIndex + TIMER_EOI_OFF); + } + } +} + +HAL_Status +HalTimerIrqRegisterRtl8195a_Patch( + IN VOID *Data +) +{ + PTIMER_ADAPTER pHalTimerAdap = (PTIMER_ADAPTER) Data; + IRQ_HANDLE TimerIrqHandle; + //IRQ_FUN BackUpIrqFun = NULL; + + if (pHalTimerAdap->TimerId > 7) { + DBG_TIMER_ERR("%s: No Support Timer ID %d!\r\n", __FUNCTION__, pHalTimerAdap->TimerId); + return HAL_ERR_PARA; + } + else { + if (pHalTimerAdap->TimerId > 1) { + + TimerIrqHandle.IrqNum = TIMER2_7_IRQ; + TimerIrqHandle.IrqFun = (IRQ_FUN) HalTimerIrq2To7Handle_Patch; + + Timer2To7VectorTable[pHalTimerAdap->TimerId-2] = + (IRQ_FUN) pHalTimerAdap->IrqHandle.IrqFun; + Timer2To7HandlerData[pHalTimerAdap->TimerId-2] = + (uint32_t) pHalTimerAdap->IrqHandle.Data; + } + else { + TimerIrqHandle.IrqNum = (pHalTimerAdap->TimerId ? TIMER1_IRQ : TIMER0_IRQ); + TimerIrqHandle.IrqFun = (IRQ_FUN) pHalTimerAdap->IrqHandle.IrqFun; + } + TimerIrqHandle.Data = (u32)pHalTimerAdap; + InterruptRegister(&TimerIrqHandle); + } + + return HAL_OK; +} + +#ifndef CONFIG_CHIP_C_CUT +// Patch for A/B Cut +HAL_Status +HalTimerInitRtl8195a_Patch( + IN VOID *Data +) +{ + PTIMER_ADAPTER pHalTimerAdap = (PTIMER_ADAPTER) Data; + HAL_Status ret=HAL_OK; + u32 ControlReg; + + if ((gTimerRecord & (1<TimerId)) != 0) { + DBG_TIMER_ERR ("%s:Error! Timer %d is occupied!\r\n", __FUNCTION__, pHalTimerAdap->TimerId); + return HAL_BUSY; + } + + //4 1) Config Timer Setting + ControlReg = ((u32)pHalTimerAdap->TimerMode<<1)|((u32)pHalTimerAdap->IrqDis<<2); + /* + set TimerControlReg + 0: Timer enable (0,disable; 1,enable) + 1: Timer Mode (0, free-running mode; 1, user-defined count mode) + 2: Timer Interrupt Mask (0, not masked; 1,masked) + */ + HAL_TIMER_WRITE32((TIMER_INTERVAL*pHalTimerAdap->TimerId + TIMER_CTL_REG_OFF), + ControlReg); + + if (pHalTimerAdap->TimerMode) { + //User-defined Mode + HalTimerReLoadRtl8195a_Patch(pHalTimerAdap->TimerId ,pHalTimerAdap->TimerLoadValueUs); + } + else { + // set TimerLoadCount Register + HAL_TIMER_WRITE32((TIMER_INTERVAL*pHalTimerAdap->TimerId + TIMER_LOAD_COUNT_OFF), + 0xFFFFFFFF); + } + + //4 2) Setting Timer IRQ + if (!pHalTimerAdap->IrqDis) { + if (pHalTimerAdap->IrqHandle.IrqFun != NULL) { + //4 2.1) Initial TimerIRQHandle + ret = HalTimerIrqRegisterRtl8195a_Patch(pHalTimerAdap); + if (HAL_OK != ret) { + DBG_TIMER_ERR ("%s: Timer %d Register IRQ Err!\r\n", __FUNCTION__, pHalTimerAdap->TimerId); + return ret; + } + //4 2.2) Enable TimerIRQ for Platform + InterruptEn((PIRQ_HANDLE)&pHalTimerAdap->IrqHandle); + } + else { + DBG_TIMER_ERR ("%s: Timer %d ISR Handler is NULL!\r\n", __FUNCTION__, pHalTimerAdap->TimerId); + return HAL_ERR_PARA; + } + } + + //4 4) Enable Timer +// HAL_TIMER_WRITE32((TIMER_INTERVAL*pHalTimerAdap->TimerId + TIMER_CTL_REG_OFF), +// (ControlReg|0x1)); + + gTimerRecord |= (1<TimerId); + + return ret; +} + +#else +// Patch for C Cut +HAL_Status +HalTimerInitRtl8195a_Patch( + IN VOID *Data +) +{ + PTIMER_ADAPTER pHalTimerAdap = (PTIMER_ADAPTER) Data; + HAL_Status ret=HAL_OK; + + ret = HalTimerInitRtl8195aV02(Data); + + // Patch the Rom code to load the correct count value + if (pHalTimerAdap->TimerMode) { + //User-defined Mode + HalTimerReLoadRtl8195a_Patch(pHalTimerAdap->TimerId ,pHalTimerAdap->TimerLoadValueUs); + } + + return ret; +} +#endif + +HAL_Status +HalTimerIrqUnRegisterRtl8195a_Patch( + IN VOID *Data +) +{ + PTIMER_ADAPTER pHalTimerAdap = (PTIMER_ADAPTER) Data; + PIRQ_HANDLE pTimerIrqHandle; + u32 i; + + pTimerIrqHandle = &pHalTimerAdap->IrqHandle; + + if (pHalTimerAdap->TimerId > 7) { + DBG_TIMER_ERR("%s:Error: No Support Timer ID!\n", __FUNCTION__); + return HAL_ERR_PARA; + } + else { + if (pHalTimerAdap->TimerId > 1) { + pTimerIrqHandle->IrqNum = TIMER2_7_IRQ; + Timer2To7VectorTable[pHalTimerAdap->TimerId-2] = NULL; + for (i=0;iIrqHandle); + InterruptUnRegister(pTimerIrqHandle); + } + } + else { + pTimerIrqHandle->IrqNum = (pHalTimerAdap->TimerId ? TIMER1_IRQ : TIMER0_IRQ); + InterruptUnRegister(pTimerIrqHandle); + } + + } + + return HAL_OK; +} + + +VOID +HalTimerDeInitRtl8195a_Patch( + IN VOID *Data +) +{ + PTIMER_ADAPTER pHalTimerAdap = (PTIMER_ADAPTER) Data; + u32 timer_id; + + timer_id = pHalTimerAdap->TimerId; + HalTimerDisRtl8195a (timer_id); + if (!pHalTimerAdap->IrqDis) { + if (pHalTimerAdap->IrqHandle.IrqFun != NULL) { + HalTimerIrqUnRegisterRtl8195a_Patch(pHalTimerAdap); + } + } + + gTimerRecord &= ~(1<TimerId); +} + +VOID +HalTimerReLoadRtl8195a_Patch( + IN u32 TimerId, + IN u32 LoadUs +) +{ + u32 LoadCount = 0; + u32 ms125; // how many 125ms + u32 remain_us; + + ms125 = LoadUs/125000; + remain_us = LoadUs - (ms125*125000); + LoadCount = ms125 * (GTIMER_CLK_HZ/8); + LoadCount += (remain_us*GTIMER_CLK_HZ)/1000000; + if (LoadCount == 0) { + LoadCount = 1; + } + +// DBG_TIMER_INFO("%s: Load Count=0x%x\r\n", __FUNCTION__, LoadCount); + // set TimerLoadCount Register + HAL_TIMER_WRITE32((TIMER_INTERVAL*TimerId + TIMER_LOAD_COUNT_OFF), + LoadCount); +} + +u32 +HalTimerReadCountRtl8195a_Patch( + IN u32 TimerId +) +{ + u32 TimerCountOld; + u32 TimerCountNew; + u32 TimerRDCnt; + + TimerRDCnt = 0; + TimerCountOld = HAL_TIMER_READ32(TimerId*TIMER_INTERVAL + TIMER_CURRENT_VAL_OFF); + while(1) { + TimerCountNew = HAL_TIMER_READ32(TimerId*TIMER_INTERVAL + TIMER_CURRENT_VAL_OFF); + + if (TimerCountOld == TimerCountNew) { + return (u32)TimerCountOld; + } + else { + TimerRDCnt++; + TimerCountOld = TimerCountNew; + + if (TimerRDCnt >= 2){ + return (u32)TimerCountOld; + } + } + } +} + +VOID +HalTimerIrqEnRtl8195a( + IN u32 TimerId +) +{ + HAL_TIMER_WRITE32((TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF), + HAL_TIMER_READ32(TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF) & (~(BIT2))); +} + +VOID +HalTimerIrqDisRtl8195a( + IN u32 TimerId +) +{ + HAL_TIMER_WRITE32((TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF), + HAL_TIMER_READ32(TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF) | (BIT2)); +} + +VOID +HalTimerEnRtl8195a_Patch( + IN u32 TimerId +) +{ + HAL_TIMER_WRITE32((TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF), + HAL_TIMER_READ32(TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF) | (BIT0)); +} + +VOID +HalTimerDisRtl8195a_Patch( + IN u32 TimerId +) +{ + // Disable Timer will alos disable the IRQ, so need to re-enable the IRQ when re-enable the timer + HAL_TIMER_WRITE32((TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF), + HAL_TIMER_READ32(TIMER_INTERVAL*TimerId + TIMER_CTL_REG_OFF) & (~BIT0)); +} + diff --git a/lib/fwlib/rtl8195a/src/rtl8195a_uart.c b/lib/fwlib/rtl8195a/src/rtl8195a_uart.c new file mode 100644 index 0000000..eafcde6 --- /dev/null +++ b/lib/fwlib/rtl8195a/src/rtl8195a_uart.c @@ -0,0 +1,1013 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "rtl8195a_uart.h" +#include "hal_uart.h" +#include "hal_gdma.h" + +u8 +HalRuartGetChipVerRtl8195a(VOID) +{ + u8 chip_ver; + + chip_ver = (HAL_READ32(SYSTEM_CTRL_BASE, 0x01F0) >> 4) & 0x0f; + return chip_ver; +} + +/** + * Reset RUART Tx FIFO. + * + * Reset RUART Receiver and Rx FIFO wrapper function. + * It will check LINE_STATUS_REG until reset action completion. + * + * @return BOOL + */ +HAL_Status +HalRuartResetTxFifoRtl8195a( + IN VOID *Data ///< RUART Adapter + ) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + u8 UartIndex = pHalRuartAdapter->UartIndex; + u32 rx_trigger_lv; + u32 RegValue; + + // Backup the RX FIFO trigger Level setting + rx_trigger_lv = HAL_RUART_READ32(UartIndex, RUART_FIFO_CTL_REG_OFF); + rx_trigger_lv &= 0xC0; // only keep the bit[7:6] + + /* Step 2: Enable clear_txfifo */ + RegValue = (FIFO_CTL_DEFAULT_WITH_FIFO_DMA | RUART_FIFO_CTL_REG_CLEAR_TXFIFO) & (~0xC0); + RegValue |= rx_trigger_lv; + HAL_RUART_WRITE32(UartIndex, RUART_FIFO_CTL_REG_OFF, RegValue); + + //TODO: Check Defautl Value + RegValue = (FIFO_CTL_DEFAULT_WITH_FIFO_DMA & (~0xC0)) | rx_trigger_lv; + HAL_RUART_WRITE32(UartIndex, RUART_FIFO_CTL_REG_OFF, RegValue); + + return HAL_OK; +} + +HAL_Status +HalRuartGenBaudRateRtl8195a( + IN RUART_SPEED_SETTING *pBaudSetting +) +{ + u32 baud_rate; + u32 min_divisor=0; + u32 min_err=0xffffffff; + u32 uart_ovsr; + u32 uart_ovsr_mod; + u32 min_uart_ovsr; // ovsr with mini err + u32 min_uart_ovsr_mod; + u32 uart_clock; + u32 divisor_temp; + u32 max_jitter_temp; + u32 err_temp; + u32 uart_ovsr_target; + u32 uart_ovsrs_actual; + u32 ovsr_adj; + u32 adj_bits; + u32 div_res; + u32 uart_ovsrs_actual_mod; + + baud_rate = pBaudSetting->BaudRate; + if (baud_rate >= 1000000) { + baud_rate /= 100; + uart_clock = pBaudSetting->sclk; + } else { + baud_rate /= 2; + uart_clock = pBaudSetting->sclk*50; // UART clock is 1/2 CPU clock + } + + div_res = pBaudSetting->divisor_resolution; + while ((min_err > pBaudSetting->max_err) && (div_res > 0)) { + uart_ovsr = pBaudSetting->Ovsr_max; + while(uart_ovsr >= pBaudSetting->Ovsr_min) { + divisor_temp = ((uart_clock/baud_rate)/uart_ovsr); + max_jitter_temp = 0; + if (divisor_temp > 0) { + max_jitter_temp = 100000/uart_ovsr; + if (max_jitter_temp >= pBaudSetting->jitter_lim) { + err_temp = 100; + } else { + err_temp = (uart_clock/divisor_temp)/((uart_ovsr/100)*100); + if (err_temp > baud_rate) { + err_temp = (err_temp - baud_rate)*1000 / baud_rate; + } else { + err_temp = (baud_rate - err_temp)*1000 / baud_rate; + } + + if (err_temp < min_err) { + min_err = err_temp; + min_divisor = divisor_temp; + min_uart_ovsr = uart_ovsr/100; + min_uart_ovsr_mod = uart_ovsr%100; + } else if (err_temp == min_err) { + uart_ovsr_mod = uart_ovsr%100; + // we perfer OVSR bigger and adj bits smaller + if (((uart_ovsr/100) >= min_uart_ovsr) && (uart_ovsr_mod < min_uart_ovsr_mod)) { + min_err = err_temp; + min_divisor = divisor_temp; + min_uart_ovsr = uart_ovsr/100; + min_uart_ovsr_mod = uart_ovsr_mod; + } + } + } + } + uart_ovsr -= div_res; + } + div_res = div_res >> 1; + } + + uart_ovsr_target = (uart_clock/baud_rate)/min_divisor; + + ovsr_adj = 0; + adj_bits = 0; + uart_ovsrs_actual = uart_ovsr_target/100; + uart_ovsrs_actual_mod = uart_ovsr_target%100; + if (uart_ovsrs_actual_mod > 0) { + adj_bits = (uart_ovsrs_actual_mod*pBaudSetting->Ovsr_adj_max_bits)/100; + if ((uart_ovsrs_actual_mod - ((adj_bits*100)/pBaudSetting->Ovsr_adj_max_bits)) > 4) { + adj_bits++; + } + + if (adj_bits > (pBaudSetting->Ovsr_adj_max_bits-1)) { + DBG_UART_WARN("HalRuartGenBaudRateRtl8195a: adj_bits=%d\r\n", adj_bits); + adj_bits = pBaudSetting->Ovsr_adj_max_bits-1; + } + } + ovsr_adj = pBaudSetting->Ovsr_adj_map[adj_bits]; +// DBG_8195A("baud_rate=%d uart_clock=%d uart_ovsr_target=%d min_divisor=%d adj_bits=%d\r\n", baud_rate, uart_clock, uart_ovsr_target, min_divisor, adj_bits); + + pBaudSetting->Ovsr = uart_ovsrs_actual; + pBaudSetting->Div = min_divisor; + pBaudSetting->Ovsr_adj = ovsr_adj; + pBaudSetting->Ovsr_adj_bits = adj_bits; + + DBG_UART_INFO("HalRuartGenBaudRateRtl8195a: BaudRate=%d ovsr=%d divisor=%d ovsr_adj=0x%x\r\n", + pBaudSetting->BaudRate, uart_ovsrs_actual, min_divisor, ovsr_adj); + + return HAL_OK; +} + +HAL_Status +HalRuartDumpBaudRateTableRtl8195a( + IN VOID *Data +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + RUART_SPEED_SETTING RuartSpeedSetting; + u32 Divisor; + u32 Ovsr; + u32 Ovsr_adj; + u32 i; + u32 j; + u32 adj; + + RuartSpeedSetting.max_err = 3; + RuartSpeedSetting.Ovsr_min = UART_OVSR_POOL_MIN; + RuartSpeedSetting.Ovsr_max = UART_OVSR_POOL_MAX; + RuartSpeedSetting.divisor_resolution = DIVISOR_RESOLUTION; + RuartSpeedSetting.jitter_lim = JITTER_LIMIT; + RuartSpeedSetting.sclk = UART_SCLK; + + if (pHalRuartAdapter->pDefaultBaudRateTbl != NULL) { + // for debugging + DBG_8195A("==== 10 Bit ====\r\n"); + i = 0; + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_10; + RuartSpeedSetting.Ovsr_adj_max_bits = 10; + while (pHalRuartAdapter->pDefaultBaudRateTbl[i] < 0xffffffff) { + RuartSpeedSetting.BaudRate = pHalRuartAdapter->pDefaultBaudRateTbl[i]; + if (HalRuartGenBaudRateRtl8195a(&RuartSpeedSetting) == HAL_OK) { + Divisor = RuartSpeedSetting.Div; + Ovsr = RuartSpeedSetting.Ovsr; + Ovsr_adj = RuartSpeedSetting.Ovsr_adj; + adj = 0; + for (j=0;j<10;j++) { + if (Ovsr_adj & (1<pDefaultBaudRateTbl[i], Ovsr, Divisor, Ovsr_adj, adj); + } + i++; + } + + + DBG_8195A("==== 9 Bit ====\r\n"); + i = 0; + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_9; + RuartSpeedSetting.Ovsr_adj_max_bits = 9; + while (pHalRuartAdapter->pDefaultBaudRateTbl[i] < 0xffffffff) { + RuartSpeedSetting.BaudRate = pHalRuartAdapter->pDefaultBaudRateTbl[i]; + if (HalRuartGenBaudRateRtl8195a(&RuartSpeedSetting) == HAL_OK) { + Divisor = RuartSpeedSetting.Div; + Ovsr = RuartSpeedSetting.Ovsr; + Ovsr_adj = RuartSpeedSetting.Ovsr_adj; + adj = 0; + for (j=0;j<10;j++) { + if (Ovsr_adj & (1<pDefaultBaudRateTbl[i], Ovsr, Divisor, Ovsr_adj, adj); + } + i++; + } + + DBG_8195A("==== 8 Bit ====\r\n"); + i = 0; + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_8; + RuartSpeedSetting.Ovsr_adj_max_bits = 8; + while (pHalRuartAdapter->pDefaultBaudRateTbl[i] < 0xffffffff) { + RuartSpeedSetting.BaudRate = pHalRuartAdapter->pDefaultBaudRateTbl[i]; + if (HalRuartGenBaudRateRtl8195a(&RuartSpeedSetting) == HAL_OK) { + Divisor = RuartSpeedSetting.Div; + Ovsr = RuartSpeedSetting.Ovsr; + Ovsr_adj = RuartSpeedSetting.Ovsr_adj; + adj = 0; + for (j=0;j<10;j++) { + if (Ovsr_adj & (1<pDefaultBaudRateTbl[i], Ovsr, Divisor, Ovsr_adj, adj); + } + i++; + } + } + + return HAL_OK; +} + +HAL_Status +HalRuartSetBaudRateRtl8195a( + IN VOID *Data +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + RUART_SPEED_SETTING RuartSpeedSetting; + u32 RegValue; + u32 Dll, Dlm; + u8 UartIndex; + u32 Divisor; + u32 Ovsr; + u32 Ovsr_adj; + u32 i; + u32 cpu_clk; + u32 baud_rate_temp; + u32 err; + u8 is_defined_baud; + u8 word_bits; + u8 adj_bits; + +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) + u8 chip_ver; + + // get chip version + chip_ver = HalRuartGetChipVerRtl8195a(); +#endif + + if (pHalRuartAdapter->WordLen == RUART_WLS_8BITS) { + word_bits = 8+1; // 1 start bit + 8 data bit + } else { + word_bits = 7+1; + } + + if (pHalRuartAdapter->Parity == RUART_PARITY_ENABLE) { + word_bits++; // 1 parity bit + } + + is_defined_baud = 0; + + if (pHalRuartAdapter->pDefaultBaudRateTbl != NULL) { + i = 0; + while (pHalRuartAdapter->pDefaultBaudRateTbl[i] < 0xffffffff) { + if (pHalRuartAdapter->pDefaultBaudRateTbl[i] == pHalRuartAdapter->BaudRate) { + Divisor = pHalRuartAdapter->pDefaultDivTbl[i]; + Ovsr = pHalRuartAdapter->pDefaultOvsrRTbl[i]; + switch (word_bits) { + case 9: + adj_bits = pHalRuartAdapter->pDefOvsrAdjBitTbl_9[i]; + Ovsr_adj = pHalRuartAdapter->pDefOvsrAdjTbl_9[adj_bits]; + break; + case 10: + adj_bits = pHalRuartAdapter->pDefOvsrAdjBitTbl_10[i]; + Ovsr_adj = pHalRuartAdapter->pDefOvsrAdjTbl_10[adj_bits]; + break; + case 8: + adj_bits = pHalRuartAdapter->pDefOvsrAdjBitTbl_8[i]; + Ovsr_adj = pHalRuartAdapter->pDefOvsrAdjTbl_8[adj_bits]; + break; + + default: + adj_bits = pHalRuartAdapter->pDefOvsrAdjBitTbl_9[i]; + Ovsr_adj = pHalRuartAdapter->pDefOvsrAdjTbl_9[adj_bits]; + break; + } + // Verify again + cpu_clk = UART_SCLK; + baud_rate_temp = cpu_clk/Ovsr/Divisor; + if (baud_rate_temp > pHalRuartAdapter->BaudRate) { + err = baud_rate_temp - pHalRuartAdapter->BaudRate; + } else { + err = pHalRuartAdapter->BaudRate - baud_rate_temp; + } + + // Tolerance is 10% + // If the err is too big, it may caused by "the baud rate table is not for this CPU clock" + if (err < (pHalRuartAdapter->BaudRate/10)) { + is_defined_baud = 1; + } + break; // break the while loop + } else { + i++; + } + } + } + + if (is_defined_baud == 0) { + + switch (word_bits) { + case 9: + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_9; + break; + + case 10: + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_10; + break; + + case 8: + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_8; + break; + + default: + word_bits = 9; + RuartSpeedSetting.Ovsr_adj_map = pHalRuartAdapter->pDefOvsrAdjTbl_9; + break; + } + DBG_UART_INFO("BaudRate(%d) not in the Lookup table \n", pHalRuartAdapter->BaudRate); + RuartSpeedSetting.Ovsr_adj_max_bits = word_bits; + RuartSpeedSetting.max_err = 3; + RuartSpeedSetting.Ovsr_min = UART_OVSR_POOL_MIN; + RuartSpeedSetting.Ovsr_max = UART_OVSR_POOL_MAX; + RuartSpeedSetting.divisor_resolution = DIVISOR_RESOLUTION; + RuartSpeedSetting.jitter_lim = JITTER_LIMIT; + RuartSpeedSetting.sclk = UART_SCLK; + RuartSpeedSetting.BaudRate = pHalRuartAdapter->BaudRate; +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) + if (chip_ver < 2) { + // A or B Cut + // workround: +2% bias + RuartSpeedSetting.BaudRate = (pHalRuartAdapter->BaudRate * 102)/100; + } +#endif + if (HalRuartGenBaudRateRtl8195a(&RuartSpeedSetting) == HAL_OK) { + Divisor = RuartSpeedSetting.Div; + Ovsr = RuartSpeedSetting.Ovsr; + Ovsr_adj = RuartSpeedSetting.Ovsr_adj; + } else { + DBG_UART_ERR("Invalid BaudRate(%d), Force Baud Rateit as 9600\n", + pHalRuartAdapter->BaudRate); + Divisor = 434; + Ovsr = 20; + Ovsr_adj = 0; + } + } + + UartIndex = pHalRuartAdapter->UartIndex; + + DBG_UART_INFO("HalRuartSetBaudRateRtl8195a: BaudRate:%d Divisor:%d Ovsr:%d Ovsr_ADj:0x%x\n", + pHalRuartAdapter->BaudRate, Divisor, Ovsr, Ovsr_adj); + + Dll = Divisor & 0xFF; + Dlm = (Divisor & 0xFF00) >> 8; + + /* Set DLAB bit to 1 to access DLL/DLM */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF); + RegValue |= RUART_LINE_CTL_REG_DLAB_ENABLE; + HAL_RUART_WRITE32(UartIndex, RUART_LINE_CTL_REG_OFF, RegValue); + + HAL_RUART_WRITE32(UartIndex, RUART_DLL_OFF, Dll); + HAL_RUART_WRITE32(UartIndex, RUART_DLM_OFF, Dlm); + + /** + * Clean Rx break signal interrupt status at initial stage. + */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_SCRATCH_PAD_REG_OFF); + RegValue |= RUART_SP_REG_RXBREAK_INT_STATUS; + HAL_RUART_WRITE32(UartIndex, RUART_SCRATCH_PAD_REG_OFF, RegValue); + + /* Set OVSR(xfactor) */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_STS_REG_OFF); + RegValue &= ~(RUART_STS_REG_XFACTOR); + RegValue |= (((Ovsr - 5) << 4) & RUART_STS_REG_XFACTOR); + HAL_RUART_WRITE32(UartIndex, RUART_STS_REG_OFF, RegValue); + + /* Set OVSR_ADJ[10:0] (xfactor_adj[26:16]) */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_SCRATCH_PAD_REG_OFF); + RegValue &= ~(RUART_SP_REG_XFACTOR_ADJ); + RegValue |= ((Ovsr_adj << 16) & RUART_SP_REG_XFACTOR_ADJ); + HAL_RUART_WRITE32(UartIndex, RUART_SCRATCH_PAD_REG_OFF, RegValue); + + /* clear DLAB bit */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF); + RegValue &= ~(RUART_LINE_CTL_REG_DLAB_ENABLE); + HAL_RUART_WRITE32(UartIndex, RUART_LINE_CTL_REG_OFF, RegValue); + pHalRuartAdapter->BaudRateUsing = pHalRuartAdapter->BaudRate; + + return HAL_OK; +} + + +HAL_Status +HalRuartInitRtl8195a_Patch( + IN VOID *Data ///< RUART Adapter +) +{ + /* DBG_ENTRANCE; */ + u32 RegValue; + u8 UartIndex; + u8 PinmuxSelect; + + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + + UartIndex = pHalRuartAdapter->UartIndex; + PinmuxSelect = pHalRuartAdapter->PinmuxSelect; + + if (UartIndex > 2) { + DBG_UART_ERR(ANSI_COLOR_MAGENTA"HalRuartInitRtl8195a: Invalid UART Index\n"ANSI_COLOR_RESET); + return HAL_ERR_PARA; + } + + DBG_UART_INFO("HalRuartInitRtl8195a: [UART %d] PinSel=%d\n", UartIndex, PinmuxSelect); + if(( PinmuxSelect == RUART0_MUX_TO_GPIOE ) && ((UartIndex == 0) || (UartIndex == 1))) { + DBG_UART_WARN(ANSI_COLOR_MAGENTA"UART Pin may conflict with JTAG\r\n"ANSI_COLOR_RESET); + } + + // switch Pin from EEPROM to UART0 + if(( PinmuxSelect == RUART0_MUX_TO_GPIOC ) && (UartIndex == 0)) { + RegValue = HAL_READ32(SYSTEM_CTRL_BASE, 0xa4); + if (RegValue & 0x10) { + DBG_UART_WARN("UART Pin may conflict with EEPROM\n"); +// HAL_WRITE32(SYSTEM_CTRL_BASE, 0xa4, (RegValue & (~0x10))); + } + } + + switch (UartIndex) { + case 0: + /* UART 0 */ + ACTCK_UART0_CCTRL(ON); + SLPCK_UART0_CCTRL(ON); + PinCtrl(UART0, PinmuxSelect, ON); + UART0_FCTRL(ON); + UART0_BD_FCTRL(ON); + break; + + case 1: + /* UART 1 */ + ACTCK_UART1_CCTRL(ON); + SLPCK_UART1_CCTRL(ON); + PinCtrl(UART1, PinmuxSelect, ON); + UART1_FCTRL(ON); + UART1_BD_FCTRL(ON); + break; + + case 2: + /* UART 1 */ + ACTCK_UART2_CCTRL(ON); + SLPCK_UART2_CCTRL(ON); + PinCtrl(UART2, PinmuxSelect, ON); + UART2_FCTRL(ON); + UART2_BD_FCTRL(ON); + break; + + default: + DBG_UART_ERR("Invalid UART Index(%d)\n", UartIndex); + return HAL_ERR_PARA; + } + + /* Reset RX FIFO */ + HalRuartResetRxFifoRtl8195a(Data); + DBG_UART_INFO(ANSI_COLOR_CYAN"HAL UART Init[UART %d]\n"ANSI_COLOR_RESET, UartIndex); + + /* Disable all interrupts */ + HAL_RUART_WRITE32(UartIndex, RUART_INTERRUPT_EN_REG_OFF, 0x00); + + /* Set Baudrate Division */ + if (pHalRuartAdapter->BaudRateUsing != pHalRuartAdapter->BaudRate) { + HalRuartSetBaudRateRtl8195a(pHalRuartAdapter); + } + + /** + * Clean Rx break signal interrupt status at initial stage. + */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_SCRATCH_PAD_REG_OFF); + RegValue |= RUART_SP_REG_RXBREAK_INT_STATUS; + HAL_RUART_WRITE32(UartIndex, RUART_SCRATCH_PAD_REG_OFF, RegValue); + +// DBG_UART_INFO("[R] UART%d INT_EN(0x04) = %x\n", UartIndex, pHalRuartAdapter->Interrupts); + RegValue = ((pHalRuartAdapter->Interrupts) & 0xFF); + HAL_RUART_WRITE32(UartIndex, RUART_INTERRUPT_EN_REG_OFF, RegValue); +// DBG_UART_INFO("[W] UART%d INT_EN(0x04) = %x\n", UartIndex, RegValue); + + /* Configure FlowControl */ + if (pHalRuartAdapter->FlowControl == AUTOFLOW_ENABLE) { + RegValue = HAL_RUART_READ32(UartIndex, RUART_MODEM_CTL_REG_OFF); + RegValue |= RUART_MCL_AUTOFLOW_ENABLE; + HAL_RUART_WRITE32(UartIndex, RUART_MODEM_CTL_REG_OFF, RegValue); + } + + /* RUART DMA Initialization */ +// HalRuartDmaInitRtl8195a(pHalRuartAdapter); + + DBG_UART_INFO("[R] UART%d LCR(0x%02X): %X\n", UartIndex, RUART_LINE_CTL_REG_OFF, HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF)); + RegValue = HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF); + + /* PARITY CONTROL */ + RegValue &= BIT_CLR_LCR_WLS; + RegValue |= BIT_LCR_WLS(pHalRuartAdapter->WordLen); + + RegValue &= BIT_INVC_LCR_STB_EN; + RegValue |= BIT_LCR_STB_EN(pHalRuartAdapter->StopBit); + + RegValue &= BIT_INVC_LCR_PARITY_EN; + RegValue |= BIT_LCR_PARITY_EN(pHalRuartAdapter->Parity); + + /* PARITY TYPE SELECT */ + RegValue &= BIT_INVC_LCR_PARITY_TYPE; + RegValue |= BIT_LCR_PARITY_TYPE(pHalRuartAdapter->ParityType); + + /* STICK PARITY CONTROL */ + RegValue &= BIT_INVC_LCR_STICK_PARITY_EN; + RegValue |= BIT_LCR_STICK_PARITY_EN(pHalRuartAdapter->StickParity); + + HAL_RUART_WRITE32(UartIndex, RUART_LINE_CTL_REG_OFF, RegValue); + DBG_UART_INFO("[W] UART%d LCR(0x%02X): %X\n", UartIndex, RUART_LINE_CTL_REG_OFF, HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF)); + + /* Need to assert RTS during initial stage. */ + if (pHalRuartAdapter->FlowControl == AUTOFLOW_ENABLE) { + HalRuartRTSCtrlRtl8195a(Data, 1); + } + pHalRuartAdapter->State = HAL_UART_STATE_READY; + + return HAL_OK; +} + +HAL_Status +HalRuartEnableRtl8195a( + IN VOID *Data +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + u8 UartIndex; + + // Enable IP Clock + UartIndex = pHalRuartAdapter->UartIndex; + switch (UartIndex) { + case 0: + /* UART 0 */ + ACTCK_UART0_CCTRL(ON); + SLPCK_UART0_CCTRL(ON); + break; + + case 1: + /* UART 1 */ + ACTCK_UART1_CCTRL(ON); + SLPCK_UART1_CCTRL(ON); + break; + + case 2: + /* UART 1 */ + ACTCK_UART2_CCTRL(ON); + SLPCK_UART2_CCTRL(ON); + break; + + default: + DBG_UART_ERR("Invalid UART Index(%d)\n", UartIndex); + return HAL_ERR_PARA; + } + + return HAL_OK; +} + +HAL_Status +HalRuartDisableRtl8195a( + IN VOID *Data +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + u8 UartIndex; + + // Gate IP Clock + UartIndex = pHalRuartAdapter->UartIndex; + switch (UartIndex) { + case 0: + /* UART 0 */ + ACTCK_UART0_CCTRL(OFF); + SLPCK_UART0_CCTRL(OFF); + break; + + case 1: + /* UART 1 */ + ACTCK_UART1_CCTRL(OFF); + SLPCK_UART1_CCTRL(OFF); + break; + + case 2: + /* UART 1 */ + ACTCK_UART2_CCTRL(OFF); + SLPCK_UART2_CCTRL(OFF); + break; + + default: + DBG_UART_ERR("Invalid UART Index(%d)\n", UartIndex); + return HAL_ERR_PARA; + } + + return HAL_OK; +} + +HAL_Status +HalRuartFlowCtrlRtl8195a( + IN VOID *Data +) +{ + u32 UartIndex; + u32 RegValue; + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + + UartIndex = pHalRuartAdapter->UartIndex; + + RegValue = HAL_RUART_READ32(UartIndex, RUART_MODEM_CTL_REG_OFF); + if (!pHalRuartAdapter->FlowControl) { + // No Auto Flow Control: no flow control or flow controled by software + RegValue &= ~(RUART_MCL_AUTOFLOW_ENABLE); + } + else { + RegValue |= RUART_MCL_AUTOFLOW_ENABLE; + } + HAL_RUART_WRITE32(UartIndex, RUART_MODEM_CTL_REG_OFF, RegValue); + + return HAL_OK; +} + +/** + * RUART send a data buffer by DMA(non-block) mode. + * + * RUART send data. + * + * @return VOID + */ +HAL_Status +HalRuartDmaSendRtl8195a_Patch( + IN VOID *Data, // PHAL_RUART_ADAPTER + IN u8 *pTxData, // the Buffer to be send + IN u32 Length // the length of data to be send + ) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)Data; +// u8 UartIndex = pHalRuartAdapter->UartIndex; + PUART_DMA_CONFIG pUartGdmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + HAL_UART_State State; + + State = pHalRuartAdapter->State; + if ((State != HAL_UART_STATE_READY) && (State != HAL_UART_STATE_BUSY_RX)) { + DBG_UART_WARN("HalRuartDmaSendRtl8195a: on Busy, State=%d\n", State); + return HAL_BUSY; + } + + if ((pTxData == NULL) || (Length == 0)) { + pHalRuartAdapter->Status = HAL_UART_STATUS_ERR_PARA; + DBG_UART_ERR("HalRuartDmaSendRtl8195a: Err: pTxData=0x%x, Length=%d\n", pTxData, Length); + return HAL_ERR_PARA; + } + + if (HAL_OK != RuartLock(pHalRuartAdapter)) { + DBG_UART_WARN("HalRuartDmaSendRtl8195a:Unable to Lock, Statu=%d\n", State); + return HAL_BUSY; + } + + if (State == HAL_UART_STATE_READY) { + pHalRuartAdapter->State = HAL_UART_STATE_BUSY_TX; + } + else { + pHalRuartAdapter->State = HAL_UART_STATE_BUSY_TX_RX; + } + + pHalRuartAdapter->Status = HAL_UART_STATUS_OK; + pHalRuartAdapter->pTxBuf = pTxData; + pHalRuartAdapter->TxCount = Length; +#if 0 + while (pHalRuartAdapter->TxCount > 0) { + if (HAL_RUART_READ32(UartIndex, RUART_LINE_STATUS_REG_OFF) & + (RUART_LINE_STATUS_REG_THRE)) { + HAL_RUART_WRITE32(UartIndex, RUART_TRAN_HOLD_REG_OFF, (*(pHalRuartAdapter->pTxBuf))); + pHalRuartAdapter->TxCount--; + pHalRuartAdapter->pTxBuf++; + } + else { + break; + } + } + + if (0 == pHalRuartAdapter->TxCount) { + if (State == HAL_UART_STATE_READY) { + pHalRuartAdapter->State = HAL_UART_STATE_READY; + } + else { + pHalRuartAdapter->State = HAL_UART_STATE_BUSY_RX; + } + + // Call user TX complete callback + if (NULL != pHalRuartAdapter->TxCompCallback) { + pHalRuartAdapter->TxCompCallback(pHalRuartAdapter->TxCompCbPara); + } + } + else +#endif + { + // Enable GDMA for TX + pUartGdmaConfig = pHalRuartAdapter->DmaConfig; + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter; + pHalGdmaOp = (PHAL_GDMA_OP)pUartGdmaConfig->pHalGdmaOp; + + if (((pHalRuartAdapter->TxCount & 0x03)==0) && + (((u32)(pHalRuartAdapter->pTxBuf) & 0x03)==0)) { + // 4-bytes aligned, move 4 bytes each transfer + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeOne; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.BlockSize = pHalRuartAdapter->TxCount >> 2; + } + else{ + // move 1 byte each transfer + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeFour; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.BlockSize = pHalRuartAdapter->TxCount; + } + + if (pHalGdmaAdapter->GdmaCtl.BlockSize > 4096) { + // over Maximum block size 4096 + RuartUnLock(pHalRuartAdapter); + return HAL_ERR_PARA; + } + + pHalGdmaAdapter->ChSar = (u32)(pHalRuartAdapter->pTxBuf); + + pHalGdmaOp->HalGdmaOnOff((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChIsrEnAndDis((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChSeting((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChEn((VOID*)(pHalGdmaAdapter)); + } + + RuartUnLock(pHalRuartAdapter); + + return HAL_OK; +} + +/** + * Stop non-blocking UART TX + * + * + * @return VOID + */ +HAL_Status +HalRuartStopRecvRtl8195a_Patch( + IN VOID *Data // PHAL_RUART_ADAPTER + ) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)Data; + PUART_DMA_CONFIG pUartGdmaConfig; + HAL_UART_State State; + u32 DMA_Dar; + u32 RecvdCnt; + + State = pHalRuartAdapter->State; + if ((State != HAL_UART_STATE_BUSY_RX) && (State != HAL_UART_STATE_BUSY_TX_RX)) { + DBG_UART_WARN("HalRuartStopRecvRtl8195a: Not in TX state, State=%d\n", State); + return HAL_OK; + } + + if (HAL_OK != RuartLock(pHalRuartAdapter)) { + DBG_UART_WARN("HalRuartStopRecvRtl8195a:Unable to Lock, Statu=%d\n", State); + return HAL_BUSY; + } + + // Disable Rx interrupt + pHalRuartAdapter->Interrupts &= ~(RUART_IER_ERBI | RUART_IER_ELSI); + HalRuartSetIMRRtl8195a (pHalRuartAdapter); + + pUartGdmaConfig = pHalRuartAdapter->DmaConfig; + if (NULL != pUartGdmaConfig) { + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + u8 IsrTypeMap; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter; + pHalGdmaOp = (PHAL_GDMA_OP)pUartGdmaConfig->pHalGdmaOp; + + if ((NULL != pHalGdmaAdapter) && (NULL != pHalGdmaOp) && + (HalGdmaQueryChEnRtl8195a((VOID*)pHalGdmaAdapter))) { + // Clean Auto Reload Bit + pHalGdmaOp->HalGdmaChCleanAutoDst((VOID*)pHalGdmaAdapter); + // Clear Pending ISR + IsrTypeMap = pHalGdmaOp->HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); + pHalGdmaOp->HalGdmaChDis((VOID*)(pHalGdmaAdapter)); + + DMA_Dar = HalGdmaQueryDArRtl8195a((VOID*)pHalGdmaAdapter); + RecvdCnt = DMA_Dar - (u32)(pHalRuartAdapter->pRxBuf); +// DBG_8195A("%s: got %d bytes\r\n", __FUNCTION__, RecvdCnt); + pHalRuartAdapter->RxCount -= RecvdCnt; + pHalRuartAdapter->pRxBuf += RecvdCnt; + } + } + + while (HalRuartGetCRtl8195a(pHalRuartAdapter, pHalRuartAdapter->pRxBuf) == HAL_OK) { + pHalRuartAdapter->RxCount--; + pHalRuartAdapter->pRxBuf++; + } + + if (pHalRuartAdapter->State == HAL_UART_STATE_BUSY_RX) { + pHalRuartAdapter->State = HAL_UART_STATE_READY; + } + else { + pHalRuartAdapter->State = HAL_UART_STATE_BUSY_TX; + } + + RuartUnLock(pHalRuartAdapter); + + return HAL_OK; + +} + +/** + * Stop non-blocking UART TX + * + * + * @return VOID + */ +HAL_Status +HalRuartStopSendRtl8195a_Patch( + IN VOID *Data // PHAL_RUART_ADAPTER + ) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter=(PHAL_RUART_ADAPTER)Data; + PUART_DMA_CONFIG pUartGdmaConfig; + HAL_UART_State State; + u32 DMA_Sar; + u32 TxedCnt; + + State = pHalRuartAdapter->State; + if ((State != HAL_UART_STATE_BUSY_TX) && (State != HAL_UART_STATE_BUSY_TX_RX)) { + DBG_UART_WARN("HalRuartDmaSendRtl8195a: Not in TX state, State=%d\n", State); + return HAL_OK; + } + + if (HAL_OK != RuartLock(pHalRuartAdapter)) { + DBG_UART_WARN("HalRuartDmaSendRtl8195a:Unable to Lock, Statu=%d\n", State); + return HAL_BUSY; + } + + // Disable Tx FIFO empty interrupt + pHalRuartAdapter->Interrupts &= ~RUART_IER_ETBEI; + HalRuartSetIMRRtl8195a (pHalRuartAdapter); + + pUartGdmaConfig = pHalRuartAdapter->DmaConfig; + if (NULL != pUartGdmaConfig) { + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PHAL_GDMA_OP pHalGdmaOp; + u8 IsrTypeMap; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter; + pHalGdmaOp = (PHAL_GDMA_OP)pUartGdmaConfig->pHalGdmaOp; + + if ((NULL != pHalGdmaAdapter) && (NULL != pHalGdmaOp) && + (HalGdmaQueryChEnRtl8195a((VOID*)pHalGdmaAdapter))) { + // Clean Auto Reload Bit + pHalGdmaOp->HalGdmaChCleanAutoDst((VOID*)pHalGdmaAdapter); + // Clear Pending ISR + IsrTypeMap = pHalGdmaOp->HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); + pHalGdmaOp->HalGdmaChDis((VOID*)(pHalGdmaAdapter)); + + DMA_Sar = HalGdmaQuerySArRtl8195a((VOID*)pHalGdmaAdapter); + TxedCnt = DMA_Sar - (u32)(pHalRuartAdapter->pTxBuf); +// DBG_8195A("%s: got %d bytes\r\n", __FUNCTION__, RecvdCnt); + pHalRuartAdapter->TxCount -= TxedCnt; + pHalRuartAdapter->pTxBuf += TxedCnt; + } + } + + if (State == HAL_UART_STATE_BUSY_TX) { + pHalRuartAdapter->State = HAL_UART_STATE_READY; + } + else { + pHalRuartAdapter->State = HAL_UART_STATE_BUSY_RX; + } + + RuartUnLock(pHalRuartAdapter); + + return HAL_OK; + +} + +VOID +HalRuartEnterCriticalRtl8195a( + IN VOID *Data ///< RUART Adapter +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; +#ifdef CONFIG_GDMA_EN + PUART_DMA_CONFIG pUartGdmaConfig; +#endif + + InterruptDis(&pHalRuartAdapter->IrqHandle); + +#ifdef CONFIG_GDMA_EN + pUartGdmaConfig = pHalRuartAdapter->DmaConfig; + if (NULL != pUartGdmaConfig) { + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter; + if (pHalGdmaAdapter->ChEn != 0) { + InterruptDis(&pUartGdmaConfig->RxGdmaIrqHandle); + } + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter; + if (pHalGdmaAdapter->ChEn != 0) { + InterruptDis(&pUartGdmaConfig->TxGdmaIrqHandle); + } + } +#endif +} + +VOID +HalRuartExitCriticalRtl8195a( + IN VOID *Data ///< RUART Adapter + ) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; +#ifdef CONFIG_GDMA_EN + PUART_DMA_CONFIG pUartGdmaConfig; +#endif + + InterruptEn(&pHalRuartAdapter->IrqHandle); + +#ifdef CONFIG_GDMA_EN + pUartGdmaConfig = pHalRuartAdapter->DmaConfig; + if (NULL != pUartGdmaConfig) { + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter; + if (pHalGdmaAdapter->ChEn != 0) { + InterruptEn(&pUartGdmaConfig->RxGdmaIrqHandle); + } + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter; + if (pHalGdmaAdapter->ChEn != 0) { + InterruptEn(&pUartGdmaConfig->TxGdmaIrqHandle); + } + } +#endif +} + +VOID +HalRuartDumpRegRtl8195a( + IN VOID *Data +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + u8 UartIndex; + u32 i; + u32 RegValue; + + UartIndex = pHalRuartAdapter->UartIndex; + + /* Set DLAB bit to 1 to access DLL/DLM */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF); + RegValue |= RUART_LINE_CTL_REG_DLAB_ENABLE; + HAL_RUART_WRITE32(UartIndex, RUART_LINE_CTL_REG_OFF, RegValue); + + for (i=0;i<0x40;i++) { + DBG_8195A("UART Reg[0x%x] = 0x%x\r\n", i, HAL_RUART_READ8(UartIndex, i)); + } + +/* clear DLAB bit */ + RegValue = HAL_RUART_READ32(UartIndex, RUART_LINE_CTL_REG_OFF); + RegValue &= ~(RUART_LINE_CTL_REG_DLAB_ENABLE); + HAL_RUART_WRITE32(UartIndex, RUART_LINE_CTL_REG_OFF, RegValue); +} diff --git a/lib/fwlib/rtl8195a_usb.h b/lib/fwlib/rtl8195a_usb.h new file mode 100644 index 0000000..2543e79 --- /dev/null +++ b/lib/fwlib/rtl8195a_usb.h @@ -0,0 +1,111 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTL8195A_USB_H_ +#define _RTL8195A_USB_H_ + + +// common command for USB +#define USB_CMD_TX_ETH 0x83 // request to TX a 802.3 packet +#define USB_CMD_TX_WLN 0x81 // request to TX a 802.11 packet +#define USB_CMD_H2C 0x11 // H2C(host to device) command packet +#define USB_CMD_MEMRD 0x51 // request to read a block of memory data +#define USB_CMD_MEMWR 0x53 // request to write a block of memory +#define USB_CMD_MEMST 0x55 // request to set a block of memory with a value +#define USB_CMD_STARTUP 0x61 // request to jump to the start up function + +#define USB_CMD_RX_ETH 0x82 // indicate a RX 802.3 packet +#define USB_CMD_RX_WLN 0x80 // indicate a RX 802.11 packet +#define USB_CMD_C2H 0x10 // C2H(device to host) command packet +#define USB_CMD_MEMRD_RSP 0x50 // response to memory block read command +#define USB_CMD_MEMWR_RSP 0x52 // response to memory write command +#define USB_CMD_MEMST_RSP 0x54 // response to memory set command +#define USB_CMD_STARTED 0x60 // indicate the program has jumped to the given function + + +// TODO: This data structer just for test, we should modify it for the normal driver +typedef struct _USB_TX_DESC{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 txpktsize:16; // bit[15:0] + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number +#else + u32 bus_agg_num:8; // bit[31:24], the bus aggregation number + u32 offset:8; // bit[23:16], store the sizeof(SDIO_TX_DESC) + u32 txpktsize:16; // bit[15:0] +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the packet type + u32 rsvd0:24; +#else + u32 rsvd0:24; + u32 type:8; // bit[7:0], the packet type +#endif + + // u4Byte 2 + u32 rsvd1; + + // u4Byte 3 + u32 rsvd2; + + // u4Byte 4 + u32 rsvd3; + + // u4Byte 5 + u32 rsvd4; +} USB_TX_DESC, *PUSB_TX_DESC; + +#define SIZE_USB_TX_DESC sizeof(USB_TX_DESC) + +// TODO: This data structer just for test, we should modify it for the normal driver +typedef struct _USB_RX_DESC{ + // u4Byte 0 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 pkt_len:16; // bit[15:0], the packet size + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 rsvd0:6; // bit[29:24] + u32 icv:1; // bit[30], ICV error + u32 crc:1; // bit[31], CRC error +#else + u32 crc:1; // bit[31], CRC error + u32 icv:1; // bit[30], ICV error + u32 rsvd0:6; // bit[29:24] + u32 offset:8; // bit[23:16], the offset from the packet start to the buf start, also means the size of RX Desc + u32 pkt_len:16; // bit[15:0], the packet size +#endif + + // u4Byte 1 +#if (SYSTEM_ENDIAN==PLATFORM_LITTLE_ENDIAN) + u32 type:8; // bit[7:0], the type of this packet + u32 rsvd1:24; // bit[31:8] +#else + u32 rsvd1:24; // bit[31:8] + u32 type:8; // bit[7:0], the type of this packet +#endif + + // u4Byte 2 + u32 rsvd2; + + // u4Byte 3 + u32 rsvd3; + + // u4Byte 4 + u32 rsvd4; + + // u4Byte 5 + u32 rsvd5; +} USB_RX_DESC, *PUSB_RX_DESC; + +#define SIZE_USB_RX_DESC sizeof(USB_RX_DESC) + +#endif // #ifndef _RTL8195A_USB_H_ + diff --git a/lib/fwlib/src/hal_32k.c b/lib/fwlib/src/hal_32k.c new file mode 100644 index 0000000..5394d2c --- /dev/null +++ b/lib/fwlib/src/hal_32k.c @@ -0,0 +1,293 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" + +#ifdef CONFIG_TIMER_MODULE + +VOID +En32KCalibration( + VOID +) +{ + u32 Rtemp; + u32 Ttemp = 0; + + //DiagPrintf("32K clock source calibration\n"); + + //set parameter + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0); + //offset 1 = 0x1500 + Rtemp = 0x811500; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + HalDelayUs(40); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0); + + //offset 2 = 0x01c0 + Rtemp = 0x8201c0; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + HalDelayUs(40); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0); + + //offset 4 = 0x0100 + Rtemp = 0x840100; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + HalDelayUs(40); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0); + + //offset 0 = 0xf980 + Rtemp = 0x80f980; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + HalDelayUs(40); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0); + + while(1) { + //Polling LOCK + Rtemp = 0x110000; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + //DiagPrintf("Polling lock\n"); + HalDelayUs(40); + + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL1); + if ((Rtemp & 0x3000) != 0x0){ + //DiagPrintf("32.768 Calibration Success\n", Ttemp); + break; + } + else { + Ttemp++; + HalDelayUs(30); + //DiagPrintf("Check lock: %d\n", Ttemp); + //DiagPrintf("0x278: %x\n", Rtemp); + if (Ttemp > 100000) { /*Delay 100ms*/ + DiagPrintf("32K Calibration Fail!!\n", Ttemp); + break; + } + } + } +} + +#if CONFIG_WDG +WDG_ADAPTER WDGAdapter; +extern HAL_TIMER_OP HalTimerOp; + +#ifdef CONFIG_WDG_NORMAL +VOID +WDGInitial( + IN u32 Period +) +{ + u8 CountId; + u16 DivFactor; + u32 CountTemp; + u32 CountProcess = 0; + u32 DivFacProcess = 0; + u32 PeriodProcess = 100*Period; + u32 MinPeriodTemp = 0xFFFFFFFF; + u32 PeriodTemp = 0; + u32 *Reg = (u32*)&(WDGAdapter.Ctrl); + + DBG_8195A(" Period = 0x%08x\n", Period); + + for (CountId = 0; CountId < 12; CountId++) { + CountTemp = ((0x00000001 << (CountId+1))-1); + DivFactor = (u16)((PeriodProcess)/(CountTemp*3)); + + if (DivFactor > 0) { + PeriodTemp = 3*(DivFactor+1)*CountTemp; + if (PeriodProcess < PeriodTemp) { + if (MinPeriodTemp > PeriodTemp) { + MinPeriodTemp = PeriodTemp; + CountProcess = CountId; + DivFacProcess = DivFactor; + } + } + } + } + + DBG_8195A("WdgScalar = 0x%08x\n", DivFacProcess); + DBG_8195A("WdgCunLimit = 0x%08x\n", CountProcess); + + WDGAdapter.Ctrl.WdgScalar = DivFacProcess; + WDGAdapter.Ctrl.WdgEnByte = 0; + WDGAdapter.Ctrl.WdgClear = 1; + WDGAdapter.Ctrl.WdgCunLimit = CountProcess; + WDGAdapter.Ctrl.WdgMode = RESET_MODE; + WDGAdapter.Ctrl.WdgToISR = 0; + + HAL_WRITE32(VENDOR_REG_BASE, 0, (*Reg)); + +} + +VOID +WDGIrqHandle +( + IN VOID *Data +) +{ + u32 temp; + WDG_REG *CtrlReg; + + if (NULL != WDGAdapter.UserCallback) { + WDGAdapter.UserCallback(WDGAdapter.callback_id); + } + + // Clear ISR + temp = HAL_READ32(VENDOR_REG_BASE, 0); + CtrlReg = (WDG_REG*)&temp; + CtrlReg->WdgToISR = 1; // write 1 clear + HAL_WRITE32(VENDOR_REG_BASE, 0, (temp)); +} + +VOID +WDGIrqInitial( + VOID +) +{ + u32 *Temp = (u32*)&(WDGAdapter.Ctrl); + + WDGAdapter.IrqHandle.Data = (u32)&WDGAdapter; + WDGAdapter.IrqHandle.IrqFun = (IRQ_FUN)WDGIrqHandle; + WDGAdapter.IrqHandle.IrqNum = WDG_IRQ; + WDGAdapter.IrqHandle.Priority = 0; + + InterruptRegister(&(WDGAdapter.IrqHandle)); + InterruptEn(&(WDGAdapter.IrqHandle)); + + WDGAdapter.Ctrl.WdgToISR = 1; // clear ISR first + WDGAdapter.Ctrl.WdgMode = INT_MODE; + HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp))); + WDGAdapter.Ctrl.WdgToISR = 0; +} + +VOID +WDGStart( + VOID +) +{ + u32 *Temp = (u32*)&(WDGAdapter.Ctrl); + WDGAdapter.Ctrl.WdgEnByte = 0xA5; + HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp))); +} + +VOID +WDGStop( + VOID +) +{ + u32 *Temp = (u32*)&(WDGAdapter.Ctrl); + WDGAdapter.Ctrl.WdgEnByte = 0; + HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp))); +} + +VOID +WDGRefresh( + VOID +) +{ + u32 *Temp = (u32*)&(WDGAdapter.Ctrl); + WDGAdapter.Ctrl.WdgClear = 1; + HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp))); +} + +VOID +WDGIrqCallBackReg( + IN VOID *CallBack, + IN u32 Id +) +{ + WDGAdapter.UserCallback = (VOID (*)(u32))CallBack; + WDGAdapter.callback_id = Id; +} + +#endif + +#ifdef CONFIG_WDG_TEST +VOID +WDGIrqHandle +( + IN VOID *Data +) +{ +} + + +VOID +WDGGtimerHandle +( + IN VOID *Data +) +{ + u32 *Temp = (u32*)&(WDGAdapter.Ctrl); + WDGAdapter.Ctrl.WdgClear = 1; + DBG_8195A("reset WDG\n"); + if (HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO2) == 0) { + HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp))); + } +} + + +VOID +InitWDGIRQ(VOID) +{ + u32 *Temp = (u32*)&(WDGAdapter.Ctrl); + + WDGAdapter.Ctrl.WdgScalar = 0x96; + WDGAdapter.Ctrl.WdgEnByte = 0xA5; + WDGAdapter.Ctrl.WdgClear = 1; + WDGAdapter.Ctrl.WdgCunLimit = CNTFFFH; + WDGAdapter.Ctrl.WdgMode = RESET_MODE; + WDGAdapter.Ctrl.WdgToISR = 0; + + if (WDGAdapter.Ctrl.WdgMode == INT_MODE) { + + WDGAdapter.IrqHandle.Data = NULL; + WDGAdapter.IrqHandle.IrqFun = (IRQ_FUN)WDGIrqHandle; + WDGAdapter.IrqHandle.IrqNum = WDG_IRQ; + WDGAdapter.IrqHandle.Priority = 0; + + InterruptRegister(&(WDGAdapter.IrqHandle)); + InterruptEn(&(WDGAdapter.IrqHandle)); + } + else { + + WDGAdapter.WdgGTimer.TimerIrqPriority = 0; + WDGAdapter.WdgGTimer.TimerMode = USER_DEFINED; + WDGAdapter.WdgGTimer.IrqDis = OFF; + WDGAdapter.WdgGTimer.TimerId = 2;// + WDGAdapter.WdgGTimer.IrqHandle.IrqFun = (IRQ_FUN)WDGGtimerHandle; + WDGAdapter.WdgGTimer.IrqHandle.IrqNum = TIMER2_7_IRQ; + WDGAdapter.WdgGTimer.IrqHandle.Priority = 0; + WDGAdapter.WdgGTimer.IrqHandle.Data = NULL; + + if ((WDGAdapter.Ctrl.WdgCunLimit == CNTFFFH)&&(WDGAdapter.Ctrl.WdgScalar >= 0x8429)){ + WDGAdapter.WdgGTimer.TimerLoadValueUs = 0xFFFFFFFF - WDGTIMERELY; + } + else { + WDGAdapter.WdgGTimer.TimerLoadValueUs = (BIT0 << (WDGAdapter.Ctrl.WdgCunLimit+1)) + *WDGAdapter.Ctrl.WdgScalar*TIMER_TICK_US - WDGTIMERELY; + } + + HalTimerOp.HalTimerInit((VOID*) &(WDGAdapter.WdgGTimer)); + } + //fill reg + HAL_WRITE32(VENDOR_REG_BASE, 0, ((*Temp))); +} + + +//WDG +VOID HalWdgInit( + VOID +) +{ + +} +#endif //CONFIG_WDG_TEST +#endif //CONFIG_WDG +#endif //#ifdef CONFIG_TIMER_MODULE diff --git a/lib/fwlib/src/hal_adc.c b/lib/fwlib/src/hal_adc.c new file mode 100644 index 0000000..dc30447 --- /dev/null +++ b/lib/fwlib/src/hal_adc.c @@ -0,0 +1,1603 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "basic_types.h" +#include "diag.h" +#include "rand.h" +#include "section_config.h" +#include "rtl_utility.h" +#include "osdep_api.h" +#include "hal_adc.h" +#include "hal_gdma.h" +#include "hal_timer.h" + +#define ADC_STATIC_ALLOC 0 + +static volatile u32 ADCDatBuf[2]; +static volatile u8 ADCFullStsFlag; +static RTK_STATUS +RtkADCPinMuxDeInit( + IN PSAL_ADC_HND pSalADCHND +); + +static RTK_STATUS +RtkADCIrqDeInit( + IN PSAL_ADC_HND pSalADCHND +); + +static RTK_STATUS +RtkADCDMADeInit( + IN PSAL_ADC_HND pSalADCHND +); +/* DAC SAL global variables declaration when kernel disabled */ +#ifndef CONFIG_KERNEL + SRAM_BF_DATA_SECTION + HAL_ADC_OP HalADCOpSAL; +#endif + +#if ADC0_USED /*#if ADC0_USED*/ +#if ADC_STATIC_ALLOC + SRAM_BF_DATA_SECTION + SAL_ADC_MNGT_ADPT SalADC0MngtAdpt; + + SRAM_BF_DATA_SECTION + SAL_ADC_HND_PRIV SalADC0HndPriv; + + SRAM_BF_DATA_SECTION + HAL_ADC_INIT_DAT HalADC0InitData; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC0IrqHandleDat; + + SRAM_BF_DATA_SECTION + HAL_GDMA_ADAPTER HalADC0GdmaAdpt; + + SRAM_BF_DATA_SECTION + HAL_GDMA_OP HalADC0GdmaOp; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC0GDMAIrqHandleDat; + + SRAM_BF_DATA_SECTION + SAL_ADC_USER_CB SalADC0UserCB; + + SRAM_BF_DATA_SECTION + SAL_ADC_USERCB_ADPT SalADC0UserCBAdpt[SAL_ADC_USER_CB_NUM]; +#endif +#endif /*#if ADC0_USED*/ + +#if ADC1_USED /*#if ADC1_USED*/ +#if ADC_STATIC_ALLOC + SRAM_BF_DATA_SECTION + SAL_ADC_MNGT_ADPT SalADC1MngtAdpt; + + SRAM_BF_DATA_SECTION + SAL_ADC_HND_PRIV SalADC1HndPriv; + + SRAM_BF_DATA_SECTION + HAL_ADC_INIT_DAT HalADC1InitData; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC1IrqHandleDat; + + SRAM_BF_DATA_SECTION + HAL_GDMA_ADAPTER HalADC1GdmaAdpt; + + SRAM_BF_DATA_SECTION + HAL_GDMA_OP HalADC1GdmaOp; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC1GDMAIrqHandleDat; + + SRAM_BF_DATA_SECTION + SAL_ADC_USER_CB SalADC1UserCB; + + SRAM_BF_DATA_SECTION + SAL_ADC_USERCB_ADPT SalADC1UserCBAdpt[SAL_ADC_USER_CB_NUM]; +#endif +#endif /*#if ADC1_USED*/ + +#if ADC2_USED /*#if ADC2_USED*/ +#if ADC_STATIC_ALLOC + SRAM_BF_DATA_SECTION + SAL_ADC_MNGT_ADPT SalADC2MngtAdpt; + + SRAM_BF_DATA_SECTION + SAL_ADC_HND_PRIV SalADC2HndPriv; + + SRAM_BF_DATA_SECTION + HAL_ADC_INIT_DAT HalADC2InitData; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC2IrqHandleDat; + + SRAM_BF_DATA_SECTION + HAL_GDMA_ADAPTER HalADC2GdmaAdpt; + + SRAM_BF_DATA_SECTION + HAL_GDMA_OP HalADC2GdmaOp; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC2GDMAIrqHandleDat; + + SRAM_BF_DATA_SECTION + SAL_ADC_USER_CB SalADC2UserCB; + + SRAM_BF_DATA_SECTION + SAL_ADC_USERCB_ADPT SalADC2UserCBAdpt[SAL_ADC_USER_CB_NUM]; +#endif +#endif /*#if ADC2_USED*/ + +#if ADC3_USED /*#if ADC3_USED*/ +#if ADC_STATIC_ALLOC + SRAM_BF_DATA_SECTION + SAL_ADC_MNGT_ADPT SalADC3MngtAdpt; + + SRAM_BF_DATA_SECTION + SAL_ADC_HND_PRIV SalADC3HndPriv; + + SRAM_BF_DATA_SECTION + HAL_ADC_INIT_DAT HalADC3InitData; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC3IrqHandleDat; + + SRAM_BF_DATA_SECTION + HAL_GDMA_ADAPTER HalADC3GdmaAdpt; + + SRAM_BF_DATA_SECTION + HAL_GDMA_OP HalADC3GdmaOp; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE ADC3GDMAIrqHandleDat; + + SRAM_BF_DATA_SECTION + SAL_ADC_USER_CB SalADC3UserCB; + + SRAM_BF_DATA_SECTION + SAL_ADC_USERCB_ADPT SalADC3UserCBAdpt[SAL_ADC_USER_CB_NUM]; +#endif +#endif /*#if ADC3_USED*/ + +/* Global variables */ +u8 SalAdcInitialFlag = 0; +#ifdef CONFIG_SOC_PS_MODULE +u8 SalAdcEnableState = 0; +#endif + +HAL_ADC_INIT_DAT SalAdcInitialDatKeep = {.ADCIdx = 0, + .ADCEn = 0, + .ADCEndian = 0, + .ADCBurstSz = 0, + .ADCCompOnly = 0, + .ADCOneShotEn = 0, + .ADCOverWREn = 0, + .ADCOneShotTD = 0, + .ADCCompCtrl = 0, + .ADCCompTD = 0, + .ADCDataRate = 0, + .ADCAudioEn = 0, + .ADCEnManul = 0, + .ADCDbgSel = 0, + .RSVD0 = 0, + .ADCData = (u32 *)NULL, + .ADCPWCtrl = 0, + .ADCIntrMSK = 0}; + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetMngtAdpt +// +// Description: +// According to the input index, all the memory space are allocated and all the +// related pointers are assigned. The management adapter pointer will be +// returned. +// +// Arguments: +// [in] u8 I2CIdx - +// I2C module index +// +// Return: +// PSAL_I2C_MNGT_ADPT +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +VOID HalADCOpInit( + IN VOID *Data +) +{ + PHAL_ADC_OP pHalAdcOp = (PHAL_ADC_OP) Data; + + pHalAdcOp->HalADCInit = HalADCInit8195a; + pHalAdcOp->HalADCDeInit = HalADCDeInit8195a; + pHalAdcOp->HalADCEnable = HalADCEnableRtl8195a; + pHalAdcOp->HalADCReceive = HalADCReceiveRtl8195a; + pHalAdcOp->HalADCIntrCtrl = HalADCIntrCtrl8195a; + pHalAdcOp->HalADCReadReg = HalADCReadRegRtl8195a; +} + +#ifndef CONFIG_MBED_ENABLED +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetMngtAdpt +// +// Description: +// According to the input index, all the memory space are allocated and all the +// related pointers are assigned. The management adapter pointer will be +// returned. +// +// Arguments: +// [in] u8 I2CIdx - +// I2C module index +// +// Return: +// PSAL_I2C_MNGT_ADPT +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +PSAL_ADC_MNGT_ADPT +RtkADCGetMngtAdpt( + IN u8 ADCIdx +){ + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PSAL_ADC_USERCB_ADPT pSalADCUserCBAdpt = NULL; + + /* If the kernel is available, Memory-allocation is used. */ +#if (!ADC_STATIC_ALLOC) + pSalADCMngtAdpt = (PSAL_ADC_MNGT_ADPT)RtlZmalloc(sizeof(SAL_ADC_MNGT_ADPT)); + pSalADCMngtAdpt->pSalHndPriv = (PSAL_ADC_HND_PRIV)RtlZmalloc(sizeof(SAL_ADC_HND_PRIV)); + pSalADCMngtAdpt->pHalInitDat = (PHAL_ADC_INIT_DAT)RtlZmalloc(sizeof(HAL_ADC_INIT_DAT)); + pSalADCMngtAdpt->pHalOp = (PHAL_ADC_OP)RtlZmalloc(sizeof(HAL_ADC_OP)); + pSalADCMngtAdpt->pIrqHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalADCMngtAdpt->pUserCB = (PSAL_ADC_USER_CB)RtlZmalloc(sizeof(SAL_ADC_USER_CB)); + pSalADCMngtAdpt->pHalGdmaAdp = (PHAL_GDMA_ADAPTER)RtlZmalloc(sizeof(HAL_GDMA_ADAPTER)); + pSalADCMngtAdpt->pHalGdmaOp = (PHAL_GDMA_OP)RtlZmalloc(sizeof(HAL_GDMA_OP)); + pSalADCMngtAdpt->pIrqGdmaHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalADCUserCBAdpt = (PSAL_ADC_USERCB_ADPT)RtlZmalloc((sizeof(SAL_ADC_USERCB_ADPT)*SAL_ADC_USER_CB_NUM)); +#else + switch (ADCIdx){ + case ADC0_SEL: + { + pSalADCMngtAdpt = &SalADC0MngtAdpt; + pSalADCMngtAdpt->pSalHndPriv = &SalADC0HndPriv; + pSalADCMngtAdpt->pHalInitDat = &HalADC0InitData; + pSalADCMngtAdpt->pHalOp = &HalADCOpSAL; + pSalADCMngtAdpt->pIrqHnd = &ADC0IrqHandleDat; + pSalADCMngtAdpt->pHalGdmaAdp = &HalADC0GdmaAdpt; + pSalADCMngtAdpt->pHalGdmaOp = &HalADC0GdmaOp; + pSalADCMngtAdpt->pIrqGdmaHnd = &ADC0GDMAIrqHandleDat; + pSalADCMngtAdpt->pUserCB = &SalADC0UserCB; + pSalADCUserCBAdpt = &SalADC0UserCBAdpt; + break; + } + + case ADC1_SEL: + { + pSalADCMngtAdpt = &SalADC1MngtAdpt; + pSalADCMngtAdpt->pSalHndPriv = &SalADC1HndPriv; + pSalADCMngtAdpt->pHalInitDat = &HalADC1InitData; + pSalADCMngtAdpt->pHalOp = &HalADCOpSAL; + pSalADCMngtAdpt->pIrqHnd = &ADC1IrqHandleDat; + pSalADCMngtAdpt->pHalGdmaAdp = &HalADC1GdmaAdpt; + pSalADCMngtAdpt->pHalGdmaOp = &HalADC1GdmaOp; + pSalADCMngtAdpt->pIrqGdmaHnd = &ADC1GDMAIrqHandleDat; + pSalADCMngtAdpt->pUserCB = &SalADC1UserCB; + pSalADCUserCBAdpt = &SalADC1UserCBAdpt; + break; + } + + case ADC2_SEL: + { + pSalADCMngtAdpt = &SalADC2MngtAdpt; + pSalADCMngtAdpt->pSalHndPriv = &SalADC2HndPriv; + pSalADCMngtAdpt->pHalInitDat = &HalADC2InitData; + pSalADCMngtAdpt->pHalOp = &HalADCOpSAL; + pSalADCMngtAdpt->pIrqHnd = &ADC2IrqHandleDat; + pSalADCMngtAdpt->pHalGdmaAdp = &HalADC2GdmaAdpt; + pSalADCMngtAdpt->pHalGdmaOp = &HalADC2GdmaOp; + pSalADCMngtAdpt->pIrqGdmaHnd = &ADC2GDMAIrqHandleDat; + pSalADCMngtAdpt->pUserCB = &SalADC2UserCB; + pSalADCUserCBAdpt = &SalADC2UserCBAdpt; + break; + } + + case ADC3_SEL: + { + pSalADCMngtAdpt = &SalADC3MngtAdpt; + pSalADCMngtAdpt->pSalHndPriv = &SalADC3HndPriv; + pSalADCMngtAdpt->pHalInitDat = &HalADC3InitData; + pSalADCMngtAdpt->pHalOp = &HalADCOpSAL; + pSalADCMngtAdpt->pIrqHnd = &ADC3IrqHandleDat; + pSalADCMngtAdpt->pHalGdmaAdp = &HalADC3GdmaAdpt; + pSalADCMngtAdpt->pHalGdmaOp = &HalADC3GdmaOp; + pSalADCMngtAdpt->pIrqGdmaHnd = &ADC3GDMAIrqHandleDat; + pSalADCMngtAdpt->pUserCB = &SalADC3UserCB; + pSalADCUserCBAdpt = &SalADC3UserCBAdpt; + break; + } + default + break; + } +#endif + + /*To assign user callback pointers*/ + pSalADCMngtAdpt->pUserCB->pTXCB = pSalADCUserCBAdpt; + pSalADCMngtAdpt->pUserCB->pTXCCB = (pSalADCUserCBAdpt+1); + pSalADCMngtAdpt->pUserCB->pRXCB = (pSalADCUserCBAdpt+2); + pSalADCMngtAdpt->pUserCB->pRXCCB = (pSalADCUserCBAdpt+3); + pSalADCMngtAdpt->pUserCB->pRDREQCB = (pSalADCUserCBAdpt+4); + pSalADCMngtAdpt->pUserCB->pERRCB = (pSalADCUserCBAdpt+5); + pSalADCMngtAdpt->pUserCB->pDMATXCB = (pSalADCUserCBAdpt+6); + pSalADCMngtAdpt->pUserCB->pDMATXCCB = (pSalADCUserCBAdpt+7); + pSalADCMngtAdpt->pUserCB->pDMARXCB = (pSalADCUserCBAdpt+8); + pSalADCMngtAdpt->pUserCB->pDMARXCCB = (pSalADCUserCBAdpt+9); + + /*To assign the rest pointers*/ + pSalADCMngtAdpt->pSalHndPriv->ppSalADCHnd = (void**)&(pSalADCMngtAdpt->pSalHndPriv); + + /* To assign the default (ROM) HAL OP initialization function */ + pSalADCMngtAdpt->pHalOpInit = &HalADCOpInit; + + /* To assign the default (ROM) HAL GDMA OP initialization function */ + pSalADCMngtAdpt->pHalGdmaOpInit = &HalGdmaOpInit; + + /* To assign the default (ROM) SAL interrupt function */ + pSalADCMngtAdpt->pSalIrqFunc = &ADCISRHandle; + + /* To assign the default (ROM) SAL DMA TX interrupt function */ + pSalADCMngtAdpt->pSalDMAIrqFunc = &ADCGDMAISRHandle; + + return pSalADCMngtAdpt; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CFreeMngtAdpt +// +// Description: +// Free all the previous allocated memory space. +// +// Arguments: +// [in] PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt - +// I2C SAL management adapter pointer +// +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the RtkI2CFreeMngtAdpt succeeded. +// _EXIT_FAILURE if the RtkI2CFreeMngtAdpt failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkADCFreeMngtAdpt( + IN PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt +){ +#ifdef CONFIG_KERNEL + RtlMfree((u8 *)pSalADCMngtAdpt->pUserCB->pTXCB, (sizeof(SAL_ADC_USERCB_ADPT)*SAL_ADC_USER_CB_NUM)); + RtlMfree((u8 *)pSalADCMngtAdpt->pIrqGdmaHnd, sizeof(IRQ_HANDLE)); + RtlMfree((u8 *)pSalADCMngtAdpt->pHalGdmaOp, sizeof(HAL_GDMA_OP)); + RtlMfree((u8 *)pSalADCMngtAdpt->pHalGdmaAdp, sizeof(HAL_GDMA_ADAPTER)); + RtlMfree((u8 *)pSalADCMngtAdpt->pUserCB, sizeof(SAL_ADC_USER_CB)); + RtlMfree((u8 *)pSalADCMngtAdpt->pIrqHnd, sizeof(IRQ_HANDLE)); + RtlMfree((u8 *)pSalADCMngtAdpt->pHalOp, sizeof(HAL_ADC_OP)); + RtlMfree((u8 *)pSalADCMngtAdpt->pHalInitDat, sizeof(HAL_ADC_INIT_DAT)); + RtlMfree((u8 *)pSalADCMngtAdpt->pSalHndPriv, sizeof(SAL_ADC_HND_PRIV)); + RtlMfree((u8 *)pSalADCMngtAdpt, sizeof(SAL_ADC_MNGT_ADPT)); +#else + ; +#endif + + return _EXIT_SUCCESS; +} +#endif + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// I2CISRHandle +// +// Description: +// I2C Interrupt Service Routine. +// According to the input pointer to SAL_I2C_HND, all the rest pointers will be +// found and be used to the rest part of this servie routine. +// The following types of interrupt will be taken care: +// - General Call (providing General Call Callback). Slave receives a general call. +// - STOP Bit (NOT providing General Call Callback) +// - START Bit (NOTproviding General Call Callback) +// - I2C Activity (NOTproviding General Call Callback) +// - RX Done (providing Error Callback). The slave transmitter does NOT +// receive a proper NACK for the end of whole transfer. +// - TX Abort (providing Error Call Callback). The Master/Slave +// transmitting is terminated. +// - RD Req (providing TX and TXC Callback). Slave gets a Read Request +// and starts a slave-transmitter operation. The slave transmit +// data will be written into slave TX FIFO from user data buffer. +// - TX Empty (providing TX and TXC Callback). Master TX FIFO is empty. +// The user transmit data will be written into master TX FIFO +// from user data buffer. +// - TX Over (providing Error Callback). Master TX FIFO is Overflow. +// - RX Full (providing RX and RXC Callback). Master/Slave RX FIFO contains +// data. And the received data will be put into Master/Slave user +// receive data buffer. +// - RX Over (providing Error Callback). Master/Slave RX FIFO is Overflow. +// - RX Under (providing Error Callback). Master/Slave RX FIFO is Underflow. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// NA +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//---------------------------------------------------------------------------------------------------- +VOID +ADCISRHandle( + IN VOID *Data +){ +#ifdef CONFIG_DEBUG_LOG_ADC_HAL + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PHAL_ADC_INIT_DAT pHalADCInitDat = NULL; + PHAL_ADC_OP pHalADCOP = NULL; + PSAL_ADC_USER_CB pSalADCUserCB = NULL; + u8 ADCIrqIdx; + + /* To get the SAL_I2C_MNGT_ADPT pointer, and parse the rest pointers */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + pHalADCInitDat = pSalADCMngtAdpt->pHalInitDat; + pHalADCOP = pSalADCMngtAdpt->pHalOp; + ADCIrqIdx = pHalADCInitDat->ADCIdx; + pSalADCUserCB = pSalADCHND->pUserCB; + + DBG_8195A_ADC_LVL(HAL_ADC_LVL,"ADC INTR STS:%x\n",pHalADCOP->HalADCReadReg(pHalADCInitDat, REG_ADC_INTR_STS)); +#else + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PHAL_ADC_INIT_DAT pHalADCInitDat = NULL; + PHAL_ADC_OP pHalADCOP = NULL; + + u8 ADCIrqIdx; + + + /* To get the SAL_I2C_MNGT_ADPT pointer, and parse the rest pointers */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + pHalADCInitDat = pSalADCMngtAdpt->pHalInitDat; + pHalADCOP = pSalADCMngtAdpt->pHalOp; + ADCIrqIdx = pHalADCInitDat->ADCIdx; + + DBG_ADC_INFO("ADC INTR STS:%x\n",pHalADCOP->HalADCReadReg(pHalADCInitDat, REG_ADC_INTR_STS)); + if (pSalADCHND->OpType == ADC_RDREG_TYPE){ + ADCFullStsFlag = 1; + ADCDatBuf[0] = (u32)HAL_ADC_READ32(REG_ADC_FIFO_READ); + ADCDatBuf[1] = (u32)HAL_ADC_READ32(REG_ADC_FIFO_READ); + pSalADCHND->pInitDat->ADCIntrMSK = 0; + pHalADCOP->HalADCIntrCtrl(pSalADCHND->pInitDat); + } + else + pHalADCOP->HalADCReadReg(pHalADCInitDat, REG_ADC_INTR_STS); + +#endif +} + +VOID +ADCGDMAISRHandle( + IN VOID *Data +){ + + /* DBG_ENTRANCE; */ + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + + PHAL_ADC_OP pHalADCOP = NULL; + PSAL_ADC_USER_CB pSalADCUserCB = NULL; + + PHAL_GDMA_ADAPTER pHalADCGdmaAdapter; + PHAL_GDMA_OP pHalADCGdmaOp; + + + u8 IsrTypeMap = 0; + + /* To get the SAL_I2C_MNGT_ADPT pointer, and parse the rest pointers */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + pHalADCOP = pSalADCMngtAdpt->pHalOp; + + pSalADCUserCB = pSalADCHND->pUserCB; + + pHalADCGdmaAdapter = pSalADCMngtAdpt->pHalGdmaAdp; + pHalADCGdmaOp = pSalADCMngtAdpt->pHalGdmaOp; + + DBG_8195A_ADC_LVL(HAL_ADC_LVL,"%s\n",__func__); + + if ((pHalADCGdmaAdapter->MaxMuliBlock) == pHalADCGdmaAdapter->MuliBlockCunt+1) { + pSalADCHND->pInitDat->ADCIntrMSK = 0; + pHalADCOP->HalADCIntrCtrl(pSalADCHND->pInitDat); + + /* Clear ADC Status */ + HAL_ADC_READ32(REG_ADC_INTR_STS); + + pSalADCHND->pInitDat->ADCEn = ADC_DISABLE; + pHalADCOP->HalADCEnable(pSalADCHND->pInitDat); + pHalADCGdmaOp->HalGdmaChCleanAutoSrc(pHalADCGdmaAdapter); + pHalADCGdmaOp->HalGdmaChDis(pHalADCGdmaAdapter); + pSalADCHND->DevSts = ADC_STS_IDLE; + + if (pSalADCUserCB->pDMARXCCB->USERCB != NULL) { + pSalADCUserCB->pDMARXCCB->USERCB((VOID*)pSalADCUserCB->pDMARXCCB->USERData); + } + } + + //3 Clear Pending ISR + IsrTypeMap = pHalADCGdmaOp->HalGdmaChIsrClean((VOID*)pHalADCGdmaAdapter); + + //3 Maintain Block Count + if (IsrTypeMap & BlockType) { + pHalADCGdmaAdapter->MuliBlockCunt++; + } +} + +RTK_STATUS +RtkADCPinMuxInit( + IN PSAL_ADC_HND pSalADCHND +){ + + u32 ADCLocalTemp; + + /* Check the I2C index first */ + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; + + ADCLocalTemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2); + ADCLocalTemp |= BIT25; + + /* To release DAC delta sigma clock gating */ + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SYS_SYSPLL_CTRL2,ADCLocalTemp); + + /* Turn on DAC active clock */ + ACTCK_ADC_CCTRL(ON); + + /* Enable DAC0 module */ + ADC0_FCTRL(ON); + + return _EXIT_SUCCESS; + +} + +static RTK_STATUS +RtkADCPinMuxDeInit( + IN PSAL_ADC_HND pSalADCHND +){ + + u32 ADCLocalTemp; + + /* Check the I2C index first */ + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; + + /* Turn on DAC active clock */ + ACTCK_ADC_CCTRL(OFF); + + /* Enable DAC1 module */ + ADC0_FCTRL(OFF); + + ADCLocalTemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2); + ADCLocalTemp &= (~BIT25); + + /* To release DAC delta sigma clock gating */ + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SYS_SYSPLL_CTRL2,ADCLocalTemp); + return _EXIT_SUCCESS; +} + + +#if ADC_INTR_OP_TYPE +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqInit +// +// Description: +// I2C interrupt initialization function. +// For I2C interrupt operation mode, I2C module MUST register itself to the platform +// by providing the interrupt handler which contains interrupt input data (arguments), +// interrupt service routine, interrupt number, interrupt priority. And then the interrupt +// should be enabled. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkADCIrqInit( + IN PSAL_ADC_HND pSalADCHND +){ + + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PIRQ_HANDLE pIrqHandle = NULL; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + pIrqHandle = pSalADCMngtAdpt->pIrqHnd; +/* + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; +*/ + + pIrqHandle->Data = (u32)(pSalADCHND); + pIrqHandle->IrqNum = ADC_IRQ; + pIrqHandle->IrqFun = (IRQ_FUN)pSalADCMngtAdpt->pSalIrqFunc; + pIrqHandle->Priority = 5; + InterruptRegister(pIrqHandle); + InterruptEn(pIrqHandle); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqDeInit +// +// Description: +// I2C interrupt de-initialization function. +// According to the given I2C device number, the I2C interrupt will be unreigster +// from the platform and the relative interrupt handler will be cleared. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt de-initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqDeInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqDeInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkADCIrqDeInit( + IN PSAL_ADC_HND pSalADCHND +){ + + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PIRQ_HANDLE pIrqHandle = NULL; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + pIrqHandle = pSalADCMngtAdpt->pIrqHnd; +/* + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; +*/ + InterruptUnRegister(pIrqHandle); + return _EXIT_SUCCESS; + +} + +#endif + + +#if ADC_DMA_OP_TYPE +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqInit +// +// Description: +// I2C interrupt initialization function. +// For I2C interrupt operation mode, I2C module MUST register itself to the platform +// by providing the interrupt handler which contains interrupt input data (arguments), +// interrupt service routine, interrupt number, interrupt priority. And then the interrupt +// should be enabled. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkADCDMAInit( + IN PSAL_ADC_HND pSalADCHND +){ + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PHAL_GDMA_ADAPTER pHALADCGdmaAdpt = NULL; + PHAL_GDMA_OP pHALADCGdmaOp = NULL; + PIRQ_HANDLE pIrqHandleADCGdma = NULL; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + pHALADCGdmaAdpt = pSalADCMngtAdpt->pHalGdmaAdp; + pHALADCGdmaOp = pSalADCMngtAdpt->pHalGdmaOp; + pIrqHandleADCGdma = pSalADCMngtAdpt->pIrqGdmaHnd; +/* + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; +*/ + //HalGdmaOpInit(pHALADCGdmaOp); + pSalADCMngtAdpt->pHalGdmaOpInit(pHALADCGdmaOp); + _memset((void *)pHALADCGdmaAdpt, 0, sizeof(HAL_GDMA_ADAPTER)); + + pHALADCGdmaAdpt->GdmaCtl.IntEn = 1; + + //ADC RX DMA + pHALADCGdmaAdpt->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHALADCGdmaAdpt->GdmaCtl.DstTrWidth = TrWidthFourBytes; + pHALADCGdmaAdpt->GdmaCtl.SrcMsize = MsizeEight; + pHALADCGdmaAdpt->GdmaCtl.DestMsize = MsizeEight; + + pHALADCGdmaAdpt->GdmaCtl.Sinc = NoChange; + pHALADCGdmaAdpt->GdmaCtl.Dinc = IncType; + + pHALADCGdmaAdpt->GdmaCtl.Done = 1; + pHALADCGdmaAdpt->GdmaCtl.TtFc = (GDMA_CTL_TT_FC_TYPE)0x2; + + pHALADCGdmaAdpt->GdmaCfg.SrcPer = 12; + pHALADCGdmaAdpt->GdmaCfg.ReloadSrc = 1; + + pHALADCGdmaAdpt->MuliBlockCunt = 0; + pHALADCGdmaAdpt->MaxMuliBlock = 1;//MaxLlp; + + pHALADCGdmaAdpt->GdmaIsrType = (BlockType|TransferType|ErrType); + pHALADCGdmaAdpt->IsrCtrl = ENABLE; + pHALADCGdmaAdpt->GdmaOnOff = ON; + + pHALADCGdmaAdpt->ChNum = 4; + pHALADCGdmaAdpt->ChEn = GdmaCh4; + + pHALADCGdmaAdpt->TestItem = 3; + DBG_ADC_INFO("pSalADCHND->DevNum:%x\n",pSalADCHND->DevNum); + + pHALADCGdmaAdpt->GdmaIndex = 1; + pIrqHandleADCGdma->IrqNum = GDMA1_CHANNEL4_IRQ; + + /* GDMA interrupt register */ + pIrqHandleADCGdma->Data = (u32) (pSalADCHND); + pIrqHandleADCGdma->IrqFun = (IRQ_FUN) pSalADCMngtAdpt->pSalDMAIrqFunc; + pIrqHandleADCGdma->Priority = 2; + InterruptRegister(pIrqHandleADCGdma); + InterruptEn(pIrqHandleADCGdma); + + /* GDMA initialization */ + /* Enable the whole GDMA module first */ + if (pHALADCGdmaAdpt->GdmaIndex == 0) { + ACTCK_GDMA0_CCTRL(ON); + SLPCK_GDMA0_CCTRL(ON); + GDMA0_FCTRL(ON); + } + else { + ACTCK_GDMA1_CCTRL(ON); + SLPCK_GDMA1_CCTRL(ON); + GDMA1_FCTRL(ON); + } + + pHALADCGdmaOp->HalGdmaOnOff((VOID*)pHALADCGdmaAdpt); + pHALADCGdmaOp->HalGdmaChIsrEnAndDis((VOID*)pHALADCGdmaAdpt); + //pHALADCGdmaOp->HalGdmaChSeting((VOID*)pHALADCGdmaAdpt); + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqDeInit +// +// Description: +// I2C interrupt de-initialization function. +// According to the given I2C device number, the I2C interrupt will be unreigster +// from the platform and the relative interrupt handler will be cleared. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt de-initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqDeInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqDeInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkADCDMADeInit( + IN PSAL_ADC_HND pSalADCHND +){ + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + + PHAL_GDMA_ADAPTER pHALADCGdmaAdpt = NULL; + PHAL_GDMA_OP pHALADCGdmaOp = NULL; + PIRQ_HANDLE pIrqHandleADCGdma = NULL; + + /*To Get the SAL_I2C_MNGT_ADPT Pointer*/ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + pHALADCGdmaAdpt = pSalADCMngtAdpt->pHalGdmaAdp; + pHALADCGdmaOp = pSalADCMngtAdpt->pHalGdmaOp; + pIrqHandleADCGdma = pSalADCMngtAdpt->pIrqGdmaHnd; + + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; + + //HalGdmaOpInit(pHALADCGdmaOp); + pSalADCMngtAdpt->pHalGdmaOpInit(pHALADCGdmaOp); + + pHALADCGdmaAdpt->IsrCtrl = DISABLE; + pHALADCGdmaOp->HalGdmaChIsrEnAndDis((VOID*)pHALADCGdmaAdpt); + pHALADCGdmaOp->HalGdmaChIsrClean((VOID*)pHALADCGdmaAdpt); + pHALADCGdmaOp->HalGdmaChDis((VOID*)pHALADCGdmaAdpt); + + InterruptUnRegister(pIrqHandleADCGdma); +#if 0 + _memset((void *)pIrqHandleDACGdma , 0, sizeof(IRQ_HANDLE)); + _memset((void *)pHALDACGdmaOp , 0, sizeof(HAL_GDMA_OP)); + _memset((void *)pHALDACGdmaAdpt , 0, sizeof(HAL_GDMA_ADAPTER)); +#endif + return _EXIT_SUCCESS; + +} +#endif + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CInit +// +// Description: +// According to the given I2C index, the related SAL_I2C_MNGT_ADPT pointer used +// for retrieving each I2C data sturcture pointer will be reversely parsed first. +// Then, initializing I2C HAL operation, initializing I2C interrupt (if needed), +// initializing I2C DMA (if needed) and initializing I2C pinmux will be done. +// User specified I2C configuration will be assigned to I2C initial data structure +// (PHAL_I2C_INIT_DAT pHalI2CInitDat). I2C HAL initialization is executed after +// all the configuration data taken. +// In the end, I2C module is enabled as a final step of the whole initialization. +// For a slave ack General Call support, an additional step may be followed after +// the above steps. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C initialization process. +// _EXIT_SUCCESS if the RtkI2CInit succeeded. +// _EXIT_FAILURE if the RtkI2CInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkADCInit( + IN VOID *Data +){ + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PHAL_ADC_INIT_DAT pHalADCInitDat = NULL; + PHAL_ADC_OP pHalADCOP = NULL; + +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE adcPwrState; +#endif + + DBG_ADC_INFO("%s\n",__func__); + /* To Get the SAL_ADC_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + pHalADCInitDat = pSalADCMngtAdpt->pHalInitDat; + pHalADCOP = pSalADCMngtAdpt->pHalOp; + + /* Check the input I2C index first */ + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; + +#if 0 + /* Check the input I2C operation type */ + if (RtkI2COpTypeChk(pSalI2CHND)) + return _EXIT_FAILURE; +#endif + + /* ADC Initial data check, if the setting is different from the previous initial data, + an warning is shown on Log-Uart and directly return from this function */ + if (SalAdcInitialFlag != 0) { + if (_memcmp(pHalADCInitDat, &SalAdcInitialDatKeep, sizeof(HAL_ADC_INIT_DAT))) { + pSalADCMngtAdpt->pHalOpInit(pHalADCOP); + /* DAC Device Status Update */ + pSalADCHND->DevSts = ADC_STS_IDLE; + DBG_ADC_WARN("The ADC initial value is different from the previous value.\n"); + } + } + else { + /* ADC Initialize HAL Operations */ + //HalADCOpInit(pHalADCOP); + pSalADCMngtAdpt->pHalOpInit(pHalADCOP); + + /* ADC Interrupt Initialization */ +#if ADC_INTR_OP_TYPE + RtkADCIrqInit(pSalADCHND); +#endif + + /* ADC DMA Initialization */ +#if ADC_DMA_OP_TYPE + RtkADCDMAInit(pSalADCHND); +#endif + + /* ADC Function and Clock Enable*/ + RtkADCPinMuxInit(pSalADCHND); + pHalADCOP->HalADCInit(pSalADCHND->pInitDat); + + if (pSalADCHND->OpType == ADC_DMA_TYPE){ + pSalADCHND->pInitDat->ADCIntrMSK = (BIT_ADC_FIFO_RD_REQ_EN | + BIT_ADC_FIFO_RD_ERROR_EN); + } + else if (pSalADCHND->OpType == ADC_INTR_TYPE){ + pSalADCHND->pInitDat->ADCIntrMSK = (BIT_ADC_FIFO_FULL_EN | + BIT_ADC_FIFO_RD_REQ_EN | + BIT_ADC_FIFO_RD_ERROR_EN); + } + else{ + pSalADCHND->pInitDat->ADCIntrMSK = 0; + } + + + if (pHalADCInitDat->ADCOneShotEn == ADC_FEATURE_ENABLED) { + pSalADCHND->pInitDat->ADCIntrMSK |= BIT_ADC_AWAKE_CPU_EN; + } + pHalADCOP->HalADCIntrCtrl(pSalADCHND->pInitDat); + + //pSalADCHND->pInitDat->ADCEn = ADC_ENABLE; + //pHalADCOP->HalADCEnable(pSalADCHND->pInitDat); + + if (pHalADCInitDat->ADCOneShotEn == ADC_FEATURE_ENABLED) { + HAL_TIMER_WRITE32(TIMER_INTERVAL, 30); + HAL_TIMER_WRITE32(0x1C, 3); + } + + SalAdcInitialFlag |= (0x01 << pSalADCHND->DevNum); + _memcpy(&SalAdcInitialDatKeep, pSalADCHND->pInitDat, sizeof(HAL_ADC_INIT_DAT)); + } + + /* DAC Device Status Update */ + pSalADCHND->DevSts = ADC_STS_IDLE; + +#ifdef CONFIG_SOC_PS_MODULE + // To register a new peripheral device power state + adcPwrState.FuncIdx = ADC0; + adcPwrState.PwrState = ACT; + RegPowerState(adcPwrState); + + SalAdcEnableState |= (0x01 << pSalADCHND->DevNum); +#endif + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CInit +// +// Description: +// According to the given I2C index, the related SAL_I2C_MNGT_ADPT pointer used +// for retrieving each I2C data sturcture pointer will be reversely parsed first. +// Then, initializing I2C HAL operation, initializing I2C interrupt (if needed), +// initializing I2C DMA (if needed) and initializing I2C pinmux will be done. +// User specified I2C configuration will be assigned to I2C initial data structure +// (PHAL_I2C_INIT_DAT pHalI2CInitDat). I2C HAL initialization is executed after +// all the configuration data taken. +// In the end, I2C module is enabled as a final step of the whole initialization. +// For a slave ack General Call support, an additional step may be followed after +// the above steps. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C initialization process. +// _EXIT_SUCCESS if the RtkI2CInit succeeded. +// _EXIT_FAILURE if the RtkI2CInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkADCDeInit( + IN VOID *Data +){ + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PHAL_ADC_INIT_DAT pHalADCInitDat = NULL; + PHAL_ADC_OP pHalADCOP = NULL; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE adcPwrState; + u8 HwState; +#endif + + /* To Get the SAL_ADC_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + pHalADCInitDat = pSalADCMngtAdpt->pHalInitDat; + pHalADCOP = pSalADCMngtAdpt->pHalOp; + + /* Check the input ADC index first */ + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; + + SalAdcInitialFlag &= (~(0x01 << pSalADCHND->DevNum)); + + if (SalAdcInitialFlag == 0) { +#ifdef CONFIG_SOC_PS_MODULE + adcPwrState.FuncIdx = ADC0; + QueryRegPwrState(adcPwrState.FuncIdx, &(adcPwrState.PwrState), &HwState); + + // if the power state isn't ACT, then switch the power state back to ACT first + if ((adcPwrState.PwrState != ACT) && (adcPwrState.PwrState != INACT)) { + RtkADCEnablePS(Data); + QueryRegPwrState(adcPwrState.FuncIdx, &(adcPwrState.PwrState), &HwState); + } + + if (adcPwrState.PwrState == ACT) { + adcPwrState.PwrState = INACT; + RegPowerState(adcPwrState); + } +#endif + + /* ADC Initialize HAL Operations */ + HalADCOpInit(pHalADCOP); + + RtkADCPinMuxDeInit(pSalADCHND); + + /* ADC Interrupt Initialization */ +#if ADC_INTR_OP_TYPE + RtkADCIrqDeInit(pSalADCHND); +#endif + + /* ADC DMA Initialization */ +#if ADC_DMA_OP_TYPE + RtkADCDMADeInit(pSalADCHND); +#endif + + pHalADCInitDat->ADCEn = ADC_DISABLE; + pHalADCOP->HalADCEnable(pHalADCInitDat); + pHalADCOP->HalADCDeInit(pHalADCInitDat); + + /* ADC Function and Clock Enable*/ + RtkADCPinMuxDeInit(pSalADCHND); + } + + return _EXIT_SUCCESS; +} + +u32 +RtkADCReceive( + IN VOID *Data +){ + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PHAL_GDMA_ADAPTER pHALADCGdmaAdpt = NULL; + PHAL_GDMA_OP pHALADCGdmaOp = NULL; + + + + //PIRQ_HANDLE pIrqHandleADCGdma = NULL; + u32 AdcTempDat; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + pHALADCGdmaAdpt = pSalADCMngtAdpt->pHalGdmaAdp; + pHALADCGdmaOp = pSalADCMngtAdpt->pHalGdmaOp; + + + + if (pSalADCHND->OpType == ADC_DMA_TYPE) { + /* Clear ADC Status */ + HAL_ADC_READ32(REG_ADC_INTR_STS); + + HalGdmaOpInit(pHALADCGdmaOp); + pHALADCGdmaAdpt->GdmaCtl.BlockSize = pSalADCHND->pRXBuf->DataLen; + pHALADCGdmaAdpt->ChSar = (u32)(ADC_REG_BASE); + pHALADCGdmaAdpt->ChDar = (u32)pSalADCHND->pRXBuf->pDataBuf; + pHALADCGdmaAdpt->MuliBlockCunt = 0; + + pHALADCGdmaOp->HalGdmaChSeting(pHALADCGdmaAdpt); + pHALADCGdmaOp->HalGdmaChEn(pHALADCGdmaAdpt); + + pSalADCHND->DevSts = ADC_STS_RX_ING; + AdcTempDat = HAL_ADC_READ32(REG_ADC_POWER); + AdcTempDat |= BIT_ADC_PWR_AUTO; + HAL_ADC_WRITE32(REG_ADC_POWER, AdcTempDat); + return _EXIT_SUCCESS; + } + return _EXIT_FAILURE; +} + +extern u32 +HalDelayUs( + IN u32 us +); + +u32 +RtkADCReceiveBuf( + IN VOID *Data, + IN u32 *pBuf +){ + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + + + + PHAL_ADC_OP pHalADCOP = NULL; + + //PIRQ_HANDLE pIrqHandleADCGdma = NULL; + u32 AdcTempDat; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + + + + pHalADCOP = pSalADCMngtAdpt->pHalOp; + + + + /* Clear ADC Status */ + //HAL_ADC_READ32(REG_ADC_INTR_STS); + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_INTR_STS); + DBG_ADC_INFO("RtkADCReceiveBuf, INTR:%x\n", AdcTempDat); + //AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_INTR_STS); + //DBG_8195A(">>INTR:%x\n",AdcTempDat); + + ADCFullStsFlag = 0; + HalDelayUs(2000); + + DBG_ADC_INFO("RtkADCReceiveBuf, Check to enable ADC manully or not\n"); + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_POWER); + if (unlikely((AdcTempDat & 0x00000008) == 0)) { + ; + } + else { + + pSalADCHND->pInitDat->ADCEn = ADC_ENABLE; + pHalADCOP->HalADCEnable(pSalADCHND->pInitDat); + //AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_POWER); + } + + + pSalADCHND->pInitDat->ADCIntrMSK = (BIT_ADC_FIFO_FULL_EN); + pHalADCOP->HalADCIntrCtrl(pSalADCHND->pInitDat); + pSalADCHND->DevSts = ADC_STS_IDLE; + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + + if ((AdcTempDat & 0x00000001) == 0){ + + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + DBG_ADC_INFO("RtkADCReceiveBuf, Before set, Reg AD0:%x\n", AdcTempDat); + AdcTempDat |= (0x01); + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, AdcTempDat); + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + DBG_ADC_INFO("RtkADCReceiveBuf, After set, Reg AD0:%x\n", AdcTempDat); + + //AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_POWER); + + + } + else{ + ; + } + + while (ADCFullStsFlag == 0){ + } + + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + DBG_ADC_INFO("RtkADCReceiveBuf, End of ADC, Before set, AD0:%x\n", AdcTempDat); + AdcTempDat &= (~0x01); + HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, AdcTempDat); + AdcTempDat = (u32)HAL_ADC_READ32(REG_ADC_ANAPAR_AD0); + DBG_ADC_INFO("RtkADCReceiveBuf, End of ADC, After set, AD0:%x\n", AdcTempDat); + + + + /* Clear ADC Status */ + HAL_ADC_READ32(REG_ADC_INTR_STS); + ADCFullStsFlag = 0; + + *pBuf = (u32)ADCDatBuf[0]; + *(pBuf+1) = (u32)ADCDatBuf[1]; + ADCDatBuf[0] = 0; + ADCDatBuf[1] = 0; + + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetSalHnd +// +// Description: +// Allocation of lower layer memory spaces will be done by invoking RtkI2CGetMngtAdpt +// in this function and return a SAL_I2C_HND pointer to upper layer. +// According to the given I2C index, RtkI2CGetMngtAdpt will allocate all the memory +// space such as SAL_I2C_HND, HAL_I2C_INIT_DAT, SAL_I2C_USER_CB etc. +// +// +// Arguments: +// [in] u8 I2CIdx - +// I2C Index +// +// Return: +// PSAL_I2C_HND +// A pointer to SAL_I2C_HND which is allocated in the lower layer. +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +PSAL_ADC_HND +RtkADCGetSalHnd( + IN u8 ADCIdx +){ + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PSAL_ADC_HND pSalADCHND = NULL; + + /* Check the user define setting and the given index */ + if (RtkADCIdxChk(ADCIdx)) { + return (PSAL_ADC_HND)NULL; + } + + /* Invoke RtkI2CGetMngtAdpt to get the I2C SAL management adapter pointer */ + pSalADCMngtAdpt = RtkADCGetMngtAdpt(ADCIdx); + + /* Assign the private SAL handle to public SAL handle */ + pSalADCHND = &(pSalADCMngtAdpt->pSalHndPriv->SalADCHndPriv); + + /* Assign the internal HAL initial data pointer to the SAL handle */ + pSalADCHND->pInitDat = pSalADCMngtAdpt->pHalInitDat; + + /* Assign the internal user callback pointer to the SAL handle */ + pSalADCHND->pUserCB = pSalADCMngtAdpt->pUserCB; + + return &(pSalADCMngtAdpt->pSalHndPriv->SalADCHndPriv); + +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetSalHnd +// +// Description: +// Allocation of lower layer memory spaces will be done by invoking RtkI2CGetMngtAdpt +// in this function and return a SAL_I2C_HND pointer to upper layer. +// According to the given I2C index, RtkI2CGetMngtAdpt will allocate all the memory +// space such as SAL_I2C_HND, HAL_I2C_INIT_DAT, SAL_I2C_USER_CB etc. +// +// +// Arguments: +// [in] u8 I2CIdx - +// I2C Index +// +// Return: +// PSAL_I2C_HND +// A pointer to SAL_I2C_HND which is allocated in the lower layer. +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkADCFreeSalHnd( + IN PSAL_ADC_HND pSalADCHND +){ + PSAL_ADC_MNGT_ADPT pSalADCMngtAdpt = NULL; + PSAL_ADC_HND_PRIV pSalADCHNDPriv = NULL; + + /* To get the SAL_DAC_MNGT_ADPT pointer */ + pSalADCHNDPriv = CONTAINER_OF(pSalADCHND, SAL_ADC_HND_PRIV, SalADCHndPriv); + pSalADCMngtAdpt = CONTAINER_OF(pSalADCHNDPriv->ppSalADCHnd, SAL_ADC_MNGT_ADPT, pSalHndPriv); + + /* Invoke RtkDACFreeMngtAdpt to free all the lower layer memory space */ + return (RtkADCFreeMngtAdpt(pSalADCMngtAdpt)); +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CLoadDefault +// +// Description: +// Accrording the given I2C index, the default I2C configuration is done. +// +// +// Arguments: +// [in] PSAL_I2C_HND pSalI2CHND - +// SAL I2C handle +// +// Return: +// The status of the loading I2C default configuration. +// _EXIT_SUCCESS if the RtkI2CLoadDefault succeeded. +// _EXIT_FAILURE if the RtkI2CLoadDefault failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkADCLoadDefault( + IN VOID *Data +){ + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + + /* Check the input ADC index first */ + if (RtkADCIdxChk(pSalADCHND->DevNum)) + return _EXIT_FAILURE; + + /* Load SAL handle default value */ + pSalADCHND->PinMux = 0; + pSalADCHND->OpType = ADC_RDREG_TYPE; + pSalADCHND->DevSts = ADC_STS_UNINITIAL; + pSalADCHND->ADCExd = 0; + pSalADCHND->ErrType = (u32)NULL; + + /* Load HAL initial data structure default value */ + pSalADCHND->pInitDat->ADCIdx = pSalADCHND->DevNum; + pSalADCHND->pInitDat->ADCEn = ADC_DISABLE; + pSalADCHND->pInitDat->ADCEndian = ADC_DATA_ENDIAN_LITTLE; + pSalADCHND->pInitDat->ADCBurstSz = 8; + pSalADCHND->pInitDat->ADCCompOnly = ADC_FEATURE_DISABLED; + pSalADCHND->pInitDat->ADCOneShotEn = ADC_FEATURE_DISABLED; + pSalADCHND->pInitDat->ADCOverWREn = ADC_FEATURE_DISABLED; + pSalADCHND->pInitDat->ADCOneShotTD = 8; + pSalADCHND->pInitDat->ADCCompCtrl = ADC_COMP_SMALLER_THAN; + pSalADCHND->pInitDat->ADCCompTD = 8; + pSalADCHND->pInitDat->ADCDataRate = 0; + pSalADCHND->pInitDat->ADCAudioEn = ADC_FEATURE_DISABLED; + pSalADCHND->pInitDat->ADCEnManul = ADC_FEATURE_DISABLED; + pSalADCHND->pInitDat->ADCDbgSel = ADC_DBG_SEL_DISABLE; + pSalADCHND->pInitDat->ADCPWCtrl = 0; + pSalADCHND->pInitDat->ADCIntrMSK = ADC_FEATURE_DISABLED; + pSalADCHND->pInitDat->ADCAnaParAd3 = 0; + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkADCDisablePS +// +// Description: +// ADC disable opertion by setting clock disable. +// +// Arguments: +// [in] VOID *Data - +// ADC SAL handle +// +// Return: +// The status of the ADC disable process. +// HAL_OK if the RtkADCDisablePS succeeded. +// HAL_ERR_PARA if the RtkADCDisablePS failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2015-06-15. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkADCDisablePS( + IN VOID *Data +){ + + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + u8 adcIdx = pSalADCHND->DevNum; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE adcPwrState; +#endif + + if (RtkADCIdxChk(adcIdx)) + return HAL_ERR_UNKNOWN; + + +#ifdef CONFIG_SOC_PS_MODULE + SalAdcEnableState &= (~(0x01 << pSalADCHND->DevNum)); + + if (SalAdcEnableState == 0) { + // To register a new peripheral device power state + adcPwrState.FuncIdx = ADC0; + adcPwrState.PwrState = SLPCG; + RegPowerState(adcPwrState); + } +#endif + + return HAL_OK; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkADCEnablePS +// +// Description: +// ADC enable opertion by setting clock enable. +// +// Arguments: +// [in] VOID *Data - +// ADC SAL handle +// +// Return: +// The status of the ADC enable process. +// HAL_OK if the RtkADCEnablePS succeeded. +// HAL_ERR_PARA if the RtkADCEnablePS failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2015-06-15. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkADCEnablePS( + IN VOID *Data +){ + + PSAL_ADC_HND pSalADCHND = (PSAL_ADC_HND) Data; + u8 adcIdx = pSalADCHND->DevNum; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE adcPwrState; +#endif + + if (RtkADCIdxChk(adcIdx)) + return HAL_ERR_UNKNOWN; + +#ifdef CONFIG_SOC_PS_MODULE + SalAdcEnableState |= (0x01 << pSalADCHND->DevNum); + + // To register a new peripheral device power state + adcPwrState.FuncIdx = ADC0; + adcPwrState.PwrState = ACT; + RegPowerState(adcPwrState); +#endif + + return HAL_OK; +} + diff --git a/lib/fwlib/src/hal_common.c b/lib/fwlib/src/hal_common.c new file mode 100644 index 0000000..6594168 --- /dev/null +++ b/lib/fwlib/src/hal_common.c @@ -0,0 +1,23 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include "hal_common.h" + +extern HAL_TIMER_OP HalTimerOp; + +HAL_Status +HalCommonInit(void){ + +#ifdef CONFIG_TIMER_MODULE + HalTimerOpInit_Patch((VOID*)(&HalTimerOp)); +#endif + + return HAL_OK; +} diff --git a/lib/fwlib/src/hal_dac.c b/lib/fwlib/src/hal_dac.c new file mode 100644 index 0000000..516bebd --- /dev/null +++ b/lib/fwlib/src/hal_dac.c @@ -0,0 +1,1450 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include "rtl_utility.h" +#include "osdep_api.h" +#include "hal_dac.h" +#include "hal_gdma.h" + +#define DAC_STATIC_ALLOC 0 + +/* DAC SAL global variables declaration when kernel disabled */ + +#if DAC_STATIC_ALLOC + SRAM_BF_DATA_SECTION + HAL_DAC_OP HalDACOpSAL; +#endif + + +#if DAC0_USED /*#if DAC0_USED*/ +#if DAC_STATIC_ALLOC + SRAM_BF_DATA_SECTION + SAL_DAC_MNGT_ADPT SalDAC0MngtAdpt; + + SRAM_BF_DATA_SECTION + SAL_DAC_HND_PRIV SalDAC0HndPriv; + + SRAM_BF_DATA_SECTION + HAL_DAC_INIT_DAT HalDAC0InitData; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE DAC0IrqHandleDat; + + SRAM_BF_DATA_SECTION + HAL_GDMA_ADAPTER HalDAC0GdmaAdpt; + + SRAM_BF_DATA_SECTION + HAL_GDMA_OP HalDAC0GdmaOp; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE DAC0GDMAIrqHandleDat; + + SRAM_BF_DATA_SECTION + SAL_DAC_USER_CB SalDAC0UserCB; + + SRAM_BF_DATA_SECTION + SAL_DAC_DMA_USER_DEF SalDAC0DmaUserDef; + + SRAM_BF_DATA_SECTION + SAL_DAC_USERCB_ADPT SalDAC0UserCBAdpt[SAL_DAC_USER_CB_NUM]; +#endif +#endif /*#if DAC0_USED*/ + +#if DAC1_USED /*#if DAC1_USED*/ +#if DAC_STATIC_ALLOC + + SRAM_BF_DATA_SECTION + SAL_DAC_MNGT_ADPT SalDAC1MngtAdpt; + + SRAM_BF_DATA_SECTION + SAL_DAC_HND_PRIV SalDAC1HndPriv; + + SRAM_BF_DATA_SECTION + HAL_DAC_INIT_DAT HalDAC1InitData; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE DAC1IrqHandleDat; + + SRAM_BF_DATA_SECTION + HAL_GDMA_ADAPTER HalDAC1GdmaAdpt; + + SRAM_BF_DATA_SECTION + HAL_GDMA_OP HalDAC1GdmaOp; + + SRAM_BF_DATA_SECTION + IRQ_HANDLE DAC1GDMAIrqHandleDat; + + SRAM_BF_DATA_SECTION + SAL_DAC_USER_CB SalDAC1UserCB; + + SRAM_BF_DATA_SECTION + SAL_DAC_DMA_USER_DEF SalDAC1DmaUserDef; + + SRAM_BF_DATA_SECTION + SAL_DAC_USERCB_ADPT SalDAC1UserCBAdpt[SAL_DAC_USER_CB_NUM]; +#endif +#endif /*#if DAC1_USED*/ + +/* Function prototype */ +VOID DACISRHandle(IN VOID *Data); +VOID DACGDMAISRHandle(IN VOID * Data); +VOID DACGDMALLPISRHandle(IN VOID *Data); + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetMngtAdpt +// +// Description: +// According to the input index, all the memory space are allocated and all the +// related pointers are assigned. The management adapter pointer will be +// returned. +// +// Arguments: +// [in] u8 I2CIdx - +// I2C module index +// +// Return: +// PSAL_I2C_MNGT_ADPT +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +VOID HalDACOpInit( + IN VOID *Data +) +{ + PHAL_DAC_OP pHalDacOp = (PHAL_DAC_OP) Data; + + pHalDacOp->HalDACInit = HalDACInit8195a; + pHalDacOp->HalDACDeInit = HalDACDeInit8195a; + pHalDacOp->HalDACEnable = HalDACEnableRtl8195a; + pHalDacOp->HalDACSend = HalDACSendRtl8195a; + pHalDacOp->HalDACIntrCtrl = HalDACIntrCtrl8195a; + pHalDacOp->HalDACReadReg = HalDACReadRegRtl8195a; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetMngtAdpt +// +// Description: +// According to the input index, all the memory space are allocated and all the +// related pointers are assigned. The management adapter pointer will be +// returned. +// +// Arguments: +// [in] u8 I2CIdx - +// I2C module index +// +// Return: +// PSAL_I2C_MNGT_ADPT +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +PSAL_DAC_MNGT_ADPT +RtkDACGetMngtAdpt( + IN u8 DACIdx +){ + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PSAL_DAC_USERCB_ADPT pSalDACUserCBAdpt = NULL; + + /* If the kernel is available, Memory-allocation is used. */ +#if !DAC_STATIC_ALLOC + + pSalDACMngtAdpt = (PSAL_DAC_MNGT_ADPT)RtlZmalloc(sizeof(SAL_DAC_MNGT_ADPT)); + pSalDACMngtAdpt->pSalHndPriv = (PSAL_DAC_HND_PRIV)RtlZmalloc(sizeof(SAL_DAC_HND_PRIV)); + pSalDACMngtAdpt->pHalInitDat = (PHAL_DAC_INIT_DAT)RtlZmalloc(sizeof(HAL_DAC_INIT_DAT)); + pSalDACMngtAdpt->pHalOp = (PHAL_DAC_OP)RtlZmalloc(sizeof(HAL_DAC_OP)); + pSalDACMngtAdpt->pIrqHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalDACMngtAdpt->pUserCB = (PSAL_DAC_USER_CB)RtlZmalloc(sizeof(SAL_DAC_USER_CB)); + pSalDACMngtAdpt->pDMAConf = (PSAL_DAC_DMA_USER_DEF)RtlZmalloc(sizeof(SAL_DAC_DMA_USER_DEF)); + pSalDACMngtAdpt->pHalGdmaAdp = (PHAL_GDMA_ADAPTER)RtlZmalloc(sizeof(HAL_GDMA_ADAPTER)); + pSalDACMngtAdpt->pHalGdmaOp = (PHAL_GDMA_OP)RtlZmalloc(sizeof(HAL_GDMA_OP)); + pSalDACMngtAdpt->pIrqGdmaHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalDACUserCBAdpt = (PSAL_DAC_USERCB_ADPT)RtlZmalloc((sizeof(SAL_DAC_USERCB_ADPT)*SAL_DAC_USER_CB_NUM)); +#else + switch (DACIdx){ + case DAC0_SEL: + { + pSalDACMngtAdpt = &SalDAC0MngtAdpt; + pSalDACMngtAdpt->pSalHndPriv = &SalDAC0HndPriv; + pSalDACMngtAdpt->pHalInitDat = &HalDAC0InitData; + pSalDACMngtAdpt->pHalOp = &HalDACOpSAL; + pSalDACMngtAdpt->pIrqHnd = &DAC0IrqHandleDat; + pSalDACMngtAdpt->pUserCB = &SalDAC0UserCB; + pSalDACMngtAdpt->pDMAConf = &SalDAC0DmaUserDef; + pSalDACMngtAdpt->pHalGdmaAdp = &HalDAC0GdmaAdpt; + pSalDACMngtAdpt->pHalGdmaOp = &HalDAC0GdmaOp; + pSalDACMngtAdpt->pIrqGdmaHnd = &DAC0IrqHandleDat; + pSalDACUserCBAdpt = &SalDAC0UserCBAdpt; + break; + } + + case DAC1_SEL: + { + pSalDACMngtAdpt = &SalDAC1MngtAdpt; + pSalDACMngtAdpt->pSalHndPriv = &SalDAC1HndPriv; + pSalDACMngtAdpt->pHalInitDat = &HalDAC1InitData; + pSalDACMngtAdpt->pHalOp = &HalDACOpSAL; + pSalDACMngtAdpt->pIrqHnd = &DAC1IrqHandleDat; + pSalDACMngtAdpt->pUserCB = &SalDAC1UserCB; + pSalDACMngtAdpt->pDMAConf = &SalDAC1DmaUserDef; + pSalDACMngtAdpt->pHalGdmaAdp = &HalDAC1GdmaAdpt; + pSalDACMngtAdpt->pHalGdmaOp = &HalDAC1GdmaOp; + pSalDACMngtAdpt->pIrqGdmaHnd = &DAC1IrqHandleDat; + pSalDACUserCBAdpt = &SalDAC1UserCBAdpt; + break; + } + + default: + break; + } +#endif + + /*To assign user callback pointers*/ + pSalDACMngtAdpt->pUserCB->pTXCB = pSalDACUserCBAdpt; + pSalDACMngtAdpt->pUserCB->pTXCCB = (pSalDACUserCBAdpt+1); + pSalDACMngtAdpt->pUserCB->pRXCB = (pSalDACUserCBAdpt+2); + pSalDACMngtAdpt->pUserCB->pRXCCB = (pSalDACUserCBAdpt+3); + pSalDACMngtAdpt->pUserCB->pRDREQCB = (pSalDACUserCBAdpt+4); + pSalDACMngtAdpt->pUserCB->pERRCB = (pSalDACUserCBAdpt+5); + pSalDACMngtAdpt->pUserCB->pDMATXCB = (pSalDACUserCBAdpt+6); + pSalDACMngtAdpt->pUserCB->pDMATXCCB = (pSalDACUserCBAdpt+7); + pSalDACMngtAdpt->pUserCB->pDMARXCB = (pSalDACUserCBAdpt+8); + pSalDACMngtAdpt->pUserCB->pDMARXCCB = (pSalDACUserCBAdpt+9); + + /*To assign the rest pointers*/ + pSalDACMngtAdpt->pSalHndPriv->ppSalDACHnd = (void**)&(pSalDACMngtAdpt->pSalHndPriv); + + /* To assign the default HAL OP initialization function */ + pSalDACMngtAdpt->pHalOpInit = &HalDACOpInit; + + /* To assign the default HAL GDMA OP initialization function */ + pSalDACMngtAdpt->pHalGdmaOpInit = &HalGdmaOpInit; + + /* To assign the default SAL interrupt function */ + pSalDACMngtAdpt->pSalIrqFunc = &DACISRHandle; + + /* To assign the default SAL DMA interrupt function */ + pSalDACMngtAdpt->pSalDMAIrqFunc = &DACGDMAISRHandle; + + return pSalDACMngtAdpt; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CFreeMngtAdpt +// +// Description: +// Free all the previous allocated memory space. +// +// Arguments: +// [in] PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt - +// I2C SAL management adapter pointer +// +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the RtkI2CFreeMngtAdpt succeeded. +// _EXIT_FAILURE if the RtkI2CFreeMngtAdpt failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkDACFreeMngtAdpt( + IN PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt +){ +#if !DAC_STATIC_ALLOC + RtlMfree((u8 *)pSalDACMngtAdpt->pUserCB->pTXCB, (sizeof(SAL_DAC_USERCB_ADPT)*SAL_DAC_USER_CB_NUM)); + RtlMfree((u8 *)pSalDACMngtAdpt->pIrqGdmaHnd, sizeof(IRQ_HANDLE)); + RtlMfree((u8 *)pSalDACMngtAdpt->pHalGdmaOp, sizeof(HAL_GDMA_OP)); + RtlMfree((u8 *)pSalDACMngtAdpt->pHalGdmaAdp, sizeof(HAL_GDMA_ADAPTER)); + RtlMfree((u8 *)pSalDACMngtAdpt->pDMAConf, sizeof(SAL_DAC_DMA_USER_DEF)); + RtlMfree((u8 *)pSalDACMngtAdpt->pUserCB, sizeof(SAL_DAC_USER_CB)); + RtlMfree((u8 *)pSalDACMngtAdpt->pIrqHnd, sizeof(IRQ_HANDLE)); + RtlMfree((u8 *)pSalDACMngtAdpt->pHalOp, sizeof(HAL_DAC_OP)); + RtlMfree((u8 *)pSalDACMngtAdpt->pHalInitDat, sizeof(HAL_DAC_INIT_DAT)); + RtlMfree((u8 *)pSalDACMngtAdpt->pSalHndPriv, sizeof(SAL_DAC_HND_PRIV)); + RtlMfree((u8 *)pSalDACMngtAdpt, sizeof(SAL_DAC_MNGT_ADPT)); +#else + ; +#endif + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// I2CISRHandle +// +// Description: +// I2C Interrupt Service Routine. +// According to the input pointer to SAL_I2C_HND, all the rest pointers will be +// found and be used to the rest part of this servie routine. +// The following types of interrupt will be taken care: +// - General Call (providing General Call Callback). Slave receives a general call. +// - STOP Bit (NOT providing General Call Callback) +// - START Bit (NOTproviding General Call Callback) +// - I2C Activity (NOTproviding General Call Callback) +// - RX Done (providing Error Callback). The slave transmitter does NOT +// receive a proper NACK for the end of whole transfer. +// - TX Abort (providing Error Call Callback). The Master/Slave +// transmitting is terminated. +// - RD Req (providing TX and TXC Callback). Slave gets a Read Request +// and starts a slave-transmitter operation. The slave transmit +// data will be written into slave TX FIFO from user data buffer. +// - TX Empty (providing TX and TXC Callback). Master TX FIFO is empty. +// The user transmit data will be written into master TX FIFO +// from user data buffer. +// - TX Over (providing Error Callback). Master TX FIFO is Overflow. +// - RX Full (providing RX and RXC Callback). Master/Slave RX FIFO contains +// data. And the received data will be put into Master/Slave user +// receive data buffer. +// - RX Over (providing Error Callback). Master/Slave RX FIFO is Overflow. +// - RX Under (providing Error Callback). Master/Slave RX FIFO is Underflow. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// NA +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//---------------------------------------------------------------------------------------------------- +VOID +DACISRHandle( + IN VOID *Data +){ +#ifdef CONFIG_DEBUG_LOG_DAC_HAL + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PHAL_DAC_INIT_DAT pHalDACInitDat = NULL; + PHAL_DAC_OP pHalDACOP = NULL; + PSAL_DAC_USER_CB pSalDACUserCB = NULL; + u8 DACIrqIdx; + + /* To get the SAL_I2C_MNGT_ADPT pointer, and parse the rest pointers */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + pHalDACInitDat = pSalDACMngtAdpt->pHalInitDat; + pHalDACOP = pSalDACMngtAdpt->pHalOp; + DACIrqIdx = pHalDACInitDat->DACIdx; + pSalDACUserCB = pSalDACHND->pUserCB; + + DBG_DAC_INFO("DAC INTR STS:%x\n",pHalDACOP->HalDACReadReg(pHalDACInitDat, REG_DAC_INTR_STS)); + if ((pHalDACOP->HalDACReadReg(pHalDACInitDat, REG_DAC_INTR_STS)) & BIT_DAC_FIFO_STOP_ST){ + pHalDACInitDat->DACEn = DAC_DISABLE; + pHalDACOP->HalDACEnable((void *)pHalDACInitDat); + } +#else + /* To reduce warning */ + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PHAL_DAC_INIT_DAT pHalDACInitDat = NULL; + PHAL_DAC_OP pHalDACOP = NULL; + + + + /* To get the SAL_I2C_MNGT_ADPT pointer, and parse the rest pointers */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + pHalDACInitDat = pSalDACMngtAdpt->pHalInitDat; + pHalDACOP = pSalDACMngtAdpt->pHalOp; + + + pHalDACOP->HalDACReadReg(pHalDACInitDat, REG_DAC_INTR_STS); +#endif +} + +VOID +DACGDMAISRHandle( + IN VOID *Data +){ + + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + + PHAL_GDMA_ADAPTER pHalDACGdmaAdapter = NULL; + PHAL_GDMA_OP pHalDACGdmaOp = NULL; + PSAL_DAC_USER_CB pSalDACUserCB = NULL; + + u8 IsrTypeMap = 0; + DBG_8195A_DAC_LVL(HAL_DAC_LVL,"%s\n",__func__); + + + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + pHalDACGdmaAdapter = pSalDACMngtAdpt->pHalGdmaAdp; + pHalDACGdmaOp = pSalDACMngtAdpt->pHalGdmaOp; + pSalDACUserCB = pSalDACMngtAdpt->pUserCB; + + pSalDACMngtAdpt->pHalGdmaOpInit(pHalDACGdmaOp); + + if ((pHalDACGdmaAdapter->MaxMuliBlock) == pHalDACGdmaAdapter->MuliBlockCunt+1) { + pHalDACGdmaOp->HalGdmaChCleanAutoSrc(pHalDACGdmaAdapter); + pHalDACGdmaOp->HalGdmaChDis(pHalDACGdmaAdapter); + pSalDACHND->DevSts = DAC_STS_IDLE; + if (pSalDACUserCB->pDMATXCCB->USERCB != NULL) + { + pSalDACUserCB->pDMATXCCB->USERCB((void*)pSalDACUserCB->pDMATXCCB->USERData); + } + } + else { + //pHalDACGdmaOp->HalGdmaChCleanAutoSrc(pHalDACGdmaAdapter); + pSalDACHND->DevSts = DAC_STS_TX_ING; + + if (pSalDACUserCB->pDMATXCB->USERCB != NULL){ + pSalDACUserCB->pDMATXCB->USERCB((void*)pSalDACUserCB->pDMATXCB->USERData);} + } + + //3 Clear Pending ISR + IsrTypeMap = pHalDACGdmaOp->HalGdmaChIsrClean((VOID*)pHalDACGdmaAdapter); + + //3 Maintain Block Count + if (IsrTypeMap & BlockType) { + pHalDACGdmaAdapter->MuliBlockCunt++; + } + +} + +VOID +DACGDMALLPISRHandle( + IN VOID *Data +){ + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + + PHAL_GDMA_ADAPTER pHalDACGdmaAdapter = NULL; + PHAL_GDMA_OP pHalDACGdmaOp = NULL; + + u8 IsrTypeMap; + + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + pHalDACGdmaAdapter = pSalDACMngtAdpt->pHalGdmaAdp; + pHalDACGdmaOp = pSalDACMngtAdpt->pHalGdmaOp; + + + pSalDACMngtAdpt->pHalGdmaOpInit(pHalDACGdmaOp); +#if 0 + PGDMA_ADAPTER pGdmaAdapte = (PGDMA_ADAPTER) Data; + PHAL_GDMA_ADAPTER pHalGdmaAdapter = pGdmaAdapte->pHalGdmaAdapter; + PGDMA_CH_LLI_ELE pGdmaChLliEle; + struct GDMA_CH_LLI *pGdmaChLli = pHalGdmaAdapter->pLlix; + struct BLOCK_SIZE_LIST *pBlockSizeList = pHalGdmaAdapter->pBlockSizeList; + u32 TotalBlockSize = 0; + u8 IsrTypeMap, BlockIndex; + u8 *pSrc = NULL, *pDst = NULL; + DBG_8195A_DMA("Enter Gdma0 Channel 5 ISr =====>\n"); +#endif + + + + if ((pHalDACGdmaAdapter->MaxMuliBlock) == pHalDACGdmaAdapter->MuliBlockCunt) { + //HalGdmaOp.HalGdmaChCleanAutoSrc(pHalGdmaAdapter); + //DAC0_FCTRL(OFF); + + //HalGdmaOp.HalGdmaChCleanAutoDst(pHalGdmaAdapter); + pHalDACGdmaOp->HalGdmaChDis(pHalDACGdmaAdapter); + + DBG_8195A("dma done\n"); + } + + + IsrTypeMap = pHalDACGdmaOp->HalGdmaChIsrClean((VOID*)pHalDACGdmaAdapter); + + if (IsrTypeMap & BlockType) { + pHalDACGdmaAdapter->MuliBlockCunt++; + } +} + +static RTK_STATUS +RtkDACPinMuxInit( + IN PSAL_DAC_HND pSalDACHND +){ + u32 DACLocalTemp; + + /* Check the I2C index first */ + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + DACLocalTemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2); + DACLocalTemp |= BIT26; + + /* To release DAC delta sigma clock gating */ + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SYS_SYSPLL_CTRL2,DACLocalTemp); + + switch (pSalDACHND->DevNum){ +#if DAC0_USED + case DAC0_SEL: + { + /* Turn on DAC active clock */ + ACTCK_DAC_CCTRL(ON); + + /* Enable DAC0 module */ + DAC0_FCTRL(ON); + break; + } +#endif +#if DAC1_USED + case DAC1_SEL: + { + /* Turn on DAC active clock */ + ACTCK_DAC_CCTRL(ON); + + /* Enable DAC1 module */ + DAC1_FCTRL(ON); + break; + } +#endif + default: + return _EXIT_FAILURE; + } + + return _EXIT_SUCCESS; +} + +static RTK_STATUS +RtkDACPinMuxDeInit( + IN PSAL_DAC_HND pSalDACHND +){ + + u32 DACLocalTemp; + + /* Check the I2C index first */ + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + switch (pSalDACHND->DevNum){ +#if DAC0_USED + case DAC0_SEL: + { + /* Turn on DAC active clock */ + ACTCK_DAC_CCTRL(OFF); + + /* Enable DAC0 module */ + DAC0_FCTRL(OFF); + break; + } +#endif +#if DAC1_USED + case DAC1_SEL: + { + /* Turn on DAC active clock */ + ACTCK_DAC_CCTRL(OFF); + + /* Enable DAC1 module */ + DAC1_FCTRL(OFF); + break; + } +#endif + default: + return _EXIT_FAILURE; + } + + + DACLocalTemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2); + DACLocalTemp &= (~BIT26); + + /* To release DAC delta sigma clock gating */ + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SYS_SYSPLL_CTRL2,DACLocalTemp); + + return _EXIT_SUCCESS; +} + + +#if DAC_INTR_OP_TYPE +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqInit +// +// Description: +// I2C interrupt initialization function. +// For I2C interrupt operation mode, I2C module MUST register itself to the platform +// by providing the interrupt handler which contains interrupt input data (arguments), +// interrupt service routine, interrupt number, interrupt priority. And then the interrupt +// should be enabled. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkDACIrqInit( + IN PSAL_DAC_HND pSalDACHND +){ + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PIRQ_HANDLE pIrqHandle = NULL; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + pIrqHandle = pSalDACMngtAdpt->pIrqHnd; + + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + switch (pSalDACHND->DevNum){ +#if DAC0_USED + case DAC0_SEL: + { + pIrqHandle->Data = (u32) (pSalDACHND); + pIrqHandle->IrqNum = DAC0_IRQ; + pIrqHandle->IrqFun = (IRQ_FUN) pSalDACMngtAdpt->pSalIrqFunc; + pIrqHandle->Priority = 5; + InterruptRegister(pIrqHandle); + InterruptEn(pIrqHandle); + break; + } +#endif +#if DAC1_USED + case DAC1_SEL: + { + pIrqHandle->Data = (u32) (pSalDACHND); + pIrqHandle->IrqNum = DAC1_IRQ; + pIrqHandle->IrqFun = (IRQ_FUN) pSalDACMngtAdpt->pSalIrqFunc;; + pIrqHandle->Priority = 5; + InterruptRegister(pIrqHandle); + InterruptEn(pIrqHandle); + break; + } +#endif + default: + return _EXIT_FAILURE; + } + + + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqDeInit +// +// Description: +// I2C interrupt de-initialization function. +// According to the given I2C device number, the I2C interrupt will be unreigster +// from the platform and the relative interrupt handler will be cleared. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt de-initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqDeInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqDeInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkDACIrqDeInit( + IN PSAL_DAC_HND pSalDACHND +){ + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PIRQ_HANDLE pIrqHandle = NULL; + + /*To Get the SAL_I2C_MNGT_ADPT Pointer*/ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + pIrqHandle = pSalDACMngtAdpt->pIrqHnd; + + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + InterruptUnRegister(pIrqHandle); + return _EXIT_SUCCESS; +} + +#endif + + +#if DAC_DMA_OP_TYPE +const u16 DACDmaChNo[10] = {GdmaNoCh ,GdmaCh0, + GdmaCh1 ,GdmaCh2, + GdmaCh3 ,GdmaCh4, + GdmaCh5 ,GdmaCh6, + GdmaCh7 ,GdmaAllCh}; + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqInit +// +// Description: +// I2C interrupt initialization function. +// For I2C interrupt operation mode, I2C module MUST register itself to the platform +// by providing the interrupt handler which contains interrupt input data (arguments), +// interrupt service routine, interrupt number, interrupt priority. And then the interrupt +// should be enabled. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkDACDMAInit( + IN PSAL_DAC_HND pSalDACHND +){ + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PHAL_GDMA_ADAPTER pHALDACGdmaAdpt = NULL; + PHAL_GDMA_OP pHALDACGdmaOp = NULL; + PIRQ_HANDLE pIrqHandleDACGdma = NULL; + PSAL_DAC_DMA_USER_DEF pSalDACDmaUserDef = NULL; + + + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + pHALDACGdmaAdpt = pSalDACMngtAdpt->pHalGdmaAdp; + pHALDACGdmaOp = pSalDACMngtAdpt->pHalGdmaOp; + pIrqHandleDACGdma = pSalDACMngtAdpt->pIrqGdmaHnd; + pSalDACDmaUserDef = pSalDACHND->pDMAConf; + + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + if (pSalDACHND->DACInType == DAC_INPUT_SINGLE_WR) + return _EXIT_SUCCESS; + + /* GDMA operation initialization */ + //HalGdmaOpInit(pHalI2CGdmaOp); + _memset((void *)pHALDACGdmaAdpt, 0, sizeof(HAL_GDMA_ADAPTER)); + pSalDACMngtAdpt->pHalGdmaOpInit(pHALDACGdmaOp); + pHALDACGdmaOp->HalGdamChInit((VOID*)(pHALDACGdmaAdpt)); + + + + pHALDACGdmaAdpt->GdmaIndex = pSalDACHND->DevNum; + pHALDACGdmaAdpt->GdmaCtl.IntEn = 1; + pHALDACGdmaAdpt->ChNum = pSalDACDmaUserDef->TxChNo; + + pHALDACGdmaAdpt->ChEn = DACDmaChNo[pHALDACGdmaAdpt->ChNum+1]; + pHALDACGdmaAdpt->IsrCtrl = ENABLE; + pHALDACGdmaAdpt->GdmaOnOff = ON; + + + /* GDMA initialization */ + /* Enable the whole GDMA module first */ + if (pHALDACGdmaAdpt->GdmaIndex == 0) { + ACTCK_GDMA0_CCTRL(ON); + SLPCK_GDMA0_CCTRL(ON); + GDMA0_FCTRL(ON); + } + else { + ACTCK_GDMA1_CCTRL(ON); + SLPCK_GDMA1_CCTRL(ON); + GDMA1_FCTRL(ON); + } + + if (pSalDACHND->DACInType == DAC_INPUT_DMA_ONEBLK) { + //DAC TX DMA + pHALDACGdmaAdpt->GdmaCtl.SrcTrWidth = pSalDACDmaUserDef->TxDatSrcWdth; + pHALDACGdmaAdpt->GdmaCtl.DstTrWidth = pSalDACDmaUserDef->TxDatDstWdth; + pHALDACGdmaAdpt->GdmaCtl.SrcMsize = pSalDACDmaUserDef->TxDatSrcBstSz; + pHALDACGdmaAdpt->GdmaCtl.DestMsize = pSalDACDmaUserDef->TxDatDstBstSz; + + pHALDACGdmaAdpt->GdmaCtl.Sinc = IncType; + pHALDACGdmaAdpt->GdmaCtl.Dinc = NoChange; + + pHALDACGdmaAdpt->GdmaCtl.Done = 1; + pHALDACGdmaAdpt->GdmaCtl.TtFc = 0x01; + + pHALDACGdmaAdpt->GdmaCfg.DestPer = 13; + pHALDACGdmaAdpt->GdmaCfg.ReloadSrc = 1; + + pHALDACGdmaAdpt->MuliBlockCunt = 1; + pHALDACGdmaAdpt->MaxMuliBlock = pSalDACHND->pDMAConf->MaxMultiBlk; + + pHALDACGdmaAdpt->GdmaIsrType = (BlockType|TransferType|ErrType); + + + pHALDACGdmaAdpt->TestItem = 3; + + + //pSalDACMngtAdpt->pSalDMAIrqFunc = &DACGDMAISRHandle; + } + else if (pSalDACHND->DACInType == DAC_INPUT_DMA_LLP) { + //DAC TX DMA + pHALDACGdmaAdpt->GdmaCtl.SrcTrWidth = pSalDACDmaUserDef->TxDatSrcWdth; + pHALDACGdmaAdpt->GdmaCtl.DstTrWidth = pSalDACDmaUserDef->TxDatDstWdth; + pHALDACGdmaAdpt->GdmaCtl.SrcMsize = pSalDACDmaUserDef->TxDatSrcBstSz; + pHALDACGdmaAdpt->GdmaCtl.DestMsize = pSalDACDmaUserDef->TxDatDstBstSz; + + pHALDACGdmaAdpt->GdmaCtl.Dinc = NoChange; + + pHALDACGdmaAdpt->GdmaCtl.Done = 1; + pHALDACGdmaAdpt->GdmaCtl.TtFc = 0x01; + pHALDACGdmaAdpt->GdmaCtl.LlpSrcEn = 1; + + pHALDACGdmaAdpt->GdmaCfg.DestPer = 13; + + pHALDACGdmaAdpt->GdmaIsrType = (BlockType|ErrType); + + /* Enable LLP control */ + pHALDACGdmaAdpt->Llpctrl = pSalDACDmaUserDef->LlpCtrl; + + pHALDACGdmaAdpt->MuliBlockCunt = 1; + pHALDACGdmaAdpt->MaxMuliBlock = pSalDACDmaUserDef->MaxMultiBlk; + + pHALDACGdmaAdpt->TestItem = 9; + + //pSalDACMngtAdpt->pSalDMAIrqFunc = &DACGDMALLPISRHandle; + } + + + /* GDMA interrupt register */ + pIrqHandleDACGdma->Data = (u32) (pSalDACHND); + pIrqHandleDACGdma->IrqNum = GDMA0_CHANNEL0_IRQ + pHALDACGdmaAdpt->ChNum + + ((pHALDACGdmaAdpt->GdmaIndex)*6); + pIrqHandleDACGdma->IrqFun = (IRQ_FUN) pSalDACMngtAdpt->pSalDMAIrqFunc; + pIrqHandleDACGdma->Priority = 2; + InterruptRegister(pIrqHandleDACGdma); + InterruptEn(pIrqHandleDACGdma); + + + pHALDACGdmaOp->HalGdmaOnOff((VOID*)pHALDACGdmaAdpt); + pHALDACGdmaOp->HalGdmaChIsrEnAndDis((VOID*)pHALDACGdmaAdpt); + +#if 0 + /* Enable GDMA according to the DMA type */ + if (pSalDACHND->DACInType == DAC_INPUT_DMA_ONEBLK) { + pHALDACGdmaOp->HalGdmaChSeting((VOID*)pHALDACGdmaAdpt); + } + else if (pSalDACHND->DACInType == DAC_INPUT_DMA_LLP){ + //pHALDACGdmaOp->HalGdmaChBlockSeting((VOID*)(pHALDACGdmaAdpt)); + } +#endif + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CIrqDeInit +// +// Description: +// I2C interrupt de-initialization function. +// According to the given I2C device number, the I2C interrupt will be unreigster +// from the platform and the relative interrupt handler will be cleared. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C interrupt de-initialization process. +// _EXIT_SUCCESS if the RtkI2CIrqDeInit succeeded. +// _EXIT_FAILURE if the RtkI2CIrqDeInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +static RTK_STATUS +RtkDACDMADeInit( + IN PSAL_DAC_HND pSalDACHND +){ + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + + PHAL_GDMA_ADAPTER pHALDACGdmaAdpt = NULL; + PHAL_GDMA_OP pHALDACGdmaOp = NULL; + PIRQ_HANDLE pIrqHandleDACGdma = NULL; + + /*To Get the SAL_I2C_MNGT_ADPT Pointer*/ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + pHALDACGdmaAdpt = pSalDACMngtAdpt->pHalGdmaAdp; + pHALDACGdmaOp = pSalDACMngtAdpt->pHalGdmaOp; + pIrqHandleDACGdma = pSalDACMngtAdpt->pIrqGdmaHnd; + + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + HalGdmaOpInit(pHALDACGdmaOp); + + pHALDACGdmaAdpt->IsrCtrl = DISABLE; + pHALDACGdmaOp->HalGdmaChIsrEnAndDis((VOID*)pHALDACGdmaAdpt); + pHALDACGdmaOp->HalGdmaChIsrClean((VOID*)pHALDACGdmaAdpt); + pHALDACGdmaOp->HalGdmaChDis((VOID*)pHALDACGdmaAdpt); + + InterruptUnRegister(pIrqHandleDACGdma); +#if 0 + _memset((void *)pIrqHandleDACGdma , 0, sizeof(IRQ_HANDLE)); + _memset((void *)pHALDACGdmaOp , 0, sizeof(HAL_GDMA_OP)); + _memset((void *)pHALDACGdmaAdpt , 0, sizeof(HAL_GDMA_ADAPTER)); +#endif + return _EXIT_SUCCESS; +} + +#endif + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CInit +// +// Description: +// According to the given I2C index, the related SAL_I2C_MNGT_ADPT pointer used +// for retrieving each I2C data sturcture pointer will be reversely parsed first. +// Then, initializing I2C HAL operation, initializing I2C interrupt (if needed), +// initializing I2C DMA (if needed) and initializing I2C pinmux will be done. +// User specified I2C configuration will be assigned to I2C initial data structure +// (PHAL_I2C_INIT_DAT pHalI2CInitDat). I2C HAL initialization is executed after +// all the configuration data taken. +// In the end, I2C module is enabled as a final step of the whole initialization. +// For a slave ack General Call support, an additional step may be followed after +// the above steps. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C initialization process. +// _EXIT_SUCCESS if the RtkI2CInit succeeded. +// _EXIT_FAILURE if the RtkI2CInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkDACInit( + IN VOID *Data +){ + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + //PHAL_DAC_INIT_DAT pHalDACInitDat = NULL; + PHAL_DAC_OP pHalDACOP = NULL; + + u32 DacTemp; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + //pHalDACInitDat = pSalDACMngtAdpt->pHalInitDat; + pHalDACOP = pSalDACMngtAdpt->pHalOp; + + /* Check the input I2C index first */ + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + +#if 0 + /* Check the input I2C operation type */ + if (RtkI2COpTypeChk(pSalI2CHND)) + return _EXIT_FAILURE; +#endif + + /* DAC Initialize HAL Operations */ + HalDACOpInit(pHalDACOP); + + /* DAC Interrupt Initialization */ +#if DAC_INTR_OP_TYPE + RtkDACIrqInit(pSalDACHND); +#endif + + /* DAC DMA Initialization */ +#if DAC_DMA_OP_TYPE + RtkDACDMAInit(pSalDACHND); +#endif + + + /* DAC Function and Clock Enable*/ + RtkDACPinMuxInit(pSalDACHND); + + pHalDACOP->HalDACInit(pSalDACHND->pInitDat); + + #if 1 + HAL_DAC_WRITE32(pSalDACHND->DevNum, REG_DAC_INTR_CTRL, + (BIT_DAC_FIFO_FULL_EN | + BIT_DAC_FIFO_OVERFLOW_EN | + BIT_DAC_FIFO_STOP_EN | + BIT_DAC__WRITE_ERROR_EN | + BIT_DAC_DSC_OVERFLOW0_EN | + BIT_DAC_DSC_OVERFLOW1_EN)); + #else + HAL_DAC_WRITE32(pSalDACHND->DevNum, REG_DAC_INTR_CTRL, + (BIT_DAC_FIFO_FULL_EN| + BIT_DAC_FIFO_OVERFLOW_EN| + BIT_DAC_FIFO_STOP_EN| + BIT_DAC__WRITE_ERROR_EN| + BIT_DAC_DSC_OVERFLOW0_EN| + BIT_DAC_DSC_OVERFLOW1_EN)); + #endif + DBG_DAC_INFO("INTR MSK:%x\n", HAL_DAC_READ32(pSalDACHND->DevNum,REG_DAC_INTR_CTRL)); + + + + DacTemp = HAL_DAC_READ32(pSalDACHND->DevNum, REG_DAC_ANAPAR_DA1); + DacTemp |= (BIT31); + HAL_DAC_WRITE32(pSalDACHND->DevNum, REG_DAC_ANAPAR_DA1, DacTemp); + //DBG_DAC_INFO("REG_DAC_ANAPAR_DA1:%08x\n",DacTemp); + DBG_DAC_INFO("REG_DAC_ANAPAR_DA1:%08x\n",HAL_DAC_READ32(pSalDACHND->DevNum, REG_DAC_ANAPAR_DA1)); + DacTemp = HAL_DAC_READ32(pSalDACHND->DevNum, REG_DAC_CTRL); + DacTemp |= BIT3; + HAL_DAC_WRITE32(pSalDACHND->DevNum, REG_DAC_CTRL, DacTemp); + DBG_DAC_INFO("REG_DAC_CTRL:%08x\n",DacTemp); + + pSalDACHND->pInitDat->DACEn = DAC_ENABLE; + pHalDACOP->HalDACEnable(pSalDACHND->pInitDat); + + /* DAC Device Status Update */ + pSalDACHND->DevSts = DAC_STS_IDLE; + + return _EXIT_SUCCESS; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CInit +// +// Description: +// According to the given I2C index, the related SAL_I2C_MNGT_ADPT pointer used +// for retrieving each I2C data sturcture pointer will be reversely parsed first. +// Then, initializing I2C HAL operation, initializing I2C interrupt (if needed), +// initializing I2C DMA (if needed) and initializing I2C pinmux will be done. +// User specified I2C configuration will be assigned to I2C initial data structure +// (PHAL_I2C_INIT_DAT pHalI2CInitDat). I2C HAL initialization is executed after +// all the configuration data taken. +// In the end, I2C module is enabled as a final step of the whole initialization. +// For a slave ack General Call support, an additional step may be followed after +// the above steps. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C initialization process. +// _EXIT_SUCCESS if the RtkI2CInit succeeded. +// _EXIT_FAILURE if the RtkI2CInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkDACDeInit( + IN VOID *Data +){ + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PHAL_DAC_INIT_DAT pHalDACInitDat = NULL; + PHAL_DAC_OP pHalDACOP = NULL; + + /* To Get the SAL_DAC_MNGT_ADPT Pointer */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + pHalDACInitDat = pSalDACMngtAdpt->pHalInitDat; + pHalDACOP = pSalDACMngtAdpt->pHalOp; + + /* Check the input DAC index first */ + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + { + /* DAC Initialize HAL Operations */ + HalDACOpInit(pHalDACOP); + + /* DAC Interrupt Initialization */ +#if DAC_INTR_OP_TYPE + RtkDACIrqDeInit(pSalDACHND); +#endif + + /* DAC DMA Initialization */ +#if DAC_DMA_OP_TYPE + RtkDACDMADeInit(pSalDACHND); +#endif + + pHalDACInitDat->DACEn = DAC_DISABLE; + pHalDACOP->HalDACEnable(pHalDACInitDat); + pHalDACOP->HalDACDeInit(pHalDACInitDat); + + /* DAC Function and Clock Enable*/ + RtkDACPinMuxDeInit(pSalDACHND); + } + + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CInit +// +// Description: +// According to the given I2C index, the related SAL_I2C_MNGT_ADPT pointer used +// for retrieving each I2C data sturcture pointer will be reversely parsed first. +// Then, initializing I2C HAL operation, initializing I2C interrupt (if needed), +// initializing I2C DMA (if needed) and initializing I2C pinmux will be done. +// User specified I2C configuration will be assigned to I2C initial data structure +// (PHAL_I2C_INIT_DAT pHalI2CInitDat). I2C HAL initialization is executed after +// all the configuration data taken. +// In the end, I2C module is enabled as a final step of the whole initialization. +// For a slave ack General Call support, an additional step may be followed after +// the above steps. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C initialization process. +// _EXIT_SUCCESS if the RtkI2CInit succeeded. +// _EXIT_FAILURE if the RtkI2CInit failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkDACSend( + IN VOID *Data +){ + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PHAL_GDMA_ADAPTER pHALDACGdmaAdpt = NULL; + PHAL_GDMA_OP pHALDACGdmaOp = NULL; + PSAL_DAC_DMA_USER_DEF pSalDACDmaUserDef = NULL; + //PIRQ_HANDLE pIrqHandleDACGdma = NULL; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + pHALDACGdmaAdpt = pSalDACMngtAdpt->pHalGdmaAdp; + pHALDACGdmaOp = pSalDACMngtAdpt->pHalGdmaOp; + pSalDACDmaUserDef = pSalDACMngtAdpt->pDMAConf; + + switch (pSalDACHND->DACInType) { + case DAC_INPUT_SINGLE_WR: + { + break; + } + case DAC_INPUT_DMA_ONEBLK: + { + HalGdmaOpInit(pHALDACGdmaOp); + + pHALDACGdmaAdpt->GdmaCtl.BlockSize = pSalDACHND->pTXBuf->DataLen; + pHALDACGdmaAdpt->ChSar = (u32)pSalDACHND->pTXBuf->pDataBuf; + pHALDACGdmaAdpt->ChDar = (u32)(DAC_REG_BASE+(pSalDACHND->DevNum*0x800)); + + DBG_DAC_INFO("src addr:%x\n", pHALDACGdmaAdpt->ChSar); + DBG_DAC_INFO("dst addr:%x\n", pHALDACGdmaAdpt->ChDar); + pHALDACGdmaOp->HalGdmaChSeting(pHALDACGdmaAdpt); + + pHALDACGdmaOp->HalGdmaChEn(pHALDACGdmaAdpt); + break; + } + case DAC_INPUT_DMA_LLP: + { + pHALDACGdmaAdpt->Rsvd4to7 = 1; + pHALDACGdmaAdpt->pLlix = (struct GDMA_CH_LLI *)pSalDACDmaUserDef->pLlix; + pHALDACGdmaAdpt->pBlockSizeList = (struct BLOCK_SIZE_LIST *)pSalDACDmaUserDef->pBlockSizeList; + pHALDACGdmaAdpt->ChDar = (u32)(DAC_REG_BASE+(pSalDACHND->DevNum*0x800)); + pHALDACGdmaOp->HalGdmaChBlockSeting(pHALDACGdmaAdpt); + + pHALDACGdmaOp->HalGdmaChEn(pHALDACGdmaAdpt); + break; + } + + default: + return _EXIT_FAILURE; + } + + + return _EXIT_SUCCESS; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetSalHnd +// +// Description: +// Allocation of lower layer memory spaces will be done by invoking RtkI2CGetMngtAdpt +// in this function and return a SAL_I2C_HND pointer to upper layer. +// According to the given I2C index, RtkI2CGetMngtAdpt will allocate all the memory +// space such as SAL_I2C_HND, HAL_I2C_INIT_DAT, SAL_I2C_USER_CB etc. +// +// +// Arguments: +// [in] u8 I2CIdx - +// I2C Index +// +// Return: +// PSAL_I2C_HND +// A pointer to SAL_I2C_HND which is allocated in the lower layer. +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +PSAL_DAC_HND +RtkDACGetSalHnd( + IN u8 DACIdx +){ + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PSAL_DAC_HND pSalDACHND = NULL; + + /* Check the user define setting and the given index */ + if (RtkDACIdxChk(DACIdx)) { + return (PSAL_DAC_HND)NULL; + } + + /* Invoke RtkI2CGetMngtAdpt to get the I2C SAL management adapter pointer */ + pSalDACMngtAdpt = RtkDACGetMngtAdpt(DACIdx); + + /* Assign the private SAL handle to public SAL handle */ + pSalDACHND = &(pSalDACMngtAdpt->pSalHndPriv->SalDACHndPriv); + + /* Assign the internal HAL initial data pointer to the SAL handle */ + pSalDACHND->pInitDat = pSalDACMngtAdpt->pHalInitDat; + + /* Assign the internal user callback pointer to the SAL handle */ + pSalDACHND->pUserCB = pSalDACMngtAdpt->pUserCB; + + /* Assign the internal user DMA config to the SAL handle */ + pSalDACHND->pDMAConf = pSalDACMngtAdpt->pDMAConf; + + return &(pSalDACMngtAdpt->pSalHndPriv->SalDACHndPriv); +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetSalHnd +// +// Description: +// Allocation of lower layer memory spaces will be done by invoking RtkI2CGetMngtAdpt +// in this function and return a SAL_I2C_HND pointer to upper layer. +// According to the given I2C index, RtkI2CGetMngtAdpt will allocate all the memory +// space such as SAL_I2C_HND, HAL_I2C_INIT_DAT, SAL_I2C_USER_CB etc. +// +// +// Arguments: +// [in] u8 I2CIdx - +// I2C Index +// +// Return: +// PSAL_I2C_HND +// A pointer to SAL_I2C_HND which is allocated in the lower layer. +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkDACFreeSalHnd( + IN PSAL_DAC_HND pSalDACHND +){ + PSAL_DAC_MNGT_ADPT pSalDACMngtAdpt = NULL; + PSAL_DAC_HND_PRIV pSalDACHNDPriv = NULL; + + /* To get the SAL_DAC_MNGT_ADPT pointer */ + pSalDACHNDPriv = CONTAINER_OF(pSalDACHND, SAL_DAC_HND_PRIV, SalDACHndPriv); + pSalDACMngtAdpt = CONTAINER_OF(pSalDACHNDPriv->ppSalDACHnd, SAL_DAC_MNGT_ADPT, pSalHndPriv); + + /* Invoke RtkDACFreeMngtAdpt to free all the lower layer memory space */ + return (RtkDACFreeMngtAdpt(pSalDACMngtAdpt)); + +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CLoadDefault +// +// Description: +// Accrording the given I2C index, the default I2C configuration is done. +// +// +// Arguments: +// [in] PSAL_I2C_HND pSalI2CHND - +// SAL I2C handle +// +// Return: +// The status of the loading I2C default configuration. +// _EXIT_SUCCESS if the RtkI2CLoadDefault succeeded. +// _EXIT_FAILURE if the RtkI2CLoadDefault failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +RTK_STATUS +RtkDACLoadDefault( + IN VOID *Data +){ + PSAL_DAC_HND pSalDACHND = (PSAL_DAC_HND) Data; + + /* Check the input DAC index first */ + if (RtkDACIdxChk(pSalDACHND->DevNum)) + return _EXIT_FAILURE; + + /* Load SAL handle default value */ + pSalDACHND->PinMux = 0; + pSalDACHND->OpType = DAC_POLL_TYPE; + pSalDACHND->DevSts = DAC_STS_UNINITIAL; + pSalDACHND->DACExd = 0; + pSalDACHND->ErrType = (u32)NULL; + + /* Load HAL initial data structure default value */ + pSalDACHND->pInitDat->DACIdx = pSalDACHND->DevNum; + pSalDACHND->pInitDat->DACEn = DAC_DISABLE; + pSalDACHND->pInitDat->DACDataRate = DAC_DATA_RATE_250K; + pSalDACHND->pInitDat->DACEndian = DAC_DATA_ENDIAN_LITTLE; + pSalDACHND->pInitDat->DACBurstSz = 7; + pSalDACHND->pInitDat->DACDbgSel = DAC_DBG_SEL_DISABLE; + pSalDACHND->pInitDat->DACDscDbgSel = DAC_DSC_DBG_SEL_DISABLE; + pSalDACHND->pInitDat->DACBPDsc = DAC_BYPASS_DSC_SEL_DISABLE; + pSalDACHND->pInitDat->DACDeltaSig = 0; + pSalDACHND->pInitDat->DACAnaCtrl0 = 0; + pSalDACHND->pInitDat->DACAnaCtrl1 = 0; + pSalDACHND->pInitDat->DACIntrMSK = DAC_FEATURE_DISABLED; + + /* Load DAC DMA user configuration default value */ + pSalDACHND->pDMAConf->MaxMultiBlk = 5000; + pSalDACHND->pDMAConf->TxDatSrcWdth = TrWidthFourBytes; + pSalDACHND->pDMAConf->TxDatSrcBstSz = MsizeFour; + pSalDACHND->pDMAConf->TxDatDstWdth = TrWidthFourBytes; + pSalDACHND->pDMAConf->TxDatDstBstSz = MsizeFour; + pSalDACHND->pDMAConf->TxChNo = 4; + + return _EXIT_SUCCESS; +} diff --git a/lib/fwlib/src/hal_gdma.c b/lib/fwlib/src/hal_gdma.c new file mode 100644 index 0000000..79f8e20 --- /dev/null +++ b/lib/fwlib/src/hal_gdma.c @@ -0,0 +1,574 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "hal_gdma.h" + +#define MAX_GDMA_INDX 1 +#define MAX_GDMA_CHNL 6 + +static u8 HalGdmaReg[MAX_GDMA_INDX+1]; + +const HAL_GDMA_CHNL GDMA_Chnl_Option[] = { + {0,0,GDMA0_CHANNEL0_IRQ,0}, + {1,0,GDMA1_CHANNEL0_IRQ,0}, + {0,1,GDMA0_CHANNEL1_IRQ,0}, + {1,1,GDMA1_CHANNEL1_IRQ,0}, + {0,2,GDMA0_CHANNEL2_IRQ,0}, + {1,2,GDMA1_CHANNEL2_IRQ,0}, + {0,3,GDMA0_CHANNEL3_IRQ,0}, + {1,3,GDMA1_CHANNEL3_IRQ,0}, + {0,4,GDMA0_CHANNEL4_IRQ,0}, + {1,4,GDMA1_CHANNEL4_IRQ,0}, + {0,5,GDMA0_CHANNEL5_IRQ,0}, + {1,5,GDMA1_CHANNEL5_IRQ,0}, + + {0xff,0,0,0} // end +}; + +const HAL_GDMA_CHNL GDMA_Multi_Block_Chnl_Option[] = { + {0,4,GDMA0_CHANNEL4_IRQ,0}, + {1,4,GDMA1_CHANNEL4_IRQ,0}, + {0,5,GDMA0_CHANNEL5_IRQ,0}, + {1,5,GDMA1_CHANNEL5_IRQ,0}, + + {0xff,0,0,0} // end +}; + + +const u16 HalGdmaChnlEn[6] = { + GdmaCh0, GdmaCh1, GdmaCh2, GdmaCh3, + GdmaCh4, GdmaCh5 +}; + + + +VOID HalGdmaOpInit( + IN VOID *Data +) +{ + PHAL_GDMA_OP pHalGdmaOp = (PHAL_GDMA_OP) Data; + + pHalGdmaOp->HalGdmaOnOff = HalGdmaOnOffRtl8195a; + pHalGdmaOp->HalGdamChInit = HalGdamChInitRtl8195a; + pHalGdmaOp->HalGdmaChDis = HalGdmaChDisRtl8195a; + pHalGdmaOp->HalGdmaChEn = HalGdmaChEnRtl8195a; + pHalGdmaOp->HalGdmaChSeting = HalGdmaChSetingRtl8195a; +#ifndef CONFIG_CHIP_E_CUT + pHalGdmaOp->HalGdmaChBlockSeting = HalGdmaChBlockSetingRtl8195a; +#else + pHalGdmaOp->HalGdmaChBlockSeting = HalGdmaChBlockSetingRtl8195a_V04; +#endif + pHalGdmaOp->HalGdmaChIsrEnAndDis = HalGdmaChIsrEnAndDisRtl8195a; + pHalGdmaOp->HalGdmaChIsrClean = HalGdmaChIsrCleanRtl8195a; + pHalGdmaOp->HalGdmaChCleanAutoSrc = HalGdmaChCleanAutoSrcRtl8195a; + pHalGdmaOp->HalGdmaChCleanAutoDst = HalGdmaChCleanAutoDstRtl8195a; +} + +VOID HalGdmaOn(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + pHalGdmaAdapter->GdmaOnOff = ON; + HalGdmaOnOffRtl8195a((VOID*)pHalGdmaAdapter); +} + +VOID HalGdmaOff(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + pHalGdmaAdapter->GdmaOnOff = OFF; + HalGdmaOnOffRtl8195a((VOID*)pHalGdmaAdapter); +} + +BOOL HalGdmaChInit(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + return (HalGdamChInitRtl8195a((VOID*)pHalGdmaAdapter)); +} + +VOID HalGdmaChDis(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + HalGdmaChDisRtl8195a((VOID*)pHalGdmaAdapter); +} + +VOID HalGdmaChEn(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + HalGdmaChEnRtl8195a((VOID*)pHalGdmaAdapter); +} + +BOOL HalGdmaChSeting(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + return (HalGdmaChSetingRtl8195a((VOID*)pHalGdmaAdapter)); +} + +BOOL HalGdmaChBlockSeting(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ +#ifndef CONFIG_CHIP_E_CUT + return (HalGdmaChBlockSetingRtl8195a((VOID*)pHalGdmaAdapter)); +#else + return (HalGdmaChBlockSetingRtl8195a_V04((VOID*)pHalGdmaAdapter)); +#endif +} + +VOID HalGdmaChIsrEn(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + pHalGdmaAdapter->IsrCtrl = ENABLE; + HalGdmaChIsrEnAndDisRtl8195a((VOID*)pHalGdmaAdapter); +} + +VOID HalGdmaChIsrDis(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + pHalGdmaAdapter->IsrCtrl = DISABLE; + HalGdmaChIsrEnAndDisRtl8195a((VOID*)pHalGdmaAdapter); +} + +u8 HalGdmaChIsrClean(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + return (HalGdmaChIsrCleanRtl8195a((VOID*)pHalGdmaAdapter)); +} + +VOID HalGdmaChCleanAutoSrc(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + HalGdmaChCleanAutoSrcRtl8195a((VOID*)pHalGdmaAdapter); +} + +VOID HalGdmaChCleanAutoDst(PHAL_GDMA_ADAPTER pHalGdmaAdapter) +{ + HalGdmaChCleanAutoDstRtl8195a((VOID*)pHalGdmaAdapter); +} + +HAL_Status HalGdmaChnlRegister (u8 GdmaIdx, u8 ChnlNum) +{ + u32 mask; + + if ((GdmaIdx > MAX_GDMA_INDX) || (ChnlNum > MAX_GDMA_CHNL)) { + // Invalid GDMA Index or Channel Number + return HAL_ERR_PARA; + } + + mask = 1 << ChnlNum; + + if ((HalGdmaReg[GdmaIdx] & mask) != 0) { + return HAL_BUSY; + } + else { +#if 1 + if (HalGdmaReg[GdmaIdx] == 0) { + if (GdmaIdx == 0) { + ACTCK_GDMA0_CCTRL(ON); + GDMA0_FCTRL(ON); + } + else { + ACTCK_GDMA1_CCTRL(ON); + GDMA1_FCTRL(ON); + } + } +#endif + HalGdmaReg[GdmaIdx] |= mask; + return HAL_OK; + } +} + +VOID HalGdmaChnlUnRegister (u8 GdmaIdx, u8 ChnlNum) +{ + u32 mask; + + if ((GdmaIdx > MAX_GDMA_INDX) || (ChnlNum > MAX_GDMA_CHNL)) { + // Invalid GDMA Index or Channel Number + return; + } + + mask = 1 << ChnlNum; + + HalGdmaReg[GdmaIdx] &= ~mask; +#if 1 + if (HalGdmaReg[GdmaIdx] == 0) { + if (GdmaIdx == 0) { + ACTCK_GDMA0_CCTRL(OFF); + GDMA0_FCTRL(OFF); + } + else { + ACTCK_GDMA1_CCTRL(OFF); + GDMA1_FCTRL(OFF); + } + } +#endif +} + +PHAL_GDMA_CHNL HalGdmaChnlAlloc (HAL_GDMA_CHNL *pChnlOption) +{ + HAL_GDMA_CHNL *pgdma_chnl; + + pgdma_chnl = pChnlOption; + if (pChnlOption == NULL) { + // Use default GDMA Channel Option table + pgdma_chnl = (HAL_GDMA_CHNL*)&GDMA_Chnl_Option[0]; + } + else{ + pgdma_chnl = (HAL_GDMA_CHNL*) pgdma_chnl; + } + + while (pgdma_chnl->GdmaIndx <= MAX_GDMA_INDX) { + if (HalGdmaChnlRegister(pgdma_chnl->GdmaIndx, pgdma_chnl->GdmaChnl) == HAL_OK) { + // This GDMA Channel is available + break; + } + pgdma_chnl += 1; + } + + if (pgdma_chnl->GdmaIndx > MAX_GDMA_INDX) { + pgdma_chnl = NULL; + } + + return pgdma_chnl; +} + +VOID HalGdmaChnlFree (HAL_GDMA_CHNL *pChnl) +{ + IRQ_HANDLE IrqHandle; + + IrqHandle.IrqNum = pChnl->IrqNum; + InterruptDis(&IrqHandle); + InterruptUnRegister(&IrqHandle); + HalGdmaChnlUnRegister(pChnl->GdmaIndx, pChnl->GdmaChnl); +} + +VOID HalGdmaMemIrqHandler(VOID *pData) +{ + PHAL_GDMA_OBJ pHalGdmaObj=(PHAL_GDMA_OBJ)pData; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PIRQ_HANDLE pGdmaIrqHandle; + + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle); + // Clean Auto Reload Bit + HalGdmaChCleanAutoDst((VOID*)pHalGdmaAdapter); + + // Clear Pending ISR + HalGdmaChIsrClean((VOID*)pHalGdmaAdapter); + + HalGdmaChDis((VOID*)(pHalGdmaAdapter)); + pHalGdmaObj->Busy = 0; + + if (pGdmaIrqHandle->IrqFun != NULL) { + pGdmaIrqHandle->IrqFun((VOID*)pGdmaIrqHandle->Data); + } +} + +BOOL HalGdmaMemCpyAggrInit(PHAL_GDMA_OBJ pHalGdmaObj) +{ + HAL_GDMA_CHNL *pgdma_chnl; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PIRQ_HANDLE pGdmaIrqHandle; + IRQ_HANDLE IrqHandle; + + pgdma_chnl = HalGdmaChnlAlloc((PHAL_GDMA_CHNL) &GDMA_Multi_Block_Chnl_Option[0]); // get a whatever GDMA channel + if (NULL == pgdma_chnl) { + DBG_GDMA_ERR("%s: Cannot allocate a GDMA Channel\n", __FUNCTION__); + return _FALSE; + } + + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle); + + DBG_GDMA_INFO("%s: Use GDMA%d CH%d\n", __FUNCTION__, pgdma_chnl->GdmaIndx, pgdma_chnl->GdmaChnl); + + _memset((void *)pHalGdmaAdapter, 0, sizeof(HAL_GDMA_ADAPTER)); + + pHalGdmaAdapter->GdmaCtl.TtFc = TTFCMemToMem; + pHalGdmaAdapter->GdmaCtl.Done = 1; + pHalGdmaAdapter->MuliBlockCunt = 0; + pHalGdmaAdapter->MaxMuliBlock = 1; + pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx; + pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->GdmaIsrType = (TransferType|ErrType); + pHalGdmaAdapter->IsrCtrl = ENABLE; + pHalGdmaAdapter->GdmaOnOff = ON; + pHalGdmaAdapter->GdmaCtl.IntEn = 1; + pHalGdmaAdapter->Rsvd4to7 = 1; + pHalGdmaAdapter->Llpctrl = 1; + pGdmaIrqHandle->IrqNum = pgdma_chnl->IrqNum; + pGdmaIrqHandle->Priority = 0x10; + + IrqHandle.IrqFun = (IRQ_FUN) HalGdmaMemIrqHandler; + IrqHandle.Data = (u32) pHalGdmaObj; + IrqHandle.IrqNum = pGdmaIrqHandle->IrqNum; + IrqHandle.Priority = pGdmaIrqHandle->Priority; + + InterruptRegister(&IrqHandle); + InterruptEn(&IrqHandle); + pHalGdmaObj->Busy = 0; + + return _TRUE; +} + + +VOID HalGdmaMultiBlockSetting(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + u8 BlockNumber; + u8 BlockIndex; + u8 FourBytesAlign; + + BlockNumber = pHalGdmaObj->BlockNum; + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + + pHalGdmaAdapter->GdmaCtl.LlpSrcEn = 1; + pHalGdmaAdapter->GdmaCtl.LlpDstEn = 1; + + if(((pHalGdmaBlock[0].SrcAddr & 0x03) == 0) &&((pHalGdmaBlock[0].DstAddr & 0x03) == 0) + && ((pHalGdmaBlock[0].BlockLength & 0X03) == 0)){ + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; + FourBytesAlign = 1; + } + else{ + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte; + FourBytesAlign = 0; + } + + for(BlockIndex = 0; BlockIndex < BlockNumber; BlockIndex++){ + + pHalGdmaObj->GdmaChLli[BlockIndex].Sarx = pHalGdmaBlock[BlockIndex].SrcAddr; + pHalGdmaObj->GdmaChLli[BlockIndex].Darx = pHalGdmaBlock[BlockIndex].DstAddr; + pHalGdmaObj->BlockSizeList[BlockIndex].pNextBlockSiz = &pHalGdmaObj->BlockSizeList[BlockIndex + 1]; + + if(FourBytesAlign){ + pHalGdmaObj->BlockSizeList[BlockIndex].BlockSize = pHalGdmaBlock[BlockIndex].BlockLength >> 2; + } + else{ + pHalGdmaObj->BlockSizeList[BlockIndex].BlockSize = pHalGdmaBlock[BlockIndex].BlockLength; + } + + pHalGdmaObj->Lli[BlockIndex].pLliEle = (GDMA_CH_LLI_ELE*) &pHalGdmaObj->GdmaChLli[BlockIndex]; + pHalGdmaObj->Lli[BlockIndex].pNextLli = &pHalGdmaObj->Lli[BlockIndex + 1]; + + + if(BlockIndex == BlockNumber - 1){ + pHalGdmaObj->BlockSizeList[BlockIndex].pNextBlockSiz = NULL; + pHalGdmaObj->Lli[BlockIndex].pNextLli = NULL; + } + //DBG_GDMA_INFO("Lli[%d].pLiEle = %x\r\n", BlockIndex,Lli[BlockIndex].pLliEle); + //DBG_GDMA_INFO("Lli[%d].pNextLli = %x\r\n", BlockIndex,Lli[BlockIndex].pNextLli); + } + + pHalGdmaAdapter->pBlockSizeList = (struct BLOCK_SIZE_LIST*) &pHalGdmaObj->BlockSizeList; + pHalGdmaAdapter->pLlix = (struct GDMA_CH_LLI*) &pHalGdmaObj->Lli; + //DBG_GDMA_INFO("pHalGdmaAdapter->pBlockSizeList = %x\r\n", pHalGdmaAdapter->pBlockSizeList); + //DBG_GDMA_INFO("pHalGdmaAdapter->pLlix = %x\r\n", pHalGdmaAdapter->pLlix ); +} + +VOID HalGdmaLLPMemAlign(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PGDMA_CH_LLI_ELE pLliEle; + struct GDMA_CH_LLI *pGdmaChLli; + struct BLOCK_SIZE_LIST *pGdmaChBkLi; + u32 CtlxLow; + u32 CtlxUp; + u8 BlockNumber; + u8 BlockIndex; + + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + BlockNumber = pHalGdmaObj->BlockNum; + + pLliEle = pHalGdmaAdapter->pLlix->pLliEle; + pGdmaChLli = pHalGdmaAdapter->pLlix->pNextLli; + pGdmaChBkLi = pHalGdmaAdapter->pBlockSizeList; + + //4 Move to the second block to configure Memory Alginment setting + pLliEle->Llpx = (u32) pGdmaChLli->pLliEle; + pGdmaChBkLi = pGdmaChBkLi ->pNextBlockSiz; + + for(BlockIndex = 1; BlockIndex < BlockNumber; BlockIndex++){ + pLliEle = pGdmaChLli->pLliEle; + CtlxLow = pLliEle->CtlxLow; + CtlxLow &= (BIT_INVC_CTLX_LO_DST_TR_WIDTH & BIT_INVC_CTLX_LO_SRC_TR_WIDTH); + CtlxUp = pLliEle->CtlxUp; + CtlxUp &= (BIT_INVC_CTLX_UP_BLOCK_BS); + + if(((pHalGdmaBlock[BlockIndex].SrcAddr & 0x03) == 0) &&((pHalGdmaBlock[BlockIndex].DstAddr & 0x03) == 0) + && ((pHalGdmaBlock[BlockIndex].BlockLength & 0X03) == 0)){ + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; + pGdmaChBkLi->BlockSize = pHalGdmaBlock[BlockIndex].BlockLength>> 2; + + } + else{ + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte; + pGdmaChBkLi->BlockSize = pHalGdmaBlock[BlockIndex].BlockLength; + } + + CtlxLow |= (BIT_CTLX_LO_DST_TR_WIDTH(pHalGdmaAdapter->GdmaCtl.DstTrWidth) | + BIT_CTLX_LO_SRC_TR_WIDTH(pHalGdmaAdapter->GdmaCtl.SrcTrWidth)); + CtlxUp |= BIT_CTLX_UP_BLOCK_BS(pGdmaChBkLi->BlockSize); + + pGdmaChLli = pGdmaChLli->pNextLli; + pGdmaChBkLi = pGdmaChBkLi->pNextBlockSiz; + pLliEle->CtlxLow = CtlxLow; + pLliEle->CtlxUp = CtlxUp; + pLliEle->Llpx = (u32)(pGdmaChLli->pLliEle); + + } +} + +VOID HalGdmaMemAggr(PHAL_GDMA_OBJ pHalGdmaObj, PHAL_GDMA_BLOCK pHalGdmaBlock) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + + u8 BlockNumber; + + BlockNumber = pHalGdmaObj->BlockNum; + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + + if (pHalGdmaObj->Busy) { + DBG_GDMA_ERR("%s: ==> GDMA is Busy\r\n", __FUNCTION__); + return; + } + pHalGdmaObj->Busy = 1; + + pHalGdmaAdapter->MaxMuliBlock = BlockNumber; + pHalGdmaAdapter->ChSar = pHalGdmaBlock[0].SrcAddr; + pHalGdmaAdapter->ChDar = pHalGdmaBlock[0].DstAddr; + + HalGdmaMultiBlockSetting(pHalGdmaObj, pHalGdmaBlock); + HalGdmaOn((pHalGdmaAdapter)); + HalGdmaChIsrEn((pHalGdmaAdapter)); + HalGdmaChBlockSeting((pHalGdmaAdapter)); + HalGdmaLLPMemAlign(pHalGdmaObj, pHalGdmaBlock); + HalGdmaChEn((pHalGdmaAdapter)); + +} + + + +BOOL HalGdmaMemCpyInit(PHAL_GDMA_OBJ pHalGdmaObj) +{ + HAL_GDMA_CHNL *pgdma_chnl; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PIRQ_HANDLE pGdmaIrqHandle; + IRQ_HANDLE IrqHandle; + + pgdma_chnl = HalGdmaChnlAlloc(NULL); // get a whatever GDMA channel + if (NULL == pgdma_chnl) { + DBG_GDMA_ERR("%s: Cannot allocate a GDMA Channel\n", __FUNCTION__); + return _FALSE; + } + + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle); + + DBG_GDMA_INFO("%s: Use GDMA%d CH%d\n", __FUNCTION__, pgdma_chnl->GdmaIndx, pgdma_chnl->GdmaChnl); +#if 0 + if (pgdma_chnl->GdmaIndx == 0) { + ACTCK_GDMA0_CCTRL(ON); + GDMA0_FCTRL(ON); + } + else if (pgdma_chnl->GdmaIndx == 1) { + ACTCK_GDMA1_CCTRL(ON); + GDMA1_FCTRL(ON); + } +#endif + _memset((void *)pHalGdmaAdapter, 0, sizeof(HAL_GDMA_ADAPTER)); + +// pHalGdmaAdapter->GdmaCtl.TtFc = TTFCMemToMem; + pHalGdmaAdapter->GdmaCtl.Done = 1; +// pHalGdmaAdapter->MuliBlockCunt = 0; +// pHalGdmaAdapter->MaxMuliBlock = 1; + pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx; + pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->GdmaIsrType = (TransferType|ErrType); + pHalGdmaAdapter->IsrCtrl = ENABLE; + pHalGdmaAdapter->GdmaOnOff = ON; + + pHalGdmaAdapter->GdmaCtl.IntEn = 1; +// pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; +// pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; +// pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; +// pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; +// pHalGdmaAdapter->GdmaCtl.Dinc = IncType; +// pHalGdmaAdapter->GdmaCtl.Sinc = IncType; + + pGdmaIrqHandle->IrqNum = pgdma_chnl->IrqNum; + pGdmaIrqHandle->Priority = 10; + + IrqHandle.IrqFun = (IRQ_FUN) HalGdmaMemIrqHandler; + IrqHandle.Data = (u32) pHalGdmaObj; + IrqHandle.IrqNum = pGdmaIrqHandle->IrqNum; + IrqHandle.Priority = pGdmaIrqHandle->Priority; + + InterruptRegister(&IrqHandle); + InterruptEn(&IrqHandle); + pHalGdmaObj->Busy = 0; + + return _TRUE; +} + +VOID HalGdmaMemCpyDeInit(PHAL_GDMA_OBJ pHalGdmaObj) +{ + HAL_GDMA_CHNL GdmaChnl; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PIRQ_HANDLE pGdmaIrqHandle; + + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + pGdmaIrqHandle = &(pHalGdmaObj->GdmaIrqHandle); + + GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex; + GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum; + GdmaChnl.IrqNum = pGdmaIrqHandle->IrqNum; + HalGdmaChnlFree(&GdmaChnl); +} + +// If multi-task using the same GDMA Object, then it needs a mutex to protect this procedure +VOID* HalGdmaMemCpy(PHAL_GDMA_OBJ pHalGdmaObj, void* pDest, void* pSrc, u32 len) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + + if (pHalGdmaObj->Busy) { + DBG_GDMA_ERR("%s: ==> GDMA is Busy\r\n", __FUNCTION__); + return 0; + } + pHalGdmaObj->Busy = 1; + pHalGdmaAdapter = &(pHalGdmaObj->HalGdmaAdapter); + + DBG_GDMA_INFO("%s: ==> Src=0x%x Dst=0x%x Len=%d\r\n", __FUNCTION__, pSrc, pDest, len); + if ((((u32)pSrc & 0x03)==0) && + (((u32)pDest & 0x03)==0) && + ((len & 0x03)== 0)) { + // 4-bytes aligned, move 4 bytes each transfer + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthFourBytes; + pHalGdmaAdapter->GdmaCtl.BlockSize = len >> 2; + } + else { + pHalGdmaAdapter->GdmaCtl.SrcMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.SrcTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.DestMsize = MsizeEight; + pHalGdmaAdapter->GdmaCtl.DstTrWidth = TrWidthOneByte; + pHalGdmaAdapter->GdmaCtl.BlockSize = len; + } + + pHalGdmaAdapter->ChSar = (u32)pSrc; + pHalGdmaAdapter->ChDar = (u32)pDest; + pHalGdmaAdapter->PacketLen = len; + + HalGdmaOn((pHalGdmaAdapter)); + HalGdmaChIsrEn((pHalGdmaAdapter)); + HalGdmaChSeting((pHalGdmaAdapter)); + HalGdmaChEn((pHalGdmaAdapter)); + + return (pDest); +} diff --git a/lib/fwlib/src/hal_gpio.c b/lib/fwlib/src/hal_gpio.c new file mode 100644 index 0000000..d2cb94e --- /dev/null +++ b/lib/fwlib/src/hal_gpio.c @@ -0,0 +1,145 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" + +#ifdef CONFIG_GPIO_EN + +HAL_GPIO_DATA_SECTION HAL_GPIO_ADAPTER gHAL_Gpio_Adapter; +extern PHAL_GPIO_ADAPTER _pHAL_Gpio_Adapter; + +extern VOID GPIO_PullCtrl_8195a(u32 chip_pin, u8 pull_type); + +/** + * @brief To get the GPIO IP Pin name for the given chip pin name + * + * @param chip_pin: The chip pin name. + * + * @retval The gotten GPIO IP pin name + */ +HAL_GPIO_TEXT_SECTION u32 +HAL_GPIO_GetPinName( + u32 chip_pin +) +{ + return HAL_GPIO_GetIPPinName_8195a((u32)chip_pin); +} + +/** + * @brief Set the GPIO pad Pull type + * + * @param pin: The pin for pull type control. + * @param mode: the pull type for the pin. + * @return None + */ +VOID +HAL_GPIO_PullCtrl( + u32 pin, + u32 mode +) +{ + u8 pull_type; + + DBG_GPIO_INFO("%s: pin=0x%x mode=%d\n ", __FUNCTION__, (u32)pin, (u32)mode); + + switch (mode) { + case hal_PullNone: + pull_type = DIN_PULL_NONE; + break; + + case hal_PullDown: + pull_type = DIN_PULL_LOW; + break; + + case hal_PullUp: + pull_type = DIN_PULL_HIGH; + break; + + case hal_OpenDrain: + default: + pull_type = DIN_PULL_NONE; + break; + } + +// HAL_GPIO_PullCtrl_8195a (pin, pull_type); + GPIO_PullCtrl_8195a (pin, pull_type); +} + + +/** + * @brief Initializes a GPIO Pin by the GPIO_Pin parameters. + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin initialization. + * + * @retval HAL_Status + */ +HAL_GPIO_TEXT_SECTION VOID +HAL_GPIO_Init( + HAL_GPIO_PIN *GPIO_Pin +) +{ + if (_pHAL_Gpio_Adapter == NULL) { + _pHAL_Gpio_Adapter = &gHAL_Gpio_Adapter; + DBG_GPIO_INFO("%s: Initial GPIO Adapter\n ", __FUNCTION__); + } + + HAL_GPIO_Init_8195a(GPIO_Pin); +} + +/** + * @brief Initializes a GPIO Pin as a interrupt signal + * + * @param GPIO_Pin: The data structer which contains the parameters for the GPIO Pin initialization. + * + * @retval HAL_Status + */ +VOID +HAL_GPIO_Irq_Init( + HAL_GPIO_PIN *GPIO_Pin +) +{ + if (_pHAL_Gpio_Adapter == NULL) { + _pHAL_Gpio_Adapter = &gHAL_Gpio_Adapter; + DBG_GPIO_INFO("%s: Initial GPIO Adapter\n ", __FUNCTION__); + } + + if (_pHAL_Gpio_Adapter->IrqHandle.IrqFun == NULL) { + _pHAL_Gpio_Adapter->IrqHandle.IrqFun = HAL_GPIO_MbedIrqHandler_8195a; + _pHAL_Gpio_Adapter->IrqHandle.Priority = 8; + HAL_GPIO_RegIrq_8195a(&_pHAL_Gpio_Adapter->IrqHandle); + InterruptEn(&_pHAL_Gpio_Adapter->IrqHandle); + DBG_GPIO_INFO("%s: Initial GPIO IRQ Adapter\n ", __FUNCTION__); + } + + DBG_GPIO_INFO("%s: GPIO(name=0x%x)(mode=%d)\n ", __FUNCTION__, GPIO_Pin->pin_name, + GPIO_Pin->pin_mode); + HAL_GPIO_MaskIrq_8195a(GPIO_Pin); + HAL_GPIO_Init_8195a(GPIO_Pin); +} + +/** + * @brief UnInitial GPIO Adapter + * + * + * @retval HAL_Status + */ +VOID +HAL_GPIO_IP_DeInit( + VOID +) +{ + if (_pHAL_Gpio_Adapter != NULL) { + InterruptDis(&_pHAL_Gpio_Adapter->IrqHandle); + HAL_GPIO_UnRegIrq_8195a(&_pHAL_Gpio_Adapter->IrqHandle); + _pHAL_Gpio_Adapter = NULL; + } + +} + +#endif // CONFIG_GPIO_EN diff --git a/lib/fwlib/src/hal_i2c.c b/lib/fwlib/src/hal_i2c.c new file mode 100644 index 0000000..3984c91 --- /dev/null +++ b/lib/fwlib/src/hal_i2c.c @@ -0,0 +1,2694 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include +#include "hal_i2c.h" + +//--------------------------------------------------------------------------------------------------- +//External functions +//--------------------------------------------------------------------------------------------------- +extern HAL_TIMER_OP HalTimerOp; + +#define I2C_STATIC_ALLOC 1 +/* I2C SAL global variables declaration when kernel disabled */ +#ifdef I2C_STATIC_ALLOC + HAL_I2C_OP HalI2COpSAL; +#endif + +#if I2C0_USED /*#if I2C0_USED*/ +#ifdef I2C_STATIC_ALLOC + SAL_I2C_MNGT_ADPT SalI2C0MngtAdpt; + + SAL_I2C_HND_PRIV SalI2C0HndPriv; + + HAL_I2C_INIT_DAT HalI2C0InitData; + + IRQ_HANDLE I2C0IrqHandleDat; + + HAL_GDMA_ADAPTER HalI2C0TxGdmaAdpt; + + HAL_GDMA_ADAPTER HalI2C0RxGdmaAdpt; + + HAL_GDMA_OP HalI2C0GdmaOp; + + IRQ_HANDLE I2C0TxGdmaIrqHandleDat; + + IRQ_HANDLE I2C0RxGdmaIrqHandleDat; + + SAL_I2C_USER_CB SalI2C0UserCB; + + SAL_I2C_USERCB_ADPT SalI2C0UserCBAdpt[SAL_USER_CB_NUM]; + + SAL_I2C_DMA_USER_DEF SalI2C0DmaUserDef; +#endif +#endif /*#if I2C0_USED*/ + +#if I2C1_USED /*#if I2C1_USED*/ +#ifdef I2C_STATIC_ALLOC + SAL_I2C_MNGT_ADPT SalI2C1MngtAdpt; + + SAL_I2C_HND_PRIV SalI2C1HndPriv; + + HAL_I2C_INIT_DAT HalI2C1InitData; + + IRQ_HANDLE I2C1IrqHandleDat; + + HAL_GDMA_ADAPTER HalI2C1TxGdmaAdpt; + + HAL_GDMA_ADAPTER HalI2C1RxGdmaAdpt; + + HAL_GDMA_OP HalI2C1GdmaOp; + + IRQ_HANDLE I2C1TxGdmaIrqHandleDat; + + IRQ_HANDLE I2C1RxGdmaIrqHandleDat; + + SAL_I2C_USER_CB SalI2C1UserCB; + + SAL_I2C_USERCB_ADPT SalI2C1UserCBAdpt[SAL_USER_CB_NUM]; + + SAL_I2C_DMA_USER_DEF SalI2C1DmaUserDef; +#endif +#endif /*#if I2C1_USED*/ + +#if I2C2_USED /*#if I2C2_USED*/ +#ifdef I2C_STATIC_ALLOC + + SAL_I2C_MNGT_ADPT SalI2C2MngtAdpt; + + SAL_I2C_HND_PRIV SalI2C2HndPriv; + + HAL_I2C_INIT_DAT HalI2C2InitData; + + IRQ_HANDLE I2C2IrqHandleDat; + + HAL_GDMA_ADAPTER HalI2C2TxGdmaAdpt; + + HAL_GDMA_ADAPTER HalI2C2RxGdmaAdpt; + + HAL_GDMA_OP HalI2C2GdmaOp; + + IRQ_HANDLE I2C2TxGdmaIrqHandleDat; + + IRQ_HANDLE I2C2RxGdmaIrqHandleDat; + + SAL_I2C_USER_CB SalI2C2UserCB; + + SAL_I2C_USERCB_ADPT SalI2C2UserCBAdpt[SAL_USER_CB_NUM]; + + SAL_I2C_DMA_USER_DEF SalI2C2DmaUserDef; +#endif +#endif /*#if I2C2_USED*/ + +#if I2C3_USED /*#if I2C3_USED*/ +#ifdef I2C_STATIC_ALLOC + + SAL_I2C_MNGT_ADPT SalI2C3MngtAdpt; + + SAL_I2C_HND_PRIV SalI2C3HndPriv; + + HAL_I2C_INIT_DAT HalI2C3InitData; + + IRQ_HANDLE I2C3IrqHandleDat; + + HAL_GDMA_ADAPTER HalI2C3TxGdmaAdpt; + + HAL_GDMA_ADAPTER HalI2C3RxGdmaAdpt; + + HAL_GDMA_OP HalI2C3GdmaOp; + + IRQ_HANDLE I2C3TxGdmaIrqHandleDat; + + IRQ_HANDLE I2C3RxGdmaIrqHandleDat; + + SAL_I2C_USER_CB SalI2C3UserCB; + + SAL_I2C_USERCB_ADPT SalI2C3UserCBAdpt[SAL_USER_CB_NUM]; + + SAL_I2C_DMA_USER_DEF SalI2C3DmaUserDef; +#endif +#endif /*#if I2C3_USED*/ + +/* Used only for A~C Version */ +#ifndef CONFIG_CHIP_E_CUT + + + +VOID +HalI2COpInit_Patch( + IN VOID *Data +) +{ + PHAL_I2C_OP pHalI2COp = (PHAL_I2C_OP) Data; + + pHalI2COp->HalI2CInit = HalI2CInit8195a_Patch; + DBG_I2C_INFO("HalOpInit->HalI2CInit:%x\n",pHalI2COp->HalI2CInit); + + pHalI2COp->HalI2CDeInit = HalI2CDeInit8195a; + DBG_I2C_INFO("HalOpInit->HalI2CDeInit:%x\n",pHalI2COp->HalI2CDeInit); + + pHalI2COp->HalI2CSend = HalI2CSendRtl8195a_Patch; + DBG_I2C_INFO("HalOpInit->HalI2CSend:%x\n",pHalI2COp->HalI2CSend); + + pHalI2COp->HalI2CReceive = HalI2CReceiveRtl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CReceive:%x\n",pHalI2COp->HalI2CReceive); + + pHalI2COp->HalI2CEnable = HalI2CEnableRtl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CEnable:%x\n",pHalI2COp->HalI2CEnable); + + pHalI2COp->HalI2CIntrCtrl = HalI2CIntrCtrl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CIntrCtrl:%x\n",pHalI2COp->HalI2CIntrCtrl); + + pHalI2COp->HalI2CReadReg = HalI2CReadRegRtl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CReadReg:%x\n",pHalI2COp->HalI2CReadReg); + + pHalI2COp->HalI2CWriteReg = HalI2CWriteRegRtl8195a; + DBG_I2C_INFO("pHalI2COp->HalI2CWriteReg:%x\n",pHalI2COp->HalI2CWriteReg); + + pHalI2COp->HalI2CSetCLK = HalI2CSetCLKRtl8195a_Patch; + DBG_I2C_INFO("HalOpInit->HalI2CSetCLK:%x\n",pHalI2COp->HalI2CSetCLK); + + pHalI2COp->HalI2CMassSend = HalI2CMassSendRtl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CMassSend:%x\n",pHalI2COp->HalI2CMassSend); + + pHalI2COp->HalI2CClrIntr = HalI2CClrIntrRtl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CClrIntr:%x\n",pHalI2COp->HalI2CClrIntr); + + pHalI2COp->HalI2CClrAllIntr = HalI2CClrAllIntrRtl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CClrAllIntr:%x\n",pHalI2COp->HalI2CClrAllIntr); + + pHalI2COp->HalI2CDMACtrl = HalI2CDMACtrl8195a; + DBG_I2C_INFO("HalOpInit->HalI2CDMACtrl:%x\n",pHalI2COp->HalI2CDMACtrl); +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// I2CISRHandle +// +// Description: +// I2C Interrupt Service Routine. +// According to the input pointer to SAL_I2C_HND, all the rest pointers will be +// found and be used to the rest part of this servie routine. +// The following types of interrupt will be taken care: +// - General Call (providing General Call Callback). Slave receives a general call. +// - STOP Bit (NOT providing General Call Callback) +// - START Bit (NOTproviding General Call Callback) +// - I2C Activity (NOTproviding General Call Callback) +// - RX Done (providing Error Callback). The slave transmitter does NOT +// receive a proper NACK for the end of whole transfer. +// - TX Abort (providing Error Call Callback). The Master/Slave +// transmitting is terminated. +// - RD Req (providing TX and TXC Callback). Slave gets a Read Request +// and starts a slave-transmitter operation. The slave transmit +// data will be written into slave TX FIFO from user data buffer. +// - TX Empty (providing TX and TXC Callback). Master TX FIFO is empty. +// The user transmit data will be written into master TX FIFO +// from user data buffer. +// - TX Over (providing Error Callback). Master TX FIFO is Overflow. +// - RX Full (providing RX and RXC Callback). Master/Slave RX FIFO contains +// data. And the received data will be put into Master/Slave user +// receive data buffer. +// - RX Over (providing Error Callback). Master/Slave RX FIFO is Overflow. +// - RX Under (providing Error Callback). Master/Slave RX FIFO is Underflow. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// NA +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//---------------------------------------------------------------------------------------------------- +VOID +I2CISRHandle_Patch( + IN VOID *Data +){ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + PSAL_I2C_HND_PRIV pSalI2CHNDPriv = NULL; + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PHAL_I2C_INIT_DAT pHalI2CInitDat = NULL; + PHAL_I2C_OP pHalI2COP = NULL; + PSAL_I2C_USER_CB pSalI2CUserCB = NULL; + u32 I2CLocalTemp = 0; + u32 I2CInTOTcnt = 0; + u32 I2CIrqIdx = 0; + u32 InTimeoutCount = 0; + u32 InStartCount = 0; + volatile u32 I2CLocalRawSts = 0; + + + /* To get the SAL_I2C_MNGT_ADPT pointer, and parse the rest pointers */ + pSalI2CHNDPriv = CONTAINER_OF(pSalI2CHND, SAL_I2C_HND_PRIV, SalI2CHndPriv); + pSalI2CMngtAdpt = CONTAINER_OF(pSalI2CHNDPriv->ppSalI2CHnd, SAL_I2C_MNGT_ADPT, pSalHndPriv); + pHalI2CInitDat = pSalI2CMngtAdpt->pHalInitDat; + pHalI2COP = pSalI2CMngtAdpt->pHalOp; + I2CInTOTcnt = pSalI2CMngtAdpt->InnerTimeOut; + I2CIrqIdx = pHalI2CInitDat->I2CIdx; + pSalI2CUserCB = pSalI2CHND->pUserCB; + //DBG_8195A("NEW ISR\n"); + /* I2C General Call Intr*/ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_GEN_CALL(1)) { + + DBG_I2C_WARN("I2C%d INTR_GEN_CALL\n",I2CIrqIdx); + + /* Clear I2C interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_GEN_CALL; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + + /* Invoke I2C General Call callback if available*/ + if (pSalI2CUserCB->pGENCALLCB->USERCB != NULL) { + pSalI2CUserCB->pGENCALLCB->USERCB((void *)pSalI2CUserCB->pGENCALLCB->USERData); + } + } + + /* I2C START DET Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_START_DET(1)) { + + DBG_I2C_WARN("I2C%d INTR_START_DET\n",I2CIrqIdx); + + /* Clear I2C interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_START_DET; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + } + + /* I2C STOP DET Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_STOP_DET(1)) { + + DBG_I2C_WARN("I2C%d INTR_STOP_DET\n",I2CIrqIdx); + + /* Clear I2C interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_STOP_DET; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + } + + /* I2C Activity Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_ACTIVITY(1)) { + + DBG_I2C_WARN("I2C%d INTR_ACTIVITY\n",I2CIrqIdx); + + /* Clear I2C interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_ACTIVITY; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + } + + /* I2C RX Done Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_RX_DONE(1)) { + //DBG_8195A("rxdone\n"); + DBG_I2C_ERR("I2C%d INTR_RX_DONE\n",I2CIrqIdx); + DBG_I2C_ERR("I2C%d IC_TXFLR:%2x\n",I2CIrqIdx, + pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_TXFLR)); + + /* Clear I2C interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_RX_DONE; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_ERROR; + + /* Update I2C error type */ + pSalI2CHND->ErrType |= I2C_ERR_SLV_TX_NACK; + + /* Invoke I2C error callback if available */ + if (pSalI2CUserCB->pERRCB->USERCB != NULL) + pSalI2CUserCB->pERRCB->USERCB((void *)pSalI2CUserCB->pERRCB->USERData); + } + + /* I2C TX Abort Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_TX_ABRT(1)) { + //DBG_8195A("abort\n"); + DBG_I2C_ERR("!!!I2C%d INTR_TX_ABRT!!!\n",I2CIrqIdx); + DBG_I2C_ERR("I2C%d IC_TX_ABRT_SOURCE[%2x]: %x\n", I2CIrqIdx, REG_DW_I2C_IC_TX_ABRT_SOURCE, + pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_TX_ABRT_SOURCE)); + DBG_I2C_ERR("Dev Sts:%x\n",pSalI2CHND->DevSts); + DBG_I2C_ERR("rx len:%x\n",pSalI2CHND->pRXBuf->DataLen); + DBG_I2C_ERR("tx len:%x\n",pSalI2CHND->pTXBuf->DataLen); + DBG_I2C_ERR("raw sts:%x\n",pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT)); + DBG_I2C_ERR("ic sts:%x\n",pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS)); + /* Clear I2C Interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_ABRT; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + I2CLocalTemp = pSalI2CHND->DevSts; + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_ERROR; + + /* Update I2C error type */ + pSalI2CHND->ErrType |= I2C_ERR_TX_ABRT; + + /* Invoke I2C error callback */ + if (pSalI2CUserCB->pERRCB->USERCB != NULL) + pSalI2CUserCB->pERRCB->USERCB((void *)pSalI2CUserCB->pERRCB->USERData); + + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_RTY) { + if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE) { + if ((I2CLocalTemp == I2C_STS_RX_READY) || (I2CLocalTemp == I2C_STS_RX_ING)) { + /* Clear Abort source */ + pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_CLR_TX_ABRT); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_RX_ING; + + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & BIT_IC_STATUS_TFNF) { + if (pSalI2CMngtAdpt->MstRDCmdCnt > 0) { + pHalI2CInitDat->I2CCmd = I2C_READ_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pRXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + if ((pSalI2CMngtAdpt->MstRDCmdCnt == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)) + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + //DBG_8195A("A0\n"); + pSalI2CMngtAdpt->MstRDCmdCnt--; + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + } + + } + } + else if ((I2CLocalTemp == I2C_STS_TX_READY) || (I2CLocalTemp == I2C_STS_TX_ING)){ + /* Clear Abort source */ + pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_CLR_TX_ABRT); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_TX_ING; + + /* Return to the former transfer status */ + pSalI2CHND->pTXBuf->pDataBuf--; + pSalI2CHND->pTXBuf->DataLen++; + + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & BIT_IC_STATUS_TFNF) { + pHalI2CInitDat->I2CCmd = I2C_WRITE_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pTXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + if ((pSalI2CHND->pTXBuf->DataLen == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)) + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + + pSalI2CHND->pTXBuf->pDataBuf++; + pSalI2CHND->pTXBuf->DataLen--; + } + } + } + } + } + + /* I2C RD REQ Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_RD_REQ(1)) { + /* Confirm it's slave mode */ + if (pSalI2CHND->I2CMaster == I2C_SLAVE_MODE) { + //DBG_8195A("rq\n"); + if (pSalI2CHND->pTXBuf->DataLen>0) { + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_TX_ING; + + /* Invoke I2C TX callback if available */ + if (pSalI2CUserCB->pTXCB->USERCB != NULL) + pSalI2CUserCB->pTXCB->USERCB((void *)pSalI2CUserCB->pTXCB->USERData); + + /* I2C Slave transmits data to Master. If the TX FIFO is NOT full, + write one byte from slave TX buffer to TX FIFO. */ + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_TFNF)) == BIT_IC_STATUS_TFNF) { + pHalI2CInitDat->I2CCmd = I2C_WRITE_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pTXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + if ((pSalI2CHND->pTXBuf->DataLen == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)) + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + + pSalI2CHND->pTXBuf->pDataBuf++; + pSalI2CHND->pTXBuf->DataLen--; + } + } + + /* To clear Read Request Intr */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_RD_REQ; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + + /* To check I2C slave TX data length. If all the data are transmitted, + mask all the interrupts and invoke the user callback */ + if (!pSalI2CHND->pTXBuf->DataLen) { + /* This is a software patch */ + pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_RAW_INTR_STAT); + HalDelayUs(1000); + + /* Disable I2C TX Related Interrupts */ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp &= ~(BIT_IC_INTR_MASK_M_TX_ABRT | + BIT_IC_INTR_MASK_M_TX_OVER | + BIT_IC_INTR_MASK_M_RX_DONE | + BIT_IC_INTR_MASK_M_RD_REQ); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + pHalI2COP->HalI2CClrAllIntr(pHalI2CInitDat); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + + /* Invoke I2C TX complete callback if available */ + if (pSalI2CUserCB->pTXCCB->USERCB != NULL) + pSalI2CUserCB->pTXCCB->USERCB((void *)pSalI2CUserCB->pTXCCB->USERData); + } + } + } + + /* I2C TX Empty Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_TX_EMPTY(1)) { + /* Confirm it's master mode */ + if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE) { + + /* To check I2C master TX data length. If all the data are transmitted, + mask all the interrupts and invoke the user callback */ + if (!pSalI2CHND->pTXBuf->DataLen) { + /* I2C Disable TX Related Interrupts */ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp &= ~(BIT_IC_INTR_MASK_M_TX_ABRT | + BIT_IC_INTR_MASK_M_TX_EMPTY | + BIT_IC_INTR_MASK_M_TX_OVER); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + + /* Clear all I2C pending interrupts */ + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + + /* Invoke I2C TX Complete callback */ + if (pSalI2CUserCB->pTXCCB->USERCB != NULL) + pSalI2CUserCB->pTXCCB->USERCB((void *)pSalI2CUserCB->pTXCCB->USERData); + } + + if (pSalI2CHND->pTXBuf->DataLen > 0) { + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_TX_ING; + + /* Invoke I2C TX callback if available */ + if (pSalI2CUserCB->pTXCB->USERCB != NULL) + pSalI2CUserCB->pTXCB->USERCB((void *)pSalI2CUserCB->pTXCB->USERData); + + /* Check I2C TX FIFO status. If it's not full, one byte data will be written into it. */ + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_TFNF)) == BIT_IC_STATUS_TFNF) { + pHalI2CInitDat->I2CCmd = I2C_WRITE_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pTXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + pHalI2CInitDat->I2CReSTR = 1; + if ((pSalI2CHND->pTXBuf->DataLen == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)) + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + + pSalI2CHND->pTXBuf->pDataBuf++; + pSalI2CHND->pTXBuf->DataLen--; + + } + } + }/*if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE)*/ + } + + /* I2C TX Over Run Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_TX_OVER(1)) { + + DBG_I2C_ERR("!!!I2C%d INTR_TX_OVER!!!\n",I2CIrqIdx); + + /* Clear I2C interrupt */ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_OVER; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_ERROR; + + /* Update I2C error type */ + pSalI2CHND->ErrType |= I2C_ERR_TX_OVER; + + /* Invoke I2C error callback if available */ + if (pSalI2CUserCB->pERRCB->USERCB != NULL) + pSalI2CUserCB->pERRCB->USERCB((void *)pSalI2CUserCB->pERRCB->USERData); + } + + /* I2C RX Full Intr */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_RX_FULL(1)) { + /* Check if it's Master */ + if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE){ + + //DBG_8195A("full\n"); + /* Check if the receive transfer is NOT finished. If it is not, check if there + is data in the RX FIFO and move the data from RX FIFO to user data buffer*/ + if (pSalI2CHND->pRXBuf->DataLen > 0) { + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_RX_ING; + + /* Invoke I2C RX callback if available */ + if (pSalI2CUserCB->pRXCB->USERCB != NULL) + pSalI2CUserCB->pRXCB->USERCB((void *)pSalI2CUserCB->pRXCB->USERData); + + I2CInTOTcnt = (u32)pSalI2CMngtAdpt->InnerTimeOut; + InTimeoutCount = 0; + /* Calculate internal time out parameters */ + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + while (1) { + I2CLocalRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + if ((I2CLocalRawSts & (BIT_IC_STATUS_RFNE | BIT_IC_STATUS_RFF)) != 0) { + *(pSalI2CHND->pRXBuf->pDataBuf) = + pHalI2COP->HalI2CReceive(pHalI2CInitDat); + //DBG_8195A("rx:%x\n",*(pSalI2CHND->pRXBuf->pDataBuf)); + pSalI2CHND->pRXBuf->pDataBuf++; + pSalI2CHND->pRXBuf->DataLen--; + + if ((pSalI2CHND->pRXBuf->DataLen) == 0) + break; + } + else if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT) + & (BIT_IC_RAW_INTR_STAT_RX_OVER | BIT_IC_RAW_INTR_STAT_RX_UNDER)) != 0) { + break; + } + else { + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) & BIT_IC_STATUS_RFNE) + == 0){ + break; + } + } + + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_FF_TO; + DBG_I2C_ERR("RX Full Timeout, I2C%2x,1\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + break; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_FF_TO; + DBG_I2C_ERR("RX Full Timeout, I2C%2x,2\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + break; + } + } + } + } + + /* To check I2C master RX data length. If all the data are received, + mask all the interrupts and invoke the user callback. + Otherwise, the master should send another Read Command to slave for + the next data byte receiving. */ + if (!pSalI2CHND->pRXBuf->DataLen) { + /* I2C Disable RX Related Interrupts */ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp &= ~(BIT_IC_INTR_MASK_M_RX_FULL | + BIT_IC_INTR_MASK_M_RX_OVER | + BIT_IC_INTR_MASK_M_RX_UNDER| + BIT_IC_INTR_MASK_M_TX_ABRT); + + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + + /* Clear all I2C pending interrupts */ + pHalI2COP->HalI2CClrAllIntr(pHalI2CInitDat); + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + + /* Invoke I2C RX complete callback if available */ + if (pSalI2CUserCB->pRXCCB->USERCB != NULL) + pSalI2CUserCB->pRXCCB->USERCB((void *)pSalI2CUserCB->pRXCCB->USERData); + } + else { + /* If TX FIFO is not full, another Read Command is written into it. */ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & BIT_IC_STATUS_TFNF) { + if (pSalI2CMngtAdpt->MstRDCmdCnt > 0) { + pHalI2CInitDat->I2CCmd = I2C_READ_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pRXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + pHalI2CInitDat->I2CReSTR = 1; + if ((pSalI2CMngtAdpt->MstRDCmdCnt == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)){ + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + } + pSalI2CMngtAdpt->MstRDCmdCnt--; + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + } + } + } + + }/*(pSalI2CHND->I2CMaster == I2C_MASTER_MODE)*/ + else{ + /* To check I2C master RX data length. If all the data are received, + mask all the interrupts and invoke the user callback. + Otherwise, if there is data in the RX FIFO and move the data from RX + FIFO to user data buffer*/ + if (pSalI2CHND->pRXBuf->DataLen > 0){ + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_RX_ING; + + /* Invoke I2C RX callback if available */ + if (pSalI2CUserCB->pRXCB->USERCB != NULL) + pSalI2CUserCB->pRXCB->USERCB((void *)pSalI2CUserCB->pRXCB->USERData); + + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_RFNE | BIT_IC_STATUS_RFF)) != 0) { + *(pSalI2CHND->pRXBuf->pDataBuf) = + pHalI2COP->HalI2CReceive(pHalI2CInitDat); + pSalI2CHND->pRXBuf->pDataBuf++; + pSalI2CHND->pRXBuf->DataLen--; + } + } + + /* All data are received. Mask all related interrupts. */ + if (!pSalI2CHND->pRXBuf->DataLen){ + /*I2C Disable RX Related Interrupts*/ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp &= ~(BIT_IC_INTR_MASK_M_RX_FULL | + BIT_IC_INTR_MASK_M_RX_OVER | + BIT_IC_INTR_MASK_M_RX_UNDER); + + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + + /* Invoke I2C RX complete callback if available */ + if (pSalI2CUserCB->pRXCCB->USERCB != NULL) + pSalI2CUserCB->pRXCCB->USERCB((void *)pSalI2CUserCB->pRXCCB->USERData); + } + } + } + + /*I2C RX Over Run Intr*/ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_RX_OVER(1)) { + + DBG_I2C_ERR("I2C%d INTR_RX_OVER\n",I2CIrqIdx); + + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_RX_OVER; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_ERROR; + + /* Update I2C error type */ + pSalI2CHND->ErrType |= I2C_ERR_RX_OVER; + + /* Invoke I2C error callback if available */ + if (pSalI2CUserCB->pERRCB->USERCB != NULL) + pSalI2CUserCB->pERRCB->USERCB((void *)pSalI2CUserCB->pERRCB->USERData); + } + + /*I2C RX Under Run Intr*/ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_INTR_STAT) & + BIT_CTRL_IC_INTR_STAT_R_RX_UNDER(1)) { + + DBG_I2C_ERR("!!!I2C%d INTR_RX_UNDER!!!\n",I2CIrqIdx); + + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_RX_UNDER; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + + /* Update I2C device status */ + pSalI2CHND->DevSts = I2C_STS_ERROR; + + /* Update I2C error type */ + pSalI2CHND->ErrType |= I2C_ERR_RX_UNDER; + + /* Invoke I2C error callback if available */ + if (pSalI2CUserCB->pERRCB->USERCB != NULL) + pSalI2CUserCB->pERRCB->USERCB((void *)pSalI2CUserCB->pERRCB->USERData); + } +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CSend +// +// Description: +// To execute Master-Transmitter and Slave-Transmitter operation. +// There are 3 operation mode in this function which are separated by compile-time +// flag. +// For Master-Transmitter, the User Register Address flag is checked first. +// User Register Address may be sent before any formal transfer, no matter in +// Poll-, Intr- or DMA- Mode. +// +// In Poll-Mode, no matter it's master or slave mode, the transfer will be done in +// this function by checking the transfer length. +// -Master in Poll-Mode: +// a. Send the User Register Address if needed. +// b. Check if all the data are transmitted. If it's NOT, checking the TX FIFO +// status is done for writing data from user TX buffer to I2C TX FIFO when +// TX FIFO is NOT full. +// TX data length decrements one after writing one byte into TX FIFO. +// c. b is executed circularly till the TX buffer data length is zero. +// +// -Slave in Poll-Mode: +// Slave could send data only when it received a Read Commmand matched +// with its own I2C address from other I2C master. Once a slave correctly +// received a Read Command matched with its own addr., a Read-Request +// flag is set at the same time. +// In this Poll-Mode, the slave checks the Read-Request flag to decide +// if it could send its TX buffer data. +// a. Check if the Read-Request flag is set or not. If the flag is set, it should +// check if TX buffer data length is zero. If it's NOT, +// the I2C TX FIFO status will be checked for the following operation. +// b. If the TX FIFO is NOT empty, slave will write one byte data from TX data +// buffer to TX FIFO. +// c. a and b are executed circularly till the TX buffer data length is zero. +//---------------------------------------------------------------------- +// In Intr-Mode, this function is used to unmask the realted I2C interrupt for +// the following interrupt operations. +// -Master in Intr-Mode: +// a. Send the User Register Address if needed. +// b. Unmask the TX-Empty and realted error interrupts. +// +// -Slave in Intr-Mode: +// a. Unmask the RD-Req and realted error interrupts. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C send process. +// _EXIT_SUCCESS if the RtkI2CSend succeeded. +// _EXIT_FAILURE if the RtkI2CSend failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CSend_Patch( + IN VOID *Data +){ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + PSAL_I2C_HND_PRIV pSalI2CHNDPriv = NULL; + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PHAL_I2C_INIT_DAT pHalI2CInitDat = NULL; + PHAL_I2C_OP pHalI2COP = NULL; + + PHAL_GDMA_ADAPTER pHalI2CTxGdmaAdpt = NULL; + PHAL_GDMA_OP pHalI2CGdmaOp = NULL; + + u32 I2CLocalTemp = 0; + u32 I2CInTOTcnt = 0; + u32 InTimeoutCount = 0; + u32 InStartCount = 0; + u32 I2CChkRawSts = 0; + u32 I2CChkRawSts2 = 0; + u32 I2CDataLenBak = 0; + u32 I2CDataPtrBak = 0; + u32 I2CInTOTcntIntr = 0; + u32 InTimeoutCountIntr = 0; + u32 InStartCountIntr = 0; + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalI2CHNDPriv = CONTAINER_OF(pSalI2CHND, SAL_I2C_HND_PRIV, SalI2CHndPriv); + pSalI2CMngtAdpt = CONTAINER_OF(pSalI2CHNDPriv->ppSalI2CHnd, SAL_I2C_MNGT_ADPT, pSalHndPriv); + + + + pHalI2CInitDat = pSalI2CMngtAdpt->pHalInitDat; + + pHalI2COP = pSalI2CMngtAdpt->pHalOp; + + + pHalI2CTxGdmaAdpt = pSalI2CMngtAdpt->pHalTxGdmaAdp; + pHalI2CGdmaOp = pSalI2CMngtAdpt->pHalGdmaOp; + + /* Check if it's Master Mode */ + if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE) { + //DBG_8195A("m\n"); + /* Master run-time update target address */ + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_UPD) { + + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Check Master activity status */ + while ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS)) & BIT_IC_STATUS_MST_ACTIVITY) { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_ADD_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,1\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_ADD_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,2\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Check TX FIFO status */ + while (!((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS)) & BIT_IC_STATUS_TFE)) { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_ADD_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,3\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_ADD_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,4\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + + I2CLocalTemp = 0; + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_TAR); + I2CLocalTemp &= (~BIT_MASK_IC_TAR); + I2CLocalTemp |= BIT_CTRL_IC_TAR(pSalI2CHND->pTXBuf->TargetAddr); + /* Update Master Target address */ + pHalI2COP->HalI2CWriteReg(pHalI2CInitDat, REG_DW_I2C_IC_TAR, I2CLocalTemp); + } + + RtkI2CSendUserAddr(pSalI2CHND, 0); + + /* #if I2C_POLL_OP_TYPE */ + if (pSalI2CHND->OpType == I2C_POLL_TYPE) { /* if (pSalI2CHND->OpType == I2C_POLL_TYPE) */ + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_TX_READY; + + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Send data till the TX buffer data length is zero */ + for (;pSalI2CHND->pTXBuf->DataLen>0;) { + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_TX_ING; + + /* Check I2C TX FIFO status */ + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_TFNF)) == BIT_IC_STATUS_TFNF) { + /* Wrtie data into I2C TX FIFO */ + pHalI2CInitDat->I2CCmd = I2C_WRITE_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pTXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + if ((pSalI2CHND->pTXBuf->DataLen == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)) + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + + pSalI2CHND->pTXBuf->pDataBuf++; + pSalI2CHND->pTXBuf->DataLen--; + } + else { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_CMD_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,5\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_CMD_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,6\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_RTY) { + HalDelayUs(((1000*30)/pHalI2CInitDat->I2CClk)); //the 10 is for ten bit time + + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT) & + BIT_IC_RAW_INTR_STAT_TX_ABRT) { + pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_CLR_TX_ABRT); + pSalI2CHND->pTXBuf->pDataBuf--; + pSalI2CHND->pTXBuf->DataLen++; + } + } + } + + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CMngtAdpt->InnerTimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + /* I2C Wait TX FIFO Empty */ + while (1) { + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_TFE | BIT_IC_STATUS_TFNF)) == + (BIT_IC_STATUS_TFE | BIT_IC_STATUS_TFNF)){ + break; + } + else { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,7\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,8\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + } + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + }/* if (pSalI2CHND->OpType == I2C_POLL_TYPE) */ + /* #if I2C_POLL_OP_TYPE */ + +#if I2C_INTR_OP_TYPE + if (pSalI2CHND->OpType == I2C_INTR_TYPE) { /* if (pSalI2CHND->OpType == I2C_INTR_TYPE) */ + /* Calculate user time out parameters */ + InTimeoutCount = 0; + InStartCount = 0; + I2CInTOTcnt = pSalI2CHND->TimeOut; + + InTimeoutCountIntr = 0; + InStartCountIntr = 0; + I2CInTOTcntIntr = pSalI2CHND->AddRtyTimeOut; + + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + InTimeoutCountIntr = (I2CInTOTcntIntr*1000/TIMER_TICK_US); + InStartCountIntr = HalTimerOp.HalTimerReadCount(1); + + + I2CDataLenBak = (u32)(pSalI2CHND->pTXBuf->DataLen); + I2CDataPtrBak = (u32)(pSalI2CHND->pTXBuf->pDataBuf); + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_ABRT; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2COP->HalI2CClrAllIntr(pHalI2CInitDat); + + /* Send data till the TX buffer data length is zero */ + for (;;) { +SEND_I2C_WR_CMD_INTR: + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_TX_ING; + + /* Check I2C TX FIFO status */ + /* Fill TX FIFO only when it's completely empty */ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + if ((I2CChkRawSts & BIT_IC_STATUS_TFE) == BIT_IC_STATUS_TFE) { + if (pSalI2CHND->pTXBuf->DataLen > 0) { + /* Wrtie data into I2C TX FIFO */ + pHalI2CInitDat->I2CCmd = I2C_WRITE_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pTXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + + if ((pSalI2CHND->pTXBuf->DataLen == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)) + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + + pSalI2CHND->pTXBuf->pDataBuf++; + pSalI2CHND->pTXBuf->DataLen--; + } + } + + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_RTY) { + u32 I2CInTOTcntRty = 0; + u32 InTimeoutCountRty = 0; + u32 InStartCountRty = 0; + + /* SEND_I2C_WR_CMD_INTR Time-Out check */ + if (InTimeoutCountIntr > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCountIntr, InTimeoutCountIntr)) { + /* Reset the data count before status return */ + pSalI2CHND->pTXBuf->pDataBuf--; + pSalI2CHND->pTXBuf->DataLen++; + return HAL_TIMEOUT; + } + } + + /* Calculate user master retry local time out parameters */ + InTimeoutCountRty = 0; + InStartCountRty = 0; + I2CInTOTcntRty = pSalI2CHND->TimeOut; + + if ((I2CInTOTcntRty != 0) && (I2CInTOTcntRty!= I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCountRty= (I2CInTOTcntRty*1000/TIMER_TICK_US); + InStartCountRty= HalTimerOp.HalTimerReadCount(1); + } + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + while ((I2CChkRawSts & BIT_IC_STATUS_TFE) == 0) { + I2CChkRawSts2 = pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT); + if ((I2CChkRawSts2 & BIT_IC_RAW_INTR_STAT_TX_ABRT) != 0){ + break; + } + + /* Time-Out check */ + if (InTimeoutCountRty > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCountRty, InTimeoutCountRty)) { + break; + } + } + else { + if (I2CInTOTcntRty == 0) { + break; + } + } + + /* Read I2C IC status again */ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + } + + HalDelayUs((u32)((1000*30)/pHalI2CInitDat->I2CClk)); //the 10 is for ten bit time + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT); + if (I2CChkRawSts & BIT_IC_RAW_INTR_STAT_TX_ABRT) { + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + + pSalI2CHND->DevSts = I2C_STS_TX_READY; + pSalI2CHND->ErrType = 0; + pSalI2CHND->pTXBuf->DataLen = (u16)I2CDataLenBak; + pSalI2CHND->pTXBuf->pDataBuf= (u8*)I2CDataPtrBak; + /* Calculate user time out parameters */ + InTimeoutCount = 0; + InStartCount = 0; + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + goto SEND_I2C_WR_CMD_INTR; + + } + else if (((u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) & BIT_IC_STATUS_TFE) != BIT_IC_STATUS_TFE) { + { + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + + pSalI2CHND->DevSts = I2C_STS_TX_READY; + pSalI2CHND->ErrType = 0; + pSalI2CHND->pTXBuf->DataLen = (u16)I2CDataLenBak; + pSalI2CHND->pTXBuf->pDataBuf= (u8 *)I2CDataPtrBak; + /* Calculate user time out parameters */ + InTimeoutCount = 0; + InStartCount = 0; + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + goto SEND_I2C_WR_CMD_INTR; + } + } + else { + /* I2C Enable TX Related Interrupts */ + I2CLocalTemp = 0; + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_TX_ABRT | + BIT_IC_INTR_MASK_M_TX_EMPTY | + BIT_IC_INTR_MASK_M_TX_OVER); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + + break; + } + } + else { + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + while ((I2CChkRawSts & BIT_IC_STATUS_TFE) == 0) { + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + } + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + if (I2CChkRawSts & BIT_IC_STATUS_TFE) { + /* I2C Enable TX Related Interrupts */ + I2CLocalTemp = 0; + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_TX_ABRT | + BIT_IC_INTR_MASK_M_TX_EMPTY | + BIT_IC_INTR_MASK_M_TX_OVER); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + break; + } + } + + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + //DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,7\n",pSalI2CHND->DevNum); + //DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + return HAL_TIMEOUT; + } + } + } + } /* if (pSalI2CHND->OpType == I2C_INTR_TYPE) */ +#endif + + /* if (pSalI2CHND->OpType == I2C_DMA_TYPE) */ + if (pSalI2CHND->OpType == I2C_DMA_TYPE) { + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_TX_READY; + + /* I2C Enable TX Related Interrupts */ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_TX_ABRT | + BIT_IC_INTR_MASK_M_TX_OVER); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + + //HalGdmaOpInit(pHalI2CGdmaOp); + pSalI2CMngtAdpt->pHalGdmaOpInit(pHalI2CGdmaOp); + pHalI2CTxGdmaAdpt->GdmaCtl.BlockSize = pSalI2CHND->pTXBuf->DataLen; + pHalI2CTxGdmaAdpt->ChSar = (u32)pSalI2CHND->pTXBuf->pDataBuf; + pHalI2CTxGdmaAdpt->ChDar = (u32)(I2C0_REG_BASE+REG_DW_I2C_IC_DATA_CMD+ + pSalI2CHND->DevNum*0x400); + pHalI2CGdmaOp->HalGdmaChSeting(pHalI2CTxGdmaAdpt); + pHalI2CGdmaOp->HalGdmaChEn(pHalI2CTxGdmaAdpt); + pSalI2CHND->DevSts = I2C_STS_TX_ING; + pHalI2CInitDat->I2CDMACtrl = BIT_CTRL_IC_DMA_CR_TDMAE(1); + pHalI2COP->HalI2CDMACtrl(pHalI2CInitDat); + + } + /* if (pSalI2CHND->OpType == I2C_DMA_TYPE) */ + + }/* if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE) */ + else{ + /* #if I2C_POLL_OP_TYPE */ + if (pSalI2CHND->OpType == I2C_POLL_TYPE) { + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_TX_READY; + + /* Send data till the TX buffer data length is zero */ + for (;pSalI2CHND->pTXBuf->DataLen>0;) { + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_TX_ING; + + /* Check I2C RD Request flag */ + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_RAW_INTR_STAT)) + & BIT_IC_RAW_INTR_STAT_RD_REQ) { + + /* Check I2C TX FIFO status */ + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_TFNF)) == BIT_IC_STATUS_TFNF) { + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pTXBuf->pDataBuf; + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_RD_REQ; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pSalI2CHND->pTXBuf->pDataBuf++; + pSalI2CHND->pTXBuf->DataLen--; + } + } + else { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,9\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + DBG_I2C_ERR("RtkI2CSend Timeout, I2C%2x,10\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + } + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + } + /* #if I2C_POLL_OP_TYPE */ + + /* #if I2C_INTR_OP_TYPE */ + if (pSalI2CHND->OpType == I2C_INTR_TYPE) { + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_ABRT; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_OVER; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_RD_REQ; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_ACTIVITY; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2COP->HalI2CClrAllIntr(pHalI2CInitDat); + pSalI2CHND->DevSts = I2C_STS_TX_READY; + + /* I2C Enable TX Related Interrupts. In Slave-Transmitter, the below + interrupts should be enabled. */ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_TX_ABRT | + BIT_IC_INTR_MASK_M_TX_OVER | + BIT_IC_INTR_MASK_M_RX_DONE | + BIT_IC_INTR_MASK_M_RD_REQ); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + } + /* #if I2C_INTR_OP_TYPE */ + + /* #if I2C_DMA_OP_TYPE */ + ; + /* #if I2C_DMA_OP_TYPE */ + } + + return HAL_OK; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CReceive +// +// Description: +// To execute Master-Receiver and Slave-Receiver operation. +// There are 3 operation mode in this function which are separated by compile-time +// flag. +// For Master-Receiver, the User Register Address flag is checked first. +// User Register Address may be sent before any formal transfer, no matter in +// Poll-, Intr- or DMA- Mode. +// +// For Master-Receiver, the I2C master have to send a Read Command for receiving +// one byte from the other I2C slave. +// +// In Poll-Mode, no matter it's master or slave mode, the transfer will be done in +// this function by checking the transfer length. +// -Master in Poll-Mode: +// a. Send the User Register Address if needed. +// b. Check if all the data are received. If it's NOT, checking the TX FIFO +// status will be done. If the TX FIFO it's full, a Read Command will be +// wirtten into the TX FIFO. +// c. After b, the I2C master contineously polls the RX FIFO status to see +// if there is a received data. If it received one, it will move the data from +// I2C RX FIFO into user RX data buffer. +// d. b and c are executed circularly till the RX buffer data length is zero. +// +// -Slave in Poll-Mode: +// a. Check if all the data are received. +// b. The I2C slave contineously polls the RX FIFO status to see +// if there is a received data. If it received one, it will move the data from +// I2C RX FIFO into user RX data buffer. +// c. a and b are executed circularly till the RX buffer data length is zero. +// +//---------------------------------------------------------------------- +// In Intr-Mode, this function is used to unmask the realted I2C interrupt for +// the following interrupt operations. +// -Master in Intr-Mode: +// a. Send the User Register Address if needed. +// b. Unmask the RX-Full and realted error interrupts. +// c. Write one or two Read Command into master TX FIFO for requesting +// another slave providing data. +// +// -Slave in Intr-Mode: +// a. Unmask the RX-Full and realted error interrupts. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C receive process. +// _EXIT_SUCCESS if the RtkI2CReceive succeeded. +// _EXIT_FAILURE if the RtkI2CReceive failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CReceive_Patch( + IN VOID *Data +){ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + PSAL_I2C_HND_PRIV pSalI2CHNDPriv = NULL; + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PHAL_I2C_INIT_DAT pHalI2CInitDat = NULL; + PHAL_I2C_OP pHalI2COP = NULL; +#if I2C_DMA_OP_TYPE + PHAL_GDMA_ADAPTER pHalI2CRxGdmaAdpt = NULL; + PHAL_GDMA_OP pHalI2CGdmaOp = NULL; +#endif + + u32 I2CLocalTemp = 0; + u32 I2CInTOTcnt = 0; + u32 InTimeoutCount = 0; + u32 InStartCount = 0; + u32 I2CLocalLen = 0; + u32 I2CChkRawSts = 0; + u32 I2CChkRawSts2 = 0; + u32 I2CDataLenBak = 0; + u32 I2CDataPtrBak = 0; + u32 I2CInTOTcntRty = 0; + u32 InTimeoutCountRty = 0; + u32 InStartCountRty = 0; + u32 I2CInTOTcntIntr = 0; + u32 InTimeoutCountIntr = 0; + u32 InStartCountIntr = 0; + + /*To Get the SAL_I2C_MNGT_ADPT Pointer*/ + pSalI2CHNDPriv = CONTAINER_OF(pSalI2CHND, SAL_I2C_HND_PRIV, SalI2CHndPriv); + pSalI2CMngtAdpt = CONTAINER_OF(pSalI2CHNDPriv->ppSalI2CHnd, SAL_I2C_MNGT_ADPT, pSalHndPriv); + pHalI2CInitDat = pSalI2CMngtAdpt->pHalInitDat; + pHalI2COP = pSalI2CMngtAdpt->pHalOp; +#if I2C_DMA_OP_TYPE + pHalI2CRxGdmaAdpt = pSalI2CMngtAdpt->pHalRxGdmaAdp; + pHalI2CGdmaOp = pSalI2CMngtAdpt->pHalGdmaOp; +#endif + + if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE)/*if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE)*/ + { + /* Master run-time update target address */ + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_UPD) { + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Check Master activity status */ + while ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS)) & BIT_IC_STATUS_MST_ACTIVITY) { + pHalI2COP->HalI2CClrAllIntr(pHalI2CInitDat); + //DBG_8195A("~\n"); + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_ADD_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,1\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_ADD_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,2\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Check TX FIFO status */ + while (!((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS)) & BIT_IC_STATUS_TFE)) { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_ADD_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,3\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_ADD_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,4\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_TAR); + I2CLocalTemp &= (~BIT_MASK_IC_TAR); + I2CLocalTemp |= BIT_CTRL_IC_TAR(pSalI2CHND->pRXBuf->TargetAddr); + /* Update Master Target address */ + pHalI2COP->HalI2CWriteReg(pHalI2CInitDat, REG_DW_I2C_IC_TAR, I2CLocalTemp); + } + + +#if I2C_USER_REG_ADDR /*I2C_USER_REG_ADDR*/ + RtkI2CSendUserAddr(pSalI2CHND, 1); +#endif /*I2C_USER_REG_ADDR*/ + +#if I2C_POLL_OP_TYPE/*I2C_POLL_OP_TYPE*/ + if (pSalI2CHND->OpType == I2C_POLL_TYPE) + { + //DBG_8195A("p\n"); + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_RX_READY; + + pSalI2CMngtAdpt->MstRDCmdCnt = pSalI2CHND->pRXBuf->DataLen; + I2CLocalTemp = pSalI2CHND->pRXBuf->DataLen; + + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Receive data till the RX buffer data length is zero */ + for ( ;pSalI2CHND->pRXBuf->DataLen>0; ) { +SEND_I2C_RD_CMD: + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_RX_ING; + /* Check I2C TX FIFO status. If it's NOT full, a Read command is written + into the TX FIFO.*/ + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & BIT_IC_STATUS_TFNF) { + if (pSalI2CMngtAdpt->MstRDCmdCnt > 0) { + pHalI2CInitDat->I2CCmd = I2C_READ_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pRXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + if ((pSalI2CMngtAdpt->MstRDCmdCnt == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)){ + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + } + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + if (pSalI2CMngtAdpt->MstRDCmdCnt > 0) + pSalI2CMngtAdpt->MstRDCmdCnt--; + } + } + + if (I2CLocalTemp == pSalI2CHND->pRXBuf->DataLen){ + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_RTY) { + HalDelayUs(((1000*30)/pHalI2CInitDat->I2CClk)); //the 10 is for ten bit time + if (pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT) & + BIT_IC_RAW_INTR_STAT_TX_ABRT) { + pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_CLR_TX_ABRT); + pSalI2CMngtAdpt->MstRDCmdCnt++; + goto SEND_I2C_RD_CMD; + } + } + } + + /* Contineously poll the I2C RX FIFO status */ + while (1) { + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_RFNE | BIT_IC_STATUS_RFF)) != 0) { + *(pSalI2CHND->pRXBuf->pDataBuf) = + pHalI2COP->HalI2CReceive(pHalI2CInitDat); + + pSalI2CHND->pRXBuf->pDataBuf++; + pSalI2CHND->pRXBuf->DataLen--; + + if (!pSalI2CHND->pRXBuf->DataLen) { + break; + } + } + else { + break; + } + } + + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_FF_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,5\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_FF_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,6\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + + } + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + } +#endif/*I2C_POLL_OP_TYPE*/ + +#if I2C_INTR_OP_TYPE/*I2C_INTR_OP_TYPE*/ + if (pSalI2CHND->OpType == I2C_INTR_TYPE) { + /* Calculate user time out parameters */ + InTimeoutCount= 0; + InStartCount = 0; + I2CInTOTcnt = pSalI2CMngtAdpt->InnerTimeOut; + + InTimeoutCountIntr = 0; + InStartCountIntr = 0; + I2CInTOTcntIntr = pSalI2CHND->AddRtyTimeOut; + + if ((I2CInTOTcnt!= 0) && (I2CInTOTcnt!= I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount= HalTimerOp.HalTimerReadCount(1); + } + + InTimeoutCountIntr = (I2CInTOTcntIntr*1000/TIMER_TICK_US); + InStartCountIntr = HalTimerOp.HalTimerReadCount(1); + + I2CDataLenBak = (u32)(pSalI2CHND->pRXBuf->DataLen); + I2CDataPtrBak = (u32)(pSalI2CHND->pRXBuf->pDataBuf); + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_RX_READY; + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_ABRT; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_ACTIVITY; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + pHalI2COP->HalI2CClrAllIntr(pHalI2CInitDat); + + /* Clear RX FIFO */ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RXFLR); + while (I2CChkRawSts > 0){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RXFLR); + } + + /* To fill the Master Read Command into TX FIFO */ + pSalI2CMngtAdpt->MstRDCmdCnt = pSalI2CHND->pRXBuf->DataLen; + I2CLocalLen = 2;//pSalI2CHND->pRXBuf->DataLen; + pSalI2CHND->DevSts = I2C_STS_RX_READY; + + + while (1) { +SEND_I2C_RD_CMD_INTR: + + /* Calculate user time out parameters */ + InTimeoutCountRty = 0; + InStartCountRty = 0; + I2CInTOTcntRty = pSalI2CHND->TimeOut; + + if ((I2CInTOTcntRty != 0) && (I2CInTOTcntRty!= I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCountRty= (I2CInTOTcntRty*1000/TIMER_TICK_US); + InStartCountRty= HalTimerOp.HalTimerReadCount(1); + } + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + + if ((pSalI2CMngtAdpt->MstRDCmdCnt > 0) && (I2CLocalLen > 0)){ + pHalI2CInitDat->I2CCmd = I2C_READ_CMD; + pHalI2CInitDat->I2CDataLen= 1; + pHalI2CInitDat->I2CRWData = pSalI2CHND->pRXBuf->pDataBuf; + pHalI2CInitDat->I2CStop = I2C_STOP_DIS; + + if ((pSalI2CMngtAdpt->MstRDCmdCnt == 1) && ((pSalI2CHND->I2CExd & I2C_EXD_MTR_HOLD_BUS) == 0)){ + pHalI2CInitDat->I2CStop = I2C_STOP_EN; + } + + pHalI2COP->HalI2CMassSend(pHalI2CInitDat); + } + + if (pSalI2CHND->I2CExd & I2C_EXD_MTR_ADDR_RTY) { + + /* SEND_I2C_WR_CMD_INTR Time-Out check */ + if (InTimeoutCountIntr > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCountIntr, InTimeoutCountIntr)) { + return HAL_TIMEOUT; + } + } + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + while ((I2CChkRawSts & BIT_IC_STATUS_TFE) == 0) { + I2CChkRawSts2 = pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT); + if ((I2CChkRawSts2 & BIT_IC_RAW_INTR_STAT_TX_ABRT) != 0){ + break; + } + + /* Time-Out check */ + if (InTimeoutCountRty > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCountRty, InTimeoutCountRty)) { + break; + } + } + else { + if (I2CInTOTcntRty == 0) { + break; + } + } + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + + } + + HalDelayUs(((1000*30)/pHalI2CInitDat->I2CClk)); //the 10 is for ten bit time + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_RAW_INTR_STAT); + I2CChkRawSts2 = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + if (I2CChkRawSts & BIT_IC_RAW_INTR_STAT_TX_ABRT) { + + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + pSalI2CHND->DevSts = I2C_STS_RX_READY; + pSalI2CHND->ErrType = 0; + pSalI2CHND->pRXBuf->DataLen = (u16)I2CDataLenBak; + pSalI2CHND->pRXBuf->pDataBuf= (u8 *)I2CDataPtrBak; + + /* Calculate user time out parameters */ + InTimeoutCount = 0; + InStartCount = 0; + I2CInTOTcnt = pSalI2CMngtAdpt->InnerTimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + goto SEND_I2C_RD_CMD_INTR; + } + else if ((I2CChkRawSts2 & BIT_IC_STATUS_TFE) != BIT_IC_STATUS_TFE){ + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + pSalI2CHND->DevSts = I2C_STS_RX_READY; + pSalI2CHND->ErrType = 0; + pSalI2CHND->pRXBuf->DataLen = (u16)I2CDataLenBak; + pSalI2CHND->pRXBuf->pDataBuf= (u8 *)I2CDataPtrBak; + + /* Calculate user time out parameters */ + InTimeoutCount = 0; + InStartCount = 0; + I2CInTOTcnt = pSalI2CMngtAdpt->InnerTimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + goto SEND_I2C_RD_CMD_INTR; + } + else { + I2CChkRawSts2 = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS); + { + if (I2CLocalLen>0){ + I2CLocalLen--; + pSalI2CMngtAdpt->MstRDCmdCnt --; + } + } + } + } + else { + if (I2CLocalLen>0) { + I2CLocalLen--; + pSalI2CMngtAdpt->MstRDCmdCnt --; + } + } + + if ((I2CLocalLen == 0) || (pSalI2CHND->pRXBuf->DataLen == 1)){ + pHalI2CInitDat->I2CIntrClr = REG_DW_I2C_IC_CLR_TX_ABRT; + pHalI2COP->HalI2CClrIntr(pHalI2CInitDat); + I2CLocalTemp = 0; + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_RX_FULL | + BIT_IC_INTR_MASK_M_RX_OVER | + BIT_IC_INTR_MASK_M_RX_UNDER|BIT_IC_INTR_MASK_M_TX_ABRT); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + break; + } + + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_TX_FF_TO; + + RtkI2CDeInitForPS(pSalI2CHND); + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) == BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + RtkI2CInitForPS(pSalI2CHND); + + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + while((I2CChkRawSts & BIT_IC_ENABLE_STATUS_IC_EN) != BIT_IC_ENABLE_STATUS_IC_EN){ + I2CChkRawSts = (u32)pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_ENABLE_STATUS); + } + return HAL_TIMEOUT; + } + } + } + + } +#endif/*I2C_INTR_OP_TYPE*/ + }/*if (pSalI2CHND->I2CMaster == I2C_MASTER_MODE)*/ + else + { +#if I2C_POLL_OP_TYPE + if (pSalI2CHND->OpType == I2C_POLL_TYPE) { + /* Calculate user time out parameters */ + I2CInTOTcnt = pSalI2CHND->TimeOut; + if ((I2CInTOTcnt != 0) && (I2CInTOTcnt != I2C_TIMEOOUT_ENDLESS)) { + InTimeoutCount = (I2CInTOTcnt*1000/TIMER_TICK_US); + InStartCount = HalTimerOp.HalTimerReadCount(1); + } + + /* Receive data till the RX buffer data length is zero */ + for (;pSalI2CHND->pRXBuf->DataLen>0; ) { + if ((pHalI2COP->HalI2CReadReg(pHalI2CInitDat,REG_DW_I2C_IC_STATUS) + & (BIT_IC_STATUS_RFNE | BIT_IC_STATUS_RFF)) != 0) { + *(pSalI2CHND->pRXBuf->pDataBuf) = + pHalI2COP->HalI2CReceive(pHalI2CInitDat); + pSalI2CHND->pRXBuf->pDataBuf++; + pSalI2CHND->pRXBuf->DataLen--; + } + else { + /* Time-Out check */ + if (InTimeoutCount > 0) { + if (HAL_TIMEOUT == I2CIsTimeout(InStartCount, InTimeoutCount)) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_FF_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,9\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + else { + if (I2CInTOTcnt == 0) { + pSalI2CHND->DevSts = I2C_STS_TIMEOUT; + pSalI2CHND->ErrType = I2C_ERR_RX_FF_TO; + DBG_I2C_ERR("RtkI2CReceive Timeout, I2C%2x,10\n",pSalI2CHND->DevNum); + DBG_I2C_ERR("DevSts:%x, ErrType:%x\n", pSalI2CHND->DevSts, pSalI2CHND->ErrType); + return HAL_TIMEOUT; + } + } + } + } + + /* I2C Device Status Update */ + pSalI2CHND->DevSts = I2C_STS_IDLE; + } +#endif + +#if I2C_INTR_OP_TYPE/*I2C_INTR_OP_TYPE*/ + if (pSalI2CHND->OpType == I2C_INTR_TYPE) { + pSalI2CHND->DevSts = I2C_STS_RX_READY; + + /*I2C Enable RX Related Interrupts*/ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_RX_FULL | + BIT_IC_INTR_MASK_M_RX_OVER | + BIT_IC_INTR_MASK_M_RX_UNDER); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + } +#endif/*I2C_INTR_OP_TYPE*/ + +#if I2C_DMA_OP_TYPE/*I2C_INTR_OP_TYPE*/ + if (pSalI2CHND->OpType == I2C_DMA_TYPE) { + pSalI2CHND->DevSts = I2C_STS_RX_READY; + + /*I2C Enable RX Related Interrupts*/ + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_INTR_MASK); + I2CLocalTemp |= (BIT_IC_INTR_MASK_M_RX_OVER | + BIT_IC_INTR_MASK_M_RX_UNDER); + pHalI2CInitDat->I2CIntrMSK = I2CLocalTemp; + pHalI2COP->HalI2CIntrCtrl(pHalI2CInitDat); + + //HalGdmaOpInit(pHalI2CGdmaOp); + pSalI2CMngtAdpt->pHalGdmaOpInit(pHalI2CGdmaOp); + + pHalI2CRxGdmaAdpt->GdmaCtl.BlockSize = pSalI2CHND->pRXBuf->DataLen; + pHalI2CRxGdmaAdpt->ChSar = (u32)(I2C0_REG_BASE+REG_DW_I2C_IC_DATA_CMD+ + pSalI2CHND->DevNum*0x400); + pHalI2CRxGdmaAdpt->ChDar = (u32)pSalI2CHND->pRXBuf->pDataBuf; + + pHalI2CGdmaOp->HalGdmaChSeting(pHalI2CRxGdmaAdpt); + pHalI2CGdmaOp->HalGdmaChEn(pHalI2CRxGdmaAdpt); + pSalI2CHND->DevSts = I2C_STS_RX_ING; + pHalI2CInitDat->I2CDMACtrl = BIT_CTRL_IC_DMA_CR_RDMAE(1); + pHalI2COP->HalI2CDMACtrl(pHalI2CInitDat); + } +#endif/*I2C_INTR_OP_TYPE*/ + + } + + return HAL_OK; +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CInitForPS +// +// Description: +// Add power state registeration for I2C initail process. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C initialization process. +// HAL_OK if the RtkI2CInitForPS succeeded. +// HAL_ERR_UNKNOWN if the RtkI2CInitForPS failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2015-05-31. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CInitForPS( + IN VOID *Data +){ + + u8 i2cInitSts = HAL_OK; + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE i2cPwrState; +#endif + + i2cInitSts = RtkI2CInit(pSalI2CHND); + +#ifdef CONFIG_SOC_PS_MODULE + // To register a new peripheral device power state + if (i2cInitSts == HAL_OK){ + i2cPwrState.FuncIdx = I2C0 + pSalI2CHND->DevNum; + i2cPwrState.PwrState = ACT; + RegPowerState(i2cPwrState); + } +#endif + + return i2cInitSts; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CDeInitForPS +// +// Description: +// Add power state registeration for I2C deinitail process. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C deinitialization process. +// HAL_OK if the RtkI2CDeInitForPS succeeded. +// HAL_ERR_UNKNOWN if the RtkI2CDeInitForPS failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2015-05-31. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CDeInitForPS( + IN VOID *Data +){ + u8 i2cInitSts = HAL_OK; + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE i2cPwrState; + u8 HwState; +#endif + + if (pSalI2CHND == NULL) + return HAL_ERR_UNKNOWN; + + /* Check the input I2C index first */ + if (RtkI2CIdxChk(pSalI2CHND->DevNum)) + return HAL_ERR_UNKNOWN; + +#ifdef CONFIG_SOC_PS_MODULE + i2cPwrState.FuncIdx = I2C0 + pSalI2CHND->DevNum; + + QueryRegPwrState(i2cPwrState.FuncIdx, &(i2cPwrState.PwrState), &HwState); + + // if the power state isn't ACT, then switch the power state back to ACT first + if ((i2cPwrState.PwrState != ACT) && (i2cPwrState.PwrState != INACT)) { + RtkI2CEnablePS(Data); + QueryRegPwrState(i2cPwrState.FuncIdx, &(i2cPwrState.PwrState), &HwState); + } + + if (i2cPwrState.PwrState == ACT) { + i2cPwrState.PwrState = INACT; + RegPowerState(i2cPwrState); + } +#endif + + i2cInitSts = RtkI2CDeInit(pSalI2CHND); + + return i2cInitSts; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CDisablePS +// +// Description: +// I2C disable opertion by setting clock disable. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C disable process. +// HAL_OK if the RtkI2CDisablePS succeeded. +// HAL_ERR_PARA if the RtkI2CDisablePS failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2015-05-31. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CDisablePS( + IN VOID *Data +){ + + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + u8 i2cIdx = pSalI2CHND->DevNum; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE i2cPwrState; +#endif + + if (RtkI2CIdxChk(i2cIdx)) + return HAL_ERR_UNKNOWN; + + switch (i2cIdx) { + case 0: + { + /* I2C 0 */ + ACTCK_I2C0_CCTRL(OFF); + SLPCK_I2C0_CCTRL(OFF); + break; + } + case 1: + { + /* I2C 1 */ + ACTCK_I2C1_CCTRL(OFF); + SLPCK_I2C1_CCTRL(OFF); + break; + } + case 2: + { + /* I2C 2 */ + ACTCK_I2C2_CCTRL(OFF); + SLPCK_I2C2_CCTRL(OFF); + break; + } + case 3: + { + /* I2C 3 */ + ACTCK_I2C3_CCTRL(OFF); + SLPCK_I2C3_CCTRL(OFF); + break; + } + default: + { + return HAL_ERR_PARA; + } + } + +#ifdef CONFIG_SOC_PS_MODULE + // To register a new peripheral device power state + i2cPwrState.FuncIdx = I2C0 + pSalI2CHND->DevNum; + i2cPwrState.PwrState = SLPCG; + RegPowerState(i2cPwrState); +#endif + + return HAL_OK; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CEnablePS +// +// Description: +// I2C enable opertion by setting clock enable. +// +// Arguments: +// [in] VOID *Data - +// I2C SAL handle +// +// Return: +// The status of the I2C enable process. +// HAL_OK if the RtkI2CEnablePS succeeded. +// HAL_ERR_PARA if the RtkI2CEnablePS failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2015-05-31. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CEnablePS( + IN VOID *Data +){ + + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + u8 i2cIdx = pSalI2CHND->DevNum; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE i2cPwrState; +#endif + + if (RtkI2CIdxChk(i2cIdx)) + return HAL_ERR_UNKNOWN; + + switch (i2cIdx) { + case 0: + { + /* I2C 0 */ + ACTCK_I2C0_CCTRL(ON); + SLPCK_I2C0_CCTRL(ON); + break; + } + case 1: + { + /* I2C 1 */ + ACTCK_I2C1_CCTRL(ON); + SLPCK_I2C1_CCTRL(ON); + break; + } + case 2: + { + /* I2C 2 */ + ACTCK_I2C2_CCTRL(ON); + SLPCK_I2C2_CCTRL(ON); + break; + } + case 3: + { + /* I2C 3 */ + ACTCK_I2C3_CCTRL(ON); + SLPCK_I2C3_CCTRL(ON); + break; + } + default: + { + return HAL_ERR_PARA; + } + } + +#ifdef CONFIG_SOC_PS_MODULE + // To register a new peripheral device power state + i2cPwrState.FuncIdx = I2C0 + pSalI2CHND->DevNum; + i2cPwrState.PwrState = ACT; + RegPowerState(i2cPwrState); +#endif + + return HAL_OK; +} +#endif + +#ifndef CONFIG_MBED_ENABLED +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetMngtAdpt +// +// Description: +// According to the input index, all the memory space are allocated and all the +// related pointers are assigned. The management adapter pointer will be +// returned. +// +// Arguments: +// [in] u8 I2CIdx - +// I2C module index +// +// Return: +// PSAL_I2C_MNGT_ADPT +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +PSAL_I2C_MNGT_ADPT +RtkI2CGetMngtAdpt( + IN u8 I2CIdx +){ + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PSAL_I2C_USERCB_ADPT pSalI2CUserCBAdpt = NULL; + + /* If the kernel is available, Memory-allocation is used. */ +#ifdef I2C_STATIC_ALLOC + + pSalI2CMngtAdpt = (PSAL_I2C_MNGT_ADPT)RtlZmalloc(sizeof(SAL_I2C_MNGT_ADPT)); + pSalI2CMngtAdpt->pSalHndPriv = (PSAL_I2C_HND_PRIV)RtlZmalloc(sizeof(SAL_I2C_HND_PRIV)); + pSalI2CMngtAdpt->pHalInitDat = (PHAL_I2C_INIT_DAT)RtlZmalloc(sizeof(HAL_I2C_INIT_DAT)); + pSalI2CMngtAdpt->pHalOp = (PHAL_I2C_OP)RtlZmalloc(sizeof(HAL_I2C_OP)); + pSalI2CMngtAdpt->pIrqHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalI2CMngtAdpt->pHalTxGdmaAdp = (PHAL_GDMA_ADAPTER)RtlZmalloc(sizeof(HAL_GDMA_ADAPTER)); + pSalI2CMngtAdpt->pHalRxGdmaAdp = (PHAL_GDMA_ADAPTER)RtlZmalloc(sizeof(HAL_GDMA_ADAPTER)); + pSalI2CMngtAdpt->pHalGdmaOp = (PHAL_GDMA_OP)RtlZmalloc(sizeof(HAL_GDMA_OP)); + pSalI2CMngtAdpt->pIrqTxGdmaHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalI2CMngtAdpt->pIrqRxGdmaHnd = (PIRQ_HANDLE)RtlZmalloc(sizeof(IRQ_HANDLE)); + pSalI2CMngtAdpt->pUserCB = (PSAL_I2C_USER_CB)RtlZmalloc(sizeof(SAL_I2C_USER_CB)); + pSalI2CMngtAdpt->pDMAConf = (PSAL_I2C_DMA_USER_DEF)RtlZmalloc(sizeof(SAL_I2C_DMA_USER_DEF)); + pSalI2CUserCBAdpt = (PSAL_I2C_USERCB_ADPT)RtlZmalloc((sizeof(SAL_I2C_USERCB_ADPT)*SAL_USER_CB_NUM)); +#else + switch (I2CIdx){ + case I2C0_SEL: + { + pSalI2CMngtAdpt = &SalI2C0MngtAdpt; + pSalI2CMngtAdpt->pSalHndPriv = &SalI2C0HndPriv; + pSalI2CMngtAdpt->pHalInitDat = &HalI2C0InitData; + pSalI2CMngtAdpt->pHalOp = &HalI2COpSAL; + pSalI2CMngtAdpt->pIrqHnd = &I2C0IrqHandleDat; + pSalI2CMngtAdpt->pHalTxGdmaAdp = &HalI2C0TxGdmaAdpt; + pSalI2CMngtAdpt->pHalRxGdmaAdp = &HalI2C0RxGdmaAdpt; + pSalI2CMngtAdpt->pHalGdmaOp = &HalI2C0GdmaOp; + pSalI2CMngtAdpt->pIrqTxGdmaHnd = &I2C0TxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pIrqRxGdmaHnd = &I2C0RxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pUserCB = &SalI2C0UserCB; + pSalI2CMngtAdpt->pDMAConf = &SalI2C0DmaUserDef; + pSalI2CUserCBAdpt = (PSAL_I2C_USERCB_ADPT)&SalI2C0UserCBAdpt; + break; + } + + case I2C1_SEL: + { + pSalI2CMngtAdpt = &SalI2C1MngtAdpt; + pSalI2CMngtAdpt->pSalHndPriv = &SalI2C1HndPriv; + pSalI2CMngtAdpt->pHalInitDat = &HalI2C1InitData; + pSalI2CMngtAdpt->pHalOp = &HalI2COpSAL; + pSalI2CMngtAdpt->pIrqHnd = &I2C1IrqHandleDat; + pSalI2CMngtAdpt->pHalTxGdmaAdp = &HalI2C1TxGdmaAdpt; + pSalI2CMngtAdpt->pHalRxGdmaAdp = &HalI2C1RxGdmaAdpt; + pSalI2CMngtAdpt->pHalGdmaOp = &HalI2C1GdmaOp; + pSalI2CMngtAdpt->pIrqTxGdmaHnd = &I2C1TxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pIrqRxGdmaHnd = &I2C1RxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pUserCB = &SalI2C1UserCB; + pSalI2CMngtAdpt->pDMAConf = &SalI2C1DmaUserDef; + pSalI2CUserCBAdpt = (PSAL_I2C_USERCB_ADPT)&SalI2C1UserCBAdpt; + break; + } + + case I2C2_SEL: + { + pSalI2CMngtAdpt = &SalI2C2MngtAdpt; + pSalI2CMngtAdpt->pSalHndPriv = &SalI2C2HndPriv; + pSalI2CMngtAdpt->pHalInitDat = &HalI2C2InitData; + pSalI2CMngtAdpt->pHalOp = &HalI2COpSAL; + pSalI2CMngtAdpt->pIrqHnd = &I2C2IrqHandleDat; + pSalI2CMngtAdpt->pHalTxGdmaAdp = &HalI2C2TxGdmaAdpt; + pSalI2CMngtAdpt->pHalRxGdmaAdp = &HalI2C2RxGdmaAdpt; + pSalI2CMngtAdpt->pHalGdmaOp = &HalI2C2GdmaOp; + pSalI2CMngtAdpt->pIrqTxGdmaHnd = &I2C2TxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pIrqRxGdmaHnd = &I2C2RxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pUserCB = &SalI2C2UserCB; + pSalI2CMngtAdpt->pDMAConf = &SalI2C2DmaUserDef; + pSalI2CUserCBAdpt = (PSAL_I2C_USERCB_ADPT)&SalI2C2UserCBAdpt; + break; + } + + case I2C3_SEL: + { + pSalI2CMngtAdpt = &SalI2C3MngtAdpt; + pSalI2CMngtAdpt->pSalHndPriv = &SalI2C3HndPriv; + pSalI2CMngtAdpt->pHalInitDat = &HalI2C3InitData; + pSalI2CMngtAdpt->pHalOp = &HalI2COpSAL; + pSalI2CMngtAdpt->pIrqHnd = &I2C3IrqHandleDat; + pSalI2CMngtAdpt->pHalTxGdmaAdp = &HalI2C3TxGdmaAdpt; + pSalI2CMngtAdpt->pHalRxGdmaAdp = &HalI2C3RxGdmaAdpt; + pSalI2CMngtAdpt->pHalGdmaOp = &HalI2C3GdmaOp; + pSalI2CMngtAdpt->pIrqTxGdmaHnd = &I2C3TxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pIrqRxGdmaHnd = &I2C3RxGdmaIrqHandleDat; + pSalI2CMngtAdpt->pUserCB = &SalI2C3UserCB; + pSalI2CMngtAdpt->pDMAConf = &SalI2C3DmaUserDef; + pSalI2CUserCBAdpt = (PSAL_I2C_USERCB_ADPT)&SalI2C3UserCBAdpt; + break; + } + + default + break; + } +#endif + + /*To assign user callback pointers*/ + pSalI2CMngtAdpt->pUserCB->pTXCB = pSalI2CUserCBAdpt; + pSalI2CMngtAdpt->pUserCB->pTXCCB = (pSalI2CUserCBAdpt+1); + pSalI2CMngtAdpt->pUserCB->pRXCB = (pSalI2CUserCBAdpt+2); + pSalI2CMngtAdpt->pUserCB->pRXCCB = (pSalI2CUserCBAdpt+3); + pSalI2CMngtAdpt->pUserCB->pRDREQCB = (pSalI2CUserCBAdpt+4); + pSalI2CMngtAdpt->pUserCB->pERRCB = (pSalI2CUserCBAdpt+5); + pSalI2CMngtAdpt->pUserCB->pDMATXCB = (pSalI2CUserCBAdpt+6); + pSalI2CMngtAdpt->pUserCB->pDMATXCCB = (pSalI2CUserCBAdpt+7); + pSalI2CMngtAdpt->pUserCB->pDMARXCB = (pSalI2CUserCBAdpt+8); + pSalI2CMngtAdpt->pUserCB->pDMARXCCB = (pSalI2CUserCBAdpt+9); + pSalI2CMngtAdpt->pUserCB->pGENCALLCB= (pSalI2CUserCBAdpt+10); + + /*To assign the rest pointers*/ + pSalI2CMngtAdpt->MstRDCmdCnt = 0; + pSalI2CMngtAdpt->InnerTimeOut = 2000; // inner time-out count, 2000 ms + pSalI2CMngtAdpt->pSalHndPriv->ppSalI2CHnd = (void**)&(pSalI2CMngtAdpt->pSalHndPriv); + + /* To assign the default (ROM) HAL OP initialization function */ +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) || defined(CONFIG_CHIP_C_CUT) + pSalI2CMngtAdpt->pHalOpInit = HalI2COpInit_Patch; +#elif defined(CONFIG_CHIP_E_CUT) + // TODO: E-Cut + pSalI2CMngtAdpt->pHalOpInit = HalI2COpInitV02; +#endif + + /* To assign the default (ROM) HAL GDMA OP initialization function */ + pSalI2CMngtAdpt->pHalGdmaOpInit = HalGdmaOpInit; + + /* To assign the default (ROM) SAL interrupt function */ +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) || defined(CONFIG_CHIP_C_CUT) + pSalI2CMngtAdpt->pSalIrqFunc = I2CISRHandle_Patch; +#elif defined(CONFIG_CHIP_E_CUT) + pSalI2CMngtAdpt->pSalIrqFunc = I2CISRHandleV02; +#endif + + /* To assign the default (ROM) SAL DMA TX interrupt function */ + pSalI2CMngtAdpt->pSalDMATxIrqFunc = I2CTXGDMAISRHandle; + + /* To assign the default (ROM) SAL DMA RX interrupt function */ + pSalI2CMngtAdpt->pSalDMARxIrqFunc = I2CRXGDMAISRHandle; + + return pSalI2CMngtAdpt; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CFreeMngtAdpt +// +// Description: +// Free all the previous allocated memory space. +// +// Arguments: +// [in] PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt - +// I2C SAL management adapter pointer +// +// +// Return: +// The status of the enable process. +// _EXIT_SUCCESS if the RtkI2CFreeMngtAdpt succeeded. +// _EXIT_FAILURE if the RtkI2CFreeMngtAdpt failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-02. +// +//--------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CFreeMngtAdpt( + IN PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt +){ +#ifdef I2C_STATIC_ALLOC + RtlMfree((u8 *)pSalI2CMngtAdpt->pUserCB->pTXCB, (sizeof(SAL_I2C_USERCB_ADPT)*SAL_USER_CB_NUM)); + RtlMfree((u8 *)pSalI2CMngtAdpt->pDMAConf, (sizeof(SAL_I2C_DMA_USER_DEF))); + RtlMfree((u8 *)pSalI2CMngtAdpt->pIrqRxGdmaHnd, (sizeof(IRQ_HANDLE))); + RtlMfree((u8 *)pSalI2CMngtAdpt->pIrqTxGdmaHnd, (sizeof(IRQ_HANDLE))); + RtlMfree((u8 *)pSalI2CMngtAdpt->pHalGdmaOp, (sizeof(HAL_GDMA_OP))); + RtlMfree((u8 *)pSalI2CMngtAdpt->pHalRxGdmaAdp, (sizeof(HAL_GDMA_ADAPTER))); + RtlMfree((u8 *)pSalI2CMngtAdpt->pHalTxGdmaAdp, (sizeof(HAL_GDMA_ADAPTER))); + RtlMfree((u8 *)pSalI2CMngtAdpt->pUserCB, sizeof(SAL_I2C_USER_CB)); + RtlMfree((u8 *)pSalI2CMngtAdpt->pIrqHnd, sizeof(IRQ_HANDLE)); + RtlMfree((u8 *)pSalI2CMngtAdpt->pHalOp, sizeof(HAL_I2C_OP)); + RtlMfree((u8 *)pSalI2CMngtAdpt->pHalInitDat, sizeof(HAL_I2C_INIT_DAT)); + RtlMfree((u8 *)pSalI2CMngtAdpt->pSalHndPriv, sizeof(SAL_I2C_HND_PRIV)); + RtlMfree((u8 *)pSalI2CMngtAdpt, sizeof(SAL_I2C_MNGT_ADPT)); +#else + ; +#endif + + return HAL_OK; +} + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CGetSalHnd +// +// Description: +// Allocation of lower layer memory spaces will be done by invoking RtkI2CGetMngtAdpt +// in this function and return a SAL_I2C_HND pointer to upper layer. +// According to the given I2C index, RtkI2CGetMngtAdpt will allocate all the memory +// space such as SAL_I2C_HND, HAL_I2C_INIT_DAT, SAL_I2C_USER_CB etc. +// +// +// Arguments: +// [in] u8 I2CIdx - +// I2C Index +// +// Return: +// PSAL_I2C_HND +// A pointer to SAL_I2C_HND which is allocated in the lower layer. +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +PSAL_I2C_HND +RtkI2CGetSalHnd( + IN u8 I2CIdx +){ + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PSAL_I2C_HND pSalI2CHND = NULL; + + /* Check the user define setting and the given index */ + if (RtkI2CIdxChk(I2CIdx)) { + return (PSAL_I2C_HND)NULL; + } + + /* Invoke RtkI2CGetMngtAdpt to get the I2C SAL management adapter pointer */ + pSalI2CMngtAdpt = RtkI2CGetMngtAdpt(I2CIdx); + + /* Assign the private SAL handle to public SAL handle */ + pSalI2CHND = &(pSalI2CMngtAdpt->pSalHndPriv->SalI2CHndPriv); + + /* Assign the internal HAL initial data pointer to the SAL handle */ + pSalI2CHND->pInitDat = pSalI2CMngtAdpt->pHalInitDat; + + /* Assign the internal user callback pointer to the SAL handle */ + pSalI2CHND->pUserCB = pSalI2CMngtAdpt->pUserCB; + + /* Assign the internal user define DMA configuration to the SAL handle */ + pSalI2CHND->pDMAConf = pSalI2CMngtAdpt->pDMAConf; + + return &(pSalI2CMngtAdpt->pSalHndPriv->SalI2CHndPriv); +} + + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkI2CFreeSalHnd +// +// Description: +// Based on the given pSalI2CHND, the top layer management adapter pointer could +// be reversely parsed. And free memory space is done by RtkI2CFreeMngtAdpt. +// +// +// Arguments: +// [in] PSAL_I2C_HND pSalI2CHND - +// SAL I2C handle +// +// Return: +// The status of the free SAL memory space process. +// _EXIT_SUCCESS if the RtkI2CFreeSalHnd succeeded. +// _EXIT_FAILURE if the RtkI2CFreeSalHnd failed. +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//---------------------------------------------------------------------------------------------------- +HAL_Status +RtkI2CFreeSalHnd( + IN PSAL_I2C_HND pSalI2CHND +){ + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PSAL_I2C_HND_PRIV pSalI2CHNDPriv = NULL; + + /* To get the SAL_I2C_MNGT_ADPT pointer */ + pSalI2CHNDPriv = CONTAINER_OF(pSalI2CHND, SAL_I2C_HND_PRIV, SalI2CHndPriv); + pSalI2CMngtAdpt = CONTAINER_OF(pSalI2CHNDPriv->ppSalI2CHnd, SAL_I2C_MNGT_ADPT, pSalHndPriv); + + /* Invoke RtkI2CFreeMngtAdpt to free all the lower layer memory space */ + return (RtkI2CFreeMngtAdpt(pSalI2CMngtAdpt)); +} + +#endif // end of "#ifndef CONFIG_MBED_ENABLED" + +//--------------------------------------------------------------------------------------------------- +//Function Name: +// RtkSalI2CSts +// +// Description: +// Get i2c status +// +// Arguments: +// A SAL operation adapter pointer +// +// Return: +// NA +// +// Note: +// NA +// +// See Also: +// NA +// +// Author: +// By Jason Deng, 2014-04-03. +// +//--------------------------------------------------------------------------------------------------- +u32 +RtkSalI2CSts( + IN VOID *Data +){ + PSAL_I2C_HND pSalI2CHND = (PSAL_I2C_HND) Data; + PSAL_I2C_HND_PRIV pSalI2CHNDPriv = NULL; + PSAL_I2C_MNGT_ADPT pSalI2CMngtAdpt = NULL; + PHAL_I2C_INIT_DAT pHalI2CInitDat = NULL; + PHAL_I2C_OP pHalI2COP = NULL; + u32 I2CLocalTemp; + + + /* To Get the SAL_I2C_MNGT_ADPT Pointer */ + pSalI2CHNDPriv = CONTAINER_OF(pSalI2CHND, SAL_I2C_HND_PRIV, SalI2CHndPriv); + pSalI2CMngtAdpt = CONTAINER_OF(pSalI2CHNDPriv->ppSalI2CHnd, SAL_I2C_MNGT_ADPT, pSalHndPriv); + + pHalI2CInitDat = pSalI2CMngtAdpt->pHalInitDat; + pHalI2COP = pSalI2CMngtAdpt->pHalOp; + + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_RAW_INTR_STAT); + + if (I2CLocalTemp & BIT_IC_RAW_INTR_STAT_GEN_CALL) { + return 2; + } + else if (I2CLocalTemp & BIT_IC_RAW_INTR_STAT_RD_REQ) { + return 1; + } + + I2CLocalTemp = pHalI2COP->HalI2CReadReg(pHalI2CInitDat, REG_DW_I2C_IC_STATUS); + + if (I2CLocalTemp & BIT_IC_STATUS_RFNE) { + return 3; + } + + return 0; +} diff --git a/lib/fwlib/src/hal_i2s.c b/lib/fwlib/src/hal_i2s.c new file mode 100644 index 0000000..015107a --- /dev/null +++ b/lib/fwlib/src/hal_i2s.c @@ -0,0 +1,535 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "hal_i2s.h" +#include "rand.h" +#include "rtl_utility.h" + + +//1 need to be modified + + +/*====================================================== + Local used variables +*/ +SRAM_BF_DATA_SECTION +HAL_I2S_OP HalI2SOpSAL={0}; + + +VOID +I2SISRHandle( + IN VOID *Data +) +{ + PHAL_I2S_ADAPTER pI2SAdp = (PHAL_I2S_ADAPTER) Data; + PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL; + PHAL_I2S_INIT_DAT pI2SCfg = pI2SAdp->pInitDat; + u32 I2STxIsr, I2SRxIsr; + u8 I2SPageNum = pI2SCfg->I2SPageNum+1; +// u32 I2SPageSize = (pI2SAdp->I2SPageSize+1)<<2; + u32 i; + u32 pbuf; + + I2STxIsr = pHalI2SOP->HalI2SReadReg(pI2SCfg, REG_I2S_TX_STATUS_INT); + I2SRxIsr = pHalI2SOP->HalI2SReadReg(pI2SCfg, REG_I2S_RX_STATUS_INT); + + pI2SCfg->I2STxIntrClr = I2STxIsr; + pI2SCfg->I2SRxIntrClr = I2SRxIsr; + pHalI2SOP->HalI2SClrIntr(pI2SCfg); + + for (i=0 ; iI2SHWTxIdx)) { +// pbuf = ((u32)(pI2SCfg->I2STxData)) + (I2SPageSize*pI2SCfg->I2SHWTxIdx); + pbuf = (u32)pI2SAdp->TxPageList[pI2SCfg->I2SHWTxIdx]; + pI2SAdp->UserCB.TxCCB(pI2SAdp->UserCB.TxCBId, (char*)pbuf); + I2STxIsr &= ~(1<I2SHWTxIdx); + pI2SCfg->I2SHWTxIdx += 1; + if (pI2SCfg->I2SHWTxIdx == I2SPageNum) { + pI2SCfg->I2SHWTxIdx = 0; + } + } + + if (I2SRxIsr & (1<I2SHWRxIdx)) { +// pbuf = ((u32)(pI2SCfg->I2SRxData)) + (I2SPageSize*pI2SCfg->I2SHWRxIdx); + pbuf = (u32)pI2SAdp->RxPageList[pI2SCfg->I2SHWRxIdx]; + pI2SAdp->UserCB.RxCCB(pI2SAdp->UserCB.RxCBId, (char*)pbuf); + I2SRxIsr &= ~(1<I2SHWRxIdx); + pI2SCfg->I2SHWRxIdx += 1; + if (pI2SCfg->I2SHWRxIdx == I2SPageNum) { + pI2SCfg->I2SHWRxIdx = 0; + } + } + } +} + + +static HAL_Status +RtkI2SIrqInit( + IN PHAL_I2S_ADAPTER pI2SAdapter +) +{ + PIRQ_HANDLE pIrqHandle; + + if (pI2SAdapter->DevNum > I2S_MAX_ID) { + DBG_I2S_ERR("RtkI2SIrqInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum); + return HAL_ERR_PARA; + } + + pIrqHandle = &pI2SAdapter->IrqHandle; + + switch (pI2SAdapter->DevNum){ + case I2S0_SEL: + pIrqHandle->IrqNum = I2S0_PCM0_IRQ; + break; + + case I2S1_SEL: + pIrqHandle->IrqNum = I2S1_PCM1_IRQ; + break; + + default: + return HAL_ERR_PARA; + } + + pIrqHandle->Data = (u32) (pI2SAdapter); + pIrqHandle->IrqFun = (IRQ_FUN) I2SISRHandle; + pIrqHandle->Priority = 3; + InterruptRegister(pIrqHandle); + InterruptEn(pIrqHandle); + + return HAL_OK; +} + +static HAL_Status +RtkI2SIrqDeInit( + IN PHAL_I2S_ADAPTER pI2SAdapter +) +{ + if (pI2SAdapter->DevNum > I2S_MAX_ID) { + DBG_I2S_ERR("RtkI2SIrqDeInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum); + return HAL_ERR_PARA; + } + + InterruptDis(&pI2SAdapter->IrqHandle); + InterruptUnRegister(&pI2SAdapter->IrqHandle); + + return HAL_OK; +} + +static HAL_Status +RtkI2SPinMuxInit( + IN PHAL_I2S_ADAPTER pI2SAdapter +) +{ + u32 I2Stemp; + + if (pI2SAdapter->DevNum > I2S_MAX_ID) { + DBG_I2S_ERR("RtkI2SPinMuxInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum); + return HAL_ERR_PARA; + } + + // enable system pll + I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) | (1<<9) | (1<<10); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp); + + switch (pI2SAdapter->DevNum){ + case I2S0_SEL: + ACTCK_I2S_CCTRL(ON); + SLPCK_I2S_CCTRL(ON); + LXBUS_FCTRL(ON); // enable lx bus for i2s + + /*I2S0 Pin Mux Setting*/ + PinCtrl(I2S0, pI2SAdapter->PinMux, ON); + if (pI2SAdapter->PinMux == I2S_S0) { + DBG_I2S_WARN(ANSI_COLOR_MAGENTA"I2S0 Pin may conflict with JTAG\r\n"ANSI_COLOR_RESET); + } + I2S0_MCK_CTRL(ON); + I2S0_PIN_CTRL(ON); + I2S0_FCTRL(ON); + + break; + case I2S1_SEL: + ACTCK_I2S_CCTRL(ON); + SLPCK_I2S_CCTRL(ON); + LXBUS_FCTRL(ON); // enable lx bus for i2s + + /*I2S1 Pin Mux Setting*/ + PinCtrl(I2S1, pI2SAdapter->PinMux, ON); + if (pI2SAdapter->PinMux == I2S_S2) { + DBG_I2S_WARN(ANSI_COLOR_MAGENTA"I2S1 Pin may conflict with JTAG\r\n"ANSI_COLOR_RESET); + } + I2S1_MCK_CTRL(ON); + I2S1_PIN_CTRL(ON); + I2S0_FCTRL(ON); //i2s 1 is control by bit 24 BIT_PERI_I2S0_EN + I2S1_FCTRL(ON); + break; + default: + return HAL_ERR_PARA; + } + + return HAL_OK; +} + + +static HAL_Status +RtkI2SPinMuxDeInit( + IN PHAL_I2S_ADAPTER pI2SAdapter +) +{ + if (pI2SAdapter->DevNum > I2S_MAX_ID) { + DBG_I2S_ERR("RtkI2SPinMuxDeInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum); + return HAL_ERR_PARA; + } + + switch (pI2SAdapter->DevNum){ + case I2S0_SEL: + /*I2S0 Pin Mux Setting*/ + //ACTCK_I2C0_CCTRL(OFF); + PinCtrl(I2S0, pI2SAdapter->PinMux, OFF); + I2S0_MCK_CTRL(OFF); + I2S0_PIN_CTRL(OFF); + //I2S0_FCTRL(OFF); + + break; + case I2S1_SEL: + /*I2S1 Pin Mux Setting*/ + //ACTCK_I2C1_CCTRL(OFF); + PinCtrl(I2S1, pI2SAdapter->PinMux, OFF); + I2S1_MCK_CTRL(OFF); + I2S1_PIN_CTRL(OFF); + //I2S1_FCTRL(OFF); + break; + default: + return HAL_ERR_PARA; + } + + return HAL_OK; +} + + +HAL_Status +RtkI2SInit( + IN VOID *Data +) +{ + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; + PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL; + PHAL_I2S_INIT_DAT pI2SCfg; + + if (pI2SAdapter == 0) { + DBG_I2S_ERR("RtkI2SInit: Null Pointer\r\n"); + return HAL_ERR_PARA; + } + + if (pI2SAdapter->DevNum > I2S_MAX_ID) { + DBG_I2S_ERR("RtkI2SInit: Invalid I2S Index(&d)\r\n", pI2SAdapter->DevNum); + return HAL_ERR_PARA; + } + + pI2SCfg = pI2SAdapter->pInitDat; + + /*I2S Initialize HAL Operations*/ + HalI2SOpInit(pHalI2SOP); + + /*I2S Interrupt Initialization*/ + RtkI2SIrqInit(pI2SAdapter); + + /*I2S Pin Mux Initialization*/ + RtkI2SPinMuxInit(pI2SAdapter); + + /*I2S Load User Setting*/ + pI2SCfg->I2SIdx = pI2SAdapter->DevNum; + + /*I2S HAL Initialization*/ + pHalI2SOP->HalI2SInit(pI2SCfg); + + /*I2S Device Status Update*/ + pI2SAdapter->DevSts = I2S_STS_INITIALIZED; + + /*I2S Enable Module*/ + pI2SCfg->I2SEn = I2S_ENABLE; + pHalI2SOP->HalI2SEnable(pI2SCfg); + + /*I2S Device Status Update*/ + pI2SAdapter->DevSts = I2S_STS_IDLE; + + return HAL_OK; +} + +HAL_Status +RtkI2SDeInit( + IN VOID *Data +) +{ + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; + PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL; + PHAL_I2S_INIT_DAT pI2SCfg; + u32 I2Stemp; + + if (pI2SAdapter == 0) { + DBG_I2S_ERR("RtkI2SDeInit: Null Pointer\r\n"); + return HAL_ERR_PARA; + } + + pI2SCfg = pI2SAdapter->pInitDat; + + /*I2S Disable Module*/ + pI2SCfg->I2SEn = I2S_DISABLE; + pHalI2SOP->HalI2SEnable(pI2SCfg); + HalI2SClearAllOwnBit((VOID*)pI2SCfg); + + /*I2C HAL DeInitialization*/ + //pHalI2SOP->HalI2SDeInit(pI2SCfg); + + /*I2S Interrupt DeInitialization*/ + RtkI2SIrqDeInit(pI2SAdapter); + + /*I2S Pin Mux DeInitialization*/ + RtkI2SPinMuxDeInit(pI2SAdapter); + + /*I2S HAL DeInitialization*/ + pHalI2SOP->HalI2SDeInit(pI2SCfg); + + /*I2S CLK Source Close*/ + I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) & (~((1<<9) | (1<<10))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp); + + /*I2S Device Status Update*/ + pI2SAdapter->DevSts = I2S_STS_UNINITIAL; + + return HAL_OK; +} + +HAL_Status +RtkI2SEnable( + IN VOID *Data +) +{ + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; + PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL; + PHAL_I2S_INIT_DAT pI2SCfg; + u32 I2Stemp; + + // Enable IP Clock + I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) | (1<<9) | (1<<10); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp); + ACTCK_I2S_CCTRL(ON); + SLPCK_I2S_CCTRL(ON); + + pI2SCfg = pI2SAdapter->pInitDat; + pI2SCfg->I2SEn = I2S_ENABLE; + pHalI2SOP->HalI2SEnable(pI2SCfg); + + return HAL_OK; +} + +HAL_Status +RtkI2SDisable( + IN VOID *Data +) +{ + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; + PHAL_I2S_OP pHalI2SOP = &HalI2SOpSAL; + PHAL_I2S_INIT_DAT pI2SCfg; + u32 I2Stemp; + + pI2SCfg = pI2SAdapter->pInitDat; + pI2SCfg->I2SEn = I2S_DISABLE; + pHalI2SOP->HalI2SEnable(pI2SCfg); + + // Gate IP Clock + ACTCK_I2S_CCTRL(OFF); + SLPCK_I2S_CCTRL(OFF); + + // Close I2S bus clock(WS,SCLK,MCLK). If needs that clock, mark this. + I2Stemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1) & (~((1<<9) | (1<<10))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL1, I2Stemp); + + return HAL_OK; +} + +RTK_STATUS +RtkI2SIoCtrl( + IN VOID *Data +) +{ + return _EXIT_SUCCESS; +} + +RTK_STATUS +RtkI2SPowerCtrl( + IN VOID *Data +) +{ + return _EXIT_SUCCESS; +} + +HAL_Status +RtkI2SLoadDefault( + IN VOID *Adapter, + IN VOID *Setting +) +{ + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Adapter; + PHAL_I2S_INIT_DAT pI2SCfg = pI2SAdapter->pInitDat; + PHAL_I2S_DEF_SETTING pLoadSetting = (PHAL_I2S_DEF_SETTING)Setting; + + if (pI2SAdapter == 0) { + DBG_I2S_ERR("RtkI2SLoadDefault: Null Pointer\r\n"); + return HAL_ERR_PARA; + } + + if (pI2SAdapter->pInitDat == NULL) { + DBG_I2S_ERR("RtkI2SLoadDefault: pInitDat is NULL!\r\n", pI2SAdapter->DevNum); + return HAL_ERR_PARA; + } + + pI2SAdapter->DevSts = pLoadSetting->DevSts; + pI2SAdapter->ErrType = 0; + pI2SAdapter->TimeOut = 0; + + pI2SCfg->I2SIdx = pI2SAdapter->DevNum; + pI2SCfg->I2SEn = I2S_DISABLE; + pI2SCfg->I2SMaster = pLoadSetting->I2SMaster; + pI2SCfg->I2SWordLen = pLoadSetting->I2SWordLen; + pI2SCfg->I2SChNum = pLoadSetting->I2SChNum; + pI2SCfg->I2SPageNum = pLoadSetting->I2SPageNum; + pI2SCfg->I2SPageSize = pLoadSetting->I2SPageSize; + pI2SCfg->I2SRate = pLoadSetting->I2SRate; + pI2SCfg->I2STRxAct = pLoadSetting->I2STRxAct; + pI2SCfg->I2STxIntrMSK = pLoadSetting->I2STxIntrMSK; + pI2SCfg->I2SRxIntrMSK = pLoadSetting->I2SRxIntrMSK; + + return HAL_OK; +} + +VOID HalI2SOpInit( + IN VOID *Data +) +{ + PHAL_I2S_OP pHalI2SOp = (PHAL_I2S_OP) Data; + + pHalI2SOp->HalI2SInit = HalI2SInitRtl8195a_Patch; + pHalI2SOp->HalI2SDeInit = HalI2SDeInitRtl8195a; + pHalI2SOp->HalI2STx = HalI2STxRtl8195a; + pHalI2SOp->HalI2SRx = HalI2SRxRtl8195a; + pHalI2SOp->HalI2SEnable = HalI2SEnableRtl8195a; + pHalI2SOp->HalI2SIntrCtrl = HalI2SIntrCtrlRtl8195a; + pHalI2SOp->HalI2SReadReg = HalI2SReadRegRtl8195a; + pHalI2SOp->HalI2SSetRate = HalI2SSetRateRtl8195a; + pHalI2SOp->HalI2SSetWordLen = HalI2SSetWordLenRtl8195a; + pHalI2SOp->HalI2SSetChNum = HalI2SSetChNumRtl8195a; + pHalI2SOp->HalI2SSetPageNum = HalI2SSetPageNumRtl8195a; + pHalI2SOp->HalI2SSetPageSize = HalI2SSetPageSizeRtl8195a; + pHalI2SOp->HalI2SClrIntr = HalI2SClrIntrRtl8195a; + pHalI2SOp->HalI2SClrAllIntr = HalI2SClrAllIntrRtl8195a; + pHalI2SOp->HalI2SDMACtrl = HalI2SDMACtrlRtl8195a; +} + +HAL_Status +HalI2SInit( + IN VOID *Data +) +{ + HAL_Status ret; + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; + +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE I2sPwrState; +#endif + + ret = RtkI2SInit(Data); +#ifdef CONFIG_SOC_PS_MODULE + if(ret == HAL_OK) { + // To register a new peripheral device power state + I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum; + I2sPwrState.PwrState = ACT; + RegPowerState(I2sPwrState); + } +#endif + + return ret; + +} + +VOID +HalI2SDeInit( + IN VOID *Data +) +{ +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE I2sPwrState; + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; + u8 HwState; + + I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum; + QueryRegPwrState(I2sPwrState.FuncIdx, &(I2sPwrState.PwrState), &HwState); + + // if the power state isn't ACT, then switch the power state back to ACT first + if ((I2sPwrState.PwrState != ACT) && (I2sPwrState.PwrState != INACT)) { + HalI2SEnable(Data); + QueryRegPwrState(I2sPwrState.FuncIdx, &(I2sPwrState.PwrState), &HwState); + } + + if (I2sPwrState.PwrState == ACT) { + I2sPwrState.PwrState = INACT; + RegPowerState(I2sPwrState); + } +#endif + + RtkI2SDeInit(Data); + +} + + +HAL_Status +HalI2SDisable( + IN VOID *Data +) +{ + HAL_Status ret; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE I2sPwrState; + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; +#endif + + ret = RtkI2SDisable(Data); +#ifdef CONFIG_SOC_PS_MODULE + if (ret == HAL_OK) { + I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum; + I2sPwrState.PwrState = SLPCG; + RegPowerState(I2sPwrState); + } +#endif + return ret; +} + +HAL_Status +HalI2SEnable( + IN VOID *Data +) +{ + HAL_Status ret; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE I2sPwrState; + PHAL_I2S_ADAPTER pI2SAdapter = (PHAL_I2S_ADAPTER) Data; +#endif + + ret = RtkI2SEnable(Data); +#ifdef CONFIG_SOC_PS_MODULE + if (ret == HAL_OK) { + I2sPwrState.FuncIdx = I2S0 + pI2SAdapter->DevNum; + I2sPwrState.PwrState = ACT; + RegPowerState(I2sPwrState); + } +#endif + return ret; +} + diff --git a/lib/fwlib/src/hal_mii.c b/lib/fwlib/src/hal_mii.c new file mode 100644 index 0000000..e8520e6 --- /dev/null +++ b/lib/fwlib/src/hal_mii.c @@ -0,0 +1,42 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "hal_mii.h" + +VOID +HalMiiOpInit( + IN VOID *Data + ) +{ + PHAL_MII_OP pHalMiiOp = (PHAL_MII_OP) Data; + + pHalMiiOp->HalMiiGmacInit = HalMiiGmacInitRtl8195a; + pHalMiiOp->HalMiiInit = HalMiiInitRtl8195a; + pHalMiiOp->HalMiiGmacReset = HalMiiGmacResetRtl8195a; + pHalMiiOp->HalMiiGmacEnablePhyMode = HalMiiGmacEnablePhyModeRtl8195a; + pHalMiiOp->HalMiiGmacXmit = HalMiiGmacXmitRtl8195a; + pHalMiiOp->HalMiiGmacCleanTxRing = HalMiiGmacCleanTxRingRtl8195a; + pHalMiiOp->HalMiiGmacFillTxInfo = HalMiiGmacFillTxInfoRtl8195a; + pHalMiiOp->HalMiiGmacFillRxInfo = HalMiiGmacFillRxInfoRtl8195a; + pHalMiiOp->HalMiiGmacTx = HalMiiGmacTxRtl8195a; + pHalMiiOp->HalMiiGmacRx = HalMiiGmacRxRtl8195a; + pHalMiiOp->HalMiiGmacSetDefaultEthIoCmd = HalMiiGmacSetDefaultEthIoCmdRtl8195a; + pHalMiiOp->HalMiiGmacInitIrq = HalMiiGmacInitIrqRtl8195a; + pHalMiiOp->HalMiiGmacGetInterruptStatus = HalMiiGmacGetInterruptStatusRtl8195a; + pHalMiiOp->HalMiiGmacClearInterruptStatus = HalMiiGmacClearInterruptStatusRtl8195a; +#if 0 + pHalMiiOp-> = Rtl8195a; + pHalMiiOp-> = Rtl8195a; + pHalMiiOp-> = Rtl8195a; + pHalMiiOp-> = Rtl8195a; + pHalMiiOp-> = Rtl8195a; +#endif +} + diff --git a/lib/fwlib/src/hal_nfc.c b/lib/fwlib/src/hal_nfc.c new file mode 100644 index 0000000..bafa43e --- /dev/null +++ b/lib/fwlib/src/hal_nfc.c @@ -0,0 +1,20 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "hal_nfc.h" + +VOID HalNFCOpInit( + IN VOID *Data +) +{ + +} + diff --git a/lib/fwlib/src/hal_pcm.c b/lib/fwlib/src/hal_pcm.c new file mode 100644 index 0000000..5ccf96a --- /dev/null +++ b/lib/fwlib/src/hal_pcm.c @@ -0,0 +1,28 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "hal_pcm.h" + +VOID HalPcmOpInit( + IN VOID *Data +) +{ + PHAL_PCM_OP pHalPcmOp = (PHAL_PCM_OP) Data; + + pHalPcmOp->HalPcmOnOff = HalPcmOnOffRtl8195a; + pHalPcmOp->HalPcmInit = HalPcmInitRtl8195a; + pHalPcmOp->HalPcmSetting = HalPcmSettingRtl8195a; + pHalPcmOp->HalPcmEn = HalPcmEnRtl8195a; + pHalPcmOp->HalPcmIsrEnAndDis= HalPcmIsrEnAndDisRtl8195a; + pHalPcmOp->HalPcmDumpReg= HalPcmDumpRegRtl8195a; + pHalPcmOp->HalPcm= HalPcmRtl8195a; +} + + diff --git a/lib/fwlib/src/hal_pwm.c b/lib/fwlib/src/hal_pwm.c new file mode 100644 index 0000000..0e8432d --- /dev/null +++ b/lib/fwlib/src/hal_pwm.c @@ -0,0 +1,131 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" + +#ifdef CONFIG_PWM_EN +#include "hal_pwm.h" +#include "hal_timer.h" + +HAL_PWM_ADAPTER PWMPin[MAX_PWM_CTRL_PIN]; +const u8 PWMTimerIdx[MAX_PWM_CTRL_PIN]= {3,4,5,6}; // the G-timer ID used for PWM pin 0~3 + +/** + * @brief Initializes and enable a PWM control pin. + * + * @param pwm_id: the PWM pin index + * @param sel: pin mux selection + * + * @retval HAL_Status + */ +HAL_Status +HAL_Pwm_Init( + u32 pwm_id, + u32 sel +) +{ + HAL_PWM_ADAPTER *pPwmAdapt; + u32 timer_id; + + DBG_PWM_INFO("%s: Init PWM for PWM %d, Sel %d\n", __FUNCTION__, pwm_id, sel); + + if ((pwm_id >= MAX_PWM_CTRL_PIN) || (sel > 3)) { + DBG_PWM_ERR ("HAL_Pwm_Init: Invalid PWM index(%d), sel(%d)\n", pwm_id, sel); + return HAL_ERR_PARA; + } + + pPwmAdapt = &PWMPin[pwm_id]; + pPwmAdapt->pwm_id = pwm_id; + pPwmAdapt->sel = sel; + timer_id = PWMTimerIdx[pwm_id]; + pPwmAdapt->gtimer_id = timer_id; + + return HAL_Pwm_Init_8195a (pPwmAdapt); +} + + +/** + * @brief Disable a PWM control pin. + * + * @param pwm_id: the PWM pin index + * + * @retval None + */ +void +HAL_Pwm_Enable( + u32 pwm_id +) +{ + HAL_PWM_ADAPTER *pPwmAdapt; + + if (pwm_id >= MAX_PWM_CTRL_PIN) { + DBG_PWM_ERR ("HAL_Pwm_Enable: Invalid PWM index(%d)\n", pwm_id); + return; + } + pPwmAdapt = &PWMPin[pwm_id]; + + HAL_Pwm_Enable_8195a(pPwmAdapt); +} + + +/** + * @brief Disable a PWM control pin. + * + * @param pwm_id: the PWM pin index + * + * @retval None + */ +void +HAL_Pwm_Disable( + u32 pwm_id +) +{ + HAL_PWM_ADAPTER *pPwmAdapt; + + if (pwm_id >= MAX_PWM_CTRL_PIN) { + DBG_PWM_ERR ("HAL_Pwm_Disable: Invalid PWM index(%d)\n", pwm_id); + return; + } + pPwmAdapt = &PWMPin[pwm_id]; + + HAL_Pwm_Disable_8195a(pPwmAdapt); +} + +/** + * @brief Set the duty ratio of the PWM pin. + * + * @param pwm_id: the PWM pin index + * @param period: the period time, in micro-second. + * @param pulse_width: the pulse width time, in micro-second. + * + * @retval None + */ +void +HAL_Pwm_SetDuty( + u32 pwm_id, + u32 period, + u32 pulse_width +) +{ + HAL_PWM_ADAPTER *pPwmAdapt; + + if (pwm_id >= MAX_PWM_CTRL_PIN) { + DBG_PWM_ERR ("HAL_Pwm_SetDuty: Invalid PWM index(%d)\n", pwm_id); + return; + } + +// DBG_PWM_INFO("%s: Period%d Pulse%d\n", __FUNCTION__, period, pulse_width); + pPwmAdapt = &PWMPin[pwm_id]; + + HAL_Pwm_SetDuty_8195a(pPwmAdapt, period, pulse_width); +} + + +#endif // end of "#ifdef CONFIG_PWM_EN" diff --git a/lib/fwlib/src/hal_sdr_controller.c b/lib/fwlib/src/hal_sdr_controller.c new file mode 100644 index 0000000..4d939a7 --- /dev/null +++ b/lib/fwlib/src/hal_sdr_controller.c @@ -0,0 +1,971 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#include "rtl8195a.h" +#include "hal_sdr_controller.h" +#include "rtl8195a_sdr.h" +#if 0 +#define HAL_SDR_WRITE32(addr, value32) HAL_WRITE32(SDR_CTRL_BASE, addr, value32) +#define HAL_SDR_WRITE16(addr, value16) HAL_WRITE16(SDR_CTRL_BASE, addr, value16) +#define HAL_SDR_WRITE8(addr, value8) HAL_WRITE8(SDR_CTRL_BASE, addr, value8) +#define HAL_SDR_READ32(addr) HAL_READ32(SDR_CTRL_BASE, addr) +#define HAL_SDR_READ16(addr) HAL_READ16(SDR_CTRL_BASE, addr) +#define HAL_SDR_READ8(addr) HAL_READ8(SDR_CTRL_BASE, addr) + +#define HAL_SDRAM_WRITE32(addr, value32) HAL_WRITE32(SDR_SDRAM_BASE, addr, value32) +#define HAL_SDRAM_WRITE16(addr, value16) HAL_WRITE16(SDR_SDRAM_BASE, addr, value16) +#define HAL_SDRAM_WRITE8(addr, value8) HAL_WRITE8(SDR_SDRAM_BASE, addr, value8) +#define HAL_SDRAM_READ32(addr) HAL_READ32(SDR_SDRAM_BASE, addr) +#define HAL_SDRAM_READ16(addr) HAL_READ16(SDR_SDRAM_BASE, addr) +#define HAL_SDRAM_READ8(addr) HAL_READ8(SDR_SDRAM_BASE, addr) +#endif + + + +HAL_CUT_B_RAM_DATA_SECTION +DRAM_INFO SdrDramDev = { + DRAM_INFO_TYPE, + DRAM_INFO_COL_ADDR_WTH, + DRAM_INFO_BANK_SZ, + DRAM_INFO_DQ_WTH +}; + + +HAL_CUT_B_RAM_DATA_SECTION +DRAM_MODE_REG_INFO SdrDramModeReg = { + BST_LEN_4, + SENQUENTIAL, + 0x3, // Mode0Cas: 3 + 0x0, // Mode0Wr + 0, // Mode1DllEnN + 0, // Mode1AllLat + 0 // Mode2Cwl +}; + +HAL_CUT_B_RAM_DATA_SECTION +DRAM_TIMING_INFO SdrDramTiming = { + DRAM_TIMING_TRFC, // TrfcPs; + DRAM_TIMING_TREFI, // TrefiPs; + DRAM_TIMING_TWRMAXTCK, // WrMaxTck; + DRAM_TIMING_TRCD, // TrcdPs; + DRAM_TIMING_TRP, // TrpPs; + DRAM_TIMING_TRAS, // TrasPs; + DRAM_TIMING_TRRD, // TrrdTck; + DRAM_TIMING_TWR, // TwrPs; + DRAM_TIMING_TWTR, // TwtrTck; + //13090, // TrtpPs; + DRAM_TIMING_TMRD, // TmrdTck; + DRAM_TIMING_TRTP, // TrtpTck; + DRAM_TIMING_TCCD, // TccdTck; + DRAM_TIMING_TRC // TrcPs; +}; + +HAL_CUT_B_RAM_DATA_SECTION +DRAM_DEVICE_INFO SdrDramInfo = { + &SdrDramDev, + &SdrDramModeReg, + &SdrDramTiming, + DRAM_TIMING_TCK, + DFI_RATIO_1 +}; + + +#define FPGA +#define FPGA_TEMP +#define SDR_CLK_DLY_CTRL 0x40000300 +#define MIN_RD_PIPE 0x0 +#define MAX_RD_PIPE 0x7 + +#define SUPPORT_DRAM_KED + + +#ifdef FPGA +#ifdef FPGA_TEMP +#define MAX_TAP_DLY 0xC +#else +#define MAX_TAP_DLY 0x7F +#define SPEC_MAX_TAP 0xFF +#endif +#else +#define MAX_TAP_DLY 99 // 0~99 +#define SPEC_MAX_TAP 99 +#define WINDOW_COMBIN // combine window [0~a] and [b~99] (for asic mode) +#endif + +#define TAP_DLY 0x1 +#define REC_NUM 512 + + +u32 SdrControllerInit(VOID); +VOID DramInit(DRAM_DEVICE_INFO *); +s32 MemTest(u32 loop_cnt); +u32 SdrCalibration(VOID); +u32 Sdr_Rand2(VOID); + +//3 Note: stack overfloat if the arrary is declared in the task +HAL_CUT_B_RAM_DATA_SECTION +u32 AvaWds[2][REC_NUM]; + +HAL_CUT_B_RAM_DATA_SECTION +unsigned int rand_x = 123456789; + +#ifdef CONFIG_SDR_EN + +#ifdef CONFIG_SDR_VERIFY +enum{ + LLT, + TXRPT, + RXBUFF, + TXBUFF, +}; +#define REPORT_OFFSET 0x8000 +#define RAMASK_OFFSET 0x8800 +#define LLT_H_ADDR 0x650 +#define TXREPORT_H_ADDR 0x660 +#define RXBUFF_H_ADDR 0x670 +#define TXBUFF_H_ADDR 0x680 + +#define REG_PKTBUF_DBG_CTRL_8723B 0x0140 + +int +rt_rpt_h_addr(u8 rpt) +{ + u32 r_val, offset; + + if (rpt == LLT){ + offset = LLT_H_ADDR; + } + else if (rpt == TXRPT){ + offset = TXREPORT_H_ADDR; + } + else if (rpt == RXBUFF){ + offset = RXBUFF_H_ADDR; + } + else if (rpt == TXBUFF){ + offset = TXBUFF_H_ADDR; + } + else { + } + + r_val = ((HAL_READ32(WIFI_REG_BASE, REG_PKTBUF_DBG_CTRL_8723B)&0xFFFFF000)|offset); + HAL_WRITE32(WIFI_REG_BASE, REG_PKTBUF_DBG_CTRL_8723B, r_val); +} + + + +int +rt_txrpt_read32(u8 macid, u8 offset) +{ + u32 r_val; + + rt_rpt_h_addr(TXRPT); + r_val = HAL_READ32(WIFI_REG_BASE, (REPORT_OFFSET + macid*4 + offset)); + + return r_val; +} + +int +rt_txrpt_read16(u8 macid, u8 offset) +{ + u16 r_val; + + rt_rpt_h_addr(TXRPT); + r_val = HAL_READ16(WIFI_REG_BASE, (REPORT_OFFSET + macid*8 + offset)); + + return r_val; +} + +int +rt_txrpt_read8(u8 macid, u8 offset) +{ + u8 r_val; + + rt_rpt_h_addr(TXRPT); + r_val = HAL_READ8(WIFI_REG_BASE, (REPORT_OFFSET + macid*16 + offset)); + + return r_val; +} + +int +rt_txrpt_read_1b(u8 macid, u8 offset, u8 bit_offset) +{ + u8 r_val = ((rt_txrpt_read8(macid, offset) & BIT(bit_offset))?1:0); + + return r_val; +} + + +int +rt_txrpt_write32(u8 macid, u8 offset, u32 val) +{ + rt_rpt_h_addr(TXRPT); + HAL_WRITE32(WIFI_REG_BASE, (REPORT_OFFSET + macid*4 + offset), val); +} + +int +rt_txrpt_write16(u8 macid, u8 offset, u16 val) +{ + rt_rpt_h_addr(TXRPT); + HAL_WRITE16(WIFI_REG_BASE, (REPORT_OFFSET + macid*8 + offset), val); +} + +int +rt_txrpt_write8(u8 macid, u8 offset, u8 val) +{ + rt_rpt_h_addr(TXRPT); + DBG_8195A("Write addr %x %x\n", (REPORT_OFFSET + macid*16 + offset), val); + HAL_WRITE8(WIFI_REG_BASE, (REPORT_OFFSET + macid*16 + offset), val); +} + +int +rt_txrpt_write_1b(u8 macid, u8 offset, u8 bit_offset, u8 val) +{ + u8 r_val = rt_txrpt_read8(macid, offset); + + if (val){ + r_val |= BIT(bit_offset); + } + else { + r_val &= (~BIT(bit_offset)); + } + + HAL_WRITE8(WIFI_REG_BASE, (REPORT_OFFSET + macid*16 + offset), r_val); +} + + +u8 +ReadTxrptsdr8( + IN u8 Macid, + IN u8 Offset) +{ + u8 r_val; + + r_val = rt_txrpt_read8(Macid, Offset); + return r_val; +} + +VOID +WriteTxrptsdr8( + IN u8 Macid, + IN u8 Offset, + IN u8 Val) +{ + rt_txrpt_write8(Macid, Offset, Val); +} + +VOID +SdrTestApp( + IN VOID *Data +) +{ + u32 *Cmd =(u32*)Data; + u32 Loop, LoopIndex, Value32, Addr, Loop1, LoopIndex1; + + switch (Cmd[0]) { + case 1: + DBG_8195A("Initial SDR\n"); + + //1 "SdrControllerInit" is located in Image1, so we shouldn't call it in Image2 + if (!SdrControllerInit()) { + DBG_8195A("SDR Calibartion Fail!!!!\n"); + } + break; + case 2: + Loop = Cmd[1]; + Loop1 = Cmd[2]; + DBG_8195A("Verify SDR: Loop = 0x%08x Loop1 = 0x%08x\n",Loop, Loop1); + + for (LoopIndex1=0; LoopIndex1 < Loop1; LoopIndex1++) { + + for (LoopIndex=0; LoopIndex < Loop; LoopIndex++) { + Value32 = Rand2(); + Addr = Rand2(); + Addr &= 0x1FFFFF; + Addr &= (~0x3); + + if (!(LoopIndex & 0xFFFFF)) { + DBG_8195A("Alive: LOOP = 0x%08x, LOOP = 0x%08x\n",LoopIndex1, LoopIndex); + } + + // DBG_8195A("Value: 0x%x; Addr: 0x%x\n", Value32, Addr+SDR_SDRAM_BASE); + HAL_SDRAM_WRITE32(Addr, Value32); + + if (Value32 != HAL_SDRAM_READ32(Addr)) { + DBG_8195A("Loop:%d; Addr: 0x%08x => CheckData error: W: 0x%08x /R:0x%x\n" + ,LoopIndex + ,Addr + ,Value32 + ,HAL_SDRAM_READ32(Addr)); + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSTBY_INFO2, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSTBY_INFO2)+1); + break; + } + } + } + DBG_8195A("Verify SDR Success\n"); + break; + + case 3: + DBG_8195A("WL read RPT MACID %x\n", Cmd[1]); + { + u8 i =0; + for(i=0;i<16;i++) { + DBG_8195A("WL RPT offset %d = %x\n", i, ReadTxrptsdr8(Cmd[1],i)); + } + } + break; + case 4: + DBG_8195A("WL write RPT MACID %x\n", Cmd[1]); + { + u8 i =0; + for(i=0;i<16;i++) { + WriteTxrptsdr8(Cmd[1],i,Cmd[2]); + //DBG_8195A("WL RPT offset %d = %x\n", i, ReadTxrptsdr8(Cmd[1],i)); + } + } + break; + default: + break; + } + +} + +#endif + +HAL_SDRC_TEXT_SECTION +VOID +SdrCtrlInit( +VOID +){ + HAL_WRITE32(0x40000000, 0x40, + ((HAL_READ32(0x40000000, 0x40)&0xfffff)|0xe00000)); + LDO25M_CTRL(ON); +} + +HAL_SDRC_TEXT_SECTION +u32 +SdrControllerInit( +VOID +) +{ + DBG_8195A("SDR Controller Init\n"); + + HAL_WRITE32(0x40000000, 0x40, + ((HAL_READ32(0x40000000, 0x40)&0xfffff)|0x300000)); + + SRAM_MUX_CFG(0x2); + + SDR_CLK_SEL(SDR_CLOCK_SEL_VALUE); + + HAL_PERI_ON_WRITE32(REG_GPIO_PULL_CTRL4,0); + + ACTCK_SDR_CCTRL(ON); + + SLPCK_SDR_CCTRL(ON); + + PinCtrl(SDR, 0, ON); + + HAL_PERI_ON_WRITE32(REG_GPIO_PULL_CTRL4,0); + + MEM_CTRL_FCTRL(ON); + + HalDelayUs(3000); + + // sdr initialization + DramInit(&SdrDramInfo); + + // sdr calibration + if(!SdrCalibration()) { + return 0; + } + else { + return 1; + } +} + + +HAL_SDRC_TEXT_SECTION +VOID +DramInit ( + IN DRAM_DEVICE_INFO *DramInfo +) +{ + u32 CsBstLen = 0; // 0:bst_4, 1:bst_8 + u32 CasWr = 0;//, CasWrT; // cas write latency + u32 CasRd = 0, CasRdT = 0, CrlSrt = 0; // cas read latency + u32 AddLat; + u32 DramEmr2 = 0, DramMr0 = 0; + u32 CrTwr, DramMaxWr, DramWr; + u32 CrTrtw = 0, CrTrtwT = 0; + u32 DrmaPeriod; + DRAM_TYPE DdrType; + DRAM_DQ_WIDTH DqWidth; + DRAM_COLADDR_WTH Page; + u32 DfiRate; + volatile struct ms_rxi310_portmap *ms_ctrl_0_map; + ms_ctrl_0_map = (struct ms_rxi310_portmap*) SDR_CTRL_BASE; + ms_ctrl_0_map = ms_ctrl_0_map; + + DfiRate = 1 << (u32) (DramInfo->DfiRate); + DrmaPeriod = (DramInfo->DdrPeriodPs)*(DfiRate); // according DFI_RATE to setting + + // In PHY, write latency == 3 + DramMaxWr= (DramInfo->Timing->WrMaxTck)/(DfiRate) +1; + DramWr = ((DramInfo->Timing->TwrPs) / DrmaPeriod)+1; + CrTwr = ((DramInfo->Timing->TwrPs) / DrmaPeriod) + 3; + + if (CrTwr < DramMaxWr) { + CrTwr = CrTwr; + } + else { + CrTwr = DramMaxWr; + } + + if ((DramInfo->Dev->DeviceType) == DRAM_DDR_2) { + DdrType = DRAM_DDR_2; + if (DramInfo->ModeReg->BstLen == BST_LEN_4) { + CsBstLen = 0; //bst_4 + CrTrtwT = 2+2; //4/2+2 + DramMr0 = 0x2; + } + else { // BST_LEN_8 + CsBstLen = 1; // bst_8 + CrTrtwT = 4+2; // 8/2+2 + DramMr0 = 0x3; + } + CasRd = DramInfo->ModeReg->Mode0Cas; + AddLat = DramInfo->ModeReg ->Mode1AllLat; + CasWr = CasRd + AddLat -1; + DramEmr2 = 0; + + DramMr0 =(((DramWr%6)-1) << (PCTL_MR_OP_BFO+1)) | // write_recovery + (0 << PCTL_MR_OP_BFO ) | // dll + (DramInfo->ModeReg->Mode0Cas << PCTL_MR_CAS_BFO ) | + (DramInfo->ModeReg->BstType << PCTL_MR_BT_BFO ) | + DramMr0; + } + else if ((DramInfo->Dev->DeviceType) == DRAM_DDR_3) { + DdrType = DRAM_DDR_3; + if (DramInfo->ModeReg->BstLen == BST_LEN_4) { + CsBstLen = 0; //bst_4 + DramMr0 = 0x2; + } + else { // BST_LEN_8 + CsBstLen = 1; // bst_8 + DramMr0 = 0x0; + } + + CrlSrt = (DramInfo->ModeReg->Mode0Cas >> 1); + if (((DramInfo->ModeReg->Mode0Cas) & 0x1) ) { + CasRdT = CrlSrt+ 12; + } + else { + CasRdT = CrlSrt+ 4; + } + + if (DramInfo->ModeReg->Mode1AllLat == 1) { // CL-1 + AddLat = CasRd -1; + } + else if (DramInfo->ModeReg->Mode1AllLat == 2){ // CL-2 + AddLat = CasRd -2; + } + else { + AddLat = 0; + } + + CasRd = CasRdT + AddLat; + + CasWr = DramInfo->ModeReg->Mode2Cwl + 5 + AddLat; + + DramEmr2 = DramInfo->ModeReg->Mode2Cwl << 3; + + if (DramWr == 16) { + DramWr = 0; + } + else if (DramWr <= 9) { // 5< wr <= 9 + DramWr = DramWr - 4; + } + else { + DramWr = (DramWr + 1) / 2; + } + + DramMr0 =(DramWr << (PCTL_MR_OP_BFO+1) ) | // write_recovery + (0 << PCTL_MR_OP_BFO ) | // dll + ((DramInfo->ModeReg->Mode0Cas >>1 ) << PCTL_MR_CAS_BFO ) | + (DramInfo->ModeReg->BstType << PCTL_MR_BT_BFO ) | + ((DramInfo->ModeReg->Mode0Cas & 0x1) << 2 ) | + DramMr0; + + CrTrtwT = (CasRdT + 6) - CasWr; + + } // ddr2/ddr3 + else if ((DramInfo->Dev->DeviceType) == DRAM_SDR) { + DdrType = DRAM_SDR; + if (DramInfo->ModeReg->BstLen == BST_LEN_4) { + DramMr0 = 2; // bst_4 + CsBstLen = 0; //bst_4 + CasRd = 0x2; + } + else { // BST_LEN_8 + DramMr0 = 3; // bst_8 + CsBstLen = 1; // bst_8 + CasRd = 0x3; + } + + CasWr = 0; + + DramMr0 =(CasRd << PCTL_MR_CAS_BFO) | + (DramInfo->ModeReg->BstType << PCTL_MR_BT_BFO ) | + DramMr0; + + CrTrtwT = 0; // tic: CasRd + rd_rtw + rd_pipe + } // SDR + + + // countting tRTW + if ((CrTrtwT & 0x1)) { + CrTrtw = (CrTrtwT+1) /(DfiRate); + } + else { + CrTrtw = CrTrtwT /(DfiRate); + } + + DqWidth = (DramInfo->Dev->DqWidth); + Page = DramInfo->Dev->ColAddrWth +1; // DQ16 -> memory:byte_unit *2 + if (DqWidth == DRAM_DQ_32) { // paralle dq_16 => Page + 1 + Page = Page +1; + } +#if 1 + + // WRAP_MISC setting + HAL_SDR_WRITE32(REG_SDR_MISC,( + (Page << WRAP_MISC_PAGE_SIZE_BFO) | + (DramInfo->Dev->Bank << WRAP_MISC_BANK_SIZE_BFO) | + (CsBstLen << WRAP_MISC_BST_SIZE_BFO ) | + (DqWidth << WRAP_MISC_DDR_PARAL_BFO) + )); + // PCTL setting + HAL_SDR_WRITE32(REG_SDR_DCR,( + (0x2 << PCTL_DCR_DFI_RATE_BFO) | + (DqWidth << PCTL_DCR_DQ32_BFO ) | + (DdrType << PCTL_DCR_DDR3_BFO ) + )); + + HAL_SDR_WRITE32(REG_SDR_IOCR,( + ((CasRd -4)/(DfiRate) << PCTL_IOCR_TPHY_RD_EN_BFO ) | + (0 << PCTL_IOCR_TPHY_WL_BFO ) | + (((CasWr -3)/(DfiRate)) << PCTL_IOCR_TPHY_WD_BFO ) | + (0 << PCTL_IOCR_RD_PIPE_BFO ) + )); + + if ((DramInfo->Dev->DeviceType) != SDR) { // DDR2/3 + HAL_SDR_WRITE32(REG_SDR_EMR2,DramEmr2); + HAL_SDR_WRITE32(REG_SDR_EMR1,( + (1 << 2 ) | //RTT + (1 << 1 ) | //D.I.C + (DramInfo->ModeReg->Mode1DllEnN ) + )); + } // DDR2/3 + + HAL_SDR_WRITE32(REG_SDR_MR,DramMr0); + + HAL_SDR_WRITE32(REG_SDR_DRR, ( + (0 << PCTL_DRR_REF_DIS_BFO) | + (9 << PCTL_DRR_REF_NUM_BFO) | + ((((DramInfo->Timing->TrefiPs)/DrmaPeriod)+1) << PCTL_DRR_TREF_BFO ) | + ((((DramInfo->Timing->TrfcPs)/DrmaPeriod)+1) << PCTL_DRR_TRFC_BFO ) + )); + + HAL_SDR_WRITE32(REG_SDR_TPR0,( + ((((DramInfo->Timing->TrtpTck)/DfiRate)+1) << PCTL_TPR0_TRTP_BFO) | + (CrTwr << PCTL_TPR0_TWR_BFO ) | + ((((DramInfo->Timing->TrasPs)/DrmaPeriod)+1) << PCTL_TPR0_TRAS_BFO) | + ((((DramInfo->Timing->TrpPs)/DrmaPeriod)+1) << PCTL_TPR0_TRP_BFO ) + )); + + HAL_SDR_WRITE32(REG_SDR_TPR1, ( + (CrTrtw << PCTL_TPR1_TRTW_BFO) | + ((((DramInfo->Timing->TwtrTck)/DfiRate)+3) << PCTL_TPR1_TWTR_BFO) | + ((((DramInfo->Timing->TccdTck)/DfiRate)+1) << PCTL_TPR1_TCCD_BFO) | + ((((DramInfo->Timing->TrcdPs)/DrmaPeriod)+1) << PCTL_TPR1_TRCD_BFO) | + ((((DramInfo->Timing->TrcPs)/DrmaPeriod)+1) << PCTL_TPR1_TRC_BFO ) | + (((DramInfo->Timing->TrrdTck/DfiRate)+1) << PCTL_TPR1_TRRD_BFO) + )); + + HAL_SDR_WRITE32(REG_SDR_TPR2, ( + (DramInfo->Timing->TmrdTck << PCTL_TPR2_TMRD_BFO ) | + (0 << PCTL_TPR2_INIT_NS_EN_BFO ) | + (2 << PCTL_TPR2_INIT_REF_NUM_BFO) + )); + + // set all_mode _idle + HAL_SDR_WRITE32(REG_SDR_CSR,0x700); + + // start to init + HAL_SDR_WRITE32(REG_SDR_CCR,0x01); + while ((HAL_SDR_READ32(REG_SDR_CCR)& 0x1) == 0x0); + + // enter mem_mode + HAL_SDR_WRITE32(REG_SDR_CSR,0x600); +#else + // WRAP_MISC setting + ms_ctrl_0_map->misc = //0x12; + ( + (Page << WRAP_MISC_PAGE_SIZE_BFO) | + (DramInfo->Dev->Bank << WRAP_MISC_BANK_SIZE_BFO) | + (CsBstLen << WRAP_MISC_BST_SIZE_BFO ) | + (DqWidth << WRAP_MISC_DDR_PARAL_BFO) + ); + // PCTL setting + ms_ctrl_0_map->dcr = //0x208; + ( + (0x2 << PCTL_DCR_DFI_RATE_BFO) | + (DqWidth << PCTL_DCR_DQ32_BFO ) | + (DdrType << PCTL_DCR_DDR3_BFO ) + ); + + ms_ctrl_0_map->iocr = ( + ((CasRd -4)/(DfiRate) << PCTL_IOCR_TPHY_RD_EN_BFO ) | + (0 << PCTL_IOCR_TPHY_WL_BFO ) | + (((CasWr -3)/(DfiRate)) << PCTL_IOCR_TPHY_WD_BFO ) | + (0 << PCTL_IOCR_RD_PIPE_BFO ) + ); + + if ((DramInfo->Dev->DeviceType) != SDR) { // DDR2/3 + ms_ctrl_0_map->emr2 = DramEmr2; + + ms_ctrl_0_map->emr1 = ( + (1 << 2 ) | //RTT + (1 << 1 ) | //D.I.C + (DramInfo->ModeReg->Mode1DllEnN ) + ); + } // DDR2/3 + + ms_ctrl_0_map->mr = DramMr0; + + ms_ctrl_0_map->drr = ( + (0 << PCTL_DRR_REF_DIS_BFO) | + (9 << PCTL_DRR_REF_NUM_BFO) | + ((((DramInfo->Timing->TrefiPs)/DrmaPeriod)+1)<< PCTL_DRR_TREF_BFO ) | + ((((DramInfo->Timing->TrfcPs)/DrmaPeriod)+1) << PCTL_DRR_TRFC_BFO ) + ); + + ms_ctrl_0_map->tpr0= ( + ((((DramInfo->Timing->TrtpTck)/DfiRate)+1) << PCTL_TPR0_TRTP_BFO) | + (CrTwr << PCTL_TPR0_TWR_BFO ) | + ((((DramInfo->Timing->TrasPs)/DrmaPeriod)+1) << PCTL_TPR0_TRAS_BFO) | + ((((DramInfo->Timing->TrpPs)/DrmaPeriod)+1) << PCTL_TPR0_TRP_BFO ) + ); + + ms_ctrl_0_map->tpr1= ( + (CrTrtw << PCTL_TPR1_TRTW_BFO) | + ((((DramInfo->Timing->TwtrTck)/DfiRate)+3) << PCTL_TPR1_TWTR_BFO) | + ((((DramInfo->Timing->TccdTck)/DfiRate)+1) << PCTL_TPR1_TCCD_BFO) | + ((((DramInfo->Timing->TrcdPs)/DrmaPeriod)+1) << PCTL_TPR1_TRCD_BFO) | + ((((DramInfo->Timing->TrcPs)/DrmaPeriod)+1) << PCTL_TPR1_TRC_BFO ) | + (((DramInfo->Timing->TrrdTck/DfiRate)+1) << PCTL_TPR1_TRRD_BFO) + ); + + ms_ctrl_0_map->tpr2= ( + (DramInfo->Timing->TmrdTck << PCTL_TPR2_TMRD_BFO ) | + (0 << PCTL_TPR2_INIT_NS_EN_BFO ) | + (2 << PCTL_TPR2_INIT_REF_NUM_BFO) + ); + // set all_mode _idle + ms_ctrl_0_map->csr = 0x700; + + // start to init + ms_ctrl_0_map->ccr = 0x1; + while (((ms_ctrl_0_map->ccr)& 0x1) == 0x0); + + // enter mem_mode + ms_ctrl_0_map->csr= 0x600; +#endif +} // DramInit + + //3 +extern void * +_memset( void *s, int c, SIZE_T n ); + +HAL_SDRC_TEXT_SECTION +u32 +SdrCalibration( + VOID +) +{ +#ifdef FPGA +#ifdef FPGA_TEMP +// u32 Value32; +#endif +#else +// u32 Value32; +#endif + u32 RdPipe = 0, TapCnt = 0, Pass = 0, AvaWdsCnt = 0; + u32 RdPipeCounter, RecNum[2], RecRdPipe[2];//, AvaWds[2][REC_NUM]; + BOOL RdPipeFlag, PassFlag = 0, Result; + + Result = _FALSE; + +#ifdef SUPPORT_DRAM_KED + // read calibration data from system data 0x5d~0x6c + SPIC_INIT_PARA SpicInitPara; + u32 valid; + union { u8 b[4]; u32 l;} value; + u32 CpuType = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1) & (0x70)) >> 4); + + valid = RdPipe = TapCnt = 0xFFFFFFFF; + value.l = HAL_READ32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType); + if((value.b[0]^value.b[1])==0xFF) + valid = value.b[0]; + //DiagPrintf("dump1 %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]); + value.l = HAL_READ32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType+4); + if((value.b[0]^value.b[1])==0xFF) + RdPipe = value.b[0]; + if((value.b[2]^value.b[3])==0xFF) + TapCnt = value.b[2]; + //DiagPrintf("dump2 %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]); + + if((valid==1)&&(RdPipe!=0xFFFFFFFF)&&(TapCnt!=0xFFFFFFFF)){ + // wait DRAM settle down + HalDelayUs(10); + // load previous dram Ked data + HAL_SDR_WRITE32(REG_SDR_IOCR, ((HAL_SDR_READ32(REG_SDR_IOCR) & 0xff) | (RdPipe << PCTL_IOCR_RD_PIPE_BFO))); + SDR_DDL_FCTRL(TapCnt); + if(MemTest(3)) + return _TRUE; + } +#endif + + _memset((u8*)AvaWds, 0, sizeof(u32)*REC_NUM*2); + + volatile struct ms_rxi310_portmap *ms_ctrl_0_map; + ms_ctrl_0_map = (struct ms_rxi310_portmap*) SDR_CTRL_BASE; + ms_ctrl_0_map = ms_ctrl_0_map; + PassFlag = PassFlag; + RdPipeCounter =0; + +// DBG_8195A("%d\n",__LINE__); + + for(RdPipe=MIN_RD_PIPE; RdPipe<=MAX_RD_PIPE; RdPipe++) { +// ms_ctrl_0_map->iocr = (ms_ctrl_0_map->iocr & 0xff) | (RdPipe << PCTL_IOCR_RD_PIPE_BFO); + HAL_SDR_WRITE32(REG_SDR_IOCR, ((HAL_SDR_READ32(REG_SDR_IOCR) & 0xff) | (RdPipe << PCTL_IOCR_RD_PIPE_BFO))); + + DBG_SDR_INFO("IOCR: 0x%x; Write: 0x%x\n",HAL_SDR_READ32(REG_SDR_IOCR), (RdPipe << PCTL_IOCR_RD_PIPE_BFO)); +// DBG_8195A("IOCR: 0x%x; Write: 0x%x\n",ms_ctrl_0_map->iocr, (RdPipe << PCTL_IOCR_RD_PIPE_BFO)); + + RdPipeFlag = _FALSE; + PassFlag = _FALSE; + AvaWdsCnt = 0; + + for(TapCnt=0; TapCnt < (MAX_TAP_DLY+1); TapCnt++) { + // Modify clk delay +#ifdef FPGA +#ifdef FPGA_TEMP + SDR_DDL_FCTRL(TapCnt); +// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF); +// Value32 = (Value32 | (TapCnt << 16)); +// WR_DATA(SDR_CLK_DLY_CTRL, Value32); +#else + HAL_SDR_WRITE32(REG_SDR_DLY0, TapCnt); +// ms_ctrl_0_map->phy_dly0 = TapCnt; +#endif + DBG_SDR_INFO("DLY: 0x%x; Write: 0x%x\n",HAL_PERI_ON_READ32(REG_PESOC_MEM_CTRL), TapCnt); +#else + SDR_DDL_FCTRL(TapCnt); +// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF); +// Value32 = (Value32 | (TapCnt << 16)); +// WR_DATA(SDR_CLK_DLY_CTRL, Value32); +#endif + + Pass = MemTest(10000); + PassFlag = _FALSE; + + if(Pass==_TRUE) { // PASS + + if (!RdPipeFlag) { + DBG_SDR_INFO("%d Time Pass\n", RdPipeCounter); + RdPipeCounter++; + RdPipeFlag = _TRUE; + RecRdPipe[RdPipeCounter - 1] = RdPipe; + } + + AvaWds[RdPipeCounter-1][AvaWdsCnt] = TapCnt; + AvaWdsCnt++; + + RecNum[RdPipeCounter-1] = AvaWdsCnt; + + if((TapCnt+TAP_DLY)>=MAX_TAP_DLY) { + break; + } + + PassFlag = _TRUE; + + DBG_SDR_INFO("Verify Pass => RdPipe:%d; TapCnt: %d\n", RdPipe, TapCnt); + + } + else { // FAIL +// if(PassFlag==_TRUE) { +// break; +// } +// else { + if (RdPipeCounter > 0) { + RdPipeCounter++; + if (RdPipeCounter < 3) { + RecNum[RdPipeCounter-1] = 0; + RecRdPipe[RdPipeCounter - 1] = RdPipe; + } + break; + } +// } + } + } + + + if (RdPipeCounter > 2) { + u8 BestRangeIndex, BestIndex; + + #ifdef CONFIG_SDR_VERIFY //to reduce log + u32 i; + DBG_SDR_INFO("Avaliable RdPipe 0\n"); + + for (i=0;i<256;i++) { + DBG_SDR_INFO("%d\n", AvaWds[0][i]); + } + DBG_SDR_INFO("Avaliable RdPipe 1\n"); + for (i=0;i<256;i++) { + DBG_SDR_INFO("%d\n", AvaWds[1][i]); + } + #endif + + DBG_SDR_INFO("Rec 0 => total counter %d; RdPipe:%d;\n", RecNum[0], RecRdPipe[0]); + DBG_SDR_INFO("Rec 1 => total counter %d; RdPipe:%d;\n", RecNum[1], RecRdPipe[1]); + + BestRangeIndex = (RecNum[0] > RecNum[1]) ? 0 : 1; + + BestIndex = RecNum[BestRangeIndex]>>1; + + DBG_SDR_INFO("The Finial RdPipe: %d; TpCnt: 0x%x\n", RecRdPipe[BestRangeIndex], AvaWds[BestRangeIndex][BestIndex]); + + // set RdPipe and tap_dly +// ms_ctrl_0_map->iocr = (ms_ctrl_0_map->iocr & 0xff) | (RecRdPipe[BestRangeIndex] << PCTL_IOCR_RD_PIPE_BFO); + HAL_SDR_WRITE32(REG_SDR_IOCR, ((HAL_SDR_READ32(REG_SDR_IOCR) & 0xff) | (RecRdPipe[BestRangeIndex] << PCTL_IOCR_RD_PIPE_BFO))); + +#ifdef FPGA +#ifdef FPGA_TEMP + SDR_DDL_FCTRL(AvaWds[BestRangeIndex][BestIndex]); + +// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF); +// Value32 = Value32 | (AvaWds[BestRangeIndex][BestIndex] << 16); +// WR_DATA(SDR_CLK_DLY_CTRL, Value32); +#else + HAL_SDR_WRITE32(REG_SDR_DLY0, AvaWds[BestRangeIndex][BestIndex]); +// ms_ctrl_0_map->phy_dly0 = AvaWds[BestRangeIndex][BestIndex]; +#endif +#else + SDR_DDL_FCTRL(AvaWds[BestRangeIndex][BestIndex]); +// Value32 = (RD_DATA(SDR_CLK_DLY_CTRL) & 0xFF00FFFF); +// Value32 = Value32 | (AvaWds[BestRangeIndex][BestIndex] << 16); +// WR_DATA(SDR_CLK_DLY_CTRL, Value32); +#endif + #ifdef SUPPORT_DRAM_KED + RdPipe = RecRdPipe[BestRangeIndex]; + TapCnt = AvaWds[BestRangeIndex][BestIndex]; + + value.b[0] = (u8)RdPipe; + value.b[1] = ~value.b[0]; + value.b[2] = (u8)TapCnt; + value.b[3] = ~value.b[2]; + //DiagPrintf("dump1w %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]); + HAL_WRITE32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType+4, value.l); + SpicWaitWipDoneRefinedRtl8195A(SpicInitPara); + + valid = 1; + value.b[0] = (u8)valid; + value.b[1] = ~value.b[0]; + value.b[2] = 0xFF; + value.b[3] = 0xFF; + //DiagPrintf("dump1w %x, %x %x %x %x \n\r", value.l, value.b[0], value.b[1], value.b[2], value.b[3]); + HAL_WRITE32(SPI_FLASH_BASE, FLASH_SDRC_PARA_BASE+8*CpuType, value.l); + SpicWaitWipDoneRefinedRtl8195A(SpicInitPara); + #endif + Result = _TRUE; + break; + } + + if (RdPipeCounter == 0) { + + DBG_SDR_INFO("NOT Find RdPipe\n"); + } + } + + return Result; +} // SdrCalibration + + + + +HAL_SDRC_TEXT_SECTION +VOID +ChangeRandSeed( + IN u32 Seed +) +{ + rand_x = Seed; +} + +HAL_SDRC_TEXT_SECTION +u32 +Sdr_Rand2( + VOID +) +{ + HAL_RAM_DATA_SECTION static unsigned int y = 362436; + + HAL_RAM_DATA_SECTION static unsigned int z = 521288629; + + HAL_RAM_DATA_SECTION static unsigned int c = 7654321; + + unsigned long long t, a= 698769069; + + rand_x = 69069 * rand_x + 12345; + y ^= (y << 13); y ^= (y >> 17); y ^= (y << 5); + t = a * z + c; c = (t >> 32); z = t; + + return rand_x + y + z; +} + +HAL_SDRC_TEXT_SECTION +s32 +MemTest( + u32 LoopCnt +) +{ + u32 LoopIndex = 0; + u32 Value32, Addr; + for (LoopIndex = 0; LoopIndex 0x%x != 0x%x\n",LoopIndex, + Addr, Value32, HAL_SDRAM_READ32(Addr)); + return _FALSE; + } + else { + // HAL_SDRAM_WRITE32(Addr, 0); + } + } + return _TRUE; + +} // MemTest + +#endif // end of "#ifdef CONFIG_SDR_EN" diff --git a/lib/fwlib/src/hal_soc_ps_monitor.c b/lib/fwlib/src/hal_soc_ps_monitor.c new file mode 100644 index 0000000..2777912 --- /dev/null +++ b/lib/fwlib/src/hal_soc_ps_monitor.c @@ -0,0 +1,3449 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ +#include "rtl8195a.h" +#include "hal_soc_ps_monitor.h" + +#include "PinNames.h" +#include "gpio_api.h" + + +#ifdef CONFIG_SOC_PS_MODULE +extern VOID UartLogIrqHandleRam(VOID * Data); +#if defined (__ICCARM__) +extern void xPortPendSVHandler( void ); +#elif defined (__GNUC__) +extern void xPortPendSVHandler( void ) __attribute__ (( naked )); +#endif +extern void xPortSysTickHandler( void ); +extern void vPortSVCHandler( void ); +extern u32 HalGetCpuClk(VOID); +extern _LONG_CALL_ u32 HalDelayUs(u32 us); + +extern COMMAND_TABLE UartLogRomCmdTable[]; +extern HAL_TIMER_OP HalTimerOp; +extern u32 STACK_TOP; // which is defined in vectors.s + +SYS_ADAPTER SYSAdapte; + +Power_Mgn PwrAdapter; + +VOID ReFillCpuClk(VOID); +extern u8 __ram_start_table_start__[]; + +u32 +PatchHalLogUartInit( + IN LOG_UART_ADAPTER UartAdapter +) +{ + u32 SetData; + u32 Divisor; + u32 Dlh; + u32 Dll; + u32 SysClock; + + /* + Interrupt enable Register + 7: THRE Interrupt Mode Enable + 2: Enable Receiver Line Status Interrupt + 1: Enable Transmit Holding Register Empty Interrupt + 0: Enable Received Data Available Interrupt + */ + // disable all interrupts + HAL_UART_WRITE32(UART_INTERRUPT_EN_REG_OFF, 0); + + /* + Line Control Register + 7: DLAB, enable reading and writing DLL and DLH register, and must be cleared after + initial baud rate setup + 3: PEN, parity enable/disable + 2: STOP, stop bit + 1:0 DLS, data length + */ + + // set DLAB bit to 1 + HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, 0x80); + + // set up buad rate division + +#if 0//def CONFIG_FPGA + SysClock = SYSTEM_CLK; + Divisor = (SysClock / (16 * (UartAdapter.BaudRate))); +#else + { + u32 SampleRate,Remaind; + + SysClock = (HalGetCpuClk()>>2); + + SampleRate = (16 * (UartAdapter.BaudRate)); + + Divisor= SysClock/SampleRate; + + Remaind = ((SysClock*10)/SampleRate) - (Divisor*10); + + if (Remaind>4) { + Divisor++; + } + } +#endif + + + Dll = Divisor & 0xff; + Dlh = (Divisor & 0xff00)>>8; + HAL_UART_WRITE32(UART_DLL_OFF, Dll); + HAL_UART_WRITE32(UART_DLH_OFF, Dlh); + + // clear DLAB bit + HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, 0); + + // set data format + SetData = UartAdapter.Parity | UartAdapter.Stop | UartAdapter.DataLength; + HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, SetData); + + /* FIFO Control Register + 7:6 level of receive data available interrupt + 5:4 level of TX empty trigger + 2 XMIT FIFO reset + 1 RCVR FIFO reset + 0 FIFO enable/disable + */ + // FIFO setting, enable FIFO and set trigger level (2 less than full when receive + // and empty when transfer + HAL_UART_WRITE32(UART_FIFO_CTL_REG_OFF, UartAdapter.FIFOControl); + + /* + Interrupt Enable Register + 7: THRE Interrupt Mode enable + 2: Enable Receiver Line status Interrupt + 1: Enable Transmit Holding register empty INT32 + 0: Enable received data available interrupt + */ + HAL_UART_WRITE32(UART_INTERRUPT_EN_REG_OFF, UartAdapter.IntEnReg); + + if (UartAdapter.IntEnReg) { + // Enable Peripheral_IRQ Setting for Log_Uart + HAL_WRITE32(VENDOR_REG_BASE, PERIPHERAL_IRQ_EN, 0x1000000); + + // Enable ARM Cortex-M3 IRQ + NVIC_SetPriorityGrouping(0x3); + NVIC_SetPriority(PERIPHERAL_IRQ, 14); + NVIC_EnableIRQ(PERIPHERAL_IRQ); + } + + + return 0; +} + + +VOID +PSHalInitPlatformLogUart( + VOID +) +{ + IRQ_HANDLE UartIrqHandle; + LOG_UART_ADAPTER UartAdapter; + + //4 Release log uart reset and clock + LOC_UART_FCTRL(OFF); + LOC_UART_FCTRL(ON); + ACTCK_LOG_UART_CCTRL(ON); + + PinCtrl(LOG_UART,S0,ON); + + //4 Register Log Uart Callback function + UartIrqHandle.Data = (u32)NULL;//(u32)&UartAdapter; + UartIrqHandle.IrqNum = UART_LOG_IRQ; + UartIrqHandle.IrqFun = (IRQ_FUN) UartLogIrqHandleRam; + UartIrqHandle.Priority = 0; + + //4 Inital Log uart + UartAdapter.BaudRate = UART_BAUD_RATE_38400; + UartAdapter.DataLength = UART_DATA_LEN_8BIT; + UartAdapter.FIFOControl = 0xC1; + UartAdapter.IntEnReg = 0x00; + UartAdapter.Parity = UART_PARITY_DISABLE; + UartAdapter.Stop = UART_STOP_1BIT; + + //4 Initial Log Uart + PatchHalLogUartInit(UartAdapter); + + //4 Register Isr handle + InterruptRegister(&UartIrqHandle); + + UartAdapter.IntEnReg = 0x05; + + //4 Initial Log Uart for Interrupt + PatchHalLogUartInit(UartAdapter); + + //4 initial uart log parameters before any uartlog operation + //RtlConsolInit(ROM_STAGE,GetRomCmdNum(),(VOID*)&UartLogRomCmdTable);// executing boot seq., + //pUartLogCtl->TaskRdy = 1; +} + + +#ifdef CONFIG_SDR_EN +VOID +SDRWakeUp( + VOID +){ + ACTCK_SDR_CCTRL(ON); + SDR_PIN_FCTRL(ON); + HalDelayUs(10); + HAL_WRITE32(0x40005000, 0x34, 0x3); + HAL_WRITE32(0x40005000, 0x10, HAL_READ32(0x40005000, 0x10)&(~BIT28)); +} + +VOID +SDRSleep( + VOID +){ + gpio_t gpio_obj; + + HAL_WRITE32(0x40005000, 0X10, HAL_READ32(0x40005000, 0x10)|BIT28); + ACTCK_SDR_CCTRL(OFF); + gpio_init(&gpio_obj, PG_1); + gpio_mode(&gpio_obj, PullUp); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_HIGH); + + gpio_init(&gpio_obj, PG_2); + gpio_mode(&gpio_obj, PullDown); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_LOW); + + gpio_init(&gpio_obj, PG_3); + gpio_mode(&gpio_obj, PullDown); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_LOW); + + gpio_init(&gpio_obj, PG_4); + gpio_mode(&gpio_obj, PullDown); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_LOW); + + gpio_init(&gpio_obj, PJ_1); + gpio_mode(&gpio_obj, PullDown); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_LOW); + + gpio_init(&gpio_obj, PJ_2); + gpio_mode(&gpio_obj, PullDown); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_LOW); + + SDR_PIN_FCTRL(OFF); + HAL_WRITE32(0x40005000, 0x34, 0x1); + gpio_init(&gpio_obj, PJ_1); + gpio_mode(&gpio_obj, PullUp); + gpio_dir(&gpio_obj, PIN_OUTPUT); + gpio_write(&gpio_obj, GPIO_PIN_LOW); +} +#endif + +VOID +SYSIrqHandle +( + IN VOID *Data +) +{ + u32 Rtemp; + + //change cpu clk + ReFillCpuClk(); + HalDelayUs(100); + + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN) | 0x40000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN, Rtemp); + + #ifdef CONFIG_SDR_EN + SDRWakeUp(); + #endif + + //disable DSTBY timer + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, 0); + + //clear wake event IMR + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, 0); + + //clear wake event ISR + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0, Rtemp); + + //set event flag + PwrAdapter.WakeEventFlag = _TRUE; +} + +VOID +InitSYSIRQ(VOID) +{ + IRQ_HANDLE SysHandle; + PSYS_ADAPTER pSYSAdapte; + pSYSAdapte = &SYSAdapte; + SysHandle.Data = (u32) (pSYSAdapte); + SysHandle.IrqNum = SYSTEM_ON_IRQ; + SysHandle.IrqFun = (IRQ_FUN) SYSIrqHandle; + SysHandle.Priority = 0; + + InterruptRegister(&SysHandle); + InterruptEn(&SysHandle); + PwrAdapter.WakeEventFlag = _FALSE; +} + +void vWFSSVCHandler( void ) +{ +#if defined (__ICCARM__) + // TODO: IAR has different way using assembly +#elif defined (__GNUC__) + asm volatile + ( + "svcing:\n" + " mov r0, %0 \n" + " ldmia r0!, {r4-r7} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " ldmia r0!, {r8-r11} \n" + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " orr r14, #0xd \n" + " bx r14 \n" + ::"r"(PwrAdapter.CPUPSP):"r0" + ); +#endif +} + + +VOID +WakeFromSLPPG( + VOID +) +{ + //release shutdone + HAL_WRITE32(PERI_ON_BASE, REG_GPIO_SHTDN_CTRL, 0x7FF); + //HAL_WRITE32(PERI_ON_BASE, REG_CPU_PERIPHERAL_CTRL, 0x110001); + //JTAG rst pull high + HAL_WRITE32(PERI_ON_BASE, REG_GPIO_PULL_CTRL2, 0x05555556); + + ReFillCpuClk(); + + //3 Need Modify + VectorTableInitRtl8195A(0x1FFFFFFC); + + //3 Make PendSV, CallSV and SysTick the same priroity as the kernel. + HAL_WRITE32(0xE000ED00, 0x20, 0xF0F00000); + + //3 Initial Log Uart + PSHalInitPlatformLogUart(); + +#ifdef CONFIG_KERNEL + InterruptForOSInit((VOID*)vWFSSVCHandler, + (VOID*)xPortPendSVHandler, + (VOID*)xPortSysTickHandler); +#endif + //CPURegbackup[13] = CPURegbackup[13]-4; + PwrAdapter.CPURegbackup[16] |= 0x1000000 ; + + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-4) ) )= PwrAdapter.CPURegbackup[16]; //PSR + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-8) ) )= PwrAdapter.CPURegbackup[15]; //PC + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-12) ) )= PwrAdapter.CPURegbackup[14]; //LR + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-16) ) )= PwrAdapter.CPURegbackup[12]; //R12 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-20) ) )= PwrAdapter.CPURegbackup[3]; //R3 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-24) ) )= PwrAdapter.CPURegbackup[2]; //R2 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-28) ) )= PwrAdapter.CPURegbackup[1]; //R1 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-32) ) )= PwrAdapter.CPURegbackup[0]; //R0 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-36) ) )= PwrAdapter.CPURegbackup[11]; //R11 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-40) ) )= PwrAdapter.CPURegbackup[10]; //R10 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-44) ) )= PwrAdapter.CPURegbackup[9]; //R9 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-48) ) )= PwrAdapter.CPURegbackup[8]; //R8 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-52) ) )= PwrAdapter.CPURegbackup[7]; //R7 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-56) ) )= PwrAdapter.CPURegbackup[6]; //R6 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-60) ) )= PwrAdapter.CPURegbackup[5]; //R5 + ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[13]-64) ) )= PwrAdapter.CPURegbackup[4]; //R4 + PwrAdapter.CPURegbackup[13] = PwrAdapter.CPURegbackup[13]-64; //PSP + PwrAdapter.CPUPSP = PwrAdapter.CPURegbackup[13]; + //CPURegBackUp(); + + asm volatile( + " cpsie i \n" /* Globally enable interrupts. */ + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} + +VOID +DurationScaleAndPeriodOP( + IN u32 SDuration, + OUT u32 *ScaleTemp, + OUT u32 *PeriodTemp +) +{ + u8 Idx = 0; + if (SDuration > 8355){ + SDuration = 0x20A3; + } + + //in unit 128us + SDuration = ((SDuration*125)/16); + + for (Idx = 8; Idx < 32; Idx++) { + + if ( (SDuration & 0xFFFFFF00) > 0 ) { + (*ScaleTemp) = (*ScaleTemp) + 1; + SDuration = (SDuration >> 1); + } + else { + break; + } + } + + *ScaleTemp = ((*ScaleTemp) << 8); + *PeriodTemp = SDuration; +} + + +u32 +CLKCal( + IN u8 ClkSel +) +{ + u32 Rtemp = 0; + u32 RRTemp = 0; + + if( ClkSel ){ + //a33_ck + Rtemp |= 0x10000; + } + + //Enable cal + Rtemp |= 0x800000; + HAL_WRITE32(VENDOR_REG_BASE, REG_VDR_ANACK_CAL_CTRL, Rtemp); + + while( (HAL_READ32(VENDOR_REG_BASE, REG_VDR_ANACK_CAL_CTRL) & BIT23) != 0 ); + Rtemp = ((HAL_READ32(VENDOR_REG_BASE, REG_VDR_ANACK_CAL_CTRL) & 0x3FFF))+1; + + if( ClkSel ){ + //a33_ck + RRTemp = (Rtemp); + } + else { + //anack + RRTemp = ((2133/Rtemp) - 1); + } + + //DiagPrintf("CAL : 0x%x\n", RRTemp); + + return RRTemp; +} + +VOID +BackupCPUClk( + VOID +) +{ + u32 Cpubp; + Cpubp = (HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO0)&0xFFFFFFF0); + Cpubp |= ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1) & (0x70)) >> 4); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO0,Cpubp); +} + +VOID +ReFillCpuClk( + VOID +) +{ + u8 CpuClk = ((u8)(HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO0)& (0xF))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1, + ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_CLK_CTRL1) & (~0x70)) + |(CpuClk << 4))); +} + +VOID +SleepClkGatted( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 ScaleTemp = 0; + u32 PeriodTemp = 0; + u32 CalTemp = 0; + + //Backup CPU CLK + BackupCPUClk(); + + //truncate duration + SDuration &= 0x0003FFFC; + //2 CSleep + //3 1.1 Set TU timer timescale + //0x4000_0090[21:16] = 6'h1F + //0x4000_0090[15] = 1'b0 => Disable timer + CalTemp = (CLKCal(ANACK) << 16); + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL)& 0xffff7fff & 0xffc0ffff) | CalTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[11:8] => Time scale + //0x4000_0090[7:0] => Time period + //max duration 0x7FFFFF us, min 0x80 + DurationScaleAndPeriodOP(SDuration, &ScaleTemp, &PeriodTemp); + + Rtemp = (((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) & 0xfffff000) | ScaleTemp) | PeriodTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //3 1.2 Configure platform wake event + //0x4000_0100[0] = 1'b1 => Enable timer and GT as wakeup event to wakeup CPU + Rtemp = 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + + //3 1.3 Configure power state option: + // 1.4.3 0x120[15:8]: sleep power mode option0 [11] = 1 + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION) & 0xffff00ff) | 0x74000A00);//A + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION, Rtemp); + + // 1.4.4 0x124[7:0]: sleep power mode option1 [0] =1 + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT) & 0xffffff00) | 0x00000001); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT, Rtemp); + + //3 1.5 Enable low power mode + // 1.5.1 0x4000_0118[2] = 1 => for sleep mode + Rtemp = 0x00000004;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000004; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //3 1.6 Wait CHIP enter low power mode + // 1.7 Wait deep standby timer timeout + // 1.8 Wait CHIP resume to norm power mode + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + +} + + +VOID SleepPwrGatted( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 ScaleTemp = 0; + u32 PeriodTemp = 0; + u32 CalTemp = 0; + + //Backup CPU CLK + BackupCPUClk(); + + //truncate duration + SDuration &= 0x0003FFFC; + + //2 PSleep + //3 1.1 Set TU timer timescale + //0x4000_0090[21:16] = 6'h1F + //0x4000_0090[15] = 1'b0 => Disable timer + CalTemp = (CLKCal(ANACK) << 16); + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL)& 0xffff7fff & 0xffc0ffff) | CalTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[11:8] => Time scale + //0x4000_0090[7:0] => Time period + //max duration 0x7FFFFF us, min 0x80 + DurationScaleAndPeriodOP(SDuration, &ScaleTemp, &PeriodTemp); + + Rtemp = (((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) & 0xfffff000) | ScaleTemp) | PeriodTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //3 1.2 Configure platform wake event + //0x4000_0100[0] = 1'b1 => Enable timer and GT as wakeup event to wakeup CPU + Rtemp = 0x00000003; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + + //3 1.4 Configure power state option: + // 1.4.3 0x120[15:8]: sleep power mode option0: + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION) & 0x00ff00ff) | 0x74000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION, Rtemp); + + // 1.4.4 0x124[7:0]: sleep power mode option1: + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT) & 0xffffff00) | 0x00000003); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT, Rtemp); + + //3 1.5 Enable low power mode + // 1.5.1 0x4000_0118[2] = 1 => for sleep mode + Rtemp = 0x00000004;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000004; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //3 1.6 Wait CHIP enter low power mode + // 1.7 Wait deep standby timer timeout + // 1.8 Wait CHIP resume to norm power mode + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + DiagPrintf("YOU CAN'T SEE ME ~~~~!!!!!!!!!!!!!!!!!!!~~~~~slppg~~~~!!!!!!!!!!"); +} + + +VOID +DStandby( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 ScaleTemp = 0; + u32 PeriodTemp = 0; + u32 CalTemp = 0; + + //Backup CPU CLK + BackupCPUClk(); + + //Clear A33 timer event + //Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_SLP_WAKE_EVENT_STATUS0); + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_SLP_WAKE_EVENT_STATUS0, Rtemp); + + //2 Deep Standby mode + //3 1.1 Set TU timer timescale + //0x4000_0090[21:16] = 6'h1F + //0x4000_0090[15] = 1'b0 => Disable timer + CalTemp = (CLKCal(ANACK) << 16); + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL)& 0xffff7fff & 0xffc0ffff) | CalTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[11:8] => Time scale + //0x4000_0090[7:0] => Time period + //max duration 0x7FFFFF us, min 0x80 + DurationScaleAndPeriodOP(SDuration, &ScaleTemp, &PeriodTemp); + + Rtemp = (((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) & 0xfffff000) | ScaleTemp) | PeriodTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //3 1.3 Configure platform wake event + // 1.3.1 0x4000_0100[0] = 1'b1 => Enable deep standby timer wakeup event to wakeup CPU + Rtemp = 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + + //3 1.4 Configure power state option: + // 1.4.4 0x120[7:0]: deep standby power mode option: + Rtemp = 0x74000000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION, Rtemp); + + // 1.4.5 0x124[7:0]: sleep power mode option1 [0] =1 + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT) & 0xffffff00) | 0x00000001); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT, Rtemp); + + //3 1.5 Enable low power mode + // [0x4000_0118[1] = 1 => for deep standby mode] + Rtemp = 0x00000002; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //3 1.6 Wait CHIP enter low power mode + // 1.7 Wait deep standby timer timeout + // 1.8 Wait CHIP resume to norm power mode + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + + DiagPrintf("YOU CAN'T SEE ME ~~~~!!!!!!!!!!!!!!!!!!!~~~~~~~~~~~~~~~!!!!!!!!!!"); +} + + +VOID +DSleep( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + //u32 ScaleTemp = 0; + //u32 PeriodTemp = 0; + u32 UTemp = 0; + u32 MaxTemp = 0; + + u32 Reada335 = 0; + + //2 Deep Sleep mode: + //3 2.1 Set TU timer timescale + + //3 2.2 Configure deep sleep timer: + //2.2.1 Enable REGU access interface 0x4000_0094[31] = 1 + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2 Calibration A33 CLK + UTemp = CLKCal(A33CK); + + //Calculate the max value base on the a33 duration + MaxTemp = 0x7FFFFF*0x100/100000*UTemp/100*0x80; + //DiagPrintf("MaxTemp : 0x%x\n", MaxTemp); + + if ( SDuration >= MaxTemp ) { + SDuration = 0x7FFFFF; + } + else { + //In unit of A33 CLK : max num is bounded by anaclk = 1.5k + SDuration = ((((SDuration)/UTemp)*25/16*25/16*125)); + //DiagPrintf("SDuration : 0x%x\n", SDuration); + } + + DiagPrintf("SDuration : 0x%x\n", SDuration); + + //3 2.2.2 Initialize deep sleep counter + //2.2.2.0 0x4000_0094[15:0] = 16'hD300 => Disable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D300); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + //2.2.2.0.1 Clear event + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT)); + //2.2.2.1 0x4000_0094[15:0] = 16'h9008 => set counter[7:0] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009000 | ((u8)SDuration)); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.2 0x4000_0094[15:0] = 16'h9100 => set counter[15:8] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009100 | ((u8)(SDuration >> 8))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.3 0x4000_0094[15:0] = 16'h9200 => set counter[22:16] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009200 | ((u8)(SDuration >> 16))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.4 0x4000_0094[15:0] = 16'hD380 => Enable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D380); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + HalDelayUs(1000); + Reada335 = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CAL_CTRL); + DiagPrintf("a33 timer : 0x%x\n", Reada335); + + HalDelayUs(8000); + + //3 2.2.3 + //2.3 Enable low power mode: 0x4000_0118[0] = 1'b1; + Rtemp = 0x00000001;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //2.4 Wait CHIP enter deep sleep mode + //2.5 Wait deep sleep counter timeout + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + + DiagPrintf("YOU CAN'T SEE ME ~~~~!!!!!!!!!!!!!!!!!!!~~~~~~~~~~~~~~~!!!!!!!!!!"); +} + +VOID +MSBackupProcess( + void +) +{ + + u8 i = 0; + + //backup main stack + for (i = 0; i < (MAX_BACKUP_SIZE-1); i++) { + PwrAdapter.MSPbackup[i] = HAL_READ32(0x1FFFFE00, (0x1FC - (i*4))); + } + + asm volatile + ( + "MRS r0, MSP\n" + "MOV %0, r0\n" + :"=r"(PwrAdapter.MSPbackup[MAX_BACKUP_SIZE-1]) + ::"memory" + ); +} + + +VOID +MSReFillProcess( + VOID +) +{ + u8 i = 0; + + for (i = 0; i < (MAX_BACKUP_SIZE-1); i++) { + + HAL_WRITE32(0x1FFFFE00, (0x1FC - (i*4)), PwrAdapter.MSPbackup[i]); + } + + asm volatile + ( + "MSR MSP, %0\n" + ::"r"(PwrAdapter.MSPbackup[MAX_BACKUP_SIZE-1]):"memory" + ); +} + + +VOID +SoCPSGPIOCtrl( + VOID +) +{ + HAL_WRITE32(PERI_ON_BASE,0x330,0x55555555); + HAL_WRITE32(PERI_ON_BASE,0x334,0x55555555); + HAL_WRITE32(PERI_ON_BASE,0x338,0x05555555); + HAL_WRITE32(PERI_ON_BASE,0x33c,0x55555555); + HAL_WRITE32(PERI_ON_BASE,0x340,0x55555555); + HAL_WRITE32(PERI_ON_BASE,0x344,0x55555555); + HAL_WRITE32(PERI_ON_BASE,0x348,0x55555555); + HAL_WRITE32(PERI_ON_BASE,0x320,0x0); +} + + +VOID +InitSoCPM( + VOID +) +{ + u8 Idx = 0; + PRAM_FUNCTION_START_TABLE pRamStartFun = (PRAM_FUNCTION_START_TABLE) __ram_start_table_start__; + + PwrAdapter.ActFuncCount = 0; + PwrAdapter.CurrentState = ACT; + for (Idx = 0; Idx < MAXSTATE; Idx++) { + PwrAdapter.PwrState[Idx].FuncIdx = 0xFF; + PwrAdapter.PwrState[Idx].PowerState = 0xFF; + } + PwrAdapter.SDREn = _FALSE; + InitSYSIRQ(); + pRamStartFun->RamWakeupFun = WakeFromSLPPG; +} + +u8 +ChangeSoCPwrState( + IN u8 RequestState, + IN u32 ReqCount +) +{ + + //DiagPrintf("Go to sleep"); + + while(1) { + + HalDelayUs(100); + + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + + break; + } + } + + switch (RequestState) { + + case ACT: + break; + + case WFE: + __WFE(); + break; + + case WFI: + __WFI(); + break; + + //case SNOOZE: + //break; + + case SLPCG: + SleepClkGatted(ReqCount); + break; + + case SLPPG: + //Resume jump to wakeup function + //HAL_WRITE32(PERI_ON_BASE, 0x218, (HAL_READ32(PERI_ON_BASE,0x218)|BIT31)); + + SoCPSGPIOCtrl(); + SleepPwrGatted(ReqCount); + break; + + case DSTBY: + SoCPSGPIOCtrl(); + DStandby(ReqCount); + break; + + case DSLP: + case INACT: + SoCPSGPIOCtrl(); + DSleep(ReqCount); + break; + } + return 0; +} + + +u32 +SoCPwrChk( + IN u8 ReqState, + OUT u8* FailfuncIdx, + OUT u8* FailState +) +{ + u8 Idx = 0; + u32 Result = _FALSE; + + if ( PwrAdapter.ActFuncCount ) { + + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + + if (PwrAdapter.PwrState[Idx].PowerState < ReqState) { + *FailfuncIdx = PwrAdapter.PwrState[Idx].FuncIdx; + *FailState = PwrAdapter.PwrState[Idx].PowerState; + Result = _FALSE; + break; + } + } + } + else { + *FailfuncIdx = PwrAdapter.PwrState[Idx].FuncIdx; + *FailState = PwrAdapter.PwrState[Idx].PowerState; + Result = _TRUE; + } + return Result; +} + + +VOID +RegPowerState( + REG_POWER_STATE RegPwrState +) +{ + u8 Idx; + u8 StateIdx = 0; + u8 FState = 0; + + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + if (PwrAdapter.PwrState[Idx].FuncIdx == RegPwrState.FuncIdx) { + StateIdx = Idx; + FState = _TRUE; + break; + } + } + + switch (RegPwrState.PwrState) { + + case INACT : + if (FState) { + for (Idx = StateIdx; Idx < PwrAdapter.ActFuncCount; Idx++) { + PwrAdapter.PwrState[Idx].FuncIdx = PwrAdapter.PwrState[Idx+1].FuncIdx; + PwrAdapter.PwrState[Idx].PowerState = PwrAdapter.PwrState[Idx+1].PowerState; + } + PwrAdapter.ActFuncCount--; + } + else { + } + break; + + default: + + if (FState) { + PwrAdapter.PwrState[StateIdx].PowerState = RegPwrState.PwrState; + } + else { + PwrAdapter.PwrState[PwrAdapter.ActFuncCount].FuncIdx = RegPwrState.FuncIdx; + PwrAdapter.PwrState[PwrAdapter.ActFuncCount].PowerState = RegPwrState.PwrState; + PwrAdapter.ActFuncCount++; + } + + break; + } + + //for debug + #if 0 + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + DiagPrintf("RegPwrIdx : %d \n", Idx); + DiagPrintf("FuncIdx : %d \n", PwrAdapter.PwrState[Idx].FuncIdx); + DiagPrintf("PowerState : 0x%x \n", PwrAdapter.PwrState[Idx].PowerState); + } + #endif +} + + +VOID +ReadHWPwrState( + IN u8 FuncIdx, + OUT u8* HwState +){ + + switch (FuncIdx){ + case UART0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_UART0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL0) & BIT_SOC_ACTCK_UART0_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case UART1: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_UART1_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL0) & BIT_SOC_ACTCK_UART1_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case UART2: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_UART2_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL0) & BIT_SOC_ACTCK_UART2_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case SPI0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_SPI0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL0) & BIT_SOC_ACTCK_SPI0_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case SPI1: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_SPI1_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL0) & BIT_SOC_ACTCK_SPI1_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case SPI2: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_SPI2_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL0) & BIT_SOC_ACTCK_SPI2_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case I2C0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_I2C0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_I2C0_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case I2C1: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_I2C1_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_I2C1_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case I2C2: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_I2C2_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_I2C2_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else { + *HwState = HWINACT; + } + break; + + case I2C3: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_I2C3_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_I2C3_EN){ + *HwState = HWACT; + } + else { + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case I2S0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_I2S0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_I2S_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case I2S1: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_I2S1_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_I2S_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case PCM0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_PCM0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_PCM_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case PCM1: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC0_EN) & BIT_PERI_PCM1_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_PCM_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case ADC0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC1_EN) & BIT_PERI_ADC0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_ADC_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case DAC0: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC1_EN) & BIT_PERI_DAC0_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_DAC_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case DAC1: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_PERI_FUNC1_EN) & BIT_PERI_DAC1_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_PERI_CLK_CTRL1) & BIT_SOC_ACTCK_DAC_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case SDIOD: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN) & BIT_SOC_HCI_SDIOD_ON_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_HCI_CLK_CTRL0) & BIT_SOC_ACTCK_SDIO_DEV_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case SDIOH: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN) & BIT_SOC_HCI_SDIOH_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_HCI_CLK_CTRL0) & BIT_SOC_ACTCK_SDIO_HST_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case USBOTG: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN) & BIT_SOC_HCI_OTG_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_HCI_CLK_CTRL0) & BIT_SOC_ACTCK_OTG_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else { + *HwState = HWINACT; + } + break; + + case MII: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_HCI_COM_FUNC_EN) & BIT_SOC_HCI_MII_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_HCI_CLK_CTRL0) & BIT_SOC_ACTCK_MII_MPHY_EN){ + *HwState = HWACT; + } + else { + *HwState = HWCG; + } + } + else{ + *HwState = HWINACT; + } + break; + + case PWM0: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_PWM0_CTRL) & BIT_PERI_PWM0_EN){ + *HwState = HWACT; + } + else { + *HwState = HWINACT; + } + break; + + case PWM1: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_PWM1_CTRL) & BIT_PERI_PWM1_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; +} + break; + + case PWM2: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_PWM2_CTRL) & BIT_PERI_PWM2_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; + } + break; + + case PWM3: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_PWM3_CTRL) & BIT_PERI_PWM3_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; + } + break; + + case ETE0: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_TIM_EVT_CTRL) & BIT_PERI_GT_EVT0_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; + } + break; + + case ETE1: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_TIM_EVT_CTRL) & BIT_PERI_GT_EVT1_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; + } + break; + + case ETE2: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_TIM_EVT_CTRL) & BIT_PERI_GT_EVT2_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; + } + break; + + case ETE3: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_TIM_EVT_CTRL) & BIT_PERI_GT_EVT3_EN){ + *HwState = HWACT; + } + else { + *HwState = HWINACT; + } + break; + + case EGTIM: + if (HAL_READ32(PERI_ON_BASE, REG_PERI_EGTIM_CTRL) & BIT_PERI_EGTIM_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWINACT; + } + break; + + case LOG_UART: + if (HAL_READ32(PERI_ON_BASE, REG_SOC_FUNC_EN) & BIT_SOC_LOG_UART_EN){ + if (HAL_READ32(PERI_ON_BASE, REG_PESOC_CLK_CTRL) & BIT_SOC_ACTCK_LOG_UART_EN){ + *HwState = HWACT; + } + else{ + *HwState = HWCG; + } + } + else { + *HwState = HWINACT; + } + break; + + default: + *HwState = UNDEF; + break; + } + +} + +VOID +QueryRegPwrState( + IN u8 FuncIdx, + OUT u8* RegState, + OUT u8* HwState +){ + u8 Idx = 0; + u8 StateIdx = INACT; + + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + if (PwrAdapter.PwrState[Idx].FuncIdx == FuncIdx) { + StateIdx = PwrAdapter.PwrState[Idx].PowerState; + break; + } + } + + *RegState = StateIdx; + ReadHWPwrState(FuncIdx, HwState); +} + + +VOID +SetSYSTimer( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 ScaleTemp = 0; + u32 PeriodTemp = 0; + u32 CalTemp = 0; + + //0x4000_0090[15] = 1'b0 => Disable timer + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, 0); + + //calculate scale and period + CalTemp = (CLKCal(ANACK) << 16); + DurationScaleAndPeriodOP(SDuration, &ScaleTemp, &PeriodTemp); + + Rtemp = ((CalTemp | ScaleTemp) | PeriodTemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); +} + +VOID +SleepCG( + IN u8 Option, + IN u32 SDuration, + IN u8 ClkSourceEn, + IN u8 SDREn + +) +{ + u32 Rtemp = 0; + u32 WakeEvent = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0); + + //Backup CPU CLK + BackupCPUClk(); + + //Clear event + PwrAdapter.WakeEventFlag = _FALSE; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0)); + + //3 2 Configure power state option: + // 2.1 power mode option: + if (ClkSourceEn) { + Rtemp = 0x74003900; + } + else { + Rtemp = 0x74000900; + } + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION, Rtemp); + + // 2.2 sleep power mode option1 + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT) & 0xffffff00)|0x2); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT, Rtemp); + + if (Option & SLP_STIMER) { + + //Set TU timer timescale + SetSYSTimer(SDuration); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //Enable wake event + WakeEvent |= BIT0; + } + + if (Option & SLP_GTIMER) { + + //Enable wake event + WakeEvent |= BIT1; + } + + if (Option & SLP_GPIO) { + + //Enable wake event + WakeEvent |= BIT4; + } + + if (Option & SLP_WL) { + + //Enable wake event + WakeEvent |= BIT8; + } + + if (Option & SLP_NFC) { + + //Enable wake event + WakeEvent |= BIT28; + } + + if (Option & SLP_SDIO) { + + //Enable wake event + WakeEvent |= BIT14; + } + + if (Option & SLP_USB) { + + //Enable wake event + //WakeEvent |= BIT16; + } + + if (Option & SLP_TIMER33) { + + //Enable wake event + WakeEvent |= BIT28; + } + + while(1) { + + HalDelayUs(100); + + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + + break; + } + } + + //Set Event + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, WakeEvent); + + //3 Enable low power mode + //Enable low power mode: + if ((*((volatile u8*)(&PwrAdapter.WakeEventFlag)))!= _TRUE){ + + PwrAdapter.SDREn = SDREn; + #ifdef CONFIG_SDR_EN + SDRSleep(); + #endif + + Rtemp = 0x00000004; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //3 Wait CHIP enter low power mode + // Wait deep standby timer timeout + // Wait CHIP resume to norm power mode + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + //__WFI(); + } +} + + +VOID +SleepPG( + IN u8 Option, + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 WakeEvent = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0); + + //Backup CPU CLK + BackupCPUClk(); + + //Clear event + PwrAdapter.WakeEventFlag = _FALSE; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0)); + + //3 2 Configure power state option: + // 2.1 power mode option: + Rtemp = 0x74000100; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION, Rtemp); + + // 2.2 sleep power mode option1 + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT) & 0xffffff00)|0x2); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT, Rtemp); + + if (Option & SLP_STIMER) { + + //Set TU timer timescale + SetSYSTimer(SDuration); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //Enable wake event + WakeEvent |= BIT0; + } + + if (Option & SLP_GTIMER) { + + //Enable wake event + WakeEvent |= BIT1; + } + + if (Option & SLP_GPIO) { + + //Enable wake event + WakeEvent |= BIT4; + } + + if (Option & SLP_WL) { + + //Enable wake event + WakeEvent |= BIT8; + } + + if (Option & SLP_NFC) { + + //Enable wake event + WakeEvent |= BIT28; + } + + if (Option & SLP_SDIO) { + + //Enable wake event + WakeEvent |= BIT14; + } + + if (Option & SLP_USB) { + + //Enable wake event + //WakeEvent |= BIT16; + } + + if (Option & SLP_TIMER33) { + + //Enable wake event + WakeEvent |= BIT28; + } + + while(1) { + + HalDelayUs(100); + + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + + break; + } + } + + //Set Event + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, WakeEvent); + + //3 Enable low power mode + //Enable low power mode: + if (PwrAdapter.WakeEventFlag != _TRUE){ + + #ifdef CONFIG_SDR_EN + LDO25M_CTRL(OFF); + #endif + + Rtemp = 0x00000004; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //3 Wait CHIP enter low power mode + // Wait deep standby timer timeout + // Wait CHIP resume to norm power mode + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + } +} + + + +VOID +DSTBYGpioCtrl( + IN u8 PinEn, + IN u8 WMode +) +{ + u32 Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_GPIO_DSTBY_WAKE_CTRL0)|PinEn|(PinEn<<16)|(PinEn<<24)); + u32 Stemp = (PinEn<<8); + + if (WMode) { + Rtemp = (Rtemp|Stemp); + } + else { + Rtemp = (Rtemp & (~Stemp)); + } + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_GPIO_DSTBY_WAKE_CTRL0, Rtemp); + + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_GPIO_DSTBY_WAKE_CTRL1)|PinEn|(PinEn<<16)|BIT9); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_GPIO_DSTBY_WAKE_CTRL1, Rtemp); +} + + +VOID +DeepStandby( + IN u8 Option, + IN u32 SDuration, + IN u8 GpioOption +) +{ + u32 Rtemp = 0; + + HAL_WRITE32(0x60008000, 0x80006180, PS_MASK); + + //Clear event + PwrAdapter.WakeEventFlag = _FALSE; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0)); + + //3 2 Configure power state option: + // 2.1 deep standby power mode option: + Rtemp = 0x74000100; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION, Rtemp); + + // 2.2 sleep power mode option1 + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT) & 0xffffff00)); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_OPTION_EXT, Rtemp); + + if (Option & DSTBY_STIMER) { + + //3 3.1 Set TU timer timescale + SetSYSTimer(SDuration); + + //3 3.2 Configure platform wake event + // 1.3.1 0x4000_0100[0] = 1'b1 => Enable deep standby timer wakeup event to wakeup CPU + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0)|BIT0); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + } + + if (Option & DSTBY_NFC){ + //Enable wake event + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0)|BIT28); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + } + + if (Option & DSTBY_TIMER33){ + //Enable wake event + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0)|BIT28); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + } + + if (Option & DSTBY_GPIO){ + + if (GpioOption & BIT0) { + DSTBYGpioCtrl(BIT0, (GpioOption & BIT4)); + } + + if (GpioOption & BIT1) { + DSTBYGpioCtrl(BIT1, (GpioOption & BIT5)); + } + + if (GpioOption & BIT2) { + DSTBYGpioCtrl(BIT2, (GpioOption & BIT6)); + } + + if (GpioOption & BIT3) { + DSTBYGpioCtrl(BIT3, (GpioOption & BIT7)); + } + + //Enable wake event + if (GpioOption & 0xF){ + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0)|BIT29); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + } + } + + + //3 Enable low power mode + //Enable low power mode: + if (PwrAdapter.WakeEventFlag != _TRUE){ + + SpicDeepPowerDownFlashRtl8195A(); + + #ifdef CONFIG_SDR_EN + LDO25M_CTRL(OFF); + #endif + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_GPIO_SHTDN_CTRL, 0x0); + + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN) & 0xBFFFFFFF); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN, Rtemp); + + Rtemp = 0x00000002; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //3 Wait CHIP enter low power mode + // Wait deep standby timer timeout + // Wait CHIP resume to norm power mode + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + } +} + + + +VOID +DeepSleep( + IN u8 Option, + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 UTemp = 0; + u32 MaxTemp = 0; + + HAL_WRITE32(0x60008000, 0x80006180, PS_MASK); + + //1.1.1 Enable REGU access interface 0x4000_0094[31] = 1 + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //1.1.2 0x4000_0094[15:0] = 16'hD300 => Disable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D300); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + while(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15){}; + + //1.1.3 Clear event + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT)); + + if (Option & DS_TIMER33){ + //2.1.1 Calibration A33 CLK + UTemp = CLKCal(A33CK); + + //Calculate the max value base on the a33 duration + MaxTemp = ((((0x7FFFFF/3)*500)/UTemp)*25); + + if ( SDuration >= MaxTemp ) { + SDuration = 0x7FFFFF; + } + else { + //In unit of A33 CLK : max num is bounded by anaclk = 1.5k + SDuration = ((((SDuration/3)*500)/UTemp)*25); + } + + //2.1.2 Initialize deep sleep counter + //2.1.3.1 0x4000_0094[15:0] = 16'h9008 => set counter[7:0] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009000 | ((u8)SDuration)); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + while(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15){}; + + //2.1.3.2 0x4000_0094[15:0] = 16'h9100 => set counter[15:8] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009100 | ((u8)(SDuration >> 8))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + while(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15){}; + + //2.1.3.3 0x4000_0094[15:0] = 16'h9200 => set counter[22:16] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009200 | ((u8)(SDuration >> 16))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + while(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15){}; + + //2.1.3.4 0x4000_0094[15:0] = 16'hD380 => Enable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D380); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + while(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15){}; + } + + if (Option & DS_GPIO) { + //2.2 en GPIO + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009410); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + while(HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15){}; + } + + + //0x4000_0100[28] = 1'b1 => Enable A33 wakeup event to wakeup CPU + PwrAdapter.WakeEventFlag = _FALSE; + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0)|BIT28); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); + + //3 2.3 + //2.3 Enable low power mode: 0x4000_0118[0] = 1'b1; + if (PwrAdapter.WakeEventFlag != _TRUE){ + + SpicDeepPowerDownFlashRtl8195A(); + + #ifdef CONFIG_SDR_EN + LDO25M_CTRL(OFF); + #endif + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_GPIO_SHTDN_CTRL, 0x0); + + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN) & 0xBFFFFFFF); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_FUNC_EN, Rtemp); + + Rtemp = 0x00000001;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //2.4 Wait CHIP enter deep sleep mode + //2.5 Wait deep sleep counter timeout + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); + } +} + + +VOID +DSleep_GPIO( + VOID +) +{ + u32 Rtemp = 0; + + //1.1 Clear event + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT)); + + //2 Deep Sleep mode: + //3 2.2 Configure GPIO: + //2.2.1 Enable REGU access interface 0x4000_0094[31] = 1 + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009410); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2 + //2.3 Enable low power mode: 0x4000_0118[0] = 1'b1; + Rtemp = 0x00000001;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //2.4 Wait CHIP enter deep sleep mode + //2.5 Wait deep sleep counter timeout + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); +} + +VOID +DSleep_Timer( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + u32 UTemp = 0; + u32 MaxTemp = 0; + + //2 Deep Sleep mode: + //3 2.1 Set TU timer timescale + + //3 2.2 Configure deep sleep timer: + //2.2.1 Enable REGU access interface 0x4000_0094[31] = 1 + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2 0x4000_0094[15:0] = 16'hD300 => Disable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D300); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.3 Clear event + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT, HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_WEVENT)); + + //2.2.4 Calibration A33 CLK + UTemp = CLKCal(A33CK); + + //Calculate the max value base on the a33 duration + MaxTemp = 0x7FFFFF*0x100/100000*UTemp/100*0x80; + + if ( SDuration >= MaxTemp ) { + SDuration = 0x7FFFFF; + } + else { + //In unit of A33 CLK : max num is bounded by anaclk = 1.5k + SDuration = ((((SDuration)/UTemp)*25/16*25/16*125)); + } + + //DiagPrintf("SDuration : 0x%x\n", SDuration); + + //2.2.5 Initialize deep sleep counter + //2.2.5.1 0x4000_0094[15:0] = 16'h9008 => set counter[7:0] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009000 | ((u8)SDuration)); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.5.2 0x4000_0094[15:0] = 16'h9100 => set counter[15:8] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009100 | ((u8)(SDuration >> 8))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.5.3 0x4000_0094[15:0] = 16'h9200 => set counter[22:16] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009200 | ((u8)(SDuration >> 16))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.5.4 0x4000_0094[15:0] = 16'hD380 => Enable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D380); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //HalDelayUs(1000); + //Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CAL_CTRL); + //DiagPrintf("a33 timer : 0x%x\n", Rtemp); + HalDelayUs(8000); + + //3 2.3 + //2.3 Enable low power mode: 0x4000_0118[0] = 1'b1; + Rtemp = 0x00000001;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //2.4 Wait CHIP enter deep sleep mode + //2.5 Wait deep sleep counter timeout + HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL); + __WFI(); +} + + +VOID +SoCPwrReinitProcess( + VOID +) +{ + //clear resume jumping condition + HAL_WRITE32(PERI_ON_BASE, 0x218, (HAL_READ32(PERI_ON_BASE,0x218)&(~BIT31))); + + #ifdef CONFIG_KERNEL + InterruptForOSInit((VOID*)vPortSVCHandler, + (VOID*)xPortPendSVHandler, + (VOID*)xPortSysTickHandler); + #endif + + //msp stack + MSReFillProcess(); + + //init sys timer + ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) = 0xc34f;//portNVIC_SYSTICK_LOAD_REG + ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) = 0x10007;//portNVIC_SYSTICK_CTRL_REG + + //3 Reinit SYS int + { + IRQ_HANDLE SysHandle; + PSYS_ADAPTER pSYSAdapte; + pSYSAdapte = &SYSAdapte; + SysHandle.Data = (u32) (pSYSAdapte); + SysHandle.IrqNum = SYSTEM_ON_IRQ; + SysHandle.IrqFun = (IRQ_FUN) SYSIrqHandle; + SysHandle.Priority = 0; + + InterruptRegister(&SysHandle); + InterruptEn(&SysHandle); + } + //DiagPrintf("REINIT IRQ0!!!!!!!!!!\n"); + //HAL_WRITE32(0xE000ED00, 0x14, 0x200); + +} + + +VOID +SoCEnterPS( + VOID +) +{ +} + + +VOID +SoCPWRIdleTaskHandle( + VOID +) +{ + //static u32 IdleLoopCount = 0; + static u32 IdleCount = 0; + //u8 Chktemp = 0; + //u32 CMDTemp[6]; + //u32 Rtemp,Rtemp1,Rtemp2; + + //IdleCount++; + //HalDelayUs(1000); + //if ((IdleCount > 5000)||(HAL_READ8(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO0+1) == 0x12)) + if (HAL_READ8(SYSTEM_CTRL_BASE, 0xf2) == 0xda) {// { + + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SOC_FUNC_EN, (HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_FUNC_EN)|BIT29)); + + HAL_WRITE32(SYSTEM_CTRL_BASE,0xf0,0); + + #if 0 //slp pg + //backup cpu reg + CPURegBackUp(); + + //backup main stack + MSBackupProcess(); + + //Wait for LogUart print out + while(1) { + HalDelayUs(100); + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + break; + } + } + + SoCPSGPIOCtrl(); + + ChangeSoCPwrState(SLPPG, 0xFFFFF); + + asm volatile + ( + "SLPPG_WAKEUP_POINT:\n" + ); + + SoCPwrReinitProcess(); + + //DiagPrintf("idle~~~~~~~~~~~~~~~~~\n"); + DiagPrintf("SLP_PG = %d\n", HAL_READ32(SYSTEM_CTRL_BASE,0xf8)); + #endif + asm volatile + ( + "SLPPG_WAKEUP_POINT:\n" + ); + + #if 1 //dslp + //Wait for LogUart print out + while(1) { + HalDelayUs(100); + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + break; + } + } + + ChangeSoCPwrState(DSTBY, 0xFFFFF); + #endif + + } + + if (IdleCount>500){ + IdleCount = 0; + if (HAL_READ32(SYSTEM_CTRL_BASE,0xf4) ==0) { + HAL_WRITE32(SYSTEM_CTRL_BASE,0xf0,HAL_READ32(SYSTEM_CTRL_BASE,0xf0)|0xda0000); + HAL_WRITE32(SYSTEM_CTRL_BASE,0xf8,HAL_READ32(SYSTEM_CTRL_BASE,0xf8)+1); + DiagPrintf("DSTBY = %d\n", HAL_READ32(SYSTEM_CTRL_BASE,0xf8)); + } + //DiagPrintf("idle~~~~~~~~~~~~~~~~~\n"); + } + else { + HalDelayUs(100000); + IdleCount++; + } +} + +#ifdef CONFIG_SOC_PS_VERIFY +#if 0 +VOID +SoCPwrDecision( + void +) +{ + u8 Idx = 0; + u8 StateIdx = 0; + u8 State = _TRUE; + u8 NextState = 0; + u32 CurrentCount, RemainCount, PTTemp; + + if ( PwrAdapter.ActFuncCount ) { + + //update remaining count + CurrentCount = HalTimerOp.HalTimerReadCount(1); + + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + + if (PwrAdapter.PwrState[Idx].RegCount < CurrentCount) { + PTTemp = (0xFFFFFFFF - CurrentCount + PwrAdapter.PwrState[Idx].RegCount); + } + else { + PTTemp = (PwrAdapter.PwrState[Idx].RegCount - CurrentCount); + } + + if ( PTTemp < PwrAdapter.PwrState[Idx].ReqDuration ) { + PwrAdapter.PwrState[Idx].RemainDuration = PwrAdapter.PwrState[Idx].ReqDuration - PTTemp; + } + else { + //active this function + if ( PwrAdapter.PwrState[Idx].PowerState > SLPPG ) { + //Todo: re-initial function as GPIO wake + } + PwrAdapter.PwrState[Idx].PowerState = ACT; + PwrAdapter.PwrState[Idx].RemainDuration = 0; + PwrAdapter.PwrState[Idx].ReqDuration = 0; + } + } + + //Select next power mode + for (StateIdx = DSLP; StateIdx >= ACT; StateIdx--) { + + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + + State = _TRUE; + if (PwrAdapter.PwrState[Idx].PowerState < StateIdx) { + State = _FALSE; + break; + } + } + + if ( State ) { + NextState = StateIdx; + break; + } + } + + //fine min sleep time + RemainCount = PwrAdapter.PwrState[0].RemainDuration; + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + + if ( RemainCount > PwrAdapter.PwrState[Idx].RemainDuration ) { + + RemainCount = PwrAdapter.PwrState[Idx].RemainDuration; + } + } + + //for debug + #if 1 + DiagPrintf("RemainCount : 0x%x \n", RemainCount); + DiagPrintf("NextState : 0x%x \n", NextState); + #endif + #if 0 + //Change state + if ( NextState > SLPCG ) { + if ( RemainCount > 640 ) { + ChangeSoCPwrState(NextState, RemainCount); + } + else { + ChangeSoCPwrState(SLPCG, RemainCount); + } + } + else { + if (NextState != ACT ) { + ChangeSoCPwrState(NextState, RemainCount); + } + } + #endif + } + else { + //todo: go to DSLP + } +} + + +VOID +RegPowerState( + REG_POWER_STATE RegPwrState +) +{ + u8 Idx = 0; + u8 StateIdx; + u8 FState = 0; + + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + if (PwrAdapter.PwrState[Idx].FuncIdx == RegPwrState.FuncIdx) { + StateIdx = Idx; + FState = _TRUE; + } + } + + switch (RegPwrState.PwrState) { + + case INACT : + if (FState) { + for (Idx = StateIdx; Idx < PwrAdapter.ActFuncCount; Idx++) { + PwrAdapter.PwrState[Idx].FuncIdx = PwrAdapter.PwrState[Idx+1].FuncIdx; + PwrAdapter.PwrState[Idx].PowerState = PwrAdapter.PwrState[Idx+1].PowerState; + PwrAdapter.PwrState[Idx].ReqDuration = PwrAdapter.PwrState[Idx+1].ReqDuration; + PwrAdapter.PwrState[Idx].RegCount = PwrAdapter.PwrState[Idx+1].RegCount; + } + PwrAdapter.ActFuncCount--; + } + else { + } + break; + + default: + + if (FState) { + PwrAdapter.PwrState[StateIdx].PowerState = RegPwrState.PwrState; + PwrAdapter.PwrState[StateIdx].ReqDuration = RegPwrState.ReqDuration; + PwrAdapter.PwrState[StateIdx].RegCount = HalTimerOp.HalTimerReadCount(1); + } + else { + PwrAdapter.PwrState[PwrAdapter.ActFuncCount].FuncIdx = RegPwrState.FuncIdx; + PwrAdapter.PwrState[PwrAdapter.ActFuncCount].PowerState = RegPwrState.PwrState; + PwrAdapter.PwrState[PwrAdapter.ActFuncCount].ReqDuration = RegPwrState.ReqDuration; + PwrAdapter.PwrState[PwrAdapter.ActFuncCount].RegCount = HalTimerOp.HalTimerReadCount(1); + PwrAdapter.ActFuncCount++; + } + + break; + } + + //for debug + #if 1 + for (Idx = 0; Idx < PwrAdapter.ActFuncCount; Idx++) { + DiagPrintf("RegPwrIdx : %d \n", Idx); + DiagPrintf("FuncIdx : %d \n", PwrAdapter.PwrState[Idx].FuncIdx); + DiagPrintf("PowerState : 0x%x \n", PwrAdapter.PwrState[Idx].PowerState); + DiagPrintf("ReqDuration : 0x%x \n", PwrAdapter.PwrState[Idx].ReqDuration); + DiagPrintf("RegCount : 0x%x \n", PwrAdapter.PwrState[Idx].RegCount); + } + #endif +} +#endif + +#if 0 +VOID +En32KCalibration( + VOID +) +{ + u32 Rtemp; + u32 Ttemp = 0; + + while(1) { + + //set parameter + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, 0); + Rtemp = 0x80f880; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + + DiagPrintf("cal en\n"); + + //Polling LOCK + Rtemp = 0x110000; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); + DiagPrintf("polling lock\n"); + + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL1); + if ((Rtemp & 0x3000) != 0x0){ + break; + } + else { + Ttemp++; + DiagPrintf("check lock: %d\n", Ttemp); + } + } + + Rtemp = 0x884000; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_OSC32K_REG_CTRL0, Rtemp); +} +#endif + +VOID +SYSTestIrqHandle +( + IN VOID *Data +) +{ + u32 Rtemp; + static u32 Ttemp = 0; + + //change cpu clk + ReFillCpuClk(); + HalDelayUs(100); + + //JTAG rst pull high + HAL_WRITE32(PERI_ON_BASE, REG_GPIO_PULL_CTRL2, 0x0202aaaa); + + //release shutdone + //HAL_WRITE32(PERI_ON_BASE, REG_GPIO_SHTDN_CTRL, 0x7ff); + + //disable DSTBY timer + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, 0); + + //clear wake event IMR + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, 0); + + //clear wake event ISR + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_STATUS0, Rtemp); + + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_DSTBY_INFO0, Ttemp); + + //DiagPrintf("Ttemp : %d\n", Ttemp); + + Ttemp++; + //Rtemp = HalTimerOp.HalTimerReadCount(1); + //DiagPrintf("32k counter : %x\n", Rtemp);//32k counter : + //DiagPrintf("\n"); + + //PwrAdapter.SleepFlag = 1; + //DiagPrintf("\n"); + //DiagPrintf("0x234 after slp : %x\n", HAL_READ32(SYSTEM_CTRL_BASE,0x234)+1); + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_DSTBY_INFO0, HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO0)+1); + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_DSTBY_INFO1, HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO1)+1); + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_DSTBY_INFO2, HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO2)+1); + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_DSTBY_INFO3, HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO3)+1); + //DiagPrintf("f0 counter : %x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO0)); + //DiagPrintf("f1 counter : %x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO1)); + //DiagPrintf("f2 counter : %x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO2)); + //DiagPrintf("f3 counter : %x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO3)); + //DiagPrintf("\n"); + //DiagPrintf("ya ~~~~\n"); + + PwrAdapter.WakeEventFlag = _TRUE; +} + +VOID +InitSYSTestIRQ(VOID) +{ + IRQ_HANDLE SysHandle; + PSYS_ADAPTER pSYSAdapte; + pSYSAdapte = &SYSAdapte; + SysHandle.Data = (u32) (pSYSAdapte); + SysHandle.IrqNum = SYSTEM_ON_IRQ; + SysHandle.IrqFun = (IRQ_FUN) SYSIrqHandle; + SysHandle.Priority = 0; + + InterruptRegister(&SysHandle); + InterruptEn(&SysHandle); + PwrAdapter.WakeEventFlag = _FALSE; +} + +VOID +SetA33Timer( + IN u32 SDuration +) +{ + u32 Rtemp = 0; + //u32 ScaleTemp = 0; + //u32 PeriodTemp = 0; + u32 UTemp = 0; + u32 MaxTemp = 0; + + //2 Deep Sleep mode: + //3 2.1 Set TU timer timescale + + //3 2.2 Configure deep sleep timer: + //2.2.1 Enable REGU access interface 0x4000_0094[31] = 1 + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2 Calibration A33 CLK + UTemp = CLKCal(A33CK); + DiagPrintf("CAL : 0x%x\n", UTemp); + + //Calculate the max value base on the a33 duration + MaxTemp = 0x7FFFFF*0x100/100000*UTemp/100*0x80; + DiagPrintf("MaxTemp : 0x%x\n", MaxTemp); + + if ( SDuration >= MaxTemp ) { + SDuration = 0x7FFFFF; + } + else { + //In unit of A33 CLK : max num is bounded by anaclk = 1.5k + SDuration = ((((SDuration)/UTemp)*25/16*25/16*125)); + DiagPrintf("SDuration : 0x%x\n", SDuration); + + } + + //3 2.2.2 Initialize deep sleep counter + //2.2.2.1 0x4000_0094[15:0] = 16'h9008 => set counter[7:0] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009000 | ((u8)SDuration)); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.2 0x4000_0094[15:0] = 16'h9100 => set counter[15:8] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009100 | ((u8)(SDuration >> 8))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.3 0x4000_0094[15:0] = 16'h9200 => set counter[22:16] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009200 | ((u8)(SDuration >> 16))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.4 0x4000_0094[15:0] = 16'hD380 => Enable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D380); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + DiagPrintf("a33 timer : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CAL_CTRL)); +} + + +VOID +PrintCPU( + VOID +) +{ + + #if 0 + DiagPrintf("r13 : 0x%x\n", PwrAdapter.CPURegbackup[24]); + DiagPrintf("pc : 0x%x\n", PwrAdapter.CPURegbackup[23]); + DiagPrintf("control : 0x%x\n", PwrAdapter.CPURegbackup[22]); + DiagPrintf("psp : 0x%x\n", PwrAdapter.CPURegbackup[21]); + DiagPrintf("msp : 0x%x\n", PwrAdapter.CPURegbackup[20]); + #endif + + #if 0 + u8 i; + for (i = 0; i < 21; i++){ + PwrAdapter.CPURegbackup[i] = ( * ( ( volatile unsigned long * ) (PwrAdapter.CPURegbackup[24]+(i*4)) ) ); + } + #endif + + u8 i; + for (i = 0; i < 25; i++){ + DiagPrintf("CPURegbackup_idx : %d , 0x%x\n", i, PwrAdapter.CPURegbackup[i]); + } + + + #if 1 + for (i = 0; i < 21; i++) { + DiagPrintf("backup_idx : 0x%x , 0x%x\n", PwrAdapter.CPUPSP+(i*4),( * ( ( volatile unsigned long * ) (PwrAdapter.CPUPSP+(i*4)) ) ));//CPURegbackup[1] + } + #endif + + #if 0 + { + u32 cpupspc; + asm volatile + ( + "MRS %0, PSP\n" + :"=r"(cpupspc) + ::"memory" + ); + for (i = 0; i < 21; i++) { + DiagPrintf("stack addr : 0x%x , 0x%x\n", (cpupspc+(i*4)),( * ( ( volatile unsigned long * ) (cpupspc+(i*4)) ) ));//CPURegbackup[1] + } + } + #endif +} + + +VOID +SoCPSMEMTestInit( + IN u32 StartAddr, + IN u32 Length, + IN u32 Pattern +) +{ + u32 Idx; + for( Idx = 0; Idx < Length; Idx += 4 ){ + + HAL_WRITE32(StartAddr,Idx,Pattern); + } +} + +u8 +SoCPSMEMTestChk( + IN u32 StartAddr, + IN u32 Length, + IN u32 Pattern +) +{ + u32 Idx; + + for( Idx = 0; Idx < Length; Idx += 4 ){ + if (HAL_READ32(StartAddr,Idx) != Pattern) { + DiagPrintf("addr 0x%x fail\n", (StartAddr+Idx)); + return 0; + } + } + DiagPrintf("addr 0x%x pass\n", StartAddr); + return 1; +} + + +VOID +SoCPWRIdleTaskHandleTest( + VOID +) +{ + static u32 IdleTemp = 0; + u32 Rtemp,Rtemp1,Rtemp2; + u8 RRtemp,CMDTemp[8],Chktemp; + + if (0){//(HAL_READ8(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO0) == 0x0) { + + IdleTemp++; + HalDelayUs(1000); + + if (IdleTemp >= 15000) { + DiagPrintf("\n"); + DiagPrintf("Go to sleep ~~~~ \n"); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO0,0x12345678); + DiagPrintf("0xf0 : 0x%x\n",HAL_READ32(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO0)); + //a33 reg chk + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, 0x80008400); + HalDelayUs(1000); + if ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15)==0){ + RRtemp = ((u8)HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL))+1; + } + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009400|RRtemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + DiagPrintf("a33 0x4 : 0x%x\n",RRtemp); + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, 0x80008500); + HalDelayUs(1000); + if ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)&BIT15)==0){ + DiagPrintf("a33 0x5 before : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL)); + RRtemp = ((u8)HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL))+1; + } + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009500|RRtemp); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + DiagPrintf("a33 0x5 : 0x%x\n",RRtemp); + + ChangeSoCPwrState(7,0xE8800); + } + } + + ////debug + if (PwrAdapter.SleepFlag) { + PwrAdapter.SleepFlag = 0; + HAL_WRITE32(SYSTEM_CTRL_BASE,0x234, 0xdddddddd); + DiagPrintf("0x234 before slp : %x\n", HAL_READ32(SYSTEM_CTRL_BASE,0x234)); + //cal 32k + //En32KCalibration(); + HalDelayUs(1000); + + ChangeSoCPwrState(5,0xb000); + //HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_DSTBY_INFO1, PwrAdapter.SleepFlag); + } + + if (0){//(HAL_READ8(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO0) == 0x0) { + + IdleTemp++; + HalDelayUs(1000); + if (IdleTemp > 0xfffff){ + IdleTemp = 0; + __WFI(); + } + } + + if (0){ //((HAL_READ8(SYSTEM_CTRL_BASE,REG_SOC_SYSON_DSTBY_INFO0) == 0x0)) { + IdleTemp++; + HalDelayUs(1000); + if ((IdleTemp > 5000)||(HAL_READ8(SYSTEM_CTRL_BASE,REG_SYS_DSTBY_INFO0+1) == 0x12)){ + + DiagPrintf("\n"); + DiagPrintf("0x20080000 : 0x%x\n", HAL_READ32(0x20080000,0)); + DiagPrintf("0x20080004 : 0x%x\n", HAL_READ32(0x20080000,4)); + DiagPrintf("0x2009F404 : 0x%x\n", HAL_READ32(0x2009F400,4)); + DiagPrintf("0x2009F408 : 0x%x\n", HAL_READ32(0x2009F400,8)); + DiagPrintf("\n"); + + HAL_WRITE32(0x40000000,0x330,0x55559555);//0x55552a2a + //slp pg GPIOD GPIOE + HAL_WRITE32(0x40000000,0x334,0x55555555); + HAL_WRITE32(0x40000000,0x338,0x05555555); + HAL_WRITE32(0x40000000,0x33c,0x55555555); + HAL_WRITE32(0x40000000,0x340,0x55555555); + HAL_WRITE32(0x40000000,0x344,0x55555555); + HAL_WRITE32(0x40000000,0x320,0x0); + + HAL_WRITE32(0x20080000, 0, (HAL_READ32(0x20080000,0)+1)); + HAL_WRITE32(0x20080000, 4, (HAL_READ32(0x20080000,4)+1)); + HAL_WRITE32(0x2009F404, 0, (HAL_READ32(0x2009F400,4)+1)); + HAL_WRITE32(0x2009F408, 0, (HAL_READ32(0x2009F400,8)+1)); + HalDelayUs(10000); + ChangeSoCPwrState(SLPPG, 0xFFFFF); + } + } + //mem test + if (HAL_READ8(0x40000000,0xf1) == 0xaa) { + + CMDTemp[0] = 8; + SOCPSTestApp((VOID*)CMDTemp); + Rtemp = HAL_READ32(0x40080000,0x824); + Rtemp2 = Rtemp; + Rtemp2 = ((Rtemp2 & 0x807fffff) | 0x80000000); + HAL_WRITE32(0x40080000,0x824,Rtemp&0x7fffffff); + HAL_WRITE32(0x40080000,0x824,Rtemp2); + HAL_WRITE32(0x40080000,0x824,(Rtemp|0x80000000)); + Rtemp1 = HAL_READ32(0x40080000,0x820)&BIT8; + if (Rtemp1) { + Rtemp = HAL_READ32(0x40080000,0x8b8)&0xfffff; + } + else { + Rtemp = HAL_READ32(0x40080000,0x8a0)&0xfffff; + } + if(Rtemp== 0x00045678){ + Chktemp = 1; + } + + Chktemp &= SoCPSMEMTestChk(0x20010000,0x20000,0x12345678)&SoCPSMEMTestChk(0x200a0000,0x0FFE0,0x12345678) + &SoCPSMEMTestChk(0x1FFF4000,0x5000,0x12345678); + + if (Chktemp) { + HAL_WRITE32(0x40080000,0x4,(HAL_READ32(0x40080000,0x4)&0xFFFFFFF0)); + HAL_WRITE32(0x40000000,0xfc,(HAL_READ32(0x40000000,0xfc)+1)); + DiagPrintf("run %d times\n", HAL_READ32(0x40000000,0xfc)); + CMDTemp[0] = 1; + CMDTemp[1] = 5; + CMDTemp[2] = 0xff; + SOCPSTestApp((VOID*)CMDTemp); + } + else { + HAL_WRITE32(0x40000000,0xf0,0); + } + + } +} + +//30 +VOID +TimerHandleTset( + IN VOID *Data +) +{ + #if 0 + //static u32 temp = 0; + TIMER_ADAPTER TimerAdapter; + + TimerAdapter.IrqDis = OFF; + //TimerAdapter.IrqHandle = (IRQ_FUN) TimerHandleTset; + TimerAdapter.IrqHandle.IrqFun = (IRQ_FUN) TimerHandleTset; + //DBG_8195A("IrqFun : 0x%x\n", TimerAdapter.IrqHandle.IrqFun); + TimerAdapter.IrqHandle.IrqNum = TIMER2_7_IRQ; + TimerAdapter.IrqHandle.Priority = 0; + TimerAdapter.IrqHandle.Data = NULL; + TimerAdapter.TimerId = 2; + TimerAdapter.TimerIrqPriority = 0; + TimerAdapter.TimerLoadValueUs = 4000; + TimerAdapter.TimerMode = USER_DEFINED; + //temp++; + //DBG_8195A("time : 0x%x\n", temp); + + HalTimerOp.HalTimerInit((VOID*) &TimerAdapter); + #endif + DBG_8195A("<<< time out >>>\n"); +} + +extern IRQ_FUN Timer2To7VectorTable[6]; + +//30 +VOID +InitTimerTest( + //IN VOID *Data + VOID +) +{ + //[0]:type, [1]: timerID, [2]: timerMode, [3]: IrqDIS, [4]:period + TIMER_ADAPTER TimerAdapter; + //u32 *TestParameter; + + //TestParameter = (u32*) Data; + + TimerAdapter.IrqDis = 0; // off :0 + //TimerAdapter.IrqHandle = (IRQ_FUN) TimerHandleTset; + TimerAdapter.IrqHandle.IrqFun = (IRQ_FUN) TimerHandleTset; + //DBG_8195A("IrqFun : 0x%x\n", TimerAdapter.IrqHandle.IrqFun); + TimerAdapter.IrqHandle.IrqNum = TIMER2_7_IRQ; + TimerAdapter.IrqHandle.Priority = 0; + TimerAdapter.IrqHandle.Data = NULL; + TimerAdapter.TimerId = 5; + TimerAdapter.TimerIrqPriority = 0; + TimerAdapter.TimerLoadValueUs = 0x4EC14; + TimerAdapter.TimerMode = 1; // user_define :1 + + + //mer2To7VectorTable[0] = (IRQ_FUN) TimerHandleTset; + + HalTimerOp.HalTimerInit((VOID*) &TimerAdapter); + //mer2To7VectorTable[0] = (IRQ_FUN) TimerHandleTset; + + +} + + +VOID +GpioPsPullCtrl( + VOID +) +{ + gpio_t gpio_obj; + + gpio_init(&gpio_obj, PA_0); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_1); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_2); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_3); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_4); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_5); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_6); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PA_7); + gpio_mode(&gpio_obj, PullDown); + + gpio_init(&gpio_obj, PB_0); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PB_1); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PB_2); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PB_3); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PB_4); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PB_5); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PB_6); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PB_7); + gpio_mode(&gpio_obj, PullDown); + + gpio_init(&gpio_obj, PC_0); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_1); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_2); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_3); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_4); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_5); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_6); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_7); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_8); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PC_9); + gpio_mode(&gpio_obj, PullDown); + + gpio_init(&gpio_obj, PD_0); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_1); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_2); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_3); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_4); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_5); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_6); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_7); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_8); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PD_9); + gpio_mode(&gpio_obj, PullDown); + + gpio_init(&gpio_obj, PE_0); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_1); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_2); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_3); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_4); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_5); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_6); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_7); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_8); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_9); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PE_A); + gpio_mode(&gpio_obj, PullDown); + + gpio_init(&gpio_obj, PF_0); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PF_1); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PF_2); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PF_3); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PF_4); + gpio_mode(&gpio_obj, PullDown); + gpio_init(&gpio_obj, PF_5); + gpio_mode(&gpio_obj, PullDown); + + gpio_init(&gpio_obj, PG_0); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_1); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_2); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_3); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_4); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_5); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_6); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PG_7); + gpio_mode(&gpio_obj, PullUp); + + gpio_init(&gpio_obj, PH_0); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_1); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_2); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_3); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_4); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_5); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_6); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PH_7); + gpio_mode(&gpio_obj, PullUp); + + gpio_init(&gpio_obj, PI_0); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_1); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_2); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_3); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_4); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_5); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_6); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PI_7); + gpio_mode(&gpio_obj, PullUp); + + gpio_init(&gpio_obj, PJ_0); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PJ_1); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PJ_2); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PJ_3); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PJ_4); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PJ_5); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PJ_6); + gpio_mode(&gpio_obj, PullUp); + + + gpio_init(&gpio_obj, PK_0); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PK_1); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PK_2); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PK_3); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PK_4); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PK_5); + gpio_mode(&gpio_obj, PullUp); + gpio_init(&gpio_obj, PK_6); + gpio_mode(&gpio_obj, PullUp); +} + + +VOID +SOCPSTestApp( + VOID *Data +) +{ + u32 *TestParameter; + TestParameter = (u32*) Data; + unsigned int Rtemp, Rtemp1, Rtemp2;//, CalTemp32k, CalTempa33; + static u32 Read32k5 = 0; + static u32 Reada335 = 0; + DiagPrintf("TestParameter[0]: 0x%x\n",TestParameter[0]); + + switch (TestParameter[0]) { + + case 0: + DiagPrintf("SoC PWR Init wlan\n"); + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE,0x214)|BIT16; + HAL_WRITE32(SYSTEM_CTRL_BASE,0x214,Rtemp); + + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE,0x244)|BIT0; + HAL_WRITE32(SYSTEM_CTRL_BASE,0x244,Rtemp); + + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE,0x210)|BIT2; + HAL_WRITE32(SYSTEM_CTRL_BASE,0x210,Rtemp); + + HalDelayUs(100); + + Rtemp = HAL_READ32(WIFI_REG_BASE,0x0)|BIT0; + HAL_WRITE32(WIFI_REG_BASE,0x0,Rtemp); + #if 0 + DiagPrintf("SoC PWR debug setting\n"); + Rtemp = 0; + HAL_WRITE32(SYSTEM_CTRL_BASE,0x33c,Rtemp); + + Rtemp = 0; + HAL_WRITE32(SYSTEM_CTRL_BASE,0x334,Rtemp); + + #if 0 + //en debug + Rtemp = 1;//HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYS_DEBUG_CTRL); + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SOC_SYS_DEBUG_CTRL,Rtemp); + + //debug port sel + Rtemp = 0xf0f10004;//HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_EFUSE_SYSCFG3)|0xf0000000; + HAL_WRITE32(SYSTEM_CTRL_BASE,REG_SOC_EFUSE_SYSCFG3, Rtemp); + #endif + + //cal 32k + //En32KCalibration(); + + //en gpio + GPIO_FCTRL(ON); + SLPCK_GPIO_CCTRL(ON); + ACTCK_GPIO_CCTRL(ON); + + //DiagPrintf("debug sel 0x2C : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_EFUSE_SYSCFG3)); + //DiagPrintf("debug EN 0xA0 : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYS_DEBUG_CTRL)); + //DiagPrintf("PULL CTRL 0x33c: 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE,0x33C)); + //DiagPrintf("debug port : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE,REG_SOC_SYS_DEBUG_REG)); + DiagPrintf("0x90 : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE,0x90)); + #endif + break; + + case 1: + DiagPrintf("SoC PWR TEST : Enter = %d, Period = %d\n",TestParameter[1], TestParameter[2]); + Rtemp = HalTimerOp.HalTimerReadCount(1); + //GPIO + //HAL_WRITE32(0x40001000,0x4,0x4000000); + + //SIC EN + //HAL_WRITE32(0x40000000,0x8,0x81000010); + //HAL_WRITE32(0x40000000,0xA4,0x00000001); + + //Wait for LogUart print out + while(1) { + HalDelayUs(100); + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + break; + } + } + + #if 0 + + HAL_WRITE32(0x40000000,0x330,0x55559555);//0x55552a2a + //slp pg GPIOD GPIOE + HAL_WRITE32(0x40000000,0x334,0x55555555); + HAL_WRITE32(0x40000000,0x338,0x05555555); + HAL_WRITE32(0x40000000,0x33c,0x55555555); + HAL_WRITE32(0x40000000,0x340,0x55555555); + HAL_WRITE32(0x40000000,0x344,0x55555555); + HAL_WRITE32(0x40000000,0x320,0x0); + #endif + + ChangeSoCPwrState(TestParameter[1], TestParameter[2]); + + Rtemp2 = HalTimerOp.HalTimerReadCount(1); + DiagPrintf("before : %x\n", Rtemp); + DiagPrintf("after : %x\n", Rtemp2); + DiagPrintf("period : %d\n", Rtemp-Rtemp2); + DiagPrintf("0x90 : 0x%x\n", HAL_READ32(SYSTEM_CTRL_BASE,0x90)); + break; + + case 2: + #if 1 + + HAL_WRITE32(0x40000000,0x320,0x7ff); + HAL_WRITE32(0x40000000,0x330,0x5565A555); + //slp pg GPIOD GPIOE + HAL_WRITE32(0x40000000,0x334,0x55555555); + HAL_WRITE32(0x40000000,0x338,0x05555555); + HAL_WRITE32(0x40000000,0x33c,0x55555555); + HAL_WRITE32(0x40000000,0x340,0x55555555); + HAL_WRITE32(0x40000000,0x344,0x55555555); + HAL_WRITE32(0x40000000,0x348,0x55555555); + HAL_WRITE32(0x40000000,0x320,0x0); + + HAL_WRITE32(0x40000000,0x8,0x80000011); + #endif + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X120, TestParameter[1]); + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X124, TestParameter[2]); + + if (TestParameter[4] == 0xff) { + //SIC EN + HAL_WRITE32(0x40000000,0x320,0x4); + HAL_WRITE32(0x40000000,0x8,0xC1000010); + HAL_WRITE32(0x40000000,0xA4,0x00000001); + } + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, TestParameter[3]); + #if 0 + //clear isr + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SOC_SYS_ANA_TIM_CTRL)& 0xffff7fff)); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYS_ANA_TIM_CTRL, Rtemp); + + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_SLP_WAKE_EVENT_STATUS0); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SOC_SYSON_SLP_WAKE_EVENT_STATUS0, Rtemp); + #endif + break; + + case 3: + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X120, 0x74000e00); + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X124, 2); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, TestParameter[1]); + #if 0 + { + u32 targetunit = 0; + + //cal a33 + Rtemp = CLKCal(A33CK); + + targetunit = (TestParameter[1]/3*250)/Rtemp*50; + if (targetunit > 0x7fffff) { + targetunit = 0x7fffff; + } + + DBG_8195A("targeunit = 0x%08x\n",targetunit); + + targetunit = (50*TestParameter[1]/Rtemp)*250/3; + if (targetunit > 0x7fffff) { + targetunit = 0x7fffff; + } + + DBG_8195A("targeunit = 0x%08x\n",targetunit); + + + } + #endif + #if 0 + //cal a33 + Rtemp = CLKCal(A33CK); + Rtemp1 = (((((TestParameter[1] & 0x0FFFFFFF)<<4)/Rtemp)*20)-1); + DiagPrintf("Rtemp : 0x%x\n", Rtemp); + DiagPrintf("Vendor 0xA0 : 0x%x\n", HAL_READ32(VENDOR_REG_BASE,0xA0)); + DiagPrintf("way1 : 0x%x\n", Rtemp1); + Rtemp2 = (((((TestParameter[1] & 0x0FFFFFFF))/Rtemp)*320)-1); + DiagPrintf("way2 : 0x%x\n", Rtemp2); + + Rtemp = Rtemp1/6; + DiagPrintf("Rtemp1 : %d\n", Rtemp); + Rtemp = 0x7fffffff; + DiagPrintf("Rtemp1 : %d\n", Rtemp); + #endif + break; + + case 4: + DiagPrintf("set timer\n"); + SetA33Timer(TestParameter[1]); + Rtemp = HalTimerOp.HalTimerReadCount(1); + DiagPrintf("32k timer : 0x%x\n", Rtemp); + break; + + case 5: + DiagPrintf("read timer\n"); + Reada335 = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CAL_CTRL); + DiagPrintf("a33 timer : 0x%x\n", Reada335); + Read32k5 = HalTimerOp.HalTimerReadCount(1); + DiagPrintf("32k timer : 0x%x\n", Read32k5); + break; + + case 6: + #if 0 + DiagPrintf("interval cal\n"); + Rtemp1 = HAL_READ32(SYSTEM_CTRL_BASE, REG_SOC_SYS_DSLP_TIM_CAL_CTRL); + Rtemp2 = HalTimerOp.HalTimerReadCount(1); + DiagPrintf("Reada335 : 0x%x\n", Reada335); + DiagPrintf("Read32k5 : 0x%x\n", Read32k5); + DiagPrintf("a33 timer : 0x%x\n", Rtemp1); + DiagPrintf("32k timer : 0x%x\n", Rtemp2); + CalTemp32k = (Read32k5 - Rtemp2); + CalTempa33 = (((Reada335 - Rtemp1)*((HAL_READ32(VENDOR_REG_BASE, REG_VDR_ANACK_CAL_CTRL) & 0x3FFF)+1))/5); + DiagPrintf("a33 timer interval : 0x%x\n", CalTempa33); + DiagPrintf("32k timer interval : 0x%x\n", CalTemp32k); + Read32k5 = Rtemp2; + Reada335 = Rtemp1; + #endif + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) & 0xffff7000) | 0x7ff); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + //0x4000_0090[15] = 1'b1 => Enable timer + Rtemp = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL) | 0x00008000; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_ANA_TIM_CTRL, Rtemp); + + Rtemp = 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SLP_WAKE_EVENT_MSK0, Rtemp); +#if 0 + HAL_WRITE32(0x40000000,0x330,0x55559555);//0x55552a2a + HAL_WRITE32(0x40000000,0x2C0,0x100001); + //slp pg GPIOD GPIOE + HAL_WRITE32(0x40000000,0x334,0x55555555); + HAL_WRITE32(0x40000000,0x338,0x05555555); + HAL_WRITE32(0x40000000,0x33c,0x55555555); + HAL_WRITE32(0x40000000,0x340,0x55555555); + HAL_WRITE32(0x40000000,0x344,0x55555555); + HAL_WRITE32(0x40000000,0x320,0x0); +#endif + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X120, TestParameter[1]); + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X124, TestParameter[2]); + + if (HAL_READ32(0x40000000,0xf4) == 0x11) { + HAL_WRITE32(0x40000000,0x8,0x80000011); + } + + if (TestParameter[4] == 0xff) { + //SIC EN + HAL_WRITE32(0x40000000,0x8,0x81000010); + HAL_WRITE32(0x40000000,0xA4,0x00000001); + } + + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, TestParameter[3]); + break; + + case 7: + { + u32 Rtemp = 0; + u32 UTemp = 0; + u32 MaxTemp = 0; + u32 Reada335 = 0; + + //2 Deep Sleep mode: + //3 2.1 Set TU timer timescale + + //3 2.2 Configure deep sleep timer: + //2.2.1 Enable REGU access interface 0x4000_0094[31] = 1 + Rtemp = (HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) | 0x80000000); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + DiagPrintf("SDuration : 0x%x\n", TestParameter[1]); + + //3 2.2.2 Initialize deep sleep counter + //2.2.2.0 0x4000_0094[15:0] = 16'hD300 => Disable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D300); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + //2.2.2.1 0x4000_0094[15:0] = 16'h9008 => set counter[7:0] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009000 | ((u8)TestParameter[1])); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.2 0x4000_0094[15:0] = 16'h9100 => set counter[15:8] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009100 | ((u8)(TestParameter[1] >> 8))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.3 0x4000_0094[15:0] = 16'h9200 => set counter[22:16] + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x00009200 | ((u8)(TestParameter[1] >> 16))); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + //2.2.2.4 0x4000_0094[15:0] = 16'hD380 => Enable deep sleep counter + Rtemp = ((HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL) & 0xffff0000) | 0x0000D380); + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CTRL, Rtemp); + + HalDelayUs(1000); + Reada335 = HAL_READ32(SYSTEM_CTRL_BASE, REG_SYS_DSLP_TIM_CAL_CTRL); + DiagPrintf("a33 timer : 0x%x\n", Reada335); + + HalDelayUs(8000); + + //3 2.2.3 + //2.3 Enable low power mode: 0x4000_0118[0] = 1'b1; + Rtemp = 0x00000001;//HAL_READ32(SYSTEM_CTRL_BASE, REG_SYSON_PWRMGT_CTRL) | 0x00000001; + HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_PWRMGT_CTRL, Rtemp); + + //2.4 Wait CHIP enter deep sleep mode + //2.5 Wait deep sleep counter timeout + //__WFI(); + + DiagPrintf("YOU CAN'T SEE ME ~~~~!!!!!!!!!!!!!!!!!!!~~~~~~~~~~~~~~~!!!!!!!!!!"); + } + break; + + case 8: + DiagPrintf("enable wifi\n"); + + Rtemp = HAL_READ32(0x40000000,0x214)|0x10000; + HAL_WRITE32(0x40000000,0x214,Rtemp); + Rtemp = HAL_READ32(0x40000000,0x244)|0x1; + HAL_WRITE32(0x40000000,0x244,Rtemp); + Rtemp = HAL_READ32(0x40000000,0x210)|0x4; + HAL_WRITE32(0x40000000,0x210,Rtemp); + + Rtemp = HAL_READ32(0x40080000,0x0)&0xFFFFFFDF; + HAL_WRITE32(0x40080000,0x0,Rtemp); + Rtemp = HAL_READ32(0x40080000,0x4)|0x1; + HAL_WRITE32(0x40080000,0x4,Rtemp); + Rtemp = HAL_READ32(0x40080000,0x20)|0x1; + HAL_WRITE32(0x40080000,0x20,Rtemp); + while( (HAL_READ32(0x40080000,0x20)&BIT0)!=0); + + Rtemp = HAL_READ32(0x40080000,0x4)|0x30000; + HAL_WRITE32(0x40080000,0x4,Rtemp); + Rtemp = HAL_READ32(0x40080000,0x4)|0x7000000; + HAL_WRITE32(0x40080000,0x4,Rtemp); + Rtemp = HAL_READ32(0x40080000,0x50)&0xFFFFFF00; + HAL_WRITE32(0x40080000,0x50,Rtemp); + break; + + case 9: + #if 0 + PwrAdapter.CPURegbackup[13] = 0x12340; + PwrAdapter.CPUPSP = PwrAdapter.CPURegbackup[13]; + + asm volatile + ( + + " ldr r3, pxCPUPSPConst23 \n" /* Restore the context. */ + "MOV %0, r3\n" + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + "MOV %1, r1\n" + " ldr r0, [r1] \n" + "MOV %2, r0\n" + " .align 2 \n" + "pxCPUPSPConst23: .word PwrAdapter.CPUPSP \n" + :"=r"(PwrAdapter.CPURegbackup[0]),"=r"(PwrAdapter.CPURegbackup[1]),"=r"(PwrAdapter.CPURegbackup[2]),"=r"(PwrAdapter.CPURegbackup[3]) + :"r"(PwrAdapter.CPUPSP) + :"memory" + ); + PrintCPU(); + #endif + break; + + case 10: + Rtemp = HAL_READ32(0x40080000,0x824); + Rtemp2 = Rtemp; + Rtemp2 = Rtemp2 & 0x807fffff | (TestParameter[1]<<23) | 0x80000000; + HAL_WRITE32(0x40080000,0x824,Rtemp&0x7fffffff); + HAL_WRITE32(0x40080000,0x824,Rtemp2); + HAL_WRITE32(0x40080000,0x824,Rtemp|0x80000000); + Rtemp1 = HAL_READ32(0x40080000,0x820)&BIT8; + if (Rtemp1) { + Rtemp = HAL_READ32(0x40080000,0x8b8)&0xfffff; + } + else { + Rtemp = HAL_READ32(0x40080000,0x8a0)&0xfffff; + } + DiagPrintf("rf offset: 0x%x, 0x%x\n", TestParameter[1], Rtemp); + break; + + case 11://addr [1]; date [2] + TestParameter[1] &= 0x3f; + Rtemp = (TestParameter[1]<<20)|(TestParameter[2]&0x000fffff)&0x0fffffff; + HAL_WRITE32(0x40080000,0x840,Rtemp); + + //SoCPWRIdleTaskHandle(); + break; + + case 12: + SoCPSMEMTestInit(TestParameter[1],TestParameter[2],TestParameter[3]); + break; + + case 13: + Rtemp = SoCPSMEMTestChk(TestParameter[1],TestParameter[2],TestParameter[3]); + break; + + case 14: + HAL_WRITE32(0x40000000,TestParameter[1],0x12345678); + DiagPrintf("w32: 0x%x\n", HAL_READ32(0x40000000,TestParameter[1])); + HAL_WRITE32(0x40000000,TestParameter[1],0); + HAL_WRITE16(0x40000000,TestParameter[1],0x1234); + DiagPrintf("w16: 0x%x\n", HAL_READ32(0x40000000,TestParameter[1])); + HAL_WRITE32(0x40000000,TestParameter[1],0); + HAL_WRITE8(0x40000000,TestParameter[1],0x12); + DiagPrintf("w8: 0x%x\n", HAL_READ32(0x40000000,TestParameter[1])); + HAL_WRITE32(0x40000000,TestParameter[1],0x12345678); + DiagPrintf("R32: 0x%x\n", HAL_READ32(0x40000000,TestParameter[1])); + DiagPrintf("R16: 0x%x\n", HAL_READ16(0x40000000,TestParameter[1])); + DiagPrintf("R8: 0x%x\n", HAL_READ8(0x40000000,TestParameter[1])); + Rtemp = ((HAL_READ32(0x40000000,0xf4))?1:0); + DiagPrintf("R: 0x%x\n", Rtemp); + break; + + case 15: + asm volatile + ( + "MRS R0, BASEPRI\n" + "MOV %0, R0\n" + :"=r"(Rtemp) + ::"memory" + ); + DiagPrintf("basepri: 0x%x\n", Rtemp); + break; + case 16: + HalDelayUs(10000000); + DSleep_GPIO(); + break; + case 17: + DSleep_Timer(TestParameter[1]); + break; + case 18: + DiagPrintf("WDG CAL\n"); + { + u8 CountId; + u16 DivFactor; + u32 CountTemp; + u32 CountProcess = 0; + u32 DivFacProcess = 0; + u32 MinPeriodTemp = 0xFFFFFFFF; + u32 PeriodTemp = 0; + + DBG_8195A(" Period = %d\n", TestParameter[1]); + + for (CountId = 0; CountId < 12; CountId++) { + CountTemp = ((0x00000001 << (CountId+1))-1); + DivFactor = (u16)((100*TestParameter[1])/(CountTemp*3)); + + if (DivFactor > 0) { + PeriodTemp = 3*(DivFactor+1)*CountTemp; + DBG_8195A("PeriodTemp = %d\n", PeriodTemp); + if ((100*TestParameter[1]) PeriodTemp) { + MinPeriodTemp = PeriodTemp; + CountProcess = CountTemp; + DivFacProcess = DivFactor; + } + } + } + } + DBG_8195A("MinPeriodTemp = %d\n", MinPeriodTemp); + DBG_8195A("WdgScalar = 0x%08x\n", DivFacProcess); + DBG_8195A("WdgCunLimit = 0x%08x\n", CountProcess); + } + break; + + case 19: + DBG_8195A("DeepStandby~~~\n"); + DeepStandby(TestParameter[1],TestParameter[2],TestParameter[3]); + break; + + case 20: + DBG_8195A("SleepCG~~~\n"); + if (TestParameter[1]&BIT1){ + InitTimerTest(); + } + SleepCG(TestParameter[1],TestParameter[2],TestParameter[3],TestParameter[4]); + break; + + case 25: + { + //dslp + DBG_8195A("DSLP~~~\n"); + + HalDelayUs(3000000); + + GpioPsPullCtrl(); + + DeepSleep(TestParameter[1],TestParameter[2]); + } + break; + + case 26: + //dstby + DBG_8195A("DSTBY~~~\n"); + + GpioPsPullCtrl(); + + DeepStandby(TestParameter[1],TestParameter[2],TestParameter[3]); + break; + + case 28: + //slpcg + DBG_8195A("SLPCG~~~\n"); + while(1) { + + HalDelayUs(100); + + if (HAL_READ8(LOG_UART_REG_BASE,0x14)&BIT6){ + + break; + } + } + HAL_WRITE32(SYSTEM_CTRL_BASE, 0X2c0, 0x0); + + GpioPsPullCtrl(); + + SleepCG(TestParameter[2],TestParameter[3],TestParameter[4],TestParameter[5]); + break; + + default: + break; + } + + +} +#endif //CONFIG_SOC_PS_VERIFY +#endif //CONFIG_SOC_PS_MODULE + diff --git a/lib/fwlib/src/hal_ssi.c b/lib/fwlib/src/hal_ssi.c new file mode 100644 index 0000000..0431233 --- /dev/null +++ b/lib/fwlib/src/hal_ssi.c @@ -0,0 +1,377 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#include "rtl8195a.h" +#include "hal_ssi.h" + +const HAL_GDMA_CHNL Ssi2_TX_GDMA_Chnl_Option[] = { + {0,4,GDMA0_CHANNEL4_IRQ,0}, + {0,5,GDMA0_CHANNEL5_IRQ,0}, + {0,3,GDMA0_CHANNEL3_IRQ,0}, + {0,0,GDMA0_CHANNEL0_IRQ,0}, + {0,1,GDMA0_CHANNEL1_IRQ,0}, + {0,2,GDMA0_CHANNEL2_IRQ,0}, + + {0xff,0,0,0} // end +}; + +const HAL_GDMA_CHNL Ssi2_RX_GDMA_Chnl_Option[] = { + {1,4,GDMA1_CHANNEL4_IRQ,0}, + {1,5,GDMA1_CHANNEL5_IRQ,0}, + {1,3,GDMA1_CHANNEL3_IRQ,0}, + {1,0,GDMA1_CHANNEL0_IRQ,0}, + {1,1,GDMA1_CHANNEL1_IRQ,0}, + {1,2,GDMA1_CHANNEL2_IRQ,0}, + + {0xff,0,0,0} // end +}; + +//TODO: Load default Setting: It should be loaded from external setting file. +const DW_SSI_DEFAULT_SETTING SpiDefaultSetting = +{ + .RxCompCallback = NULL, + .RxCompCbPara = NULL, + .RxData = NULL, + .TxCompCallback = NULL, + .TxCompCbPara = NULL, + .TxData = NULL, + .DmaRxDataLevel = 7, // RX FIFO stored bytes > (DMARDLR(7) + 1) then trigger DMA transfer + .DmaTxDataLevel = 48, // TX FIFO free space > (FIFO_SPACE(64)-DMATDLR(48)) then trigger DMA transfer + .InterruptPriority = 0x20, + .RxLength = 0, + .RxLengthRemainder = 0, + .RxThresholdLevel = 7, // if number of entries in th RX FIFO >= (RxThresholdLevel+1), RX interrupt asserted + .TxLength = 0, + .TxThresholdLevel = 8, // if number of entries in th TX FIFO <= TxThresholdLevel, TX interrupt asserted + .SlaveSelectEnable = 0, + .ClockDivider = SSI_CLK_SPI0_2/1000000, // SCLK=1M + .DataFrameNumber = 0, + .ControlFrameSize = CFS_1_BIT, + .DataFrameFormat = FRF_MOTOROLA_SPI, + .DataFrameSize = DFS_8_BITS, + .DmaControl = 0, // default DMA is disable + .InterruptMask = 0x0, + .MicrowireDirection = MW_DIRECTION_MASTER_TO_SLAVE, + .MicrowireHandshaking = MW_HANDSHAKE_DISABLE, + .MicrowireTransferMode = MW_TMOD_NONSEQUENTIAL, + .SclkPhase = SCPH_TOGGLES_AT_START, + .SclkPolarity = SCPOL_INACTIVE_IS_HIGH, + .SlaveOutputEnable = SLV_TXD_ENABLE, // Slave + .TransferMode = TMOD_TR, + .TransferMechanism = SSI_DTM_INTERRUPT +}; + +extern HAL_Status HalSsiInitRtl8195a_Patch(VOID *Adaptor); +extern HAL_Status HalSsiPinmuxEnableRtl8195a_Patch(VOID *Adaptor); +extern HAL_Status HalSsiPinmuxDisableRtl8195a(VOID *Adaptor); +extern HAL_Status HalSsiDeInitRtl8195a(VOID * Adapter); +extern HAL_Status HalSsiClockOffRtl8195a(VOID * Adapter); +extern HAL_Status HalSsiClockOnRtl8195a(VOID * Adapter); +extern HAL_Status HalSsiIntReadRtl8195a(VOID *Adapter, VOID *RxData, u32 Length); +extern HAL_Status HalSsiIntWriteRtl8195a(VOID *Adapter, u8 *pTxData, u32 Length); +extern VOID HalSsiSetSclkRtl8195a(VOID *Adapter, u32 ClkRate); +#ifdef CONFIG_GDMA_EN +extern VOID HalSsiDmaInitRtl8195a(VOID *Adapter); +#endif + +VOID HalSsiOpInit(VOID *Adaptor) +{ + PHAL_SSI_OP pHalSsiOp = (PHAL_SSI_OP) Adaptor; + +// pHalSsiOp->HalSsiPinmuxEnable = HalSsiPinmuxEnableRtl8195a; + pHalSsiOp->HalSsiPinmuxEnable = HalSsiPinmuxEnableRtl8195a_Patch; + pHalSsiOp->HalSsiPinmuxDisable = HalSsiPinmuxDisableRtl8195a; + pHalSsiOp->HalSsiEnable = HalSsiEnableRtl8195a; + pHalSsiOp->HalSsiDisable = HalSsiDisableRtl8195a; +// pHalSsiOp->HalSsiInit = HalSsiInitRtl8195a; + pHalSsiOp->HalSsiInit = HalSsiInitRtl8195a_Patch; + pHalSsiOp->HalSsiSetSclkPolarity = HalSsiSetSclkPolarityRtl8195a; + pHalSsiOp->HalSsiSetSclkPhase = HalSsiSetSclkPhaseRtl8195a; + pHalSsiOp->HalSsiWrite = HalSsiWriteRtl8195a; + pHalSsiOp->HalSsiRead = HalSsiReadRtl8195a; + pHalSsiOp->HalSsiGetRxFifoLevel = HalSsiGetRxFifoLevelRtl8195a; + pHalSsiOp->HalSsiGetTxFifoLevel = HalSsiGetTxFifoLevelRtl8195a; + pHalSsiOp->HalSsiGetStatus = HalSsiGetStatusRtl8195a; + pHalSsiOp->HalSsiGetInterruptStatus = HalSsiGetInterruptStatusRtl8195a; + pHalSsiOp->HalSsiLoadSetting = HalSsiLoadSettingRtl8195a; + pHalSsiOp->HalSsiSetInterruptMask = HalSsiSetInterruptMaskRtl8195a; + pHalSsiOp->HalSsiGetInterruptMask = HalSsiGetInterruptMaskRtl8195a; + pHalSsiOp->HalSsiSetDeviceRole = HalSsiSetDeviceRoleRtl8195a; + pHalSsiOp->HalSsiWriteable = HalSsiWriteableRtl8195a; + pHalSsiOp->HalSsiReadable = HalSsiReadableRtl8195a; + pHalSsiOp->HalSsiBusy = HalSsiBusyRtl8195a; + pHalSsiOp->HalSsiInterruptEnable = HalSsiInterruptEnableRtl8195a; + pHalSsiOp->HalSsiInterruptDisable = HalSsiInterruptDisableRtl8195a; +// pHalSsiOp->HalSsiReadInterrupt = HalSsiReadInterruptRtl8195a; + pHalSsiOp->HalSsiReadInterrupt = HalSsiIntReadRtl8195a; + pHalSsiOp->HalSsiSetRxFifoThresholdLevel = HalSsiSetRxFifoThresholdLevelRtl8195a; + pHalSsiOp->HalSsiSetTxFifoThresholdLevel = HalSsiSetTxFifoThresholdLevelRtl8195a; +// pHalSsiOp->HalSsiWriteInterrupt = HalSsiWriteInterruptRtl8195a; + pHalSsiOp->HalSsiWriteInterrupt = HalSsiIntWriteRtl8195a; + pHalSsiOp->HalSsiGetRawInterruptStatus = HalSsiGetRawInterruptStatusRtl8195a; + pHalSsiOp->HalSsiGetSlaveEnableRegister = HalSsiGetSlaveEnableRegisterRtl8195a; + pHalSsiOp->HalSsiSetSlaveEnableRegister = HalSsiSetSlaveEnableRegisterRtl8195a; +} + + +#ifdef CONFIG_GDMA_EN + +HAL_Status +HalSsiTxGdmaInit( + IN PHAL_SSI_OP pHalSsiOp, + IN PHAL_SSI_ADAPTOR pHalSsiAdapter +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PSSI_DMA_CONFIG pDmaConfig; + HAL_GDMA_CHNL *pgdma_chnl; + PHAL_GDMA_OP pHalGdmaOp; + + if ((NULL == pHalSsiOp) || (NULL == pHalSsiAdapter)) { + return HAL_ERR_PARA; + } + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + + // Load default setting + HalSsiTxGdmaLoadDefRtl8195a((void*)pHalSsiAdapter); + + // Start to patch the default setting + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter; + if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) { + // The default GDMA Channel is not available, try others + if (pHalSsiAdapter->Index == 2) { + // SSI2 TX Only can use GDMA 0 + pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Ssi2_TX_GDMA_Chnl_Option); + } + else { + pgdma_chnl = HalGdmaChnlAlloc(NULL); + } + + if (pgdma_chnl == NULL) { + // No Available DMA channel + return HAL_BUSY; + } + else { + pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx; + pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl; + pDmaConfig->TxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum; + } + } + + DBG_SSI_INFO("HalSsiTxGdmaInit: GdmaIndex=%d ChNum=%d \r\n", pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum); + pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp; + pHalGdmaOp->HalGdmaOnOff((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChIsrEnAndDis((VOID*)(pHalGdmaAdapter)); + + HalSsiDmaInit(pHalSsiAdapter); + InterruptRegister(&pDmaConfig->TxGdmaIrqHandle); + InterruptEn(&pDmaConfig->TxGdmaIrqHandle); + + return HAL_OK; +} + +VOID +HalSsiTxGdmaDeInit( + IN PHAL_SSI_ADAPTOR pHalSsiAdapter +) +{ + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + HAL_GDMA_CHNL GdmaChnl; + + if (NULL == pHalSsiAdapter) { + return; + } + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pTxHalGdmaAdapter; + GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex; + GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum; + GdmaChnl.IrqNum = pDmaConfig->TxGdmaIrqHandle.IrqNum; + HalGdmaChnlFree(&GdmaChnl); +} + + +HAL_Status +HalSsiRxGdmaInit( + IN PHAL_SSI_OP pHalSsiOp, + IN PHAL_SSI_ADAPTOR pHalSsiAdapter +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + PSSI_DMA_CONFIG pDmaConfig; + HAL_GDMA_CHNL *pgdma_chnl; + PHAL_GDMA_OP pHalGdmaOp; + + if ((NULL == pHalSsiOp) || (NULL == pHalSsiAdapter)) { + return HAL_ERR_PARA; + } + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + // Load default setting + HalSsiRxGdmaLoadDefRtl8195a((void*)pHalSsiAdapter); + + // Start to patch the default setting + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter; + if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) { + // The default GDMA Channel is not available, try others + if (pHalSsiAdapter->Index == 2) { + // SSI2 RX Only can use GDMA 1 + pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Ssi2_RX_GDMA_Chnl_Option); + } + else { + pgdma_chnl = HalGdmaChnlAlloc(NULL); + } + + if (pgdma_chnl == NULL) { + // No Available DMA channel + return HAL_BUSY; + } + else { + pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx; + pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl; + pDmaConfig->RxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum; + } + } + + DBG_SSI_INFO("HalSsiRxGdmaInit: GdmaIndex=%d ChNum=%d \r\n", pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum); + pHalGdmaOp = (PHAL_GDMA_OP)pDmaConfig->pHalGdmaOp; + pHalGdmaOp->HalGdmaOnOff((VOID*)(pHalGdmaAdapter)); + pHalGdmaOp->HalGdmaChIsrEnAndDis((VOID*)(pHalGdmaAdapter)); + + HalSsiDmaInit(pHalSsiAdapter); + InterruptRegister(&pDmaConfig->RxGdmaIrqHandle); + InterruptEn(&pDmaConfig->RxGdmaIrqHandle); + + return HAL_OK; +} + +VOID +HalSsiRxGdmaDeInit( + IN PHAL_SSI_ADAPTOR pHalSsiAdapter +) +{ + PSSI_DMA_CONFIG pDmaConfig; + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + HAL_GDMA_CHNL GdmaChnl; + + if (NULL == pHalSsiAdapter) { + return; + } + + pDmaConfig = &pHalSsiAdapter->DmaConfig; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pDmaConfig->pRxHalGdmaAdapter; + GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex; + GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum; + GdmaChnl.IrqNum = pDmaConfig->RxGdmaIrqHandle.IrqNum; + HalGdmaChnlFree(&GdmaChnl); +} + +#endif // end of "#ifdef CONFIG_GDMA_EN" + +HAL_Status +HalSsiInit(VOID *Data) +{ + HAL_Status ret; + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE SsiPwrState; +#endif + ret = HalSsiInitRtl8195a_Patch(pHalSsiAdapter); +#ifdef CONFIG_SOC_PS_MODULE + if(ret == HAL_OK) { + // To register a new peripheral device power state + SsiPwrState.FuncIdx = SPI0+ pHalSsiAdapter->Index; + SsiPwrState.PwrState = ACT; + RegPowerState(SsiPwrState); + } +#endif + + return ret; +} + +HAL_Status +HalSsiDeInit(VOID *Data) +{ + HAL_Status ret; + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE SsiPwrState; + u8 HardwareState; + + SsiPwrState.FuncIdx= SPI0+ pHalSsiAdapter->Index; + QueryRegPwrState(SsiPwrState.FuncIdx, &(SsiPwrState.PwrState), &HardwareState); + + if(SsiPwrState.PwrState != HardwareState){ + DBG_SSI_ERR("Registered State is not the Hardware State"); + return HAL_ERR_UNKNOWN; + } + else{ + if((SsiPwrState.PwrState != INACT) && (SsiPwrState.PwrState !=ACT)){ + DBG_SSI_INFO("Return to ACT state before DeInit"); + HalSsiEnable(pHalSsiAdapter); + QueryRegPwrState(SsiPwrState.FuncIdx, &(SsiPwrState.PwrState), &HardwareState); + } + if(SsiPwrState.PwrState == ACT){ + SsiPwrState.PwrState = INACT; + RegPowerState(SsiPwrState); + } + } +#endif + ret = HalSsiDeInitRtl8195a(pHalSsiAdapter); + return ret; +} + + +HAL_Status +HalSsiEnable(VOID *Data) +{ + HAL_Status ret; + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE SsiPwrState; +#endif + ret = HalSsiClockOnRtl8195a(pHalSsiAdapter); +#ifdef CONFIG_SOC_PS_MODULE + if(ret == HAL_OK) { + // To register a new peripheral device power state + SsiPwrState.FuncIdx = SPI0+ pHalSsiAdapter->Index; + SsiPwrState.PwrState = ACT; + RegPowerState(SsiPwrState); + } +#endif + + return ret; +} + +HAL_Status +HalSsiDisable(VOID *Data) +{ + HAL_Status ret; + PHAL_SSI_ADAPTOR pHalSsiAdapter = (PHAL_SSI_ADAPTOR) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE SsiPwrState; +#endif + ret = HalSsiClockOffRtl8195a(pHalSsiAdapter); +#ifdef CONFIG_SOC_PS_MODULE + if(ret == HAL_OK) { + // To register a new peripheral device power state + SsiPwrState.FuncIdx = SPI0+ pHalSsiAdapter->Index; + SsiPwrState.PwrState = SLPCG; + RegPowerState(SsiPwrState); + } +#endif + + return ret; +} \ No newline at end of file diff --git a/lib/fwlib/src/hal_timer.c b/lib/fwlib/src/hal_timer.c new file mode 100644 index 0000000..617b593 --- /dev/null +++ b/lib/fwlib/src/hal_timer.c @@ -0,0 +1,32 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" + +VOID +HalTimerOpInit_Patch( + IN VOID *Data +) +{ + PHAL_TIMER_OP pHalTimerOp = (PHAL_TIMER_OP) Data; + + pHalTimerOp->HalGetTimerId = HalGetTimerIdRtl8195a; + pHalTimerOp->HalTimerInit = (BOOL (*)(void*))HalTimerInitRtl8195a_Patch; +#ifdef CONFIG_CHIP_C_CUT + pHalTimerOp->HalTimerReadCount = HalTimerReadCountRtl8195aV02; +#else + pHalTimerOp->HalTimerReadCount = HalTimerReadCountRtl8195a_Patch; +#endif + pHalTimerOp->HalTimerIrqClear = HalTimerIrqClearRtl8195a; + pHalTimerOp->HalTimerDis = HalTimerDisRtl8195a_Patch; + pHalTimerOp->HalTimerEn = HalTimerEnRtl8195a_Patch; + pHalTimerOp->HalTimerDumpReg = HalTimerDumpRegRtl8195a; +} + diff --git a/lib/fwlib/src/hal_uart.c b/lib/fwlib/src/hal_uart.c new file mode 100644 index 0000000..6703357 --- /dev/null +++ b/lib/fwlib/src/hal_uart.c @@ -0,0 +1,871 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + + +#include "rtl8195a.h" +#include "rtl8195a_uart.h" +#include "hal_uart.h" +#include "hal_gdma.h" + +#ifndef CONFIG_CHIP_E_CUT +// Pre-Defined Supported Baud Rate Table for CPU 166 MHz +const u32 DEF_BAUDRATE_TABLE[] = { + 110, 300, 600, 1200, + 2400, 4800, 9600, 14400, + 19200, 28800, 38400, 57600, + 76800, 115200, 128000, 153600, + 230400, 380400, 460800, 500000, + 921600, 1000000, 1382400, 1444400, + 1500000, 1843200, 2000000, 2100000, + 2764800, 3000000, 3250000, 3692300, + 3750000, 4000000, 6000000, + + 56000, 256000, + + // For UART to IR Carrier + 66000, 72000, 73400, 76000, + 80000, 112000, + + // End of the table + 0xffffffff +}; + +const u16 ovsr_adj_table_10bit[10] = { + 0x000, 0x020, 0x044, 0x124, 0x294, 0x2AA, 0x16B, 0x2DB, 0x3BB, 0x3EF +}; + +const u16 ovsr_adj_table_9bit[9] = { + 0x000, 0x010, 0x044, 0x92, 0xAA, 0x155, 0x1B6, 0x1BB, 0x1EF +}; + +const u16 ovsr_adj_table_8bit[8] = { + 0x000, 0x010, 0x044, 0x92, 0xAA, 0xB5, 0xBB, 0xEF +}; + +#if 0 // Old format +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) + +const u8 DEF_OVSR_166[] = { + 10, 10, 12, 14, + 10, 10, 10, 11, + 14, 11, 14, 11, + 14, 10, 11, 14, + 18, 17, 17, 18, + 17, 13, 19, 18, + 10, 11, 13, 19, + 14, 13, 12, 11, + 10, 10, 13, + + 20, 18, + + // For UART to IR Carrier + 13, 13, 18, 15, + 20, 12, +}; + +const u16 DEF_DIV_166[] = { + 74272, 27233, 11347, 4863, + 3404, 1702, 851, 516, + 304, 258, 152, 129, + 76, 71, 58, 38, + 19, 12, 10, 9, + 5, 6, 3, 3, + 5, 4, 3, 2, + 2, 2, 2, 2, + 2, 2, 1, + + 73, 17, + + // For UART to IR Carrier + 97, 89, 63, 73, + 52, 62, +}; + + +const u16 DEF_OVSR_ADJ_166[] = { + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, + 0x2AA, 0x3BB, 0x1B6, 0x010, + 0x1B6, 0x2AA, 0x1B6, 0x2DB, + 0x3BB, 0x000, 0x2AA, 0x294, + 0x2DB, 0x2AA, 0x2AA, 0x000 , + 0x3BB, 0x088, 0x2AA, + + 0x000, 0x2DB, + + // For UART to IR Carrier + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000 +}; +#endif //#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) + +#ifdef CONFIG_CHIP_C_CUT + +const u8 DEF_OVSR_166[] = { + 13, 12, 12, 12, + 18, 10, 10, 11, + 10, 11, 10, 20, + 20, 20, 20, 20, + 20, 18, 20, 12, + 15, 16, 20, 19, + 18, 15, 10, 13, + 15, 13, 12, 11, + 11, 10, 13, + + 16, 18, + + // For UART to IR Carrier + 13, 13, 18, 15, + 20, 12, +}; + +const u16 DEF_DIV_166[] = { + 58275, 23148, 11574, 5787, + 1929, 1736, 868, 526, + 434, 263, 217, 72, + 54, 36, 32, 27, + 18, 12, 9, 13, + 6, 5, 3, 3, + 3, 3, 4, 3, + 2, 2, 2, 2, + 2, 2, 1, + + 93, 18, + + // For UART to IR Carrier + 97, 89, 63, 73, + 52, 62, +}; + +const u16 DEF_OVSR_ADJ_166[] = { + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000, 0x000, 0x010, + 0x010, 0x010, 0x124, 0x010, + 0x010, 0x088, 0x010, 0x2DB, + 0x000, 0x16B, 0x010, 0x088, + 0x2AA, 0x000, 0x294, 0x088, + 0x000, 0x3BB, 0x3BB, 0x088, + 0x010, 0x294, 0x3BB, + + 0x000, 0x010, + + // For UART to IR Carrier + 0x000, 0x000, 0x000, 0x000, + 0x000, 0x000 +}; + +#endif // #ifdef CONFIG_CHIP_C_CUT +#endif // end of #if 0 // Old format + +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) +const u8 DEF_OVSR_B_CUT[] = { + 20, 20, 20, 20, + 20, 20, 15, 18, + 13, 15, 18, 13, + 18, 12, 11, 10, + 16, 15, 16, 18, + 11, 20, 19, 14, + 18, 11, 20, 19, + 14, 13, 12, 11, + 21, 20, 13, + + 18, 11, + + // For UART to IR Carrier + 13, 13, 18, 15, + 20, 12 + +}; + +const u16 DEF_DIV_B_CUT[] = { + 37202, 13616, 6808, 3404, + 1702, 851, 567, 315, + 327, 189, 118, 109, + 59, 59, 58, 53, + 22, 14, 11, 9, + 8, 4, 3, 4, + 3, 4, 2, 2, + 2, 2, 2, 2, + 1, 1, 1, + + 81, 29, + + // For UART to IR Carrier + 97, 89, 63, 73, + 52, 62 +}; + +const u8 DEF_OVSR_ADJ_BITS_B_CUT_10B[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 3, 1, 2, + 1, 4, 7, 1, + 2, 1, 4, 5, + 8, 6, 6, 1, + 8, 4, 6, + + 0, 0, + + // For UART to IR Carrier + 0, 0, 0, 0, + 0, 0 + +}; + +const u8 DEF_OVSR_ADJ_BITS_B_CUT_9B[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 3, 1, 1, + 1, 4, 6, 1, + 1, 1, 4, 4, + 7, 6, 5, 1, + 7, 4, 6, + + 0, 0, + + // For UART to IR Carrier + 0, 0, 0, 0, + 0, 0 + +}; + +const u8 DEF_OVSR_ADJ_BITS_B_CUT_8B[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 1, 3, 1, 1, + 1, 4, 6, 1, + 1, 1, 4, 4, + 6, 5, 5, 1, + 6, 4, 5, + + 0, 0, + + // For UART to IR Carrier + 0, 0, 0, 0, + 0, 0 +}; + +#endif // #if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) + +const u8 DEF_OVSR_C_CUT[] = { + 20, 20, 20, 20, + 20, 20, 20, 14, + 20, 12, 14, 19, + 19, 19, 13, 20, + 19, 18, 20, 15, + 18, 20, 20, 19, + 11, 15, 20, 13, + 15, 13, 12, 11, + 11, 20, 13, + + 16, 13, + + // For UART to IR Carrier + 13, 13, 18, 15, + 20, 12 +}; + +const u16 DEF_DIV_C_CUT[] = { + 37878, 13888, 6944, 3472, + 1736, 868, 434, 413, + 217, 241, 155, 76, + 57, 38, 50, 27, + 19, 12, 9, 11, + 5, 4, 3, 3, + 5, 3, 2, 3, + 2, 2, 2, 2, + 2, 1, 1, + + 93, 25, + + // For UART to IR Carrier + 97, 89, 63, 73, + 52, 62 +}; + +const u8 DEF_OVSR_ADJ_BITS_C_CUT_10B[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 3, 1, 2, + 1, 8, 1, 2, + 1, 1, 8, 2, + 1, 9, 8, 3, + 1, 8, 9, + + 0, 0, + + // For UART to IR Carrier + 0, 0, 0, 0, + 0, 0 + +}; + +const u8 DEF_OVSR_ADJ_BITS_C_CUT_9B[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 2, 1, 1, + 1, 8, 1, 2, + 1, 1, 8, 2, + 1, 8, 8, 3, + 1, 8, 8, + + 0, 0, + + // For UART to IR Carrier + 0, 0, 0, 0, + 0, 0 + +}; + +const u8 DEF_OVSR_ADJ_BITS_C_CUT_8B[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 1, + 0, 2, 1, 1, + 1, 7, 1, 2, + 1, 1, 7, 2, + 1, 7, 7, 2, + 1, 7, 7, + + 0, 0, + + // For UART to IR Carrier + 0, 0, 0, 0, + 0, 0 +}; + +#endif // #if !(CONFIG_CHIP_E_CUT) + +extern u32 _UartIrqHandle(VOID *Data); + +extern HAL_Status +HalRuartInitRtl8195a_Patch( + IN VOID *Data ///< RUART Adapter + ); + +#if (CONFIG_CHIP_C_CUT) +extern _LONG_CALL_ HAL_Status +HalRuartInitRtl8195aV02( + IN VOID *Data ///< RUART Adapter + ); +#endif + +extern u8 HalRuartGetChipVerRtl8195a(VOID); + +const HAL_GDMA_CHNL Uart2_TX_GDMA_Chnl_Option[] = { + {0,0,GDMA0_CHANNEL0_IRQ,0}, + {0,1,GDMA0_CHANNEL1_IRQ,0}, + {0,2,GDMA0_CHANNEL2_IRQ,0}, + {0,3,GDMA0_CHANNEL3_IRQ,0}, + {0,4,GDMA0_CHANNEL4_IRQ,0}, + {0,5,GDMA0_CHANNEL5_IRQ,0}, + + {0xff,0,0,0} // end +}; + +const HAL_GDMA_CHNL Uart2_RX_GDMA_Chnl_Option[] = { + {1,0,GDMA1_CHANNEL0_IRQ,0}, + {1,1,GDMA1_CHANNEL1_IRQ,0}, + {1,2,GDMA1_CHANNEL2_IRQ,0}, + {1,3,GDMA1_CHANNEL3_IRQ,0}, + {1,4,GDMA1_CHANNEL4_IRQ,0}, + {1,5,GDMA1_CHANNEL5_IRQ,0}, + + {0xff,0,0,0} // end +}; + +VOID +HalRuartOpInit( + IN VOID *Data +) +{ + PHAL_RUART_OP pHalRuartOp = (PHAL_RUART_OP) Data; + + pHalRuartOp->HalRuartAdapterLoadDef = HalRuartAdapterLoadDefRtl8195a; + pHalRuartOp->HalRuartTxGdmaLoadDef = HalRuartTxGdmaLoadDefRtl8195a; + pHalRuartOp->HalRuartRxGdmaLoadDef = HalRuartRxGdmaLoadDefRtl8195a; + pHalRuartOp->HalRuartResetRxFifo = HalRuartResetRxFifoRtl8195a; +#if CONFIG_CHIP_E_CUT + pHalRuartOp->HalRuartInit = HalRuartInitRtl8195a_V04; +#else + pHalRuartOp->HalRuartInit = HalRuartInitRtl8195a_Patch; // Hardware Init ROM code patch +#endif + pHalRuartOp->HalRuartDeInit = HalRuartDeInitRtl8195a; // Hardware Init + pHalRuartOp->HalRuartPutC = HalRuartPutCRtl8195a; // Send a byte + pHalRuartOp->HalRuartSend = HalRuartSendRtl8195a; // Polling mode Tx + pHalRuartOp->HalRuartIntSend = HalRuartIntSendRtl8195a; // Interrupt mode Tx +#if CONFIG_CHIP_E_CUT + pHalRuartOp->HalRuartDmaSend = HalRuartDmaSendRtl8195a_V04; // DMA mode Tx + pHalRuartOp->HalRuartStopSend = HalRuartStopSendRtl8195a_V04; // Stop non-blocking TX +#else + pHalRuartOp->HalRuartDmaSend = HalRuartDmaSendRtl8195a_Patch; // DMA mode Tx + pHalRuartOp->HalRuartStopSend = HalRuartStopSendRtl8195a_Patch; // Stop non-blocking TX +#endif + pHalRuartOp->HalRuartGetC = HalRuartGetCRtl8195a; // get a byte + pHalRuartOp->HalRuartRecv = HalRuartRecvRtl8195a; // Polling mode Rx + pHalRuartOp->HalRuartIntRecv = HalRuartIntRecvRtl8195a; // Interrupt mode Rx + pHalRuartOp->HalRuartDmaRecv = HalRuartDmaRecvRtl8195a; // DMA mode Rx +#if CONFIG_CHIP_E_CUT + pHalRuartOp->HalRuartStopRecv = HalRuartStopRecvRtl8195a_V04; // Stop non-blocking Rx +#else + pHalRuartOp->HalRuartStopRecv = HalRuartStopRecvRtl8195a_Patch; // Stop non-blocking Rx +#endif + pHalRuartOp->HalRuartGetIMR = HalRuartGetIMRRtl8195a; + pHalRuartOp->HalRuartSetIMR = HalRuartSetIMRRtl8195a; + pHalRuartOp->HalRuartGetDebugValue = HalRuartGetDebugValueRtl8195a; + pHalRuartOp->HalRuartDmaInit = HalRuartDmaInitRtl8195a; + pHalRuartOp->HalRuartRTSCtrl = HalRuartRTSCtrlRtl8195a; + pHalRuartOp->HalRuartRegIrq = HalRuartRegIrqRtl8195a; + pHalRuartOp->HalRuartIntEnable = HalRuartIntEnableRtl8195a; + pHalRuartOp->HalRuartIntDisable = HalRuartIntDisableRtl8195a; +} + +/** + * Load UART HAL default setting + * + * Call this function to load the default setting for UART HAL adapter + * + * + */ +VOID +HalRuartAdapterInit( + PRUART_ADAPTER pRuartAdapter, + u8 UartIdx +) +{ + PHAL_RUART_OP pHalRuartOp; + PHAL_RUART_ADAPTER pHalRuartAdapter; + + if (NULL == pRuartAdapter) { + return; + } + + pHalRuartOp = pRuartAdapter->pHalRuartOp; + pHalRuartAdapter = pRuartAdapter->pHalRuartAdapter; + + if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter)) { + return; + } + + // Load default setting + if (pHalRuartOp->HalRuartAdapterLoadDef != NULL) { + pHalRuartOp->HalRuartAdapterLoadDef (pHalRuartAdapter, UartIdx); + pHalRuartAdapter->IrqHandle.Priority = 6; + } + else { + // Initial your UART HAL adapter here + } + + // Start to modify the defualt setting + pHalRuartAdapter->PinmuxSelect = RUART0_MUX_TO_GPIOC; + pHalRuartAdapter->BaudRate = 38400; + +// pHalRuartAdapter->IrqHandle.IrqFun = (IRQ_FUN)_UartIrqHandle; +// pHalRuartAdapter->IrqHandle.Data = (void *)pHalRuartAdapter; + + // Register IRQ + InterruptRegister(&pHalRuartAdapter->IrqHandle); + +} + +/** + * Load UART HAL GDMA default setting + * + * Call this function to load the default setting for UART GDMA + * + * + */ +HAL_Status +HalRuartTxGdmaInit( + PHAL_RUART_OP pHalRuartOp, + PHAL_RUART_ADAPTER pHalRuartAdapter, + PUART_DMA_CONFIG pUartGdmaConfig +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + HAL_GDMA_CHNL *pgdma_chnl; + + if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter) || (NULL == pUartGdmaConfig)) { + return HAL_ERR_PARA; + } + + // Load default setting + if (pHalRuartOp->HalRuartTxGdmaLoadDef != NULL) { + pHalRuartOp->HalRuartTxGdmaLoadDef (pHalRuartAdapter, pUartGdmaConfig); + pUartGdmaConfig->TxGdmaIrqHandle.Priority = 6; + } + else { + // Initial your GDMA setting here + } + + // Start to patch the default setting + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter; + if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) { + // The default GDMA Channel is not available, try others + if (pHalRuartAdapter->UartIndex == 2) { + // UART2 TX Only can use GDMA 0 + pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Uart2_TX_GDMA_Chnl_Option); + } + else { + pgdma_chnl = HalGdmaChnlAlloc(NULL); + } + + if (pgdma_chnl == NULL) { + // No Available DMA channel + return HAL_BUSY; + } + else { + pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx; + pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl; + pUartGdmaConfig->TxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum; + } + } + + // User can assign a Interrupt Handler here +// pUartGdmaConfig->TxGdmaIrqHandle.Data = pHalRuartAdapter; +// pUartGdmaConfig->TxGdmaIrqHandle.IrqFun = (IRQ_FUN)_UartTxDmaIrqHandle +// pUartGdmaConfig->TxGdmaIrqHandle.Priority = 0x20; + + pHalRuartOp->HalRuartDmaInit (pHalRuartAdapter); + InterruptRegister(&pUartGdmaConfig->TxGdmaIrqHandle); + InterruptEn(&pUartGdmaConfig->TxGdmaIrqHandle); + + return HAL_OK; +} + +VOID +HalRuartTxGdmaDeInit( + PUART_DMA_CONFIG pUartGdmaConfig +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + HAL_GDMA_CHNL GdmaChnl; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pTxHalGdmaAdapter; + GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex; + GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum; + GdmaChnl.IrqNum = pUartGdmaConfig->TxGdmaIrqHandle.IrqNum; + HalGdmaChnlFree(&GdmaChnl); +} + +/** + * Load UART HAL GDMA default setting + * + * Call this function to load the default setting for UART GDMA + * + * + */ +HAL_Status +HalRuartRxGdmaInit( + PHAL_RUART_OP pHalRuartOp, + PHAL_RUART_ADAPTER pHalRuartAdapter, + PUART_DMA_CONFIG pUartGdmaConfig +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + HAL_GDMA_CHNL *pgdma_chnl; + + if ((NULL == pHalRuartOp) || (NULL == pHalRuartAdapter) || (NULL == pUartGdmaConfig)) { + return HAL_ERR_PARA; + } + + // Load default setting + if (pHalRuartOp->HalRuartRxGdmaLoadDef != NULL) { + pHalRuartOp->HalRuartRxGdmaLoadDef (pHalRuartAdapter, pUartGdmaConfig); + pUartGdmaConfig->RxGdmaIrqHandle.Priority = 6; + } + else { + // Initial your GDMA setting here + } + + // Start to patch the default setting + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter; + if (HalGdmaChnlRegister(pHalGdmaAdapter->GdmaIndex, pHalGdmaAdapter->ChNum) != HAL_OK) { + // The default GDMA Channel is not available, try others + if (pHalRuartAdapter->UartIndex == 2) { + // UART2 RX Only can use GDMA 1 + pgdma_chnl = HalGdmaChnlAlloc((HAL_GDMA_CHNL*)Uart2_RX_GDMA_Chnl_Option); + } + else { + pgdma_chnl = HalGdmaChnlAlloc(NULL); + } + + if (pgdma_chnl == NULL) { + // No Available DMA channel + return HAL_BUSY; + } + else { + pHalGdmaAdapter->GdmaIndex = pgdma_chnl->GdmaIndx; + pHalGdmaAdapter->ChNum = pgdma_chnl->GdmaChnl; + pHalGdmaAdapter->ChEn = 0x0101 << pgdma_chnl->GdmaChnl; + pUartGdmaConfig->RxGdmaIrqHandle.IrqNum = pgdma_chnl->IrqNum; + } + } + +// pUartGdmaConfig->RxGdmaIrqHandle.Data = pHalRuartAdapter; +// pUartGdmaConfig->RxGdmaIrqHandle.IrqFun = (IRQ_FUN)_UartTxDmaIrqHandle; +// pUartGdmaConfig->RxGdmaIrqHandle.Priority = 0x20; + + pHalRuartOp->HalRuartDmaInit (pHalRuartAdapter); + InterruptRegister(&pUartGdmaConfig->RxGdmaIrqHandle); + InterruptEn(&pUartGdmaConfig->RxGdmaIrqHandle); + + return HAL_OK; +} + +VOID +HalRuartRxGdmaDeInit( + PUART_DMA_CONFIG pUartGdmaConfig +) +{ + PHAL_GDMA_ADAPTER pHalGdmaAdapter; + HAL_GDMA_CHNL GdmaChnl; + + pHalGdmaAdapter = (PHAL_GDMA_ADAPTER)pUartGdmaConfig->pRxHalGdmaAdapter; + GdmaChnl.GdmaIndx = pHalGdmaAdapter->GdmaIndex; + GdmaChnl.GdmaChnl = pHalGdmaAdapter->ChNum; + GdmaChnl.IrqNum = pUartGdmaConfig->RxGdmaIrqHandle.IrqNum; + HalGdmaChnlFree(&GdmaChnl); +} + +/** + * Hook a RX indication callback + * + * To hook a callback function which will be called when a got a RX byte + * + * + */ +VOID +HalRuartRxIndHook( + PRUART_ADAPTER pRuartAdapter, + VOID *pCallback, + VOID *pPara +) +{ + PHAL_RUART_ADAPTER pHalRuartAdapter = pRuartAdapter->pHalRuartAdapter; + + pHalRuartAdapter->RxDRCallback = (void (*)(void*))pCallback; + pHalRuartAdapter->RxDRCbPara = pPara; + + // enable RX data ready interrupt + pHalRuartAdapter->Interrupts |= RUART_IER_ERBI | RUART_IER_ELSI; + pRuartAdapter->pHalRuartOp->HalRuartSetIMR(pHalRuartAdapter); +} + + +HAL_Status +HalRuartResetTxFifo( + IN VOID *Data +) +{ + return (HalRuartResetTxFifoRtl8195a(Data)); +} + +HAL_Status +HalRuartSetBaudRate( + IN VOID *Data +) +{ +#if CONFIG_CHIP_E_CUT + return HalRuartSetBaudRateRtl8195a_V04(Data); +#else + return HalRuartSetBaudRateRtl8195a(Data); +#endif +} + +HAL_Status +HalRuartInit( + IN VOID *Data +) +{ + HAL_Status ret; + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE UartPwrState; +#endif +#if CONFIG_CHIP_E_CUT + pHalRuartAdapter->pDefaultBaudRateTbl = (uint32_t*)BAUDRATE_166_ROM_V04; + pHalRuartAdapter->pDefaultOvsrRTbl = (uint8_t*)OVSR_166_ROM_V04; + pHalRuartAdapter->pDefaultOvsrAdjTbl = (uint16_t*)OVSR_ADJ_166_ROM_V04; + pHalRuartAdapter->pDefaultDivTbl = (uint16_t*)DIV_166_ROM_V04; + ret = HalRuartInitRtl8195a_V04(Data); +#else + pHalRuartAdapter->pDefaultBaudRateTbl = (uint32_t*)DEF_BAUDRATE_TABLE; +#if defined(CONFIG_CHIP_A_CUT) || defined(CONFIG_CHIP_B_CUT) + u8 chip_ver; + + chip_ver = HalRuartGetChipVerRtl8195a(); + if (chip_ver < 2) { + pHalRuartAdapter->pDefaultOvsrRTbl = (uint8_t*)DEF_OVSR_B_CUT; + pHalRuartAdapter->pDefaultDivTbl = (uint16_t*)DEF_DIV_B_CUT; + pHalRuartAdapter->pDefOvsrAdjBitTbl_10 = (uint8_t*)DEF_OVSR_ADJ_BITS_B_CUT_10B; + pHalRuartAdapter->pDefOvsrAdjBitTbl_9 = (uint8_t*)DEF_OVSR_ADJ_BITS_B_CUT_9B; + pHalRuartAdapter->pDefOvsrAdjBitTbl_8 = (uint8_t*)DEF_OVSR_ADJ_BITS_B_CUT_8B; + } + else +#endif + { + pHalRuartAdapter->pDefaultOvsrRTbl = (uint8_t*)DEF_OVSR_C_CUT; + pHalRuartAdapter->pDefaultDivTbl = (uint16_t*)DEF_DIV_C_CUT; + pHalRuartAdapter->pDefOvsrAdjBitTbl_10 = (uint8_t*)DEF_OVSR_ADJ_BITS_C_CUT_10B; + pHalRuartAdapter->pDefOvsrAdjBitTbl_9 = (uint8_t*)DEF_OVSR_ADJ_BITS_C_CUT_9B; + pHalRuartAdapter->pDefOvsrAdjBitTbl_8 = (uint8_t*)DEF_OVSR_ADJ_BITS_C_CUT_8B; + } + pHalRuartAdapter->pDefOvsrAdjTbl_10 = (uint16_t*)ovsr_adj_table_10bit; + pHalRuartAdapter->pDefOvsrAdjTbl_9 = (uint16_t*)ovsr_adj_table_9bit; + pHalRuartAdapter->pDefOvsrAdjTbl_8 = (uint16_t*)ovsr_adj_table_8bit; + + ret = HalRuartInitRtl8195a_Patch(Data); +#endif + +#ifdef CONFIG_SOC_PS_MODULE + if(ret == HAL_OK) { + // To register a new peripheral device power state + UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex; + UartPwrState.PwrState = ACT; + RegPowerState(UartPwrState); + } +#endif + return ret; +} + +VOID +HalRuartDeInit( + IN VOID *Data +) +{ +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE UartPwrState; + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; + u8 HwState; + + UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex; + QueryRegPwrState(UartPwrState.FuncIdx, &(UartPwrState.PwrState), &HwState); + + // if the power state isn't ACT, then switch the power state back to ACT first + if ((UartPwrState.PwrState != ACT) && (UartPwrState.PwrState != INACT)) { + HalRuartEnable(Data); + QueryRegPwrState(UartPwrState.FuncIdx, &(UartPwrState.PwrState), &HwState); + } + + if (UartPwrState.PwrState == ACT) { + UartPwrState.PwrState = INACT; + RegPowerState(UartPwrState); + } +#endif + + HalRuartDeInitRtl8195a(Data); +} + +HAL_Status +HalRuartDisable( + IN VOID *Data +) +{ + HAL_Status ret; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE UartPwrState; + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; +#endif + +#if CONFIG_CHIP_E_CUT + ret = HalRuartDisableRtl8195a_V04(Data); +#else + ret = HalRuartDisableRtl8195a(Data); +#endif +#ifdef CONFIG_SOC_PS_MODULE + if (ret == HAL_OK) { + UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex; + UartPwrState.PwrState = SLPCG; + RegPowerState(UartPwrState); + } +#endif + return ret; +} + +HAL_Status +HalRuartEnable( + IN VOID *Data +) +{ + HAL_Status ret; +#ifdef CONFIG_SOC_PS_MODULE + REG_POWER_STATE UartPwrState; + PHAL_RUART_ADAPTER pHalRuartAdapter = (PHAL_RUART_ADAPTER) Data; +#endif + +#if CONFIG_CHIP_E_CUT + ret = HalRuartEnableRtl8195a_V04(Data); +#else + ret = HalRuartEnableRtl8195a(Data); +#endif +#ifdef CONFIG_SOC_PS_MODULE + if (ret == HAL_OK) { + UartPwrState.FuncIdx = UART0 + pHalRuartAdapter->UartIndex; + UartPwrState.PwrState = ACT; + RegPowerState(UartPwrState); + } +#endif + return ret; +} + +HAL_Status +HalRuartFlowCtrl( + IN VOID *Data +) +{ + HAL_Status ret; + +#if CONFIG_CHIP_E_CUT + ret = HalRuartFlowCtrlRtl8195a_V04((VOID *)Data); +#else + ret = HalRuartFlowCtrlRtl8195a((VOID *)Data); +#endif + return ret; +} + +VOID +HalRuartEnterCritical( + IN VOID *Data +) +{ +#if CONFIG_CHIP_E_CUT + HalRuartEnterCriticalRtl8195a_V04(Data); +#else + HalRuartEnterCriticalRtl8195a(Data); +#endif +} + +VOID +HalRuartExitCritical( + IN VOID *Data +) +{ +#if CONFIG_CHIP_E_CUT + HalRuartExitCriticalRtl8195a_V04(Data); +#else + HalRuartExitCriticalRtl8195a(Data); +#endif +} + diff --git a/lib/libc/assert.h b/lib/libc/assert.h new file mode 100644 index 0000000..946dc03 --- /dev/null +++ b/lib/libc/assert.h @@ -0,0 +1,7 @@ +#ifndef _ASSERT_H_ +#define _ASSERT_H_ + +#include + +#endif + diff --git a/lib/libc/ctype.h b/lib/libc/ctype.h new file mode 100644 index 0000000..ec5f088 --- /dev/null +++ b/lib/libc/ctype.h @@ -0,0 +1,7 @@ +#ifndef _CTYPE_H_ +#define _CTYPE_H_ + +#include + +#endif + diff --git a/lib/libc/libc.c b/lib/libc/libc.c new file mode 100644 index 0000000..3685d28 --- /dev/null +++ b/lib/libc/libc.c @@ -0,0 +1,863 @@ +#include +#include +#include +#include +#include +#if defined (LIBC_GMTIME_R) || defined (LIBC_MKTIME) +#include +#endif + +#ifndef LIBC_FUNCTION_ATTRIBUTE +#define LIBC_FUNCTION_ATTRIBUTE +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PUTCHAR) || defined (LIBC_PUTC) || defined (LIBC_FPUTC) || defined (LIBC_PUTS) || defined (LIBC_FPUTS) || defined (LIBC_PRINTF) || defined (LIBC_FPRINTF) || defined (LIBC_WRITE) +#if defined (GCC_VERSION) || defined (__GNUC__) +ssize_t __attribute__((weak)) write_stdout(const void *buf __attribute__((unused)), size_t count){ + return(count); +} +ssize_t __attribute__((weak, alias("write_stdout"))) write_stderr(const void *buf, size_t count); +// FILE *stdin = NULL; +FILE *stdout = write_stdout; +FILE *stderr = write_stderr; +#else +#warning no weak functions for stdio +FILE *stdout; +FILE *stderr; +#endif +#endif + +#if defined (LIBC_ALL) || defined (LIBC_SNPRINTF) || defined (LIBC_VSNPRINTF) +struct _libc_snprintf_struct{ + char *str; + size_t loc; + size_t maxlen; +}__attribute__((packed)); +#endif + +#if defined (LIBC_ALL) || defined (LIBC_SNPRINTF) || defined (LIBC_VSNPRINTF) +static int LIBC_FUNCTION_ATTRIBUTE _libc_cswrite(void *user, const void *buf, int count); +#endif +#if defined (LIBC_ALL) || defined (LIBC_PRINTF) || defined (LIBC_FPRINTF) || defined (LIBC_SNPRINTF) || defined (LIBC_VSNPRINTF) +typedef ssize_t(*stream_user_t)(void *user, const void *buf, size_t count); +#define _LIBC_PRINT_PAD_RIGHT 1 +#define _LIBC_PRINT_PAD_ZERO 2 +#define _LIBC_PRINT_BUF_LEN 32 // sellesse peavad kõik prinditavad numbrid ära mahtuma +typedef ssize_t(*stream_t)(const void *buf, size_t count); +static int LIBC_FUNCTION_ATTRIBUTE _libc_cvprintf(stream_t cb, void *user, const char *format, va_list ap); +static int LIBC_FUNCTION_ATTRIBUTE _libc_cprints(stream_t cb, void *user, const char *string, int width, int pad); +static int LIBC_FUNCTION_ATTRIBUTE _libc_cprinti(stream_t cb, void *user, int i, int b, int sg, int width, int pad, int letbase); +static int LIBC_FUNCTION_ATTRIBUTE _libc_cprintl(stream_t cb, void *user, long long int i, int b, int sg, int width, int pad, int letbase); +static int LIBC_FUNCTION_ATTRIBUTE _libc_cwrite(stream_t cb, void *user, const void *buf, size_t count); +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PUTCHAR) || defined (LIBC_PRINTF) +int LIBC_FUNCTION_ATTRIBUTE putchar(int c){ + return(fputc(c, stdout)); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PUTC) +int LIBC_FUNCTION_ATTRIBUTE putc(int c, FILE *stream){ + return(fputc(c, stream)); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PUTCHAR) || defined (LIBC_PUTC) || defined (LIBC_FPUTC) || defined (LIBC_PRINTF) || defined (LIBC_FPRINTF) +int LIBC_FUNCTION_ATTRIBUTE fputc(int c, FILE *stream){ + stream_t cb; + unsigned char _c; + cb = (stream_t)stream; + _c = c; + cb(&_c, 1); + return(c); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PUTS) || defined (LIBC_PRINTF) +int LIBC_FUNCTION_ATTRIBUTE puts(const char *s){ + return(fputs(s, stdout)); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PUTS) || defined (LIBC_FPUTS) || defined (LIBC_PRINTF) || defined (LIBC_FPRINTF) +int LIBC_FUNCTION_ATTRIBUTE fputs(const char *s, FILE *stream){ + stream_t cb; + int sl; + cb = (stream_t)stream; + for(sl = 0; s[sl]; sl++); + cb(s, sl); + cb("\n", 1); + return(sl); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PRINTF) +int LIBC_FUNCTION_ATTRIBUTE printf(const char *format, ...){ + va_list ap; + int r; + va_start(ap, format); + r = _libc_cvprintf((stream_t)stdout, NULL, format, ap); + va_end(ap); + return(r); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_FPRINTF) +int LIBC_FUNCTION_ATTRIBUTE fprintf(FILE *stream, const char *format, ...){ + va_list ap; + int r; + va_start(ap, format); + r = _libc_cvprintf((stream_t)stream, NULL, format, ap); + va_end(ap); + return(r); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_SNPRINTF) +int LIBC_FUNCTION_ATTRIBUTE snprintf(char *str, size_t size, const char *format, ...){ + va_list ap; + int r; + struct _libc_snprintf_struct s; + s.str = str; + s.loc = 0; + s.maxlen = size; + va_start(ap, format); + r = _libc_cvprintf((stream_t)_libc_cswrite, &s, format, ap); + va_end(ap); + return(r); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_VSNPRINTF) +int LIBC_FUNCTION_ATTRIBUTE vsnprintf(char *str, size_t size, const char *format, va_list ap){ + int r; + struct _libc_snprintf_struct s; + s.str = str; + s.loc = 0; + s.maxlen = size; + r = _libc_cvprintf((stream_t)_libc_cswrite, &s, format, ap); + return(r); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_SNPRINTF) || defined (LIBC_VSNPRINTF) +static int LIBC_FUNCTION_ATTRIBUTE _libc_cswrite(void *user, const void *buf, int count){ + struct _libc_snprintf_struct *s; + int i; + s = (struct _libc_snprintf_struct *)user; + for(i = 0; (i < count) && (s->loc < s->maxlen); i++, s->loc++){ + if((s->maxlen > 1) && (s->loc < (s->maxlen - 1)))s->str[s->loc] = ((char *)buf)[i]; + } + if(s->maxlen){ + if(s->loc < (s->maxlen - 1)){ + s->str[s->loc] = 0; + }else{ + s->str[s->maxlen - 1] = 0; + } + } + return(i); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_PRINTF) || defined (LIBC_FPRINTF) || defined (LIBC_SNPRINTF) || defined (LIBC_VSNPRINTF) +static int LIBC_FUNCTION_ATTRIBUTE _libc_cwrite(stream_t cb, void *user, const void *buf, size_t count){ + stream_user_t cub; + if(user == NULL)return(cb(buf, count)); + cub = (stream_user_t)cb; + return(cub(user, buf, count)); +} + +static int LIBC_FUNCTION_ATTRIBUTE _libc_cvprintf(stream_t cb, void *user, const char *format, va_list ap){ + int width, pad, pc, l; + const char *s, *e; + char c; + pc = 0; + s = e = format; + for( ; *format != 0; format++){ + e = format; + if(*format == '%'){ + format++; + width = pad = 0; + if(*format == '\0')break; + if(*format == '%'){ + pc += _libc_cwrite(cb, user, s, (e - s) + 1); + s = format + 1; + continue; + } + if(*format == '-'){ + format++; + pad = _LIBC_PRINT_PAD_RIGHT; + } + while(*format == '0'){ + format++; + pad |= _LIBC_PRINT_PAD_ZERO; + } + for( ; *format >= '0' && *format <= '9'; format++){ + width *= 10; + width += *format - '0'; + } + if(*format == 's'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + s = va_arg(ap, char *); + pc += _libc_cprints(cb, user, s ? s : "(null)", width, pad); + s = format + 1; + continue; + } + l = 0; + while(*format == 'l'){ + format++; + l++; + } + if(*format == 'd'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + if(!l){ + pc += _libc_cprinti(cb, user, va_arg(ap, int), 10, 1, width, pad, 'a'); + }else if(l == 1){ + pc += _libc_cprintl(cb, user, va_arg(ap, long int), 10, 1, width, pad, 'a'); + }else{ + pc += _libc_cprintl(cb, user, va_arg(ap, long long int), 10, 1, width, pad, 'a'); + } + s = format + 1; + continue; + } + if(*format == 'b'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + if(!l){ + pc += _libc_cprinti(cb, user, va_arg(ap, unsigned int), 2, 0, width, pad, 'a'); + }else if(l == 1){ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long int), 2, 0, width, pad, 'a'); + }else{ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long long int), 2, 0, width, pad, 'a'); + } + s = format + 1; + continue; + } + if(*format == 'x'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + if(!l){ + pc += _libc_cprinti(cb, user, va_arg(ap, unsigned int), 16, 0, width, pad, 'a'); + }else if(l == 1){ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long int), 16, 0, width, pad, 'a'); + }else{ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long long int), 16, 0, width, pad, 'a'); + } + s = format + 1; + continue; + } + if(*format == 'X'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + if(!l){ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned int), 16, 0, width, pad, 'A'); + }else if(l == 1){ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long int), 16, 0, width, pad, 'A'); + }else{ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long long int), 16, 0, width, pad, 'A'); + } + s = format + 1; + continue; + } + if(*format == 'u'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + if(!l){ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned int), 10, 0, width, pad, 'a'); + }else if(l == 1){ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long int), 10, 0, width, pad, 'a'); + }else{ + pc += _libc_cprintl(cb, user, va_arg(ap, unsigned long long int), 10, 0, width, pad, 'a'); + } + s = format + 1; + continue; + } + if(*format == 'c'){ + pc += _libc_cwrite(cb, user, s, (e - s)); + c = va_arg(ap, int); + pc += _libc_cwrite(cb, user, &c, 1); + s = format + 1; + continue; + } + } + } + if(e >= s){ + pc += _libc_cwrite(cb, user, s, (e - s) + 1); + } + return(pc); +} + +static int LIBC_FUNCTION_ATTRIBUTE _libc_cprints(stream_t cb, void *user, const char *string, int width, int pad){ + int pc, sl, len; + const char *ptr; + char padchar; + pc = 0; + padchar = ' '; + if(width > 0){ + len = 0; + for(ptr = string; *ptr; ++ptr) ++len; + if(len >= width)width = 0; else width -= len; + if(pad & _LIBC_PRINT_PAD_ZERO)padchar = '0'; + } + if(!(pad & _LIBC_PRINT_PAD_RIGHT)){ + for ( ; width > 0; width--){ + pc += _libc_cwrite(cb, user, &padchar, 1); + } + } + for(sl = 0; string[sl]; sl++); + pc += _libc_cwrite(cb, user, string, sl); + for ( ; width > 0; --width) { + pc += _libc_cwrite(cb, user, &padchar, 1); + } + return(pc); +} + +static int LIBC_FUNCTION_ATTRIBUTE _libc_cprinti(stream_t cb, void *user, int i, int b, int sg, int width, int pad, int letbase){ + char print_buf[_LIBC_PRINT_BUF_LEN], *s; + unsigned int u; + int t, neg, pc; + neg = pc = 0; + u = i; + if(i == 0){ + print_buf[0] = '0'; + print_buf[1] = '\0'; + return(_libc_cprints(cb, user, print_buf, width, pad)); + } + if(sg && (b == 10) && (i < 0)){ + neg = 1; + u = -i; + } + s = print_buf + _LIBC_PRINT_BUF_LEN - 1; + *s = '\0'; + while(u){ + t = u % b; + if(t >= 10)t += letbase - '0' - 10; + *--s = t + '0'; + u /= b; + } + if(neg){ + if(width && (pad & _LIBC_PRINT_PAD_ZERO)){ + pc += _libc_cwrite(cb, user, "-", 1); + width--; + }else{ + *--s = '-'; + } + } + return(pc + _libc_cprints(cb, user, s, width, pad)); +} + +// li -> i: workaround et oleks hetkel alati 4 baidine (unsigned long int) +// STM32 või ARM-C3 või vastav GCC ei oska 8 baidist arvu jagada +static int LIBC_FUNCTION_ATTRIBUTE _libc_cprintl(stream_t cb, void *user, long long int li, int b, int sg, int width, int pad, int letbase){ + char print_buf[_LIBC_PRINT_BUF_LEN], *s; + unsigned long int u; + long int i; + int t, neg, pc; + neg = pc = 0; + i = li; + u = i; + if(i == 0){ + print_buf[0] = '0'; + print_buf[1] = '\0'; + return(_libc_cprints(cb, user, print_buf, width, pad)); + } + if(sg && (b == 10) && (i < 0)){ + neg = 1; + u = -i; + } + s = print_buf + _LIBC_PRINT_BUF_LEN - 1; + *s = '\0'; + while(u){ + t = u % b; + if(t >= 10)t += letbase - '0' - 10; + *--s = t + '0'; + u /= b; + } + if(neg){ + if(width && (pad & _LIBC_PRINT_PAD_ZERO)){ + pc += _libc_cwrite(cb, user, "-", 1); + width--; + }else{ + *--s = '-'; + } + } + return(pc + _libc_cprints(cb, user, s, width, pad)); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_WRITE) +ssize_t LIBC_FUNCTION_ATTRIBUTE write(int fd, const void *buf, size_t count){ + stream_t cb; + if(fd == 1){ + if(stdout != NULL){ + cb = (stream_t)stdout; + return(cb(buf, count)); + } + }else if(fd == 2){ + if(stderr != NULL){ + cb = (stream_t)stderr; + return(cb(buf, count)); + }else if(stdout != NULL){ + cb = (stream_t)stdout; + return(cb(buf, count)); + } + } + return(0); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_MEMCPY) +void LIBC_FUNCTION_ATTRIBUTE *memcpy(void *dest, const void *src, size_t n){ + register char *_dest; + register const char *_src; + _dest = dest; + _src = src; + while(n-- > 0)*_dest++ = *_src++; + return(dest); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_MEMMOVE) +void LIBC_FUNCTION_ATTRIBUTE *memmove(void *dest, const void *src, size_t n){ + register char *_dest; + register const char *_src; + _dest = dest; + _src = src; + if(_src < _dest){ /* Moving from low mem to hi mem; start at end. */ + for(_src += n, _dest += n; n; n--){ + *--_dest = *--_src; + } + }else if(_src != _dest){ /* Moving from hi mem to low mem; start at beginning. */ + for( ; n; n--){ + *_dest++ = *_src++; + } + } + return(dest); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_MEMCMP) || defined (LIBC_MEMMEM) +int LIBC_FUNCTION_ATTRIBUTE memcmp(const void *s1, const void *s2, size_t n){ + register const unsigned char *str1; + register const unsigned char *str2; + str1 = (const unsigned char *)s1; + str2 = (const unsigned char *)s2; + while(n-- > 0){ + if(*str1++ != *str2++)return str1[-1] < str2[-1] ? -1 : 1; + } + return(0); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_MEMSET) +void LIBC_FUNCTION_ATTRIBUTE *memset(void *s, int c, size_t n){ + register char *str = s; + while(n-- > 0)*str++ = c; + return(s); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_MEMMEM) +void LIBC_FUNCTION_ATTRIBUTE *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen){ + const char *begin; + const char *const last_possible = (const char *)haystack + haystacklen - needlelen; + if(needlelen == 0)return((void *)haystack); + if(haystacklen < needlelen)return(NULL); + for(begin = (const char *)haystack; begin <= last_possible; ++begin){ + if(begin[0] == ((const char *)needle)[0] && !memcmp((const void *)&begin[1], (const void *)((const char *)needle + 1), needlelen - 1)){ + return((void *)begin); + } + } + return(NULL); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRLEN) +size_t LIBC_FUNCTION_ATTRIBUTE strlen(const char *s){ + register size_t n; + n = 0; + while(*s++)n++; + return(n); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRCHR) +char LIBC_FUNCTION_ATTRIBUTE *strchr(const char *s, int c){ + for( ; *s != (char)c; s++) + if(*s == 0)return(0); + return((char *)s); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRSTR) +char LIBC_FUNCTION_ATTRIBUTE *strstr(const char *haystack, const char *needle){ + register char *a, *b; + b = (char *)needle; + if(*b == 0)return((char *)haystack); + for( ; *haystack != 0; haystack += 1){ + if(*haystack != *b)continue; + a = (char *)haystack; + while(1){ + if(*b == 0)return((char *)haystack); + if(*a++ != *b++)break; + } + b = (char *)needle; + } + return(NULL); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRCMP) +int LIBC_FUNCTION_ATTRIBUTE strcmp(const char *s1, const char *s2){ + for( ; *s1 == *s2; ++s1, ++s2)if(*s1 == 0)return(0); + return(*(unsigned char *)s1 < *(unsigned char *)s2 ? -1 : 1); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRNCMP) +int LIBC_FUNCTION_ATTRIBUTE strncmp(const char *s1, const char *s2, size_t n){ + for( ; n > 0; s1++, s2++, n--){ + if(*s1 == 0)return(0); + if(*s1 != *s2)return((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : 1); + } + return(0); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRCPY) +char LIBC_FUNCTION_ATTRIBUTE *strcpy(char *s1, const char *s2){ + char *s; + s = s1; + while((*s++ = *s2++) != 0); + return(s1); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRNCPY) +char LIBC_FUNCTION_ATTRIBUTE *strncpy(char *s1, const char *s2, size_t n){ + char *s; + s = s1; + if(n != 0){ + do{ + if((*s++ = *s2++) == 0){ + while(--n != 0)*s++ = 0; + break; + } + }while(--n != 0); + } + return(s1); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRNCAT) +char LIBC_FUNCTION_ATTRIBUTE *strncat(char *s1, const char *s2, size_t n){ + char *d = s1; + if (n != 0) { + while (*d != 0)d++; + do { + if ((*d = *s2++) == 0)break; + d++; + } + while (--n != 0); + *d = 0; + } + return s1; +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRCAT) +char LIBC_FUNCTION_ATTRIBUTE *strcat(char *s1, const char *s2){ + char *d = s1; + while (*s1 != 0)s1++; + while ((*s1++ = *s2++) != '\0'); + return d; +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRCASECMP) +int LIBC_FUNCTION_ATTRIBUTE strcasecmp(const char *s1, const char *s2){ + for( ; tolower(*s1) == tolower(*s2); ++s1, ++s2)if(*s1 == 0)return(0); + return(tolower(*(unsigned char *)s1) < tolower(*(unsigned char *)s2) ? -1 : 1); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRNCASECMP) +int LIBC_FUNCTION_ATTRIBUTE strncasecmp(const char *s1, const char *s2, size_t n){ + for( ; n > 0; s1++, s2++, n--){ + if(*s1 == 0)return(0); + if(tolower(*s1) != tolower(*s2))return((tolower(*(unsigned char *)s1) < tolower(*(unsigned char *)s2)) ? -1 : 1); + } + return(0); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_ATOI) +int LIBC_FUNCTION_ATTRIBUTE atoi(const char *nptr){ + register int num, neg; + register char c; + num = neg = 0; + c = *nptr; + while((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t'))c = *++nptr; + if(c == '-'){ /* get an optional sign */ + neg = 1; + c = *++nptr; + }else if(c == '+'){ + c = *++nptr; + } + + while((c >= '0') && (c <= '9')){ + num = (10 * num) + (c - '0'); + c = *++nptr; + } + if(neg)return(0 - num); + return(num); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRTOL) +long int LIBC_FUNCTION_ATTRIBUTE strtol(const char *nptr, char **endptr, int base){ + return(strtoll(nptr, endptr, base)); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRTOL) || defined (LIBC_STRTOLL) +long long int LIBC_FUNCTION_ATTRIBUTE strtoll(const char *nptr, char **endptr, int base){ + long long int acc, cutoff; + int c, neg, any, cutlim; + const char *s; + s = nptr; + do{ + c = (unsigned char)*s++; + }while(isspace(c)); + if(c == '-'){ + neg = 1; + c = *s++; + }else{ + neg = 0; + if(c == '+')c = *s++; + } + if(((base == 0) || (base == 16)) && (c == '0') && ((*s == 'x') || (*s == 'X'))){ + c = s[1]; + s += 2; + base = 16; + } + if(base == 0)base = (c == '0') ? 8 : 10; + cutoff = neg ? LLONG_MIN : LLONG_MAX; + cutlim = (int)(cutoff % base); + cutoff /= base; + if(neg){ + if(cutlim > 0){ + cutlim -= base; + cutoff += 1; + } + cutlim = -cutlim; + } + for(acc = 0, any = 0; ; c = (unsigned char)*s++){ + if(isdigit(c)){ + c -= '0'; + }else if(isalpha(c)){ + c -= isupper(c) ? ('A' - 10) : ('a' - 10); + }else{ + break; + } + if(c >= base)break; + if(any < 0)continue; + if(neg){ + if((acc < cutoff) || ((acc == cutoff) && (c > cutlim))){ + any = -1; + acc = LLONG_MIN; + // errno = ERANGE; + }else{ + any = 1; + acc *= base; + acc -= c; + } + }else{ + if((acc > cutoff) || ((acc == cutoff) && (c > cutlim))){ + any = -1; + acc = LLONG_MAX; + // errno = ERANGE; + }else{ + any = 1; + acc *= base; + acc += c; + } + } + } + if(endptr != 0)*endptr = (char *)(any ? (s - 1) : nptr); + return(acc); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_STRTOD) +#define _LIBC_HUGE_VAL (__builtin_huge_val()) +#define _LIBC_DBL_MIN_EXP (__DBL_MIN_EXP__) +#define _LIBC_DBL_MAX_EXP (__DBL_MAX_EXP__) +double LIBC_FUNCTION_ATTRIBUTE strtod(const char *str, char **endptr){ + double number, p10; + int exponent, negative, n, num_digits, num_decimals; + char *p; + + p = (char *)str; + while(isspace(*p))p++; + + negative = 0; + switch(*p){ + case '-': negative = 1; // Fall through to increment position + case '+': p++; + } + + number = 0.; + exponent = num_digits = num_decimals = 0; + + while(isdigit(*p)){ + number = number * 10. + (*p - '0'); + p++; + num_digits++; + } + // Process decimal part + if(*p == '.'){ + p++; + while(isdigit(*p)){ + number = number * 10. + (*p - '0'); + p++; + num_digits++; + num_decimals++; + } + exponent -= num_decimals; + } + if(num_digits == 0){ + // errno = ERANGE; + return(0.0); + } + // Correct for sign + if(negative)number = -number; + // Process an exponent string + if(*p == 'e' || *p == 'E'){ + // Handle optional sign + negative = 0; + switch(*++p){ + case '-': negative = 1; // Fall through to increment pos + case '+': p++; + } + // Process string of digits + n = 0; + while(isdigit(*p)){ + n = n * 10 + (*p - '0'); + p++; + } + if(negative){ + exponent -= n; + }else{ + exponent += n; + } + } + if((exponent < _LIBC_DBL_MIN_EXP) || (exponent > _LIBC_DBL_MAX_EXP)){ + // errno = ERANGE; + return(_LIBC_HUGE_VAL); + } + // Scale the result + p10 = 10.; + n = exponent; + if(n < 0)n = -n; + while(n){ + if(n & 1){ + if(exponent < 0){ + number /= p10; + }else{ + number *= p10; + } + } + n >>= 1; + p10 *= p10; + } + // if (number == _LIBC_HUGE_VAL)errno = ERANGE; + if(endptr)*endptr = p; + return(number); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_ABS) +int LIBC_FUNCTION_ATTRIBUTE abs(int j){ + if(j < 0)return(-j); + return(j); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_ASSERT) +void LIBC_FUNCTION_ATTRIBUTE assert(int expression){ +} +#endif + +#if defined (LIBC_ALL) || defined(LIBC_ABORT) +void LIBC_FUNCTION_ATTRIBUTE abort(void){ +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_GMTIME_R) +#define _LIBC_YEAR0 1900 /* the first year */ +#define _LIBC_EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */ +#define _LIBC_SECS_DAY (24L * 60L * 60L) +#define _LIBC_LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) +#define _LIBC_YEARSIZE(year) (_LIBC_LEAPYEAR(year) ? 366 : 365) +static const int _ytab[2][12] = { + { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +}; +struct tm * LIBC_FUNCTION_ATTRIBUTE gmtime_r(const time_t *timep, struct tm *result){ + unsigned long dayclock, dayno; + int year; + + year = _LIBC_EPOCH_YR; + dayclock = (unsigned long)*timep % _LIBC_SECS_DAY; + dayno = (unsigned long)*timep / _LIBC_SECS_DAY; + + result->tm_sec = dayclock % 60; + result->tm_min = (dayclock % 3600) / 60; + result->tm_hour = dayclock / 3600; + result->tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */ + while(dayno >= _LIBC_YEARSIZE(year)){ + dayno -= _LIBC_YEARSIZE(year); + year++; + } + result->tm_year = year - _LIBC_YEAR0; + result->tm_yday = dayno; + result->tm_mon = 0; + while(dayno >= _ytab[_LIBC_LEAPYEAR(year)][result->tm_mon]){ + dayno -= _ytab[_LIBC_LEAPYEAR(year)][result->tm_mon]; + result->tm_mon++; + } + result->tm_mday = dayno + 1; + result->tm_isdst = 0; + return(result); +} +#endif + +#if defined (LIBC_ALL) || defined (LIBC_MKTIME) +static const int m_to_d[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; +time_t LIBC_FUNCTION_ATTRIBUTE mktime(struct tm *tm){ + int month, year; + time_t result; + + month = tm->tm_mon; + year = tm->tm_year + month / 12 + 1900; + month %= 12; + if(month < 0){ + year -= 1; + month += 12; + } + result = (year - 1970) * 365 + (year - 1969) / 4 + m_to_d[month]; + result = (year - 1970) * 365 + m_to_d[month]; + if(month <= 1)year -= 1; + result += (year - 1968) / 4; + result -= (year - 1900) / 100; + result += (year - 1600) / 400; + result += tm->tm_mday; + result -= 1; + result *= 24; + result += tm->tm_hour; + result *= 60; + result += tm->tm_min; + result *= 60; + result += tm->tm_sec; + return(result); +} +#endif + diff --git a/lib/libc/stddef.h b/lib/libc/stddef.h new file mode 100644 index 0000000..38fbe7d --- /dev/null +++ b/lib/libc/stddef.h @@ -0,0 +1,7 @@ +#ifndef _STDDEF_H_ +#define _STDDEF_H_ + +#include + +#endif + diff --git a/lib/libc/stdio.h b/lib/libc/stdio.h new file mode 100644 index 0000000..a31f09a --- /dev/null +++ b/lib/libc/stdio.h @@ -0,0 +1,111 @@ +#ifndef _STDIO_H_ +#define _STDIO_H_ + +#include +#include + +#ifndef NULL +#define NULL ((void *)0) +#endif + +#ifndef LLONG_MAX +#define LLONG_MAX ((long long int)(((unsigned long long int)-1) / 2)) +#endif + +#ifndef LLONG_MIN +#define LLONG_MIN ((long long int)(-1 * (((unsigned long long int)-1) / 2)) - 1) +#endif + +typedef void FILE; + +typedef int32_t ssize_t; +typedef uint32_t size_t; + +ssize_t write_stdout(const void *buf, size_t count); +extern FILE *stdin, *stdout, *stderr; + +int putchar(int c); +int putc(int c, FILE *stream); +int fputc(int c, FILE *stream); +int puts(const char *s); +int fputs(const char *s, FILE *stream); +int printf(const char *format, ...); +int fprintf(FILE *stream, const char *format, ...); +int snprintf(char *str, size_t size, const char *format, ...); +int sprintf(char *str, const char *format, ...); +int vsnprintf(char *str, size_t size, const char *format, va_list ap); + +ssize_t write(int fd, const void *buf, size_t count); + +void *memcpy(void *dest, const void *src, size_t n); +void *memmove(void *dest, const void *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); +void *memset(void *s, int c, size_t n); +void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen); +size_t strlen(const char *s); /**/ +char *strchr(const char *s, int c); /**/ +char *strstr(const char *haystack, const char *needle); /**/ +int strcmp(const char *s1, const char *s2); /**/ +int strncmp(const char *s1, const char *s2, size_t n); /**/ +char *strcpy(char *s1, const char *s2); +char *strncpy(char *s1, const char *s2, size_t n); /**/ +char *strncat(char *s1, const char *s2, size_t n); /**/ +char *strcat(char *dst, const char *src); /**/ +int strcasecmp(const char *s1, const char *s2); /**/ +int strncasecmp(const char *s1, const char *s2, size_t n); /**/ +int atoi(const char *nptr); /**/ +long int strtol(const char *nptr, char **endptr, int base); /**/ +long long int strtoll(const char *nptr, char **endptr, int base); /**/ +double strtod(const char *str, char **endptr); /**/ + +int abs(int j); + +#ifndef assert +void assert(int expression); +#endif +void abort(void); + +typedef int32_t time_t; +struct tm{ + int tm_sec; /* seconds */ + int tm_min; /* minutes */ + int tm_hour; /* hours */ + int tm_mday; /* day of the month */ + int tm_mon; /* month */ + int tm_year; /* year */ + int tm_wday; /* day of the week */ + int tm_yday; /* day in the year */ + int tm_isdst; /* daylight saving time */ +} +#if defined (GCC_VERSION) +__attribute__((packed)) +#endif +; + +struct tm *gmtime_r(const time_t *timep, struct tm *result); +time_t mktime(struct tm *tm); + +void *calloc(size_t nmemb, size_t size); +void *malloc(size_t size); +void free(void *ptr); +void *realloc(void *ptr, size_t size); + +#define isalnum(c) (isalpha(c) || isdigit(c)) +#define isalpha(c) (isupper(c) || islower(c)) +#define isascii(c) (((c) > 0) && ((c) <= 0x7F)) +#define iscntrl(c) (((c) >= 0) && (((c) <= 0x1F) || ((c) == 0x7F))) +#define isdigit(c) (((c) >= '0') && ((c) <= '9')) +#define isgraph(c) (((c) != ' ') && isprint(c)) +#define isprint(c) (((c) >= ' ') && ((c) <= '~')) +#define ispunct(c) ((((c) > ' ') && ((c) <= '~')) && !isalnum(c)) +#define isspace(c) (((c) == ' ') || ((c) == '\f') || ((c) == '\n') || ((c) == '\r') || ((c) == '\t') || ((c) == '\v')) +#define isupper(c) (((c) >= 'A') && ((c) <= 'Z')) +#define islower(c) (((c) >= 'a') && ((c) <= 'z')) +#define isxdigit(c) (isdigit(c) || (((c) >= 'A') && ((c) <= 'F')) || (((c) >= 'a') && ((c) <= 'f'))) +#define isxupper(c) (isdigit(c) || (((c) >= 'A') && ((c) <= 'F'))) +#define isxlower(c) (isdigit(c) || (((c) >= 'a') && ((c) <= 'f'))) +#define tolower(c) (isupper(c) ? ((c) - 'A' + 'a') : (c)) +#define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c)) + +#endif + diff --git a/lib/libc/stdlib.h b/lib/libc/stdlib.h new file mode 100644 index 0000000..1d95752 --- /dev/null +++ b/lib/libc/stdlib.h @@ -0,0 +1,7 @@ +#ifndef _STDLIB_H_ +#define _STDLIB_H_ + +#include + +#endif + diff --git a/lib/libc/string.h b/lib/libc/string.h new file mode 100644 index 0000000..dc5c0be --- /dev/null +++ b/lib/libc/string.h @@ -0,0 +1,7 @@ +#ifndef _STRING_H_ +#define _STRING_H_ + +#include + +#endif + diff --git a/lib/libc/time.h b/lib/libc/time.h new file mode 100644 index 0000000..c6442ff --- /dev/null +++ b/lib/libc/time.h @@ -0,0 +1,7 @@ +#ifndef _TIME_H_ +#define _TIME_H_ + +#include + +#endif + diff --git a/lib/mask.h b/lib/mask.h new file mode 100644 index 0000000..1ef49e7 --- /dev/null +++ b/lib/mask.h @@ -0,0 +1,19 @@ +#ifndef _MASK_H_ +#define _MASK_H_ + +#include + +#define mask8(mask, value) ((((uint8_t)(value)) << __builtin_ctz((mask))) & ((uint8_t)(mask))) +#define mask8_set(target, mask, value) do{ (target) = ((target) & ~((uint8_t)(mask))) | mask8(mask, value); }while(0) +#define mask8_get(target, mask) (((target) & ((uint8_t)(mask))) >> __builtin_ctz((mask))) + +#define mask16(mask, value) ((((uint16_t)(value)) << __builtin_ctz((mask))) & ((uint16_t)(mask))) +#define mask16_set(target, mask, value) do{ (target) = ((target) & ~((uint16_t)(mask))) | mask16(mask, value); }while(0) +#define mask16_get(target, mask) (((target) & ((uint16_t)(mask))) >> __builtin_ctz((mask))) + +#define mask32(mask, value) ((((uint32_t)(value)) << __builtin_ctz((mask))) & ((uint32_t)(mask))) +#define mask32_set(target, mask, value) do{ (target) = ((target) & ~((uint32_t)(mask))) | mask32(mask, value); }while(0) +#define mask32_get(target, mask) (((target) & ((uint32_t)(mask))) >> __builtin_ctz((mask))) + +#endif + diff --git a/lib/rom_lib.h b/lib/rom_lib.h new file mode 100644 index 0000000..59453a7 --- /dev/null +++ b/lib/rom_lib.h @@ -0,0 +1,113 @@ +#ifndef __PLATFORM_ROMLIB_H__ +#define __PLATFORM_ROMLIB_H__ + + #include + #include + #include + + #include "strproc.h" + #include "basic_types.h" + #include "hal_diag.h" + #include "hal_api.h" + #include "hal_platform.h" +//#include "rtl_std_lib/include/rt_lib_rom.h" +// #include "fwlib/hal_misc.h" +// #include "rtl_std_lib/include/rtl_lib.h" + +#define _ROM_CALL_ + +extern uint32_t HalDelayUs(uint32_t us); +extern uint32_t DiagPrintf(const char *fmt, ...); +extern uint32_t HalGetCpuClk(VOID); + +extern void HalInitLogUart(void); +//extern void HalLogUartInit(void); + +extern u32 DiagPrintf(IN const char *fmt, ...); + +extern u32 DiagSPrintf(IN u8 *buf, IN const char *fmt, ...); + +extern int prvDiagPrintf(IN const char *fmt, ...); + +extern int prvDiagSPrintf(IN char *buf, IN const char *fmt, ...); + +extern u8 __ram_start_table_start__[]; +extern VOID HalCpuClkConfig(u8 CpuType); +extern VOID VectorTableInitRtl8195A(u32 StackP); +extern VOID HalInitPlatformLogUartV02(VOID); +extern VOID HalReInitPlatformLogUartV02(VOID); +extern VOID HalInitPlatformTimerV02(VOID); + +extern u8 HalPinCtrlRtl8195A( + IN u32 Function, + IN u32 PinLocation, + IN BOOL Operation + ); + +extern void HalShowBuildInfoV02(void); +extern VOID SpicInitRtl8195A(u8 InitBaudRate, u8 SpicBitMode); +extern void UartLogIrqHandle(void); +extern u8 GetRomCmdNum(void); // = 6 +/* +typedef struct _COMMAND_TABLE_ { + const u8* cmd; + u16 ArgvCnt; + u32 (*func)(u16 argc, u8* argv[]); + const u8* msg; +}COMMAND_TABLE, *PCOMMAND_TABLE; +*/ +extern COMMAND_TABLE UartLogRomCmdTable[]; + + + + #define printf DiagPrintf +// #define printf prvDiagPrintf + #define sprintf(fmt, arg...) DiagSPrintf((u8*)fmt, ##arg) +// #define sprintf rtl_sprintf +// #define sprintf prvDiagSPrintf + #define snprintf DiagSnPrintf + +#define memset rtl_memset_v1_00 +#define memchr rtl_memchr_v1_00 +#define memmove rtl_memmove_v1_00 +#define memcpy rtl_memcpy_v1_00 +extern _ROM_CALL_ void * rtl_memset_v1_00(void * m , int c , size_t n); +extern _ROM_CALL_ void * rtl_memchr_v1_00(const void * src_void , int c , size_t length); +extern _ROM_CALL_ void * rtl_memmove_v1_00( void * dst_void , const void * src_void , size_t length); +extern _ROM_CALL_ void * rtl_memcpy_v1_00(void * __restrict dst0 , const void * __restrict src0 , size_t len0); + +#define strcmp rtl_strcmp_v1_00 +extern _ROM_CALL_ int rtl_strcmp_v1_00(const char *s1 , const char *s2); + + #define strcat rtl_strcat + #define strchr rtl_strchr + #define strcpy rtl_strcpy + #define strlen(str) rtl_strlen((const char *)str) + #define strncat rtl_strncat + #define strncmp(s1, s2, n) rtl_strncmp((const char *)s1, (const char *)s2, n) + #define strncpy rtl_strncpy + #define strstr rtl_strstr + #define strsep rtl_strsep + #define strtok rtl_strtok + + #define atoi(str) prvAtoi(str) + #define strpbrk(cs, ct) _strpbrk(cs, ct) // for B-cut ROM + #define sscanf _sscanf + +// #define sscanf rtl_sscanf + #define strnlen rtl_strnlen +// #define strlen rtl_strlen + + + + #define strstr rtl_strstr + #define vsnprintf rtl_vfprintf_r +/* +#define fflush_r rtl_fflush_r_v1_00 +#define vfprintf_r rtl_vfprintf_r_v1_00 + +extern _ROM_CALL_ int rtl_fflush_r_v1_00(struct _reent *ptr, register FILE * fp); +extern _ROM_CALL_ int rtl_vfprintf_r_v1_00(struct _reent *, FILE *, const char *, va_list); +*/ + +#endif // __PLATFORM_ROMLIB_H__ diff --git a/lib/rtl_consol.h b/lib/rtl_consol.h new file mode 100644 index 0000000..b9cfb0b --- /dev/null +++ b/lib/rtl_consol.h @@ -0,0 +1,133 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _RTK_CONSOL_H_ +#define _RTK_CONSOL_H_ +/* + * Include user defined options first. Anything not defined in these files + * will be set to standard values. Override anything you dont like! + */ + #if defined(CONFIG_PLATFORM_8195A) || defined(CONFIG_PLATFORM_8711B) +#include "platform_opts.h" +#endif + +//#include "osdep_api.h" +#include "hal_diag.h" + +#define CONSOLE_PREFIX "#" + + +//Log UART +//UART_LOG_CMD_BUFLEN: only 126 bytes could be used for keeping input +// cmd, the last byte is for string end ('\0'). +#define UART_LOG_CMD_BUFLEN 127 +#define MAX_ARGV 10 + + + +typedef u32 (*ECHOFUNC)(IN u8*,...); //UART LOG echo-function type. + +typedef struct _UART_LOG_BUF_ { + u8 BufCount; //record the input cmd char number. + u8 UARTLogBuf[UART_LOG_CMD_BUFLEN]; //record the input command. +} UART_LOG_BUF, *PUART_LOG_BUF; + + + +typedef struct _UART_LOG_CTL_ { + u8 NewIdx; + u8 SeeIdx; + u8 RevdNo; + u8 EscSTS; + u8 ExecuteCmd; + u8 ExecuteEsc; + u8 BootRdy; + u8 Resvd; + PUART_LOG_BUF pTmpLogBuf; + VOID *pfINPUT; + PCOMMAND_TABLE pCmdTbl; + u32 CmdTblSz; +#ifdef CONFIG_UART_LOG_HISTORY + u32 CRSTS; +#endif +#ifdef CONFIG_UART_LOG_HISTORY + u8 (*pHistoryBuf)[UART_LOG_CMD_BUFLEN]; +#endif +#ifdef CONFIG_KERNEL + u32 TaskRdy; + _Sema Sema; +#else + // Since ROM code will reference this typedef, so keep the typedef same size + u32 TaskRdy; + void *Sema; +#endif +} UART_LOG_CTL, *PUART_LOG_CTL; + + +#define KB_ASCII_NUL 0x00 +#define KB_ASCII_BS 0x08 +#define KB_ASCII_TAB 0x09 +#define KB_ASCII_LF 0x0A +#define KB_ASCII_CR 0x0D +#define KB_ASCII_ESC 0x1B +#define KB_ASCII_SP 0x20 +#define KB_ASCII_BS_7F 0x7F +#define KB_ASCII_LBRKT 0x5B //[ + +#define KB_SPACENO_TAB 1 + +#ifdef CONFIG_UART_LOG_HISTORY +#define UART_LOG_HISTORY_LEN 5 +#endif + +#ifdef CONFIG_DEBUG_LOG +#define _ConsolePrint DiagPrintf +#else +#define _ConsolePrint +#endif + +#ifndef CONSOLE_PREFIX +#define CONSOLE_PREFIX "" +#endif + +#define CONSOLE_8195A(...) do {\ + _ConsolePrint("\r"CONSOLE_PREFIX __VA_ARGS__);\ +}while(0) + + +_LONG_CALL_ VOID +RtlConsolInit( + IN u32 Boot, + IN u32 TBLSz, + IN VOID *pTBL +); + +#if defined(CONFIG_KERNEL) +_LONG_CALL_ VOID +RtlConsolTaskRam( + VOID *Data +); +#endif + +_LONG_CALL_ VOID +RtlConsolTaskRom( + VOID *Data +); + + +_LONG_CALL_ u32 +Strtoul( + IN const u8 *nptr, + IN u8 **endptr, + IN u32 base +); + +void console_init(void); + +#endif //_RTK_CONSOL_H_ diff --git a/lib/rtl_std_lib/include/rt_lib_rom.h b/lib/rtl_std_lib/include/rt_lib_rom.h new file mode 100644 index 0000000..0107b48 --- /dev/null +++ b/lib/rtl_std_lib/include/rt_lib_rom.h @@ -0,0 +1,255 @@ +/* + * rtl_lib.h + * + * Definitions for RTL library functions + */ + +#ifndef _RTL_LIB_ROM_H_ +#define _RTL_LIB_ROM_H_ + + +#include +#define _ROM_CALL_ +//#include + +//#include + +#include "../libc/rom/string/rom_libc_string.h" +#include "../libgloss/rtl8195a/rom/rom_libgloss_retarget.h" + +#ifndef _PTR +#define _PTR void * +#endif + +#ifndef _AND +#define _AND , +#endif + +#ifndef _NOARGS +#define _NOARGS void +#endif + +#ifndef _CONST +#define _CONST const +#endif + +#ifndef _VOLATILE +#define _VOLATILE volatile +#endif + +#ifndef _SIGNED +#define _SIGNED signed +#endif + +#ifndef _DOTS +#define _DOTS , ... +#endif + +#ifndef _VOID +#define _VOID void +#endif + + +// +// RTL library functions in ROM +// + +#define rtl_memset rtl_memset_v1_00 +#define rtl_memchr rtl_memchr_v1_00 +#define rtl_memmove rtl_memmove_v1_00 +#define rtl_strcmp rtl_strcmp_v1_00 +#define rtl_memcpy rtl_memcpy_v1_00 + + + +extern _ROM_CALL_ void * rtl_memset_v1_00(void * m , int c , size_t n); +extern _ROM_CALL_ void * rtl_memchr_v1_00(const void * src_void , int c , size_t length); +extern _ROM_CALL_ void * rtl_memmove_v1_00( void * dst_void , const void * src_void , size_t length); +extern _ROM_CALL_ int rtl_strcmp_v1_00(const char *s1 , const char *s2); +extern _ROM_CALL_ void * rtl_memcpy_v1_00(void * __restrict dst0 , const void * __restrict src0 , size_t len0); + + +// +// rtl eabi functions +// + +#define rtl_itod rtl_itod_v1_00 +#define rtl_dtoi rtl_dtoi_v1_00 +#define rtl_uitof rtl_uitof_v1_00 +#define rtl_uitod rtl_uitod_v1_00 + + + +#define rtl_dcmpeq rtl_dcmpeq_v1_00 +#define rtl_dcmplt rtl_dcmplt_v1_00 +#define rtl_dcmpgt rtl_dcmpgt_v1_00 + + +#define rtl_dadd rtl_dadd_v1_00 +#define rtl_dsub rtl_dsub_v1_00 +#define rtl_dmul rtl_dmul_v1_00 +#define rtl_ddiv rtl_ddiv_v1_00 + +extern _ROM_CALL_ double rtl_itod_v1_00(int lval); +extern _ROM_CALL_ int rtl_dtoi_v1_00(double d); +extern _ROM_CALL_ float rtl_uitof_v1_00(unsigned int lval); +extern _ROM_CALL_ double rtl_uitod_v1_00(unsigned int lval); + + +extern _ROM_CALL_ int rtl_dcmpeq_v1_00(double a, double b); +extern _ROM_CALL_ int rtl_dcmplt_v1_00(double a, double b); +extern _ROM_CALL_ int rtl_dcmpgt_v1_00(double a, double b); + + +extern _ROM_CALL_ double rtl_dadd_v1_00(double a, double b); +extern _ROM_CALL_ double rtl_dsub_v1_00(double a, double b); +extern _ROM_CALL_ double rtl_dmul_v1_00(double a, double b); +extern _ROM_CALL_ double rtl_ddiv_v1_00(double a, double b); + + +// +// mprec +// + +#include + + +typedef struct _Bigint _Bigint; + + +#define rtl_Balloc rtl_Balloc_v1_00 +#define rtl_Bfree rtl_Bfree_v1_00 +#define rtl_d2b rtl_d2b_v1_00 +#define rtl_i2b rtl_i2b_v1_00 +#define rtl_pow5mult rtl_pow5mult_v1_00 +#define rtl_multadd rtl_multadd_v1_00 +#define rtl_mult rtl_mult_v1_00 +#define rtl_hi0bits rtl_hi0bits_v1_00 +#define rtl_lshift rtl_lshift_v1_00 +#define rtl_cmp rtl_cmp_v1_00 +#define rtl_diff rtl_diff_v1_00 + + +extern _ROM_CALL_ _Bigint * rtl_Balloc_v1_00(struct _reent *ptr, int k); + +extern _ROM_CALL_ void rtl_Bfree_v1_00(struct _reent *ptr, _Bigint * v); + +extern _ROM_CALL_ _Bigint * rtl_d2b_v1_00(struct _reent * ptr, double _d, int *e, int *bits); +extern _ROM_CALL_ _Bigint * rtl_i2b_v1_00(struct _reent *ptr, int i ); +extern _ROM_CALL_ _Bigint * rtl_pow5mult_v1_00(struct _reent * ptr, _Bigint *b, int k); +extern _ROM_CALL_ _Bigint * rtl_multadd_v1_00(struct _reent *ptr, _Bigint * b, int m, int a); +extern _ROM_CALL_ _Bigint * rtl_mult_v1_00(struct _reent *ptr, _Bigint *a, _Bigint *b); +//extern _ROM_CALL_ int rtl_hi0bits_v1_00(register __ULong x); +extern _ROM_CALL_ _Bigint *rtl_lshift_v1_00(struct _reent *ptr, _Bigint *b, int k); +extern _ROM_CALL_ int rtl_cmp_v1_00(_Bigint *a, _Bigint *b); +extern _ROM_CALL_ _Bigint *rtl_diff_v1_00(struct _reent* ptr, _Bigint *a, _Bigint *b); + +// +// dtoa +// + +#define rtl_dtoa_r rtl_dtoa_r_v1_00 + +extern char * rtl_dtoa_r_v1_00(struct _reent *ptr, double _d, int mode, int ndigits, int *decpt, int *sign, char **rve); + +// +// mallocr +// +//#include +//#include + + + +#define __rom_mallocr_init __rom_mallocr_init_v1_00 + +#define rtl_calloc_r rtl_calloc_r_v1_00 +#define rtl_cfree_r rtl_cfree_r_v1_00 +#define rtl_malloc_r rtl_malloc_r_v1_00 +#define rtl_free_r rtl_free_r_v1_00 +#define rtl_realloc_r rtl_realloc_r_v1_00 +#define rtl_memalign_r rtl_memalign_r_v1_00 +#define rtl_valloc_r rtl_valloc_r_v1_00 +#define rtl_pvalloc_r rtl_pvalloc_r_v1_00 + + +extern _ROM_CALL_ void __rom_mallocr_init_v1_00(void); + + +#define RARG struct _reent *reent_ptr, +extern _ROM_CALL_ void* rtl_calloc_r_v1_00(RARG size_t n, size_t elem_size); +extern _ROM_CALL_ void rtl_cfree_r_v1_00(void *mem); +extern _ROM_CALL_ void* rtl_malloc_r_v1_00(RARG size_t bytes); +extern _ROM_CALL_ void rtl_free_r_v1_00(RARG void* mem); +extern _ROM_CALL_ void* rtl_realloc_r_v1_00(RARG void* oldmem, size_t bytes); +extern _ROM_CALL_ void* rtl_memalign_r_v1_00(RARG size_t alignment, size_t bytes); +extern _ROM_CALL_ void* rtl_valloc_r_v1_00(RARG size_t bytes); +extern _ROM_CALL_ void* rtl_pvalloc_r_v1_00(RARG size_t bytes); + + +// +// stdio +// +extern int rtl_errno; + +#ifndef _READ_WRITE_RETURN_TYPE +#define _READ_WRITE_RETURN_TYPE _ssize_t +#endif + +#ifndef _READ_WRITE_BUFSIZE_TYPE +#define _READ_WRITE_BUFSIZE_TYPE int +#endif + +#define rtl_sread rtl_sread_v1_00 +#define rtl_swrite rtl_swrite_v1_00 +#define rtl_seofread rtl_seofread_v1_00 +#define rtl_sseek rtl_sseek_v1_00 +#define rtl_sclose rtl_sclose_v1_00 +#define rtl_sbrk_r rtl_sbrk_r_v1_00 + +extern _ROM_CALL_ _READ_WRITE_RETURN_TYPE rtl_sread_v1_00( + struct _reent *ptr, + void *cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE n); + +extern _ROM_CALL_ _READ_WRITE_RETURN_TYPE rtl_swrite_v1_00( + struct _reent *ptr, + void *cookie, + char const *buf, + _READ_WRITE_BUFSIZE_TYPE n); + +extern _ROM_CALL_ _READ_WRITE_RETURN_TYPE rtl_seofread_v1_00( + struct _reent *_ptr, + _PTR cookie, + char *buf, + _READ_WRITE_BUFSIZE_TYPE len); +/* +extern _ROM_CALL_ _fpos_t rtl_sseek_v1_00( + struct _reent *ptr _AND + void *cookie _AND + _fpos_t offset _AND + int whence); + +extern _ROM_CALL_ int rtl_sclose_v1_00( + struct _reent *ptr _AND + void *cookie); + +extern _ROM_CALL_ void * rtl_sbrk_r_v1_00( + struct _reent *ptr, + ptrdiff_t incr); +*/ +// +// vfprintf +// + +#include +#include + +#define rtl_fflush_r rtl_fflush_r_v1_00 +#define rtl_vfprintf_r rtl_vfprintf_r_v1_00 + +extern _ROM_CALL_ int rtl_fflush_r_v1_00(struct _reent *ptr, register FILE * fp); +extern _ROM_CALL_ int rtl_vfprintf_r_v1_00(struct _reent *, FILE *, const char *, va_list); + + +#endif /* _RTL_LIB_ROM_H_ */ diff --git a/lib/rtl_std_lib/include/rtl_lib.h b/lib/rtl_std_lib/include/rtl_lib.h new file mode 100644 index 0000000..0fcadeb --- /dev/null +++ b/lib/rtl_std_lib/include/rtl_lib.h @@ -0,0 +1,141 @@ +/* + * rtl_lib.h + * + * Definitions for RTL library functions + */ + +#ifndef _RTL_LIB_H_ +#define _RTL_LIB_H_ + + +#include +//#include "diag.h" + + +extern int rtl_errno; + + +void init_rom_libgloss_ram_map(void); + + +// +// RTL library functions for Libc::stdio +// + +extern int rtl_printf(IN const char* fmt, ...); +extern int rtl_sprintf(char* str, const char* fmt, ...); +extern int rtl_snprintf(char* str, size_t size, const char* fmt, ...); + +// +// RTL library functions for string +// + +extern void * rtl_memchr(const void * src_void , int c , size_t length); +extern int rtl_memcmp(const void * m1 , const void * m2 , size_t n); +extern void * rtl_memcpy(void * dst0 , const void * src0 , size_t len0); +extern void * rtl_memmove( void * dst_void , const void * src_void , size_t length); +extern void * rtl_memset(void * m , int c , size_t n); +extern char * rtl_strcat(char * s1 , const char * s2); +extern char * rtl_strchr(const char *s1 , int i); +extern int rtl_strcmp(const char *s1 , const char *s2); +extern char* rtl_strcpy(char *dst0 , const char *src0); +extern size_t rtl_strlen(const char *str); +extern char * rtl_strncat(char * s1 , const char * s2 , size_t n); +extern int rtl_strncmp(const char *s1 , const char *s2 , size_t n); +extern char * rtl_strncpy(char * dst0 , const char * src0 , size_t count); +extern char * rtl_strstr(const char *searchee , const char *lookfor); +extern char * rtl_strsep(char **source_ptr , const char *delim); +extern char * rtl_strtok(char * s , const char * delim); + +// +// RTL library functions for math +// + + +extern double rtl_fabs(double); +extern float rtl_fabsf(float a); +extern float rtl_cos_f32(float a); +extern float rtl_sin_f32(float a); + +extern float rtl_fadd(float a, float b); +extern float rtl_fsub(float a, float b); +extern float rtl_fmul(float a, float b); +extern float rtl_fdiv(float a, float b); + +extern int rtl_fcmplt(float a, float b); +extern int rtl_fcmpgt(float a, float b); + + + + + +// +// RTL eabi functions + +extern double rtl_ftod(float f); + +extern double rtl_ddiv(double a, double b); + + +// +// Macro Library Functions +// + +typedef union +{ + float value; + u32 word; +} ieee_float_shape_type; + +/* Get a 32 bit int from a float. */ + +#define GET_FLOAT_WORD(i,d) \ +do { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ +} while (0) + +/* Set a float from a 32 bit int. */ + +#define SET_FLOAT_WORD(d,i) \ +do { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ +} while (0) + +static inline +float rtl_nanf(void) +{ + float x; + + SET_FLOAT_WORD(x,0x7fc00000); + return x; +} + + +// +// Library Test functions +// + +extern int rtl_lib_test(IN u16 argc, IN u8 *argv[]); +extern int rtl_math_test(IN u16 argc, IN u8 *argv[]); +extern int rtl_string_test(IN u16 argc, IN u8 *argv[]); + + +// +// Macro functions +// + +#undef dbg_printf +#define dbg_printf(fmt, args...) \ + rtl_printf("%s():%d : " fmt "\n", __FUNCTION__, __LINE__, ##args); + + +#undef err_printf +#define err_printf(fmt, args...) \ + rtl_printf("%s():%d : " fmt "\n", __FUNCTION__, __LINE__, ##args); + + +#endif /* _RTL_LIB_H_ */ diff --git a/lib/rtl_std_lib/libc/rom/string/rom_libc_string.h b/lib/rtl_std_lib/libc/rom/string/rom_libc_string.h new file mode 100644 index 0000000..8073fdc --- /dev/null +++ b/lib/rtl_std_lib/libc/rom/string/rom_libc_string.h @@ -0,0 +1,45 @@ +/* + * rom_libc_string.h + * + * Definitions for standard library - libc functions. + */ +#ifndef _ROM_LIBC_STRING_H_ +#define _ROM_LIBC_STRING_H_ + +#include + +#define rtl_memchr rtl_memchr_v1_00 +#define rtl_memcmp rtl_memcmp_v1_00 +#define rtl_memcpy rtl_memcpy_v1_00 +#define rtl_memmove rtl_memmove_v1_00 +#define rtl_memset rtl_memset_v1_00 +#define rtl_strcat rtl_strcat_v1_00 +#define rtl_strchr rtl_strchr_v1_00 +#define rtl_strcmp rtl_strcmp_v1_00 +#define rtl_strcpy rtl_strcpy_v1_00 +#define rtl_strlen rtl_strlen_v1_00 +#define rtl_strncat rtl_strncat_v1_00 +#define rtl_strncmp rtl_strncmp_v1_00 +#define rtl_strncpy rtl_strncpy_v1_00 +#define rtl_strstr rtl_strstr_v1_00 +#define rtl_strsep rtl_strsep_v1_00 +#define rtl_strtok rtl_strtok_v1_00 + +extern _ROM_CALL_ void * rtl_memchr_v1_00(const void * src_void , int c , size_t length); +extern _ROM_CALL_ int rtl_memcmp_v1_00(const void * m1 , const void * m2 , size_t n); +extern _ROM_CALL_ void * rtl_memcpy_v1_00(void * __restrict dst0 , const void * __restrict src0 , size_t len0); +extern _ROM_CALL_ void * rtl_memmove_v1_00( void * dst_void , const void * src_void , size_t length); +extern _ROM_CALL_ void * rtl_memset_v1_00(void * m , int c , size_t n); +extern _ROM_CALL_ char * rtl_strcat_v1_00(char *__restrict s1 , const char *__restrict s2); +extern _ROM_CALL_ char * rtl_strchr_v1_00(const char *s1 , int i); +extern _ROM_CALL_ int rtl_strcmp_v1_00(const char *s1 , const char *s2); +extern _ROM_CALL_ char* rtl_strcpy_v1_00(char *dst0 , const char *src0); +extern _ROM_CALL_ size_t rtl_strlen_v1_00(const char *str); +extern _ROM_CALL_ char * rtl_strncat_v1_00(char *__restrict s1 , const char *__restrict s2 , size_t n); +extern _ROM_CALL_ int rtl_strncmp_v1_00(const char *s1 , const char *s2 , size_t n); +extern _ROM_CALL_ char * rtl_strncpy_v1_00(char *__restrict dst0 , const char *__restrict src0 , size_t count); +extern _ROM_CALL_ char * rtl_strstr_v1_00(const char *searchee , const char *lookfor); +extern _ROM_CALL_ char * rtl_strsep_v1_00(register char **source_ptr , register const char *delim); +extern _ROM_CALL_ char * rtl_strtok_v1_00(register char *__restrict s , register const char *__restrict delim); + +#endif /* _ROM_LIBC_STRING_H_ */ diff --git a/lib/rtl_std_lib/libgloss/rtl8195a/rom/rom_libgloss_retarget.h b/lib/rtl_std_lib/libgloss/rtl8195a/rom/rom_libgloss_retarget.h new file mode 100644 index 0000000..f88ce47 --- /dev/null +++ b/lib/rtl_std_lib/libgloss/rtl8195a/rom/rom_libgloss_retarget.h @@ -0,0 +1,37 @@ +#ifndef ROM_LIBGLOSS_RETARGET_H +#define ROM_LIBGLOSS_RETARGET_H + +#include +#include + +#define rtl_close rtl_close_v1_00 +#define rtl_fstat rtl_fstat_v1_00 +#define rtl_isatty rtl_isatty_v1_00 +#define rtl_lseek rtl_lseek_v1_00 +#define rtl_open rtl_open_v1_00 +#define rtl_read rtl_read_v1_00 +#define rtl_write rtl_write_v1_00 +#define rtl_sbrk rtl_sbrk_v1_00 + +extern _ROM_CALL_ int rtl_close_v1_00(int fildes); +extern _ROM_CALL_ int rtl_fstat_v1_00(int fildes , struct stat *st); +extern _ROM_CALL_ int rtl_isatty_v1_00(int file); +extern _ROM_CALL_ int rtl_lseek_v1_00(int file , int ptr , int dir); +extern _ROM_CALL_ int rtl_open_v1_00(char *file , int flags , int mode); +extern _ROM_CALL_ int rtl_read_v1_00(int file , char *ptr , int len); +extern _ROM_CALL_ int rtl_write_v1_00(int file , const char *ptr , int len); +extern _ROM_CALL_ void* rtl_sbrk_v1_00(int incr); + + +struct _rom_libgloss_ram_map { + int (*libgloss_close)(int fildes); + int (*libgloss_fstat)(int fildes , struct stat *st); + int (*libgloss_isatty)(int file); + int (*libgloss_lseek)(int file , int ptr , int dir); + int (*libgloss_open)(char *file , int flags , int mode); + int (*libgloss_read)(int file , char *ptr , int len); + int (*libgloss_write)(int file , const char *ptr , int len); + void* (*libgloss_sbrk)(int incr); +}; + +#endif /* ROM_LIBGLOSS_RETARGET_H */ diff --git a/lib/strproc.h b/lib/strproc.h new file mode 100644 index 0000000..2920376 --- /dev/null +++ b/lib/strproc.h @@ -0,0 +1,106 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _STRPROC_H_ +#define _STRPROC_H_ + +#include /* for size_t */ +#include "va_list.h" + +#ifndef isprint +#define in_range(c, lo, up) ((u8)c >= lo && (u8)c <= up) +#define isprint(c) in_range(c, 0x20, 0x7f) +#define isdigit(c) in_range(c, '0', '9') +#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) +#define islower(c) in_range(c, 'a', 'z') +#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == ',') +#endif + + +extern _LONG_CALL_ char *_strncpy(char *dest, const char *src, size_t count); +extern _LONG_CALL_ char *_strcpy(char *dest, const char *src); +extern _LONG_CALL_ size_t _strlen(const char *s); +extern _LONG_CALL_ size_t _strnlen(const char *s, size_t count); +extern _LONG_CALL_ int _strcmp(const char *cs, const char *ct); +extern _LONG_CALL_ int _strncmp(const char *cs, const char *ct, size_t count); +extern _LONG_CALL_ int _sscanf(const char *buf, const char *fmt, ...); +extern _LONG_CALL_ char *_strsep(char **s, const char *ct); +extern _LONG_CALL_ char *skip_spaces(const char *str); +extern _LONG_CALL_ int skip_atoi(const char **s); +extern _LONG_CALL_ int _vsscanf(const char *buf, const char *fmt, va_list args); +extern _LONG_CALL_ unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base); +extern _LONG_CALL_ long simple_strtol(const char *cp, char **endp, unsigned int base); +extern _LONG_CALL_ long long simple_strtoll(const char *cp, char **endp, unsigned int base); +extern _LONG_CALL_ unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base); +extern _LONG_CALL_ const char *_parse_integer_fixup_radix(const char *s, unsigned int *base); +extern _LONG_CALL_ unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p); +extern _LONG_CALL_ u64 div_u64(u64 dividend, u32 divisor); +extern _LONG_CALL_ s64 div_s64(s64 dividend, s32 divisor); +extern _LONG_CALL_ u64 div_u64_rem(u64 dividend, u32 divisor, u32 *remainder); +extern _LONG_CALL_ s64 div_s64_rem(s64 dividend, s32 divisor, s32 *remainder); +extern _LONG_CALL_ char *_strpbrk(const char *cs, const char *ct); +extern _LONG_CALL_ char *_strchr(const char *s, int c); + + +extern _LONG_CALL_ VOID +prvStrCpy( + IN u8 *pDES, + IN const u8 *pSRC +); + +extern _LONG_CALL_ u32 +prvStrLen( + IN const u8 *pSRC +); + +extern _LONG_CALL_ u8 +prvStrCmp( + IN const u8 *string1, + IN const u8 *string2 +); + +extern _LONG_CALL_ u8* +StrUpr( + IN u8 *string +); + +extern _LONG_CALL_ int prvAtoi( + IN const char * s +); + +extern _LONG_CALL_ const char * prvStrStr( + IN const char * str1, + IN const char * str2 +); + + +#ifndef ARDUINO_SDK +/* + * Fast implementation of tolower() for internal usage. Do not use in your + * code. + */ +static inline char _tolower(const char c) +{ + return c | 0x20; +} +#endif + +/* Fast check for octal digit */ +static inline int isodigit(const char c) +{ + return c >= '0' && c <= '7'; +} +#ifndef strtoul +#define strtoul(str, endp, base) simple_strtoul(str, endp, base) +#endif +#ifndef strtol +#define strtol(str, endp, base) simple_strtol(str, endp, base) +#endif + +#endif diff --git a/lib/va_list.h b/lib/va_list.h new file mode 100644 index 0000000..c059df3 --- /dev/null +++ b/lib/va_list.h @@ -0,0 +1,37 @@ +/* + * Routines to access hardware + * + * Copyright (c) 2013 Realtek Semiconductor Corp. + * + * This module is a confidential and proprietary property of RealTek and + * possession or use of this module requires written permission of RealTek. + */ + +#ifndef _VA_LIST_H_ +#define _VA_LIST_H_ + +//#include "platform_autoconf.h" +#include "basic_types.h" + +#ifndef va_arg //this part is adapted from linux (Linux/include/acpi/platform/acenv.h) + +typedef s32 acpi_native_int;//this definition is in (Linux/include/acpi/actypes.h) + +#ifndef _VALIST +#define _VALIST + typedef char *va_list; +#endif /* _VALIST */ + +/* Storage alignment properties */ +#define _AUPBND (sizeof (acpi_native_int) - 1) +#define _ADNBND (sizeof (acpi_native_int) - 1) + +/* Variable argument list macro definitions */ +#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) +#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND)))) +#define va_end(ap) (ap = (va_list) NULL) +#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND)))) + +#endif /* va_arg */ + +#endif //_VA_LIST_H_ diff --git a/main.c b/main.c new file mode 100644 index 0000000..9c70e21 --- /dev/null +++ b/main.c @@ -0,0 +1,119 @@ +/* + * Test RTL Console ROM + * pvvx 26.09.16 + */ + +//#include +#include +//#include "basic_types.h" +//#include "cortex.h" +#include "rtl8710.h" +#include "rom_lib.h" +#include "hal_pinmux.h" +#include "hal_peri_on.h" + +//----------------------------------------------- Header +#define HEAD_DATA_ATTR __attribute__((aligned(4), section(".header.data"))) +#define HEAD_CODE_ATTR __attribute__((aligned(4), section(".header.code"))) +#define FLASH_HEAD_ATTR __attribute__((aligned(4), section(".fheader.data"))) + +typedef struct _Boot_Head { + void * start_addr0; //+0x00 Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x80000000 ) + void * start_addr1; //+0x04 Run if ( v40000210 & 0x20000000 ) + void * start_addr2; //+0x08 Run if ( v40000210 & 0x10000000 ) + void * start_addr3; //+0x0c Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x8000000 ) + void * start_addr4; //+0x10 for Init console, Run if ( v40000210 & 0x4000000 ) + u32 sign; //+0x14 = 0x88167923 // if != -> Image1 Validation Incorrect !!! Please Re-boot and try again, or re-burn the flash image + u32 reserved; //+0x18 u32 0xFFFFFFFF, +} BOOT_HEAD, *PBOOT_HEAD; + +typedef struct _Flash_Head { + u32 SpicCalibrationPattern[4]; //+0x00 = { 0x96969999,0xFC66CC3F,0x03CC33C0,0x6231DCE5 }; + u32 Seg_size; //+0x10 in Bytes + u32 Seg_load_addr; //+0x14 + u32 Image_2_Addr_1k; //+0x18 unit is 1024 bytes | 0xFFFF0000 + u32 Dummy; //+0x1C = 0xFFFFFFFF +} FLASH_HEAD, *PFLASH_HEAD; + +void start_init(void); +void start_init1(void); +void start_init2(void); +void start_init3(void); +void start_init4(void); +int main(int); + +BOOT_HEAD HEAD_DATA_ATTR boot_head = { + start_init, + start_init1, + start_init2, + start_init3, + start_init4, + 0x88167923, 0xFFFFFFFF + }; + +// Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x80000000 ) +void HEAD_CODE_ATTR start_init(void) +{ + main(0); +} +// Run if ( v40000210 & 0x20000000 ) +void HEAD_CODE_ATTR start_init1(void) +{ + main(1); +} +// Run if ( v40000210 & 0x10000000 ) +void HEAD_CODE_ATTR start_init2(void) +{ + main(2); +} +// Run if ( v400001F4 & 0x8000000 ) && ( v40000210 & 0x8000000 ) +void HEAD_CODE_ATTR start_init3(void) +{ + main(3); +} +// for Init console, Run if ( v40000210 & 0x4000000 ) +void HEAD_CODE_ATTR start_init4(void) +{ + main(4); +} + +//----------------------------------------------- Main +extern volatile u32 ConfigDebugErr; +extern volatile u8 * pUartLogCtl; +extern int UartLogCmdExecute(volatile u8 *); +extern u32 STACK_TOP; + +int main(int ini) +{ + if(ini == 0) HalPinCtrlRtl8195A(JTAG, 0, 1); + if((ini > 0)&&(ini < 4)) { + __asm__ __volatile__ ("cpsid f\n"); + HalCpuClkConfig(2); // 0 - 166666666 Hz, 1 - 83333333 Hz, 2 - 41666666 Hz, 3 - 20833333 Hz, 4 - 10416666 Hz, 5 - 4000000 Hz + ConfigDebugErr = -1; + VectorTableInitRtl8195A((u32)&STACK_TOP); // 0x1FFFFFFC); + HalInitPlatformLogUartV02(); + HalInitPlatformTimerV02(); + __asm__ __volatile__ ("cpsie f\n"); + } + printf("\r\nStart Init code: %d\r\n", ini); + printf("EFUSE 0..3: 0x%08x 0x%08x 0x%08x 0x%08x\r\n", SYS->EFUSE_SYSCFG0, SYS->EFUSE_SYSCFG1, SYS->EFUSE_SYSCFG2, SYS->EFUSE_SYSCFG3); + printf("EFUSE 4..7: 0x%08x 0x%08x 0x%08x 0x%08x\r\n", SYS->EFUSE_SYSCFG4, SYS->EFUSE_SYSCFG5, SYS->EFUSE_SYSCFG6, SYS->EFUSE_SYSCFG7); + printf("SYSCFG 0..2: 0x%08x 0x%08x 0x%08x\r\n", SYS->SYSTEM_CFG0, SYS->SYSTEM_CFG1, SYS->SYSTEM_CFG2); + printf("SOC_FUNC_EN: 0x%08x\r\n", PERI_ON->SOC_FUNC_EN); + + printf("\r\nRTL Console ROM: Start - press key 'Up', Help '?'\r\n"); + while(pUartLogCtl[5] != 1); + pUartLogCtl[3] = 0; + pUartLogCtl[6] = 1; + DiagPrintf("\r"); + while(1) { + while(pUartLogCtl[4] != 1 ); + UartLogCmdExecute(pUartLogCtl); + DiagPrintf("\r"); + pUartLogCtl[4] = 0; + } + return 1; +} + + +

U&^H|sBvb|;PZY0#YfQTUV3l9tz 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 cWvddo~|z&k6&?4@AIW{`gxJx?0gNS^K~|= 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ν=LEUNdJ6y&Enhg(?9Me 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 z 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∨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૟?HuXJj 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

U&^H|sBvb|;PZY0#YfQTUV3l9tz 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 cWvddo~|z&k6&?4@AIW{`gxJx?0gNS^K~|= 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