微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > Linux下USB主机接口设计

Linux下USB主机接口设计

时间:11-01 来源: 点击:

频噪声隔离)。SPXll7M-3.3是Sipex公司的LDO器件,其特点为输出电流大,输出电压精度高稳定性高。SPXll7M系列LD0器件输出电流可达800mA,具有电流保护和热保护功能,可广泛应用于数字家电和工业控制等领域。

  2.3USB主机端口设计

  AT91SAM7X256的USB主机端口原理图,如图3所示。SL811HS/T选用48引脚的TQFP封装形式,SL811HS/T既能用作Host模式又能用作Slave模式。将SL811HS/T的M/S引脚接地,即设为低电平信号(M/S=0),选择作为主机端口。

  SL811HS/T的D0~D7端口为双向数据I/O端口,与控制器的PAl0~PAl7端口相连,实现数据通信。SL811HS/T的nRD引脚与AT91SAM7X256的PA9相连,nWR引脚与AT9lSAM7X256的PA8相连,SL811HS/T的nCS引脚与AT91SAM7X256的PA7相连,AO引脚与AT91SAM7X256的PA6相连,控制SL811HS/T的读写状态,如图4所示。

  访问存储器和控制寄存器的空间时,先设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_bul

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top