• usb驱动开发3之先看core


    上节中看到usb目录中有一个core目录,凡是认识这个core单词的人都会想要先看看它是什么,对不?用LDD3中一幅图,来表述usb core所处地位。

    clip_image002

    usb core负责实现一些核心的功能,为别的设备驱动程序提供服务,提供一个用于访问和控制USB硬件的接口,而不用去考虑系统当前存在哪种host controller。

    上述就是core的作用和地位,下面就分析core目录下的代码。首先用ls命令看一下它包含哪些文件,顺便用wc –l命令统计一下多少文件和代码。是不是吓了一跳?几万行的代码,core不愧是core,为大家默默的做这么多事。当然不用紧张,我们还是拿着地图(还记得地图是什么?)去慢慢探索。

    先看Kconfig文件,主要包括:USB_DEBUG、USB_DEVICEFS、USB_SUSPEND等,不过这个好像和我们要进行分析的代码没有多大关系,还是等用到再说吧。下面去看Makefile,这个文件就显得简单多了。但是内容却一点也不轻松。

    usbcore-objs := usb.o hub.o hcd.o urb.o message.o driver.o

    config.o file.o buffer.o sysfs.o endpoint.o

    devio.o notify.o generic.o quirks.o

    USB core从USB子系统的初始化开始,我们也需要从那里开始,它们在文件drivers/usb/core/usb.c。

    首先,subsys_initcall(usb_init);module_exit(usb_exit);两个函数分别是usb core子系统的入口和出口点。先看入口

    先看一下上面定义里的__init标记,写过驱动的应该不会陌生,它对内核来说就是一种暗示,表明这个函数仅在初始化期间使用,在模块被装载之后,它占用的资源就会释放掉用作它处。

    另外,nousb是一个标志,这里的nousb是用来让我们在启动内核的时候通过内核参数去掉USB子系统的,一般来说是不会去指定nousb为真,否则输出“USB support disabled”,然后退出usb_init。

    最后,上述的代码一气呵成,排比强烈。总结一下其中各个函数的作用。

    ksuspend_usb_init() 和电源管理相关,如果在编译内核时没有打开电源管理,也就是说没有定义CONFIG_PM,它就什么也不做。

    bus_register(&usb_bus_type)注册USB总线,只有成功的将USB总线子系统注册到系统中,我们才可以向这个总线添加USB设备。

    usb_host_init()执行host controller相关的初始化。

    usb_major_init()一个实际的总线也是一个设备,必须单独注册,因为USB是通过快速串行通信来读写数据,这里把它当作了字符设备来注册。

    usb_register(&usbfs_driver)、usb_devio_init()、usbfs_init()都是usbfs相关的初始化。usbfs为咱们提供了在用户空间直接访问usb硬件设备的接口,但它需要内核的大力支持,usbfs_driver就是用来完成这个光荣任务的。

    usb_hub_init() 和hub相关的初始化。

    usb_register_device_driver(&usb_generic_driver,THIS_MODULE)睁大大眼睛看清楚是USB device driver而不是USB driver,前面说过,一个设备可以有多个接口,每个接口对应不同的驱动程序,这里所谓的device driver对应的是整个设备,而不是某个接口。内核里结构到处有,只是USB这儿格外多。

  • 相关阅读:
    bootStrap-treeview插件
    UML常用图的几种关系的总结
    RFC中文文档
    继承:重新使用接口
    Java8向后兼容
    Java8 时间调节器
    Java8 ChronoUnits枚举
    BigDecimal.divide方法
    java.lang.Double.byteValue() 方法
    事件处理是什么?
  • 原文地址:https://www.cnblogs.com/myblesh/p/3634753.html
Copyright © 2020-2023  润新知