當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]基于eCos系統(tǒng)的SPCE3200中SD卡驅(qū)動(dòng)程序的開(kāi)發(fā)

 設(shè)備驅(qū)動(dòng)程序是介于硬件和嵌入式系統(tǒng)eCos內(nèi)核之間的軟件接口,是一種底層的、專(zhuān)用于某一硬件的軟件組件。在eCos系統(tǒng)[1]中,設(shè)備驅(qū)動(dòng)程序以包(Package)的形式存在,當(dāng)需要使用該設(shè)備時(shí),通過(guò)eCos環(huán)境配置工具把該設(shè)備驅(qū)動(dòng)程序包加載到內(nèi)核中,編譯后生成一個(gè)庫(kù)文件,用戶使用時(shí),只需要打開(kāi)該設(shè)備,直接調(diào)用接口API函數(shù)即可。設(shè)備驅(qū)動(dòng)程序的作用如圖1所示[2]。

 在eCos系統(tǒng)中一般把設(shè)備分為4類(lèi):字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)接口、其他設(shè)備。
  SPCE3200是凌陽(yáng)公司推出的一款32位支持嵌入式系統(tǒng)處理器,其內(nèi)部具有SD卡控制器,屬于塊設(shè)備類(lèi)[3]。對(duì)SPCE3200內(nèi)部的SD卡控制器必須編寫(xiě)驅(qū)動(dòng)程序,以便完成SD卡的讀寫(xiě)操作。下面將介紹具體實(shí)現(xiàn)過(guò)程,這里規(guī)定SD卡使用“/dev/sd”作為其名稱(chēng)。
1 建立SD卡驅(qū)動(dòng)程序目錄結(jié)構(gòu)
  在編寫(xiě)驅(qū)動(dòng)程序前,首先需要為SD卡驅(qū)動(dòng)建立其目錄結(jié)構(gòu)。eCos系統(tǒng)要求所有驅(qū)動(dòng)程序均保存在/packages/devs目錄下的對(duì)應(yīng)子目錄內(nèi),按照?qǐng)D2所示在eCos/ packages/devs/sd/Spce3200 目錄下分別建立名為“cdl”、“include”、“current”3個(gè)目錄,分別用于存放SD卡驅(qū)動(dòng)所需的cdl文件、驅(qū)動(dòng)程序頭文件和源程序文件。

2  建立SD卡驅(qū)動(dòng)程序文件
  在cdl目錄內(nèi),首先創(chuàng)建一個(gè)叫做“sd_spce3200.cdl”的文件。然后,在src目錄內(nèi)建立一個(gè)名為“sd_spce3200.c”驅(qū)動(dòng)程序的源程序,并將名為“sd_card_driver_spce3200.c”的文件復(fù)制到src目錄內(nèi),該文件是凌陽(yáng)科技提供的針對(duì)SPCE3200內(nèi)部SD卡控制器的基本操作程序。

3 設(shè)計(jì)SD卡驅(qū)動(dòng)的CDL文件

  組件定義語(yǔ)言CDL(Component Definition Language)是eCos組件框架的一個(gè)關(guān)鍵部分。eCos中所有的包都必須具有至少一個(gè)CDL腳本對(duì)其進(jìn)行描述[4]。CDL腳本包含了該包中所有配置選項(xiàng)的詳細(xì)信息,并提供了如何對(duì)該包進(jìn)行編譯的信息[5]。這里,在CDL文件的模板框架中添加關(guān)于SD卡配置項(xiàng)的代碼如下:
  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  編寫(xiě)SD卡設(shè)備表入口
  配置好CDL文件后,便可編寫(xiě)設(shè)備I/O函數(shù)表宏以及設(shè)備表入口宏,分別如下:
  BLOCK_DEVIO_TABLE(sd_spce3200_handlers, // I/O 函數(shù)表的標(biāo)識(shí)
  sd_WriteSector,   //SD卡寫(xiě)操作函數(shù)
  sd_ReadSector,    //SD卡讀操作函數(shù)
  NULL,         //選擇函數(shù),SD 卡驅(qū)動(dòng)不需要支持
  sd_get_config,    //讀SD卡配置狀態(tài)函數(shù)
  sd_set_config    //SD卡配置函數(shù)
  );
  BLOCK_DEVTAB_ENTRY(sd_spce3200_device,   //SD卡驅(qū)動(dòng)入口標(biāo)識(shí)
  CYGDAT_DEVS_SD_SPCE3200_NAME,         //SD卡驅(qū)動(dòng)的名稱(chēng),在cdl文件里定義
  NULL,          //SD卡驅(qū)動(dòng)不依賴(lài)于其他設(shè)備
  &sd_spce3200_handlers, //SD 卡設(shè)備 I/O 函數(shù)表標(biāo)識(shí)
  &SD_Initial,       //SD 卡初始化函數(shù)
  0,             //SD卡查找函數(shù)
  0              //SD卡驅(qū)動(dòng)的私有指針
  ); 
5  實(shí)現(xiàn)SD卡設(shè)備接口函數(shù)
  接下來(lái)需要實(shí)現(xiàn)上面提到的幾個(gè)接口函數(shù),這些函數(shù)是上層訪問(wèn)硬件設(shè)備的唯一通道。在凌陽(yáng)科技提供的sd_card_driver_spce3200.c文件中包含了SD卡初始化、讀寫(xiě)操作等函數(shù)[6],它們分別為:SD卡初始化函數(shù)int __SDDrv_SDDrv_Initial__(void)、SD卡扇區(qū)寫(xiě)操作函數(shù)int _SDDrv_SDDrv_WriteSector_ (unsigned int block, unsigned int blocknum, unsigned  char *outaddr)、SD卡扇區(qū)讀操作函數(shù)int _SDDrv_SDDrv_ReadSector_ (unsigned int block, unsigned int blocknum, unsigned char *buf)。
  但這些函數(shù)都不是基于操作系統(tǒng)的,而是SD卡的基本操作函數(shù)。需要將它們封裝成eCos操作系統(tǒng)下的驅(qū)動(dòng)程序。這就需要用到凌陽(yáng)科技提供的SD卡設(shè)備驅(qū)動(dòng)接口函數(shù),包括SD卡設(shè)備批量寫(xiě)操作函數(shù)sd_WriteSector()、SD卡設(shè)備批量讀操作函數(shù)sd_ReadSector()、SD卡讀設(shè)備配置狀態(tài)函數(shù)sd_get_config()、SD卡設(shè)備設(shè)置函數(shù)sd_set_config()[7]。
  完整的SD設(shè)備驅(qū)動(dòng)源程序文件的代碼如下:
  //--------文件名:sd_spce3200.c------------//
  //----------包含相關(guān)頭文件-------------//
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  //-------------驅(qū)動(dòng)函數(shù)實(shí)現(xiàn)--------------//


  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;
  }
  //-------------設(shè)備 I/O 函數(shù)表-----------//
  (略,見(jiàn)前面)
  //----------設(shè)備表入口----------------//
 ?。?,見(jiàn)前面)
6 向eCos數(shù)據(jù)庫(kù)中添加SD卡驅(qū)動(dòng)程序組件包
  在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卡設(shè)備驅(qū)動(dòng)的路徑,該路徑是相對(duì)于/packages目錄的[8]。此時(shí)打開(kāi)eCos配置工具添加包時(shí),就可以看見(jiàn)SD卡驅(qū)動(dòng)程序組件包已經(jīng)出現(xiàn)在eCos數(shù)據(jù)庫(kù)中,如圖3所示。點(diǎn)擊“Add”加載到平臺(tái)上并編譯生成一個(gè)名為“CIGPRG_DEVS_SD_SPCE3200.ecc”的庫(kù)文件,即SD卡驅(qū)動(dòng)程序庫(kù)文件。

至此,在嵌入式操作系統(tǒng)cCos中成功地創(chuàng)建了一個(gè)基于凌陽(yáng)SPCE3200的SD卡驅(qū)動(dòng)程序。有了該驅(qū)動(dòng)程序,就能正常訪問(wèn)SD卡了。
  除了通過(guò)I/O組件訪問(wèn)硬件設(shè)備之外,eCos還提供了FAT文件系統(tǒng)用以管理塊設(shè)備。FAT文件系統(tǒng)的使用,可以大大方便嵌入式系統(tǒng)與PC系統(tǒng)之間的文件交換,并為應(yīng)用程序提供更為方便的操作接口。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉