注:本文依据ARMSYS-II的硬件进行说明,同样也适用于ARMSYS44B0-P,但对hc_sl811-hw.h的修改内容不同。
1 uCLinux下的USB 主控制器驱动(HCD)
SL811HS 的Linux主设备驱动可以集成到linux的USB主协议栈中,并在linux 环境下提供一个完整的USB解决方案。 【术语解说:usb 驱动】USB 设备驱动程序主要负责利用系统提供的底层操作接口来配置设备,或和设备进行通讯。底层的函数本身又由两部分组成,一部分是“通用串行总线驱动程序(USBD)”模块和较低层的“主设备控制器驱动程序(HCD)”模块。
1.1 Linux的USB协议栈 Linux 的USB 协议栈可以分为3 个层次(从上到下):USB 设备驱动,USB 内核,和USB 主设备控制器驱动(HCD)。USB 设备驱动层建立了虚拟链接,配置,和与设备的通讯。 它将数据安装到USB 请求块(URB)并通过一系列的API 函数调用将请求发送到USB内核。
USB 内核是一个介于USB设备驱动和HCD之间的层。USB 内核层完成以下处理: ◎ USB 设备的枚举和配置; ◎ 安装或卸载某个USB 设备驱动; ◎ 通过一系列的API与设备驱动接口; ◎ 通过一系列的API与HCD接口; USB 主设备控制器驱动(HCD)是一个硬件抽象层,对USB 协议栈的其它部分隐藏了硬件控制的具体实现部分。HCD 接收来自linuxUSB 内核的USB 请求,解析USB 请求同时创建USB事务。HCD在当前带宽可用时,安排USB 事务的传输。
1.2 SL811HS的linux主控制器驱动 SL811HS 的HCD 对Linux的USB 协议栈进行补充,加入对SL811HS主设备控制器的支持。SL811Hs的HCD可以分为以下功能模块: ◎ 对虚拟根hub 的支持; ◎ USB 请求队列 ◎ USB 请求安排表 ◎ 中断处理 ◎ USB 请求转化为USB 事务和包 ◎ USB 包的发送和接收 HCD支持中断,控制,和批量端点,目前的版本还不支持同步的端点。 HCD与Linux USB内核接口通过一系列的API 函数接口。
1。3 SL811HS 的HCD相关的文件 l hc_simple.c 一个简易的HCD前端,作用于USB内核和操作USB请求块; l hc_sl811.c 一个负责处理中断的HCD,同时还接收和发送数据包; l hc_sl811_rh.c 包括了虚拟根hub例程; l hc_simple.h 头文件; l hc_sl811.h 头文件; l hc_sl811-hw.h 与硬件接口相关的头文件; 因此,在移植中,我们将主要修改hc_sl811-hw.h文件中的内容。
2 实验内容与步骤
由接口线路可知,SL811HS 的内部地址/数据的访问地址分别为: #define SL811H_ADDR 0x0a000000 /A1=0; #define SL811H_DATA 0x0a000004 / A1=1;
2 .1 hc_sl811-hw.h 文件的修改
在该文件中,设备基地址,SL811HS数据寄存器的地址,和中断号的设置是由特定的 硬件决定的。在ARMSYS-II实验箱的体系中,做如下设定: #define SIZEOF_IO_REGION 2 static int base_addr = 0xa000000; static int data_reg_addr = 0xa000004; static int irq = 24; 另外还需要修改中断初始化函数定义,这个函数的定义也是由特定的硬件决定的。它用 来将中断初始化为上升沿触发。 /***************************************************************** * 函数名称: init_irq [arm] * 输入:无 * 返回值:无 *****************************************************************/ static void inline init_irq (void) { outl( inl(S3C44B0X_PCONG)|0x0c, S3C44B0X_PCONG); outl( inl(S3C44B0X_PUPG) & 0xfd, S3C44B0X_PUPG); outl((inl(S3C44B0X_EXTINT) & 0xffffff0f) | 0x00000040, S3C44B0X_EXTINT); outl(inl(S3C44B0X_INTMSK) & ( ~( 1 << 24 ) ),S3C44B0X_INTMSK ); }
2.2 配置、编译和下载
内核配置过程如下: 进入Kernel Configuration的主菜单,首先进入Code maturity level options à 选中:[*]Prompt for development and/or incomplete code/drivers; 退出,再进入USB Support--> 选中:<*>Support for USB 在---USB Host Controller Drivers下 选中[*]SL811HS (*86, StrongARM) Support old driver. 退出配置。 修改并配置好内核后,就可以按照步骤进行编译,最终产生image.ram下载到目标板上。 顺利的话,uClinux在启动时将会自动找到硬件并进行初始化,并显示如下信息: USB.C: registered new driver hub Hs_sl811.c: USB SL811 at a000000, a000004, IRQ 24 Hub.c: USB hub found Hub.c: 1 port detected …… 出现正确的启动信息后,就可以开始进一步应用的开发。
|