【BLE】TLSR8258开发记录之15--模拟FATFS
1、說明
基于SDK3.4,前期移植了Fatfs,發現在芯片進入睡眠后重新喚醒后,文件系統會失效需重新掛載,這是絕對不允許滴,故而自己模擬fat文件系統,采用FAT12。
FATFS文件系統簡介請自行上網查詢資料學習…本文主要做記錄
2、操作
2.1、本FATFS的定義
包含DBR、FAT、RootDir、data四個區域;每個扇區512byte,每個簇占4個扇區,因而每個簇為2048byte
FAT表中每12bit代表一個簇,即3個字節表示2個簇(項)
2.2、將FATFS進行劃分
如下表,數據區地址從簇2開始,分為單PDF文件和PDF、CSV雙文件
| DBR引導區 | 固化在內部flash | 512(內部) |
| FAT分配表區 | 0~0x7FF | 2048 |
| Rootdir根目錄區 | 0x800~0xFFF | 2048 |
| data(PDF) | 0x1000~0x200000 | 2093056? |
| DBR引導區 | 固化在內部flash | 512(內部) |
| FAT分配表區 | 0~0x7FF | 2048 |
| Rootdir根目錄區 | 0x800~0xFFF | 2048 |
| data(PDF) | 0x1000~0x180FFF | 1572864?(1.5M) |
| data(CSV) | 0x181000~0x200000 | 520192? |
2.3、每個區域的數據處理
2.3.1、DBR引導區,拷貝任意一個U盤的,作為固定字段,可以寫進內部flash
2.3.2、FAT區,該區域數據,需要進行文件長度與FAT表項的轉換而得出,算法如下
//update the fat1 unsigned int sectorsum; unsigned int i=0; unsigned int k=0; char tempfatbuf[2048]={0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00};sectorsum = (data_stop_address-data_start_address)/2048 + ((((gdata_stop_address-data_start_address)%2048)==0)?0:1);for(i=0;i<sectorsum;i++){if(i==(sectorsum-1))k = 0xFFF;elsek = i+3;if((i%2)==0){tempfatbuf[3+i+i/2]=k&0xff;tempfatbuf[4+i+i/2]= (tempfatbuf[4+i+i/2]&0xF0)|((k>>8)&0x0F);}else{tempfatbuf[3+i+i/2]=(tempfatbuf[3+i+i/2]&0x0F)|((k&0x0F)<<4);tempfatbuf[4+i+i/2]=k>>4;}}2.3.3、Rootdir根目錄區
對于長文件名的處理
①短文件名是DOS+FAT12/FAT16時代的產物,命名規則為8.3
②8是指文件名,3是指擴展名(完整文件=文件名.擴展名)
③文件名不能超過8個字節,如果多于8個字節,在DOS里不會被識別
④擴展名不能超過3個字節,如果多于3個字節,在DOS里不會被識別
⑤文件名超出8個字節或擴展名超出3個字節都是長文件名 ,長文件名與短文件名必須同時存在且一一對應
⑥目錄項的長文件名字段中未用到的字段,要先用2byte的0x00填充,再用0xFF填充,否則window會識別到文件名后綴還帶有空格,如下左圖為識別異常
⑦短文件名和長文件名都是存儲于RootDir根目錄區,短文件名的目錄項和長文件名的目錄項定義如下圖
⑧舉例,PDF文件的名字為“202002020001.PDF”,總共16個字符,每個長目錄項可以有13個字符,故而需要2個長目錄項+1個短目錄項。 以“202002020001.PDF”文件名為例,長文件名的2個目錄項如下(倒序、目錄項在實際存儲時為倒序):
| 42 50 00 44 00 46 00 00 00 FF FF 0F 00 0B FF FF FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF | 長文件目錄項2-32byte |
| 01 32 00 30 00 32 00 30 00 30 00 0F 00 0B 32 00 30 00 32 00 30 00 30 00 30 00 00 00 31 00 2E 00 | 長文件目錄項1-32byte |
| 32 30 32 30 30 32 7E 31 50 44 46 00 00 00 創建 時間 創建 日期 訪問 日期 00 00 修改 時間 修改 日期 02 00 文 件 長 度 | 長文件目錄項0-32byte |
⑨短文件名的前8個字符為:長文件名的前6個字符+"~"+“1”,目錄項0中標黑部分為“PDF”
⑩舉例,PDF文件的名字為“2004010001.PDF”,總共14個字符,每個長目錄項可以有13個字符,故而需要2個長目錄項+1個短目錄項。
以“2004010001.PDF”文件名為例,長文件名的2個目錄項如下(倒序、目錄項在實際存儲時為倒序):
| 42 46 00 00 00 FF FF FF FF FF FF 0F 00 B9 FF FF FF FF FF FF FF FF FF FF FF FF 00 00 FF FF FF FF | 長文件目錄項2-32byte |
| 01 32 00 30 00 30 00 34 00 30 00 0F 00 B9 31 00 30 00 30 00 30 00 31 00 2E 00 00 00 50 00 44 00 | 長文件目錄項1-32byte |
| 32 30 32 30 30 32 7E 31 50 44 46 00 00 00 創建 時間 創建 日期 訪問 日期 00 00 修改 時間 修改 日期 02 00 文 件 長 度 | 短文件目錄項-32byte |
表中標黑部分為長文件名的校驗和,是由短文件名通過特定算法算出,算法C代碼如下
//根據短文件名計算出長文件名的校驗和 unsigned char LongName_CheckkSum (unsigned char *pShortName) {short FcbNameLen;unsigned char Sum; //必須為無符號型Sum = 0;for (FcbNameLen=11; FcbNameLen!=0; FcbNameLen--){// NOTE: The operation is an unsigned char rotate rightSum = ((Sum & 1) ? 0x80 : 0) + (Sum >> 1) + *pShortName++;}return (Sum); }2.3.4、data數據區
本區域就是實際存儲的文件數據了…
總結
以上是生活随笔為你收集整理的【BLE】TLSR8258开发记录之15--模拟FATFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BLE】TLSR8258开发记录之12
- 下一篇: [学习笔记]C++