/* * support more than 64 bytes command on ep4 */ void usb_reg_out_patch(void) { uint16_t usbfifolen; uint16_t ii; uint32_t ep4_data; static volatile uint32_t *regaddr; static uint16_t cmd_len; 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); if (usbfifolen > USB_EP4_MAX_PKT_SIZE) { A_PRINTF("EP4 FIFO Bug? Buffer is too big: %x\n", usbfifolen); cold_reboot(); } /* check is command is new */ if(cmd_is_new) { buf = usbFifoConf.get_command_buf(); cmd_len = 0; if(!buf) { A_PRINTF("%s: Filed to get new buffer.\n", __func__); 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 < USB_EP4_MAX_PKT_SIZE) cmd_is_last = TRUE; /* accumulate the size */ cmd_len += usbfifolen; if (cmd_len > buf->desc_list->buf_size) { A_PRINTF("%s: Data length on EP4 FIFO is bigger as " "allocated buffer data! Drop it!\n", __func__); goto err; } /* round it to alignment */ if(usbfifolen % 4) usbfifolen = (usbfifolen >> 2) + 1; else
/* * -- 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