這是 FLASH_PDD 整個 driver 的架構一覽:
http://msdn.microsoft.com/en-us/library/bb821532.aspx
從這裡可以知道, FLASH PDD driver 其實是比一般 disk IO 更底層的 driver, 一般皆使用 DeviceIoControl 去操作, 在這裡有 CE 提供的既有功能:
http://msdn.microsoft.com/en-us/library/ee484253(v=winembedded.60).aspx
好的, 從這裡可以知道有哪些工具可以用. 至於這些 DeviceIoControl 用的 header, 其實要用 OpenStore() 去開, 而非 CreateFile 開 DSK?:
http://msdn.microsoft.com/en-US/library/ee489981(v=winembedded.60).aspx
到這裡, 才算是真正可以拿到 flash memory (可能是 NAND, 可能是 NOR, 不一定) 的 RAW data.
example code: (read only)
int GetNandAssignData(void *pvDstData, int nSectorAddr, int nSectorCount)
{ //for XP35C6, iVC1 only.
HANDLE hndDSK = 0;
int nERR = -1;
FLASH_PDD_TRANSFER
tPDDtrans;
FLASH_READ_STATUS
tPDDstate;
hndDSK = OpenStore(L"MSFlash");
if(!hndDSK || hndDSK == INVALID_HANDLE_VALUE) return -1;
tPDDtrans.pData = (unsigned char*)pvDstData;
tPDDtrans.pSpare = 0;
tPDDtrans.RegionIndex = 0;
tPDDtrans.SectorRun.StartSector = nSectorAddr;
tPDDtrans.SectorRun.SectorCount = nSectorCount;
nERR = (int)DeviceIoControl(
hndDSK,
IOCTL_FLASH_PDD_READ_PHYSICAL_SECTORS,
&tPDDtrans,
sizeof(FLASH_PDD_TRANSFER),
&tPDDstate,
sizeof(ULONG),
0,
0);
CloseHandle(hndDSK);
if(nERR) return 0;
else return -2;
}
到這裡還需要的, 尚有:
1. BSP 設定的 flash memory map. 有這個地圖, 才會知道哪區擺的是哪個.
2. Flash 的 page size,
3. NAND 需要 ECC 產生器, 而且必需要跟原本用的格式一樣.
目前試過 physical read 跟 block erase 沒有問題, 寫入因為欠 ECC 產生器作罷.
ps. 20130610後記: 在 FreeScale 官方 Windows CE BSP 上 page read/write 皆無 spare, spare 的部份設定只能借 block get/set (FLASH_BLOCK_STATUS_BAD, FLASH_BLOCK_STATUS_RESERVED) 得到或設定這個 flag.
別家的 SoC 的 BSP 有沒有把這部份 implement 的夠完整? 我不知道, 我也沒辦法做任何保證. 畢竟 BSP code 裡有多少地雷, 老闆跟 PM 不會知道也不會關心.
沒有留言:
張貼留言