linux驱动由浅入深系列:u子系统android手机驱动「linux驱动由浅入深系列:u子系统」
https://blog.csdn.net/RadianceBlau/article/details/78275434
android上的u口是支持OTG(on the go)的,U OTG既可以作为Host又可以作为Device,我们本文来看一下android手机作为Host连接鼠标的情况。
OTG是如何做到既可以做Host又可以作为Device的呢
标准u接头中有四根线:vbus,gnd,dp(d+),dm(d-),android手机上的u为miniU接口增加了一根id线,用来区分Host、Device。
u是如何检测设备插入的呢
设备插拔检测都是由hub来进行的,即使不外接hub在U host controler中也集成了一个roothub。hub上的dp、dm线都有一个15k的下拉电阻拉到低电平,设备端的dp或dm线上有1.5k的上拉电阻,设备插入时就会改变dp、dm线上的电平。
当把一个U设备插入到一个u hub的某个端口时,集中器就会检测到设备的接入,从而在下一次受到主机通过中断交互查询时就会向其报告。集中器的端口在没有设备接入时都处于关闭状态,插入设备之后也不会自动打开,必须由主机通过控制交互发出命令予以打开。所以,在得到集中器的报告之后,主机的U驱动程序就会为新插入的设备调度若干个控制交互,并向集中器发出打开这个端口的命令,这样新插入的设备就会出现在U总线上了,并为该设备分配唯一的地址。
鼠标插入android手机后代码执行过程分析
1,u鼠标属于hid设备,linux启动过程中会注册hid总线bus_register(&hid_bus_type)
2,u鼠标插入后的会调用到hub_port_connect()
其中会调用u_alloc_dev创建一个u_device设备,然后调用u_new_device-->u_enumerate_device-->u_get_configuration-->u_parse_configuration-->u_parse_interface(会分配struct u_interface_cache)-->u_parse_endpoint分析设备各描述符,最后u_new_device会调用device_add 这里把这个u_device注册到u总线下。
3,当注册这个u_device的时候u总线会调用generic driver驱动的probe函数
这个函数主要为这个u_device选择一个合适的配置configuration,并且设置这个configuration
4,u_set_configuration这个函数为这个配置的每个接口初始化为u_if_device_type类型的设备。
u_interface设备是挂载u_device下面的,并且这个u_device可能有多个u_interface功能设备。
5,最后在注册这些interface时,注册函数会调用u总线的match函数匹配u_interface和u_driver
但是u_bus_type总线只有match函数,没有probe函数需要调用u_driver的probe函数u_probe_interface(drivers/u/core/driver.c),这个函数会真正的调用具体u_driver的probe函数。root hub或者hub也都是u_device设备,u_device下面包含u_interface功能(function)
6,u鼠标在android代码中没有使用linux中常用的mousedev.c驱动,而是使用了hid-generic驱动,hid-generic.c的代码很简洁
这个宏实际上是调用 __hid_register_driver()接口注册一个hid_driver,并把它挂接在hid_bus_type总线驱动链表上。
7,当鼠标移动或点击时使用input子系统上报Event的代码在
8,u鼠标插入android手机后的log如下
[ 86.501420] m_otg 78db000.u: phy_reset: success
[ 86.626156] m_otg 78db000.u: U exited from low power mode
[ 86.670053] m_otg 78db000.u: phy_reset: success
[ 86.776425] m_hsu_host m_hsu_host: EHCI Host Controller
[ 86.787250] m_hsu_host m_hsu_host: new U bus registered, assigned bus number 1
[ 86.803480] m_hsu_host m_hsu_host: irq 49, io mem 0x078db000
[ 86.824675] m_hsu_host m_hsu_host: U 2.0 started, EHCI 1.00
[ 86.831268] radia u_new_device
[ 86.836682] u u1: New U device found, idVendor=1d6b, idProduct=0002
[ 86.842444] u u1: New U device strings: Mfr=3, Product=2, SerialNumber=1
[ 86.850085] u u1: Product: EHCI Host Controller
[ 86.854990] u u1: Manufacturer: Linux 3.18.31-g6649b1f-dirty ehci_hcd
[ 86.861286] u u1: SerialNumber: m_hsu_host
[ 86.876553] radia generic_probe
[ 86.882021] hub 1-0:1.0: U hub found
[ 86.885627] hub 1-0:1.0: 1 port detected
[ 87.085676] radia hub_port_connect
[ 87.204811] u 1-1: new low-speed U device number 2 using m_hsu_host
[ 87.358301] radia u_new_device
[ 87.372341] u 1-1: New U device found, idVendor=10c4, idProduct=8108
[ 87.378352] u 1-1: New U device strings: Mfr=1, Product=2, SerialNumber=0
[ 87.385665] u 1-1: Product: U OPTICAL MOUSE
[ 87.389643] u 1-1: Manufacturer: YSPRINGTECH
[ 87.402281] radia generic_probe
[ 87.432953] input: YSPRINGTECH U OPTICAL MOUSE as /devices/soc/78db000.u/m_hsu_host/u1/1-1/1-1:1.0/0003:10C4:8108.0001/input/input9
[ 87.461748] hid-generic 0003:10C4:8108.0001: input,hidraw0: U HID v1.11 Mouse [YSPRINGTECH U OPTICAL MOUSE] on u-m_hsu_host-1/input0
[ 87.815343] SELinux: initialized (dev fuse, type fuse), uses mountpoint labeling
黔西版权声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com