科创园

科创园地,分享技术知识,为科技助力发展,贡献一己之力。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2014年4月1日

摘要: 从usb总线的那个match函数usb_device_match()开始到现在,遇到了设备,遇到了设备驱动,遇到了接口,也遇到了接口驱动,期间还多次遇到usb_device_match(),又多次与它擦肩而过,“我们以前都失散过,十三年以后,还不是再遇见?”其实每个人都有一条共同之路,与正义和良知初恋,失身于上学,嫁给了钱,被世俗包养。每个设备也都有一条共同之路,与hub初恋,失身于usb_generic_driver,嫁给了接口驱动,被usb总线保养。人类从没有真正自由过,少年时我们坐在课室里动弹不得,稍后又步入办公室,无论外头阳光多好,还得超时加班,终于铅华洗尽,遍历人间沧桑,又要为子女忙 阅读全文

posted @ 2014-04-01 16:00 科创园 阅读(2929) 评论(0) 推荐(2) 编辑

摘要: 从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match,在自己的那条驱动链表里为它们寻找一个合适的接口驱动程序。那么这些接口驱动都从哪里来?这就要说到每个玩儿linux的人都会知道的那几个著名的命令insmod,modprobe,rmmod。你insmod或modprobe驱动的时候,经过一个曲折的过程,会调用到你驱动里的那个xxx_init函数,进而去调用usb_register()将你的驱动提交给设备模型,添加到usb总线的驱动链表里。你rmmod 阅读全文

posted @ 2014-04-01 11:35 科创园 阅读(1136) 评论(0) 推荐(0) 编辑

摘要: 关于字符串描述符的地位仅次于设备/配置/接口/端点四大描述符,那四大设备必须得支持,而字符串描述符对设备来说则是可选的,这并不是就说字符串描述符不重要,对咱们来说,提供字符串描述符的设备要比没有提供的设备亲切的多,不会有人会专门去记前面使用lsusb列出的04b4表示的是Cypress Semiconductor Corp。一提到字符串,不可避免就得提到字符串使用的语言。Spec里就说了,字符串描述符使用的就是UNICODE编码,usb设备里的字符串可以通过它来支持多种语言,不过你需要在向设备请求字符串描述符的时候指定一个你期望看到的一种语言,俗称语言ID,即Language ID。这个语言I 阅读全文

posted @ 2014-04-01 11:34 科创园 阅读(1290) 评论(0) 推荐(0) 编辑

摘要: 我们总是很喜欢高潮,不是吗?那就好好对待她哦。我们来看一下linux中的高潮部分设备是怎么从Address进入Configured的。usb_set_configuration函数的代码就不贴了,可以回顾内核去看。usb_disable_device行函数主要意味着如果设备已经在Configured状态了,就得做些清理工作。都清理些什么怎么去清理?别着急,要想学会,得仔细研究下message.c里的usb_disable_device函数。/* * usb_disable_device - Disable all the endpoints for a USB device * @dev: t 阅读全文

posted @ 2014-04-01 11:33 科创园 阅读(1626) 评论(0) 推荐(0) 编辑

摘要: 现在开始就沿着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子系统初始化的时候就调用driver.c里的usb_register_device_driver函数将usb_generic_d 阅读全文

posted @ 2014-04-01 11:04 科创园 阅读(2181) 评论(0) 推荐(0) 编辑

摘要: 现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符、接口描述符还是端点描述符都挤在一起,所以得想办法将它们给分开。,于是usb_parse_configuration()就做这些事。static int usb_parse_configuration(struct device *ddev, int cfgidx, struct usb_host_config *config, unsigned char *buffer, int size){ unsigned char *buffer0 ... 阅读全文

posted @ 2014-04-01 10:45 科创园 阅读(1895) 评论(1) 推荐(1) 编辑

摘要: 拜会完了山头的几位大哥,还记得我们从哪里来要到哪里去吗?时刻不能忘记自身的使命啊。我们是从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_submit_urb() to have sanity checked and c 阅读全文

posted @ 2014-04-01 10:39 科创园 阅读(1633) 评论(0) 推荐(0) 编辑

摘要: 回到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 *hcd){ if (hcd) kref_get (&hcd->kref); return 阅读全文

posted @ 2014-04-01 10:35 科创园 阅读(1154) 评论(0) 推荐(0) 编辑