?? usb.c
字號:
case USB_RECIPIENT_ENDPOINT:
{
stall_ep0();
} break;
default: stall_ep0();
}
return 0;
}
//===============================================================================//
//== 函 數 名:set_feature
//== 功 能:設置特性
//== 說 明:
//== 時 間:2008.8.20 創建函數
//== 入口參數:receiver: 被清除的對象
//== 返 回 值:0
//===============================================================================//
unsigned char set_feature(unsigned char receiver)
{
unsigned char endp;
#ifdef __DEBUG__ //== 打印調試信息
Print_Msg("Runing set_feature()!\r\n");
#endif
switch (receiver)
{
case USB_RECIPIENT_DEVICE:
{
if (Control_Data.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP) //== 清除遠程喚醒功能
{
bEPPflags.bits.remote_wakeup = 1;
Control_Data.wLength = 0; //== 發送0字節長度數據到主機做回答
Control_Data.wCount = 0;
bEPPflags.bits.control_state = USB_TRANSMIT; //== 設置為發送狀態,等待in端點中斷
}
} break;
case USB_RECIPIENT_INTERFACE:
{
if (Control_Data.DeviceRequest.wValue == USB_FEATURE_ENDPOINT_STALL)//== 清除端點stall
{
endp = (unsigned char)(Control_Data.DeviceRequest.wIndex & MAX_ENDPOINTS);
if (Control_Data.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
{
set_endpoint_status(endp*2 + 1, 1); //== clear TX stall for IN on EPn.
}
else
{
set_endpoint_status(endp*2, 1); //== clear RX stall for OUT on EPn.
}
Control_Data.wLength = 0; //== 發送0字節長度數據到主機做回答
Control_Data.wCount = 0;
bEPPflags.bits.control_state = USB_TRANSMIT; //== 設置為發送狀態,等待in端點中斷
}
else
{
stall_ep0();
}
} break;
case USB_RECIPIENT_ENDPOINT:
{
stall_ep0();
} break;
default: stall_ep0();
}
return 0;
}
//===============================================================================//
//== 函 數 名:control_handler
//== 功 能:處理主機請求的建立包
//== 說 明:
//== 時 間:2008.8.20 創建函數
//== 入口參數:無
//== 返 回 值:0
//===============================================================================//
unsigned char setup_handler(void)
{
#ifdef __DEBUG__ //== 打印調試信息
Print_Msg("Runing setup_handler()!\r\n");
#endif
if (bEPPflags.bits.setup_packet_in) //== 主機要求輸入
{
bEPPflags.bits.setup_packet_in = 0;
switch (Control_Data.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK)
{
case USB_STANDARD_REQUEST: //== 標準請求
{
#ifdef __DEBUG__ //== 打印調試信息
Print_Msg("USB標準請求................................\r\n");
#endif
switch (Control_Data.DeviceRequest.bmRequestType & USB_RECIPIENT)
{
case USB_RECIPIENT_DEVICE: //== 詢問設備
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case GET_STATUS : get_status(USB_RECIPIENT_DEVICE); break;
case GET_DESCRIPTOR : get_descriptor(); break;
case GET_CONFIGURATION : get_configuration(); break;
// case GET_INTERFACE : reserved(); break;
// case SYNCH_FRAME : reserved(); break;
default : reserved(); break;
}
} break;
case USB_RECIPIENT_INTERFACE: //== 詢問接口
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case GET_STATUS : get_status(USB_RECIPIENT_INTERFACE); break;
case GET_DESCRIPTOR : get_descriptor_interface(); break;
// case GET_CONFIGURATION : reserved(); break;
case GET_INTERFACE : get_interface(); break;
// case SYNCH_FRAME : reserved(); break;
default : reserved(); break;
}
} break;
case USB_RECIPIENT_ENDPOINT: //== 詢問端點
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case GET_STATUS : get_status(USB_RECIPIENT_ENDPOINT); break;
// case GET_DESCRIPTOR : get_descriptor(); break;
// case GET_CONFIGURATION : reserved(); break;
// case GET_INTERFACE : get_interface(); break;
case SYNCH_FRAME : reserved(); break;
default : reserved(); break;
}
} break;
default: break;
}
} break;
case USB_CLASS_REQUEST: //== 類請求
{
#ifdef __DEBUG__ //== 打印調試信息
Print_Msg("類請求!\r\n");
#endif
switch (Control_Data.DeviceRequest.bmRequestType & USB_RECIPIENT)
{
case USB_RECIPIENT_DEVICE: //== 詢問設備
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
case USB_RECIPIENT_INTERFACE: //== 詢問接口
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case GET_REPORT : get_report(); break;
case GET_IDLE : get_idle(); break;
case GET_PROTOCOL : get_protocol(); break;
default : reserved(); break;
}
} break;
case USB_RECIPIENT_ENDPOINT: //== 詢問端點
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
default: break;
}
} break;
case USB_VENDOR_REQUEST: //== 廠商請求
{
#ifdef __DEBUG__ //== 打印調試信息
Print_Msg("廠商請求!\r\n");
#endif
switch (Control_Data.DeviceRequest.bmRequestType & USB_RECIPIENT)
{
case USB_RECIPIENT_DEVICE: //== 詢問設備
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
case USB_RECIPIENT_INTERFACE: //== 詢問接口
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
case USB_RECIPIENT_ENDPOINT: //== 詢問端點
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
default: break;
}
} break;
default: return 1;
}
}
if (bEPPflags.bits.setup_packet_out) //== 主機要求輸出
{
bEPPflags.bits.setup_packet_out = 0;
switch (Control_Data.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK)
{
case USB_STANDARD_REQUEST: //== 標準請求
{
switch (Control_Data.DeviceRequest.bmRequestType & USB_RECIPIENT)
{
case USB_RECIPIENT_DEVICE: //== 詢問設備
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case CLEAR_FEATURE : clear_feature(USB_RECIPIENT_DEVICE); break;
case SET_FEATURE : set_feature(USB_RECIPIENT_DEVICE); break;
case SET_ADDRESS : set_usb_address(); break;
case SET_DESCRIPTOR : set_descriptor(); break;
case SET_CONFIGURATION : set_configuration(); break;
// case SET_INTERFACE : break;
default : reserved(); break;
}
} break;
case USB_RECIPIENT_INTERFACE: //== 詢問接口
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case CLEAR_FEATURE : clear_feature(USB_RECIPIENT_INTERFACE);break;
case SET_FEATURE : set_feature(USB_RECIPIENT_INTERFACE); break;
// case SET_ADDRESS : break;
// case SET_DESCRIPTOR : break;
// case SET_CONFIGURATION : break;
case SET_INTERFACE : set_interface(); break;
default : reserved(); break;
}
} break;
case USB_RECIPIENT_ENDPOINT: //== 詢問端點
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case CLEAR_FEATURE : clear_feature(USB_RECIPIENT_ENDPOINT);break;
case SET_FEATURE : set_feature(USB_RECIPIENT_ENDPOINT); break;
// case SET_ADDRESS : break;
// case SET_DESCRIPTOR : break;
// case SET_CONFIGURATION : break;
// case SET_INTERFACE : break;
default : reserved(); break;
}
} break;
default: break;
}
} break;
case USB_CLASS_REQUEST: //== 類請求
{
switch (Control_Data.DeviceRequest.bmRequestType & USB_RECIPIENT)
{
case USB_RECIPIENT_DEVICE: //== 詢問設備
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved();break;
}
} break;
case USB_RECIPIENT_INTERFACE: //== 詢問接口
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
case SET_REPORT : set_report(); break;
case SET_IDLE : set_idle(); break;
case SET_PROTOCOL : set_protocol(); break;
default : reserved(); break;
}
} break;
case USB_RECIPIENT_ENDPOINT: //== 詢問端點
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
case 0x03: //== 其它接收者
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
default: break;
}
} break;
case USB_VENDOR_REQUEST: //== 廠商請求
{
switch (Control_Data.DeviceRequest.bmRequestType & USB_RECIPIENT)
{
case USB_RECIPIENT_DEVICE: //== 詢問設備
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved();break;
}
} break;
case USB_RECIPIENT_INTERFACE: //== 詢問接口
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved();break;
}
} break;
case USB_RECIPIENT_ENDPOINT: //== 詢問端點
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved();break;
}
} break;
case 0x03: //== 其它接收者
{
switch (Control_Data.DeviceRequest.bRequest & USB_REQUEST_MASK)
{
default : reserved(); break;
}
} break;
default: break;
}
} break;
default: return 1;
}
}
return 0;
}
//===============================================================================//
//== 函 數 名:handler
//== 功 能:處理主機請求的事件
//== 說 明:
//== 時 間:2008.8.13 創建函數
//== 入口參數:無
//== 返 回 值:0
//===============================================================================//
unsigned char handler(void)
{
if (bEPPflags.bits.bus_reset)
{
bEPPflags.bits.bus_reset = 0;
}
if (bEPPflags.bits.suspend)
{
bEPPflags.bits.suspend = 0;
}
if (bEPPflags.bits.setup_packet_out|bEPPflags.bits.setup_packet_in)
{
setup_handler();
}
if (bEPPflags.bits.usb_endp0_in)
{
bEPPflags.bits.usb_endp0_in = 0;
}
// if (bEPPflags.bits.setup_dma)
// {
// bEPPflags.bits.setup_dma = 0;
// }
if (bEPPflags.bits.usb_endp2_in)
{
bEPPflags.bits.usb_endp2_in = 0;
}
if (bEPPflags.bits.usb_endp2_out)
{
bEPPflags.bits.usb_endp2_out = 0;
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -