您的位置 首页 元件

USB驱动程序结构建立

1首先我们先从理论上浅谈一下USB驱动的框架app:——————————————-USB设备驱动程序知道数据含义内核-

1.首要咱们先从理论上浅谈一下USB驱动的结构

app:
——————————————-
USB设备驱动程序 // 知道数据意义
内核 ————————————–
USB总线驱动程序 // 1. 辨认, 2. 找到匹配的设备驱动, 3. 供给USB读写函数 (它不知道数据意义)
——————————————-
USB主机控制器
UHCI OHCI EHCI
硬件 ———–
USB设备
UHCI: intel, 低速(1.5Mbps)/全速(12Mbps)
OHCI: microsoft 低速/全速
EHCI: 高速(480Mbps)
也就是说最底层是usb设备,往上是USB总线控制器、USB总线驱动程序、USB驱动程序,最终是应用程序。其间USB总线控制器包含三种:UHCI OHCI EHCI
2. USB总线驱动程序的效果
1. 辨认USB设备
1.1 分配地址
1.2 并告知USB设备(set address)
1.3 宣布指令获取描述符
描述符的信息能够在includelinuxusbCh9.h看到
2. 查找并装置对应的设备驱动程序
3. 供给USB读写函数
3、咱们开端正式构建linux usb结构了,当心了!!!
首要咱们需要从开发板取得一些信息:
把USB设备接到开发板上,看输出信息:
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
usb 1-1: configuration #1 chosen from 1 choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi 0:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
sd 0:0:0:0: [sda] Attached SCSI removable disk
拔掉
usb 1-1: USB disconnect, address 2
再接上:
usb 1-1: new full speed USB device using s3c2410-ohci and address 3
usb 1-1: configuration #1 chosen from 1 choice
scsi1 : SCSI emulation for USB Mass Storage devices
scsi 1:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
sd 1:0:0:0: [sda] Attached SCSI removable disk
接着咱们就能够依据这些信息进行剖析了:
首要咱们在内核的dirvers目录下查找:“USB device using
grep “USB device using” * -nR
成果搜到了下面这条信息:usb/core/hub.c:2186: “%s %s speed %sUSB device using %s and address %d”,
那么咱们就从usb/core/hub.c这个文件开端剖析:
“%s %s speed %sUSB device using %s and address %d”这句话在hub_port_init 函数中被调用
hub_port_init 在函数hub_port_connect_change中被调用
hub_port_connect_change在函数hub_events中被调用
hub_events在函数hub_thread中被调用
hub_thread函数里有这么一句:
wait_event_interruptible(khubd_wait,!list_empty(&hub_event_list) ||kthread_should_stop());
阐明进程会在khubd_wait这个等候行列里休眠,那么谁把它唤醒呢?咱们查找一下
在kick_khubd函数里有这么一句:wake_up(&khubd_wait);把进程唤醒了
kick_khubd被函数hub_irq调用,依据注释信息咱们知道当衔接产生改变或则呈现办法就会产生中止,然后进入这个函数。
那么咱们大致能够总结出了结构:
hub_irq //产生接口状况改变或呈现过错时调用
kick_khubd
wake_up//唤醒进程
hub_thread//进程在这个函数里休眠了,被wake up唤醒后会持续履行
hub_port_connect_change //咱们重点来剖析它
udev = usb_alloc_dev(hdev, hdev->bus, port1);
dev->dev.bus = &usb_bus_type;//指定设备总线是usb类型的
choose_address(udev);//在0到128之间找到一个设备地址,至于为什么是128咱们之前现已讲过了
hub_port_init
hub_set_address//将上面找到的地址告知usb设备
usb_get_device_descriptor(udev, 8);//获取设备描述符
usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);//再次获取设备描述符,咱们在 //usb协议剖析里边有谈到过的
usb_new_device//把一切的描述符都读出来并解析
usb_get_configuration(udev);//获取装备信息
usb_cache_string(udev, udev->descriptor.iProduct);//读取产品信息
usb_cache_string(udev,udev->descriptor.iManufacturer);//读取制造商信息
usb_cache_string(udev, udev->descriptor.iSerialNumber);//读取序列号信息
__usb_get_extra_descriptor//取得一些额定的信息
device_add(&udev->dev);// 把device放入usb_bus_type的dev链表,
// 从usb_bus_type的driver链表里取出usb_driver,
// 把usb_interface和usb_driver的id_table比较
// 假如能匹配,调用usb_driver的probe
咱们来总结一下上面的结构:首要接上usb设备时会发 生中止,然后唤醒进程。接着先设置usb设备的地址,然后获取设备描述符和装备描述符等各种描述符,这是为了寻觅驱动程序。接着将usb设备加入到链表里,和驱动比较,假如匹配就调用probe函数。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/233524.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部