usb裝置接入以後,必須進行裝置列舉,得到裝置引數,設定裝置執行配置等引數,下面的**就是對u盤裝置進行列舉的過程。
因為沒有使用作業系統,所以函式使用狀態遷移的方式完成列舉,該函式在主迴圈中被呼叫。
/*** usb裝置列舉處理
* @return 當前列舉處理的狀態
*/short usbenumdev(void)
oldstate = enumdev.state;
switch (enumdev.state)
break;
case enum_dev_idle_dalay:
//進行埠復位
ohciportreset(0);
usbtimer = 0;
enumdev.errreason = 0;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_reset_ing;
break;
case enum_dev_reset_ing:
if (ohciisportresetover(0))// == ochi_port_reset_over)
if (usbtimer >= 200)
break;
case enum_dev_wait_reset_over:
//埠復位完成後延時120ms,然後進行埠初始化
if (usbtimer <= 12) break;
ohciportinit(0);
usbtimer = 0;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_send_dev_desc_0;
break;
case enum_dev_send_dev_desc_0:
usbinfosetaddr(0);
//從位址0,埠0取得裝置描述符
usbgetdevicedesc(usbbuf);
usbtimer = 0;
enumdev.newstate = enum_dev_set_address;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_wait_cmd_over;
break;
case enum_dev_set_address:
//為usb裝置設定新的位址
usbsetaddress(usbbuf, 2);
usbtimer = 0;
enumdev.newstate = enum_dev_send_dev_desc_1;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_wait_cmd_over;
break;
case enum_dev_send_dev_desc_1:
//從新位址,埠0取得裝置描述符
usbgetdevicedesc(usbbuf);
usbtimer = 0;
enumdev.newstate = enum_dev_fill_desc_dev;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_wait_cmd_over;
break;
case enum_dev_fill_desc_dev:
//得到了埠描述符
bytescopy((byte *)&usbdeviceinfo.devdesc, (byte *)usbbuf, sizeof(device_desc));
usbtimer = 0;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_get_desc_cfg;
break;
case enum_dev_get_desc_cfg:
//取得配置描述符集合
usbgetconfigdesc(usbbuf);
usbtimer = 0;
enumdev.newstate = enum_dev_fill_desc_set;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_wait_cmd_over;
break;
case enum_dev_fill_desc_set:
pbuf = usbbuf;
//取得返回資料中的配置描述符
bytescopy((byte *)&usbdeviceinfo.cfgdesc, pbuf, sizeof(cfg_desc));
//取得返回資料中的介面描述符
pbuf += 9;
bytescopy((byte *)&usbdeviceinfo.intfdesc, pbuf, sizeof(intf_desc));
//取得返回資料中的端點描述符
pbuf += 9;
for(i = 0; i < usbdeviceinfo.intfdesc.bendpoints; i++)
pbuf += 7;
}//儲存得到的批量埠資訊
usbinfosetbulkport(epbulkin, epbulkout);
usbtimer = 0;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_set_configuration;
break;
case enum_dev_set_configuration:
//設定裝置配置值
usbsetconfiguration(usbbuf);
usbtimer = 0;
enumdev.newstate = enum_dev_get_configuration;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_wait_cmd_over;
break;
case enum_dev_get_configuration:
//取得裝置配置值
usbgetconfiguration(usbbuf);
usbtimer = 0;
enumdev.newstate = enum_dev_check_config;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_wait_cmd_over;
break;
case enum_dev_check_config:
//檢查裝置配置是否正確
if (usbbuf[0] != 1)
usbtimer = 0;
enumdev.oldstate = enumdev.state;
enumdev.state = enum_dev_over;
break;
case enum_dev_wait_cmd_over:
//命令執行完畢
if (usbiscmdover() == usb_cmd_over)
else
}enumdev.state = enumdev.newstate;
}//命令執行超時,則重新初始化
if (usbtimer >= 200)
break;
case enum_dev_over:
break;
default:
enumdev.state = enum_dev_idle;
}return enumdev.state;}
基於OHCI的USB主機 OHCI(端點)
ohci open host controller inte ce 是康柏 微軟 國家半導體等公司共同制定的乙個usb主機介面規範,它提供乙個更抽象的介面來完成usb資料傳輸工作。在ohci規範中,最重要的幾個概念是端點 endpoint ed 傳輸描述符 transport descriptor ...
基於OHCI的USB主機 前言
很久以前,大概是前年年底吧,因為公司專案的要求,我做了基於ohci的usb主機訪問u盤的程式,用來把系統中產生的一些資料儲存到u盤中。本來做的時候就想把其中的一些經驗體會發表的,可是工作實在是太忙,而且也的確有點懶,就一直拖到了現在。做訪問u盤的usb主機,網上有很多現成的例子,從硬體到軟體。可是絕...
基於OHCI的USB主機 背景介紹
使用at91rm9200作為主控cpu,利用該晶元的usb主機介面訪問u盤,根據接收的上層命令把相應資料儲存到u盤的指定檔案上。不使用額外的專用usb控制晶元,要求穩定可靠,效率高,不能影響執行在該cpu上的其它程式。at91rm9200程式載入後直接執行,沒有作業系統。以上就是我做的基於ohci的...