一.USB驱动程序框架:
app:
-----------------------------------------------------
usb设备驱动程序
内核------------------------------------------------
usb总线驱动程序
-----------------------------------------------------
usb主机控制器
UHCI OHCI EHCI
硬件 ---------------------------
usb设备
UHCI:intel,低速(1.5Mbps)/全速(12Mbps)
OCHI:microsoft 低速/全速
EHCI: 高速(480Mbps)
usb总线驱动作用:
a.识别usb设备
1)分配地址,
2)并告诉usb设备(set address)
3)发出命令获取描述符
b.查找并安装对应的设备驱动程序
c.提供usb读写函数
note:可以插入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 Kingston DataTraveler 3.0 PMAP PQ: 0 ANSI: 6
sd 0:0:0:0: [sda] 60604416 512-byte hardware sectors (31029 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sd 0:0:0:0: [sda] 60604416 512-byte hardware sectors (31029 MB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
拔掉:
sd 0:0:0:0: [sda] Attached SCSI removable disk
usb 1-1: USB disconnect, address 2
在内核目录/drivers/下搜索grep “USB device using ”
usb/core/hub.c:2186: "%s %s speed %sUSB device using %s and address
hub_irq
kick_khubd
wake_up(&khubd_wait);//唤醒
hub_thread
hub_events
hub_port_connect_change
choose_address(udev)//给新设备分配新编号(地址)
hub_port_init //打印出发现一个新设备
hub_set_address
usb_get_device_descriptor(udev,8);//获取设备描述符
设备描述符->配置描述符->接口描述符(逻辑上面的设备:比如usb声卡可以分为 1)录音 2)播放)
分析usb驱动总线方法:
1)首先插入usb设备,会打印一些信息,
2)根据信息搜索在内核的打印函数
3)然后反推各个调用实现的函数
二.usb驱动步骤
1.分配/设置usb_driver结构体
.id_table
.probe
.disconnect
2.注册函数
1)入口函数static int usbmouse_as_key_init(void),负责把函数告诉内核,注册函数
2)出口函数static int usbmouse_as_key_exit(void),usb退出或拔掉,不注册函数
测试驱动
a.在源码树上make menucofig去掉原来的usb鼠标驱动
- < > Support for Host-side USB
--- NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
USB Gadget Support --->
b.make uImage 并使用新的内核启动
c.insmod usbmouse_as_key.ko