USB 总线引出两个重要的链表!
一个 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 驱动程序,这样一次数据传输就完成了。
方案一:
Linux不像Windows一样,接上新硬件后可以自动识别,在Linux下无法自动识别新硬件的,需要手动去识别。USB移动存储设备通常被识别为sda1,具体可以通过fdisk -l命令查询。
在使用U盘前,我们先要为外挂点新建一个子目录,一般外挂点的子目录都是建立在/mnt里面的,我们也建在那里,当然也可以建在/目录下,名字可以自己定,我们就取名为usb,终端下的命令如下:
mkdir /mnt/usb
然后我们就可以接上我的U盘了,然后在终端下输入命令并击Enter键即可:
mount /dev/sda1 /mnt/usb
在Windows下当我们用完U盘后,在我们取下U盘前我们先要删除,同样在Linux下我们也要删除挂起点,方法是:
umount /dev/sda1 /mnt/usb 或 umount /dev/sda1
如果不把U盘给umount掉,那样很容易造成数据的丢失
方案二:
USB的支持关键在于驱动,没有驱动设备时mount执行是肯定不成的。我在Red Hat里使用U盘的通用方法如下,屡试不爽
1. 先别插U盘,/sbin/lsmod看是否有usb-storage。如果没有的话:
cd /lib/modules/2.4.20-8/kernel/drivers/usb
for v in *.o storage/*.o do /sbin/insmod $v done
2. 这里再/sbin/lsmod,应该有usbcore、usb-ohci(或usb-uhci,根据主板芯片组而不同)、usb-storage、scsi_mod等。其中usb-storage的状态应该为
(unused)。
3. 插入U盘,不停的'/sbin/lsmod,这期间usb-storage的状态应为Initializing,持续时间大约半分钟,其实就相当于Windows在右下角不停的d汽球:)
4. 初始化结束后, /sbin/fdisk -l,应该能看到/dev/sda1设备。这时,执行mount /dev/sda1 /mnt/udisk 才能成功。如果是MSDOS格式,又想看到中文,可以
mount -t vfat /dev/sda1 /mnt/udisk -o iocharset=gb2312。
(为方便可以/etc/fstab加一行,以后就可以 mount /mnt/udisk就行了)。
5. 奇怪的是有时候fdisk是看不到sda1,但是也能mount上使用以上步骤挂U盘基本上可说是万全了。台式机、笔记本、VMware都一样。
mkdir /mnt/usb
mount /dev/sda1 /mnt/usb
笔记本上安装linux用法和台式机一样
ps:
首先要检查lsmod|grep usb-storage 这是支持USB的模块。如果没有的话,是无法 *** 作USB接口的设备的。
如没有的话,可以手功modprobe usb-storage,一般查看U盘可以用fdisk -l可以很清楚的看到这个硬件的设备名,比猜测硬件名要准确多了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)