基於OHCI的USB主機 USB裝置列舉

2021-09-21 19:33:47 字數 3898 閱讀 4126

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的...