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
有区别,有个寄存器叫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中添加了一个函数如下:
系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢
谢谢
; 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文件中有一些宏定义,是否也需要修改呢!
太多了,晕了
bootloader中有一句mov r3, #128 ; 128MB DRAM
不知道是不更改这句呢,
BSP中还需要更改那些呢,config.bib需要修改吗,有人说可以不用修改,利用OEMGetExtensionDRAM 来扩展内存。还有一个imag_cfg.h文件中有一些宏定义,是否也需要修改呢!
太多了,晕了
#8
bootloader能起来了吗?
2440 做过,6410 没有搞过,呵呵。
这东西分为连续和非连续的内存扩展方法。
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的我也没改过
#define _MMUTT_STARTADDRESS (0x31Bf8000)
#define _STACK_BASEADDRESS (0x31Bf8000)
#define HEAPEND (0x31Bf0000)
这些定义看看你的BSP上有没有,也是需要修改的。
config.bib要改一下,“利用OEMGetExtensionDRAM 来扩展内存”不懂,如果你也不懂的话就改config.bib吧。
其它一些内存设置的内容你再研究研究吧,两个BANK的我也没改过
#10
不是在这里添加的。这里都没有链接这里,在platform Common的目录里
#11
不连续的内存是要通过你这种方式进行回报给os
但是你的OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)实现时有问题的,之前我这边用过
#12
bootloader中有一句mov r3, #128 ; 128MB DRAM--》不用改,这个影响不到ce
config.bib和imag_cfg.h都是可改可不改的文件,取决于你程序中是否用到了这部分中的一些定义
#13
对啊,BSP也是要改的
#14
请问一下这个函数该怎么实现呢,谢谢
#15
googleman,您是指什么不是添加再这里呢,是oalAddressTable,还是OEMGetExtensionDRAM 函数
#16
OEMGetExtensionDRAM 是微软提供的接口的了,在platform下的Common下面。
#17
OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)的声明和实现都有问题
它的第一个参数其实是一个数组的指针,数据的每个元素是一个section结构体,结构体中指出来了你声明的内存的起始位置,长度和属性信息
另外,最大支持16个section(记不太清楚了)
kernel下代码进行memory代码初始化的会去以指针的方式引用该函数,你看一下就明白了
它的第一个参数其实是一个数组的指针,数据的每个元素是一个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 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
呵呵,不用迷惑,你先不用管那么多,知道最终调用的不是common csp下的,而是bsp下的就行了,呵呵
#22
待会我找一下发给你
#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
好像有点不一样哦???
和
OEMGetExtensionDRAM
好像有点不一样哦???
#25
是不一样呀,没有说让实现OEMGetExtensionDRAM呀,呵呵
#26
我按照您说的写了这个函数,但是开机的时候发现根本没有调用啊
是wince6.0下的吗???
#27
需要把这个函数地址赋值给global中的函数指针才行
#28
我按照说明,实现了OEMEnumExtensionDRAM函数,加入调试信息,启动时显示调用了此函数,
在loader.c中
我发现OEMEnumExtensionDRAM和OEMGetExtensionDRAM都可以使用的,前者最多可列举出16段不连续内存。
而后者只能列举一个。
两个我都使用了一次,试验了一下,运行到这一步之后,系统就不动了,死了。
请问这个又是怎么回事呢??
谢谢
在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
能不能把你的代码粘贴出来一份?
#30
楼主你的bootloader修改了吗?
光修改这些是不够的。
光修改这些是不够的。
#31
eboot已经修改了
但是steploader还没有改,因为我编译出来的steploader运行不了。
但是steploader还没有改,因为我编译出来的steploader运行不了。
#32
做个标记。嘿嘿……
#33
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
是指这个吧,这个是建立mmu pts映射表用的,这个地方错误也无所谓,因为os初始化的时候ms会重新搞一下
好像我的blog有一篇说这个东西,既不清楚了,你看看吧
#35
还是有点问题
不知道怎么才能解决呢!
该改的地方都改了!
肯定是那儿没有改对,郁闷啊。
不知道怎么才能解决呢!
该改的地方都改了!
肯定是那儿没有改对,郁闷啊。
#36
Come On EveryBody
#37
好贴,继续关注,
虚席ing...
呼吁高手都出来解决啊!
虚席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的内存,跟硬件叶有关系。
#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
LZ搞定了?GX!
#42
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的
郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。
原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的
郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。
原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。
#43
在STEPLOADER里面设置就够了?那系统(NK)怎么知道当前内存是多大的?STEPLOADER里面的设置怎么通知NK?
#44
哇,就是hw初始化不对了,那eboot下的ram测试怎么会通过呢?
#45
我用PXA300扩展2片SDRAM 64M的,不痛啊,郁闷中。。。
#46
能否把经验分享一下?或者总结一下修改的地方。
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
有区别,有个寄存器叫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中添加了一个函数如下:
系统启动的时候我看了一下调试信息,这个函数已经被调用了,但是进入系统后,我查看了一下内存,还是那么大,并没有增加呢
谢谢
; 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文件中有一些宏定义,是否也需要修改呢!
太多了,晕了
bootloader中有一句mov r3, #128 ; 128MB DRAM
不知道是不更改这句呢,
BSP中还需要更改那些呢,config.bib需要修改吗,有人说可以不用修改,利用OEMGetExtensionDRAM 来扩展内存。还有一个imag_cfg.h文件中有一些宏定义,是否也需要修改呢!
太多了,晕了
#8
bootloader能起来了吗?
2440 做过,6410 没有搞过,呵呵。
这东西分为连续和非连续的内存扩展方法。
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的我也没改过
#define _MMUTT_STARTADDRESS (0x31Bf8000)
#define _STACK_BASEADDRESS (0x31Bf8000)
#define HEAPEND (0x31Bf0000)
这些定义看看你的BSP上有没有,也是需要修改的。
config.bib要改一下,“利用OEMGetExtensionDRAM 来扩展内存”不懂,如果你也不懂的话就改config.bib吧。
其它一些内存设置的内容你再研究研究吧,两个BANK的我也没改过
#10
不是在这里添加的。这里都没有链接这里,在platform Common的目录里
#11
不连续的内存是要通过你这种方式进行回报给os
但是你的OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)实现时有问题的,之前我这边用过
#12
bootloader中有一句mov r3, #128 ; 128MB DRAM--》不用改,这个影响不到ce
config.bib和imag_cfg.h都是可改可不改的文件,取决于你程序中是否用到了这部分中的一些定义
#13
对啊,BSP也是要改的
#14
请问一下这个函数该怎么实现呢,谢谢
#15
googleman,您是指什么不是添加再这里呢,是oalAddressTable,还是OEMGetExtensionDRAM 函数
#16
OEMGetExtensionDRAM 是微软提供的接口的了,在platform下的Common下面。
#17
OEMGetExtensionDRAM (LPDWORD pMemoryStart, LPDWORD pMemoryLength)的声明和实现都有问题
它的第一个参数其实是一个数组的指针,数据的每个元素是一个section结构体,结构体中指出来了你声明的内存的起始位置,长度和属性信息
另外,最大支持16个section(记不太清楚了)
kernel下代码进行memory代码初始化的会去以指针的方式引用该函数,你看一下就明白了
它的第一个参数其实是一个数组的指针,数据的每个元素是一个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 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
呵呵,不用迷惑,你先不用管那么多,知道最终调用的不是common csp下的,而是bsp下的就行了,呵呵
#22
待会我找一下发给你
#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
好像有点不一样哦???
和
OEMGetExtensionDRAM
好像有点不一样哦???
#25
是不一样呀,没有说让实现OEMGetExtensionDRAM呀,呵呵
#26
我按照您说的写了这个函数,但是开机的时候发现根本没有调用啊
是wince6.0下的吗???
#27
需要把这个函数地址赋值给global中的函数指针才行
#28
我按照说明,实现了OEMEnumExtensionDRAM函数,加入调试信息,启动时显示调用了此函数,
在loader.c中
我发现OEMEnumExtensionDRAM和OEMGetExtensionDRAM都可以使用的,前者最多可列举出16段不连续内存。
而后者只能列举一个。
两个我都使用了一次,试验了一下,运行到这一步之后,系统就不动了,死了。
请问这个又是怎么回事呢??
谢谢
在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
能不能把你的代码粘贴出来一份?
#30
楼主你的bootloader修改了吗?
光修改这些是不够的。
光修改这些是不够的。
#31
eboot已经修改了
但是steploader还没有改,因为我编译出来的steploader运行不了。
但是steploader还没有改,因为我编译出来的steploader运行不了。
#32
做个标记。嘿嘿……
#33
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
是指这个吧,这个是建立mmu pts映射表用的,这个地方错误也无所谓,因为os初始化的时候ms会重新搞一下
好像我的blog有一篇说这个东西,既不清楚了,你看看吧
#35
还是有点问题
不知道怎么才能解决呢!
该改的地方都改了!
肯定是那儿没有改对,郁闷啊。
不知道怎么才能解决呢!
该改的地方都改了!
肯定是那儿没有改对,郁闷啊。
#36
Come On EveryBody
#37
好贴,继续关注,
虚席ing...
呼吁高手都出来解决啊!
虚席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的内存,跟硬件叶有关系。
#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
LZ搞定了?GX!
#42
搞定了,其实早就OK了,只是忽略了一个问题
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的
郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。
原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。
哪就是我编译的steploader不能使用,因此,用的还是以前steploader,是128M的
郁闷啊,我编译的steploader始终不能运行,只有让他们帮我编译一个了,代码一样的,他们编译出来就能运行。
原来wince在steploader之后就不会再初始化内存寄存器了,因此,后面的128M根本就无法使用,还有方法就是在EBOOT或者WINCE中再次初始化内存控制寄存器。
#43
在STEPLOADER里面设置就够了?那系统(NK)怎么知道当前内存是多大的?STEPLOADER里面的设置怎么通知NK?
#44
哇,就是hw初始化不对了,那eboot下的ram测试怎么会通过呢?
#45
我用PXA300扩展2片SDRAM 64M的,不痛啊,郁闷中。。。
#46
能否把经验分享一下?或者总结一下修改的地方。
Best Regards!
#47
mark
#48
受教了,标记一下
#49
mark
#50
收益多多!