当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]基于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‘
  }
  }
  } [!--empirenews.page--]
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;
  }[!--empirenews.page--]
  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系统之间的文件交换,并为应用程序提供更为方便的操作接口。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

台湾台北, July 14, 2022 (GLOBE NEWSWIRE) -- 特种存储和内存解决方案领域的全球领先企业ATP Electronics推出新的3D三层单元(TLC)S750/S650系列SD和microS...

关键字: DVR MICROSD SD卡 行车记录仪

摘 要:从硬件与软件方面介绍了基于PXI技术的1553B总线通讯模块的设计,并对PXI总线接口设计、驱动程序的开发、 SDRAM存储器的控制和1553B总线通信协议实现等关键技术进行了详细的阐述,为航空领域测控系统开发P...

关键字: PXI技术 驱动程序 SDRAM存储器 1553B总线

PnP全称Plug-and-Play,译文为即插即用。PnP的作用是自动配置低层计算机中的板卡和其他设备,然后告诉对应设备都做了什么。PnP的任务是把物理设备和软件设备驱动程序相配合,并操作设备,在每个设备和它的驱动程序...

关键字: PnP 驱动程序 操作设备

PX 系列工业级存储卡支持 SMART 命令,并具有高性能、高可靠性

关键字: 存储卡 ARM MICROSD SD卡

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录kill命令和信号使用kill...

关键字: 信号 应用程序 驱动程序

驱动程序本质上是软件代码,主要作用是计算机系统与硬件设备之间完成数据传送的功能,只有借助驱动程序,两者才能通信并完成特定的功能。

关键字: 驱动程序 硬件设备 UNIX

驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常...

关键字: 驱动程序 声卡 设备

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录API函数编写驱动程序编写应用...

关键字: 编写 驱动程序 字符设备驱动

作 者:道哥,10年嵌入式开发老兵,专注于:C/C、嵌入式、Linux。关注下方公众号,回复【书籍】,获取Linux、嵌入式领域经典书籍;回复【PDF】,获取所有原创文章(PDF格式)。目录示例程序目标编写驱动程序编写应...

关键字: GPIO 编写 驱动程序

打印机 在我们的办公区域实用性是非常强的,不仅可以提高办公的效率,而且还能节省用户时间,是一款非常不错的办公小助手。长时间使用, 打印机驱动程序无法使用 ,怎么回事呢?用户一定要做出详细了解,是否需要重新安装,下面我们一...

关键字: 驱动程序 打印机驱动

嵌入式教程

6897 篇文章

关注

发布文章

编辑精选

技术子站

关闭