S3C2440

2024-09-29

S3C2440(共7篇)

S3C2440 篇1

嵌入式系统是计算机等多个行业相结合的产物,专用性强,可靠性强,应用十分广泛[1]。本文基于ARM9+Linux搭建系统环境,对视频的采集进行了研究,采用基于中芯微公司所研发的ZC0301P—DSP芯片的USB摄像头作为视频采集的工具,应用嵌入式开发板mini2440和V4L接口函数完成视频采集功能。

1 开发平台搭建

1.1 硬件平台构建

本系统选用的mini2440开发板是目前国内性价比较高的一款ARM板,该板采用的是Samsung S3C2440处理器,并采用了专业稳定的CPU内核电源芯片和复位芯片来确保系统的稳定性。系统结构图如图1所示:

1.2 交叉编译环境的建立

基于Linux操作系统搭建的开发环境一般由目标系统硬件和宿主机所构成[2]。由于大多数嵌入式目标系统硬件不能为编译过程提供足够的资源,只好将编译工作转移到PC机中进行即交叉编译。本文使用的交叉编译器为arm-linux-gcc3.4.1,安装过程如下:

1)解压缩:#tar jxvf/usr/src/arm-linux-gcc-3.4.1.tar.bz2

2)将文件移到/usr/local/arm目录下:#mv/root/usr/local/arm/3.4.1/usr/local/arm

3)配置路径:#export PATH=/usr/local/arm/3.4.1/bin/:$PATH

1.3 引导程序Bootloader移植

嵌入式Linux系统软件平台一般是由系统引导程序、内核和根文件系统构成[3]。引导加载程序是在内核运行之前运行的一段程序,用来完成硬件设备的初始化和内存空间映射图的建立,以便为最终调用操作系统内核做好准备。

本文采用光盘自带的vivi源代码包,将其复制到文件夹目录并执行解压缩操作,进入vivi源代码目录,依次执行:

#make menuconfig

#make

生成vivi文件,然后把vivi烧写到目标板中运行。

1.4 Linux内核移植

Linux内核主要由内存管理、进程调度、虚拟文件系统、网络接口、进程间通信五个子系统构成。一般情况下嵌入式系统的所有数据必须存储在Flash存储设备中[4]。获取目标板移植的内核,并根据ARM体系结构编译该内核,操作步骤如下:

1)解压内核压缩包;

2)通过如下命令编辑内核根目录下的Makefile文件,修改交叉编译器:

ARCH=arm

CROSS COMPILE=arm-Linux-

3)调出编译菜单并配置参数:#make menuconfig

4)生成依赖关系:#make dep

5)清除旧的内核目标文件:make clean

6)编译内核:make z Image

7)如果选择了模块,则必须编译模块:make modules

在内核文件的/arch/arm/boot目录下会生成z Image文件,之后将其烧写到ARM板上。

1.5 构建yaffs根文件系统

YAFFS是专门为Flash设计的嵌入式文件系统,运行速度快、占用内存少,并且具有较好的移植性。为了保证PC机上调试的程序在开发板上也能正常运行,断电后亦能保存,需要将程序和模块添加到根文件系统中,然后整体移植到开发板将其固化。一个嵌入式Linux文件系统必须包括基本目录、设备节点、内核模块、内核镜像、链接库、系统和用户应用程序等[5]。使用mkyaffsimage工具制作yaffs文件系统映像,具体操作如下:

1)将mkyaffsimage.tgz文件拷贝到某一个目录文件夹,然后执行命令:

#tar xvzf mkyaffsimage.tgz-C/usr/sbin

2)拷贝root_default.tgz文件到目录文件下并执行解压缩命令:

#tar xvzf root_default.tgz-C/usr/src/filesystem

3)将制作的应用程序或其他文件拷进文件系统

4)使用mkyaffsimage制作yaffs文件系统映象:

mkyaffsimage root_default yaffs_root.img

将yaffs_root.img烧写到对应分区中,重启ARM板即可。

2 USB设备驱动的实现

运行Linux,即启用了内存管理单元,系统不能直接对物理地址进行访问,若要对某一外部设备进行读写,需通过系统内核调用该设备的驱动来实现。该系统采用专用于嵌入式Linux的spca5xx驱动,将其作为驱动模块,添加到内核中后重新烧入开发板即可使用。

将USB摄像头连接到PC机上,出现如图2所示信息,即表明加载spca5xx成功。

3 视频采集的实现

在Linux系统中Video for Linux内核驱动为视频应用程序提供了一系列API接口函数,通过这些函数可以执行摄像头打开、读写、关闭等基本操作。视频采集的流程如图3所示:

打开视频设备文件/dev/video0,通过open()函数打开摄像头,调用ioctl(fd,VIDIOCGPICT,&capability)函数获取摄像头的相关参数,填充在video_capablity结构体中,利用ioctl(fd,VIDIOCGPICT,&picture)获得图像的亮度、灰度、颜色等相关信息,并填充在结构体video_picture中,可根据需求将需要设置的值赋给相应的结构体来重新定义参数。在图像获取中该系统选用的是mmap()内存映射方式来实现各进程共享内存。普通文件被映射到进程地址空间之后,进程不必再调用read(),write()等操作,而可以像访问普通内存一样对文件进行访问,因而提高了读取效率。使用该方式获取图像,需要先设置图像帧的缓冲区结构struct video_mmap,然后调用ioctl(fd,VIDIOCMCAPTURE,&grab_buf)开启采集命令。利用ioctl(fd,VIDIOCSYNC,&frame)等待采集完成,将捕获到的图像将放在映射的内存区域内,读取该内存数据即可获得图像数据,完成采集后调用close(fd)函数关闭设备文件停止采集。

4 系统的测试与结果

执行“#./caiji”指令,通过摄像头完成采集图像指令,获得图像1.jpg。由于1.jpg图片在开发板内,需要使用get指令将其取出在PC机上浏览。如图4、图5所示:

系统所采集的图像如下图:

5 结束语

基于嵌入式Linux系统的图像采集系统是为适应当前嵌入式技术发展和实际市场需求而进行研究的,它能够方便的实现图像的采集与显示。本文在ARM+Linux开发平台下完成了基于S3C2440的视频图像采集系统,经过大量实验验证了系统的准确性和稳定性,该系统可广泛应用于视频监控、自动控制、人工智能等各个领域,具有广阔应用前景。

参考文献

[1]邓漫龄.ARM嵌入式Linux系统的研究与实现[D].北京:北京邮电大学硕士论文,2009.

[2]戴丽,张维勇,刘征宇,钱军.嵌入式无线视频监控系统的设计与实现[J].合肥工业大学学报,2008,31(1):4-9.

[3]Rajesh K,Sridharan K,Srinivasan K.The design and development of a web-based data acquisition system[J].IEEE Instruction and Measurement,2002,51(3):425-433.

[4]刘伟华,刘仁学.基于S3C2440与Linux的A R M9嵌入式系统的构建[J].冶金自动化,2008(2):407-413.

[5]曹少坤,刘国繁,李云松.一种嵌入式网络摄像机的设计[J].微计算机应用,2008,29(10):65-74.

S3C2440 篇2

FTTH,即光纤到 户(Fiber To TheHome)。FTTH光纤熔接机是主要应用于到户光纤的永久性接续,并在光纤通信工程和光无源器件的生产测试中大量使用。通过更换夹具,本产品可接续包层直径为80μm ~ 150μm的单模、多模和色散位移等多种石英系光纤。FTTH光纤熔接机是光、机、电一体化高精尖产品。在此产品上,添加触摸屏应用,对于方便客户的使用具有极大的意义。

本产品是基于ARM9和uc/os-II系统的,因此,触摸屏驱动程序是基于uc/os-II系统设计的。Uc/os-II系统是一种可移植、可固化、可裁剪的实时多任务内核(RTOS)。Uc/os-II具有硬实时性、低功耗、易控制、高性能等优点,可以使其满足工业中小型控制中对系统可靠性、实时性以及多任务处理的要求。Uc/os-II属于抢占式实时操作系统,总是会使优先级最高的任务运行。它不支持时间片轮转调度,某一时间只能有一个任务在运行,所以必须将系统功能合理分解为不同优先级的任务。任务的优先级是由该任务的重要性和实时性来决定的。划分系统任务的时候,还需要考虑到低优先级的任务能有机会得到运行,否则系统将难以正常工作。此次设计,就是将触摸屏操作设计成一个任务,其优先级仅次于按键任务。

1 触摸屏驱动设计方法

FTTH光纤熔接机的触摸屏采用的是电阻屏。此电阻屏是由一个4层复合薄膜,附着在显示器表面与显示器配合使用。每一层导电层称为触摸屏的一个工作面,每一个工作面的两端各涂以条银胶,称为该工作面的一对电极,分别称为X电极对和Y电极对。当触摸屏正常工作时,上下导体层相当于一个电阻网络。当某一层电极加上电压时,会在该网络上形成电压梯度。当有外力使得上下两层在某一点接触时,则在电极未加电压的另一层可以测得接触点处的电压,从而得到接触点的坐标。

FTTH熔接机触摸屏选取的驱动芯片型号为TSC2007,TSC2007是典型的逐步逼近式A/D变换器,具有片内温度测量、触摸压力测量和预处理三个功能。TSC2007与触摸屏连接后,一旦有笔或手指触摸在屏上时,便可以迅速得到该点的位置,从而达到在触摸屏上寻址的目的。TSC2007带有IIC接口,能以标准模式、高速模式、超高速模式进行数据传输与通信。TSC2007通过IIC与S3C2440接连,如图1所示。

在点击触摸屏之后,一般都需要确定所点击的X、Y,这就需要对TSC2007进行读写操作,TSC2007的写操作如图2所示。当SCL为高电平时,SDA由高电平向低电平跳变,系统开始传输数据。数据的前五位为固定的10010,后两位为地址,可表示四个从设备,第八位为0,表示写操作。当TSC2007收到数据后,会确认一位0,然后ARM收到确认后,再发送一个字节的命令字,然后再等待TSC2007确认,从而完成写操作,最后再由ARM发送一个结束信号以结束操作。其中,TSC2007的命令字节含义如表1所示。C0-C3决定了A/D转换的接口不同。图2中PD1PD0为节能bit位,00时表示电源关闭,笔中断使能;01时表示A/D转换打开,笔中断禁止使能;10时表示A/D转换关闭,笔中断使能;11时表示转换打开,A/D笔中断禁止使能。M为模式位,该位为0表示TSC2007为12bit模式,为1时是8bit模式;X为无关位。

进行读操作时,首先由ARM发送一个开始信息,然后传送8bit地址信息,该信息与写操作时传送的前7个bit一样,只是第八位为1,表示读。此后,经过TSC2007确认后,ARM便可以接受8bit或12bit的数据,也就是TSC2007发送的x值和y值。TSC2007的读操作时序图如图3所示。

如前文所 述,UC/OS- Ⅱ的一大特点就是可以建立一个触摸屏任务OSTaskCreate(TaskTouchScan, (void *) &TaskData, (void *) & TaskStk[10], 14);,利用中断对触摸屏进行操作。触摸屏扫描程序为void TaskTouchScan(void *data) 。当触摸屏有动作时,触摸屏驱动芯片向CPU发送中断信号,中断处理程序接受触摸屏中断,再通知触摸屏扫描程序计算出触点的位置,并发送触摸屏处理的信号量,由触摸屏处理任务接受到信号量,并对用户的触摸动作进行相应处理。每当检测到TSC2007产生PENIRQ,通过IIC接口向TSC2007发送A/D转换和读A/D转换结果指令,把结果转换到当前触摸屏按下点的坐标值,再根据不同的坐标值进行相关操作。相应流程图如图4所示。

2 触摸屏校准策略

电阻式触摸屏的共性是电压成线性均匀分布。这一特性使得触摸屏的使用和校准非常方便。触摸屏本身的性能存在差异,安装时位置也会有一些偏差,再加上客户使用一段时间后,触摸屏的参数也很可能发生改变。所以,即便是在显示屏幕的同一位置触摸,也很难保证得到相同的触摸坐标。这样编程人员就难以用相同的程序来控制触摸屏。对此,我们引入触摸屏校准的概念,使编程人员能利用统一的程序来控制触摸屏,使其正常运行。

我们首先引入两个概念,物理坐标和逻辑坐标。物理坐标是指触摸屏上点的实际位置,通常以液晶上实际点亮的点的个数来度量。逻辑坐标是指这点被触摸时经过A/D转换后的坐标值。我们假定液晶最右下角为坐标轴原点A,在液晶屏上任取一点B (B为十字线交叉中心 ),B在X方向距离A点为10个亮点,在Y方向距离A点为20个亮点,则这点的物理坐标为 (10,20)。如果我们触摸这一点时得到的X向的A / D转换值为100,Y向的A / D转换值为200,则这点的逻辑坐标为(100,200)。

由于电阻式触摸屏的电压是成线性均匀分布的,那么A / D转换后的坐标也将成线性。假如我们将液晶最右下角点定为物理坐标原点A,其物理坐标记为 (XA=0,YA=0),其逻辑坐标记为( XLA,YLA)( 不一定为0)。那么触摸屏上任意一点B的逻辑坐标可表达为:

其中Kx、Ky分别为触摸屏X方向和Y方向的因子系数。Kx、Ky可能为正,也可能为负,这根据具体触摸屏安装的方向和特性。每个液晶触摸屏的K系数都有可能不同,因此我们必须在使用每个触摸屏之前进行校准,也就是说应单独计算每一个触摸屏的K系数。如果A点不是坐标原点,也是任意一点,式 (1) 和式 (2) 可以表达成::

由式 (3) 和式 (4) 我们可以推出计算K系数的公式:

每次校准 时,将Kx和Ky存在EEPROM中,等再次进行触摸操作时,就以Kx和Ky来计算坐标值。这里采用的是五点校准法,即在触摸屏上选取五个点,利用四个角的物理坐标及读出来的逻辑坐标值计算纵向和横向的校准因子,再利用中心点来校准出实际坐标值。

3 触摸屏去抖方案

一般来说,触摸屏均会产生一定的抖动,产生抖动的原因主是 : (1) 内部和外部设备的电磁干扰;(2) 触摸时的不规则抖动导致触摸屏被错误触发。针对原因 (1),可以从硬件上采取措施。首先,触摸屏特别容易受到电气噪声的影响。除了对触摸屏控制器的电路小心布局外,还可以在A/D转换器输入端增加一个低通滤波器来解决这一问题;其次,在设计电路板的时候对电源和地必须采取抗干扰措施。针对第二个问题,当有触摸动作时,触摸点会产生抖动或错误触发,这时可以在软件上采用延时采样法,即程序在接收到触摸中断之后,延时一段时间 ( 5 ~ 10 ms),看中断是否还在,然后再进行坐标采样,即可消除抖动。

4 小结

S3C2440 篇3

Bootloader的开发是嵌入式系统开发必不可少的环节[1], 一个好的Bootloader不仅可以给项目的后续开发工作带来很大便利, 而且在项目开发结束后对用户使用产品也提供了很多方便。但是, 由于嵌入式的硬件是无标准、非规范的[2], Bootloader的功能又是直接与微处理系统相关的[3], 所以给开发人员的工作带来了许多不便。在实际的项目开发中, 一般都需要对特定的硬件系统进行Bootloader的设计, 可是从头开发一套系统的Bootloader是非常复杂并且耗时的[4], 针对这一难点, 微软公司推出的面向嵌入式应用领域的操作系统Windows CE体现了非常大的优势, Windows CE具有强大的操作系统功能、稳定可靠的性能、高度的模块化、可定制性、与桌面Windows平台一致的开发特性[5]。它最大的优势是具有高度的模块化, 可以提供与硬件无关的软件框架, 把与硬件无关但是又代表普遍通用性的内容抽取出来, 形成标准函数库[6]。而与硬件相关的不具有通用意义的BootLoader代码则由开发人员具体负债开发, 这样就给开发人员带来了相当大便利, 并且开发出的Bootloader因是严格按照微软提供的模板开发, 所以又有很好兼容性且效率高[7]。

由于Bootloader的实现依赖于 CPU 的体系结构, 因此从固态存储设备上启动的BootLoader大多都是两个阶段的启动过程[8]。本文以飞凌嵌入式公司的产品TE2440为例, 详细分析Windows CE BootLoader开发的两个阶段过程。TE2440的微处理器采用三星公司的S3C2440A, 主频400 MHz, 内置64 MB SDRAM 和64 MB NANDFLASH, 10 M网口, 采用CS8900Q3。S3C2440支持2种启动模式:一种是从NandFlash启动;另一种是从NorFlash启动, TE2440支持从NandFlash启动。

1Bootloader的第一阶段分析

为了防止给后来的调试工作带来更多的麻烦, 要尽量使第一阶段做尽可能少的工作, 只要使CPU正常工作起来即可, 然后把大量复杂的初始化工作留给第二阶段来做[9]。第一阶段是在ADS (ARM Developer Suite) 环境下开发的。S3C2440 系统引导加载程序包括2440init.s、2440lib.s 函数库、2440lib.c 函数库、mmu.c、dma.c 函数库等几个主要的文件。因为与硬件密切相关, 所以通常采用汇编语言编写, 本文主要分析s3c2440系统在加电后的硬件设置处理过程, 即2440init.s文件中的程序执行过程。

第一阶段主要包括如下步骤:

(1) 进入启动程序的入口地址, 禁止看门狗、屏蔽所有中断。因为为中断提供服务通常是操作系统设备驱动程序的责任, 所以在 Bootloader 的执行全过程中可以不必响应任何中断。中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器来完成。

(2) 设置CPU的速度和时钟频率

根据工作频率设置时钟、PLL, 2440 内部3个时钟:FCLK、HCLK、PCLK, 分别供CPU、AHB 总线和APB 总线使用, 一般都选择周期比为1∶2∶8 的设置。

(3) 初始化基本硬件和存储器系统

(4) 设置堆栈并跳转至第二阶段的入口。将FLASH中的代码段、数据段拷贝到RAM中, 将初始化数据段, 跳入C 语言的main函数执行, 结束Bootloader 初步引导;Bi的主要功能是引导和加载操作系统, 不会用到很多种类型及数量的外设, 如果在BL中启用中断反而会使对问题的处理复杂化。

2Bootloader的第二阶段分析

第一阶段结束之后, 函数跳转到由C语言写的main ( ) 函数, 也就是Bootloader开发的第二阶段EBoot, 该阶段的开发环境是Platform Builder, 简称PB, 它是微软提供给开发人员进行基于Windows CE平台下嵌入式操作系统定制的集成开发环境。main ( ) 函数实现代码为:

该函数主要功能就是调用BootloaderMain ( ) 函数, 其实main函数不是必须的, 实际上程序也可以直接跳转到BootloaderMain ( ) 函数, 在第一阶段的汇编代码后加入main ( ) 函数可以更好地提高程序的性能。本文主要分析BootloaderMain ( ) 调用的一些关键的函数, 函数调用关系如图1所示。

最早被BootLaderMain ( ) 调用的OEM函数是OEMDebugInit ( ) , 它负责初始化BootLoader的调试功能串口, 在它被调用运行之后BootLoader的代码才可以调用它的调试输出功能函数。OEMDebugInit ( ) 调用OEMInitDebugSerial ( ) 来初始化调试串口。

OEMPlatformInit ( ) 函数是BootLoader的最重要的OEM函数, 所有与BootLoader所需硬件功能有关的目标平台板级外设如以太网接口、Flash存储器等都在这里进行初始化, 包括嵌入式CPU芯片内置的外设。它结束后就开始下载工作了。函数代码如下:

OEMPreDownload ( ) :所有在硬件初始化完成以后、开始下载操作系统镜像之前所需要处理的任务都可以放在该函数完成。它主要任务是以太网下载前的准备工作。DownloadImage ( ) 的任务是从远程开发机上下载操作系统镜像到RAM。它通过调用OEMReadData ( ) 从下载端口读取操作系统镜像的数据, 在本文的EBoot中, 该函数主要负责从以太网端口读取操作系统镜像数据;它还调用OEMShowProgress ( ) 函数用来向用户显示BootLoader下载操作系统镜像时的下载状态。OEMMapMemAddr ( ) 函数用于当下载得到的操作系统镜像自身所记录的目的地址是Flash存储设备时该OEM函数要负债将镜像的数据以重定位的方式暂存到RAM内存缓冲区中。

OEMLaunch ( ) 是最后一个被BootLaderMain ( ) 函数调用的。它的主要功能是实现目标嵌入式系统程序执行流跳转。无论BootLoader是通过以太网端口下载操作系统镜像还是从本地读取操作系统镜像到内存, 都要依靠该函数将程序的执行流从BootLoader转移到Windows CE的操作系统。DownloadImage ( ) 函数下载的操作系统镜像是暂存在RAM中的, 所以我们还需要在OEMLaunch ( ) 函数指令执行跳转之前保存下载所得的操作系统镜像以及用户配置数据到Flash, 以便系统从新启动或者复位时可以直接从本地存储读取镜像数据。

3配置文件

Bootloader源代码编译后会产生一个名为eboot.exe的可执行文件, 但写入Flash的Bootloader是一个二进制的映像文件, 也就是.bin文件或.nb0文件, 所以需要把eboot.exe文件转换成.bin文件或.nb0文件。

(1) 在%_WINCEROOT%Platform<Hardware Platform Name>SrcBootloaderEboot文件夹下创建一个名为eboot.bib的文件。

(2) 添加如下配置信息到eboot.bib文件中。

(3) 在%_WINCEROOT%<PlatformHardware Platform Name>SrcBootloaderEboot文件下创建一个名为makefile.inc的文件

(4) 添加代码到makefile.inc文件

(5) 在SOURCES文件的最后添加代码:

4烧写Bootloader

配置好了之后, 在PC机中编译产生了Eboot.bin 文件, 把Bootloader 烧写到目标机中。利用三星公司的sjf2440工具烧写, 使用JTAG 实现下载。BootLoader下载后再通过以太网口把操作系统内核镜像文件下载到目标机中。下载镜像所使用的软件是DNW, DNW是三星公司为S3C2440芯片配置的一款专用软件, 它可以在Windows下通过USB方式烧写Flash。如图2所示, 内核镜像已下载到NandFlash中。

5结语

BootLoader的设计和实现是一个非常复杂并且重要的过程, 一个好的Bootloader可以给嵌入式产品的开发调试工作带来许多便利。本文从源代码入手详细分析了Wince Bootloader启动的两个阶段以及配置文件信息。实验达到了预期的效果, 为项目后续的开发奠定了良好的基础。

摘要:针对BootLoader严格依赖于具体的嵌入式硬件系统, 并且从头开发一套适合特定硬件系统的BootLoader又相当复杂这一问题, 分析设计了基于S3C2440的WinCE操作系统的引导程序的实现方法。结合飞凌公司的嵌入式产品TE2440的硬件特性, 对BootLoader启动的两个阶段和配置文件进行了详细的分析和设计, 最终实现了系统引导加载程序的构建, 为项目后续的开发奠定了良好的基础。

关键词:嵌入式系统,引导程序,WinCE,EBoot

参考文献

[1]张冬泉, 谭南林.Windows开发实例精粹[M].北京:电子工业出版社, 2008.

[2]周毓林, 宁扬, 陆贵强, 等.Windows CE.net内核定制及应用开发[M].北京:电子工业出版社, 2005.

[3]万永波, 张根宝, 田泽, 等.基于ARM的嵌入式系统Boot-loader的启动流程分析[J].微计算机信息, 2005, 11 (2) :91-93.

[4]何臻祥, 陈波.基于三S3C2440 Bootloader的研究[J].兵工自动化, 2008, 27 (6) :92-94.

[5]陈渝, 李明, 杨晔.源码开发的嵌入式系统软件分析与实践[M].北京:北京航空航天大学出版社, 2004.

[6]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社, 2004.

[7]张飞, 白瑞林, 陆林.WinCE5.0 Bootloader的设计与实现[J].计算机工程, 2009 (7) :59-62.

[8]刘林真, 刘大茂.基于WinCE.NET的Bootloader的原理与启动分析[J].计算机与数字工程, 2008, 36 (10) :111-113.

[9]马学文, 朱名日, 程小辉.嵌入式系统中Bootloader的设计与实现[J].计算机工程, 2005, 31 (7) :96-98.

S3C2440 篇4

随着社会的发展,社会已经处于“网络计算机”的时代,各个领域不可避免要应用IT技术的成果。它所涉及的领域包括工业控制、消费电子、网络通信、科学研究、军事国防等方方面面。研究的系统以S3C2440为核心,通过USB摄像头的图像采集,采用无线网卡实现无线传输,把图像还原于显示器之上。

2 硬件设计

系统的硬件部分原理图如图1所示。

S3C2440A微处理器是核心,该处理器是一款由三星公司为手持设备设计的低功耗、高集成度的基于ARM920T内核的微处理器[1]。该处理器集成了很多重要的功能模块,运行的频率高达400MHz。选择S3C2440A的原因是S3C2440A微处理器集成了USB HOST控制器,可以直接从CPU引出,而不需要添加额外的控制芯片,所以它的USB host接口可以直接接USB无线网卡。RS232串口是用来打印调试信息的。

Flash具有掉电保持数据的特性,所以NAND Flash用于存放启动程序、操作系统、驱动程序和相关的应用程序。

SDRAM不具有掉电保持数据的特性,但由于其存取速度大大高于Flash存储器,且具有读/写的属性,所以SDRAM用来运行操作系统和存储程序运行过程中所需要的数据。

USB摄像头和USB无线网卡通过Hub连接到USB主控制器接口上,摄像头选择的是中芯微芯片的摄像头ZC0301P,用它来采集图像,并将图像压缩,保存为.jpg格式的文件;无线网卡选择TP-Link公司的TL-WN322G+,它是USB2.0 A类型接口,兼容IEEE802.11g、IEEE 802.11b标准,无线传输速率高达54Mbps,是普通11b产品的5倍。用它来传输图像数据。

3 软件设计

在系统中,宿主机是装有Redhat9.0 Linux系统的PC机,目标机是S3C2440A搭建的硬件平台。Linux移植主要需要以下几个步骤:首先是建立交叉编译环境,可以采用交叉编译链完成;其次是启动代码Bootloader的移植,这里采用的是vivi;接着针对S3C2440A的硬件平台修改下载的内核源码;然后制作根文件系统,系统采用的是cramf根文件系统。最后是驱动程序的添加,本系统需要添加的是USB无线网卡驱动程序和USB摄像头驱动程序。

3.1 无线网卡驱动的实现

在系统中要完成无线数据的传输,就要添加USB无线网卡的驱动程序。无线网卡属于网络设备。所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身,这样这个方法就可以存取自身的数据[2]。一个网络设备最基本的方法有初始化、发送和接收。

本系统采用TP-WN322G+,它采用的是ZD1211B芯片。驱动的移植过程如下:

1)把无线网卡的驱动zd1211.tar.gz复制到Linux中任一文件夹中。解压出来的文件夹是zd1211,把其拷贝到linux-2.6.13drivers/usb/net中。

2)修改内核源代码,加入zd1211驱动的配置信息。

a)修改Makefile

本驱动程序的Makefile修改的部分如下:

CC=arm-linux-gcc;编译器

LD=arm-linux-ld;链接器

MODPATH:=/opt/shiyan/linux-2.6.13/drivers/usb/net;驱动存放路径

ZD1211REV_B=1;2.6内核

KDIR:=/opt/shiyan/linux-2.6.13/;内核的路径

b)添加配置信息

将驱动打入内核,就需要在菜单配置界面里安排选项,以便用户进行配置。

修改drivers/usb/net/Kconfig,加入以下内容:

修改drivers/usb/net/Makefile,加入zd1211的编译项。添加以下的内容:

3)配置内核make menuconfig,配置界面上,选无线网卡编译选项:选support for zd1211 wireless usb device,将其编译成模块。

4)编译内核模块make modules,在drivers/usb/net/zd1211下生成zd1211.ko驱动文件。

5)使用ftp将其下载到开发板中。执行动态加载#insmod zd1211b.ko,将驱动动态加载到开发板上。执行#ifconfig wlan0 up,无线网卡被识别,能够正常使用。

3.2 应图像采集和传输的实现

本系统的应用程序是在Linux环境下C编程实现,采用多线程技术。整个应用程序主要分为图像采集线程和图像传输线程。流程图如图2所示。

1)图像采集

视频采集是整完成图像的采集。它通过嵌入式Linux操作系统调度V4L(video4linux)和影像设备驱动程序来完成视频捕获。本系统采用V2000摄像头,内置OV511芯片。驱动加载过程如下:在kernel目录中选择make menuconfig,然后选择Multimedia device下的Video for Linux,在usb support目录下选择support for usb和usb camera ov511 suppor,保存退出,用新内核启动板子后ov511.o就可以成功加载[3]。

图像采集的操作流程如下:a)打开设备进行设定,通过使用标准的文件打开函数操作;b)设置设备的属性,这里包括图像的亮度。对比度等;c)设定传输格式和传输方式;d)获取图像并存放在缓冲区;e)对采集的图像进行处理;f)关闭视频设备。

2)图像传输

系统要实现图像的传输,传输的数据量较大,系统对图像传输的实时性要求很高,如果采用保证可靠性的TCP,会因为TCP的建立、撤销连接、确认和超时重传等很多保证可靠性的措施而大大降低传输的效率,这会造成图像传输很大的延时。因此采用高效率的UDP,由于取消了重发校验等机制,能够达到较高的通信速率,虽然也许会出现少量的丢帧现象,但对数据量很大的视频图像的影响并不是很大。无线传输程序采用socket编程,依次创建套接字、绑定端口号,由客户端将采集来的图像数据经无线网卡发送,服务器端侦听,当有数据传输,PC机的无线网卡接收数据,在显示器上显示出传输的图像[4]。

4 实验结果

整个系统分为设计的嵌入式系统和上位机两部分。硬件开发板通过USB Hub连接外界USB无线网卡和USB摄像头,USB摄像头采集图像,USB无线网卡发送图像。另一端PC机连接无线网卡,PC上安装Redhat9.0操作系统负责接收图像。系统采用动态加载无线网卡和摄像头的驱动程序。把无线网卡的IP地址设置在同一网段上。最后运行程序结果如图3所示。

5 结论

本文研究了基于S3C2440A处理器的嵌入式Linux系统无线传输的方法,实现了图像数据的无线传输,满足了人们特殊场所、环境和移动办公的需要,具有一定得实用价值和广阔的应用前景。

参考文献

[1]邹思铁.嵌入式Linux设计与应用[M].北京:清华大学出版社,2002.

[2]于洋,莫云龙.基于嵌入式系统的无线接入网硬件设计与实现[J].微计算机信息,2004,20(7):71-72.

[3]黄学雷.无线局域网在嵌入式系统中的应用[D].江苏大学,2006.

S3C2440 篇5

本文就是介绍基于linux系统的网卡底层驱动编写, 研究linux系统下DM9000EP网卡驱动的框架结构、存储器控制器的配置等技术。其中核心处理器采用三星公司开发的ARM9芯片———S3C2440AL。Linux系统采用2.6.22.6版本的内核。

1 网卡硬件结构原理与存储器控制器配置

存储器控制器集成于S3C2440AL中, S3C2440AL的存储器控制器提供访问外部存储器所需要的存储器控制信号[2], 微处理器S3C2440AL通过存储器控制器使外设与CPU之间交换数据, 它决定了数据发送的地址宽度, 数据宽度, 读写时序等。该控制器负责传输网络数据所必需的控制信号, 数据端口, 地址端口。存储器控制器与网卡连接方框图如图1所示。

该控制器包括总线宽度和等待控制寄存器 (BWSCON) 、BANK控制寄存器 (BANKCONn) 和刷新控制寄存器 (RE-FRESH) 。其中BANKCON有8个可编程寄存器, 用于配置网卡的读写时序, BWSCON用于设置网卡的数据宽度和等待状态。

1.1 硬件电路设计

本文中采用S3C2440AL与DM9000EP以太网控制器相连接, 实现网卡的数据传送功能。其中S3C2440A L是高性能嵌入式微处理器, 主频可达400 MHz, 具有外围接口丰富、体积小、功耗低等特点[3];DM9000EP芯片完全集成了以太网MAC控制器的基本功能, 它具有处理速度快, 成本低廉、设计简单等优点。

这里选用DM9000EP为以太网MAC控制器, 它提供了两种接口, 一种通用处理接口, 另一种是介质无关的接口。其中包含4个重要的控制信号IOR、IOW、INT和CS, 分别用于读、写、中断和片选的控制信号。S3C2440AL与DM9000EP硬件连接示意图如图2所示。

1.2 存储控制器配置

1.2.1 接口配置

针对以太网控制器, S3C2440AL的存储控制器能够产生相应的控制信号, 如:n OE (读) 、n WE (写) 、n GCS4 (片选) 、EINT7 (中断) 等。如果要对DM9000进行读写操作, 必须对DM9000正确寻址。根据实际设计电路, SA9和SA8接高电平, SA7-SA4为低电平, DM9000EP默认I/0基地址为300H, 而当CPU发出地址在0x2000_0000—0x2800_0000范围内时, DM9000片选打开[4]。并且S3C2440AL中7号中断与以太网卡的中断引脚相连接, 故EINT7为中断触发信号。

其接口配置关键代码如下:

1.2.2 网卡读写时序配置

由于存储器控制器本身可以支持很多外设, 而不同的外设芯片读写时序有所差异, 所以当硬件开发人员选定以太网控制器时, 就需要对存储器控制器的相关寄存器进行配置, 在S3C2440中, 通过对BWSCON和BANKCON4进行配置, 以实现处理器与控制器之间数据传输的匹配。本文中使用的是DM9000EP以太网控制器。

存储器控制器硬件参数配置关键代码如下所示:

/*设置S3C2440AL的内存控制器*/

bwscon=ioremap (0x48000000, 4) ;//总线宽度和等待控制寄存器

bankcon4=ioremap (0x48000014, 4) ;//Bank4控制寄存器地址映射

2 系统软件设计

在Linux系统中, 网络设备一般被抽象为一个统一接口。本文中主要对网卡驱动程序进行设计, 重点涉及到两个结构体, 网络设备接口net_device和套接字缓冲区sk_buff。net_device结构体负责表示网络设备在内核中的运行状态, sk_buff负责为Linux网络层提供缓冲区的相关处理以及流量控制等任务。

在网卡驱动设计中, 驱动程序需要对硬件进行配置, 具体配置过程这里不赘述, 这里主要叙述驱动如何实现数据包的发送与接收。

在net_device中, 比较重要的函数有open () 和hard_start_xmit () , 前者主要完成网卡中相关寄存器的初始化工作, 后者负责将来自协议层的数据发送出去, 本文中在dmfe_probe1 (struct net_device*dev) 函数中将net_device与驱动中的open函数、hard_start_xmit () 函数建立关联。

2.1 数据包发送函数

数据包发送过程就是将上层数据包发送到网卡发送缓冲区, 再设置发送控制器将发送缓冲区数据发送出去的过程。当用户发送数据帧时, DM9000EP被激活, net_device结构体中open () 函数被调用, 它负责向内核注册中断, 复位并初始化dm9000, 检查连接状态和媒介速度, 并调用netif_start_queue (struct net_device*dev) 使能传输[5]。然后通过调用net_device结构体中的hard_start_xmit () 函数把存放在sk_buff中的数据发送到网络物理设备中。hard_start_xmit () 函数处理流程是:首先对速度模式进行判断, 根据速度模式确定不同的数据包数量, 执行相应操作, 这里主要是为了避免网络拥塞。然后包计数, 关中断, 将skb数据长度发送到网卡相应的寄存器中, 传输数据到TX SRAM, 然后根据I/O传输模式, 程序将数据发送到I/O端口, 设置发送控制寄存器TCR, 数据被发送出去。最后释放sk_buff, 打开中断。

其关键代码如下:

2.2 数据包接收和中断处理函数

网卡数据包的接收可以采用轮询和中断两种处理模式, 文章中DM9000网络驱动程序采用中断方式, dmfe_interrupt () 中断处理流程是:判断读取中断状态寄存器, 通过检查硬件设备上的中断状态寄存器来判断是发送中断还是接受中断, 若为发送中断就调用dmfe_tx_done (0) ;若为接受中断就调用dmfe_packet_receive (dev) , 该函数通过dev_alloc_skb () 申请一块sk_buff的缓冲区;并构造skb, 然后通过netif_r (skb) 函数将skb提交到上层。值得注意的是中断函数必须事先在open () 函数中注册。其关键代码使用request_irq () 函数将中断号与中断函数建立关联, 并设置触发方式。具体代码这里不赘述。

3 实验验证

这里采用挂载NFS文件系统是否成功, 来判断网卡驱动程序是否编写正确, 建立NFS文件系统的步骤如下:

1) 实验环境为虚拟机, 主机, arm开发板三者通过路由器互联, 虚拟机上安装ubuntu 9.10编译环境。

2) 通过Cute FTP软件将驱动程序拖到Linux系统内核drivers/net目录中, 修改此目录下的makefile文件, 编译内核生成镜像文件, 烧写内核。

3) 设置IP地址。通过命令行方式, 在虚拟机上设置某个目录允许被NFS挂载。具体命令行如下:

通过以上三步网络文件系统挂载成功, 说明网卡驱动运行正常。

4 结束语

文中介绍了关于DM9000以太网控制器的配置过程, 深刻详述了存储器控制器与网卡芯片之间的关系, 网卡驱动程序与系统内核之间的关系, 并在实验中得到验证, 对以后的教学工作与科研工作有很大的借鉴意义。与此同时, 有关网卡驱动的分析还有很多不足之处, 以后会更加努力。

摘要:以Samsung公司的32位嵌入式微处理器S3C2440AL和以太网MAC控制器DM9000EP为例, 结合DM9000EP与S3C2440AL处理器的接口电路设计, 首先, 详细说明了基于S3C2440AL处理器的存储器控制器的功能和软件配置方法, 其次, 对Linux环境下网卡驱动进行分析, 最后给出驱动程序的验证方法, 测试效果良好。

关键词:S3C2440AL,DM9000EP,Linux,网卡驱动

参考文献

[1]徐功伟, 戴学丰, 刘树东, 等.嵌入式以太网控制器设计[J].通信技术, 2009, 42 (5) :183-184, 187.

[2]S3C2440A 32-Bit CMOS Microcontroller User&apos;s Manual, Revision 1, 2004.

[3]蔡理金, 王逢东, 王丽洁, 等.S3C2440A嵌入式手持终端电源管理系统设计[J].单片机与嵌入式系统应用, 2009 (9) :28-31.

[4]李剑雄, 张策, 杨军.基于ARM和DM9000的网卡接口设计与实现[J].微计算机信息, 2008, 52 (14) :123-124, 138.

S3C2440 篇6

关键词:矿井,水位监测仪,智能,实时检测,远程监测,S3C2440,PTP601

0 引言

矿井水害问题一直是制约我国煤矿安全生产的因素之一, 严重威胁着煤矿的安全生产。煤矿一旦遭遇水害, 就会直接恶化矿井生产条件, 增加采矿难度, 影响煤炭资源的开发, 轻则使采矿成本增加, 重则造成人死井毁的重大事故。目前, 煤矿众多观测点的水文动态情况一般由人工定期逐点观测, 存在以下几个问题:一是观测人员少, 工作量大;二是观测的密度满足不了水害预测预报对观测的实时性要求, 特别是水害事故发生前, 不能及时发现异常情况;三是难以同步获得各观测点数据;四是人工观测经常出现人为的观测误差。因此, 研究一种高可靠性的矿井水位监测系统是非常有必要的。

随着科学技术的发展, 我国的监测仪器已具有一定的研究、开发和生产能力, 特别是各种仪器的数据处理系统及自动控制系统的最新研究成果, 使我国仪器研制和在用仪器的改造升级迈上了一个新的台阶。目前国产的水位检测传感器主要类型有筒式水位仪、压力传感器式水位仪、超声波式水位仪等, 在功能齐全、性能稳定性方面, 与国际上较为先进的同类产品不相上下, 完全能够满足地下水监测的需要, 且价格比国外进口仪器便宜得多[1,2,3]。本文将介绍一种智能化、高可靠性的矿井水位监测仪, 它是针对目前国内煤矿中存在的测量点多、观测人员少、工作量大、实时性要求高、人为误差大等问题提出的一种智能化、实时性高的控制仪表, 可应用于矿井水位监控系统中, 对矿井不同位置的观测点进行水位数据的高速采集, 并针对矿井传输距离比较远的现状采用RS485总线传输数据, 并能对危险的情况发出预警、警报信号, 以便工作人员及时采取防治措施, 保障了煤矿安全生产与防水治水工作的顺利进行。

1 矿井水位监控系统的总体设计

整个矿井水位监控系统采用上、下位机结构形式, 分为下位机现场水位数据监测系统和上位机监控系统2个部分。下位机现场水位数据监测系统即本文介绍的智能水位监测仪, 它采用三星S3C2440作为核心控制器, 以投入式液位传感器PTP601作为水位传感器, 以液晶显示器LCD1602D作为现场数据显示器。上位机监控系统采用嵌入式工控机作为监控主机。上位机与下位机通过RS485总线通信, 以保证系统数据远距离传输的可靠性。整个矿井水位监控系统的结构如图1所示。

2 智能水位监测仪的硬件设计

在该智能水位监测仪的设计中, 核心处理器是系统的核心, 而水位监测传感器是实现水位监测的根本, 本文针对本系统的核心处理器和水位监测传感器进行详细说明。

2.1 硬件结构

矿井智能水位监测仪的硬件结构如图2所示。S3C2440为监测仪的核心处理器, PTP601为水位监测传感器。存储器包括3个部分, 即8 MB的SDRAM、16 MB的NandFlash和1 MB的NorFlash。NorFlash中可以固化应用程序, 也可以存储一些特殊数据, 但更多的是作为引导ROM使用。16 MB的NandFlash是作为海量存储器使用的, 在其中可以嵌入常用的操作系统, 如μC/OS-II、μClinux等, 以更好地完成多任务。PTP601采集的信号经过简单的信号调理后进入A/D转换器。信号调理主要包括信号滤波与电平转换。JTAG接口用于程序的下载与调试, USB接口用于移动存储设备的读写。与上位机的通信部分包括RS232和RS485接口, 可在实际应用中灵活选择。

2.2 核心处理器

矿井智能水位监测仪的核心处理器采用三星公 司生产的S3C2440芯片[4]。S3C2440采用ARM920T内核、0.13 μm的CMOS标准宏单元和存储器单元、1.2 V内核供电、3.3 V外部I/O供电, 保证了低功耗, 具有高速的运算能力。该芯片具有十分丰富的资源, 包括16 KB的I-Cache和16 KB的Dcache、8通道10位A/D、4通道DMA、1通道IIC、4通道PWM、2通道SPI、3通道UART、130个通用I/O口以及LCD控制器等。对于本监测仪来说, 这些资源已经足够用, 且S3C2440具有十分强大的控制功能, 性价比很高。

2.3 水位监测传感器

PTP601是引进美国最新传感器技术和全套先进电路及元器件生产的投入式液位传感器, 体积小, 性价比高, 具有较高的稳定性和灵敏度;因设计采用全封焊结构, 可以防雷击和射频干扰;其精细独特的零点、温漂、非线性补偿, 可以很好地保证使用条件范围内的精度, 具有长期的稳定性;具有标准的输出信号, 可以经过简单的信号调理后进入S3C2440进行A/D转换。PTP601主要用于河流、地下水位、水库、水塔及容器等的液位测量与控制。

3 智能水位监测仪的软件设计

整个矿井水位监控系统的软件设计包括现场数据采集系统程序设计和上位机监控程序设计2个部分。其中现场数据采集系统程序即为矿井智能水位监测仪的软件程序, 主要包括传感器信号采集程序、信号处理程序、信号现场显示程序、通信程序、系统故障诊断程序等。上位机监控程序包括各个现场数据采集系统的数据实时显示程序、水位超限报警程序、系统故障诊断程序等。

矿井智能水位监测仪的软件主程序流程如图3所示。整个程序分为A/D采样、实时时钟、键盘处理、数据处理、LCD显示、通信等部分。其中, 通信子程序分为串口通信与USB通信2个部分, 通过设置串口与USB中断, 完成与上位机以及USB设备的数据传输功能。A/D采样子程序包括后续的数据处理程序, 主要是完成实时数据的现场采集, 该部分可根据现场环境进行相应的修改, 如现场干扰较多的话, 应考虑加上数字滤波。数据处理子程序还具有工程变换功能, 即将要显示的工程量进行相应的变换, 以便下一步通过LCD显示。

4 结语

本文设计的基于S3C2440的矿井智能水位监测仪是一种智能化水平高、实时性高、可靠性高的水位监测仪表, 可以很好地监测矿井不同位置的水位数据, 并完成水位数据的相关处理。该水位监测仪可以独立完成相关的监测任务, 甚至可以实现矿井水位监控系统中上位机的部分功能, 从而减少上位机的工作量, 提高整个系统的效率。实际运行结果表明, 该水位监测仪达到了预期目标, 很好地解决了矿井水位监测中存在的问题。

参考文献

[1]邢延团, 刘增平, 吴新庆, 等.水文动态实时监测系统应用研究[J].采矿技术, 2006, 6 (3) .

[2]张忠远, 林春方.基于UPSD3454单片机智能水位监测仪的研究[J].宿州学院学报, 2007, 22 (5) :85-87.

[3]陈万平, 孔祥和, 李洪珍.水仓水位监测系统的设计[J].煤矿自动化, 1997 (1) :20-21.

[4]聂毅.单片机控制的水位与降雨量监测系统[J].微计算机信息, 2003, 4 (18) :37-39.

[5]张玉杰, 马立云.基于嵌入式的远程医疗监测系统研究[J].自动化技术与应用, 2009 (9) .

S3C2440 篇7

伴随后PC时代的到来,人们越来越多地接触到一个新的概念——嵌入式技术。嵌入式技术已被广泛地应用于科学研究、工程设计、军事技术以及文艺商业等方面,成为后PC时代IT领域发展的主力军。这也极大地刺激了嵌入式系统的发展和产业化的进程。而嵌入式操作系统作为嵌入式系统的核心,是连接嵌入式设备和应用的重要部件。他一方面要支持各种功能及规格的硬件设备,另一方面要为各种应用程序提供一致的功能调用接口,同时还需要在有限的系统资源上尽可能快地完成应用的计算需求。目前,主流的嵌入式操作系统有嵌入式Linux,Palm OS,VxWorks,Windows CE等。

2Windows CE简介

Windows CE是一个开放的、可裁剪的、32位实时嵌入式窗口操作系统。和其他桌面版窗口操作系统相比,他具有可靠性好、实时性高、内核体积小及可伸缩性、强大的通信能力等特点。所以其被广泛用于各种嵌入式智能设备的开发,是当今应用最多、增长最快的嵌入式操作系统。

Windows CE是从整体上为有限资源的平台设计的多线程、完整优先权、多任务的操作系统。他采用高度的模块化设计,这些模块之间可能是独立的,也可能有一些依赖关系。在Windows CE中最主要的系统模块有5个:

(1) 内核(NK):Windows CE的内核可以非常小,最小的内核只有500 kB。这是因为系统的大部分功能都可以在各自的功能模块中完成。他是整个Windows CE操作系统的核心,主要完成6类功能,即处理器调度、内存管理、异常处理、系统内的通信机制、为其他部分提供核心调用例程、为系统范围内的调试提供支持。

(2) 设备管理模块:提供系统范围内基本的设备列表管理、即插即用管理、电源管理、I/O资源管理等,并实现设备驱动程序得以工作的基本机制。设备配置信息存储在Windows CE的注册表中。

(3) 数据存储模块:提供基本的数据存储能力,包括对象存储和文件系统。目前,对象存储的大小限制为256 MB的RAM ,对象存储里的单个文件限制为最大32 MB。对象存储在Windows CE中的作用类似于PC机中的硬盘,他为应用程序及相关数据提供持久稳固的存储。在Windows CE中提供了三种文件系统,分别为基于ROM文件系统、基于RAM文件系统、以及用于支持外围存储设备的FAT文件系统。另外,嵌入式开发者也可以创建和注册属性文件系统。

(4) 图形用户界面模块(GWES):他提供以下几个主要功能:基本的绘图引擎、窗口管理、界面的事件机制等。在Windows CE中GWES是操作系统、应用程序以及用户之间的接口。他支持组成Windows CE图形用户界面的窗口、对话框、控件、菜单和资源,使用户能够控制应用程序。同时GWES还负责部分驱动程序的加载工作,主要包括显示、键盘、鼠标及触摸屏等的驱动。

(5) 通信模块:在整个Windows CE中,网络通信模块是最为独立的一部分,他运行时体现为一系列的动态链接库。其设计目标主要体现在4点:

高效能 提供最好的网络应用平台;

包容力 支持广泛的网络类型和选项;

易用性 通过系统提供的API,用户可以容易地开发出各种网络应用;

可拆卸 这是整个网络系统构架的特征,系统可以拆成很多独立的部分,应用系统可以根据需要选择其中一部分,这样可以降低系统开销,使系统更加精简。

除了这5个主要的系统模块外,Windows CE还有一些其他的模块,如OAL模块、驱动程序模块等。在实际的开发应用中,嵌入式开发者可以根据设备的性质只选择那些必要的模块或模块中的组件包含进操作系统镜像中。

3Windows CE驱动开发模型

通常设备驱动程序在操作系统中扮演着无名英雄的角色。正是由于驱动程序的存在,大多数操作系统上的应用程序都是与硬件无关的,应用程序的开发者和最终用户通常都不必关心底层的硬件是怎么工作的。Windows CE之所以能够支持各种各样的硬件设备,毫无疑问,也是因为都有其对应的设备驱动程序。设备驱动程序是操作系统与硬件交互的方式,是连接硬件与操作系统之间的桥梁。

当前,Windows CE有4种设备模型[2]。其中本机设备驱动程序和流接口驱动程序模型是专用于Windows CE驱动程序的开发方法。另外两种外部模型也可应用于其他操作系统,他们分别是通用串行总线(USB)和网络驱动器接口标准(NDIS)的驱动程序。

3.1 本机设备驱动程序

在开始本机设备驱动程序开发前,必须先了解哪些设备的驱动程序用本机设备驱动模型实现。正如他的名字,本机设备驱动程序适用于集成到基于Windows CE平台的设备。如键盘、显示器、PC卡插槽等设备的驱动。本机设备驱动程序通常使用Windows CE提供的特定接口,因此本机设备驱动程序都有明确和专一的目的。微软本身提供了很多本机设备驱动程序的样本程序,这样绝大多数的开发人员不需要编写本机设备驱动程序。除非是OEM开发商想为新平台定制Windows CE ,那么他们就可以编写自己的本机设备驱动程序,当然他们也可以将微软的本机设备驱动程序的例子直接移植到新平台上。本机设备驱动程序分为2种类型:单片驱动程序和分层的驱动程序[3],如图1所示。单片驱动程序的代码直接与硬件交互,因此他包含与特定的某款硬件相关联的代码。通常,单片驱动程序会暴露DDI接口给操作系统,DDI函数是操作系统与驱动程序交互的接口协议。而分层驱动程序由2个设置好的层组成:上层是模型设备驱动程序(MDD),下层是依赖平台的驱动程序(PDD)。MDD层与硬件平台无关,他通过驱动程序接口DDI与应用程序通信。在开发驱动程序时,一般不必修改MDD层。只需关心与具体硬件平台有关的下层,依赖平台的驱动程序层PDD。PDD层通过设备驱动服务接口DDSI直接管理硬件。通常,MDD层的代码与PDD层的代码会被编译成独立的静态LIB库,然后进行链接,形成可执行的驱动程序。因此,MDD和PDD的划分只是在源代码逻辑层面,在驱动程序的二进制可执行代码中不会存在MDD与PDD的分层。

3.2 流接口驱动程序

流接口驱动程序是为了连接到Windows CE的平台的外围设备设计的,如打印机、寻呼机、调制解调器等。他是动态链接库,由设备管理器动态加载、管理和卸载。与具有单独目的接口的本机设备驱动程序相比,流接口驱动都使用相同的接口导出一组相同的函数——流接口函数。流接口函数也称作流接口驱动的入口点,用来完成标准的文件I/O函数和电源管理函数,这些函数是提供给Windows CE的操作系统内核使用的。流接口驱动的入口点主要包括 XXX_Init,XXX_Deinit,XXX_Open,XXX_Close,XXX_Read,XXX_Write,XXX_Seek,XXX_PowerUp,XXX_PowerDown和XXX_IOControl,其中XXX是在驱动程序注册表里定义的设备文件名的前缀。在Windows CE中设备文件名是由3个大写字母、1个数字和1个冒号组成的。

流接口驱动对硬件设备的访问涉及5个步骤[4]:应用程序、FileSys.exe、设备管理器、流式接口驱动程序本身以及硬件。其中,应用程序和流式接口驱动程序是用户编写的;FileSys.exe与设备管理器是Windows CE操作系统提供的组件,用户无法修改。图2是流式接口驱动程序的体系结构。

从图2可以知道,首先,应用程序使用文件API对设备进行访问,文件API被操作系统转发到FileSys.exe进程中;然后FileSys.exe发现是对设备的操作,就会把执行交给设备管理器处理;接着设备管理器根据具体的请求,调用不同的流式接口驱动程序中暴露的接口;最终,驱动程序负责与硬件交互。

4Windows CE驱动开发实例

下面以UART0驱动程序为例,具体介绍驱动程序的开发。

S3C2440A是三星公司推出的16/32位精简指令集微处理器,他是为应用于小型掌上设备和高性价比,低功耗,高性能的嵌入式系统应用而提供的微控制解决方案。S3C2440使用ARM920T内核,芯片上提供的集成功能包括:分开的16 k指令/数据缓存、SDRAM控制器、LCD控制器、4通道DMA、3通道UART、I2C总线、I2S总线、SD主机接口、PWM定时器、看门狗、片上PLL时钟发生器、8通道10位AD控制器和触摸屏接口、摄像头接口以及带日历函数的实时时钟。S3C2440A最高频率可达533 MHz,且功耗只有mW级。

S3C2440 UART提供3个独立的异步串行I/O口,每1个口均可以工作在中断或DMA模式下。也就是说UART通过产生1个中断或DMA请求来在CPU和UART之前传输数据。

每个UART通道包括2个用于接收和传输的16 B的FIFOs。

首先需要在oalintr.h中添加UART的中断号,然后在cfw.c中初始化UART中断。接下来修改BSP中带有的UART的驱动程序,实现相应的功能即可。

(1) 注册中断

首先需要在oalintr.h中添加UART的中断号,然后在cfw.c中初始化UART中断。最后在armint.c的实现物理中断与逻辑中断的关联。

① 在platform\smdk2440\inc\Oalintr.h文件中添加:

#define SYSINTR_UART0(SYSINTR_FIRMWARE+3)

在platform\smdk2440\inc\Oalintr.inc添加:

SYSINTR_UART0:.equ SYSINTR_FIRMWARE+3

② 修改cfw.c文件

(2) 在smdk2440\drivers下创建UART0文件夹,将drivers\serial中的文件复制一份到这个文件夹中。

并把ser2440.def、ser2440_hw.c、ser2440_ser依次改为UART0.def、UART0_hw.c、UART0_ser,同时修改drivers\dirs文件,添加UART0即可。

(3) 完成.def文件、source文件和platform.reg的修改

① .def文件修改如下:

将LIBRARY ser2440分别改为LIBRARY UART0。

② source文件修改如下:

将TARGETNAME=ser2440改为TARGETNAME=UART0。

将SOURCES=

ser2440_ser.c

ser2440_hw.c

修改为:

SOURCES=

UART0_ser.c

UART0_hw.c

③ smdk2440\files\platform.reg修改

将注册表中原有的关于ser2440的部分替换为UART0即可。

(4) 修改bib文件

有了驱动程序和注册表文件,驱动程序还不能够正确地运行。因为他还没有被加入到内核中。添加一个文件到定制的内核中的方法有2种:一种是修改BIB文件,另一种是编写一个CEC文件添加到PB中。这里选择bib 文件。在smdk2440\files\platform.bib中IF BSP_NOSERIAL !和ENDIF BSP_NOSERIAL !之间添加:

完成以上修改后rebuild就可以实现UART0的驱动,然后下载内核到目标板利用串口调试程序测试。

5结语

在嵌入式技术飞速发展的今天,Windows CE必将有广泛的应用前景。编写高效的设备驱动程序也将带动外围设备的开发。

参考文献

[1]陈向群,王雷.Windows CE.NET系统分析及实验教程[M].北京:机械工业出版社,2003.

[2]Microsoft.Microsoft Windows CE Device Driver Kit[M].希望电脑公司,译.北京:希望电子出版社,2000.

[3]周毓林,宁杨,陆贵强,等.Windows CE.net内核定制及应用开发[M].北京:电子工业出版社,2005.

[4]何宗键.Windows CE嵌入式系统[M].北京:北京航空航天大学出版社,2006.

【S3C2440】推荐阅读:

上一篇:科技新词工作下一篇:预防卒中的有效方法

本站热搜

    相关推荐