X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=target_firmware%2Fmagpie_fw_dev%2Ftarget%2Fhif%2Fk2_fw_usb_api.c;h=4aceaef06573d83820816cec221f0672cea5c709;hb=a595388aceac29334b75c1fd83b074991897cc54;hp=47aa3804c87df0c5134f96f3cadabe2e5c41cd7e;hpb=2a38076807b9fac0fe6cedcdcc213c10a8658910;p=open-ath9k-htc-firmware.git 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 47aa380..4aceaef 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 @@ -144,7 +144,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 +197,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 +354,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(); @@ -401,100 +402,6 @@ void _fw_usb_reset_fifo(void) 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 -- */ @@ -694,13 +601,18 @@ ERR_DONE: ; } +extern uint16_t *u8UsbDeviceDescriptor; extern uint16_t *u8ConfigDescriptorEX; extern uint16_t *pu8DescriptorEX; extern uint16_t u16TxRxCounter; extern BOOLEAN bGet_descriptor(void); +uint16_t DeviceDescriptorPatch[9]; uint16_t ConfigDescriptorPatch[30]; + +#define BCD_DEVICE 6 +#define BCD_DEVICE_FW_SIGNATURE 0xffff #define EP3_TRANSFER_TYPE_OFFSET 17 #define EP3_INT_INTERVAL 19 #define EP4_TRANSFER_TYPE_OFFSET 21 @@ -708,19 +620,23 @@ uint16_t ConfigDescriptorPatch[30]; BOOLEAN bGet_descriptor_patch(void) { - if (mDEV_REQ_VALUE_HIGH() == 2) { - uint8_t *p = (uint8_t *)u8ConfigDescriptorEX; + int i; + switch (mDEV_REQ_VALUE_HIGH()) { + case 1: + ath_hal_memcpy(DeviceDescriptorPatch, + u8UsbDeviceDescriptor, sizeof(DeviceDescriptorPatch)); - /* Copy ConfigDescriptor */ - ath_hal_memcpy(ConfigDescriptorPatch, p, sizeof(ConfigDescriptorPatch)); + DeviceDescriptorPatch[BCD_DEVICE] = BCD_DEVICE_FW_SIGNATURE; - p = (uint8_t *)ConfigDescriptorPatch; + pu8DescriptorEX = DeviceDescriptorPatch; + u16TxRxCounter = mTABLE_LEN(DeviceDescriptorPatch[0]); + break; + case 2: + /* Copy ConfigDescriptor */ + 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()) { @@ -732,16 +648,16 @@ BOOLEAN bGet_descriptor_patch(void) default: return FALSE; } - - if (u16TxRxCounter > mDEV_REQ_LENGTH()) - u16TxRxCounter = mDEV_REQ_LENGTH(); - - A_USB_EP0_TX_DATA(); - return TRUE; - } - else { + break; + default: return bGet_descriptor(); } + + if (u16TxRxCounter > mDEV_REQ_LENGTH()) + u16TxRxCounter = mDEV_REQ_LENGTH(); + + A_USB_EP0_TX_DATA(); + return TRUE; } extern BOOLEAN bStandardCommand(void);