?? usbcore.c
字號:
NeedZeroPacket=1; //需要返回0長度的數據包
}
}
else
{
SendLength=wLength;
}
//將數據通過EP0返回
UsbEp0SendData();
break;
default: //其它描述符
#ifdef DEBUG0
Prints("其他描述符,描述符代碼:");
PrintHex((wValue>>8)&0xFF);
Prints("\r\n");
#endif
break;
}
break;
case GET_INTERFACE: //獲取接口
#ifdef DEBUG0
Prints("獲取接口。\r\n");
#endif
break;
case GET_STATUS: //獲取狀態
#ifdef DEBUG0
Prints("獲取狀態。\r\n");
#endif
break;
case SYNCH_FRAME: //同步幀
#ifdef DEBUG0
Prints("同步幀。\r\n");
#endif
break;
default: //未定義的標準請求
#ifdef DEBUG0
Prints("錯誤:未定義的標準輸入請求。\r\n");
#endif
break;
}
break;
case 1: //類請求
#ifdef DEBUG0
Prints("USB類輸入請求:\r\n");
#endif
switch(bRequest)
{
default:
#ifdef DEBUG0
Prints("未知類請求。\r\n");
#endif
SendLength=0;
NeedZeroPacket=1;
break;
}
//判斷請求的字節數是否比實際需要發送的字節數多
//如果請求的比實際的長,那么只返回實際長度的數據
if(wLength>SendLength)
{
if(SendLength%DeviceDescriptor[7]==0) //并且剛好是整數個數據包時
{
NeedZeroPacket=1; //需要返回0長度的數據包
}
}
else
{
SendLength=wLength;
}
//將數據通過EP0返回
UsbEp0SendData();
break;
case 2: //廠商請求
#ifdef DEBUG0
Prints("USB廠商輸入請求:\r\n");
#endif
break;
default: //未定義的請求。這里只顯示一個報錯信息。
#ifdef DEBUG0
Prints("錯誤:未定義的輸入請求。\r\n");
#endif
break;
}
}
//否則說明是輸出請求
else //if(bmRequestType&0x80==0x80)之else
{
//根據bmRequestType的D6~5位散轉,D6~5位表示請求的類型
//0為標準請求,1為類請求,2為廠商請求。
switch((bmRequestType>>5)&0x03)
{
case 0: //標準請求
#ifdef DEBUG0
Prints("USB標準輸出請求:");
#endif
//USB協議定義了幾個標準輸出請求,我們實現這些標準請求即可
//請求的代碼在bRequest中,對不同的請求代碼進行散轉
switch(bRequest)
{
case CLEAR_FEATURE: //清除特性
#ifdef DEBUG0
Prints("清除特性。\r\n");
#endif
break;
case SET_ADDRESS: //設置地址
#ifdef DEBUG0
Prints("設置地址。地址為:");
PrintHex(wValue&0xFF); //顯示所設置的地址
Prints("\r\n");
#endif
//設置地址沒有數據過程,直接進入到狀態過程,返回一個0長度的數據包
SendLength=0;
NeedZeroPacket=1;
//將數據通過EP0返回
UsbEp0SendData();
UsbChipWriteAddress(wValue&0xFF); //wValue中的低字節是設置的地址值
break;
case SET_CONFIGURATION: //設置配置
#ifdef DEBUG0
Prints("設置配置。\r\n");
#endif
//wValue的低字節為配置的值,如果該值為非0,才能使能非0端點。
//保存當前配置值
ConfigValue=wValue&0xFF;
//設置芯片的config值
UsbChipSetConfig(ConfigValue);
//使能非0端點。非0端點只有在設置為非0的配置后才能使能。
UsbChipSetEndpointEnable(ConfigValue);
//返回一個0長度的狀態數據包
SendLength=0;
NeedZeroPacket=1;
//將數據通過EP0返回
UsbEp0SendData();
break;
case SET_DESCRIPTOR: //設置描述符
#ifdef DEBUG0
Prints("設置描述符。\r\n");
#endif
break;
case SET_FEATURE: //設置特性
#ifdef DEBUG0
Prints("設置特性。\r\n");
#endif
break;
case SET_INTERFACE: //設置接口
#ifdef DEBUG0
Prints("設置接口。\r\n");
#endif
break;
default: //未定義的標準請求
#ifdef DEBUG0
Prints("錯誤:未定義的標準輸出請求。\r\n");
Prints("未知請求。\r\n");
#endif
//只需要返回一個0長度的數據包即可
SendLength=0;
NeedZeroPacket=1;
//將數據通過EP0返回
UsbEp0SendData();
break;
}
break;
case 1: //類請求
#ifdef DEBUG0
Prints("USB類輸出請求:");
#endif
switch(bRequest)
{
case SET_IDLE:
#ifdef DEBUG0
Prints("設置空閑。\r\n");
#endif
//只需要返回一個0長度的數據包即可
SendLength=0;
NeedZeroPacket=1;
//將數據通過EP0返回
UsbEp0SendData();
break;
default:
#ifdef DEBUG0
Prints("未知請求。\r\n");
#endif
//只需要返回一個0長度的數據包即可
SendLength=0;
NeedZeroPacket=1;
//將數據通過EP0返回
UsbEp0SendData();
break;
}
break;
case 2: //廠商請求
#ifdef DEBUG0
Prints("USB廠商輸出請求:\r\n");
#endif
break;
default: //未定義的請求。這里只顯示一個報錯信息。
#ifdef DEBUG0
Prints("錯誤:未定義的輸出請求。\r\n");
#endif
break;
}
}
}
//普通數據輸出
else //判斷setup包之else
{
ClrCsr(0,1<<7); //設置DIR為0
UsbEp0DataOut(); //處理標準請求的數據部分
}
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數功能:端點0輸入中斷處理函數。
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void UsbEp0In(void)
{
#ifdef DEBUG0
Prints("USB端點0輸入中斷。\r\n");
#endif
//清除端點0的輸入完成中斷標志位
ClrCsr(0,1<<0);
//發送剩余的字節數
UsbEp0SendData();
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數功能:端點1輸入中斷處理函數。
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void UsbEp1In(void)
{
#ifdef DEBUG0
Prints("USB端點1輸入中斷。\r\n");
#endif
//清除端點1的輸入完成中斷標志位
ClrCsr(1,1<<0);
//端點1輸入處于空閑狀態
Ep1InIsBusy=0;
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數功能:端點2輸出中斷處理函數。
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void UsbEp2Out(void)
{
uint8 Buf[64],Len;
#ifdef DEBUG0
Prints("USB端點2輸出中斷。\r\n");
#endif
//清除端點2輸出的中斷標志位
//無操作
//讀取端點2的數據。返回值為實際讀到的數據字節數
Len=UsbChipReadEndpointBuffer(2,64,Buf);
//清除端點緩沖區
UsbChipClearBuffer(2);
if(Len!=8) return; //如果長度不是8,說明不是我們應用程序發送的數據,直接返回
//輸出報告第1字節為LED狀態,某位為1時,表示LED亮。
if(Buf[0]&0x02) //LED2
{
OnLed2();
}
else
{
OffLed2();
}
if(Buf[0]&0x04) //LED3
{
OnLed3();
}
else
{
OffLed3();
}
if(Buf[0]&0x08) //LED4
{
OnLed4();
}
else
{
OffLed4();
}
LcdSetPoint(0,24); //設置位置
LcdPrints("1 2 3 4 5 6 7 8"); //顯示位置
LcdSetPoint(0,32);
//在LCD上也顯示按鍵狀態
for(Len=0;Len<8;Len++)
{
if(Buf[0]&(1<<Len))
{
LcdPrints("* ");
}
else
{
LcdPrints(" ");
}
}
LcdRefresh(); //刷新LCD
//輸出報告的第二字節非0時,清除發送計數器Count。
if(Buf[1]!=0)
{
Count=0;
}
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函數功能:端點3輸入中斷處理函數。
入口參數:無。
返 回:無。
備 注:無。
********************************************************************/
void UsbEp3In(void)
{
#ifdef DEBUG0
Prints("USB端點3輸入中斷。\r\n");
#endif
//清除端點3的輸入完成中斷標志位
ClrCsr(3,1<<0);
//端點3輸入處于空閑狀態
Ep3InIsBusy=0;
}
////////////////////////End of function//////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -