?? usbkeyboard.c
字號:
return len;
}
/******************************************************************************/
/***************************斷開USB連接****************************************/
void disconnect_usb(void)
{
Prints("斷開USB連接........................",1);
write_usb_command(0xf3);
write_a_usb_data(0x0e);
write_a_usb_data(0x47);
delay(100);
}
/******************************************************************************/
/*******************************連接USB**************************************/
void connect_usb(void)
{
Prints("連接USB...............",1);
write_usb_command(0xf3); //初始化USBD12
write_a_usb_data(0x1e); //連接USB
write_a_usb_data(0x47); //設置頻率
}
/******************************************************************************/
/***************************初始化USB***************************************************/
void init_usb(void)
{
Prints("USBD12芯片初始化",1);
set_usb_addr(0);
set_endpoint_enable();
}
/******************************************************************************/
/****************************USB總線復位處理***********************************/
void usb_bus_reset(void)
{
Prints("USB總線復位................................",1);
usb_flags.Register=0;
set_endpoint_enable();
}
/******************************************************************************/
/*****************************USB總線掛起處理**********************************/
void usb_bus_suspend(void)
{
Prints("USB總線掛起................................",1);
}
/******************************************************************************/
/***************************設置地址***************************************/
void set_usb_address(void)
{
usb_flags.flags.set_addr=1;
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
set_usb_addr(Control_Data.DeviceRequest.wValue);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/**************************獲取狀態響應*****************************************/
void get_status(uint8 receiver)
{
uint8 status[2];
switch (receiver)
{
case 0: //獲取設備狀態
status[0]=0x00;
status[1]=0x00;
break;
case 1: //獲取接口狀態
status[0]=0x00;
status[0]=0x00;
break;
case 2: //獲取端點狀態
status[0]=0x00;
status[1]=0x00;
break;
}
write_endpoint_buff(1,2,status);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/*********************清除特性*******************************************/
void clear_feature(uint8 receiver)
{
Prints(" 清除特性................................",1);
receiver=0;
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/*******************設置特性**************************************************/
void set_feature(uint8 receiver)
{
Prints(" 設置特性................................",1);
receiver=0;
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/*****************************設置描述*****************************************/
void set_descriptor(void)
{
Prints(" 設置描述符................................",1);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/***************************設置配置*******************************************/
void set_configuration(void)
{
Prints(" 設置配置................................",1);
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/************************獲取配置狀態******************************************/
void get_configuration(void)
{
uint8 value=0x01;
Prints(" 獲取配置................................",1);
write_endpoint_buff(1,1,&value);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/****************************設置接口************************************/
void set_interface(void)
{
Prints(" 設置接口................................",1);
write_endpoint_buff(1,0,0);
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/***************************獲取接口狀態***************************************/
void get_interface(void)
{
uint8 value=0x01;
Prints(" 獲取接口................................",1);
write_endpoint_buff(1,1,&value);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/***********************獲取描述符*********************************************/
void get_descriptor(void)
{
Prints(" 獲取描述符................................",1);
if(!usb_flags.flags.not_end)
{
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case DEVICE_DESCRIPTOR:
Prints(" 獲取設備描述符................................",1);
Control_Data.wCount=sizeof(DEVICE_DESCRIPTOR_STRUCT);
Control_Data.pData=(uint8 *)(&device_descriptor);
break;
case CONFIGURATION_DESCRIPTOR:
Prints(" 獲取配置描述符................................",1);
Control_Data.wCount=SWAP16(con_int_endp_descriptor.configuration_descriptor.wTotalLength);
Control_Data.pData=(uint8 *)(&con_int_endp_descriptor);
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
break;
case STRING_DESCRIPTOR:
Prints(" 獲取字符串描述符................................",1);
switch(LSB(Control_Data.DeviceRequest.wValue))
{
case 0:
Prints(" 獲取語言ID................................",1);
Control_Data.wCount=LANGUAGE_ID[0];
Control_Data.pData=LANGUAGE_ID;
break;
case 1:
Prints(" 獲取廠商字符串................................",1);
Control_Data.wCount=ManufacturerString[0];
Control_Data.pData=ManufacturerString;
break;
case 2:
Prints(" 獲取產品字符串................................",1);
Control_Data.wCount=ProducterString[0];
Control_Data.pData=ProducterString;
break;
case 3:
Prints(" 獲取設備序列號................................",1);
Control_Data.wCount=device_serial_number[0];
Control_Data.pData=device_serial_number;
break;
default: break;
}
break;
default:
Prints(" 獲取其它描述符..................描述符索引為:",0);
PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
Prints("",1);
break;
}
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
}
//寫數據到D12輸入端點
if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
{
write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
else usb_flags.flags.usb_endp0_in=0;
return;
}
else
{
write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.usb_endp0_in=0;
return;
}
}
/******************************************************************************/
/*********************發到接口的獲取描述符**************************************/
void get_descriptor_interface(void)
{
Prints(" 獲取描述符(從接口)..............................",1);
if(!usb_flags.flags.not_end)
{
switch(MSB(Control_Data.DeviceRequest.wValue))
{
case HID_DESCRIPTOR:
Prints(" 獲取HID描述符................................",1);
Control_Data.wCount=sizeof(HID_DESCRIPTOR_STRUCT);
//Control_Data.pData=(uint8 *)(&hid_descriptor);
break;
case REPORT_DESCRIPTOR:
Prints(" 獲取報告描述符................................",1);
Control_Data.wCount=SWAP16(sizeof(KeyBoardReportDescriptor));
Control_Data.pData=(uint8 *)(KeyBoardReportDescriptor);
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
break;
case PHYSICAL_DESCRIPTOR:
Prints(" 獲取物理描述符................................",1);
break;
default:
Prints(" 獲取其它描述符..................描述符索引為:",0);
PrintLongInt(MSB(Control_Data.DeviceRequest.wValue));
Prints("",1);
break;
}
if(Control_Data.wLength<Control_Data.wCount)Control_Data.wCount=Control_Data.wLength;
}
//寫數據到D12輸入端點
if(Control_Data.wCount>=MAX_CONTROL_DATA_SIZE)
{
write_endpoint_buff(1,MAX_CONTROL_DATA_SIZE,Control_Data.pData);
Control_Data.pData+=MAX_CONTROL_DATA_SIZE;
Control_Data.wCount-=MAX_CONTROL_DATA_SIZE;
if(usb_flags.flags.set_addr)usb_flags.flags.not_end=1;
else usb_flags.flags.usb_endp0_in=0;
return;
}
else
{
write_endpoint_buff(1,Control_Data.wCount,Control_Data.pData);
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.usb_endp0_in=0;
return;
}
}
/******************************************************************************/
/************************終端點0輸出中斷處理************************************/
void endp0_out(void)
{
Last_Status.Register=read_last_status(0);
if(Last_Status.Status.setup_packet)
{
Control_Data.wLength=0;
Control_Data.wCount=0;
if(read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(uint8 *)(&(Control_Data.DeviceRequest)))!=sizeof(REQUESTCMD))
{
set_endpoint_status(0,0);
set_endpoint_status(1,0);
return;
}
Control_Data.DeviceRequest.wValue=SWAP16(Control_Data.DeviceRequest.wValue);
Control_Data.DeviceRequest.wIndex=SWAP16(Control_Data.DeviceRequest.wIndex);
Control_Data.DeviceRequest.wLength=SWAP16(Control_Data.DeviceRequest.wLength);
ack_setup(0);
ack_setup(1);
Control_Data.wLength=Control_Data.DeviceRequest.wLength;
usb_flags.flags.not_end=0;
usb_flags.flags.usb_endp0_in=1;
usb_flags.flags.setup_packet_in=0;
usb_flags.flags.setup_packet_out=0;
if(Control_Data.DeviceRequest.bmRequestType&0x80){usb_flags.flags.setup_packet_in=1;return;}
else {usb_flags.flags.setup_packet_out=1;return;}
}
else
{
select_endpoint(0);
clear_buffer();
}
}
/******************************************************************************/
/***********************獲取報告*********************************************/
void get_report(void)
{
Prints(" 獲取報告................................",1);
}
/******************************************************************************/
/**********************獲取空閑狀態*********************************************/
void get_idle(void)
{
Prints(" 獲取空閑................................",1);
write_endpoint_buff(1,1,&idle);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/*************************獲取協議**********************************************/
void get_protocol(void)
{
Prints(" 獲取協議................................",1);
write_endpoint_buff(1,1,&protocol);
usb_flags.flags.usb_endp0_in=0;
}
/******************************************************************************/
/***********************設置報告***********************************************/
void set_report(void)
{
Prints(" 設置報告................................",1);
}
/******************************************************************************/
/***********************設置空閑***********************************************/
void set_idle(void)
{
Prints(" 設置空閑................................",1);
while(select_endpoint(1)&0x01);
write_endpoint_buff(1,0,0);
idle=Control_Data.DeviceRequest.wValue;
usb_flags.flags.usb_endp0_in=0;
usb_flags.flags.setup_packet_out=0;
}
/******************************************************************************/
/**********************設置協議**************************************************/
void set_protocol(void)
{
Prints(" 設置協議................................",1);
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)
{
read_last_status(1);
//如果是輸入請求包
if(usb_flags.flags.setup_packet_in||usb_flags.flags.not_end)
{
switch(Control_Data.DeviceRequest.bmRequestType&0x60)
{
case 0x00: //標準請求
Prints("USB標準請求................................",1);
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: //到接口
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -