今天花了時間簡單看了mmc/sd部門內容和代碼,我覺得形式上,這個部分和i2c非常相似系統也是分成core層,host層(對應i2c的adapter),設備層如果這樣講,那么core層主要功能應該是提供host注冊,總線注冊,設備注冊的幾個方法以及所謂sdio總線接口的算法了。host層已經是注冊一個platform設備,其中應該提供主要sdio接口算法的實現。設備層,應該是提供幾個公司1)注冊塊設備,映射到/dev下面的設備節點 2)應該還有設備其他信息。當然,也有很多和i2c不一樣的地方,就是必須支持動態掃描卡設備的方法,而i2c是靠i2c地址制定的。
有關MMC/SD/SDIO相關的知識這里就不多講了,請參考相關資料。這里主要涉及Linux下MMC相關內容。
內核版本(2.6.36)
首先說一下Linux相關MMC的代碼分布,主要有兩個目錄,一個頭文件目錄和一個源代碼目錄。
分別位置如下:
include/linux/mmc
drivers/mmc
要閱讀MMC相關代碼就必須要看這兩個目錄。在drivers/mmc目錄下分別有三個子目錄,其將對應接下來要講的MMC的體系結構。這三個子目錄分別為:
?card
?core
?host
它們的內容后面講到體系結構時自然就明了了。
?現在來說說MMC的體系結構,其分為三層
??????? /dev下設備文件訪問MMC/SD/SDIO
用戶空間???????????? |
---------------------|-----------------------------------------------------
內核空間??????????? \ /
???????? MMC Card層(對應具體的設備驅動,如MMC/SD卡塊設備驅動,SDIO UART)
???????????????????? |
??????????????????? \ /
????????? MMC core層(為上次設備驅動實現提供操作接口,和下層host注冊提供機制)
???????????????????? |
??????????????????? \ /
?????????? Host層(具體MMC/SD/SDIO控制器驅動層。如S3C2440 MMC/SD控制器驅動)
???????????????????? |
??????????????????? \ /
-----------------------------------------------------------------------------
??????????????????? 硬件層
對于我們來說,編寫MMC/SD卡相關驅動主要涉及的就是Host層,其余層不用考慮。對于SDIO設備除了Host層以外,還有可能要編寫MMC Card層的設備驅動。
編寫Host層驅動,主要是填充mmc_host結構體相關內容和實現mmc_host_ops結構體中的函數。最后調用mmc_add_host向MMC core注冊host驅動。可以參考S3C24XX的HOST驅動程序(drivers/mmc/host/s3cmci.c,s3cmci.h),上層MMC Core主要調用mmc_host_ops中的函數來實現與硬件交互。如下是mmc_host_ops結構體里面的函數:
? struct mmc_host_ops {
??? /*使能和禁止HOST控制器*/
??? int (*enable)(struct mmc_host *host);
??? int (*disable)(struct mmc_host *host, int lazy);
?? ?
??????? /*這個是關鍵的函數,所有對MMC/SD的操作,包括發命令和讀數據,都通過該接口來實現,所以實現該接口時要處理是命令還是數據操作,另外要考慮是否使用DMA來進行數據傳輸。*/
??? void??? (*request)(struct mmc_host *host, struct mmc_request *req);
??????? /*用來設置MMC/SD的時鐘,電壓等操作*/
??? void??? (*set_ios)(struct mmc_host *host, struct mmc_ios *ios);
??????? /*檢查MMC/SD是否寫保護了*/
??? int??? (*get_ro)(struct mmc_host *host);
??????? /*檢查mmc/sd的插入和拔出*/
??? int??? (*get_cd)(struct mmc_host *host);
??? void??? (*enable_sdio_irq)(struct mmc_host *host, int enable);
??? /* optional callback for HC quirks */
??? void??? (*init_card)(struct mmc_host *host, struct mmc_card *card);
};
接下來說說MMC Core層。
該層主要實現了幾個結構體函數指針,用來構建整個MMC設備驅動模型。它們是:
struct bus_type mmc_bus_type? /*mmc總線,用來管理sd/mmc卡設備和驅動*/
struct mmc_bus_ops mmc_ops??? /*MMC卡總線操作函數,主要是在電源管理方面*/
struct mmc_bus_ops mmc_sd_op? /*SD卡總線操作函數,主要是在電源管理方面*/
struct mmc_bus_ops mmc_sdio_ops? /*SDIO總線操作函數,主要是在電源管理方面*/
struct bus_type sdio_bus_type? /*SDIO另外定義了一條總線*/
core.c文件中實現了幾個關鍵的函數,用來提供給上層MMC Card調用和對SD/MMC卡的偵測函數以及初始化。
供給上層MMC Card調用主要有:
void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq);
int mmc_wait_for_cmd(struct mmc_host *host, struct mmc_command *cmd, int retries);
mmc card層就是通過這些函數來操作mmc/sd卡。而這些函數最終調用的是mmc_host_ops 結構體中的request函數來進行具體的操作。
對SD/MMC卡的偵測函數以及初始化,主要實現在
void mmc_rescan(struct work_struct *work);
函數中。
host層在調用mmc_add_host時會引發該函數的調用,偵測/初始化順序為:
? 先SDIO接口
? /*
???? * First we search for SDIO...
???? */
??? err = mmc_send_io_op_cond(host, 0, &ocr);
??? if (!err) {
??????? if (mmc_attach_sdio(host, ocr)) {
?? ...
在SD:
? /*
???? * ...then normal SD...
???? */
??? err = mmc_send_app_op_cond(host, 0, &ocr);
??? if (!err) {
??????? if (mmc_attach_sd(host, ocr))
最后是MMC:
?/*
???? * ...and finally MMC.
???? */
??? err = mmc_send_op_cond(host, 0, &ocr);
??? if (!err) {
??????? if (mmc_attach_mmc(host, ocr))
其中mmc_attach_xxx函數就是用來完成偵測和初始化的,選擇相應的總線操作函數,并產生struct mmc_card結構體,并填充其內容,最后注冊一個mmc_card(代表著一個設備),并在注冊中由mmc_bus_type結構體的match和probe函數來查找到適合該設備的驅動(這個又牽涉到設備驅動模型,可以查看設備驅動模型相關內容,了解設備和驅動匹配的過程),這里將匹配到mmc card層的MMC_Block(MMC塊設備驅動程序,由 struct mmc_driver代表)。在完成設備偵測和初始化以后,以后的操作就是mmc card層中相關的設備驅動程序發出的了。
再說說MMC card層,該層主要實現具體的設備驅動程序,如MMC塊設備驅動程序,通過mmc_register_driver注冊。如果是SDIO就有可能是其它字符設備驅動程序了,其通過調用sdio_register_driver來注冊設備驅動。
總體概括來說:
host層提供驅動相關MMC/SD/SDIO控制器的功能。
Core層提供了具體MMC/SD/SDIO設備偵測和初始化功能,以及電源管理方面的內容和通用的操作功能。
Card為實現具體的設備驅動層。
這樣的分層結構在Linux設備驅動中非常常見,如I2C,SPI等都提供了這樣的驅動模型。
最后簡單說說SDIO相關部分。在core層注冊了新的sdio_bus_type總線,并且定義了新的sdio_driver來代表sdio設備驅動,并定義了struct sdio_func來代表設備。所以在SDIO設備除了struct mmc_card來代表設備以外,還有struct sdio_func來代表具體功能設備。所以在mmc_attach_sdio函數中除了注冊mmc_card以外,還注冊了sdio_func。具體代碼如下:
int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
{
?? ....
? /*
???? * First add the card to the driver model...
???? */
??? err = mmc_add_card(host->card);
??? if (err)
??????? goto remove_added;
??? /*
???? * ...then the SDIO functions.
???? */
??? for (i = 0;i < funcs;i++) {
??????? err = sdio_add_func(host->card->sdio_func[i]);
??????? if (err)
??????????? goto remove_added;
??? }
??? ....
}
所以它除了調用mmc_bus_type結構體的match和probe函數來查找到適合該設備的驅動外,也調用sdio_bus_type結構體的match和probe函數來查找到適合該設備的驅動。?
?
關于linux mmc/sd驅動程序架構,你了解多少?
- 驅動(84267)
- Linux(206513)
- MMC(30332)
- 架構(25184)
相關推薦
了解和使用no-OS及平臺驅動程序
快速發展的技術需要軟件支持(固件驅動程序和代碼示例)來簡化設計導入過程。本文介紹如何利用no-OS(無操作系統)驅動程序和平臺驅動程序來構建ADI公司精密模數轉換器和數模轉換器的應用固件,這些器件
2022-04-11 15:55:484097
基于eCos系統的SPCE3200中SD卡驅動程序的開發
基于eCos系統的SPCE3200中SD卡驅動程序的開發
設備驅動程序是介于硬件和嵌入式系統eCos內核之間的軟件接口,是一種底層的、專用于某一硬件的軟件組件。在eCos系統[1]中,設
2009-11-05 16:03:261157
linux驅動程序的主要流程和功能
驅動程序是用于控制和管理硬件設備的軟件模塊,它主要負責與設備進行交互,通過操作設備的寄存器和接口,實現對硬件的控制和訪問。在Linux系統中,驅動程序是實現與硬件設備交互的一個關鍵部分。本文將詳細
2023-12-08 14:56:02668
LINUX音頻驅動架構相關資料分享
1、LINUX音頻驅動架構 LINUX下音頻驅動開發,要遵循標準的ALSA架構, 下面分別從硬件架構、軟件架構、驅動程序,3個方面分析。 硬件架構 硬件上音頻總線接口有很多,如I2S、PCM、TDM、SLIMBUS等,以I2S為例分析:原作者:DMCF
2022-11-04 15:57:35
Linux的32位驅動程序
你好,我已經下載了網格驅動程序2.1但它只帶有64位驅動程序的Linux。我如何獲得Linux的32位驅動程序。謝謝,賽義德以上來自于谷歌翻譯以下為原文Hello there,I've
2018-09-07 16:42:51
Linux設備驅動程序開發 - Linux設備驅動類型
驅動程序在Linux的內核源代碼中占有很大的比例,源代碼的長度日益增加,主要是驅動程序的增加。在Linux內核的不斷升級過程中,驅動程序的結構還是相對穩定。Linux設備驅動架構的不斷發展中始終堅持
2016-04-16 14:31:57
stm32 sd卡驅動程序。
程序是基于keil4開發的,是關于的SD卡的驅動程序。本人寫了部分其他處理器的sd卡的驅動程序。codefire, k10,xs128等。有需要的可以跟我聯系哈。qq:490690385.
2013-06-24 15:22:06
嵌入式Linux驅動程序開發大概了解
1.嵌入式Linux驅動程序開發嵌入式Linux驅動程序開發包羅萬象,基本上每個點都要大概了解一下。1.1軟件工具Makefile必須要掌握一些,至于Kconfig太簡單了只是個配置文件算不上程序
2021-11-02 10:17:37
嵌入式系統驅動程序的開發
嵌入式系統驅動程序的開發有別于WIndows或Linux。后者除了必須了解新設備的硬件特性,把控制硬件的程序盡快完成之外,還需要設法讓驅動程序符合Windows或Linux的規定(大且復雜的架構
2021-11-08 06:21:19
請問VC707板上有設備驅動程序嗎?
驅動程序使用監視器或其他I / O驅動程序。現在,我有一些問題。在VC707板上,有hdmi端口。我是否必須為顯示器制作設備驅動程序?如果沒有,我認為VC707板上有很多設備驅動程序。我在哪里可以查看所有這些?另外,如果您有關于板載Linux移植的任何信息,請與我分享。永遠謝謝YoungWook
2019-09-30 06:56:37
Linux中基于EP7312的LCD驅動程序設計
介紹在Linux操作系統中基于EP7312的LCD設備驅動程序設計。其中包括LCD設備顯示原理,EP7312上與LCD 相關的寄存器, Linux 操作系統中編寫設備驅動程序的方法以及驅動程序如何添加到Linu
2009-04-15 11:46:1425
基于內核態JVM的Linux設備驅動程序
驅動程序的不穩定是造成操作系統內核崩潰的主要原因,該文采用類型安全的Java語言開發Linux設備驅動程序以提高系統的穩定性,并分析驅動模型的結構、內核態Java虛擬機(JVM)的設
2009-04-16 08:40:5524
可重用Linux設備驅動程序框架
Linux設備驅動程序的開發工作涉及到相當多的系統內核細節,對開發人員的要求很高。由于缺乏必要的可重用性,一個新設備的驅動程序的開發速度也很緩慢。為了簡化其開發流程和
2009-04-22 09:59:0118
CAN總線在嵌入式Linux下驅動程序的實現
本文以S3C44B0X 為微處理器,通過其SPI 接口,采用MCP2510 CAN 控制器擴展CAN 總線,文章在分析Linux 設備驅動程序工作原理和結構的基礎上,重點論述CAN 設備在uClinux 下驅動程序的設計方
2009-08-25 09:09:3722
基于Linux操作系統的設備驅動程序開發
本文介紹了Linux 系統的特點,闡述了在Linux 操作系統下,對系統硬件的訪問和開發驅動程序的方法,說明了設備驅動程序的結構和編寫過程。
2009-09-02 17:11:5120
嵌入式Linux網絡驅動程序的開發及實現原理
分析Linux 網絡驅動程序體系結構的基礎上,結合利用Linux2.6.18 內核在FS2410 開發板上移植編寫CS8900A 網卡驅動程序的實例,重點討論了嵌入式Linux 網絡驅動程序的實現原理,并詳細分
2009-09-03 11:46:3224
基于S3C2410的SD MMC卡驅動的實現
設計了一個基于S3C2410 片內SDI 的SD/MMC 卡驅動,該驅動支持MMC 卡、SD卡、SDHC 卡。在分析SDI 特點和有關寄存器功能的基礎上,完成了SD 模式下的硬件接口設計。介紹了該驅動的軟件
2010-01-06 15:41:2453
基于嵌入式Linux的步進電機驅動程序設計
介紹了Linux驅動程序的實現機制,在分析步進電機和驅動程序接口的基礎上,給出了一個在嵌入式Linux平臺上編寫步進電機驅動的實例。本平臺基于Samsung公司的S3C2410X CPU,采用Linux
2010-02-21 14:20:1638
基于SEP4020的嵌入式Linux音頻驅動程序設計
論述了Linux操作系統中聲卡驅動程序的設計方法,主要介紹了基于OSS的聲卡驅動設計原理以及Linux操作系統中聲卡驅動程序的接口函數。針對具體硬件平臺編寫了相應的驅動程序,并介
2010-07-06 15:30:1637
基于BF533的Linux網絡驅動程序
在分析Linux網絡驅動程序體系結構的基礎上,結合Linux2.6.18內核在ADSP鄄BF533開發板上移植編寫CS8900A網卡驅動程序的實例,重點討論了嵌入式Linux網絡驅動程序的實現原理,并詳細分析
2010-12-25 16:22:4620
Linux字符設備驅動程序的編寫框架
一、Linux device driver 的概念
系統調用是操作系統內核和應用程序之間的接口,設備驅動程序是操作系統內核和機器硬件之間的接口。設備驅動程序為應
2010-12-25 10:54:29743
嵌入式Linux系統中MMC卡驅動管理技術研究
摘 要:簡明介紹MMC卡驅動程序的體系結構,設計并實現MMC卡的底層驅動;對傳統的塊設備驅動程序中的單塊讀寫進行改進,實現MMC卡的集群讀寫,同時實現了卡的電源管理和即插即用功能。
2011-03-18 10:22:3480
AFDX端系統的Linux驅動程序設計
為了滿足航空電子系統對確定性和實時性的要求,針對AFDX端系統硬件結構,功能需求和Linux驅動程序的特點,提出了一種滿足AFDX協議的Linux內核態驅動程序的實現方法。在Linux內核態驅
2011-04-12 16:11:5540
s3c2440 mmc和camera的linux驅動
本站提供的s3c2440 mmc和camera的linux驅動資料,詳細講訴了s3c2440 mmc和camera的linux驅動的步驟,希望對你的學習有所幫助。
2011-05-25 15:53:0654
Linux設備驅動程序的編寫
本站提供的Linux設備驅動程序的編寫資料,希望對你的學習有幫助。 世界各地都有人在鉆研Linux內核,大多是在寫設備驅動程序。盡管每個驅動程序都不一樣,而且你還要知道自己設備
2011-05-25 16:24:39108
基于Linux的步進電機驅動程序設計
介紹了Linux驅動程序的實現機制,在分析步進電機和驅動程序接口的基礎上,給出了一個在嵌入式Linux平臺上編寫步進電機驅動的實例。本平臺基于SAMSUNG公司的S3C2410X CPU,采用Linux2.4內核作
2011-06-15 14:22:585476
基于S3C2440嵌入式Linux的步進電機驅動程序
在嵌入式Linux開發過程中需要為指定設備編寫和編譯驅動程序,這與以往在PC機上的Linux驅動開發明顯不同,本文設計了基于S3C2440嵌入式Linux下激光雕刻系統的 步進電機 驅動程序。 1 硬
2011-09-27 11:56:532215
Linux下CPLD驅動程序
Linux下CPLD驅動程序:
static struct class *cpld_class; //自動創建設備文件時需要先創建類
static struct
2012-05-10 13:57:575440
Windows CENET中斷架構分析和高速AD驅動程序的開發
本文分析了Windows CE.NET嵌入式實時系統的中斷架構和流式驅動架構 及其設備驅動程序的開發方法。實現了該系統下的高速AD驅動程序的開發并進行了實際測試 。
2016-04-18 10:02:170
以ARM9為平臺基于Linux2.6.30開發DS18B20的驅動程序
本文介紹了Linux設備驅動程序的類型和文件操作接口函數,以及驅動程序的基本開發過程。以ARM9為平臺,基于Linux2.6.30開發DS18B20的驅動程序,以模塊的形式加載到內核,最后通過應用層
2017-10-17 10:14:301
Linux字符設備驅動程序的實現
一、Linux device driver 的概念 系統調用是操作系統內核和應用程序之間的接口,設備驅動程序是操作系統內核和機器硬件之間的接口。設備驅動程序為應用程序屏蔽了硬件的細節,這樣在應用程序
2017-10-21 09:54:310
嵌入式Linux下的LCD驅動程序設計方案解析
隨著嵌入式Linux的迅速發展,由于其沒有昂貴的版權費,完全開放源代碼,可裁減性與可移植性,因此是開發嵌入式產品的優秀操作系統平臺。設備驅動程序是Linux內核的重要組成部分,運行在Linux內核
2017-10-30 10:24:300
嵌入式Linux系統中MMC卡驅動程序研究
正確地驅動MMC卡后,就可以像磁盤一樣方便地存取數據。本文所研究與實現的Linux驅動程序,以Intel XScale的PXA250為硬件平臺,在遵循MMC卡通信協議規范的基礎上,實現了卡的底層讀寫。然后對傳統的塊設備驅動程序中的單塊讀寫進行了改進,實現了集群讀寫技術,提高了卡的
2017-11-06 10:39:210
Linux系統網絡驅動程序的編寫
驅動程序編寫 一.Linux系統設備驅動程序概述 1.1 Linux設備驅動程序分類 1.2 編寫驅動程序的一些基本概念 二.Linux系統網絡設備驅動程序 2.1 網絡驅動程序的結構 2.2 網絡驅動程序的基本方法 2.3 網絡驅動程序中用到的數據結構 2.4 常用的系統支持 三。編寫Linux網絡驅動程序中
2017-11-07 10:40:300
Linux驅動程序缺陷檢測研究
驅動程序是操作系統的重要組成部分。驅動程序運行于內核態,其可靠性對于操作系統的安全可靠非常關鍵。針對Linux驅動程序,研究基于符號執行的驅動程序缺陷自動檢測方法。提出了基于性質制導符號執行
2017-11-21 15:26:219
mmc卡和sd卡的區別是什么
mmc卡和sd卡已經是目前運用廣泛的兩種的內存卡。本文以mmc卡和sd卡為中心,主要介紹了它門兩者的結構應用,mmc卡和sd卡之間的區別來進行話題的展開。
2017-12-16 09:06:5845788
可動態安裝的Linux設備驅動程序
為了增跟內核的靈活性和為了方便,設各驅動程序應被設計為一個可動態安裝的內核模塊。于是,一個典型的Linux設備驅動程序應包含如下幾部分代碼:
2018-04-04 10:56:00882
嵌入式Linux設備驅動程序開發基礎知識總結免費下載
本文檔的主要內容詳細介紹的是嵌入式Linux設備驅動程序開發基礎知識總結免費下載
嵌入式Linux設備驅動程序分類靜態加載的驅動程序動態加載的驅動程序
Linux將設備按照功能特性劃分為三種類型:字符設備,塊設備和網絡設備。
2018-10-23 16:10:5613
Linux設備驅動程序的平臺驅動程序和字符驅動程序介紹
了解Linux設備驅動程序的基礎知識,重點介紹平臺驅動程序和字符驅動程序。
提出了簡單的平臺驅動程序實現和簡單的字符驅動程序實現。
2018-11-27 06:32:003949
Linux設備驅動程序基礎知識的了解
了解Linux設備驅動程序的基礎知識,重點關注設備節點,內核框架,虛擬文件??系統和內核模塊。
提出了一個簡單的內核模塊實現。
2018-11-26 06:51:002886
需要了解Linux V4L2的驅動架構
video4linux2(V4L2)是Linux內核中關于視頻設備的中間驅動層,向上為Linux應用程序訪問視頻設備提供了通用接口,向下為linux中設備驅動程序開發提供了統一的V4L2框架。
2019-04-28 17:29:13890
如何寫一個Linux設備驅動程序
首先說明:寫這個第一個Linux設備驅動程序的目的是熟悉Linux驅動的框架以及編程流程,所以是通過打印的信息來觀察程序運行的情況,并不是真正的實現了某一個具體設備的驅動,可以類比于C語言編程中的“Hello World”。
2020-04-12 10:13:444016
如何編寫基于ARM的裸機程序和基于Linux的驅動程序
在嵌入式開發中,ADC應用比較頻繁,本文主要講解ADC的基本原理以及如何編寫基于ARM的裸機程序和基于Linux的驅動程序。
2020-09-13 09:25:502976
如何使用Linux內核實現USB驅動程序框架
Linux內核提供了完整的USB驅動程序框架。USB總線采用樹形結構,在一條總線上只能有唯一的主機設備。 Linux內核從主機和設備兩個角度觀察USB總線結構。本節介紹 Linux內核USB驅動程序
2020-11-06 17:59:1719
嵌入式Linux平臺下SD卡使用
說明在嵌入式開發中,SD卡是比較常用的器件,記錄下其使用方法。底層配置驅動調試。內核配置。Linux內核選項device deivers -> mmc/sd card support
2021-11-01 17:21:264
嵌入式Linux驅動程序和應用程序開發大全
1.嵌入式Linux驅動程序開發嵌入式Linux驅動程序開發包羅萬象,基本上每個點都要大概了解一下。1.1軟件工具Makefile必須要掌握一些,至于Kconfig太簡單了只是個配置文件算不上程序
2021-11-01 18:00:131
細說嵌入式驅動程序設計
嵌入式系統驅動程序的開發有別于WIndows或Linux。后者除了必須了解新設備的硬件特性,把控制硬件的程序盡快完成之外,還需要設法讓驅動程序符合Windows或Linux的規定(大且復雜的架構
2021-11-03 13:21:0111
如何配置和操作Linux驅動程序開發板
本文檔概述了利用Linux開發板為 Linux 內核開發驅動程序的基礎知識,并簡單介紹了如何配置和操作 Linux 驅動程序開發板。
2022-02-15 13:36:342499
基于S3C2440嵌入式Linux步進電機驅動程序
在嵌入式Linux開發過程中需要為指定設備編寫和編譯驅動程序,這與以往在PC機上的Linux驅動開發明顯不同,本文設計了基
于S3C2440嵌入式Linux下激光雕刻系統的步進電機驅動程序。
2023-03-21 11:42:010
評論
查看更多