X-Git-Url: https://jxself.org/git/?p=open-ath9k-htc-firmware.git;a=blobdiff_plain;f=target_firmware%2Fmagpie_fw_dev%2Ftarget%2Frompatch%2Fusb_api_patch.c;h=52c692e3074bd0d834ccd5834c12a7bbcd8b8c69;hp=d01964052b483c617a8ae81d5e45fbfefeac3cb4;hb=ad261bc166a1a1f2723bf6e212feddab450d0d4f;hpb=024df3f6d90e4518e0143d07ddc523bc9b2c6542 diff --git a/target_firmware/magpie_fw_dev/target/rompatch/usb_api_patch.c b/target_firmware/magpie_fw_dev/target/rompatch/usb_api_patch.c index d019640..52c692e 100755 --- a/target_firmware/magpie_fw_dev/target/rompatch/usb_api_patch.c +++ b/target_firmware/magpie_fw_dev/target/rompatch/usb_api_patch.c @@ -46,8 +46,6 @@ #define measure_time 0 #define measure_time_pll 10000000 -typedef void (* USBFIFO_recv_command)(VBUF *cmd); - extern Action eUsbCxFinishAction; extern CommandType eUsbCxCommand; extern BOOLEAN UsbChirpFinish; @@ -55,8 +53,6 @@ extern USB_FIFO_CONFIG usbFifoConf; extern uint16_t *pu8DescriptorEX; extern uint16_t u16TxRxCounter; -USBFIFO_recv_command m_origUsbfifoRecvCmd = NULL; - void zfTurnOffPower_patch(void); static void _fw_reset_dma_fifo(); @@ -67,191 +63,43 @@ static void _fw_power_off(); BOOLEAN bEepromExist = TRUE; BOOLEAN bJumptoFlash = FALSE; -void _fw_usbfifo_recv_command(VBUF *buf) +void _fw_usb_suspend_reboot() { - 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 ) { - // reset usb/wlan dma - _fw_reset_dma_fifo(); - - // restore gpio setting and usb/wlan dma state - _fw_restore_dma_fifo(); + /* reset usb/wlan dma */ + _fw_reset_dma_fifo(); - // set clock to bypass mode - 40Mhz from XTAL - HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_BYPASS_ADDR, (BIT0|BIT4)); + /* restore gpio setting and usb/wlan dma state */ + _fw_restore_dma_fifo(); - A_DELAY_USECS(100); // wait for stable + /* set clock to bypass mode - 40Mhz from XTAL */ + HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_BYPASS_ADDR, (BIT0|BIT4)); - HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_ADDR, (BIT16)); + A_DELAY_USECS(100); /* wait for stable */ - A_DELAY_USECS(100); // wait for stable - A_UART_HWINIT((40*1000*1000), 19200); + HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_ADDR, (BIT16)); - A_CLOCK_INIT(40); + A_DELAY_USECS(100); /* wait for stable */ + A_UART_HWINIT((40*1000*1000), 19200); - if (!bEepromExist) { //jump to flash boot (eeprom data in flash) - bJumptoFlash = TRUE; - A_PRINTF("Jump to Flash BOOT\n"); - app_start(); - }else{ - A_PRINTF("receive the suspend command...\n"); - // reboot..... - A_USB_JUMP_BOOT(); - } + A_CLOCK_INIT(40); + if (!bEepromExist) { /* jump to flash boot (eeprom data in flash) */ + bJumptoFlash = TRUE; + A_PRINTF("Jump to Flash BOOT\n"); + app_start(); } 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; -} - -/* - * -- usb1.1 ep6 fix -- - */ -extern uint16_t u8UsbConfigValue; -extern uint16_t u8UsbInterfaceValue; -extern uint16_t u8UsbInterfaceAlternateSetting; -extern SetupPacket ControlCmd; -extern void vUsbClrEPx(void); - -#undef FS_C1_I0_A0_EP_NUMBER -#define FS_C1_I0_A0_EP_NUMBER 6 - -#define FS_C1_I0_A0_EP6_BLKSIZE BLK512BYTE -#define FS_C1_I0_A0_EP6_BLKNO DOUBLE_BLK -#define FS_C1_I0_A0_EP6_DIRECTION DIRECTION_OUT -#define FS_C1_I0_A0_EP6_TYPE TF_TYPE_BULK -#define FS_C1_I0_A0_EP6_MAX_PACKET 0x0040 -#define FS_C1_I0_A0_EP6_bInterval 00 - -// EP6 -#define FS_C1_I0_A0_EP6_FIFO_START (FS_C1_I0_A0_EP5_FIFO_START + FS_C1_I0_A0_EP5_FIFO_NO) -#define FS_C1_I0_A0_EP6_FIFO_NO (FS_C1_I0_A0_EP6_BLKNO * FS_C1_I0_A0_EP6_BLKSIZE) -#define FS_C1_I0_A0_EP6_FIFO_CONFIG (0x80 | ((FS_C1_I0_A0_EP6_BLKSIZE - 1) << 4) | ((FS_C1_I0_A0_EP6_BLKNO - 1) << 2) | FS_C1_I0_A0_EP6_TYPE) -#define FS_C1_I0_A0_EP6_FIFO_MAP (((1 - FS_C1_I0_A0_EP6_DIRECTION) << 4) | EP6) -#define FS_C1_I0_A0_EP6_MAP (FS_C1_I0_A0_EP6_FIFO_START | (FS_C1_I0_A0_EP6_FIFO_START << 4) | (MASK_F0 >> (4*FS_C1_I0_A0_EP6_DIRECTION))) - - -#define CMD_PCI_RC_RESET_ON() HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \ - (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)| \ - (PCI_RC_PHY_SHIFT_RESET_BIT|PCI_RC_PLL_RESET_BIT|PCI_RC_PHY_RESET_BIT|PCI_RC_RESET_BIT))) - -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)) ); + A_PRINTF("receive the suspend command...\n"); + /* reboot..... */ + A_USB_JUMP_BOOT(); } - 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) -{ - 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; -} - - - #define PCI_RC_RESET_BIT BIT6 #define PCI_RC_PHY_RESET_BIT BIT7 #define PCI_RC_PLL_RESET_BIT BIT8 #define PCI_RC_PHY_SHIFT_RESET_BIT BIT10 - /* * -- urn_off_merlin -- * . values suggested from Lalit @@ -545,6 +393,10 @@ static void _fw_power_on() (HAL_WORD_REG_READ(MAGPIE_REG_ETH_PLL_BYPASS_ADDR)&(~(BIT4|BIT0)))); } +#define CMD_PCI_RC_RESET_ON() HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \ + (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)| \ + (PCI_RC_PHY_SHIFT_RESET_BIT|PCI_RC_PLL_RESET_BIT|PCI_RC_PHY_RESET_BIT|PCI_RC_RESET_BIT))) + static void _fw_restore_dma_fifo(void) { HAL_WORD_REG_WRITE(0x5601C, (HAL_WORD_REG_READ(0x5601C)&(~(BIT18)))); @@ -564,141 +416,3 @@ static void _fw_restore_dma_fifo(void) MAGPIE_REG_USB_RX1_SWAP_DATA = 0x1; MAGPIE_REG_USB_RX2_SWAP_DATA = 0x1; } - -extern uint16_t *u8ConfigDescriptorEX; -extern uint16_t *pu8DescriptorEX; -extern uint16_t u16TxRxCounter; - -extern uint16_t *u8UsbDeviceDescriptor; - -extern BOOLEAN bGet_descriptor(void); - -uint16_t ConfigDescriptorPatch[30]; - -uint16_t UsbDeviceDescriptorPatch[9]; -#define BCD_DEVICE_OFFSET 6 -#define BCD_DEVICE_FW_SIGNATURE 0xffff -#define VENDOR_ID_OFFSET 4 -#define PRODUCT_ID_OFFSET 5 - -#define EP3_TRANSFER_TYPE_OFFSET 17 -#define EP3_INT_INTERVAL 19 -#define EP4_TRANSFER_TYPE_OFFSET 21 -#define EP4_INT_INTERVAL 22 - - - - #define A_SFLASH_READ_4B(u32Data, start_addr) u32Data = *(uint32_t *)(0xf000000+start_addr); - #define FLASH_SIZE 0x800000 //8M - #define FLASH_USB_VENDOR_ID_OFFSET 0x86 - #define FLASH_USB_PRODUCT_ID_OFFSET 0x87 - - // flash reserved size for saving eeprom data is 4K. - #define EE_DATA_RESERVED_LEN 0x1000 //4K - -#define mLOW_MASK(u16) ((uint8_t) ((u16) & mMASK(8))) -#define mHIGH_MASK(u16) ((uint8_t) ((u16) & ~mMASK(8))) - -/* (1234) -> 0034 */ -//#define mLOW_BYTE(u16) ((U_8)(u16)) -#define mLOW_BYTE(u16) mLOW_MASK(u16) -/* (1234) -> 0012 */ -#define mHIGH_BYTE(u16) ((uint8_t) (((uint16_t) (u16)) >> 8)) - -#define mLOW_WORD0(u32) ((uint16_t) ((u32) & 0xFFFF)) -#define mHIGH_WORD0(u32) ((uint16_t) ((u32) >> 16)) - -/* (1234) -> 3412 */ -#define mSWAP_BYTE(u16) ((mLOW_MASK(u16) << 8) | mHIGH_BYTE(u16)) - -BOOLEAN bGet_descriptor_patch(void) -{ - if (mDEV_REQ_VALUE_HIGH() == 1) - { - uint8_t *p = (uint8_t *)u8UsbDeviceDescriptor; - uint32_t u32Tmp=0; - /* Copy Usb Device Descriptor */ - ath_hal_memcpy(UsbDeviceDescriptorPatch, p, sizeof(UsbDeviceDescriptorPatch)); - - UsbDeviceDescriptorPatch[BCD_DEVICE_OFFSET] = - BCD_DEVICE_FW_SIGNATURE; - - /* Patch for custom id from flash */ - if (bEepromExist == FALSE) { - A_SFLASH_READ_4B(u32Tmp, FLASH_SIZE - - EE_DATA_RESERVED_LEN + FLASH_USB_VENDOR_ID_OFFSET*2); - UsbDeviceDescriptorPatch[VENDOR_ID_OFFSET] = - mSWAP_BYTE(mLOW_WORD0(u32Tmp)); - UsbDeviceDescriptorPatch[PRODUCT_ID_OFFSET] = - mSWAP_BYTE(mHIGH_WORD0(u32Tmp)); - } - - pu8DescriptorEX = UsbDeviceDescriptorPatch; - u16TxRxCounter = mTABLE_LEN(u8UsbDeviceDescriptor[0]); - - if (u16TxRxCounter > mDEV_REQ_LENGTH()) - u16TxRxCounter = mDEV_REQ_LENGTH(); - - A_USB_EP0_TX_DATA(); - - //u16TxRxCounter = 18; - return TRUE; - } - if (mDEV_REQ_VALUE_HIGH() == 2) { - uint8_t *p = (uint8_t *)u8ConfigDescriptorEX; - - /* Copy ConfigDescriptor */ - ath_hal_memcpy(ConfigDescriptorPatch, p, sizeof(ConfigDescriptorPatch)); - - /* place holder for EPx patches */ - - 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(); - } -}