设备驱动程序英文名为“Device Driver”,全称为“设备驱动程序”是一种可以使计算机和设备通信的特殊程序,可以 说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被誉为“ 硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。随着电子技术的飞速发展,电脑硬件的性能越来越强大。驱动程序是直接工作在各种硬件设备上的软件,其“驱动”这个名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。硬件如果缺少了驱动程序的“驱动”,那么本来性能非常强大的硬件就无法根据软件发出的指令进行工作,硬件就是空有一身本领都无从发挥,毫无用武 之地。这时候,电脑就正如古人所说的“万事俱备,只欠东风”,这“东风”的角色就落在了驱动程序身上。如此看来,驱动程序在电脑使用上还真起着举足轻重的 作用。 设备驱动程序的作用如图1所示。
在eCos系统中一般把设备分为4类:字符设备、块设备、网络接口、其他设备。eCOS由Redhat推出的小型即时操作系统(Real-Time operating system),编译可小至10K的级别,适合用于作bootloader增强,微小型系统。 此系统和嵌入式Linux系统的差异是他将操作系统做成静态连结(static library)的方式,让应用程式透过连结(linker)产生出具有操作系统的特性的应用程式。 eCOS的全称为embedded Configuration operating system,eCOS是开放原码、免权利金的即时作业系统,这套作业系统是针对嵌入式系统及应用而设计,因此是以单一个行程1)再搭配多个执行绪的方式来执行。
SPCE3200是凌阳公司推出的一款32位支持嵌入式系统处理器,其内部具有SD卡控制器,属于块设备类[3]。对SPCE3200内部的SD卡控制器必须编写驱动程序,以便完成SD卡的读写操作。
1 建立SD卡驱动程序目录结构
在编写驱动程序前,首先需要为SD卡驱动建立其目录结构。eCos系统要求所有驱动程序均保存在/packages/devs目录下的对应子目录内,按照图2所示在eCos/ packages/devs/sd/Spce3200 目录下分别建立名为“cdl”、“include”、“current”3个目录,分别用于存放SD卡驱动所需的cdl文件、驱动程序头文件和源程序文件。
2 建立SD卡驱动程序文件
在cdl目录内,首先创建一个叫做“sd_spce3200.cdl”的文件。然后,在src目录内建立一个名为“sd_spce3200.c”驱动程序的源程序,并将名为“sd_card_driver_spce3200.c”的文件复制到src目录内,该文件是凌阳科技提供的针对SPCE3200内部SD卡控制器的基本操作程序。
3 设计SD卡驱动的CDL文件
组件定义语言CDL(Component Definition Language)是eCos组件框架的一个关键部分。eCos中所有的包都必须具有至少一个CDL脚本对其进行描述[4]。CDL脚本包含了该包中所有配置选项的详细信息,并提供了如何对该包进行编译的信息。在CDL文件的模板框架中添加关于SD卡配置项的代码如下:
cdl_package CYGPKG_DEVS_SD_SPCE3200 {
display 'SD driver for SPCE3200'
include_dir cyg/io
compile sd_card_driver_spce3200.c
compile -library=libextras.a sd_spce3200.c
description 'SD driver for SCORE SPCE3200'
cdl_component CYGPKG_DEVS_SD_SPCE3200_OPTIONS {
display'CompileOptions'
flavor rnone
no_define
cdl_optionCYGDAT_DEVS_SD_SPCE3200_NAME{
display 'Device name for theSDDriver'
flavor data
default_value{''/dev/sd''}
description ' This option specifies the name of the sd-card device'
}
}
}
4 编写SD卡设备表入口
配置好CDL文件后,便可编写设备I/O函数表宏以及设备表入口宏,分别如下:
BLOCK_DEVIO_TABLE(sd_spce3200_handlers, // I/O 函数表的标识
sd_WriteSector, //SD卡写操作函数
sd_ReadSector, //SD卡读操作函数
NULL, //选择函数,SD 卡驱动不需要支持
sd_get_config, //读SD卡配置状态函数
sd_set_config //SD卡配置函数
);
BLOCK_DEVTAB_ENTRY(sd_spce3200_device, //SD卡驱动入口标识
CYGDAT_DEVS_SD_SPCE3200_NAME, //SD卡驱动的名称,在cdl文件里定义
NULL, //SD卡驱动不依赖于其他设备
&sd_spce3200_handlers, //SD 卡设备 I/O 函数表标识
&SD_Initial, //SD 卡初始化函数
0, //SD卡查找函数
0 //SD卡驱动的私有指针
);
5 实现SD卡设备接口函数
接下来需要实现上面提到的几个接口函数,这些函数是上层访问硬件设备的通道。在凌阳科技提供的sd_card_driver_spce3200.c文件中包含了SD卡初始化、读写操作等函数[6],它们分别为:SD卡初始化函数int __SDDrv_SDDrv_Initial__(void)、SD卡扇区写操作函数int _SDDrv_SDDrv_WriteSector_ (unsigned int block, unsigned int blocknum, unsigned char *outaddr)、SD卡扇区读操作函数int _SDDrv_SDDrv_ReadSector_ (unsigned int block, unsigned int blocknum, unsigned char *buf)。
但这些函数都不是基于操作系统的,而是SD卡的基本操作函数。需要将它们封装成eCos操作系统下的驱动程序。这就需要用到凌阳科技提供的SD卡设备驱动接口函数,包括SD卡设备批量写操作函数sd_WriteSector()、SD卡设备批量读操作函数sd_ReadSector()、SD卡读设备配置状态函数sd_get_config()、SD卡设备设置函数sd_set_config()[7]。
完整的SD设备驱动源程序文件的代码如下:
//--------文件名:sd_spce3200.c------------//
//----------包含相关头文件-------------//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//-------------驱动函数实现--------------//
static bool sd_init(struct cyg_devtab_entry* tab)
{
bool InitResult = true;
if(__SDDrv_SDDrv_Initial( )==0
InitResul=true;
else
InitResult=false;
returen(InitResult);
}
static int sd_WriteSector(void* disk, const void* buf_arg, cyg_uint32 *blocks, cyg_uint32 first_block)
{
cyg_intret=ENOERR;
ret=__SDDrv_SDDrv_WriteSector__(first_block,*blocks,(cyg_uint8 *)buf_arg); (1)
return ret;
}
static int sd_ReadSector(void* disk, void* buf_arg, cyg_uint32 *blocks, cyg_uint32 first_block)
{
cyg_int32 ret = ENOERR;
ret = __SDDrv_SDDrv_ReadSector__(first_block,*blocks,(cyg_uint8*)buf_arg); (1)
return ret;
}
static Cyg_ErrNo sd_get_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len)
{
return -EINVAL;
}
static Cyg_ErrNo sd_set_config(disk_channel* chan, cyg_uint32 key, const void* buf, cyg_uint32* len)
{
return -EINVAL;
}
//-------------设备 I/O 函数表-----------//
(略,见前面)
//----------设备表入口----------------//
(略,见前面)
6 向eCos数据库中添加SD卡驱动程序组件包
在ecos.db中的任意位置加如下程序段:
package CYGPKG_DEVS_SD_SPCE3200 {
alias{'SD support for Score SPCE3200'}
directory devs/sd/score/spce3200
script sd_spce3200.cdl
description '
This package contains hardware support for theSDCard
on the Score SPCE3200 EV Board.'
}
“devs/sd/score/spce3200”指示了SD卡设备驱动的路径,该路径是相对于/packages目录的[8]。此时打开eCos配置工具添加包时,就可以看见SD卡驱动程序组件包已经出现在eCos数据库中,如图3所示。点击“Add”加载到平台上并编译生成一个名为“CIGPRG_DEVS_SD_SPCE3200.ecc”的库文件。
至此,在嵌入式操作系统cCos中成功地创建了一个基于凌阳SPCE3200的SD卡驱动程序。有了该驱动程序,就能正常访问SD卡了。
除了通过I/O组件访问硬件设备之外,eCos还提供了FAT文件系统用以管理块设备。eCos具有可组态配置的特性,可针对性应用的需求而进行客制化,加上数百种的选项功效,使其能用少的硬体资源获得可能的执行效能。eCos是针对RAM记忆体资源只有「数十KB至数百KB」间的装置而设计,同时也是针对即时运作而设计,它可以用在记忆体不足以支援嵌入式Linux执行的应用场合,因为就一般而言嵌入式Linux至少要2MB左右的RAM记忆体空间才能执行,且还不包含应用程式及服务程式等的记忆体需求。FAT文件系统的使用,可以大大方便嵌入式系统与PC系统之间的文件交换,并为应用程序提供更为方便的操作接口。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。