-/*
- * -- 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();
- ;
-}
-
-