USB设备驱动程序拿来驱动相应的USB设备,USB设备驱动用usb_driver表示,它主要拿来将USB设备挂接到USB核心中,并启动USB设备,让其正常工作。对于USB设备的具体读写操作由置于usb_driver设备中的usb_class_drivers成员来实现,该成员定义了一个file_operations结构体,拿来对设备进行读写操作。
1.USB设备驱动模型
设备须要驱动能够正常工作,所以当系统监测到设备时,应当将其与对应的驱动程序绑定。设备与驱动的绑定,只还能在同一总线上的设备与驱动之间进行。总线与设备和驱动的联接,须要相应总线的核心代码来实现。对于USB总线,实现总线与驱动和设备的联接,是通过USB核心(USBcore)来完成的。
2.USB驱动结构
在USB设备驱动模型中红旗linux6.0教程,USB设备驱动使用usb_driver结构体来表示,该结构体中包含了与具体设备相关的核心函数,对于不同的设备,须要实现不同功能的函数。usb_driver结构体的定义如下:
在cp210210x中该结构体的定义如下:
其中probe函数指向USB驱动的程序的侦测函数,当有USB设备插入时,USB核心会调用该函数进行设备的初始化工作。
2.1usb驱动注册函数usb_register()
在初始化函数中,首先要注册一个USB驱动,注册USB驱动的函数是usb_register()。须要注意的是,调用该函数之前应当要对usb_driver进行必要的初始化,使用MODULE_DEVICE_TABLE(usb,...)宏来展示设备信息。
2.2设置USB转并口的线路规程
线路规程要为并口的使用定下数据交换的规程。Linux内核中早已存在了许多的规程,如PPP、SLIP、TTY。缺省使用TTY,可以依照自己的须要将规程替换为Linux早已定义的规程结构,甚至是替换为自己的规程结构,当用户要改变线路设置,只须要调用多个termios用户函数中的一个,也可以直接对设备接点调用ioctl,tty核心将会把这两种插口转换为一系列的tty驱动程序的反弹函数,或则是ioctl调用,set_termios反弹函数须要晓得要改变的是哪一个线路设置,之后在tty设备中进行改动。tty驱动程序必须才能对termios结构中所有不同的设置进行解码,并对任何须要的改变做出响应linux安装转串口驱动,所有的线路设置被封装在termios结构当中,在tty核心中定义如下:
该结构被拿来为tty设备上的某一个特定的端口上保存当前码率、数据大小、数据流等参数。
框架函数
1.intusb_serial_register(structusb_serial_device_type*new_device);//向核心注册USB转并口设备
voidusb_serial_deregister(structusb_serial_device_type*device);//向核心注销USB转并口设备。3.USB设备驱动程序
USB设备驱动的实现,首先须要定义一个usb_driver结构变量作为要注册到USB核心的设备驱动,在USB转并口中该结构的定义如下:
3.1侦测函数probe()的参数usb_interface
当USB设备插入插孔的时侯,会导致一个联通号的变化,主机控制器捕获这个联通号,并命令USB核心处理对设备的加载工作。USB核心读取到USB设备固件中相关的信息,并与挂接到USB总线上的驱动程序相比较,假如找到合适的驱动程序usb_driver,都会调用驱动程序的probe()函数。该函数的原型如下:
intusb_serial_probe(structusb_interface*interface,conststructusb_device_id*id);
第一个参数usb_interface是USB驱动中最重要的一个结构体,它代表着设备的一种功能,与一个usb_driver相对应。usb_interface在USB驱动中只有一个,由USB核心负责维护。USB核心调用probe()函数并传递进structusb_interface和structusb_device_id*类型的参数。
插口(interface):在USB合同中,插口(usb_interface)代表一个基本的功能。USB插口只处理一种USB逻辑联接,每一个USB驱动程序(usb_driver)控制一个插口。内核使用structusb_interface结构体来叙述USB插口。USB核心在设备插入的时侯,会读取USB设备插口的信息,并创建一个usb_interface的结构体。接着USB核心在USB总线上找到合适的USB驱动程序,并调用驱动程序的probe()函数,将usb_interface传递给驱动程序。probe()函数的第一个参数就是指向USB核心分配的usb_interface结构体的表针,驱动程序从这儿得到这个插口结构体,但是负责控制该结构体。由于一个插口代表一种基本的功能,所以驱动程序也只是负责该插口所代表的功能。probe()函数的第二个参数从设备读取usb_device_id的信息,拿来与驱动程序匹配。
USB核心处理usb_interface中的大量成员,只有少数几个成员驱动程序会用到linux防火墙设置,usb_interface中的重要成员是:
3.2设置
在里面所述的usb_interface结构体中介绍了altsetting和cur_altersetting,她们都是usb_host_interface的结构体,定义如下:
3.3侦测函数usb_serial_probe()
usb_serial_probe()函数作用是实现热拔插的机制,拿来对设备进行辨识和对设备进行最初的设置,使其才能进行正常的工作。要理解设备对设备进行了如何的初始化工作linux安装转串口驱动,必需要详尽的剖析这一部份的代码:
structusb_device*dev=interface_to_usbdev(interface);
首先是将usb_interface结构转化为usb_device结构,之后是定义了一些结构体表针和变量.
type=search_serial_device(interface);
search_serial_device的定义如下:
该函数的作用是检测所插入的USB设备的id是否匹配一个在定义的设备表中的已知的设备,返回值是一个usb_serial_driver类型的结构体,假若返回的表针为空,则说明没有查找到该设备匹配的驱动则返回。
若是成功则执行try_module_get(type->driver.owner),该函数拿来获取设备所匹配的模块,即设备的驱动,
未完待续......``