usbserial驱动流程解析_Part3_write_read数据流分析

32 篇文章 1 订阅
8 篇文章 0 订阅

usb转串口设备需要进行收发,主机接到uart rx线上的数据,把主机数据发送到 uart  tx线上,对应的就是read函数和write函数,以上两个Part提到了tty有关的函数,在以下结构体被定义,write被指定为serial_write,read在open里面被调用

static const struct tty_operations serial_ops = {
	.open =			serial_open,
	.close =		serial_close,
	.write =		serial_write,
	.hangup =		serial_hangup,
	.write_room =		serial_write_room,
	.ioctl =		serial_ioctl,
	.set_termios =		serial_set_termios,
	.throttle =		serial_throttle,
	.unthrottle =		serial_unthrottle,
	.break_ctl =		serial_break,
	.chars_in_buffer =	serial_chars_in_buffer,
	.wait_until_sent =	serial_wait_until_sent,
	.tiocmget =		serial_tiocmget,
	.tiocmset =		serial_tiocmset,
	.get_icount =		serial_get_icount,
	.set_serial =		serial_set_serial,
	.get_serial =		serial_get_serial,
	.cleanup =		serial_cleanup,
	.install =		serial_install,
	.proc_show =		serial_proc_show,
};

write:

write的调用流程是这样的:

此write被指定为generic write:

static void usb_serial_operations_init(struct usb_serial_driver *device)
{
	set_to_generic_if_null(device, open);
	set_to_generic_if_null(device, write);
	set_to_generic_if_null(device, close);
	set_to_generic_if_null(device, write_room);
	set_to_generic_if_null(device, chars_in_buffer);
	if (device->tx_empty)
		set_to_generic_if_null(device, wait_until_sent);
	set_to_generic_if_null(device, read_bulk_callback);
	set_to_generic_if_null(device, write_bulk_callback);
	set_to_generic_if_null(device, process_read_urb);
	set_to_generic_if_null(device, prepare_write_buffer);
}

在generic write中,buf也就是tty要下发的值,存在了write fifo里面

在write start里面,调用prepare_write_buffer,就像上面所说,也被指定为了generic

int usb_serial_generic_prepare_write_buffer(struct usb_serial_port *port,
						void *dest, size_t size)
{
	return kfifo_out_locked(&port->write_fifo, dest, size, &port->lock);
}

这个操作把write fifo里面的待发送数据放到urb里面,然后submit即可:

read:

可以看到,open usb转串口设备的时候就会开始read

最后会调用到read urb,然后submit urb即可

1、在win98、winme、win2000,windows XP系统中: 先双击driver里hidcominst程序,它没有任何显示。然后再插上USB线, 根据系统提示及可正确安装。 安装完成之后,进入设备管理器,在“端口”一栏中可以看到虚拟的串口设备 SemiTech USB-HID->COM device (COM X ) ,表示设备已经正确安装完成, 可以正常使用。 2、在WinXP系统中:有些可能失败安装HIDCOM driver 。双击driver里HidcomInst程序,就可以在设备管理器的"端口"一栏中可以看到虚拟的串口设备。semiTech.USB-HID->COM device (COM X ),表示设备已经正确安装完成,可以正常使用. 或者先插上USB线,进入设备管理器,在“人体学输入设备”一栏中可以看到 “HID-compliant Device”和“USB人体学输入设备” (在此之前请确认已经移去所有其他“USB人体学输入设备”), 在“HID-compliant Device”上点击鼠标右键: 选择:更新驱动程序 选择:从列表或指定位置安装,单击下一步, 选择:不要搜索,我要自己选择要安装的驱动程序.单击下一步, 选择:从磁盘安装,打开浏览,从驱动盘中找到hidcom.INF文件,打开,单击确定, 选择下一步,此时系统会提示微软的数字签证,选择仍然继续,单击完成。 在“USB人体学输入设备”上点击鼠标右键: 选择:更新驱动程序 选择:从列表或指定位置安装,单击下一步, 选择:不要搜索,我要自己选择要安装的驱动程序.单击下一步, 选择:从磁盘安装,打开浏览,从驱动盘中找到hidcom.INF文件,打开,单击确定, 选择下一步,此时系统会提示微软的数字签证,选择仍然继续,单击完成。 完成以上两项更新之后,在设备管理器的“端口”一栏中可以看到虚拟的串口设备 SemiTech USB-HID->COM device (COM X ) ,表示设备已经正确安装完成,可以正常使用。 3、如果在win98、winme、win2000系统安装过程中出现设备不能正常使用,请参看WinXP的 安装方法进行程序升级。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值