嵌入式系統(tǒng)的SD控制器設計實現(xiàn)
驅(qū)動程序要實現(xiàn)相應的XXX_Open(),XXX_Close(),XXX_Init(),XXX_Deinit(),XXX_IOControl(),XXX_Read(),XXX_Write(),XXX_Seek(),XXX_PowerUp(),XXX_PowerDown()等接口函數(shù),其中XXX為設備驅(qū)動的前綴,應用程序可以通過文件操作來控制設備。
為了減少了SDHost驅(qū)動程序設計的復雜性,使其具有較好的可移植性,采用SDHostDDK,它在BSQUARESD協(xié)議棧的基礎上,提供了平臺獨立的總線和客戶端驅(qū)動和一組標準化的API供使用。BSQUARESD卡的協(xié)議棧結(jié)構(gòu)如圖1所示。

圖1 SD卡協(xié)議棧體系結(jié)構(gòu)
該結(jié)構(gòu)的設計很大程度上減少了SDHost驅(qū)動程序設計的復雜性,使SDHost控制器驅(qū)動程序設計可以專著于硬件相關的部分。總線驅(qū)動是SD卡客戶端驅(qū)動程序和SDHost驅(qū)動程序之間的一個抽象層,它為SD卡客戶端驅(qū)動提供平臺獨立的服務接口。SDHost驅(qū)動程序需要完成處理器和硬件平臺相關的處理,向上層驅(qū)動提供統(tǒng)一的服務接口。
2.2 中斷控制
中斷控制是設備驅(qū)動程序里的關鍵部分,它關系到操作系統(tǒng)的實時相應速度和系統(tǒng)的整體性能。WindowsCE是通用的嵌入式系統(tǒng),它在中斷處理方面也有一定實時能力。
WindowsCE處理中斷的過程分為兩部分實現(xiàn):核心的ISR和用戶線程IST。ISR實現(xiàn)一般要求短小精悍、效率很高,它只實現(xiàn)簡單的功能:響應設備中斷并返回一個中斷標識碼。IST是用戶態(tài)線程,負責處理具體的中斷事務。
當有硬件設備產(chǎn)生中斷時,系統(tǒng)進入核心ISR執(zhí)行,響應設備中斷并返回一個中斷標識碼,核心根據(jù)返回的中斷標識碼設置相應的事件,該事件將引起IST的執(zhí)行,處理具體的中斷事務。處理過程如圖2所示。

圖2 WindowsCE中斷處理過程
本實現(xiàn)中用到了下列中斷:SD卡檢測中斷,SDIO中斷和DMA0中斷(DMA0專用于SDHost的DMA數(shù)據(jù)傳輸)。SD卡檢測中斷IST負責檢測SD卡的插入和拔出,通知上層應用SD插槽的狀態(tài);SDIO中斷IST只是簡單的通知總線驅(qū)動有SDIO中斷產(chǎn)生,具體處理交給SDIO卡的驅(qū)動程序;DMA0中斷IST負責處理SD的DMA數(shù)據(jù)傳送。
在WindowsCE中,由于驅(qū)動程序DLL運行在用戶態(tài),因此驅(qū)動程序要訪問硬件寄存器,必須在驅(qū)動程序的進程空間分配一段虛擬空間,然后將這段虛擬空間映射到硬件寄存器所映射到內(nèi)核的虛擬地址才能夠完成相應的訪問。SDHost驅(qū)動程序在初始化的時候,必須進行資源分配和地址映射,配置好各個GPIO引腳的功能;然后需要創(chuàng)建事件和相應的中斷標識碼的關聯(lián),創(chuàng)建中斷服務線程IST,準備進行中斷響應服務。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論