首页 / 操作系统 / Linux / U-Boot在华恒S3C2410EDU板子上的移植
终于把这个uboot搞定啦。居然拖拖拉拉做了好久:(。感觉做底层的东西不懂那些硬件的东西真困难,还有那些汇编,看的头都大。幸好有光盘里有现成的ppcboot2.0的源码可以参考,哈哈。当然啦,还要多亏hn和winter的耐心帮助啦。3q。现就将我的移植步骤详细说一遍喽!(说明:我是在hharm-edu上移植的哦) 1.到sourceforge.net中下载uboot源码,我用的版本是1.1.4.(和1.1.3没太多区别,修改的地方基本一样)。 2.解压后,修改Makefile中的交叉编译路径。 ifeq ($(ARCH),arm) CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux- endif 3.make smdk2410_config ;make 后出现错误,根据提示修改: (1)将cpu/arm920t/config.mk中的PLATform_CPPFLAGS +=$( -mapcs-32,$(call cc-option,-mabi=apcs-gnu)改为PLATform_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),) (2)将/include/asm-arm/processor.h中的 union debug_insn { u32arm; u16thumb; };改为 union debug_insn { u32arm_mode; u16thumb_mode; }; 4.再make后即可编译通过啦。因为uboot中的2410板子里没有edu上用的那种flash,所以就把ppcboot中的flash文件直接拷过来啦。哈哈。方便。将/ppcboot-2.0.0/board/smdk2410/flash.c和flash-define.h拷到u-boot-1.1.4/board/smdk2410下,再将/ppcboot-2.0.0/include/flash.h拷到u-boot-1.1.4/nclude/下。hoho。flash驱动算是搞定。 5.修改include/configs/smdk2410.h, 去掉#define CONFIG_DRIVER_CS8900 1 #define CS8900_BASE 0x8000300 #define CS8900_BUS16 1加上#define CONFIG_DRIVER_DM9000 1 #define CONFIG_DM9000_BASE 0x8000300 #define DM9000_IO CONFIG_DM9000_BASE #define DM9000_DATA (CONFIG_DM9000_BASE+4) #define CONFIG_DM9000_USE_16BIT #define COMMAND_LINE "initrd=0x30800000,0x440000 mem=64M root=/dev/ram init=/linuxrc console=ttyS0" 再修改其它一些配置,不具体写了,修改后如下: #define CONFIG_COMMANDS / (CONFIG_CMD_DFL | / CFG_CMD_CACHE | / CFG_CMD_PING | / //加上PING哦,否则不能下载 CFG_CMD_REGINFO | / CFG_CMD_DATE | / CFG_CMD_ELF)#define CONFIG_ETHADDR08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR192.168.2.110 #define CONFIG_SERVERIP192.168.2.111#define CFG_MAX_FLASH_BANKS1/* max number of memory banks */ #define CONFIG_INTEL_E28F128 1 #ifdef CONFIG_INTEL_E28F128 #define PHYS_FLASH_SIZE0x01000000 /* 16MB */ #define CFG_FLASH_SIZEPHYS_FLASH_SIZE /* 16MB */ #define CFG_MAX_FLASH_SECT(128)/* max number of sectors on one chip */ #define CFG_ENV_ADDR(CFG_FLASH_BASE + 0x020000) /* addr of environment */ #endif6.Ok。make编译后,生成uboot.bin文件,下载到ram中,go 30008000,出现 #Starting application at 0x30008000… Start linux.. Setup linux parameters at 0x3000100 然后就不动了:( 我的解决方法是到cpu/arm920t/start.S中 #ifndef CONFIG_SKIP_LOWLEVEL_INIT //blcpu_init_crit #endif 注释掉blcpu_init_crit。哈哈,重新编译后就可以在ram中调试啦。看了这段子程序,是调用board/smdk2410/lowlevel_init.S文件,这个文件是用来初始化ram的,估计是在ram中运行,就不能初始化了吧?(恳请大虾解惑)。 一切调试成功后,就可以烧进去了。注意现在就要把blcpu_init_crit前的注释去掉喽。烧到flash中就必须初始化ram,否则烧写后什么显示都没。下面是我uboot工作状态: PPCBoot 2.0.0 (Dec 15 2005 - 20:00:18) PPCBoot code: 33F00000 -> 33F15D5C BSS: -> 33F191F0 DRAM Configuration: Bank #0: 30000000 64 MB Flash Memory Start 0x0 Device ID of the Flash is 18 intel E28F128J3A150 init finished!!! Flash: 16 MB Write 18 to Watchdog and it is 18 now start linux now(y/n): SMDK2410 # tftp 30008000 u-boot.bin <DM9000> I/O: 8000300, VID: 90000a46 NetOurIP =c0a802de NetServerIP = c0a8026f NetOurGatewayIP = c0a80201 NetOurSubnetMask = ffffff00 ARP broadcast 1 ARP broadcast 2 TFTP from server 192.168.2.111; our IP address is 192.168.2.222 Filename "u-boot.bin". Load address: 0x0 Loading: ##################### done Bytes transferred = 103676 (194fc hex) SMDK2410 # go 30008000 ## Starting application at 0x30008000 ... Start linux .. Setup linux parameters at 0x30000100 U-Boot 1.1.4 (Dec 27 2006 - 13:56:04) U-Boot code: 33F80000 -> 33F994FC BSS: -> 33F9D8DC RAM Configuration: Bank #0: 30000000 64 MB Flash Memory Start 0x0 Device ID of the Flash is 18 intel E28F128J3A150 init finished!!! Flash: 16 MB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial DAILY2410 # DAILY2410 # DAILY2410 # printenv bootdelay=3 baudrate=115200 ethaddr=08:00:3e:26:0a:5b ipaddr=192.168.2.110 serverip=192.168.2.111 netmask=255.255.255.0 stdin=serial stdout=serial stderr=serial Environment size: 161/65532 bytes DAILY2410 #Environment size: 161/65532 bytes DAILY2410 # bdinfo arch_number = 0x000000C1 env_t = 0x00000000 boot_params = 0x30000100 DRAM bank = 0x00000000 -> start = 0x30000000 -> size = 0x04000000 ethaddr = 08:00:3E:26:0A:5B ip_addr = 192.168.2.110 baudrate = 115200 bps DAILY2410 # DAILY2410 # flinfo Bank # 1: intel E28F128J3A150 00000000 (RO) 00020000 00040000 00060000 00080000 000A0000 000C0000 000E0000 00100000 00120000 00140000 00160000 00180000 001A0000 001C0000 001E0000 00200000 00220000 00240000 00260000 00280000 002A0000 002C0000 002E0000 00300000 00320000 00340000 00360000 00380000 003A0000 003C0000 003E0000 00400000 00420000 00440000 00460000 00480000 004A0000 004C0000 004E0000 00500000 00520000 00540000 00560000 00580000 005A0000 005C0000 005E0000 00600000 00620000 00640000 00660000 00680000 006A0000 006C0000 006E0000 00700000 00720000 00740000 00760000 00780000 007A0000 007C0000 007E0000 00800000 00820000 00840000 00860000 00880000 008A0000 008C0000 008E0000 00900000 00920000 00940000 00960000 00980000 009A0000 009C0000 009E0000 00A00000 00A20000 00A40000 00A60000 00A80000 00AA0000 00AC0000 00AE0000 00B00000 00B20000 00B40000 00B60000 00B80000 00BA0000 00BC0000 00BE0000 00C00000 00C20000 00C40000 00C60000 00C80000 00CA0000 00CC0000 00CE0000 00D00000 00D20000 00D40000 00D60000 00D80000 00DA0000 00DC0000 00DE0000 00E00000 00E20000 00E40000 00E60000 00E80000 00EA0000 00EC0000 00EE0000 00F00000 00F20000 00F40000 00F60000 00F80000 00FA0000 00FC0000 00FE0000 DAILY2410 # DAILY2410 # protect off 1:0 Un-Protect Flash Sectors 0-0 in Bank # 1 . done DAILY2410 #DAILY2410 # erase 1:0 Erase Flash Sectors 0-0 in Bank # 1 [XXXXX] DAILY2410 # DAILY2410 # tftp 30008000 u-boot.bin dm9000 i/o: 0x8000300, id: 0x90000a46 MAC: 00:80:00:80:00:80 operating at unknown: 15 mode TFTP from server 192.168.2.111; our IP address is 192.168.2.110 Filename "u-boot.bin". Load address: 0x30008000 Loading: T ##################### done Bytes transferred = 103704 (19518 hex) DAILY2410 # cp.b 30008000 0 20000 Copy to Flash... ******************************************************* # done 7.出现新的问题,用这个uboot虽然能下载内核,说明网卡驱动正常,但是无法go,也不能正常bootm。 如果用go命令出现: ## Starting application at 0x30008000 ... Uncompressing Linux............................................................. Error: unrecognized/unsupported machine ID (r1 = 0x33f4fc88). Available machine support: ID (hex) NAME 000000c1 SMDK2410 Please check your kernel config and/or bootloader. 或者大多数时候就停在 ## Starting application at 0x30008000 ... Uncompressing Linux............................................................. 不动了。。 这是uboot传递给内核的参数发生错误。 解决方法是参照ppcboot源码中的go指令的运行方式修改。 只要修改两个文件即可:lib_arm/armlinux.c和common/cmd_boot.c。 在armlinux.c中加入 static inline void cpu_arm920_cache_clean_invalidate_all(void) { __asm__( "movr1, #0/n" "movr1, #7 << 5/n" /* 8 segments */ "1:orrr3, r1, #63 << 26/n" /* 64 entries */ "2:mcrp15, 0, r3, c7, c14, 2/n" /* clean & invalidate D index */ "subsr3, r3, #1 << 26/n" "bcs2b/n" /* entries 64 to 0 */ "subsr1, r1, #1 << 5/n" "bcs1b/n" /* segments 7 to 0 */ "mcrp15, 0, r1, c7, c5, 0/n" /* invalidate I cache */ "mcrp15, 0, r1, c7, c10, 4/n" /* drain WB */ ); }static inline void cpu_arm920_tlb_invalidate_all(void) { __asm__( "movr0, #0/n" "mcrp15, 0, r0, c7, c10, 4/n"/* drain WB */ "mcrp15, 0, r0, c8, c7, 0/n"/* invalidate I & D TLBs */ ); } void call_linux(long a0, long a1, long a2) { __asm__( "movr0, %0/n" "movr1, %1/n" "movr2, %2/n" "movip, #0/n" "mcrp15, 0, ip, c13, c0, 0/n"/* zero PID */ "mcrp15, 0, ip, c7, c7, 0/n"/* invalidate I,D caches */ "mcrp15, 0, ip, c7, c10, 4/n"/* drain write buffer */ "mcrp15, 0, ip, c8, c7, 0/n"/* invalidate I,D TLBs */ "mrcp15, 0, ip, c1, c0, 0/n"/* get control register */ "bicip, ip, #0x0001/n"/* disable MMU */ "mcrp15, 0, ip, c1, c0, 0/n"/* write control register */ "movpc, r2/n" "nop/n" "nop/n" : /* no outpus */ : "r" (a0), "r" (a1), "r" (a2) ); #define RAMDISK 1 /*static*/ void setup_linux_param(ulong param_base) { struct param_struct *params = (struct param_struct *)param_base; #ifdef RAMDISK char linux_cmd[] = "initrd=0x30800000,0x440000 mem=64M root=/dev/ram init=/linuxrc console=ttyS0"; #endif #ifdef CRAMFS char linux_cmd[] = "root=/dev/mtdblock/2 rw mem=32M"; #endif printf("Setup linux parameters at 0x%08lx/n", param_base); memset(params, 0, sizeof(struct param_struct));params->u1.s.page_size = LINUX_PAGE_SIZE; params->u1.s.nr_pages = (DRAM_SIZE >> LINUX_PAGE_SHIFT); #if 0 params->u1.s.page_size = LINUX_PAGE_SIZE; params->u1.s.nr_pages = (dram_size >> LINUX_PAGE_SHIFT); params->u1.s.ramdisk_size = 0; params->u1.s.rootdev = rootdev; params->u1.s.flags = 0;#endif /* If use ramdisk */ params->u1.s.initrd_start = 0xC0800000 ; params->u1.s.initrd_size = 0x440000; params->u1.s.rd_start = 0;/* set linux command line */ if (linux_cmd == NULL) { printf("Wrong magic: could not found linux command line/n"); } else { memcpy(params->commandline, linux_cmd, strlen(linux_cmd) + 1); } } 以及几个宏变量的定义。 在cmd_boot.c中将do_go函数改为 int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { ulongaddr, rc; int rcode = 0;if (argc < 2) { printf ("Usage:/n%s/n", cmdtp->usage); return 1; }addr = simple_strtoul(argv[1], NULL, 16);printf ("## Starting application at 0x%08lx .../n", addr);printf("Start linux ../n"); setup_linux_param(/*boot_mem_base*/0x30000000 + 0x100); call_linux(0, 0xc1, addr); printf("End/n"); rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); if (rc != 0) rcode = 1;printf ("## Application terminated, rc = 0x%lx/n", rc); return rcode; } 就ok啦。 重新编译后,我的linux和ramdisk.image.gz就可以欢快的跑起来啦。 哈,不过这是2.4的内核,把armlinux.c中的ttyS0改为ttySAC0,在用论坛上下的zImage.2410.2.6测试一下,哈,2.6也能跑啦。 不过bootm的问题我无法解决。 做了一个uImage。Tftp 30008000后,出现: ## Booting image at 30008000 ... Image Name: Created: 2007-01-01 12:18:08 UTC Image Type: ARM Linux Kernel Image (gzip compressed) Data Size: 893780 Bytes = 872.8 kB Load Address: 30008000 Entry Point: 30008000 Verifying Checksum ... OK Uncompressing Kernel Image ... Error: inflate() returned -3 GUNZIP ERROR - must RESET board to recover看了论坛上的旧帖,说是地址覆盖了。故改为31000000 .tftp后,bootm 31000000,呵,内核也能跑以来,可是莫名奇妙的是那些打印信息不在console上显示,怎么全都跑到lcd上显示去了。。。我晕。。就是把原来的zImage做成的uImage,解压后两个应该是一样的啊。 晕。。。不搞了。。还是先用go继续做吧。
收藏该网址