再上一篇:6.6.2 基于 Intel Xscale 处理器的 Windows CE 开发环境定制 Windows CE
上一篇:6.6.3 OAL(OEM Adaptation Layer)开发
主页
下一篇:附录 A ARM 指令集、ARM 寻址方式和 Thumb 指令集速查表
再下一篇:表 A –2 ARM 寻址方式速查表
文章列表

6.6.4 Windows CE 设备驱动开发

嵌入式系统(修订本)——Intel XScale 结构与开发 陈章龙 著

Windows CE 下的设备驱动程序将操作系统和硬件联系起来,使得操作系统能够管理硬 件设备,向应用程序提供访问使用硬件的调用。尽管硬件设备之间差异往往很大,但是驱动 程序的开发的自由度通常很小,需要严格遵循一些规范,并有比较严格的性能要求。Windows CE 的设备驱动程序开发的步骤大致如图6-10:

准备资源

配置网络

安装开发平台支持包

裁减操作系统

创建Image

下载运行

图6-16 Windows CE 驱动程序开发步骤

与其它Windows 操作系统一样,设备驱动程序是以DLL 的方式动态加载。
一、中断处理
中断服务总是设备驱动程序的关键部分,与之相对应,中断管理则直接关系到操作系统 的实时响应速度和系统整体性能。我们主要讨论与设备驱动开发有关的中断处理,而不是中 断服务程序本身。Windows CE 的中断处理分成两个处理阶段,由两个不同的对象来实现。 其一是ISR(Interrupt Service Routine),其二是IST(Interrupt Service Thread)。

Windows CE 中断处理过程中ISR 运行在内核模式,并且是关中断的。它将逻辑中断号返回 内核。在Windows CE 2.12 及以前的版本中,当ISR 运行时所有中断源都被屏蔽,甚至包括 优先级更高的中断源。这使得Windows CE 2.12 及以前的版本称不上实时优先级调度的操作 系统。Windows CE 3.0 开始,ISR 运行时只屏蔽同级和优先级低的中断源。但无论怎样,关 中断的时间越短越好。所以 ISR 通常由汇编代码实现,并只向内核返回中断标识号,然后 就能重新开中断了。

具体的中断服务由用户模式下运行的 IST 完成。当收到 ISR 返回的逻辑中断号,内核 调度相应的IST 处理具体工作。IST 对时间的要求比ISR 要宽松一些,而且也能够根据优先 级进行调度。

ISR 在系统启动的时候需向内核注册,具体来说,是向系统的异常处理(Exception Handler)部分注册。这样,当发生中断时,系统首先跳转到异常处理,然后由其调用相关 的ISR。随后由中断处理(Interrupt Handler)调用驱动程序加载时注册的IST。

由此可见,作为平台开发者(OEM),需要实现ISR,并在系统启动时向内核注册;作为 外部设备的驱动开发者,需要实现 IST,在驱动程序被加载时向内核注册。图 6-10 表示中 断处理过程中各模块之间的交互关系。

图6-17 Windows CE中断处理过程

OAL routines 包含了与硬件平台相关的关中断、开中断、中断结束处理等调用。

二、Stream Interface Driver Native Device Driver

Windows CE 的设备驱动模型比Windows98 或Windows2000 的Windows Driver Model 简单,共有两种:流接口驱动(Stream Interface Driver)和本地设备驱动(Native Device Driver)。两者的差别在于它们向上提供的编程接口不同:Stream Interface Driver 提供一组通 用的接口;而Native Device Driver 则可以根据具体设备的需求提供相应的接口。所以我们 可以如下定义这两种驱动:

凡是实现流接口函数(Stream Interface Functions)的驱动程序就是 Stream Interface

Driver;其余是Native Device Driver。 通常,平台内建设备的驱动程序,如键盘,显示设备,触摸屏等是Native Device Driver;

其它外部设备或流设备则较多采用Stream Interface Driver。Stream Interface Driver 向上提供 的编程接口使应用程序可以用访问文件的接口访问设备。并非所有内建设备都需要成为 Native Device Driver,例如串行口就被实现为Stream Interface Driver,所以你可以像访问文 件一样读写串行口。这对于写过 Windows 下串行通信程序的人来说应该是很熟悉的。事实 上,这与Linux 和其它Unix 操作系统下的流设备驱动程序也很相像。

Windows CE 的许多模块都可以管理设备驱动程序。例如:与用户界面有关的GWES 模 块管理键盘、指针输入,显示,电源等设备驱动程序;设备管理器(Device Manager)根据注 册表内容管理那些被注册的设备驱动程序。通过表7-1 可见驱动程序与其管理模块的关系和 加载时间。

表6-27 Windows CE下的部分驱动程序

Native Device Driver

Stream Interface Driver

Loaded by GWE when

Windows CE boots

Keyboard

Mouse

Touch Screen Display Battery

Notification LED

none

Loaded by the Device Manager when Windows CE boots

PCMCIA Host Controller USB Host Controller driver NDIS.DLL

Audio driver Serial port driver Parallel port driver Port Monitor

Loaded as needed by the

Device Manager, USBD, etc.

PC Card Client drivers

USB Client drivers

NDIS Miniport drivers

三、驱动程序的分层实现方式和一体实现方式
从实现方式来区分,无论Stream Interface Driver 还是Native Interface Driver 都可以采用 下图的两种方式。

图6-18 Windows CE 驱动程序的分层实现方式和一体实现方式

左侧是分层实现方式,右侧是一体实现方式。它们都向上提供 DDI(Device Driver

Interface)调用,供其它模块或应用程序调用,但分层实现方式在设备驱动程序中被分为 MDD(Model Device Driver)层和 PDD(Platform Dependent Device)层。MDD 通常是一些 Microsoft 提供的参考。这些参考涉及大多数Windows CE 平台包含的设备,如键盘,触摸屏, PCMCIA,USB Host,USB Client 等。设备制造者通常不必费心设计这些设备驱动程序的具 体需求,而只要在 PDD 层实现与具体硬件交互实现 MDD 所要调用的 DDSI(Device Driver Service Provider Interface)函数。当然也可以设计自定义的MDD 和DDSI,并实现MDD。那 样,通过实现不同 PDD 层,可以使不同产品具有相同的驱动界面。DDI 是一类设备提供的 公共的编程界面,如,流接口设备的DDI 都是一样的。相对而言,DDSI 的情况就要复杂一 些,因为MDD 和硬件的特性都会影响DDSI 的设计。

分层实现方式把复杂的问题简化后分而治之,但这不是必需的。尤其对于那些有较高性 能要求的设备驱动,或那些特别适合直接实现 DDI 的设备,一体实现方式更有利一些。不 过如果可能,借鉴 Microsoft 提供的 MDD 移植驱动程序参考会提高开发效率和驱动程序的 可靠性。例如,MDD 会帮你进行中断注册。而且,据Microsoft 所说,他们提供的MDD 都 得到了充分的测试。
四、驱动程序的安装
如果没有把驱动程序集成到系统中,就需要安装驱动程序。相对而言,Windows CE 驱 动程序的安装比较简单。只完成需要下面三个步骤:
·连接Windows CE 设备。
·将设备驱动程序的dll 文件复制到Windows 目录下。
·如有必要,在注册表内创建相应的键,并填入键值。

§6.7 在 Sitsang 平台上开发程序

Sitsang/PX250 开发评估平台(简称 Sitsang 板或 Sitsang 平台)以 PXA250 处理器为核 心,配备了大量实用的外设资源,能够充分发挥出 PXA250 这种 Xscale 微架构处理器的优 点。

6.7.1 在裸机环境下的开发与测试程序

裸机应用程序是直接面向Sitsang 硬件资源的应用程序,它们需要自己驱动包括CPU, 存储器在内的所有硬件设备。裸机应用程序的复杂程度不会很高,通常是操作系统的引导程 序,底层开发调试工具,硬件测试程序等。复杂的应用程序,通常都是在操作系统之上开发 的。

Sitsang 的软件资源中提供的裸机应用程序是 TestCase 和 TestWizard。它们是用来测试 Sitsang 的硬件的工具。在硬件开发调试阶段对硬件进行测试,需要测试程序尽量简单,避 免其他设备或程序的影响,所以测试程序都只是用了最少的系统资源。同时,由于在硬件测 试阶段,操作系统等软件开发还没有完善,所以硬件测试程序往往也只能面向裸机。

TestCase 和TestWizard 都是硬件测试程序。TestCase 是一组程序,每一个程序单独测试 一项硬件功能,一般通过串行口返回测试结果数据。例如,BlinkGpioLed 是让GPIO 控制的 两个LED 闪烁的程序,以此证明CPU 和存储器正常、程序可以运行。TestLcd 则是在LCD 上显示一些内容,表明 LCD 工作正常。TestWizard 是所有 TesaCase 的集合,它能够实现 TestCase 里的所有测试功能,并且TestWizard 能够通过串行口和主机端的TestMaster 通信, 接受 TestMaster 的命令测试具体某一个 TestCase,并将结果返回 TestMaster,由后者存储。 TestWizard 和TestMaster 一起可以实现自动硬件测试。

根据ARM 体系结构,CPU 会在重起时从0 地址开始执行程序,裸机应用程序的起始位 置就是0 地址。裸机应用程序需要首先初始化硬件平台,然后才能运行自己的应用逻辑。初 始化代码都是从汇编代码开始。就 TestCase 和 TestWizard 而言,需要跳转到 C 代码 main() 函数的初始化汇编程序是 main.s ;跳转到其他 C 代码的初始化汇编程序是 Main_withoutMain.s。其中一些具体的初始化代码在一些.mac 文件中。
初始化程序的主要工作流程如下:
重起
进入SVC 模式
初始化GPIO
初始化板级寄存器
记录重起原因
初始化中断控制器
初始化OS 时钟
开Icache 和BTB
初始化外部设备时钟
初始化实时时钟
初始化电源模块
初始化存储器控制器
调整CPU 频率
将代码从Flash 复制到RAM
初始化各种模式的栈指针
初始化结束,跳转C 函数

图6-19 初始化程序的主要工作流程
进入C 代码以后,程序便可以执行自己的应用逻辑了。例如Startup TestCase 的C 代码 主程序就是反复调用Util_TestCpldLed(),闪烁CPLD 控制的LED。

TestCase 和 TestWizard 的开发工具都是 ADS。在 Sitsang 的 Release CD 中有每一个 TestCase 和 TestWizard 的项目文件和源文件,使用 ADS1.1 或 ADS1.2 能从源文件编译出相 应的纯二进制程序。它们可以通过 Jflash 工具下载到 Flash 的首地址,也就是系统的 0 地址 运行。

下表是目前所有的TestCase 及其功能:
表6-28 现有的TestCase 及其功能

Test Case

Bin File Name

Description

First breath

BlinkGpioLed.bin

闪烁GPIO 控制的LED

Startup

Startup.bin

闪烁CPLD 控制的LEDs

TestFFUART

TestFFSerial.bin

测试全功能UART

TestBTUART

TestBTUart.bin

测试BTUART

TestBLRs

TestRegs.bin

测试板级寄存器

TestSDRAM

TestSdram.bin

对SDRAM 读写测试

TestLCD

TestLcd.bin

测试LCD

TestAC97

TestAudio.bin

测试AC97 控制器和CS4201

TestAC97All

TestAc97All.bin

集成测试AC97

TestTouchScreen

TestTouchSsp.bin

测试触摸屏,读取坐标值

TestCFCard

TestPcmcia.bin

访问CF 卡,并且读取CIS

TestUSBHost

TestUsba.bin

访问并读取USB1161 的chip ID

TestIrDA

TestIrda_Loop.bin

TestIrda_Rece.bin

TestIrda_Xmit.bin

测试红外的发送,接受和loopback 功能

TestEthernet

TestEther.bin

访问以太网卡芯片 LAN91C96,读取片

上寄存器内容,向扩展的EEPROM 读写

MAC 地址

TestACC

TestAcc.bin

测试加速度感应芯片

TestSoftReset

TestSoftReset.bin

写 BCR 的 SYS_RESET 位,重新启动整

个系统

TestSoftPWRoff

TestSoftPWRoff.bin

写 PCR 的 PWR_OFF 位,关闭启动整个

系统

TestVCCRead

TestVCCRead.bin

读取电池电压和VCC core 电压

TestSDCard

TestSDCard.bin

访问SD 或MMC 卡,读取想关信息

TestIdleMode

TestIdleMode

进入并推出IDLE 模式

下图是TestCase 和TestWizard 的所有源代码的目录结构:

图6-20 测试项源代码的目录结构

Startup 目录下是TestWizard 和所有TestCase 公用的启动代码,otherdemo 下是出了startup TestCase 以外所有 TestCase 和 TestWizard 的项目文件和源代码,每一个目录对应一个 TestCase。TestWizard 目录下是其项目文件和源代码,TestWizard 项目还会包含 TestCase 中 的一些源文件,用以进行测试工作。

所有项目输出的二进制程序都可以在 FinalBinFile 目录下找到,也可以使用 ADS 自行 编译。
关于TestCase 和TestWizard 的更多信息可以在Sitsang / PXA250 Evaluation Platform Test

Suite User's Guide 中找到。

6.7.2 开发嵌入式 Linux 系统应用程序

Sitsang 平台有一套完整的嵌入式 Linux 环境,包括引导程序 Redboot,Linux 内核和文 件系统的源代码和二进制映像,以及各部分的开发工具链。


通常,ARM Linux 主要有以下三个部分构成。 文件系统
(应用程序,模块,配置文件,
图形界面,库)

Linux 内核

引导程序
(如Redboot,Bootldr)
图6-21 ARM Linux 软件的组成部分
引导程序负责初始化硬件平台,加载内核,并启动Linux。这部分的功能相当于BIOS。 常用的引导程序有RedHat 的Redboot 和Compaq 的Bootldr 等。

Linux 内核是一体结构,除了微内核外还包括各种服务和驱动程序。 文件系统包含应用程序,模块,配置文件,图形界面,库等。文件系统的内容与一般

Linux 系统没有根本区别。值得注意的是,移动手持设备通常使用Flash 作为持久存储设备。

因而在文件系统格式方面,除了普通的 ext2 文件系统外,常用的还有 jffs2。作为一种日志 型文件系统,jffs2 的写操作直接写到持久存储设备设备上,而不像 ext2 文件系统那样使用 缓冲机制。这样即便用户随时关机也不会丢失数据。

ARM 体系嵌入式Linux 的开发工具主要包括ARM 体系的Gcc 编译器、Glibc 库和binutils 工具集;ARM 体系的 GNUPro 编译工具集;Linux 源代码;以及引导程序、应用程序等的 源代码。

Sitsang 有两个Flash 区块,Sitsang Linux 能够同时使用两个区块共64MB 空间,也能够 仅使用一个Flash 区块的32MB 空间。

双区块方案的Flash 分配参见下表:
表6-29 双区块方案的Flash 分配表

Flash 区块

起始地址

结束地址

内容

Bank 0

0x00000000

0x00040000

Redboot

Bank 0

0x00040000

0x00100000

保留空间

Bank 0

0x00100000

0x00200000

Linux 内核

Bank 0

0x00200000

0x02000000

文件系统

Bank 1

0x02000000

0x03F80000

保留空间

Bank 1

0x03F80000

0x03FC0000

Redboot Config

Bank 1

0x03FC0000

0x04000000

FIS Directory

单区块方案Flash 分配参见下表:
表6-30 单区块方案的Flash 分配表

Flash

Begin

End

Content

Bank

Begin

End

Content

Bank 0

0x00000000

0x00040000

Redboot

Bank 0

0x00040000

0x00100000

保留空间

Bank 0

0x00100000

0x00200000

Linux 内核

Bank 0

0x00200000

0x01F00000

文件系统

Bank 0

0x01F00000

0x01F80000

保留空间

Bank 0

0x01F80000

0x01FC0000

Redboot Config

Bank 0

0x01FC0000

0x02000000

FIS Directory

Bank 1

0x02000000

0x04000000

不可使用的空间

针对不同的配置方案需要不同的引导程序,Linux 内核和文件系统。这些部分的二进制
映像参见下表:
表6-31 部分二进制映像文件

Flash 配置

二进制映像文件名

注释

双区块

redboot.bin

引导程序

双区块

sitsang_fs.jffs2

根文件系统

双区块

zImage

Linux 内核

单区块

redboot_single.bin

引导程序

单区块

sitsang_fs_single.jffs2

根文件系统

单区块

zImage_single

Linux 内核

这些二进制文件可以在Sitsang 的Release CD 中找到,也可以使用工具链和相应的源文
件编译生成。

Sitsang Linux 的工具链和源代码参见下表:

表6-32 工具链和源代码

文件名

注释

具 链

xscale-arm-linux-toolchain.tgz

ARM Gcc 交叉编译工具链

具 链

gnupro-bin-glibc2.2.4.tgz

GNUPro 交叉编译工具链

具 链

mkfs.jffs2

制作 jffs2 文件系统工具

源 代 码

RedBoot_Intel.tgz

Sitsang 的 Redboot 源代码

源 代 码

linux-2.4.19.tar.bz2

www.kernel.org 发布的 Linux2.4.19 源代码

源 代 码

patch-2.4.19-sitsang1.gz

Sitsang 的 Linux2.4.19 补丁包,由以下三个单独

的补丁叠加而成

源 代 码

patch-2.4.19-sitsang1.gz

patch-2.4.19-rmk4.gz

Russell King 发布的

ARM Linux 补丁

源 代 码

patch-2.4.19-sitsang1.gz

diff-2.4.19-rmk4-pxa2.gz

Nicolas Pitre 发布的

XScale 补丁

源 代 码

patch-2.4.19-sitsang1.gz

diff-2.4.19-rmk4-pxa2-al

vin1

ICSL 发布的Sitsang

补丁

源 代 码

sitsang_fs.tgz

根文件系统的源代码

使用 gnupro-bin-glibc2.2.4.tgz 编译 RedBoot_Intel.tgz 包含的源代码可以得到 Redboot 引 导程序。调整RedBoot_Intel/src/packages/hal/arm/cotulla/sitsang/current/cdl/hal_arm_sitsang.cdl 文件中的一个选项可以生成两种Flash 配置方案的Redboot。

Sitsang Linux 是由 www.kernel.org 发布的 Linux2.4.19 以及三个补丁包组成的。其中第 一个是ARM Linux 补丁,将i386 体系的Linux 修改为ARM 体系的Linux;第二个是XScale 体系支持补丁,添加了对PXA250 的支持;第三个是针对Sitsang 平台的补丁,添加了对Sitsang 的支持,包括板级资源,初始化,驱动程序等。这个三个补丁被合成一个大的补丁,压缩在 patch-2.4.19-sitsang1.gz 文件中。通过Linux 配置选项Memory Technology Devices (MTD) Æ Mapping drivers for chip access ÆSitsang uses single flash bank 可以选择编译那一种Flash 配 置的内核。

Sitsang 的根文件系统源代码被压缩在 sitsang_fs.tgz 中,包含了应用程序,配置文件, 和基于 Qt/Embedded 的图形界面系统。mkfs.jffs2 可以将一个目录下的所有内容制作成一个 制定大小的jffs2 格式文件系统映像。使用它可以重建文件系统映像,对于两种Flash 配置方 案,文件系统的差别目前仅限于大小不同而已。


在宿主机上定制目标机的Linux 系统,编译制作二进制映像使之符合自己需要的步骤如 下:
安装工具链
从源码开始生成Redboot
从源码开始生成

Linux 内核

创建JFFS2
文件系统映像
下载 Redboot,zImage 和

JFFS2 文件系统

图6-22 生成linux 系统程序的基本步骤
更具体的过程可以参考Sitsang-PXA250 Evaluation Platform Linux User Guide。

6.7.3 开发嵌入式 Linux 设备驱动程序

Sitsang Linux 已经驱动了除SSD/MMC 卡以外Sitsnag 的所有外部设备,它们是: 表 6-33 已有Linux 驱动的设备

存储设备

多媒体设备

通信设备

时钟中断设备

接口设备,其它

z 内存管理单 元(MMU)

z 内存控制器

z Flash

z AC97 录音 和

LineIn

z 立体声音频

z LCD 控 制 器

640x480

z LCD 16 位显示 支持,背光控制

z 触 摸 屏 支 持

ADS7846

z USB Client

z USB Host

ISP1161

z Product 以太网

z 串口 (FFUART, BTUART)

z 红外口IRDA

z 实 时 时 钟

(RTC)

z OS Timers

z Interrupt controller

z CF 卡

z 加速度传感 器

z 游戏杆,软按 钮

所有这些设备的底层驱动都被编译进内核。此外Sitsang Linux 还包含了USB 键盘,USB
鼠标,CF 接口的有线和无线网卡等的驱动。
文件系统中设备文件的位置见下表:
表6-34 文件系统中设备文件的位置

设备文件名

设备类型

主设备号

次设备号

注释

/dev/acce

Char

10

241

Accelerometer Sensor

/dev/input/event0

Char

13

64

Joystick & Softbutton

/dev/input/event1

Char

13

65

ADS7846 TouchScreen

/dev/ttyUSB0

Char

188

0

USB Client Serial Driver

/dev/ttyUSB1

Char

188

1

USB Host Serial Device 1

/dev/ttyUSB2

Char

188

2

USB Host Serial Device 2

/dev/ttyS0

Char

4

64

FFUART

/dev/ttyS2

Char

4

66

BTUART

/dev/dsp0

Char

14

3

AC97 OSS Driver

/dev/mtdblock3

Block

31

3

File System Partition

/dev/lcdctrl

Char

254

(Dynamic)

0

LCD Backlight Control

如果需要使用USB 串行驱动,PPP 协议,CF 有线网卡,那么还需要下列模块,它们也
可以由Sitsang Linux 源代码生成。
表6-35 文件系统中设备文件的位置

模块名

注释

模块所在位置

usbdcore.o

USB 设备核心支持

$SITSANG_LINUX/drivers/usb/device/usbdcore.o

serial_fd.o

USB 串行支持

$SITSANG_LINUX/drivers/usb/device/serial_fd/serial_fd.o

pxa_bi.o

PXA250 USB 总线接口支

$SITSANG_LINUX/drivers/usb/device/bi/pxa_bi.o

bsd_comp.o

PPP BSD-Compression

$SITSANG_LINUX/drivers/net/bsd_comp.o

ppp_async.o

异步串行口 PPP 支持

$SITSANG_LINUX/drivers/net/ppp_async.o

ppp_deflate.o

PPP Deflate compression

$SITSANG_LINUX/drivers/net/ppp_deflate.o

usbserial.o

USB 串行转换支持

$SITSANG_LINUX/drivers/usb/serial/usbserial.o

8390.o

NE2000 基本支持

$SITSANG_LINUX/drivers/net/8390.o

pcnet_cs.o

CF 有线网卡服务驱动

$SITSANG_LINUX/drivers/pcmcia/pcnet_cs.o

注:$SITSANG_LINUX 是 sitsang 的相关源代码树的安装位置,如/home/sitsang/linux-2.4.19/
关于以上 Sitsang Linux 设备驱动的具体信息可以参考 Sitsang / PXA250 Evaluation

Platform Linux User Guide。

除了Sitsang Linux 已经提供的设备驱动,为了便于学习Linux 设备驱动程序开发,我们 专门设计了一个针对板级寄存器 BLR 的简单设备驱动。它包含了字符类型设备驱动的所有 要件,并且能够包含在 Sitsang Linux 内核代码树中,还有相应的内核配置选项。BLR 设备 驱动程序通过Sitsang_BLR.diff 以补丁的方式加入内核代码。
以下是该补丁的内容:

diff -urN linux/drivers/misc/Config.in linuxnew/drivers/misc/Config.in

--- linux/drivers/misc/Config.in 2003-05-19 18:27:09.000000000 +0800

+++ linuxnew/drivers/misc/Config.in 2003-05-19 14:04:49.000000000 +0800

@@ -17,4 +17,5 @@

dep_tristate ' SITSANG ADS7846 Touchscreen support' CONFIG_ADS7846_TS

$CONFIG_ARCH_SITSANG $CONFIG_ARCH_PXA

dep_tristate ' SITSANG Accelerometer Sensor Support' CONFIG_SITSANG_ACCELEROMETER

$CONFIG_ARCH_SITSANG $CONFIG_ARCH_PXA

dep_tristate ' SITSANG JoyStick and Softbutton Support' CONFIG_SITSANG_JOYSTICK

$CONFIG_ARCH_SITSANG $CONFIG_ARCH_PXA

+dep_tristate ' SITSANG Board Level Regiesters Support' CONFIG_SITSANG_BLR

$CONFIG_ARCH_SITSANG $CONFIG_ARCH_PXA

endmenu

diff -urN linux/drivers/misc/Makefile linuxnew/drivers/misc/Makefile

--- linux/drivers/misc/Makefile 2003-05-19 18:27:09.000000000 +0800

+++ linuxnew/drivers/misc/Makefile 2003-05-19 14:04:49.000000000 +0800

@@ -23,6 +23,7 @@

obj-$(CONFIG_SITSANG_ACCELEROMETER) += accelerometer.o obj-$(CONFIG_SITSANG_JOYSTICK) += joystick.o

obj-$(CONFIG_PXA_CERF_PDA) += cerf_ucb1400gpio.o

+obj-$(CONFIG_SITSANG_BLR) += sitsang_blr.o

include $(TOPDIR)/Rules.make

diff -urN linux/drivers/misc/sitsang_blr.c linuxnew/drivers/misc/sitsang_blr.c

--- linux/drivers/misc/sitsang_blr.c 1970-01-01 08:00:00.000000000 +0800

+++ linuxnew/drivers/misc/sitsang_blr.c 2003-05-19 18:12:23.000000000 +0800

@@ -0,0 +1,124 @@

+/*

+ * Board Level Registers driver for Linux

+ *

+ * Copyright (C) 2002 Maple Ku

+ *

+ * The device file for BLR is "/dev/blr". You can create this file

+ * handly by

+ * mknod /dev/blr c 10 242

+ *

+ */

+

+#define SITSANG_BLR_VERSION "1.1"

+

+#include <linux/module.h>

+#include <linux/config.h>

+#include <linux/sched.h>

+#include <linux/types.h>

+#include <linux/errno.h>

+#include <linux/miscdevice.h>

+#include <linux/fcntl.h>

+#include <linux/init.h>

+#include <asm/io.h>

+#include <asm/uaccess.h>

+#include <asm/system.h>

+#include <linux/delay.h>

+

+static struct blr{

+ volatile unsigned int pcr;

+ volatile unsigned int bcr;

+ volatile unsigned int bsr;

+ volatile unsigned int bipr;

+ volatile unsigned int bimr;

+ volatile unsigned int axhr;

+ volatile unsigned int axlr;

+ volatile unsigned int ayhr;

+ volatile unsigned int jssr;

+ volatile unsigned int lledr;

+ volatile unsigned int hledr;

+}blr_status;

+

+static ssize_t blr_read(struct file * file,

+ char * buf, size_t count, loff_t *ppos )

+{

+ if (sizeof(struct blr)<=count)

+ {

+ blr_status.pcr = SITSANG_PCR_RW;

+ blr_status.bcr = SITSANG_BCR_RW;

+ blr_status.bsr = SITSANG_BSR_RD;

+ blr_status.bipr = SITSANG_BIPR_RW;

+ blr_status.bimr = SITSANG_BIMR_RW;

+ blr_status.axhr = SITSANG_AXHR_RD;

+ blr_status.axlr = SITSANG_AXLR_RD;

+ blr_status.ayhr = SITSANG_AYHR_RD;

+ blr_status.jssr = SITSANG_JSSR_RD;

+ blr_status.lledr = SITSANG_LLEDR_RW;

+ blr_status.hledr = SITSANG_HLEDR_RW;

+

+ if (copy_to_user(buf, &blr_status, sizeof (struct blr)))

+ {

+ printk("copy to user failed\n");

+ return -EFAULT;

+ }

+ }

+

+ return sizeof(struct blr);

+

+}

+

+static int blr_open( struct inode *inode, struct file *file )

+{

+ return 0;

+}

+

+static int blr_release( struct inode *inode, struct file *file )

+{

+ return 0;

+}

+

+

+static struct file_operations blr_fops = {

+ owner: THIS_MODULE,

+ llseek: NULL,

+ read: blr_read,

+ write: NULL,

+ ioctl: NULL,

+ open: blr_open,

+ release: blr_release,

+};

+

+static struct miscdevice blr_dev = {

+ SITSANG_BLR_MINOR,

+ "Board Level Register",

+ &blr_fops

+};

+

+

+static int init blr_init(void)

+{

+ int ret;

+

+ ret = misc_register( &blr_dev );

+ if (ret) {

+ printk(KERN_ERR "blr: can't misc_register on minor=%d\n", SITSANG_BLR_MINOR);

+ goto out;

+ }

+ ret = 0;

+ printk(KERN_INFO "Sitsang Board Level Registers Driver v" SITSANG_BLR_VERSION "\n");

+out:

+ return( ret );

+}

+

+static void exit blr_cleanup_module (void)

+{

+ misc_deregister( &blr_dev );

+}

+

+module_init(blr_init);

+module_exit(blr_cleanup_module);

+

+MODULE_AUTHOR("Maple Ku");

+MODULE_DESCRIPTION("Board Level Register Driver for Sitsang Board");

+MODULE_LICENSE("GPL");

+

+EXPORT_NO_SYMBOLS;

diff -urN linux/include/linux/miscdevice.h linuxnew/include/linux/miscdevice.h

--- linux/include/linux/miscdevice.h 2003-05-19 18:27:16.000000000 +0800

+++ linuxnew/include/linux/miscdevice.h 2003-05-19 14:11:01.000000000 +0800

@@ -26,6 +26,7 @@

#define MPT_MINOR 220

#define MISC_DYNAMIC_MINOR 255

#define SITSANG_ACCE_MINOR 241

+#define SITSANG_BLR_MINOR 242

#define SGI_GRAPHICS_MINOR 146

#define SGI_OPENGL_MINOR 147

下面对这个补丁作个简要说明。
每个以关键字diff 开始的一段对应一个文件的改动。所以本补丁改动了四个文件:

linux/drivers/misc/Config.in linux/drivers/misc/Makefile linux/drivers/misc/sitsang_blr.c linux/include/linux/miscdevice.h

其中:最主要的文件是.../sitsang_blr.c,它是新建的 BLR 设备驱动的主程序,实现了设 备加载[blr_init()]、卸载[blr_cleanup_module()],以及设备文件的打开[blr_open()]、读 [blr_read()]、关闭[blr_release()]等操作。在这个版本的设备驱动中没有写操作。
有关linux 设备驱动程序的说明参见参考文献[10]。
此外,修改.../miscdevice.h,是为了添加一个 misc 字符设备的次设备号。修改.../Config.in 和.../Makefile,是为了将 BLR 驱动加入 Sitsang Linux 的内核源代码。改动见带加号的行, 例子中用黑体标出。
为了测试这个驱动,需要测试程序blrreader,它的源代码是:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/mman.h>

#include <stdio.h>

#include <time.h>

#include <sys/time.h>

struct blr{

volatile unsigned int pcr; volatile unsigned int bcr; volatile unsigned int bsr; volatile unsigned int bipr; volatile unsigned int bimr; volatile unsigned int axhr; volatile unsigned int axlr; volatile unsigned int ayhr; volatile unsigned int jssr; volatile unsigned int lledr; volatile unsigned int hledr;

};

int main(int argc, char **argv)

{

int fd;

struct blr blr_status;

fd=open("/dev/blr", O_RDONLY);

read(fd, &blr_status, sizeof(struct blr));

close(fd); //close device file

printf("PCR: \t%04x\n",blr_status.pcr&0xffff); printf("BCR: \t%04x\n",blr_status.bcr&0xffff); printf("BSR: \t%04x\n",blr_status.bsr&0xffff); printf("BIPR: \t%04x\n",blr_status.bipr&0xffff); printf("BIMR: \t%04x\n",blr_status.bimr&0xffff); printf("AXHR: \t%04x\n",blr_status.axhr&0xffff); printf("AXLR: \t%04x\n",blr_status.axlr&0xffff); printf("AYHR: \t%04x\n",blr_status.ayhr&0xffff); printf("JSSR: \t%04x\n",blr_status.jssr&0xffff); printf("LLEDR: \t%04x\n",blr_status.lledr&0xffff); printf("HLEDR: \t%04x\n",blr_status.hledr&0xffff);

}

6.7.4 嵌入式 Linux 应用程序

Sitsang Linux 的文件系统中包含了 shell 在内的系统基本应用程序,设备驱动的测试程 序和Qtopia 在内的Qt/Embedded 应用程序。

Sitsang Linux 的目标是建立一个与桌面系统尽量一致的Linux 系统,这将使得应用程序 的运行环境没有显著变化。所以开发Sitsang Linux 环境下的应用程序与开发其他Linux 平台 的应用程序没有太大的去别。事实上,除了与图形界面和外部设备有关的应用程序,Sitsang Linux 已经从桌面Linux 系统移植许多应用程序。

开发Sitsang Linux 应用程序可以使用ARM Gcc 交叉编译工具链。在宿主机上编译生成 的目标程序(可执行代码)通过ftp 等形式下载到目标机的目录中,进行调试。调试可以通 过JTAG 接口和相应的软件来进行。对于兼容性强的程序,可以先在宿主机上调试基本功能, 待通过后在下载到目标机上进一步调试,可以提高效率。
上一节中提到的 BLR 驱动测试程序 blrreader 是一个简单 Linux 应用程序例子。除了它 包含的头文件,它就是一个简单的C 程序。
下面是一些Qt/Embedded 应用程序。另外还有一些游戏程序。 表6-36 现有的一些linux 应用程序