Ejemplo n.º 1
0
void UsbClassRequest()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x02D0); //port address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514);

	//td content 4 bytes
	IOWR(CY7C67200_BASE,HPI_DATA,0x0A21);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//device address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	//in packet
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //don't care
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//port number /data length
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//device address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041); //data 1
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
}
Ejemplo n.º 2
0
void UsbGetDeviceDesc1()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x02D0); //device address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514);

	//td content 4 bytes
	IOWR(CY7C67200_BASE,HPI_DATA,0x0680);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0100); //device 0x01
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);

	//data phase IN
	IOWR(CY7C67200_BASE,HPI_DATA,0x052C); //
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0520);

	//    //status phase
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //don't care
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x0210);//device address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
}
Ejemplo n.º 3
0
void UsbSetAddress()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	// TD #1: 6 writes
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x00D0); //PID and Device Address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001); //TD Control and Transaction Status
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013); //Active Flag and Residue
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514); //Pointer to next TD
	// TASK: Complete with 4 more IOWR functions

	// TD #2: 4 writes
	// TASK: Complete with 4 IOWR functions
	IOWR(CY7C67200_BASE,HPI_DATA,0x0500); //bRequest and bmRequestType
	IOWR(CY7C67200_BASE,HPI_DATA,0x0002); //wValue
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //wIndex
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //wLength
	
	// TD #3: 6 writes
	// TASK: Complete with 6 IOWR functions
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //data buffer base address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //port number and data length
	IOWR(CY7C67200_BASE,HPI_DATA,0x0090); //device address and endpoint number
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041); //TD control and transaction status
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013); //residue and active flag
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //pointer to next TD

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
}
Ejemplo n.º 4
0
void UsbSetAddress()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	// TD #1: 6 writes
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	// TASK: Complete with 4 more IOWR functions
	IOWR(CY7C67200_BASE,HPI_DATA,0x00D0);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514);
	
	


	// TD #2: 4 writes
	// TASK: Complete with 4 IOWR functions
	IOWR(CY7C67200_BASE,HPI_DATA,0x0500);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0002);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	
	// TD #3: 6 writes
	// TASK: Complete with 6 IOWR functions
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0090);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
}
Ejemplo n.º 5
0
alt_u16 UsbWaitTDListDone()
{
	alt_u16 usb_ctl_val;

	usb_ctl_val = UsbRead(HPI_SIE1_MSG_ADR); // STEP 3 j
	UsbWrite(HPI_SIE1_MSG_ADR, 0);
	while (usb_ctl_val != HUSB_TDListDone)  // k, read sie1 msg register
	{
		if(usb_ctl_val == 0x0000)
		{
		}
		else
		{
			printf("[SIE1 MSG]:SIE1 msg reg is %x\n",usb_ctl_val);
		}
		usb_ctl_val = UsbRead(HPI_SIE1_MSG_ADR);
		UsbWrite(HPI_SIE1_MSG_ADR, 0);
	}

	return usb_ctl_val;
}
Ejemplo n.º 6
0
void UsbGetDeviceDesc2()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x02D0); //device address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514);

	//td content 4 bytes
	IOWR(CY7C67200_BASE,HPI_DATA,0x0680);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0100);//e //device 0x01
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//0
	IOWR(CY7C67200_BASE,HPI_DATA,0x0012);//2

	//data phase IN-1
	IOWR(CY7C67200_BASE,HPI_DATA,0x0544); //514
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//6
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0520);//e

	//data phase IN-2
	IOWR(CY7C67200_BASE,HPI_DATA,0x054c); //520
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//6
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x052c);//a

	//data phase IN-3
	IOWR(CY7C67200_BASE,HPI_DATA,0x0554); //c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0002);//e
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//530
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0538);//6

	//status phase
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //538
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0210);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//e
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//540
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//2

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
}
Ejemplo n.º 7
0
/**
 *
 * This function does a software reset of the Cypress CY7C67200 USB controller.
 *
 * @param    UsbBaseAddress is the starting location of the USB internal memory
 *           to which this bin file data is written.
 *
 * @return   None
 *
 * @note     None
 *
 ******************************************************************************/
void UsbSoftReset()
{
	//XIo_Out16(USB_MAILBOX, COMM_RESET);
	IOWR(CY7C67200_BASE,HPI_MAILBOX,COMM_RESET); //COMM_JUMP2CODE
	usleep(100000);
	printf("[USB INIT]:reset finished!\n");

	usleep(500000);
	printf("[USB INIT]:Clear up the interrupt\r\n");
	IORD(CY7C67200_BASE,HPI_MAILBOX);
	IORD(CY7C67200_BASE,HPI_STATUS);

	// Had to add the write due to a bug in BIOS where they overwrite
	// the mailbox after initialization with garbage.  The read clears
	// any pending interrupts.
	UsbRead (HPI_SIE1_MSG_ADR);
	UsbWrite (HPI_SIE1_MSG_ADR, 0);
	UsbRead (HPI_SIE2_MSG_ADR);
	UsbWrite (HPI_SIE2_MSG_ADR, 0);

	UsbWrite (HOST1_STAT_REG, 0xFFFF);
	UsbWrite (HOST2_STAT_REG, 0xFFFF);
}
Ejemplo n.º 8
0
u16 __ARM_UsbSendData(u8* cpSourceBuffer, u16 wSendLength)
{
	u16 wUsbIntMaskReserved;
	u16 wActuralSendSize;
	u32 dwTimeoutCounter;
	u16 wReturnLength;

	wReturnLength = wSendLength;

	while(1)
	{
		wUsbIntMaskReserved = GetCNTR();
		SetCNTR((~USB_CNTR_SOFM)& wUsbIntMaskReserved);			//mask  usb SOF interrupt
		wActuralSendSize = UsbWrite(cpSourceBuffer, wSendLength);
		SetCNTR(wUsbIntMaskReserved);		//restore usb SOF interrupt

		if(wActuralSendSize < wSendLength)		//have some data left due to usb tx buffer full
		{
			wSendLength -= wActuralSendSize;	//adjust send size = unsend data

			dwTimeoutCounter = 0x0110F0000;		//wait a while,  usb tx buffer will release some space
			while(dwTimeoutCounter > 0)			//loop till tx buff is not full
			{
				if(GetUsbTxBufferAvailableLength() != 0)
				{
					break;
				}
				dwTimeoutCounter--;
			}
			if(dwTimeoutCounter == 0)			//timeout means usb tx jammed, go to function end
			{
				break;
			}
		}
		else
		{
			break;
		}
		
		
	}
	
	return wReturnLength;		//AVR original code always return the expected send length, maybe have issue if usb tx timeout
}
Ejemplo n.º 9
0
alt_u16 UsbGetRetryCnt()
{
	alt_u16 usb_ctl_val;

	IORD(CY7C67200_BASE,HPI_STATUS);
	if(UsbRead(HPI_SIE1_MSG_ADR) == HUSB_TDListDone)
	{
		UsbWrite(HPI_SIE1_MSG_ADR, 0);

		while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
		{
		}
	}
	//usleep(1000);
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);

	return usb_ctl_val;
}
Ejemplo n.º 10
0
/*Transfer Com2 received data to USB tx for loop or debug test*/
void UartCom2RxProcess(void)
{
	u16 wCom2RxDataLength;
	//u16 wUsbTxAvailableBufferLength;
	u16 wTransferLength;
	u16 wUsbIntMaskReserved;
	u16 wActualTransferLength;

	
	/*get usb free send buffer length */
	//wUsbTxAvailableBufferLength = GetUsbTxBufferAvailableLength();

	/* get com2 port data length in receive buffer */
	wCom2RxDataLength = GetComRxBufferDataLength(COM2);


	if((USART_RX_DATA_SIZE - wCom2RxBufferStart) < wCom2RxDataLength)	//if rx buffer overturn, only access data till buffer end
	{
		wTransferLength = USART_RX_DATA_SIZE - wCom2RxBufferStart;
		cFlagCom2DataReceived = TRUE;		//flag for rest data process in main loop
	}
	else
	{
		wTransferLength = wCom2RxDataLength;
	}

	wUsbIntMaskReserved = GetCNTR();
	SetCNTR((~USB_CNTR_SOFM)& wUsbIntMaskReserved);			//mask  usb SOF interrupt to prevent SOF break data copy
	wActualTransferLength = UsbWrite(((u8*) (cCom2RxBuffer + wCom2RxBufferStart)), wTransferLength);
	SetCNTR(wUsbIntMaskReserved);		//restore usb SOF interrupt

	wCom2RxBufferStart += wActualTransferLength;
	if(wCom2RxBufferStart == USART_RX_DATA_SIZE)
	{
		wCom2RxBufferStart = 0;
	}

}
Ejemplo n.º 11
0
void UsbGetHidDesc()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x02D0); //port address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514);

	//td content 4 bytes
	IOWR(CY7C67200_BASE,HPI_DATA,0x0681);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x2100);//e //HID 0x21
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//0
	IOWR(CY7C67200_BASE,HPI_DATA,0x007B);//2

	//data phase IN-1
	IOWR(CY7C67200_BASE,HPI_DATA,0x0544); //514
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//6
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0520);//e

	//status phase
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //52c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//e
	IOWR(CY7C67200_BASE,HPI_DATA,0x0210);//530
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//6

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr

}
Ejemplo n.º 12
0
void UsbGetReportDesc()
{
	//the starting address
	IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
	IOWR(CY7C67200_BASE,HPI_DATA,0x050C);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008); //4 port number
	IOWR(CY7C67200_BASE,HPI_DATA,0x02D0); //device address
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);
	IOWR(CY7C67200_BASE,HPI_DATA,0x0514);

	//td content 4 bytes
	IOWR(CY7C67200_BASE,HPI_DATA,0x0681);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x2200);//e //report 0x22
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//0
	IOWR(CY7C67200_BASE,HPI_DATA,0x007B);//2

	//data phase IN-1
	IOWR(CY7C67200_BASE,HPI_DATA,0x0580); //514
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//6
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0520);//e

	//data phase IN-2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0588); //520
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//6 //data0
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x052c);//a

	//data phase IN-3
	IOWR(CY7C67200_BASE,HPI_DATA,0x0590); //52c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//e
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//530
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0538);//6

	//data phase IN-4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0598); //538
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//e //data0
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//540
	IOWR(CY7C67200_BASE,HPI_DATA,0x0544);//2

	//data phase IN-5
	IOWR(CY7C67200_BASE,HPI_DATA,0x05a0); //544
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//6
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//a //data1
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0550);//e

	//data phase IN-6
	IOWR(CY7C67200_BASE,HPI_DATA,0x05a8); //550
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//2
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//6 //data0
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x055c);//a

	//data phase IN-7
	IOWR(CY7C67200_BASE,HPI_DATA,0x05b0); //c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0008);//e
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//560
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//2 //data1
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//4
	IOWR(CY7C67200_BASE,HPI_DATA,0x0568);//6

	//data phase IN-8
	IOWR(CY7C67200_BASE,HPI_DATA,0x05b8); //8
	IOWR(CY7C67200_BASE,HPI_DATA,0x0003);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0290);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//e //data0
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//570
	IOWR(CY7C67200_BASE,HPI_DATA,0x0574);//2

	//status phase
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000); //574
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//6
	IOWR(CY7C67200_BASE,HPI_DATA,0x0210);//8
	IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//a
	IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//c
	IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//e

	UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr

}
Ejemplo n.º 13
0
//----------------------------------------------------------------------------------------//
//
//                                Main function
//
//----------------------------------------------------------------------------------------//
int main(void)
{
	alt_u16 intStat;
	alt_u16 usb_ctl_val;
	static alt_u16 ctl_reg = 0;
	static alt_u16 no_device = 0;
	alt_u16 fs_device = 0;
	int keycode = 0;
	alt_u8 toggle = 0;
	alt_u8 data_size;

	alt_u16 code;
	int i;

	printf("USB keyboard setup...\n\n");

	//----------------------------------------SIE1 initial---------------------------------------------------//
	USB_HOT_PLUG:
	UsbSoftReset();

	// STEP 1a:
	UsbWrite (HPI_SIE1_MSG_ADR, 0);
	UsbWrite (HOST1_STAT_REG, 0xFFFF);

	/* Set HUSB_pEOT time */
	UsbWrite(HUSB_pEOT, 600); // adjust the according to your USB device speed

	usb_ctl_val = SOFEOP1_TO_CPU_EN | RESUME1_TO_HPI_EN;// | SOFEOP1_TO_HPI_EN;
	UsbWrite(HPI_IRQ_ROUTING_REG, usb_ctl_val);

	intStat = A_CHG_IRQ_EN | SOF_EOP_IRQ_EN ;
	UsbWrite(HOST1_IRQ_EN_REG, intStat);
	// STEP 1a end

	// STEP 1b begin
	UsbWrite(COMM_R0,0x0000);//reset time
	UsbWrite(COMM_R1,0x0000);  //port number
	UsbWrite(COMM_R2,0x0000);  //r1
	UsbWrite(COMM_R3,0x0000);  //r1
	UsbWrite(COMM_R4,0x0000);  //r1
	UsbWrite(COMM_R5,0x0000);  //r1
	UsbWrite(COMM_R6,0x0000);  //r1
	UsbWrite(COMM_R7,0x0000);  //r1
	UsbWrite(COMM_R8,0x0000);  //r1
	UsbWrite(COMM_R9,0x0000);  //r1
	UsbWrite(COMM_R10,0x0000);  //r1
	UsbWrite(COMM_R11,0x0000);  //r1
	UsbWrite(COMM_R12,0x0000);  //r1
	UsbWrite(COMM_R13,0x0000);  //r1
	UsbWrite(COMM_INT_NUM,HUSB_SIE1_INIT_INT); //HUSB_SIE1_INIT_INT
	IOWR(CY7C67200_BASE,HPI_MAILBOX,COMM_EXEC_INT);

	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & 0xFFFF) )  //read sie1 msg register
	{
	}
	while (IORD(CY7C67200_BASE,HPI_MAILBOX) != COMM_ACK)
	{
		printf("[ERROR]:routine mailbox data is %x\n",IORD(CY7C67200_BASE,HPI_MAILBOX));
		goto USB_HOT_PLUG;
	}
	// STEP 1b end


	// STEP 2 begin
	//usleep(30*1000);
	UsbWrite(COMM_INT_NUM,HUSB_RESET_INT); //husb reset
	UsbWrite(COMM_R0,0x003c);//reset time
	UsbWrite(COMM_R1,0x0000);  //port number
	UsbWrite(COMM_R2,0x0000);  //r1
	UsbWrite(COMM_R3,0x0000);  //r1
	UsbWrite(COMM_R4,0x0000);  //r1
	UsbWrite(COMM_R5,0x0000);  //r1
	UsbWrite(COMM_R6,0x0000);  //r1
	UsbWrite(COMM_R7,0x0000);  //r1
	UsbWrite(COMM_R8,0x0000);  //r1
	UsbWrite(COMM_R9,0x0000);  //r1
	UsbWrite(COMM_R10,0x0000);  //r1
	UsbWrite(COMM_R11,0x0000);  //r1
	UsbWrite(COMM_R12,0x0000);  //r1
	UsbWrite(COMM_R13,0x0000);  //r1

	IOWR(CY7C67200_BASE,HPI_MAILBOX,COMM_EXEC_INT);

	while (IORD(CY7C67200_BASE,HPI_MAILBOX) != COMM_ACK)
	{
		printf("[ERROR]:routine mailbox data is %x\n",IORD(CY7C67200_BASE,HPI_MAILBOX));
		goto USB_HOT_PLUG;
	}
	// STEP 2 end

	//usleep(30*1000);
	ctl_reg = USB1_CTL_REG;
	no_device = (A_DP_STAT | A_DM_STAT);
	fs_device = A_DP_STAT;

	usb_ctl_val = UsbRead(ctl_reg);

	if (!(usb_ctl_val & no_device))
	{
		printf("\n[INFO]: no device is present in SIE1!\n");
		printf("[INFO]: please insert a USB keyboard in SIE1!\n");
		while (!(usb_ctl_val & no_device))
		{
			usb_ctl_val = UsbRead(ctl_reg);
			if(usb_ctl_val & no_device)
				goto USB_HOT_PLUG;

			usleep(2000);
		}
	}
	else
	{
		/* check for low speed or full speed by reading D+ and D- lines */
		if (usb_ctl_val & fs_device)
		{
			printf("[INFO]: full speed device\n");
		}
		else
		{
			printf("[INFO]: low speed device\n");
		}
	}


	//printf("[SIE1 INIT]:USB 1 Control Register reg is %x\n",UsbRead(0xC08A));

	// STEP 3 begin
	//------------------------------------------------------set address -----------------------------------------------------------------
	UsbSetAddress();

	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		UsbSetAddress();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506); // i
	printf("[ENUM PROCESS]:step 3 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508); // n
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 3 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03) // retries occurred
	{
		usb_ctl_val = UsbGetRetryCnt();

		goto USB_HOT_PLUG;
	}

	printf("------------[ENUM PROCESS]:set address done!---------------\n");

	// STEP 4 begin
	//-------------------------------get device descriptor-1 -----------------------------------//
	// TASK: Call the appropriate function for this step.

	UsbGetDeviceDesc1();

	usleep(10*1000);
	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		// TASK: Call the appropriate function again if it wasn't processed successfully.
		UsbGetDeviceDesc1();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 4 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 4 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}

	printf("---------------[ENUM PROCESS]:get device descriptor-1 done!-----------------\n");


	//--------------------------------get device descriptor-2---------------------------------------------//
	//get device descriptor
	// TASK: Call the appropriate function for this step.

	UsbGetDeviceDesc2();

	usleep(100*1000);
	//if no message
	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		//resend the get device descriptor
		//get device descriptor
		// TASK: Call the appropriate function again if it wasn't processed successfully.

		UsbGetDeviceDesc2();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 4 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 4 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}

	printf("------------[ENUM PROCESS]:get device descriptor-2 done!--------------\n");


	// STEP 5 begin
	//-----------------------------------get configuration descriptor -1 ----------------------------------//
	// TASK: Call the appropriate function for this step.

	UsbGetConfigDesc1();
	usleep(10*1000);
	//if no message
	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		//resend the get device descriptor
		//get device descriptor

		// TASK: Call the appropriate function again if it wasn't processed successfully.
		UsbGetConfigDesc1();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 5 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 5 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}
	printf("------------[ENUM PROCESS]:get configuration descriptor-1 pass------------\n");

	// STEP 6 begin
	//-----------------------------------get configuration descriptor-2------------------------------------//
	//get device descriptor
	// TASK: Call the appropriate function for this step.

	UsbGetConfigDesc2();
	usleep(100*1000);
	//if no message
	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		// TASK: Call the appropriate function again if it wasn't processed successfully.
		UsbGetConfigDesc2();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 6 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 6 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}


	printf("-----------[ENUM PROCESS]:get configuration descriptor-2 done!------------\n");


	// ---------------------------------get device info---------------------------------------------//

	UsbPrintMem();
	// TASK: Write the address to read from the memory for byte 7 of the interface descriptor to HPI_ADDR.
	//UsbWrite(HPI_ADDR,0x056C);
	IOWR(CY7C67200_BASE,HPI_ADDR,0x56c);

	code = IORD(CY7C67200_BASE,HPI_DATA);
	printf("\ncode = %x\n", code);
	code = code & 0x0003;
	if (code == 0x01)
	{
		printf("\n[INFO]:check TD rec data7 \n[INFO]:Keyboard Detected!!!\n\n");
	}
	else
	{
		//printf("\nvalue= %x\n", code);
		printf("\n[INFO]:Keyboard Not Detected!!! \n\n");
	}

	// TASK: Write the address to read from the memory for the endpoint descriptor to HPI_ADDR.
	//UsbWrite(HPI_DATA,0x56C);
	//IOWR(CY7C67200_BASE,HPI_ADDR,0x0578);
	//data_size = (IORD(CY7C67200_BASE,HPI_DATA)>>8)&0x00ff;
	data_size=8;
	printf("[ENUM PROCESS]:data packet size is %d\n",data_size);

	// STEP 7 begin
	//------------------------------------set configuration -----------------------------------------//
	// TASK: Call the appropriate function for this step.
	usleep(10*1000);
	UsbSetConfig();
	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		// TASK: Call the appropriate function again if it wasn't processed successfully.

		usleep(10*1000);
		UsbSetConfig();
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 7 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 7 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}

	printf("------------[ENUM PROCESS]:set configuration done!-------------------\n");

	//----------------------------------------------class request out ------------------------------------------//
	// TASK: Call the appropriate function for this step.
	UsbClassRequest();
	usleep(10*1000);

	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		// TASK: Call the appropriate function again if it wasn't processed successfully.
		UsbClassRequest();
		usleep(10*1000);

	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 8 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 8 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}


	printf("------------[ENUM PROCESS]:class request out done!-------------------\n");

	// STEP 8 begin
	//----------------------------------get descriptor(class 0x21 = HID) request out --------------------------------//
	// TASK: Call the appropriate function for this step.
	UsbGetHidDesc();
	usleep(10*1000);

	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		// TASK: Call the appropriate function again if it wasn't processed successfully.
		UsbGetHidDesc();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]:step 8 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]:step 8 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}

	printf("------------[ENUM PROCESS]:get descriptor (class 0x21) done!-------------------\n");

	// STEP 9 begin
	//-------------------------------get descriptor (class 0x22 = report)-------------------------------------------//
	// TASK: Call the appropriate function for this step.
	UsbGetReportDesc();
	usleep(100*1000);
	//if no message
	while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
	{
		// TASK: Call the appropriate function again if it wasn't processed successfully.
		UsbGetReportDesc();
		usleep(10*1000);
	}

	UsbWaitTDListDone();

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0506);
	printf("[ENUM PROCESS]: step 9 TD Status Byte is %x\n",IORD(CY7C67200_BASE,HPI_DATA));

	IOWR(CY7C67200_BASE,HPI_ADDR,0x0508);
	usb_ctl_val = IORD(CY7C67200_BASE,HPI_DATA);
	printf("[ENUM PROCESS]: step 9 TD Control Byte is %x\n",usb_ctl_val);
	while (usb_ctl_val != 0x03)
	{
		usb_ctl_val = UsbGetRetryCnt();
	}

	printf("---------------[ENUM PROCESS]:get descriptor (class 0x22) done!----------------\n");



	//-----------------------------------get keycode value------------------------------------------------//
	usleep(10000);
	while(1)
	{
		toggle++;
		IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
		//data phase IN-1
		IOWR(CY7C67200_BASE,HPI_DATA,0x051c); //500

		IOWR(CY7C67200_BASE,HPI_DATA,0x000f & data_size);//2 data length

		IOWR(CY7C67200_BASE,HPI_DATA,0x0291);//4 //endpoint 1
		if(toggle%2)
		{
			IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//6 //data 1
		}
		else
		{
			IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//6 //data 1
		}
		IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//8
		IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//a
		UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
		//usleep(10*1000);
		while (!(IORD(CY7C67200_BASE,HPI_STATUS) & HPI_STATUS_SIE1msg_FLAG) )  //read sie1 msg register
		{
			IOWR(CY7C67200_BASE,HPI_ADDR,0x0500); //the start address
			//data phase IN-1
			IOWR(CY7C67200_BASE,HPI_DATA,0x051c); //500

			IOWR(CY7C67200_BASE,HPI_DATA,0x000f & data_size);//2 data length

			IOWR(CY7C67200_BASE,HPI_DATA,0x0291);//4 //endpoint 1
			if(toggle%2)
			{
				IOWR(CY7C67200_BASE,HPI_DATA,0x0001);//6 //data 1
			}
			else
			{
				IOWR(CY7C67200_BASE,HPI_DATA,0x0041);//6 //data 1
			}
			IOWR(CY7C67200_BASE,HPI_DATA,0x0013);//8
			IOWR(CY7C67200_BASE,HPI_DATA,0x0000);//
			UsbWrite(HUSB_SIE1_pCurrentTDPtr,0x0500); //HUSB_SIE1_pCurrentTDPtr
			usleep(10*1000);
		}//end while


		usb_ctl_val = UsbWaitTDListDone();

		// packet starts from 0x051c, reading third byte
		// TASK: Write the address to read from the memory for byte 3 of the report descriptor to HPI_ADDR.
		IOWR(CY7C67200_BASE,HPI_ADDR,0x051E);
		keycode = IORD(CY7C67200_BASE,HPI_DATA);
		printf("\nfirst two keycode values are %04x\n",keycode);
		IOWR(KEYCODE_BASE, 0, keycode & 0xff);
		usleep(5*1000);
		//USB hot plug routine
		usb_ctl_val = UsbRead(ctl_reg);
		usleep(5*1000);
		usb_ctl_val = UsbRead(ctl_reg);
		usleep(5*1000);
		usb_ctl_val = UsbRead(ctl_reg);
		usleep(5*1000);
		usb_ctl_val = UsbRead(ctl_reg);
		usleep(5*1000);
		usb_ctl_val = UsbRead(ctl_reg);
		usleep(5*1000);
		usb_ctl_val = UsbRead(ctl_reg);
		usleep(5*1000);

		if(!(usb_ctl_val & no_device))
		{
			printf("\n[INFO]: the keyboard has been removed!!! \n");
			printf("[INFO]: please insert again!!! \n");
		};
		usleep(5000);
		usb_ctl_val = UsbRead(ctl_reg);
		while (!(usb_ctl_val & no_device))
		{

			usb_ctl_val = UsbRead(ctl_reg);
			usleep(5*1000);
			usb_ctl_val = UsbRead(ctl_reg);
			usleep(5*1000);
			usb_ctl_val = UsbRead(ctl_reg);
			usleep(5*1000);

			if(usb_ctl_val & no_device)
				goto USB_HOT_PLUG;

			usleep(200);

		}

	}//end while

	return 0;
}