📄 usbkeyboard.c
字号:
/**********************设置协议**************************************************/
void set_protocol(void)
{
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
protocol=Control_Data.DeviceRequest.wValue;
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/****************************端点0输入处理**************************************/
void endp0_in(void)
//输入处理必须是先有一个设置命令或者数据处理才可以
//所谓的输入处理,也是先由主机发出一个IN命令,然后才有设备将主机所需的数据发送到主机
{
read_last_status(1);
//如果是输入请求包
if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(0);break;
case 6: get_descriptor();break;
case 8: get_configuration();break;
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case 0: get_status(1);break;
case 6: get_descriptor_interface();break; //同样是获得设备的标准描述符
case 10: get_interface();break;
default: break;
}
break;
case 2: //到端点
{
if(Control_Data.DeviceRequest.bRequest==0)
get_status(2);
}
default: break;
}
break;
case 0x20: //类请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default:break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case GET_REPORT: get_report(); break; //获取报告
case GET_IDLE: get_idle(); break; //获取空闲状态
case GET_PROTOCOL: get_protocol(); break; //获取协议
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
break;
case 0x40: //用户请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 2: //到端点
{
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
}
default: break;
}
}
return;
}
//如果是输出请求包
if(usb_flags.flags.setup_packet_out)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //标准请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //到设备
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(0);break;
case SET_FEATURE: set_feature(0);break;
case SET_ADDRESS: set_usb_address();break; //set_address
case SET_DESCRIPTOR: set_descriptor();break; //set_descriptor
case SET_CONFIGURATION: set_configuration(); break; //set_configurat
default: break;
}
break;
case 1: //到接口
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(1);break;
case SET_FEATURE: set_feature(1); break;
case SET_INTERFACE: set_interface();break;
default: break;
}
break;
case 2: //到端点
switch (Control_Data.DeviceRequest.bRequest)
{
case CLEAR_FEATURE: clear_feature(2);break;
case SET_FEATURE: set_feature(2);break;
default: break;
}
break;
default: break;
}
break;
case 0x20: //类请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
case SET_REPORT: set_report(); break; //设置报告
case SET_IDLE: set_idle(); break; //设置空闲
case SET_PROTOCOL: set_protocol(); break; //设置协议
default: break;
}
break;
case 2: //接收者为端点
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 3: //其它接收者
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}break;
default: break;
}
break;
case 0x40: //用户请求
switch(Control_Data.DeviceRequest.bmRequestType&0x1F)
{
case 0: //接收者为设备
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 1: //接收者为接口
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 2: //接收者为端点
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
case 3: //其它接收者
switch (Control_Data.DeviceRequest.bRequest)
{
default: break;
}
break;
default: break;
}
}
}
}
/******************************************************************************/
/**********************端点1输出***********************************************/
/*void endp1_out(void)
{
Prints("端点1输出................................",1);
}*/
/******************************************************************************/
/*************************端点1输入*****************************************/
/*void endp1_in(void)
{
Prints("端点1输入................................",1);
}*/
/******************************************************************************/
/***************************端点2输出****************************************/
void endp2_out(void)
{
}
/******************************************************************************/
//用来返回数据的缓冲
uint8 idata InBuffer[64];
/***************************统计x中有多少个bit为1*******************************/
uint8 Count1Bits(uint16 x)
{
uint8 i;
i=0;
while(x)
{
if(x&0x8000)i++;
x<<=1;
}
return i;
}
/******************************************************************************/
/****************************主端点输入处理************************************/
void endp2_in(void)
{
uint8 i;
for(i=0;i<8;i++)
{
InBuffer[i]=0;
}
// Prints("端点2输入................................",1);
KeyMapCanChange=0; //禁止修改按键值
if(KeyMapOk) //如果有按键按下
{
switch(KeyMapOk)
{
case 0x01: InBuffer[2]=0x4f;
break;
case 0x02: InBuffer[2]=0x50;
break;
case 0x04: InBuffer[2]=0x28;
break;
case 0x08: InBuffer[2]=0x3d;
InBuffer[0]|=1<<2;
break;
}
}
else //如果无按键按下,则返回0
{
for(i=0;i<8;i++)
{
InBuffer[i]=0;
}
}
KeyMapCanChange=1; //允许修改按键值
//返回8个字节数据
write_endpoint_buff(5,8,InBuffer);
}
/******************************************************************************/
/***************************主函数**********************************************/
void main(void)
{
disconnect_usb(); //断开USB连接
init_usb(); //初始化USB芯片
connect_usb(); //连接USB
InitTimer0(); //定时器0初始化,用来做键盘扫描,定时时间大约为5ms
KeyMapCanChange=1;
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.main_out_port)
{
endp2_out();
}
if(Interrupt_Register.Interrupt.main_in_port)
{
endp2_in();
}
}
}
}
/******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -