A_UART_HWINIT((22*1000*1000), 19200);
}
-void cold_reboot(void)
-{
- A_PRINTF("Cold reboot initiated.");
-#if defined(PROJECT_MAGPIE)
- HAL_WORD_REG_WRITE(WATCH_DOG_MAGIC_PATTERN_ADDR, 0);
-#elif defined(PROJECT_K2)
- HAL_WORD_REG_WRITE(MAGPIE_REG_RST_STATUS_ADDR, 0);
-#endif /* #if defined(PROJECT_MAGPIE) */
- A_USB_JUMP_BOOT();
-}
-
-/*
- * -- 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; // = (volatile uint32_t *) ZM_CMD_BUFFER;
- 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);
- if (usbfifolen > 0x40) {
- 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();
- 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<bUSB_EP_MAX_PKT_SIZE_64 ) {
- cmd_is_last = TRUE;
- }
-
- // accumulate the size
- cmdLen += usbfifolen;
- if (cmdLen > buf->desc_list->buf_size) {
- A_PRINTF("Data length on EP4 FIFO is bigger as allocated buffer data!"
- " Drop it!\n");
- goto ERR;
- }
-
- // round it to alignment
- if(usbfifolen % 4)
- usbfifolen = (usbfifolen >> 2) + 1;
- else
- usbfifolen = usbfifolen >> 2;
-
-// A_PRINTF("copy data out from fifo to - %p\n\r", regaddr);
- // 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 --
*/
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;
ath_hal_memcpy(ConfigDescriptorPatch,
u8ConfigDescriptorEX, sizeof(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())
{