13653|64

79

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

放假前最后一帖——wince文件系统BinFS+FAT问题 [复制链接]

刚才搜索老帖子,shuiyan牛人发帖有人回应要实现多分区要在fmd.cpp中要
hPart = BP_OpenPartition( (IMAGE_START_BLOCK+1)*PAGES_PER_BLOCK,        // next block of MBR
                              SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK, // align to block
                              PART_BINFS,
                              false,
                              PART_OPEN_ALWAYS);

-----------据我所知,nand flash装载内核的部分应该是BinFS,剩下的用作FAT文件系统,现在我想请教这个BinFS+FAT是怎么实现的?binFS占用了一部分后,FAT部分大小在哪里确定,FAT的相关代码在哪里?谢谢了。这七天一边玩一边学这两个。恳请指点。

最新回复

自己顶上去,明天14点结贴了。哈哈,最长的帖子。哎。  详情 回复 发表于 2008-10-20 22:47
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
对了,我的平台:2440+128M SDRAM+512M nand flash
我的BIOS是ADS编写的
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
你的BIOS放什么地方?有多大?能够上电就启动吗?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
可以啊,放在nand flash BIOS 128K
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
BIOS这么大,一下子跑的起来吗?还是有个什么NBOOT先引导一下?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
可以查看eboot代码,在eboot目录中的fmd.cpp文件里的WriteRegionsToBootMedia()函数可供参考,这是4.2平台下的,5.0下的没找到。如果没有4.2的平台,我可以发给你。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
5.0下也有对应的函数,是什么WRITEOSIMAGETOSMARTMEDIA( )吧.
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
5.0下的这个WRITEOSIMAGETOSMARTMEDIA()函数没有调用BP_OpenPartition()函数来创建文区操作
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 
楼上的,怎么没有?你自己没看明白就瞎说,你这样忽悠自己不要紧,关键你这样还会误导别人,这样就不好了.没有调查没有发言权的.
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 8 楼 xqhrs232 的回复:
楼上的,怎么没有?你自己没看明白就瞎说,你这样忽悠自己不要紧,关键你这样还会误导别人,这样就不好了.没有调查没有发言权的.

晕倒,我可真没瞎说。
我的5.0BSP确实没有此函数
在eboot的nand.c,有个WriteDiskImageToSmartMedia()来写image文件的。此函数确实没有bp_openpartition()操作。
BOOL WriteDiskImageToSmartMedia(DWORD dwImageStart, DWORD dwImageLength, BOOT_CFG *pBootCfg)
{
    UINT32 ulLogicalSector;
    FlashInfo FlashInfo;
    SectorInfo *pSectInfo;
    BYTE *pBuffer;
    UINT32 ulBadBlocks = 0;
    UINT32 ulImageLengthSectors = 0;
    UINT8 MACCount = 0;

    UINT16 uSectorSize = 0;
    UINT32 ulBlockSize  = 0;
    UINT32 ulSectorsPerBlock  = 0;

    // If there isn't a SmartMedia card in the system, it'll be kind of hard to write an image to it...
    //
    if (!g_bSmartMediaExist)
    {
        EdbgOutputDebugString("WARNING: Smart Media device doesn't exist - unable to store image.\r\n");
        return(FALSE);
    }

    // Format the SmartMedia card prior to writing.
    //
    EdbgOutputDebugString("INFO: Formatting SmartMedia (please wait)...\r\n");
    if (!FormatSmartMedia())
    {
        EdbgOutputDebugString("ERROR: Failed to format SmartMedia.\r\n");
        return(FALSE);
    }

    EdbgOutputDebugString("INFO: Writing download image to SmartMedia (please wait)...\r\n");

    // Get NAND flash info.
    //
    if (!FMD_GetInfo(&FlashInfo))
    {
        EdbgOutputDebugString("ERROR: Unable to get SmartMedia flash information.\r\n");
        return(FALSE);
    }
    uSectorSize = FlashInfo.wDataBytesPerSector;
    ulBlockSize  = FlashInfo.dwBytesPerBlock;
    ulSectorsPerBlock = (ulBlockSize / uSectorSize);

    // Write the image to NAND flash (starting at sector 0, skipping bad blocks).
    //
    // NOTE: we're going to assume that the image being written to SmartMedia has been generated
    // by the disk image utility.  As such, the first two flash blocks are reserved for the Steppingstone
    // loader and the IPL.  We'll mark these sectors reserved and start the logical sector numbering at
    // 0 on the following sector.  This shouldn't affect our ability to store/load a single NK solution
    // since the logical sector numbering and the reserved status won't matter to the ReadImageFromSmartMedia
    // routine (below).
    //
    ulImageLengthSectors = (dwImageLength / (uSectorSize + sizeof(SectorInfo)));

    for (ulLogicalSector = 0, ulBadBlocks = 0, MACCount = 0; ulLogicalSector < ulImageLengthSectors ; ulLogicalSector++)
    {
        // Compute the physical sector address (equal to logical sector address plus compensation for any bad blocks).
        UINT32 ulPhysicalSector = ((ulBadBlocks * ulSectorsPerBlock) + ulLogicalSector);
        UINT32 ulBlockNumber    = (ulPhysicalSector / ulSectorsPerBlock);

        // If we're writing the first sector of a new block and the block is marked bad, skip the whole block.
        while (!(ulPhysicalSector % ulSectorsPerBlock) && (FMD_GetBlockStatus(ulBlockNumber) == BLOCK_STATUS_BAD))
        {
            ulBadBlocks++;

            // Recompute the sector and block numbers based on bad blocks.
            ulPhysicalSector += ulSectorsPerBlock;
            ulBlockNumber++;
        }

        // Have we walked off the end of flash?
        if (ulPhysicalSector > (FlashInfo.dwNumBlocks * ulSectorsPerBlock))
        {
            EdbgOutputDebugString("ERROR: SmartMedia sector write would be out of bounds (physical sector = 0x%x  max sector = 0x%x).\r\n", ulPhysicalSector, (FlashInfo.dwNumBlocks * ulSectorsPerBlock));
            return(FALSE);
        }

        // update the buffer to the current sector
        pBuffer = (BYTE *)(dwImageStart + (ulLogicalSector * (uSectorSize + sizeof(SectorInfo))));

        // sector info immediately follows the current sector
        pSectInfo = (SectorInfo *) (pBuffer + uSectorSize);
        
        // For NAND-only boots, the NOR flash at nGCS0 isn't available for retrieving the CS8900A MAC
        // address (nor is there a EEPROM connected to the CS8900A where we could store this address).
        // We'll use the logical sector field for the first couple reserved block sectors to store
        // the address.
        //
        if ((MACCount < 3) && !(pSectInfo->bOEMReserved & OEM_BLOCK_RESERVED))
        {
            pSectInfo->dwReserved1 = pBootCfg->CS8900MAC[MACCount++];
        }

        // Write the sector to flash...
        //
        if (!FMD_WriteSector(ulPhysicalSector, pBuffer, pSectInfo, 1))
        {
            EdbgOutputDebugString("ERROR: Failed to write to SmartMedia (sector number 0x%x).\r\n", ulPhysicalSector);
            return(FALSE);
        }
    }

    EdbgOutputDebugString("INFO: Writing image to SmartMedia completed successfully.\r\n");
    return(TRUE);

}

 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

11
 
4.2下的
BOOL WriteRegionsToBootMedia(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr)
{
    BYTE nCount;
    DWORD dwNumExts;
    PXIPCHAIN_SUMMARY pChainInfo = NULL;
    EXTENSION *pExt = NULL;
    DWORD dwBINFSPartLength = 0;
    HANDLE hPart, hPartEx;
    DWORD dwStoreOffset;
    DWORD dwMaxRegionLength[BL_MAX_BIN_REGIONS] = {0};
    DWORD dwChainStart, dwChainLength;

    //  Initialize the variables
    dwChainStart = dwChainLength = 0;

    EdbgOutputDebugString("+WriteRegionsToBootMedia: ImageStart: 0x%x, ImageLength: 0x%x, LaunchAddr:0x%x\r\n",
                            dwImageStart, dwImageLength, dwLaunchAddr);

    if ( !g_bBootMediaExist ) {
        EdbgOutputDebugString("ERROR: WriteRegionsToBootMedia: device doesn't exist.\r\n");
        return(FALSE);
    }

    if ( !VALID_TOC(g_pTOC) ) {
        EdbgOutputDebugString("WARN: WriteRegionsToBootMedia: INVALID_TOC\r\n");
        if ( !TOC_Init(g_dwTocEntry, g_ImageType, dwImageStart, dwImageLength, dwLaunchAddr) ) {
            EdbgOutputDebugString("ERROR: INVALID_TOC\r\n");
            return(FALSE);
        }
    }

    if ( !(IMAGE_TYPE_BINFS & g_pTOC->id[g_dwTocEntry].dwImageType) ) {
        EdbgOutputDebugString("ERROR: WriteRegionsToBootMedia: INVALID_IMAGE_TYPE: 0x%x\r\n",
            g_pTOC->id[g_dwTocEntry].dwImageType);
        return(FALSE);
    }

    // Look in the kernel region's extension area for a multi-BIN extension descriptor.
    // This region, if found, details the number, start, and size of each BIN region.
    //
    //for (nCount = 0, dwNumExts = 0 ; (nCount < g_BINRegionInfo.dwNumRegions) && !pChainInfo ; nCount++)
    for (nCount = 0, dwNumExts = 0 ; (nCount < g_BINRegionInfo.dwNumRegions); nCount++)
    {
        // Does this region contain nk.exe and an extension pointer?
        //
        pExt = (EXTENSION *)GetKernelExtPointer(g_BINRegionInfo.Region[nCount].dwRegionStart,
                                                g_BINRegionInfo.Region[nCount].dwRegionLength );
        if ( pExt != NULL)
        {
            // If there is an extension pointer region, walk it until the end.
            //
            while (pExt)
            {
                DWORD dwBaseAddr = g_BINRegionInfo.Region[nCount].dwRegionStart;
                pExt = (EXTENSION *)OEMMapMemAddr(dwBaseAddr, (DWORD)pExt);
                EdbgOutputDebugString("INFO: OEMLaunch: Found chain extenstion: '%s' @ 0x%x\r\n", pExt->name, dwBaseAddr);
                if ((pExt->type == 0) && !strcmp(pExt->name, "chain information"))
                {
                    pChainInfo = (PXIPCHAIN_SUMMARY) OEMMapMemAddr(dwBaseAddr, (DWORD)pExt->pdata);
                    dwNumExts = (pExt->length / sizeof(XIPCHAIN_SUMMARY));
                    EdbgOutputDebugString("INFO: OEMLaunch: Found 'chain information' (pChainInfo=0x%x  Extensions=0x%x).\r\n", (DWORD)pChainInfo, dwNumExts);
                    break;
                }
                pExt = (EXTENSION *)pExt->pNextExt;
            }
        }
        else {
            //  Search for Chain region. Chain region doesn't have the ROMSIGNATURE set
            DWORD   dwRegionStart = g_BINRegionInfo.Region[nCount].dwRegionStart;
            DWORD   dwSig = *(LPDWORD) OEMMapMemAddr(dwRegionStart, dwRegionStart + ROM_SIGNATURE_OFFSET);

            if ( dwSig != ROM_SIGNATURE) {
                //  It is the chain
                dwChainStart = dwRegionStart;
                dwChainLength = g_BINRegionInfo.Region[nCount].dwRegionLength;
                EdbgOutputDebugString("Found the Chain region: StartAddress: 0x%X; Length: 0x%X\n", dwChainStart, dwChainLength);
            }
        }
    }

    // Determine how big the Total BINFS partition needs to be to store all of this.
    //
    if (pChainInfo && dwNumExts == g_BINRegionInfo.dwNumRegions)    // We're downloading all the regions in a multi-region image...
    {
        DWORD i;
        EdbgOutputDebugString("Writing multi-regions\r\n");

        for (nCount = 0, dwBINFSPartLength = 0 ; nCount < dwNumExts ; nCount++)
        {
            dwBINFSPartLength += (pChainInfo + nCount)->dwMaxLength;
            EdbgOutputDebugString("BINFSPartMaxLength[%u]: 0x%x, TtlBINFSPartLength: 0x%x \r\n",
                nCount, (pChainInfo + nCount)->dwMaxLength, dwBINFSPartLength);

            // MultiBINInfo does not store each Regions MAX length, and pChainInfo is not in any particular order.
            // So, walk our MultiBINInfo matching up pChainInfo to find each regions MAX Length
            for (i = 0; i < dwNumExts; i++) {
                if ( g_BINRegionInfo.Region.dwRegionStart == (DWORD)((pChainInfo + nCount)->pvAddr) ) {
                    dwMaxRegionLength = (pChainInfo + nCount)->dwMaxLength;
                    EdbgOutputDebugString("dwMaxRegionLength[%u]: 0x%x \r\n", i, dwMaxRegionLength);
                    break;
                }
            }
        }

    }
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(中级)

12
 
    else    // A single BIN file or potentially a multi-region update (but the partition's already been created in this latter case).
    {
        dwBINFSPartLength = g_BINRegionInfo.Region[0].dwRegionLength;
        EdbgOutputDebugString("Writing single region/multi-region update, dwBINFSPartLength: %u \r\n", dwBINFSPartLength);
    }

    // Open/Create the BINFS partition where images are stored.  This partition starts immediately after the MBR on the Boot Media and its length is
    // determined by the maximum image size (or sum of all maximum sizes in a multi-region design).
    // Parameters are LOGICAL sectors.
    //
/*    hPart = BP_OpenPartition( NEXT_FREE_LOC,
                              FILE_TO_SECTOR_SIZE(dwBINFSPartLength) + 1, // sizeof image + MBR sector
                              PART_BINFS,
                              TRUE,
                              PART_OPEN_ALWAYS);
*/

    hPart = BP_OpenPartition( (IMAGE_START_BLOCK+1)*PAGES_PER_BLOCK,        // next block of MBR
                              SECTOR_TO_BLOCK_SIZE(FILE_TO_SECTOR_SIZE(dwBINFSPartLength))*PAGES_PER_BLOCK, // align to block
                              PART_BINFS,
                              TRUE,
                              PART_OPEN_ALWAYS);

    if (hPart == INVALID_HANDLE_VALUE )
    {
        EdbgOutputDebugString("ERROR: WriteRegionsToBootMedia: Failed to open/create BINFS partition.\r\n");
        return(FALSE);
    }

    // Are there multiple BIN files in RAM (we may just be updating one in a multi-BIN solution)?
    //
    for (nCount = 0, dwStoreOffset = 0; nCount < g_BINRegionInfo.dwNumRegions ; nCount++)
    {
        DWORD dwRegionStart  = (DWORD)OEMMapMemAddr(0, g_BINRegionInfo.Region[nCount].dwRegionStart);

        DWORD dwRegionLength = g_BINRegionInfo.Region[nCount].dwRegionLength;

        // Media byte offset where image region is stored.
        dwStoreOffset += nCount ? dwMaxRegionLength[nCount-1] : 0;

        EdbgOutputDebugString("dwRegionStart: 0x%x, dwRegionLength: 0x%x, dwStoreOffset: 0x%x\r\n",
            dwRegionStart, dwRegionLength, dwStoreOffset);

        // Set the file pointer (byte indexing) to the correct offset for this particular region.
        //
        if ( !BP_SetDataPointer(hPart, dwStoreOffset) )
        {
            EdbgOutputDebugString("ERROR: StoreImageToBootMedia: Failed to set data pointer in BINFS partition (offset=0x%x).\r\n", dwStoreOffset);
            return(FALSE);
        }

        // Write the region to the BINFS partition.
        //
        if ( !BP_WriteData(hPart, (LPBYTE)dwRegionStart, dwRegionLength) )
        {

            EdbgOutputDebugString("ERROR: StoreImageToBootMedia: Failed to write region to BINFS partition (start=0x%x, length=0x%x).\r\n", dwRegionStart, dwRegionLength);
            return(FALSE);
        }

        // update our TOC?
        //
        if ((g_pTOC->id[g_dwTocEntry].dwLoadAddress == g_BINRegionInfo.Region[nCount].dwRegionStart) &&
             g_pTOC->id[g_dwTocEntry].dwTtlSectors == FILE_TO_SECTOR_SIZE(dwRegionLength) )
        {
            g_pTOC->id[g_dwTocEntry].dwStoreOffset = dwStoreOffset;
            g_pTOC->id[g_dwTocEntry].dwJumpAddress = 0; // Filled upon return to OEMLaunch

            g_pTOC->id[g_dwTocEntry].dwImageType = g_ImageType;

            g_pTOC->id[g_dwTocEntry].sgList[0].dwSector = FILE_TO_SECTOR_SIZE(g_dwLastWrittenLoc);
            g_pTOC->id[g_dwTocEntry].sgList[0].dwLength = g_pTOC->id[g_dwTocEntry].dwTtlSectors;

            // copy Kernel Region to SDRAM for jump
            memcpy((void*)g_pTOC->id[g_dwTocEntry].dwLoadAddress, (void*)dwRegionStart, dwRegionLength);

            EdbgOutputDebugString("Updateded TOC!\r\n");
        }
        else if( (dwChainStart == g_BINRegionInfo.Region[nCount].dwRegionStart) &&
                 (dwChainLength == g_BINRegionInfo.Region[nCount].dwRegionLength))
        {
            //  Update our TOC for Chain region
            g_pTOC->chainInfo.dwLoadAddress = dwChainStart;
            g_pTOC->chainInfo.dwFlashAddress = FILE_TO_SECTOR_SIZE(g_dwLastWrittenLoc);
            g_pTOC->chainInfo.dwLength = FILE_TO_SECTOR_SIZE(dwMaxRegionLength[nCount]);

            EdbgOutputDebugString("Written Chain Region to the Flash\n");
            EdbgOutputDebugString("LoadAddress = 0x%X; FlashAddress = 0x%X; Length = 0x%X\n",
                                  g_pTOC->chainInfo.dwLoadAddress,
                                  g_pTOC->chainInfo.dwFlashAddress,
                                  g_pTOC->chainInfo.dwLength);
            // Now copy it to the SDRAM
            memcpy((void *)g_pTOC->chainInfo.dwLoadAddress, (void *)dwRegionStart, dwRegionLength);
//            memcpy((void *)0x8c050000, (void *)dwRegionStart, dwRegionLength);
        }
    }

    // create extended partition in whatever is left
    //
    hPartEx = BP_OpenPartition( NEXT_FREE_LOC,
                                USE_REMAINING_SPACE,
                                PART_DOS32,
                                TRUE,
                                PART_OPEN_ALWAYS);

    if (hPartEx == INVALID_HANDLE_VALUE )
    {
        EdbgOutputDebugString("*** WARN: StoreImageToBootMedia: Failed to open/create Extended partition ***\r\n");
    }

    EdbgOutputDebugString("-WriteRegionsToBootMedia\r\n");

    return(TRUE);
}


你用的5.0BSP估计是根4.2下的目录结构一样,也就是说你的bsp是4.2下移植到5.0下的。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

13
 
是吗?这就不清楚了,我的是有的,我的是S3C2440的BSP包!
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

14
 
谢谢楼上两位了
你们的BIOS都是在PB下开发的,分为eboot和nboot。nboot负责把eboot搬运到内存执行
不过我的BIOS是ADS下的,具有eboot和nboot的功能。

你们所说的BINFS和FAT分区是在eboot下实现的,那么我的ADS下怎么没有这样的代码、据我所知,有个叫做loader.h的头文件有类似的代码。

知道的来说说哦
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

15
 
那个LOADER.H只是对各个部分的位置界定,什么NBOOT多大,从那个地方开始放,EBOOT有多大,从那个地方开始放.我不知道你的BIOS有512KB,怎么一下子就引导起来的,有没其它的引导程序?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

16
 
我的bootloader也是ADS实现的,但是保留了eboot的功能。
eboot的功能是全部有源码的,楼主不防读读eboot的代码。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 14 楼 xqhrs232 的回复:
那个LOADER.H只是对各个部分的位置界定,什么NBOOT多大,从那个地方开始放,EBOOT有多大,从那个地方开始放.我不知道你的BIOS有512KB,怎么一下子就引导起来的,有没其它的引导程序?


垫脚石确实只支持4K代码起动,但这不是问题,建意你找vivi或uboot的源码读读,看看怎么跳过4K限制。网上也有相关的资料。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

18
 
stepping stone翻译成垫脚石有创意!
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

19
 
我想两位还是不明白我的意思
----------------------------------

我看了蛮久我的ADS BIOS,对其stepping stone搬运代码的过程了解得比较彻底。可以说,里面大部分代码我都看懂了
只是我现在想问的是BinFS的问题。我刚才看张冬泉的书,他提了一下子。
我现在明白了,彻底的说,wince文件系统为——BINFS+TFAT
要支持BINFS+TFAT,就要设置相应的注册表。

这个我也明白,
但是我想问的是,万一我的nand flash 大小改变了,我应该怎么修改这个文件系统一些相关代码?还有,有时候不能发现nand flash 盘符是什么原因。?文件系统和nand flash驱动是怎么链接起来的?涉及到哪些文件。?谢谢
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

20
 
其实我下午也一直在看这个问题,目前还没有理清楚。现在得知的一些信息是(因为我是用的eboot),在IMAGE_START_BLOCK第一个扇区放写分区表信息,名括起始地址与大小等。默认是支持四个分区。内核怎么读的,我觉得是可能跟注册表的配置、驱动(mspart.dll)和FAL有关。

我不想再跟下去了,太辛苦了,花了一天时间把这些从头到尾跟理了一遍。楼主得知道答案后,希望也可以共享一下,谢谢了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表