首页>计算机>Linux认证>应用技术>正文
基于Linux的USB设备的详细介绍

www.zige365.com 2007-8-21 17:04:30 点击:发送给好友 和学友门交流一下 收藏到我的会员中心
 如果USB通信不再需要,那么设备的内核模块便调用sa1100_usb_stop(),然后是 sa1100_usb_close(),关闭SA1100的USB控制器。

   StrongARM USB控制器支持数据传输作业的bulk-in 和bulk-out。在从USB主机接收数据包时,内核模块调用sa1100_usb_recv(),把数据缓冲区和回调函数地址传递给它。然后内核的底层USB设备控制代码对来自主机的bulk-out包进行检索,把内容放于缓冲区中,并调用回调函数。

   回调函数必须从接收缓冲区提取数据并保存于其它位置或者把缓冲区空间加到一个队列中,为下一个数据包的接收分配新的缓冲区。而后回调函数二次调用sa1100_usb_recv(),在需要时进行下一个数据包的接收。过程与对USB主机的数据传输相类似。在聚集起一帧的数据量后,内核模块将数据的地址、长度和回调地址传递给 sa1100_usb_send()。传输完成时,内核调用回调函数。

   主机

   主机端USB驱动的几个例子在主流的Linux版本以及 Linux内核档案组织分配的原始内核源中都有提供。用于Handspring Visor(drivers/usb/serial/visor.c)的模块是编写较为简洁易懂的模块之一,作为USB主机端模块的模板 (drivers/usb/usb-skeleton.c)使用。

   高速串行

   对于大多数实际应用来说, 可以把USB总线当作一种高速串行端口考虑。如此在某些类型的嵌入式设备和应用中对它进行原型模拟是有意义的。StrongARM处理器的Linux内核提供现成的USB设备驱动专工于此,称作usb-char。

   在希望与USB主机通信时,Linux USB设备应用程序只是打开对其usb-char设备节点(字符型,最大10,最小240)的连接,然后开始读写数据即可。read()和 write()操作将一直返回错误值直到USB主机连上为止。一旦连接建立和枚举完成,便开始通信,就像USB是一种点对点串行端口一样。

   由于这种USB数据传递方法十分直接且实用,因此usb-char设备得到高效使用。它还为其它USB通信方法的实现提供了重要的参照基准。

   usb-char的实际动作从usbc_open()功能开始,部分内容示于列表1中。

   列表1:打开USB上的串行连接

   static int usbc_open(struct inode *pInode, struct file *pFile)

   {

   int retval = 0;

   /* start usb core */

   sa1100_usb_open(_sb-char?;

   /* allocate memory for in-transit USB packets */

   tx_buf = (char*) kmalloc(TX_PACKET_SIZE, GFP_KERNEL | GFP_DMA);

   packet_buffer = (char*) kmalloc(RX_PACKET_SIZE, GFP_KERNEL | GFP_DMA);

   /* allocate memory for the receive buffer; the contents of this

   buffer are provided during read() */

   rx_ring.buf = (char*) kmalloc(RBUF_SIZE, GFP_KERNEL);

   /* set up USB descriptors */

   twiddle_descriptors();

   /* enable USB i/o */

   sa1100_usb_start();

   /* set up to receive a packet */

   kick_start_rx();

   return 0;

本新闻共3页,当前在第2页  1  2  3  

我要投稿 新闻来源:USB开发网 编辑: 作者:
相关新闻
红旗linux认证模拟题库仅供参考(1)
红旗linux认证模拟题库仅供参考(2)
红旗linux认证模拟题库仅供参考(3)
红旗linux认证模拟题库仅供参考(5)
红旗linux认证模拟题库仅供参考(6)
红旗linux认证模拟题库仅供参考(7)