阅读:3386回复:19
关于CE的NK.bin的一个疑问
各位大虾的一直以来对小弟的帮助,小弟感激不尽,在此衷心感谢.但是目前遇到了一个困惑的问题,就是S3C2410下面Nk.bin最大能做到多大.就我目前的试验有如下结果,希望大家给指个路,我要想做36M的NK.bin应该怎么办?
我用三星的SMDK试验中(Nand Flash64M+ SDRAM 64M配置,在config.bib中已经改变了NK=48M,RAM=16M,AUTOSIZE,ROMSIZE=48M),一般正常使用的NK(保留Eboot空间,NK从Nandflash第10个block开始)都在20M左右,没有问题,当组件变多,达到27.9M-28.7M时候,download NK就勉强能下到RAM里去,如果这个时候也选中了写入Bootmedia,也能写进去,但是重启系统就会在一个地方卡住启动不了了.怎样重起都起不来.我怀疑把系统的什么内容给重叠了.(好象是网卡的io空间) 当组件继续变多,NK达到28.7M以上时候,连NK也写不进去了,写到28.7M旧会死掉.同时这个时候发现NK.nb0变成了29.0M和NK.nb1的出现.(这似乎说明ROMSIZE没有发生变化仍是32M) CE系统默认的是Nk和RAM各占32M的空间,而RAM里系统和应用程序又各占16M,我想问,这个是能改的吗?在哪里改?Eboot是不是也需要修改?Nand Flash也是一样,我想让系统占48M,留下resident flash 16M可以么,怎么改呢,目前好困惑~~~ wxl,wwei_wang,joyfly等大虾请支招啊 |
|
最新喜欢:thinke... |
论坛版主
|
沙发#
发布于:2005-04-14 13:44
首先,出现nk.nb1说明你的os image实际大小超过了romsize的值,你指定的romsize=48M?如果这样的话不应该超过的啊。
第二,“CE系统默认的是Nk和RAM各占32M的空间” 有这个默认?没有喔:))你可以把nk设大些,设autosize=on,这样系统在初始化的时候会自动帮你调整,不会浪费ram。 你要看看eboot烧写代码部分,看看是不是有什么和配置不匹配的地方,主要看关于flash的oemXXXX函数。 free的ram空间被ram file system和program共享,调整fsrampercent可以改变比例 |
|
板凳#
发布于:2005-04-27 18:16
我对Eboot的配置进行了修改也无济于事,依然写不进去,在RAM里写不全(还没到flash那地步),我一共修改了config.bib,loader.h,boot.bib三个文件的配置,但是PB编译出来是没问题的,NK.bin 29.1M,NK.nb0 45.0M,没有NK.nb1了.但是仍然不能全写.我感觉问题还是在Eboot可是不知道该怎么改了.
请大狭们指路哈~~ |
|
论坛版主
|
地板#
发布于:2005-04-28 13:21
下载的时候使用的是NK.BIN,不是NK.NB0喔,BOOTLOADER会自动解析NK.BIN的数据块,并根据每块的数据的头部信息定位写入目标系统内存中的相应位置。如果生成了正确的NK.BIN还不对,你可以看看你的OEMMapMemAddr函数是否正确,对了,你在生成os image的时候,先在config.bib里面把地址指定到ram区,就是那个romstart。
|
|
地下室#
发布于:2005-05-08 13:09
下载进去的的确是NK.bin但是我检查了OEMMapMemAddr函数好象没有错误哦~~,另外什么叫\"在生成os image的时候,先在config.bib里面把地址指定到ram区,就是那个romstart\"呢,请大哥明示一下子.
我的config.bib如下: #define NKNAME NK ; NK Start address #define NKSTART 8C200000 #define NKLEN 02D00000 #define RAMSTART 8F000000 #define RAMLEN 00F00000 ; Common RAM areas ......略 CONFIG COMPRESSION=ON KERNELFIXUPS=ON AUTOSIZE=ON IF IMGPROFILER PROFILE=ON ENDIF IF IMGPROFILER ! PROFILE=OFF ENDIF ROMFLAGS=0 ROMSTART=$(NKSTART) ROMWIDTH=32 ROMSIZE=$(NKLEN) 在loader.h文件里面的相关定义如下: // Flash Cache area defined in boot.bib #define FLASH_CACHE 0x8D000000UL #define FLASH_CACHE_SIZE 0x02000000UL // BinFS work area defined in boot.bib #define BINFS_RAM_START (0x8c021000 | CACHED_TO_UNCACHED_OFFSET) // uncached #define BINFS_RAM_LENGTH 0x5000 // Nk Memory reigions defined in config.bib... // #define ROM_RAMIMAGE_START 0x8C200000 #define ROM_RAMIMAGE_SIZE 0x02D00000 // Start addresses must match config.bib\'s RAMIMAGE #define RAM_START 0x8F000000 #define RAM_SIZE 0x00F00000 #define DEFAULT_LAUNCHADDR ROM_RAMIMAGE_START // SDRAM #define SDRAM_BASE 0x8C000000// defined in OEMAddressTable #define SDRAM_SIZE 0x04000000//64 MB 看看有什么问题吗?应该是对的啊~~ |
|
论坛版主
|
5楼#
发布于:2005-05-09 14:06
你的
#define FLASH_CACHE 0x8D000000UL #define FLASH_CACHE_SIZE 0x02000000UL 怎么用的? 你现在是边下载边烧flash?你先不要烧,直接下,然后运行,把你的romstart设为nkstart,然后在编译kern.exe时在sources里面指定exebase=nkstart |
|
6楼#
发布于:2005-05-09 14:44
不是的,从串口的显示来看是先下载到RAM完了之后再一总写到flash里的.现在是写到RAM里都写不完,然后是PB报了一个什么配置不对,在串口上没有任何错误信息,所以就是难判断什么问题了啊~~
|
|
论坛版主
|
7楼#
发布于:2005-05-09 16:22
那就是你没用系统提供的flash相关的oem函数了,不过这个不要紧。下载不完就还没有执行三,肯定没输出了。
喔,对了,你看看这个: #define FLASH_CACHE 0x8D000000UL #define FLASH_CACHE_SIZE 0x02000000UL #define ROM_RAMIMAGE_START 0x8C200000 #define ROM_RAMIMAGE_SIZE 0x02D00000 你的FLASH_CACHE_SIZE只有32M,但是你的image有35M喔,把你的FLASH_CACHE_SIZE 改大些 |
|
8楼#
发布于:2005-05-09 20:27
对,还没有到该写入flash的那一步.现在只是写到RAM里去.
大哥我已经照改了,还是不行,没有任何的变化.我的cachesize已经改成0x02D0000UL了 |
|
论坛版主
|
9楼#
发布于:2005-05-10 15:00
对了,你用PB下的啊,那你在环境变量里面设那个什么64M RAM没有?你试试,我忘了名字了:(
|
|
10楼#
发布于:2005-05-10 16:14
是IMGRAM64但是环境不让我添加这个变量.不知道为什么.
他提示说,the variable IMGRAM64 is a build option variable,the checkbox, \"Eable Image Larger than 32MB\",that controls that variable is located on the Build Options table.然后就只能点取消.是怎么回事? |
|
论坛版主
|
11楼#
发布于:2005-05-10 16:29
那你把那个CHECKBOX钩上试试呢
|
|
12楼#
发布于:2005-05-10 16:35
而且我已经允许了Larger than 32MB这个选项.没有任何改观.
现在的问题很是恼人啊,一直都得不到好的解决.究竟是什么原因呢. 我把这里的一些问题说一下,看看对不对,同时也供大家借鉴一下. 我的问题遇到的有: ROMstart 决定NK的开始位置 ROMLen 决定NK的长度(大小),也即生成NK.nb0的大小 RAMStart 决定系统RAM的开始位置,通常位于连结于NK之后的位置 RAMLen 决定系统RAM的长度(大小) 这个Len决定了以后系统内存和应用程序内存的总和(然后再对半分给二者) FLASH_CACHE 决定了flash缓存的开始位置,我的理解这个位置没有什么特殊要求,只要在Eboot之后就可以了吧 FLASH_CACHE_SIZE 决定flash缓寸长度,大小上应该等于NKLen长度 COMPRESSION 决定NK.bin是最小压缩版还是和NK.nb0一样大 ROMWIDTH 决定ROM数据宽度 AUTOSIZE 自动调整ROM和RAM的大小(但是看上去没有起作用啊) 请wxl_50685330大哥指正一下. [编辑 - 5/10/05 by zouyingmyfriend] |
|
13楼#
发布于:2005-05-10 16:48
wxl大哥,你以前有没有碰到过这种情况?
都应该改还有哪些地方呢,感觉上好象还有什么地方的设置不对似的. 我改过了config.bib boot.bib loader.h这么几个地方如前面所贴.看样子好象和RAM的设置有关.但是改动RAMLEN又没有改变. 怎么办是好? |
|
论坛版主
|
14楼#
发布于:2005-05-10 17:54
基本是了,不过AUTOSIZE有用喔:))当你的NK.NB0后面有空闲的话CE会把它还给SYSTEM RAM,不会浪费,这很好。
你这样吧,看看你的FLASH相关代码,看看关于下载的OS IMAGE大小的处理,会不会是代码里面定死了不能超过32M啊,你原来写的FLASH CACHE就是32M。你说你的FLASH烧写是下载完后一次进行的,仔细看看源代码,下载过程应该是没有问题的,对了,再看看OEMMapMemAddr这个理面对地址的判断,是不是覆盖了64M。 |
|
15楼#
发布于:2005-05-10 18:31
LPBYTE OEMMapMemAddr( DWORD dwImageStart, DWORD dwAddr )
{ //EdbgOutputDebugString(\"OEMMapMemAddr: 0x%x, 0x%x, \", dwImageStart, dwAddr); if ( g_ImageType & IMAGE_TYPE_MXIP ) { DWORD i, Length=0; // we don\'t know the segments length, so parse our BIN table for the length for ( i = 0; i < g_BINRegionInfo.dwNumRegions; i++ ) { if ( (dwAddr >= g_BINRegionInfo.Region.dwRegionStart) && (dwAddr < g_BINRegionInfo.Region.dwRegionStart + g_BINRegionInfo.Region.dwRegionLength) ) { dwAddr = (dwAddr - g_BINRegionInfo.Region.dwRegionStart) + FLASH_CACHE + Length; break; } // bump length Length += g_BINRegionInfo.Region.dwRegionLength; } } //EdbgOutputDebugString(\"0x%x \\r\\n\", dwAddr); return (LPBYTE)dwAddr; } 没有问题吧?? |
|
论坛版主
|
16楼#
发布于:2005-05-11 14:53
嗯,没什么问题。
对了,你的NK.BIN分REGION了?分REGION会对NK.BIN的RECORD有影响吗?要不你把函数里面的地址值打印出来,跟踪一下下载过程呢 |
|
17楼#
发布于:2005-05-12 15:28
郁闷啊郁闷~~~
|
|
18楼#
发布于:2005-05-12 15:32
看样子根本就是PB的问题啊~~
[编辑 - 5/12/05 by zouyingmyfriend] |
|
论坛版主
|
19楼#
发布于:2005-05-12 16:12
你打开OEMMapMemAddr那个函数的调试跟踪了吗?你看看每个RECORD的起始地址和长度都是不是对的,到下载后期特别注意看看调试信息。我不知道分REGION的NK.BIN有没有什么特别的。
最后也还是试试重装一个PB吧:))对了,如果实在不行你可以去找BLCOMM的源代码,在PRIVATE里有,重编译这个库加调试看看下载后期的函数什么地方出问题了 |
|