80

帖子

0

TA的资源

一粒金砂(初级)

21
 
引用 19 楼 gsymichael 的回复:
你的注册表项里有没有把分区设置为隐藏属性啊。


没有啊,我的另外一个BSP注册表是一样的都行,还有我把可行的smflash.DLL代替这个不能出现盘符的smflash.DLL就完全正常,这说明,不是注册表的问题。

我贴出注册表来。
; HIVE BOOT SECTION
IF BSP_NONANDFS !
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH]
    "DefaultFileSystem"="BINFS"
    "AutoPart"=dword:1
    "AutoMount"=dword:1
    "PartitionDriver"="mspart.dll"
    "Name"="Microsoft Flash Disk"
    "Folder"="wogoyixikexie@gliet"
    "BootPhase"=dword:0

; Keep FATFS from trying to shadow \Windows
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\FATFS]
    "Flags"=dword:14
    "FormatTfat"=dword:1
    "CheckForFormat"=dword:1
   
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SMFLASH]
    "Prefix"="DSK"
    "Dll"="smflash.dll"
    "Index"=dword:1
    "Order"=dword:0
    "Profile"="SMFLASH"
    "IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"


[HKEY_LOCAL_MACHINE\System\StorageManager\FATFS]
    "Flags"=dword:00000014                ;FATFS_TFAT_ALWAYS|FATFS_FORCE_TFAT
     "MountFlags"=dword:0
     
[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
    "DriverPath"="Drivers\\BuiltIn\\SMFLASH"
    ; LoadFlags 0x01 == load synchronously
    "LoadFlags"=dword:1
    "BootPhase"=dword:0
ENDIF ; BSP_NONANDFS
; END HIVE BOOT SECTION

我用代码比较软件和成功的对比也不行。这个说明是驱动的问题,

回复

75

帖子

0

TA的资源

一粒金砂(初级)

22
 
你先检查一下新的BSP里面的Flash驱动对Nand Flash页大小、Block大小配置有没有问题
 
 

回复

68

帖子

0

TA的资源

纯净的硅(初级)

23
 
注册表一样就排除了注册表设置的问题。那你就关注驱动部分的代码吧。
而且你用之前的Dll也是可以的,那就说明你新的Dll那里有问题。
再仔细检查下代码吧。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

24
 
  1. //512M flash 的页大小等信息如下
  2. #ifndef __NAND_H__
  3. #define __NAND_H__

  4. #define LARGE_BLOCK_NAND                0
  5. #define SMALL_BLOCK_NAND                1
  6. #define USE_NFCE                                0
  7. #define USE_GPIO                                1

  8. #define LB_BLOCK_LOOP                        1
  9. #define SB_BLOCK_LOOP                        8

  10. #define SECTOR_SIZE                                2048//512
  11. #define SPARE_SIZE                                64//16
  12. #define PAGES_PER_BLOCK                        64//256                                                // Phisical 64 * logical 4

  13. #define NAND_PAGE_CNT           PAGES_PER_BLOCK                /* Each Block has 32 Pages      */
  14. #define NAND_PAGE_SIZE          SECTOR_SIZE                        /* Each Page has 512 Bytes      */
  15. #define NAND_BLOCK_SIZE         (NAND_PAGE_CNT * NAND_PAGE_SIZE)

  16. #endif    // __NAND_H_.
复制代码
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

25
 
引用 22 楼 gsymichael 的回复:
注册表一样就排除了注册表设置的问题。那你就关注驱动部分的代码吧。
而且你用之前的Dll也是可以的,那就说明你新的Dll那里有问题。
再仔细检查下代码吧。


只能这样,出了问题,才能学习东西。

——对了上面的代码我根据flash修改了一些,注释不对的,但是还是不能看见盘符。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

26
 
你和原来的代码比较只是在贴出的头文件部分有差异吗?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

27
 
引用 25 楼 gsymichael 的回复:
你和原来的代码比较只是在贴出的头文件部分有差异吗?


有很多差异,原来是一个牛人自己写的,能看到盘符,但是很多毛病。我现在想弄的是三星写的,不能比较的。连写法什么都很大差异,原先我花了不少时间移植,不敢用他,只是用来学习。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

28
 
混蛋!版主,封他ID。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

29
 
啥叫盘符DSK1吗?
AutoLoad的都没盘符哦
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

30
 
引用 29 楼 hhyh612 的回复:
啥叫盘符DSK1吗?
AutoLoad的都没盘符哦


我直接拿另外一个DLL,打包,立即就可以了,这已经说明不是注册表的问题,目前我加了打印信息
发现是启动检测的时候检测过界了,我的是512M的 nand flash,总共才4096个block,但是他会检测4096以后的block,一旦大于4096就提示错误。
FMD_GetBlockStatus是被不开源的FAL调用了,请问大侠,这个检测block
块数是在哪里控制的呢?我的信息都没有问题啊。请指示一下。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

31
 
我对比了启动正常和不正常的加载文件系统DLL,发现有使用立宇泰的BSP会两个DLL没有被加载

diskcache.dll和fatfsd.dll没有被加载
——也就是说文件系统没有加载完。新人,搞这个东西,不知道如何下手,看PB帮助文档也是寥寥数字,没有什么帮助价值。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

32
 
确定是驱动的问题,两个驱动比较一下,有时间两个驱动都看懂罗,自然会知道了
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

33
 
引用 30 楼 gooogleman 的回复:
引用 29 楼 hhyh612 的回复:
啥叫盘符DSK1吗?
AutoLoad的都没盘符哦


我直接拿另外一个DLL,打包,立即就可以了,这已经说明不是注册表的问题,目前我加了打印信息
发现是启动检测的时候检测过界了,我的是512M的 nand flash,总共才4096个block,但是他会检测4096以后的block,一旦大于4096就提示错误。
FMD_GetBlockStatus是被不开源的FAL调用了,请问大侠,这个检测block
块数是在哪里控制的呢?我的信息都没…


我觉得FMD_GetBlockStatus 函数怎么读取应该和FMD_GetInfo 有关系,但是FMD_GetInfo 已经正确了,怎么搞的。怎么到了4096block还要往下检测,
我实在找不出什么理由,哪里没有弄到,我只能放弃了。
——微软的代码有不开源,真是烦死了。文档也不够详细。哪个做过的,给我点指示啊。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

34
 
这是我的程序里的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);
}
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

35
 
但是FMD_GetBlockStatus 就不一样 了,它是真正的去读flash了,红字的地方,他是根据 nand flash里每个block 的第一个page或第二个page里的spare are 的第6个byte(也就是第517个字节,从512开始算,如果nandflash 是8位总线),下面是我用的K9F1208的资料里的一段话
——谢谢你,回答的好详细。

我的不是不会读,而是读的block太多了。
我总共才4096个block,但是到了4096,他还往下读。有点不可思议。我的flash是512M的,

这是串口信息
OEMIoControl: Unsupported Code 0x10100b4 - device 0x0101 func 45
OEMIoControl: Unsupported Code 0x101008c - device 0x0101 func 35
FMD::FMD_Init
FMD::FMD_Init - pBSPArgs->nfsblk = 0xffffffff  
FMD::FMD_Init - READ_REGISTER_BYTE(pNFSBLK) = 0x0  
FMD::FMD_Init Softreset .....  
FMD::FMD_Init Done
[S2440:  IN] ++_ReadXID()
MID = 0xec, DID = 0xdc 4th Cycle : 0x10
NUMBLOCKS : 4096(0x1000), SECTORSPERBLOCK = 64(0x40), BYTESPERSECTOR = 2048(0x800)  
FMD_LB_GetBlockStatus (0x0)0x0  
FMD::FMD_LB_ReadSector 0x0  
FMD::NAND_LB_ReadSectorInfo 0x0  
FMD::FMD_LB_ReadSector 0x0  
FMD::NAND_LB_ReadSectorInfo 0x0  
FMD_LB_GetBlockStatus (0x1)0x40  
FMD::FMD_LB_ReadSector 0x100  
FMD::NAND_LB_ReadSectorInfo 0x100  
FMD::FMD_LB_ReadSector 0x40  
FMD::NAND_LB_ReadSectorInfo 0x40  

//------------到了4096就出现错误
[ERROR:nLength>4096]
然后又继续检测
[ERROR:nLength>4096]

FMD::FMD_LB_ReadSector 0x2b540  
FMD::NAND_LB_ReadSectorInfo 0x2b540  
FMD_LB_GetBlockStatus (0xad6)0x2b580  
FMD::FMD_LB_ReadSector 0xad600  
FMD::NAND_LB_ReadSectorInfo 0xad600  
FMD::FMD_LB_ReadSector 0x2b580  
FMD::NAND_LB_ReadSectorInfo 0x2b580  
.............................
.............................
启动后,diskcache.dll和fatfsd.dll没有被加载

只能在存储管理器看到flash的容量。

FMD_GetInfo这个函数的一些信息绝对没有问题,我修改也会起作用,真的让我感觉好奇怪。

难道初始化不正确?

回去继续,不信搞不定!

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

36
 
看看6.0的FAL吧
好像开放的
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

37
 
有KITL的话在FMD_GetBlockStatus 设个断点
超过4096的时候backtrace到上层函数看看

会不会pNANDInfo的数据又被意外的修改了啊
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

38
 
FMD_LB_GetBlockStatus (0x0)0x0
FMD_LB_GetBlockStatus (0x1)0x40

.
.
.

FMD_LB_GetBlockStatus (0xad6)0x2b580

红的地方是不是block id ,绿的地方是啥意思?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

39
 

  1. //
  2. //  FMD_LB_GetBlockStatus
  3. //
  4. //  Returns the status of a block.  The status information is stored in the spare area of the first sector for
  5. //  the respective block.
  6. //
  7. //  A block is BAD if the bBadBlock byte on the first page is not equal to 0xff.
  8. //  
  9. DWORD FMD_LB_GetBlockStatus(BLOCK_ID blockID, int mode)
  10. {
  11.     SECTOR_ADDR sectorAddr = blockID << LB_NAND_LOG_2_PAGES_PER_BLOCK;
  12.     SectorInfo SI;
  13.     DWORD dwResult = 0;
  14. //这个函数启动的时候会被调用很多次,串口信息打开影响速度
  15.         //RETAILMSG(1, (TEXT("FMD_LB_GetBlockStatus (0x%x)0x%x \r\n"), blockID, sectorAddr));
  16.         BOOL bLastMode = SetKMode(TRUE);
  17.        
  18.         if(!FMD_LB_ReadSector(sectorAddr<<2, NULL, &SI, 1, mode))
  19.         {
  20.         return BLOCK_STATUS_UNKNOWN;
  21.         }

  22.     if(!(SI.bOEMReserved & OEM_BLOCK_READONLY))
  23.         {
  24.         dwResult |= BLOCK_STATUS_READONLY;
  25.         }
  26.        
  27.     if( blockID < pBSPArgs->nfsblk )
  28.         {
  29.         dwResult |= BLOCK_STATUS_READONLY;
  30.         }
  31.        
  32.     if(SI.bBadBlock != 0xFF)
  33.         {
  34.         dwResult |= BLOCK_STATUS_BAD;
  35.         }
  36.         SetKMode(bLastMode);

  37.     return dwResult;
  38. }
复制代码

该函数获得nandflash中某一个block的状态。参数为nandflash的block地址。由于nandflash中可能有坏块,所以针对nandflash,这个函数首先会检查当前块是否是坏块,这个一般通过读取当前block的第0个page和第1个page的带外数据。对于大page nandflash一般读取第0个byte,如果不为0xff表示该块是坏块。如果发现该块是坏块,应该返回BLOCK_STATUS_BAD。如果不是坏块,需要读取这个块的起始扇区的扇区信息。如果读该扇区信息出错,应该返回BLOCK_STATUS_UNKNOWN,否则,判断独到的信息,返回相应结果。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

40
 
我觉得这部分flash驱动应该针对文件系统占用的部分的,但是从打印信息看,检测的block是从0到X(X>4096——也是错误问题之一),我现在不知道从哪里控制检测block的块数, 我觉得 FMD_GetInfo应该是告诉上层flash的信息,FMD_GetInfo是没有问题的。除了 FMD_GetInfo,难道还有别的地方?我打开各个函数的调试信息,发现系统启动的时候就是调用这几个函数而已。

——所以现在我真的是无计可施了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表