基于ecos系统的spce3200中sd卡驱动程序的开发
设备驱动程序是介于硬件和嵌入式系统ecos内核之间的软件接口,是一种底层的、专用于某一硬件的软件组件。在ecos系统[1]中,设备驱动程序以包(package)的形式存在,当需要使用该设备时,通过ecos环境配置工具把该设备驱动程序包加载到内核中,编译后生成一个库文件,用户使用时,只需要打开该设备,直接调用接口api函数即可。设备驱动程序的作用如图1所示[2]。
在ecos系统中一般把设备分为4类:字符设备、块设备、网络接口、其他设备。
spce3200是凌阳公司推出的一款32位支持嵌入式系统处理器,其内部具有sd卡控制器,属于块设备类[3]。对spce3200内部的sd卡控制器必须编写驱动程序,以便完成sd卡的读写操作。下面将介绍具体实现过程,这里规定sd卡使用“/dev/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脚本包含了该包中所有配置选项的详细信息,并提供了如何对该包进行编译的信息[5]。这里,在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”的库文件,即sd卡驱动程序库文件。
至此,在嵌入式操作系统ccos中成功地创建了一个基于凌阳spce3200的sd卡驱动程序。有了该驱动程序,就能正常访问sd卡了。
除了通过i/o组件访问硬件设备之外,ecos还提供了fat文件系统用以管理块设备。fat文件系统的使用,可以大大方便嵌入式系统与pc系统之间的文件交换,并为应用程序提供更为方便的操作接口。
多层片状陶介电容器不良现象和原因分析
VR陀螺及SensorTower联合发布:2019上半年全球AR游戏应用下载量及收入TOP20
物联网加速科技革命和产业升级
《2022胡润中国元宇宙潜力企业榜》重磅发布,亮风台获“未来之星企业”称号
国内AMOLED屏产线百花齐放,要冲破三星闭环
基于eCos系统的SPCE3200中SD卡驱动程序的开发
关于分享有效低噪声与电磁干扰的技巧
晶体管的发展历史及其重要里程碑
CATL和比亚迪电池集成技术横向比较分析
应用于机器人行业和严苛环境
深度剖析国六后处理到底有着什么样的秘密
常用的嵌入式操作系统你都了解了吗
电容的识别方法以及应用电路的解析
iPhone X开启了OLED屏幕普及的热潮 京东方有望抱苹果大腿
台积电:先进制程需求强烈,2022第二季度毛利率能够达56%以上
荣耀MagicBook Pro魅海星蓝版开启预约
SKT部署赛灵思FPGA 让其人工智能工作性能大大提高
波音首架777X飞机已完成了组装及喷涂工作
薄膜太阳能电池有什么优缺点和生产资料说明
钠电加钾有奇效3000次循环后能提供565mAh/g容量