X-Git-Url: https://jxself.org/git/?p=open-ath9k-htc-firmware.git;a=blobdiff_plain;f=target_firmware%2Fmagpie_fw_dev%2Ftarget%2Fhif%2Fk2_fw_usb_api.c;h=bc6948d405ff52a9cf252a9d417b27bc5f8146fb;hp=a297c23f7fddeb88a4d729fa330b1ee41e1dbafd;hb=ad261bc166a1a1f2723bf6e212feddab450d0d4f;hpb=1798274027a5393c91efeb7e23ae0493b7e75ba3 diff --git a/target_firmware/magpie_fw_dev/target/hif/k2_fw_usb_api.c b/target_firmware/magpie_fw_dev/target/hif/k2_fw_usb_api.c index a297c23..bc6948d 100755 --- a/target_firmware/magpie_fw_dev/target/hif/k2_fw_usb_api.c +++ b/target_firmware/magpie_fw_dev/target/hif/k2_fw_usb_api.c @@ -44,7 +44,6 @@ #include "sys_cfg.h" -typedef void (* USBFIFO_recv_command)(VBUF *cmd); void _fw_usb_suspend_reboot(); extern Action eUsbCxFinishAction; @@ -52,8 +51,6 @@ extern CommandType eUsbCxCommand; extern BOOLEAN UsbChirpFinish; extern USB_FIFO_CONFIG usbFifoConf; -USBFIFO_recv_command m_origUsbfifoRecvCmd = NULL; - #if SYSTEM_MODULE_USB #define vUsb_ep0end(void) \ { \ @@ -76,30 +73,6 @@ USBFIFO_recv_command m_origUsbfifoRecvCmd = NULL; #define vUsb_resm() USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \ (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&~BIT3)) -void _fw_usbfifo_recv_command(VBUF *buf) -{ - A_UINT8 *cmd_data; - A_UINT32 tmp; - - cmd_data = (A_UINT8 *)(buf->desc_list->buf_addr + buf->desc_list->data_offset); - tmp = *((A_UINT32 *)cmd_data); - if ( tmp == 0xFFFFFFFF ) { - _fw_usb_suspend_reboot(); - } else { - m_origUsbfifoRecvCmd(buf); - } -} - -void _fw_usbfifo_init(USB_FIFO_CONFIG *pConfig) -{ - m_origUsbfifoRecvCmd = pConfig->recv_command; - - usbFifoConf.get_command_buf = pConfig->get_command_buf; - usbFifoConf.recv_command = _fw_usbfifo_recv_command; - usbFifoConf.get_event_buf = pConfig->get_event_buf; - usbFifoConf.send_event_done = pConfig->send_event_done; -} - #define CHECK_SOF_LOOP_CNT 50 void _fw_usb_suspend_reboot() @@ -144,7 +117,7 @@ void _fw_usb_suspend_reboot() //set all GPIO to input gpio_in = HAL_WORD_REG_READ(0x1000404c); - HAL_WORD_REG_WRITE(0x100404c, 0x0); + HAL_WORD_REG_WRITE(0x1000404c, 0x0); //set PU/PD for all GPIO except two UART pins pupd = HAL_WORD_REG_READ(0x10004088); @@ -197,6 +170,7 @@ void _fw_usb_suspend_reboot() HAL_WORD_REG_WRITE( MAGPIE_REG_RST_PWDN_CTRL_ADDR, (BIT1) ); HAL_WORD_REG_WRITE( MAGPIE_REG_RST_PWDN_CTRL_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_RST_PWDN_CTRL_ADDR)|BIT0)); HAL_WORD_REG_WRITE( MAGPIE_REG_RST_PWDN_CTRL_ADDR, 0x0 ); + A_DELAY_USECS(1000); } //A_PRINTF("reg(0x10020)=(%x)\n", HAL_WORD_REG_READ(0x10020)); @@ -353,7 +327,7 @@ void _fw_usb_reset_fifo(void) volatile uint32_t *reg_data; HAL_BYTE_REG_WRITE(0x100ae, (HAL_BYTE_REG_READ(0x100ae)|0x10)); - HAL_BYTE_REG_WRITE(0x100ae, (HAL_BYTE_REG_READ(0x100af)|0x10)); + HAL_BYTE_REG_WRITE(0x100af, (HAL_BYTE_REG_READ(0x100af)|0x10)); // disable ep3 int enable, so that resume back won't send wdt magic pattern out!!! mUSB_STATUS_IN_INT_DISABLE(); @@ -400,379 +374,4 @@ void _fw_usb_reset_fifo(void) HAL_WORD_REG_WRITE(0x50040, (0x200|0|(1>>1)<<12)); A_UART_HWINIT((22*1000*1000), 19200); } - -/* - * -- 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); - - // 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> 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 -- - */ -extern uint16_t u8UsbConfigValue; -extern uint16_t u8UsbInterfaceValue; -extern uint16_t u8UsbInterfaceAlternateSetting; -extern SetupPacket ControlCmd; -extern void vUsbClrEPx(void); - -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) -{ - //A_PRINTF("bSet_configuration...\n\r"); - - 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; - } - - } - -// 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 *u8ConfigDescriptorEX; -extern uint16_t *pu8DescriptorEX; -extern uint16_t u16TxRxCounter; -extern BOOLEAN bGet_descriptor(void); - -uint16_t ConfigDescriptorPatch[30]; - -#define EP3_TRANSFER_TYPE_OFFSET 17 -#define EP3_INT_INTERVAL 19 -#define EP4_TRANSFER_TYPE_OFFSET 21 -#define EP4_INT_INTERVAL 22 - -BOOLEAN bGet_descriptor_patch(void) -{ - if (mDEV_REQ_VALUE_HIGH() == 2) { - uint8_t *p = (uint8_t *)u8ConfigDescriptorEX; - - /* Copy ConfigDescriptor */ - 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; - - switch (mDEV_REQ_VALUE_LOW()) - { - case 0x00: // configuration no: 0 - pu8DescriptorEX = ConfigDescriptorPatch; - u16TxRxCounter = ConfigDescriptorPatch[1]; - //u16TxRxCounter = 46; - break; - default: - return FALSE; - } - - if (u16TxRxCounter > mDEV_REQ_LENGTH()) - u16TxRxCounter = mDEV_REQ_LENGTH(); - - A_USB_EP0_TX_DATA(); - return TRUE; - } - else { - return bGet_descriptor(); - } -} - -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(); - } -} - -#endif - -