S3C6410 CE6 RAM从128M升级到256M,修改config.bib和image_cfg.h,导致无法启动系统了。

时间:2021-01-12 17:40:17
config.bib如下

IF IMGMULTIXIP !

#define     NKNAME       NK
#define     RAMNAME      RAM
#define     NKSTART      80100000

IF SMDK6410_X5D
#define     NKLEN        02100000    ; 33MB
#define     RAMSTART     82200000
#define     RAMLEN       01300000    ; 19MB (Will be auto-sized from the end of NK)
ELSE
#define     NKLEN        04F00000    ; 79MB (Max size, to match image_cfg.* files. This will be auto-sized)
#define     RAMSTART     85000000
#define     RAMLEN       09500000    ; 13MB (Will be auto-sized from the end of NK)
ENDIF SMDK6410_X5D


;   Single XIP
;-----------------------------------------------------
;   NAME        ADDRESS     SIZE            TYPE
;-----------------------------------------------------
    $(NKNAME)   $(NKSTART)  $(NKLEN)        RAMIMAGE
    $(RAMNAME)  $(RAMSTART) $(RAMLEN)       RAM

ENDIF


IF IMGMULTIXIP

#define     NKNAME          XIPKERNEL
#define     SYSTEMNAME      NK
#define     RAMNAME         RAM

IF IMGPROFILER

#define     NKSTART         80100000
#define     NKLEN           00600000

#define     SYSTEMSTART     80700000
#define     SYSTEMLEN       038FC000

#define     RAMSTART        80400000
#define     RAMLEN          06100000

ELSE

#define     NKSTART         80100000
#define     NKLEN           00300000

#define     SYSTEMSTART     80400000
#define     SYSTEMLEN       03BFC000

#define     RAMSTART        80400000
#define     RAMLEN          06100000

ENDIF

#define     CHAINSTART      83FFC000
#define     CHAINLEN        00004000

;   Multiple XIP
;-----------------------------------------------------
;   NAME            ADDRESS         SIZE            TYPE
;-----------------------------------------------------
    $(NKNAME)       $(NKSTART)      $(NKLEN)        RAMIMAGE
    $(SYSTEMNAME)   $(SYSTEMSTART)  $(SYSTEMLEN)    NANDIMAGE
    $(RAMNAME)      $(RAMSTART)     $(RAMLEN)       RAM
    CHAIN           $(CHAINSTART)   $(CHAINLEN)     RESERVED

ENDIF

 
; Common RAM areas

    AUD_DMA     80002000    00002000        RESERVED
    TEMPS       80010000    00010000        RESERVED
    ARGS        80020800    00000800        RESERVED
    DBGSER_DMA  80022000    00002000        RESERVED
    SER_DMA     80024000    00002000        RESERVED
    IR_DMA      80026000    00002000        RESERVED
    SLEEP       80028000    00002000        RESERVED
    EDBG        80030000    00020000        RESERVED
IF SMDK6410_X5D
    CMM         83500000    00300000        RESERVED
;    FIMG_BUF    82800000    00800000        RESERVED
    DISPLAY     83800000    00400000        RESERVED
    MFC_JPEG    83C00000    00400000        RESERVED
ELSE
CMM         86500000    00300000        RESERVED
DISPLAY     86800000    00C00000        RESERVED
MFC_JPEG    87400000    00C00000        RESERVED
; CMM         8E500000    00300000        RESERVED
; DISPLAY     8E800000    00C00000        RESERVED
; MFC_JPEG    8F400000    00C00000        RESERVED
ENDIF SMDK6410_X5D




CONFIG                  ; Other System Configuration for making image

    COMPRESSION=ON      ; Binary compression for minimizing download transfer data
    KERNELFIXUPS=ON     ; Kernel address fixup
    AUTOSIZE=ON         ; ROM and RAM size will be resizing automatically for padding region

IF IMGMULTIXIP

    ROM_AUTOSIZE=OFF     ; you can measure how much rom is needed to each binary image if you set this flag as ON
    RAM_AUTOSIZE=OFF     ; RAM size will be resizing automatically only when ROM_AUTOSIZE is ON
    DLLADDR_AUTOSIZE=ON

    XIPSCHAIN=$(CHAINSTART)

    AUTOSIZE_ROMGAP=10000
    AUTOSIZE_DLLADDRGAP=0
    AUTOSIZE_DLLDATAADDRGAP=0
    AUTOSIZE_DLLCODEADDRGAP=0

;
; ROMFLAGS is a bitmask of options for the kernel
;   ROMFLAGS    0x0000
;   ROMFLAGS    0x0001      Disallow Paging
;   ROMFLAGS    0x0010      Trust Module only
;
    ROMFLAGS=0
    
    
ELSE

IF IMGTRUSTROMONLY
    ROMFLAGS=10
ELSE
    ROMFLAGS=00
ENDIF   ; END of IMGTRUSTROMONLY
    ROMSTART = $(NKSTART)
    ROMWIDTH = 32
    ROMSIZE = $(NKLEN)

ENDIF   ; END of IMGMULTIXIP

IF IMGPROFILER
    PROFILE=ON
ELSE
    PROFILE=OFF
ENDIF



IF IMGMULTIXIP
#include "$(_TARGETPLATROOT)\FILES\MultipleXIP.bib"
ENDIF


该怎么改呢!

除了这个地方还需要修改那些文件呢。

谢谢

54 个解决方案

#1


没整过,关注.

#2


bootloader的startup.s中对SP的初始化也要改,另外我的BSP中还改了两个文件,具体的忘了,明天帮你查下吧

#3


oemaddrtab_cfg.inc中g_oalAddressTable的空间大小也要修改一下

#4


另外看看RAM初始化部分针对128芯片了256的芯片有没有什么区别吧

#5


引用 4 楼 veabol 的回复:
另外看看RAM初始化部分针对128芯片了256的芯片有没有什么区别吧

有区别,有个寄存器叫RAMSIZE好像

#6


g_oalAddressTable

    ; mDDR 128 MB
        ;DCD     0x80000000, 0x50000000,  64     ; 64 MB DRAM
        DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM
         DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
BOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{
*pMemoryStart = 0x88000000;
*pMemoryLength = 0x08000000;
OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));
return TRUE;
}



系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢

#7


我刚刚看了一下,wince6的BSP中包含了三个start.s文件,一个是steploader中的,一个是eboot中的,还有一个是wince中OAL的,
bootloader中有一句mov          r3, #128                    ; 128MB DRAM
不知道是不更改这句呢,

BSP中还需要更改那些呢,config.bib需要修改吗,有人说可以不用修改,利用OEMGetExtensionDRAM 来扩展内存。还有一个imag_cfg.h文件中有一些宏定义,是否也需要修改呢!

太多了,晕了

#8


bootloader能起来了吗?

2440 做过,6410 没有搞过,呵呵。

这东西分为连续和非连续的内存扩展方法。

#9


#define _ISR_STARTADDRESS (0x31Bfff00)
#define _MMUTT_STARTADDRESS (0x31Bf8000)
#define _STACK_BASEADDRESS (0x31Bf8000)
#define HEAPEND (0x31Bf0000)


这些定义看看你的BSP上有没有,也是需要修改的。

config.bib要改一下,“利用OEMGetExtensionDRAM 来扩展内存”不懂,如果你也不懂的话就改config.bib吧。
其它一些内存设置的内容你再研究研究吧,两个BANK的我也没改过

#10


引用 6 楼 so927 的回复:
g_oalAddressTable

    ; mDDR 128 MB
        ;DCD    0x80000000, 0x50000000,  64    ; 64 MB DRAM
        DCD    0x80000000, 0x50000000,  128    ; 128 MB DRAM
       DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢


不是在这里添加的。这里都没有链接这里,在platform Common的目录里

#11


引用 6 楼 so927 的回复:
g_oalAddressTable

     ; mDDR 128 MB
         ;DCD     0x80000000, 0x50000000,  64     ; 64 MB DRAM
         DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM
DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

 红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


 系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

 谢谢

不连续的内存是要通过你这种方式进行回报给os
但是你的OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)实现时有问题的,之前我这边用过

#12


引用 7 楼 so927 的回复:
我刚刚看了一下,wince6的BSP中包含了三个start.s文件,一个是steploader中的,一个是eboot中的,还有一个是wince中OAL的,
 bootloader中有一句mov          r3, #128                    ; 128MB DRAM
 不知道是不更改这句呢,

 BSP中还需要更改那些呢,config.bib需要修改吗,有人说可以不用修改,利用OEMGetExtensionDRAM 来扩展内存。还有一个imag_cfg.h文件中有一些宏定义,是否也需要修改呢!

 太多了,晕了

bootloader中有一句mov          r3, #128                    ; 128MB DRAM--》不用改,这个影响不到ce
config.bib和imag_cfg.h都是可改可不改的文件,取决于你程序中是否用到了这部分中的一些定义

#13


对啊,BSP也是要改的

#14


引用 11 楼 guopeixin 的回复:
引用 6 楼 so927 的回复:
g_oalAddressTable

    ; mDDR 128 MB
        ;DCD     0x80000000, 0x50000000,  64     ; 64 MB DRAM
        DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM
DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢


不连续的内存是要通过你这种方式进行回报给os
但是你的OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)实现时有问题的,之前我这边用过


请问一下这个函数该怎么实现呢,谢谢

#15


引用 10 楼 gooogleman 的回复:
引用 6 楼 so927 的回复:
g_oalAddressTable

    ; mDDR 128 MB
        ;DCD    0x80000000, 0x50000000,  64    ; 64 MB DRAM
        DCD    0x80000000, 0x50000000,  128    ; 128 MB DRAM
       DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢


不是在这里添加的。这里都没有链接这里,在platform Common的目录里



googleman,您是指什么不是添加再这里呢,是oalAddressTable,还是OEMGetExtensionDRAM 函数

#16


OEMGetExtensionDRAM 是微软提供的接口的了,在platform下的Common下面。

#17


OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)的声明和实现都有问题
它的第一个参数其实是一个数组的指针,数据的每个元素是一个section结构体,结构体中指出来了你声明的内存的起始位置,长度和属性信息
另外,最大支持16个section(记不太清楚了)
kernel下代码进行memory代码初始化的会去以指针的方式引用该函数,你看一下就明白了

#18


楼上说的有道理,先试试再说

#19


PLATFORM\COMMON\SRC\COMMON\OTHER\memory.c
中有
BOOL OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{
    return FALSE;
}
没有代码,直接返回了FALSE

我在PLATFORM\DEVICEEMULATOR\SRC\OAL\OALLIB\init.c中找到了一个此函数的实现代码
BOOL 
OEMGetExtensionDRAM(
    LPDWORD lpMemStart, 
    LPDWORD lpMemLen
    ) 
{
    typedef volatile unsigned long MegOfExtendedRam_t[1024 * 1024 / sizeof (unsigned long)];
    MegOfExtendedRam_t *MegsOfRam = (MegOfExtendedRam_t *)EXTENDED_RAM_BASE;
    DWORD each_meg;
    const DWORD dwPageSize = 4096; // PAGE_SIZE in ceddk isn't valid until later in boot

    OALMSG(OAL_FUNC, (L"++OEMGetExtensionDRAM\r\n"));

    // Employ a simple memory test to see that all N meg's are there.
    // NB: Because an empty memory bus can "float" data for several
    // cycles and appear as valid memory, discharge the bus before
    // verifying the data.
    //
    // The probe is nondestructive, to allow the contents of extension
    // RAM to be preserved across soft resets
    try {
        for (each_meg = 0; each_meg < EXTENDED_RAM_MEGS; ++each_meg)
        {
            unsigned long temp0 = MegsOfRam[each_meg][0];
            unsigned long temp1 = MegsOfRam[each_meg][1];

            MegsOfRam[each_meg][0] = 0x55555555UL; // Write pattern
            MegsOfRam[each_meg][1] = ~0x55555555UL; // Discharge
            if (MegsOfRam[each_meg][0] != 0x55555555UL) // Verify patern
                break;
            MegsOfRam[each_meg][0] = ~0x55555555UL; // Write pattern-not
            MegsOfRam[each_meg][1] = 0x55555555UL; // Discharge
            if (MegsOfRam[each_meg][0] != ~0x55555555UL)
                break;

            MegsOfRam[each_meg][0] = temp0;
            MegsOfRam[each_meg][1] = temp1;
        }
    } except (EXCEPTION_EXECUTE_HANDLER) {
        OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));
        return FALSE; // no extension DRAM
    }

    *lpMemStart = EXTENDED_RAM_BASE;
    *lpMemLen = each_meg * sizeof (MegOfExtendedRam_t);
    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: found 0x%08x bytes of ram at 0x%08x\r\n",
        *lpMemLen, *lpMemStart));

    // adjust by RAM FMD amount
    if(g_dwExtensionRAMFMDSize != 0) {
        if((g_dwExtensionRAMFMDSize & (dwPageSize - 1)) != 0) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: g_dwExtensionRAMFMDSize 0x%08x not a multiple of %u\r\n",
                g_dwExtensionRAMFMDSize, dwPageSize));
        } else if(*lpMemLen < g_dwExtensionRAMFMDSize) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: 0x%08x bytes of extension ram not enough to satisfy FMD request for 0x%0x bytes\r\n",
                *lpMemLen, g_dwExtensionRAMFMDSize));
        } else {
            g_pvExtensionRAMFMDBaseAddr = (PVOID) EXTENDED_RAM_BASE;
            *lpMemStart = EXTENDED_RAM_BASE + g_dwExtensionRAMFMDSize;
            *lpMemLen -= g_dwExtensionRAMFMDSize;
                OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: reserving 0x%08x bytes of ram at 0x%08x for RAMFMD\r\n",
                    g_dwExtensionRAMFMDSize, g_pvExtensionRAMFMDBaseAddr));
        }
    }

    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: returning 0x%08x bytes of ram at 0x%08x\r\n",
        *lpMemLen, *lpMemStart));

    OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));

    return TRUE;
}


有点搞不明白了

#20


“guopeixin”

能把您的代码贴一下吗,谢谢

#21


引用 19 楼 so927 的回复:
PLATFORM\COMMON\SRC\COMMON\OTHER\memory.c
 中有
 BOOL OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)
 {
     return FALSE;
 }
 没有代码,直接返回了FALSE

 我在PLATFORM\DEVICEEMULATOR\SRC\OAL\OALLIB\init.c中找到了一个此函数的实现代码
C/C++ codeBOOL 
OEMGetExtensionDRAM(
    LPDWORD lpMemStart, 
    LPDWORD lpMemLen
    ) 
{
    typedefvolatile unsignedlong MegOfExtendedRam_t[1024*1024/sizeof (unsignedlong)];
    MegOfExtendedRam_t*MegsOfRam= (MegOfExtendedRam_t*)EXTENDED_RAM_BASE;
    DWORD each_meg;const DWORD dwPageSize=4096;// PAGE_SIZE in ceddk isn't valid until later in boot
    OALMSG(OAL_FUNC, (L"++OEMGetExtensionDRAM\r\n"));// Employ a simple memory test to see that all N meg's are there.// NB: Because an empty memory bus can "float" data for several// cycles and appear as valid memory, discharge the bus before// verifying the data.//// The probe is nondestructive, to allow the contents of extension// RAM to be preserved across soft resetstry {for (each_meg=0; each_meg< EXTENDED_RAM_MEGS;++each_meg)
        {
            unsignedlong temp0= MegsOfRam[each_meg][0];
            unsignedlong temp1= MegsOfRam[each_meg][1];

            MegsOfRam[each_meg][0]=0x55555555UL;// Write pattern            MegsOfRam[each_meg][1]=~0x55555555UL;// Dischargeif (MegsOfRam[each_meg][0]!=0x55555555UL)// Verify paternbreak;
            MegsOfRam[each_meg][0]=~0x55555555UL;// Write pattern-not            MegsOfRam[each_meg][1]=0x55555555UL;// Dischargeif (MegsOfRam[each_meg][0]!=~0x55555555UL)break;

            MegsOfRam[each_meg][0]= temp0;
            MegsOfRam[each_meg][1]= temp1;
        }
    } except (EXCEPTION_EXECUTE_HANDLER) {
        OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));return FALSE;// no extension DRAM    }*lpMemStart= EXTENDED_RAM_BASE;*lpMemLen= each_meg*sizeof (MegOfExtendedRam_t);
    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: found 0x%08x bytes of ram at 0x%08x\r\n",*lpMemLen,*lpMemStart));// adjust by RAM FMD amountif(g_dwExtensionRAMFMDSize!=0) {if((g_dwExtensionRAMFMDSize& (dwPageSize-1))!=0) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: g_dwExtensionRAMFMDSize 0x%08x not a multiple of %u\r\n",
                g_dwExtensionRAMFMDSize, dwPageSize));
        }elseif(*lpMemLen< g_dwExtensionRAMFMDSize) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: 0x%08x bytes of extension ram not enough to satisfy FMD request for 0x%0x bytes\r\n",*lpMemLen, g_dwExtensionRAMFMDSize));
        }else {
            g_pvExtensionRAMFMDBaseAddr= (PVOID) EXTENDED_RAM_BASE;*lpMemStart= EXTENDED_RAM_BASE+ g_dwExtensionRAMFMDSize;*lpMemLen-= g_dwExtensionRAMFMDSize;
                OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: reserving 0x%08x bytes of ram at 0x%08x for RAMFMD\r\n",
                    g_dwExtensionRAMFMDSize, g_pvExtensionRAMFMDBaseAddr));
        }
    }

    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: returning 0x%08x bytes of ram at 0x%08x\r\n",*lpMemLen,*lpMemStart));

    OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));return TRUE;
}

 有点搞不明白了

呵呵,不用迷惑,你先不用管那么多,知道最终调用的不是common csp下的,而是bsp下的就行了,呵呵

#22


引用 20 楼 so927 的回复:
“guopeixin”

 能把您的代码贴一下吗,谢谢

待会我找一下发给你

#23



static DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections,DWORD cMemSections)
{
    DWORD cSections = 0;
    if (cSections < cMemSections)
    {
        pMemSections[cSections].dwFlags = 0;
        pMemSections[cSections].dwStart = 0x88201000;
        pMemSections[cSections].dwLen = 0x03DFF000;
        cSections++;
    }
    return cSections;
}

#24


OEMEnumExtensionDRAM

OEMGetExtensionDRAM
好像有点不一样哦???

#25


引用 24 楼 so927 的回复:
OEMEnumExtensionDRAM

OEMGetExtensionDRAM
好像有点不一样哦???

是不一样呀,没有说让实现OEMGetExtensionDRAM呀,呵呵

#26


引用 23 楼 guopeixin 的回复:
static DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections,DWORD cMemSections)
{
    DWORD cSections = 0;
    if (cSections < cMemSections)
    {
        pMemSections[cSections].dwFlags = 0;
        pMemSections[cSections].dwStart = 0x88201000;
        pMemSections[cSections].dwLen = 0x03DFF000;
        cSections++;
    }
    return cSections;
}


我按照您说的写了这个函数,但是开机的时候发现根本没有调用啊

是wince6.0下的吗???

#27


引用 26 楼 so927 的回复:
引用 23 楼 guopeixin 的回复:
static DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections,DWORD cMemSections)
{
    DWORD cSections = 0;
    if (cSections < cMemSections)
    {
        pMemSections[cSections].dwFlags = 0;
        pMemSections[cSections].dwStart = 0x88201000;
        pMemSections[cSections].dwLen = 0x03DFF000;
        cSections++;
    }
    return cSections;
}


我按照您说的写了这个函数,但是开机的时候发现根本没有调用啊

是wince6.0下的吗???

需要把这个函数地址赋值给global中的函数指针才行

#28


我按照说明,实现了OEMEnumExtensionDRAM函数,加入调试信息,启动时显示调用了此函数,
在loader.c中
if (g_pOemGlobal->pfnEnumExtensionDRAM) {
            cExtSections = (*g_pOemGlobal->pfnEnumExtensionDRAM)(MemSections, MAX_MEMORY_SECTIONS - 1);
            DEBUGCHK(cExtSections < MAX_MEMORY_SECTIONS);
        } else if (OEMGetExtensionDRAM (&MemSections[0].dwStart, &MemSections[0].dwLen)) {
            cExtSections = 1;
        } else {
            cExtSections = 0;
        }


我发现OEMEnumExtensionDRAM和OEMGetExtensionDRAM都可以使用的,前者最多可列举出16段不连续内存。
而后者只能列举一个。

两个我都使用了一次,试验了一下,运行到这一步之后,系统就不动了,死了。

请问这个又是怎么回事呢??


谢谢

#29


引用 28 楼 so927 的回复:
我按照说明,实现了OEMEnumExtensionDRAM函数,加入调试信息,启动时显示调用了此函数,
在loader.c中
C/C++ codeif (g_pOemGlobal->pfnEnumExtensionDRAM) {
            cExtSections= (*g_pOemGlobal->pfnEnumExtensionDRAM)(MemSections, MAX_MEMORY_SECTIONS-1);
            DEBUGCHK(cExtSections< MAX_MEMORY_SECTIONS);
        }elseif (OEMGetExtensionDRAM (&MemSections[0].dwStart,&MemSections[0].dwLen)) {
            cExtSections=1;
        }else {
            cExtSections=0;
        }

我发现OEMEnumExtensionDRAM和OEMGetExtensionDRAM都可以使用的,前者最多可列举出16段不连续内存。
而后者只能列举一个。

两个我都使用了一次,试验了一下,运行到这一步之后,系统就不动了,死了。

请问这个又是怎么回事呢??


谢谢

能不能把你的代码粘贴出来一份?

#30


楼主你的bootloader修改了吗?

光修改这些是不够的。

#31


eboot已经修改了
但是steploader还没有改,因为我编译出来的steploader运行不了。

#32


做个标记。嘿嘿……

#33


引用 30 楼 gooogleman 的回复:
楼主你的bootloader修改了吗?

光修改这些是不够的。


bootloader有两个,eboot修改并运行良好
steploader我编译出来运行不了,没有办法

在inc中更改了寄存器的设置。

SMDK6410\SRC\BOOTLOADER\EBOOT\startup.s文件中有一句不明白是干什么的,也涉及到大小。
; Comment:
        ; The following loop is to direct map RAM VA == PA. i.e.
        ;   VA == 0x50XXXXXX => PA == 0x50XXXXXX for S3C6410
        ; Fill in 8 entries to have a direct mapping for DRAM

        ldr          r10, =PT_1ST_BASE          ; Restore address of 1st level page table
        ldr          r0,  =DRAM_BASE_PA_START

        add          r10, r10, #PTR_1ST_PTE     ; (r10) = ptr to 1st PTE for 0x50000000

        add          r0, r0, #0x1E               ; 1MB cachable bufferable
        orr          r0, r0, #0x400          ; set kernel r/w permission
        mov          r1, #0
;       mov          r3, #64                     ; 64MB DRAM
       mov          r3, #128                    ; 128MB DRAM
;       mov          r3, #256                    ; 256MB DRAM


请各位指点一下

#34


引用 33 楼 so927 的回复:
引用 30 楼 gooogleman 的回复:
 楼主你的bootloader修改了吗?

 光修改这些是不够的。


 bootloader有两个,eboot修改并运行良好
 steploader我编译出来运行不了,没有办法

 在inc中更改了寄存器的设置。

 SMDK6410\SRC\BOOTLOADER\EBOOT\startup.s文件中有一句不明白是干什么的,也涉及到大小。
Assembly code; Comment:; The following loop is to direct map RAM VA == PA. i.e.;   VA == 0x50XXXXXX => PA == 0x50XXXXXX for S3C6410; Fill in 8 entries to have a direct mapping for DRAM
        ldr          r10, =PT_1ST_BASE; Restore address of 1st level page table        ldr          r0,  =DRAM_BASE_PA_STARTadd          r10, r10, #PTR_1ST_PTE; (r10) = ptr to 1st PTE for 0x50000000add          r0, r0, #0x1E; 1MB cachable bufferable        orr          r0, r0, #0x400; set kernel r/w permissionmov          r1, #0;       mov          r3, #64                     ; 64MB DRAMmov          r3, #128; 128MB DRAM
;       mov          r3, #256                    ; 256MB DRAM

 请各位指点一下

是指这个吧,这个是建立mmu pts映射表用的,这个地方错误也无所谓,因为os初始化的时候ms会重新搞一下
好像我的blog有一篇说这个东西,既不清楚了,你看看吧

#35


还是有点问题

不知道怎么才能解决呢!
该改的地方都改了!
肯定是那儿没有改对,郁闷啊。

#36


Come On EveryBody

#37


好贴,继续关注,

虚席ing...

呼吁高手都出来解决啊!

#38


强烈要求这个贴 推荐

#39


1、在image_cfg.h中有:// DRAM Base Address
#define DRAM_BASE_PA_START            (0x50000000)
#define DRAM_BASE_CA_START            (0x80000000)
#define DRAM_BASE_UA_START            (0xA0000000)
#define DRAM_SIZE                     (0x08000000) ;//128M


2、在image_cfg.h中有:;// DRAM Base Address
DRAM_BASE_PA_START      EQU     (0x50000000)
DRAM_BASE_CA_START      EQU     (0x80000000)
DRAM_BASE_UA_START      EQU     (0xA0000000)
DRAM_SIZE               EQU     (0x08000000) ;//128M

很久没搞6410了,都不记得了,
好像6410要支持356的内存,跟硬件叶有关系。

#40


硬件寄存器也要初始化为256M的
首先要保证内存全部可以访问

#41


引用 40 楼 so927 的回复:
硬件寄存器也要初始化为256M的
首先要保证内存全部可以访问


LZ搞定了?GX!

#42


搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。

#43


引用 42 楼 so927 的回复:
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。



在STEPLOADER里面设置就够了?那系统(NK)怎么知道当前内存是多大的?STEPLOADER里面的设置怎么通知NK?

#44


引用 42 楼 so927 的回复:
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。

哇,就是hw初始化不对了,那eboot下的ram测试怎么会通过呢?

#45


我用PXA300扩展2片SDRAM 64M的,不痛啊,郁闷中。。。

#46


引用 42 楼 so927 的回复:
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。




能否把经验分享一下?或者总结一下修改的地方。

Best Regards!

#47


mark

#48


受教了,标记一下

#49


mark

#50


收益多多!

#1


没整过,关注.

#2


bootloader的startup.s中对SP的初始化也要改,另外我的BSP中还改了两个文件,具体的忘了,明天帮你查下吧

#3


oemaddrtab_cfg.inc中g_oalAddressTable的空间大小也要修改一下

#4


另外看看RAM初始化部分针对128芯片了256的芯片有没有什么区别吧

#5


引用 4 楼 veabol 的回复:
另外看看RAM初始化部分针对128芯片了256的芯片有没有什么区别吧

有区别,有个寄存器叫RAMSIZE好像

#6


g_oalAddressTable

    ; mDDR 128 MB
        ;DCD     0x80000000, 0x50000000,  64     ; 64 MB DRAM
        DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM
         DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
BOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{
*pMemoryStart = 0x88000000;
*pMemoryLength = 0x08000000;
OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));
return TRUE;
}



系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢

#7


我刚刚看了一下,wince6的BSP中包含了三个start.s文件,一个是steploader中的,一个是eboot中的,还有一个是wince中OAL的,
bootloader中有一句mov          r3, #128                    ; 128MB DRAM
不知道是不更改这句呢,

BSP中还需要更改那些呢,config.bib需要修改吗,有人说可以不用修改,利用OEMGetExtensionDRAM 来扩展内存。还有一个imag_cfg.h文件中有一些宏定义,是否也需要修改呢!

太多了,晕了

#8


bootloader能起来了吗?

2440 做过,6410 没有搞过,呵呵。

这东西分为连续和非连续的内存扩展方法。

#9


#define _ISR_STARTADDRESS (0x31Bfff00)
#define _MMUTT_STARTADDRESS (0x31Bf8000)
#define _STACK_BASEADDRESS (0x31Bf8000)
#define HEAPEND (0x31Bf0000)


这些定义看看你的BSP上有没有,也是需要修改的。

config.bib要改一下,“利用OEMGetExtensionDRAM 来扩展内存”不懂,如果你也不懂的话就改config.bib吧。
其它一些内存设置的内容你再研究研究吧,两个BANK的我也没改过

#10


引用 6 楼 so927 的回复:
g_oalAddressTable

    ; mDDR 128 MB
        ;DCD    0x80000000, 0x50000000,  64    ; 64 MB DRAM
        DCD    0x80000000, 0x50000000,  128    ; 128 MB DRAM
       DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢


不是在这里添加的。这里都没有链接这里,在platform Common的目录里

#11


引用 6 楼 so927 的回复:
g_oalAddressTable

     ; mDDR 128 MB
         ;DCD     0x80000000, 0x50000000,  64     ; 64 MB DRAM
         DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM
DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

 红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


 系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

 谢谢

不连续的内存是要通过你这种方式进行回报给os
但是你的OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)实现时有问题的,之前我这边用过

#12


引用 7 楼 so927 的回复:
我刚刚看了一下,wince6的BSP中包含了三个start.s文件,一个是steploader中的,一个是eboot中的,还有一个是wince中OAL的,
 bootloader中有一句mov          r3, #128                    ; 128MB DRAM
 不知道是不更改这句呢,

 BSP中还需要更改那些呢,config.bib需要修改吗,有人说可以不用修改,利用OEMGetExtensionDRAM 来扩展内存。还有一个imag_cfg.h文件中有一些宏定义,是否也需要修改呢!

 太多了,晕了

bootloader中有一句mov          r3, #128                    ; 128MB DRAM--》不用改,这个影响不到ce
config.bib和imag_cfg.h都是可改可不改的文件,取决于你程序中是否用到了这部分中的一些定义

#13


对啊,BSP也是要改的

#14


引用 11 楼 guopeixin 的回复:
引用 6 楼 so927 的回复:
g_oalAddressTable

    ; mDDR 128 MB
        ;DCD     0x80000000, 0x50000000,  64     ; 64 MB DRAM
        DCD     0x80000000, 0x50000000,  128     ; 128 MB DRAM
DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢


不连续的内存是要通过你这种方式进行回报给os
但是你的OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)实现时有问题的,之前我这边用过


请问一下这个函数该怎么实现呢,谢谢

#15


引用 10 楼 gooogleman 的回复:
引用 6 楼 so927 的回复:
g_oalAddressTable

    ; mDDR 128 MB
        ;DCD    0x80000000, 0x50000000,  64    ; 64 MB DRAM
        DCD    0x80000000, 0x50000000,  128    ; 128 MB DRAM
       DCD 0x88000000, 0x58000000,  128      ; 128 MB Ext

红色部分是我在oemaddrtab_cfg.inc中添加的一句,然后在OAL\oal\init.c中添加了一个函数如下:
C/C++ codeBOOL OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{*pMemoryStart=0x88000000;*pMemoryLength=0x08000000;
    OALMSG(TRUE, (L"[OAL] OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)\r\n"));return TRUE;
}


系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢

谢谢


不是在这里添加的。这里都没有链接这里,在platform Common的目录里



googleman,您是指什么不是添加再这里呢,是oalAddressTable,还是OEMGetExtensionDRAM 函数

#16


OEMGetExtensionDRAM 是微软提供的接口的了,在platform下的Common下面。

#17


OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)的声明和实现都有问题
它的第一个参数其实是一个数组的指针,数据的每个元素是一个section结构体,结构体中指出来了你声明的内存的起始位置,长度和属性信息
另外,最大支持16个section(记不太清楚了)
kernel下代码进行memory代码初始化的会去以指针的方式引用该函数,你看一下就明白了

#18


楼上说的有道理,先试试再说

#19


PLATFORM\COMMON\SRC\COMMON\OTHER\memory.c
中有
BOOL OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)
{
    return FALSE;
}
没有代码,直接返回了FALSE

我在PLATFORM\DEVICEEMULATOR\SRC\OAL\OALLIB\init.c中找到了一个此函数的实现代码
BOOL 
OEMGetExtensionDRAM(
    LPDWORD lpMemStart, 
    LPDWORD lpMemLen
    ) 
{
    typedef volatile unsigned long MegOfExtendedRam_t[1024 * 1024 / sizeof (unsigned long)];
    MegOfExtendedRam_t *MegsOfRam = (MegOfExtendedRam_t *)EXTENDED_RAM_BASE;
    DWORD each_meg;
    const DWORD dwPageSize = 4096; // PAGE_SIZE in ceddk isn't valid until later in boot

    OALMSG(OAL_FUNC, (L"++OEMGetExtensionDRAM\r\n"));

    // Employ a simple memory test to see that all N meg's are there.
    // NB: Because an empty memory bus can "float" data for several
    // cycles and appear as valid memory, discharge the bus before
    // verifying the data.
    //
    // The probe is nondestructive, to allow the contents of extension
    // RAM to be preserved across soft resets
    try {
        for (each_meg = 0; each_meg < EXTENDED_RAM_MEGS; ++each_meg)
        {
            unsigned long temp0 = MegsOfRam[each_meg][0];
            unsigned long temp1 = MegsOfRam[each_meg][1];

            MegsOfRam[each_meg][0] = 0x55555555UL; // Write pattern
            MegsOfRam[each_meg][1] = ~0x55555555UL; // Discharge
            if (MegsOfRam[each_meg][0] != 0x55555555UL) // Verify patern
                break;
            MegsOfRam[each_meg][0] = ~0x55555555UL; // Write pattern-not
            MegsOfRam[each_meg][1] = 0x55555555UL; // Discharge
            if (MegsOfRam[each_meg][0] != ~0x55555555UL)
                break;

            MegsOfRam[each_meg][0] = temp0;
            MegsOfRam[each_meg][1] = temp1;
        }
    } except (EXCEPTION_EXECUTE_HANDLER) {
        OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));
        return FALSE; // no extension DRAM
    }

    *lpMemStart = EXTENDED_RAM_BASE;
    *lpMemLen = each_meg * sizeof (MegOfExtendedRam_t);
    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: found 0x%08x bytes of ram at 0x%08x\r\n",
        *lpMemLen, *lpMemStart));

    // adjust by RAM FMD amount
    if(g_dwExtensionRAMFMDSize != 0) {
        if((g_dwExtensionRAMFMDSize & (dwPageSize - 1)) != 0) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: g_dwExtensionRAMFMDSize 0x%08x not a multiple of %u\r\n",
                g_dwExtensionRAMFMDSize, dwPageSize));
        } else if(*lpMemLen < g_dwExtensionRAMFMDSize) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: 0x%08x bytes of extension ram not enough to satisfy FMD request for 0x%0x bytes\r\n",
                *lpMemLen, g_dwExtensionRAMFMDSize));
        } else {
            g_pvExtensionRAMFMDBaseAddr = (PVOID) EXTENDED_RAM_BASE;
            *lpMemStart = EXTENDED_RAM_BASE + g_dwExtensionRAMFMDSize;
            *lpMemLen -= g_dwExtensionRAMFMDSize;
                OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: reserving 0x%08x bytes of ram at 0x%08x for RAMFMD\r\n",
                    g_dwExtensionRAMFMDSize, g_pvExtensionRAMFMDBaseAddr));
        }
    }

    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: returning 0x%08x bytes of ram at 0x%08x\r\n",
        *lpMemLen, *lpMemStart));

    OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));

    return TRUE;
}


有点搞不明白了

#20


“guopeixin”

能把您的代码贴一下吗,谢谢

#21


引用 19 楼 so927 的回复:
PLATFORM\COMMON\SRC\COMMON\OTHER\memory.c
 中有
 BOOL OEMGetExtensionDRAM(LPDWORD pMemoryStart, LPDWORD pMemoryLength)
 {
     return FALSE;
 }
 没有代码,直接返回了FALSE

 我在PLATFORM\DEVICEEMULATOR\SRC\OAL\OALLIB\init.c中找到了一个此函数的实现代码
C/C++ codeBOOL 
OEMGetExtensionDRAM(
    LPDWORD lpMemStart, 
    LPDWORD lpMemLen
    ) 
{
    typedefvolatile unsignedlong MegOfExtendedRam_t[1024*1024/sizeof (unsignedlong)];
    MegOfExtendedRam_t*MegsOfRam= (MegOfExtendedRam_t*)EXTENDED_RAM_BASE;
    DWORD each_meg;const DWORD dwPageSize=4096;// PAGE_SIZE in ceddk isn't valid until later in boot
    OALMSG(OAL_FUNC, (L"++OEMGetExtensionDRAM\r\n"));// Employ a simple memory test to see that all N meg's are there.// NB: Because an empty memory bus can "float" data for several// cycles and appear as valid memory, discharge the bus before// verifying the data.//// The probe is nondestructive, to allow the contents of extension// RAM to be preserved across soft resetstry {for (each_meg=0; each_meg< EXTENDED_RAM_MEGS;++each_meg)
        {
            unsignedlong temp0= MegsOfRam[each_meg][0];
            unsignedlong temp1= MegsOfRam[each_meg][1];

            MegsOfRam[each_meg][0]=0x55555555UL;// Write pattern            MegsOfRam[each_meg][1]=~0x55555555UL;// Dischargeif (MegsOfRam[each_meg][0]!=0x55555555UL)// Verify paternbreak;
            MegsOfRam[each_meg][0]=~0x55555555UL;// Write pattern-not            MegsOfRam[each_meg][1]=0x55555555UL;// Dischargeif (MegsOfRam[each_meg][0]!=~0x55555555UL)break;

            MegsOfRam[each_meg][0]= temp0;
            MegsOfRam[each_meg][1]= temp1;
        }
    } except (EXCEPTION_EXECUTE_HANDLER) {
        OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));return FALSE;// no extension DRAM    }*lpMemStart= EXTENDED_RAM_BASE;*lpMemLen= each_meg*sizeof (MegOfExtendedRam_t);
    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: found 0x%08x bytes of ram at 0x%08x\r\n",*lpMemLen,*lpMemStart));// adjust by RAM FMD amountif(g_dwExtensionRAMFMDSize!=0) {if((g_dwExtensionRAMFMDSize& (dwPageSize-1))!=0) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: g_dwExtensionRAMFMDSize 0x%08x not a multiple of %u\r\n",
                g_dwExtensionRAMFMDSize, dwPageSize));
        }elseif(*lpMemLen< g_dwExtensionRAMFMDSize) {
            OALMSG(OAL_LOG_WARN, 
                (L"OEMGetExtensionDRAM: 0x%08x bytes of extension ram not enough to satisfy FMD request for 0x%0x bytes\r\n",*lpMemLen, g_dwExtensionRAMFMDSize));
        }else {
            g_pvExtensionRAMFMDBaseAddr= (PVOID) EXTENDED_RAM_BASE;*lpMemStart= EXTENDED_RAM_BASE+ g_dwExtensionRAMFMDSize;*lpMemLen-= g_dwExtensionRAMFMDSize;
                OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: reserving 0x%08x bytes of ram at 0x%08x for RAMFMD\r\n",
                    g_dwExtensionRAMFMDSize, g_pvExtensionRAMFMDBaseAddr));
        }
    }

    OALMSG(OAL_LOG_INFO, (L"OEMGetExtensionDRAM: returning 0x%08x bytes of ram at 0x%08x\r\n",*lpMemLen,*lpMemStart));

    OALMSG(OAL_FUNC, (L"--OEMGetExtensionDRAM\r\n"));return TRUE;
}

 有点搞不明白了

呵呵,不用迷惑,你先不用管那么多,知道最终调用的不是common csp下的,而是bsp下的就行了,呵呵

#22


引用 20 楼 so927 的回复:
“guopeixin”

 能把您的代码贴一下吗,谢谢

待会我找一下发给你

#23



static DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections,DWORD cMemSections)
{
    DWORD cSections = 0;
    if (cSections < cMemSections)
    {
        pMemSections[cSections].dwFlags = 0;
        pMemSections[cSections].dwStart = 0x88201000;
        pMemSections[cSections].dwLen = 0x03DFF000;
        cSections++;
    }
    return cSections;
}

#24


OEMEnumExtensionDRAM

OEMGetExtensionDRAM
好像有点不一样哦???

#25


引用 24 楼 so927 的回复:
OEMEnumExtensionDRAM

OEMGetExtensionDRAM
好像有点不一样哦???

是不一样呀,没有说让实现OEMGetExtensionDRAM呀,呵呵

#26


引用 23 楼 guopeixin 的回复:
static DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections,DWORD cMemSections)
{
    DWORD cSections = 0;
    if (cSections < cMemSections)
    {
        pMemSections[cSections].dwFlags = 0;
        pMemSections[cSections].dwStart = 0x88201000;
        pMemSections[cSections].dwLen = 0x03DFF000;
        cSections++;
    }
    return cSections;
}


我按照您说的写了这个函数,但是开机的时候发现根本没有调用啊

是wince6.0下的吗???

#27


引用 26 楼 so927 的回复:
引用 23 楼 guopeixin 的回复:
static DWORD OEMEnumExtensionDRAM(PMEMORY_SECTION pMemSections,DWORD cMemSections)
{
    DWORD cSections = 0;
    if (cSections < cMemSections)
    {
        pMemSections[cSections].dwFlags = 0;
        pMemSections[cSections].dwStart = 0x88201000;
        pMemSections[cSections].dwLen = 0x03DFF000;
        cSections++;
    }
    return cSections;
}


我按照您说的写了这个函数,但是开机的时候发现根本没有调用啊

是wince6.0下的吗???

需要把这个函数地址赋值给global中的函数指针才行

#28


我按照说明,实现了OEMEnumExtensionDRAM函数,加入调试信息,启动时显示调用了此函数,
在loader.c中
if (g_pOemGlobal->pfnEnumExtensionDRAM) {
            cExtSections = (*g_pOemGlobal->pfnEnumExtensionDRAM)(MemSections, MAX_MEMORY_SECTIONS - 1);
            DEBUGCHK(cExtSections < MAX_MEMORY_SECTIONS);
        } else if (OEMGetExtensionDRAM (&MemSections[0].dwStart, &MemSections[0].dwLen)) {
            cExtSections = 1;
        } else {
            cExtSections = 0;
        }


我发现OEMEnumExtensionDRAM和OEMGetExtensionDRAM都可以使用的,前者最多可列举出16段不连续内存。
而后者只能列举一个。

两个我都使用了一次,试验了一下,运行到这一步之后,系统就不动了,死了。

请问这个又是怎么回事呢??


谢谢

#29


引用 28 楼 so927 的回复:
我按照说明,实现了OEMEnumExtensionDRAM函数,加入调试信息,启动时显示调用了此函数,
在loader.c中
C/C++ codeif (g_pOemGlobal->pfnEnumExtensionDRAM) {
            cExtSections= (*g_pOemGlobal->pfnEnumExtensionDRAM)(MemSections, MAX_MEMORY_SECTIONS-1);
            DEBUGCHK(cExtSections< MAX_MEMORY_SECTIONS);
        }elseif (OEMGetExtensionDRAM (&MemSections[0].dwStart,&MemSections[0].dwLen)) {
            cExtSections=1;
        }else {
            cExtSections=0;
        }

我发现OEMEnumExtensionDRAM和OEMGetExtensionDRAM都可以使用的,前者最多可列举出16段不连续内存。
而后者只能列举一个。

两个我都使用了一次,试验了一下,运行到这一步之后,系统就不动了,死了。

请问这个又是怎么回事呢??


谢谢

能不能把你的代码粘贴出来一份?

#30


楼主你的bootloader修改了吗?

光修改这些是不够的。

#31


eboot已经修改了
但是steploader还没有改,因为我编译出来的steploader运行不了。

#32


做个标记。嘿嘿……

#33


引用 30 楼 gooogleman 的回复:
楼主你的bootloader修改了吗?

光修改这些是不够的。


bootloader有两个,eboot修改并运行良好
steploader我编译出来运行不了,没有办法

在inc中更改了寄存器的设置。

SMDK6410\SRC\BOOTLOADER\EBOOT\startup.s文件中有一句不明白是干什么的,也涉及到大小。
; Comment:
        ; The following loop is to direct map RAM VA == PA. i.e.
        ;   VA == 0x50XXXXXX => PA == 0x50XXXXXX for S3C6410
        ; Fill in 8 entries to have a direct mapping for DRAM

        ldr          r10, =PT_1ST_BASE          ; Restore address of 1st level page table
        ldr          r0,  =DRAM_BASE_PA_START

        add          r10, r10, #PTR_1ST_PTE     ; (r10) = ptr to 1st PTE for 0x50000000

        add          r0, r0, #0x1E               ; 1MB cachable bufferable
        orr          r0, r0, #0x400          ; set kernel r/w permission
        mov          r1, #0
;       mov          r3, #64                     ; 64MB DRAM
       mov          r3, #128                    ; 128MB DRAM
;       mov          r3, #256                    ; 256MB DRAM


请各位指点一下

#34


引用 33 楼 so927 的回复:
引用 30 楼 gooogleman 的回复:
 楼主你的bootloader修改了吗?

 光修改这些是不够的。


 bootloader有两个,eboot修改并运行良好
 steploader我编译出来运行不了,没有办法

 在inc中更改了寄存器的设置。

 SMDK6410\SRC\BOOTLOADER\EBOOT\startup.s文件中有一句不明白是干什么的,也涉及到大小。
Assembly code; Comment:; The following loop is to direct map RAM VA == PA. i.e.;   VA == 0x50XXXXXX => PA == 0x50XXXXXX for S3C6410; Fill in 8 entries to have a direct mapping for DRAM
        ldr          r10, =PT_1ST_BASE; Restore address of 1st level page table        ldr          r0,  =DRAM_BASE_PA_STARTadd          r10, r10, #PTR_1ST_PTE; (r10) = ptr to 1st PTE for 0x50000000add          r0, r0, #0x1E; 1MB cachable bufferable        orr          r0, r0, #0x400; set kernel r/w permissionmov          r1, #0;       mov          r3, #64                     ; 64MB DRAMmov          r3, #128; 128MB DRAM
;       mov          r3, #256                    ; 256MB DRAM

 请各位指点一下

是指这个吧,这个是建立mmu pts映射表用的,这个地方错误也无所谓,因为os初始化的时候ms会重新搞一下
好像我的blog有一篇说这个东西,既不清楚了,你看看吧

#35


还是有点问题

不知道怎么才能解决呢!
该改的地方都改了!
肯定是那儿没有改对,郁闷啊。

#36


Come On EveryBody

#37


好贴,继续关注,

虚席ing...

呼吁高手都出来解决啊!

#38


强烈要求这个贴 推荐

#39


1、在image_cfg.h中有:// DRAM Base Address
#define DRAM_BASE_PA_START            (0x50000000)
#define DRAM_BASE_CA_START            (0x80000000)
#define DRAM_BASE_UA_START            (0xA0000000)
#define DRAM_SIZE                     (0x08000000) ;//128M


2、在image_cfg.h中有:;// DRAM Base Address
DRAM_BASE_PA_START      EQU     (0x50000000)
DRAM_BASE_CA_START      EQU     (0x80000000)
DRAM_BASE_UA_START      EQU     (0xA0000000)
DRAM_SIZE               EQU     (0x08000000) ;//128M

很久没搞6410了,都不记得了,
好像6410要支持356的内存,跟硬件叶有关系。

#40


硬件寄存器也要初始化为256M的
首先要保证内存全部可以访问

#41


引用 40 楼 so927 的回复:
硬件寄存器也要初始化为256M的
首先要保证内存全部可以访问


LZ搞定了?GX!

#42


搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。

#43


引用 42 楼 so927 的回复:
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。



在STEPLOADER里面设置就够了?那系统(NK)怎么知道当前内存是多大的?STEPLOADER里面的设置怎么通知NK?

#44


引用 42 楼 so927 的回复:
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。

哇,就是hw初始化不对了,那eboot下的ram测试怎么会通过呢?

#45


我用PXA300扩展2片SDRAM 64M的,不痛啊,郁闷中。。。

#46


引用 42 楼 so927 的回复:
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的

郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。

原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。




能否把经验分享一下?或者总结一下修改的地方。

Best Regards!

#47


mark

#48


受教了,标记一下

#49


mark

#50


收益多多!