X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=target_firmware%2Fmagpie_fw_dev%2Ftarget%2Frompatch%2Fusb_api_patch.c;h=b95fce7a566e7b530c17253697c35c3f98c41a86;hb=75734d969120c0f5c9b532913032d3f2e88583a9;hp=c0747e4b168549c34e209a6891de74d0db3c713e;hpb=8804cc94e3b66550797279f540b960d18a78421f;p=open-ath9k-htc-firmware.git 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 c0747e4..b95fce7 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 @@ -1,3 +1,37 @@ +/* + * Copyright (c) 2013 Qualcomm Atheros, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted (subject to the limitations in the + * disclaimer below) provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * * Neither the name of Qualcomm Atheros nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE + * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT + * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ #include "usb_defs.h" #include "usb_type.h" #include "usb_pre.h" @@ -84,308 +118,6 @@ void _fw_usbfifo_init(USB_FIFO_CONFIG *pConfig) usbFifoConf.send_event_done = pConfig->send_event_done; } -/* - * -- 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(); - ; -} - - -/* - * -- 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)) ); - } - - 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; -} - - -/* - * -- 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; - } - - cmd_is_new = FALSE; - } - - 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 ( evntbuf != NULL && cmdEnd ) - { - usbFifoConf.send_event_done(evntbuf); - cmd_is_new = TRUE; - } - -ERR_DONE: - ; -} - - #define PCI_RC_RESET_BIT BIT6 #define PCI_RC_PHY_RESET_BIT BIT7 #define PCI_RC_PLL_RESET_BIT BIT8 @@ -400,7 +132,6 @@ ERR_DONE: static void turn_off_merlin() { volatile uint32_t default_data[9]; - volatile uint32_t read_data = 0; uint32_t i=0; if(1) @@ -519,7 +250,6 @@ volatile uint32_t gpio = 0x0; */ void zfTurnOffPower_patch(void) { - uint32_t i=0; A_PRINTF("+++ goto suspend ......\n"); // setting the go suspend here, power down right away... @@ -571,8 +301,6 @@ void zfResetUSBFIFO_patch(void) static void _fw_reset_dma_fifo() { - int i; - HAL_BYTE_REG_WRITE(0x100ae, (HAL_BYTE_REG_READ(0x100ae)|0x10)); HAL_BYTE_REG_WRITE(0x100ae, (HAL_BYTE_REG_READ(0x100af)|0x10)); A_PRINTF("_fw_reset_dma_fifo\n"); @@ -689,6 +417,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)))); @@ -712,6 +444,7 @@ static void _fw_restore_dma_fifo(void) extern uint16_t *u8ConfigDescriptorEX; extern uint16_t *pu8DescriptorEX; extern uint16_t u16TxRxCounter; +extern SetupPacket ControlCmd; extern uint16_t *u8UsbDeviceDescriptor; @@ -719,9 +452,11 @@ extern BOOLEAN bGet_descriptor(void); uint16_t ConfigDescriptorPatch[30]; - uint16_t UsbDeviceDescriptorPatch[18]; - #define VENDOR_ID_OFFSET 8 - #define PRODUCT_ID_OFFSET 10 +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 @@ -755,17 +490,25 @@ uint16_t ConfigDescriptorPatch[30]; BOOLEAN bGet_descriptor_patch(void) { - /* Patch for custom id from flash */ - if (bEepromExist == FALSE && mDEV_REQ_VALUE_HIGH() == 1) + if (mDEV_REQ_VALUE_HIGH() == 1) { uint8_t *p = (uint8_t *)u8UsbDeviceDescriptor; uint32_t u32Tmp=0; /* Copy Usb Device Descriptor */ - memcpy(UsbDeviceDescriptorPatch, p, sizeof(UsbDeviceDescriptorPatch)); - - 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)); + 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]); @@ -782,15 +525,9 @@ BOOLEAN bGet_descriptor_patch(void) uint8_t *p = (uint8_t *)u8ConfigDescriptorEX; /* Copy ConfigDescriptor */ - memcpy(ConfigDescriptorPatch, p, sizeof(ConfigDescriptorPatch)); - - p = (uint8_t *)ConfigDescriptorPatch; + ath_hal_memcpy(ConfigDescriptorPatch, p, 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()) { @@ -814,31 +551,3 @@ BOOLEAN bGet_descriptor_patch(void) } } -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(); - } -}