首页文章linux驱动由浅入深系列:u子系统android手机驱动「linux驱动由浅入深系列:u子系统」

linux驱动由浅入深系列:u子系统android手机驱动「linux驱动由浅入深系列:u子系统」

时间2025-01-17 02:34:09发布yu分类文章浏览121
导读: https://blog.csdn.net/RadianceBlau/article/details/78275434 android上的u口是支持OTG(on the go 的,U OTG既可以作为Host又可以作为Device,我们本文来看一下android手机作为...

 

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()

 
  1.  

其中会调用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功能设备。

 
  1.  
  2.  
  3.  
  4.  
  5.  

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的代码很简洁

 
  1.  

这个宏实际上是调用 __hid_register_driver()接口注册一个hid_driver,并把它挂接在hid_bus_type总线驱动链表上。
7,当鼠标移动或点击时使用input子系统上报Event的代码在

 
  1.  
  2.  
  3.  
  4.  

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

展开全文READ MORE
由浅入深
手机微博水印设置教程:保护版权,展示个性手机微博水印怎么设置「手机微博水印设置教程:保护版权,展示个性」 UKING语音王A90震撼上市uking手机「UKING语音王A90震撼上市」