/定义配置,接口,端点等描述符结构体,因为它们是随配置描述符一起返回的 typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT { CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor; INTERFACE_DESCRIPTOR_STRUCT interface_descriptor; HID_DESCRIPTOR_STRUCT hid_descriptor; ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER]; }CON_INT_ENDP_DESCRIPTOR_STRUCT;
code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor= { //configuration_descriptor //配置描述符 { sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字节数大小 CONFIGURATION_DESCRIPTOR, //配置描述符类型编号 SWAP16(sizeof(CON_INT_ENDP_DESCRIPTOR_STRUCT)), 0x01, //只包含一个接口 0x01, //该配置的编号 0x00, //iConfiguration字段 0xA0, //采用总线供电,支持远程唤醒 0xC8 //从总线获取最大电流400mA }, //interface_descritor //接口描述符 { sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字节数大小 INTERFACE_DESCRIPTOR, //接口描述符类型编号 0x00, //接口编号为0 0x00, //该接口描述符的编号 ENDPOINT_NUMBER, //非0端点数量为2,只使用端点主端点输入和输出 0x03, //人机接口设备(HID)类 0x01, //使用的子类:支持BIOS根启动Boot的子类 0x01, //使用的协议:键盘 0x00 //接口描述符字符串索引 },
code uint8 HeadTable[][74]={ "********************************************************************
", "****** EDN USB学习板键盘程序 ******
", "****** AT89S52 CPU ******
", "****** 建立日期:",__DATE__," ******
", "****** 建立时间:",__TIME__," ******
", "****** 作者:电脑圈圈 ******
", "****** 欢迎访问作者的 ******
", "****** USB专区:http://group.**/93/ ******
", "****** BLOG1:http://www.**/blog/computer00 ******
", "****** BLOG2:http://computer00.21ic.org ******
", "****** 请按K1-K8分别进行测试 ******
", "****** K1:左Ctrl键 K2:左Shift键 K3:左Alt键 K4:0键 ******
", "****** K5:1键 K6:2键 K7:Caps Lock键 K8:Num Lock键 ******
", "********************************************************************
", };
/***************************主函数**********************************************/ void main(void) { uint8 i; InitUART(); //串口初始化 Printc(0x0c); //清屏 Printc(0x0c); Prints("系统启动.
"); for(i=0;i<18;i++) //显示信息 { Prints(HeadTable); } disconnect_usb(); //断开USB连接 delay(1000); //延迟 init_usb(); //初始化USB芯片 connect_usb(); //连接USB InitKeyboard(); //
while(1) { if(!USB_INT) //中断产生 { read_interrupt_register(); if(Interrupt_Register.Interrupt.bus_reset){usb_bus_reset();continue;} if(Interrupt_Register.Interrupt.suspend_change){usb_bus_suspend();continue;} if(Interrupt_Register.Interrupt.control_out_port){endp0_out();continue;} if(Interrupt_Register.Interrupt.control_in_port&&usb_flags.flags.usb_endp0_in){endp0_in();continue;} // if(Interrupt_Register.Interrupt.port_out_1)endp1_out(); // if(Interrupt_Register.Interrupt.port_in_1)endp1_in(); if(Interrupt_Register.Interrupt.main_out_port){endp2_out();} if(Interrupt_Register.Interrupt.main_in_port){endp2_in();} } } } /******************************************************************************/ |