none
[WINCE]Nor flash磁碟機應用 RRS feed

  • 問題

  • 大家好,
    小弟的開發平台式freescale imx31, 使用的OS是CE5.0
    由於我們採用NOR flash開機, 而registry的儲存也勢必放在NOR flash上面.
    因此小弟使用freescale內建的NORFMD.dll來新增一個儲存區.
    但這個driver無法掛載, trace的結果是64MB的flash無法mapping.

    請問有大大有類似的經驗嗎? 不管是成功或是失敗請不吝與小弟分享, 謝謝!
    2008年12月8日 上午 02:54

解答

  • 因為你是用 NOR Flash, 所以有另一種方法就是直接 access Uncached Kernel Memory, 這樣一來就可以避掉 VirtualAlloc 32MB 的限制.
    但前題是
    1) OAL 的 OEMAddressTable 要先 mapping 整個 NOR Flash (假如是 XIP 的 情況, 這點通常是 postive)
    2) OS 要 enable ll Kernel Mode or NOR Flash Driver 要 invoke SetKMode API.

     

    • 已標示為解答 Vannes 2009年2月17日 上午 01:50
    2009年2月16日 上午 11:12

所有回覆

  •  從你的 describe 沒有太多的 info. no error message or debug output.

    猜測會不會是 OEMAddressTable 沒有 mapping 足夠?

    另外 FMD driver 的 registry setting 是不是有設定正確?

    假如現在的 Flash chip 跟原本 design 不同時, Memory Controller 是不是需要從新設定 (Bus Width, Address Bus config and etc)

    ellen

    2009年1月29日 上午 06:48
  • 感謝解答:)
    小弟已經將這個問題解了,在此將小弟所改寫的程式碼放上來:

    {
        ULONGLONG SourcePhys = 0;
        ULONG   SourceSize = 0;
        BOOL    bSuccess = FALSE;
        DWORD temp = 0;
        SourcePhys = phyAddr.QuadPart & ~(PAGE_SIZE - 1);
        SourceSize = INITIAL_MMAP_SIZE + (phyAddr.LowPart & (PAGE_SIZE - 1));

        RETAILMSG(1, (L"FMD_Init+seperate virtual alloc\r\n"));
        g_pNORFlashBase = (ULONG *)VirtualAlloc(0, SourceSize, MEM_RESERVE, PAGE_NOACCESS);

        if (g_pNORFlashBase != NULL)
        {
            //do twice VirtualCopy
            // 1st alloc
            bSuccess = VirtualCopy(
                g_pNORFlashBase, (PVOID)(SourcePhys >> 8), 0x2000000,
                PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE);
            if (bSuccess)
            {
                temp = phyAddr.LowPart & (PAGE_SIZE - 1);
                g_pNORFlashBase += temp;
            }
            else
            {
                VirtualFree(g_pNORFlashBase, 0, MEM_RELEASE);
                g_pNORFlashBase = NULL;
            }

            // 2nd alloc
            //g_pNORFlashBase+=0x800000;
            bSuccess = VirtualCopy(
                g_pNORFlashBase+0x800000, (PVOID)((SourcePhys+0x2000000) >> 8), 0x2000000,
                //g_pNORFlashBase, (PVOID)((SourcePhys+0x2000000) >> 8), 0x2000000,
                PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE);
            if (bSuccess)
            {
                temp = phyAddr.LowPart & (PAGE_SIZE - 1);
                g_pNORFlashBase += temp;
            }
            else
            {
                VirtualFree(g_pNORFlashBase, 0, MEM_RELEASE);
                g_pNORFlashBase = NULL;
            }
        }
        RETAILMSG(1, (L"FMD_Init+seperate virtual alloc End...\r\n"));
    }   
    ==========================================================================
    主要的目的,是要Allocate 64MB的記憶體。
    但是MmMapIoSpace這個函式只能支援32MB的記憶體,所以小弟寫了分段的方式代替之。
    2009年2月16日 上午 07:31
  • 因為你是用 NOR Flash, 所以有另一種方法就是直接 access Uncached Kernel Memory, 這樣一來就可以避掉 VirtualAlloc 32MB 的限制.
    但前題是
    1) OAL 的 OEMAddressTable 要先 mapping 整個 NOR Flash (假如是 XIP 的 情況, 這點通常是 postive)
    2) OS 要 enable ll Kernel Mode or NOR Flash Driver 要 invoke SetKMode API.

     

    • 已標示為解答 Vannes 2009年2月17日 上午 01:50
    2009年2月16日 上午 11:12