通过几天的查资料,看代码。总算把这个问题解决了。
我用的是AU1250的芯片,和K9F1208的falsh.主要是通过读取U盘中的内核文件。然后把它替换掉旧的文件就可以了。
要实现在系统下应用程序直接调用FMD_ReadSector(),FMD_WriteSector()读写FLASH是不行的。但是可以通过FMD_OEMIoControl()函数来实现。所以要在FMD_OEMIoControl添加我要想要的函数。如下:
BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,
PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
switch(dwIoControlCode)
{
case 0xfff00001:
ldr_NandReadBBT(); //读取Flash中的想关信息
if(FALSE == UpdataNK_formU())//重U盘中读取数据并重写相关数据块。
{
return FALSE;
}
Break;
default:
return(FALSE);
}
return TRUE;
}
UpdataNK_formU()
{
hFile = CreateFile(TEXT("//USB Disk//NK.nb0"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);//打开内核文件
Size = GetFileSize(hFile, NULL);//获取内核文件大小
//计算要写多少块数据。
if((Size % NAND_BYTES_PER_BLOCK) == 0)
{
uBlockNumsToWrite = Size / NAND_BYTES_PER_BLOCK;
}
else
{
uBlockNumsToWrite = (Size / NAND_BYTES_PER_BLOCK);
uBlockNumsToWrite ++;
}
for(i=0;i<uBlockNumsToWrite;i++)
{
ReadFile(hFile, readBuffer, NAND_BYTE_PER_SECTOR * NAND_SECTORS_PER_BLOCK, &ReadNum, NULL);//读取一个块的数据。
//调用 FMD_EraseBlock和FMD_WriteSector擦除和写入相关数据。
}
ldr_NandWriteBBT();//把相关数据写入第0块。
CloseHandle(hFile);
}
这样就修改好了内核驱动部分。后面就是修改注册表的部分了。
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFlash]
"Dll"="nandxxxfmd.dll" ;你的flash驱动名。
"Prefix"="DSK"
"Order"=dword:4
“Index”=dword:1
;"Ioctl"=dword:4
"Profile"="NSFlash"
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
; Override names in default profile
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash]
"Name"="NAND Flash"
"Folder"="NANDFlash"
"PartitionDriver"="MSPart.dll"
"AutoMount"=dword:1
"AutoPart"=dword:1
"AutoFormat"=dword:1
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash/FATFS]
"EnableCache"=dword:1
"CacheSize"=dword:1000
"MountBootable"=dword:1
"Flags"=dword:00000024
"CheckForFormat"=dword:1
然后就可以在应用程序中直接调用了。
hFirm = CreateFile(TEXT("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if(hFirm == INVALID_HANDLE_VALUE)
{
printf("Open Flash Device Failed");
return 0;
}
iRet = DeviceIoControl(hFirm, 0xfff00001, NULL, 0, NULL, 0, NULL, NULL);
现在你就可以把NK.Nb0放到你的U盘内,插入系统中,运行你的应用程序。它就会把你的整个系统升级了。哈哈。