设为首页 友情链接
在线留言 发表文章
加入收藏 广告联系

刺猬首页

| 专案技术 | 网络技术 | 图形图象 | 网络编程 | 网页设计 | 操作系统 | 服务器 | 技术白皮书 | 在线实验室 | 刺猬论坛 |
小说专版  | 数据库 | 设计赏析 | 存储频道 | 网络安全 | 私服架设 |  Solaris | 网站评估 | PC维护技巧 | 下载中心 | 博 客 |
专   题: | Linux | java | cisco | 防病毒 | 刀片 | SOA | iscsi | ASP.NET | SQL | Oracle |
您现在的位置: IT公社 IT community >> Linux专题 >> 内核研究 >> 教程正文 用户登录 新用户注册
专 题 栏 目
最 新 热 门
最 新 推 荐
相 关 文 章
基于Linux操作系统实现的…
基于Linux的移动电话开发…
基于嵌入式Linux的智能手…
基于μClinux的SoPC应用…
编译内核以使其支持PS并…
编译支持NTFS的Linux系统…
基于COM接口的Shell扩展…
菜鸟也能行!FC多媒体终…
Fedora 4.0 播放机支持m…
让Mplayer GUI支持UTF8编…
  支持基于Linux的USB设备的三种方法         
支持基于Linux的USB设备的三种方法
 

引言

通用串行总线(USB)是一种快速而灵活地连接配件与计算机工作站的接口,其应用非常广泛。Linux中除了包含对USB主机控制器的驱动,还含有USB设备控制器,尤其是集成在StrongARM SA1110处理器上的控制器的驱动。这些控制器驱动通过使用USB可使基于Linux的嵌入式系统与主机 (运行的可以是Linux,或不是)进行通信。这里提供三种方法给运行Linux操作系统的嵌入式系统增加USB支持,可采用其中一种与USB主机展开通信。

第一种,最复杂的设备采用专门编写的内核模块解析标准USB总线上通行的错综复杂的高层协议;相应的USB主机定制驱动和应用程序来完成连接。第二种,有些基于Linux的设备把总线当作一种简单的运行在主机上的点对点串行连接使用;主机应用程序采用主机操作系统提供的USB编程界面,而其外在表现则仿佛是在通过一种典型的串行端口进行通信。第三种,另有一些设备把USB看作一种以太网络,它们用主机作网关,把USB设备与办公LAN或 Internet相连接。通常的做法是使用专门的主机驱动实现它。

最佳方案的选择取决于研发所需时间,以及针对具体嵌入式应用,要把USB接口作成什么样。以下对这三种方法如何在基于Linux的USB设备上的应用逐一进行描述。本文是关于如何在基于Linux的照相机和PDA之类的USB设备上使用Linux的论述,在此,USB是指由方形连接器而非扁平矩形连接器构成的USB设备。

内核模块

把USB加到基于Linux的设备上的第一种方法是编写一个定制的Linux内核模块。这种方法通常要求相应开发主机操作系统(Windows、Linux以及其它OS)的驱动。

借助定制内核模块在设备中的安装,可以进行文件系统仿真等,使嵌入式应用将其USB主机当作远程存储设备对待。这一方法的另一潜在用途是构成一种存储转发字符设备,从嵌入式应用程序中缓冲数据流,直到USB主机连接完成建立为止。

对于基于StrongARM的Linux设备,其USB应用内核模块调用sa1100_usb_open(),对管理芯片的板上USB设备控制器外设的内核代码进行初始化。然后该模块调用sa1100_usb_get_descriptor_ptr()和 sa1100_usb_set_string_descriptor(),通过枚举过程对USB主机的给定USB描述符进行设置。这些描述符包括设备供货商及产品的数字标识符、正文字符串等主机可用来对设备进行识别的信息。甚至有一个序列号域,以便主机唯一地识别设备或对USB上相同设备的多个实例加以区分。

内核模块必须在开始USB通信前完成USB描述符的建立,这是因为枚举过程由USB设备控制器驱动,一旦USB主机连上后会自动执行。一切准备就绪后,USB设备模块便调用sa1100_usb_start(),告诉内核接受来自主机的USB连接请求。如果模块在USB主机连上前调用 sa1100_set_configured_ callback(),那么内核将会在枚举过程结束时调用所提供的回调函数。回调函数能很好地对设备完成连接状态进行可视化指示。

如果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)使用。

Linux联盟收集整理

频道声明:本频道的文章除部分特别声明禁止转载的专稿外,可以自由转载.但请务必注明出出处和原始作者 文章版权归本频道与文章作者所有.对于被频道转载文章的个人和网站,我们表示深深的谢意。

原始作者:佚名 录入时间:2007-2-4 20:28:55
信息来源:不详 投稿信箱:itqoo@126.com
教程录入:itqoo    责任编辑:itqoo 
  • 上一个教程:

  • 下一个教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    - 关于我们 - 合作伙伴 - 友情链接 - 广告刊登 - 投稿热线 - 在线留言版权声明联系方式 -
    IT公社版权所有 粤ICP备05127012号
    Copyrigh@2005-2006 itqoo.com.Inc All Rights Reserved  推荐分辨率 1024*768
    联系站长:E-Mail:itqoo@126.com     MSN:urchincc@hotmail.com    QQ:点击这里给我发消息
    特别感谢:亿太网络提供空间支持