Preface
USB体系支持多种类型的设备。
在 Linux内核,所有的USB设备都使用 usb_driver结构描述。
对于不同类型的 USB设备,内核使用传统的设备驱动模型建立设备驱动描述,然后映射到 USB设备驱动,最终完成特定类型的 USB设备驱动
USB驱动·入门:http://infohacker.blog.51cto.com/6751239/1226257
USB串口驱动
USB串口驱动关键是向内核注册串口设备结构,并且设置串口的操作。
下面是一个典型的USB设备驱动分析。
1、驱动初始化函数
usb_serial_init()函数是一个典型的 USB设备驱动初始化函数,定义如下:
static int __init usb_serial_init(void)
{
int i;
int result;
usb_serial_tty_driver = alloc_tty_driver(SERIAL_TTY_MINORS); //申请 tty设备驱动描述
if (!usb_serial_tty_driver)
return -ENOMEM;
/* Initialize our global data */
for (i = 0; i < SERIAL_TTY_MINORS; ++i) {
serial_table[i] = NULL;
}
result = bus_register(&usb_serial_bus_type); //注册总线
if (result) {
err("%s - registering bus driver failed", __FUNCTION__);
goto exit_bus;
}
usb_serial_tty_driver->owner = THIS_MODULE; //初始化串口驱动描述
usb_serial_tty_driver->driver_name = "usbserial"; //串口驱动名称
usb_serial_tty_driver->name = "ttyUSB"; //设备文件系统存放路径
usb_serial_tty_driver->major = SERIAL_TTY_MAJOR; //串口设备主设备号
usb_serial_tty_driver->minor_start = 0; //串口设备从设备号起始 ID
usb_serial_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; //设备类型
usb_serial_tty_driver->subtype = SERIAL_TYPE_NORMAL; //设备子类型
usb_serial_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; //设备初始化标志
usb_serial_tty_driver->init_termios = tty_std_termios; //串口设备描述
usb_serial_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; //串口设备初始