更换内存容量和挂载bank需要修改的地方——Starting kernel ... Uncompressing Linux...的另外一种可能
2015-05-15 17:23
375 查看
很久没有写一篇比较完整的技术文章,今天刚好遇到一个问题,解决了感触比较大:这个问题明明是我以前遇到过的,但是我却记不得,我还一筹莫展,没意识到问题所在,只怪我当时没有写当时的解决办法,一年后在写出来亡羊补牢也不迟。
问题是这样的:我们自己做的电路板,在wince 下没有任何问题,但是在Android下的时候,偶尔会提示inand 存储错误,当时我认为有两种可能性:
1、自己画的电路板不行,虽然wince 下OK,但是Android对硬件稳定性要求更高,所以只能从硬件上找原因
2、kernel或者Android层的问题,因为uboot运行状态不错,应该是上层驱动的问题
正好有空,那就先验证 问题2的可能性:我找了一个在开发板上运行良好的kernel和Android包在上面运行试试。结果很不爽,居然内核还没起来系统就死了,打印最后的信息是:
Starting kernel ...
Uncompressing Linux...
后来百度原因,无非是:
1>
U-boot中的参数(console)没有传到内核。
2> U-boot的时钟设置与Kernel的不一致。
3> U-boot中的Machine ID设置的与Kernel不一致。
仔细检查者三项,都不存在问题,到底是怎么回事呢?因为我只是换成我的uboot而已,那么我就和比较开发板的uboot 比较一下,比较吓一跳,突然记起来我板子的内存挂载的bank和开发板的有点区别,通道是不一样的..............很让人伤心的就是我以前1GB修改的512MB的时候就改过这个部分,我居然忘记这点要素,于是修改如下:
1.uboot中修改 board\samsung\smdkc110\lowlevel_init.S
.set __base,0x200 ==>> .set __base,0x400
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
2.uboot中 board/samsung/smdkc110/smdkc110.c
的ulong virt_to_phy_smdkc110(ulong addr)函数根据自己内存实际挂载地址来修改
3.uboot中3. include\configs\smdkv210single.h
内存控制器以及内存bank 大小等参数设置也根据实际情况来修改
4.内核中的修改
arch/arm/mach-s5pv210/include/mach/map.h
#define S5P_PA_SDRAM S5PV210_PA_SDRAM
#define S5PV210_PA_SDRAM (0x40000000)
arch/arm/mach-s5pv210/include/mach/memory.h
#define PHYS_OFFSET UL(0x40000000)
arch/arm/mach-s5pv210/Makefile.boot
zreladdr-y := 0x40008000
params_phys-y := 0x40000100
大概情况就是这样,上面的数值,可以根据硬件的接法来修改,改完后重新编译出的zImage就可以顺利启动了,到了Android也没任何异常,顺利完工。在这了做一个总结:
Starting kernel ...
Uncompressing Linux...
原因,除了:
1>
U-boot中的参数(console)没有传到内核。
2> U-boot的时钟设置与Kernel的不一致。
3> U-boot中的Machine ID设置的与Kernel不一致。
还应该增加一种可能性:
4>
内核中的内存设置和u-boot不一致导致无法启动内核
问题是这样的:我们自己做的电路板,在wince 下没有任何问题,但是在Android下的时候,偶尔会提示inand 存储错误,当时我认为有两种可能性:
1、自己画的电路板不行,虽然wince 下OK,但是Android对硬件稳定性要求更高,所以只能从硬件上找原因
2、kernel或者Android层的问题,因为uboot运行状态不错,应该是上层驱动的问题
正好有空,那就先验证 问题2的可能性:我找了一个在开发板上运行良好的kernel和Android包在上面运行试试。结果很不爽,居然内核还没起来系统就死了,打印最后的信息是:
Starting kernel ...
Uncompressing Linux...
后来百度原因,无非是:
1>
U-boot中的参数(console)没有传到内核。
2> U-boot的时钟设置与Kernel的不一致。
3> U-boot中的Machine ID设置的与Kernel不一致。
仔细检查者三项,都不存在问题,到底是怎么回事呢?因为我只是换成我的uboot而已,那么我就和比较开发板的uboot 比较一下,比较吓一跳,突然记起来我板子的内存挂载的bank和开发板的有点区别,通道是不一样的..............很让人伤心的就是我以前1GB修改的512MB的时候就改过这个部分,我居然忘记这点要素,于是修改如下:
1.uboot中修改 board\samsung\smdkc110\lowlevel_init.S
.set __base,0x200 ==>> .set __base,0x400
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
2.uboot中 board/samsung/smdkc110/smdkc110.c
的ulong virt_to_phy_smdkc110(ulong addr)函数根据自己内存实际挂载地址来修改
3.uboot中3. include\configs\smdkv210single.h
内存控制器以及内存bank 大小等参数设置也根据实际情况来修改
4.内核中的修改
arch/arm/mach-s5pv210/include/mach/map.h
#define S5P_PA_SDRAM S5PV210_PA_SDRAM
#define S5PV210_PA_SDRAM (0x40000000)
arch/arm/mach-s5pv210/include/mach/memory.h
#define PHYS_OFFSET UL(0x40000000)
arch/arm/mach-s5pv210/Makefile.boot
zreladdr-y := 0x40008000
params_phys-y := 0x40000100
大概情况就是这样,上面的数值,可以根据硬件的接法来修改,改完后重新编译出的zImage就可以顺利启动了,到了Android也没任何异常,顺利完工。在这了做一个总结:
Starting kernel ...
Uncompressing Linux...
原因,除了:
1>
U-boot中的参数(console)没有传到内核。
2> U-boot的时钟设置与Kernel的不一致。
3> U-boot中的Machine ID设置的与Kernel不一致。
还应该增加一种可能性:
4>
内核中的内存设置和u-boot不一致导致无法启动内核
相关文章推荐
- STM32——同程序更换芯片时,需要修改的地方
- 从windows修改文件,拖到linux上,注意时间,可能需要touch一下保证可编译!
- linux shell 发送email 邮件【文章内容仅供参考,有些地方可能不正确,默认只能在局域网,公网需要修改配置文件】
- Linux 下mysql修改数据库存放目录方法和可能遇到的问题
- 实用技巧:修改Linux系统分区后挂载问题
- repeater 的另外一种用法,不一定需要在databound加载事件
- Shiro 用户认证个性化修改: 如果AuthenticationToken的元素不满足实际情况,列入登陆的时候需要有学校id或者 其他参数,这时需要进行扩展,主要修改的地方有以下:
- 移动tomcat之后总共需要修改的三个地方
- Phpcms V9网站从本地上传到服务器需要修改的地方
- linux下双网卡接收组播需要修改的参数
- linux修改硬盘已挂载目录
- 安装 Laravel 出问题了?你可能需要修改 composer.json 文件
- Linux修改系统后立即重起可能出现的问题
- Linux修改挂载目录名称
- IAR旧版本的工程在新版本上运行时,需要修改的地方
- moss中修改master页需要注意的地方
- android : 修改frameworks/base/ 代码需要注意的地方
- mysql配置文件需要修改两个地方(编码)
- 不依赖增长的治理:探寻发展的另外一种可能
- 本地的mysql连接虚拟机中Linux中的MySQL需要注意的地方(权限问题)