USB驱动开发
文章平均质量分 85
kcyuan
科创园地,分享技术知识,为科技助力发展,贡献一己之力。
展开
-
usb驱动开发23——大结局
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match,在自己的那条驱动链表里为它们寻找一个合适的接口驱动程序。那么这些接口驱动都从哪里来?这就要说到每个玩儿linux的人都会知道的那几个著名的命令insmod,modprobe,rmmod。你insmod或modprobe驱动的时候,经过一个曲折的过程,会调用到你驱动里的那个xxx_init函数,进而去调用usb原创 2022-01-25 09:17:36 · 130 阅读 · 1 评论 -
usb驱动开发22——接口驱动
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match,在自己的那条驱动链表里为它们寻找一个合适的接口驱动程序。那么这些接口驱动都从哪里来?这就要说到每个玩儿linux的人都会知道的那几个著名的命令insmod,modprobe,rmmod。你insmod或modprobe驱动的时候,经过一个曲折的过程,会调用到你驱动里的那个xxx_init函数,进而去调用usb原创 2022-01-25 09:17:22 · 379 阅读 · 0 评论 -
usb驱动开发21——驱动生命线
关于字符串描述符的地位仅次于设备/配置/接口/端点四大描述符,那四大设备必须得支持,而字符串描述符对设备来说则是可选的,这并不是就说字符串描述符不重要,对咱们来说,提供字符串描述符的设备要比没有提供的设备亲切的多,不会有人会专门去记前面使用lsusb列出的04b4表示的是Cypress Semiconductor Corp。一提到字符串,不可避免就得提到字符串使用的语言。Spec里就说了,字符串描述符使用的就是UNICODE编码,usb设备里的字符串可以通过它来支持多种语言,不过你需要在向设备请求字符串描原创 2022-01-25 09:17:10 · 232 阅读 · 0 评论 -
usb驱动开发20——驱动生命线
我们总是很喜欢高潮,不是吗?那就好好对待她哦。我们来看一下linux中的高潮部分设备是怎么从Address进入Configured的。usb_set_configuration函数的代码就不贴了,可以回顾内核去看。usb_disable_device行函数主要意味着如果设备已经在Configured状态了,就得做些清理工作。都清理些什么怎么去清理?别着急,要想学会,得仔细研究下message.c里的usb_disable_device函数。/* * usb_disable_device - Disa原创 2022-01-25 09:16:52 · 517 阅读 · 0 评论 -
usb驱动开发19——驱动生命线
现在开始就沿着usb_generic_driver的生命线继续往下走。设备的生命线你可以为是从你的usb设备连接到hub的某个端口时开始,而驱动的生命线就必须得回溯到usb子系统的初始化函数usb_init了:if (retval)goto hub_init_failed;retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);if (!retval)goto out;在usb子系统初始化的时候原创 2022-01-25 09:16:08 · 493 阅读 · 0 评论 -
usb驱动开发18——设备生命线
现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符、接口描述符还是端点描述符都挤在一起,所以得想办法将它们给分开。,于是usb_parse_configuration()就做这些事:static int usb_parse_configuration(struct device *ddev, int cfgidx, struct usb_host_config *config, unsigned ch原创 2022-01-24 10:03:31 · 388 阅读 · 0 评论 -
usb驱动开发17——设备生命线
拜会完了山头的几位大哥,还记得我们从哪里来要到哪里去吗?时刻不能忘记自身的使命啊。我们是从usb_submit_urb()最后的那个遗留问题usb_hcd_submit_urb()函数一路走来,现在就要去分析usb_hcd_submit_urb()里面的内容:/* may be called in any context with a valid urb->dev usecount * caller surrenders "ownership" of urb * expects usb_subm原创 2022-01-24 10:01:07 · 405 阅读 · 0 评论 -
usb驱动开发16——设备生命线
回到struct usb_hcd,继续努力的往下看。kref,usb主机控制器的引用计数。struct usb_hcd也有自己专用的引用计数函数,看hcd.c文件:static void hcd_release (struct kref *kref){ struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref); kfree(hcd);}struct usb_hcd *usb_get_hcd (struct usb_hcd原创 2022-01-24 09:59:29 · 1159 阅读 · 0 评论 -
usb驱动开发15——设备生命线
总算是进入了HCD的片儿区,既然来到一个片区,怎么都要去拜会一下山头几个大哥吧。,先回忆一些我们怎么到这里的?给你列举一个调用函数过程usb_control_msg->usb_internal_control_msg->usb_start_wait_urb->usb_submit_urb->usb_hcd_submit_urb。这个山头儿,王中之王就是drivers/usb/core/hcd.h里定义的struct usb_hcd。/*-----------------------原创 2022-01-24 09:57:38 · 210 阅读 · 0 评论 -
usb驱动开发14——设备生命线
直接看代码吧:/*-------------------------------------------------------------------*//** * usb_submit_urb - issue an asynchronous transfer request for an endpoint * @urb: pointer to the urb describing the request * @mem_flags: the type of memory to allocate原创 2022-01-24 09:55:35 · 331 阅读 · 0 评论 -
usb驱动开发13——设备生命线
上一节勉勉强强把struct urb这个中心给说完,接着看那三个基本点。第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/core/urb.c里定义:/**usb_alloc_urb - creates a new urb for a USB driver to use@iso_packets: number of iso packets for this urb@mem_flags: the type of原创 2022-01-24 09:45:54 · 453 阅读 · 0 评论 -
usb驱动开发12——设备生命线
函数usb_control_msg完成一些初始化后调用了usb_internal_control_msg之后就free urb。剩下的活,全部留给usb_internal_control_msg去做了,那就去了解一下它背后的生活吧。/*-------------------------------------------------------------------*/// returns status (negative) or length (positive)static int usb_in原创 2022-01-24 09:39:03 · 611 阅读 · 1 评论 -
usb驱动开发11——设备生命线
暂时先告别媒人,我们去分析各自的生命旅程,最后还会回到usb_device_match函数。首先当你将usb设备连接在hub的某个端口上,hub检测到有设备连接了进来,它会为设备分配一个struct usb_device结构的对象并初始化,并调用设备模型提供的接口将设备添加到usb总线的设备列表里,然后usb总线会遍历驱动列表里的每个驱动,调用自己的match函数看它们和你的设备或接口是否匹配。hub检测到自己的某个端口有设备连接了进来后,它会调用core里的usb_alloc_dev函数为struct原创 2022-01-24 09:36:03 · 473 阅读 · 0 评论 -
usb驱动开发10——usb_device_match
在第五节我们说过会专门分析函数usb_device_match,以体现模型的重要性。同时,我们还是要守信用的。再贴一遍代码,看代码就要不厌其烦:static int usb_device_match(struct device *dev, struct device_driver *drv){ /* devices and interfaces are handled separately */ if (is_usb_device(dev)) { /* interface drivers n原创 2022-01-24 09:33:52 · 619 阅读 · 0 评论 -
usb驱动开发9——设备描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),配置描述符,最后分析设备如何包括这些描述符。首先记住,在usb的世界里,设备大于配置,配置大于接口,接口包含多个设置,接口也可以理解为功能,所有端点的集合构成一个功能。废话少说,看一下usb设备结构体定义吧!struct usb_tt;/** * struct usb_device - kernel's representation of a USB device * @devnum: devic原创 2022-01-24 09:29:03 · 2218 阅读 · 1 评论 -
usb驱动开发8——配置描述符
前面分析了usb的四大描述符之端点描述符,接口描述符(每一个接口对应一个功能,与之配备相应驱动),下面是看配置描述符还是看设备描述符呢??我们知道,设备大于配置,配置大于接口,接口可以有多种设置。我们还是按照从小到大的顺序,继续看配置结构体吧!struct usb_host_config {struct usb_config_descriptor desc;char *string; /* iConfiguration string, if present *//* the interfac原创 2022-01-23 21:28:34 · 590 阅读 · 0 评论 -
usb驱动开发7——接口描述符
此系列是http://blog.csdn.net/fudan_abc/博文的整理,同时加入了自己的理解。很敬佩fudan_abc的文章,仔细学习和分析受益很多。注:fundan_abc所分析linux内核代码所用的版本是2.6.22.6。前面struct usb_interface里表示接口设置的struct usb_host_interface被有意的飘过了,咱们在这节主要讲讲这个结构体,同样在include/linux/usb.h文件里定义。/* host-side wrapper for one原创 2022-01-23 21:26:30 · 539 阅读 · 0 评论 -
usb驱动开发6——端点描述符
学到这里不容易,先说一段故事吧。二兄弟住一大楼的第80层,某深夜回家忘看通知(内容今夜停电)。兄弟俩背着沉重的大背包,在楼底下商量一下,决定一鼓作气,爬楼梯回家。两人抖擞精神,开始爬楼。爬到20楼的时候,开始觉得背包很重了。两人商量,决定把背包存在20楼,到时候再回过头来取。卸下了背包,两个人觉得很轻松,说说笑笑地继续往上爬。爬到40楼的时候,两人已经很累了,就开始互相抱怨指责。哥哥说:你为什么不看通知啊?弟弟说:我忘了看通知这件事,你怎么不提醒我昵?两个人就这样吵吵闹闹,一路吵到60层。到了这时候原创 2022-01-23 21:23:57 · 468 阅读 · 0 评论 -
usb驱动开发5——总线设备与接口
Linux设备模型中的总线落实在USB子系统里就是usb_bus_type,它在usb_init的函数bus_register(&usb_bus_type)里注册。usb_bus_type定义如下:原创 2022-01-23 21:21:43 · 726 阅读 · 0 评论 -
usb驱动开发4——总线设备驱动模型
在上文说usb_init函数,却给我们留下了很多岔路口。这次就来好好聊聊关于总线设备驱动模型。这节只讲理论,不讲其中的函数方法,关于函数方法使用参考其他资料。总线、设备、驱动对应内核结构体分别为bus_type、device、device_driver。我们会发现,struct bus_type 结构中有成员struct kset drivers 和struct kset devices,同时struct device结构中有两个成员struct bus_type和structdevice_driver原创 2022-01-23 21:18:55 · 430 阅读 · 0 评论 -
usb驱动开发3——先看core
我们会发现,struct bus_type 结构中有成员struct kset drivers 和struct kset devices,同时struct device结构中有两个成员struct bus_type和structdevice_driver,struct device_driver结构中有两个成员struct bus_type和struct klist。先不说什么是klist、kset,光从成员的名字看,它们就是一个完美的三角关系。原创 2022-01-23 21:18:07 · 269 阅读 · 0 评论 -
usb驱动开发2——代码地图
USB只是Linux庞大家族里的一个小部落,host controller是它们的族长,族里的每个USB设备都需要被系统识别。下图显示包含一个USB接口的USB鼠标导出的结果。USB系统中的第一个USB设备是root hub,它是和host controller绑定在一起的。这个root hub通常包含在PCI设备中,是连接PCI总线和USB总线的bridge,控制着连接到其上的整个USB总线。所有的root hub,内核的usb core都分配有独特的编号,上面贴出来的例子里,就是usb2,因为它注册原创 2022-01-23 15:48:03 · 299 阅读 · 0 评论 -
usb驱动开发1——学习准备
熟悉linux驱动开发,同时需要了解usb协议规范,对照linux下的usb驱动代码慢慢分析和学习Q:为什么要开发usb?在usb出现以前,设备接口多样化(有串口、并口等),而usb可以实现这些接口的统一和标准化,USB是为了解决速度、扩展能力、易用性应景而生的Q:usb规范的发展经历了哪些?Usb的发展经历了1.0、1.1、2.0(在2009年之前)三个阶段。控制器OHCI和UHCI虽然支持的都是1.1的控制器,但是支持的硬件范围不一样。每个USB2.0 控制器带有3个芯片,根据设备的识别原创 2022-01-23 15:38:05 · 487 阅读 · 0 评论