主题 : uboot引导tiny210内核始终看不到debug信息(有详细过程,求分析) 复制链接 | 浏览器收藏 | 打印
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
楼主  发表于: 2012-12-24 21:53

 uboot引导tiny210内核始终看不到debug信息(有详细过程,求分析)

硬件环境:
0.usb转串口
1.tiny210sdk,256Mnand,512M内存

host环境:
0.ubuntu12.04 amd64
1.cross toolchain:FriendlyARM/toolschain/4.5.1 Ubuntu/Linaro 4.6.3-1ubuntu5
2.串口工具:minicom

target环境:
0.bootloader
uboot for tiny210
u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)
u-boot for tiny210改版
1.内核
光盘镜像:linux-2.6.35.7-20121027.tgz linux-3.0.8-20121027.tgz


问题

0.编译和下载mini210_linaro-2012.11-stable
* 编译uboot for tiny210
** make distclean && make tiny210_config && make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux- all spl
* 烧写
** sudo dd oflag=dsync iflag=dsync if=spl/tiny210-spl.bin of=/dev/sdb seek=1
** sudo dd oflag=dsync iflag=dsync if=u-boot.bin of=/dev/sdb seek=49
** sudo sync
* bootloader正常启动

1.修改并配置内核linux-2.6.35.7
* 匹配uboot和linux中的mach id
** include/configs/tiny210.h
#define MACH_TYPE_TINY210 3466
** 确认内核中
#define MACH_TYPE_MINI210  3466
* 调整tiny210内存设置 arch/arm/mach-s5pv210/include/mach/memory.h
** #define SECTION_SIZE_BITS    29
** #define NODE_MEM_SIZE_BITS    29
* cp mini210_linux_defconfig .config
* make oldconfig
* 手动配置urt0调试 make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux- menuconfig
** 启动看门狗,内核解压错误则重启
CONFIG_S3C_BOOT_WATCHDOG=y
CONFIG_S3C_BOOT_ERROR_RESET=y
** 启动前期调试输出为uart0
CONFIG_S3C_BOOT_UART_FORCE_FIFO=y
CONFIG_S3C_LOWLEVEL_UART_PORT=0
** 串口设备初始化好之后调试输出为UART0
CONFIG_SERIAL_SAMSUNG=y
CONFIG_SERIAL_SAMSUNG_UARTS_4=y
CONFIG_SERIAL_SAMSUNG_UARTS=4
# CONFIG_SERIAL_SAMSUNG_DEBUG is not set
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
CONFIG_SERIAL_S5PV210=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_CONSOLE_POLL=y

** 打开lowlevel调试和启动前期early_printk
CONFIG_DEBUG_LL=y
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_ICEDCC=y
CONFIG_OC_ETM=y
CONFIG_DEBUG_S3C_UART=0

* 编译 uImage make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux- -j8 uImage

* 设置kernel的加载和入口地址:
mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n 'Linux-2.6.35.7-FriendlyARM-g24f602c' -d arch/arm/boot/zImage ./uImage

2.下载内核到0x30008000 tftp 30008000 uImage

3.启动内核 bootm 30008000
* 可能解压失败,开启看门狗之后到Starting kernel ... 重启

4.更换加载地址到 28008000
* mkimage -A arm -O linux -T kernel -C none -a 0x28008000 -e 0x28008040 -n 'Linux-2.6.35.7-FriendlyARM-g24f602c' -d arch/arm/boot/zImage ./uImage
* bootm 28008000 同样Starting kernel ... 重启

5.原因分析
* 可能是uboot的加载地址不对
* 内存中内核所在的地方有overide或者是偶然被覆盖的情况
* gzip有问题

6.让内核在内存中搬运之后再运行,使用mkimage -a 和 -e参数一样的情况来加载内核
* mkimage -A arm -O linux -T kernel -C none -a 0x28000000 -e 0x28000000 -n 'Linux-2.6.35.7-FriendlyARM-g24f602c' -d arch/arm/boot/zImage ./uImage
* 下载到tftp 38000000 uImage,这样会搬运到0x28000000执行
* bootm 38000000 同样Starting kernel ... 重启

7.加载gzip再次压缩的uImage,使用-C gzip压缩内核再启动
* mkimage -A arm -O linux -T kernel -C gzip -a 0x30008000 -e 0x30008040 -n 'Linux-2.6.35.7-FriendlyARM-g24f602c' -d arch/arm/boot/zImage ./uImage
* tftp 30008000 uImage
* bootm 30008000
Uncompressing Kernel Image ... Error: Bad gzipped data                      
GUNZIP: uncompress, out-of-mem or overwrite error - must RESET board to recover
resetting ...  
* 终于有错误了,不过这是bootloader这边解压失败,那内核自己进去也应该同样是解压失败(看门狗重启)

* 我把内核加载地址放的很高啊,30000000到20000000有足足256M空间,
那可能是内核解压是放的位置中间有被其他代码写到?
还是内核压缩是的gzip版本和解压代码版本不对?
[ 此帖被vmlinz在2012-12-25 17:04重新编辑 ]
君子终日乾乾,夕惕若,厉,无咎
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
1楼  发表于: 2012-12-24 22:10
这次直接下载zImage 到30000000然后go 30000000

data abort                                                                      
                                                                                
    MAYBE you should read doc/README.arm-unaligned-accesses                    
                                                                                
pc : [<30000a38>]          lr : [<30000134>]                                    
sp : 30449374  ip : 3044837c     fp : 30449390                                  
r10: 30000000  r9 : 20000000     r8 : 3fea1b3c                                  
r7 : 3fea1b3c  r6 : 01120d10     r5 : 30000000  r4 : 30448344                  
r3 : fd400000  r2 : 0000ff00     r1 : 30448388  r0 : 30448384                  
Flags: Nzcv  IRQs off  FIQs off  Mode SVC_32                                    
Resetting CPU ...                                                              

说明内核要求必须对齐,但是我编译的内核没有对齐,ok,有个方向了,取消内核对齐要求,或者强制生成对齐代码。
君子终日乾乾,夕惕若,厉,无咎
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
2楼  发表于: 2012-12-25 14:35
引用第1楼vmlinz于2012-12-24 22:10发表的  :
这次直接下载zImage 到30000000然后go 30000000

data abort                                                                      
                                                                                
    MAYBE you should read doc/README.arm-unaligned-accesses                    
.......


这个错误是在uboot启动内核之前打印的,说明是uboot linaro要求gcc必须强制对齐。

换用u-boot for tiny210之后到Starting Kernel...就不动了,卡死在这里,那可能也是被内核的非对齐访问的陷阱捕捉到了。。。如果在cpu初始化的时候kernel就挂,打印不出信息是正常的。

现在就需要取消内核的强制对齐要求,或者强制对齐内核的代码。

doc/README.arm-unaligned-accesses  这个文档提到armv7之后的cpu都可以高效率的访问非对齐地址,所以gcc-4.7之后对这些cpu都默认生成非对齐的代码,以压缩代码大小。
君子终日乾乾,夕惕若,厉,无咎
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
3楼  发表于: 2012-12-25 15:12
CONFIG_DEBUG_ICEDCC=y
CONFIG_OC_ETM=y

不要把这两个选项打开,它们会干扰串口输出

编译 uImage make ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux- -j8 uImage

* 设置kernel的加载和入口地址:
mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n 'Linux-2.6.35.7-FriendlyARM-g24f602c' -d arch/arm/boot/zImage ./uImage

上面的第一条命令应该就已经可以生成arch/arm/boot/uImage了,没有必要再通过mkimage手动生成。uImage的参数在arch/arm/mach-s5pv210/Makefile.boot里指定。另外,如果我没记错的话,tiny210 u-boot在SDRAM中的起始地址是0x23E00000, 我想你把uImage下载到0x21000000的地方执行应该是安全的。
我也会在mini210上试验一下(抱歉我手上没有tiny210).

祝圣诞快乐!
[ 此帖被kasim在2012-12-25 16:22重新编辑 ]
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
4楼  发表于: 2012-12-25 16:53
引用第3楼kasim于2012-12-25 15:12发表的  :

上面的第一条命令应该就已经可以生成arch/arm/boot/uImage了,没有必要再通过mkimage手动生成。uImage的参数在arch/arm/mach-s5pv210/Makefile.boot里指定。另外,如果我没记错的话,tiny210 u-boot在SDRAM中的起始地址是0x23E00000, 我想你把uImage下载到0x21000000的地方执行应该是安全的。
我也会在mini210上试验一下(抱歉我手上没有tiny210).

祝圣诞快乐!


谢谢,我没去改他默认的uImage参数设置,我想反正我要多测试几个内存地址

我会把那两个选项关闭了测试下,其实之前我也没有打开它们的

0x23E00000 到 0x21000000应该有足够大的空间给uboot了,按说不会爆栈之类的,不过我也不知道gzip解压4.5M到底需要多大内存。
我下载到0x30008000应该不会有啥问题了撒。

现在我也不知到为什么你分享的u-boot代码用linaro和友善的编译器编译出来不是字节对齐的,我看了资料,估计要用4.7的gcc强设-mno-unaligned-access,这样uboot才不会因为没有对齐而出错

关于内核代码,我也看看能不能用同样的选项重新编译,我不知道我的编译器linaro-4.6和友善的编译器是不是已经有unaligned-access支持,所以才编译出没有对齐的代码。。。
君子终日乾乾,夕惕若,厉,无咎
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
5楼  发表于: 2012-12-25 17:00
我也试试把内核下载到0x21000000。

谢谢

圣诞快乐!
君子终日乾乾,夕惕若,厉,无咎
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
6楼  发表于: 2012-12-26 21:58

 回 5楼(vmlinz) 的帖子

我的测试结果是
mini210_linaro-2012.11-stable + 友善之臂 2.6.35.7-20121027 => Start kernel后无反应
mini210_linaro-2011.10-stable + 友善之臂 2.6.35.7-20121027 可以正常启动

看起来是linaro-2012.11的base有一些问题,我会继续看。
附件里是mini210_linaro-2011.10-stable + 友善之臂 2.6.35.7-20121027(打开early printk)的启动log。友善之臂 2.6.35.7-20121027的代码可以从我的Git仓库(https://gitorious.org/opencsbc/linux/commits/mini210_bringup_fa-2.6.35.7-20121027)下载。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
7楼  发表于: 2012-12-27 10:50

 回 6楼(kasim) 的帖子

谢谢,我有时间再试试看
君子终日乾乾,夕惕若,厉,无咎
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
8楼  发表于: 2013-01-03 15:32

 回 7楼(vmlinz) 的帖子

现在2012.11-stable分支已经可以正常启动内核了。具体更新内容看http://www.aiothome.net/read.php?tid-16001.html以及gitorious.org上的commit log。谢谢!
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
君子终日乾乾,夕惕若,厉,无咎
级别: 侠客
UID: 8588
精华: 0
发帖: 61
金钱: 310 两
威望: 65 点
综合积分: 122 分
注册时间: 2009-08-29
最后登录: 2018-02-08
9楼  发表于: 2013-01-04 20:15

 回 8楼(kasim) 的帖子



感谢 我正在看你的提交呢 呵呵

继续试!
君子终日乾乾,夕惕若,厉,无咎