77

帖子

0

TA的资源

一粒金砂(初级)

21
 
“guopeixin”

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

回复

57

帖子

0

TA的资源

一粒金砂(初级)

22
 
引用 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下的就行了,呵呵
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

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

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

待会我找一下发给你
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

24
 

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;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

25
 
OEMEnumExtensionDRAM

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

回复

82

帖子

0

TA的资源

一粒金砂(初级)

26
 
引用 24 楼 so927 的回复:
OEMEnumExtensionDRAM

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

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

回复

81

帖子

0

TA的资源

一粒金砂(初级)

27
 
引用 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下的吗???
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

28
 
引用 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中的函数指针才行
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

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


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

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

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


谢谢
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

30
 
引用 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段不连续内存。
而后者只能列举一个。

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

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


谢谢


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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

31
 
楼主你的bootloader修改了吗?

光修改这些是不够的。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

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

回复

74

帖子

0

TA的资源

一粒金砂(初级)

33
 
做个标记。嘿嘿……
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

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

光修改这些是不够的。


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

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

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

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

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

  8.         add          r0, r0, #0x1E               ; 1MB cachable bufferable
  9.         orr          r0, r0, #0x400          ; set kernel r/w permission
  10.         mov          r1, #0
  11. ;       mov          r3, #64                     ; 64MB DRAM
  12.        mov          r3, #128                    ; 128MB DRAM
  13. ;       mov          r3, #256                    ; 256MB DRAM
复制代码


请各位指点一下
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

35
 
引用 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有一篇说这个东西,既不清楚了,你看看吧
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

36
 
还是有点问题

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

回复

64

帖子

0

TA的资源

一粒金砂(中级)

37
 
Come On EveryBody
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

38
 
好贴,继续关注,

虚席ing...

呼吁高手都出来解决啊!
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

39
 
强烈要求这个贴推荐
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

40
 
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的内存,跟硬件叶有关系。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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