换个BSP,flash盘符不见了,不知道是什么原因
昨天弄了个立宇泰2440的5.0BSP。放上去跑。
结果发现不了flash盘符,但是在存储管理器可以正常识别flash 的容量。
后来我拿另外一个可以识别的老一点的5.0BSP来对比注册表,发现是一样的,就是FLASH驱动有点小区别,于是我用这个可以识别的flash驱动代替立宇泰下的flash驱动,
重新编译,结果还是不能识别,真不知道是什么原因,请各位指示一下。
还有另外一个超级不爽的问题,我想把原来的flash驱动恢复回来,结果编译总是报错(貌似PB还是笨笨的认为是老的flash驱动,说找不到老的flash驱动),这算不算是PB的一个BUG?
[解决办法]
估计是你自己编译的问题而不是PB的问题,仔细检查自己的代码和编译的方法
实在不行最好是Clean编译一下,或者是直接查看release目录下面的Ce.bib和Reginit.ini,看文件和注册表是不是真是已经修改成如你所愿。
[解决办法]
应该不是PB的bug , 是'你'的bug
[解决办法]
注册表里面把他隐藏了吧
编译问题可以考虑修改dirs,不要编译对应的驱动,修改bib中的驱动为旧的驱动文件路径
[解决办法]
根据我的经验 计算机不会犯错 犯错的永远是人
[解决办法]
建议对比一下两者的BSP,从网上找个文件比较器看看。
如果了另一个版本BSP ok的话,应该能找到问题的。
[解决办法]
估计你的注册表没有设置好,有没低/高格格式化?
[解决办法]
你先检查一下新的BSP里面的Flash驱动对Nand Flash页大小、Block大小配置有没有问题
[解决办法]
这是我的程序里的FMD_GetInfo ,
BOOL FMD_GetInfo(PFlashInfo pFlashInfo)
{
if (!pFlashInfo)
return(FALSE);
pFlashInfo->flashType = NAND;
pFlashInfo->wDataBytesPerSector = NAND_PAGE_SIZE;
pFlashInfo->dwNumBlocks = NAND_BLOCK_CNT;
pFlashInfo->wSectorsPerBlock = NAND_PAGE_CNT;
pFlashInfo->dwBytesPerBlock = (pFlashInfo->wSectorsPerBlock * pFlashInfo->wDataBytesPerSector);
return(TRUE);
}
其中红色的都是define 或 enum 的,大部分都是在flash头文件里定义的,所以FMD_GetBlockStatus读不对的情况下,FMD_GetInfo还是对的,我认为FMD_GetInfo基本上就没有真正的去读flash,
#define NAND_BLOCK_CNT (8192) // 8192 blocks
#define NAND_PAGE_CNT (32) // Each Block has 32 Pages
#define NAND_PAGE_SIZE (512) // Each Page has 512 Bytes
#define NAND_BLOCK_SIZE (NAND_PAGE_CNT * NAND_PAGE_SIZE)
#define NAND_BBI_OFFSET 5 // Bad block info spare offset
#define NAND_BUS_WIDTH 8 // 8-bit bus
但是FMD_GetBlockStatus 就不一样 了,它是真正的去读flash了,红字的地方,他是根据 nand flash里每个block 的第一个page或第二个page里的spare are 的第6个byte(也就是第517个字节,从512开始算,如果nandflash 是8位总线),下面是我用的K9F1208的资料里的一段话
All device locations are erased(FFh) except locations where the invalid block(s) information is written prior to shipping. The invalid
block(s) status is defined by the 6th byte(X8 device) or 1st word(X16 device) in the spare area. Samsung makes sure that either the
1st or 2nd page of every invalid block has non-FFh(X8 device) or non-FFFFh(X16 device) data at the column address of 517(X8
device) or 256 and 261(X16 device). Since the invalid block information is also erasable in most cases, it is impossible to recover the
information once it has been erased. Therefore, the system must be able to recognize the invalid block(s) based on the original
invalid block information and create the invalid block table via the following suggested flow chart(Figure 4). Any intentional erasure of
the original invalid block information is prohibited.
总之就是以块为单位,读每个块的第一页的spare are区里的第517字节来判断block是否可以使用,这个函数主要是干这个的。调用它的函数就可以知道最后由多好个可以使用的block(如果没有block被 reserve ),那么就可以根据总block数来得到nandflash里的可以使用的容量,接下来就可以reserve ,接着在partition 等等
DWORD FMD_GetBlockStatus(BLOCK_ID blockID)
{
SECTOR_ADDR Sector = (blockID * NAND_PAGE_CNT);
SectorInfo SI[2];
DWORD dwResult = 0;
// Samsung makes sure that either the 1st or 2nd page of every initial
// invalid block has non-FFh data at the column address of 517. Read
// first two page spare areas and to determine block status.
if (!FMD_ReadSector(Sector, NULL, SI, 2))
{
ERRORMSG(TRUE, (_T("NAND block %d status is unknown.\r\n"), blockID));
dwResult = BLOCK_STATUS_UNKNOWN;
goto cleanUp;
}
if ((SI[0].bBadBlock != 0xFF) || (SI[1].bBadBlock != 0xFF))
{
ERRORMSG(TRUE, (_T("NAND block %d is bad.\r\n"), blockID));
dwResult = BLOCK_STATUS_BAD;
goto cleanUp;
}
if (!(SI[0].bOEMReserved & OEM_BLOCK_READONLY))
dwResult |= BLOCK_STATUS_READONLY;
if (!(SI[0].bOEMReserved & OEM_BLOCK_RESERVED))
dwResult |= BLOCK_STATUS_RESERVED;
cleanUp:
return(dwResult);
}