新闻中心

EEPW首页 > 模拟技术 > 设计应用 > 基于S3C4510B的USB主控器驱动设计

基于S3C4510B的USB主控器驱动设计

——
作者: 时间:2007-01-26 来源:《现代电子技术》 收藏

1 引言

在现代社会,嵌入式系统逐渐深入到人们生活的方方面面,各类嵌入式系统产品之间往往通过某种接口进行交互或数据传递。而现在,usb已经成为嵌入式数据交换的最主要的方式,可是各种usb接口的设备都是基于pc机系统的,所以,基于嵌入式系统的usb接口的研究具有实用的价值和意义,特别是起master作用的host端接口的研究。

解决这一问题的根本办法就是在需要使用usb设备的嵌入式系统中扩展usb host功能模块,使之具有与usb设备进行数据传输的能力。

usb协议按功能分为2部分,usb host(usb主协议)和usb slave(usb从协议)分别应用于usb host controller(usb主控制器)和usb device(usb设备)。一般,usb host要比usb slave复杂,对于广大的非pc用户来说,尤其是嵌入式系统用户来说,由于usb协议的不对称性,使得实现usb host比usb slave要困难地多,philips公司的isp1161a1芯片很好地解决了这种问题,他封装了复杂的usb协议,使得在嵌入式系统中实现usb host和usb slave变得简单方便。

2 usb host技术简介

usb的通信可以用图1表示,图1中,左半部分为usb主机端,可以看出,usb主机端由2部分构成,即软件体和硬件体,实际上是3个软件组件组成了usb host解决方案,即usb客户驱动程序,usb驱动程序和usb主机控制器驱动程序,应用程序的事务处理是由usb客户驱动程序(设备驱动程序)启动的,客户驱动程序把usb设备当做一个可以被访问的端点集合,他可以被控制并与他的功能单元进行通信,usb系统软件包括usb驱动程序和usb主控制器驱动程序,usb驱动程序负责配置管理、用户管理、总线管理和数据传输,usb主控制器驱动程序负责调度管理,队列管理和控制器管理,以及数据的位编码、封包、循环校验、发送、错误处理等。

本文引用地址:https://www.eepw.com.cn/article/21351.htm

如图2所示,usb host的软件结构分为3大部分,即usb总线驱动(usbd),usb host控制器驱动(hcd)、客户软件、其中客户软件处理和设备有关的信息,usbd处理和硬件无关的协议,而hcd则处理与硬件相关的协议,usbd和hcd都包含了一系列管理各种状态的寄存器。

3 sp1161体系结构

要实现usb协议,必须要通过一系列寄存器来完成,这些寄存器要能实现usb软件结构中的usbd和hcd,即要完成usb协议状态的控制,还要有一定的缓冲区来存放进出的数据,isp1161专门针对usb协议设计的特殊硬件结构可方便地实现usb host和usb slave。isp1161的硬件结构主要是3类不同的寄存器,用户通过操作这3种寄存器来达到实现usb传输的目的,这3类寄存器是:

(1)hc control and status registers:usb主控制器控制和状态寄存器,主要用于传输过程中控制命令的存放和状态的读取,可读可写的寄存器有2个地址,只读或只写的寄存器只有1个地址。

(2)isochronous transfer list (itl):同步传输列表缓冲区。

(3)acknowledged transfer list(atl):接收传输列表缓冲区。

根据usb协议,数据传输分为4种模式,control(控制),bulk(整批),interrupt(中断)和isochronous(同步)。其中itl是为了实现同步传输,atl则实现其他3种模式的传输。

4 isp1161x主控制器编程实现

设计isp1161x主控制驱动程序主要涉及以下2个重要内容,下面详细介绍:

4.1 读/写atl和itl缓冲区

atl和itl缓冲区的位于isp1161x内部的fifo缓冲ram之中,每个缓冲区包含许多ptd(philips transfer descriptor),而ptd用于主控制器硬件发送或接收usb包从usb设备,作为调度usb传输的一部分,hcd在系统内存中购建ptd。然后hcd将购建好的ptd移入atl或者itl缓冲区,主控制器硬件允许软件去访问每一个缓冲区,就像他们是分离的硬件缓冲区,hcd访问atl缓冲区通过硬件寄存器hctransfercounter(22h/a2h)和hcatlbufferport(41h/c1h),而itl缓冲区则由hctransfercounter和hcitlbufferport(40h/c0h)访问。下面一段示例代码取自于本项目,其功能是向atl缓冲区写数据,hci→hp→atl_len表示,atl则在内存中还没有发送的数据的长度,hci→hp→tl表示缓冲区的地址。

4.2硬件初始化过程

当isp1161x上电时,主控驱动程序(hcd)必须经过下列的顺序对硬件进行初始化,以便主控制器进入可操作状态。

检测主控制器,软件复位主控制器,配置hchardwareconfiguration寄存器,配置中断;配置hccontrol寄存器,配置hcfminterval寄存器,配置根集线寄存器,设置itl和atl缓冲区长度,安装int1中断服务程序。

4.2.1 检测主控制器

检测的工作由hcd完成的,hcd通过向寄存器hcscratch写一个值,接着从该寄存器读出,与刚才写入的值进行比较。如果写入的和读出的值相等,hcd得出结论:主控制器存在,对hcchipid寄存器的读也被用来作为额外的条件来检测该寄存器。

4.2.2 主控制器的软件复位

软件复位主控制器通常包括2个步骤:复位主控制器;设置主控制器为reset状态。

hcd通过设置在hccommandstatus寄存器的hcr位来复位主控制器:

一旦主控制器复位了,hcd必须通过设置hccontrol寄存器的hcfs字段为00b,以便使主控制器为reset状态。

4.2.3 配置hchardwareconfiguration寄存器

write_reg16(hci,interruptpinenable|interruptpin trigger interruptoutputpolarity |databuswidth16|analogocenable,hchardwareconfiguration);

上述这段代码表示将主控制器初始化为int1允许,中断是边沿触发,中断的输出极性为高电平,数据线的宽度为16b,使用片上过流检测,模拟输入。

4.2.4 配置中断

主控制器isp1161x有2组中断源,第一组包含usb事件产生的中断,比如start of frame,调度溢出和根集线器状态改变,这些中断的发生由hcinterruptenable和hcinterruptdisable寄存器联合控制,而每个中断的状态由hcinterruptstatus寄存器标识。
第二组是主控制器中状态变化所引起的中断,比如,主控制器延迟所产生的中断,同样,在第一组中断中的任何组合是第二组中断的中断源。

4.2.5 配置hcfminterval寄存器

hcfminterval寄存器的14位值[frameinteral,fi]用于表示一帧之内所占用的比特时间(在2个连续的sofs,15位的值[fslargestdatapacket,psmps)用于表示在没有引发调度溢出下可发送或接收全速最大包大小,fi,psmps的推荐值为0x2edf和0x2778,所以将调用下列语句对该寄存器进行初始化:

write_reg32(hci,0x2edf|(0x2778<<16),hcfminterval);

4.2.6 配置root hub(根集线器)寄存器

随着初始化的深入,下面的专门针对根集线器3个寄存器也必须初始化:hcrhdescriptora,hcrhdescriptorb和hcrhstatus,前2个寄存器是根据电路板的制作自动由isp1161x配置的,这2个寄存器均用来描述根集线器的特性。

hcrhstatus被划分为2个部分,低字部分表示集线器状态,而高字部分表示集线器状态的改变,还有保留部分必须被初始化为逻辑0。

4.2.7 设置itl和atl缓冲区的长度

主控制器isp1161x内部的fifo缓冲区有4kb/s,而这4k将被atl和itl划分为2部分,分由hcatlbufferlength和hcitlbufferlength寄存器表示,itl缓冲区又进一步被分为2个相同的ito0和itd01缓冲区,atl缓冲区必须存在,因为atl缓冲区用于控制,中断和大批量传输,而itl的存在与否是可选的。

4.2.8 设置int1中断的服务程序

如果在主控制器中发生一个或多个中断,isp1161x的int1引脚将会通知微处理器,在本项目中,int1的引脚直接接在arm的int0引脚上,驱动程序通过linux提供的函数request_irq向操作系统申请中断号,并在此函数中向操作系统提供中断处理函数。

request_irq(irq,hc_interrupt,0,"isp116x",hci)

irq为中断号;hc_interrupt为中断处理函数,0为中断标记,"isp116x"表示中断设备名称;hci在此表示中断设备号。

5 在μclinux中编译usb主控驱动

接下来就如何将驱动文件编译到嵌入式操作系统做一个简要说明。

(1)将上述文件拷贝到drivers/usb/

(2)编辑drivers/usb/makefile文件,添加以下内容:

obj-$(config_usb_isp1161)+=hc_isp1161.o

(3)编辑driver/usb/config.in文件,添加如下内容:

dep_tristatisp1161(philips)supportconfig_usb_isp1161 $ config_usb

(4)编译μclinux内核

编译成功后把生成的映象文件用jtag烧写器烧写到开发板的rom中,启动后进行验证实现了对isp1161a1的控制。

6 结语

isp1161a1使得在嵌入式系统中实现usb host变得十分简单方便,便于嵌入式系统中usb的普及。

一个usb host要完成的功能因为需求不同,所使用的协议也不尽相同,有的采用中断传输,有的采用同步传输,usb主机技术在嵌入式系统的应用主要是针对某一种usb设备或集中设备,因而嵌入式系统上可以只固化某几种协议,该技术的应用可以使得在嵌入式系统上轻松接入usb外设、扩展系统的功能、提高仪器的使用灵活性。usb主机技术在嵌入式系统上的应用会有更广泛更美好的前景。




关键词:

评论


相关推荐

技术专区

关闭