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 }
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 }
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 }
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 }
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; }
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 }
/** * * 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); }
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 }
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; }
/*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; } }
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 }
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 }
//----------------------------------------------------------------------------------------// // // 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; }