首页
|
新闻
|
新品
|
文库
|
方案
|
视频
|
下载
|
商城
|
开发板
|
数据中心
|
座谈新版
|
培训
|
工具
|
博客
|
论坛
|
百科
|
GEC
|
活动
|
主题月
|
电子展
注册
登录
论坛
博客
搜索
帮助
导航
默认风格
uchome
discuz6
GreenM
»
MCU 单片机技术
» 基于Linux下USB主机接口设计(2)
返回列表
回复
发帖
发新话题
发布投票
发布悬赏
发布辩论
发布活动
发布视频
发布商品
基于Linux下USB主机接口设计(2)
发短消息
加为好友
我是MT
当前离线
UID
1023166
帖子
6651
精华
0
积分
3328
阅读权限
90
来自
燕山大学
在线时间
230 小时
注册时间
2013-12-19
最后登录
2016-1-5
论坛元老
UID
1023166
性别
男
来自
燕山大学
1
#
打印
字体大小:
t
T
我是MT
发表于 2015-11-15 10:57
|
只看该作者
基于Linux下USB主机接口设计(2)
程序设计
,
Linux
,
接口
,
主机
访问存储器和控制寄存器的空间时,先设A0=0后写地址,接下来设A0=1,再进行寄存器/存储器读/写周期。当nWR或nCS处于无效时,SL811HS写或读操作终止。对于连接到SL81lHS的设备,在writenWR信号之前取消片选nCS,数据将一直保持并与指定的值相同。 SL811HS/T的nRST引脚与AT91SAM7X256的PAl8相连,实现软件低电平复位功能。SL811HS/T的引脚7、8与USB接口的 DATA+,DATA-相连实现数据通信。S-L811HS/T的Clk/X1引脚和X2引脚与外接12MHz晶振相连。
3系统软件实现
USB设备驱动程序设计包括主机端设备驱动程序、主机控制器驱动程序和设备端驱动程序3部分组成。主机端设备驱动程序就是设备驱动程序,它是主机环境中为用户应用程序提供一个访问USB外设的接口。Linux为这部分驱动程序提供编程接口,设计者只要按照需求编写驱动程序框架,通过调用操作系统提供的APl接口函数可以完成对USB外设的特定访问。
3.1USB设备驱动程序框架
图5所示Linux中USB驱动的体系结构。LinuxUSB主机驱动由3部分组成:USB主机控制器驱动,USB驱动和不同的USB设备类驱动。USB驱动程序首先要向Linux内核进行注册自己,并告之系统该驱动程序所支持的设备类型及其所支持的操作。这些信息通过usb_driver结构传递。
3.2注册和注销
USB驱动程序注册,就是把在初始化函数中填好的use_driver结构作为参数传递给use_register()函数即可,函数的调用方法为:result=usb_register(&skel_driver);当要从系统卸载驱动程序时,也是将use_driver结构作为参数传递给usb_deregister函数处理。函数的调用格式为:
当USB设备插入时,为了使linux-hotplug系统自动装载驱动程序,需要创建一个MODULE_DEVICE_TABLE。核心代码如下(这个模块仅支持某一特定设备):
3.3probe()函数
probe()函数的编写格式为:staTIcvoid*skel_probe(structusb_device*dev,unsignedintifnum,conststructusb_device_id*id);驱动程序需要确认插入的设备是否可以被接收,如果不接收,或者在初始化的过程中发生任何错误,probe()函数返回一个NULL值。否则返回一个含有设备驱动程序状态的指针,通过这个指针,就可以访问所有结构中的回调函数。
在驱动程序里,最后一点是要注册devfs(设备文件系统)。首先创建一个缓冲用来保存那些被发送给USB设备的数据和那些从设备上接收的数据,并为设备传输创建一个USB请求块(URB)以向设备写入数据,同时USBurb被初始化,然后在devfs子系统中注册设备,允许devfs用户访问USB的设备。注册过程如下:
如果devfs_register函数失败,devfs子系统会将此情况报告给用户。如果设备从USB总线拔掉,设备指针会调用disconnect函数。驱动程序就需要清除那些被分配了的所有私有数据,关闭urbs,并且从devfs上注销调自己。
3.4open(),write()和read()函数
首先,要打开此设备。在open()函数中MODULE_INC_USE_COUNT宏是一个关键,它起到一个计数的作用,有一个用户态程序打开一个设备,计数器就加1。read()函数首先从open()函数中保存的fi。write()函数和read()函数是完成驱动对读写等操作的响应。在skelwrite中,一个FLL_BULK_URB函数,就完成了urb系统callbak和的skel_write_bulk_callback之间的联系。read函数与write函数稍有不同在于:程序并没有用urb将数据从设备传送到驱动程序,而是用usb_bulk_msg函数代替,这个函数能够不需要创建urbs和操作urb函数的情况下,来发送数据给设备,或者从设备来接收数据。调用usb_bulk_msg函数并传到一个存储空间,用来缓冲和放置驱动收到的数据,若没有收到数据表示失败并返回一个错误信息。usb_bulk_msg函数,当对USB设备进行一次读或者写时,usb_bulk_msg函数是非常有用的;然而,当需要连续地对设备进行读/写时,应建立一个自己的urbs,同时将urbs提交给USB子系统。
MOD_DEC_USE_COUNT宏也会被调用到,首先确认当前是否有其他的程序正在访问这个设备,如果是最后一个用户在使用,可以关闭任何正在发生的写,操作如下:
USB设备可以在任何时间点从系统中取走,即使程序目前正在访问它。USB驱动程序必须要能够很好地处理解决此问题,它需要能够切断任何当前的读写,同时通知用户空间程序:USB设备已经被取走。
4实验结果
经过大量的试验,该系统工作稳定可靠,传输速度快且具有极低的误码率。利用逻辑分析仪和BusHound软件进行相应的逻辑功能分析,USB主机与设备之间可以正常通信。因为整个电路主要应用于称重系统,所以着重测试了控制传输和批量传输这两种数据传输方式。批量传输的有效数据传输速率可以达到 1Mb/s,这是传输带宽的限制和数据包中冗余信息的存在所导致的。总体来讲,1Mb/s的传输速率还是令人满意的。
5结束语
本系统以AT91SAM7X256单片机为核心进行设计,采用SL811HS/T主控器件,实现了USB主机端口的扩展,使称重设备中同时具有 USB设备端和主机端口,因此,该系统设计实现数据的点对点通信,实现称重设备数据更新、系统升级的可靠、快捷,适合工矿企业特殊环境下设备数据的更新,便于对设备的管理和维护。并在称重系统中引入USB主机端口具有非常实用的特点。因此,该系统设计具有很好的应用前景。
收藏
分享
评分
回复
引用
订阅
TOP
返回列表
电商论坛
Pine A64
资料下载
方案分享
FAQ
行业应用
消费电子
便携式设备
医疗电子
汽车电子
工业控制
热门技术
智能可穿戴
3D打印
智能家居
综合设计
示波器技术
存储器
电子制造
计算机和外设
软件开发
分立器件
传感器技术
无源元件
资料共享
PCB综合技术
综合技术交流
EDA
MCU 单片机技术
ST MCU
Freescale MCU
NXP MCU
新唐 MCU
MIPS
X86
ARM
PowerPC
DSP技术
嵌入式技术
FPGA/CPLD可编程逻辑
模拟电路
数字电路
富士通半导体FRAM 铁电存储器“免费样片”使用心得
电源与功率管理
LED技术
测试测量
通信技术
3G
无线技术
微波在线
综合交流区
职场驿站
活动专区
在线座谈交流区
紧缺人才培训课程交流区
意见和建议