2440從sd卡啟動wince

2021-06-06 18:05:55 字數 1410 閱讀 2801

有關sd卡驅動和fat fs的實現用了3個檔案來實現。sdboot.c為sd的驅動(可理解為pdd)層,主要實現一些對sd控制器的配置以及一些基本sd命令的實現和對sd卡的操作。sdmmc.c實現了從sd卡讀取nk並跳到記憶體去執行的**(基本可以理解為sd驅動的mdd層)。sdfat.c檔案就是實現fat fs的。mdd層通過fatfs來對pdd層操作以實現讀取檔案。

在整個過程中遇到了很多問題,現在列舉如下:

1)sd卡初始化問題

配置gpio有關sd的功能:sdcmd, sddat[3:0]。

使能clkcon中的sdi位。

時鐘以及計算公式:sdipre   = pclk/(clk)-1;iniclk=300000;sdclk=24000000; mmcclk= 15000000

cmd0-cmd55-cmd41-cmd2-cmd3-cmd7-cmd6-cmd17

2)對sd卡操作問題

sd卡包括:乙個標識暫存器cid,乙個相應位址暫存器rca,乙個其他引數暫存器

csd。

對sd卡的操作是驅動通過sd controller來發相應的命令以達到讀寫等操作的:傳送命令通過sdicmdcon[7:0]的除了開始2bit:cmdindex放置要傳送的命令號;sdicmdcon[8]開始傳送命令來完成的。

檢測卡的插入,直接用中斷引腳的電平來判斷。

判斷插入的卡是否是sd卡,用命令cmd55和cmd41,因為mmc卡對cmd55不做回應。

命令9就是獲取sd卡中csd暫存器的值的,該值包括很多sd卡的資訊,其中就有sd卡的容量。這個值在sd卡接收到cmd9之後會以response的形式存放在sd控制器的sdi response register[0,1,2,3]中。在執行cmd9,cmd10等這樣的命令的時候,卡的狀態應該是不選中的,或直接在執行它們之前傳送cmd7(0)不選中卡,不然的話會timeout。

用cmd17來讀取單個block的資料,該命令要帶位址引數(該引數通過cmd3命令來獲取),然後根據sdidsta和sdifsta狀態值來從sd控制器的sdidat暫存器中讀出要讀的資料。該命令與cmd9相反,在執行它之前要選中卡。讀完乙個block之後要做一些善後工作,為下次讀取做好準備,不然的話checkcmdend就要一直迴圈了。因為用的是每次都讀乙個block,並位址要以block對齊,這樣就要考慮要讀取的位址是否是block對齊的,長度是否夠乙個block。

sdidcon這個資料控制暫存器也很重要,一些對資料的操作形式就是在這裡設定的。

3)fat檔案系統問題

根據mbr找到分割槽表,根據分割槽表找到該分割槽mbr[446b+4個分割槽表(每個16b)+2b結束符)

分割槽表中的第9-12位元組為該分割槽的啟始位址(單位沒sector),第13-16位元組為分割槽的長度(單位也是sector)

本文出自 「bluefish」 部落格,請務必保留此出處

本文出自 51cto.com技術部落格

SD啟動卡分析

常用於嵌入式系統的啟動之中 在 emmc 啟動 nor flash 啟動,nfs 啟動 sd 卡啟動也是最常用的一種啟動方式。這裡以 8g 的 sd 卡作為講解 0 aa b b 2047 512 2047 512 1 255 1024 2 255 1024 2 1 8g u boot.環境變數 空...

wince下SD卡驅動開發

如圖所示 最下面的是你的h w部分,其中sd host controller是你的sd硬體控制器部分,你寫驅動需要這部分的spec。接著上面的sd host controller driver就是你需要實現的部分了,直接和你的控制器打交道。而bus層則是位於host和client之間的一層,主要用來...

複製SD啟動卡 生成新啟動卡

在已經有1張sd卡啟動卡的情況下,如何複製出一張新卡 1.使用軟體diskgenius4.8.0 硬碟 備份分割槽表 備份 源sd卡分割槽資訊 2.使用軟體diskgenius4.8.0 硬碟 還原分割槽表 還原 目標sd卡分割槽資訊 3.使用軟體diskgenius4.8.0 工具 轉殖分割槽 轉...