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;
- }
-
- }
-
-// if( mBufLen>bUSB_EP_MAX_PKT_SIZE_64 )
-// A_PRINTF("EP3 send %d bytes to host \n", mBufLen);
-
-// while(1)
- {
- 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( mBufLen<=bUSB_EP_MAX_PKT_SIZE_64 )
-// break;
- }
-
- if ( evntbuf != NULL && cmdEnd )
- {
- usbFifoConf.send_event_done(evntbuf);
- cmd_is_new = TRUE;
- }
-
-ERR_DONE:
- ;
-}
-
extern uint16_t *u8UsbDeviceDescriptor;
extern uint16_t *u8ConfigDescriptorEX;
extern uint16_t *pu8DescriptorEX;
A_USB_JUMP_BOOT();
}
+/*
+ * support more than 64 bytes command on ep3
+ */
+void usb_status_in_patch(void)
+{
+ uint16_t count;
+ uint16_t remainder;
+ uint16_t reg_buf_len;
+ static uint16_t buf_len;
+ static VBUF *evntbuf = NULL;
+ static volatile uint32_t *regaddr;
+ static BOOLEAN cmd_is_new = TRUE;
+ BOOLEAN cmd_end = FALSE;
+
+ if (cmd_is_new) {
+ evntbuf = usbFifoConf.get_event_buf();
+ if (evntbuf != NULL) {
+ regaddr = (uint32_t *)VBUF_GET_DATA_ADDR(evntbuf);
+ buf_len = evntbuf->buf_length;
+ } else {
+ mUSB_STATUS_IN_INT_DISABLE();
+ return;
+ }
+
+ cmd_is_new = FALSE;
+ }
+
+ if (buf_len > USB_EP3_MAX_PKT_SIZE) {
+ reg_buf_len = USB_EP3_MAX_PKT_SIZE;
+ buf_len -= USB_EP3_MAX_PKT_SIZE;
+ }
+ /* TODO: 64 bytes...
+ * controller supposed will take care of zero-length? */
+ else {
+ reg_buf_len = buf_len;
+ cmd_end = TRUE;
+ }
+
+ /* INT use EP3 */
+ for (count = 0; count < (reg_buf_len / 4); count++)
+ {
+ USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, *regaddr);
+ regaddr++;
+ }
+
+ remainder = reg_buf_len % 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 && cmd_end) {
+ usbFifoConf.send_event_done(evntbuf);
+ cmd_is_new = TRUE;
+ }
+}
+
/*
* support more than 64 bytes command on ep4
*/
extern void _HIFusb_isr_handler_patch(hif_handle_t h);
extern BOOLEAN bSet_configuration_patch(void);
extern void vUSBFIFO_EP6Cfg_FS_patch(void);
-extern void vUsb_Status_In_patch(void);
+extern void usb_status_in_patch(void);
extern void _fw_usbfifo_init(USB_FIFO_CONFIG *pConfig);
extern void zfTurnOffPower_patch(void);
extern void zfResetUSBFIFO_patch(void);
_indir_tbl.cmnos.usb._usb_reg_out = usb_reg_out_patch;
_indir_tbl.hif._isr_handler = _HIFusb_isr_handler_patch;
_indir_tbl.cmnos.usb._usb_set_configuration = bSet_configuration_patch;
- _indir_tbl.cmnos.usb._usb_status_in = vUsb_Status_In_patch;
+ _indir_tbl.cmnos.usb._usb_status_in = usb_status_in_patch;
_indir_tbl.cmnos.usb._usb_get_descriptor = bGet_descriptor_patch;
_indir_tbl.cmnos.usb._usb_standard_cmd = bStandardCommand_patch;
_indir_tbl.usbfifo_api._init = _fw_usbfifo_init;
}
-/*
- * -- 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