s3c2410的u-boot及linux2.6.10后的内核移植(包括nand,及skyeye模拟)

时间:2021-08-29 04:45:57

s3c2410的u-boot及linux2.6.10后的内核移植(包括nand,及skyeye模拟) 最近在s3c2410上移植uboot和linux2.6内核.虽然网上的文章多多.. 但真正要在自己的板子上跑起来还真是问题多..期间有很多问题整理如下. 首先要做好移植.建议先看linux_mig_release_G4oyxcsIVyIZ.pdf. 这份资料对新手来移植来讲是必看. 1.开始UBOOT,我用的是1.1.5版本尽量用新一点的. 开始编译详细的步骤我不多讲,只个大概了.网上资料多多. (1) u-boot的board目录下包含了一些现有的板子,我的板子与SMDK2410接近,所以使用它来作模板来修改.在u-boot的board目录下 #mkdir board/s3c2410 #cp board/smdk2410/* board/s3c2410/ #mv board/s3c2410/smdk2410.c board/s3c2410/s3c2410.c #cp include/configs/smdk2410.h include/configs/s3c2410.h (2) 修改board/s3c2410/Makefile,将其中的smdk2410.o为s3c2410.o (3) 修改顶层Makefile,在smdk2410_config的附近添加 s3c2410_config : unconfig @./mkconfig $(@:_config=) arm arm920t s3c2410 NULL s3c24x0 (4)修改board/s3c2410/lowlevel_init.S 里面几个BANK控制寄存器要和自己的板子对映 (5)u-boot好像还没有nand flash启动的.参考我提的那份资料.有很详细的介绍主要修改start.s,增加nand_flash.c 以及修改include/configs/s3c2410.h (6)include/configs/s3c2410.h里面flash的大小要自己修改成板子的大小, 还有CFG_MAX_FLASH_SECT以及#define CFG_ENV_SIZE ..不然saveenv会出现边界问题.. 像我的就添加 #define CFG_ENV_IS_IN_NAND 1 #define CFG_ENV_OFFSET 0x0F0000 #define CMD_SAVEENV #define CFG_ENV_SIZE 0x10000 后saveenv就正确了再添加 #define CONFIG_SETUP_MEMORY_TAGS #define CONFIG_INITRD_TAG #define CONFIG_CMDLINE_TAG 有些环境变量自己可以对照着试试(在uboot里面已经弄好了,只是注释掉的.可以去掉注释并改成自己所要的).用printenv打印出来 (7)然后就编译就可以了 2.linux2.6内核.编译基本参照linux_mig_release_G4oyxcsIVyIZ.pdf增加nand flash分区不用怎么修改但要用uboot启动问题多多. (1) 如果内核不是uImage,则下载后,比如下在0x30008000 ,则通过go 0x30008000,但注意这样uboot没有传参数给内核.所以会有Error: unrecognized/unsupported machine ID (r1 = 0x33f4fca8).这样的错误一种方法是修改common/cmd_boot.c /*#if defined(CONFIG_I386)*/ DECLARE_GLOBAL_DATA_PTR; /*#endif*/ #if !defined(CONFIG_NIOS) /*******************add here*******************************/ if(argc==2) rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number); else /*********************add end *****************************/ rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); 解决还可以在arch/arm/kernel/head.S写死r1 mov r1, #0xc1 (2)最搞的bootint the kernel没显示了. 一般这个错误有两种原因.. 一个内核的commandline 还一个是由于主频设置的问题通过go启动内核的话参数用的是编译时的..而bootm则是启动的经过处理的uImage(加了一个头) 所以用bootm就会把uboot设置的commandline传给内核..如果是用bootm启动出现bootint the kernel没显示了.则应该好好检查一下.可以printenv打印看uboot有没设置对commandline 还有主频问题就是在MPLLCON这个寄存器的配置上。(board/s3c2410/s3c2410.c) 在VIVI:MPLLCON = 0x0005c040;计算出来的Mpll = 200Mhz Uboot114:MPLLCON = 0x000a1031;计算出来的Mpll = 202Mhz 内核不怎么如果设成202Mhz就不行.尚在分析中. 把MPLLCON改成 = 0x0005c040..终于有显示了. 或者写死内核.这个尚在分析中,不讨论.. s3c2410 # bootm 31000000 ## Booting image at 31000000 ... Image Name: linux-2.6.14 Image Created: 2007-08-15 7:22:32 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1468948 Bytes = 1.4 MB Load Address: 30008000 Entry Point: 30008000 Verifying Checksum ... OK OK Starting kernel ... Uncompressing Linux.................................................................................. .............. done, booting the kernel. Linux version 2.6.20 (ming@ming) (gcc version 3.4.4) #1 Wed Aug 15 15:20:51 CST 2007 CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177 Machine: SMDK2410 Warning: bad configuration page, trying to continue Memory policy: ECC disabled, Data cache writeback CPU S3C2410A (id 0x32410002) S3C2410: core 200.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz S3C24XX Clocks, (c) 2004 Simtec Electronics CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on CPU0: D VIVT write-back cache 另: 如果用skyeye的话.则uboot不用加nand的代码.其它一样 skyeye.conf一定要设置对.我一开始就死那里我的 cpu: arm920t mach: s3c2410x mem_bank: map=M, type=R, addr=0x00000000, size=0x0400000,file=u-boot4.bin,boot=yes mem_bank: map=M, type=R, addr=0x00000000, size=0x0C00000 mem_bank: map=M, type=RW, addr=0x30000000, size=0x2000000 mem_bank: map=M, type=RW, addr=0x32000000, size=0x2000000, file=uImage2.6.18.1 #all peripherals I/O mapping area mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000 主要是rom和ram的大小要和配置文件的一样.像我这里uImage2.6.18.1放在0x32000000 bootm 0x32000000就可以启动.. 还提示3s按enter..按的速度要快.一开始按的太慢以为没用..不然自启动了. 还有文件系统和网卡下次整理..弄了一个礼拜休息下.还有内核202.8MHz的问题!!