usb转uart芯片pl2303.台湾出品,不是很好用,TX被拉低后,容易造成ttyUSB0不能正常工作,经常不识别。
关键驱动如下:
1. init/exit: 内容就是注册 pl2303_device 和 pl2303_driver,很简单。
static int __init pl2303_init(void)
{
int retval;
retval = usb_serial_register(&pl2303_device); //注册usb-serial 设备
if (retval)
goto failed_usb_serial_register;
retval = usb_register(&pl2303_driver); //注册pl2303 usb驱动
if (retval)
goto failed_usb_register;
printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
return 0;
failed_usb_register:
usb_serial_deregister(&pl2303_device);
failed_usb_serial_register:
return retval;
}
static void __exit pl2303_exit(void)
{
usb_deregister(&pl2303_driver); //退出时,反序注销
usb_serial_deregister(&pl2303_device);
}
module_init(pl2303_init);
module_exit(pl2303_exit);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");
module_param(debug, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug enabled or not");
2. struct usb_serial_driver pl2303_device:
这是一个最总的结构体,pl2303_device,包含了usb-serial 芯片的几乎所有功能。
/* All of the device info needed for the PL2303 SIO serial converter */
static struct usb_serial_driver pl2303_device = {
.driver = {
.owner = THIS_MODULE,
.name = "pl2303",
},
.id_table = id_table,
.usb_driver = &pl2303_driver,
.num_ports = 1,
.open = pl2303_open,
.close = pl2303_close,
.dtr_rts = pl2303_dtr_rts,
.carrier_raised = pl2303_carrier_raised,
.write = pl2303_write,
.ioctl = pl2303_ioctl,
.break_ctl = pl2303_break_ctl,
.set_termios = pl2303_set_termios,
.tiocmget = pl2303_tiocmget,
.tiocmset = pl2303_tiocmset,
.read_bulk_callback = pl2303_read_bulk_callback,
.read_int_callback = pl2303_read_int_callback,
.write_bulk_callback = pl2303_write_bulk_callback,
.write_room = pl2303_write_room,
.chars_in_buffer = pl2303_chars_in_buffer,
.attach = pl2303_startup,
.release = pl