From a595388aceac29334b75c1fd83b074991897cc54 Mon Sep 17 00:00:00 2001 From: Oleksij Rempel Date: Fri, 27 Sep 2013 23:50:17 +0200 Subject: [PATCH] hif/usb_api: remove dup code - usb_reg_out_patch Signed-off-by: Oleksij Rempel --- target_firmware/CMakeLists.txt | 1 + .../magpie_fw_dev/target/hif/k2_fw_usb_api.c | 114 ---------------- .../target/hif/usb_api_main_patch.c | 127 ++++++++++++++++++ .../magpie_fw_dev/target/init/app_start.c | 4 +- .../target/rompatch/usb_api_patch.c | 90 ------------- 5 files changed, 130 insertions(+), 206 deletions(-) create mode 100644 target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c diff --git a/target_firmware/CMakeLists.txt b/target_firmware/CMakeLists.txt index 193399e..7d26640 100644 --- a/target_firmware/CMakeLists.txt +++ b/target_firmware/CMakeLists.txt @@ -27,6 +27,7 @@ SET(SOURCES magpie_fw_dev/target/buf_pool/buf_pool_static.c magpie_fw_dev/target/cmnos/dbg_api.c magpie_fw_dev/target/cmnos/cmnos_sflash.c + magpie_fw_dev/target/hif/usb_api_main_patch.c wlan/ah.c wlan/ah_osdep.c wlan/ar5416Phy.c 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 7d4c4ff..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 @@ -402,120 +402,6 @@ void _fw_usb_reset_fifo(void) 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 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 -- */ diff --git a/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c b/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c new file mode 100644 index 0000000..5daf176 --- /dev/null +++ b/target_firmware/magpie_fw_dev/target/hif/usb_api_main_patch.c @@ -0,0 +1,127 @@ + +#include "usb_defs.h" +#include "usb_type.h" +#include "usb_pre.h" +#include "usb_extr.h" +#include "usb_std.h" +#include "reg_defs.h" +#include "athos_api.h" +#include "usbfifo_api.h" + +#include "sys_cfg.h" + +#define USB_EP4_MAX_PKT_SIZE bUSB_EP_MAX_PKT_SIZE_64 +#define USB_EP3_MAX_PKT_SIZE bUSB_EP_MAX_PKT_SIZE_64 + +extern USB_FIFO_CONFIG usbFifoConf; + +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 usb_reg_out_patch(void) +{ + uint16_t usbfifolen; + uint16_t ii; + uint32_t ep4_data; + static volatile uint32_t *regaddr; + static uint16_t cmd_len; + 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 > USB_EP4_MAX_PKT_SIZE) { + 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(); + cmd_len = 0; + + if(!buf) { + A_PRINTF("%s: Filed to get new buffer.\n", __func__); + 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 < USB_EP4_MAX_PKT_SIZE) + cmd_is_last = TRUE; + + /* accumulate the size */ + cmd_len += usbfifolen; + + if (cmd_len > buf->desc_list->buf_size) { + A_PRINTF("%s: Data length on EP4 FIFO is bigger as " + "allocated buffer data! Drop it!\n", __func__); + goto err; + } + + /* 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++) { + /* read fifo data out */ + ep4_data = USB_WORD_REG_READ(ZM_EP4_DATA_OFFSET); + *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 = cmd_len; + buf->desc_list->control = 0; + buf->next_buf = NULL; + buf->buf_length = cmd_len; + + 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); + +done: + /* mUSB_STATUS_IN_INT_ENABLE(); */ + ; +} + diff --git a/target_firmware/magpie_fw_dev/target/init/app_start.c b/target_firmware/magpie_fw_dev/target/init/app_start.c index 4b55152..39898c8 100644 --- a/target_firmware/magpie_fw_dev/target/init/app_start.c +++ b/target_firmware/magpie_fw_dev/target/init/app_start.c @@ -44,7 +44,7 @@ #define ALLOCRAM_SIZE ( SYS_RAM_SZIE - ( ALLOCRAM_START - SYS_D_RAM_REGION_0_BASE) - SYS_D_RAM_STACK_SIZE) // support for more than 64 bytes on command pipe -extern void vUsb_Reg_Out_patch(void); +extern void usb_reg_out_patch(void); extern int _HIFusb_get_max_msg_len_patch(hif_handle_t handle, int pipe); extern void _HIFusb_isr_handler_patch(hif_handle_t h); extern BOOLEAN bSet_configuration_patch(void); @@ -187,7 +187,7 @@ void app_start() if( hostif == HIF_USB ) { _indir_tbl.hif._get_max_msg_len = _HIFusb_get_max_msg_len_patch; - _indir_tbl.cmnos.usb._usb_reg_out = vUsb_Reg_Out_patch; + _indir_tbl.cmnos.usb._usb_reg_out = usb_reg_out_patch; _indir_tbl.hif._isr_handler = _HIFusb_isr_handler_patch; _indir_tbl.cmnos.usb._usb_set_configuration = bSet_configuration_patch; _indir_tbl.cmnos.usb._usb_status_in = vUsb_Status_In_patch; 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 542a715..d952c7c 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 @@ -118,96 +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 -- */ -- 2.31.1