在uClinux下添加SL811HS的硬件底层驱动

发 布 时 间 : 2008-11-17 来 源 : 立宇泰电子 作 者 : 立宇泰电子 浏 览 :

注:本文依据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
……
出现正确的启动信息后,就可以开始进一步应用的开发。



上一篇:uClinux 的framebuffer简介/如何配置framebuffer 下一篇:ARMSYS44B0开发板FAQ