CH340-341驱动源码_第1页
CH340-341驱动源码_第2页
CH340-341驱动源码_第3页
CH340-341驱动源码_第4页
CH340-341驱动源码_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

USB转串口CH340341驱动源码#include #include #include #include #include #include #include #define DEFAULT_BAUD_RATE 2400static int debug;static struct usb_device_id id_table = USB_DEVICE(0x4348, 0x5523) , ,;MODULE_DEVICE_TABLE(usb, id_table);struct ch341_private unsigned baud_rate;u8 dtr;u8 rts;static int ch341_control_out(struct usb_device *dev, u8 request, u16 value, u16 index)int r;dbg(ch341_control_out(%02x,%02x,%04x,%04x), USB_DIR_OUT|0x40,(int)request, (int)value, (int)index);r = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, value, index, NULL, 0, 1000);return r;static int ch341_control_in(struct usb_device *dev, u8 request, u16 value, u16 index, char *buf, unsigned bufsize)int r;dbg(ch341_control_in(%02x,%02x,%04x,%04x,%p,%u), USB_DIR_IN|0x40,(int)request, (int)value, (int)index, buf, (int)bufsize);r = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, value, index, buf, bufsize, 1000);return r;int ch341_set_baudrate(struct usb_device *dev, struct ch341_private *priv)short a, b;int r;dbg(ch341_set_baudrate(%d), priv-baud_rate);switch (priv-baud_rate) case 2400:a = 0xd901;b = 0x0038;break;case 4800:a = 0x6402;b = 0x001f;break;case 9600:a = 0xb202;b = 0x0013;break;case 19200:a = 0xd902;b = 0x000d;break;case 38400:a = 0x6403;b = 0x000a;break;case 115200:a = 0xcc03;b = 0x0008;break;default:return -EINVAL;r = ch341_control_out(dev, 0x9a, 0x1312, a);if (!r)r = ch341_control_out(dev, 0x9a, 0x0f2c, b);return r;int ch341_set_handshake(struct usb_device *dev, struct ch341_private *priv)dbg(ch341_set_handshake(%d,%d), priv-dtr, priv-rts);return ch341_control_out(dev, 0xa4,(priv-dtr?1rts?16:0), 0);int ch341_get_status(struct usb_device *dev)char *buffer;int r = -ENOMEM;const unsigned size = 8;dbg(ch341_get_status();buffer = kmalloc(size, GFP_KERNEL);if (!buffer)goto out;r = ch341_control_in(dev, 0x95, 0x0706, 0, buffer, size);/* return value ignored */r = 0;out:kfree(buffer);return r;/* - */int ch341_configure(struct usb_device *dev, struct ch341_private *priv)char *buffer;int r = -ENOMEM;const unsigned size = 8;dbg(ch341_configure();buffer = kmalloc(size, GFP_KERNEL);if (!buffer)goto out;/* expect two bytes 0x27 0x00 */r = ch341_control_in(dev, 0x5f, 0, 0, buffer, size);if (r 0)goto out;r = ch341_control_out(dev, 0xa1, 0, 0);if (r 0)goto out;r = ch341_set_baudrate(dev, priv);if (r 0)goto out;/* expect two bytes 0x56 0x00 */r = ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size);if (r 0)goto out;r = ch341_control_out(dev, 0x9a, 0x2518, 0x0050);if (r 0)goto out;/* expect 0xff 0xee */r = ch341_get_status(dev);if (r 0)goto out;r = ch341_control_out(dev, 0xa1, 0x501f, 0xd90a);if (r 0)goto out;r = ch341_set_baudrate(dev, priv);if (r 0)goto out;r = ch341_set_handshake(dev, priv);if (r baud_rate = DEFAULT_BAUD_RATE;priv-dtr = 1;priv-rts = 1;r = ch341_configure(serial-dev, priv);if (r port0, priv);return 0;/* open this device, set default parameters */static int ch341_open(struct usb_serial_port *port, struct file *filp)struct usb_serial *serial = port-serial;struct ch341_private *priv = usb_get_serial_port_data(serial-port0);int r;dbg(ch341_open();priv-baud_rate = DEFAULT_BAUD_RATE;priv-dtr = 1;priv-rts = 1;r = ch341_configure(serial-dev, priv);if (r)goto out;r = ch341_set_handshake(serial-dev, priv);if (r)goto out;r = ch341_set_baudrate(serial-dev, priv);if (r)goto out;r = usb_serial_generic_open(port, filp);out:return r;/* Old_termios contains the original termios settings and * tty-termios contains the new setting to be used. */static void ch341_set_termios(struct usb_serial_port *port, struct ktermios *old_termios)struct ch341_private *priv = usb_get_serial_port_data(port);struct tty_struct *tty = port-tty;unsigned cflag;unsigned baud_rate;dbg(ch341_set_termios(%p,%p), port, old_termios);if (!port-tty | !port-tty-termios)return;cflag = tty-termios-c_cflag;/* check that they really want us to change something */if (old_termios & cflag = old_termios-c_cflag)return;baud_rate = tty_get_baud_rate(tty);switch (baud_rate) case 2400:case 4800:case 9600:case 19200:case 38400:case 115200:priv-baud_rate = baud_rate;break;default:dbg(Rate %d not supported, using %d, baud_rate, DEFAULT_BAUD_RATE);priv-baud_rate = DEFAULT_BAUD_RATE;ch341_set_baudrate(port-serial-dev, priv);/* Unimplemented: * (cflag & CSIZE) : data bits 5, 8 * (cflag & PARENB) : parity NONE, EVEN, ODD * (cflag & CSTOPB) : stop bits 1, 2 */ return;static struct usb_driver ch341_driver = .name= ch341,.probe= usb_serial_probe,.disconnect= usb_serial_disconnect,.id_table= id_table,.no_dynamic_id= 1,;static struct usb_serial_driver ch341_device = .driver = .owner= THIS_MODULE,.name= ch341-uart,.id_table = id_table,.usb_driver = &ch341_driver,.num_interrupt_in = NUM_DONT_CARE,.num_bulk_in = 1,.num_bulk_out = 1,.num_ports = 1,.open = ch341_open,.set_termios = ch341_set_termios,.attach = ch341_attach,;static int _init ch341_init(void)int retval;retval = usb_serial_register(&ch341_device);if (retval)return retval;retval = usb_register(&ch341_driver);if (retval)usb_serial_deregister(&ch341_device);return retval;static

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论