void main(void) { u16 id; InitUart(); InitKeyBoard(); //*********************************** // Prints("adfasdfadsfasf"); // LightUpLed(LED1); // TurnOffLed(LED2); Prints("\nGetting chip ID..."); D12ReadID(&id); PrintShortIntHex(id); Prints(",over\n"); USBConnect(); //************************************ while(1); }
void UsbEp0Out(void) { #ifdef DEBUG Prints("USB ep0 out interrupt.\r\n"); #endif if(D12ReadEndPointLastStatus(0)&0x20) { D12ReadEndPointBuffer(0,16,Buffer); D12AckSetup(); D12ClearBuffer(); bmRequestType=Buffer[0]; bRequest=Buffer[1]; wValue=Buffer[2]+(((u16)Buffer[3])<<8); wIndex=Buffer[4]+(((u16)Buffer[5])<<8); wLength=Buffer[6]+(((u16)Buffer[7])<<8); if((bmRequestType&0x80)==0x80) { switch((bmRequestType>>5)&0x03) { case 0: #ifdef DEBUG Prints("USB Standard in request.\r\n"); #endif switch(bRequest) { case GET_CONFIGURATION: #ifdef DEBUG Prints("Get configuration.\r\n"); #endif break; case GET_DESCRIPTOR: #ifdef DEBUG Prints("Get descriptor.\r\n"); #endif switch((wValue>>8)&0xff) { case DEVICE_DESCRIPTOR: #ifdef DEBUG Prints("-Get device descriptor.\r\n"); #endif pSendData=DeviceDescriptor; if(wLength>DeviceDescriptor[0]) { #ifdef DEBUG Prints("Host want length of device descriptor is:"); PrintShortIntHex(DeviceDescriptor[0]); Prints("\r\n"); #endif SendLength=DeviceDescriptor[0]; if(SendLength%DeviceDescriptor[7]==0) { NeedZeroPacket=1; } } else { SendLength=wLength; } UsbEp0SendData(); break; case CONFIGURATION_DESCRIPTOR: #ifdef DEBUG Prints("-Get configuration descriptor.\r\n"); #endif pSendData=ConfigurationDescriptor; SendLength=ConfigurationDescriptor[3]; SendLength=SendLength*256+ConfigurationDescriptor[2]; if(wLength>SendLength) { if(SendLength%DeviceDescriptor[7]==0) { NeedZeroPacket=1; } } else { SendLength=wLength; } UsbEp0SendData(); break; case STRING_DESCRIPTOR: #ifdef DEBUG Prints("-Get string descriptor.\r\n"); #endif switch(wValue&0xff) { case 0: #ifdef DEBUG Prints("--Get Language ID.\r\n"); #endif pSendData=LanguageId; SendLength=LanguageId[0]; break; case 1: #ifdef DEBUG Prints("--Get Manufacturer string.\r\n"); #endif pSendData=ManufacturerStringDescriptor; SendLength=ManufacturerStringDescriptor[0]; break; case 2: #ifdef DEBUG Prints("--Get product string.\r\n"); #endif pSendData=ProductStringDescriptor; SendLength=ProductStringDescriptor[0]; break; case 3: #ifdef DEBUG Prints("--Get serial string.\r\n"); #endif pSendData=SerialNumberStringDescriptor; SendLength=SerialNumberStringDescriptor[0]; break; default: #ifdef DEBUG Prints("Undefined index.\r\n"); #endif SendLength=0; NeedZeroPacket=1; break; } if(wLength>SendLength) { if(SendLength%DeviceDescriptor[7]==0) NeedZeroPacket=1; } else { SendLength=wLength; } UsbEp0SendData(); break; case REPORT_DESCRIPTOR: #ifdef DEBUG Prints("Get report descriptor.\r\n"); #endif if(wLength>SendLength) { pSendData=ReportDescriptor; SendLength=sizeof(ReportDescriptor); if(wLength%DeviceDescriptor[7]==0) { NeedZeroPacket=1; } else { SendLength=wLength; } UsbEp0SendData(); } break; default: #ifdef DEBUG Prints("-Get other descriptor(unrecognized).\r\n"); #endif break; } break; case GET_INTERFACE: #ifdef DEBUG Prints("Get Interface.\r\n"); #endif break; case GET_STATUS: #ifdef DEBUG Prints("Get status.\r\n"); #endif break; case SYNCH_FRAME: #ifdef DEBUG Prints("Synch frame.\r\n"); #endif break; default: #ifdef DEBUG Prints("Error,undefined standard device request.\r\n"); #endif break; } break; case 1: //Class request. #ifdef DEBUG Prints("Class request.\r\n"); #endif break; case 2: //³§ÉÌÇëÇó #ifdef DEBUG Prints("Vendor request.\r\n"); #endif break; default: #ifdef DEBUG Prints("Error,undefined request.\r\n"); #endif break; } } else { switch((bmRequestType>>5)&0x03)
/******************************************************************** 函数功能:主函数。 入口参数:无。 返 回:无。 备 注:无。 ********************************************************************/ void main(void) //主函数 { uint8 i; uint16 id; uint8 InterruptSource; EA=1; //打开中断 InitKeyboard(); //初始化按键 InitUART(); //初始化串口 for(i=0;i<18;i++) //显示信息 { Prints(HeadTable[i]); } id=D12ReadID(); Prints("Your D12 chip\'s ID is: "); PrintShortIntHex(id); if(id==0x1012) { Prints(". ID is correct! Congratulations!\r\n\r\n"); } else { Prints(". ID is incorrect! What a pity!\r\n\r\n"); } UsbDisconnect(); //先断开USB连接 UsbConnect(); //将USB连接上 ConfigValue=0; //配置值初始化为0 while(1) //死循环 { if(D12GetIntPin()==0) //如果有中断发生 { D12WriteCommand(READ_INTERRUPT_REGISTER); //写读中断寄存器的命令 InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器 if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理 if(InterruptSource&0x40)UsbBusReset(); //总线复位中断处理 if(InterruptSource&0x01)UsbEp0Out(); //端点0输出中断处理 if(InterruptSource&0x02)UsbEp0In(); //端点0输入中断处理 if(InterruptSource&0x04)UsbEp1Out(); //端点1输出中断处理 if(InterruptSource&0x08)UsbEp1In(); //端点1输入中断处理 if(InterruptSource&0x10)UsbEp2Out(); //端点2输出中断处理 if(InterruptSource&0x20)UsbEp2In(); //端点2输入中断处理 } if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回报告数据 { LEDs=~KeyPress; //利用板上8个LED显示按键状态,按下时亮 if(!Ep1InIsBusy) //如果端点1输入没有处于忙状态,则可以发送数据 { KeyCanChange=0; //禁止按键扫描 if(KeyUp||KeyDown||KeyPress) //如果有按键事件发生 { SendReport(); //则返回报告 } KeyCanChange=1; //允许按键扫描 } } } }