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函数(参照下图)















猜你喜欢

转载自blog.csdn.net/a912293097/article/details/42292327