#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;
extern uint16_t *pu8DescriptorEX;
extern uint16_t u16TxRxCounter;
-USBFIFO_recv_command m_origUsbfifoRecvCmd = NULL;
-
void zfTurnOffPower_patch(void);
static void _fw_reset_dma_fifo();
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
(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))));
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();
- }
-}