From db9c316019df5d7245bc3fd47c08f8dace051b2e Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Sun, 18 May 2014 13:42:51 +1000 Subject: [PATCH] More compatibility and bug fixes. - Maximum sector size increased to 8192 - Fix for REQUEST SENSE to support Ensoniq ASR-10 - Fix to configurable sector sizes --- CHANGELOG | 4 +- parts.ods | Bin 21585 -> 21736 bytes readme.txt | 2 + .../Generated_Source/PSoC5/Bootloadable_1.c | 0 .../Generated_Source/PSoC5/Bootloadable_1.h | 0 .../Generated_Source/PSoC5/CFG_EEPROM.c | 0 .../Generated_Source/PSoC5/CFG_EEPROM.h | 0 .../Generated_Source/PSoC5/Cm3Iar.icf | 2 +- .../Generated_Source/PSoC5/Cm3RealView.scat | 2 +- .../Generated_Source/PSoC5/Cm3Start.c | 0 .../Generated_Source/PSoC5/CyBootAsmGnu.s | 0 .../Generated_Source/PSoC5/CyBootAsmIar.s | 0 .../Generated_Source/PSoC5/CyBootAsmRv.s | 0 .../Generated_Source/PSoC5/CyDmac.c | 0 .../Generated_Source/PSoC5/CyDmac.h | 0 .../Generated_Source/PSoC5/CyFlash.c | 0 .../Generated_Source/PSoC5/CyFlash.h | 0 .../Generated_Source/PSoC5/CyLib.c | 0 .../Generated_Source/PSoC5/CyLib.h | 0 .../Generated_Source/PSoC5/CySpc.c | 0 .../Generated_Source/PSoC5/CySpc.h | 0 .../PSoC5/{SCSI_CMD_TIMER.c => Debug_Timer.c} | 344 +-- .../Generated_Source/PSoC5/Debug_Timer.h | 439 ++++ ...SCSI_ATN_ISR.c => Debug_Timer_Interrupt.c} | 712 +++---- .../PSoC5/Debug_Timer_Interrupt.h | 70 + .../{SCSI_CMD_TIMER_PM.c => Debug_Timer_PM.c} | 106 +- .../Generated_Source/PSoC5/LED1.c | 0 .../Generated_Source/PSoC5/LED1.h | 0 .../Generated_Source/PSoC5/LED1_aliases.h | 0 .../Generated_Source/PSoC5/SCSI_ATN.c | 0 .../Generated_Source/PSoC5/SCSI_ATN.h | 0 .../Generated_Source/PSoC5/SCSI_ATN_ISR.h | 70 - .../Generated_Source/PSoC5/SCSI_ATN_aliases.h | 0 .../PSoC5/SCSI_CMD_TIMER_ISR.c | 356 ---- .../PSoC5/SCSI_CMD_TIMER_ISR.h | 70 - .../Generated_Source/PSoC5/SCSI_In_DBx.c | 144 -- .../Generated_Source/PSoC5/SCSI_In_DBx.h | 130 -- .../PSoC5/SCSI_In_DBx_aliases.h | 0 .../Generated_Source/PSoC5/SCSI_In_aliases.h | 0 .../Generated_Source/PSoC5/SCSI_Out_Bits.c | 63 + .../{USBFS_1_Dp_aliases.h => SCSI_Out_Bits.h} | 74 +- .../Generated_Source/PSoC5/SCSI_Out_Ctl.c | 63 + .../PSoC5/{SD_WP_aliases.h => SCSI_Out_Ctl.h} | 74 +- .../Generated_Source/PSoC5/SCSI_Out_DBx.c | 144 -- .../Generated_Source/PSoC5/SCSI_Out_DBx.h | 130 -- .../PSoC5/SCSI_Out_DBx_aliases.h | 0 .../Generated_Source/PSoC5/SCSI_RST.c | 0 .../Generated_Source/PSoC5/SCSI_RST.h | 0 .../Generated_Source/PSoC5/SCSI_RST_ISR.c | 0 .../Generated_Source/PSoC5/SCSI_RST_ISR.h | 0 .../Generated_Source/PSoC5/SCSI_RST_aliases.h | 0 .../Generated_Source/PSoC5/SDCard.c | 0 .../Generated_Source/PSoC5/SDCard.h | 0 .../Generated_Source/PSoC5/SDCard_INT.c | 0 .../Generated_Source/PSoC5/SDCard_PM.c | 0 .../Generated_Source/PSoC5/SDCard_PVT.h | 0 .../Generated_Source/PSoC5/SD_CD.c | 0 .../Generated_Source/PSoC5/SD_CD.h | 0 .../Generated_Source/PSoC5/SD_CD_aliases.h | 0 .../Generated_Source/PSoC5/SD_CS.c | 0 .../Generated_Source/PSoC5/SD_CS.h | 0 .../Generated_Source/PSoC5/SD_CS_aliases.h | 0 .../Generated_Source/PSoC5/SD_Clk_Ctl.c | 0 .../Generated_Source/PSoC5/SD_Clk_Ctl.h | 0 .../Generated_Source/PSoC5/SD_DAT1.c | 0 .../Generated_Source/PSoC5/SD_DAT1.h | 0 .../Generated_Source/PSoC5/SD_DAT1_aliases.h | 0 .../Generated_Source/PSoC5/SD_DAT2.c | 0 .../Generated_Source/PSoC5/SD_DAT2.h | 0 .../Generated_Source/PSoC5/SD_DAT2_aliases.h | 0 .../Generated_Source/PSoC5/SD_Data_Clk.c | 0 .../Generated_Source/PSoC5/SD_Data_Clk.h | 0 .../Generated_Source/PSoC5/SD_Init_Clk.c | 0 .../Generated_Source/PSoC5/SD_Init_Clk.h | 0 .../Generated_Source/PSoC5/SD_MISO.c | 0 .../Generated_Source/PSoC5/SD_MISO.h | 0 .../Generated_Source/PSoC5/SD_MISO_aliases.h | 0 .../Generated_Source/PSoC5/SD_MOSI.c | 0 .../Generated_Source/PSoC5/SD_MOSI.h | 0 .../Generated_Source/PSoC5/SD_MOSI_aliases.h | 0 .../Generated_Source/PSoC5/SD_SCK.c | 0 .../Generated_Source/PSoC5/SD_SCK.h | 0 .../Generated_Source/PSoC5/SD_SCK_aliases.h | 0 .../Generated_Source/PSoC5/SD_WP.c | 137 -- .../Generated_Source/PSoC5/SD_WP.h | 130 -- .../Generated_Source/PSoC5/USBFS.h | 11 +- .../Generated_Source/PSoC5/USBFS_1.c | 1335 ------------ .../Generated_Source/PSoC5/USBFS_1.h | 1178 ----------- .../Generated_Source/PSoC5/USBFS_1_Dm.c | 137 -- .../Generated_Source/PSoC5/USBFS_1_Dm.h | 130 -- .../PSoC5/USBFS_1_Dm_aliases.h | 32 - .../Generated_Source/PSoC5/USBFS_1_Dp.c | 137 -- .../Generated_Source/PSoC5/USBFS_1_Dp.h | 130 -- .../Generated_Source/PSoC5/USBFS_1_audio.c | 318 --- .../Generated_Source/PSoC5/USBFS_1_audio.h | 95 - .../Generated_Source/PSoC5/USBFS_1_boot.c | 262 --- .../Generated_Source/PSoC5/USBFS_1_cdc.c | 706 ------- .../Generated_Source/PSoC5/USBFS_1_cdc.h | 92 - .../Generated_Source/PSoC5/USBFS_1_cdc.inf | 122 -- .../Generated_Source/PSoC5/USBFS_1_cls.c | 107 - .../Generated_Source/PSoC5/USBFS_1_descr.c | 180 -- .../Generated_Source/PSoC5/USBFS_1_drv.c | 781 ------- .../Generated_Source/PSoC5/USBFS_1_episr.c | 658 ------ .../Generated_Source/PSoC5/USBFS_1_hid.c | 422 ---- .../Generated_Source/PSoC5/USBFS_1_hid.h | 64 - .../Generated_Source/PSoC5/USBFS_1_midi.c | 1341 ------------ .../Generated_Source/PSoC5/USBFS_1_midi.h | 200 -- .../Generated_Source/PSoC5/USBFS_1_pm.c | 277 --- .../Generated_Source/PSoC5/USBFS_1_pvt.h | 190 -- .../Generated_Source/PSoC5/USBFS_1_std.c | 1134 ---------- .../Generated_Source/PSoC5/USBFS_1_vnd.c | 96 - .../Generated_Source/PSoC5/USBFS_descr.c | 116 +- .../Generated_Source/PSoC5/USBFS_pvt.h | 18 +- .../Generated_Source/PSoC5/cm3gcc.ld | 2 +- .../Generated_Source/PSoC5/config.hex | 70 - .../Generated_Source/PSoC5/core_cm3.h | 0 .../Generated_Source/PSoC5/core_cm3_psoc5.h | 0 .../Generated_Source/PSoC5/core_cmFunc.h | 0 .../Generated_Source/PSoC5/core_cmInstr.h | 0 .../Generated_Source/PSoC5/cyPm.c | 0 .../Generated_Source/PSoC5/cyPm.h | 0 .../Generated_Source/PSoC5/cydisabledsheets.h | 0 .../Generated_Source/PSoC5/cyfitter.h | 421 ++-- .../Generated_Source/PSoC5/cyfitter_cfg.c | 1879 +++++++++-------- .../Generated_Source/PSoC5/cyfittergnu.inc | 421 ++-- .../Generated_Source/PSoC5/cyfitteriar.inc | 421 ++-- .../Generated_Source/PSoC5/cyfitterrv.inc | 421 ++-- .../Generated_Source/PSoC5/cypins.h | 0 .../Generated_Source/PSoC5/cytypes.h | 0 .../Generated_Source/PSoC5/cyutils.c | 0 .../Generated_Source/PSoC5/project.h | 5 + .../Generated_Source/PSoC5/protect.hex | 0 .../Generated_Source/PSoC5/timer_clock.c | 521 +++++ .../Generated_Source/PSoC5/timer_clock.h | 124 ++ software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx | 125 +- software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cydwr | Bin 134725 -> 137188 bytes software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit | Bin 227426 -> 237960 bytes software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj | 223 +- software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd | 338 ++- .../SCSI2SD.cydsn/TopDesign/TopDesign.cysch | Bin 165416 -> 188561 bytes software/SCSI2SD/src/config.c | 88 +- software/SCSI2SD/src/config.h | 1 + software/SCSI2SD/src/disk.c | 3 + software/SCSI2SD/src/main.c | 1 + software/SCSI2SD/src/scsi.c | 86 + software/SCSI2SD/src/scsi.h | 5 +- software/SCSI2SD/src/sd.c | 42 +- software/scsi2sd-config/main.c | 9 +- software/scsi2sd-debug/.gitignore | 1 + software/scsi2sd-debug/Makefile | 24 + software/scsi2sd-debug/Makefile.mingw | 19 + software/scsi2sd-debug/main.c | 137 ++ 152 files changed, 5201 insertions(+), 13721 deletions(-) mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Bootloadable_1.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Bootloadable_1.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CFG_EEPROM.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CFG_EEPROM.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Cm3Start.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyBootAsmGnu.s mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyBootAsmIar.s mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyBootAsmRv.s mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyDmac.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyDmac.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyFlash.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyFlash.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyLib.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CyLib.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CySpc.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/CySpc.h rename software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/{SCSI_CMD_TIMER.c => Debug_Timer.c} (63%) create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer.h rename software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/{SCSI_ATN_ISR.c => Debug_Timer_Interrupt.c} (68%) mode change 100644 => 100755 create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_Interrupt.h rename software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/{SCSI_CMD_TIMER_PM.c => Debug_Timer_PM.c} (57%) mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_ISR.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_aliases.h delete mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.c delete mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_aliases.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.c rename software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/{USBFS_1_Dp_aliases.h => SCSI_Out_Bits.h} (54%) mode change 100644 => 100755 create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.c rename software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/{SD_WP_aliases.h => SCSI_Out_Ctl.h} (55%) mode change 100644 => 100755 delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_ISR.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_ISR.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_INT.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_PM.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_PVT.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Clk_Ctl.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Clk_Ctl.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Data_Clk.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Data_Clk.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Init_Clk.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Init_Clk.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI_aliases.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK_aliases.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm_aliases.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_boot.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.inf delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cls.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_descr.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_drv.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_episr.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pm.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pvt.h delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_std.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_vnd.c delete mode 100644 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/config.hex mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cm3.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cm3_psoc5.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cmFunc.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cmInstr.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyPm.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyPm.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydisabledsheets.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cypins.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cytypes.h mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyutils.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/protect.hex create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.h create mode 100644 software/scsi2sd-debug/.gitignore create mode 100644 software/scsi2sd-debug/Makefile create mode 100644 software/scsi2sd-debug/Makefile.mingw create mode 100644 software/scsi2sd-debug/main.c diff --git a/CHANGELOG b/CHANGELOG index 7c694e07..9f3b3f03 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,9 +1,11 @@ -201404?? 3.4 +20140418 3.4 + - Critical fix for writes when using non-standard block sizes. - Fix to ensure SCSI phase bits are set atomically. - Always return the requested number of bytes for a REQUEST SENSE command This is required to support the Ensoniq ASR-10. - Decreased (unused) heap and stack sizes to prepare for a memory write cache + - Increased the maximum sector size to 8192 bytes. 20140416 3.3 - Fix to SCSI Reset handling to avoid lockups diff --git a/parts.ods b/parts.ods index abfdf77fa4782282625b8b485e20a5fdaac4046a..eda6fa406c0062e659ea0403f7faefeff925b78a 100644 GIT binary patch delta 19811 zcmb5Ub99|=xAz;{wi?^EZCj0Puf}Gh#%UV6v5huXV>=BS`@Q>no@ejf)ZaYK<}UiykRmD*G-GR?%t1S}Z;s@hjAlJieqy=&F zxSiJU{KD=xK_)MPXe*hQvm8@`kUc~`MKLcnZ_3dnh0vt_r);Wrb0tbWPbZZxF9B-Z zb_?_m!gh-_Or9LpQ+e31m!PJzrTP!l)YJu>$kj7#?uX9Zk5(I?p2uP7vOgTr z|LzoDIDj|Zq&wiTG(RXLRKWY(v{Ia7);+f=b3SuQ=$`0>JarM46>CC>!h;4MAO8Uh z8u@Is!FsCa^~`za_~r51|Na~qcA7>?MrJ^ygw~tejuYu2Q$^?&>!zDVIVUPMRzX2w zAOnZR7)b)1_h_bQWDV5jE=A5=v^52KyN*KtFv!MvT5mBjSU;Z`hr71OsYOoQHS?!P zCQ*KW$F&pkjIKmn{ZNQXn6SUVpBvwz<+l* z-nr+MTh_fV1iHMu{Q6)b^jWsz7`O~7YU+NaZ-Kek4}3_H92u~^N~mj}bcSyqkhizD zU0q#W$U4=;qd+eHE$)ZPHb2VB%D#U6nkVG{t4wY8@i2d+L3HlYPF7Y{TpU6c!lssEo6Pv!9L@Y*tc5L{%Hh*Ug}Xx zXtUev0+9&I+gtkncHdKsnISO!YXI3;`_hoaf}qNFm{WHyXbSL^_tnj}=I^y%vC{nI z2=d1SKo^}2b_*3J3zY-$yQy>pAQ(&sD&`A!S&SqYwR=3? z%&FX;E{DQg4)t92BLeGNuQMA+B9~Ck6MP)!m{QE_B!2u2~?%Yb9A!we% zd80Fn%U<|u5YzMbFYL*JhlhvBT!HtiL{OMBzDf?81x&Y*qGB8`4`6O5^X0fK#$hPu z$ucD9rS>AwFIHju(}fb-k;oZPwO?ToehyJ}J)d{D2u(_AX&(hLUj~W_>{x3c569sb z@e|nMI_>JQg4vLIB$#R#wz?FWfd(R`eNEauj(?^x0QL(F4SiX>)0lf(kO*6#7ZVdB zidoRVx3{O9%O6~S!%Rm30(CJ;}|(z6Suw-UkUEeCN+O3qYTtu zWoUx{|h+9CmoSfX_97I8(>dY9#AT^YDE!s-)cc$Vd>e~)jOe6 z8y%Lvhj21I8p0qG%y$R+KhPEBTGshqTUFkeP;%AXGvf6EQFy~=7uhvV2|No@Pa;(C zc3wjjLdXON)&yL3l3ej>Ok}Trjdfc1A?0Y5b~;->p%ykw@F_RW<91^njSEEOY7cfT?N#Kh>`g!jSwcIRh3jQv>I& zCa3jw8PY(HyVGSG8orP7=-6DULWmLICX`WHL>3yo`50w2fU9Ek$5PLK*1nDcv5~Sw}}^w{A8lC>#nyW z`rZ9FwGbx7x=+w_S}{MSME3*?aeK;$Kepxyv=~f_%OGu9#i%#Ciz@P>Dmc_IE$!n4 z{N5-EC<0C7?coEGofLf3A0RI3X7i%=xcd2lU}sA|^+n%ls4BS1rNAOI20h<7;sqG& zBTen&qr5~;%L-QhvHH4Is>S9!m}R9H%H@b9d;}`@Ik(l18C4Brwi|_k=~tB*$l-H8 zjc1|?8U9kAN&MNVF&AGYPY~Z}Xe%A-XHiiRNXvqEqs|O+&2@k#i_KzKLi)-EQg?0S zOUsT~#Ss75D+_qPkWwg-tz^WBdomIu2Al*jviKbLa5{$A?zrwB`z6BCZ{GrL7jyu_ z1nsBksLsvvGB6;X*KhHQ{VX_+jN3_Ombmqnl$5N}Yk)bAG`Fze;NaNZ*#Y<trGNmz+a4&md(ObO7hgIGi9c;+ zFnE8L!Tis@hBKeIPU8U+Tm2@7N&B)LNt%QI4&-JaFXEi|j?$8pTPN=p4K`wIQ-ODxZv*aM55vDHZsAxp`<4N= zoma9Dh4ka_EAlehe5FnzKf!6dmP1^*$-stBN$6auiiU|0S45Eg>(lM@?>Scb+JAQ3 zXgg>1_-9{COl-$5>{N8{a&+@04x-$!DH!O3udlDR-ngY)hFBL(KN$af zFeL0sqCFK&xPG-}^ks^uNkVudOcgg^(D$1gmz&4|}pYBLm!smI6btGHw@Tqg54nMr>h&gdp}?vS{ex zpBJ#}U%%5C{*_bWY;6LV0c4`~qYZl4hCQjS<6)+!|L*-u)uK!(Ce`(TDtI-wv5^x` z1Bk(Tr)2b6&u`BcmBJZr(9G1lyu36Z8X0}_b6YB>h%Q!=!mGA`BT*mPpqDF|lWG@R zhl{GhVHaE$sh_;pDZL6NL67_E9o|4nVB%!bs=RGWp8q@xM68o%w0`Wd zRH-=lYUCn)z`h80oI33nnQ__|fk-?rA(m)F(Bbi`pq_wkcU-}3|0niC320kj`1WH; z@vlSmjb3Z4E3)}RaUr_f-;1T)s8AM)-w>oS;nNz4~3?oS-*O! zxHC8y7D=RPRv7mLwy==ulGn5s3|&8jje7EvGWh2MR^x)JwlWfgn6CP+25I*6h&XOz z47_hEnjJrbC%7{BZhjW)qMpbVs*&(GZ-mLT=1N^epG1KJS;q|o;Mez+7BbfDwoZhh z{an&@l;A6rUz~rTp=gU2HeLEBsaJK|wG6$HpIHW0-TZCvRwEl0LYVH=K_EFL|FXZ8O%1W<550$kD$L z0MlLC^h{uI<#9V^rC#<8<8?y<>lA%br~Ra|ZPe`wg{c%($_WcSNm~@psiV~9b*2xL zL!j+s<MHVk&)5dnJ2xuQ>s@! zxz1~D->K4+P!Mviy|h8t8|hn|k5{`Rg=1(SCpI=V3L@|iWDCdc$KPLx^Ts%mz)%@Y z0iN&scao8Qf))zrI%E6a83iyJ{cprD9Bi|>HqxbZY?T=%`N)pD2$H$BkR7(3%&}dl zNb`}qu}leWjZOJ#i?{2Fe)x65+bp?pn*`rK^#{=>$ShI`c9=FAYU&+Tb*^b@ChNEn z&vV3TaHZw59#@Uc8qqjp#Lkw}i8NFqcKq+DQ% zPE%5?q@+KImuS$&;(!t8|Id(HU3TO1-fnI#+B7zjyfF(P5l>{o*k`dJ|I3H|f_I#4 zT?zi&e;?xC0qr4Z9X~Gf*g@F6fl4~%>QsM&Aq}uMX`=%c{4#}S$e5d(n~!7Zf%og) z6IoniqoY1oL%3H|*3UD#s9v9gM|O71pLH2m=67tx#QFeoxY+2*PD@*;w~(nu&YKK2 zrh4V%Oj`OR{$KMwULQIye=l}iZ3Ze!B2JrW|BEge(0u~FfY&Kt&td_9hxK<^7=vCt zlRt_J2Hnia$RrTy)tf`V&=-_%4_+Tm&9(HF;HY3?Vs7i) zr0Y>OP)Zw`fiE*kqIcO#C|e_L@8i3jRrM>xj_1iJ#}GgMm95E_-d zZ&bh>U)$yd@$kO898Ht^ILwtyWU^ThaN3C4f0m@nldnh7CzS4W2l=MSsi~=bGzkg* zZzH*b$#OPa;kZWyJ%nC)}mcKZ`9P#|L_|?l8_o`>hP<%v2gc3ei7pzk?r`nJQ&a z-L1;&fr=YIbCUaZ-@%9Nb>}t;yk@^jc2r|E=`?^4ZGeH~e{1=F`@V26j-dv|p}7#= zo!l}F9=uH@O`gvVU^OqSZ?+L-_b#34BhrJ4cQA}h-K={?E*4Gj& zK2DN?e^Pw|3RLgo+5I^ck@W_UHL8%&o_^4I+u`Nlw{PF@Ijo|R(vN|!WO2&LKgQ9e zvpHS^)n5TgdD4L!j`!EUb4$)WxR?H&TPch4$JA8h$dt(Yn))oc!C>Tfz`TJQ#Kyvs z<%%*K0}AF5Odw+i0cj4XrvvVmt(o*2RW*cn+cKN+IbSzG{uffx()!A7e7mReqErsQ zZsy_?L?>2ToMn_M$(fEMmRp?jZ^@97DcqRmFvaEog~f5Y0Nkb>pb$V(Nm2)9;*{VB zvR^Tr^!Yo%fxo0P7?%X@--vFDeg%Fc!RLN}ghXDjh_xdvS@W?BRwYcJEsa5EcxZ@N z$Pa||WJ}0`q_m1;Wk>#tB>|Gjtbuw`D)6VO!i)5F^wpwW~v6 zQ6s{_bmi&e>=$dqwtQI3y`)en0J5Wy-Fz8f4rRDSfkh!9A%zl=pb7zT-{8&S$)xAwu?!X(O3J#Dvt&0D z(``hSP8UG(K_=wZrR`Wq=}= z8?2qzTG6qwsW_GFwKw^xsbS=|U|F3v1lQ2ze+C8**VotYJS1Kw!Z6GY78Qvy#rJ3A{XgjWwCw3$FGAUfC2 z&cI+lnnW(105LA=w%s2dflLUq zjt*Yf2v~WY+q-POKFBHcYS1v?C&TF3|%!_!hwP}mG2 zcm#P|kBWuDG&ygQv>V@c0r3X*dqgcH|2j~2NY9fMH>+;yul(JgSUlSpdc?SFhra$> zI{&V5M{m!M{I{FZnIaj3gyMZhn+(}DmK-rmRo&tb+9;&LNE8ulAkNgD+g}F1e^vVf z`HoF70%D!%A0c5pXQ7JX46fMfP_-}V%TO%t$k5R1%k>lh3!xUk^#kj_5a^}AX%wDe+mL zw=^h&AE>54KM|j6f=d(_SF`@h1OLB?;eQ~7{1DVuux`+h%@woI=ob!a{U$rAgl$Qd z^hX2K?jqwZzx~6*fj&U!+4fm&b_Db@58s;Si=B(qlhSPo65#;6jA9Ob8^0t#SOT@S zw$|0v0hu^d-NM{lltDe3*B)^8=;-KJT$W}cz8_t>2P~h?53WW?aYq1;B@39x?%Xc!YfZG$Tqr&ZC zK%eZp`m7>Mha{RsEZ`OPSFjBK!nOqq+4EJSRJre-kbs~a2+X6Svax$%%>hBhJM z-Id0JW-@HOJZssEurM@QFV~=P#hJKAT5Jn={8La+04SrqwIS5M(70W||Fx}5u!pdC zKn^{v{9|k5hjt%)5N;w45ZiXo+h8=NG2=C^C=22`pDaGi91z_?QphDDkVu7dw5bY! zEu?|~P>NAqPW~X%uaFWilRq?)Yyn}Kq*K1Q3tM(9cGMqmt5&xLE_`eLMT8`lkOZ$X zs^2<4@NP8uLrOhw?>OFXqOyEwck%30^oYYh0T3FcWc1Mg3FW$T;4zzLcn88&wux%5 zQ2-7rDJWE`7ysP*@ww>h*J+cbc97@q)6-LcBJzX-{QvoSdEqP9pn?@Mw%me*Z_R776GN~d3chJ=O|&LJZs zOZk_B#K$(hklaaux>i->>qAC9m%Vm_)db^+Jn9Kc7zP^J%P|cVm0Vhx|E%7m5J*2v z;tDu=pPxXl#HEM*!TJ-rpr@id_S1TT+4Zp@d#;0ni3$0Roo-Q8TRna8&(DGy`2@#QR5wF$uVm^3+!{72$9c@jP?$!dH%TMuVB=hQ!mDxtTk8 zVUYMD0(t{(bfwv`1GsV^bPC-qS#XYp-JG;+2F22R{oV(2PNt!u!PYKG2qKm!twAN? z-8w#XGcz-jl!U@7qFRIRonmBTLl5#~{TXSXp0kRx%%_;0U(yxA`TkQ?)R>Qt4?z2F zU~-@p;D2)@)}Sa`YiB<#oncdC;c~*y!ZJ0tynlJ=g8n@$Jvli!5{0-zqjVCm+h1R$ z5cylGtNT=d)&&r@h(Urrtdx|4vlBh+setSzAwx(^90*|j^yk!%;(oWl{C3DIM;MMC zNXkb3Y#oZBdR4F=NT)pj$ysy`Few4o9jHl1d;3d`b9;ifi*~Ow1f%fc@gD7ig-6OS zU%nJ{_JzVq$iTf@0WG28zvtJ)<%4eYhqYlW^8tdt90Z^v5x+CuRIf_1a%2aHs(UI> zsgxgW#EuA7;&`ck7wG=k!cVXlcGKS?dXNwdS(1MEkRX(0R8l%Oh>O8X?4*7;6#2}7H@TxI zD<%exjOC)8#u-aAiugE&rX-S^nVAVxoq)^6^bqujcAStxDJ=>C?V%VLgfh%2ATahr zVPScazlT60Zh5%_ZII#GeHI2zHgKT-s-&a@3eSUC(S*9;z&fh{9Tgr&yd6&Emj*+e z47z7?JFF5X`M!@QMFQ z5mQxlKK#W6ENi2~yY|ZdaSTC85$t7IOve>S@p=tbS|?49v@2Tgte2lA2^~$hKw^;4 z^U>B>pTrTF_abM;fEHPg+rIqn;-3uctjte3#F`sakNnI!uLcRW76h~f%7OzAV%5u5 zQJBF8dCOCa8oKc|NwKjJkrveR7^&ykWi>)AcHtfXi{B&*q z8M1`6wKV_=bq0$cQMo6EGzI;XEH*!MGZ753+0K3gEK_HE=n?UsPn>S&)X`u+^iAw* zq}u3vaL-bQ?37~-_UWz}3XcaWRer(A5n4!xA|TlO+nCqEcZWE-v3Lzz?S*+ zO}fTI-W;L|))%y}HV_vkV4JdVItrdb&^AkVT*`J)o8_OWrZz{Zk}oX8!^6YP-3)qv z1MspxE*%ROR|1~8sTF|C(rQ{%dCquW5R=ilnY6glXC&Z~K;E_cOO6B+^B9VD==k_Q zY#DxrVklW`m>dPo|NW^fYJ3DhsZUK#Mkgih0lHCUCF!Q>h_Q3psi;(0!<{`kHHL*> zBJi2)vi7JH(r?aI7b&96!SyjnNSuI~W?7m7Y?Fe_)Hgq> zd87Dc0I0wJe-Ge)4!HB@4UiVcJTyPXFjNiY*$i+8Tm{HD!~pHb;d9XMerLe9i3d0# zGZU{}^2Z#(Jh3WYK#Ah?V4JQohG9WpB+6u-5Mn#3q7r0yc(_Ca2&q15bjx%soe6J2 z{DYwlBa&bcpz};tc+vz&`{^4R#?^Bm;xGa&X4K0|{J@-8?mlR)hy4r_tEoKVQ3dsX zS5(-uWjKC{7G~OjdipOCa%?&en_3#2l$4UvOW2ga2kG~SlOBHMk_rWQunKtm<7X-z z5c@y@QbwgyuKPdJfM*W;hGMY$`ue8nA|fL6i;MJ+*y6*%7gkO?&XphHluqM#;ea(L z$ndFU2zZ{P`=}HE0T?7aR;zKmN)Js$p^|!57aT!P?P`H- zj@h}(%S+$ugXpC%#R?hyncoCOT1X2L-7V^KzImX*OiGgSP7enQ3;{7tKf%Y}PQsaV z(~~U0Ox4Wf@7J-A^3heEZ+{=oShJ!2Pltm|~9MqfLwQyIS|cTl+Uu)X`9_d_Og? zXx@EQxVEtT(X%ieojD!(LD@8j1fR4|V1FtuD>%a}8>*i`ex9Cm4qWUbQG&*F9OV6W zg=iyJ84st3ALqo&)yuKc8?uW@s8DU%Ys(f+7QfOKvxKA|Gki?%pEtkitb3}?sY(m@ zNT5~jcv{!?va+w=d$NlKk4M?er-w>YVMM2Hc?;k7Fl6_$CQ#(U6-|aYf*`cFr11L} ztXNfL3W`*H(AD=#hSA7R&Re0Qu)bjdY^%_L#@%H(#K@b$HvFsQe&qo{cb+CMb6{bm zQ4cOCua0`G8-em;LbE+f=A`jvYqu@)dm(bTs&>&5slwlEA=-;ek-tf8Xxtn!K@vzD zs6VwvVscXq(-EpBgvAA4F^66_p0*@ic$4gJ{CdQ12T9=jl}Lg)gyTgUoD7_O$W-$R z%a)){%D{a}zavEah+k5BI|XiX4doZ2;DMQB8{<1a(982=rD#N`%Mq`WFgTIk&r{|} z4~5JQm8VLugh8c|s4PnSsmO6&D+w312|Tku%w$uNg%r+d!e-6NCcB-=-W)DU9g{Jn zBiS3N8x%MqTVz{l=BZWbJ6p;K#!FZuJWcTIa!aEHQvcVV_sEL5k_^3v?!u<=DGh{A z8ImtHcUO2rOVEr>C+a;xe#2PIZJJ+tgrs|!=zH5-Zf0JYx}>c)txXDNB4b8t+rCu zQ7j7_AJ%Ojk}tLQo{r$JG;cW|roKlU{lV_!mRZwBa~`G@o4UNGg8B`!a}G@u^9u4G ztPG9{-uomn%h+Am%R|+r8iMP)mfnl$p&fWBFx#7Yh%REZVc2qBjco!Z#9^SyADv$iF@w*-ipX=^gUXQQQ zoR#*U<1rqFGO~ts`VE7XPO%e2)^=Lu;q{pEd*t68JQo7SQ$igmG;S|J4iPne#`w() zh&}E?kQPPWwc6&aZh5fH8}2gILy|)?-`1bD6Q8BL_auWF@HRQQf>xt;rKdq4xBU&d z)#%r|Mz`nnBi~%%{5YDWwBO%eM&wM*MS3@Byja-S-n=l?74+F|u z&Ok;nnK*NxyZ#E=~F<~@<*WvC%*1|I17<}(k zm^gYnvOMD1cjwz@=%LzQU`=n5!GK?!cLduJ%jrtW`8*rIkVq&=qEnc&(JpkU=jJ81 z+tH?RfNk}p@f+tO^PfOjV~nufe6vk3_W0h~>TNDH2{%&&i6Y4$gbHquV4Vp{=J;82 zsAs&s4+uo8jGpY2;nw6&b~Ffbf3N2nCPDuK8X&(&P!taQW>`6$Gj^Rr=sj{nq*1xi z&+?u||Lrxl>W)QK0T!-FbGAzX8VoFw8Vv0J3bc}cL-2oIh`<{QXD5%3P9DrYj-LbR zkU=+J7KAjoQ(i)Ucr55aiR;j-rop5DD#BAgwEQLf66307N_Q6S7g$~vcM|hFOG-jG zsBB$b9O@s?xy%OX!mok;&bH3ShdrAr!&?GZkR$G!q~zEn;5#Utg}WP_BJHOwSig@h zNZ-z^FP>KLlXeSvGL@nT=^>|(k4;2-yg;G54`Pb$U>K1ZLh^qaR5pz z(i{*AkAr7mEF;6#!m*{HY;4%Eu+<@NYxu#lW9>vB(8%NGdGh%ab>YHCNDc$(%FU|y z+6$g9GK=@wsa7O$4kFjQu^6?e*p8WjWi|r~&NN=U^2a8XvxO{0?;b0OyFc?SnPQ8L z>??vV6ghM_l)Ij~4t*8MPD6dZ%ea8p!u+V-?&VK9s()Mr&``d~|LOa+2k9@U+uX_{ zXUCa^qGf{+9$+mI#22kA0Yyi;CI900g%_{H>a}U^99i1ZT!h*yPo;|232o)vV(g&` zQ{CQ9Gl2c}#budwarsBa9geX%VfbfPe$Tp=*l#>aYwIekf%@O1Sx*@%rM|^vhYk$~A*B#3$)^UnbAPkue z7n!a$%l@v1xlUuM7*zA&Wi7fFP#=_;}ad1*Sn=$f-78!v4_ zh{q0axxpCw4LP4@K#P|sf{lz02^?STDv08(G4E}z_D>`}%F{(W6iQehHF>|pqYNAD z6Bas1a9B#QxaH9FxJM|~gJ!hGIAK1+y(8o}F4ZwQl-P-XM$M*1%q|peWws5FUui@V%X-tNwIG2l;$5D3Th2H879D)bYt{Mfa; zaxvFvJ7v&#j-W*hJX*<%AD~IoFIVl1OLgUi$cHj_ZfMk_03%AYo402crRdM>`bKsTBJ~@;erM;I z>h1bsB=93v{P|NE&`MXzOQF`wnh zbpk6O#d7(x0%ly%tZlmo{_}Uv`1F!JM7u_T%{*!G{DrL7-8N8!xqN@_E=qY2+JejS zd?GvF({y&Y#YnMg&6#W6Ta1uSKl)ikwpv^kTWCj~jlGFORUp$Sz02FzTJ)TVnTGna zjq$RtS8q{+(J&r9VZsJ6?S_vw;N%A^PrTx2ai`=44x68(W$>5f`CoN=mJ*6%@#<-fAnnD)PG;XraZWk2kH^~Je(BM@3aP!nJ><`k|y#EoyXwiOW) zgRe(Nq>!rJ5V@#c? zk}*;~FaT{U-Gl`ZXc5cP>|+rNX&&47v1UNEg}bGNlED~c%i!v!dDErSL)~}EoUIiB z1;0eode`k#=S)3{)Hur50@6U)&(;`H&VJ=Vooo^GO)5FhPJb#X?sj6rMqCN;)ssFW zWa+%>XE+RJzj#Ugp*kRSPL)>i_3%^}Bs)m4iva$Ow zc4rp$ojv6s9<@~HrC!1)`tq9kYuwGw?SZ1t&+{~Qta#`cK@WUhd(m$K-Y3z0Hw0ZA zYxW^i*IqH3)n4$|^!m?1=dbBWoNj};9Y{mO_$o)=NNOx6F>#YhwMFy%z`35z0$o?~owBp&v4Lj}6}Opm_Dj{9;TMsIwm*%Qwz^rADBla4jqtY& z>%BjM&Hm|hktYrR2sQwti0{IgOL&+rnELVbjlZEhoKQFwd@Nk02S()0W!e6X5=yI_I5CuxI=MC&}(Co3a+s0U1_$(PImmh(hdgK z&u(ffSXb~4Hdt+;{o7GJjyA^-m8 z`eEA)Rp>??CiFSe1C3aZ%esIzpI&XZY?VIk1&|#V{sntJ)gGy?IXTdBV5IlsZr&vI zT^zZ1R~6Y2dA~-z#eF$6(?-0Iz}ce;L^eFxn%$}loD{F*=j@YlLnXQwxRTfjCDqdu zvae&yZOfY~r4Z!Gg(5o*XSg{dOGH;GNr>=@E22Gcr-KLfQ|5a$?My$vmCe`5QzLw(O5yP8OtnuG%UGLcs|Tek zM;K;0%7-7yI(E!21+U#vh^3U2rGtX4C0qoXe;2W`YKQf`L4R^Of<^!n!hApEnL){T zi;sFkM!!K_NIg)lN`Koq&R<5Hrxu+@6CI}pLk_gi=SG^|GUTGy=M;1t{OS+_^=Cv{ zP7wm}r_uPz@Y+-sVy=7KC47SuCLjnqE(5g*%QQNy%ynmX z*Oz0*R|9Iwo_<{UhVcrK=7}0Y2`TF_gQU&Ij`dIfmHrt@MTw=OIs(HN|9%n(6*ffUK_+?t!vuXRWl$@hD-j8l{OG2;m425 zc7xxw*kb7j4s?}fyuOQ~MtwAR#64~`lzl>;&VshIi1F@ZYlGFeNOUwGE^JJ}ZDZW~!-f`*e{pfZxu^c&mxU0-y$$hB zF-el3%pu|cS2Hd#8;Nr*@WSzpPkwfA7m^=vaDa}kV0YNVALXXIUtl52cc$SxjW`JFPTNNT9EgneKrjuy1LkigAVgK zfW2Q6eA)@w7`=u+`rJ2qJG?O=@kjD!WUN{t5AhLacDIgaQ!mI* zRLttqUv;G^#DbE)GiZC@si9XY=I@;s?2I}+jySNVb*6`%kez!^f_$z!Z;j9~)e+y= zuY`hH(rbHk1EI~8Skn>@R-MJu8)?Xnw)F!t_vjYCnC)j42XKPGVJ|;}RgF=w=Kb zPS6@_g>W39YR=y)=&o40j}~z?ybH?c3Z{H{T$fx?3RA_dvm3q5Xe-NCV5(b$EoIzG z|K7;~*BUMCRBAMQcE+DfZuxO++~HD}v{N2Ho>JLVxgBzF@gukss)V z5l;=af52w1n`}_1K%D;3%<4jP9W4nRh-1?5#lMe=-F2}rG0MoQf={z@psw`jk@a{9%*{3>QkHqU2>AH{NKZS zI;DVXhnpbm2!4}L>E8&34WaKal%I03!mnyMj zjSLc4-udJ6wk8z7BX{+>P}U&FwP)Tbb?Pfyxym3a7*C~*4IXm1U5 zGYgFbX8QoSq56B>G3BXN;&`3_IUfJ@N|!e0aqvr9E{*7Ee3&s z`azc5ZI9`+PL(cHEp!XJ?xG%W%^8pY7=y5F2wapM(plfxJmKeRV}o_&q9L@FCp>Qj z*VjeQlKWCceMcoKxh&u>bT45$t)_vc38Ak7O=HTS+{77%$W%-gnjntOYZlZ;%@WO)7~m-@uou6Toe zmPL?T^vff}V7d+xf?&h)q-_uxvJW|gs~%bX6WL6bseHa_?^d=7vL`#%3XDE_zq9#f z%5!ATd@zr%(s$|(zM4u3C)G^~8}oa0#z9b5TR3brq*NE&VO^)Tn) zA()eL&8VIaH`%Y3S!KPWg4S_g%gOFs2gL)3Vrzfpm6Me_w&V_EAS_}PgR&ICs}a;h z8}d~&7(f>vRnOgs9O=|n&p^jO^u*g*9$0COu$-J3ldgF?1l5a(3qEtkj(EkWBZ6#a za{~RBAtzYQyt-CDlYR9j#P+Z<=eyp+C(}Fg@814GjXTBpV7-spR1LpeKbss=P5;ZI z%wk}x)jc|pmWMU^E3A^UU^8@%^N>DIt+|f~-tsvzxRF{dp>>Tu)bl7SNdZ?=YDFMN2e(YF6*-HvX2DiSZn5u$b?wf%NpL6W;7rH- zRn5dWHD}<-qZm5*Rr?*I?DSmx2fwoq*GZ^E5zgXW3BhFv^b^+wx<5y;ZhKsuzv*@G!sZ9lNuhT zn*%v_L8AOV>M*8@0Xil9FnlILi*CA3Oap;T>2SD>3bh!&w`bCU$1t{J$(rTy#{O~_ zHKXf51wt_P8uG-yPzYy^6WTscFL|#ga8G?OMn4D-H+T_D`uQuCDM61x{QB4RFo}N< zR(8}l<&&3h<`X5H=$fzIA7 zw``JgcteGD1F3UAMrjI)YhuL;hC$jfE97{nL3k60x(x*fqW%Nwu+VlkRh(aKqHo>RGld9 zPAbQ3zN-0KXtd301f$808x7a7i;NKWp<<(NoqMPV>Z$W7#bICR!K8Oh=) zr(}r#Rj+{D`@Tjjz<&oxbRcg9lIGYilp5cs;W#sh3L9@haQznyo~3aYB;vS9Jo9D1 zWz$Mp3?l-lX`yiKnjlXAr_xyfmE<9in=B#dau)~r0`|6 zBVwpVp?85|SDBrDmgPOQ+M^!bB!g_P8ER0C>E_SWlAS3%N1Yr<)5;}c35yx=Yf}mb zPkX6fjt5l&QXlIo7UER>idTI-WXG9Q80AXPBPtVU4U0Gt`I#0a4%<}~0=>8Dy z1SbNjGS5?WGb~a4L&4h>Ev9jPwcph@ia4+eJ1zJ;E10IwS);&I^C;CPTf4X!Y<&0) z3&C^lDuR+6?laDxeld~}Y6y0}Fm~UK11t$T{{7(}n7m37hK{$P4ZHZ{OQrLoN{nyT zAZVTGt^f1TxHKH8Y}BaLgy{j>7^%;-nh(p(%%A^$7*_(W9amhu3nkirf3jTj{G+vE z-gtSZTgn&)XnLiCvvvx?!3Kb*u|XGnyh>C!9~vTf}}9RE*VLC~q@ zk+^GsV_1Q~hnU)Q#aSgzk!$~=APjW398&2K*WB`pbsI3Tk0-6M0=QlskUo&c2M-f3 zTw+NT*WjP%;}Vhy(fvmmj4+ZH{)`M$=4ix`55k#YyefiV|u;V1kzt|Du4H41c{{fC~ z3fvbLL}I_xKW315KXhj8T0+F>+IjxofitO?XE!e&s=!DHaQ5O*mp)ZS32ypPO(Ci9 zQSSHNbcME(9Sa%yOZvN2(kA~XJJ+s~myq`-&Z%6GOcvOEDbsg`Zc!+Bz64uTE(XD} z(kRb@F}E;g^9A-A(N)*zGa6qyW^DyP0hp$F8+2WMHqwsAU`PVN)~`##X@OTpu651F zKDEt5_`gK*au}5oBbs>6* z4g*Pox{X2sarCDa`n{VRH#_;uqDbGE^%ml46J!aZ``mx?lI0FVpJ3I#2s?85f$uA} zA4fXP8^#cLrmQNI)fKh?C5m(b!(w6b<76^g%&4Sq0|IiYp z$)ymB0Q2Jl^pPnEHV6&3a&1^GNmdq*QZxQ^HG=Vqus+5*6A*8icT7c&4Hrd>S`GO( z7g4P8-nl#{=F6Fwur-N)r zX>|vd#o%c?6Tc!C#JsJ7XI{x+O7=Eeur$K9XdGy?I4)MMf@~Y{_OwZNo%odJj3aLl zKJ=5TNb)jrQViotk$`k?35224j2j7gZO=*u?zK|wx$1h~T zR5o%HQf;jnk$`x$kQoSy2XsbcGY=iu4KJ51c@rcD#3^RJ%~wg{c3B|{$ai?MHg${- zo}U>kauXcTxNt&7bk>hb~JetZieQIJ&Ewb!w zYuzq(rphv>d>lK=h9MK*jJ!KgHPg&z2!TL_;Qx2)=W~=eEhyt#hOV5pINVhowk%e33%#dR1I$Pbk+s2_P+K}y%wW+}fc1fo zWocrDK5Xq4!AGSCU0F3S=@s=a^b#ibq?b5C2hQrxFIALLvp<_*c3qLX;rJ_U2X%j{ z{*J4YDk3n8At2Z;uA^aXkYcoDLn26v)jp7kFzytA7oR+I_W>n{|EBLxp(K~^lveQF zSFWCe)RKoFc!EbZBmcm$O7pU*D%25YS>1(la>aJTnxH}O`ATpujX@#s0)m(@nb~X` z@ugzx1qXWW78mi5Hos+cWOR-^j{Rq)xW#e7<*$7KDieh1KIQY6;ZTJiMh={)r8Pq5 z)Dn|)yO~ZdlJ}q-_-1qufi~y18G~SOo*O@P8QA;?OG*^IR)nHRnvW}E+pAuIx+8rM zyg50qD6^k4XR?Gl?bDcDIpZJK*_nznIfgQaGim%Mr4*&c2PR^u8Kcd!Qt*F2f}Bm& zh#Dl89S1a99oAiHU#_2C^X3v6SFZNPQV&>;eldXLk(D$jixx;{Au1A#CLhK4mT^^S-Dt2e0S3LK9*;mMn<+mRxt!M-nVMdQ*U@r1vQ$A}a z$-qOvwZ~;Lch>nMSZ$M&vvU#kxz>3zUxeZBKJKE>_C=#xO13=AU?WH@1*XfzS;)oU z)WX+A6&PS_9pirDI@@hm(|wiFWnIa2NXsHbcx!b(Jix&o~ zufy$ngn6ahGL*yνRh7Y==yMU)>x#aSdrdc&geUT;H_sjW7TxFy^3x5q~g8_8P& z}Sypwbdym&slmERTU+7vbFTEKDLy61X~mc+Wj5G|ptJg5gB3bBsV7{Z^ zs*apifj!*>giuODqFmz40d=YX8xo+gj{oG=Nd(FVliNxjj8o#3YV*G-ahXw=cS zxA$tb2FQs|9t}ON-#KhUv>F{#_Eouq^{i=RAOyj;REO@qJm>~>--25ae^O(}i`i3s z8MK9=yiU~Q$#PcfM|duHT|1-8;U};+(C1xmYwjzQb3CdS4OQR2qjD5Bufbc}9Lc1R z@1NJ zbQYZ$!TWRb6;Y zgs+&u)!#0E&AaoFGR^6KkD@(u#m;4A^cdfMfO!1SL{>fNFb~JZmKh^AobYU|j4DZ> zO{1*px~vtqo)nLmuC46m^yN5Pg>%Cg06#Zud*jZ%$$Z(Ny;$PgD*M6 zPL|$P)A`})D&oD}-F=(TnVNr-U!)-5}7v~-;rmD;ga2n-* z%cj^wvA)uHT8=Btj;47qS2`WYLRSkiQ_NH5=qDc5`s*?db=}er>@F}qUl7R+qN*P7 z_t-ZcX0^UHr)ff0Cyku-VA&bxRH21xcBYDf*y$xpTpvJb(g$Ld^sKM#`c^Wq#)WkW zRXKBmp65}N`^j?7e2ZA+MXyNH{6)-|xnhHL*subL9yhjnfSlFDELdTTHY1+b9rRR% zoyK=`dxPGsE}+^2jTR*_xua()BC-{d#sc3g3?u1`ns~M z-+bC^J2p}V#am%LTJl>1>z>D*jc4*W=hHC)l1!H+v(z!~_0r=!VQ_E`q zt~Vvk2Tq%&9i0{EG7EppiyS&m{>l++Ojz|J__*BS(XR%7wGXw+nH3!NROEk zD3%L}7pg_Q59K}D*}R-nik>M}IC7%7xtLeh+m&urH)ur>%n|j-t@%4lx~Iz^zLWme<$e&+WmePR(d6uYoDnPQSH= z>}Qve3^;y>vGET_D&^0WjflhJwRT$^>!a5Y%aUjIPWG-!9lAbG`TIXpnEZR!siZQq z3hmhwja{GD>K<9B-)+Z~k@gfn*;mLA2ncjT4+Q$Ig!P?~SEcW1FC+I|77K93TK{Al z0%lm~GAV7(8EXhsWB#$9VC)vL0E{894Ws_uwpqepp%GERu_1H`KSe6IwM6_2@FFgH zh`ms9OH0RL_sA@QuXot|D#rzA<2LM)3UvKUa8X|3vn)P&64|bpkl5HT>i!rBt0e;G zDFcRrek|zz^ZiIlfcba00bHE6yfnJB)dB+CN_+LqAW&pTZ1DdJ^mFbM|BWKCl+b{# zx2Cf+QuXA44p~XlJ|=0}zwWcxQxZCu8WtK76KhG|7rM01rIgnbbig0HfF6R$kIYLT znco2!f(B4XSh<)WDdHJMaL(MN#)r*0A- zuq_r4c^fSi0EqV10aLI*y0`7(H_8%^Ml689BaFY7$ldMLzH|f0xzNicx@o^0egQBh K!XbNbQt-dQEy0BV delta 19566 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 -#include -#include - -#if !defined(SCSI_ATN_ISR__REMOVED) /* Check for removal by optimization */ - -/******************************************************************************* -* Place your includes, defines and code here -********************************************************************************/ -/* `#START SCSI_ATN_ISR_intc` */ - -/* `#END` */ - -#ifndef CYINT_IRQ_BASE -#define CYINT_IRQ_BASE 16 -#endif /* CYINT_IRQ_BASE */ -#ifndef CYINT_VECT_TABLE -#define CYINT_VECT_TABLE ((cyisraddress **) CYREG_NVIC_VECT_OFFSET) -#endif /* CYINT_VECT_TABLE */ - -/* Declared in startup, used to set unused interrupts to. */ -CY_ISR_PROTO(IntDefaultHandler); - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_Start -******************************************************************************** -* -* Summary: -* Set up the interrupt and enable it. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_Start(void) -{ - /* For all we know the interrupt is active. */ - SCSI_ATN_ISR_Disable(); - - /* Set the ISR to point to the SCSI_ATN_ISR Interrupt. */ - SCSI_ATN_ISR_SetVector(&SCSI_ATN_ISR_Interrupt); - - /* Set the priority. */ - SCSI_ATN_ISR_SetPriority((uint8)SCSI_ATN_ISR_INTC_PRIOR_NUMBER); - - /* Enable it. */ - SCSI_ATN_ISR_Enable(); -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_StartEx -******************************************************************************** -* -* Summary: -* Set up the interrupt and enable it. -* -* Parameters: -* address: Address of the ISR to set in the interrupt vector table. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_StartEx(cyisraddress address) -{ - /* For all we know the interrupt is active. */ - SCSI_ATN_ISR_Disable(); - - /* Set the ISR to point to the SCSI_ATN_ISR Interrupt. */ - SCSI_ATN_ISR_SetVector(address); - - /* Set the priority. */ - SCSI_ATN_ISR_SetPriority((uint8)SCSI_ATN_ISR_INTC_PRIOR_NUMBER); - - /* Enable it. */ - SCSI_ATN_ISR_Enable(); -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_Stop -******************************************************************************** -* -* Summary: -* Disables and removes the interrupt. -* -* Parameters: -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_Stop(void) -{ - /* Disable this interrupt. */ - SCSI_ATN_ISR_Disable(); - - /* Set the ISR to point to the passive one. */ - SCSI_ATN_ISR_SetVector(&IntDefaultHandler); -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_Interrupt -******************************************************************************** -* -* Summary: -* The default Interrupt Service Routine for SCSI_ATN_ISR. -* -* Add custom code between the coments to keep the next version of this file -* from over writting your code. -* -* Parameters: -* -* Return: -* None -* -*******************************************************************************/ -CY_ISR(SCSI_ATN_ISR_Interrupt) -{ - /* Place your Interrupt code here. */ - /* `#START SCSI_ATN_ISR_Interrupt` */ - - /* `#END` */ -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_SetVector -******************************************************************************** -* -* Summary: -* Change the ISR vector for the Interrupt. Note calling SCSI_ATN_ISR_Start -* will override any effect this method would have had. To set the vector -* before the component has been started use SCSI_ATN_ISR_StartEx instead. -* -* Parameters: -* address: Address of the ISR to set in the interrupt vector table. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_SetVector(cyisraddress address) -{ - cyisraddress * ramVectorTable; - - ramVectorTable = (cyisraddress *) *CYINT_VECT_TABLE; - - ramVectorTable[CYINT_IRQ_BASE + (uint32)SCSI_ATN_ISR__INTC_NUMBER] = address; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_GetVector -******************************************************************************** -* -* Summary: -* Gets the "address" of the current ISR vector for the Interrupt. -* -* Parameters: -* None -* -* Return: -* Address of the ISR in the interrupt vector table. -* -*******************************************************************************/ -cyisraddress SCSI_ATN_ISR_GetVector(void) -{ - cyisraddress * ramVectorTable; - - ramVectorTable = (cyisraddress *) *CYINT_VECT_TABLE; - - return ramVectorTable[CYINT_IRQ_BASE + (uint32)SCSI_ATN_ISR__INTC_NUMBER]; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_SetPriority -******************************************************************************** -* -* Summary: -* Sets the Priority of the Interrupt. Note calling SCSI_ATN_ISR_Start -* or SCSI_ATN_ISR_StartEx will override any effect this method -* would have had. This method should only be called after -* SCSI_ATN_ISR_Start or SCSI_ATN_ISR_StartEx has been called. To set -* the initial priority for the component use the cydwr file in the tool. -* -* Parameters: -* priority: Priority of the interrupt. 0 - 7, 0 being the highest. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_SetPriority(uint8 priority) -{ - *SCSI_ATN_ISR_INTC_PRIOR = priority << 5; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_GetPriority -******************************************************************************** -* -* Summary: -* Gets the Priority of the Interrupt. -* -* Parameters: -* None -* -* Return: -* Priority of the interrupt. 0 - 7, 0 being the highest. -* -*******************************************************************************/ -uint8 SCSI_ATN_ISR_GetPriority(void) -{ - uint8 priority; - - - priority = *SCSI_ATN_ISR_INTC_PRIOR >> 5; - - return priority; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_Enable -******************************************************************************** -* -* Summary: -* Enables the interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_Enable(void) -{ - /* Enable the general interrupt. */ - *SCSI_ATN_ISR_INTC_SET_EN = SCSI_ATN_ISR__INTC_MASK; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_GetState -******************************************************************************** -* -* Summary: -* Gets the state (enabled, disabled) of the Interrupt. -* -* Parameters: -* None -* -* Return: -* 1 if enabled, 0 if disabled. -* -*******************************************************************************/ -uint8 SCSI_ATN_ISR_GetState(void) -{ - /* Get the state of the general interrupt. */ - return ((*SCSI_ATN_ISR_INTC_SET_EN & (uint32)SCSI_ATN_ISR__INTC_MASK) != 0u) ? 1u:0u; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_Disable -******************************************************************************** -* -* Summary: -* Disables the Interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_Disable(void) -{ - /* Disable the general interrupt. */ - *SCSI_ATN_ISR_INTC_CLR_EN = SCSI_ATN_ISR__INTC_MASK; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_SetPending -******************************************************************************** -* -* Summary: -* Causes the Interrupt to enter the pending state, a software method of -* generating the interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_SetPending(void) -{ - *SCSI_ATN_ISR_INTC_SET_PD = SCSI_ATN_ISR__INTC_MASK; -} - - -/******************************************************************************* -* Function Name: SCSI_ATN_ISR_ClearPending -******************************************************************************** -* -* Summary: -* Clears a pending interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_ATN_ISR_ClearPending(void) -{ - *SCSI_ATN_ISR_INTC_CLR_PD = SCSI_ATN_ISR__INTC_MASK; -} - -#endif /* End check for removal by optimization */ - - -/* [] END OF FILE */ +/******************************************************************************* +* File Name: Debug_Timer_Interrupt.c +* Version 1.70 +* +* Description: +* API for controlling the state of an interrupt. +* +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#include +#include +#include + +#if !defined(Debug_Timer_Interrupt__REMOVED) /* Check for removal by optimization */ + +/******************************************************************************* +* Place your includes, defines and code here +********************************************************************************/ +/* `#START Debug_Timer_Interrupt_intc` */ + +/* `#END` */ + +#ifndef CYINT_IRQ_BASE +#define CYINT_IRQ_BASE 16 +#endif /* CYINT_IRQ_BASE */ +#ifndef CYINT_VECT_TABLE +#define CYINT_VECT_TABLE ((cyisraddress **) CYREG_NVIC_VECT_OFFSET) +#endif /* CYINT_VECT_TABLE */ + +/* Declared in startup, used to set unused interrupts to. */ +CY_ISR_PROTO(IntDefaultHandler); + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_Start +******************************************************************************** +* +* Summary: +* Set up the interrupt and enable it. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_Start(void) +{ + /* For all we know the interrupt is active. */ + Debug_Timer_Interrupt_Disable(); + + /* Set the ISR to point to the Debug_Timer_Interrupt Interrupt. */ + Debug_Timer_Interrupt_SetVector(&Debug_Timer_Interrupt_Interrupt); + + /* Set the priority. */ + Debug_Timer_Interrupt_SetPriority((uint8)Debug_Timer_Interrupt_INTC_PRIOR_NUMBER); + + /* Enable it. */ + Debug_Timer_Interrupt_Enable(); +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_StartEx +******************************************************************************** +* +* Summary: +* Set up the interrupt and enable it. +* +* Parameters: +* address: Address of the ISR to set in the interrupt vector table. +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_StartEx(cyisraddress address) +{ + /* For all we know the interrupt is active. */ + Debug_Timer_Interrupt_Disable(); + + /* Set the ISR to point to the Debug_Timer_Interrupt Interrupt. */ + Debug_Timer_Interrupt_SetVector(address); + + /* Set the priority. */ + Debug_Timer_Interrupt_SetPriority((uint8)Debug_Timer_Interrupt_INTC_PRIOR_NUMBER); + + /* Enable it. */ + Debug_Timer_Interrupt_Enable(); +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_Stop +******************************************************************************** +* +* Summary: +* Disables and removes the interrupt. +* +* Parameters: +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_Stop(void) +{ + /* Disable this interrupt. */ + Debug_Timer_Interrupt_Disable(); + + /* Set the ISR to point to the passive one. */ + Debug_Timer_Interrupt_SetVector(&IntDefaultHandler); +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_Interrupt +******************************************************************************** +* +* Summary: +* The default Interrupt Service Routine for Debug_Timer_Interrupt. +* +* Add custom code between the coments to keep the next version of this file +* from over writting your code. +* +* Parameters: +* +* Return: +* None +* +*******************************************************************************/ +CY_ISR(Debug_Timer_Interrupt_Interrupt) +{ + /* Place your Interrupt code here. */ + /* `#START Debug_Timer_Interrupt_Interrupt` */ + + /* `#END` */ +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_SetVector +******************************************************************************** +* +* Summary: +* Change the ISR vector for the Interrupt. Note calling Debug_Timer_Interrupt_Start +* will override any effect this method would have had. To set the vector +* before the component has been started use Debug_Timer_Interrupt_StartEx instead. +* +* Parameters: +* address: Address of the ISR to set in the interrupt vector table. +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_SetVector(cyisraddress address) +{ + cyisraddress * ramVectorTable; + + ramVectorTable = (cyisraddress *) *CYINT_VECT_TABLE; + + ramVectorTable[CYINT_IRQ_BASE + (uint32)Debug_Timer_Interrupt__INTC_NUMBER] = address; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_GetVector +******************************************************************************** +* +* Summary: +* Gets the "address" of the current ISR vector for the Interrupt. +* +* Parameters: +* None +* +* Return: +* Address of the ISR in the interrupt vector table. +* +*******************************************************************************/ +cyisraddress Debug_Timer_Interrupt_GetVector(void) +{ + cyisraddress * ramVectorTable; + + ramVectorTable = (cyisraddress *) *CYINT_VECT_TABLE; + + return ramVectorTable[CYINT_IRQ_BASE + (uint32)Debug_Timer_Interrupt__INTC_NUMBER]; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_SetPriority +******************************************************************************** +* +* Summary: +* Sets the Priority of the Interrupt. Note calling Debug_Timer_Interrupt_Start +* or Debug_Timer_Interrupt_StartEx will override any effect this method +* would have had. This method should only be called after +* Debug_Timer_Interrupt_Start or Debug_Timer_Interrupt_StartEx has been called. To set +* the initial priority for the component use the cydwr file in the tool. +* +* Parameters: +* priority: Priority of the interrupt. 0 - 7, 0 being the highest. +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_SetPriority(uint8 priority) +{ + *Debug_Timer_Interrupt_INTC_PRIOR = priority << 5; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_GetPriority +******************************************************************************** +* +* Summary: +* Gets the Priority of the Interrupt. +* +* Parameters: +* None +* +* Return: +* Priority of the interrupt. 0 - 7, 0 being the highest. +* +*******************************************************************************/ +uint8 Debug_Timer_Interrupt_GetPriority(void) +{ + uint8 priority; + + + priority = *Debug_Timer_Interrupt_INTC_PRIOR >> 5; + + return priority; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_Enable +******************************************************************************** +* +* Summary: +* Enables the interrupt. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_Enable(void) +{ + /* Enable the general interrupt. */ + *Debug_Timer_Interrupt_INTC_SET_EN = Debug_Timer_Interrupt__INTC_MASK; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_GetState +******************************************************************************** +* +* Summary: +* Gets the state (enabled, disabled) of the Interrupt. +* +* Parameters: +* None +* +* Return: +* 1 if enabled, 0 if disabled. +* +*******************************************************************************/ +uint8 Debug_Timer_Interrupt_GetState(void) +{ + /* Get the state of the general interrupt. */ + return ((*Debug_Timer_Interrupt_INTC_SET_EN & (uint32)Debug_Timer_Interrupt__INTC_MASK) != 0u) ? 1u:0u; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_Disable +******************************************************************************** +* +* Summary: +* Disables the Interrupt. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_Disable(void) +{ + /* Disable the general interrupt. */ + *Debug_Timer_Interrupt_INTC_CLR_EN = Debug_Timer_Interrupt__INTC_MASK; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_SetPending +******************************************************************************** +* +* Summary: +* Causes the Interrupt to enter the pending state, a software method of +* generating the interrupt. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_SetPending(void) +{ + *Debug_Timer_Interrupt_INTC_SET_PD = Debug_Timer_Interrupt__INTC_MASK; +} + + +/******************************************************************************* +* Function Name: Debug_Timer_Interrupt_ClearPending +******************************************************************************** +* +* Summary: +* Clears a pending interrupt. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +void Debug_Timer_Interrupt_ClearPending(void) +{ + *Debug_Timer_Interrupt_INTC_CLR_PD = Debug_Timer_Interrupt__INTC_MASK; +} + +#endif /* End check for removal by optimization */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_Interrupt.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_Interrupt.h new file mode 100755 index 00000000..df33d25c --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_Interrupt.h @@ -0,0 +1,70 @@ +/******************************************************************************* +* File Name: Debug_Timer_Interrupt.h +* Version 1.70 +* +* Description: +* Provides the function definitions for the Interrupt Controller. +* +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#if !defined(CY_ISR_Debug_Timer_Interrupt_H) +#define CY_ISR_Debug_Timer_Interrupt_H + + +#include +#include + +/* Interrupt Controller API. */ +void Debug_Timer_Interrupt_Start(void); +void Debug_Timer_Interrupt_StartEx(cyisraddress address); +void Debug_Timer_Interrupt_Stop(void); + +CY_ISR_PROTO(Debug_Timer_Interrupt_Interrupt); + +void Debug_Timer_Interrupt_SetVector(cyisraddress address); +cyisraddress Debug_Timer_Interrupt_GetVector(void); + +void Debug_Timer_Interrupt_SetPriority(uint8 priority); +uint8 Debug_Timer_Interrupt_GetPriority(void); + +void Debug_Timer_Interrupt_Enable(void); +uint8 Debug_Timer_Interrupt_GetState(void); +void Debug_Timer_Interrupt_Disable(void); + +void Debug_Timer_Interrupt_SetPending(void); +void Debug_Timer_Interrupt_ClearPending(void); + + +/* Interrupt Controller Constants */ + +/* Address of the INTC.VECT[x] register that contains the Address of the Debug_Timer_Interrupt ISR. */ +#define Debug_Timer_Interrupt_INTC_VECTOR ((reg32 *) Debug_Timer_Interrupt__INTC_VECT) + +/* Address of the Debug_Timer_Interrupt ISR priority. */ +#define Debug_Timer_Interrupt_INTC_PRIOR ((reg8 *) Debug_Timer_Interrupt__INTC_PRIOR_REG) + +/* Priority of the Debug_Timer_Interrupt interrupt. */ +#define Debug_Timer_Interrupt_INTC_PRIOR_NUMBER Debug_Timer_Interrupt__INTC_PRIOR_NUM + +/* Address of the INTC.SET_EN[x] byte to bit enable Debug_Timer_Interrupt interrupt. */ +#define Debug_Timer_Interrupt_INTC_SET_EN ((reg32 *) Debug_Timer_Interrupt__INTC_SET_EN_REG) + +/* Address of the INTC.CLR_EN[x] register to bit clear the Debug_Timer_Interrupt interrupt. */ +#define Debug_Timer_Interrupt_INTC_CLR_EN ((reg32 *) Debug_Timer_Interrupt__INTC_CLR_EN_REG) + +/* Address of the INTC.SET_PD[x] register to set the Debug_Timer_Interrupt interrupt state to pending. */ +#define Debug_Timer_Interrupt_INTC_SET_PD ((reg32 *) Debug_Timer_Interrupt__INTC_SET_PD_REG) + +/* Address of the INTC.CLR_PD[x] register to clear the Debug_Timer_Interrupt interrupt. */ +#define Debug_Timer_Interrupt_INTC_CLR_PD ((reg32 *) Debug_Timer_Interrupt__INTC_CLR_PD_REG) + + +#endif /* CY_ISR_Debug_Timer_Interrupt_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_PM.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_PM.c similarity index 57% rename from software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_PM.c rename to software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_PM.c index f9556fa8..97f2d96d 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_PM.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/Debug_Timer_PM.c @@ -1,5 +1,5 @@ /******************************************************************************* -* File Name: SCSI_CMD_TIMER_PM.c +* File Name: Debug_Timer_PM.c * Version 2.50 * * Description: @@ -16,12 +16,12 @@ * the software package with which this file was provided. ********************************************************************************/ -#include "SCSI_CMD_TIMER.h" -static SCSI_CMD_TIMER_backupStruct SCSI_CMD_TIMER_backup; +#include "Debug_Timer.h" +static Debug_Timer_backupStruct Debug_Timer_backup; /******************************************************************************* -* Function Name: SCSI_CMD_TIMER_SaveConfig +* Function Name: Debug_Timer_SaveConfig ******************************************************************************** * * Summary: @@ -34,41 +34,41 @@ static SCSI_CMD_TIMER_backupStruct SCSI_CMD_TIMER_backup; * void * * Global variables: -* SCSI_CMD_TIMER_backup: Variables of this global structure are modified to +* Debug_Timer_backup: Variables of this global structure are modified to * store the values of non retention configuration registers when Sleep() API is * called. * *******************************************************************************/ -void SCSI_CMD_TIMER_SaveConfig(void) +void Debug_Timer_SaveConfig(void) { - #if (!SCSI_CMD_TIMER_UsingFixedFunction) + #if (!Debug_Timer_UsingFixedFunction) /* Backup the UDB non-rentention registers for CY_UDB_V0 */ #if (CY_UDB_V0) - SCSI_CMD_TIMER_backup.TimerUdb = SCSI_CMD_TIMER_ReadCounter(); - SCSI_CMD_TIMER_backup.TimerPeriod = SCSI_CMD_TIMER_ReadPeriod(); - SCSI_CMD_TIMER_backup.InterruptMaskValue = SCSI_CMD_TIMER_STATUS_MASK; - #if (SCSI_CMD_TIMER_UsingHWCaptureCounter) - SCSI_CMD_TIMER_backup.TimerCaptureCounter = SCSI_CMD_TIMER_ReadCaptureCount(); + Debug_Timer_backup.TimerUdb = Debug_Timer_ReadCounter(); + Debug_Timer_backup.TimerPeriod = Debug_Timer_ReadPeriod(); + Debug_Timer_backup.InterruptMaskValue = Debug_Timer_STATUS_MASK; + #if (Debug_Timer_UsingHWCaptureCounter) + Debug_Timer_backup.TimerCaptureCounter = Debug_Timer_ReadCaptureCount(); #endif /* Backup the UDB non-rentention register capture counter for CY_UDB_V0 */ #endif /* Backup the UDB non-rentention registers for CY_UDB_V0 */ #if (CY_UDB_V1) - SCSI_CMD_TIMER_backup.TimerUdb = SCSI_CMD_TIMER_ReadCounter(); - SCSI_CMD_TIMER_backup.InterruptMaskValue = SCSI_CMD_TIMER_STATUS_MASK; - #if (SCSI_CMD_TIMER_UsingHWCaptureCounter) - SCSI_CMD_TIMER_backup.TimerCaptureCounter = SCSI_CMD_TIMER_ReadCaptureCount(); + Debug_Timer_backup.TimerUdb = Debug_Timer_ReadCounter(); + Debug_Timer_backup.InterruptMaskValue = Debug_Timer_STATUS_MASK; + #if (Debug_Timer_UsingHWCaptureCounter) + Debug_Timer_backup.TimerCaptureCounter = Debug_Timer_ReadCaptureCount(); #endif /* Back Up capture counter register */ #endif /* Backup non retention registers, interrupt mask and capture counter for CY_UDB_V1 */ - #if(!SCSI_CMD_TIMER_ControlRegRemoved) - SCSI_CMD_TIMER_backup.TimerControlRegister = SCSI_CMD_TIMER_ReadControlRegister(); + #if(!Debug_Timer_ControlRegRemoved) + Debug_Timer_backup.TimerControlRegister = Debug_Timer_ReadControlRegister(); #endif /* Backup the enable state of the Timer component */ #endif /* Backup non retention registers in UDB implementation. All fixed function registers are retention */ } /******************************************************************************* -* Function Name: SCSI_CMD_TIMER_RestoreConfig +* Function Name: Debug_Timer_RestoreConfig ******************************************************************************** * * Summary: @@ -81,50 +81,50 @@ void SCSI_CMD_TIMER_SaveConfig(void) * void * * Global variables: -* SCSI_CMD_TIMER_backup: Variables of this global structure are used to +* Debug_Timer_backup: Variables of this global structure are used to * restore the values of non retention registers on wakeup from sleep mode. * *******************************************************************************/ -void SCSI_CMD_TIMER_RestoreConfig(void) +void Debug_Timer_RestoreConfig(void) { - #if (!SCSI_CMD_TIMER_UsingFixedFunction) + #if (!Debug_Timer_UsingFixedFunction) /* Restore the UDB non-rentention registers for CY_UDB_V0 */ #if (CY_UDB_V0) /* Interrupt State Backup for Critical Region*/ - uint8 SCSI_CMD_TIMER_interruptState; + uint8 Debug_Timer_interruptState; - SCSI_CMD_TIMER_WriteCounter(SCSI_CMD_TIMER_backup.TimerUdb); - SCSI_CMD_TIMER_WritePeriod(SCSI_CMD_TIMER_backup.TimerPeriod); + Debug_Timer_WriteCounter(Debug_Timer_backup.TimerUdb); + Debug_Timer_WritePeriod(Debug_Timer_backup.TimerPeriod); /* CyEnterCriticalRegion and CyExitCriticalRegion are used to mark following region critical*/ /* Enter Critical Region*/ - SCSI_CMD_TIMER_interruptState = CyEnterCriticalSection(); + Debug_Timer_interruptState = CyEnterCriticalSection(); /* Use the interrupt output of the status register for IRQ output */ - SCSI_CMD_TIMER_STATUS_AUX_CTRL |= SCSI_CMD_TIMER_STATUS_ACTL_INT_EN_MASK; + Debug_Timer_STATUS_AUX_CTRL |= Debug_Timer_STATUS_ACTL_INT_EN_MASK; /* Exit Critical Region*/ - CyExitCriticalSection(SCSI_CMD_TIMER_interruptState); - SCSI_CMD_TIMER_STATUS_MASK =SCSI_CMD_TIMER_backup.InterruptMaskValue; - #if (SCSI_CMD_TIMER_UsingHWCaptureCounter) - SCSI_CMD_TIMER_SetCaptureCount(SCSI_CMD_TIMER_backup.TimerCaptureCounter); + CyExitCriticalSection(Debug_Timer_interruptState); + Debug_Timer_STATUS_MASK =Debug_Timer_backup.InterruptMaskValue; + #if (Debug_Timer_UsingHWCaptureCounter) + Debug_Timer_SetCaptureCount(Debug_Timer_backup.TimerCaptureCounter); #endif /* Restore the UDB non-rentention register capture counter for CY_UDB_V0 */ #endif /* Restore the UDB non-rentention registers for CY_UDB_V0 */ #if (CY_UDB_V1) - SCSI_CMD_TIMER_WriteCounter(SCSI_CMD_TIMER_backup.TimerUdb); - SCSI_CMD_TIMER_STATUS_MASK =SCSI_CMD_TIMER_backup.InterruptMaskValue; - #if (SCSI_CMD_TIMER_UsingHWCaptureCounter) - SCSI_CMD_TIMER_SetCaptureCount(SCSI_CMD_TIMER_backup.TimerCaptureCounter); + Debug_Timer_WriteCounter(Debug_Timer_backup.TimerUdb); + Debug_Timer_STATUS_MASK =Debug_Timer_backup.InterruptMaskValue; + #if (Debug_Timer_UsingHWCaptureCounter) + Debug_Timer_SetCaptureCount(Debug_Timer_backup.TimerCaptureCounter); #endif /* Restore Capture counter register*/ #endif /* Restore up non retention registers, interrupt mask and capture counter for CY_UDB_V1 */ - #if(!SCSI_CMD_TIMER_ControlRegRemoved) - SCSI_CMD_TIMER_WriteControlRegister(SCSI_CMD_TIMER_backup.TimerControlRegister); + #if(!Debug_Timer_ControlRegRemoved) + Debug_Timer_WriteControlRegister(Debug_Timer_backup.TimerControlRegister); #endif /* Restore the enable state of the Timer component */ #endif /* Restore non retention registers in the UDB implementation only */ } /******************************************************************************* -* Function Name: SCSI_CMD_TIMER_Sleep +* Function Name: Debug_Timer_Sleep ******************************************************************************** * * Summary: @@ -137,32 +137,32 @@ void SCSI_CMD_TIMER_RestoreConfig(void) * void * * Global variables: -* SCSI_CMD_TIMER_backup.TimerEnableState: Is modified depending on the +* Debug_Timer_backup.TimerEnableState: Is modified depending on the * enable state of the block before entering sleep mode. * *******************************************************************************/ -void SCSI_CMD_TIMER_Sleep(void) +void Debug_Timer_Sleep(void) { - #if(!SCSI_CMD_TIMER_ControlRegRemoved) + #if(!Debug_Timer_ControlRegRemoved) /* Save Counter's enable state */ - if(SCSI_CMD_TIMER_CTRL_ENABLE == (SCSI_CMD_TIMER_CONTROL & SCSI_CMD_TIMER_CTRL_ENABLE)) + if(Debug_Timer_CTRL_ENABLE == (Debug_Timer_CONTROL & Debug_Timer_CTRL_ENABLE)) { /* Timer is enabled */ - SCSI_CMD_TIMER_backup.TimerEnableState = 1u; + Debug_Timer_backup.TimerEnableState = 1u; } else { /* Timer is disabled */ - SCSI_CMD_TIMER_backup.TimerEnableState = 0u; + Debug_Timer_backup.TimerEnableState = 0u; } #endif /* Back up enable state from the Timer control register */ - SCSI_CMD_TIMER_Stop(); - SCSI_CMD_TIMER_SaveConfig(); + Debug_Timer_Stop(); + Debug_Timer_SaveConfig(); } /******************************************************************************* -* Function Name: SCSI_CMD_TIMER_Wakeup +* Function Name: Debug_Timer_Wakeup ******************************************************************************** * * Summary: @@ -175,17 +175,17 @@ void SCSI_CMD_TIMER_Sleep(void) * void * * Global variables: -* SCSI_CMD_TIMER_backup.enableState: Is used to restore the enable state of +* Debug_Timer_backup.enableState: Is used to restore the enable state of * block on wakeup from sleep mode. * *******************************************************************************/ -void SCSI_CMD_TIMER_Wakeup(void) +void Debug_Timer_Wakeup(void) { - SCSI_CMD_TIMER_RestoreConfig(); - #if(!SCSI_CMD_TIMER_ControlRegRemoved) - if(SCSI_CMD_TIMER_backup.TimerEnableState == 1u) + Debug_Timer_RestoreConfig(); + #if(!Debug_Timer_ControlRegRemoved) + if(Debug_Timer_backup.TimerEnableState == 1u) { /* Enable Timer's operation */ - SCSI_CMD_TIMER_Enable(); + Debug_Timer_Enable(); } /* Do nothing if Timer was disabled before */ #endif /* Remove this code section if Control register is removed */ } diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/LED1_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_ISR.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_ISR.h deleted file mode 100644 index 151381f7..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_ISR.h +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_ATN_ISR.h -* Version 1.70 -* -* Description: -* Provides the function definitions for the Interrupt Controller. -* -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ -#if !defined(CY_ISR_SCSI_ATN_ISR_H) -#define CY_ISR_SCSI_ATN_ISR_H - - -#include -#include - -/* Interrupt Controller API. */ -void SCSI_ATN_ISR_Start(void); -void SCSI_ATN_ISR_StartEx(cyisraddress address); -void SCSI_ATN_ISR_Stop(void); - -CY_ISR_PROTO(SCSI_ATN_ISR_Interrupt); - -void SCSI_ATN_ISR_SetVector(cyisraddress address); -cyisraddress SCSI_ATN_ISR_GetVector(void); - -void SCSI_ATN_ISR_SetPriority(uint8 priority); -uint8 SCSI_ATN_ISR_GetPriority(void); - -void SCSI_ATN_ISR_Enable(void); -uint8 SCSI_ATN_ISR_GetState(void); -void SCSI_ATN_ISR_Disable(void); - -void SCSI_ATN_ISR_SetPending(void); -void SCSI_ATN_ISR_ClearPending(void); - - -/* Interrupt Controller Constants */ - -/* Address of the INTC.VECT[x] register that contains the Address of the SCSI_ATN_ISR ISR. */ -#define SCSI_ATN_ISR_INTC_VECTOR ((reg32 *) SCSI_ATN_ISR__INTC_VECT) - -/* Address of the SCSI_ATN_ISR ISR priority. */ -#define SCSI_ATN_ISR_INTC_PRIOR ((reg8 *) SCSI_ATN_ISR__INTC_PRIOR_REG) - -/* Priority of the SCSI_ATN_ISR interrupt. */ -#define SCSI_ATN_ISR_INTC_PRIOR_NUMBER SCSI_ATN_ISR__INTC_PRIOR_NUM - -/* Address of the INTC.SET_EN[x] byte to bit enable SCSI_ATN_ISR interrupt. */ -#define SCSI_ATN_ISR_INTC_SET_EN ((reg32 *) SCSI_ATN_ISR__INTC_SET_EN_REG) - -/* Address of the INTC.CLR_EN[x] register to bit clear the SCSI_ATN_ISR interrupt. */ -#define SCSI_ATN_ISR_INTC_CLR_EN ((reg32 *) SCSI_ATN_ISR__INTC_CLR_EN_REG) - -/* Address of the INTC.SET_PD[x] register to set the SCSI_ATN_ISR interrupt state to pending. */ -#define SCSI_ATN_ISR_INTC_SET_PD ((reg32 *) SCSI_ATN_ISR__INTC_SET_PD_REG) - -/* Address of the INTC.CLR_PD[x] register to clear the SCSI_ATN_ISR interrupt. */ -#define SCSI_ATN_ISR_INTC_CLR_PD ((reg32 *) SCSI_ATN_ISR__INTC_CLR_PD_REG) - - -#endif /* CY_ISR_SCSI_ATN_ISR_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_ATN_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.c deleted file mode 100755 index 10937268..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.c +++ /dev/null @@ -1,356 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_CMD_TIMER_ISR.c -* Version 1.70 -* -* Description: -* API for controlling the state of an interrupt. -* -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - - -#include -#include -#include - -#if !defined(SCSI_CMD_TIMER_ISR__REMOVED) /* Check for removal by optimization */ - -/******************************************************************************* -* Place your includes, defines and code here -********************************************************************************/ -/* `#START SCSI_CMD_TIMER_ISR_intc` */ - -/* `#END` */ - -#ifndef CYINT_IRQ_BASE -#define CYINT_IRQ_BASE 16 -#endif /* CYINT_IRQ_BASE */ -#ifndef CYINT_VECT_TABLE -#define CYINT_VECT_TABLE ((cyisraddress **) CYREG_NVIC_VECT_OFFSET) -#endif /* CYINT_VECT_TABLE */ - -/* Declared in startup, used to set unused interrupts to. */ -CY_ISR_PROTO(IntDefaultHandler); - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_Start -******************************************************************************** -* -* Summary: -* Set up the interrupt and enable it. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_Start(void) -{ - /* For all we know the interrupt is active. */ - SCSI_CMD_TIMER_ISR_Disable(); - - /* Set the ISR to point to the SCSI_CMD_TIMER_ISR Interrupt. */ - SCSI_CMD_TIMER_ISR_SetVector(&SCSI_CMD_TIMER_ISR_Interrupt); - - /* Set the priority. */ - SCSI_CMD_TIMER_ISR_SetPriority((uint8)SCSI_CMD_TIMER_ISR_INTC_PRIOR_NUMBER); - - /* Enable it. */ - SCSI_CMD_TIMER_ISR_Enable(); -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_StartEx -******************************************************************************** -* -* Summary: -* Set up the interrupt and enable it. -* -* Parameters: -* address: Address of the ISR to set in the interrupt vector table. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_StartEx(cyisraddress address) -{ - /* For all we know the interrupt is active. */ - SCSI_CMD_TIMER_ISR_Disable(); - - /* Set the ISR to point to the SCSI_CMD_TIMER_ISR Interrupt. */ - SCSI_CMD_TIMER_ISR_SetVector(address); - - /* Set the priority. */ - SCSI_CMD_TIMER_ISR_SetPriority((uint8)SCSI_CMD_TIMER_ISR_INTC_PRIOR_NUMBER); - - /* Enable it. */ - SCSI_CMD_TIMER_ISR_Enable(); -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_Stop -******************************************************************************** -* -* Summary: -* Disables and removes the interrupt. -* -* Parameters: -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_Stop(void) -{ - /* Disable this interrupt. */ - SCSI_CMD_TIMER_ISR_Disable(); - - /* Set the ISR to point to the passive one. */ - SCSI_CMD_TIMER_ISR_SetVector(&IntDefaultHandler); -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_Interrupt -******************************************************************************** -* -* Summary: -* The default Interrupt Service Routine for SCSI_CMD_TIMER_ISR. -* -* Add custom code between the coments to keep the next version of this file -* from over writting your code. -* -* Parameters: -* -* Return: -* None -* -*******************************************************************************/ -CY_ISR(SCSI_CMD_TIMER_ISR_Interrupt) -{ - /* Place your Interrupt code here. */ - /* `#START SCSI_CMD_TIMER_ISR_Interrupt` */ - - /* `#END` */ -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_SetVector -******************************************************************************** -* -* Summary: -* Change the ISR vector for the Interrupt. Note calling SCSI_CMD_TIMER_ISR_Start -* will override any effect this method would have had. To set the vector -* before the component has been started use SCSI_CMD_TIMER_ISR_StartEx instead. -* -* Parameters: -* address: Address of the ISR to set in the interrupt vector table. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_SetVector(cyisraddress address) -{ - cyisraddress * ramVectorTable; - - ramVectorTable = (cyisraddress *) *CYINT_VECT_TABLE; - - ramVectorTable[CYINT_IRQ_BASE + (uint32)SCSI_CMD_TIMER_ISR__INTC_NUMBER] = address; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_GetVector -******************************************************************************** -* -* Summary: -* Gets the "address" of the current ISR vector for the Interrupt. -* -* Parameters: -* None -* -* Return: -* Address of the ISR in the interrupt vector table. -* -*******************************************************************************/ -cyisraddress SCSI_CMD_TIMER_ISR_GetVector(void) -{ - cyisraddress * ramVectorTable; - - ramVectorTable = (cyisraddress *) *CYINT_VECT_TABLE; - - return ramVectorTable[CYINT_IRQ_BASE + (uint32)SCSI_CMD_TIMER_ISR__INTC_NUMBER]; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_SetPriority -******************************************************************************** -* -* Summary: -* Sets the Priority of the Interrupt. Note calling SCSI_CMD_TIMER_ISR_Start -* or SCSI_CMD_TIMER_ISR_StartEx will override any effect this method -* would have had. This method should only be called after -* SCSI_CMD_TIMER_ISR_Start or SCSI_CMD_TIMER_ISR_StartEx has been called. To set -* the initial priority for the component use the cydwr file in the tool. -* -* Parameters: -* priority: Priority of the interrupt. 0 - 7, 0 being the highest. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_SetPriority(uint8 priority) -{ - *SCSI_CMD_TIMER_ISR_INTC_PRIOR = priority << 5; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_GetPriority -******************************************************************************** -* -* Summary: -* Gets the Priority of the Interrupt. -* -* Parameters: -* None -* -* Return: -* Priority of the interrupt. 0 - 7, 0 being the highest. -* -*******************************************************************************/ -uint8 SCSI_CMD_TIMER_ISR_GetPriority(void) -{ - uint8 priority; - - - priority = *SCSI_CMD_TIMER_ISR_INTC_PRIOR >> 5; - - return priority; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_Enable -******************************************************************************** -* -* Summary: -* Enables the interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_Enable(void) -{ - /* Enable the general interrupt. */ - *SCSI_CMD_TIMER_ISR_INTC_SET_EN = SCSI_CMD_TIMER_ISR__INTC_MASK; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_GetState -******************************************************************************** -* -* Summary: -* Gets the state (enabled, disabled) of the Interrupt. -* -* Parameters: -* None -* -* Return: -* 1 if enabled, 0 if disabled. -* -*******************************************************************************/ -uint8 SCSI_CMD_TIMER_ISR_GetState(void) -{ - /* Get the state of the general interrupt. */ - return ((*SCSI_CMD_TIMER_ISR_INTC_SET_EN & (uint32)SCSI_CMD_TIMER_ISR__INTC_MASK) != 0u) ? 1u:0u; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_Disable -******************************************************************************** -* -* Summary: -* Disables the Interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_Disable(void) -{ - /* Disable the general interrupt. */ - *SCSI_CMD_TIMER_ISR_INTC_CLR_EN = SCSI_CMD_TIMER_ISR__INTC_MASK; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_SetPending -******************************************************************************** -* -* Summary: -* Causes the Interrupt to enter the pending state, a software method of -* generating the interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_SetPending(void) -{ - *SCSI_CMD_TIMER_ISR_INTC_SET_PD = SCSI_CMD_TIMER_ISR__INTC_MASK; -} - - -/******************************************************************************* -* Function Name: SCSI_CMD_TIMER_ISR_ClearPending -******************************************************************************** -* -* Summary: -* Clears a pending interrupt. -* -* Parameters: -* None -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_CMD_TIMER_ISR_ClearPending(void) -{ - *SCSI_CMD_TIMER_ISR_INTC_CLR_PD = SCSI_CMD_TIMER_ISR__INTC_MASK; -} - -#endif /* End check for removal by optimization */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.h deleted file mode 100755 index 0454ab43..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_CMD_TIMER_ISR.h +++ /dev/null @@ -1,70 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_CMD_TIMER_ISR.h -* Version 1.70 -* -* Description: -* Provides the function definitions for the Interrupt Controller. -* -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ -#if !defined(CY_ISR_SCSI_CMD_TIMER_ISR_H) -#define CY_ISR_SCSI_CMD_TIMER_ISR_H - - -#include -#include - -/* Interrupt Controller API. */ -void SCSI_CMD_TIMER_ISR_Start(void); -void SCSI_CMD_TIMER_ISR_StartEx(cyisraddress address); -void SCSI_CMD_TIMER_ISR_Stop(void); - -CY_ISR_PROTO(SCSI_CMD_TIMER_ISR_Interrupt); - -void SCSI_CMD_TIMER_ISR_SetVector(cyisraddress address); -cyisraddress SCSI_CMD_TIMER_ISR_GetVector(void); - -void SCSI_CMD_TIMER_ISR_SetPriority(uint8 priority); -uint8 SCSI_CMD_TIMER_ISR_GetPriority(void); - -void SCSI_CMD_TIMER_ISR_Enable(void); -uint8 SCSI_CMD_TIMER_ISR_GetState(void); -void SCSI_CMD_TIMER_ISR_Disable(void); - -void SCSI_CMD_TIMER_ISR_SetPending(void); -void SCSI_CMD_TIMER_ISR_ClearPending(void); - - -/* Interrupt Controller Constants */ - -/* Address of the INTC.VECT[x] register that contains the Address of the SCSI_CMD_TIMER_ISR ISR. */ -#define SCSI_CMD_TIMER_ISR_INTC_VECTOR ((reg32 *) SCSI_CMD_TIMER_ISR__INTC_VECT) - -/* Address of the SCSI_CMD_TIMER_ISR ISR priority. */ -#define SCSI_CMD_TIMER_ISR_INTC_PRIOR ((reg8 *) SCSI_CMD_TIMER_ISR__INTC_PRIOR_REG) - -/* Priority of the SCSI_CMD_TIMER_ISR interrupt. */ -#define SCSI_CMD_TIMER_ISR_INTC_PRIOR_NUMBER SCSI_CMD_TIMER_ISR__INTC_PRIOR_NUM - -/* Address of the INTC.SET_EN[x] byte to bit enable SCSI_CMD_TIMER_ISR interrupt. */ -#define SCSI_CMD_TIMER_ISR_INTC_SET_EN ((reg32 *) SCSI_CMD_TIMER_ISR__INTC_SET_EN_REG) - -/* Address of the INTC.CLR_EN[x] register to bit clear the SCSI_CMD_TIMER_ISR interrupt. */ -#define SCSI_CMD_TIMER_ISR_INTC_CLR_EN ((reg32 *) SCSI_CMD_TIMER_ISR__INTC_CLR_EN_REG) - -/* Address of the INTC.SET_PD[x] register to set the SCSI_CMD_TIMER_ISR interrupt state to pending. */ -#define SCSI_CMD_TIMER_ISR_INTC_SET_PD ((reg32 *) SCSI_CMD_TIMER_ISR__INTC_SET_PD_REG) - -/* Address of the INTC.CLR_PD[x] register to clear the SCSI_CMD_TIMER_ISR interrupt. */ -#define SCSI_CMD_TIMER_ISR_INTC_CLR_PD ((reg32 *) SCSI_CMD_TIMER_ISR__INTC_CLR_PD_REG) - - -#endif /* CY_ISR_SCSI_CMD_TIMER_ISR_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.c deleted file mode 100644 index 5d146079..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.c +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_In_DBx.c -* Version 1.90 -* -* Description: -* This file contains API to enable firmware control of a Pins component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "cytypes.h" -#include "SCSI_In_DBx.h" - -/* APIs are not generated for P15[7:6] on PSoC 5 */ -#if !(CY_PSOC5A &&\ - SCSI_In_DBx__PORT == 15 && ((SCSI_In_DBx__MASK & 0xC0) != 0)) - - -/******************************************************************************* -* Function Name: SCSI_In_DBx_Write -******************************************************************************** -* -* Summary: -* Assign a new value to the digital port's data output register. -* -* Parameters: -* prtValue: The value to be assigned to the Digital Port. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_In_DBx_Write(uint8 value) -{ - uint8 staticBits = (SCSI_In_DBx_DR & (uint8)(~SCSI_In_DBx_MASK)); - SCSI_In_DBx_DR = staticBits | ((uint8)(value << SCSI_In_DBx_SHIFT) & SCSI_In_DBx_MASK); -} - - -/******************************************************************************* -* Function Name: SCSI_In_DBx_SetDriveMode -******************************************************************************** -* -* Summary: -* Change the drive mode on the pins of the port. -* -* Parameters: -* mode: Change the pins to this drive mode. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_In_DBx_SetDriveMode(uint8 mode) -{ - CyPins_SetPinDriveMode(SCSI_In_DBx_0, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_1, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_2, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_3, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_4, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_5, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_6, mode); - CyPins_SetPinDriveMode(SCSI_In_DBx_7, mode); -} - - -/******************************************************************************* -* Function Name: SCSI_In_DBx_Read -******************************************************************************** -* -* Summary: -* Read the current value on the pins of the Digital Port in right justified -* form. -* -* Parameters: -* None -* -* Return: -* Returns the current value of the Digital Port as a right justified number -* -* Note: -* Macro SCSI_In_DBx_ReadPS calls this function. -* -*******************************************************************************/ -uint8 SCSI_In_DBx_Read(void) -{ - return (SCSI_In_DBx_PS & SCSI_In_DBx_MASK) >> SCSI_In_DBx_SHIFT; -} - - -/******************************************************************************* -* Function Name: SCSI_In_DBx_ReadDataReg -******************************************************************************** -* -* Summary: -* Read the current value assigned to a Digital Port's data output register -* -* Parameters: -* None -* -* Return: -* Returns the current value assigned to the Digital Port's data output register -* -*******************************************************************************/ -uint8 SCSI_In_DBx_ReadDataReg(void) -{ - return (SCSI_In_DBx_DR & SCSI_In_DBx_MASK) >> SCSI_In_DBx_SHIFT; -} - - -/* If Interrupts Are Enabled for this Pins component */ -#if defined(SCSI_In_DBx_INTSTAT) - - /******************************************************************************* - * Function Name: SCSI_In_DBx_ClearInterrupt - ******************************************************************************** - * Summary: - * Clears any active interrupts attached to port and returns the value of the - * interrupt status register. - * - * Parameters: - * None - * - * Return: - * Returns the value of the interrupt status register - * - *******************************************************************************/ - uint8 SCSI_In_DBx_ClearInterrupt(void) - { - return (SCSI_In_DBx_INTSTAT & SCSI_In_DBx_MASK) >> SCSI_In_DBx_SHIFT; - } - -#endif /* If Interrupts Are Enabled for this Pins component */ - -#endif /* CY_PSOC5A... */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.h deleted file mode 100644 index 23ee2847..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_In_DBx.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_SCSI_In_DBx_H) /* Pins SCSI_In_DBx_H */ -#define CY_PINS_SCSI_In_DBx_H - -#include "cytypes.h" -#include "cyfitter.h" -#include "cypins.h" -#include "SCSI_In_DBx_aliases.h" - -/* Check to see if required defines such as CY_PSOC5A are available */ -/* They are defined starting with cy_boot v3.0 */ -#if !defined (CY_PSOC5A) - #error Component cy_pins_v1_90 requires cy_boot v3.0 or later -#endif /* (CY_PSOC5A) */ - -/* APIs are not generated for P15[7:6] */ -#if !(CY_PSOC5A &&\ - SCSI_In_DBx__PORT == 15 && ((SCSI_In_DBx__MASK & 0xC0) != 0)) - - -/*************************************** -* Function Prototypes -***************************************/ - -void SCSI_In_DBx_Write(uint8 value) ; -void SCSI_In_DBx_SetDriveMode(uint8 mode) ; -uint8 SCSI_In_DBx_ReadDataReg(void) ; -uint8 SCSI_In_DBx_Read(void) ; -uint8 SCSI_In_DBx_ClearInterrupt(void) ; - - -/*************************************** -* API Constants -***************************************/ - -/* Drive Modes */ -#define SCSI_In_DBx_DM_ALG_HIZ PIN_DM_ALG_HIZ -#define SCSI_In_DBx_DM_DIG_HIZ PIN_DM_DIG_HIZ -#define SCSI_In_DBx_DM_RES_UP PIN_DM_RES_UP -#define SCSI_In_DBx_DM_RES_DWN PIN_DM_RES_DWN -#define SCSI_In_DBx_DM_OD_LO PIN_DM_OD_LO -#define SCSI_In_DBx_DM_OD_HI PIN_DM_OD_HI -#define SCSI_In_DBx_DM_STRONG PIN_DM_STRONG -#define SCSI_In_DBx_DM_RES_UPDWN PIN_DM_RES_UPDWN - -/* Digital Port Constants */ -#define SCSI_In_DBx_MASK SCSI_In_DBx__MASK -#define SCSI_In_DBx_SHIFT SCSI_In_DBx__SHIFT -#define SCSI_In_DBx_WIDTH 8u - - -/*************************************** -* Registers -***************************************/ - -/* Main Port Registers */ -/* Pin State */ -#define SCSI_In_DBx_PS (* (reg8 *) SCSI_In_DBx__PS) -/* Data Register */ -#define SCSI_In_DBx_DR (* (reg8 *) SCSI_In_DBx__DR) -/* Port Number */ -#define SCSI_In_DBx_PRT_NUM (* (reg8 *) SCSI_In_DBx__PRT) -/* Connect to Analog Globals */ -#define SCSI_In_DBx_AG (* (reg8 *) SCSI_In_DBx__AG) -/* Analog MUX bux enable */ -#define SCSI_In_DBx_AMUX (* (reg8 *) SCSI_In_DBx__AMUX) -/* Bidirectional Enable */ -#define SCSI_In_DBx_BIE (* (reg8 *) SCSI_In_DBx__BIE) -/* Bit-mask for Aliased Register Access */ -#define SCSI_In_DBx_BIT_MASK (* (reg8 *) SCSI_In_DBx__BIT_MASK) -/* Bypass Enable */ -#define SCSI_In_DBx_BYP (* (reg8 *) SCSI_In_DBx__BYP) -/* Port wide control signals */ -#define SCSI_In_DBx_CTL (* (reg8 *) SCSI_In_DBx__CTL) -/* Drive Modes */ -#define SCSI_In_DBx_DM0 (* (reg8 *) SCSI_In_DBx__DM0) -#define SCSI_In_DBx_DM1 (* (reg8 *) SCSI_In_DBx__DM1) -#define SCSI_In_DBx_DM2 (* (reg8 *) SCSI_In_DBx__DM2) -/* Input Buffer Disable Override */ -#define SCSI_In_DBx_INP_DIS (* (reg8 *) SCSI_In_DBx__INP_DIS) -/* LCD Common or Segment Drive */ -#define SCSI_In_DBx_LCD_COM_SEG (* (reg8 *) SCSI_In_DBx__LCD_COM_SEG) -/* Enable Segment LCD */ -#define SCSI_In_DBx_LCD_EN (* (reg8 *) SCSI_In_DBx__LCD_EN) -/* Slew Rate Control */ -#define SCSI_In_DBx_SLW (* (reg8 *) SCSI_In_DBx__SLW) - -/* DSI Port Registers */ -/* Global DSI Select Register */ -#define SCSI_In_DBx_PRTDSI__CAPS_SEL (* (reg8 *) SCSI_In_DBx__PRTDSI__CAPS_SEL) -/* Double Sync Enable */ -#define SCSI_In_DBx_PRTDSI__DBL_SYNC_IN (* (reg8 *) SCSI_In_DBx__PRTDSI__DBL_SYNC_IN) -/* Output Enable Select Drive Strength */ -#define SCSI_In_DBx_PRTDSI__OE_SEL0 (* (reg8 *) SCSI_In_DBx__PRTDSI__OE_SEL0) -#define SCSI_In_DBx_PRTDSI__OE_SEL1 (* (reg8 *) SCSI_In_DBx__PRTDSI__OE_SEL1) -/* Port Pin Output Select Registers */ -#define SCSI_In_DBx_PRTDSI__OUT_SEL0 (* (reg8 *) SCSI_In_DBx__PRTDSI__OUT_SEL0) -#define SCSI_In_DBx_PRTDSI__OUT_SEL1 (* (reg8 *) SCSI_In_DBx__PRTDSI__OUT_SEL1) -/* Sync Output Enable Registers */ -#define SCSI_In_DBx_PRTDSI__SYNC_OUT (* (reg8 *) SCSI_In_DBx__PRTDSI__SYNC_OUT) - - -#if defined(SCSI_In_DBx__INTSTAT) /* Interrupt Registers */ - - #define SCSI_In_DBx_INTSTAT (* (reg8 *) SCSI_In_DBx__INTSTAT) - #define SCSI_In_DBx_SNAP (* (reg8 *) SCSI_In_DBx__SNAP) - -#endif /* Interrupt Registers */ - -#endif /* CY_PSOC5A... */ - -#endif /* CY_PINS_SCSI_In_DBx_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_DBx_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_In_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.c new file mode 100755 index 00000000..2fa26a4d --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.c @@ -0,0 +1,63 @@ +/******************************************************************************* +* File Name: SCSI_Out_Bits.c +* Version 1.70 +* +* Description: +* This file contains API to enable firmware control of a Control Register. +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "SCSI_Out_Bits.h" + +#if !defined(SCSI_Out_Bits_Sync_ctrl_reg__REMOVED) /* Check for removal by optimization */ + +/******************************************************************************* +* Function Name: SCSI_Out_Bits_Write +******************************************************************************** +* +* Summary: +* Write a byte to the Control Register. +* +* Parameters: +* control: The value to be assigned to the Control Register. +* +* Return: +* None. +* +*******************************************************************************/ +void SCSI_Out_Bits_Write(uint8 control) +{ + SCSI_Out_Bits_Control = control; +} + + +/******************************************************************************* +* Function Name: SCSI_Out_Bits_Read +******************************************************************************** +* +* Summary: +* Reads the current value assigned to the Control Register. +* +* Parameters: +* None. +* +* Return: +* Returns the current value in the Control Register. +* +*******************************************************************************/ +uint8 SCSI_Out_Bits_Read(void) +{ + return SCSI_Out_Bits_Control; +} + +#endif /* End check for removal by optimization */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.h old mode 100644 new mode 100755 similarity index 54% rename from software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp_aliases.h rename to software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.h index bd02d71b..13df446e --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp_aliases.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Bits.h @@ -1,32 +1,42 @@ -/******************************************************************************* -* File Name: USBFS_1_Dp.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_USBFS_1_Dp_ALIASES_H) /* Pins USBFS_1_Dp_ALIASES_H */ -#define CY_PINS_USBFS_1_Dp_ALIASES_H - -#include "cytypes.h" -#include "cyfitter.h" - - - -/*************************************** -* Constants -***************************************/ -#define USBFS_1_Dp_0 USBFS_1_Dp__0__PC - -#endif /* End Pins USBFS_1_Dp_ALIASES_H */ - -/* [] END OF FILE */ +/******************************************************************************* +* File Name: SCSI_Out_Bits.h +* Version 1.70 +* +* Description: +* This file containts Control Register function prototypes and register defines +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CONTROL_REG_SCSI_Out_Bits_H) /* CY_CONTROL_REG_SCSI_Out_Bits_H */ +#define CY_CONTROL_REG_SCSI_Out_Bits_H + +#include "cytypes.h" + + +/*************************************** +* Function Prototypes +***************************************/ + +void SCSI_Out_Bits_Write(uint8 control) ; +uint8 SCSI_Out_Bits_Read(void) ; + + +/*************************************** +* Registers +***************************************/ + +/* Control Register */ +#define SCSI_Out_Bits_Control (* (reg8 *) SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_REG ) +#define SCSI_Out_Bits_Control_PTR ( (reg8 *) SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_REG ) + +#endif /* End CY_CONTROL_REG_SCSI_Out_Bits_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.c new file mode 100755 index 00000000..6191598e --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.c @@ -0,0 +1,63 @@ +/******************************************************************************* +* File Name: SCSI_Out_Ctl.c +* Version 1.70 +* +* Description: +* This file contains API to enable firmware control of a Control Register. +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "SCSI_Out_Ctl.h" + +#if !defined(SCSI_Out_Ctl_Sync_ctrl_reg__REMOVED) /* Check for removal by optimization */ + +/******************************************************************************* +* Function Name: SCSI_Out_Ctl_Write +******************************************************************************** +* +* Summary: +* Write a byte to the Control Register. +* +* Parameters: +* control: The value to be assigned to the Control Register. +* +* Return: +* None. +* +*******************************************************************************/ +void SCSI_Out_Ctl_Write(uint8 control) +{ + SCSI_Out_Ctl_Control = control; +} + + +/******************************************************************************* +* Function Name: SCSI_Out_Ctl_Read +******************************************************************************** +* +* Summary: +* Reads the current value assigned to the Control Register. +* +* Parameters: +* None. +* +* Return: +* Returns the current value in the Control Register. +* +*******************************************************************************/ +uint8 SCSI_Out_Ctl_Read(void) +{ + return SCSI_Out_Ctl_Control; +} + +#endif /* End check for removal by optimization */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.h old mode 100644 new mode 100755 similarity index 55% rename from software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP_aliases.h rename to software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.h index 9a14d371..669ebf5f --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP_aliases.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_Ctl.h @@ -1,32 +1,42 @@ -/******************************************************************************* -* File Name: SD_WP.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_SD_WP_ALIASES_H) /* Pins SD_WP_ALIASES_H */ -#define CY_PINS_SD_WP_ALIASES_H - -#include "cytypes.h" -#include "cyfitter.h" - - - -/*************************************** -* Constants -***************************************/ -#define SD_WP_0 SD_WP__0__PC - -#endif /* End Pins SD_WP_ALIASES_H */ - -/* [] END OF FILE */ +/******************************************************************************* +* File Name: SCSI_Out_Ctl.h +* Version 1.70 +* +* Description: +* This file containts Control Register function prototypes and register defines +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CONTROL_REG_SCSI_Out_Ctl_H) /* CY_CONTROL_REG_SCSI_Out_Ctl_H */ +#define CY_CONTROL_REG_SCSI_Out_Ctl_H + +#include "cytypes.h" + + +/*************************************** +* Function Prototypes +***************************************/ + +void SCSI_Out_Ctl_Write(uint8 control) ; +uint8 SCSI_Out_Ctl_Read(void) ; + + +/*************************************** +* Registers +***************************************/ + +/* Control Register */ +#define SCSI_Out_Ctl_Control (* (reg8 *) SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_REG ) +#define SCSI_Out_Ctl_Control_PTR ( (reg8 *) SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_REG ) + +#endif /* End CY_CONTROL_REG_SCSI_Out_Ctl_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.c deleted file mode 100644 index e673f31e..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.c +++ /dev/null @@ -1,144 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_Out_DBx.c -* Version 1.90 -* -* Description: -* This file contains API to enable firmware control of a Pins component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "cytypes.h" -#include "SCSI_Out_DBx.h" - -/* APIs are not generated for P15[7:6] on PSoC 5 */ -#if !(CY_PSOC5A &&\ - SCSI_Out_DBx__PORT == 15 && ((SCSI_Out_DBx__MASK & 0xC0) != 0)) - - -/******************************************************************************* -* Function Name: SCSI_Out_DBx_Write -******************************************************************************** -* -* Summary: -* Assign a new value to the digital port's data output register. -* -* Parameters: -* prtValue: The value to be assigned to the Digital Port. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_Out_DBx_Write(uint8 value) -{ - uint8 staticBits = (SCSI_Out_DBx_DR & (uint8)(~SCSI_Out_DBx_MASK)); - SCSI_Out_DBx_DR = staticBits | ((uint8)(value << SCSI_Out_DBx_SHIFT) & SCSI_Out_DBx_MASK); -} - - -/******************************************************************************* -* Function Name: SCSI_Out_DBx_SetDriveMode -******************************************************************************** -* -* Summary: -* Change the drive mode on the pins of the port. -* -* Parameters: -* mode: Change the pins to this drive mode. -* -* Return: -* None -* -*******************************************************************************/ -void SCSI_Out_DBx_SetDriveMode(uint8 mode) -{ - CyPins_SetPinDriveMode(SCSI_Out_DBx_0, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_1, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_2, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_3, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_4, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_5, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_6, mode); - CyPins_SetPinDriveMode(SCSI_Out_DBx_7, mode); -} - - -/******************************************************************************* -* Function Name: SCSI_Out_DBx_Read -******************************************************************************** -* -* Summary: -* Read the current value on the pins of the Digital Port in right justified -* form. -* -* Parameters: -* None -* -* Return: -* Returns the current value of the Digital Port as a right justified number -* -* Note: -* Macro SCSI_Out_DBx_ReadPS calls this function. -* -*******************************************************************************/ -uint8 SCSI_Out_DBx_Read(void) -{ - return (SCSI_Out_DBx_PS & SCSI_Out_DBx_MASK) >> SCSI_Out_DBx_SHIFT; -} - - -/******************************************************************************* -* Function Name: SCSI_Out_DBx_ReadDataReg -******************************************************************************** -* -* Summary: -* Read the current value assigned to a Digital Port's data output register -* -* Parameters: -* None -* -* Return: -* Returns the current value assigned to the Digital Port's data output register -* -*******************************************************************************/ -uint8 SCSI_Out_DBx_ReadDataReg(void) -{ - return (SCSI_Out_DBx_DR & SCSI_Out_DBx_MASK) >> SCSI_Out_DBx_SHIFT; -} - - -/* If Interrupts Are Enabled for this Pins component */ -#if defined(SCSI_Out_DBx_INTSTAT) - - /******************************************************************************* - * Function Name: SCSI_Out_DBx_ClearInterrupt - ******************************************************************************** - * Summary: - * Clears any active interrupts attached to port and returns the value of the - * interrupt status register. - * - * Parameters: - * None - * - * Return: - * Returns the value of the interrupt status register - * - *******************************************************************************/ - uint8 SCSI_Out_DBx_ClearInterrupt(void) - { - return (SCSI_Out_DBx_INTSTAT & SCSI_Out_DBx_MASK) >> SCSI_Out_DBx_SHIFT; - } - -#endif /* If Interrupts Are Enabled for this Pins component */ - -#endif /* CY_PSOC5A... */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.h deleted file mode 100644 index 41bd7a9c..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* -* File Name: SCSI_Out_DBx.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_SCSI_Out_DBx_H) /* Pins SCSI_Out_DBx_H */ -#define CY_PINS_SCSI_Out_DBx_H - -#include "cytypes.h" -#include "cyfitter.h" -#include "cypins.h" -#include "SCSI_Out_DBx_aliases.h" - -/* Check to see if required defines such as CY_PSOC5A are available */ -/* They are defined starting with cy_boot v3.0 */ -#if !defined (CY_PSOC5A) - #error Component cy_pins_v1_90 requires cy_boot v3.0 or later -#endif /* (CY_PSOC5A) */ - -/* APIs are not generated for P15[7:6] */ -#if !(CY_PSOC5A &&\ - SCSI_Out_DBx__PORT == 15 && ((SCSI_Out_DBx__MASK & 0xC0) != 0)) - - -/*************************************** -* Function Prototypes -***************************************/ - -void SCSI_Out_DBx_Write(uint8 value) ; -void SCSI_Out_DBx_SetDriveMode(uint8 mode) ; -uint8 SCSI_Out_DBx_ReadDataReg(void) ; -uint8 SCSI_Out_DBx_Read(void) ; -uint8 SCSI_Out_DBx_ClearInterrupt(void) ; - - -/*************************************** -* API Constants -***************************************/ - -/* Drive Modes */ -#define SCSI_Out_DBx_DM_ALG_HIZ PIN_DM_ALG_HIZ -#define SCSI_Out_DBx_DM_DIG_HIZ PIN_DM_DIG_HIZ -#define SCSI_Out_DBx_DM_RES_UP PIN_DM_RES_UP -#define SCSI_Out_DBx_DM_RES_DWN PIN_DM_RES_DWN -#define SCSI_Out_DBx_DM_OD_LO PIN_DM_OD_LO -#define SCSI_Out_DBx_DM_OD_HI PIN_DM_OD_HI -#define SCSI_Out_DBx_DM_STRONG PIN_DM_STRONG -#define SCSI_Out_DBx_DM_RES_UPDWN PIN_DM_RES_UPDWN - -/* Digital Port Constants */ -#define SCSI_Out_DBx_MASK SCSI_Out_DBx__MASK -#define SCSI_Out_DBx_SHIFT SCSI_Out_DBx__SHIFT -#define SCSI_Out_DBx_WIDTH 8u - - -/*************************************** -* Registers -***************************************/ - -/* Main Port Registers */ -/* Pin State */ -#define SCSI_Out_DBx_PS (* (reg8 *) SCSI_Out_DBx__PS) -/* Data Register */ -#define SCSI_Out_DBx_DR (* (reg8 *) SCSI_Out_DBx__DR) -/* Port Number */ -#define SCSI_Out_DBx_PRT_NUM (* (reg8 *) SCSI_Out_DBx__PRT) -/* Connect to Analog Globals */ -#define SCSI_Out_DBx_AG (* (reg8 *) SCSI_Out_DBx__AG) -/* Analog MUX bux enable */ -#define SCSI_Out_DBx_AMUX (* (reg8 *) SCSI_Out_DBx__AMUX) -/* Bidirectional Enable */ -#define SCSI_Out_DBx_BIE (* (reg8 *) SCSI_Out_DBx__BIE) -/* Bit-mask for Aliased Register Access */ -#define SCSI_Out_DBx_BIT_MASK (* (reg8 *) SCSI_Out_DBx__BIT_MASK) -/* Bypass Enable */ -#define SCSI_Out_DBx_BYP (* (reg8 *) SCSI_Out_DBx__BYP) -/* Port wide control signals */ -#define SCSI_Out_DBx_CTL (* (reg8 *) SCSI_Out_DBx__CTL) -/* Drive Modes */ -#define SCSI_Out_DBx_DM0 (* (reg8 *) SCSI_Out_DBx__DM0) -#define SCSI_Out_DBx_DM1 (* (reg8 *) SCSI_Out_DBx__DM1) -#define SCSI_Out_DBx_DM2 (* (reg8 *) SCSI_Out_DBx__DM2) -/* Input Buffer Disable Override */ -#define SCSI_Out_DBx_INP_DIS (* (reg8 *) SCSI_Out_DBx__INP_DIS) -/* LCD Common or Segment Drive */ -#define SCSI_Out_DBx_LCD_COM_SEG (* (reg8 *) SCSI_Out_DBx__LCD_COM_SEG) -/* Enable Segment LCD */ -#define SCSI_Out_DBx_LCD_EN (* (reg8 *) SCSI_Out_DBx__LCD_EN) -/* Slew Rate Control */ -#define SCSI_Out_DBx_SLW (* (reg8 *) SCSI_Out_DBx__SLW) - -/* DSI Port Registers */ -/* Global DSI Select Register */ -#define SCSI_Out_DBx_PRTDSI__CAPS_SEL (* (reg8 *) SCSI_Out_DBx__PRTDSI__CAPS_SEL) -/* Double Sync Enable */ -#define SCSI_Out_DBx_PRTDSI__DBL_SYNC_IN (* (reg8 *) SCSI_Out_DBx__PRTDSI__DBL_SYNC_IN) -/* Output Enable Select Drive Strength */ -#define SCSI_Out_DBx_PRTDSI__OE_SEL0 (* (reg8 *) SCSI_Out_DBx__PRTDSI__OE_SEL0) -#define SCSI_Out_DBx_PRTDSI__OE_SEL1 (* (reg8 *) SCSI_Out_DBx__PRTDSI__OE_SEL1) -/* Port Pin Output Select Registers */ -#define SCSI_Out_DBx_PRTDSI__OUT_SEL0 (* (reg8 *) SCSI_Out_DBx__PRTDSI__OUT_SEL0) -#define SCSI_Out_DBx_PRTDSI__OUT_SEL1 (* (reg8 *) SCSI_Out_DBx__PRTDSI__OUT_SEL1) -/* Sync Output Enable Registers */ -#define SCSI_Out_DBx_PRTDSI__SYNC_OUT (* (reg8 *) SCSI_Out_DBx__PRTDSI__SYNC_OUT) - - -#if defined(SCSI_Out_DBx__INTSTAT) /* Interrupt Registers */ - - #define SCSI_Out_DBx_INTSTAT (* (reg8 *) SCSI_Out_DBx__INTSTAT) - #define SCSI_Out_DBx_SNAP (* (reg8 *) SCSI_Out_DBx__SNAP) - -#endif /* Interrupt Registers */ - -#endif /* CY_PSOC5A... */ - -#endif /* CY_PINS_SCSI_Out_DBx_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_Out_DBx_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_ISR.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_ISR.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_ISR.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_ISR.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SCSI_RST_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_INT.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_INT.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_PM.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_PM.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_PVT.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SDCard_PVT.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CD_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_CS_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Clk_Ctl.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Clk_Ctl.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Clk_Ctl.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Clk_Ctl.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT1_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_DAT2_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Data_Clk.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Data_Clk.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Data_Clk.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Data_Clk.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Init_Clk.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Init_Clk.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Init_Clk.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_Init_Clk.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MISO_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_MOSI_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_SCK_aliases.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.c deleted file mode 100644 index 136473c5..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.c +++ /dev/null @@ -1,137 +0,0 @@ -/******************************************************************************* -* File Name: SD_WP.c -* Version 1.90 -* -* Description: -* This file contains API to enable firmware control of a Pins component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "cytypes.h" -#include "SD_WP.h" - -/* APIs are not generated for P15[7:6] on PSoC 5 */ -#if !(CY_PSOC5A &&\ - SD_WP__PORT == 15 && ((SD_WP__MASK & 0xC0) != 0)) - - -/******************************************************************************* -* Function Name: SD_WP_Write -******************************************************************************** -* -* Summary: -* Assign a new value to the digital port's data output register. -* -* Parameters: -* prtValue: The value to be assigned to the Digital Port. -* -* Return: -* None -* -*******************************************************************************/ -void SD_WP_Write(uint8 value) -{ - uint8 staticBits = (SD_WP_DR & (uint8)(~SD_WP_MASK)); - SD_WP_DR = staticBits | ((uint8)(value << SD_WP_SHIFT) & SD_WP_MASK); -} - - -/******************************************************************************* -* Function Name: SD_WP_SetDriveMode -******************************************************************************** -* -* Summary: -* Change the drive mode on the pins of the port. -* -* Parameters: -* mode: Change the pins to this drive mode. -* -* Return: -* None -* -*******************************************************************************/ -void SD_WP_SetDriveMode(uint8 mode) -{ - CyPins_SetPinDriveMode(SD_WP_0, mode); -} - - -/******************************************************************************* -* Function Name: SD_WP_Read -******************************************************************************** -* -* Summary: -* Read the current value on the pins of the Digital Port in right justified -* form. -* -* Parameters: -* None -* -* Return: -* Returns the current value of the Digital Port as a right justified number -* -* Note: -* Macro SD_WP_ReadPS calls this function. -* -*******************************************************************************/ -uint8 SD_WP_Read(void) -{ - return (SD_WP_PS & SD_WP_MASK) >> SD_WP_SHIFT; -} - - -/******************************************************************************* -* Function Name: SD_WP_ReadDataReg -******************************************************************************** -* -* Summary: -* Read the current value assigned to a Digital Port's data output register -* -* Parameters: -* None -* -* Return: -* Returns the current value assigned to the Digital Port's data output register -* -*******************************************************************************/ -uint8 SD_WP_ReadDataReg(void) -{ - return (SD_WP_DR & SD_WP_MASK) >> SD_WP_SHIFT; -} - - -/* If Interrupts Are Enabled for this Pins component */ -#if defined(SD_WP_INTSTAT) - - /******************************************************************************* - * Function Name: SD_WP_ClearInterrupt - ******************************************************************************** - * Summary: - * Clears any active interrupts attached to port and returns the value of the - * interrupt status register. - * - * Parameters: - * None - * - * Return: - * Returns the value of the interrupt status register - * - *******************************************************************************/ - uint8 SD_WP_ClearInterrupt(void) - { - return (SD_WP_INTSTAT & SD_WP_MASK) >> SD_WP_SHIFT; - } - -#endif /* If Interrupts Are Enabled for this Pins component */ - -#endif /* CY_PSOC5A... */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.h deleted file mode 100644 index 368e2f6c..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/SD_WP.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* -* File Name: SD_WP.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_SD_WP_H) /* Pins SD_WP_H */ -#define CY_PINS_SD_WP_H - -#include "cytypes.h" -#include "cyfitter.h" -#include "cypins.h" -#include "SD_WP_aliases.h" - -/* Check to see if required defines such as CY_PSOC5A are available */ -/* They are defined starting with cy_boot v3.0 */ -#if !defined (CY_PSOC5A) - #error Component cy_pins_v1_90 requires cy_boot v3.0 or later -#endif /* (CY_PSOC5A) */ - -/* APIs are not generated for P15[7:6] */ -#if !(CY_PSOC5A &&\ - SD_WP__PORT == 15 && ((SD_WP__MASK & 0xC0) != 0)) - - -/*************************************** -* Function Prototypes -***************************************/ - -void SD_WP_Write(uint8 value) ; -void SD_WP_SetDriveMode(uint8 mode) ; -uint8 SD_WP_ReadDataReg(void) ; -uint8 SD_WP_Read(void) ; -uint8 SD_WP_ClearInterrupt(void) ; - - -/*************************************** -* API Constants -***************************************/ - -/* Drive Modes */ -#define SD_WP_DM_ALG_HIZ PIN_DM_ALG_HIZ -#define SD_WP_DM_DIG_HIZ PIN_DM_DIG_HIZ -#define SD_WP_DM_RES_UP PIN_DM_RES_UP -#define SD_WP_DM_RES_DWN PIN_DM_RES_DWN -#define SD_WP_DM_OD_LO PIN_DM_OD_LO -#define SD_WP_DM_OD_HI PIN_DM_OD_HI -#define SD_WP_DM_STRONG PIN_DM_STRONG -#define SD_WP_DM_RES_UPDWN PIN_DM_RES_UPDWN - -/* Digital Port Constants */ -#define SD_WP_MASK SD_WP__MASK -#define SD_WP_SHIFT SD_WP__SHIFT -#define SD_WP_WIDTH 1u - - -/*************************************** -* Registers -***************************************/ - -/* Main Port Registers */ -/* Pin State */ -#define SD_WP_PS (* (reg8 *) SD_WP__PS) -/* Data Register */ -#define SD_WP_DR (* (reg8 *) SD_WP__DR) -/* Port Number */ -#define SD_WP_PRT_NUM (* (reg8 *) SD_WP__PRT) -/* Connect to Analog Globals */ -#define SD_WP_AG (* (reg8 *) SD_WP__AG) -/* Analog MUX bux enable */ -#define SD_WP_AMUX (* (reg8 *) SD_WP__AMUX) -/* Bidirectional Enable */ -#define SD_WP_BIE (* (reg8 *) SD_WP__BIE) -/* Bit-mask for Aliased Register Access */ -#define SD_WP_BIT_MASK (* (reg8 *) SD_WP__BIT_MASK) -/* Bypass Enable */ -#define SD_WP_BYP (* (reg8 *) SD_WP__BYP) -/* Port wide control signals */ -#define SD_WP_CTL (* (reg8 *) SD_WP__CTL) -/* Drive Modes */ -#define SD_WP_DM0 (* (reg8 *) SD_WP__DM0) -#define SD_WP_DM1 (* (reg8 *) SD_WP__DM1) -#define SD_WP_DM2 (* (reg8 *) SD_WP__DM2) -/* Input Buffer Disable Override */ -#define SD_WP_INP_DIS (* (reg8 *) SD_WP__INP_DIS) -/* LCD Common or Segment Drive */ -#define SD_WP_LCD_COM_SEG (* (reg8 *) SD_WP__LCD_COM_SEG) -/* Enable Segment LCD */ -#define SD_WP_LCD_EN (* (reg8 *) SD_WP__LCD_EN) -/* Slew Rate Control */ -#define SD_WP_SLW (* (reg8 *) SD_WP__SLW) - -/* DSI Port Registers */ -/* Global DSI Select Register */ -#define SD_WP_PRTDSI__CAPS_SEL (* (reg8 *) SD_WP__PRTDSI__CAPS_SEL) -/* Double Sync Enable */ -#define SD_WP_PRTDSI__DBL_SYNC_IN (* (reg8 *) SD_WP__PRTDSI__DBL_SYNC_IN) -/* Output Enable Select Drive Strength */ -#define SD_WP_PRTDSI__OE_SEL0 (* (reg8 *) SD_WP__PRTDSI__OE_SEL0) -#define SD_WP_PRTDSI__OE_SEL1 (* (reg8 *) SD_WP__PRTDSI__OE_SEL1) -/* Port Pin Output Select Registers */ -#define SD_WP_PRTDSI__OUT_SEL0 (* (reg8 *) SD_WP__PRTDSI__OUT_SEL0) -#define SD_WP_PRTDSI__OUT_SEL1 (* (reg8 *) SD_WP__PRTDSI__OUT_SEL1) -/* Sync Output Enable Registers */ -#define SD_WP_PRTDSI__SYNC_OUT (* (reg8 *) SD_WP__PRTDSI__SYNC_OUT) - - -#if defined(SD_WP__INTSTAT) /* Interrupt Registers */ - - #define SD_WP_INTSTAT (* (reg8 *) SD_WP__INTSTAT) - #define SD_WP_SNAP (* (reg8 *) SD_WP__SNAP) - -#endif /* Interrupt Registers */ - -#endif /* CY_PSOC5A... */ - -#endif /* CY_PINS_SD_WP_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.h index e7fd8992..8858b470 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.h @@ -77,6 +77,11 @@ #define USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF_SIZE (65u) #define USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_NUM_OUT_RPTS (1u) #define USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_COUNT (1u) +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF_SIZE (65u) +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_NUM_IN_RPTS (1u) +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF_SIZE (65u) +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_NUM_OUT_RPTS (1u) +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_COUNT (1u) #define USBFS_ENABLE_HID_CLASS #define USBFS_HID_RPT_1_SIZE_LSB (0x24u) #define USBFS_HID_RPT_1_SIZE_MSB (0x00u) @@ -86,12 +91,12 @@ #define USBFS_EXTERN_VBUS (0u) #define USBFS_EXTERN_VND (0u) #define USBFS_EXTERN_CLS (0u) -#define USBFS_MAX_INTERFACES_NUMBER (1u) +#define USBFS_MAX_INTERFACES_NUMBER (2u) #define USBFS_EP0_ISR_REMOVE (0u) #define USBFS_EP1_ISR_REMOVE (0u) #define USBFS_EP2_ISR_REMOVE (0u) -#define USBFS_EP3_ISR_REMOVE (1u) -#define USBFS_EP4_ISR_REMOVE (1u) +#define USBFS_EP3_ISR_REMOVE (0u) +#define USBFS_EP4_ISR_REMOVE (0u) #define USBFS_EP5_ISR_REMOVE (1u) #define USBFS_EP6_ISR_REMOVE (1u) #define USBFS_EP7_ISR_REMOVE (1u) diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.c deleted file mode 100644 index 61d6b01d..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.c +++ /dev/null @@ -1,1335 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1.c -* Version 2.60 -* -* Description: -* API for USBFS Component. -* -* Note: -* Many of the functions use endpoint number. RAM arrays are sized with 9 -* elements so they are indexed directly by epNumber. The SIE and ARB -* registers are indexed by variations of epNumber - 1. -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include -#include "USBFS_1.h" -#include "USBFS_1_pvt.h" -#include "USBFS_1_hid.h" -#if(USBFS_1_DMA1_REMOVE == 0u) - #include "USBFS_1_ep1_dma.h" -#endif /* End USBFS_1_DMA1_REMOVE */ -#if(USBFS_1_DMA2_REMOVE == 0u) - #include "USBFS_1_ep2_dma.h" -#endif /* End USBFS_1_DMA2_REMOVE */ -#if(USBFS_1_DMA3_REMOVE == 0u) - #include "USBFS_1_ep3_dma.h" -#endif /* End USBFS_1_DMA3_REMOVE */ -#if(USBFS_1_DMA4_REMOVE == 0u) - #include "USBFS_1_ep4_dma.h" -#endif /* End USBFS_1_DMA4_REMOVE */ -#if(USBFS_1_DMA5_REMOVE == 0u) - #include "USBFS_1_ep5_dma.h" -#endif /* End USBFS_1_DMA5_REMOVE */ -#if(USBFS_1_DMA6_REMOVE == 0u) - #include "USBFS_1_ep6_dma.h" -#endif /* End USBFS_1_DMA6_REMOVE */ -#if(USBFS_1_DMA7_REMOVE == 0u) - #include "USBFS_1_ep7_dma.h" -#endif /* End USBFS_1_DMA7_REMOVE */ -#if(USBFS_1_DMA8_REMOVE == 0u) - #include "USBFS_1_ep8_dma.h" -#endif /* End USBFS_1_DMA8_REMOVE */ - - -/*************************************** -* Global data allocation -***************************************/ - -uint8 USBFS_1_initVar = 0u; -#if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - uint8 USBFS_1_DmaChan[USBFS_1_MAX_EP]; - uint8 USBFS_1_DmaTd[USBFS_1_MAX_EP]; -#endif /* End USBFS_1_EP_MM */ - - -/******************************************************************************* -* Function Name: USBFS_1_Start -******************************************************************************** -* -* Summary: -* This function initialize the USB SIE, arbiter and the -* endpoint APIs, including setting the D+ Pullup -* -* Parameters: -* device: Contains the device number of the desired device descriptor. -* The device number can be found in the Device Descriptor Tab of -* "Configure" dialog, under the settings of desired Device Descriptor, -* in the "Device Number" field. -* mode: The operating voltage. This determines whether the voltage regulator -* is enabled for 5V operation or if pass through mode is used for 3.3V -* operation. Symbolic names and their associated values are given in the -* following table. -* USBFS_1_3V_OPERATION - Disable voltage regulator and pass-thru -* Vcc for pull-up -* USBFS_1_5V_OPERATION - Enable voltage regulator and use -* regulator for pull-up -* USBFS_1_DWR_VDDD_OPERATION - Enable or Disable voltage -* regulator depend on Vddd Voltage configuration in DWR. -* -* Return: -* None. -* -* Global variables: -* The USBFS_1_intiVar variable is used to indicate initial -* configuration of this component. The variable is initialized to zero (0u) -* and set to one (1u) the first time USBFS_1_Start() is called. -* This allows for component Re-Start without unnecessary re-initialization -* in all subsequent calls to the USBFS_1_Start() routine. -* If re-initialization of the component is required the variable should be set -* to zero before call of UART_Start() routine, or the user may call -* USBFS_1_Init() and USBFS_1_InitComponent() as done -* in the USBFS_1_Start() routine. -* -* Side Effects: -* This function will reset all communication states to default. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_Start(uint8 device, uint8 mode) -{ - /* If not Initialized then initialize all required hardware and software */ - if(USBFS_1_initVar == 0u) - { - USBFS_1_Init(); - USBFS_1_initVar = 1u; - } - USBFS_1_InitComponent(device, mode); -} - - -/******************************************************************************* -* Function Name: USBFS_1_Init -******************************************************************************** -* -* Summary: -* Initialize component's hardware. Usually called in USBFS_1_Start(). -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_Init(void) -{ - uint8 enableInterrupts; - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - uint16 i; - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - enableInterrupts = CyEnterCriticalSection(); - - /* Enable USB block */ - USBFS_1_PM_ACT_CFG_REG |= USBFS_1_PM_ACT_EN_FSUSB; - /* Enable USB block for Standby Power Mode */ - USBFS_1_PM_STBY_CFG_REG |= USBFS_1_PM_STBY_EN_FSUSB; - - /* Enable core clock */ - USBFS_1_USB_CLK_EN_REG = USBFS_1_USB_CLK_ENABLE; - - USBFS_1_CR1_REG = USBFS_1_CR1_ENABLE_LOCK; - - /* ENABLING USBIO PADS IN USB MODE FROM I/O MODE */ - /* Ensure USB transmit enable is low (USB_USBIO_CR0.ten). - Manual Transmission - Disabled */ - USBFS_1_USBIO_CR0_REG &= ((uint8)(~USBFS_1_USBIO_CR0_TEN)); - CyDelayUs(0u); /*~50ns delay */ - /* Disable the USBIO by asserting PM.USB_CR0.fsusbio_pd_n(Inverted) - * high. This will have been set low by the power manger out of reset. - * Also confirm USBIO pull-up disabled - */ - USBFS_1_PM_USB_CR0_REG &= ((uint8)(~(USBFS_1_PM_USB_CR0_PD_N | - USBFS_1_PM_USB_CR0_PD_PULLUP_N))); - - /* Select iomode to USB mode*/ - USBFS_1_USBIO_CR1_REG &= ((uint8)(~USBFS_1_USBIO_CR1_IOMODE)); - - /* Enable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/ - USBFS_1_PM_USB_CR0_REG |= USBFS_1_PM_USB_CR0_REF_EN; - /* The reference will be available 1 us after the regulator is enabled */ - CyDelayUs(1u); - /* OR 40us after power restored */ - CyDelayUs(40u); - /* Ensure the single ended disable bits are low (PRT15.INP_DIS[7:6])(input receiver enabled). */ - USBFS_1_DM_INP_DIS_REG &= ((uint8)(~USBFS_1_DM_MASK)); - USBFS_1_DP_INP_DIS_REG &= ((uint8)(~USBFS_1_DP_MASK)); - - /* Enable USBIO */ - USBFS_1_PM_USB_CR0_REG |= USBFS_1_PM_USB_CR0_PD_N; - CyDelayUs(2u); - /* Set the USBIO pull-up enable */ - USBFS_1_PM_USB_CR0_REG |= USBFS_1_PM_USB_CR0_PD_PULLUP_N; - - /* Write WAx */ - CY_SET_REG8(USBFS_1_ARB_RW1_WA_PTR, 0u); - CY_SET_REG8(USBFS_1_ARB_RW1_WA_MSB_PTR, 0u); - - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - /* Init transfer descriptor. This will be used to detect the DMA state - initialized or not. */ - for (i = 0u; i < USBFS_1_MAX_EP; i++) - { - USBFS_1_DmaTd[i] = DMA_INVALID_TD; - } - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - CyExitCriticalSection(enableInterrupts); - - - /* Set the bus reset Interrupt. */ - (void) CyIntSetVector(USBFS_1_BUS_RESET_VECT_NUM, &USBFS_1_BUS_RESET_ISR); - CyIntSetPriority(USBFS_1_BUS_RESET_VECT_NUM, USBFS_1_BUS_RESET_PRIOR); - - /* Set the SOF Interrupt. */ - #if(USBFS_1_SOF_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_SOF_VECT_NUM, &USBFS_1_SOF_ISR); - CyIntSetPriority(USBFS_1_SOF_VECT_NUM, USBFS_1_SOF_PRIOR); - #endif /* End USBFS_1_SOF_ISR_REMOVE */ - - /* Set the Control Endpoint Interrupt. */ - (void) CyIntSetVector(USBFS_1_EP_0_VECT_NUM, &USBFS_1_EP_0_ISR); - CyIntSetPriority(USBFS_1_EP_0_VECT_NUM, USBFS_1_EP_0_PRIOR); - - /* Set the Data Endpoint 1 Interrupt. */ - #if(USBFS_1_EP1_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_1_VECT_NUM, &USBFS_1_EP_1_ISR); - CyIntSetPriority(USBFS_1_EP_1_VECT_NUM, USBFS_1_EP_1_PRIOR); - #endif /* End USBFS_1_EP1_ISR_REMOVE */ - - /* Set the Data Endpoint 2 Interrupt. */ - #if(USBFS_1_EP2_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_2_VECT_NUM, &USBFS_1_EP_2_ISR); - CyIntSetPriority(USBFS_1_EP_2_VECT_NUM, USBFS_1_EP_2_PRIOR); - #endif /* End USBFS_1_EP2_ISR_REMOVE */ - - /* Set the Data Endpoint 3 Interrupt. */ - #if(USBFS_1_EP3_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_3_VECT_NUM, &USBFS_1_EP_3_ISR); - CyIntSetPriority(USBFS_1_EP_3_VECT_NUM, USBFS_1_EP_3_PRIOR); - #endif /* End USBFS_1_EP3_ISR_REMOVE */ - - /* Set the Data Endpoint 4 Interrupt. */ - #if(USBFS_1_EP4_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_4_VECT_NUM, &USBFS_1_EP_4_ISR); - CyIntSetPriority(USBFS_1_EP_4_VECT_NUM, USBFS_1_EP_4_PRIOR); - #endif /* End USBFS_1_EP4_ISR_REMOVE */ - - /* Set the Data Endpoint 5 Interrupt. */ - #if(USBFS_1_EP5_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_5_VECT_NUM, &USBFS_1_EP_5_ISR); - CyIntSetPriority(USBFS_1_EP_5_VECT_NUM, USBFS_1_EP_5_PRIOR); - #endif /* End USBFS_1_EP5_ISR_REMOVE */ - - /* Set the Data Endpoint 6 Interrupt. */ - #if(USBFS_1_EP6_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_6_VECT_NUM, &USBFS_1_EP_6_ISR); - CyIntSetPriority(USBFS_1_EP_6_VECT_NUM, USBFS_1_EP_6_PRIOR); - #endif /* End USBFS_1_EP6_ISR_REMOVE */ - - /* Set the Data Endpoint 7 Interrupt. */ - #if(USBFS_1_EP7_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_7_VECT_NUM, &USBFS_1_EP_7_ISR); - CyIntSetPriority(USBFS_1_EP_7_VECT_NUM, USBFS_1_EP_7_PRIOR); - #endif /* End USBFS_1_EP7_ISR_REMOVE */ - - /* Set the Data Endpoint 8 Interrupt. */ - #if(USBFS_1_EP8_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_EP_8_VECT_NUM, &USBFS_1_EP_8_ISR); - CyIntSetPriority(USBFS_1_EP_8_VECT_NUM, USBFS_1_EP_8_PRIOR); - #endif /* End USBFS_1_EP8_ISR_REMOVE */ - - #if((USBFS_1_EP_MM != USBFS_1__EP_MANUAL) && (USBFS_1_ARB_ISR_REMOVE == 0u)) - /* Set the ARB Interrupt. */ - (void) CyIntSetVector(USBFS_1_ARB_VECT_NUM, &USBFS_1_ARB_ISR); - CyIntSetPriority(USBFS_1_ARB_VECT_NUM, USBFS_1_ARB_PRIOR); - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - -} - - -/******************************************************************************* -* Function Name: USBFS_1_InitComponent -******************************************************************************** -* -* Summary: -* Initialize the component, except for the HW which is done one time in -* the Start function. This function pulls up D+. -* -* Parameters: -* device: Contains the device number of the desired device descriptor. -* The device number can be found in the Device Descriptor Tab of -* "Configure" dialog, under the settings of desired Device Descriptor, -* in the "Device Number" field. -* mode: The operating voltage. This determines whether the voltage regulator -* is enabled for 5V operation or if pass through mode is used for 3.3V -* operation. Symbolic names and their associated values are given in the -* following table. -* USBFS_1_3V_OPERATION - Disable voltage regulator and pass-thru -* Vcc for pull-up -* USBFS_1_5V_OPERATION - Enable voltage regulator and use -* regulator for pull-up -* USBFS_1_DWR_VDDD_OPERATION - Enable or Disable voltage -* regulator depend on Vddd Voltage configuration in DWR. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_device: Contains the device number of the desired device -* descriptor. The device number can be found in the Device Descriptor Tab -* of "Configure" dialog, under the settings of desired Device Descriptor, -* in the "Device Number" field. -* USBFS_1_transferState: This variable used by the communication -* functions to handle current transfer state. Initialized to -* TRANS_STATE_IDLE in this API. -* USBFS_1_configuration: Contains current configuration number -* which is set by the Host using SET_CONFIGURATION request. -* Initialized to zero in this API. -* USBFS_1_deviceAddress: Contains current device address. This -* variable is initialized to zero in this API. Host starts to communicate -* to device with address 0 and then set it to whatever value using -* SET_ADDRESS request. -* USBFS_1_deviceStatus: initialized to 0. -* This is two bit variable which contain power status in first bit -* (DEVICE_STATUS_BUS_POWERED or DEVICE_STATUS_SELF_POWERED) and remote -* wakeup status (DEVICE_STATUS_REMOTE_WAKEUP) in second bit. -* USBFS_1_lastPacketSize initialized to 0; -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_InitComponent(uint8 device, uint8 mode) -{ - /* Initialize _hidProtocol variable to comply with - * HID 7.2.6 Set_Protocol Request: - * "When initialized, all devices default to report protocol." - */ - #if defined(USBFS_1_ENABLE_HID_CLASS) - uint8 i; - - for (i = 0u; i < USBFS_1_MAX_INTERFACES_NUMBER; i++) - { - USBFS_1_hidProtocol[i] = USBFS_1_PROTOCOL_REPORT; - } - #endif /* USBFS_1_ENABLE_HID_CLASS */ - - /* Enable Interrupts. */ - CyIntEnable(USBFS_1_BUS_RESET_VECT_NUM); - CyIntEnable(USBFS_1_EP_0_VECT_NUM); - #if(USBFS_1_EP1_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_1_VECT_NUM); - #endif /* End USBFS_1_EP1_ISR_REMOVE */ - #if(USBFS_1_EP2_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_2_VECT_NUM); - #endif /* End USBFS_1_EP2_ISR_REMOVE */ - #if(USBFS_1_EP3_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_3_VECT_NUM); - #endif /* End USBFS_1_EP3_ISR_REMOVE */ - #if(USBFS_1_EP4_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_4_VECT_NUM); - #endif /* End USBFS_1_EP4_ISR_REMOVE */ - #if(USBFS_1_EP5_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_5_VECT_NUM); - #endif /* End USBFS_1_EP5_ISR_REMOVE */ - #if(USBFS_1_EP6_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_6_VECT_NUM); - #endif /* End USBFS_1_EP6_ISR_REMOVE */ - #if(USBFS_1_EP7_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_7_VECT_NUM); - #endif /* End USBFS_1_EP7_ISR_REMOVE */ - #if(USBFS_1_EP8_ISR_REMOVE == 0u) - CyIntEnable(USBFS_1_EP_8_VECT_NUM); - #endif /* End USBFS_1_EP8_ISR_REMOVE */ - #if((USBFS_1_EP_MM != USBFS_1__EP_MANUAL) && (USBFS_1_ARB_ISR_REMOVE == 0u)) - /* usb arb interrupt enable */ - USBFS_1_ARB_INT_EN_REG = USBFS_1_ARB_INT_MASK; - CyIntEnable(USBFS_1_ARB_VECT_NUM); - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - /* Arbiter configuration for DMA transfers */ - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL) - USBFS_1_ARB_CFG_REG = USBFS_1_ARB_CFG_MANUAL_DMA; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL */ - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /*Set cfg cmplt this rises DMA request when the full configuration is done */ - USBFS_1_ARB_CFG_REG = USBFS_1_ARB_CFG_AUTO_DMA | USBFS_1_ARB_CFG_AUTO_MEM; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - USBFS_1_transferState = USBFS_1_TRANS_STATE_IDLE; - - /* USB Locking: Enabled, VRegulator: depend on mode or DWR Voltage configuration*/ - switch(mode) - { - case USBFS_1_3V_OPERATION: - USBFS_1_CR1_REG = USBFS_1_CR1_ENABLE_LOCK; - break; - case USBFS_1_5V_OPERATION: - USBFS_1_CR1_REG = USBFS_1_CR1_ENABLE_LOCK | USBFS_1_CR1_REG_ENABLE; - break; - default: /*USBFS_1_DWR_VDDD_OPERATION */ - #if(USBFS_1_VDDD_MV < USBFS_1_3500MV) - USBFS_1_CR1_REG = USBFS_1_CR1_ENABLE_LOCK; - #else - USBFS_1_CR1_REG = USBFS_1_CR1_ENABLE_LOCK | USBFS_1_CR1_REG_ENABLE; - #endif /* End USBFS_1_VDDD_MV < USBFS_1_3500MV */ - break; - } - - /* Record the descriptor selection */ - USBFS_1_device = device; - - /* Clear all of the component data */ - USBFS_1_configuration = 0u; - USBFS_1_interfaceNumber = 0u; - USBFS_1_configurationChanged = 0u; - USBFS_1_deviceAddress = 0u; - USBFS_1_deviceStatus = 0u; - - USBFS_1_lastPacketSize = 0u; - - /* ACK Setup, Stall IN/OUT */ - CY_SET_REG8(USBFS_1_EP0_CR_PTR, USBFS_1_MODE_STALL_IN_OUT); - - /* Enable the SIE with an address 0 */ - CY_SET_REG8(USBFS_1_CR0_PTR, USBFS_1_CR0_ENABLE); - - /* Workaround for PSOC5LP */ - CyDelayCycles(1u); - - /* Finally, Enable d+ pullup and select iomode to USB mode*/ - CY_SET_REG8(USBFS_1_USBIO_CR1_PTR, USBFS_1_USBIO_CR1_USBPUEN); -} - - -/******************************************************************************* -* Function Name: USBFS_1_ReInitComponent -******************************************************************************** -* -* Summary: -* This function reinitialize the component configuration and is -* intend to be called from the Reset interrupt. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_device: Contains the device number of the desired device -* descriptor. The device number can be found in the Device Descriptor Tab -* of "Configure" dialog, under the settings of desired Device Descriptor, -* in the "Device Number" field. -* USBFS_1_transferState: This variable used by the communication -* functions to handle current transfer state. Initialized to -* TRANS_STATE_IDLE in this API. -* USBFS_1_configuration: Contains current configuration number -* which is set by the Host using SET_CONFIGURATION request. -* Initialized to zero in this API. -* USBFS_1_deviceAddress: Contains current device address. This -* variable is initialized to zero in this API. Host starts to communicate -* to device with address 0 and then set it to whatever value using -* SET_ADDRESS request. -* USBFS_1_deviceStatus: initialized to 0. -* This is two bit variable which contain power status in first bit -* (DEVICE_STATUS_BUS_POWERED or DEVICE_STATUS_SELF_POWERED) and remote -* wakeup status (DEVICE_STATUS_REMOTE_WAKEUP) in second bit. -* USBFS_1_lastPacketSize initialized to 0; -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_ReInitComponent(void) -{ - /* Initialize _hidProtocol variable to comply with HID 7.2.6 Set_Protocol - * Request: "When initialized, all devices default to report protocol." - */ - #if defined(USBFS_1_ENABLE_HID_CLASS) - uint8 i; - - for (i = 0u; i < USBFS_1_MAX_INTERFACES_NUMBER; i++) - { - USBFS_1_hidProtocol[i] = USBFS_1_PROTOCOL_REPORT; - } - #endif /* USBFS_1_ENABLE_HID_CLASS */ - - USBFS_1_transferState = USBFS_1_TRANS_STATE_IDLE; - - /* Clear all of the component data */ - USBFS_1_configuration = 0u; - USBFS_1_interfaceNumber = 0u; - USBFS_1_configurationChanged = 0u; - USBFS_1_deviceAddress = 0u; - USBFS_1_deviceStatus = 0u; - - USBFS_1_lastPacketSize = 0u; - - - /* ACK Setup, Stall IN/OUT */ - CY_SET_REG8(USBFS_1_EP0_CR_PTR, USBFS_1_MODE_STALL_IN_OUT); - - /* Enable the SIE with an address 0 */ - CY_SET_REG8(USBFS_1_CR0_PTR, USBFS_1_CR0_ENABLE); - -} - - -/******************************************************************************* -* Function Name: USBFS_1_Stop -******************************************************************************** -* -* Summary: -* This function shuts down the USB function including to release -* the D+ Pullup and disabling the SIE. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_configuration: Contains current configuration number -* which is set by the Host using SET_CONFIGURATION request. -* Initialized to zero in this API. -* USBFS_1_deviceAddress: Contains current device address. This -* variable is initialized to zero in this API. Host starts to communicate -* to device with address 0 and then set it to whatever value using -* SET_ADDRESS request. -* USBFS_1_deviceStatus: initialized to 0. -* This is two bit variable which contain power status in first bit -* (DEVICE_STATUS_BUS_POWERED or DEVICE_STATUS_SELF_POWERED) and remote -* wakeup status (DEVICE_STATUS_REMOTE_WAKEUP) in second bit. -* USBFS_1_configurationChanged: This variable is set to one after -* SET_CONFIGURATION request and cleared in this function. -* USBFS_1_intiVar variable is set to zero -* -*******************************************************************************/ -void USBFS_1_Stop(void) -{ - - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - USBFS_1_Stop_DMA(USBFS_1_MAX_EP); /* Stop all DMAs */ - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - /* Disable the SIE */ - USBFS_1_CR0_REG &= (uint8)(~USBFS_1_CR0_ENABLE); - /* Disable the d+ pullup */ - USBFS_1_USBIO_CR1_REG &= (uint8)(~USBFS_1_USBIO_CR1_USBPUEN); - /* Disable USB in ACT PM */ - USBFS_1_PM_ACT_CFG_REG &= (uint8)(~USBFS_1_PM_ACT_EN_FSUSB); - /* Disable USB block for Standby Power Mode */ - USBFS_1_PM_STBY_CFG_REG &= (uint8)(~USBFS_1_PM_STBY_EN_FSUSB); - - /* Disable the reset and EP interrupts */ - CyIntDisable(USBFS_1_BUS_RESET_VECT_NUM); - CyIntDisable(USBFS_1_EP_0_VECT_NUM); - #if(USBFS_1_EP1_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_1_VECT_NUM); - #endif /* End USBFS_1_EP1_ISR_REMOVE */ - #if(USBFS_1_EP2_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_2_VECT_NUM); - #endif /* End USBFS_1_EP2_ISR_REMOVE */ - #if(USBFS_1_EP3_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_3_VECT_NUM); - #endif /* End USBFS_1_EP3_ISR_REMOVE */ - #if(USBFS_1_EP4_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_4_VECT_NUM); - #endif /* End USBFS_1_EP4_ISR_REMOVE */ - #if(USBFS_1_EP5_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_5_VECT_NUM); - #endif /* End USBFS_1_EP5_ISR_REMOVE */ - #if(USBFS_1_EP6_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_6_VECT_NUM); - #endif /* End USBFS_1_EP6_ISR_REMOVE */ - #if(USBFS_1_EP7_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_7_VECT_NUM); - #endif /* End USBFS_1_EP7_ISR_REMOVE */ - #if(USBFS_1_EP8_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_EP_8_VECT_NUM); - #endif /* End USBFS_1_EP8_ISR_REMOVE */ - - /* Clear all of the component data */ - USBFS_1_configuration = 0u; - USBFS_1_interfaceNumber = 0u; - USBFS_1_configurationChanged = 0u; - USBFS_1_deviceAddress = 0u; - USBFS_1_deviceStatus = 0u; - USBFS_1_initVar = 0u; - -} - - -/******************************************************************************* -* Function Name: USBFS_1_CheckActivity -******************************************************************************** -* -* Summary: -* Returns the activity status of the bus. Clears the status hardware to -* provide fresh activity status on the next call of this routine. -* -* Parameters: -* None. -* -* Return: -* 1 - If bus activity was detected since the last call to this function -* 0 - If bus activity not was detected since the last call to this function -* -*******************************************************************************/ -uint8 USBFS_1_CheckActivity(void) -{ - uint8 r; - - r = CY_GET_REG8(USBFS_1_CR1_PTR); - CY_SET_REG8(USBFS_1_CR1_PTR, (r & ((uint8)(~USBFS_1_CR1_BUS_ACTIVITY)))); - - return((r & USBFS_1_CR1_BUS_ACTIVITY) >> USBFS_1_CR1_BUS_ACTIVITY_SHIFT); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetConfiguration -******************************************************************************** -* -* Summary: -* Returns the current configuration setting -* -* Parameters: -* None. -* -* Return: -* configuration. -* -*******************************************************************************/ -uint8 USBFS_1_GetConfiguration(void) -{ - return(USBFS_1_configuration); -} - - -/******************************************************************************* -* Function Name: USBFS_1_IsConfigurationChanged -******************************************************************************** -* -* Summary: -* Returns the clear on read configuration state. It is usefull when PC send -* double SET_CONFIGURATION request with same configuration number. -* -* Parameters: -* None. -* -* Return: -* Not zero value when new configuration has been changed, otherwise zero is -* returned. -* -* Global variables: -* USBFS_1_configurationChanged: This variable is set to one after -* SET_CONFIGURATION request and cleared in this function. -* -*******************************************************************************/ -uint8 USBFS_1_IsConfigurationChanged(void) -{ - uint8 res = 0u; - - if(USBFS_1_configurationChanged != 0u) - { - res = USBFS_1_configurationChanged; - USBFS_1_configurationChanged = 0u; - } - - return(res); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetInterfaceSetting -******************************************************************************** -* -* Summary: -* Returns the alternate setting from current interface -* -* Parameters: -* uint8 interfaceNumber, interface number -* -* Return: -* Alternate setting. -* -*******************************************************************************/ -uint8 USBFS_1_GetInterfaceSetting(uint8 interfaceNumber) - -{ - return(USBFS_1_interfaceSetting[interfaceNumber]); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetEPState -******************************************************************************** -* -* Summary: -* Returned the state of the requested endpoint. -* -* Parameters: -* epNumber: Endpoint Number -* -* Return: -* State of the requested endpoint. -* -*******************************************************************************/ -uint8 USBFS_1_GetEPState(uint8 epNumber) -{ - return(USBFS_1_EP[epNumber].apiEpState); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetEPCount -******************************************************************************** -* -* Summary: -* This function supports Data Endpoints only(EP1-EP8). -* Returns the transfer count for the requested endpoint. The value from -* the count registers includes 2 counts for the two byte checksum of the -* packet. This function subtracts the two counts. -* -* Parameters: -* epNumber: Data Endpoint Number. -* Valid values are between 1 and 8. -* -* Return: -* Returns the current byte count from the specified endpoint or 0 for an -* invalid endpoint. -* -*******************************************************************************/ -uint16 USBFS_1_GetEPCount(uint8 epNumber) -{ - uint8 ri; - uint16 result = 0u; - - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP)) - { - ri = ((epNumber - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - - result = (uint8)(CY_GET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT0_IND + ri)) & - USBFS_1_EPX_CNT0_MASK); - result = (result << 8u) | CY_GET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT1_IND + ri)); - result -= USBFS_1_EPX_CNTX_CRC_COUNT; - } - return(result); -} - - -#if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - - - /******************************************************************************* - * Function Name: USBFS_1_InitEP_DMA - ******************************************************************************** - * - * Summary: - * This function allocates and initializes a DMA channel to be used by the - * USBFS_1_LoadInEP() or USBFS_1_ReadOutEP() APIs for data - * transfer. - * - * Parameters: - * epNumber: Contains the data endpoint number. - * Valid values are between 1 and 8. - * *pData: Pointer to a data array that is related to the EP transfers. - * - * Return: - * None. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_InitEP_DMA(uint8 epNumber, const uint8 *pData) - - { - uint16 src; - uint16 dst; - #if (CY_PSOC3) /* PSoC 3 */ - src = HI16(CYDEV_SRAM_BASE); - dst = HI16(CYDEV_PERIPH_BASE); - pData = pData; - #else /* PSoC 5 */ - if((USBFS_1_EP[epNumber].addr & USBFS_1_DIR_IN) != 0u ) - { /* for the IN EP source is the SRAM memory buffer */ - src = HI16(pData); - dst = HI16(CYDEV_PERIPH_BASE); - } - else - { /* for the OUT EP source is the SIE register */ - src = HI16(CYDEV_PERIPH_BASE); - dst = HI16(pData); - } - #endif /* End C51 */ - switch(epNumber) - { - case USBFS_1_EP1: - #if(USBFS_1_DMA1_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep1_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA1_REMOVE */ - break; - case USBFS_1_EP2: - #if(USBFS_1_DMA2_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep2_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA2_REMOVE */ - break; - case USBFS_1_EP3: - #if(USBFS_1_DMA3_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep3_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA3_REMOVE */ - break; - case USBFS_1_EP4: - #if(USBFS_1_DMA4_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep4_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA4_REMOVE */ - break; - case USBFS_1_EP5: - #if(USBFS_1_DMA5_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep5_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA5_REMOVE */ - break; - case USBFS_1_EP6: - #if(USBFS_1_DMA6_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep6_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA6_REMOVE */ - break; - case USBFS_1_EP7: - #if(USBFS_1_DMA7_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep7_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA7_REMOVE */ - break; - case USBFS_1_EP8: - #if(USBFS_1_DMA8_REMOVE == 0u) - USBFS_1_DmaChan[epNumber] = USBFS_1_ep8_DmaInitialize( - USBFS_1_DMA_BYTES_PER_BURST, USBFS_1_DMA_REQUEST_PER_BURST, src, dst); - #endif /* End USBFS_1_DMA8_REMOVE */ - break; - default: - /* Do not support EP0 DMA transfers */ - break; - } - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP)) - { - USBFS_1_DmaTd[epNumber] = CyDmaTdAllocate(); - } - } - - - /******************************************************************************* - * Function Name: USBFS_1_Stop_DMA - ******************************************************************************** - * - * Summary: Stops and free DMA - * - * Parameters: - * epNumber: Contains the data endpoint number or - * USBFS_1_MAX_EP to stop all DMAs - * - * Return: - * None. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_Stop_DMA(uint8 epNumber) - { - uint8 i; - i = (epNumber < USBFS_1_MAX_EP) ? epNumber : USBFS_1_EP1; - do - { - if(USBFS_1_DmaTd[i] != DMA_INVALID_TD) - { - (void) CyDmaChDisable(USBFS_1_DmaChan[i]); - CyDmaTdFree(USBFS_1_DmaTd[i]); - USBFS_1_DmaTd[i] = DMA_INVALID_TD; - } - i++; - }while((i < USBFS_1_MAX_EP) && (epNumber == USBFS_1_MAX_EP)); - } - -#endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - -/******************************************************************************* -* Function Name: USBFS_1_LoadInEP -******************************************************************************** -* -* Summary: -* Loads and enables the specified USB data endpoint for an IN interrupt or bulk -* transfer. -* -* Parameters: -* epNumber: Contains the data endpoint number. -* Valid values are between 1 and 8. -* *pData: A pointer to a data array from which the data for the endpoint space -* is loaded. -* length: The number of bytes to transfer from the array and then send as a -* result of an IN request. Valid values are between 0 and 512. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_LoadInEP(uint8 epNumber, const uint8 pData[], uint16 length) - -{ - uint8 ri; - reg8 *p; - #if(USBFS_1_EP_MM == USBFS_1__EP_MANUAL) - uint16 i; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_MANUAL */ - - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP)) - { - ri = ((epNumber - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - p = (reg8 *)(USBFS_1_ARB_RW1_DR_IND + ri); - - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - /* Limits length to available buffer space, auto MM could send packets up to 1024 bytes */ - if(length > (USBFS_1_EPX_DATA_BUF_MAX - USBFS_1_EP[epNumber].buffOffset)) - { - length = USBFS_1_EPX_DATA_BUF_MAX - USBFS_1_EP[epNumber].buffOffset; - } - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - - /* Set the count and data toggle */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT0_IND + ri), - (length >> 8u) | (USBFS_1_EP[epNumber].epToggle)); - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT1_IND + ri), length & 0xFFu); - - #if(USBFS_1_EP_MM == USBFS_1__EP_MANUAL) - if(pData != NULL) - { - /* Copy the data using the arbiter data register */ - for (i = 0u; i < length; i++) - { - CY_SET_REG8(p, pData[i]); - } - } - USBFS_1_EP[epNumber].apiEpState = USBFS_1_NO_EVENT_PENDING; - /* Write the Mode register */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_EP[epNumber].epMode); - #else - /* Init DMA if it was not initialized */ - if(USBFS_1_DmaTd[epNumber] == DMA_INVALID_TD) - { - USBFS_1_InitEP_DMA(epNumber, pData); - } - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_MANUAL */ - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL) - USBFS_1_EP[epNumber].apiEpState = USBFS_1_NO_EVENT_PENDING; - if((pData != NULL) && (length > 0u)) - { - /* Enable DMA in mode2 for transferring data */ - (void) CyDmaChDisable(USBFS_1_DmaChan[epNumber]); - (void) CyDmaTdSetConfiguration(USBFS_1_DmaTd[epNumber], length, CY_DMA_DISABLE_TD, - TD_TERMIN_EN | TD_INC_SRC_ADR); - (void) CyDmaTdSetAddress(USBFS_1_DmaTd[epNumber], LO16((uint32)pData), LO16((uint32)p)); - /* Enable the DMA */ - (void) CyDmaChSetInitialTd(USBFS_1_DmaChan[epNumber], USBFS_1_DmaTd[epNumber]); - (void) CyDmaChEnable(USBFS_1_DmaChan[epNumber], 1u); - /* Generate DMA request */ - * (reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ri) |= USBFS_1_ARB_EPX_CFG_DMA_REQ; - * (reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ri) &= ((uint8)(~USBFS_1_ARB_EPX_CFG_DMA_REQ)); - /* Mode register will be written in arb ISR after DMA transfer complete */ - } - else - { - /* When zero-length packet - write the Mode register directly */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_EP[epNumber].epMode); - } - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL */ - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - if(pData != NULL) - { - /* Enable DMA in mode3 for transferring data */ - (void) CyDmaChDisable(USBFS_1_DmaChan[epNumber]); - (void) CyDmaTdSetConfiguration(USBFS_1_DmaTd[epNumber], length, - USBFS_1_DmaTd[epNumber], TD_TERMIN_EN | TD_INC_SRC_ADR); - (void) CyDmaTdSetAddress(USBFS_1_DmaTd[epNumber], LO16((uint32)pData), LO16((uint32)p)); - /* Clear Any potential pending DMA requests before starting the DMA channel to transfer data */ - (void) CyDmaClearPendingDrq(USBFS_1_DmaChan[epNumber]); - /* Enable the DMA */ - (void) CyDmaChSetInitialTd(USBFS_1_DmaChan[epNumber], USBFS_1_DmaTd[epNumber]); - (void) CyDmaChEnable(USBFS_1_DmaChan[epNumber], 1u); - } - else - { - USBFS_1_EP[epNumber].apiEpState = USBFS_1_NO_EVENT_PENDING; - if(length > 0u) - { - /* Set Data ready status, This will generate DMA request */ - * (reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ri) |= USBFS_1_ARB_EPX_CFG_IN_DATA_RDY; - /* Mode register will be written in arb ISR(In Buffer Full) after first DMA transfer complete */ - } - else - { - /* When zero-length packet - write the Mode register directly */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_EP[epNumber].epMode); - } - } - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_ReadOutEP -******************************************************************************** -* -* Summary: -* Read data from an endpoint. The application must call -* USBFS_1_GetEPState to see if an event is pending. -* -* Parameters: -* epNumber: Contains the data endpoint number. -* Valid values are between 1 and 8. -* pData: A pointer to a data array from which the data for the endpoint space -* is loaded. -* length: The number of bytes to transfer from the USB Out endpoint and loads -* it into data array. Valid values are between 0 and 1023. The function -* moves fewer than the requested number of bytes if the host sends -* fewer bytes than requested. -* -* Returns: -* Number of bytes received, 0 for an invalid endpoint. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint16 USBFS_1_ReadOutEP(uint8 epNumber, uint8 pData[], uint16 length) - -{ - uint8 ri; - reg8 *p; - #if(USBFS_1_EP_MM == USBFS_1__EP_MANUAL) - uint16 i; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_MANUAL */ - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - uint16 xferCount; - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP) && (pData != NULL)) - { - ri = ((epNumber - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - p = (reg8 *)(USBFS_1_ARB_RW1_DR_IND + ri); - - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - /* Determine which is smaller the requested data or the available data */ - xferCount = USBFS_1_GetEPCount(epNumber); - if (length > xferCount) - { - length = xferCount; - } - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - - #if(USBFS_1_EP_MM == USBFS_1__EP_MANUAL) - /* Copy the data using the arbiter data register */ - for (i = 0u; i < length; i++) - { - pData[i] = CY_GET_REG8(p); - } - - /* (re)arming of OUT endpoint */ - USBFS_1_EnableOutEP(epNumber); - #else - /*Init DMA if it was not initialized */ - if(USBFS_1_DmaTd[epNumber] == DMA_INVALID_TD) - { - USBFS_1_InitEP_DMA(epNumber, pData); - } - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_MANUAL */ - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL) - /* Enable DMA in mode2 for transferring data */ - (void) CyDmaChDisable(USBFS_1_DmaChan[epNumber]); - (void) CyDmaTdSetConfiguration(USBFS_1_DmaTd[epNumber], length, CY_DMA_DISABLE_TD, - TD_TERMIN_EN | TD_INC_DST_ADR); - (void) CyDmaTdSetAddress(USBFS_1_DmaTd[epNumber], LO16((uint32)p), LO16((uint32)pData)); - /* Enable the DMA */ - (void) CyDmaChSetInitialTd(USBFS_1_DmaChan[epNumber], USBFS_1_DmaTd[epNumber]); - (void) CyDmaChEnable(USBFS_1_DmaChan[epNumber], 1u); - - /* Generate DMA request */ - * (reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ri) |= USBFS_1_ARB_EPX_CFG_DMA_REQ; - * (reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ri) &= ((uint8)(~USBFS_1_ARB_EPX_CFG_DMA_REQ)); - /* Out EP will be (re)armed in arb ISR after transfer complete */ - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL */ - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /* Enable DMA in mode3 for transferring data */ - (void) CyDmaChDisable(USBFS_1_DmaChan[epNumber]); - (void) CyDmaTdSetConfiguration(USBFS_1_DmaTd[epNumber], length, USBFS_1_DmaTd[epNumber], - TD_TERMIN_EN | TD_INC_DST_ADR); - (void) CyDmaTdSetAddress(USBFS_1_DmaTd[epNumber], LO16((uint32)p), LO16((uint32)pData)); - - /* Clear Any potential pending DMA requests before starting the DMA channel to transfer data */ - (void) CyDmaClearPendingDrq(USBFS_1_DmaChan[epNumber]); - /* Enable the DMA */ - (void) CyDmaChSetInitialTd(USBFS_1_DmaChan[epNumber], USBFS_1_DmaTd[epNumber]); - (void) CyDmaChEnable(USBFS_1_DmaChan[epNumber], 1u); - /* Out EP will be (re)armed in arb ISR after transfer complete */ - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - - } - else - { - length = 0u; - } - - return(length); -} - - -/******************************************************************************* -* Function Name: USBFS_1_EnableOutEP -******************************************************************************** -* -* Summary: -* This function enables an OUT endpoint. It should not be -* called for an IN endpoint. -* -* Parameters: -* epNumber: Endpoint Number -* Valid values are between 1 and 8. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_EP[epNumber].apiEpState - set to NO_EVENT_PENDING -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_EnableOutEP(uint8 epNumber) -{ - uint8 ri; - - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP)) - { - ri = ((epNumber - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - USBFS_1_EP[epNumber].apiEpState = USBFS_1_NO_EVENT_PENDING; - /* Write the Mode register */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_EP[epNumber].epMode); - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_DisableOutEP -******************************************************************************** -* -* Summary: -* This function disables an OUT endpoint. It should not be -* called for an IN endpoint. -* -* Parameters: -* epNumber: Endpoint Number -* Valid values are between 1 and 8. -* -* Return: -* None. -* -*******************************************************************************/ -void USBFS_1_DisableOutEP(uint8 epNumber) -{ - uint8 ri ; - - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP)) - { - ri = ((epNumber - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - /* Write the Mode register */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_NAK_OUT); - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_Force -******************************************************************************** -* -* Summary: -* Forces the bus state -* -* Parameters: -* bState -* USBFS_1_FORCE_J -* USBFS_1_FORCE_K -* USBFS_1_FORCE_SE0 -* USBFS_1_FORCE_NONE -* -* Return: -* None. -* -*******************************************************************************/ -void USBFS_1_Force(uint8 bState) -{ - CY_SET_REG8(USBFS_1_USBIO_CR0_PTR, bState); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetEPAckState -******************************************************************************** -* -* Summary: -* Returns the ACK of the CR0 Register (ACKD) -* -* Parameters: -* epNumber: Endpoint Number -* Valid values are between 1 and 8. -* -* Returns -* 0 if nothing has been ACKD, non-=zero something has been ACKD -* -*******************************************************************************/ -uint8 USBFS_1_GetEPAckState(uint8 epNumber) -{ - uint8 ri; - uint8 cr = 0u; - - if((epNumber > USBFS_1_EP0) && (epNumber < USBFS_1_MAX_EP)) - { - ri = ((epNumber - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - cr = CY_GET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri)) & USBFS_1_MODE_ACKD; - } - - return(cr); -} - - -/******************************************************************************* -* Function Name: USBFS_1_SetPowerStatus -******************************************************************************** -* -* Summary: -* Sets the device power status for reporting in the Get Device Status -* request -* -* Parameters: -* powerStatus: USBFS_1_DEVICE_STATUS_BUS_POWERED(0) - Bus Powered, -* USBFS_1_DEVICE_STATUS_SELF_POWERED(1) - Self Powered -* -* Return: -* None. -* -* Global variables: -* USBFS_1_deviceStatus - set power status -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_SetPowerStatus(uint8 powerStatus) -{ - if (powerStatus != USBFS_1_DEVICE_STATUS_BUS_POWERED) - { - USBFS_1_deviceStatus |= USBFS_1_DEVICE_STATUS_SELF_POWERED; - } - else - { - USBFS_1_deviceStatus &= ((uint8)(~USBFS_1_DEVICE_STATUS_SELF_POWERED)); - } -} - - -#if (USBFS_1_MON_VBUS == 1u) - - /******************************************************************************* - * Function Name: USBFS_1_VBusPresent - ******************************************************************************** - * - * Summary: - * Determines VBUS presence for Self Powered Devices. - * - * Parameters: - * None. - * - * Return: - * 1 if VBUS is present, otherwise 0. - * - *******************************************************************************/ - uint8 USBFS_1_VBusPresent(void) - { - return((0u != (CY_GET_REG8(USBFS_1_VBUS_PS_PTR) & USBFS_1_VBUS_MASK)) ? 1u : 0u); - } - -#endif /* USBFS_1_MON_VBUS */ - - -/******************************************************************************* -* Function Name: USBFS_1_RWUEnabled -******************************************************************************** -* -* Summary: -* Returns TRUE if Remote Wake Up is enabled, otherwise FALSE -* -* Parameters: -* None. -* -* Return: -* TRUE - Remote Wake Up Enabled -* FALSE - Remote Wake Up Disabled -* -* Global variables: -* USBFS_1_deviceStatus - checked to determine remote status -* -*******************************************************************************/ -uint8 USBFS_1_RWUEnabled(void) -{ - uint8 result = USBFS_1_FALSE; - if((USBFS_1_deviceStatus & USBFS_1_DEVICE_STATUS_REMOTE_WAKEUP) != 0u) - { - result = USBFS_1_TRUE; - } - - return(result); -} - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.h deleted file mode 100644 index c9dc6cd8..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1.h +++ /dev/null @@ -1,1178 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1.h -* Version 2.60 -* -* Description: -* Header File for the USFS component. Contains prototypes and constant values. -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_USBFS_USBFS_1_H) -#define CY_USBFS_USBFS_1_H - -#include "cytypes.h" -#include "cydevice_trm.h" -#include "cyfitter.h" -#include "CyLib.h" - - -/*************************************** -* Conditional Compilation Parameters -***************************************/ - -/* Check to see if required defines such as CY_PSOC5LP are available */ -/* They are defined starting with cy_boot v3.0 */ -#if !defined (CY_PSOC5LP) - #error Component USBFS_v2_60 requires cy_boot v3.0 or later -#endif /* (CY_PSOC5LP) */ - - -/*************************************** -* Memory Type Definitions -***************************************/ - -/* Renamed Type Definitions for backward compatibility. -* Should not be used in new designs. -*/ -#define USBFS_1_CODE CYCODE -#define USBFS_1_FAR CYFAR -#if defined(__C51__) || defined(__CX51__) - #define USBFS_1_DATA data - #define USBFS_1_XDATA xdata -#else - #define USBFS_1_DATA - #define USBFS_1_XDATA -#endif /* End __C51__ */ -#define USBFS_1_NULL NULL - - -/*************************************** -* Enumerated Types and Parameters -***************************************/ - -#define USBFS_1__EP_MANUAL 0 -#define USBFS_1__EP_DMAMANUAL 1 -#define USBFS_1__EP_DMAAUTO 2 - -#define USBFS_1__MA_STATIC 0 -#define USBFS_1__MA_DYNAMIC 1 - - - -/*************************************** -* Initial Parameter Constants -***************************************/ - -#define USBFS_1_NUM_DEVICES (1u) -#define USBFS_1_MAX_REPORTID_NUMBER (0u) - -#define USBFS_1_MON_VBUS (0u) -#define USBFS_1_EXTERN_VBUS (0u) -#define USBFS_1_EXTERN_VND (0u) -#define USBFS_1_EXTERN_CLS (0u) -#define USBFS_1_MAX_INTERFACES_NUMBER (1u) -#define USBFS_1_EP0_ISR_REMOVE (0u) -#define USBFS_1_EP1_ISR_REMOVE (0u) -#define USBFS_1_EP2_ISR_REMOVE (1u) -#define USBFS_1_EP3_ISR_REMOVE (1u) -#define USBFS_1_EP4_ISR_REMOVE (1u) -#define USBFS_1_EP5_ISR_REMOVE (1u) -#define USBFS_1_EP6_ISR_REMOVE (1u) -#define USBFS_1_EP7_ISR_REMOVE (1u) -#define USBFS_1_EP8_ISR_REMOVE (1u) -#define USBFS_1_EP_MM (0u) -#define USBFS_1_EP_MA (0u) -#define USBFS_1_DMA1_REMOVE (1u) -#define USBFS_1_DMA2_REMOVE (1u) -#define USBFS_1_DMA3_REMOVE (1u) -#define USBFS_1_DMA4_REMOVE (1u) -#define USBFS_1_DMA5_REMOVE (1u) -#define USBFS_1_DMA6_REMOVE (1u) -#define USBFS_1_DMA7_REMOVE (1u) -#define USBFS_1_DMA8_REMOVE (1u) -#define USBFS_1_SOF_ISR_REMOVE (0u) -#define USBFS_1_ARB_ISR_REMOVE (0u) -#define USBFS_1_DP_ISR_REMOVE (0u) -#define USBFS_1_ENABLE_CDC_CLASS_API (1u) -#define USBFS_1_ENABLE_MIDI_API (1u) -#define USBFS_1_MIDI_EXT_MODE (0u) - - -/*************************************** -* Data Struct Definition -***************************************/ - -typedef struct -{ - uint8 attrib; - uint8 apiEpState; - uint8 hwEpState; - uint8 epToggle; - uint8 addr; - uint8 epMode; - uint16 buffOffset; - uint16 bufferSize; - uint8 interface; -} T_USBFS_1_EP_CTL_BLOCK; - -typedef struct -{ - uint8 interface; - uint8 altSetting; - uint8 addr; - uint8 attributes; - uint16 bufferSize; - uint8 bMisc; -} T_USBFS_1_EP_SETTINGS_BLOCK; - -typedef struct -{ - uint8 status; - uint16 length; -} T_USBFS_1_XFER_STATUS_BLOCK; - -typedef struct -{ - uint16 count; - volatile uint8 *pData; - T_USBFS_1_XFER_STATUS_BLOCK *pStatusBlock; -} T_USBFS_1_TD; - - -typedef struct -{ - uint8 c; - const void *p_list; -} T_USBFS_1_LUT; - -/* Resume/Suspend API Support */ -typedef struct -{ - uint8 enableState; - uint8 mode; -} USBFS_1_BACKUP_STRUCT; - - -/* Renamed structure fields for backward compatibility. -* Should not be used in new designs. -*/ -#define wBuffOffset buffOffset -#define wBufferSize bufferSize -#define bStatus status -#define wLength length -#define wCount count - -/* Renamed global variable for backward compatibility. -* Should not be used in new designs. -*/ -#define CurrentTD USBFS_1_currentTD - - -/*************************************** -* Function Prototypes -***************************************/ - -void USBFS_1_Start(uint8 device, uint8 mode) ; -void USBFS_1_Init(void) ; -void USBFS_1_InitComponent(uint8 device, uint8 mode) ; -void USBFS_1_Stop(void) ; -uint8 USBFS_1_CheckActivity(void) ; -uint8 USBFS_1_GetConfiguration(void) ; -uint8 USBFS_1_IsConfigurationChanged(void) ; -uint8 USBFS_1_GetInterfaceSetting(uint8 interfaceNumber) - ; -uint8 USBFS_1_GetEPState(uint8 epNumber) ; -uint16 USBFS_1_GetEPCount(uint8 epNumber) ; -void USBFS_1_LoadInEP(uint8 epNumber, const uint8 pData[], uint16 length) - ; -uint16 USBFS_1_ReadOutEP(uint8 epNumber, uint8 pData[], uint16 length) - ; -void USBFS_1_EnableOutEP(uint8 epNumber) ; -void USBFS_1_DisableOutEP(uint8 epNumber) ; -void USBFS_1_Force(uint8 bState) ; -uint8 USBFS_1_GetEPAckState(uint8 epNumber) ; -void USBFS_1_SetPowerStatus(uint8 powerStatus) ; -uint8 USBFS_1_RWUEnabled(void) ; -void USBFS_1_TerminateEP(uint8 ep) ; - -void USBFS_1_Suspend(void) ; -void USBFS_1_Resume(void) ; - -#if defined(USBFS_1_ENABLE_FWSN_STRING) - void USBFS_1_SerialNumString(uint8 snString[]) ; -#endif /* USBFS_1_ENABLE_FWSN_STRING */ -#if (USBFS_1_MON_VBUS == 1u) - uint8 USBFS_1_VBusPresent(void) ; -#endif /* End USBFS_1_MON_VBUS */ - -#if defined(CYDEV_BOOTLOADER_IO_COMP) && ((CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS_1) || \ - (CYDEV_BOOTLOADER_IO_COMP == CyBtldr_Custom_Interface)) - - void USBFS_1_CyBtldrCommStart(void) ; - void USBFS_1_CyBtldrCommStop(void) ; - void USBFS_1_CyBtldrCommReset(void) ; - cystatus USBFS_1_CyBtldrCommWrite(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL - ; - cystatus USBFS_1_CyBtldrCommRead( uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL - ; - - #define USBFS_1_BTLDR_SIZEOF_WRITE_BUFFER (64u) /* EP 1 OUT */ - #define USBFS_1_BTLDR_SIZEOF_READ_BUFFER (64u) /* EP 2 IN */ - #define USBFS_1_BTLDR_MAX_PACKET_SIZE USBFS_1_BTLDR_SIZEOF_WRITE_BUFFER - - /* These defines active if used USBFS interface as an - * IO Component for bootloading. When Custom_Interface selected - * in Bootloder configuration as the IO Component, user must - * provide these functions - */ - #if (CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS_1) - #define CyBtldrCommStart USBFS_1_CyBtldrCommStart - #define CyBtldrCommStop USBFS_1_CyBtldrCommStop - #define CyBtldrCommReset USBFS_1_CyBtldrCommReset - #define CyBtldrCommWrite USBFS_1_CyBtldrCommWrite - #define CyBtldrCommRead USBFS_1_CyBtldrCommRead - #endif /*End CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS_1 */ - -#endif /* End CYDEV_BOOTLOADER_IO_COMP */ - -#if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - void USBFS_1_InitEP_DMA(uint8 epNumber, const uint8 *pData) - ; - void USBFS_1_Stop_DMA(uint8 epNumber) ; -#endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL) */ - -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) && (USBFS_1_ENABLE_MIDI_API != 0u) - void USBFS_1_MIDI_EP_Init(void) ; - - #if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) - void USBFS_1_MIDI_IN_Service(void) ; - uint8 USBFS_1_PutUsbMidiIn(uint8 ic, const uint8 midiMsg[], uint8 cable) - ; - #endif /* USBFS_1_MIDI_IN_BUFF_SIZE > 0 */ - - #if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) - void USBFS_1_MIDI_OUT_EP_Service(void) ; - #endif /* USBFS_1_MIDI_OUT_BUFF_SIZE > 0 */ - -#endif /* End USBFS_1_ENABLE_MIDI_API != 0u */ - -/* Renamed Functions for backward compatibility. -* Should not be used in new designs. -*/ - -#define USBFS_1_bCheckActivity USBFS_1_CheckActivity -#define USBFS_1_bGetConfiguration USBFS_1_GetConfiguration -#define USBFS_1_bGetInterfaceSetting USBFS_1_GetInterfaceSetting -#define USBFS_1_bGetEPState USBFS_1_GetEPState -#define USBFS_1_wGetEPCount USBFS_1_GetEPCount -#define USBFS_1_bGetEPAckState USBFS_1_GetEPAckState -#define USBFS_1_bRWUEnabled USBFS_1_RWUEnabled -#define USBFS_1_bVBusPresent USBFS_1_VBusPresent - -#define USBFS_1_bConfiguration USBFS_1_configuration -#define USBFS_1_bInterfaceSetting USBFS_1_interfaceSetting -#define USBFS_1_bDeviceAddress USBFS_1_deviceAddress -#define USBFS_1_bDeviceStatus USBFS_1_deviceStatus -#define USBFS_1_bDevice USBFS_1_device -#define USBFS_1_bTransferState USBFS_1_transferState -#define USBFS_1_bLastPacketSize USBFS_1_lastPacketSize - -#define USBFS_1_LoadEP USBFS_1_LoadInEP -#define USBFS_1_LoadInISOCEP USBFS_1_LoadInEP -#define USBFS_1_EnableOutISOCEP USBFS_1_EnableOutEP - -#define USBFS_1_SetVector CyIntSetVector -#define USBFS_1_SetPriority CyIntSetPriority -#define USBFS_1_EnableInt CyIntEnable - - -/*************************************** -* API Constants -***************************************/ - -#define USBFS_1_EP0 (0u) -#define USBFS_1_EP1 (1u) -#define USBFS_1_EP2 (2u) -#define USBFS_1_EP3 (3u) -#define USBFS_1_EP4 (4u) -#define USBFS_1_EP5 (5u) -#define USBFS_1_EP6 (6u) -#define USBFS_1_EP7 (7u) -#define USBFS_1_EP8 (8u) -#define USBFS_1_MAX_EP (9u) - -#define USBFS_1_TRUE (1u) -#define USBFS_1_FALSE (0u) - -#define USBFS_1_NO_EVENT_ALLOWED (2u) -#define USBFS_1_EVENT_PENDING (1u) -#define USBFS_1_NO_EVENT_PENDING (0u) - -#define USBFS_1_IN_BUFFER_FULL USBFS_1_NO_EVENT_PENDING -#define USBFS_1_IN_BUFFER_EMPTY USBFS_1_EVENT_PENDING -#define USBFS_1_OUT_BUFFER_FULL USBFS_1_EVENT_PENDING -#define USBFS_1_OUT_BUFFER_EMPTY USBFS_1_NO_EVENT_PENDING - -#define USBFS_1_FORCE_J (0xA0u) -#define USBFS_1_FORCE_K (0x80u) -#define USBFS_1_FORCE_SE0 (0xC0u) -#define USBFS_1_FORCE_NONE (0x00u) - -#define USBFS_1_IDLE_TIMER_RUNNING (0x02u) -#define USBFS_1_IDLE_TIMER_EXPIRED (0x01u) -#define USBFS_1_IDLE_TIMER_INDEFINITE (0x00u) - -#define USBFS_1_DEVICE_STATUS_BUS_POWERED (0x00u) -#define USBFS_1_DEVICE_STATUS_SELF_POWERED (0x01u) - -#define USBFS_1_3V_OPERATION (0x00u) -#define USBFS_1_5V_OPERATION (0x01u) -#define USBFS_1_DWR_VDDD_OPERATION (0x02u) - -#define USBFS_1_MODE_DISABLE (0x00u) -#define USBFS_1_MODE_NAK_IN_OUT (0x01u) -#define USBFS_1_MODE_STATUS_OUT_ONLY (0x02u) -#define USBFS_1_MODE_STALL_IN_OUT (0x03u) -#define USBFS_1_MODE_RESERVED_0100 (0x04u) -#define USBFS_1_MODE_ISO_OUT (0x05u) -#define USBFS_1_MODE_STATUS_IN_ONLY (0x06u) -#define USBFS_1_MODE_ISO_IN (0x07u) -#define USBFS_1_MODE_NAK_OUT (0x08u) -#define USBFS_1_MODE_ACK_OUT (0x09u) -#define USBFS_1_MODE_RESERVED_1010 (0x0Au) -#define USBFS_1_MODE_ACK_OUT_STATUS_IN (0x0Bu) -#define USBFS_1_MODE_NAK_IN (0x0Cu) -#define USBFS_1_MODE_ACK_IN (0x0Du) -#define USBFS_1_MODE_RESERVED_1110 (0x0Eu) -#define USBFS_1_MODE_ACK_IN_STATUS_OUT (0x0Fu) -#define USBFS_1_MODE_MASK (0x0Fu) -#define USBFS_1_MODE_STALL_DATA_EP (0x80u) - -#define USBFS_1_MODE_ACKD (0x10u) -#define USBFS_1_MODE_OUT_RCVD (0x20u) -#define USBFS_1_MODE_IN_RCVD (0x40u) -#define USBFS_1_MODE_SETUP_RCVD (0x80u) - -#define USBFS_1_RQST_TYPE_MASK (0x60u) -#define USBFS_1_RQST_TYPE_STD (0x00u) -#define USBFS_1_RQST_TYPE_CLS (0x20u) -#define USBFS_1_RQST_TYPE_VND (0x40u) -#define USBFS_1_RQST_DIR_MASK (0x80u) -#define USBFS_1_RQST_DIR_D2H (0x80u) -#define USBFS_1_RQST_DIR_H2D (0x00u) -#define USBFS_1_RQST_RCPT_MASK (0x03u) -#define USBFS_1_RQST_RCPT_DEV (0x00u) -#define USBFS_1_RQST_RCPT_IFC (0x01u) -#define USBFS_1_RQST_RCPT_EP (0x02u) -#define USBFS_1_RQST_RCPT_OTHER (0x03u) - -/* USB Class Codes */ -#define USBFS_1_CLASS_DEVICE (0x00u) /* Use class code info from Interface Descriptors */ -#define USBFS_1_CLASS_AUDIO (0x01u) /* Audio device */ -#define USBFS_1_CLASS_CDC (0x02u) /* Communication device class */ -#define USBFS_1_CLASS_HID (0x03u) /* Human Interface Device */ -#define USBFS_1_CLASS_PDC (0x05u) /* Physical device class */ -#define USBFS_1_CLASS_IMAGE (0x06u) /* Still Imaging device */ -#define USBFS_1_CLASS_PRINTER (0x07u) /* Printer device */ -#define USBFS_1_CLASS_MSD (0x08u) /* Mass Storage device */ -#define USBFS_1_CLASS_HUB (0x09u) /* Full/Hi speed Hub */ -#define USBFS_1_CLASS_CDC_DATA (0x0Au) /* CDC data device */ -#define USBFS_1_CLASS_SMART_CARD (0x0Bu) /* Smart Card device */ -#define USBFS_1_CLASS_CSD (0x0Du) /* Content Security device */ -#define USBFS_1_CLASS_VIDEO (0x0Eu) /* Video device */ -#define USBFS_1_CLASS_PHD (0x0Fu) /* Personal Healthcare device */ -#define USBFS_1_CLASS_WIRELESSD (0xDCu) /* Wireless Controller */ -#define USBFS_1_CLASS_MIS (0xE0u) /* Miscellaneous */ -#define USBFS_1_CLASS_APP (0xEFu) /* Application Specific */ -#define USBFS_1_CLASS_VENDOR (0xFFu) /* Vendor specific */ - - -/* Standard Request Types (Table 9-4) */ -#define USBFS_1_GET_STATUS (0x00u) -#define USBFS_1_CLEAR_FEATURE (0x01u) -#define USBFS_1_SET_FEATURE (0x03u) -#define USBFS_1_SET_ADDRESS (0x05u) -#define USBFS_1_GET_DESCRIPTOR (0x06u) -#define USBFS_1_SET_DESCRIPTOR (0x07u) -#define USBFS_1_GET_CONFIGURATION (0x08u) -#define USBFS_1_SET_CONFIGURATION (0x09u) -#define USBFS_1_GET_INTERFACE (0x0Au) -#define USBFS_1_SET_INTERFACE (0x0Bu) -#define USBFS_1_SYNCH_FRAME (0x0Cu) - -/* Vendor Specific Request Types */ -/* Request for Microsoft OS String Descriptor */ -#define USBFS_1_GET_EXTENDED_CONFIG_DESCRIPTOR (0x01u) - -/* Descriptor Types (Table 9-5) */ -#define USBFS_1_DESCR_DEVICE (1u) -#define USBFS_1_DESCR_CONFIG (2u) -#define USBFS_1_DESCR_STRING (3u) -#define USBFS_1_DESCR_INTERFACE (4u) -#define USBFS_1_DESCR_ENDPOINT (5u) -#define USBFS_1_DESCR_DEVICE_QUALIFIER (6u) -#define USBFS_1_DESCR_OTHER_SPEED (7u) -#define USBFS_1_DESCR_INTERFACE_POWER (8u) - -/* Device Descriptor Defines */ -#define USBFS_1_DEVICE_DESCR_LENGTH (18u) -#define USBFS_1_DEVICE_DESCR_SN_SHIFT (16u) - -/* Config Descriptor Shifts and Masks */ -#define USBFS_1_CONFIG_DESCR_LENGTH (0u) -#define USBFS_1_CONFIG_DESCR_TYPE (1u) -#define USBFS_1_CONFIG_DESCR_TOTAL_LENGTH_LOW (2u) -#define USBFS_1_CONFIG_DESCR_TOTAL_LENGTH_HI (3u) -#define USBFS_1_CONFIG_DESCR_NUM_INTERFACES (4u) -#define USBFS_1_CONFIG_DESCR_CONFIG_VALUE (5u) -#define USBFS_1_CONFIG_DESCR_CONFIGURATION (6u) -#define USBFS_1_CONFIG_DESCR_ATTRIB (7u) -#define USBFS_1_CONFIG_DESCR_ATTRIB_SELF_POWERED (0x40u) -#define USBFS_1_CONFIG_DESCR_ATTRIB_RWU_EN (0x20u) - -/* Feature Selectors (Table 9-6) */ -#define USBFS_1_DEVICE_REMOTE_WAKEUP (0x01u) -#define USBFS_1_ENDPOINT_HALT (0x00u) -#define USBFS_1_TEST_MODE (0x02u) - -/* USB Device Status (Figure 9-4) */ -#define USBFS_1_DEVICE_STATUS_BUS_POWERED (0x00u) -#define USBFS_1_DEVICE_STATUS_SELF_POWERED (0x01u) -#define USBFS_1_DEVICE_STATUS_REMOTE_WAKEUP (0x02u) - -/* USB Endpoint Status (Figure 9-4) */ -#define USBFS_1_ENDPOINT_STATUS_HALT (0x01u) - -/* USB Endpoint Directions */ -#define USBFS_1_DIR_IN (0x80u) -#define USBFS_1_DIR_OUT (0x00u) -#define USBFS_1_DIR_UNUSED (0x7Fu) - -/* USB Endpoint Attributes */ -#define USBFS_1_EP_TYPE_CTRL (0x00u) -#define USBFS_1_EP_TYPE_ISOC (0x01u) -#define USBFS_1_EP_TYPE_BULK (0x02u) -#define USBFS_1_EP_TYPE_INT (0x03u) -#define USBFS_1_EP_TYPE_MASK (0x03u) - -#define USBFS_1_EP_SYNC_TYPE_NO_SYNC (0x00u) -#define USBFS_1_EP_SYNC_TYPE_ASYNC (0x04u) -#define USBFS_1_EP_SYNC_TYPE_ADAPTIVE (0x08u) -#define USBFS_1_EP_SYNC_TYPE_SYNCHRONOUS (0x0Cu) -#define USBFS_1_EP_SYNC_TYPE_MASK (0x0Cu) - -#define USBFS_1_EP_USAGE_TYPE_DATA (0x00u) -#define USBFS_1_EP_USAGE_TYPE_FEEDBACK (0x10u) -#define USBFS_1_EP_USAGE_TYPE_IMPLICIT (0x20u) -#define USBFS_1_EP_USAGE_TYPE_RESERVED (0x30u) -#define USBFS_1_EP_USAGE_TYPE_MASK (0x30u) - -/* Endpoint Status defines */ -#define USBFS_1_EP_STATUS_LENGTH (0x02u) - -/* Endpoint Device defines */ -#define USBFS_1_DEVICE_STATUS_LENGTH (0x02u) - -#define USBFS_1_STATUS_LENGTH_MAX \ - ( (USBFS_1_EP_STATUS_LENGTH > USBFS_1_DEVICE_STATUS_LENGTH) ? \ - USBFS_1_EP_STATUS_LENGTH : USBFS_1_DEVICE_STATUS_LENGTH ) -/* Transfer Completion Notification */ -#define USBFS_1_XFER_IDLE (0x00u) -#define USBFS_1_XFER_STATUS_ACK (0x01u) -#define USBFS_1_XFER_PREMATURE (0x02u) -#define USBFS_1_XFER_ERROR (0x03u) - -/* Driver State defines */ -#define USBFS_1_TRANS_STATE_IDLE (0x00u) -#define USBFS_1_TRANS_STATE_CONTROL_READ (0x02u) -#define USBFS_1_TRANS_STATE_CONTROL_WRITE (0x04u) -#define USBFS_1_TRANS_STATE_NO_DATA_CONTROL (0x06u) - -/* String Descriptor defines */ -#define USBFS_1_STRING_MSOS (0xEEu) -#define USBFS_1_MSOS_DESCRIPTOR_LENGTH (18u) -#define USBFS_1_MSOS_CONF_DESCR_LENGTH (40u) - -#if(USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL) - /* DMA manual mode defines */ - #define USBFS_1_DMA_BYTES_PER_BURST (0u) - #define USBFS_1_DMA_REQUEST_PER_BURST (0u) -#endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL */ -#if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /* DMA automatic mode defines */ - #define USBFS_1_DMA_BYTES_PER_BURST (32u) - /* BUF_SIZE-BYTES_PER_BURST examples: 55-32 bytes 44-16 bytes 33-8 bytes 22-4 bytes 11-2 bytes */ - #define USBFS_1_DMA_BUF_SIZE (0x55u) - #define USBFS_1_DMA_REQUEST_PER_BURST (1u) -#endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - -/* DIE ID string descriptor defines */ -#if defined(USBFS_1_ENABLE_IDSN_STRING) - #define USBFS_1_IDSN_DESCR_LENGTH (0x22u) -#endif /* USBFS_1_ENABLE_IDSN_STRING */ - - -/*************************************** -* External data references -***************************************/ - -extern uint8 USBFS_1_initVar; -extern volatile uint8 USBFS_1_device; -extern volatile uint8 USBFS_1_transferState; -extern volatile uint8 USBFS_1_configuration; -extern volatile uint8 USBFS_1_configurationChanged; -extern volatile uint8 USBFS_1_deviceStatus; - -/* HID Variables */ -#if defined(USBFS_1_ENABLE_HID_CLASS) - extern volatile uint8 USBFS_1_hidProtocol[USBFS_1_MAX_INTERFACES_NUMBER]; - extern volatile uint8 USBFS_1_hidIdleRate[USBFS_1_MAX_INTERFACES_NUMBER]; - extern volatile uint8 USBFS_1_hidIdleTimer[USBFS_1_MAX_INTERFACES_NUMBER]; -#endif /* USBFS_1_ENABLE_HID_CLASS */ - - -/*************************************** -* Registers -***************************************/ - -#define USBFS_1_ARB_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_CFG) -#define USBFS_1_ARB_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_CFG) - -#define USBFS_1_ARB_EP1_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP1_CFG) -#define USBFS_1_ARB_EP1_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP1_CFG) -#define USBFS_1_ARB_EP1_CFG_IND USBFS_1_USB__ARB_EP1_CFG -#define USBFS_1_ARB_EP1_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP1_INT_EN) -#define USBFS_1_ARB_EP1_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP1_INT_EN) -#define USBFS_1_ARB_EP1_INT_EN_IND USBFS_1_USB__ARB_EP1_INT_EN -#define USBFS_1_ARB_EP1_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP1_SR) -#define USBFS_1_ARB_EP1_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP1_SR) -#define USBFS_1_ARB_EP1_SR_IND USBFS_1_USB__ARB_EP1_SR - -#define USBFS_1_ARB_EP2_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP2_CFG) -#define USBFS_1_ARB_EP2_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP2_CFG) -#define USBFS_1_ARB_EP2_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP2_INT_EN) -#define USBFS_1_ARB_EP2_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP2_INT_EN) -#define USBFS_1_ARB_EP2_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP2_SR) -#define USBFS_1_ARB_EP2_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP2_SR) - -#define USBFS_1_ARB_EP3_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP3_CFG) -#define USBFS_1_ARB_EP3_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP3_CFG) -#define USBFS_1_ARB_EP3_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP3_INT_EN) -#define USBFS_1_ARB_EP3_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP3_INT_EN) -#define USBFS_1_ARB_EP3_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP3_SR) -#define USBFS_1_ARB_EP3_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP3_SR) - -#define USBFS_1_ARB_EP4_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP4_CFG) -#define USBFS_1_ARB_EP4_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP4_CFG) -#define USBFS_1_ARB_EP4_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP4_INT_EN) -#define USBFS_1_ARB_EP4_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP4_INT_EN) -#define USBFS_1_ARB_EP4_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP4_SR) -#define USBFS_1_ARB_EP4_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP4_SR) - -#define USBFS_1_ARB_EP5_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP5_CFG) -#define USBFS_1_ARB_EP5_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP5_CFG) -#define USBFS_1_ARB_EP5_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP5_INT_EN) -#define USBFS_1_ARB_EP5_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP5_INT_EN) -#define USBFS_1_ARB_EP5_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP5_SR) -#define USBFS_1_ARB_EP5_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP5_SR) - -#define USBFS_1_ARB_EP6_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP6_CFG) -#define USBFS_1_ARB_EP6_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP6_CFG) -#define USBFS_1_ARB_EP6_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP6_INT_EN) -#define USBFS_1_ARB_EP6_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP6_INT_EN) -#define USBFS_1_ARB_EP6_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP6_SR) -#define USBFS_1_ARB_EP6_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP6_SR) - -#define USBFS_1_ARB_EP7_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP7_CFG) -#define USBFS_1_ARB_EP7_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP7_CFG) -#define USBFS_1_ARB_EP7_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP7_INT_EN) -#define USBFS_1_ARB_EP7_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP7_INT_EN) -#define USBFS_1_ARB_EP7_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP7_SR) -#define USBFS_1_ARB_EP7_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP7_SR) - -#define USBFS_1_ARB_EP8_CFG_PTR ( (reg8 *) USBFS_1_USB__ARB_EP8_CFG) -#define USBFS_1_ARB_EP8_CFG_REG (* (reg8 *) USBFS_1_USB__ARB_EP8_CFG) -#define USBFS_1_ARB_EP8_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_EP8_INT_EN) -#define USBFS_1_ARB_EP8_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_EP8_INT_EN) -#define USBFS_1_ARB_EP8_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_EP8_SR) -#define USBFS_1_ARB_EP8_SR_REG (* (reg8 *) USBFS_1_USB__ARB_EP8_SR) - -#define USBFS_1_ARB_INT_EN_PTR ( (reg8 *) USBFS_1_USB__ARB_INT_EN) -#define USBFS_1_ARB_INT_EN_REG (* (reg8 *) USBFS_1_USB__ARB_INT_EN) -#define USBFS_1_ARB_INT_SR_PTR ( (reg8 *) USBFS_1_USB__ARB_INT_SR) -#define USBFS_1_ARB_INT_SR_REG (* (reg8 *) USBFS_1_USB__ARB_INT_SR) - -#define USBFS_1_ARB_RW1_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW1_DR) -#define USBFS_1_ARB_RW1_DR_IND USBFS_1_USB__ARB_RW1_DR -#define USBFS_1_ARB_RW1_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW1_RA) -#define USBFS_1_ARB_RW1_RA_IND USBFS_1_USB__ARB_RW1_RA -#define USBFS_1_ARB_RW1_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW1_RA_MSB) -#define USBFS_1_ARB_RW1_RA_MSB_IND USBFS_1_USB__ARB_RW1_RA_MSB -#define USBFS_1_ARB_RW1_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW1_WA) -#define USBFS_1_ARB_RW1_WA_IND USBFS_1_USB__ARB_RW1_WA -#define USBFS_1_ARB_RW1_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW1_WA_MSB) -#define USBFS_1_ARB_RW1_WA_MSB_IND USBFS_1_USB__ARB_RW1_WA_MSB - -#define USBFS_1_ARB_RW2_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW2_DR) -#define USBFS_1_ARB_RW2_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW2_RA) -#define USBFS_1_ARB_RW2_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW2_RA_MSB) -#define USBFS_1_ARB_RW2_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW2_WA) -#define USBFS_1_ARB_RW2_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW2_WA_MSB) - -#define USBFS_1_ARB_RW3_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW3_DR) -#define USBFS_1_ARB_RW3_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW3_RA) -#define USBFS_1_ARB_RW3_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW3_RA_MSB) -#define USBFS_1_ARB_RW3_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW3_WA) -#define USBFS_1_ARB_RW3_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW3_WA_MSB) - -#define USBFS_1_ARB_RW4_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW4_DR) -#define USBFS_1_ARB_RW4_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW4_RA) -#define USBFS_1_ARB_RW4_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW4_RA_MSB) -#define USBFS_1_ARB_RW4_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW4_WA) -#define USBFS_1_ARB_RW4_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW4_WA_MSB) - -#define USBFS_1_ARB_RW5_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW5_DR) -#define USBFS_1_ARB_RW5_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW5_RA) -#define USBFS_1_ARB_RW5_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW5_RA_MSB) -#define USBFS_1_ARB_RW5_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW5_WA) -#define USBFS_1_ARB_RW5_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW5_WA_MSB) - -#define USBFS_1_ARB_RW6_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW6_DR) -#define USBFS_1_ARB_RW6_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW6_RA) -#define USBFS_1_ARB_RW6_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW6_RA_MSB) -#define USBFS_1_ARB_RW6_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW6_WA) -#define USBFS_1_ARB_RW6_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW6_WA_MSB) - -#define USBFS_1_ARB_RW7_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW7_DR) -#define USBFS_1_ARB_RW7_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW7_RA) -#define USBFS_1_ARB_RW7_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW7_RA_MSB) -#define USBFS_1_ARB_RW7_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW7_WA) -#define USBFS_1_ARB_RW7_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW7_WA_MSB) - -#define USBFS_1_ARB_RW8_DR_PTR ((reg8 *) USBFS_1_USB__ARB_RW8_DR) -#define USBFS_1_ARB_RW8_RA_PTR ((reg8 *) USBFS_1_USB__ARB_RW8_RA) -#define USBFS_1_ARB_RW8_RA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW8_RA_MSB) -#define USBFS_1_ARB_RW8_WA_PTR ((reg8 *) USBFS_1_USB__ARB_RW8_WA) -#define USBFS_1_ARB_RW8_WA_MSB_PTR ((reg8 *) USBFS_1_USB__ARB_RW8_WA_MSB) - -#define USBFS_1_BUF_SIZE_PTR ( (reg8 *) USBFS_1_USB__BUF_SIZE) -#define USBFS_1_BUF_SIZE_REG (* (reg8 *) USBFS_1_USB__BUF_SIZE) -#define USBFS_1_BUS_RST_CNT_PTR ( (reg8 *) USBFS_1_USB__BUS_RST_CNT) -#define USBFS_1_BUS_RST_CNT_REG (* (reg8 *) USBFS_1_USB__BUS_RST_CNT) -#define USBFS_1_CWA_PTR ( (reg8 *) USBFS_1_USB__CWA) -#define USBFS_1_CWA_REG (* (reg8 *) USBFS_1_USB__CWA) -#define USBFS_1_CWA_MSB_PTR ( (reg8 *) USBFS_1_USB__CWA_MSB) -#define USBFS_1_CWA_MSB_REG (* (reg8 *) USBFS_1_USB__CWA_MSB) -#define USBFS_1_CR0_PTR ( (reg8 *) USBFS_1_USB__CR0) -#define USBFS_1_CR0_REG (* (reg8 *) USBFS_1_USB__CR0) -#define USBFS_1_CR1_PTR ( (reg8 *) USBFS_1_USB__CR1) -#define USBFS_1_CR1_REG (* (reg8 *) USBFS_1_USB__CR1) - -#define USBFS_1_DMA_THRES_PTR ( (reg8 *) USBFS_1_USB__DMA_THRES) -#define USBFS_1_DMA_THRES_REG (* (reg8 *) USBFS_1_USB__DMA_THRES) -#define USBFS_1_DMA_THRES_MSB_PTR ( (reg8 *) USBFS_1_USB__DMA_THRES_MSB) -#define USBFS_1_DMA_THRES_MSB_REG (* (reg8 *) USBFS_1_USB__DMA_THRES_MSB) - -#define USBFS_1_EP_ACTIVE_PTR ( (reg8 *) USBFS_1_USB__EP_ACTIVE) -#define USBFS_1_EP_ACTIVE_REG (* (reg8 *) USBFS_1_USB__EP_ACTIVE) -#define USBFS_1_EP_TYPE_PTR ( (reg8 *) USBFS_1_USB__EP_TYPE) -#define USBFS_1_EP_TYPE_REG (* (reg8 *) USBFS_1_USB__EP_TYPE) - -#define USBFS_1_EP0_CNT_PTR ( (reg8 *) USBFS_1_USB__EP0_CNT) -#define USBFS_1_EP0_CNT_REG (* (reg8 *) USBFS_1_USB__EP0_CNT) -#define USBFS_1_EP0_CR_PTR ( (reg8 *) USBFS_1_USB__EP0_CR) -#define USBFS_1_EP0_CR_REG (* (reg8 *) USBFS_1_USB__EP0_CR) -#define USBFS_1_EP0_DR0_PTR ( (reg8 *) USBFS_1_USB__EP0_DR0) -#define USBFS_1_EP0_DR0_REG (* (reg8 *) USBFS_1_USB__EP0_DR0) -#define USBFS_1_EP0_DR0_IND USBFS_1_USB__EP0_DR0 -#define USBFS_1_EP0_DR1_PTR ( (reg8 *) USBFS_1_USB__EP0_DR1) -#define USBFS_1_EP0_DR1_REG (* (reg8 *) USBFS_1_USB__EP0_DR1) -#define USBFS_1_EP0_DR2_PTR ( (reg8 *) USBFS_1_USB__EP0_DR2) -#define USBFS_1_EP0_DR2_REG (* (reg8 *) USBFS_1_USB__EP0_DR2) -#define USBFS_1_EP0_DR3_PTR ( (reg8 *) USBFS_1_USB__EP0_DR3) -#define USBFS_1_EP0_DR3_REG (* (reg8 *) USBFS_1_USB__EP0_DR3) -#define USBFS_1_EP0_DR4_PTR ( (reg8 *) USBFS_1_USB__EP0_DR4) -#define USBFS_1_EP0_DR4_REG (* (reg8 *) USBFS_1_USB__EP0_DR4) -#define USBFS_1_EP0_DR5_PTR ( (reg8 *) USBFS_1_USB__EP0_DR5) -#define USBFS_1_EP0_DR5_REG (* (reg8 *) USBFS_1_USB__EP0_DR5) -#define USBFS_1_EP0_DR6_PTR ( (reg8 *) USBFS_1_USB__EP0_DR6) -#define USBFS_1_EP0_DR6_REG (* (reg8 *) USBFS_1_USB__EP0_DR6) -#define USBFS_1_EP0_DR7_PTR ( (reg8 *) USBFS_1_USB__EP0_DR7) -#define USBFS_1_EP0_DR7_REG (* (reg8 *) USBFS_1_USB__EP0_DR7) - -#define USBFS_1_OSCLK_DR0_PTR ( (reg8 *) USBFS_1_USB__OSCLK_DR0) -#define USBFS_1_OSCLK_DR0_REG (* (reg8 *) USBFS_1_USB__OSCLK_DR0) -#define USBFS_1_OSCLK_DR1_PTR ( (reg8 *) USBFS_1_USB__OSCLK_DR1) -#define USBFS_1_OSCLK_DR1_REG (* (reg8 *) USBFS_1_USB__OSCLK_DR1) - -#define USBFS_1_PM_ACT_CFG_PTR ( (reg8 *) USBFS_1_USB__PM_ACT_CFG) -#define USBFS_1_PM_ACT_CFG_REG (* (reg8 *) USBFS_1_USB__PM_ACT_CFG) -#define USBFS_1_PM_STBY_CFG_PTR ( (reg8 *) USBFS_1_USB__PM_STBY_CFG) -#define USBFS_1_PM_STBY_CFG_REG (* (reg8 *) USBFS_1_USB__PM_STBY_CFG) - -#define USBFS_1_SIE_EP_INT_EN_PTR ( (reg8 *) USBFS_1_USB__SIE_EP_INT_EN) -#define USBFS_1_SIE_EP_INT_EN_REG (* (reg8 *) USBFS_1_USB__SIE_EP_INT_EN) -#define USBFS_1_SIE_EP_INT_SR_PTR ( (reg8 *) USBFS_1_USB__SIE_EP_INT_SR) -#define USBFS_1_SIE_EP_INT_SR_REG (* (reg8 *) USBFS_1_USB__SIE_EP_INT_SR) - -#define USBFS_1_SIE_EP1_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP1_CNT0) -#define USBFS_1_SIE_EP1_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP1_CNT0) -#define USBFS_1_SIE_EP1_CNT0_IND USBFS_1_USB__SIE_EP1_CNT0 -#define USBFS_1_SIE_EP1_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP1_CNT1) -#define USBFS_1_SIE_EP1_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP1_CNT1) -#define USBFS_1_SIE_EP1_CNT1_IND USBFS_1_USB__SIE_EP1_CNT1 -#define USBFS_1_SIE_EP1_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP1_CR0) -#define USBFS_1_SIE_EP1_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP1_CR0) -#define USBFS_1_SIE_EP1_CR0_IND USBFS_1_USB__SIE_EP1_CR0 - -#define USBFS_1_SIE_EP2_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP2_CNT0) -#define USBFS_1_SIE_EP2_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP2_CNT0) -#define USBFS_1_SIE_EP2_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP2_CNT1) -#define USBFS_1_SIE_EP2_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP2_CNT1) -#define USBFS_1_SIE_EP2_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP2_CR0) -#define USBFS_1_SIE_EP2_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP2_CR0) - -#define USBFS_1_SIE_EP3_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP3_CNT0) -#define USBFS_1_SIE_EP3_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP3_CNT0) -#define USBFS_1_SIE_EP3_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP3_CNT1) -#define USBFS_1_SIE_EP3_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP3_CNT1) -#define USBFS_1_SIE_EP3_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP3_CR0) -#define USBFS_1_SIE_EP3_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP3_CR0) - -#define USBFS_1_SIE_EP4_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP4_CNT0) -#define USBFS_1_SIE_EP4_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP4_CNT0) -#define USBFS_1_SIE_EP4_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP4_CNT1) -#define USBFS_1_SIE_EP4_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP4_CNT1) -#define USBFS_1_SIE_EP4_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP4_CR0) -#define USBFS_1_SIE_EP4_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP4_CR0) - -#define USBFS_1_SIE_EP5_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP5_CNT0) -#define USBFS_1_SIE_EP5_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP5_CNT0) -#define USBFS_1_SIE_EP5_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP5_CNT1) -#define USBFS_1_SIE_EP5_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP5_CNT1) -#define USBFS_1_SIE_EP5_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP5_CR0) -#define USBFS_1_SIE_EP5_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP5_CR0) - -#define USBFS_1_SIE_EP6_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP6_CNT0) -#define USBFS_1_SIE_EP6_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP6_CNT0) -#define USBFS_1_SIE_EP6_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP6_CNT1) -#define USBFS_1_SIE_EP6_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP6_CNT1) -#define USBFS_1_SIE_EP6_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP6_CR0) -#define USBFS_1_SIE_EP6_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP6_CR0) - -#define USBFS_1_SIE_EP7_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP7_CNT0) -#define USBFS_1_SIE_EP7_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP7_CNT0) -#define USBFS_1_SIE_EP7_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP7_CNT1) -#define USBFS_1_SIE_EP7_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP7_CNT1) -#define USBFS_1_SIE_EP7_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP7_CR0) -#define USBFS_1_SIE_EP7_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP7_CR0) - -#define USBFS_1_SIE_EP8_CNT0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP8_CNT0) -#define USBFS_1_SIE_EP8_CNT0_REG (* (reg8 *) USBFS_1_USB__SIE_EP8_CNT0) -#define USBFS_1_SIE_EP8_CNT1_PTR ( (reg8 *) USBFS_1_USB__SIE_EP8_CNT1) -#define USBFS_1_SIE_EP8_CNT1_REG (* (reg8 *) USBFS_1_USB__SIE_EP8_CNT1) -#define USBFS_1_SIE_EP8_CR0_PTR ( (reg8 *) USBFS_1_USB__SIE_EP8_CR0) -#define USBFS_1_SIE_EP8_CR0_REG (* (reg8 *) USBFS_1_USB__SIE_EP8_CR0) - -#define USBFS_1_SOF0_PTR ( (reg8 *) USBFS_1_USB__SOF0) -#define USBFS_1_SOF0_REG (* (reg8 *) USBFS_1_USB__SOF0) -#define USBFS_1_SOF1_PTR ( (reg8 *) USBFS_1_USB__SOF1) -#define USBFS_1_SOF1_REG (* (reg8 *) USBFS_1_USB__SOF1) - -#define USBFS_1_USB_CLK_EN_PTR ( (reg8 *) USBFS_1_USB__USB_CLK_EN) -#define USBFS_1_USB_CLK_EN_REG (* (reg8 *) USBFS_1_USB__USB_CLK_EN) - -#define USBFS_1_USBIO_CR0_PTR ( (reg8 *) USBFS_1_USB__USBIO_CR0) -#define USBFS_1_USBIO_CR0_REG (* (reg8 *) USBFS_1_USB__USBIO_CR0) -#define USBFS_1_USBIO_CR1_PTR ( (reg8 *) USBFS_1_USB__USBIO_CR1) -#define USBFS_1_USBIO_CR1_REG (* (reg8 *) USBFS_1_USB__USBIO_CR1) -#if(!CY_PSOC5LP) - #define USBFS_1_USBIO_CR2_PTR ( (reg8 *) USBFS_1_USB__USBIO_CR2) - #define USBFS_1_USBIO_CR2_REG (* (reg8 *) USBFS_1_USB__USBIO_CR2) -#endif /* End CY_PSOC5LP */ - -#define USBFS_1_DIE_ID CYDEV_FLSHID_CUST_TABLES_BASE - -#define USBFS_1_PM_USB_CR0_PTR ( (reg8 *) CYREG_PM_USB_CR0) -#define USBFS_1_PM_USB_CR0_REG (* (reg8 *) CYREG_PM_USB_CR0) -#define USBFS_1_DYN_RECONFIG_PTR ( (reg8 *) USBFS_1_USB__DYN_RECONFIG) -#define USBFS_1_DYN_RECONFIG_REG (* (reg8 *) USBFS_1_USB__DYN_RECONFIG) - -#define USBFS_1_DM_INP_DIS_PTR ( (reg8 *) USBFS_1_Dm__INP_DIS) -#define USBFS_1_DM_INP_DIS_REG (* (reg8 *) USBFS_1_Dm__INP_DIS) -#define USBFS_1_DP_INP_DIS_PTR ( (reg8 *) USBFS_1_Dp__INP_DIS) -#define USBFS_1_DP_INP_DIS_REG (* (reg8 *) USBFS_1_Dp__INP_DIS) -#define USBFS_1_DP_INTSTAT_PTR ( (reg8 *) USBFS_1_Dp__INTSTAT) -#define USBFS_1_DP_INTSTAT_REG (* (reg8 *) USBFS_1_Dp__INTSTAT) - -#if (USBFS_1_MON_VBUS == 1u) - #if (USBFS_1_EXTERN_VBUS == 0u) - #define USBFS_1_VBUS_DR_PTR ( (reg8 *) USBFS_1_VBUS__DR) - #define USBFS_1_VBUS_DR_REG (* (reg8 *) USBFS_1_VBUS__DR) - #define USBFS_1_VBUS_PS_PTR ( (reg8 *) USBFS_1_VBUS__PS) - #define USBFS_1_VBUS_PS_REG (* (reg8 *) USBFS_1_VBUS__PS) - #define USBFS_1_VBUS_MASK USBFS_1_VBUS__MASK - #else - #define USBFS_1_VBUS_PS_PTR ( (reg8 *) USBFS_1_Vbus_ps_sts_sts_reg__STATUS_REG ) - #define USBFS_1_VBUS_MASK (0x01u) - #endif /* End USBFS_1_EXTERN_VBUS == 0u */ -#endif /* End USBFS_1_MON_VBUS */ - -/* Renamed Registers for backward compatibility. -* Should not be used in new designs. -*/ -#define USBFS_1_ARB_CFG USBFS_1_ARB_CFG_PTR - -#define USBFS_1_ARB_EP1_CFG USBFS_1_ARB_EP1_CFG_PTR -#define USBFS_1_ARB_EP1_INT_EN USBFS_1_ARB_EP1_INT_EN_PTR -#define USBFS_1_ARB_EP1_SR USBFS_1_ARB_EP1_SR_PTR - -#define USBFS_1_ARB_EP2_CFG USBFS_1_ARB_EP2_CFG_PTR -#define USBFS_1_ARB_EP2_INT_EN USBFS_1_ARB_EP2_INT_EN_PTR -#define USBFS_1_ARB_EP2_SR USBFS_1_ARB_EP2_SR_PTR - -#define USBFS_1_ARB_EP3_CFG USBFS_1_ARB_EP3_CFG_PTR -#define USBFS_1_ARB_EP3_INT_EN USBFS_1_ARB_EP3_INT_EN_PTR -#define USBFS_1_ARB_EP3_SR USBFS_1_ARB_EP3_SR_PTR - -#define USBFS_1_ARB_EP4_CFG USBFS_1_ARB_EP4_CFG_PTR -#define USBFS_1_ARB_EP4_INT_EN USBFS_1_ARB_EP4_INT_EN_PTR -#define USBFS_1_ARB_EP4_SR USBFS_1_ARB_EP4_SR_PTR - -#define USBFS_1_ARB_EP5_CFG USBFS_1_ARB_EP5_CFG_PTR -#define USBFS_1_ARB_EP5_INT_EN USBFS_1_ARB_EP5_INT_EN_PTR -#define USBFS_1_ARB_EP5_SR USBFS_1_ARB_EP5_SR_PTR - -#define USBFS_1_ARB_EP6_CFG USBFS_1_ARB_EP6_CFG_PTR -#define USBFS_1_ARB_EP6_INT_EN USBFS_1_ARB_EP6_INT_EN_PTR -#define USBFS_1_ARB_EP6_SR USBFS_1_ARB_EP6_SR_PTR - -#define USBFS_1_ARB_EP7_CFG USBFS_1_ARB_EP7_CFG_PTR -#define USBFS_1_ARB_EP7_INT_EN USBFS_1_ARB_EP7_INT_EN_PTR -#define USBFS_1_ARB_EP7_SR USBFS_1_ARB_EP7_SR_PTR - -#define USBFS_1_ARB_EP8_CFG USBFS_1_ARB_EP8_CFG_PTR -#define USBFS_1_ARB_EP8_INT_EN USBFS_1_ARB_EP8_INT_EN_PTR -#define USBFS_1_ARB_EP8_SR USBFS_1_ARB_EP8_SR_PTR - -#define USBFS_1_ARB_INT_EN USBFS_1_ARB_INT_EN_PTR -#define USBFS_1_ARB_INT_SR USBFS_1_ARB_INT_SR_PTR - -#define USBFS_1_ARB_RW1_DR USBFS_1_ARB_RW1_DR_PTR -#define USBFS_1_ARB_RW1_RA USBFS_1_ARB_RW1_RA_PTR -#define USBFS_1_ARB_RW1_RA_MSB USBFS_1_ARB_RW1_RA_MSB_PTR -#define USBFS_1_ARB_RW1_WA USBFS_1_ARB_RW1_WA_PTR -#define USBFS_1_ARB_RW1_WA_MSB USBFS_1_ARB_RW1_WA_MSB_PTR - -#define USBFS_1_ARB_RW2_DR USBFS_1_ARB_RW2_DR_PTR -#define USBFS_1_ARB_RW2_RA USBFS_1_ARB_RW2_RA_PTR -#define USBFS_1_ARB_RW2_RA_MSB USBFS_1_ARB_RW2_RA_MSB_PTR -#define USBFS_1_ARB_RW2_WA USBFS_1_ARB_RW2_WA_PTR -#define USBFS_1_ARB_RW2_WA_MSB USBFS_1_ARB_RW2_WA_MSB_PTR - -#define USBFS_1_ARB_RW3_DR USBFS_1_ARB_RW3_DR_PTR -#define USBFS_1_ARB_RW3_RA USBFS_1_ARB_RW3_RA_PTR -#define USBFS_1_ARB_RW3_RA_MSB USBFS_1_ARB_RW3_RA_MSB_PTR -#define USBFS_1_ARB_RW3_WA USBFS_1_ARB_RW3_WA_PTR -#define USBFS_1_ARB_RW3_WA_MSB USBFS_1_ARB_RW3_WA_MSB_PTR - -#define USBFS_1_ARB_RW4_DR USBFS_1_ARB_RW4_DR_PTR -#define USBFS_1_ARB_RW4_RA USBFS_1_ARB_RW4_RA_PTR -#define USBFS_1_ARB_RW4_RA_MSB USBFS_1_ARB_RW4_RA_MSB_PTR -#define USBFS_1_ARB_RW4_WA USBFS_1_ARB_RW4_WA_PTR -#define USBFS_1_ARB_RW4_WA_MSB USBFS_1_ARB_RW4_WA_MSB_PTR - -#define USBFS_1_ARB_RW5_DR USBFS_1_ARB_RW5_DR_PTR -#define USBFS_1_ARB_RW5_RA USBFS_1_ARB_RW5_RA_PTR -#define USBFS_1_ARB_RW5_RA_MSB USBFS_1_ARB_RW5_RA_MSB_PTR -#define USBFS_1_ARB_RW5_WA USBFS_1_ARB_RW5_WA_PTR -#define USBFS_1_ARB_RW5_WA_MSB USBFS_1_ARB_RW5_WA_MSB_PTR - -#define USBFS_1_ARB_RW6_DR USBFS_1_ARB_RW6_DR_PTR -#define USBFS_1_ARB_RW6_RA USBFS_1_ARB_RW6_RA_PTR -#define USBFS_1_ARB_RW6_RA_MSB USBFS_1_ARB_RW6_RA_MSB_PTR -#define USBFS_1_ARB_RW6_WA USBFS_1_ARB_RW6_WA_PTR -#define USBFS_1_ARB_RW6_WA_MSB USBFS_1_ARB_RW6_WA_MSB_PTR - -#define USBFS_1_ARB_RW7_DR USBFS_1_ARB_RW7_DR_PTR -#define USBFS_1_ARB_RW7_RA USBFS_1_ARB_RW7_RA_PTR -#define USBFS_1_ARB_RW7_RA_MSB USBFS_1_ARB_RW7_RA_MSB_PTR -#define USBFS_1_ARB_RW7_WA USBFS_1_ARB_RW7_WA_PTR -#define USBFS_1_ARB_RW7_WA_MSB USBFS_1_ARB_RW7_WA_MSB_PTR - -#define USBFS_1_ARB_RW8_DR USBFS_1_ARB_RW8_DR_PTR -#define USBFS_1_ARB_RW8_RA USBFS_1_ARB_RW8_RA_PTR -#define USBFS_1_ARB_RW8_RA_MSB USBFS_1_ARB_RW8_RA_MSB_PTR -#define USBFS_1_ARB_RW8_WA USBFS_1_ARB_RW8_WA_PTR -#define USBFS_1_ARB_RW8_WA_MSB USBFS_1_ARB_RW8_WA_MSB_PTR - -#define USBFS_1_BUF_SIZE USBFS_1_BUF_SIZE_PTR -#define USBFS_1_BUS_RST_CNT USBFS_1_BUS_RST_CNT_PTR -#define USBFS_1_CR0 USBFS_1_CR0_PTR -#define USBFS_1_CR1 USBFS_1_CR1_PTR -#define USBFS_1_CWA USBFS_1_CWA_PTR -#define USBFS_1_CWA_MSB USBFS_1_CWA_MSB_PTR - -#define USBFS_1_DMA_THRES USBFS_1_DMA_THRES_PTR -#define USBFS_1_DMA_THRES_MSB USBFS_1_DMA_THRES_MSB_PTR - -#define USBFS_1_EP_ACTIVE USBFS_1_EP_ACTIVE_PTR -#define USBFS_1_EP_TYPE USBFS_1_EP_TYPE_PTR - -#define USBFS_1_EP0_CNT USBFS_1_EP0_CNT_PTR -#define USBFS_1_EP0_CR USBFS_1_EP0_CR_PTR -#define USBFS_1_EP0_DR0 USBFS_1_EP0_DR0_PTR -#define USBFS_1_EP0_DR1 USBFS_1_EP0_DR1_PTR -#define USBFS_1_EP0_DR2 USBFS_1_EP0_DR2_PTR -#define USBFS_1_EP0_DR3 USBFS_1_EP0_DR3_PTR -#define USBFS_1_EP0_DR4 USBFS_1_EP0_DR4_PTR -#define USBFS_1_EP0_DR5 USBFS_1_EP0_DR5_PTR -#define USBFS_1_EP0_DR6 USBFS_1_EP0_DR6_PTR -#define USBFS_1_EP0_DR7 USBFS_1_EP0_DR7_PTR - -#define USBFS_1_OSCLK_DR0 USBFS_1_OSCLK_DR0_PTR -#define USBFS_1_OSCLK_DR1 USBFS_1_OSCLK_DR1_PTR - -#define USBFS_1_PM_ACT_CFG USBFS_1_PM_ACT_CFG_PTR -#define USBFS_1_PM_STBY_CFG USBFS_1_PM_STBY_CFG_PTR - -#define USBFS_1_SIE_EP_INT_EN USBFS_1_SIE_EP_INT_EN_PTR -#define USBFS_1_SIE_EP_INT_SR USBFS_1_SIE_EP_INT_SR_PTR - -#define USBFS_1_SIE_EP1_CNT0 USBFS_1_SIE_EP1_CNT0_PTR -#define USBFS_1_SIE_EP1_CNT1 USBFS_1_SIE_EP1_CNT1_PTR -#define USBFS_1_SIE_EP1_CR0 USBFS_1_SIE_EP1_CR0_PTR - -#define USBFS_1_SIE_EP2_CNT0 USBFS_1_SIE_EP2_CNT0_PTR -#define USBFS_1_SIE_EP2_CNT1 USBFS_1_SIE_EP2_CNT1_PTR -#define USBFS_1_SIE_EP2_CR0 USBFS_1_SIE_EP2_CR0_PTR - -#define USBFS_1_SIE_EP3_CNT0 USBFS_1_SIE_EP3_CNT0_PTR -#define USBFS_1_SIE_EP3_CNT1 USBFS_1_SIE_EP3_CNT1_PTR -#define USBFS_1_SIE_EP3_CR0 USBFS_1_SIE_EP3_CR0_PTR - -#define USBFS_1_SIE_EP4_CNT0 USBFS_1_SIE_EP4_CNT0_PTR -#define USBFS_1_SIE_EP4_CNT1 USBFS_1_SIE_EP4_CNT1_PTR -#define USBFS_1_SIE_EP4_CR0 USBFS_1_SIE_EP4_CR0_PTR - -#define USBFS_1_SIE_EP5_CNT0 USBFS_1_SIE_EP5_CNT0_PTR -#define USBFS_1_SIE_EP5_CNT1 USBFS_1_SIE_EP5_CNT1_PTR -#define USBFS_1_SIE_EP5_CR0 USBFS_1_SIE_EP5_CR0_PTR - -#define USBFS_1_SIE_EP6_CNT0 USBFS_1_SIE_EP6_CNT0_PTR -#define USBFS_1_SIE_EP6_CNT1 USBFS_1_SIE_EP6_CNT1_PTR -#define USBFS_1_SIE_EP6_CR0 USBFS_1_SIE_EP6_CR0_PTR - -#define USBFS_1_SIE_EP7_CNT0 USBFS_1_SIE_EP7_CNT0_PTR -#define USBFS_1_SIE_EP7_CNT1 USBFS_1_SIE_EP7_CNT1_PTR -#define USBFS_1_SIE_EP7_CR0 USBFS_1_SIE_EP7_CR0_PTR - -#define USBFS_1_SIE_EP8_CNT0 USBFS_1_SIE_EP8_CNT0_PTR -#define USBFS_1_SIE_EP8_CNT1 USBFS_1_SIE_EP8_CNT1_PTR -#define USBFS_1_SIE_EP8_CR0 USBFS_1_SIE_EP8_CR0_PTR - -#define USBFS_1_SOF0 USBFS_1_SOF0_PTR -#define USBFS_1_SOF1 USBFS_1_SOF1_PTR - -#define USBFS_1_USB_CLK_EN USBFS_1_USB_CLK_EN_PTR - -#define USBFS_1_USBIO_CR0 USBFS_1_USBIO_CR0_PTR -#define USBFS_1_USBIO_CR1 USBFS_1_USBIO_CR1_PTR -#define USBFS_1_USBIO_CR2 USBFS_1_USBIO_CR2_PTR - -#define USBFS_1_USB_MEM ((reg8 *) CYDEV_USB_MEM_BASE) - -#if(CYDEV_CHIP_DIE_EXPECT == CYDEV_CHIP_DIE_LEOPARD) - /* PSoC3 interrupt registers*/ - #define USBFS_1_USB_ISR_PRIOR ((reg8 *) CYDEV_INTC_PRIOR0) - #define USBFS_1_USB_ISR_SET_EN ((reg8 *) CYDEV_INTC_SET_EN0) - #define USBFS_1_USB_ISR_CLR_EN ((reg8 *) CYDEV_INTC_CLR_EN0) - #define USBFS_1_USB_ISR_VECT ((cyisraddress *) CYDEV_INTC_VECT_MBASE) -#elif(CYDEV_CHIP_DIE_EXPECT == CYDEV_CHIP_DIE_PANTHER) - /* PSoC5 interrupt registers*/ - #define USBFS_1_USB_ISR_PRIOR ((reg8 *) CYDEV_NVIC_PRI_0) - #define USBFS_1_USB_ISR_SET_EN ((reg8 *) CYDEV_NVIC_SETENA0) - #define USBFS_1_USB_ISR_CLR_EN ((reg8 *) CYDEV_NVIC_CLRENA0) - #define USBFS_1_USB_ISR_VECT ((cyisraddress *) CYDEV_NVIC_VECT_OFFSET) -#endif /* End CYDEV_CHIP_DIE_EXPECT */ - - -/*************************************** -* Interrupt vectors, masks and priorities -***************************************/ - -#define USBFS_1_BUS_RESET_PRIOR USBFS_1_bus_reset__INTC_PRIOR_NUM -#define USBFS_1_BUS_RESET_MASK USBFS_1_bus_reset__INTC_MASK -#define USBFS_1_BUS_RESET_VECT_NUM USBFS_1_bus_reset__INTC_NUMBER - -#define USBFS_1_SOF_PRIOR USBFS_1_sof_int__INTC_PRIOR_NUM -#define USBFS_1_SOF_MASK USBFS_1_sof_int__INTC_MASK -#define USBFS_1_SOF_VECT_NUM USBFS_1_sof_int__INTC_NUMBER - -#define USBFS_1_EP_0_PRIOR USBFS_1_ep_0__INTC_PRIOR_NUM -#define USBFS_1_EP_0_MASK USBFS_1_ep_0__INTC_MASK -#define USBFS_1_EP_0_VECT_NUM USBFS_1_ep_0__INTC_NUMBER - -#define USBFS_1_EP_1_PRIOR USBFS_1_ep_1__INTC_PRIOR_NUM -#define USBFS_1_EP_1_MASK USBFS_1_ep_1__INTC_MASK -#define USBFS_1_EP_1_VECT_NUM USBFS_1_ep_1__INTC_NUMBER - -#define USBFS_1_EP_2_PRIOR USBFS_1_ep_2__INTC_PRIOR_NUM -#define USBFS_1_EP_2_MASK USBFS_1_ep_2__INTC_MASK -#define USBFS_1_EP_2_VECT_NUM USBFS_1_ep_2__INTC_NUMBER - -#define USBFS_1_EP_3_PRIOR USBFS_1_ep_3__INTC_PRIOR_NUM -#define USBFS_1_EP_3_MASK USBFS_1_ep_3__INTC_MASK -#define USBFS_1_EP_3_VECT_NUM USBFS_1_ep_3__INTC_NUMBER - -#define USBFS_1_EP_4_PRIOR USBFS_1_ep_4__INTC_PRIOR_NUM -#define USBFS_1_EP_4_MASK USBFS_1_ep_4__INTC_MASK -#define USBFS_1_EP_4_VECT_NUM USBFS_1_ep_4__INTC_NUMBER - -#define USBFS_1_EP_5_PRIOR USBFS_1_ep_5__INTC_PRIOR_NUM -#define USBFS_1_EP_5_MASK USBFS_1_ep_5__INTC_MASK -#define USBFS_1_EP_5_VECT_NUM USBFS_1_ep_5__INTC_NUMBER - -#define USBFS_1_EP_6_PRIOR USBFS_1_ep_6__INTC_PRIOR_NUM -#define USBFS_1_EP_6_MASK USBFS_1_ep_6__INTC_MASK -#define USBFS_1_EP_6_VECT_NUM USBFS_1_ep_6__INTC_NUMBER - -#define USBFS_1_EP_7_PRIOR USBFS_1_ep_7__INTC_PRIOR_NUM -#define USBFS_1_EP_7_MASK USBFS_1_ep_7__INTC_MASK -#define USBFS_1_EP_7_VECT_NUM USBFS_1_ep_7__INTC_NUMBER - -#define USBFS_1_EP_8_PRIOR USBFS_1_ep_8__INTC_PRIOR_NUM -#define USBFS_1_EP_8_MASK USBFS_1_ep_8__INTC_MASK -#define USBFS_1_EP_8_VECT_NUM USBFS_1_ep_8__INTC_NUMBER - -#define USBFS_1_DP_INTC_PRIOR USBFS_1_dp_int__INTC_PRIOR_NUM -#define USBFS_1_DP_INTC_MASK USBFS_1_dp_int__INTC_MASK -#define USBFS_1_DP_INTC_VECT_NUM USBFS_1_dp_int__INTC_NUMBER - -/* ARB ISR should have higher priority from EP_X ISR, therefore it is defined to highest (0) */ -#define USBFS_1_ARB_PRIOR (0u) -#define USBFS_1_ARB_MASK USBFS_1_arb_int__INTC_MASK -#define USBFS_1_ARB_VECT_NUM USBFS_1_arb_int__INTC_NUMBER - -/*************************************** - * Endpoint 0 offsets (Table 9-2) - **************************************/ - -#define USBFS_1_bmRequestType USBFS_1_EP0_DR0_PTR -#define USBFS_1_bRequest USBFS_1_EP0_DR1_PTR -#define USBFS_1_wValue USBFS_1_EP0_DR2_PTR -#define USBFS_1_wValueHi USBFS_1_EP0_DR3_PTR -#define USBFS_1_wValueLo USBFS_1_EP0_DR2_PTR -#define USBFS_1_wIndex USBFS_1_EP0_DR4_PTR -#define USBFS_1_wIndexHi USBFS_1_EP0_DR5_PTR -#define USBFS_1_wIndexLo USBFS_1_EP0_DR4_PTR -#define USBFS_1_length USBFS_1_EP0_DR6_PTR -#define USBFS_1_lengthHi USBFS_1_EP0_DR7_PTR -#define USBFS_1_lengthLo USBFS_1_EP0_DR6_PTR - - -/*************************************** -* Register Constants -***************************************/ -#define USBFS_1_VDDD_MV CYDEV_VDDD_MV -#define USBFS_1_3500MV (3500u) - -#define USBFS_1_CR1_REG_ENABLE (0x01u) -#define USBFS_1_CR1_ENABLE_LOCK (0x02u) -#define USBFS_1_CR1_BUS_ACTIVITY_SHIFT (0x02u) -#define USBFS_1_CR1_BUS_ACTIVITY ((uint8)(0x01u << USBFS_1_CR1_BUS_ACTIVITY_SHIFT)) -#define USBFS_1_CR1_TRIM_MSB_EN (0x08u) - -#define USBFS_1_EP0_CNT_DATA_TOGGLE (0x80u) -#define USBFS_1_EPX_CNT_DATA_TOGGLE (0x80u) -#define USBFS_1_EPX_CNT0_MASK (0x0Fu) -#define USBFS_1_EPX_CNTX_MSB_MASK (0x07u) -#define USBFS_1_EPX_CNTX_ADDR_SHIFT (0x04u) -#define USBFS_1_EPX_CNTX_ADDR_OFFSET (0x10u) -#define USBFS_1_EPX_CNTX_CRC_COUNT (0x02u) -#define USBFS_1_EPX_DATA_BUF_MAX (512u) - -#define USBFS_1_CR0_ENABLE (0x80u) - -/* A 100 KHz clock is used for BUS reset count. Recommended is to count 10 pulses */ -#define USBFS_1_BUS_RST_COUNT (0x0au) - -#define USBFS_1_USBIO_CR1_IOMODE (0x20u) -#define USBFS_1_USBIO_CR1_USBPUEN (0x04u) -#define USBFS_1_USBIO_CR1_DP0 (0x02u) -#define USBFS_1_USBIO_CR1_DM0 (0x01u) - -#define USBFS_1_USBIO_CR0_TEN (0x80u) -#define USBFS_1_USBIO_CR0_TSE0 (0x40u) -#define USBFS_1_USBIO_CR0_TD (0x20u) -#define USBFS_1_USBIO_CR0_RD (0x01u) - -#define USBFS_1_FASTCLK_IMO_CR_USBCLK_ON (0x40u) -#define USBFS_1_FASTCLK_IMO_CR_XCLKEN (0x20u) -#define USBFS_1_FASTCLK_IMO_CR_FX2ON (0x10u) - -#define USBFS_1_ARB_EPX_CFG_RESET (0x08u) -#define USBFS_1_ARB_EPX_CFG_CRC_BYPASS (0x04u) -#define USBFS_1_ARB_EPX_CFG_DMA_REQ (0x02u) -#define USBFS_1_ARB_EPX_CFG_IN_DATA_RDY (0x01u) - -#define USBFS_1_ARB_EPX_SR_IN_BUF_FULL (0x01u) -#define USBFS_1_ARB_EPX_SR_DMA_GNT (0x02u) -#define USBFS_1_ARB_EPX_SR_BUF_OVER (0x04u) -#define USBFS_1_ARB_EPX_SR_BUF_UNDER (0x08u) - -#define USBFS_1_ARB_CFG_AUTO_MEM (0x10u) -#define USBFS_1_ARB_CFG_MANUAL_DMA (0x20u) -#define USBFS_1_ARB_CFG_AUTO_DMA (0x40u) -#define USBFS_1_ARB_CFG_CFG_CPM (0x80u) - -#if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - #define USBFS_1_ARB_EPX_INT_MASK (0x1Du) -#else - #define USBFS_1_ARB_EPX_INT_MASK (0x1Fu) -#endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ -#define USBFS_1_ARB_INT_MASK (uint8)((USBFS_1_DMA1_REMOVE ^ 1u) | \ - (uint8)((USBFS_1_DMA2_REMOVE ^ 1u) << 1u) | \ - (uint8)((USBFS_1_DMA3_REMOVE ^ 1u) << 2u) | \ - (uint8)((USBFS_1_DMA4_REMOVE ^ 1u) << 3u) | \ - (uint8)((USBFS_1_DMA5_REMOVE ^ 1u) << 4u) | \ - (uint8)((USBFS_1_DMA6_REMOVE ^ 1u) << 5u) | \ - (uint8)((USBFS_1_DMA7_REMOVE ^ 1u) << 6u) | \ - (uint8)((USBFS_1_DMA8_REMOVE ^ 1u) << 7u) ) - -#define USBFS_1_SIE_EP_INT_EP1_MASK (0x01u) -#define USBFS_1_SIE_EP_INT_EP2_MASK (0x02u) -#define USBFS_1_SIE_EP_INT_EP3_MASK (0x04u) -#define USBFS_1_SIE_EP_INT_EP4_MASK (0x08u) -#define USBFS_1_SIE_EP_INT_EP5_MASK (0x10u) -#define USBFS_1_SIE_EP_INT_EP6_MASK (0x20u) -#define USBFS_1_SIE_EP_INT_EP7_MASK (0x40u) -#define USBFS_1_SIE_EP_INT_EP8_MASK (0x80u) - -#define USBFS_1_PM_ACT_EN_FSUSB USBFS_1_USB__PM_ACT_MSK -#define USBFS_1_PM_STBY_EN_FSUSB USBFS_1_USB__PM_STBY_MSK -#define USBFS_1_PM_AVAIL_EN_FSUSBIO (0x10u) - -#define USBFS_1_PM_USB_CR0_REF_EN (0x01u) -#define USBFS_1_PM_USB_CR0_PD_N (0x02u) -#define USBFS_1_PM_USB_CR0_PD_PULLUP_N (0x04u) - -#define USBFS_1_USB_CLK_ENABLE (0x01u) - -#define USBFS_1_DM_MASK USBFS_1_Dm__0__MASK -#define USBFS_1_DP_MASK USBFS_1_Dp__0__MASK - -#define USBFS_1_DYN_RECONFIG_ENABLE (0x01u) -#define USBFS_1_DYN_RECONFIG_EP_SHIFT (0x01u) -#define USBFS_1_DYN_RECONFIG_RDY_STS (0x10u) - - -#endif /* End CY_USBFS_USBFS_1_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.c deleted file mode 100644 index 06f93275..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.c +++ /dev/null @@ -1,137 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_Dm.c -* Version 1.90 -* -* Description: -* This file contains API to enable firmware control of a Pins component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "cytypes.h" -#include "USBFS_1_Dm.h" - -/* APIs are not generated for P15[7:6] on PSoC 5 */ -#if !(CY_PSOC5A &&\ - USBFS_1_Dm__PORT == 15 && ((USBFS_1_Dm__MASK & 0xC0) != 0)) - - -/******************************************************************************* -* Function Name: USBFS_1_Dm_Write -******************************************************************************** -* -* Summary: -* Assign a new value to the digital port's data output register. -* -* Parameters: -* prtValue: The value to be assigned to the Digital Port. -* -* Return: -* None -* -*******************************************************************************/ -void USBFS_1_Dm_Write(uint8 value) -{ - uint8 staticBits = (USBFS_1_Dm_DR & (uint8)(~USBFS_1_Dm_MASK)); - USBFS_1_Dm_DR = staticBits | ((uint8)(value << USBFS_1_Dm_SHIFT) & USBFS_1_Dm_MASK); -} - - -/******************************************************************************* -* Function Name: USBFS_1_Dm_SetDriveMode -******************************************************************************** -* -* Summary: -* Change the drive mode on the pins of the port. -* -* Parameters: -* mode: Change the pins to this drive mode. -* -* Return: -* None -* -*******************************************************************************/ -void USBFS_1_Dm_SetDriveMode(uint8 mode) -{ - CyPins_SetPinDriveMode(USBFS_1_Dm_0, mode); -} - - -/******************************************************************************* -* Function Name: USBFS_1_Dm_Read -******************************************************************************** -* -* Summary: -* Read the current value on the pins of the Digital Port in right justified -* form. -* -* Parameters: -* None -* -* Return: -* Returns the current value of the Digital Port as a right justified number -* -* Note: -* Macro USBFS_1_Dm_ReadPS calls this function. -* -*******************************************************************************/ -uint8 USBFS_1_Dm_Read(void) -{ - return (USBFS_1_Dm_PS & USBFS_1_Dm_MASK) >> USBFS_1_Dm_SHIFT; -} - - -/******************************************************************************* -* Function Name: USBFS_1_Dm_ReadDataReg -******************************************************************************** -* -* Summary: -* Read the current value assigned to a Digital Port's data output register -* -* Parameters: -* None -* -* Return: -* Returns the current value assigned to the Digital Port's data output register -* -*******************************************************************************/ -uint8 USBFS_1_Dm_ReadDataReg(void) -{ - return (USBFS_1_Dm_DR & USBFS_1_Dm_MASK) >> USBFS_1_Dm_SHIFT; -} - - -/* If Interrupts Are Enabled for this Pins component */ -#if defined(USBFS_1_Dm_INTSTAT) - - /******************************************************************************* - * Function Name: USBFS_1_Dm_ClearInterrupt - ******************************************************************************** - * Summary: - * Clears any active interrupts attached to port and returns the value of the - * interrupt status register. - * - * Parameters: - * None - * - * Return: - * Returns the value of the interrupt status register - * - *******************************************************************************/ - uint8 USBFS_1_Dm_ClearInterrupt(void) - { - return (USBFS_1_Dm_INTSTAT & USBFS_1_Dm_MASK) >> USBFS_1_Dm_SHIFT; - } - -#endif /* If Interrupts Are Enabled for this Pins component */ - -#endif /* CY_PSOC5A... */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.h deleted file mode 100644 index b331e92a..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_Dm.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_USBFS_1_Dm_H) /* Pins USBFS_1_Dm_H */ -#define CY_PINS_USBFS_1_Dm_H - -#include "cytypes.h" -#include "cyfitter.h" -#include "cypins.h" -#include "USBFS_1_Dm_aliases.h" - -/* Check to see if required defines such as CY_PSOC5A are available */ -/* They are defined starting with cy_boot v3.0 */ -#if !defined (CY_PSOC5A) - #error Component cy_pins_v1_90 requires cy_boot v3.0 or later -#endif /* (CY_PSOC5A) */ - -/* APIs are not generated for P15[7:6] */ -#if !(CY_PSOC5A &&\ - USBFS_1_Dm__PORT == 15 && ((USBFS_1_Dm__MASK & 0xC0) != 0)) - - -/*************************************** -* Function Prototypes -***************************************/ - -void USBFS_1_Dm_Write(uint8 value) ; -void USBFS_1_Dm_SetDriveMode(uint8 mode) ; -uint8 USBFS_1_Dm_ReadDataReg(void) ; -uint8 USBFS_1_Dm_Read(void) ; -uint8 USBFS_1_Dm_ClearInterrupt(void) ; - - -/*************************************** -* API Constants -***************************************/ - -/* Drive Modes */ -#define USBFS_1_Dm_DM_ALG_HIZ PIN_DM_ALG_HIZ -#define USBFS_1_Dm_DM_DIG_HIZ PIN_DM_DIG_HIZ -#define USBFS_1_Dm_DM_RES_UP PIN_DM_RES_UP -#define USBFS_1_Dm_DM_RES_DWN PIN_DM_RES_DWN -#define USBFS_1_Dm_DM_OD_LO PIN_DM_OD_LO -#define USBFS_1_Dm_DM_OD_HI PIN_DM_OD_HI -#define USBFS_1_Dm_DM_STRONG PIN_DM_STRONG -#define USBFS_1_Dm_DM_RES_UPDWN PIN_DM_RES_UPDWN - -/* Digital Port Constants */ -#define USBFS_1_Dm_MASK USBFS_1_Dm__MASK -#define USBFS_1_Dm_SHIFT USBFS_1_Dm__SHIFT -#define USBFS_1_Dm_WIDTH 1u - - -/*************************************** -* Registers -***************************************/ - -/* Main Port Registers */ -/* Pin State */ -#define USBFS_1_Dm_PS (* (reg8 *) USBFS_1_Dm__PS) -/* Data Register */ -#define USBFS_1_Dm_DR (* (reg8 *) USBFS_1_Dm__DR) -/* Port Number */ -#define USBFS_1_Dm_PRT_NUM (* (reg8 *) USBFS_1_Dm__PRT) -/* Connect to Analog Globals */ -#define USBFS_1_Dm_AG (* (reg8 *) USBFS_1_Dm__AG) -/* Analog MUX bux enable */ -#define USBFS_1_Dm_AMUX (* (reg8 *) USBFS_1_Dm__AMUX) -/* Bidirectional Enable */ -#define USBFS_1_Dm_BIE (* (reg8 *) USBFS_1_Dm__BIE) -/* Bit-mask for Aliased Register Access */ -#define USBFS_1_Dm_BIT_MASK (* (reg8 *) USBFS_1_Dm__BIT_MASK) -/* Bypass Enable */ -#define USBFS_1_Dm_BYP (* (reg8 *) USBFS_1_Dm__BYP) -/* Port wide control signals */ -#define USBFS_1_Dm_CTL (* (reg8 *) USBFS_1_Dm__CTL) -/* Drive Modes */ -#define USBFS_1_Dm_DM0 (* (reg8 *) USBFS_1_Dm__DM0) -#define USBFS_1_Dm_DM1 (* (reg8 *) USBFS_1_Dm__DM1) -#define USBFS_1_Dm_DM2 (* (reg8 *) USBFS_1_Dm__DM2) -/* Input Buffer Disable Override */ -#define USBFS_1_Dm_INP_DIS (* (reg8 *) USBFS_1_Dm__INP_DIS) -/* LCD Common or Segment Drive */ -#define USBFS_1_Dm_LCD_COM_SEG (* (reg8 *) USBFS_1_Dm__LCD_COM_SEG) -/* Enable Segment LCD */ -#define USBFS_1_Dm_LCD_EN (* (reg8 *) USBFS_1_Dm__LCD_EN) -/* Slew Rate Control */ -#define USBFS_1_Dm_SLW (* (reg8 *) USBFS_1_Dm__SLW) - -/* DSI Port Registers */ -/* Global DSI Select Register */ -#define USBFS_1_Dm_PRTDSI__CAPS_SEL (* (reg8 *) USBFS_1_Dm__PRTDSI__CAPS_SEL) -/* Double Sync Enable */ -#define USBFS_1_Dm_PRTDSI__DBL_SYNC_IN (* (reg8 *) USBFS_1_Dm__PRTDSI__DBL_SYNC_IN) -/* Output Enable Select Drive Strength */ -#define USBFS_1_Dm_PRTDSI__OE_SEL0 (* (reg8 *) USBFS_1_Dm__PRTDSI__OE_SEL0) -#define USBFS_1_Dm_PRTDSI__OE_SEL1 (* (reg8 *) USBFS_1_Dm__PRTDSI__OE_SEL1) -/* Port Pin Output Select Registers */ -#define USBFS_1_Dm_PRTDSI__OUT_SEL0 (* (reg8 *) USBFS_1_Dm__PRTDSI__OUT_SEL0) -#define USBFS_1_Dm_PRTDSI__OUT_SEL1 (* (reg8 *) USBFS_1_Dm__PRTDSI__OUT_SEL1) -/* Sync Output Enable Registers */ -#define USBFS_1_Dm_PRTDSI__SYNC_OUT (* (reg8 *) USBFS_1_Dm__PRTDSI__SYNC_OUT) - - -#if defined(USBFS_1_Dm__INTSTAT) /* Interrupt Registers */ - - #define USBFS_1_Dm_INTSTAT (* (reg8 *) USBFS_1_Dm__INTSTAT) - #define USBFS_1_Dm_SNAP (* (reg8 *) USBFS_1_Dm__SNAP) - -#endif /* Interrupt Registers */ - -#endif /* CY_PSOC5A... */ - -#endif /* CY_PINS_USBFS_1_Dm_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm_aliases.h deleted file mode 100644 index c1e61450..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dm_aliases.h +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_Dm.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_USBFS_1_Dm_ALIASES_H) /* Pins USBFS_1_Dm_ALIASES_H */ -#define CY_PINS_USBFS_1_Dm_ALIASES_H - -#include "cytypes.h" -#include "cyfitter.h" - - - -/*************************************** -* Constants -***************************************/ -#define USBFS_1_Dm_0 USBFS_1_Dm__0__PC - -#endif /* End Pins USBFS_1_Dm_ALIASES_H */ - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.c deleted file mode 100644 index e8055972..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.c +++ /dev/null @@ -1,137 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_Dp.c -* Version 1.90 -* -* Description: -* This file contains API to enable firmware control of a Pins component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "cytypes.h" -#include "USBFS_1_Dp.h" - -/* APIs are not generated for P15[7:6] on PSoC 5 */ -#if !(CY_PSOC5A &&\ - USBFS_1_Dp__PORT == 15 && ((USBFS_1_Dp__MASK & 0xC0) != 0)) - - -/******************************************************************************* -* Function Name: USBFS_1_Dp_Write -******************************************************************************** -* -* Summary: -* Assign a new value to the digital port's data output register. -* -* Parameters: -* prtValue: The value to be assigned to the Digital Port. -* -* Return: -* None -* -*******************************************************************************/ -void USBFS_1_Dp_Write(uint8 value) -{ - uint8 staticBits = (USBFS_1_Dp_DR & (uint8)(~USBFS_1_Dp_MASK)); - USBFS_1_Dp_DR = staticBits | ((uint8)(value << USBFS_1_Dp_SHIFT) & USBFS_1_Dp_MASK); -} - - -/******************************************************************************* -* Function Name: USBFS_1_Dp_SetDriveMode -******************************************************************************** -* -* Summary: -* Change the drive mode on the pins of the port. -* -* Parameters: -* mode: Change the pins to this drive mode. -* -* Return: -* None -* -*******************************************************************************/ -void USBFS_1_Dp_SetDriveMode(uint8 mode) -{ - CyPins_SetPinDriveMode(USBFS_1_Dp_0, mode); -} - - -/******************************************************************************* -* Function Name: USBFS_1_Dp_Read -******************************************************************************** -* -* Summary: -* Read the current value on the pins of the Digital Port in right justified -* form. -* -* Parameters: -* None -* -* Return: -* Returns the current value of the Digital Port as a right justified number -* -* Note: -* Macro USBFS_1_Dp_ReadPS calls this function. -* -*******************************************************************************/ -uint8 USBFS_1_Dp_Read(void) -{ - return (USBFS_1_Dp_PS & USBFS_1_Dp_MASK) >> USBFS_1_Dp_SHIFT; -} - - -/******************************************************************************* -* Function Name: USBFS_1_Dp_ReadDataReg -******************************************************************************** -* -* Summary: -* Read the current value assigned to a Digital Port's data output register -* -* Parameters: -* None -* -* Return: -* Returns the current value assigned to the Digital Port's data output register -* -*******************************************************************************/ -uint8 USBFS_1_Dp_ReadDataReg(void) -{ - return (USBFS_1_Dp_DR & USBFS_1_Dp_MASK) >> USBFS_1_Dp_SHIFT; -} - - -/* If Interrupts Are Enabled for this Pins component */ -#if defined(USBFS_1_Dp_INTSTAT) - - /******************************************************************************* - * Function Name: USBFS_1_Dp_ClearInterrupt - ******************************************************************************** - * Summary: - * Clears any active interrupts attached to port and returns the value of the - * interrupt status register. - * - * Parameters: - * None - * - * Return: - * Returns the value of the interrupt status register - * - *******************************************************************************/ - uint8 USBFS_1_Dp_ClearInterrupt(void) - { - return (USBFS_1_Dp_INTSTAT & USBFS_1_Dp_MASK) >> USBFS_1_Dp_SHIFT; - } - -#endif /* If Interrupts Are Enabled for this Pins component */ - -#endif /* CY_PSOC5A... */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.h deleted file mode 100644 index bbda80a4..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_Dp.h +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_Dp.h -* Version 1.90 -* -* Description: -* This file containts Control Register function prototypes and register defines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_PINS_USBFS_1_Dp_H) /* Pins USBFS_1_Dp_H */ -#define CY_PINS_USBFS_1_Dp_H - -#include "cytypes.h" -#include "cyfitter.h" -#include "cypins.h" -#include "USBFS_1_Dp_aliases.h" - -/* Check to see if required defines such as CY_PSOC5A are available */ -/* They are defined starting with cy_boot v3.0 */ -#if !defined (CY_PSOC5A) - #error Component cy_pins_v1_90 requires cy_boot v3.0 or later -#endif /* (CY_PSOC5A) */ - -/* APIs are not generated for P15[7:6] */ -#if !(CY_PSOC5A &&\ - USBFS_1_Dp__PORT == 15 && ((USBFS_1_Dp__MASK & 0xC0) != 0)) - - -/*************************************** -* Function Prototypes -***************************************/ - -void USBFS_1_Dp_Write(uint8 value) ; -void USBFS_1_Dp_SetDriveMode(uint8 mode) ; -uint8 USBFS_1_Dp_ReadDataReg(void) ; -uint8 USBFS_1_Dp_Read(void) ; -uint8 USBFS_1_Dp_ClearInterrupt(void) ; - - -/*************************************** -* API Constants -***************************************/ - -/* Drive Modes */ -#define USBFS_1_Dp_DM_ALG_HIZ PIN_DM_ALG_HIZ -#define USBFS_1_Dp_DM_DIG_HIZ PIN_DM_DIG_HIZ -#define USBFS_1_Dp_DM_RES_UP PIN_DM_RES_UP -#define USBFS_1_Dp_DM_RES_DWN PIN_DM_RES_DWN -#define USBFS_1_Dp_DM_OD_LO PIN_DM_OD_LO -#define USBFS_1_Dp_DM_OD_HI PIN_DM_OD_HI -#define USBFS_1_Dp_DM_STRONG PIN_DM_STRONG -#define USBFS_1_Dp_DM_RES_UPDWN PIN_DM_RES_UPDWN - -/* Digital Port Constants */ -#define USBFS_1_Dp_MASK USBFS_1_Dp__MASK -#define USBFS_1_Dp_SHIFT USBFS_1_Dp__SHIFT -#define USBFS_1_Dp_WIDTH 1u - - -/*************************************** -* Registers -***************************************/ - -/* Main Port Registers */ -/* Pin State */ -#define USBFS_1_Dp_PS (* (reg8 *) USBFS_1_Dp__PS) -/* Data Register */ -#define USBFS_1_Dp_DR (* (reg8 *) USBFS_1_Dp__DR) -/* Port Number */ -#define USBFS_1_Dp_PRT_NUM (* (reg8 *) USBFS_1_Dp__PRT) -/* Connect to Analog Globals */ -#define USBFS_1_Dp_AG (* (reg8 *) USBFS_1_Dp__AG) -/* Analog MUX bux enable */ -#define USBFS_1_Dp_AMUX (* (reg8 *) USBFS_1_Dp__AMUX) -/* Bidirectional Enable */ -#define USBFS_1_Dp_BIE (* (reg8 *) USBFS_1_Dp__BIE) -/* Bit-mask for Aliased Register Access */ -#define USBFS_1_Dp_BIT_MASK (* (reg8 *) USBFS_1_Dp__BIT_MASK) -/* Bypass Enable */ -#define USBFS_1_Dp_BYP (* (reg8 *) USBFS_1_Dp__BYP) -/* Port wide control signals */ -#define USBFS_1_Dp_CTL (* (reg8 *) USBFS_1_Dp__CTL) -/* Drive Modes */ -#define USBFS_1_Dp_DM0 (* (reg8 *) USBFS_1_Dp__DM0) -#define USBFS_1_Dp_DM1 (* (reg8 *) USBFS_1_Dp__DM1) -#define USBFS_1_Dp_DM2 (* (reg8 *) USBFS_1_Dp__DM2) -/* Input Buffer Disable Override */ -#define USBFS_1_Dp_INP_DIS (* (reg8 *) USBFS_1_Dp__INP_DIS) -/* LCD Common or Segment Drive */ -#define USBFS_1_Dp_LCD_COM_SEG (* (reg8 *) USBFS_1_Dp__LCD_COM_SEG) -/* Enable Segment LCD */ -#define USBFS_1_Dp_LCD_EN (* (reg8 *) USBFS_1_Dp__LCD_EN) -/* Slew Rate Control */ -#define USBFS_1_Dp_SLW (* (reg8 *) USBFS_1_Dp__SLW) - -/* DSI Port Registers */ -/* Global DSI Select Register */ -#define USBFS_1_Dp_PRTDSI__CAPS_SEL (* (reg8 *) USBFS_1_Dp__PRTDSI__CAPS_SEL) -/* Double Sync Enable */ -#define USBFS_1_Dp_PRTDSI__DBL_SYNC_IN (* (reg8 *) USBFS_1_Dp__PRTDSI__DBL_SYNC_IN) -/* Output Enable Select Drive Strength */ -#define USBFS_1_Dp_PRTDSI__OE_SEL0 (* (reg8 *) USBFS_1_Dp__PRTDSI__OE_SEL0) -#define USBFS_1_Dp_PRTDSI__OE_SEL1 (* (reg8 *) USBFS_1_Dp__PRTDSI__OE_SEL1) -/* Port Pin Output Select Registers */ -#define USBFS_1_Dp_PRTDSI__OUT_SEL0 (* (reg8 *) USBFS_1_Dp__PRTDSI__OUT_SEL0) -#define USBFS_1_Dp_PRTDSI__OUT_SEL1 (* (reg8 *) USBFS_1_Dp__PRTDSI__OUT_SEL1) -/* Sync Output Enable Registers */ -#define USBFS_1_Dp_PRTDSI__SYNC_OUT (* (reg8 *) USBFS_1_Dp__PRTDSI__SYNC_OUT) - - -#if defined(USBFS_1_Dp__INTSTAT) /* Interrupt Registers */ - - #define USBFS_1_Dp_INTSTAT (* (reg8 *) USBFS_1_Dp__INTSTAT) - #define USBFS_1_Dp_SNAP (* (reg8 *) USBFS_1_Dp__SNAP) - -#endif /* Interrupt Registers */ - -#endif /* CY_PSOC5A... */ - -#endif /* CY_PINS_USBFS_1_Dp_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.c deleted file mode 100644 index 03db53e7..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.c +++ /dev/null @@ -1,318 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_audio.c -* Version 2.60 -* -* Description: -* USB AUDIO Class request handler. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" - -#if defined(USBFS_1_ENABLE_AUDIO_CLASS) - -#include "USBFS_1_audio.h" -#include "USBFS_1_pvt.h" -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) - #include "USBFS_1_midi.h" -#endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - - -/*************************************** -* Custom Declarations -***************************************/ - -/* `#START CUSTOM_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -#if !defined(USER_SUPPLIED_AUDIO_HANDLER) - - -/*************************************** -* AUDIO Variables -***************************************/ - -#if defined(USBFS_1_ENABLE_AUDIO_STREAMING) - volatile uint8 USBFS_1_currentSampleFrequency[USBFS_1_MAX_EP][USBFS_1_SAMPLE_FREQ_LEN]; - volatile uint8 USBFS_1_frequencyChanged; - volatile uint8 USBFS_1_currentMute; - volatile uint8 USBFS_1_currentVolume[USBFS_1_VOLUME_LEN]; - volatile uint8 USBFS_1_minimumVolume[USBFS_1_VOLUME_LEN] = {USBFS_1_VOL_MIN_LSB, - USBFS_1_VOL_MIN_MSB}; - volatile uint8 USBFS_1_maximumVolume[USBFS_1_VOLUME_LEN] = {USBFS_1_VOL_MAX_LSB, - USBFS_1_VOL_MAX_MSB}; - volatile uint8 USBFS_1_resolutionVolume[USBFS_1_VOLUME_LEN] = {USBFS_1_VOL_RES_LSB, - USBFS_1_VOL_RES_MSB}; -#endif /* End USBFS_1_ENABLE_AUDIO_STREAMING */ - - -/******************************************************************************* -* Function Name: USBFS_1_DispatchAUDIOClassRqst -******************************************************************************** -* -* Summary: -* This routine dispatches class requests -* -* Parameters: -* None. -* -* Return: -* requestHandled -* -* Global variables: -* USBFS_1_currentSampleFrequency: Contains the current audio Sample -* Frequency. It is set by the Host using SET_CUR request to the endpoint. -* USBFS_1_frequencyChanged: This variable is used as a flag for the -* user code, to be aware that Host has been sent request for changing -* Sample Frequency. Sample frequency will be sent on the next OUT -* transaction. It is contains endpoint address when set. The following -* code is recommended for detecting new Sample Frequency in main code: -* if((USBFS_1_frequencyChanged != 0) && -* (USBFS_1_transferState == USBFS_1_TRANS_STATE_IDLE)) -* { -* USBFS_1_frequencyChanged = 0; -* } -* USBFS_1_transferState variable is checked to be sure that -* transfer completes. -* USBFS_1_currentMute: Contains mute configuration set by Host. -* USBFS_1_currentVolume: Contains volume level set by Host. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_DispatchAUDIOClassRqst(void) -{ - uint8 requestHandled = USBFS_1_FALSE; - - #if defined(USBFS_1_ENABLE_AUDIO_STREAMING) - uint8 epNumber; - epNumber = CY_GET_REG8(USBFS_1_wIndexLo) & USBFS_1_DIR_UNUSED; - #endif /* End USBFS_1_ENABLE_AUDIO_STREAMING */ - - if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == USBFS_1_RQST_DIR_D2H) - { - /* Control Read */ - if((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) == \ - USBFS_1_RQST_RCPT_EP) - { - /* Endpoint */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_GET_CUR: - #if defined(USBFS_1_ENABLE_AUDIO_STREAMING) - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_SAMPLING_FREQ_CONTROL) - { - /* Endpoint Control Selector is Sampling Frequency */ - USBFS_1_currentTD.wCount = USBFS_1_SAMPLE_FREQ_LEN; - USBFS_1_currentTD.pData = USBFS_1_currentSampleFrequency[epNumber]; - requestHandled = USBFS_1_InitControlRead(); - } - #endif /* End USBFS_1_ENABLE_AUDIO_STREAMING */ - - /* `#START AUDIO_READ_REQUESTS` Place other request handler here */ - - /* `#END` */ - break; - default: - break; - } - } - else if((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) == \ - USBFS_1_RQST_RCPT_IFC) - { - /* Interface or Entity ID */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_GET_CUR: - #if defined(USBFS_1_ENABLE_AUDIO_STREAMING) - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_MUTE_CONTROL) - { - /* `#START MUTE_CONTROL_GET_REQUEST` Place multi-channel handler here */ - - /* `#END` */ - - /* Entity ID Control Selector is MUTE */ - USBFS_1_currentTD.wCount = 1u; - USBFS_1_currentTD.pData = &USBFS_1_currentMute; - requestHandled = USBFS_1_InitControlRead(); - } - else if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_VOLUME_CONTROL) - { - /* `#START VOLUME_CONTROL_GET_REQUEST` Place multi-channel handler here */ - - /* `#END` */ - - /* Entity ID Control Selector is VOLUME, */ - USBFS_1_currentTD.wCount = USBFS_1_VOLUME_LEN; - USBFS_1_currentTD.pData = USBFS_1_currentVolume; - requestHandled = USBFS_1_InitControlRead(); - } - else - { - /* `#START OTHER_GET_CUR_REQUESTS` Place other request handler here */ - - /* `#END` */ - } - break; - case USBFS_1_GET_MIN: /* GET_MIN */ - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_VOLUME_CONTROL) - { - /* Entity ID Control Selector is VOLUME, */ - USBFS_1_currentTD.wCount = USBFS_1_VOLUME_LEN; - USBFS_1_currentTD.pData = &USBFS_1_minimumVolume[0]; - requestHandled = USBFS_1_InitControlRead(); - } - break; - case USBFS_1_GET_MAX: /* GET_MAX */ - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_VOLUME_CONTROL) - { - /* Entity ID Control Selector is VOLUME, */ - USBFS_1_currentTD.wCount = USBFS_1_VOLUME_LEN; - USBFS_1_currentTD.pData = &USBFS_1_maximumVolume[0]; - requestHandled = USBFS_1_InitControlRead(); - } - break; - case USBFS_1_GET_RES: /* GET_RES */ - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_VOLUME_CONTROL) - { - /* Entity ID Control Selector is VOLUME, */ - USBFS_1_currentTD.wCount = USBFS_1_VOLUME_LEN; - USBFS_1_currentTD.pData = &USBFS_1_resolutionVolume[0]; - requestHandled = USBFS_1_InitControlRead(); - } - break; - /* The contents of the status message is reserved for future use. - * For the time being, a null packet should be returned in the data stage of the - * control transfer, and the received null packet should be ACKed. - */ - case USBFS_1_GET_STAT: - USBFS_1_currentTD.wCount = 0u; - requestHandled = USBFS_1_InitControlWrite(); - - #endif /* End USBFS_1_ENABLE_AUDIO_STREAMING */ - - /* `#START AUDIO_WRITE_REQUESTS` Place other request handler here */ - - /* `#END` */ - break; - default: - break; - } - } - else - { /* USBFS_1_RQST_RCPT_OTHER */ - } - } - else if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == \ - USBFS_1_RQST_DIR_H2D) - { - /* Control Write */ - if((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) == \ - USBFS_1_RQST_RCPT_EP) - { - /* Endpoint */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_SET_CUR: - #if defined(USBFS_1_ENABLE_AUDIO_STREAMING) - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_SAMPLING_FREQ_CONTROL) - { - /* Endpoint Control Selector is Sampling Frequency */ - USBFS_1_currentTD.wCount = USBFS_1_SAMPLE_FREQ_LEN; - USBFS_1_currentTD.pData = USBFS_1_currentSampleFrequency[epNumber]; - requestHandled = USBFS_1_InitControlWrite(); - USBFS_1_frequencyChanged = epNumber; - } - #endif /* End USBFS_1_ENABLE_AUDIO_STREAMING */ - - /* `#START AUDIO_SAMPLING_FREQ_REQUESTS` Place other request handler here */ - - /* `#END` */ - break; - default: - break; - } - } - else if((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) == \ - USBFS_1_RQST_RCPT_IFC) - { - /* Interface or Entity ID */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_SET_CUR: - #if defined(USBFS_1_ENABLE_AUDIO_STREAMING) - if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_MUTE_CONTROL) - { - /* `#START MUTE_SET_REQUEST` Place multi-channel handler here */ - - /* `#END` */ - - /* Entity ID Control Selector is MUTE */ - USBFS_1_currentTD.wCount = 1u; - USBFS_1_currentTD.pData = &USBFS_1_currentMute; - requestHandled = USBFS_1_InitControlWrite(); - } - else if(CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_VOLUME_CONTROL) - { - /* `#START VOLUME_CONTROL_SET_REQUEST` Place multi-channel handler here */ - - /* `#END` */ - - /* Entity ID Control Selector is VOLUME */ - USBFS_1_currentTD.wCount = USBFS_1_VOLUME_LEN; - USBFS_1_currentTD.pData = USBFS_1_currentVolume; - requestHandled = USBFS_1_InitControlWrite(); - } - else - { - /* `#START OTHER_SET_CUR_REQUESTS` Place other request handler here */ - - /* `#END` */ - } - #endif /* End USBFS_1_ENABLE_AUDIO_STREAMING */ - - /* `#START AUDIO_CONTROL_SEL_REQUESTS` Place other request handler here */ - - /* `#END` */ - break; - default: - break; - } - } - else - { /* USBFS_1_RQST_RCPT_OTHER */ - } - } - else - { /* requestHandled is initialized as FALSE by default */ - } - - return(requestHandled); -} - - -#endif /* USER_SUPPLIED_AUDIO_HANDLER */ - - -/******************************************************************************* -* Additional user functions supporting AUDIO Requests -********************************************************************************/ - -/* `#START AUDIO_FUNCTIONS` Place any additional functions here */ - -/* `#END` */ - -#endif /* End USBFS_1_ENABLE_AUDIO_CLASS*/ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.h deleted file mode 100644 index 613d8c1e..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_audio.h +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_audio.h -* Version 2.60 -* -* Description: -* Header File for the USFS component. Contains prototypes and constant values. -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_USBFS_USBFS_1_audio_H) -#define CY_USBFS_USBFS_1_audio_H - -#include "cytypes.h" - - -/*************************************** -* Custom Declarations -***************************************/ - -/* `#START CUSTOM_CONSTANTS` Place your declaration here */ - -/* `#END` */ - - -/*************************************** -* Constants for USBFS_1_audio API. -***************************************/ - -/* Audio Class-Specific Request Codes (AUDIO Table A-9) */ -#define USBFS_1_REQUEST_CODE_UNDEFINED (0x00u) -#define USBFS_1_SET_CUR (0x01u) -#define USBFS_1_GET_CUR (0x81u) -#define USBFS_1_SET_MIN (0x02u) -#define USBFS_1_GET_MIN (0x82u) -#define USBFS_1_SET_MAX (0x03u) -#define USBFS_1_GET_MAX (0x83u) -#define USBFS_1_SET_RES (0x04u) -#define USBFS_1_GET_RES (0x84u) -#define USBFS_1_SET_MEM (0x05u) -#define USBFS_1_GET_MEM (0x85u) -#define USBFS_1_GET_STAT (0xFFu) - -/* Endpoint Control Selectors (AUDIO Table A-19) */ -#define USBFS_1_EP_CONTROL_UNDEFINED (0x00u) -#define USBFS_1_SAMPLING_FREQ_CONTROL (0x01u) -#define USBFS_1_PITCH_CONTROL (0x02u) - -/* Feature Unit Control Selectors (AUDIO Table A-11) */ -#define USBFS_1_FU_CONTROL_UNDEFINED (0x00u) -#define USBFS_1_MUTE_CONTROL (0x01u) -#define USBFS_1_VOLUME_CONTROL (0x02u) -#define USBFS_1_BASS_CONTROL (0x03u) -#define USBFS_1_MID_CONTROL (0x04u) -#define USBFS_1_TREBLE_CONTROL (0x05u) -#define USBFS_1_GRAPHIC_EQUALIZER_CONTROL (0x06u) -#define USBFS_1_AUTOMATIC_GAIN_CONTROL (0x07u) -#define USBFS_1_DELAY_CONTROL (0x08u) -#define USBFS_1_BASS_BOOST_CONTROL (0x09u) -#define USBFS_1_LOUDNESS_CONTROL (0x0Au) - -#define USBFS_1_SAMPLE_FREQ_LEN (3u) -#define USBFS_1_VOLUME_LEN (2u) - -#if !defined(USER_SUPPLIED_DEFAULT_VOLUME_VALUE) - #define USBFS_1_VOL_MIN_MSB (0x80u) - #define USBFS_1_VOL_MIN_LSB (0x01u) - #define USBFS_1_VOL_MAX_MSB (0x7Fu) - #define USBFS_1_VOL_MAX_LSB (0xFFu) - #define USBFS_1_VOL_RES_MSB (0x00u) - #define USBFS_1_VOL_RES_LSB (0x01u) -#endif /* USER_SUPPLIED_DEFAULT_VOLUME_VALUE */ - - -/*************************************** -* External data references -***************************************/ - -extern volatile uint8 USBFS_1_currentSampleFrequency[USBFS_1_MAX_EP] - [USBFS_1_SAMPLE_FREQ_LEN]; -extern volatile uint8 USBFS_1_frequencyChanged; -extern volatile uint8 USBFS_1_currentMute; -extern volatile uint8 USBFS_1_currentVolume[USBFS_1_VOLUME_LEN]; -extern volatile uint8 USBFS_1_minimumVolume[USBFS_1_VOLUME_LEN]; -extern volatile uint8 USBFS_1_maximumVolume[USBFS_1_VOLUME_LEN]; -extern volatile uint8 USBFS_1_resolutionVolume[USBFS_1_VOLUME_LEN]; - -#endif /* End CY_USBFS_USBFS_1_audio_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_boot.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_boot.c deleted file mode 100644 index 75eea55f..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_boot.c +++ /dev/null @@ -1,262 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_boot.c -* Version 2.60 -* -* Description: -* Boot loader API for USBFS Component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" - -#if defined(CYDEV_BOOTLOADER_IO_COMP) && ((CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS_1) || \ - (CYDEV_BOOTLOADER_IO_COMP == CyBtldr_Custom_Interface)) - - -/*************************************** -* Bootloader defines -***************************************/ - -#define USBFS_1_CyBtLdrStarttimer(X, T) {USBFS_1_universalTime = T * 10; X = 0u;} -#define USBFS_1_CyBtLdrChecktimer(X) ((X++ < USBFS_1_universalTime) ? 1u : 0u) - -#define USBFS_1_BTLDR_OUT_EP (0x01u) -#define USBFS_1_BTLDR_IN_EP (0x02u) - - -/*************************************** -* Bootloader Variables -***************************************/ - -static uint16 USBFS_1_universalTime; -static uint8 USBFS_1_started = 0u; - - -/******************************************************************************* -* Function Name: USBFS_1_CyBtldrCommStart -******************************************************************************** -* -* Summary: -* Starts the component and enables the interrupt. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Side Effects: -* This function starts the USB with 3V or 5V operation. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_CyBtldrCommStart(void) -{ - CyGlobalIntEnable; /* Enable Global Interrupts */ - - /*Start USBFS Operation/device 0 and with 5V or 3V operation depend on Voltage Configuration in DWR */ - USBFS_1_Start(0u, USBFS_1_DWR_VDDD_OPERATION); - - /* USB component started, the correct enumeration will be checked in first Read operation */ - USBFS_1_started = 1u; - -} - - -/******************************************************************************* -* Function Name: USBFS_1_CyBtldrCommStop. -******************************************************************************** -* -* Summary: -* Disable the component and disable the interrupt. -* -* Parameters: -* None. -* -* Return: -* None. -* -*******************************************************************************/ -void USBFS_1_CyBtldrCommStop(void) -{ - USBFS_1_Stop(); -} - - -/******************************************************************************* -* Function Name: USBFS_1_CyBtldrCommReset. -******************************************************************************** -* -* Summary: -* Resets the receive and transmit communication Buffers. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_CyBtldrCommReset(void) -{ - USBFS_1_EnableOutEP(USBFS_1_BTLDR_OUT_EP); /* Enable the OUT endpoint */ -} - - -/******************************************************************************* -* Function Name: USBFS_1_CyBtldrCommWrite. -******************************************************************************** -* -* Summary: -* Allows the caller to write data to the boot loader host. The function will -* handle polling to allow a block of data to be completely sent to the host -* device. -* -* Parameters: -* pData: A pointer to the block of data to send to the device -* size: The number of bytes to write. -* count: Pointer to an unsigned short variable to write the number of -* bytes actually written. -* timeOut: Number of units to wait before returning because of a timeout. -* -* Return: -* Returns the value that best describes the problem. -* -* Reentrant: -* No. -* -*******************************************************************************/ -cystatus USBFS_1_CyBtldrCommWrite(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL - -{ - uint16 time; - cystatus status; - - /* Enable IN transfer */ - USBFS_1_LoadInEP(USBFS_1_BTLDR_IN_EP, pData, USBFS_1_BTLDR_SIZEOF_READ_BUFFER); - - /* Start a timer to wait on. */ - USBFS_1_CyBtLdrStarttimer(time, timeOut); - - /* Wait for the master to read it. */ - while((USBFS_1_GetEPState(USBFS_1_BTLDR_IN_EP) == USBFS_1_IN_BUFFER_FULL) && \ - USBFS_1_CyBtLdrChecktimer(time)) - { - CyDelay(1u); /* 1ms delay */ - } - - if (USBFS_1_GetEPState(USBFS_1_BTLDR_IN_EP) == USBFS_1_IN_BUFFER_FULL) - { - status = CYRET_TIMEOUT; - } - else - { - *count = size; - status = CYRET_SUCCESS; - } - - return(status); -} - - -/******************************************************************************* -* Function Name: USBFS_1_CyBtldrCommRead. -******************************************************************************** -* -* Summary: -* Allows the caller to read data from the boot loader host. The function will -* handle polling to allow a block of data to be completely received from the -* host device. -* -* Parameters: -* pData: A pointer to the area to store the block of data received -* from the device. -* size: The number of bytes to read. -* count: Pointer to an unsigned short variable to write the number -* of bytes actually read. -* timeOut: Number of units to wait before returning because of a timeOut. -* Timeout is measured in 10s of ms. -* -* Return: -* Returns the value that best describes the problem. -* -* Reentrant: -* No. -* -*******************************************************************************/ -cystatus USBFS_1_CyBtldrCommRead(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL - -{ - cystatus status; - uint16 time; - - if(size > USBFS_1_BTLDR_SIZEOF_WRITE_BUFFER) - { - size = USBFS_1_BTLDR_SIZEOF_WRITE_BUFFER; - } - /* Start a timer to wait on. */ - USBFS_1_CyBtLdrStarttimer(time, timeOut); - - /* Wait on enumeration in first time */ - if(USBFS_1_started) - { - /* Wait for Device to enumerate */ - while(!USBFS_1_GetConfiguration() && USBFS_1_CyBtLdrChecktimer(time)) - { - CyDelay(1u); /* 1ms delay */ - } - /* Enable first OUT, if enumeration complete */ - if(USBFS_1_GetConfiguration()) - { - USBFS_1_IsConfigurationChanged(); /* Clear configuration changes state status */ - USBFS_1_CyBtldrCommReset(); - USBFS_1_started = 0u; - } - } - else /* Check for configuration changes, has been done by Host */ - { - if(USBFS_1_IsConfigurationChanged() != 0u) /* Host could send double SET_INTERFACE request or RESET */ - { - if(USBFS_1_GetConfiguration() != 0u) /* Init OUT endpoints when device reconfigured */ - { - USBFS_1_CyBtldrCommReset(); - } - } - } - /* Wait on next packet */ - while((USBFS_1_GetEPState(USBFS_1_BTLDR_OUT_EP) != USBFS_1_OUT_BUFFER_FULL) && \ - USBFS_1_CyBtLdrChecktimer(time)) - { - CyDelay(1u); /* 1ms delay */ - } - - /* OUT EP has completed */ - if (USBFS_1_GetEPState(USBFS_1_BTLDR_OUT_EP) == USBFS_1_OUT_BUFFER_FULL) - { - *count = USBFS_1_ReadOutEP(USBFS_1_BTLDR_OUT_EP, pData, size); - status = CYRET_SUCCESS; - } - else - { - *count = 0u; - status = CYRET_TIMEOUT; - } - return(status); -} - -#endif /* End CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS_1 */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.c deleted file mode 100644 index b498c2cb..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.c +++ /dev/null @@ -1,706 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_cdc.c -* Version 2.60 -* -* Description: -* USB HID Class request handler. -* -* Note: -* -******************************************************************************** -* Copyright 2012-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" - -#if defined(USBFS_1_ENABLE_CDC_CLASS) - -#include "USBFS_1_cdc.h" -#include "USBFS_1_pvt.h" - - -/*************************************** -* CDC Variables -***************************************/ - -volatile uint8 USBFS_1_lineCoding[USBFS_1_LINE_CODING_SIZE]; -volatile uint8 USBFS_1_lineChanged; -volatile uint16 USBFS_1_lineControlBitmap; -volatile uint8 USBFS_1_cdc_data_in_ep; -volatile uint8 USBFS_1_cdc_data_out_ep; - - -/*************************************** -* Static Function Prototypes -***************************************/ -static uint16 USBFS_1_StrLen(const char8 string[]) ; - - -/*************************************** -* Custom Declarations -***************************************/ - -/* `#START CDC_CUSTOM_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/******************************************************************************* -* Function Name: USBFS_1_DispatchCDCClassRqst -******************************************************************************** -* -* Summary: -* This routine dispatches CDC class requests. -* -* Parameters: -* None. -* -* Return: -* requestHandled -* -* Global variables: -* USBFS_1_lineCoding: Contains the current line coding structure. -* It is set by the Host using SET_LINE_CODING request and returned to the -* user code by the USBFS_GetDTERate(), USBFS_GetCharFormat(), -* USBFS_GetParityType(), USBFS_GetDataBits() APIs. -* USBFS_1_lineControlBitmap: Contains the current control signal -* bitmap. It is set by the Host using SET_CONTROL_LINE request and returned -* to the user code by the USBFS_GetLineControl() API. -* USBFS_1_lineChanged: This variable is used as a flag for the -* USBFS_IsLineChanged() API, to be aware that Host has been sent request -* for changing Line Coding or Control Bitmap. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_DispatchCDCClassRqst(void) -{ - uint8 requestHandled = USBFS_1_FALSE; - - if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == USBFS_1_RQST_DIR_D2H) - { /* Control Read */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_CDC_GET_LINE_CODING: - USBFS_1_currentTD.count = USBFS_1_LINE_CODING_SIZE; - USBFS_1_currentTD.pData = USBFS_1_lineCoding; - requestHandled = USBFS_1_InitControlRead(); - break; - - /* `#START CDC_READ_REQUESTS` Place other request handler here */ - - /* `#END` */ - - default: /* requestHandled is initialized as FALSE by default */ - break; - } - } - else if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == \ - USBFS_1_RQST_DIR_H2D) - { /* Control Write */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_CDC_SET_LINE_CODING: - USBFS_1_currentTD.count = USBFS_1_LINE_CODING_SIZE; - USBFS_1_currentTD.pData = USBFS_1_lineCoding; - USBFS_1_lineChanged |= USBFS_1_LINE_CODING_CHANGED; - requestHandled = USBFS_1_InitControlWrite(); - break; - - case USBFS_1_CDC_SET_CONTROL_LINE_STATE: - USBFS_1_lineControlBitmap = CY_GET_REG8(USBFS_1_wValueLo); - USBFS_1_lineChanged |= USBFS_1_LINE_CONTROL_CHANGED; - requestHandled = USBFS_1_InitNoDataControlTransfer(); - break; - - /* `#START CDC_WRITE_REQUESTS` Place other request handler here */ - - /* `#END` */ - - default: /* requestHandled is initialized as FALSE by default */ - break; - } - } - else - { /* requestHandled is initialized as FALSE by default */ - } - - return(requestHandled); -} - - -/*************************************** -* Optional CDC APIs -***************************************/ -#if (USBFS_1_ENABLE_CDC_CLASS_API != 0u) - - - /******************************************************************************* - * Function Name: USBFS_1_CDC_Init - ******************************************************************************** - * - * Summary: - * This function initialize the CDC interface to be ready for the receive data - * from the PC. - * - * Parameters: - * None. - * - * Return: - * None. - * - * Global variables: - * USBFS_1_lineChanged: Initialized to zero. - * USBFS_1_cdc_data_out_ep: Used as an OUT endpoint number. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_CDC_Init(void) - { - USBFS_1_lineChanged = 0u; - USBFS_1_EnableOutEP(USBFS_1_cdc_data_out_ep); - } - - - /******************************************************************************* - * Function Name: USBFS_1_PutData - ******************************************************************************** - * - * Summary: - * Sends a specified number of bytes from the location specified by a - * pointer to the PC. - * - * Parameters: - * pData: pointer to the buffer containing data to be sent. - * length: Specifies the number of bytes to send from the pData - * buffer. Maximum length will be limited by the maximum packet - * size for the endpoint. - * - * Return: - * None. - * - * Global variables: - * USBFS_1_cdc_data_in_ep: CDC IN endpoint number used for sending - * data. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_PutData(const uint8* pData, uint16 length) - { - /* Limits length to maximum packet size for the EP */ - if(length > USBFS_1_EP[USBFS_1_cdc_data_in_ep].bufferSize) - { - /* Caution: Data will be lost if length is greater than Max Packet Length */ - length = USBFS_1_EP[USBFS_1_cdc_data_in_ep].bufferSize; - /* Halt CPU in debug mode */ - CYASSERT(0u != 0u); - } - USBFS_1_LoadInEP(USBFS_1_cdc_data_in_ep, pData, length); - } - - - /******************************************************************************* - * Function Name: USBFS_1_StrLen - ******************************************************************************** - * - * Summary: - * Calculates length of a null terminated string. - * - * Parameters: - * string: pointer to the string. - * - * Return: - * Length of the string - * - *******************************************************************************/ - static uint16 USBFS_1_StrLen(const char8 string[]) - { - uint16 len = 0u; - - while (string[len] != (char8)0) - { - len++; - } - - return (len); - } - - - /******************************************************************************* - * Function Name: USBFS_1_PutString - ******************************************************************************** - * - * Summary: - * Sends a null terminated string to the PC. - * - * Parameters: - * string: pointer to the string to be sent to the PC - * - * Return: - * None. - * - * Global variables: - * USBFS_1_cdc_data_in_ep: CDC IN endpoint number used for sending - * data. - * - * Reentrant: - * No. - * - * Theory: - * This function will block if there is not enough memory to place the whole - * string, it will block until the entire string has been written to the - * transmit buffer. - * - *******************************************************************************/ - void USBFS_1_PutString(const char8 string[]) - { - uint16 str_length; - uint16 send_length; - uint16 buf_index = 0u; - - /* Get length of the null terminated string */ - str_length = USBFS_1_StrLen(string); - do - { - /* Limits length to maximum packet size for the EP */ - send_length = (str_length > USBFS_1_EP[USBFS_1_cdc_data_in_ep].bufferSize) ? - USBFS_1_EP[USBFS_1_cdc_data_in_ep].bufferSize : str_length; - /* Enable IN transfer */ - USBFS_1_LoadInEP(USBFS_1_cdc_data_in_ep, (const uint8 *)&string[buf_index], send_length); - str_length -= send_length; - - /* If more data are present to send */ - if(str_length > 0u) - { - buf_index += send_length; - /* Wait for the Host to read it. */ - while(USBFS_1_EP[USBFS_1_cdc_data_in_ep].apiEpState == - USBFS_1_IN_BUFFER_FULL) - { - ; - } - } - }while(str_length > 0u); - } - - - /******************************************************************************* - * Function Name: USBFS_1_PutChar - ******************************************************************************** - * - * Summary: - * Writes a single character to the PC. - * - * Parameters: - * txDataByte: Character to be sent to the PC. - * - * Return: - * None. - * - * Global variables: - * USBFS_1_cdc_data_in_ep: CDC IN endpoint number used for sending - * data. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_PutChar(char8 txDataByte) - { - uint8 dataByte; - dataByte = (uint8)txDataByte; - - USBFS_1_LoadInEP(USBFS_1_cdc_data_in_ep, &dataByte, 1u); - } - - - /******************************************************************************* - * Function Name: USBFS_1_PutCRLF - ******************************************************************************** - * - * Summary: - * Sends a carriage return (0x0D) and line feed (0x0A) to the PC - * - * Parameters: - * None. - * - * Return: - * None. - * - * Global variables: - * USBFS_1_cdc_data_in_ep: CDC IN endpoint number used for sending - * data. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_PutCRLF(void) - { - const uint8 CYCODE txData[] = {0x0Du, 0x0Au}; - - USBFS_1_LoadInEP(USBFS_1_cdc_data_in_ep, (const uint8 *)txData, 2u); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetCount - ******************************************************************************** - * - * Summary: - * This function returns the number of bytes that were received from the PC. - * - * Parameters: - * None. - * - * Return: - * Returns the number of received bytes. - * - * Global variables: - * USBFS_1_cdc_data_out_ep: CDC OUT endpoint number used. - * - *******************************************************************************/ - uint16 USBFS_1_GetCount(void) - { - uint16 bytesCount = 0u; - - if (USBFS_1_EP[USBFS_1_cdc_data_out_ep].apiEpState == USBFS_1_OUT_BUFFER_FULL) - { - bytesCount = USBFS_1_GetEPCount(USBFS_1_cdc_data_out_ep); - } - - return(bytesCount); - } - - - /******************************************************************************* - * Function Name: USBFS_1_DataIsReady - ******************************************************************************** - * - * Summary: - * Returns a nonzero value if the component received data or received - * zero-length packet. The GetAll() or GetData() API should be called to read - * data from the buffer and re-init OUT endpoint even when zero-length packet - * received. - * - * Parameters: - * None. - * - * Return: - * If the OUT packet received this function returns a nonzero value. - * Otherwise zero is returned. - * - * Global variables: - * USBFS_1_cdc_data_out_ep: CDC OUT endpoint number used. - * - *******************************************************************************/ - uint8 USBFS_1_DataIsReady(void) - { - return(USBFS_1_EP[USBFS_1_cdc_data_out_ep].apiEpState); - } - - - /******************************************************************************* - * Function Name: USBFS_1_CDCIsReady - ******************************************************************************** - * - * Summary: - * Returns a nonzero value if the component is ready to send more data to the - * PC. Otherwise returns zero. Should be called before sending new data to - * ensure the previous data has finished sending.This function returns the - * number of bytes that were received from the PC. - * - * Parameters: - * None. - * - * Return: - * If the buffer can accept new data then this function returns a nonzero value. - * Otherwise zero is returned. - * - * Global variables: - * USBFS_1_cdc_data_in_ep: CDC IN endpoint number used. - * - *******************************************************************************/ - uint8 USBFS_1_CDCIsReady(void) - { - return(USBFS_1_EP[USBFS_1_cdc_data_in_ep].apiEpState); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetData - ******************************************************************************** - * - * Summary: - * Gets a specified number of bytes from the input buffer and places it in a - * data array specified by the passed pointer. - * USBFS_1_DataIsReady() API should be called before, to be sure - * that data is received from the Host. - * - * Parameters: - * pData: Pointer to the data array where data will be placed. - * Length: Number of bytes to read into the data array from the RX buffer. - * Maximum length is limited by the the number of received bytes. - * - * Return: - * Number of bytes received. - * - * Global variables: - * USBFS_1_cdc_data_out_ep: CDC OUT endpoint number used. - * - * Reentrant: - * No. - * - *******************************************************************************/ - uint16 USBFS_1_GetData(uint8* pData, uint16 length) - { - return(USBFS_1_ReadOutEP(USBFS_1_cdc_data_out_ep, pData, length)); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetAll - ******************************************************************************** - * - * Summary: - * Gets all bytes of received data from the input buffer and places it into a - * specified data array. USBFS_1_DataIsReady() API should be called - * before, to be sure that data is received from the Host. - * - * Parameters: - * pData: Pointer to the data array where data will be placed. - * - * Return: - * Number of bytes received. - * - * Global variables: - * USBFS_1_cdc_data_out_ep: CDC OUT endpoint number used. - * USBFS_1_EP[].bufferSize: EP max packet size is used as a length - * to read all data from the EP buffer. - * - * Reentrant: - * No. - * - *******************************************************************************/ - uint16 USBFS_1_GetAll(uint8* pData) - { - return (USBFS_1_ReadOutEP(USBFS_1_cdc_data_out_ep, pData, - USBFS_1_EP[USBFS_1_cdc_data_out_ep].bufferSize)); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetChar - ******************************************************************************** - * - * Summary: - * Reads one byte of received data from the buffer. - * - * Parameters: - * None. - * - * Return: - * Received one character. - * - * Global variables: - * USBFS_1_cdc_data_out_ep: CDC OUT endpoint number used. - * - * Reentrant: - * No. - * - *******************************************************************************/ - uint8 USBFS_1_GetChar(void) - { - uint8 rxData; - - (void) USBFS_1_ReadOutEP(USBFS_1_cdc_data_out_ep, &rxData, 1u); - - return(rxData); - } - - /******************************************************************************* - * Function Name: USBFS_1_IsLineChanged - ******************************************************************************** - * - * Summary: - * This function returns clear on read status of the line. - * - * Parameters: - * None. - * - * Return: - * If SET_LINE_CODING or CDC_SET_CONTROL_LINE_STATE request received then not - * zero value returned. Otherwise zero is returned. - * - * Global variables: - * USBFS_1_transferState - it is checked to be sure then OUT data - * phase has been complete, and data written to the lineCoding or Control - * Bitmap buffer. - * USBFS_1_lineChanged: used as a flag to be aware that Host has been - * sent request for changing Line Coding or Control Bitmap. - * - *******************************************************************************/ - uint8 USBFS_1_IsLineChanged(void) - { - uint8 state = 0u; - - /* transferState is checked to be sure then OUT data phase has been complete */ - if(USBFS_1_transferState == USBFS_1_TRANS_STATE_IDLE) - { - if(USBFS_1_lineChanged != 0u) - { - state = USBFS_1_lineChanged; - USBFS_1_lineChanged = 0u; - } - } - - return(state); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetDTERate - ******************************************************************************** - * - * Summary: - * Returns the data terminal rate set for this port in bits per second. - * - * Parameters: - * None. - * - * Return: - * Returns a uint32 value of the data rate in bits per second. - * - * Global variables: - * USBFS_1_lineCoding: First four bytes converted to uint32 - * depend on compiler, and returned as a data rate. - * - *******************************************************************************/ - uint32 USBFS_1_GetDTERate(void) - { - uint32 rate; - - rate = USBFS_1_lineCoding[USBFS_1_LINE_CODING_RATE + 3u]; - rate = (rate << 8u) | USBFS_1_lineCoding[USBFS_1_LINE_CODING_RATE + 2u]; - rate = (rate << 8u) | USBFS_1_lineCoding[USBFS_1_LINE_CODING_RATE + 1u]; - rate = (rate << 8u) | USBFS_1_lineCoding[USBFS_1_LINE_CODING_RATE]; - - return(rate); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetCharFormat - ******************************************************************************** - * - * Summary: - * Returns the number of stop bits. - * - * Parameters: - * None. - * - * Return: - * Returns the number of stop bits. - * - * Global variables: - * USBFS_1_lineCoding: used to get a parameter. - * - *******************************************************************************/ - uint8 USBFS_1_GetCharFormat(void) - { - return(USBFS_1_lineCoding[USBFS_1_LINE_CODING_STOP_BITS]); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetParityType - ******************************************************************************** - * - * Summary: - * Returns the parity type for the CDC port. - * - * Parameters: - * None. - * - * Return: - * Returns the parity type. - * - * Global variables: - * USBFS_1_lineCoding: used to get a parameter. - * - *******************************************************************************/ - uint8 USBFS_1_GetParityType(void) - { - return(USBFS_1_lineCoding[USBFS_1_LINE_CODING_PARITY]); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetDataBits - ******************************************************************************** - * - * Summary: - * Returns the number of data bits for the CDC port. - * - * Parameters: - * None. - * - * Return: - * Returns the number of data bits. - * The number of data bits can be 5, 6, 7, 8 or 16. - * - * Global variables: - * USBFS_1_lineCoding: used to get a parameter. - * - *******************************************************************************/ - uint8 USBFS_1_GetDataBits(void) - { - return(USBFS_1_lineCoding[USBFS_1_LINE_CODING_DATA_BITS]); - } - - - /******************************************************************************* - * Function Name: USBFS_1_GetLineControl - ******************************************************************************** - * - * Summary: - * Returns Line control bitmap. - * - * Parameters: - * None. - * - * Return: - * Returns Line control bitmap. - * - * Global variables: - * USBFS_1_lineControlBitmap: used to get a parameter. - * - *******************************************************************************/ - uint16 USBFS_1_GetLineControl(void) - { - return(USBFS_1_lineControlBitmap); - } - -#endif /* End USBFS_1_ENABLE_CDC_CLASS_API*/ - - -/******************************************************************************* -* Additional user functions supporting CDC Requests -********************************************************************************/ - -/* `#START CDC_FUNCTIONS` Place any additional functions here */ - -/* `#END` */ - -#endif /* End USBFS_1_ENABLE_CDC_CLASS*/ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.h deleted file mode 100644 index 93bbc158..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.h +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_cdc.h -* Version 2.60 -* -* Description: -* Header File for the USFS component. -* Contains CDC class prototypes and constant values. -* -******************************************************************************** -* Copyright 2012-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_USBFS_USBFS_1_cdc_H) -#define CY_USBFS_USBFS_1_cdc_H - -#include "cytypes.h" - - -/*************************************** -* Prototypes of the USBFS_1_cdc API. -***************************************/ - -#if (USBFS_1_ENABLE_CDC_CLASS_API != 0u) - void USBFS_1_CDC_Init(void) ; - void USBFS_1_PutData(const uint8* pData, uint16 length) ; - void USBFS_1_PutString(const char8 string[]) ; - void USBFS_1_PutChar(char8 txDataByte) ; - void USBFS_1_PutCRLF(void) ; - uint16 USBFS_1_GetCount(void) ; - uint8 USBFS_1_CDCIsReady(void) ; - uint8 USBFS_1_DataIsReady(void) ; - uint16 USBFS_1_GetData(uint8* pData, uint16 length) ; - uint16 USBFS_1_GetAll(uint8* pData) ; - uint8 USBFS_1_GetChar(void) ; - uint8 USBFS_1_IsLineChanged(void) ; - uint32 USBFS_1_GetDTERate(void) ; - uint8 USBFS_1_GetCharFormat(void) ; - uint8 USBFS_1_GetParityType(void) ; - uint8 USBFS_1_GetDataBits(void) ; - uint16 USBFS_1_GetLineControl(void) ; -#endif /* End USBFS_1_ENABLE_CDC_CLASS_API*/ - - -/*************************************** -* Constants for USBFS_1_cdc API. -***************************************/ - -/* CDC Class-Specific Request Codes (CDC ver 1.2 Table 19) */ -#define USBFS_1_CDC_SET_LINE_CODING (0x20u) -#define USBFS_1_CDC_GET_LINE_CODING (0x21u) -#define USBFS_1_CDC_SET_CONTROL_LINE_STATE (0x22u) - -#define USBFS_1_LINE_CODING_CHANGED (0x01u) -#define USBFS_1_LINE_CONTROL_CHANGED (0x02u) - -#define USBFS_1_1_STOPBIT (0x00u) -#define USBFS_1_1_5_STOPBITS (0x01u) -#define USBFS_1_2_STOPBITS (0x02u) - -#define USBFS_1_PARITY_NONE (0x00u) -#define USBFS_1_PARITY_ODD (0x01u) -#define USBFS_1_PARITY_EVEN (0x02u) -#define USBFS_1_PARITY_MARK (0x03u) -#define USBFS_1_PARITY_SPACE (0x04u) - -#define USBFS_1_LINE_CODING_SIZE (0x07u) -#define USBFS_1_LINE_CODING_RATE (0x00u) -#define USBFS_1_LINE_CODING_STOP_BITS (0x04u) -#define USBFS_1_LINE_CODING_PARITY (0x05u) -#define USBFS_1_LINE_CODING_DATA_BITS (0x06u) - -#define USBFS_1_LINE_CONTROL_DTR (0x01u) -#define USBFS_1_LINE_CONTROL_RTS (0x02u) - - -/*************************************** -* External data references -***************************************/ - -extern volatile uint8 USBFS_1_lineCoding[USBFS_1_LINE_CODING_SIZE]; -extern volatile uint8 USBFS_1_lineChanged; -extern volatile uint16 USBFS_1_lineControlBitmap; -extern volatile uint8 USBFS_1_cdc_data_in_ep; -extern volatile uint8 USBFS_1_cdc_data_out_ep; - -#endif /* End CY_USBFS_USBFS_1_cdc_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.inf b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.inf deleted file mode 100644 index 9515243a..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cdc.inf +++ /dev/null @@ -1,122 +0,0 @@ -;****************************************************************************** -; File Name: USBFS_1_cdc.inf -; Version 2.60 -; -; Description: -; Windows USB CDC setup file for USBUART Device. -; -;****************************************************************************** -; Copyright 2007-2013, Cypress Semiconductor Corporation. All rights reserved. -; You may use this file only in accordance with the license, terms, conditions, -; disclaimers, and limitations in the end user license agreement accompanying -; the software package with which this file was provided. -;****************************************************************************** - -[Version] -Signature="$Windows NT$" -Class=Ports -ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} -Provider=%PROVIDER% -LayoutFile=layout.inf -DriverVer=03/05/2007,2.0.0000.0 - -[Manufacturer] -%MFGNAME%=DeviceList, NTx86, NTia64, NTamd64 - -[DestinationDirs] -DefaultDestDir=12 - -[SourceDisksFiles] - -[SourceDisksNames] - -[DeviceList.NTx86] -%DESCRIPTION%=DriverInstall, USB\VID_04B4&PID_F232 - -[DeviceList.NTia64] -%DESCRIPTION%=DriverInstall, USB\VID_04B4&PID_F232 - -[DeviceList.NTamd64] -%DESCRIPTION%=DriverInstall, USB\VID_04B4&PID_F232 - - -;------------------------------------------------------------------------------ -; 32 bit section for Windows 2000/2003/XP/Vista -;------------------------------------------------------------------------------ - -[DriverInstall.NTx86] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles -AddReg=DriverInstall.NTx86.AddReg - -[DriverCopyFiles] -usbser.sys,,,0x20 - -[DriverInstall.NTx86.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NTx86.Services] -AddService=usbser, 0x00000002, DriverService - -;------------------------------------------------------------------------------ -; 64 bit section for Intel Itanium based systems -;------------------------------------------------------------------------------ - -[DriverInstall.NTia64] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles -AddReg=DriverInstall.NTia64.AddReg - -[DriverCopyFiles] -usbser.sys,,,0x20 - -[DriverInstall.NTia64.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NTia64.Services] -AddService=usbser, 0x00000002, DriverService - -;------------------------------------------------------------------------------ -; 64 bit section for AMD64 and Intel EM64T based systems -;------------------------------------------------------------------------------ - -[DriverInstall.NTamd64] -include=mdmcpq.inf -CopyFiles=DriverCopyFiles -AddReg=DriverInstall.NTamd64.AddReg - -[DriverCopyFiles] -usbser.sys,,,0x20 - -[DriverInstall.NTamd64.AddReg] -HKR,,DevLoader,,*ntkern -HKR,,NTMPDriver,,usbser.sys -HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" - -[DriverInstall.NTamd64.Services] -AddService=usbser, 0x00000002, DriverService - -;------------------------------------------------------------------------------ -; -;------------------------------------------------------------------------------ - -[DriverService] -DisplayName=%SERVICE% -ServiceType=1 -StartType=3 -ErrorControl=1 -ServiceBinary=%12%\usbser.sys - -;------------------------------------------------------------------------------ -; String Definitions -;------------------------------------------------------------------------------ - -[Strings] -PROVIDER="Cypress" -MFGNAME="Cypress Semiconductor Corporation" -DESCRIPTION="Cypress USB UART" -SERVICE="USB UART" diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cls.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cls.c deleted file mode 100644 index 26800c5d..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_cls.c +++ /dev/null @@ -1,107 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_cls.c -* Version 2.60 -* -* Description: -* USB Class request handler. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" - -#if(USBFS_1_EXTERN_CLS == USBFS_1_FALSE) - -#include "USBFS_1_pvt.h" - - -/*************************************** -* User Implemented Class Driver Declarations. -***************************************/ -/* `#START USER_DEFINED_CLASS_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/******************************************************************************* -* Function Name: USBFS_1_DispatchClassRqst -******************************************************************************** -* Summary: -* This routine dispatches class specific requests depend on interface class. -* -* Parameters: -* None. -* -* Return: -* requestHandled. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_DispatchClassRqst(void) -{ - uint8 requestHandled = USBFS_1_FALSE; - uint8 interfaceNumber = 0u; - - switch(CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) - { - case USBFS_1_RQST_RCPT_IFC: /* Class-specific request directed to an interface */ - interfaceNumber = CY_GET_REG8(USBFS_1_wIndexLo); /* wIndexLo contain Interface number */ - break; - case USBFS_1_RQST_RCPT_EP: /* Class-specific request directed to the endpoint */ - /* Find related interface to the endpoint, wIndexLo contain EP number */ - interfaceNumber = - USBFS_1_EP[CY_GET_REG8(USBFS_1_wIndexLo) & USBFS_1_DIR_UNUSED].interface; - break; - default: /* RequestHandled is initialized as FALSE by default */ - break; - } - /* Handle Class request depend on interface type */ - switch(USBFS_1_interfaceClass[interfaceNumber]) - { - case USBFS_1_CLASS_HID: - #if defined(USBFS_1_ENABLE_HID_CLASS) - requestHandled = USBFS_1_DispatchHIDClassRqst(); - #endif /* USBFS_1_ENABLE_HID_CLASS */ - break; - case USBFS_1_CLASS_AUDIO: - #if defined(USBFS_1_ENABLE_AUDIO_CLASS) - requestHandled = USBFS_1_DispatchAUDIOClassRqst(); - #endif /* USBFS_1_ENABLE_HID_CLASS */ - break; - case USBFS_1_CLASS_CDC: - #if defined(USBFS_1_ENABLE_CDC_CLASS) - requestHandled = USBFS_1_DispatchCDCClassRqst(); - #endif /* USBFS_1_ENABLE_CDC_CLASS */ - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - - /* `#START USER_DEFINED_CLASS_CODE` Place your Class request here */ - - /* `#END` */ - - return(requestHandled); -} - - -/******************************************************************************* -* Additional user functions supporting Class Specific Requests -********************************************************************************/ - -/* `#START CLASS_SPECIFIC_FUNCTIONS` Place any additional functions here */ - -/* `#END` */ - -#endif /* USBFS_1_EXTERN_CLS */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_descr.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_descr.c deleted file mode 100644 index 24695733..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_descr.c +++ /dev/null @@ -1,180 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_descr.c -* Version 2.60 -* -* Description: -* USB descriptors and storage. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" -#include "USBFS_1_pvt.h" - - -/***************************************************************************** -* User supplied descriptors. If you want to specify your own descriptors, -* remove the comments around the define USER_SUPPLIED_DESCRIPTORS below and -* add your descriptors. -*****************************************************************************/ -/* `#START USER_DESCRIPTORS_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/*************************************** -* USB Customizer Generated Descriptors -***************************************/ - -#if !defined(USER_SUPPLIED_DESCRIPTORS) -/********************************************************************* -* Device Descriptors -*********************************************************************/ -const uint8 CYCODE USBFS_1_DEVICE0_DESCR[18u] = { -/* Descriptor Length */ 0x12u, -/* DescriptorType: DEVICE */ 0x01u, -/* bcdUSB (ver 2.0) */ 0x00u, 0x02u, -/* bDeviceClass */ 0x00u, -/* bDeviceSubClass */ 0x00u, -/* bDeviceProtocol */ 0x00u, -/* bMaxPacketSize0 */ 0x08u, -/* idVendor */ 0xB4u, 0x04u, -/* idProduct */ 0x51u, 0x80u, -/* bcdDevice */ 0x00u, 0x00u, -/* iManufacturer */ 0x00u, -/* iProduct */ 0x00u, -/* iSerialNumber */ 0x00u, -/* bNumConfigurations */ 0x01u -}; -/********************************************************************* -* Config Descriptor -*********************************************************************/ -const uint8 CYCODE USBFS_1_DEVICE0_CONFIGURATION0_DESCR[25u] = { -/* Config Descriptor Length */ 0x09u, -/* DescriptorType: CONFIG */ 0x02u, -/* wTotalLength */ 0x19u, 0x00u, -/* bNumInterfaces */ 0x01u, -/* bConfigurationValue */ 0x01u, -/* iConfiguration */ 0x00u, -/* bmAttributes */ 0xC0u, -/* bMaxPower */ 0x00u, -/********************************************************************* -* Interface Descriptor -*********************************************************************/ -/* Interface Descriptor Length */ 0x09u, -/* DescriptorType: INTERFACE */ 0x04u, -/* bInterfaceNumber */ 0x00u, -/* bAlternateSetting */ 0x00u, -/* bNumEndpoints */ 0x01u, -/* bInterfaceClass */ 0x00u, -/* bInterfaceSubClass */ 0x00u, -/* bInterfaceProtocol */ 0x00u, -/* iInterface */ 0x00u, -/********************************************************************* -* Endpoint Descriptor -*********************************************************************/ -/* Endpoint Descriptor Length */ 0x07u, -/* DescriptorType: ENDPOINT */ 0x05u, -/* bEndpointAddress */ 0x01u, -/* bmAttributes */ 0x02u, -/* wMaxPacketSize */ 0x08u, 0x00u, -/* bInterval */ 0x0Au -}; - - - - - -/********************************************************************* -* Endpoint Setting Table -- This table contain the endpoint setting -* for each endpoint in the configuration. It -* contains the necessary information to -* configure the endpoint hardware for each -* interface and alternate setting. -*********************************************************************/ -const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE USBFS_1_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE[1u] = { -/* IFC ALT EPAddr bmAttr MaxPktSize Class ********************/ -{0x00u, 0x00u, 0x01u, 0x02u, 0x0008u, 0x00u} -}; -const uint8 CYCODE USBFS_1_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[1u] = { -0x00u -}; -/********************************************************************* -* Config Dispatch Table -- Points to the Config Descriptor and each of -* and endpoint setup table and to each -* interface table if it specifies a USB Class -*********************************************************************/ -const T_USBFS_1_LUT CYCODE USBFS_1_DEVICE0_CONFIGURATION0_TABLE[4u] = { - {0x01u, &USBFS_1_DEVICE0_CONFIGURATION0_DESCR}, - {0x01u, &USBFS_1_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE}, - {0x00u, NULL}, - {0x00u, &USBFS_1_DEVICE0_CONFIGURATION0_INTERFACE_CLASS} -}; -/********************************************************************* -* Device Dispatch Table -- Points to the Device Descriptor and each of -* and Configuration Tables for this Device -*********************************************************************/ -const T_USBFS_1_LUT CYCODE USBFS_1_DEVICE0_TABLE[2u] = { - {0x01u, &USBFS_1_DEVICE0_DESCR}, - {0x01u, &USBFS_1_DEVICE0_CONFIGURATION0_TABLE} -}; -/********************************************************************* -* Device Table -- Indexed by the device number. -*********************************************************************/ -const T_USBFS_1_LUT CYCODE USBFS_1_TABLE[1u] = { - {0x01u, &USBFS_1_DEVICE0_TABLE} -}; - -#endif /* USER_SUPPLIED_DESCRIPTORS */ - -#if defined(USBFS_1_ENABLE_MSOS_STRING) - - /****************************************************************************** - * USB Microsoft OS String Descriptor - * "MSFT" identifies a Microsoft host - * "100" specifies version 1.00 - * USBFS_1_GET_EXTENDED_CONFIG_DESCRIPTOR becomes the bRequest value - * in a host vendor device/class request - ******************************************************************************/ - - const uint8 CYCODE USBFS_1_MSOS_DESCRIPTOR[USBFS_1_MSOS_DESCRIPTOR_LENGTH] = { - /* Descriptor Length */ 0x12u, - /* DescriptorType: STRING */ 0x03u, - /* qwSignature - "MSFT100" */ (uint8)'M', 0u, (uint8)'S', 0u, (uint8)'F', 0u, (uint8)'T', 0u, - (uint8)'1', 0u, (uint8)'0', 0u, (uint8)'0', 0u, - /* bMS_VendorCode: */ USBFS_1_GET_EXTENDED_CONFIG_DESCRIPTOR, - /* bPad */ 0x00u - }; - - /* Extended Configuration Descriptor */ - - const uint8 CYCODE USBFS_1_MSOS_CONFIGURATION_DESCR[USBFS_1_MSOS_CONF_DESCR_LENGTH] = { - /* Length of the descriptor 4 bytes */ 0x28u, 0x00u, 0x00u, 0x00u, - /* Version of the descriptor 2 bytes */ 0x00u, 0x01u, - /* wIndex - Fixed:INDEX_CONFIG_DESCRIPTOR */ 0x04u, 0x00u, - /* bCount - Count of device functions. */ 0x01u, - /* Reserved : 7 bytes */ 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, - /* bFirstInterfaceNumber */ 0x00u, - /* Reserved */ 0x01u, - /* compatibleID - "CYUSB\0\0" */ (uint8)'C', (uint8)'Y', (uint8)'U', (uint8)'S', (uint8)'B', - 0x00u, 0x00u, 0x00u, - /* subcompatibleID - "00001\0\0" */ (uint8)'0', (uint8)'0', (uint8)'0', (uint8)'0', (uint8)'1', - 0x00u, 0x00u, 0x00u, - /* Reserved : 6 bytes */ 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u - }; - -#endif /* USBFS_1_ENABLE_MSOS_STRING */ - -/* DIE ID string descriptor for 8 bytes ID */ -#if defined(USBFS_1_ENABLE_IDSN_STRING) - uint8 USBFS_1_idSerialNumberStringDescriptor[USBFS_1_IDSN_DESCR_LENGTH]; -#endif /* USBFS_1_ENABLE_IDSN_STRING */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_drv.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_drv.c deleted file mode 100644 index 282d1d16..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_drv.c +++ /dev/null @@ -1,781 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_drv.c -* Version 2.60 -* -* Description: -* Endpoint 0 Driver for the USBFS Component. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" -#include "USBFS_1_pvt.h" - - -/*************************************** -* Global data allocation -***************************************/ - -volatile T_USBFS_1_EP_CTL_BLOCK USBFS_1_EP[USBFS_1_MAX_EP]; -volatile uint8 USBFS_1_configuration; -volatile uint8 USBFS_1_interfaceNumber; -volatile uint8 USBFS_1_configurationChanged; -volatile uint8 USBFS_1_deviceAddress; -volatile uint8 USBFS_1_deviceStatus; -volatile uint8 USBFS_1_interfaceSetting[USBFS_1_MAX_INTERFACES_NUMBER]; -volatile uint8 USBFS_1_interfaceSetting_last[USBFS_1_MAX_INTERFACES_NUMBER]; -volatile uint8 USBFS_1_interfaceStatus[USBFS_1_MAX_INTERFACES_NUMBER]; -volatile uint8 USBFS_1_device; -const uint8 CYCODE *USBFS_1_interfaceClass; - - -/*************************************** -* Local data allocation -***************************************/ - -volatile uint8 USBFS_1_ep0Toggle; -volatile uint8 USBFS_1_lastPacketSize; -volatile uint8 USBFS_1_transferState; -volatile T_USBFS_1_TD USBFS_1_currentTD; -volatile uint8 USBFS_1_ep0Mode; -volatile uint8 USBFS_1_ep0Count; -volatile uint16 USBFS_1_transferByteCount; - - -/******************************************************************************* -* Function Name: USBFS_1_ep_0_Interrupt -******************************************************************************** -* -* Summary: -* This Interrupt Service Routine handles Endpoint 0 (Control Pipe) traffic. -* It dispatches setup requests and handles the data and status stages. -* -* Parameters: -* None. -* -* Return: -* None. -* -*******************************************************************************/ -CY_ISR(USBFS_1_EP_0_ISR) -{ - uint8 bRegTemp; - uint8 modifyReg; - - - bRegTemp = CY_GET_REG8(USBFS_1_EP0_CR_PTR); - if ((bRegTemp & USBFS_1_MODE_ACKD) != 0u) - { - modifyReg = 1u; - if ((bRegTemp & USBFS_1_MODE_SETUP_RCVD) != 0u) - { - if((bRegTemp & USBFS_1_MODE_MASK) != USBFS_1_MODE_NAK_IN_OUT) - { - modifyReg = 0u; /* When mode not NAK_IN_OUT => invalid setup */ - } - else - { - USBFS_1_HandleSetup(); - if((USBFS_1_ep0Mode & USBFS_1_MODE_SETUP_RCVD) != 0u) - { - modifyReg = 0u; /* if SETUP bit set -> exit without modifying the mode */ - } - - } - } - else if ((bRegTemp & USBFS_1_MODE_IN_RCVD) != 0u) - { - USBFS_1_HandleIN(); - } - else if ((bRegTemp & USBFS_1_MODE_OUT_RCVD) != 0u) - { - USBFS_1_HandleOUT(); - } - else - { - modifyReg = 0u; - } - if(modifyReg != 0u) - { - bRegTemp = CY_GET_REG8(USBFS_1_EP0_CR_PTR); /* unlock registers */ - if((bRegTemp & USBFS_1_MODE_SETUP_RCVD) == 0u) /* Check if SETUP bit is not set, otherwise exit */ - { - /* Update the count register */ - bRegTemp = USBFS_1_ep0Toggle | USBFS_1_ep0Count; - CY_SET_REG8(USBFS_1_EP0_CNT_PTR, bRegTemp); - if(bRegTemp == CY_GET_REG8(USBFS_1_EP0_CNT_PTR)) /* continue if writing was successful */ - { - do - { - modifyReg = USBFS_1_ep0Mode; /* Init temporary variable */ - /* Unlock registers */ - bRegTemp = CY_GET_REG8(USBFS_1_EP0_CR_PTR) & USBFS_1_MODE_SETUP_RCVD; - if(bRegTemp == 0u) /* Check if SETUP bit is not set */ - { - /* Set the Mode Register */ - CY_SET_REG8(USBFS_1_EP0_CR_PTR, USBFS_1_ep0Mode); - /* Writing check */ - modifyReg = CY_GET_REG8(USBFS_1_EP0_CR_PTR) & USBFS_1_MODE_MASK; - } - }while(modifyReg != USBFS_1_ep0Mode); /* Repeat if writing was not successful */ - } - } - } - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_HandleSetup -******************************************************************************** -* -* Summary: -* This Routine dispatches requests for the four USB request types -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_HandleSetup(void) -{ - uint8 requestHandled; - - requestHandled = CY_GET_REG8(USBFS_1_EP0_CR_PTR); /* unlock registers */ - CY_SET_REG8(USBFS_1_EP0_CR_PTR, requestHandled); /* clear setup bit */ - requestHandled = CY_GET_REG8(USBFS_1_EP0_CR_PTR); /* reread register */ - if((requestHandled & USBFS_1_MODE_SETUP_RCVD) != 0u) - { - USBFS_1_ep0Mode = requestHandled; /* if SETUP bit set -> exit without modifying the mode */ - } - else - { - /* In case the previous transfer did not complete, close it out */ - USBFS_1_UpdateStatusBlock(USBFS_1_XFER_PREMATURE); - - switch (CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_TYPE_MASK) - { - case USBFS_1_RQST_TYPE_STD: - requestHandled = USBFS_1_HandleStandardRqst(); - break; - case USBFS_1_RQST_TYPE_CLS: - requestHandled = USBFS_1_DispatchClassRqst(); - break; - case USBFS_1_RQST_TYPE_VND: - requestHandled = USBFS_1_HandleVendorRqst(); - break; - default: - requestHandled = USBFS_1_FALSE; - break; - } - if (requestHandled == USBFS_1_FALSE) - { - USBFS_1_ep0Mode = USBFS_1_MODE_STALL_IN_OUT; - } - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_HandleIN -******************************************************************************** -* -* Summary: -* This routine handles EP0 IN transfers. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_HandleIN(void) -{ - switch (USBFS_1_transferState) - { - case USBFS_1_TRANS_STATE_IDLE: - break; - case USBFS_1_TRANS_STATE_CONTROL_READ: - USBFS_1_ControlReadDataStage(); - break; - case USBFS_1_TRANS_STATE_CONTROL_WRITE: - USBFS_1_ControlWriteStatusStage(); - break; - case USBFS_1_TRANS_STATE_NO_DATA_CONTROL: - USBFS_1_NoDataControlStatusStage(); - break; - default: /* there are no more states */ - break; - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_HandleOUT -******************************************************************************** -* -* Summary: -* This routine handles EP0 OUT transfers. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_HandleOUT(void) -{ - switch (USBFS_1_transferState) - { - case USBFS_1_TRANS_STATE_IDLE: - break; - case USBFS_1_TRANS_STATE_CONTROL_READ: - USBFS_1_ControlReadStatusStage(); - break; - case USBFS_1_TRANS_STATE_CONTROL_WRITE: - USBFS_1_ControlWriteDataStage(); - break; - case USBFS_1_TRANS_STATE_NO_DATA_CONTROL: - /* Update the completion block */ - USBFS_1_UpdateStatusBlock(USBFS_1_XFER_ERROR); - /* We expect no more data, so stall INs and OUTs */ - USBFS_1_ep0Mode = USBFS_1_MODE_STALL_IN_OUT; - break; - default: /* There are no more states */ - break; - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_LoadEP0 -******************************************************************************** -* -* Summary: -* This routine loads the EP0 data registers for OUT transfers. It uses the -* currentTD (previously initialized by the _InitControlWrite function and -* updated for each OUT transfer, and the bLastPacketSize) to determine how -* many uint8s to transfer on the current OUT. -* -* If the number of uint8s remaining is zero and the last transfer was full, -* we need to send a zero length packet. Otherwise we send the minimum -* of the control endpoint size (8) or remaining number of uint8s for the -* transaction. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_transferByteCount - Update the transfer byte count from the -* last transaction. -* USBFS_1_ep0Count - counts the data loaded to the SIE memory in -* current packet. -* USBFS_1_lastPacketSize - remembers the USBFS_ep0Count value for the -* next packet. -* USBFS_1_transferByteCount - sum of the previous bytes transferred -* on previous packets(sum of USBFS_lastPacketSize) -* USBFS_1_ep0Toggle - inverted -* USBFS_1_ep0Mode - prepare for mode register content. -* USBFS_1_transferState - set to TRANS_STATE_CONTROL_READ -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_LoadEP0(void) -{ - uint8 ep0Count = 0u; - - /* Update the transfer byte count from the last transaction */ - USBFS_1_transferByteCount += USBFS_1_lastPacketSize; - /* Now load the next transaction */ - while ((USBFS_1_currentTD.count > 0u) && (ep0Count < 8u)) - { - CY_SET_REG8((reg8 *)(USBFS_1_EP0_DR0_IND + ep0Count), *USBFS_1_currentTD.pData); - USBFS_1_currentTD.pData = &USBFS_1_currentTD.pData[1u]; - ep0Count++; - USBFS_1_currentTD.count--; - } - /* Support zero-length packet*/ - if( (USBFS_1_lastPacketSize == 8u) || (ep0Count > 0u) ) - { - /* Update the data toggle */ - USBFS_1_ep0Toggle ^= USBFS_1_EP0_CNT_DATA_TOGGLE; - /* Set the Mode Register */ - USBFS_1_ep0Mode = USBFS_1_MODE_ACK_IN_STATUS_OUT; - /* Update the state (or stay the same) */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_CONTROL_READ; - } - else - { - /* Expect Status Stage Out */ - USBFS_1_ep0Mode = USBFS_1_MODE_STATUS_OUT_ONLY; - /* Update the state (or stay the same) */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_CONTROL_READ; - } - - /* Save the packet size for next time */ - USBFS_1_lastPacketSize = ep0Count; - USBFS_1_ep0Count = ep0Count; -} - - -/******************************************************************************* -* Function Name: USBFS_1_InitControlRead -******************************************************************************** -* -* Summary: -* Initialize a control read transaction, usable to send data to the host. -* The following global variables should be initialized before this function -* called. To send zero length packet use InitZeroLengthControlTransfer -* function. -* -* Parameters: -* None. -* -* Return: -* requestHandled state. -* -* Global variables: -* USBFS_1_currentTD.count - counts of data to be sent. -* USBFS_1_currentTD.pData - data pointer. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_InitControlRead(void) -{ - uint16 xferCount; - if(USBFS_1_currentTD.count == 0u) - { - (void) USBFS_1_InitZeroLengthControlTransfer(); - } - else - { - /* Set up the state machine */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_CONTROL_READ; - /* Set the toggle, it gets updated in LoadEP */ - USBFS_1_ep0Toggle = 0u; - /* Initialize the Status Block */ - USBFS_1_InitializeStatusBlock(); - xferCount = (((uint16)CY_GET_REG8(USBFS_1_lengthHi) << 8u) | (CY_GET_REG8(USBFS_1_lengthLo))); - - if (USBFS_1_currentTD.count > xferCount) - { - USBFS_1_currentTD.count = xferCount; - } - USBFS_1_LoadEP0(); - } - - return(USBFS_1_TRUE); -} - - -/******************************************************************************* -* Function Name: USBFS_1_InitZeroLengthControlTransfer -******************************************************************************** -* -* Summary: -* Initialize a zero length data IN transfer. -* -* Parameters: -* None. -* -* Return: -* requestHandled state. -* -* Global variables: -* USBFS_1_ep0Toggle - set to EP0_CNT_DATA_TOGGLE -* USBFS_1_ep0Mode - prepare for mode register content. -* USBFS_1_transferState - set to TRANS_STATE_CONTROL_READ -* USBFS_1_ep0Count - cleared, means the zero-length packet. -* USBFS_1_lastPacketSize - cleared. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_InitZeroLengthControlTransfer(void) - -{ - /* Update the state */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_CONTROL_READ; - /* Set the data toggle */ - USBFS_1_ep0Toggle = USBFS_1_EP0_CNT_DATA_TOGGLE; - /* Set the Mode Register */ - USBFS_1_ep0Mode = USBFS_1_MODE_ACK_IN_STATUS_OUT; - /* Save the packet size for next time */ - USBFS_1_lastPacketSize = 0u; - USBFS_1_ep0Count = 0u; - - return(USBFS_1_TRUE); -} - - -/******************************************************************************* -* Function Name: USBFS_1_ControlReadDataStage -******************************************************************************** -* -* Summary: -* Handle the Data Stage of a control read transfer. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_ControlReadDataStage(void) - -{ - USBFS_1_LoadEP0(); -} - - -/******************************************************************************* -* Function Name: USBFS_1_ControlReadStatusStage -******************************************************************************** -* -* Summary: -* Handle the Status Stage of a control read transfer. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_USBFS_transferByteCount - updated with last packet size. -* USBFS_1_transferState - set to TRANS_STATE_IDLE. -* USBFS_1_ep0Mode - set to MODE_STALL_IN_OUT. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_ControlReadStatusStage(void) -{ - /* Update the transfer byte count */ - USBFS_1_transferByteCount += USBFS_1_lastPacketSize; - /* Go Idle */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_IDLE; - /* Update the completion block */ - USBFS_1_UpdateStatusBlock(USBFS_1_XFER_STATUS_ACK); - /* We expect no more data, so stall INs and OUTs */ - USBFS_1_ep0Mode = USBFS_1_MODE_STALL_IN_OUT; -} - - -/******************************************************************************* -* Function Name: USBFS_1_InitControlWrite -******************************************************************************** -* -* Summary: -* Initialize a control write transaction -* -* Parameters: -* None. -* -* Return: -* requestHandled state. -* -* Global variables: -* USBFS_1_USBFS_transferState - set to TRANS_STATE_CONTROL_WRITE -* USBFS_1_ep0Toggle - set to EP0_CNT_DATA_TOGGLE -* USBFS_1_ep0Mode - set to MODE_ACK_OUT_STATUS_IN -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_InitControlWrite(void) -{ - uint16 xferCount; - - /* Set up the state machine */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_CONTROL_WRITE; - /* This might not be necessary */ - USBFS_1_ep0Toggle = USBFS_1_EP0_CNT_DATA_TOGGLE; - /* Initialize the Status Block */ - USBFS_1_InitializeStatusBlock(); - - xferCount = (((uint16)CY_GET_REG8(USBFS_1_lengthHi) << 8u) | (CY_GET_REG8(USBFS_1_lengthLo))); - - if (USBFS_1_currentTD.count > xferCount) - { - USBFS_1_currentTD.count = xferCount; - } - - /* Expect Data or Status Stage */ - USBFS_1_ep0Mode = USBFS_1_MODE_ACK_OUT_STATUS_IN; - - return(USBFS_1_TRUE); -} - - -/******************************************************************************* -* Function Name: USBFS_1_ControlWriteDataStage -******************************************************************************** -* -* Summary: -* Handle the Data Stage of a control write transfer -* 1. Get the data (We assume the destination was validated previously) -* 2. Update the count and data toggle -* 3. Update the mode register for the next transaction -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_transferByteCount - Update the transfer byte count from the -* last transaction. -* USBFS_1_ep0Count - counts the data loaded from the SIE memory -* in current packet. -* USBFS_1_transferByteCount - sum of the previous bytes transferred -* on previous packets(sum of USBFS_lastPacketSize) -* USBFS_1_ep0Toggle - inverted -* USBFS_1_ep0Mode - set to MODE_ACK_OUT_STATUS_IN. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_ControlWriteDataStage(void) -{ - uint8 ep0Count; - uint8 regIndex = 0u; - - ep0Count = (CY_GET_REG8(USBFS_1_EP0_CNT_PTR) & USBFS_1_EPX_CNT0_MASK) - - USBFS_1_EPX_CNTX_CRC_COUNT; - - USBFS_1_transferByteCount += ep0Count; - - while ((USBFS_1_currentTD.count > 0u) && (ep0Count > 0u)) - { - *USBFS_1_currentTD.pData = CY_GET_REG8((reg8 *)(USBFS_1_EP0_DR0_IND + regIndex)); - USBFS_1_currentTD.pData = &USBFS_1_currentTD.pData[1u]; - regIndex++; - ep0Count--; - USBFS_1_currentTD.count--; - } - USBFS_1_ep0Count = ep0Count; - /* Update the data toggle */ - USBFS_1_ep0Toggle ^= USBFS_1_EP0_CNT_DATA_TOGGLE; - /* Expect Data or Status Stage */ - USBFS_1_ep0Mode = USBFS_1_MODE_ACK_OUT_STATUS_IN; -} - - -/******************************************************************************* -* Function Name: USBFS_1_ControlWriteStatusStage -******************************************************************************** -* -* Summary: -* Handle the Status Stage of a control write transfer -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_transferState - set to TRANS_STATE_IDLE. -* USBFS_1_USBFS_ep0Mode - set to MODE_STALL_IN_OUT. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_ControlWriteStatusStage(void) -{ - /* Go Idle */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_IDLE; - /* Update the completion block */ - USBFS_1_UpdateStatusBlock(USBFS_1_XFER_STATUS_ACK); - /* We expect no more data, so stall INs and OUTs */ - USBFS_1_ep0Mode = USBFS_1_MODE_STALL_IN_OUT; -} - - -/******************************************************************************* -* Function Name: USBFS_1_InitNoDataControlTransfer -******************************************************************************** -* -* Summary: -* Initialize a no data control transfer -* -* Parameters: -* None. -* -* Return: -* requestHandled state. -* -* Global variables: -* USBFS_1_transferState - set to TRANS_STATE_NO_DATA_CONTROL. -* USBFS_1_ep0Mode - set to MODE_STATUS_IN_ONLY. -* USBFS_1_ep0Count - cleared. -* USBFS_1_ep0Toggle - set to EP0_CNT_DATA_TOGGLE -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_InitNoDataControlTransfer(void) -{ - USBFS_1_transferState = USBFS_1_TRANS_STATE_NO_DATA_CONTROL; - USBFS_1_ep0Mode = USBFS_1_MODE_STATUS_IN_ONLY; - USBFS_1_ep0Toggle = USBFS_1_EP0_CNT_DATA_TOGGLE; - USBFS_1_ep0Count = 0u; - - return(USBFS_1_TRUE); -} - - -/******************************************************************************* -* Function Name: USBFS_1_NoDataControlStatusStage -******************************************************************************** -* Summary: -* Handle the Status Stage of a no data control transfer. -* -* SET_ADDRESS is special, since we need to receive the status stage with -* the old address. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_transferState - set to TRANS_STATE_IDLE. -* USBFS_1_ep0Mode - set to MODE_STALL_IN_OUT. -* USBFS_1_ep0Toggle - set to EP0_CNT_DATA_TOGGLE -* USBFS_1_deviceAddress - used to set new address and cleared -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_NoDataControlStatusStage(void) -{ - /* Change the USB address register if we got a SET_ADDRESS. */ - if (USBFS_1_deviceAddress != 0u) - { - CY_SET_REG8(USBFS_1_CR0_PTR, USBFS_1_deviceAddress | USBFS_1_CR0_ENABLE); - USBFS_1_deviceAddress = 0u; - } - /* Go Idle */ - USBFS_1_transferState = USBFS_1_TRANS_STATE_IDLE; - /* Update the completion block */ - USBFS_1_UpdateStatusBlock(USBFS_1_XFER_STATUS_ACK); - /* We expect no more data, so stall INs and OUTs */ - USBFS_1_ep0Mode = USBFS_1_MODE_STALL_IN_OUT; -} - - -/******************************************************************************* -* Function Name: USBFS_1_UpdateStatusBlock -******************************************************************************** -* -* Summary: -* Update the Completion Status Block for a Request. The block is updated -* with the completion code the USBFS_1_transferByteCount. The -* StatusBlock Pointer is set to NULL. -* -* Parameters: -* completionCode - status. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_currentTD.pStatusBlock->status - updated by the -* completionCode parameter. -* USBFS_1_currentTD.pStatusBlock->length - updated. -* USBFS_1_currentTD.pStatusBlock - cleared. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_UpdateStatusBlock(uint8 completionCode) -{ - if (USBFS_1_currentTD.pStatusBlock != NULL) - { - USBFS_1_currentTD.pStatusBlock->status = completionCode; - USBFS_1_currentTD.pStatusBlock->length = USBFS_1_transferByteCount; - USBFS_1_currentTD.pStatusBlock = NULL; - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_InitializeStatusBlock -******************************************************************************** -* -* Summary: -* Initialize the Completion Status Block for a Request. The completion -* code is set to USB_XFER_IDLE. -* -* Also, initializes USBFS_1_transferByteCount. Save some space, -* this is the only consumer. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_currentTD.pStatusBlock->status - set to XFER_IDLE. -* USBFS_1_currentTD.pStatusBlock->length - cleared. -* USBFS_1_transferByteCount - cleared. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_InitializeStatusBlock(void) -{ - USBFS_1_transferByteCount = 0u; - if(USBFS_1_currentTD.pStatusBlock != NULL) - { - USBFS_1_currentTD.pStatusBlock->status = USBFS_1_XFER_IDLE; - USBFS_1_currentTD.pStatusBlock->length = 0u; - } -} - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_episr.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_episr.c deleted file mode 100644 index d5edbb37..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_episr.c +++ /dev/null @@ -1,658 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_episr.c -* Version 2.60 -* -* Description: -* Data endpoint Interrupt Service Routines -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" -#include "USBFS_1_pvt.h" -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) && (USBFS_1_ENABLE_MIDI_API != 0u) - #include "USBFS_1_midi.h" -#endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - - -/*************************************** -* Custom Declarations -***************************************/ -/* `#START CUSTOM_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -#if(USBFS_1_EP1_ISR_REMOVE == 0u) - - - /****************************************************************************** - * Function Name: USBFS_1_EP_1_ISR - ******************************************************************************* - * - * Summary: - * Endpoint 1 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - ******************************************************************************/ - CY_ISR(USBFS_1_EP_1_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - - /* `#START EP1_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - - CY_GET_REG8(USBFS_1_SIE_EP1_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP1].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP1].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP1].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) & - (uint8)~USBFS_1_SIE_EP_INT_EP1_MASK); - - #if( defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT ) - if(USBFS_1_midi_out_ep == USBFS_1_EP1) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP1_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if ( defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 ) - EA = int_en; - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - } - -#endif /* End USBFS_1_EP1_ISR_REMOVE */ - - -#if(USBFS_1_EP2_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_2_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 2 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_2_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - - /* `#START EP2_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 ) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - - CY_GET_REG8(USBFS_1_SIE_EP2_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP2].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP2].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP2].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP2_MASK); - - #if( defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT ) - if(USBFS_1_midi_out_ep == USBFS_1_EP2) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP2_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - } - -#endif /* End USBFS_1_EP2_ISR_REMOVE */ - - -#if(USBFS_1_EP3_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_3_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 3 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_3_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ - - /* `#START EP3_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - CY_GET_REG8(USBFS_1_SIE_EP3_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP3].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP3].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP3].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP3_MASK); - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT) - if(USBFS_1_midi_out_ep == USBFS_1_EP3) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP3_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - } - -#endif /* End USBFS_1_EP3_ISR_REMOVE */ - - -#if(USBFS_1_EP4_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_4_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 4 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_4_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP4_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - CY_GET_REG8(USBFS_1_SIE_EP4_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP4].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP4].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP4].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP4_MASK); - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT) - if(USBFS_1_midi_out_ep == USBFS_1_EP4) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP4_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - } - -#endif /* End USBFS_1_EP4_ISR_REMOVE */ - - -#if(USBFS_1_EP5_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_5_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 5 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_5_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP5_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - CY_GET_REG8(USBFS_1_SIE_EP5_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP5].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP5].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP5].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP5_MASK); - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT) - if(USBFS_1_midi_out_ep == USBFS_1_EP5) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP5_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - } -#endif /* End USBFS_1_EP5_ISR_REMOVE */ - - -#if(USBFS_1_EP6_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_6_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 6 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_6_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP6_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - CY_GET_REG8(USBFS_1_SIE_EP6_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP6].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP6].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP6].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP6_MASK); - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT) - if(USBFS_1_midi_out_ep == USBFS_1_EP6) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP6_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - } - -#endif /* End USBFS_1_EP6_ISR_REMOVE */ - - -#if(USBFS_1_EP7_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_7_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 7 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_7_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP7_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - CY_GET_REG8(USBFS_1_SIE_EP7_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP7].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP7].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP7].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP7_MASK); - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT) - if(USBFS_1_midi_out_ep == USBFS_1_EP7) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP7_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - } - -#endif /* End USBFS_1_EP7_ISR_REMOVE */ - - -#if(USBFS_1_EP8_ISR_REMOVE == 0u) - - /******************************************************************************* - * Function Name: USBFS_1_EP_8_ISR - ******************************************************************************** - * - * Summary: - * Endpoint 8 Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_EP_8_ISR) - { - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - uint8 int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP8_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - int_en = EA; - CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - - CY_GET_REG8(USBFS_1_SIE_EP8_CR0_PTR); /* Must read the mode reg */ - /* Do not toggle ISOC endpoint */ - if((USBFS_1_EP[USBFS_1_EP8].attrib & USBFS_1_EP_TYPE_MASK) != - USBFS_1_EP_TYPE_ISOC) - { - USBFS_1_EP[USBFS_1_EP8].epToggle ^= USBFS_1_EPX_CNT_DATA_TOGGLE; - } - USBFS_1_EP[USBFS_1_EP8].apiEpState = USBFS_1_EVENT_PENDING; - CY_SET_REG8(USBFS_1_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_1_SIE_EP_INT_SR_PTR) - & (uint8)~USBFS_1_SIE_EP_INT_EP8_MASK); - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT) - if(USBFS_1_midi_out_ep == USBFS_1_EP8) - { - USBFS_1_MIDI_OUT_EP_Service(); - } - #endif /* End USBFS_1_ISR_SERVICE_MIDI_OUT */ - - /* `#START EP8_END_USER_CODE` Place your code here */ - - /* `#END` */ - - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_OUT && CY_PSOC3) - EA = int_en; - #endif /* CY_PSOC3 & USBFS_1_ISR_SERVICE_MIDI_OUT */ - } - -#endif /* End USBFS_1_EP8_ISR_REMOVE */ - - -/******************************************************************************* -* Function Name: USBFS_1_SOF_ISR -******************************************************************************** -* -* Summary: -* Start of Frame Interrupt Service Routine -* -* Parameters: -* None. -* -* Return: -* None. -* -*******************************************************************************/ -CY_ISR(USBFS_1_SOF_ISR) -{ - /* `#START SOF_USER_CODE` Place your code here */ - - /* `#END` */ -} - - -/******************************************************************************* -* Function Name: USBFS_1_BUS_RESET_ISR -******************************************************************************** -* -* Summary: -* USB Bus Reset Interrupt Service Routine. Calls _Start with the same -* parameters as the last USER call to _Start -* -* Parameters: -* None. -* -* Return: -* None. -* -*******************************************************************************/ -CY_ISR(USBFS_1_BUS_RESET_ISR) -{ - /* `#START BUS_RESET_USER_CODE` Place your code here */ - - /* `#END` */ - - USBFS_1_ReInitComponent(); -} - - -#if((USBFS_1_EP_MM != USBFS_1__EP_MANUAL) && (USBFS_1_ARB_ISR_REMOVE == 0u)) - - - /******************************************************************************* - * Function Name: USBFS_1_ARB_ISR - ******************************************************************************** - * - * Summary: - * Arbiter Interrupt Service Routine - * - * Parameters: - * None. - * - * Return: - * None. - * - * Side effect: - * Search for EP8 int_status will be much slower than search for EP1 int_status. - * - *******************************************************************************/ - CY_ISR(USBFS_1_ARB_ISR) - { - uint8 int_status; - uint8 ep_status; - uint8 ep = USBFS_1_EP1; - uint8 ptr = 0u; - - /* `#START ARB_BEGIN_USER_CODE` Place your code here */ - - /* `#END` */ - - int_status = USBFS_1_ARB_INT_SR_REG; /* read Arbiter Status Register */ - USBFS_1_ARB_INT_SR_REG = int_status; /* Clear Serviced Interrupts */ - - while(int_status != 0u) - { - if((int_status & 1u) != 0u) /* If EpX interrupt present */ - { /* read Endpoint Status Register */ - ep_status = CY_GET_REG8((reg8 *)(USBFS_1_ARB_EP1_SR_IND + ptr)); - /* If In Buffer Full */ - if((ep_status & USBFS_1_ARB_EPX_SR_IN_BUF_FULL) != 0u) - { - if((USBFS_1_EP[ep].addr & USBFS_1_DIR_IN) != 0u) - { - /* Clear Data ready status */ - *(reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ptr) &= - (uint8)~USBFS_1_ARB_EPX_CFG_IN_DATA_RDY; - /* Write the Mode register */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ptr), USBFS_1_EP[ep].epMode); - #if (defined(USBFS_1_ENABLE_MIDI_STREAMING) && USBFS_1_ISR_SERVICE_MIDI_IN) - if(ep == USBFS_1_midi_in_ep) - { /* Clear MIDI input pointer */ - USBFS_1_midiInPointer = 0u; - } - #endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - } - } - /* (re)arm Out EP only for mode2 */ - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - /* If DMA Grant */ - if((ep_status & USBFS_1_ARB_EPX_SR_DMA_GNT) != 0u) - { - if((USBFS_1_EP[ep].addr & USBFS_1_DIR_IN) == 0u) - { - USBFS_1_EP[ep].apiEpState = USBFS_1_NO_EVENT_PENDING; - /* Write the Mode register */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ptr), - USBFS_1_EP[ep].epMode); - } - } - #endif /* End USBFS_1_EP_MM */ - - /* `#START ARB_USER_CODE` Place your code here for handle Buffer Underflow/Overflow */ - - /* `#END` */ - - CY_SET_REG8((reg8 *)(USBFS_1_ARB_EP1_SR_IND + ptr), ep_status); /* Clear Serviced events */ - } - ptr += USBFS_1_EPX_CNTX_ADDR_OFFSET; /* prepare pointer for next EP */ - ep++; - int_status >>= 1u; - } - - /* `#START ARB_END_USER_CODE` Place your code here */ - - /* `#END` */ - } - -#endif /* End USBFS_1_EP_MM */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.c deleted file mode 100644 index 0bd70d96..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.c +++ /dev/null @@ -1,422 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_hid.c -* Version 2.60 -* -* Description: -* USB HID Class request handler. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" - -#if defined(USBFS_1_ENABLE_HID_CLASS) - -#include "USBFS_1_pvt.h" -#include "USBFS_1_hid.h" - - -/*************************************** -* HID Variables -***************************************/ - -volatile uint8 USBFS_1_hidProtocol[USBFS_1_MAX_INTERFACES_NUMBER]; /* HID device protocol status */ -volatile uint8 USBFS_1_hidIdleRate[USBFS_1_MAX_INTERFACES_NUMBER]; /* HID device idle reload value */ -volatile uint8 USBFS_1_hidIdleTimer[USBFS_1_MAX_INTERFACES_NUMBER]; /* HID device idle rate value */ - - -/*************************************** -* Custom Declarations -***************************************/ - -/* `#START HID_CUSTOM_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/******************************************************************************* -* Function Name: USBFS_1_UpdateHIDTimer -******************************************************************************** -* -* Summary: -* Updates the HID report timer and reloads it if expired -* -* Parameters: -* interface: Interface Number. -* -* Return: -* status. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_UpdateHIDTimer(uint8 interface) -{ - uint8 stat = USBFS_1_IDLE_TIMER_INDEFINITE; - - if(USBFS_1_hidIdleRate[interface] != 0u) - { - if(USBFS_1_hidIdleTimer[interface] > 0u) - { - USBFS_1_hidIdleTimer[interface]--; - stat = USBFS_1_IDLE_TIMER_RUNNING; - } - else - { - USBFS_1_hidIdleTimer[interface] = USBFS_1_hidIdleRate[interface]; - stat = USBFS_1_IDLE_TIMER_EXPIRED; - } - } - - return(stat); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetProtocol -******************************************************************************** -* -* Summary: -* Returns the selected protocol value to the application -* -* Parameters: -* interface: Interface Number. -* -* Return: -* Interface protocol. -* -*******************************************************************************/ -uint8 USBFS_1_GetProtocol(uint8 interface) -{ - return(USBFS_1_hidProtocol[interface]); -} - - -/******************************************************************************* -* Function Name: USBFS_1_DispatchHIDClassRqst -******************************************************************************** -* -* Summary: -* This routine dispatches class requests -* -* Parameters: -* None. -* -* Return: -* requestHandled -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_DispatchHIDClassRqst(void) -{ - uint8 requestHandled = USBFS_1_FALSE; - uint8 interfaceNumber; - - interfaceNumber = CY_GET_REG8(USBFS_1_wIndexLo); - if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == USBFS_1_RQST_DIR_D2H) - { /* Control Read */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_GET_DESCRIPTOR: - if (CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_DESCR_HID_CLASS) - { - USBFS_1_FindHidClassDecriptor(); - if (USBFS_1_currentTD.count != 0u) - { - requestHandled = USBFS_1_InitControlRead(); - } - } - else if (CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_DESCR_HID_REPORT) - { - USBFS_1_FindReportDescriptor(); - if (USBFS_1_currentTD.count != 0u) - { - requestHandled = USBFS_1_InitControlRead(); - } - } - else - { /* requestHandled is initialezed as FALSE by default */ - } - break; - case USBFS_1_HID_GET_REPORT: - USBFS_1_FindReport(); - if (USBFS_1_currentTD.count != 0u) - { - requestHandled = USBFS_1_InitControlRead(); - } - break; - - case USBFS_1_HID_GET_IDLE: - /* This function does not support multiple reports per interface*/ - /* Validate interfaceNumber and Report ID (should be 0) */ - if( (interfaceNumber < USBFS_1_MAX_INTERFACES_NUMBER) && - (CY_GET_REG8(USBFS_1_wValueLo) == 0u ) ) /* Do not support Idle per Report ID */ - { - USBFS_1_currentTD.count = 1u; - USBFS_1_currentTD.pData = &USBFS_1_hidIdleRate[interfaceNumber]; - requestHandled = USBFS_1_InitControlRead(); - } - break; - case USBFS_1_HID_GET_PROTOCOL: - /* Validate interfaceNumber */ - if( interfaceNumber < USBFS_1_MAX_INTERFACES_NUMBER) - { - USBFS_1_currentTD.count = 1u; - USBFS_1_currentTD.pData = &USBFS_1_hidProtocol[interfaceNumber]; - requestHandled = USBFS_1_InitControlRead(); - } - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - } - else if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == - USBFS_1_RQST_DIR_H2D) - { /* Control Write */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_HID_SET_REPORT: - USBFS_1_FindReport(); - if (USBFS_1_currentTD.count != 0u) - { - requestHandled = USBFS_1_InitControlWrite(); - } - break; - case USBFS_1_HID_SET_IDLE: - /* This function does not support multiple reports per interface */ - /* Validate interfaceNumber and Report ID (should be 0) */ - if( (interfaceNumber < USBFS_1_MAX_INTERFACES_NUMBER) && - (CY_GET_REG8(USBFS_1_wValueLo) == 0u ) ) /* Do not support Idle per Report ID */ - { - USBFS_1_hidIdleRate[interfaceNumber] = CY_GET_REG8(USBFS_1_wValueHi); - /* With regards to HID spec: "7.2.4 Set_Idle Request" - * Latency. If the current period has gone past the - * newly proscribed time duration, then a report - * will be generated immediately. - */ - if(USBFS_1_hidIdleRate[interfaceNumber] < - USBFS_1_hidIdleTimer[interfaceNumber]) - { - /* Set the timer to zero and let the UpdateHIDTimer() API return IDLE_TIMER_EXPIRED status*/ - USBFS_1_hidIdleTimer[interfaceNumber] = 0u; - } - /* If the new request is received within 4 milliseconds - * (1 count) of the end of the current period, then the - * new request will have no effect until after the report. - */ - else if(USBFS_1_hidIdleTimer[interfaceNumber] <= 1u) - { - /* Do nothing. - * Let the UpdateHIDTimer() API continue to work and - * return IDLE_TIMER_EXPIRED status - */ - } - else - { /* Reload the timer*/ - USBFS_1_hidIdleTimer[interfaceNumber] = - USBFS_1_hidIdleRate[interfaceNumber]; - } - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - - case USBFS_1_HID_SET_PROTOCOL: - /* Validate interfaceNumber and protocol (must be 0 or 1) */ - if( (interfaceNumber < USBFS_1_MAX_INTERFACES_NUMBER) && - (CY_GET_REG8(USBFS_1_wValueLo) <= 1u) ) - { - USBFS_1_hidProtocol[interfaceNumber] = CY_GET_REG8(USBFS_1_wValueLo); - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - } - else - { /* requestHandled is initialized as FALSE by default */ - } - - return(requestHandled); -} - - -/******************************************************************************* -* Function Name: USB_FindHidClassDescriptor -******************************************************************************** -* -* Summary: -* This routine find Hid Class Descriptor pointer based on the Interface number -* and Alternate setting then loads the currentTD structure with the address of -* the buffer and the size. -* The HID Class Descriptor resides inside the config descriptor. -* -* Parameters: -* None. -* -* Return: -* currentTD -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_FindHidClassDecriptor(void) -{ - const T_USBFS_1_LUT CYCODE *pTmp; - volatile uint8 *pDescr; - uint8 interfaceN; - - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - interfaceN = CY_GET_REG8(USBFS_1_wIndexLo); - /* Third entry in the LUT starts the Interface Table pointers */ - /* Now use the request interface number*/ - pTmp = &pTmp[interfaceN + 2u]; - /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_TABLE */ - pTmp = (const T_USBFS_1_LUT CYCODE *) pTmp->p_list; - /* Now use Alternate setting number */ - pTmp = &pTmp[USBFS_1_interfaceSetting[interfaceN]]; - /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_ALTERNATEi_HID_TABLE */ - pTmp = (const T_USBFS_1_LUT CYCODE *) pTmp->p_list; - /* Fifth entry in the LUT points to Hid Class Descriptor in Configuration Descriptor */ - pTmp = &pTmp[4u]; - pDescr = (volatile uint8 *)pTmp->p_list; - /* The first byte contains the descriptor length */ - USBFS_1_currentTD.count = *pDescr; - USBFS_1_currentTD.pData = pDescr; -} - - -/******************************************************************************* -* Function Name: USB_FindReportDescriptor -******************************************************************************** -* -* Summary: -* This routine find Hid Report Descriptor pointer based on the Interface -* number, then loads the currentTD structure with the address of the buffer -* and the size. -* Hid Report Descriptor is located after IN/OUT/FEATURE reports. -* -* Parameters: -* void -* -* Return: -* currentTD -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_FindReportDescriptor(void) -{ - const T_USBFS_1_LUT CYCODE *pTmp; - volatile uint8 *pDescr; - uint8 interfaceN; - - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - interfaceN = CY_GET_REG8(USBFS_1_wIndexLo); - /* Third entry in the LUT starts the Interface Table pointers */ - /* Now use the request interface number */ - pTmp = &pTmp[interfaceN + 2u]; - /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_TABLE */ - pTmp = (const T_USBFS_1_LUT CYCODE *) pTmp->p_list; - /* Now use Alternate setting number */ - pTmp = &pTmp[USBFS_1_interfaceSetting[interfaceN]]; - /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_ALTERNATEi_HID_TABLE */ - pTmp = (const T_USBFS_1_LUT CYCODE *) pTmp->p_list; - /* Fourth entry in the LUT starts the Hid Report Descriptor */ - pTmp = &pTmp[3u]; - pDescr = (volatile uint8 *)pTmp->p_list; - /* The 1st and 2nd bytes of descriptor contain its length. LSB is 1st. */ - USBFS_1_currentTD.count = (((uint16)pDescr[1u] << 8u) | pDescr[0u]); - USBFS_1_currentTD.pData = &pDescr[2u]; -} - - -/******************************************************************************* -* Function Name: USBFS_1_FindReport -******************************************************************************** -* -* Summary: -* This routine sets up a transfer based on the Interface number, Report Type -* and Report ID, then loads the currentTD structure with the address of the -* buffer and the size. The caller has to decide if it is a control read or -* control write. -* -* Parameters: -* None. -* -* Return: -* currentTD -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_FindReport(void) -{ - const T_USBFS_1_LUT CYCODE *pTmp; - T_USBFS_1_TD *pTD; - uint8 interfaceN; - uint8 reportType; - - /* `#START HID_FINDREPORT` Place custom handling here */ - - /* `#END` */ - USBFS_1_currentTD.count = 0u; /* Init not supported condition */ - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - reportType = CY_GET_REG8(USBFS_1_wValueHi); - interfaceN = CY_GET_REG8(USBFS_1_wIndexLo); - /* Third entry in the LUT COnfiguration Table starts the Interface Table pointers */ - /* Now use the request interface number */ - pTmp = &pTmp[interfaceN + 2u]; - /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_TABLE*/ - pTmp = (const T_USBFS_1_LUT CYCODE *) pTmp->p_list; - if(interfaceN < USBFS_1_MAX_INTERFACES_NUMBER) - { - /* Now use Alternate setting number */ - pTmp = &pTmp[USBFS_1_interfaceSetting[interfaceN]]; - /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_ALTERNATEi_HID_TABLE */ - pTmp = (const T_USBFS_1_LUT CYCODE *) pTmp->p_list; - /* Validate reportType to comply with "7.2.1 Get_Report Request" */ - if((reportType >= USBFS_1_HID_GET_REPORT_INPUT) && - (reportType <= USBFS_1_HID_GET_REPORT_FEATURE)) - { - /* Get the entry proper TD (IN, OUT or Feature Report Table)*/ - pTmp = &pTmp[reportType - 1u]; - reportType = CY_GET_REG8(USBFS_1_wValueLo); /* Get reportID */ - /* Validate table support by the HID descriptor, compare table count with reportID */ - if(pTmp->c >= reportType) - { - pTD = (T_USBFS_1_TD *) pTmp->p_list; - pTD = &pTD[reportType]; /* select entry depend on report ID*/ - USBFS_1_currentTD.pData = pTD->pData; /* Buffer pointer */ - USBFS_1_currentTD.count = pTD->count; /* Buffer Size */ - USBFS_1_currentTD.pStatusBlock = pTD->pStatusBlock; - } - } - } -} - - -/******************************************************************************* -* Additional user functions supporting HID Requests -********************************************************************************/ - -/* `#START HID_FUNCTIONS` Place any additional functions here */ - -/* `#END` */ - -#endif /* End USBFS_1_ENABLE_HID_CLASS */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.h deleted file mode 100644 index 6217850f..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_hid.h +++ /dev/null @@ -1,64 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_hid.h -* Version 2.60 -* -* Description: -* Header File for the USFS component. Contains prototypes and constant values. -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_USBFS_USBFS_1_hid_H) -#define CY_USBFS_USBFS_1_hid_H - -#include "cytypes.h" - - -/*************************************** -* Prototypes of the USBFS_1_hid API. -***************************************/ - -uint8 USBFS_1_UpdateHIDTimer(uint8 interface) ; -uint8 USBFS_1_GetProtocol(uint8 interface) ; - - -/*************************************** -*Renamed Functions for backward compatible -***************************************/ - -#define USBFS_1_bGetProtocol USBFS_1_GetProtocol - - -/*************************************** -* Constants for USBFS_1_hid API. -***************************************/ - -#define USBFS_1_PROTOCOL_BOOT (0x00u) -#define USBFS_1_PROTOCOL_REPORT (0x01u) - -/* Request Types (HID Chapter 7.2) */ -#define USBFS_1_HID_GET_REPORT (0x01u) -#define USBFS_1_HID_GET_IDLE (0x02u) -#define USBFS_1_HID_GET_PROTOCOL (0x03u) -#define USBFS_1_HID_SET_REPORT (0x09u) -#define USBFS_1_HID_SET_IDLE (0x0Au) -#define USBFS_1_HID_SET_PROTOCOL (0x0Bu) - -/* Descriptor Types (HID Chapter 7.1) */ -#define USBFS_1_DESCR_HID_CLASS (0x21u) -#define USBFS_1_DESCR_HID_REPORT (0x22u) -#define USBFS_1_DESCR_HID_PHYSICAL (0x23u) - -/* Report Request Types (HID Chapter 7.2.1) */ -#define USBFS_1_HID_GET_REPORT_INPUT (0x01u) -#define USBFS_1_HID_GET_REPORT_OUTPUT (0x02u) -#define USBFS_1_HID_GET_REPORT_FEATURE (0x03u) - -#endif /* End CY_USBFS_USBFS_1_hid_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.c deleted file mode 100644 index 9b525415..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.c +++ /dev/null @@ -1,1341 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_midi.c -* Version 2.60 -* -* Description: -* MIDI Streaming request handler. -* This file contains routines for sending and receiving MIDI -* messages, and handles running status in both directions. -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" - -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) - -#include "USBFS_1_midi.h" -#include "USBFS_1_pvt.h" - - -/*************************************** -* MIDI Constants -***************************************/ - -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - /* The Size of the MIDI messages (MIDI Table 4-1) */ - static const uint8 CYCODE USBFS_1_MIDI_SIZE[] = { - /* Miscellaneous function codes(Reserved) */ 0x03u, - /* Cable events (Reserved) */ 0x03u, - /* Two-byte System Common messages */ 0x02u, - /* Three-byte System Common messages */ 0x03u, - /* SysEx starts or continues */ 0x03u, - /* Single-byte System Common Message or - SysEx ends with following single byte */ 0x01u, - /* SysEx ends with following two bytes */ 0x02u, - /* SysEx ends with following three bytes */ 0x03u, - /* Note-off */ 0x03u, - /* Note-on */ 0x03u, - /* Poly-KeyPress */ 0x03u, - /* Control Change */ 0x03u, - /* Program Change */ 0x02u, - /* Channel Pressure */ 0x02u, - /* PitchBend Change */ 0x03u, - /* Single Byte */ 0x01u - }; -#endif /* USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - - -/*************************************** -* Global variables -***************************************/ - -#if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) - #if (USBFS_1_MIDI_IN_BUFF_SIZE >= 256) - volatile uint16 USBFS_1_midiInPointer; /* Input endpoint buffer pointer */ - #else - volatile uint8 USBFS_1_midiInPointer; /* Input endpoint buffer pointer */ - #endif /* End USBFS_1_MIDI_IN_BUFF_SIZE >=256 */ - volatile uint8 USBFS_1_midi_in_ep; /* Input endpoint number */ - uint8 USBFS_1_midiInBuffer[USBFS_1_MIDI_IN_BUFF_SIZE]; /* Input endpoint buffer */ -#endif /* USBFS_1_MIDI_IN_BUFF_SIZE > 0 */ - -#if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) - volatile uint8 USBFS_1_midi_out_ep; /* Output endpoint number */ - uint8 USBFS_1_midiOutBuffer[USBFS_1_MIDI_OUT_BUFF_SIZE]; /* Output endpoint buffer */ -#endif /* USBFS_1_MIDI_OUT_BUFF_SIZE > 0 */ - -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - static USBFS_1_MIDI_RX_STATUS USBFS_1_MIDI1_Event; /* MIDI RX status structure */ - static volatile uint8 USBFS_1_MIDI1_TxRunStat; /* MIDI Output running status */ - volatile uint8 USBFS_1_MIDI1_InqFlags; /* Device inquiry flag */ - - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - static USBFS_1_MIDI_RX_STATUS USBFS_1_MIDI2_Event; /* MIDI RX status structure */ - static volatile uint8 USBFS_1_MIDI2_TxRunStat; /* MIDI Output running status */ - volatile uint8 USBFS_1_MIDI2_InqFlags; /* Device inquiry flag */ - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - -/*************************************** -* Custom Declarations -***************************************/ - -/* `#START MIDI_CUSTOM_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/*************************************** -* Optional MIDI APIs -***************************************/ -#if (USBFS_1_ENABLE_MIDI_API != 0u) - - -/******************************************************************************* -* Function Name: USBFS_1_MIDI_EP_Init -******************************************************************************** -* -* Summary: -* This function initializes the MIDI interface and UART(s) to be ready to -* receive data from the PC and MIDI ports. -* -* Parameters: -* None -* -* Return: -* None -* -* Global variables: -* USBFS_1_midiInBuffer: This buffer is used for saving and combining -* the received data from UART(s) and(or) generated internally by -* PutUsbMidiIn() function messages. USBFS_1_MIDI_IN_EP_Service() -* function transfers the data from this buffer to the PC. -* USBFS_1_midiOutBuffer: This buffer is used by the -* USBFS_1_MIDI_OUT_EP_Service() function for saving the received -* from the PC data, then the data are parsed and transferred to UART(s) -* buffer and to the internal processing by the -* USBFS_1_callbackLocalMidiEvent function. -* USBFS_1_midi_out_ep: Used as an OUT endpoint number. -* USBFS_1_midi_in_ep: Used as an IN endpoint number. -* USBFS_1_midiInPointer: Initialized to zero. -* -* Reentrant: -* No -* -*******************************************************************************/ -void USBFS_1_MIDI_EP_Init(void) -{ - #if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) - USBFS_1_midiInPointer = 0u; - #endif /* USBFS_1_MIDI_IN_BUFF_SIZE > 0 */ - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - #if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) - /* Init DMA configurations for IN EP*/ - USBFS_1_LoadInEP(USBFS_1_midi_in_ep, USBFS_1_midiInBuffer, - USBFS_1_MIDI_IN_BUFF_SIZE); - - #endif /* USBFS_1_MIDI_IN_BUFF_SIZE > 0 */ - #if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) - /* Init DMA configurations for OUT EP*/ - (void)USBFS_1_ReadOutEP(USBFS_1_midi_out_ep, USBFS_1_midiOutBuffer, - USBFS_1_MIDI_OUT_BUFF_SIZE); - #endif /*USBFS_1_MIDI_OUT_BUFF_SIZE > 0 */ - #endif /* End USBFS_1__EP_DMAAUTO */ - - #if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) - USBFS_1_EnableOutEP(USBFS_1_midi_out_ep); - #endif /* USBFS_1_MIDI_OUT_BUFF_SIZE > 0 */ - - /* Initialize the MIDI port(s) */ - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - USBFS_1_MIDI_Init(); - #endif /* USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ -} - -#if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI_OUT_EP_Service - ******************************************************************************** - * - * Summary: - * Services the USB MIDI OUT endpoints. - * This function is called from OUT EP ISR. It transfers the received from PC - * data to the external MIDI port(UART TX buffer) and calls the - * USBFS_1_callbackLocalMidiEvent() function to internal process - * of the MIDI data. - * This function is blocked by UART, if not enough space is available in UART - * TX buffer. Therefore it is recommended to use large UART TX buffer size. - * - * Parameters: - * None - * - * Return: - * None - * - * Global variables: - * USBFS_1_midiOutBuffer: Used as temporary buffer between USB internal - * memory and UART TX buffer. - * USBFS_1_midi_out_ep: Used as an OUT endpoint number. - * - * Reentrant: - * No - * - *******************************************************************************/ - void USBFS_1_MIDI_OUT_EP_Service(void) - { - #if USBFS_1_MIDI_OUT_BUFF_SIZE >= 256 - uint16 outLength; - uint16 outPointer; - #else - uint8 outLength; - uint8 outPointer; - #endif /* End USBFS_1_MIDI_OUT_BUFF_SIZE >=256 */ - - uint8 dmaState = 0u; - - /* Service the USB MIDI output endpoint */ - if (USBFS_1_GetEPState(USBFS_1_midi_out_ep) == USBFS_1_OUT_BUFFER_FULL) - { - #if USBFS_1_MIDI_OUT_BUFF_SIZE >= 256 - outLength = USBFS_1_GetEPCount(USBFS_1_midi_out_ep); - #else - outLength = (uint8)USBFS_1_GetEPCount(USBFS_1_midi_out_ep); - #endif /* End USBFS_1_MIDI_OUT_BUFF_SIZE >= 256 */ - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - #if USBFS_1_MIDI_OUT_BUFF_SIZE >= 256 - outLength = USBFS_1_ReadOutEP(USBFS_1_midi_out_ep, - USBFS_1_midiOutBuffer, outLength); - #else - outLength = (uint8)USBFS_1_ReadOutEP(USBFS_1_midi_out_ep, - USBFS_1_midiOutBuffer, (uint16)outLength); - #endif /* End USBFS_1_MIDI_OUT_BUFF_SIZE >= 256 */ - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL) - do /* wait for DMA transfer complete */ - { - (void)CyDmaChStatus(USBFS_1_DmaChan[USBFS_1_midi_out_ep], NULL, &dmaState); - }while((dmaState & (STATUS_TD_ACTIVE | STATUS_CHAIN_ACTIVE)) != 0u); - #endif /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */ - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - if(dmaState != 0u) - { - /* Suppress compiler warning */ - } - if (outLength >= USBFS_1_EVENT_LENGTH) - { - outPointer = 0u; - while (outPointer < outLength) - { - /* In some OS OUT packet could be appended by nulls which could be skipped */ - if (USBFS_1_midiOutBuffer[outPointer] == 0u) - { - break; - } - /* Route USB MIDI to the External connection */ - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - if ((USBFS_1_midiOutBuffer[outPointer] & USBFS_1_CABLE_MASK) == - USBFS_1_MIDI_CABLE_00) - { - USBFS_1_MIDI1_ProcessUsbOut(&USBFS_1_midiOutBuffer[outPointer]); - } - else if ((USBFS_1_midiOutBuffer[outPointer] & USBFS_1_CABLE_MASK) == - USBFS_1_MIDI_CABLE_01) - { - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - USBFS_1_MIDI2_ProcessUsbOut(&USBFS_1_midiOutBuffer[outPointer]); - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ - } - else - { - /* `#START CUSTOM_MIDI_OUT_EP_SERV` Place your code here */ - - /* `#END` */ - } - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - /* Process any local MIDI output functions */ - USBFS_1_callbackLocalMidiEvent( - USBFS_1_midiOutBuffer[outPointer] & USBFS_1_CABLE_MASK, - &USBFS_1_midiOutBuffer[outPointer + USBFS_1_EVENT_BYTE1]); - outPointer += USBFS_1_EVENT_LENGTH; - } - } - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /* Enable Out EP*/ - USBFS_1_EnableOutEP(USBFS_1_midi_out_ep); - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - } - } - -#endif /* #if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) */ - -#if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI_IN_EP_Service - ******************************************************************************** - * - * Summary: - * Services the USB MIDI IN endpoint. Non-blocking. - * Checks that previous packet was processed by HOST, otherwise service the - * input endpoint on the subsequent call. It is called from the - * USBFS_1_MIDI_IN_Service() and from the - * USBFS_1_PutUsbMidiIn() function. - * - * Parameters: - * None - * - * Return: - * None - * - * Global variables: - * USBFS_1_midi_in_ep: Used as an IN endpoint number. - * USBFS_1_midiInBuffer: Function loads the data from this buffer to - * the USB IN endpoint. - * USBFS_1_midiInPointer: Cleared to zero when data are sent. - * - * Reentrant: - * No - * - *******************************************************************************/ - void USBFS_1_MIDI_IN_EP_Service(void) - { - /* Service the USB MIDI input endpoint */ - /* Check that previous packet was processed by HOST, otherwise service the USB later */ - if (USBFS_1_midiInPointer != 0u) - { - if(USBFS_1_GetEPState(USBFS_1_midi_in_ep) == USBFS_1_EVENT_PENDING) - { - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - USBFS_1_LoadInEP(USBFS_1_midi_in_ep, USBFS_1_midiInBuffer, - (uint16)USBFS_1_midiInPointer); - #else /* USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - /* rearm IN EP */ - USBFS_1_LoadInEP(USBFS_1_midi_in_ep, NULL, (uint16)USBFS_1_midiInPointer); - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO*/ - - /* Clear the midiInPointer. For DMA mode, clear this pointer in the ARB ISR when data are moved by DMA */ - #if(USBFS_1_EP_MM == USBFS_1__EP_MANUAL) - USBFS_1_midiInPointer = 0u; - #endif /* USBFS_1_EP_MM == USBFS_1__EP_MANUAL */ - } - } - } - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI_IN_Service - ******************************************************************************** - * - * Summary: - * Services the traffic from the MIDI input ports (RX UART) and prepare data - * in USB MIDI IN endpoint buffer. - * Calls the USBFS_1_MIDI_IN_EP_Service() function to sent the - * data from buffer to PC. Non-blocking. Should be called from main foreground - * task. - * This function is not protected from the reentrant calls. When it is required - * to use this function in UART RX ISR to guaranty low latency, care should be - * taken to protect from reentrant calls. - * - * Parameters: - * None - * - * Return: - * None - * - * Global variables: - * USBFS_1_midiInPointer: Cleared to zero when data are sent. - * - * Reentrant: - * No - * - *******************************************************************************/ - void USBFS_1_MIDI_IN_Service(void) - { - /* Service the MIDI UART inputs until either both receivers have no more - * events or until the input endpoint buffer fills up. - */ - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - uint8 m1 = 0u; - uint8 m2 = 0u; - do - { - if (USBFS_1_midiInPointer <= (USBFS_1_MIDI_IN_BUFF_SIZE - USBFS_1_EVENT_LENGTH)) - { - /* Check MIDI1 input port for a complete event */ - m1 = USBFS_1_MIDI1_GetEvent(); - if (m1 != 0u) - { - USBFS_1_PrepareInBuffer(m1, (uint8 *)&USBFS_1_MIDI1_Event.msgBuff[0], - USBFS_1_MIDI1_Event.size, USBFS_1_MIDI_CABLE_00); - } - } - - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - if (USBFS_1_midiInPointer <= (USBFS_1_MIDI_IN_BUFF_SIZE - USBFS_1_EVENT_LENGTH)) - { - /* Check MIDI2 input port for a complete event */ - m2 = USBFS_1_MIDI2_GetEvent(); - if (m2 != 0u) - { - USBFS_1_PrepareInBuffer(m2, (uint8 *)&USBFS_1_MIDI2_Event.msgBuff[0], - USBFS_1_MIDI2_Event.size, USBFS_1_MIDI_CABLE_01); - } - } - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ - - }while( (USBFS_1_midiInPointer <= (USBFS_1_MIDI_IN_BUFF_SIZE - USBFS_1_EVENT_LENGTH)) - && ((m1 != 0u) || (m2 != 0u)) ); - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - /* Service the USB MIDI input endpoint */ - USBFS_1_MIDI_IN_EP_Service(); - } - - - /******************************************************************************* - * Function Name: USBFS_1_PutUsbMidiIn - ******************************************************************************** - * - * Summary: - * Puts one MIDI messages into the USB MIDI In endpoint buffer. These are - * MIDI input messages to the host. This function is only used if the device - * has internal MIDI input functionality. USBMIDI_MIDI_IN_Service() function - * should additionally be called to send the message from local buffer to - * IN endpoint. - * - * Parameters: - * ic: 0 = No message (should never happen) - * 1 - 3 = Complete MIDI message in midiMsg - * 3 - IN EP LENGTH = Complete SySEx message(without EOSEX byte) in - * midiMsg. The length is limited by the max BULK EP size(64) - * MIDI_SYSEX = Start or continuation of SysEx message - * (put event bytes in midiMsg buffer) - * MIDI_EOSEX = End of SysEx message - * (put event bytes in midiMsg buffer) - * MIDI_TUNEREQ = Tune Request message (single byte system common msg) - * 0xf8 - 0xff = Single byte real-time message - * midiMsg: pointer to MIDI message. - * cable: cable number. - * - * Return: - * USBFS_1_TRUE if error. - * USBFS_1_FALSE if success. - * - * Global variables: - * USBFS_1_midi_in_ep: MIDI IN endpoint number used for sending data. - * USBFS_1_midiInPointer: Checked this variable to see if there is - * enough free space in the IN endpoint buffer. If buffer is full, initiate - * sending to PC. - * - * Reentrant: - * No - * - *******************************************************************************/ - uint8 USBFS_1_PutUsbMidiIn(uint8 ic, const uint8 midiMsg[], uint8 cable) - - { - uint8 retError = USBFS_1_FALSE; - uint8 msgIndex; - - /* Protect PrepareInBuffer() function from concurrent calls */ - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - MIDI1_UART_DisableRxInt(); - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - MIDI2_UART_DisableRxInt(); - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - if (USBFS_1_midiInPointer > - (USBFS_1_EP[USBFS_1_midi_in_ep].bufferSize - USBFS_1_EVENT_LENGTH)) - { - USBFS_1_MIDI_IN_EP_Service(); - } - if (USBFS_1_midiInPointer <= - (USBFS_1_EP[USBFS_1_midi_in_ep].bufferSize - USBFS_1_EVENT_LENGTH)) - { - if((ic < USBFS_1_EVENT_LENGTH) || (ic >= USBFS_1_MIDI_STATUS_MASK)) - { - USBFS_1_PrepareInBuffer(ic, midiMsg, ic, cable); - } - else - { /* Only SysEx message is greater than 4 bytes */ - msgIndex = 0u; - do - { - USBFS_1_PrepareInBuffer(USBFS_1_MIDI_SYSEX, &midiMsg[msgIndex], - USBFS_1_EVENT_BYTE3, cable); - ic -= USBFS_1_EVENT_BYTE3; - msgIndex += USBFS_1_EVENT_BYTE3; - if (USBFS_1_midiInPointer > - (USBFS_1_EP[USBFS_1_midi_in_ep].bufferSize - USBFS_1_EVENT_LENGTH)) - { - USBFS_1_MIDI_IN_EP_Service(); - if (USBFS_1_midiInPointer > - (USBFS_1_EP[USBFS_1_midi_in_ep].bufferSize - USBFS_1_EVENT_LENGTH)) - { - /* Error condition. HOST is not ready to receive this packet. */ - retError = USBFS_1_TRUE; - break; - } - } - }while(ic > USBFS_1_EVENT_BYTE3); - - if(retError == USBFS_1_FALSE) - { - USBFS_1_PrepareInBuffer(USBFS_1_MIDI_EOSEX, midiMsg, ic, cable); - } - } - } - else - { - /* Error condition. HOST is not ready to receive this packet. */ - retError = USBFS_1_TRUE; - } - - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - MIDI1_UART_EnableRxInt(); - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - MIDI2_UART_EnableRxInt(); - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - return (retError); - } - - - /******************************************************************************* - * Function Name: USBFS_1_PrepareInBuffer - ******************************************************************************** - * - * Summary: - * Builds a USB MIDI event in the input endpoint buffer at the current pointer. - * Puts one MIDI message into the USB MIDI In endpoint buffer. - * - * Parameters: - * ic: 0 = No message (should never happen) - * 1 - 3 = Complete MIDI message at pMdat[0] - * MIDI_SYSEX = Start or continuation of SysEx message - * (put eventLen bytes in buffer) - * MIDI_EOSEX = End of SysEx message - * (put eventLen bytes in buffer, - * and append MIDI_EOSEX) - * MIDI_TUNEREQ = Tune Request message (single byte system common msg) - * 0xf8 - 0xff = Single byte real-time message - * - * srcBuff: pointer to MIDI data - * eventLen: number of bytes in MIDI event - * cable: MIDI source port number - * - * Return: - * None - * - * Global variables: - * USBFS_1_midiInBuffer: This buffer is used for saving and combine the - * received from UART(s) and(or) generated internally by - * USBFS_1_PutUsbMidiIn() function messages. - * USBFS_1_midiInPointer: Used as an index for midiInBuffer to - * write data. - * - * Reentrant: - * No - * - *******************************************************************************/ - void USBFS_1_PrepareInBuffer(uint8 ic, const uint8 srcBuff[], uint8 eventLen, uint8 cable) - - { - uint8 srcBuffZero; - uint8 srcBuffOne; - - srcBuffZero = srcBuff[0u]; - srcBuffOne = srcBuff[1u]; - - if (ic >= (USBFS_1_MIDI_STATUS_MASK | USBFS_1_MIDI_SINGLE_BYTE_MASK)) - { - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_SINGLE_BYTE | cable; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = ic; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = 0u; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = 0u; - USBFS_1_midiInPointer++; - } - else if((ic < USBFS_1_EVENT_LENGTH) || (ic == USBFS_1_MIDI_SYSEX)) - { - if(ic == USBFS_1_MIDI_SYSEX) - { - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_SYSEX | cable; - USBFS_1_midiInPointer++; - } - else if (srcBuffZero < USBFS_1_MIDI_SYSEX) - { - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = (srcBuffZero >> 4u) | cable; - USBFS_1_midiInPointer++; - } - else if (srcBuffZero == USBFS_1_MIDI_TUNEREQ) - { - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_1BYTE_COMMON | cable; - USBFS_1_midiInPointer++; - } - else if ((srcBuffZero == USBFS_1_MIDI_QFM) || (srcBuffZero == USBFS_1_MIDI_SONGSEL)) - { - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_2BYTE_COMMON | cable; - USBFS_1_midiInPointer++; - } - else if (srcBuffZero == USBFS_1_MIDI_SPP) - { - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_3BYTE_COMMON | cable; - USBFS_1_midiInPointer++; - } - else - { - } - - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = srcBuffZero; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = srcBuffOne; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = srcBuff[2u]; - USBFS_1_midiInPointer++; - } - else if (ic == USBFS_1_MIDI_EOSEX) - { - switch (eventLen) - { - case 0u: - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = - USBFS_1_SYSEX_ENDS_WITH1 | cable; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_MIDI_EOSEX; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = 0u; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = 0u; - USBFS_1_midiInPointer++; - break; - case 1u: - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = - USBFS_1_SYSEX_ENDS_WITH2 | cable; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = srcBuffZero; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_MIDI_EOSEX; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = 0u; - USBFS_1_midiInPointer++; - break; - case 2u: - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = - USBFS_1_SYSEX_ENDS_WITH3 | cable; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = srcBuffZero; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = srcBuffOne; - USBFS_1_midiInPointer++; - USBFS_1_midiInBuffer[USBFS_1_midiInPointer] = USBFS_1_MIDI_EOSEX; - USBFS_1_midiInPointer++; - break; - default: - break; - } - } - else - { - } - } - -#endif /* #if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) */ - - -/* The implementation for external serial input and output connections -* to route USB MIDI data to and from those connections. -*/ -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI_Init - ******************************************************************************** - * - * Summary: - * Initializes MIDI variables and starts the UART(s) hardware block(s). - * - * Parameters: - * None - * - * Return: - * None - * - * Side Effects: - * Change the priority of the UART(s) TX interrupts to be higher than the - * default EP ISR priority. - * - * Global variables: - * USBFS_1_MIDI_Event: initialized to zero. - * USBFS_1_MIDI_TxRunStat: initialized to zero. - * - *******************************************************************************/ - void USBFS_1_MIDI_Init(void) - { - USBFS_1_MIDI1_Event.length = 0u; - USBFS_1_MIDI1_Event.count = 0u; - USBFS_1_MIDI1_Event.size = 0u; - USBFS_1_MIDI1_Event.runstat = 0u; - USBFS_1_MIDI1_TxRunStat = 0u; - USBFS_1_MIDI1_InqFlags = 0u; - /* Start UART block */ - MIDI1_UART_Start(); - /* Change the priority of the UART TX and RX interrupt */ - CyIntSetPriority(MIDI1_UART_TX_VECT_NUM, USBFS_1_CUSTOM_UART_TX_PRIOR_NUM); - CyIntSetPriority(MIDI1_UART_RX_VECT_NUM, USBFS_1_CUSTOM_UART_RX_PRIOR_NUM); - - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - USBFS_1_MIDI2_Event.length = 0u; - USBFS_1_MIDI2_Event.count = 0u; - USBFS_1_MIDI2_Event.size = 0u; - USBFS_1_MIDI2_Event.runstat = 0u; - USBFS_1_MIDI2_TxRunStat = 0u; - USBFS_1_MIDI2_InqFlags = 0u; - /* Start second UART block */ - MIDI2_UART_Start(); - /* Change the priority of the UART TX interrupt */ - CyIntSetPriority(MIDI2_UART_TX_VECT_NUM, USBFS_1_CUSTOM_UART_TX_PRIOR_NUM); - CyIntSetPriority(MIDI2_UART_RX_VECT_NUM, USBFS_1_CUSTOM_UART_RX_PRIOR_NUM); - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF*/ - - /* `#START MIDI_INIT_CUSTOM` Init other extended UARTs here */ - - /* `#END` */ - - } - - - /******************************************************************************* - * Function Name: USBFS_1_ProcessMidiIn - ******************************************************************************** - * - * Summary: - * Processes one byte of incoming MIDI data. - * - * Parameters: - * mData = current MIDI input data byte - * *rxStat = pointer to a MIDI_RX_STATUS structure - * - * Return: - * 0, if no complete message - * 1 - 4, if message complete - * MIDI_SYSEX, if start or continuation of system exclusive - * MIDI_EOSEX, if end of system exclusive - * 0xf8 - 0xff, if single byte real time message - * - *******************************************************************************/ - uint8 USBFS_1_ProcessMidiIn(uint8 mData, USBFS_1_MIDI_RX_STATUS *rxStat) - - { - uint8 midiReturn = 0u; - - /* Check for a MIDI status byte. All status bytes, except real time messages, - * which are a single byte, force the start of a new buffer cycle. - */ - if ((mData & USBFS_1_MIDI_STATUS_BYTE_MASK) != 0u) - { - if ((mData & USBFS_1_MIDI_STATUS_MASK) == USBFS_1_MIDI_STATUS_MASK) - { - if ((mData & USBFS_1_MIDI_SINGLE_BYTE_MASK) != 0u) /* System Real-Time Messages(single byte) */ - { - midiReturn = mData; - } - else /* System Common Messages */ - { - switch (mData) - { - case USBFS_1_MIDI_SYSEX: - rxStat->msgBuff[0u] = USBFS_1_MIDI_SYSEX; - rxStat->runstat = USBFS_1_MIDI_SYSEX; - rxStat->count = 1u; - rxStat->length = 3u; - break; - case USBFS_1_MIDI_EOSEX: - rxStat->runstat = 0u; - rxStat->size = rxStat->count; - rxStat->count = 0u; - midiReturn = USBFS_1_MIDI_EOSEX; - break; - case USBFS_1_MIDI_SPP: - rxStat->msgBuff[0u] = USBFS_1_MIDI_SPP; - rxStat->runstat = 0u; - rxStat->count = 1u; - rxStat->length = 3u; - break; - case USBFS_1_MIDI_SONGSEL: - rxStat->msgBuff[0u] = USBFS_1_MIDI_SONGSEL; - rxStat->runstat = 0u; - rxStat->count = 1u; - rxStat->length = 2u; - break; - case USBFS_1_MIDI_QFM: - rxStat->msgBuff[0u] = USBFS_1_MIDI_QFM; - rxStat->runstat = 0u; - rxStat->count = 1u; - rxStat->length = 2u; - break; - case USBFS_1_MIDI_TUNEREQ: - rxStat->msgBuff[0u] = USBFS_1_MIDI_TUNEREQ; - rxStat->runstat = 0u; - rxStat->size = 1u; - rxStat->count = 0u; - midiReturn = rxStat->size; - break; - default: - break; - } - } - } - else /* Channel Messages */ - { - rxStat->msgBuff[0u] = mData; - rxStat->runstat = mData; - rxStat->count = 1u; - switch (mData & USBFS_1_MIDI_STATUS_MASK) - { - case USBFS_1_MIDI_NOTE_OFF: - case USBFS_1_MIDI_NOTE_ON: - case USBFS_1_MIDI_POLY_KEY_PRESSURE: - case USBFS_1_MIDI_CONTROL_CHANGE: - case USBFS_1_MIDI_PITCH_BEND_CHANGE: - rxStat->length = 3u; - break; - case USBFS_1_MIDI_PROGRAM_CHANGE: - case USBFS_1_MIDI_CHANNEL_PRESSURE: - rxStat->length = 2u; - break; - default: - rxStat->runstat = 0u; - rxStat->count = 0u; - break; - } - } - } - - /* Otherwise, it's a data byte */ - else - { - if (rxStat->runstat == USBFS_1_MIDI_SYSEX) - { - rxStat->msgBuff[rxStat->count] = mData; - rxStat->count++; - if (rxStat->count >= rxStat->length) - { - rxStat->size = rxStat->count; - rxStat->count = 0u; - midiReturn = USBFS_1_MIDI_SYSEX; - } - } - else if (rxStat->count > 0u) - { - rxStat->msgBuff[rxStat->count] = mData; - rxStat->count++; - if (rxStat->count >= rxStat->length) - { - rxStat->size = rxStat->count; - rxStat->count = 0u; - midiReturn = rxStat->size; - } - } - else if (rxStat->runstat != 0u) - { - rxStat->msgBuff[0u] = rxStat->runstat; - rxStat->msgBuff[1u] = mData; - rxStat->count = 2u; - switch (rxStat->runstat & USBFS_1_MIDI_STATUS_MASK) - { - case USBFS_1_MIDI_NOTE_OFF: - case USBFS_1_MIDI_NOTE_ON: - case USBFS_1_MIDI_POLY_KEY_PRESSURE: - case USBFS_1_MIDI_CONTROL_CHANGE: - case USBFS_1_MIDI_PITCH_BEND_CHANGE: - rxStat->length = 3u; - break; - case USBFS_1_MIDI_PROGRAM_CHANGE: - case USBFS_1_MIDI_CHANNEL_PRESSURE: - rxStat->size =rxStat->count; - rxStat->count = 0u; - midiReturn = rxStat->size; - break; - default: - rxStat->count = 0u; - break; - } - } - else - { - } - } - return (midiReturn); - } - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI1_GetEvent - ******************************************************************************** - * - * Summary: - * Checks for incoming MIDI data, calls the MIDI event builder if so. - * Returns either empty or with a complete event. - * - * Parameters: - * None - * - * Return: - * 0, if no complete message - * 1 - 4, if message complete - * MIDI_SYSEX, if start or continuation of system exclusive - * MIDI_EOSEX, if end of system exclusive - * 0xf8 - 0xff, if single byte real time message - * - * Global variables: - * USBFS_1_MIDI1_Event: RX status structure used to parse received - * data. - * - *******************************************************************************/ - uint8 USBFS_1_MIDI1_GetEvent(void) - { - uint8 msgRtn = 0u; - uint8 rxData; - #if (MIDI1_UART_RXBUFFERSIZE >= 256u) - uint16 rxBufferRead; - #if CY_PSOC3 /* This local variable is required only for PSOC3 and large buffer */ - uint16 rxBufferWrite; - #endif /* end CY_PSOC3 */ - #else - uint8 rxBufferRead; - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - uint8 rxBufferLoopDetect; - /* Read buffer loop condition to the local variable */ - rxBufferLoopDetect = MIDI1_UART_rxBufferLoopDetect; - - if ( (MIDI1_UART_rxBufferRead != MIDI1_UART_rxBufferWrite) || (rxBufferLoopDetect != 0u) ) - { - /* Protect variables that could change on interrupt by disabling Rx interrupt.*/ - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntDisable(MIDI1_UART_RX_VECT_NUM); - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - rxBufferRead = MIDI1_UART_rxBufferRead; - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - rxBufferWrite = MIDI1_UART_rxBufferWrite; - CyIntEnable(MIDI1_UART_RX_VECT_NUM); - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - - /* Stay here until either the buffer is empty or we have a complete message - * in the message buffer. Note that we must use a temporary buffer pointer - * since it takes two instructions to increment with a wrap, and we can't - * risk doing that with the real pointer and getting an interrupt in between - * instructions. - */ - - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - while ( ((rxBufferRead != rxBufferWrite) || (rxBufferLoopDetect != 0u)) && (msgRtn == 0u) ) - #else - while ( ((rxBufferRead != MIDI1_UART_rxBufferWrite) || (rxBufferLoopDetect != 0u)) && (msgRtn == 0u) ) - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 && CY_PSOC3 */ - { - rxData = MIDI1_UART_rxBuffer[rxBufferRead]; - /* Increment pointer with a wrap */ - rxBufferRead++; - if(rxBufferRead >= MIDI1_UART_RXBUFFERSIZE) - { - rxBufferRead = 0u; - } - /* If loop condition was set - update real read buffer pointer - * to avoid overflow status - */ - if(rxBufferLoopDetect != 0u ) - { - MIDI1_UART_rxBufferLoopDetect = 0u; - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntDisable(MIDI1_UART_RX_VECT_NUM); - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - MIDI1_UART_rxBufferRead = rxBufferRead; - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntEnable(MIDI1_UART_RX_VECT_NUM); - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - } - - msgRtn = USBFS_1_ProcessMidiIn(rxData, - (USBFS_1_MIDI_RX_STATUS *)&USBFS_1_MIDI1_Event); - - /* Read buffer loop condition to the local variable */ - rxBufferLoopDetect = MIDI1_UART_rxBufferLoopDetect; - } - - /* Finally, update the real output pointer, then return with - * an indication as to whether there's a complete message in the buffer. - */ - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntDisable(MIDI1_UART_RX_VECT_NUM); - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - MIDI1_UART_rxBufferRead = rxBufferRead; - #if ((MIDI1_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntEnable(MIDI1_UART_RX_VECT_NUM); - #endif /* End MIDI1_UART_RXBUFFERSIZE >= 256 */ - } - - return (msgRtn); - } - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI1_ProcessUsbOut - ******************************************************************************** - * - * Summary: - * Process a USB MIDI output event. - * Puts data into the MIDI TX output buffer. - * - * Parameters: - * *epBuf: pointer on MIDI event. - * - * Return: - * None - * - * Global variables: - * USBFS_1_MIDI1_TxRunStat: This variable used to save the MIDI - * status byte and skip to send the repeated status byte in subsequent event. - * USBFS_1_MIDI1_InqFlags: The following flags are set when SysEx - * message comes. - * USBFS_1_INQ_SYSEX_FLAG: Non-Real Time SySEx message received. - * USBFS_1_INQ_IDENTITY_REQ_FLAG: Identity Request received. - * This bit should be cleared by user when Identity Reply message generated. - * - *******************************************************************************/ - void USBFS_1_MIDI1_ProcessUsbOut(const uint8 epBuf[]) - - { - uint8 cmd; - uint8 len; - uint8 i; - - /* User code is required at the beginning of the procedure */ - /* `#START MIDI1_PROCESS_OUT_BEGIN` */ - - /* `#END` */ - - cmd = epBuf[USBFS_1_EVENT_BYTE0] & USBFS_1_CIN_MASK; - if((cmd != USBFS_1_RESERVED0) && (cmd != USBFS_1_RESERVED1)) - { - len = USBFS_1_MIDI_SIZE[cmd]; - i = USBFS_1_EVENT_BYTE1; - /* Universal System Exclusive message parsing */ - if(cmd == USBFS_1_SYSEX) - { - if((epBuf[USBFS_1_EVENT_BYTE1] == USBFS_1_MIDI_SYSEX) && - (epBuf[USBFS_1_EVENT_BYTE2] == USBFS_1_MIDI_SYSEX_NON_REAL_TIME)) - { /* Non-Real Time SySEx starts */ - USBFS_1_MIDI1_InqFlags |= USBFS_1_INQ_SYSEX_FLAG; - } - else - { - USBFS_1_MIDI1_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - } - } - else if(cmd == USBFS_1_SYSEX_ENDS_WITH1) - { - USBFS_1_MIDI1_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - } - else if(cmd == USBFS_1_SYSEX_ENDS_WITH2) - { - USBFS_1_MIDI1_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - } - else if(cmd == USBFS_1_SYSEX_ENDS_WITH3) - { - /* Identify Request support */ - if((USBFS_1_MIDI1_InqFlags & USBFS_1_INQ_SYSEX_FLAG) != 0u) - { - USBFS_1_MIDI1_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - if((epBuf[USBFS_1_EVENT_BYTE1] == USBFS_1_MIDI_SYSEX_GEN_INFORMATION) && - (epBuf[USBFS_1_EVENT_BYTE2] == USBFS_1_MIDI_SYSEX_IDENTITY_REQ)) - { /* Set the flag about received the Identity Request. - * The Identity Reply message may be send by user code. - */ - USBFS_1_MIDI1_InqFlags |= USBFS_1_INQ_IDENTITY_REQ_FLAG; - } - } - } - else /* Do nothing for other command */ - { - } - /* Running Status for Voice and Mode messages only. */ - if((cmd >= USBFS_1_NOTE_OFF) && ( cmd <= USBFS_1_PITCH_BEND_CHANGE)) - { - if(USBFS_1_MIDI1_TxRunStat == epBuf[USBFS_1_EVENT_BYTE1]) - { /* Skip the repeated Status byte */ - i++; - } - else - { /* Save Status byte for next event */ - USBFS_1_MIDI1_TxRunStat = epBuf[USBFS_1_EVENT_BYTE1]; - } - } - else - { /* Clear Running Status */ - USBFS_1_MIDI1_TxRunStat = 0u; - } - /* Puts data into the MIDI TX output buffer.*/ - do - { - MIDI1_UART_PutChar(epBuf[i]); - i++; - } while (i <= len); - } - - /* User code is required at the end of the procedure */ - /* `#START MIDI1_PROCESS_OUT_END` */ - - /* `#END` */ - } - -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI2_GetEvent - ******************************************************************************** - * - * Summary: - * Checks for incoming MIDI data, calls the MIDI event builder if so. - * Returns either empty or with a complete event. - * - * Parameters: - * None - * - * Return: - * 0, if no complete message - * 1 - 4, if message complete - * MIDI_SYSEX, if start or continuation of system exclusive - * MIDI_EOSEX, if end of system exclusive - * 0xf8 - 0xff, if single byte real time message - * - * Global variables: - * USBFS_1_MIDI2_Event: RX status structure used to parse received - * data. - * - *******************************************************************************/ - uint8 USBFS_1_MIDI2_GetEvent(void) - { - uint8 msgRtn = 0u; - uint8 rxData; - #if (MIDI2_UART_RXBUFFERSIZE >= 256u) - uint16 rxBufferRead; - #if CY_PSOC3 /* This local variable required only for PSOC3 and large buffer */ - uint16 rxBufferWrite; - #endif /* end CY_PSOC3 */ - #else - uint8 rxBufferRead; - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - uint8 rxBufferLoopDetect; - /* Read buffer loop condition to the local variable */ - rxBufferLoopDetect = MIDI2_UART_rxBufferLoopDetect; - - if ( (MIDI2_UART_rxBufferRead != MIDI2_UART_rxBufferWrite) || (rxBufferLoopDetect != 0u) ) - { - /* Protect variables that could change on interrupt by disabling Rx interrupt.*/ - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntDisable(MIDI2_UART_RX_VECT_NUM); - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - rxBufferRead = MIDI2_UART_rxBufferRead; - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - rxBufferWrite = MIDI2_UART_rxBufferWrite; - CyIntEnable(MIDI2_UART_RX_VECT_NUM); - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - - /* Stay here until either the buffer is empty or we have a complete message - * in the message buffer. Note that we must use a temporary output pointer to - * since it takes two instructions to increment with a wrap, and we can't - * risk doing that with the real pointer and getting an interrupt in between - * instructions. - */ - - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - while ( ((rxBufferRead != rxBufferWrite) || (rxBufferLoopDetect != 0u)) && (msgRtn == 0u) ) - #else - while ( ((rxBufferRead != MIDI2_UART_rxBufferWrite) || (rxBufferLoopDetect != 0u)) && (msgRtn == 0u) ) - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 && CY_PSOC3 */ - { - rxData = MIDI2_UART_rxBuffer[rxBufferRead]; - rxBufferRead++; - if(rxBufferRead >= MIDI2_UART_RXBUFFERSIZE) - { - rxBufferRead = 0u; - } - /* If loop condition was set - update real read buffer pointer - * to avoid overflow status - */ - if(rxBufferLoopDetect != 0u ) - { - MIDI2_UART_rxBufferLoopDetect = 0u; - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntDisable(MIDI2_UART_RX_VECT_NUM); - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - MIDI2_UART_rxBufferRead = rxBufferRead; - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntEnable(MIDI2_UART_RX_VECT_NUM); - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - } - - msgRtn = USBFS_1_ProcessMidiIn(rxData, - (USBFS_1_MIDI_RX_STATUS *)&USBFS_1_MIDI2_Event); - - /* Read buffer loop condition to the local variable */ - rxBufferLoopDetect = MIDI2_UART_rxBufferLoopDetect; - } - - /* Finally, update the real output pointer, then return with - * an indication as to whether there's a complete message in the buffer. - */ - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntDisable(MIDI2_UART_RX_VECT_NUM); - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - MIDI2_UART_rxBufferRead = rxBufferRead; - #if ((MIDI2_UART_RXBUFFERSIZE >= 256u) && (CY_PSOC3)) - CyIntEnable(MIDI2_UART_RX_VECT_NUM); - #endif /* End MIDI2_UART_RXBUFFERSIZE >= 256 */ - } - - return (msgRtn); - } - - - /******************************************************************************* - * Function Name: USBFS_1_MIDI2_ProcessUsbOut - ******************************************************************************** - * - * Summary: - * Process a USB MIDI output event. - * Puts data into the MIDI TX output buffer. - * - * Parameters: - * *epBuf: pointer on MIDI event. - * - * Return: - * None - * - * Global variables: - * USBFS_1_MIDI2_TxRunStat: This variable used to save the MIDI - * status byte and skip to send the repeated status byte in subsequent event. - * USBFS_1_MIDI2_InqFlags: The following flags are set when SysEx - * message comes. - * USBFS_1_INQ_SYSEX_FLAG: Non-Real Time SySEx message received. - * USBFS_1_INQ_IDENTITY_REQ_FLAG: Identity Request received. - * This bit should be cleared by user when Identity Reply message generated. - * - *******************************************************************************/ - void USBFS_1_MIDI2_ProcessUsbOut(const uint8 epBuf[]) - - { - uint8 cmd; - uint8 len; - uint8 i; - - /* User code is required at the beginning of the procedure */ - /* `#START MIDI2_PROCESS_OUT_START` */ - - /* `#END` */ - - cmd = epBuf[USBFS_1_EVENT_BYTE0] & USBFS_1_CIN_MASK; - if((cmd != USBFS_1_RESERVED0) && (cmd != USBFS_1_RESERVED1)) - { - len = USBFS_1_MIDI_SIZE[cmd]; - i = USBFS_1_EVENT_BYTE1; - /* Universal System Exclusive message parsing */ - if(cmd == USBFS_1_SYSEX) - { - if((epBuf[USBFS_1_EVENT_BYTE1] == USBFS_1_MIDI_SYSEX) && - (epBuf[USBFS_1_EVENT_BYTE2] == USBFS_1_MIDI_SYSEX_NON_REAL_TIME)) - { /* SySEx starts */ - USBFS_1_MIDI2_InqFlags |= USBFS_1_INQ_SYSEX_FLAG; - } - else - { - USBFS_1_MIDI2_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - } - } - else if(cmd == USBFS_1_SYSEX_ENDS_WITH1) - { - USBFS_1_MIDI2_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - } - else if(cmd == USBFS_1_SYSEX_ENDS_WITH2) - { - USBFS_1_MIDI2_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - } - else if(cmd == USBFS_1_SYSEX_ENDS_WITH3) - { - /* Identify Request support */ - if((USBFS_1_MIDI2_InqFlags & USBFS_1_INQ_SYSEX_FLAG) != 0u) - { - USBFS_1_MIDI2_InqFlags &= (uint8)~USBFS_1_INQ_SYSEX_FLAG; - if((epBuf[USBFS_1_EVENT_BYTE1] == USBFS_1_MIDI_SYSEX_GEN_INFORMATION) && - (epBuf[USBFS_1_EVENT_BYTE2] == USBFS_1_MIDI_SYSEX_IDENTITY_REQ)) - { /* Set the flag about received the Identity Request. - * The Identity Reply message may be send by user code. - */ - USBFS_1_MIDI2_InqFlags |= USBFS_1_INQ_IDENTITY_REQ_FLAG; - } - } - } - else /* Do nothing for other command */ - { - } - /* Running Status for Voice and Mode messages only. */ - if((cmd >= USBFS_1_NOTE_OFF) && ( cmd <= USBFS_1_PITCH_BEND_CHANGE)) - { - if(USBFS_1_MIDI2_TxRunStat == epBuf[USBFS_1_EVENT_BYTE1]) - { /* Skip the repeated Status byte */ - i++; - } - else - { /* Save Status byte for next event */ - USBFS_1_MIDI2_TxRunStat = epBuf[USBFS_1_EVENT_BYTE1]; - } - } - else - { /* Clear Running Status */ - USBFS_1_MIDI2_TxRunStat = 0u; - } - /* Puts data into the MIDI TX output buffer.*/ - do - { - MIDI2_UART_PutChar(epBuf[i]); - i++; - } while (i <= len); - } - - /* User code is required at the end of the procedure */ - /* `#START MIDI2_PROCESS_OUT_END` */ - - /* `#END` */ - } -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - -#endif /* End (USBFS_1_ENABLE_MIDI_API != 0u) */ - - -/* `#START MIDI_FUNCTIONS` Place any additional functions here */ - -/* `#END` */ - -#endif /* End defined(USBFS_1_ENABLE_MIDI_STREAMING) */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.h deleted file mode 100644 index 63116507..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_midi.h +++ /dev/null @@ -1,200 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_midi.h -* Version 2.60 -* -* Description: -* Header File for the USBFS MIDI module. -* Contains prototypes and constant values. -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_USBFS_USBFS_1_midi_H) -#define CY_USBFS_USBFS_1_midi_H - -#include "cytypes.h" -#include "USBFS_1.h" - - -/*************************************** -* Data Struct Definition -***************************************/ - -/* The following structure is used to hold status information for - building and parsing incoming MIDI messages. */ -typedef struct -{ - uint8 length; /* expected length */ - uint8 count; /* current byte count */ - uint8 size; /* complete size */ - uint8 runstat; /* running status */ - uint8 msgBuff[4]; /* message buffer */ -} USBFS_1_MIDI_RX_STATUS; - - -/*************************************** -* MIDI Constants. -***************************************/ - -#define USBFS_1_ONE_EXT_INTRF (0x01u) -#define USBFS_1_TWO_EXT_INTRF (0x02u) - -/* Flag definitions for use with MIDI device inquiry */ -#define USBFS_1_INQ_SYSEX_FLAG (0x01u) -#define USBFS_1_INQ_IDENTITY_REQ_FLAG (0x02u) - -/* USB-MIDI Code Index Number Classifications (MIDI Table 4-1) */ -#define USBFS_1_CIN_MASK (0x0Fu) -#define USBFS_1_RESERVED0 (0x00u) -#define USBFS_1_RESERVED1 (0x01u) -#define USBFS_1_2BYTE_COMMON (0x02u) -#define USBFS_1_3BYTE_COMMON (0x03u) -#define USBFS_1_SYSEX (0x04u) -#define USBFS_1_1BYTE_COMMON (0x05u) -#define USBFS_1_SYSEX_ENDS_WITH1 (0x05u) -#define USBFS_1_SYSEX_ENDS_WITH2 (0x06u) -#define USBFS_1_SYSEX_ENDS_WITH3 (0x07u) -#define USBFS_1_NOTE_OFF (0x08u) -#define USBFS_1_NOTE_ON (0x09u) -#define USBFS_1_POLY_KEY_PRESSURE (0x0Au) -#define USBFS_1_CONTROL_CHANGE (0x0Bu) -#define USBFS_1_PROGRAM_CHANGE (0x0Cu) -#define USBFS_1_CHANNEL_PRESSURE (0x0Du) -#define USBFS_1_PITCH_BEND_CHANGE (0x0Eu) -#define USBFS_1_SINGLE_BYTE (0x0Fu) - -#define USBFS_1_CABLE_MASK (0xF0u) -#define USBFS_1_MIDI_CABLE_00 (0x00u) -#define USBFS_1_MIDI_CABLE_01 (0x10u) - -#define USBFS_1_EVENT_BYTE0 (0x00u) -#define USBFS_1_EVENT_BYTE1 (0x01u) -#define USBFS_1_EVENT_BYTE2 (0x02u) -#define USBFS_1_EVENT_BYTE3 (0x03u) -#define USBFS_1_EVENT_LENGTH (0x04u) - -#define USBFS_1_MIDI_STATUS_BYTE_MASK (0x80u) -#define USBFS_1_MIDI_STATUS_MASK (0xF0u) -#define USBFS_1_MIDI_SINGLE_BYTE_MASK (0x08u) -#define USBFS_1_MIDI_NOTE_OFF (0x80u) -#define USBFS_1_MIDI_NOTE_ON (0x90u) -#define USBFS_1_MIDI_POLY_KEY_PRESSURE (0xA0u) -#define USBFS_1_MIDI_CONTROL_CHANGE (0xB0u) -#define USBFS_1_MIDI_PROGRAM_CHANGE (0xC0u) -#define USBFS_1_MIDI_CHANNEL_PRESSURE (0xD0u) -#define USBFS_1_MIDI_PITCH_BEND_CHANGE (0xE0u) -#define USBFS_1_MIDI_SYSEX (0xF0u) -#define USBFS_1_MIDI_EOSEX (0xF7u) -#define USBFS_1_MIDI_QFM (0xF1u) -#define USBFS_1_MIDI_SPP (0xF2u) -#define USBFS_1_MIDI_SONGSEL (0xF3u) -#define USBFS_1_MIDI_TUNEREQ (0xF6u) -#define USBFS_1_MIDI_ACTIVESENSE (0xFEu) - -/* MIDI Universal System Exclusive defines */ -#define USBFS_1_MIDI_SYSEX_NON_REAL_TIME (0x7Eu) -#define USBFS_1_MIDI_SYSEX_REALTIME (0x7Fu) -/* ID of target device */ -#define USBFS_1_MIDI_SYSEX_ID_ALL (0x7Fu) -/* Sub-ID#1*/ -#define USBFS_1_MIDI_SYSEX_GEN_INFORMATION (0x06u) -#define USBFS_1_MIDI_SYSEX_GEN_MESSAGE (0x09u) -/* Sub-ID#2*/ -#define USBFS_1_MIDI_SYSEX_IDENTITY_REQ (0x01u) -#define USBFS_1_MIDI_SYSEX_IDENTITY_REPLY (0x02u) -#define USBFS_1_MIDI_SYSEX_SYSTEM_ON (0x01u) -#define USBFS_1_MIDI_SYSEX_SYSTEM_OFF (0x02u) - -#define USBFS_1_CUSTOM_UART_TX_PRIOR_NUM (0x04u) -#define USBFS_1_CUSTOM_UART_RX_PRIOR_NUM (0x02u) - -#define USBFS_1_ISR_SERVICE_MIDI_OUT \ - ( (USBFS_1_ENABLE_MIDI_API != 0u) && \ - (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) && (USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) ) -#define USBFS_1_ISR_SERVICE_MIDI_IN \ - ( (USBFS_1_ENABLE_MIDI_API != 0u) && (USBFS_1_MIDI_IN_BUFF_SIZE > 0) ) - -/*************************************** -* External function references -***************************************/ - -void USBFS_1_callbackLocalMidiEvent(uint8 cable, uint8 *midiMsg) - ; - - -/*************************************** -* External references -***************************************/ - -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - #include "MIDI1_UART.h" -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - #include "MIDI2_UART.h" -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ -#if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - #include -#endif /* End USBFS_1_EP_MM */ - - -/*************************************** -* Private function prototypes -***************************************/ - -void USBFS_1_PrepareInBuffer(uint8 ic, const uint8 srcBuff[], uint8 eventLen, uint8 cable) - ; -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - void USBFS_1_MIDI_Init(void) ; - uint8 USBFS_1_ProcessMidiIn(uint8 mData, USBFS_1_MIDI_RX_STATUS *rxStat) - ; - uint8 USBFS_1_MIDI1_GetEvent(void) ; - void USBFS_1_MIDI1_ProcessUsbOut(const uint8 epBuf[]) - ; - - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - uint8 USBFS_1_MIDI2_GetEvent(void) ; - void USBFS_1_MIDI2_ProcessUsbOut(const uint8 epBuf[]) - ; - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - - -/*************************************** -* External data references -***************************************/ - -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) - -#if (USBFS_1_MIDI_IN_BUFF_SIZE > 0) - #if (USBFS_1_MIDI_IN_BUFF_SIZE >= 256) - extern volatile uint16 USBFS_1_midiInPointer; /* Input endpoint buffer pointer */ - #else - extern volatile uint8 USBFS_1_midiInPointer; /* Input endpoint buffer pointer */ - #endif /* End USBFS_1_MIDI_IN_BUFF_SIZE >=256 */ - extern volatile uint8 USBFS_1_midi_in_ep; /* Input endpoint number */ - extern uint8 USBFS_1_midiInBuffer[USBFS_1_MIDI_IN_BUFF_SIZE]; /* Input endpoint buffer */ -#endif /* USBFS_1_MIDI_IN_BUFF_SIZE > 0 */ - -#if (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) - extern volatile uint8 USBFS_1_midi_out_ep; /* Output endpoint number */ - extern uint8 USBFS_1_midiOutBuffer[USBFS_1_MIDI_OUT_BUFF_SIZE]; /* Output endpoint buffer */ -#endif /* USBFS_1_MIDI_OUT_BUFF_SIZE > 0 */ - -#if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF) - extern volatile uint8 USBFS_1_MIDI1_InqFlags; /* Device inquiry flag */ - #if (USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF) - extern volatile uint8 USBFS_1_MIDI2_InqFlags; /* Device inquiry flag */ - #endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_TWO_EXT_INTRF */ -#endif /* End USBFS_1_MIDI_EXT_MODE >= USBFS_1_ONE_EXT_INTRF */ - -#endif /* USBFS_1_ENABLE_MIDI_STREAMING */ - - -#endif /* End CY_USBFS_USBFS_1_midi_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pm.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pm.c deleted file mode 100644 index d650542e..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pm.c +++ /dev/null @@ -1,277 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_pm.c -* Version 2.60 -* -* Description: -* This file provides Suspend/Resume APIs functionality. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "project.h" -#include "USBFS_1.h" -#include "USBFS_1_pvt.h" - - -/*************************************** -* Custom Declarations -***************************************/ -/* `#START PM_CUSTOM_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/*************************************** -* Local data allocation -***************************************/ - -static USBFS_1_BACKUP_STRUCT USBFS_1_backup; - - -#if(USBFS_1_DP_ISR_REMOVE == 0u) - - - /******************************************************************************* - * Function Name: USBFS_1_DP_Interrupt - ******************************************************************************** - * - * Summary: - * This Interrupt Service Routine handles DP pin changes for wake-up from - * the sleep mode. - * - * Parameters: - * None. - * - * Return: - * None. - * - *******************************************************************************/ - CY_ISR(USBFS_1_DP_ISR) - { - /* `#START DP_USER_CODE` Place your code here */ - - /* `#END` */ - - /* Clears active interrupt */ - CY_GET_REG8(USBFS_1_DP_INTSTAT_PTR); - } - -#endif /* (USBFS_1_DP_ISR_REMOVE == 0u) */ - - -/******************************************************************************* -* Function Name: USBFS_1_SaveConfig -******************************************************************************** -* -* Summary: -* Saves the current user configuration. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_SaveConfig(void) -{ - -} - - -/******************************************************************************* -* Function Name: USBFS_1_RestoreConfig -******************************************************************************** -* -* Summary: -* Restores the current user configuration. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_RestoreConfig(void) -{ - if(USBFS_1_configuration != 0u) - { - USBFS_1_ConfigReg(); - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_Suspend -******************************************************************************** -* -* Summary: -* This function disables the USBFS block and prepares for power donwn mode. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_backup.enable: modified. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_Suspend(void) -{ - uint8 enableInterrupts; - enableInterrupts = CyEnterCriticalSection(); - - if((CY_GET_REG8(USBFS_1_CR0_PTR) & USBFS_1_CR0_ENABLE) != 0u) - { /* USB block is enabled */ - USBFS_1_backup.enableState = 1u; - - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - USBFS_1_Stop_DMA(USBFS_1_MAX_EP); /* Stop all DMAs */ - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - /* Ensure USB transmit enable is low (USB_USBIO_CR0.ten). - Manual Transmission - Disabled */ - USBFS_1_USBIO_CR0_REG &= (uint8)~USBFS_1_USBIO_CR0_TEN; - CyDelayUs(0u); /*~50ns delay */ - - /* Disable the USBIO by asserting PM.USB_CR0.fsusbio_pd_n(Inverted) and pd_pullup_hv(Inverted) high. */ - USBFS_1_PM_USB_CR0_REG &= - (uint8)~(USBFS_1_PM_USB_CR0_PD_N | USBFS_1_PM_USB_CR0_PD_PULLUP_N); - - /* Disable the SIE */ - USBFS_1_CR0_REG &= (uint8)~USBFS_1_CR0_ENABLE; - - CyDelayUs(0u); /*~50ns delay */ - /* Store mode and Disable VRegulator*/ - USBFS_1_backup.mode = USBFS_1_CR1_REG & USBFS_1_CR1_REG_ENABLE; - USBFS_1_CR1_REG &= (uint8)~USBFS_1_CR1_REG_ENABLE; - - CyDelayUs(1u); /* 0.5 us min delay */ - /* Disable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/ - USBFS_1_PM_USB_CR0_REG &= (uint8)~USBFS_1_PM_USB_CR0_REF_EN; - - /* Switch DP and DM terminals to GPIO mode and disconnect 1.5k pullup*/ - USBFS_1_USBIO_CR1_REG |= USBFS_1_USBIO_CR1_IOMODE; - - /* Disable USB in ACT PM */ - USBFS_1_PM_ACT_CFG_REG &= (uint8)~USBFS_1_PM_ACT_EN_FSUSB; - /* Disable USB block for Standby Power Mode */ - USBFS_1_PM_STBY_CFG_REG &= (uint8)~USBFS_1_PM_STBY_EN_FSUSB; - CyDelayUs(1u); /* min 0.5us delay required */ - - } - else - { - USBFS_1_backup.enableState = 0u; - } - CyExitCriticalSection(enableInterrupts); - - /* Set the DP Interrupt for wake-up from sleep mode. */ - #if(USBFS_1_DP_ISR_REMOVE == 0u) - (void) CyIntSetVector(USBFS_1_DP_INTC_VECT_NUM, &USBFS_1_DP_ISR); - CyIntSetPriority(USBFS_1_DP_INTC_VECT_NUM, USBFS_1_DP_INTC_PRIOR); - CyIntClearPending(USBFS_1_DP_INTC_VECT_NUM); - CyIntEnable(USBFS_1_DP_INTC_VECT_NUM); - #endif /* (USBFS_1_DP_ISR_REMOVE == 0u) */ - -} - - -/******************************************************************************* -* Function Name: USBFS_1_Resume -******************************************************************************** -* -* Summary: -* This function enables the USBFS block after power down mode. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Global variables: -* USBFS_1_backup - checked. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_Resume(void) -{ - uint8 enableInterrupts; - enableInterrupts = CyEnterCriticalSection(); - - if(USBFS_1_backup.enableState != 0u) - { - #if(USBFS_1_DP_ISR_REMOVE == 0u) - CyIntDisable(USBFS_1_DP_INTC_VECT_NUM); - #endif /* End USBFS_1_DP_ISR_REMOVE */ - - /* Enable USB block */ - USBFS_1_PM_ACT_CFG_REG |= USBFS_1_PM_ACT_EN_FSUSB; - /* Enable USB block for Standby Power Mode */ - USBFS_1_PM_STBY_CFG_REG |= USBFS_1_PM_STBY_EN_FSUSB; - /* Enable core clock */ - USBFS_1_USB_CLK_EN_REG |= USBFS_1_USB_CLK_ENABLE; - - /* Enable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/ - USBFS_1_PM_USB_CR0_REG |= USBFS_1_PM_USB_CR0_REF_EN; - /* The reference will be available ~40us after power restored */ - CyDelayUs(40u); - /* Return VRegulator*/ - USBFS_1_CR1_REG |= USBFS_1_backup.mode; - CyDelayUs(0u); /*~50ns delay */ - /* Enable USBIO */ - USBFS_1_PM_USB_CR0_REG |= USBFS_1_PM_USB_CR0_PD_N; - CyDelayUs(2u); - /* Set the USBIO pull-up enable */ - USBFS_1_PM_USB_CR0_REG |= USBFS_1_PM_USB_CR0_PD_PULLUP_N; - - /* Reinit Arbiter configuration for DMA transfers */ - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - /* usb arb interrupt enable */ - USBFS_1_ARB_INT_EN_REG = USBFS_1_ARB_INT_MASK; - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL) - USBFS_1_ARB_CFG_REG = USBFS_1_ARB_CFG_MANUAL_DMA; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAMANUAL */ - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /*Set cfg cmplt this rises DMA request when the full configuration is done */ - USBFS_1_ARB_CFG_REG = USBFS_1_ARB_CFG_AUTO_DMA | USBFS_1_ARB_CFG_AUTO_MEM; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - /* STALL_IN_OUT */ - CY_SET_REG8(USBFS_1_EP0_CR_PTR, USBFS_1_MODE_STALL_IN_OUT); - /* Enable the SIE with a last address */ - USBFS_1_CR0_REG |= USBFS_1_CR0_ENABLE; - CyDelayCycles(1u); - /* Finally, Enable d+ pullup and select iomode to USB mode*/ - CY_SET_REG8(USBFS_1_USBIO_CR1_PTR, USBFS_1_USBIO_CR1_USBPUEN); - - /* Restore USB register settings */ - USBFS_1_RestoreConfig(); - - } - CyExitCriticalSection(enableInterrupts); -} - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pvt.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pvt.h deleted file mode 100644 index 1f11df0a..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_pvt.h +++ /dev/null @@ -1,190 +0,0 @@ -/******************************************************************************* -* File Name: .h -* Version 2.60 -* -* Description: -* This private file provides constants and parameter values for the -* USBFS Component. -* Please do not use this file or its content in your project. -* -* Note: -* -******************************************************************************** -* Copyright 2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#if !defined(CY_USBFS_USBFS_1_pvt_H) -#define CY_USBFS_USBFS_1_pvt_H - - -/*************************************** -* Private Variables -***************************************/ - -/* Generated external references for descriptors*/ -extern const uint8 CYCODE USBFS_1_DEVICE0_DESCR[18u]; -extern const uint8 CYCODE USBFS_1_DEVICE0_CONFIGURATION0_DESCR[25u]; -extern const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE USBFS_1_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE[1u]; -extern const uint8 CYCODE USBFS_1_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[1u]; -extern const T_USBFS_1_LUT CYCODE USBFS_1_DEVICE0_CONFIGURATION0_TABLE[4u]; -extern const T_USBFS_1_LUT CYCODE USBFS_1_DEVICE0_TABLE[2u]; -extern const T_USBFS_1_LUT CYCODE USBFS_1_TABLE[1u]; - - -extern const uint8 CYCODE USBFS_1_MSOS_DESCRIPTOR[USBFS_1_MSOS_DESCRIPTOR_LENGTH]; -extern const uint8 CYCODE USBFS_1_MSOS_CONFIGURATION_DESCR[USBFS_1_MSOS_CONF_DESCR_LENGTH]; -#if defined(USBFS_1_ENABLE_IDSN_STRING) - extern uint8 USBFS_1_idSerialNumberStringDescriptor[USBFS_1_IDSN_DESCR_LENGTH]; -#endif /* USBFS_1_ENABLE_IDSN_STRING */ - -extern volatile uint8 USBFS_1_interfaceNumber; -extern volatile uint8 USBFS_1_interfaceSetting[USBFS_1_MAX_INTERFACES_NUMBER]; -extern volatile uint8 USBFS_1_interfaceSetting_last[USBFS_1_MAX_INTERFACES_NUMBER]; -extern volatile uint8 USBFS_1_deviceAddress; -extern volatile uint8 USBFS_1_interfaceStatus[USBFS_1_MAX_INTERFACES_NUMBER]; -extern const uint8 CYCODE *USBFS_1_interfaceClass; - -extern volatile T_USBFS_1_EP_CTL_BLOCK USBFS_1_EP[USBFS_1_MAX_EP]; -extern volatile T_USBFS_1_TD USBFS_1_currentTD; - -#if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - extern uint8 USBFS_1_DmaChan[USBFS_1_MAX_EP]; - extern uint8 USBFS_1_DmaTd[USBFS_1_MAX_EP]; -#endif /* End USBFS_1_EP_MM */ - -extern volatile uint8 USBFS_1_ep0Toggle; -extern volatile uint8 USBFS_1_lastPacketSize; -extern volatile uint8 USBFS_1_ep0Mode; -extern volatile uint8 USBFS_1_ep0Count; -extern volatile uint16 USBFS_1_transferByteCount; - - -/*************************************** -* Private Function Prototypes -***************************************/ -void USBFS_1_ReInitComponent(void) ; -void USBFS_1_HandleSetup(void) ; -void USBFS_1_HandleIN(void) ; -void USBFS_1_HandleOUT(void) ; -void USBFS_1_LoadEP0(void) ; -uint8 USBFS_1_InitControlRead(void) ; -uint8 USBFS_1_InitControlWrite(void) ; -void USBFS_1_ControlReadDataStage(void) ; -void USBFS_1_ControlReadStatusStage(void) ; -void USBFS_1_ControlReadPrematureStatus(void) - ; -uint8 USBFS_1_InitControlWrite(void) ; -uint8 USBFS_1_InitZeroLengthControlTransfer(void) - ; -void USBFS_1_ControlWriteDataStage(void) ; -void USBFS_1_ControlWriteStatusStage(void) ; -void USBFS_1_ControlWritePrematureStatus(void) - ; -uint8 USBFS_1_InitNoDataControlTransfer(void) ; -void USBFS_1_NoDataControlStatusStage(void) ; -void USBFS_1_InitializeStatusBlock(void) ; -void USBFS_1_UpdateStatusBlock(uint8 completionCode) ; -uint8 USBFS_1_DispatchClassRqst(void) ; - -void USBFS_1_Config(uint8 clearAltSetting) ; -void USBFS_1_ConfigAltChanged(void) ; -void USBFS_1_ConfigReg(void) ; - -const T_USBFS_1_LUT CYCODE *USBFS_1_GetConfigTablePtr(uint8 c) - ; -const T_USBFS_1_LUT CYCODE *USBFS_1_GetDeviceTablePtr(void) - ; -const uint8 CYCODE *USBFS_1_GetInterfaceClassTablePtr(void) - ; -uint8 USBFS_1_ClearEndpointHalt(void) ; -uint8 USBFS_1_SetEndpointHalt(void) ; -uint8 USBFS_1_ValidateAlternateSetting(void) ; - -void USBFS_1_SaveConfig(void) ; -void USBFS_1_RestoreConfig(void) ; - -#if defined(USBFS_1_ENABLE_IDSN_STRING) - void USBFS_1_ReadDieID(uint8 descr[]) ; -#endif /* USBFS_1_ENABLE_IDSN_STRING */ - -#if defined(USBFS_1_ENABLE_HID_CLASS) - uint8 USBFS_1_DispatchHIDClassRqst(void); -#endif /* End USBFS_1_ENABLE_HID_CLASS */ -#if defined(USBFS_1_ENABLE_AUDIO_CLASS) - uint8 USBFS_1_DispatchAUDIOClassRqst(void); -#endif /* End USBFS_1_ENABLE_HID_CLASS */ -#if defined(USBFS_1_ENABLE_CDC_CLASS) - uint8 USBFS_1_DispatchCDCClassRqst(void); -#endif /* End USBFS_1_ENABLE_CDC_CLASS */ - -CY_ISR_PROTO(USBFS_1_EP_0_ISR); -#if(USBFS_1_EP1_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_1_ISR); -#endif /* End USBFS_1_EP1_ISR_REMOVE */ -#if(USBFS_1_EP2_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_2_ISR); -#endif /* End USBFS_1_EP2_ISR_REMOVE */ -#if(USBFS_1_EP3_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_3_ISR); -#endif /* End USBFS_1_EP3_ISR_REMOVE */ -#if(USBFS_1_EP4_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_4_ISR); -#endif /* End USBFS_1_EP4_ISR_REMOVE */ -#if(USBFS_1_EP5_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_5_ISR); -#endif /* End USBFS_1_EP5_ISR_REMOVE */ -#if(USBFS_1_EP6_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_6_ISR); -#endif /* End USBFS_1_EP6_ISR_REMOVE */ -#if(USBFS_1_EP7_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_7_ISR); -#endif /* End USBFS_1_EP7_ISR_REMOVE */ -#if(USBFS_1_EP8_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_EP_8_ISR); -#endif /* End USBFS_1_EP8_ISR_REMOVE */ -CY_ISR_PROTO(USBFS_1_BUS_RESET_ISR); -#if(USBFS_1_SOF_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_SOF_ISR); -#endif /* End USBFS_1_SOF_ISR_REMOVE */ -#if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - CY_ISR_PROTO(USBFS_1_ARB_ISR); -#endif /* End USBFS_1_EP_MM */ -#if(USBFS_1_DP_ISR_REMOVE == 0u) - CY_ISR_PROTO(USBFS_1_DP_ISR); -#endif /* End USBFS_1_DP_ISR_REMOVE */ - - -/*************************************** -* Request Handlers -***************************************/ - -uint8 USBFS_1_HandleStandardRqst(void) ; -uint8 USBFS_1_DispatchClassRqst(void) ; -uint8 USBFS_1_HandleVendorRqst(void) ; - - -/*************************************** -* HID Internal references -***************************************/ -#if defined(USBFS_1_ENABLE_HID_CLASS) - void USBFS_1_FindReport(void) ; - void USBFS_1_FindReportDescriptor(void) ; - void USBFS_1_FindHidClassDecriptor(void) ; -#endif /* USBFS_1_ENABLE_HID_CLASS */ - - -/*************************************** -* MIDI Internal references -***************************************/ -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) - void USBFS_1_MIDI_IN_EP_Service(void) ; -#endif /* USBFS_1_ENABLE_MIDI_STREAMING */ - - -#endif /* CY_USBFS_USBFS_1_pvt_H */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_std.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_std.c deleted file mode 100644 index 0e3fcb38..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_std.c +++ /dev/null @@ -1,1134 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_std.c -* Version 2.60 -* -* Description: -* USB Standard request handler. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" -#include "USBFS_1_cdc.h" -#include "USBFS_1_pvt.h" -#if defined(USBFS_1_ENABLE_MIDI_STREAMING) - #include "USBFS_1_midi.h" -#endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - - -/*************************************** -* Static data allocation -***************************************/ - -#if defined(USBFS_1_ENABLE_FWSN_STRING) - static volatile uint8 *USBFS_1_fwSerialNumberStringDescriptor; - static volatile uint8 USBFS_1_snStringConfirm = USBFS_1_FALSE; -#endif /* USBFS_1_ENABLE_FWSN_STRING */ - -#if defined(USBFS_1_ENABLE_FWSN_STRING) - - - /******************************************************************************* - * Function Name: USBFS_1_SerialNumString - ******************************************************************************** - * - * Summary: - * Application firmware may supply the source of the USB device descriptors - * serial number string during runtime. - * - * Parameters: - * snString: pointer to string. - * - * Return: - * None. - * - * Reentrant: - * No. - * - *******************************************************************************/ - void USBFS_1_SerialNumString(uint8 snString[]) - { - USBFS_1_snStringConfirm = USBFS_1_FALSE; - if(snString != NULL) - { - USBFS_1_fwSerialNumberStringDescriptor = snString; - /* Check descriptor validation */ - if( (snString[0u] > 1u ) && (snString[1u] == USBFS_1_DESCR_STRING) ) - { - USBFS_1_snStringConfirm = USBFS_1_TRUE; - } - } - } - -#endif /* USBFS_1_ENABLE_FWSN_STRING */ - - -/******************************************************************************* -* Function Name: USBFS_1_HandleStandardRqst -******************************************************************************** -* -* Summary: -* This Routine dispatches standard requests -* -* Parameters: -* None. -* -* Return: -* TRUE if request handled. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_HandleStandardRqst(void) -{ - uint8 requestHandled = USBFS_1_FALSE; - uint8 interfaceNumber; - #if defined(USBFS_1_ENABLE_STRINGS) - volatile uint8 *pStr = 0u; - #if defined(USBFS_1_ENABLE_DESCRIPTOR_STRINGS) - uint8 nStr; - uint8 descrLength; - #endif /* USBFS_1_ENABLE_DESCRIPTOR_STRINGS */ - #endif /* USBFS_1_ENABLE_STRINGS */ - static volatile uint8 USBFS_1_tBuffer[USBFS_1_STATUS_LENGTH_MAX]; - const T_USBFS_1_LUT CYCODE *pTmp; - USBFS_1_currentTD.count = 0u; - - if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == USBFS_1_RQST_DIR_D2H) - { - /* Control Read */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_GET_DESCRIPTOR: - if (CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_DESCR_DEVICE) - { - pTmp = USBFS_1_GetDeviceTablePtr(); - USBFS_1_currentTD.pData = (volatile uint8 *)pTmp->p_list; - USBFS_1_currentTD.count = USBFS_1_DEVICE_DESCR_LENGTH; - requestHandled = USBFS_1_InitControlRead(); - } - else if (CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_DESCR_CONFIG) - { - pTmp = USBFS_1_GetConfigTablePtr(CY_GET_REG8(USBFS_1_wValueLo)); - USBFS_1_currentTD.pData = (volatile uint8 *)pTmp->p_list; - USBFS_1_currentTD.count = ((uint16)(USBFS_1_currentTD.pData)[ \ - USBFS_1_CONFIG_DESCR_TOTAL_LENGTH_HI] << 8u) | \ - (USBFS_1_currentTD.pData)[USBFS_1_CONFIG_DESCR_TOTAL_LENGTH_LOW]; - requestHandled = USBFS_1_InitControlRead(); - } - #if defined(USBFS_1_ENABLE_STRINGS) - else if (CY_GET_REG8(USBFS_1_wValueHi) == USBFS_1_DESCR_STRING) - { - /* Descriptor Strings*/ - #if defined(USBFS_1_ENABLE_DESCRIPTOR_STRINGS) - nStr = 0u; - pStr = (volatile uint8 *)&USBFS_1_STRING_DESCRIPTORS[0u]; - while ( (CY_GET_REG8(USBFS_1_wValueLo) > nStr) && (*pStr != 0u) ) - { - /* Read descriptor length from 1st byte */ - descrLength = *pStr; - /* Move to next string descriptor */ - pStr = &pStr[descrLength]; - nStr++; - } - #endif /* End USBFS_1_ENABLE_DESCRIPTOR_STRINGS */ - /* Microsoft OS String*/ - #if defined(USBFS_1_ENABLE_MSOS_STRING) - if( CY_GET_REG8(USBFS_1_wValueLo) == USBFS_1_STRING_MSOS ) - { - pStr = (volatile uint8 *)&USBFS_1_MSOS_DESCRIPTOR[0u]; - } - #endif /* End USBFS_1_ENABLE_MSOS_STRING*/ - /* SN string */ - #if defined(USBFS_1_ENABLE_SN_STRING) - if( (CY_GET_REG8(USBFS_1_wValueLo) != 0u) && - (CY_GET_REG8(USBFS_1_wValueLo) == - USBFS_1_DEVICE0_DESCR[USBFS_1_DEVICE_DESCR_SN_SHIFT]) ) - { - pStr = (volatile uint8 *)&USBFS_1_SN_STRING_DESCRIPTOR[0u]; - #if defined(USBFS_1_ENABLE_FWSN_STRING) - if(USBFS_1_snStringConfirm != USBFS_1_FALSE) - { - pStr = USBFS_1_fwSerialNumberStringDescriptor; - } - #endif /* USBFS_1_ENABLE_FWSN_STRING */ - #if defined(USBFS_1_ENABLE_IDSN_STRING) - /* Read DIE ID and generate string descriptor in RAM */ - USBFS_1_ReadDieID(USBFS_1_idSerialNumberStringDescriptor); - pStr = USBFS_1_idSerialNumberStringDescriptor; - #endif /* End USBFS_1_ENABLE_IDSN_STRING */ - } - #endif /* End USBFS_1_ENABLE_SN_STRING */ - if (*pStr != 0u) - { - USBFS_1_currentTD.count = *pStr; - USBFS_1_currentTD.pData = pStr; - requestHandled = USBFS_1_InitControlRead(); - } - } - #endif /* End USBFS_1_ENABLE_STRINGS */ - else - { - requestHandled = USBFS_1_DispatchClassRqst(); - } - break; - case USBFS_1_GET_STATUS: - switch ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK)) - { - case USBFS_1_RQST_RCPT_EP: - USBFS_1_currentTD.count = USBFS_1_EP_STATUS_LENGTH; - USBFS_1_tBuffer[0u] = USBFS_1_EP[ \ - CY_GET_REG8(USBFS_1_wIndexLo) & USBFS_1_DIR_UNUSED].hwEpState; - USBFS_1_tBuffer[1u] = 0u; - USBFS_1_currentTD.pData = &USBFS_1_tBuffer[0u]; - requestHandled = USBFS_1_InitControlRead(); - break; - case USBFS_1_RQST_RCPT_DEV: - USBFS_1_currentTD.count = USBFS_1_DEVICE_STATUS_LENGTH; - USBFS_1_tBuffer[0u] = USBFS_1_deviceStatus; - USBFS_1_tBuffer[1u] = 0u; - USBFS_1_currentTD.pData = &USBFS_1_tBuffer[0u]; - requestHandled = USBFS_1_InitControlRead(); - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - break; - case USBFS_1_GET_CONFIGURATION: - USBFS_1_currentTD.count = 1u; - USBFS_1_currentTD.pData = (volatile uint8 *)&USBFS_1_configuration; - requestHandled = USBFS_1_InitControlRead(); - break; - case USBFS_1_GET_INTERFACE: - USBFS_1_currentTD.count = 1u; - USBFS_1_currentTD.pData = (volatile uint8 *)&USBFS_1_interfaceSetting[ \ - CY_GET_REG8(USBFS_1_wIndexLo)]; - requestHandled = USBFS_1_InitControlRead(); - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - } - else { - /* Control Write */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_SET_ADDRESS: - USBFS_1_deviceAddress = CY_GET_REG8(USBFS_1_wValueLo); - requestHandled = USBFS_1_InitNoDataControlTransfer(); - break; - case USBFS_1_SET_CONFIGURATION: - USBFS_1_configuration = CY_GET_REG8(USBFS_1_wValueLo); - USBFS_1_configurationChanged = USBFS_1_TRUE; - USBFS_1_Config(USBFS_1_TRUE); - requestHandled = USBFS_1_InitNoDataControlTransfer(); - break; - case USBFS_1_SET_INTERFACE: - if (USBFS_1_ValidateAlternateSetting() != 0u) - { - interfaceNumber = CY_GET_REG8(USBFS_1_wIndexLo); - USBFS_1_interfaceNumber = interfaceNumber; - USBFS_1_configurationChanged = USBFS_1_TRUE; - #if ((USBFS_1_EP_MA == USBFS_1__MA_DYNAMIC) && \ - (USBFS_1_EP_MM == USBFS_1__EP_MANUAL) ) - USBFS_1_Config(USBFS_1_FALSE); - #else - USBFS_1_ConfigAltChanged(); - #endif /* End (USBFS_1_EP_MA == USBFS_1__MA_DYNAMIC) */ - /* Update handled Alt setting changes status */ - USBFS_1_interfaceSetting_last[interfaceNumber] = - USBFS_1_interfaceSetting[interfaceNumber]; - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - case USBFS_1_CLEAR_FEATURE: - switch (CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) - { - case USBFS_1_RQST_RCPT_EP: - if (CY_GET_REG8(USBFS_1_wValueLo) == USBFS_1_ENDPOINT_HALT) - { - requestHandled = USBFS_1_ClearEndpointHalt(); - } - break; - case USBFS_1_RQST_RCPT_DEV: - /* Clear device REMOTE_WAKEUP */ - if (CY_GET_REG8(USBFS_1_wValueLo) == USBFS_1_DEVICE_REMOTE_WAKEUP) - { - USBFS_1_deviceStatus &= (uint8)~USBFS_1_DEVICE_STATUS_REMOTE_WAKEUP; - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - case USBFS_1_RQST_RCPT_IFC: - /* Validate interfaceNumber */ - if (CY_GET_REG8(USBFS_1_wIndexLo) < USBFS_1_MAX_INTERFACES_NUMBER) - { - USBFS_1_interfaceStatus[CY_GET_REG8(USBFS_1_wIndexLo)] &= - (uint8)~(CY_GET_REG8(USBFS_1_wValueLo)); - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - break; - case USBFS_1_SET_FEATURE: - switch (CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_RCPT_MASK) - { - case USBFS_1_RQST_RCPT_EP: - if (CY_GET_REG8(USBFS_1_wValueLo) == USBFS_1_ENDPOINT_HALT) - { - requestHandled = USBFS_1_SetEndpointHalt(); - } - break; - case USBFS_1_RQST_RCPT_DEV: - /* Set device REMOTE_WAKEUP */ - if (CY_GET_REG8(USBFS_1_wValueLo) == USBFS_1_DEVICE_REMOTE_WAKEUP) - { - USBFS_1_deviceStatus |= USBFS_1_DEVICE_STATUS_REMOTE_WAKEUP; - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - case USBFS_1_RQST_RCPT_IFC: - /* Validate interfaceNumber */ - if (CY_GET_REG8(USBFS_1_wIndexLo) < USBFS_1_MAX_INTERFACES_NUMBER) - { - USBFS_1_interfaceStatus[CY_GET_REG8(USBFS_1_wIndexLo)] &= - (uint8)~(CY_GET_REG8(USBFS_1_wValueLo)); - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - break; - default: /* requestHandled is initialized as FALSE by default */ - break; - } - } - return(requestHandled); -} - - -#if defined(USBFS_1_ENABLE_IDSN_STRING) - - /*************************************************************************** - * Function Name: USBFS_1_ReadDieID - **************************************************************************** - * - * Summary: - * This routine read Die ID and generate Serial Number string descriptor. - * - * Parameters: - * descr: pointer on string descriptor. - * - * Return: - * None. - * - * Reentrant: - * No. - * - ***************************************************************************/ - void USBFS_1_ReadDieID(uint8 descr[]) - { - uint8 i; - uint8 j = 0u; - uint8 value; - const char8 CYCODE hex[16u] = "0123456789ABCDEF"; - - - /* Check descriptor validation */ - if( descr != NULL) - { - descr[0u] = USBFS_1_IDSN_DESCR_LENGTH; - descr[1u] = USBFS_1_DESCR_STRING; - - /* fill descriptor */ - for(i = 2u; i < USBFS_1_IDSN_DESCR_LENGTH; i += 4u) - { - value = CY_GET_XTND_REG8((void CYFAR *)(USBFS_1_DIE_ID + j)); - j++; - descr[i] = (uint8)hex[value >> 4u]; - descr[i + 2u] = (uint8)hex[value & 0x0Fu]; - } - } - } - -#endif /* End USBFS_1_ENABLE_IDSN_STRING */ - - -/******************************************************************************* -* Function Name: USBFS_1_ConfigReg -******************************************************************************** -* -* Summary: -* This routine configures hardware registers from the variables. -* It is called from USBFS_1_Config() function and from RestoreConfig -* after Wakeup. -* -* Parameters: -* None. -* -* Return: -* None. -* -*******************************************************************************/ -void USBFS_1_ConfigReg(void) -{ - uint8 ep; - uint8 i; - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - uint8 ep_type = 0u; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - - /* Set the endpoint buffer addresses */ - ep = USBFS_1_EP1; - for (i = 0u; i < 0x80u; i+= 0x10u) - { - CY_SET_REG8((reg8 *)(USBFS_1_ARB_EP1_CFG_IND + i), USBFS_1_ARB_EPX_CFG_CRC_BYPASS | - USBFS_1_ARB_EPX_CFG_RESET); - - #if(USBFS_1_EP_MM != USBFS_1__EP_MANUAL) - /* Enable all Arbiter EP Interrupts : err, buf under, buf over, dma gnt(mode2 only), in buf full */ - CY_SET_REG8((reg8 *)(USBFS_1_ARB_EP1_INT_EN_IND + i), USBFS_1_ARB_EPX_INT_MASK); - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_MANUAL */ - - if(USBFS_1_EP[ep].epMode != USBFS_1_MODE_DISABLE) - { - if((USBFS_1_EP[ep].addr & USBFS_1_DIR_IN) != 0u ) - { - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + i), USBFS_1_MODE_NAK_IN); - } - else - { - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + i), USBFS_1_MODE_NAK_OUT); - /* Prepare EP type mask for automatic memory allocation */ - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - ep_type |= (uint8)(0x01u << (ep - USBFS_1_EP1)); - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - } - } - else - { - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + i), USBFS_1_MODE_STALL_DATA_EP); - } - - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT0_IND + i), USBFS_1_EP[ep].bufferSize >> 8u); - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT1_IND + i), USBFS_1_EP[ep].bufferSize & 0xFFu); - - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_RA_IND + i), USBFS_1_EP[ep].buffOffset & 0xFFu); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_RA_MSB_IND + i), USBFS_1_EP[ep].buffOffset >> 8u); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_WA_IND + i), USBFS_1_EP[ep].buffOffset & 0xFFu); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_WA_MSB_IND + i), USBFS_1_EP[ep].buffOffset >> 8u); - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - - ep++; - } - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /* BUF_SIZE depend on DMA_THRESS value: 55-32 bytes 44-16 bytes 33-8 bytes 22-4 bytes 11-2 bytes */ - USBFS_1_BUF_SIZE_REG = USBFS_1_DMA_BUF_SIZE; - USBFS_1_DMA_THRES_REG = USBFS_1_DMA_BYTES_PER_BURST; /* DMA burst threshold */ - USBFS_1_DMA_THRES_MSB_REG = 0u; - USBFS_1_EP_ACTIVE_REG = USBFS_1_ARB_INT_MASK; - USBFS_1_EP_TYPE_REG = ep_type; - /* Cfg_cmp bit set to 1 once configuration is complete. */ - USBFS_1_ARB_CFG_REG = USBFS_1_ARB_CFG_AUTO_DMA | USBFS_1_ARB_CFG_AUTO_MEM | - USBFS_1_ARB_CFG_CFG_CPM; - /* Cfg_cmp bit set to 0 during configuration of PFSUSB Registers. */ - USBFS_1_ARB_CFG_REG = USBFS_1_ARB_CFG_AUTO_DMA | USBFS_1_ARB_CFG_AUTO_MEM; - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - - CY_SET_REG8(USBFS_1_SIE_EP_INT_EN_PTR, 0xFFu); -} - - -/******************************************************************************* -* Function Name: USBFS_1_Config -******************************************************************************** -* -* Summary: -* This routine configures endpoints for the entire configuration by scanning -* the configuration descriptor. -* -* Parameters: -* clearAltSetting: It configures the bAlternateSetting 0 for each interface. -* -* Return: -* None. -* -* USBFS_1_interfaceClass - Initialized class array for each interface. -* It is used for handling Class specific requests depend on interface class. -* Different classes in multiple Alternate settings does not supported. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_Config(uint8 clearAltSetting) -{ - uint8 ep; - uint8 cur_ep; - uint8 i; - uint8 ep_type; - const uint8 *pDescr; - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - uint16 buffCount = 0u; - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - - const T_USBFS_1_LUT CYCODE *pTmp; - const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE *pEP; - - /* Clear all of the endpoints */ - for (ep = 0u; ep < USBFS_1_MAX_EP; ep++) - { - USBFS_1_EP[ep].attrib = 0u; - USBFS_1_EP[ep].hwEpState = 0u; - USBFS_1_EP[ep].apiEpState = USBFS_1_NO_EVENT_PENDING; - USBFS_1_EP[ep].epToggle = 0u; - USBFS_1_EP[ep].epMode = USBFS_1_MODE_DISABLE; - USBFS_1_EP[ep].bufferSize = 0u; - USBFS_1_EP[ep].interface = 0u; - - } - - /* Clear Alternate settings for all interfaces */ - if(clearAltSetting != 0u) - { - for (i = 0u; i < USBFS_1_MAX_INTERFACES_NUMBER; i++) - { - USBFS_1_interfaceSetting[i] = 0x00u; - USBFS_1_interfaceSetting_last[i] = 0x00u; - } - } - - /* Init Endpoints and Device Status if configured */ - if(USBFS_1_configuration > 0u) - { - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - /* Set Power status for current configuration */ - pDescr = (const uint8 *)pTmp->p_list; - if((pDescr[USBFS_1_CONFIG_DESCR_ATTRIB] & USBFS_1_CONFIG_DESCR_ATTRIB_SELF_POWERED) != 0u) - { - USBFS_1_deviceStatus |= USBFS_1_DEVICE_STATUS_SELF_POWERED; - } - else - { - USBFS_1_deviceStatus &= (uint8)~USBFS_1_DEVICE_STATUS_SELF_POWERED; - } - /* Move to next element */ - pTmp = &pTmp[1u]; - ep = pTmp->c; /* For this table, c is the number of endpoints configurations */ - - #if ((USBFS_1_EP_MA == USBFS_1__MA_DYNAMIC) && \ - (USBFS_1_EP_MM == USBFS_1__EP_MANUAL) ) - /* Configure for dynamic EP memory allocation */ - /* p_list points the endpoint setting table. */ - pEP = (T_USBFS_1_EP_SETTINGS_BLOCK *) pTmp->p_list; - for (i = 0u; i < ep; i++) - { - /* Compare current Alternate setting with EP Alt*/ - if(USBFS_1_interfaceSetting[pEP->interface] == pEP->altSetting) - { - cur_ep = pEP->addr & USBFS_1_DIR_UNUSED; - ep_type = pEP->attributes & USBFS_1_EP_TYPE_MASK; - if (pEP->addr & USBFS_1_DIR_IN) - { - /* IN Endpoint */ - USBFS_1_EP[cur_ep].apiEpState = USBFS_1_EVENT_PENDING; - USBFS_1_EP[cur_ep].epMode = (ep_type == USBFS_1_EP_TYPE_ISOC) ? - USBFS_1_MODE_ISO_IN : USBFS_1_MODE_ACK_IN; - #if defined(USBFS_1_ENABLE_CDC_CLASS) - if(((pEP->bMisc == USBFS_1_CLASS_CDC_DATA) || - (pEP->bMisc == USBFS_1_CLASS_CDC)) && - (ep_type != USBFS_1_EP_TYPE_INT)) - { - USBFS_1_cdc_data_in_ep = cur_ep; - } - #endif /* End USBFS_1_ENABLE_CDC_CLASS*/ - #if ( defined(USBFS_1_ENABLE_MIDI_STREAMING) && \ - (USBFS_1_MIDI_IN_BUFF_SIZE > 0) ) - if((pEP->bMisc == USBFS_1_CLASS_AUDIO) && - (ep_type == USBFS_1_EP_TYPE_BULK)) - { - USBFS_1_midi_in_ep = cur_ep; - } - #endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - } - else - { - /* OUT Endpoint */ - USBFS_1_EP[cur_ep].apiEpState = USBFS_1_NO_EVENT_PENDING; - USBFS_1_EP[cur_ep].epMode = (ep_type == USBFS_1_EP_TYPE_ISOC) ? - USBFS_1_MODE_ISO_OUT : USBFS_1_MODE_ACK_OUT; - #if defined(USBFS_1_ENABLE_CDC_CLASS) - if(((pEP->bMisc == USBFS_1_CLASS_CDC_DATA) || - (pEP->bMisc == USBFS_1_CLASS_CDC)) && - (ep_type != USBFS_1_EP_TYPE_INT)) - { - USBFS_1_cdc_data_out_ep = cur_ep; - } - #endif /* End USBFS_1_ENABLE_CDC_CLASS*/ - #if ( defined(USBFS_1_ENABLE_MIDI_STREAMING) && \ - (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) ) - if((pEP->bMisc == USBFS_1_CLASS_AUDIO) && - (ep_type == USBFS_1_EP_TYPE_BULK)) - { - USBFS_1_midi_out_ep = cur_ep; - } - #endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - } - USBFS_1_EP[cur_ep].bufferSize = pEP->bufferSize; - USBFS_1_EP[cur_ep].addr = pEP->addr; - USBFS_1_EP[cur_ep].attrib = pEP->attributes; - } - pEP = &pEP[1u]; - } - #else /* Config for static EP memory allocation */ - for (i = USBFS_1_EP1; i < USBFS_1_MAX_EP; i++) - { - /* p_list points the endpoint setting table. */ - pEP = (const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE *) pTmp->p_list; - /* Find max length for each EP and select it (length could be different in different Alt settings) */ - /* but other settings should be correct with regards to Interface alt Setting */ - for (cur_ep = 0u; cur_ep < ep; cur_ep++) - { - /* EP count is equal to EP # in table and we found larger EP length than have before*/ - if(i == (pEP->addr & USBFS_1_DIR_UNUSED)) - { - if(USBFS_1_EP[i].bufferSize < pEP->bufferSize) - { - USBFS_1_EP[i].bufferSize = pEP->bufferSize; - } - /* Compare current Alternate setting with EP Alt*/ - if(USBFS_1_interfaceSetting[pEP->interface] == pEP->altSetting) - { - ep_type = pEP->attributes & USBFS_1_EP_TYPE_MASK; - if ((pEP->addr & USBFS_1_DIR_IN) != 0u) - { - /* IN Endpoint */ - USBFS_1_EP[i].apiEpState = USBFS_1_EVENT_PENDING; - USBFS_1_EP[i].epMode = (ep_type == USBFS_1_EP_TYPE_ISOC) ? - USBFS_1_MODE_ISO_IN : USBFS_1_MODE_ACK_IN; - /* Find and init CDC IN endpoint number */ - #if defined(USBFS_1_ENABLE_CDC_CLASS) - if(((pEP->bMisc == USBFS_1_CLASS_CDC_DATA) || - (pEP->bMisc == USBFS_1_CLASS_CDC)) && - (ep_type != USBFS_1_EP_TYPE_INT)) - { - USBFS_1_cdc_data_in_ep = i; - } - #endif /* End USBFS_1_ENABLE_CDC_CLASS*/ - #if ( defined(USBFS_1_ENABLE_MIDI_STREAMING) && \ - (USBFS_1_MIDI_IN_BUFF_SIZE > 0) ) - if((pEP->bMisc == USBFS_1_CLASS_AUDIO) && - (ep_type == USBFS_1_EP_TYPE_BULK)) - { - USBFS_1_midi_in_ep = i; - } - #endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - } - else - { - /* OUT Endpoint */ - USBFS_1_EP[i].apiEpState = USBFS_1_NO_EVENT_PENDING; - USBFS_1_EP[i].epMode = (ep_type == USBFS_1_EP_TYPE_ISOC) ? - USBFS_1_MODE_ISO_OUT : USBFS_1_MODE_ACK_OUT; - /* Find and init CDC IN endpoint number */ - #if defined(USBFS_1_ENABLE_CDC_CLASS) - if(((pEP->bMisc == USBFS_1_CLASS_CDC_DATA) || - (pEP->bMisc == USBFS_1_CLASS_CDC)) && - (ep_type != USBFS_1_EP_TYPE_INT)) - { - USBFS_1_cdc_data_out_ep = i; - } - #endif /* End USBFS_1_ENABLE_CDC_CLASS*/ - #if ( defined(USBFS_1_ENABLE_MIDI_STREAMING) && \ - (USBFS_1_MIDI_OUT_BUFF_SIZE > 0) ) - if((pEP->bMisc == USBFS_1_CLASS_AUDIO) && - (ep_type == USBFS_1_EP_TYPE_BULK)) - { - USBFS_1_midi_out_ep = i; - } - #endif /* End USBFS_1_ENABLE_MIDI_STREAMING*/ - } - USBFS_1_EP[i].addr = pEP->addr; - USBFS_1_EP[i].attrib = pEP->attributes; - - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - break; /* use first EP setting in Auto memory managment */ - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - } - } - pEP = &pEP[1u]; - } - } - #endif /* End (USBFS_1_EP_MA == USBFS_1__MA_DYNAMIC) */ - - /* Init class array for each interface and interface number for each EP. - * It is used for handling Class specific requests directed to either an - * interface or the endpoint. - */ - /* p_list points the endpoint setting table. */ - pEP = (const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE *) pTmp->p_list; - for (i = 0u; i < ep; i++) - { - /* Configure interface number for each EP*/ - USBFS_1_EP[pEP->addr & USBFS_1_DIR_UNUSED].interface = pEP->interface; - pEP = &pEP[1u]; - } - /* Init pointer on interface class table*/ - USBFS_1_interfaceClass = USBFS_1_GetInterfaceClassTablePtr(); - /* Set the endpoint buffer addresses */ - - #if(USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO) - for (ep = USBFS_1_EP1; ep < USBFS_1_MAX_EP; ep++) - { - USBFS_1_EP[ep].buffOffset = buffCount; - buffCount += USBFS_1_EP[ep].bufferSize; - } - #endif /* End USBFS_1_EP_MM != USBFS_1__EP_DMAAUTO */ - - /* Configure hardware registers */ - USBFS_1_ConfigReg(); - } /* USBFS_1_configuration > 0 */ -} - - -/******************************************************************************* -* Function Name: USBFS_1_ConfigAltChanged -******************************************************************************** -* -* Summary: -* This routine update configuration for the required endpoints only. -* It is called after SET_INTERFACE request when Static memory allocation used. -* -* Parameters: -* None. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_ConfigAltChanged(void) -{ - uint8 ep; - uint8 cur_ep; - uint8 i; - uint8 ep_type; - uint8 ri; - - const T_USBFS_1_LUT CYCODE *pTmp; - const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE *pEP; - - - /* Init Endpoints and Device Status if configured */ - if(USBFS_1_configuration > 0u) - { - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - pTmp = &pTmp[1u]; - ep = pTmp->c; /* For this table, c is the number of endpoints configurations */ - - /* Do not touch EP which doesn't need reconfiguration */ - /* When Alt setting changed, the only required endpoints need to be reconfigured */ - /* p_list points the endpoint setting table. */ - pEP = (const T_USBFS_1_EP_SETTINGS_BLOCK CYCODE *) pTmp->p_list; - for (i = 0u; i < ep; i++) - { - /*If Alt setting changed and new is same with EP Alt */ - if((USBFS_1_interfaceSetting[pEP->interface] != - USBFS_1_interfaceSetting_last[pEP->interface] ) && - (USBFS_1_interfaceSetting[pEP->interface] == pEP->altSetting) && - (pEP->interface == CY_GET_REG8(USBFS_1_wIndexLo))) - { - cur_ep = pEP->addr & USBFS_1_DIR_UNUSED; - ri = ((cur_ep - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - ep_type = pEP->attributes & USBFS_1_EP_TYPE_MASK; - if ((pEP->addr & USBFS_1_DIR_IN) != 0u) - { - /* IN Endpoint */ - USBFS_1_EP[cur_ep].apiEpState = USBFS_1_EVENT_PENDING; - USBFS_1_EP[cur_ep].epMode = (ep_type == USBFS_1_EP_TYPE_ISOC) ? - USBFS_1_MODE_ISO_IN : USBFS_1_MODE_ACK_IN; - } - else - { - /* OUT Endpoint */ - USBFS_1_EP[cur_ep].apiEpState = USBFS_1_NO_EVENT_PENDING; - USBFS_1_EP[cur_ep].epMode = (ep_type == USBFS_1_EP_TYPE_ISOC) ? - USBFS_1_MODE_ISO_OUT : USBFS_1_MODE_ACK_OUT; - } - /* Change the SIE mode for the selected EP to NAK ALL */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_NAK_IN_OUT); - USBFS_1_EP[cur_ep].bufferSize = pEP->bufferSize; - USBFS_1_EP[cur_ep].addr = pEP->addr; - USBFS_1_EP[cur_ep].attrib = pEP->attributes; - - /* Clear the data toggle */ - USBFS_1_EP[cur_ep].epToggle = 0u; - - /* Dynamic reconfiguration for mode 3 transfer */ - #if(USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO) - /* In_data_rdy for selected EP should be set to 0 */ - * (reg8 *)(USBFS_1_ARB_EP1_CFG_IND + ri) &= (uint8)~USBFS_1_ARB_EPX_CFG_IN_DATA_RDY; - - /* write the EP number for which reconfiguration is required */ - USBFS_1_DYN_RECONFIG_REG = (cur_ep - USBFS_1_EP1) << - USBFS_1_DYN_RECONFIG_EP_SHIFT; - /* Set the dyn_config_en bit in dynamic reconfiguration register */ - USBFS_1_DYN_RECONFIG_REG |= USBFS_1_DYN_RECONFIG_ENABLE; - /* wait for the dyn_config_rdy bit to set by the block, - * this bit will be set to 1 when block is ready for reconfiguration. - */ - while((USBFS_1_DYN_RECONFIG_REG & USBFS_1_DYN_RECONFIG_RDY_STS) == 0u) - { - ; - } - /* Once dyn_config_rdy bit is set, FW can change the EP configuration. */ - /* Change EP Type with new direction */ - if((pEP->addr & USBFS_1_DIR_IN) == 0u) - { - USBFS_1_EP_TYPE_REG |= (uint8)(0x01u << (cur_ep - USBFS_1_EP1)); - } - else - { - USBFS_1_EP_TYPE_REG &= (uint8)~(uint8)(0x01u << (cur_ep - USBFS_1_EP1)); - } - /* dynamic reconfiguration enable bit cleared, pointers and control/status - * signals for the selected EP is cleared/re-initialized on negative edge - * of dynamic reconfiguration enable bit). - */ - USBFS_1_DYN_RECONFIG_REG &= (uint8)~USBFS_1_DYN_RECONFIG_ENABLE; - /* The main loop has to re-enable DMA and OUT endpoint*/ - #else - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT0_IND + ri), - USBFS_1_EP[cur_ep].bufferSize >> 8u); - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT1_IND + ri), - USBFS_1_EP[cur_ep].bufferSize & 0xFFu); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_RA_IND + ri), - USBFS_1_EP[cur_ep].buffOffset & 0xFFu); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_RA_MSB_IND + ri), - USBFS_1_EP[cur_ep].buffOffset >> 8u); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_WA_IND + ri), - USBFS_1_EP[cur_ep].buffOffset & 0xFFu); - CY_SET_REG8((reg8 *)(USBFS_1_ARB_RW1_WA_MSB_IND + ri), - USBFS_1_EP[cur_ep].buffOffset >> 8u); - #endif /* End USBFS_1_EP_MM == USBFS_1__EP_DMAAUTO */ - } - /* Get next EP element */ - pEP = &pEP[1u]; - } - } /* USBFS_1_configuration > 0 */ -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetConfigTablePtr -******************************************************************************** -* -* Summary: -* This routine returns a pointer a configuration table entry -* -* Parameters: -* c: Configuration Index -* -* Return: -* Device Descriptor pointer. -* -*******************************************************************************/ -const T_USBFS_1_LUT CYCODE *USBFS_1_GetConfigTablePtr(uint8 c) - -{ - /* Device Table */ - const T_USBFS_1_LUT CYCODE *pTmp; - - pTmp = (const T_USBFS_1_LUT CYCODE *) USBFS_1_TABLE[USBFS_1_device].p_list; - - /* The first entry points to the Device Descriptor, - * the rest configuration entries. - */ - return( (const T_USBFS_1_LUT CYCODE *) pTmp[c + 1u].p_list ); -} - - -/******************************************************************************* -* Function Name: USBFS_1_GetDeviceTablePtr -******************************************************************************** -* -* Summary: -* This routine returns a pointer to the Device table -* -* Parameters: -* None. -* -* Return: -* Device Table pointer -* -*******************************************************************************/ -const T_USBFS_1_LUT CYCODE *USBFS_1_GetDeviceTablePtr(void) - -{ - /* Device Table */ - return( (const T_USBFS_1_LUT CYCODE *) USBFS_1_TABLE[USBFS_1_device].p_list ); -} - - -/******************************************************************************* -* Function Name: USB_GetInterfaceClassTablePtr -******************************************************************************** -* -* Summary: -* This routine returns Interface Class table pointer, which contains -* the relation between interface number and interface class. -* -* Parameters: -* None. -* -* Return: -* Interface Class table pointer. -* -*******************************************************************************/ -const uint8 CYCODE *USBFS_1_GetInterfaceClassTablePtr(void) - -{ - const T_USBFS_1_LUT CYCODE *pTmp; - uint8 currentInterfacesNum; - - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - currentInterfacesNum = ((const uint8 *) pTmp->p_list)[USBFS_1_CONFIG_DESCR_NUM_INTERFACES]; - /* Third entry in the LUT starts the Interface Table pointers */ - /* The INTERFACE_CLASS table is located after all interfaces */ - pTmp = &pTmp[currentInterfacesNum + 2u]; - return( (const uint8 CYCODE *) pTmp->p_list ); -} - - -/******************************************************************************* -* Function Name: USBFS_1_TerminateEP -******************************************************************************** -* -* Summary: -* This function terminates the specified USBFS endpoint. -* This function should be used before endpoint reconfiguration. -* -* Parameters: -* Endpoint number. -* -* Return: -* None. -* -* Reentrant: -* No. -* -*******************************************************************************/ -void USBFS_1_TerminateEP(uint8 ep) -{ - uint8 ri; - - ep &= USBFS_1_DIR_UNUSED; - ri = ((ep - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - - if ((ep > USBFS_1_EP0) && (ep < USBFS_1_MAX_EP)) - { - /* Set the endpoint Halt */ - USBFS_1_EP[ep].hwEpState |= (USBFS_1_ENDPOINT_STATUS_HALT); - - /* Clear the data toggle */ - USBFS_1_EP[ep].epToggle = 0u; - USBFS_1_EP[ep].apiEpState = USBFS_1_NO_EVENT_ALLOWED; - - if ((USBFS_1_EP[ep].addr & USBFS_1_DIR_IN) != 0u) - { - /* IN Endpoint */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_NAK_IN); - } - else - { - /* OUT Endpoint */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_NAK_OUT); - } - } -} - - -/******************************************************************************* -* Function Name: USBFS_1_SetEndpointHalt -******************************************************************************** -* -* Summary: -* This routine handles set endpoint halt. -* -* Parameters: -* None. -* -* Return: -* requestHandled. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_SetEndpointHalt(void) -{ - uint8 ep; - uint8 ri; - uint8 requestHandled = USBFS_1_FALSE; - - /* Set endpoint halt */ - ep = CY_GET_REG8(USBFS_1_wIndexLo) & USBFS_1_DIR_UNUSED; - ri = ((ep - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - - if ((ep > USBFS_1_EP0) && (ep < USBFS_1_MAX_EP)) - { - /* Set the endpoint Halt */ - USBFS_1_EP[ep].hwEpState |= (USBFS_1_ENDPOINT_STATUS_HALT); - - /* Clear the data toggle */ - USBFS_1_EP[ep].epToggle = 0u; - USBFS_1_EP[ep].apiEpState |= USBFS_1_NO_EVENT_ALLOWED; - - if ((USBFS_1_EP[ep].addr & USBFS_1_DIR_IN) != 0u) - { - /* IN Endpoint */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_STALL_DATA_EP | - USBFS_1_MODE_ACK_IN); - } - else - { - /* OUT Endpoint */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_STALL_DATA_EP | - USBFS_1_MODE_ACK_OUT); - } - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - - return(requestHandled); -} - - -/******************************************************************************* -* Function Name: USBFS_1_ClearEndpointHalt -******************************************************************************** -* -* Summary: -* This routine handles clear endpoint halt. -* -* Parameters: -* None. -* -* Return: -* requestHandled. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_ClearEndpointHalt(void) -{ - uint8 ep; - uint8 ri; - uint8 requestHandled = USBFS_1_FALSE; - - /* Clear endpoint halt */ - ep = CY_GET_REG8(USBFS_1_wIndexLo) & USBFS_1_DIR_UNUSED; - ri = ((ep - USBFS_1_EP1) << USBFS_1_EPX_CNTX_ADDR_SHIFT); - - if ((ep > USBFS_1_EP0) && (ep < USBFS_1_MAX_EP)) - { - /* Clear the endpoint Halt */ - USBFS_1_EP[ep].hwEpState &= (uint8)~(USBFS_1_ENDPOINT_STATUS_HALT); - - /* Clear the data toggle */ - USBFS_1_EP[ep].epToggle = 0u; - /* Clear toggle bit for already armed packet */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CNT0_IND + ri), CY_GET_REG8( - (reg8 *)(USBFS_1_SIE_EP1_CNT0_IND + ri)) & (uint8)~USBFS_1_EPX_CNT_DATA_TOGGLE); - /* Return API State as it was defined before */ - USBFS_1_EP[ep].apiEpState &= (uint8)~USBFS_1_NO_EVENT_ALLOWED; - - if ((USBFS_1_EP[ep].addr & USBFS_1_DIR_IN) != 0u) - { - /* IN Endpoint */ - if(USBFS_1_EP[ep].apiEpState == USBFS_1_IN_BUFFER_EMPTY) - { /* Wait for next packet from application */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_NAK_IN); - } - else /* Continue armed transfer */ - { - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_ACK_IN); - } - } - else - { - /* OUT Endpoint */ - if(USBFS_1_EP[ep].apiEpState == USBFS_1_OUT_BUFFER_FULL) - { /* Allow application to read full buffer */ - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_NAK_OUT); - } - else /* Mark endpoint as empty, so it will be reloaded */ - { - CY_SET_REG8((reg8 *)(USBFS_1_SIE_EP1_CR0_IND + ri), USBFS_1_MODE_ACK_OUT); - } - } - requestHandled = USBFS_1_InitNoDataControlTransfer(); - } - - return(requestHandled); -} - - -/******************************************************************************* -* Function Name: USBFS_1_ValidateAlternateSetting -******************************************************************************** -* -* Summary: -* Validates (and records) a SET INTERFACE request. -* -* Parameters: -* None. -* -* Return: -* requestHandled. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_ValidateAlternateSetting(void) -{ - uint8 requestHandled = USBFS_1_TRUE; - uint8 interfaceNum; - const T_USBFS_1_LUT CYCODE *pTmp; - uint8 currentInterfacesNum; - - interfaceNum = CY_GET_REG8(USBFS_1_wIndexLo); - /* Validate interface setting, stall if invalid. */ - pTmp = USBFS_1_GetConfigTablePtr(USBFS_1_configuration - 1u); - currentInterfacesNum = ((const uint8 *) pTmp->p_list)[USBFS_1_CONFIG_DESCR_NUM_INTERFACES]; - - if((interfaceNum >= currentInterfacesNum) || (interfaceNum >= USBFS_1_MAX_INTERFACES_NUMBER)) - { /* Wrong interface number */ - requestHandled = USBFS_1_FALSE; - } - else - { - /* Save current Alt setting to find out the difference in Config() function */ - USBFS_1_interfaceSetting_last[interfaceNum] = USBFS_1_interfaceSetting[interfaceNum]; - USBFS_1_interfaceSetting[interfaceNum] = CY_GET_REG8(USBFS_1_wValueLo); - } - - return (requestHandled); -} - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_vnd.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_vnd.c deleted file mode 100644 index d54879b6..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_1_vnd.c +++ /dev/null @@ -1,96 +0,0 @@ -/******************************************************************************* -* File Name: USBFS_1_vnd.c -* Version 2.60 -* -* Description: -* USB vendor request handler. -* -* Note: -* -******************************************************************************** -* Copyright 2008-2013, Cypress Semiconductor Corporation. All rights reserved. -* You may use this file only in accordance with the license, terms, conditions, -* disclaimers, and limitations in the end user license agreement accompanying -* the software package with which this file was provided. -*******************************************************************************/ - -#include "USBFS_1.h" -#include "USBFS_1_pvt.h" - -#if(USBFS_1_EXTERN_VND == USBFS_1_FALSE) - - -/*************************************** -* Vendor Specific Declarations -***************************************/ - -/* `#START VENDOR_SPECIFIC_DECLARATIONS` Place your declaration here */ - -/* `#END` */ - - -/******************************************************************************* -* Function Name: USBFS_1_HandleVendorRqst -******************************************************************************** -* -* Summary: -* This routine provide users with a method to implement vendor specifc -* requests. -* -* To implement vendor specific requests, add your code in this function to -* decode and disposition the request. If the request is handled, your code -* must set the variable "requestHandled" to TRUE, indicating that the -* request has been handled. -* -* Parameters: -* None. -* -* Return: -* requestHandled. -* -* Reentrant: -* No. -* -*******************************************************************************/ -uint8 USBFS_1_HandleVendorRqst(void) -{ - uint8 requestHandled = USBFS_1_FALSE; - - if ((CY_GET_REG8(USBFS_1_bmRequestType) & USBFS_1_RQST_DIR_MASK) == USBFS_1_RQST_DIR_D2H) - { - /* Control Read */ - switch (CY_GET_REG8(USBFS_1_bRequest)) - { - case USBFS_1_GET_EXTENDED_CONFIG_DESCRIPTOR: - #if defined(USBFS_1_ENABLE_MSOS_STRING) - USBFS_1_currentTD.pData = (volatile uint8 *)&USBFS_1_MSOS_CONFIGURATION_DESCR[0u]; - USBFS_1_currentTD.count = USBFS_1_MSOS_CONFIGURATION_DESCR[0u]; - requestHandled = USBFS_1_InitControlRead(); - #endif /* End USBFS_1_ENABLE_MSOS_STRING */ - break; - default: - break; - } - } - - /* `#START VENDOR_SPECIFIC_CODE` Place your vendor specific request here */ - - /* `#END` */ - - return(requestHandled); -} - - -/******************************************************************************* -* Additional user functions supporting Vendor Specific Requests -********************************************************************************/ - -/* `#START VENDOR_SPECIFIC_FUNCTIONS` Place any additional functions here */ - -/* `#END` */ - - -#endif /* USBFS_1_EXTERN_VND */ - - -/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_descr.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_descr.c index 14425977..aa9c37c0 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_descr.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_descr.c @@ -55,11 +55,11 @@ const uint8 CYCODE USBFS_DEVICE0_DESCR[18u] = { /********************************************************************* * Config Descriptor *********************************************************************/ -const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[41u] = { +const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[73u] = { /* Config Descriptor Length */ 0x09u, /* DescriptorType: CONFIG */ 0x02u, -/* wTotalLength */ 0x29u, 0x00u, -/* bNumInterfaces */ 0x01u, +/* wTotalLength */ 0x49u, 0x00u, +/* bNumInterfaces */ 0x02u, /* bConfigurationValue */ 0x01u, /* iConfiguration */ 0x00u, /* bmAttributes */ 0x80u, @@ -104,6 +104,47 @@ const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[41u] = { /* bEndpointAddress */ 0x82u, /* bmAttributes */ 0x03u, /* wMaxPacketSize */ 0x40u, 0x00u, +/* bInterval */ 0x40u, +/********************************************************************* +* Interface Descriptor +*********************************************************************/ +/* Interface Descriptor Length */ 0x09u, +/* DescriptorType: INTERFACE */ 0x04u, +/* bInterfaceNumber */ 0x01u, +/* bAlternateSetting */ 0x00u, +/* bNumEndpoints */ 0x02u, +/* bInterfaceClass */ 0x03u, +/* bInterfaceSubClass */ 0x00u, +/* bInterfaceProtocol */ 0x00u, +/* iInterface */ 0x00u, +/********************************************************************* +* HID Class Descriptor +*********************************************************************/ +/* HID Class Descriptor Length */ 0x09u, +/* DescriptorType: HID_CLASS */ 0x21u, +/* bcdHID */ 0x11u, 0x01u, +/* bCountryCode */ 0x00u, +/* bNumDescriptors */ 0x01u, +/* bDescriptorType */ 0x22u, +/* wDescriptorLength (LSB) */ USBFS_HID_RPT_1_SIZE_LSB, +/* wDescriptorLength (MSB) */ USBFS_HID_RPT_1_SIZE_MSB, +/********************************************************************* +* Endpoint Descriptor +*********************************************************************/ +/* Endpoint Descriptor Length */ 0x07u, +/* DescriptorType: ENDPOINT */ 0x05u, +/* bEndpointAddress */ 0x03u, +/* bmAttributes */ 0x03u, +/* wMaxPacketSize */ 0x40u, 0x00u, +/* bInterval */ 0x80u, +/********************************************************************* +* Endpoint Descriptor +*********************************************************************/ +/* Endpoint Descriptor Length */ 0x07u, +/* DescriptorType: ENDPOINT */ 0x05u, +/* bEndpointAddress */ 0x84u, +/* bmAttributes */ 0x03u, +/* wMaxPacketSize */ 0x40u, 0x00u, /* bInterval */ 0x40u }; @@ -221,6 +262,53 @@ const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_ {0x01u, (const void *)&USBFS_DEVICE0_CONFIGURATION0_DESCR[18]} }; #endif /* USER_DEFINE_USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_HID_RPT_STORAGE */ +#if !defined(USER_DEFINE_USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_HID_RPT_STORAGE) +/********************************************************************* +* HID Input Report Storage +*********************************************************************/ +T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_RPT_SCB; +uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF_SIZE]; + +/********************************************************************* +* HID Input Report TD Table +*********************************************************************/ +const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_RPT_TABLE[1u] = { + {USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF_SIZE, + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF[0u], + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_RPT_SCB}, +}; +/********************************************************************* +* HID Output Report Storage +*********************************************************************/ +T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_RPT_SCB; +uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF_SIZE]; + +/********************************************************************* +* HID Output Report TD Table +*********************************************************************/ +const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_RPT_TABLE[1u] = { + {USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF_SIZE, + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF[0u], + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_RPT_SCB}, +}; +/********************************************************************* +* HID Report Look Up Table This table has four entries: +* IN Report Table +* OUT Report Table +* Feature Report Table +* HID Report Descriptor +* HID Class Descriptor +*********************************************************************/ +const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_TABLE[5u] = { + {0x00u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_RPT_TABLE}, + {0x00u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_RPT_TABLE}, + {0x00u, NULL}, + {0x01u, (const void *)&USBFS_HIDREPORT_DESCRIPTOR1[0]}, + {0x01u, (const void *)&USBFS_DEVICE0_CONFIGURATION0_DESCR[50]} +}; +#endif /* USER_DEFINE_USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_HID_RPT_STORAGE */ /********************************************************************* * Interface Dispatch Table -- Points to the Class Dispatch Tables @@ -230,29 +318,39 @@ const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_TABLE[1u] = { &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_TABLE} }; /********************************************************************* +* Interface Dispatch Table -- Points to the Class Dispatch Tables +*********************************************************************/ +const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_TABLE[1u] = { + {USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_COUNT, + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_TABLE} +}; +/********************************************************************* * Endpoint Setting Table -- This table contain the endpoint setting * for each endpoint in the configuration. It * contains the necessary information to * configure the endpoint hardware for each * interface and alternate setting. *********************************************************************/ -const T_USBFS_EP_SETTINGS_BLOCK CYCODE USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE[2u] = { +const T_USBFS_EP_SETTINGS_BLOCK CYCODE USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE[4u] = { /* IFC ALT EPAddr bmAttr MaxPktSize Class ********************/ {0x00u, 0x00u, 0x01u, 0x03u, 0x0040u, 0x03u}, -{0x00u, 0x00u, 0x82u, 0x03u, 0x0040u, 0x03u} +{0x00u, 0x00u, 0x82u, 0x03u, 0x0040u, 0x03u}, +{0x01u, 0x00u, 0x03u, 0x03u, 0x0040u, 0x03u}, +{0x01u, 0x00u, 0x84u, 0x03u, 0x0040u, 0x03u} }; -const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[1u] = { -0x03u +const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[2u] = { +0x03u, 0x03u }; /********************************************************************* * Config Dispatch Table -- Points to the Config Descriptor and each of * and endpoint setup table and to each * interface table if it specifies a USB Class *********************************************************************/ -const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_TABLE[4u] = { +const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_TABLE[5u] = { {0x01u, &USBFS_DEVICE0_CONFIGURATION0_DESCR}, - {0x02u, &USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE}, + {0x04u, &USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE}, {0x01u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_TABLE}, + {0x01u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_TABLE}, {0x00u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS} }; /********************************************************************* diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h index 38119371..d344831c 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h @@ -26,11 +26,12 @@ /* Generated external references for descriptors*/ extern const uint8 CYCODE USBFS_DEVICE0_DESCR[18u]; -extern const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[41u]; +extern const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[73u]; extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_TABLE[1u]; -extern const T_USBFS_EP_SETTINGS_BLOCK CYCODE USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE[2u]; -extern const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[1u]; -extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_TABLE[4u]; +extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_TABLE[1u]; +extern const T_USBFS_EP_SETTINGS_BLOCK CYCODE USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE[4u]; +extern const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[2u]; +extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_TABLE[5u]; extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_TABLE[2u]; extern const T_USBFS_LUT CYCODE USBFS_TABLE[1u]; extern const uint8 CYCODE USBFS_SN_STRING_DESCRIPTOR[10]; @@ -41,10 +42,19 @@ extern uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF[ extern T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_RPT_SCB; extern uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF[ USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF_SIZE]; +extern T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_RPT_SCB; +extern uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_BUF_SIZE]; +extern T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_RPT_SCB; +extern uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_BUF_SIZE]; extern const uint8 CYCODE USBFS_HIDREPORT_DESCRIPTOR1[40u]; extern const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_RPT_TABLE[1u]; extern const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_RPT_TABLE[1u]; extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_TABLE[5u]; +extern const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_IN_RPT_TABLE[1u]; +extern const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_OUT_RPT_TABLE[1u]; +extern const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE1_ALTERNATE0_HID_TABLE[5u]; extern const uint8 CYCODE USBFS_MSOS_DESCRIPTOR[USBFS_MSOS_DESCRIPTOR_LENGTH]; diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cm3gcc.ld b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cm3gcc.ld index 08c8807b..e959beb7 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cm3gcc.ld +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cm3gcc.ld @@ -217,7 +217,7 @@ SECTIONS .heap (NOLOAD) : { . = _end; - . += 0x0256; + . += 0x0400; __cy_heap_limit = .; } >ram diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/config.hex b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/config.hex deleted file mode 100644 index b3a1c798..00000000 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/config.hex +++ /dev/null @@ -1,70 +0,0 @@ -:2000000003450040095200400264004044000140360101403E0201404E0301404B04014077 -:2000200057050140050601404A07014014090140370A0140380B01400F0D0140020F014032 -:2000400005150140421601404417014008190140041B01400E4001400E41014005420140A7 -:20006000054301400A440140164501400846014008470140084801400C490140014C0140F8 -:200080000650014001510140360265027E020101180419041C6120502198300531097C400B -:2000A0003303870F0304040106320724080209240A540B120D240E100F09100D146216083B -:2000C0001B031C021E0D1F18200D2320240D280D29402C0D307033403507360F37383A804D -:2000E0003F04580B59045B045C995F0182808A188B098E03910893039624982499089A128E -:200100009B049E209F06A024A209A604AA40AC40AE80AF08B0C0B10EB301B438B607BE01BE -:20012000BF04D804D904DB04DC99DF010040020803200550068008010A220D140E0110A0B2 -:200140001110134015401628170118401A021D501E4421202284230827A029012A102C02D2 -:20016000312032803621378139283A023B803C20588459025B106D4078027C807F018040B4 -:2001800081208680C0D7C2EDC4FFCA15CCBCCE2FD60FDE01E004E408140118021C012E013C -:2001A00036033AC058045B045C095F01849685108669872D89678B188C338D028ECC945516 -:2001C00096AA9AFF9D02A00FA116A2F0A348A4FFA740AD01AEFFAF02B108B2FFB370B507E5 -:2001E000BE04BF01C032C105C240C5D2C60CC7EFC837C9FFCAFFCBFFCF2CD601D804D904BF -:20020000DA04DB04DC90DD09DF01E2C0E680E840E940EE080180021009080A040D100E02C1 -:200220000F101140130A1540160417101B081E021FC0206021142220231029042B823280C3 -:20024000388039284040411449064A8150405244530158505A085B016018638268066A0180 -:200260006B206D407121722281408340870188108B028D108E10924C9538962197C2991050 -:200280009B889C079D039EAA9F10A4B2A629A720AD40AF20B210C005C2E6C48DCA0BCC0830 -:2002A000CE0ED007D208D60FD80FE206E610EC08030406040730084009410E030F411024A4 -:2002C0001141120915121618170D19411A201C401D021F0120402141242425052612270A6C -:2002E00029232A242B0C2C402F08314032383440353C3607370338203B803E103F01580456 -:20030000590B5C995F0182FF849685698669879688FF8C0F8D338EF08FCC9033910F92CC13 -:2003200093F095FF99FF9D559FAAA6FFAC55AEAAAFFFB6FFB7FFBE40BF40D608D804D90428 -:20034000DB04DD90DF01000801800308040205500610070209200A110B800F801180126002 -:200360001310178819801A101B501E0120042243254028042A022B222D4030013248331080 -:200380003510378A380439903B413F845E406402668078028008821084408A808C018D406D -:2003A00091689240939095109630974099109A019BA89C4B9D809E189F02A004A120A22103 -:2003C000A308A4A0A608A731A810A908AB80AC04AE40B681B710C0F7C21FC4AFCA1FCCFFB9 -:2003E000CE5FD610D810DE01E001E60CE801EA10EC10EE012C0136013E4058045F01015093 -:20040000036008040AA80E010F02102212081302160119011E0120042204230128212911F9 -:2004200030223244380439403A023B10426043204401474049044A0A4B02500252145302EC -:200440006280686069D46B50708072027302780289029128928295909620970198029A01A7 -:200460009B209C059D409E0A9F10A283A4A0A608A723AD80B2D0B304B404C00FC20EC48FFB -:20048000CA0FCC0FCE0FD007D20CD808DE01E601E80880108801901097809C409D089E2071 -:2004A000A401A908AD01AF80B122B211B404B740E080E808EA83EC40EEA0003302CC0855EF -:2004C0000AAA0D011069129616FF1AFF1C0F1EF026FF29023301350236FF3E403F145804B5 -:2004E00059045F0180058138820A842089258B028C038E0C8F3894109509970699049B038C -:200500009C069D409E09A103A314AC40B00FB240B338B420B507B610B740BB20BE55BF4494 -:20052000D804D908DC90DF010101020404080542086809020D080F01130816011A011C0846 -:200540001D021F842208230424102610270229202F4035083610378038803C023E203F80F0 -:200560007E02838187048A028C0890809704982099429A059B089C409F02A404A608AA044B -:20058000AB02C0BAC2AFC484CA84CC70CEB8DE10E040E420E801EE408208844087048804DD -:2005A0008C6099429A019B08AD02B601E040E220E408E680EE208308854082209E20AE08E8 -:2005C000B208B51006040E03160418041A021C041E013607544058045B0B5C095D905F01AB -:2005E000803084108542860F870488408A0C8B468C4C8D46900494019539962E9706980105 -:2006000099019A129B5E9D429E40A04CA146A444A504A608A720A808A977AB08AC0CAD46D7 -:20062000AE40B031B108B240B30FB40FB570B701B802B908BB30BE04BF41D409D80BD90B12 -:20064000DB0BDC99DD90DF0100840112054007200A840B120D140E02102011401204130267 -:20066000191A1A041B201D402004212022982398281129102A06312032483954442047080A -:20068000581059045A025B80628065086610670278027C02812082408940917C9282930256 -:2006A00096609710980399049A169B229C209D529E28A060A201A608A720C0AFC2EFC40F7C -:2006C000CA0FCC0ECE0ED60FD878DE81E004EE088220884097809C409D089E20E080EE0807 -:2006E000B340B508E840EC8033805B40620163026680670882038704CC10D480D6C0D8C0DD -:20070000E220E6305210530183018E809A129E809F40A780AE10AF01D4A0E620EA40EE1099 -:2007200094019A02A780B401B740822094019A02A780E6800C041080538054105A105C4078 -:20074000C204C408D407D6040301048109040B040E020F40878088048C41944096109704D9 -:200760009804A410A780B304B480C007C20FE002E609EE06908093409B01A201A410AA102A -:20078000B504EE020808A840AC10AF01B340B601C208EA0C2340240194019A02A220AF8038 -:2007A000C860EE1007105220560283109A02A220AF40C020D420D620E020EC40AC080101A6 -:2007C00009010B010D0111011B010002C00102001F402000C00808219001400080100080B1 -:2007E0007F0480000001600000010000C0400100C02204080007FF1800019F00FF000040A8 -:20080000003F008000280000000001106402500003DEF0BC3BFFFFFF2200F0080400000047 -:2008200000000220040B0B0B909900010000C00040011011C00100114001400100000000D1 -:2008400000000000000000000000000000FFFF000300000008003000080000000000000057 -:2008600000000000100000000000000000000000C0000000FF000000000000011000631C19 -:200880001C000C000000000000FCFC00F80000000F00000000000001F00F0F000F00000112 -:00000001FF diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cm3.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cm3.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cm3_psoc5.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cm3_psoc5.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cmFunc.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cmFunc.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cmInstr.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/core_cmInstr.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyPm.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyPm.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyPm.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyPm.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydisabledsheets.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydisabledsheets.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h index 46fd82e0..8fdbe98e 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h @@ -3,6 +3,34 @@ #include #include +/* Debug_Timer_Interrupt */ +#define Debug_Timer_Interrupt__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define Debug_Timer_Interrupt__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define Debug_Timer_Interrupt__INTC_MASK 0x01u +#define Debug_Timer_Interrupt__INTC_NUMBER 0u +#define Debug_Timer_Interrupt__INTC_PRIOR_NUM 7u +#define Debug_Timer_Interrupt__INTC_PRIOR_REG CYREG_NVIC_PRI_0 +#define Debug_Timer_Interrupt__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define Debug_Timer_Interrupt__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 + +/* Debug_Timer_TimerHW */ +#define Debug_Timer_TimerHW__CAP0 CYREG_TMR0_CAP0 +#define Debug_Timer_TimerHW__CAP1 CYREG_TMR0_CAP1 +#define Debug_Timer_TimerHW__CFG0 CYREG_TMR0_CFG0 +#define Debug_Timer_TimerHW__CFG1 CYREG_TMR0_CFG1 +#define Debug_Timer_TimerHW__CFG2 CYREG_TMR0_CFG2 +#define Debug_Timer_TimerHW__CNT_CMP0 CYREG_TMR0_CNT_CMP0 +#define Debug_Timer_TimerHW__CNT_CMP1 CYREG_TMR0_CNT_CMP1 +#define Debug_Timer_TimerHW__PER0 CYREG_TMR0_PER0 +#define Debug_Timer_TimerHW__PER1 CYREG_TMR0_PER1 +#define Debug_Timer_TimerHW__PM_ACT_CFG CYREG_PM_ACT_CFG3 +#define Debug_Timer_TimerHW__PM_ACT_MSK 0x01u +#define Debug_Timer_TimerHW__PM_STBY_CFG CYREG_PM_STBY_CFG3 +#define Debug_Timer_TimerHW__PM_STBY_MSK 0x01u +#define Debug_Timer_TimerHW__RT0 CYREG_TMR0_RT0 +#define Debug_Timer_TimerHW__RT1 CYREG_TMR0_RT1 +#define Debug_Timer_TimerHW__SR0 CYREG_TMR0_SR0 + /* USBFS_bus_reset */ #define USBFS_bus_reset__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 #define USBFS_bus_reset__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 @@ -16,28 +44,64 @@ /* SCSI_CTL_PHASE */ #define SCSI_CTL_PHASE_Sync_ctrl_reg__0__MASK 0x01u #define SCSI_CTL_PHASE_Sync_ctrl_reg__0__POS 0 -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB02_03_ACTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB02_03_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB02_03_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB02_03_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG CYREG_B0_UDB02_03_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG CYREG_B0_UDB02_03_MSK -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG CYREG_B0_UDB02_03_MSK -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG CYREG_B0_UDB02_03_MSK -#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB02_03_MSK +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB05_06_ACTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB05_06_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB05_06_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB05_06_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG CYREG_B0_UDB05_06_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG CYREG_B0_UDB05_06_MSK +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG CYREG_B0_UDB05_06_MSK +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG CYREG_B0_UDB05_06_MSK +#define SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB05_06_MSK #define SCSI_CTL_PHASE_Sync_ctrl_reg__1__MASK 0x02u #define SCSI_CTL_PHASE_Sync_ctrl_reg__1__POS 1 #define SCSI_CTL_PHASE_Sync_ctrl_reg__2__MASK 0x04u #define SCSI_CTL_PHASE_Sync_ctrl_reg__2__POS 2 -#define SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG CYREG_B0_UDB02_ACTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG CYREG_B0_UDB02_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG CYREG_B0_UDB02_ST_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG CYREG_B0_UDB02_CTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG CYREG_B0_UDB02_ST_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG CYREG_B0_UDB05_ACTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG CYREG_B0_UDB05_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG CYREG_B0_UDB05_ST_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG CYREG_B0_UDB05_CTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG CYREG_B0_UDB05_ST_CTL #define SCSI_CTL_PHASE_Sync_ctrl_reg__MASK 0x07u -#define SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB02_MSK_ACTL -#define SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG CYREG_B0_UDB02_MSK -#define SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG CYREG_B0_UDB02_MSK_ACTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB05_MSK_ACTL +#define SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG CYREG_B0_UDB05_MSK +#define SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG CYREG_B0_UDB05_MSK_ACTL + +/* SCSI_Out_Bits */ +#define SCSI_Out_Bits_Sync_ctrl_reg__0__MASK 0x01u +#define SCSI_Out_Bits_Sync_ctrl_reg__0__POS 0 +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB00_01_ACTL +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB00_01_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB00_01_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB00_01_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG CYREG_B0_UDB00_01_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_MASK_REG CYREG_B0_UDB00_01_MSK +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG CYREG_B0_UDB00_01_MSK +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG CYREG_B0_UDB00_01_MSK +#define SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB00_01_MSK +#define SCSI_Out_Bits_Sync_ctrl_reg__1__MASK 0x02u +#define SCSI_Out_Bits_Sync_ctrl_reg__1__POS 1 +#define SCSI_Out_Bits_Sync_ctrl_reg__2__MASK 0x04u +#define SCSI_Out_Bits_Sync_ctrl_reg__2__POS 2 +#define SCSI_Out_Bits_Sync_ctrl_reg__3__MASK 0x08u +#define SCSI_Out_Bits_Sync_ctrl_reg__3__POS 3 +#define SCSI_Out_Bits_Sync_ctrl_reg__4__MASK 0x10u +#define SCSI_Out_Bits_Sync_ctrl_reg__4__POS 4 +#define SCSI_Out_Bits_Sync_ctrl_reg__5__MASK 0x20u +#define SCSI_Out_Bits_Sync_ctrl_reg__5__POS 5 +#define SCSI_Out_Bits_Sync_ctrl_reg__6__MASK 0x40u +#define SCSI_Out_Bits_Sync_ctrl_reg__6__POS 6 +#define SCSI_Out_Bits_Sync_ctrl_reg__7__MASK 0x80u +#define SCSI_Out_Bits_Sync_ctrl_reg__7__POS 7 +#define SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_AUX_CTL_REG CYREG_B0_UDB00_ACTL +#define SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_REG CYREG_B0_UDB00_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_ST_REG CYREG_B0_UDB00_ST_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__COUNT_REG CYREG_B0_UDB00_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__COUNT_ST_REG CYREG_B0_UDB00_ST_CTL +#define SCSI_Out_Bits_Sync_ctrl_reg__MASK 0xFFu +#define SCSI_Out_Bits_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB00_MSK_ACTL +#define SCSI_Out_Bits_Sync_ctrl_reg__PERIOD_REG CYREG_B0_UDB00_MSK +#define SCSI_Out_Bits_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG CYREG_B0_UDB00_MSK_ACTL /* USBFS_arb_int */ #define USBFS_arb_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 @@ -59,6 +123,28 @@ #define USBFS_sof_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 #define USBFS_sof_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 +/* SCSI_Out_Ctl */ +#define SCSI_Out_Ctl_Sync_ctrl_reg__0__MASK 0x01u +#define SCSI_Out_Ctl_Sync_ctrl_reg__0__POS 0 +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB03_04_ACTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB03_04_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB03_04_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB03_04_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG CYREG_B0_UDB03_04_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG CYREG_B0_UDB03_04_MSK +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG CYREG_B0_UDB03_04_MSK +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG CYREG_B0_UDB03_04_MSK +#define SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB03_04_MSK +#define SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG CYREG_B0_UDB03_ACTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_REG CYREG_B0_UDB03_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_ST_REG CYREG_B0_UDB03_ST_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_REG CYREG_B0_UDB03_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_ST_REG CYREG_B0_UDB03_ST_CTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__MASK 0x01u +#define SCSI_Out_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL +#define SCSI_Out_Ctl_Sync_ctrl_reg__PERIOD_REG CYREG_B0_UDB03_MSK +#define SCSI_Out_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL + /* SCSI_Out_DBx */ #define SCSI_Out_DBx__0__AG CYREG_PRT6_AG #define SCSI_Out_DBx__0__AMUX CYREG_PRT6_AMUX @@ -504,34 +590,34 @@ #define SCSI_RST_ISR__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 /* SDCard_BSPIM */ -#define SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB07_08_ACTL -#define SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG CYREG_B0_UDB07_08_ST -#define SDCard_BSPIM_BitCounter_ST__MASK_REG CYREG_B0_UDB07_MSK -#define SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG CYREG_B0_UDB07_MSK_ACTL -#define SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG CYREG_B0_UDB07_MSK_ACTL -#define SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG CYREG_B0_UDB07_ACTL -#define SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG CYREG_B0_UDB07_ST_CTL -#define SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG CYREG_B0_UDB07_ST_CTL -#define SDCard_BSPIM_BitCounter_ST__STATUS_REG CYREG_B0_UDB07_ST -#define SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB07_08_ACTL -#define SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB07_08_CTL -#define SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB07_08_CTL -#define SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB07_08_CTL -#define SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG CYREG_B0_UDB07_08_CTL -#define SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG CYREG_B0_UDB07_08_MSK -#define SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG CYREG_B0_UDB07_08_MSK -#define SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG CYREG_B0_UDB07_08_MSK -#define SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB07_08_MSK -#define SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG CYREG_B0_UDB07_ACTL -#define SDCard_BSPIM_BitCounter__CONTROL_REG CYREG_B0_UDB07_CTL -#define SDCard_BSPIM_BitCounter__CONTROL_ST_REG CYREG_B0_UDB07_ST_CTL -#define SDCard_BSPIM_BitCounter__COUNT_REG CYREG_B0_UDB07_CTL -#define SDCard_BSPIM_BitCounter__COUNT_ST_REG CYREG_B0_UDB07_ST_CTL -#define SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB07_MSK_ACTL -#define SDCard_BSPIM_BitCounter__PERIOD_REG CYREG_B0_UDB07_MSK -#define SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG CYREG_B0_UDB07_MSK_ACTL -#define SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB04_05_ACTL -#define SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG CYREG_B0_UDB04_05_ST +#define SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG CYREG_B1_UDB06_07_ACTL +#define SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG CYREG_B1_UDB06_07_ST +#define SDCard_BSPIM_BitCounter_ST__MASK_REG CYREG_B1_UDB06_MSK +#define SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG CYREG_B1_UDB06_MSK_ACTL +#define SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG CYREG_B1_UDB06_MSK_ACTL +#define SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG CYREG_B1_UDB06_ACTL +#define SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG CYREG_B1_UDB06_ST_CTL +#define SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG CYREG_B1_UDB06_ST_CTL +#define SDCard_BSPIM_BitCounter_ST__STATUS_REG CYREG_B1_UDB06_ST +#define SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG CYREG_B1_UDB06_07_ACTL +#define SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG CYREG_B1_UDB06_07_CTL +#define SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG CYREG_B1_UDB06_07_CTL +#define SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG CYREG_B1_UDB06_07_CTL +#define SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG CYREG_B1_UDB06_07_CTL +#define SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG CYREG_B1_UDB06_07_MSK +#define SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG CYREG_B1_UDB06_07_MSK +#define SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG CYREG_B1_UDB06_07_MSK +#define SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG CYREG_B1_UDB06_07_MSK +#define SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG CYREG_B1_UDB06_ACTL +#define SDCard_BSPIM_BitCounter__CONTROL_REG CYREG_B1_UDB06_CTL +#define SDCard_BSPIM_BitCounter__CONTROL_ST_REG CYREG_B1_UDB06_ST_CTL +#define SDCard_BSPIM_BitCounter__COUNT_REG CYREG_B1_UDB06_CTL +#define SDCard_BSPIM_BitCounter__COUNT_ST_REG CYREG_B1_UDB06_ST_CTL +#define SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG CYREG_B1_UDB06_MSK_ACTL +#define SDCard_BSPIM_BitCounter__PERIOD_REG CYREG_B1_UDB06_MSK +#define SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG CYREG_B1_UDB06_MSK_ACTL +#define SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB06_07_ACTL +#define SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG CYREG_B0_UDB06_07_ST #define SDCard_BSPIM_RxStsReg__4__MASK 0x10u #define SDCard_BSPIM_RxStsReg__4__POS 4 #define SDCard_BSPIM_RxStsReg__5__MASK 0x20u @@ -539,13 +625,13 @@ #define SDCard_BSPIM_RxStsReg__6__MASK 0x40u #define SDCard_BSPIM_RxStsReg__6__POS 6 #define SDCard_BSPIM_RxStsReg__MASK 0x70u -#define SDCard_BSPIM_RxStsReg__MASK_REG CYREG_B0_UDB04_MSK -#define SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG CYREG_B0_UDB04_ACTL -#define SDCard_BSPIM_RxStsReg__STATUS_REG CYREG_B0_UDB04_ST +#define SDCard_BSPIM_RxStsReg__MASK_REG CYREG_B0_UDB06_MSK +#define SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG CYREG_B0_UDB06_ACTL +#define SDCard_BSPIM_RxStsReg__STATUS_REG CYREG_B0_UDB06_ST #define SDCard_BSPIM_TxStsReg__0__MASK 0x01u #define SDCard_BSPIM_TxStsReg__0__POS 0 -#define SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG CYREG_B1_UDB07_08_ACTL -#define SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG CYREG_B1_UDB07_08_ST +#define SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB04_05_ACTL +#define SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG CYREG_B0_UDB04_05_ST #define SDCard_BSPIM_TxStsReg__1__MASK 0x02u #define SDCard_BSPIM_TxStsReg__1__POS 1 #define SDCard_BSPIM_TxStsReg__2__MASK 0x04u @@ -555,28 +641,26 @@ #define SDCard_BSPIM_TxStsReg__4__MASK 0x10u #define SDCard_BSPIM_TxStsReg__4__POS 4 #define SDCard_BSPIM_TxStsReg__MASK 0x1Fu -#define SDCard_BSPIM_TxStsReg__MASK_REG CYREG_B1_UDB07_MSK -#define SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG CYREG_B1_UDB07_ACTL -#define SDCard_BSPIM_TxStsReg__STATUS_REG CYREG_B1_UDB07_ST -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG CYREG_B0_UDB07_08_A0 -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG CYREG_B0_UDB07_08_A1 -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG CYREG_B0_UDB07_08_D0 -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG CYREG_B0_UDB07_08_D1 -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG CYREG_B0_UDB07_08_ACTL -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG CYREG_B0_UDB07_08_F0 -#define SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG CYREG_B0_UDB07_08_F1 -#define SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG CYREG_B0_UDB07_A0_A1 -#define SDCard_BSPIM_sR8_Dp_u0__A0_REG CYREG_B0_UDB07_A0 -#define SDCard_BSPIM_sR8_Dp_u0__A1_REG CYREG_B0_UDB07_A1 -#define SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG CYREG_B0_UDB07_D0_D1 -#define SDCard_BSPIM_sR8_Dp_u0__D0_REG CYREG_B0_UDB07_D0 -#define SDCard_BSPIM_sR8_Dp_u0__D1_REG CYREG_B0_UDB07_D1 -#define SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG CYREG_B0_UDB07_ACTL -#define SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG CYREG_B0_UDB07_F0_F1 -#define SDCard_BSPIM_sR8_Dp_u0__F0_REG CYREG_B0_UDB07_F0 -#define SDCard_BSPIM_sR8_Dp_u0__F1_REG CYREG_B0_UDB07_F1 -#define SDCard_BSPIM_sR8_Dp_u0__MSK_DP_AUX_CTL_REG CYREG_B0_UDB07_MSK_ACTL -#define SDCard_BSPIM_sR8_Dp_u0__PER_DP_AUX_CTL_REG CYREG_B0_UDB07_MSK_ACTL +#define SDCard_BSPIM_TxStsReg__MASK_REG CYREG_B0_UDB04_MSK +#define SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG CYREG_B0_UDB04_ACTL +#define SDCard_BSPIM_TxStsReg__STATUS_REG CYREG_B0_UDB04_ST +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG CYREG_B0_UDB06_07_A0 +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG CYREG_B0_UDB06_07_A1 +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG CYREG_B0_UDB06_07_D0 +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG CYREG_B0_UDB06_07_D1 +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG CYREG_B0_UDB06_07_ACTL +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG CYREG_B0_UDB06_07_F0 +#define SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG CYREG_B0_UDB06_07_F1 +#define SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG CYREG_B0_UDB06_A0_A1 +#define SDCard_BSPIM_sR8_Dp_u0__A0_REG CYREG_B0_UDB06_A0 +#define SDCard_BSPIM_sR8_Dp_u0__A1_REG CYREG_B0_UDB06_A1 +#define SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG CYREG_B0_UDB06_D0_D1 +#define SDCard_BSPIM_sR8_Dp_u0__D0_REG CYREG_B0_UDB06_D0 +#define SDCard_BSPIM_sR8_Dp_u0__D1_REG CYREG_B0_UDB06_D1 +#define SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG CYREG_B0_UDB06_ACTL +#define SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG CYREG_B0_UDB06_F0_F1 +#define SDCard_BSPIM_sR8_Dp_u0__F0_REG CYREG_B0_UDB06_F0 +#define SDCard_BSPIM_sR8_Dp_u0__F1_REG CYREG_B0_UDB06_F1 /* USBFS_dp_int */ #define USBFS_dp_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 @@ -1032,21 +1116,32 @@ #define SD_Data_Clk__PM_STBY_MSK 0x01u /* SD_Init_Clk */ -#define SD_Init_Clk__CFG0 CYREG_CLKDIST_DCFG2_CFG0 -#define SD_Init_Clk__CFG1 CYREG_CLKDIST_DCFG2_CFG1 -#define SD_Init_Clk__CFG2 CYREG_CLKDIST_DCFG2_CFG2 +#define SD_Init_Clk__CFG0 CYREG_CLKDIST_DCFG3_CFG0 +#define SD_Init_Clk__CFG1 CYREG_CLKDIST_DCFG3_CFG1 +#define SD_Init_Clk__CFG2 CYREG_CLKDIST_DCFG3_CFG2 #define SD_Init_Clk__CFG2_SRC_SEL_MASK 0x07u -#define SD_Init_Clk__INDEX 0x02u +#define SD_Init_Clk__INDEX 0x03u #define SD_Init_Clk__PM_ACT_CFG CYREG_PM_ACT_CFG2 -#define SD_Init_Clk__PM_ACT_MSK 0x04u +#define SD_Init_Clk__PM_ACT_MSK 0x08u #define SD_Init_Clk__PM_STBY_CFG CYREG_PM_STBY_CFG2 -#define SD_Init_Clk__PM_STBY_MSK 0x04u +#define SD_Init_Clk__PM_STBY_MSK 0x08u + +/* timer_clock */ +#define timer_clock__CFG0 CYREG_CLKDIST_DCFG2_CFG0 +#define timer_clock__CFG1 CYREG_CLKDIST_DCFG2_CFG1 +#define timer_clock__CFG2 CYREG_CLKDIST_DCFG2_CFG2 +#define timer_clock__CFG2_SRC_SEL_MASK 0x07u +#define timer_clock__INDEX 0x02u +#define timer_clock__PM_ACT_CFG CYREG_PM_ACT_CFG2 +#define timer_clock__PM_ACT_MSK 0x04u +#define timer_clock__PM_STBY_CFG CYREG_PM_STBY_CFG2 +#define timer_clock__PM_STBY_MSK 0x04u /* scsiTarget */ #define scsiTarget_StatusReg__0__MASK 0x01u #define scsiTarget_StatusReg__0__POS 0 -#define scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB12_13_ACTL -#define scsiTarget_StatusReg__16BIT_STATUS_REG CYREG_B0_UDB12_13_ST +#define scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB13_14_ACTL +#define scsiTarget_StatusReg__16BIT_STATUS_REG CYREG_B0_UDB13_14_ST #define scsiTarget_StatusReg__1__MASK 0x02u #define scsiTarget_StatusReg__1__POS 1 #define scsiTarget_StatusReg__2__MASK 0x04u @@ -1054,76 +1149,76 @@ #define scsiTarget_StatusReg__3__MASK 0x08u #define scsiTarget_StatusReg__3__POS 3 #define scsiTarget_StatusReg__MASK 0x0Fu -#define scsiTarget_StatusReg__MASK_REG CYREG_B0_UDB12_MSK -#define scsiTarget_StatusReg__STATUS_AUX_CTL_REG CYREG_B0_UDB12_ACTL -#define scsiTarget_StatusReg__STATUS_REG CYREG_B0_UDB12_ST -#define scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB03_04_ACTL -#define scsiTarget_datapath_PI__16BIT_STATUS_REG CYREG_B0_UDB03_04_ST -#define scsiTarget_datapath_PI__MASK_REG CYREG_B0_UDB03_MSK -#define scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL -#define scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL -#define scsiTarget_datapath_PI__STATUS_AUX_CTL_REG CYREG_B0_UDB03_ACTL -#define scsiTarget_datapath_PI__STATUS_CNT_REG CYREG_B0_UDB03_ST_CTL -#define scsiTarget_datapath_PI__STATUS_CONTROL_REG CYREG_B0_UDB03_ST_CTL -#define scsiTarget_datapath_PI__STATUS_REG CYREG_B0_UDB03_ST -#define scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB03_04_ACTL -#define scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB03_04_CTL -#define scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB03_04_CTL -#define scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB03_04_CTL -#define scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG CYREG_B0_UDB03_04_CTL -#define scsiTarget_datapath_PO__16BIT_MASK_MASK_REG CYREG_B0_UDB03_04_MSK -#define scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG CYREG_B0_UDB03_04_MSK -#define scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG CYREG_B0_UDB03_04_MSK -#define scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB03_04_MSK -#define scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG CYREG_B0_UDB03_ACTL -#define scsiTarget_datapath_PO__CONTROL_REG CYREG_B0_UDB03_CTL -#define scsiTarget_datapath_PO__CONTROL_ST_REG CYREG_B0_UDB03_ST_CTL -#define scsiTarget_datapath_PO__COUNT_REG CYREG_B0_UDB03_CTL -#define scsiTarget_datapath_PO__COUNT_ST_REG CYREG_B0_UDB03_ST_CTL -#define scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL -#define scsiTarget_datapath_PO__PERIOD_REG CYREG_B0_UDB03_MSK -#define scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL -#define scsiTarget_datapath__16BIT_A0_REG CYREG_B0_UDB03_04_A0 -#define scsiTarget_datapath__16BIT_A1_REG CYREG_B0_UDB03_04_A1 -#define scsiTarget_datapath__16BIT_D0_REG CYREG_B0_UDB03_04_D0 -#define scsiTarget_datapath__16BIT_D1_REG CYREG_B0_UDB03_04_D1 -#define scsiTarget_datapath__16BIT_DP_AUX_CTL_REG CYREG_B0_UDB03_04_ACTL -#define scsiTarget_datapath__16BIT_F0_REG CYREG_B0_UDB03_04_F0 -#define scsiTarget_datapath__16BIT_F1_REG CYREG_B0_UDB03_04_F1 -#define scsiTarget_datapath__A0_A1_REG CYREG_B0_UDB03_A0_A1 -#define scsiTarget_datapath__A0_REG CYREG_B0_UDB03_A0 -#define scsiTarget_datapath__A1_REG CYREG_B0_UDB03_A1 -#define scsiTarget_datapath__D0_D1_REG CYREG_B0_UDB03_D0_D1 -#define scsiTarget_datapath__D0_REG CYREG_B0_UDB03_D0 -#define scsiTarget_datapath__D1_REG CYREG_B0_UDB03_D1 -#define scsiTarget_datapath__DP_AUX_CTL_REG CYREG_B0_UDB03_ACTL -#define scsiTarget_datapath__F0_F1_REG CYREG_B0_UDB03_F0_F1 -#define scsiTarget_datapath__F0_REG CYREG_B0_UDB03_F0 -#define scsiTarget_datapath__F1_REG CYREG_B0_UDB03_F1 -#define scsiTarget_datapath__MSK_DP_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL -#define scsiTarget_datapath__PER_DP_AUX_CTL_REG CYREG_B0_UDB03_MSK_ACTL +#define scsiTarget_StatusReg__MASK_REG CYREG_B0_UDB13_MSK +#define scsiTarget_StatusReg__STATUS_AUX_CTL_REG CYREG_B0_UDB13_ACTL +#define scsiTarget_StatusReg__STATUS_REG CYREG_B0_UDB13_ST +#define scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG CYREG_B0_UDB12_13_ACTL +#define scsiTarget_datapath_PI__16BIT_STATUS_REG CYREG_B0_UDB12_13_ST +#define scsiTarget_datapath_PI__MASK_REG CYREG_B0_UDB12_MSK +#define scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG CYREG_B0_UDB12_MSK_ACTL +#define scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG CYREG_B0_UDB12_MSK_ACTL +#define scsiTarget_datapath_PI__STATUS_AUX_CTL_REG CYREG_B0_UDB12_ACTL +#define scsiTarget_datapath_PI__STATUS_CNT_REG CYREG_B0_UDB12_ST_CTL +#define scsiTarget_datapath_PI__STATUS_CONTROL_REG CYREG_B0_UDB12_ST_CTL +#define scsiTarget_datapath_PI__STATUS_REG CYREG_B0_UDB12_ST +#define scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB12_13_ACTL +#define scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB12_13_CTL +#define scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB12_13_CTL +#define scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB12_13_CTL +#define scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG CYREG_B0_UDB12_13_CTL +#define scsiTarget_datapath_PO__16BIT_MASK_MASK_REG CYREG_B0_UDB12_13_MSK +#define scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG CYREG_B0_UDB12_13_MSK +#define scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG CYREG_B0_UDB12_13_MSK +#define scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB12_13_MSK +#define scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG CYREG_B0_UDB12_ACTL +#define scsiTarget_datapath_PO__CONTROL_REG CYREG_B0_UDB12_CTL +#define scsiTarget_datapath_PO__CONTROL_ST_REG CYREG_B0_UDB12_ST_CTL +#define scsiTarget_datapath_PO__COUNT_REG CYREG_B0_UDB12_CTL +#define scsiTarget_datapath_PO__COUNT_ST_REG CYREG_B0_UDB12_ST_CTL +#define scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB12_MSK_ACTL +#define scsiTarget_datapath_PO__PERIOD_REG CYREG_B0_UDB12_MSK +#define scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG CYREG_B0_UDB12_MSK_ACTL +#define scsiTarget_datapath__16BIT_A0_REG CYREG_B0_UDB12_13_A0 +#define scsiTarget_datapath__16BIT_A1_REG CYREG_B0_UDB12_13_A1 +#define scsiTarget_datapath__16BIT_D0_REG CYREG_B0_UDB12_13_D0 +#define scsiTarget_datapath__16BIT_D1_REG CYREG_B0_UDB12_13_D1 +#define scsiTarget_datapath__16BIT_DP_AUX_CTL_REG CYREG_B0_UDB12_13_ACTL +#define scsiTarget_datapath__16BIT_F0_REG CYREG_B0_UDB12_13_F0 +#define scsiTarget_datapath__16BIT_F1_REG CYREG_B0_UDB12_13_F1 +#define scsiTarget_datapath__A0_A1_REG CYREG_B0_UDB12_A0_A1 +#define scsiTarget_datapath__A0_REG CYREG_B0_UDB12_A0 +#define scsiTarget_datapath__A1_REG CYREG_B0_UDB12_A1 +#define scsiTarget_datapath__D0_D1_REG CYREG_B0_UDB12_D0_D1 +#define scsiTarget_datapath__D0_REG CYREG_B0_UDB12_D0 +#define scsiTarget_datapath__D1_REG CYREG_B0_UDB12_D1 +#define scsiTarget_datapath__DP_AUX_CTL_REG CYREG_B0_UDB12_ACTL +#define scsiTarget_datapath__F0_F1_REG CYREG_B0_UDB12_F0_F1 +#define scsiTarget_datapath__F0_REG CYREG_B0_UDB12_F0 +#define scsiTarget_datapath__F1_REG CYREG_B0_UDB12_F1 +#define scsiTarget_datapath__MSK_DP_AUX_CTL_REG CYREG_B0_UDB12_MSK_ACTL +#define scsiTarget_datapath__PER_DP_AUX_CTL_REG CYREG_B0_UDB12_MSK_ACTL /* SD_Clk_Ctl */ #define SD_Clk_Ctl_Sync_ctrl_reg__0__MASK 0x01u #define SD_Clk_Ctl_Sync_ctrl_reg__0__POS 0 -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB01_02_ACTL -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB01_02_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB01_02_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB01_02_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG CYREG_B0_UDB01_02_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG CYREG_B0_UDB01_02_MSK -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG CYREG_B0_UDB01_02_MSK -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG CYREG_B0_UDB01_02_MSK -#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB01_02_MSK -#define SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG CYREG_B0_UDB01_ACTL -#define SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG CYREG_B0_UDB01_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG CYREG_B0_UDB01_ST_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG CYREG_B0_UDB01_CTL -#define SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG CYREG_B0_UDB01_ST_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG CYREG_B0_UDB02_03_ACTL +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG CYREG_B0_UDB02_03_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG CYREG_B0_UDB02_03_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG CYREG_B0_UDB02_03_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG CYREG_B0_UDB02_03_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG CYREG_B0_UDB02_03_MSK +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG CYREG_B0_UDB02_03_MSK +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG CYREG_B0_UDB02_03_MSK +#define SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG CYREG_B0_UDB02_03_MSK +#define SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG CYREG_B0_UDB02_ACTL +#define SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG CYREG_B0_UDB02_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG CYREG_B0_UDB02_ST_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG CYREG_B0_UDB02_CTL +#define SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG CYREG_B0_UDB02_ST_CTL #define SD_Clk_Ctl_Sync_ctrl_reg__MASK 0x01u -#define SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB01_MSK_ACTL -#define SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG CYREG_B0_UDB01_MSK -#define SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG CYREG_B0_UDB01_MSK_ACTL +#define SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG CYREG_B0_UDB02_MSK_ACTL +#define SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG CYREG_B0_UDB02_MSK +#define SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG CYREG_B0_UDB02_MSK_ACTL /* USBFS_ep_0 */ #define USBFS_ep_0__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 @@ -1138,23 +1233,43 @@ /* USBFS_ep_1 */ #define USBFS_ep_1__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 #define USBFS_ep_1__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_ep_1__INTC_MASK 0x01u -#define USBFS_ep_1__INTC_NUMBER 0u +#define USBFS_ep_1__INTC_MASK 0x02u +#define USBFS_ep_1__INTC_NUMBER 1u #define USBFS_ep_1__INTC_PRIOR_NUM 7u -#define USBFS_ep_1__INTC_PRIOR_REG CYREG_NVIC_PRI_0 +#define USBFS_ep_1__INTC_PRIOR_REG CYREG_NVIC_PRI_1 #define USBFS_ep_1__INTC_SET_EN_REG CYREG_NVIC_SETENA0 #define USBFS_ep_1__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 /* USBFS_ep_2 */ #define USBFS_ep_2__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 #define USBFS_ep_2__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_ep_2__INTC_MASK 0x02u -#define USBFS_ep_2__INTC_NUMBER 1u +#define USBFS_ep_2__INTC_MASK 0x04u +#define USBFS_ep_2__INTC_NUMBER 2u #define USBFS_ep_2__INTC_PRIOR_NUM 7u -#define USBFS_ep_2__INTC_PRIOR_REG CYREG_NVIC_PRI_1 +#define USBFS_ep_2__INTC_PRIOR_REG CYREG_NVIC_PRI_2 #define USBFS_ep_2__INTC_SET_EN_REG CYREG_NVIC_SETENA0 #define USBFS_ep_2__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 +/* USBFS_ep_3 */ +#define USBFS_ep_3__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define USBFS_ep_3__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define USBFS_ep_3__INTC_MASK 0x08u +#define USBFS_ep_3__INTC_NUMBER 3u +#define USBFS_ep_3__INTC_PRIOR_NUM 7u +#define USBFS_ep_3__INTC_PRIOR_REG CYREG_NVIC_PRI_3 +#define USBFS_ep_3__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_ep_3__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 + +/* USBFS_ep_4 */ +#define USBFS_ep_4__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define USBFS_ep_4__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define USBFS_ep_4__INTC_MASK 0x10u +#define USBFS_ep_4__INTC_NUMBER 4u +#define USBFS_ep_4__INTC_PRIOR_NUM 7u +#define USBFS_ep_4__INTC_PRIOR_REG CYREG_NVIC_PRI_4 +#define USBFS_ep_4__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_ep_4__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 + /* USBFS_USB */ #define USBFS_USB__ARB_CFG CYREG_USB_ARB_CFG #define USBFS_USB__ARB_EP1_CFG CYREG_USB_ARB_EP1_CFG @@ -2735,9 +2850,9 @@ #define CYDEV_DEBUG_ENABLE_REGISTER CYREG_MLOGIC_DEBUG #define CYDEV_DMA_CHANNELS_AVAILABLE 24u #define CYDEV_ECC_ENABLE 0 -#define CYDEV_HEAP_SIZE 0x0256 +#define CYDEV_HEAP_SIZE 0x0400 #define CYDEV_INSTRUCT_CACHE_ENABLED 1 -#define CYDEV_INTR_RISING 0x00000000u +#define CYDEV_INTR_RISING 0x00000001u #define CYDEV_PROJ_TYPE 2 #define CYDEV_PROJ_TYPE_BOOTLOADER 1 #define CYDEV_PROJ_TYPE_LOADABLE 2 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c index 4e6f1dae..46963dc1 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c @@ -121,7 +121,7 @@ static void CyClockStartupError(uint8 errorCode) } #endif -#define CY_CFG_BASE_ADDR_COUNT 33u +#define CY_CFG_BASE_ADDR_COUNT 35u CYPACKED typedef struct { uint8 offset; @@ -191,8 +191,10 @@ static void ClockSetup(void) CY_SET_XTND_REG8((void CYFAR *)(CYREG_CLKDIST_DCFG0_CFG0 + 0x2u), 0x10u); CY_SET_XTND_REG16((void CYFAR *)(CYREG_CLKDIST_DCFG1_CFG0), 0x0001u); CY_SET_XTND_REG8((void CYFAR *)(CYREG_CLKDIST_DCFG1_CFG0 + 0x2u), 0x18u); - CY_SET_XTND_REG16((void CYFAR *)(CYREG_CLKDIST_DCFG2_CFG0), 0x001Du); + CY_SET_XTND_REG16((void CYFAR *)(CYREG_CLKDIST_DCFG2_CFG0), 0x0017u); CY_SET_XTND_REG8((void CYFAR *)(CYREG_CLKDIST_DCFG2_CFG0 + 0x2u), 0x19u); + CY_SET_XTND_REG16((void CYFAR *)(CYREG_CLKDIST_DCFG3_CFG0), 0x001Du); + CY_SET_XTND_REG8((void CYFAR *)(CYREG_CLKDIST_DCFG3_CFG0 + 0x2u), 0x19u); /* Configure ILO based on settings from Clock DWR */ CY_SET_XTND_REG8((void CYFAR *)(CYREG_SLOWCLK_ILO_CR0), 0x06u); @@ -228,7 +230,7 @@ static void ClockSetup(void) CY_SET_XTND_REG8((void CYFAR *)(CYREG_CLKDIST_UCFG), 0x00u); CY_SET_XTND_REG8((void CYFAR *)(CYREG_CLKDIST_LD), 0x02u); - CY_SET_XTND_REG8((void CYFAR *)(CYREG_PM_ACT_CFG2), ((CY_GET_XTND_REG8((void CYFAR *)CYREG_PM_ACT_CFG2) | 0x06u))); + CY_SET_XTND_REG8((void CYFAR *)(CYREG_PM_ACT_CFG2), ((CY_GET_XTND_REG8((void CYFAR *)CYREG_PM_ACT_CFG2) | 0x0Eu))); } @@ -365,939 +367,1093 @@ void cyfitter_cfg(void) { static const uint32 CYCODE cy_cfg_addr_table[] = { 0x40004502u, /* Base address: 0x40004500 Count: 2 */ - 0x4000520Au, /* Base address: 0x40005200 Count: 10 */ - 0x40006402u, /* Base address: 0x40006400 Count: 2 */ - 0x40010048u, /* Base address: 0x40010000 Count: 72 */ - 0x4001012Cu, /* Base address: 0x40010100 Count: 44 */ - 0x40010235u, /* Base address: 0x40010200 Count: 53 */ - 0x4001034Fu, /* Base address: 0x40010300 Count: 79 */ - 0x40010448u, /* Base address: 0x40010400 Count: 72 */ + 0x40004F02u, /* Base address: 0x40004F00 Count: 2 */ + 0x40005209u, /* Base address: 0x40005200 Count: 9 */ + 0x40006401u, /* Base address: 0x40006400 Count: 1 */ + 0x40006501u, /* Base address: 0x40006500 Count: 1 */ + 0x4001004Au, /* Base address: 0x40010000 Count: 74 */ + 0x40010134u, /* Base address: 0x40010100 Count: 52 */ + 0x40010252u, /* Base address: 0x40010200 Count: 82 */ + 0x40010355u, /* Base address: 0x40010300 Count: 85 */ + 0x40010449u, /* Base address: 0x40010400 Count: 73 */ 0x40010555u, /* Base address: 0x40010500 Count: 85 */ - 0x40010606u, /* Base address: 0x40010600 Count: 6 */ + 0x4001060Eu, /* Base address: 0x40010600 Count: 14 */ 0x40010747u, /* Base address: 0x40010700 Count: 71 */ - 0x40010901u, /* Base address: 0x40010900 Count: 1 */ + 0x40010903u, /* Base address: 0x40010900 Count: 3 */ 0x40010B0Cu, /* Base address: 0x40010B00 Count: 12 */ - 0x40010C3Bu, /* Base address: 0x40010C00 Count: 59 */ - 0x40010D39u, /* Base address: 0x40010D00 Count: 57 */ + 0x40010C45u, /* Base address: 0x40010C00 Count: 69 */ + 0x40010D4Du, /* Base address: 0x40010D00 Count: 77 */ 0x40010F04u, /* Base address: 0x40010F00 Count: 4 */ - 0x40011504u, /* Base address: 0x40011500 Count: 4 */ - 0x4001164Du, /* Base address: 0x40011600 Count: 77 */ - 0x4001173Fu, /* Base address: 0x40011700 Count: 63 */ - 0x40011901u, /* Base address: 0x40011900 Count: 1 */ - 0x4001400Cu, /* Base address: 0x40014000 Count: 12 */ - 0x4001410Fu, /* Base address: 0x40014100 Count: 15 */ - 0x4001420Bu, /* Base address: 0x40014200 Count: 11 */ - 0x40014306u, /* Base address: 0x40014300 Count: 6 */ - 0x4001440Eu, /* Base address: 0x40014400 Count: 14 */ - 0x40014513u, /* Base address: 0x40014500 Count: 19 */ - 0x4001460Au, /* Base address: 0x40014600 Count: 10 */ - 0x40014703u, /* Base address: 0x40014700 Count: 3 */ - 0x4001480Du, /* Base address: 0x40014800 Count: 13 */ - 0x40014908u, /* Base address: 0x40014900 Count: 8 */ - 0x40014C02u, /* Base address: 0x40014C00 Count: 2 */ - 0x4001500Au, /* Base address: 0x40015000 Count: 10 */ - 0x40015101u, /* Base address: 0x40015100 Count: 1 */ + 0x40011501u, /* Base address: 0x40011500 Count: 1 */ + 0x40011657u, /* Base address: 0x40011600 Count: 87 */ + 0x40011753u, /* Base address: 0x40011700 Count: 83 */ + 0x40011903u, /* Base address: 0x40011900 Count: 3 */ + 0x40011B02u, /* Base address: 0x40011B00 Count: 2 */ + 0x40014012u, /* Base address: 0x40014000 Count: 18 */ + 0x40014110u, /* Base address: 0x40014100 Count: 16 */ + 0x40014215u, /* Base address: 0x40014200 Count: 21 */ + 0x4001430Bu, /* Base address: 0x40014300 Count: 11 */ + 0x40014410u, /* Base address: 0x40014400 Count: 16 */ + 0x40014517u, /* Base address: 0x40014500 Count: 23 */ + 0x40014607u, /* Base address: 0x40014600 Count: 7 */ + 0x4001470Au, /* Base address: 0x40014700 Count: 10 */ + 0x4001480Cu, /* Base address: 0x40014800 Count: 12 */ + 0x4001490Bu, /* Base address: 0x40014900 Count: 11 */ + 0x4001500Bu, /* Base address: 0x40015000 Count: 11 */ + 0x40015102u, /* Base address: 0x40015100 Count: 2 */ }; static const cy_cfg_addrvalue_t CYCODE cy_cfg_data_table[] = { {0x36u, 0x02u}, {0x7Eu, 0x02u}, - {0x00u, 0x12u}, - {0x01u, 0x01u}, - {0x18u, 0x04u}, - {0x19u, 0x08u}, + {0x01u, 0x20u}, + {0x0Au, 0x36u}, + {0x00u, 0x13u}, + {0x01u, 0x05u}, + {0x19u, 0x04u}, {0x1Cu, 0x61u}, {0x20u, 0xA8u}, - {0x21u, 0xC8u}, - {0x30u, 0x03u}, - {0x31u, 0x06u}, + {0x21u, 0x60u}, + {0x30u, 0x09u}, + {0x31u, 0x0Au}, {0x7Cu, 0x40u}, - {0x33u, 0x01u}, - {0x87u, 0x0Fu}, - {0x03u, 0x08u}, - {0x04u, 0x21u}, - {0x06u, 0x42u}, - {0x07u, 0x40u}, - {0x08u, 0x42u}, - {0x0Au, 0x28u}, - {0x0Bu, 0x48u}, - {0x0Cu, 0x0Du}, - {0x0Fu, 0x06u}, - {0x10u, 0x02u}, - {0x11u, 0x01u}, - {0x12u, 0x0Du}, - {0x14u, 0x22u}, - {0x15u, 0x48u}, - {0x16u, 0x84u}, - {0x17u, 0x12u}, - {0x18u, 0xC0u}, - {0x1Bu, 0x30u}, - {0x1Cu, 0x0Du}, - {0x1Du, 0x01u}, - {0x20u, 0x0Du}, - {0x21u, 0x48u}, - {0x23u, 0x24u}, - {0x24u, 0x0Du}, - {0x25u, 0x01u}, - {0x28u, 0x0Du}, - {0x29u, 0x01u}, - {0x2Cu, 0x10u}, - {0x30u, 0x0Fu}, - {0x33u, 0x01u}, - {0x34u, 0xE0u}, - {0x35u, 0x70u}, - {0x36u, 0x10u}, - {0x37u, 0x0Eu}, - {0x38u, 0x20u}, - {0x39u, 0x08u}, - {0x3Au, 0x02u}, - {0x3Eu, 0x40u}, - {0x3Fu, 0x04u}, - {0x58u, 0x0Bu}, + {0x3Cu, 0x01u}, + {0x86u, 0x0Fu}, + {0x05u, 0x08u}, + {0x06u, 0x40u}, + {0x07u, 0x44u}, + {0x0Au, 0x10u}, + {0x0Cu, 0x55u}, + {0x0Du, 0x04u}, + {0x0Eu, 0xAAu}, + {0x0Fu, 0x09u}, + {0x11u, 0x4Du}, + {0x12u, 0x04u}, + {0x13u, 0xB2u}, + {0x16u, 0x20u}, + {0x1Au, 0x02u}, + {0x1Du, 0x20u}, + {0x1Fu, 0x90u}, + {0x22u, 0x01u}, + {0x2Au, 0x80u}, + {0x2Du, 0x10u}, + {0x2Eu, 0x08u}, + {0x2Fu, 0x22u}, + {0x30u, 0xC0u}, + {0x31u, 0xC0u}, + {0x32u, 0x0Cu}, + {0x33u, 0x03u}, + {0x34u, 0x30u}, + {0x35u, 0x3Cu}, + {0x36u, 0x03u}, + {0x3Eu, 0x55u}, + {0x3Fu, 0x15u}, + {0x58u, 0x04u}, {0x59u, 0x04u}, - {0x5Cu, 0x19u}, + {0x5Bu, 0x04u}, {0x5Fu, 0x01u}, - {0x83u, 0x04u}, - {0x84u, 0x02u}, - {0x87u, 0x10u}, - {0x8Cu, 0x01u}, - {0x8Eu, 0x02u}, - {0x8Fu, 0x08u}, - {0x90u, 0x07u}, - {0x95u, 0x01u}, - {0x97u, 0x04u}, - {0x99u, 0x01u}, - {0x9Bu, 0x02u}, - {0xA0u, 0x02u}, - {0xA1u, 0x06u}, - {0xA3u, 0x01u}, - {0xA4u, 0x06u}, - {0xAAu, 0x05u}, - {0xABu, 0x07u}, - {0xADu, 0x08u}, - {0xAEu, 0x07u}, - {0xAFu, 0x10u}, - {0xB3u, 0x07u}, - {0xB6u, 0x07u}, - {0xB7u, 0x18u}, - {0xBFu, 0x40u}, + {0x80u, 0x03u}, + {0x81u, 0x06u}, + {0x82u, 0x0Cu}, + {0x83u, 0x09u}, + {0x84u, 0x05u}, + {0x86u, 0x0Au}, + {0x87u, 0xFFu}, + {0x89u, 0x30u}, + {0x8Au, 0xFFu}, + {0x8Bu, 0xC0u}, + {0x8Cu, 0x0Fu}, + {0x8Du, 0x60u}, + {0x8Eu, 0xF0u}, + {0x8Fu, 0x90u}, + {0x90u, 0x90u}, + {0x91u, 0x0Fu}, + {0x92u, 0x60u}, + {0x93u, 0xF0u}, + {0x94u, 0xFFu}, + {0x95u, 0x50u}, + {0x97u, 0xA0u}, + {0x98u, 0xFFu}, + {0x99u, 0xFFu}, + {0xA1u, 0x03u}, + {0xA3u, 0x0Cu}, + {0xA4u, 0x50u}, + {0xA6u, 0xA0u}, + {0xA7u, 0xFFu}, + {0xA8u, 0x30u}, + {0xA9u, 0x05u}, + {0xAAu, 0xC0u}, + {0xABu, 0x0Au}, + {0xACu, 0x09u}, + {0xAEu, 0x06u}, + {0xB2u, 0xFFu}, + {0xB5u, 0xFFu}, + {0xBEu, 0x04u}, + {0xBFu, 0x10u}, {0xD8u, 0x04u}, {0xD9u, 0x04u}, - {0xDBu, 0x04u}, - {0xDCu, 0x11u}, {0xDFu, 0x01u}, - {0x00u, 0x20u}, - {0x03u, 0x21u}, - {0x05u, 0x08u}, - {0x06u, 0x01u}, - {0x08u, 0x40u}, - {0x0Au, 0x64u}, - {0x0Fu, 0x80u}, - {0x10u, 0x88u}, - {0x11u, 0x04u}, - {0x12u, 0x02u}, - {0x16u, 0x42u}, + {0x00u, 0x08u}, + {0x01u, 0x10u}, + {0x03u, 0x01u}, + {0x05u, 0x02u}, + {0x06u, 0x28u}, + {0x07u, 0x03u}, + {0x08u, 0x01u}, + {0x0Au, 0x14u}, + {0x0Eu, 0x60u}, + {0x0Fu, 0x04u}, + {0x10u, 0x08u}, + {0x11u, 0x41u}, + {0x14u, 0x01u}, + {0x16u, 0x02u}, {0x17u, 0x24u}, - {0x19u, 0x80u}, - {0x1Au, 0x44u}, - {0x1Fu, 0x80u}, - {0x21u, 0x68u}, - {0x24u, 0x20u}, - {0x26u, 0x44u}, - {0x27u, 0x20u}, - {0x28u, 0x08u}, - {0x2Au, 0x04u}, - {0x2Bu, 0xC0u}, - {0x2Du, 0x40u}, - {0x2Fu, 0x84u}, - {0x30u, 0x02u}, - {0x31u, 0x20u}, - {0x33u, 0x44u}, - {0x37u, 0x24u}, - {0x38u, 0x20u}, - {0x39u, 0x89u}, - {0x3Du, 0x80u}, - {0x3Fu, 0x09u}, - {0x6Du, 0x40u}, - {0x78u, 0x01u}, - {0x81u, 0x2Cu}, - {0x8Eu, 0x05u}, - {0xC0u, 0xA7u}, - {0xC2u, 0x1Fu}, - {0xC4u, 0xFFu}, - {0xCAu, 0xB7u}, - {0xCCu, 0x6Fu}, - {0xCEu, 0xDFu}, - {0xDEu, 0x01u}, - {0xE0u, 0x04u}, - {0x05u, 0x01u}, - {0x37u, 0x01u}, - {0x3Fu, 0x40u}, + {0x19u, 0x18u}, + {0x1Au, 0x80u}, + {0x1Bu, 0x80u}, + {0x1Du, 0x04u}, + {0x20u, 0x80u}, + {0x23u, 0x14u}, + {0x26u, 0x20u}, + {0x29u, 0x40u}, + {0x2Cu, 0x20u}, + {0x2Du, 0x13u}, + {0x2Eu, 0x20u}, + {0x33u, 0x41u}, + {0x34u, 0x10u}, + {0x36u, 0x10u}, + {0x37u, 0x06u}, + {0x39u, 0x88u}, + {0x3Cu, 0x20u}, + {0x3Eu, 0x42u}, + {0x3Fu, 0x04u}, + {0x41u, 0xC0u}, + {0x68u, 0x10u}, + {0x69u, 0x40u}, + {0x6Au, 0x54u}, + {0x6Bu, 0x64u}, + {0x70u, 0x18u}, + {0x71u, 0x41u}, + {0x80u, 0x08u}, + {0x8Bu, 0x80u}, + {0x8Eu, 0x40u}, + {0xC0u, 0xF7u}, + {0xC2u, 0x7Eu}, + {0xC4u, 0xEBu}, + {0xCAu, 0xE8u}, + {0xCCu, 0xE9u}, + {0xCEu, 0xFAu}, + {0xE2u, 0x10u}, + {0xE6u, 0x05u}, + {0x01u, 0x03u}, + {0x03u, 0x0Cu}, + {0x04u, 0x30u}, + {0x06u, 0xC0u}, + {0x07u, 0xFFu}, + {0x0Au, 0xFFu}, + {0x0Bu, 0xFFu}, + {0x0Cu, 0x06u}, + {0x0Du, 0x90u}, + {0x0Eu, 0x09u}, + {0x0Fu, 0x60u}, + {0x10u, 0x60u}, + {0x11u, 0x0Fu}, + {0x12u, 0x90u}, + {0x13u, 0xF0u}, + {0x15u, 0x50u}, + {0x16u, 0xFFu}, + {0x17u, 0xA0u}, + {0x18u, 0xFFu}, + {0x19u, 0x30u}, + {0x1Bu, 0xC0u}, + {0x1Cu, 0x03u}, + {0x1Eu, 0x0Cu}, + {0x20u, 0x0Fu}, + {0x21u, 0x09u}, + {0x22u, 0xF0u}, + {0x23u, 0x06u}, + {0x24u, 0x50u}, + {0x26u, 0xA0u}, + {0x27u, 0xFFu}, + {0x28u, 0x05u}, + {0x29u, 0x05u}, + {0x2Au, 0x0Au}, + {0x2Bu, 0x0Au}, + {0x34u, 0xFFu}, + {0x35u, 0xFFu}, + {0x3Eu, 0x10u}, + {0x3Fu, 0x10u}, + {0x56u, 0x08u}, + {0x58u, 0x04u}, {0x59u, 0x04u}, {0x5Bu, 0x04u}, + {0x5Du, 0x90u}, {0x5Fu, 0x01u}, - {0x80u, 0x01u}, - {0x83u, 0x04u}, - {0x85u, 0x80u}, - {0x88u, 0x04u}, - {0x8Bu, 0x24u}, - {0x8Fu, 0x20u}, - {0x93u, 0x18u}, - {0x95u, 0x24u}, - {0x97u, 0x09u}, - {0x9Fu, 0x03u}, - {0xA1u, 0x24u}, - {0xA3u, 0x12u}, - {0xA9u, 0x40u}, - {0xACu, 0x02u}, - {0xB0u, 0x01u}, - {0xB1u, 0x38u}, - {0xB3u, 0x40u}, - {0xB4u, 0x04u}, - {0xB5u, 0x80u}, - {0xB6u, 0x02u}, - {0xB7u, 0x07u}, - {0xBEu, 0x51u}, - {0xBFu, 0x14u}, - {0xC0u, 0x61u}, - {0xC1u, 0x03u}, - {0xC2u, 0x20u}, - {0xC5u, 0x2Cu}, - {0xC6u, 0x0Du}, - {0xC7u, 0xFEu}, - {0xC8u, 0x37u}, - {0xC9u, 0xFFu}, - {0xCAu, 0xFFu}, - {0xCBu, 0xFFu}, - {0xCFu, 0x2Cu}, - {0xD6u, 0x01u}, - {0xD8u, 0x04u}, + {0x84u, 0x0Du}, + {0x87u, 0x06u}, + {0x88u, 0x0Du}, + {0x8Bu, 0x08u}, + {0x8Cu, 0x0Du}, + {0x92u, 0x10u}, + {0x94u, 0x80u}, + {0x95u, 0x09u}, + {0x97u, 0x52u}, + {0x98u, 0x02u}, + {0x9Au, 0x54u}, + {0x9Cu, 0x02u}, + {0x9Eu, 0x0Du}, + {0x9Fu, 0x30u}, + {0xA0u, 0x0Du}, + {0xA1u, 0x09u}, + {0xA3u, 0x24u}, + {0xA4u, 0x01u}, + {0xA6u, 0x32u}, + {0xA7u, 0x01u}, + {0xA8u, 0x62u}, + {0xAAu, 0x08u}, + {0xABu, 0x49u}, + {0xACu, 0x0Du}, + {0xB0u, 0x70u}, + {0xB3u, 0x07u}, + {0xB4u, 0x80u}, + {0xB5u, 0x40u}, + {0xB6u, 0x0Fu}, + {0xB7u, 0x38u}, + {0xBAu, 0x80u}, + {0xBEu, 0x10u}, + {0xBFu, 0x10u}, + {0xD8u, 0x0Bu}, {0xD9u, 0x04u}, - {0xDAu, 0x04u}, {0xDBu, 0x04u}, - {0xDCu, 0x10u}, - {0xDDu, 0x01u}, + {0xDCu, 0x19u}, {0xDFu, 0x01u}, - {0xE2u, 0xC0u}, - {0xE6u, 0x80u}, - {0xE8u, 0x40u}, - {0xE9u, 0x40u}, - {0xEEu, 0x08u}, - {0x01u, 0x02u}, - {0x03u, 0x08u}, - {0x12u, 0x02u}, - {0x19u, 0x51u}, - {0x21u, 0x09u}, - {0x22u, 0x81u}, - {0x23u, 0x08u}, - {0x27u, 0x02u}, - {0x2Au, 0x20u}, - {0x2Bu, 0x80u}, - {0x32u, 0x81u}, - {0x33u, 0x04u}, - {0x38u, 0x08u}, - {0x39u, 0x40u}, - {0x3Au, 0x02u}, - {0x3Bu, 0x10u}, - {0x3Eu, 0x08u}, - {0x43u, 0x94u}, - {0x49u, 0x08u}, - {0x4Au, 0x04u}, - {0x4Bu, 0x11u}, - {0x51u, 0x02u}, - {0x52u, 0x48u}, - {0x59u, 0x90u}, - {0x5Bu, 0x0Au}, - {0x60u, 0x04u}, - {0x61u, 0x49u}, - {0x69u, 0x59u}, - {0x6Cu, 0x20u}, - {0x6Eu, 0x20u}, - {0x6Fu, 0x02u}, - {0x72u, 0x92u}, - {0x73u, 0x04u}, - {0x81u, 0x0Au}, - {0x82u, 0x28u}, - {0x85u, 0x01u}, - {0x86u, 0x10u}, - {0x88u, 0x20u}, - {0x89u, 0x02u}, - {0x8Au, 0x40u}, - {0x8Eu, 0x08u}, - {0x8Fu, 0x40u}, - {0x91u, 0x80u}, - {0x92u, 0x04u}, - {0x93u, 0x08u}, - {0x95u, 0x0Du}, - {0x96u, 0x20u}, - {0x97u, 0x01u}, - {0x99u, 0x80u}, - {0x9Bu, 0x20u}, - {0x9Cu, 0x49u}, - {0x9Du, 0x0Cu}, - {0x9Eu, 0x40u}, - {0x9Fu, 0x45u}, - {0xA2u, 0x44u}, - {0xA3u, 0x80u}, - {0xA4u, 0x98u}, - {0xA5u, 0x41u}, - {0xA7u, 0x24u}, - {0xA8u, 0x02u}, - {0xA9u, 0x01u}, - {0xAEu, 0x02u}, - {0xAFu, 0x04u}, - {0xB2u, 0x02u}, - {0xC0u, 0x0Au}, - {0xC4u, 0x01u}, - {0xCAu, 0x05u}, - {0xCCu, 0x0Bu}, - {0xCEu, 0x4Fu}, - {0xD0u, 0x0Eu}, - {0xD2u, 0x04u}, - {0xD6u, 0x0Fu}, - {0xD8u, 0x0Fu}, - {0xE0u, 0x01u}, - {0xE2u, 0x04u}, - {0xE4u, 0x06u}, - {0xE6u, 0x21u}, - {0xEAu, 0x04u}, - {0xEEu, 0x08u}, - {0x01u, 0x01u}, - {0x04u, 0x21u}, - {0x05u, 0x01u}, - {0x06u, 0x02u}, - {0x0Au, 0x01u}, - {0x0Bu, 0x08u}, - {0x0Fu, 0x06u}, - {0x13u, 0x01u}, - {0x14u, 0x04u}, - {0x15u, 0x01u}, - {0x16u, 0x43u}, - {0x18u, 0xE0u}, - {0x19u, 0x08u}, - {0x1Bu, 0x02u}, - {0x1Du, 0x01u}, - {0x1Eu, 0xECu}, + {0x03u, 0x19u}, + {0x06u, 0x0Au}, + {0x07u, 0x20u}, + {0x08u, 0x04u}, + {0x09u, 0x20u}, + {0x0Au, 0x81u}, + {0x0Eu, 0x50u}, + {0x0Fu, 0x05u}, + {0x10u, 0x80u}, + {0x11u, 0x40u}, + {0x13u, 0x18u}, + {0x14u, 0x40u}, + {0x15u, 0x10u}, + {0x17u, 0x06u}, + {0x19u, 0x20u}, + {0x1Au, 0x81u}, + {0x1Eu, 0x04u}, + {0x20u, 0x04u}, + {0x21u, 0x84u}, + {0x25u, 0x10u}, + {0x28u, 0x80u}, + {0x2Au, 0x10u}, + {0x2Bu, 0x10u}, + {0x2Cu, 0x20u}, + {0x2Du, 0x10u}, + {0x2Eu, 0x0Au}, + {0x31u, 0x80u}, + {0x32u, 0x04u}, + {0x37u, 0xE6u}, + {0x39u, 0x08u}, + {0x3Au, 0x20u}, + {0x3Du, 0x03u}, + {0x3Eu, 0x50u}, + {0x3Fu, 0x05u}, + {0x58u, 0x10u}, + {0x5Au, 0x10u}, + {0x5Fu, 0x80u}, + {0x61u, 0x01u}, + {0x62u, 0x02u}, + {0x64u, 0x02u}, + {0x6Bu, 0x02u}, + {0x6Cu, 0x02u}, + {0x78u, 0x02u}, + {0x82u, 0x02u}, + {0x83u, 0x10u}, + {0x84u, 0x80u}, + {0x86u, 0xA0u}, + {0x88u, 0x04u}, + {0x89u, 0x10u}, + {0x8Bu, 0x40u}, + {0x8Cu, 0x04u}, + {0x8Du, 0x40u}, + {0x90u, 0x20u}, + {0x92u, 0x40u}, + {0x93u, 0x04u}, + {0x95u, 0x19u}, + {0x98u, 0x08u}, + {0x99u, 0x05u}, + {0x9Bu, 0x24u}, + {0x9Cu, 0x10u}, + {0x9Eu, 0x0Au}, + {0x9Fu, 0x02u}, + {0xA0u, 0x08u}, + {0xA2u, 0x20u}, + {0xA4u, 0x24u}, + {0xA5u, 0x80u}, + {0xACu, 0x40u}, + {0xADu, 0x08u}, + {0xB3u, 0x10u}, + {0xB5u, 0x10u}, + {0xC0u, 0xE7u}, + {0xC2u, 0xFFu}, + {0xC4u, 0x7Fu}, + {0xCAu, 0xE7u}, + {0xCCu, 0xEAu}, + {0xCEu, 0xF6u}, + {0xD6u, 0x10u}, + {0xD8u, 0x10u}, + {0xDEu, 0x01u}, + {0xE2u, 0x0Au}, + {0xE6u, 0x47u}, + {0xE8u, 0x02u}, + {0xEAu, 0x08u}, + {0xECu, 0x08u}, + {0xEEu, 0x80u}, + {0x01u, 0x44u}, + {0x05u, 0xE1u}, + {0x06u, 0x46u}, + {0x07u, 0x12u}, + {0x08u, 0x09u}, + {0x09u, 0x80u}, + {0x0Au, 0x12u}, + {0x0Bu, 0x5Fu}, + {0x0Du, 0x4Cu}, + {0x0Eu, 0x80u}, + {0x11u, 0x4Cu}, + {0x12u, 0x30u}, + {0x16u, 0x08u}, + {0x17u, 0x4Cu}, + {0x19u, 0xB1u}, + {0x1Au, 0x09u}, + {0x1Bu, 0x0Eu}, + {0x1Cu, 0x09u}, + {0x1Du, 0x4Cu}, + {0x1Eu, 0x24u}, + {0x20u, 0x40u}, {0x21u, 0x08u}, - {0x23u, 0x04u}, - {0x27u, 0x01u}, - {0x28u, 0x88u}, - {0x2Au, 0x03u}, - {0x2Bu, 0x08u}, - {0x2Eu, 0x12u}, - {0x30u, 0xE0u}, - {0x33u, 0x01u}, - {0x34u, 0x10u}, - {0x36u, 0x0Fu}, - {0x37u, 0x0Eu}, - {0x3Eu, 0x01u}, - {0x3Fu, 0x04u}, - {0x54u, 0x40u}, - {0x58u, 0x0Bu}, - {0x59u, 0x04u}, + {0x22u, 0x80u}, + {0x23u, 0x20u}, + {0x25u, 0x44u}, + {0x26u, 0x01u}, + {0x27u, 0x08u}, + {0x30u, 0x38u}, + {0x31u, 0x10u}, + {0x33u, 0x61u}, + {0x34u, 0x07u}, + {0x35u, 0x0Fu}, + {0x36u, 0xC0u}, + {0x37u, 0x80u}, + {0x3Bu, 0x0Cu}, + {0x3Eu, 0x40u}, + {0x3Fu, 0x41u}, + {0x54u, 0x09u}, + {0x58u, 0x04u}, + {0x59u, 0x0Bu}, {0x5Bu, 0x0Bu}, - {0x5Cu, 0x19u}, + {0x5Cu, 0x91u}, {0x5Du, 0x90u}, {0x5Fu, 0x01u}, - {0x80u, 0x18u}, - {0x82u, 0x60u}, - {0x83u, 0x30u}, - {0x84u, 0x28u}, - {0x86u, 0x53u}, - {0x87u, 0x40u}, - {0x8Cu, 0x30u}, - {0x8Eu, 0x48u}, - {0x95u, 0x43u}, - {0x96u, 0x04u}, - {0x97u, 0x1Cu}, - {0x9Bu, 0x4Au}, - {0xA0u, 0x04u}, - {0xA1u, 0x44u}, - {0xA2u, 0x02u}, - {0xA3u, 0x2Bu}, - {0xA4u, 0x04u}, - {0xA5u, 0x01u}, - {0xA6u, 0x01u}, - {0xAAu, 0x04u}, - {0xABu, 0x07u}, - {0xB1u, 0x70u}, - {0xB2u, 0x07u}, - {0xB3u, 0x08u}, - {0xB4u, 0x78u}, - {0xB5u, 0x07u}, + {0x82u, 0x38u}, + {0x85u, 0x04u}, + {0x88u, 0x01u}, + {0x89u, 0x04u}, + {0x8Au, 0x14u}, + {0x90u, 0x3Eu}, + {0x94u, 0x22u}, + {0x95u, 0x04u}, + {0x96u, 0x01u}, + {0x99u, 0x04u}, + {0x9Fu, 0x01u}, + {0xA4u, 0x09u}, + {0xA6u, 0x02u}, + {0xABu, 0x02u}, + {0xADu, 0x01u}, + {0xAFu, 0x02u}, + {0xB0u, 0x07u}, + {0xB1u, 0x03u}, + {0xB4u, 0x38u}, + {0xB7u, 0x04u}, + {0xB8u, 0x02u}, + {0xB9u, 0x80u}, {0xBEu, 0x10u}, - {0xBFu, 0x04u}, - {0xD6u, 0x08u}, - {0xD8u, 0x04u}, + {0xBFu, 0x41u}, + {0xD8u, 0x0Bu}, {0xD9u, 0x04u}, {0xDBu, 0x04u}, - {0xDCu, 0x11u}, - {0xDDu, 0x90u}, + {0xDCu, 0x09u}, {0xDFu, 0x01u}, - {0x01u, 0x20u}, + {0x00u, 0x20u}, + {0x02u, 0x02u}, {0x03u, 0x20u}, - {0x04u, 0x80u}, - {0x05u, 0x05u}, - {0x0Au, 0x26u}, - {0x0Eu, 0x10u}, - {0x12u, 0x01u}, - {0x13u, 0x10u}, - {0x15u, 0x01u}, - {0x17u, 0x24u}, + {0x04u, 0x02u}, + {0x05u, 0x10u}, + {0x08u, 0x80u}, + {0x09u, 0x01u}, + {0x0Au, 0xA0u}, + {0x0Bu, 0x04u}, + {0x0Eu, 0x80u}, + {0x0Fu, 0x10u}, + {0x10u, 0x40u}, + {0x11u, 0x08u}, + {0x17u, 0x08u}, {0x19u, 0x20u}, - {0x1Au, 0x42u}, - {0x1Cu, 0x08u}, - {0x1Du, 0x04u}, - {0x21u, 0x40u}, - {0x22u, 0x08u}, - {0x24u, 0x80u}, - {0x25u, 0x01u}, - {0x26u, 0x20u}, - {0x27u, 0x14u}, - {0x29u, 0x10u}, - {0x2Au, 0x04u}, - {0x2Bu, 0x80u}, - {0x2Cu, 0x20u}, - {0x2Du, 0x01u}, - {0x2Fu, 0x84u}, - {0x30u, 0x48u}, - {0x32u, 0x20u}, - {0x33u, 0x41u}, - {0x34u, 0x10u}, - {0x35u, 0x10u}, - {0x37u, 0x24u}, - {0x39u, 0x94u}, - {0x3Au, 0x02u}, - {0x3Du, 0x02u}, - {0x3Fu, 0x04u}, - {0x5Eu, 0x80u}, - {0x61u, 0x20u}, - {0x62u, 0x08u}, - {0x63u, 0x01u}, - {0x64u, 0x01u}, - {0x67u, 0x02u}, - {0x78u, 0x01u}, - {0x81u, 0x40u}, - {0x82u, 0x40u}, + {0x1Au, 0x82u}, + {0x1Bu, 0x20u}, + {0x1Eu, 0x80u}, + {0x1Fu, 0x10u}, + {0x20u, 0x04u}, + {0x21u, 0x84u}, + {0x23u, 0x98u}, + {0x25u, 0x40u}, + {0x27u, 0x40u}, + {0x2Au, 0x0Bu}, + {0x2Cu, 0x02u}, + {0x2Fu, 0x04u}, + {0x30u, 0x80u}, + {0x31u, 0x10u}, + {0x33u, 0x09u}, + {0x35u, 0x04u}, + {0x36u, 0xA0u}, + {0x38u, 0x04u}, + {0x39u, 0x41u}, + {0x3Bu, 0x10u}, + {0x3Du, 0x20u}, + {0x3Eu, 0x04u}, + {0x58u, 0x20u}, + {0x59u, 0x09u}, + {0x5Bu, 0x80u}, + {0x61u, 0x80u}, + {0x65u, 0x08u}, + {0x66u, 0x14u}, + {0x67u, 0x04u}, + {0x6Cu, 0x20u}, + {0x6Fu, 0x06u}, + {0x78u, 0x02u}, + {0x7Cu, 0x02u}, + {0x82u, 0x80u}, {0x85u, 0x40u}, - {0x8Du, 0x10u}, - {0x91u, 0x10u}, - {0x92u, 0x14u}, - {0x93u, 0x0Cu}, - {0x94u, 0x04u}, - {0x95u, 0x04u}, - {0x96u, 0x20u}, + {0x86u, 0x01u}, + {0x87u, 0x02u}, + {0x90u, 0x20u}, + {0x91u, 0x80u}, + {0x92u, 0x24u}, + {0x93u, 0x40u}, + {0x95u, 0x40u}, + {0x96u, 0x18u}, + {0x97u, 0x10u}, + {0x98u, 0xCAu}, + {0x99u, 0x04u}, {0x9Au, 0x80u}, - {0x9Bu, 0x20u}, - {0x9Cu, 0x41u}, - {0x9Du, 0x04u}, - {0x9Fu, 0x15u}, - {0xA0u, 0x20u}, - {0xA2u, 0x40u}, - {0xA3u, 0x80u}, - {0xA4u, 0x98u}, - {0xA5u, 0x41u}, - {0xA7u, 0x24u}, - {0xA9u, 0x40u}, - {0xAAu, 0x80u}, - {0xABu, 0x08u}, - {0xACu, 0x08u}, - {0xAEu, 0x02u}, - {0xAFu, 0x02u}, - {0xB4u, 0x04u}, - {0xC0u, 0xB6u}, - {0xC2u, 0x27u}, - {0xC4u, 0x73u}, - {0xCAu, 0xE7u}, - {0xCCu, 0x6Fu}, - {0xCEu, 0xCFu}, - {0xD6u, 0x10u}, - {0xD8u, 0x1Eu}, - {0xDEu, 0x01u}, - {0xE0u, 0x01u}, - {0xE8u, 0x01u}, - {0xEAu, 0x02u}, - {0xECu, 0x04u}, - {0xEEu, 0x09u}, - {0x17u, 0x01u}, - {0x1Bu, 0x01u}, - {0x35u, 0x01u}, - {0x3Fu, 0x10u}, - {0x59u, 0x04u}, - {0x5Fu, 0x01u}, - {0x01u, 0x02u}, - {0x03u, 0x29u}, - {0x09u, 0x08u}, - {0x0Au, 0x01u}, - {0x0Bu, 0x04u}, - {0x11u, 0x25u}, - {0x12u, 0x01u}, - {0x18u, 0x04u}, - {0x19u, 0x80u}, - {0x1Au, 0x80u}, + {0x9Eu, 0x10u}, + {0x9Fu, 0x59u}, + {0xA0u, 0x0Au}, + {0xA1u, 0x14u}, + {0xA2u, 0x22u}, + {0xA4u, 0xA4u}, + {0xA5u, 0x21u}, + {0xA7u, 0x08u}, + {0xA8u, 0x20u}, + {0xB1u, 0x20u}, + {0xB5u, 0x04u}, + {0xB6u, 0x50u}, + {0xC0u, 0x57u}, + {0xC2u, 0x3Fu}, + {0xC4u, 0x2Cu}, + {0xCAu, 0x33u}, + {0xCCu, 0x7Fu}, + {0xCEu, 0x6Fu}, + {0xD6u, 0x0Fu}, + {0xD8u, 0x08u}, + {0xDEu, 0x81u}, + {0xE2u, 0x01u}, + {0xEAu, 0x10u}, + {0x87u, 0x11u}, + {0x8Bu, 0x06u}, + {0x8Fu, 0x01u}, + {0x95u, 0x19u}, + {0x97u, 0x22u}, + {0x99u, 0x08u}, + {0xA1u, 0x21u}, + {0xA3u, 0x1Cu}, + {0xABu, 0x38u}, + {0xB3u, 0x38u}, + {0xB5u, 0x07u}, + {0xD9u, 0x04u}, + {0xDCu, 0x10u}, + {0xDFu, 0x01u}, + {0x04u, 0x04u}, + {0x05u, 0x10u}, + {0x07u, 0x42u}, + {0x0Eu, 0xA2u}, + {0x0Fu, 0x08u}, + {0x15u, 0x48u}, + {0x16u, 0x08u}, + {0x17u, 0x11u}, + {0x1Eu, 0xA0u}, {0x20u, 0x28u}, - {0x21u, 0x09u}, - {0x22u, 0x11u}, - {0x23u, 0x14u}, - {0x26u, 0x20u}, - {0x2Au, 0x40u}, - {0x2Bu, 0x28u}, - {0x31u, 0x08u}, - {0x32u, 0x10u}, - {0x33u, 0x41u}, - {0x34u, 0x10u}, - {0x37u, 0x04u}, - {0x38u, 0x80u}, - {0x39u, 0x14u}, - {0x41u, 0x09u}, - {0x43u, 0x20u}, - {0x48u, 0x04u}, - {0x49u, 0x08u}, - {0x4Bu, 0x80u}, - {0x50u, 0x01u}, - {0x51u, 0x20u}, - {0x52u, 0x45u}, - {0x61u, 0x10u}, - {0x68u, 0x08u}, - {0x69u, 0x15u}, - {0x6Bu, 0x41u}, - {0x70u, 0xC0u}, - {0x72u, 0x03u}, - {0x78u, 0x01u}, - {0x8Eu, 0x20u}, - {0x93u, 0x02u}, - {0x94u, 0x04u}, - {0x95u, 0x04u}, - {0x96u, 0x20u}, - {0x97u, 0x10u}, - {0x98u, 0x11u}, + {0x21u, 0x10u}, + {0x22u, 0x04u}, + {0x27u, 0x02u}, + {0x28u, 0x88u}, + {0x2Fu, 0x1Au}, + {0x30u, 0x20u}, + {0x32u, 0x04u}, + {0x36u, 0x10u}, + {0x37u, 0x49u}, + {0x39u, 0x20u}, + {0x3Bu, 0x44u}, + {0x3Du, 0x41u}, + {0x3Eu, 0x01u}, + {0x3Fu, 0x18u}, + {0x45u, 0x22u}, + {0x46u, 0x20u}, + {0x47u, 0x08u}, + {0x4Du, 0x80u}, + {0x4Eu, 0x20u}, + {0x4Fu, 0x18u}, + {0x56u, 0x55u}, + {0x57u, 0x40u}, + {0x65u, 0x04u}, + {0x66u, 0x50u}, + {0x7Cu, 0x02u}, + {0x87u, 0x04u}, + {0x90u, 0x24u}, + {0x91u, 0x88u}, + {0x93u, 0x50u}, + {0x94u, 0x02u}, + {0x95u, 0x41u}, + {0x96u, 0x18u}, + {0x97u, 0x0Cu}, + {0x98u, 0xCAu}, + {0x99u, 0x20u}, {0x9Au, 0x80u}, - {0x9Bu, 0x04u}, - {0x9Eu, 0x07u}, - {0x9Fu, 0x41u}, - {0xA1u, 0x10u}, - {0xA3u, 0x80u}, - {0xA4u, 0x98u}, + {0x9Bu, 0x08u}, + {0x9Du, 0x11u}, + {0x9Eu, 0x0Du}, + {0x9Fu, 0x11u}, + {0xA0u, 0x28u}, + {0xA2u, 0x02u}, + {0xA4u, 0x94u}, {0xA5u, 0x20u}, - {0xA7u, 0x24u}, - {0xAAu, 0x04u}, - {0xABu, 0x01u}, - {0xACu, 0x04u}, - {0xB5u, 0x01u}, - {0xC0u, 0x0Fu}, - {0xC2u, 0x07u}, - {0xC4u, 0x0Fu}, - {0xCAu, 0x0Eu}, - {0xCCu, 0x6Fu}, - {0xCEu, 0x0Eu}, - {0xD0u, 0x07u}, - {0xD2u, 0x0Cu}, - {0xD8u, 0x04u}, - {0xDEu, 0x01u}, - {0xE2u, 0x10u}, - {0xECu, 0x42u}, - {0xAFu, 0x08u}, - {0x80u, 0x40u}, - {0x94u, 0x80u}, {0xA7u, 0x08u}, - {0xA8u, 0x28u}, - {0xA9u, 0x18u}, + {0xA8u, 0x20u}, {0xAAu, 0x02u}, - {0xAFu, 0x80u}, - {0xE0u, 0x01u}, - {0xE6u, 0x10u}, - {0xE8u, 0x01u}, - {0xEAu, 0x12u}, - {0xEEu, 0x01u}, - {0x00u, 0x0Fu}, - {0x02u, 0xF0u}, - {0x0Bu, 0xFFu}, - {0x0Cu, 0x33u}, - {0x0Eu, 0xCCu}, - {0x0Fu, 0xFFu}, - {0x11u, 0x33u}, - {0x13u, 0xCCu}, - {0x14u, 0xFFu}, - {0x18u, 0x96u}, - {0x19u, 0x55u}, - {0x1Au, 0x69u}, - {0x1Bu, 0xAAu}, - {0x1Cu, 0x55u}, - {0x1Eu, 0xAAu}, - {0x21u, 0xFFu}, - {0x26u, 0xFFu}, - {0x29u, 0x96u}, - {0x2Au, 0xFFu}, - {0x2Bu, 0x69u}, - {0x2Du, 0x0Fu}, - {0x2Fu, 0xF0u}, - {0x35u, 0xFFu}, - {0x36u, 0xFFu}, - {0x3Eu, 0x40u}, - {0x3Fu, 0x10u}, + {0xAFu, 0x10u}, + {0xB7u, 0x04u}, + {0xC0u, 0xF0u}, + {0xC2u, 0xF0u}, + {0xC4u, 0xF0u}, + {0xCAu, 0x75u}, + {0xCCu, 0xF6u}, + {0xCEu, 0xFEu}, + {0xD0u, 0xE0u}, + {0xD2u, 0x30u}, + {0xD8u, 0x70u}, + {0xDEu, 0x80u}, + {0xEAu, 0x08u}, + {0xEEu, 0x10u}, + {0x9Eu, 0x40u}, + {0x9Fu, 0x08u}, + {0xEAu, 0x08u}, + {0x9Eu, 0x40u}, + {0x9Fu, 0x08u}, + {0xABu, 0x01u}, + {0xAFu, 0x40u}, + {0xB0u, 0x04u}, + {0xB3u, 0x40u}, + {0xB5u, 0x01u}, + {0xB6u, 0x04u}, + {0xE2u, 0x01u}, + {0xE8u, 0x20u}, + {0xEAu, 0x49u}, + {0xEEu, 0x40u}, + {0x00u, 0x12u}, + {0x02u, 0x24u}, + {0x05u, 0x02u}, + {0x06u, 0x12u}, + {0x0Au, 0x0Cu}, + {0x0Eu, 0x02u}, + {0x11u, 0x06u}, + {0x13u, 0x08u}, + {0x16u, 0x60u}, + {0x17u, 0x0Du}, + {0x1Bu, 0x07u}, + {0x1Cu, 0x12u}, + {0x1Du, 0x07u}, + {0x1Eu, 0x48u}, + {0x1Fu, 0x08u}, + {0x20u, 0x01u}, + {0x21u, 0x02u}, + {0x25u, 0x01u}, + {0x26u, 0x10u}, + {0x27u, 0x02u}, + {0x29u, 0x10u}, + {0x30u, 0x01u}, + {0x32u, 0x70u}, + {0x33u, 0x08u}, + {0x34u, 0x0Eu}, + {0x35u, 0x10u}, + {0x37u, 0x07u}, + {0x3Eu, 0x01u}, + {0x3Fu, 0x14u}, + {0x40u, 0x31u}, + {0x41u, 0x04u}, + {0x42u, 0x60u}, + {0x45u, 0xEFu}, + {0x46u, 0x20u}, + {0x47u, 0xDCu}, + {0x48u, 0x3Bu}, + {0x49u, 0xFFu}, + {0x4Au, 0xFFu}, + {0x4Bu, 0xFFu}, + {0x4Fu, 0x2Cu}, + {0x56u, 0x01u}, {0x58u, 0x04u}, {0x59u, 0x04u}, + {0x5Au, 0x04u}, {0x5Bu, 0x04u}, + {0x5Cu, 0x11u}, + {0x5Du, 0x01u}, {0x5Fu, 0x01u}, - {0x84u, 0xFFu}, - {0x88u, 0x69u}, - {0x8Au, 0x96u}, - {0x8Bu, 0xFFu}, - {0x8Cu, 0x33u}, - {0x8Du, 0x33u}, - {0x8Eu, 0xCCu}, - {0x8Fu, 0xCCu}, - {0x91u, 0x0Fu}, - {0x92u, 0xFFu}, - {0x93u, 0xF0u}, - {0x97u, 0xFFu}, - {0x98u, 0xFFu}, - {0x99u, 0x55u}, - {0x9Bu, 0xAAu}, - {0x9Cu, 0x0Fu}, - {0x9Eu, 0xF0u}, - {0xA3u, 0xFFu}, - {0xA4u, 0x55u}, - {0xA6u, 0xAAu}, - {0xA9u, 0x69u}, - {0xABu, 0x96u}, - {0xB0u, 0xFFu}, - {0xB7u, 0xFFu}, - {0xBEu, 0x01u}, - {0xBFu, 0x40u}, + {0x62u, 0xC0u}, + {0x66u, 0x80u}, + {0x68u, 0x40u}, + {0x69u, 0x40u}, + {0x6Eu, 0x08u}, + {0x81u, 0x02u}, + {0x84u, 0x02u}, + {0x89u, 0x01u}, + {0x8Du, 0x04u}, + {0xACu, 0x01u}, + {0xB3u, 0x01u}, + {0xB4u, 0x02u}, + {0xB5u, 0x02u}, + {0xB6u, 0x01u}, + {0xB7u, 0x04u}, + {0xBEu, 0x50u}, + {0xBFu, 0x54u}, {0xD8u, 0x04u}, {0xD9u, 0x04u}, + {0xDBu, 0x04u}, {0xDFu, 0x01u}, {0x01u, 0x08u}, - {0x03u, 0x09u}, - {0x04u, 0x80u}, - {0x05u, 0x01u}, + {0x05u, 0x10u}, + {0x06u, 0x60u}, {0x07u, 0x01u}, - {0x09u, 0x12u}, - {0x0Bu, 0x02u}, - {0x0Cu, 0x08u}, + {0x08u, 0x08u}, + {0x09u, 0x08u}, {0x0Du, 0x80u}, - {0x0Fu, 0x08u}, + {0x0Eu, 0x20u}, {0x10u, 0x10u}, - {0x14u, 0x20u}, - {0x15u, 0x20u}, - {0x1Au, 0x80u}, - {0x1Fu, 0x80u}, + {0x12u, 0x22u}, + {0x14u, 0x80u}, + {0x17u, 0x04u}, + {0x19u, 0xA0u}, + {0x1Cu, 0x40u}, + {0x1Du, 0x10u}, + {0x1Eu, 0x20u}, {0x20u, 0x01u}, - {0x25u, 0x20u}, - {0x2Au, 0x02u}, - {0x2Bu, 0x0Cu}, - {0x2Cu, 0x02u}, + {0x21u, 0x08u}, + {0x23u, 0x04u}, + {0x25u, 0x80u}, + {0x26u, 0xA8u}, + {0x2Cu, 0x04u}, + {0x2Du, 0x02u}, {0x2Eu, 0x02u}, - {0x2Fu, 0x09u}, - {0x30u, 0x1Au}, - {0x31u, 0x01u}, - {0x34u, 0x10u}, - {0x37u, 0x01u}, - {0x38u, 0x80u}, + {0x2Fu, 0x10u}, + {0x34u, 0x20u}, + {0x36u, 0x80u}, + {0x37u, 0x0Au}, {0x39u, 0x20u}, - {0x3Cu, 0x80u}, - {0x3Du, 0x20u}, - {0x5Cu, 0x08u}, - {0x5Du, 0x80u}, - {0x5Eu, 0x11u}, - {0x80u, 0x08u}, - {0x82u, 0x10u}, - {0x84u, 0x10u}, + {0x3Bu, 0x81u}, + {0x3Eu, 0x04u}, + {0x3Fu, 0x08u}, + {0x45u, 0x80u}, + {0x46u, 0x60u}, + {0x47u, 0x0Au}, + {0x4Eu, 0x58u}, + {0x55u, 0x10u}, + {0x56u, 0x02u}, + {0x57u, 0x04u}, + {0x59u, 0x02u}, + {0x5Au, 0xA4u}, + {0x5Cu, 0x49u}, + {0x5Du, 0x20u}, + {0x64u, 0x10u}, + {0x65u, 0x80u}, + {0x67u, 0x44u}, + {0x6Eu, 0x08u}, + {0x6Fu, 0x45u}, + {0x74u, 0xA4u}, + {0x75u, 0x01u}, + {0x81u, 0x10u}, + {0x82u, 0x02u}, + {0x83u, 0x40u}, + {0x84u, 0xA0u}, {0x85u, 0x80u}, - {0x88u, 0x40u}, - {0x89u, 0x12u}, - {0x8Au, 0x01u}, - {0x8Du, 0x80u}, - {0x8Eu, 0x40u}, - {0x94u, 0x01u}, - {0xA0u, 0x02u}, - {0xA5u, 0x20u}, - {0xA9u, 0x20u}, - {0xC0u, 0x97u}, - {0xC2u, 0xEBu}, - {0xC4u, 0x64u}, - {0xCAu, 0xB5u}, - {0xCCu, 0xA7u}, - {0xCEu, 0x3Cu}, - {0xD6u, 0xF0u}, - {0xE2u, 0x94u}, - {0xE4u, 0xE2u}, - {0xE6u, 0x01u}, - {0xEEu, 0x28u}, - {0x80u, 0x02u}, - {0x8Cu, 0x01u}, - {0xE0u, 0x04u}, - {0xE6u, 0x50u}, - {0x8Cu, 0x40u}, - {0x90u, 0x40u}, - {0xABu, 0x21u}, - {0xE2u, 0x40u}, - {0x04u, 0x08u}, - {0x06u, 0x33u}, - {0x08u, 0x20u}, - {0x0Au, 0x18u}, - {0x0Eu, 0x01u}, - {0x14u, 0x2Eu}, - {0x15u, 0x04u}, - {0x16u, 0x10u}, + {0x88u, 0x04u}, + {0x89u, 0x10u}, + {0x8Au, 0x10u}, + {0x8Du, 0x18u}, + {0x93u, 0x20u}, + {0x98u, 0xA0u}, + {0xB0u, 0x80u}, + {0xC0u, 0xF4u}, + {0xC2u, 0xA0u}, + {0xC4u, 0x31u}, + {0xCAu, 0xE0u}, + {0xCCu, 0xF0u}, + {0xCEu, 0x4Du}, + {0xD0u, 0xD0u}, + {0xD2u, 0x20u}, + {0xD6u, 0xFFu}, + {0xD8u, 0xF0u}, + {0xE2u, 0xA1u}, + {0xE6u, 0x90u}, + {0xE8u, 0x42u}, + {0xEAu, 0x08u}, + {0xECu, 0x08u}, + {0x80u, 0x20u}, + {0x87u, 0x10u}, + {0xE0u, 0x80u}, + {0xE6u, 0x07u}, + {0xB4u, 0x04u}, + {0x00u, 0xD6u}, + {0x04u, 0xD2u}, + {0x05u, 0x40u}, + {0x06u, 0x04u}, + {0x07u, 0x30u}, + {0x08u, 0x29u}, + {0x09u, 0x58u}, + {0x0Au, 0x16u}, + {0x0Bu, 0x23u}, + {0x0Cu, 0x04u}, + {0x0Fu, 0x0Cu}, + {0x12u, 0x80u}, + {0x14u, 0x31u}, + {0x16u, 0x0Eu}, {0x17u, 0x01u}, - {0x18u, 0x18u}, - {0x1Au, 0x25u}, - {0x1Bu, 0x03u}, - {0x21u, 0x04u}, - {0x23u, 0x02u}, - {0x27u, 0x04u}, - {0x2Fu, 0x04u}, - {0x30u, 0x07u}, - {0x33u, 0x07u}, - {0x34u, 0x38u}, - {0x3Au, 0x20u}, - {0x58u, 0x08u}, - {0x59u, 0x04u}, - {0x5Cu, 0x19u}, + {0x1Bu, 0x82u}, + {0x1Cu, 0x22u}, + {0x1Eu, 0x10u}, + {0x20u, 0xD6u}, + {0x24u, 0x17u}, + {0x25u, 0x34u}, + {0x26u, 0x28u}, + {0x27u, 0x43u}, + {0x28u, 0xD0u}, + {0x29u, 0x11u}, + {0x2Au, 0x06u}, + {0x2Bu, 0x62u}, + {0x2Cu, 0x06u}, + {0x2Eu, 0xD0u}, + {0x30u, 0x40u}, + {0x32u, 0x80u}, + {0x33u, 0x80u}, + {0x34u, 0x0Fu}, + {0x35u, 0x70u}, + {0x36u, 0x30u}, + {0x37u, 0x0Fu}, + {0x38u, 0x20u}, + {0x39u, 0x02u}, + {0x3Au, 0x80u}, + {0x3Bu, 0x20u}, + {0x3Eu, 0x05u}, + {0x3Fu, 0x01u}, + {0x56u, 0x02u}, + {0x57u, 0x28u}, + {0x58u, 0x0Bu}, + {0x59u, 0x0Bu}, + {0x5Bu, 0x0Bu}, + {0x5Cu, 0x99u}, + {0x5Du, 0x90u}, {0x5Fu, 0x01u}, - {0x80u, 0x2Cu}, - {0x83u, 0x9Fu}, - {0x84u, 0x24u}, - {0x85u, 0xC0u}, - {0x86u, 0x08u}, - {0x87u, 0x04u}, - {0x88u, 0x44u}, - {0x89u, 0xC0u}, - {0x8Au, 0x20u}, - {0x8Bu, 0x08u}, - {0x8Cu, 0x0Cu}, - {0x8Du, 0xC0u}, - {0x8Eu, 0x20u}, - {0x8Fu, 0x01u}, - {0x90u, 0x10u}, - {0x91u, 0x90u}, - {0x93u, 0x40u}, - {0x94u, 0xE0u}, - {0x95u, 0x7Fu}, - {0x96u, 0x0Fu}, - {0x97u, 0x80u}, - {0x98u, 0xA1u}, - {0x9Au, 0x42u}, - {0x9Bu, 0xFFu}, - {0x9Cu, 0x10u}, - {0x9Du, 0xC0u}, - {0x9Fu, 0x02u}, - {0xA0u, 0x08u}, - {0xA3u, 0x60u}, - {0xA4u, 0xC1u}, - {0xA5u, 0x1Fu}, - {0xA6u, 0x2Eu}, - {0xA7u, 0x20u}, - {0xA8u, 0x20u}, - {0xA9u, 0x80u}, - {0xAAu, 0x0Cu}, - {0xACu, 0x2Cu}, - {0xB0u, 0x10u}, - {0xB2u, 0x60u}, - {0xB4u, 0x0Fu}, - {0xB6u, 0x80u}, - {0xB7u, 0xFFu}, - {0xB8u, 0x02u}, - {0xBAu, 0x08u}, - {0xBEu, 0x40u}, - {0xBFu, 0x40u}, - {0xD4u, 0x09u}, - {0xD8u, 0x0Bu}, + {0x84u, 0x05u}, + {0x86u, 0x0Au}, + {0x87u, 0x70u}, + {0x88u, 0x03u}, + {0x8Au, 0x0Cu}, + {0x8Bu, 0x80u}, + {0x8Cu, 0x30u}, + {0x8Eu, 0xC0u}, + {0x8Fu, 0x04u}, + {0x95u, 0x09u}, + {0x97u, 0x14u}, + {0x98u, 0x06u}, + {0x99u, 0x01u}, + {0x9Au, 0x09u}, + {0x9Bu, 0x0Au}, + {0x9Du, 0x40u}, + {0x9Fu, 0x80u}, + {0xA0u, 0x0Fu}, + {0xA1u, 0x0Eu}, + {0xA2u, 0xF0u}, + {0xA3u, 0x21u}, + {0xA4u, 0x60u}, + {0xA6u, 0x90u}, + {0xA8u, 0x50u}, + {0xAAu, 0xA0u}, + {0xABu, 0x07u}, + {0xAFu, 0x08u}, + {0xB1u, 0xC0u}, + {0xB2u, 0xFFu}, + {0xB3u, 0x38u}, + {0xB5u, 0x07u}, + {0xBEu, 0x04u}, + {0xBFu, 0x01u}, + {0xD8u, 0x04u}, {0xD9u, 0x04u}, - {0xDBu, 0x0Bu}, - {0xDCu, 0x09u}, - {0xDDu, 0x90u}, + {0xDCu, 0x10u}, {0xDFu, 0x01u}, - {0x01u, 0x04u}, - {0x03u, 0x49u}, - {0x04u, 0x48u}, + {0x00u, 0x08u}, + {0x01u, 0x20u}, + {0x02u, 0x02u}, {0x05u, 0x10u}, - {0x09u, 0x88u}, - {0x0Au, 0x84u}, - {0x0Du, 0x08u}, - {0x0Fu, 0x04u}, - {0x11u, 0x50u}, - {0x12u, 0x40u}, - {0x13u, 0x05u}, - {0x18u, 0x08u}, - {0x19u, 0x42u}, - {0x1Au, 0x04u}, - {0x1Bu, 0x28u}, - {0x1Cu, 0x40u}, - {0x1Du, 0x10u}, - {0x21u, 0x80u}, - {0x27u, 0x10u}, - {0x29u, 0x02u}, - {0x2Bu, 0x28u}, - {0x2Cu, 0x10u}, - {0x2Eu, 0x80u}, - {0x2Fu, 0x80u}, - {0x31u, 0x08u}, - {0x32u, 0x10u}, - {0x33u, 0x41u}, - {0x37u, 0x14u}, - {0x38u, 0x82u}, - {0x39u, 0x54u}, - {0x59u, 0x88u}, - {0x5Au, 0x02u}, - {0x5Bu, 0x20u}, - {0x61u, 0x40u}, - {0x78u, 0x01u}, - {0x7Fu, 0x01u}, - {0x83u, 0x10u}, - {0x8Fu, 0x04u}, - {0x90u, 0x82u}, - {0x91u, 0x14u}, - {0x92u, 0xA2u}, - {0x93u, 0x06u}, - {0x98u, 0x11u}, - {0x99u, 0x88u}, - {0x9Au, 0xC0u}, - {0x9Bu, 0x45u}, - {0x9Du, 0x12u}, - {0xA1u, 0x08u}, - {0xA3u, 0x80u}, - {0xA7u, 0x2Cu}, - {0xB3u, 0x40u}, - {0xC0u, 0xEFu}, - {0xC2u, 0x6Fu}, - {0xC4u, 0x0Fu}, - {0xCAu, 0xD7u}, - {0xCCu, 0x6Fu}, - {0xCEu, 0x0Fu}, - {0xD6u, 0x0Fu}, - {0xD8u, 0x08u}, - {0xDEu, 0x11u}, - {0xE0u, 0x40u}, + {0x06u, 0x01u}, + {0x07u, 0x50u}, + {0x0Bu, 0x08u}, + {0x0Eu, 0x02u}, + {0x0Fu, 0x90u}, + {0x10u, 0x48u}, + {0x12u, 0x10u}, + {0x15u, 0x50u}, + {0x17u, 0x09u}, + {0x1Au, 0x10u}, + {0x1Du, 0x37u}, + {0x1Eu, 0x03u}, + {0x1Fu, 0x10u}, + {0x20u, 0x04u}, + {0x21u, 0x05u}, + {0x22u, 0x10u}, + {0x23u, 0x04u}, + {0x24u, 0x02u}, + {0x25u, 0x51u}, + {0x26u, 0x08u}, + {0x28u, 0x88u}, + {0x2Au, 0x80u}, + {0x2Eu, 0x20u}, + {0x2Fu, 0x10u}, + {0x30u, 0x40u}, + {0x32u, 0x14u}, + {0x36u, 0x28u}, + {0x38u, 0x20u}, + {0x39u, 0x88u}, + {0x3Au, 0x10u}, + {0x3Bu, 0x08u}, + {0x3Du, 0x80u}, + {0x3Eu, 0x08u}, + {0x3Fu, 0x10u}, + {0x45u, 0x10u}, + {0x46u, 0x08u}, + {0x66u, 0x08u}, + {0x6Cu, 0x80u}, + {0x6Du, 0x50u}, + {0x6Fu, 0x58u}, + {0x77u, 0x01u}, + {0x7Cu, 0x02u}, + {0x83u, 0x12u}, + {0x8Du, 0x01u}, + {0x90u, 0x20u}, + {0x91u, 0x80u}, + {0x92u, 0x08u}, + {0x93u, 0x10u}, + {0x94u, 0x02u}, + {0x95u, 0x42u}, + {0x96u, 0x11u}, + {0x97u, 0x24u}, + {0x98u, 0xCAu}, + {0x99u, 0x20u}, + {0x9Au, 0xA1u}, + {0x9Bu, 0x08u}, + {0x9Du, 0x15u}, + {0x9Fu, 0x51u}, + {0xA0u, 0x0Cu}, + {0xA2u, 0x22u}, + {0xA3u, 0x40u}, + {0xA4u, 0x80u}, + {0xA5u, 0x22u}, + {0xA6u, 0x01u}, + {0xA7u, 0x0Au}, + {0xB0u, 0x10u}, + {0xB1u, 0x01u}, + {0xB5u, 0x80u}, + {0xC0u, 0xF7u}, + {0xC2u, 0xB2u}, + {0xC4u, 0xFEu}, + {0xCAu, 0x6Du}, + {0xCCu, 0x6Eu}, + {0xCEu, 0x7Eu}, + {0xD8u, 0x40u}, + {0xDEu, 0x80u}, + {0xE2u, 0x10u}, + {0xEAu, 0x20u}, + {0xECu, 0x40u}, + {0x9Fu, 0x08u}, + {0xB2u, 0x40u}, {0xECu, 0x80u}, - {0xEEu, 0x0Au}, - {0xEEu, 0x0Au}, - {0x33u, 0x80u}, - {0x36u, 0x40u}, - {0x5Bu, 0x08u}, - {0x5Fu, 0x22u}, - {0x60u, 0x10u}, - {0x64u, 0x20u}, - {0x83u, 0x22u}, - {0xCCu, 0x30u}, - {0xD6u, 0xE0u}, + {0xB7u, 0x08u}, + {0xECu, 0x40u}, + {0x30u, 0x20u}, + {0x33u, 0x02u}, + {0x34u, 0x04u}, + {0x35u, 0x20u}, + {0x38u, 0x80u}, + {0x56u, 0x80u}, + {0x5Bu, 0x02u}, + {0x5Eu, 0x01u}, + {0x63u, 0x40u}, + {0x65u, 0x04u}, + {0x81u, 0x20u}, + {0x8Du, 0x04u}, + {0xCCu, 0xF0u}, + {0xCEu, 0x10u}, + {0xD4u, 0x40u}, + {0xD6u, 0xC0u}, {0xD8u, 0xC0u}, - {0xE2u, 0x80u}, {0xE6u, 0x80u}, - {0x52u, 0x80u}, - {0x57u, 0x10u}, - {0x5Bu, 0x20u}, + {0x51u, 0x02u}, + {0x56u, 0x20u}, {0x5Eu, 0x01u}, + {0x5Fu, 0x20u}, + {0x8Eu, 0x20u}, + {0x94u, 0x80u}, + {0x97u, 0x40u}, + {0x9Cu, 0x04u}, + {0x9Eu, 0x80u}, + {0x9Fu, 0x02u}, + {0xA4u, 0x20u}, + {0xAFu, 0x02u}, + {0xB2u, 0x01u}, + {0xD4u, 0xC0u}, + {0xD6u, 0xA0u}, + {0xEAu, 0x10u}, + {0x10u, 0x20u}, + {0x80u, 0x40u}, + {0x83u, 0x80u}, + {0x86u, 0x81u}, + {0x87u, 0x02u}, + {0x94u, 0x80u}, + {0x96u, 0x01u}, + {0x97u, 0x40u}, + {0x9Bu, 0x40u}, + {0x9Cu, 0x04u}, + {0x9Eu, 0x80u}, + {0x9Fu, 0x02u}, + {0xA4u, 0x20u}, + {0xA5u, 0x02u}, + {0xABu, 0x20u}, + {0xB7u, 0x40u}, + {0xC4u, 0x10u}, + {0xE2u, 0xD0u}, + {0xE4u, 0x20u}, + {0xE6u, 0x40u}, + {0xEAu, 0x80u}, {0x86u, 0x80u}, - {0x8Bu, 0x20u}, - {0x9Cu, 0x20u}, - {0x9Fu, 0x08u}, - {0xA6u, 0x40u}, + {0x97u, 0x40u}, + {0x9Bu, 0x40u}, + {0xA1u, 0x80u}, {0xA7u, 0x80u}, - {0xA8u, 0x10u}, - {0xD4u, 0xE0u}, - {0xD6u, 0x80u}, - {0xE6u, 0x10u}, - {0xEEu, 0x80u}, - {0x80u, 0x02u}, - {0x87u, 0x20u}, - {0x9Fu, 0x08u}, - {0xA6u, 0x40u}, - {0xA7u, 0x90u}, - {0xA8u, 0x20u}, - {0xAEu, 0x01u}, - {0xE0u, 0x40u}, - {0xE2u, 0x20u}, + {0xACu, 0x04u}, + {0xADu, 0x80u}, + {0xB5u, 0x02u}, + {0xE4u, 0x10u}, {0xEAu, 0x10u}, - {0xEEu, 0x20u}, - {0x8Fu, 0x10u}, - {0x9Fu, 0x28u}, - {0xA0u, 0x02u}, - {0xA6u, 0x40u}, - {0xA7u, 0x90u}, - {0xB7u, 0x08u}, - {0x0Bu, 0x08u}, - {0x0Cu, 0x02u}, - {0x12u, 0x10u}, - {0x53u, 0x10u}, - {0x55u, 0x08u}, - {0x5Au, 0x10u}, - {0x5Eu, 0x40u}, - {0x82u, 0x40u}, - {0x8Cu, 0x02u}, + {0xEEu, 0x40u}, + {0x0Bu, 0x02u}, + {0x0Fu, 0x40u}, + {0x10u, 0x10u}, + {0x52u, 0x80u}, + {0x54u, 0x40u}, + {0x58u, 0x20u}, + {0x5Eu, 0x20u}, + {0x80u, 0x02u}, + {0x83u, 0x01u}, + {0x87u, 0x40u}, + {0x88u, 0x20u}, {0xC2u, 0x06u}, {0xC4u, 0x08u}, {0xD4u, 0x07u}, {0xD6u, 0x04u}, - {0xE6u, 0x02u}, - {0x01u, 0x80u}, - {0x04u, 0x80u}, - {0x05u, 0x02u}, - {0x08u, 0x81u}, - {0x0Eu, 0x02u}, - {0x0Fu, 0x20u}, - {0x81u, 0x80u}, - {0x83u, 0x10u}, - {0x87u, 0x10u}, - {0x89u, 0x02u}, - {0x96u, 0x10u}, - {0x97u, 0x20u}, - {0xA5u, 0x08u}, - {0xAFu, 0x04u}, - {0xB2u, 0x10u}, + {0xE0u, 0x01u}, + {0x00u, 0x20u}, + {0x06u, 0x40u}, + {0x07u, 0x04u}, + {0x09u, 0x02u}, + {0x0Bu, 0x04u}, + {0x0Eu, 0x08u}, + {0x0Fu, 0x10u}, + {0x81u, 0x02u}, + {0x8Au, 0x40u}, + {0x8Bu, 0x04u}, + {0x8Eu, 0x04u}, + {0x9Cu, 0x02u}, + {0xA4u, 0x02u}, + {0xACu, 0x42u}, + {0xAEu, 0x10u}, + {0xB0u, 0x10u}, + {0xB6u, 0x80u}, {0xC0u, 0x07u}, {0xC2u, 0x0Fu}, - {0xE2u, 0x01u}, - {0xEEu, 0x04u}, - {0x82u, 0x10u}, - {0x8Cu, 0x40u}, - {0x90u, 0x80u}, - {0x96u, 0x10u}, - {0xA9u, 0x08u}, - {0xAAu, 0x01u}, - {0xACu, 0x01u}, - {0xB4u, 0x80u}, - {0xE6u, 0x08u}, - {0xEAu, 0x08u}, - {0x08u, 0x08u}, - {0x0Fu, 0x40u}, - {0xC2u, 0x0Cu}, + {0xE2u, 0x02u}, + {0xE6u, 0x05u}, + {0xE8u, 0x02u}, + {0xEAu, 0x04u}, + {0x81u, 0x40u}, + {0x9Cu, 0x02u}, + {0xA4u, 0x02u}, + {0xABu, 0x04u}, + {0xAFu, 0x10u}, + {0xB0u, 0x10u}, + {0xEEu, 0x01u}, + {0x08u, 0x02u}, + {0x0Au, 0x01u}, + {0x0Cu, 0x02u}, + {0x0Du, 0x40u}, + {0x95u, 0x80u}, + {0x96u, 0x01u}, + {0x9Cu, 0x02u}, + {0xA4u, 0x02u}, + {0xAEu, 0x01u}, + {0xC2u, 0x0Fu}, {0x26u, 0x80u}, - {0x27u, 0x20u}, - {0x83u, 0x08u}, - {0x8Eu, 0x80u}, - {0x9Eu, 0x40u}, - {0x9Fu, 0x28u}, - {0xA0u, 0x02u}, - {0xAEu, 0x40u}, - {0xAFu, 0x80u}, - {0xB2u, 0x40u}, - {0xC8u, 0xA0u}, - {0xE2u, 0x20u}, - {0xEEu, 0x50u}, - {0x06u, 0x40u}, - {0x50u, 0x02u}, - {0x57u, 0x80u}, - {0x8Fu, 0x80u}, - {0x9Eu, 0x40u}, - {0xA0u, 0x02u}, + {0x65u, 0x04u}, + {0x8Du, 0x04u}, + {0x9Bu, 0x40u}, + {0x9Fu, 0x10u}, + {0xA1u, 0x80u}, + {0xA6u, 0x80u}, + {0xA7u, 0x80u}, + {0xB3u, 0x40u}, + {0xB7u, 0x10u}, + {0xC8u, 0x20u}, + {0xD8u, 0x80u}, + {0x07u, 0x10u}, + {0x1Bu, 0x80u}, + {0x51u, 0x80u}, + {0x5Bu, 0x40u}, + {0x9Bu, 0x40u}, + {0x9Fu, 0x10u}, + {0xA1u, 0x80u}, + {0xA7u, 0x80u}, {0xC0u, 0x20u}, - {0xD4u, 0xC0u}, - {0xACu, 0x08u}, - {0xAFu, 0x40u}, + {0xC6u, 0x40u}, + {0xD4u, 0xA0u}, {0x00u, 0x02u}, {0x01u, 0x01u}, {0x08u, 0x02u}, {0x09u, 0x01u}, {0x0Au, 0x02u}, {0x0Bu, 0x01u}, + {0x0Eu, 0x02u}, {0x10u, 0x02u}, {0x11u, 0x01u}, {0x1Au, 0x02u}, {0x1Bu, 0x01u}, - {0x00u, 0x0Au}, + {0x00u, 0xABu}, + {0x01u, 0x02u}, }; @@ -1316,29 +1472,30 @@ void cyfitter_cfg(void) static const cfg_memset_t CYCODE cfg_memset_list [] = { /* address, size */ + {(void CYFAR *)(CYREG_TMR0_CFG0), 12u}, {(void CYFAR *)(CYREG_PRT1_DR), 16u}, - {(void CYFAR *)(CYDEV_UCFG_B0_P0_U0_BASE), 1664u}, - {(void CYFAR *)(CYDEV_UCFG_B0_P3_ROUTE_BASE), 2304u}, + {(void CYFAR *)(CYDEV_UCFG_B0_P0_U0_BASE), 1536u}, + {(void CYFAR *)(CYDEV_UCFG_B0_P3_U1_BASE), 2432u}, {(void CYFAR *)(CYDEV_UCFG_B1_P2_U0_BASE), 2048u}, {(void CYFAR *)(CYDEV_UCFG_DSI0_BASE), 2560u}, {(void CYFAR *)(CYDEV_UCFG_DSI12_BASE), 512u}, {(void CYFAR *)(CYREG_BCTL0_MDCLK_EN), 32u}, }; - /* UDB_1_2_0_CONFIG Address: CYDEV_UCFG_B0_P3_U1_BASE Size (bytes): 128 */ - static const uint8 CYCODE BS_UDB_1_2_0_CONFIG_VAL[] = { - 0x04u, 0x00u, 0x00u, 0x00u, 0x07u, 0xC2u, 0x18u, 0x04u, 0x01u, 0x80u, 0x00u, 0x46u, 0x01u, 0xC6u, 0x00u, 0x00u, - 0x00u, 0x46u, 0x00u, 0x80u, 0x22u, 0x01u, 0x08u, 0x5Eu, 0x08u, 0x39u, 0x21u, 0x06u, 0x01u, 0xC6u, 0x00u, 0x00u, - 0x01u, 0x00u, 0x00u, 0x00u, 0x01u, 0x77u, 0x00u, 0x08u, 0x40u, 0x42u, 0x00u, 0x00u, 0x10u, 0x04u, 0x00u, 0x20u, - 0x3Fu, 0x80u, 0x00u, 0x70u, 0x40u, 0x0Fu, 0x08u, 0x00u, 0x02u, 0x20u, 0x00u, 0x0Cu, 0x00u, 0x00u, 0x51u, 0x01u, - 0x63u, 0x02u, 0x40u, 0x00u, 0x05u, 0x0Eu, 0xFCu, 0xBDu, 0x3Du, 0xFFu, 0xFFu, 0xFFu, 0x22u, 0x00u, 0xF0u, 0x08u, - 0x04u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x02u, 0x24u, 0x04u, 0x0Bu, 0x0Bu, 0x0Bu, 0x90u, 0x99u, 0x00u, 0x01u, + /* UDB_1_2_1_CONFIG Address: CYDEV_UCFG_B0_P3_U0_BASE Size (bytes): 128 */ + static const uint8 CYCODE BS_UDB_1_2_1_CONFIG_VAL[] = { + 0x01u, 0x80u, 0x00u, 0x00u, 0x07u, 0x00u, 0x18u, 0x9Fu, 0x08u, 0x7Fu, 0x21u, 0x80u, 0x40u, 0x90u, 0x00u, 0x40u, + 0x40u, 0xC0u, 0x00u, 0x01u, 0x04u, 0x1Fu, 0x00u, 0x20u, 0x10u, 0x00u, 0x00u, 0x60u, 0x01u, 0xC0u, 0x00u, 0x02u, + 0x01u, 0x00u, 0x00u, 0x00u, 0x22u, 0x00u, 0x08u, 0xFFu, 0x01u, 0xC0u, 0x00u, 0x08u, 0x01u, 0xC0u, 0x00u, 0x04u, + 0x3Fu, 0x00u, 0x40u, 0x00u, 0x00u, 0x00u, 0x00u, 0xFFu, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x01u, 0x40u, + 0x26u, 0x03u, 0x40u, 0x00u, 0x05u, 0x0Bu, 0xFDu, 0xCEu, 0x3Du, 0xFFu, 0xFFu, 0xFFu, 0x22u, 0x00u, 0xF0u, 0x08u, + 0x04u, 0x00u, 0x00u, 0x00u, 0x40u, 0x00u, 0x00u, 0x00u, 0x0Bu, 0x04u, 0x0Bu, 0x0Bu, 0x09u, 0x99u, 0x00u, 0x01u, 0x00u, 0x00u, 0xC0u, 0x00u, 0x40u, 0x01u, 0x10u, 0x11u, 0xC0u, 0x01u, 0x00u, 0x11u, 0x40u, 0x01u, 0x40u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}; static const cfg_memcpy_t CYCODE cfg_memcpy_list [] = { /* dest, src, size */ - {(void CYFAR *)(CYDEV_UCFG_B0_P3_U1_BASE), BS_UDB_1_2_0_CONFIG_VAL, 128u}, + {(void CYFAR *)(CYDEV_UCFG_B0_P3_U0_BASE), BS_UDB_1_2_1_CONFIG_VAL, 128u}, }; uint8 CYDATA i; diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc index da39a115..e2cddadf 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc @@ -3,6 +3,34 @@ .include "cydevicegnu.inc" .include "cydevicegnu_trm.inc" +/* Debug_Timer_Interrupt */ +.set Debug_Timer_Interrupt__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set Debug_Timer_Interrupt__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set Debug_Timer_Interrupt__INTC_MASK, 0x01 +.set Debug_Timer_Interrupt__INTC_NUMBER, 0 +.set Debug_Timer_Interrupt__INTC_PRIOR_NUM, 7 +.set Debug_Timer_Interrupt__INTC_PRIOR_REG, CYREG_NVIC_PRI_0 +.set Debug_Timer_Interrupt__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set Debug_Timer_Interrupt__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 + +/* Debug_Timer_TimerHW */ +.set Debug_Timer_TimerHW__CAP0, CYREG_TMR0_CAP0 +.set Debug_Timer_TimerHW__CAP1, CYREG_TMR0_CAP1 +.set Debug_Timer_TimerHW__CFG0, CYREG_TMR0_CFG0 +.set Debug_Timer_TimerHW__CFG1, CYREG_TMR0_CFG1 +.set Debug_Timer_TimerHW__CFG2, CYREG_TMR0_CFG2 +.set Debug_Timer_TimerHW__CNT_CMP0, CYREG_TMR0_CNT_CMP0 +.set Debug_Timer_TimerHW__CNT_CMP1, CYREG_TMR0_CNT_CMP1 +.set Debug_Timer_TimerHW__PER0, CYREG_TMR0_PER0 +.set Debug_Timer_TimerHW__PER1, CYREG_TMR0_PER1 +.set Debug_Timer_TimerHW__PM_ACT_CFG, CYREG_PM_ACT_CFG3 +.set Debug_Timer_TimerHW__PM_ACT_MSK, 0x01 +.set Debug_Timer_TimerHW__PM_STBY_CFG, CYREG_PM_STBY_CFG3 +.set Debug_Timer_TimerHW__PM_STBY_MSK, 0x01 +.set Debug_Timer_TimerHW__RT0, CYREG_TMR0_RT0 +.set Debug_Timer_TimerHW__RT1, CYREG_TMR0_RT1 +.set Debug_Timer_TimerHW__SR0, CYREG_TMR0_SR0 + /* USBFS_bus_reset */ .set USBFS_bus_reset__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 .set USBFS_bus_reset__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 @@ -16,28 +44,64 @@ /* SCSI_CTL_PHASE */ .set SCSI_CTL_PHASE_Sync_ctrl_reg__0__MASK, 0x01 .set SCSI_CTL_PHASE_Sync_ctrl_reg__0__POS, 0 -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB02_03_ACTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB02_03_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB02_03_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB02_03_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB02_03_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG, CYREG_B0_UDB02_03_MSK -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB02_03_MSK -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB02_03_MSK -.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB02_03_MSK +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB05_06_ACTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB05_06_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB05_06_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB05_06_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB05_06_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG, CYREG_B0_UDB05_06_MSK +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB05_06_MSK +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB05_06_MSK +.set SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB05_06_MSK .set SCSI_CTL_PHASE_Sync_ctrl_reg__1__MASK, 0x02 .set SCSI_CTL_PHASE_Sync_ctrl_reg__1__POS, 1 .set SCSI_CTL_PHASE_Sync_ctrl_reg__2__MASK, 0x04 .set SCSI_CTL_PHASE_Sync_ctrl_reg__2__POS, 2 -.set SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG, CYREG_B0_UDB02_ACTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG, CYREG_B0_UDB02_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG, CYREG_B0_UDB02_ST_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG, CYREG_B0_UDB02_CTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG, CYREG_B0_UDB02_ST_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG, CYREG_B0_UDB05_ACTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG, CYREG_B0_UDB05_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG, CYREG_B0_UDB05_ST_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG, CYREG_B0_UDB05_CTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG, CYREG_B0_UDB05_ST_CTL .set SCSI_CTL_PHASE_Sync_ctrl_reg__MASK, 0x07 -.set SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB02_MSK_ACTL -.set SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG, CYREG_B0_UDB02_MSK -.set SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB02_MSK_ACTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB05_MSK_ACTL +.set SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG, CYREG_B0_UDB05_MSK +.set SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB05_MSK_ACTL + +/* SCSI_Out_Bits */ +.set SCSI_Out_Bits_Sync_ctrl_reg__0__MASK, 0x01 +.set SCSI_Out_Bits_Sync_ctrl_reg__0__POS, 0 +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB00_01_ACTL +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB00_01_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB00_01_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB00_01_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB00_01_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_MASK_REG, CYREG_B0_UDB00_01_MSK +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB00_01_MSK +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB00_01_MSK +.set SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB00_01_MSK +.set SCSI_Out_Bits_Sync_ctrl_reg__1__MASK, 0x02 +.set SCSI_Out_Bits_Sync_ctrl_reg__1__POS, 1 +.set SCSI_Out_Bits_Sync_ctrl_reg__2__MASK, 0x04 +.set SCSI_Out_Bits_Sync_ctrl_reg__2__POS, 2 +.set SCSI_Out_Bits_Sync_ctrl_reg__3__MASK, 0x08 +.set SCSI_Out_Bits_Sync_ctrl_reg__3__POS, 3 +.set SCSI_Out_Bits_Sync_ctrl_reg__4__MASK, 0x10 +.set SCSI_Out_Bits_Sync_ctrl_reg__4__POS, 4 +.set SCSI_Out_Bits_Sync_ctrl_reg__5__MASK, 0x20 +.set SCSI_Out_Bits_Sync_ctrl_reg__5__POS, 5 +.set SCSI_Out_Bits_Sync_ctrl_reg__6__MASK, 0x40 +.set SCSI_Out_Bits_Sync_ctrl_reg__6__POS, 6 +.set SCSI_Out_Bits_Sync_ctrl_reg__7__MASK, 0x80 +.set SCSI_Out_Bits_Sync_ctrl_reg__7__POS, 7 +.set SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_AUX_CTL_REG, CYREG_B0_UDB00_ACTL +.set SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_REG, CYREG_B0_UDB00_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_ST_REG, CYREG_B0_UDB00_ST_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__COUNT_REG, CYREG_B0_UDB00_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__COUNT_ST_REG, CYREG_B0_UDB00_ST_CTL +.set SCSI_Out_Bits_Sync_ctrl_reg__MASK, 0xFF +.set SCSI_Out_Bits_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB00_MSK_ACTL +.set SCSI_Out_Bits_Sync_ctrl_reg__PERIOD_REG, CYREG_B0_UDB00_MSK +.set SCSI_Out_Bits_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB00_MSK_ACTL /* USBFS_arb_int */ .set USBFS_arb_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 @@ -59,6 +123,28 @@ .set USBFS_sof_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 .set USBFS_sof_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 +/* SCSI_Out_Ctl */ +.set SCSI_Out_Ctl_Sync_ctrl_reg__0__MASK, 0x01 +.set SCSI_Out_Ctl_Sync_ctrl_reg__0__POS, 0 +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB03_04_ACTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB03_04_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB03_04_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB03_04_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB03_04_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG, CYREG_B0_UDB03_04_MSK +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB03_04_MSK +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB03_04_MSK +.set SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB03_04_MSK +.set SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG, CYREG_B0_UDB03_ACTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_REG, CYREG_B0_UDB03_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_ST_REG, CYREG_B0_UDB03_ST_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_REG, CYREG_B0_UDB03_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_ST_REG, CYREG_B0_UDB03_ST_CTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__MASK, 0x01 +.set SCSI_Out_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL +.set SCSI_Out_Ctl_Sync_ctrl_reg__PERIOD_REG, CYREG_B0_UDB03_MSK +.set SCSI_Out_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL + /* SCSI_Out_DBx */ .set SCSI_Out_DBx__0__AG, CYREG_PRT6_AG .set SCSI_Out_DBx__0__AMUX, CYREG_PRT6_AMUX @@ -504,34 +590,34 @@ .set SCSI_RST_ISR__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 /* SDCard_BSPIM */ -.set SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB07_08_ACTL -.set SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG, CYREG_B0_UDB07_08_ST -.set SDCard_BSPIM_BitCounter_ST__MASK_REG, CYREG_B0_UDB07_MSK -.set SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG, CYREG_B0_UDB07_MSK_ACTL -.set SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG, CYREG_B0_UDB07_MSK_ACTL -.set SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG, CYREG_B0_UDB07_ACTL -.set SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG, CYREG_B0_UDB07_ST_CTL -.set SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG, CYREG_B0_UDB07_ST_CTL -.set SDCard_BSPIM_BitCounter_ST__STATUS_REG, CYREG_B0_UDB07_ST -.set SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB07_08_ACTL -.set SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB07_08_CTL -.set SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB07_08_CTL -.set SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB07_08_CTL -.set SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB07_08_CTL -.set SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG, CYREG_B0_UDB07_08_MSK -.set SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB07_08_MSK -.set SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB07_08_MSK -.set SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB07_08_MSK -.set SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG, CYREG_B0_UDB07_ACTL -.set SDCard_BSPIM_BitCounter__CONTROL_REG, CYREG_B0_UDB07_CTL -.set SDCard_BSPIM_BitCounter__CONTROL_ST_REG, CYREG_B0_UDB07_ST_CTL -.set SDCard_BSPIM_BitCounter__COUNT_REG, CYREG_B0_UDB07_CTL -.set SDCard_BSPIM_BitCounter__COUNT_ST_REG, CYREG_B0_UDB07_ST_CTL -.set SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB07_MSK_ACTL -.set SDCard_BSPIM_BitCounter__PERIOD_REG, CYREG_B0_UDB07_MSK -.set SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB07_MSK_ACTL -.set SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB04_05_ACTL -.set SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG, CYREG_B0_UDB04_05_ST +.set SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG, CYREG_B1_UDB06_07_ACTL +.set SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG, CYREG_B1_UDB06_07_ST +.set SDCard_BSPIM_BitCounter_ST__MASK_REG, CYREG_B1_UDB06_MSK +.set SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG, CYREG_B1_UDB06_MSK_ACTL +.set SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG, CYREG_B1_UDB06_MSK_ACTL +.set SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG, CYREG_B1_UDB06_ACTL +.set SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG, CYREG_B1_UDB06_ST_CTL +.set SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG, CYREG_B1_UDB06_ST_CTL +.set SDCard_BSPIM_BitCounter_ST__STATUS_REG, CYREG_B1_UDB06_ST +.set SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG, CYREG_B1_UDB06_07_ACTL +.set SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG, CYREG_B1_UDB06_07_CTL +.set SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG, CYREG_B1_UDB06_07_CTL +.set SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG, CYREG_B1_UDB06_07_CTL +.set SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG, CYREG_B1_UDB06_07_CTL +.set SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG, CYREG_B1_UDB06_07_MSK +.set SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG, CYREG_B1_UDB06_07_MSK +.set SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG, CYREG_B1_UDB06_07_MSK +.set SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG, CYREG_B1_UDB06_07_MSK +.set SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG, CYREG_B1_UDB06_ACTL +.set SDCard_BSPIM_BitCounter__CONTROL_REG, CYREG_B1_UDB06_CTL +.set SDCard_BSPIM_BitCounter__CONTROL_ST_REG, CYREG_B1_UDB06_ST_CTL +.set SDCard_BSPIM_BitCounter__COUNT_REG, CYREG_B1_UDB06_CTL +.set SDCard_BSPIM_BitCounter__COUNT_ST_REG, CYREG_B1_UDB06_ST_CTL +.set SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG, CYREG_B1_UDB06_MSK_ACTL +.set SDCard_BSPIM_BitCounter__PERIOD_REG, CYREG_B1_UDB06_MSK +.set SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG, CYREG_B1_UDB06_MSK_ACTL +.set SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB06_07_ACTL +.set SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG, CYREG_B0_UDB06_07_ST .set SDCard_BSPIM_RxStsReg__4__MASK, 0x10 .set SDCard_BSPIM_RxStsReg__4__POS, 4 .set SDCard_BSPIM_RxStsReg__5__MASK, 0x20 @@ -539,13 +625,13 @@ .set SDCard_BSPIM_RxStsReg__6__MASK, 0x40 .set SDCard_BSPIM_RxStsReg__6__POS, 6 .set SDCard_BSPIM_RxStsReg__MASK, 0x70 -.set SDCard_BSPIM_RxStsReg__MASK_REG, CYREG_B0_UDB04_MSK -.set SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG, CYREG_B0_UDB04_ACTL -.set SDCard_BSPIM_RxStsReg__STATUS_REG, CYREG_B0_UDB04_ST +.set SDCard_BSPIM_RxStsReg__MASK_REG, CYREG_B0_UDB06_MSK +.set SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG, CYREG_B0_UDB06_ACTL +.set SDCard_BSPIM_RxStsReg__STATUS_REG, CYREG_B0_UDB06_ST .set SDCard_BSPIM_TxStsReg__0__MASK, 0x01 .set SDCard_BSPIM_TxStsReg__0__POS, 0 -.set SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG, CYREG_B1_UDB07_08_ACTL -.set SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG, CYREG_B1_UDB07_08_ST +.set SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB04_05_ACTL +.set SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG, CYREG_B0_UDB04_05_ST .set SDCard_BSPIM_TxStsReg__1__MASK, 0x02 .set SDCard_BSPIM_TxStsReg__1__POS, 1 .set SDCard_BSPIM_TxStsReg__2__MASK, 0x04 @@ -555,28 +641,26 @@ .set SDCard_BSPIM_TxStsReg__4__MASK, 0x10 .set SDCard_BSPIM_TxStsReg__4__POS, 4 .set SDCard_BSPIM_TxStsReg__MASK, 0x1F -.set SDCard_BSPIM_TxStsReg__MASK_REG, CYREG_B1_UDB07_MSK -.set SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG, CYREG_B1_UDB07_ACTL -.set SDCard_BSPIM_TxStsReg__STATUS_REG, CYREG_B1_UDB07_ST -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG, CYREG_B0_UDB07_08_A0 -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG, CYREG_B0_UDB07_08_A1 -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG, CYREG_B0_UDB07_08_D0 -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG, CYREG_B0_UDB07_08_D1 -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG, CYREG_B0_UDB07_08_ACTL -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG, CYREG_B0_UDB07_08_F0 -.set SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG, CYREG_B0_UDB07_08_F1 -.set SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG, CYREG_B0_UDB07_A0_A1 -.set SDCard_BSPIM_sR8_Dp_u0__A0_REG, CYREG_B0_UDB07_A0 -.set SDCard_BSPIM_sR8_Dp_u0__A1_REG, CYREG_B0_UDB07_A1 -.set SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG, CYREG_B0_UDB07_D0_D1 -.set SDCard_BSPIM_sR8_Dp_u0__D0_REG, CYREG_B0_UDB07_D0 -.set SDCard_BSPIM_sR8_Dp_u0__D1_REG, CYREG_B0_UDB07_D1 -.set SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG, CYREG_B0_UDB07_ACTL -.set SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG, CYREG_B0_UDB07_F0_F1 -.set SDCard_BSPIM_sR8_Dp_u0__F0_REG, CYREG_B0_UDB07_F0 -.set SDCard_BSPIM_sR8_Dp_u0__F1_REG, CYREG_B0_UDB07_F1 -.set SDCard_BSPIM_sR8_Dp_u0__MSK_DP_AUX_CTL_REG, CYREG_B0_UDB07_MSK_ACTL -.set SDCard_BSPIM_sR8_Dp_u0__PER_DP_AUX_CTL_REG, CYREG_B0_UDB07_MSK_ACTL +.set SDCard_BSPIM_TxStsReg__MASK_REG, CYREG_B0_UDB04_MSK +.set SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG, CYREG_B0_UDB04_ACTL +.set SDCard_BSPIM_TxStsReg__STATUS_REG, CYREG_B0_UDB04_ST +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG, CYREG_B0_UDB06_07_A0 +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG, CYREG_B0_UDB06_07_A1 +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG, CYREG_B0_UDB06_07_D0 +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG, CYREG_B0_UDB06_07_D1 +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG, CYREG_B0_UDB06_07_ACTL +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG, CYREG_B0_UDB06_07_F0 +.set SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG, CYREG_B0_UDB06_07_F1 +.set SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG, CYREG_B0_UDB06_A0_A1 +.set SDCard_BSPIM_sR8_Dp_u0__A0_REG, CYREG_B0_UDB06_A0 +.set SDCard_BSPIM_sR8_Dp_u0__A1_REG, CYREG_B0_UDB06_A1 +.set SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG, CYREG_B0_UDB06_D0_D1 +.set SDCard_BSPIM_sR8_Dp_u0__D0_REG, CYREG_B0_UDB06_D0 +.set SDCard_BSPIM_sR8_Dp_u0__D1_REG, CYREG_B0_UDB06_D1 +.set SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG, CYREG_B0_UDB06_ACTL +.set SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG, CYREG_B0_UDB06_F0_F1 +.set SDCard_BSPIM_sR8_Dp_u0__F0_REG, CYREG_B0_UDB06_F0 +.set SDCard_BSPIM_sR8_Dp_u0__F1_REG, CYREG_B0_UDB06_F1 /* USBFS_dp_int */ .set USBFS_dp_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 @@ -1032,21 +1116,32 @@ .set SD_Data_Clk__PM_STBY_MSK, 0x01 /* SD_Init_Clk */ -.set SD_Init_Clk__CFG0, CYREG_CLKDIST_DCFG2_CFG0 -.set SD_Init_Clk__CFG1, CYREG_CLKDIST_DCFG2_CFG1 -.set SD_Init_Clk__CFG2, CYREG_CLKDIST_DCFG2_CFG2 +.set SD_Init_Clk__CFG0, CYREG_CLKDIST_DCFG3_CFG0 +.set SD_Init_Clk__CFG1, CYREG_CLKDIST_DCFG3_CFG1 +.set SD_Init_Clk__CFG2, CYREG_CLKDIST_DCFG3_CFG2 .set SD_Init_Clk__CFG2_SRC_SEL_MASK, 0x07 -.set SD_Init_Clk__INDEX, 0x02 +.set SD_Init_Clk__INDEX, 0x03 .set SD_Init_Clk__PM_ACT_CFG, CYREG_PM_ACT_CFG2 -.set SD_Init_Clk__PM_ACT_MSK, 0x04 +.set SD_Init_Clk__PM_ACT_MSK, 0x08 .set SD_Init_Clk__PM_STBY_CFG, CYREG_PM_STBY_CFG2 -.set SD_Init_Clk__PM_STBY_MSK, 0x04 +.set SD_Init_Clk__PM_STBY_MSK, 0x08 + +/* timer_clock */ +.set timer_clock__CFG0, CYREG_CLKDIST_DCFG2_CFG0 +.set timer_clock__CFG1, CYREG_CLKDIST_DCFG2_CFG1 +.set timer_clock__CFG2, CYREG_CLKDIST_DCFG2_CFG2 +.set timer_clock__CFG2_SRC_SEL_MASK, 0x07 +.set timer_clock__INDEX, 0x02 +.set timer_clock__PM_ACT_CFG, CYREG_PM_ACT_CFG2 +.set timer_clock__PM_ACT_MSK, 0x04 +.set timer_clock__PM_STBY_CFG, CYREG_PM_STBY_CFG2 +.set timer_clock__PM_STBY_MSK, 0x04 /* scsiTarget */ .set scsiTarget_StatusReg__0__MASK, 0x01 .set scsiTarget_StatusReg__0__POS, 0 -.set scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB12_13_ACTL -.set scsiTarget_StatusReg__16BIT_STATUS_REG, CYREG_B0_UDB12_13_ST +.set scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB13_14_ACTL +.set scsiTarget_StatusReg__16BIT_STATUS_REG, CYREG_B0_UDB13_14_ST .set scsiTarget_StatusReg__1__MASK, 0x02 .set scsiTarget_StatusReg__1__POS, 1 .set scsiTarget_StatusReg__2__MASK, 0x04 @@ -1054,76 +1149,76 @@ .set scsiTarget_StatusReg__3__MASK, 0x08 .set scsiTarget_StatusReg__3__POS, 3 .set scsiTarget_StatusReg__MASK, 0x0F -.set scsiTarget_StatusReg__MASK_REG, CYREG_B0_UDB12_MSK -.set scsiTarget_StatusReg__STATUS_AUX_CTL_REG, CYREG_B0_UDB12_ACTL -.set scsiTarget_StatusReg__STATUS_REG, CYREG_B0_UDB12_ST -.set scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB03_04_ACTL -.set scsiTarget_datapath_PI__16BIT_STATUS_REG, CYREG_B0_UDB03_04_ST -.set scsiTarget_datapath_PI__MASK_REG, CYREG_B0_UDB03_MSK -.set scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL -.set scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL -.set scsiTarget_datapath_PI__STATUS_AUX_CTL_REG, CYREG_B0_UDB03_ACTL -.set scsiTarget_datapath_PI__STATUS_CNT_REG, CYREG_B0_UDB03_ST_CTL -.set scsiTarget_datapath_PI__STATUS_CONTROL_REG, CYREG_B0_UDB03_ST_CTL -.set scsiTarget_datapath_PI__STATUS_REG, CYREG_B0_UDB03_ST -.set scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB03_04_ACTL -.set scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB03_04_CTL -.set scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB03_04_CTL -.set scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB03_04_CTL -.set scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB03_04_CTL -.set scsiTarget_datapath_PO__16BIT_MASK_MASK_REG, CYREG_B0_UDB03_04_MSK -.set scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB03_04_MSK -.set scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB03_04_MSK -.set scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB03_04_MSK -.set scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG, CYREG_B0_UDB03_ACTL -.set scsiTarget_datapath_PO__CONTROL_REG, CYREG_B0_UDB03_CTL -.set scsiTarget_datapath_PO__CONTROL_ST_REG, CYREG_B0_UDB03_ST_CTL -.set scsiTarget_datapath_PO__COUNT_REG, CYREG_B0_UDB03_CTL -.set scsiTarget_datapath_PO__COUNT_ST_REG, CYREG_B0_UDB03_ST_CTL -.set scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL -.set scsiTarget_datapath_PO__PERIOD_REG, CYREG_B0_UDB03_MSK -.set scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL -.set scsiTarget_datapath__16BIT_A0_REG, CYREG_B0_UDB03_04_A0 -.set scsiTarget_datapath__16BIT_A1_REG, CYREG_B0_UDB03_04_A1 -.set scsiTarget_datapath__16BIT_D0_REG, CYREG_B0_UDB03_04_D0 -.set scsiTarget_datapath__16BIT_D1_REG, CYREG_B0_UDB03_04_D1 -.set scsiTarget_datapath__16BIT_DP_AUX_CTL_REG, CYREG_B0_UDB03_04_ACTL -.set scsiTarget_datapath__16BIT_F0_REG, CYREG_B0_UDB03_04_F0 -.set scsiTarget_datapath__16BIT_F1_REG, CYREG_B0_UDB03_04_F1 -.set scsiTarget_datapath__A0_A1_REG, CYREG_B0_UDB03_A0_A1 -.set scsiTarget_datapath__A0_REG, CYREG_B0_UDB03_A0 -.set scsiTarget_datapath__A1_REG, CYREG_B0_UDB03_A1 -.set scsiTarget_datapath__D0_D1_REG, CYREG_B0_UDB03_D0_D1 -.set scsiTarget_datapath__D0_REG, CYREG_B0_UDB03_D0 -.set scsiTarget_datapath__D1_REG, CYREG_B0_UDB03_D1 -.set scsiTarget_datapath__DP_AUX_CTL_REG, CYREG_B0_UDB03_ACTL -.set scsiTarget_datapath__F0_F1_REG, CYREG_B0_UDB03_F0_F1 -.set scsiTarget_datapath__F0_REG, CYREG_B0_UDB03_F0 -.set scsiTarget_datapath__F1_REG, CYREG_B0_UDB03_F1 -.set scsiTarget_datapath__MSK_DP_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL -.set scsiTarget_datapath__PER_DP_AUX_CTL_REG, CYREG_B0_UDB03_MSK_ACTL +.set scsiTarget_StatusReg__MASK_REG, CYREG_B0_UDB13_MSK +.set scsiTarget_StatusReg__STATUS_AUX_CTL_REG, CYREG_B0_UDB13_ACTL +.set scsiTarget_StatusReg__STATUS_REG, CYREG_B0_UDB13_ST +.set scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG, CYREG_B0_UDB12_13_ACTL +.set scsiTarget_datapath_PI__16BIT_STATUS_REG, CYREG_B0_UDB12_13_ST +.set scsiTarget_datapath_PI__MASK_REG, CYREG_B0_UDB12_MSK +.set scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG, CYREG_B0_UDB12_MSK_ACTL +.set scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG, CYREG_B0_UDB12_MSK_ACTL +.set scsiTarget_datapath_PI__STATUS_AUX_CTL_REG, CYREG_B0_UDB12_ACTL +.set scsiTarget_datapath_PI__STATUS_CNT_REG, CYREG_B0_UDB12_ST_CTL +.set scsiTarget_datapath_PI__STATUS_CONTROL_REG, CYREG_B0_UDB12_ST_CTL +.set scsiTarget_datapath_PI__STATUS_REG, CYREG_B0_UDB12_ST +.set scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB12_13_ACTL +.set scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB12_13_CTL +.set scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB12_13_CTL +.set scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB12_13_CTL +.set scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB12_13_CTL +.set scsiTarget_datapath_PO__16BIT_MASK_MASK_REG, CYREG_B0_UDB12_13_MSK +.set scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB12_13_MSK +.set scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB12_13_MSK +.set scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB12_13_MSK +.set scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG, CYREG_B0_UDB12_ACTL +.set scsiTarget_datapath_PO__CONTROL_REG, CYREG_B0_UDB12_CTL +.set scsiTarget_datapath_PO__CONTROL_ST_REG, CYREG_B0_UDB12_ST_CTL +.set scsiTarget_datapath_PO__COUNT_REG, CYREG_B0_UDB12_CTL +.set scsiTarget_datapath_PO__COUNT_ST_REG, CYREG_B0_UDB12_ST_CTL +.set scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB12_MSK_ACTL +.set scsiTarget_datapath_PO__PERIOD_REG, CYREG_B0_UDB12_MSK +.set scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB12_MSK_ACTL +.set scsiTarget_datapath__16BIT_A0_REG, CYREG_B0_UDB12_13_A0 +.set scsiTarget_datapath__16BIT_A1_REG, CYREG_B0_UDB12_13_A1 +.set scsiTarget_datapath__16BIT_D0_REG, CYREG_B0_UDB12_13_D0 +.set scsiTarget_datapath__16BIT_D1_REG, CYREG_B0_UDB12_13_D1 +.set scsiTarget_datapath__16BIT_DP_AUX_CTL_REG, CYREG_B0_UDB12_13_ACTL +.set scsiTarget_datapath__16BIT_F0_REG, CYREG_B0_UDB12_13_F0 +.set scsiTarget_datapath__16BIT_F1_REG, CYREG_B0_UDB12_13_F1 +.set scsiTarget_datapath__A0_A1_REG, CYREG_B0_UDB12_A0_A1 +.set scsiTarget_datapath__A0_REG, CYREG_B0_UDB12_A0 +.set scsiTarget_datapath__A1_REG, CYREG_B0_UDB12_A1 +.set scsiTarget_datapath__D0_D1_REG, CYREG_B0_UDB12_D0_D1 +.set scsiTarget_datapath__D0_REG, CYREG_B0_UDB12_D0 +.set scsiTarget_datapath__D1_REG, CYREG_B0_UDB12_D1 +.set scsiTarget_datapath__DP_AUX_CTL_REG, CYREG_B0_UDB12_ACTL +.set scsiTarget_datapath__F0_F1_REG, CYREG_B0_UDB12_F0_F1 +.set scsiTarget_datapath__F0_REG, CYREG_B0_UDB12_F0 +.set scsiTarget_datapath__F1_REG, CYREG_B0_UDB12_F1 +.set scsiTarget_datapath__MSK_DP_AUX_CTL_REG, CYREG_B0_UDB12_MSK_ACTL +.set scsiTarget_datapath__PER_DP_AUX_CTL_REG, CYREG_B0_UDB12_MSK_ACTL /* SD_Clk_Ctl */ .set SD_Clk_Ctl_Sync_ctrl_reg__0__MASK, 0x01 .set SD_Clk_Ctl_Sync_ctrl_reg__0__POS, 0 -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB01_02_ACTL -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB01_02_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB01_02_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB01_02_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB01_02_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG, CYREG_B0_UDB01_02_MSK -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB01_02_MSK -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB01_02_MSK -.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB01_02_MSK -.set SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG, CYREG_B0_UDB01_ACTL -.set SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG, CYREG_B0_UDB01_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG, CYREG_B0_UDB01_ST_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG, CYREG_B0_UDB01_CTL -.set SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG, CYREG_B0_UDB01_ST_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG, CYREG_B0_UDB02_03_ACTL +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG, CYREG_B0_UDB02_03_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG, CYREG_B0_UDB02_03_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG, CYREG_B0_UDB02_03_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG, CYREG_B0_UDB02_03_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG, CYREG_B0_UDB02_03_MSK +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG, CYREG_B0_UDB02_03_MSK +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG, CYREG_B0_UDB02_03_MSK +.set SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG, CYREG_B0_UDB02_03_MSK +.set SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG, CYREG_B0_UDB02_ACTL +.set SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG, CYREG_B0_UDB02_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG, CYREG_B0_UDB02_ST_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG, CYREG_B0_UDB02_CTL +.set SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG, CYREG_B0_UDB02_ST_CTL .set SD_Clk_Ctl_Sync_ctrl_reg__MASK, 0x01 -.set SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB01_MSK_ACTL -.set SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG, CYREG_B0_UDB01_MSK -.set SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB01_MSK_ACTL +.set SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG, CYREG_B0_UDB02_MSK_ACTL +.set SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG, CYREG_B0_UDB02_MSK +.set SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG, CYREG_B0_UDB02_MSK_ACTL /* USBFS_ep_0 */ .set USBFS_ep_0__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 @@ -1138,23 +1233,43 @@ /* USBFS_ep_1 */ .set USBFS_ep_1__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 .set USBFS_ep_1__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_ep_1__INTC_MASK, 0x01 -.set USBFS_ep_1__INTC_NUMBER, 0 +.set USBFS_ep_1__INTC_MASK, 0x02 +.set USBFS_ep_1__INTC_NUMBER, 1 .set USBFS_ep_1__INTC_PRIOR_NUM, 7 -.set USBFS_ep_1__INTC_PRIOR_REG, CYREG_NVIC_PRI_0 +.set USBFS_ep_1__INTC_PRIOR_REG, CYREG_NVIC_PRI_1 .set USBFS_ep_1__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 .set USBFS_ep_1__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 /* USBFS_ep_2 */ .set USBFS_ep_2__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 .set USBFS_ep_2__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_ep_2__INTC_MASK, 0x02 -.set USBFS_ep_2__INTC_NUMBER, 1 +.set USBFS_ep_2__INTC_MASK, 0x04 +.set USBFS_ep_2__INTC_NUMBER, 2 .set USBFS_ep_2__INTC_PRIOR_NUM, 7 -.set USBFS_ep_2__INTC_PRIOR_REG, CYREG_NVIC_PRI_1 +.set USBFS_ep_2__INTC_PRIOR_REG, CYREG_NVIC_PRI_2 .set USBFS_ep_2__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 .set USBFS_ep_2__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 +/* USBFS_ep_3 */ +.set USBFS_ep_3__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set USBFS_ep_3__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set USBFS_ep_3__INTC_MASK, 0x08 +.set USBFS_ep_3__INTC_NUMBER, 3 +.set USBFS_ep_3__INTC_PRIOR_NUM, 7 +.set USBFS_ep_3__INTC_PRIOR_REG, CYREG_NVIC_PRI_3 +.set USBFS_ep_3__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_ep_3__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 + +/* USBFS_ep_4 */ +.set USBFS_ep_4__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set USBFS_ep_4__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set USBFS_ep_4__INTC_MASK, 0x10 +.set USBFS_ep_4__INTC_NUMBER, 4 +.set USBFS_ep_4__INTC_PRIOR_NUM, 7 +.set USBFS_ep_4__INTC_PRIOR_REG, CYREG_NVIC_PRI_4 +.set USBFS_ep_4__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_ep_4__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 + /* USBFS_USB */ .set USBFS_USB__ARB_CFG, CYREG_USB_ARB_CFG .set USBFS_USB__ARB_EP1_CFG, CYREG_USB_ARB_EP1_CFG @@ -2735,9 +2850,9 @@ .set CYDEV_DEBUG_ENABLE_REGISTER, CYREG_MLOGIC_DEBUG .set CYDEV_DMA_CHANNELS_AVAILABLE, 24 .set CYDEV_ECC_ENABLE, 0 -.set CYDEV_HEAP_SIZE, 0x0256 +.set CYDEV_HEAP_SIZE, 0x0400 .set CYDEV_INSTRUCT_CACHE_ENABLED, 1 -.set CYDEV_INTR_RISING, 0x00000000 +.set CYDEV_INTR_RISING, 0x00000001 .set CYDEV_PROJ_TYPE, 2 .set CYDEV_PROJ_TYPE_BOOTLOADER, 1 .set CYDEV_PROJ_TYPE_LOADABLE, 2 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc index cb21614b..93e34301 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc @@ -3,6 +3,34 @@ INCLUDE cydeviceiar.inc INCLUDE cydeviceiar_trm.inc +/* Debug_Timer_Interrupt */ +Debug_Timer_Interrupt__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +Debug_Timer_Interrupt__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +Debug_Timer_Interrupt__INTC_MASK EQU 0x01 +Debug_Timer_Interrupt__INTC_NUMBER EQU 0 +Debug_Timer_Interrupt__INTC_PRIOR_NUM EQU 7 +Debug_Timer_Interrupt__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 +Debug_Timer_Interrupt__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +Debug_Timer_Interrupt__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 + +/* Debug_Timer_TimerHW */ +Debug_Timer_TimerHW__CAP0 EQU CYREG_TMR0_CAP0 +Debug_Timer_TimerHW__CAP1 EQU CYREG_TMR0_CAP1 +Debug_Timer_TimerHW__CFG0 EQU CYREG_TMR0_CFG0 +Debug_Timer_TimerHW__CFG1 EQU CYREG_TMR0_CFG1 +Debug_Timer_TimerHW__CFG2 EQU CYREG_TMR0_CFG2 +Debug_Timer_TimerHW__CNT_CMP0 EQU CYREG_TMR0_CNT_CMP0 +Debug_Timer_TimerHW__CNT_CMP1 EQU CYREG_TMR0_CNT_CMP1 +Debug_Timer_TimerHW__PER0 EQU CYREG_TMR0_PER0 +Debug_Timer_TimerHW__PER1 EQU CYREG_TMR0_PER1 +Debug_Timer_TimerHW__PM_ACT_CFG EQU CYREG_PM_ACT_CFG3 +Debug_Timer_TimerHW__PM_ACT_MSK EQU 0x01 +Debug_Timer_TimerHW__PM_STBY_CFG EQU CYREG_PM_STBY_CFG3 +Debug_Timer_TimerHW__PM_STBY_MSK EQU 0x01 +Debug_Timer_TimerHW__RT0 EQU CYREG_TMR0_RT0 +Debug_Timer_TimerHW__RT1 EQU CYREG_TMR0_RT1 +Debug_Timer_TimerHW__SR0 EQU CYREG_TMR0_SR0 + /* USBFS_bus_reset */ USBFS_bus_reset__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 USBFS_bus_reset__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 @@ -16,28 +44,64 @@ USBFS_bus_reset__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 /* SCSI_CTL_PHASE */ SCSI_CTL_PHASE_Sync_ctrl_reg__0__MASK EQU 0x01 SCSI_CTL_PHASE_Sync_ctrl_reg__0__POS EQU 0 -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_03_ACTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB02_03_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB02_03_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB05_06_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB05_06_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB05_06_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB05_06_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB05_06_MSK SCSI_CTL_PHASE_Sync_ctrl_reg__1__MASK EQU 0x02 SCSI_CTL_PHASE_Sync_ctrl_reg__1__POS EQU 1 SCSI_CTL_PHASE_Sync_ctrl_reg__2__MASK EQU 0x04 SCSI_CTL_PHASE_Sync_ctrl_reg__2__POS EQU 2 -SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_ACTL -SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB02_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB02_ST_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB02_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB02_ST_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB05_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB05_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB05_ST_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB05_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB05_ST_CTL SCSI_CTL_PHASE_Sync_ctrl_reg__MASK EQU 0x07 -SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL -SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB02_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB05_MSK_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB05_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB05_MSK_ACTL + +/* SCSI_Out_Bits */ +SCSI_Out_Bits_Sync_ctrl_reg__0__MASK EQU 0x01 +SCSI_Out_Bits_Sync_ctrl_reg__0__POS EQU 0 +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB00_01_ACTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__1__MASK EQU 0x02 +SCSI_Out_Bits_Sync_ctrl_reg__1__POS EQU 1 +SCSI_Out_Bits_Sync_ctrl_reg__2__MASK EQU 0x04 +SCSI_Out_Bits_Sync_ctrl_reg__2__POS EQU 2 +SCSI_Out_Bits_Sync_ctrl_reg__3__MASK EQU 0x08 +SCSI_Out_Bits_Sync_ctrl_reg__3__POS EQU 3 +SCSI_Out_Bits_Sync_ctrl_reg__4__MASK EQU 0x10 +SCSI_Out_Bits_Sync_ctrl_reg__4__POS EQU 4 +SCSI_Out_Bits_Sync_ctrl_reg__5__MASK EQU 0x20 +SCSI_Out_Bits_Sync_ctrl_reg__5__POS EQU 5 +SCSI_Out_Bits_Sync_ctrl_reg__6__MASK EQU 0x40 +SCSI_Out_Bits_Sync_ctrl_reg__6__POS EQU 6 +SCSI_Out_Bits_Sync_ctrl_reg__7__MASK EQU 0x80 +SCSI_Out_Bits_Sync_ctrl_reg__7__POS EQU 7 +SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB00_ACTL +SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB00_CTL +SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB00_ST_CTL +SCSI_Out_Bits_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB00_CTL +SCSI_Out_Bits_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB00_ST_CTL +SCSI_Out_Bits_Sync_ctrl_reg__MASK EQU 0xFF +SCSI_Out_Bits_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB00_MSK_ACTL +SCSI_Out_Bits_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB00_MSK +SCSI_Out_Bits_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB00_MSK_ACTL /* USBFS_arb_int */ USBFS_arb_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -59,6 +123,28 @@ USBFS_sof_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_21 USBFS_sof_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 USBFS_sof_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +/* SCSI_Out_Ctl */ +SCSI_Out_Ctl_Sync_ctrl_reg__0__MASK EQU 0x01 +SCSI_Out_Ctl_Sync_ctrl_reg__0__POS EQU 0 +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL +SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB03_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB03_ST_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB03_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB03_ST_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__MASK EQU 0x01 +SCSI_Out_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL +SCSI_Out_Ctl_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB03_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL + /* SCSI_Out_DBx */ SCSI_Out_DBx__0__AG EQU CYREG_PRT6_AG SCSI_Out_DBx__0__AMUX EQU CYREG_PRT6_AMUX @@ -504,34 +590,34 @@ SCSI_RST_ISR__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 SCSI_RST_ISR__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 /* SDCard_BSPIM */ -SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB07_08_ACTL -SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG EQU CYREG_B0_UDB07_08_ST -SDCard_BSPIM_BitCounter_ST__MASK_REG EQU CYREG_B0_UDB07_MSK -SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB07_ACTL -SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter_ST__STATUS_REG EQU CYREG_B0_UDB07_ST -SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB07_08_ACTL -SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB07_ACTL -SDCard_BSPIM_BitCounter__CONTROL_REG EQU CYREG_B0_UDB07_CTL -SDCard_BSPIM_BitCounter__CONTROL_ST_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter__COUNT_REG EQU CYREG_B0_UDB07_CTL -SDCard_BSPIM_BitCounter__COUNT_ST_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_BitCounter__PERIOD_REG EQU CYREG_B0_UDB07_MSK -SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_05_ACTL -SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG EQU CYREG_B0_UDB04_05_ST +SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B1_UDB06_07_ACTL +SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG EQU CYREG_B1_UDB06_07_ST +SDCard_BSPIM_BitCounter_ST__MASK_REG EQU CYREG_B1_UDB06_MSK +SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG EQU CYREG_B1_UDB06_ACTL +SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter_ST__STATUS_REG EQU CYREG_B1_UDB06_ST +SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B1_UDB06_07_ACTL +SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG EQU CYREG_B1_UDB06_ACTL +SDCard_BSPIM_BitCounter__CONTROL_REG EQU CYREG_B1_UDB06_CTL +SDCard_BSPIM_BitCounter__CONTROL_ST_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter__COUNT_REG EQU CYREG_B1_UDB06_CTL +SDCard_BSPIM_BitCounter__COUNT_ST_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_BitCounter__PERIOD_REG EQU CYREG_B1_UDB06_MSK +SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB06_07_ACTL +SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG EQU CYREG_B0_UDB06_07_ST SDCard_BSPIM_RxStsReg__4__MASK EQU 0x10 SDCard_BSPIM_RxStsReg__4__POS EQU 4 SDCard_BSPIM_RxStsReg__5__MASK EQU 0x20 @@ -539,13 +625,13 @@ SDCard_BSPIM_RxStsReg__5__POS EQU 5 SDCard_BSPIM_RxStsReg__6__MASK EQU 0x40 SDCard_BSPIM_RxStsReg__6__POS EQU 6 SDCard_BSPIM_RxStsReg__MASK EQU 0x70 -SDCard_BSPIM_RxStsReg__MASK_REG EQU CYREG_B0_UDB04_MSK -SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_ACTL -SDCard_BSPIM_RxStsReg__STATUS_REG EQU CYREG_B0_UDB04_ST +SDCard_BSPIM_RxStsReg__MASK_REG EQU CYREG_B0_UDB06_MSK +SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB06_ACTL +SDCard_BSPIM_RxStsReg__STATUS_REG EQU CYREG_B0_UDB06_ST SDCard_BSPIM_TxStsReg__0__MASK EQU 0x01 SDCard_BSPIM_TxStsReg__0__POS EQU 0 -SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B1_UDB07_08_ACTL -SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG EQU CYREG_B1_UDB07_08_ST +SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_05_ACTL +SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG EQU CYREG_B0_UDB04_05_ST SDCard_BSPIM_TxStsReg__1__MASK EQU 0x02 SDCard_BSPIM_TxStsReg__1__POS EQU 1 SDCard_BSPIM_TxStsReg__2__MASK EQU 0x04 @@ -555,28 +641,26 @@ SDCard_BSPIM_TxStsReg__3__POS EQU 3 SDCard_BSPIM_TxStsReg__4__MASK EQU 0x10 SDCard_BSPIM_TxStsReg__4__POS EQU 4 SDCard_BSPIM_TxStsReg__MASK EQU 0x1F -SDCard_BSPIM_TxStsReg__MASK_REG EQU CYREG_B1_UDB07_MSK -SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B1_UDB07_ACTL -SDCard_BSPIM_TxStsReg__STATUS_REG EQU CYREG_B1_UDB07_ST -SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG EQU CYREG_B0_UDB07_08_A0 -SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG EQU CYREG_B0_UDB07_08_A1 -SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG EQU CYREG_B0_UDB07_08_D0 -SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG EQU CYREG_B0_UDB07_08_D1 -SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB07_08_ACTL -SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG EQU CYREG_B0_UDB07_08_F0 -SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG EQU CYREG_B0_UDB07_08_F1 -SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG EQU CYREG_B0_UDB07_A0_A1 -SDCard_BSPIM_sR8_Dp_u0__A0_REG EQU CYREG_B0_UDB07_A0 -SDCard_BSPIM_sR8_Dp_u0__A1_REG EQU CYREG_B0_UDB07_A1 -SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG EQU CYREG_B0_UDB07_D0_D1 -SDCard_BSPIM_sR8_Dp_u0__D0_REG EQU CYREG_B0_UDB07_D0 -SDCard_BSPIM_sR8_Dp_u0__D1_REG EQU CYREG_B0_UDB07_D1 -SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG EQU CYREG_B0_UDB07_ACTL -SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG EQU CYREG_B0_UDB07_F0_F1 -SDCard_BSPIM_sR8_Dp_u0__F0_REG EQU CYREG_B0_UDB07_F0 -SDCard_BSPIM_sR8_Dp_u0__F1_REG EQU CYREG_B0_UDB07_F1 -SDCard_BSPIM_sR8_Dp_u0__MSK_DP_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_sR8_Dp_u0__PER_DP_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL +SDCard_BSPIM_TxStsReg__MASK_REG EQU CYREG_B0_UDB04_MSK +SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_ACTL +SDCard_BSPIM_TxStsReg__STATUS_REG EQU CYREG_B0_UDB04_ST +SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG EQU CYREG_B0_UDB06_07_A0 +SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG EQU CYREG_B0_UDB06_07_A1 +SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG EQU CYREG_B0_UDB06_07_D0 +SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG EQU CYREG_B0_UDB06_07_D1 +SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB06_07_ACTL +SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG EQU CYREG_B0_UDB06_07_F0 +SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG EQU CYREG_B0_UDB06_07_F1 +SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG EQU CYREG_B0_UDB06_A0_A1 +SDCard_BSPIM_sR8_Dp_u0__A0_REG EQU CYREG_B0_UDB06_A0 +SDCard_BSPIM_sR8_Dp_u0__A1_REG EQU CYREG_B0_UDB06_A1 +SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG EQU CYREG_B0_UDB06_D0_D1 +SDCard_BSPIM_sR8_Dp_u0__D0_REG EQU CYREG_B0_UDB06_D0 +SDCard_BSPIM_sR8_Dp_u0__D1_REG EQU CYREG_B0_UDB06_D1 +SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG EQU CYREG_B0_UDB06_ACTL +SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG EQU CYREG_B0_UDB06_F0_F1 +SDCard_BSPIM_sR8_Dp_u0__F0_REG EQU CYREG_B0_UDB06_F0 +SDCard_BSPIM_sR8_Dp_u0__F1_REG EQU CYREG_B0_UDB06_F1 /* USBFS_dp_int */ USBFS_dp_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -1032,21 +1116,32 @@ SD_Data_Clk__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 SD_Data_Clk__PM_STBY_MSK EQU 0x01 /* SD_Init_Clk */ -SD_Init_Clk__CFG0 EQU CYREG_CLKDIST_DCFG2_CFG0 -SD_Init_Clk__CFG1 EQU CYREG_CLKDIST_DCFG2_CFG1 -SD_Init_Clk__CFG2 EQU CYREG_CLKDIST_DCFG2_CFG2 +SD_Init_Clk__CFG0 EQU CYREG_CLKDIST_DCFG3_CFG0 +SD_Init_Clk__CFG1 EQU CYREG_CLKDIST_DCFG3_CFG1 +SD_Init_Clk__CFG2 EQU CYREG_CLKDIST_DCFG3_CFG2 SD_Init_Clk__CFG2_SRC_SEL_MASK EQU 0x07 -SD_Init_Clk__INDEX EQU 0x02 +SD_Init_Clk__INDEX EQU 0x03 SD_Init_Clk__PM_ACT_CFG EQU CYREG_PM_ACT_CFG2 -SD_Init_Clk__PM_ACT_MSK EQU 0x04 +SD_Init_Clk__PM_ACT_MSK EQU 0x08 SD_Init_Clk__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 -SD_Init_Clk__PM_STBY_MSK EQU 0x04 +SD_Init_Clk__PM_STBY_MSK EQU 0x08 + +/* timer_clock */ +timer_clock__CFG0 EQU CYREG_CLKDIST_DCFG2_CFG0 +timer_clock__CFG1 EQU CYREG_CLKDIST_DCFG2_CFG1 +timer_clock__CFG2 EQU CYREG_CLKDIST_DCFG2_CFG2 +timer_clock__CFG2_SRC_SEL_MASK EQU 0x07 +timer_clock__INDEX EQU 0x02 +timer_clock__PM_ACT_CFG EQU CYREG_PM_ACT_CFG2 +timer_clock__PM_ACT_MSK EQU 0x04 +timer_clock__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 +timer_clock__PM_STBY_MSK EQU 0x04 /* scsiTarget */ scsiTarget_StatusReg__0__MASK EQU 0x01 scsiTarget_StatusReg__0__POS EQU 0 -scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL -scsiTarget_StatusReg__16BIT_STATUS_REG EQU CYREG_B0_UDB12_13_ST +scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB13_14_ACTL +scsiTarget_StatusReg__16BIT_STATUS_REG EQU CYREG_B0_UDB13_14_ST scsiTarget_StatusReg__1__MASK EQU 0x02 scsiTarget_StatusReg__1__POS EQU 1 scsiTarget_StatusReg__2__MASK EQU 0x04 @@ -1054,76 +1149,76 @@ scsiTarget_StatusReg__2__POS EQU 2 scsiTarget_StatusReg__3__MASK EQU 0x08 scsiTarget_StatusReg__3__POS EQU 3 scsiTarget_StatusReg__MASK EQU 0x0F -scsiTarget_StatusReg__MASK_REG EQU CYREG_B0_UDB12_MSK -scsiTarget_StatusReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL -scsiTarget_StatusReg__STATUS_REG EQU CYREG_B0_UDB12_ST -scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL -scsiTarget_datapath_PI__16BIT_STATUS_REG EQU CYREG_B0_UDB03_04_ST -scsiTarget_datapath_PI__MASK_REG EQU CYREG_B0_UDB03_MSK -scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath_PI__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL -scsiTarget_datapath_PI__STATUS_CNT_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PI__STATUS_CONTROL_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PI__STATUS_REG EQU CYREG_B0_UDB03_ST -scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL -scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL -scsiTarget_datapath_PO__CONTROL_REG EQU CYREG_B0_UDB03_CTL -scsiTarget_datapath_PO__CONTROL_ST_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PO__COUNT_REG EQU CYREG_B0_UDB03_CTL -scsiTarget_datapath_PO__COUNT_ST_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath_PO__PERIOD_REG EQU CYREG_B0_UDB03_MSK -scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath__16BIT_A0_REG EQU CYREG_B0_UDB03_04_A0 -scsiTarget_datapath__16BIT_A1_REG EQU CYREG_B0_UDB03_04_A1 -scsiTarget_datapath__16BIT_D0_REG EQU CYREG_B0_UDB03_04_D0 -scsiTarget_datapath__16BIT_D1_REG EQU CYREG_B0_UDB03_04_D1 -scsiTarget_datapath__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL -scsiTarget_datapath__16BIT_F0_REG EQU CYREG_B0_UDB03_04_F0 -scsiTarget_datapath__16BIT_F1_REG EQU CYREG_B0_UDB03_04_F1 -scsiTarget_datapath__A0_A1_REG EQU CYREG_B0_UDB03_A0_A1 -scsiTarget_datapath__A0_REG EQU CYREG_B0_UDB03_A0 -scsiTarget_datapath__A1_REG EQU CYREG_B0_UDB03_A1 -scsiTarget_datapath__D0_D1_REG EQU CYREG_B0_UDB03_D0_D1 -scsiTarget_datapath__D0_REG EQU CYREG_B0_UDB03_D0 -scsiTarget_datapath__D1_REG EQU CYREG_B0_UDB03_D1 -scsiTarget_datapath__DP_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL -scsiTarget_datapath__F0_F1_REG EQU CYREG_B0_UDB03_F0_F1 -scsiTarget_datapath__F0_REG EQU CYREG_B0_UDB03_F0 -scsiTarget_datapath__F1_REG EQU CYREG_B0_UDB03_F1 -scsiTarget_datapath__MSK_DP_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath__PER_DP_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL +scsiTarget_StatusReg__MASK_REG EQU CYREG_B0_UDB13_MSK +scsiTarget_StatusReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB13_ACTL +scsiTarget_StatusReg__STATUS_REG EQU CYREG_B0_UDB13_ST +scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL +scsiTarget_datapath_PI__16BIT_STATUS_REG EQU CYREG_B0_UDB12_13_ST +scsiTarget_datapath_PI__MASK_REG EQU CYREG_B0_UDB12_MSK +scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath_PI__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL +scsiTarget_datapath_PI__STATUS_CNT_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PI__STATUS_CONTROL_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PI__STATUS_REG EQU CYREG_B0_UDB12_ST +scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL +scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL +scsiTarget_datapath_PO__CONTROL_REG EQU CYREG_B0_UDB12_CTL +scsiTarget_datapath_PO__CONTROL_ST_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PO__COUNT_REG EQU CYREG_B0_UDB12_CTL +scsiTarget_datapath_PO__COUNT_ST_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath_PO__PERIOD_REG EQU CYREG_B0_UDB12_MSK +scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath__16BIT_A0_REG EQU CYREG_B0_UDB12_13_A0 +scsiTarget_datapath__16BIT_A1_REG EQU CYREG_B0_UDB12_13_A1 +scsiTarget_datapath__16BIT_D0_REG EQU CYREG_B0_UDB12_13_D0 +scsiTarget_datapath__16BIT_D1_REG EQU CYREG_B0_UDB12_13_D1 +scsiTarget_datapath__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL +scsiTarget_datapath__16BIT_F0_REG EQU CYREG_B0_UDB12_13_F0 +scsiTarget_datapath__16BIT_F1_REG EQU CYREG_B0_UDB12_13_F1 +scsiTarget_datapath__A0_A1_REG EQU CYREG_B0_UDB12_A0_A1 +scsiTarget_datapath__A0_REG EQU CYREG_B0_UDB12_A0 +scsiTarget_datapath__A1_REG EQU CYREG_B0_UDB12_A1 +scsiTarget_datapath__D0_D1_REG EQU CYREG_B0_UDB12_D0_D1 +scsiTarget_datapath__D0_REG EQU CYREG_B0_UDB12_D0 +scsiTarget_datapath__D1_REG EQU CYREG_B0_UDB12_D1 +scsiTarget_datapath__DP_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL +scsiTarget_datapath__F0_F1_REG EQU CYREG_B0_UDB12_F0_F1 +scsiTarget_datapath__F0_REG EQU CYREG_B0_UDB12_F0 +scsiTarget_datapath__F1_REG EQU CYREG_B0_UDB12_F1 +scsiTarget_datapath__MSK_DP_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath__PER_DP_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL /* SD_Clk_Ctl */ SD_Clk_Ctl_Sync_ctrl_reg__0__MASK EQU 0x01 SD_Clk_Ctl_Sync_ctrl_reg__0__POS EQU 0 -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB01_02_ACTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB01_ACTL -SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB01_CTL -SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB01_ST_CTL -SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB01_CTL -SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB01_ST_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_03_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB02_CTL +SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB02_ST_CTL +SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB02_CTL +SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB02_ST_CTL SD_Clk_Ctl_Sync_ctrl_reg__MASK EQU 0x01 -SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB01_MSK_ACTL -SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB01_MSK -SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB01_MSK_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB02_MSK +SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL /* USBFS_ep_0 */ USBFS_ep_0__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -1138,23 +1233,43 @@ USBFS_ep_0__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 /* USBFS_ep_1 */ USBFS_ep_1__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 USBFS_ep_1__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_ep_1__INTC_MASK EQU 0x01 -USBFS_ep_1__INTC_NUMBER EQU 0 +USBFS_ep_1__INTC_MASK EQU 0x02 +USBFS_ep_1__INTC_NUMBER EQU 1 USBFS_ep_1__INTC_PRIOR_NUM EQU 7 -USBFS_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 +USBFS_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_1 USBFS_ep_1__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 USBFS_ep_1__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 /* USBFS_ep_2 */ USBFS_ep_2__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 USBFS_ep_2__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_ep_2__INTC_MASK EQU 0x02 -USBFS_ep_2__INTC_NUMBER EQU 1 +USBFS_ep_2__INTC_MASK EQU 0x04 +USBFS_ep_2__INTC_NUMBER EQU 2 USBFS_ep_2__INTC_PRIOR_NUM EQU 7 -USBFS_ep_2__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_1 +USBFS_ep_2__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_2 USBFS_ep_2__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 USBFS_ep_2__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +/* USBFS_ep_3 */ +USBFS_ep_3__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_ep_3__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_ep_3__INTC_MASK EQU 0x08 +USBFS_ep_3__INTC_NUMBER EQU 3 +USBFS_ep_3__INTC_PRIOR_NUM EQU 7 +USBFS_ep_3__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_3 +USBFS_ep_3__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_3__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 + +/* USBFS_ep_4 */ +USBFS_ep_4__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_ep_4__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_ep_4__INTC_MASK EQU 0x10 +USBFS_ep_4__INTC_NUMBER EQU 4 +USBFS_ep_4__INTC_PRIOR_NUM EQU 7 +USBFS_ep_4__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_4 +USBFS_ep_4__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_4__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 + /* USBFS_USB */ USBFS_USB__ARB_CFG EQU CYREG_USB_ARB_CFG USBFS_USB__ARB_EP1_CFG EQU CYREG_USB_ARB_EP1_CFG @@ -2735,9 +2850,9 @@ CYDEV_DEBUG_ENABLE_MASK EQU 0x20 CYDEV_DEBUG_ENABLE_REGISTER EQU CYREG_MLOGIC_DEBUG CYDEV_DMA_CHANNELS_AVAILABLE EQU 24 CYDEV_ECC_ENABLE EQU 0 -CYDEV_HEAP_SIZE EQU 0x0256 +CYDEV_HEAP_SIZE EQU 0x0400 CYDEV_INSTRUCT_CACHE_ENABLED EQU 1 -CYDEV_INTR_RISING EQU 0x00000000 +CYDEV_INTR_RISING EQU 0x00000001 CYDEV_PROJ_TYPE EQU 2 CYDEV_PROJ_TYPE_BOOTLOADER EQU 1 CYDEV_PROJ_TYPE_LOADABLE EQU 2 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc index 0e830b1a..37687617 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc @@ -3,6 +3,34 @@ INCLUDED_CYFITTERRV_INC EQU 1 GET cydevicerv.inc GET cydevicerv_trm.inc +; Debug_Timer_Interrupt +Debug_Timer_Interrupt__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +Debug_Timer_Interrupt__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +Debug_Timer_Interrupt__INTC_MASK EQU 0x01 +Debug_Timer_Interrupt__INTC_NUMBER EQU 0 +Debug_Timer_Interrupt__INTC_PRIOR_NUM EQU 7 +Debug_Timer_Interrupt__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 +Debug_Timer_Interrupt__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +Debug_Timer_Interrupt__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 + +; Debug_Timer_TimerHW +Debug_Timer_TimerHW__CAP0 EQU CYREG_TMR0_CAP0 +Debug_Timer_TimerHW__CAP1 EQU CYREG_TMR0_CAP1 +Debug_Timer_TimerHW__CFG0 EQU CYREG_TMR0_CFG0 +Debug_Timer_TimerHW__CFG1 EQU CYREG_TMR0_CFG1 +Debug_Timer_TimerHW__CFG2 EQU CYREG_TMR0_CFG2 +Debug_Timer_TimerHW__CNT_CMP0 EQU CYREG_TMR0_CNT_CMP0 +Debug_Timer_TimerHW__CNT_CMP1 EQU CYREG_TMR0_CNT_CMP1 +Debug_Timer_TimerHW__PER0 EQU CYREG_TMR0_PER0 +Debug_Timer_TimerHW__PER1 EQU CYREG_TMR0_PER1 +Debug_Timer_TimerHW__PM_ACT_CFG EQU CYREG_PM_ACT_CFG3 +Debug_Timer_TimerHW__PM_ACT_MSK EQU 0x01 +Debug_Timer_TimerHW__PM_STBY_CFG EQU CYREG_PM_STBY_CFG3 +Debug_Timer_TimerHW__PM_STBY_MSK EQU 0x01 +Debug_Timer_TimerHW__RT0 EQU CYREG_TMR0_RT0 +Debug_Timer_TimerHW__RT1 EQU CYREG_TMR0_RT1 +Debug_Timer_TimerHW__SR0 EQU CYREG_TMR0_SR0 + ; USBFS_bus_reset USBFS_bus_reset__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 USBFS_bus_reset__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 @@ -16,28 +44,64 @@ USBFS_bus_reset__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 ; SCSI_CTL_PHASE SCSI_CTL_PHASE_Sync_ctrl_reg__0__MASK EQU 0x01 SCSI_CTL_PHASE_Sync_ctrl_reg__0__POS EQU 0 -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_03_ACTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB02_03_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB02_03_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB02_03_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB05_06_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB05_06_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB05_06_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB05_06_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB05_06_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB05_06_MSK SCSI_CTL_PHASE_Sync_ctrl_reg__1__MASK EQU 0x02 SCSI_CTL_PHASE_Sync_ctrl_reg__1__POS EQU 1 SCSI_CTL_PHASE_Sync_ctrl_reg__2__MASK EQU 0x04 SCSI_CTL_PHASE_Sync_ctrl_reg__2__POS EQU 2 -SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_ACTL -SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB02_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB02_ST_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB02_CTL -SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB02_ST_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB05_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB05_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB05_ST_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB05_CTL +SCSI_CTL_PHASE_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB05_ST_CTL SCSI_CTL_PHASE_Sync_ctrl_reg__MASK EQU 0x07 -SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL -SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB02_MSK -SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB05_MSK_ACTL +SCSI_CTL_PHASE_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB05_MSK +SCSI_CTL_PHASE_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB05_MSK_ACTL + +; SCSI_Out_Bits +SCSI_Out_Bits_Sync_ctrl_reg__0__MASK EQU 0x01 +SCSI_Out_Bits_Sync_ctrl_reg__0__POS EQU 0 +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB00_01_ACTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB00_01_CTL +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB00_01_MSK +SCSI_Out_Bits_Sync_ctrl_reg__1__MASK EQU 0x02 +SCSI_Out_Bits_Sync_ctrl_reg__1__POS EQU 1 +SCSI_Out_Bits_Sync_ctrl_reg__2__MASK EQU 0x04 +SCSI_Out_Bits_Sync_ctrl_reg__2__POS EQU 2 +SCSI_Out_Bits_Sync_ctrl_reg__3__MASK EQU 0x08 +SCSI_Out_Bits_Sync_ctrl_reg__3__POS EQU 3 +SCSI_Out_Bits_Sync_ctrl_reg__4__MASK EQU 0x10 +SCSI_Out_Bits_Sync_ctrl_reg__4__POS EQU 4 +SCSI_Out_Bits_Sync_ctrl_reg__5__MASK EQU 0x20 +SCSI_Out_Bits_Sync_ctrl_reg__5__POS EQU 5 +SCSI_Out_Bits_Sync_ctrl_reg__6__MASK EQU 0x40 +SCSI_Out_Bits_Sync_ctrl_reg__6__POS EQU 6 +SCSI_Out_Bits_Sync_ctrl_reg__7__MASK EQU 0x80 +SCSI_Out_Bits_Sync_ctrl_reg__7__POS EQU 7 +SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB00_ACTL +SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB00_CTL +SCSI_Out_Bits_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB00_ST_CTL +SCSI_Out_Bits_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB00_CTL +SCSI_Out_Bits_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB00_ST_CTL +SCSI_Out_Bits_Sync_ctrl_reg__MASK EQU 0xFF +SCSI_Out_Bits_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB00_MSK_ACTL +SCSI_Out_Bits_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB00_MSK +SCSI_Out_Bits_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB00_MSK_ACTL ; USBFS_arb_int USBFS_arb_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -59,6 +123,28 @@ USBFS_sof_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_21 USBFS_sof_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 USBFS_sof_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +; SCSI_Out_Ctl +SCSI_Out_Ctl_Sync_ctrl_reg__0__MASK EQU 0x01 +SCSI_Out_Ctl_Sync_ctrl_reg__0__POS EQU 0 +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB03_04_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL +SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB03_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB03_ST_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB03_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB03_ST_CTL +SCSI_Out_Ctl_Sync_ctrl_reg__MASK EQU 0x01 +SCSI_Out_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL +SCSI_Out_Ctl_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB03_MSK +SCSI_Out_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL + ; SCSI_Out_DBx SCSI_Out_DBx__0__AG EQU CYREG_PRT6_AG SCSI_Out_DBx__0__AMUX EQU CYREG_PRT6_AMUX @@ -504,34 +590,34 @@ SCSI_RST_ISR__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 SCSI_RST_ISR__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 ; SDCard_BSPIM -SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB07_08_ACTL -SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG EQU CYREG_B0_UDB07_08_ST -SDCard_BSPIM_BitCounter_ST__MASK_REG EQU CYREG_B0_UDB07_MSK -SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB07_ACTL -SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter_ST__STATUS_REG EQU CYREG_B0_UDB07_ST -SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB07_08_ACTL -SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB07_08_CTL -SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB07_08_MSK -SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB07_ACTL -SDCard_BSPIM_BitCounter__CONTROL_REG EQU CYREG_B0_UDB07_CTL -SDCard_BSPIM_BitCounter__CONTROL_ST_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter__COUNT_REG EQU CYREG_B0_UDB07_CTL -SDCard_BSPIM_BitCounter__COUNT_ST_REG EQU CYREG_B0_UDB07_ST_CTL -SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_BitCounter__PERIOD_REG EQU CYREG_B0_UDB07_MSK -SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_05_ACTL -SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG EQU CYREG_B0_UDB04_05_ST +SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B1_UDB06_07_ACTL +SDCard_BSPIM_BitCounter_ST__16BIT_STATUS_REG EQU CYREG_B1_UDB06_07_ST +SDCard_BSPIM_BitCounter_ST__MASK_REG EQU CYREG_B1_UDB06_MSK +SDCard_BSPIM_BitCounter_ST__MASK_ST_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_BitCounter_ST__PER_ST_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_BitCounter_ST__STATUS_AUX_CTL_REG EQU CYREG_B1_UDB06_ACTL +SDCard_BSPIM_BitCounter_ST__STATUS_CNT_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter_ST__STATUS_CONTROL_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter_ST__STATUS_REG EQU CYREG_B1_UDB06_ST +SDCard_BSPIM_BitCounter__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B1_UDB06_07_ACTL +SDCard_BSPIM_BitCounter__16BIT_CONTROL_CONTROL_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_CONTROL_COUNT_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_COUNT_CONTROL_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_COUNT_COUNT_REG EQU CYREG_B1_UDB06_07_CTL +SDCard_BSPIM_BitCounter__16BIT_MASK_MASK_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__16BIT_MASK_PERIOD_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__16BIT_PERIOD_MASK_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__16BIT_PERIOD_PERIOD_REG EQU CYREG_B1_UDB06_07_MSK +SDCard_BSPIM_BitCounter__CONTROL_AUX_CTL_REG EQU CYREG_B1_UDB06_ACTL +SDCard_BSPIM_BitCounter__CONTROL_REG EQU CYREG_B1_UDB06_CTL +SDCard_BSPIM_BitCounter__CONTROL_ST_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter__COUNT_REG EQU CYREG_B1_UDB06_CTL +SDCard_BSPIM_BitCounter__COUNT_ST_REG EQU CYREG_B1_UDB06_ST_CTL +SDCard_BSPIM_BitCounter__MASK_CTL_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_BitCounter__PERIOD_REG EQU CYREG_B1_UDB06_MSK +SDCard_BSPIM_BitCounter__PER_CTL_AUX_CTL_REG EQU CYREG_B1_UDB06_MSK_ACTL +SDCard_BSPIM_RxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB06_07_ACTL +SDCard_BSPIM_RxStsReg__16BIT_STATUS_REG EQU CYREG_B0_UDB06_07_ST SDCard_BSPIM_RxStsReg__4__MASK EQU 0x10 SDCard_BSPIM_RxStsReg__4__POS EQU 4 SDCard_BSPIM_RxStsReg__5__MASK EQU 0x20 @@ -539,13 +625,13 @@ SDCard_BSPIM_RxStsReg__5__POS EQU 5 SDCard_BSPIM_RxStsReg__6__MASK EQU 0x40 SDCard_BSPIM_RxStsReg__6__POS EQU 6 SDCard_BSPIM_RxStsReg__MASK EQU 0x70 -SDCard_BSPIM_RxStsReg__MASK_REG EQU CYREG_B0_UDB04_MSK -SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_ACTL -SDCard_BSPIM_RxStsReg__STATUS_REG EQU CYREG_B0_UDB04_ST +SDCard_BSPIM_RxStsReg__MASK_REG EQU CYREG_B0_UDB06_MSK +SDCard_BSPIM_RxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB06_ACTL +SDCard_BSPIM_RxStsReg__STATUS_REG EQU CYREG_B0_UDB06_ST SDCard_BSPIM_TxStsReg__0__MASK EQU 0x01 SDCard_BSPIM_TxStsReg__0__POS EQU 0 -SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B1_UDB07_08_ACTL -SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG EQU CYREG_B1_UDB07_08_ST +SDCard_BSPIM_TxStsReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_05_ACTL +SDCard_BSPIM_TxStsReg__16BIT_STATUS_REG EQU CYREG_B0_UDB04_05_ST SDCard_BSPIM_TxStsReg__1__MASK EQU 0x02 SDCard_BSPIM_TxStsReg__1__POS EQU 1 SDCard_BSPIM_TxStsReg__2__MASK EQU 0x04 @@ -555,28 +641,26 @@ SDCard_BSPIM_TxStsReg__3__POS EQU 3 SDCard_BSPIM_TxStsReg__4__MASK EQU 0x10 SDCard_BSPIM_TxStsReg__4__POS EQU 4 SDCard_BSPIM_TxStsReg__MASK EQU 0x1F -SDCard_BSPIM_TxStsReg__MASK_REG EQU CYREG_B1_UDB07_MSK -SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B1_UDB07_ACTL -SDCard_BSPIM_TxStsReg__STATUS_REG EQU CYREG_B1_UDB07_ST -SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG EQU CYREG_B0_UDB07_08_A0 -SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG EQU CYREG_B0_UDB07_08_A1 -SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG EQU CYREG_B0_UDB07_08_D0 -SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG EQU CYREG_B0_UDB07_08_D1 -SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB07_08_ACTL -SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG EQU CYREG_B0_UDB07_08_F0 -SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG EQU CYREG_B0_UDB07_08_F1 -SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG EQU CYREG_B0_UDB07_A0_A1 -SDCard_BSPIM_sR8_Dp_u0__A0_REG EQU CYREG_B0_UDB07_A0 -SDCard_BSPIM_sR8_Dp_u0__A1_REG EQU CYREG_B0_UDB07_A1 -SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG EQU CYREG_B0_UDB07_D0_D1 -SDCard_BSPIM_sR8_Dp_u0__D0_REG EQU CYREG_B0_UDB07_D0 -SDCard_BSPIM_sR8_Dp_u0__D1_REG EQU CYREG_B0_UDB07_D1 -SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG EQU CYREG_B0_UDB07_ACTL -SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG EQU CYREG_B0_UDB07_F0_F1 -SDCard_BSPIM_sR8_Dp_u0__F0_REG EQU CYREG_B0_UDB07_F0 -SDCard_BSPIM_sR8_Dp_u0__F1_REG EQU CYREG_B0_UDB07_F1 -SDCard_BSPIM_sR8_Dp_u0__MSK_DP_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL -SDCard_BSPIM_sR8_Dp_u0__PER_DP_AUX_CTL_REG EQU CYREG_B0_UDB07_MSK_ACTL +SDCard_BSPIM_TxStsReg__MASK_REG EQU CYREG_B0_UDB04_MSK +SDCard_BSPIM_TxStsReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB04_ACTL +SDCard_BSPIM_TxStsReg__STATUS_REG EQU CYREG_B0_UDB04_ST +SDCard_BSPIM_sR8_Dp_u0__16BIT_A0_REG EQU CYREG_B0_UDB06_07_A0 +SDCard_BSPIM_sR8_Dp_u0__16BIT_A1_REG EQU CYREG_B0_UDB06_07_A1 +SDCard_BSPIM_sR8_Dp_u0__16BIT_D0_REG EQU CYREG_B0_UDB06_07_D0 +SDCard_BSPIM_sR8_Dp_u0__16BIT_D1_REG EQU CYREG_B0_UDB06_07_D1 +SDCard_BSPIM_sR8_Dp_u0__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB06_07_ACTL +SDCard_BSPIM_sR8_Dp_u0__16BIT_F0_REG EQU CYREG_B0_UDB06_07_F0 +SDCard_BSPIM_sR8_Dp_u0__16BIT_F1_REG EQU CYREG_B0_UDB06_07_F1 +SDCard_BSPIM_sR8_Dp_u0__A0_A1_REG EQU CYREG_B0_UDB06_A0_A1 +SDCard_BSPIM_sR8_Dp_u0__A0_REG EQU CYREG_B0_UDB06_A0 +SDCard_BSPIM_sR8_Dp_u0__A1_REG EQU CYREG_B0_UDB06_A1 +SDCard_BSPIM_sR8_Dp_u0__D0_D1_REG EQU CYREG_B0_UDB06_D0_D1 +SDCard_BSPIM_sR8_Dp_u0__D0_REG EQU CYREG_B0_UDB06_D0 +SDCard_BSPIM_sR8_Dp_u0__D1_REG EQU CYREG_B0_UDB06_D1 +SDCard_BSPIM_sR8_Dp_u0__DP_AUX_CTL_REG EQU CYREG_B0_UDB06_ACTL +SDCard_BSPIM_sR8_Dp_u0__F0_F1_REG EQU CYREG_B0_UDB06_F0_F1 +SDCard_BSPIM_sR8_Dp_u0__F0_REG EQU CYREG_B0_UDB06_F0 +SDCard_BSPIM_sR8_Dp_u0__F1_REG EQU CYREG_B0_UDB06_F1 ; USBFS_dp_int USBFS_dp_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -1032,21 +1116,32 @@ SD_Data_Clk__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 SD_Data_Clk__PM_STBY_MSK EQU 0x01 ; SD_Init_Clk -SD_Init_Clk__CFG0 EQU CYREG_CLKDIST_DCFG2_CFG0 -SD_Init_Clk__CFG1 EQU CYREG_CLKDIST_DCFG2_CFG1 -SD_Init_Clk__CFG2 EQU CYREG_CLKDIST_DCFG2_CFG2 +SD_Init_Clk__CFG0 EQU CYREG_CLKDIST_DCFG3_CFG0 +SD_Init_Clk__CFG1 EQU CYREG_CLKDIST_DCFG3_CFG1 +SD_Init_Clk__CFG2 EQU CYREG_CLKDIST_DCFG3_CFG2 SD_Init_Clk__CFG2_SRC_SEL_MASK EQU 0x07 -SD_Init_Clk__INDEX EQU 0x02 +SD_Init_Clk__INDEX EQU 0x03 SD_Init_Clk__PM_ACT_CFG EQU CYREG_PM_ACT_CFG2 -SD_Init_Clk__PM_ACT_MSK EQU 0x04 +SD_Init_Clk__PM_ACT_MSK EQU 0x08 SD_Init_Clk__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 -SD_Init_Clk__PM_STBY_MSK EQU 0x04 +SD_Init_Clk__PM_STBY_MSK EQU 0x08 + +; timer_clock +timer_clock__CFG0 EQU CYREG_CLKDIST_DCFG2_CFG0 +timer_clock__CFG1 EQU CYREG_CLKDIST_DCFG2_CFG1 +timer_clock__CFG2 EQU CYREG_CLKDIST_DCFG2_CFG2 +timer_clock__CFG2_SRC_SEL_MASK EQU 0x07 +timer_clock__INDEX EQU 0x02 +timer_clock__PM_ACT_CFG EQU CYREG_PM_ACT_CFG2 +timer_clock__PM_ACT_MSK EQU 0x04 +timer_clock__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 +timer_clock__PM_STBY_MSK EQU 0x04 ; scsiTarget scsiTarget_StatusReg__0__MASK EQU 0x01 scsiTarget_StatusReg__0__POS EQU 0 -scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL -scsiTarget_StatusReg__16BIT_STATUS_REG EQU CYREG_B0_UDB12_13_ST +scsiTarget_StatusReg__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB13_14_ACTL +scsiTarget_StatusReg__16BIT_STATUS_REG EQU CYREG_B0_UDB13_14_ST scsiTarget_StatusReg__1__MASK EQU 0x02 scsiTarget_StatusReg__1__POS EQU 1 scsiTarget_StatusReg__2__MASK EQU 0x04 @@ -1054,76 +1149,76 @@ scsiTarget_StatusReg__2__POS EQU 2 scsiTarget_StatusReg__3__MASK EQU 0x08 scsiTarget_StatusReg__3__POS EQU 3 scsiTarget_StatusReg__MASK EQU 0x0F -scsiTarget_StatusReg__MASK_REG EQU CYREG_B0_UDB12_MSK -scsiTarget_StatusReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL -scsiTarget_StatusReg__STATUS_REG EQU CYREG_B0_UDB12_ST -scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL -scsiTarget_datapath_PI__16BIT_STATUS_REG EQU CYREG_B0_UDB03_04_ST -scsiTarget_datapath_PI__MASK_REG EQU CYREG_B0_UDB03_MSK -scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath_PI__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL -scsiTarget_datapath_PI__STATUS_CNT_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PI__STATUS_CONTROL_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PI__STATUS_REG EQU CYREG_B0_UDB03_ST -scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL -scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB03_04_CTL -scsiTarget_datapath_PO__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB03_04_MSK -scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL -scsiTarget_datapath_PO__CONTROL_REG EQU CYREG_B0_UDB03_CTL -scsiTarget_datapath_PO__CONTROL_ST_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PO__COUNT_REG EQU CYREG_B0_UDB03_CTL -scsiTarget_datapath_PO__COUNT_ST_REG EQU CYREG_B0_UDB03_ST_CTL -scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath_PO__PERIOD_REG EQU CYREG_B0_UDB03_MSK -scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath__16BIT_A0_REG EQU CYREG_B0_UDB03_04_A0 -scsiTarget_datapath__16BIT_A1_REG EQU CYREG_B0_UDB03_04_A1 -scsiTarget_datapath__16BIT_D0_REG EQU CYREG_B0_UDB03_04_D0 -scsiTarget_datapath__16BIT_D1_REG EQU CYREG_B0_UDB03_04_D1 -scsiTarget_datapath__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB03_04_ACTL -scsiTarget_datapath__16BIT_F0_REG EQU CYREG_B0_UDB03_04_F0 -scsiTarget_datapath__16BIT_F1_REG EQU CYREG_B0_UDB03_04_F1 -scsiTarget_datapath__A0_A1_REG EQU CYREG_B0_UDB03_A0_A1 -scsiTarget_datapath__A0_REG EQU CYREG_B0_UDB03_A0 -scsiTarget_datapath__A1_REG EQU CYREG_B0_UDB03_A1 -scsiTarget_datapath__D0_D1_REG EQU CYREG_B0_UDB03_D0_D1 -scsiTarget_datapath__D0_REG EQU CYREG_B0_UDB03_D0 -scsiTarget_datapath__D1_REG EQU CYREG_B0_UDB03_D1 -scsiTarget_datapath__DP_AUX_CTL_REG EQU CYREG_B0_UDB03_ACTL -scsiTarget_datapath__F0_F1_REG EQU CYREG_B0_UDB03_F0_F1 -scsiTarget_datapath__F0_REG EQU CYREG_B0_UDB03_F0 -scsiTarget_datapath__F1_REG EQU CYREG_B0_UDB03_F1 -scsiTarget_datapath__MSK_DP_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL -scsiTarget_datapath__PER_DP_AUX_CTL_REG EQU CYREG_B0_UDB03_MSK_ACTL +scsiTarget_StatusReg__MASK_REG EQU CYREG_B0_UDB13_MSK +scsiTarget_StatusReg__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB13_ACTL +scsiTarget_StatusReg__STATUS_REG EQU CYREG_B0_UDB13_ST +scsiTarget_datapath_PI__16BIT_STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL +scsiTarget_datapath_PI__16BIT_STATUS_REG EQU CYREG_B0_UDB12_13_ST +scsiTarget_datapath_PI__MASK_REG EQU CYREG_B0_UDB12_MSK +scsiTarget_datapath_PI__MASK_ST_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath_PI__PER_ST_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath_PI__STATUS_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL +scsiTarget_datapath_PI__STATUS_CNT_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PI__STATUS_CONTROL_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PI__STATUS_REG EQU CYREG_B0_UDB12_ST +scsiTarget_datapath_PO__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL +scsiTarget_datapath_PO__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB12_13_CTL +scsiTarget_datapath_PO__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB12_13_MSK +scsiTarget_datapath_PO__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL +scsiTarget_datapath_PO__CONTROL_REG EQU CYREG_B0_UDB12_CTL +scsiTarget_datapath_PO__CONTROL_ST_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PO__COUNT_REG EQU CYREG_B0_UDB12_CTL +scsiTarget_datapath_PO__COUNT_ST_REG EQU CYREG_B0_UDB12_ST_CTL +scsiTarget_datapath_PO__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath_PO__PERIOD_REG EQU CYREG_B0_UDB12_MSK +scsiTarget_datapath_PO__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath__16BIT_A0_REG EQU CYREG_B0_UDB12_13_A0 +scsiTarget_datapath__16BIT_A1_REG EQU CYREG_B0_UDB12_13_A1 +scsiTarget_datapath__16BIT_D0_REG EQU CYREG_B0_UDB12_13_D0 +scsiTarget_datapath__16BIT_D1_REG EQU CYREG_B0_UDB12_13_D1 +scsiTarget_datapath__16BIT_DP_AUX_CTL_REG EQU CYREG_B0_UDB12_13_ACTL +scsiTarget_datapath__16BIT_F0_REG EQU CYREG_B0_UDB12_13_F0 +scsiTarget_datapath__16BIT_F1_REG EQU CYREG_B0_UDB12_13_F1 +scsiTarget_datapath__A0_A1_REG EQU CYREG_B0_UDB12_A0_A1 +scsiTarget_datapath__A0_REG EQU CYREG_B0_UDB12_A0 +scsiTarget_datapath__A1_REG EQU CYREG_B0_UDB12_A1 +scsiTarget_datapath__D0_D1_REG EQU CYREG_B0_UDB12_D0_D1 +scsiTarget_datapath__D0_REG EQU CYREG_B0_UDB12_D0 +scsiTarget_datapath__D1_REG EQU CYREG_B0_UDB12_D1 +scsiTarget_datapath__DP_AUX_CTL_REG EQU CYREG_B0_UDB12_ACTL +scsiTarget_datapath__F0_F1_REG EQU CYREG_B0_UDB12_F0_F1 +scsiTarget_datapath__F0_REG EQU CYREG_B0_UDB12_F0 +scsiTarget_datapath__F1_REG EQU CYREG_B0_UDB12_F1 +scsiTarget_datapath__MSK_DP_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL +scsiTarget_datapath__PER_DP_AUX_CTL_REG EQU CYREG_B0_UDB12_MSK_ACTL ; SD_Clk_Ctl SD_Clk_Ctl_Sync_ctrl_reg__0__MASK EQU 0x01 SD_Clk_Ctl_Sync_ctrl_reg__0__POS EQU 0 -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB01_02_ACTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB01_02_CTL -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB01_02_MSK -SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB01_ACTL -SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB01_CTL -SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB01_ST_CTL -SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB01_CTL -SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB01_ST_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_03_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_CONTROL_COUNT_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_CONTROL_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_COUNT_COUNT_REG EQU CYREG_B0_UDB02_03_CTL +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_MASK_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_MASK_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_MASK_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__16BIT_PERIOD_PERIOD_REG EQU CYREG_B0_UDB02_03_MSK +SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_AUX_CTL_REG EQU CYREG_B0_UDB02_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_REG EQU CYREG_B0_UDB02_CTL +SD_Clk_Ctl_Sync_ctrl_reg__CONTROL_ST_REG EQU CYREG_B0_UDB02_ST_CTL +SD_Clk_Ctl_Sync_ctrl_reg__COUNT_REG EQU CYREG_B0_UDB02_CTL +SD_Clk_Ctl_Sync_ctrl_reg__COUNT_ST_REG EQU CYREG_B0_UDB02_ST_CTL SD_Clk_Ctl_Sync_ctrl_reg__MASK EQU 0x01 -SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB01_MSK_ACTL -SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB01_MSK -SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB01_MSK_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__MASK_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL +SD_Clk_Ctl_Sync_ctrl_reg__PERIOD_REG EQU CYREG_B0_UDB02_MSK +SD_Clk_Ctl_Sync_ctrl_reg__PER_CTL_AUX_CTL_REG EQU CYREG_B0_UDB02_MSK_ACTL ; USBFS_ep_0 USBFS_ep_0__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -1138,23 +1233,43 @@ USBFS_ep_0__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 ; USBFS_ep_1 USBFS_ep_1__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 USBFS_ep_1__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_ep_1__INTC_MASK EQU 0x01 -USBFS_ep_1__INTC_NUMBER EQU 0 +USBFS_ep_1__INTC_MASK EQU 0x02 +USBFS_ep_1__INTC_NUMBER EQU 1 USBFS_ep_1__INTC_PRIOR_NUM EQU 7 -USBFS_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 +USBFS_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_1 USBFS_ep_1__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 USBFS_ep_1__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 ; USBFS_ep_2 USBFS_ep_2__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 USBFS_ep_2__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_ep_2__INTC_MASK EQU 0x02 -USBFS_ep_2__INTC_NUMBER EQU 1 +USBFS_ep_2__INTC_MASK EQU 0x04 +USBFS_ep_2__INTC_NUMBER EQU 2 USBFS_ep_2__INTC_PRIOR_NUM EQU 7 -USBFS_ep_2__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_1 +USBFS_ep_2__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_2 USBFS_ep_2__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 USBFS_ep_2__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +; USBFS_ep_3 +USBFS_ep_3__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_ep_3__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_ep_3__INTC_MASK EQU 0x08 +USBFS_ep_3__INTC_NUMBER EQU 3 +USBFS_ep_3__INTC_PRIOR_NUM EQU 7 +USBFS_ep_3__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_3 +USBFS_ep_3__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_3__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 + +; USBFS_ep_4 +USBFS_ep_4__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_ep_4__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_ep_4__INTC_MASK EQU 0x10 +USBFS_ep_4__INTC_NUMBER EQU 4 +USBFS_ep_4__INTC_PRIOR_NUM EQU 7 +USBFS_ep_4__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_4 +USBFS_ep_4__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_4__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 + ; USBFS_USB USBFS_USB__ARB_CFG EQU CYREG_USB_ARB_CFG USBFS_USB__ARB_EP1_CFG EQU CYREG_USB_ARB_EP1_CFG @@ -2735,9 +2850,9 @@ CYDEV_DEBUG_ENABLE_MASK EQU 0x20 CYDEV_DEBUG_ENABLE_REGISTER EQU CYREG_MLOGIC_DEBUG CYDEV_DMA_CHANNELS_AVAILABLE EQU 24 CYDEV_ECC_ENABLE EQU 0 -CYDEV_HEAP_SIZE EQU 0x0256 +CYDEV_HEAP_SIZE EQU 0x0400 CYDEV_INSTRUCT_CACHE_ENABLED EQU 1 -CYDEV_INTR_RISING EQU 0x00000000 +CYDEV_INTR_RISING EQU 0x00000001 CYDEV_PROJ_TYPE EQU 2 CYDEV_PROJ_TYPE_BOOTLOADER EQU 1 CYDEV_PROJ_TYPE_LOADABLE EQU 2 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cypins.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cypins.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cytypes.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cytypes.h old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyutils.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyutils.c old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h index 25691ab8..01afa7d1 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h @@ -59,6 +59,11 @@ #include #include #include +#include +#include +#include +#include +#include #include #include #include diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/protect.hex b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/protect.hex old mode 100644 new mode 100755 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.c new file mode 100755 index 00000000..b4c30ae2 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.c @@ -0,0 +1,521 @@ +/******************************************************************************* +* File Name: timer_clock.c +* Version 2.10 +* +* Description: +* This file provides the source code to the API for the clock component. +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "timer_clock.h" + +/* Clock Distribution registers. */ +#define CLK_DIST_LD (* (reg8 *) CYREG_CLKDIST_LD) +#define CLK_DIST_BCFG2 (* (reg8 *) CYREG_CLKDIST_BCFG2) +#define BCFG2_MASK (0x80u) +#define CLK_DIST_DMASK (* (reg8 *) CYREG_CLKDIST_DMASK) +#define CLK_DIST_AMASK (* (reg8 *) CYREG_CLKDIST_AMASK) + +#define HAS_CLKDIST_LD_DISABLE (CY_PSOC3 || CY_PSOC5LP) + + +/******************************************************************************* +* Function Name: timer_clock_Start +******************************************************************************** +* +* Summary: +* Starts the clock. Note that on startup, clocks may be already running if the +* "Start on Reset" option is enabled in the DWR. +* +* Parameters: +* None +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_Start(void) +{ + /* Set the bit to enable the clock. */ + timer_clock_CLKEN |= timer_clock_CLKEN_MASK; + timer_clock_CLKSTBY |= timer_clock_CLKSTBY_MASK; +} + + +/******************************************************************************* +* Function Name: timer_clock_Stop +******************************************************************************** +* +* Summary: +* Stops the clock and returns immediately. This API does not require the +* source clock to be running but may return before the hardware is actually +* disabled. If the settings of the clock are changed after calling this +* function, the clock may glitch when it is started. To avoid the clock +* glitch, use the StopBlock function. +* +* Parameters: +* None +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_Stop(void) +{ + /* Clear the bit to disable the clock. */ + timer_clock_CLKEN &= (uint8)(~timer_clock_CLKEN_MASK); + timer_clock_CLKSTBY &= (uint8)(~timer_clock_CLKSTBY_MASK); +} + + +#if(CY_PSOC3 || CY_PSOC5LP) + + +/******************************************************************************* +* Function Name: timer_clock_StopBlock +******************************************************************************** +* +* Summary: +* Stops the clock and waits for the hardware to actually be disabled before +* returning. This ensures that the clock is never truncated (high part of the +* cycle will terminate before the clock is disabled and the API returns). +* Note that the source clock must be running or this API will never return as +* a stopped clock cannot be disabled. +* +* Parameters: +* None +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_StopBlock(void) +{ + if ((timer_clock_CLKEN & timer_clock_CLKEN_MASK) != 0u) + { +#if HAS_CLKDIST_LD_DISABLE + uint16 oldDivider; + + CLK_DIST_LD = 0u; + + /* Clear all the mask bits except ours. */ +#if defined(timer_clock__CFG3) + CLK_DIST_AMASK = timer_clock_CLKEN_MASK; + CLK_DIST_DMASK = 0x00u; +#else + CLK_DIST_DMASK = timer_clock_CLKEN_MASK; + CLK_DIST_AMASK = 0x00u; +#endif /* timer_clock__CFG3 */ + + /* Clear mask of bus clock. */ + CLK_DIST_BCFG2 &= (uint8)(~BCFG2_MASK); + + oldDivider = CY_GET_REG16(timer_clock_DIV_PTR); + CY_SET_REG16(CYREG_CLKDIST_WRK0, oldDivider); + CLK_DIST_LD = CYCLK_LD_DISABLE | CYCLK_LD_SYNC_EN | CYCLK_LD_LOAD; + + /* Wait for clock to be disabled */ + while ((CLK_DIST_LD & CYCLK_LD_LOAD) != 0u) { } +#endif /* HAS_CLKDIST_LD_DISABLE */ + + /* Clear the bit to disable the clock. */ + timer_clock_CLKEN &= (uint8)(~timer_clock_CLKEN_MASK); + timer_clock_CLKSTBY &= (uint8)(~timer_clock_CLKSTBY_MASK); + +#if HAS_CLKDIST_LD_DISABLE + /* Clear the disable bit */ + CLK_DIST_LD = 0x00u; + CY_SET_REG16(timer_clock_DIV_PTR, oldDivider); +#endif /* HAS_CLKDIST_LD_DISABLE */ + } +} +#endif /* (CY_PSOC3 || CY_PSOC5LP) */ + + +/******************************************************************************* +* Function Name: timer_clock_StandbyPower +******************************************************************************** +* +* Summary: +* Sets whether the clock is active in standby mode. +* +* Parameters: +* state: 0 to disable clock during standby, nonzero to enable. +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_StandbyPower(uint8 state) +{ + if(state == 0u) + { + timer_clock_CLKSTBY &= (uint8)(~timer_clock_CLKSTBY_MASK); + } + else + { + timer_clock_CLKSTBY |= timer_clock_CLKSTBY_MASK; + } +} + + +/******************************************************************************* +* Function Name: timer_clock_SetDividerRegister +******************************************************************************** +* +* Summary: +* Modifies the clock divider and, thus, the frequency. When the clock divider +* register is set to zero or changed from zero, the clock will be temporarily +* disabled in order to change the SSS mode bit. If the clock is enabled when +* SetDividerRegister is called, then the source clock must be running. +* +* Parameters: +* clkDivider: Divider register value (0-65,535). This value is NOT the +* divider; the clock hardware divides by clkDivider plus one. For example, +* to divide the clock by 2, this parameter should be set to 1. +* restart: If nonzero, restarts the clock divider: the current clock cycle +* will be truncated and the new divide value will take effect immediately. If +* zero, the new divide value will take effect at the end of the current clock +* cycle. +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_SetDividerRegister(uint16 clkDivider, uint8 restart) + +{ + uint8 enabled; + + uint8 currSrc = timer_clock_GetSourceRegister(); + uint16 oldDivider = timer_clock_GetDividerRegister(); + + if (clkDivider != oldDivider) + { + enabled = timer_clock_CLKEN & timer_clock_CLKEN_MASK; + + if ((currSrc == (uint8)CYCLK_SRC_SEL_CLK_SYNC_D) && ((oldDivider == 0u) || (clkDivider == 0u))) + { + /* Moving to/from SSS requires correct ordering to prevent halting the clock */ + if (oldDivider == 0u) + { + /* Moving away from SSS, set the divider first so when SSS is cleared we */ + /* don't halt the clock. Using the shadow load isn't required as the */ + /* divider is ignored while SSS is set. */ + CY_SET_REG16(timer_clock_DIV_PTR, clkDivider); + timer_clock_MOD_SRC &= (uint8)(~CYCLK_SSS); + } + else + { + /* Moving to SSS, set SSS which then ignores the divider and we can set */ + /* it without bothering with the shadow load. */ + timer_clock_MOD_SRC |= CYCLK_SSS; + CY_SET_REG16(timer_clock_DIV_PTR, clkDivider); + } + } + else + { + + if (enabled != 0u) + { + CLK_DIST_LD = 0x00u; + + /* Clear all the mask bits except ours. */ +#if defined(timer_clock__CFG3) + CLK_DIST_AMASK = timer_clock_CLKEN_MASK; + CLK_DIST_DMASK = 0x00u; +#else + CLK_DIST_DMASK = timer_clock_CLKEN_MASK; + CLK_DIST_AMASK = 0x00u; +#endif /* timer_clock__CFG3 */ + /* Clear mask of bus clock. */ + CLK_DIST_BCFG2 &= (uint8)(~BCFG2_MASK); + + /* If clock is currently enabled, disable it if async or going from N-to-1*/ + if (((timer_clock_MOD_SRC & CYCLK_SYNC) == 0u) || (clkDivider == 0u)) + { +#if HAS_CLKDIST_LD_DISABLE + CY_SET_REG16(CYREG_CLKDIST_WRK0, oldDivider); + CLK_DIST_LD = CYCLK_LD_DISABLE|CYCLK_LD_SYNC_EN|CYCLK_LD_LOAD; + + /* Wait for clock to be disabled */ + while ((CLK_DIST_LD & CYCLK_LD_LOAD) != 0u) { } +#endif /* HAS_CLKDIST_LD_DISABLE */ + + timer_clock_CLKEN &= (uint8)(~timer_clock_CLKEN_MASK); + +#if HAS_CLKDIST_LD_DISABLE + /* Clear the disable bit */ + CLK_DIST_LD = 0x00u; +#endif /* HAS_CLKDIST_LD_DISABLE */ + } + } + + /* Load divide value. */ + if ((timer_clock_CLKEN & timer_clock_CLKEN_MASK) != 0u) + { + /* If the clock is still enabled, use the shadow registers */ + CY_SET_REG16(CYREG_CLKDIST_WRK0, clkDivider); + + CLK_DIST_LD = (CYCLK_LD_LOAD | ((restart != 0u) ? CYCLK_LD_SYNC_EN : 0x00u)); + while ((CLK_DIST_LD & CYCLK_LD_LOAD) != 0u) { } + } + else + { + /* If the clock is disabled, set the divider directly */ + CY_SET_REG16(timer_clock_DIV_PTR, clkDivider); + timer_clock_CLKEN |= enabled; + } + } + } +} + + +/******************************************************************************* +* Function Name: timer_clock_GetDividerRegister +******************************************************************************** +* +* Summary: +* Gets the clock divider register value. +* +* Parameters: +* None +* +* Returns: +* Divide value of the clock minus 1. For example, if the clock is set to +* divide by 2, the return value will be 1. +* +*******************************************************************************/ +uint16 timer_clock_GetDividerRegister(void) +{ + return CY_GET_REG16(timer_clock_DIV_PTR); +} + + +/******************************************************************************* +* Function Name: timer_clock_SetModeRegister +******************************************************************************** +* +* Summary: +* Sets flags that control the operating mode of the clock. This function only +* changes flags from 0 to 1; flags that are already 1 will remain unchanged. +* To clear flags, use the ClearModeRegister function. The clock must be +* disabled before changing the mode. +* +* Parameters: +* clkMode: Bit mask containing the bits to set. For PSoC 3 and PSoC 5, +* clkMode should be a set of the following optional bits or'ed together. +* - CYCLK_EARLY Enable early phase mode. Rising edge of output clock will +* occur when the divider count reaches half of the divide +* value. +* - CYCLK_DUTY Enable 50% duty cycle output. When enabled, the output clock +* is asserted for approximately half of its period. When +* disabled, the output clock is asserted for one period of the +* source clock. +* - CYCLK_SYNC Enable output synchronization to master clock. This should +* be enabled for all synchronous clocks. +* See the Technical Reference Manual for details about setting the mode of +* the clock. Specifically, see the CLKDIST.DCFG.CFG2 register. +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_SetModeRegister(uint8 modeBitMask) +{ + timer_clock_MOD_SRC |= modeBitMask & (uint8)timer_clock_MODE_MASK; +} + + +/******************************************************************************* +* Function Name: timer_clock_ClearModeRegister +******************************************************************************** +* +* Summary: +* Clears flags that control the operating mode of the clock. This function +* only changes flags from 1 to 0; flags that are already 0 will remain +* unchanged. To set flags, use the SetModeRegister function. The clock must be +* disabled before changing the mode. +* +* Parameters: +* clkMode: Bit mask containing the bits to clear. For PSoC 3 and PSoC 5, +* clkMode should be a set of the following optional bits or'ed together. +* - CYCLK_EARLY Enable early phase mode. Rising edge of output clock will +* occur when the divider count reaches half of the divide +* value. +* - CYCLK_DUTY Enable 50% duty cycle output. When enabled, the output clock +* is asserted for approximately half of its period. When +* disabled, the output clock is asserted for one period of the +* source clock. +* - CYCLK_SYNC Enable output synchronization to master clock. This should +* be enabled for all synchronous clocks. +* See the Technical Reference Manual for details about setting the mode of +* the clock. Specifically, see the CLKDIST.DCFG.CFG2 register. +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_ClearModeRegister(uint8 modeBitMask) +{ + timer_clock_MOD_SRC &= (uint8)(~modeBitMask) | (uint8)(~(uint8)(timer_clock_MODE_MASK)); +} + + +/******************************************************************************* +* Function Name: timer_clock_GetModeRegister +******************************************************************************** +* +* Summary: +* Gets the clock mode register value. +* +* Parameters: +* None +* +* Returns: +* Bit mask representing the enabled mode bits. See the SetModeRegister and +* ClearModeRegister descriptions for details about the mode bits. +* +*******************************************************************************/ +uint8 timer_clock_GetModeRegister(void) +{ + return timer_clock_MOD_SRC & (uint8)(timer_clock_MODE_MASK); +} + + +/******************************************************************************* +* Function Name: timer_clock_SetSourceRegister +******************************************************************************** +* +* Summary: +* Sets the input source of the clock. The clock must be disabled before +* changing the source. The old and new clock sources must be running. +* +* Parameters: +* clkSource: For PSoC 3 and PSoC 5 devices, clkSource should be one of the +* following input sources: +* - CYCLK_SRC_SEL_SYNC_DIG +* - CYCLK_SRC_SEL_IMO +* - CYCLK_SRC_SEL_XTALM +* - CYCLK_SRC_SEL_ILO +* - CYCLK_SRC_SEL_PLL +* - CYCLK_SRC_SEL_XTALK +* - CYCLK_SRC_SEL_DSI_G +* - CYCLK_SRC_SEL_DSI_D/CYCLK_SRC_SEL_DSI_A +* See the Technical Reference Manual for details on clock sources. +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_SetSourceRegister(uint8 clkSource) +{ + uint16 currDiv = timer_clock_GetDividerRegister(); + uint8 oldSrc = timer_clock_GetSourceRegister(); + + if (((oldSrc != ((uint8)CYCLK_SRC_SEL_CLK_SYNC_D)) && + (clkSource == ((uint8)CYCLK_SRC_SEL_CLK_SYNC_D))) && (currDiv == 0u)) + { + /* Switching to Master and divider is 1, set SSS, which will output master, */ + /* then set the source so we are consistent. */ + timer_clock_MOD_SRC |= CYCLK_SSS; + timer_clock_MOD_SRC = + (timer_clock_MOD_SRC & (uint8)(~timer_clock_SRC_SEL_MSK)) | clkSource; + } + else if (((oldSrc == ((uint8)CYCLK_SRC_SEL_CLK_SYNC_D)) && + (clkSource != ((uint8)CYCLK_SRC_SEL_CLK_SYNC_D))) && (currDiv == 0u)) + { + /* Switching from Master to not and divider is 1, set source, so we don't */ + /* lock when we clear SSS. */ + timer_clock_MOD_SRC = + (timer_clock_MOD_SRC & (uint8)(~timer_clock_SRC_SEL_MSK)) | clkSource; + timer_clock_MOD_SRC &= (uint8)(~CYCLK_SSS); + } + else + { + timer_clock_MOD_SRC = + (timer_clock_MOD_SRC & (uint8)(~timer_clock_SRC_SEL_MSK)) | clkSource; + } +} + + +/******************************************************************************* +* Function Name: timer_clock_GetSourceRegister +******************************************************************************** +* +* Summary: +* Gets the input source of the clock. +* +* Parameters: +* None +* +* Returns: +* The input source of the clock. See SetSourceRegister for details. +* +*******************************************************************************/ +uint8 timer_clock_GetSourceRegister(void) +{ + return timer_clock_MOD_SRC & timer_clock_SRC_SEL_MSK; +} + + +#if defined(timer_clock__CFG3) + + +/******************************************************************************* +* Function Name: timer_clock_SetPhaseRegister +******************************************************************************** +* +* Summary: +* Sets the phase delay of the analog clock. This function is only available +* for analog clocks. The clock must be disabled before changing the phase +* delay to avoid glitches. +* +* Parameters: +* clkPhase: Amount to delay the phase of the clock, in 1.0ns increments. +* clkPhase must be from 1 to 11 inclusive. Other values, including 0, +* disable the clock. clkPhase = 1 produces a 0ns delay and clkPhase = 11 +* produces a 10ns delay. +* +* Returns: +* None +* +*******************************************************************************/ +void timer_clock_SetPhaseRegister(uint8 clkPhase) +{ + timer_clock_PHASE = clkPhase & timer_clock_PHASE_MASK; +} + + +/******************************************************************************* +* Function Name: timer_clock_GetPhase +******************************************************************************** +* +* Summary: +* Gets the phase delay of the analog clock. This function is only available +* for analog clocks. +* +* Parameters: +* None +* +* Returns: +* Phase of the analog clock. See SetPhaseRegister for details. +* +*******************************************************************************/ +uint8 timer_clock_GetPhaseRegister(void) +{ + return timer_clock_PHASE & timer_clock_PHASE_MASK; +} + +#endif /* timer_clock__CFG3 */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.h new file mode 100755 index 00000000..6690d480 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/timer_clock.h @@ -0,0 +1,124 @@ +/******************************************************************************* +* File Name: timer_clock.h +* Version 2.10 +* +* Description: +* Provides the function and constant definitions for the clock component. +* +* Note: +* +******************************************************************************** +* Copyright 2008-2012, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(CY_CLOCK_timer_clock_H) +#define CY_CLOCK_timer_clock_H + +#include +#include + + +/*************************************** +* Conditional Compilation Parameters +***************************************/ + +/* Check to see if required defines such as CY_PSOC5LP are available */ +/* They are defined starting with cy_boot v3.0 */ +#if !defined (CY_PSOC5LP) + #error Component cy_clock_v2_10 requires cy_boot v3.0 or later +#endif /* (CY_PSOC5LP) */ + + +/*************************************** +* Function Prototypes +***************************************/ + +void timer_clock_Start(void) ; +void timer_clock_Stop(void) ; + +#if(CY_PSOC3 || CY_PSOC5LP) +void timer_clock_StopBlock(void) ; +#endif /* (CY_PSOC3 || CY_PSOC5LP) */ + +void timer_clock_StandbyPower(uint8 state) ; +void timer_clock_SetDividerRegister(uint16 clkDivider, uint8 restart) + ; +uint16 timer_clock_GetDividerRegister(void) ; +void timer_clock_SetModeRegister(uint8 modeBitMask) ; +void timer_clock_ClearModeRegister(uint8 modeBitMask) ; +uint8 timer_clock_GetModeRegister(void) ; +void timer_clock_SetSourceRegister(uint8 clkSource) ; +uint8 timer_clock_GetSourceRegister(void) ; +#if defined(timer_clock__CFG3) +void timer_clock_SetPhaseRegister(uint8 clkPhase) ; +uint8 timer_clock_GetPhaseRegister(void) ; +#endif /* defined(timer_clock__CFG3) */ + +#define timer_clock_Enable() timer_clock_Start() +#define timer_clock_Disable() timer_clock_Stop() +#define timer_clock_SetDivider(clkDivider) timer_clock_SetDividerRegister(clkDivider, 1u) +#define timer_clock_SetDividerValue(clkDivider) timer_clock_SetDividerRegister((clkDivider) - 1u, 1u) +#define timer_clock_SetMode(clkMode) timer_clock_SetModeRegister(clkMode) +#define timer_clock_SetSource(clkSource) timer_clock_SetSourceRegister(clkSource) +#if defined(timer_clock__CFG3) +#define timer_clock_SetPhase(clkPhase) timer_clock_SetPhaseRegister(clkPhase) +#define timer_clock_SetPhaseValue(clkPhase) timer_clock_SetPhaseRegister((clkPhase) + 1u) +#endif /* defined(timer_clock__CFG3) */ + + +/*************************************** +* Registers +***************************************/ + +/* Register to enable or disable the clock */ +#define timer_clock_CLKEN (* (reg8 *) timer_clock__PM_ACT_CFG) +#define timer_clock_CLKEN_PTR ((reg8 *) timer_clock__PM_ACT_CFG) + +/* Register to enable or disable the clock */ +#define timer_clock_CLKSTBY (* (reg8 *) timer_clock__PM_STBY_CFG) +#define timer_clock_CLKSTBY_PTR ((reg8 *) timer_clock__PM_STBY_CFG) + +/* Clock LSB divider configuration register. */ +#define timer_clock_DIV_LSB (* (reg8 *) timer_clock__CFG0) +#define timer_clock_DIV_LSB_PTR ((reg8 *) timer_clock__CFG0) +#define timer_clock_DIV_PTR ((reg16 *) timer_clock__CFG0) + +/* Clock MSB divider configuration register. */ +#define timer_clock_DIV_MSB (* (reg8 *) timer_clock__CFG1) +#define timer_clock_DIV_MSB_PTR ((reg8 *) timer_clock__CFG1) + +/* Mode and source configuration register */ +#define timer_clock_MOD_SRC (* (reg8 *) timer_clock__CFG2) +#define timer_clock_MOD_SRC_PTR ((reg8 *) timer_clock__CFG2) + +#if defined(timer_clock__CFG3) +/* Analog clock phase configuration register */ +#define timer_clock_PHASE (* (reg8 *) timer_clock__CFG3) +#define timer_clock_PHASE_PTR ((reg8 *) timer_clock__CFG3) +#endif /* defined(timer_clock__CFG3) */ + + +/************************************** +* Register Constants +**************************************/ + +/* Power manager register masks */ +#define timer_clock_CLKEN_MASK timer_clock__PM_ACT_MSK +#define timer_clock_CLKSTBY_MASK timer_clock__PM_STBY_MSK + +/* CFG2 field masks */ +#define timer_clock_SRC_SEL_MSK timer_clock__CFG2_SRC_SEL_MASK +#define timer_clock_MODE_MASK (~(timer_clock_SRC_SEL_MSK)) + +#if defined(timer_clock__CFG3) +/* CFG3 phase mask */ +#define timer_clock_PHASE_MASK timer_clock__CFG3_PHASE_DLY_MASK +#endif /* defined(timer_clock__CFG3) */ + +#endif /* CY_CLOCK_timer_clock_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx index 54c6eb9e..265ed9ee 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx +++ b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx @@ -1,24 +1,32 @@ - + + + + + + + + + + - - - - + - + - + - + + + - - + + @@ -86,32 +94,93 @@ - - - - - - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + - + - - - - - + + + + + - + + + \ No newline at end of file diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cydwr b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cydwr index 33f3890dde29c054e3e2be57cf532716b3bc7a4e..96ace5183d2151954943f78b692a481ac34748c6 100755 GIT binary patch literal 137188 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 Vlz!yCZhku5ome+gA+#Fl{|78LXT$&i literal 134725 zcmeI5Z>(L}S>Cs2GWkO?1QG}krO{2jGf)~k_Vs@t71#HAW=zJ|wI^dpfLr_e+VPCX zGuWO#jueqZpsFnbLR*L;O;J>-mEaQ}A_Y;9@}ZTA;6p$3L)b1ug{q25d>|TuG*zQM zzrD`d>)q#`bMCqJer6mvzBkP`0rc0^1BcH*+Z}M z<}Lr1=Z9XWylx)IuRr(jH+Ma*H>=g{YOUI=ZdO;TE7f(qx>4;_>2uYy`g=|#d#mHs z1%1BRmfx;Ep|VT*RlDz0yS}9h0B2m60fuc=b1 zn67(9Z|14e8CCN+!9S%+KU>{W)z+%>)!9)M)9W=|`<5Q6THQRj~5E(tpoZ z>-sQVeAl;jch}d)52&{D)UV%VYwFw$)#Ym2p%+y5+toi)D}PFV=k)rfKHJn~_v+m( zeR@@0e5LwGwWP9}I`cV|T~q1Bw(Kb#d!uz2+~Z@ivsW#UADp#Xy`bZ7>G_6^{g{s0 z)N3qXP&r4O(ff<7&5i2g`t)}7q^|OeUSaWKbwqy`CmOTyC8V7u-ZJvt|8l=z&wd^R-6n@rau6WsggrvI zp>7BNLA|;l^wjCHN;cX$9afDF>1fW{RC%gjqSfv@yHttsxbbe4rHD~C54NviU03zG z;ceYK+&+J2`^+h!b?WB3+T!nSpCRx=uVYD-c#r;r!1yv=eOuviQ?c>khrbyTWT!n zIkW?B>*ho4^W6Ckxz+AF*cQ$Y=)XL7=+8gXTzVYRTia`4B2RdzX@E37o5^b{kbc*< zKK$W7-F*iex->@i7bM`1D+mYl5l7}^aQB@uf;|9wLdnwTvHMO}qkSq`t$tdyI-wc$ zx?Z2IezJO0%S(@G!Rc(ZqIC0QTehw>o73%a9j5PTPd=>=&gjq+0(4H#YXv12jMh)+ z-Kwr~Lf2T)^41f2)mfv?kIE;nwQkTM+&gAt7Q$pdS*)8M)0v%_qhn@H3c@*6?yRc0 zs{g6_iXM*(QXe4o8Fd27P){mtB@OQ^|Hzo-2yk6BT4}FyT#a|Sy-uurwp}-?5$s21 zn*4;Ie`3_s>uv9J07>Ro)Pf{}FR6i9{5h{Sy&+0U0QjioUgG$qaV@mW@uWrx4c%6Q+VTCEE>bzE!xW3BC)Q!Tc0qplchu1Che z;LMnKOn>zAV=}R(3g**Ar^KK0DyG)w<@-}X;oI~a&Q-_|dvT(}F++;Je_lq`1?DN$ zYO;fkdF*(t@Ku_4ntzU+KHj#I8U@n+)9R;2;Mbgn@H1b*fk=xE~h?BFt(*JRX%NTg@?)o}>;Z6;*$FWP8l( z$Aj@?gXe|hWE+eL)~EEh(#D(IeLV&ooU7)=Br)QYaCR+APo>b;wdQ<1m1;|qF(`NT zN>CmPr{jG@P(Pz^LzBmWe3IR|`L}}E0UW3OG*c%#CXX2yA7sW|D+B=8o(7pzpZwf` z`G;dYKrF_0@dfHdq7vF0g6>n5mz2sbDQ!JeeN?Fv1DMKQ?W~d(rwyl*8Xeh+c}(Nw zRi&P%G-5ulzqB2b+I?nXMRLX?Bvy3#nbyJ_=d)DDBb@)Z-m>n_Rt9VA`;~IARhRN` z=9|ab6?d|AW|wKbk==+*{jqU#Q8n2o3#2NbQOsa5@tj%#mm&~c*Ylcq`Eu!au1mIm zS%HO3vkS7sJomC}<#o;@vdnca=!naDwO?qML+n#oTJt=hs~#@brANwjPq%5w#4EFh z!e-sFp4nkxg_WHLYIm^3z^ZGSpD_Oh(-9$MX2Sf0y@^A5)zvtS^NjMRRNr$VQrG{~ zl$j8YK^q@wuXmtzm~=hnLu{YY{u~1uX8&mg__E5G(X;O{@p`A*cJ5t|E!NbMv@5O1 zE(-fB)Q^5+za?$Qay@$CsNS=Q$xMwk1lAe4>k$jisSn9w2)n(jv5;Vp zlZE6zX?N$C%J3TM$+j^^9@aJ3sXEf4?XE@?Pglc-de^$t9?v$iWw}mOa9u`ZTxzS&7*NOc?#a0_Qvorww=L1AL5y?kn7>Ae9CtFk+yEBY*VFp zTX((Emgf~H#;(Qu9E5lTzQLw9D@@pBTboy~o{ic)?G@n(oI9d3F6w`FCMH~KwT;)k zdSL@kKmtG=s12BTMf{*e@yKP_-J|!kH}iob`aJDx!iVl!sU1s6Mdgq5kKi6*=v>JS-dO?b*RkCk40yROLWd`&0z zt^~)3dzbYGhZ&P{oJ{LPiTm_hiePE)3!lQL=~>2$&R_akb3#kED zWL!*ZR`_jVI(@}x1P|x|xQ+;f@d4&fxgxQJZdb2i%M#)B^4>%F>hU*CLO) zs9vN7_*s%w(PQ)%(GPYJCFxl#C6xrNK?H!+DT3k+d3M<4VT{`3V7GeJ4Y86qOT1;o zB)7rylZc7y5);9aMo_T8tt8!o^Y9Lz4O~n4U%u{DU73mCwYHhVb&-n^Pl!koPj`i%NgyA&_+4|X{?nlYU#hq1g|cTFd-Q#tXv#9>+-pCP+SJ1EJsD1p~0I@7nr zIC?YX8|2BvG5WCcwv=~L-_z0|u@}7&94piqKjnNp9rSoZiqzCNc`;=~@wD4R_C_CY ze98ggYj*k+KDPIZYWpZCPC#IA$if8*j(Y{XCeIk_qWGFuq%Fl-KCqsF>?)k1< z(Ey{YL9SKkg;KHuyA9aoN zsqP~EM*6uar={qK9om0w?cWe^U{>^&rB)* zY$*SQ_I1MZ`L0}@u%tIg1z88c?{a9SNr~%e9-U77rFbF>9cjlOt>=<@@CBXztWL?g z&+N4SqC2hMAHN*RWBdMUDF0&nI$i!>hw`#$Q#ZdkrToiN%3lfPztz4@_P-L!|Gi#k zuGh`~>pq!D?sw@h9+})~UI@kDO1M7U=9MH)$JOL4?h&d;%o)Uv>+=_=w&T{hv|SCXL{F+uaxSo^B_+Ty2>I!)|o+FCM9Cuo5-R z$W?Xvb6QHt@o#LCf{gmQ>iDdzcfl5nDcCX~J`pGIj9ut=Zwd3&)-6$6#q;at$YJY2_mF%Hn|Ky|)v6>muV=gkeo%ZUJ4huP4 z5-=me%#rj95ia!u2LgB^+a)2n+`jtx(mqHW$YDCelg@fUl_reHxU7))-; z@`kREJC9|)?s%M&eU(Ss5fhg@-nt*-B6$WmIHNqyiLjikYgtF(y2o3WUe$PdT*nwKyzG;bJ${BiCEJ#Qj^B~KQgKZ=nVCLg}Rr=Hq^}3okh(UEMIJWYm`1vUmTbjQlwSge5O0BZhoh8 z$GZ7!D34}87s|g7j{n6_UOc~U{&^^m$N$T&TrE!Py7_vG zA&qUZ|6}yUIMx}C z>C#Pzi^~AS-h0H zCDI&=0iJlmng??g;t5{LtnT8;qw~kneyhcE#X+r&^1u;Al2yu z`e3cKNH|U@`MLHzHngKP5PZpQy zmq#Co_@_mMk&mFKz^92*B!+uhFFh)s!K0atGxnl*NUN84Grmo{!>?GyPs`ccjyV$& zQh>fZ>Pz(KXzOpvH#U?gq`53zw65OW&?h(A|8MJk-)CZjs#;7xi_vFWr%Ps6@7iqL z^gNLe{Zn}mS6eJAnSH$a%w!LY2d}pWe_RKDvOC!Ac_oVVJ!W7}Vjbpq>qU%;cnxD@ zTJOM<$k|vo!pnHI(s~uqiPcTk`i{!4@;ceff$9g;{5*2@QaA6_Xr4!)$j0|gESHlU z>^aFKf9rePmh={PKO?s!;~k~AeVcI>KvJD=%vhHbCV^#I47=R{FSHdvR$_`5b8?yz zrx`6-^c9&T!GtcTHMv{wxi$=fZEV6pdQ{A@ibt}~P9W>M3Daf$&zuEZL{rQN35inB zxAZN&Bn!7>ot0GsNOqDD{0Q;uK`;xWi z=i7RwQG=A82~T#HUaS9b4;2DF=EGo_WTa~%5=Q*Ja|PzPrMYjad2k?xy;+v(=4@=D zeoLnud|i;3)2*wQ=xj_fqOwLerB3}I`)SoAorce>t10jvhGT}*8+v|0rYOJB`cs*M zmo^`ZhD@q+G~7A{*Uis$mFlPXrR8hGFe}HPTM!ClP%+Q@wJ@f>K@pN=6ZVvt)3J!c z{FO*~La$g^&pQ|g6&cAb$r_pc@jlHr*a4Yq>4p6~9yvm)F+QNTSJm}&cJd+KT~nt+ zvE0o%kn>n{Kq-xlSB& zPJ&pfP4GlqeJPahG{df&WOdv2W#Y$U3t3sp+=i_0(Rpd@YF$-6 zs)d7+TBCF47@AtN@ob1b~3$7$yt|Ifj#s1ZvHl$)N=(qo+bBkT6Bhz*vGZf9RIdDLyRF0v^|CW*lTt3)+y!h z2<5R`cG_KXCt@dVnD!Of5+X%U&Ns6Mw+@I;cU>>LeEe8TF2weQTwm!9QrK;)k(#C~ z&-Tmza?0@!x4o2_EZX_#l=7FRl$YVZf88={^~)a&c%plipxAf2!iQAe6D-h3Mb$u% z**2=;xjb@I9d+RoiXY6XuC?}_>83$5yO4{e3+CunYB%%5aS(NLD0pOP7J(zom1z|N zITJ3Xx@>f2Pm7EAI*DMFrh2Tlrvua2-QQ4B*R)NMTxfbwDxEX4THFQ7Bed;4z0C`4 z%z^Vh8jHGV2_wyCsTO;rX)R>rmI2%3_NkjIq1|F#o}N-ZUdJxJzh4()OA$99zNd8+ z)|Y|S4JP#5i|zC&wOLuw)3@EUuAR#7en{@Se~G$v^V-C~S~q<0PRzTcVe)y*%2w*GwkdaG~6kvsZUEWhUw9gSIbq%v~X&F%myI@o4w7GL^0-kE#QkT5zC`XOy2pdo0PUBzm6$= z+_`teoY)_6tcc~)#+G?_9NXcQ;0N=$+0~ID31d}OzvNvLV;L5 zjRG+`vLBZR+PGzOFN?=<0E=_^=!zxz?kD##8pY+3SUzpJWTyjUOd#f2ik+4~O_S5? zd;l)1DKlMZYtHu{=Wv;r+r)u3mfwrZ%rlSs@)Vr&xJ;x%%*~=}ypb*wuRAU0^t()1 zXxpL7{PC2oh*74jaQ6kSvHV_KCau@r1lvu%9J(OnJ%++eP@Xe0tr>R9>N8zqYc8`hv08uc z@cm)IFuKw|2;~b`N>SjImR@N=I(BKvWt3jC55XqqUWpZvAm#)wj#6>4>|REx2x7Wl zm2I4ve)VAi=TUOxo%+?W&VlRZM}z--ER;v;|M-;h)leRr>ai*1KM~4fqH-#f$LpR6 zT8ppI_P8{)2Z{U7 z3Z%Z7Zli>aDee@>p~oL$%8u~N5CeK1CB%HTqmbH&q^Af4X}-P+{`1|zagS3Hl~7(< zOSf%JDUbY&g1yMkSRVNqd44~nQW4MJ{ZvX$!tk5Ko7ug~$fu9-eZHxrq*ZC2!)Y^p zb9TlZCq>asV)?zeiF?WC{&Exb6MI^G*9kv#H2tsK(KtEQPv0;dZpK#BD>MCPYg+za zy6~g=MqMS}rV@3Pb@NBvq5aj!7^%J#CU?;VWBI+fpnKAH-?<>6g09GM=S;C58i>PHu5vR2GoPs!#A{X9=smD zm7fC}HlFcQ9FBJ2yEQy^J$x%aBd; zEe}t)Ydq#LJe4r(U)^F!?muNR}Pqk!;z;L4G@O=n$7NyEs^W zQ**eqIAeBk(4i*Dm|Yy?8{=KR;o_h}T9Vqi{Bq#XUgwaPWXvuOCW$at8NM}K9CQdy zayz>?xNPHK`SsADdoX=Vn!`5+*PnD_clrii4`vq!9a5C!&-_A>C-OVwC>gVhgAPeb z#_Spg9kP^!*&$5HmR-51L!6Q^yXJ!qfl9{gnhy>xQt9F|-@5OKNc;|)$Ff7Ol6ugg zSjm=M9CWBwGG-SCxo6hp8!is=YjQ5kE)EVZW9i}schh=W!=YzM{_Ie+WXrBxH2o9| zR~dRX!S6V^deFr|eu315*~LMJ$R&B5L*|k#yVgY=QkRU`#X*PMC1ZAR&>?xrm|Yxn z$X+sLS1#(1z9h^?ZTo```Af#^;vl~p?}_{l5ln6k*Er}9!eq>@anK=#NthjSm~7cK z4mu<;8MBLn4p~gb>>39h(wL0dH4ZxDF&Xo~<6zxiGT_R^Y+x%0(UD0h2Mia#5E+hFP~O7j+3_!0eh2x&$&{c5%=p zkO8xcgD!y#m|Yxn31nEGa&gclkO8xcgD!y#m|Yw^s`1J*?{*1fXbo2`>JrGX-s;Ll zkJ&ir63EaRE)Kc`GGKOb&?S%ovuhl531q15bPcX1HSf@kbzC)Q=zH4d^K@51aF2U+28VRns!WTPI;jIl1uE)KeMGN@!+9CYbq zK(&((4~_Bvx|c+oeY>=9CYbq!0h6nOD6+n7YAKB8Ro_=4!U$Q zV0LlPrIP`(i-Rtm447RUbm?Tk?BbwHC&Ma|i-Rtm447RUbm?Tk?BbwHCj({|2VFWD zFnc)2s;Fmg0?Qr_V%f7lh-D84vFzC&#IlEjSoZ7>V%ft%EPM6`vFzfYODDt5go}eN zoeY>=9CYbq!0h6nOD6+n7YAKB88Evz=+eoshv(v;OD6+n7YDh++o6R3vx|e==jX!g z;vjcUxG=jo=+eos+wJ0@OD6+n7YEtn_4o!mS1!vg4zkMV!tCN8GeQq$@?4i?7YAKB z8MG`e4!U$Q*mZHxrIP`(i-Rtm447RUbm?U93>ODoIvFs#IOx*JfZ4@Cmre%EE)KeM zGGKOb(4~_hhPpWD(#e3?#X*-&2FxxFx^yyNc5%?9lL51fgD#y6*@laQE}aaRT^w}j zWWem=pi3tMW)}xtIvFs#IOx*Jke9nS=+eo6*~LMZP6o^_4!U$QV0LlPrIP`(i-Rtm z3^Q042VFWDFuOSD(#e3?#X*-&2FxxFx^yyN_Hd9D8PB>XmOUKAvPUO_We*3j?Ae>Z zvWJ6M_Uuhy*~39Bd-f)$zX4_!2f4?{h1tbHmrjN~X%`1wIvFs#IOx*JfZ4@C_QX8?%u2t@vWtVP%6Kp{ z*K}ESage;gh1tbHmre$ijEjRVoeYRw9CYbq!0h6nOD9ABxj5+3$$;6#L6=Sj%q|YP zbTVLeanPlc0keyPE}aaK&c#8OP6o^_4!U$QV0LlPrIP`(i-Rtm447RUbm?Ts30xd> z>14p{;-E_>17;ToT{;;syEy35$$;6#L6=U3?AgUZmre%EE)KeMGGKOb(4~_Bvx|c+ zoeY>g9Aq}=S(CxChl5!5tjS>6!$B;2bTU}>a1hI$bx|yPIEZD>x+s=i9CYbqSdnpY z(4~_Bvx|c+oeY>=9CYbq!0h6nOD6+n7YAKB8P+ac9CYbq!0h6nOD6+n7YAKB88Evz z=+eo6*~LMZPKH%}7YAKB88Evz=+eo6*~LMZP6o^_4!U$QV0LlPrITSl%*8>MP6o^_ z4!U$QV0LlPrIP`(i-X+f=g@C}*~LMZPKKRh7YAKB88Evz=+eo6*~LNjr9J-4Zkx-p zi-W9;dN8xz=9CYbq!0h6nOD6+n7YAKB8RC(PgD#y6m|Yxn>14p{;-E_>17;ToT{;;syEy35 z$uM%eIOx*JfZ4@Cmre%EE)KeMGGKOb(4~_BvxkFZqMrF6mOUKAvS&VsWe*3j?3oW@ z*~39Bd)8#I?BO7mJ!>*pc5%?9lVLXK;-E_>17;ToT{;;syEy35$$;6#L6=Sj%q|YP zbTX`)xH#z2$$;6#L6=Sj%q|YPbTVLeanPlc0keyPE}aZ3j4lqkbTVLeanPlc0keyP zE}aaRT^w}jWWem=pi3viTD*&cE}aaRT^w}jWWem=pi3tMW)}xtIvFs#IOx*JuxsVw zpi3tMW)}xtIvFs#IOx*JfZ4@C?zMGjA;9e7pi3vi{;rFIE}aaRT^w}jWWem=pi3tM zW)}z9$MbNI-3gCn)?8hdT^wY7?85BgAi0bSvx|dp#f90$L6=SjWsi%4E}aZ*;o_i6 zCj({|2VFWDFuOSD(#e3?#X*-&2FxxFx^yx`4HpMpIvFs#IOx*JfZ4@Cmre%EE)KeM zGGHEahh2VDXgFuOSD638%Fb8*lmkO8xcgD!y# zm|Yxn31q=@FHC!BY31q=>}yEy0)$bi|!L6<;= z1wa=ET>=>}yEy0)$bi|!L6<-V%q|YP1TtWDanL1@VX553L6<-V%q|YP1TtWDanL1@ z0keyPE`bb~T^w`?WY|=4anL1@0keyPE`bb~T^w`?WWem=pi3YFW)}xt0vWbnT^w`? zWWem=pi3YFW)}xt0vRy7ILIctL(~Ii7YEt*@L*;&*JatYKgi76h1s<~NS5Tn?Ajm1 zqg|L?9CQg}u=_5K z?BO7mJ>wvjJsiZcXB@<`hl5!5jDuMAa1hI$T$HiO#X*-&2FxxFx^yyNc5%?9lL51f zgD#y6m|Yxn>14?2TpV=iWWem=pi3tMW)}xtIvFs#IOx*JfZ4@CmrjQHkBfsYoeY>= z9CYbq!0h6nOD6+n7YAKB88Evz=+eosQsCmCOD6+n7YAKB88Evz=+eo6*~LMZP6o^_ z4!U$Qtf{#;=+eo6*~LMZP6o^_4!U$QV0LlPrIP`(i-Rtm46DyB4!U$QV0LlPrIP`( zi-Rtm447RUbm?Tk?BbwHC&NCCi-Rtm447RUbm?Tk?BbwHCj({|2VFWDFuOSD(#f!+ z>EfVECj({|2VFWDFuOSD(#e3?#X*-&2FxxFvj6YU_OSQw;vjo9F3c_tvaaUB?BXDE zAQxsA2N|zim|Yxn=w#lm@3LTr-l3E!wuk3ou{}H!i|ygLSZoi^#$tPTJ{H@4dR=rn*{PpKn(EULDS3_nl;+Zhp6Y$5(>w zzVm>dv8`|C)BlfrLnT~hmmXY)M>+9pD!z*hRG8lj(ef4a0LGO~i zQMCxcAJN1+*S2ncLon~+l67*4jVgv zxawj#I_z*=gyl%G;oJ(#`$FdrM}>p3Oy}qDI2?Vk936JJkb~t&vf;ucmI(}{J^u52 zRM<+hyBsbiP~pH9P=9iNfT9mdOa0#c0SW>ZP+z}4KoM^WsQ-R{fP$O_)PKD{KoR8% zs6V(rKrs*%Q2*`z02PO9WqBVIs!u2_Ua4;C?`m~LuQ#hp)zTSHD!i}tyQOYg8C-gtp$s&X#MR>EHXVv?V+5^nfANzI0;&0Ic zixyb4z@h~fEwE^TMGGuiV9^4L7Fe{vq6HQ$uxNor3oKe-(E^JWShT>R1r{x^Xn{ow zELvdE0*e+{w7{YT7A^4Rw?KD)-1kc-a8lCW$E6W?S)1Bdt801{6$5qiV>$-e@Baty CF{mp5 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit index 07c3b4bee580b33493bb8d569857b7dd15b4b131..02f02b0384b80ef7b74c8e37b6daa4ad5b5f4627 100755 GIT binary patch literal 237960 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 literal 227426 zcmb5VWmsKH(l$&WK@!~E-JJjdLU4C?cefxLf&_PWcXxMpcY?dS+qcO%Gw;lKX69Vq zukO`dU0r=w-PN^O3u!U1_sAe1Adny}`LX;L^@Ux=wjdxE4qzZ)z)^lB+2fW^(HeaY zsm@rW`h&<8DzOG?wMV3n;pxPnrp@mJBBAWT-V=NMco!bcFC(3WhtJ;({ezicfiWur zsV%m*a!UzuNi{SrFbid2B9Lqpld~d)AJ;ka^DMP!9?2rp0C9o{DOB7OB+Jg=>rAUd z;b_C|O6zhxmhm`DvFl^%T&YIWO`938ao|3qVRN|f7z^vkT57F-VTZMRxZnVkd4ygH zs64wL%o_Er6wAq_P^IjTy6wvD+V9HmCcA4KnNKcUrc^z6Xd1CP+&CKA1GtmhCY`_T z?$~et;Ev;n`Uwfj&uckb|{>#-S5rS z5zy*>U69zEg)F4_bsr_Cs*D?Hwgp}k*|Yq*2|TfweioV8Ee{0L36BMgKU|M3-}Gco z<3tioR<8;;+uemQD~vxsFa=|W3D@olJcbhk6iF;1x9|?Ij|XSm?T!g6sRyq!g3Brx z;ddPa5Gu?MUl#MT*a5XpJpuKsfsZsAHYX?IqS1C7Rq0G$TxD-Z1Fw|8C*{8#wefp| z?(^^Egwx0}0XW&diOoeGY46&ai zPZ512dM|qUFp^ME8a(QMQc!A%Z85!DKiHUV z=j7De(}fa1AjA73*+Y7lwy?E#6^kTa07Z=*6JIO)HqM_0BRk+&a$K+Sz zSgS0b77bN1)etVQ+$NIYkq*Sn9#x{8rlTBi*`X3Cge7mbL4{!~8Om zd*TWXoY>?knbe>moSjZ1B=618nIFEpxL&dbUM$(a%o-^SeFsB5%{)qW4s9u&84~S<#Xp5@UVBuw&&Hf8j-FxyD4d1XDuEA z{hX5|$PkQXdyVJg*VgEP3+>j52cBBKDZL-n4|#QtIzYzmn4H{8y@Hsp#JGYi^%y6Rbup?% zIjj4{i-79gqp#J))4G<;}7)_+0@mR<<0gsLOj1?x8 z_=*8pTwZN){g{5`1Dx?a+GWA_I!E`MCwEWXgv|2H?!OFYa)+Qch5;!hjom2|7|F`w zT=N{M9nrx~JV-$(DIzI}2h9>Si+Qa#KJIuYzg8E@_I+Ggu^|`jAzM6uLru)!`FO%j`8v6Hb9s`* zWEG0c8u6h$iS!=^jL zO<6!kBy$T?W#%XK$1PKWXUN=@hJURXzcXiO45F2$!;TSO0kM}=z>TBgq^)ys-F2`{ z*=x5yNeHBDjoYRVkM$ICDSH^2vgLv+=p$zD+L0AM0mGq6X5voJ6Uf4YLiYWh8bF++ zR#?xOE|;B5Pa+Zzs8WZ`tr&)@>qgGirol02#j+x{G0=QXpdxP4l|{BzC>M=n?&#Kw z1f~2*@Hy|)Wc^}b`YbxAt_{EI+eT+FIm4(1dD54m$Cxp+`=Etd!Zyo z5Fe(+vp3t=V)~NvYAAbvJZ#eO5UV63RlLA<7dED2n!6@=IsFQP$}%T|uclJit@4$> zSpdns_LOl;3{Jz z8^s2#I^y0+mmybT8WDD!O0ax-^r|LOzv|1wj%C|N(lsP;Pcr-9X}s_0Fcad4-sEr^ z+msHA7zc*CI}WH8MT26MZo;zJxS@gBysX#zFdBK^yHuDr^yTgC$Q=T%T`h*g#4aA$jDBL<()A$ zNc1{%6j=jPZIWcH)^D_i?GkF<@ag1;&kQl4AKq`(mLJng&05{k^M1C5(S&93V`+u) z+Q*fWTF&b@j@|^bpf#23_nf}O1+PCi485uBKfM2ewFs(dLUqAXZqyBBaRMpfiN_4( z{u$h952i74<~-+}lT5B5j~NSp+61j`lrU0aw{v+!HJJ$_sYx+ZTRDd^csA4^g`JbB z05n_Hr3sfZ6;!a!E$Y>(Eb)X;RTL^2qEq!>|KNP{{ zccNT5k3lCnjrrsz-q@;=X3{g7d`AZJF~pNf*0P+x+E1k=en@19{yFSuf?Ny_%wis* z_#E*`tN)o1dQ;wCd)SnFH5Gdgux@%j&`hU_0N^X+KdyL~brl*C^bi27C8fR(_QG*d zQAJE4aoEdNjlfJdinZkrn$T2+XNIQ|8TvMWND>Z?3L>BMK>%xGul%BGujagicCIjK zLG+0FCKeY-qVKheUv|ok&-*(4478TI1Zvou)1I{}@!q52*A!)f=UM{(PO-XdK{=T+ zah2+LPF=1#Gj=fFg4?$${b5^cHUI~S5x|+!N!5q;a7vZd5j`M_>AMoEw{Bt&hPB0P zLTyj)MBb- zqR-<9#QQRZfh#YOfQ|yBZ)7AN5ZCTL-QIO8>m5qbs9FKApu)6&;0ACGYk|&P!J_PL zZhWbuccw`l=L<8-XMPc94XuRbF~}64fbOQwISYuV8D#UzI{DE7`gQ9{OFAn83m~#; zj2xmEeXGQ_yZM^=WpVcjY~h}{o^G)2n*BBO=!vt-it1Kl;XZ2NzTxQUo8!yGk(=g; z-i)(~_oMw+Xxm1Q|Gvh z?~14hQp!FSeA?Gdy9~Q!f7N&7F6(x!x)kcPLYjQ6yp%H7U0vOMx;5Cf<5*2g@t}NS zec+kieS&yQewB87>B30CD;h0A=ymvN$Zi92MVn~IAE;4hQ_XNDcklh4!@M`m{?evq zZPVqc7&oBcM#jXW(WQ6=7jI;A_u{!};a&@}t>jK?a5OJoOy;G9dzWWr_ld0XvJKZA z>siWh_cg*@sMt)^6uR4M!gI|~dXUUZZG$VFk3(trI&@8GP#|Fws>gqevK**CkiX@-$dXLg+M_nowk zhY5Ajg*J~Mgn2W2yC|XoH)RYWp3};Xypj$E=Iax|G&mc8dyv%Dpd6UE9wsxty`sZ0 zv~4)QoAjA(tm>UEnqmOGnMg(m09Fcl7PimFe^P2YuJmp$;n@V_hfKen|g2f#@%6e@cu2Rmq0p-iwet~&u z;OJH)`BT(1-H$GB|A5xf(?O9PyqnSt*xCi55NF~1NWeEnAOB`aa&u~SeMN1Goi};OEd+1GVZKr+MT0IJUkx9i*4jQ zDd$m`ZRD>Cj;(pi7#I>_410*Y2ZGOpkRXaCO1%Iqz9q{UKsSct;eq9Hm&Vj2mOU}} zCgyP{Ks(bvVZW`nZ51Nd))Gh(6SxfVrSApcMKda)7>{PKQ+42iixFq<(!z3-ANuCp9 z3Mwj!H99Vhawt5?_FOcKY&{EAtqKviu%bu%B}?MXWoDTXke+Af1H@3(wuW){n)6Jv z_1C(k+%E&HFV*ZXmx_{FSm;zL8heA4qx`#$U{v|b{Ab67RGYyhI*o`dePYkeq{b$0w%5t za^AvBgkp%V-u;Dma}- zwYu6@$wDXoy8h_|G23{z0LhhScz*yUpv6Kp|-)o z_^>(Oi#7ZM8pXxAz;u*MRTv8FbiX<=wU-rVV=ovJ$G^vLHsp)YxTpBQNKI%7@6RCe zk1aM#ixJTRa0n?u0#*t?A9-TszlDVug)!){u}^!$Y*%-1)dZ-97wwGQ$c%Ki`kBr? z=BraJ3E^?8szhrQp3#>#S#Vf3_yk>yG2w4#j*RWnhL#!Uu%_dVci)U|FTq{6B`Xl# z2D!6vzMhM!I@4Q?*DvMk;zA6@dE%wvmLm?TgBH_G*`YRZWKf>UuHiStMt-mn{1m`w zYh;E6X6obGLORe#GuXW2T(z@Xrcs5uEmReYo-4rBE3Qf{x8L55YVb(HT_JGj-#}9& zO1t>njiHItlh)mzQbz^6BJYLND5^+_@)fI5$9X7>s1 znmw)Y)uo|esW9!;H#kkbB~qriNTbs`rHq6cKRbHnM}$gc8o%8=f6<~v=c7IkxgC)FIW=%&mANald-5mM=(5dMww^`rVw#m1iSbK=Hg5uqxK%@xPZ}o6K8lWIGs)N ze4*-P%j(u9?u_hQsH3EUW2hM2LUygdf>PE$~DePj@)(m&rj1iO>>!7<@p7GZ1jFkhgIdVFN%r-SQ6TY z?aZL3x`d~lOKFN@lpWbn#rh)PlnfDy+%f@=I#s2v&UBSumZ=8ej2a*GRMd7FV{U&n zSZ?o@H42gSQ9qb8cpVSN52BbWI4vYdPk1YrNwJQSJ%2y8u5B{e3cPq^ifq7zo+`!S z%P$;>x^-m>x@e}J`i!KXcxx*J7VU;R#9N82#ht2hmA}`9AWN`LdkZKnqaPH}y zl7O{KwyI0#zHm-$o?j54Kzrc(OEy>9BMJs>yRe2Hh?jRlh>w!&CsP7-s4yY=0eNoXr`UA`AH}IsuO8lwq6MA${(iRtXDU% zof!qBx>H82wqeSXDh;@E=d}%He_di!*a-tlBd?c|)dQ*CJE&YeS}cXDGPb)gE8n}t z#6cCMTMnj>%XSg&^p(vIq_`qhElREOvcYr6|M> zuVU$2-tLBrB4KxGyJqU8z7Aw_Ia6QiKquvn%3cNzr+niRZB&0ar+rY->>YMYTt3kW z_~3oSFTl9hgyJ@0!X_tYMqMFGTOm&-ClO80&?6dQ?D8Zbo``^Jth<&f#mInHh);~M zewEG7+pRR_^;&VT;}$Bn54mtpOhdDDV8`8Olv*CQ$;6Yk$<%jmYMo>2u6b7)9ql9H zD7F%OkmACvA$Yq`K-{1}L8X&!342q2$tzPzdVgOe6Q#qb#+}-L*N_OeX;VhaBE!j$ z*YhIP3|0F2TAf+3JbRl)kF)GgV^9V?ou*m$bQyCm1GsD!b(9;pqzt+Unkl(9*0(Hh zXJPg@O{e4WV4>XO+Ea6&^e;%K$i!*5p;Y`-&?bL`T~OJVyN%PGz3AyeRsvaZKA$H# zC)}ft;7fzRP}eTooux1>L9B5E*He+WrQBafkT{kZTkm7s@FB|HP5y&NoUN<*sXdh& zJx&dnA*UifX%$^U>x`_O{`a&(U8+!9RC&EcEIFi~($TIChUl;kSU*W%SBo^s2d`bP zI3udNlMOCQp(9&~Eg+e{MMnNSk{EwNkPX?7B_c7ge1;TpJmj9v1(*16xGJnsXk*vb z@xWcp>QK;IQYI*bLcGQoB7fUcGJ#{tJ5i}`X74w+ul`PBmM~PYD_F}V7GW|(4JtTX ze@5R%X;r3Zeox0R6Nh0u@WMj_59YyGpxw}eXvWJjDraO_aHI@waQ?+M+m?I~q7c@O zpU}S}X96tPAeN{Ekn@2XM32)J&t2$O9Lly)A%7Es39nK$pQQ+^n-h{R@sDd` z8rHt+3@o-`T!*Op^k9nwx2-jAMpl%IwYU%+z~006V3VMYi35zKf&2ar2rKj0jjl4d z74xnZgvEjSc_$y@rk3}dYR>+#8dYw44_`x44gh!8o|sLVVbQCZZYw75b?A(-S`I2v z=7a^tfAYJ?3>lYLx19pletK97`Slsk z9dH(_3BjuB+FSJb%U1geCb#|D$TpMe{e>t39{b%|h=e`R#11UFfb;b^GS9np`^%FD*X<8jRsZclX4$l`LX z0XuxOz|P*=$Xn;^ZG=u1m*I|io_-K_fGDC84cysjD_=r=YvGgkeoA7NT@cZjCc6Hr z2OYbsPB_kH%lDhkbRpA#eP1D4k?f- zi?k-VjSLr0QKD%U5SnVS)}WecQapq5KvX+Ve46{&2^qjT(UCMt4@3?{OgV1meS@r;F{1z zR4Vc8MI0bHza6kq?Druk=-v+DlHJ0e+Ttb?HjTEK;MDmz&k=SN*Ixy++^RW_xtYG- zRp$*Be5<-Y6zF#NH;2e_VoF9H+kw{jQpE$41@>On1O#vlm(c2dhM+V#dvl!1NU1O5QKkj&~XC947lRW_to<&3~OcI{Rjg@V2C4 z=r@W$?ZG7fSL#*w;V1^*o4I)-^Gzb8MVFCt`Arva=-*V9x&L9q18>=Tj19TpX9Jr3 zUoC?lxc>8G|49T7dXW>8%kVt?$eWk^aTxB~0))5pO#+@zB^=NLOgxYVc+lS#jJ`k` z0KwfJpy%BC$y@dX<1Or!QvcXi>JLE3e!F2XN(XoOllK<&-PQ7Nw~GuA=YT8Mb0D0E z>t`DaMR?s<*Xs$~vu}~!a-rWJdH!1w_M82GQN+9ZcJP0w{f+bXz;Ewf{PwP=q((83;uoXH)>MgVXOar?zgYWy5{HqPJ|D6;D3k!=!NB{jVwV2 zxzT+p$DZ(`0rZdtY4}b!Qo%fQ%p=@L>J^<9Og+H$q>Z#{64_= zTe$qiwcdtrB>9Vf{@o+x8UNhrzj>q?=I_1L@OR$wMJWCsB9GeP{=rh}$iH!xN`?Ld z=LV=haJEDG6KB%&KXA^>{9B`U;Qrnf)&F$GpYf`{TqyJc4h*kw7D3HFqRf}wd%u4cGqWMuZGrYQXLHH=49Iyj`)~p)Tit zgv*}Gzp%jj_vP~sxBNR9{>(P>M1SiDuDbu>2w-xMntsc@|H#4r+Wr%Dpcj5`Lyvj& zf0_FyynmVp&-O>U{ZAhFhltMKYYDpjyN&40w*RxQ`c>8b$W?DS=CbL(&~JG2UORjN z3U9Dmy@edeqVtO1j)*&dV}^FmTm1t}GT{qt2FxRC-j!iU9}V!%co&TDA-55{Pk|rkX-@C^YXPrcplyFs z5TF;o<%a)RGeDaCQGxvC!+$PjAVJ~}5o z7nRmqP>jp$F7SJACCAmDci+RGcj5D&ccVM-UIgBiVRWKe|0R_E#l1zBe;bf5e;@f2 zz=%xNP9qI^9{pUpX=Plg-)FxyJXZH&HEmGS1Mh8Tt z%QtQWd;Tr}o@0J{qCcuZ#Z`r#?=*rU$~X+yFW_b`A|BWY0(K_eI$^*LLISW81?B~w&qUwba8_z#75-F9_%ZH=0%c%C?x5+))h4i!Hkxz&NM zRMZOGGaReedJzU)xSj;VIm#7fG_z+tT~ZZ^;|;1Y4zAWumcXhxuO!O6^b6-i4BcBC zX4Zorym#p!qmZK-TVhJJ!YyES)Q`Re7mS_WBye7#7!*0>X2Cv=(8(4kaTM0M?8Vb? z$VjF-+Dn8SWbYTuQ;Asn6Igubju7@7^g_{i< z*+r+e^Ca`bM>W^@hp3qjWQ%a(YltFm3Xu5thob}SkFHVi4`IOP_JsI{PT(_DT>Qfv z@R=jCd%8^xM|@kOwz=5~MG3B-W@V}&`!$af__DW^X%6GGaVYNLdt`wj;l&_r1k;6# z5oZ`p)K{68-F1GVy!-6;40B z+JDY%6|FlLDdFT0VF(?-$(X32rB&o6MNg6Q#J5v&v~PqRYan9gsDn?nV-K5+8NnHy zX!v=S%z2Y#XOIDG+8nQmCNiInz&~-r+mH`>eEAre22Cs{b-h}~qkW!lw~eQfB_3!C zJ3m3e6K$s)B6**Y>_m{oq}9)^^fG|~%qQ=tqwSW_QwDz8(uN>_)M5#H+gg4U{IL{l zyZrb(w7zz@{T_a$B3^&_6-UmKDo`|Z6efMM2u^EOODi|B*jyUhqI~g&1aXu5nP-xH zk^L7tbMW5mJ_7fIH)2fL?7F=_#+dyIVcU~vTqvzWFDC)c4+>b>EGP1AaY81Fz8gc^ z*x*X$@DfUJ59O71MxsYC+fScV*!xss?@p$)1_MMOV*{;Q+8}0Jo3`GKJ@X_v^ew)! zKoyH^zMmy7C-waQKXe`UwTAlyD~8Nkx}Xgrn&>Q>v_{HlbWbUjK{{H< z9?qn#4p2dUEw^B#k5=q)(zDJM03jgaVkuK;YoRN{qfB4~{OA&9o$Uk4Hru{y*VGKm z7983(o1fLiVx>_VNwS-QLjn0f0{LK5=WX5opEM^~ekcO&W7n0{iv%8&PVNxvb>9Xi-{LE=X@L+Pj^$TxG z6Z!!}o0WWPC#eC=ydTZ;f??caF8_7#!G~k#WuesDO^#M_?ol7k(7n5CcR3HUhs}); zd&|AlPh)BOUou^V)GobwLq{6%WEZCAzN>N7cReO z8Nim2Wk1EFqLKJz=|LHzZXb5C{b=006kx{)Wj%Zx9ji#ZaZ-9;Oe9-9CCk=c4W614 zJXvnIDF`;!)$t>qJt+o?o1&!sP7_W}F?x0hq~hF2xu0exZ!9wORCVgS23A*KnFy!* zMw_9m)*BrO#f=)6%IZ7_9yIL1!G7gA41!p4nAGh>G^0iM;weY?PDzaA>v2>2tp%$` zvJ|!MAaX@E5v^kVidg1dwFOBZz6Z3Vwlv_D%~|M;Se@`cWRZZ6~6_zU!iL9OA zmuaPoeq3p^>ej)+j57oemY|mX5uWRz^C_ZWG|N_p_A32Qae4gfoE*mt_uc1A&u(Xp zCE_D<7`>9Aj^{By;s&R)@W5^aOOF1yPB|r)QL?^4q`}py3(ENv}c`#IY-%O zHb>OyPgY2UYzM9c(KRwgsP+)MJ6A1yt9FeXd1T*rXN$p6W?d5{5KTBHs#1_1k|U#( zqK|2ODS`}-zbK&c(~aX?C4ohszFv{>(2cs&g?ARIZE`NtV45{`fqNgiUm@nX zS(P#kv;XbDw|h?jr>@8i&F#bopc!t^2@iA3n~z1k8nZZ42z{1w>Ys~Vz6WWy zvikcp>8?HW^@!&L3k zCTnswDjUq_j6mt};`m;F1y{k!_n=dfbYu3RIsahETDdYya(TS?+S&N1^)dPB z+cIFSob96Vz3Zgg{i@*O$U};*M07QQVK5}ItHT%Z;)2wr3aJ5_;LH_7PzXB)!bSma zh}wE>ZML!uaImmrOht28urOzw5noRTj{q`;dZNH?LyRbwSe>D4Um}||nJ^q3kXfGF z>xWTKOZO#^0JQB*#Eing&*(2BzSA(^9!6I|dzn8!RjEND(fOdOjL~e(Dj|F!c)SMGN(P;TVKt0=BzjVh?sl@emsLbZ=yM|_Z!%~W+l)kSfhU&yavJG~@de2% zh99YFX%nQ*nbS@jnjP&TDL|-mbsK*4EA(;&-5}8ot3w%2DdS$QERO8(S$gU56w5|< zcVUU8NMFeSq>~C2^7d+7?HzB5sZx{K0@_KGI&K_1Dms8w3V8FLw{LtK1flKifBGjYtoMcwkw*iW^d{5}?S84rX% zKB&M~Zj$g~OqcrA;oS*?ROp#`8)sh;J6L(+x=A~aV^!5sHt9alF_-h?`&Y?j`FZfDWBOZ) zqwnIYQ#Q(-;5Wn1X(PUg=DJ!FiFW7qG$@6s-F<-C@ifOHKzEEi$op8T4_ z2pYzjx#qBg+YgR+wTIdf4%OBdvw5aspiNLF?5i)HZjgpS@2X3UqtCD=p;w9aATCgF z;|f3jASAG`ZANjLYXAPipLXz6%FKMtMzAjo+}*BYv?k`I);*`q0jgjt+BpL?U^h-- z$-D4W=Q#y7D`H-|KU|$iaai4Wa}&oCuJ^Mkf^Cz(WqIOm6aQg$s#k4}VM>($i!$PL zh?TOJi2cGhv}PaAryq8c`mQ8hycO)ZyFnLq#-W*Rd9b9YBiq1#$auct81GIQ=oj)i z_h*pH@J>QH&Blrh5mbx#MU)yamW`Dky{v26C4oXC-Lv)-sgIWP?o#0X)qmTk$!Whe zf0683EeC!+LH@_+hILf3OO)jG-0IxVZBr)G6q^O_sg&FI&kbUgZJC(xHif*<4{-Ua zw`M9Rr!vLU&XQ<^be|qHqTPz_T(69z&vOZz&vog+1n#wL@4ir0Ry1R}(bCG`N-$DY zaN{zA&ST5=z#Vj*Lf#P-awN#0fu@@~&(#kPnn3vyeGPe7!fX?>D12648}~hh=nIEj zjqIb?tYX)^DAi>|H>c$$)`ZY); zvcoSVL}s?MvRMVDA*eLzBKv(A{>RMo0w3wm`aAra(2L##9%xX#7@&FYjT={a(LV} zG28NkNj0(+1BW)5iji4i;xfmia@4S@~Uy4Tm(Z6tZb^q3i_a z)#u5vNBf-;jk0b2dLz}jT>I_%lQc^-Vw`mhwj8mio!!FPnV(%p7ydtb}u28vS&rXycZ2_LNw!C z^01#neus2m!RXM}6gl`jg!Z9SAJIc3kBF%)b5&rVE}r5lFD2oj6tYnQZYKGxEl;k5 zdAs0tJQxh%0;`Rjhc1hg$jJ%ot#V1ylJ0j-d@QsIJgieQ2a)brQH$Sw8 z#WtBvSQeMz`MJ4u4diBs0F20n^e;k+&|Mmlm1G|xZJsgV?E1@)Jgw_nW&R`jz6j0P(?<3t~@OW8ro6YBFMW4*=M=S z?*?Pr&snpt5YRE^7EUv{fLdnh zu~TqUuLmh3>-eZ{%pcdNS@fGiGYy7uGWVDl2M935Zn_kj2vSt1iaT-GLvn~D=aaLW z4{hXE=a8@BSUOX?B>@P}7}Z_+?u0|8K2f!7K7d-YU=*#`M|d9i9in=&RQLzp?nKNB z8h>VE0PM?ZoCB8=VJI^qd59g~UlCEs-lIu^wkN7qjSUc~`i&&+%+z=w=d?-#gl}P=15X!X`!5bD%4T{oo~^L1a+^x+Z!gy ze+Rx?4|$L=SL0y|Ma0D$M*a0yee0nfb+vZ7tok&J2J9+)E}e6em+%D`9 zHT3IlRA?Kgi0zxVR9zy`AGHzx`UBuMkNqAdivoQN2&AzDL8hxh8=El7Xwl2wnebMw zvEJAF+n=YF(mG<~1pzTRYFiWqEu9%#r~#|!AnDKjF@%lqa?ZFgh#X}BLf zL5D6gOBOWZec%nvMa&aUC7tt>`Ax6!CZ^^ZXR?^|&h1TmTo{66sve4q-c{+QD5)m_ z=<6*aV3o^_6ccsSsNYE!e|(3#^Ih5K=g2~dl^0(OIDL@}T==XJ4k2F4{9SdrYfE-F zHn*L91m_|OMT^+XVcYU)KEu)&0l*?$?3=y$lF9Zpw#D#4_xi{OmLLoN-UJsc^&mhk zUI3;b55GS=SXd3gv?Xd^X8_YAt~qp>n$YV}&9O25q3r(qy)jAAuHol!_nF4MFbyW_ zkWA;say@4vwYmxhJlEI?FT0$19wk>4%8j` zwlE%U%)&{PVM&d&oUkR(OgR{|R^o8+*tL2ZO@Uvgtq7jpcEoL~VbF&Q5{rezZY~Th z5Fa(|2!08Bv^O6W_o4oW#xK3Fmdkh?KCB7xmntN!9G$v4(coY$!(Ae@77j-MCy!We z$S)RsA10Vd<*!za%tai1?48Gxc(FKD5u^(aSPnk046i!iFlESfjRJxehtt4yjE$*{ z`cZ^Cje@XPwz}RTj*L~upc5pa%H}W+X9G4c)&$m{8cbcfQO^2c?LR}uB==LWTZKW zM8lwxOHPg{Sc4vF;l~nkJ4Cb%%j;)peW;Fw5eqPd!g$M_3eur zq537a73SCJPDmH|1dqu)VR;#*B+8YDJJ~`zbO^2jsj;43?`R@33FVvXUW|M~&R zxWgCgYIqn|@g?^u&g-Sx(e4i!n;KX zEXczUJ++p%7i$X)kX5=<#4IOsGQXfD7F4p>r~@eGk&@f`zV*)9mUC#v1V}Jq+U$6+ z+i&u#V_nR|AO6`3EbgOXYAM0j+4=fG#(M?grZYQ{-B3?{JoD!j z!9Ku4;|tRdzPU3K^x;YmR0cP!{`E5DV5cPJnVXeLCy}*%_)~+uA?zO}1uF+xlvdv{ z*~2DAi(#6S@Dy1oy*WA-qP4%(O~H6#hC)o&1fM$p`XvE)CCOl$f;nZ8ZzR`|Hyf;n%FJpa6InL z_K?$RuFg||!wzi5&3xH8oM-BNNxT`=o4t-+{|xu_>$UpXuF|0xgel$D{p$4BNIKHk zQa=*a?s94A%uIBtUzVAl49#gA11myK!-&7}68ni1(YSEH5qlf@4pD-VLGwjf!5b}| zBEVqJe)fmY=wTz@7*(HS#1kl*u+vm?76?w{S)Oj=v{(8yc6bY>d`7{fw`k8Gp+bi0 z93FF97THPWEota#IPO6#{Um*NVl{pW{iXQRYP-<&%d&#MrTd>JQ}pz`@mB$B63=++18{T5FEHzZ2uB={R&zE@nbd5-z;8iETkT8GCS;FLH0TdS zt>4+8l^kk}(;d1D*p(YoPHEowLUL&3s)}s-!|Eo*ImA&;?!}kxhL>pdZIK;9W**|y z4$9wN^1f5U*RPEk%_BF1ul&RUxlq6hFH4cBH_dGX{L5@`7@S`e9@MJfsB{+6Hy9(Y zI0tdHci2&2by5T&nNMC^#9b>#-kL~*MGLQBMdL4X0Q~0d&lbLgzu1maC=IVg$9{vy$I%26hP8Nz6Z^6^Q?)yb*Hq`R9y7!P zZ%{juh6!_oz0R2Vr~@xn7C8s-svYD7pWC{QOe_gsb@b#b6aG3~h|dOKR|>D#wc7B( z2zf33Z9)=L*7>V1sC#WG4z?+h|5*wa3~n@skCewA4U0IoHc{FxRmajE*J1wwlOicuHF^M?@}JJZhQ64Z5Oi{ zhOsEIvX7)}JFa2YSubJY=JP)y{_g7H4T_xd%^qWtbPFuAa!=y7440Ttp$qoYfoZNj z(}6nvRCdA~U%ngcdV*txU3dt_-Ja|>SzOOI9ijU{oPz${stVCg{WVH-`vBBnPoy$S z@0bN@DZB~Z)U7t(4;M(JiSY>amgT4bmL5tdZ-ydGaRuY>m3I0Ituioy)!1Pr^x=gkeeF>1V zr2X-rqA5=Fc{Za@I>AHjT3}WxZAfGX{}}B0VEsi=I)cxMcApcwR%;(xNEMd8zg~ID z6v=?B5Zdz_;k6(aq^bJ^p?M48g}Q08VCuarz4HM?fceH#Gu@;#Wvs@KaXC-E{E%Q$|KmeP4F7V26;CG+Yu_J?R&0_Rt@b=EUD2QGtPQ1S-^G$(no4TvvlB#v51e% zurJgLLx4m*uNtg_UUlLrsYZv$O0t`h@w;LV>L+r&0qImF(BQ=2st6H7jOh)w7g`N? z6Q6d3y+LhKPJFl~-Ogb+8}*G`P6ddz_EpobtrVc13ofv&oRIq`9`_x+v~PB?ao^{Z zw=7>1hs*XtBAA^|n5;JKo`wluBuJVBg4o~IK0w%Ii3f5Gt+);NOU;A-#@+nJw{klr zeX6?Gsa5U0m8VxSn&!iU&|Uw+2lUw20!3Iue^)!v4W6qV`UPG8Ngk25Vy}F!OvxWz z?*S^(3+ZnTM7;E9)y>N+62YI;hHRe9Y|fwPjn9$Q-Q8M{v}^p(9^0|Y7?Zw<-8leV zbAM7dUWGgFd-NaHXs2Kz`{PG5_LpPE%>y<*?GIvo_$apErrJNq)Y--Yb|P}SYRT<8xxyv28M;UgA*V^`&9M|7B8qt!LaCw zPlA5+&nZ&5{tUi2d_-LA()Fx9&cE<{V<*vyN9l_vklMk(7?$Q2kWXfKari`XTic_a zgC?Y5T;%hX{#%O(;k=LM>fA2SJa`@@E^2fNQ$tr=(Xe3VDYOL2giLhAA5V$F`VxCV z*>_bP41&)hV-V7LL7p6EXg>8p9> zm2Mi4?XCE1mV6LjXiAr3q#fs-!IpOOmeN?@Om~>yc#4M5ULr}YgWEz@tNWgCQ|znu zx&lxX*HYR?=3lfx`bL;su{dUaR*9@vFjnr<7w6dG=cAl>GB8|W3LSo`7Z@d_tk-xB1NOMKgG;j3(pRkegcg53aMuCPj6L17 zsfj-69+>4YxX(QHyf*Vtk-d(eaMFU!$EGzSnja3xQ^ke5b^B+f{Xv$bA)tnJ_{^)L zQt6FoI3UEeb{{f0Xep<#1P+9`B@wl20D|aYtZAzF2})P_+(OM6Q!YG3CFnt(m8x2J zje7v`)e=EgD)4Bt%(E+N^32mphOUUEA9|~QGjidfDr;-*%f@uELqqo*bOKS_s-{ic zO;E-5+BI|FL*$teGtbKQzP#WZRaW9-i^G!!-eer!)os!g|K;-NN}rbS@hlk8ET!AY z&fFx;v3N&*DPRROE(4R^L&(N16Y^k|kffh-c>n_Oe>3PUI!>s#o z*d>Q4xN0NgUU;qPE<(%v=YlBUX|g|MGkWF8yjgblmC|EC{kd!|8WY4-2GhZf9c@Yf zB>08{W*}^4m%?_|HKcptUVXxaPP*B!^l8-;i=7XwKMxc>Ag>A>HZM*bG$}y+C5s(| z5+n3Yla--54*O}s1P*Z3<)nof6hfTae-pfR?<&%XGA4X8K}<57ROEBPiCTWd3)Um8 zDqHJ_TQsO%yAUw%FIhpzet#l8ubB3D%{q z*FQQpY~h=-lBNba=l5Rg1`m$Gp!me%yPb9NsBwz@G%<<{pX&m9H#4I|2VO#~^Ejh< zhQ>3T9@nbQd16i4$1<#u1tH2i1YJ$Yc{1FTeczlp=tk>$e>a1U!t!3*Zi_Ca#oV#D zE`bTYJY%p^(|H}70np&CssxEx-Hu!cOcFIH25{HgOqY5QAir|`ud?o{~0mfVdgXs65N?L^o zRM9Zka-ITLF!FVlS*-cTjI$I^Vx3CEyN|TgEBioX733=1uUU(uVS^ry`?)eld}ZOn zrwLEB=eQrsGRI#Ypdi3^X5V^T7>Q*?38&O#+vIdEtyvTFt%Z|m8;3>F+FoQx+CC#v zBofSZrsRQPfdc6!pAH@mo#Aq(*T&OQi_(}WPV%NmjTiaDUy0Ckq0ZL}HgY4V?YT3~ zh6DTtDeR#5?3Pc;Oh=)B^0uXRLflIec>0@qd{Uh1DBQLLrX@s+f)K@U(FBX3e}5QO zBzxu7vwiFcE4nM&%Ez||9-Pf$t;Yx&?wyqpNuy z`xTEuj+$>0Xu1f;o=L{n#j)q$f>PA}5ByoZGy>^Ppn!t?m)#P_4&4gN?(cv1Km)=s z!K7*YjuUyIixb_fQbsQi!Fo%TM;$pI-VoLbXZV{w>)Q+KYUsi9%83EzhLWU-heS!W zbRz|c$Uu>)9WN)+ss(ZV*nQr4E|`9x-?5-F)E3+(7{xqs^{NLicwM~)Xv2piW~DPe zj7LUxXm(5(7Qz9JzxFTgJjHN_hERU-*}Tav<*zsrVIP}j!5(~?PRzV^K_EN$iJM%;XZpr^h@`fIC=2dh_X0e&sXlKQh_3Kz_-$!o!eD9BpqnZbwc!G_+UD zk&cZ8F307(#fs-(xz58%{&A?urQF@7ZL%)xdN9f$g!gc@uibiNQgcy0oIESeEIhe$!*LZ%wP4Z^m8O%C z=Cf62oVvEK$DwY(uHlwuC#U`)DGr5%VrYd*ME-{}Luzu3DvyT>;hNjM2`}mzw1?_5 zKD&Aut|htz+?LX5uLSh4f;&FygN>O6!MZq|y%auS$XDRkR*BH=Zd8bpGjjN?Df~#2 zVq_jn;6DN;ctLWJ>o!s*_!^~(LfT|f_3sT{FE#-vyoIv!#lfMd*yBRjfi+9;6sH!I z1&K}Al)rva%VLN|LL$Fnd~tDT9k_{;>T_pU=MCT#IrWYLsa-Yzw=p=?BP{8fuL~8q zp(fxXGC>}XVNbxvtvR(b9sMkJX6v;I&Tvj|bGGV%*7gJ8g_MbnoYu3%)!cFMm8i@P z;c@t!CXGYhMWmDMlHM9dgQYRWWh4uUH1pTQ3zLC8r4FGvR`!yL$%Lm1qhA_b8#%J} z%(Wr=1lu-V`0?+~VJRYIf@3l#TPtW$W~ApaGvU^4%-FUWq<0QtB7aeD5q*@LbKqt? zY0^MX2T$jE&PyD;k3L6TfmDngG>fJY>0|6&JSoWM3kC2{n%jMgzHmf4G5F?lIKLcG zBY{}G1g#|tMmpW!lTOU8iXG2qnx29O)0q9&%Vics+MwKzOExG6(`5XNul}K8@l9SX zRymdmpR0w5B(~6QdsMlpMJ7POB%2e<4KVnAJEjrs=PtF*;B&}v*psNU;yZRaUr=rP zjcb`UPmxhX&E#j*uqR;_DcOQHvqK4~?73$QT0sMqI)qYFQ+pj^Afsy6!abSLAfT~Q zb_}Km-iA_z@xKejt@US-O*9k1)Dee-Jo8Bq*j6$QLU9(a_Ypt&KY1|QHCZK_o8BBd zYXwUnIdzkT(E+ZhxfCjHZe-vFd8iPm6TmYN8IKBSsYL5Op50@+Ab*aP6pQC){%+nB zwE3Y))7O~nDrfN3dXY&BP2jDZAw1;`uJ)9}!#W)nor| z>V%b6+*bvlubYJRq8sWzVe+_&xzXFE5xSjR4E@!HT?@mIrs@8@S$@!Dhmzij z#l@p31aq>knl#=XXvu(N4pu5px)43}CoYvKh{1RiDdN+%^M>dKDiuFkn_okM`|tn> zPxy7*UXsxzra%89>Bj1w4C^73JyKiU>rH&L8jF+*{gpcfPGpgCPKsenx zifg(YQa1Qj|LV6P@qCo2Zg)KyY8lCdjcYpM5WU+xB7%jg>gFHOj)F9e7nS>Can7{l z{l=2vQSMSI7_xhatTxtk1L`KuWS>NA$r%}0X*f_BIRZ`6d-hrtawIydp}ssRR+@20 z4$Bmd^wYXGbZ9ujoO0g7T8r;>h#K?{%dV=Rxg?zvnr8|_I2~b zW|J1ycC}_+^k60^o~kEft%f`imbT^N9?CGY4l$!;a$nqJX#8tCCYXm>%_1c2Vwm~f8xq$ zWHQPa{qvDX@3TD(1C7EM93h}NPv_t@kVRc09bHtEo+wZQ+j()YPg@xFm9rwco2dZq zLNN`L`%}|;CEkMFcSXz@jsrlt4WvK0u4;o^KI!QH!ba17=|4ow3RS-RB0xUuR)NB( z3KO0$zQxCrU)n}<;rq$PF`)kadf-u1JO6g{Eb_UDF_nsB3bpb)Vklj~e{op;{>LM8 zljhB$m85q#V1rd{{nYke+iM=;YQB|*5S+sjZ$FmD{OOZ(tMuCJb1Sd?2Jt2s;u6FJ z&A!FT7VJUwT{5RluzQcVuyxh8PaSsSZ?Mw)V+NURw(IC=*NWdd7k5~sYT7?%iDuQ% zq*+w+4i%s0Q23zUPgVrOEIuTI`8O$H`-9~R@DFL1aT8UxB8@WYD@I+b6rUwpWdO5-M&IrH zl@}zqa+5aVd#0^c$@9w9=c`4rU~4-CHxzKI5bLw-wMs?P9f0FmuWqX`^91bvFZXuW zGulJY%%vkbzdfy8pkDu0IrKv3(v#j=!bB!dY+4{!h{<m0! z%v!a7wc)G>qqf{Tqzz;MC2f@Z@E9x;_2O6o&OY69_1d=!6qm;;xr>7bB(0m)=#q*Z z7qL|$$nn_+<3uOr4ZL?jcJ%U&ghn{Pu&L2-$ybJqUpQvXT@27Xl$1Owuxh#tR~&`@ ztVkSq3)@bI<13O%c5g-v`0lKszUgiLdQW>G!_e6(J{zCdRTkFLN(0uR$1_|g!mNw)`N2PYU%xe^5 zsrcwrpD=IFxnzlFwKRQ>XZXHEKOK4&Rc{WVlt9#rw0oP?mn~hvxPvdHZ->5z$%Z-g zb{*JQtRscY@HPatJigj{YFM`))CjrgJrbzTa`#cX21;#Lc9udppKlt2-f8{|6o5 z2jb_4k=4)x-vIpw3LF8x+0ZyinDh^N>MgO{z&3lWt|xb$DGJ`Qjgw~c`E;UorueTo zH&@VYk3xr0=3e5vt~1Esxkie4gj058q^V_U@;YD9d$AJ4H8tJ%ioS#?inl*3+V zC&uC%91%`dhw>MW1eQ{gsmkX5IGNg#2-V;Bf3@OtmGbN9$Mr|8l|!@PM_fj3iZLGN z4QXm!<<^blMhn90m6rpASv@aIlhwOieLQa5PwQt|z#+n?qs2ykD-pXV&{r>>@{CcL zU=G{m6fuWz>!1PNlQ+}jDHSFd9XFgky_~iNfgVeJ|L7X&m3V0!I|W_s^h2wAlG#Te zoJ&&qItfiY>5rB!uF^NP8rrGgI=4;p1U$nR8I@+S_As;hc}U+!?WKMS0Hj6VOQ(() z(1RRNRSY#(6(UOIC&ty802U5&0ZzJ;E7ch5N6`IEsc2J#7+3qoyuGjygdMzz z@W2yK!O`lzuav;6(iPs+i6%zd7-y;r{bbng&YVj{Qq-74-DJ+`)VOfeM+mrm5^C$3 zMu}mC+xgg}^*)}34%a@5MDG@?J~a7O2$v*%4WB0J83g)L!Zx8Vez?GQYi+-GZzx^S zNx$CPsTgqr2=4l#1);0o(O?Fhn3h^BVD_8-BsC##EOKKtt<7m?r2T7Z zQT9Re%|*fG&e_Uc4B%V`SI1FBkXZItHv7G$KHYKDlChr+)7K1&=dSBp$QQZ~AP^Md zdqXlCg29DcVLSGe+_A2|dU9wHGA-~iW3bjM@|0T7XCC*lsJVQ#QmZ&L@uQx8s&pIb z%C;-M=hAS>&fISkShvUwpX+mTURX$OHd<>Vnh}1k?@Lw|7K0}(kjzwN9{g~_k)j@= z(u`8+lK<3g%MUmk6D^!L4L@=%r?Nrva}4?kS6m)pvamvgt2_m7#{oYfhpX^v-98~^ z6=4Hf>;CSP^m(yn=cr0;J#m%`gDB?Ujr#E$z$$R8i-TuQuF44PNK82+0;$*o65v~M zeBuI#|5P7L#s>BzbzsE9w+Jv16MTr`NK?bY0|~1##03e#D#S`1d>xpN60{0kL8(Z} zOq(2hIa1gMsAEsrqsY)qC24Mz4YtNN%bVL(-_SueZSA$vE@)&P?=d~1PB$^IAb8%= zjXrdro9af~r~l%;Xfy-=9yT{r^vHt!-b>P{&>F2s&+P+lb&cO?iH~50h^BH2`i}@j z@FSWU9MJr{TE!A}$cc{sBRZ9O%9wycMxSMX6GDYy7viU_?KY@L!ge9G`gk=RoF(BX z3M*@>sr$+9S${6Z_B+lWgl*`YnGSC7S8K2GwP4!E<}X@-HMNm6IUu*}nt3@5t#mzT zS3z>tkkD7cauz!YSmyNDc-DH}Gly3DTwT7=_VG?G9+~|dY@N|;7TQ^%jhmdP{A4$^ ztVnvY(J#VA#{wD04w*R_l2B#kL820`AQQW6CEfb6O(5 z6O(VW7Y>7JJ%bKEI>%r5hzI}?<}--xyUjjov`JVFYLn&>`wyG1LTk64I<_B5W))jm zdZ7+!I2b98>HYp8PPA~kD2F9MyOydwdUUfF!F;BjyGteoo95PB{SnC`0b^JwvK4k+ zzj;cn+~;f5PE$`FUmk`8xAPjDocyOGnu@wM2^#mkZQn4yq^XZgZtGtDt>an871xbo zd(^Lc|FdjiD1ytHF;smRtDoml#~9-PTpQ^9AbYh;Rs32hQz$<4J-Pd3q0PZUlW!R? z90kzAdly`Vjj-G||HN*8xSU1MfKq3$^jD4xm}nIHi%NLW-9IF6JA8EtV8LyVyPD@< z-D}KWrHy&34N-0)!q-5nS0rrzRquoQPI9%(v0e}!vRV^M_;kj7@C3rEMkyK89DxG9 zWb~%Lm;vYO&H4A!VfX!hH-qHg=34FTqBqKv&el_3aG)iw5uK7Q3vJVGHqVwEH2VeDFdeJ4VO+gc!sweG>rf*Pomrnb)3B8v8EcB+B%=oV)%-JV z5{%1zp5eN=y~a*fCrp(o<+OI>h6V+ylCRc5@Du@#b6{g9!D?Uv4YFPKjA;0djI**} z_L5_02>?rJesg2qiDi2Hv_n?r#8TGeCUlJ>{qjmfp*p60b=`#twRUkqx%nakn^H!I}r8tHv(R#v}w7s;t27;DYYiL(DBe3VSq z!m;}50xQPqi|M|@#rjcOaxK*snb@d_o*U`O_|mO!sCTZcBXO_UMonqu`CCV7L(rCbDHfboWmoKooh6-M(NVP`~C#0E@L+t(w_ZBU3hbMGt zwPfPafL+NF4`g#8=eKdvXohkia?X!KlZXAZ(iBB}8nhyuAZ-t~K7(DWi)B17!}ECB3s)6gSp0~5StpN29rJi` zL2h#i{8VL`DQd~8oJlj*Qc%1+QU%7hVPXyO9DwPV6kiJ0&Yr*g!fqTf!&fa*rWaO6 z67^)(3+E2%JwZ4(?#tIOZJ8)dGsEfVS22Q75rwN;W*c9Uarm$^jIFuBpIr=6n$oKC zAQ%`?3YQH2;ftXTzff<}{kp_sf8HCjszWapHUh(u+IT{9YEcRY!0u$7j<4#qd#}4V zQe!<>3c#y0b;Pf8x``$(#c-Ft7U0+j_%q9B4oh}|L7w~g4_31L?9;qTg(V^;h=C4C zgM%i0Nx-to05fD#2x``}LuV$essAb;jWTT1kLNB>{f$FC;pvZE@p3SHf7#_ngi^sL z1)M0lN7Q7V_6qrhZB-&}qCQwG1Eyfq3|R-}{lnfowGuPqL=BXq%P{+)(d%p(?*w! zM6jj~>uh+P1t={!HoTGa?OsllMPO;FXvBl$<3j;2pxic>j3xHuL0yp!tkFR}?mwt^ zkLBF{7)qaZL8a57rZ6ctLKrs|xUkM+p1}0O$tsN@ZnKF7q0MNBsgFXibBx^n|E7-I zImA-knE;Ih%skEyJN#5@(2Qjyti#kC03^rReLWiYu~BWyA=AM3Q^5(KxiRh#8bRw0 zAv=-o+8I0OXx3bo2k#NzWXOOgcQ3%wc|foqGd1{hKLbxnQ%vVZoP8;Y^KY7-J_SaT z9?Uz_h2wmgr8Tg20X*FrS9-i)duWb_+(dBgQn0qrtO4WnY5&e#n+uAPSzcYguD}xr zZxU<`AANA?JghTaTv$$D7bw1+;1ubH#CcOZPnJrWFB-9?+OW>I{w+1p)gdOU;AdZw z0$5k;;zcD{oX5+2+U0}bY=2Ycb$9b@p{s?E&4N0R5r~@LwYj&GG&jVDx|7f|U{Axr?tr3zacGE+-s2p@pnG|~a)`b)jr_Y+r?Mtl3fz9^A+qtXJ zI-(*t+zaf4sZ#%TYVy34JmEip@wqZjX!51=yrF&KPMX9ihV3IN7(S1WdocqwlIQ4L z6(BeXa{w5?%bKe{(WB+&u+Wp=PXOiBI;|U`5W`5gKcp|}R|U5qsqTK;_IOb?pVVV1 zYXvnwkjQPR@d5`l?@r@B>`j+c$=|l-n>OlS{bgR=Mz3%ss9%6XzRb0kr=M2+HTpmD zE3HRrlqJ~DrT)IfrL+I$G!vvcJg)T zKeFqzEnJ~-Mm-qoV`IQiGKkuO#g#+ol@5mAf()372!7ML7Zp+L+HEa@uINA;EnqZv zQw~RqB8)f$Oj&|Ze6Na%B+l@*HjX?vURdCmE9G9b{C>h7SMo7aW6I!(b2p__0E;>z zdZW+ma9sLPN~cRvCEOjbVf(I&H*ZM}`%cPX+HpPtxYgdWUKvt2XFlw%eZz(KU=NWJ z-V0864+i#DASo$B3PvGwvaBYNIm^rx-Y^2CgGPpMKYG_?Q*@Ux)PFfvez4USt8wQf zOjZWqy!>ML@J0l#0Xt->xW@3>^9V*C-LJW?=MhnWdYgX9N>k6rcX*>O7=4LP6{Zai z6Rvn^Dc8vW8}?eG6CC0Ciwkq=-*D&SW_4oJ*-${y>2i7%jQE)=(_}&&#d%oImr)h| zm_{r=M65wVqK{V!VNd+Th~$mn!ao+NB}Xf=5os*Xoqd44-$aunq+~P%Zwb?H`2;e0 z?%4xk!yeAG^2TpoeTAjM`%^XtO0osxZlJ)$!smC-dj3z)gA01Ufb5~}xpP87gI3HC zir?W%dD#8(8TxGV?iglOa;HWsUmR$4hc!jrpuUdPlH8;rUq~-h zi}47|07?J>5ROKokqoQCPcVJ+)R-El4+yuMZ~4Avv%IRUIa=Y3bI=V6|$(c_7Gl(f;m6hI!38nUzBIa zkU$_qm4Dr$agqu4u*c`t0s{)^)HtJ-XB5{G=5Qr?jHw0(nj|^5F#i%zykAUhgpo+k z80hen_F;)O(6@fDxofYRbaVht^c%95Do2?=B}29O7T_huywR2Sj`@fz)?iw%J-Vw5 zM=3j1;6kZP+eAxWo%G!1gVp-F%9WgmT*U>)%EoP10()s)>g?v#beAw+=|p}Ou9cR} zXyZ_kryMg8fY6z7QKk;*YU%KuP?rR5QKa2ULJ@nLqM= zy}M_gj!=US%NCc!gg*DDt5`}nX)ik@l@RAn$n22RL)BEa zh&|MIPodsw%DA;U4<(TzeoFjt!rGARqIJw5xxY4-CXpgTJ(>bPuV0WqM3lmodivtl#x_C%ml;}?*eWQ)!vw*JtRP9U{2($eh$!k@TUs^C zu*fWc1k!`?@B~P8|JBE<;$i^Os!R_!MBrZm0RbQa0)k#7L^^QXoj5RDxoo#WoC>#H zzvEI_k?@!Asa1^W33q*@)jv}DmlqS89=unr-}iRcS)Sjk0sL>{S{U?7tzc>4z--;jUF)Be6`MFdfjsnhmL{N*GGr%ozx{`uR>!I__F!l?J=W{Wv&(DcxW;kv_*py^wwUj_a;AribkoO>{!rPMA2Y2%xc=PP`GvaoILRs?rtKn7L%=b zbJFgt2BQN7HrGHnglVEFZ8Ec}DZj2?#k8gin~nuV^T|zL@I@UsO@3=y48UkL%EU4+ z8E(wZ7;>OxFVR`HoUu8Bjh4n}q~)=Q*Gf1YW7J!O=CVBMAjSQzNY{x#Se%VyGwNsq zU76X=4OX9*%Lpc)0T~-I@~?M?J`4MD!pJ3}ya6TD5csEqj>G7R-9`3~XHj^uzW6dY z5?AC}MG{j;<)H%!{&K;HRzgNnaoH(JzKo0Vv78kf6!e9PH536RuYiA-62)uCahQJW zY?GPkMr)p)O5ww+x}{ol3xde2Od2+~VtZdy?*X@+x6FcZgno}9vQ`)!2Vh~D{{;hH zc>YsV{`nW@MFYzEtor&(kICSJO1qI7u8##vKbh@Fr)WkdvXv>ulOH!V`FTZfzoqZl zhZI1JD^Yn39tqQ1M|1mv{~JOqMpf)Cm5+2}X;E2`E|S)-D_n>O&#nM*yVl%Y$zMZ;Gmx>$P>5!#K3uykPjBgYx-O?wwriZ3lXr6 zX)LG?-@s$BwZK&8(HikmU?X{2(r);{UX!DIKs_AY8AR7ft@82Q=^F@EFx+}FYdC8$ zmVYq!`?s@nj&MY;5ck@hTUYwQ3xQvU@vm)|7){0l8gMh*>##Fmmzd5ZUG;X z;g@_uZ$~9{L~$%sHqoR7Q52l<{p-$2<|7*^>Ni)fT14buqY!_yG))9vQZ8c`c8&WKg_B zP(!6XGK*po@i3n$fd-#|q#_3xqL9;)#du7V7(Hg)WlvPHzsXCA5%UP6M1&15hH)IF zF)<@hD5x-zSSEJ@K_H?UK9!Z}a}KK5mA)nJsq&OLv;MA2sDljv;xA)mLe%pSb)#Fe z&=5M;kjbM&5vN-reL)`1HY!P`BRy3sZBiu?o5ZkpSCKsuk^m)fV~p$s@w7t_boc(I zBD<({9EWArv_En62RBrM>zP+-)RSdo=ZIJ&4y;5N4Vb6?sJ}dG&S(u5quq%Ty4&my zS_xrQn~LBhn;14HS8*&9br$JmF2YcTFbrxsgrk_)x`NFhCC>AK%4k;MJl$iluf_tn zR*LZ~$d6FgS&Qi0#j~dg_ao3~Z^f91DpRuqRmjy00gq8=1aV4O&X#9q5%T)@9wab4 zF3bX@HyM#atO`d~u$usku*%EwVj2hV=k!JsV307Y+auUaMu!0R@-(Sh1vC(Yfvxxv z0qX4jvWtnjMFkZd<4!{B$h=CA?Mi|{dS&D4%I&yec1ri5?_L0rlERH^3L{G9zc}qt z3G=evZ}N{`;E15;76#no2uJGU2-kcVhal-&{tFX_fBOyP!74SF@@#e1iLDu>5_){tc8}U1b{UD-(eh)8?LW5*|)?TOx zs)IKfgoe=%e|17AbiLap-45$jN2zgLL>{jA0H;*Ao4<`WvjdWR&#crMN;WrrnlF2? zBR}+L3O&XT530#=LCf@X1A;LbEc0_ldUSGq00L#>e1DMp)6tE<3nk>!*!{d>Yw!2DM>w)Sq8{0PgTPCMZ%A$YYsK~}_cmo`jl6t2vj z+-UHxx5|!2)i;iX^mv98wPC#0V1)Gs4Z+CHmK)o(`>mDO`J%#j7t$97v_lUE1$wa9 z5xVhQp3z@d39i7}`bI?iaU+&VaaBT9ta-Mz@yB%C^r2kO;+)j>+v4%iT5*{dA0|I^ zy-GJ7(p=<1;QUbK{CwcCc%pT0X@-O?J5rMl)dFCU@+rN?H5GFRB33S(AKmi&dkSWP zr9uxw7Q07V>RJ3_BF+p&Ql}@dv;{l|3wk+-dKA5)XF^@WeB3tw28vL11gsj5XJ6o_ zy`W`mC$_0P%+~`3*27gX+;$KOeVJVS#6*6;^+HE*vSGJc`{`~(DdjvPpiNl%2u8W+ z__7hjML-*Vi>M04)eaV9!+JlJm~uCoPS4n6N;14q6lEb@TnzH5_JgF8Q2|ubQa1mAjo7$*KKHH2 z@y^zit`YZTnbz>J-N1oQo5w_j%*fV+oCY!wK(Gg7@XJ6qM;#V!h>N>i0cjZn_?0H= z6A;~Pyyz7(GYx@v8?i>Nz3#+(YVGCO@0E1ni}&)gfePT1exr!Rr+Ki*8cl8v@^ECQ z@*@+p=_)ac>YSnP@p@y`WRAA{!xSQ^&#CEzX46>bZYti;n*7uaZv(|64o5mJtDeE8 zyTKMX0F(SzQyE>hGU6RgsA1JmFTU<6p`qmwh&=VqPv7PmOagj`W{}B|>tA$q8!G;F zc!Lf1e8ycS-=My|K~<$@7mqNSwGjA^#ZY*djp?^U>3JuifMiD!B*L`OrvwP;bm5w` z#U|tQ#{3E|_2>a+R~`4`p9%_dpwwFW3hL9G>| z_NptPu|FIOcozb%>EW4ItsV_?VapUFBt(d}BcXD>P@Zw&+vUQ}=%mC^&$zLeHmWqG zSX|Jr`wL$%TNUCt2!XR;3-N2AhYXRv-8r&BvkaRSnHP0+o8uPLyj?F@S+4WVSca#G zK7%F^v=el6dzQUHdaqM=G+|upmn$=DabCjd@~$Kjl2_Y!XPE{*U1W_34yP2Wi`z-= zH|u)06|}c$r{SK!vfjwYMaz!P?Tb{jMUTL_ZH-e-JG4Hp`ytO~Db!~^S)g+0w=ci8 zZu161DzVfqZ#wDULU|7JUaqPI?0h=$8@lsW-(e-t()EPGBMfxSaM+*x6Pth6<9|k} z$CIOpa9ckXOA-drB+={F?IPTrtm{39dl2ToWl&Xp-?OPaG5z_*+P40^_}Z-T^(04N zuYNfBX=DHa*!f3 z-tO43k*gx8g3dzqE$MM0S`eMbCNpcm!N+X#hser&;%+d|2>r8{T)VcS8Eqa%_M{L} z)wTLWd9txE z{~l?Eard*G~_2g4?s`-wIqrwv^( z*Q(%i{eQdugGw7ig+*kg0U=VKGy~y$9 zpyND*mdmeGrf+HmS`0xla%1)c`baR_)sv3S)T>3@wu=7_(z(iekN@vH6$M9^$UUca z_n-AG!>15Fl?v{k^xKT#wEF)ur8;ZIiEL!kP5Yf`yj54Q%B$KPHC4c<4U{LTj!fQwtK9Z>J+)nl3|g6q+v}MAScXuo6}; zQ{@(|y<&GJuFx}dR+^N0EaxSCioC;+Tt_H4nQX~+LJ1?i%`URo&po=v-{}7DMBP)G zEacTob{g^f*Dq(_U%wE3PSgUjvj3!H`Gxoeq=a?EWkh5r6Q(7BNY!4uK|8 zG)8+(#lVO|u6wG$Hmb4r--XU5j0la&blZ2HFEqeLeVtycy22UwL&rn}l1V7Q%YxN{wBQGaUjbotk~&uBEF!+@-Qm!6Eo&c6rFZyP~Yb_HX;qU+GB>=Q%DIb z$sbh4lYu&i)#Vz8vJ&FEGMizhHkf$1f$SqadsF?|;>HnI>tY zA&fjcEGH-oj)<>5O57*-l z(<%RsQ%)NjN9g^Hp>w=uw>cm$UYbzBmA#xboOb`6<3QT2-L9YS6H-^}_$l8})R*Lw zIHXbD+)JhRm2yi~#{+q9yiJ{2zRG%TJjp!5B0WZ(PSPNrVb9?Z0>HVuU$DBdoTD@9 zBBn{_EMi#(Y%4kBylHi*mn^5ZUK_6zJ;O55q^^_N>FS42i;bI5xV)C7`KJ*~(i^QA zO2>PyCB+-3Z>y;%&`M`;*ej_+JxnU7 z)rqwp3{hv;m~Ogge1&NSe31yT2ySyb93yCf+8x2?{^6AL4r2JKq0-@)D~80Hte*wa zpvk9m%Z7HEE2g#y+Q23pnIRGv|1^RB8?{9JsHRS7sz|+s_`@4}61IvP6^|;OgWEzh zi{Lt0-;4EdL7oCLM838oof6&tKr{DLdL8@d-e&PMv5c)4#o#fd`_xT`(pZrD>BmX! zM8m$r!aiy9dwLcF+}7wuYC!fm;;V)@k~0m*Rf`IgFsWS`WZJB_h({BfzF8t z49=U4;T-7&;(Fyx@~;`{i?~0GEZH3aE6ng2q$>FrrybDjLI*5of9T>qp|{s}oI(Ou zhOLm9XFrMdZ!MWWU}@j4T^~-~9_(ZD;#T8d)ecn+tKVYmouz`3pZ9VpG{rHtX!24S zkIT4Wm72RKnKjKaV(xs}xa!V7CIzmfOD74{xf zK4XgTU+G!5L_ZrTWg4bDM1x6(-85Ef;Z6-NkejU{|2IHoQ#_JEoP<_+If|DIM&l#0 zJ<={CdaC?2T>lDr?Fo^x&xM_`qQ||}_B8_9SZlNpz3@YC*WnT@EyBoybMpI#snom&|{Kxm_SOs#=z z(|Hz>y(8+q%K1?{Q5%1!wZ*C6wZmTEKQlCxT_3ps@wR1W***X+P1@u)gm<Lv5+2^J{%XBY63Pac#Q4k#vA z!zSVIC6t@3%uU-xfJSMp2!nJ6C41_t%j5wngQ> zsADtzn}P*lQe_r2r?rs_zQIq2Un(m7hiMV(%3BDvS9Ei$X(PY#qU>DB zqX-LN&D|j_{RfT`Hj>5)zq+}%oi@qqfwT{_4I1LsG=M_o?C`rn(Co|f<~!mJo9+r_ z$ZjplbkC0EojYGQ47lvhu8;3dN>GJNw0oqM@`>m}?1#F|1MDpL{U0UI>kKHH7KQkk zxR(w2qPLrv*TTXxAtvzWaUWKI_MXqASw&_cJlb_!40&hxG=X=k9_vd_kr$9Imgh-2 zul=bRO@EGHuSp_Jf3C&kY}ZvQId6J*DW2(JaL>PH4CGpmN!^aaS+t;c>Q6#jm0J#D z+t8w{0U6qzx~FE80OU8L=7fMJZ-^tt-7hyVO`v<>##jHg=GV5j{cD~7^T(4vR=w96 zO*-bs7yJI0bci3TE^h5;WN+_e>v;J;e0_6tZOyW8oa`MNJGQf9+qP}nwr$(Cy<^+9 zckGqq_RqYEEz_w@14Ta*jW~+KNwDl8sM{W>n{I2+5x9tg{{w6YzjEXXZ6>ey(>|*`lKQ=we5mutWNcgjYu`Ci*v$j;4Gp zgDEZ}fxnaB!i#m*$Vf-)vS+T+ReF5BM7c83S5zm0Xy&B`zqRg_D^q`QSYyCa`mfke z?MO1#*`+xTk>|z9vPR1$_I)GbUtbU9;O^1BnJwYh*g8B7A}({4BS?lbgVYm5RXFM- z>r}+ir(;aIsy`>S;|dOqR7!|rnW-2@Nep02dqxwjyRv*at`mw{N#+bSQNgTE1v@H~ z+>Aq2Y47H1r0(Xyb=C#P3ug>-51S`WBg9Y-c&8MU>N!qvs8KOL66!jBrXJ=jHFt~* zVA9T3Pe3=ebxh){84)0N8#%*Bi|B%x{n;Xg?mF2AagOCe{>fFk|wreCx4p=BH zMIor|(^2iufPQ+gqiA^;rGU6Uo=uMDiYpOSus;iI!aiUS%VNOwkh4D2980<$o@qqNzjR;)V~EpZdxHy%6YRwI>6O$^;;<2yce<7{F7(~58UigZ z?eUB}UTFk$BqWTVEED44t?nR3hvz2a^hslp9qZgvfXQ7 ztDtFqhy9;VZM@#!aRCq@ASfsxpzntlNJyIhDp}TYkq@O$w~0Srs6UVlUXufj|JVAZ zNoA-<9WDwT_)sKuhEb#O*(XJ3Wn3mCZz^7YXH3(M{w<3B?KA0=f+uo>hgpc!cGvT9 zclwyE3D1^#eB;cYN=?fVpYrJBT#fhQ^XP7c3B17eXUvHllshGdbO~KJqadbuge$d> zB>D`w9I*gySC7ZPlBA3l&7?2rcQSya@0MkWeFW1}gcxHzH9quRdQd$#Ix;nJG2(wTzEc#>|2}1gI zL-UCiu7r}NI-4=ULpb{BSO7b>shjZEV;g6~r*;>3uQI`ID9^z{BCTRfnnR{IS;JV7 zA!#;Y^K5IKEyERz_OJ2_fU8;r?lP2jP%%{{FITUURzSP%+tCu`01c0z`vsb6YI__J z+Po%Me-@xwSw9^};twII+6rcAy$|aCM6iM@-uN_WXVH!Ab&ia*&SdZ3ehm=Mj`k#) zEr)Tv3F{6RieRR#gmGgy^Nl7(F)I%Et&(A#KorATP8|SJolUO6v%emwi)W9}%&PJU zgg#evVzZ&4G6ULV8I?LaiwY*o6U1Y}NQL>OwCNkSEjP$Du1K)Y;WRlnjb~ILM{-5t zU06$w4Dvpt+s?;u9&@~lq9NWwQg&Vat#axGJ?PtgqU#sa?2-99olQ7gYtS|-tR0P8 zsGinVWCf>hEOV->8q|LMz&oK$WBh?l-!05wgxi78#D89<)sOl;dWukIJkh5`QX)4?{;*C$QS7#EE$>DxTtY129`cgYHkh7(PR-6y?t{tSLo* zrP@;&fPBINpO%5kr9XE(k)alzu=2rCt^x#so)toICU7Lrt-p_5rZ&%QZj^4#aT!9= z_6Etp*XW3}da`p$SxT4}>v+OXz%A3$be^0G4K}6xaV#2MR3Zp=gj@K)NG?vU zk*jJJ>N|JD?gAGhtYy0l1_xUR;C%74q1gk4dg;zdZArOZ5JiPXw#w&%cs_Lf07v1W zgf{!n`sPim-S>%MrqBe9)t zUx|smyy*}_oFK`(fD4EuId$ia(eNs`5pO*WM!5?;q5PHUdehybV+_s4|;T@8gcmdukBwl+bg} z5}KTV7*!KO@Y-d?;!8C5yk%0()h6Gfa+k+iDRFzk%#;+I*A(V%LI-h~wAG2_S7?XG z$ZLp>u`du99eTJGMXTPamHdWC^_5O$Xk~p16|qbo7~eY3$Do3pKrFS3mF|#MjvEw1 zrI9CHf6G=mn=hi)kG=d{WFTCht(=TE-Ka9l7js6kT$(~ltRU?k+J|DP$TrwAEa#)> zMiPp2h9dOrVl}cR!|FXuBnAJ+&Zjwpk;{=20OsonFW(J z(rzAe@c-nBTUJ(+bez$6HpSCu=hvXJK6E#yS>`xmB{Sa&(FRp4PVCYtscr>SbS3&2 zr@57iTWTYzyfRB?N3c76bMsnfZgqrIA0K!wSZ#;ns$!oxzIhXIpu$8X)qG6JU0WY1RzLCW{ae$1&#*#~c9-nlna}-m-oNNb#(gZ?FU=nf4I|iR>tKevi2BX^i;~di18x z;KjwSAIfOOT%E(e4=7gMm)Wh23qdF|wB}CI{a%xt-$aW84tNeRZ_zxQ&=+as(|&Cc zc)y~S$`d;i$^#6{l@}6@1JjMH;a|*~(zLU0ZOONwy z@L~S9!56Z%);G6tyh{7`>Q1aA5iS9gTHUwZcgV!|54^I}9f_pfM;FdhXa+}<2VbeB zw8&5r=Npd!&-H^3)vz%mLG$t}tHl3a-C=CWR6}bR51>Y(dY+z4XLrQ?ay*{=c>S1g zdAlZNJ=b<;aIKm?>V3%KTy{&+#%lJ}U>pAcF4l)!ZtA&OE7@wa*63^*KaJtuZ5e8O$wu~a>~65KLc=6)YU!`v`Df-}^Na`C$S zwIkmdxxxHWrJ)a~Rfc`{e|_h2P4|pe_g>%6VyMAnJ#)=6UFq@j&~x2&$xUH%sT!wi z{^_YoU0<+7-NLXKP(9ZJ9UGl~IUAH}<>+TZ?}G7&b=eL2{2n!CQ+`1`)?pL7>M^P8 ztFYl#bw=r+ysL5V{-u0k-MWU>vDI8GIFY^U0SsQMd%|qzFOf#Vzq)v5rOodLSIt06 zE;vIZky;<5GIOFzzXD_tev6cpGsQbGg#)bsElL%;YCvmcAGt!^=3#xH1{rws5 zWGo$=IN6EBDNNf1vyQJauY;Kv%Cql0Ynjv^CtsQmtfk7;)K@~gYATFXo)%%6ncbb#_8IDf> zNmRuK@$Uz{P2nYME(q7FrkBT&cv3m4v0jp?8I@I`6flCZ?Jag7yHlZ5U9Ngw{A7Eq z8cBT%ckYD|CcfV2?w*pnm~Ofk`d?dy_j6k{c_hp9u*|rpu-c=e5eYRM;%t)4tmvvt zK@oJag;(x$7QiKJsS*0K>rHyX<(IvJNcz6TnH)jGi__~Z8#do=EnU(E9YR?d_fGTN zZ{O0KYGpd&!$U$$jcQyurOz5T#`Xs1u?v{w`0+KIoC+b2E=l5!^o3%%mfrwf4#3Ux zg7~ZM{AY3R6lr7obcEbWs8x)FZx4cwZN5YVrEYv@>&+&(&kV26h&tss4?>oJd+mnw zesIlCcvONPJ<95IY?VwZ`c(q#d|Ken;1a>N%-h~?l+|Q=)Qb!l6^Xa;+!(m4?{NZq z{umsq&N)=s7vrr{D(#8M$)eMSNCUO8uMmIbpJ<6nlN4FUx9?BZkj%*wE7FSx^x1v0 zWg;L*R+`WI%M+wXROO7RVJ**tkM>rV%S{26UM+DZm9+RE69^KOgPE{bLDl%FXHRQi_nHg)3Aii>WR6D+;wOv@ep zs`{$N9vhg$)U%H=RnEfI>=zui#SZoHbOsoyugPA8ZG%!z~b6L&BX9k&Z2NN z$(Y2=AfhR$iw4ydJv`FqXqOgcl<7u~T-M#js=_&k69dE;(h3)T=6AZT_CIZAkC~Pm z^taZ=i4BNA&pv;tt$1-hu5>m3-4K)9;zPo-B^*Qv8tr_eB>0wz1EX1ZLLFY~ad+66 z{EtL-dcbA}G$JFVue33ZqmrJoOYwbEQAHIk>yH73u$FHVza}Cwhi1*1v&pf94~y1J zF#Ow+Q9CBV@()=+hG>>ivOWqIiOG*g=Qjb@;1mQ#f=9Zbk_7R1VdWeg(=s~vfb1d_ zKj@IXUxC9$5j?WW$PyfH779QGxpz_S(A*vGXDZ~A(SM@|fFl=16D5}Jbc5>&-^;e+ z6sTs97gt;YuXS13`g@PsUmpGs3y(l}hxGF8G5!(!x7R3VZgZ8jVS_D<5VAoqL6KGn zL?9Ex70wqvqs1)452bDlj}ovKo z#qX_~@HK}uX73s&zX~27E(>Z{gth0iRkzGpOB-Oh-L;J?DXrfdY`vlvr#Gfgxg%@X zHr>yw-o>A7&)aG|XHIK!rrjMSk2dYaSFFFLV>-#tQ#z|!Kgt-lS6!T~X;hWBl)q0D zs5u+2A+(rdcKXcTwkJs)7<6bOUaKi%eOmUPS%S<=a6Ox~DgQ|6w3n31v6w%q1WE#?l5OntRxb=38PV?;ASdQ23&bsf5CN5<7F<(70ntTHmPEi(Bdgi_k^_Ljp!+ZVM%e4p3Lk z$AHp8hgGt1E26oG^8B&9&hezQzGN$IhD|A|A1b{HJ=t56Yx&m`?;R1`ru~F>f{=G&_Jx=4CAK@WGJ{W)-py=JJXA zWf@#W7}$0Nlvz*f7HD%$U9)epm8otM*^SOUujZ95ykT2zs?P!8m*_3@c533 z_b83GBnQt7J<%3c@55BNu>wA38)3ch#dyxk_$|BB5#WMyAyh>!F*`T?W4RCm4{@mW zjBU`fGs*xUa;gLu^G@CZWpYfU>~E=Y9}cHL>)kx8@GHfpJ>OCR`@-NzdCPl0B}3-k z4Tey6?bn?une6u9ns+69>_@5XFp+#tgFBXj>Vfm_n3#85(}W^RBC(Jlyj>dCL9$?y z0EdgL3&f9%eka1|C-dA%zgyr0KP%)GwiDhF)Xd(v9S-Si^!{Ah`>uiRO(I{4 zw~r?i6B%s_usHM-c+Cc~|AlHqy5^hFt3v%_g#r)z>TzJ>fiphj2DTO62+-N@xTyW- zU>|`l=r?@^0qJs72xCrx25{}iq?4ML2Wa!ugy{^4Nwt!$!uN^-73J+&TiF%i51xH6 zk%aJ5_&bEmirEA@3rGanjDSTBMXu$+N@Mx}7TIJ7EN47A_h)^X!IT$@x%~W`&xOa0roUv{t9!fn$Q{03AA3GPW zh#ja&mmDY$RV*!aCtuk#h*%{gAgENu8$BREiSLg%`+XIZ#HQH&R_7+C$6RFo5jW&l zUsIXkR&IEM+#LL;-^C(@FF0!t0G2d{3>@o2mY$il#rEhE0zM>=sHs72HZc4th-7c3 zDV5cF`RB#Q`#JXbRSL%PB=*fVp1L0yxuN53}7VoP9oAI5hhX8gOOY!A7Tnq#Q5nd);}ajH5nIXR3_JytR!VqlV^=o z@EO51D}vVD-QQ5{z+~cSxJP+e*+3-V>AhqUAl4B^J z%qu$oHI6A!(U}hyXDzb`DFZQpuRS)+GJi@vPDrr*%wU8@8Sdben6IOmGlU=}OakMB zuL>d9aZnuIBxMkuQ{3@`4iNpo(B(8FFD{xAOV8O-+;KV=@j_)G8Dgq7FZbZJ@l%nl zqCB>;!?$XRD~j%v$g932VSTQ=#LZx}tfpf(gr7ijFr>SnP|ZVKt7#E}yd^6DIJEqw zAXW6m0Kc*br&BM_uzy7pXEbsTwyoc!4br>;e=vmijS@1tF6$dd=X$%OFo8*JDJJ5* zv?)IYvz*q9<}A$Hz=oh{V`?j=f zpoK-pU#SuFRfa$4G$N^~O6VCggoKTt7b6`O!E_#(Iy!d>Oqgqv&R&={+-ESBT=#(C zmpT+@_b6`uxJ5j9tbL=14mp7=t*4oTt-K&McOS7mpU(sjg~eb4^5H~+bAf)+L{kN) zz=lxeJo8m8T}{=5KcOTn7J`%C2^e$pp;QL?j0Y?s&7y)vBpk6j`qAHUyI~UiV9mJ5 z|KPJjL7z9Ed}roC!5gH1`RQe@4%oGR*TE~T``NXKduJg3J8cfdHUxlAf#g@4aSkpV z2a62Yn^>06tA(Axd=c~$9a%W#ZnDkl+MU3~6mjV-hl;6FXymFZB*C3D-RI`a5hS*d z7nfd917^`!aiq3_xZsihLB$zI<`QgdxMJ0WAk7bN#tU6ojq4Oxyf~QbCT?fBkH&Dv zRe%V&A)q<(=PRg>b-~eYdtL@w9n%&UM}6Ms1_m1fKKw?b13Fx0Ng$H!$Emt%H-Ctin~QrY*84%1A8e@jQYJJXG?}bPw@3{FGZ}pIz{Z zh_dgEBSWBwKP^3@39-o{q)B>}xE=%rSV?vW_Q%4?dcUH&*;F)&m7s*jYg}kgveMa2 zpM0mYUJp7GSw1g|MY?}o&x1P4_{gQ>hT#q>7Cv31ZzTocsqOgGjdrw{&{YXqPB_T1 zT4lR}N=*ONgyMB@60cPs@JQMZ8GXKLN3{xmMqk%Xa?Za&@G;v=(0xXvSMMT6p+~pzCM#?c!cMokLk&>d!$xq##>+<`}EoEKDe3L70--Q8+-YE z2Cx9FKxNBTNP|)A6`~_^zH|06?8Bzfa!RJMi_~9X`n6DOjnw$+_V_PXQ4Sl?4Ykk7 zhK-bUP&5!kKR2-@fiVu=f^n1Ju6t^25r2+qqz5E`yOKFy<*WtAD`nxnxK$Wm8>RNsE z(J%?*IjD_&YsnJ*>T<26j``i4G1cl8?s9ZwXp@1KZo%oa_Uax)qyg>Z0_cVzq^3C z_XC6x*BHb&VI=}zV2nND+6)kKoeyob*rmrhRLg=+b}-gRrG$Qz1io}319xzxXaBkm zP^-q5X`gRB`pZv!0<|xh^kdeWHS7o}RAuxcN~0Bnq?zMy(yaNC0KYG-8{Jw_?Y(~F z8Xckcy=;iMAuO^ZtP1*0X0|t#pzjxTttPIFlh-=V)Pl`W_7f&{(M)U1!AsY%WmXSA zb?$`Cgf|0cqb;&3aCRrc*L%8M)O2BXectd5pt5^Z*J!am8Fz zb38+dFbc^*KnrKDHxzG7mnh>M=^Ra1ZD2gXqBDFYLa=kI`AzT1nXq5$VP4H*316ki z-N9ZhN*7EkjJH2WL2hYIPzM66yqQt4JXT(2N`fD*IUfhNU!fHLj{qd6Eh)~b#P!Tf z&jZplu;+Fo1zu+aUufe=2Is(+465f7Ey3VJ`8DfeQI8v%oJHjb;rDdOeM;9LVWbyj zPqA(b+0Z{&ID@PdA9~V^+t07dWIeQw2VPrU!|$b}Z`*aU2Xw@M$?2W{X%psMy3@aR zegWZsU;k|VQZ%tRN_?t0*j}BrYp+mA+;3>tDfAk+I}nKL~<;THPWMm{kpi-`mec zk^++ygq2BqAPeutI$P|q_1jZ=sS*?Ggo>Vm)5)_~Y!jR($Ak2KS-CV?lEoO7i3M9< z{k@#bVmCFJe$8bx^=HQ7m2jt#08u$?}C`(O}Y#V)ks+?V&0?#?)Tf%=eY@x_vka@#UHHY<8bFb+=s9 zEKy72xWKk}#osQd9lc&q-D%4n(J9h7#HP-Os9m7J^!{M$U_1Ma*3C7J)y~)LQFW)& zWSBC!($q4ERrtXtPJ}i^{S`1az-enTS(MJIXp*t~gHhByk)8!YEmV29ig0MnQP=a8^ghJ2K%XTsCfzw@~yl>#ycaziDF{y(qA0M zP>Vr$(jr}SC<&1&bbkt8t3PUhBNj+lVqsBsfhUHXu1OATdjj^>m%gU&>;@)#xZB4ufU&_wcy{*TpS)KmZ&+beRm+_ z%6ZJlsVm0~#s<55~OcFTo(l_47;fwfk71X6UlH7Ej^}c$T@@BQRXNG0+J@ ztl^c�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 ULqY%5j|RFlfKr(33c3ONe-Jy3X#fBK diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj index f2ce857b..b2cb8991 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj +++ b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj @@ -2447,6 +2447,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3018,7 +3237,7 @@ - + @@ -3048,6 +3267,6 @@ - + \ No newline at end of file diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd index d68005c7..66a63b4d 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd +++ b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd @@ -490,10 +490,344 @@ + + Debug_Timer + No description available + 0x400043A3 + + 0 + 0xB64 + registers + + + + Debug_Timer_GLOBAL_ENABLE + PM.ACT.CFG + 0x0 + 8 + read-write + 0 + 0 + + + en_timer + Enable timer/counters. + 0 + 3 + read-write + + + + + Debug_Timer_CONTROL + TMRx.CFG0 + 0xB5D + 8 + read-write + 0 + 0 + + + EN + Enables timer/comparator. + 0 + 0 + read-write + + + MODE + Mode. (0 = Timer; 1 = Comparator) + 1 + 1 + read-write + + + Timer + Timer mode. CNT/CMP register holds timer count value. + 0 + + + Comparator + Comparator mode. CNT/CMP register holds comparator threshold value. + 1 + + + + + ONESHOT + Timer stops upon reaching stop condition defined by TMR_CFG bits. Can be restarted by asserting TIMER RESET or disabling and re-enabling block. + 2 + 2 + read-write + + + CMP_BUFF + Buffer compare register. Compare register updates only on timer terminal count. + 3 + 3 + read-write + + + INV + Invert sense of TIMEREN signal + 4 + 4 + read-write + + + DB + Deadband mode--Deadband phases phi1 and phi2 are outputted on CMP and TC output pins respectively. + 5 + 5 + read-write + + + Timer + CMP and TC are output. + 0 + + + Deadband + PHI1 (instead of CMP) and PHI2 (instead of TC) are output. + 1 + + + + + DEADBAND_PERIOD + Deadband Period + 6 + 7 + read-write + + + + + Debug_Timer_CONTROL2 + TMRx.CFG1 + 0xB5E + 8 + read-write + 0 + 0 + + + IRQ_SEL + Irq selection. (0 = raw interrupts; 1 = status register interrupts) + 0 + 0 + read-write + + + FTC + First Terminal Count (FTC). Setting this bit forces a single pulse on the TC pin when first enabled. + 1 + 1 + read-write + + + Disable_FTC + Disable the single cycle pulse, which signifies the timer is starting. + 0 + + + Enable_FTC + Enable the single cycle pulse, which signifies the timer is starting. + 1 + + + + + DCOR + Disable Clear on Read (DCOR) of Status Register SR0. + 2 + 2 + read-write + + + DBMODE + Deadband mode (asynchronous/synchronous). CMP output pin is also affected when not in deadband mode (CFG0.DEADBAND). + 3 + 3 + read-write + + + CLK_BUS_EN_SEL + Digital Global Clock selection. + 4 + 6 + read-write + + + BUS_CLK_SEL + Bus Clock selection. + 7 + 7 + read-write + + + + + Debug_Timer_CONTROL3_ + TMRx.CFG2 + 0xB5F + 8 + read-write + 0 + 0 + + + TMR_CFG + Timer configuration (MODE = 0): 000 = Continuous; 001 = Pulsewidth; 010 = Period; 011 = Stop on IRQ + 0 + 1 + read-write + + + Continuous + Timer runs while EN bit of CFG0 register is set to '1'. + 0 + + + Pulsewidth + Timer runs from positive to negative edge of TIMEREN. + 1 + + + Period + Timer runs from positive to positive edge of TIMEREN. + 2 + + + Irq + Timer runs until IRQ. + 3 + + + + + COD + Clear On Disable (COD). Clears or gates outputs to zero. + 2 + 2 + read-write + + + ROD + Reset On Disable (ROD). Resets internal state of output logic + 3 + 3 + read-write + + + CMP_CFG + Comparator configurations + 4 + 6 + read-write + + + Equal + Compare Equal + 0 + + + Less_than + Compare Less Than + 1 + + + Less_than_or_equal + Compare Less Than or Equal . + 2 + + + Greater + Compare Greater Than . + 3 + + + Greater_than_or_equal + Compare Greater Than or Equal + 4 + + + + + HW_EN + When set Timer Enable controls counting. + 7 + 7 + read-write + + + + + Debug_Timer_PERIOD + TMRx.PER0 - Assigned Period + 0xB61 + 16 + read-write + 0 + 0 + + + Debug_Timer_COUNTER + TMRx.CNT_CMP0 - Current Down Counter Value + 0xB63 + 16 + read-write + 0 + 0 + + + + + SCSI_Out_Ctl + No description available + 0x40006473 + + 0 + 0x1 + registers + + + + SCSI_Out_Ctl_CONTROL_REG + No description available + 0x0 + 8 + read-write + 0 + 0 + + + + + SCSI_Out_Bits + No description available + 0x40006470 + + 0 + 0x1 + registers + + + + SCSI_Out_Bits_CONTROL_REG + No description available + 0x0 + 8 + read-write + 0 + 0 + + + SD_Clk_Ctl No description available - 0x40006471 + 0x40006472 0 0x1 @@ -514,7 +848,7 @@ SCSI_CTL_PHASE No description available - 0x40006472 + 0x40006475 0 0x1 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/TopDesign/TopDesign.cysch b/software/SCSI2SD/SCSI2SD.cydsn/TopDesign/TopDesign.cysch index 39b5ca78f4354a389bd37afdc0ea2b4d0e4e753c..afb8fbddbb17670a052816846dc1abbe7b62273f 100755 GIT binary patch literal 188561 zcmeIb3!I%-Rri0AHc$#JL7;$K95PSaK$|p~ncQj{lF6lM$;~9Rg)=}|n_ ze?EE1V{^9Z%euyi#`?y1<5=TBV_)O2J{@f=R_eWtL;Am0DT^D!jS>Am?$S>*)+)zn zW54nrSK7_41f|K_KiQb`xT*muRj^5KLydvPU}H&Rsep{?)1t<5ecGecMfz=-ep#hY zdz8A&rHw1kU}LX)j_7?%spEP+^_zk#c)Tj4_gSJq#1YPgm|s9_yckxJkF{64WC(j)K~Kk5n;c%8UY)em*Hc zH>pTFeUfL)SEw;#s(zDR$JDGFMF3h*!IZG%h+{-LYsis#l}NkXeHvBDxIV4Y{|fyZ z%Ptq$SBgpZ>eoFgHK2DfW!eKT64LYlgu79wcy!hZ3D7v9zIf_WzZvueIgND=2r48V z6D2Md9GC5~1R#U*0kvnFs=ZsF$BffGZ(sQBCn=-n?Tg%JsM!G>LvF6;?SP-HDz$1VBC%WA*FhLewv}~8^1@CyH_CY zDRK0CWi*cW9DPiL=})m#`=2Go?3|AfX``a|z2f$})VAC7-wu>IDz0-Qhaq=$qfd}e zsM`nCi+kMnya2skzbqC_?6p*s8WgQ4w@!ogps>16(8e3ri^0bAdBVXy=yGh=cgS@> zb-Y}^o@g)_@6o5jEfq8Z*t>40GAmG`FTP-HQ;z^ zr{e_p;*k1#r|ZiD%C*n+<{@zj!u+V~(P~~92zX`5v~bBDC-6o@uu;8Wid7;f;*e3j zO1yLR6h{LT$y0lljS5Bp>InjCME{E%|13@T45>e+H27?(Na z5+*|g&0<{WGLax%8N8qa!k~>NwMgmXN@s|S3(=K&(c9zt zb%h%`gV_-2OdWWp+Ut}JuZ%Dok2bcezflURM%DHyN{RKk8g{A`6JELvsWA{_g_CYb z3Ho(JJqIxcL;#f05!YybU8(OY^^dALrq9dtjz(Y;lPJ7ExH94F*Utyj=_pg9(2%Oy z_&M#4DvSciOmI}S6lb1YDlwIr6!?Z*zNSQIEE79pdLg-%iu-MxFnSm#j0r}^ z9(`s4Ko>^#*+jwYi?BiHq~pYoeuy%z{|PC%`zl+uc^X<4){wMlmD+*$LmngSzhUxIw`252+p)c-rn>^@`%QN)kr_p8|mptpBl%SGXgr#7VV%) z285G33iWigIpO2w;z6`tbl4HcsqiHlh>c9mJKsOb(sH`rjaL3iJ*{)%PaZk1J#5W?{l(#FqutwQZ6hZ?@kcWDW>o(rBh& zjB->k2CGfc_6brfacS6-OOy*j;7g&&Oyw9VXsfG|MrTH{8OF%&d8aX7&0=INrjZ9kr09gL-nDg zVe?KWJ|&2LU1PI4#r#fVjg9(z)Y*#@jn%UMcIzLKV?>*Mu~F}Mt8(rJZw_S^_c8f# zXb&Eu;-vJso~TowOx+wBRyUY`<6IGRQ#I_f7AFIP$#ao zsU!wADb6=r62UcxF32P|AkJcvGbMPbc#6q!R5{?Yz%nU+yyCBuv43Zoj`y%0)41KvS^WTn1Ji3~c`-OEir+ zClv*uQHry#9L1115;T@n(A)_Wv`7*&8v^2YY(=CFiOkyw3D-*)V6e=2{E90+4}PCg zol{YPv*qa9oc%iUOVYj@2xYnA^8pQuh8CoU+D0Ur>Z+2D z@YyW7pKy$P%zJV09*;{(Gbghyj{HWq^Bx6Q6b=*;`owLr4EYIfgx&J4N zQM&Nk7SMB{+F(seW0V+SQ|oe8o{4C1AzD5vY1F6%bkqxs8T@SKYa>nrwF4Cw*FO#` zJZ!vZAj@McePXlojmd0}5VuAUP^6BC^oF8q?p)kb<8m}UAlIX*C_Zj1iqo}2Kf*2Y zh!HU7@hh*yv+f{z`I7zYBb@>meg)!)uw_p4c9^-bF8_is^Kg#H?KvR~5s0=(Qjsb9 zv7#~$Da*7=koHw7V2`U2?Q~?`Lt16>=NHn>mEZxE(u(H2TQT;%p3O^Tm*Z3&Pdif^ zT>THzGfD}iL$hKL66+uRj88-2R6Mn;^fO{jKO>Tabz_#zDami%)hwW1auZg^+P6h) zd4}>+NEF|y%IBT7(7tuY76trxN^YFUJk5Gf}{ z@q{vFB9pR$kcv!DYKJp#P{YO>H>kP?EUJlkcP)-4OV z<~6D(X%;+#KY*1P3*N+H^Q$y83Vy;5fUk*9tjjQmu#SpwWqueG+KA35eujbeG7QHh z#LQ$^8X#EA;^`g5`vpTX6QLQfCCfb?OwRT10TC;9qH({v?Wk(4vLGK6$adHyFTl=E zOXA!W!DXu<7b8rpHy(3VemuVfaj7`IZ544s+(O2+E~~}PbuYK;2cWMf8F6?}R*FGc z0$i$*!}>lxHuKsNrGPfZ7&C7j>!`?j9}Q#+Wh2Rm6HxCwNnYLTqXgs7Qu{PTpLb)wOMfvVTnzRGO&t%6P z9T4+C2$;Y}-@Yah7AR_d={OV02%veVGr1PUCyZ8G_12CYspAQ}Y{Wz}r<>Xq2Pl;R#~V*7(`>CZn=U0=RA}B-kRnsONx?5Jdq;1L;l{IoY*Q68)VmvH4T0p z5VG(!L7FrOXE@x<=tZ5Pc_>}zgV?6t9qMEA=JW|PeTl|HunX2EqYKGjF{62DcT_*# zFXvC50s1E)(Hyfu=kOVs%y5{~_sE=#oT$)IZ2CMN3hx+Vst8(NoHQ_L8GMc6x4EaO0Q#8LUgYeX^;IZa53_Q!e} zoXgY!HyA&ds4*WN_L>oTkKXa!5sZR5fcFl5GfwZHB>t*M6KuDTSEBe=l@ic|uTlJK z?rAjHqtC(+!xf3ep#N!ob`!BryuT_Dy`z-#M4H$?$%Iz^>svb~^8%nOUU^Cr{~V$4 zIep37H0#BkNJP_L7rV$ZBDQfinV!r_NV78hj{7PLAG}^2knM1qu3am14IWGQorx0P zBzsG3tCBaZ?@|l%U8az1rRBTqXOt3j8DFFL9qwse#uOlWJy&mZ8J-u`?AhX1;UDyx zmRA{=-pgWfmw>gy{`Dfolm;|M3joAqNH;^E0N`vuRGLu4J&k;T`OVXUf0qyj5aeZHYYLwk2Wip=h7W^uVGH`QwWn@y9MV_SoxhLjK&NL{Xq4neqbt z50nxJbiPLMAG)UrbXZEV%A0w(T5QG2%a2sHU0^xAn;e-Z8Xa(yxm9 z()>8~mEXH?ywzQnXK9H9AMe1mIUwuJG#{Eo|0JZj@)TtfGX{(3sFFZ*4sv^mzJNu} z%!%SpDCx>m0GWfWw9a{5&<$``Ail3WMQOM0fSt9^c@BV`kaefZ?9|@%-Fj`)bDOru z?<&m2QM^Jh@?H0HN(s7-uTlIi_bjWFuTr|Lk^jCv<>w209Nw$q*S%-w7F(}hvPt2J z&tLSP_|Tv{uZ#Y((Kz`seMtWJyklLX@#wI2VE?5OMQ%DMbBpcPRL-`E;wV8Y$&>o9 zQUX%*wQ8}>ueqBI(VXO&N^)+H9HLzDdC^es{;x>5qKdEFo0PX5-7Rmr`12wBu@32B z6@GdC^8%Yd$BTno5;Y7p7gY`ak3}8q(Yv|-Y?C(rAsi+cekgfZJ$OC5$J_cn(=hP* zxEUmoKXht4?WxbNOWgjA?gz$JGghVwQ|J+miEZER>;a65J{XQ|SgX6^4c4gxZ3a zJQE8EUqO6)KTF&{#sHp0Oef5OA^i%6;c_F;g9TfR1)}BI8;yU_oaL!mFw|kIE9@md z`;Cd@nejQSj<99*Y*}(HCV0>rwvz^{$3hm%BwgJmN%JFhyXt24n8^I`*q1m5I3xfM z4Fl4S1b}e(p5a+@o8gv11Y?`x#m|NJ)pbM$i=2gUMz%E8F26&>Ou9dc&Y59;_*6}vHYG<(iDrq+!}Ua{-;-_ zKlM*io&PJMf;h~haPA^jIL36kB*5miK63s(Q9@#&IKy#dy0)sXz!;yhCnzR zd>^TQ6ZPR{bwxWvyS4gI9D3?tbS+c^M5#Ht@$1`)mpQXcMZmj@a)B7ONCDeiXs3Fh z9c5mBW8cRFIf_BP$ll1}JbNo_Gh}bR*3zy{Vg8f~O%Iv8ay`>5e@q?^I-4pNNDZIp#ju-Z_6(6W@*rn#ra$A8Rz+ zt0XF!nDQO?&q@j86JMkF8}4a(AXE5W?yhla^hHhhdJL*~iv zp9IWbeDcDzgM;6{R!}2-MSf*5d%G1wGbF#bb)lDCSDpeHH`Cv!rrMS(r$I9)IVFrh zWONJIdSzR51=%gK!m-Hv^yEY_^lDGVjWQ?yarmtdz2jw3{IofclE?i(Glot#B+ofrU zrCYDv_{GAUKB`jRP#fCmhrIq)7YJBfvg63TqW>myCNMqDPT$Sc&jWx$M@4@eYo-p( z7Udur7px>P0TV-GW56tUb43tuWlO6ViL4}X8X4>nJ{z=A2-y_A5^E}7z<^f>1Ne33=2DR~3gTp;-n3?1cvJ??Y_2`Ak$T=)^ z^l%{vn{8F7NlablJYWR5tp{F<={A6VNHSiQ3aXXoGvRkTqt2F^It zg_+Rw{fxxe!06<^IBu}Z{ETzTeeTyY7!-VsViXwzXIietYR295r~YwZaOXT;H+eiU zCyN^s3Wg^v&X%d7sVX8K*(|ncr~j)g#Hx0uQxoTTU_cYNYts-0HPa9(8*!A_g?6$h zeob6<<{DzF8^MNzOZfr9ASe!u=R1xMCzO}uCltOmZGRNM)MdHKJu_8Ig0Mt}o_0vr)4K@JJSt1YW@21MoMqoGOU<64)KoVqvr=EcME#SnYgxLRxezk(VwDP{ zJ6~I9Mdg}NoT9kj6*Xl?6NLMgX*aj`v>T@=;(xEZZsA;G(b=fmz~Oz51e?h14j0ol&0U0-_Ly-tGh;A;u26R;yvgny z!t`0DwDol2$#E2-l@gVXR?4}<#;B3q^jmncbet)v_oa)H7%N5WUluvRX#ru^L>=cXg_jO54&C9K4EKN9fpNBWbhg?EIb*&m3R;MH#=5^l^xb;3B0$leV;zroi^#1 zqa(607h<+Yz>E@6e8U_^kBvdY*`0=Q)qc}T4WsU?VPW0Fs+;X7EKjg^@31zYw1G0M zEQ*Lef$&}|yuX5qc{KeZq8*4ui`>S?E_D%o?iH$;b`EkqP$1ZMiCj^<#yzv~o@Nk1 zheg+^H(!8QbR%SggFv{GfMo)UJ@a=F*l|M$Cj=J)i$w-zNK(i(pwHy;K1qa96t8vY zd%wzX?%TTDw@{MkD;6eSqu5oSS_T(-hLL>=#>{CFd zaSK!ELT%)Msb8Xe46tlAq#S#0*D2S!bP7f>xm~QjSg&R|n5@Hyr(?<;#+Ti$=C+RI zNV}y^jq&u!YYHeUM7=ImmzZ|T*b3-GQBS9JYL6{2q7AG~izfLysBWP9>IOV|9aJ~i zeRYGS>OvKUGfEg__lT!0B({c(p45MH+aSqFCc7nS`LC?qLdm@zoNuHc;q%I33j0cds{td0sIjb8)~-SA zLIET!sq8?u)xS_w60Q}9O1@UDg3LSZkIrmovEx(fhjymQqH1NARus>zJ->oX@>VI~ zVG~XPLXn)U!7&{FS6j0RcxNIMazoL*)xjw&IS4^DuIiq@vhx*=n|EiWPYS{10Cv_FdfyUXy??wN6( z4@SUrwGFnPn|3mV!+0iH#M2jA2J44q(uhXsU;iXd$EIQJKd1a+1th~Rbz^8yaIi)( z^jm6@3jEp)FHXa-QA(ruQUil?jEQHTp8%2Vo<`ZaWr zMe#K*f65PhtQUO@Lc3g8i%Hpk0aAom)W6yB@nQ14ypM&7; zdNtCt#E|!glt18ozDDsf_bgB5<`3_m1Wcl%nC~HbvfMdH;PW7~Z8<;sCBDeq%`32Q56KoT69ku!=t#1yB^ql|qCf5c3=Gy-)J+q#?Ro~{FzRLX) z^4u@0M8I==jpAQ%PwPq32G+S0<2g0kZ}cJ#j-zM&Mz6VS^@!p}-E+U5I&~8;{gYO+ zDM3$jz)*#3cbWk9DU&~BrcXKrj%^}9Z66KavWhQ+J~H&y^CzpLEYpxaVKE=cn{k!#C^AygzspIZcwabXHaF)B6$kWT~2? zhx$YWem|0Mg)KruoIbU1voy+!Rr%8ev5kXgPCj*gqj74T+WC8P9462$Gkp??xLt&d>spUfiq=EB}8-2hQu{gdV{jpFN-ocG3V zQVNWHBLzawZWM1WW!{=(-lli8>vb-JDFZv)=NCI5=9RxqDL}qm@9Mq<`f2Q+ZhOh4 zFZ)cg@)N})u29*PAH|~-%GWUNGQT*e0cNL$eU|ypTn0nufcsnp`5rQhFMd>jZgFcS zepn2schgT~dAJ%uoCekzOFRTIOq68l z)vnQ*EENE3zNsiywm9V1f~y0V&J|a2FsVE&vXr9`@EcG60{+?B;ourF7$S}W@20+}@fTftZTJfZiuq+fU&Yp- z*c@0ftps6Ot|Y%8R;Yj?RFjhPf2h0k#8XzZziWXzKe@m#fGhp%#1c*pTu$b=CPh#GL16O!c|R41t{gH+5(fuXImjl8?ads^G0_<;MCnpc8_K+s0bbRXbNwwv7q zU`OMB_q*Q>R5$B2^LA&dTNMAIN(ODwW!>i&wp=jBlG5c&M~0civ5$|NdozlZ?0;<0W9gWrqCV-d!M(QYqttdoXxP&{V0 ze_St)8`oz}5%FH}?fOp85Q@vo_3H^|+;9%c;l}m)g&0%f9$OzOpV4EyK#zZ%5=sq(4_jR;GDB!~&%8=`wE7>#pAJi6AXAbE?@WZJ=U<{c2|n6fm}{Ga>R#nX zs|rq1!^$ALE#o{KFHEBQe4r?30* zmFB~98#IYcHijW1(!K>v!gvQ9hiV;GI3-}it0_{jPs>-2dW3&&q6WSYROyS*o$ zrT$%9S#PHBG55IXJh5*!>w7!)O`W+&z|>JmG=J)wgc#N#cfZ+1j$9qc8Yw3Lu;^sF znh2m{dn^0l0S#8R^OE9yU_iyxV-swR-?M~+O^3SOnzZ?+C zx=W?;yKb(N(bhb>37g}JxbBt)&`>+()-IejI6fJyQI6g>&O2ZQ_`x2p+*{oZu1vybsmwI~l{$3C|6 zO7|;8(E@nH^t;#M{2m>@yT@0n`lm@a?Gzg#xO@$&oYBjDr8uC*^b_ms@GFOn*va%9 z=m0k}K8>60RLn7PK0zStC&M+vu@5Gn5kw^q70V;|WBMlp#qGOxmE-dzN%&(0`33r% zC}(JBJCgM&Hp;%pW$Rn3AUS=~o<}`xHbDJ4xjKq}z@-D@AQzKQT$)- z`Sb3%(ScJU)Q)1lYD>9$n$X4a2>O!?H`w-R{p8Ne^qMZGC1YXOz8(wlAf5py55f#f z0-n133;mNIQleI<*hcYf4vFHkagoFG*Y!k86)9k-F5)uKvc1=s_z`y5wW~9JpXS&L ziLBV|aNM3gGkV`D@bgYDbGYeeVR(UiZqk>)F63)RBRbsEn%Z0HpU(;UROW%QzzYNJ zj)~bBC{>=lGkx&AA7Icj7w}yacFy2XCjR_s+4R&$hQn`**IBn+c?!mH#@2cT=-i;! zF3o-WUzD>;8Yrjb;Him6@Elhr#SeG{_T&pg{}|N(RSDonrHuH zM?4Y5dtD(WG@T#rp!y-a-~G}Fb!`cvO2B_NxvSR;cyIlxiUuz(348wqPqOu&4ca zzuv*~-`2Qq1r(XYxm3>y1C)}r8g*NBpclemmxRJLeQPo9I&)7zptecUc!5m0PY$by z%3Pyo=oaa0yrT$q$`o|mbTb8~Wf6ARCQ~#nR<~USQ@qo$!`stmmrMb?@1#=#-xjYc zFa`D+5v83=g%&awXKbf^fbV_Eec&T2+a>x{Zmfvt7SQ_vM|7TD68&-q&yPf8?;6d+ z?{#3OoyrX3PN~eKaMq~|RTjY7M&)01r`a7aBDNVS8#oV@(u)++kLH&O!g|bR0Zq270P- zp?d0PvvKf{YYxv2d&Xye{Y#GM zJi8-$Rx{coht zF8cs@uS=y3-`*zO#(+<|c2&bLsIPE(X-j~k=(ILy-8PWSh zZXHLZXNN@BB8w|zEDh8*iKSoYz)d@K7j{A2D`$eb=nrqosC$(o2hWbFyU-QN1jZSp z?n}F%?n|bJy7-{l*EIf0)O{2S)Ld7~9d&tjNL?=?-s0f-Z@8`=m9>9{?EI^{pz>8S zLFFTPDi1p<^X!t!+^`B=S35vwh`NirpzfmSp)T%__IVhKL+q1k^c(e>dcA`VM!WS==Lc)*1(F2z2Y7RbL=@vHLJ$8O)*n0NFN?uA z%huS>x+bT-(1RDiUpzbHFF*Gf3H>)l@dt~ltDO^n22|G-T@c+C@uy7mhdUY6&Lg%1 z(Md6dCpx0@?2zbDJn8Cn%9VqP$TXnSuDY)3g1ReJ=4{)#C!ZnpCzzPt=%~xHL+W}a z#%T;)U*`awA?kjA7u3CWdZ_!}PI%X?y1K;^ibe5T9Z`68NZlxYnJa2bCP_-jv>g3hp*@c-h^)5#mo*hy(;n|Z{IC!3e@wqQ7ieWB?I3o)kFYAKnt7n4f z5b5HK=)dTQ&T|SxKPCI%0}jxK+;iGldTkffT{8pJ)d^ENWhz@`{Y^&>p50MbE->Il z@vk{RXNbD0L--YfP+P>l4bK2|oxqr%@$MfvqVVjJy2R4WPpvNm#{9Ct;NF=tpto)4 zg6Kl>K z4xU|77l8qFKjQ$kP2J86TXqbzZ_N{NFg<%2Z|tbvhee7%(FNa&M-`oXtUoivJJvmR*_)<0vT;YhqvrFnS_kJlARQUJ4 zR1{Pz<;`HvWj8F{l<4gB>eM2ET; zmvdn{rLG;tHbr$(p@Kv~hZ{YYHg1#pcC8qRn{?ZpnoeG{zR|cAvJX27txlg^lAW=0 zt><;;ZM{~V(7i-yO8(osApdPM!Q9MVLHydw9hG@@NoC-@PIR5BylzU}JG-Fn9Wy}P z#(YPObT+)%QI}_z)P;wk?oJ2j4Ds$=T~K%T3{cn2hIeLydBhQgXNT0)_Ip?K&d#XX znO-gewJ-b{xNOukSLPZ$L%%|2^%{&eg>K{bRPW|#saK0w9klnqrmfx!ISMB|wX{nb}B-)--rQQ)YFdck_McG-szcwxPvfsb`da-Z+U|Qc0RqW1ahqmC*ml|SOB%(Fu(NAZVUp=YWQNG6MkKSR`IAA6_Nov$*}K;6!k6j(tC z0*ijzQI}_j)b%|4aR<+TGw6jaY)j>REiEZb2TRklof4fx3eGywiO1Ab;WukP=!nj< zOQJL7W!uG=5RMmpNt{N`(8My13oW zI(6S8mJ4j~zjx%|*(G&NagO4@?Tose*~B80@N3g1K8Z`~&UI$bPEEJ9`K8@@U#NQD zGA;FXW{bZ`UAl2v>b;;7I*Z2bwYPZWAJOUgyd`eeW}apwo27bBWOxKEW^WmakP|BySjlf!iH5N_ux=G8ZF!xeo2KlD$+ zVC9RpEd-yT-J9Jy~S+~`gLP2y_=yK{y+ zUvF|dSBAqK8V(GKJ`I=?dU2B>r?if{wBjW_XX_|WnAPshmcl29wY|QbUubUMllKb{1u0C#3$m`c*v8 z?fJc(9!Bz2*Bz;Kd6|=iJiF8jt$V#m|IZG3!O*F&Elu$$Ds5Bk1apmc)(N0qged-~X1l6iI=y=YQ@4Fx{;85zpLAnW z0#F$APjUzZXUZ;g@4<1$;;v6B#}j!5Zl~=W^lqxIKla^!vs-=q)pE>+GkK`>9h#M^ zF1HL6HjKz9=Ja?w0b9MV3EW=cJ(agAZQg0NZH8ut_+_#yemQ@yUp?RWC*YOqoh&V1 z%o=1VvXj^PSBXn9W7BSIH3z1W1y;{u(W1#~8&u7RxXxj6t&{300KRs}?Z(UflfV`) zv&`aMh#c~@D!AhE+I*C!e>{=LZwBZKSRr(Ekb<~xxaUI2X31*R|Y!nX1v-LvL{yd=~ z!Vpg~H*a`F-`{)TJ6T!q@RMaU*E&s*qiz3%?^8f zuHz4+!zGV}ea}dmt~QI605_n22GYaK926sRL(vNT&L{418B>nE zEed|dagXhxS6v+k6UzZ{Eo&3jj-Xy zEA?F4c!kcA-=d@jYS|^p zsSNokYng}y{H zreAnD-}tVD%~BMLl8FufDqHBQ3*t~yY|ldHzPH-xCdQ=R^ z(blM}Oi_7F85K+F0u>5+R1C-uwnk+|ipm?xs8~`Ls8G#t7M#Yl4K!t)H6$A3s)~IA7 z=wHgHSW*|LP|%}dKpt(53MxW2g1%Ko#ge)}g@PUx1M*+3QOT5qIf{vi;+z&|NnM~q zL63?7nX8m03MEv@2J^*bR4l0rR4C|CF(6NEjY>9{pIJu5lDa^Jf*utE@~qaVWP|wy zWmGJw3sflRQ86GdY>i5$uUuY6#ge)}g@PUx19C-cR5E>KaTyg$>H-xCdQ=R^HLX#} z^pzE5R4l0rR4C|CF(4~jp~8KuUfQlHqhd*2ph7{9iUC>M8kLM!ZY-l>NnM~qL63?7 zxv4oStaE1_w4;oQC3S%c1wASTWM^wsvJSefjEW_7feHmZDhA~C)~ICCcC3twC3S%c z1wASTWV|^lE7d{SU_Mkv#ge)}g@PUx19G@EDjC}zFQZ~fU7$iikBR}gzd0(z+-1D- z+9E3Q=djA;gE=gBb|R0hg?8w8d3}H*pQHF>a~zjz!p?B~@gj~Vi503jApq6-(*@6$*M(49K6gMkQn0&y-QIq%KgQphv}k{8cMdLbm-v z85K+F0u>5+R18Sm8kNkL{<|_Nmed6*6!fSVkT17JCDW6Jt_v|KU$-bO^1({QL&^hP@$kl#ejUbH7c20d9s3*3U<9Eb%6>6 zJt_v|BBeC3>xXi7{roa2med6*6!fSVkY}_;B@=PaE2CmbU7$iikBR~L-qxsOB5pw$ z6-(*@6$*M(3`l=-RF-M+Ec1+ARYt{R5Ge;ETdvcU7$iikBR}gp*1QQuWT!$Vo6<~LP3v; z0omRPl_h}}_0}>fmed6*6!fSVkXN=wC6g;7WmGJw3sflRQ86HUTBDK~A9t5gv7|0g zp`b^_fZWp>m23_=Rz}5=x6z*;@E7mr=2#E>NMMN5z2rN^4XyC*5zA zQL&^hP@$kl#en>FYg95``NJ|Qmed6*6!fSVkUwgTN;a7PxQvP=b%6>6Jt_v||7(p( zHZ%W485K+F0u>5+R1CNMMN5z0V)*O|UIbYoAGAfqT z1u7Kus2GrMH%En;IqRScw8f`jGh0#@s8GdtA(Z&LctS+&r!Urgw(%YkRiqATxXP!;ykMfn19C&D?hgfZ^SMyBC3R7^!L_;#$hK159Ej*S#12OcI3$WKsf)S| zuGMWoZYkCMiJ)#i7usz}UDR!Gt!@LdyHxl86V%P;Lfw|sMcoG1>NX(zN_E>=#wLaB zEa4o@EvbvT4X)K~K<+KoeLUbbJ{Q_;NnO-!aIJ0wa(}7r7Y23nxlp$yby2s$wYm++ zYfE*{3+m=`p>9j+qHcq0bsLa3mFj*hn0@$MsN0gdsN3LL-3H{XrMmwqsGHBZx(mXV zz1=IPDs0~+6#NXp=O}(>2`TQ5_d!8L*ykoTABes54Wp9^(cQWtd_ zT&vrFe56$OPXu-Ixlp$yby2s$wYm++ZNX(1pVr;?NJD@9 zlP}RTihq&KK*cRkYu!)6M;SCM^<*beum#FCNx#tjRI~fqHV)brBN+mMAq@0vXA}Qd zgj74bGV?p3>kioHZQ}Q*OAYJT(|a4EjeF9w6=(jqjiy`p%S_ZK*6?S-^iRU59T#tr=NwjDy+KZ$5& zEB{;>?hWx}`d5_a>-0HOF*rRY>}olu>r3PX8qB4^B;pxLZuk&j`|t{FY0iK_xD5&y9KppB8j<~pKCnr0ob!4WX*2yTB5I>Ii4 zZ!!+JVLpmCyJxeG_=<8&ts_QVR~*u5PZRFouwCkwquNk@K%K&Qkh5)sK-*l$6iL;r zV{8C~9kW&7f{x*9(-E@GW!UbX%{peP0_qlZz)^L@Y$HDu%#puHkY?n!F%**DZXy@S znOdTluPqMkDhk9-^!+ajxpqcNPv1Z6qyVSG-YZ#f$O-AijaIYiIdWiEnT7J&K5San z_H9-SnfLQ~ZJ)0#wEc3;?P&YERB7jI+tc=;nOF2?3u}h*e70OT0B08u>-y8KL}icX zW+TtFIJ&4Pl$gO6B(L&8T{r5N(8iM+xw~^}dq-*e!`BCciFLNgt3WsYlAGU}9@150 zC4Xd98^>rDixzzgW-{4y`9+7x!+Hkj@wG!v_lI-=TYP+(-gauH-Kkk)x0^Y3t7nEA z52TLk3%|`32J=pv&0)I0DK{WMKR~9~nkeS{=_t0_Bh$0H`jlv=QQO(MV{%Gtmf3}C z;sz;Q_v!%N^eiuK+ZC4nyf4nrKB|1!&uN|uEe}`%cb`t=J>X!ZRr;Uyt02`_QSLOV zKInFrK((WMw9*ZW-f^{LlRyus6?+tVV25W6>eyk<4CjDi4kaGd|0;c2sn1LGnL~-$ z_D$|RdhtJ^ysOjzDJ_?KD|frargXZ$6Q>3A>f>3j0a;xz{drWkRE#FiqGpu zz5Bl?eoP;un8HbOY0^?{uHEAr#3{?;Y7Wh#xtx@-QlDtnxIQmZ&Jq3ND&cgVJ?=ba zPG_z@6nV3&&e-w-_xYbxb-+PvK1UvZ+&kyCC*+Y4D=Rjw2^O?-`FvTlBdfEfRR1JBNB~)2VhauKUukCy=Iz$= zM;Xg=+)j1Cxp3KD^&KYaPW7>WmG!GF`n8~6{c%^_fBx!M=PEk{f_RSZn2O@EE|uLk zSfw)ABwo~v%x7tuQNzJ~JTLY6TBR9L8Iwi-Bp}3?XeWC$%k0+N6NcUWlX4-E=8_NA zU75W4C)2VoP|`Ygp8rOvPP_EKL8ts@XZj2LfU?}xxL%qK5|f+opo5Wnr$CEt0u+yL$2xz6tCb1*c8eILT>4 zQ`k_|D8sD>TLc@Nh3UomVXyEzs3~_mYv&bd{++rRVY~h*w^RSzm9Skc-7OMs5SCH= z4E1+PAnrD?ib_OTqn|R;LzJUhou?aU!oHN`xSc1|F-;qUvOo~TG3h@C1?q&*Iwn0C z)j`b?x2gA!>TA#_`aWLXY|2FAI`1*d)5qH3IoXZ5UO4|Gd)%)Pz9ZNm+_2gl^dQOa}V8kw-%Yc zgm`t?E6}N~p%x+Q9>meTq6o~i&*3gMe7!1PrcQ45+Nxr#6I`t>J2RhhjD%f$LKUHZ zdxlH~32-jZj9`LPyYq8QY{y5q>R= znCmb|tXI@;SlNqY)uz1yH`=dj)e?jqqsaB&YW;*G29d-2(&T+0c^^#Phmv==mVC>T zceaWpeUF^BT6T$>u;0@;i{ldP$b=*>6yGk6yI;AEiaLh_j>&|t+QNi5uDKc!wq2aE zPT~wLXoIjwYlgz6^V}~fN6Z7Wg)O@?eEh?*?_yy>2cj4FSuXd^oVw%_ug;A_ca6g=1CNJL{o>5P?OivQdk_d_syi1kg!ay#!Ux0yfiMS@r0g7HDb})iWb#tpA_ir zvR#T%(o+d}Bi_(cDiZ6C4PYqHoaVeJuDf3-QHnJ7wT1t7gOSvp4^<0So6IIxMDFfV%E3~~;Zn+xQp(X%%7jY^NqoGN z@<1u&2TO2%xRmnRQp)Q}DQ_sH{78_J$Z%$wozhWuCt3yX6OvZxG735ij%TyZal0}x zq8sj0AzM&cA%Ph#sNDMLD<$ARsMq|5ZvFK4JygA*@>z$?J0;^1{tksaH&xb&`6o%< zL@~ux5HY{fEsKmMA{#+IrnFT~qz?&Gy!NahvGB6Q{km6qxdwAUPu7=~>)$V_)QEZ1 zS6+d`3%z1g^uTLiblI&MqS*GzCn{uBCT`HQz5Pux4JwnJMbISE5@oV|e@!wCDU%(r z&?M6`WwHYynq*=sv;!=fWLlw2cHl;m39^lfYrMs62ZIDZn$BegGl!PsCOur9yaK`_ z4TohQOsEUJJtJO#nei|I4j+>L$>c-AWmax!`ePLThd8Ms%RuWagRQd+wa&7vb(ZC= zv#e;HcW17=v#E3l0d&_51zig9Q+BZE>;WfI{#V$a zG|jvLrl6YTocaV%CTm6EA+`DeWk^<(8OfI91s~!h6nu@w4@u}P)N9RyjmD!j+U;{S z9-{c|b%L*6zcs-}anS|Aw^w2d;m1Ehc#-=)AnKssj_I|>3BEB62R?C^+#U%%)}FZo zm=)$RiNB`$t?+E{3dSD;+H~7Pf@9mn(-9Q@h%~hA*vV+WR3)*}LJQOOOeYyEI03rT z!3R|y@s<+^>RuK(QiRSXLwX*2j#`R6u-5ORpI_>Q_NVE;t8vch*4lXj)hsJPt4I=JZ)hQFt4#HjEQ+h zKJpU?fl0PUtPM*yWmV|QD_~Wde*N6DJ7K;8S3s~*5qw?zw^9mmwPy>6a-H66t89u(nI z&RozW|85Q6!y?ZFC80J)>m(d~sVm2-3Ts2Gi+L_iG7Km~=xSxY+2?@S%0@=}P+S+> z8H)vEqa!S{JRqo#_8rx?abX7-8+in>fJJ832!C(KRC zr#do`iCl(b^CB~fzu&bXa8F4pHrD*YaAVE;9;%m$$5kqdf1+9{+8t`mq$0(I9TWI~ z1|1g2n3HZqyp2oB4JJ}?xqf9*-=in8kJvY)<{rI`;_i$A1meATT0pQQbNMr?NYK~6vc;1DfhaRY~)1ot4k@zT#7-y z$v9srsaekg1R89GGxi1Zr31WqxbXw?#qA4g)YbpXfqzpSx3^MPDV}iq9?kcIZZ^lY z3TH3V?9QbPsH@}RYd#V9h;_b5-O;}MFmRljc4?;e2pRztaRuJ~3%Zo#*j=crMa zQg)t(rDmh^RGrEAW->4v$AtY^^`c%X1iWpwR{VsG*F@w#;{(Hu{?$!H?pK}2eS?Wy z1D>saaR6&G^@75Qz=b3$BsNho1|(QfB?zJ?$exw1K?zh$tuduyk|B%Ac+&Jgg z!a5STQT!2yK9>jeEWPvW>iq3JZ6GYiy{s&+!4j?H;ZJXMe%E^MIw=1%|s%F6OlM3p=SR}CG_w)jYvf9 zmDsb800ban5=#r=h!YhrmDyly#KGQb;fE^fpk5?$iCIr1o)M9FwYu1=Xfv;R_C%uZ z3tNGo?MkE$ot!C=Xg)2!<#e62$IY@qwkwo;t#rx_set@z>F42E(~eKSc6i&1{&e`g z*WLcmj@m``S39x!*11mp;dBfa*$HnVFtS>7KBnAqH)NudwI+^Z#w}$o{P9HXHqpu6 zMH8Ka5}%7CRB=^}>9tZ~bA|NIF+EulYT~R?H{_Ptqxg%?F!_*nGkTu-TbE)dZko3L zWtU>N$5_f&T#6mPY$;!JDR$Y7rTn8yv72}-LcC)|q**HQfME@QUd9L3)%rJOFMe5aK1cqs*%g)7BHku$1y7mlA567rB&B zUwN{t>mofp`7d@UXClJv8Kv4y-#rot_h-30=IOgh%%XXnA+$}*HKt+1wiZ0SC)^$* zmTRIj0j8b5MzO#sWg-PpRWZfx0=-Oa`p01~x?r7)~C zHaVLc%tBa}X&jl0mrq!7d!@dR#wZ+AlTl+vHLh?Zw@^zogc`iOqf2$8YS})bY&a@4QxYdX6wHDj8ecTAJ8$fZIii&bSgAXGea zeLwuq!;R+;>x{?;K33oNzw7#bq4hn~%F9)*nr_zf6i<4dJ~h|HfSA|hCJH9jIScN!$!iOv*zfc|v8lL2N1UW>Dpm22@XGqbY;?QUHtEsKO^S@RYi3J74d^F3aJ%#q z0ZVoxZ0RRfDC~yT(oe)4*^Q~CpNKa4JMozb9?>hqkQgIw5zTSk%sX<0qr{UICvC~! z?|zHo+3C~G_FzS^`5M9$8%Dq5h7o-e#WSy1i@<$Ch3y^9wjBAX%A675ve3C28moqH zSHn%>UM;!1Q#)<1mX5ft@p8Ry(f1qlj>foI@9UKFYK3WTX#9ZQ*%^DamUCGWUzL6e z-KFQ1KX{J_Hg$-?5sLaY^w3rg2hPG&17pnaOt|n!abUz|ES4KcBvw+ zqWJ2%nT(KtW-}SZ#haT%ax{^>A~rfcZW8>-1lO9rvO;Mr`B`8OGufbWquXFnaLNhG zeb@?3XR@cOB3^zbQ{99~ly_UO)MpnxC-Vvl3wtd1!A`ADeyA?b9B8*QH_gU;Xg4P} z&Boklw;DIi#yn{^4mZuloVh^yRXQ>Hw(&z|^VHIYiPf&~ZCVYJtX;30Wb@VV!-rCX zthO4u(yq}gl;?+s#c?VA)m=bfqTOv!D9;b*tFvtOS0H3CSyoT^BGwgRL^j40w@>@D zY}1SvF|%{E_Yw_#kKxQ~24O%_-JTc`AA={H_|A>RTOoe85VzTXw@lm-ZDnNk-z7Du ztPSjt9igC7f)j!DU%gHouyw}1b^E_O@Y%SWoL>|_t8+U- zaGh+28#GC6&_AbsY*QcF{4NUPz6gJ)i|u{e^A8L+8gJ8U{zGqj{)=ne7x%e||C_d= zQg#gza#lC>&v!d;03fWG`iVueQ{0C1j_JBgX(P$hkAs4>6fT&975|Mt9>ku?G^V}{;x@Woav3G#|1ZZpQFCYqllrZ&e2?PZRA*}niI5cECPEUY?91!LBoV5s-YGGu;{s|UR6p(H%>C73lHCc_2CRum z3MXQc*i^)v9Tq^mHF2lRO^8WiR++_cw{n0d3tR|PoA=m1Y71Q0U`=MRvY33nLw|>i zt8-FJhN5eF#bgM1Dq`|4MPRRU_QYgJ)#=^5A3|=|aLDW1Ju#URlb5Dqk~0H2=cdlr z*FaGI*ZW!s%F8Z6-#Jz-DC<3aCMYSK>XT@N%k6#hK~;j%=Z#D{0Am4r_5iBKx? zTc{N=0d~%DSAvqu&3l5f;~=VVaMm4r@@#c+Pf+R-qLNPD6Oyv zlvR8DPX6n=hfn_NJ07av<9E9gmHXx7mdq=9N04Rpd!H?E3IK_?Bm@fKi1=dc=?49zst{V<~AE~lbjP#{8L4PyttQn zHth0?;$1@43nSa!cT13RrnmRq7Kp-Gx4kdV?&j^S)eL@Q@$j50j}Fh>I@x3u@b!+} zmxzJHvj#rfal(}Zbw-piJH-=b$JxgW&vCObF#U#z?FIu z14B$x$6H!0p2e`Y@eN$w=d40%_-ty?VmCEy8*F#5;LS>mxoBQE}aEen>xzvX*;!mom;%N!>Kr{=BU=Vs}GOV z*1xrlTRt(|aA&C19ZdB-a*gTslsb`Ge<+3Ns}xT}svWJu;gRflX6YJN{&J_K+Vx{* zu$kA26NHIZL+Em(6(-#h<=@lXI4g=&)y-*D zb5n+CbzmxWm?-du-YmMV>420LPuUGwk^GdV{7xYF5K-_%?$#x1CBx|jpziQUmnVrolD za3%wScrENLO|}vi16&BpXG|V;0YeXHsKIFAP7bc~Nui)eS`1JjDi0X83&bCU7Q*;U z5e6qd-6It7IOO=Z*w&fY4PtDS@E~;CEcRTlKJP-~0R+-MT%sOa3HcJxkk^aQ|eoX&S zd|Q}I2@Y=Lpu{M?AO#l1wh1{qIagYv6IWwlapv!%I!V{&|GcuM!{)-Qh8u?qPN=3e zy2Uib4JZ?}P>u^qZnA&AvhxaP0tAlT4v)I@XLE<4cp@K~C1*L>QQ?`6>2>4KS~+`4 zun=R9F=va?ubeMF=2|o%#mVlIQ5L3uTrIZY$et+`Y1k%}-PhQ!;l!;&z{sc&9t>z2 z_s^s=hF~vN@r)Y&&ND6~^0)7DK>s0kWGC7*M`vcV5`YD@0CqHPRnYN$B08rn=L)^F zX(2Y?O-PHPRyJH03NLJ0c$>^W@0KrJsutB2<#weT)e#)JUut8kVmFH7oO@b8w7%Fb zk*16GQOt-_Lsv$d?|Su(Iy(Kz@`Tq@^i!XHvJ+{E$mI&Ey=pxyHLIKbBo$mLIZa5(N zQ;5{RtET=aJ{58`EMiCIX1r}9J^Su?z0he_r$uRNmc8TRpxS=%WKyKZEXaF{3hz|6 z)S40U5I3Iwf#JrBnjQG|6#Lt>=14zr?=>)^5xV&0vyWD0jcu! zfsN*b0YD-@Sy{tVV5bdZHHg~nv{Ujad1I)TGtnGZg&f0+GX9+GC%m*`~ZxF}fHHx>x)Vzp?2e&bwyZaV@b7e@0d7kSvldCT?f zWsTL!cb#T`G~{u8Hn`ludacxY8o}A~m^5f3#apw1$Xyli!2$=XF9&b8;4y=tVsp_T z+IX>1VBr6+tIUID1}Xa#BQ`Fzm0B}WW%XuIe2HT!b4`ku;dV{aIy^Slshp=uyR8Vz ztXAJ{RhNoYFhn@rfmam)l;wkSdc8`o8kuHykDg7PNUX6y+ymcmnFQYBS{}Odh8_>W zLm{!6bCMtHUT&Cts3NeJC!qwg*{~`%@f$;dJPhGm9ofBJeUfa;CE}M#-eQvDXDGI! zst)9PD62gb%I+7W2|>D6GVB^{JLi9~UYx7WM6yq*=JZ&qPq)f6+^i{hROQAc=~=2^ zzCiN(i*U+x4BK>_rn@Q}{qo{!{klP`iZ^O}Z_sRWP0Rct^!#V);)-A9GwxhkEy}G- zVCK{F<-%{*seSi51NpFKICedAD-9Q+Fv9_nutxA~o-c%%|7W3Ss6y7i%zzqHocM2Wzk|=gLD3zfl96^MHC3F26^;FrmIMZEi_WL-SlA%=~9K zeN1DU5y?edHhz#U)}!TL^X0>D2CK+dL;|pIZ{v{@BlDvwgpmJC>sd=cHu=6cejAX? z@KU3kBM&9~28Q(`(aVhb93iayXCN0_=4C}OJzp~X29){{WMiROju2MxS5%;xbbU4op~IluClAVVErw*20{<nS;En#VvO@m| zd%0?EFY6x$WhV5GtX-}25W7BRqcjn&kJ%wBlB;C6JcizERod56{|=YswGfkA#ngHT z{uf5_{hDp+#+v8aR=GU9`uFQp&o0%2ws)|AJ)UMLQ=g+AuKy*I9GTPJbS@hcCN;gp zsLtbI)xT3qJ+;Dd>NSG)a@W`Bf1#)9VP*Z)ERTm(|4#c3iC@v|aSGvJV$slKF7ugj za9y5y$o>~<@LIsV>T%PBZR4E5F8}JwR=-m!qUKzmB2A}i z-}##TI~e38svp1kRG+`~J2Nc-8r+pRBHd!Eo`=*&MNeTfNS$%Ehtw&DXXUE;po-I* z=>}X4)jr2(b!Q_OU4fC)4(C^4T*d1KZ8q?F*5Xz?Z(F$F`HkZFsrxj1&BgaJ?{}+B zlp&)xl;u@6TUGyBgwy&vZ7A0hTG6Iqw93`GreY3iHj8D0vrUgk$2p)+6K>ATYaLZN zitt*0uWoDEBj6=inJ(qLt!pjjsK&x<$SU7L8H;k>VjZo&qZO4QXZ%(5TWhFcj_zcz zhtRDo&dOIwxXxuVt8mTiLSJ9ids!b?=eRGM<3wj$52mF6)fEgE|#^fI-|=V5mK4iNKUsotsJJG0pdEUXKYOH$c+Ks%N9{(C! z3D2~=-Xxi|zOw!2o0PVeo^9DYT{^VqSR};`Nhb8mqtY&sg=6~uK;R9p``yFn{2fVA z2bG->P_;fs=k@s#w3ZbU>pQQ{<V)%6^IRTY=kH)pRkzn@ma6@JjkI;n&g=Ij;HoM-@_G#09F4zP=k<^~dk1>vcj!jm zQ{VYM7qzq2Q%Con?U0W{^doJxbkCmcP_!}XxTtkHlC5kVcs;i2x7IN0a!^+*i-6c3 z?|*5Px2~Sn>0nZ49rUb+diu>qiOpQ(Esy4F_{DZnvTBC((Au5XI>%r-YHr_R%Eq@} z*JYG-vf5Cdje6^AM1ro?`a*Agt^IN0M^>lfwAmR!diIG zTYNP2AGB-9gq+yE9o~E{>P4D_RBi8b>shJiEiOl-v`5>jT+lnySbZ!BF{d*XY2v-L zJzsHEJW5p`wob!4*<0OPkesJdrA6RBUD<^<$l!+RTo18bNaUNQ6P-9P6Y;`D(uh+# zwrH(F069W9I~Z2S_i&1An01S?a2{7>W^P&-cj1HCW|b|@kJG9 zlD`%AdYIG0#e+?_IIAhcy6$+5GB@AoMC+l-MUXOAp9_a=RB<<#OtDFPi&J}AE%|tg z*1wne-5)^H4u^$suM=iWZimEEKIojyZ-g=R3Fqu+Hr%XhH8wVAuH2q{s+VnH9eghH zp&g#Hy0Ne{-b}*XBfRdFZee(_ft3T0n4@3fs92PP9$vBL>hGbepl*y+mAuXc>2vTX z_h8xa`X?L(S1S;Pu}ctt_3u^is?(a)Vm&?8TH2E`MeMHAQKSc)Ub9*~o3MaftI@ zDz42sncA8c{75QupO<_KDe`X^Ts+Hvlo4$47xoAtjzx~f0IZh9o=b{(pF!s%^X z#dUDj>X^`FdNjbE?DUeFIiww%+vh*G^vrewV0yCie3G3#J=5Pcw>mjMd8!&^z@jXHU=U>6zCA zD?(l(*1z{;B`Za%^xu<}#wD${nw%g0Os)nhuKsM6H}eMR4(qgiD*t-fYd8t7E1o5(sRwn7Vc)dl;kBlWO5j(w(h3 zBh{9+F$?#k+WBPDa*1tOu7#1xY(==S@hYuB&#Z<9re{Z@*(T(v%FUiMo5^@Xq*=4Q z2!4+1Nwf1ynhiO>Y(DBRFU^Rld4=rGT{AAvxbpUFXlQ<;Zcn25QSaZ+rN|Z}T5n%U z)^n|Pm7E`bw55uhFYir3g6-0-6rP=EWyKjei=@WxIy#G^0Eec@#)N;GTeH(4k*BWv z4J)FZE9`*O^U!7cRN9N6MppLrn>^8EWp919w?5mGmYwg-Lt6HBoIKH_Wp9PHIudZU z?4j$eWlU`?qqh&_i6+r{E40-Tt+zt!M?(4iT=M|-c5L`Qe4<3s^;T%hC(ra&X#FV2 zzn^Q;tha~4_umson)Oy_%kr$ZLhHvt@%>zrXuX{dz6YN;5{+vsijl$WYr35UIS5KhVMJRSsz(>hYB7Y%%VMFaQb&3%#?-Rz`#V#*t&tKT(MeYre2icyrI zJSx(<9%8$Y$TuAqnndx^r!;im$5l^nWcO`Ex^Lrc{Rz&22C$q*?hsvCnSBtlrz$TZHi>W!Nqb8-tTB(wB|mr9r(?ZsJ0jqvEvPE)aQ- z-i;qCkg;rIj&XNuUN79m1HSnz1Ff?Rw$3utI?J-wS(dlXvZ8gCmBlPv9ON5)q>gyp z?qiw8b)MYI7 zO2*X85o1BWJWsN?g7WUD&?WqlJ{q-cXI*HB&BxKOZpVM)hO$))y`uzs5uMFxbZ0b z&6mo*le4u~qS^fK;kBy=`24(=?@b8x)Q~TmUnt(pZtj#ITP3`0q?THn^`b))pQoq}q( z=5rKbWZ!}I3f0XWLaU`Aa_T(a3`+J(RwDdFu5*7ZHQSNi8%xtE?+3L1%Q$Pcj-^q} z*<<2=RPfQpV!iH_Mf1cMQ?$}+NO?aCzf{cZ?BGNS#M?ryZ4JG$o7=S3h)$7+GxwD@dq*7TM7Y}r#ktXKc! zP5MbWUZA&OsV(=)IdM?W5#{xlrQ?|GpM1GxWSOBp<8fu(EvdLf1)i#${gY4AbJzX@ z!xuK*HhfWI{zJR=KjoqRNmd~G9*N@n^d7~>-Sfj*&4}Xf=qKTW6LhC8wiS!C**D*dxh0E?aDoK8+~0YlS{>{seruNZ*$$ zb+10{Ro)e@#4>#v*Y{=mHX@)m3tIo=W5lZ`^%TMXY#rnV9S;E8Osv_6XWOVHl z>M`u#+eKddA}oA8pyjMVrL2|JyhUYi&~NMXKBQhIoh#|7a6~1?Th?Jn=K6ELt7Mkr zZAkjQUFv$^Lm_MQiO5GvEU{Ju9TOojXpV_Nu5g`}2#V*bi1!`rR-BKm6m8M_1L7it zL=--ef_r2n}a>5p7cGtyV7lj=tLW3B=KBqN>CyjPZ3R~$F}T|GCg6jiF{4dW&N zB-}LOcwvQ}qb_0$Zen#aoGzt& zrCWBRZHr1 zl3E8vXp_{f#@2j|n<##ohMhXRsFMv!e4;`&8(RQK#@2E-I+i$Dyhr0_k;V#ActoFu z#7W3#MikNAjQTO zV%GDdjje}*JT|ueN04G;>om5otPXpoik9M0o9!lDJFSDC+T1Wnq|zf60<16Ff7ZjLZR{o%7|pJ~iBEd{nQ^ z554WZ`)ll+m2ONm)ZLY1iY+L0W6JCt03>5-g%mZjYeqGiR%z7W8y$6;4r2=6Ioi)& zr8DBtftI)t#V!y28G(D6k12wDcx4jXICg2u!%0K3urqvGMt_X z*j%8L+(-l}FHZn9_iBAzm&0VO#HuNTv~NN@M8w8MeLkrFLc~kE#din{7D}NwqCH)E1uP_6~JPd{Rph2w(Qf9x%M{KUBXQFr#F zfDl9H4x1I=yrdH64G!m>!g;R5>bx_qXJRq9DFcO*O zQ!*n3b~xe&9mjwvGn*Or@IGW^#NDUQsGun{SQszb0S!izDFM{JN~pUEEPRu42~i+X ziA@c=)%7^aMjQ92GSjBM-_0tf+Cz%Qnl~!6^i6qXDbH;#CDd~6a4Dh5u)CBpQYvLa;=iRrB8taKdG?l4_PdmjVt2cgd-U`; zA1bBX>r$R4zopOf>Qc%vmtv4_QZI?A@C*B}H1C>VoH48A{K8C0bs0k)NrPf-qj5^F zH6Lp<9(=HRO#Ffy6Z7lF#Gq5Wlt=Tlkkq^X^S)pJBx7Pg91f4;(Z#OE@5}f=9~#o9 zWo{%OvPLC_7HQOsDK~aK9#?D*(p%W{;K0i>w(4exyhg(UH7Tb~XizkG`MfjXtNE~F zx}=j|DrBk^;N2B7h?jQHl%NiK_KVNCeC>7r@}za@*$3;T-5*)@>GbF$6Vb2=%1_tO|d9GTo1aHKN|qm zpugxqpQrOgP+TdtEmUO8;q25CBwzewG8hr4H-XG6VqC zpr7kNFRusPiq-(A2K@pD`d}Ss)Q08+0YEkAJ_q_l9ccX6%|Qd88g%49zp);4E35%f z4SJyi{cf4!nj0C=Vd%xOCNtxcq#j7qs0Dnr1N@OX!1eQ@0j790#!DRF->wGC`duBB z4KT&40S`IA4;tX2nm`mveFqw7091os=|KNQJ?MIlHqZd527R3a{e^na_0q#Y1E3o8 z8VCCC>p|Bm>;@VD)u7iq(8F~cjiRnF0+-3ADhgDC+URnuzpD=Ps+NKX0M(#(IMBaX54xV&j35B027R*w{hRfm>zU0!1E3o8 zs~qS*ss~-qYz7(t)u8Wmp#Q8MbbWZ4fd)V|=sgbfXX`qhO^v^lam)C=?XEp;3fd3z{=utxe literal 165416 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 diff --git a/software/SCSI2SD/src/config.c b/software/SCSI2SD/src/config.c index 63c24ab8..fa0693bf 100755 --- a/software/SCSI2SD/src/config.c +++ b/software/SCSI2SD/src/config.c @@ -47,7 +47,8 @@ static Config shadow = enum USB_ENDPOINTS { USB_EP_OUT = 1, - USB_EP_IN = 2 + USB_EP_IN = 2, + USB_EP_DEBUG = 4 }; enum USB_STATE { @@ -55,6 +56,8 @@ enum USB_STATE USB_DATA_SENT }; int usbInEpState; +int usbDebugEpState; +uint8_t debugBuffer[64]; int usbReady; @@ -148,7 +151,7 @@ void configInit() // The PSoC must be operating between 4.6V and 5V for the regulator // to work. USBFS_Start(0, USBFS_5V_OPERATION); - usbInEpState = USB_IDLE; + usbInEpState = usbDebugEpState = USB_IDLE; usbReady = 0; // We don't know if host is connected yet. } @@ -169,7 +172,7 @@ void configPoll() if (reset) { USBFS_EnableOutEP(USB_EP_OUT); - usbInEpState = USB_IDLE; + usbInEpState = usbDebugEpState = USB_IDLE; } if(USBFS_GetEPState(USB_EP_OUT) == USBFS_OUT_BUFFER_FULL) @@ -219,24 +222,6 @@ void configPoll() shadow.maxSectors = htonl(shadow.maxSectors); shadow.bytesPerSector = htons(shadow.bytesPerSector); - #ifdef MM_DEBUG - memcpy(&shadow.reserved, &scsiDev.cdb, 12); - shadow.reserved[12] = scsiDev.msgIn; - shadow.reserved[13] = scsiDev.msgOut; - shadow.reserved[14] = scsiDev.lastStatus; - shadow.reserved[15] = scsiDev.lastSense; - shadow.reserved[16] = scsiDev.phase; - shadow.reserved[17] = SCSI_ReadPin(SCSI_In_BSY); - shadow.reserved[18] = SCSI_ReadPin(SCSI_In_SEL); - shadow.reserved[19] = SCSI_ReadPin(SCSI_ATN_INT); - shadow.reserved[20] = SCSI_ReadPin(SCSI_RST_INT); - shadow.reserved[21] = scsiDev.rstCount; - shadow.reserved[22] = scsiDev.selCount; - shadow.reserved[23] = scsiDev.msgCount; - shadow.reserved[24] = scsiDev.cmdCount; - shadow.reserved[25] = scsiDev.watchdogTick; - #endif - USBFS_LoadInEP(USB_EP_IN, (uint8 *)&shadow, sizeof(shadow)); shadow.maxSectors = ntohl(shadow.maxSectors); shadow.bytesPerSector = ntohs(shadow.bytesPerSector); @@ -253,6 +238,67 @@ void configPoll() } } +void debugPoll() +{ + if (!usbReady) + { + return; + } + + switch (usbDebugEpState) + { + case USB_IDLE: + memcpy(&debugBuffer, &scsiDev.cdb, 12); + debugBuffer[12] = scsiDev.msgIn; + debugBuffer[13] = scsiDev.msgOut; + debugBuffer[14] = scsiDev.lastStatus; + debugBuffer[15] = scsiDev.lastSense; + debugBuffer[16] = scsiDev.phase; + debugBuffer[17] = SCSI_ReadPin(SCSI_In_BSY); + debugBuffer[18] = SCSI_ReadPin(SCSI_In_SEL); + debugBuffer[19] = SCSI_ReadPin(SCSI_ATN_INT); + debugBuffer[20] = SCSI_ReadPin(SCSI_RST_INT); + debugBuffer[21] = scsiDev.rstCount; + debugBuffer[22] = scsiDev.selCount; + debugBuffer[23] = scsiDev.msgCount; + debugBuffer[24] = scsiDev.cmdCount; + debugBuffer[25] = scsiDev.watchdogTick; + + USBFS_LoadInEP(USB_EP_DEBUG, (uint8 *)&debugBuffer, sizeof(debugBuffer)); + usbDebugEpState = USB_DATA_SENT; + break; + + case USB_DATA_SENT: + if (USBFS_bGetEPAckState(USB_EP_DEBUG)) + { + // Data accepted. + usbDebugEpState = USB_IDLE; + } + break; + } +} + +CY_ISR(debugTimerISR) +{ + Debug_Timer_ReadStatusRegister(); + Debug_Timer_Interrupt_ClearPending(); + uint8 savedIntrStatus = CyEnterCriticalSection(); + debugPoll(); + CyExitCriticalSection(savedIntrStatus); +} + +void debugInit() +{ +#ifdef MM_DEBUG + Debug_Timer_Interrupt_StartEx(debugTimerISR); + Debug_Timer_Start(); +#else + Debug_Timer_Interrupt_Stop(); + Debug_Timer_Stop(); +#endif + +} + // Public method for storing MODE SELECT results. void configSave() { diff --git a/software/SCSI2SD/src/config.h b/software/SCSI2SD/src/config.h index 8867038e..c95474f1 100755 --- a/software/SCSI2SD/src/config.h +++ b/software/SCSI2SD/src/config.h @@ -38,6 +38,7 @@ typedef struct extern Config* config; void configInit(void); +void debugInit(void); void configPoll(void); void configSave(void); diff --git a/software/SCSI2SD/src/disk.c b/software/SCSI2SD/src/disk.c index d9961d31..6ae4d857 100755 --- a/software/SCSI2SD/src/disk.c +++ b/software/SCSI2SD/src/disk.c @@ -179,6 +179,8 @@ static void doWrite(uint32 lba, uint32 blocks) // No need for single-block writes atm. Overhead of the // multi-block write is minimal. transfer.multiBlock = 1; + + if (blocks > 1) scsiDev.needReconnect = 1; sdPrepareWrite(); } } @@ -214,6 +216,7 @@ static void doRead(uint32 lba, uint32 blocks) else { transfer.multiBlock = 1; + scsiDev.needReconnect = 1; sdPrepareRead(); } } diff --git a/software/SCSI2SD/src/main.c b/software/SCSI2SD/src/main.c index c738428b..d799d3b4 100755 --- a/software/SCSI2SD/src/main.c +++ b/software/SCSI2SD/src/main.c @@ -36,6 +36,7 @@ int main() scsiPhyInit(); configInit(); + debugInit(); scsiInit(); scsiDiskInit(); diff --git a/software/SCSI2SD/src/scsi.c b/software/SCSI2SD/src/scsi.c index a687cefb..fb91c1df 100755 --- a/software/SCSI2SD/src/scsi.c +++ b/software/SCSI2SD/src/scsi.c @@ -118,8 +118,86 @@ static void enter_Status(uint8 status) #endif } +static void doReselectTest() +{ + scsiDev.needReconnect = 0; + scsiEnterPhase(MESSAGE_IN); + scsiWriteByte(0x02); // save data pointer + + // TODO check if this message was rejected. + + scsiWriteByte(0x04); // disconnect msg. + enter_BusFree(); + + CyDelay(100); + + while (1) + { + int sel = SCSI_ReadPin(SCSI_In_SEL); + int bsy = SCSI_ReadPin(SCSI_In_BSY); + if (!sel && !bsy) + { + // TODO wait bus settle delay + CyDelayUs(1); // TODO bus free delay 800ns + + // Arbitrate. + ledOn(); + SCSI_Out_Bits_Write(scsiDev.scsiIdMask); + SCSI_Out_Ctl_Write(1); // Write bits manually. + SCSI_SetPin(SCSI_Out_BSY); + + CyDelayUs(3); // arbitrate delay. 2.4us. + + uint8_t dbx = scsiReadDBxPins(); + sel = SCSI_ReadPin(SCSI_In_SEL); + if (sel || ((dbx ^ scsiDev.scsiIdMask) > scsiDev.scsiIdMask)) + { + // Lost arbitration. + SCSI_Out_Ctl_Write(0); + SCSI_ClearPin(SCSI_Out_BSY); + ledOff(); + } + else + { + // Won arbitration + SCSI_SetPin(SCSI_Out_SEL); + CyDelayUs(1); // Bus clear + Bus settle. + + // Reselection phase + scsiEnterPhase(__scsiphase_io); // TODO get rid of delay + SCSI_Out_Bits_Write(scsiDev.scsiIdMask | (1 << scsiDev.initiatorId)); + CyDelayCycles(4); // 2 deskew delays + SCSI_ClearPin(SCSI_Out_BSY); + CyDelayUs(1); // Bus Settle Delay + + bsy = SCSI_ReadPin(SCSI_In_BSY); + while (!bsy) { bsy = SCSI_ReadPin(SCSI_In_BSY); } // Wait for initiator. + SCSI_SetPin(SCSI_Out_BSY); + + // Prepare for the initial IDENTIFY message. + scsiEnterPhase(MESSAGE_IN); + + SCSI_Out_Ctl_Write(0); + SCSI_ClearPin(SCSI_Out_SEL); + + // Send identify command + scsiWriteByte(0x80); + break; + } + } + + } + + // Continue with status. + +} + static void process_Status() { + if (scsiDev.status == GOOD && scsiDev.needReconnect && scsiDev.allowDisconnect) + { + // doReselectTest(); + } scsiEnterPhase(STATUS); uint8 message; @@ -425,11 +503,13 @@ static void scsiReset() ledOff(); scsiPhyReset(); + SCSI_Out_Ctl_Write(0); scsiDev.parityError = 0; scsiDev.phase = BUS_FREE; scsiDev.atnFlag = 0; scsiDev.resetFlag = 0; + scsiDev.needReconnect = 0; if (scsiDev.unitAttention != POWER_ON_RESET) { @@ -464,6 +544,8 @@ static void enter_SelectionPhase() scsiDev.dataLen = 0; scsiDev.status = GOOD; scsiDev.phase = SELECTION; + scsiDev.needReconnect = 0; + scsiDev.allowDisconnect = 0; transfer.blocks = 0; transfer.currentBlock = 0; @@ -640,8 +722,12 @@ static void process_MessageOut() (scsiDev.msgOut & 0x7) // We only support LUN 0! ) { + //scsiDev.sense.code = ILLEGAL_REQUEST; + //scsiDev.sense.asc = INVALID_BITS_IN_IDENTIFY_MESSAGE; + //enter_Status(CHECK_CONDITION); messageReject(); } + scsiDev.allowDisconnect = scsiDev.msgOut & 0x40; } else if (scsiDev.msgOut >= 0x20 && scsiDev.msgOut <= 0x2F) { diff --git a/software/SCSI2SD/src/scsi.h b/software/SCSI2SD/src/scsi.h index 4ed618b8..5da10f51 100755 --- a/software/SCSI2SD/src/scsi.h +++ b/software/SCSI2SD/src/scsi.h @@ -63,7 +63,7 @@ typedef enum } SCSI_MESSAGE; // Maximum value for bytes-per-sector. -#define MAX_SECTOR_SIZE 2048 +#define MAX_SECTOR_SIZE 8192 #define MIN_SECTOR_SIZE 64 typedef struct @@ -118,6 +118,9 @@ typedef struct uint8 lastStatus; uint8 lastSense; #endif + +uint8 allowDisconnect; +uint8 needReconnect; } ScsiDevice; extern ScsiDevice scsiDev; diff --git a/software/SCSI2SD/src/sd.c b/software/SCSI2SD/src/sd.c index fb07bb9f..f11d2e02 100755 --- a/software/SCSI2SD/src/sd.c +++ b/software/SCSI2SD/src/sd.c @@ -191,10 +191,10 @@ static void doReadSector(uint32_t numBytes) CY_SET_REG8(SDCard_TXDATA_PTR, 0xFF); // Put a byte in the FIFO CY_SET_REG8(SDCard_TXDATA_PTR, 0xFF); // Put a byte in the FIFO CY_SET_REG8(SDCard_TXDATA_PTR, 0xFF); // Put a byte in the FIFO - + i = 0; guard = 0; - + // This loop is critically important for performance. // We stream data straight from the SDCard fifos into the SCSI component // FIFO's. If the loop isn't fast enough, the transmit FIFO's will empty, @@ -207,42 +207,44 @@ static void doReadSector(uint32_t numBytes) // Read from the SPIM fifo if there is room to stream the byte to the // SCSI fifos if((sdRxStatus & SDCard_STS_RX_FIFO_NOT_EMPTY) && - (scsiDev.resetFlag || (scsiStatus & 1)) // SCSI TX FIFO NOT FULL + (scsiStatus & 1) // SCSI TX FIFO NOT FULL ) { uint8_t val = CY_GET_REG8(SDCard_RXDATA_PTR); CY_SET_REG8(scsiTarget_datapath__F0_REG, val); guard++; - } + // How many bytes are in a 4-byte FIFO ? 5. 4 FIFO bytes PLUS one byte + // being processed bit-by-bit. Artifically limit the number of bytes in the + // "combined" SPIM TX and RX FIFOS to the individual FIFO size. + // Unlike the SCSI component, SPIM doesn't check if there's room in + // the output FIFO before starting to transmit. + + if (prep < numBytes) + { + CY_SET_REG8(SDCard_TXDATA_PTR, 0xFF); // Put a byte in the FIFO + prep++; + } + + } + // Byte has been sent out the SCSI interface. - if (scsiDev.resetFlag || (scsiStatus & 2)) // SCSI RX FIFO NOT EMPTY + if (scsiStatus & 2) // SCSI RX FIFO NOT EMPTY { CY_GET_REG8(scsiTarget_datapath__F1_REG); ++i; } - - // How many bytes are in a 4-byte FIFO ? 5. 4 FIFO bytes PLUS one byte - // being processed bit-by-bit. Artifically limit the number of bytes in the - // "combined" SPIM TX and RX FIFOS to the individual FIFO size. - // Unlike the SCSI component, SPIM doesn't check if there's room in - // the output FIFO before starting to transmit. - if ((prep - guard < 4) && (prep < numBytes)) - { - CY_SET_REG8(SDCard_TXDATA_PTR, 0xFF); // Put a byte in the FIFO - prep++; - } } - // Read and discard remaining bytes. - while (i < SD_SECTOR_SIZE) + // Read and discard remaining bytes. This applis for non-512 byte sectors, + // or if a SCSI reset was triggered. + while (guard < SD_SECTOR_SIZE) { uint8_t sdRxStatus = CY_GET_REG8(SDCard_RX_STATUS_PTR); if(sdRxStatus & SDCard_STS_RX_FIFO_NOT_EMPTY) { CY_GET_REG8(SDCard_RXDATA_PTR); guard++; - i++; } if ((prep - guard < 4) && (prep < SD_SECTOR_SIZE)) @@ -430,7 +432,7 @@ static int doWriteSector(uint32_t numBytes) { uint8_t sdRxStatus = CY_GET_REG8(SDCard_RX_STATUS_PTR); - if(guard - i < 4) + if((guard - i < 4) && (guard < SD_SECTOR_SIZE)) { CY_SET_REG8(SDCard_TXDATA_PTR, 0x00); guard++; diff --git a/software/scsi2sd-config/main.c b/software/scsi2sd-config/main.c index 99d39044..11e38380 100644 --- a/software/scsi2sd-config/main.c +++ b/software/scsi2sd-config/main.c @@ -163,10 +163,11 @@ static void usage() printf("\t\trequired by the SCSI-2 standard.\n\n"); printf("--no-attention\tDisable Unit Attention responses.\n\n"); printf("--blocks={0-4294967295}\n\t\tSet a limit to the reported device size.\n"); - printf("\t\tEach block is 512 bytes. The maximum possible size is 2TB.\n"); + printf("\t\tThe size of each block/sector is set by the --sector parameter.\n"); printf("\t\tThe reported size will be the lower of this value and the SD\n"); - printf("\t\tcard size. 0 disables the limit.\n\n"); - printf("--sector={64-2048}\n\t\tSet the bytes-per-sector. Normally 512 bytes.\n"); + printf("\t\tcard size. 0 disables the limit.\n"); + printf("\t\tThe maximum possible size is 2TB.\n\n"); + printf("--sector={64-8192}\n\t\tSet the bytes-per-sector. Normally 512 bytes.\n"); printf("\t\tCan also be set with a SCSI MODE SELECT command.\n\n"); printf("--apple\t\tSet the vendor, product ID and revision fields to simulate an \n"); printf("\t\tapple-suppled disk. Provides support for the Apple Drive Setup\n"); @@ -345,7 +346,7 @@ int main(int argc, char* argv[]) { int64_t bytesPerSector = -1; if (sscanf(optarg, "%" PRId64, &bytesPerSector) == 1 && - bytesPerSector >= 64 && bytesPerSector <= 2048) + bytesPerSector >= 64 && bytesPerSector <= 8192) { packet.bytesPerSector = bytesPerSector; } diff --git a/software/scsi2sd-debug/.gitignore b/software/scsi2sd-debug/.gitignore new file mode 100644 index 00000000..567609b1 --- /dev/null +++ b/software/scsi2sd-debug/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/software/scsi2sd-debug/Makefile b/software/scsi2sd-debug/Makefile new file mode 100644 index 00000000..d286620c --- /dev/null +++ b/software/scsi2sd-debug/Makefile @@ -0,0 +1,24 @@ +all: build/scsi2sd-debug + +CFLAGS += -Wall + +UNAME_S := $(shell uname -s) +ifeq ($(UNAME_S),Linux) + HID_C = ../bootloaderhost/hidapi/linux/hid.c + LDFLAGS += -ludev +endif +ifeq ($(UNAME_S),Darwin) + # Should match OSX + HID_C = ../bootloaderhost/hidapi/mac/hid.c + LDFLAGS += -framework IOKit -framework CoreFoundation + CFLAGS += -mmacosx-version-min=10.5 -arch x86_64 -arch i386 -arch ppc -isysroot /Xcode3.1.4/SDKs/MacOSX10.5.sdk + CC=/Xcode3.1.4/usr/bin/gcc +endif + + +build/scsi2sd-debug: main.c $(HID_C) $(CYAPI) + mkdir -p $(dir $@) + $(CC) $(CFLAGS) -I ../bootloaderhost/hidapi/hidapi $^ $(LDFLAGS) -o $@ + +clean: + rm build/scsi2sd-debug diff --git a/software/scsi2sd-debug/Makefile.mingw b/software/scsi2sd-debug/Makefile.mingw new file mode 100644 index 00000000..4fae0f68 --- /dev/null +++ b/software/scsi2sd-debug/Makefile.mingw @@ -0,0 +1,19 @@ +all: build/windows/32bit/scsi2sd-debug.exe build/windows/64bit/scsi2sd-debug.exe + +CFLAGS += -Wall +LDFLAGS=-mconsole -mwindows -lsetupapi -lws2_32 + +HID_C = ../bootloaderhost/hidapi/windows/hid.c + + +build/windows/32bit/scsi2sd-debug.exe: main.c $(HID_C) + mkdir -p $(dir $@) + i686-w64-mingw32-gcc $(CFLAGS) -I ../bootloaderhost/hidapi/hidapi $^ $(LDFLAGS) -o $@ + +build/windows/64bit/scsi2sd-debug.exe: main.c $(HID_C) + mkdir -p $(dir $@) + x86_64-w64-mingw32-gcc $(CFLAGS) -I ../bootloaderhost/hidapi/hidapi $^ $(LDFLAGS) -o $@ + +clean: + rm -r build/windows + diff --git a/software/scsi2sd-debug/main.c b/software/scsi2sd-debug/main.c new file mode 100644 index 00000000..211b5542 --- /dev/null +++ b/software/scsi2sd-debug/main.c @@ -0,0 +1,137 @@ +// Copyright (C) 2014 Michael McMaster +// +// This file is part of SCSI2SD. +// +// SCSI2SD 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 3 of the License, or +// (at your option) any later version. +// +// SCSI2SD 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 SCSI2SD. If not, see . + +#include +#include +#include +#include +#include +#include +#include + +// htonl/ntohl includes. +#ifdef WIN32 +#include +#else +#include +#endif + +#include "hidapi.h" + +#define MIN(a,b) (a < b ? a : b) + +FILE* logfile = NULL; + +static void readConfig(hid_device* handle) +{ + // First byte is the report ID (0) + unsigned char buf[65]; + memset(buf, 0, sizeof(buf)); + int result = hid_read(handle, buf, sizeof(buf)); + + if (result < 0) + { + fprintf(stderr, "USB HID Read Failure: %ls\n", hid_error(handle)); + } + int i; + for (i = 0; i < 32; ++i) + { + fprintf(logfile, "%02x ", buf[i]); + } + fprintf(logfile, "\n"); + fflush(logfile); +} + +static void usage() +{ + printf("Usage: scsi2sd-debug outputfile\n"); + printf("\n"); + printf("outputfile\tPath to the output log file.\n\n"); + printf("\n\n"); + exit(1); +} + + +int main(int argc, char* argv[]) +{ + printf("SCSI2SD Debug Utility.\n"); + printf("Copyright (C) 2014 Michael McMaster \n\n"); + + if (argc != 2) + { + usage(); + exit(1); + } + + logfile = fopen(argv[1], "w"); + if (!logfile) + { + fprintf(stderr, "Could not write to file %s.\n", argv[1]); + exit(1); + } + + + uint16_t vendorId = 0x04B4; // Cypress + uint16_t productId = 0x1337; // SCSI2SD + + printf( + "USB device parameters\n\tVendor ID:\t0x%04X\n\tProduct ID:\t0x%04X\n", + vendorId, + productId); + + // Enumerate and print the HID devices on the system + struct hid_device_info *dev = hid_enumerate(vendorId, productId); + + // We need the SECOND interface for debug data + if (!dev) + { + fprintf(stderr, "ERROR: SCSI2SD USB device not found.\n"); + exit(1); + } + else if (!dev->next) + { + fprintf(stderr, "ERROR: SCSI2SD Debug firmware not enabled.\n"); + exit(1); + } + dev = dev->next; + + printf("USB Device Found\n type: %04hx %04hx\n path: %s\n serial_number: %ls", + dev->vendor_id, dev->product_id, dev->path, dev->serial_number); + printf("\n"); + printf(" Manufacturer: %ls\n", dev->manufacturer_string); + printf(" Product: %ls\n", dev->product_string); + printf("\n"); + + hid_device* handle = hid_open_path(dev->path); + if (!handle) + { + fprintf( + stderr, + "ERROR: Could not open device %s. Check permissions.\n", dev->path + ); + exit(1); + } + + + while (1) + { + readConfig(handle); + } + + return 0; +} + -- 2.38.5