硬件环境:
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 tiny210u-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重新编辑 ]