usbFifoConf.send_event_done = pConfig->send_event_done;
}
-/*
- * -- support more than 64 bytes command on ep4 --
- */
-void vUsb_Reg_Out_patch(void)
-{
- uint16_t usbfifolen;
- uint16_t ii;
- uint32_t ep4_data;
- static volatile uint32_t *regaddr;
- static uint16_t cmdLen;
- static VBUF *buf;
- BOOLEAN cmd_is_last = FALSE;
- static BOOLEAN cmd_is_new = TRUE;
-
- // get the size of this transcation
- usbfifolen = USB_BYTE_REG_READ(ZM_EP4_BYTE_COUNT_LOW_OFFSET);
-
- // check is command is new
- if( cmd_is_new ){
-
- buf = usbFifoConf.get_command_buf();
- cmdLen = 0;
-
- if( !buf )
- goto ERR;
-
- // copy free, assignment buffer of the address
- regaddr = (uint32_t *)buf->desc_list->buf_addr;
-
- cmd_is_new = FALSE;
- }
-
- // just in case, suppose should not happen
- if( !buf )
- goto ERR;
-
- // if size is smaller, this is the last command!
- // zero-length supposed should be set through 0x27/bit7->0x19/bit4, not here
- if( usbfifolen<64 ) {
- cmd_is_last = TRUE;
- }
-
- // accumulate the size
- cmdLen += usbfifolen;
-
- // round it to alignment
- if(usbfifolen % 4)
- usbfifolen = (usbfifolen >> 2) + 1;
- else
- usbfifolen = usbfifolen >> 2;
-
- // retrieve the data from fifo
- for(ii = 0; ii < usbfifolen; ii++)
- {
- ep4_data = USB_WORD_REG_READ(ZM_EP4_DATA_OFFSET); // read fifo data out
- *regaddr = ep4_data;
- regaddr++;
- }
-
- // if this is the last command, callback to HTC
- if ( cmd_is_last )
- {
- buf->desc_list->next_desc = NULL;
- buf->desc_list->data_offset = 0;
- buf->desc_list->data_size = cmdLen;
- buf->desc_list->control = 0;
- buf->next_buf = NULL;
- buf->buf_length = cmdLen;
-
- usbFifoConf.recv_command(buf);
-
- cmd_is_new = TRUE;
- }
-
- goto DONE;
-ERR:
- // we might get no command buffer here?
- // but if we return here, the ep4 fifo will be lock out,
- // so that we still read them out but just drop it ?
- for(ii = 0; ii < usbfifolen; ii++)
- {
- ep4_data = USB_WORD_REG_READ(ZM_EP4_DATA_OFFSET); // read fifo data out
- }
-
-DONE:
- //mUSB_STATUS_IN_INT_ENABLE();
- ;
-}
-
-
-/*
- * -- usb1.1 ep6 fix --
- */
-extern uint16_t u8UsbConfigValue;
-extern uint16_t u8UsbInterfaceValue;
-extern uint16_t u8UsbInterfaceAlternateSetting;
-extern SetupPacket ControlCmd;
-extern void vUsbClrEPx(void);
-
-#undef FS_C1_I0_A0_EP_NUMBER
-#define FS_C1_I0_A0_EP_NUMBER 6
-
-#define FS_C1_I0_A0_EP6_BLKSIZE BLK512BYTE
-#define FS_C1_I0_A0_EP6_BLKNO DOUBLE_BLK
-#define FS_C1_I0_A0_EP6_DIRECTION DIRECTION_OUT
-#define FS_C1_I0_A0_EP6_TYPE TF_TYPE_BULK
-#define FS_C1_I0_A0_EP6_MAX_PACKET 0x0040
-#define FS_C1_I0_A0_EP6_bInterval 00
-
-// EP6
-#define FS_C1_I0_A0_EP6_FIFO_START (FS_C1_I0_A0_EP5_FIFO_START + FS_C1_I0_A0_EP5_FIFO_NO)
-#define FS_C1_I0_A0_EP6_FIFO_NO (FS_C1_I0_A0_EP6_BLKNO * FS_C1_I0_A0_EP6_BLKSIZE)
-#define FS_C1_I0_A0_EP6_FIFO_CONFIG (0x80 | ((FS_C1_I0_A0_EP6_BLKSIZE - 1) << 4) | ((FS_C1_I0_A0_EP6_BLKNO - 1) << 2) | FS_C1_I0_A0_EP6_TYPE)
-#define FS_C1_I0_A0_EP6_FIFO_MAP (((1 - FS_C1_I0_A0_EP6_DIRECTION) << 4) | EP6)
-#define FS_C1_I0_A0_EP6_MAP (FS_C1_I0_A0_EP6_FIFO_START | (FS_C1_I0_A0_EP6_FIFO_START << 4) | (MASK_F0 >> (4*FS_C1_I0_A0_EP6_DIRECTION)))
-
-
-#define CMD_PCI_RC_RESET_ON() HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)| \
- (PCI_RC_PHY_SHIFT_RESET_BIT|PCI_RC_PLL_RESET_BIT|PCI_RC_PHY_RESET_BIT|PCI_RC_RESET_BIT)))
-
-void vUSBFIFO_EP6Cfg_FS_patch(void)
-{
-#if (FS_C1_I0_A0_EP_NUMBER >= 6)
- int i;
-
- //EP0X06
- mUsbEPMap(EP6, FS_C1_I0_A0_EP6_MAP);
- mUsbFIFOMap(FS_C1_I0_A0_EP6_FIFO_START, FS_C1_I0_A0_EP6_FIFO_MAP);
- mUsbFIFOConfig(FS_C1_I0_A0_EP6_FIFO_START, FS_C1_I0_A0_EP6_FIFO_CONFIG);
-
- for(i = FS_C1_I0_A0_EP6_FIFO_START + 1 ;
- i < FS_C1_I0_A0_EP6_FIFO_START + FS_C1_I0_A0_EP6_FIFO_NO ; i ++)
- {
- mUsbFIFOConfig(i, (FS_C1_I0_A0_EP6_FIFO_CONFIG & (~BIT7)) );
- }
-
- mUsbEPMxPtSzHigh(EP6, FS_C1_I0_A0_EP6_DIRECTION, (FS_C1_I0_A0_EP6_MAX_PACKET & 0x7ff));
- mUsbEPMxPtSzLow(EP6, FS_C1_I0_A0_EP6_DIRECTION, (FS_C1_I0_A0_EP6_MAX_PACKET & 0x7ff));
- mUsbEPinHighBandSet(EP6 , FS_C1_I0_A0_EP6_DIRECTION, FS_C1_I0_A0_EP6_MAX_PACKET);
-#endif
-}
-
-void vUsbFIFO_EPxCfg_FS_patch(void)
-{
- switch (u8UsbConfigValue)
- {
-#if (FS_CONFIGURATION_NUMBER >= 1)
- // Configuration 0X01
- case 0X01:
- switch (u8UsbInterfaceValue)
- {
-#if (FS_C1_INTERFACE_NUMBER >= 1)
- // Interface 0
- case 0:
- switch (u8UsbInterfaceAlternateSetting)
- {
-
-#if (FS_C1_I0_ALT_NUMBER >= 1)
- // AlternateSetting 0
- case 0:
-
- // snapped....
-
- // patch up this ep6_fs config
- vUSBFIFO_EP6Cfg_FS_patch();
-
- break;
-
-#endif
- default:
- break;
- }
- break;
-#endif
- default:
- break;
- }
- break;
-#endif
- default:
- break;
- }
- //mCHECK_STACK();
-}
-
-
-BOOLEAN bSet_configuration_patch(void)
-{
- bSet_configuration();
-
- if (mLOW_BYTE(mDEV_REQ_VALUE()) == 0)
- {
- // snapped....
- ;
- }
- else
- {
- if (mUsbHighSpeedST()) // First judge HS or FS??
- {
- // snapped....
- ;
- }
- else
- {
- // snapped....
- vUsbFIFO_EPxCfg_FS_patch();
- }
-
- // snapped....
- }
-
- eUsbCxFinishAction = ACT_DONE;
- return TRUE;
-}
-
-
-/*
- * -- support more than 64 bytes command on ep3 --
- */
-void vUsb_Status_In_patch(void)
-{
- uint16_t count;
- uint16_t remainder;
- u16_t RegBufLen;
- BOOLEAN cmdEnd = FALSE;
-
- static u16_t mBufLen;
- static VBUF *evntbuf = NULL;
- static volatile u32_t *regaddr;
- static BOOLEAN cmd_is_new = TRUE;
-
- if( cmd_is_new )
- {
- evntbuf = usbFifoConf.get_event_buf();
- if ( evntbuf != NULL )
- {
- regaddr = (u32_t *)VBUF_GET_DATA_ADDR(evntbuf);
- mBufLen = evntbuf->buf_length;
- }
- else
- {
- mUSB_STATUS_IN_INT_DISABLE();
- goto ERR_DONE;
- }
-
- cmd_is_new = FALSE;
- }
-
- if( mBufLen > bUSB_EP_MAX_PKT_SIZE_64 ) {
- RegBufLen = bUSB_EP_MAX_PKT_SIZE_64;
- mBufLen -= bUSB_EP_MAX_PKT_SIZE_64;
- }
- // TODO: 64 byes... controller supposed will take care of zero-length?
- else {
- RegBufLen = mBufLen;
- cmdEnd = TRUE;
- }
-
- /* INT use EP3 */
- for(count = 0; count < (RegBufLen / 4); count++)
- {
- USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, *regaddr);
- regaddr++;
- }
-
- remainder = RegBufLen % 4;
-
- if (remainder)
- {
- switch(remainder)
- {
- case 3:
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x7);
- break;
- case 2:
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x3);
- break;
- case 1:
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- break;
- }
-
- USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, *regaddr);
-
- // Restore CBus FIFO size to word size
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
- }
-
- mUSB_EP3_XFER_DONE();
-
- if ( evntbuf != NULL && cmdEnd )
- {
- usbFifoConf.send_event_done(evntbuf);
- cmd_is_new = TRUE;
- }
-
-ERR_DONE:
- ;
-}
-
-
#define PCI_RC_RESET_BIT BIT6
#define PCI_RC_PHY_RESET_BIT BIT7
#define PCI_RC_PLL_RESET_BIT BIT8
(HAL_WORD_REG_READ(MAGPIE_REG_ETH_PLL_BYPASS_ADDR)&(~(BIT4|BIT0))));
}
+#define CMD_PCI_RC_RESET_ON() HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
+ (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)| \
+ (PCI_RC_PHY_SHIFT_RESET_BIT|PCI_RC_PLL_RESET_BIT|PCI_RC_PHY_RESET_BIT|PCI_RC_RESET_BIT)))
+
static void _fw_restore_dma_fifo(void)
{
HAL_WORD_REG_WRITE(0x5601C, (HAL_WORD_REG_READ(0x5601C)&(~(BIT18))));
extern uint16_t *u8ConfigDescriptorEX;
extern uint16_t *pu8DescriptorEX;
extern uint16_t u16TxRxCounter;
+extern SetupPacket ControlCmd;
extern uint16_t *u8UsbDeviceDescriptor;
uint16_t ConfigDescriptorPatch[30];
- uint16_t UsbDeviceDescriptorPatch[18];
- #define VENDOR_ID_OFFSET 8
- #define PRODUCT_ID_OFFSET 10
+uint16_t UsbDeviceDescriptorPatch[9];
+#define BCD_DEVICE_OFFSET 6
+#define BCD_DEVICE_FW_SIGNATURE 0xffff
+#define VENDOR_ID_OFFSET 4
+#define PRODUCT_ID_OFFSET 5
#define EP3_TRANSFER_TYPE_OFFSET 17
#define EP3_INT_INTERVAL 19
BOOLEAN bGet_descriptor_patch(void)
{
- /* Patch for custom id from flash */
- if (bEepromExist == FALSE && mDEV_REQ_VALUE_HIGH() == 1)
+ if (mDEV_REQ_VALUE_HIGH() == 1)
{
uint8_t *p = (uint8_t *)u8UsbDeviceDescriptor;
uint32_t u32Tmp=0;
/* Copy Usb Device Descriptor */
- memcpy(UsbDeviceDescriptorPatch, p, sizeof(UsbDeviceDescriptorPatch));
-
- A_SFLASH_READ_4B(u32Tmp, FLASH_SIZE - EE_DATA_RESERVED_LEN + FLASH_USB_VENDOR_ID_OFFSET*2);
- UsbDeviceDescriptorPatch[VENDOR_ID_OFFSET] = mSWAP_BYTE(mLOW_WORD0(u32Tmp));
- UsbDeviceDescriptorPatch[PRODUCT_ID_OFFSET] = mSWAP_BYTE(mHIGH_WORD0(u32Tmp));
+ ath_hal_memcpy(UsbDeviceDescriptorPatch, p, sizeof(UsbDeviceDescriptorPatch));
+
+ UsbDeviceDescriptorPatch[BCD_DEVICE_OFFSET] =
+ BCD_DEVICE_FW_SIGNATURE;
+
+ /* Patch for custom id from flash */
+ if (bEepromExist == FALSE) {
+ A_SFLASH_READ_4B(u32Tmp, FLASH_SIZE -
+ EE_DATA_RESERVED_LEN + FLASH_USB_VENDOR_ID_OFFSET*2);
+ UsbDeviceDescriptorPatch[VENDOR_ID_OFFSET] =
+ mSWAP_BYTE(mLOW_WORD0(u32Tmp));
+ UsbDeviceDescriptorPatch[PRODUCT_ID_OFFSET] =
+ mSWAP_BYTE(mHIGH_WORD0(u32Tmp));
+ }
pu8DescriptorEX = UsbDeviceDescriptorPatch;
u16TxRxCounter = mTABLE_LEN(u8UsbDeviceDescriptor[0]);
uint8_t *p = (uint8_t *)u8ConfigDescriptorEX;
/* Copy ConfigDescriptor */
- memcpy(ConfigDescriptorPatch, p, sizeof(ConfigDescriptorPatch));
+ ath_hal_memcpy(ConfigDescriptorPatch, p, sizeof(ConfigDescriptorPatch));
- p = (uint8_t *)ConfigDescriptorPatch;
-
- /* Patch the transfer type of EP3 and EP4 */
- ConfigDescriptorPatch[EP3_TRANSFER_TYPE_OFFSET] = 0x0283;
- ConfigDescriptorPatch[EP3_INT_INTERVAL] = 0x0700;
- ConfigDescriptorPatch[EP4_TRANSFER_TYPE_OFFSET] = 0x4002;
- ConfigDescriptorPatch[EP4_INT_INTERVAL] = 0x00;
+ /* place holder for EPx patches */
switch (mDEV_REQ_VALUE_LOW())
{
}
}
-extern BOOLEAN bStandardCommand(void);
-
-BOOLEAN bStandardCommand_patch(void)
-{
- if (mDEV_REQ_REQ() == USB_SET_CONFIGURATION) {
- A_USB_SET_CONFIG();
-
-#if ENABLE_SWAP_DATA_MODE
- // SWAP FUNCTION should be enabled while DMA engine is not working,
- // the best place to enable it is before we trigger the DMA
- MAGPIE_REG_USB_RX0_SWAP_DATA = 0x1;
- MAGPIE_REG_USB_TX0_SWAP_DATA = 0x1;
-
-#if SYSTEM_MODULE_HP_EP5
- MAGPIE_REG_USB_RX1_SWAP_DATA = 0x1;
-#endif
-
-#if SYSTEM_MODULE_HP_EP6
- MAGPIE_REG_USB_RX2_SWAP_DATA = 0x1;
-#endif
-
-#endif //ENABLE_SWAP_DATA_MODE
- return TRUE;
- }
- else {
- return bStandardCommand();
- }
-}