linux USB子系统之我的见解。

来源:互联网 发布:网络棋牌平台杀分 编辑:程序博客网 时间:2024/05/17 21:53

昨夜西风凋碧树。独上高楼,望尽天涯路::读薄阶段,可能会有错误。

------王国维的读书三境界------------
读书三境界,是清代文学家王国维提出的读书理论。王国维在《人间词话》说:“古今之成大事业、大学问者,必经过三种之境界:‘昨夜西风凋碧树。独上高楼,望尽天涯路’。此第一境也。‘衣带渐宽终不悔,为伊消得人憔悴。’此第二境也。‘众里寻她千百度,蓦然回首,那人却在灯火阑珊处’。此第三境也。”
古人治学讲究“厚积薄发”,所以第一阶段,重点在于“独上高楼,望尽天涯路”,这是看,要博览;其次的阶段就是要思考,论语中讲“学而不思则罔”。看了那么多东西,就会互相比较,和自己的经历比较,就有所得,就外显“衣带渐宽终不悔,为伊消得人憔悴”;然而,最终的成就要返璞归真,也是大学中说的“在明明德,在止于至善”、也是老子中的“地法天,天法道,道法自然”。学习的最后是体悟自然的规律,顺应于这个规律“随心所欲不逾矩”。
------华丽的分割线------------------
王大师的话太过于文绉绉的,高雅了。其实简单的说,就是把书先读薄了,然后再读厚了,然后再读薄了。
先读薄了就是要理清脉略层次,搞清楚其基本架构,然后读厚了,就是深入进去看每一个部分其具体细节和差异了。
对linux OS的读法尤其如此,我们必须先理清楚其基本架构,然后深入每一个部分看起具体实现,然后再然后,到了第三个层次就可以融会贯通,收发自如了。
------华丽的分割线------------------
前面我们把I2C系统比喻成测试部分,把uart必须成大供应商的管理部,现在我们把USB系统(HOST部分)必须成采购部,或者sourcing部门。采购部有两个职责,一个就是找寻供应商,一个就是有些供应商会主要找到采购部门,要求导入某种元件。
这就是USB系统的初始化过程的查询已经接入的设备和其它供应商主动过来推销产品的过程。
同样,对于linux,也需要提供usb_core的东西,usb控制器,和usb设备部分内容。
usb_core主要提供两个作用,第一个,就是提供usb控制器和usb设备的注册过程和方法(类似于采购部门的建立和供应商登记方法),第二个,就是usb协议部分的基本操作流程和实现。
简单看看usb_core提供的函数:
1.   客户端驱动程序的管理
    usb_register(struct usb_driver *new_driver)
    usb_deregister(struct usb_driver *dirver)

2. 协议控制命令集
    usb_get_status()
    usb_clear_halt()
    usb_set_address()
    usb_get_descriptor()
    usb_get_string()
    usb_get_device()
    usb_set_configuration()
    usb_set_interface()
    usb_get_class_descriptor()
    usb_get_protocol()

3. 数据传输的管理
    usb_alloc_urb()
    usb_free_urb()
    usb_submit_urb()
    usb_unlink_urb()

4.     USB设备的配置和管理
    usb_connect()
    usb_disconnect()
    usb_new_device()
    usb_reset_device()

5.     主控制器的管理
    usb_alloc_bus()
    usb_free_bus()
    usb_register_bus()
    usb_deregister_bus()

USB内核定义了主控制器驱动程序提供的,被USB内核所调用的函数接口
usb_operations

struct usb_operations
|---------------------|
| get_frame_number() -| hcd_get_frame_number()
| submit_urb()        | hcd_submit_urb()
| unlink_urb()        | hcd_unlink_urb()
| buffer_alloc()      | hcd_buffer_alloc()
| buffer_free()       | hcd_buffer_free()
| disable()           | hcd_endpoint_disable()
| hub_suspend()       | hcd_hub_suspend()
| hub_resume()        | hcd_hub_resume()
|---------------------|
------华丽的分割线------------------
:::::确实如此。
如果这样讲,那么usb控制器部分应该是提供usb_core部分算法支持的实现了,例如控制传输的基本实现了。

该驱动的结构体类型为struct hc_driver,其中的成员(*urb_enqueue)最为重要,它是主控制器HCD将数据包urb传向USB设备的核心实现函数,之前已经提到,协议层里最主要的函数usb_control_msg()最终就会回调主控制器的(*urb_enqueue)。

usb_control_msg() => usb_internal_control_msg() => usb_start_wait_urb() => usb_submit_urb() => usb_hcd_submit_urb => hcd->driver->urb_enqueue()

按照我以前建立的模型,这应该就是采购部门的接口部门,公司内部进行采购任务,最终是通过这个接口把任务传到采购部,采购部然后按照公司级别的采购流程文件进行运作,最终完成采购任务了。


------华丽的分割线------------------
设备部分后面再仔细看,先把
fudan_abc孵蛋abc的博客看了。
不知这哥们现在孵了多少蛋了。