1. 程式人生 > >linux驅動之USB驅動程式框架

linux驅動之USB驅動程式框架

USB驅動程式框架:

app:

-----------------------------------------------------------------------

                             USB裝置驅動程式          ----》知道資料的含義

核心            --------------------------------------------------------

                             USB匯流排驅動程式          -----》1、識別,2.找到匹配的裝置驅動。3.提供USB讀寫函式(不知道資料的具體含義)

----------------------------------------------------------------------

                              USB匯流排控制器

                           UHCI  OHCI   EHCI

硬體                 -----------------------------

                                   USB裝置

USB匯流排規範:

UHCI intel 低速(1.5Mbps)/全速(12Mbps) 硬體功能強大,軟體簡單
OHCI microsoft 低速(1.5Mbps)/全速(12Mbps) 硬體相對較弱,軟體複雜
EHCI 高速(480Mbps)

linux-2.6.30.4核心自帶 OHCI。

USB匯流排驅動程式的作用:

1、識別USB裝置

1.1分配地址

1.2告訴USB裝置(set address)

1.3發出命令,獲取描述符

描述符資訊在在inlcude/linux/usb/ch9.h

usb_device_descriptor

       usb_config_descriptor

每個硬體都有一個裝置描述符號,每個裝置描述服中又包含配置描述符號(多個)。


2、查詢並板狀對應的裝置驅動程式

3、提供USB讀寫函式

---------------------------------------------------------------------------------------------------------------------------------------------------

核心中usb驅動流程:

hub_irq
    kick_khubd
        hub_thread
            hub_events
                hub_port_connect_change
                    usb_alloc_dev
                        dev->dev.bus = &usb_bus_type;
                    choose_address(udev);//為新裝置分配編號
                        bus->devnum_next);
                    hub_port_init : "%s %s speed %sUSB device using %s and address %d\n",
                        hub_set_address//把編號告訴USB裝置
                        usb_get_device_descriptor;//獲取裝置描述符
                        retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);
                    usb_new_device(udev);
                    usb_get_configuration////把所有的描述符號都都出來,解析
                    device_add//把裝置放入usb_bus_type的dev連結串列,從usb_bus_type的driver連結串列裡取出usb_driver逐個進行比較,

                                         //把usb_interfaces和usb_driver的id_table比較
                                         //如果能夠匹配,那麼呼叫usb_driver的probe函式(參照下圖)