From 7193c6f29b2aba6ff239395479afe4b62238924e Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Tue, 29 Oct 2013 21:48:07 +1000 Subject: [PATCH] Added the scsi2sd-config utility, and updated firmware to suit. --- STATUS | 7 +- .../Generated_Source/PSoC5/USBFS.c | 1335 ++++++++++++++++ .../Generated_Source/PSoC5/USBFS.h | 1189 +++++++++++++++ .../Generated_Source/PSoC5/USBFS_Dm.c | 137 ++ .../Generated_Source/PSoC5/USBFS_Dm.h | 130 ++ .../Generated_Source/PSoC5/USBFS_Dm_aliases.h | 32 + .../Generated_Source/PSoC5/USBFS_Dp.c | 137 ++ .../Generated_Source/PSoC5/USBFS_Dp.h | 130 ++ .../Generated_Source/PSoC5/USBFS_Dp_aliases.h | 32 + .../Generated_Source/PSoC5/USBFS_audio.c | 318 ++++ .../Generated_Source/PSoC5/USBFS_audio.h | 95 ++ .../Generated_Source/PSoC5/USBFS_boot.c | 262 ++++ .../Generated_Source/PSoC5/USBFS_cdc.c | 706 +++++++++ .../Generated_Source/PSoC5/USBFS_cdc.h | 92 ++ .../Generated_Source/PSoC5/USBFS_cdc.inf | 122 ++ .../Generated_Source/PSoC5/USBFS_cls.c | 107 ++ .../Generated_Source/PSoC5/USBFS_descr.c | 319 ++++ .../Generated_Source/PSoC5/USBFS_drv.c | 781 ++++++++++ .../Generated_Source/PSoC5/USBFS_episr.c | 658 ++++++++ .../Generated_Source/PSoC5/USBFS_hid.c | 422 ++++++ .../Generated_Source/PSoC5/USBFS_hid.h | 64 + .../Generated_Source/PSoC5/USBFS_midi.c | 1341 +++++++++++++++++ .../Generated_Source/PSoC5/USBFS_midi.h | 200 +++ .../Generated_Source/PSoC5/USBFS_pm.c | 277 ++++ .../Generated_Source/PSoC5/USBFS_pvt.h | 203 +++ .../Generated_Source/PSoC5/USBFS_std.c | 1134 ++++++++++++++ .../Generated_Source/PSoC5/USBFS_vnd.c | 96 ++ .../Generated_Source/PSoC5/cyfitter.h | 502 +++--- .../Generated_Source/PSoC5/cyfitter_cfg.c | 819 +++++----- .../Generated_Source/PSoC5/cyfittergnu.inc | 502 +++--- .../Generated_Source/PSoC5/cyfitteriar.inc | 502 +++--- .../Generated_Source/PSoC5/cyfitterrv.inc | 502 +++--- .../Generated_Source/PSoC5/project.h | 20 +- software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx | 67 +- software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit | Bin 226200 -> 228957 bytes software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj | 328 +++- software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd | 64 +- .../SCSI2SD.cydsn/TopDesign/TopDesign.cysch | Bin 132910 -> 163856 bytes software/SCSI2SD/SCSI2SD.cydsn/config.c | 149 +- software/SCSI2SD/SCSI2SD.cydsn/config.h | 2 + software/SCSI2SD/SCSI2SD.cydsn/main.c | 1 + software/SCSI2SD/SCSI2SD.cydsn/scsi.c | 13 +- .../USB_Bootloader.cyprj.Micha_000 | 2 + software/bootloaderhost/.gitignore | 1 + software/bootloaderhost/Makefile | 7 +- software/scsi2sd-config/.gitignore | 1 + software/scsi2sd-config/Makefile | 22 + software/scsi2sd-config/Makefile.mingw | 19 + software/scsi2sd-config/main.c | 364 +++++ 49 files changed, 12680 insertions(+), 1533 deletions(-) create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm_aliases.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp_aliases.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_boot.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.inf create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cls.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_descr.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_drv.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_episr.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pm.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_std.c create mode 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_vnd.c mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h create mode 100644 software/bootloaderhost/.gitignore create mode 100644 software/scsi2sd-config/.gitignore create mode 100644 software/scsi2sd-config/Makefile create mode 100644 software/scsi2sd-config/Makefile.mingw create mode 100644 software/scsi2sd-config/main.c diff --git a/STATUS b/STATUS index 03bc9647..6e099b16 100644 --- a/STATUS +++ b/STATUS @@ -1,9 +1,4 @@ -- Configuration options cannot be set via USB. Must use the USB bootloader to - load a new firmware instead. - - SCSI ID hardcoded to 0 - - Partity checking is on - - Unit Attention Condition is off - - DMA is not used for SPI transfers + - Potential for large performance improvement. - Parity checking not implemented for the PSoC Datapath implementation diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.c new file mode 100755 index 00000000..081e687e --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.c @@ -0,0 +1,1335 @@ +/******************************************************************************* +* File Name: USBFS.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.h" +#include "USBFS_pvt.h" +#include "USBFS_hid.h" +#if(USBFS_DMA1_REMOVE == 0u) + #include "USBFS_ep1_dma.h" +#endif /* End USBFS_DMA1_REMOVE */ +#if(USBFS_DMA2_REMOVE == 0u) + #include "USBFS_ep2_dma.h" +#endif /* End USBFS_DMA2_REMOVE */ +#if(USBFS_DMA3_REMOVE == 0u) + #include "USBFS_ep3_dma.h" +#endif /* End USBFS_DMA3_REMOVE */ +#if(USBFS_DMA4_REMOVE == 0u) + #include "USBFS_ep4_dma.h" +#endif /* End USBFS_DMA4_REMOVE */ +#if(USBFS_DMA5_REMOVE == 0u) + #include "USBFS_ep5_dma.h" +#endif /* End USBFS_DMA5_REMOVE */ +#if(USBFS_DMA6_REMOVE == 0u) + #include "USBFS_ep6_dma.h" +#endif /* End USBFS_DMA6_REMOVE */ +#if(USBFS_DMA7_REMOVE == 0u) + #include "USBFS_ep7_dma.h" +#endif /* End USBFS_DMA7_REMOVE */ +#if(USBFS_DMA8_REMOVE == 0u) + #include "USBFS_ep8_dma.h" +#endif /* End USBFS_DMA8_REMOVE */ + + +/*************************************** +* Global data allocation +***************************************/ + +uint8 USBFS_initVar = 0u; +#if(USBFS_EP_MM != USBFS__EP_MANUAL) + uint8 USBFS_DmaChan[USBFS_MAX_EP]; + uint8 USBFS_DmaTd[USBFS_MAX_EP]; +#endif /* End USBFS_EP_MM */ + + +/******************************************************************************* +* Function Name: USBFS_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_3V_OPERATION - Disable voltage regulator and pass-thru +* Vcc for pull-up +* USBFS_5V_OPERATION - Enable voltage regulator and use +* regulator for pull-up +* USBFS_DWR_VDDD_OPERATION - Enable or Disable voltage +* regulator depend on Vddd Voltage configuration in DWR. +* +* Return: +* None. +* +* Global variables: +* The USBFS_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_Start() is called. +* This allows for component Re-Start without unnecessary re-initialization +* in all subsequent calls to the USBFS_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_Init() and USBFS_InitComponent() as done +* in the USBFS_Start() routine. +* +* Side Effects: +* This function will reset all communication states to default. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_Start(uint8 device, uint8 mode) +{ + /* If not Initialized then initialize all required hardware and software */ + if(USBFS_initVar == 0u) + { + USBFS_Init(); + USBFS_initVar = 1u; + } + USBFS_InitComponent(device, mode); +} + + +/******************************************************************************* +* Function Name: USBFS_Init +******************************************************************************** +* +* Summary: +* Initialize component's hardware. Usually called in USBFS_Start(). +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_Init(void) +{ + uint8 enableInterrupts; + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + uint16 i; + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + enableInterrupts = CyEnterCriticalSection(); + + /* Enable USB block */ + USBFS_PM_ACT_CFG_REG |= USBFS_PM_ACT_EN_FSUSB; + /* Enable USB block for Standby Power Mode */ + USBFS_PM_STBY_CFG_REG |= USBFS_PM_STBY_EN_FSUSB; + + /* Enable core clock */ + USBFS_USB_CLK_EN_REG = USBFS_USB_CLK_ENABLE; + + USBFS_CR1_REG = USBFS_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_USBIO_CR0_REG &= ((uint8)(~USBFS_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_PM_USB_CR0_REG &= ((uint8)(~(USBFS_PM_USB_CR0_PD_N | + USBFS_PM_USB_CR0_PD_PULLUP_N))); + + /* Select iomode to USB mode*/ + USBFS_USBIO_CR1_REG &= ((uint8)(~USBFS_USBIO_CR1_IOMODE)); + + /* Enable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/ + USBFS_PM_USB_CR0_REG |= USBFS_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_DM_INP_DIS_REG &= ((uint8)(~USBFS_DM_MASK)); + USBFS_DP_INP_DIS_REG &= ((uint8)(~USBFS_DP_MASK)); + + /* Enable USBIO */ + USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_PD_N; + CyDelayUs(2u); + /* Set the USBIO pull-up enable */ + USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_PD_PULLUP_N; + + /* Write WAx */ + CY_SET_REG8(USBFS_ARB_RW1_WA_PTR, 0u); + CY_SET_REG8(USBFS_ARB_RW1_WA_MSB_PTR, 0u); + + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + /* Init transfer descriptor. This will be used to detect the DMA state - initialized or not. */ + for (i = 0u; i < USBFS_MAX_EP; i++) + { + USBFS_DmaTd[i] = DMA_INVALID_TD; + } + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + CyExitCriticalSection(enableInterrupts); + + + /* Set the bus reset Interrupt. */ + (void) CyIntSetVector(USBFS_BUS_RESET_VECT_NUM, &USBFS_BUS_RESET_ISR); + CyIntSetPriority(USBFS_BUS_RESET_VECT_NUM, USBFS_BUS_RESET_PRIOR); + + /* Set the SOF Interrupt. */ + #if(USBFS_SOF_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_SOF_VECT_NUM, &USBFS_SOF_ISR); + CyIntSetPriority(USBFS_SOF_VECT_NUM, USBFS_SOF_PRIOR); + #endif /* End USBFS_SOF_ISR_REMOVE */ + + /* Set the Control Endpoint Interrupt. */ + (void) CyIntSetVector(USBFS_EP_0_VECT_NUM, &USBFS_EP_0_ISR); + CyIntSetPriority(USBFS_EP_0_VECT_NUM, USBFS_EP_0_PRIOR); + + /* Set the Data Endpoint 1 Interrupt. */ + #if(USBFS_EP1_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_1_VECT_NUM, &USBFS_EP_1_ISR); + CyIntSetPriority(USBFS_EP_1_VECT_NUM, USBFS_EP_1_PRIOR); + #endif /* End USBFS_EP1_ISR_REMOVE */ + + /* Set the Data Endpoint 2 Interrupt. */ + #if(USBFS_EP2_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_2_VECT_NUM, &USBFS_EP_2_ISR); + CyIntSetPriority(USBFS_EP_2_VECT_NUM, USBFS_EP_2_PRIOR); + #endif /* End USBFS_EP2_ISR_REMOVE */ + + /* Set the Data Endpoint 3 Interrupt. */ + #if(USBFS_EP3_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_3_VECT_NUM, &USBFS_EP_3_ISR); + CyIntSetPriority(USBFS_EP_3_VECT_NUM, USBFS_EP_3_PRIOR); + #endif /* End USBFS_EP3_ISR_REMOVE */ + + /* Set the Data Endpoint 4 Interrupt. */ + #if(USBFS_EP4_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_4_VECT_NUM, &USBFS_EP_4_ISR); + CyIntSetPriority(USBFS_EP_4_VECT_NUM, USBFS_EP_4_PRIOR); + #endif /* End USBFS_EP4_ISR_REMOVE */ + + /* Set the Data Endpoint 5 Interrupt. */ + #if(USBFS_EP5_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_5_VECT_NUM, &USBFS_EP_5_ISR); + CyIntSetPriority(USBFS_EP_5_VECT_NUM, USBFS_EP_5_PRIOR); + #endif /* End USBFS_EP5_ISR_REMOVE */ + + /* Set the Data Endpoint 6 Interrupt. */ + #if(USBFS_EP6_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_6_VECT_NUM, &USBFS_EP_6_ISR); + CyIntSetPriority(USBFS_EP_6_VECT_NUM, USBFS_EP_6_PRIOR); + #endif /* End USBFS_EP6_ISR_REMOVE */ + + /* Set the Data Endpoint 7 Interrupt. */ + #if(USBFS_EP7_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_7_VECT_NUM, &USBFS_EP_7_ISR); + CyIntSetPriority(USBFS_EP_7_VECT_NUM, USBFS_EP_7_PRIOR); + #endif /* End USBFS_EP7_ISR_REMOVE */ + + /* Set the Data Endpoint 8 Interrupt. */ + #if(USBFS_EP8_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_EP_8_VECT_NUM, &USBFS_EP_8_ISR); + CyIntSetPriority(USBFS_EP_8_VECT_NUM, USBFS_EP_8_PRIOR); + #endif /* End USBFS_EP8_ISR_REMOVE */ + + #if((USBFS_EP_MM != USBFS__EP_MANUAL) && (USBFS_ARB_ISR_REMOVE == 0u)) + /* Set the ARB Interrupt. */ + (void) CyIntSetVector(USBFS_ARB_VECT_NUM, &USBFS_ARB_ISR); + CyIntSetPriority(USBFS_ARB_VECT_NUM, USBFS_ARB_PRIOR); + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + +} + + +/******************************************************************************* +* Function Name: USBFS_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_3V_OPERATION - Disable voltage regulator and pass-thru +* Vcc for pull-up +* USBFS_5V_OPERATION - Enable voltage regulator and use +* regulator for pull-up +* USBFS_DWR_VDDD_OPERATION - Enable or Disable voltage +* regulator depend on Vddd Voltage configuration in DWR. +* +* Return: +* None. +* +* Global variables: +* USBFS_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_transferState: This variable used by the communication +* functions to handle current transfer state. Initialized to +* TRANS_STATE_IDLE in this API. +* USBFS_configuration: Contains current configuration number +* which is set by the Host using SET_CONFIGURATION request. +* Initialized to zero in this API. +* USBFS_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_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_lastPacketSize initialized to 0; +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_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_ENABLE_HID_CLASS) + uint8 i; + + for (i = 0u; i < USBFS_MAX_INTERFACES_NUMBER; i++) + { + USBFS_hidProtocol[i] = USBFS_PROTOCOL_REPORT; + } + #endif /* USBFS_ENABLE_HID_CLASS */ + + /* Enable Interrupts. */ + CyIntEnable(USBFS_BUS_RESET_VECT_NUM); + CyIntEnable(USBFS_EP_0_VECT_NUM); + #if(USBFS_EP1_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_1_VECT_NUM); + #endif /* End USBFS_EP1_ISR_REMOVE */ + #if(USBFS_EP2_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_2_VECT_NUM); + #endif /* End USBFS_EP2_ISR_REMOVE */ + #if(USBFS_EP3_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_3_VECT_NUM); + #endif /* End USBFS_EP3_ISR_REMOVE */ + #if(USBFS_EP4_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_4_VECT_NUM); + #endif /* End USBFS_EP4_ISR_REMOVE */ + #if(USBFS_EP5_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_5_VECT_NUM); + #endif /* End USBFS_EP5_ISR_REMOVE */ + #if(USBFS_EP6_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_6_VECT_NUM); + #endif /* End USBFS_EP6_ISR_REMOVE */ + #if(USBFS_EP7_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_7_VECT_NUM); + #endif /* End USBFS_EP7_ISR_REMOVE */ + #if(USBFS_EP8_ISR_REMOVE == 0u) + CyIntEnable(USBFS_EP_8_VECT_NUM); + #endif /* End USBFS_EP8_ISR_REMOVE */ + #if((USBFS_EP_MM != USBFS__EP_MANUAL) && (USBFS_ARB_ISR_REMOVE == 0u)) + /* usb arb interrupt enable */ + USBFS_ARB_INT_EN_REG = USBFS_ARB_INT_MASK; + CyIntEnable(USBFS_ARB_VECT_NUM); + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + /* Arbiter configuration for DMA transfers */ + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + + #if(USBFS_EP_MM == USBFS__EP_DMAMANUAL) + USBFS_ARB_CFG_REG = USBFS_ARB_CFG_MANUAL_DMA; + #endif /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */ + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + /*Set cfg cmplt this rises DMA request when the full configuration is done */ + USBFS_ARB_CFG_REG = USBFS_ARB_CFG_AUTO_DMA | USBFS_ARB_CFG_AUTO_MEM; + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + USBFS_transferState = USBFS_TRANS_STATE_IDLE; + + /* USB Locking: Enabled, VRegulator: depend on mode or DWR Voltage configuration*/ + switch(mode) + { + case USBFS_3V_OPERATION: + USBFS_CR1_REG = USBFS_CR1_ENABLE_LOCK; + break; + case USBFS_5V_OPERATION: + USBFS_CR1_REG = USBFS_CR1_ENABLE_LOCK | USBFS_CR1_REG_ENABLE; + break; + default: /*USBFS_DWR_VDDD_OPERATION */ + #if(USBFS_VDDD_MV < USBFS_3500MV) + USBFS_CR1_REG = USBFS_CR1_ENABLE_LOCK; + #else + USBFS_CR1_REG = USBFS_CR1_ENABLE_LOCK | USBFS_CR1_REG_ENABLE; + #endif /* End USBFS_VDDD_MV < USBFS_3500MV */ + break; + } + + /* Record the descriptor selection */ + USBFS_device = device; + + /* Clear all of the component data */ + USBFS_configuration = 0u; + USBFS_interfaceNumber = 0u; + USBFS_configurationChanged = 0u; + USBFS_deviceAddress = 0u; + USBFS_deviceStatus = 0u; + + USBFS_lastPacketSize = 0u; + + /* ACK Setup, Stall IN/OUT */ + CY_SET_REG8(USBFS_EP0_CR_PTR, USBFS_MODE_STALL_IN_OUT); + + /* Enable the SIE with an address 0 */ + CY_SET_REG8(USBFS_CR0_PTR, USBFS_CR0_ENABLE); + + /* Workaround for PSOC5LP */ + CyDelayCycles(1u); + + /* Finally, Enable d+ pullup and select iomode to USB mode*/ + CY_SET_REG8(USBFS_USBIO_CR1_PTR, USBFS_USBIO_CR1_USBPUEN); +} + + +/******************************************************************************* +* Function Name: USBFS_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_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_transferState: This variable used by the communication +* functions to handle current transfer state. Initialized to +* TRANS_STATE_IDLE in this API. +* USBFS_configuration: Contains current configuration number +* which is set by the Host using SET_CONFIGURATION request. +* Initialized to zero in this API. +* USBFS_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_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_lastPacketSize initialized to 0; +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_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_ENABLE_HID_CLASS) + uint8 i; + + for (i = 0u; i < USBFS_MAX_INTERFACES_NUMBER; i++) + { + USBFS_hidProtocol[i] = USBFS_PROTOCOL_REPORT; + } + #endif /* USBFS_ENABLE_HID_CLASS */ + + USBFS_transferState = USBFS_TRANS_STATE_IDLE; + + /* Clear all of the component data */ + USBFS_configuration = 0u; + USBFS_interfaceNumber = 0u; + USBFS_configurationChanged = 0u; + USBFS_deviceAddress = 0u; + USBFS_deviceStatus = 0u; + + USBFS_lastPacketSize = 0u; + + + /* ACK Setup, Stall IN/OUT */ + CY_SET_REG8(USBFS_EP0_CR_PTR, USBFS_MODE_STALL_IN_OUT); + + /* Enable the SIE with an address 0 */ + CY_SET_REG8(USBFS_CR0_PTR, USBFS_CR0_ENABLE); + +} + + +/******************************************************************************* +* Function Name: USBFS_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_configuration: Contains current configuration number +* which is set by the Host using SET_CONFIGURATION request. +* Initialized to zero in this API. +* USBFS_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_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_configurationChanged: This variable is set to one after +* SET_CONFIGURATION request and cleared in this function. +* USBFS_intiVar variable is set to zero +* +*******************************************************************************/ +void USBFS_Stop(void) +{ + + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + USBFS_Stop_DMA(USBFS_MAX_EP); /* Stop all DMAs */ + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + /* Disable the SIE */ + USBFS_CR0_REG &= (uint8)(~USBFS_CR0_ENABLE); + /* Disable the d+ pullup */ + USBFS_USBIO_CR1_REG &= (uint8)(~USBFS_USBIO_CR1_USBPUEN); + /* Disable USB in ACT PM */ + USBFS_PM_ACT_CFG_REG &= (uint8)(~USBFS_PM_ACT_EN_FSUSB); + /* Disable USB block for Standby Power Mode */ + USBFS_PM_STBY_CFG_REG &= (uint8)(~USBFS_PM_STBY_EN_FSUSB); + + /* Disable the reset and EP interrupts */ + CyIntDisable(USBFS_BUS_RESET_VECT_NUM); + CyIntDisable(USBFS_EP_0_VECT_NUM); + #if(USBFS_EP1_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_1_VECT_NUM); + #endif /* End USBFS_EP1_ISR_REMOVE */ + #if(USBFS_EP2_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_2_VECT_NUM); + #endif /* End USBFS_EP2_ISR_REMOVE */ + #if(USBFS_EP3_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_3_VECT_NUM); + #endif /* End USBFS_EP3_ISR_REMOVE */ + #if(USBFS_EP4_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_4_VECT_NUM); + #endif /* End USBFS_EP4_ISR_REMOVE */ + #if(USBFS_EP5_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_5_VECT_NUM); + #endif /* End USBFS_EP5_ISR_REMOVE */ + #if(USBFS_EP6_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_6_VECT_NUM); + #endif /* End USBFS_EP6_ISR_REMOVE */ + #if(USBFS_EP7_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_7_VECT_NUM); + #endif /* End USBFS_EP7_ISR_REMOVE */ + #if(USBFS_EP8_ISR_REMOVE == 0u) + CyIntDisable(USBFS_EP_8_VECT_NUM); + #endif /* End USBFS_EP8_ISR_REMOVE */ + + /* Clear all of the component data */ + USBFS_configuration = 0u; + USBFS_interfaceNumber = 0u; + USBFS_configurationChanged = 0u; + USBFS_deviceAddress = 0u; + USBFS_deviceStatus = 0u; + USBFS_initVar = 0u; + +} + + +/******************************************************************************* +* Function Name: USBFS_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_CheckActivity(void) +{ + uint8 r; + + r = CY_GET_REG8(USBFS_CR1_PTR); + CY_SET_REG8(USBFS_CR1_PTR, (r & ((uint8)(~USBFS_CR1_BUS_ACTIVITY)))); + + return((r & USBFS_CR1_BUS_ACTIVITY) >> USBFS_CR1_BUS_ACTIVITY_SHIFT); +} + + +/******************************************************************************* +* Function Name: USBFS_GetConfiguration +******************************************************************************** +* +* Summary: +* Returns the current configuration setting +* +* Parameters: +* None. +* +* Return: +* configuration. +* +*******************************************************************************/ +uint8 USBFS_GetConfiguration(void) +{ + return(USBFS_configuration); +} + + +/******************************************************************************* +* Function Name: USBFS_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_configurationChanged: This variable is set to one after +* SET_CONFIGURATION request and cleared in this function. +* +*******************************************************************************/ +uint8 USBFS_IsConfigurationChanged(void) +{ + uint8 res = 0u; + + if(USBFS_configurationChanged != 0u) + { + res = USBFS_configurationChanged; + USBFS_configurationChanged = 0u; + } + + return(res); +} + + +/******************************************************************************* +* Function Name: USBFS_GetInterfaceSetting +******************************************************************************** +* +* Summary: +* Returns the alternate setting from current interface +* +* Parameters: +* uint8 interfaceNumber, interface number +* +* Return: +* Alternate setting. +* +*******************************************************************************/ +uint8 USBFS_GetInterfaceSetting(uint8 interfaceNumber) + +{ + return(USBFS_interfaceSetting[interfaceNumber]); +} + + +/******************************************************************************* +* Function Name: USBFS_GetEPState +******************************************************************************** +* +* Summary: +* Returned the state of the requested endpoint. +* +* Parameters: +* epNumber: Endpoint Number +* +* Return: +* State of the requested endpoint. +* +*******************************************************************************/ +uint8 USBFS_GetEPState(uint8 epNumber) +{ + return(USBFS_EP[epNumber].apiEpState); +} + + +/******************************************************************************* +* Function Name: USBFS_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_GetEPCount(uint8 epNumber) +{ + uint8 ri; + uint16 result = 0u; + + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP)) + { + ri = ((epNumber - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + + result = (uint8)(CY_GET_REG8((reg8 *)(USBFS_SIE_EP1_CNT0_IND + ri)) & + USBFS_EPX_CNT0_MASK); + result = (result << 8u) | CY_GET_REG8((reg8 *)(USBFS_SIE_EP1_CNT1_IND + ri)); + result -= USBFS_EPX_CNTX_CRC_COUNT; + } + return(result); +} + + +#if(USBFS_EP_MM != USBFS__EP_MANUAL) + + + /******************************************************************************* + * Function Name: USBFS_InitEP_DMA + ******************************************************************************** + * + * Summary: + * This function allocates and initializes a DMA channel to be used by the + * USBFS_LoadInEP() or USBFS_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_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_EP[epNumber].addr & USBFS_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_EP1: + #if(USBFS_DMA1_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep1_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA1_REMOVE */ + break; + case USBFS_EP2: + #if(USBFS_DMA2_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep2_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA2_REMOVE */ + break; + case USBFS_EP3: + #if(USBFS_DMA3_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep3_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA3_REMOVE */ + break; + case USBFS_EP4: + #if(USBFS_DMA4_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep4_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA4_REMOVE */ + break; + case USBFS_EP5: + #if(USBFS_DMA5_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep5_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA5_REMOVE */ + break; + case USBFS_EP6: + #if(USBFS_DMA6_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep6_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA6_REMOVE */ + break; + case USBFS_EP7: + #if(USBFS_DMA7_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep7_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA7_REMOVE */ + break; + case USBFS_EP8: + #if(USBFS_DMA8_REMOVE == 0u) + USBFS_DmaChan[epNumber] = USBFS_ep8_DmaInitialize( + USBFS_DMA_BYTES_PER_BURST, USBFS_DMA_REQUEST_PER_BURST, src, dst); + #endif /* End USBFS_DMA8_REMOVE */ + break; + default: + /* Do not support EP0 DMA transfers */ + break; + } + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP)) + { + USBFS_DmaTd[epNumber] = CyDmaTdAllocate(); + } + } + + + /******************************************************************************* + * Function Name: USBFS_Stop_DMA + ******************************************************************************** + * + * Summary: Stops and free DMA + * + * Parameters: + * epNumber: Contains the data endpoint number or + * USBFS_MAX_EP to stop all DMAs + * + * Return: + * None. + * + * Reentrant: + * No. + * + *******************************************************************************/ + void USBFS_Stop_DMA(uint8 epNumber) + { + uint8 i; + i = (epNumber < USBFS_MAX_EP) ? epNumber : USBFS_EP1; + do + { + if(USBFS_DmaTd[i] != DMA_INVALID_TD) + { + (void) CyDmaChDisable(USBFS_DmaChan[i]); + CyDmaTdFree(USBFS_DmaTd[i]); + USBFS_DmaTd[i] = DMA_INVALID_TD; + } + i++; + }while((i < USBFS_MAX_EP) && (epNumber == USBFS_MAX_EP)); + } + +#endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + +/******************************************************************************* +* Function Name: USBFS_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_LoadInEP(uint8 epNumber, const uint8 pData[], uint16 length) + +{ + uint8 ri; + reg8 *p; + #if(USBFS_EP_MM == USBFS__EP_MANUAL) + uint16 i; + #endif /* End USBFS_EP_MM == USBFS__EP_MANUAL */ + + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP)) + { + ri = ((epNumber - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + p = (reg8 *)(USBFS_ARB_RW1_DR_IND + ri); + + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + /* Limits length to available buffer space, auto MM could send packets up to 1024 bytes */ + if(length > (USBFS_EPX_DATA_BUF_MAX - USBFS_EP[epNumber].buffOffset)) + { + length = USBFS_EPX_DATA_BUF_MAX - USBFS_EP[epNumber].buffOffset; + } + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO */ + + /* Set the count and data toggle */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT0_IND + ri), + (length >> 8u) | (USBFS_EP[epNumber].epToggle)); + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT1_IND + ri), length & 0xFFu); + + #if(USBFS_EP_MM == USBFS__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_EP[epNumber].apiEpState = USBFS_NO_EVENT_PENDING; + /* Write the Mode register */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_EP[epNumber].epMode); + #else + /* Init DMA if it was not initialized */ + if(USBFS_DmaTd[epNumber] == DMA_INVALID_TD) + { + USBFS_InitEP_DMA(epNumber, pData); + } + #endif /* End USBFS_EP_MM == USBFS__EP_MANUAL */ + + #if(USBFS_EP_MM == USBFS__EP_DMAMANUAL) + USBFS_EP[epNumber].apiEpState = USBFS_NO_EVENT_PENDING; + if((pData != NULL) && (length > 0u)) + { + /* Enable DMA in mode2 for transferring data */ + (void) CyDmaChDisable(USBFS_DmaChan[epNumber]); + (void) CyDmaTdSetConfiguration(USBFS_DmaTd[epNumber], length, CY_DMA_DISABLE_TD, + TD_TERMIN_EN | TD_INC_SRC_ADR); + (void) CyDmaTdSetAddress(USBFS_DmaTd[epNumber], LO16((uint32)pData), LO16((uint32)p)); + /* Enable the DMA */ + (void) CyDmaChSetInitialTd(USBFS_DmaChan[epNumber], USBFS_DmaTd[epNumber]); + (void) CyDmaChEnable(USBFS_DmaChan[epNumber], 1u); + /* Generate DMA request */ + * (reg8 *)(USBFS_ARB_EP1_CFG_IND + ri) |= USBFS_ARB_EPX_CFG_DMA_REQ; + * (reg8 *)(USBFS_ARB_EP1_CFG_IND + ri) &= ((uint8)(~USBFS_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_SIE_EP1_CR0_IND + ri), USBFS_EP[epNumber].epMode); + } + #endif /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */ + + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + if(pData != NULL) + { + /* Enable DMA in mode3 for transferring data */ + (void) CyDmaChDisable(USBFS_DmaChan[epNumber]); + (void) CyDmaTdSetConfiguration(USBFS_DmaTd[epNumber], length, + USBFS_DmaTd[epNumber], TD_TERMIN_EN | TD_INC_SRC_ADR); + (void) CyDmaTdSetAddress(USBFS_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_DmaChan[epNumber]); + /* Enable the DMA */ + (void) CyDmaChSetInitialTd(USBFS_DmaChan[epNumber], USBFS_DmaTd[epNumber]); + (void) CyDmaChEnable(USBFS_DmaChan[epNumber], 1u); + } + else + { + USBFS_EP[epNumber].apiEpState = USBFS_NO_EVENT_PENDING; + if(length > 0u) + { + /* Set Data ready status, This will generate DMA request */ + * (reg8 *)(USBFS_ARB_EP1_CFG_IND + ri) |= USBFS_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_SIE_EP1_CR0_IND + ri), USBFS_EP[epNumber].epMode); + } + } + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + + } +} + + +/******************************************************************************* +* Function Name: USBFS_ReadOutEP +******************************************************************************** +* +* Summary: +* Read data from an endpoint. The application must call +* USBFS_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_ReadOutEP(uint8 epNumber, uint8 pData[], uint16 length) + +{ + uint8 ri; + reg8 *p; + #if(USBFS_EP_MM == USBFS__EP_MANUAL) + uint16 i; + #endif /* End USBFS_EP_MM == USBFS__EP_MANUAL */ + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + uint16 xferCount; + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO */ + + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP) && (pData != NULL)) + { + ri = ((epNumber - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + p = (reg8 *)(USBFS_ARB_RW1_DR_IND + ri); + + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + /* Determine which is smaller the requested data or the available data */ + xferCount = USBFS_GetEPCount(epNumber); + if (length > xferCount) + { + length = xferCount; + } + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO */ + + #if(USBFS_EP_MM == USBFS__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_EnableOutEP(epNumber); + #else + /*Init DMA if it was not initialized */ + if(USBFS_DmaTd[epNumber] == DMA_INVALID_TD) + { + USBFS_InitEP_DMA(epNumber, pData); + } + #endif /* End USBFS_EP_MM == USBFS__EP_MANUAL */ + + #if(USBFS_EP_MM == USBFS__EP_DMAMANUAL) + /* Enable DMA in mode2 for transferring data */ + (void) CyDmaChDisable(USBFS_DmaChan[epNumber]); + (void) CyDmaTdSetConfiguration(USBFS_DmaTd[epNumber], length, CY_DMA_DISABLE_TD, + TD_TERMIN_EN | TD_INC_DST_ADR); + (void) CyDmaTdSetAddress(USBFS_DmaTd[epNumber], LO16((uint32)p), LO16((uint32)pData)); + /* Enable the DMA */ + (void) CyDmaChSetInitialTd(USBFS_DmaChan[epNumber], USBFS_DmaTd[epNumber]); + (void) CyDmaChEnable(USBFS_DmaChan[epNumber], 1u); + + /* Generate DMA request */ + * (reg8 *)(USBFS_ARB_EP1_CFG_IND + ri) |= USBFS_ARB_EPX_CFG_DMA_REQ; + * (reg8 *)(USBFS_ARB_EP1_CFG_IND + ri) &= ((uint8)(~USBFS_ARB_EPX_CFG_DMA_REQ)); + /* Out EP will be (re)armed in arb ISR after transfer complete */ + #endif /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */ + + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + /* Enable DMA in mode3 for transferring data */ + (void) CyDmaChDisable(USBFS_DmaChan[epNumber]); + (void) CyDmaTdSetConfiguration(USBFS_DmaTd[epNumber], length, USBFS_DmaTd[epNumber], + TD_TERMIN_EN | TD_INC_DST_ADR); + (void) CyDmaTdSetAddress(USBFS_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_DmaChan[epNumber]); + /* Enable the DMA */ + (void) CyDmaChSetInitialTd(USBFS_DmaChan[epNumber], USBFS_DmaTd[epNumber]); + (void) CyDmaChEnable(USBFS_DmaChan[epNumber], 1u); + /* Out EP will be (re)armed in arb ISR after transfer complete */ + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + + } + else + { + length = 0u; + } + + return(length); +} + + +/******************************************************************************* +* Function Name: USBFS_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_EP[epNumber].apiEpState - set to NO_EVENT_PENDING +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_EnableOutEP(uint8 epNumber) +{ + uint8 ri; + + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP)) + { + ri = ((epNumber - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + USBFS_EP[epNumber].apiEpState = USBFS_NO_EVENT_PENDING; + /* Write the Mode register */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_EP[epNumber].epMode); + } +} + + +/******************************************************************************* +* Function Name: USBFS_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_DisableOutEP(uint8 epNumber) +{ + uint8 ri ; + + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP)) + { + ri = ((epNumber - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + /* Write the Mode register */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_NAK_OUT); + } +} + + +/******************************************************************************* +* Function Name: USBFS_Force +******************************************************************************** +* +* Summary: +* Forces the bus state +* +* Parameters: +* bState +* USBFS_FORCE_J +* USBFS_FORCE_K +* USBFS_FORCE_SE0 +* USBFS_FORCE_NONE +* +* Return: +* None. +* +*******************************************************************************/ +void USBFS_Force(uint8 bState) +{ + CY_SET_REG8(USBFS_USBIO_CR0_PTR, bState); +} + + +/******************************************************************************* +* Function Name: USBFS_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_GetEPAckState(uint8 epNumber) +{ + uint8 ri; + uint8 cr = 0u; + + if((epNumber > USBFS_EP0) && (epNumber < USBFS_MAX_EP)) + { + ri = ((epNumber - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + cr = CY_GET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri)) & USBFS_MODE_ACKD; + } + + return(cr); +} + + +/******************************************************************************* +* Function Name: USBFS_SetPowerStatus +******************************************************************************** +* +* Summary: +* Sets the device power status for reporting in the Get Device Status +* request +* +* Parameters: +* powerStatus: USBFS_DEVICE_STATUS_BUS_POWERED(0) - Bus Powered, +* USBFS_DEVICE_STATUS_SELF_POWERED(1) - Self Powered +* +* Return: +* None. +* +* Global variables: +* USBFS_deviceStatus - set power status +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_SetPowerStatus(uint8 powerStatus) +{ + if (powerStatus != USBFS_DEVICE_STATUS_BUS_POWERED) + { + USBFS_deviceStatus |= USBFS_DEVICE_STATUS_SELF_POWERED; + } + else + { + USBFS_deviceStatus &= ((uint8)(~USBFS_DEVICE_STATUS_SELF_POWERED)); + } +} + + +#if (USBFS_MON_VBUS == 1u) + + /******************************************************************************* + * Function Name: USBFS_VBusPresent + ******************************************************************************** + * + * Summary: + * Determines VBUS presence for Self Powered Devices. + * + * Parameters: + * None. + * + * Return: + * 1 if VBUS is present, otherwise 0. + * + *******************************************************************************/ + uint8 USBFS_VBusPresent(void) + { + return((0u != (CY_GET_REG8(USBFS_VBUS_PS_PTR) & USBFS_VBUS_MASK)) ? 1u : 0u); + } + +#endif /* USBFS_MON_VBUS */ + + +/******************************************************************************* +* Function Name: USBFS_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_deviceStatus - checked to determine remote status +* +*******************************************************************************/ +uint8 USBFS_RWUEnabled(void) +{ + uint8 result = USBFS_FALSE; + if((USBFS_deviceStatus & USBFS_DEVICE_STATUS_REMOTE_WAKEUP) != 0u) + { + result = USBFS_TRUE; + } + + return(result); +} + + +/* [] 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 new file mode 100755 index 00000000..e7fd8992 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS.h @@ -0,0 +1,1189 @@ +/******************************************************************************* +* File Name: USBFS.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_H) +#define CY_USBFS_USBFS_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_CODE CYCODE +#define USBFS_FAR CYFAR +#if defined(__C51__) || defined(__CX51__) + #define USBFS_DATA data + #define USBFS_XDATA xdata +#else + #define USBFS_DATA + #define USBFS_XDATA +#endif /* End __C51__ */ +#define USBFS_NULL NULL + + +/*************************************** +* Enumerated Types and Parameters +***************************************/ + +#define USBFS__EP_MANUAL 0 +#define USBFS__EP_DMAMANUAL 1 +#define USBFS__EP_DMAAUTO 2 + +#define USBFS__MA_STATIC 0 +#define USBFS__MA_DYNAMIC 1 + + + +/*************************************** +* Initial Parameter Constants +***************************************/ + +#define USBFS_NUM_DEVICES (1u) +#define USBFS_ENABLE_DESCRIPTOR_STRINGS +#define USBFS_ENABLE_SN_STRING +#define USBFS_ENABLE_STRINGS +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF_SIZE (65u) +#define USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_NUM_IN_RPTS (1u) +#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_ENABLE_HID_CLASS +#define USBFS_HID_RPT_1_SIZE_LSB (0x24u) +#define USBFS_HID_RPT_1_SIZE_MSB (0x00u) +#define USBFS_MAX_REPORTID_NUMBER (0u) + +#define USBFS_MON_VBUS (0u) +#define USBFS_EXTERN_VBUS (0u) +#define USBFS_EXTERN_VND (0u) +#define USBFS_EXTERN_CLS (0u) +#define USBFS_MAX_INTERFACES_NUMBER (1u) +#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_EP5_ISR_REMOVE (1u) +#define USBFS_EP6_ISR_REMOVE (1u) +#define USBFS_EP7_ISR_REMOVE (1u) +#define USBFS_EP8_ISR_REMOVE (1u) +#define USBFS_EP_MM (0u) +#define USBFS_EP_MA (0u) +#define USBFS_DMA1_REMOVE (1u) +#define USBFS_DMA2_REMOVE (1u) +#define USBFS_DMA3_REMOVE (1u) +#define USBFS_DMA4_REMOVE (1u) +#define USBFS_DMA5_REMOVE (1u) +#define USBFS_DMA6_REMOVE (1u) +#define USBFS_DMA7_REMOVE (1u) +#define USBFS_DMA8_REMOVE (1u) +#define USBFS_SOF_ISR_REMOVE (0u) +#define USBFS_ARB_ISR_REMOVE (0u) +#define USBFS_DP_ISR_REMOVE (0u) +#define USBFS_ENABLE_CDC_CLASS_API (1u) +#define USBFS_ENABLE_MIDI_API (1u) +#define USBFS_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_EP_CTL_BLOCK; + +typedef struct +{ + uint8 interface; + uint8 altSetting; + uint8 addr; + uint8 attributes; + uint16 bufferSize; + uint8 bMisc; +} T_USBFS_EP_SETTINGS_BLOCK; + +typedef struct +{ + uint8 status; + uint16 length; +} T_USBFS_XFER_STATUS_BLOCK; + +typedef struct +{ + uint16 count; + volatile uint8 *pData; + T_USBFS_XFER_STATUS_BLOCK *pStatusBlock; +} T_USBFS_TD; + + +typedef struct +{ + uint8 c; + const void *p_list; +} T_USBFS_LUT; + +/* Resume/Suspend API Support */ +typedef struct +{ + uint8 enableState; + uint8 mode; +} USBFS_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_currentTD + + +/*************************************** +* Function Prototypes +***************************************/ + +void USBFS_Start(uint8 device, uint8 mode) ; +void USBFS_Init(void) ; +void USBFS_InitComponent(uint8 device, uint8 mode) ; +void USBFS_Stop(void) ; +uint8 USBFS_CheckActivity(void) ; +uint8 USBFS_GetConfiguration(void) ; +uint8 USBFS_IsConfigurationChanged(void) ; +uint8 USBFS_GetInterfaceSetting(uint8 interfaceNumber) + ; +uint8 USBFS_GetEPState(uint8 epNumber) ; +uint16 USBFS_GetEPCount(uint8 epNumber) ; +void USBFS_LoadInEP(uint8 epNumber, const uint8 pData[], uint16 length) + ; +uint16 USBFS_ReadOutEP(uint8 epNumber, uint8 pData[], uint16 length) + ; +void USBFS_EnableOutEP(uint8 epNumber) ; +void USBFS_DisableOutEP(uint8 epNumber) ; +void USBFS_Force(uint8 bState) ; +uint8 USBFS_GetEPAckState(uint8 epNumber) ; +void USBFS_SetPowerStatus(uint8 powerStatus) ; +uint8 USBFS_RWUEnabled(void) ; +void USBFS_TerminateEP(uint8 ep) ; + +void USBFS_Suspend(void) ; +void USBFS_Resume(void) ; + +#if defined(USBFS_ENABLE_FWSN_STRING) + void USBFS_SerialNumString(uint8 snString[]) ; +#endif /* USBFS_ENABLE_FWSN_STRING */ +#if (USBFS_MON_VBUS == 1u) + uint8 USBFS_VBusPresent(void) ; +#endif /* End USBFS_MON_VBUS */ + +#if defined(CYDEV_BOOTLOADER_IO_COMP) && ((CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS) || \ + (CYDEV_BOOTLOADER_IO_COMP == CyBtldr_Custom_Interface)) + + void USBFS_CyBtldrCommStart(void) ; + void USBFS_CyBtldrCommStop(void) ; + void USBFS_CyBtldrCommReset(void) ; + cystatus USBFS_CyBtldrCommWrite(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL + ; + cystatus USBFS_CyBtldrCommRead( uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL + ; + + #define USBFS_BTLDR_SIZEOF_WRITE_BUFFER (64u) /* EP 1 OUT */ + #define USBFS_BTLDR_SIZEOF_READ_BUFFER (64u) /* EP 2 IN */ + #define USBFS_BTLDR_MAX_PACKET_SIZE USBFS_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) + #define CyBtldrCommStart USBFS_CyBtldrCommStart + #define CyBtldrCommStop USBFS_CyBtldrCommStop + #define CyBtldrCommReset USBFS_CyBtldrCommReset + #define CyBtldrCommWrite USBFS_CyBtldrCommWrite + #define CyBtldrCommRead USBFS_CyBtldrCommRead + #endif /*End CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS */ + +#endif /* End CYDEV_BOOTLOADER_IO_COMP */ + +#if(USBFS_EP_MM != USBFS__EP_MANUAL) + void USBFS_InitEP_DMA(uint8 epNumber, const uint8 *pData) + ; + void USBFS_Stop_DMA(uint8 epNumber) ; +#endif /* End USBFS_EP_MM != USBFS__EP_MANUAL) */ + +#if defined(USBFS_ENABLE_MIDI_STREAMING) && (USBFS_ENABLE_MIDI_API != 0u) + void USBFS_MIDI_EP_Init(void) ; + + #if (USBFS_MIDI_IN_BUFF_SIZE > 0) + void USBFS_MIDI_IN_Service(void) ; + uint8 USBFS_PutUsbMidiIn(uint8 ic, const uint8 midiMsg[], uint8 cable) + ; + #endif /* USBFS_MIDI_IN_BUFF_SIZE > 0 */ + + #if (USBFS_MIDI_OUT_BUFF_SIZE > 0) + void USBFS_MIDI_OUT_EP_Service(void) ; + #endif /* USBFS_MIDI_OUT_BUFF_SIZE > 0 */ + +#endif /* End USBFS_ENABLE_MIDI_API != 0u */ + +/* Renamed Functions for backward compatibility. +* Should not be used in new designs. +*/ + +#define USBFS_bCheckActivity USBFS_CheckActivity +#define USBFS_bGetConfiguration USBFS_GetConfiguration +#define USBFS_bGetInterfaceSetting USBFS_GetInterfaceSetting +#define USBFS_bGetEPState USBFS_GetEPState +#define USBFS_wGetEPCount USBFS_GetEPCount +#define USBFS_bGetEPAckState USBFS_GetEPAckState +#define USBFS_bRWUEnabled USBFS_RWUEnabled +#define USBFS_bVBusPresent USBFS_VBusPresent + +#define USBFS_bConfiguration USBFS_configuration +#define USBFS_bInterfaceSetting USBFS_interfaceSetting +#define USBFS_bDeviceAddress USBFS_deviceAddress +#define USBFS_bDeviceStatus USBFS_deviceStatus +#define USBFS_bDevice USBFS_device +#define USBFS_bTransferState USBFS_transferState +#define USBFS_bLastPacketSize USBFS_lastPacketSize + +#define USBFS_LoadEP USBFS_LoadInEP +#define USBFS_LoadInISOCEP USBFS_LoadInEP +#define USBFS_EnableOutISOCEP USBFS_EnableOutEP + +#define USBFS_SetVector CyIntSetVector +#define USBFS_SetPriority CyIntSetPriority +#define USBFS_EnableInt CyIntEnable + + +/*************************************** +* API Constants +***************************************/ + +#define USBFS_EP0 (0u) +#define USBFS_EP1 (1u) +#define USBFS_EP2 (2u) +#define USBFS_EP3 (3u) +#define USBFS_EP4 (4u) +#define USBFS_EP5 (5u) +#define USBFS_EP6 (6u) +#define USBFS_EP7 (7u) +#define USBFS_EP8 (8u) +#define USBFS_MAX_EP (9u) + +#define USBFS_TRUE (1u) +#define USBFS_FALSE (0u) + +#define USBFS_NO_EVENT_ALLOWED (2u) +#define USBFS_EVENT_PENDING (1u) +#define USBFS_NO_EVENT_PENDING (0u) + +#define USBFS_IN_BUFFER_FULL USBFS_NO_EVENT_PENDING +#define USBFS_IN_BUFFER_EMPTY USBFS_EVENT_PENDING +#define USBFS_OUT_BUFFER_FULL USBFS_EVENT_PENDING +#define USBFS_OUT_BUFFER_EMPTY USBFS_NO_EVENT_PENDING + +#define USBFS_FORCE_J (0xA0u) +#define USBFS_FORCE_K (0x80u) +#define USBFS_FORCE_SE0 (0xC0u) +#define USBFS_FORCE_NONE (0x00u) + +#define USBFS_IDLE_TIMER_RUNNING (0x02u) +#define USBFS_IDLE_TIMER_EXPIRED (0x01u) +#define USBFS_IDLE_TIMER_INDEFINITE (0x00u) + +#define USBFS_DEVICE_STATUS_BUS_POWERED (0x00u) +#define USBFS_DEVICE_STATUS_SELF_POWERED (0x01u) + +#define USBFS_3V_OPERATION (0x00u) +#define USBFS_5V_OPERATION (0x01u) +#define USBFS_DWR_VDDD_OPERATION (0x02u) + +#define USBFS_MODE_DISABLE (0x00u) +#define USBFS_MODE_NAK_IN_OUT (0x01u) +#define USBFS_MODE_STATUS_OUT_ONLY (0x02u) +#define USBFS_MODE_STALL_IN_OUT (0x03u) +#define USBFS_MODE_RESERVED_0100 (0x04u) +#define USBFS_MODE_ISO_OUT (0x05u) +#define USBFS_MODE_STATUS_IN_ONLY (0x06u) +#define USBFS_MODE_ISO_IN (0x07u) +#define USBFS_MODE_NAK_OUT (0x08u) +#define USBFS_MODE_ACK_OUT (0x09u) +#define USBFS_MODE_RESERVED_1010 (0x0Au) +#define USBFS_MODE_ACK_OUT_STATUS_IN (0x0Bu) +#define USBFS_MODE_NAK_IN (0x0Cu) +#define USBFS_MODE_ACK_IN (0x0Du) +#define USBFS_MODE_RESERVED_1110 (0x0Eu) +#define USBFS_MODE_ACK_IN_STATUS_OUT (0x0Fu) +#define USBFS_MODE_MASK (0x0Fu) +#define USBFS_MODE_STALL_DATA_EP (0x80u) + +#define USBFS_MODE_ACKD (0x10u) +#define USBFS_MODE_OUT_RCVD (0x20u) +#define USBFS_MODE_IN_RCVD (0x40u) +#define USBFS_MODE_SETUP_RCVD (0x80u) + +#define USBFS_RQST_TYPE_MASK (0x60u) +#define USBFS_RQST_TYPE_STD (0x00u) +#define USBFS_RQST_TYPE_CLS (0x20u) +#define USBFS_RQST_TYPE_VND (0x40u) +#define USBFS_RQST_DIR_MASK (0x80u) +#define USBFS_RQST_DIR_D2H (0x80u) +#define USBFS_RQST_DIR_H2D (0x00u) +#define USBFS_RQST_RCPT_MASK (0x03u) +#define USBFS_RQST_RCPT_DEV (0x00u) +#define USBFS_RQST_RCPT_IFC (0x01u) +#define USBFS_RQST_RCPT_EP (0x02u) +#define USBFS_RQST_RCPT_OTHER (0x03u) + +/* USB Class Codes */ +#define USBFS_CLASS_DEVICE (0x00u) /* Use class code info from Interface Descriptors */ +#define USBFS_CLASS_AUDIO (0x01u) /* Audio device */ +#define USBFS_CLASS_CDC (0x02u) /* Communication device class */ +#define USBFS_CLASS_HID (0x03u) /* Human Interface Device */ +#define USBFS_CLASS_PDC (0x05u) /* Physical device class */ +#define USBFS_CLASS_IMAGE (0x06u) /* Still Imaging device */ +#define USBFS_CLASS_PRINTER (0x07u) /* Printer device */ +#define USBFS_CLASS_MSD (0x08u) /* Mass Storage device */ +#define USBFS_CLASS_HUB (0x09u) /* Full/Hi speed Hub */ +#define USBFS_CLASS_CDC_DATA (0x0Au) /* CDC data device */ +#define USBFS_CLASS_SMART_CARD (0x0Bu) /* Smart Card device */ +#define USBFS_CLASS_CSD (0x0Du) /* Content Security device */ +#define USBFS_CLASS_VIDEO (0x0Eu) /* Video device */ +#define USBFS_CLASS_PHD (0x0Fu) /* Personal Healthcare device */ +#define USBFS_CLASS_WIRELESSD (0xDCu) /* Wireless Controller */ +#define USBFS_CLASS_MIS (0xE0u) /* Miscellaneous */ +#define USBFS_CLASS_APP (0xEFu) /* Application Specific */ +#define USBFS_CLASS_VENDOR (0xFFu) /* Vendor specific */ + + +/* Standard Request Types (Table 9-4) */ +#define USBFS_GET_STATUS (0x00u) +#define USBFS_CLEAR_FEATURE (0x01u) +#define USBFS_SET_FEATURE (0x03u) +#define USBFS_SET_ADDRESS (0x05u) +#define USBFS_GET_DESCRIPTOR (0x06u) +#define USBFS_SET_DESCRIPTOR (0x07u) +#define USBFS_GET_CONFIGURATION (0x08u) +#define USBFS_SET_CONFIGURATION (0x09u) +#define USBFS_GET_INTERFACE (0x0Au) +#define USBFS_SET_INTERFACE (0x0Bu) +#define USBFS_SYNCH_FRAME (0x0Cu) + +/* Vendor Specific Request Types */ +/* Request for Microsoft OS String Descriptor */ +#define USBFS_GET_EXTENDED_CONFIG_DESCRIPTOR (0x01u) + +/* Descriptor Types (Table 9-5) */ +#define USBFS_DESCR_DEVICE (1u) +#define USBFS_DESCR_CONFIG (2u) +#define USBFS_DESCR_STRING (3u) +#define USBFS_DESCR_INTERFACE (4u) +#define USBFS_DESCR_ENDPOINT (5u) +#define USBFS_DESCR_DEVICE_QUALIFIER (6u) +#define USBFS_DESCR_OTHER_SPEED (7u) +#define USBFS_DESCR_INTERFACE_POWER (8u) + +/* Device Descriptor Defines */ +#define USBFS_DEVICE_DESCR_LENGTH (18u) +#define USBFS_DEVICE_DESCR_SN_SHIFT (16u) + +/* Config Descriptor Shifts and Masks */ +#define USBFS_CONFIG_DESCR_LENGTH (0u) +#define USBFS_CONFIG_DESCR_TYPE (1u) +#define USBFS_CONFIG_DESCR_TOTAL_LENGTH_LOW (2u) +#define USBFS_CONFIG_DESCR_TOTAL_LENGTH_HI (3u) +#define USBFS_CONFIG_DESCR_NUM_INTERFACES (4u) +#define USBFS_CONFIG_DESCR_CONFIG_VALUE (5u) +#define USBFS_CONFIG_DESCR_CONFIGURATION (6u) +#define USBFS_CONFIG_DESCR_ATTRIB (7u) +#define USBFS_CONFIG_DESCR_ATTRIB_SELF_POWERED (0x40u) +#define USBFS_CONFIG_DESCR_ATTRIB_RWU_EN (0x20u) + +/* Feature Selectors (Table 9-6) */ +#define USBFS_DEVICE_REMOTE_WAKEUP (0x01u) +#define USBFS_ENDPOINT_HALT (0x00u) +#define USBFS_TEST_MODE (0x02u) + +/* USB Device Status (Figure 9-4) */ +#define USBFS_DEVICE_STATUS_BUS_POWERED (0x00u) +#define USBFS_DEVICE_STATUS_SELF_POWERED (0x01u) +#define USBFS_DEVICE_STATUS_REMOTE_WAKEUP (0x02u) + +/* USB Endpoint Status (Figure 9-4) */ +#define USBFS_ENDPOINT_STATUS_HALT (0x01u) + +/* USB Endpoint Directions */ +#define USBFS_DIR_IN (0x80u) +#define USBFS_DIR_OUT (0x00u) +#define USBFS_DIR_UNUSED (0x7Fu) + +/* USB Endpoint Attributes */ +#define USBFS_EP_TYPE_CTRL (0x00u) +#define USBFS_EP_TYPE_ISOC (0x01u) +#define USBFS_EP_TYPE_BULK (0x02u) +#define USBFS_EP_TYPE_INT (0x03u) +#define USBFS_EP_TYPE_MASK (0x03u) + +#define USBFS_EP_SYNC_TYPE_NO_SYNC (0x00u) +#define USBFS_EP_SYNC_TYPE_ASYNC (0x04u) +#define USBFS_EP_SYNC_TYPE_ADAPTIVE (0x08u) +#define USBFS_EP_SYNC_TYPE_SYNCHRONOUS (0x0Cu) +#define USBFS_EP_SYNC_TYPE_MASK (0x0Cu) + +#define USBFS_EP_USAGE_TYPE_DATA (0x00u) +#define USBFS_EP_USAGE_TYPE_FEEDBACK (0x10u) +#define USBFS_EP_USAGE_TYPE_IMPLICIT (0x20u) +#define USBFS_EP_USAGE_TYPE_RESERVED (0x30u) +#define USBFS_EP_USAGE_TYPE_MASK (0x30u) + +/* Endpoint Status defines */ +#define USBFS_EP_STATUS_LENGTH (0x02u) + +/* Endpoint Device defines */ +#define USBFS_DEVICE_STATUS_LENGTH (0x02u) + +#define USBFS_STATUS_LENGTH_MAX \ + ( (USBFS_EP_STATUS_LENGTH > USBFS_DEVICE_STATUS_LENGTH) ? \ + USBFS_EP_STATUS_LENGTH : USBFS_DEVICE_STATUS_LENGTH ) +/* Transfer Completion Notification */ +#define USBFS_XFER_IDLE (0x00u) +#define USBFS_XFER_STATUS_ACK (0x01u) +#define USBFS_XFER_PREMATURE (0x02u) +#define USBFS_XFER_ERROR (0x03u) + +/* Driver State defines */ +#define USBFS_TRANS_STATE_IDLE (0x00u) +#define USBFS_TRANS_STATE_CONTROL_READ (0x02u) +#define USBFS_TRANS_STATE_CONTROL_WRITE (0x04u) +#define USBFS_TRANS_STATE_NO_DATA_CONTROL (0x06u) + +/* String Descriptor defines */ +#define USBFS_STRING_MSOS (0xEEu) +#define USBFS_MSOS_DESCRIPTOR_LENGTH (18u) +#define USBFS_MSOS_CONF_DESCR_LENGTH (40u) + +#if(USBFS_EP_MM == USBFS__EP_DMAMANUAL) + /* DMA manual mode defines */ + #define USBFS_DMA_BYTES_PER_BURST (0u) + #define USBFS_DMA_REQUEST_PER_BURST (0u) +#endif /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */ +#if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + /* DMA automatic mode defines */ + #define USBFS_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_DMA_BUF_SIZE (0x55u) + #define USBFS_DMA_REQUEST_PER_BURST (1u) +#endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + +/* DIE ID string descriptor defines */ +#if defined(USBFS_ENABLE_IDSN_STRING) + #define USBFS_IDSN_DESCR_LENGTH (0x22u) +#endif /* USBFS_ENABLE_IDSN_STRING */ + + +/*************************************** +* External data references +***************************************/ + +extern uint8 USBFS_initVar; +extern volatile uint8 USBFS_device; +extern volatile uint8 USBFS_transferState; +extern volatile uint8 USBFS_configuration; +extern volatile uint8 USBFS_configurationChanged; +extern volatile uint8 USBFS_deviceStatus; + +/* HID Variables */ +#if defined(USBFS_ENABLE_HID_CLASS) + extern volatile uint8 USBFS_hidProtocol[USBFS_MAX_INTERFACES_NUMBER]; + extern volatile uint8 USBFS_hidIdleRate[USBFS_MAX_INTERFACES_NUMBER]; + extern volatile uint8 USBFS_hidIdleTimer[USBFS_MAX_INTERFACES_NUMBER]; +#endif /* USBFS_ENABLE_HID_CLASS */ + + +/*************************************** +* Registers +***************************************/ + +#define USBFS_ARB_CFG_PTR ( (reg8 *) USBFS_USB__ARB_CFG) +#define USBFS_ARB_CFG_REG (* (reg8 *) USBFS_USB__ARB_CFG) + +#define USBFS_ARB_EP1_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP1_CFG) +#define USBFS_ARB_EP1_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP1_CFG) +#define USBFS_ARB_EP1_CFG_IND USBFS_USB__ARB_EP1_CFG +#define USBFS_ARB_EP1_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP1_INT_EN) +#define USBFS_ARB_EP1_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP1_INT_EN) +#define USBFS_ARB_EP1_INT_EN_IND USBFS_USB__ARB_EP1_INT_EN +#define USBFS_ARB_EP1_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP1_SR) +#define USBFS_ARB_EP1_SR_REG (* (reg8 *) USBFS_USB__ARB_EP1_SR) +#define USBFS_ARB_EP1_SR_IND USBFS_USB__ARB_EP1_SR + +#define USBFS_ARB_EP2_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP2_CFG) +#define USBFS_ARB_EP2_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP2_CFG) +#define USBFS_ARB_EP2_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP2_INT_EN) +#define USBFS_ARB_EP2_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP2_INT_EN) +#define USBFS_ARB_EP2_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP2_SR) +#define USBFS_ARB_EP2_SR_REG (* (reg8 *) USBFS_USB__ARB_EP2_SR) + +#define USBFS_ARB_EP3_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP3_CFG) +#define USBFS_ARB_EP3_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP3_CFG) +#define USBFS_ARB_EP3_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP3_INT_EN) +#define USBFS_ARB_EP3_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP3_INT_EN) +#define USBFS_ARB_EP3_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP3_SR) +#define USBFS_ARB_EP3_SR_REG (* (reg8 *) USBFS_USB__ARB_EP3_SR) + +#define USBFS_ARB_EP4_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP4_CFG) +#define USBFS_ARB_EP4_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP4_CFG) +#define USBFS_ARB_EP4_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP4_INT_EN) +#define USBFS_ARB_EP4_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP4_INT_EN) +#define USBFS_ARB_EP4_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP4_SR) +#define USBFS_ARB_EP4_SR_REG (* (reg8 *) USBFS_USB__ARB_EP4_SR) + +#define USBFS_ARB_EP5_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP5_CFG) +#define USBFS_ARB_EP5_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP5_CFG) +#define USBFS_ARB_EP5_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP5_INT_EN) +#define USBFS_ARB_EP5_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP5_INT_EN) +#define USBFS_ARB_EP5_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP5_SR) +#define USBFS_ARB_EP5_SR_REG (* (reg8 *) USBFS_USB__ARB_EP5_SR) + +#define USBFS_ARB_EP6_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP6_CFG) +#define USBFS_ARB_EP6_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP6_CFG) +#define USBFS_ARB_EP6_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP6_INT_EN) +#define USBFS_ARB_EP6_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP6_INT_EN) +#define USBFS_ARB_EP6_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP6_SR) +#define USBFS_ARB_EP6_SR_REG (* (reg8 *) USBFS_USB__ARB_EP6_SR) + +#define USBFS_ARB_EP7_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP7_CFG) +#define USBFS_ARB_EP7_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP7_CFG) +#define USBFS_ARB_EP7_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP7_INT_EN) +#define USBFS_ARB_EP7_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP7_INT_EN) +#define USBFS_ARB_EP7_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP7_SR) +#define USBFS_ARB_EP7_SR_REG (* (reg8 *) USBFS_USB__ARB_EP7_SR) + +#define USBFS_ARB_EP8_CFG_PTR ( (reg8 *) USBFS_USB__ARB_EP8_CFG) +#define USBFS_ARB_EP8_CFG_REG (* (reg8 *) USBFS_USB__ARB_EP8_CFG) +#define USBFS_ARB_EP8_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_EP8_INT_EN) +#define USBFS_ARB_EP8_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_EP8_INT_EN) +#define USBFS_ARB_EP8_SR_PTR ( (reg8 *) USBFS_USB__ARB_EP8_SR) +#define USBFS_ARB_EP8_SR_REG (* (reg8 *) USBFS_USB__ARB_EP8_SR) + +#define USBFS_ARB_INT_EN_PTR ( (reg8 *) USBFS_USB__ARB_INT_EN) +#define USBFS_ARB_INT_EN_REG (* (reg8 *) USBFS_USB__ARB_INT_EN) +#define USBFS_ARB_INT_SR_PTR ( (reg8 *) USBFS_USB__ARB_INT_SR) +#define USBFS_ARB_INT_SR_REG (* (reg8 *) USBFS_USB__ARB_INT_SR) + +#define USBFS_ARB_RW1_DR_PTR ((reg8 *) USBFS_USB__ARB_RW1_DR) +#define USBFS_ARB_RW1_DR_IND USBFS_USB__ARB_RW1_DR +#define USBFS_ARB_RW1_RA_PTR ((reg8 *) USBFS_USB__ARB_RW1_RA) +#define USBFS_ARB_RW1_RA_IND USBFS_USB__ARB_RW1_RA +#define USBFS_ARB_RW1_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW1_RA_MSB) +#define USBFS_ARB_RW1_RA_MSB_IND USBFS_USB__ARB_RW1_RA_MSB +#define USBFS_ARB_RW1_WA_PTR ((reg8 *) USBFS_USB__ARB_RW1_WA) +#define USBFS_ARB_RW1_WA_IND USBFS_USB__ARB_RW1_WA +#define USBFS_ARB_RW1_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW1_WA_MSB) +#define USBFS_ARB_RW1_WA_MSB_IND USBFS_USB__ARB_RW1_WA_MSB + +#define USBFS_ARB_RW2_DR_PTR ((reg8 *) USBFS_USB__ARB_RW2_DR) +#define USBFS_ARB_RW2_RA_PTR ((reg8 *) USBFS_USB__ARB_RW2_RA) +#define USBFS_ARB_RW2_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW2_RA_MSB) +#define USBFS_ARB_RW2_WA_PTR ((reg8 *) USBFS_USB__ARB_RW2_WA) +#define USBFS_ARB_RW2_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW2_WA_MSB) + +#define USBFS_ARB_RW3_DR_PTR ((reg8 *) USBFS_USB__ARB_RW3_DR) +#define USBFS_ARB_RW3_RA_PTR ((reg8 *) USBFS_USB__ARB_RW3_RA) +#define USBFS_ARB_RW3_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW3_RA_MSB) +#define USBFS_ARB_RW3_WA_PTR ((reg8 *) USBFS_USB__ARB_RW3_WA) +#define USBFS_ARB_RW3_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW3_WA_MSB) + +#define USBFS_ARB_RW4_DR_PTR ((reg8 *) USBFS_USB__ARB_RW4_DR) +#define USBFS_ARB_RW4_RA_PTR ((reg8 *) USBFS_USB__ARB_RW4_RA) +#define USBFS_ARB_RW4_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW4_RA_MSB) +#define USBFS_ARB_RW4_WA_PTR ((reg8 *) USBFS_USB__ARB_RW4_WA) +#define USBFS_ARB_RW4_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW4_WA_MSB) + +#define USBFS_ARB_RW5_DR_PTR ((reg8 *) USBFS_USB__ARB_RW5_DR) +#define USBFS_ARB_RW5_RA_PTR ((reg8 *) USBFS_USB__ARB_RW5_RA) +#define USBFS_ARB_RW5_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW5_RA_MSB) +#define USBFS_ARB_RW5_WA_PTR ((reg8 *) USBFS_USB__ARB_RW5_WA) +#define USBFS_ARB_RW5_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW5_WA_MSB) + +#define USBFS_ARB_RW6_DR_PTR ((reg8 *) USBFS_USB__ARB_RW6_DR) +#define USBFS_ARB_RW6_RA_PTR ((reg8 *) USBFS_USB__ARB_RW6_RA) +#define USBFS_ARB_RW6_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW6_RA_MSB) +#define USBFS_ARB_RW6_WA_PTR ((reg8 *) USBFS_USB__ARB_RW6_WA) +#define USBFS_ARB_RW6_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW6_WA_MSB) + +#define USBFS_ARB_RW7_DR_PTR ((reg8 *) USBFS_USB__ARB_RW7_DR) +#define USBFS_ARB_RW7_RA_PTR ((reg8 *) USBFS_USB__ARB_RW7_RA) +#define USBFS_ARB_RW7_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW7_RA_MSB) +#define USBFS_ARB_RW7_WA_PTR ((reg8 *) USBFS_USB__ARB_RW7_WA) +#define USBFS_ARB_RW7_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW7_WA_MSB) + +#define USBFS_ARB_RW8_DR_PTR ((reg8 *) USBFS_USB__ARB_RW8_DR) +#define USBFS_ARB_RW8_RA_PTR ((reg8 *) USBFS_USB__ARB_RW8_RA) +#define USBFS_ARB_RW8_RA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW8_RA_MSB) +#define USBFS_ARB_RW8_WA_PTR ((reg8 *) USBFS_USB__ARB_RW8_WA) +#define USBFS_ARB_RW8_WA_MSB_PTR ((reg8 *) USBFS_USB__ARB_RW8_WA_MSB) + +#define USBFS_BUF_SIZE_PTR ( (reg8 *) USBFS_USB__BUF_SIZE) +#define USBFS_BUF_SIZE_REG (* (reg8 *) USBFS_USB__BUF_SIZE) +#define USBFS_BUS_RST_CNT_PTR ( (reg8 *) USBFS_USB__BUS_RST_CNT) +#define USBFS_BUS_RST_CNT_REG (* (reg8 *) USBFS_USB__BUS_RST_CNT) +#define USBFS_CWA_PTR ( (reg8 *) USBFS_USB__CWA) +#define USBFS_CWA_REG (* (reg8 *) USBFS_USB__CWA) +#define USBFS_CWA_MSB_PTR ( (reg8 *) USBFS_USB__CWA_MSB) +#define USBFS_CWA_MSB_REG (* (reg8 *) USBFS_USB__CWA_MSB) +#define USBFS_CR0_PTR ( (reg8 *) USBFS_USB__CR0) +#define USBFS_CR0_REG (* (reg8 *) USBFS_USB__CR0) +#define USBFS_CR1_PTR ( (reg8 *) USBFS_USB__CR1) +#define USBFS_CR1_REG (* (reg8 *) USBFS_USB__CR1) + +#define USBFS_DMA_THRES_PTR ( (reg8 *) USBFS_USB__DMA_THRES) +#define USBFS_DMA_THRES_REG (* (reg8 *) USBFS_USB__DMA_THRES) +#define USBFS_DMA_THRES_MSB_PTR ( (reg8 *) USBFS_USB__DMA_THRES_MSB) +#define USBFS_DMA_THRES_MSB_REG (* (reg8 *) USBFS_USB__DMA_THRES_MSB) + +#define USBFS_EP_ACTIVE_PTR ( (reg8 *) USBFS_USB__EP_ACTIVE) +#define USBFS_EP_ACTIVE_REG (* (reg8 *) USBFS_USB__EP_ACTIVE) +#define USBFS_EP_TYPE_PTR ( (reg8 *) USBFS_USB__EP_TYPE) +#define USBFS_EP_TYPE_REG (* (reg8 *) USBFS_USB__EP_TYPE) + +#define USBFS_EP0_CNT_PTR ( (reg8 *) USBFS_USB__EP0_CNT) +#define USBFS_EP0_CNT_REG (* (reg8 *) USBFS_USB__EP0_CNT) +#define USBFS_EP0_CR_PTR ( (reg8 *) USBFS_USB__EP0_CR) +#define USBFS_EP0_CR_REG (* (reg8 *) USBFS_USB__EP0_CR) +#define USBFS_EP0_DR0_PTR ( (reg8 *) USBFS_USB__EP0_DR0) +#define USBFS_EP0_DR0_REG (* (reg8 *) USBFS_USB__EP0_DR0) +#define USBFS_EP0_DR0_IND USBFS_USB__EP0_DR0 +#define USBFS_EP0_DR1_PTR ( (reg8 *) USBFS_USB__EP0_DR1) +#define USBFS_EP0_DR1_REG (* (reg8 *) USBFS_USB__EP0_DR1) +#define USBFS_EP0_DR2_PTR ( (reg8 *) USBFS_USB__EP0_DR2) +#define USBFS_EP0_DR2_REG (* (reg8 *) USBFS_USB__EP0_DR2) +#define USBFS_EP0_DR3_PTR ( (reg8 *) USBFS_USB__EP0_DR3) +#define USBFS_EP0_DR3_REG (* (reg8 *) USBFS_USB__EP0_DR3) +#define USBFS_EP0_DR4_PTR ( (reg8 *) USBFS_USB__EP0_DR4) +#define USBFS_EP0_DR4_REG (* (reg8 *) USBFS_USB__EP0_DR4) +#define USBFS_EP0_DR5_PTR ( (reg8 *) USBFS_USB__EP0_DR5) +#define USBFS_EP0_DR5_REG (* (reg8 *) USBFS_USB__EP0_DR5) +#define USBFS_EP0_DR6_PTR ( (reg8 *) USBFS_USB__EP0_DR6) +#define USBFS_EP0_DR6_REG (* (reg8 *) USBFS_USB__EP0_DR6) +#define USBFS_EP0_DR7_PTR ( (reg8 *) USBFS_USB__EP0_DR7) +#define USBFS_EP0_DR7_REG (* (reg8 *) USBFS_USB__EP0_DR7) + +#define USBFS_OSCLK_DR0_PTR ( (reg8 *) USBFS_USB__OSCLK_DR0) +#define USBFS_OSCLK_DR0_REG (* (reg8 *) USBFS_USB__OSCLK_DR0) +#define USBFS_OSCLK_DR1_PTR ( (reg8 *) USBFS_USB__OSCLK_DR1) +#define USBFS_OSCLK_DR1_REG (* (reg8 *) USBFS_USB__OSCLK_DR1) + +#define USBFS_PM_ACT_CFG_PTR ( (reg8 *) USBFS_USB__PM_ACT_CFG) +#define USBFS_PM_ACT_CFG_REG (* (reg8 *) USBFS_USB__PM_ACT_CFG) +#define USBFS_PM_STBY_CFG_PTR ( (reg8 *) USBFS_USB__PM_STBY_CFG) +#define USBFS_PM_STBY_CFG_REG (* (reg8 *) USBFS_USB__PM_STBY_CFG) + +#define USBFS_SIE_EP_INT_EN_PTR ( (reg8 *) USBFS_USB__SIE_EP_INT_EN) +#define USBFS_SIE_EP_INT_EN_REG (* (reg8 *) USBFS_USB__SIE_EP_INT_EN) +#define USBFS_SIE_EP_INT_SR_PTR ( (reg8 *) USBFS_USB__SIE_EP_INT_SR) +#define USBFS_SIE_EP_INT_SR_REG (* (reg8 *) USBFS_USB__SIE_EP_INT_SR) + +#define USBFS_SIE_EP1_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP1_CNT0) +#define USBFS_SIE_EP1_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP1_CNT0) +#define USBFS_SIE_EP1_CNT0_IND USBFS_USB__SIE_EP1_CNT0 +#define USBFS_SIE_EP1_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP1_CNT1) +#define USBFS_SIE_EP1_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP1_CNT1) +#define USBFS_SIE_EP1_CNT1_IND USBFS_USB__SIE_EP1_CNT1 +#define USBFS_SIE_EP1_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP1_CR0) +#define USBFS_SIE_EP1_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP1_CR0) +#define USBFS_SIE_EP1_CR0_IND USBFS_USB__SIE_EP1_CR0 + +#define USBFS_SIE_EP2_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP2_CNT0) +#define USBFS_SIE_EP2_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP2_CNT0) +#define USBFS_SIE_EP2_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP2_CNT1) +#define USBFS_SIE_EP2_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP2_CNT1) +#define USBFS_SIE_EP2_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP2_CR0) +#define USBFS_SIE_EP2_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP2_CR0) + +#define USBFS_SIE_EP3_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP3_CNT0) +#define USBFS_SIE_EP3_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP3_CNT0) +#define USBFS_SIE_EP3_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP3_CNT1) +#define USBFS_SIE_EP3_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP3_CNT1) +#define USBFS_SIE_EP3_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP3_CR0) +#define USBFS_SIE_EP3_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP3_CR0) + +#define USBFS_SIE_EP4_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP4_CNT0) +#define USBFS_SIE_EP4_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP4_CNT0) +#define USBFS_SIE_EP4_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP4_CNT1) +#define USBFS_SIE_EP4_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP4_CNT1) +#define USBFS_SIE_EP4_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP4_CR0) +#define USBFS_SIE_EP4_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP4_CR0) + +#define USBFS_SIE_EP5_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP5_CNT0) +#define USBFS_SIE_EP5_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP5_CNT0) +#define USBFS_SIE_EP5_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP5_CNT1) +#define USBFS_SIE_EP5_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP5_CNT1) +#define USBFS_SIE_EP5_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP5_CR0) +#define USBFS_SIE_EP5_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP5_CR0) + +#define USBFS_SIE_EP6_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP6_CNT0) +#define USBFS_SIE_EP6_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP6_CNT0) +#define USBFS_SIE_EP6_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP6_CNT1) +#define USBFS_SIE_EP6_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP6_CNT1) +#define USBFS_SIE_EP6_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP6_CR0) +#define USBFS_SIE_EP6_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP6_CR0) + +#define USBFS_SIE_EP7_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP7_CNT0) +#define USBFS_SIE_EP7_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP7_CNT0) +#define USBFS_SIE_EP7_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP7_CNT1) +#define USBFS_SIE_EP7_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP7_CNT1) +#define USBFS_SIE_EP7_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP7_CR0) +#define USBFS_SIE_EP7_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP7_CR0) + +#define USBFS_SIE_EP8_CNT0_PTR ( (reg8 *) USBFS_USB__SIE_EP8_CNT0) +#define USBFS_SIE_EP8_CNT0_REG (* (reg8 *) USBFS_USB__SIE_EP8_CNT0) +#define USBFS_SIE_EP8_CNT1_PTR ( (reg8 *) USBFS_USB__SIE_EP8_CNT1) +#define USBFS_SIE_EP8_CNT1_REG (* (reg8 *) USBFS_USB__SIE_EP8_CNT1) +#define USBFS_SIE_EP8_CR0_PTR ( (reg8 *) USBFS_USB__SIE_EP8_CR0) +#define USBFS_SIE_EP8_CR0_REG (* (reg8 *) USBFS_USB__SIE_EP8_CR0) + +#define USBFS_SOF0_PTR ( (reg8 *) USBFS_USB__SOF0) +#define USBFS_SOF0_REG (* (reg8 *) USBFS_USB__SOF0) +#define USBFS_SOF1_PTR ( (reg8 *) USBFS_USB__SOF1) +#define USBFS_SOF1_REG (* (reg8 *) USBFS_USB__SOF1) + +#define USBFS_USB_CLK_EN_PTR ( (reg8 *) USBFS_USB__USB_CLK_EN) +#define USBFS_USB_CLK_EN_REG (* (reg8 *) USBFS_USB__USB_CLK_EN) + +#define USBFS_USBIO_CR0_PTR ( (reg8 *) USBFS_USB__USBIO_CR0) +#define USBFS_USBIO_CR0_REG (* (reg8 *) USBFS_USB__USBIO_CR0) +#define USBFS_USBIO_CR1_PTR ( (reg8 *) USBFS_USB__USBIO_CR1) +#define USBFS_USBIO_CR1_REG (* (reg8 *) USBFS_USB__USBIO_CR1) +#if(!CY_PSOC5LP) + #define USBFS_USBIO_CR2_PTR ( (reg8 *) USBFS_USB__USBIO_CR2) + #define USBFS_USBIO_CR2_REG (* (reg8 *) USBFS_USB__USBIO_CR2) +#endif /* End CY_PSOC5LP */ + +#define USBFS_DIE_ID CYDEV_FLSHID_CUST_TABLES_BASE + +#define USBFS_PM_USB_CR0_PTR ( (reg8 *) CYREG_PM_USB_CR0) +#define USBFS_PM_USB_CR0_REG (* (reg8 *) CYREG_PM_USB_CR0) +#define USBFS_DYN_RECONFIG_PTR ( (reg8 *) USBFS_USB__DYN_RECONFIG) +#define USBFS_DYN_RECONFIG_REG (* (reg8 *) USBFS_USB__DYN_RECONFIG) + +#define USBFS_DM_INP_DIS_PTR ( (reg8 *) USBFS_Dm__INP_DIS) +#define USBFS_DM_INP_DIS_REG (* (reg8 *) USBFS_Dm__INP_DIS) +#define USBFS_DP_INP_DIS_PTR ( (reg8 *) USBFS_Dp__INP_DIS) +#define USBFS_DP_INP_DIS_REG (* (reg8 *) USBFS_Dp__INP_DIS) +#define USBFS_DP_INTSTAT_PTR ( (reg8 *) USBFS_Dp__INTSTAT) +#define USBFS_DP_INTSTAT_REG (* (reg8 *) USBFS_Dp__INTSTAT) + +#if (USBFS_MON_VBUS == 1u) + #if (USBFS_EXTERN_VBUS == 0u) + #define USBFS_VBUS_DR_PTR ( (reg8 *) USBFS_VBUS__DR) + #define USBFS_VBUS_DR_REG (* (reg8 *) USBFS_VBUS__DR) + #define USBFS_VBUS_PS_PTR ( (reg8 *) USBFS_VBUS__PS) + #define USBFS_VBUS_PS_REG (* (reg8 *) USBFS_VBUS__PS) + #define USBFS_VBUS_MASK USBFS_VBUS__MASK + #else + #define USBFS_VBUS_PS_PTR ( (reg8 *) USBFS_Vbus_ps_sts_sts_reg__STATUS_REG ) + #define USBFS_VBUS_MASK (0x01u) + #endif /* End USBFS_EXTERN_VBUS == 0u */ +#endif /* End USBFS_MON_VBUS */ + +/* Renamed Registers for backward compatibility. +* Should not be used in new designs. +*/ +#define USBFS_ARB_CFG USBFS_ARB_CFG_PTR + +#define USBFS_ARB_EP1_CFG USBFS_ARB_EP1_CFG_PTR +#define USBFS_ARB_EP1_INT_EN USBFS_ARB_EP1_INT_EN_PTR +#define USBFS_ARB_EP1_SR USBFS_ARB_EP1_SR_PTR + +#define USBFS_ARB_EP2_CFG USBFS_ARB_EP2_CFG_PTR +#define USBFS_ARB_EP2_INT_EN USBFS_ARB_EP2_INT_EN_PTR +#define USBFS_ARB_EP2_SR USBFS_ARB_EP2_SR_PTR + +#define USBFS_ARB_EP3_CFG USBFS_ARB_EP3_CFG_PTR +#define USBFS_ARB_EP3_INT_EN USBFS_ARB_EP3_INT_EN_PTR +#define USBFS_ARB_EP3_SR USBFS_ARB_EP3_SR_PTR + +#define USBFS_ARB_EP4_CFG USBFS_ARB_EP4_CFG_PTR +#define USBFS_ARB_EP4_INT_EN USBFS_ARB_EP4_INT_EN_PTR +#define USBFS_ARB_EP4_SR USBFS_ARB_EP4_SR_PTR + +#define USBFS_ARB_EP5_CFG USBFS_ARB_EP5_CFG_PTR +#define USBFS_ARB_EP5_INT_EN USBFS_ARB_EP5_INT_EN_PTR +#define USBFS_ARB_EP5_SR USBFS_ARB_EP5_SR_PTR + +#define USBFS_ARB_EP6_CFG USBFS_ARB_EP6_CFG_PTR +#define USBFS_ARB_EP6_INT_EN USBFS_ARB_EP6_INT_EN_PTR +#define USBFS_ARB_EP6_SR USBFS_ARB_EP6_SR_PTR + +#define USBFS_ARB_EP7_CFG USBFS_ARB_EP7_CFG_PTR +#define USBFS_ARB_EP7_INT_EN USBFS_ARB_EP7_INT_EN_PTR +#define USBFS_ARB_EP7_SR USBFS_ARB_EP7_SR_PTR + +#define USBFS_ARB_EP8_CFG USBFS_ARB_EP8_CFG_PTR +#define USBFS_ARB_EP8_INT_EN USBFS_ARB_EP8_INT_EN_PTR +#define USBFS_ARB_EP8_SR USBFS_ARB_EP8_SR_PTR + +#define USBFS_ARB_INT_EN USBFS_ARB_INT_EN_PTR +#define USBFS_ARB_INT_SR USBFS_ARB_INT_SR_PTR + +#define USBFS_ARB_RW1_DR USBFS_ARB_RW1_DR_PTR +#define USBFS_ARB_RW1_RA USBFS_ARB_RW1_RA_PTR +#define USBFS_ARB_RW1_RA_MSB USBFS_ARB_RW1_RA_MSB_PTR +#define USBFS_ARB_RW1_WA USBFS_ARB_RW1_WA_PTR +#define USBFS_ARB_RW1_WA_MSB USBFS_ARB_RW1_WA_MSB_PTR + +#define USBFS_ARB_RW2_DR USBFS_ARB_RW2_DR_PTR +#define USBFS_ARB_RW2_RA USBFS_ARB_RW2_RA_PTR +#define USBFS_ARB_RW2_RA_MSB USBFS_ARB_RW2_RA_MSB_PTR +#define USBFS_ARB_RW2_WA USBFS_ARB_RW2_WA_PTR +#define USBFS_ARB_RW2_WA_MSB USBFS_ARB_RW2_WA_MSB_PTR + +#define USBFS_ARB_RW3_DR USBFS_ARB_RW3_DR_PTR +#define USBFS_ARB_RW3_RA USBFS_ARB_RW3_RA_PTR +#define USBFS_ARB_RW3_RA_MSB USBFS_ARB_RW3_RA_MSB_PTR +#define USBFS_ARB_RW3_WA USBFS_ARB_RW3_WA_PTR +#define USBFS_ARB_RW3_WA_MSB USBFS_ARB_RW3_WA_MSB_PTR + +#define USBFS_ARB_RW4_DR USBFS_ARB_RW4_DR_PTR +#define USBFS_ARB_RW4_RA USBFS_ARB_RW4_RA_PTR +#define USBFS_ARB_RW4_RA_MSB USBFS_ARB_RW4_RA_MSB_PTR +#define USBFS_ARB_RW4_WA USBFS_ARB_RW4_WA_PTR +#define USBFS_ARB_RW4_WA_MSB USBFS_ARB_RW4_WA_MSB_PTR + +#define USBFS_ARB_RW5_DR USBFS_ARB_RW5_DR_PTR +#define USBFS_ARB_RW5_RA USBFS_ARB_RW5_RA_PTR +#define USBFS_ARB_RW5_RA_MSB USBFS_ARB_RW5_RA_MSB_PTR +#define USBFS_ARB_RW5_WA USBFS_ARB_RW5_WA_PTR +#define USBFS_ARB_RW5_WA_MSB USBFS_ARB_RW5_WA_MSB_PTR + +#define USBFS_ARB_RW6_DR USBFS_ARB_RW6_DR_PTR +#define USBFS_ARB_RW6_RA USBFS_ARB_RW6_RA_PTR +#define USBFS_ARB_RW6_RA_MSB USBFS_ARB_RW6_RA_MSB_PTR +#define USBFS_ARB_RW6_WA USBFS_ARB_RW6_WA_PTR +#define USBFS_ARB_RW6_WA_MSB USBFS_ARB_RW6_WA_MSB_PTR + +#define USBFS_ARB_RW7_DR USBFS_ARB_RW7_DR_PTR +#define USBFS_ARB_RW7_RA USBFS_ARB_RW7_RA_PTR +#define USBFS_ARB_RW7_RA_MSB USBFS_ARB_RW7_RA_MSB_PTR +#define USBFS_ARB_RW7_WA USBFS_ARB_RW7_WA_PTR +#define USBFS_ARB_RW7_WA_MSB USBFS_ARB_RW7_WA_MSB_PTR + +#define USBFS_ARB_RW8_DR USBFS_ARB_RW8_DR_PTR +#define USBFS_ARB_RW8_RA USBFS_ARB_RW8_RA_PTR +#define USBFS_ARB_RW8_RA_MSB USBFS_ARB_RW8_RA_MSB_PTR +#define USBFS_ARB_RW8_WA USBFS_ARB_RW8_WA_PTR +#define USBFS_ARB_RW8_WA_MSB USBFS_ARB_RW8_WA_MSB_PTR + +#define USBFS_BUF_SIZE USBFS_BUF_SIZE_PTR +#define USBFS_BUS_RST_CNT USBFS_BUS_RST_CNT_PTR +#define USBFS_CR0 USBFS_CR0_PTR +#define USBFS_CR1 USBFS_CR1_PTR +#define USBFS_CWA USBFS_CWA_PTR +#define USBFS_CWA_MSB USBFS_CWA_MSB_PTR + +#define USBFS_DMA_THRES USBFS_DMA_THRES_PTR +#define USBFS_DMA_THRES_MSB USBFS_DMA_THRES_MSB_PTR + +#define USBFS_EP_ACTIVE USBFS_EP_ACTIVE_PTR +#define USBFS_EP_TYPE USBFS_EP_TYPE_PTR + +#define USBFS_EP0_CNT USBFS_EP0_CNT_PTR +#define USBFS_EP0_CR USBFS_EP0_CR_PTR +#define USBFS_EP0_DR0 USBFS_EP0_DR0_PTR +#define USBFS_EP0_DR1 USBFS_EP0_DR1_PTR +#define USBFS_EP0_DR2 USBFS_EP0_DR2_PTR +#define USBFS_EP0_DR3 USBFS_EP0_DR3_PTR +#define USBFS_EP0_DR4 USBFS_EP0_DR4_PTR +#define USBFS_EP0_DR5 USBFS_EP0_DR5_PTR +#define USBFS_EP0_DR6 USBFS_EP0_DR6_PTR +#define USBFS_EP0_DR7 USBFS_EP0_DR7_PTR + +#define USBFS_OSCLK_DR0 USBFS_OSCLK_DR0_PTR +#define USBFS_OSCLK_DR1 USBFS_OSCLK_DR1_PTR + +#define USBFS_PM_ACT_CFG USBFS_PM_ACT_CFG_PTR +#define USBFS_PM_STBY_CFG USBFS_PM_STBY_CFG_PTR + +#define USBFS_SIE_EP_INT_EN USBFS_SIE_EP_INT_EN_PTR +#define USBFS_SIE_EP_INT_SR USBFS_SIE_EP_INT_SR_PTR + +#define USBFS_SIE_EP1_CNT0 USBFS_SIE_EP1_CNT0_PTR +#define USBFS_SIE_EP1_CNT1 USBFS_SIE_EP1_CNT1_PTR +#define USBFS_SIE_EP1_CR0 USBFS_SIE_EP1_CR0_PTR + +#define USBFS_SIE_EP2_CNT0 USBFS_SIE_EP2_CNT0_PTR +#define USBFS_SIE_EP2_CNT1 USBFS_SIE_EP2_CNT1_PTR +#define USBFS_SIE_EP2_CR0 USBFS_SIE_EP2_CR0_PTR + +#define USBFS_SIE_EP3_CNT0 USBFS_SIE_EP3_CNT0_PTR +#define USBFS_SIE_EP3_CNT1 USBFS_SIE_EP3_CNT1_PTR +#define USBFS_SIE_EP3_CR0 USBFS_SIE_EP3_CR0_PTR + +#define USBFS_SIE_EP4_CNT0 USBFS_SIE_EP4_CNT0_PTR +#define USBFS_SIE_EP4_CNT1 USBFS_SIE_EP4_CNT1_PTR +#define USBFS_SIE_EP4_CR0 USBFS_SIE_EP4_CR0_PTR + +#define USBFS_SIE_EP5_CNT0 USBFS_SIE_EP5_CNT0_PTR +#define USBFS_SIE_EP5_CNT1 USBFS_SIE_EP5_CNT1_PTR +#define USBFS_SIE_EP5_CR0 USBFS_SIE_EP5_CR0_PTR + +#define USBFS_SIE_EP6_CNT0 USBFS_SIE_EP6_CNT0_PTR +#define USBFS_SIE_EP6_CNT1 USBFS_SIE_EP6_CNT1_PTR +#define USBFS_SIE_EP6_CR0 USBFS_SIE_EP6_CR0_PTR + +#define USBFS_SIE_EP7_CNT0 USBFS_SIE_EP7_CNT0_PTR +#define USBFS_SIE_EP7_CNT1 USBFS_SIE_EP7_CNT1_PTR +#define USBFS_SIE_EP7_CR0 USBFS_SIE_EP7_CR0_PTR + +#define USBFS_SIE_EP8_CNT0 USBFS_SIE_EP8_CNT0_PTR +#define USBFS_SIE_EP8_CNT1 USBFS_SIE_EP8_CNT1_PTR +#define USBFS_SIE_EP8_CR0 USBFS_SIE_EP8_CR0_PTR + +#define USBFS_SOF0 USBFS_SOF0_PTR +#define USBFS_SOF1 USBFS_SOF1_PTR + +#define USBFS_USB_CLK_EN USBFS_USB_CLK_EN_PTR + +#define USBFS_USBIO_CR0 USBFS_USBIO_CR0_PTR +#define USBFS_USBIO_CR1 USBFS_USBIO_CR1_PTR +#define USBFS_USBIO_CR2 USBFS_USBIO_CR2_PTR + +#define USBFS_USB_MEM ((reg8 *) CYDEV_USB_MEM_BASE) + +#if(CYDEV_CHIP_DIE_EXPECT == CYDEV_CHIP_DIE_LEOPARD) + /* PSoC3 interrupt registers*/ + #define USBFS_USB_ISR_PRIOR ((reg8 *) CYDEV_INTC_PRIOR0) + #define USBFS_USB_ISR_SET_EN ((reg8 *) CYDEV_INTC_SET_EN0) + #define USBFS_USB_ISR_CLR_EN ((reg8 *) CYDEV_INTC_CLR_EN0) + #define USBFS_USB_ISR_VECT ((cyisraddress *) CYDEV_INTC_VECT_MBASE) +#elif(CYDEV_CHIP_DIE_EXPECT == CYDEV_CHIP_DIE_PANTHER) + /* PSoC5 interrupt registers*/ + #define USBFS_USB_ISR_PRIOR ((reg8 *) CYDEV_NVIC_PRI_0) + #define USBFS_USB_ISR_SET_EN ((reg8 *) CYDEV_NVIC_SETENA0) + #define USBFS_USB_ISR_CLR_EN ((reg8 *) CYDEV_NVIC_CLRENA0) + #define USBFS_USB_ISR_VECT ((cyisraddress *) CYDEV_NVIC_VECT_OFFSET) +#endif /* End CYDEV_CHIP_DIE_EXPECT */ + + +/*************************************** +* Interrupt vectors, masks and priorities +***************************************/ + +#define USBFS_BUS_RESET_PRIOR USBFS_bus_reset__INTC_PRIOR_NUM +#define USBFS_BUS_RESET_MASK USBFS_bus_reset__INTC_MASK +#define USBFS_BUS_RESET_VECT_NUM USBFS_bus_reset__INTC_NUMBER + +#define USBFS_SOF_PRIOR USBFS_sof_int__INTC_PRIOR_NUM +#define USBFS_SOF_MASK USBFS_sof_int__INTC_MASK +#define USBFS_SOF_VECT_NUM USBFS_sof_int__INTC_NUMBER + +#define USBFS_EP_0_PRIOR USBFS_ep_0__INTC_PRIOR_NUM +#define USBFS_EP_0_MASK USBFS_ep_0__INTC_MASK +#define USBFS_EP_0_VECT_NUM USBFS_ep_0__INTC_NUMBER + +#define USBFS_EP_1_PRIOR USBFS_ep_1__INTC_PRIOR_NUM +#define USBFS_EP_1_MASK USBFS_ep_1__INTC_MASK +#define USBFS_EP_1_VECT_NUM USBFS_ep_1__INTC_NUMBER + +#define USBFS_EP_2_PRIOR USBFS_ep_2__INTC_PRIOR_NUM +#define USBFS_EP_2_MASK USBFS_ep_2__INTC_MASK +#define USBFS_EP_2_VECT_NUM USBFS_ep_2__INTC_NUMBER + +#define USBFS_EP_3_PRIOR USBFS_ep_3__INTC_PRIOR_NUM +#define USBFS_EP_3_MASK USBFS_ep_3__INTC_MASK +#define USBFS_EP_3_VECT_NUM USBFS_ep_3__INTC_NUMBER + +#define USBFS_EP_4_PRIOR USBFS_ep_4__INTC_PRIOR_NUM +#define USBFS_EP_4_MASK USBFS_ep_4__INTC_MASK +#define USBFS_EP_4_VECT_NUM USBFS_ep_4__INTC_NUMBER + +#define USBFS_EP_5_PRIOR USBFS_ep_5__INTC_PRIOR_NUM +#define USBFS_EP_5_MASK USBFS_ep_5__INTC_MASK +#define USBFS_EP_5_VECT_NUM USBFS_ep_5__INTC_NUMBER + +#define USBFS_EP_6_PRIOR USBFS_ep_6__INTC_PRIOR_NUM +#define USBFS_EP_6_MASK USBFS_ep_6__INTC_MASK +#define USBFS_EP_6_VECT_NUM USBFS_ep_6__INTC_NUMBER + +#define USBFS_EP_7_PRIOR USBFS_ep_7__INTC_PRIOR_NUM +#define USBFS_EP_7_MASK USBFS_ep_7__INTC_MASK +#define USBFS_EP_7_VECT_NUM USBFS_ep_7__INTC_NUMBER + +#define USBFS_EP_8_PRIOR USBFS_ep_8__INTC_PRIOR_NUM +#define USBFS_EP_8_MASK USBFS_ep_8__INTC_MASK +#define USBFS_EP_8_VECT_NUM USBFS_ep_8__INTC_NUMBER + +#define USBFS_DP_INTC_PRIOR USBFS_dp_int__INTC_PRIOR_NUM +#define USBFS_DP_INTC_MASK USBFS_dp_int__INTC_MASK +#define USBFS_DP_INTC_VECT_NUM USBFS_dp_int__INTC_NUMBER + +/* ARB ISR should have higher priority from EP_X ISR, therefore it is defined to highest (0) */ +#define USBFS_ARB_PRIOR (0u) +#define USBFS_ARB_MASK USBFS_arb_int__INTC_MASK +#define USBFS_ARB_VECT_NUM USBFS_arb_int__INTC_NUMBER + +/*************************************** + * Endpoint 0 offsets (Table 9-2) + **************************************/ + +#define USBFS_bmRequestType USBFS_EP0_DR0_PTR +#define USBFS_bRequest USBFS_EP0_DR1_PTR +#define USBFS_wValue USBFS_EP0_DR2_PTR +#define USBFS_wValueHi USBFS_EP0_DR3_PTR +#define USBFS_wValueLo USBFS_EP0_DR2_PTR +#define USBFS_wIndex USBFS_EP0_DR4_PTR +#define USBFS_wIndexHi USBFS_EP0_DR5_PTR +#define USBFS_wIndexLo USBFS_EP0_DR4_PTR +#define USBFS_length USBFS_EP0_DR6_PTR +#define USBFS_lengthHi USBFS_EP0_DR7_PTR +#define USBFS_lengthLo USBFS_EP0_DR6_PTR + + +/*************************************** +* Register Constants +***************************************/ +#define USBFS_VDDD_MV CYDEV_VDDD_MV +#define USBFS_3500MV (3500u) + +#define USBFS_CR1_REG_ENABLE (0x01u) +#define USBFS_CR1_ENABLE_LOCK (0x02u) +#define USBFS_CR1_BUS_ACTIVITY_SHIFT (0x02u) +#define USBFS_CR1_BUS_ACTIVITY ((uint8)(0x01u << USBFS_CR1_BUS_ACTIVITY_SHIFT)) +#define USBFS_CR1_TRIM_MSB_EN (0x08u) + +#define USBFS_EP0_CNT_DATA_TOGGLE (0x80u) +#define USBFS_EPX_CNT_DATA_TOGGLE (0x80u) +#define USBFS_EPX_CNT0_MASK (0x0Fu) +#define USBFS_EPX_CNTX_MSB_MASK (0x07u) +#define USBFS_EPX_CNTX_ADDR_SHIFT (0x04u) +#define USBFS_EPX_CNTX_ADDR_OFFSET (0x10u) +#define USBFS_EPX_CNTX_CRC_COUNT (0x02u) +#define USBFS_EPX_DATA_BUF_MAX (512u) + +#define USBFS_CR0_ENABLE (0x80u) + +/* A 100 KHz clock is used for BUS reset count. Recommended is to count 10 pulses */ +#define USBFS_BUS_RST_COUNT (0x0au) + +#define USBFS_USBIO_CR1_IOMODE (0x20u) +#define USBFS_USBIO_CR1_USBPUEN (0x04u) +#define USBFS_USBIO_CR1_DP0 (0x02u) +#define USBFS_USBIO_CR1_DM0 (0x01u) + +#define USBFS_USBIO_CR0_TEN (0x80u) +#define USBFS_USBIO_CR0_TSE0 (0x40u) +#define USBFS_USBIO_CR0_TD (0x20u) +#define USBFS_USBIO_CR0_RD (0x01u) + +#define USBFS_FASTCLK_IMO_CR_USBCLK_ON (0x40u) +#define USBFS_FASTCLK_IMO_CR_XCLKEN (0x20u) +#define USBFS_FASTCLK_IMO_CR_FX2ON (0x10u) + +#define USBFS_ARB_EPX_CFG_RESET (0x08u) +#define USBFS_ARB_EPX_CFG_CRC_BYPASS (0x04u) +#define USBFS_ARB_EPX_CFG_DMA_REQ (0x02u) +#define USBFS_ARB_EPX_CFG_IN_DATA_RDY (0x01u) + +#define USBFS_ARB_EPX_SR_IN_BUF_FULL (0x01u) +#define USBFS_ARB_EPX_SR_DMA_GNT (0x02u) +#define USBFS_ARB_EPX_SR_BUF_OVER (0x04u) +#define USBFS_ARB_EPX_SR_BUF_UNDER (0x08u) + +#define USBFS_ARB_CFG_AUTO_MEM (0x10u) +#define USBFS_ARB_CFG_MANUAL_DMA (0x20u) +#define USBFS_ARB_CFG_AUTO_DMA (0x40u) +#define USBFS_ARB_CFG_CFG_CPM (0x80u) + +#if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + #define USBFS_ARB_EPX_INT_MASK (0x1Du) +#else + #define USBFS_ARB_EPX_INT_MASK (0x1Fu) +#endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ +#define USBFS_ARB_INT_MASK (uint8)((USBFS_DMA1_REMOVE ^ 1u) | \ + (uint8)((USBFS_DMA2_REMOVE ^ 1u) << 1u) | \ + (uint8)((USBFS_DMA3_REMOVE ^ 1u) << 2u) | \ + (uint8)((USBFS_DMA4_REMOVE ^ 1u) << 3u) | \ + (uint8)((USBFS_DMA5_REMOVE ^ 1u) << 4u) | \ + (uint8)((USBFS_DMA6_REMOVE ^ 1u) << 5u) | \ + (uint8)((USBFS_DMA7_REMOVE ^ 1u) << 6u) | \ + (uint8)((USBFS_DMA8_REMOVE ^ 1u) << 7u) ) + +#define USBFS_SIE_EP_INT_EP1_MASK (0x01u) +#define USBFS_SIE_EP_INT_EP2_MASK (0x02u) +#define USBFS_SIE_EP_INT_EP3_MASK (0x04u) +#define USBFS_SIE_EP_INT_EP4_MASK (0x08u) +#define USBFS_SIE_EP_INT_EP5_MASK (0x10u) +#define USBFS_SIE_EP_INT_EP6_MASK (0x20u) +#define USBFS_SIE_EP_INT_EP7_MASK (0x40u) +#define USBFS_SIE_EP_INT_EP8_MASK (0x80u) + +#define USBFS_PM_ACT_EN_FSUSB USBFS_USB__PM_ACT_MSK +#define USBFS_PM_STBY_EN_FSUSB USBFS_USB__PM_STBY_MSK +#define USBFS_PM_AVAIL_EN_FSUSBIO (0x10u) + +#define USBFS_PM_USB_CR0_REF_EN (0x01u) +#define USBFS_PM_USB_CR0_PD_N (0x02u) +#define USBFS_PM_USB_CR0_PD_PULLUP_N (0x04u) + +#define USBFS_USB_CLK_ENABLE (0x01u) + +#define USBFS_DM_MASK USBFS_Dm__0__MASK +#define USBFS_DP_MASK USBFS_Dp__0__MASK + +#define USBFS_DYN_RECONFIG_ENABLE (0x01u) +#define USBFS_DYN_RECONFIG_EP_SHIFT (0x01u) +#define USBFS_DYN_RECONFIG_RDY_STS (0x10u) + + +#endif /* End CY_USBFS_USBFS_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.c new file mode 100755 index 00000000..afae8fad --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.c @@ -0,0 +1,137 @@ +/******************************************************************************* +* File Name: USBFS_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_Dm.h" + +/* APIs are not generated for P15[7:6] on PSoC 5 */ +#if !(CY_PSOC5A &&\ + USBFS_Dm__PORT == 15 && ((USBFS_Dm__MASK & 0xC0) != 0)) + + +/******************************************************************************* +* Function Name: USBFS_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_Dm_Write(uint8 value) +{ + uint8 staticBits = (USBFS_Dm_DR & (uint8)(~USBFS_Dm_MASK)); + USBFS_Dm_DR = staticBits | ((uint8)(value << USBFS_Dm_SHIFT) & USBFS_Dm_MASK); +} + + +/******************************************************************************* +* Function Name: USBFS_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_Dm_SetDriveMode(uint8 mode) +{ + CyPins_SetPinDriveMode(USBFS_Dm_0, mode); +} + + +/******************************************************************************* +* Function Name: USBFS_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_Dm_ReadPS calls this function. +* +*******************************************************************************/ +uint8 USBFS_Dm_Read(void) +{ + return (USBFS_Dm_PS & USBFS_Dm_MASK) >> USBFS_Dm_SHIFT; +} + + +/******************************************************************************* +* Function Name: USBFS_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_Dm_ReadDataReg(void) +{ + return (USBFS_Dm_DR & USBFS_Dm_MASK) >> USBFS_Dm_SHIFT; +} + + +/* If Interrupts Are Enabled for this Pins component */ +#if defined(USBFS_Dm_INTSTAT) + + /******************************************************************************* + * Function Name: USBFS_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_Dm_ClearInterrupt(void) + { + return (USBFS_Dm_INTSTAT & USBFS_Dm_MASK) >> USBFS_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_Dm.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.h new file mode 100755 index 00000000..c1aa9b99 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm.h @@ -0,0 +1,130 @@ +/******************************************************************************* +* File Name: USBFS_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_Dm_H) /* Pins USBFS_Dm_H */ +#define CY_PINS_USBFS_Dm_H + +#include "cytypes.h" +#include "cyfitter.h" +#include "cypins.h" +#include "USBFS_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_Dm__PORT == 15 && ((USBFS_Dm__MASK & 0xC0) != 0)) + + +/*************************************** +* Function Prototypes +***************************************/ + +void USBFS_Dm_Write(uint8 value) ; +void USBFS_Dm_SetDriveMode(uint8 mode) ; +uint8 USBFS_Dm_ReadDataReg(void) ; +uint8 USBFS_Dm_Read(void) ; +uint8 USBFS_Dm_ClearInterrupt(void) ; + + +/*************************************** +* API Constants +***************************************/ + +/* Drive Modes */ +#define USBFS_Dm_DM_ALG_HIZ PIN_DM_ALG_HIZ +#define USBFS_Dm_DM_DIG_HIZ PIN_DM_DIG_HIZ +#define USBFS_Dm_DM_RES_UP PIN_DM_RES_UP +#define USBFS_Dm_DM_RES_DWN PIN_DM_RES_DWN +#define USBFS_Dm_DM_OD_LO PIN_DM_OD_LO +#define USBFS_Dm_DM_OD_HI PIN_DM_OD_HI +#define USBFS_Dm_DM_STRONG PIN_DM_STRONG +#define USBFS_Dm_DM_RES_UPDWN PIN_DM_RES_UPDWN + +/* Digital Port Constants */ +#define USBFS_Dm_MASK USBFS_Dm__MASK +#define USBFS_Dm_SHIFT USBFS_Dm__SHIFT +#define USBFS_Dm_WIDTH 1u + + +/*************************************** +* Registers +***************************************/ + +/* Main Port Registers */ +/* Pin State */ +#define USBFS_Dm_PS (* (reg8 *) USBFS_Dm__PS) +/* Data Register */ +#define USBFS_Dm_DR (* (reg8 *) USBFS_Dm__DR) +/* Port Number */ +#define USBFS_Dm_PRT_NUM (* (reg8 *) USBFS_Dm__PRT) +/* Connect to Analog Globals */ +#define USBFS_Dm_AG (* (reg8 *) USBFS_Dm__AG) +/* Analog MUX bux enable */ +#define USBFS_Dm_AMUX (* (reg8 *) USBFS_Dm__AMUX) +/* Bidirectional Enable */ +#define USBFS_Dm_BIE (* (reg8 *) USBFS_Dm__BIE) +/* Bit-mask for Aliased Register Access */ +#define USBFS_Dm_BIT_MASK (* (reg8 *) USBFS_Dm__BIT_MASK) +/* Bypass Enable */ +#define USBFS_Dm_BYP (* (reg8 *) USBFS_Dm__BYP) +/* Port wide control signals */ +#define USBFS_Dm_CTL (* (reg8 *) USBFS_Dm__CTL) +/* Drive Modes */ +#define USBFS_Dm_DM0 (* (reg8 *) USBFS_Dm__DM0) +#define USBFS_Dm_DM1 (* (reg8 *) USBFS_Dm__DM1) +#define USBFS_Dm_DM2 (* (reg8 *) USBFS_Dm__DM2) +/* Input Buffer Disable Override */ +#define USBFS_Dm_INP_DIS (* (reg8 *) USBFS_Dm__INP_DIS) +/* LCD Common or Segment Drive */ +#define USBFS_Dm_LCD_COM_SEG (* (reg8 *) USBFS_Dm__LCD_COM_SEG) +/* Enable Segment LCD */ +#define USBFS_Dm_LCD_EN (* (reg8 *) USBFS_Dm__LCD_EN) +/* Slew Rate Control */ +#define USBFS_Dm_SLW (* (reg8 *) USBFS_Dm__SLW) + +/* DSI Port Registers */ +/* Global DSI Select Register */ +#define USBFS_Dm_PRTDSI__CAPS_SEL (* (reg8 *) USBFS_Dm__PRTDSI__CAPS_SEL) +/* Double Sync Enable */ +#define USBFS_Dm_PRTDSI__DBL_SYNC_IN (* (reg8 *) USBFS_Dm__PRTDSI__DBL_SYNC_IN) +/* Output Enable Select Drive Strength */ +#define USBFS_Dm_PRTDSI__OE_SEL0 (* (reg8 *) USBFS_Dm__PRTDSI__OE_SEL0) +#define USBFS_Dm_PRTDSI__OE_SEL1 (* (reg8 *) USBFS_Dm__PRTDSI__OE_SEL1) +/* Port Pin Output Select Registers */ +#define USBFS_Dm_PRTDSI__OUT_SEL0 (* (reg8 *) USBFS_Dm__PRTDSI__OUT_SEL0) +#define USBFS_Dm_PRTDSI__OUT_SEL1 (* (reg8 *) USBFS_Dm__PRTDSI__OUT_SEL1) +/* Sync Output Enable Registers */ +#define USBFS_Dm_PRTDSI__SYNC_OUT (* (reg8 *) USBFS_Dm__PRTDSI__SYNC_OUT) + + +#if defined(USBFS_Dm__INTSTAT) /* Interrupt Registers */ + + #define USBFS_Dm_INTSTAT (* (reg8 *) USBFS_Dm__INTSTAT) + #define USBFS_Dm_SNAP (* (reg8 *) USBFS_Dm__SNAP) + +#endif /* Interrupt Registers */ + +#endif /* CY_PSOC5A... */ + +#endif /* CY_PINS_USBFS_Dm_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm_aliases.h new file mode 100755 index 00000000..bc4f686d --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dm_aliases.h @@ -0,0 +1,32 @@ +/******************************************************************************* +* File Name: USBFS_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_Dm_ALIASES_H) /* Pins USBFS_Dm_ALIASES_H */ +#define CY_PINS_USBFS_Dm_ALIASES_H + +#include "cytypes.h" +#include "cyfitter.h" + + + +/*************************************** +* Constants +***************************************/ +#define USBFS_Dm_0 USBFS_Dm__0__PC + +#endif /* End Pins USBFS_Dm_ALIASES_H */ + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.c new file mode 100755 index 00000000..304d5d61 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.c @@ -0,0 +1,137 @@ +/******************************************************************************* +* File Name: USBFS_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_Dp.h" + +/* APIs are not generated for P15[7:6] on PSoC 5 */ +#if !(CY_PSOC5A &&\ + USBFS_Dp__PORT == 15 && ((USBFS_Dp__MASK & 0xC0) != 0)) + + +/******************************************************************************* +* Function Name: USBFS_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_Dp_Write(uint8 value) +{ + uint8 staticBits = (USBFS_Dp_DR & (uint8)(~USBFS_Dp_MASK)); + USBFS_Dp_DR = staticBits | ((uint8)(value << USBFS_Dp_SHIFT) & USBFS_Dp_MASK); +} + + +/******************************************************************************* +* Function Name: USBFS_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_Dp_SetDriveMode(uint8 mode) +{ + CyPins_SetPinDriveMode(USBFS_Dp_0, mode); +} + + +/******************************************************************************* +* Function Name: USBFS_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_Dp_ReadPS calls this function. +* +*******************************************************************************/ +uint8 USBFS_Dp_Read(void) +{ + return (USBFS_Dp_PS & USBFS_Dp_MASK) >> USBFS_Dp_SHIFT; +} + + +/******************************************************************************* +* Function Name: USBFS_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_Dp_ReadDataReg(void) +{ + return (USBFS_Dp_DR & USBFS_Dp_MASK) >> USBFS_Dp_SHIFT; +} + + +/* If Interrupts Are Enabled for this Pins component */ +#if defined(USBFS_Dp_INTSTAT) + + /******************************************************************************* + * Function Name: USBFS_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_Dp_ClearInterrupt(void) + { + return (USBFS_Dp_INTSTAT & USBFS_Dp_MASK) >> USBFS_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_Dp.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.h new file mode 100755 index 00000000..2d03ad93 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp.h @@ -0,0 +1,130 @@ +/******************************************************************************* +* File Name: USBFS_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_Dp_H) /* Pins USBFS_Dp_H */ +#define CY_PINS_USBFS_Dp_H + +#include "cytypes.h" +#include "cyfitter.h" +#include "cypins.h" +#include "USBFS_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_Dp__PORT == 15 && ((USBFS_Dp__MASK & 0xC0) != 0)) + + +/*************************************** +* Function Prototypes +***************************************/ + +void USBFS_Dp_Write(uint8 value) ; +void USBFS_Dp_SetDriveMode(uint8 mode) ; +uint8 USBFS_Dp_ReadDataReg(void) ; +uint8 USBFS_Dp_Read(void) ; +uint8 USBFS_Dp_ClearInterrupt(void) ; + + +/*************************************** +* API Constants +***************************************/ + +/* Drive Modes */ +#define USBFS_Dp_DM_ALG_HIZ PIN_DM_ALG_HIZ +#define USBFS_Dp_DM_DIG_HIZ PIN_DM_DIG_HIZ +#define USBFS_Dp_DM_RES_UP PIN_DM_RES_UP +#define USBFS_Dp_DM_RES_DWN PIN_DM_RES_DWN +#define USBFS_Dp_DM_OD_LO PIN_DM_OD_LO +#define USBFS_Dp_DM_OD_HI PIN_DM_OD_HI +#define USBFS_Dp_DM_STRONG PIN_DM_STRONG +#define USBFS_Dp_DM_RES_UPDWN PIN_DM_RES_UPDWN + +/* Digital Port Constants */ +#define USBFS_Dp_MASK USBFS_Dp__MASK +#define USBFS_Dp_SHIFT USBFS_Dp__SHIFT +#define USBFS_Dp_WIDTH 1u + + +/*************************************** +* Registers +***************************************/ + +/* Main Port Registers */ +/* Pin State */ +#define USBFS_Dp_PS (* (reg8 *) USBFS_Dp__PS) +/* Data Register */ +#define USBFS_Dp_DR (* (reg8 *) USBFS_Dp__DR) +/* Port Number */ +#define USBFS_Dp_PRT_NUM (* (reg8 *) USBFS_Dp__PRT) +/* Connect to Analog Globals */ +#define USBFS_Dp_AG (* (reg8 *) USBFS_Dp__AG) +/* Analog MUX bux enable */ +#define USBFS_Dp_AMUX (* (reg8 *) USBFS_Dp__AMUX) +/* Bidirectional Enable */ +#define USBFS_Dp_BIE (* (reg8 *) USBFS_Dp__BIE) +/* Bit-mask for Aliased Register Access */ +#define USBFS_Dp_BIT_MASK (* (reg8 *) USBFS_Dp__BIT_MASK) +/* Bypass Enable */ +#define USBFS_Dp_BYP (* (reg8 *) USBFS_Dp__BYP) +/* Port wide control signals */ +#define USBFS_Dp_CTL (* (reg8 *) USBFS_Dp__CTL) +/* Drive Modes */ +#define USBFS_Dp_DM0 (* (reg8 *) USBFS_Dp__DM0) +#define USBFS_Dp_DM1 (* (reg8 *) USBFS_Dp__DM1) +#define USBFS_Dp_DM2 (* (reg8 *) USBFS_Dp__DM2) +/* Input Buffer Disable Override */ +#define USBFS_Dp_INP_DIS (* (reg8 *) USBFS_Dp__INP_DIS) +/* LCD Common or Segment Drive */ +#define USBFS_Dp_LCD_COM_SEG (* (reg8 *) USBFS_Dp__LCD_COM_SEG) +/* Enable Segment LCD */ +#define USBFS_Dp_LCD_EN (* (reg8 *) USBFS_Dp__LCD_EN) +/* Slew Rate Control */ +#define USBFS_Dp_SLW (* (reg8 *) USBFS_Dp__SLW) + +/* DSI Port Registers */ +/* Global DSI Select Register */ +#define USBFS_Dp_PRTDSI__CAPS_SEL (* (reg8 *) USBFS_Dp__PRTDSI__CAPS_SEL) +/* Double Sync Enable */ +#define USBFS_Dp_PRTDSI__DBL_SYNC_IN (* (reg8 *) USBFS_Dp__PRTDSI__DBL_SYNC_IN) +/* Output Enable Select Drive Strength */ +#define USBFS_Dp_PRTDSI__OE_SEL0 (* (reg8 *) USBFS_Dp__PRTDSI__OE_SEL0) +#define USBFS_Dp_PRTDSI__OE_SEL1 (* (reg8 *) USBFS_Dp__PRTDSI__OE_SEL1) +/* Port Pin Output Select Registers */ +#define USBFS_Dp_PRTDSI__OUT_SEL0 (* (reg8 *) USBFS_Dp__PRTDSI__OUT_SEL0) +#define USBFS_Dp_PRTDSI__OUT_SEL1 (* (reg8 *) USBFS_Dp__PRTDSI__OUT_SEL1) +/* Sync Output Enable Registers */ +#define USBFS_Dp_PRTDSI__SYNC_OUT (* (reg8 *) USBFS_Dp__PRTDSI__SYNC_OUT) + + +#if defined(USBFS_Dp__INTSTAT) /* Interrupt Registers */ + + #define USBFS_Dp_INTSTAT (* (reg8 *) USBFS_Dp__INTSTAT) + #define USBFS_Dp_SNAP (* (reg8 *) USBFS_Dp__SNAP) + +#endif /* Interrupt Registers */ + +#endif /* CY_PSOC5A... */ + +#endif /* CY_PINS_USBFS_Dp_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp_aliases.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp_aliases.h new file mode 100755 index 00000000..b77c3b9a --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_Dp_aliases.h @@ -0,0 +1,32 @@ +/******************************************************************************* +* File Name: USBFS_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_Dp_ALIASES_H) /* Pins USBFS_Dp_ALIASES_H */ +#define CY_PINS_USBFS_Dp_ALIASES_H + +#include "cytypes.h" +#include "cyfitter.h" + + + +/*************************************** +* Constants +***************************************/ +#define USBFS_Dp_0 USBFS_Dp__0__PC + +#endif /* End Pins USBFS_Dp_ALIASES_H */ + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.c new file mode 100755 index 00000000..cec388be --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.c @@ -0,0 +1,318 @@ +/******************************************************************************* +* File Name: USBFS_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.h" + +#if defined(USBFS_ENABLE_AUDIO_CLASS) + +#include "USBFS_audio.h" +#include "USBFS_pvt.h" +#if defined(USBFS_ENABLE_MIDI_STREAMING) + #include "USBFS_midi.h" +#endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + + +/*************************************** +* Custom Declarations +***************************************/ + +/* `#START CUSTOM_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +#if !defined(USER_SUPPLIED_AUDIO_HANDLER) + + +/*************************************** +* AUDIO Variables +***************************************/ + +#if defined(USBFS_ENABLE_AUDIO_STREAMING) + volatile uint8 USBFS_currentSampleFrequency[USBFS_MAX_EP][USBFS_SAMPLE_FREQ_LEN]; + volatile uint8 USBFS_frequencyChanged; + volatile uint8 USBFS_currentMute; + volatile uint8 USBFS_currentVolume[USBFS_VOLUME_LEN]; + volatile uint8 USBFS_minimumVolume[USBFS_VOLUME_LEN] = {USBFS_VOL_MIN_LSB, + USBFS_VOL_MIN_MSB}; + volatile uint8 USBFS_maximumVolume[USBFS_VOLUME_LEN] = {USBFS_VOL_MAX_LSB, + USBFS_VOL_MAX_MSB}; + volatile uint8 USBFS_resolutionVolume[USBFS_VOLUME_LEN] = {USBFS_VOL_RES_LSB, + USBFS_VOL_RES_MSB}; +#endif /* End USBFS_ENABLE_AUDIO_STREAMING */ + + +/******************************************************************************* +* Function Name: USBFS_DispatchAUDIOClassRqst +******************************************************************************** +* +* Summary: +* This routine dispatches class requests +* +* Parameters: +* None. +* +* Return: +* requestHandled +* +* Global variables: +* USBFS_currentSampleFrequency: Contains the current audio Sample +* Frequency. It is set by the Host using SET_CUR request to the endpoint. +* USBFS_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_frequencyChanged != 0) && +* (USBFS_transferState == USBFS_TRANS_STATE_IDLE)) +* { +* USBFS_frequencyChanged = 0; +* } +* USBFS_transferState variable is checked to be sure that +* transfer completes. +* USBFS_currentMute: Contains mute configuration set by Host. +* USBFS_currentVolume: Contains volume level set by Host. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_DispatchAUDIOClassRqst(void) +{ + uint8 requestHandled = USBFS_FALSE; + + #if defined(USBFS_ENABLE_AUDIO_STREAMING) + uint8 epNumber; + epNumber = CY_GET_REG8(USBFS_wIndexLo) & USBFS_DIR_UNUSED; + #endif /* End USBFS_ENABLE_AUDIO_STREAMING */ + + if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == USBFS_RQST_DIR_D2H) + { + /* Control Read */ + if((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) == \ + USBFS_RQST_RCPT_EP) + { + /* Endpoint */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_GET_CUR: + #if defined(USBFS_ENABLE_AUDIO_STREAMING) + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_SAMPLING_FREQ_CONTROL) + { + /* Endpoint Control Selector is Sampling Frequency */ + USBFS_currentTD.wCount = USBFS_SAMPLE_FREQ_LEN; + USBFS_currentTD.pData = USBFS_currentSampleFrequency[epNumber]; + requestHandled = USBFS_InitControlRead(); + } + #endif /* End USBFS_ENABLE_AUDIO_STREAMING */ + + /* `#START AUDIO_READ_REQUESTS` Place other request handler here */ + + /* `#END` */ + break; + default: + break; + } + } + else if((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) == \ + USBFS_RQST_RCPT_IFC) + { + /* Interface or Entity ID */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_GET_CUR: + #if defined(USBFS_ENABLE_AUDIO_STREAMING) + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_MUTE_CONTROL) + { + /* `#START MUTE_CONTROL_GET_REQUEST` Place multi-channel handler here */ + + /* `#END` */ + + /* Entity ID Control Selector is MUTE */ + USBFS_currentTD.wCount = 1u; + USBFS_currentTD.pData = &USBFS_currentMute; + requestHandled = USBFS_InitControlRead(); + } + else if(CY_GET_REG8(USBFS_wValueHi) == USBFS_VOLUME_CONTROL) + { + /* `#START VOLUME_CONTROL_GET_REQUEST` Place multi-channel handler here */ + + /* `#END` */ + + /* Entity ID Control Selector is VOLUME, */ + USBFS_currentTD.wCount = USBFS_VOLUME_LEN; + USBFS_currentTD.pData = USBFS_currentVolume; + requestHandled = USBFS_InitControlRead(); + } + else + { + /* `#START OTHER_GET_CUR_REQUESTS` Place other request handler here */ + + /* `#END` */ + } + break; + case USBFS_GET_MIN: /* GET_MIN */ + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_VOLUME_CONTROL) + { + /* Entity ID Control Selector is VOLUME, */ + USBFS_currentTD.wCount = USBFS_VOLUME_LEN; + USBFS_currentTD.pData = &USBFS_minimumVolume[0]; + requestHandled = USBFS_InitControlRead(); + } + break; + case USBFS_GET_MAX: /* GET_MAX */ + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_VOLUME_CONTROL) + { + /* Entity ID Control Selector is VOLUME, */ + USBFS_currentTD.wCount = USBFS_VOLUME_LEN; + USBFS_currentTD.pData = &USBFS_maximumVolume[0]; + requestHandled = USBFS_InitControlRead(); + } + break; + case USBFS_GET_RES: /* GET_RES */ + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_VOLUME_CONTROL) + { + /* Entity ID Control Selector is VOLUME, */ + USBFS_currentTD.wCount = USBFS_VOLUME_LEN; + USBFS_currentTD.pData = &USBFS_resolutionVolume[0]; + requestHandled = USBFS_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_GET_STAT: + USBFS_currentTD.wCount = 0u; + requestHandled = USBFS_InitControlWrite(); + + #endif /* End USBFS_ENABLE_AUDIO_STREAMING */ + + /* `#START AUDIO_WRITE_REQUESTS` Place other request handler here */ + + /* `#END` */ + break; + default: + break; + } + } + else + { /* USBFS_RQST_RCPT_OTHER */ + } + } + else if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == \ + USBFS_RQST_DIR_H2D) + { + /* Control Write */ + if((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) == \ + USBFS_RQST_RCPT_EP) + { + /* Endpoint */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_SET_CUR: + #if defined(USBFS_ENABLE_AUDIO_STREAMING) + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_SAMPLING_FREQ_CONTROL) + { + /* Endpoint Control Selector is Sampling Frequency */ + USBFS_currentTD.wCount = USBFS_SAMPLE_FREQ_LEN; + USBFS_currentTD.pData = USBFS_currentSampleFrequency[epNumber]; + requestHandled = USBFS_InitControlWrite(); + USBFS_frequencyChanged = epNumber; + } + #endif /* End USBFS_ENABLE_AUDIO_STREAMING */ + + /* `#START AUDIO_SAMPLING_FREQ_REQUESTS` Place other request handler here */ + + /* `#END` */ + break; + default: + break; + } + } + else if((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) == \ + USBFS_RQST_RCPT_IFC) + { + /* Interface or Entity ID */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_SET_CUR: + #if defined(USBFS_ENABLE_AUDIO_STREAMING) + if(CY_GET_REG8(USBFS_wValueHi) == USBFS_MUTE_CONTROL) + { + /* `#START MUTE_SET_REQUEST` Place multi-channel handler here */ + + /* `#END` */ + + /* Entity ID Control Selector is MUTE */ + USBFS_currentTD.wCount = 1u; + USBFS_currentTD.pData = &USBFS_currentMute; + requestHandled = USBFS_InitControlWrite(); + } + else if(CY_GET_REG8(USBFS_wValueHi) == USBFS_VOLUME_CONTROL) + { + /* `#START VOLUME_CONTROL_SET_REQUEST` Place multi-channel handler here */ + + /* `#END` */ + + /* Entity ID Control Selector is VOLUME */ + USBFS_currentTD.wCount = USBFS_VOLUME_LEN; + USBFS_currentTD.pData = USBFS_currentVolume; + requestHandled = USBFS_InitControlWrite(); + } + else + { + /* `#START OTHER_SET_CUR_REQUESTS` Place other request handler here */ + + /* `#END` */ + } + #endif /* End USBFS_ENABLE_AUDIO_STREAMING */ + + /* `#START AUDIO_CONTROL_SEL_REQUESTS` Place other request handler here */ + + /* `#END` */ + break; + default: + break; + } + } + else + { /* USBFS_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_ENABLE_AUDIO_CLASS*/ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.h new file mode 100755 index 00000000..1e6186bf --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_audio.h @@ -0,0 +1,95 @@ +/******************************************************************************* +* File Name: USBFS_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_audio_H) +#define CY_USBFS_USBFS_audio_H + +#include "cytypes.h" + + +/*************************************** +* Custom Declarations +***************************************/ + +/* `#START CUSTOM_CONSTANTS` Place your declaration here */ + +/* `#END` */ + + +/*************************************** +* Constants for USBFS_audio API. +***************************************/ + +/* Audio Class-Specific Request Codes (AUDIO Table A-9) */ +#define USBFS_REQUEST_CODE_UNDEFINED (0x00u) +#define USBFS_SET_CUR (0x01u) +#define USBFS_GET_CUR (0x81u) +#define USBFS_SET_MIN (0x02u) +#define USBFS_GET_MIN (0x82u) +#define USBFS_SET_MAX (0x03u) +#define USBFS_GET_MAX (0x83u) +#define USBFS_SET_RES (0x04u) +#define USBFS_GET_RES (0x84u) +#define USBFS_SET_MEM (0x05u) +#define USBFS_GET_MEM (0x85u) +#define USBFS_GET_STAT (0xFFu) + +/* Endpoint Control Selectors (AUDIO Table A-19) */ +#define USBFS_EP_CONTROL_UNDEFINED (0x00u) +#define USBFS_SAMPLING_FREQ_CONTROL (0x01u) +#define USBFS_PITCH_CONTROL (0x02u) + +/* Feature Unit Control Selectors (AUDIO Table A-11) */ +#define USBFS_FU_CONTROL_UNDEFINED (0x00u) +#define USBFS_MUTE_CONTROL (0x01u) +#define USBFS_VOLUME_CONTROL (0x02u) +#define USBFS_BASS_CONTROL (0x03u) +#define USBFS_MID_CONTROL (0x04u) +#define USBFS_TREBLE_CONTROL (0x05u) +#define USBFS_GRAPHIC_EQUALIZER_CONTROL (0x06u) +#define USBFS_AUTOMATIC_GAIN_CONTROL (0x07u) +#define USBFS_DELAY_CONTROL (0x08u) +#define USBFS_BASS_BOOST_CONTROL (0x09u) +#define USBFS_LOUDNESS_CONTROL (0x0Au) + +#define USBFS_SAMPLE_FREQ_LEN (3u) +#define USBFS_VOLUME_LEN (2u) + +#if !defined(USER_SUPPLIED_DEFAULT_VOLUME_VALUE) + #define USBFS_VOL_MIN_MSB (0x80u) + #define USBFS_VOL_MIN_LSB (0x01u) + #define USBFS_VOL_MAX_MSB (0x7Fu) + #define USBFS_VOL_MAX_LSB (0xFFu) + #define USBFS_VOL_RES_MSB (0x00u) + #define USBFS_VOL_RES_LSB (0x01u) +#endif /* USER_SUPPLIED_DEFAULT_VOLUME_VALUE */ + + +/*************************************** +* External data references +***************************************/ + +extern volatile uint8 USBFS_currentSampleFrequency[USBFS_MAX_EP] + [USBFS_SAMPLE_FREQ_LEN]; +extern volatile uint8 USBFS_frequencyChanged; +extern volatile uint8 USBFS_currentMute; +extern volatile uint8 USBFS_currentVolume[USBFS_VOLUME_LEN]; +extern volatile uint8 USBFS_minimumVolume[USBFS_VOLUME_LEN]; +extern volatile uint8 USBFS_maximumVolume[USBFS_VOLUME_LEN]; +extern volatile uint8 USBFS_resolutionVolume[USBFS_VOLUME_LEN]; + +#endif /* End CY_USBFS_USBFS_audio_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_boot.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_boot.c new file mode 100755 index 00000000..28430575 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_boot.c @@ -0,0 +1,262 @@ +/******************************************************************************* +* File Name: USBFS_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.h" + +#if defined(CYDEV_BOOTLOADER_IO_COMP) && ((CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS) || \ + (CYDEV_BOOTLOADER_IO_COMP == CyBtldr_Custom_Interface)) + + +/*************************************** +* Bootloader defines +***************************************/ + +#define USBFS_CyBtLdrStarttimer(X, T) {USBFS_universalTime = T * 10; X = 0u;} +#define USBFS_CyBtLdrChecktimer(X) ((X++ < USBFS_universalTime) ? 1u : 0u) + +#define USBFS_BTLDR_OUT_EP (0x01u) +#define USBFS_BTLDR_IN_EP (0x02u) + + +/*************************************** +* Bootloader Variables +***************************************/ + +static uint16 USBFS_universalTime; +static uint8 USBFS_started = 0u; + + +/******************************************************************************* +* Function Name: USBFS_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_CyBtldrCommStart(void) +{ + CyGlobalIntEnable; /* Enable Global Interrupts */ + + /*Start USBFS Operation/device 0 and with 5V or 3V operation depend on Voltage Configuration in DWR */ + USBFS_Start(0u, USBFS_DWR_VDDD_OPERATION); + + /* USB component started, the correct enumeration will be checked in first Read operation */ + USBFS_started = 1u; + +} + + +/******************************************************************************* +* Function Name: USBFS_CyBtldrCommStop. +******************************************************************************** +* +* Summary: +* Disable the component and disable the interrupt. +* +* Parameters: +* None. +* +* Return: +* None. +* +*******************************************************************************/ +void USBFS_CyBtldrCommStop(void) +{ + USBFS_Stop(); +} + + +/******************************************************************************* +* Function Name: USBFS_CyBtldrCommReset. +******************************************************************************** +* +* Summary: +* Resets the receive and transmit communication Buffers. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_CyBtldrCommReset(void) +{ + USBFS_EnableOutEP(USBFS_BTLDR_OUT_EP); /* Enable the OUT endpoint */ +} + + +/******************************************************************************* +* Function Name: USBFS_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_CyBtldrCommWrite(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL + +{ + uint16 time; + cystatus status; + + /* Enable IN transfer */ + USBFS_LoadInEP(USBFS_BTLDR_IN_EP, pData, USBFS_BTLDR_SIZEOF_READ_BUFFER); + + /* Start a timer to wait on. */ + USBFS_CyBtLdrStarttimer(time, timeOut); + + /* Wait for the master to read it. */ + while((USBFS_GetEPState(USBFS_BTLDR_IN_EP) == USBFS_IN_BUFFER_FULL) && \ + USBFS_CyBtLdrChecktimer(time)) + { + CyDelay(1u); /* 1ms delay */ + } + + if (USBFS_GetEPState(USBFS_BTLDR_IN_EP) == USBFS_IN_BUFFER_FULL) + { + status = CYRET_TIMEOUT; + } + else + { + *count = size; + status = CYRET_SUCCESS; + } + + return(status); +} + + +/******************************************************************************* +* Function Name: USBFS_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_CyBtldrCommRead(uint8 *pData, uint16 size, uint16 *count, uint8 timeOut) CYSMALL + +{ + cystatus status; + uint16 time; + + if(size > USBFS_BTLDR_SIZEOF_WRITE_BUFFER) + { + size = USBFS_BTLDR_SIZEOF_WRITE_BUFFER; + } + /* Start a timer to wait on. */ + USBFS_CyBtLdrStarttimer(time, timeOut); + + /* Wait on enumeration in first time */ + if(USBFS_started) + { + /* Wait for Device to enumerate */ + while(!USBFS_GetConfiguration() && USBFS_CyBtLdrChecktimer(time)) + { + CyDelay(1u); /* 1ms delay */ + } + /* Enable first OUT, if enumeration complete */ + if(USBFS_GetConfiguration()) + { + USBFS_IsConfigurationChanged(); /* Clear configuration changes state status */ + USBFS_CyBtldrCommReset(); + USBFS_started = 0u; + } + } + else /* Check for configuration changes, has been done by Host */ + { + if(USBFS_IsConfigurationChanged() != 0u) /* Host could send double SET_INTERFACE request or RESET */ + { + if(USBFS_GetConfiguration() != 0u) /* Init OUT endpoints when device reconfigured */ + { + USBFS_CyBtldrCommReset(); + } + } + } + /* Wait on next packet */ + while((USBFS_GetEPState(USBFS_BTLDR_OUT_EP) != USBFS_OUT_BUFFER_FULL) && \ + USBFS_CyBtLdrChecktimer(time)) + { + CyDelay(1u); /* 1ms delay */ + } + + /* OUT EP has completed */ + if (USBFS_GetEPState(USBFS_BTLDR_OUT_EP) == USBFS_OUT_BUFFER_FULL) + { + *count = USBFS_ReadOutEP(USBFS_BTLDR_OUT_EP, pData, size); + status = CYRET_SUCCESS; + } + else + { + *count = 0u; + status = CYRET_TIMEOUT; + } + return(status); +} + +#endif /* End CYDEV_BOOTLOADER_IO_COMP == CyBtldr_USBFS */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.c new file mode 100755 index 00000000..82951c8a --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.c @@ -0,0 +1,706 @@ +/******************************************************************************* +* File Name: USBFS_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.h" + +#if defined(USBFS_ENABLE_CDC_CLASS) + +#include "USBFS_cdc.h" +#include "USBFS_pvt.h" + + +/*************************************** +* CDC Variables +***************************************/ + +volatile uint8 USBFS_lineCoding[USBFS_LINE_CODING_SIZE]; +volatile uint8 USBFS_lineChanged; +volatile uint16 USBFS_lineControlBitmap; +volatile uint8 USBFS_cdc_data_in_ep; +volatile uint8 USBFS_cdc_data_out_ep; + + +/*************************************** +* Static Function Prototypes +***************************************/ +static uint16 USBFS_StrLen(const char8 string[]) ; + + +/*************************************** +* Custom Declarations +***************************************/ + +/* `#START CDC_CUSTOM_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +/******************************************************************************* +* Function Name: USBFS_DispatchCDCClassRqst +******************************************************************************** +* +* Summary: +* This routine dispatches CDC class requests. +* +* Parameters: +* None. +* +* Return: +* requestHandled +* +* Global variables: +* USBFS_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_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_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_DispatchCDCClassRqst(void) +{ + uint8 requestHandled = USBFS_FALSE; + + if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == USBFS_RQST_DIR_D2H) + { /* Control Read */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_CDC_GET_LINE_CODING: + USBFS_currentTD.count = USBFS_LINE_CODING_SIZE; + USBFS_currentTD.pData = USBFS_lineCoding; + requestHandled = USBFS_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_bmRequestType) & USBFS_RQST_DIR_MASK) == \ + USBFS_RQST_DIR_H2D) + { /* Control Write */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_CDC_SET_LINE_CODING: + USBFS_currentTD.count = USBFS_LINE_CODING_SIZE; + USBFS_currentTD.pData = USBFS_lineCoding; + USBFS_lineChanged |= USBFS_LINE_CODING_CHANGED; + requestHandled = USBFS_InitControlWrite(); + break; + + case USBFS_CDC_SET_CONTROL_LINE_STATE: + USBFS_lineControlBitmap = CY_GET_REG8(USBFS_wValueLo); + USBFS_lineChanged |= USBFS_LINE_CONTROL_CHANGED; + requestHandled = USBFS_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_ENABLE_CDC_CLASS_API != 0u) + + + /******************************************************************************* + * Function Name: USBFS_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_lineChanged: Initialized to zero. + * USBFS_cdc_data_out_ep: Used as an OUT endpoint number. + * + * Reentrant: + * No. + * + *******************************************************************************/ + void USBFS_CDC_Init(void) + { + USBFS_lineChanged = 0u; + USBFS_EnableOutEP(USBFS_cdc_data_out_ep); + } + + + /******************************************************************************* + * Function Name: USBFS_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_cdc_data_in_ep: CDC IN endpoint number used for sending + * data. + * + * Reentrant: + * No. + * + *******************************************************************************/ + void USBFS_PutData(const uint8* pData, uint16 length) + { + /* Limits length to maximum packet size for the EP */ + if(length > USBFS_EP[USBFS_cdc_data_in_ep].bufferSize) + { + /* Caution: Data will be lost if length is greater than Max Packet Length */ + length = USBFS_EP[USBFS_cdc_data_in_ep].bufferSize; + /* Halt CPU in debug mode */ + CYASSERT(0u != 0u); + } + USBFS_LoadInEP(USBFS_cdc_data_in_ep, pData, length); + } + + + /******************************************************************************* + * Function Name: USBFS_StrLen + ******************************************************************************** + * + * Summary: + * Calculates length of a null terminated string. + * + * Parameters: + * string: pointer to the string. + * + * Return: + * Length of the string + * + *******************************************************************************/ + static uint16 USBFS_StrLen(const char8 string[]) + { + uint16 len = 0u; + + while (string[len] != (char8)0) + { + len++; + } + + return (len); + } + + + /******************************************************************************* + * Function Name: USBFS_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_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_PutString(const char8 string[]) + { + uint16 str_length; + uint16 send_length; + uint16 buf_index = 0u; + + /* Get length of the null terminated string */ + str_length = USBFS_StrLen(string); + do + { + /* Limits length to maximum packet size for the EP */ + send_length = (str_length > USBFS_EP[USBFS_cdc_data_in_ep].bufferSize) ? + USBFS_EP[USBFS_cdc_data_in_ep].bufferSize : str_length; + /* Enable IN transfer */ + USBFS_LoadInEP(USBFS_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_EP[USBFS_cdc_data_in_ep].apiEpState == + USBFS_IN_BUFFER_FULL) + { + ; + } + } + }while(str_length > 0u); + } + + + /******************************************************************************* + * Function Name: USBFS_PutChar + ******************************************************************************** + * + * Summary: + * Writes a single character to the PC. + * + * Parameters: + * txDataByte: Character to be sent to the PC. + * + * Return: + * None. + * + * Global variables: + * USBFS_cdc_data_in_ep: CDC IN endpoint number used for sending + * data. + * + * Reentrant: + * No. + * + *******************************************************************************/ + void USBFS_PutChar(char8 txDataByte) + { + uint8 dataByte; + dataByte = (uint8)txDataByte; + + USBFS_LoadInEP(USBFS_cdc_data_in_ep, &dataByte, 1u); + } + + + /******************************************************************************* + * Function Name: USBFS_PutCRLF + ******************************************************************************** + * + * Summary: + * Sends a carriage return (0x0D) and line feed (0x0A) to the PC + * + * Parameters: + * None. + * + * Return: + * None. + * + * Global variables: + * USBFS_cdc_data_in_ep: CDC IN endpoint number used for sending + * data. + * + * Reentrant: + * No. + * + *******************************************************************************/ + void USBFS_PutCRLF(void) + { + const uint8 CYCODE txData[] = {0x0Du, 0x0Au}; + + USBFS_LoadInEP(USBFS_cdc_data_in_ep, (const uint8 *)txData, 2u); + } + + + /******************************************************************************* + * Function Name: USBFS_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_cdc_data_out_ep: CDC OUT endpoint number used. + * + *******************************************************************************/ + uint16 USBFS_GetCount(void) + { + uint16 bytesCount = 0u; + + if (USBFS_EP[USBFS_cdc_data_out_ep].apiEpState == USBFS_OUT_BUFFER_FULL) + { + bytesCount = USBFS_GetEPCount(USBFS_cdc_data_out_ep); + } + + return(bytesCount); + } + + + /******************************************************************************* + * Function Name: USBFS_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_cdc_data_out_ep: CDC OUT endpoint number used. + * + *******************************************************************************/ + uint8 USBFS_DataIsReady(void) + { + return(USBFS_EP[USBFS_cdc_data_out_ep].apiEpState); + } + + + /******************************************************************************* + * Function Name: USBFS_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_cdc_data_in_ep: CDC IN endpoint number used. + * + *******************************************************************************/ + uint8 USBFS_CDCIsReady(void) + { + return(USBFS_EP[USBFS_cdc_data_in_ep].apiEpState); + } + + + /******************************************************************************* + * Function Name: USBFS_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_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_cdc_data_out_ep: CDC OUT endpoint number used. + * + * Reentrant: + * No. + * + *******************************************************************************/ + uint16 USBFS_GetData(uint8* pData, uint16 length) + { + return(USBFS_ReadOutEP(USBFS_cdc_data_out_ep, pData, length)); + } + + + /******************************************************************************* + * Function Name: USBFS_GetAll + ******************************************************************************** + * + * Summary: + * Gets all bytes of received data from the input buffer and places it into a + * specified data array. USBFS_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_cdc_data_out_ep: CDC OUT endpoint number used. + * USBFS_EP[].bufferSize: EP max packet size is used as a length + * to read all data from the EP buffer. + * + * Reentrant: + * No. + * + *******************************************************************************/ + uint16 USBFS_GetAll(uint8* pData) + { + return (USBFS_ReadOutEP(USBFS_cdc_data_out_ep, pData, + USBFS_EP[USBFS_cdc_data_out_ep].bufferSize)); + } + + + /******************************************************************************* + * Function Name: USBFS_GetChar + ******************************************************************************** + * + * Summary: + * Reads one byte of received data from the buffer. + * + * Parameters: + * None. + * + * Return: + * Received one character. + * + * Global variables: + * USBFS_cdc_data_out_ep: CDC OUT endpoint number used. + * + * Reentrant: + * No. + * + *******************************************************************************/ + uint8 USBFS_GetChar(void) + { + uint8 rxData; + + (void) USBFS_ReadOutEP(USBFS_cdc_data_out_ep, &rxData, 1u); + + return(rxData); + } + + /******************************************************************************* + * Function Name: USBFS_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_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_lineChanged: used as a flag to be aware that Host has been + * sent request for changing Line Coding or Control Bitmap. + * + *******************************************************************************/ + uint8 USBFS_IsLineChanged(void) + { + uint8 state = 0u; + + /* transferState is checked to be sure then OUT data phase has been complete */ + if(USBFS_transferState == USBFS_TRANS_STATE_IDLE) + { + if(USBFS_lineChanged != 0u) + { + state = USBFS_lineChanged; + USBFS_lineChanged = 0u; + } + } + + return(state); + } + + + /******************************************************************************* + * Function Name: USBFS_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_lineCoding: First four bytes converted to uint32 + * depend on compiler, and returned as a data rate. + * + *******************************************************************************/ + uint32 USBFS_GetDTERate(void) + { + uint32 rate; + + rate = USBFS_lineCoding[USBFS_LINE_CODING_RATE + 3u]; + rate = (rate << 8u) | USBFS_lineCoding[USBFS_LINE_CODING_RATE + 2u]; + rate = (rate << 8u) | USBFS_lineCoding[USBFS_LINE_CODING_RATE + 1u]; + rate = (rate << 8u) | USBFS_lineCoding[USBFS_LINE_CODING_RATE]; + + return(rate); + } + + + /******************************************************************************* + * Function Name: USBFS_GetCharFormat + ******************************************************************************** + * + * Summary: + * Returns the number of stop bits. + * + * Parameters: + * None. + * + * Return: + * Returns the number of stop bits. + * + * Global variables: + * USBFS_lineCoding: used to get a parameter. + * + *******************************************************************************/ + uint8 USBFS_GetCharFormat(void) + { + return(USBFS_lineCoding[USBFS_LINE_CODING_STOP_BITS]); + } + + + /******************************************************************************* + * Function Name: USBFS_GetParityType + ******************************************************************************** + * + * Summary: + * Returns the parity type for the CDC port. + * + * Parameters: + * None. + * + * Return: + * Returns the parity type. + * + * Global variables: + * USBFS_lineCoding: used to get a parameter. + * + *******************************************************************************/ + uint8 USBFS_GetParityType(void) + { + return(USBFS_lineCoding[USBFS_LINE_CODING_PARITY]); + } + + + /******************************************************************************* + * Function Name: USBFS_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_lineCoding: used to get a parameter. + * + *******************************************************************************/ + uint8 USBFS_GetDataBits(void) + { + return(USBFS_lineCoding[USBFS_LINE_CODING_DATA_BITS]); + } + + + /******************************************************************************* + * Function Name: USBFS_GetLineControl + ******************************************************************************** + * + * Summary: + * Returns Line control bitmap. + * + * Parameters: + * None. + * + * Return: + * Returns Line control bitmap. + * + * Global variables: + * USBFS_lineControlBitmap: used to get a parameter. + * + *******************************************************************************/ + uint16 USBFS_GetLineControl(void) + { + return(USBFS_lineControlBitmap); + } + +#endif /* End USBFS_ENABLE_CDC_CLASS_API*/ + + +/******************************************************************************* +* Additional user functions supporting CDC Requests +********************************************************************************/ + +/* `#START CDC_FUNCTIONS` Place any additional functions here */ + +/* `#END` */ + +#endif /* End USBFS_ENABLE_CDC_CLASS*/ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.h new file mode 100755 index 00000000..334bc589 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.h @@ -0,0 +1,92 @@ +/******************************************************************************* +* File Name: USBFS_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_cdc_H) +#define CY_USBFS_USBFS_cdc_H + +#include "cytypes.h" + + +/*************************************** +* Prototypes of the USBFS_cdc API. +***************************************/ + +#if (USBFS_ENABLE_CDC_CLASS_API != 0u) + void USBFS_CDC_Init(void) ; + void USBFS_PutData(const uint8* pData, uint16 length) ; + void USBFS_PutString(const char8 string[]) ; + void USBFS_PutChar(char8 txDataByte) ; + void USBFS_PutCRLF(void) ; + uint16 USBFS_GetCount(void) ; + uint8 USBFS_CDCIsReady(void) ; + uint8 USBFS_DataIsReady(void) ; + uint16 USBFS_GetData(uint8* pData, uint16 length) ; + uint16 USBFS_GetAll(uint8* pData) ; + uint8 USBFS_GetChar(void) ; + uint8 USBFS_IsLineChanged(void) ; + uint32 USBFS_GetDTERate(void) ; + uint8 USBFS_GetCharFormat(void) ; + uint8 USBFS_GetParityType(void) ; + uint8 USBFS_GetDataBits(void) ; + uint16 USBFS_GetLineControl(void) ; +#endif /* End USBFS_ENABLE_CDC_CLASS_API*/ + + +/*************************************** +* Constants for USBFS_cdc API. +***************************************/ + +/* CDC Class-Specific Request Codes (CDC ver 1.2 Table 19) */ +#define USBFS_CDC_SET_LINE_CODING (0x20u) +#define USBFS_CDC_GET_LINE_CODING (0x21u) +#define USBFS_CDC_SET_CONTROL_LINE_STATE (0x22u) + +#define USBFS_LINE_CODING_CHANGED (0x01u) +#define USBFS_LINE_CONTROL_CHANGED (0x02u) + +#define USBFS_1_STOPBIT (0x00u) +#define USBFS_1_5_STOPBITS (0x01u) +#define USBFS_2_STOPBITS (0x02u) + +#define USBFS_PARITY_NONE (0x00u) +#define USBFS_PARITY_ODD (0x01u) +#define USBFS_PARITY_EVEN (0x02u) +#define USBFS_PARITY_MARK (0x03u) +#define USBFS_PARITY_SPACE (0x04u) + +#define USBFS_LINE_CODING_SIZE (0x07u) +#define USBFS_LINE_CODING_RATE (0x00u) +#define USBFS_LINE_CODING_STOP_BITS (0x04u) +#define USBFS_LINE_CODING_PARITY (0x05u) +#define USBFS_LINE_CODING_DATA_BITS (0x06u) + +#define USBFS_LINE_CONTROL_DTR (0x01u) +#define USBFS_LINE_CONTROL_RTS (0x02u) + + +/*************************************** +* External data references +***************************************/ + +extern volatile uint8 USBFS_lineCoding[USBFS_LINE_CODING_SIZE]; +extern volatile uint8 USBFS_lineChanged; +extern volatile uint16 USBFS_lineControlBitmap; +extern volatile uint8 USBFS_cdc_data_in_ep; +extern volatile uint8 USBFS_cdc_data_out_ep; + +#endif /* End CY_USBFS_USBFS_cdc_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.inf b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.inf new file mode 100755 index 00000000..c3477c28 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cdc.inf @@ -0,0 +1,122 @@ +;****************************************************************************** +; File Name: USBFS_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_cls.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cls.c new file mode 100755 index 00000000..7bbd8d11 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_cls.c @@ -0,0 +1,107 @@ +/******************************************************************************* +* File Name: USBFS_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.h" + +#if(USBFS_EXTERN_CLS == USBFS_FALSE) + +#include "USBFS_pvt.h" + + +/*************************************** +* User Implemented Class Driver Declarations. +***************************************/ +/* `#START USER_DEFINED_CLASS_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +/******************************************************************************* +* Function Name: USBFS_DispatchClassRqst +******************************************************************************** +* Summary: +* This routine dispatches class specific requests depend on interface class. +* +* Parameters: +* None. +* +* Return: +* requestHandled. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_DispatchClassRqst(void) +{ + uint8 requestHandled = USBFS_FALSE; + uint8 interfaceNumber = 0u; + + switch(CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) + { + case USBFS_RQST_RCPT_IFC: /* Class-specific request directed to an interface */ + interfaceNumber = CY_GET_REG8(USBFS_wIndexLo); /* wIndexLo contain Interface number */ + break; + case USBFS_RQST_RCPT_EP: /* Class-specific request directed to the endpoint */ + /* Find related interface to the endpoint, wIndexLo contain EP number */ + interfaceNumber = + USBFS_EP[CY_GET_REG8(USBFS_wIndexLo) & USBFS_DIR_UNUSED].interface; + break; + default: /* RequestHandled is initialized as FALSE by default */ + break; + } + /* Handle Class request depend on interface type */ + switch(USBFS_interfaceClass[interfaceNumber]) + { + case USBFS_CLASS_HID: + #if defined(USBFS_ENABLE_HID_CLASS) + requestHandled = USBFS_DispatchHIDClassRqst(); + #endif /* USBFS_ENABLE_HID_CLASS */ + break; + case USBFS_CLASS_AUDIO: + #if defined(USBFS_ENABLE_AUDIO_CLASS) + requestHandled = USBFS_DispatchAUDIOClassRqst(); + #endif /* USBFS_ENABLE_HID_CLASS */ + break; + case USBFS_CLASS_CDC: + #if defined(USBFS_ENABLE_CDC_CLASS) + requestHandled = USBFS_DispatchCDCClassRqst(); + #endif /* USBFS_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_EXTERN_CLS */ + + +/* [] 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 new file mode 100755 index 00000000..cce3cf39 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_descr.c @@ -0,0 +1,319 @@ +/******************************************************************************* +* File Name: USBFS_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.h" +#include "USBFS_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_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 */ 0x37u, 0x13u, +/* bcdDevice */ 0x00u, 0x30u, +/* iManufacturer */ 0x02u, +/* iProduct */ 0x01u, +/* iSerialNumber */ 0x80u, +/* bNumConfigurations */ 0x01u +}; +/********************************************************************* +* Config Descriptor +*********************************************************************/ +const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[41u] = { +/* Config Descriptor Length */ 0x09u, +/* DescriptorType: CONFIG */ 0x02u, +/* wTotalLength */ 0x29u, 0x00u, +/* bNumInterfaces */ 0x01u, +/* bConfigurationValue */ 0x01u, +/* iConfiguration */ 0x00u, +/* bmAttributes */ 0x80u, +/* bMaxPower */ 0xFAu, +/********************************************************************* +* Interface Descriptor +*********************************************************************/ +/* Interface Descriptor Length */ 0x09u, +/* DescriptorType: INTERFACE */ 0x04u, +/* bInterfaceNumber */ 0x00u, +/* 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 */ 0x01u, +/* bmAttributes */ 0x03u, +/* wMaxPacketSize */ 0x40u, 0x00u, +/* bInterval */ 0x80u, +/********************************************************************* +* Endpoint Descriptor +*********************************************************************/ +/* Endpoint Descriptor Length */ 0x07u, +/* DescriptorType: ENDPOINT */ 0x05u, +/* bEndpointAddress */ 0x82u, +/* bmAttributes */ 0x03u, +/* wMaxPacketSize */ 0x40u, 0x00u, +/* bInterval */ 0x80u +}; + +/********************************************************************* +* String Descriptor Table +*********************************************************************/ +const uint8 CYCODE USBFS_STRING_DESCRIPTORS[45u] = { +/********************************************************************* +* Language ID Descriptor +*********************************************************************/ +/* Descriptor Length */ 0x04u, +/* DescriptorType: STRING */ 0x03u, +/* Language Id */ 0x09u, 0x04u, +/********************************************************************* +* String Descriptor: "SCSI2SD" +*********************************************************************/ +/* Descriptor Length */ 0x10u, +/* DescriptorType: STRING */ 0x03u, + (uint8)'S', 0u,(uint8)'C', 0u,(uint8)'S', 0u,(uint8)'I', 0u,(uint8)'2', 0u, + (uint8)'S', 0u,(uint8)'D', 0u, +/********************************************************************* +* String Descriptor: "codesrc.com" +*********************************************************************/ +/* Descriptor Length */ 0x18u, +/* DescriptorType: STRING */ 0x03u, + (uint8)'c', 0u,(uint8)'o', 0u,(uint8)'d', 0u,(uint8)'e', 0u,(uint8)'s', 0u, + (uint8)'r', 0u,(uint8)'c', 0u,(uint8)'.', 0u,(uint8)'c', 0u,(uint8)'o', 0u, + (uint8)'m', 0u, +/*********************************************************************/ +/* Marks the end of the list. */ 0x00u}; +/*********************************************************************/ + +/********************************************************************* +* Serial Number String Descriptor +*********************************************************************/ +const uint8 CYCODE USBFS_SN_STRING_DESCRIPTOR[10] = { +/* Descriptor Length */ 0x0Au, +/* DescriptorType: STRING */ 0x03u, +(uint8)'1', 0u,(uint8)'2', 0u,(uint8)'3', 0u,(uint8)'4', 0u +}; + +/********************************************************************* +* HID Report Descriptor: Generic HID +*********************************************************************/ +const uint8 CYCODE USBFS_HIDREPORT_DESCRIPTOR1[40u] = { +/* Descriptor Size (Not part of descriptor)*/ USBFS_HID_RPT_1_SIZE_LSB, +USBFS_HID_RPT_1_SIZE_MSB, +/* USAGE_PAGE */ 0x05u, 0x01u, +/* USAGE */ 0x09u, 0x00u, +/* COLLECTION */ 0xA1u, 0x00u, +/* USAGE */ 0x09u, 0x00u, +/* COLLECTION */ 0xA1u, 0x00u, +/* USAGE */ 0x09u, 0x00u, +/* LOGICAL_MINIMUM */ 0x15u, 0x00u, +/* LOGICAL_MAXIMUM */ 0x25u, 0xFFu, +/* REPORT_SIZE */ 0x75u, 0x08u, +/* REPORT_COUNT */ 0x95u, 0x40u, +/* OUTPUT */ 0x91u, 0x02u, +/* USAGE */ 0x09u, 0x00u, +/* LOGICAL_MINIMUM */ 0x15u, 0x00u, +/* LOGICAL_MAXIMUM */ 0x25u, 0xFFu, +/* REPORT_SIZE */ 0x75u, 0x08u, +/* REPORT_COUNT */ 0x95u, 0x40u, +/* INPUT */ 0x81u, 0x02u, +/* END_COLLECTION */ 0xC0u, +/* END_COLLECTION */ 0xC0u, +/*********************************************************************/ +/* End of the HID Report Descriptor */ 0x00u, 0x00u}; +/*********************************************************************/ + +#if !defined(USER_DEFINE_USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_HID_RPT_STORAGE) +/********************************************************************* +* HID Input Report Storage +*********************************************************************/ +T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_RPT_SCB; +uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF_SIZE]; + +/********************************************************************* +* HID Input Report TD Table +*********************************************************************/ +const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_RPT_TABLE[1u] = { + {USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF_SIZE, + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF[0u], + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_RPT_SCB}, +}; +/********************************************************************* +* HID Output Report Storage +*********************************************************************/ +T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_RPT_SCB; +uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF_SIZE]; + +/********************************************************************* +* HID Output Report TD Table +*********************************************************************/ +const T_USBFS_TD CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_RPT_TABLE[1u] = { + {USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF_SIZE, + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_BUF[0u], + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_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_INTERFACE0_ALTERNATE0_HID_TABLE[5u] = { + {0x00u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_RPT_TABLE}, + {0x00u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_OUT_RPT_TABLE}, + {0x00u, NULL}, + {0x01u, (const void *)&USBFS_HIDREPORT_DESCRIPTOR1[0]}, + {0x01u, (const void *)&USBFS_DEVICE0_CONFIGURATION0_DESCR[18]} +}; +#endif /* USER_DEFINE_USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_HID_RPT_STORAGE */ + +/********************************************************************* +* Interface Dispatch Table -- Points to the Class Dispatch Tables +*********************************************************************/ +const T_USBFS_LUT CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_TABLE[1u] = { + {USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_COUNT, + &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_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] = { +/* IFC ALT EPAddr bmAttr MaxPktSize Class ********************/ +{0x00u, 0x00u, 0x01u, 0x03u, 0x0040u, 0x03u}, +{0x00u, 0x00u, 0x82u, 0x03u, 0x0040u, 0x03u} +}; +const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS[1u] = { +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] = { + {0x01u, &USBFS_DEVICE0_CONFIGURATION0_DESCR}, + {0x02u, &USBFS_DEVICE0_CONFIGURATION0_EP_SETTINGS_TABLE}, + {0x01u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_TABLE}, + {0x00u, &USBFS_DEVICE0_CONFIGURATION0_INTERFACE_CLASS} +}; +/********************************************************************* +* Device Dispatch Table -- Points to the Device Descriptor and each of +* and Configuration Tables for this Device +*********************************************************************/ +const T_USBFS_LUT CYCODE USBFS_DEVICE0_TABLE[2u] = { + {0x01u, &USBFS_DEVICE0_DESCR}, + {0x01u, &USBFS_DEVICE0_CONFIGURATION0_TABLE} +}; +/********************************************************************* +* Device Table -- Indexed by the device number. +*********************************************************************/ +const T_USBFS_LUT CYCODE USBFS_TABLE[1u] = { + {0x01u, &USBFS_DEVICE0_TABLE} +}; + +#endif /* USER_SUPPLIED_DESCRIPTORS */ + +#if defined(USBFS_ENABLE_MSOS_STRING) + + /****************************************************************************** + * USB Microsoft OS String Descriptor + * "MSFT" identifies a Microsoft host + * "100" specifies version 1.00 + * USBFS_GET_EXTENDED_CONFIG_DESCRIPTOR becomes the bRequest value + * in a host vendor device/class request + ******************************************************************************/ + + const uint8 CYCODE USBFS_MSOS_DESCRIPTOR[USBFS_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_GET_EXTENDED_CONFIG_DESCRIPTOR, + /* bPad */ 0x00u + }; + + /* Extended Configuration Descriptor */ + + const uint8 CYCODE USBFS_MSOS_CONFIGURATION_DESCR[USBFS_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_ENABLE_MSOS_STRING */ + +/* DIE ID string descriptor for 8 bytes ID */ +#if defined(USBFS_ENABLE_IDSN_STRING) + uint8 USBFS_idSerialNumberStringDescriptor[USBFS_IDSN_DESCR_LENGTH]; +#endif /* USBFS_ENABLE_IDSN_STRING */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_drv.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_drv.c new file mode 100755 index 00000000..e78a41b2 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_drv.c @@ -0,0 +1,781 @@ +/******************************************************************************* +* File Name: USBFS_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.h" +#include "USBFS_pvt.h" + + +/*************************************** +* Global data allocation +***************************************/ + +volatile T_USBFS_EP_CTL_BLOCK USBFS_EP[USBFS_MAX_EP]; +volatile uint8 USBFS_configuration; +volatile uint8 USBFS_interfaceNumber; +volatile uint8 USBFS_configurationChanged; +volatile uint8 USBFS_deviceAddress; +volatile uint8 USBFS_deviceStatus; +volatile uint8 USBFS_interfaceSetting[USBFS_MAX_INTERFACES_NUMBER]; +volatile uint8 USBFS_interfaceSetting_last[USBFS_MAX_INTERFACES_NUMBER]; +volatile uint8 USBFS_interfaceStatus[USBFS_MAX_INTERFACES_NUMBER]; +volatile uint8 USBFS_device; +const uint8 CYCODE *USBFS_interfaceClass; + + +/*************************************** +* Local data allocation +***************************************/ + +volatile uint8 USBFS_ep0Toggle; +volatile uint8 USBFS_lastPacketSize; +volatile uint8 USBFS_transferState; +volatile T_USBFS_TD USBFS_currentTD; +volatile uint8 USBFS_ep0Mode; +volatile uint8 USBFS_ep0Count; +volatile uint16 USBFS_transferByteCount; + + +/******************************************************************************* +* Function Name: USBFS_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_EP_0_ISR) +{ + uint8 bRegTemp; + uint8 modifyReg; + + + bRegTemp = CY_GET_REG8(USBFS_EP0_CR_PTR); + if ((bRegTemp & USBFS_MODE_ACKD) != 0u) + { + modifyReg = 1u; + if ((bRegTemp & USBFS_MODE_SETUP_RCVD) != 0u) + { + if((bRegTemp & USBFS_MODE_MASK) != USBFS_MODE_NAK_IN_OUT) + { + modifyReg = 0u; /* When mode not NAK_IN_OUT => invalid setup */ + } + else + { + USBFS_HandleSetup(); + if((USBFS_ep0Mode & USBFS_MODE_SETUP_RCVD) != 0u) + { + modifyReg = 0u; /* if SETUP bit set -> exit without modifying the mode */ + } + + } + } + else if ((bRegTemp & USBFS_MODE_IN_RCVD) != 0u) + { + USBFS_HandleIN(); + } + else if ((bRegTemp & USBFS_MODE_OUT_RCVD) != 0u) + { + USBFS_HandleOUT(); + } + else + { + modifyReg = 0u; + } + if(modifyReg != 0u) + { + bRegTemp = CY_GET_REG8(USBFS_EP0_CR_PTR); /* unlock registers */ + if((bRegTemp & USBFS_MODE_SETUP_RCVD) == 0u) /* Check if SETUP bit is not set, otherwise exit */ + { + /* Update the count register */ + bRegTemp = USBFS_ep0Toggle | USBFS_ep0Count; + CY_SET_REG8(USBFS_EP0_CNT_PTR, bRegTemp); + if(bRegTemp == CY_GET_REG8(USBFS_EP0_CNT_PTR)) /* continue if writing was successful */ + { + do + { + modifyReg = USBFS_ep0Mode; /* Init temporary variable */ + /* Unlock registers */ + bRegTemp = CY_GET_REG8(USBFS_EP0_CR_PTR) & USBFS_MODE_SETUP_RCVD; + if(bRegTemp == 0u) /* Check if SETUP bit is not set */ + { + /* Set the Mode Register */ + CY_SET_REG8(USBFS_EP0_CR_PTR, USBFS_ep0Mode); + /* Writing check */ + modifyReg = CY_GET_REG8(USBFS_EP0_CR_PTR) & USBFS_MODE_MASK; + } + }while(modifyReg != USBFS_ep0Mode); /* Repeat if writing was not successful */ + } + } + } + } +} + + +/******************************************************************************* +* Function Name: USBFS_HandleSetup +******************************************************************************** +* +* Summary: +* This Routine dispatches requests for the four USB request types +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_HandleSetup(void) +{ + uint8 requestHandled; + + requestHandled = CY_GET_REG8(USBFS_EP0_CR_PTR); /* unlock registers */ + CY_SET_REG8(USBFS_EP0_CR_PTR, requestHandled); /* clear setup bit */ + requestHandled = CY_GET_REG8(USBFS_EP0_CR_PTR); /* reread register */ + if((requestHandled & USBFS_MODE_SETUP_RCVD) != 0u) + { + USBFS_ep0Mode = requestHandled; /* if SETUP bit set -> exit without modifying the mode */ + } + else + { + /* In case the previous transfer did not complete, close it out */ + USBFS_UpdateStatusBlock(USBFS_XFER_PREMATURE); + + switch (CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_TYPE_MASK) + { + case USBFS_RQST_TYPE_STD: + requestHandled = USBFS_HandleStandardRqst(); + break; + case USBFS_RQST_TYPE_CLS: + requestHandled = USBFS_DispatchClassRqst(); + break; + case USBFS_RQST_TYPE_VND: + requestHandled = USBFS_HandleVendorRqst(); + break; + default: + requestHandled = USBFS_FALSE; + break; + } + if (requestHandled == USBFS_FALSE) + { + USBFS_ep0Mode = USBFS_MODE_STALL_IN_OUT; + } + } +} + + +/******************************************************************************* +* Function Name: USBFS_HandleIN +******************************************************************************** +* +* Summary: +* This routine handles EP0 IN transfers. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_HandleIN(void) +{ + switch (USBFS_transferState) + { + case USBFS_TRANS_STATE_IDLE: + break; + case USBFS_TRANS_STATE_CONTROL_READ: + USBFS_ControlReadDataStage(); + break; + case USBFS_TRANS_STATE_CONTROL_WRITE: + USBFS_ControlWriteStatusStage(); + break; + case USBFS_TRANS_STATE_NO_DATA_CONTROL: + USBFS_NoDataControlStatusStage(); + break; + default: /* there are no more states */ + break; + } +} + + +/******************************************************************************* +* Function Name: USBFS_HandleOUT +******************************************************************************** +* +* Summary: +* This routine handles EP0 OUT transfers. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_HandleOUT(void) +{ + switch (USBFS_transferState) + { + case USBFS_TRANS_STATE_IDLE: + break; + case USBFS_TRANS_STATE_CONTROL_READ: + USBFS_ControlReadStatusStage(); + break; + case USBFS_TRANS_STATE_CONTROL_WRITE: + USBFS_ControlWriteDataStage(); + break; + case USBFS_TRANS_STATE_NO_DATA_CONTROL: + /* Update the completion block */ + USBFS_UpdateStatusBlock(USBFS_XFER_ERROR); + /* We expect no more data, so stall INs and OUTs */ + USBFS_ep0Mode = USBFS_MODE_STALL_IN_OUT; + break; + default: /* There are no more states */ + break; + } +} + + +/******************************************************************************* +* Function Name: USBFS_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_transferByteCount - Update the transfer byte count from the +* last transaction. +* USBFS_ep0Count - counts the data loaded to the SIE memory in +* current packet. +* USBFS_lastPacketSize - remembers the USBFS_ep0Count value for the +* next packet. +* USBFS_transferByteCount - sum of the previous bytes transferred +* on previous packets(sum of USBFS_lastPacketSize) +* USBFS_ep0Toggle - inverted +* USBFS_ep0Mode - prepare for mode register content. +* USBFS_transferState - set to TRANS_STATE_CONTROL_READ +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_LoadEP0(void) +{ + uint8 ep0Count = 0u; + + /* Update the transfer byte count from the last transaction */ + USBFS_transferByteCount += USBFS_lastPacketSize; + /* Now load the next transaction */ + while ((USBFS_currentTD.count > 0u) && (ep0Count < 8u)) + { + CY_SET_REG8((reg8 *)(USBFS_EP0_DR0_IND + ep0Count), *USBFS_currentTD.pData); + USBFS_currentTD.pData = &USBFS_currentTD.pData[1u]; + ep0Count++; + USBFS_currentTD.count--; + } + /* Support zero-length packet*/ + if( (USBFS_lastPacketSize == 8u) || (ep0Count > 0u) ) + { + /* Update the data toggle */ + USBFS_ep0Toggle ^= USBFS_EP0_CNT_DATA_TOGGLE; + /* Set the Mode Register */ + USBFS_ep0Mode = USBFS_MODE_ACK_IN_STATUS_OUT; + /* Update the state (or stay the same) */ + USBFS_transferState = USBFS_TRANS_STATE_CONTROL_READ; + } + else + { + /* Expect Status Stage Out */ + USBFS_ep0Mode = USBFS_MODE_STATUS_OUT_ONLY; + /* Update the state (or stay the same) */ + USBFS_transferState = USBFS_TRANS_STATE_CONTROL_READ; + } + + /* Save the packet size for next time */ + USBFS_lastPacketSize = ep0Count; + USBFS_ep0Count = ep0Count; +} + + +/******************************************************************************* +* Function Name: USBFS_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_currentTD.count - counts of data to be sent. +* USBFS_currentTD.pData - data pointer. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_InitControlRead(void) +{ + uint16 xferCount; + if(USBFS_currentTD.count == 0u) + { + (void) USBFS_InitZeroLengthControlTransfer(); + } + else + { + /* Set up the state machine */ + USBFS_transferState = USBFS_TRANS_STATE_CONTROL_READ; + /* Set the toggle, it gets updated in LoadEP */ + USBFS_ep0Toggle = 0u; + /* Initialize the Status Block */ + USBFS_InitializeStatusBlock(); + xferCount = (((uint16)CY_GET_REG8(USBFS_lengthHi) << 8u) | (CY_GET_REG8(USBFS_lengthLo))); + + if (USBFS_currentTD.count > xferCount) + { + USBFS_currentTD.count = xferCount; + } + USBFS_LoadEP0(); + } + + return(USBFS_TRUE); +} + + +/******************************************************************************* +* Function Name: USBFS_InitZeroLengthControlTransfer +******************************************************************************** +* +* Summary: +* Initialize a zero length data IN transfer. +* +* Parameters: +* None. +* +* Return: +* requestHandled state. +* +* Global variables: +* USBFS_ep0Toggle - set to EP0_CNT_DATA_TOGGLE +* USBFS_ep0Mode - prepare for mode register content. +* USBFS_transferState - set to TRANS_STATE_CONTROL_READ +* USBFS_ep0Count - cleared, means the zero-length packet. +* USBFS_lastPacketSize - cleared. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_InitZeroLengthControlTransfer(void) + +{ + /* Update the state */ + USBFS_transferState = USBFS_TRANS_STATE_CONTROL_READ; + /* Set the data toggle */ + USBFS_ep0Toggle = USBFS_EP0_CNT_DATA_TOGGLE; + /* Set the Mode Register */ + USBFS_ep0Mode = USBFS_MODE_ACK_IN_STATUS_OUT; + /* Save the packet size for next time */ + USBFS_lastPacketSize = 0u; + USBFS_ep0Count = 0u; + + return(USBFS_TRUE); +} + + +/******************************************************************************* +* Function Name: USBFS_ControlReadDataStage +******************************************************************************** +* +* Summary: +* Handle the Data Stage of a control read transfer. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_ControlReadDataStage(void) + +{ + USBFS_LoadEP0(); +} + + +/******************************************************************************* +* Function Name: USBFS_ControlReadStatusStage +******************************************************************************** +* +* Summary: +* Handle the Status Stage of a control read transfer. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Global variables: +* USBFS_USBFS_transferByteCount - updated with last packet size. +* USBFS_transferState - set to TRANS_STATE_IDLE. +* USBFS_ep0Mode - set to MODE_STALL_IN_OUT. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_ControlReadStatusStage(void) +{ + /* Update the transfer byte count */ + USBFS_transferByteCount += USBFS_lastPacketSize; + /* Go Idle */ + USBFS_transferState = USBFS_TRANS_STATE_IDLE; + /* Update the completion block */ + USBFS_UpdateStatusBlock(USBFS_XFER_STATUS_ACK); + /* We expect no more data, so stall INs and OUTs */ + USBFS_ep0Mode = USBFS_MODE_STALL_IN_OUT; +} + + +/******************************************************************************* +* Function Name: USBFS_InitControlWrite +******************************************************************************** +* +* Summary: +* Initialize a control write transaction +* +* Parameters: +* None. +* +* Return: +* requestHandled state. +* +* Global variables: +* USBFS_USBFS_transferState - set to TRANS_STATE_CONTROL_WRITE +* USBFS_ep0Toggle - set to EP0_CNT_DATA_TOGGLE +* USBFS_ep0Mode - set to MODE_ACK_OUT_STATUS_IN +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_InitControlWrite(void) +{ + uint16 xferCount; + + /* Set up the state machine */ + USBFS_transferState = USBFS_TRANS_STATE_CONTROL_WRITE; + /* This might not be necessary */ + USBFS_ep0Toggle = USBFS_EP0_CNT_DATA_TOGGLE; + /* Initialize the Status Block */ + USBFS_InitializeStatusBlock(); + + xferCount = (((uint16)CY_GET_REG8(USBFS_lengthHi) << 8u) | (CY_GET_REG8(USBFS_lengthLo))); + + if (USBFS_currentTD.count > xferCount) + { + USBFS_currentTD.count = xferCount; + } + + /* Expect Data or Status Stage */ + USBFS_ep0Mode = USBFS_MODE_ACK_OUT_STATUS_IN; + + return(USBFS_TRUE); +} + + +/******************************************************************************* +* Function Name: USBFS_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_transferByteCount - Update the transfer byte count from the +* last transaction. +* USBFS_ep0Count - counts the data loaded from the SIE memory +* in current packet. +* USBFS_transferByteCount - sum of the previous bytes transferred +* on previous packets(sum of USBFS_lastPacketSize) +* USBFS_ep0Toggle - inverted +* USBFS_ep0Mode - set to MODE_ACK_OUT_STATUS_IN. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_ControlWriteDataStage(void) +{ + uint8 ep0Count; + uint8 regIndex = 0u; + + ep0Count = (CY_GET_REG8(USBFS_EP0_CNT_PTR) & USBFS_EPX_CNT0_MASK) - + USBFS_EPX_CNTX_CRC_COUNT; + + USBFS_transferByteCount += ep0Count; + + while ((USBFS_currentTD.count > 0u) && (ep0Count > 0u)) + { + *USBFS_currentTD.pData = CY_GET_REG8((reg8 *)(USBFS_EP0_DR0_IND + regIndex)); + USBFS_currentTD.pData = &USBFS_currentTD.pData[1u]; + regIndex++; + ep0Count--; + USBFS_currentTD.count--; + } + USBFS_ep0Count = ep0Count; + /* Update the data toggle */ + USBFS_ep0Toggle ^= USBFS_EP0_CNT_DATA_TOGGLE; + /* Expect Data or Status Stage */ + USBFS_ep0Mode = USBFS_MODE_ACK_OUT_STATUS_IN; +} + + +/******************************************************************************* +* Function Name: USBFS_ControlWriteStatusStage +******************************************************************************** +* +* Summary: +* Handle the Status Stage of a control write transfer +* +* Parameters: +* None. +* +* Return: +* None. +* +* Global variables: +* USBFS_transferState - set to TRANS_STATE_IDLE. +* USBFS_USBFS_ep0Mode - set to MODE_STALL_IN_OUT. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_ControlWriteStatusStage(void) +{ + /* Go Idle */ + USBFS_transferState = USBFS_TRANS_STATE_IDLE; + /* Update the completion block */ + USBFS_UpdateStatusBlock(USBFS_XFER_STATUS_ACK); + /* We expect no more data, so stall INs and OUTs */ + USBFS_ep0Mode = USBFS_MODE_STALL_IN_OUT; +} + + +/******************************************************************************* +* Function Name: USBFS_InitNoDataControlTransfer +******************************************************************************** +* +* Summary: +* Initialize a no data control transfer +* +* Parameters: +* None. +* +* Return: +* requestHandled state. +* +* Global variables: +* USBFS_transferState - set to TRANS_STATE_NO_DATA_CONTROL. +* USBFS_ep0Mode - set to MODE_STATUS_IN_ONLY. +* USBFS_ep0Count - cleared. +* USBFS_ep0Toggle - set to EP0_CNT_DATA_TOGGLE +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_InitNoDataControlTransfer(void) +{ + USBFS_transferState = USBFS_TRANS_STATE_NO_DATA_CONTROL; + USBFS_ep0Mode = USBFS_MODE_STATUS_IN_ONLY; + USBFS_ep0Toggle = USBFS_EP0_CNT_DATA_TOGGLE; + USBFS_ep0Count = 0u; + + return(USBFS_TRUE); +} + + +/******************************************************************************* +* Function Name: USBFS_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_transferState - set to TRANS_STATE_IDLE. +* USBFS_ep0Mode - set to MODE_STALL_IN_OUT. +* USBFS_ep0Toggle - set to EP0_CNT_DATA_TOGGLE +* USBFS_deviceAddress - used to set new address and cleared +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_NoDataControlStatusStage(void) +{ + /* Change the USB address register if we got a SET_ADDRESS. */ + if (USBFS_deviceAddress != 0u) + { + CY_SET_REG8(USBFS_CR0_PTR, USBFS_deviceAddress | USBFS_CR0_ENABLE); + USBFS_deviceAddress = 0u; + } + /* Go Idle */ + USBFS_transferState = USBFS_TRANS_STATE_IDLE; + /* Update the completion block */ + USBFS_UpdateStatusBlock(USBFS_XFER_STATUS_ACK); + /* We expect no more data, so stall INs and OUTs */ + USBFS_ep0Mode = USBFS_MODE_STALL_IN_OUT; +} + + +/******************************************************************************* +* Function Name: USBFS_UpdateStatusBlock +******************************************************************************** +* +* Summary: +* Update the Completion Status Block for a Request. The block is updated +* with the completion code the USBFS_transferByteCount. The +* StatusBlock Pointer is set to NULL. +* +* Parameters: +* completionCode - status. +* +* Return: +* None. +* +* Global variables: +* USBFS_currentTD.pStatusBlock->status - updated by the +* completionCode parameter. +* USBFS_currentTD.pStatusBlock->length - updated. +* USBFS_currentTD.pStatusBlock - cleared. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_UpdateStatusBlock(uint8 completionCode) +{ + if (USBFS_currentTD.pStatusBlock != NULL) + { + USBFS_currentTD.pStatusBlock->status = completionCode; + USBFS_currentTD.pStatusBlock->length = USBFS_transferByteCount; + USBFS_currentTD.pStatusBlock = NULL; + } +} + + +/******************************************************************************* +* Function Name: USBFS_InitializeStatusBlock +******************************************************************************** +* +* Summary: +* Initialize the Completion Status Block for a Request. The completion +* code is set to USB_XFER_IDLE. +* +* Also, initializes USBFS_transferByteCount. Save some space, +* this is the only consumer. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Global variables: +* USBFS_currentTD.pStatusBlock->status - set to XFER_IDLE. +* USBFS_currentTD.pStatusBlock->length - cleared. +* USBFS_transferByteCount - cleared. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_InitializeStatusBlock(void) +{ + USBFS_transferByteCount = 0u; + if(USBFS_currentTD.pStatusBlock != NULL) + { + USBFS_currentTD.pStatusBlock->status = USBFS_XFER_IDLE; + USBFS_currentTD.pStatusBlock->length = 0u; + } +} + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_episr.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_episr.c new file mode 100755 index 00000000..cd88e929 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_episr.c @@ -0,0 +1,658 @@ +/******************************************************************************* +* File Name: USBFS_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.h" +#include "USBFS_pvt.h" +#if defined(USBFS_ENABLE_MIDI_STREAMING) && (USBFS_ENABLE_MIDI_API != 0u) + #include "USBFS_midi.h" +#endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + + +/*************************************** +* Custom Declarations +***************************************/ +/* `#START CUSTOM_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +#if(USBFS_EP1_ISR_REMOVE == 0u) + + + /****************************************************************************** + * Function Name: USBFS_EP_1_ISR + ******************************************************************************* + * + * Summary: + * Endpoint 1 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + ******************************************************************************/ + CY_ISR(USBFS_EP_1_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + + /* `#START EP1_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + + CY_GET_REG8(USBFS_SIE_EP1_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP1].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP1].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP1].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) & + (uint8)~USBFS_SIE_EP_INT_EP1_MASK); + + #if( defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT ) + if(USBFS_midi_out_ep == USBFS_EP1) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP1_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if ( defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 ) + EA = int_en; + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + } + +#endif /* End USBFS_EP1_ISR_REMOVE */ + + +#if(USBFS_EP2_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_2_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 2 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_2_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + + /* `#START EP2_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 ) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + + CY_GET_REG8(USBFS_SIE_EP2_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP2].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP2].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP2].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP2_MASK); + + #if( defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT ) + if(USBFS_midi_out_ep == USBFS_EP2) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP2_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + } + +#endif /* End USBFS_EP2_ISR_REMOVE */ + + +#if(USBFS_EP3_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_3_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 3 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_3_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3 */ + + /* `#START EP3_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + CY_GET_REG8(USBFS_SIE_EP3_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP3].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP3].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP3].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP3_MASK); + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT) + if(USBFS_midi_out_ep == USBFS_EP3) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP3_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + } + +#endif /* End USBFS_EP3_ISR_REMOVE */ + + +#if(USBFS_EP4_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_4_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 4 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_4_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP4_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + CY_GET_REG8(USBFS_SIE_EP4_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP4].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP4].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP4].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP4_MASK); + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT) + if(USBFS_midi_out_ep == USBFS_EP4) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP4_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + } + +#endif /* End USBFS_EP4_ISR_REMOVE */ + + +#if(USBFS_EP5_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_5_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 5 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_5_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP5_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + CY_GET_REG8(USBFS_SIE_EP5_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP5].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP5].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP5].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP5_MASK); + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT) + if(USBFS_midi_out_ep == USBFS_EP5) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP5_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + } +#endif /* End USBFS_EP5_ISR_REMOVE */ + + +#if(USBFS_EP6_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_6_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 6 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_6_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP6_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + CY_GET_REG8(USBFS_SIE_EP6_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP6].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP6].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP6].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP6_MASK); + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT) + if(USBFS_midi_out_ep == USBFS_EP6) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP6_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + } + +#endif /* End USBFS_EP6_ISR_REMOVE */ + + +#if(USBFS_EP7_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_7_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 7 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_7_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP7_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + CY_GET_REG8(USBFS_SIE_EP7_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP7].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP7].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP7].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP7_MASK); + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT) + if(USBFS_midi_out_ep == USBFS_EP7) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP7_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + } + +#endif /* End USBFS_EP7_ISR_REMOVE */ + + +#if(USBFS_EP8_ISR_REMOVE == 0u) + + /******************************************************************************* + * Function Name: USBFS_EP_8_ISR + ******************************************************************************** + * + * Summary: + * Endpoint 8 Interrupt Service Routine + * + * Parameters: + * None. + * + * Return: + * None. + * + *******************************************************************************/ + CY_ISR(USBFS_EP_8_ISR) + { + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + uint8 int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP8_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + int_en = EA; + CyGlobalIntEnable; /* Make sure nested interrupt is enabled */ + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + + CY_GET_REG8(USBFS_SIE_EP8_CR0_PTR); /* Must read the mode reg */ + /* Do not toggle ISOC endpoint */ + if((USBFS_EP[USBFS_EP8].attrib & USBFS_EP_TYPE_MASK) != + USBFS_EP_TYPE_ISOC) + { + USBFS_EP[USBFS_EP8].epToggle ^= USBFS_EPX_CNT_DATA_TOGGLE; + } + USBFS_EP[USBFS_EP8].apiEpState = USBFS_EVENT_PENDING; + CY_SET_REG8(USBFS_SIE_EP_INT_SR_PTR, CY_GET_REG8(USBFS_SIE_EP_INT_SR_PTR) + & (uint8)~USBFS_SIE_EP_INT_EP8_MASK); + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT) + if(USBFS_midi_out_ep == USBFS_EP8) + { + USBFS_MIDI_OUT_EP_Service(); + } + #endif /* End USBFS_ISR_SERVICE_MIDI_OUT */ + + /* `#START EP8_END_USER_CODE` Place your code here */ + + /* `#END` */ + + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_OUT && CY_PSOC3) + EA = int_en; + #endif /* CY_PSOC3 & USBFS_ISR_SERVICE_MIDI_OUT */ + } + +#endif /* End USBFS_EP8_ISR_REMOVE */ + + +/******************************************************************************* +* Function Name: USBFS_SOF_ISR +******************************************************************************** +* +* Summary: +* Start of Frame Interrupt Service Routine +* +* Parameters: +* None. +* +* Return: +* None. +* +*******************************************************************************/ +CY_ISR(USBFS_SOF_ISR) +{ + /* `#START SOF_USER_CODE` Place your code here */ + + /* `#END` */ +} + + +/******************************************************************************* +* Function Name: USBFS_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_BUS_RESET_ISR) +{ + /* `#START BUS_RESET_USER_CODE` Place your code here */ + + /* `#END` */ + + USBFS_ReInitComponent(); +} + + +#if((USBFS_EP_MM != USBFS__EP_MANUAL) && (USBFS_ARB_ISR_REMOVE == 0u)) + + + /******************************************************************************* + * Function Name: USBFS_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_ARB_ISR) + { + uint8 int_status; + uint8 ep_status; + uint8 ep = USBFS_EP1; + uint8 ptr = 0u; + + /* `#START ARB_BEGIN_USER_CODE` Place your code here */ + + /* `#END` */ + + int_status = USBFS_ARB_INT_SR_REG; /* read Arbiter Status Register */ + USBFS_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_ARB_EP1_SR_IND + ptr)); + /* If In Buffer Full */ + if((ep_status & USBFS_ARB_EPX_SR_IN_BUF_FULL) != 0u) + { + if((USBFS_EP[ep].addr & USBFS_DIR_IN) != 0u) + { + /* Clear Data ready status */ + *(reg8 *)(USBFS_ARB_EP1_CFG_IND + ptr) &= + (uint8)~USBFS_ARB_EPX_CFG_IN_DATA_RDY; + /* Write the Mode register */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ptr), USBFS_EP[ep].epMode); + #if (defined(USBFS_ENABLE_MIDI_STREAMING) && USBFS_ISR_SERVICE_MIDI_IN) + if(ep == USBFS_midi_in_ep) + { /* Clear MIDI input pointer */ + USBFS_midiInPointer = 0u; + } + #endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + } + } + /* (re)arm Out EP only for mode2 */ + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + /* If DMA Grant */ + if((ep_status & USBFS_ARB_EPX_SR_DMA_GNT) != 0u) + { + if((USBFS_EP[ep].addr & USBFS_DIR_IN) == 0u) + { + USBFS_EP[ep].apiEpState = USBFS_NO_EVENT_PENDING; + /* Write the Mode register */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ptr), + USBFS_EP[ep].epMode); + } + } + #endif /* End USBFS_EP_MM */ + + /* `#START ARB_USER_CODE` Place your code here for handle Buffer Underflow/Overflow */ + + /* `#END` */ + + CY_SET_REG8((reg8 *)(USBFS_ARB_EP1_SR_IND + ptr), ep_status); /* Clear Serviced events */ + } + ptr += USBFS_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_EP_MM */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.c new file mode 100755 index 00000000..ba9fdf5b --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.c @@ -0,0 +1,422 @@ +/******************************************************************************* +* File Name: USBFS_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.h" + +#if defined(USBFS_ENABLE_HID_CLASS) + +#include "USBFS_pvt.h" +#include "USBFS_hid.h" + + +/*************************************** +* HID Variables +***************************************/ + +volatile uint8 USBFS_hidProtocol[USBFS_MAX_INTERFACES_NUMBER]; /* HID device protocol status */ +volatile uint8 USBFS_hidIdleRate[USBFS_MAX_INTERFACES_NUMBER]; /* HID device idle reload value */ +volatile uint8 USBFS_hidIdleTimer[USBFS_MAX_INTERFACES_NUMBER]; /* HID device idle rate value */ + + +/*************************************** +* Custom Declarations +***************************************/ + +/* `#START HID_CUSTOM_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +/******************************************************************************* +* Function Name: USBFS_UpdateHIDTimer +******************************************************************************** +* +* Summary: +* Updates the HID report timer and reloads it if expired +* +* Parameters: +* interface: Interface Number. +* +* Return: +* status. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_UpdateHIDTimer(uint8 interface) +{ + uint8 stat = USBFS_IDLE_TIMER_INDEFINITE; + + if(USBFS_hidIdleRate[interface] != 0u) + { + if(USBFS_hidIdleTimer[interface] > 0u) + { + USBFS_hidIdleTimer[interface]--; + stat = USBFS_IDLE_TIMER_RUNNING; + } + else + { + USBFS_hidIdleTimer[interface] = USBFS_hidIdleRate[interface]; + stat = USBFS_IDLE_TIMER_EXPIRED; + } + } + + return(stat); +} + + +/******************************************************************************* +* Function Name: USBFS_GetProtocol +******************************************************************************** +* +* Summary: +* Returns the selected protocol value to the application +* +* Parameters: +* interface: Interface Number. +* +* Return: +* Interface protocol. +* +*******************************************************************************/ +uint8 USBFS_GetProtocol(uint8 interface) +{ + return(USBFS_hidProtocol[interface]); +} + + +/******************************************************************************* +* Function Name: USBFS_DispatchHIDClassRqst +******************************************************************************** +* +* Summary: +* This routine dispatches class requests +* +* Parameters: +* None. +* +* Return: +* requestHandled +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_DispatchHIDClassRqst(void) +{ + uint8 requestHandled = USBFS_FALSE; + uint8 interfaceNumber; + + interfaceNumber = CY_GET_REG8(USBFS_wIndexLo); + if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == USBFS_RQST_DIR_D2H) + { /* Control Read */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_GET_DESCRIPTOR: + if (CY_GET_REG8(USBFS_wValueHi) == USBFS_DESCR_HID_CLASS) + { + USBFS_FindHidClassDecriptor(); + if (USBFS_currentTD.count != 0u) + { + requestHandled = USBFS_InitControlRead(); + } + } + else if (CY_GET_REG8(USBFS_wValueHi) == USBFS_DESCR_HID_REPORT) + { + USBFS_FindReportDescriptor(); + if (USBFS_currentTD.count != 0u) + { + requestHandled = USBFS_InitControlRead(); + } + } + else + { /* requestHandled is initialezed as FALSE by default */ + } + break; + case USBFS_HID_GET_REPORT: + USBFS_FindReport(); + if (USBFS_currentTD.count != 0u) + { + requestHandled = USBFS_InitControlRead(); + } + break; + + case USBFS_HID_GET_IDLE: + /* This function does not support multiple reports per interface*/ + /* Validate interfaceNumber and Report ID (should be 0) */ + if( (interfaceNumber < USBFS_MAX_INTERFACES_NUMBER) && + (CY_GET_REG8(USBFS_wValueLo) == 0u ) ) /* Do not support Idle per Report ID */ + { + USBFS_currentTD.count = 1u; + USBFS_currentTD.pData = &USBFS_hidIdleRate[interfaceNumber]; + requestHandled = USBFS_InitControlRead(); + } + break; + case USBFS_HID_GET_PROTOCOL: + /* Validate interfaceNumber */ + if( interfaceNumber < USBFS_MAX_INTERFACES_NUMBER) + { + USBFS_currentTD.count = 1u; + USBFS_currentTD.pData = &USBFS_hidProtocol[interfaceNumber]; + requestHandled = USBFS_InitControlRead(); + } + break; + default: /* requestHandled is initialized as FALSE by default */ + break; + } + } + else if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == + USBFS_RQST_DIR_H2D) + { /* Control Write */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_HID_SET_REPORT: + USBFS_FindReport(); + if (USBFS_currentTD.count != 0u) + { + requestHandled = USBFS_InitControlWrite(); + } + break; + case USBFS_HID_SET_IDLE: + /* This function does not support multiple reports per interface */ + /* Validate interfaceNumber and Report ID (should be 0) */ + if( (interfaceNumber < USBFS_MAX_INTERFACES_NUMBER) && + (CY_GET_REG8(USBFS_wValueLo) == 0u ) ) /* Do not support Idle per Report ID */ + { + USBFS_hidIdleRate[interfaceNumber] = CY_GET_REG8(USBFS_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_hidIdleRate[interfaceNumber] < + USBFS_hidIdleTimer[interfaceNumber]) + { + /* Set the timer to zero and let the UpdateHIDTimer() API return IDLE_TIMER_EXPIRED status*/ + USBFS_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_hidIdleTimer[interfaceNumber] <= 1u) + { + /* Do nothing. + * Let the UpdateHIDTimer() API continue to work and + * return IDLE_TIMER_EXPIRED status + */ + } + else + { /* Reload the timer*/ + USBFS_hidIdleTimer[interfaceNumber] = + USBFS_hidIdleRate[interfaceNumber]; + } + requestHandled = USBFS_InitNoDataControlTransfer(); + } + break; + + case USBFS_HID_SET_PROTOCOL: + /* Validate interfaceNumber and protocol (must be 0 or 1) */ + if( (interfaceNumber < USBFS_MAX_INTERFACES_NUMBER) && + (CY_GET_REG8(USBFS_wValueLo) <= 1u) ) + { + USBFS_hidProtocol[interfaceNumber] = CY_GET_REG8(USBFS_wValueLo); + requestHandled = USBFS_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_FindHidClassDecriptor(void) +{ + const T_USBFS_LUT CYCODE *pTmp; + volatile uint8 *pDescr; + uint8 interfaceN; + + pTmp = USBFS_GetConfigTablePtr(USBFS_configuration - 1u); + interfaceN = CY_GET_REG8(USBFS_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_LUT CYCODE *) pTmp->p_list; + /* Now use Alternate setting number */ + pTmp = &pTmp[USBFS_interfaceSetting[interfaceN]]; + /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_ALTERNATEi_HID_TABLE */ + pTmp = (const T_USBFS_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_currentTD.count = *pDescr; + USBFS_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_FindReportDescriptor(void) +{ + const T_USBFS_LUT CYCODE *pTmp; + volatile uint8 *pDescr; + uint8 interfaceN; + + pTmp = USBFS_GetConfigTablePtr(USBFS_configuration - 1u); + interfaceN = CY_GET_REG8(USBFS_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_LUT CYCODE *) pTmp->p_list; + /* Now use Alternate setting number */ + pTmp = &pTmp[USBFS_interfaceSetting[interfaceN]]; + /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_ALTERNATEi_HID_TABLE */ + pTmp = (const T_USBFS_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_currentTD.count = (((uint16)pDescr[1u] << 8u) | pDescr[0u]); + USBFS_currentTD.pData = &pDescr[2u]; +} + + +/******************************************************************************* +* Function Name: USBFS_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_FindReport(void) +{ + const T_USBFS_LUT CYCODE *pTmp; + T_USBFS_TD *pTD; + uint8 interfaceN; + uint8 reportType; + + /* `#START HID_FINDREPORT` Place custom handling here */ + + /* `#END` */ + USBFS_currentTD.count = 0u; /* Init not supported condition */ + pTmp = USBFS_GetConfigTablePtr(USBFS_configuration - 1u); + reportType = CY_GET_REG8(USBFS_wValueHi); + interfaceN = CY_GET_REG8(USBFS_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_LUT CYCODE *) pTmp->p_list; + if(interfaceN < USBFS_MAX_INTERFACES_NUMBER) + { + /* Now use Alternate setting number */ + pTmp = &pTmp[USBFS_interfaceSetting[interfaceN]]; + /* USB_DEVICEx_CONFIGURATIONy_INTERFACEz_ALTERNATEi_HID_TABLE */ + pTmp = (const T_USBFS_LUT CYCODE *) pTmp->p_list; + /* Validate reportType to comply with "7.2.1 Get_Report Request" */ + if((reportType >= USBFS_HID_GET_REPORT_INPUT) && + (reportType <= USBFS_HID_GET_REPORT_FEATURE)) + { + /* Get the entry proper TD (IN, OUT or Feature Report Table)*/ + pTmp = &pTmp[reportType - 1u]; + reportType = CY_GET_REG8(USBFS_wValueLo); /* Get reportID */ + /* Validate table support by the HID descriptor, compare table count with reportID */ + if(pTmp->c >= reportType) + { + pTD = (T_USBFS_TD *) pTmp->p_list; + pTD = &pTD[reportType]; /* select entry depend on report ID*/ + USBFS_currentTD.pData = pTD->pData; /* Buffer pointer */ + USBFS_currentTD.count = pTD->count; /* Buffer Size */ + USBFS_currentTD.pStatusBlock = pTD->pStatusBlock; + } + } + } +} + + +/******************************************************************************* +* Additional user functions supporting HID Requests +********************************************************************************/ + +/* `#START HID_FUNCTIONS` Place any additional functions here */ + +/* `#END` */ + +#endif /* End USBFS_ENABLE_HID_CLASS */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.h new file mode 100755 index 00000000..9a6201c1 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_hid.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* File Name: USBFS_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_hid_H) +#define CY_USBFS_USBFS_hid_H + +#include "cytypes.h" + + +/*************************************** +* Prototypes of the USBFS_hid API. +***************************************/ + +uint8 USBFS_UpdateHIDTimer(uint8 interface) ; +uint8 USBFS_GetProtocol(uint8 interface) ; + + +/*************************************** +*Renamed Functions for backward compatible +***************************************/ + +#define USBFS_bGetProtocol USBFS_GetProtocol + + +/*************************************** +* Constants for USBFS_hid API. +***************************************/ + +#define USBFS_PROTOCOL_BOOT (0x00u) +#define USBFS_PROTOCOL_REPORT (0x01u) + +/* Request Types (HID Chapter 7.2) */ +#define USBFS_HID_GET_REPORT (0x01u) +#define USBFS_HID_GET_IDLE (0x02u) +#define USBFS_HID_GET_PROTOCOL (0x03u) +#define USBFS_HID_SET_REPORT (0x09u) +#define USBFS_HID_SET_IDLE (0x0Au) +#define USBFS_HID_SET_PROTOCOL (0x0Bu) + +/* Descriptor Types (HID Chapter 7.1) */ +#define USBFS_DESCR_HID_CLASS (0x21u) +#define USBFS_DESCR_HID_REPORT (0x22u) +#define USBFS_DESCR_HID_PHYSICAL (0x23u) + +/* Report Request Types (HID Chapter 7.2.1) */ +#define USBFS_HID_GET_REPORT_INPUT (0x01u) +#define USBFS_HID_GET_REPORT_OUTPUT (0x02u) +#define USBFS_HID_GET_REPORT_FEATURE (0x03u) + +#endif /* End CY_USBFS_USBFS_hid_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.c new file mode 100755 index 00000000..1f0ce51a --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.c @@ -0,0 +1,1341 @@ +/******************************************************************************* +* File Name: USBFS_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.h" + +#if defined(USBFS_ENABLE_MIDI_STREAMING) + +#include "USBFS_midi.h" +#include "USBFS_pvt.h" + + +/*************************************** +* MIDI Constants +***************************************/ + +#if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + /* The Size of the MIDI messages (MIDI Table 4-1) */ + static const uint8 CYCODE USBFS_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_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + + +/*************************************** +* Global variables +***************************************/ + +#if (USBFS_MIDI_IN_BUFF_SIZE > 0) + #if (USBFS_MIDI_IN_BUFF_SIZE >= 256) + volatile uint16 USBFS_midiInPointer; /* Input endpoint buffer pointer */ + #else + volatile uint8 USBFS_midiInPointer; /* Input endpoint buffer pointer */ + #endif /* End USBFS_MIDI_IN_BUFF_SIZE >=256 */ + volatile uint8 USBFS_midi_in_ep; /* Input endpoint number */ + uint8 USBFS_midiInBuffer[USBFS_MIDI_IN_BUFF_SIZE]; /* Input endpoint buffer */ +#endif /* USBFS_MIDI_IN_BUFF_SIZE > 0 */ + +#if (USBFS_MIDI_OUT_BUFF_SIZE > 0) + volatile uint8 USBFS_midi_out_ep; /* Output endpoint number */ + uint8 USBFS_midiOutBuffer[USBFS_MIDI_OUT_BUFF_SIZE]; /* Output endpoint buffer */ +#endif /* USBFS_MIDI_OUT_BUFF_SIZE > 0 */ + +#if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + static USBFS_MIDI_RX_STATUS USBFS_MIDI1_Event; /* MIDI RX status structure */ + static volatile uint8 USBFS_MIDI1_TxRunStat; /* MIDI Output running status */ + volatile uint8 USBFS_MIDI1_InqFlags; /* Device inquiry flag */ + + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + static USBFS_MIDI_RX_STATUS USBFS_MIDI2_Event; /* MIDI RX status structure */ + static volatile uint8 USBFS_MIDI2_TxRunStat; /* MIDI Output running status */ + volatile uint8 USBFS_MIDI2_InqFlags; /* Device inquiry flag */ + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ +#endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + +/*************************************** +* Custom Declarations +***************************************/ + +/* `#START MIDI_CUSTOM_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +/*************************************** +* Optional MIDI APIs +***************************************/ +#if (USBFS_ENABLE_MIDI_API != 0u) + + +/******************************************************************************* +* Function Name: USBFS_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_midiInBuffer: This buffer is used for saving and combining +* the received data from UART(s) and(or) generated internally by +* PutUsbMidiIn() function messages. USBFS_MIDI_IN_EP_Service() +* function transfers the data from this buffer to the PC. +* USBFS_midiOutBuffer: This buffer is used by the +* USBFS_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_callbackLocalMidiEvent function. +* USBFS_midi_out_ep: Used as an OUT endpoint number. +* USBFS_midi_in_ep: Used as an IN endpoint number. +* USBFS_midiInPointer: Initialized to zero. +* +* Reentrant: +* No +* +*******************************************************************************/ +void USBFS_MIDI_EP_Init(void) +{ + #if (USBFS_MIDI_IN_BUFF_SIZE > 0) + USBFS_midiInPointer = 0u; + #endif /* USBFS_MIDI_IN_BUFF_SIZE > 0 */ + + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + #if (USBFS_MIDI_IN_BUFF_SIZE > 0) + /* Init DMA configurations for IN EP*/ + USBFS_LoadInEP(USBFS_midi_in_ep, USBFS_midiInBuffer, + USBFS_MIDI_IN_BUFF_SIZE); + + #endif /* USBFS_MIDI_IN_BUFF_SIZE > 0 */ + #if (USBFS_MIDI_OUT_BUFF_SIZE > 0) + /* Init DMA configurations for OUT EP*/ + (void)USBFS_ReadOutEP(USBFS_midi_out_ep, USBFS_midiOutBuffer, + USBFS_MIDI_OUT_BUFF_SIZE); + #endif /*USBFS_MIDI_OUT_BUFF_SIZE > 0 */ + #endif /* End USBFS__EP_DMAAUTO */ + + #if (USBFS_MIDI_OUT_BUFF_SIZE > 0) + USBFS_EnableOutEP(USBFS_midi_out_ep); + #endif /* USBFS_MIDI_OUT_BUFF_SIZE > 0 */ + + /* Initialize the MIDI port(s) */ + #if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + USBFS_MIDI_Init(); + #endif /* USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ +} + +#if (USBFS_MIDI_OUT_BUFF_SIZE > 0) + + + /******************************************************************************* + * Function Name: USBFS_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_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_midiOutBuffer: Used as temporary buffer between USB internal + * memory and UART TX buffer. + * USBFS_midi_out_ep: Used as an OUT endpoint number. + * + * Reentrant: + * No + * + *******************************************************************************/ + void USBFS_MIDI_OUT_EP_Service(void) + { + #if USBFS_MIDI_OUT_BUFF_SIZE >= 256 + uint16 outLength; + uint16 outPointer; + #else + uint8 outLength; + uint8 outPointer; + #endif /* End USBFS_MIDI_OUT_BUFF_SIZE >=256 */ + + uint8 dmaState = 0u; + + /* Service the USB MIDI output endpoint */ + if (USBFS_GetEPState(USBFS_midi_out_ep) == USBFS_OUT_BUFFER_FULL) + { + #if USBFS_MIDI_OUT_BUFF_SIZE >= 256 + outLength = USBFS_GetEPCount(USBFS_midi_out_ep); + #else + outLength = (uint8)USBFS_GetEPCount(USBFS_midi_out_ep); + #endif /* End USBFS_MIDI_OUT_BUFF_SIZE >= 256 */ + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + #if USBFS_MIDI_OUT_BUFF_SIZE >= 256 + outLength = USBFS_ReadOutEP(USBFS_midi_out_ep, + USBFS_midiOutBuffer, outLength); + #else + outLength = (uint8)USBFS_ReadOutEP(USBFS_midi_out_ep, + USBFS_midiOutBuffer, (uint16)outLength); + #endif /* End USBFS_MIDI_OUT_BUFF_SIZE >= 256 */ + #if(USBFS_EP_MM == USBFS__EP_DMAMANUAL) + do /* wait for DMA transfer complete */ + { + (void)CyDmaChStatus(USBFS_DmaChan[USBFS_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_EP_MM != USBFS__EP_DMAAUTO */ + if(dmaState != 0u) + { + /* Suppress compiler warning */ + } + if (outLength >= USBFS_EVENT_LENGTH) + { + outPointer = 0u; + while (outPointer < outLength) + { + /* In some OS OUT packet could be appended by nulls which could be skipped */ + if (USBFS_midiOutBuffer[outPointer] == 0u) + { + break; + } + /* Route USB MIDI to the External connection */ + #if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + if ((USBFS_midiOutBuffer[outPointer] & USBFS_CABLE_MASK) == + USBFS_MIDI_CABLE_00) + { + USBFS_MIDI1_ProcessUsbOut(&USBFS_midiOutBuffer[outPointer]); + } + else if ((USBFS_midiOutBuffer[outPointer] & USBFS_CABLE_MASK) == + USBFS_MIDI_CABLE_01) + { + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + USBFS_MIDI2_ProcessUsbOut(&USBFS_midiOutBuffer[outPointer]); + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ + } + else + { + /* `#START CUSTOM_MIDI_OUT_EP_SERV` Place your code here */ + + /* `#END` */ + } + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + /* Process any local MIDI output functions */ + USBFS_callbackLocalMidiEvent( + USBFS_midiOutBuffer[outPointer] & USBFS_CABLE_MASK, + &USBFS_midiOutBuffer[outPointer + USBFS_EVENT_BYTE1]); + outPointer += USBFS_EVENT_LENGTH; + } + } + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + /* Enable Out EP*/ + USBFS_EnableOutEP(USBFS_midi_out_ep); + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + } + } + +#endif /* #if (USBFS_MIDI_OUT_BUFF_SIZE > 0) */ + +#if (USBFS_MIDI_IN_BUFF_SIZE > 0) + + + /******************************************************************************* + * Function Name: USBFS_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_MIDI_IN_Service() and from the + * USBFS_PutUsbMidiIn() function. + * + * Parameters: + * None + * + * Return: + * None + * + * Global variables: + * USBFS_midi_in_ep: Used as an IN endpoint number. + * USBFS_midiInBuffer: Function loads the data from this buffer to + * the USB IN endpoint. + * USBFS_midiInPointer: Cleared to zero when data are sent. + * + * Reentrant: + * No + * + *******************************************************************************/ + void USBFS_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_midiInPointer != 0u) + { + if(USBFS_GetEPState(USBFS_midi_in_ep) == USBFS_EVENT_PENDING) + { + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + USBFS_LoadInEP(USBFS_midi_in_ep, USBFS_midiInBuffer, + (uint16)USBFS_midiInPointer); + #else /* USBFS_EP_MM != USBFS__EP_DMAAUTO */ + /* rearm IN EP */ + USBFS_LoadInEP(USBFS_midi_in_ep, NULL, (uint16)USBFS_midiInPointer); + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO*/ + + /* Clear the midiInPointer. For DMA mode, clear this pointer in the ARB ISR when data are moved by DMA */ + #if(USBFS_EP_MM == USBFS__EP_MANUAL) + USBFS_midiInPointer = 0u; + #endif /* USBFS_EP_MM == USBFS__EP_MANUAL */ + } + } + } + + + /******************************************************************************* + * Function Name: USBFS_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_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_midiInPointer: Cleared to zero when data are sent. + * + * Reentrant: + * No + * + *******************************************************************************/ + void USBFS_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_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + uint8 m1 = 0u; + uint8 m2 = 0u; + do + { + if (USBFS_midiInPointer <= (USBFS_MIDI_IN_BUFF_SIZE - USBFS_EVENT_LENGTH)) + { + /* Check MIDI1 input port for a complete event */ + m1 = USBFS_MIDI1_GetEvent(); + if (m1 != 0u) + { + USBFS_PrepareInBuffer(m1, (uint8 *)&USBFS_MIDI1_Event.msgBuff[0], + USBFS_MIDI1_Event.size, USBFS_MIDI_CABLE_00); + } + } + + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + if (USBFS_midiInPointer <= (USBFS_MIDI_IN_BUFF_SIZE - USBFS_EVENT_LENGTH)) + { + /* Check MIDI2 input port for a complete event */ + m2 = USBFS_MIDI2_GetEvent(); + if (m2 != 0u) + { + USBFS_PrepareInBuffer(m2, (uint8 *)&USBFS_MIDI2_Event.msgBuff[0], + USBFS_MIDI2_Event.size, USBFS_MIDI_CABLE_01); + } + } + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ + + }while( (USBFS_midiInPointer <= (USBFS_MIDI_IN_BUFF_SIZE - USBFS_EVENT_LENGTH)) + && ((m1 != 0u) || (m2 != 0u)) ); + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + /* Service the USB MIDI input endpoint */ + USBFS_MIDI_IN_EP_Service(); + } + + + /******************************************************************************* + * Function Name: USBFS_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_TRUE if error. + * USBFS_FALSE if success. + * + * Global variables: + * USBFS_midi_in_ep: MIDI IN endpoint number used for sending data. + * USBFS_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_PutUsbMidiIn(uint8 ic, const uint8 midiMsg[], uint8 cable) + + { + uint8 retError = USBFS_FALSE; + uint8 msgIndex; + + /* Protect PrepareInBuffer() function from concurrent calls */ + #if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + MIDI1_UART_DisableRxInt(); + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + MIDI2_UART_DisableRxInt(); + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + if (USBFS_midiInPointer > + (USBFS_EP[USBFS_midi_in_ep].bufferSize - USBFS_EVENT_LENGTH)) + { + USBFS_MIDI_IN_EP_Service(); + } + if (USBFS_midiInPointer <= + (USBFS_EP[USBFS_midi_in_ep].bufferSize - USBFS_EVENT_LENGTH)) + { + if((ic < USBFS_EVENT_LENGTH) || (ic >= USBFS_MIDI_STATUS_MASK)) + { + USBFS_PrepareInBuffer(ic, midiMsg, ic, cable); + } + else + { /* Only SysEx message is greater than 4 bytes */ + msgIndex = 0u; + do + { + USBFS_PrepareInBuffer(USBFS_MIDI_SYSEX, &midiMsg[msgIndex], + USBFS_EVENT_BYTE3, cable); + ic -= USBFS_EVENT_BYTE3; + msgIndex += USBFS_EVENT_BYTE3; + if (USBFS_midiInPointer > + (USBFS_EP[USBFS_midi_in_ep].bufferSize - USBFS_EVENT_LENGTH)) + { + USBFS_MIDI_IN_EP_Service(); + if (USBFS_midiInPointer > + (USBFS_EP[USBFS_midi_in_ep].bufferSize - USBFS_EVENT_LENGTH)) + { + /* Error condition. HOST is not ready to receive this packet. */ + retError = USBFS_TRUE; + break; + } + } + }while(ic > USBFS_EVENT_BYTE3); + + if(retError == USBFS_FALSE) + { + USBFS_PrepareInBuffer(USBFS_MIDI_EOSEX, midiMsg, ic, cable); + } + } + } + else + { + /* Error condition. HOST is not ready to receive this packet. */ + retError = USBFS_TRUE; + } + + #if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + MIDI1_UART_EnableRxInt(); + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + MIDI2_UART_EnableRxInt(); + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + return (retError); + } + + + /******************************************************************************* + * Function Name: USBFS_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_midiInBuffer: This buffer is used for saving and combine the + * received from UART(s) and(or) generated internally by + * USBFS_PutUsbMidiIn() function messages. + * USBFS_midiInPointer: Used as an index for midiInBuffer to + * write data. + * + * Reentrant: + * No + * + *******************************************************************************/ + void USBFS_PrepareInBuffer(uint8 ic, const uint8 srcBuff[], uint8 eventLen, uint8 cable) + + { + uint8 srcBuffZero; + uint8 srcBuffOne; + + srcBuffZero = srcBuff[0u]; + srcBuffOne = srcBuff[1u]; + + if (ic >= (USBFS_MIDI_STATUS_MASK | USBFS_MIDI_SINGLE_BYTE_MASK)) + { + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_SINGLE_BYTE | cable; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = ic; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = 0u; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = 0u; + USBFS_midiInPointer++; + } + else if((ic < USBFS_EVENT_LENGTH) || (ic == USBFS_MIDI_SYSEX)) + { + if(ic == USBFS_MIDI_SYSEX) + { + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_SYSEX | cable; + USBFS_midiInPointer++; + } + else if (srcBuffZero < USBFS_MIDI_SYSEX) + { + USBFS_midiInBuffer[USBFS_midiInPointer] = (srcBuffZero >> 4u) | cable; + USBFS_midiInPointer++; + } + else if (srcBuffZero == USBFS_MIDI_TUNEREQ) + { + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_1BYTE_COMMON | cable; + USBFS_midiInPointer++; + } + else if ((srcBuffZero == USBFS_MIDI_QFM) || (srcBuffZero == USBFS_MIDI_SONGSEL)) + { + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_2BYTE_COMMON | cable; + USBFS_midiInPointer++; + } + else if (srcBuffZero == USBFS_MIDI_SPP) + { + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_3BYTE_COMMON | cable; + USBFS_midiInPointer++; + } + else + { + } + + USBFS_midiInBuffer[USBFS_midiInPointer] = srcBuffZero; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = srcBuffOne; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = srcBuff[2u]; + USBFS_midiInPointer++; + } + else if (ic == USBFS_MIDI_EOSEX) + { + switch (eventLen) + { + case 0u: + USBFS_midiInBuffer[USBFS_midiInPointer] = + USBFS_SYSEX_ENDS_WITH1 | cable; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_MIDI_EOSEX; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = 0u; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = 0u; + USBFS_midiInPointer++; + break; + case 1u: + USBFS_midiInBuffer[USBFS_midiInPointer] = + USBFS_SYSEX_ENDS_WITH2 | cable; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = srcBuffZero; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_MIDI_EOSEX; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = 0u; + USBFS_midiInPointer++; + break; + case 2u: + USBFS_midiInBuffer[USBFS_midiInPointer] = + USBFS_SYSEX_ENDS_WITH3 | cable; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = srcBuffZero; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = srcBuffOne; + USBFS_midiInPointer++; + USBFS_midiInBuffer[USBFS_midiInPointer] = USBFS_MIDI_EOSEX; + USBFS_midiInPointer++; + break; + default: + break; + } + } + else + { + } + } + +#endif /* #if (USBFS_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_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + + + /******************************************************************************* + * Function Name: USBFS_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_MIDI_Event: initialized to zero. + * USBFS_MIDI_TxRunStat: initialized to zero. + * + *******************************************************************************/ + void USBFS_MIDI_Init(void) + { + USBFS_MIDI1_Event.length = 0u; + USBFS_MIDI1_Event.count = 0u; + USBFS_MIDI1_Event.size = 0u; + USBFS_MIDI1_Event.runstat = 0u; + USBFS_MIDI1_TxRunStat = 0u; + USBFS_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_CUSTOM_UART_TX_PRIOR_NUM); + CyIntSetPriority(MIDI1_UART_RX_VECT_NUM, USBFS_CUSTOM_UART_RX_PRIOR_NUM); + + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + USBFS_MIDI2_Event.length = 0u; + USBFS_MIDI2_Event.count = 0u; + USBFS_MIDI2_Event.size = 0u; + USBFS_MIDI2_Event.runstat = 0u; + USBFS_MIDI2_TxRunStat = 0u; + USBFS_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_CUSTOM_UART_TX_PRIOR_NUM); + CyIntSetPriority(MIDI2_UART_RX_VECT_NUM, USBFS_CUSTOM_UART_RX_PRIOR_NUM); + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF*/ + + /* `#START MIDI_INIT_CUSTOM` Init other extended UARTs here */ + + /* `#END` */ + + } + + + /******************************************************************************* + * Function Name: USBFS_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_ProcessMidiIn(uint8 mData, USBFS_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_MIDI_STATUS_BYTE_MASK) != 0u) + { + if ((mData & USBFS_MIDI_STATUS_MASK) == USBFS_MIDI_STATUS_MASK) + { + if ((mData & USBFS_MIDI_SINGLE_BYTE_MASK) != 0u) /* System Real-Time Messages(single byte) */ + { + midiReturn = mData; + } + else /* System Common Messages */ + { + switch (mData) + { + case USBFS_MIDI_SYSEX: + rxStat->msgBuff[0u] = USBFS_MIDI_SYSEX; + rxStat->runstat = USBFS_MIDI_SYSEX; + rxStat->count = 1u; + rxStat->length = 3u; + break; + case USBFS_MIDI_EOSEX: + rxStat->runstat = 0u; + rxStat->size = rxStat->count; + rxStat->count = 0u; + midiReturn = USBFS_MIDI_EOSEX; + break; + case USBFS_MIDI_SPP: + rxStat->msgBuff[0u] = USBFS_MIDI_SPP; + rxStat->runstat = 0u; + rxStat->count = 1u; + rxStat->length = 3u; + break; + case USBFS_MIDI_SONGSEL: + rxStat->msgBuff[0u] = USBFS_MIDI_SONGSEL; + rxStat->runstat = 0u; + rxStat->count = 1u; + rxStat->length = 2u; + break; + case USBFS_MIDI_QFM: + rxStat->msgBuff[0u] = USBFS_MIDI_QFM; + rxStat->runstat = 0u; + rxStat->count = 1u; + rxStat->length = 2u; + break; + case USBFS_MIDI_TUNEREQ: + rxStat->msgBuff[0u] = USBFS_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_MIDI_STATUS_MASK) + { + case USBFS_MIDI_NOTE_OFF: + case USBFS_MIDI_NOTE_ON: + case USBFS_MIDI_POLY_KEY_PRESSURE: + case USBFS_MIDI_CONTROL_CHANGE: + case USBFS_MIDI_PITCH_BEND_CHANGE: + rxStat->length = 3u; + break; + case USBFS_MIDI_PROGRAM_CHANGE: + case USBFS_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_MIDI_SYSEX) + { + rxStat->msgBuff[rxStat->count] = mData; + rxStat->count++; + if (rxStat->count >= rxStat->length) + { + rxStat->size = rxStat->count; + rxStat->count = 0u; + midiReturn = USBFS_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_MIDI_STATUS_MASK) + { + case USBFS_MIDI_NOTE_OFF: + case USBFS_MIDI_NOTE_ON: + case USBFS_MIDI_POLY_KEY_PRESSURE: + case USBFS_MIDI_CONTROL_CHANGE: + case USBFS_MIDI_PITCH_BEND_CHANGE: + rxStat->length = 3u; + break; + case USBFS_MIDI_PROGRAM_CHANGE: + case USBFS_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_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_MIDI1_Event: RX status structure used to parse received + * data. + * + *******************************************************************************/ + uint8 USBFS_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_ProcessMidiIn(rxData, + (USBFS_MIDI_RX_STATUS *)&USBFS_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_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_MIDI1_TxRunStat: This variable used to save the MIDI + * status byte and skip to send the repeated status byte in subsequent event. + * USBFS_MIDI1_InqFlags: The following flags are set when SysEx + * message comes. + * USBFS_INQ_SYSEX_FLAG: Non-Real Time SySEx message received. + * USBFS_INQ_IDENTITY_REQ_FLAG: Identity Request received. + * This bit should be cleared by user when Identity Reply message generated. + * + *******************************************************************************/ + void USBFS_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_EVENT_BYTE0] & USBFS_CIN_MASK; + if((cmd != USBFS_RESERVED0) && (cmd != USBFS_RESERVED1)) + { + len = USBFS_MIDI_SIZE[cmd]; + i = USBFS_EVENT_BYTE1; + /* Universal System Exclusive message parsing */ + if(cmd == USBFS_SYSEX) + { + if((epBuf[USBFS_EVENT_BYTE1] == USBFS_MIDI_SYSEX) && + (epBuf[USBFS_EVENT_BYTE2] == USBFS_MIDI_SYSEX_NON_REAL_TIME)) + { /* Non-Real Time SySEx starts */ + USBFS_MIDI1_InqFlags |= USBFS_INQ_SYSEX_FLAG; + } + else + { + USBFS_MIDI1_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + } + } + else if(cmd == USBFS_SYSEX_ENDS_WITH1) + { + USBFS_MIDI1_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + } + else if(cmd == USBFS_SYSEX_ENDS_WITH2) + { + USBFS_MIDI1_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + } + else if(cmd == USBFS_SYSEX_ENDS_WITH3) + { + /* Identify Request support */ + if((USBFS_MIDI1_InqFlags & USBFS_INQ_SYSEX_FLAG) != 0u) + { + USBFS_MIDI1_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + if((epBuf[USBFS_EVENT_BYTE1] == USBFS_MIDI_SYSEX_GEN_INFORMATION) && + (epBuf[USBFS_EVENT_BYTE2] == USBFS_MIDI_SYSEX_IDENTITY_REQ)) + { /* Set the flag about received the Identity Request. + * The Identity Reply message may be send by user code. + */ + USBFS_MIDI1_InqFlags |= USBFS_INQ_IDENTITY_REQ_FLAG; + } + } + } + else /* Do nothing for other command */ + { + } + /* Running Status for Voice and Mode messages only. */ + if((cmd >= USBFS_NOTE_OFF) && ( cmd <= USBFS_PITCH_BEND_CHANGE)) + { + if(USBFS_MIDI1_TxRunStat == epBuf[USBFS_EVENT_BYTE1]) + { /* Skip the repeated Status byte */ + i++; + } + else + { /* Save Status byte for next event */ + USBFS_MIDI1_TxRunStat = epBuf[USBFS_EVENT_BYTE1]; + } + } + else + { /* Clear Running Status */ + USBFS_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_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + + + /******************************************************************************* + * Function Name: USBFS_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_MIDI2_Event: RX status structure used to parse received + * data. + * + *******************************************************************************/ + uint8 USBFS_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_ProcessMidiIn(rxData, + (USBFS_MIDI_RX_STATUS *)&USBFS_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_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_MIDI2_TxRunStat: This variable used to save the MIDI + * status byte and skip to send the repeated status byte in subsequent event. + * USBFS_MIDI2_InqFlags: The following flags are set when SysEx + * message comes. + * USBFS_INQ_SYSEX_FLAG: Non-Real Time SySEx message received. + * USBFS_INQ_IDENTITY_REQ_FLAG: Identity Request received. + * This bit should be cleared by user when Identity Reply message generated. + * + *******************************************************************************/ + void USBFS_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_EVENT_BYTE0] & USBFS_CIN_MASK; + if((cmd != USBFS_RESERVED0) && (cmd != USBFS_RESERVED1)) + { + len = USBFS_MIDI_SIZE[cmd]; + i = USBFS_EVENT_BYTE1; + /* Universal System Exclusive message parsing */ + if(cmd == USBFS_SYSEX) + { + if((epBuf[USBFS_EVENT_BYTE1] == USBFS_MIDI_SYSEX) && + (epBuf[USBFS_EVENT_BYTE2] == USBFS_MIDI_SYSEX_NON_REAL_TIME)) + { /* SySEx starts */ + USBFS_MIDI2_InqFlags |= USBFS_INQ_SYSEX_FLAG; + } + else + { + USBFS_MIDI2_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + } + } + else if(cmd == USBFS_SYSEX_ENDS_WITH1) + { + USBFS_MIDI2_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + } + else if(cmd == USBFS_SYSEX_ENDS_WITH2) + { + USBFS_MIDI2_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + } + else if(cmd == USBFS_SYSEX_ENDS_WITH3) + { + /* Identify Request support */ + if((USBFS_MIDI2_InqFlags & USBFS_INQ_SYSEX_FLAG) != 0u) + { + USBFS_MIDI2_InqFlags &= (uint8)~USBFS_INQ_SYSEX_FLAG; + if((epBuf[USBFS_EVENT_BYTE1] == USBFS_MIDI_SYSEX_GEN_INFORMATION) && + (epBuf[USBFS_EVENT_BYTE2] == USBFS_MIDI_SYSEX_IDENTITY_REQ)) + { /* Set the flag about received the Identity Request. + * The Identity Reply message may be send by user code. + */ + USBFS_MIDI2_InqFlags |= USBFS_INQ_IDENTITY_REQ_FLAG; + } + } + } + else /* Do nothing for other command */ + { + } + /* Running Status for Voice and Mode messages only. */ + if((cmd >= USBFS_NOTE_OFF) && ( cmd <= USBFS_PITCH_BEND_CHANGE)) + { + if(USBFS_MIDI2_TxRunStat == epBuf[USBFS_EVENT_BYTE1]) + { /* Skip the repeated Status byte */ + i++; + } + else + { /* Save Status byte for next event */ + USBFS_MIDI2_TxRunStat = epBuf[USBFS_EVENT_BYTE1]; + } + } + else + { /* Clear Running Status */ + USBFS_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_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ +#endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + +#endif /* End (USBFS_ENABLE_MIDI_API != 0u) */ + + +/* `#START MIDI_FUNCTIONS` Place any additional functions here */ + +/* `#END` */ + +#endif /* End defined(USBFS_ENABLE_MIDI_STREAMING) */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.h new file mode 100755 index 00000000..5a720340 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_midi.h @@ -0,0 +1,200 @@ +/******************************************************************************* +* File Name: USBFS_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_midi_H) +#define CY_USBFS_USBFS_midi_H + +#include "cytypes.h" +#include "USBFS.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_MIDI_RX_STATUS; + + +/*************************************** +* MIDI Constants. +***************************************/ + +#define USBFS_ONE_EXT_INTRF (0x01u) +#define USBFS_TWO_EXT_INTRF (0x02u) + +/* Flag definitions for use with MIDI device inquiry */ +#define USBFS_INQ_SYSEX_FLAG (0x01u) +#define USBFS_INQ_IDENTITY_REQ_FLAG (0x02u) + +/* USB-MIDI Code Index Number Classifications (MIDI Table 4-1) */ +#define USBFS_CIN_MASK (0x0Fu) +#define USBFS_RESERVED0 (0x00u) +#define USBFS_RESERVED1 (0x01u) +#define USBFS_2BYTE_COMMON (0x02u) +#define USBFS_3BYTE_COMMON (0x03u) +#define USBFS_SYSEX (0x04u) +#define USBFS_1BYTE_COMMON (0x05u) +#define USBFS_SYSEX_ENDS_WITH1 (0x05u) +#define USBFS_SYSEX_ENDS_WITH2 (0x06u) +#define USBFS_SYSEX_ENDS_WITH3 (0x07u) +#define USBFS_NOTE_OFF (0x08u) +#define USBFS_NOTE_ON (0x09u) +#define USBFS_POLY_KEY_PRESSURE (0x0Au) +#define USBFS_CONTROL_CHANGE (0x0Bu) +#define USBFS_PROGRAM_CHANGE (0x0Cu) +#define USBFS_CHANNEL_PRESSURE (0x0Du) +#define USBFS_PITCH_BEND_CHANGE (0x0Eu) +#define USBFS_SINGLE_BYTE (0x0Fu) + +#define USBFS_CABLE_MASK (0xF0u) +#define USBFS_MIDI_CABLE_00 (0x00u) +#define USBFS_MIDI_CABLE_01 (0x10u) + +#define USBFS_EVENT_BYTE0 (0x00u) +#define USBFS_EVENT_BYTE1 (0x01u) +#define USBFS_EVENT_BYTE2 (0x02u) +#define USBFS_EVENT_BYTE3 (0x03u) +#define USBFS_EVENT_LENGTH (0x04u) + +#define USBFS_MIDI_STATUS_BYTE_MASK (0x80u) +#define USBFS_MIDI_STATUS_MASK (0xF0u) +#define USBFS_MIDI_SINGLE_BYTE_MASK (0x08u) +#define USBFS_MIDI_NOTE_OFF (0x80u) +#define USBFS_MIDI_NOTE_ON (0x90u) +#define USBFS_MIDI_POLY_KEY_PRESSURE (0xA0u) +#define USBFS_MIDI_CONTROL_CHANGE (0xB0u) +#define USBFS_MIDI_PROGRAM_CHANGE (0xC0u) +#define USBFS_MIDI_CHANNEL_PRESSURE (0xD0u) +#define USBFS_MIDI_PITCH_BEND_CHANGE (0xE0u) +#define USBFS_MIDI_SYSEX (0xF0u) +#define USBFS_MIDI_EOSEX (0xF7u) +#define USBFS_MIDI_QFM (0xF1u) +#define USBFS_MIDI_SPP (0xF2u) +#define USBFS_MIDI_SONGSEL (0xF3u) +#define USBFS_MIDI_TUNEREQ (0xF6u) +#define USBFS_MIDI_ACTIVESENSE (0xFEu) + +/* MIDI Universal System Exclusive defines */ +#define USBFS_MIDI_SYSEX_NON_REAL_TIME (0x7Eu) +#define USBFS_MIDI_SYSEX_REALTIME (0x7Fu) +/* ID of target device */ +#define USBFS_MIDI_SYSEX_ID_ALL (0x7Fu) +/* Sub-ID#1*/ +#define USBFS_MIDI_SYSEX_GEN_INFORMATION (0x06u) +#define USBFS_MIDI_SYSEX_GEN_MESSAGE (0x09u) +/* Sub-ID#2*/ +#define USBFS_MIDI_SYSEX_IDENTITY_REQ (0x01u) +#define USBFS_MIDI_SYSEX_IDENTITY_REPLY (0x02u) +#define USBFS_MIDI_SYSEX_SYSTEM_ON (0x01u) +#define USBFS_MIDI_SYSEX_SYSTEM_OFF (0x02u) + +#define USBFS_CUSTOM_UART_TX_PRIOR_NUM (0x04u) +#define USBFS_CUSTOM_UART_RX_PRIOR_NUM (0x02u) + +#define USBFS_ISR_SERVICE_MIDI_OUT \ + ( (USBFS_ENABLE_MIDI_API != 0u) && \ + (USBFS_MIDI_OUT_BUFF_SIZE > 0) && (USBFS_EP_MM == USBFS__EP_DMAAUTO) ) +#define USBFS_ISR_SERVICE_MIDI_IN \ + ( (USBFS_ENABLE_MIDI_API != 0u) && (USBFS_MIDI_IN_BUFF_SIZE > 0) ) + +/*************************************** +* External function references +***************************************/ + +void USBFS_callbackLocalMidiEvent(uint8 cable, uint8 *midiMsg) + ; + + +/*************************************** +* External references +***************************************/ + +#if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + #include "MIDI1_UART.h" +#endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ +#if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + #include "MIDI2_UART.h" +#endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ +#if(USBFS_EP_MM != USBFS__EP_MANUAL) + #include +#endif /* End USBFS_EP_MM */ + + +/*************************************** +* Private function prototypes +***************************************/ + +void USBFS_PrepareInBuffer(uint8 ic, const uint8 srcBuff[], uint8 eventLen, uint8 cable) + ; +#if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + void USBFS_MIDI_Init(void) ; + uint8 USBFS_ProcessMidiIn(uint8 mData, USBFS_MIDI_RX_STATUS *rxStat) + ; + uint8 USBFS_MIDI1_GetEvent(void) ; + void USBFS_MIDI1_ProcessUsbOut(const uint8 epBuf[]) + ; + + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + uint8 USBFS_MIDI2_GetEvent(void) ; + void USBFS_MIDI2_ProcessUsbOut(const uint8 epBuf[]) + ; + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ +#endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + + +/*************************************** +* External data references +***************************************/ + +#if defined(USBFS_ENABLE_MIDI_STREAMING) + +#if (USBFS_MIDI_IN_BUFF_SIZE > 0) + #if (USBFS_MIDI_IN_BUFF_SIZE >= 256) + extern volatile uint16 USBFS_midiInPointer; /* Input endpoint buffer pointer */ + #else + extern volatile uint8 USBFS_midiInPointer; /* Input endpoint buffer pointer */ + #endif /* End USBFS_MIDI_IN_BUFF_SIZE >=256 */ + extern volatile uint8 USBFS_midi_in_ep; /* Input endpoint number */ + extern uint8 USBFS_midiInBuffer[USBFS_MIDI_IN_BUFF_SIZE]; /* Input endpoint buffer */ +#endif /* USBFS_MIDI_IN_BUFF_SIZE > 0 */ + +#if (USBFS_MIDI_OUT_BUFF_SIZE > 0) + extern volatile uint8 USBFS_midi_out_ep; /* Output endpoint number */ + extern uint8 USBFS_midiOutBuffer[USBFS_MIDI_OUT_BUFF_SIZE]; /* Output endpoint buffer */ +#endif /* USBFS_MIDI_OUT_BUFF_SIZE > 0 */ + +#if (USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF) + extern volatile uint8 USBFS_MIDI1_InqFlags; /* Device inquiry flag */ + #if (USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF) + extern volatile uint8 USBFS_MIDI2_InqFlags; /* Device inquiry flag */ + #endif /* End USBFS_MIDI_EXT_MODE >= USBFS_TWO_EXT_INTRF */ +#endif /* End USBFS_MIDI_EXT_MODE >= USBFS_ONE_EXT_INTRF */ + +#endif /* USBFS_ENABLE_MIDI_STREAMING */ + + +#endif /* End CY_USBFS_USBFS_midi_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pm.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pm.c new file mode 100755 index 00000000..00c88f64 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pm.c @@ -0,0 +1,277 @@ +/******************************************************************************* +* File Name: USBFS_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.h" +#include "USBFS_pvt.h" + + +/*************************************** +* Custom Declarations +***************************************/ +/* `#START PM_CUSTOM_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +/*************************************** +* Local data allocation +***************************************/ + +static USBFS_BACKUP_STRUCT USBFS_backup; + + +#if(USBFS_DP_ISR_REMOVE == 0u) + + + /******************************************************************************* + * Function Name: USBFS_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_DP_ISR) + { + /* `#START DP_USER_CODE` Place your code here */ + + /* `#END` */ + + /* Clears active interrupt */ + CY_GET_REG8(USBFS_DP_INTSTAT_PTR); + } + +#endif /* (USBFS_DP_ISR_REMOVE == 0u) */ + + +/******************************************************************************* +* Function Name: USBFS_SaveConfig +******************************************************************************** +* +* Summary: +* Saves the current user configuration. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_SaveConfig(void) +{ + +} + + +/******************************************************************************* +* Function Name: USBFS_RestoreConfig +******************************************************************************** +* +* Summary: +* Restores the current user configuration. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_RestoreConfig(void) +{ + if(USBFS_configuration != 0u) + { + USBFS_ConfigReg(); + } +} + + +/******************************************************************************* +* Function Name: USBFS_Suspend +******************************************************************************** +* +* Summary: +* This function disables the USBFS block and prepares for power donwn mode. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Global variables: +* USBFS_backup.enable: modified. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_Suspend(void) +{ + uint8 enableInterrupts; + enableInterrupts = CyEnterCriticalSection(); + + if((CY_GET_REG8(USBFS_CR0_PTR) & USBFS_CR0_ENABLE) != 0u) + { /* USB block is enabled */ + USBFS_backup.enableState = 1u; + + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + USBFS_Stop_DMA(USBFS_MAX_EP); /* Stop all DMAs */ + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + /* Ensure USB transmit enable is low (USB_USBIO_CR0.ten). - Manual Transmission - Disabled */ + USBFS_USBIO_CR0_REG &= (uint8)~USBFS_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_PM_USB_CR0_REG &= + (uint8)~(USBFS_PM_USB_CR0_PD_N | USBFS_PM_USB_CR0_PD_PULLUP_N); + + /* Disable the SIE */ + USBFS_CR0_REG &= (uint8)~USBFS_CR0_ENABLE; + + CyDelayUs(0u); /*~50ns delay */ + /* Store mode and Disable VRegulator*/ + USBFS_backup.mode = USBFS_CR1_REG & USBFS_CR1_REG_ENABLE; + USBFS_CR1_REG &= (uint8)~USBFS_CR1_REG_ENABLE; + + CyDelayUs(1u); /* 0.5 us min delay */ + /* Disable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/ + USBFS_PM_USB_CR0_REG &= (uint8)~USBFS_PM_USB_CR0_REF_EN; + + /* Switch DP and DM terminals to GPIO mode and disconnect 1.5k pullup*/ + USBFS_USBIO_CR1_REG |= USBFS_USBIO_CR1_IOMODE; + + /* Disable USB in ACT PM */ + USBFS_PM_ACT_CFG_REG &= (uint8)~USBFS_PM_ACT_EN_FSUSB; + /* Disable USB block for Standby Power Mode */ + USBFS_PM_STBY_CFG_REG &= (uint8)~USBFS_PM_STBY_EN_FSUSB; + CyDelayUs(1u); /* min 0.5us delay required */ + + } + else + { + USBFS_backup.enableState = 0u; + } + CyExitCriticalSection(enableInterrupts); + + /* Set the DP Interrupt for wake-up from sleep mode. */ + #if(USBFS_DP_ISR_REMOVE == 0u) + (void) CyIntSetVector(USBFS_DP_INTC_VECT_NUM, &USBFS_DP_ISR); + CyIntSetPriority(USBFS_DP_INTC_VECT_NUM, USBFS_DP_INTC_PRIOR); + CyIntClearPending(USBFS_DP_INTC_VECT_NUM); + CyIntEnable(USBFS_DP_INTC_VECT_NUM); + #endif /* (USBFS_DP_ISR_REMOVE == 0u) */ + +} + + +/******************************************************************************* +* Function Name: USBFS_Resume +******************************************************************************** +* +* Summary: +* This function enables the USBFS block after power down mode. +* +* Parameters: +* None. +* +* Return: +* None. +* +* Global variables: +* USBFS_backup - checked. +* +* Reentrant: +* No. +* +*******************************************************************************/ +void USBFS_Resume(void) +{ + uint8 enableInterrupts; + enableInterrupts = CyEnterCriticalSection(); + + if(USBFS_backup.enableState != 0u) + { + #if(USBFS_DP_ISR_REMOVE == 0u) + CyIntDisable(USBFS_DP_INTC_VECT_NUM); + #endif /* End USBFS_DP_ISR_REMOVE */ + + /* Enable USB block */ + USBFS_PM_ACT_CFG_REG |= USBFS_PM_ACT_EN_FSUSB; + /* Enable USB block for Standby Power Mode */ + USBFS_PM_STBY_CFG_REG |= USBFS_PM_STBY_EN_FSUSB; + /* Enable core clock */ + USBFS_USB_CLK_EN_REG |= USBFS_USB_CLK_ENABLE; + + /* Enable the USBIO reference by setting PM.USB_CR0.fsusbio_ref_en.*/ + USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_REF_EN; + /* The reference will be available ~40us after power restored */ + CyDelayUs(40u); + /* Return VRegulator*/ + USBFS_CR1_REG |= USBFS_backup.mode; + CyDelayUs(0u); /*~50ns delay */ + /* Enable USBIO */ + USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_PD_N; + CyDelayUs(2u); + /* Set the USBIO pull-up enable */ + USBFS_PM_USB_CR0_REG |= USBFS_PM_USB_CR0_PD_PULLUP_N; + + /* Reinit Arbiter configuration for DMA transfers */ + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + /* usb arb interrupt enable */ + USBFS_ARB_INT_EN_REG = USBFS_ARB_INT_MASK; + #if(USBFS_EP_MM == USBFS__EP_DMAMANUAL) + USBFS_ARB_CFG_REG = USBFS_ARB_CFG_MANUAL_DMA; + #endif /* End USBFS_EP_MM == USBFS__EP_DMAMANUAL */ + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + /*Set cfg cmplt this rises DMA request when the full configuration is done */ + USBFS_ARB_CFG_REG = USBFS_ARB_CFG_AUTO_DMA | USBFS_ARB_CFG_AUTO_MEM; + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + /* STALL_IN_OUT */ + CY_SET_REG8(USBFS_EP0_CR_PTR, USBFS_MODE_STALL_IN_OUT); + /* Enable the SIE with a last address */ + USBFS_CR0_REG |= USBFS_CR0_ENABLE; + CyDelayCycles(1u); + /* Finally, Enable d+ pullup and select iomode to USB mode*/ + CY_SET_REG8(USBFS_USBIO_CR1_PTR, USBFS_USBIO_CR1_USBPUEN); + + /* Restore USB register settings */ + USBFS_RestoreConfig(); + + } + CyExitCriticalSection(enableInterrupts); +} + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h new file mode 100755 index 00000000..38119371 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_pvt.h @@ -0,0 +1,203 @@ +/******************************************************************************* +* 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_pvt_H) +#define CY_USBFS_USBFS_pvt_H + + +/*************************************** +* Private Variables +***************************************/ + +/* Generated external references for descriptors*/ +extern const uint8 CYCODE USBFS_DEVICE0_DESCR[18u]; +extern const uint8 CYCODE USBFS_DEVICE0_CONFIGURATION0_DESCR[41u]; +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_TABLE[2u]; +extern const T_USBFS_LUT CYCODE USBFS_TABLE[1u]; +extern const uint8 CYCODE USBFS_SN_STRING_DESCRIPTOR[10]; +extern const uint8 CYCODE USBFS_STRING_DESCRIPTORS[45u]; +extern T_USBFS_XFER_STATUS_BLOCK USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_RPT_SCB; +extern uint8 USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF[ + USBFS_DEVICE0_CONFIGURATION0_INTERFACE0_ALTERNATE0_HID_IN_BUF_SIZE]; +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 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 uint8 CYCODE USBFS_MSOS_DESCRIPTOR[USBFS_MSOS_DESCRIPTOR_LENGTH]; +extern const uint8 CYCODE USBFS_MSOS_CONFIGURATION_DESCR[USBFS_MSOS_CONF_DESCR_LENGTH]; +#if defined(USBFS_ENABLE_IDSN_STRING) + extern uint8 USBFS_idSerialNumberStringDescriptor[USBFS_IDSN_DESCR_LENGTH]; +#endif /* USBFS_ENABLE_IDSN_STRING */ + +extern volatile uint8 USBFS_interfaceNumber; +extern volatile uint8 USBFS_interfaceSetting[USBFS_MAX_INTERFACES_NUMBER]; +extern volatile uint8 USBFS_interfaceSetting_last[USBFS_MAX_INTERFACES_NUMBER]; +extern volatile uint8 USBFS_deviceAddress; +extern volatile uint8 USBFS_interfaceStatus[USBFS_MAX_INTERFACES_NUMBER]; +extern const uint8 CYCODE *USBFS_interfaceClass; + +extern volatile T_USBFS_EP_CTL_BLOCK USBFS_EP[USBFS_MAX_EP]; +extern volatile T_USBFS_TD USBFS_currentTD; + +#if(USBFS_EP_MM != USBFS__EP_MANUAL) + extern uint8 USBFS_DmaChan[USBFS_MAX_EP]; + extern uint8 USBFS_DmaTd[USBFS_MAX_EP]; +#endif /* End USBFS_EP_MM */ + +extern volatile uint8 USBFS_ep0Toggle; +extern volatile uint8 USBFS_lastPacketSize; +extern volatile uint8 USBFS_ep0Mode; +extern volatile uint8 USBFS_ep0Count; +extern volatile uint16 USBFS_transferByteCount; + + +/*************************************** +* Private Function Prototypes +***************************************/ +void USBFS_ReInitComponent(void) ; +void USBFS_HandleSetup(void) ; +void USBFS_HandleIN(void) ; +void USBFS_HandleOUT(void) ; +void USBFS_LoadEP0(void) ; +uint8 USBFS_InitControlRead(void) ; +uint8 USBFS_InitControlWrite(void) ; +void USBFS_ControlReadDataStage(void) ; +void USBFS_ControlReadStatusStage(void) ; +void USBFS_ControlReadPrematureStatus(void) + ; +uint8 USBFS_InitControlWrite(void) ; +uint8 USBFS_InitZeroLengthControlTransfer(void) + ; +void USBFS_ControlWriteDataStage(void) ; +void USBFS_ControlWriteStatusStage(void) ; +void USBFS_ControlWritePrematureStatus(void) + ; +uint8 USBFS_InitNoDataControlTransfer(void) ; +void USBFS_NoDataControlStatusStage(void) ; +void USBFS_InitializeStatusBlock(void) ; +void USBFS_UpdateStatusBlock(uint8 completionCode) ; +uint8 USBFS_DispatchClassRqst(void) ; + +void USBFS_Config(uint8 clearAltSetting) ; +void USBFS_ConfigAltChanged(void) ; +void USBFS_ConfigReg(void) ; + +const T_USBFS_LUT CYCODE *USBFS_GetConfigTablePtr(uint8 c) + ; +const T_USBFS_LUT CYCODE *USBFS_GetDeviceTablePtr(void) + ; +const uint8 CYCODE *USBFS_GetInterfaceClassTablePtr(void) + ; +uint8 USBFS_ClearEndpointHalt(void) ; +uint8 USBFS_SetEndpointHalt(void) ; +uint8 USBFS_ValidateAlternateSetting(void) ; + +void USBFS_SaveConfig(void) ; +void USBFS_RestoreConfig(void) ; + +#if defined(USBFS_ENABLE_IDSN_STRING) + void USBFS_ReadDieID(uint8 descr[]) ; +#endif /* USBFS_ENABLE_IDSN_STRING */ + +#if defined(USBFS_ENABLE_HID_CLASS) + uint8 USBFS_DispatchHIDClassRqst(void); +#endif /* End USBFS_ENABLE_HID_CLASS */ +#if defined(USBFS_ENABLE_AUDIO_CLASS) + uint8 USBFS_DispatchAUDIOClassRqst(void); +#endif /* End USBFS_ENABLE_HID_CLASS */ +#if defined(USBFS_ENABLE_CDC_CLASS) + uint8 USBFS_DispatchCDCClassRqst(void); +#endif /* End USBFS_ENABLE_CDC_CLASS */ + +CY_ISR_PROTO(USBFS_EP_0_ISR); +#if(USBFS_EP1_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_1_ISR); +#endif /* End USBFS_EP1_ISR_REMOVE */ +#if(USBFS_EP2_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_2_ISR); +#endif /* End USBFS_EP2_ISR_REMOVE */ +#if(USBFS_EP3_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_3_ISR); +#endif /* End USBFS_EP3_ISR_REMOVE */ +#if(USBFS_EP4_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_4_ISR); +#endif /* End USBFS_EP4_ISR_REMOVE */ +#if(USBFS_EP5_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_5_ISR); +#endif /* End USBFS_EP5_ISR_REMOVE */ +#if(USBFS_EP6_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_6_ISR); +#endif /* End USBFS_EP6_ISR_REMOVE */ +#if(USBFS_EP7_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_7_ISR); +#endif /* End USBFS_EP7_ISR_REMOVE */ +#if(USBFS_EP8_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_EP_8_ISR); +#endif /* End USBFS_EP8_ISR_REMOVE */ +CY_ISR_PROTO(USBFS_BUS_RESET_ISR); +#if(USBFS_SOF_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_SOF_ISR); +#endif /* End USBFS_SOF_ISR_REMOVE */ +#if(USBFS_EP_MM != USBFS__EP_MANUAL) + CY_ISR_PROTO(USBFS_ARB_ISR); +#endif /* End USBFS_EP_MM */ +#if(USBFS_DP_ISR_REMOVE == 0u) + CY_ISR_PROTO(USBFS_DP_ISR); +#endif /* End USBFS_DP_ISR_REMOVE */ + + +/*************************************** +* Request Handlers +***************************************/ + +uint8 USBFS_HandleStandardRqst(void) ; +uint8 USBFS_DispatchClassRqst(void) ; +uint8 USBFS_HandleVendorRqst(void) ; + + +/*************************************** +* HID Internal references +***************************************/ +#if defined(USBFS_ENABLE_HID_CLASS) + void USBFS_FindReport(void) ; + void USBFS_FindReportDescriptor(void) ; + void USBFS_FindHidClassDecriptor(void) ; +#endif /* USBFS_ENABLE_HID_CLASS */ + + +/*************************************** +* MIDI Internal references +***************************************/ +#if defined(USBFS_ENABLE_MIDI_STREAMING) + void USBFS_MIDI_IN_EP_Service(void) ; +#endif /* USBFS_ENABLE_MIDI_STREAMING */ + + +#endif /* CY_USBFS_USBFS_pvt_H */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_std.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_std.c new file mode 100755 index 00000000..18f0364a --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_std.c @@ -0,0 +1,1134 @@ +/******************************************************************************* +* File Name: USBFS_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.h" +#include "USBFS_cdc.h" +#include "USBFS_pvt.h" +#if defined(USBFS_ENABLE_MIDI_STREAMING) + #include "USBFS_midi.h" +#endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + + +/*************************************** +* Static data allocation +***************************************/ + +#if defined(USBFS_ENABLE_FWSN_STRING) + static volatile uint8 *USBFS_fwSerialNumberStringDescriptor; + static volatile uint8 USBFS_snStringConfirm = USBFS_FALSE; +#endif /* USBFS_ENABLE_FWSN_STRING */ + +#if defined(USBFS_ENABLE_FWSN_STRING) + + + /******************************************************************************* + * Function Name: USBFS_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_SerialNumString(uint8 snString[]) + { + USBFS_snStringConfirm = USBFS_FALSE; + if(snString != NULL) + { + USBFS_fwSerialNumberStringDescriptor = snString; + /* Check descriptor validation */ + if( (snString[0u] > 1u ) && (snString[1u] == USBFS_DESCR_STRING) ) + { + USBFS_snStringConfirm = USBFS_TRUE; + } + } + } + +#endif /* USBFS_ENABLE_FWSN_STRING */ + + +/******************************************************************************* +* Function Name: USBFS_HandleStandardRqst +******************************************************************************** +* +* Summary: +* This Routine dispatches standard requests +* +* Parameters: +* None. +* +* Return: +* TRUE if request handled. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_HandleStandardRqst(void) +{ + uint8 requestHandled = USBFS_FALSE; + uint8 interfaceNumber; + #if defined(USBFS_ENABLE_STRINGS) + volatile uint8 *pStr = 0u; + #if defined(USBFS_ENABLE_DESCRIPTOR_STRINGS) + uint8 nStr; + uint8 descrLength; + #endif /* USBFS_ENABLE_DESCRIPTOR_STRINGS */ + #endif /* USBFS_ENABLE_STRINGS */ + static volatile uint8 USBFS_tBuffer[USBFS_STATUS_LENGTH_MAX]; + const T_USBFS_LUT CYCODE *pTmp; + USBFS_currentTD.count = 0u; + + if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == USBFS_RQST_DIR_D2H) + { + /* Control Read */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_GET_DESCRIPTOR: + if (CY_GET_REG8(USBFS_wValueHi) == USBFS_DESCR_DEVICE) + { + pTmp = USBFS_GetDeviceTablePtr(); + USBFS_currentTD.pData = (volatile uint8 *)pTmp->p_list; + USBFS_currentTD.count = USBFS_DEVICE_DESCR_LENGTH; + requestHandled = USBFS_InitControlRead(); + } + else if (CY_GET_REG8(USBFS_wValueHi) == USBFS_DESCR_CONFIG) + { + pTmp = USBFS_GetConfigTablePtr(CY_GET_REG8(USBFS_wValueLo)); + USBFS_currentTD.pData = (volatile uint8 *)pTmp->p_list; + USBFS_currentTD.count = ((uint16)(USBFS_currentTD.pData)[ \ + USBFS_CONFIG_DESCR_TOTAL_LENGTH_HI] << 8u) | \ + (USBFS_currentTD.pData)[USBFS_CONFIG_DESCR_TOTAL_LENGTH_LOW]; + requestHandled = USBFS_InitControlRead(); + } + #if defined(USBFS_ENABLE_STRINGS) + else if (CY_GET_REG8(USBFS_wValueHi) == USBFS_DESCR_STRING) + { + /* Descriptor Strings*/ + #if defined(USBFS_ENABLE_DESCRIPTOR_STRINGS) + nStr = 0u; + pStr = (volatile uint8 *)&USBFS_STRING_DESCRIPTORS[0u]; + while ( (CY_GET_REG8(USBFS_wValueLo) > nStr) && (*pStr != 0u) ) + { + /* Read descriptor length from 1st byte */ + descrLength = *pStr; + /* Move to next string descriptor */ + pStr = &pStr[descrLength]; + nStr++; + } + #endif /* End USBFS_ENABLE_DESCRIPTOR_STRINGS */ + /* Microsoft OS String*/ + #if defined(USBFS_ENABLE_MSOS_STRING) + if( CY_GET_REG8(USBFS_wValueLo) == USBFS_STRING_MSOS ) + { + pStr = (volatile uint8 *)&USBFS_MSOS_DESCRIPTOR[0u]; + } + #endif /* End USBFS_ENABLE_MSOS_STRING*/ + /* SN string */ + #if defined(USBFS_ENABLE_SN_STRING) + if( (CY_GET_REG8(USBFS_wValueLo) != 0u) && + (CY_GET_REG8(USBFS_wValueLo) == + USBFS_DEVICE0_DESCR[USBFS_DEVICE_DESCR_SN_SHIFT]) ) + { + pStr = (volatile uint8 *)&USBFS_SN_STRING_DESCRIPTOR[0u]; + #if defined(USBFS_ENABLE_FWSN_STRING) + if(USBFS_snStringConfirm != USBFS_FALSE) + { + pStr = USBFS_fwSerialNumberStringDescriptor; + } + #endif /* USBFS_ENABLE_FWSN_STRING */ + #if defined(USBFS_ENABLE_IDSN_STRING) + /* Read DIE ID and generate string descriptor in RAM */ + USBFS_ReadDieID(USBFS_idSerialNumberStringDescriptor); + pStr = USBFS_idSerialNumberStringDescriptor; + #endif /* End USBFS_ENABLE_IDSN_STRING */ + } + #endif /* End USBFS_ENABLE_SN_STRING */ + if (*pStr != 0u) + { + USBFS_currentTD.count = *pStr; + USBFS_currentTD.pData = pStr; + requestHandled = USBFS_InitControlRead(); + } + } + #endif /* End USBFS_ENABLE_STRINGS */ + else + { + requestHandled = USBFS_DispatchClassRqst(); + } + break; + case USBFS_GET_STATUS: + switch ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK)) + { + case USBFS_RQST_RCPT_EP: + USBFS_currentTD.count = USBFS_EP_STATUS_LENGTH; + USBFS_tBuffer[0u] = USBFS_EP[ \ + CY_GET_REG8(USBFS_wIndexLo) & USBFS_DIR_UNUSED].hwEpState; + USBFS_tBuffer[1u] = 0u; + USBFS_currentTD.pData = &USBFS_tBuffer[0u]; + requestHandled = USBFS_InitControlRead(); + break; + case USBFS_RQST_RCPT_DEV: + USBFS_currentTD.count = USBFS_DEVICE_STATUS_LENGTH; + USBFS_tBuffer[0u] = USBFS_deviceStatus; + USBFS_tBuffer[1u] = 0u; + USBFS_currentTD.pData = &USBFS_tBuffer[0u]; + requestHandled = USBFS_InitControlRead(); + break; + default: /* requestHandled is initialized as FALSE by default */ + break; + } + break; + case USBFS_GET_CONFIGURATION: + USBFS_currentTD.count = 1u; + USBFS_currentTD.pData = (volatile uint8 *)&USBFS_configuration; + requestHandled = USBFS_InitControlRead(); + break; + case USBFS_GET_INTERFACE: + USBFS_currentTD.count = 1u; + USBFS_currentTD.pData = (volatile uint8 *)&USBFS_interfaceSetting[ \ + CY_GET_REG8(USBFS_wIndexLo)]; + requestHandled = USBFS_InitControlRead(); + break; + default: /* requestHandled is initialized as FALSE by default */ + break; + } + } + else { + /* Control Write */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_SET_ADDRESS: + USBFS_deviceAddress = CY_GET_REG8(USBFS_wValueLo); + requestHandled = USBFS_InitNoDataControlTransfer(); + break; + case USBFS_SET_CONFIGURATION: + USBFS_configuration = CY_GET_REG8(USBFS_wValueLo); + USBFS_configurationChanged = USBFS_TRUE; + USBFS_Config(USBFS_TRUE); + requestHandled = USBFS_InitNoDataControlTransfer(); + break; + case USBFS_SET_INTERFACE: + if (USBFS_ValidateAlternateSetting() != 0u) + { + interfaceNumber = CY_GET_REG8(USBFS_wIndexLo); + USBFS_interfaceNumber = interfaceNumber; + USBFS_configurationChanged = USBFS_TRUE; + #if ((USBFS_EP_MA == USBFS__MA_DYNAMIC) && \ + (USBFS_EP_MM == USBFS__EP_MANUAL) ) + USBFS_Config(USBFS_FALSE); + #else + USBFS_ConfigAltChanged(); + #endif /* End (USBFS_EP_MA == USBFS__MA_DYNAMIC) */ + /* Update handled Alt setting changes status */ + USBFS_interfaceSetting_last[interfaceNumber] = + USBFS_interfaceSetting[interfaceNumber]; + requestHandled = USBFS_InitNoDataControlTransfer(); + } + break; + case USBFS_CLEAR_FEATURE: + switch (CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) + { + case USBFS_RQST_RCPT_EP: + if (CY_GET_REG8(USBFS_wValueLo) == USBFS_ENDPOINT_HALT) + { + requestHandled = USBFS_ClearEndpointHalt(); + } + break; + case USBFS_RQST_RCPT_DEV: + /* Clear device REMOTE_WAKEUP */ + if (CY_GET_REG8(USBFS_wValueLo) == USBFS_DEVICE_REMOTE_WAKEUP) + { + USBFS_deviceStatus &= (uint8)~USBFS_DEVICE_STATUS_REMOTE_WAKEUP; + requestHandled = USBFS_InitNoDataControlTransfer(); + } + break; + case USBFS_RQST_RCPT_IFC: + /* Validate interfaceNumber */ + if (CY_GET_REG8(USBFS_wIndexLo) < USBFS_MAX_INTERFACES_NUMBER) + { + USBFS_interfaceStatus[CY_GET_REG8(USBFS_wIndexLo)] &= + (uint8)~(CY_GET_REG8(USBFS_wValueLo)); + requestHandled = USBFS_InitNoDataControlTransfer(); + } + break; + default: /* requestHandled is initialized as FALSE by default */ + break; + } + break; + case USBFS_SET_FEATURE: + switch (CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_RCPT_MASK) + { + case USBFS_RQST_RCPT_EP: + if (CY_GET_REG8(USBFS_wValueLo) == USBFS_ENDPOINT_HALT) + { + requestHandled = USBFS_SetEndpointHalt(); + } + break; + case USBFS_RQST_RCPT_DEV: + /* Set device REMOTE_WAKEUP */ + if (CY_GET_REG8(USBFS_wValueLo) == USBFS_DEVICE_REMOTE_WAKEUP) + { + USBFS_deviceStatus |= USBFS_DEVICE_STATUS_REMOTE_WAKEUP; + requestHandled = USBFS_InitNoDataControlTransfer(); + } + break; + case USBFS_RQST_RCPT_IFC: + /* Validate interfaceNumber */ + if (CY_GET_REG8(USBFS_wIndexLo) < USBFS_MAX_INTERFACES_NUMBER) + { + USBFS_interfaceStatus[CY_GET_REG8(USBFS_wIndexLo)] &= + (uint8)~(CY_GET_REG8(USBFS_wValueLo)); + requestHandled = USBFS_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_ENABLE_IDSN_STRING) + + /*************************************************************************** + * Function Name: USBFS_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_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_IDSN_DESCR_LENGTH; + descr[1u] = USBFS_DESCR_STRING; + + /* fill descriptor */ + for(i = 2u; i < USBFS_IDSN_DESCR_LENGTH; i += 4u) + { + value = CY_GET_XTND_REG8((void CYFAR *)(USBFS_DIE_ID + j)); + j++; + descr[i] = (uint8)hex[value >> 4u]; + descr[i + 2u] = (uint8)hex[value & 0x0Fu]; + } + } + } + +#endif /* End USBFS_ENABLE_IDSN_STRING */ + + +/******************************************************************************* +* Function Name: USBFS_ConfigReg +******************************************************************************** +* +* Summary: +* This routine configures hardware registers from the variables. +* It is called from USBFS_Config() function and from RestoreConfig +* after Wakeup. +* +* Parameters: +* None. +* +* Return: +* None. +* +*******************************************************************************/ +void USBFS_ConfigReg(void) +{ + uint8 ep; + uint8 i; + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + uint8 ep_type = 0u; + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + + /* Set the endpoint buffer addresses */ + ep = USBFS_EP1; + for (i = 0u; i < 0x80u; i+= 0x10u) + { + CY_SET_REG8((reg8 *)(USBFS_ARB_EP1_CFG_IND + i), USBFS_ARB_EPX_CFG_CRC_BYPASS | + USBFS_ARB_EPX_CFG_RESET); + + #if(USBFS_EP_MM != USBFS__EP_MANUAL) + /* Enable all Arbiter EP Interrupts : err, buf under, buf over, dma gnt(mode2 only), in buf full */ + CY_SET_REG8((reg8 *)(USBFS_ARB_EP1_INT_EN_IND + i), USBFS_ARB_EPX_INT_MASK); + #endif /* End USBFS_EP_MM != USBFS__EP_MANUAL */ + + if(USBFS_EP[ep].epMode != USBFS_MODE_DISABLE) + { + if((USBFS_EP[ep].addr & USBFS_DIR_IN) != 0u ) + { + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + i), USBFS_MODE_NAK_IN); + } + else + { + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + i), USBFS_MODE_NAK_OUT); + /* Prepare EP type mask for automatic memory allocation */ + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + ep_type |= (uint8)(0x01u << (ep - USBFS_EP1)); + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + } + } + else + { + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + i), USBFS_MODE_STALL_DATA_EP); + } + + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT0_IND + i), USBFS_EP[ep].bufferSize >> 8u); + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT1_IND + i), USBFS_EP[ep].bufferSize & 0xFFu); + + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_RA_IND + i), USBFS_EP[ep].buffOffset & 0xFFu); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_RA_MSB_IND + i), USBFS_EP[ep].buffOffset >> 8u); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_WA_IND + i), USBFS_EP[ep].buffOffset & 0xFFu); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_WA_MSB_IND + i), USBFS_EP[ep].buffOffset >> 8u); + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO */ + + ep++; + } + + #if(USBFS_EP_MM == USBFS__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_BUF_SIZE_REG = USBFS_DMA_BUF_SIZE; + USBFS_DMA_THRES_REG = USBFS_DMA_BYTES_PER_BURST; /* DMA burst threshold */ + USBFS_DMA_THRES_MSB_REG = 0u; + USBFS_EP_ACTIVE_REG = USBFS_ARB_INT_MASK; + USBFS_EP_TYPE_REG = ep_type; + /* Cfg_cmp bit set to 1 once configuration is complete. */ + USBFS_ARB_CFG_REG = USBFS_ARB_CFG_AUTO_DMA | USBFS_ARB_CFG_AUTO_MEM | + USBFS_ARB_CFG_CFG_CPM; + /* Cfg_cmp bit set to 0 during configuration of PFSUSB Registers. */ + USBFS_ARB_CFG_REG = USBFS_ARB_CFG_AUTO_DMA | USBFS_ARB_CFG_AUTO_MEM; + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + + CY_SET_REG8(USBFS_SIE_EP_INT_EN_PTR, 0xFFu); +} + + +/******************************************************************************* +* Function Name: USBFS_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_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_Config(uint8 clearAltSetting) +{ + uint8 ep; + uint8 cur_ep; + uint8 i; + uint8 ep_type; + const uint8 *pDescr; + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + uint16 buffCount = 0u; + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO */ + + const T_USBFS_LUT CYCODE *pTmp; + const T_USBFS_EP_SETTINGS_BLOCK CYCODE *pEP; + + /* Clear all of the endpoints */ + for (ep = 0u; ep < USBFS_MAX_EP; ep++) + { + USBFS_EP[ep].attrib = 0u; + USBFS_EP[ep].hwEpState = 0u; + USBFS_EP[ep].apiEpState = USBFS_NO_EVENT_PENDING; + USBFS_EP[ep].epToggle = 0u; + USBFS_EP[ep].epMode = USBFS_MODE_DISABLE; + USBFS_EP[ep].bufferSize = 0u; + USBFS_EP[ep].interface = 0u; + + } + + /* Clear Alternate settings for all interfaces */ + if(clearAltSetting != 0u) + { + for (i = 0u; i < USBFS_MAX_INTERFACES_NUMBER; i++) + { + USBFS_interfaceSetting[i] = 0x00u; + USBFS_interfaceSetting_last[i] = 0x00u; + } + } + + /* Init Endpoints and Device Status if configured */ + if(USBFS_configuration > 0u) + { + pTmp = USBFS_GetConfigTablePtr(USBFS_configuration - 1u); + /* Set Power status for current configuration */ + pDescr = (const uint8 *)pTmp->p_list; + if((pDescr[USBFS_CONFIG_DESCR_ATTRIB] & USBFS_CONFIG_DESCR_ATTRIB_SELF_POWERED) != 0u) + { + USBFS_deviceStatus |= USBFS_DEVICE_STATUS_SELF_POWERED; + } + else + { + USBFS_deviceStatus &= (uint8)~USBFS_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_EP_MA == USBFS__MA_DYNAMIC) && \ + (USBFS_EP_MM == USBFS__EP_MANUAL) ) + /* Configure for dynamic EP memory allocation */ + /* p_list points the endpoint setting table. */ + pEP = (T_USBFS_EP_SETTINGS_BLOCK *) pTmp->p_list; + for (i = 0u; i < ep; i++) + { + /* Compare current Alternate setting with EP Alt*/ + if(USBFS_interfaceSetting[pEP->interface] == pEP->altSetting) + { + cur_ep = pEP->addr & USBFS_DIR_UNUSED; + ep_type = pEP->attributes & USBFS_EP_TYPE_MASK; + if (pEP->addr & USBFS_DIR_IN) + { + /* IN Endpoint */ + USBFS_EP[cur_ep].apiEpState = USBFS_EVENT_PENDING; + USBFS_EP[cur_ep].epMode = (ep_type == USBFS_EP_TYPE_ISOC) ? + USBFS_MODE_ISO_IN : USBFS_MODE_ACK_IN; + #if defined(USBFS_ENABLE_CDC_CLASS) + if(((pEP->bMisc == USBFS_CLASS_CDC_DATA) || + (pEP->bMisc == USBFS_CLASS_CDC)) && + (ep_type != USBFS_EP_TYPE_INT)) + { + USBFS_cdc_data_in_ep = cur_ep; + } + #endif /* End USBFS_ENABLE_CDC_CLASS*/ + #if ( defined(USBFS_ENABLE_MIDI_STREAMING) && \ + (USBFS_MIDI_IN_BUFF_SIZE > 0) ) + if((pEP->bMisc == USBFS_CLASS_AUDIO) && + (ep_type == USBFS_EP_TYPE_BULK)) + { + USBFS_midi_in_ep = cur_ep; + } + #endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + } + else + { + /* OUT Endpoint */ + USBFS_EP[cur_ep].apiEpState = USBFS_NO_EVENT_PENDING; + USBFS_EP[cur_ep].epMode = (ep_type == USBFS_EP_TYPE_ISOC) ? + USBFS_MODE_ISO_OUT : USBFS_MODE_ACK_OUT; + #if defined(USBFS_ENABLE_CDC_CLASS) + if(((pEP->bMisc == USBFS_CLASS_CDC_DATA) || + (pEP->bMisc == USBFS_CLASS_CDC)) && + (ep_type != USBFS_EP_TYPE_INT)) + { + USBFS_cdc_data_out_ep = cur_ep; + } + #endif /* End USBFS_ENABLE_CDC_CLASS*/ + #if ( defined(USBFS_ENABLE_MIDI_STREAMING) && \ + (USBFS_MIDI_OUT_BUFF_SIZE > 0) ) + if((pEP->bMisc == USBFS_CLASS_AUDIO) && + (ep_type == USBFS_EP_TYPE_BULK)) + { + USBFS_midi_out_ep = cur_ep; + } + #endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + } + USBFS_EP[cur_ep].bufferSize = pEP->bufferSize; + USBFS_EP[cur_ep].addr = pEP->addr; + USBFS_EP[cur_ep].attrib = pEP->attributes; + } + pEP = &pEP[1u]; + } + #else /* Config for static EP memory allocation */ + for (i = USBFS_EP1; i < USBFS_MAX_EP; i++) + { + /* p_list points the endpoint setting table. */ + pEP = (const T_USBFS_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_DIR_UNUSED)) + { + if(USBFS_EP[i].bufferSize < pEP->bufferSize) + { + USBFS_EP[i].bufferSize = pEP->bufferSize; + } + /* Compare current Alternate setting with EP Alt*/ + if(USBFS_interfaceSetting[pEP->interface] == pEP->altSetting) + { + ep_type = pEP->attributes & USBFS_EP_TYPE_MASK; + if ((pEP->addr & USBFS_DIR_IN) != 0u) + { + /* IN Endpoint */ + USBFS_EP[i].apiEpState = USBFS_EVENT_PENDING; + USBFS_EP[i].epMode = (ep_type == USBFS_EP_TYPE_ISOC) ? + USBFS_MODE_ISO_IN : USBFS_MODE_ACK_IN; + /* Find and init CDC IN endpoint number */ + #if defined(USBFS_ENABLE_CDC_CLASS) + if(((pEP->bMisc == USBFS_CLASS_CDC_DATA) || + (pEP->bMisc == USBFS_CLASS_CDC)) && + (ep_type != USBFS_EP_TYPE_INT)) + { + USBFS_cdc_data_in_ep = i; + } + #endif /* End USBFS_ENABLE_CDC_CLASS*/ + #if ( defined(USBFS_ENABLE_MIDI_STREAMING) && \ + (USBFS_MIDI_IN_BUFF_SIZE > 0) ) + if((pEP->bMisc == USBFS_CLASS_AUDIO) && + (ep_type == USBFS_EP_TYPE_BULK)) + { + USBFS_midi_in_ep = i; + } + #endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + } + else + { + /* OUT Endpoint */ + USBFS_EP[i].apiEpState = USBFS_NO_EVENT_PENDING; + USBFS_EP[i].epMode = (ep_type == USBFS_EP_TYPE_ISOC) ? + USBFS_MODE_ISO_OUT : USBFS_MODE_ACK_OUT; + /* Find and init CDC IN endpoint number */ + #if defined(USBFS_ENABLE_CDC_CLASS) + if(((pEP->bMisc == USBFS_CLASS_CDC_DATA) || + (pEP->bMisc == USBFS_CLASS_CDC)) && + (ep_type != USBFS_EP_TYPE_INT)) + { + USBFS_cdc_data_out_ep = i; + } + #endif /* End USBFS_ENABLE_CDC_CLASS*/ + #if ( defined(USBFS_ENABLE_MIDI_STREAMING) && \ + (USBFS_MIDI_OUT_BUFF_SIZE > 0) ) + if((pEP->bMisc == USBFS_CLASS_AUDIO) && + (ep_type == USBFS_EP_TYPE_BULK)) + { + USBFS_midi_out_ep = i; + } + #endif /* End USBFS_ENABLE_MIDI_STREAMING*/ + } + USBFS_EP[i].addr = pEP->addr; + USBFS_EP[i].attrib = pEP->attributes; + + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + break; /* use first EP setting in Auto memory managment */ + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + } + } + pEP = &pEP[1u]; + } + } + #endif /* End (USBFS_EP_MA == USBFS__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_EP_SETTINGS_BLOCK CYCODE *) pTmp->p_list; + for (i = 0u; i < ep; i++) + { + /* Configure interface number for each EP*/ + USBFS_EP[pEP->addr & USBFS_DIR_UNUSED].interface = pEP->interface; + pEP = &pEP[1u]; + } + /* Init pointer on interface class table*/ + USBFS_interfaceClass = USBFS_GetInterfaceClassTablePtr(); + /* Set the endpoint buffer addresses */ + + #if(USBFS_EP_MM != USBFS__EP_DMAAUTO) + for (ep = USBFS_EP1; ep < USBFS_MAX_EP; ep++) + { + USBFS_EP[ep].buffOffset = buffCount; + buffCount += USBFS_EP[ep].bufferSize; + } + #endif /* End USBFS_EP_MM != USBFS__EP_DMAAUTO */ + + /* Configure hardware registers */ + USBFS_ConfigReg(); + } /* USBFS_configuration > 0 */ +} + + +/******************************************************************************* +* Function Name: USBFS_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_ConfigAltChanged(void) +{ + uint8 ep; + uint8 cur_ep; + uint8 i; + uint8 ep_type; + uint8 ri; + + const T_USBFS_LUT CYCODE *pTmp; + const T_USBFS_EP_SETTINGS_BLOCK CYCODE *pEP; + + + /* Init Endpoints and Device Status if configured */ + if(USBFS_configuration > 0u) + { + pTmp = USBFS_GetConfigTablePtr(USBFS_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_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_interfaceSetting[pEP->interface] != + USBFS_interfaceSetting_last[pEP->interface] ) && + (USBFS_interfaceSetting[pEP->interface] == pEP->altSetting) && + (pEP->interface == CY_GET_REG8(USBFS_wIndexLo))) + { + cur_ep = pEP->addr & USBFS_DIR_UNUSED; + ri = ((cur_ep - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + ep_type = pEP->attributes & USBFS_EP_TYPE_MASK; + if ((pEP->addr & USBFS_DIR_IN) != 0u) + { + /* IN Endpoint */ + USBFS_EP[cur_ep].apiEpState = USBFS_EVENT_PENDING; + USBFS_EP[cur_ep].epMode = (ep_type == USBFS_EP_TYPE_ISOC) ? + USBFS_MODE_ISO_IN : USBFS_MODE_ACK_IN; + } + else + { + /* OUT Endpoint */ + USBFS_EP[cur_ep].apiEpState = USBFS_NO_EVENT_PENDING; + USBFS_EP[cur_ep].epMode = (ep_type == USBFS_EP_TYPE_ISOC) ? + USBFS_MODE_ISO_OUT : USBFS_MODE_ACK_OUT; + } + /* Change the SIE mode for the selected EP to NAK ALL */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_NAK_IN_OUT); + USBFS_EP[cur_ep].bufferSize = pEP->bufferSize; + USBFS_EP[cur_ep].addr = pEP->addr; + USBFS_EP[cur_ep].attrib = pEP->attributes; + + /* Clear the data toggle */ + USBFS_EP[cur_ep].epToggle = 0u; + + /* Dynamic reconfiguration for mode 3 transfer */ + #if(USBFS_EP_MM == USBFS__EP_DMAAUTO) + /* In_data_rdy for selected EP should be set to 0 */ + * (reg8 *)(USBFS_ARB_EP1_CFG_IND + ri) &= (uint8)~USBFS_ARB_EPX_CFG_IN_DATA_RDY; + + /* write the EP number for which reconfiguration is required */ + USBFS_DYN_RECONFIG_REG = (cur_ep - USBFS_EP1) << + USBFS_DYN_RECONFIG_EP_SHIFT; + /* Set the dyn_config_en bit in dynamic reconfiguration register */ + USBFS_DYN_RECONFIG_REG |= USBFS_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_DYN_RECONFIG_REG & USBFS_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_DIR_IN) == 0u) + { + USBFS_EP_TYPE_REG |= (uint8)(0x01u << (cur_ep - USBFS_EP1)); + } + else + { + USBFS_EP_TYPE_REG &= (uint8)~(uint8)(0x01u << (cur_ep - USBFS_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_DYN_RECONFIG_REG &= (uint8)~USBFS_DYN_RECONFIG_ENABLE; + /* The main loop has to re-enable DMA and OUT endpoint*/ + #else + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT0_IND + ri), + USBFS_EP[cur_ep].bufferSize >> 8u); + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT1_IND + ri), + USBFS_EP[cur_ep].bufferSize & 0xFFu); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_RA_IND + ri), + USBFS_EP[cur_ep].buffOffset & 0xFFu); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_RA_MSB_IND + ri), + USBFS_EP[cur_ep].buffOffset >> 8u); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_WA_IND + ri), + USBFS_EP[cur_ep].buffOffset & 0xFFu); + CY_SET_REG8((reg8 *)(USBFS_ARB_RW1_WA_MSB_IND + ri), + USBFS_EP[cur_ep].buffOffset >> 8u); + #endif /* End USBFS_EP_MM == USBFS__EP_DMAAUTO */ + } + /* Get next EP element */ + pEP = &pEP[1u]; + } + } /* USBFS_configuration > 0 */ +} + + +/******************************************************************************* +* Function Name: USBFS_GetConfigTablePtr +******************************************************************************** +* +* Summary: +* This routine returns a pointer a configuration table entry +* +* Parameters: +* c: Configuration Index +* +* Return: +* Device Descriptor pointer. +* +*******************************************************************************/ +const T_USBFS_LUT CYCODE *USBFS_GetConfigTablePtr(uint8 c) + +{ + /* Device Table */ + const T_USBFS_LUT CYCODE *pTmp; + + pTmp = (const T_USBFS_LUT CYCODE *) USBFS_TABLE[USBFS_device].p_list; + + /* The first entry points to the Device Descriptor, + * the rest configuration entries. + */ + return( (const T_USBFS_LUT CYCODE *) pTmp[c + 1u].p_list ); +} + + +/******************************************************************************* +* Function Name: USBFS_GetDeviceTablePtr +******************************************************************************** +* +* Summary: +* This routine returns a pointer to the Device table +* +* Parameters: +* None. +* +* Return: +* Device Table pointer +* +*******************************************************************************/ +const T_USBFS_LUT CYCODE *USBFS_GetDeviceTablePtr(void) + +{ + /* Device Table */ + return( (const T_USBFS_LUT CYCODE *) USBFS_TABLE[USBFS_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_GetInterfaceClassTablePtr(void) + +{ + const T_USBFS_LUT CYCODE *pTmp; + uint8 currentInterfacesNum; + + pTmp = USBFS_GetConfigTablePtr(USBFS_configuration - 1u); + currentInterfacesNum = ((const uint8 *) pTmp->p_list)[USBFS_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_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_TerminateEP(uint8 ep) +{ + uint8 ri; + + ep &= USBFS_DIR_UNUSED; + ri = ((ep - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + + if ((ep > USBFS_EP0) && (ep < USBFS_MAX_EP)) + { + /* Set the endpoint Halt */ + USBFS_EP[ep].hwEpState |= (USBFS_ENDPOINT_STATUS_HALT); + + /* Clear the data toggle */ + USBFS_EP[ep].epToggle = 0u; + USBFS_EP[ep].apiEpState = USBFS_NO_EVENT_ALLOWED; + + if ((USBFS_EP[ep].addr & USBFS_DIR_IN) != 0u) + { + /* IN Endpoint */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_NAK_IN); + } + else + { + /* OUT Endpoint */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_NAK_OUT); + } + } +} + + +/******************************************************************************* +* Function Name: USBFS_SetEndpointHalt +******************************************************************************** +* +* Summary: +* This routine handles set endpoint halt. +* +* Parameters: +* None. +* +* Return: +* requestHandled. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_SetEndpointHalt(void) +{ + uint8 ep; + uint8 ri; + uint8 requestHandled = USBFS_FALSE; + + /* Set endpoint halt */ + ep = CY_GET_REG8(USBFS_wIndexLo) & USBFS_DIR_UNUSED; + ri = ((ep - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + + if ((ep > USBFS_EP0) && (ep < USBFS_MAX_EP)) + { + /* Set the endpoint Halt */ + USBFS_EP[ep].hwEpState |= (USBFS_ENDPOINT_STATUS_HALT); + + /* Clear the data toggle */ + USBFS_EP[ep].epToggle = 0u; + USBFS_EP[ep].apiEpState |= USBFS_NO_EVENT_ALLOWED; + + if ((USBFS_EP[ep].addr & USBFS_DIR_IN) != 0u) + { + /* IN Endpoint */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_STALL_DATA_EP | + USBFS_MODE_ACK_IN); + } + else + { + /* OUT Endpoint */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_STALL_DATA_EP | + USBFS_MODE_ACK_OUT); + } + requestHandled = USBFS_InitNoDataControlTransfer(); + } + + return(requestHandled); +} + + +/******************************************************************************* +* Function Name: USBFS_ClearEndpointHalt +******************************************************************************** +* +* Summary: +* This routine handles clear endpoint halt. +* +* Parameters: +* None. +* +* Return: +* requestHandled. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_ClearEndpointHalt(void) +{ + uint8 ep; + uint8 ri; + uint8 requestHandled = USBFS_FALSE; + + /* Clear endpoint halt */ + ep = CY_GET_REG8(USBFS_wIndexLo) & USBFS_DIR_UNUSED; + ri = ((ep - USBFS_EP1) << USBFS_EPX_CNTX_ADDR_SHIFT); + + if ((ep > USBFS_EP0) && (ep < USBFS_MAX_EP)) + { + /* Clear the endpoint Halt */ + USBFS_EP[ep].hwEpState &= (uint8)~(USBFS_ENDPOINT_STATUS_HALT); + + /* Clear the data toggle */ + USBFS_EP[ep].epToggle = 0u; + /* Clear toggle bit for already armed packet */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CNT0_IND + ri), CY_GET_REG8( + (reg8 *)(USBFS_SIE_EP1_CNT0_IND + ri)) & (uint8)~USBFS_EPX_CNT_DATA_TOGGLE); + /* Return API State as it was defined before */ + USBFS_EP[ep].apiEpState &= (uint8)~USBFS_NO_EVENT_ALLOWED; + + if ((USBFS_EP[ep].addr & USBFS_DIR_IN) != 0u) + { + /* IN Endpoint */ + if(USBFS_EP[ep].apiEpState == USBFS_IN_BUFFER_EMPTY) + { /* Wait for next packet from application */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_NAK_IN); + } + else /* Continue armed transfer */ + { + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_ACK_IN); + } + } + else + { + /* OUT Endpoint */ + if(USBFS_EP[ep].apiEpState == USBFS_OUT_BUFFER_FULL) + { /* Allow application to read full buffer */ + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_NAK_OUT); + } + else /* Mark endpoint as empty, so it will be reloaded */ + { + CY_SET_REG8((reg8 *)(USBFS_SIE_EP1_CR0_IND + ri), USBFS_MODE_ACK_OUT); + } + } + requestHandled = USBFS_InitNoDataControlTransfer(); + } + + return(requestHandled); +} + + +/******************************************************************************* +* Function Name: USBFS_ValidateAlternateSetting +******************************************************************************** +* +* Summary: +* Validates (and records) a SET INTERFACE request. +* +* Parameters: +* None. +* +* Return: +* requestHandled. +* +* Reentrant: +* No. +* +*******************************************************************************/ +uint8 USBFS_ValidateAlternateSetting(void) +{ + uint8 requestHandled = USBFS_TRUE; + uint8 interfaceNum; + const T_USBFS_LUT CYCODE *pTmp; + uint8 currentInterfacesNum; + + interfaceNum = CY_GET_REG8(USBFS_wIndexLo); + /* Validate interface setting, stall if invalid. */ + pTmp = USBFS_GetConfigTablePtr(USBFS_configuration - 1u); + currentInterfacesNum = ((const uint8 *) pTmp->p_list)[USBFS_CONFIG_DESCR_NUM_INTERFACES]; + + if((interfaceNum >= currentInterfacesNum) || (interfaceNum >= USBFS_MAX_INTERFACES_NUMBER)) + { /* Wrong interface number */ + requestHandled = USBFS_FALSE; + } + else + { + /* Save current Alt setting to find out the difference in Config() function */ + USBFS_interfaceSetting_last[interfaceNum] = USBFS_interfaceSetting[interfaceNum]; + USBFS_interfaceSetting[interfaceNum] = CY_GET_REG8(USBFS_wValueLo); + } + + return (requestHandled); +} + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_vnd.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_vnd.c new file mode 100755 index 00000000..15b68a55 --- /dev/null +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/USBFS_vnd.c @@ -0,0 +1,96 @@ +/******************************************************************************* +* File Name: USBFS_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.h" +#include "USBFS_pvt.h" + +#if(USBFS_EXTERN_VND == USBFS_FALSE) + + +/*************************************** +* Vendor Specific Declarations +***************************************/ + +/* `#START VENDOR_SPECIFIC_DECLARATIONS` Place your declaration here */ + +/* `#END` */ + + +/******************************************************************************* +* Function Name: USBFS_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_HandleVendorRqst(void) +{ + uint8 requestHandled = USBFS_FALSE; + + if ((CY_GET_REG8(USBFS_bmRequestType) & USBFS_RQST_DIR_MASK) == USBFS_RQST_DIR_D2H) + { + /* Control Read */ + switch (CY_GET_REG8(USBFS_bRequest)) + { + case USBFS_GET_EXTENDED_CONFIG_DESCRIPTOR: + #if defined(USBFS_ENABLE_MSOS_STRING) + USBFS_currentTD.pData = (volatile uint8 *)&USBFS_MSOS_CONFIGURATION_DESCR[0u]; + USBFS_currentTD.count = USBFS_MSOS_CONFIGURATION_DESCR[0u]; + requestHandled = USBFS_InitControlRead(); + #endif /* End USBFS_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_EXTERN_VND */ + + +/* [] END OF FILE */ diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h index 5deeff61..bc903489 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter.h @@ -3,45 +3,35 @@ #include #include -/* USBFS_1_bus_reset */ -#define USBFS_1_bus_reset__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 -#define USBFS_1_bus_reset__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_1_bus_reset__INTC_MASK 0x800000u -#define USBFS_1_bus_reset__INTC_NUMBER 23u -#define USBFS_1_bus_reset__INTC_PRIOR_NUM 7u -#define USBFS_1_bus_reset__INTC_PRIOR_REG CYREG_NVIC_PRI_23 -#define USBFS_1_bus_reset__INTC_SET_EN_REG CYREG_NVIC_SETENA0 -#define USBFS_1_bus_reset__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 +/* 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 +#define USBFS_bus_reset__INTC_MASK 0x800000u +#define USBFS_bus_reset__INTC_NUMBER 23u +#define USBFS_bus_reset__INTC_PRIOR_NUM 7u +#define USBFS_bus_reset__INTC_PRIOR_REG CYREG_NVIC_PRI_23 +#define USBFS_bus_reset__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_bus_reset__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 -/* USBFS_1_arb_int */ -#define USBFS_1_arb_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 -#define USBFS_1_arb_int__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_1_arb_int__INTC_MASK 0x400000u -#define USBFS_1_arb_int__INTC_NUMBER 22u -#define USBFS_1_arb_int__INTC_PRIOR_NUM 7u -#define USBFS_1_arb_int__INTC_PRIOR_REG CYREG_NVIC_PRI_22 -#define USBFS_1_arb_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 -#define USBFS_1_arb_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 +/* USBFS_arb_int */ +#define USBFS_arb_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define USBFS_arb_int__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define USBFS_arb_int__INTC_MASK 0x400000u +#define USBFS_arb_int__INTC_NUMBER 22u +#define USBFS_arb_int__INTC_PRIOR_NUM 7u +#define USBFS_arb_int__INTC_PRIOR_REG CYREG_NVIC_PRI_22 +#define USBFS_arb_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_arb_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 -/* USBFS_1_sof_int */ -#define USBFS_1_sof_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 -#define USBFS_1_sof_int__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_1_sof_int__INTC_MASK 0x200000u -#define USBFS_1_sof_int__INTC_NUMBER 21u -#define USBFS_1_sof_int__INTC_PRIOR_NUM 7u -#define USBFS_1_sof_int__INTC_PRIOR_REG CYREG_NVIC_PRI_21 -#define USBFS_1_sof_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 -#define USBFS_1_sof_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 - -/* USBFS_1_dp_int */ -#define USBFS_1_dp_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 -#define USBFS_1_dp_int__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_1_dp_int__INTC_MASK 0x1000u -#define USBFS_1_dp_int__INTC_NUMBER 12u -#define USBFS_1_dp_int__INTC_PRIOR_NUM 7u -#define USBFS_1_dp_int__INTC_PRIOR_REG CYREG_NVIC_PRI_12 -#define USBFS_1_dp_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 -#define USBFS_1_dp_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 +/* USBFS_sof_int */ +#define USBFS_sof_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define USBFS_sof_int__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define USBFS_sof_int__INTC_MASK 0x200000u +#define USBFS_sof_int__INTC_NUMBER 21u +#define USBFS_sof_int__INTC_PRIOR_NUM 7u +#define USBFS_sof_int__INTC_PRIOR_REG CYREG_NVIC_PRI_21 +#define USBFS_sof_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_sof_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 /* SCSI_ATN_ISR */ #define SCSI_ATN_ISR__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 @@ -572,25 +562,15 @@ #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 -/* USBFS_1_ep_0 */ -#define USBFS_1_ep_0__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 -#define USBFS_1_ep_0__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_1_ep_0__INTC_MASK 0x1000000u -#define USBFS_1_ep_0__INTC_NUMBER 24u -#define USBFS_1_ep_0__INTC_PRIOR_NUM 7u -#define USBFS_1_ep_0__INTC_PRIOR_REG CYREG_NVIC_PRI_24 -#define USBFS_1_ep_0__INTC_SET_EN_REG CYREG_NVIC_SETENA0 -#define USBFS_1_ep_0__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 - -/* USBFS_1_ep_1 */ -#define USBFS_1_ep_1__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 -#define USBFS_1_ep_1__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 -#define USBFS_1_ep_1__INTC_MASK 0x01u -#define USBFS_1_ep_1__INTC_NUMBER 0u -#define USBFS_1_ep_1__INTC_PRIOR_NUM 7u -#define USBFS_1_ep_1__INTC_PRIOR_REG CYREG_NVIC_PRI_0 -#define USBFS_1_ep_1__INTC_SET_EN_REG CYREG_NVIC_SETENA0 -#define USBFS_1_ep_1__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 +/* USBFS_dp_int */ +#define USBFS_dp_int__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define USBFS_dp_int__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define USBFS_dp_int__INTC_MASK 0x1000u +#define USBFS_dp_int__INTC_NUMBER 12u +#define USBFS_dp_int__INTC_PRIOR_NUM 7u +#define USBFS_dp_int__INTC_PRIOR_REG CYREG_NVIC_PRI_12 +#define USBFS_dp_int__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_dp_int__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 /* SCSI_CTL_IO */ #define SCSI_CTL_IO_Sync_ctrl_reg__0__MASK 0x01u @@ -1068,132 +1048,6 @@ #define SD_Init_Clk__PM_STBY_CFG CYREG_PM_STBY_CFG2 #define SD_Init_Clk__PM_STBY_MSK 0x02u -/* USBFS_1_USB */ -#define USBFS_1_USB__ARB_CFG CYREG_USB_ARB_CFG -#define USBFS_1_USB__ARB_EP1_CFG CYREG_USB_ARB_EP1_CFG -#define USBFS_1_USB__ARB_EP1_INT_EN CYREG_USB_ARB_EP1_INT_EN -#define USBFS_1_USB__ARB_EP1_SR CYREG_USB_ARB_EP1_SR -#define USBFS_1_USB__ARB_EP2_CFG CYREG_USB_ARB_EP2_CFG -#define USBFS_1_USB__ARB_EP2_INT_EN CYREG_USB_ARB_EP2_INT_EN -#define USBFS_1_USB__ARB_EP2_SR CYREG_USB_ARB_EP2_SR -#define USBFS_1_USB__ARB_EP3_CFG CYREG_USB_ARB_EP3_CFG -#define USBFS_1_USB__ARB_EP3_INT_EN CYREG_USB_ARB_EP3_INT_EN -#define USBFS_1_USB__ARB_EP3_SR CYREG_USB_ARB_EP3_SR -#define USBFS_1_USB__ARB_EP4_CFG CYREG_USB_ARB_EP4_CFG -#define USBFS_1_USB__ARB_EP4_INT_EN CYREG_USB_ARB_EP4_INT_EN -#define USBFS_1_USB__ARB_EP4_SR CYREG_USB_ARB_EP4_SR -#define USBFS_1_USB__ARB_EP5_CFG CYREG_USB_ARB_EP5_CFG -#define USBFS_1_USB__ARB_EP5_INT_EN CYREG_USB_ARB_EP5_INT_EN -#define USBFS_1_USB__ARB_EP5_SR CYREG_USB_ARB_EP5_SR -#define USBFS_1_USB__ARB_EP6_CFG CYREG_USB_ARB_EP6_CFG -#define USBFS_1_USB__ARB_EP6_INT_EN CYREG_USB_ARB_EP6_INT_EN -#define USBFS_1_USB__ARB_EP6_SR CYREG_USB_ARB_EP6_SR -#define USBFS_1_USB__ARB_EP7_CFG CYREG_USB_ARB_EP7_CFG -#define USBFS_1_USB__ARB_EP7_INT_EN CYREG_USB_ARB_EP7_INT_EN -#define USBFS_1_USB__ARB_EP7_SR CYREG_USB_ARB_EP7_SR -#define USBFS_1_USB__ARB_EP8_CFG CYREG_USB_ARB_EP8_CFG -#define USBFS_1_USB__ARB_EP8_INT_EN CYREG_USB_ARB_EP8_INT_EN -#define USBFS_1_USB__ARB_EP8_SR CYREG_USB_ARB_EP8_SR -#define USBFS_1_USB__ARB_INT_EN CYREG_USB_ARB_INT_EN -#define USBFS_1_USB__ARB_INT_SR CYREG_USB_ARB_INT_SR -#define USBFS_1_USB__ARB_RW1_DR CYREG_USB_ARB_RW1_DR -#define USBFS_1_USB__ARB_RW1_RA CYREG_USB_ARB_RW1_RA -#define USBFS_1_USB__ARB_RW1_RA_MSB CYREG_USB_ARB_RW1_RA_MSB -#define USBFS_1_USB__ARB_RW1_WA CYREG_USB_ARB_RW1_WA -#define USBFS_1_USB__ARB_RW1_WA_MSB CYREG_USB_ARB_RW1_WA_MSB -#define USBFS_1_USB__ARB_RW2_DR CYREG_USB_ARB_RW2_DR -#define USBFS_1_USB__ARB_RW2_RA CYREG_USB_ARB_RW2_RA -#define USBFS_1_USB__ARB_RW2_RA_MSB CYREG_USB_ARB_RW2_RA_MSB -#define USBFS_1_USB__ARB_RW2_WA CYREG_USB_ARB_RW2_WA -#define USBFS_1_USB__ARB_RW2_WA_MSB CYREG_USB_ARB_RW2_WA_MSB -#define USBFS_1_USB__ARB_RW3_DR CYREG_USB_ARB_RW3_DR -#define USBFS_1_USB__ARB_RW3_RA CYREG_USB_ARB_RW3_RA -#define USBFS_1_USB__ARB_RW3_RA_MSB CYREG_USB_ARB_RW3_RA_MSB -#define USBFS_1_USB__ARB_RW3_WA CYREG_USB_ARB_RW3_WA -#define USBFS_1_USB__ARB_RW3_WA_MSB CYREG_USB_ARB_RW3_WA_MSB -#define USBFS_1_USB__ARB_RW4_DR CYREG_USB_ARB_RW4_DR -#define USBFS_1_USB__ARB_RW4_RA CYREG_USB_ARB_RW4_RA -#define USBFS_1_USB__ARB_RW4_RA_MSB CYREG_USB_ARB_RW4_RA_MSB -#define USBFS_1_USB__ARB_RW4_WA CYREG_USB_ARB_RW4_WA -#define USBFS_1_USB__ARB_RW4_WA_MSB CYREG_USB_ARB_RW4_WA_MSB -#define USBFS_1_USB__ARB_RW5_DR CYREG_USB_ARB_RW5_DR -#define USBFS_1_USB__ARB_RW5_RA CYREG_USB_ARB_RW5_RA -#define USBFS_1_USB__ARB_RW5_RA_MSB CYREG_USB_ARB_RW5_RA_MSB -#define USBFS_1_USB__ARB_RW5_WA CYREG_USB_ARB_RW5_WA -#define USBFS_1_USB__ARB_RW5_WA_MSB CYREG_USB_ARB_RW5_WA_MSB -#define USBFS_1_USB__ARB_RW6_DR CYREG_USB_ARB_RW6_DR -#define USBFS_1_USB__ARB_RW6_RA CYREG_USB_ARB_RW6_RA -#define USBFS_1_USB__ARB_RW6_RA_MSB CYREG_USB_ARB_RW6_RA_MSB -#define USBFS_1_USB__ARB_RW6_WA CYREG_USB_ARB_RW6_WA -#define USBFS_1_USB__ARB_RW6_WA_MSB CYREG_USB_ARB_RW6_WA_MSB -#define USBFS_1_USB__ARB_RW7_DR CYREG_USB_ARB_RW7_DR -#define USBFS_1_USB__ARB_RW7_RA CYREG_USB_ARB_RW7_RA -#define USBFS_1_USB__ARB_RW7_RA_MSB CYREG_USB_ARB_RW7_RA_MSB -#define USBFS_1_USB__ARB_RW7_WA CYREG_USB_ARB_RW7_WA -#define USBFS_1_USB__ARB_RW7_WA_MSB CYREG_USB_ARB_RW7_WA_MSB -#define USBFS_1_USB__ARB_RW8_DR CYREG_USB_ARB_RW8_DR -#define USBFS_1_USB__ARB_RW8_RA CYREG_USB_ARB_RW8_RA -#define USBFS_1_USB__ARB_RW8_RA_MSB CYREG_USB_ARB_RW8_RA_MSB -#define USBFS_1_USB__ARB_RW8_WA CYREG_USB_ARB_RW8_WA -#define USBFS_1_USB__ARB_RW8_WA_MSB CYREG_USB_ARB_RW8_WA_MSB -#define USBFS_1_USB__BUF_SIZE CYREG_USB_BUF_SIZE -#define USBFS_1_USB__BUS_RST_CNT CYREG_USB_BUS_RST_CNT -#define USBFS_1_USB__CR0 CYREG_USB_CR0 -#define USBFS_1_USB__CR1 CYREG_USB_CR1 -#define USBFS_1_USB__CWA CYREG_USB_CWA -#define USBFS_1_USB__CWA_MSB CYREG_USB_CWA_MSB -#define USBFS_1_USB__DMA_THRES CYREG_USB_DMA_THRES -#define USBFS_1_USB__DMA_THRES_MSB CYREG_USB_DMA_THRES_MSB -#define USBFS_1_USB__DYN_RECONFIG CYREG_USB_DYN_RECONFIG -#define USBFS_1_USB__EP0_CNT CYREG_USB_EP0_CNT -#define USBFS_1_USB__EP0_CR CYREG_USB_EP0_CR -#define USBFS_1_USB__EP0_DR0 CYREG_USB_EP0_DR0 -#define USBFS_1_USB__EP0_DR1 CYREG_USB_EP0_DR1 -#define USBFS_1_USB__EP0_DR2 CYREG_USB_EP0_DR2 -#define USBFS_1_USB__EP0_DR3 CYREG_USB_EP0_DR3 -#define USBFS_1_USB__EP0_DR4 CYREG_USB_EP0_DR4 -#define USBFS_1_USB__EP0_DR5 CYREG_USB_EP0_DR5 -#define USBFS_1_USB__EP0_DR6 CYREG_USB_EP0_DR6 -#define USBFS_1_USB__EP0_DR7 CYREG_USB_EP0_DR7 -#define USBFS_1_USB__EP_ACTIVE CYREG_USB_EP_ACTIVE -#define USBFS_1_USB__EP_TYPE CYREG_USB_EP_TYPE -#define USBFS_1_USB__MEM_DATA CYREG_USB_MEM_DATA_MBASE -#define USBFS_1_USB__PM_ACT_CFG CYREG_PM_ACT_CFG5 -#define USBFS_1_USB__PM_ACT_MSK 0x01u -#define USBFS_1_USB__PM_STBY_CFG CYREG_PM_STBY_CFG5 -#define USBFS_1_USB__PM_STBY_MSK 0x01u -#define USBFS_1_USB__SIE_EP1_CNT0 CYREG_USB_SIE_EP1_CNT0 -#define USBFS_1_USB__SIE_EP1_CNT1 CYREG_USB_SIE_EP1_CNT1 -#define USBFS_1_USB__SIE_EP1_CR0 CYREG_USB_SIE_EP1_CR0 -#define USBFS_1_USB__SIE_EP2_CNT0 CYREG_USB_SIE_EP2_CNT0 -#define USBFS_1_USB__SIE_EP2_CNT1 CYREG_USB_SIE_EP2_CNT1 -#define USBFS_1_USB__SIE_EP2_CR0 CYREG_USB_SIE_EP2_CR0 -#define USBFS_1_USB__SIE_EP3_CNT0 CYREG_USB_SIE_EP3_CNT0 -#define USBFS_1_USB__SIE_EP3_CNT1 CYREG_USB_SIE_EP3_CNT1 -#define USBFS_1_USB__SIE_EP3_CR0 CYREG_USB_SIE_EP3_CR0 -#define USBFS_1_USB__SIE_EP4_CNT0 CYREG_USB_SIE_EP4_CNT0 -#define USBFS_1_USB__SIE_EP4_CNT1 CYREG_USB_SIE_EP4_CNT1 -#define USBFS_1_USB__SIE_EP4_CR0 CYREG_USB_SIE_EP4_CR0 -#define USBFS_1_USB__SIE_EP5_CNT0 CYREG_USB_SIE_EP5_CNT0 -#define USBFS_1_USB__SIE_EP5_CNT1 CYREG_USB_SIE_EP5_CNT1 -#define USBFS_1_USB__SIE_EP5_CR0 CYREG_USB_SIE_EP5_CR0 -#define USBFS_1_USB__SIE_EP6_CNT0 CYREG_USB_SIE_EP6_CNT0 -#define USBFS_1_USB__SIE_EP6_CNT1 CYREG_USB_SIE_EP6_CNT1 -#define USBFS_1_USB__SIE_EP6_CR0 CYREG_USB_SIE_EP6_CR0 -#define USBFS_1_USB__SIE_EP7_CNT0 CYREG_USB_SIE_EP7_CNT0 -#define USBFS_1_USB__SIE_EP7_CNT1 CYREG_USB_SIE_EP7_CNT1 -#define USBFS_1_USB__SIE_EP7_CR0 CYREG_USB_SIE_EP7_CR0 -#define USBFS_1_USB__SIE_EP8_CNT0 CYREG_USB_SIE_EP8_CNT0 -#define USBFS_1_USB__SIE_EP8_CNT1 CYREG_USB_SIE_EP8_CNT1 -#define USBFS_1_USB__SIE_EP8_CR0 CYREG_USB_SIE_EP8_CR0 -#define USBFS_1_USB__SIE_EP_INT_EN CYREG_USB_SIE_EP_INT_EN -#define USBFS_1_USB__SIE_EP_INT_SR CYREG_USB_SIE_EP_INT_SR -#define USBFS_1_USB__SOF0 CYREG_USB_SOF0 -#define USBFS_1_USB__SOF1 CYREG_USB_SOF1 -#define USBFS_1_USB__USBIO_CR0 CYREG_USB_USBIO_CR0 -#define USBFS_1_USB__USBIO_CR1 CYREG_USB_USBIO_CR1 -#define USBFS_1_USB__USB_CLK_EN CYREG_USB_USB_CLK_EN - /* scsiTarget */ #define scsiTarget_StatusReg__0__MASK 0x01u #define scsiTarget_StatusReg__0__POS 0 @@ -1277,71 +1131,161 @@ #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 -/* USBFS_1_Dm */ -#define USBFS_1_Dm__0__MASK 0x80u -#define USBFS_1_Dm__0__PC CYREG_IO_PC_PRT15_7_6_PC1 -#define USBFS_1_Dm__0__PORT 15u -#define USBFS_1_Dm__0__SHIFT 7 -#define USBFS_1_Dm__AG CYREG_PRT15_AG -#define USBFS_1_Dm__AMUX CYREG_PRT15_AMUX -#define USBFS_1_Dm__BIE CYREG_PRT15_BIE -#define USBFS_1_Dm__BIT_MASK CYREG_PRT15_BIT_MASK -#define USBFS_1_Dm__BYP CYREG_PRT15_BYP -#define USBFS_1_Dm__CTL CYREG_PRT15_CTL -#define USBFS_1_Dm__DM0 CYREG_PRT15_DM0 -#define USBFS_1_Dm__DM1 CYREG_PRT15_DM1 -#define USBFS_1_Dm__DM2 CYREG_PRT15_DM2 -#define USBFS_1_Dm__DR CYREG_PRT15_DR -#define USBFS_1_Dm__INP_DIS CYREG_PRT15_INP_DIS -#define USBFS_1_Dm__LCD_COM_SEG CYREG_PRT15_LCD_COM_SEG -#define USBFS_1_Dm__LCD_EN CYREG_PRT15_LCD_EN -#define USBFS_1_Dm__MASK 0x80u -#define USBFS_1_Dm__PORT 15u -#define USBFS_1_Dm__PRT CYREG_PRT15_PRT -#define USBFS_1_Dm__PRTDSI__CAPS_SEL CYREG_PRT15_CAPS_SEL -#define USBFS_1_Dm__PRTDSI__DBL_SYNC_IN CYREG_PRT15_DBL_SYNC_IN -#define USBFS_1_Dm__PRTDSI__OE_SEL0 CYREG_PRT15_OE_SEL0 -#define USBFS_1_Dm__PRTDSI__OE_SEL1 CYREG_PRT15_OE_SEL1 -#define USBFS_1_Dm__PRTDSI__OUT_SEL0 CYREG_PRT15_OUT_SEL0 -#define USBFS_1_Dm__PRTDSI__OUT_SEL1 CYREG_PRT15_OUT_SEL1 -#define USBFS_1_Dm__PRTDSI__SYNC_OUT CYREG_PRT15_SYNC_OUT -#define USBFS_1_Dm__PS CYREG_PRT15_PS -#define USBFS_1_Dm__SHIFT 7 -#define USBFS_1_Dm__SLW CYREG_PRT15_SLW +/* USBFS_ep_0 */ +#define USBFS_ep_0__INTC_CLR_EN_REG CYREG_NVIC_CLRENA0 +#define USBFS_ep_0__INTC_CLR_PD_REG CYREG_NVIC_CLRPEND0 +#define USBFS_ep_0__INTC_MASK 0x1000000u +#define USBFS_ep_0__INTC_NUMBER 24u +#define USBFS_ep_0__INTC_PRIOR_NUM 7u +#define USBFS_ep_0__INTC_PRIOR_REG CYREG_NVIC_PRI_24 +#define USBFS_ep_0__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_ep_0__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 + +/* 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_PRIOR_NUM 7u +#define USBFS_ep_1__INTC_PRIOR_REG CYREG_NVIC_PRI_0 +#define USBFS_ep_1__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_ep_1__INTC_SET_PD_REG CYREG_NVIC_SETPEND0 -/* USBFS_1_Dp */ -#define USBFS_1_Dp__0__MASK 0x40u -#define USBFS_1_Dp__0__PC CYREG_IO_PC_PRT15_7_6_PC0 -#define USBFS_1_Dp__0__PORT 15u -#define USBFS_1_Dp__0__SHIFT 6 -#define USBFS_1_Dp__AG CYREG_PRT15_AG -#define USBFS_1_Dp__AMUX CYREG_PRT15_AMUX -#define USBFS_1_Dp__BIE CYREG_PRT15_BIE -#define USBFS_1_Dp__BIT_MASK CYREG_PRT15_BIT_MASK -#define USBFS_1_Dp__BYP CYREG_PRT15_BYP -#define USBFS_1_Dp__CTL CYREG_PRT15_CTL -#define USBFS_1_Dp__DM0 CYREG_PRT15_DM0 -#define USBFS_1_Dp__DM1 CYREG_PRT15_DM1 -#define USBFS_1_Dp__DM2 CYREG_PRT15_DM2 -#define USBFS_1_Dp__DR CYREG_PRT15_DR -#define USBFS_1_Dp__INP_DIS CYREG_PRT15_INP_DIS -#define USBFS_1_Dp__INTSTAT CYREG_PICU15_INTSTAT -#define USBFS_1_Dp__LCD_COM_SEG CYREG_PRT15_LCD_COM_SEG -#define USBFS_1_Dp__LCD_EN CYREG_PRT15_LCD_EN -#define USBFS_1_Dp__MASK 0x40u -#define USBFS_1_Dp__PORT 15u -#define USBFS_1_Dp__PRT CYREG_PRT15_PRT -#define USBFS_1_Dp__PRTDSI__CAPS_SEL CYREG_PRT15_CAPS_SEL -#define USBFS_1_Dp__PRTDSI__DBL_SYNC_IN CYREG_PRT15_DBL_SYNC_IN -#define USBFS_1_Dp__PRTDSI__OE_SEL0 CYREG_PRT15_OE_SEL0 -#define USBFS_1_Dp__PRTDSI__OE_SEL1 CYREG_PRT15_OE_SEL1 -#define USBFS_1_Dp__PRTDSI__OUT_SEL0 CYREG_PRT15_OUT_SEL0 -#define USBFS_1_Dp__PRTDSI__OUT_SEL1 CYREG_PRT15_OUT_SEL1 -#define USBFS_1_Dp__PRTDSI__SYNC_OUT CYREG_PRT15_SYNC_OUT -#define USBFS_1_Dp__PS CYREG_PRT15_PS -#define USBFS_1_Dp__SHIFT 6 -#define USBFS_1_Dp__SLW CYREG_PRT15_SLW -#define USBFS_1_Dp__SNAP CYREG_PICU_15_SNAP_15 +/* 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_PRIOR_NUM 7u +#define USBFS_ep_2__INTC_PRIOR_REG CYREG_NVIC_PRI_1 +#define USBFS_ep_2__INTC_SET_EN_REG CYREG_NVIC_SETENA0 +#define USBFS_ep_2__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 +#define USBFS_USB__ARB_EP1_INT_EN CYREG_USB_ARB_EP1_INT_EN +#define USBFS_USB__ARB_EP1_SR CYREG_USB_ARB_EP1_SR +#define USBFS_USB__ARB_EP2_CFG CYREG_USB_ARB_EP2_CFG +#define USBFS_USB__ARB_EP2_INT_EN CYREG_USB_ARB_EP2_INT_EN +#define USBFS_USB__ARB_EP2_SR CYREG_USB_ARB_EP2_SR +#define USBFS_USB__ARB_EP3_CFG CYREG_USB_ARB_EP3_CFG +#define USBFS_USB__ARB_EP3_INT_EN CYREG_USB_ARB_EP3_INT_EN +#define USBFS_USB__ARB_EP3_SR CYREG_USB_ARB_EP3_SR +#define USBFS_USB__ARB_EP4_CFG CYREG_USB_ARB_EP4_CFG +#define USBFS_USB__ARB_EP4_INT_EN CYREG_USB_ARB_EP4_INT_EN +#define USBFS_USB__ARB_EP4_SR CYREG_USB_ARB_EP4_SR +#define USBFS_USB__ARB_EP5_CFG CYREG_USB_ARB_EP5_CFG +#define USBFS_USB__ARB_EP5_INT_EN CYREG_USB_ARB_EP5_INT_EN +#define USBFS_USB__ARB_EP5_SR CYREG_USB_ARB_EP5_SR +#define USBFS_USB__ARB_EP6_CFG CYREG_USB_ARB_EP6_CFG +#define USBFS_USB__ARB_EP6_INT_EN CYREG_USB_ARB_EP6_INT_EN +#define USBFS_USB__ARB_EP6_SR CYREG_USB_ARB_EP6_SR +#define USBFS_USB__ARB_EP7_CFG CYREG_USB_ARB_EP7_CFG +#define USBFS_USB__ARB_EP7_INT_EN CYREG_USB_ARB_EP7_INT_EN +#define USBFS_USB__ARB_EP7_SR CYREG_USB_ARB_EP7_SR +#define USBFS_USB__ARB_EP8_CFG CYREG_USB_ARB_EP8_CFG +#define USBFS_USB__ARB_EP8_INT_EN CYREG_USB_ARB_EP8_INT_EN +#define USBFS_USB__ARB_EP8_SR CYREG_USB_ARB_EP8_SR +#define USBFS_USB__ARB_INT_EN CYREG_USB_ARB_INT_EN +#define USBFS_USB__ARB_INT_SR CYREG_USB_ARB_INT_SR +#define USBFS_USB__ARB_RW1_DR CYREG_USB_ARB_RW1_DR +#define USBFS_USB__ARB_RW1_RA CYREG_USB_ARB_RW1_RA +#define USBFS_USB__ARB_RW1_RA_MSB CYREG_USB_ARB_RW1_RA_MSB +#define USBFS_USB__ARB_RW1_WA CYREG_USB_ARB_RW1_WA +#define USBFS_USB__ARB_RW1_WA_MSB CYREG_USB_ARB_RW1_WA_MSB +#define USBFS_USB__ARB_RW2_DR CYREG_USB_ARB_RW2_DR +#define USBFS_USB__ARB_RW2_RA CYREG_USB_ARB_RW2_RA +#define USBFS_USB__ARB_RW2_RA_MSB CYREG_USB_ARB_RW2_RA_MSB +#define USBFS_USB__ARB_RW2_WA CYREG_USB_ARB_RW2_WA +#define USBFS_USB__ARB_RW2_WA_MSB CYREG_USB_ARB_RW2_WA_MSB +#define USBFS_USB__ARB_RW3_DR CYREG_USB_ARB_RW3_DR +#define USBFS_USB__ARB_RW3_RA CYREG_USB_ARB_RW3_RA +#define USBFS_USB__ARB_RW3_RA_MSB CYREG_USB_ARB_RW3_RA_MSB +#define USBFS_USB__ARB_RW3_WA CYREG_USB_ARB_RW3_WA +#define USBFS_USB__ARB_RW3_WA_MSB CYREG_USB_ARB_RW3_WA_MSB +#define USBFS_USB__ARB_RW4_DR CYREG_USB_ARB_RW4_DR +#define USBFS_USB__ARB_RW4_RA CYREG_USB_ARB_RW4_RA +#define USBFS_USB__ARB_RW4_RA_MSB CYREG_USB_ARB_RW4_RA_MSB +#define USBFS_USB__ARB_RW4_WA CYREG_USB_ARB_RW4_WA +#define USBFS_USB__ARB_RW4_WA_MSB CYREG_USB_ARB_RW4_WA_MSB +#define USBFS_USB__ARB_RW5_DR CYREG_USB_ARB_RW5_DR +#define USBFS_USB__ARB_RW5_RA CYREG_USB_ARB_RW5_RA +#define USBFS_USB__ARB_RW5_RA_MSB CYREG_USB_ARB_RW5_RA_MSB +#define USBFS_USB__ARB_RW5_WA CYREG_USB_ARB_RW5_WA +#define USBFS_USB__ARB_RW5_WA_MSB CYREG_USB_ARB_RW5_WA_MSB +#define USBFS_USB__ARB_RW6_DR CYREG_USB_ARB_RW6_DR +#define USBFS_USB__ARB_RW6_RA CYREG_USB_ARB_RW6_RA +#define USBFS_USB__ARB_RW6_RA_MSB CYREG_USB_ARB_RW6_RA_MSB +#define USBFS_USB__ARB_RW6_WA CYREG_USB_ARB_RW6_WA +#define USBFS_USB__ARB_RW6_WA_MSB CYREG_USB_ARB_RW6_WA_MSB +#define USBFS_USB__ARB_RW7_DR CYREG_USB_ARB_RW7_DR +#define USBFS_USB__ARB_RW7_RA CYREG_USB_ARB_RW7_RA +#define USBFS_USB__ARB_RW7_RA_MSB CYREG_USB_ARB_RW7_RA_MSB +#define USBFS_USB__ARB_RW7_WA CYREG_USB_ARB_RW7_WA +#define USBFS_USB__ARB_RW7_WA_MSB CYREG_USB_ARB_RW7_WA_MSB +#define USBFS_USB__ARB_RW8_DR CYREG_USB_ARB_RW8_DR +#define USBFS_USB__ARB_RW8_RA CYREG_USB_ARB_RW8_RA +#define USBFS_USB__ARB_RW8_RA_MSB CYREG_USB_ARB_RW8_RA_MSB +#define USBFS_USB__ARB_RW8_WA CYREG_USB_ARB_RW8_WA +#define USBFS_USB__ARB_RW8_WA_MSB CYREG_USB_ARB_RW8_WA_MSB +#define USBFS_USB__BUF_SIZE CYREG_USB_BUF_SIZE +#define USBFS_USB__BUS_RST_CNT CYREG_USB_BUS_RST_CNT +#define USBFS_USB__CR0 CYREG_USB_CR0 +#define USBFS_USB__CR1 CYREG_USB_CR1 +#define USBFS_USB__CWA CYREG_USB_CWA +#define USBFS_USB__CWA_MSB CYREG_USB_CWA_MSB +#define USBFS_USB__DMA_THRES CYREG_USB_DMA_THRES +#define USBFS_USB__DMA_THRES_MSB CYREG_USB_DMA_THRES_MSB +#define USBFS_USB__DYN_RECONFIG CYREG_USB_DYN_RECONFIG +#define USBFS_USB__EP0_CNT CYREG_USB_EP0_CNT +#define USBFS_USB__EP0_CR CYREG_USB_EP0_CR +#define USBFS_USB__EP0_DR0 CYREG_USB_EP0_DR0 +#define USBFS_USB__EP0_DR1 CYREG_USB_EP0_DR1 +#define USBFS_USB__EP0_DR2 CYREG_USB_EP0_DR2 +#define USBFS_USB__EP0_DR3 CYREG_USB_EP0_DR3 +#define USBFS_USB__EP0_DR4 CYREG_USB_EP0_DR4 +#define USBFS_USB__EP0_DR5 CYREG_USB_EP0_DR5 +#define USBFS_USB__EP0_DR6 CYREG_USB_EP0_DR6 +#define USBFS_USB__EP0_DR7 CYREG_USB_EP0_DR7 +#define USBFS_USB__EP_ACTIVE CYREG_USB_EP_ACTIVE +#define USBFS_USB__EP_TYPE CYREG_USB_EP_TYPE +#define USBFS_USB__MEM_DATA CYREG_USB_MEM_DATA_MBASE +#define USBFS_USB__PM_ACT_CFG CYREG_PM_ACT_CFG5 +#define USBFS_USB__PM_ACT_MSK 0x01u +#define USBFS_USB__PM_STBY_CFG CYREG_PM_STBY_CFG5 +#define USBFS_USB__PM_STBY_MSK 0x01u +#define USBFS_USB__SIE_EP1_CNT0 CYREG_USB_SIE_EP1_CNT0 +#define USBFS_USB__SIE_EP1_CNT1 CYREG_USB_SIE_EP1_CNT1 +#define USBFS_USB__SIE_EP1_CR0 CYREG_USB_SIE_EP1_CR0 +#define USBFS_USB__SIE_EP2_CNT0 CYREG_USB_SIE_EP2_CNT0 +#define USBFS_USB__SIE_EP2_CNT1 CYREG_USB_SIE_EP2_CNT1 +#define USBFS_USB__SIE_EP2_CR0 CYREG_USB_SIE_EP2_CR0 +#define USBFS_USB__SIE_EP3_CNT0 CYREG_USB_SIE_EP3_CNT0 +#define USBFS_USB__SIE_EP3_CNT1 CYREG_USB_SIE_EP3_CNT1 +#define USBFS_USB__SIE_EP3_CR0 CYREG_USB_SIE_EP3_CR0 +#define USBFS_USB__SIE_EP4_CNT0 CYREG_USB_SIE_EP4_CNT0 +#define USBFS_USB__SIE_EP4_CNT1 CYREG_USB_SIE_EP4_CNT1 +#define USBFS_USB__SIE_EP4_CR0 CYREG_USB_SIE_EP4_CR0 +#define USBFS_USB__SIE_EP5_CNT0 CYREG_USB_SIE_EP5_CNT0 +#define USBFS_USB__SIE_EP5_CNT1 CYREG_USB_SIE_EP5_CNT1 +#define USBFS_USB__SIE_EP5_CR0 CYREG_USB_SIE_EP5_CR0 +#define USBFS_USB__SIE_EP6_CNT0 CYREG_USB_SIE_EP6_CNT0 +#define USBFS_USB__SIE_EP6_CNT1 CYREG_USB_SIE_EP6_CNT1 +#define USBFS_USB__SIE_EP6_CR0 CYREG_USB_SIE_EP6_CR0 +#define USBFS_USB__SIE_EP7_CNT0 CYREG_USB_SIE_EP7_CNT0 +#define USBFS_USB__SIE_EP7_CNT1 CYREG_USB_SIE_EP7_CNT1 +#define USBFS_USB__SIE_EP7_CR0 CYREG_USB_SIE_EP7_CR0 +#define USBFS_USB__SIE_EP8_CNT0 CYREG_USB_SIE_EP8_CNT0 +#define USBFS_USB__SIE_EP8_CNT1 CYREG_USB_SIE_EP8_CNT1 +#define USBFS_USB__SIE_EP8_CR0 CYREG_USB_SIE_EP8_CR0 +#define USBFS_USB__SIE_EP_INT_EN CYREG_USB_SIE_EP_INT_EN +#define USBFS_USB__SIE_EP_INT_SR CYREG_USB_SIE_EP_INT_SR +#define USBFS_USB__SOF0 CYREG_USB_SOF0 +#define USBFS_USB__SOF1 CYREG_USB_SOF1 +#define USBFS_USB__USBIO_CR0 CYREG_USB_USBIO_CR0 +#define USBFS_USB__USBIO_CR1 CYREG_USB_USBIO_CR1 +#define USBFS_USB__USB_CLK_EN CYREG_USB_USB_CLK_EN /* SCSI_ATN */ #define SCSI_ATN__0__MASK 0x20u @@ -1960,6 +1904,72 @@ #define SCSI_RST__SLW CYREG_PRT6_SLW #define SCSI_RST__SNAP CYREG_PICU6_SNAP +/* USBFS_Dm */ +#define USBFS_Dm__0__MASK 0x80u +#define USBFS_Dm__0__PC CYREG_IO_PC_PRT15_7_6_PC1 +#define USBFS_Dm__0__PORT 15u +#define USBFS_Dm__0__SHIFT 7 +#define USBFS_Dm__AG CYREG_PRT15_AG +#define USBFS_Dm__AMUX CYREG_PRT15_AMUX +#define USBFS_Dm__BIE CYREG_PRT15_BIE +#define USBFS_Dm__BIT_MASK CYREG_PRT15_BIT_MASK +#define USBFS_Dm__BYP CYREG_PRT15_BYP +#define USBFS_Dm__CTL CYREG_PRT15_CTL +#define USBFS_Dm__DM0 CYREG_PRT15_DM0 +#define USBFS_Dm__DM1 CYREG_PRT15_DM1 +#define USBFS_Dm__DM2 CYREG_PRT15_DM2 +#define USBFS_Dm__DR CYREG_PRT15_DR +#define USBFS_Dm__INP_DIS CYREG_PRT15_INP_DIS +#define USBFS_Dm__LCD_COM_SEG CYREG_PRT15_LCD_COM_SEG +#define USBFS_Dm__LCD_EN CYREG_PRT15_LCD_EN +#define USBFS_Dm__MASK 0x80u +#define USBFS_Dm__PORT 15u +#define USBFS_Dm__PRT CYREG_PRT15_PRT +#define USBFS_Dm__PRTDSI__CAPS_SEL CYREG_PRT15_CAPS_SEL +#define USBFS_Dm__PRTDSI__DBL_SYNC_IN CYREG_PRT15_DBL_SYNC_IN +#define USBFS_Dm__PRTDSI__OE_SEL0 CYREG_PRT15_OE_SEL0 +#define USBFS_Dm__PRTDSI__OE_SEL1 CYREG_PRT15_OE_SEL1 +#define USBFS_Dm__PRTDSI__OUT_SEL0 CYREG_PRT15_OUT_SEL0 +#define USBFS_Dm__PRTDSI__OUT_SEL1 CYREG_PRT15_OUT_SEL1 +#define USBFS_Dm__PRTDSI__SYNC_OUT CYREG_PRT15_SYNC_OUT +#define USBFS_Dm__PS CYREG_PRT15_PS +#define USBFS_Dm__SHIFT 7 +#define USBFS_Dm__SLW CYREG_PRT15_SLW + +/* USBFS_Dp */ +#define USBFS_Dp__0__MASK 0x40u +#define USBFS_Dp__0__PC CYREG_IO_PC_PRT15_7_6_PC0 +#define USBFS_Dp__0__PORT 15u +#define USBFS_Dp__0__SHIFT 6 +#define USBFS_Dp__AG CYREG_PRT15_AG +#define USBFS_Dp__AMUX CYREG_PRT15_AMUX +#define USBFS_Dp__BIE CYREG_PRT15_BIE +#define USBFS_Dp__BIT_MASK CYREG_PRT15_BIT_MASK +#define USBFS_Dp__BYP CYREG_PRT15_BYP +#define USBFS_Dp__CTL CYREG_PRT15_CTL +#define USBFS_Dp__DM0 CYREG_PRT15_DM0 +#define USBFS_Dp__DM1 CYREG_PRT15_DM1 +#define USBFS_Dp__DM2 CYREG_PRT15_DM2 +#define USBFS_Dp__DR CYREG_PRT15_DR +#define USBFS_Dp__INP_DIS CYREG_PRT15_INP_DIS +#define USBFS_Dp__INTSTAT CYREG_PICU15_INTSTAT +#define USBFS_Dp__LCD_COM_SEG CYREG_PRT15_LCD_COM_SEG +#define USBFS_Dp__LCD_EN CYREG_PRT15_LCD_EN +#define USBFS_Dp__MASK 0x40u +#define USBFS_Dp__PORT 15u +#define USBFS_Dp__PRT CYREG_PRT15_PRT +#define USBFS_Dp__PRTDSI__CAPS_SEL CYREG_PRT15_CAPS_SEL +#define USBFS_Dp__PRTDSI__DBL_SYNC_IN CYREG_PRT15_DBL_SYNC_IN +#define USBFS_Dp__PRTDSI__OE_SEL0 CYREG_PRT15_OE_SEL0 +#define USBFS_Dp__PRTDSI__OE_SEL1 CYREG_PRT15_OE_SEL1 +#define USBFS_Dp__PRTDSI__OUT_SEL0 CYREG_PRT15_OUT_SEL0 +#define USBFS_Dp__PRTDSI__OUT_SEL1 CYREG_PRT15_OUT_SEL1 +#define USBFS_Dp__PRTDSI__SYNC_OUT CYREG_PRT15_SYNC_OUT +#define USBFS_Dp__PS CYREG_PRT15_PS +#define USBFS_Dp__SHIFT 6 +#define USBFS_Dp__SLW CYREG_PRT15_SLW +#define USBFS_Dp__SNAP CYREG_PICU_15_SNAP_15 + /* SCSI_In */ #define SCSI_In__0__AG CYREG_PRT2_AG #define SCSI_In__0__AMUX CYREG_PRT2_AMUX 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 17b57aa4..200bad6b 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c @@ -366,34 +366,34 @@ void cyfitter_cfg(void) 0x40005209u, /* Base address: 0x40005200 Count: 9 */ 0x40006402u, /* Base address: 0x40006400 Count: 2 */ 0x40010044u, /* Base address: 0x40010000 Count: 68 */ - 0x40010136u, /* Base address: 0x40010100 Count: 54 */ + 0x40010135u, /* Base address: 0x40010100 Count: 53 */ 0x4001023Eu, /* Base address: 0x40010200 Count: 62 */ - 0x4001034Eu, /* Base address: 0x40010300 Count: 78 */ + 0x40010350u, /* Base address: 0x40010300 Count: 80 */ 0x4001044Bu, /* Base address: 0x40010400 Count: 75 */ - 0x40010557u, /* Base address: 0x40010500 Count: 87 */ + 0x40010554u, /* Base address: 0x40010500 Count: 84 */ 0x40010605u, /* Base address: 0x40010600 Count: 5 */ - 0x4001074Au, /* Base address: 0x40010700 Count: 74 */ - 0x40010914u, /* Base address: 0x40010900 Count: 20 */ + 0x4001074Bu, /* Base address: 0x40010700 Count: 75 */ + 0x40010911u, /* Base address: 0x40010900 Count: 17 */ 0x40010A37u, /* Base address: 0x40010A00 Count: 55 */ - 0x40010B38u, /* Base address: 0x40010B00 Count: 56 */ + 0x40010B35u, /* Base address: 0x40010B00 Count: 53 */ 0x40010D0Fu, /* Base address: 0x40010D00 Count: 15 */ 0x40010F02u, /* Base address: 0x40010F00 Count: 2 */ - 0x40011505u, /* Base address: 0x40011500 Count: 5 */ + 0x40011504u, /* Base address: 0x40011500 Count: 4 */ 0x40011642u, /* Base address: 0x40011600 Count: 66 */ - 0x40011744u, /* Base address: 0x40011700 Count: 68 */ + 0x40011747u, /* Base address: 0x40011700 Count: 71 */ 0x40011908u, /* Base address: 0x40011900 Count: 8 */ - 0x40011B04u, /* Base address: 0x40011B00 Count: 4 */ - 0x4001400Eu, /* Base address: 0x40014000 Count: 14 */ - 0x4001410Eu, /* Base address: 0x40014100 Count: 14 */ - 0x40014205u, /* Base address: 0x40014200 Count: 5 */ - 0x40014305u, /* Base address: 0x40014300 Count: 5 */ + 0x40011B05u, /* Base address: 0x40011B00 Count: 5 */ + 0x4001400Fu, /* Base address: 0x40014000 Count: 15 */ + 0x4001410Du, /* Base address: 0x40014100 Count: 13 */ + 0x40014206u, /* Base address: 0x40014200 Count: 6 */ + 0x40014308u, /* Base address: 0x40014300 Count: 8 */ 0x4001440Au, /* Base address: 0x40014400 Count: 10 */ - 0x40014516u, /* Base address: 0x40014500 Count: 22 */ - 0x40014608u, /* Base address: 0x40014600 Count: 8 */ - 0x40014708u, /* Base address: 0x40014700 Count: 8 */ - 0x40014808u, /* Base address: 0x40014800 Count: 8 */ - 0x4001490Cu, /* Base address: 0x40014900 Count: 12 */ - 0x40014C01u, /* Base address: 0x40014C00 Count: 1 */ + 0x40014514u, /* Base address: 0x40014500 Count: 20 */ + 0x40014609u, /* Base address: 0x40014600 Count: 9 */ + 0x40014709u, /* Base address: 0x40014700 Count: 9 */ + 0x4001480Bu, /* Base address: 0x40014800 Count: 11 */ + 0x40014907u, /* Base address: 0x40014900 Count: 7 */ + 0x40014C02u, /* Base address: 0x40014C00 Count: 2 */ 0x40015006u, /* Base address: 0x40015000 Count: 6 */ 0x40015101u, /* Base address: 0x40015100 Count: 1 */ }; @@ -403,7 +403,7 @@ void cyfitter_cfg(void) {0x65u, 0x02u}, {0x7Eu, 0x02u}, {0x01u, 0x01u}, - {0x18u, 0x04u}, + {0x18u, 0x0Cu}, {0x19u, 0x04u}, {0x1Cu, 0x61u}, {0x20u, 0x50u}, @@ -413,6 +413,7 @@ void cyfitter_cfg(void) {0x7Cu, 0x40u}, {0x33u, 0x03u}, {0x87u, 0x0Fu}, + {0x00u, 0x0Du}, {0x03u, 0x04u}, {0x04u, 0x01u}, {0x06u, 0x32u}, @@ -424,7 +425,6 @@ void cyfitter_cfg(void) {0x0Du, 0x24u}, {0x0Eu, 0x10u}, {0x0Fu, 0x09u}, - {0x10u, 0x0Du}, {0x14u, 0x62u}, {0x16u, 0x08u}, {0x1Bu, 0x03u}, @@ -449,21 +449,21 @@ void cyfitter_cfg(void) {0x5Bu, 0x04u}, {0x5Cu, 0x99u}, {0x5Fu, 0x01u}, - {0x82u, 0x80u}, + {0x80u, 0x24u}, + {0x82u, 0x09u}, + {0x85u, 0x08u}, + {0x87u, 0x04u}, {0x8Au, 0x18u}, {0x8Bu, 0x09u}, {0x8Eu, 0x03u}, - {0x91u, 0x08u}, - {0x93u, 0x03u}, {0x96u, 0x24u}, {0x98u, 0x24u}, - {0x99u, 0x08u}, {0x9Au, 0x12u}, - {0x9Bu, 0x04u}, {0x9Eu, 0x20u}, {0x9Fu, 0x06u}, - {0xA0u, 0x24u}, - {0xA2u, 0x09u}, + {0xA1u, 0x08u}, + {0xA2u, 0x80u}, + {0xA3u, 0x03u}, {0xA6u, 0x04u}, {0xAAu, 0x40u}, {0xACu, 0x40u}, @@ -471,50 +471,49 @@ void cyfitter_cfg(void) {0xAFu, 0x08u}, {0xB0u, 0xC0u}, {0xB1u, 0x0Eu}, - {0xB3u, 0x01u}, {0xB4u, 0x38u}, + {0xB5u, 0x01u}, {0xB6u, 0x07u}, {0xBEu, 0x01u}, - {0xBFu, 0x04u}, + {0xBFu, 0x10u}, {0xD8u, 0x04u}, {0xD9u, 0x04u}, {0xDBu, 0x04u}, {0xDCu, 0x99u}, {0xDFu, 0x01u}, - {0x00u, 0x40u}, - {0x02u, 0x08u}, - {0x03u, 0x20u}, + {0x00u, 0x60u}, + {0x03u, 0x60u}, {0x05u, 0x50u}, - {0x06u, 0x80u}, - {0x08u, 0x01u}, + {0x06u, 0x40u}, + {0x07u, 0x04u}, {0x0Au, 0x22u}, {0x0Du, 0x14u}, {0x0Eu, 0x01u}, - {0x10u, 0xA0u}, - {0x11u, 0x10u}, - {0x13u, 0x40u}, + {0x11u, 0x14u}, + {0x13u, 0x41u}, {0x15u, 0x40u}, - {0x16u, 0x28u}, - {0x17u, 0x01u}, + {0x16u, 0xA4u}, {0x18u, 0x40u}, {0x1Au, 0x02u}, {0x1Du, 0x50u}, - {0x1Eu, 0x44u}, + {0x1Eu, 0x40u}, {0x21u, 0x20u}, {0x22u, 0x84u}, {0x23u, 0x08u}, - {0x27u, 0xA0u}, + {0x25u, 0x10u}, + {0x27u, 0x80u}, {0x29u, 0x01u}, - {0x2Au, 0x10u}, + {0x2Bu, 0x04u}, {0x2Cu, 0x02u}, + {0x2Fu, 0x40u}, {0x31u, 0x20u}, {0x32u, 0x80u}, - {0x36u, 0x21u}, - {0x37u, 0x81u}, + {0x37u, 0x80u}, {0x39u, 0x28u}, - {0x3Au, 0x02u}, + {0x3Au, 0x42u}, {0x3Bu, 0x80u}, - {0x3Cu, 0x20u}, + {0x3Cu, 0x10u}, + {0x3Fu, 0x04u}, {0x58u, 0x84u}, {0x59u, 0x02u}, {0x5Bu, 0x10u}, @@ -525,19 +524,19 @@ void cyfitter_cfg(void) {0x80u, 0x40u}, {0x81u, 0x20u}, {0x86u, 0x80u}, - {0xC0u, 0xD7u}, - {0xC2u, 0xEDu}, + {0xC0u, 0xDFu}, + {0xC2u, 0xE5u}, {0xC4u, 0xFFu}, - {0xCAu, 0x15u}, - {0xCCu, 0xBCu}, - {0xCEu, 0x2Fu}, + {0xCAu, 0x95u}, + {0xCCu, 0x1Cu}, + {0xCEu, 0x6Fu}, {0xD6u, 0x0Fu}, {0xDEu, 0x01u}, {0xE0u, 0x04u}, {0xE4u, 0x08u}, + {0x0Cu, 0x01u}, {0x14u, 0x01u}, {0x18u, 0x02u}, - {0x1Cu, 0x01u}, {0x2Eu, 0x01u}, {0x36u, 0x03u}, {0x3Au, 0xC0u}, @@ -550,28 +549,28 @@ void cyfitter_cfg(void) {0x86u, 0x69u}, {0x87u, 0x2Du}, {0x89u, 0x67u}, + {0x8Au, 0xFFu}, {0x8Bu, 0x18u}, {0x8Cu, 0x33u}, {0x8Du, 0x02u}, {0x8Eu, 0xCCu}, {0x94u, 0x55u}, {0x96u, 0xAAu}, - {0x9Au, 0xFFu}, - {0x9Du, 0x02u}, + {0x9Bu, 0x40u}, {0xA0u, 0x0Fu}, - {0xA1u, 0x16u}, + {0xA1u, 0x02u}, {0xA2u, 0xF0u}, - {0xA3u, 0x48u}, {0xA4u, 0xFFu}, - {0xA7u, 0x40u}, - {0xADu, 0x01u}, + {0xA5u, 0x01u}, + {0xA7u, 0x02u}, + {0xADu, 0x16u}, {0xAEu, 0xFFu}, - {0xAFu, 0x02u}, + {0xAFu, 0x48u}, {0xB1u, 0x08u}, - {0xB2u, 0xFFu}, {0xB3u, 0x70u}, {0xB5u, 0x07u}, - {0xBEu, 0x04u}, + {0xB6u, 0xFFu}, + {0xBEu, 0x40u}, {0xBFu, 0x01u}, {0xC0u, 0x32u}, {0xC1u, 0x05u}, @@ -599,39 +598,39 @@ void cyfitter_cfg(void) {0xEEu, 0x08u}, {0x01u, 0x80u}, {0x02u, 0x10u}, - {0x09u, 0x08u}, - {0x0Au, 0x04u}, - {0x0Du, 0x10u}, - {0x0Eu, 0x02u}, - {0x0Fu, 0x10u}, + {0x03u, 0x04u}, + {0x04u, 0x08u}, + {0x05u, 0x40u}, + {0x07u, 0x10u}, + {0x0Au, 0x10u}, + {0x0Fu, 0x14u}, {0x11u, 0x40u}, {0x13u, 0x0Au}, {0x15u, 0x40u}, - {0x16u, 0x04u}, - {0x17u, 0x10u}, - {0x1Bu, 0x08u}, + {0x1Bu, 0x80u}, + {0x1Du, 0x40u}, {0x1Eu, 0x02u}, - {0x1Fu, 0xC0u}, - {0x20u, 0x60u}, + {0x1Fu, 0x40u}, + {0x20u, 0x50u}, {0x21u, 0x14u}, - {0x22u, 0x20u}, - {0x23u, 0x10u}, - {0x29u, 0x04u}, - {0x2Bu, 0x82u}, - {0x32u, 0x80u}, + {0x23u, 0x14u}, + {0x29u, 0x42u}, + {0x2Au, 0x08u}, + {0x30u, 0x20u}, {0x38u, 0x80u}, {0x39u, 0x28u}, - {0x40u, 0x40u}, - {0x41u, 0x14u}, - {0x49u, 0x06u}, - {0x4Au, 0x81u}, - {0x50u, 0x40u}, - {0x52u, 0x44u}, + {0x40u, 0x50u}, + {0x41u, 0x10u}, + {0x48u, 0x20u}, + {0x49u, 0x02u}, + {0x4Au, 0x01u}, + {0x50u, 0x44u}, + {0x52u, 0x40u}, {0x53u, 0x01u}, {0x58u, 0x50u}, - {0x5Au, 0x08u}, - {0x5Bu, 0x01u}, - {0x60u, 0x18u}, + {0x5Au, 0x0Au}, + {0x60u, 0x08u}, + {0x61u, 0x08u}, {0x63u, 0x82u}, {0x68u, 0x06u}, {0x6Au, 0x01u}, @@ -640,79 +639,81 @@ void cyfitter_cfg(void) {0x71u, 0x21u}, {0x72u, 0x22u}, {0x81u, 0x40u}, - {0x83u, 0x40u}, - {0x87u, 0x01u}, - {0x88u, 0x10u}, - {0x8Bu, 0x02u}, - {0x8Du, 0x10u}, - {0x8Eu, 0x10u}, - {0x92u, 0x4Cu}, - {0x95u, 0x38u}, + {0x82u, 0x80u}, + {0x83u, 0x42u}, + {0x86u, 0x08u}, + {0x89u, 0x08u}, + {0x8Au, 0x01u}, + {0x8Fu, 0x08u}, + {0x92u, 0x48u}, + {0x94u, 0x10u}, + {0x95u, 0x3Cu}, {0x96u, 0x21u}, - {0x97u, 0xC2u}, - {0x99u, 0x10u}, - {0x9Bu, 0x88u}, - {0x9Cu, 0x07u}, + {0x97u, 0xC7u}, + {0x9Bu, 0x8Cu}, + {0x9Cu, 0x06u}, {0x9Du, 0x03u}, - {0x9Eu, 0xAAu}, - {0x9Fu, 0x10u}, - {0xA4u, 0xB2u}, - {0xA6u, 0x29u}, + {0x9Eu, 0xA6u}, + {0x9Fu, 0x50u}, + {0xA1u, 0x10u}, + {0xA4u, 0x12u}, {0xA7u, 0x20u}, + {0xABu, 0x04u}, {0xADu, 0x40u}, - {0xAFu, 0x20u}, - {0xB2u, 0x10u}, - {0xC0u, 0x05u}, - {0xC2u, 0xE6u}, + {0xB5u, 0x10u}, + {0xC0u, 0x87u}, + {0xC2u, 0x64u}, {0xC4u, 0x8Du}, {0xCAu, 0x0Bu}, - {0xCCu, 0x08u}, + {0xCCu, 0x04u}, {0xCEu, 0x0Eu}, {0xD0u, 0x07u}, {0xD2u, 0x08u}, {0xD6u, 0x0Fu}, {0xD8u, 0x0Fu}, - {0xE2u, 0x06u}, - {0xE6u, 0x10u}, + {0xE2u, 0x14u}, + {0xE4u, 0x01u}, + {0xE6u, 0x02u}, {0xECu, 0x08u}, + {0xEEu, 0x04u}, + {0x00u, 0x40u}, {0x03u, 0x04u}, {0x06u, 0x04u}, {0x07u, 0x30u}, - {0x08u, 0x40u}, {0x09u, 0x41u}, {0x0Eu, 0x03u}, {0x0Fu, 0x41u}, - {0x10u, 0x24u}, - {0x11u, 0x41u}, - {0x12u, 0x09u}, - {0x15u, 0x12u}, - {0x16u, 0x18u}, - {0x17u, 0x0Du}, + {0x11u, 0x23u}, + {0x12u, 0x18u}, + {0x13u, 0x0Cu}, + {0x14u, 0x40u}, + {0x15u, 0x02u}, + {0x17u, 0x01u}, {0x19u, 0x41u}, {0x1Au, 0x20u}, {0x1Cu, 0x40u}, - {0x1Du, 0x02u}, - {0x1Fu, 0x01u}, - {0x20u, 0x40u}, + {0x1Du, 0x41u}, + {0x20u, 0x24u}, {0x21u, 0x41u}, + {0x22u, 0x09u}, {0x24u, 0x24u}, - {0x25u, 0x05u}, + {0x25u, 0x12u}, {0x26u, 0x12u}, - {0x27u, 0x0Au}, - {0x29u, 0x23u}, + {0x27u, 0x0Du}, + {0x29u, 0x05u}, {0x2Au, 0x24u}, - {0x2Bu, 0x0Cu}, + {0x2Bu, 0x0Au}, {0x2Cu, 0x40u}, {0x2Fu, 0x08u}, + {0x30u, 0x38u}, {0x31u, 0x40u}, - {0x32u, 0x38u}, - {0x34u, 0x40u}, + {0x32u, 0x40u}, + {0x33u, 0x03u}, {0x35u, 0x3Cu}, {0x36u, 0x07u}, - {0x37u, 0x03u}, - {0x38u, 0x20u}, - {0x3Bu, 0x80u}, - {0x3Eu, 0x10u}, + {0x38u, 0x08u}, + {0x3Bu, 0x08u}, + {0x3Eu, 0x04u}, {0x3Fu, 0x01u}, {0x58u, 0x04u}, {0x59u, 0x0Bu}, @@ -720,9 +721,8 @@ void cyfitter_cfg(void) {0x5Fu, 0x01u}, {0x82u, 0xFFu}, {0x84u, 0x96u}, - {0x85u, 0x69u}, + {0x85u, 0xFFu}, {0x86u, 0x69u}, - {0x87u, 0x96u}, {0x88u, 0xFFu}, {0x8Cu, 0x0Fu}, {0x8Du, 0x33u}, @@ -733,7 +733,8 @@ void cyfitter_cfg(void) {0x92u, 0xCCu}, {0x93u, 0xF0u}, {0x95u, 0xFFu}, - {0x99u, 0xFFu}, + {0x99u, 0x69u}, + {0x9Bu, 0x96u}, {0x9Du, 0x55u}, {0x9Fu, 0xAAu}, {0xA6u, 0xFFu}, @@ -752,77 +753,75 @@ void cyfitter_cfg(void) {0xDFu, 0x01u}, {0x00u, 0x08u}, {0x01u, 0x80u}, - {0x03u, 0x08u}, + {0x03u, 0x80u}, {0x04u, 0x02u}, - {0x05u, 0x50u}, - {0x06u, 0x10u}, - {0x07u, 0x02u}, - {0x09u, 0x20u}, - {0x0Au, 0x11u}, - {0x0Bu, 0x80u}, + {0x05u, 0x40u}, + {0x06u, 0x18u}, + {0x07u, 0x16u}, + {0x09u, 0x24u}, + {0x0Au, 0x81u}, {0x0Fu, 0x80u}, - {0x11u, 0x80u}, - {0x12u, 0x60u}, - {0x13u, 0x10u}, + {0x11u, 0x81u}, + {0x13u, 0x14u}, {0x17u, 0x88u}, {0x19u, 0x80u}, - {0x1Au, 0x10u}, - {0x1Bu, 0x50u}, + {0x1Au, 0x80u}, + {0x1Bu, 0x48u}, {0x1Eu, 0x01u}, {0x20u, 0x04u}, - {0x22u, 0x43u}, + {0x22u, 0x0Bu}, {0x25u, 0x40u}, - {0x28u, 0x04u}, + {0x28u, 0x20u}, + {0x29u, 0x10u}, {0x2Au, 0x02u}, - {0x2Bu, 0x22u}, + {0x2Bu, 0x02u}, {0x2Du, 0x40u}, - {0x30u, 0x01u}, - {0x32u, 0x48u}, - {0x33u, 0x10u}, - {0x35u, 0x10u}, - {0x37u, 0x8Au}, + {0x30u, 0x20u}, + {0x32u, 0x08u}, + {0x33u, 0x41u}, + {0x37u, 0x9Au}, {0x38u, 0x04u}, - {0x39u, 0x90u}, - {0x3Bu, 0x41u}, - {0x3Fu, 0x84u}, - {0x5Eu, 0x40u}, + {0x39u, 0x92u}, + {0x3Bu, 0x40u}, + {0x3Eu, 0x08u}, + {0x3Fu, 0x80u}, + {0x4Eu, 0x08u}, + {0x4Fu, 0x20u}, + {0x5Du, 0x01u}, + {0x5Eu, 0x42u}, {0x64u, 0x02u}, {0x66u, 0x80u}, {0x78u, 0x02u}, - {0x80u, 0x08u}, - {0x82u, 0x10u}, - {0x84u, 0x40u}, + {0x80u, 0x0Cu}, {0x8Au, 0x80u}, {0x8Cu, 0x01u}, {0x8Du, 0x40u}, + {0x8Eu, 0x40u}, {0x91u, 0x68u}, {0x92u, 0x40u}, - {0x93u, 0x90u}, - {0x95u, 0x10u}, - {0x96u, 0x30u}, - {0x97u, 0x40u}, - {0x99u, 0x10u}, + {0x93u, 0x14u}, + {0x95u, 0x14u}, + {0x96u, 0x20u}, + {0x97u, 0x41u}, {0x9Au, 0x01u}, - {0x9Bu, 0xA8u}, - {0x9Cu, 0x4Bu}, + {0x9Bu, 0xACu}, + {0x9Cu, 0x0Au}, {0x9Du, 0x80u}, - {0x9Eu, 0x18u}, - {0x9Fu, 0x02u}, + {0x9Eu, 0x14u}, + {0x9Fu, 0x42u}, {0xA0u, 0x04u}, {0xA1u, 0x20u}, - {0xA2u, 0x21u}, - {0xA3u, 0x08u}, - {0xA4u, 0xA0u}, - {0xA6u, 0x08u}, - {0xA7u, 0x31u}, - {0xA8u, 0x10u}, - {0xA9u, 0x08u}, + {0xA2u, 0x01u}, + {0xA3u, 0x80u}, + {0xA4u, 0x10u}, + {0xA7u, 0x29u}, + {0xAAu, 0x10u}, {0xABu, 0x80u}, - {0xACu, 0x04u}, + {0xACu, 0x54u}, {0xAEu, 0x40u}, - {0xB6u, 0x81u}, - {0xB7u, 0x10u}, - {0xC0u, 0xF7u}, + {0xB5u, 0x10u}, + {0xB6u, 0x01u}, + {0xC0u, 0xFDu}, {0xC2u, 0x1Fu}, {0xC4u, 0xAFu}, {0xCAu, 0x1Fu}, @@ -831,21 +830,21 @@ void cyfitter_cfg(void) {0xD6u, 0x10u}, {0xD8u, 0x10u}, {0xDEu, 0x01u}, - {0xE0u, 0x01u}, - {0xE6u, 0x0Cu}, + {0xE0u, 0x04u}, + {0xE2u, 0x10u}, + {0xE6u, 0x04u}, {0xE8u, 0x01u}, - {0xEAu, 0x10u}, - {0xECu, 0x10u}, - {0xEEu, 0x01u}, + {0xEEu, 0x1Au}, {0x2Cu, 0x01u}, {0x36u, 0x01u}, {0x3Eu, 0x40u}, {0x58u, 0x04u}, {0x5Fu, 0x01u}, - {0x01u, 0x50u}, + {0x01u, 0x70u}, {0x03u, 0x60u}, - {0x08u, 0x04u}, - {0x0Au, 0xA8u}, + {0x08u, 0x01u}, + {0x0Au, 0x80u}, + {0x0Bu, 0x14u}, {0x0Eu, 0x01u}, {0x0Fu, 0x02u}, {0x10u, 0x22u}, @@ -854,56 +853,56 @@ void cyfitter_cfg(void) {0x16u, 0x01u}, {0x19u, 0x01u}, {0x1Eu, 0x01u}, - {0x20u, 0x04u}, - {0x22u, 0x04u}, - {0x23u, 0x01u}, - {0x28u, 0x21u}, + {0x21u, 0x09u}, + {0x22u, 0x40u}, + {0x28u, 0x01u}, {0x29u, 0x11u}, + {0x2Bu, 0x10u}, {0x30u, 0x22u}, - {0x32u, 0x44u}, - {0x38u, 0x04u}, + {0x31u, 0x08u}, + {0x33u, 0x40u}, {0x39u, 0x40u}, {0x3Au, 0x02u}, - {0x3Bu, 0x10u}, - {0x42u, 0x60u}, - {0x43u, 0x20u}, - {0x44u, 0x01u}, + {0x3Bu, 0x14u}, + {0x40u, 0xB0u}, + {0x41u, 0x20u}, + {0x45u, 0x40u}, {0x47u, 0x40u}, - {0x49u, 0x04u}, - {0x4Au, 0x0Au}, + {0x49u, 0x14u}, + {0x4Au, 0x02u}, {0x4Bu, 0x02u}, {0x50u, 0x02u}, - {0x52u, 0x14u}, + {0x52u, 0x50u}, {0x53u, 0x02u}, {0x62u, 0x80u}, - {0x68u, 0x60u}, + {0x68u, 0x20u}, {0x69u, 0xD4u}, - {0x6Bu, 0x50u}, - {0x70u, 0x80u}, + {0x6Bu, 0x48u}, {0x72u, 0x02u}, - {0x73u, 0x02u}, + {0x73u, 0x03u}, {0x78u, 0x02u}, - {0x89u, 0x02u}, + {0x80u, 0x80u}, + {0x8Eu, 0x40u}, {0x91u, 0x28u}, - {0x92u, 0x82u}, - {0x95u, 0x90u}, + {0x92u, 0x02u}, + {0x95u, 0x96u}, {0x96u, 0x20u}, {0x97u, 0x01u}, {0x98u, 0x02u}, {0x9Au, 0x01u}, {0x9Bu, 0x20u}, - {0x9Cu, 0x05u}, - {0x9Du, 0x40u}, - {0x9Eu, 0x0Au}, - {0x9Fu, 0x10u}, - {0xA2u, 0x83u}, - {0xA4u, 0xA0u}, - {0xA6u, 0x08u}, + {0x9Cu, 0x20u}, + {0x9Du, 0x50u}, + {0x9Eu, 0x02u}, + {0x9Fu, 0x41u}, + {0xA2u, 0x8Bu}, + {0xA3u, 0x10u}, + {0xA4u, 0x30u}, {0xA7u, 0x23u}, + {0xA9u, 0x04u}, + {0xAAu, 0x04u}, {0xADu, 0x80u}, - {0xB2u, 0xD0u}, - {0xB3u, 0x04u}, - {0xB4u, 0x04u}, + {0xB2u, 0x90u}, {0xC0u, 0x0Fu}, {0xC2u, 0x0Eu}, {0xC4u, 0x8Fu}, @@ -914,33 +913,30 @@ void cyfitter_cfg(void) {0xD2u, 0x0Cu}, {0xD8u, 0x08u}, {0xDEu, 0x01u}, - {0xE6u, 0x01u}, {0xE8u, 0x08u}, - {0x80u, 0x10u}, - {0x88u, 0x01u}, - {0x90u, 0x10u}, + {0xEAu, 0x04u}, + {0x8Fu, 0x40u}, + {0x90u, 0x20u}, + {0x96u, 0x04u}, {0x97u, 0x80u}, {0x9Cu, 0x40u}, {0x9Du, 0x08u}, - {0x9Eu, 0x20u}, - {0xA4u, 0x01u}, - {0xA9u, 0x08u}, + {0xA7u, 0x40u}, + {0xA9u, 0x09u}, {0xADu, 0x01u}, {0xAFu, 0x80u}, {0xB1u, 0x22u}, - {0xB2u, 0x11u}, + {0xB2u, 0x10u}, {0xB4u, 0x04u}, - {0xB7u, 0x40u}, - {0xE0u, 0x80u}, + {0xE4u, 0x40u}, {0xE8u, 0x08u}, {0xEAu, 0x83u}, - {0xECu, 0x40u}, - {0xEEu, 0xA0u}, + {0xEEu, 0x20u}, {0x00u, 0x33u}, {0x02u, 0xCCu}, {0x08u, 0x55u}, + {0x09u, 0x01u}, {0x0Au, 0xAAu}, - {0x0Du, 0x01u}, {0x10u, 0x69u}, {0x12u, 0x96u}, {0x16u, 0xFFu}, @@ -949,33 +945,33 @@ void cyfitter_cfg(void) {0x1Eu, 0xF0u}, {0x26u, 0xFFu}, {0x29u, 0x02u}, - {0x33u, 0x01u}, - {0x35u, 0x02u}, - {0x36u, 0xFFu}, - {0x3Eu, 0x40u}, - {0x3Fu, 0x14u}, + {0x30u, 0xFFu}, + {0x31u, 0x02u}, + {0x35u, 0x01u}, + {0x3Eu, 0x01u}, + {0x3Fu, 0x11u}, {0x58u, 0x04u}, {0x59u, 0x04u}, {0x5Fu, 0x01u}, {0x80u, 0x05u}, - {0x81u, 0x38u}, {0x82u, 0x0Au}, {0x84u, 0x20u}, - {0x89u, 0x25u}, - {0x8Bu, 0x02u}, + {0x85u, 0x25u}, + {0x87u, 0x02u}, + {0x88u, 0x06u}, + {0x8Au, 0x09u}, {0x8Cu, 0x03u}, + {0x8Du, 0x38u}, {0x8Eu, 0x0Cu}, - {0x8Fu, 0x38u}, {0x94u, 0x10u}, - {0x95u, 0x09u}, - {0x97u, 0x06u}, + {0x97u, 0x38u}, {0x99u, 0x04u}, {0x9Bu, 0x03u}, - {0x9Cu, 0x06u}, {0x9Du, 0x40u}, - {0x9Eu, 0x09u}, {0xA1u, 0x03u}, {0xA3u, 0x14u}, + {0xA5u, 0x09u}, + {0xA7u, 0x06u}, {0xACu, 0x40u}, {0xB0u, 0x0Fu}, {0xB2u, 0x40u}, @@ -993,81 +989,77 @@ void cyfitter_cfg(void) {0xDFu, 0x01u}, {0x01u, 0x01u}, {0x02u, 0x04u}, - {0x04u, 0x08u}, + {0x04u, 0x18u}, {0x05u, 0x42u}, {0x08u, 0x68u}, {0x09u, 0x02u}, {0x0Du, 0x08u}, - {0x0Fu, 0x01u}, - {0x13u, 0x08u}, + {0x11u, 0x08u}, {0x16u, 0x01u}, - {0x1Au, 0x01u}, + {0x19u, 0x01u}, {0x1Cu, 0x08u}, {0x1Du, 0x02u}, {0x1Fu, 0x84u}, - {0x22u, 0x08u}, - {0x23u, 0x04u}, - {0x24u, 0x10u}, + {0x21u, 0x21u}, + {0x24u, 0x20u}, {0x26u, 0x10u}, - {0x27u, 0x02u}, + {0x27u, 0x01u}, {0x29u, 0x20u}, + {0x2Du, 0x08u}, {0x2Fu, 0x40u}, - {0x35u, 0x08u}, {0x36u, 0x10u}, - {0x37u, 0x80u}, - {0x38u, 0x80u}, - {0x3Cu, 0x02u}, - {0x3Eu, 0x20u}, + {0x37u, 0x88u}, + {0x3Au, 0x10u}, + {0x3Eu, 0x04u}, {0x3Fu, 0x80u}, {0x7Eu, 0x02u}, - {0x83u, 0x81u}, - {0x87u, 0x04u}, + {0x83u, 0x88u}, {0x8Au, 0x02u}, - {0x8Cu, 0x08u}, - {0x90u, 0x80u}, - {0x97u, 0x04u}, + {0x8Cu, 0x18u}, + {0x95u, 0x02u}, + {0x97u, 0x08u}, {0x98u, 0x20u}, {0x99u, 0x42u}, - {0x9Au, 0x05u}, - {0x9Bu, 0x08u}, - {0x9Cu, 0x40u}, - {0x9Fu, 0x02u}, + {0x9Au, 0x15u}, + {0x9Fu, 0x01u}, + {0xA1u, 0x04u}, {0xA4u, 0x04u}, - {0xA6u, 0x08u}, + {0xA5u, 0x20u}, {0xAAu, 0x04u}, - {0xABu, 0x02u}, - {0xC0u, 0xBAu}, - {0xC2u, 0xAFu}, + {0xACu, 0x04u}, + {0xAFu, 0x04u}, + {0xB2u, 0x10u}, + {0xC0u, 0xFAu}, + {0xC2u, 0x2Fu}, {0xC4u, 0x84u}, - {0xCAu, 0x84u}, + {0xCAu, 0xC4u}, {0xCCu, 0x70u}, - {0xCEu, 0xB8u}, + {0xCEu, 0x54u}, {0xDEu, 0x10u}, - {0xE0u, 0x40u}, + {0xE0u, 0x50u}, {0xE4u, 0x20u}, {0xE8u, 0x01u}, {0xEEu, 0x40u}, - {0x82u, 0x08u}, - {0x84u, 0x40u}, - {0x87u, 0x04u}, - {0x88u, 0x04u}, - {0x8Cu, 0x60u}, + {0x81u, 0x20u}, + {0x89u, 0x01u}, + {0x8Bu, 0x01u}, + {0x98u, 0x20u}, {0x99u, 0x42u}, {0x9Au, 0x01u}, - {0x9Bu, 0x08u}, + {0xA1u, 0x04u}, {0xADu, 0x02u}, + {0xB4u, 0x20u}, {0xB6u, 0x01u}, - {0xE0u, 0x40u}, {0xE2u, 0x20u}, - {0xE4u, 0x08u}, - {0xE6u, 0x80u}, - {0xEEu, 0x20u}, - {0x83u, 0x08u}, + {0xE4u, 0x01u}, + {0xE6u, 0x22u}, + {0xE8u, 0x40u}, + {0xEEu, 0x04u}, + {0x81u, 0x04u}, {0x85u, 0x40u}, - {0x82u, 0x20u}, - {0x9Eu, 0x20u}, - {0xAEu, 0x08u}, - {0xB2u, 0x08u}, + {0xACu, 0x21u}, + {0xB2u, 0x02u}, + {0xB3u, 0x14u}, {0xB5u, 0x10u}, {0x06u, 0x04u}, {0x0Eu, 0x03u}, @@ -1083,39 +1075,39 @@ void cyfitter_cfg(void) {0x5Cu, 0x09u}, {0x5Du, 0x90u}, {0x5Fu, 0x01u}, - {0x80u, 0x30u}, - {0x84u, 0x10u}, - {0x85u, 0x42u}, - {0x86u, 0x0Fu}, - {0x87u, 0x04u}, - {0x88u, 0x40u}, - {0x8Au, 0x0Cu}, - {0x8Bu, 0x46u}, - {0x8Cu, 0x4Cu}, + {0x80u, 0x08u}, + {0x84u, 0x44u}, + {0x85u, 0x01u}, + {0x86u, 0x08u}, + {0x87u, 0x5Eu}, + {0x88u, 0x04u}, + {0x89u, 0x39u}, + {0x8Bu, 0x06u}, + {0x8Cu, 0x0Cu}, {0x8Du, 0x46u}, - {0x90u, 0x04u}, + {0x8Eu, 0x40u}, + {0x90u, 0x30u}, {0x94u, 0x01u}, - {0x95u, 0x39u}, + {0x95u, 0x42u}, {0x96u, 0x2Eu}, - {0x97u, 0x06u}, {0x98u, 0x01u}, - {0x99u, 0x01u}, + {0x99u, 0x42u}, {0x9Au, 0x12u}, - {0x9Bu, 0x5Eu}, - {0x9Du, 0x42u}, + {0x9Bu, 0x04u}, + {0x9Du, 0x46u}, {0x9Eu, 0x40u}, {0xA0u, 0x4Cu}, {0xA1u, 0x46u}, - {0xA4u, 0x44u}, - {0xA5u, 0x04u}, - {0xA6u, 0x08u}, - {0xA7u, 0x20u}, - {0xA8u, 0x08u}, - {0xA9u, 0x77u}, - {0xABu, 0x08u}, - {0xACu, 0x0Cu}, - {0xADu, 0x46u}, - {0xAEu, 0x40u}, + {0xA4u, 0x40u}, + {0xA5u, 0x77u}, + {0xA6u, 0x0Cu}, + {0xA7u, 0x08u}, + {0xA8u, 0x10u}, + {0xAAu, 0x0Fu}, + {0xABu, 0x46u}, + {0xACu, 0x4Cu}, + {0xADu, 0x04u}, + {0xAFu, 0x20u}, {0xB0u, 0x31u}, {0xB1u, 0x08u}, {0xB2u, 0x40u}, @@ -1135,35 +1127,38 @@ void cyfitter_cfg(void) {0xDCu, 0x99u}, {0xDDu, 0x90u}, {0xDFu, 0x01u}, - {0x00u, 0x84u}, - {0x01u, 0x12u}, + {0x00u, 0x02u}, + {0x01u, 0x44u}, + {0x02u, 0x48u}, {0x05u, 0x40u}, {0x07u, 0x20u}, - {0x0Au, 0x84u}, + {0x0Au, 0x44u}, {0x0Bu, 0x12u}, {0x0Du, 0x14u}, {0x0Eu, 0x02u}, - {0x10u, 0x20u}, - {0x11u, 0x40u}, + {0x11u, 0x80u}, {0x12u, 0x04u}, - {0x13u, 0x02u}, - {0x19u, 0x1Au}, - {0x1Au, 0x04u}, + {0x13u, 0x0Au}, + {0x19u, 0x18u}, + {0x1Au, 0x44u}, {0x1Bu, 0x20u}, {0x1Du, 0x40u}, - {0x20u, 0x04u}, + {0x20u, 0x30u}, {0x21u, 0x20u}, - {0x22u, 0x98u}, - {0x23u, 0x98u}, - {0x28u, 0x11u}, - {0x29u, 0x10u}, - {0x2Au, 0x06u}, - {0x31u, 0x20u}, - {0x32u, 0x48u}, - {0x39u, 0x54u}, - {0x44u, 0x20u}, - {0x47u, 0x08u}, - {0x58u, 0x10u}, + {0x22u, 0x90u}, + {0x23u, 0x94u}, + {0x29u, 0x20u}, + {0x2Au, 0x42u}, + {0x2Bu, 0x20u}, + {0x30u, 0x20u}, + {0x32u, 0x08u}, + {0x33u, 0x40u}, + {0x36u, 0x02u}, + {0x37u, 0x01u}, + {0x39u, 0x40u}, + {0x3Au, 0x04u}, + {0x3Bu, 0x14u}, + {0x58u, 0x20u}, {0x59u, 0x04u}, {0x5Au, 0x02u}, {0x5Bu, 0x80u}, @@ -1173,24 +1168,24 @@ void cyfitter_cfg(void) {0x67u, 0x02u}, {0x78u, 0x02u}, {0x7Cu, 0x02u}, - {0x81u, 0x20u}, - {0x82u, 0x40u}, {0x89u, 0x40u}, - {0x91u, 0x7Cu}, - {0x92u, 0x82u}, + {0x91u, 0x6Cu}, + {0x92u, 0x02u}, {0x93u, 0x02u}, + {0x94u, 0x10u}, {0x96u, 0x60u}, - {0x97u, 0x10u}, - {0x98u, 0x03u}, - {0x99u, 0x04u}, - {0x9Au, 0x16u}, - {0x9Bu, 0x22u}, - {0x9Cu, 0x20u}, - {0x9Du, 0x52u}, - {0x9Eu, 0x28u}, - {0xA0u, 0x60u}, - {0xA2u, 0x01u}, - {0xA6u, 0x08u}, + {0x97u, 0x14u}, + {0x98u, 0x02u}, + {0x99u, 0x24u}, + {0x9Au, 0x52u}, + {0x9Bu, 0x6Au}, + {0x9Du, 0x50u}, + {0x9Fu, 0x01u}, + {0xA0u, 0x20u}, + {0xA1u, 0x40u}, + {0xA2u, 0x09u}, + {0xA4u, 0x10u}, + {0xA5u, 0x20u}, {0xA7u, 0x20u}, {0xC0u, 0xAFu}, {0xC2u, 0xEFu}, @@ -1201,61 +1196,66 @@ void cyfitter_cfg(void) {0xD6u, 0x0Fu}, {0xD8u, 0x78u}, {0xDEu, 0x81u}, - {0xE0u, 0x04u}, - {0xEEu, 0x08u}, - {0x82u, 0x20u}, + {0xEAu, 0x04u}, + {0xEEu, 0x0Au}, {0x88u, 0x40u}, + {0x96u, 0x04u}, {0x97u, 0x80u}, {0x9Cu, 0x40u}, {0x9Du, 0x08u}, - {0x9Eu, 0x20u}, + {0xA8u, 0x10u}, {0xE0u, 0x80u}, - {0xEEu, 0x08u}, + {0xEEu, 0x0Au}, + {0xB2u, 0x04u}, {0xB3u, 0x40u}, {0xB5u, 0x08u}, {0xE8u, 0x40u}, - {0xECu, 0x80u}, + {0xECu, 0xA0u}, {0x33u, 0x80u}, - {0x5Bu, 0x40u}, + {0x36u, 0x40u}, + {0x5Au, 0x80u}, + {0x5Eu, 0x02u}, {0x62u, 0x01u}, {0x63u, 0x02u}, - {0x66u, 0x80u}, {0x67u, 0x08u}, {0x82u, 0x03u}, {0x87u, 0x04u}, - {0xCCu, 0x10u}, + {0xCCu, 0x30u}, {0xD4u, 0x80u}, {0xD6u, 0xC0u}, {0xD8u, 0xC0u}, {0xE2u, 0x20u}, {0xE6u, 0x30u}, - {0x52u, 0x10u}, + {0x51u, 0x08u}, {0x53u, 0x01u}, - {0x83u, 0x01u}, - {0x8Eu, 0x80u}, - {0x9Au, 0x12u}, - {0x9Eu, 0x80u}, - {0x9Fu, 0x40u}, + {0x83u, 0x05u}, + {0x8Eu, 0x40u}, + {0x96u, 0x80u}, + {0x9Au, 0x02u}, + {0xA6u, 0x41u}, {0xA7u, 0x80u}, - {0xAEu, 0x10u}, {0xAFu, 0x01u}, {0xD4u, 0xA0u}, + {0xE0u, 0x80u}, {0xE6u, 0x20u}, - {0xEAu, 0x40u}, {0xEEu, 0x10u}, - {0x94u, 0x01u}, + {0x8Eu, 0x01u}, {0x9Au, 0x02u}, + {0x9Fu, 0x04u}, + {0xA6u, 0x41u}, {0xA7u, 0x80u}, - {0xB4u, 0x01u}, - {0xB7u, 0x40u}, - {0x82u, 0x20u}, - {0x94u, 0x01u}, + {0xB5u, 0x08u}, + {0x81u, 0x04u}, {0x9Au, 0x02u}, + {0x9Fu, 0x84u}, + {0xA6u, 0x40u}, {0xA7u, 0x80u}, - {0xE6u, 0x80u}, - {0x0Cu, 0x04u}, + {0xABu, 0x80u}, + {0xE4u, 0x80u}, + {0xE8u, 0x80u}, + {0x0Eu, 0x80u}, {0x10u, 0x80u}, - {0x53u, 0x80u}, + {0x50u, 0x04u}, {0x54u, 0x10u}, {0x5Au, 0x10u}, {0x5Cu, 0x40u}, @@ -1264,71 +1264,70 @@ void cyfitter_cfg(void) {0xD4u, 0x07u}, {0xD6u, 0x04u}, {0x03u, 0x01u}, - {0x04u, 0x81u}, + {0x04u, 0x80u}, + {0x06u, 0x80u}, + {0x08u, 0x20u}, {0x09u, 0x04u}, - {0x0Bu, 0x04u}, {0x0Eu, 0x02u}, {0x0Fu, 0x40u}, - {0x87u, 0x80u}, - {0x88u, 0x04u}, - {0x8Cu, 0x41u}, - {0x94u, 0x40u}, + {0x80u, 0x04u}, + {0x86u, 0x40u}, + {0x94u, 0x08u}, {0x96u, 0x10u}, - {0x97u, 0x04u}, - {0x98u, 0x04u}, + {0x9Cu, 0x20u}, + {0xA2u, 0x40u}, {0xA4u, 0x10u}, - {0xA7u, 0x80u}, - {0xB3u, 0x04u}, - {0xB4u, 0x80u}, + {0xA8u, 0x20u}, + {0xB4u, 0xC0u}, {0xC0u, 0x07u}, {0xC2u, 0x0Fu}, - {0xE0u, 0x02u}, - {0xE6u, 0x09u}, - {0xEEu, 0x06u}, + {0xE8u, 0x02u}, + {0xEEu, 0x02u}, {0x90u, 0x80u}, {0x93u, 0x40u}, {0x9Bu, 0x01u}, {0xA2u, 0x01u}, {0xA4u, 0x10u}, {0xAAu, 0x10u}, + {0xB2u, 0x80u}, {0xB5u, 0x04u}, - {0xEEu, 0x02u}, + {0xEEu, 0x06u}, {0x08u, 0x08u}, + {0x0Fu, 0x40u}, {0xA8u, 0x40u}, {0xACu, 0x10u}, {0xAFu, 0x01u}, {0xB3u, 0x40u}, {0xB6u, 0x01u}, - {0xC2u, 0x08u}, + {0xC2u, 0x0Cu}, {0xEAu, 0x0Cu}, - {0x23u, 0x40u}, - {0x24u, 0x01u}, - {0x94u, 0x01u}, - {0x9Au, 0x02u}, - {0xA2u, 0x20u}, + {0x23u, 0x80u}, + {0x27u, 0x04u}, + {0x9Au, 0x22u}, + {0x9Du, 0x04u}, + {0x9Fu, 0x84u}, + {0xAAu, 0x20u}, + {0xAEu, 0x40u}, {0xAFu, 0x80u}, {0xC8u, 0x60u}, - {0xEEu, 0x10u}, - {0x07u, 0x10u}, - {0x52u, 0x20u}, - {0x56u, 0x02u}, - {0x83u, 0x10u}, - {0x9Au, 0x02u}, - {0xA2u, 0x20u}, - {0xAFu, 0x40u}, + {0xEAu, 0x20u}, + {0xEEu, 0x50u}, + {0x05u, 0x04u}, + {0x56u, 0x22u}, + {0x9Au, 0x22u}, + {0x9Du, 0x04u}, {0xC0u, 0x20u}, - {0xD4u, 0x20u}, + {0xD4u, 0x40u}, {0xD6u, 0x20u}, - {0xE0u, 0x20u}, - {0xECu, 0x40u}, {0xACu, 0x08u}, + {0xAFu, 0x40u}, {0x01u, 0x01u}, {0x09u, 0x01u}, {0x0Bu, 0x01u}, {0x0Du, 0x01u}, {0x11u, 0x01u}, {0x1Bu, 0x01u}, - {0x00u, 0x02u}, + {0x00u, 0x0Au}, }; @@ -1358,11 +1357,11 @@ void cyfitter_cfg(void) /* 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[] = { - 0xC0u, 0x01u, 0x02u, 0x00u, 0x1Fu, 0x40u, 0x20u, 0x00u, 0xC0u, 0x08u, 0x08u, 0x21u, 0x90u, 0x01u, 0x40u, 0x00u, - 0x80u, 0x10u, 0x00u, 0x80u, 0x7Fu, 0x04u, 0x80u, 0x00u, 0x00u, 0x01u, 0x60u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, - 0xC0u, 0x40u, 0x01u, 0x00u, 0xC0u, 0x22u, 0x04u, 0x08u, 0x00u, 0x07u, 0xFFu, 0x18u, 0x00u, 0x01u, 0x9Fu, 0x00u, - 0xFFu, 0x00u, 0x00u, 0x40u, 0x00u, 0x3Fu, 0x00u, 0x80u, 0x00u, 0x28u, 0x00u, 0x00u, 0x00u, 0x00u, 0x01u, 0x10u, - 0x64u, 0x02u, 0x50u, 0x00u, 0x03u, 0xDEu, 0xF0u, 0xBCu, 0x3Bu, 0xFFu, 0xFFu, 0xFFu, 0x22u, 0x00u, 0xF0u, 0x08u, + 0xC0u, 0x01u, 0x02u, 0x00u, 0x1Fu, 0x22u, 0x20u, 0x08u, 0xC0u, 0x08u, 0x08u, 0x21u, 0x90u, 0x01u, 0x40u, 0x00u, + 0x00u, 0x10u, 0x60u, 0x80u, 0x00u, 0x40u, 0xFFu, 0x00u, 0x7Fu, 0x01u, 0x80u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, + 0xC0u, 0x40u, 0x01u, 0x00u, 0xC0u, 0x01u, 0x04u, 0x00u, 0x80u, 0x07u, 0x00u, 0x18u, 0x00u, 0x04u, 0x9Fu, 0x00u, + 0xFFu, 0x80u, 0x00u, 0x3Fu, 0x00u, 0x00u, 0x00u, 0x40u, 0x00u, 0x88u, 0x00u, 0x00u, 0x00u, 0x00u, 0x01u, 0x04u, + 0x32u, 0x06u, 0x50u, 0x00u, 0x04u, 0xDEu, 0xFCu, 0xB0u, 0x2Fu, 0xFFu, 0xFFu, 0xFFu, 0x22u, 0x00u, 0xF0u, 0x08u, 0x04u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x02u, 0x20u, 0x04u, 0x0Bu, 0x0Bu, 0x0Bu, 0x90u, 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}; diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc index 3558ef14..1cdc92f0 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfittergnu.inc @@ -3,45 +3,35 @@ .include "cydevicegnu.inc" .include "cydevicegnu_trm.inc" -/* USBFS_1_bus_reset */ -.set USBFS_1_bus_reset__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 -.set USBFS_1_bus_reset__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_1_bus_reset__INTC_MASK, 0x800000 -.set USBFS_1_bus_reset__INTC_NUMBER, 23 -.set USBFS_1_bus_reset__INTC_PRIOR_NUM, 7 -.set USBFS_1_bus_reset__INTC_PRIOR_REG, CYREG_NVIC_PRI_23 -.set USBFS_1_bus_reset__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 -.set USBFS_1_bus_reset__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 +/* 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 +.set USBFS_bus_reset__INTC_MASK, 0x800000 +.set USBFS_bus_reset__INTC_NUMBER, 23 +.set USBFS_bus_reset__INTC_PRIOR_NUM, 7 +.set USBFS_bus_reset__INTC_PRIOR_REG, CYREG_NVIC_PRI_23 +.set USBFS_bus_reset__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_bus_reset__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 -/* USBFS_1_arb_int */ -.set USBFS_1_arb_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 -.set USBFS_1_arb_int__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_1_arb_int__INTC_MASK, 0x400000 -.set USBFS_1_arb_int__INTC_NUMBER, 22 -.set USBFS_1_arb_int__INTC_PRIOR_NUM, 7 -.set USBFS_1_arb_int__INTC_PRIOR_REG, CYREG_NVIC_PRI_22 -.set USBFS_1_arb_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 -.set USBFS_1_arb_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 +/* USBFS_arb_int */ +.set USBFS_arb_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set USBFS_arb_int__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set USBFS_arb_int__INTC_MASK, 0x400000 +.set USBFS_arb_int__INTC_NUMBER, 22 +.set USBFS_arb_int__INTC_PRIOR_NUM, 7 +.set USBFS_arb_int__INTC_PRIOR_REG, CYREG_NVIC_PRI_22 +.set USBFS_arb_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_arb_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 -/* USBFS_1_sof_int */ -.set USBFS_1_sof_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 -.set USBFS_1_sof_int__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_1_sof_int__INTC_MASK, 0x200000 -.set USBFS_1_sof_int__INTC_NUMBER, 21 -.set USBFS_1_sof_int__INTC_PRIOR_NUM, 7 -.set USBFS_1_sof_int__INTC_PRIOR_REG, CYREG_NVIC_PRI_21 -.set USBFS_1_sof_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 -.set USBFS_1_sof_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 - -/* USBFS_1_dp_int */ -.set USBFS_1_dp_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 -.set USBFS_1_dp_int__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_1_dp_int__INTC_MASK, 0x1000 -.set USBFS_1_dp_int__INTC_NUMBER, 12 -.set USBFS_1_dp_int__INTC_PRIOR_NUM, 7 -.set USBFS_1_dp_int__INTC_PRIOR_REG, CYREG_NVIC_PRI_12 -.set USBFS_1_dp_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 -.set USBFS_1_dp_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 +/* USBFS_sof_int */ +.set USBFS_sof_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set USBFS_sof_int__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set USBFS_sof_int__INTC_MASK, 0x200000 +.set USBFS_sof_int__INTC_NUMBER, 21 +.set USBFS_sof_int__INTC_PRIOR_NUM, 7 +.set USBFS_sof_int__INTC_PRIOR_REG, CYREG_NVIC_PRI_21 +.set USBFS_sof_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_sof_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 /* SCSI_ATN_ISR */ .set SCSI_ATN_ISR__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 @@ -572,25 +562,15 @@ .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 -/* USBFS_1_ep_0 */ -.set USBFS_1_ep_0__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 -.set USBFS_1_ep_0__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_1_ep_0__INTC_MASK, 0x1000000 -.set USBFS_1_ep_0__INTC_NUMBER, 24 -.set USBFS_1_ep_0__INTC_PRIOR_NUM, 7 -.set USBFS_1_ep_0__INTC_PRIOR_REG, CYREG_NVIC_PRI_24 -.set USBFS_1_ep_0__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 -.set USBFS_1_ep_0__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 - -/* USBFS_1_ep_1 */ -.set USBFS_1_ep_1__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 -.set USBFS_1_ep_1__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 -.set USBFS_1_ep_1__INTC_MASK, 0x01 -.set USBFS_1_ep_1__INTC_NUMBER, 0 -.set USBFS_1_ep_1__INTC_PRIOR_NUM, 7 -.set USBFS_1_ep_1__INTC_PRIOR_REG, CYREG_NVIC_PRI_0 -.set USBFS_1_ep_1__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 -.set USBFS_1_ep_1__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 +/* USBFS_dp_int */ +.set USBFS_dp_int__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set USBFS_dp_int__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set USBFS_dp_int__INTC_MASK, 0x1000 +.set USBFS_dp_int__INTC_NUMBER, 12 +.set USBFS_dp_int__INTC_PRIOR_NUM, 7 +.set USBFS_dp_int__INTC_PRIOR_REG, CYREG_NVIC_PRI_12 +.set USBFS_dp_int__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_dp_int__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 /* SCSI_CTL_IO */ .set SCSI_CTL_IO_Sync_ctrl_reg__0__MASK, 0x01 @@ -1068,132 +1048,6 @@ .set SD_Init_Clk__PM_STBY_CFG, CYREG_PM_STBY_CFG2 .set SD_Init_Clk__PM_STBY_MSK, 0x02 -/* USBFS_1_USB */ -.set USBFS_1_USB__ARB_CFG, CYREG_USB_ARB_CFG -.set USBFS_1_USB__ARB_EP1_CFG, CYREG_USB_ARB_EP1_CFG -.set USBFS_1_USB__ARB_EP1_INT_EN, CYREG_USB_ARB_EP1_INT_EN -.set USBFS_1_USB__ARB_EP1_SR, CYREG_USB_ARB_EP1_SR -.set USBFS_1_USB__ARB_EP2_CFG, CYREG_USB_ARB_EP2_CFG -.set USBFS_1_USB__ARB_EP2_INT_EN, CYREG_USB_ARB_EP2_INT_EN -.set USBFS_1_USB__ARB_EP2_SR, CYREG_USB_ARB_EP2_SR -.set USBFS_1_USB__ARB_EP3_CFG, CYREG_USB_ARB_EP3_CFG -.set USBFS_1_USB__ARB_EP3_INT_EN, CYREG_USB_ARB_EP3_INT_EN -.set USBFS_1_USB__ARB_EP3_SR, CYREG_USB_ARB_EP3_SR -.set USBFS_1_USB__ARB_EP4_CFG, CYREG_USB_ARB_EP4_CFG -.set USBFS_1_USB__ARB_EP4_INT_EN, CYREG_USB_ARB_EP4_INT_EN -.set USBFS_1_USB__ARB_EP4_SR, CYREG_USB_ARB_EP4_SR -.set USBFS_1_USB__ARB_EP5_CFG, CYREG_USB_ARB_EP5_CFG -.set USBFS_1_USB__ARB_EP5_INT_EN, CYREG_USB_ARB_EP5_INT_EN -.set USBFS_1_USB__ARB_EP5_SR, CYREG_USB_ARB_EP5_SR -.set USBFS_1_USB__ARB_EP6_CFG, CYREG_USB_ARB_EP6_CFG -.set USBFS_1_USB__ARB_EP6_INT_EN, CYREG_USB_ARB_EP6_INT_EN -.set USBFS_1_USB__ARB_EP6_SR, CYREG_USB_ARB_EP6_SR -.set USBFS_1_USB__ARB_EP7_CFG, CYREG_USB_ARB_EP7_CFG -.set USBFS_1_USB__ARB_EP7_INT_EN, CYREG_USB_ARB_EP7_INT_EN -.set USBFS_1_USB__ARB_EP7_SR, CYREG_USB_ARB_EP7_SR -.set USBFS_1_USB__ARB_EP8_CFG, CYREG_USB_ARB_EP8_CFG -.set USBFS_1_USB__ARB_EP8_INT_EN, CYREG_USB_ARB_EP8_INT_EN -.set USBFS_1_USB__ARB_EP8_SR, CYREG_USB_ARB_EP8_SR -.set USBFS_1_USB__ARB_INT_EN, CYREG_USB_ARB_INT_EN -.set USBFS_1_USB__ARB_INT_SR, CYREG_USB_ARB_INT_SR -.set USBFS_1_USB__ARB_RW1_DR, CYREG_USB_ARB_RW1_DR -.set USBFS_1_USB__ARB_RW1_RA, CYREG_USB_ARB_RW1_RA -.set USBFS_1_USB__ARB_RW1_RA_MSB, CYREG_USB_ARB_RW1_RA_MSB -.set USBFS_1_USB__ARB_RW1_WA, CYREG_USB_ARB_RW1_WA -.set USBFS_1_USB__ARB_RW1_WA_MSB, CYREG_USB_ARB_RW1_WA_MSB -.set USBFS_1_USB__ARB_RW2_DR, CYREG_USB_ARB_RW2_DR -.set USBFS_1_USB__ARB_RW2_RA, CYREG_USB_ARB_RW2_RA -.set USBFS_1_USB__ARB_RW2_RA_MSB, CYREG_USB_ARB_RW2_RA_MSB -.set USBFS_1_USB__ARB_RW2_WA, CYREG_USB_ARB_RW2_WA -.set USBFS_1_USB__ARB_RW2_WA_MSB, CYREG_USB_ARB_RW2_WA_MSB -.set USBFS_1_USB__ARB_RW3_DR, CYREG_USB_ARB_RW3_DR -.set USBFS_1_USB__ARB_RW3_RA, CYREG_USB_ARB_RW3_RA -.set USBFS_1_USB__ARB_RW3_RA_MSB, CYREG_USB_ARB_RW3_RA_MSB -.set USBFS_1_USB__ARB_RW3_WA, CYREG_USB_ARB_RW3_WA -.set USBFS_1_USB__ARB_RW3_WA_MSB, CYREG_USB_ARB_RW3_WA_MSB -.set USBFS_1_USB__ARB_RW4_DR, CYREG_USB_ARB_RW4_DR -.set USBFS_1_USB__ARB_RW4_RA, CYREG_USB_ARB_RW4_RA -.set USBFS_1_USB__ARB_RW4_RA_MSB, CYREG_USB_ARB_RW4_RA_MSB -.set USBFS_1_USB__ARB_RW4_WA, CYREG_USB_ARB_RW4_WA -.set USBFS_1_USB__ARB_RW4_WA_MSB, CYREG_USB_ARB_RW4_WA_MSB -.set USBFS_1_USB__ARB_RW5_DR, CYREG_USB_ARB_RW5_DR -.set USBFS_1_USB__ARB_RW5_RA, CYREG_USB_ARB_RW5_RA -.set USBFS_1_USB__ARB_RW5_RA_MSB, CYREG_USB_ARB_RW5_RA_MSB -.set USBFS_1_USB__ARB_RW5_WA, CYREG_USB_ARB_RW5_WA -.set USBFS_1_USB__ARB_RW5_WA_MSB, CYREG_USB_ARB_RW5_WA_MSB -.set USBFS_1_USB__ARB_RW6_DR, CYREG_USB_ARB_RW6_DR -.set USBFS_1_USB__ARB_RW6_RA, CYREG_USB_ARB_RW6_RA -.set USBFS_1_USB__ARB_RW6_RA_MSB, CYREG_USB_ARB_RW6_RA_MSB -.set USBFS_1_USB__ARB_RW6_WA, CYREG_USB_ARB_RW6_WA -.set USBFS_1_USB__ARB_RW6_WA_MSB, CYREG_USB_ARB_RW6_WA_MSB -.set USBFS_1_USB__ARB_RW7_DR, CYREG_USB_ARB_RW7_DR -.set USBFS_1_USB__ARB_RW7_RA, CYREG_USB_ARB_RW7_RA -.set USBFS_1_USB__ARB_RW7_RA_MSB, CYREG_USB_ARB_RW7_RA_MSB -.set USBFS_1_USB__ARB_RW7_WA, CYREG_USB_ARB_RW7_WA -.set USBFS_1_USB__ARB_RW7_WA_MSB, CYREG_USB_ARB_RW7_WA_MSB -.set USBFS_1_USB__ARB_RW8_DR, CYREG_USB_ARB_RW8_DR -.set USBFS_1_USB__ARB_RW8_RA, CYREG_USB_ARB_RW8_RA -.set USBFS_1_USB__ARB_RW8_RA_MSB, CYREG_USB_ARB_RW8_RA_MSB -.set USBFS_1_USB__ARB_RW8_WA, CYREG_USB_ARB_RW8_WA -.set USBFS_1_USB__ARB_RW8_WA_MSB, CYREG_USB_ARB_RW8_WA_MSB -.set USBFS_1_USB__BUF_SIZE, CYREG_USB_BUF_SIZE -.set USBFS_1_USB__BUS_RST_CNT, CYREG_USB_BUS_RST_CNT -.set USBFS_1_USB__CR0, CYREG_USB_CR0 -.set USBFS_1_USB__CR1, CYREG_USB_CR1 -.set USBFS_1_USB__CWA, CYREG_USB_CWA -.set USBFS_1_USB__CWA_MSB, CYREG_USB_CWA_MSB -.set USBFS_1_USB__DMA_THRES, CYREG_USB_DMA_THRES -.set USBFS_1_USB__DMA_THRES_MSB, CYREG_USB_DMA_THRES_MSB -.set USBFS_1_USB__DYN_RECONFIG, CYREG_USB_DYN_RECONFIG -.set USBFS_1_USB__EP0_CNT, CYREG_USB_EP0_CNT -.set USBFS_1_USB__EP0_CR, CYREG_USB_EP0_CR -.set USBFS_1_USB__EP0_DR0, CYREG_USB_EP0_DR0 -.set USBFS_1_USB__EP0_DR1, CYREG_USB_EP0_DR1 -.set USBFS_1_USB__EP0_DR2, CYREG_USB_EP0_DR2 -.set USBFS_1_USB__EP0_DR3, CYREG_USB_EP0_DR3 -.set USBFS_1_USB__EP0_DR4, CYREG_USB_EP0_DR4 -.set USBFS_1_USB__EP0_DR5, CYREG_USB_EP0_DR5 -.set USBFS_1_USB__EP0_DR6, CYREG_USB_EP0_DR6 -.set USBFS_1_USB__EP0_DR7, CYREG_USB_EP0_DR7 -.set USBFS_1_USB__EP_ACTIVE, CYREG_USB_EP_ACTIVE -.set USBFS_1_USB__EP_TYPE, CYREG_USB_EP_TYPE -.set USBFS_1_USB__MEM_DATA, CYREG_USB_MEM_DATA_MBASE -.set USBFS_1_USB__PM_ACT_CFG, CYREG_PM_ACT_CFG5 -.set USBFS_1_USB__PM_ACT_MSK, 0x01 -.set USBFS_1_USB__PM_STBY_CFG, CYREG_PM_STBY_CFG5 -.set USBFS_1_USB__PM_STBY_MSK, 0x01 -.set USBFS_1_USB__SIE_EP1_CNT0, CYREG_USB_SIE_EP1_CNT0 -.set USBFS_1_USB__SIE_EP1_CNT1, CYREG_USB_SIE_EP1_CNT1 -.set USBFS_1_USB__SIE_EP1_CR0, CYREG_USB_SIE_EP1_CR0 -.set USBFS_1_USB__SIE_EP2_CNT0, CYREG_USB_SIE_EP2_CNT0 -.set USBFS_1_USB__SIE_EP2_CNT1, CYREG_USB_SIE_EP2_CNT1 -.set USBFS_1_USB__SIE_EP2_CR0, CYREG_USB_SIE_EP2_CR0 -.set USBFS_1_USB__SIE_EP3_CNT0, CYREG_USB_SIE_EP3_CNT0 -.set USBFS_1_USB__SIE_EP3_CNT1, CYREG_USB_SIE_EP3_CNT1 -.set USBFS_1_USB__SIE_EP3_CR0, CYREG_USB_SIE_EP3_CR0 -.set USBFS_1_USB__SIE_EP4_CNT0, CYREG_USB_SIE_EP4_CNT0 -.set USBFS_1_USB__SIE_EP4_CNT1, CYREG_USB_SIE_EP4_CNT1 -.set USBFS_1_USB__SIE_EP4_CR0, CYREG_USB_SIE_EP4_CR0 -.set USBFS_1_USB__SIE_EP5_CNT0, CYREG_USB_SIE_EP5_CNT0 -.set USBFS_1_USB__SIE_EP5_CNT1, CYREG_USB_SIE_EP5_CNT1 -.set USBFS_1_USB__SIE_EP5_CR0, CYREG_USB_SIE_EP5_CR0 -.set USBFS_1_USB__SIE_EP6_CNT0, CYREG_USB_SIE_EP6_CNT0 -.set USBFS_1_USB__SIE_EP6_CNT1, CYREG_USB_SIE_EP6_CNT1 -.set USBFS_1_USB__SIE_EP6_CR0, CYREG_USB_SIE_EP6_CR0 -.set USBFS_1_USB__SIE_EP7_CNT0, CYREG_USB_SIE_EP7_CNT0 -.set USBFS_1_USB__SIE_EP7_CNT1, CYREG_USB_SIE_EP7_CNT1 -.set USBFS_1_USB__SIE_EP7_CR0, CYREG_USB_SIE_EP7_CR0 -.set USBFS_1_USB__SIE_EP8_CNT0, CYREG_USB_SIE_EP8_CNT0 -.set USBFS_1_USB__SIE_EP8_CNT1, CYREG_USB_SIE_EP8_CNT1 -.set USBFS_1_USB__SIE_EP8_CR0, CYREG_USB_SIE_EP8_CR0 -.set USBFS_1_USB__SIE_EP_INT_EN, CYREG_USB_SIE_EP_INT_EN -.set USBFS_1_USB__SIE_EP_INT_SR, CYREG_USB_SIE_EP_INT_SR -.set USBFS_1_USB__SOF0, CYREG_USB_SOF0 -.set USBFS_1_USB__SOF1, CYREG_USB_SOF1 -.set USBFS_1_USB__USBIO_CR0, CYREG_USB_USBIO_CR0 -.set USBFS_1_USB__USBIO_CR1, CYREG_USB_USBIO_CR1 -.set USBFS_1_USB__USB_CLK_EN, CYREG_USB_USB_CLK_EN - /* scsiTarget */ .set scsiTarget_StatusReg__0__MASK, 0x01 .set scsiTarget_StatusReg__0__POS, 0 @@ -1277,71 +1131,161 @@ .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 -/* USBFS_1_Dm */ -.set USBFS_1_Dm__0__MASK, 0x80 -.set USBFS_1_Dm__0__PC, CYREG_IO_PC_PRT15_7_6_PC1 -.set USBFS_1_Dm__0__PORT, 15 -.set USBFS_1_Dm__0__SHIFT, 7 -.set USBFS_1_Dm__AG, CYREG_PRT15_AG -.set USBFS_1_Dm__AMUX, CYREG_PRT15_AMUX -.set USBFS_1_Dm__BIE, CYREG_PRT15_BIE -.set USBFS_1_Dm__BIT_MASK, CYREG_PRT15_BIT_MASK -.set USBFS_1_Dm__BYP, CYREG_PRT15_BYP -.set USBFS_1_Dm__CTL, CYREG_PRT15_CTL -.set USBFS_1_Dm__DM0, CYREG_PRT15_DM0 -.set USBFS_1_Dm__DM1, CYREG_PRT15_DM1 -.set USBFS_1_Dm__DM2, CYREG_PRT15_DM2 -.set USBFS_1_Dm__DR, CYREG_PRT15_DR -.set USBFS_1_Dm__INP_DIS, CYREG_PRT15_INP_DIS -.set USBFS_1_Dm__LCD_COM_SEG, CYREG_PRT15_LCD_COM_SEG -.set USBFS_1_Dm__LCD_EN, CYREG_PRT15_LCD_EN -.set USBFS_1_Dm__MASK, 0x80 -.set USBFS_1_Dm__PORT, 15 -.set USBFS_1_Dm__PRT, CYREG_PRT15_PRT -.set USBFS_1_Dm__PRTDSI__CAPS_SEL, CYREG_PRT15_CAPS_SEL -.set USBFS_1_Dm__PRTDSI__DBL_SYNC_IN, CYREG_PRT15_DBL_SYNC_IN -.set USBFS_1_Dm__PRTDSI__OE_SEL0, CYREG_PRT15_OE_SEL0 -.set USBFS_1_Dm__PRTDSI__OE_SEL1, CYREG_PRT15_OE_SEL1 -.set USBFS_1_Dm__PRTDSI__OUT_SEL0, CYREG_PRT15_OUT_SEL0 -.set USBFS_1_Dm__PRTDSI__OUT_SEL1, CYREG_PRT15_OUT_SEL1 -.set USBFS_1_Dm__PRTDSI__SYNC_OUT, CYREG_PRT15_SYNC_OUT -.set USBFS_1_Dm__PS, CYREG_PRT15_PS -.set USBFS_1_Dm__SHIFT, 7 -.set USBFS_1_Dm__SLW, CYREG_PRT15_SLW +/* USBFS_ep_0 */ +.set USBFS_ep_0__INTC_CLR_EN_REG, CYREG_NVIC_CLRENA0 +.set USBFS_ep_0__INTC_CLR_PD_REG, CYREG_NVIC_CLRPEND0 +.set USBFS_ep_0__INTC_MASK, 0x1000000 +.set USBFS_ep_0__INTC_NUMBER, 24 +.set USBFS_ep_0__INTC_PRIOR_NUM, 7 +.set USBFS_ep_0__INTC_PRIOR_REG, CYREG_NVIC_PRI_24 +.set USBFS_ep_0__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_ep_0__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 + +/* 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_PRIOR_NUM, 7 +.set USBFS_ep_1__INTC_PRIOR_REG, CYREG_NVIC_PRI_0 +.set USBFS_ep_1__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_ep_1__INTC_SET_PD_REG, CYREG_NVIC_SETPEND0 -/* USBFS_1_Dp */ -.set USBFS_1_Dp__0__MASK, 0x40 -.set USBFS_1_Dp__0__PC, CYREG_IO_PC_PRT15_7_6_PC0 -.set USBFS_1_Dp__0__PORT, 15 -.set USBFS_1_Dp__0__SHIFT, 6 -.set USBFS_1_Dp__AG, CYREG_PRT15_AG -.set USBFS_1_Dp__AMUX, CYREG_PRT15_AMUX -.set USBFS_1_Dp__BIE, CYREG_PRT15_BIE -.set USBFS_1_Dp__BIT_MASK, CYREG_PRT15_BIT_MASK -.set USBFS_1_Dp__BYP, CYREG_PRT15_BYP -.set USBFS_1_Dp__CTL, CYREG_PRT15_CTL -.set USBFS_1_Dp__DM0, CYREG_PRT15_DM0 -.set USBFS_1_Dp__DM1, CYREG_PRT15_DM1 -.set USBFS_1_Dp__DM2, CYREG_PRT15_DM2 -.set USBFS_1_Dp__DR, CYREG_PRT15_DR -.set USBFS_1_Dp__INP_DIS, CYREG_PRT15_INP_DIS -.set USBFS_1_Dp__INTSTAT, CYREG_PICU15_INTSTAT -.set USBFS_1_Dp__LCD_COM_SEG, CYREG_PRT15_LCD_COM_SEG -.set USBFS_1_Dp__LCD_EN, CYREG_PRT15_LCD_EN -.set USBFS_1_Dp__MASK, 0x40 -.set USBFS_1_Dp__PORT, 15 -.set USBFS_1_Dp__PRT, CYREG_PRT15_PRT -.set USBFS_1_Dp__PRTDSI__CAPS_SEL, CYREG_PRT15_CAPS_SEL -.set USBFS_1_Dp__PRTDSI__DBL_SYNC_IN, CYREG_PRT15_DBL_SYNC_IN -.set USBFS_1_Dp__PRTDSI__OE_SEL0, CYREG_PRT15_OE_SEL0 -.set USBFS_1_Dp__PRTDSI__OE_SEL1, CYREG_PRT15_OE_SEL1 -.set USBFS_1_Dp__PRTDSI__OUT_SEL0, CYREG_PRT15_OUT_SEL0 -.set USBFS_1_Dp__PRTDSI__OUT_SEL1, CYREG_PRT15_OUT_SEL1 -.set USBFS_1_Dp__PRTDSI__SYNC_OUT, CYREG_PRT15_SYNC_OUT -.set USBFS_1_Dp__PS, CYREG_PRT15_PS -.set USBFS_1_Dp__SHIFT, 6 -.set USBFS_1_Dp__SLW, CYREG_PRT15_SLW -.set USBFS_1_Dp__SNAP, CYREG_PICU_15_SNAP_15 +/* 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_PRIOR_NUM, 7 +.set USBFS_ep_2__INTC_PRIOR_REG, CYREG_NVIC_PRI_1 +.set USBFS_ep_2__INTC_SET_EN_REG, CYREG_NVIC_SETENA0 +.set USBFS_ep_2__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 +.set USBFS_USB__ARB_EP1_INT_EN, CYREG_USB_ARB_EP1_INT_EN +.set USBFS_USB__ARB_EP1_SR, CYREG_USB_ARB_EP1_SR +.set USBFS_USB__ARB_EP2_CFG, CYREG_USB_ARB_EP2_CFG +.set USBFS_USB__ARB_EP2_INT_EN, CYREG_USB_ARB_EP2_INT_EN +.set USBFS_USB__ARB_EP2_SR, CYREG_USB_ARB_EP2_SR +.set USBFS_USB__ARB_EP3_CFG, CYREG_USB_ARB_EP3_CFG +.set USBFS_USB__ARB_EP3_INT_EN, CYREG_USB_ARB_EP3_INT_EN +.set USBFS_USB__ARB_EP3_SR, CYREG_USB_ARB_EP3_SR +.set USBFS_USB__ARB_EP4_CFG, CYREG_USB_ARB_EP4_CFG +.set USBFS_USB__ARB_EP4_INT_EN, CYREG_USB_ARB_EP4_INT_EN +.set USBFS_USB__ARB_EP4_SR, CYREG_USB_ARB_EP4_SR +.set USBFS_USB__ARB_EP5_CFG, CYREG_USB_ARB_EP5_CFG +.set USBFS_USB__ARB_EP5_INT_EN, CYREG_USB_ARB_EP5_INT_EN +.set USBFS_USB__ARB_EP5_SR, CYREG_USB_ARB_EP5_SR +.set USBFS_USB__ARB_EP6_CFG, CYREG_USB_ARB_EP6_CFG +.set USBFS_USB__ARB_EP6_INT_EN, CYREG_USB_ARB_EP6_INT_EN +.set USBFS_USB__ARB_EP6_SR, CYREG_USB_ARB_EP6_SR +.set USBFS_USB__ARB_EP7_CFG, CYREG_USB_ARB_EP7_CFG +.set USBFS_USB__ARB_EP7_INT_EN, CYREG_USB_ARB_EP7_INT_EN +.set USBFS_USB__ARB_EP7_SR, CYREG_USB_ARB_EP7_SR +.set USBFS_USB__ARB_EP8_CFG, CYREG_USB_ARB_EP8_CFG +.set USBFS_USB__ARB_EP8_INT_EN, CYREG_USB_ARB_EP8_INT_EN +.set USBFS_USB__ARB_EP8_SR, CYREG_USB_ARB_EP8_SR +.set USBFS_USB__ARB_INT_EN, CYREG_USB_ARB_INT_EN +.set USBFS_USB__ARB_INT_SR, CYREG_USB_ARB_INT_SR +.set USBFS_USB__ARB_RW1_DR, CYREG_USB_ARB_RW1_DR +.set USBFS_USB__ARB_RW1_RA, CYREG_USB_ARB_RW1_RA +.set USBFS_USB__ARB_RW1_RA_MSB, CYREG_USB_ARB_RW1_RA_MSB +.set USBFS_USB__ARB_RW1_WA, CYREG_USB_ARB_RW1_WA +.set USBFS_USB__ARB_RW1_WA_MSB, CYREG_USB_ARB_RW1_WA_MSB +.set USBFS_USB__ARB_RW2_DR, CYREG_USB_ARB_RW2_DR +.set USBFS_USB__ARB_RW2_RA, CYREG_USB_ARB_RW2_RA +.set USBFS_USB__ARB_RW2_RA_MSB, CYREG_USB_ARB_RW2_RA_MSB +.set USBFS_USB__ARB_RW2_WA, CYREG_USB_ARB_RW2_WA +.set USBFS_USB__ARB_RW2_WA_MSB, CYREG_USB_ARB_RW2_WA_MSB +.set USBFS_USB__ARB_RW3_DR, CYREG_USB_ARB_RW3_DR +.set USBFS_USB__ARB_RW3_RA, CYREG_USB_ARB_RW3_RA +.set USBFS_USB__ARB_RW3_RA_MSB, CYREG_USB_ARB_RW3_RA_MSB +.set USBFS_USB__ARB_RW3_WA, CYREG_USB_ARB_RW3_WA +.set USBFS_USB__ARB_RW3_WA_MSB, CYREG_USB_ARB_RW3_WA_MSB +.set USBFS_USB__ARB_RW4_DR, CYREG_USB_ARB_RW4_DR +.set USBFS_USB__ARB_RW4_RA, CYREG_USB_ARB_RW4_RA +.set USBFS_USB__ARB_RW4_RA_MSB, CYREG_USB_ARB_RW4_RA_MSB +.set USBFS_USB__ARB_RW4_WA, CYREG_USB_ARB_RW4_WA +.set USBFS_USB__ARB_RW4_WA_MSB, CYREG_USB_ARB_RW4_WA_MSB +.set USBFS_USB__ARB_RW5_DR, CYREG_USB_ARB_RW5_DR +.set USBFS_USB__ARB_RW5_RA, CYREG_USB_ARB_RW5_RA +.set USBFS_USB__ARB_RW5_RA_MSB, CYREG_USB_ARB_RW5_RA_MSB +.set USBFS_USB__ARB_RW5_WA, CYREG_USB_ARB_RW5_WA +.set USBFS_USB__ARB_RW5_WA_MSB, CYREG_USB_ARB_RW5_WA_MSB +.set USBFS_USB__ARB_RW6_DR, CYREG_USB_ARB_RW6_DR +.set USBFS_USB__ARB_RW6_RA, CYREG_USB_ARB_RW6_RA +.set USBFS_USB__ARB_RW6_RA_MSB, CYREG_USB_ARB_RW6_RA_MSB +.set USBFS_USB__ARB_RW6_WA, CYREG_USB_ARB_RW6_WA +.set USBFS_USB__ARB_RW6_WA_MSB, CYREG_USB_ARB_RW6_WA_MSB +.set USBFS_USB__ARB_RW7_DR, CYREG_USB_ARB_RW7_DR +.set USBFS_USB__ARB_RW7_RA, CYREG_USB_ARB_RW7_RA +.set USBFS_USB__ARB_RW7_RA_MSB, CYREG_USB_ARB_RW7_RA_MSB +.set USBFS_USB__ARB_RW7_WA, CYREG_USB_ARB_RW7_WA +.set USBFS_USB__ARB_RW7_WA_MSB, CYREG_USB_ARB_RW7_WA_MSB +.set USBFS_USB__ARB_RW8_DR, CYREG_USB_ARB_RW8_DR +.set USBFS_USB__ARB_RW8_RA, CYREG_USB_ARB_RW8_RA +.set USBFS_USB__ARB_RW8_RA_MSB, CYREG_USB_ARB_RW8_RA_MSB +.set USBFS_USB__ARB_RW8_WA, CYREG_USB_ARB_RW8_WA +.set USBFS_USB__ARB_RW8_WA_MSB, CYREG_USB_ARB_RW8_WA_MSB +.set USBFS_USB__BUF_SIZE, CYREG_USB_BUF_SIZE +.set USBFS_USB__BUS_RST_CNT, CYREG_USB_BUS_RST_CNT +.set USBFS_USB__CR0, CYREG_USB_CR0 +.set USBFS_USB__CR1, CYREG_USB_CR1 +.set USBFS_USB__CWA, CYREG_USB_CWA +.set USBFS_USB__CWA_MSB, CYREG_USB_CWA_MSB +.set USBFS_USB__DMA_THRES, CYREG_USB_DMA_THRES +.set USBFS_USB__DMA_THRES_MSB, CYREG_USB_DMA_THRES_MSB +.set USBFS_USB__DYN_RECONFIG, CYREG_USB_DYN_RECONFIG +.set USBFS_USB__EP0_CNT, CYREG_USB_EP0_CNT +.set USBFS_USB__EP0_CR, CYREG_USB_EP0_CR +.set USBFS_USB__EP0_DR0, CYREG_USB_EP0_DR0 +.set USBFS_USB__EP0_DR1, CYREG_USB_EP0_DR1 +.set USBFS_USB__EP0_DR2, CYREG_USB_EP0_DR2 +.set USBFS_USB__EP0_DR3, CYREG_USB_EP0_DR3 +.set USBFS_USB__EP0_DR4, CYREG_USB_EP0_DR4 +.set USBFS_USB__EP0_DR5, CYREG_USB_EP0_DR5 +.set USBFS_USB__EP0_DR6, CYREG_USB_EP0_DR6 +.set USBFS_USB__EP0_DR7, CYREG_USB_EP0_DR7 +.set USBFS_USB__EP_ACTIVE, CYREG_USB_EP_ACTIVE +.set USBFS_USB__EP_TYPE, CYREG_USB_EP_TYPE +.set USBFS_USB__MEM_DATA, CYREG_USB_MEM_DATA_MBASE +.set USBFS_USB__PM_ACT_CFG, CYREG_PM_ACT_CFG5 +.set USBFS_USB__PM_ACT_MSK, 0x01 +.set USBFS_USB__PM_STBY_CFG, CYREG_PM_STBY_CFG5 +.set USBFS_USB__PM_STBY_MSK, 0x01 +.set USBFS_USB__SIE_EP1_CNT0, CYREG_USB_SIE_EP1_CNT0 +.set USBFS_USB__SIE_EP1_CNT1, CYREG_USB_SIE_EP1_CNT1 +.set USBFS_USB__SIE_EP1_CR0, CYREG_USB_SIE_EP1_CR0 +.set USBFS_USB__SIE_EP2_CNT0, CYREG_USB_SIE_EP2_CNT0 +.set USBFS_USB__SIE_EP2_CNT1, CYREG_USB_SIE_EP2_CNT1 +.set USBFS_USB__SIE_EP2_CR0, CYREG_USB_SIE_EP2_CR0 +.set USBFS_USB__SIE_EP3_CNT0, CYREG_USB_SIE_EP3_CNT0 +.set USBFS_USB__SIE_EP3_CNT1, CYREG_USB_SIE_EP3_CNT1 +.set USBFS_USB__SIE_EP3_CR0, CYREG_USB_SIE_EP3_CR0 +.set USBFS_USB__SIE_EP4_CNT0, CYREG_USB_SIE_EP4_CNT0 +.set USBFS_USB__SIE_EP4_CNT1, CYREG_USB_SIE_EP4_CNT1 +.set USBFS_USB__SIE_EP4_CR0, CYREG_USB_SIE_EP4_CR0 +.set USBFS_USB__SIE_EP5_CNT0, CYREG_USB_SIE_EP5_CNT0 +.set USBFS_USB__SIE_EP5_CNT1, CYREG_USB_SIE_EP5_CNT1 +.set USBFS_USB__SIE_EP5_CR0, CYREG_USB_SIE_EP5_CR0 +.set USBFS_USB__SIE_EP6_CNT0, CYREG_USB_SIE_EP6_CNT0 +.set USBFS_USB__SIE_EP6_CNT1, CYREG_USB_SIE_EP6_CNT1 +.set USBFS_USB__SIE_EP6_CR0, CYREG_USB_SIE_EP6_CR0 +.set USBFS_USB__SIE_EP7_CNT0, CYREG_USB_SIE_EP7_CNT0 +.set USBFS_USB__SIE_EP7_CNT1, CYREG_USB_SIE_EP7_CNT1 +.set USBFS_USB__SIE_EP7_CR0, CYREG_USB_SIE_EP7_CR0 +.set USBFS_USB__SIE_EP8_CNT0, CYREG_USB_SIE_EP8_CNT0 +.set USBFS_USB__SIE_EP8_CNT1, CYREG_USB_SIE_EP8_CNT1 +.set USBFS_USB__SIE_EP8_CR0, CYREG_USB_SIE_EP8_CR0 +.set USBFS_USB__SIE_EP_INT_EN, CYREG_USB_SIE_EP_INT_EN +.set USBFS_USB__SIE_EP_INT_SR, CYREG_USB_SIE_EP_INT_SR +.set USBFS_USB__SOF0, CYREG_USB_SOF0 +.set USBFS_USB__SOF1, CYREG_USB_SOF1 +.set USBFS_USB__USBIO_CR0, CYREG_USB_USBIO_CR0 +.set USBFS_USB__USBIO_CR1, CYREG_USB_USBIO_CR1 +.set USBFS_USB__USB_CLK_EN, CYREG_USB_USB_CLK_EN /* SCSI_ATN */ .set SCSI_ATN__0__MASK, 0x20 @@ -1960,6 +1904,72 @@ .set SCSI_RST__SLW, CYREG_PRT6_SLW .set SCSI_RST__SNAP, CYREG_PICU6_SNAP +/* USBFS_Dm */ +.set USBFS_Dm__0__MASK, 0x80 +.set USBFS_Dm__0__PC, CYREG_IO_PC_PRT15_7_6_PC1 +.set USBFS_Dm__0__PORT, 15 +.set USBFS_Dm__0__SHIFT, 7 +.set USBFS_Dm__AG, CYREG_PRT15_AG +.set USBFS_Dm__AMUX, CYREG_PRT15_AMUX +.set USBFS_Dm__BIE, CYREG_PRT15_BIE +.set USBFS_Dm__BIT_MASK, CYREG_PRT15_BIT_MASK +.set USBFS_Dm__BYP, CYREG_PRT15_BYP +.set USBFS_Dm__CTL, CYREG_PRT15_CTL +.set USBFS_Dm__DM0, CYREG_PRT15_DM0 +.set USBFS_Dm__DM1, CYREG_PRT15_DM1 +.set USBFS_Dm__DM2, CYREG_PRT15_DM2 +.set USBFS_Dm__DR, CYREG_PRT15_DR +.set USBFS_Dm__INP_DIS, CYREG_PRT15_INP_DIS +.set USBFS_Dm__LCD_COM_SEG, CYREG_PRT15_LCD_COM_SEG +.set USBFS_Dm__LCD_EN, CYREG_PRT15_LCD_EN +.set USBFS_Dm__MASK, 0x80 +.set USBFS_Dm__PORT, 15 +.set USBFS_Dm__PRT, CYREG_PRT15_PRT +.set USBFS_Dm__PRTDSI__CAPS_SEL, CYREG_PRT15_CAPS_SEL +.set USBFS_Dm__PRTDSI__DBL_SYNC_IN, CYREG_PRT15_DBL_SYNC_IN +.set USBFS_Dm__PRTDSI__OE_SEL0, CYREG_PRT15_OE_SEL0 +.set USBFS_Dm__PRTDSI__OE_SEL1, CYREG_PRT15_OE_SEL1 +.set USBFS_Dm__PRTDSI__OUT_SEL0, CYREG_PRT15_OUT_SEL0 +.set USBFS_Dm__PRTDSI__OUT_SEL1, CYREG_PRT15_OUT_SEL1 +.set USBFS_Dm__PRTDSI__SYNC_OUT, CYREG_PRT15_SYNC_OUT +.set USBFS_Dm__PS, CYREG_PRT15_PS +.set USBFS_Dm__SHIFT, 7 +.set USBFS_Dm__SLW, CYREG_PRT15_SLW + +/* USBFS_Dp */ +.set USBFS_Dp__0__MASK, 0x40 +.set USBFS_Dp__0__PC, CYREG_IO_PC_PRT15_7_6_PC0 +.set USBFS_Dp__0__PORT, 15 +.set USBFS_Dp__0__SHIFT, 6 +.set USBFS_Dp__AG, CYREG_PRT15_AG +.set USBFS_Dp__AMUX, CYREG_PRT15_AMUX +.set USBFS_Dp__BIE, CYREG_PRT15_BIE +.set USBFS_Dp__BIT_MASK, CYREG_PRT15_BIT_MASK +.set USBFS_Dp__BYP, CYREG_PRT15_BYP +.set USBFS_Dp__CTL, CYREG_PRT15_CTL +.set USBFS_Dp__DM0, CYREG_PRT15_DM0 +.set USBFS_Dp__DM1, CYREG_PRT15_DM1 +.set USBFS_Dp__DM2, CYREG_PRT15_DM2 +.set USBFS_Dp__DR, CYREG_PRT15_DR +.set USBFS_Dp__INP_DIS, CYREG_PRT15_INP_DIS +.set USBFS_Dp__INTSTAT, CYREG_PICU15_INTSTAT +.set USBFS_Dp__LCD_COM_SEG, CYREG_PRT15_LCD_COM_SEG +.set USBFS_Dp__LCD_EN, CYREG_PRT15_LCD_EN +.set USBFS_Dp__MASK, 0x40 +.set USBFS_Dp__PORT, 15 +.set USBFS_Dp__PRT, CYREG_PRT15_PRT +.set USBFS_Dp__PRTDSI__CAPS_SEL, CYREG_PRT15_CAPS_SEL +.set USBFS_Dp__PRTDSI__DBL_SYNC_IN, CYREG_PRT15_DBL_SYNC_IN +.set USBFS_Dp__PRTDSI__OE_SEL0, CYREG_PRT15_OE_SEL0 +.set USBFS_Dp__PRTDSI__OE_SEL1, CYREG_PRT15_OE_SEL1 +.set USBFS_Dp__PRTDSI__OUT_SEL0, CYREG_PRT15_OUT_SEL0 +.set USBFS_Dp__PRTDSI__OUT_SEL1, CYREG_PRT15_OUT_SEL1 +.set USBFS_Dp__PRTDSI__SYNC_OUT, CYREG_PRT15_SYNC_OUT +.set USBFS_Dp__PS, CYREG_PRT15_PS +.set USBFS_Dp__SHIFT, 6 +.set USBFS_Dp__SLW, CYREG_PRT15_SLW +.set USBFS_Dp__SNAP, CYREG_PICU_15_SNAP_15 + /* SCSI_In */ .set SCSI_In__0__AG, CYREG_PRT2_AG .set SCSI_In__0__AMUX, CYREG_PRT2_AMUX diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc index 7f43e859..e4afa13d 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitteriar.inc @@ -3,45 +3,35 @@ INCLUDE cydeviceiar.inc INCLUDE cydeviceiar_trm.inc -/* USBFS_1_bus_reset */ -USBFS_1_bus_reset__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_bus_reset__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_bus_reset__INTC_MASK EQU 0x800000 -USBFS_1_bus_reset__INTC_NUMBER EQU 23 -USBFS_1_bus_reset__INTC_PRIOR_NUM EQU 7 -USBFS_1_bus_reset__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_23 -USBFS_1_bus_reset__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_bus_reset__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +/* 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 +USBFS_bus_reset__INTC_MASK EQU 0x800000 +USBFS_bus_reset__INTC_NUMBER EQU 23 +USBFS_bus_reset__INTC_PRIOR_NUM EQU 7 +USBFS_bus_reset__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_23 +USBFS_bus_reset__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_bus_reset__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 -/* USBFS_1_arb_int */ -USBFS_1_arb_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_arb_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_arb_int__INTC_MASK EQU 0x400000 -USBFS_1_arb_int__INTC_NUMBER EQU 22 -USBFS_1_arb_int__INTC_PRIOR_NUM EQU 7 -USBFS_1_arb_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_22 -USBFS_1_arb_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_arb_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +/* USBFS_arb_int */ +USBFS_arb_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_arb_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_arb_int__INTC_MASK EQU 0x400000 +USBFS_arb_int__INTC_NUMBER EQU 22 +USBFS_arb_int__INTC_PRIOR_NUM EQU 7 +USBFS_arb_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_22 +USBFS_arb_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_arb_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 -/* USBFS_1_sof_int */ -USBFS_1_sof_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_sof_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_sof_int__INTC_MASK EQU 0x200000 -USBFS_1_sof_int__INTC_NUMBER EQU 21 -USBFS_1_sof_int__INTC_PRIOR_NUM EQU 7 -USBFS_1_sof_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_21 -USBFS_1_sof_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_sof_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 - -/* USBFS_1_dp_int */ -USBFS_1_dp_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_dp_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_dp_int__INTC_MASK EQU 0x1000 -USBFS_1_dp_int__INTC_NUMBER EQU 12 -USBFS_1_dp_int__INTC_PRIOR_NUM EQU 7 -USBFS_1_dp_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_12 -USBFS_1_dp_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_dp_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +/* USBFS_sof_int */ +USBFS_sof_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_sof_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_sof_int__INTC_MASK EQU 0x200000 +USBFS_sof_int__INTC_NUMBER EQU 21 +USBFS_sof_int__INTC_PRIOR_NUM EQU 7 +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_ATN_ISR */ SCSI_ATN_ISR__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -572,25 +562,15 @@ 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 -/* USBFS_1_ep_0 */ -USBFS_1_ep_0__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_ep_0__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_ep_0__INTC_MASK EQU 0x1000000 -USBFS_1_ep_0__INTC_NUMBER EQU 24 -USBFS_1_ep_0__INTC_PRIOR_NUM EQU 7 -USBFS_1_ep_0__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_24 -USBFS_1_ep_0__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_ep_0__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 - -/* USBFS_1_ep_1 */ -USBFS_1_ep_1__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_ep_1__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_ep_1__INTC_MASK EQU 0x01 -USBFS_1_ep_1__INTC_NUMBER EQU 0 -USBFS_1_ep_1__INTC_PRIOR_NUM EQU 7 -USBFS_1_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 -USBFS_1_ep_1__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_ep_1__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +/* USBFS_dp_int */ +USBFS_dp_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_dp_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_dp_int__INTC_MASK EQU 0x1000 +USBFS_dp_int__INTC_NUMBER EQU 12 +USBFS_dp_int__INTC_PRIOR_NUM EQU 7 +USBFS_dp_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_12 +USBFS_dp_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_dp_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 /* SCSI_CTL_IO */ SCSI_CTL_IO_Sync_ctrl_reg__0__MASK EQU 0x01 @@ -1068,132 +1048,6 @@ SD_Init_Clk__PM_ACT_MSK EQU 0x02 SD_Init_Clk__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 SD_Init_Clk__PM_STBY_MSK EQU 0x02 -/* USBFS_1_USB */ -USBFS_1_USB__ARB_CFG EQU CYREG_USB_ARB_CFG -USBFS_1_USB__ARB_EP1_CFG EQU CYREG_USB_ARB_EP1_CFG -USBFS_1_USB__ARB_EP1_INT_EN EQU CYREG_USB_ARB_EP1_INT_EN -USBFS_1_USB__ARB_EP1_SR EQU CYREG_USB_ARB_EP1_SR -USBFS_1_USB__ARB_EP2_CFG EQU CYREG_USB_ARB_EP2_CFG -USBFS_1_USB__ARB_EP2_INT_EN EQU CYREG_USB_ARB_EP2_INT_EN -USBFS_1_USB__ARB_EP2_SR EQU CYREG_USB_ARB_EP2_SR -USBFS_1_USB__ARB_EP3_CFG EQU CYREG_USB_ARB_EP3_CFG -USBFS_1_USB__ARB_EP3_INT_EN EQU CYREG_USB_ARB_EP3_INT_EN -USBFS_1_USB__ARB_EP3_SR EQU CYREG_USB_ARB_EP3_SR -USBFS_1_USB__ARB_EP4_CFG EQU CYREG_USB_ARB_EP4_CFG -USBFS_1_USB__ARB_EP4_INT_EN EQU CYREG_USB_ARB_EP4_INT_EN -USBFS_1_USB__ARB_EP4_SR EQU CYREG_USB_ARB_EP4_SR -USBFS_1_USB__ARB_EP5_CFG EQU CYREG_USB_ARB_EP5_CFG -USBFS_1_USB__ARB_EP5_INT_EN EQU CYREG_USB_ARB_EP5_INT_EN -USBFS_1_USB__ARB_EP5_SR EQU CYREG_USB_ARB_EP5_SR -USBFS_1_USB__ARB_EP6_CFG EQU CYREG_USB_ARB_EP6_CFG -USBFS_1_USB__ARB_EP6_INT_EN EQU CYREG_USB_ARB_EP6_INT_EN -USBFS_1_USB__ARB_EP6_SR EQU CYREG_USB_ARB_EP6_SR -USBFS_1_USB__ARB_EP7_CFG EQU CYREG_USB_ARB_EP7_CFG -USBFS_1_USB__ARB_EP7_INT_EN EQU CYREG_USB_ARB_EP7_INT_EN -USBFS_1_USB__ARB_EP7_SR EQU CYREG_USB_ARB_EP7_SR -USBFS_1_USB__ARB_EP8_CFG EQU CYREG_USB_ARB_EP8_CFG -USBFS_1_USB__ARB_EP8_INT_EN EQU CYREG_USB_ARB_EP8_INT_EN -USBFS_1_USB__ARB_EP8_SR EQU CYREG_USB_ARB_EP8_SR -USBFS_1_USB__ARB_INT_EN EQU CYREG_USB_ARB_INT_EN -USBFS_1_USB__ARB_INT_SR EQU CYREG_USB_ARB_INT_SR -USBFS_1_USB__ARB_RW1_DR EQU CYREG_USB_ARB_RW1_DR -USBFS_1_USB__ARB_RW1_RA EQU CYREG_USB_ARB_RW1_RA -USBFS_1_USB__ARB_RW1_RA_MSB EQU CYREG_USB_ARB_RW1_RA_MSB -USBFS_1_USB__ARB_RW1_WA EQU CYREG_USB_ARB_RW1_WA -USBFS_1_USB__ARB_RW1_WA_MSB EQU CYREG_USB_ARB_RW1_WA_MSB -USBFS_1_USB__ARB_RW2_DR EQU CYREG_USB_ARB_RW2_DR -USBFS_1_USB__ARB_RW2_RA EQU CYREG_USB_ARB_RW2_RA -USBFS_1_USB__ARB_RW2_RA_MSB EQU CYREG_USB_ARB_RW2_RA_MSB -USBFS_1_USB__ARB_RW2_WA EQU CYREG_USB_ARB_RW2_WA -USBFS_1_USB__ARB_RW2_WA_MSB EQU CYREG_USB_ARB_RW2_WA_MSB -USBFS_1_USB__ARB_RW3_DR EQU CYREG_USB_ARB_RW3_DR -USBFS_1_USB__ARB_RW3_RA EQU CYREG_USB_ARB_RW3_RA -USBFS_1_USB__ARB_RW3_RA_MSB EQU CYREG_USB_ARB_RW3_RA_MSB -USBFS_1_USB__ARB_RW3_WA EQU CYREG_USB_ARB_RW3_WA -USBFS_1_USB__ARB_RW3_WA_MSB EQU CYREG_USB_ARB_RW3_WA_MSB -USBFS_1_USB__ARB_RW4_DR EQU CYREG_USB_ARB_RW4_DR -USBFS_1_USB__ARB_RW4_RA EQU CYREG_USB_ARB_RW4_RA -USBFS_1_USB__ARB_RW4_RA_MSB EQU CYREG_USB_ARB_RW4_RA_MSB -USBFS_1_USB__ARB_RW4_WA EQU CYREG_USB_ARB_RW4_WA -USBFS_1_USB__ARB_RW4_WA_MSB EQU CYREG_USB_ARB_RW4_WA_MSB -USBFS_1_USB__ARB_RW5_DR EQU CYREG_USB_ARB_RW5_DR -USBFS_1_USB__ARB_RW5_RA EQU CYREG_USB_ARB_RW5_RA -USBFS_1_USB__ARB_RW5_RA_MSB EQU CYREG_USB_ARB_RW5_RA_MSB -USBFS_1_USB__ARB_RW5_WA EQU CYREG_USB_ARB_RW5_WA -USBFS_1_USB__ARB_RW5_WA_MSB EQU CYREG_USB_ARB_RW5_WA_MSB -USBFS_1_USB__ARB_RW6_DR EQU CYREG_USB_ARB_RW6_DR -USBFS_1_USB__ARB_RW6_RA EQU CYREG_USB_ARB_RW6_RA -USBFS_1_USB__ARB_RW6_RA_MSB EQU CYREG_USB_ARB_RW6_RA_MSB -USBFS_1_USB__ARB_RW6_WA EQU CYREG_USB_ARB_RW6_WA -USBFS_1_USB__ARB_RW6_WA_MSB EQU CYREG_USB_ARB_RW6_WA_MSB -USBFS_1_USB__ARB_RW7_DR EQU CYREG_USB_ARB_RW7_DR -USBFS_1_USB__ARB_RW7_RA EQU CYREG_USB_ARB_RW7_RA -USBFS_1_USB__ARB_RW7_RA_MSB EQU CYREG_USB_ARB_RW7_RA_MSB -USBFS_1_USB__ARB_RW7_WA EQU CYREG_USB_ARB_RW7_WA -USBFS_1_USB__ARB_RW7_WA_MSB EQU CYREG_USB_ARB_RW7_WA_MSB -USBFS_1_USB__ARB_RW8_DR EQU CYREG_USB_ARB_RW8_DR -USBFS_1_USB__ARB_RW8_RA EQU CYREG_USB_ARB_RW8_RA -USBFS_1_USB__ARB_RW8_RA_MSB EQU CYREG_USB_ARB_RW8_RA_MSB -USBFS_1_USB__ARB_RW8_WA EQU CYREG_USB_ARB_RW8_WA -USBFS_1_USB__ARB_RW8_WA_MSB EQU CYREG_USB_ARB_RW8_WA_MSB -USBFS_1_USB__BUF_SIZE EQU CYREG_USB_BUF_SIZE -USBFS_1_USB__BUS_RST_CNT EQU CYREG_USB_BUS_RST_CNT -USBFS_1_USB__CR0 EQU CYREG_USB_CR0 -USBFS_1_USB__CR1 EQU CYREG_USB_CR1 -USBFS_1_USB__CWA EQU CYREG_USB_CWA -USBFS_1_USB__CWA_MSB EQU CYREG_USB_CWA_MSB -USBFS_1_USB__DMA_THRES EQU CYREG_USB_DMA_THRES -USBFS_1_USB__DMA_THRES_MSB EQU CYREG_USB_DMA_THRES_MSB -USBFS_1_USB__DYN_RECONFIG EQU CYREG_USB_DYN_RECONFIG -USBFS_1_USB__EP0_CNT EQU CYREG_USB_EP0_CNT -USBFS_1_USB__EP0_CR EQU CYREG_USB_EP0_CR -USBFS_1_USB__EP0_DR0 EQU CYREG_USB_EP0_DR0 -USBFS_1_USB__EP0_DR1 EQU CYREG_USB_EP0_DR1 -USBFS_1_USB__EP0_DR2 EQU CYREG_USB_EP0_DR2 -USBFS_1_USB__EP0_DR3 EQU CYREG_USB_EP0_DR3 -USBFS_1_USB__EP0_DR4 EQU CYREG_USB_EP0_DR4 -USBFS_1_USB__EP0_DR5 EQU CYREG_USB_EP0_DR5 -USBFS_1_USB__EP0_DR6 EQU CYREG_USB_EP0_DR6 -USBFS_1_USB__EP0_DR7 EQU CYREG_USB_EP0_DR7 -USBFS_1_USB__EP_ACTIVE EQU CYREG_USB_EP_ACTIVE -USBFS_1_USB__EP_TYPE EQU CYREG_USB_EP_TYPE -USBFS_1_USB__MEM_DATA EQU CYREG_USB_MEM_DATA_MBASE -USBFS_1_USB__PM_ACT_CFG EQU CYREG_PM_ACT_CFG5 -USBFS_1_USB__PM_ACT_MSK EQU 0x01 -USBFS_1_USB__PM_STBY_CFG EQU CYREG_PM_STBY_CFG5 -USBFS_1_USB__PM_STBY_MSK EQU 0x01 -USBFS_1_USB__SIE_EP1_CNT0 EQU CYREG_USB_SIE_EP1_CNT0 -USBFS_1_USB__SIE_EP1_CNT1 EQU CYREG_USB_SIE_EP1_CNT1 -USBFS_1_USB__SIE_EP1_CR0 EQU CYREG_USB_SIE_EP1_CR0 -USBFS_1_USB__SIE_EP2_CNT0 EQU CYREG_USB_SIE_EP2_CNT0 -USBFS_1_USB__SIE_EP2_CNT1 EQU CYREG_USB_SIE_EP2_CNT1 -USBFS_1_USB__SIE_EP2_CR0 EQU CYREG_USB_SIE_EP2_CR0 -USBFS_1_USB__SIE_EP3_CNT0 EQU CYREG_USB_SIE_EP3_CNT0 -USBFS_1_USB__SIE_EP3_CNT1 EQU CYREG_USB_SIE_EP3_CNT1 -USBFS_1_USB__SIE_EP3_CR0 EQU CYREG_USB_SIE_EP3_CR0 -USBFS_1_USB__SIE_EP4_CNT0 EQU CYREG_USB_SIE_EP4_CNT0 -USBFS_1_USB__SIE_EP4_CNT1 EQU CYREG_USB_SIE_EP4_CNT1 -USBFS_1_USB__SIE_EP4_CR0 EQU CYREG_USB_SIE_EP4_CR0 -USBFS_1_USB__SIE_EP5_CNT0 EQU CYREG_USB_SIE_EP5_CNT0 -USBFS_1_USB__SIE_EP5_CNT1 EQU CYREG_USB_SIE_EP5_CNT1 -USBFS_1_USB__SIE_EP5_CR0 EQU CYREG_USB_SIE_EP5_CR0 -USBFS_1_USB__SIE_EP6_CNT0 EQU CYREG_USB_SIE_EP6_CNT0 -USBFS_1_USB__SIE_EP6_CNT1 EQU CYREG_USB_SIE_EP6_CNT1 -USBFS_1_USB__SIE_EP6_CR0 EQU CYREG_USB_SIE_EP6_CR0 -USBFS_1_USB__SIE_EP7_CNT0 EQU CYREG_USB_SIE_EP7_CNT0 -USBFS_1_USB__SIE_EP7_CNT1 EQU CYREG_USB_SIE_EP7_CNT1 -USBFS_1_USB__SIE_EP7_CR0 EQU CYREG_USB_SIE_EP7_CR0 -USBFS_1_USB__SIE_EP8_CNT0 EQU CYREG_USB_SIE_EP8_CNT0 -USBFS_1_USB__SIE_EP8_CNT1 EQU CYREG_USB_SIE_EP8_CNT1 -USBFS_1_USB__SIE_EP8_CR0 EQU CYREG_USB_SIE_EP8_CR0 -USBFS_1_USB__SIE_EP_INT_EN EQU CYREG_USB_SIE_EP_INT_EN -USBFS_1_USB__SIE_EP_INT_SR EQU CYREG_USB_SIE_EP_INT_SR -USBFS_1_USB__SOF0 EQU CYREG_USB_SOF0 -USBFS_1_USB__SOF1 EQU CYREG_USB_SOF1 -USBFS_1_USB__USBIO_CR0 EQU CYREG_USB_USBIO_CR0 -USBFS_1_USB__USBIO_CR1 EQU CYREG_USB_USBIO_CR1 -USBFS_1_USB__USB_CLK_EN EQU CYREG_USB_USB_CLK_EN - /* scsiTarget */ scsiTarget_StatusReg__0__MASK EQU 0x01 scsiTarget_StatusReg__0__POS EQU 0 @@ -1277,71 +1131,161 @@ 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 -/* USBFS_1_Dm */ -USBFS_1_Dm__0__MASK EQU 0x80 -USBFS_1_Dm__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC1 -USBFS_1_Dm__0__PORT EQU 15 -USBFS_1_Dm__0__SHIFT EQU 7 -USBFS_1_Dm__AG EQU CYREG_PRT15_AG -USBFS_1_Dm__AMUX EQU CYREG_PRT15_AMUX -USBFS_1_Dm__BIE EQU CYREG_PRT15_BIE -USBFS_1_Dm__BIT_MASK EQU CYREG_PRT15_BIT_MASK -USBFS_1_Dm__BYP EQU CYREG_PRT15_BYP -USBFS_1_Dm__CTL EQU CYREG_PRT15_CTL -USBFS_1_Dm__DM0 EQU CYREG_PRT15_DM0 -USBFS_1_Dm__DM1 EQU CYREG_PRT15_DM1 -USBFS_1_Dm__DM2 EQU CYREG_PRT15_DM2 -USBFS_1_Dm__DR EQU CYREG_PRT15_DR -USBFS_1_Dm__INP_DIS EQU CYREG_PRT15_INP_DIS -USBFS_1_Dm__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG -USBFS_1_Dm__LCD_EN EQU CYREG_PRT15_LCD_EN -USBFS_1_Dm__MASK EQU 0x80 -USBFS_1_Dm__PORT EQU 15 -USBFS_1_Dm__PRT EQU CYREG_PRT15_PRT -USBFS_1_Dm__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL -USBFS_1_Dm__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN -USBFS_1_Dm__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 -USBFS_1_Dm__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 -USBFS_1_Dm__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 -USBFS_1_Dm__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 -USBFS_1_Dm__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT -USBFS_1_Dm__PS EQU CYREG_PRT15_PS -USBFS_1_Dm__SHIFT EQU 7 -USBFS_1_Dm__SLW EQU CYREG_PRT15_SLW +/* USBFS_ep_0 */ +USBFS_ep_0__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_ep_0__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_ep_0__INTC_MASK EQU 0x1000000 +USBFS_ep_0__INTC_NUMBER EQU 24 +USBFS_ep_0__INTC_PRIOR_NUM EQU 7 +USBFS_ep_0__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_24 +USBFS_ep_0__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +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_PRIOR_NUM EQU 7 +USBFS_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 +USBFS_ep_1__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_1__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 -/* USBFS_1_Dp */ -USBFS_1_Dp__0__MASK EQU 0x40 -USBFS_1_Dp__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC0 -USBFS_1_Dp__0__PORT EQU 15 -USBFS_1_Dp__0__SHIFT EQU 6 -USBFS_1_Dp__AG EQU CYREG_PRT15_AG -USBFS_1_Dp__AMUX EQU CYREG_PRT15_AMUX -USBFS_1_Dp__BIE EQU CYREG_PRT15_BIE -USBFS_1_Dp__BIT_MASK EQU CYREG_PRT15_BIT_MASK -USBFS_1_Dp__BYP EQU CYREG_PRT15_BYP -USBFS_1_Dp__CTL EQU CYREG_PRT15_CTL -USBFS_1_Dp__DM0 EQU CYREG_PRT15_DM0 -USBFS_1_Dp__DM1 EQU CYREG_PRT15_DM1 -USBFS_1_Dp__DM2 EQU CYREG_PRT15_DM2 -USBFS_1_Dp__DR EQU CYREG_PRT15_DR -USBFS_1_Dp__INP_DIS EQU CYREG_PRT15_INP_DIS -USBFS_1_Dp__INTSTAT EQU CYREG_PICU15_INTSTAT -USBFS_1_Dp__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG -USBFS_1_Dp__LCD_EN EQU CYREG_PRT15_LCD_EN -USBFS_1_Dp__MASK EQU 0x40 -USBFS_1_Dp__PORT EQU 15 -USBFS_1_Dp__PRT EQU CYREG_PRT15_PRT -USBFS_1_Dp__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL -USBFS_1_Dp__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN -USBFS_1_Dp__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 -USBFS_1_Dp__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 -USBFS_1_Dp__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 -USBFS_1_Dp__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 -USBFS_1_Dp__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT -USBFS_1_Dp__PS EQU CYREG_PRT15_PS -USBFS_1_Dp__SHIFT EQU 6 -USBFS_1_Dp__SLW EQU CYREG_PRT15_SLW -USBFS_1_Dp__SNAP EQU CYREG_PICU_15_SNAP_15 +/* 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_PRIOR_NUM EQU 7 +USBFS_ep_2__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_1 +USBFS_ep_2__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_2__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 +USBFS_USB__ARB_EP1_INT_EN EQU CYREG_USB_ARB_EP1_INT_EN +USBFS_USB__ARB_EP1_SR EQU CYREG_USB_ARB_EP1_SR +USBFS_USB__ARB_EP2_CFG EQU CYREG_USB_ARB_EP2_CFG +USBFS_USB__ARB_EP2_INT_EN EQU CYREG_USB_ARB_EP2_INT_EN +USBFS_USB__ARB_EP2_SR EQU CYREG_USB_ARB_EP2_SR +USBFS_USB__ARB_EP3_CFG EQU CYREG_USB_ARB_EP3_CFG +USBFS_USB__ARB_EP3_INT_EN EQU CYREG_USB_ARB_EP3_INT_EN +USBFS_USB__ARB_EP3_SR EQU CYREG_USB_ARB_EP3_SR +USBFS_USB__ARB_EP4_CFG EQU CYREG_USB_ARB_EP4_CFG +USBFS_USB__ARB_EP4_INT_EN EQU CYREG_USB_ARB_EP4_INT_EN +USBFS_USB__ARB_EP4_SR EQU CYREG_USB_ARB_EP4_SR +USBFS_USB__ARB_EP5_CFG EQU CYREG_USB_ARB_EP5_CFG +USBFS_USB__ARB_EP5_INT_EN EQU CYREG_USB_ARB_EP5_INT_EN +USBFS_USB__ARB_EP5_SR EQU CYREG_USB_ARB_EP5_SR +USBFS_USB__ARB_EP6_CFG EQU CYREG_USB_ARB_EP6_CFG +USBFS_USB__ARB_EP6_INT_EN EQU CYREG_USB_ARB_EP6_INT_EN +USBFS_USB__ARB_EP6_SR EQU CYREG_USB_ARB_EP6_SR +USBFS_USB__ARB_EP7_CFG EQU CYREG_USB_ARB_EP7_CFG +USBFS_USB__ARB_EP7_INT_EN EQU CYREG_USB_ARB_EP7_INT_EN +USBFS_USB__ARB_EP7_SR EQU CYREG_USB_ARB_EP7_SR +USBFS_USB__ARB_EP8_CFG EQU CYREG_USB_ARB_EP8_CFG +USBFS_USB__ARB_EP8_INT_EN EQU CYREG_USB_ARB_EP8_INT_EN +USBFS_USB__ARB_EP8_SR EQU CYREG_USB_ARB_EP8_SR +USBFS_USB__ARB_INT_EN EQU CYREG_USB_ARB_INT_EN +USBFS_USB__ARB_INT_SR EQU CYREG_USB_ARB_INT_SR +USBFS_USB__ARB_RW1_DR EQU CYREG_USB_ARB_RW1_DR +USBFS_USB__ARB_RW1_RA EQU CYREG_USB_ARB_RW1_RA +USBFS_USB__ARB_RW1_RA_MSB EQU CYREG_USB_ARB_RW1_RA_MSB +USBFS_USB__ARB_RW1_WA EQU CYREG_USB_ARB_RW1_WA +USBFS_USB__ARB_RW1_WA_MSB EQU CYREG_USB_ARB_RW1_WA_MSB +USBFS_USB__ARB_RW2_DR EQU CYREG_USB_ARB_RW2_DR +USBFS_USB__ARB_RW2_RA EQU CYREG_USB_ARB_RW2_RA +USBFS_USB__ARB_RW2_RA_MSB EQU CYREG_USB_ARB_RW2_RA_MSB +USBFS_USB__ARB_RW2_WA EQU CYREG_USB_ARB_RW2_WA +USBFS_USB__ARB_RW2_WA_MSB EQU CYREG_USB_ARB_RW2_WA_MSB +USBFS_USB__ARB_RW3_DR EQU CYREG_USB_ARB_RW3_DR +USBFS_USB__ARB_RW3_RA EQU CYREG_USB_ARB_RW3_RA +USBFS_USB__ARB_RW3_RA_MSB EQU CYREG_USB_ARB_RW3_RA_MSB +USBFS_USB__ARB_RW3_WA EQU CYREG_USB_ARB_RW3_WA +USBFS_USB__ARB_RW3_WA_MSB EQU CYREG_USB_ARB_RW3_WA_MSB +USBFS_USB__ARB_RW4_DR EQU CYREG_USB_ARB_RW4_DR +USBFS_USB__ARB_RW4_RA EQU CYREG_USB_ARB_RW4_RA +USBFS_USB__ARB_RW4_RA_MSB EQU CYREG_USB_ARB_RW4_RA_MSB +USBFS_USB__ARB_RW4_WA EQU CYREG_USB_ARB_RW4_WA +USBFS_USB__ARB_RW4_WA_MSB EQU CYREG_USB_ARB_RW4_WA_MSB +USBFS_USB__ARB_RW5_DR EQU CYREG_USB_ARB_RW5_DR +USBFS_USB__ARB_RW5_RA EQU CYREG_USB_ARB_RW5_RA +USBFS_USB__ARB_RW5_RA_MSB EQU CYREG_USB_ARB_RW5_RA_MSB +USBFS_USB__ARB_RW5_WA EQU CYREG_USB_ARB_RW5_WA +USBFS_USB__ARB_RW5_WA_MSB EQU CYREG_USB_ARB_RW5_WA_MSB +USBFS_USB__ARB_RW6_DR EQU CYREG_USB_ARB_RW6_DR +USBFS_USB__ARB_RW6_RA EQU CYREG_USB_ARB_RW6_RA +USBFS_USB__ARB_RW6_RA_MSB EQU CYREG_USB_ARB_RW6_RA_MSB +USBFS_USB__ARB_RW6_WA EQU CYREG_USB_ARB_RW6_WA +USBFS_USB__ARB_RW6_WA_MSB EQU CYREG_USB_ARB_RW6_WA_MSB +USBFS_USB__ARB_RW7_DR EQU CYREG_USB_ARB_RW7_DR +USBFS_USB__ARB_RW7_RA EQU CYREG_USB_ARB_RW7_RA +USBFS_USB__ARB_RW7_RA_MSB EQU CYREG_USB_ARB_RW7_RA_MSB +USBFS_USB__ARB_RW7_WA EQU CYREG_USB_ARB_RW7_WA +USBFS_USB__ARB_RW7_WA_MSB EQU CYREG_USB_ARB_RW7_WA_MSB +USBFS_USB__ARB_RW8_DR EQU CYREG_USB_ARB_RW8_DR +USBFS_USB__ARB_RW8_RA EQU CYREG_USB_ARB_RW8_RA +USBFS_USB__ARB_RW8_RA_MSB EQU CYREG_USB_ARB_RW8_RA_MSB +USBFS_USB__ARB_RW8_WA EQU CYREG_USB_ARB_RW8_WA +USBFS_USB__ARB_RW8_WA_MSB EQU CYREG_USB_ARB_RW8_WA_MSB +USBFS_USB__BUF_SIZE EQU CYREG_USB_BUF_SIZE +USBFS_USB__BUS_RST_CNT EQU CYREG_USB_BUS_RST_CNT +USBFS_USB__CR0 EQU CYREG_USB_CR0 +USBFS_USB__CR1 EQU CYREG_USB_CR1 +USBFS_USB__CWA EQU CYREG_USB_CWA +USBFS_USB__CWA_MSB EQU CYREG_USB_CWA_MSB +USBFS_USB__DMA_THRES EQU CYREG_USB_DMA_THRES +USBFS_USB__DMA_THRES_MSB EQU CYREG_USB_DMA_THRES_MSB +USBFS_USB__DYN_RECONFIG EQU CYREG_USB_DYN_RECONFIG +USBFS_USB__EP0_CNT EQU CYREG_USB_EP0_CNT +USBFS_USB__EP0_CR EQU CYREG_USB_EP0_CR +USBFS_USB__EP0_DR0 EQU CYREG_USB_EP0_DR0 +USBFS_USB__EP0_DR1 EQU CYREG_USB_EP0_DR1 +USBFS_USB__EP0_DR2 EQU CYREG_USB_EP0_DR2 +USBFS_USB__EP0_DR3 EQU CYREG_USB_EP0_DR3 +USBFS_USB__EP0_DR4 EQU CYREG_USB_EP0_DR4 +USBFS_USB__EP0_DR5 EQU CYREG_USB_EP0_DR5 +USBFS_USB__EP0_DR6 EQU CYREG_USB_EP0_DR6 +USBFS_USB__EP0_DR7 EQU CYREG_USB_EP0_DR7 +USBFS_USB__EP_ACTIVE EQU CYREG_USB_EP_ACTIVE +USBFS_USB__EP_TYPE EQU CYREG_USB_EP_TYPE +USBFS_USB__MEM_DATA EQU CYREG_USB_MEM_DATA_MBASE +USBFS_USB__PM_ACT_CFG EQU CYREG_PM_ACT_CFG5 +USBFS_USB__PM_ACT_MSK EQU 0x01 +USBFS_USB__PM_STBY_CFG EQU CYREG_PM_STBY_CFG5 +USBFS_USB__PM_STBY_MSK EQU 0x01 +USBFS_USB__SIE_EP1_CNT0 EQU CYREG_USB_SIE_EP1_CNT0 +USBFS_USB__SIE_EP1_CNT1 EQU CYREG_USB_SIE_EP1_CNT1 +USBFS_USB__SIE_EP1_CR0 EQU CYREG_USB_SIE_EP1_CR0 +USBFS_USB__SIE_EP2_CNT0 EQU CYREG_USB_SIE_EP2_CNT0 +USBFS_USB__SIE_EP2_CNT1 EQU CYREG_USB_SIE_EP2_CNT1 +USBFS_USB__SIE_EP2_CR0 EQU CYREG_USB_SIE_EP2_CR0 +USBFS_USB__SIE_EP3_CNT0 EQU CYREG_USB_SIE_EP3_CNT0 +USBFS_USB__SIE_EP3_CNT1 EQU CYREG_USB_SIE_EP3_CNT1 +USBFS_USB__SIE_EP3_CR0 EQU CYREG_USB_SIE_EP3_CR0 +USBFS_USB__SIE_EP4_CNT0 EQU CYREG_USB_SIE_EP4_CNT0 +USBFS_USB__SIE_EP4_CNT1 EQU CYREG_USB_SIE_EP4_CNT1 +USBFS_USB__SIE_EP4_CR0 EQU CYREG_USB_SIE_EP4_CR0 +USBFS_USB__SIE_EP5_CNT0 EQU CYREG_USB_SIE_EP5_CNT0 +USBFS_USB__SIE_EP5_CNT1 EQU CYREG_USB_SIE_EP5_CNT1 +USBFS_USB__SIE_EP5_CR0 EQU CYREG_USB_SIE_EP5_CR0 +USBFS_USB__SIE_EP6_CNT0 EQU CYREG_USB_SIE_EP6_CNT0 +USBFS_USB__SIE_EP6_CNT1 EQU CYREG_USB_SIE_EP6_CNT1 +USBFS_USB__SIE_EP6_CR0 EQU CYREG_USB_SIE_EP6_CR0 +USBFS_USB__SIE_EP7_CNT0 EQU CYREG_USB_SIE_EP7_CNT0 +USBFS_USB__SIE_EP7_CNT1 EQU CYREG_USB_SIE_EP7_CNT1 +USBFS_USB__SIE_EP7_CR0 EQU CYREG_USB_SIE_EP7_CR0 +USBFS_USB__SIE_EP8_CNT0 EQU CYREG_USB_SIE_EP8_CNT0 +USBFS_USB__SIE_EP8_CNT1 EQU CYREG_USB_SIE_EP8_CNT1 +USBFS_USB__SIE_EP8_CR0 EQU CYREG_USB_SIE_EP8_CR0 +USBFS_USB__SIE_EP_INT_EN EQU CYREG_USB_SIE_EP_INT_EN +USBFS_USB__SIE_EP_INT_SR EQU CYREG_USB_SIE_EP_INT_SR +USBFS_USB__SOF0 EQU CYREG_USB_SOF0 +USBFS_USB__SOF1 EQU CYREG_USB_SOF1 +USBFS_USB__USBIO_CR0 EQU CYREG_USB_USBIO_CR0 +USBFS_USB__USBIO_CR1 EQU CYREG_USB_USBIO_CR1 +USBFS_USB__USB_CLK_EN EQU CYREG_USB_USB_CLK_EN /* SCSI_ATN */ SCSI_ATN__0__MASK EQU 0x20 @@ -1960,6 +1904,72 @@ SCSI_RST__SHIFT EQU 6 SCSI_RST__SLW EQU CYREG_PRT6_SLW SCSI_RST__SNAP EQU CYREG_PICU6_SNAP +/* USBFS_Dm */ +USBFS_Dm__0__MASK EQU 0x80 +USBFS_Dm__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC1 +USBFS_Dm__0__PORT EQU 15 +USBFS_Dm__0__SHIFT EQU 7 +USBFS_Dm__AG EQU CYREG_PRT15_AG +USBFS_Dm__AMUX EQU CYREG_PRT15_AMUX +USBFS_Dm__BIE EQU CYREG_PRT15_BIE +USBFS_Dm__BIT_MASK EQU CYREG_PRT15_BIT_MASK +USBFS_Dm__BYP EQU CYREG_PRT15_BYP +USBFS_Dm__CTL EQU CYREG_PRT15_CTL +USBFS_Dm__DM0 EQU CYREG_PRT15_DM0 +USBFS_Dm__DM1 EQU CYREG_PRT15_DM1 +USBFS_Dm__DM2 EQU CYREG_PRT15_DM2 +USBFS_Dm__DR EQU CYREG_PRT15_DR +USBFS_Dm__INP_DIS EQU CYREG_PRT15_INP_DIS +USBFS_Dm__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG +USBFS_Dm__LCD_EN EQU CYREG_PRT15_LCD_EN +USBFS_Dm__MASK EQU 0x80 +USBFS_Dm__PORT EQU 15 +USBFS_Dm__PRT EQU CYREG_PRT15_PRT +USBFS_Dm__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL +USBFS_Dm__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN +USBFS_Dm__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 +USBFS_Dm__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 +USBFS_Dm__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 +USBFS_Dm__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 +USBFS_Dm__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT +USBFS_Dm__PS EQU CYREG_PRT15_PS +USBFS_Dm__SHIFT EQU 7 +USBFS_Dm__SLW EQU CYREG_PRT15_SLW + +/* USBFS_Dp */ +USBFS_Dp__0__MASK EQU 0x40 +USBFS_Dp__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC0 +USBFS_Dp__0__PORT EQU 15 +USBFS_Dp__0__SHIFT EQU 6 +USBFS_Dp__AG EQU CYREG_PRT15_AG +USBFS_Dp__AMUX EQU CYREG_PRT15_AMUX +USBFS_Dp__BIE EQU CYREG_PRT15_BIE +USBFS_Dp__BIT_MASK EQU CYREG_PRT15_BIT_MASK +USBFS_Dp__BYP EQU CYREG_PRT15_BYP +USBFS_Dp__CTL EQU CYREG_PRT15_CTL +USBFS_Dp__DM0 EQU CYREG_PRT15_DM0 +USBFS_Dp__DM1 EQU CYREG_PRT15_DM1 +USBFS_Dp__DM2 EQU CYREG_PRT15_DM2 +USBFS_Dp__DR EQU CYREG_PRT15_DR +USBFS_Dp__INP_DIS EQU CYREG_PRT15_INP_DIS +USBFS_Dp__INTSTAT EQU CYREG_PICU15_INTSTAT +USBFS_Dp__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG +USBFS_Dp__LCD_EN EQU CYREG_PRT15_LCD_EN +USBFS_Dp__MASK EQU 0x40 +USBFS_Dp__PORT EQU 15 +USBFS_Dp__PRT EQU CYREG_PRT15_PRT +USBFS_Dp__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL +USBFS_Dp__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN +USBFS_Dp__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 +USBFS_Dp__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 +USBFS_Dp__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 +USBFS_Dp__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 +USBFS_Dp__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT +USBFS_Dp__PS EQU CYREG_PRT15_PS +USBFS_Dp__SHIFT EQU 6 +USBFS_Dp__SLW EQU CYREG_PRT15_SLW +USBFS_Dp__SNAP EQU CYREG_PICU_15_SNAP_15 + /* SCSI_In */ SCSI_In__0__AG EQU CYREG_PRT2_AG SCSI_In__0__AMUX EQU CYREG_PRT2_AMUX diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc index d0378d24..bb7ab3a7 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitterrv.inc @@ -3,45 +3,35 @@ INCLUDED_CYFITTERRV_INC EQU 1 GET cydevicerv.inc GET cydevicerv_trm.inc -; USBFS_1_bus_reset -USBFS_1_bus_reset__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_bus_reset__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_bus_reset__INTC_MASK EQU 0x800000 -USBFS_1_bus_reset__INTC_NUMBER EQU 23 -USBFS_1_bus_reset__INTC_PRIOR_NUM EQU 7 -USBFS_1_bus_reset__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_23 -USBFS_1_bus_reset__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_bus_reset__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +; 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 +USBFS_bus_reset__INTC_MASK EQU 0x800000 +USBFS_bus_reset__INTC_NUMBER EQU 23 +USBFS_bus_reset__INTC_PRIOR_NUM EQU 7 +USBFS_bus_reset__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_23 +USBFS_bus_reset__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_bus_reset__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 -; USBFS_1_arb_int -USBFS_1_arb_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_arb_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_arb_int__INTC_MASK EQU 0x400000 -USBFS_1_arb_int__INTC_NUMBER EQU 22 -USBFS_1_arb_int__INTC_PRIOR_NUM EQU 7 -USBFS_1_arb_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_22 -USBFS_1_arb_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_arb_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +; USBFS_arb_int +USBFS_arb_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_arb_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_arb_int__INTC_MASK EQU 0x400000 +USBFS_arb_int__INTC_NUMBER EQU 22 +USBFS_arb_int__INTC_PRIOR_NUM EQU 7 +USBFS_arb_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_22 +USBFS_arb_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_arb_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 -; USBFS_1_sof_int -USBFS_1_sof_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_sof_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_sof_int__INTC_MASK EQU 0x200000 -USBFS_1_sof_int__INTC_NUMBER EQU 21 -USBFS_1_sof_int__INTC_PRIOR_NUM EQU 7 -USBFS_1_sof_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_21 -USBFS_1_sof_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_sof_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 - -; USBFS_1_dp_int -USBFS_1_dp_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_dp_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_dp_int__INTC_MASK EQU 0x1000 -USBFS_1_dp_int__INTC_NUMBER EQU 12 -USBFS_1_dp_int__INTC_PRIOR_NUM EQU 7 -USBFS_1_dp_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_12 -USBFS_1_dp_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_dp_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +; USBFS_sof_int +USBFS_sof_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_sof_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_sof_int__INTC_MASK EQU 0x200000 +USBFS_sof_int__INTC_NUMBER EQU 21 +USBFS_sof_int__INTC_PRIOR_NUM EQU 7 +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_ATN_ISR SCSI_ATN_ISR__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 @@ -572,25 +562,15 @@ 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 -; USBFS_1_ep_0 -USBFS_1_ep_0__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_ep_0__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_ep_0__INTC_MASK EQU 0x1000000 -USBFS_1_ep_0__INTC_NUMBER EQU 24 -USBFS_1_ep_0__INTC_PRIOR_NUM EQU 7 -USBFS_1_ep_0__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_24 -USBFS_1_ep_0__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_ep_0__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 - -; USBFS_1_ep_1 -USBFS_1_ep_1__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 -USBFS_1_ep_1__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 -USBFS_1_ep_1__INTC_MASK EQU 0x01 -USBFS_1_ep_1__INTC_NUMBER EQU 0 -USBFS_1_ep_1__INTC_PRIOR_NUM EQU 7 -USBFS_1_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 -USBFS_1_ep_1__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 -USBFS_1_ep_1__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 +; USBFS_dp_int +USBFS_dp_int__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_dp_int__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_dp_int__INTC_MASK EQU 0x1000 +USBFS_dp_int__INTC_NUMBER EQU 12 +USBFS_dp_int__INTC_PRIOR_NUM EQU 7 +USBFS_dp_int__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_12 +USBFS_dp_int__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_dp_int__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 ; SCSI_CTL_IO SCSI_CTL_IO_Sync_ctrl_reg__0__MASK EQU 0x01 @@ -1068,132 +1048,6 @@ SD_Init_Clk__PM_ACT_MSK EQU 0x02 SD_Init_Clk__PM_STBY_CFG EQU CYREG_PM_STBY_CFG2 SD_Init_Clk__PM_STBY_MSK EQU 0x02 -; USBFS_1_USB -USBFS_1_USB__ARB_CFG EQU CYREG_USB_ARB_CFG -USBFS_1_USB__ARB_EP1_CFG EQU CYREG_USB_ARB_EP1_CFG -USBFS_1_USB__ARB_EP1_INT_EN EQU CYREG_USB_ARB_EP1_INT_EN -USBFS_1_USB__ARB_EP1_SR EQU CYREG_USB_ARB_EP1_SR -USBFS_1_USB__ARB_EP2_CFG EQU CYREG_USB_ARB_EP2_CFG -USBFS_1_USB__ARB_EP2_INT_EN EQU CYREG_USB_ARB_EP2_INT_EN -USBFS_1_USB__ARB_EP2_SR EQU CYREG_USB_ARB_EP2_SR -USBFS_1_USB__ARB_EP3_CFG EQU CYREG_USB_ARB_EP3_CFG -USBFS_1_USB__ARB_EP3_INT_EN EQU CYREG_USB_ARB_EP3_INT_EN -USBFS_1_USB__ARB_EP3_SR EQU CYREG_USB_ARB_EP3_SR -USBFS_1_USB__ARB_EP4_CFG EQU CYREG_USB_ARB_EP4_CFG -USBFS_1_USB__ARB_EP4_INT_EN EQU CYREG_USB_ARB_EP4_INT_EN -USBFS_1_USB__ARB_EP4_SR EQU CYREG_USB_ARB_EP4_SR -USBFS_1_USB__ARB_EP5_CFG EQU CYREG_USB_ARB_EP5_CFG -USBFS_1_USB__ARB_EP5_INT_EN EQU CYREG_USB_ARB_EP5_INT_EN -USBFS_1_USB__ARB_EP5_SR EQU CYREG_USB_ARB_EP5_SR -USBFS_1_USB__ARB_EP6_CFG EQU CYREG_USB_ARB_EP6_CFG -USBFS_1_USB__ARB_EP6_INT_EN EQU CYREG_USB_ARB_EP6_INT_EN -USBFS_1_USB__ARB_EP6_SR EQU CYREG_USB_ARB_EP6_SR -USBFS_1_USB__ARB_EP7_CFG EQU CYREG_USB_ARB_EP7_CFG -USBFS_1_USB__ARB_EP7_INT_EN EQU CYREG_USB_ARB_EP7_INT_EN -USBFS_1_USB__ARB_EP7_SR EQU CYREG_USB_ARB_EP7_SR -USBFS_1_USB__ARB_EP8_CFG EQU CYREG_USB_ARB_EP8_CFG -USBFS_1_USB__ARB_EP8_INT_EN EQU CYREG_USB_ARB_EP8_INT_EN -USBFS_1_USB__ARB_EP8_SR EQU CYREG_USB_ARB_EP8_SR -USBFS_1_USB__ARB_INT_EN EQU CYREG_USB_ARB_INT_EN -USBFS_1_USB__ARB_INT_SR EQU CYREG_USB_ARB_INT_SR -USBFS_1_USB__ARB_RW1_DR EQU CYREG_USB_ARB_RW1_DR -USBFS_1_USB__ARB_RW1_RA EQU CYREG_USB_ARB_RW1_RA -USBFS_1_USB__ARB_RW1_RA_MSB EQU CYREG_USB_ARB_RW1_RA_MSB -USBFS_1_USB__ARB_RW1_WA EQU CYREG_USB_ARB_RW1_WA -USBFS_1_USB__ARB_RW1_WA_MSB EQU CYREG_USB_ARB_RW1_WA_MSB -USBFS_1_USB__ARB_RW2_DR EQU CYREG_USB_ARB_RW2_DR -USBFS_1_USB__ARB_RW2_RA EQU CYREG_USB_ARB_RW2_RA -USBFS_1_USB__ARB_RW2_RA_MSB EQU CYREG_USB_ARB_RW2_RA_MSB -USBFS_1_USB__ARB_RW2_WA EQU CYREG_USB_ARB_RW2_WA -USBFS_1_USB__ARB_RW2_WA_MSB EQU CYREG_USB_ARB_RW2_WA_MSB -USBFS_1_USB__ARB_RW3_DR EQU CYREG_USB_ARB_RW3_DR -USBFS_1_USB__ARB_RW3_RA EQU CYREG_USB_ARB_RW3_RA -USBFS_1_USB__ARB_RW3_RA_MSB EQU CYREG_USB_ARB_RW3_RA_MSB -USBFS_1_USB__ARB_RW3_WA EQU CYREG_USB_ARB_RW3_WA -USBFS_1_USB__ARB_RW3_WA_MSB EQU CYREG_USB_ARB_RW3_WA_MSB -USBFS_1_USB__ARB_RW4_DR EQU CYREG_USB_ARB_RW4_DR -USBFS_1_USB__ARB_RW4_RA EQU CYREG_USB_ARB_RW4_RA -USBFS_1_USB__ARB_RW4_RA_MSB EQU CYREG_USB_ARB_RW4_RA_MSB -USBFS_1_USB__ARB_RW4_WA EQU CYREG_USB_ARB_RW4_WA -USBFS_1_USB__ARB_RW4_WA_MSB EQU CYREG_USB_ARB_RW4_WA_MSB -USBFS_1_USB__ARB_RW5_DR EQU CYREG_USB_ARB_RW5_DR -USBFS_1_USB__ARB_RW5_RA EQU CYREG_USB_ARB_RW5_RA -USBFS_1_USB__ARB_RW5_RA_MSB EQU CYREG_USB_ARB_RW5_RA_MSB -USBFS_1_USB__ARB_RW5_WA EQU CYREG_USB_ARB_RW5_WA -USBFS_1_USB__ARB_RW5_WA_MSB EQU CYREG_USB_ARB_RW5_WA_MSB -USBFS_1_USB__ARB_RW6_DR EQU CYREG_USB_ARB_RW6_DR -USBFS_1_USB__ARB_RW6_RA EQU CYREG_USB_ARB_RW6_RA -USBFS_1_USB__ARB_RW6_RA_MSB EQU CYREG_USB_ARB_RW6_RA_MSB -USBFS_1_USB__ARB_RW6_WA EQU CYREG_USB_ARB_RW6_WA -USBFS_1_USB__ARB_RW6_WA_MSB EQU CYREG_USB_ARB_RW6_WA_MSB -USBFS_1_USB__ARB_RW7_DR EQU CYREG_USB_ARB_RW7_DR -USBFS_1_USB__ARB_RW7_RA EQU CYREG_USB_ARB_RW7_RA -USBFS_1_USB__ARB_RW7_RA_MSB EQU CYREG_USB_ARB_RW7_RA_MSB -USBFS_1_USB__ARB_RW7_WA EQU CYREG_USB_ARB_RW7_WA -USBFS_1_USB__ARB_RW7_WA_MSB EQU CYREG_USB_ARB_RW7_WA_MSB -USBFS_1_USB__ARB_RW8_DR EQU CYREG_USB_ARB_RW8_DR -USBFS_1_USB__ARB_RW8_RA EQU CYREG_USB_ARB_RW8_RA -USBFS_1_USB__ARB_RW8_RA_MSB EQU CYREG_USB_ARB_RW8_RA_MSB -USBFS_1_USB__ARB_RW8_WA EQU CYREG_USB_ARB_RW8_WA -USBFS_1_USB__ARB_RW8_WA_MSB EQU CYREG_USB_ARB_RW8_WA_MSB -USBFS_1_USB__BUF_SIZE EQU CYREG_USB_BUF_SIZE -USBFS_1_USB__BUS_RST_CNT EQU CYREG_USB_BUS_RST_CNT -USBFS_1_USB__CR0 EQU CYREG_USB_CR0 -USBFS_1_USB__CR1 EQU CYREG_USB_CR1 -USBFS_1_USB__CWA EQU CYREG_USB_CWA -USBFS_1_USB__CWA_MSB EQU CYREG_USB_CWA_MSB -USBFS_1_USB__DMA_THRES EQU CYREG_USB_DMA_THRES -USBFS_1_USB__DMA_THRES_MSB EQU CYREG_USB_DMA_THRES_MSB -USBFS_1_USB__DYN_RECONFIG EQU CYREG_USB_DYN_RECONFIG -USBFS_1_USB__EP0_CNT EQU CYREG_USB_EP0_CNT -USBFS_1_USB__EP0_CR EQU CYREG_USB_EP0_CR -USBFS_1_USB__EP0_DR0 EQU CYREG_USB_EP0_DR0 -USBFS_1_USB__EP0_DR1 EQU CYREG_USB_EP0_DR1 -USBFS_1_USB__EP0_DR2 EQU CYREG_USB_EP0_DR2 -USBFS_1_USB__EP0_DR3 EQU CYREG_USB_EP0_DR3 -USBFS_1_USB__EP0_DR4 EQU CYREG_USB_EP0_DR4 -USBFS_1_USB__EP0_DR5 EQU CYREG_USB_EP0_DR5 -USBFS_1_USB__EP0_DR6 EQU CYREG_USB_EP0_DR6 -USBFS_1_USB__EP0_DR7 EQU CYREG_USB_EP0_DR7 -USBFS_1_USB__EP_ACTIVE EQU CYREG_USB_EP_ACTIVE -USBFS_1_USB__EP_TYPE EQU CYREG_USB_EP_TYPE -USBFS_1_USB__MEM_DATA EQU CYREG_USB_MEM_DATA_MBASE -USBFS_1_USB__PM_ACT_CFG EQU CYREG_PM_ACT_CFG5 -USBFS_1_USB__PM_ACT_MSK EQU 0x01 -USBFS_1_USB__PM_STBY_CFG EQU CYREG_PM_STBY_CFG5 -USBFS_1_USB__PM_STBY_MSK EQU 0x01 -USBFS_1_USB__SIE_EP1_CNT0 EQU CYREG_USB_SIE_EP1_CNT0 -USBFS_1_USB__SIE_EP1_CNT1 EQU CYREG_USB_SIE_EP1_CNT1 -USBFS_1_USB__SIE_EP1_CR0 EQU CYREG_USB_SIE_EP1_CR0 -USBFS_1_USB__SIE_EP2_CNT0 EQU CYREG_USB_SIE_EP2_CNT0 -USBFS_1_USB__SIE_EP2_CNT1 EQU CYREG_USB_SIE_EP2_CNT1 -USBFS_1_USB__SIE_EP2_CR0 EQU CYREG_USB_SIE_EP2_CR0 -USBFS_1_USB__SIE_EP3_CNT0 EQU CYREG_USB_SIE_EP3_CNT0 -USBFS_1_USB__SIE_EP3_CNT1 EQU CYREG_USB_SIE_EP3_CNT1 -USBFS_1_USB__SIE_EP3_CR0 EQU CYREG_USB_SIE_EP3_CR0 -USBFS_1_USB__SIE_EP4_CNT0 EQU CYREG_USB_SIE_EP4_CNT0 -USBFS_1_USB__SIE_EP4_CNT1 EQU CYREG_USB_SIE_EP4_CNT1 -USBFS_1_USB__SIE_EP4_CR0 EQU CYREG_USB_SIE_EP4_CR0 -USBFS_1_USB__SIE_EP5_CNT0 EQU CYREG_USB_SIE_EP5_CNT0 -USBFS_1_USB__SIE_EP5_CNT1 EQU CYREG_USB_SIE_EP5_CNT1 -USBFS_1_USB__SIE_EP5_CR0 EQU CYREG_USB_SIE_EP5_CR0 -USBFS_1_USB__SIE_EP6_CNT0 EQU CYREG_USB_SIE_EP6_CNT0 -USBFS_1_USB__SIE_EP6_CNT1 EQU CYREG_USB_SIE_EP6_CNT1 -USBFS_1_USB__SIE_EP6_CR0 EQU CYREG_USB_SIE_EP6_CR0 -USBFS_1_USB__SIE_EP7_CNT0 EQU CYREG_USB_SIE_EP7_CNT0 -USBFS_1_USB__SIE_EP7_CNT1 EQU CYREG_USB_SIE_EP7_CNT1 -USBFS_1_USB__SIE_EP7_CR0 EQU CYREG_USB_SIE_EP7_CR0 -USBFS_1_USB__SIE_EP8_CNT0 EQU CYREG_USB_SIE_EP8_CNT0 -USBFS_1_USB__SIE_EP8_CNT1 EQU CYREG_USB_SIE_EP8_CNT1 -USBFS_1_USB__SIE_EP8_CR0 EQU CYREG_USB_SIE_EP8_CR0 -USBFS_1_USB__SIE_EP_INT_EN EQU CYREG_USB_SIE_EP_INT_EN -USBFS_1_USB__SIE_EP_INT_SR EQU CYREG_USB_SIE_EP_INT_SR -USBFS_1_USB__SOF0 EQU CYREG_USB_SOF0 -USBFS_1_USB__SOF1 EQU CYREG_USB_SOF1 -USBFS_1_USB__USBIO_CR0 EQU CYREG_USB_USBIO_CR0 -USBFS_1_USB__USBIO_CR1 EQU CYREG_USB_USBIO_CR1 -USBFS_1_USB__USB_CLK_EN EQU CYREG_USB_USB_CLK_EN - ; scsiTarget scsiTarget_StatusReg__0__MASK EQU 0x01 scsiTarget_StatusReg__0__POS EQU 0 @@ -1277,71 +1131,161 @@ 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 -; USBFS_1_Dm -USBFS_1_Dm__0__MASK EQU 0x80 -USBFS_1_Dm__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC1 -USBFS_1_Dm__0__PORT EQU 15 -USBFS_1_Dm__0__SHIFT EQU 7 -USBFS_1_Dm__AG EQU CYREG_PRT15_AG -USBFS_1_Dm__AMUX EQU CYREG_PRT15_AMUX -USBFS_1_Dm__BIE EQU CYREG_PRT15_BIE -USBFS_1_Dm__BIT_MASK EQU CYREG_PRT15_BIT_MASK -USBFS_1_Dm__BYP EQU CYREG_PRT15_BYP -USBFS_1_Dm__CTL EQU CYREG_PRT15_CTL -USBFS_1_Dm__DM0 EQU CYREG_PRT15_DM0 -USBFS_1_Dm__DM1 EQU CYREG_PRT15_DM1 -USBFS_1_Dm__DM2 EQU CYREG_PRT15_DM2 -USBFS_1_Dm__DR EQU CYREG_PRT15_DR -USBFS_1_Dm__INP_DIS EQU CYREG_PRT15_INP_DIS -USBFS_1_Dm__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG -USBFS_1_Dm__LCD_EN EQU CYREG_PRT15_LCD_EN -USBFS_1_Dm__MASK EQU 0x80 -USBFS_1_Dm__PORT EQU 15 -USBFS_1_Dm__PRT EQU CYREG_PRT15_PRT -USBFS_1_Dm__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL -USBFS_1_Dm__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN -USBFS_1_Dm__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 -USBFS_1_Dm__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 -USBFS_1_Dm__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 -USBFS_1_Dm__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 -USBFS_1_Dm__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT -USBFS_1_Dm__PS EQU CYREG_PRT15_PS -USBFS_1_Dm__SHIFT EQU 7 -USBFS_1_Dm__SLW EQU CYREG_PRT15_SLW +; USBFS_ep_0 +USBFS_ep_0__INTC_CLR_EN_REG EQU CYREG_NVIC_CLRENA0 +USBFS_ep_0__INTC_CLR_PD_REG EQU CYREG_NVIC_CLRPEND0 +USBFS_ep_0__INTC_MASK EQU 0x1000000 +USBFS_ep_0__INTC_NUMBER EQU 24 +USBFS_ep_0__INTC_PRIOR_NUM EQU 7 +USBFS_ep_0__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_24 +USBFS_ep_0__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +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_PRIOR_NUM EQU 7 +USBFS_ep_1__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_0 +USBFS_ep_1__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_1__INTC_SET_PD_REG EQU CYREG_NVIC_SETPEND0 -; USBFS_1_Dp -USBFS_1_Dp__0__MASK EQU 0x40 -USBFS_1_Dp__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC0 -USBFS_1_Dp__0__PORT EQU 15 -USBFS_1_Dp__0__SHIFT EQU 6 -USBFS_1_Dp__AG EQU CYREG_PRT15_AG -USBFS_1_Dp__AMUX EQU CYREG_PRT15_AMUX -USBFS_1_Dp__BIE EQU CYREG_PRT15_BIE -USBFS_1_Dp__BIT_MASK EQU CYREG_PRT15_BIT_MASK -USBFS_1_Dp__BYP EQU CYREG_PRT15_BYP -USBFS_1_Dp__CTL EQU CYREG_PRT15_CTL -USBFS_1_Dp__DM0 EQU CYREG_PRT15_DM0 -USBFS_1_Dp__DM1 EQU CYREG_PRT15_DM1 -USBFS_1_Dp__DM2 EQU CYREG_PRT15_DM2 -USBFS_1_Dp__DR EQU CYREG_PRT15_DR -USBFS_1_Dp__INP_DIS EQU CYREG_PRT15_INP_DIS -USBFS_1_Dp__INTSTAT EQU CYREG_PICU15_INTSTAT -USBFS_1_Dp__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG -USBFS_1_Dp__LCD_EN EQU CYREG_PRT15_LCD_EN -USBFS_1_Dp__MASK EQU 0x40 -USBFS_1_Dp__PORT EQU 15 -USBFS_1_Dp__PRT EQU CYREG_PRT15_PRT -USBFS_1_Dp__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL -USBFS_1_Dp__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN -USBFS_1_Dp__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 -USBFS_1_Dp__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 -USBFS_1_Dp__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 -USBFS_1_Dp__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 -USBFS_1_Dp__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT -USBFS_1_Dp__PS EQU CYREG_PRT15_PS -USBFS_1_Dp__SHIFT EQU 6 -USBFS_1_Dp__SLW EQU CYREG_PRT15_SLW -USBFS_1_Dp__SNAP EQU CYREG_PICU_15_SNAP_15 +; 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_PRIOR_NUM EQU 7 +USBFS_ep_2__INTC_PRIOR_REG EQU CYREG_NVIC_PRI_1 +USBFS_ep_2__INTC_SET_EN_REG EQU CYREG_NVIC_SETENA0 +USBFS_ep_2__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 +USBFS_USB__ARB_EP1_INT_EN EQU CYREG_USB_ARB_EP1_INT_EN +USBFS_USB__ARB_EP1_SR EQU CYREG_USB_ARB_EP1_SR +USBFS_USB__ARB_EP2_CFG EQU CYREG_USB_ARB_EP2_CFG +USBFS_USB__ARB_EP2_INT_EN EQU CYREG_USB_ARB_EP2_INT_EN +USBFS_USB__ARB_EP2_SR EQU CYREG_USB_ARB_EP2_SR +USBFS_USB__ARB_EP3_CFG EQU CYREG_USB_ARB_EP3_CFG +USBFS_USB__ARB_EP3_INT_EN EQU CYREG_USB_ARB_EP3_INT_EN +USBFS_USB__ARB_EP3_SR EQU CYREG_USB_ARB_EP3_SR +USBFS_USB__ARB_EP4_CFG EQU CYREG_USB_ARB_EP4_CFG +USBFS_USB__ARB_EP4_INT_EN EQU CYREG_USB_ARB_EP4_INT_EN +USBFS_USB__ARB_EP4_SR EQU CYREG_USB_ARB_EP4_SR +USBFS_USB__ARB_EP5_CFG EQU CYREG_USB_ARB_EP5_CFG +USBFS_USB__ARB_EP5_INT_EN EQU CYREG_USB_ARB_EP5_INT_EN +USBFS_USB__ARB_EP5_SR EQU CYREG_USB_ARB_EP5_SR +USBFS_USB__ARB_EP6_CFG EQU CYREG_USB_ARB_EP6_CFG +USBFS_USB__ARB_EP6_INT_EN EQU CYREG_USB_ARB_EP6_INT_EN +USBFS_USB__ARB_EP6_SR EQU CYREG_USB_ARB_EP6_SR +USBFS_USB__ARB_EP7_CFG EQU CYREG_USB_ARB_EP7_CFG +USBFS_USB__ARB_EP7_INT_EN EQU CYREG_USB_ARB_EP7_INT_EN +USBFS_USB__ARB_EP7_SR EQU CYREG_USB_ARB_EP7_SR +USBFS_USB__ARB_EP8_CFG EQU CYREG_USB_ARB_EP8_CFG +USBFS_USB__ARB_EP8_INT_EN EQU CYREG_USB_ARB_EP8_INT_EN +USBFS_USB__ARB_EP8_SR EQU CYREG_USB_ARB_EP8_SR +USBFS_USB__ARB_INT_EN EQU CYREG_USB_ARB_INT_EN +USBFS_USB__ARB_INT_SR EQU CYREG_USB_ARB_INT_SR +USBFS_USB__ARB_RW1_DR EQU CYREG_USB_ARB_RW1_DR +USBFS_USB__ARB_RW1_RA EQU CYREG_USB_ARB_RW1_RA +USBFS_USB__ARB_RW1_RA_MSB EQU CYREG_USB_ARB_RW1_RA_MSB +USBFS_USB__ARB_RW1_WA EQU CYREG_USB_ARB_RW1_WA +USBFS_USB__ARB_RW1_WA_MSB EQU CYREG_USB_ARB_RW1_WA_MSB +USBFS_USB__ARB_RW2_DR EQU CYREG_USB_ARB_RW2_DR +USBFS_USB__ARB_RW2_RA EQU CYREG_USB_ARB_RW2_RA +USBFS_USB__ARB_RW2_RA_MSB EQU CYREG_USB_ARB_RW2_RA_MSB +USBFS_USB__ARB_RW2_WA EQU CYREG_USB_ARB_RW2_WA +USBFS_USB__ARB_RW2_WA_MSB EQU CYREG_USB_ARB_RW2_WA_MSB +USBFS_USB__ARB_RW3_DR EQU CYREG_USB_ARB_RW3_DR +USBFS_USB__ARB_RW3_RA EQU CYREG_USB_ARB_RW3_RA +USBFS_USB__ARB_RW3_RA_MSB EQU CYREG_USB_ARB_RW3_RA_MSB +USBFS_USB__ARB_RW3_WA EQU CYREG_USB_ARB_RW3_WA +USBFS_USB__ARB_RW3_WA_MSB EQU CYREG_USB_ARB_RW3_WA_MSB +USBFS_USB__ARB_RW4_DR EQU CYREG_USB_ARB_RW4_DR +USBFS_USB__ARB_RW4_RA EQU CYREG_USB_ARB_RW4_RA +USBFS_USB__ARB_RW4_RA_MSB EQU CYREG_USB_ARB_RW4_RA_MSB +USBFS_USB__ARB_RW4_WA EQU CYREG_USB_ARB_RW4_WA +USBFS_USB__ARB_RW4_WA_MSB EQU CYREG_USB_ARB_RW4_WA_MSB +USBFS_USB__ARB_RW5_DR EQU CYREG_USB_ARB_RW5_DR +USBFS_USB__ARB_RW5_RA EQU CYREG_USB_ARB_RW5_RA +USBFS_USB__ARB_RW5_RA_MSB EQU CYREG_USB_ARB_RW5_RA_MSB +USBFS_USB__ARB_RW5_WA EQU CYREG_USB_ARB_RW5_WA +USBFS_USB__ARB_RW5_WA_MSB EQU CYREG_USB_ARB_RW5_WA_MSB +USBFS_USB__ARB_RW6_DR EQU CYREG_USB_ARB_RW6_DR +USBFS_USB__ARB_RW6_RA EQU CYREG_USB_ARB_RW6_RA +USBFS_USB__ARB_RW6_RA_MSB EQU CYREG_USB_ARB_RW6_RA_MSB +USBFS_USB__ARB_RW6_WA EQU CYREG_USB_ARB_RW6_WA +USBFS_USB__ARB_RW6_WA_MSB EQU CYREG_USB_ARB_RW6_WA_MSB +USBFS_USB__ARB_RW7_DR EQU CYREG_USB_ARB_RW7_DR +USBFS_USB__ARB_RW7_RA EQU CYREG_USB_ARB_RW7_RA +USBFS_USB__ARB_RW7_RA_MSB EQU CYREG_USB_ARB_RW7_RA_MSB +USBFS_USB__ARB_RW7_WA EQU CYREG_USB_ARB_RW7_WA +USBFS_USB__ARB_RW7_WA_MSB EQU CYREG_USB_ARB_RW7_WA_MSB +USBFS_USB__ARB_RW8_DR EQU CYREG_USB_ARB_RW8_DR +USBFS_USB__ARB_RW8_RA EQU CYREG_USB_ARB_RW8_RA +USBFS_USB__ARB_RW8_RA_MSB EQU CYREG_USB_ARB_RW8_RA_MSB +USBFS_USB__ARB_RW8_WA EQU CYREG_USB_ARB_RW8_WA +USBFS_USB__ARB_RW8_WA_MSB EQU CYREG_USB_ARB_RW8_WA_MSB +USBFS_USB__BUF_SIZE EQU CYREG_USB_BUF_SIZE +USBFS_USB__BUS_RST_CNT EQU CYREG_USB_BUS_RST_CNT +USBFS_USB__CR0 EQU CYREG_USB_CR0 +USBFS_USB__CR1 EQU CYREG_USB_CR1 +USBFS_USB__CWA EQU CYREG_USB_CWA +USBFS_USB__CWA_MSB EQU CYREG_USB_CWA_MSB +USBFS_USB__DMA_THRES EQU CYREG_USB_DMA_THRES +USBFS_USB__DMA_THRES_MSB EQU CYREG_USB_DMA_THRES_MSB +USBFS_USB__DYN_RECONFIG EQU CYREG_USB_DYN_RECONFIG +USBFS_USB__EP0_CNT EQU CYREG_USB_EP0_CNT +USBFS_USB__EP0_CR EQU CYREG_USB_EP0_CR +USBFS_USB__EP0_DR0 EQU CYREG_USB_EP0_DR0 +USBFS_USB__EP0_DR1 EQU CYREG_USB_EP0_DR1 +USBFS_USB__EP0_DR2 EQU CYREG_USB_EP0_DR2 +USBFS_USB__EP0_DR3 EQU CYREG_USB_EP0_DR3 +USBFS_USB__EP0_DR4 EQU CYREG_USB_EP0_DR4 +USBFS_USB__EP0_DR5 EQU CYREG_USB_EP0_DR5 +USBFS_USB__EP0_DR6 EQU CYREG_USB_EP0_DR6 +USBFS_USB__EP0_DR7 EQU CYREG_USB_EP0_DR7 +USBFS_USB__EP_ACTIVE EQU CYREG_USB_EP_ACTIVE +USBFS_USB__EP_TYPE EQU CYREG_USB_EP_TYPE +USBFS_USB__MEM_DATA EQU CYREG_USB_MEM_DATA_MBASE +USBFS_USB__PM_ACT_CFG EQU CYREG_PM_ACT_CFG5 +USBFS_USB__PM_ACT_MSK EQU 0x01 +USBFS_USB__PM_STBY_CFG EQU CYREG_PM_STBY_CFG5 +USBFS_USB__PM_STBY_MSK EQU 0x01 +USBFS_USB__SIE_EP1_CNT0 EQU CYREG_USB_SIE_EP1_CNT0 +USBFS_USB__SIE_EP1_CNT1 EQU CYREG_USB_SIE_EP1_CNT1 +USBFS_USB__SIE_EP1_CR0 EQU CYREG_USB_SIE_EP1_CR0 +USBFS_USB__SIE_EP2_CNT0 EQU CYREG_USB_SIE_EP2_CNT0 +USBFS_USB__SIE_EP2_CNT1 EQU CYREG_USB_SIE_EP2_CNT1 +USBFS_USB__SIE_EP2_CR0 EQU CYREG_USB_SIE_EP2_CR0 +USBFS_USB__SIE_EP3_CNT0 EQU CYREG_USB_SIE_EP3_CNT0 +USBFS_USB__SIE_EP3_CNT1 EQU CYREG_USB_SIE_EP3_CNT1 +USBFS_USB__SIE_EP3_CR0 EQU CYREG_USB_SIE_EP3_CR0 +USBFS_USB__SIE_EP4_CNT0 EQU CYREG_USB_SIE_EP4_CNT0 +USBFS_USB__SIE_EP4_CNT1 EQU CYREG_USB_SIE_EP4_CNT1 +USBFS_USB__SIE_EP4_CR0 EQU CYREG_USB_SIE_EP4_CR0 +USBFS_USB__SIE_EP5_CNT0 EQU CYREG_USB_SIE_EP5_CNT0 +USBFS_USB__SIE_EP5_CNT1 EQU CYREG_USB_SIE_EP5_CNT1 +USBFS_USB__SIE_EP5_CR0 EQU CYREG_USB_SIE_EP5_CR0 +USBFS_USB__SIE_EP6_CNT0 EQU CYREG_USB_SIE_EP6_CNT0 +USBFS_USB__SIE_EP6_CNT1 EQU CYREG_USB_SIE_EP6_CNT1 +USBFS_USB__SIE_EP6_CR0 EQU CYREG_USB_SIE_EP6_CR0 +USBFS_USB__SIE_EP7_CNT0 EQU CYREG_USB_SIE_EP7_CNT0 +USBFS_USB__SIE_EP7_CNT1 EQU CYREG_USB_SIE_EP7_CNT1 +USBFS_USB__SIE_EP7_CR0 EQU CYREG_USB_SIE_EP7_CR0 +USBFS_USB__SIE_EP8_CNT0 EQU CYREG_USB_SIE_EP8_CNT0 +USBFS_USB__SIE_EP8_CNT1 EQU CYREG_USB_SIE_EP8_CNT1 +USBFS_USB__SIE_EP8_CR0 EQU CYREG_USB_SIE_EP8_CR0 +USBFS_USB__SIE_EP_INT_EN EQU CYREG_USB_SIE_EP_INT_EN +USBFS_USB__SIE_EP_INT_SR EQU CYREG_USB_SIE_EP_INT_SR +USBFS_USB__SOF0 EQU CYREG_USB_SOF0 +USBFS_USB__SOF1 EQU CYREG_USB_SOF1 +USBFS_USB__USBIO_CR0 EQU CYREG_USB_USBIO_CR0 +USBFS_USB__USBIO_CR1 EQU CYREG_USB_USBIO_CR1 +USBFS_USB__USB_CLK_EN EQU CYREG_USB_USB_CLK_EN ; SCSI_ATN SCSI_ATN__0__MASK EQU 0x20 @@ -1960,6 +1904,72 @@ SCSI_RST__SHIFT EQU 6 SCSI_RST__SLW EQU CYREG_PRT6_SLW SCSI_RST__SNAP EQU CYREG_PICU6_SNAP +; USBFS_Dm +USBFS_Dm__0__MASK EQU 0x80 +USBFS_Dm__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC1 +USBFS_Dm__0__PORT EQU 15 +USBFS_Dm__0__SHIFT EQU 7 +USBFS_Dm__AG EQU CYREG_PRT15_AG +USBFS_Dm__AMUX EQU CYREG_PRT15_AMUX +USBFS_Dm__BIE EQU CYREG_PRT15_BIE +USBFS_Dm__BIT_MASK EQU CYREG_PRT15_BIT_MASK +USBFS_Dm__BYP EQU CYREG_PRT15_BYP +USBFS_Dm__CTL EQU CYREG_PRT15_CTL +USBFS_Dm__DM0 EQU CYREG_PRT15_DM0 +USBFS_Dm__DM1 EQU CYREG_PRT15_DM1 +USBFS_Dm__DM2 EQU CYREG_PRT15_DM2 +USBFS_Dm__DR EQU CYREG_PRT15_DR +USBFS_Dm__INP_DIS EQU CYREG_PRT15_INP_DIS +USBFS_Dm__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG +USBFS_Dm__LCD_EN EQU CYREG_PRT15_LCD_EN +USBFS_Dm__MASK EQU 0x80 +USBFS_Dm__PORT EQU 15 +USBFS_Dm__PRT EQU CYREG_PRT15_PRT +USBFS_Dm__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL +USBFS_Dm__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN +USBFS_Dm__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 +USBFS_Dm__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 +USBFS_Dm__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 +USBFS_Dm__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 +USBFS_Dm__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT +USBFS_Dm__PS EQU CYREG_PRT15_PS +USBFS_Dm__SHIFT EQU 7 +USBFS_Dm__SLW EQU CYREG_PRT15_SLW + +; USBFS_Dp +USBFS_Dp__0__MASK EQU 0x40 +USBFS_Dp__0__PC EQU CYREG_IO_PC_PRT15_7_6_PC0 +USBFS_Dp__0__PORT EQU 15 +USBFS_Dp__0__SHIFT EQU 6 +USBFS_Dp__AG EQU CYREG_PRT15_AG +USBFS_Dp__AMUX EQU CYREG_PRT15_AMUX +USBFS_Dp__BIE EQU CYREG_PRT15_BIE +USBFS_Dp__BIT_MASK EQU CYREG_PRT15_BIT_MASK +USBFS_Dp__BYP EQU CYREG_PRT15_BYP +USBFS_Dp__CTL EQU CYREG_PRT15_CTL +USBFS_Dp__DM0 EQU CYREG_PRT15_DM0 +USBFS_Dp__DM1 EQU CYREG_PRT15_DM1 +USBFS_Dp__DM2 EQU CYREG_PRT15_DM2 +USBFS_Dp__DR EQU CYREG_PRT15_DR +USBFS_Dp__INP_DIS EQU CYREG_PRT15_INP_DIS +USBFS_Dp__INTSTAT EQU CYREG_PICU15_INTSTAT +USBFS_Dp__LCD_COM_SEG EQU CYREG_PRT15_LCD_COM_SEG +USBFS_Dp__LCD_EN EQU CYREG_PRT15_LCD_EN +USBFS_Dp__MASK EQU 0x40 +USBFS_Dp__PORT EQU 15 +USBFS_Dp__PRT EQU CYREG_PRT15_PRT +USBFS_Dp__PRTDSI__CAPS_SEL EQU CYREG_PRT15_CAPS_SEL +USBFS_Dp__PRTDSI__DBL_SYNC_IN EQU CYREG_PRT15_DBL_SYNC_IN +USBFS_Dp__PRTDSI__OE_SEL0 EQU CYREG_PRT15_OE_SEL0 +USBFS_Dp__PRTDSI__OE_SEL1 EQU CYREG_PRT15_OE_SEL1 +USBFS_Dp__PRTDSI__OUT_SEL0 EQU CYREG_PRT15_OUT_SEL0 +USBFS_Dp__PRTDSI__OUT_SEL1 EQU CYREG_PRT15_OUT_SEL1 +USBFS_Dp__PRTDSI__SYNC_OUT EQU CYREG_PRT15_SYNC_OUT +USBFS_Dp__PS EQU CYREG_PRT15_PS +USBFS_Dp__SHIFT EQU 6 +USBFS_Dp__SLW EQU CYREG_PRT15_SLW +USBFS_Dp__SNAP EQU CYREG_PICU_15_SNAP_15 + ; SCSI_In SCSI_In__0__AG EQU CYREG_PRT2_AG SCSI_In__0__AMUX EQU CYREG_PRT2_AMUX diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h old mode 100644 new mode 100755 index f19d0762..4f8d256f --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h @@ -52,17 +52,17 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#include -#include -#include -#include +#include +#include +#include +#include #include #include #include diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx index f01cc26d..658cb56b 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx +++ b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cycdx @@ -8,82 +8,83 @@ - + + - + - + - - - + + + - + - + - + - - - - - - - - - + + + + + + + + + - + - - + + - + - - - - - - - - - - - + + + + + + + + + + + diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit index 73b4316b6779d21b4d65a4cc4c334fc8c7a78d8a..9cb0e8a8537b6dccc8d62d5cee5754b378e7487f 100755 GIT binary patch delta 208084 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

KqwBA9mC70EZeD5ggIv=UDm`JO6wAZf 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 LgPXAbPp$t43Chtt diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj index 15b75070..d2665e23 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj +++ b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyprj @@ -1761,14 +1761,14 @@ - + - + @@ -1777,7 +1777,7 @@ - + @@ -1786,7 +1786,7 @@ - + @@ -1795,7 +1795,7 @@ - + @@ -1804,7 +1804,7 @@ - + @@ -1813,7 +1813,7 @@ - + @@ -1822,7 +1822,7 @@ - + @@ -1831,7 +1831,7 @@ - + @@ -1840,7 +1840,7 @@ - + @@ -1849,7 +1849,7 @@ - + @@ -1858,7 +1858,7 @@ - + @@ -1867,7 +1867,7 @@ - + @@ -1876,7 +1876,7 @@ - + @@ -1885,7 +1885,7 @@ - + @@ -1894,7 +1894,7 @@ - + @@ -1903,7 +1903,7 @@ - + @@ -1912,7 +1912,7 @@ - + @@ -1921,7 +1921,7 @@ - + @@ -1930,7 +1930,7 @@ - + @@ -1939,7 +1939,7 @@ - + @@ -1953,14 +1953,14 @@ - + - + @@ -1969,7 +1969,7 @@ - + @@ -1978,7 +1978,7 @@ - + @@ -1992,14 +1992,14 @@ - + - + @@ -2008,7 +2008,7 @@ - + @@ -2017,7 +2017,7 @@ - + @@ -2076,6 +2076,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd index cf1bd426..9b19422c 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd +++ b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.svd @@ -7,7 +7,7 @@ 32 - USBFS_1 + USBFS USBFS 0x40004394 @@ -17,7 +17,7 @@ - USBFS_1_PM_USB_CR0 + USBFS_PM_USB_CR0 USB Power Mode Control Register 0 0x0 8 @@ -49,7 +49,7 @@ - USBFS_1_PM_ACT_CFG + USBFS_PM_ACT_CFG Active Power Mode Configuration Register 0x11 8 @@ -58,7 +58,7 @@ 0 - USBFS_1_PM_STBY_CFG + USBFS_PM_STBY_CFG Standby Power Mode Configuration Register 0x21 8 @@ -67,7 +67,7 @@ 0 - USBFS_1_PRT_PS + USBFS_PRT_PS Port Pin State Register 0xE5D 8 @@ -92,7 +92,7 @@ - USBFS_1_PRT_DM0 + USBFS_PRT_DM0 Port Drive Mode Register 0xE5E 8 @@ -117,7 +117,7 @@ - USBFS_1_PRT_DM1 + USBFS_PRT_DM1 Port Drive Mode Register 0xE5F 8 @@ -142,7 +142,7 @@ - USBFS_1_PRT_INP_DIS + USBFS_PRT_INP_DIS Input buffer disable override 0xE64 8 @@ -167,7 +167,7 @@ - USBFS_1_EP0_DR0 + USBFS_EP0_DR0 bmRequestType 0x1C6C 8 @@ -176,7 +176,7 @@ 0 - USBFS_1_EP0_DR1 + USBFS_EP0_DR1 bRequest 0x1C6D 8 @@ -185,7 +185,7 @@ 0 - USBFS_1_EP0_DR2 + USBFS_EP0_DR2 wValueLo 0x1C6E 8 @@ -194,7 +194,7 @@ 0 - USBFS_1_EP0_DR3 + USBFS_EP0_DR3 wValueHi 0x1C6F 8 @@ -203,7 +203,7 @@ 0 - USBFS_1_EP0_DR4 + USBFS_EP0_DR4 wIndexLo 0x1C70 8 @@ -212,7 +212,7 @@ 0 - USBFS_1_EP0_DR5 + USBFS_EP0_DR5 wIndexHi 0x1C71 8 @@ -221,7 +221,7 @@ 0 - USBFS_1_EP0_DR6 + USBFS_EP0_DR6 lengthLo 0x1C72 8 @@ -230,7 +230,7 @@ 0 - USBFS_1_EP0_DR7 + USBFS_EP0_DR7 lengthHi 0x1C73 8 @@ -239,7 +239,7 @@ 0 - USBFS_1_CR0 + USBFS_CR0 USB Control Register 0 0x1C74 8 @@ -264,7 +264,7 @@ - USBFS_1_CR1 + USBFS_CR1 USB Control Register 1 0x1C75 8 @@ -303,7 +303,7 @@ - USBFS_1_SIE_EP1_CR0 + USBFS_SIE_EP1_CR0 The Endpoint1 Control Register 0x1C7A 8 @@ -312,7 +312,7 @@ 0 - USBFS_1_USBIO_CR0 + USBFS_USBIO_CR0 USBIO Control Register 0 0x1C7C 8 @@ -351,7 +351,7 @@ - USBFS_1_USBIO_CR1 + USBFS_USBIO_CR1 USBIO Control Register 1 0x1C7E 8 @@ -390,7 +390,7 @@ - USBFS_1_SIE_EP2_CR0 + USBFS_SIE_EP2_CR0 The Endpoint2 Control Register 0x1C8A 8 @@ -399,7 +399,7 @@ 0 - USBFS_1_SIE_EP3_CR0 + USBFS_SIE_EP3_CR0 The Endpoint3 Control Register 0x1C9A 8 @@ -408,7 +408,7 @@ 0 - USBFS_1_SIE_EP4_CR0 + USBFS_SIE_EP4_CR0 The Endpoint4 Control Register 0x1CAA 8 @@ -417,7 +417,7 @@ 0 - USBFS_1_SIE_EP5_CR0 + USBFS_SIE_EP5_CR0 The Endpoint5 Control Register 0x1CBA 8 @@ -426,7 +426,7 @@ 0 - USBFS_1_SIE_EP6_CR0 + USBFS_SIE_EP6_CR0 The Endpoint6 Control Register 0x1CCA 8 @@ -435,7 +435,7 @@ 0 - USBFS_1_SIE_EP7_CR0 + USBFS_SIE_EP7_CR0 The Endpoint7 Control Register 0x1CDA 8 @@ -444,7 +444,7 @@ 0 - USBFS_1_SIE_EP8_CR0 + USBFS_SIE_EP8_CR0 The Endpoint8 Control Register 0x1CEA 8 @@ -453,7 +453,7 @@ 0 - USBFS_1_BUF_SIZE + USBFS_BUF_SIZE Dedicated Endpoint Buffer Size Register 0x1CF8 8 @@ -462,7 +462,7 @@ 0 - USBFS_1_EP_ACTIVE + USBFS_EP_ACTIVE Endpoint Active Indication Register 0x1CFA 8 @@ -471,7 +471,7 @@ 0 - USBFS_1_EP_TYPE + USBFS_EP_TYPE Endpoint Type (IN/OUT) Indication 0x1CFB 8 @@ -480,7 +480,7 @@ 0 - USBFS_1_USB_CLK_EN + USBFS_USB_CLK_EN USB Block Clock Enable Register 0x1D09 8 diff --git a/software/SCSI2SD/SCSI2SD.cydsn/TopDesign/TopDesign.cysch b/software/SCSI2SD/SCSI2SD.cydsn/TopDesign/TopDesign.cysch index 7def179fab86500482f0b81f03cb1f32b186efae..5eb78a54c42838b32652ab3316036aa39c2c6fa1 100755 GIT binary patch literal 163856 zcmeIb3!I-vb>ID8VG(06b$|lly4F6nWGu;&c6D=XS=yB)8FY&z8)Go?O1rvX-B_(< zivShW1xmQMgj`5zh)GB(X_K@iZ&RA&V@$%^H*pA`kb=mw!O)kGkhe_}la@pV^Zveb zo_U^mZvWe^q+R*H`}seYd1lU>IdkUBnKNf*9(>tljqvZOKL2+0*XEz&<+3Na&Ob+Z z6wmX|XRdsrZ@XSb8mAi@8{>_Wjl+$DjbnP6Xe?Fe@y1d8A6LlI#&Ba)-^X3}>Ba`d z*xxv$_@@+hhf6_f;totT`kqoYAf*hp=r+_?(HLwjYb+O#{d!u`Sf!_Z3SFXaEA?fq zp7tqpr3)KZoWaHccOBJzOrhhtKKt(kSMY%QJl&2q_BsS69O`7=_tgCP=Y)a&C^EmR zzh-Hom^c3n5u*4Rx(e1Ey0t@ujlvPaoNnwEZsFU>#x@mxOjsUiY|(YpJx@T4D4y@~ zdbZ^SJyr|O8pTD*w1BvBuG3mF~+NJ=O}!eit^Rcx&{$Ml>2%3aGPRpnpiv z=ATQ7@dCX-lKrmcPBgYF(NRV3d+N$7pHMMhoPM9smq~r0j_(uMCI#wQ4wRxTN}`Ra zLQghMs6?YG@fN+o7^7*`!!S|&j}-gLCkCbzcA(Tzam2M8n%v?>zaXDh zwGXNm_qq4H0KHjXmWn3!TP{isidLi>QDZ$KtnL%E@y5+!uyH+4I@m{CjGcOiT!)p% zYxMPWgT{ETo{qWrq(9QQTmK>rqG-QBFHAFeko8LB1Nu2O#clsn>Z(6Q1!JsnUO*p9glh7!=p(2kcm zmRqe57;c}iC;oWCXaed*BC-yeQs>sGA>013@DI!LwXS$+qpJhiE+9dxyMR9u2EpKvu=%_}PcURgFHT(ZvzyipNszkV>qT9FfRNUL5e z-dQ}&)&NEF)ShLnf);>!g1{Qp{}RVP%M(6B>W?W5K3neiY|O=9E%F>tsuc=fp)W{s z7;OGIlf@w`wX1j436wGklO}>@F)noJNRX~HUeEzy&_yH$!wFWrVz7znc3NjIbf z^*XAWgBUAB0F=>DS7^Sj(fbC|Q_8Qlhmg2jUNTjIaae11cE; zk(Q4JW9=RNhqBqAYNf&nK^;YKrX}*@O+QE;Rr{}M>1TT_J#FdJ<5)9BK1t!U zRZ9rEqe1{he}6V?h~hQMDJd9gG_{EQ+^1L!g;zVIO)6pFp|BLeBo$JYLP7`%4AqB{ zg3Ujd*pwjpO^vOp6tg>xH8$ya!i^Uv8|yUw+pB*_&LG;x7n^j)T9q?5_~B4C;yx)m z4&}i@RP2<#+!J-Glj#qKhE)w_-xSOWCOG&+DoQ&9rsOV>o-*ua@$n*+vn4I=!qf zZNhq(H_&0xanTo-h^d%}Fx_{#7!IqLS;$~V({!$Nz>)hat>38JCI!d?%)7LWB_hPt)BM?L=8a!bpgLCL$ndCA9_?SZZ zF}7e7!pJI>7T1c4s|3^@Wip{J^wM=>jK#BrM~X^M5%;;lGjE)xJSi)GMLHxrgeB25 z^5v2kj7c%R*^~&TIdnlfxfS9pIyqBw28mihHoHR>_yy(c^dw z=LUyNx5x3NP51!S1xbPZgel%7;sQDbo5k3#P{M46gC`8{^fstLSSGP)Fh7~flIJF} z1esB%Y5Yl7GQ%tXy}1iN^Y68X*~7VIyJTvUh~g2kMij%qDYy7RUS^xC)kmTjO~0uk zyxB#-@{wlX=WQp&xlOyWC}x(wDfrj82p9=d@SfZ6uak07j2h4s><$-!nFj+qFvS#2 zqwlbMHPlKm_LaRDGDCvek`kIZfrREsV#9`j_#KZTQiDWhZG?myB@7s_^gVU$wO<9l zFDTFHsKD8D^y}UD_2N%S`)a_I<=U?XG%OCZAie($OfC2`BbhmmEIg~4z}rS7n(nNU z_wd;&x}SE8e9~KSupW;~O4BDZFOK|1xAPVoq&2U)XnTK;iX3t4sh(NSSl8Q*# z$BN86q%6`NK{{BefIX!`v{R9J3u)DmKR=N+SDXi!N-GZU-HfrX^{ihin;fTWc-ozg z!Bzh-J*^a1Iy5ULAsPLnpYb##PQ_BoOg}Bw^fNq3m^WtHoRoa?re*>4k{h===Dy8i z%QKYkLZbLiWj_C$xdx8wIg0nWEAp<1_%o?6Fh#=t#}}T}tS*VC4y4h67Hx;_*mT;dbXIyiak z^A_ck6bqig9>C0uId3vz^RqM*3Vy;4fUSuq=4I$Zm`6pp(mxCeZA51j|FD7fG7Q5d z#LQ$^>L6H*;^`g5hXg}16QLQfCDT0~OwRQ00pTllx^cg%Z9=(LjUXQp$adHyFTgI% zk;L2;!R1jy&PNzuZ!G4_{CIu|{8BM|+brUwxP^!tTvYR&>t1fxH$b0H(&Dh7tPz7U z1-M)-hxvVMY-Y8^O95?+HfGj3=24OL-W$j!%0`nGC!pSzg05gCf@8y}gF>mI_@9ah zQT(90(ryJM^X%|YydY$3eo)bKlW3JN%Cz0?TH{d_iMiR<5Xxo2E6P_V(xe?Iz9&27 z=zy39Lcj#x`}Qq~us~7sQ^%Q5MgYw}m&vs#K5ewxu3I~Dq>d-Bvf&d=pKfYfAe`T4 zdC_jHu+1{j<5nOd8JT_E@--^oyKFgd!p>Ed|oF+Gf`0`6$)HV=kbnvMvy2Ia;~)GPGn z`%Yo#>yLTs-Kylb2wdM&mtX!}ee)Xa(L|v*EL>pWi~*wfb)rClk(BZth0biX!n_l1 zS;Z0OurT2%Li48{`QgsbPz$ZXW(`rzpo3`>rrP03L2Y7yV;sX&`x+G@X}&m~Q>R!i zV69+0;R#~i*4Wt&B(1Vc0=RBEB-kdr$mg(-5Jdq;0jW+VIa#%URS++2KmP!0o1O{@ zkcLz{vX40}NI^P3I4ic!%az0Yb2RuU{s~=`>2$}>RTHg2`~0ZoLeW4NZID$nRy6o^ zg^-1>anhtf7{lRaS}*Dp#Y5>rA7pIm&7s~mudiRAsY^5-oLv}g(z=lR6+N1lb`$z| zzl=Y51{j!vM13{}?c*7lOmpb#f4navCn|Iln?4^JhUhAS(ieM<6lp&O+9!1J&p9M$ zIeD*|X;-k+$<5&ucEVc_nVAUOf6-yFXCO`(`7rxw>jId+vNZry7@Dk!QN}|!->eX- zNi*`I(Y%YwB^VYprqe!l3e{u2Wgzyz5~m=>YqSEa>&&mf9<~wyTRSr=hy%nsIycur z#YANI5!}EOW{Z4<&Ob+i3PXx^+eck3>=yqZQpe<%~t$JABc)%e-D4T4*^Wif z*8w*eKbWX78y@2|BlJGqvEAW}f;xcp4t_IEADF`bsz?*YZh4ygJB0)^;WdhX)m@Dy zjQoWm16L##js8P=b{(+~yuT_Cy`vQKbQ(A?MTb`Y>)+6qSpiTM7oJte-zOBlte5%kQs-HQ$2R6B)03GAX_kiXn6EPT!JAb9*$StbTD3yeV6lYX=_s*HvbNNg zD*2)HJt|?o%H)!*uzZz$SRp}`@fyWH<*rs`bOEB*i*=*Qu)Hv5&l0~1`=HmfyvjiL zUKWdc1gstQuNNt%G@v<}10X|&bTI@90LBJHr3ppM)5r&y-z+WIcX44rj+hf7%OK1| zfsjWArDEQ9R@sm#wK~xE4NO5-5owWb+eDoGVgZ(A9#@u=j%h|+-wgY}9yq{fda%cnLt;mT^}qk;{?&OJ8GXn}wTY4NR&Xc6+lCeg(#({q^~Cp)Hx zSLl|yrNNVKN#tp_EQ#SBiuPQl2P5i`Kfc}(f9!E>kG1|LW8-@-^`c-jX z8Xv>H;(HU0A9a`IS(+lj#~X0156EgWjfW;NFa>EAo+V8(jA2AHp&$_LLvAnA3s~fa zIZ^!k3R-v;AbpILMx50J-2ih1;(Os)QoDHv##slQ#jpC2EYgwhdOW`(0{+oKr_ZQeWyj8`|d(X}#wqCzvk;1iK zz5Kh_(4aiO%fH)boVi60$sf;~MjDMz4r>MWA1P4erh+oF*j{zzESo5{610*$sgEfn zAT_U5lXZU1-Nq2jNuH@BbA#j%<=U@`hPwN|BH@ZEzG81t+;()g{Lsbk58=0UNH?qS z)AL^y*aSLO9L$oaVW_#NYS@3w>tLVmX8yB9+SrFMm@x1|$z#-m)x%r7t==;Y1FMhg zK@#~xrM6R^y7kG~M60(fUhj6pU>YlRq+onX5!mGfUjmTEUTO9_G*c@kdMD#v3c>Ow z3W8>jB`+M=-Xo-aU0wDh0xgRFrMn`TqWG-4p3pU5a$ckO&F*UQ$%wNf*}ukI8OlR~I|X4n)nG$~VWBwbx~LO@ zSV;H^;$!<+=KdKBU|D47#IRsUU*RxJZa8`{Vas3vZ+X^6V_!65c{(f@>af%m<0aqw zjfv#h;B#0NVbki_wB$U7;6ZKJN*YEz=CW8O>AE&ans2E)l{dY|WM+?Ne2H;@O#-mc z&>(F~00@We8J;z>8D=R&Fk@4!_}Nrch1u+=`c7CaXC8@SxG9R4xGRjRQhR$fbGqm$ zfxY@wiUIe+nx|Zq;-}02j2%EI4vsf9WQyW%xorL-%*?As8N|B;g-xOYBSaR-JJS31 zUnq~Tze&*BVeWiQczEf&2m96j&=#5?lyahOMCu|fh=cn#Ut9A3l*UXeCU(q@n|3F+Bp9z;@XPv@heAu>6e5uHbu ztr%WzpOl7*(XM*s)$G_8C@Uv}uKlteofK!{MaO&5YIY&^1uE-%@{LVs@4GyjK-e67 z9jSg3_2CXxMLSKqwfazOda7V_EmQ+UsTsPl>)VW%8M919z`BcaffzPV0b5*XyLzA< zWmbQRR%nP({2c{G@!z{Ejx@@fc-u69VK9T;ip`i%Nqpn@`Xi0T*B|-dqyKwdv4J4X z^9|&GDkNwiyhia~yQ?W8bc4z>lc}`TEh0W6(?iNT5WK!_tUjt= zmu(mv{Lu}98tIh=lsS#&xlOXo*8DgX4h!8*buR}6C5ox? zVwu4_UuHSGhGpipmgDM%8DCJMnPDzJB)QlP&yV+@7v9gV!HMA-jMMoIOhxe%?w;!_ zDp{27Yq$IX`$Z&%-(&8{Rvh{ru6R3{GVS`$HX81Ci=5h(tu_O6*DG`tr;sJvk>T-- z5<~l8(j0-C)wo_XhismmHi%b%V*NnZfXjJR#X9)LrJ0UNoS2?9SWn^I+P$P5y@kTDO3w-P=c#9&{!{4PoXFBchA z`TEY!b|$$`5Q}U&Fhv{bf4taoe#G&+jr?hD(tX9aL2kUNak#5BGwX1JC`E)){dti9 z(sGVT4Lw$HzGgWU>Jh@%j0UtIx8%TUuY9Dk8OUb#vo{La&Knk8FtB=i3eL{P6Dk?| z#TXdj(9$l3hVOeM+6IG7{)_E~@tE&%&bsFTU4ur!YZRkD8aUI_)K)X@uHWsCjeDgJ_mQXO>6-`wU@yJ%OO*{2pH8QL!ciJ_vj|T&19Coc6VjxX7gvy5h zB;!Hb(Gzj3*QVu<;#avS*Sl+`iYbu` zF@sQ@-t|8erybJu^e!ATCp2QQo)}XRd)T+jQnRNiHPubZtkfSc(ZCe!T9)oMTnL$X zsZs^fo!1sxQ8{N6rzjq9Nln>N2jSi_?dAG_#9pwDNa0Q1~9F4C`?|2Nhuo4+(mF@sW^rhly#2`Yzl`d(1eSnK9@ z&9;eW?!ntmj)~{}ymk>OGt1-}*%d;d9SL96!&nOwN&bhvZHkv7JeXu)sSZ4$pEhSdBDHfb}CFuGCzyMy|wN8^kiq* zq-~Ch$l6?p***a?N<{JIK1YvDLBUy-#^9>`qLm6p-dVxIyoZ%H%TSn}V9nk!Ej(!h zWlC8T5&Z(;tyoxp1(o5^%!`P2AQngD);{*Ail}q1P+e@}Ajbj)f_;z36~*h_HEZu_ z1QB#tbe(?j1&B#ETs7DLgtG{kCNQ5fe+GeVGlXzLa3QdmWT1y6gjg%|Oe}AcJna}@ zgG1ljRfcnKBe}Owl4!>?_su-{qWD(#mYWBQ;@e%|9qx)Lr^taJ`;|syg3G8r-&_^4_Z`5pOh=2V2aKg0RDxo%0 zK7QG_H7TjRu5gKbc&}c(V9dmvIp87Q4C#K|(KL`8#`s0yiL%0ycVeE@KRxo{BsJ++ zg@)K{LwMH9m>oi*uwr-qxdpB`nL=T;8xXWu*`aSj-%~&ILw~Qm$ONPDt`|M`#ee)q z?@5K0d09}9r7D_jMP;r_*?Dh8iL2eE`xwHCVMy*p<<=y*ZSj&NcS19YcPdRs*&;Q= zitI33N5?4M8)l1`@V$z!Os~U*eM*oONqh-6CH3!<&=owQ?<0*HHG6Jsj%y^&j{S1P zG;W~_U8Ds(F!gncM+3`xL(;LXquL3S&;&u)cBuY>Fc zyU%X0lwGL8ur~>f>|XJ-xx&_vF_a70F7#fZ(h3TiURoklu&ln=LjY|BFJP|*)nt>` z-NJ;oi+|9c=ninKv4xTBV6s=DmjBA!&4t|S!TCZ85;m{Qm$1L&uo^H@h#J#sW$hZ& zE)zh!!O8|?oBaz#B@Rb{sN}V37G(Z8zh!1SlO11BJ+#wR7F8=dtfIJI?WN^pk{^}g zl{e`WAQZ{j>Kwzif92^6cmlON8-l@JWu~*q=8)Sz7|kE$^oP_Us! z(c?afpQi-By7}tV9UG-oCQNsIw!6Mq*MX^$zqmph{O}k5h#ty4=|X)C?P5`UgNvWC z0k2i+TOgyBxhTus)i?!%U3*R}e<`fmX=G1Fy{;X))C(W;Dq!ORZ&19LZ3$yyl|t5( zjrzqLnJNgYmKk`FW3^Dw{k&2IV0rC0=XP|&JD=t{;-$u(VYhR!ZSTJ8fxGLqM^g?% z-XBu@fcJTg;+5`N?!(OtJ}?ECL^Uy!Lw03-xBWMN^0E9qQ%BVLv~0x`Si|(JL+6G0 zR?4f?5qC9AlZ_|oe3>G|0&U*)4CxVT-r(o0A6`;KaWlLAH(l;#yLYR_qxjFmAczvh z|04*}YobrjghpsfQ2naqgzT&XXO0!;02a`jld5gvX*0Bhv9&yVno$+(eSo>1Iat;! zvmHcm-XZb}sxdmSHOqC>8kn-WIU>@t-QT-i6@15)|L=9pYVuCK%|Ca&`x5fpCzT@L zIbNgq-?(e24UD)D<2e=EukXVBjh$xw`mT9YO%(r)yB^Y2n`{DRV9Ihf-RE)#%ru~9 z=~)2#70K@@(=VL@dp3@rwtR-SY=zs-&&rTD{EfHlNmVLwG8JG&4<_D&*Bzh;yfvL>tY#vo1;0-o!;Wsd47QHCGS;2XO;TDBZ3Ad3TG(JZ0 z)>7o{N#q^6%ToCc7r{ENUGDj62gD4=uU80=-=KS+O-?*~_2Q5G&BI?zCMTkJ)Fmog zo1=I?iSjv&yU14uIZ!d=aL^+Ej*DRE9CpuDknbh3C_W}YuXSd9Uxh1FnHyzZ&%c{) z%trLb^sRg*PgR)Lr&+4%Nq?*sqZ9g4ApJyb(m= zdu`-1207yZQ8YA%<0!zYT;>>cy_mS*sQRn%H!@c$=N@labXPG;_sP8Hl$p zi7e%5a156-Kf}z1iSy45Oi??DSYp=>TuY9sN|`t1NP25|NuB#iA#9PxXye;iXx79=qtVYx=}e{cq6YB{ zp_7(@5wr)7`%s=RkY`eQ!nhKc>?veLa-UV1uDD}Z@|469-Aclq93(9|75|4e8%%yE z+p`(lfd%SXGa z{9R(sOVg=$ZcZQsa{ezJSFCZ@JZ~76MDbep%@kVgeeK>%Vi$Ghr73Sk@n5)jf39ng z8Lw4Nvve!4*}xPa=#+KaE~eppvd`;F|KrbhkT3xcOtodG+@PrZLbetRbu?z`%h=is zodKFR`w`9?A}sE|G9egLy_<}HEnD0Oc(Qbka}PWBtR#MPw85uq?sCR z!#(<2kz~4qGIS6eqBC=SP~z_h73Hx-S#fRz3kq;EJD?}_m15nyEiACH7*>0%_2xIr zK49jI#$mo}p*HCHYa0~_qzd^n?wSloZFoQ#)zdx9O{WRi7WB3!`wxEbgMcJfYi4&1 zYweenGAIMDQT(snHO%^TF2u4{gk+4nOQG$keRaD|+h+X53HF4BjAiYhM7)Uod1|=KMfA7yo|i+#-OKauE2Isu zED*P>Lm~p)itV%+489llWx|h$;iLVCF(M7=h1&!`C z`g+<8ZrF(9SmS1W!O0QFyVkpzXY?2^(BrSBMGrPNnyWj!XEgaY1)6lnBU@EZ)ZyIc zksAy2_{*+%#M9%|8f-wBx!h{#TtX>=C90VOKw^a3QkoPoF<9QFdG1lB*afc;J@PY# z|DcX2=x=z9VpM4Fd;OnWl8?JL|SJ5^Du>qkfmq4I(pyX8Fcl zimK`7DE?xY61$x(CkaJ(y73~)li;Jxg|T)>s2-5WN2>~UP{V){Mq{8hsecB?tWBv# z!S7FlmovRcCN)zuo@HoUmB2^Bk0p{MjdO*?VJaCM{I=h|eWme|?M{7>Smj|D(jx6G zC=!Erz_F{-F)4w74bMbK!D5^hrF{0NN9*7^`K4LrjbDtV%G(MsqY4ZB+ zz*Ir|tIN^C`^eZ3Y$xC48yk%`&Pcwfo9*X&h4LJlk$j)gNxo-Rs=S{bR+4Gc`La&( zZ9Jqr-#R1ZMJaEe&JQZzU!9SBpV?8qA632&%}Bm<0qvI;I)8pf@q9e$y+cYnjCevvkn&@Y}aB8#40l|xr$ z_%o?G@N6{C3}F><*kU{}{3LMzihhQ^g(2Wxx10wAP3o{Nfb9ti@-m{AWlw?G_s%xO@)EoYu<$ofy8x^oiA&@GHA)z}K9ehtbTA zFEnnp?I6d*`M5!_kP4F!`yE)nfFLSa#+Z)54m28i(tPWQxTD}f9=j)KyDBj|(xi;fRzARkx6RRvmE$s5(Z3&k7=_PBK`ylhCDxSl8?=MzTY2$1M)i>c$_oWl++SEstfd4^qIIS1(UZN4`i1rU z65{}UC02O4R?JE!)l&H^wWuRikuS$C?y-z>b7eqD}=!wcl_ISm7pnSbY>QT7;TfJ@iGnN z9vfB?rMW>@gq%%34or2{-mx8b$`mM%({Ar2iZfr-J_W8&wY?Cgc*wEC`_gNdOaZ*_ zrCkDVbO{E$b1~3D$RcYxB|4VkX%pQ$Xtvq(8rQqVAu8idr3E>T%3Qmo@-+^gZ+ZyZ z_2-YuXqBB(nYMnxsSH&Xz{^JEPdF-bod%V^H>~-12k1QU@Qb>j?h7vhba*)Hk7n-*2;6@*632(Z0=zp-AY!8*)}*S;U=qNY$%FL*on5!KXB zXYJrKt~gvftf@r4oSE<7`M1UHt4W_jfgK2I;?;`%vhZYALj2aIMII~RU#nz zV~*%tyCZtzI}TnH|KASK|KqORP`7Bg2)ooi_9*R?x=bZraOy4<(+y=T{S`+JuH8}h z%ykZ4*ntj>6j<8M6+I6u&B(e_qBDxU;6!JlGGOU%I-+y!j_8f|I(VMwpKxylqT7k0 z=Yi-~cR}?2nIO6fNGA{)!*QO462D$qVn!x{d_3*dpwY%DI@a~k> z_+K5M^CVyfx*+?486tb$28okl`@uw^QAF>BXQf zy7Id->TY)A;My^DH@ZZbz&MZ8waNIx>~o7rFUT_!s_ zl?-tD1*h%_M~#%aha6G3c1hh$4qgz)q~_Za~m<24sB~M8D-C5Zz4^oyr>b z#~jhQc1Lsv??wsD>CS*OrLN2s!ml%y-f%Ifd%0B18#C&D%2AhVht$=2aF@tLCyFaH zK2PRfLGPHlBQrzYZ*(#saPvXCpf1Ux_%|GNxpqw5$6daTx(+HGlL4La0l}s&sC(dX&|4}xz05l3CF9a7f|VCF`l>u)^Q#kU=l_a9~~U)5oU`QAAr<-M$x|^fQh@gP>Kn@U z<1>_b^1ZwxI{&2dotgH_5{mZgmwcr(xir(08!T;U zKi_|^d?k`+AYZ)J+s_xx{9`rwb~YHnr?^wi4PWqS4@L?u3(GZ^KhyyQenk}cNmPv= zJOgB&Os`#bhQNDwI{(JoN7XeN@SMs~UD=%xoo3uA(V2&zHqos_?ep2E9aT~)UoL5{ zLx*(jkjhbfnM-8q@@E{>^G4l^=0t7-<@TxjdC?(I=$`MW%e6!5dWG(D4xWEA=%r>x zLo1B0XM&}v*-lydqBxOb!wJUM{f_8dyCk}GJ)Y=v2&alh4VDzM=hlqNkvZd2jyw%! zIhQ!1bM2DoRN|XbX${fe1kvf3yo(qsy3Yg2=Zd4bvsI2|mW~@8$+=F0X|eYx^||BU3@*;xGDs?tp}lJ7G*p|fc0%PUt#k!oNHCpZ>u;$v0ZB>6GLXlE}C zzm}J?&QI&i)=@3kooL*nCFHNye||qU_SoX&_+#44iv87Q>zRj(g?T$=uiFBKLnGL( z%kLSvUzE9+tH$fLPY%}J)4-z`j}Tj8PE*48$S>T0_D;ReKgaxVxC~rf;#61sa_R1? ze5vtIz$;^}?BeVA_r~J5D1NcKA|0-L zBCLB_()63D@s?N#a4Ymr<65TQDm68>H(RD=z|)W#;Gh_hEx=amJ5Ows#QC9|0JX~9 z@k(ZMDQxaR6R^EcvhzTq7~?7Di9C;_+dEbXRmfiADr#tggEQSa5hDzDRZL*sUB z*04iQ+x5InUy>~wwEw#kjfkwG1h`RQc?oblFI9PMalGUS7v;_FN|8D_Hk@7j+o_+t zx>?sYi@TaX-BnTJ+u74r%Lj_5Z8eI^Y}7C2@Eyv)6s%f4UJ~c7JOkgKXJB4i94}eU z+0={ymp}c`HGdk#k$byKZ+5P3?|8}6+EZ>^U9OFK*#45yAiMV*)%BR(nvaxb7kh?# zea)8RCE@Pg2%QZH*(UUESr2Angg(3YuEm(8D4ZmP8va)vq2qHJibJUvy%GAQ%|AgG z`cGV6*K~wlWTy^B=*6T(UDAArt?PWd!{n{`u9(*jx!rhqV9H>l#};#4SKxS4Bm$xo z(e@?&woAyo;+0RRnOvm@+uJoW;-w=_6!3v5%gU7LlR`zV*e<-re6UhUOmlyiEBK_Y zsY-4^sN`O=8JNnX{XEL+Te)T8X+T1ciUE0db5t-0umPQ+^1(7H7SshQB=o2lkcV2K zf*ALx{A?K&3+e(D5_(h&$VXbEvL;34;W8=~)CDRe^r#q+kGDo;b&ATT%BWaS7pRcX zqhdgQr8O$6QdIt985Ila0u>T^R1C!D zSWp+JkkF%IKtA6b6-*E8(rb49GWHqmot7x67zlP#36>(4%5N{;D-9%Tua6QAWjr zxpOH)RbC(Ec(4%5NzSkO+j4GGOoUe1k9gtP(bM<0DU7$ij zkBR}AuaG860#wO*<}1snSWp+JkkF%IK%Uzil_53etY>~<85Ila0u>T^R1CIz%N5z0#*BX_qXI@@L#e%v(g@hgz1G1tu zDp}8bV;L0->H-xKdQ=R^kG4hyuU_j8N6M&JP#36>(4%5NHnu_qqrOLFYZ(;_>H-xK zdQ=R^w$`X*BJTDwDi+iQDkSu%BtTlDl8LxCmQk^wE>Iz%N5z2bZH3C}K*Sv^qhdi_ zph7~AiUB#)8kJ1MohYMXL0zCiLXV08d2?%2GP!cPjEV(yfeHydDhA{&tx?J3$~()b zSWp+JkkF%IK>lfSRM;jpYs^1UM#X}!Ut1>DU)CDRe^r#q+pKpcAvY;{lav2p1>H-xKdQ=R^ziy36)|h{-jEV(yfeHyd zDhA}&TceWcE5BJr#e%v(g@hgz1M;6+qms#$&z4cKpe|4$p-07lJlYzSOs@QX85Ila z0u>T^R1C-;G)D!mqO380sf>yRb%6>AJt_v|Pnx5`UVm9*o+_haL0zCiLXV08`LkB2 zggx`0mr=2xE>Iz%N5z1At2HWF3;OFaDi+iQDkSu%7?A(f8kMXCeYcE?1$BW62|X$X zIz%N5z0VzcnhEzVgyCDi+iQDkSu%7?78>MkNz*Q5h8r>H-xKdQ=R^HLX#} zMBI`xDi+iQDkSu%7?7o{P{Ca4M~AD*s8~=JsF2X3Vn9~6MkNz*x0F$_pe|4$p-07l ztZ$72IQ@! zygwS`&2ypL7Su)F2G{a7AP<)EW?xxfZrfuvS8faHB5#9hc^i=TmGWkrW}mlh*__MU zg1X4t;9A}Wlqh@4pW6<~djHg0QuNFQzGM|1Y87k>WXuKV3qK z-I6>(c+Mf^x2o!bAO_be!{GjQDQ`9x^?BPyqq)kkpf2(@xR$p8`Mpx!4+eSjTqw5% zb&2IRk`d2@a-xw1um6n_F&pQ3}4?Gh;5 z6hX~WSDb?a2PgB5db#^lxeg+VEpvm^sf+%%gjCN(f4S6m7FErhFX6Dxz&)-tA@{m9 zv9n__O;ZQ`G86TSH8KZ%*sJWIzuxg>$i80__Xq6DYYPYca?Y=CP@6mG-=R!9XWZUW zW@tA1m~%F|=fm6mkMln;g=pqz?s+n$HIU=}uPDzq=tJnDtxXve5;O>2o1TY0;v#Hx zSCi&?RFc=ZYqmn=F}=6b0P0q0+@>`goW~rJ{$j3Y_otvk!Q3h6MS?UVzfo7BK?Jkz zbd#O~^7Go1{F_|_mIC^Rx#5RP_I=5OsFbm8~LGNj{HS}G$a45 zj%*?McPS(wKd&v8^kP3OpR+%gO0wSCyMtnFLp z88Ywxd1j7zd2ONXmve4M+ux&1J7?RTwhzr_8*7I0e6}pbg|mxGasO*qqO!+xvytao zEKDp4C3TC^?Lpwzm{?>kJM)HOhl*A6+|FTn-2`1pmo?N(2_TfN3! z*K_Pu%?vjlNDbGQJ;^?)^UvL;t2cCA>Y&V{94&CBjs6N<<9IgO)9T;hNwa1RRVVFx44(tkRn zgk)n$*#*RGEV*hCs67JJj`ESQa5Y00H?R?C+j3}B8w#(BZ{xkSWgF^i*W^&+WFv-b>~RQEVe-R>)+t#zw+BU`t-3_*w3%i=OxCD%_Y{u^r9WstKk#D%Qs) zFsewI-R;wgm)`+%SX7=AMqaU*ojYKrJ5nu33VK2Xo6zs5ih~{M4qYcy^uw+_^*uFj z-uFe8{v`HE#XO}LW7>Y|K1UwED;&GBW#m~e+PBkK@&n9EM{CNn#%@t+E^Ll^cgnno zjM<@;i}{dYwrzuFJ{ZNAHefq#q@1?rfhj})KBj?Dqi*8Nc$0W;(ZNfkm}ptN6*MdWD1g zGF^krc&%nduR#MsjD~u9Kx)cfDKDWb5za?QqK6w?P3GCYhr%l+*vQUPmu%W6^hD|ZI2{t$j(<}7h zfbcsa#brDz=e244-P$;Fr~XN|TmNjOxl<+GD-zx+ETi}aSJO!qu=TBFR3gfHeac7= zQ6}WxK{Zf>gDJ_Gx0qDLG%XO?CL3LzlmdN3piT>|lNxBDd#YHM>+>GLzb`Blb)Qee zQ2B&Y$F^w4P(P74E)D=GhDG#}c2Hnaz@ZY59S%T;VCb1Q3c257*cMk?LLuuGQhAj$PliOpb9$uF727Id9HbS%sq7D-CAV&6XMlHuRy0dhgyWJdJsp)MG=_k zpu=5k_)cZMQkC57w_VAYXj-f)J3mi3M#8XiS{X5b^9-3Z7)J0(gJE#LU2%>|P#zX~ zj%8_7EQC$sK&Bnyv5YXqHj%40KoZ@zhEm(_cM-s=zG+AC#*mA%BqqBuF7QPw<+32n z#gb$~X{#y$E}^3+oVkqel3mY>lpu7t*G8G(=3r$B&`*=(Y|g_ zNf36lB3FOw^a)EIB8U6(JLE7pXlb1dMPO!%rSbco~Xs}W&4#VI2aXJ|pU3X3#nC~P{<{gQGx&Cpwz z-v-TRkIUs~Q8*%#d@^Kd#$s859J?Zu$_d(xyi4Sm3{c5I?hhbm!ppj{8u&Cdk4%`P z?dVMrLbEc>Z?h`sxa$i_O~4}2&EBv2tLZSI@*e3u6N+}yDW*r%&xZ|5)r?|eEK*?G z+m&WqH9zWlJFB6B@P|dJqE$$78bUs*5upH)rk6zviCc&WLsUns$h-<_K6}i*3D0NN zcFW$|+Xtr1!v1V0@&aS+dyZ~s{PCBD8;wtXw(+~~tTER9vQkNmNoXsZqOlgrH#63f zSjj+grA)I2WZhk^dKs1Zb%}dlre|-g<#Y-x(90DMS;P)@L#krVsla4AsOu`>a)+Sh zZ8PaeNLV)b1tTGNX7Xl$uW^*R)=?Rm z6~&8O$aO);^)6&_5VF*TWG!2#?36+VUC2<7YLyFF9fYiPA({FZ#XqVL5g!5|qU(QF zbgdUCfw-jSKs;%q5}yt)*!trW7ug?vI+kKvD%;_P-IA^C1Eg}k;D z^14#U>q{YbmqPX`LAqRqxLoOsl`Ase)th*yFBqZvw zQk)Z|kcm>rqzei2I#r7EfD1XTtH=4rUC3L5khkkO;UzC~^Ca-09>hBwh<64c9&{nU z6NJ3Wg@nkxrxfzuQpo#CAs;A(JX8w#kP8V({NYl_PnSYIQiAg@OCkTN6!NiB$itj2s7<)QS14WPj4koRSMa%CW}HtL;xjHiCRi zVQZa89}=ca`!EH`%-u5g^?>4XO3DgdnV?*ye?KQzBj!?t(R3~wFtfcyuG7Qh$uA&0(r{PCNb;IJY2PbnfYuP%NyuKQ_;q8cV^1FkV=OTKzF^hpi3cs$_ADw-r+>b-|CuHIYl#TfGMapa!zdm zD3i6K@Ti6p4=6(7k^rw;kQaQ2lTh$A8gG@*TcqFmM;eX4snKp%iKbEfojSo+uiu*B zBf01T)(0fE5Ptk4gqOJY6`~IM?U;W1oZuT%bKr@iD)vd};k>{RQMf3KN&Gd{ZyBcZ z3)&xT)^yvWg5$Se2pY8ih%~f)43dv1^NiBM5vFZ6kVJTnA{ddW;3GKzm}90)-J}w{5~e~98$>#T_#kt>YHJi z_0-<2!}r-KgEG`+0-SU0ytIW?S16>!s$YI^!n^+U$~(a5T*uLY~s^qzEvPa&Z!2g(8HeR{EQR4w%hsWV8>(b-|pmR6sU4 z!qUqFg8aaDLT}^34lq<8wjRSG8`cQxS2Y1(4cY3gGI4*C#AalHOT!U{bxW^JD_J?^YZm%vy z6#w(EJY+$IGm%EWk{3bd!I%w%1RoBoPe9Eb6_|o88>GB_+0Rp&-jcVtZBabsk%>&? zG8~&1nev!)WeChul8TM>pBQee|JbATQt`t|6~+HwwN%8-uenqtxv&Gt6_R$0K*pSO z!)1~~R9VYU2hNF%bn5$bMfTx5iPYp^(;>BAoGjV(1O2`O1634{xdPbcMkb98xDYnn zYbxcU_^^w3aRgZuzgfA9bP~oYHpDT>qn$V$TKiMYFN*JXA=ZUj8Be>AuwnkV3&})7 z6u+$$@=r>stU3Rr!hP=VEX8@S6!IzHZldUoNw)hH_=D*j7U+f^9X=QFX@CFx6}{ zo~klw-*g5x#xY@kL9M80V18`2LHvX!-9+U6@WaE6fptwp?tBezqxkE>jhId35pRY!v_ZK<*=8qxhRaNKayhz58sK zZu(wOI~P?@qC94TGK!z+7#nj$asAe7^d*WPuNH}Tb~Up@kvI{FV-jlizg$8Oo71R7 zjp?^W z0&}%A&M{q?3~FMg!e+tG8}Fm|DW^)<=^@s#8&0#dqfIPio(r*aS1jZ*7h)T_TF5h9 zh#eDSA(y)lJHy68u5clCz>bAH$A#GGKNj*_7h*>fS;$o`gtL-zV!b$Jt(EgGVm8wp z#V;&{ytowdl2XXaN+GW(h4hy~7L-CF7ZU24*Se5UQ@O^G|60d=R@_A{zm05j*6m9A}}Z1BVw?tl~* z+8eEKP(?<8*{^nm3Au$rBDJZ(&$lh*jgn<6h_a@lU?hTVnGi1jvOTb20!6{7LX@3q z&+HkTV|{T*gP+go!Wz?zX@1i&O~N8JeD?B{i2yHGi@vF6hX3bq;QX(m-kp42>bYDS9{l9whoQ7sv#V-&UB6yS-~?kf&VObx8k6_+OV zk3iBkm8xnp2+g2AY;^uk$*c+kDKgp)$4e@kv}QZSY037eFMYyQ$xinxePV9H&LAv( z!sEzJN-TZC&&bYmEPcYeh?6FBTzBzJxT;e+uT83ta50}q=4585HsK?ix4m6>C)jND zRTP_*Aq=r*^d;Afr~tXNm2kcYPO$w#g@ql>78`l9h?yb638A^_6f4f!se+rtT`ak~ zTWf3=YXQkf<2AZ()B9%KcT1XY)qO-U7t2BO*2a(Njvl#K6S+)=uT7sqL+PcX#EVe- zL?{$f#476(&(D+Ru?uQCv98AVW9A)E*ORS(__-sEMf=o6|5lTpY_SAZ6klD}leN-e zNS^d$Xd(whY;=4KBv_Jht2KRPwZfRjHkTgyxk1Io(#(j04RV<1W314$C%aO0%g<{T z${PoX@;VD9`9{L-4TS}-C_bRDr2SrXdip>+?K$aus-w{#+WFK?qtQ3oiP}x0(NEeL z;7y~^XWFUdO{39&+Bxe@qtTbz$?#31Q89LweG<(Rln>u%O;9Ef?2wB>dOo0i&a%E- z`$Pp@Uv&pA?z>iOWn!j&DYPws@dD$*_w%9NQMcITdNpK^;l=OgL&qYUu8rbiH!k8c zd`zr-S;AL6Cm6iD6IqxWAl~7iV5{JHZE>;DZh#ho05iY$eq0 zr0$})Xd`H_e)Vndq?($nU;QOlMI7NEz{UCddb_JRO_MmO9;Ttts0Ky&Wg`6&S0U(G zW_MkdRL?5K!{?uM0O(q*3t;x1eHPKnnpRJFvTC(M{|RweuF5X{AUkw?tshy3R?V61 zal@JTEu|50`^!szQ3UpKc{cR8PoMew);*$Mc7duI#l5c1W&{!;`J7Zpvhe>k^bs)s>LL$3aSmMCMHRoh)H}(5p%Z4A3tgQMd_OmllYp_i(xEf z=T@et5UAGgvF_8Rrx;o_>BY)oa;-!E+jCV+hC_py6_X+4>4?d1_r#o-L?gnFl}F|t&twK#C0|*kXA>P3wpO7`&lBGSC1(RP6_)eV!SnNz z8h&k_9Yk+qkOP{7kK(Ts#br!ajrq9U_>*cv_2tzv+IXW$gZ8raU@jg5L*rZ^j95oB%q1{r-< z$#}R)T;mDE5A{b= zwseiSQ@9xTY!M2_T-1%vtR;~=p$~RMlm~X8rG>D{)hipQ8m#kYe8xf)8=ql!WRh@= zt~kfw?9}lpS95f^TEf8SCTwuFWGZ}87-U<=+RWf{6>(15yTbnE!Vly^Yn#n5g&{j! zkNopNi!^)Jv0!L-p*>0RLl<)txfIr`h`*VbWx3*>R8(9#?j2DaDq9zHh9@svZMH5H zu2K98j>GBuiVIi%(uvXQs>LW~{pMnnGrw5?R)4w~yaSml zU`_zf4A%3RA2y@CjujFUqhC0Z%;{g7u3Ld_Ot z_|)eWYQM3%3dbO3qsBVB6pb@U*o|b1!t^Q6EY_>$nI(#sy4t_F4Y&70^`ADO& zK);Va+PM5pHQp_+cNx7`x`pcHc}f*7uV6od`t1*_N&%2mDLyK!-NiYTMKd$S^Z0sM=QhbGp=w(@=Yx`8sOv{S(G=G$4LP=Z^^+{Wl7r$Jd97a`8}q= zmcm@R3#%+>CCAikIK_0YlM~^>9L{A*p`iVn<9ER=6Br(XZGacTC@t<`_rQCFB1Wj( zh`3nRi?O)J*ec;c=(g2K6~ET2#%1TRyVZ>}bJ=;Dyat;r%@dnl)7IE=}x0Tt25Ik&|#*!`;OCHdVeUX}SU9lU{9-MAA`u9|T zT$Qa6h4^I##tYeFw7(fNi~ooV3Bj3eK2yFsZ&giOi<=Fr zVlGu%M!sC_PfCZi+?#7LjXsf;;#>7d8)bW@uO1T<-=+|?s($yuPLH^51m=^$)BgFZw{%>t!})P2xnHV$Z;UJgOi264|Wu z8VNNsuCs-^Ii|AL5#2dr*EDywb;stx!OKm>soec@TM8?0x|XAwm_ogYVkWQCewI&Y zKGsX(0F-{xvp#VG&2NRl28`j(aeexa=_jf9`V__47RXU-Ysx>B#t|;`-xF#7pVzgc z_~9_B;l?hJlY;xR;U}O>)9XeUdPE&{v2*jS~%+VUPYT`57dlS0P%2}qWVeap zY+zeJv_9D$k*16Ck<5rwLswdxuX@!DV$Q!ZspRz(ed^aI+gcbGZO#%qpwiPyM-v7_ zXdIC8l5!gDb(h*}czEM(ao$@5KoF(*OP@?*d!6;L0NbX>6U2hwh9%04-g|{!DByYD z?Y?hv%>mJ$LL~n^HTml}cCE!rqrxJ#_i@JC*3z?g&+COsTbw4PtXcGqlY?se$+sxm zq{htaf148TR<-!yYsvFpo?4B6^zd-w70q_;`^Tb66#r3muSacFTO+L3Be8G-HTHtA zUHNb{z*7s6&WcGJM8I40b<12Vrj!{*useWlP=#G;rQ$d3^~!??v-Q(I<+_43!ib;m z3NGxpul+$pXeq89MCA3#_D2sPWb@PtHBIyU562vJmi-r`t!8$N9-cm)|6vVQuZ7F= z#_SwDT(oVfWLdU0YD-@nI*+iVB1DBY8Z9W(Qos|emhumaquFHjnuLAv%xfW zd=|X1j;g8rqzC5b#iH`YLV=P`%7ZFN+C!omoKlADr;nWn?fhLuIlEku_yqv_^}0c+ zP`QsMitB#q4~Lzu#@Pn$WRYK%EWfF7i@Lz0(v12OoeUip1?%R<0>NFX5-rd-Hb>&v zDnN4bH(xoC#ZEw6rMFue>lE)M_5Ntc<9ar@9Hx7t)OrfRAp#sKfHqP*{v3!LIszXo zaIpGw@b(HGJs2uBCq|-;7YhXj{{N=RIA~^&vR|H2<5FA6H6vA)ZwAGuIH@!@q<9%_ zH#E(|V{?Rch79G`nl`Lh3|fjRoQ!_=ZzK zupZa)(7Ueh@en)|6012U`L^!mhRKI20(*H9N+9bEt77AeGZe_f5WeM+9njV<$+k)& ze!1i=LvoI(E|#Jy59E6&t34Fb9ulNULAp^g>;@f$%>PpT*dU*dcz^ zX!Kn7Irs*5c?!4qH4h*48GIFVb+_tqpE$TV>~gFSX8yUDgHaTHi#j|~gMB$x9%}eT4sgx`s!_Q7Ue&^+>cX_S zWkC+jV}&sD&v5#f+BPkc6V9!#9IfTuDgZ5@Pw-+~`L-=NVOK${6ofgdx>UlE9uT@_|82RTS z#0_d+wj3#w5!=KkKF9ET9+H29AG3bEN|zw!P0p@7Cdg37r!C*xANe%bJJvSQJAAG; z1$d)>tf|mH!dkBC+spcgLAe&@dWf9^v`Lx>=K$@}D3UXQI0cB>Y?a#QQ-6oc z@>+<=tzu|B1pkGWe7|~|y0+%IwpA<-ul|0M^4X(&(DsfLu*Y!<%GAfGhwHy&k|Q(P zo6cozA}=wj<9Jy0cXFwxR@hFxM$lgD`W*ciYN{SqR!`01cv$s!%6C-!ie`^d2m=$7 zh9-0A&y0iX;?zU-U&z600moJ2rVHCzN`qbg>eE)=NflDQI+hP@S5jv2tK?GENUh9M zrgJtQ)%bk47bPYZ$MTr1oR4i#4kc+@Rrr?WsE2(qC8;kvJW+*pHnQ6wiLpncx?Pf? zNYm+#?|jbw4hDIN>f3KV)W>gqr>Dh1gF{b8rCV&*^{BYLXen$4sWZ;@kUHh?EL~L{ zRB?JU-2k83_BlSwJ8Qw{3bdSdIKK+xDqc5evw_#M61U=cTX+Z0ZxYW>-=^VnF5b($ z->o)LhK$}&mRIQSSU=$Jx)?=Rt=}m}Ij?XeZ8^4z)jFqQ405(n%dKvFdO~{6VLeT{ ze$&Ql&0-YcwSKQIYuPH`rC6CR<+!bLEyk$E!p4zR_JuMQ<+#N>TEC+il_6&uQPsEB zP{SDA$zcznTX~$Nuaa_|%VlQbnvD&8epUCfW-?SEpNrgIg?E*7HdwPsI(r(x;Z>!` zG!xD|*(jUJ4)GuhrQwxUX*~4K@8FZyNLD8~=0iJ&>{Fn(u%=_5^p^3Quh=?g!?x2X zC}n*-53BQgUZR|G`mEW~{Kz9~&HiiWx%d?1R^-_Y(muwdNi*gNElsWBd6=Ew!J=+F z<$J8U@15u7Q!pO)BdxN{cAaL6%(B`%mWS5aeR}fL=M~D;PPA&Dp1bieb)EMY@Y1y# zc{wvSHdce4Z+X2%GHav$%jLh+q_mavLd)iv(xW}cA}MyMw$Lvpq+KEl$MpU{U=gqT z?qPI(M^e;5WpxBpt&h=pem(`IW!A*%&g*meFdw(`JJ7L}-RJaltpB`0%`B(7@15u7 zQ;@5T6slTX*xxjd<>7UH2ZO4-y+*TK<@fWXtz&kczfS>IRpF7>V_52F{M9MkTCIw4>B?+M=Eok*XYz}5A!St`>7ljTvvrQabaQS$$8K|KokORP>mjxa ziFh;Q`OU&Q#0w`7V6-v!<_#Jqu+%tPKq@z1R-1-Vw-=IqaW(W_H#^C>yg$d(Qslm5+|WxB4xQa&JnOlNZH@_v10En{v0D(ghT zlloXGVv8XP5zFvSxj|DQ8YDD$uNFRduw}ZximQbc66E(~XtF@j#wFp%sH*+BsE@9}s z8tl_Rcj!J{b2fSA2XuZiEFbDAU%tZ)HgUdA&Q#-SyT}EEO@D%~iDDn848eym;LPWm z4KDNHK1KdcKCK6et+?02oEa`2Y{JD^P8rs9Zg^#GzRgMCqm?Q}nXBi5Q=XME&)sYf zhcn5xL`kn|!`X1nQ?&kG=6COQ)((e-aBmW3^npjk=iV@d)WEr-UpQw=IB>?;ptfL$B*Q}F_ z!|iC&l{pJ7rYOIYv*)>1lhlvwL$toS)p2mBu68d5g?FdnQ|m6=&49%9^=Z?SWIZw>n2P zmUiAIFM-?jYt13Pm4&@(s~*^=;ofZKgwvjAtxuPcvpIBA;%wF?q*e8EPo6RJZAV+R z=GTx7DgEnNH9TII&3tcaSL}QDonehYy+svn~UCAE$==7voxZ`|h zv(8Ah4lMKwybTs znqW_wT}*#Nq*=4I2vwZg)6wR-j>g9QWh-4?n&DG(yT+Y+F1kEpYwQc5q4_OmdJ@gI zdVilwo-IhU-nx{m=AJHofkPE*Q;=YLv?_&bCt6vtN6tK{8Fx+0VlTj<85(24Kh5oc zGa-?uulw0ywr~qFphi~q)|))tWMx_N%hvGCjFh~+x86ivBH1i(Z@r0c zW5xSi(=2-{PJ9jaW@vjew9}slp1uayo6DHqTt;sl$kR=t^=4?ReVcnTw7w;j?{iI0 z>#f-Eb@+7A(|R+s<(+4GGqk=HFQTaRUZ>WjG`B1xEpd&qp643E+pd3#DOMJyyJ%& zI`8AID;wE)85(F@P=G(@ zq>3c&gpOb8YpBoaozUS4RqlhDSvW2{kMxN<3TL=n<#+`3qxLkI=PC+EK29piNj)7X z!g!`4>=cKM!AY0vWs@|kLH$y0;y{@RaoS$zh`djCacmfy#9ep>^rJ zpel$^ysd~Oy4Pi0qJCY(QXSMqEY(C^#8Q3KMJ&}y#?8!)IXw#ZnPWP(p;k6OPfXL3%?onGYA&CPy}OMds|f71h|phstM)zF?sh=g z*kmkHw0TsWk`z|&UFxVgDWnPutdb8%P96~>oNU}E4xG*BB<+@-vrB7@p%Fb_s}(-= z+AJfS{K+tO=z1}<83ax>%Ia&KvsewP&jPdJw`w@VY;Bcj*8h9B?dkzOKKJsu389`E z@+DsK!SJm(c52Z&tq0q!b^5#1 z&tO&K1SZzLZqz%^cj^lKe3~N6>>Uh4NwZFGBl_JYy=}Lk8m{>mS?b~w&~8`WoFTMM z8X~*S^JY-8FU55BPOQ1#mYS_d@3p0wl=myN{>wOPwzj4H>a)k(AbUcC?WOu1S5N)) zXj7EZYe;!J3ty^w2_HMuz}oNOc5ApZE(#xZQYVyH=TqO?tvpe}k#yyJyqxQ``!mZVcE5kUMhX(tGz93n2Ff}nQ5`v-l6U*wb`wIM5Y<)Bc4*!y^@N{l;GKlIWYAcUH2S1JbYQ>q2bFLS3SDt(6b&L zm|_N^|M4ikPxmN3<*r|H_Ubq2lkmX^x?2ZZjk@k0kgK(A#K065;cLID2)g^fD4wU+ zC44&{b}3fsX_R)T?#vf4omw4@}M5s+TbTTp;#yegjjfO%NL+(n=+?3L_sWCH(7rBt@f{^Q7$l@SmsSC;M!%@7v6f)>ShSF3j7$g}NLI)%l4(mQH z^hSl!AxixLeO#*lH@HFYuo$Yya1aRty9t7%6UFVRd%T|00fNIcN9O$>#fo?6I0Z4f>4^^ka2=yHbj9 za~T1EYS8-}=+D%Hrb*o6A{hZlPz`F##rlmp0&s?Mb1VT+4f>D+{YX9NR(uP9YS2d< z=qC*{y+b%iUD-rAyvhwxNnQ>3gadrJjeg63>#NKFle`-6qyzl?YQU?T@PYv*c{Sh% z9N>Nf{Ja7w7_Zk?pn(QJHR!iG&`at;*LOt*8UWRx&p6OG)`PC^iVQRWszE>KK;K#q O8hcB%Mq!`<@c#o~{^W1~ literal 132910 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 DSA{>q diff --git a/software/SCSI2SD/SCSI2SD.cydsn/config.c b/software/SCSI2SD/SCSI2SD.cydsn/config.c index 2855dc9b..fc1809d8 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/config.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/config.c @@ -17,6 +17,8 @@ #include "device.h" #include "config.h" +#include "USBFS.h" +#include "led.h" #include @@ -32,38 +34,77 @@ static Config shadow = "2.0a", // revision (68k Apple Drive Setup: Set to "1.0 ") 1, // enable parity 0, // disable unit attention, - 0, // Max blocks (0 == disabled) - "" // reserved + 0 // Max blocks (0 == disabled) + // reserved bytes will be initialised to 0. }; +enum USB_ENDPOINTS +{ + USB_EP_OUT = 1, + USB_EP_IN = 2 +}; +enum USB_STATE +{ + USB_IDLE, + USB_DATA_SENT +}; +int usbInEpState; + +int usbReady; + // Global Config* config = NULL; +// The PSoC 5LP compile to little-endian format. +static uint32_t ntohl(uint32_t val) +{ + return + ((val & 0xFF) << 24) | + ((val & 0xFF00) << 8) | + ((val >> 8) & 0xFF00) | + ((val >> 24) & 0xFF); +} +static uint32_t htonl(uint32_t val) +{ + return + ((val & 0xFF) << 24) | + ((val & 0xFF00) << 8) | + ((val >> 8) & 0xFF00) | + ((val >> 24) & 0xFF); +} + +static void saveConfig() +{ + int shadowRows = (sizeof(shadow) / CYDEV_EEPROM_ROW_SIZE) + 1; + int row; + int status = CYRET_SUCCESS; + + CySetTemp(); + for (row = 0; (row < shadowRows) && (status == CYRET_SUCCESS); ++row) + { + CFG_EEPROM_Write(((uint8*)&shadow) + (row * CYDEV_EEPROM_ROW_SIZE), row); + } + if (status == CYRET_SUCCESS) + { + CFG_EEPROM_Write((uint8*)magic, row); + } +} + void configInit() { // We could map cfgPtr directly into the EEPROM memory, // but that would waste power. Copy it to RAM then turn off - // the EEPROM. + // the EEPROM. CFG_EEPROM_Start(); CyDelayUs(5); // 5us to start per datasheet. - + // Check magic int shadowRows = (sizeof(shadow) / CYDEV_EEPROM_ROW_SIZE) + 1; int shadowBytes = CYDEV_EEPROM_ROW_SIZE * shadowRows; - uint8* eeprom = (uint8*)CYDEV_EE_BASE; - if (memcmp(eeprom + shadowBytes, magic, sizeof(magic))) + uint8* eeprom = (uint8*)CYDEV_EE_BASE; + if (memcmp(eeprom + shadowBytes, magic, sizeof(magic))) { - CySetTemp(); - int row; - int status = CYRET_SUCCESS; - for (row = 0; (row < shadowRows) && (status == CYRET_SUCCESS); ++row) - { - CFG_EEPROM_Write(((uint8*)&shadow) + (row * CYDEV_EEPROM_ROW_SIZE), row); - } - if (status == CYRET_SUCCESS) - { - CFG_EEPROM_Write((uint8*)magic, row); - } + saveConfig(); } else { @@ -71,4 +112,76 @@ void configInit() } config = &shadow; CFG_EEPROM_Stop(); -} \ No newline at end of file + + // The USB block will be powered by an internal 3.3V regulator. + // The PSoC must be operating between 4.6V and 5V for the regulator + // to work. + USBFS_Start(0, USBFS_5V_OPERATION); + usbInEpState = USB_IDLE; + usbReady = 0; // We don't know if host is connected yet. +} + +void configPoll() +{ + int reset = 0; + if (!usbReady || USBFS_IsConfigurationChanged()) + { + reset = 1; + } + usbReady = USBFS_bGetConfiguration(); + + if (!usbReady) + { + return; + } + + if (reset) + { + USBFS_EnableOutEP(USB_EP_OUT); + usbInEpState = USB_IDLE; + } + + if(USBFS_GetEPState(USB_EP_OUT) == USBFS_OUT_BUFFER_FULL) + { + ledOn(); + // The host sent us some data! + int byteCount = USBFS_GetEPCount(USB_EP_OUT); + + // Assume that byteCount <= sizeof(shadow). + // shadow should be padded out to 64bytes, which is the largest + // possible HID transfer. + USBFS_ReadOutEP(USB_EP_OUT, (uint8 *)&shadow, byteCount); + shadow.maxBlocks = htonl(shadow.maxBlocks); + + CFG_EEPROM_Start(); + saveConfig(); // write to eeprom + CFG_EEPROM_Stop(); + + // Send the updated data. + usbInEpState = USB_IDLE; + + // Allow the host to send us another updated config. + USBFS_EnableOutEP(USB_EP_OUT); + + ledOff(); + } + + switch (usbInEpState) + { + case USB_IDLE: + shadow.maxBlocks = htonl(shadow.maxBlocks); + USBFS_LoadInEP(USB_EP_IN, (uint8 *)&shadow, sizeof(shadow)); + shadow.maxBlocks = ntohl(shadow.maxBlocks); + usbInEpState = USB_DATA_SENT; + break; + + case USB_DATA_SENT: + if (USBFS_bGetEPAckState(USB_EP_IN)) + { + // Data accepted. + usbInEpState = USB_IDLE; + } + break; + } +} + diff --git a/software/SCSI2SD/SCSI2SD.cydsn/config.h b/software/SCSI2SD/SCSI2SD.cydsn/config.h index b17ebe13..4cb26efb 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/config.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/config.h @@ -27,6 +27,7 @@ typedef struct char revision[4]; uint8 enableParity; uint8 enableUnitAttention; + uint8 reserved1; // Unused. Ensures maxBlocks is aligned. uint32 maxBlocks; // Pad to 64 bytes, which is what we can fit into a USB HID packet. @@ -36,5 +37,6 @@ typedef struct extern Config* config; void configInit(); +void configPoll(); #endif diff --git a/software/SCSI2SD/SCSI2SD.cydsn/main.c b/software/SCSI2SD/SCSI2SD.cydsn/main.c index 79b7f2c7..bb0deb68 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/main.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/main.c @@ -56,6 +56,7 @@ int main() { scsiPoll(); scsiDiskPoll(); + configPoll(); } return 0; } diff --git a/software/SCSI2SD/SCSI2SD.cydsn/scsi.c b/software/SCSI2SD/SCSI2SD.cydsn/scsi.c index 8eebc5d1..60ea9b3a 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/scsi.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/scsi.c @@ -345,14 +345,11 @@ static void scsiReset() // We must be ready again within the "Reset to selection time" of // 250ms. // There is no guarantee that the RST line will be negated by then. - int reset; - do - { - CyDelay(10); // 10ms. - reset = SCSI_ReadPin(SCSI_RST_INT); - } while (reset); - - scsiDev.resetFlag = 0; + // NOTE: We could be connected and powered by USB for configuration, + // in which case TERMPWR cannot be supplied, and reset will ALWAYS + // be true. + CyDelay(10); // 10ms. + scsiDev.resetFlag = SCSI_ReadPin(SCSI_RST_INT); scsiDev.atnFlag = 0; } diff --git a/software/SCSI2SD/USB_Bootloader.cydsn/USB_Bootloader.cyprj.Micha_000 b/software/SCSI2SD/USB_Bootloader.cydsn/USB_Bootloader.cyprj.Micha_000 index 2289bb15..c974aa29 100755 --- a/software/SCSI2SD/USB_Bootloader.cydsn/USB_Bootloader.cyprj.Micha_000 +++ b/software/SCSI2SD/USB_Bootloader.cydsn/USB_Bootloader.cyprj.Micha_000 @@ -589,6 +589,8 @@ Cypress Component Catalog\System\ILO Trim [v1.0] Cypress Component Catalog\System\Interrupt [v1.70] Cypress Component Catalog\System\RTC [v2.0] +Cypress Component Catalog\System\SleepTimer [v3.20] +Cypress Component Catalog\Thermal Management diff --git a/software/bootloaderhost/.gitignore b/software/bootloaderhost/.gitignore new file mode 100644 index 00000000..567609b1 --- /dev/null +++ b/software/bootloaderhost/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/software/bootloaderhost/Makefile b/software/bootloaderhost/Makefile index 8c090672..9a24f035 100644 --- a/software/bootloaderhost/Makefile +++ b/software/bootloaderhost/Makefile @@ -1,4 +1,4 @@ -all: bootloaderhost +all: build/bootloaderhost CYAPI = \ cybootloaderutils/cybtldr_api2.c \ @@ -20,8 +20,9 @@ ifeq ($(UNAME_S),Darwin) endif -bootloaderhost: main.c $(HID_C) $(CYAPI) +build/bootloaderhost: main.c $(HID_C) $(CYAPI) + mkdir -p $(dir $@) $(CC) $(CFLAGS) -I cybootloaderutils -I hidapi/hidapi $^ $(LDFLAGS) -o $@ clean: - rm bootloaderhost + rm build/bootloaderhost diff --git a/software/scsi2sd-config/.gitignore b/software/scsi2sd-config/.gitignore new file mode 100644 index 00000000..567609b1 --- /dev/null +++ b/software/scsi2sd-config/.gitignore @@ -0,0 +1 @@ +build/ diff --git a/software/scsi2sd-config/Makefile b/software/scsi2sd-config/Makefile new file mode 100644 index 00000000..4f16bd2a --- /dev/null +++ b/software/scsi2sd-config/Makefile @@ -0,0 +1,22 @@ +all: build/scsi2sd-config + +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 = ../bootloaderost/hidapi/mac/hid.c + LDFLAGS += -framework IOKit -framework CoreFoundation +endif + + +build/scsi2sd-config: main.c $(HID_C) $(CYAPI) + mkdir -p $(dir $@) + $(CC) $(CFLAGS) -I ../bootloaderhost/hidapi/hidapi $^ $(LDFLAGS) -o $@ + +clean: + rm build/scsi2sd-config diff --git a/software/scsi2sd-config/Makefile.mingw b/software/scsi2sd-config/Makefile.mingw new file mode 100644 index 00000000..ecc9a9bf --- /dev/null +++ b/software/scsi2sd-config/Makefile.mingw @@ -0,0 +1,19 @@ +all: build/windows/32bit/scsi2sd-config.exe build/windows/64bit/scsi2sd-config.exe + +CFLAGS += -Wall +LDFLAGS=-mconsole -mwindows -lsetupapi -lws2_32 + +HID_C = ../bootloaderhost/hidapi/windows/hid.c + + +build/windows/32bit/scsi2sd-config.exe: main.c $(HID_C) + mkdir -p $(dir $@) + i686-w64-mingw32-gcc $(CFLAGS) -I ../bootloaderhost/hidapi/hidapi $^ $(LDFLAGS) -o $@ + +build/windows/64bit/scsi2sd-config.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-config/main.c b/software/scsi2sd-config/main.c new file mode 100644 index 00000000..25b66bf3 --- /dev/null +++ b/software/scsi2sd-config/main.c @@ -0,0 +1,364 @@ +// Copyright (C) 2013 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) + +enum +{ + PARAM_ID, + PARAM_PARITY, + PARAM_NOPARITY, + PARAM_UNITATT, + PARAM_NOUNITATT, + PARAM_MAXBLOCKS, + PARAM_APPLE, + PARAM_VENDOR, + PARAM_PRODID, + PARAM_REV +}; + +// Must be consistent with the structure defined in the SCSI2SD config.h header. +// We always transfer data in network byte order. +typedef struct __attribute((packed)) +{ + uint8_t scsiId; + char vendor[8]; + char prodId[16]; + char revision[4]; + uint8_t enableParity; + uint8_t enableUnitAttention; + uint8_t reserved1; // Unused. Ensures maxBlocks is aligned. + uint32_t maxBlocks; + + // Pad to 64 bytes, which is what we can fit into a USB HID packet. + char reserved[28]; +} ConfigPacket; + +static void printConfig(ConfigPacket* packet) +{ + printf("SCSI ID:\t\t\t%d\n", packet->scsiId); + printf("Vendor:\t\t\t\t\"%.*s\"\n", 8, packet->vendor); + printf("Product ID:\t\t\t\"%.*s\"\n", 16, packet->prodId); + printf("Revision:\t\t\t\"%.*s\"\n", 4, packet->revision); + printf("\n"); + printf("Parity Checking:\t\t%s\n", packet->enableParity ? "enabled" : "disabled"); + printf("Unit Attention Condition:\t%s\n", packet->enableUnitAttention ? "enabled" : "disabled"); + if (packet->maxBlocks) + { + char sizeBuf[64]; + uint64_t maxBytes = packet->maxBlocks * (uint64_t) 512; + if (maxBytes > (1024*1024*1024)) + { + sprintf(sizeBuf, "%.02fGB", maxBytes / (1024.0*1024.0*1024.0)); + } + else if (maxBytes > (1024*1024)) + { + sprintf(sizeBuf, "%.02fMB", maxBytes / (1024.0*1024.0)); + } + else if (maxBytes > (1024)) + { + sprintf(sizeBuf, "%.02fKB", maxBytes / (1024.0)); + } + else + { + sprintf(sizeBuf, "%" PRIu64 " bytes", maxBytes); + } + + printf("Maximum Size:\t\t\t%s (%d blocks)\n", sizeBuf, packet->maxBlocks); + } + else + { + printf("Maximum Size:\t\t\tUnlimited\n"); + } +} + +static int readConfig(hid_device* handle, ConfigPacket* packet) +{ + // First byte is the report ID (0) + unsigned char buf[1 + sizeof(ConfigPacket)]; + memset(buf, 0, sizeof(buf)); + memset(packet, 0, sizeof(ConfigPacket)); + int result = hid_read(handle, buf, sizeof(buf)); + + if (result < 0) + { + fprintf(stderr, "USB HID Read Failure: %ls\n", hid_error(handle)); + } + + memcpy(packet, buf, result); + packet->maxBlocks = ntohl(packet->maxBlocks); + + return result; +} + +static int writeConfig(hid_device* handle, ConfigPacket* packet) +{ + unsigned char buf[1 + sizeof(ConfigPacket)]; + buf[0] = 0; // report ID + + packet->maxBlocks = htonl(packet->maxBlocks); + memcpy(buf + 1, packet, sizeof(ConfigPacket)); + packet->maxBlocks = ntohl(packet->maxBlocks); + + int result = hid_write(handle, buf, sizeof(buf)); + + if (result < 0) + { + fprintf(stderr, "USB HID Write Failure: %ls\n", hid_error(handle)); + } + + return result; +} + +static void usage() +{ + printf("Usage: scsi2sd-config [options...]\n"); + printf("\n"); + printf("--id={0-7}\tSCSI device ID.\n\n"); + printf("--parity\tCheck the SCSI parity signal, and reject data where\n"); + printf("\t\tthe parity is bad.\n\n"); + printf("--no-parity\tDon't check the SCSI parity signal.\n"); + printf("\t\tThis is required for SCSI host controllers that do not provide\n"); + printf("\t\tparity.\n\n"); + printf("--attention\tRespond with a Unit Attention status on device reset.\n"); + printf("\t\tSome systems will fail on this response, even though it is\n"); + 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 reported size will be the lower of this value and the SD\n"); + printf("\t\tcard size. 0 disables the limit.\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"); + printf("\t\tutility.\n\n"); + printf("--vendor={vendor}\tSets the reported device vendor. Up to 8 characters.\n\n"); + printf("--prod-id={prod-id}\tSets the reported product ID. Up to 16 characters.\n\n"); + printf("--rev={revision}\tSets the reported device revision. Up to 4 characters.\n\n"); + printf("\n"); + printf("\nThe current configuration settings are displayed if no options are supplied"); + printf("\n\n"); + exit(1); +} + +int main(int argc, char* argv[]) +{ + printf("SCSI2SD Configuration Utility.\n"); + printf("Copyright (C) 2013 Michael McMaster \n\n"); + + 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); + if (!dev) + { + fprintf(stderr, "ERROR: SCSI2SD USB device not found.\n"); + exit(1); + } + + 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"); + + // Open the device using the VID, PID, + // and optionally the Serial number. + hid_device* handle = hid_open(vendorId, productId, NULL); + if (!handle) + { + fprintf( + stderr, + "ERROR: Could not open device %s. Check permissions.\n", dev->path + ); + exit(1); + } + + ConfigPacket packet; + if (readConfig(handle, &packet) <= 0) + { + fprintf(stderr, "ERROR: Invalid data received from device.\n"); + exit(1); + } + + struct option options[] = + { + { + "id", required_argument, NULL, PARAM_ID + }, + { + "parity", no_argument, NULL, PARAM_PARITY + }, + { + "no-parity", no_argument, NULL, PARAM_NOPARITY + }, + { + "attention", no_argument, NULL, PARAM_UNITATT + }, + { + "no-attention", no_argument, NULL, PARAM_NOUNITATT + }, + { + "blocks", required_argument, NULL, PARAM_MAXBLOCKS + }, + { + "apple", no_argument, NULL, PARAM_APPLE + }, + { + "vendor", required_argument, NULL, PARAM_VENDOR + }, + { + "prod-id", required_argument, NULL, PARAM_PRODID + }, + { + "rev", required_argument, NULL, PARAM_REV + }, + { + NULL, 0, NULL, 0 + } + }; + + int doWrite = 0; + int optIdx = 0; + int c; + while ((c = getopt_long(argc, argv, "", options, &optIdx)) != -1) + { + doWrite = 1; + switch (c) + { + case PARAM_ID: + { + int id = -1; + if (sscanf(optarg, "%d", &id) == 1 && id >= 0 && id <= 7) + { + packet.scsiId = id; + } + else + { + usage(); + } + break; + } + + case PARAM_PARITY: + packet.enableParity = 1; + break; + + case PARAM_NOPARITY: + packet.enableParity = 0; + break; + + case PARAM_UNITATT: + packet.enableUnitAttention = 1; + break; + + case PARAM_NOUNITATT: + packet.enableUnitAttention = 0; + break; + + case PARAM_MAXBLOCKS: + { + int64_t maxBlocks = -1; + if (sscanf(optarg, "%" PRId64, &maxBlocks) == 1 && + maxBlocks >= 0 && maxBlocks <= UINT32_MAX) + { + packet.maxBlocks = maxBlocks; + } + else + { + usage(); + } + break; + } + + case PARAM_APPLE: + memcpy(packet.vendor, " SEAGATE", 8); + memcpy(packet.prodId, " ST225N", 16); + memcpy(packet.revision, "1.0 ", 4); + break; + + case PARAM_VENDOR: + memset(packet.vendor, ' ', 8); + memcpy(packet.vendor, optarg, MIN(strlen(optarg), 8)); + break; + + case PARAM_PRODID: + memset(packet.prodId, ' ', 16); + memcpy(packet.prodId, optarg, MIN(strlen(optarg), 16)); + break; + + case PARAM_REV: + memset(packet.revision, ' ', 4); + memcpy(packet.revision, optarg, MIN(strlen(optarg), 4)); + break; + + case '?': + usage(); + } + } + + if (doWrite) + { + printf("Saving configuration..."); + if (writeConfig(handle, &packet) <= 0) + { + printf(" Fail.\n"); + fprintf(stderr, "ERROR: Failed to save config.\n"); + exit(1); + } + printf(" Done.\n"); + + // Clear outstanding stale data + readConfig(handle, &packet); + + // Proper update + if (readConfig(handle, &packet) <= 0) + { + fprintf(stderr, "ERROR: Invalid data received from device.\n"); + exit(1); + } + } + + printf("\nCurrent Device Settings:\n"); + printConfig(&packet); + + return 0; +} + -- 2.38.5

;C$H z?@DyuHbA$tDKh-PR$}rwP)Qn#yt*h>5<>~oDWr)1sQ7*e_}718PBTtAD=ZgSPB_8E zF@FU17So~0N_leHFqhK)kZFF1zh>P~5oRGU;S#T&a)7fS78n$^2SuYTr0^mIg-#mZ zdx8Vl-WP6k4Uy+)?zt~2iY?lbaS%^YAvLStzWAPw>dy8{YMr~56$cyDi7O5)Y-hWj z%*q9kKw?6OGEV9<5N$7>A-CJeK7jh!Y5xaKx<*F0|50 z^gL)(Cn(ebis2pVYePgB8MQ!zxEdC3tEBmKC@tGTw@tKJ?5-dT=pO^spjdL}w=s5C z8`Y?R{fId00MiYR~*B>>t|&?5l1g$2}1W^XusCz7L|oL$vx1fqK&orb<6rJ!I& zQq>CmKpz4zIw|OFM=WN?Z6>3^oQj39y0;+HpX(o0ps#Ey{EnknWt8D!!v#mB=n5^oT#W$E*gxRx-N&tKbPAnN1C zLaFj03r9r?z!n!{^CUhvqvg6nBG55}KrPX|$>bJ8-CS z+KXGdFa#y|k7{vgNd_)}RqxvzA|&rxmT|WsT7BJJ-0po z=T-U3ghD3Tn}oIzMKOgD=ZEAbRPa@@kduT#XQiNk>yo>Bb>6ertm1rC_V=1-a8HR#UkGtFi%S|}!-|vd>_^ZRcegBa8HLJp6ZW=CQ@-MqPI@DXiGmd;Sx zoKpe~oqC$h7=eq>?`Pn=Kh>Pp72T~CkF9wOQil)}T*7NeY}y9NWEVKeUaK`QM7LPS zk-FbRPHw-_9}>nqeP`)}<=6#vR`8G<@aMBz*!(x!;0u1!6~h?mi}4djvlcBgJJ(#l zEctp{EawXe<9Af+$TW!O_&>=s#d?beXPjn17RU)hx}V2LdVcIFXxlh>aTF2BXGQc2 z#S+bwL7P|gagCXmVSI_R7(~t#B5>1@uHBS2hxswtIsA=6r&~G^2^L(KEa2EAcynb< z7rb7KFSwABms=vdBbhz<9mi1hr;n%$)LqNf8Ex;w(czyWVf3u~&K+owu;0z7Yz<}@ zXlRew`l2*-bFp_&OQIOWEDWM}xM#e+j-^5q2CP}O4?jFgV$D6me4p8MHR0Ux>5AyV#4%~9q7c6^t%st65c#(+uc~p z##Gm~*3sd23ZLHcJ;)J!CpXe=Z?)jQ4dQ6F0l`!>GJwx?ac-Bc3S$bTNUeplNKhr_Oljig(%)3c8x_I&`+osf`&3{^+1Tm|k6C2! zjS-$cyL%(q5b~4hsz*4s@10|KXFIgmUVKc3Y0B_CR!th;EQ+SO<+cr{d$PEuIxQ%( zE{zW{aeNH1QB%Du(vgv*lAU$@?F>pCj}qjx2YY>%)k3*gZ0hlQcUQwS&EMYEx~!W8 z)=*`XecO9DrMUlUwAyhJKF6EcOG|Cm9OHqD1z(vI^syXxpX+kNFX?hymKM&06MQSR za1gypN?S;)wh^(~_`L$kNK=0;=%{HNTMTl$7^*K>W{5z-I~o(!U=JTH!G)N0&U8*G zM3Z`78a!&VQyet@rM&@p0%?^+5xc$gwZoV!A5Z-zk^3iHaHRBpS(=7P*@(l~pGve+ zWwbY(t{j#O7%Hw`EEawbr+U{S9h(dx9p~zVdJUJ0wODCVFEBiS!YK|)MO7(U`E-iA zEA2GNxmC*I3DYzXV7@T4(5Go^rEBtNA;6fAYV?Ryyu;9?gJ(v+)-*CG|6|8%QX#1^*ys(Tit;VFAJ zSLCmf!D|0S?i_gp)K=p1bJbPX%~=#H9Qs;p9-B=;|0o7`D{r~kut|@k={t4yLdy4t z-mD}ePptV$!Xatsua~pEi|^P1=*$t@5_TNOb&9O4Wgd2w3d|gPvw7)k#d%R}>cN)# zZ?jmbY{9qD!mMAQlu?i zM{V{Jlm1Sh^K8PoXMVGg;j$|GI}wa*1$#o5KwRku*6bBR26dcZ-!j7vqyt!IKc=+yMGue`kVi-8 zDw^CM&AsQO&6P6oD8d%~Jh{dT`13lW z%sbJj&Zh76yMNBAXo3YHm=3exj!w}K&32-pU!I9pmxGv@L$j=_@6Jk~s#{KgAAUzA zP&}^0)pxeKP(QOPa5XfqYWc8s@5>uf_wO`#k^kr*2e3`KeNwsCM9tv=b3r6CXS2b` zr;K7m3EL*LE13;J|2VNMVu0++&SVH+p9G!-)GBw=y7ZQz!ex}74+f(gw3@-WUCasod!h2C!MG>j{}7B(oHe<9Loxgl2Z6$@wZ-y* zcxEO4v@D(HWesRNFAG%u+s+414bUt%Xz{;&5erDG}R@+@CktZz|{(5uo!7y5l{qk%paQ%_V zPnSVEB&2#vIDi!PO&t~p5A;>@Mss;^N2dI?wq1)8T{7;!qzTF8Qa4Z%-})H#xTJt5 zHp#;L8W5J1(4n&|)J*qw6+ETw+2aY?mzEx=3O}zckRbrAL*jrY;C|GstA_!KB@lC_ zWmcPtM0wQ4-WzIQ73#3SYCu5Y3yf3Gw%!TFX?8ENZ15#<$G$yxu+h!(QQF$+pb(-_ z>?g|QpZUTDq}DTbzEppxSQBr>?AJ@8IY1vT^whRdieL4PfAR{C*P*ZJ2j9+|>?dqg zF_22Dl~um5UWEQ4h?O=yqJCQOVmrryilbIqjUOng&C6I>#O1?*bXZ4>pUcTwtRt$= z#S4Ab5$C6(+n(*U7X0d~Dst{NKi{&R3k1eP`iI`3b473K7fd-EU$k5xIF?nXhgS(lHNjSi zg4zxGPKS@wc046KXt!n`cGoFvcJRu zb^GPZ3za>3pasKohajV-h!FuN&rQ4ohi3Keai7hAW`xRJxI9d)`DLF?sfJ45XeoVn z@NOpIa+3o)f%CY3rKdy4Zquk$r$&9#LL+A7uEitq{uA+S3_#rROw0=q3s!leEjiFG zI`(!r(R!>+U2M+0cIuziIs4KW1ae*wBydM=sBUYFogy(Ghn1cmS<$q2`)^qSo7R=<8^Nkkk5oGL&?5k=TSdKBH4!EaW(3Qoq?Igo(@=5z9Y1F@P zmk;isiT$WDo0roVn{eVf!;E_1f<~0a9Wd$u*|1NH;eJg`T9s_DjS+%34|4EP^pLDX zBAs2es*i6@JAh1?2#L#?kH?N{BJiisFPuVl#3n(qZ>$t z3?2@iAmoNAH02rQxty-!ZvGlecg0vnVmgM8BUEoS;1?ZUuvvQ|Or_`gcMWJ1S}jh$ z$z?_@8;&K0`r>m1>D|IoB!B4hN?=?)%(@n$?x2U6FuePZ65`oF+563{OA6o%$)sQO zXQo9Et-2+>+f7WDRp8*fQSndR|7?(D#>Gcr-f~ z*llD&O)Ct4=QT^U*x-|_>Sq{MCe+GXJiy7B9M%2Jq=fP?lcn6EXE2|}g%l4OwIf)$ zXe!VB)^yG2t+mg1EPAHbuBoDs=j>qj#UCT)dliYq_vY(BqA4*`sMkC?AkWi!wX9QU zy%?y+U?UN5f)vVsv>(OM$6wWq8LwD;7pc8@SdxEzRBwXByT!ozP_^r+l{~XSpbb zh;L`cyg?0;?y$Q_Hq@FjZzZ)u8PYUOKo#-33o7cGoO+{$j1Yy2T2v}&K<~^KED_Lm^@*qn)wZa{X&qT*XfjxV5mQS8^N`@ep*Hpi<B6()a+=&oY4^hHHCmw-^EE8LKqs?Zpne-9F`J;LUCP_0?=| zOci0b{324mlM!^{ujd`m!i0Z5ntjo>3BP8qDe~?pvHLYBc1?uv@q5bHRmZ0-c)hdw zwTF7MPuE`B!tW?b?)R5#-=`n;f_zTyH-?FIr(Ly;l#nLd!bMh**OTOE0rHCxA0n@1cD4 z8Asm$yS-`16Xw{5bLBSZG!kKDW&`@#Tao7MV&l(?b9BN8VFCoLgsN-_T+mOjao4H@ z5^=!8&}ht|Mji`{BXT41XS$gPLo8OY(XNn2VU{bYC(rf5nD7^_Q1Ncxfg&VSclOzYPqxL9m9_w>DlRqAUie^f-^eyxSMyCBN9IgY z_5RUTiz`dC0BQOCrcIPyAgWo$KIXin;Y}-%_xiSXSfEE=G)?2_$^+U2Zp|MT8^e9c z{91rWr2&mm`j@*7FI(kkZ-Vo@W^D9sgNvE|K2HNLTvKg=dn6sl}5j@Tm)B|DsaO=c%6$Vm|7q<3H|vV z4Ciwi@y_v&K!Xv`U@%O~y*N9U*m|i(TA+lhhkLb8DLZ@UO|m7;NYYJtD-y9wBFObe z*{p7*p@C5Y+RA(k=W>6UgPg2ghGMK|LMvYHV49b;pQ#7}`-J6+e9k=W+Z_s0urLJSln?eH^ui#*p+bJq;oy)rv_ z-&I!KctU?P!Yy4ppz2-JhIBfOm>^ww!g_{&fU5GysYF$zxiA)VC)OluTb(wWoEza` z(ivw-r8DqLDOKJ$t^(aEiBJWye$Kcn85GRsDrKrM;lu~h+Yvp}s_t@`;e-(a--+w` zW;Q$WjRBAmGAnnVBl(8KEpz8w`S;M&^gs0&u3C_`y-^jJro0?p1~|B(9QEOHaHA0u z8AXyd)GlkojcLi!;VEzNT)AHk;xeG}g@Fdv23tRlrK7 zPa(C}*|{m<^w>wZ*e~y3>xQmvwbHcF7mTme+z@2 z#YJd2w%l}1B>hxd&c>YJbjxE6JHTO_c8%#^d1G~6cP?ouipW*Q{hBZ=v93SJ9{avq zD~;%r(QSweQ_xV<@0xD?{yqx5@#ebyH<{mQ6K}1^D?g%?!*jqyh?z-h?iM;?BWqIc zDy(>ejOWQ+xMni^c6?J@1pfRaf|Cyn>$Vv;9a#N>m-hw;pY+)Jn1`?4rNHe zT-uDxZ${;GqFj_WF@~Mnvag8!aPIh$q7qbR5z(NTM!v$J8WvH8543PTHl&iTWYtQ~ zM6p*}XRg__>LIggIqF6<-i(U<9?t{h5vs!g&UR@`m}Y`9;aB@19!7hc=W_uL>lAzW0>)vhWfnjo)ZN|ANnUeoG$~c~5@C`6pRxrSyI3V0bRyMO?2*b(i?Y z76LuVX^jB&f!kdnqGqE<(-i3SaljGkXZbfCSzdY5UrUrES}~Isdk*S5KjpAM%yN_V zDrb8`Olf& zn;&O*9JKp1H;!c;&8|M_S3=l}BL({H&Zrb1D7w{s%OWaAlZ+$ht)QzJUVg{bTDEWB z*t^Pn?H{gv%tRcckGtFS)2jBqP`@G}HHlA6qxcMFLMn8&VKHe|d;!l*`1evDR)tvU zF4`>#guzl0Ej4l9kUQwRA_RKJTWsRK(LGYf8_SKI z^2CVY+zx*&g(dT$Y%RpJ#VEVK7-}U9CS2Qjo#V?5$E`MDEOP09;?Pjh5pXd7VlLGn z9C98S<%Uk%EohQ))juSwej?$A&;3p%LhCl>2-Od9H$6Yl#;Z=tdlxTVEcC#o zG#VlquGd!hjcyn-EKt@I`Qucx=G?>~r5KXE+WxmPICLavWtm4z616J6Gg_5QI)^)9 zMd!fvR6qeP_`I?b-RN+qX#ps7=^yU!H8n6I;moc7@R|JO{j)gcG^+ByKL;%!sh2J# z>&RsiUu@>Nu6P5<;3ig_Gz###-;El~Ig3X(VDugco(N!7~BA^N5CfYVrK`5}RKcM9CEUzC9QL}bHPH*-4eZfX*yQKJi`Uxqp(z757e5A2J{XuHlACVJ^eyKESf^?#iDXb>*%P&~bjN`C?rYDsDMrKFhhwMOEX{b}>RhyG`Q=MA?L```pG}qY zb`!^P?D|H*oumbS#z(=_x}j&gxxPP+3g4{QiZ(Sy-~Jl40MW)QknHSKO@D|siVvII zk9)`A=O#KpI&!%Z%3W0VT;Ww3@l^yX%>ZP6*h^qhiREba4ye&U>irj4I?oSy3s_Nl9~SG6?~Y$DO(AFzcI?m9r&FpK;wRvx z{`-PZs{kn(F`AtYm z?rr9Dcx`ZO9KQw@)h4$zA{r8?xgJ3Wk8ZCEeJ?u`RPyD5g@;yB5K>8>5fbO(}th6VoMyjG^~fpL9o9Ni>64?C%j zy+&vuci&L*Z}U9Yu))DqD6URgLhnqt19ldV3|IxGQCVqP>O6i%TpWI((jY7Pc`MWAiX`Zjz{&}JtX+-SDds`J>BF!pe;;`vT`}mk#RQAJD|}Io)@+4HQn{8CT`O9JND!> z&|n{0o z;>=N{N-mtnoVVni!SGfy<;7>7}dNvhv@YkjO*bz-3XfL*yI#f+z3Va0ZA zm3Qn+ME5wWs?plu$RlWO!NzepqZV!{T6@R`$?ClM*c~;>K&-#1g;UOfGS>n}Yp`)I zMy2&m{LVw`Sd#IB5Z+gim$dVgq`31?hEoX5izRsJ z?00_d$td!QmKtLwc!Wcy@~d^&O}X>nu<$wtVFq7uPk`?JlvOCAB3EHQv{dpJaSNn{ z+aUaO4H`pEShI##}0`6L4O5@VC^KbVpSxBcH)w#L^q( zbYr&HP;BJbv8BRSuk=JMYQ?{slL1X7$3IE16SB zV8PC}4S6M;B)>9YwI$VkC44>b?z|)jiUDr9@ADc*Yn9Kb zH9NPqt|D=q9jALxVVHYJLNE4JI+oHLs+s|(&~c5c!MluZm8odaKq;NqynPBWf=zpz z>qRC)3FgrUzxakV(*4EYU?YZ&B!E!AGGs0U$xxEb|R3d zu69*mHlr~=%b&^+vCC0(46Jr8kdoQ>4U3Ve6RmdIoMV|aG=Vv7W+*@6?m;yBW>a#n z&LBGL6AvJ98(M}oja<(TuJI7-lwoK##fp9O99Q>MPh1Ug1bL<%ETx% z*d)IHb!QqX9|w`7$c?0h5Y6g~M5J_8SR8V|(k@vZ|Ctu)-eX+zn`N)aV4(^XVwb96 zRCu1Po!QE(PpC0y=IP9|RW&~m@b!a6dcE9XE*wv`#U$-D^&@``% z4vCH&7zYh>_BC@RI5I4oZ9ljg?WV!`DbL-O=D3Lys`{3u7Ki%0wn}$-&u%tqJmvE1 z9gU4$dI+pht<9pTl2B;H=hvCE4&Z>$UHd7TuCMYFO(y#rNodj5-4|Zj5#aAjxN@!c zpR7mDh`bBR_SJ>(JXD~4T)TtCc6DtC@1)I_jAropOdDI$JedPiDq(McO9oj?kPvco zw-(;!lA{JzvvOxQjecz6EQk3{G;e^_F-hv?Yf{70b3 zVbYFikSIJVhbEsbDCGR}GCT!2f(Qs7L1{j{w{*zk^4nVoN^_2m`z&7BSu1GyKt3hw z9eQ&Wrm#PopP~I;aI9k!{__C1Y{gzS+>9oWq>$I zF)}uqEY$0kukpl-qis5-ln~OllbTu4(#4u;Asj$qO}k z)vtw(NxTU*!&WF79=}QCB?ak+q>4Aa4Bo7E^v6j^I-u6sw>2K=jn987?ru2dGst;K zN~Q7Pr%^TLF3dtUHXI+jVFGR@Qq`)6tl^>q4mX!yBD-%K+t|w!ex!MhK7$i}G&p=Au>*u_>Se8IGhi}`7Tb$@m=1hf%rw$E&i-U>hG&6MZaD}ohbDPON(ccf6p88 z6!K>sES=ev}2OGa9${r?v7spHFa zOqkrsY?>vL!`QE z2_Kr9TnkIRm+UD4s+&bi?8?G+3yU`~JRh}Tie7WR_p<=bhi--`&jR!@8;rC_L1(_K z%4_iCtCBbD3QTMvDU5ohibtebxslwV?jk$4sJMJDvlDxWuGI{qQGW>XNKjarEPC;4 z#_l`+PNDRjc{ujqn^1P=yaYm92-1v_2`|5f%6z}M&j#z8mYEV@fjjdKCtXy+f!;+o zu;R%v{2*K>rS`xm!D1?B`~2a?Zx+I^IHRpqyM{=fhG{KpylGhFq-|IFI6Jc&lrc*0 z&K_?WInrWpszNiDFkfZRk#A3Z*DpuWKs^JRJ#H|T3SvT8wssm5Ec&a8&8LW8%sz?XaM2UJh*<66m zdD8Sh37=@7WJ~K=4s{R?@P}x}e}%1srFtU*;F_22HXCw@~)lP#b`O*QCy;MDvhaX@%4eMp59oZ>DyVMHfF%F6ojJiore# z;ja~2P0JVpvN$uGM7eQ`eO;%e>{qx}bg|?9n@ri}4yT^BL1WIa%V*Bu1TJo%v0S1uBZ|I*FbM$O7+YdZT9?>ZONR?<7X za{kAl`ZEeTJC!$crlH(HsS2R2%2z^~#fRNrqa5nq*!`ZK4~pRxOpR(b-EE3HO#j zH>;B&Ycio_-XnFII;_T3E+mfHPY{Tu?HLs#QiP*5%^HuLPu88{sm1KEAdZf#{B1{7 z8@30n{Ux2c7WdW4w79|-ar&S=%Jvm=Qv7w2iJ|ur?PwIfA(G8H?S_$1n8{=Y5!F|! zwZqLOEB?8R&SWMk#0m_4Ac*&yDHky2JjV%R0=fNJLSjBYM4MK2XQzx*fmewbS!Ajv zCp1Rg>E%1ee>9|Dnfmrz_M@WxtZQ6Auc!lwrfeguR&*U8jBfZyx+BQQui;?iq%u_Y z8QAC7*;ud}^yf`ud-IBw_;%Qwd>Z?aiNej9PJC_{+^~9q^^!sFLTGmwy?*x{$d+tV z}Zeq<8@f54pUy`G3DT;SlW2x0z1kK5{2_L)Vo<< zrfj+I-n+g#I<{veZi$6I>}{b;IHnZ!p!iNXz~jgb%f4>z{^_j>`u?{Cc(smjFP)^? z%czEM8ZXod!RvmrJdXC}4yBe!PcohbJeK2;29QW<@3i>wt|Y_&A%Y4&LXSTks_NH! z*XyS39^}$D1iQ_VM{vC0mp`v%gjgVcTZFDm{caUpwAmRO&{GWF@vi28#b{}HyTIY) z-PU4#bQ0t}y0i{^S~$>$%!EiZ%UC4AkvtR(kiN}=+bW1X4 zyg-ut;{tM{OZ)Fe!`9bT3Mm}9I~hM^q~MWX?DnPf5$YX9Ee@q7m@Ov2;51fz(~_EY zRXFsn=hf#T%3lrqOjXyVx_I=hLIkfxB!6_n3l`R}BmdBq1D1c?qS-qr-CKG~4VJq= z?+5B#MlTc2{uGnnIi6U6nx13?Lskf%cE3p(jFqQCJ2Fi1PEH<I^wV{jvezWk++j7WTa~@ijlx0mG zhK^4hq-AF!;b^fy z)6ri9luVG8+Hf-%4-K5^zlz9%(?iF7h>t+Z9t9+;OBR*5zH!h%u@ zjiQIOC_dTdL$||{$b!5-h5A4_mw9~zHyB`wGoikmV>!pkgBuA^HmgLiv<8(V20T-+ z)I1(Ap>-}@bVw@BCvSR%)$A@Ofw@$V#`EmsRNb{i- zZMeS=#ojxW{a0+tiT9h_;0o?Q((k%SDT^UAk6~!^#Lwe z=l~vM4hR>E($sp#G&N-}j7*s+8q8$AOB6yMK1)U<(=cxw^!ll)w@Icj4T3f96~aJJ zpU5Lq=y@;76EXO-D{9v-Z8WSRWa0c1%!l$%*t>!K03KvCFF8u?P=I#D5t9b8_BKYF zP8m2w24QF&wGf&Q*^t0K@yV`RiYTyc32HvJ3@63Bc?Z`*75umNZ>PUzFEA>YPKN$c zh*1ojYz#1mp$3y4KR9&~M(65h)ln)500|Ho}7gj)|a&>_@@b$3#L{sPWWKQv&uzK#d+EC-A6? z*Z>(o7cs3|SSE?0lwi+i!y_+pI=)!@=#)m){v>@MQ_3(ZB)0M>A|UcnBFdAbR7J9Y z=q7*FMlS~L9Si`hO;%l+L0Ei`?4NpmBudkar+C!+-&HfiQvj-d1r|BRNnwJ8M2D)w zdMu-J2+}-jrC<54Rvs4$iv~=B)_q|o1x!)REdy3PeJLqIq;2SXt>bhs{0>iQW*JVW zSLX$SdJ7DK`aru#>I$_8&rqZXK6*ROE6DbwOfHNqu&ri$-@9t>Uke*EXJJ_|G*T0e%zoZ%2;k zg_|q}cF{68sad2hQVBqjSUU;=f$PqoO<(sxRUTUWmV#^%;UgYYk`m z>DEy^;n0MG8G>11P-85xOD@kk|2p|Rry!MuJ~mWxOi+w$n;D=w+4dMMc#A4uG)v3G zlyUG#R&51pf`9A_+9vsu^o4~f`9M^j4PLID2*VyGsr zV>NUbsH$=^MIDF|YEN@>r}x9Br=Pg{pT2cf9FSQ6SDg;G&DBS<(5VQJW(v<_qUEdS z6uv7Wdv}!yginMnD`ijf&%KM8~b6IC&Cq(YxKfk0GW;60)wn^i5G7*>=S zUk;k~H&qm1FBnT^c;{r=mNKPkW^3E(#R^gNJX zRm~~x@w(i}&c?*XEk*JYOiQK}1!Ge~BL%BP&jyxt>58B<7e@OBiykP)C)k{+jB~>9 zy+weRnw93M9tMDvpeoKOp5X!$ZNl3>B-qV4E7XE1&WwaZIl+gEh87`Fv?wd4hn(i6 z+sVTI96HON2;U5zk?G;75PV$jN>pUBEN4#WYBs-9^;XYCh}!Q>;GrHrWF0XSN#GnESfoijMdWpMzl zhh{s{nowuH0(-gGf%voA#7LUy5ZXo|Frx+!N{8_h575I0*ng*tQM1lWwFcZ(7uj12_PtX+y7sdka&Me-HddTY(mO2F( z^4DYjC-le+js-ATqo!bDLE?zI?bvMm_K5^=SQWq>dJXaq*~X{AfYE5NTe<-t3N-)I zH$P(j6L`rC#s@L|g|U=aEJ!>7Aq&YZvZKp4>hS>XOe_C&Q1(#?k4X2WR_qD>3LjB$ z<;TfP-{8OSn0haT79CO-1SsJdWf8i9p3oyQ;n9bFY+yhVrZ(2aa7r>MX}B0+7?rs%^$QXz2V0SccYqyh(?;G|^0LZZCoxwHae zuYIRrrgbKi=jg)H_}N&tB%0sD8%L!;822g>KBMl57Y163M4Tx2cQCMD;MWAt-kl8T z-*@~u`igeTMXt$5c-*R&PdKBaq4vKxW7!mfCHy#mYf$zvL@8(lbhb{j4TFaW=QrB4GEJ*0)o*ZfyVMGXZsy#z0v zz@Y+efo!(cQ<6crLlX)JL&ya?>l`z|T%97xHSTE70YruCa{ytN8SIo}xBnSBgr492 z8Dx7_MR|^}{t4LlweBDfJq4B)hYmv3IAIATD;!9=?qA*Fmqhs1e|F%VMXU?5>Z z2}mUWv)?fksA6qIk2X?d{FFKvroV5nL{&`VE59*l5xiy4o`^>PdL6PJ6AZw-;;H{F z(8`ld{oh#C<@Cu4|Hgh49I_Zd-OD5q^zR`K8cGu_F-ooh`t%QunYhSc{aj+(7n?ra za8kqKTr#@8-EeS^1#RDMwP^BadqFGc@CET?lP2Rgw%i6$2<;IQEYq*E&f^PG9bWYL z45=xk;B>W9?2wShpFL7tyESjCRfiRf?qlQODP2C2X@fWb$OQV@+|YI9bn)@zFLS6r zLQ@-~MSOiv#*_$Puxx4v)FbwW@G`{$*b7wKw}5IfA)e%A4r=+HUV8sVaKGYp(>L$x zMjAru!=A~|{%b4f_Jc39nL%`Go=7<32X0eP=$S#)rg3gMe6X5_o^r@glm)PXN{}Gs zMGhKI^W+v5St~km`O~~isCP`xdA()E`KuF3)?P2@ogBE7QD*{nQoq#L6y-mDq;h`I z2rARHTWx(=oT2A!q>GkOW+CCTT`Cc!bP^-IftSDhqONA_oRhJEDE%=eGx0P8+#i-e zkROiy?M#NpOkS_jLr(Yc!-59l9T718p7&YZ#U)O6PnI8+Qpefpr$Z}C8(lJ_NjMoZ zuK?Hl6g?_BCG340mU!^Bu};zk!eB@tvn)UL(+BZ=5nPt$+}fn2&ceb*=-@l$`-^r< zqol)4p;m^)@4($h-#%M;{B-adu=27$9oV?o@CR_IYu^&cq}uwkDGfqZrgV89CiqY}^oKpl_|7i7);MxX%3 z|BId4!4p+}68{rh`t?U@QH7Dn$L5xNNwJ;AegKsKh<{`P1Ol5}u0S9_&?S)s3e^TW zqv>SSQ+yoQ!&A(L8t{VI+#e}&$-Gye`2z6<&<7l~M;RkzvCy(Dx2K68xnaZn*OC4i!1pvqw8QlQKo6irb5FLQbj-t0fnh#X5fa*U{{wOk4s6C(4?dpvJsmVy8_LbS= zb3pFO4S1>*z7!%K4dxwKJ9 z<^;T2L=cdF{sqJn_LEgPZW3*A8`>_?EhfP|NmGb1%wGn@bB>h>tnh< z|M>OB->)fbss9(>Q6j8;9zzmf2hy@rFfbrrf|ZWpQ1cOpC|(=l8q!zW4Lq`~GoY_q(&R zGqW?ZGqdnLKz`#ModL2za@R10>8Y}nD9$(gO)JeWO#|mJ&|_xuKNHw&g7Xv}6ocRj zE$xy7SYMzchK(aa@NxdqNLn!vMn>tt-oitY1QggHB7_cko&c!3E-DC22;f3u@?Wih zWgy{CG`cBI;~;8xj|*IcSC#!2K{-4k@h`3Dz=};jB|@C!&xx%$B|}0MrBn!yZ8{@C zJC6y5n^`(zVxzthUluf&J^!_!5zdW*GZr;Bn+;?6w`IFy;Cvwo=lYM@UkLj))VeZ0ah$B`a^jOYM z+zX6Tx2Q;oq_C$bt#?2}5;Tl=Kn5PdQF-(Nlgt}iJA5PLe&L)e6EzBrPMuk+=lFT( z!MY`;a9dxM4E^aFpCHj;T>!N@vXiaQOp>5nrJ|+94>EKRUqFXIfC0vkMnGzAt*^xj z!VWVm5L8f3vjvpM)`qfzm;*i2XHXSyt%M(>{P6B;(0ygEb$u?7x1`j;o;L-Xmv43J zbgg+UnT)EDA%$-JH70(s0*-$@n}4{sen97<8|s5CUHUUZ$tw` z>qZO$e3;T<$vsgFELbK9F{h7X+RLFtASA(f<77*OnwBgr&y0&kLb|{+Sr{3Y&hTus zO>LOt-s36CuxoWvi)O8|n5h1daW@2{<)4zJ4O2UGYThHCHX;E8UKNB#P1a(RRI-BR z*VA}WUQro>e=!MoC+knis?ul@U;uk}-&-F+f4}xB0{Cp}I^9?;vlbqNDnmqm$URMo-3jJ~njg&80Uo(wYe;j{7zt4f4C%UcI}89%&F zvUJma#wwA)Rle0mHlM)2+nE#rgE@!PQ#|J#srC;ysVDVpn6GJ9Lrk{IJ4TenD9gx7 z-Q}61+|k+=p2yvgl;DR-y!V=pDOc0MA!6!Nli+VH3&OnfQY|?r#4&q+IKV1Qk+I)l z!J6(?Il+yzVVy|8<2!she6qM&J}bbq*F!D#mn(0bGRr^X^bZf)gjIT0z7RVmc?AS` zLi~JGvuAL74t(GV%i>;b*1msA(4M4ZhZ}yEOzeo!ZDD`@Xl5)NuTS|BK z#yDy)adD&$twRGs>qyqXN{2wzf~CUbESTSPI4tB+C2q)C^8_rbfah`p;S4AjK;=tO zc0G0|7S)hO$b2{T*uhE!R6i!Bb!XMuZctecaa37pKZYdI^2)Gx4p@KTK}==P*2G9< zCS2L}y*%k(LMQ~Y7J0tj35Jb_T~i5CSRcub^!Y%_4UA%5T?TMPlT~r9nz9Q{HGYAV z8hD;PCtI@CVn&&nl>4?a)7<51c)&_pZ93yVU6n;tfqslz%WZ}&zxv)D4fYS^iYIlJ zm^Wslo{aoq`BFmDU7xGQ(8CtXCI+a_Vi|k)G5mF6dxmFyF5vB9btZgwEV=6|y)0dP z4jX-cuCDE_nR(8)lCAp0rxkaaQeW1_I3dlAxWoF=;Z6t3lQYwN&^TJrjJ8LbM=V!1ZQ@ZeU^ZRZgdsA=S! zPm+Ru9IZHmm(G+_D?y7`EE7D(r9Xjp&MRtQo%4#?#P0feMQ!>!sJkh{p%&?+E+*6F zB>f4+olc+IXd(=sC#M!F!^9XM3y6s3kpF(3tRJgJ;f$1nXzYHx3KS0>(@*SLeomxa z+!tI*zm*MNSu6_Fy5NMK53b{kj7ESc8*l)>BZ#4FQ3&_J5UkI>D3Rq~)W+(IK((vu z#r;E>CxbEtaYFT#)gX3`yC0-Uc>Gb))63~52z^2ciH_m2@_gcS6P#V45`@IZRN2HR zOybC9K38!KtY&2r%b9K%Je&sK19c{-3lgYfU=rhhc>oV6s%=x@Nx4q}yq@1W8hw7_0gr(* zZ9zZ)FNPg!pGUsnmJdMuqkhHH4$knwYX4-sJrHw(IMX`jyv!7GUIhQg^$MpfJpP2j z3-aejFn8g_b&{mmMcnl(^1W-8H4D}b3y6b{ zqFXoz&nlmQ3mrsI=v(F#4u^*Ve?`&Izlv4%3NB-X>tvviqNXGUn70tQ43j|t?{_ZF zi&suYUOTIn{&^KXsKe0&ovOcL8&G)UPpoxU!DxvqxxBdf?YBSd<87-LFF>+mxe`1d zR6U6$*{6e6E0m<8MBuC9f%0s7s%;vfK}HJ4Bp!@ZhH{{&>8fV)3#BCdhV z5=eIFyd3z~?cRmV{|aG%=qSOB)bJ=Mpy3GpU0s5+bQ$!a{fhc}{9`i?h+`cOun>(4 zCBYrl_1NMw)N6-u{?BV~Fc9vdU|xTTSSl>T3@~qFp2ujhKhKb9Qhmxb^P}9W#S)xv zT)QYaU53F}uCM0a!xJ@F4-$kJL5>L4i3uTt3JxLtePMZ-kj#pTzCl3%D!=?h5gxTI zi{XJws-TNn?1M+}oUHstm^CK|di!1V&9}N%ovxl=Lff8KC6nPH@V%@4tYMOHt6sHa zy!-kx0>%Nk?&TuqvbaaLajt+s|1Ol=TIWLXE)y_r7`!O@Z*Dbn3I4q2dm?%X_xnBH zwk6Q~l6X-dLt@Lzdp-`Q9ZTa(%-c~}pagfGFrD83U*2|+G3xqk|A)oM2$#Ri_Ft2g zXRcSS{!xs)N?sqp3aGpRZ7-V%BB6(uAk#5iaE~)*Y11g;iw!k~ZLh5gT7 zg;kQz$GXHE4uw3KpbHZqu!*gFO=w1EZW)l##n)gMt$?OJk9_(~+5hRj5K_#c z5K`%(5M5SI0E*%W3F^%H`s-NzCN=L&g%huqewQ~Nc<;E%_v33ot;MWzGAT>)VdKsP zuEYCLP1!QyCJB`clAk``S-hRituoET}** z`=0LGL=*J0nc`>o?MIkX9h~pZ@P_nS+&stP_sI5Qwj=lRJf;Qa>88jR)ww1w8|br_ zjpYyU1}^zRL-otA$SDAt4YOt@0|IL#fZU*_saKGgM?IgbPjaBV&(^hjWsjmmWYWwd z$iupG?f?nqLI5#_h95rkV_wZe;b>vB9Z^jt6%D5ksRz$sHve4tVovTlL(Xt4O%&aZ zNMe4Gd}d^X`@V0EOlx*SA3K)pD7?hX zT-!iUy7etu?zn}XvuCKrfZ%7b^?3;ZFRH7QY=Aw*I@QBa}i^wR=w6uk!B>3VuCc9U+DqK|12D?+;AvlGY8 zeI7q-4Z07xABo-_b?8G1@;NP~a)y>)qI@&$O5Kx-s$t8mhn8`F4fIDWA!4<5BR;;T z+AUPMyJ52MQnEZ0kD6mb*>P}c&i+l&YG0qOjXz4xo`-qR2BXIM&NqV!w$9xTyYx2x z9DVEZBlo0;5h>>9Ad3&#u=0^fEt%i_*h}tGr+HN26*hJxjlB`?>TRvAJZYe#jym~1 zFQDAqTHSr!J|Eg0GnYR1IFRM(R3UL*SKdKTevOt+JfGHU^|6?I>H1L>hG5-IOS$>* zN7tCPRYi9C=T4L8>Tcyc4$OKqjxm;*;ngyx$9gnET5w;)1}tc>nG@U3epE(#ASDvW z?U$PYR{7o=Gnb(Du31&YCgkDpz#Twj!s!O)_?wIh=t>?gyISZp)x7Qu^A=S@sZu5Q z0!6Xf^1RaPw=@V?xnUaS9=nx!tW!HvnEYBg>V5Z=G~yZb`rZ%c)i;wA<|XLyEM;v@ zV0}uz({|l{@k^A!6!|Vy!@)C2>DaYS188OlKYBI0BA;2Up|ikS|BNg$)9W#Q z7*xf>wPGqj;MS_{8Qf&OVwU0>09$T*tlqd7ffax{tB@vKG&Z#y+<%RDJRV8N;MhK` z4?n$!Wx+JJ%&paqB_Sz@&8;#R3T9>XpCa;Z+6p&c1@Bne&@kK_T7Ui007K@D2#o!~ zmt>QPGF!W6F#}tzLs?Uwdjj!ZWA%OedSZEVc>&+U_ys*419-LlR%0sN&+gr?hvAXT zH|wqs=P!FX9L5?ChHs`js8GIGq4)nGranRTL-lB+7eZ@r>!%%7eUUa+H#G2igiFap zzyAbJkN+BFpUagKzVnWl*W@cFEUamP{aOnF#^;9I&W^chh{ZMufd`_}G{~VlWS;tE zWFKoQr?4U~fCkU9lLh$g*WYa=uZlWk*{m%%3n3d!up)au)d&b&uR^eCfhiw8(U;;X zkj9_PIk{?}kthlkiD-W`k@~sk3@=4szs-t1VCEdL>nc8@k6rrtf#56<{sLe68(cx;Z*cdazrY8wQa;%xt3W-;%RUN$ z*(??JPagpR9n_Au`y#NL+nujRnWmz6c%S`6(dP4s+fVQ2il}WHFzUbGb?Y@&ky&7J zXAdhfITl9O-^d)O8k!8UL{u_KOz18%}jB+Nb+;BJ2$tl4H2mZ-TC69Qv z7{B)BN;SiC5uu8!VLy&(zb-LTwTb&p&RIW;ifqTG#WD0DvF`H>BSh;ZT}t{K3gzsl zIceJtx^qR-S|3(o%RBhy`@MA3CYJK3*Ks7+Wi_Q=WTOIjX3dYH?=>2a{5a+KN`w0# z5!I^fd1xDz=PsG`uyAggsB$oAeNorkw#SY?OlgjE;2y^#LwCINPWw^MEutc;5r*#) zD^O$i_T?jNNqTi!%AcG+$i+U^mg(z9g68cgLG zVdJxLQ(8$I)`YWHzQ`J&MqP1>i5*~<5+tIF!oDt5`1upZ2Qf7*yyO;DrIB~5s9F9# ztIh5->!|ibZL+9R90Z7hDl_)jAMYGg&vkkQ*wjTIetYjulY{c8E?SMeZmyFFDl=>E zDv&T@`bo38yz_dtPPfufiOq24D=iG~r|m57O~Ut!xFwJ#{e1R!r289O@(8LYu_^Xz z34I@ARZMlirxIjMp2w+hUmD54=;r4g2F09W5mhNsmj}Le_uteJ=@7nHYs;M=A&oeu zOz!LOzlp6z$lKBo$`bqK-kTTETu|#xo^%WZ-cS-!e!^->@*0uRy_$3xsmHbAX{l$e zD#r*C>PK${VvwsorSi@%B2=CF7k1rKHRD7XAY6rZRKLtLD+Q`F_3qj7 zmDeWy;DuiT>`LURHy&TrkV&{P26|d7YxUfPi7wo3)fvk4{e@)xRVg(!9pzL0S~abo z>XTY`>XYzy*87-8zlaWd%XC%dE=HJTPxq&&hYrNGSD#r#uB^2h#KhUT(Tf&~4-FNV7+{-Ip!e0(d6oW1nG>e>2tfPcOqnJ#P4SkdX%rTCmvkMjLp-8cdwo;;!aLMIaJy5r6+0 zz0GK>6lp&A1d~kdnT)ah9HEer;NTVfXNPin!ke~5%nr}rSGQ0RG@d1r-0)m|Jobrq zgg!Fo{-n2}(5`8+ODKUKv7;@?tfF961Lxf2qT2K-!8IZ(-*w2tHkiKaam7-n*SvZ} zrx}^e)Xv&s8qAamLIZ6|a1Yb8GbmnapeZ}O=kB1?d*zetH=aE7{iRq(^cy6vBR)Ms zl_lvQHYWT?Q)`51Z;n`hPe#pFZ(($aG27m)c}lc|?_18ml{A!|1p-v}RTR!Y1=$Y@ccn+wk?=-LTEet2h8ny{4quXMyA@}&*;Bq7 zcEf6)D@Tf8;8y1YsrC*nkGRi#B^>G^u3C1khE~^XsI$tQaf+GOS()6}N@g+DmD!s) zvba=H)UmFM$4dm>TOFi)Aixc}m}K#4dk`K***AP!eK zg&uY6pbQ+pgu1r*6xjP<$YpN7O@Cbw%=JT{q5XMrR50LjhHcE(dar7-|rrmXC zx?4Ua>HF>8{x_W{V9G(2u zmqVM5)1Bm4U&0EJ@zLoa;%7A&LHIMs!-M)o#?BRQHPWHQv~5;s8OtH}%mS^h*IT{C z$WjmPndhkupk?#kO3%RvfSeib@#}`LWvFY2>m+3#AQnaYMT9(x7 zj%&e{w8Pm;&-o^39G2fuHH0={!6}r;^kS-6(Z3hV0?o{wLyfX5FiBkf^KU(bB=TP9 z_0DahY*7nju3)qc^4`CCNbvbl@cD|XipIBJX}?&rU@YRH`Cd;|DbN>^oW9^nE33jC zK+V)PJ(2m^tK-S{msrl!C(SfdpFJwm;#-Ps(K^>tkw_|;N^IV&?sjTLk5+ex%aT>5 z&|q_ViPx6Tacikk-G+|!^*GMpy^%`Q$sx9U?~3)ONkz4CvqzQVrKL6D($3=oAmL)ptP{ry;bjnw$GKGO7xKbiA;;^b&|z1AVZ zmgYTy8w+zl>+%)x`?!`ql8D!R+wGpK5uhc1Q*ArYO3kQC3x0uB#~Ymgm`X>u%oVG6 z?AaiOp1@SAEX$n&w!U4I3ZpHTY1T>Yd+U)N>4Fc7O54#jlpt}>({dS~L7}wIBHH!o=kjH-`4IjGiT)Ej%k(Po9iXq$-f@%l@u zN=XM)MB_4ouX#t4zODJzO7hHahiOqB3EEkCQcsfI9l#vnryN=2kd1sjaCM zk>;ikZ>WI==GY){3W-i_yWRFItKBp3akWq2735POO-sp&hH}((C^i!^#wvhPdtS4y~2GjGba96|DJQy7&WTzyM)_(p?if6d+1H4kdRTLOTUt z@Wj4~K7bRd&#fuh>{0#b9Ufv2A;S!dDq}>;(;M6kZAtmW6Wr#l9sKd_%jvr#je@MD ze%tvCH`zJ3xg<<&Tj%g`lUiXGt2%Gc-TKH_R6qT2CK@JFuK6yBV|;k4VC5d&c=lpy zBR{Rv^nRf666_iygc^E=(fbGo{f6Zv84szEE4L@B(yZ{i!!l_{Z_g+~%{}#o))ldU zE1ZiHNCTlMH=m$5*fsv#CXZU(n{i-G`cO)IwV+As-Mc_4CS{5o+0jD;%JIT@Is1F$ zQHg|4Ni!rvNZ-#1@Kq~U#-4ZjOa*JE_SV}Oq8Fv{^Ofzfpr zTHk$w!I$jq?u^(p+ZCZg-5TMS|8O{GF=kZR-WQM9e%nVQc6MQC_p+Cw33}9Hm%TbI zMEeARh?`$~d##g3zFy@_b+v??>ckakKLMmIHE7Z$#+!#!GMtX(n&N_W!s~jVd|N3R zg6kH90+^4tMMu5`wUsBCH|Db2zeS2kN^w;#D~B2u(6cL?9iy7@%k_81JYPv=J=sSc zJ$xH@vOm(=ecq1lXM-IsGK9qYe!aSRBD)^1aQ9nWNep&|sPN5=XU<)r85kM|i}-KW zY0?zfz_fSrcYP6#d^5{B`RQ&xLeT08Re6#A-1W!Tv?*yEiZL-igm5{Eo@*Q3?)wuA zbAhLv+Z+iy0(K$andiz#j^~ZEPCH@qOyDn}U4!4wdGURHJEKKux5u9>-k$VL(6WE` z=s{AYrB!#5&(l5;^+-SCR(udQatEvRWYDDR{9sc(K~K0<@lAlir{der{S)-w$^?;h z(b9w_KW1pNm-8)Xzre#=P~-`DG+mwgL*7IJsq{(3|CF8yEwI!Evhi#53=>`Cf|_vFg9xl6@;W~MyNteZJq zqwEIVCT5MAH`_Rcq*RNtpK@42?H=aHY8>l3MeAjZAFQ)B_am3_5McB3R;)o)aE!v= zya_=qO;?anJkqm>848%vuvEa^k3r(2DqJ6y179K3OPhU5@7gu}fvngU<1R^Zs=Cz} zcw^pdX=WAaJ&G;UE#^_><1QPtMez9(H`oHNe#ywwr=1Y1jeN};!f#LTIzgmp1VvB! z7BsT;&Fb?lHU!K2JuoG9P}dW%nbrBhnLk^Pjxk;Xgv~Msx;Arnpv@1f5=1N;bbAaf z-lwdyYaIg03%qSkdJ23Fzws3KR)`n+tZv12wfWS^7gB9P`dzKpS-0!8b=^M@5RL~h zc(xCXbPI@D%6ZIpbtlY`L%eEoq#iT9GC|9Y-^0tK$@XS*VfjEOn|4deO6P>F##MC^ zJdv|a?|JuPi)UQU4Dg**>ctjlR+$bPybU3R{>+{3a3(kNUKR2ni=2V;!HodBPf9}` zdcWu9g#Ok3R|z5=>Z1o8ZrA-&-mDHd;Z=Nd(wAJIe0ZWzqI+VYZ`9iDfyGgC zpzm&ZIuHVi%SO(tb=&h7k^5sFG?veyS%z zTW~G#h0S@q53X3S);j5j2rASbDr;22hS(qkmI|1%*?ALSi(0@IDVWf_t{DAp;+p$F z7^Y0EJ7CTh-{(S1TXv);xM3>{s|n&AFpnCBZ(7BX-rDf=9hjKOnabGRge}2gmJc-^ zF0){>^m1ORSqQdIlf82y0<6qQEwDa>VRJ#q5bPUax40nWJR};8E|0t7_ezCgn?mA? z4Ppix4vxCazN-Ih3XEs}o8IeI|Daa_w#5O_=K8;tMuqpKG>)FbUa>=446&&?yk(BG)=VuyYxdC=5!Vs*%JhEzO% z=Ih5v{K)MQ%=b1V24R&OhQkSAXD<8ABt}k@3%A#=#Ik%a_n?PMucy_!>QYQ!Jz##f zA<@6)L4ThIOsOA2ui4nMtN7zVMqm8*r~TB7ZcAtUa2yrpz71u<(8va`Tf>6=Z1@7``KM5E#nz@x-MqF{g%Co&!9vLdjusrpo)}qWe3C zQCW{gfzNbI(;3KudrYn_tAhRnYP~oH1fwg!-2nfQ1)M(K2ypr<<>?9xVukBa&e+UK zM`GGM;A^@b3d53uDuR0`t>I^h9{emR24@NCwut(fR#BiUxr`l#(}l0Wt$wESgY3Wd zr7q*u72nJ?YP<-E3S4YXTr_Gycf8i?N5GgpIFr4hRS8YK;d}#zC2NJN1KLO92Qcm9 zHMmn<+L+m8a6G<-$D5>BKhY-QM8DNX@=9)t@Q7g=&4H4`VXYJi@%k>M3^&W~p%USd4Ho@xU|Qj@#hn zns_aEUrO-Hfx1{`3@PAOK-tPQf|ZomX73 z@mP-5oT$Q-Y%D1wskJyBVjWfN;-iydTS&q=X~!U;nj?VSR)G*RkLe9NpW~${ zw6$xWvduqabk+5Qp;T?DZ$HE3C;E_mnwd0?W%Kq!>c^s-DI!$~(Q)-@55w=< z7y5>HKU_Uj=b6b)Aw4xwaw+sx=HsCd$w=9ZcL+!!;ri&Rrgo6~z|w(2cC^dkOL1WZyGg zq50hX{DFKu@eddOCqncQNn8O%zKXGUq~Tp1wgLz4c}Y02*%&07x$y(bt_g~Ke4p`6 zh9BH*{Zs%Rc%QDa@Mlzfv98XjIPfC7*W@c79h{|eg27O(arZgtCaicNY`ojD`V~xB z4T7wRrwJd{faCXK!2grsBG;`nAVR62z``&g5E%D<*SVyiI1~0xS zA{V*jDIwdUzx*k|yNUziUCTmW3gl6C!)Bzy_yI?8o7KbWmyb^3s7Y^(!Px>#r`~V! zh4b~me7`O8(U;WQ*3S$sw-&6*dcL(4K|u(Vy`@LiZ_Tce!FL_wubr(3@<%`!m0Js! zTZSCBWg1*{>d3t9Qk2L|XTL6312YkVP^(gnN6HzSI|F_lLVl($??%d*u04Cfvd5L( z1^{K|m3hFH#ED4=du8y;%&Xq@fV0M*4v5nm7#{6S`Vy4L4X76Z)bqc1bb`ia1yd4( zkRUNh@vim5L?1w8FyI^S@;;NvNyyd}rgR5FjP8~aCby%!NjK(I4imcziGqB9DXBwf zc$JF>vS&AG0q|S1^mVz0n7=ne!p}pIglj!qPHo8@{`mVP3UwP@7?vnNfdI=8g|O4B z<40P77w!6m7(Cl%@K$m!Uw#K*IjQGa&m*y{$GK*7{p-J3ILP>)n0) zH@Be?e-reF5Of@Prrdfod?U$Tu4f5EvYqR*V-Vm^x zYl-=ha))g@B}0F=;d&ylmS;MA$4RIQ?e@l4SJDbc=+8ZGi4BQe`^~H!<^Wt7vt*Cx z2YKO>+Llj^*DiBoCj`J8ndL<>s0sQ*|BL~$%1TnXGEz7e`KG=JH zh@^mgR;PXYn1VHb1rY134iIa{_(8qeQ#*9>T{z1Zw6=pKextLXlPLifAr2u@O^tTA z^R2OS0^J{<`a`0aC0MAcZQ##90Gznejprw>WaAkx{>k*5=ZgBbNzoN_Asfj?rjzW< z&R~S|=`@*jEwBkGhzzVp4uXZ0rE0e910xlHJcNS1aehUBO;haE5)a>>G(*xbUt`M% zpp+ltuGic%5?>+ZvI=t5Bmz6O`^?vcy!^osP#^Q*d$Fs=>w;D+tAGXbKLR1Jeau;l zo$&24|E_u?b?Vg1y1ERAfebDN7+kw@;i@-&ngwO$uS{4^)47a~0BJ8kaB?t-qe?#Bp|6BS#nqC(D zJzg4T#k>2sz6}3)LBVWfqK8GPD(9o}MvIcD1a=Hz?S12NY@RjK#<6$bJWN=K^RsY9g#>llkV z0!WdlQ9MU54snPO)kRu?&;M`&2a)&Tstq~`Qs6lO$12+ zhJ?_>+H3i;za3`6z%Pe+FKX52HN>pr*W`rw zA~|{N3X&5?qKo8&QB=AR+X$x251~iMDL(g@{QvNnyO$o*&2I*-RQWG$+;8@Y_r>|D zsjeWTpL;3XVSQsyb6ANCgwU#%(%i1%5i2GkF#QaC-Q;os7xrBzu`|Yy|pZ`{o%3;rJ4qL2+9&`qQ25q99fIQ^>NOam?|};+udNd z@2M2}g6{zSFi2>VY_sZ8oBQeO$?OB*p=L)D#d1=TW2(vrQ0*U5^}ZNUI#2R`%cjum zAI^0T-k?ad*LE#}5eY)v5uTdBq68r%at^frL%9n~SPeq-znZF0{HLkP8H`T^LSbe2 z606$%8%9SNNTjy3lamET*fg$8fTZJBriDZZa;#QVAkpQJ(^a)_TdfBy8H?fY_)Z$c zce6va@y+2zHJ0#v( zfhQOs2$Y{y=KM3F_xlym2Wi10`iELM*QXMN{ucst*vx$hvHqRY8uy(dcupty{C_0} zB8S!&r%qcccsc?h{R)5oOxsqLQ$UmtGIAT#YeC=+oo#jCA8@ zDo!`e33E5I z!n^jaFVX1o+0HTT$ReM1PxvBN+0N1H&vMUqDWL1kGWq&`@g$spO6iwyK_z!1aU2~} zFa!`E$(DZ(`zAy^KDzsi!||a?GwWxlM=*!AZdkKvLU&wdQx~Zr+qR1c^sp;5!UHMWw9_Va1@|Y~WZ>+cJN*qsGG*sH^-7n2{v-qkrBFJ^8$U2Sq z(L{Ma#-5FiWeE0-8K3!n>3f|MPmDDil`(t{+)O5;i}70@`KA%MFK@M#5E?Rsq+yU3 zkx>YwwdBqbS8_1{>4s;!TTYIQ?qc*LPp2810^t_e0m;w3e>6N@gQOqbQG0v4w+AMq z1tErVCF{N^Bc-X@4=~4ZNm(J#o7$L%ZOhKRZRhElJ7d#(l-WdMN^v5@X%Pb&Z16@b zXxxQ2;y^?B=&i}a@P{%qk4*fKL*_<3j3yO8BMsh=0S$e4Ljp9&x7ik+j9{k@#~YKX z)p8b?$!mr*C_*>7OH!HiiFvuRSXz^_UCk%et#h}wA6_-Sqfg|%ve8mTSy(pH-2ow5NyrOSDd=}Jj&P6KBHT?WslPrbq=p_WC&?mTJ?}W zFtaSg%Ht|?M~>H?y8Edq?|b(%+YITK$xD@mb><%XJgQF6rGvGzS^a6by*SNXs?R>+ zS^atxkDjkB>qm+@HSK9`=CvMmC&vkXcT0B+B3 z^C9{K$qRWJLAPuf4@q}24cCU1*-&me++2UH0(nSSn{(xMaEMG0exZaAm5%e+%adBJ zZ*{q|#EtV{TbmrfZesI;oxYh0?1)r(r+**cXZwM~5G@#?=?MU4(+@YBRbVzOz-)xQ z>TYj$&O{iC%-i#t@ku{hTx}2I@-AL^1kL?X&6wZeb@EdTmE_HwTM?5VdGegLh*))q z_dc`MZo|MSFdzfNP>qo+7vhcY_f^(u$c|AoHXmp@PGh=jF5--0;`*jVtwY$x`I+X~ zSn69&*>2(-F9uX&zxMv@s=YyYx=fR!H=z^FXnM%4&6DxpQkrgW>kF3hade*bDiI z;O*@WU{ZX*q@X^ZfK7D`E_N?Qk1zpg8VkYA#R>>mSZSxfqyQKdFE5bvG~A~2w;2l4 zbO#B%3g7~s{SO8Fx+Yk#?zS_!U*1{43c+N}CSpiEgJsy5sQ}YlnJ#v4M~zA_TR#4L z10poqefUtFxbriWVQyJ{RD0m!cZya|7)`odhA*Srs$Tu(=Lt8#7Gr(O_(dZTFXtr< zC&0!ivD!BDm|JGW$sm+izOQ>gu(eu&dO{!Aa9)=I(~3~ zO!q?gw(^T_8HD>j`QKE2YX8Wn|48`EY=p%pI&bsaxX^*2A<3yH?a!=(X0~a+7IZud zhap3E|$nIGOwYI^*L;(A|MLs!ys>{WJ&SI8370zG|)35G6LyY&}E zq2Zdg`cz#zEUO)N!t*6H_~(nk4+?n8ClCCX%mqJqx~S{ilj*5aUdVOQTj7@;=IlO?zylyuUKr9(jcuFJ~!&rRi*PT0e7xd&!bt~6R&%zN35x(u`jGR5pw_BzPi4LtF+9U!sZgWGR@iL!s)T-xxeIhAQ=nY zE%)h8`=UrSEfj3^;rgqsY@D48aaSX>p=Qqe{bBUahIg5y%XQzqv-7G$LZHV{;&?U3 zIma+-9e}$tpKK&qXWsM(!3Y1D)$#aMn&cPz!fMZ~2CmagbG;Ay(z&^)@iiSxm(d7E z^#H&=*+fI>g{acymf^TciI079h=w@k!MH~_?oOJCB)os#MZ^28%WcfIlVT!y2Ie*b zSlCNL@FyiiLsxAZ?89;O`FP6(LhagcJENabdPbVHp%T%Tqs<_z+zg^5!+-Rk5|5&9 zy)gu)n(IA!H>3Xf{m9S=ymWIx;xFQ8p~=VJ4Wk-fpDE}n7wb6-*N@7-pQD+oKWkMU zVaZhc(lwt7E2-4QOy-*}yf#9*rxCav;gR2b++H^Zec}6hF2;Q5o!{~tZ^_kaJ0n!r znRj>}EB)yP3rFy--_7%gllv6AJt2cp+Vv>-9ve#|zF2eQF$)>4;vJfw8JHhE@1Ndf zftsH^dPO-YVXQ(PvrRYK*wp5m)51Up11}1@nL|?W<(PT#tMcMm;cz77ZV$_oW}}@0 zdNI8@YhI|D#fZ?Y%v+F8B)8R+pE|7R=FCXX-iRsQa@3XWE*i0;(ymjk3Z~r^oV#Jb zSq_?f-wHb4C9-G@^A#;Hhu{}W^k)UK_ICBPIi%6lL zg@gY9;9aBUh`Fd$fTEOp^i?C8bM(pPG(9VBr+Gg5DY-s#)Jf1ZC8wfRyVzXtKh()-`P!Kn6fMPj6I6$5-huBD0K=|Q(zpc6F9HaFbkza4>VO@- zkRw5{r>ET#$DymuQFaDE1TE>rF9rKvx>*Y_)L#Cc<<)je!AQ*a%rZa%7*)UyUSi4x zbbWH1F&lFOm@cPn*4Vw$hSN1c|NDY~KGd)}fEA8S|2+$ZeM&*C(u0M+83S}dFZjs2 zL~92p@Ncv&`EdGe&gqA<`wQ&X>ML-z;poxRlt1{m5)_Z-zXJ$?cK;5k$AWBeuU=Jj zxY{#|hUtx95!U^fa76r2Hy+{pP=A3l<=9CUQCDS5nk<$Za{d+7j_*A)H1(=W>na_C z(HRJfwAyS4ibg$jI0A_l?xYE#!6m&^X(Y78_|oX>mh09P{^$1OjZboPWwaJI#urmO zYu&0h)9umiCH1ORKiJ{tyAc!tsdKss#$q89kRW!vK) zI)k+U7u9esM&UEh#c>V>#29=b#-f&ZZ~K%<|9rD2-m@UdwhawG|f%*1pwxH zt`dI`ORDz=*8NQYwm%KmoZrBpaNRhEV->hWKPR3ua!dgp9x*!t&~u%<;uX<cp3HiXc$Mk=P{vWJRcqdL_86X65Zud@+!azH z()05uN@+k1%x9l<`(T}E!dQF|-D-az3B_j>H{97GWAIZcR>PHlP_3pX_`Y}bdvWlY z7A^j+s-vf~2Ql%3rn z+D0XA71E5h3@TEqVUBKS-NH~|>&UU|7Rs>joZuZlVCU~9M(moIpkA)r`hHbP1<-Nz zYimH(qi*s3UU2uTZ*Bw(1=u-p;)R`q;Y&N`ECF`j{SIhfGyBCbFgJ|e3;R9?13QM8 zzh3!-91d0w7wtK=cdz~x>=16mcAQY7qQBApf`3u?ukdiR7I1V1z>14FIWD}+IgymR z%!udcE_f*2{n@ByD_1<9bFq`J)5UaquA>K#)2@=FEMo4_|L?RW=!2i@_ZDP94t zVtXg0g+ekIdc-zBAqftE0`(Ii0rYpSj#SLEOl;r$t<2(B@pACo(RJ-^%?aT3mcKxFn)%`}8S3lh`kv0m zIvz}n0&J->nwtDo#g&ec;5_Nq2Iootn1>G0z+^M@z*UFn(5=?4&92#fe6f;)W&$XO zkyl7BE~!_oTPDw)IYAQ|;5Q!l=gf!`9Ui=KENYyAhX<*Lz?p8=qOD(^9|9LD;@E$2 zzNEq}a+CKqyXK-EkbbZWkp2QJ|9lt-n}7Yn0-@({z$f>Qxy-a-0k{k4x4_XE4gCf8 z7Z`9-z`%()enSg3^&EU~{9nNVR>?B>@VR|2rd}v0oCE=NT6pr3uVG>O8(p`$M;Fh@ z(>RufkDcRTD0y#pmt3gZ!phe-Gu4g5zvqhg_fV#FqrY-697PW|&BfaaKJJPlpHlTN zMf}t~eFD>snMhi#7A9w{j#wVw?KWv!a zQrsAU)-aM8J0YQaX|XMcFH28;ZEdmDNKjbmkvTAIZl*C|WmsJg8zjZIJ>oo+)*@(_ zt2$EN*umX6s(+8Ku^-myGMfB`?Fw2j2^2^|Ixo(=IBk?P?p3eGDYd zff*Y(kZ)}T?7K*N_s*-H+|I5%aIqs7(c|sLh7uB-h#l==n3^VLar#0HNU|(SiAi?Z zIV8t-2Ljsle5BhKpOus~9P*#o@cs-Gs;s>G9cJlrBJpFIZpZxQYV8zRY+~P0o=WtG zDvyhK#qYJhn1b27$;O_1cAQ0SrlMo0FK?Zjxu($2dpOIw;}%I%N9yzp>*F>557$Nq;4tVNSLD+_Xn>Z>^V$Lqpz5mS7z0P|saUCP@u(k5g zJKLnsxXKVQl1u1MnYg;j@dDkc!uZi44M`uI4DUtmJtL3Jbsv4F73o7sqNIryQ|+Ew z-KhL5McYy13^bZZb*Rm?DoIHawM*hvO1{m@PIlHB?AQ{VYR|h^Kc>ndycIlm?^-b^ z9ido}!1WN?g$8rkUkZm~NU=ahOH2J4v)<=X-M1SpusoeO2B_a2>VLHO7o)Mq&!_yE zSw<|*i72G2^W{|F{x(nP<_)Q~wiwsnr}R0l{M%9l6+n!p!K>Pbw|m_$H-7(Rmh?pn z-W}Rk2x|Ead%$z3Zy9>68Jm6kuWaxxO>b)pI=|#GFrM1P{;#4v@?XJ<3MOPxyc)Oe zswk9mFRdYWSTsvlg)=agA?7onRKn`?>{y9uTIlqB;|6PeVg7OY;yVa=o=yK zNj=XJ0NC#xfVY2;J65?lIhpaivG;2g5zgt%yN=q&%^!4PbWu?JQ(WxeRpIplR{65zmD)z2wKl0Bzu@+b1pE5N7XG1y~d z+Bpdja^OFRu3B*`$a>n)JSJwF=;EDtHTfe;@?z2a?lJR>3}afgDcSi3DegG6Obh8a ze{mCIS*27fVGF|OXG4H?<%BUGAI7V%{I%oEH}x?tA||WRV5?b3C3LD(;kit~UJV~7 z5)hEU4g4_J+5*OcCgHI}8pdN^ zcrz3Bo@0x?#ES1Yg}AQuEoP9W?148K?v@;O36s29@kA6Y8$SK1U`$XnNqgzwtFaxg z2*sOcn3RDOStkQ9z5~UmKz{8%vUw8FHEdU`XYd{@w6hJ04;2YA(o z_WCwB5higDpO$?LG*S5NcJZQ`^aEpNmAblGof@->^z6Z@O&pJI{lKHJMso7CoWam3 zy2U3vl;WGRt*oaDZsM*>K2wY$3wGil`>G^hx|jQ5?|8BlHJmHGQyDREl|}B1qU@)C6A&CTS?l-}tPEaXe90gS7Wm_m#rp7t@0IPn^okqB z?9d?2(^{$DZCD2*@VSAx%T+Iejn|?5mgPn`avL=(}}~ zC>!GY4U30ps?=;+nkNkWFauO%6-#mf9%puoeZJI)Eu_1j3)uQ8UyzTFlE{L71nP^u zTYsC+b`;U%u3g!#^xUpgY4c2b;W5eeWxMldiAp#Rczo~$J+z^6W=0IaWY@trn6ojMEf1t8R(88nJ#jfZsD(M zO9c$!K|9Cn9F93vU(O;^4oKj?Be`>TLY$`BaQ-S85TuhB$JlZwpJ4__{8Z(qq%DIS z(gd06-ZnB>dv-u42W_rn8O-Tn6HgMvY_12=)AA^UhBON7S5{T$I^0DAv3BA>?2AhFD3-G3b2V<9m%feK2kQsn_ZIdBjgcdbP}h( z*ftNE)l4SJtOH$yKT&>q*IQwD``k4$m;tLzF7J-;+N#Devhu?0&n`T+-!Q2l*9h@E zOkj4Tyy;}t9JcUNckGlvP#-+qV8W^OGl&Q6AfM~a75?GeN{TxSyXCI}r)L%G%b*Cz z$1LR!P2^)NFFKU0t!|K{%rcQ74cC54M6?s6vW&3f9tKiN)VR#)%zZeFK)r z+ag9FdGLZK0s-l;^C-iW(FE#D-%^lgq7m!7N@?8UA18J&k{1F88aLmUtu9NZ2Mn;7 z7d#`jq5sl3A&gl^DlJo6nqr=idx-xab0nRgKx_$?jez<)L!=e|k!Yi(nE8S~?A^*H z{=5_|I+cmt0+cW-Yg?o1!9F%>suO*9YVJLOgyV{Kkt1s6^c7sH|+|L9#J1z3%@Rx&~NsrMfa9xdsBMT|3;!0+#slb zg-$WCOe_3(zSCzO>EtBmelH;m3sclkC4q>)BWn7LJ!(u)JmKF~qkv~0jsutF(;D(6 zfLxU=UwG^L5%G>=oG!}H8P8%vK^F1&l7x)}gLAJzkTrr6Jv=5W7#wpmQrtiUS^W{^V+aZ?CoGdjjqvy!tLBeHPCIGoPaD$n zUa%SHI#t-;!xDJK3HD6PLlRbv7{Isy{^TK*QF09A?Iq(W=)>|F5u*}wp=5wQ^4RV< zSpY%+V*p`CQj?)to&}XN`bx5t;6?tH78kL=M1TjR$q0mGBIA0E*-Wbb_=ywU~rBI-%I9SJ7!B3%aBUU zDTg35g?wX?5G^EYu6mbuGwRj@7Zt$?1KX2-H~4X5!1jYS1*w$E7!}nCUC~4Lr4vj> zD2{paU1~w~f!N-}-f3GkXT^iSEpAnC9b$r5Lb@=9=6C(r>&T|zu1RLYho~$=B=SGV14> zqU|SHoFh|mVD!mIU9yvEZa3qiNT?J(6+I?uq1bV?p(Zx&MC>)uhR9>g zNwL2+whYL}LDuo=KO;8eJmb$mYetmJoYm*lR_+RMoO+rQs`0Va@JQOUEx_B6NYm1Y z^IzjGbNJ<1Aj(!Q*Y@!rpgfV6rV;%6QRuAXvJNqBiB=JaK+l|$km}7e+_o%0;4rDd z4ju67?NFcry;?#c7@`3YVbq1|5hNfIT9usL;8R^b7kygmo_Xhrfm!}N;uu3f0 zwH7wWOE$4dPg6!GhzJTL%g-P_3SCWC>?J+QT<5LU*)Xu;B@Yn+1YPqjDH1A_zGsG$!5ro>IbA_uoLwAny~vS)U%} z?1trZ!=~|9O9gxO9c$nq6t+wq*X^EQ%I~T&GP>{ouKe}8{mkeupf~-wsA=^O0t#`l zyqlUblDPVs;VwA%K{nsylcn>_Vn3G? zc7~|g=H&hKlu#@0FR0M)62~#(J}Mrmojt1S=MTaDKe^E}zs6OzWY$~eZ2Q&{A|7vj z=CnSZ`+U4pcmFFjQF{9Q!L8w^ke|UEn9!~@7uuZu?aVfPfZLRTAV+pCP6xMYBM!?m z;ds8g=f0TI)A!}jNi;qXiEk3YEu@|}L5<%)Va==pE%Mhxz9q8@`o)1f+8ka$xIQWO zZj1yLtKmFV{)A*)nBrF;7gz(mD*U@HUqofFUq0{W|HY9`(2tWN+#|i2;rFCRv7KW7 ztTt5PGqr~uaI#@=Ez)T)Lp4Lw+ECo!7}KO1Ui85Zwjylu-|vqbI3NC}DnDa3X6r%y*p(!c$-XL(a*sBidmfSCZ!Swhm?Rt-7Z3p=rEk&5nXlxdPFf6eS&=9Z-V3Bz z2~~S(=HNFV++*4+NX?=IP^M{)4~Z(_5JIZ&yrq<4;FE`WZk9pK&aCgHzh#n=i$5eb z?ORbMii3S1QaOuvt%BbuE_KrsgJ5hk!t@*EvhUV&*M~z^R(^v$av05Nd?Q`2j%17J z-_ikxajk2JzNNPoplCk+C;GgXjy4gRh258k8w(Z9 zD@-Hu3lFiwjF-$2h7?&%jBLx5kc7E6qyW0uh68RX4@+9|Ze3Q{q3(gGBQ@TpSnGf6 zrmhs>_qvwN^k76ec@WP6yvn8$6X@q6${WP9c7uy2AB9%k4+B9O#sl|;FM;nJ%z3WMkq2YFUJ=z<6Jl^Vez?~;TK1n+OpOR#*2N$D zZza@1N-rcM8n*o-C>}#SX#2?%Ab6M&BZJ6Nr`*2I?nQ63XY*e%VNNa-i_jHw#zk7t zKXZy27kVK)<$-n#W3Ys2qb*)SV3?#4UcIK;&Pi{|cidz(H!vKL)GbTa7(m#%hnf?3 z?87?z#9WwyHrv02Xyl7XGcIaiZ_F8NMk%}GyOjoa*rnF+_CBe8!7?%jz9Qg|ci=61 zJjkiPGdxs;cD+Nwm~Wl^FsTR~n&dje_=RG?U5#BULmX z{{Abg#evunyukl2Y~^fxVm*K7NM?o$djxA-J+=$2S3x|JbF&U9B3kHT1-ul9zyVZe zqq=>Vk-*li|5EbwEoIZD0FAG0t2hyzibp-s=sa|ZGA{`Q#aY&Hg8(;Ff+dOS@Fd?_ zn5KY+IL3!|F1{jS%;ED!Q;KU1>~$G>JCZ1=t#uB0eS5l9zwW!$ejZORGb9pgbcGLw z1w#z6iBP9lYa9X{w6M-x7273Z_`RY|@8@=eb#vgxwSjDd#g*8CLRKBRqM447Inqh9 zDg5a5X<>pSH)`i~+T^ao$TFYFS2H#CcMtQ)|2<}lRA$a!Org(M?Qd&811n1W9i!+K zdK+Tpft0xE!5)~k&v(<;PDXl$6SfJYg5o19ESfE-LIxf%e*-8~PJRv{7gb-j5(TS( zB+g@=K>qU{cE`WpmNXz#K)@=X=0!8!PgGar$M>9GUaU5KROkmi2fy}zdr<-6W*QSI zebaI#M<~g&wBmA3DitbixEv8rd@zM4VQmy{YX6Olwd2hjY(7M@De&w}oVCpsayjZ; z7S+XP`_zyy;zU$c$PN~FD#(z5{O!}=8!LWGR$@gV?M(|?2Nv@i;1DeI*T=4gxbgP; z)aUQl@vZZ+9oXSF79g2Te7>BmX4tEa&&xFA+KaHGj7lln)L+<)y3q#V(n4qb&3jxk zGT>r*WrKj|{+99EtFNU;W)<*HjGUA$rR8N>G?ha?hQcr1i7!y(!>~cwD(rfAOM73A zAYKuYULwJc{qhS6MC)Ov)yc8@%~R+yPB$aQ9i8cVaM215$_9j*q74q?%ro#5TLXF)^1#Im=XT zb_xrbC>F}vzQG)ZtBc?5wmJ({fX|UPxjwlJf-zjsJv3b&M(QYezpjqnubN1NP+-0BrT^(_V zujZc5*|t7fHx2Fx-Fx1wL%f|uajn!ct`}{u=dyNbd!Y_7cVP*ow4(JjLw)$27R1Jq zO4nBxErY-?$;X<%SJpZ>(E?8l)|q0eaUxd;@Q+LtCLjjHbsAm4-L&FH z$AZEBQHE0cUDaoLDpW-$PIm=k&eEAOqpwDhdY{sO_2O*kP<+$MW%-=R+ryfjTG!RE z*2dVc<3eaJ8#;6`C0>S>cdM@jfvL`T&U~6E0glvL1^K85 zFY`f-^uF3i{vueg?k_9kafnk1sDS)BE^7>bXfFlQsf0QW=G*;ZghQ`Y{N>}wH)vS) zpn@ELM4}1~&@s#moJfBAiZ~+D^mP>ZyAk&+HkDR-hm|xJHFrl{Ba;PJV6~WYbA^C0 zv00IxQYtxN)GSd|muv6MZh9DvdjA5OlFdl!w!(miud?|P?HLXCE3p5+l&#D4MGE^% zeplQZON2G({G%ht1EJAeB~+c5koXmG&gCQ^^%mSm-8)SaLEU?xbAG;~IJ#46r)ft5 zOx#f@?pCD5Z!7d54j>{i^9uW^UKky8fQU$TyK3{a+_CZT2Wn+Dd_P|;;%is)9EFNN z#1Y%;zN_b!H%uXL`natm4b`<~bG?KoQfwW?G4*YRS_^gXLTZ|xW>t4)uFX7XpgTZX zF1(~8tMm2aEikQr&iTcHbO%Nfrr)-8Om)Q5C+&~W&D51W1zBPLfcUrx?Jmk5+w}DS zk#``RbPP)xk1enJ4x~E(3*7QY`cx2c?<>RK92wOYq$SUer>$!tITu?$Do9>}Sp&|S zDO&_={PXVYtPH(T-X!)=u&^D7k^}Z#uL*<1by{!r&DdzDqojVTM`bd@mHc2a%S1s# z8j`LD`mlK-$oNiqPFca69gTmp-%M21b)+2@2d^N+_g@YfO6bM5PFO0zTB;88tHLu- zkJ|eyPpsa@3*}DRI$aC<_e!72=nf!i*s}2nWqer zmZL1wcdaAWSv6Ws+<4_&0O`Q|<4S&X6>5*S z)pWqEn@|U-@zqu(IwO=CR5d$nZx*Ll!SSzv0>QgXB|c%1Nx(%Al9&mNeDBU4_5qC_ z)9eg2Q|Zs|g!xCNU$k|1!YDo+c5GMI*wM|8^4!lz98&3L6*|(sz~Rhih3gJRu*b{L z?DA)5yX55p|Iz1LIftu`t9kX2UC!niMaHla!RQllW3XKY6+^oNPTX%@;*-ycB)^gL zo6T8;tRm#*i`8}g67_n%&0oyXn+ZFaR@SS(uO}re5oL^;4!Th3EtHV80F?V*(cz_T z5G8kRb^oK22!O_X^Jn~R*pED*Wf5Nzwbql&BEn+I*=sF~1O66;zz-0pjk(lWU3_Yy zDe;!Q{mWNElu+X4=WW8cLR7yRv8D4V!QqmiRwxXtiN)>P@;%%9`%6?~Jksh`S!msw z@jBK)MFi1K&ZR4w1x84Yo4cHtVGf;o2X@r<@JU1I*06GD3jur0)$HIGxUB8?oO*GZ ztkY9ag+=pATqp}zUIV!I>le-B+5UvNNHWmpB(20qnSt>GHRS#Hel1J7u9%i$zoT_m zg4kY7>Ul_T$ko<(<#8Nl{AqDI&HpnZ4LQ8P8R~G|btd{{{)hqkL?XG&X#04xVIhOm zQkk@4D-2xYyqR#sxMWkc|DU|W8I2T zSpygoUoK*ot?o#a01Z+qPk+TT?*LP&wnzE8yM*wrJLSoK-8CrkL4osaqN!l|Yk0g+ zn$oyWj@C*DIF?-qbEqKrxW{E)NP|UH)u(KL?N@U)agD9fx$`Hi#l4bvV^FKK{1n%q z%p&qNlR>^@0MOut@9|{2ck+^&_M$^o@H}tovBliZJ7_^`o<2sfJ(K?K*pe*vF_f)u z1X*WvN1Dj?nWW$;1NK}FIseJOYrqh!y#2fD=jE>B^Em9_XI+zUmIXJ4mB4`omz&W2 zp5n%9Wtukic$rA4Z(8>gDbnoCpL|jDbr(_jYyZUM4FZeEDWQ3>U;Jnz?HBvONWWs& zsTcxuaBb+%Ezmz@s62M(-$nISp@*0-HjJHdW6tG{Ns~@JxE16?T+0_c^}(K7AvLN2 zpQ@|qaNFQT^3xgNkrRLy@+tXa;->=mWLPe>C)92g{&9oSxbL^j)NASZXgj(mjp8ZB zZ_I&V3ix8d>dSg6sXsPr34*{%x`8NM}t+7*uRzF{boGJ2M@`-4vh3AdZK6)nppa>=0rNPQ3 z^^{aH%^tDo?Q4>NpTw&Kd#Ek1GvCKLg+ORb`7XeP(VwO)JZja-CU zD1)8|l1_9fENy#YwP!D?w$EF6@LqVTZ5BH_r@z%M9ey)Pa;bG9h+y9YeROW{^q@C) zRZvWlC}rJpne1=&(=1YVi9JnAxIn1B8lF?$zAq>PT6%^2COb5?vCnz6a3c23!E|v5 z(g^2Zt2hL5z{1C*EAe({tuLk9d%od9`y&-4!}E2QSo*E2TC7Bl?3S7|c>EP+FLp#`w#pKZFup zD2yp7w>VG<>QPW0j&2_vDVEiI^aIdrOsmXDH`De9G+)=xnd^5*XZfuzGU8WXj0N;-MDl>_`6uuOP!##(QmmyamT`I(iS@D8>_SS}s6sq5|t_+isQIL>Xp+RO{8R*C2(L^>H? zo8V3F`e!|Qdc8_xR!hE4)&$Vmo1LuwN<8JL|97*46(Hm=bu+N)c@yB!FVo_Cnd5Pq zD+LIS=LReZtY%DnT=fztS`=?I{Dq=6#eXJ~M~i7ouir`@z(>8e+@<4)10lVS!y}P| z$Ttv zkv6hg<GS7q4>wJE{zehWOFErufm9 z0IG~tgN2Wz6u(bRm3OMlB5oJeRL^)DI;^R}{MW^Lr5mx&y(;A&)eq;cF=okrx51Ac z=E^%37Ro!HXOr&q4hJ7;;79e@4Crc0{OBqKKE8rKufvln>}lE~60oJ(I0dL!8gd%7 z%#;@ax9qw0%h?M44=($}3e59)oCH2zeDy;_?w$B5ucqVbo&2WmWZGRvJi(&ZbIo}{?dc=5KdOoU zg_F~f%;4!+q(-t#N(j&#%|QzWdzmj>m&T#kEs1LR9R_*}y%^B#Jk7&$v5&!_*VZ6- zUWhdD0u9b_2i9>1#_>(~wFam|0D=>C{aNmTpx|i<_M8F>2mo~mLI4)XDfY2HF@ z8#lxm?`+hT=29Gd$t5Y!>&i`b7d;^>WcR!rJ!bq_6vZo z+>O=e3%M)$2!0uX3lIza_)mYWK6QtQLH`!^T={z7`niY9yjKSr*OjC}3@pD)OZT#p{c|_g@5l2iap<3naeX{O65hUTXmEeNgv|L2 z)n9TQ5&amNTX1|nbO9E{_qYT(lUEV{iX{qH$O#@OcjxeMa%M*HS1JBIhzi51`WT0Y z^NwA0m#ya5yww_ML5eu^F$MPg9`qu!Fb9Z9OAc0B=lmH_&Uz&-NhE^MtbSs)z+__h zZIlxw=YkZ~^S3gQ&Ro77kKe#09%1iUHdR9OnKnYi?awcso@lVK9nqGfh6*lJqJ}2x zI6ieT$1UGwD&r<=UlhsWv_U*+MD@q=RwiPZlk-AMB+>n$&l)zpP%gS6{Kfu%O9()X z#%$+qiu}Wek2d_@WY+@vVukALS7=KH-y32YTdQdiXcFTN91L8tNl5jGK25cr1y)hB z_w+S1c9{ilb4O>FMdr&wz(bLb+nfVD z^c{g6;ShZF9f1*09}I-Lye~OZ^RiyP&=XT;M5h@~S{;EVbrWD1ESuyqD4x2;HtxNS z#e0d(R(8m|BRzlCQB#V_VDQP?2c$jzjbFd=fVQgAm;*E zUzq+L>ED6;xpxw8t4>u&at+XNV$hW6xO34X5I;rsU!DS#wLb_nv^u)W);&};1Y5tP zQN)`u-#*aMks1%pZdE8O;ZzQbk^s*uwW+N(E}WXWEo}$8PV0L47B<0^W9VQ=RIXbtR`KWhEKF! zN&oY*#`|X|nOtTQCCQe+R5yCC?6dq!al&Qz@U7OMUJ^lKyo(#8!HMvpM4oe^UX{q6e`>EWq0<_Zqt zerCKA*UeJG9MbA1k@j)+X@+ml)gonheiEK&8n0)Z=23cNKg0#>KgKv8jju}14SlV9 zqT1}emb)n93)sOgag_J_6}!#1-ni5@FU|$<_ukgBowpVDxoKFPviW$}^x|N)HqSqP z>7rhxT8NN)7>Bj9L*Q)G6vQ2V?FWK}UPBxk-{I-BpNp2a>9`QH)^MLdH4ATbF1xhPHus^Pxmq*MhlciJ^P`PAjrwHVX zovKQI)4iX_+Dt&ME?M(cSVJ8Y!*|Mrw)Y#H#Ao=Z`(@2Ps@zYs?JFz)O^7e1q0*8T z!vi2~J$rSddFU1%`9mMw5n+Cxs0Gm0Z-)YRNWxE!u=43a@pvS%Zn2H1nKr$OFiHll z;2lyIJb_eideC(*flM7s?yF22KH$GG-l&;F_=0MbYYT>H1CdayNQX;qZ2t8uxrgb3 zr+Zj{I;evavWmM?)LyJnYvAS!tJT<}yj*$?yYo3VMd?5ndE&~a89=+p_W+ZMqy zvrsAIPJ>Mm?|%6#7gGnGUtM6})P}eA?38%5+D88lO0dA_4&AY!9aZ8P>Ga)9P#`6P z1bM{`42^shNd&z*t-BjQ0`Z@)fi{nEWF9{H!1{meupln1dT?igKV~4%0L6T1zv_(t zx%+OQYTk5%!v{60P$~u$5`=h1DvsCCLGIUExOYPwuch5i$-&y0@RtG)8;X$x z<=&zhZCE$UN3n3dhWkc}ma&bEsIhn?Btg6z>-32n(l))P*rGLDyU)(ul#kP}aruV= z*fSXR{0H`I40_Q8Ns}(*VH`V$Uz5l`Toydt6g&k&&c!Y!E0hjZUgGC$sqRj@2dt^q zZJp^6%yD|xA&j1p*zU9O0Lme}CgO!5wsyfqB#qEtRoErD*-Spy@el6ZW_DD;K(nSr zf^GgzBdr%x1iQP2#gm<0(_Gbrj?G#*F)~^wkzlt9S`oMB}>^48=rZ)8t zZ+c-$eYg4Q8)0R-(`j|>Bx-e@n7!*BvQ)3W9|`cAlA32(kmk}F0Ou)2qyeYqZ|VyU zW>9hK6p8s+%Doy24&uR8vVOB-y);WL{W%@(tK_{s2jTON zTHT%Ip5L)wSRbF!)^DT<7R(C#O+nJktNo-GwLFYilLKDEn7jG-70H@kw}!eWUMru8 zvT^-otZm2Czd=4%27VPXC21UUBHcWOzx?9fSqIsEBKy@swK4dL*qxi_?Nr*SctXNu zBwO7qRa2@@?vMxuo$mXI$O8>jwkcJu#63#|;ho{R-Vy4;=;8TC1}g!Bg6e_f*ofw~ zp0AabLpj0p%3HhDKTCU(wUS~y5%8zzM|WD54KHFXHLr^v4FNRu{>c9r`*AW%sKyo! zUiH{66USsNmzRAdN^=cK4<(47adE5wA;5`rZa3okuY3#D0!jGwU%7`3Sio-xZ<;CD z=tm@VTMl8|*%eyW?uXi+x0V>$1V;D@KEJ*~WC)ivyIBy(yjw$VoX!f3a1|}4HA6@G zi9C=$(CtwGYI7&0-U%JP3O?^}k8*t{E-l4&Mv7WK0ut5P8P^x&U`Xlc3ig5NxLw*f z#g^ZI$reXT0JF5N)bccROL~+f#gy6LJmnm{5fU|&-|kd4CWAi-3&XyI(GWFiS{*>RdfM}c{05NJ@sM}ti?W7RfP{`zOaYp zh27b-e;?K!7;B-cM8_767u$i_yt+_;*WA4=V1QcPsAjo1*h#1ubZlkUu{Y+;LwCtUenp zVblBpOdd3cSyUmyGh-Q!!gY6_yN@kczBrO*(woTkFDiy!VQqdx$UrI1XO->A3X2I7 ztsdyPi@)DOA@$C|Y#>Jv1ZQsljUYI0@09UJ%P1goN^eVX_UPg z@9GR*);{1WRskk49-yjj(WV4<}#X&)xkxTg29Vx9+j72NRlsh zuaK*pl&WLVsS+u^&t}AC_~CC^$Hje=v;swk(leecKy&TsD`=JWi=%xWp5aGp`+?q3 z&0_m&`*mw8dq-kx(D(gMimk-vo_ZI4Rayz!?IS;2^9lRX8F9S{RsSN&^N(<)MwxH` z+*C~@SD0x#$5ie$rjk*=ol{aT??F$GAMX4NoZr3leR-$cZKz=?JrEglSc<=RxC?t# zEX8={V*%1qp)eU2EQ|zgi*e9Y;Aji0xO=qCDa?FZ;mYPHkD$bW8dg6AGM%-1n{)i! z71I^(b@(23A%N6@$7RhcVIeE>Q%^AmxH9ElQlB+zbeENhW^(USLGJvQ=-$VmGeML= zs$t%T4{5Y^{K?(-+hL@%<=f$XNUKNE<2FlOZVr}LZN=e(UF>M~7^w@ditdKkq1xJ) zqj6_nQO84s>$i2Uc~~V=wzcq)9zq0`5+T-l4^RIiI*@+A_{GU|JeEVMA2EnPWcGzz*2rCP34e?Y=)tW(95#OU29uNp)Q7Zyx&`! zMIXeD9OY!W>>Gn%q&XG7SfAuOI7A{Aw?^SFs$9q);=Y`T^_C@k1AJgG3!GzvuxoYs z2f@kyI;#XsWdRByf?X>7&)dB7D7~z40t2%c(lHr9tD(?hE(u<$2y9Syh(H9;UI_j| zOdT*maOCsG-Xf4G*J_KY!#{gqbdb<_XjzQmG}`)#G3K&+bNKs^p?e9dC(Po;77;hw z-|ls$W@(R`L1|B3V`-0YSV4WMd`){jOK!FEB0&shVVj7P_s{QWAFO@3j&a@xpWCPN zZcOi=eUX)4#arkgTIe8KI87G9&&9^C=>2QOAJg;B8aD8^Z`~JMQ2=lKKsQ^h0b?Kt zXR!1(5&ZH(IdK@mI`pH7tcMu6c{>Q6wd|MDs9(ANm+sp;W}3!H0+Sy$lKX-gxeZ>V z(eCXMT5yo!rh$%$<0gR1Zihq)rAhl&a=H7qZDMZ~>2jRABqwF==9}7HPPZsjIMj^t?ho&E$_w#!?{hbwC=@OeR8!wjeny(=H!BiuLIv`Jss#i`Nf1p+l(A0i3XHdWYtTt3P1HZ zpkJOUe9g}AIZY%>KY6!R730Yg`hfkq+@V*$BVq6IC;c_9;gp{EfT^G2)bTa8e8%g6 z?Th_NY7s6M#DOZ5#SBzRo8As4>?l#3{z$+f8<@*&ca{|S=8$#!Efd7CA{);YOsSA)qGiEZDWH)g9`h zR;Z*L%T&MG>28M-gDPbYPLal$5CKegD4M$^-h_OO~jsCM<;tsk-}>dbvJu zqfn|i3` zM|3xpS6-^c2bCNCBBe@I8}9?;mP~$AaZqifESaG+pPQMCQbiC0dQTi3%QJPF(~@zu1e6fKPn0j;)_F zga5s8AtWL{@<n7BXOx7D{cl0HPh;WElv~rEyh_Irr!8e4? zyw2fjW;xXcd;&({^-(tb#Tt0Z%Am4}J=3I6T2%UjUX^h2%P9|pjkrxlipp|g+lRyY z%Nk3{iTC?zrbVWEUxXM;L~9y`=dsBtxZY4XIi+Jw`#mSn-8{gplm17q@6ovLtkuI} z|9nIJlLl`HHC`o}jhh(=E&(3E+65pj^1j6oUUby&{jAj)*-vlLmpJ()WP?Mxp|8;f zlW|FT|Na7Ct~>r<&JqMVTxsb@$*=PEmn20rUrK4(c);c*2qb_Ql{U(UngnC~Mbw+W zW3OQJaZ8h*lg}a%G;1tP;1Au^;QoDHJj{oP_FUbZNWj*_0S}`;GRBZc$+Y)1Q*I=Z zjaNY7R&_JkzWyAFT2oPtc!wG;aFOFo%F;m9G(C54)%Dh#WI?{5jTaIj@9PF~#yUPO zXp>(cO_I`${>%|?s6p6Is)tpxc-gGrCwB<<>+29;P0vsU>MhwYZp=SKJ0WASUQ0V6sI zdh8zb8q;}?(VKIx910iN+NQI-aN}kFe?@gCR2{02hSw!|ptS?sQ>3?yzjmQDXFiD13NT;p`;z33=8`X^TK%*mN8(Ubm}ExcCC!t8&px5@$? zrK+pU{e+%hvTIzrVL0Q{9_SGsBWqNe-UgY7qN`;NKORsYT>^&QBcV=w48T? z-WIO-(|v|}pGNR`X%PJXm(-)a3^rH4HnO19IKYs9Kq`2ug*|V>o~K~}9-tRvPzN8x zg6<2ZkSVu}pzu|K9Zug&R40jpzgU5u1r}XxmcHbqulCx*|7E@rmvM!uMg>z>k|DNo_|0%#ZM^dy9wx{6bFcr=rp`O;jJU#ftA6(8 z$eB2&U9Ug*b<|(rLIP3sCFWP&3sv{uZUGUV43ttY^%m(Z;wcgf%>I&k850VX986P0O|{mn_2Wn&RR^>{A(%Q=@7uH+!SU z*{s1|=sw*-W1=T%^G!5-xQ@$hnVO`;u;lK4Jfo!~r1c#GRN(@Gvm_&>h;D6s9nEyi z(qwK=?UwRFUx{YZb46Yn7m3ultJo=@ZSNRsz8!}X39XKG7}`I-ZLXmyzwfr2%rB%6 zNZ#EU<%=?!h&vX-?D3Ijxc(`@x}LG$SSI#G($6DOI2?!W`RZ&a0ZI23<$neIAF$_T z*z+dr*%kl+Dhs5p=4{tQvf~vO6U?-`*`q0psb}1w5lFq--ca3O8I-lI`|btA?6Y6( zLD4K|cV;=ClF>QXo3U#?U1^!r-H+~QNvpMN2mxCwdq0k;dd;P_`?lJQw9l33j>g3r z<)kP^VI%f7$u{4F#m22lrAm72SqFg>F~cY#VW=<%)%_Y024a|BEYIpexI|ucb~P5%en$4r1mn&8 z-~q;1m`C#o{ur5-weK!;NRVxIC9e9x$!w~y?FrcD`v=q(|LBNrfSM79S9dUn&Z0>_gSTo-Dj|BloOU|r!gPxY zvFO_`Qy!jU=pX};v*;R2$cGMMjYaeNXa`ZaYLcf&#lTfU1Q&$ZI2+*HhbMh}h_9+w zh`7~y|JL-m;5D!4se9d3gzcjSjaBUN#vPHQ%ky1ILhG-Cai0wfc<77h`f3)q^2!|p zq~|vOV;5o9Uh)qE1y3{uaIXtshXAAt3E|hmMP_Di;K>wMvQYMzHG5M^q?I@BUQ`xb zff8K7WpaeYILT+P-y#`$e)%P_$x9I5YBNi`yK8)h^>cc&-U#)9fv^(0aLJAPz}Uql zSzyiac|?|u-N2vq8T2Y>8DKEJ4-fhIU@?U2X(E)()t&W`KKX?(Wpw97^l8ug?Qm6z z!4t5r%%ao1b$38?q~{#=DajEX9$?__a)DeTv*CO^k}$ev@Z~2 z_QaG-6%3e|^Vd3UtU&KF9Q4N9*{70)84h8-?)2%#;ug zeKFnX-O({}S`t?8No`shS^xF=m~wNW|0h-zfJL2idlc!66bB-!C>$~V+pg($Mpodj z3Cg2dC=K@{UVsPNG79|lL3xx5B%$yCffO%93+I?cm7+?Z3j6YtU9l(=O$Ch;mW8EP z*=>L8Zk_Zj8(#mL;jh}s_^BViDYEKP29K?SIw24!;@Wlqj@o?j8R-FlCS)`Da zQG|xEQu_YzgFG89bE%JJRLrV5%K3fc!WzE*_oL_12?({LM3?PUMAc}PCpeoj(l(HN zRS{u?-|Mo))DmH;EQmZm@8s?s1a*8iJ9iZ|L=}Yu%KpGj85mFQd1rrl8b9Q4*+B#_ zN_u`YF0xzfl47gt*bsC*jt)|hHpA@K^NPgggTh@W4?7QRmlAvA3saApy|YY8i?Ufb zV>vbi1ncf@`f0wLT7KCVptTW9N9G<9Ct=OZ)7ZOqjFnoGJ$q2LS6K$XdHnAJRp|?VQ1@uwYV|Gi8*w~;dS1woUif1+~_|EFp;n)zrB#V z&3rQR?vf~7RE8PuII(?+6Kg#75CPzcGiTjjY)2!zx*bO_VilOF-Svz9JotUGP61Cn z)NJHz!o%5K-dU`c=zG$_u)|;}qRE}wAH)Z3SUXkr%U_}``n^hku) z)HVkg>k4vs=Uw^#!_rd*w9zzOT#CCFcXy}3wYUfO;_igv?(XizU5f>G3Iz%jcQ0Dx z%ftKq%I)mvUhZahW^T7C6)EQQr~pWnj|RWD^$eTF)XvEFO>BmT-Y9`EWm$e?uE4IW z{$Tn~gBWASTe!vi< zCi9!I`&Uj3;|zEe&#^w?@-&p8^jjFf*Yshu+hDm8ulT6(pHFf(SOGVYMT8dn%!%DC zflVKDndMO9(O|F3U>bbg$$N)U)r}fRBDxP&1{c|XWK8u5a#8b@N;Gy@NQLh%)mNa* z2@~ejT_7M7Q1TU71u+6asxbw@3nI=)q!drlKck*hFRcV+()b|m zU=ln`i|-d6OmX4Q;x2+Sbwd{Z3cyf=}WVxAe zE4ZC*h3Rp8p60y*6}m@++gz?ZUxYS1&dt8&&c1%O2JtsTV)>sEc|DHA^uq-8(AK{E zCAP>jkWB}J=({7gn)EpQoyVO|bkCho#-u$PsGMn(m7LI+yls(HbO;#8=W8lOcUG0$ zkb_H4=tjjR^&CFUl(U-dc6Byl)KW$IQpSn3d8*h5{^KtN*?u_oJh0l_*<}piY`Vyg z2$Kiw&ZNau(oKtvy>RUewGx7iA&>jp#E%0p^fP4zV*TG!l!oTckgx9ZfKqMNi!3bR zg9#T(_UA?)JwIkIEEuD~j>x0O&-;5bqfQK3fzhtAkn}FY#u|6>oX<(%u0l9+r~LbN z1xrt+Ybz8%i>??>fO)-bhvky4X?`?KpHm5StP?%?d{JCNBdKFymIy3t6s{niBz&#C zFNzU$g@|H#BBb|pyF&ZRgN>#JC`FpsK;SR-Uyq|ZNX_MF@VAe67S?Bs}&d%^;czV2Ssw)mcLyQe!eLpHDs;SizH z^3w{4cK^8|E0;BG)mVCHr!~_B#&d0L_0jbB+v*vZf%B~{Ss4NG8O|G4TI$&x<6#-P zY{lVLUm>%dW7~I$qLmX4Hgsg}T#f zzxfDukEr9X51VAu4}X{nN=$BfDXTZLw!4j0ikTtAn6Oo%j^xS~V`=UqEV$`|6w`&@ zp^N{E+*(scJj+Kqa}1w>RKmo6%m?DF(uLkJ6uu;1p4DFd8yUDzd1Gq+gmm`ly#TK( zuMO4~$W)zZ$?kwpcbQP5B`hs-HDoj9;{=WS5C6eucdYVsV*}H^;{HW(%Wumo>2}b0 z_eICY4t}QL5~q~bJRTu^x&;#3WSd}1{4YS7HmZzjX3CbR3={=`r}CM!N6g%+-AF|4O)tc#>&vpRk1k6D%xOUE{wPT_x zf&1#o7}P{rLnk-1S6=_+1D5{|U?$TqbwHA)C&1KS;QKc``Gr_DO`6vGtygyD2r1Kl z(|tSvR@q(;loKm{$|@HV;{ON>dl;LS!|rJ2!Ca@jgyq&@q-pU>`6j}Q%NCy4lU-l< zb&bic$mHDSg$M_=c|bAe>k@N_HK6uY3 zd@KJDtiBxVp1r<1ur4tS_#a^dMMn_T=wh*!iDs*z^V!hPm`V+J(pR2uV9e{7v$CPg zTa&%fm^f0kKjME>H|a}MVt4WHq)!^6Qx2|7NZsOVz3~R|u=P35BWF(t>lYquo0u9H z?lTfH9d%Ch83F6-q2sP!n)WzdLeY^v7-7K2g~a|`xaPBc8vnT_WKGrb>05Z=3(3UV z%zx_>!hancF%kA+>1oJkslRx?%_IvffL(gg;wRGKb9?Of|ry#Hb+733#{rG0{@MyLn5F{1jI362zgjsIm<$Q|NHJ zr_>Y|M8)Sk?^6hNV88PdVifN|ZVE#>2%)@**tZKvPj_yI{2iaQIfcA( zG1=R`k;ggjq^$aRw3_8j(#j0y;;4^pC}v#1!-qv8u~$Xh#@wgtrZ?7wnhTbxP(>zC zEOs-X^W-x_vR&V@+Cm;3C6t_72&q_WT_JN|gdlLlCJo;FH((M45f!VbQppf+w`faB zHY9dsj$i{l3!XonVZ&ZG5A zdT(!isqoF&#L^nr&dnrXp0AwDXRo#Q)q1%i*Wb4MH}8I~=woc2W8a#uG7dOaSsB{o zVozFmUWfABz+Rm}KkE|rWo@<+|JOQei1J^Zo1Zl#oZ?^TPu*M&lK8K-fe%vh=F8k% zUSi<>UoAMPiHbIGt!uCNwkLZz6z*7>?|0j+SbN8rTza^h0kR)7EaWE2DL;AQ_ z*h|3Y`I8}B;K0&}T>apW%Tth>5_8<9cuZFyteZ>4x}{KZm3-no*8pC~mG z$3JbRlocMlV%cRK(@B8k>GU(v1OWNjeCbymvX=Es%n1w;!D9%=_J1!zUr3Q*>Ur2@ ziA17(_Jg|k-jw9FRV?<}D(e%j+3M>fA5^|n>zNS#3n;2V=xvX@sX>RK;rrPq!h%=3 zSNDFhH|hT>`yjO+7pP}#VRvg1kZQn}{n-F3>rFQMn9@eZ2sN$xzyDPgG4}wjkHY7v z`|m%Z2ca0#%T#~mVL5=asZAqc z86U!cpiSb<>ziTl$+*3{e*3@ywTz=LJn?&%i;vBo=ves+bpG^e9{T|Y!7WSts5@EI zRunb298;I_!^au1Xr)L}Ga-Q*!Ho}{ujeoBk7RHn_ zL$UEW|IN1t)*too8}omwgpcVj3;PQFX&6czbjZsKFV4a9*VKp34Uy&VhQ4*-{YEw! z&0j2X3JsX8?6=9Yjl+^uExMx~E3bpi*bBKXp|{N3+*}qtp0n)Amcjk)S|7O1D&Vc) zSS^uzxMNUtZ*(k)62G_OjRDDe@k{m(Z|qL2k6R@K%_F;}ypa7LRt;j-3hmPOdx?t@ zKo#bIDMtiR{;5by3(;?+QG@7~7I}H4p6!h_lf>p$9{>6?qs%wxg_^pmv^2?nnXsNu zQZ;dPSu9DEko#qzK1-Fcarx&Q6)PH9JW(%LWr|My^)5qa?@70IMX#sO*C|2xQOfBP zxW2YTjs7il=9js%tgM|_pq#NC?C=7v7bpO_y3C81>j}!s?=OrOJW~10*aB{bpkY!i zdMS<<2_`X=5_1oIVR_LMSe3seV&db#TMVFB4a(y?DdmX&e3YB!V~OgRD1!y>gOaL{ z0Jh&Y>Z9Za&6ag^(u%#FLP9v-PCvO{ylzjj${;7c4ght+?o#mg6!`1Ipfu`^ZaQHP z6bVRwL98Z~O=@6#N5Lyh*_~&nLOpA?l{Is!b?$2^ciCWy&If~IL1C^)?KLUI!1=7W z`a};LcV`=hDf#bRidB^7oJ!+EShi;sMeUDUrxF$c#mQ6X+1Qs#hgf1(*@190_ZIrG zfpABx&bFOcH_p1lcA0Gi;*g>u-xjk4L0VA%ACFX{GO2sr%s!ROqaU10tILXg=1)`$ za+29S2hz-PCHApJ3d4}gU9K$zv$JC>aR4|9(Ff`Jn->=90j-%BjA23~7yq7s-lPP1 zRal+mZp=uF%&dR6BDTG}VRj|Ddl_Y=UN0F8(N$amr$ZjooTf$IPV!W;8o6eYH|UN4 z{mZ#vELrqwwi;jcTfBzT!X+Fw)bP(f3I-c|J^o(|hEOkvGCk1jsZ z-?ct2g>!20!^28cGZ%9^VI}vm*Ur9+ODv@oB%rV_6K%c}z5=^dV>ijgl^cI_s)%nX zm~j-OXsdW&F37jA$(|c--9)#Uv8t0yXOzy0d%sJZFr$<)`AM9h27d$thJyC4px|aG zn&Z#d)^Gzc+!jL~OIlmu)+2~Vale>r_=nUNeOqAzwsH>|lC8{L$I1nBwm9t;lj?r! zr|K2|;f0~#WoaVjz8#IpX2_YRUILcCnu(Qid3M;b^{@TxZVZAypKmkJ@dZg|@dv@< z$B<@sWaLTm>Wp&9%Ho*Xn!ZACA>hDhLCe3-3m+eU8rU zzs^}Xqjpn|?VuYw-T%!tRc+~|0N_o>XfTso<}HJ$9t+u%$pJmvIV?}JRB(H#2~ z2@F5P-C&u2LCM9n956p1xm(?K-zEt8^GDfD>6g^@}R5fVSex`D($vg~3HV>v_ z4s1@_+ZS3p91Y-zWK7 z-1fqS$N_~Bg0qA45~`%>AE;!yAn;c*258rw;R#8LAWA(F$*WTyeh++E#-X9D#B|X6A{l zfE1Tc`xY(~zXxt(D`15!DfBtD3j*yCSGxQ-et{j_O7v5u>xAYDFql+#*0la$vVfa@ z@pn>{6G+{I=N${4#N?Zl*TSejp_ym>I7$SKw6f5jS%R92I?%6D)<+}`*;ZKizm<{p z+tPK0Yc&(6r^UEd40L!gAac}2UE(@U_vhh|;D(N@IX9zzQCtgpwFf^)WoIxCtEyBi zOwX1mx-YJp?3qX1T`_Ww#rwErQ&;US8z%uGygMb|q_jS70D4>QEHBy#trj+%wXds| zVuCP0WuO$Y5RDHs5q1e-J2fo|a~JhZsheU|oBUfdC66x|U`G-I``R5?x*K8{`^?RQ zY8Ntw<=P1!cDc(%CU|_?m&!?F8dn2~8W`}~2rq9vRiUxK)RM6OMT1d^x zc0lE6PJjMY_U#dtWUd}=3mT0Ha3CDkDI3BvH|?i%e12aL=W30AF@7YqrhyK2OyXSi zQAQr1derkDgTI*t@F!IQzgAr2l6|j02dQp`kpMIaZwpUO;_e$eLHS;6HcqqkP;T9# zO7upPU(N`quh-i6%akp1(bFV;(c{z@cT?Hd@RLfV`0CW-dU`{~(WpRTf-L5;weR(D5EF6&=f zH&*jX&M1gCb0JsNbs(Q%Drz5BpkFMb$n%CYT$vo;uV>aQagyQe)h2V7Np*QO3Jxv+ zoiI{C9LEA;_w8lDlU$*L8S?}IC|P=B_qR_Iddxo#uM7K=%?Ga>X-TEL8hkA!NluP)qC>ak0{1c4kUE5?J;6tUVO*Rou^!j(=2qY>yQWd_@o)=fCk-B4L@G zaq*{S+K`S=<@m72{R$DM%2F-!Zkuc7fs;rOvA$ywZC=TkfA|X<;Ji{H2%;l=S}f** zoT8HV3BAmu-&i%Oy?&eJz{2z=arWr$F1)ud?uK<}Y{##!(IY(dX$~7?(xKusl=z16 zEgz*+_><>Hm$3V#zWbxh0US*XKHQMrdb(s2UaFcKPW4=Ar2r5-hpeIG_lt9^`7*iB zZy0Fuqq@?pR>k!nZ+<^yg@a;R2@^~wNKpx@tJjEI3FFAKzkN5cL-kEY@TrdpC3W4$ z{ABk6=IPFN5H1Dlo=O}=k3HLu5||GJo(2W*g`Z!{{=Bx;^jy(7KRl&DoCCP37s5*s zVfF}*q`sIh&TP$)`$bjKCqjSW#5C7fxBxsr(|OO)hOF^zwy%{(Qh+A#;p78sb*{F9 zoLIi#-PWz-Eu1p;e;jJt(){?4zA(0Pmxts0d0VGp2-a71O*{CK_ily@>#e`;?#GYf zCA8;DxxeCUx_H9*IF#7~U(cNM0qwMOl7O0uykF_ip`W84ObfA=zn)#6R-j0DlK%j- zv)n>~2Thbs)W+EuXyianRO=q7!dtqX#|7$>^tFM@;XF)#RI#|_pt5iBn$cIbWsxFn zq=zqL_(O^tU>@tAR$`n9o>B8Lg9RH!E9FqHea6Ovd}^_xs@N!QaxKX+Oq@ACk5 z+s5RL%vRVD&gmXFz`o{W0^ZD?7T8JF)!0li;FmqlKT2vue3nCMg~FwatGprqEfJda z*UGW?!K$~NPF>EAsJK-$Im=AMdQgqm5H%Gi&h%TWFfoBty6q@rCq3J2k&@r7-w3Z`C5;?eUx(p6{*n9RYjuYbBdjc2;nv?wY6-tbezFK z>=z~zSO87NXQGj^9jUKtSH-SX#e+2g#bdOZ1Z4B{bps`Hyqb8X0^JXY<;^B!_!o|! zab*|Qv&{HO+$m&C|A2H6_^G?2k#`U$A9xv~LwFr3j-F{XDA##><2)M5n$T=|oEg>E z|1el+mN7m@K#|~^s`1lwgW=hNvIU@C?n4EwS<{XU!#kRBY!gstu*Ztm^Rw5ND z>c#)m00bf{1#s8Pt0v9Yt*V{DA`3Ug>D$Uk#|Y}w z9rEDUfaY+cZ_ow==!r$Az^`xwUmvaUBiDDwRUN)&_{wz!}G#ijmnhs8Ki9z`q8x#wVFikpORDB;W@iMVL9keiJ4;RHoJZZf4!PwEafkN zb#Nt9j(yaygASv|*Fn}j{8OBNDzW~i@a-#wXP=j2{$Qnx&r}6u{Ui&SRmR90fb#bj zFWxXz(ugNad(3AG3y-W}{ z(JC@KaP<(7JtLuf(Ol9V| z=1*Ge<*^A*z>0n{@+JRH$$^w#w;#BAm0^UI80gkPHg|`fvp=~Pxbixxzhw7MEv*)& zJsJ^T;{MKm92)s9G{;hmaD`sqinH@^AXPwNAfP@|cgD2a-Ir|4hU!jnNr=?>x?#K` zyuu?|XHePmdjc{#+{58`9h|2oLmN4jWV*EnDXV-RLrD0iiZ}d_CcbRQtbQq4N-V}8 z*vUp7H2eFl&^2B#9G5<|(eXKRirA}>%u}G;qPo_>N<#blg;BI-cC9H8e>EkTwou|i z9Ia!`4KsiuX>h@opJrJ2C-0-s?(NEv6xo|P8lm&B+^wVEm50?d6J}_QUM<#b*8`W$ z%$LOjb%qpq$N9=lnMWn(ZSu~N9m&5t)oP3FAXWo|?EOydQq=w0dU`}{YT>Ee5!T5b z3fPtuDOtPxbAF;ujV?LK@I3=2uSh$bN3q(g=Enk;bo^$$ihT@22Rb{6%eSTj zq}g%o+u&;`+Vuv!2poP1G=0dnO_54UI&MD**DP5^ho(;IGiwwy@_b(c10H`xXTm~mje6hw#%Y{&@%G4 z_8YRX7lCy()uXb!hu@_Y1-_Ze@0cVt5|TuS@tJH0Y^?>f)4@W`+C=_|&OEMgvKL?A3YLma(ZKb`RgN38B)Y)9uPX{yxIYZD{46`jH0wam1gn zo3sJ#Y(~H18FEMqc@O}8)V+SYz~)#gVQTS^1#kR1m#?Oa36<+w zKwZF>9|l5a0+Z}HphdjF!UdCfX# zhWi4ab9=%F8{tkK?r)$1VKBm}W)LLEdAmDrvtw;)5k5C$4FDDR5a%cGBT~8A zR4ABQ#u!XWlf>EfiQ{7TWl{A5KDTi9k07Nq-hB4hG)30ITf^WV8)9qyGuq6aw=fu| zZ#OzHLDoRtMr|Xv9hj(5W~1@9xcB@L>Xuv-N|XDr)}vP?+yZ34beNYDk13ZEiGAak z^BBfpj|^gvp6}E2ddq}mcR8OLxIHQJt!nc{DXzCeV~ezKJ(VBG=4ogTMorUk zNsmpnjHWSMk228Hp&i&))lK0$Bbx)<9QvYnF1Z1zz81P?E>nEya-!?vIWhY*AD^hd z@8Gd@6Wm%TUm=uFE}YKzot66z6`DVXC}iZ0`IIfezZCR93<=3q5 zPCaDJ1!5F)irvAZSdLVLO8y6NAw#LtB}v)_R333@R$7t7N82`*YXKy(lOd$)m{a)3S3_7d-9ChnbJ43x91x7 z*s^p}*4f^{uH69`zX0X@<7BtLfKgkP=UpmfDe*Fm3pTV-cIyZpXVDw`OPXu3-08g#W{3&K|%$_y}D|QR6_i*+{ z>?c6so80!=FWo;Sf`7fPiW&3Ez_!yYXajv}$0?Mvec)&U9{1vi-$Nss6yXfUFD z2eB_8&S;`+Bc^(b#7TYJv2Opw$rJpsZcE4yq~(z~*@ZJE%;s4U$7N1z&$J?|rOUe@ z%pt1mka00z^Eu3(%GD*=Z;;KE^AtVGJU~c@DJnXOVa?nz8&_zVDJp5f6~#5;wO;#6Z?Wprs(uvsWMNF&}=mE)BSSKJ`Vrfqin@Z zvnRBL_>A81zZPYm*xfx5>m&tXz0HxZ6}tzCf(cMsC+RGnLrTilI-|hKwApVp>fnbX zROl%2(q+y;W;zWn#-TT)K^ZDckvjKTI-buXPSJvDFx?!SudbF{EZ6^7%y+F}DjND6W`#=@KOQL|?BeKM zAaqTMJ!;%cUtJh5k$o0x7yakiQ#^fCsfjRqx~X)EGGTwNbZ3dy$tM6}CBoXCDcLBY zg9dJ5!+D-Gl7`e!d47k?Sn+rN#x>QtRFT_tk6Ep4w4cq=K%gg3pY9?21>V zINI_d^#c!zu@RhmqD!HuW#RZ~0n9OZm8@R_H8)zH&1&@Pp_EuK#szN>W+hLuz>&18 zbpsn6*`Rtc-CPOFStec8HV$Mq-Dk0yj$Nmi0{xX)oJY%7`(O%W=tY6nYE$*IX}3+r zM3f}cBHWz%G1{zO#h|JM#@ufm#Uf!N_D9$3oHWvjWrpwwpUJwN?j7p+vV?z)W%dz( z+k-hlkEKTr^Bn2qd-^x_3Nh~1p-G2V{c6ova$x8jG~7?jh13l2%>t`kFO}U?jm@O^ zUE%hXYI_p1xtKht$kPsXE8LuAT>R1sBVeexPDv5Zl#!5_o05m9W4SqsD1<8x;645! zsQwda^OBnlY&3x!kGk;Ab(I7_+>f%^1_T){jl0Q38|=1X&5R zcfA=k&;6Ihuec&;KP>B^7N#_YDc!>peJeE zH7sR)H1~z%C)ouo<$Wdu3{x2s2Wq400y@wAizF`4jGP|o05j=n3LcY%#YU;@{<`Kq zdC02uThNKxqHSw9TJ@xS6_2V5fY zM|+CNdUJ$+BXdzMt>0jDHP+$Nw#l;s$AS$&56NJk|5W{%`PA|)WSX_VQ_Pz8K~KnO z_&c!~lEpezvP}DjIL870ZM|xZ#L|ufui$@3#jDi}?lm^tQRH|fSwJNT&bD7xmd;B{ zO4-J`8W9*FZJa%sN3n{@r^k%FW+CwcM!)ecm_vDK*u%6P2$oY7ZcZ)HOu6QiPPahT ze8CV`j`?%St{1mePg4YAxyR*!ydPDpn+zb zQrk&Sp82g9%iC2fYNP>j+{ri_m&yFZpA6v_IAh{SC`3V9r%es4nscnlA(O7ZkXJJ~ zEph5~T%iE%UeEJbR|*o@Y^wgS?$e;PdU1}Mh;ra=!HRw8u@&)7Q#{2u$@3xRY1Gn4b4xi%SknPGkp#!+o;6aw1l5Jv(tZb?8D$NrMcAG zK9(wFRSxFR(xy3!HMoPH%oyEjeQ1Tr;^BL6m*>5Fl4>5mD~N0*SeN$bqWOSMWS-|& zr_v*SqPS~ysn31!9x^p3iv8*HN3crPN{SC5X=jE_^?B^8k>z_fL^HaK-n1( zBRHjlc-30`k=LN&eALzI3+fbcjxXkC;_hDro(IixtFH_EDH^U(Tk<4QF@54nu6J*9gQC{H2}z}F&SApJ)ML?q zsVFwSv~8_*tdut$Qk+I*(rO(h`Kpp8BY0ze`iYa;_+!uV zm}_}$vYITaL#;C`ls8>c=45J;`?yh~ex8__@htOsb@Y@sx)5Su2}mSgPtrsNqLKoH z*4!#?rZ~g80)%O=oSRFS(@;oGHne_VWipnz26-%>!>E4hw!&n;U0rlM+|Mh@u)oCB z&4BxkOq}EeA{fLsAvs+eP;Vo~LVzN^@e}6eOVW|HV)@QVG*@oe5k^`5&3fj;J$o4! zJL&k}O}~4YG8oX~IF2GrnSaLgjGJ!R1lLR8{PJpL(jGu8=AVs6gT2#B^n<~NfB`tj zHx?f-!-(1|E7WnA$Fbd`+$bx_6aP|1JK;PJ&^Uk|0T1*OXBhx))MAP9znsf4 zu+5XUQNteF-TR{E-VFN8_tjgiD6M$GrAuN2AO03^o@?7@rNoUW*xb#X*C&@dNg*|- zo%+D@!W=^(AI~Cc#8eSm!9w|*0BIRn6{Om6v_}7FQCwR)tA>))7R1rxA9vwZ3BLhx zj$e_FUG_lY{sZEv2;I@*B8mWm24KY}{fcX0Z`F!_^c74p1!*gkXlg*MXeWl>l%mbZ zi6ckRjJu!V++!hL*rITp0j8snGY7o1PldZ^#(|{shU3u<&Q_LcGCB;-k{-8oy~Yvy zOBvTgr$kM(?(@VLYql5%2l2yo9A^`eeAMy_HK5=_F-4dYE_%LQ315$Go1I@0HlQfGx8N46=TQ?&;XE`!}0GDQN!m#ysj7(YT8wJXHYl!rbOj89tW?0o5| z-k_4GAK9lAh%`;UVW*fp=12p5m|tWte~E;~lZxuNpN@p1IT9ce1onIO*vUE-BF^8>ud)(M{(9SMG5jUBsjzlPcO6~8T81&^L#>gb}z zJB3^$(xn_>S~uh+C!^MUXeeT25~$cdW}DjL%cR#($VF@9s)*PSD* zBAzd*69C##V^JlUS7c8x6mCdlN|!tXUY7RLzP~03Q6c&(YtG|#P}6~*o#mSvhnuio zIJ-PY)XGLPIhu3k!`S>Hk}TD;^;=1zxxKM~rV0r?k_}i6ZAj)+vahhi0FO|t4N#j; zLS{q;Srv4qNjB9AqYozPKs8nC3L-)*dR!*%-nR0-g!iv%i`7^6RA*f!=Z*$W)@nx9 zHVv=^?(kmgczaDv`)^&s^i-VmE~cGp{o%b{2&}YSm|#oI$=EDw#5O`X6AAkBKiO=g z{$LCd^$R%!?AWkBd@>SF&vM@)LCF28D**l=5>@H|B`=JGb3R8M#DQP%v3f$EB?t97 zfB2Fim0%u+?OX!n!)A2NGHutYE$C3$N!Q7xcu0cA)y-e~WkP;{GrH>() z;ZGu`5+5RZQ%|vf_P_?0;zJ}b59jgsds;=!lp-GL=0AewE;V_>JOj}|{Lk!^< z`j1HIm(K^Z#r*SeBo-y7n%>bB zhM~(Tv1>L241s>u+|W>N2J6+h-cEfHT%FA|_pNmkATi1)cPTPv>ax0HPi_|9SX(yTU?e;EDR z6(mK*)%vw^A0(!74Kl2JX425Sk$z1R9u1d&ebZok`%$&$SV{LJJNBkodR?c{@;tUP z9dp;0e(krppOnveJu+7otC@A=oXO3bY-7e?YhK3T?qY$5{B~s=ApNjeI0k(6Alce& zu__Ks`#ry)5yfDvR-#AL6gjN@$f^bmaB*S~wel|91`S-%zr@DdMOnKc>flDKgi?oc za-ux?$=h%*Ri}?>@uv4Nu=+FZxa4hfT37(5HGySSF%tq&6V0j49iN>uDF#X}yB}`X zGGFK#Gi7OI%)+t=QV4_X#t{A>S*ib+?8C?`)8?GI`25!0KK46oiUGarA33946 zicr)k2l1WRy|=b^sLno81L|&Cnl>d zW=Y($-yLO*_D{(`TiL8FGcolfN6bV}_f~vVJhYf55Uc?XZRJ^cb-EaDKdop#)h0|g zz)gpNJk(*^F7?3*SD9gLxaotGz;OqIkLk0W?6^UWnIEkPV=qmwDQWpdIExB6iMJ4{ zh~grh7`liyzJG1)lcM93Ji337r+L#xN-8HZz81dVuUZ}LHgjo2;p*0{JQ@N;WQ}tV zzTl**Qvw?&6GC?5&E^FVqbHYOx5^hmqpZ>bGe2ypet)K!62P<}5@b3DplbqIW1JW& zxOUuY3xoB9TW`qZpU?*yy7li#hz8)c1e=w#MC7Byf}IS?7I6;SNc`Rwv>rrg3@Tgh zhnAcL38@2)4jyO(CF%vt;vYbzc~=TO+v#NyM#t-Zl}l)Zs-F1u7}ycpH^fg>^6f!+ z2}-{#QJ|z`TL5G$!I!h7pLftnvxo>}xB^_B{RZG4YbK3uGM!AV0AB13E|;ES(%vLu z!8YO|U0p`Oo>sjnixkyDUoOul^;vdO34LNOrj67^I4y+3@>Tzy0?v;Vd2Da zT1oz)7K=~iPA_AF^QQXOIxWTfC?k_cy~Q|-juWAJ4@ZZz-}7n;?!>F>K%E6z@v18S zQa-lWea|Z@_@c?GA^gjz>^oU?!54kj#l{w&svtqv4wZ?eV`pU0vE80Hi+*)ELxpSV ze-vbO1=H&9Se-$F?Z65P+gn&T_d=J#wC_K;a2AIl(pt6NiV9eD-;v6KIu+kpMIs+x zzjFdk3GgEG&bc;E)VyOez`0kxBZcEE zV!o5jK<2FPMvHzgsC_s3DJMv<>K$7b&OP`Y8y{zJ>VGV?RbwD#K_0q?__7l z$8eB~8qGXWTVZE!&KG+!MgNcSqf25dGw^pMDG%F(hWSk)h9GJwYRE1zWc%m?kVI@y z#|{$kqOF?O@U<+Dg_m;r%gBvsFV~LOMx1P#bNBF7&8lI{?E(;2Lib@ur9@Rqh?J8a z{c${dFG>`{mxP1I0%QpHrwx%Eg>}cv5|d1aliRNb`Z=HRL!U%oDfGnLB?t1Qw&sU` z{0|dMedADm%^>J!d)z=V${#MP9s+^!YJqf`P!H1 z9V9z6c-v+K6;4knz5{nWF$8zxb2i5k;T6K@oxHG@r1=&YY=*_YPcGlG;VYmQ_ z7fvginBtJc!Q`-oOiHrwEfVR+A~tt}7&M?t_|~5p5IHcXa`B-k$D)v<9gSvn& zSHo83>dMtxC9WzeHBE+sYe7m><4da!Qsjzv-_#IJN+Nf{$oi=9?Bdr=8M zJ!wsJbfh_M8f%22h2Ry zWiH+8k6Nah2C^p&^TL@vQ7ZJhVN!Or%%;&0JjO=EOfK0L#B0juu^4AQ^}rDgC@+v6 zG_x!G-Uq`kP#Y}J?USnGv{4fQkdZ3J8HXH2wMp?1gEJx^!@c$kbLycP3i@xfqbdI( zVfB4^0vYxeA;n8~3d++V^cZK>c5W3idW?oiW>{m*wu@7U!b(`7OO`jpWbq_BU@@NSswB zs-*>e`)U|~t@s55md@PFQT>pB%*gIvHOK=ve%SuAy9?jg>TtZjuu7?cfpL9~NNHu> zdf1#?5@V{~VH7N7yM6U)k5&wT*Tpm~diW`o1r~Xwbjd}HvNht`b|Bf7S}SNRyXbiQ zGKN_1IM_k+YbRq-87I@u4pB~a`?)O@aJ)9=?UscMD@neFFUmX2+%w1II-ma0u|ngO zjE2Ch>UoR{h44CFMa#og@|E+u9nbLI7-BjzQ!(;Ed=r(?SD}SO^kSpwIN_h=XvK$8 zwA5I|_zR+X$3D`GbNLL~e`!G94x$$WLfJt3zP>#=w!%+~m*%Q!DSe%g(v1(cR-PgzIntLX%h`sjUjp~h?~ zKQ~u8yPR1>+w$dF-P$d0i}CO({z@?+r6-$t=0q`UF^rhrxVAN-*(Ra3OXw}5C zvCN~LuSEj(nefc%dO=@Ws2k9dkV?f;GU?GCwB4u&`4603hGVT#e6z^U;ScWmAocbD zYZ7+|lA?Jd>e$7%H1-5N^A;%mBMEjw5-QRcwwFv7Wa?obgDouP9L|xx&e7-?iNrAx&+C|pc&H(?rS zuk$BaNpT*##SC=YvOY3Ufk zAp5;SwV%qE^J)j8SG)u5%04L9{O_vj!zVqsKaHOfy_=Tmx0ohiNkT&N$)rY9L0Smt z7Tu)@<`G-GJyt>PvY1wfs1{P@d_ zxP~lE21c(_n%UpM4xv-UpQo7HyOJ+ss7kOANs9DxD^VO_$b8bGSa_nwHra@ZK~zcm z|CUCeRVDPL*8jIu0<9pdmSEdI@l-Z;59uOb{>J=a@dfr-$vLx)ll6d+^+prCXE$u| zZM;3FuALc3nC^;`Zi2=-jYQ-)67X%CvzwE3nGwWVE!b|167_?T_un?l1W(jN7GzFM@#f)pJ?Xz1(DE#DPRNjx*U7kt10a!pZ^twaL#3 zxsT!-f~G+K=}CR2X+S&c4lw#?RgoeNM4nE6%BqIKP!e9b&G$g9YvKT2^*9=%mfuLr zFT`VT)fFwpwQtfhnZ>XF7#?S;G+rTfS#My& zZIbJI&Fg&q%I7)_gSXg`8rRWHnK4j6=`~2D<@tYY{V|Yg>9v?a%QKS-pS*Ad)ilLh zjr^;E>zH!R!w#ZujCR2H05wF33 zW}!&rf7KmcgqU!berD{%4OuvYf)~GVhbN7fk*=FR8rl~m9;WTip?+-7jrn1LM>Bz| zsR7)fK%Dy=F2~!H1j+YM+X}PH^(Rf0P+0d%t2_B%Bj1W{-X(i&@9l8olnycTGV*j$+7K3i9PXoB5etR zA0PI0?CO)nX#->plOJ&DnC{8bc5li|kCpO7;%O9WYhq;g1uYitrR+KxLRxdhj5Pp#PPwW+2wNR-wO*4H#P6hxyDpNh~2a1 zez0nyo>oR29XJ>R9$t8z{;9?xZX7OnrD1>w+gd5bYo5wmNKc1bt)^;AjBHZ?rl48g zFBA;mJ$J@mvfW=SfT9{eX~=scKWYLV5^t4<6oPZI4&wYDPhSBQ)%QFu2!bGjG)OGc z-JMG#OLt3ybTiFDX}z2cXyXk3doX+giC`U|Ml}d|KB-#-o6`iW9Gh@dGqd_ zfvT}>H_?w;Lkid@X!j3G7_ks6;lr!3UdvKu;VD{E_dqGRe? zlQ`KOKS_h)9ZDXnReW52>|B3Pyn{A=5)GB7>XBne0R@YbK;_uCJ!9aW^0ua~2BwhO zM3f8E7ha}5rWqXIio|~`X&f~aIS6w~WB;poC^VXbQqN-H4b!kzM1rn}JocW?kbxk)=J?X_yVxeZN z?Qx45p8*TkBg%xg8$U^g$^(NuZW~Z+m5s{+Wh)~b-tC-dGp%mB*Q9`w5JMmJMxuo3 zjqw+^uP>AybWVbj58{B6w(%2f993->sFwNSRUaqX=DsJ?jKENcb04Lf@+>4{ki##ubPvNw6)bSVP0GM9 zAUF>3RKBrhaEFOYa^YyE#3>0^y{iw}Uh>vjTj(Zl5bx3h*2%N}(Sc^XyxTkMZ{S6F zZPt`gHk?&ElK1)g;iP^ZYcZzXt<&@K_#47Tfy*2ly!Jje6Vh~UKjfFDBY0BtUZay^ zp-1P&N`k%WxAZAKlRosRCQk5;%95;YoN4B21hGXaXP+vT5^2B` zD8-4m=ov4mAwa8PDQ&-o$jlX|JB1ges4t`geQxyWd#g+V(mla1#}Vt~?0X^B!`UR{nsNZ3VXxgGVgI<6VQIF1 zXqNYG^p|AO2lXr9QMC9sEFfC`uMc6LydHRN{CrIgsAx;p(1l0UU6K~a#p<~uNW2@U z!@$fJ3TrRhD8-sdKShFPn&sh}2yC%I<`#i(P^vT=4GrRVu>G|AH-)53LGrZ|dnBd) zz3nASRth{!r+P;1n>lom}ul>a9ggF^srah95f9<=D3T zHRhABgt_!7S}zDCe|%74Ix#bet++OyCm1mOab+Una&uPNw(Wwu7&+J{Pt+W3cGbIc8cC z7V&*V9d5O1uVS9IeNW`Nm+6A>jFp?bnJaD6bviBk)fSbD%C54zD@eGMkt26VD5v|CQ|tofLaBt1R_j%rg3(^iy`p>G9cGw4q& z#N|wRj;TEG4_w-V4ugHY!TNmrn|4&gb7S}{9gIN*v| zZ=2oIYKAMbUZr44#0=>U2OgA#>h$9oI&$`vxMJ$5`j0VG4s0(s=7uSO7#WR)o~P?= z+e4E={B5XiN`CW$9dmDo)#x>xoL?Mk=j7Vp?S&GZ!bDSr_^FarD0T@Vld#8^w{p_r z&zyO!SQzXR)_v&;IIr@{=ZL)on^Q~+1H`_B4n4PMQsz+;)J<>8ap}t3Ic*0exb+Ku zYR32+_8Yeymw(c_Cn{&R{`YmsI_@JuSsT&w9Y7t6kd`)u~9BNGe>4HLDD zI-?A#?-_Hv=g-b(=ZK&JybFR^oq-F~?@&O8yn*3=7clq{#*2l>_fw2|;Y_xKwEQK= zU(rdv+4dhDm_Fy)wop*63~)?;|8Hm>(X16z;DXQ=$B(Q?5YYmI6E;HlKu|v#zBnO_ zDBAraW|IEebm7HdiPIi@xgqhTreu2rkF*{|l>)LtJ3De(d+b7H_}fdS)tWL}z1v}2 z#ivv$W#6Jyu=ND3RJMK3D%qO#6UXrML(Qjm29?(qE9D8L^#tRuT{rO*Yz>-ntbbmu zgB3meKE7b`kW&cc>J!X7F;KPh%`(A9b5tc+E^$?SqsAg-<@BO4WIt<~O6YgWuWgOD zmmha}!Y&f=h<9)&v1{Lze&VYz0q)utj4&L2%i2I;a@rk!S^8}ehd|dT-rV>pTo~bc z$5Q*5_yv<$8ehZrn(=iuGJ&PT_IGTYsL&cs#{7K3PA^8%l2t#ZdwGQ8Rum)@*0=s( zy*XCqV*_lzpDe4CX!Lv=E5O8LRJ`;M$wL%CfL+vsZrVXV9=7GYUQdY%YgkbQgwDKFU4&8m(b0nB9bj z=aW`Pi1zTYy<&;#1H<#(hbtNxr<=6D+Eg_vnA4vxB=j@ID0vrhB0kLF`&#$JerYWQ z3bXdp)pRr}@R>CDALL8@;8$tPezpZ(4QS3`s#=1L85{Yr5AO?Z(exbH%9~OIvi9&@ zEF>93OKD`h1HDngVy7RQm{Uat_!O>!&|`nwHgz|Yx6Uw4BXj`9~-cR2nk z*TIu!uTLrNVO5ksA`fMR7f4L^y&NadkmOFUi$-+3E;HupH-h^d`e!qK!VEn23%GOd zzh71U14xo7Zm+OAqpj7xXrOzdOOpA$wa9a}yxgq%^io;#uP?8g!fvQhDs&U}M!H== z!QZd0{D%=cTdRS>F4wjoZti9%+3Hdmn13>r&;KprN=?@LPe|+N*$fA0-&!ou;YxXW z=)=3LfeD7E?2)EoE!YEUt^MH4dU>bgukr|&5C{}0IX$L7_14g7H240%=VlBDx{HEI&`ehwOxV3$QGu8$JU} z3&HsI9V}XzpO~2shMU~(YFI|QS?fRbCk%SHalN^L>(xV`ag*~_z}P?v4Wq=J{Q;}P zLc4Jl;+C-Ni=T0Ip@N)vA9nT9iIkQ0^wQON3Y}x*pYW$mhWlV_eS66>)0!(DrfI3W z7X1PvK&R;}3bUaD-O~)LA`>=CG-g0L_8w;}i4hIRTOiZZDxkXUVoGLL?q&O)L|)+B4zQbu#)tXhBj}{FM=f|hAP*dmkZ%?P0upC zJsVM(k>VvL$|~2!mkTPFB8Td1Ep6TgMw?$grPX!^B4TqpPfD~%p(kkU>*#MgTG_H7 zAG72sUZM^0rLzeY8l(zO4e(*HBQ`3`#h#l{EwoPy6?&h6r972|d(%!H4olPh$LOem z9@#EZh@RH0fcUf%dTvB)`o(x*iYI7PAS>QOUOV-t0><2eXb`99Af;d!vV~$G^jFlp zZ$ZU8O&58OT1Z1vLCG`OVRaP*BG~2ZLecw9h3)f8QG>!RUX2c!jxq`~cZ@BD81I15 zp@;>i?D{A$re`YpS^Cph`f@HxdPp;XOBc}QdEgfOv5ftVK4Vf3ORNiL?0FpO>zH|Y z&K)yJlh*Ft17mw2Lbn7*_}irIFp$aOeja;+#SPdr2F$VodO4rRilA`= zq){n0Kvf0?!>F+w{u<+(&{GObo6EE?@I^77WKwf7re`ktnK)L;!A)6m?ssD(`FhwH3g%PIO!`#EVU?I8`f4RHLevJE_$vesF`Y|9zfa**w6%kU;2iX z^RT5rr7T&lThKkTpDH&A>ZrcL1(`X>#w5D!X}VG|dZM-h<%;=IBv^E1TM_8wD+NB+ z9HWjq;7;9}8p`Zwz{72Y1OD-3ioKz6@kwfV7uW+e4nF2Dd|y0F@E9J+ ze4tCzC)c1Us=!-oRDQEG0Ja>5n}az^>}&&j)5X zvpsO8^hm-Hxi9x>pO1**+%ZTUk1p!jmV9fb+J`yZsDyBy@Iui9fX}4EYMOQ!L`o1b0>IkGNmI+2Z zNOlDA5jXP@BF5o2OJtE#G{l(mF+#_xr@k5JyyIk%0^vmfSR(+U3kW^Kq-%Vp0Q|XY zR20`<(VnwZPwhq+_KhbYa>lXBe7bTv#y4fuYAp`knq~@ zUMr;{eB#4h`t>2m!bhio^cyukWoCztTSu;qzC!69XgB8^rnBx@gz;4pR1qX+;iG!6 z8tcAG{$xV&UU{!xywQBdl_A4 zXVT1)gynplWDzVN&jyT#W-qF~_##%=26qIAvz^Ll6?r~n(27=xhOF2uOR~5mcc9Ab zbBYJH)lfgU7JG_20cY;zXj{wEe%F~3E<}JQKWBZXi#KsjOk-d~BW0!T5B~#e)~rD< zixeT(Jai9W+!75X{OA*|za}fu;bAqDnjPW68-*Mo&|J09 zP2r3(N`iKxFJ8c;Of9>9;1&zE>&m&aP*A0HGMZFF8Moyrwa#kZhE;W89I!AJy7EH6 zn&fU*0}jopl{VT;VC@JIDhO-5v0AwQ0=_%}jZ^*_ucP|3)_0_xTX&%H5?D!j|95j)wE@S1aw{Q8#W$))whB-aP8@;G7P`tqQt=VyC{!W80nYE zqi{0Ds7Xn^K;XRtobTbTkaO=|)ZwaLs=$v0*Ifu>rPrh~Zj z)527a#cTAs7GhaX4PRb3)JGL?J&1lj~gP$>rXZOjY51 z0ld@#(D;Ove-bM@tC*qSm>49UV5VZB{w7N8<>}mBWR-qrKp_((Da$iwC1GkAEJiz$ zQ#mZsJM0e|xG@DwC3=-u+61Wzw-0l~_OcLg?>*&}0}{}4#PSozwuS&@rT}?0fLJ|_ z*hP|9zYw5i0ijH_3os8R6Z{jm$etA-)BsS|14vzA(ru~FACg-G^NM8dC&?ls#T9_g zZos^1nP3$52J%s=&=-KZHlXL?Urj9nEMo#@HUhB4pNJIqGM3n4j#wh%SQ`J(ioYsm zb~2QKF2Ik4pR91NB+3jEN7)l~ZmclECU^_%d1=act}cgJ%$f9(H3g+u`)77Zhw5?U z!4?E?TNF`HVnQ)I8|6XYKc@(A(g1+y17PQvbmlOY*ci^(V&Yhe5MV5n6$fsF3s=Sj zTao?`&VM~ZL^eEo9VK48NHCEFm>yZ^ysg~WP2F%Tmtbe$y;^v7t2Hp#^`CM#wT~60)2(k4fy$@KeY4&20WMZMxyCQdY9OU(6QP4pKndDkUt z`J+nHq0x&E4rr~w2!`Pz}i&sOCo8z3Di>;j?D zP~Tnc-xm|1Ug2GO2Gec{jDX@1f6;3UaILi+mpvegY6jRpT9D2&^TskLi?NPI{byb4)=U<;(Lqv!@Rie5^z2A{}*A4Uz36_?)?_ z%-!VgQ8SbjLbB#1j&ocTsSo4qo(p|Hf2HLxd&<(3KxCY=c_Ax4UUXbDXO8L!%Fx93 z>M+XpZ6If-;XpOcajCh(vEA$@kp}W3H+!9E7MDT`9^r?T68u}|dJ}4h=)T$F^ zJCc{F`we>7U0HxM6$Fb`_4>^qU%H6xFJQ8Ct`_|0ExS_^pAlYG$>2Z*5@3WpW(nbl zU9OOzKM_N{1%zQDQQ=K0t$`qWFz{X{eC3lhaLO6TQ7Ys7wH~nd1rW_jkb4s$Bgf{N z?PWrs%0`g;CxU=k|3XqL9Ftc!octKY&`|Goq)mVAT(~+WT=PEwBb2>kW#8P5>CuVq(Zr3NH=!p{u(BF) zgC|NubU*_}ak4$Xc-Mf9Vl-JtI5!GAw776eO!y82)8i9neKfj<@o0p|*9d>TaFIr9 zAeAl9xlSf;y&eE*1#IX7W_}qGFq;qvSiH+Uz@)~7zreM!$ArUCzz|GcEzzn;G14JS z(jn%zL~fv|_ib)sNDkYY#zZGb-(>j5;40AFpu$*CcMh6w>yCDWbe zXoP=%#Er5ed>(>{ti(h@(2??}yupZUxp4muYhV|O)U`4a`?wKDwmNmco$%t&daQ|VH6wn~XMAG6~kz&GqP(+m0A|4VZ9h$-!dW}M9Xc0>+Ek|t5 ze-d)+US5m9C1{|leon9$9a;NdQ#eJfm>!wv$Z&4#2_0FYV>h5_g-q}fZV{CgLat8x5wwdi(0bDx&1SD!DWKTx4>4x8|{UdUb9niE$CV2lJbbT16 zM?E_7!+!)XA|1lP8F~!TqA#%f!5j4- zz!@oq3$h7t_uo3IMlE@8vCPHwzy8P_fr**`*ww%L8);mtHgw+n|3Fx9tsF6}6#rXP z(kMK$5j5UJe3D?iiBsc@WhRbY4f!{8MH7N#c7mt>-M6#=XmkL3|7$886IqVVTlZg6 z7`X6Pm{wB%HMPze8$%L{3I1>5S11T=0O@}aB7G75n&ISd+#*_AHmTyESWILXdVM4} zwh@_&CC1W+!mn?#K5P^%A~>-H0*ExKq3CZsdgmE%XHN- z{VGV$|73fbbj*MayQ^_K{D*7!R7Kd2b)?Kmi%hM)%*ii*0KOrBoehBRE0LnanNmia zq9jH$rUND&Bf}ZnrpDh1z}?Zn8Ph@Ck>Hk?p#`*Thc}r3yv-AQ9JswDQozOlBH|RN zIL#Oq=@@WgxOWLDBh@S;rBCU2>JNBqk=f9b**F9M$Zh7a_-QRn01t?GM2Hex?cJru zxu-gOYP2+id~+x#SsJDwkXyR`0 z=|cT`PB1{WVgE8F0P`M=lX||buE!!@GPBledSnlOc}{M@4`_SN|~PKHQtmf%}B9gJ<4h?;al z^1jn|xqMGU1vpp#WPqM9GvN+=2Xl6QUzkvl;$HjM1k4Q9^x`l&dp=%oGp9GzXW*%7U=64uamCV(_PA7Nr{8)j+~7463p>c3QZ4l1oSqm{zi z`rtUeRBU6#7B@bn5_~5i$zI#O+VS*+2BQ;|`Jwzn~Vj zWy$qlT+#DOmeISa`t@q!x3h`Ss36mL`G+sKZ9Raz>$#z9O=HDFG%EMvo5NeB_=l3- zrI?V3^CR&&ys6Nao6n4VOM3UfE`0_tf_v$o?0n7A^TzuOSZl9r!|ezo zYm_~#rAR}yKa~xVaTZEBq_>tLc@dWS7GGFsc|txQ5f6 z462y?Lhu~Qxy$hU6>qoY?nN!#FnV-})_4tnS0`h%eap=6r7ZG-WwAjg6Dxm@UoW^_;)(85_ORa1>@rJMf|Q62xW57=AUv6ldNdoPN3n(KGm?cNmHb-ZRB~<9|884_&73H zl63a_c;khvKhZ?`zxB#<_6w*cWr^(IPS9VMMEp7ypfR?(@AYC@9Yh40`jaZ zytyHqnoOL;O9xCJ+^^#TL{mXetG2%$XxY?Sg$w92d8BCq+v1@POuk#$IM1Xwl8ROG zr|K1{KK%BnE1%D>xvkaB0H3DUAk8{iHaktWJ3X{|mRtLvmG-}ig1Il?PR>M^xQ$|h zNi`~Y&iV=d6nryZ2B3KHl=vWIzW|I$?gMLH_zJh=n5_1K9U*Man?UvikS8zDxyXY~ zfuPlRYDLKW6zMbqdolQXRi8Y5s)jeXog}(wV~M<_bwKm*i(vFAxM_f(Iyh{?VYEvT?OMf=?j@$vWJw*s5tZt9YOL<6heoK74|_y*p6E1*kK8)pe`} z!K3eZ-e6LgMQB|NH}ivklWxtN)h%tGg3B9#Th24SlbdZ*PjUjb-oX!u(`Af z_%bt8W`t&BcM2lAEv;INtn3GA_;17j^2@P!$ zvpO)&TM+fSb)SNK}2e1S^y->B$1dGgApFKT!2cD>-A3-a*@oYq=B))a0q)acS zP_qt$kL(y=DVo1~Bk`kMGUwU2jYD)s?I-=dCz=FO7E;+|%q?@AS3hVSBm#r$KT6aq z6j$_1{3+$-Q+d6HRqUMXdKRbgk(Cx#*TtOFYsY#^cuz2tq9#W`kOhT;?{gU#h|nwt zPcI$30r0KK){ebhrQKK$sS0Xc3dx_n7RwFRzLh(#|NWX#$tZCQHFgsh-RCjG>@Xyc z<7ZYxhlx}2mxgZ(F;P4%wYtwiI0KRk zZP{PTU;1+zoMxK=LtS`Qk=toi35!0VeqCVHIjG#+%eE1WXO6BsHW;O^&kI zrEq}zLr^?rQ5eOOJ^%3(4;VKt!qqqx-WAM&x>{L~^4YG$6C3PVryAhgMEnXd+Q~Uf zq&%*tdAEU)b|Ms8xpZs za)j=>UwzGE#-ZPLw2CP)WK{UBL$^9iG!1ud=Jl1uriXH-eJZBlzIIUEyFlDUrC7!FpKfUhUn3;Q(nD*HK*iQMdowfM&M!7T z?SMLdQO^>Br@W=IJhu#a&l$*`&T?#sVwYwcv}M=j%#20V^m*&SocPR=5wzK^iUO5$ z0qI7F)RZq`oFnfG4K15@2AXa(1*lcVyhW_nSoJ|EW>d$eeXl`a@VgGZ>g?OJgm44W zSr9Xx=aN~@$?(M!SPY-!N5m?K`&}T#qEq(9(8Y7uDc?f`;)vth4_=XT=E3=CM38Gw z(qW?hx1T%cO}>vs?iaRHoulp?DW+2y-V~dPRY(1ppy>+$%$}z^7U2UrwF#tMjA{XX zvx?`(-lvOK7WoWb6hz}AmmEcJC8}vo-rF%D$~^zIxk`vh4a#tpRR#JpHlG{+F}#~j zJr=nO&)Tf}s}RS3{_0bD_VJ$9t37;D zItd{K`hy%A!@k3VG~Ri33FZ`MxxVMRRowFwTMWrjH>#@`Ca&Xk`H7D)nNA_FI=*FN z{oFTVPHR9ZuzU?_|76I6ho!cvR1RA{Uvfjl2AhpLBPY8Lgrm%fOSDegF>5C?y+qU`cG(9%>J*$P z-v)B*=0Y;0hqOB;j_Qfqz#=rnE+Q&ftRhKS!+OS>h7-IHKEJq9s(t15POJe*)K=c@ zR6B6809HVW=n(z1R-U5MW%5hBBc85RS=g2xS!*d+5bCIoSa@8^IH~@Ud~Tn?)cjFJNR42_59B#{H%_lsXZxD-tDZV-vVcxt ziP6W!o0T2D`V8TeT-AlaLgLL#YSJF-Y5@b26{F0(GlL+G<+*J3Y4f}hrG*e{Rx_8w zFvGXtJcpc;^tk#Au2Vk;j?$_r`Ys)sXfx^nO3iCu5TeeC4;0D+i%U6DKPyQqc%Vk}0o~gpgv>;e7ZdB9ri%-$HkcnNFe?@mH&=4?!OOG5CLZ93Rcaf4pk-(kU2 zdCamA^%Ar`B8wlgPX@jHVB);%SqQK`sMV57nD2P{f(a)4&rK93$gS+A_Q*dex-qU^ zPr|%&HI+{a>La8EXIuqJn0qCK87C~8mJV+V8cf`nF1fy}081j*RA1r^Z8tZLtuuZL z3g((DeO%gWFfDBsg6^_$NqF>*Fj~rf%uC-IWr>{QZQjPCgj}t zOWXrU4BUF8wzuWFvRJ5dn+~dR1c`CT4-2;QaS9R_Dat$XXF0L#*rw|aC0(AiA;Hg2 zqr#tG@O<5q-COBV&BMJIkp0pM6%eOA`)@Qt2Ij?={{aDjyaUr%-o3F12uGZQ3a#%r z7VWd8roDyK!4!2PW_=gVurl5U+{NM?nh6v~4&q(UM6^;pe~3Y#SfBkJ>Ed#BPu~SA zESaY}8R42}$z$CHMNos>>;gF#Cv(ilE~sE-{F14NZPS4x)SDYB6jc~P2SocO&vsT} z{pW$vwwD$d>{pVAN^L1qBzNzar6aHA)=V>SErYoxhJ~fbF70DDdJEdi=RSwOsfVgQ z)=Vq3zjboqn$R;2<~o#(v4ht`tEQIricCu%0{4o1FCpEvdFWF7CzhcBURqpLEQCSr zT^0tp37+HT>!ulvb#XP+<|n@i1G(NOo|=B`O$S@o4aZ^i#CDVJ8d|=B;qsfsqJjsJ zy+g$ix(Ai*-W2067CNk_`iAg7kS+S<^vqm{!o=O11PTxiuw0(?Fof7Ym4k0lTvWCr z3MFDtvh>xWS586y1p`c+uku&+G6{&=Dv)cDKO5yn#1Iz49}?#^J&JOuTE{~@aG?i= zT@w^EY?nDvH@{9Uyk9>1i(uiWk#1LftQpqeibURw4-2D`c8#b-z6gV?aS%$kUu+uR z@37T0-;C=SON4r^nxHP3tN-$jmx-irXU)unhU*wZJ&hDnZ^m~YI#4BP-5odM->$Zu z0-z%IWst(I<+H3`xL)e({M+3kqd0CnArZwzG*r-|X#;cX4)Vq2oM;gA-P+8BZ@lsZ zguilS`youO5h-GwNN?)|O=dx-124f}7&!J8h!h7U`(2;AeRmDt&@|4gQaBJ9YzB8W z3-XbT`sZmK(wqvWZNK=~(iGHndKODaiAdk$DRT-*zBV4efxQX7v7&KQf!J$=0s|{ zZ-TGu?0a^3W1e+v1E3^6P)P|19U?9gz=Wra^~u3smgEC>=4L`~blR;eWZ! zUg)`lG0&JCO1z7hg-sM{R=dXbY^psaCC+A6eM}JIKwx=NPOX z=*{k#tRGIKa-kYDkg^hsK#YQ?D@6{zLM zx%gNXtVw;ZI@)?^Y8Kk;%I!YI%oN`gdT01*97(vQHU&_#e`b0K9;=PB?F?3vIGR)S z5k%r+DQ$jK7D;ln@>Dwz?b-CazsFn5Dc6s1cZGCo?6X_&nWZAYIibVej4%uS5I?@S z?o*$G*29&c#1C$%)IYYVY<*8n4>#I(8d^`9<#R}mah&4Ty@F9cM7`xV@ivp>ZX$T% zcEfg}o{0WI|10o_HZd>8Rxp))-r#btE$aC^%?_PKvDx(OP}6^SFDOl?<_-Slp?FPY z5twjTu$_=hkuZfsNl)>a12I%~LFtJI{W`n4zQ;(;s>jG775hEZ;1zUR#M%e>`6BOklLm}5-ozm9GlkWMzGXLcOdMCd;I^XXPic2TL z4JQY`Z+pKAH+1arC7c?qeH37Iy9~5fol=zF80!d<=BS^iw7y8H)|tZ$Mh;yo7mQ~^ zwiA0mk4m%U+aYJOR7u3eqGoJR$@KOMSl&&43MO>q-T@ z7geAgI0-nKWZay(0Kxw7ha~Vyj9#F@T6ww?5wr5)HVPIDf9&aVa&9*UF6uz|@9u=W zf(sBIKyJ2yqKgPtyp*Y}gq=?|4Bqc;UiZvB%Iy8o;CjS_;qyL-FS5r*Y=e5J@KyGd zwOm4`QGvwXL0b7F6AjMfRN9e#f;~^l#cd<&d|ErOox!(0eYgfH(v_$jv^GWO4deuv1TPvf5t4fzq2# z0Ey_^jS-YYAHlM!0RA2nSa`7dWyMU+xX*$8UIdfqO17q=r6yEj> zpro-MUw1SjArHo^_0wpMY*uB}|71Vy^j#p$qFi=pUoa{_q6kWNF`v9(R9{SB`8{=- zu>aLY;`h)^QNGj&!~ON1$&PB@k$mVEam%cQ@EjxY3+TRKXHxB z#mP7R1{|tI{7#UQ!TK!%zQX()!lvb(w*lR5U!~f#gV1^13w!0ni}sB5&Q^HkjX<|= zSE;0JAg8>ek37(doNd+nKX9>8v>qz%iM<<9ulq#N&~a0kC4~F@wCWetpIgr^f!yuo zDdg+D8;dfwSNbxJ3nRqMFqat^|$6zIyTALOY5~2 zqd&*_W%~DcayQF{OR{2kJ3(JMev($r^Ro|l&*aQymCj=eP~LBYDW!yKiz9vdVZmz<6rFeOuVWD4lI~wqbfkcbT?%!Fii{l*a5i zuC%QBGDJ00qI0LXZ6_Z>P!;s8b*C&%bt(0Gkm=b-q$oBSeAA2X0fGSifUF^et5MtE zdS;o%M3w?VwkLl@Ih#LizYhQ#j;Ku8lJ=b0UbkH zMslAj$}y)R_r%A$?sRB^jkqd{0r$7=b7rC+*TND0u;Lt)&EP5Q7Z0`aO2f>pg9Ept z0it;^qIg5==;MdBe(~L>d3+&4SC*O4x-#0aOczwU=`SJ0q7URnMMwpNefr3L9-#uH zl;ONr-wAvw3JJaVR7dmbc$V^LJn*#tg1G0*4OYnGVt*%q((N|JF05etuQ*{3M46<4 zgi_L+_v5K&-Pt`ay-M;v`Eu)|$@g?t3PiXFlu^m)Ui45`G^?DRGyLi%+wCXI3MClj zcKT9!y89XU^>xpodSk=U?Z4I#XX-=iu8=U+!<}@P#D% z2na61E{sK^WQ1Wx==J0E2R5;E#Cr2Bs6;wEcOymU+DjkC3?HT*|`I( zo{j^Xo(cbDJcXKhg1K(raos9Crs2d&ZbuxA0etz5vm(~T4##I)>jf(0ez9?UhXC)uX}!P zsJi1yr>XwM@@fx5Y=P`|f60kX=YjUOz`q*LPerq5Mh(pEQA%yiKYI|9I)5S}4TQy; zUw~)=+1rZoFK&ULR$^p};h-`*u`om;h|Ic!WicuTWl!Q+yhRz7X5<8_EDGCeYVbC9 z%pLL8=nu&BYIgI_@YE}U#4Ze)eW`gvj#BNy9m6=g^DJo`XRejK@|8Y{TY*EqhH@B~ zcBG5GLB{FLUZ@8QfL7N;Ch4ai8?PCEdlC;np6-T?aXyomNjy?UkIYV>VhI1ikTPj1 zgRQcW`iFrVBZBIc76Ae96$x;V4*Lz@(^fDQa0c3!-7A!kMp~p~Bv(o8qOG!8aIzLM zvKCr|OkknPR8?-BRc`;VvIdP5;NG*+H%VMkF$7B~|McYvb=PU?13wFY&9J$Q@mKDr z1;z%3xRk1@uQLz5Ut!IkUY@Hia_gy~12~TK=<9ymzbgs8X!ec%WC13@UEjZo>sh3v zX}^U_f;Jvfm7lP-A=5PN%nVo&F#) z_}8u<;8Bus?@twunN*!&^++c*4&CWb~f7LExr01S9Qhmv)hw!ZIZR)0DLM17ibRwU(4=#90a`wUk@CwE{%xPlPksz|CX!g z6vORO`bmrNGQBQFb!zKOLiVTsa|+g3THw@mL^EU?lTc5p?Bt`gJ)f?dOBc9` z=7Iclv(o-VEa(yR?7NhS?d|%4T}U!iq{XaY>25^sLS;QZ}{uJOvhtIrZW znWW9|r)hX2CJm!|d>;}WpF{+kXVTnJzT);gNNM5TOof}E?2+hi+vt5>{2A^*fe*B9 z?GKjZZjeN0@Pn}Z?Zz0_WdYV5I z6=vAgN;_l!RwltNzU#-ZJD+wIeW>F)tscOxa;_PEJP)bLNK#m3b>nt~ylOLhJ5iv= z!+y^SCOl4%Hr7{L3uN5I2WK@r{6CVeGOEq4+2ZbQ#oawffa30M#l5&o3GVLhZpGc* z-Q6kfg;EM%-h2NfKa!Poa-P|HX7J1tA0V_P-*E$mLlfycdMHVYX-Y zDq1!}k+9u41**g3v4Ay^{c_k=L<8n} z$^8YWa)fT}eM2ZmT(98%TO^Lj6P0W0EX6WlVNb z|0uId$|;5C>Eh<`$sY49huqH&??50>1i#{U#LfMupcs-Q^FORCk%&)=dy&%>VxoIu z?KjoH`0TlmI=!#2DZqG#qeu6L?lCc8BkDOJQ2OH^av&;hsi^`Z70!{Ll^buR!#9O(UKio`KSM+HvH+1#H#*JdVZiVwk1N zNC$QpA5z8|6kC0pGVv3OVH>Ems7%ChBcJxD$i$}rW;<(J9VnP;J&g2+k@jk$Q_A0J z!v?3rh2tB}X#kS&*M<}%NxZdMMMnK<5bqeM;%yU#_Tg8iYPPyXuB=?BIYmD077HU~ z`P!+2xQ?*osLemMS$`;agsZ;!+NGut+AgI&?4Rnra0jVcxvkK0g)$Q9U0W2(hc}K5 zIO9uN7_uJ)&=O2n-IFZq8xfcxGfB52Dr(>fGTp}Dy@am`dd5g0bR}?@(7+%CUBk_| z1;;rD3tz(J-oP22!_Bw^TXu=MZWrveiz+&(G!ZW!!nM!_BT2fXw(u$o6QYLW4tmu7 zfMFa_w~HAuQW&xsB4d0=tve_aM~g8RAYw)S6PqdF0AG5e8m~L9yb=sF|N3R*qi!2F zaWSPS>R;~nV>h8Y6b);*w#aQrkh|_p43VPMG9cTM(({3G?*3BP7KIsV8Y5}xT}an` zT)sAsxh*7@k$;WeME+9rn=1MP10}WIRo!J9R5CH56t98}0lI%Yjz1ZLQ&N8=7#=w^ zPGSA$P;|&Z1u%TDVdAj)r1q`*OLU#$mg{OO=|sOWHwF9@ePsx=#Zv&`*9s|Om}R}4 z@W&7#`;4Iate|d=w*2`x8TFY#ee>k3P@xvpNcv1vmXcj$ZRl(rE6@STC0z&gWh4y? zR@maAl>xTSm@2E7k00MSqH!>_%&V+GO+AA@*)`gv$K|9JeR6>r{DMA8+4gu3+#-!L z^-teU8s+3Tna;-k`b2{a4QJ0LCpAkumLIIOl^hA8R{=F9Fa(Vfw!W$Tl2F>n1`JM_ z{kTy05VTv%_=$SkZw$j*I7Y$jPMgbUiYW0s1z&c^<3*d3i7$g4=4TxemI8wA#3yt@ zDG^PxHzkELc}F-P$F!1B!N~)226L% zf#ndi`b!;@h92ndUj)dj!w>B+zOkwJR;UIY+R%}niM^Dx!<$TzloR^YIHyI&7D?Br zIyu?#L~R*wcoBhMVIxJ9rCsybDSK2kxGS0xn2466a##&(p(oN(dMTOCa5`4;QbW5p z8`0&7h#%lK^w6XSk@zUJ4%?6%nN<6uLjv)U-#hz}VZT9Sq|~xeq>?wo&x=G%;TZ+r zNy)dOVWfx~R1#*PFydqaC8=+cf|dsH5`Et(#oPz-r6oYCh(b7to_A+)P<^(m~Av@k7x*reJ^cFT9tA2>_ z(tO}Sm{ZUw)%F%hg>m&kYhaNtS22&PY2#O$8XYgFUae}o@3_3C6Elr{<3`>nR~Cht zM7hA>H_R_vRpq*{CdF!(kMeKp7X-RLSxk)H5Q0ENKdE}f%=F#46;#rYqFHX>4>$qi z>h`4IDd|qx#G0|1_W5aL`|Ue6ly_$f&V7>=t(WCV%_$V>crKDdYKhg=yyf0jC*9*j zoT-~MJ#|$38f2@+7yl><{{f&tOn3hM=6lb$`y=|la4MjuSi#1jgj?Z($&T?L!&RvH z7Zggl_(tMtN@op}7!|{xv_;Vh+jg+rB!~Csf9F zNh4e}`!7D)23fCBzDr+hvN*yIw3v_v9XpGT#$_>PJuumnDDk40)0q^>M6Ic^v(P&7 z!!O5{D0>!5(tgViM!4Bj{kn`#u)7nM9xs5*k=J9c7UWtcG_*FCRKg!|HuYPHxB?~8 zW))L`r(?4Rb}SR=cQar4D((|Q8R5PP7^^k1;&9qe`0%mnf_ZySKgm6#K%>}!oiIOz z5G8P@fOxxrj2cYLcq_QAJD8gUh+9-YdIm?s#*AvvwO5|g?r06y8LR4;kAIlEC8?e0 zjt4g;E`{3f`6Qs%!EaDin*Y-w0p)!CX)z>;Q(+I&irt>tj|L?ONo(Pqt*SW5f1)Ccvt{Ylg9cy^q_m5UZ&t{{60bjaVW~M^ZPu7%`Qsuv?OL zQqL|Z_4rFjFpr!I-oy5Xxoi}*6@|8eXi})3QK=FivNv^mhU(Q5uUnD@2wqSt`ZOob zulEFPGWI>zU$sG=m#*hiU2@5FK@Q`Fwxy@3zX#@qu|B$g7U~73UC_8u@yD0Sk*(#q zBcFUQjU&t7+GRid`d6NWMH-^qB?|Hg&T|e1&RppNR$V6w{#%>9?VMM(&w^u=hP8U2 zQ~fA!YUn$bK()rfv>52air1ynX_hP_(^cT1$R{B_U?oY^)n}ILLR9HIU5Yoxfgq03 zJvr-!rT%CCKNt`Eb!B7pKp|LvkA|%(V>xn~tt_OY+NhrdEV{K9-_KiwX^VFdzwVu> zO1#Fcq`J$Zg#_OnIn3`ms0^SYZ5JrFiw18O3^>eV0Dc(*ekFj+F}5qdJGd3sIs8J@ ztNq6NyH-2Yv4_d;QvE=G@3jp|I*+ur0bh)`IM0i)Q+N&nuCpYtFGDfX^Vm5;My7MM zy(5XlisG|&k$@Wc4`T{n%O3`p&OQ%3Th^7_)X;4WbQe3J@kg-ZOo`3;HuvMQvP!gkj{L(r^$)aln|~(L}^74KQ5(otEc7@?o7}W6T>zXM}jZP zr$zL305yi3Lw~0Z6_3HExL*h*jgUj>l+sTdD2)h?VmY9!kZV%>7fYa_^v+1m_1!rB zz8vPF8*xaQy9>i3OiIdrL8Vg#J5=+By1-|S5WT90>21(b$YaRtlMkVuY(i6lmA*K9 zO?qMt9wN}acgq*FWU?>(E1boM$0)eIdW9c47(2LmW}}!ezJ8?~H%ejEVtWkJmg7dA zz}feWVAz=1h^$HMmyGu68M$O}O|VnyFnHdJ{PT#6utO7&0G}9a%;IV5%qeHZNt{?A zT-)SxUZ4YW!0Lj-yaM1C0pJ%7z&eeXdkZz|2#$vaj4aNv+ODA0C}*eN0ckJGU&<9; zAJ^f>Rra{yJ)~cVez*vYpDhQ!&-f(t>7hUDqzY^@JA5{h9vhZYl=5jd zy7b-^C{W0@p=&AELU+uFwOS5KnJC`r#FROCfx^dMCZI%E?oa}aFubbz=a7I#`{^+L zO8fY*d8ipz`>dj7QFc}310wPwkGR-OQ0}a%g6+0xICxPCdG`MRMR3#0{sAfo={A?~ zuVYZx7||li`kz(v$=|RU5O%Cv^*{U1Qx| zf?lH%%U0IF5n=He`}W0tx9|#GQWZBszFY8S8=sB$yU3Sq9px^Ye;cT_&e3l%#Fx5& zaov{#UB@U?n+X@(sAERSU*57y5%Y8ywvqGU{|trj$l864FyI_Og5n{Jb*)okziZJ3 zdc_3K+^EbFQJmE9_^fBo2e;@^TPR(8Kuxl`Ukb4!bh*o?&%q(cplA)Yv`t%eRh60+ z!REG7`5!or^PHUI@el7g(A*PVm%y=AW1{XHx94PX*~vd)k*Z}$OT-C`#QG@ia`}vF zDNndYUH+Gb?VQqYah>i+r?+&$lVmc*@4fwGcF?$9sr~s#-Rk?#P>xuyUjo|@K<|b9 zQ?UNZ`zrwx-)^@C)%Ddu(AT3E&#zIirBK(n+;NO7IGJg7vp2yi@*;+TqRC@9k|?7O z?#?3VgXP-6R^MkZmz-)s4dZwux3zrZ!ynuuuy1eK;?!r?$h%93CNtCIy|qL1Qa~br zlb02#KM2#SZN`M>1~{Lh=qKp{pp@I_Rf`pVBWJtfueFZ@Uk7B|0Pkao*3~ue){L>T z*>}Bg2wH8i?Y?P;vy%K;##fW>lT8gpm55A#)2IQ0RKofIGiC`}`I0LwpHNEV>&A9s zF&4bf#l1f*(##*g-%Dg%I`2nvn>5JYpZ~r7sqC$R(NyGs<&dTABufSbEjfZasJ$5f zaLyCs-^PzJW&RXxPuH9%4hV|cA4J!J(I$7L;e7c?_q$BL;Z!rm0>)C-1`}~fL4IM_ zFz%h6lWE>->99zvB!)?j@+hTVg&Nu*a09<$kI~&5-Qp}zNPN^88r9NNc3BVS4@H9Co`Ih@uTlLVNLt_G zsX$!(O{*h;%%22U8pX+(Y5JdkDVD1~MgG7WL=5QkzJ12y2={yl^(4k+mJKaMn-u^x zi~@5GHR59cnqbt^S64y>E3R+{YufmX#4Uv~* zU?A3ouhPIR(?4>A#B>Is$*?k@?1{ef>9a;7LxTfK7kL6ca(MmuC<(TD;zIu-R{h0# zg2Y-@*n1sH+s@Q^rN;%6vSDT%U7YmD9WXWBe*=9gP34Njvu;RbWH==5=~hZwQM8F0 zWmG^$A;$*eg4nsviqJMovUfz~8j{Q5>LlLV=RUi=Q15W9wsd$PP(rTu#H=~GRLu2Q zk#$Y*kmFyP>Vrr;(gw@XDd3~OEvb@gwRlBz%gKFL{_e-2L=9e~LHPKQ0VUY*s11qn z602RXJEY+f`x10f#E-{-68>uxE;5%vxgUyd->D=2e-P;iX>=!@gK}*CR9Z3Z{;1=8A)c?K_ zh5ct^`*5>Kp#!nv<0nz7p&w zS9%|aC%983zz*i2RfM-8P+P1`zXNUA}*W$3dCgde>- zJHOMDlrOuyJxdg~%})&l_PK(-jPG2C`j_RIIxMU7fBMXUxRc<(~^i zZ;8tJr*6Y`;1t7{Kp_#4#?9;a^O$p-@ppkwl`YR(VpjCO{0r(Bv>48r6T*I6_3Fuu zx$AhPN~Dc^SB|cAZsULaeby_k7$5GWQw?fv{kDPfFsxXw-hpdcOvuIW5tGVp?Gxd{kNI2(zzN5w{# zEIZ-E&>#5@*L!Sb42!N&a&X^fN3MZsCJ*Rj28>I8a-n8OBO~U0{bNBnz@dt#Mi?X1sTWHdd~I9A7f{Z^VIZxP1|>DTB?zwhkpwXEH;FV62C z7-ppzBAA@zj3C1qHzQsbpX&GA(C;fq(qZZeYv`r>0K{%s_KoswYMMsk%WW^zd)#t9 zeIBG?0mowlO zBH))S;1>hnmkr?8oWneq!+g_!A-U!yFRad#hq~7gXb*?)U^Ks+VVkxwWf$kP*zAcL z)?OOy75*lwVwGfuZdM^fhj@d#{A`;)d+U6>OC!ArL|w1%KCb6Jfw`w`T(~lQjeIFedXR3fKe$N9 z+evy1a;TTHE%W{a2mXN!ny#~49Bmq052|=BmC~mLrd3blKN4@Ei$skuUbzB2k^H{y z2Sep!zqa?&!G0L*v%v~8vg5oq_gleyi06K+M7-=|DYsr z5mjIkHR}M*+wv;j!)!(YuJAeAWhv&(Iwwt}uP;fGIAw=x4VzeO9ycz}u(MLuktdbUcK8 ze^QokLBQLbG()s-#n##b3K}Go0tc|n&3PzU8|>D}?QsRQO&z(rRlBXzv)dy#D$29m z4pjwUPE|^UbJgAMrTx!zSM>}v|3nMziLpNSrkL&E@}g*Q&GB8)M%8zLlhhk3C(pnx z#4BbeHgKkT!vM~mb75~-oU{W2`*)%KB3)59!3S<3ZX>d9fSUFwv8)8&K1kcVz`pLY zp7~qp`?+P9ey(ldc=NWu8G=}?{}CmqPgDd0)Zj1f{tJS^&nI+4kX0TSemt<78L(Fp zW<%hvAf^iMThWJmfB5_3#yT{uXKsyrTbz8x$WSr1POyKG!`szqQ6VV!mm=?Nq3`qtM_o2}v-EX4b!mR@xe}0GW@e;q z)uV}4tkmD!0hrsY#MH9Xt8s)4$JJ){GGZ(sf$$cA;TQSjCtmT*;yJe9kTec&r5NU9 z1hfjXqLT#X&>2*p3Dh^=|A@Q801ZvDVq`%7AIb3(Er@ibS%Po8cc*WqK-RD4dzoc* z;0t4Bjk)ECENzeQTpC(#7V>rcf(v|#sQV)yiJ-)1mE+B`pM!8MTF@3<-fCOv&ypg+!^!Pl8#FJPf z*Yyl6@n@BTGvWcCgt_PDZJ3$!k&l=$EeOu<_{|A5KBNcdZq-tx*V0m>Ag~w*?p4-F zaf9>ZjPJKj5zOpkhVlvQcZJQPyAumMLjbDp>;9)Vy9Jg*((+7Rt5sC=jT&2(nzuRA zMNg|plt+1;&+AOrJB^JaD8R7{h}gY)U`|H5IK5S%_wt%0MW{>vu&Ama{Cr_kB;!fV zgENMz)Ez_{PEkevm`Mi7mgT*INPF*O(7wQvk{=7_Ez_xFy6W(!{Yf-mR)&3~UZ~l_ z@aT=Rs$TXRIq8Gq;d%>28p((1%(CSZV^MVPFjD7$RUF|9oIC_YrcfBh`2qgYCM<0! zu}z&=X2#-(xoTcRVEA^V9H{kEx7~al2%bM(?K|8C3!%NIPSKzU);6i(juuuxTU}MS zev|=z+gtGZtvq4x*}-b=U~L5^+(EdBzHZ})_Ej;SHS&Xuc7pVO(gf}8gPVCyd7I|c z(u46eJRwlXogMkhEfel;PNNrf8q@4HdUzdS@79Bra(0>|k&wg6wSYbEKmmOdI4X zTf*$`2F7}<`2XP`l*!fgVBp}^rr+RnK1MZI|8u)NX zSiB(J>IN)i3CrSqPw+HEXRQgfG#%;N$R-l`)up4SDoVD|iAnh*K5yJ8^9cP|?(iDh zZqR~JY%}hk$BN{!Qlh1FrJNI80o7GW-EphsU_T$BaidE3Kiyzm$C^UF?9E(9w%hNR z|KNoSDj)9^5Xgq)2gzQE2?~sgz6_eZPy282BesaZR${De>X(O} z0f4P7WY}lB6ab-~Go##Bu0EXBJqw~fPvHjfJQS*!Gr6ps>4fNAJnre-UFm|@$83x~ zOfQn{p@iz2J)n=usaB{8!E?qtedzm@1VBNH@rg>Jldi`ZJ_=-c5|DF#wceEsos$j*$#z<^( z7mt5WG;ixa&qNm}h`g<241y2Lg>j&9BJMXY|1EDLWV>6L`8nWKJ__E-jf>@W&AlZG zlZC4Cc(q&}(#>vEJu5$lTI{iWH7;T09zz}JkEnc+&ma9Y1AINNA=@;!v>EF2>1VeM zDRxm^?Uq%j{{B^p8|MBS5Hmjz;{aJ@I50aVOql1LwY&3j9AR@+iz8-0~rKa5>_K@2g4@Mb-Je zlf9x10R$c8Z4L6EtXMxExPbZ~g|+l5Oh26o3GCUuu?CVOtiMr76X1o2{DEtD`lEO0 z9q%Z0kXvg-+Gc(DSR(s4Z3i{Yg+2?I>keH4K294v0>_cgW-MrP+Iln39&7k6YtDr5 zq?|pz;R=C_xJ7(EQgJ^SnBHlaa@y{)x_$Hx#A~g-Et?*SvOz z&kmnih@57I>ttJzBAMs)SqnXSL1HT=~=^fKMFY@>L$%NQF!F%6a@fX1Qb;}VPquB=^@-*A~ z9tilDEAqHj`ILYH*sK1xr<81)1oFrT`<}^;ph+gikmg3NRVaI|JoNdl3eU;B5xyH- zPo5KJ+wX4TI#L~#D7;+fNE5On_&dPVL5jxNe#jODQva?m3?&#lI!?`@!Z0|$Y4O0e z*_=;mjGU~_W`A|Pmtg)Wd{G1<+c?|e5qzp_vX#69(PZWqQoC)C$&dSOberE&%!XtO z#75I{@YE9}9EoiDn&+6`Aukwl61se5p5RCYY^Mod9gi>tSrd&SCoORfzovAG$cbQ_ z2t&-F9AQ^p(P*Fzt1G{^b7bfTqr+T<-~JG_LUuw;^%X%Yhy4h0Vl-ZR#^k8290qAL z9q@m1Osg`r!&pM!)4Lze zvKF-lQA>EB4EvIGXHJ^U<)_T~hRzpD3inmJh*$m7)FMkwJ9rJ25zGE60bT~J6~s6Y zA|bm49w||A5K4~T4CO0el$y(wxs{Ky`|@qH zmIqG?7t0PdNhiW`B!tf7T}gPBg*fwj8qhf37o8wJ%!-(^1W}6?$y+Hv;E{`Ux8A#g zCH`^^4){g+36EL&!j-&A`Y2x{b#q;W0bsvF+*u%Dw{Le#^{&6tkCEnD3i2u*kEM8B zg~l!K`&JPqTtP5O9GHo|i&(NGDURV;HyxVbDNj90-3>U(l)HBFGlT{mxNyT~J;f-$ z)1Z#+lQ|rQPNItG90x#f_~!?`%uH1#eVjwPyafVnztl0AiC?3u7WI~Xm~gF9A-&0n zTO1v$lMV0p^}asCS8IkPgA||E#JbUj9KH@A4lXSiOa+yLB|UzaEUErppxmjs-+B81 zK#Q}Dk}&0mtRc$Nm;HHo+@jn;Q)|vg^QRom(|l{h=J>-Fwa0!~((`@~<yQ7yyW)E2sL6_8ovswv$kp!E@K+}SmMX$Q#b zwYg=JZ$wf>u(fGsu4jRrFLKo*7}arF`hp-i`&6uAtp#B7p#LJPKDl^va64Q|59XFF za!E|9n4{mp7DS>TDa9a8`&sXDxKnSi%PLCGNpjU&GtP{NYwILtg=3V^nJGV$DC(4d zRqc1AEV!|a?~}t$AO`hF7qxk89Q3c}f8{StJ*B52QPftwjH3g*0upM$m00+d`pN5Ou+aeQor&v zto&E#x9#$FZG_d6z!tVX=1G(XvAs)ihhxa)C{H!774+iL1!(GcaoK!Kf>Txx8Nt{} z(xrnrM=_F#TEjiTZ}X^m&ifl?7vCu0c()lgX{z{H{y0fx^*h=7QWg-yy|P%Q#a3rd zF=7d(NW(XY;;MEsFB~7W9pX8XCeY(?1LuiBkNkiLX+`y&Gh|rF zrf#PJpA}b>h$HhsE=7~-`z}FNtWAbV3S=s8<#B6z;H!*M{Xz9jakQ*=k=zl)g5NP> zxbW~vrCkbL@m~i9J-Y0xxT@wBm*9G4y|ddi1S!1JGi} zr?5RgAVEvPkC8mMhQ=6mSYCnsO|ZPk+nR@d3dVpyI{8=AeyF+csaWKJ<*G0{fo~}| zVN1;o2+CJzmy=6er{)$U5|D$EirXaB3zWMGHjYf)4HI z7+WMTjKp;#5femT?{T|CU>pqNauiNK9@5GE)Ii||PbiMls*il@nXTyaj7LjZM+C>? z9^&VPw&rJ|k`s!WRf=fC+O`Dl;tzIAhl{wfx#DXys7{j^iDWLcF3Ssjn=3BMwY$UI zH}O(fJd3&E)wMx*R>Nwsf}{IpEi?p!wmAl z{U?wZHWJ4SCr_iEDy#v9eS?LoRYzyV0%c1X*{6I4wZS}O*R9-HcFy$12 zNo{H>8V^+sH{j%D^LPz;HwI(P5!~HWyX3jQK8n3E9oY*<+IEpXWSa_g{(R2(pcGiZ zUjCji!a}F+oV!e&qt`Feb5V5Z!$>aci^H3*JaXpzOInJ2(VTw8oCioB(Q5mb0hD2S zAMq0x2+|>9#Js_&=u}4L`lgl#(LPuFJ<{>0^7m#b$9Q(N4NOI~2UdzUPhCdwLFYE- zHb<2RlH@~958dlzBw>2!m3zBsM4wpV4~|bsqBJfTLl)F7yn90$F zrHeSzpdudyM?qTGSTyy`+qu-{714wa;S{gNgJQ+G2%on zZxF+Us&i>#iA7C`N4iTiRG@`}0!MZUAAZI}d*|Xi7KA-a!`(X;BszTxmkSntnk_$% z*pyDrtW6o3EZBXLEoX8E#EU%lSwcG^EV9@B%ZN49g$=vK@qIrMLFvWuj2zK|{8Uae z$C_x{e?a5DtB#(IV%i7M!gERh>B5Fp;|l^8o3>rC!{JE zm$dj?!oL<58P-{C)rc0h29I?-b+M}HK_*ZPAVayCIDyQ`=*hM9Td9g2TKLe;jVu!4 zFb11yb*&```S&8sF%wk7=_f#y%OVY#?cWNrxF9i_(Y)|kOVWiRDtWZLX+3=E&7DJh z&18><;*(FaLZtTf0$5wlTu=P(TD#6Z@x{#*Te40uLGws;s=0Q6*+dU>7RLPb%;dH! z(B{TWldpCkvppHBD!u&r?zcGSBkJ)>9U4m|r^5BVa&>(DBY+{| z!`WdTY)MV$%OK9ptXa6wSyp&{fC&hz{rZnvG>jI)Mbbwgp0}LY`G|SzfKy>H3yan~ z@`FGL=`mmF_&zpI;31M0pa`9X!Hs<00aE2Z#BUW*a+^1%f3$gNWL8x_Z+@P1xv9$o zpZn)loc<>>h~0f~C_^N<3>2_e`cv2y*L~ntX6xc%vwWOFD6GDw{?c@0M(pk-jw%5! zu*H|2>m4gkVp}QYyupn&_;a=>69~n;`=M#w*-P_{Emh$3YLeZ$74H{%R$bMR38Yf}@29NaY3W57`h*D|2 zH2{`dZo}ccp^R9D1)UX8`eSre5tN*U{MIfJ<^bE7VqMEovR%b*Z~~Ep)$Y7iV6#Vi z61xEv+tiLKQN>nug?x&Fo6({l$;zr@h)9QM#h$$nVVrNuK*2TZfGs(ci1K5OYAH3g z9MhA*O46d##@wy;n}xAdg$Aw9;jjdK?*w^(goa9htS0hq}&seC#4LbOzaf!_QQ=WCPQ`g3LT#Eaj_O(s>i8*aw~=$qtbZ_`VdOHNGI4&UTL zSx*TbzyB?Cx~(}B6G*EFwvx~mM|x54pWrh%_py;b{Bxag*FK6w7*v)^UupX82}7}BB>_!@Y`H-S*DQ2(vE6Jf z^CsZ@1y)6_)6!`g-LR$2RbSDB`XjoW9m>xrjA5c9BSw8j67(ZE_lB>e`PxpjLfv+v zRKRFVyAP$e>zl)KwyLj`p}K4mKUk3?@pvRzU9d1d-Er5F>B-HJEOlEFS9;8=!}k&9 zM<@Xp2)>FXu57vs{n;MZBa7USq>v!O^;gG*l=hm%T)H?%gL&GYlFO_vu(-%j609aRh!OQHc2c zs=JU~n=@O0O?{8_WX<(=o6nrn+?c4-nP>I;oz+_aQjjJp(o1} z#J7Ria8IN>8%!tbd1w}~o>MmwR%|XWhTcU4JqBn@P@l~LTBwMPJ83BM|y~@SSg}h>1?g2-DFT+ zN}oss=)GZGln?7&wa1~Qr3A8UP>&uo1^>Q&4c4cD3=V!uFWiHpD- zlm{Sgl)TizvgB50;1&OKuA|s|!*2;qzG{W&ChUKlQrUIx67n>*lVjgG7^G^(2%2DjgA2b=&~jXMl88Ra z85&%rw8<{dfon%dUC^c+3Z)a>npoh=8nk(BNLak*`y3F}7Iz$`u{O?7%>SY{ic6DN z&}B^@-*_n5kzS&RL`7uJ8=YtC19lQ-m{nz$jGWI8Cg8c}_PCOkj#G0++Z1c7Iejo^ zk-{pEGuq^m9^04m7@PT%q|e%q?{MLHk()I!Fo``B5^?k56vP=SZStHfET+~#+!r7% zt3_X_Z>O@MG(0oEe~z9=#tKuhoz^CG18pXz3?_nS-Q}04e_Tr~VPGzbfkvHBKFa%- zi33Zwx;2a`)cWb_AkUa-4AEoSCCcbj29m22Nh?GwAKqXrK;k|5VI>J~~J z{q;t{8#P}b$8t%?)PhYt6%P%5?$w?#bvBm?L6vTXa~OnbB#eSiVN-aD2Em~?^Liem z+OsH4sS?$se)bYX_~E}TDfy+BOtWL=x5HN4d%jzj2o8|G-obRL(GAIZqRn*FRES7P z7T=Fb+6>)WrV*Z39YcZ;mSClePl!3fDA4e?P@rk?|K!#UdrB1v98ITg<+$dd@+>1s zrMp;!-1jdguA5f}3yP~7A1Rj^3jpOK6F;m4ym?3YrxNgD9hLU$#KPQYqk6aWi!Q!% zw7p-{MDvpkr!;}vicxQ1VYo1XT`9ZYF);0=Wqx6RpI)kB?);%zup6G zA8@NF^5OZB#Nx#cG!nH7e}!j=EfmNhg$k9)Udtz0p#KNiXGR=FeOx4U21QejfM}6E zC?EobejSU8s28;ubHh!X_R{b&8ChhroZ~i>%;eQ$f13p_0w^#rQ4+$4>E`Wksl;pQ zS01SZYL!vs91uiB*T=V!TH8{*U)=SRd}FK!@r=(0 z(ug@vPr$qv59VG~nYoK79|}DU;-NVzyv25*6`psiuS`<6DJ1r4 zZo5)OjCi^(=d6tNMCg4+D5ZQ}$tfE`(;9X`h8?Cx7szd%ZKnGyc>H~g0~H%7ee0@Q zBYTe^C8~?|SHWow4}Q9{QWkcwfm8JsM8|jCwm;6o*|UyHc)y|13^%t8XDuoP%xY70 z=#yZ7A3K_Te*hr-#OUFGN&vZ%@p)(1JY{%GRm|f2S`G+IrrCD!@_@Qvk0CENofJU$ znMQ3TLk(IRB@^IAu$pQc%RJH&U1xN(%~Zbx)89gGuv21)$c)Zw@gUOR307IIJqBrX z8#xJVdG+2t;vjD%S!&UvO4-W%ytg$5Dc#<-UwpdL)N53-XR^7E3#Ex-YvDnmc+lPQ zFhFo=ZeM>wuV|vgx61ohSVOADV^w6Z`af!hE>H}&LC~E7BEIncbL^4hKq-Z=u_ee&Cl zHIpADGUE(ud*|d;HoqdHG+X;RI!)^OL3VDxQ~FLRXL5N>-c7fQe9wb$iyP57#s%S9 z$oi_>gmWWdGya++`ZlG%oX zUHhly^>(Ln$n9II9{rlMi#$r3|5FghFmAGe|Iq4qsnFZ7tD?6#l6KksvMid7R}$n) z2zzg45i8CH$(1k(+bUEYxgSYYQFBc6EEMaJ07+jYyQ(!F;44=f@i!vpqH9afOOSwx zjj^8ctfkfSvEXJ_M~&S20PMkI5#G@k0r^w)c^X=mvyzQa@C}&yj`Y34uZfZ7I6H7a z3hNAZXTD`3ZIye&9TbC|W#n!b?thy@;hkA|BMW`)76p>p)^aJ3ie}^p%Fr=(K4#F=xXp;lOQ2~57J05}RE+13#ONmYs8t@lo3{)cR-6ifv_afT zTQq6`hgYToA>*&thRuX6Hk%qpr>iLXad<7GE}w~=&#$Z=DRL{3f$K>~|1cg6tyO6D zM)qo!zoj#i!8T70Xy>~)E;p}u4rp}NS;~M1#-phP^~q)igR6K%p%`;DUBYLIXOt3K&C$tX9%(- zSmQ@9uvj$(Q|e6~>CImA-LW#`Y=|*#&|LS;z&%iB4ROE6dL1^E9+(VCaf`vB#1c{< zdJYaP;^1mo{eU?TPw#PrA_P6SPH_?`W#e)Y?P7)jWJbz~Q945y`w>cqnC(*lZ6os-H<6NFssX%JL?N8^2cL?u|!*84fx`ndDN*tHz(8onX(v`|d$PGwFY zh%~gm;AP3C2q*fx>67MAc&@esP|Q zJ_w1$V*kFb6KciA@6Y`Zi1H#DCa-F_W7(pn7u3TzPJmyll|8R|Jf+qGES&rP{%+r` z2=0+1Yu+4YFCbTLwQoht{jr=$Z8w**AvW92dG-Qe@OGfpsNbLFT*tR0zxonpJ z!e5#4GU)Ln(5_`&YRG*?BYRclPAlf~?~KB65|CL~8M2w|&M*GA14&7!<4rU)=j`V3pf5$Gnu)>aZH&A}giDELP2U!x`{5G*R{=qO+?sN>EUN;y%nOs~ue zkdsIeS<+oS3ISbSXp@re0o^M8>^Y=dn=KU=B!95G){5gdNAJ>r2xvdC6q_`}>V>k* ztY~yVimo_Wc-Odfv&HZS5Dj19WVnuxI{fifX-b&PLIlrGp zrmH#^+=CeZHX=1c6*4;dTAXIDD$kKz*#Ddb!d0P6^AUVz{+00Rh_gXj9%Qm;Ac-H) z4Qid{DO#vBUSPBW{UEpT2`DZphAkiokf>z?2_0128ia4`#SwpmK3#dlGp|zq+Hszh zwrd|vOQX*WGwCSmL;NFJxsG}Nsz?ew;!4ivTK9NGLe@xCgkFoN47`_^6FVU6>V}ev zk2#e6hY~rPe-p@^*vy|x-%%sx*0)JVBh{c}R{Xl+B>n4Wwfx8( z$Ysj8;I#~}j-x@#>ZeU4%0j~20z0egs+r}JTY2JbK*aW7tUq5J-_9G`b$=dxT8Rmi z49#x#4#h!ljNi$s5SQ%aT;Fr~F{8G?uFU_duitf^xdjv}_u; zZHh6*ZOh=Q95;JXEj;@70N%FJXd!PoC>+m}GqMg>Xl7G!0|jFsv#@md>YBwemTYW5 zp#*kp_*dbBv+8r!hs+WItw&aIVo+ZHfcUiD*Rq>&PvxJf3s7o>fl{2_-9kSkYM5?L z=stkVyhpi*K$mF-$;gQ^9OQtpWD&1`P5KF4-H~EVsltVZjZy{l0-UlczOzwzP?HzI z0ulov{z&zw(%SZ$YQ}h$Rn-jUkePOK$WPJtwL+Zd?BL6I`LyBuy zJ?(?%{ZUY=)(2#%kA~mg@`l@88qctNYI;x?>4I`fsI+sfm?0~~o)?3ICZ{TW<87V! z)o#6PjG=jy$PpSL-!iYq(GA8jx(A&E&kun*tSQHRm&|LYbT4-(N)Y6{;g3shC&h)- zfKN$%UOiWr-!VxGSF=nOb~lrW_&vO9SRK?3SC|)gu2d571>5MC?rYi+2Oh znt~yOvyd?XP>TYg4^H>KgN5bWaN!W@Up_HO`!|=k_0;RZtYRiM6Tm0S;&+V9G!2}M z)^e{-gdM;rD`nEj@HxJCNob*EMuWa(v7^dVsAZPDrGDgaWlJm`5!vYXg<6-^gQDeD zM|3DY)+huSJ?1C@^i~vf8O>_RNBlKSzYyDL+$K@wSQ?N+RdI)C@d;nO3ojODS+vm8 zH7^d$z}}Q+kw&v&ks2X#SkB!B`{++-i7X||A|f`AgCpLb9L85JSNu4#`^uA|$kcMI zjb@y3VzMz@ysT0-r3JO*rX&%@2;FIrP*{C~Ru~N77Y> z#nm(I7PsQk;>D%7yA=20?y$IPky9uwP^@@ycXu!Du(-P}Zd=^GectcaoHLosnaL(s zHp%3kyFD{rG%`;n$Vvu)_TClk?|fxsfKU%%@6WG`dd6zOGDXzIEGviGVOXw1Xj~OBd2QVe)~Zt8 zY>pS28>_4*Q#+8etWy0QvXGFZk1n4l{