linux主设备和从设备,基于Linux的USB主/从设备之间的三种通信方式

在(arch/arm/mach-sa1100/usb-char.c)可以找到一个叫做usb-char的模块,这是一个很好的设备端SA1110 Linux USB模块的例子。该模块将USB设备与USB 主机之间的连接变成一种高速串行链接。此外, usb-eth( arch/arm/mach-sa1100/usb-eth.c)模块也是个不错的例子,该模块将USB变成了一种虚拟的以太型网络。后面会深入探讨这两种模块。

2. USB主机端通信过程

有些很好的主机端USB驱动程序的例子是随主流Linux操作系统的发布而提供的,位于The Linux Kernel Archives ()发布的原始内核源代码中。其中,Handspring Visor 模块(drivers/usb/serial/visor.c)是一个编写得更清晰,也更易理解的模块,它同时也是USB 主机端模块(drivers/usb/usb-skeleton.c)的模板。

利用USB实现高速串行通信

1. USB设备端通信过程

为了达到最实用的效果,我们可以将USB总线简单地看作一个高速串口,然后,在一些嵌入式设备和应用中,我们就可以用USB接口来模拟串口。StrongARM处理器的Linux内核就提供了一个名为usb-char的USB设备驱动程序,它所完成的恰好就是用USB模拟串口的功能。

当需要与USB 主机通信时,Linux操作系统中的USB设备应用只是简单地打开一个与其usb-char设备节点的连接(连接类型为字符型,major number 为10, minor 为240),然后就开始读写数据。在与USB 主机的连接建立之前,read()和write()操作均返回一个错误信息。一旦连接建立好,并且设备查询完成之后,USB接口就开始象一个点对点的串口一样与主机进行通信。

这种进行USB数据传送的方法非常简单有效,因而usb-char设备模块发布之后一直很受欢迎。而且,该模块还为通过其他方法进行USB通信提供了一个参考。

在usb-char中,真正的操作开始于usbc_open()函数,列表1给出了函数的一部分代码。笔者由于临时的兴趣,对该代码做了一点修改,取消了错误和超时句柄。在此向代码的原作者Brad Parker、Nicolas Pitre 和Ward Willats致歉。

twiddle_descriptors()函数用于设置设备的USB描述符。在描述符设置好之后,我们就可以开始进行设备查询,并从USB 主机接收一帧数据。kick_start_rx()函数段的代码主要用于调用sa1100_usb_recv(),建立回调。

在USB主机发送一个数据包时,设备的内核模块会通过回调方式调用rx_done_callback_packet_buffer()函数,将数据包的内容送入一个FIFO队列,以便能通过read()函数将该数据包返回给usb-char设备节点。

2. USB主机端通信过程

对于运行Linux操作系统的USB 主机,与usb-char相应的USB 主机模块叫做usbserial。大多数Linux版本中都包含了该模块,但它并不总能自动加载。通常应在主机与USB设备之间的连接建立之前利用modprobe 或insmod加载该模块。

USB设备查询完成之后,主机上的一项应用就会利用某个usbserial设备节点(字符型, major 为188, minor 大于等于0)与其通信。这些节点通常叫做/dev/ttyUSBn。Usbserial模块会报告它将哪一个节点分配给了哪一台USB设备,并将这一信息按如下方式记载在内核消息记录中:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值