找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4211|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

eFAT32文件系統(tǒng)對(duì)4G以上的miniSD卡支持

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91350 發(fā)表于 2015-10-30 11:45 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
   最近用eFAT32讀寫(xiě)操作時(shí)發(fā)現(xiàn)文件系統(tǒng)只能對(duì)2G的卡進(jìn)行讀寫(xiě),換成4G死活不行,于是乎開(kāi)始搜了一下資料,原來(lái)是2G一下的是普通卡,上面沒(méi)有HC標(biāo)示,4G-32G是大容量的上面有HC字樣如圖:


不能支持4G的卡是及其壞的,所以我決定要讓現(xiàn)在用的文件系統(tǒng)支持4G的存儲(chǔ)卡片。

自然是上網(wǎng)找代碼了,“偷”了RT的代碼回來(lái);貋(lái)看了一下代碼,代碼比較簡(jiǎn)單,就是他做了個(gè)I驅(qū)動(dòng)封裝結(jié)構(gòu)而已剝掉他不管就好了。 然后開(kāi)始移植,把和硬件無(wú)關(guān)的全部拿來(lái),然后修改代碼為我自己的style。換上自己的底層驅(qū)動(dòng)。只保留他的運(yùn)算和判斷部分。交付文件系統(tǒng)的接口也做了修改。原來(lái)的代碼中做了一個(gè)MSD_read/write和SDHC_read/write,兩份驅(qū)動(dòng)函數(shù),后來(lái)閱讀發(fā)現(xiàn)似乎沒(méi)有什么區(qū)別,我就照葫蘆畫(huà)瓢了。OK一切具備后編譯下載,并沒(méi)有得到我期待的正常的創(chuàng)建讀寫(xiě)文件,而是得了個(gè)大零蛋回來(lái)。什么都沒(méi)有。從那時(shí)候開(kāi)始找問(wèn)題了,這是上周6的事。到現(xiàn)在基本上一周了。連續(xù)用掉哦好幾個(gè)晚上,本來(lái)都是打帝國(guó)時(shí)代的。被無(wú)情占用了.
總結(jié)如下:

一、初始化:主要目的是挑選出來(lái)SDHC卡和普通的V1.X卡片。
1、初始化的CMD8命令的正確響應(yīng)
區(qū)別是否是SDHC的一個(gè)重要節(jié)點(diǎn)是給他發(fā)送CMD8命令,如果是SDHC的都會(huì)響應(yīng)的,在程序中對(duì)這兩者的區(qū)別是V1.X和V2.X,代碼如下



2、初始化發(fā)送CMD55 + ACMD41 命令

3、 讀取OCR并分析


以上流程完成后初始化完成退出即可,有的程序中是還有后續(xù)的,哪些不要也可以。

二、讀取卡片總的扇區(qū)數(shù)量。這個(gè)就可以知道這個(gè)卡片是多么大的了。

V1.X的是



三、也是最重要的一環(huán)就是加載物理地址0扇區(qū)
這個(gè)加載是文件系統(tǒng)自己加在的,但是在操作中發(fā)現(xiàn)BUFF數(shù)據(jù)對(duì),但不能找到啟動(dòng)扇區(qū)。于是追蹤文件系統(tǒng)發(fā)現(xiàn)文件系統(tǒng)不健全少東西呀,。根本原因在讀取0扇區(qū)時(shí)返回的數(shù)據(jù)會(huì)被記錄進(jìn)mydis的分區(qū)結(jié)構(gòu)體中,這個(gè)結(jié)構(gòu)體返回的數(shù)據(jù)正確,在對(duì)結(jié)構(gòu)進(jìn)行判別的時(shí)候發(fā)現(xiàn)沒(méi)有這一項(xiàng),也就是SD卡文件系統(tǒng)的類(lèi)型這項(xiàng),如圖

這塊代碼對(duì)是否是FAT家族進(jìn)行判斷,可能是代碼年代久遠(yuǎn),沒(méi)有0X0C的定義,這個(gè)FAT32系統(tǒng),所以在識(shí)別的時(shí)候他返回錯(cuò)誤,這里只需要給他加入一個(gè)宏即可

//unkonw FAT32 SDHC
#define PT_FAT32x 0x0C       

這樣系統(tǒng)就可以對(duì)啟動(dòng)扇區(qū)進(jìn)行正常的加載了。
四、讀寫(xiě)驅(qū)動(dòng)
值得注意的是讀寫(xiě)驅(qū)動(dòng)核心的接口和MSD的一模一樣,只不過(guò)是在地址輸入的時(shí)候加了一個(gè)判斷,

SDHC的下發(fā)的直接是扇區(qū)地址,無(wú)需轉(zhuǎn)換。
完成這這些之后就可以成功的創(chuàng)建讀寫(xiě)文件啦。


實(shí)際上大部分時(shí)間是用來(lái)閱讀源代碼上。因?yàn)槟脕?lái)品不是簡(jiǎn)單的只用才行,要看個(gè)差不多吧,否則這種問(wèn)題根本解決不了,F(xiàn)在好了附加產(chǎn)品是對(duì)文件系統(tǒng)的作者書(shū)寫(xiě)有了大概的了解,明白了里面很多原來(lái)以為晦澀的東西,以及他的構(gòu)架。

他的構(gòu)架也是分層的,最底層是硬件然后上來(lái)是硬件接口驅(qū)動(dòng),然后就是一個(gè)獨(dú)特的IO管理系統(tǒng),主要完成文件系統(tǒng)對(duì)內(nèi)存的需求而制定的。遵循類(lèi)似memalloc的規(guī)則,有分配有釋放。單位是一個(gè)扇區(qū)的大小512字節(jié)。有棧記錄有計(jì)數(shù)器。就是一個(gè)小型的內(nèi)存管理。只是很小很簡(jiǎn)單。他直接參與和驅(qū)動(dòng)的數(shù)據(jù)交換,數(shù)據(jù)被放進(jìn)高速緩存中。然后在上面就是FAT的分區(qū)記錄,對(duì)FAT的分區(qū)進(jìn)行記錄最多4個(gè)只用1個(gè)嘛。在上面就是基于文件和簇的還有FAT表相文件屬性等等。最終留了UI接口?梢曰镜陌凑誹nix那套進(jìn)行啦。當(dāng)然由于軟件時(shí)間久遠(yuǎn),有些地方難免有問(wèn)題,F(xiàn)AT類(lèi)型就是典型的。他只支持到0XB。FAT32的類(lèi)型。現(xiàn)在是0XC。自己要fix.所以想要移植一個(gè)東西,也需要對(duì)他有充分的了解才可以。而且并非那么簡(jiǎn)單。有許多東西一時(shí)半會(huì)根本看不懂。3層結(jié)構(gòu)那基本是開(kāi)玩笑的。不過(guò)慶幸的是結(jié)構(gòu)里面基本都是不帶指針的,要是在來(lái)幾個(gè)指針函數(shù),小鏈表虎林的,還會(huì)暈菜更久

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:70069 發(fā)表于 2020-4-10 09:17 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表