一个 USB 总线引出两个重要的链表,一个为
USB 设备链表,一个为 USB 驱动链表。设备链表包含各种系统中的USB 设备以及这些设备的所有接口,驱动链表包含 USB 设备驱动程序(usb
device driver)和 USB 驱动程序(usb driver)。
USB 设备驱动程序(usb device driver)和 USB 驱动程序(usb driver)的区别是什么?
USB 设备驱动程序包含 USB 设备的一些通用特性,将与所有 USB 设备相匹配。在 USB core 定义了:struct usb_device_driver usb_generic_driver。usb_generic_driver 是 USB 子系统中唯一的一个设备驱动程序对象。而 USB 驱动程序则是与接口相匹配,接口是一个完成特定功能的端点的集合。
设备是如何添加到设备链表上去的?
在设备插入 USB 控制器之后,USB core 即会将设备在系统中注册,添加到 USB 设备链表上去。
USB 设备驱动程序(usb device driver)是如何添加到驱动链表上去的?
在系统启动注册 USB core 时,USB 设备驱动程序即将被注册,也就添加到驱动链表上去了。
接口是如何添加到设备链表上去的?
在 USB 设备驱动程序和 USB 设备的匹配之后,USB core 会对设备进行配置,分析设备的结构之后会将设备所有接口都添加到设备链表上去。比如鼠标设备中有一个接口,USB core 对鼠标设备配置后,会将这个接口添加到设备链表上去。
USB 驱动程序(usb driver)是如何添加到驱动链表上去的?
在每个 USB 驱动程序的被注册时,USB 驱动程序即会添加到驱动链表上去。
比如鼠标驱动程序,usb_mouse_init 函数将通过 usb_register(&usb_mouse_driver)
将鼠标驱动程序注册到 USB core 中,然后就添加到驱动链表中去了。其中 usb_mouse_driver 是描述鼠标驱动程序的结构体。
已配置状态(configured status)之后话
当鼠标的设备、接口都添加到设备链表,并且鼠标驱动程序也添加到驱动链表上去了,
系统就进入一种叫做已配置(configured)的状态。
要达到已配置状态,将经历复杂的过程,USB core 为 USB
设备奉献着无怨无悔。在这个过程中,系统将会建立起该设备的的设备、配置、接口、设置、端点的描述信息,它们分别被
usb_device、usb_configuration、usb_interface、usb_host_interface、
usb_host_endpoint 结构体描述。
设备达到已配置状态后,首先当然就要进行 USB 驱动程序和相应接口的配对,对于鼠标设备来说则是鼠标驱动程序和鼠标中的接口的配对。USB core 会调用usb_bus 总线的usb_device_match
函数,通过比较设备中的接口信息和 USB 驱动程序中的 id_table,来初步决定该 USB 驱动程序是不是跟相应接口相匹配。通过这一道关卡后,USB core 会认为这个设备应该由这个驱动程序负责。
然而,仅仅这一步是不够的,接着,将会调用 USB 驱动程序中的 probe 函数对相应接口进行进一步检查。如果该驱动程序确实适合设备接口,对设备做一些初始化工作,分配 urb 准备数据传输。
当 鼠标设备在用户空间打开时,
将提交 probe 函数构建的 urb 请求块,urb 将开始为传送数据而忙碌了。urb 请求块就像一个装东西的“袋子”,USB
驱动程序把“空袋子”提交给 USB core,然后再交给主控制器,主控制器把数据放入这个“袋子”后再将装满数据的“袋子”通过 USB core
交还给
USB 驱动程序,这样一次数据传输就完成了。
貌似是这个意思:1,在你下载的驱动源代码文件夹中(这个驱动你估计要到官网找,找到后下载到linux下并用tar -xvzf xxxx.tar.bz什么的类似命令解压),在命令行(终端)下cd到文件目录后,执行./configure,提示完成后(要没有错误)再执行make
make---这里执行了make命令,即gcc的编译命令
【通常make后应该用make install命令来安装的,这样就不用下面的cp了,可惜提示里面没有】
2,编译完成后(make)在当前文件夹找一下有没有firmware的文件或者文件夹,然后拷贝到系统的(linux根文件系统)/lib/firmware或者/lib/firmware/(内核版本对应目录)/,你可以用鼠标也可以在终端下用这个命令
cp -rf firmware/RTL8192U /lib/firmware(拷贝 -递归+强制 源文件 目标文件)
或者执行
cp -rf firmware/RTL8192U /lib/firmware/(KERNEL_VERSION) 目标文件指向的是内核版本对应的目录
注意部分:具体情况要看(内核)目录是不是存在与/lib/firmware下了
3,装载驱动模块并且启动网卡,这里你可以要找找有没有在编译完的目录下找找有没有.ko文件,如果有的话,尝试在终端下用insmod xxx.ko安装这个驱动的动态模块
然后在编译好的文件夹的目录中,终端下执行./wlan0up,这个应该是调用驱动的应用程序用来管理这块无线网卡的
注意部分:当"insmod:error inserting 'xxxx.ko': -1 File exists(安装动态模块:插入xxxx.ko模块错误,文件存在)"的错误提示出来时候,在运行./wlan0up(无线启动)命令后,请先运行./wan0down(无线关闭),这时应该就可以了【xxxx.ko文件有点像windows系统中的sys和lib文件】
注意部分:如果你运行./wlan0up(无线启用)命令时候看到了"unkonw symbol(位置符号表)"的提示信息的时候,建议通过《Method 1》(方法一)建立驱动
-------------------------------------------
你自己可以试一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)