+++ /dev/null
-#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"
-
-#if SYSTEM_MODULE_USB
-
-#define CMD_GET_CUSTOM_DATA 4
-LOCAL void flash_read(uint16_t len, uint16_t ofset);
-
-SetupPacket ControlCmd;
-USB_FIFO_CONFIG usbFifoConf;
-uint32_t fwCheckSum = 0;
-
-#define fBUS_POWER 1
-uint16_t UsbStatus[3];
-
-/* Variable for USB EP0 pipe (USB.c) */
-uint16_t *pu8DescriptorEX;
-uint16_t u16TxRxCounter;
-uint16_t *u8ConfigDescriptorEX;
-//extern BOOLEAN bUsbEP0HaltSt;
-Action eUsbCxFinishAction;
-CommandType eUsbCxCommand;
-BOOLEAN UsbChirpFinish;
-
-uint16_t u8UsbConfigValue;
-uint16_t u8UsbInterfaceValue;
-uint16_t u8UsbInterfaceAlternateSetting;
-uint16_t u16FirmwareComplete;
-
-extern uint16_t *UsbDeviceDescriptor;
-extern uint16_t *String00Descriptor;
-extern uint16_t *String10Descriptor;
-extern uint16_t *String20Descriptor;
-extern uint16_t *String30Descriptor;
-
-/////////////////////////////////////////////////
-// should be declared as extern array not pointer
-extern uint16_t u8DeviceQualifierDescriptorEX[];
-extern uint16_t u8OtherSpeedConfigDescriptorEX[];
-
-uint16_t *u8UsbDeviceDescriptor;
-uint16_t *u8String00Descriptor;
-uint16_t *u8String10Descriptor;
-uint16_t *u8String20Descriptor;
-uint16_t *u8String30Descriptor;
-
-
-#if 0 // use macro instead of function
-void mUsbEPinRsTgSet(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg |= BIT4;
- USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT4));
-
-}
-
-void mUsbEPinRsTgClr(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg &= ~BIT4;
- USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&(~BIT4)));
-}
-
-void mUsbEPoutRsTgSet(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg |= BIT4;
- USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT4));
-}
-
-void mUsbEPoutRsTgClr(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg &= ~BIT4;
- USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&(~BIT4)));
-}
-
-void mUsbEPinStallSet(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg |= BIT3;
- USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT3);
-}
-
-void mUsbEPinStallClr(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg &= ~BIT3;
-
- USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&(~BIT3)));
-}
-
-void mUsbEPoutStallSet(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg |= BIT3;
- USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT3));
-}
-
-void mUsbEPoutStallClr(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //*reg &= ~BIT3;
- USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- (USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&(~BIT3)));
-}
-
-uint8_t mUsbEPinStallST(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //return ((*reg & BIT3) >> 3);
- return ((USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))& BIT3) >> 3);
-}
-
-uint8_t mUsbEPoutStallST(uint8_t u8ep)
-{
- //uint8_t* reg = (uint8_t*) (ZM_FUSB_BASE+ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1));
- //return ((*reg & BIT3) >> 3);
- return ((USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))& BIT3) >> 3);
-}
-
-uint8_t mUsbEPMapRd(uint8_t EPn)
-{
- //uint8_t *reg = (uint8_t*) (ZM_FUSB_BASE+0x30+(EPn-1));
- //return *reg;
- return (USB_BYTE_REG_READ((0x30+(EPn-1))));
-}
-
-uint8_t mUsbFIFOCfgRd(uint8_t FIFOn)
-{
- //uint8_t *reg = (uint8_t*) (ZM_FUSB_BASE+0x90+FIFOn);
- //return *reg;
- return (USB_BYTE_REG_READ((0x90+FIFOn)));
-}
-
-void vUsb_Data_Out0Byte(void)
-{
- //ZM_INTR_SOURCE_7_REG &= ~BIT7;
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_REG, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_REG&(~BIT7))));
-}
-
-
-void vUsb_Data_In0Byte(void)
-{
- //ZM_INTR_SOURCE_7_REG &= ~BIT6;
-
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_REG, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_REG&(~BIT6))));
-}
-
-
-/***********************************************************************/
-// vUsb_ep0end()
-// Description:
-// 1. End this transfer.
-// input: none
-// output: none
-/***********************************************************************/
-void vUsb_ep0end(void)
-{
- eUsbCxCommand = CMD_VOID;
- //ZM_CX_CONFIG_STATUS_REG = 0x01;
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x01);
- //mUsbEP0DoneSet(); // Return EP0_Done flag
-}
-
-/***********************************************************************/
-// vUsb_ep0fail()
-// Description:
-// 1. Stall this transfer.
-// input: none
-// output: none
-/***********************************************************************/
-void vUsb_ep0fail(void)
-{
- //ZM_CX_CONFIG_STATUS_REG = 0x04;
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x04);
- //mUsbEP0StallSet(); // Return EP0_Stall
-}
-
-
-/***********************************************************************/
-// vUsb_rst()
-// Description:
-// 1. Change descriptor table (High or Full speed).
-// input: none
-// output: none
-/***********************************************************************/
-void vUsb_rst(void)
-{
-// zfUartSendStr((uint8_t *) "vUsb_rst\r\n");
- //ZM_INTR_SOURCE_7_REG &= ~0x02;
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&(~BIT1)));
- UsbChirpFinish = FALSE;
-}
-
-/***********************************************************************/
-// vUsb_suspend()
-// Description:
-// 1. .
-// input: none
-// output: none
-/***********************************************************************/
-void vUsb_suspend(void)
-{
-// uP must do-over everything it should handle
-// and do before into the suspend mode
- //mUsbIntSuspClr(); // Go Suspend status
- //ZM_INTR_SOURCE_7_REG &= ~0x04;
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&(~BIT2)));
-}
-
-/***********************************************************************/
-// vUsb_resm()
-// Description:
-// 1. Change descriptor table (High or Full speed).
-// input: none
-// output: none
-/***********************************************************************/
-void vUsb_resm(void)
-{
-// uP must do-over everything it should handle
-// and do before into the suspend mode
-
-// mUsbIntResmClr(); // uP must wakeup immediately
- //ZM_INTR_SOURCE_7_REG &= ~0x08;
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&(~BIT3)));
-}
-
-#else
-
-#define mUsbEPinRsTgSet(u8ep) USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT4)
-
-#define mUsbEPinRsTgClr(u8ep) USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&~BIT4)
-
-#define mUsbEPoutRsTgSet(u8ep) USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT4)
-
-#define mUsbEPoutRsTgClr(u8ep) USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&~BIT4)
-
-#define mUsbEPinStallSet(u8ep) USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT3)
-
-#define mUsbEPinStallClr(u8ep) USB_BYTE_REG_WRITE((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&~BIT3)
-
-#define mUsbEPoutStallSet(u8ep) USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))|BIT3)
-
-#define mUsbEPoutStallClr(u8ep) USB_BYTE_REG_WRITE((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)), \
- USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))&~BIT3)
-
-#define mUsbEPinStallST(u8ep) ((USB_BYTE_REG_READ((ZM_EP_IN_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))& BIT3) >> 3)
-
-#define mUsbEPoutStallST(u8ep) ((USB_BYTE_REG_READ((ZM_EP_OUT_MAX_SIZE_HIGH_OFFSET+(u8ep << 1)))& BIT3) >> 3)
-
-#define mUsbEPMapRd(EPn) (USB_BYTE_REG_READ((0x30+(EPn-1))))
-
-#define mUsbFIFOCfgRd(FIFOn) (USB_BYTE_REG_READ((0x90+FIFOn)))
-
-#define vUsb_Data_Out0Byte(void) USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_REG, \
- USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_REG&~BIT7))
-
-
-#define vUsb_Data_In0Byte(void) USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_REG, \
- USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_REG&~BIT6))
-
-#define vUsb_ep0end(void) \
-{ \
- eUsbCxCommand = CMD_VOID; \
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x01); \
-}
-
-#define vUsb_ep0fail(void) USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x04)
-
-#define vUsb_rst() \
-{ \
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&~BIT1)); \
- UsbChirpFinish = FALSE; \
-}
-
-#define vUsb_suspend() USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&~BIT2))
-
-#define vUsb_resm() USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, \
- (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&~BIT3))
-
-
-#endif
-
-LOCAL void flash_read_data(void)
-{
- uint8_t u8temp;
-
- // to keep tracking the txrx fifo
- // max 64 bytes for transmission one time,
- if (u16TxRxCounter < EP0MAXPACKETSIZE)
- u8temp = (uint8_t) u16TxRxCounter;
- else
- u8temp = EP0MAXPACKETSIZE;
-
- u16TxRxCounter -= (uint16_t) u8temp;
-
- {
- register uint8_t u8count;
- uint8_t remainder;
-
- for (u8count = 0; u8count < (u8temp/4); u8count ++)
- {
- uint32_t ep0_data;
- uint16_t ep0_low;
- uint16_t ep0_high;
-
- // pack data into word size
- ep0_low = *pu8DescriptorEX++;
- ep0_high = *pu8DescriptorEX++;
-
- // composed the data as a word
- ep0_data = (ep0_high << 16) + ep0_low;
-
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- }
-
- remainder = u8temp % 4;
-
- // Check whether there are data needed to be filled into the FIFO
- if (remainder == 3)
- {
- uint32_t ep0_data;
- uint16_t ep0_low;
- uint16_t ep0_high;
-
- // pack data into word size
- ep0_low = *pu8DescriptorEX++;
- ep0_high = *pu8DescriptorEX++;
-
- ep0_data = (ep0_high << 16) + ep0_low;
-
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x7);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- }
- else if (remainder == 2)
- {
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x3);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, *pu8DescriptorEX);
- }
- else if (remainder == 1)
- {
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, *pu8DescriptorEX);
- }
-
- // Restore CBus FIFO size to word size
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xf);
- }
-
- // end of the data stage
- if (u16TxRxCounter == 0)
- {
- eUsbCxCommand = CMD_VOID;
- eUsbCxFinishAction = ACT_DONE;
- }
-}
-
-/***********************************************************************/
-// vUsb_ep0tx()
-// Description:
-// 1. Transmit data to EP0 FIFO.
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL void vUsb_ep0tx(void)
-{
- switch (eUsbCxCommand)
- {
- case CMD_GET_DESCRIPTOR:
- A_USB_EP0_TX_DATA();
- break;
-
- default:
- /* Mark endpoint STALL */
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT6);
-
- break;
- }
-
-// eUsbCxFinishAction = ACT_IDLE;
-}
-
-
-/***********************************************************************/
-// vUsb_ep0rx()
-// Description:
-// 1. Receive data from EP0 FIFO.
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL void vUsb_ep0rx(void)
-{
-
- switch (eUsbCxCommand)
- {
- case CMD_SET_DESCRIPTOR:
- A_USB_EP0_RX_DATA();
- break;
- default:
- //mUsbEP0StallSet();
- break;
- }
-
- if (u16TxRxCounter != 0)
- eUsbCxFinishAction = ACT_IDLE;
-}
-
-
-LOCAL void vUsbClrEPx(void)
-{
- uint8_t u8ep;
-
- // Clear All EPx Toggle Bit
- for (u8ep = 1; u8ep <= FUSB200_MAX_EP; u8ep ++)
- {
- mUsbEPinRsTgSet(u8ep);
- mUsbEPinRsTgClr(u8ep);
- }
- for (u8ep = 1; u8ep <= FUSB200_MAX_EP; u8ep ++)
- {
- mUsbEPoutRsTgSet(u8ep);
- mUsbEPoutRsTgClr(u8ep);
- }
-}
-
-
-/***********************************************************************/
-// bGet_status()
-// Description:
-// 1. Send 2 bytes status to host.
-// input: none
-// output: TRUE or FALSE (BOOLEAN)
-/***********************************************************************/
-LOCAL BOOLEAN bGet_status(void)
-{
- uint8_t RecipientStatusLow;
-
- RecipientStatusLow = UsbStatus[mDEV_REQ_REQ_RECI() & 0x0F];
-
- //ZM_CBUS_FIFO_SIZE_REG = 0x3;
- //ZM_EP0_DATA_REG = RecipientStatusLow;
-
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x3);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, RecipientStatusLow);
-
- // Restore CBus FIFO size to word size
- //ZM_CBUS_FIFO_SIZE_REG = 0xf;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xf);
-
- eUsbCxFinishAction = ACT_DONE;
- return TRUE;
-}
-
-/***********************************************************************/
-// bClear_feature()
-// Description:
-// 1. Send 2 bytes status to host.
-// input: none
-// output: TRUE or FALSE (BOOLEAN)
-/***********************************************************************/
-LOCAL BOOLEAN bClear_feature(void)
-{
- if (mDEV_REQ_VALUE() > cUSB_FEATSEL_END)
- return FALSE;
-
- if ((mDEV_REQ_VALUE() == 0) && (mDEV_REQ_REQ_RECI() != cUSB_REQTYPE_ENDPOINT))
- return FALSE;
-
- UsbStatus[2] = 0;
- eUsbCxFinishAction = ACT_DONE;
-
- return TRUE;
-}
-
-/***********************************************************************/
-// bSet_feature()
-// Description:
-// 1. Send 2 bytes status to host.
-// input: none
-// output: TRUE or FALSE (BOOLEAN)
-/***********************************************************************/
-#if ZM_SELF_TEST_MODE
-
-#define TEST_J 0x02
-#define TEST_K 0x04
-#define TEST_SE0_NAK 0x08
-#define TEST_PKY 0x10
-
-uint16_t TestPatn0[] = { TEST_J, TEST_K, TEST_SE0_NAK };
-uint32_t TestPatn1[] = {
- 0x00000000, 0x00000000, 0xAA00AA00, // JKJKJKJK x 9
- 0xAAAAAAAA, 0xEEAAAAAA, // AA x 8
- 0xEEEEEEEE, 0xFEEEEEEE, // EE x 8
- 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, // FF x 11
- 0xF7EFDFBF, 0x7EFCFDFB, 0xFDFBDFBF};
-
-#endif
-LOCAL BOOLEAN bSet_feature(void)
-{
-
- //A_PRINTF("bSet_feature...\n\r");
-
- switch (mDEV_REQ_VALUE()) // FeatureSelector
- {
- case 0: // ENDPOINT_HALE
- // AVM Patch:
- // always check RECEIPIENT
- if (mDEV_REQ_REQ_RECI() == cUSB_REQTYPE_ENDPOINT)
- {
- eUsbCxFinishAction = ACT_DONE;
- }
- else
- {
- return FALSE;
- }
-
- break;
-
- case 1 : // Device Remote Wakeup
- // Set "Device_Remote_Wakeup", Turn on the"RMWKUP" bit in Mode Register
- mUsbRmWkupSet();
- //USB_BYTE_REG_WRITE(ZM_MAIN_CTRL_OFFSET, USB_BYTE_REG_READ(ZM_MAIN_CTRL_OFFSET)|BIT0);
- eUsbCxFinishAction = ACT_DONE;
- break;
-
- #if ZM_SELF_TEST_MODE
- case 2 : // Test Mode
- // ii = mDEV_REQ_INDEX() >> 8;
- // switch (ii) // TestSelector
- switch (mDEV_REQ_INDEX() >> 8) // TestSelector
- {
- case 0x1: // Test_J
- case 0x2: // Test_K
- case 0x3: // TEST_SE0_NAK
- // mUsbTsMdWr(TestPatn0[(mDEV_REQ_INDEX() >> 8) - 1]);
- //ZM_PHY_TEST_SELECT_REG = TestPatn0[(mDEV_REQ_INDEX() >> 8) - 1];
- USB_BYTE_REG_WRITE(ZM_PHY_TEST_SELECT_OFFSET, (TestPatn0[(mDEV_REQ_INDEX() >> 8) - 1]));
- eUsbCxFinishAction = ACT_DONE;
- break;
-
- case 0x4: // Test_Packet
- // mUsbTsMdWr(TEST_PKY);
- // mUsbEP0DoneSet(); // special case: follow the test sequence
- //ZM_PHY_TEST_SELECT_REG = TEST_PKY;
- //ZM_CX_CONFIG_STATUS_REG = 0x01;
- USB_BYTE_REG_WRITE(ZM_PHY_TEST_SELECT_OFFSET, TEST_PKY);
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
- /***********************************************************************///////
- // Jay ask to modify, 91-6-5 (Begin) //
- /***********************************************************************///////
- // mUsbTsMdWr(TEST_PKY);
- // mUsbEP0DoneSet(); // special case: follow the test sequence
- //ZM_PHY_TEST_SELECT_REG = TEST_PKY;
- USB_BYTE_REG_WRITE(ZM_PHY_TEST_SELECT_OFFSET, TEST_PKY);
-
- //ZM_CX_CONFIG_STATUS_REG = 0x01;
- /***********************************************************************///////
- // Jay ask to modify, 91-6-5 (Begin) //
- /***********************************************************************///////
- {
- uint16_t ii;
-
- /* Set to two bytes mode */
- //ZM_CBUS_FIFO_SIZE_REG = 0x0f;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x0f);
-
- for (ii = 0; ii < sizeof(TestPatn1)/sizeof(uint32_t); ii++)
- {
- //ZM_EP0_DATA_REG = TestPatn1[ii];
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, TestPatn1[ii]);
- }
-
- /* Set to one byte mode */
- //ZM_CBUS_FIFO_SIZE_REG = 0x07;
- //ZM_EP0_DATA_REG = 0x007EFDFB;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x07);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, 0x007EFDFB);
-
- /* Set to four bytes mode */
- //ZM_CBUS_FIFO_SIZE_REG = 0x0f;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x0f);
- }
- /***********************************************************************///////
- // Jay ask to modify, 91-6-5 (End) //
- /***********************************************************************///////
-
- // Turn on "r_test_packet_done" bit(flag) (Bit 5)
- //mUsbTsPkDoneSet();
- //ZM_CX_CONFIG_STATUS_REG = 0x02;
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT1);
- break;
-
- case 0x5: // Test_Force_Enable
- //FUSBPort[0x08] = 0x20; //Start Test_Force_Enable
- break;
-
- default:
- return FALSE;
- }
- break;
- #endif
- default :
- return FALSE;
- }
-
- if (eUsbCxFinishAction == ACT_DONE)
- UsbStatus[2] = 1;
-
- return TRUE;
-}
-
-
-/***********************************************************************/
-// bSet_address()
-// Description:
-// 1. Set addr to FUSB200 register.
-// input: none
-// output: TRUE or FALSE (BOOLEAN)
-/***********************************************************************/
-LOCAL BOOLEAN bSet_address(void)
-{
-
- //A_PRINTF("bSet_feature...\n\r");
-
- if (mDEV_REQ_VALUE() >= 0x0100)
- return FALSE;
- else
- {
-// zfUartSendStrAndHex((uint8_t *) "USB_SET_ADDRESS=", mDEV_REQ_VALUE());
- //ZM_DEVICE_ADDRESS_REG = mDEV_REQ_VALUE();
- USB_BYTE_REG_WRITE(ZM_DEVICE_ADDRESS_OFFSET, mDEV_REQ_VALUE());
-
- eUsbCxFinishAction = ACT_DONE;
- return TRUE;
- }
-}
-
-/***********************************************************************/
-// bGet_descriptor()
-// Description:
-// 1. Point to the start location of the correct descriptor.
-// 2. set the transfer length
-// input: none
-// output: TRUE or FALSE (BOOLEAN)
-/***********************************************************************/
-LOCAL BOOLEAN bGet_descriptor(void)
-{
- //A_PRINTF("bGet_descriptor...\n\r");
-
-// Change Descriptor type
-#if 0
- u8ConfigDescriptorEX[mTABLE_IDX(1)] =
- m2BYTE(CONFIG_LENGTH, DT_CONFIGURATION);
- u8OtherSpeedConfigDescriptorEX[mTABLE_IDX(1)] =
- m2BYTE(CONFIG_LENGTH, DT_OTHER_SPEED_CONFIGURATION);
-#endif
-
- //*(volatile uint32_t*)0x1c0004 = 'G';
-
- switch (mDEV_REQ_VALUE_HIGH())
- {
- case 1: // device descriptor
- pu8DescriptorEX = u8UsbDeviceDescriptor;
- u16TxRxCounter = mTABLE_LEN(u8UsbDeviceDescriptor[0]);
- //u16TxRxCounter = 18;
- break;
-
- case 2: // configuration descriptor
- // It includes Configuration, Interface and Endpoint Table
-// zfUartSendStr((uint8_t *)"Configuration Descriptor\r\n");
- switch (mDEV_REQ_VALUE_LOW())
- {
- case 0x00: // configuration no: 0
- pu8DescriptorEX = u8ConfigDescriptorEX;
- u16TxRxCounter = u8ConfigDescriptorEX[1];
- //u16TxRxCounter = 46;
- break;
- default:
- return FALSE;
- }
- break;
-
- case 3: // string descriptor
- // DescriptorIndex = low_byte of wValue
-// zfUartSendStr((uint8_t *)"String Descriptor\r\n");
- switch (mDEV_REQ_VALUE_LOW())
- {
- case 0x00:
- pu8DescriptorEX = u8String00Descriptor;
- //u16TxRxCounter = 4;
- break;
-
- case 0x10:
- pu8DescriptorEX = u8String10Descriptor;
- //u16TxRxCounter = 12;
- break;
-
- case 0x20:
- pu8DescriptorEX = u8String20Descriptor;
- //u16TxRxCounter = 24;
- break;
-
- case 0x30:
- pu8DescriptorEX = u8String30Descriptor;
- break;
-
- default:
- return FALSE;
- }
- u16TxRxCounter = mTABLE_LEN(pu8DescriptorEX[0]);
- break;
-
- case 6: // Device_Qualifier descritor
-// zfUartSendStr((uint8_t *) "Device_Qualifier Descriptor\r\n");
- pu8DescriptorEX = u8DeviceQualifierDescriptorEX;
- u16TxRxCounter = mTABLE_LEN(u8DeviceQualifierDescriptorEX[0]);
- //u16TxRxCounter = 10;
- break;
-
- case 7: // Other_Speed_Configuration
-// zfUartSendStr((uint8_t *)"Other_Speed Descriptor\r\n");
- // It includes Configuration, Interface and Endpoint Table
- pu8DescriptorEX = u8OtherSpeedConfigDescriptorEX;
- u16TxRxCounter = u8OtherSpeedConfigDescriptorEX[1];
- //u16TxRxCounter = 46;
- break;
-
- default:
-// zfUartSendStrAndHex((uint8_t *) "Descriptor error=", mDEV_REQ_VALUE_HIGH());
- return FALSE;
- }
-
- if (u16TxRxCounter > mDEV_REQ_LENGTH())
- u16TxRxCounter = mDEV_REQ_LENGTH();
-
-// vUsbEP0TxData();
- A_USB_EP0_TX_DATA();
-
- // somehow if there is still data need to send out, we shouldn't set CX_DONE
- // wait for another EP0_IN
- if( u16TxRxCounter > 0 )
- {
- eUsbCxCommand = CMD_GET_DESCRIPTOR;
- }
-
- return TRUE;
-}
-
-
-/***********************************************************************/
-// bGet_configuration()
-// Description:
-// 1. Send 1 bytes configuration value to host.
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL BOOLEAN bGet_configuration(void)
-{
-
- //A_PRINTF("bGet_configuration...\n\r");
-
- //ZM_CBUS_FIFO_SIZE_REG = 0x1;
- //ZM_EP0_DATA_REG = u8UsbConfigValue;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, u8UsbConfigValue);
-
- // Restore CBus FIFO size to word size
- //ZM_CBUS_FIFO_SIZE_REG = 0xf;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xf);
-
- eUsbCxFinishAction = ACT_DONE;
-
- return TRUE;
-}
-
-/***********************************************************************/
-// bSet_configuration()
-// Description:
-// 1. Get 1 bytes configuration value from host.
-// 2-1. if (value == 0) then device return to address state
-// 2-2. if (value match descriptor table)
-// then config success & Clear all EP toggle bit
-// 2-3 else stall this command
-// input: none
-// output: TRUE or FALSE
-/***********************************************************************/
-LOCAL BOOLEAN bSet_configuration(void)
-{
-void vUsbClrEPx(void);
-
- //A_PRINTF("bSet_configuration...\n\r");
-
- if (mLOW_BYTE(mDEV_REQ_VALUE()) == 0)
- {
- u8UsbConfigValue = 0;
- //mUsbCfgClr();
- //ZM_DEVICE_ADDRESS_REG &= ~BIT7;
- USB_BYTE_REG_WRITE(ZM_DEVICE_ADDRESS_OFFSET, (USB_BYTE_REG_READ(ZM_DEVICE_ADDRESS_OFFSET)&~BIT7));
- }
- else
- {
- if (mUsbHighSpeedST()) // First judge HS or FS??
- {
- if (mLOW_BYTE(mDEV_REQ_VALUE()) > HS_CONFIGURATION_NUMBER)
- return FALSE;
-
- u8UsbConfigValue = mLOW_BYTE(mDEV_REQ_VALUE());
- vUsbFIFO_EPxCfg_HS();
-
- // Set into 512 byte mode */
- //ZM_SOC_USB_MODE_CTRL_REG |= BIT2;
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT2));
- // mUsbSOFMaskHS();
- }
- else
- {
- if (mLOW_BYTE(mDEV_REQ_VALUE()) > FS_CONFIGURATION_NUMBER)
- return FALSE;
-
- u8UsbConfigValue = mLOW_BYTE(mDEV_REQ_VALUE());
- vUsbFIFO_EPxCfg_FS();
-
- // Set into 64 byte mode */
- //M_SOC_USB_MODE_CTRL_REG &= ~BIT2;
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&~BIT2));
- // mUsbSOFMaskFS();
- }
- //mUsbCfgSet();
- //ZM_DEVICE_ADDRESS_REG |= BIT7;
- USB_BYTE_REG_WRITE(ZM_DEVICE_ADDRESS_OFFSET, \
- (USB_BYTE_REG_READ(ZM_DEVICE_ADDRESS_OFFSET)|BIT7));
-
- vUsbClrEPx();
-
- mUsbGlobIntEnable();
- mUSB_REG_OUT_INT_ENABLE();
-
- }
-
- eUsbCxFinishAction = ACT_DONE;
- return TRUE;
-}
-
-
-/***********************************************************************/
-// bGet_interface()
-// Description:
-// Getting interface
-// input: none
-// output: TRUE or FALSE
-/***********************************************************************/
-LOCAL BOOLEAN bGet_interface(void)
-{
-
-// A_PRINTF("bGet_interface...\n\r");
- if (mUsbCfgST() == 0)
- return FALSE;
-
- // If there exists many interfaces, Interface0,1,2,...N,
- // You must check & select the specific one
- switch (u8UsbConfigValue)
- {
- #if (HS_CONFIGURATION_NUMBER >= 1)
- // Configuration 1
- case 1:
- if (mDEV_REQ_INDEX() > HS_C1_INTERFACE_NUMBER)
- return FALSE;
- break;
- #endif
- #if (HS_CONFIGURATION_NUMBER >= 2)
- // Configuration 2
- case 2:
- if (mDEV_REQ_INDEX2() > HS_C2_INTERFACE_NUMBER)
- return FALSE;
- break;
- #endif
- default:
- return FALSE;
- }
-
- //ZM_CBUS_FIFO_SIZE_REG = 0x1;
- //ZM_EP0_DATA_REG = u8UsbInterfaceAlternateSetting;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, u8UsbInterfaceAlternateSetting);
-
- // Restore CBus FIFO size to word size
- //ZM_CBUS_FIFO_SIZE_REG = 0xf;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x0f);
-
- u16TxRxCounter = 1; //sizeof(u8UsbInterfaceAlternateSetting);
- eUsbCxFinishAction = ACT_DONE;
- return TRUE;
-}
-
-/***********************************************************************/
-// bSet_interface()
-// Description:
-// 1-1. If (the device stays in Configured state)
-// &(command match the alternate setting)
-// then change the interface
-// 1-2. else stall it
-// input: none
-// output: TRUE or FALSE
-/***********************************************************************/
-LOCAL BOOLEAN bSet_interface(void)
-{
-void vUsbClrEPx(void);
-
- //A_PRINTF("bSet_interface...\n\r");
-
- if (mUsbCfgST())
- {
-
- // If there exists many interfaces, Interface0,1,2,...N,
- // You must check & select the specific one
- switch (mDEV_REQ_INDEX())
- {
- case 0: // Interface0
-
- if (mLOW_BYTE(mDEV_REQ_VALUE()) == mLOW_BYTE(u8ConfigDescriptorEX[mTABLE_IDX(12)]))
- {
- u8UsbInterfaceValue = (uint8_t) mDEV_REQ_INDEX();
- u8UsbInterfaceAlternateSetting = mLOW_BYTE(mDEV_REQ_VALUE());
- if (mUsbHighSpeedST()) // First judge HS or FS??
- {
- vUsbFIFO_EPxCfg_HS();
-
- // Set into 512 byte mode */
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT2));
- }
- else
- {
- vUsbFIFO_EPxCfg_FS();
-
- // Set into 64 byte mode */
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&~BIT2));
- }
- vUsbClrEPx();
- eUsbCxFinishAction = ACT_DONE;
-
- mUsbGlobIntEnable();
- mUSB_REG_OUT_INT_ENABLE();
- return TRUE;
- }
- // case 1: // Interface1
- // case 2: // Interface2
- // default:
- // break;
- }
- }
- return FALSE;
-}
-
-/***********************************************************************/
-// vUsbEP0TxData()
-// Description:
-// 1. Send data(max or short packet) to host.
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL void vUsbEP0TxData(void)
-{
- uint8_t u8temp;
- uint32_t idx=0;
-
- //wait a little to make sure ep0 fifo is empty before sending data out
- while(1)
- {
- if(idx++>0xffff) {
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, USB_BYTE_REG_READ(ZM_CX_CONFIG_STATUS_OFFSET)|BIT3);
- break;
- }
-
- if(USB_BYTE_REG_READ(ZM_CX_CONFIG_STATUS_OFFSET)&BIT5)
- {
- break;
- }
- }
- // to keep tracking the txrx fifo
- // max 64 bytes for transmission one time,
- if (u16TxRxCounter < EP0MAXPACKETSIZE)
- u8temp = (uint8_t) u16TxRxCounter;
- else
- u8temp = EP0MAXPACKETSIZE;
-
- u16TxRxCounter -= (uint16_t) u8temp;
-
- {
- register uint8_t u8count;
- uint8_t remainder;
-
- for (u8count = 0; u8count < (u8temp/4); u8count ++)
- {
- uint32_t ep0_data;
- uint16_t ep0_low;
- uint16_t ep0_high;
-
- // pack data into word size
- ep0_low = *pu8DescriptorEX++;
- ep0_high = *pu8DescriptorEX++;
-
- // composed the data as a word
- ep0_data = (ep0_high << 16) + ep0_low;
-
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- }
-
- remainder = u8temp % 4;
-
- // Check whether there are data needed to be filled into the FIFO
- if (remainder == 3)
- {
- uint32_t ep0_data;
- uint16_t ep0_low;
- uint16_t ep0_high;
-
- // pack data into word size
- ep0_low = *pu8DescriptorEX++;
- ep0_high = *pu8DescriptorEX++;
-
- ep0_data = (ep0_high << 16) + ep0_low;
-
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x7);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- }
- else if (remainder == 2)
- {
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x3);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, *pu8DescriptorEX);
- }
- else if (remainder == 1)
- {
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, *pu8DescriptorEX);
- }
-
- // Restore CBus FIFO size to word size
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xf);
- }
-
- // end of the data stage
- if (u16TxRxCounter == 0)
- {
- eUsbCxCommand = CMD_VOID;
- eUsbCxFinishAction = ACT_DONE;
- }
-}
-
-/***********************************************************************/
-// vUsbEP0RxData()
-// Description:
-// 1. Receive data(max or short packet) from host.
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL void vUsbEP0RxData(void)
-{
- uint8_t u8temp;
-
- if (u16TxRxCounter < EP0MAXPACKETSIZE)
- u8temp = (uint8_t) u16TxRxCounter;
- else
- u8temp = EP0MAXPACKETSIZE;
-
- u16TxRxCounter -= (uint16_t) u8temp;
-
- // Receive u8Temp bytes data
- {
- register uint8_t u8count;
- uint8_t *p = (uint8_t *) pu8DescriptorEX;
-
- for (u8count = 0; u8count < ((u8temp+3) >> 2); u8count ++)
- {
- uint32_t ep0_data;
-
- ep0_data = USB_WORD_REG_READ(ZM_EP0_DATA_OFFSET); //read usb ep0 fifo data,
-
- {
-// skip the writing to ram if not build for rom code
-#if 0 //1 defined(_ROM_)
- *p++ = mGetByte0(ep0_data);
- *p++ = mGetByte1(ep0_data);
- *p++ = mGetByte2(ep0_data);
- *p++ = mGetByte3(ep0_data);
-#endif
- fwCheckSum = fwCheckSum ^ ep0_data;
- }
- }
-
- pu8DescriptorEX += (u8count << 1);
- }
-
- // end of the data stage
- if (u16TxRxCounter == 0)
- {
- eUsbCxCommand = CMD_VOID;
- eUsbCxFinishAction = ACT_DONE;
- }
-}
-
-
-/***********************************************************************/
-// vUsb_SetupDescriptor()
-// Description:
-// Setup the pointer to the descriptor in the SRAM and EEPROM
-//
-/***********************************************************************/
-LOCAL void vUsb_SetupDescriptor(void)
-{
-// eeprom exist the usb configuration is only supportted in rom version
-#if defined(_ROM_)
- //
- // check the offset of PID's value is correct or not, need to be defined!!, ryan
- //
-
- if( *((uint32_t*)USB_DESC_IN_EEPROM_FLAG_ADDR) == USB_DESC_IN_EEP_PATTERN)
- {
- A_PRINTF("- custom usb config\n");
-
- u8UsbDeviceDescriptor = (uint16_t *) USB_DEVICE_DESCRIPTOR_ADDR;
- u8String00Descriptor = (uint16_t *) USB_STRING00_DESCRIPTOR_ADDR;
- u8String10Descriptor = (uint16_t *) USB_STRING10_DESCRIPTOR_ADDR;
- u8String20Descriptor = (uint16_t *) USB_STRING20_DESCRIPTOR_ADDR;
- u8String30Descriptor = (uint16_t *) USB_STRING30_DESCRIPTOR_ADDR;
- }
- else
-#endif
- {
- u8UsbDeviceDescriptor = (uint16_t *) &UsbDeviceDescriptor;
- u8String00Descriptor = (uint16_t *) &String00Descriptor;
- u8String10Descriptor = (uint16_t *) &String10Descriptor;
- u8String20Descriptor = (uint16_t *) &String20Descriptor;
- u8String30Descriptor = (uint16_t *) &String30Descriptor;
- }
-
- /* Point Device Qualifierdescriptors and Other Speed Descriptor
- * - Device Qualifierdescriptor is located in RAM segment, extern these
- * symbol at the beginning of this file
- */
-}
-
-
-/***********************************************************************/
-// bStandardCommand()
-// Description:
-// 1. Process standard command.
-// input: none
-// output: TRUE or FALSE
-/***********************************************************************/
-LOCAL BOOLEAN bStandardCommand(void)
-{
- switch (mDEV_REQ_REQ()) // by Standard Request codes
- {
- case USB_GET_STATUS:
- return (A_USB_GET_STATUS());
-
- case USB_CLEAR_FEATURE:
- return (A_USB_CLEAR_FEATURE());
-
- case USB_SET_FEATURE:
- return (A_USB_SET_FEATURE());
-
- case USB_SET_ADDRESS:
- return (A_USB_SET_ADDRESS());
-
- case USB_GET_DESCRIPTOR:
- return (A_USB_GET_DESCRIPTOR());
-
-#if 0
- case USB_SET_DESCRIPTOR:
-// if (!bUsbEP0HaltSt)
- return (bSet_descriptor());
-#endif
-
- case USB_GET_CONFIGURATION:
- return (A_USB_GET_CONFIG());
-
- case USB_SET_CONFIGURATION:
- //A_PRINTF(" \n--> SET_CONFIGURATION\r\n");
-// if (!bUsbEP0HaltSt)
-// return (A_USB_SET_CONFIG());
-
- {
- 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
-
-
-#if !ENABLE_STREAM_MODE
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT3);
-
- /*
- // ryan:
- // 04/01: bit0 could disable lpdn dma, which is good at debugging while async_fifo have problem,
- // we could disable this and check the fifo_rcv_size to see if we have correct at fifo or not
- */
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, ((USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT1))); // upstream DMA enable
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, ((USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT0))); // downstream DMA enable
-
- #if SYSTEM_MODULE_HP_EP5
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, ((USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT8)));
- #endif
-
- #if SYSTEM_MODULE_HP_EP6
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, ((USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT9)));
- #endif
-
-#else
-/////////////ENABLE_STREAM_MODE/////////////////
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&(~BIT1))); // disable upstream DMA mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&(~BIT3))); // enable upstream stream mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET,
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|(BIT1))); // enable upstream DMA mode
-
- #if SYSTEM_MODULE_HP_EP1
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&(~BIT0))); // diable LP downstream DMA mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|(BIT6))); // enable LP downstream stream mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|(BIT0))); // enable LP downstream DMA mode
- #endif
-
- #if SYSTEM_MODULE_HP_EP5
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&(~BIT8))); // disable HP downstream DMA mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|(BIT7))); // enable HP downstream stream mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT8)); // enable HP downstream DMA mode
- #endif
-
-
- #if SYSTEM_MODULE_HP_EP6
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)&(~BIT9))); // disable MP downstream DMA mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT10)); // enable MP downstream stream mode
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|BIT9)); // enable MP downstream DMA mode
- #endif
-
- USB_WORD_REG_WRITE(ZM_SOC_USB_MODE_CTRL_OFFSET, \
- (USB_WORD_REG_READ(ZM_SOC_USB_MODE_CTRL_OFFSET)|(BIT4))); // define the host dma buffer size - 4096(00) 8192 (01) 16384(10) 32768(11) bytes
-
- USB_WORD_REG_WRITE(ZM_SOC_USB_TIME_CTRL_OFFSET, USB_STREAM_MODE_TIMEOUT_CTRL); // set stream mode timeout critirea
-
- USB_WORD_REG_WRITE(ZM_SOC_USB_MAX_AGGREGATE_OFFSET, USB_STREAM_MODE_AGG_CNT); // set stream mode packet buffer critirea
-#endif //!ENABLE_STREAM_MODE
-
-
-
-//extern void Magpie_init(void);
-//Magpie_init();
-
- return TRUE;
- }
-
- case USB_GET_INTERFACE:
-// A_PRINTF(" \n--> GET_INTERFACE\r\n");
-// if (!bUsbEP0HaltSt)
- //return (bGet_interface());
- return (A_USB_GET_INTERFACE());
-
- case USB_SET_INTERFACE:
-// A_PRINTF(" \n--> SET_INTERFACE\r\n");
-// if (!bUsbEP0HaltSt)
-// return (bSet_interface());
-// return (A_USB_SET_INTERFACE());
- A_USB_SET_INTERFACE();
- return TRUE;
- }
- return FALSE;
-}
-
-
-LOCAL void flash_read(uint16_t len, uint16_t ofset)
-{
- uint16_t i=0;
-
- uint8_t buf[64];
- uint16_t end_addr = 0x0;
- uint16_t start_addr = 0x0;
- uint32_t ep0_data = 0x0;
-
-#if 0
- //sanity check, just in case
- if(u16TxRxCounter < EP0MAXPACKETSIZE)
- u8temp = (uint8_t) u16TxRxCounter;
- else
-
- if( u16TxRxCounter > 64 )
- len = EP0MAXPACKETSIZE;
- else
- len = u16TxRxCounter + 4-(u16TxRxCounter%4);
-#endif
-
- start_addr = ofset;
- end_addr = start_addr + len;
-
- A_PRINTF("read flash from %x to %x\n", ofset, end_addr);
-
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
-
- for (i = 0; start_addr < end_addr; i++, start_addr+=4)
- {
-// A_SFLASH_READ(1, ofset, 4, buf + i*4);
-// *((volatile uint32_t *)(buf+i*4)) = *(uint32_t *)(0xf000000+start_addr);
-// A_PRINTF(" %08x ", *(uint32_t *)(0xf000000+start_addr));
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, *(uint32_t *)(0xf000000+start_addr));
- }
-
-// A_PRINTF("\n\n\r");
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
-
-
-
-
-#if 0
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
-
- for(i=0; i<len; i+4)
- {
- ep0_data = *(uint32_t *)(buf+i);
-
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- }
-
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
-
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
-#endif
-}
-
-extern BOOLEAN download_enable;
-
-LOCAL void VendorCommand(void)
-{
-#define cUSB_REQ_DOWNLOAD 0x30
-#define cUSB_REQ_DOWNLOAD_COMP 0x31
-#define cUSB_REQ_BOOT 0x32
-#define cUSB_REQ_RESERVED_1 0x33
-#define cUSB_REQ_RESERVED_2 0x34
-
-#define cUSB_REQ_FLASH_READ 0x35
-#define cUSB_REQ_FLASH_READ_COMP 0x36
-
-//#define ZM_FIRMWARE_ADDR 0x200000
-
- void (*funcPtr)(void);
- uint16_t *text_addr = 0;
- uint32_t ep0_data = 0x0;
-// static download_enable = FALSE;
-
- CURRENT_PROGRAM = (uint32_t)VendorCommand;
-
- switch (mDEV_REQ_REQ())
- {
- case cUSB_REQ_FLASH_READ:
-
- ep0_data = *(uint32_t *)(0xf000000);
-
- u16TxRxCounter = mDEV_REQ_LENGTH();
- pu8DescriptorEX = (uint16_t*)( (mDEV_REQ_VALUE()));
-
-// A_PRINTF("Get a flash_read (%x) request with lenght:%d, and offset %x...\n", cUSB_REQ_FLASH_READ, u16TxRxCounter, pu8DescriptorEX);
-
-// eUsbCxCommand = CMD_GET_CUSTOM_DATA;
-
-#if 1
- flash_read(u16TxRxCounter, (uint16_t)pu8DescriptorEX);
-#else
- eUsbCxCommand = CMD_GET_CUSTOM_DATA;
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
-#endif
- break;
-
- case cUSB_REQ_FLASH_READ_COMP:
-
- ep0_data = *(uint32_t *)(0xf000004);
- A_PRINTF("get a upload complete request...\n");
-
- //eUsbCxCommand = CMD_SET_DESCRIPTOR;
-// USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, ep0_data);
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
-
- //download_enable = TRUE;
-
- break;
-
- case cUSB_REQ_DOWNLOAD:
- //if( download_enable )
- {
- u16TxRxCounter = mDEV_REQ_LENGTH();
- pu8DescriptorEX = (uint16_t*)( (mDEV_REQ_VALUE() << 8));
- A_PRINTF("\t[cUSB_REQ_DOWNLOAD]: 0x%08x, %02x\n\r", pu8DescriptorEX, u16TxRxCounter);
-
- eUsbCxCommand = CMD_SET_DESCRIPTOR;
-
- }
-// else
-// A_PRINTF("firmware download deny!!\n\r");
- break;
-
- case cUSB_REQ_DOWNLOAD_COMP:
-
- text_addr = (uint16_t*)( (mDEV_REQ_VALUE() << 8));
- A_PRINTF("\t\n\r==>[cUSB_REQ_COMP]: 0x%08x\n\r", text_addr);
-#if 0
- if (fwCheckSum != 0)
- {
- A_PRINTF("cksum=%x", fwCheckSum);
- fwCheckSum = 0;
- //Return fail
- DEBUG_SYSTEM_STATE |= BIT27;
-
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, 1);
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
- }
- else
-#endif
- {
- /* Set EP0 Done */
- //ZM_CX_CONFIG_STATUS_REG = 0x01;
- fwCheckSum = 0;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x1);
- USB_WORD_REG_WRITE(ZM_EP0_DATA_OFFSET, 0);
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0xF);
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, BIT0);
-
- A_PRINTF("VendorCmd: DownloadComplete!\n");
-
- DEBUG_SYSTEM_STATE &= ~BIT27;
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x3f;
-
- // this value should be assign from host along with the DOWNLOAD_COMP in wValue
- if( text_addr != 0 )
- funcPtr = (void *)(text_addr);
-
- download_enable = TRUE;
-
- // only jump to text address in ROM version
- #if defined(_ROM_)
- // funcPtr(); // jump to the firmware and never return
- #endif
- //app_start();
- }
-// else
-// A_PRINTF("Integrity is not fine!\n\r");
-
- break;
- }
-}
-
-
-/***********************************************************************/
-// vUsb_ep0setup()
-// Description:
-// 1. Read 8-byte setup packet.
-// 2. Decode command as Standard, Class, Vendor or NOT support command
-// input: none
-// output: none
-/***********************************************************************/
-extern uint16_t u8HSConfigDescriptor01[];
-extern uint16_t u8FSConfigDescriptor01[];
-
-LOCAL void vUsb_ep0setup(void)
-{
-register uint8_t ii;
-volatile uint32_t ep0_data;
-//BOOLEAN bStandardCommand(void);
-//BOOLEAN bClassCommand(void);
-//void VendorCommand(void);
-
- //zcPrint._printf("\t---> %s <---\n\r", __FUNCTION__);
- if (UsbChirpFinish != TRUE)
- {
- UsbChirpFinish = TRUE;
-
- // Setup Descriptor pointer
- //vUsb_SetupDescriptor();
- A_USB_SETUP_DESC();
-
- u8OtherSpeedConfigDescriptorEX[0] = 0x0709;
-
- if (mUsbHighSpeedST()) // Judge HS or FS??
- {
- u8ConfigDescriptorEX = u8HSConfigDescriptor01;
-
- // copy Device Qualifierdescriptors (from rom to sram)
- for (ii = 1; ii < 4; ii++)
- {
- u8DeviceQualifierDescriptorEX[ii] = u8UsbDeviceDescriptor[ii];
- }
-
- // Number of Other-speed Configurations
- // byte 9 Reserved for future use, must be zero
- u8DeviceQualifierDescriptorEX[4] = (u8UsbDeviceDescriptor[8] >> 8) & 0x00ff;
-
- // copy Other Speed Descriptor
- for (ii = 1; ii < (USB_TOTAL_DESC_LEN/2); ii++)
- {
- u8OtherSpeedConfigDescriptorEX[ii] = u8FSConfigDescriptor01[ii];
- }
-
-#if 0
- MaxPktSize = HS_C1_I0_A0_EP1_MAX_PACKET;
- // Device stays in High Speed
- u8DeviceDescriptorEX = u8HSDeviceDescriptor;
-
- // copy Device Qualifierdescriptors (from rom to sram)
- for (ii = mTABLE_WID(2) ; ii < mTABLE_WID(8); ii ++)
- u8DeviceQualifierDescriptorEX[ii] = u8FSDeviceDescriptor[ii];
-
- // Number of Other-speed Configurations
- // byte 9 Reserved for future use, must be zero
- u8DeviceQualifierDescriptorEX[mTABLE_IDX(8)]
- = mHIGH_BYTE(u8FSDeviceDescriptor[mTABLE_IDX(17)]);
- u8ConfigDescriptorEX = u8HSConfigDescriptor01;
- u8OtherSpeedConfigDescriptorEX = u8FSConfigDescriptor01;
-#endif
- }
- else
- {
- u8ConfigDescriptorEX = u8FSConfigDescriptor01;
-
- // copy Device Qualifierdescriptors (from rom to sram)
- for (ii = 1; ii < 4; ii++)
- {
- u8DeviceQualifierDescriptorEX[ii] = u8UsbDeviceDescriptor[ii];
- }
-
- // Number of Other-speed Configurations
- // byte 9 Reserved for future use, must be zero
- u8DeviceQualifierDescriptorEX[4] = (u8UsbDeviceDescriptor[8] >> 8) & 0x00ff;
-
- // copy Other Speed Descriptor
- for (ii = 1; ii < (USB_TOTAL_DESC_LEN/2); ii++)
- {
- u8OtherSpeedConfigDescriptorEX[ii] = u8HSConfigDescriptor01[ii];
- }
-
-#if 0
- MaxPktSize = FS_C1_I0_A0_EP1_MAX_PACKET;
- // Device stays in Full Speed
- u8DeviceDescriptorEX = u8FSDeviceDescriptor;
-
- // copy Device Qualifierdescriptors (from rom to sram)
- for (ii = mTABLE_WID(2) ; ii < mTABLE_WID(8); ii ++)
- u8DeviceQualifierDescriptorEX[ii] = u8HSDeviceDescriptor[ii];
-
- // Number of Other-speed Configurations
- // byte 9 Reserved for future use, must be zero
- u8DeviceQualifierDescriptorEX[mTABLE_IDX(8)]
- = mHIGH_BYTE(u8HSDeviceDescriptor[mTABLE_IDX(17)]);
- u8ConfigDescriptorEX = u8FSConfigDescriptor01;
- u8OtherSpeedConfigDescriptorEX = u8HSConfigDescriptor01;
-#endif
- }
- //Change bLength
- u8DeviceQualifierDescriptorEX[0] = 0x060A;
- }
-
- if( USB_BYTE_REG_READ(ZM_CX_CONFIG_STATUS_OFFSET) & BIT5)
- {
- int kkk=0;
- kkk++;
- }
- //ep0_data = ZM_EP0_DATA_REG;
- ep0_data = USB_WORD_REG_READ(ZM_EP0_DATA_OFFSET);
-
- ii = mGetByte0(ep0_data);
-
- ControlCmd.Direction = (uint8_t)(ii & 0x80);// xfer Direction(IN, OUT)
- ControlCmd.Type = (uint8_t)(ii & 0x60); // type(Standard, Class, Vendor)
- ControlCmd.Object = (uint8_t)(ii & 0x03); // Device, Interface, Endpoint
-
- ControlCmd.Request = mGetByte1(ep0_data);
- ControlCmd.Value = mGetByte2(ep0_data) + (mGetByte3(ep0_data) << 8);
-
- //ep0_data = ZM_EP0_DATA_REG;
- ep0_data = USB_WORD_REG_READ(ZM_EP0_DATA_OFFSET);
-
- ControlCmd.Index = mGetByte0(ep0_data) + (mGetByte1(ep0_data) << 8);
- ControlCmd.Length = mGetByte2(ep0_data) + (mGetByte3(ep0_data) << 8);
-
-// Command Decode
- if (mDEV_REQ_REQ_TYPE() == (cUSB_REQTYPE_STD << bmREQ_TYPE))
- { // standard command
- //if (bStandardCommand() == FALSE)
- if (A_USB_STANDARD_CMD() == FALSE)
- {
- eUsbCxFinishAction = ACT_STALL;
- }
- }
- else if (mDEV_REQ_REQ_TYPE() == (cUSB_REQTYPE_VENDOR << bmREQ_TYPE))
- { // vendor command
- //VendorCommand();
- A_USB_VENDOR_CMD();
- }
- else
- {
- // Invalid(bad) command, Return EP0_STALL flag
- A_PRINTF("request not support.. stall", __FUNCTION__);
- eUsbCxFinishAction = ACT_STALL;
- }
-
- //zcPrint._printf("\t<--- %s --->\n\r", __FUNCTION__);
-}
-
-
-/*! - init FUSB phy
- *
- */
-LOCAL void cFUSB200Init(void)
-{
- /* Clear USB reset interrupt */
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&0xfd));
-
- // Disable all fifo interrupt
- /* Clear all USB OUT FIFO */
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_1_OFFSET, 0xff);
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_2_OFFSET, 0xff);
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_3_OFFSET, 0xff);
-
- /* Clear all USB IN FIFO */
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_5_OFFSET, 0xff);
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_6_OFFSET, 0xff);
-
- // Soft Reset
- //ZM_MAIN_CTRL_REG = 0x10;
- //ZM_MAIN_CTRL_REG &= ~0x10;
-
- // Soft Reset
- USB_BYTE_REG_WRITE(ZM_MAIN_CTRL_OFFSET, 0x10);
- USB_BYTE_REG_WRITE(ZM_MAIN_CTRL_OFFSET, 0x0);
-
- // Clear all fifo
- USB_BYTE_REG_WRITE(ZM_TEST_OFFSET, BIT0); // will be cleared after one cycle.
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_0_OFFSET, 0); //BIT6); // Mask out INT status
-
- // reset the specific mode
- USB_BYTE_REG_WRITE(ZM_VDR_SPECIFIC_MODE_OFFSET, 0x0);
-
- // reset the zero-length fifo indication ? workaround...
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_OFFSET, 0x0);
-
- // Enable Chip
- USB_BYTE_REG_WRITE(ZM_MAIN_CTRL_OFFSET, (BIT5|BIT2));
-
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_1_OFFSET, 0x0);
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_2_OFFSET, 0x0);
- USB_BYTE_REG_WRITE(ZM_INTR_MASK_BYTE_3_OFFSET, 0x0);
-
-// USB_WORD_REG_WRITE(0x104, 0x000000C0);
-
-}
-
-
-LOCAL void _usbfifo_enable_event_isr(void)
-{
- mUSB_STATUS_IN_INT_ENABLE();
-}
-
-LOCAL void _usbfifo_init(USB_FIFO_CONFIG *pConfig)
-{
- usbFifoConf.get_command_buf = pConfig->get_command_buf;
- usbFifoConf.recv_command = pConfig->recv_command;
- usbFifoConf.get_event_buf = pConfig->get_event_buf;
- usbFifoConf.send_event_done = pConfig->send_event_done;
-}
-
-LOCAL void vUsb_Reg_Out(void)
-{
- uint16_t usbfifolen;
- uint16_t ii;
- volatile uint32_t *regaddr; // = (volatile uint32_t *) ZM_CMD_BUFFER;
- uint16_t cmdLen;
- uint32_t ep4_data;
- VBUF *buf;
-
- //mUSB_REG_OUT_INT_DISABLE();
-
- buf = usbFifoConf.get_command_buf();
-
- if ( buf != NULL ) // copy free
- regaddr = (uint32_t *)buf->desc_list->buf_addr;
- else
- goto ERR;
-
- // read fifo size of the current packet.
- usbfifolen = USB_BYTE_REG_READ(ZM_EP4_BYTE_COUNT_LOW_OFFSET);
-
- cmdLen = usbfifolen;
-
- if(usbfifolen % 4)
- usbfifolen = (usbfifolen >> 2) + 1;
- else
- usbfifolen = usbfifolen >> 2;
-
- 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 ( buf != NULL )
- {
-// zfUartSendStrAndHex((u8_t *) "cmdLen=", cmdLen);
-// zfMemoryCopyInWord(buf->desc_list->buf_addr, ZM_CMD_BUFFER, usbfifolen*4);
- 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);
- }
- 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();
-
-}
-
-LOCAL void vUsb_Status_In(void)
-{
- uint16_t count;
- uint16_t remainder;
- volatile u32_t *regaddr;
- u16_t RegBufLen;
- VBUF *evntbuf = NULL;
-
- //regaddr = (volatile uint32_t *) ZM_CMD_BUFFER;
-
- //mUSB_STATUS_IN_INT_DISABLE();
-
- evntbuf = usbFifoConf.get_event_buf();
- if ( evntbuf != NULL )
- {
-//zfUartSendStr((u8_t *) "#G1\r\n");
-// A_PRINTF("#G1\n\r");
- regaddr = VBUF_GET_DATA_ADDR(evntbuf);
- RegBufLen = evntbuf->buf_length;
-// A_PRINTF("RegBufLen=%d\n\r", RegBufLen);
-//zfUartSendStrAndHex((u8_t *) "RegBufLen=", RegBufLen);
- }
- else
- {
- mUSB_STATUS_IN_INT_DISABLE();
-// A_PRINTF("#G2\n\r");
- goto ERR_DONE;
- }
-
- /* INT use EP3 */
- for(count = 0; count < (RegBufLen / 4); count++)
- {
-//zfUartSendStrAndHex((u8_t *) "data=", *regaddr);
- 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 )
- {
- usbFifoConf.send_event_done(evntbuf);
- }
-
-ERR_DONE:
- //mUSB_REG_OUT_INT_ENABLE();
-}
-
-/////////////////////////////////////////////////////////
-/***********************************************************************/
-// zfResetUSBFIFO()
-// Description:
-// 1. Reset all the USB FIFO used for WLAN
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL void zfResetUSBFIFO(void)
-{
- A_PUTS("zfResetUSBFIFO\n\r");
-
-}
-
-/***********************************************************************/
-// zfTurnOffPower()
-// Description:
-// 1. Function to turn off ADDA/RF power, PLL
-// input: none
-// output: none
-/***********************************************************************/
-LOCAL void zfTurnOffPower(void)
-{
- A_PUTS("zfTurnOffPower\n\r");
-#if defined(MAGPIE_ASIC)
-/*
- * 1. set CPU bypass
- * 2. turn off CPU PLL
- * 3. turn off ETH PLL
- * 4. disable ETH PLL bypass and update
- * 5. set SUSPEND_ENABLE
- */
-
- /*HAL_WORD_REG_WRITE(MAGPIE_REG_USB_DIVIDE_ADDR,((0x8<<8)|0x8)); */
- /* 1. */ HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_BYPASS_ADDR,
- (HAL_WORD_REG_READ(MAGPIE_REG_CPU_PLL_BYPASS_ADDR)|(BIT0|BIT4)));
- A_DELAY_USECS(100); // wait for stable
-
- /* 2. */ HAL_WORD_REG_WRITE(MAGPIE_REG_CPU_PLL_ADDR,
- (HAL_WORD_REG_READ(MAGPIE_REG_CPU_PLL_ADDR)|(BIT16)));
-
- /* 3. */ HAL_WORD_REG_WRITE(MAGPIE_REG_ETH_PLL_ADDR,
- (HAL_WORD_REG_READ(MAGPIE_REG_ETH_PLL_ADDR)|(BIT16)));
-
- /* 4. */ HAL_WORD_REG_WRITE(MAGPIE_REG_ETH_PLL_BYPASS_ADDR,
- (HAL_WORD_REG_READ(MAGPIE_REG_ETH_PLL_BYPASS_ADDR)|(BIT16|BIT0)));
-
- /* 5. */ HAL_WORD_REG_WRITE(MAGPIE_REG_SUSPEND_ENABLE_ADDR,
- (HAL_WORD_REG_READ(MAGPIE_REG_SUSPEND_ENABLE_ADDR)|(BIT0)));
-#endif
-
-}
-
-
-LOCAL void zfGenWatchDogEvent(void)
-{
- uint32_t event= 0x0000C600;
-
- mUSB_STATUS_IN_INT_DISABLE();
-
- //ZM_CBUS_FIFO_SIZE_REG = 0xf;
- USB_WORD_REG_WRITE(ZM_CBUS_FIFO_SIZE_OFFSET, 0x0f);
-
- //ZM_EP3_DATA_REG = event;
- USB_WORD_REG_WRITE(ZM_EP3_DATA_OFFSET, event);
-
- mUSB_EP3_XFER_DONE();
-}
-
-LOCAL void zfJumpToBootCode(void)
-{
- extern int _start(void);
-
- /* Jump to the boot code */
- _start();
-}
-
-LOCAL void _usb_rom_task(void)
-{
- register uint8_t usb_interrupt_level1;
- register uint8_t usb_interrupt_level2;
- register uint8_t usb_ctrl_err_indication;
-
- usb_interrupt_level1 = USB_BYTE_REG_READ(ZM_INTR_GROUP_OFFSET);
-
- if (usb_interrupt_level1 & BIT6)
- {
- A_USB_GEN_WDT();
- A_PRINTF("Generate Event\n");
- }
-
- if (usb_interrupt_level1 & BIT0) //Group Byte 0
- {
- usb_interrupt_level2 = USB_BYTE_REG_READ(ZM_INTR_SOURCE_0_OFFSET);
-
- // refer to FUSB200, p 48, offset:21H, bit7 description, should clear the command abort interrupt first!?
- if (usb_interrupt_level2 & BIT7)
- {
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_0_OFFSET, (USB_BYTE_REG_READ(ZM_INTR_SOURCE_0_OFFSET)& ~BIT7));
- }
-
- if (usb_interrupt_level2 & BIT1)
- {
- A_PRINTF("![USB] ep0 IN in \n\r");
- A_USB_EP0_TX(); // USB EP0 tx interrupt
- }
- if (usb_interrupt_level2 & BIT2)
- {
- //A_PRINTF("![USB] ep0 OUT in\n\r");
- A_USB_EP0_RX(); // USB EP0 rx interrupt
- }
- if (usb_interrupt_level2 & BIT0)
- {
- //A_PRINTF("![USB] ep0 SETUP in\n\r");
- A_USB_EP0_SETUP();
- }
-
- if (eUsbCxFinishAction == ACT_STALL)
- {
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x04);
-// A_PRINTF("![USB] ZM_CX_CONFIG_STATUS_REG = 0x04\n\r");
- }
- else if (eUsbCxFinishAction == ACT_DONE)
- {
- // set CX_DONE to indicate the transmistion of control frame
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x01);
- }
- eUsbCxFinishAction = ACT_IDLE;
- }
-
- if (usb_interrupt_level1 & BIT7) //Group Byte 7
- {
- //usb_interrupt_level2 = ZM_INTR_SOURCE_7_REG;
- usb_interrupt_level2 = USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET);
-
- if (usb_interrupt_level2 & BIT1)
- {
- vUsb_rst();
- }
- if (usb_interrupt_level2 & BIT2)
- {
- vUsb_suspend();
- }
- if (usb_interrupt_level2 & BIT3)
- {
- vUsb_resm();
- }
- }
-
-}
-
-
-LOCAL void _usb_fw_task(void)
-{
- register uint8_t usb_interrupt_level1;
- register uint8_t usb_interrupt_level2;
- register uint8_t usb_ctrl_err_indication;
-
- usb_interrupt_level1 = USB_BYTE_REG_READ(ZM_INTR_GROUP_OFFSET);
-
-#if 0 // these endpoints are handled by DMA
- if (usb_interrupt_level1 & BIT5) //Group Byte 5
- {
- vUsb_Data_In();
- }
-#endif
- if (usb_interrupt_level1 & BIT4)
- {
- usb_interrupt_level2 = USB_BYTE_REG_READ(ZM_INTR_SOURCE_4_OFFSET);
- if( usb_interrupt_level2 & BIT6)
- A_USB_REG_OUT();//vUsb_Reg_Out();
- }
-
- if (usb_interrupt_level1 & BIT6)
- {
- //zfGenWatchDogEvent();
- usb_interrupt_level2 = USB_BYTE_REG_READ(ZM_INTR_SOURCE_6_OFFSET);
- if( usb_interrupt_level2 & BIT6)
- A_USB_STATUS_IN();//vUsb_Status_In();
- }
-
- if (usb_interrupt_level1 & BIT0) //Group Byte 0
- {
- //usb_interrupt_level2 = ZM_INTR_SOURCE_0_REG;
- usb_interrupt_level2 = USB_BYTE_REG_READ(ZM_INTR_SOURCE_0_OFFSET);
-
- // refer to FUSB200, p 48, offset:21H, bit7 description, should clear the command abort interrupt first!?
- if (usb_interrupt_level2 & BIT7)
- {
- //ZM_INTR_SOURCE_0_REG &= 0x7f; // Handle command abort
- USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_0_OFFSET, (USB_BYTE_REG_READ(ZM_INTR_SOURCE_0_OFFSET)& ~BIT7));
- A_PRINTF("![SOURCE_0] bit7 on\n\r");
- }
-
- if (usb_interrupt_level2 & BIT1)
- {
- //A_PRINTF("![USB] ep0 IN in \n\r");
- A_USB_EP0_TX(); // USB EP0 tx interrupt
- }
- if (usb_interrupt_level2 & BIT2)
- {
- //A_PRINTF("![USB] ep0 OUT in\n\r");
- A_USB_EP0_RX(); // USB EP0 rx interrupt
- }
- if (usb_interrupt_level2 & BIT0)
- {
- //A_PRINTF("![USB] ep0 SETUP in\n\r");
- A_USB_EP0_SETUP();
- //vWriteUSBFakeData();
- }
-// else if (usb_interrupt_level2 & BIT3)
- if (usb_interrupt_level2 & BIT3)
- {
- vUsb_ep0end();
-// A_PRINTF("![SOURCE_0] ep0 CMD_END\n\r");
- }
- if (usb_interrupt_level2 & BIT4)
- {
- vUsb_ep0fail();
-// A_PRINTF("![SOURCE_0] ep0 CMD_FAIL\n\r");
- }
- if (eUsbCxFinishAction == ACT_STALL)
- {
- // set CX_STL to stall Endpoint0 & will also clear FIFO0
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x04);
-// A_PRINTF("![USB] ZM_CX_CONFIG_STATUS_REG = 0x04\n\r");
- }
- else if (eUsbCxFinishAction == ACT_DONE)
- {
- // set CX_DONE to indicate the transmistion of control frame
- USB_BYTE_REG_WRITE(ZM_CX_CONFIG_STATUS_OFFSET, 0x01);
- }
- eUsbCxFinishAction = ACT_IDLE;
- }
-
- if (usb_interrupt_level1 & BIT7) //Group Byte 7
- {
- //usb_interrupt_level2 = ZM_INTR_SOURCE_7_REG;
- usb_interrupt_level2 = USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET);
-
-#if 0
- if (usb_interrupt_level2 & BIT7)
- {
- vUsb_Data_Out0Byte();
-// A_PRINTF("![SOURCE_7] bit7 on, clear it\n\r");
- }
- if (usb_interrupt_level2 & BIT6)
- {
- vUsb_Data_In0Byte();
-// A_PRINTF("![SOURCE_7] bit6 on, clear it\n\r");
- }
-#endif
-
- if (usb_interrupt_level2 & BIT1)
- {
- vUsb_rst();
- //USB_BYTE_REG_WRITE(ZM_INTR_SOURCE_7_REG, (USB_BYTE_REG_READ(ZM_INTR_SOURCE_7_OFFSET)&~0x2));
- A_PRINTF("!USB reset\n\r");
-// A_PRINTF("![0x1012c]: %\n\r", USB_WORD_REG_READ(0x12c));
- }
- if (usb_interrupt_level2 & BIT2)
- {
- // TBD: the suspend resume code should put here, Ryan, 07/18
- //
- // issue, jump back to rom code and what peripherals should we reset here?
- //
-
- /* Set GO_TO_SUSPEND bit to USB main control register */
- vUsb_suspend();
- A_PRINTF("!USB suspend\n\r");
-
- // keep the record of suspend
-#if defined(PROJECT_MAGPIE)
- *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) = SUS_MAGIC_PATTERN;
-#elif defined(PROJECT_K2)
- HAL_WORD_REG_WRITE(MAGPIE_REG_RST_STATUS_ADDR, SUS_MAGIC_PATTERN);
-#endif /* #if defined(PROJECT_MAGPIE) */
-
- /* Reset USB FIFO */
- A_USB_RESET_FIFO();
-
- /* Turn off power */
- A_USB_POWER_OFF();
-
-// DON'T restart when not in ASIC
-#if defined(MAGPIE_ASIC)
- /* Jump to boot code */
- A_USB_JUMP_BOOT();
-#endif
-
- }
- if (usb_interrupt_level2 & BIT3)
- {
- vUsb_resm();
- A_PRINTF("!USB resume\n\r");
- }
- }
-
-}
-
-#if 0 // old
-
-void _usb_init(void)
-{
-
-// init variables
-// u16TxRxCounter = 0;
-// eUsbCxCommand = CMD_VOID;
-// u8UsbConfigValue = 0;
- u8UsbInterfaceValue = 0;
- u8UsbInterfaceAlternateSetting = 0;
-// bUsbEP0HaltSt = FALSE;
-// u16FirmwareComplete = 0;
-// eUsbCxFinishAction = ACT_IDLE;
- UsbStatus[0] = !fBUS_POWER;
-
-// init hardware
-
-// cFUSB200Init();
- A_USB_INIT_PHY();
-
- //ZM_PHY_TEST_SELECT_REG = 0; // Plug In
- USB_BYTE_REG_WRITE(ZM_PHY_TEST_SELECT_OFFSET, 0x0);
-
- // reset the address, just in case...
- //USB_BYTE_REG_WRITE(ZM_DEVICE_ADDRESS_OFFSET, 0x0);
-
-}
-
-#else // new
-
-#if defined(PROJECT_MAGPIE)
-
-/* - spec, ch11, reset
- *
- * 1. turn on ETH PLL and set ETH PLL to 384Mhz
- * 2. set "USB_DMA, USB_CORE, ETH_PLL, CPU_PLL, USB_POR reset" bit
- * 3. clear "ETH_PLL, CPU_PLL" reset bit
- * 4. set USB divider to 48, 192/16=12
- * 5. disable ETH PLL bypass
- * 6. clear USB_POR
- * 7. clear USB_DMA, USB_CORE
- * 8. enable USB_AHB_ARB
- *
- * note: don't know why bit3, bit4 should deassert? here especially bit4?
- * since if we don't deassert this, clk won't come up
- *
- */
-#if defined(MAGPIE_ASIC)
-#define RST_USB_COLD_INIT() \
-{ \
- /********* number of PLLDIV_LOW and PLLDIV_HIGH ***********/ \
- /*HAL_WORD_REG_WRITE(MAGPIE_REG_USB_DIVIDE_ADDR,((0x8<<8)|0x8)); */ \
- /* 1. */ HAL_WORD_REG_WRITE(MAGPIE_REG_ETH_PLL_ADDR, 0x305); \
- /* 2. */ HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)|(BIT0|BIT1|BIT2|BIT3|BIT4))); \
- /* 3. */ HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)&(~(BIT1|BIT2)))); \
- /* 4. */ HAL_WORD_REG_WRITE(MAGPIE_REG_USB_DIVIDE_ADDR, 0x1010); \
- /* 5. */ HAL_WORD_REG_WRITE(MAGPIE_REG_ETH_PLL_BYPASS_ADDR, 0x0); \
- A_DELAY_USECS(100); /* wait for clock source stable */ \
- /* 6. */ HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)&(~(BIT0)))); \
- /* 7. */ HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)&(~(BIT3|BIT4)))); \
- /* 8. */ HAL_WORD_REG_WRITE(MAGPIE_REG_AHB_ARB_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_AHB_ARB_ADDR)|BIT2)); \
- /* HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, ); */ \
- /* HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)|((BIT0|BIT3|BIT4)))); */ \
- /* HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)&(~(BIT0|BIT3|BIT4)))); */ \
-}
-
-/* - back from suspend
- *
- * 1. turn on ETH PLL , 0x5600c, ~bit0
- * 2. clear USB SUSPEND_ENABLE, 0x56030, ~bit0
- *
- */
-#define RST_USB_SUSP_INIT() \
-{ \
- /* 1. */ HAL_WORD_REG_WRITE(MAGPIE_REG_ETH_PLL_BYPASS_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_ETH_PLL_BYPASS_ADDR)&(~BIT0))); \
- /* 2. */ HAL_WORD_REG_WRITE(MAGPIE_REG_SUSPEND_ENABLE_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_SUSPEND_ENABLE_ADDR)&(~BIT0))); \
-}
-
-/* - back from watchdog
- *
- */
-#define RST_USB_WDT_INIT()
-
-
-#elif defined(MAGPIE_FPGA)
-// fpag don't have PLL, skip 1~5
-#define RST_USB_COLD_INIT() \
-{ \
- /* 6. */ HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)&(~(BIT0)))); \
- /* 7. */ HAL_WORD_REG_WRITE(MAGPIE_REG_RST_RESET_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)&(~(BIT3|BIT4)))); \
- /* 8. */ HAL_WORD_REG_WRITE(MAGPIE_REG_AHB_ARB_ADDR, \
- (HAL_WORD_REG_READ(MAGPIE_REG_RST_RESET_ADDR)|BIT2)); \
- A_DELAY_USECS(100); /* wait for clock source stable */ \
-}
-
-/* - back from suspend
- *
- */
-#define RST_USB_SUSP_INIT()
-
-/* - back from watchdog
- *
- */
-#define RST_USB_WDT_INIT()
-
-
-#endif
-
-
-#elif defined(PROJECT_K2)
-#define RST_USB_INIT() \
-{ \
- HAL_WORD_REG_WRITE(MAGPIE_REG_RST_PWDN_CTRL_ADDR, HAL_WORD_REG_READ(MAGPIE_REG_RST_PWDN_CTRL_ADDR)|BIT12); \
- A_DELAY_USECS(10); \
- HAL_WORD_REG_WRITE(MAGPIE_REG_RST_PWDN_CTRL_ADDR, HAL_WORD_REG_READ(MAGPIE_REG_RST_PWDN_CTRL_ADDR)&(~BIT12)); \
-}
-#endif
-/*
- @ToDo: this is used to enable usb access internal memory, dma need this
- HAL_WORD_REG_WRITE(MAGPIE_REG_AHB_ARB_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_AHB_ARB_ADDR)&(~(BIT2)))); \
- A_DELAY_USECS(20); \
- HAL_WORD_REG_WRITE(MAGPIE_REG_AHB_ARB_ADDR, (HAL_WORD_REG_READ(MAGPIE_REG_AHB_ARB_ADDR)|(BIT2))); \
- A_DELAY_USECS(20); \
-*/
-
-
-LOCAL void _usb_clk_init(void)
-{
- T_BOOT_TYPE mBootMode;
-
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x31;
-
- mBootMode = A_WDT_LASTBOOT();
-
-#if defined(PROJECT_MAGPIE)
-
- if( mBootMode == ENUM_WDT_BOOT )
- {
- RST_USB_WDT_INIT();
- }
- else if ( mBootMode == ENUM_SUSP_BOOT )
- {
- RST_USB_SUSP_INIT();
- }
- else
- {
- RST_USB_COLD_INIT();
- }
-
-#elif defined(PROJECT_K2)
- if( mBootMode == ENUM_COLD_BOOT )
- {
- RST_USB_INIT();
- }
-#endif
-
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x32;
-
- //A_DELAY_USECS(300); // delay 300 micro seconds, wait for clock stable!
-}
-
-
-void _usb_init(void)
-{
- u32_t cold_start;
-
-// A_PUTS("\n - _usb_init - \n\r");
-
-#if defined(PROJECT_MAGPIE)
- //if ( *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == WDT_MAGIC_PATTERN || *((volatile uint32_t*)WATCH_DOG_MAGIC_PATTERN_ADDR) == SUS_MAGIC_PATTERN )
- if( A_WDT_LASTBOOT()!= ENUM_COLD_BOOT)
-#elif defined(PROJECT_K2)
- if (HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == WDT_MAGIC_PATTERN || HAL_WORD_REG_READ(MAGPIE_REG_RST_STATUS_ADDR) == SUS_MAGIC_PATTERN)
-#endif /* #if defined(PROJECT_MAGPIE) */
- cold_start = 0;
- else
- cold_start = 1;
-
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x30;
-// init variables
-// u16TxRxCounter = 0;
-// eUsbCxCommand = CMD_VOID;
-// u8UsbConfigValue = 0;
- u8UsbInterfaceValue = 0;
- u8UsbInterfaceAlternateSetting = 0;
-// bUsbEP0HaltSt = FALSE;
-// u16FirmwareComplete = 0;
-// eUsbCxFinishAction = ACT_IDLE;
- UsbStatus[0] = !fBUS_POWER;
-
-
-/*!
- * move the setting to A_USB_CLK_INIT(), so that we could patch these things
- */
-#if 1
- A_USB_CLK_INIT();
-
-#else
-
-#if defined(PROJECT_MAGPIE)
-
-//#if defined(MAGPIE_ASIC)
- //
- // @Bug 36267 - wdt reset or other reset will reset usb phy, we need to init again here
- // - this won't work at FPGA, skip this checking if build for FPGA
- //
- // @Bug 36947 - L3 fpga's reset behavior of usb is not as what I expect!, need to confirm
- //
- // ToBeNote: if (Bug36947), skip the checking and reset usb anyway, but will see the connection broken
-// if (cold_start)
-//#endif
- A_USB_CLK_INIT();
-#elif defined(PROJECT_K2)
- if (cold_start)
- {
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x31;
- RST_USB_INIT();
- }
-#endif /* #if defined(PROJECT_MAGPIE) */
-
-#endif
-
- A_DELAY_USECS(300); // delay 300 usecs, wait for clock stable!
-
- while( 1 )
- {
- /*
- * wait for USBSOC_HCLK_RDY tight high, indicate the 30Mhz is ready for use
- */
- if(HAL_WORD_REG_READ(0x10128)& BIT8)
- break;
-
- //A_DELAY_USECS(200); // delay 200 micro seconds, wait for clock stable!
- }
-
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x33;
- A_PUTS("6. usb_hclk rdy\n\r");
-
- //
- // @Bug 36267 - wdt reset or other reset will reset usb phy, we need to init again here
- //
- // @Bug 36947 - L3 fpga's reset behavior of usb is not as what I expect!, need to confirm
-#if defined(PROJECT_MAGPIE)
-
- // in cold or suspend boot, we do reinit the USB_PHY, skip only when watchdog start
- //
- //
-#if defined(MAGPIE_ASIC)
- if (cold_start)
-#endif
-#elif defined(PROJECT_K2)
- if (cold_start)
-#endif /* #if defined(PROJECT_MAGPIE) */
- {
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x34;
- A_USB_INIT_PHY();
-
- DEBUG_SYSTEM_STATE = (DEBUG_SYSTEM_STATE&(~0xff)) | 0x35;
- //ZM_PHY_TEST_SELECT_REG = 0; // Plug In
- USB_BYTE_REG_WRITE(ZM_PHY_TEST_SELECT_OFFSET, 0x0);
-
- // reset the address, just in case...
- //USB_BYTE_REG_WRITE(ZM_DEVICE_ADDRESS_OFFSET, 0x0);
- }
-
- /* If watchdog reset happens, target needs to send a message to host through EP3 */
- if ( A_WDT_LASTBOOT() == ENUM_WDT_BOOT )
- mUSB_STATUS_IN_INT_ENABLE();
- else
- mUSB_STATUS_IN_INT_DISABLE();
-
-}
-
-#endif
-
-////////////////////////////////////////////////////////
-void usbfifo_module_install(struct usbfifo_api *apis)
-{
- /* hook in APIs */
- apis->_init = _usbfifo_init;
- apis->_enable_event_isr = _usbfifo_enable_event_isr;
-}
-
-
-void cmnos_usb_module_install(struct usb_api *apis)
-{
- apis->_usb_init = _usb_init;
- apis->_usb_rom_task = _usb_rom_task;
- apis->_usb_fw_task = _usb_fw_task;
- apis->_usb_init_phy = cFUSB200Init;
-
- apis->_usb_ep0_setup = vUsb_ep0setup;
- apis->_usb_ep0_tx_data = vUsbEP0TxData;
- apis->_usb_ep0_rx_data = vUsbEP0RxData;
-
- apis->_usb_get_configuration = bGet_configuration;
- apis->_usb_set_configuration = bSet_configuration;
-
- apis->_usb_get_interface = bGet_interface;
- apis->_usb_set_interface = bSet_interface;
-
- apis->_usb_standard_cmd = bStandardCommand;
- apis->_usb_vendor_cmd = VendorCommand;
-
- apis->_usb_reset_fifo= zfResetUSBFIFO;
- apis->_usb_power_off = zfTurnOffPower;
- apis->_usb_gen_wdt = zfGenWatchDogEvent;
- apis->_usb_jump_boot = zfJumpToBootCode;
-
- apis->_usb_get_descriptor = bGet_descriptor;
- apis->_usb_set_address = bSet_address;
- apis->_usb_set_feature = bSet_feature;
- apis->_usb_clr_feature = bClear_feature;
-
- apis->_usb_get_status = bGet_status;
- apis->_usb_setup_desc = vUsb_SetupDescriptor;
-
- apis->_usb_reg_out = vUsb_Reg_Out;
- apis->_usb_status_in = vUsb_Status_In;
-
- apis->_usb_ep0_tx = vUsb_ep0tx;
- apis->_usb_ep0_rx = vUsb_ep0rx;
-
- apis->_usb_clk_init = _usb_clk_init;
-}
-
-#endif