我的TX2440a开发板,qt移植到开发板完UBOOT支持了NANDFLASH启动,将qt移植到开发板的内核加载进去,系统没有启动,还只是启动了

u-boot-移植到TQ2440(六):支持NAND FLASH启动
时间: 12:42:04
一、&&&&支持NAND FLASH启动
新版u-boot在链接时加了“-pie”选项
&&&&&&&&&& Produce a position independentexecutable on targets which support it.&For predictable results, you must also specify the same set of optionsthat were used to generate code (-fpie, -fPIE, or model suboptions) when youspecify
this option.
产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。
最终u-boot.bin中多了这些段
.rel.dyn : {
&&&&&&&& __rel_dyn_start = .;
&&&&&&&& *(.rel*)
&&&&&&&& __rel_dyn_end = .;
& .dynsym : {
&&&&&&&& __dynsym_start = .;
&&&&&&&& *(.dynsym)
从NOR FLASH把代码复制到SDRAM,程序的链接地址是0,访问全局变量、静态变量、调用函数时是使用基于0地址编译得到的地址,现在把程序复制到了SDRAM(0x3000000),需要修改代码,把原来的地址改为新地址。这样太复杂了,我还是使用老版本的方法。
去掉“-pie”选项,在u-boot源码搜索“-pie”
root@zjh:/home/work/u-boot-#grep &\-pie& . -nR
./doc/README.arm-relocation:3:Atarch level: add linker flag -pie
./arch/x86/config.mk:43:LDFLAGS_FINAL+= --gc-sections -pie
./arch/arm/config.mk:75:LDFLAGS_u-boot+= -pie
去除arch/arm/config.mk:75:LDFLAGS_u-boot += -pie中的“-pie”
# needed for relocation
ifndef CONFIG_NAND_SPL
#LDFLAGS_u-boot +=-pie
修改配置文件include\configs\tq2440.h,给u-boot分配512KB
#define CONFIG_SYS_TEXT_BASE
0x33f80000
增加文件board\tq2440\nand_read_ll.c并修改相应的Makefile
COBJS&& := tq2440.onand_read_ll.o
Nand_read_ll.c文件内容如下:
/* NAND FLASH控制器 */
#define NFCONF(*((volatile unsigned long *)0x4E000000))
#define NFCONT(*((volatile unsigned long *)0x4E000004))
#define NFCMMD(*((volatile unsigned char *)0x4E000008))
#define NFADDR(*((volatile unsigned char *)0x4E00000C))
#define NFDATA(*((volatile unsigned char *)0x4E000010))
#define NFSTAT(*((volatile unsigned char *)0x4E000020))
static intisBootFromNorFlash(void)
& volatile int *p = (volatile int *)0;
& val = *p;
& *p = 0x;
& if (*p == 0x) {
&&&&&&&& /* 写成功,
是nand启动 */
&&&&&&&& *p =
&&&&&&&& return 0;
& } else {
&&&&&&&& /* NOR不能像内存一样写 */
&&&&&&&& return 1;
voidclear_bss(void)
& extern int __bss_start, __bss_end__;
& int *p = &__bss_
& for (; p & &__bss_end__; p++)
&&&&&&&& *p = 0;
void nand_init_ll(void)
#define TACLS&& 0
#defineTWRPH0& 1
#defineTWRPH1& 0
& /* 设置时序 */
& NFCONF =(TACLS&&12)|(TWRPH0&&8)|(TWRPH1&&4);
& /* 使能NAND Flash控制器,
初始化ECC, 禁止片选 */
& NFCONT =(1&&4)|(1&&1)|(1&&0);&&&&
static voidnand_select(void)
& NFCONT &= ~(1&&1);
static voidnand_deselect(void)
& NFCONT |= (1&&1);&&&&
static voidnand_cmd(unsigned char cmd)
& NFCMMD =
& for (i = 0; i & 10; i++);
static voidnand_addr(unsigned int addr)
& unsigned int col& = addr % 2048;
& unsigned int page = addr / 2048;
& NFADDR = col & 0
& for (i = 0; i & 10; i++);
& NFADDR = (col && 8) & 0
& for (i = 0; i & 10; i++);
& NFADDR&= page & 0
& for (i = 0; i & 10; i++);
& NFADDR&= (page && 8) & 0
& for (i = 0; i & 10; i++);
& NFADDR&= (page && 16) & 0
& for (i = 0; i & 10; i++);&
static voidnand_wait_ready(void)
& while (!(NFSTAT & 1));
static unsignedchar nand_data(void)
& return NFDATA;
voidnand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
& int col = addr % 2048;
& int i = 0;
& /* 1. 选中 */
& nand_select();
& while (i & len) {
&&&&&&&& /* 2. 发出读命令00h */
&&&&&&&& nand_cmd(0x00);
&&&&&&&& /* 3. 发出地址(分5步发出)
&&&&&&&& nand_addr(addr);
&&&&&&&& /* 4. 发出读命令30h */
&&&&&&&& nand_cmd(0x30);
&&&&&&&& /* 5. 判断状态 */
&&&&&&&& nand_wait_ready();
&&&&&&&& /* 6. 读数据 */
&&&&&&&& for (; (col & 2048) && (i& len); col++) {
&&&&&&&&&&&&&&& buf[i] = nand_data();
&&&&&&&&&&&&&&& i++;
&&&&&&&&&&&&&&& addr++;
&&&&&&&& }
&&&&&&&& col = 0;
& /* 7. 取消选中 */&&&&&&&&&&&
& nand_deselect();
voidcopy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
& int i = 0;
& /* 如果是NOR启动 */
& if (isBootFromNorFlash()) {
&&&&&&&& while (i & len) {
&&&&&&&&&&&&&&& dest[i] = src[i];
&&&&&&&&&&&&&&& i++;
&&&&&&&& }
& } else {
&&&&&&&& nand_init_ll();
&&&&&&&& nand_read_ll((unsigned int)src, dest,len);
修改arch\arm\cpu\arm920t\start.S
call_board_init_f:
&&& ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
&&& bic sp, sp, #7 /* 8-byte alignment for ABIcompliance */
&&& ldr r0,=0x
&&& ldr r1, _TEXT_BASE
&&& ldr r2, _bss_start_ofs
&&& bl copy_code_to_sdram
&&& bl clear_bss
&&& ldr pc, =
board_init_f& /* 跳转到SDRAM */
.globl second
/* 调用第2阶段的代码 */
&&&&&& bl board_init_r
注释掉以下代码
&&&&&& .globl&&& relocate_code
relocate_code:
&&&&&& mov&&&&& r4, r0&& /* save addr_sp */
&&&&&& mov&&&&& r5, r1&& /* save addr of gd */
&&&&&& mov&&&&& r6, r2&& /* save addr of destination */
&&&&&& /* Set up the stack&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&& */
stack_setup:
&&&&&& mov&&&&& sp, r4
&&&&&& adr r0, _start
&&&&&& cmp&&&&& r0, r6
&&&&&& beq&&&&&& clear_bss&&&&&&&&& /* skip relocation */
&&&&&& mov&&&&& r1, r6&&&&&&&&&&&&&&&& /* r1 &- scratch forcopy_loop */
&&&&&& ldr& r3, _bss_start_ofs
&&&&&& add&&&&&& r2, r0, r3&&&&&&&&&& /* r2 &- source end address&&& &&& */
copy_loop:
&&&&&& ldmia&&& r0!, {r9-r10}&&&&&&&&&&& /* copy from source address[r0]&&& */
&&&&&& stmia&&& r1!, {r9-r10}&&&&&&&&&&& /* copy to&& target address [r1]&&& */
&&&&&& cmp&&&&& r0, r2&&&&&&&&&&&&&&&& /* until source end address[r2]&&& */
&&&&&& blo copy_loop
#ifndef CONFIG_SPL_BUILD
&&&&&& &* fix .rel.dynrelocations
&&&&&& &*/
&&&&&& ldr& r0, _TEXT_BASE&&&&&&&&&&& /* r0 &- Text base */
&&&&&& sub&&&&&& r9, r6, r0&&&&&&&&&& /* r9 &- relocation offset */
&&&&&& ldr& r10,_dynsym_start_ofs&& /* r10 &- sym tableofs */
&&&&&& add&&&&&& r10, r10, r0&&&&&&&&&&&& /* r10 &- sym table in FLASH */
&&&&&& ldr& r2,_rel_dyn_start_ofs&&&&& /* r2 &- reldyn start ofs */
&&&&&& add&&&&&& r2, r2, r0&&&&&&&&&& /* r2 &- rel dyn start in FLASH */
&&&&&& ldr& r3, _rel_dyn_end_ofs&&&&&& /* r3 &- rel dyn end ofs */
&&&&&& add&&&&&& r3, r3, r0&&&&&&&&&& /* r3 &- rel dyn end in FLASH */
&&&&&& ldr& r0, [r2]&&&&&&&&&&&&& /* r0 &- location to fix up, INFLASH! */
&&&&&& add&&&&&& r0, r0, r9&&&&&&&&&& /* r0 &- location to fix up in RAM*/
&&&&&& ldr& r1, [r2, #4]
&&&&&& and&&&&&& r7, r1, #0xff
&&&&&& cmp&&&&& r7, #23&&&&&&&&&&&&&&&&&&&& /* relative fixup? */
&&&&&& beq&&&&&& fixrel
&&&&&& cmp&&&&& r7, #2&&&&&&&&&&&&&&&& /* absolute fixup? */
&&&&&& beq&&&&&& fixabs
&&&&&& /* ignore unknown type of fixup */
&&&&&& b&&&& fixnext
&&&&&& /* absolute fix: set location to (offset) symbol value */
&&&&&& mov&&&&& r1, r1, LSR #4&&&&&&&& /* r1 &- symbol index in .dynsym */
&&&&&& add&&&&&& r1, r10, r1&&&&&&& /* r1 &- address of symbol in table*/
&&&&&& ldr& r1, [r1, #4]&&&&&&&&&&&&& /* r1 &- symbol value */
&&&&&& add&&&&&& r1, r1, r9&&&&&&&&&& /* r1 &- relocated sym addr */
&&&&&& b&&&& fixnext
&&&&&& /* relative fix: increase location by offset */
&&&&&& ldr& r1, [r0]
&&&&&& add&&&&&& r1, r1, r9
&&&&&& str& r1, [r0]
&&&&&& add&&&&&& r2, r2, #8&&&&&&&&& /* each rel.dyn entry is 8 bytes */
&&&&&& cmp&&&&& r2, r3
&&&&&& blo fixloop
clear_bss:
#ifndef CONFIG_SPL_BUILD
&&&&&& ldr& r0, _bss_start_ofs
&&&&&& ldr& r1, _bss_end_ofs
&&&&&& mov&&&&& r4, r6&&&&&&&&&&&&&&&& /* reloc addr */
&&&&&& add&&&&&& r0, r0, r4
&&&&&& add&&&&&& r1, r1, r4
&&&&&& mov&&&&& r2, #0x&&&&&&&& /* clear&&&&&&&&&&&&&&&&&&&& &&& */
clbss_l:str& r2, [r0]&&&&&&&&&&&&& /*clear loop...&&&&&&&&&&&&& &&& */
&&&&&& add&&&&&& r0, r0, #4
&&&&&& cmp&&&&& r0, r1
&&&&&& bne&&&&&& clbss_l
&&&&&& bl coloured_LED_init
&&&&&& bl red_led_on
修改arch\arm\lib\board.c中的函数board_init_f
//addr -=gd-&mon_
//addr &=~(4096 - 1);
addr =CONFIG_SYS_TEXT_BASE;
注视最后的重定位,并跳转到刚才定义的second
//relocate_code(addr_sp,id, addr);
second(id, addr);
修改链接脚本arch\arm\cpu\u-boot.lds把start.o、nand_read_ll.o、lowlevel_init.o编译到前面4k
CPUDIR/start.o (.text)
board/tq2440/libtq2440.o(.text)
重新编译,烧到NAND FLASH
TQ2440 # nand erase 040000;tftp
u-boot.nand write
NAND erase: device 0 offset0x0, size 0x40000
Erasing at 0x20000 -- 100%complete.
dm9000 i/o: 0x, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x
Loading: T ###############
Bytes transferred = e7c hex)
NAND write: device 0 offset0x0, size 0x40000
&262144 bytes written: OK
从NAND FLASH启动
(Dec 312012 - 11:57:16)
FCLK:&&&&& 400 MHz
HCLK:&&&&& 100 MHz
PCLK:&&&&&& 50 MHz
DRAM:& 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESETthe board ###
由于从NAND启动,CPU检测不到NOR FLASH,具体代码如下arch\arm\lib\board.c
#if!defined(CONFIG_SYS_NO_FLASH)
& puts(&Flash: &);
& flash_size = flash_init();
& if (flash_size & 0) {
# ifdefCONFIG_SYS_FLASH_CHECKSUM
&&&&&&&& char *s = getenv(&flashchecksum&);
&&&&&&&& print_size(flash_size, &&);
&&&&&&&& /*
&&&&&&&& &* Compute and printflash CRC if flashchecksum is set to 'y'
&&&&&&&& &*
&&&&&&&& &* NOTE: Maybe weshould add some WATCHDOG_RESET()? XXX
&&&&&&&& &*/
&&&&&&&& if (s && (*s == 'y')) {
&&&&&&&&&&&&&&& printf(&&CRC: %08X&, crc32(0,
&&&&&&&&&&&&&&&&&&&&&& (const unsigned char *) CONFIG_SYS_FLASH_BASE,
&&&&&&&&&&&&&&&&&&&&&& flash_size));
&&&&&&&& }
&&&&&&&& putc('\n');
# else&&&& /* !CONFIG_SYS_FLASH_CHECKSUM */
&&&&&&&& print_size(flash_size, &\n&);
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
& } else {
&&&&&&&& puts(failed);
&&&&&&&& hang();
void hang(void)
& puts(&### ERROR ### Please RESET the board ###\n&);
& for (;;);
我们直接注释掉上面的hang();
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
& } else {
&&&&&&&& puts(failed);
&&&&&&&& //hang();
重新编译,烧到NAND FLASH,从NAND启动
(Dec 312012 - 12:25:24)
FCLK:&&&&& 400 MHz
HCLK:&&&&& 100 MHz
PCLK:&&&&&& 50 MHz
DRAM:& 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
NAND:& nand_get_flash_type: second ID read did notmatch 0e,0f against ee,06
No NAND devicefound!!!
这是第二阶段初始化NAND FLASH有问题,把之前设置的时序调高一点
#ifdefined(CONFIG_S3C24XX_CUSTOM_NAND_TIMING)
& tacls& =CONFIG_S3C24XX_TACLS;
& twrph0 = CONFIG_S3C24XX_TWRPH0;
& twrph1 =&CONFIG_S3C24XX_TWRPH1;
& tacls& = 2;
& twrph0 = 2;
& twrph1 = 2;
重新编译,烧到NAND FLASH
(Dec 31 :20)
FCLK:&&&&& 400 MHz
HCLK:&&&&& 100 MHz
PCLK:&&&&&& 50 MHz
DRAM:& 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
NAND:& 256 MiB
卡在这里,检查后发现修改start.S的时候调用第二阶段代码没有重新设置栈指针,做如下修改
board.c中的board_init_f函数
//relocate_code(addr_sp, id,addr);
& second(id, addr, addr_sp);
& mov sp, r2 /*重新设置栈指针 */
/* 调用第2阶段的代码 */
& bl board_init_r
重新编译,烧到NAND,从NAND启动
(Dec 312012 - 12:31:58)
FCLK:&&&&& 400 MHz
HCLK:&&&&& 100 MHz
PCLK:&&&&&& 50 MHz
DRAM:& 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
NAND:& 256 MiB
In:&&& serial
Out:&& serial
Err:&& serial
Net:&& dm9000
$T.total > 0 && $T.page <= $T.pageNum}
{#foreach $T.data as r}
{$T.r.formt_tm}{#if $T.r.nickname}{#else}匿名{#/if}
{$T.r.content}
{#if $T.page > 1 && $T.pageNum > 1)
$T.s_num > 2}
{#for index = $T.s_num to $T.e_num}
$T.pageNum > $T.pageNavSize+ 2 && $T.s_num != $T.pageNum - $T.pageNavSize}
{#if $T.pageNum > 1}
{#if $T.pageNum != $T.page && $T.pageNum > 1}
<a href="javascript:void(0);" page="{$T.page 下一页
您的回应...
也许你感兴趣
(window.slotbydup=window.slotbydup || []).push({
id: '3465635',
container: s,
size: '120,240',
display: 'float'
(C)2012 本站提供的内容来源于广大网络用户,我们不保证内容的正确性。如果转载了您的内容,希望删除的请联系我们!4902人阅读
u-boot-2011.06(10)
uboot最主要的功能就是能够引导内核启动。本文就介绍如何实现该功能,并组成一个最简单的系统,这不仅要移植uboot,还要移植linux内核及创建一个根文件系统。
首先我们对nandflash进行分区,规划好每个文件存放在nandflash的位置。下面是nandflash的分区:
第0分区:0x-0x为uboot区
第1分区:0x-0x为参数区
第2分区:0x-0x为linux内核区
第3分区:0x-0x为根文件系统区
规划好分区后,我们就可以依次完成uboot的移植,linux内核的移植,及创建一个根文件系统。我们选择cramfs作为根文件系统。
一、uboot移植
1.修改机器码,要保证uboot与linux内核的机器码一致,这样才能启动内核。
修改board/samsung/zhaocj2440/zhaocj2440.c文件中的第116行内容,把SMDK2410改为SMDK2440,即:
&&&&&& gd-&bd-&bi_arch_number&= &MACH_TYPE_SMDK2440;
因为我们的uboot移植是以uboot自带的SMDK2440开发板为模板的,所以我们还是按照SMDK2440的机器码来移植,MACH_TYPE_SMDK2440的具体数&#20540;在arch/arm/include/asm/mach-types.h文件的第1013行已有定义:
#define &MACH_TYPE_SMDK2440&&&&&&&& &&&&1008
2.添加bootcmd和bootargs参数。其中bootcmd是为了引导内核,而bootargs是为了在加载根文件系统时,给根文件系统传递必要的参数。
可以有两种方法来设置这两个参数:
第一种方法是在uboot的提示符下直接设置bootcmd和bootargs这两个参数:
ZHAOCJ2440 # &setenv&bootcmd &' nand &read&; bootm
ZHAOCJ2440 # &setenv&bootargs &' root=/dev/mtdblock3 &ro &noinitrd&init=/linuxrc console=ttySAC , 115200 &rootfstype=cramfs &mem=64M'
ZHAOCJ2440 # &saveenv
在这里bootcmd的含义是从nandflash中读取kernel,然后利用命令bootm启动。bootargs的含义是在nandflash中的第3个分区内存放着根文件系统,它的&#26684;式是cramfs。最后还要应用saveenv命令来保存这两个变量。这时,如果你在提示符下敲入printenv命令,则会看到uboot的环境参数多了两项,如:
bootargs=root=/dev/mtdblock3 &ro &noinitrd &init=/linuxrc &console=ttySAC,115200 rootfstype=cramfs &mem=64M
bootcmd=nand &read &000 &400000 ; bootm &
第二种方法是在include/configs/zhaocj2440.h内定义CONFIG_BOOTARGS和CONFIG_BOOTCOMMAND这两个宏定义:
#define &CONFIG_BOOTARGS&& root=/dev/mtdblock3 &ro &noinitrd& init=/linuxrc console=ttySAC , 115200 &rootfstype=cramfs &mem=64M&
#define &CONFIG_BOOTCOMMAND && nand &read &000 &400000 ; bootm &
3.把移植好的uboot烧写到nandflash中的0xx内。
二、linux内核移植
这里我们实现的是最简单的移植,即能够启动即可。
1.在下列网址下载linux内核,linux-3.4.6.tar.bz2
解压到当前目录:
tar &-xvjf&linux-3.4.6.tar.bz2
2.修改主目录下的Makefile文件,第195行和第196行改写为:
ARCH&&&&&&&&&&& ?=arm
CROSS_COMPILE&&&&&& ?= arm-linux-
3.添加机器码,使uboot与linux机器码一致,并改变内核时钟
在arch/arm/tools/mach-types文件的第207行添加下列代码:
smdk2440&&&&&&&&&&&&& MACH_SMDK2440&&&&&&&&&&&& SMDK2440&&&&&&&&&& 1008
在arch/arm/mach-s3c24xx/mach-smdk2440.c文件内
第165行中的改为,即
&&&&&& s3c24xx_init_clocks();
第178行中的S3C2440改为SMDK2440,即
MACHINE_START(SMDK2440,&SMDK2440&)
4.修改内核中的分区,使其与我们事先定义的分区一致
在arch/arm/mach-s3c24xx/common-smdk.c文件内
第111行中的smdk_default_nand_part结构体改为:
static &struct &mtd_partition&smdk_default_nand_part[ ] = {
&&&&&& [0]= {
&&&&&&&&&&&&& .name&&&&& = &UBoot&,
&&&&&&&&&&&&& .size = SZ_512K,
&&&&&&&&&&&&& .offset&&&& = 0,
&&&&&& [1]= {
&&&&&&&&&&&&& .name&&&&& = &Para&,
&&&&&&&&&&&&& .offset= SZ_512K,
&&&&&&&&&&&&& .size = SZ_512K,
&&&&&& [2]= {
&&&&&&&&&&&&& .name&&&&& = &Kernel&,
&&&&&&&&&&&&& .offset= SZ_2M,
&&&&&&&&&&&&& .size = SZ_4M,
&&&&&& [3]= {
&&&&&&&&&&&&& .name&&&&& = &rootfs&,
&&&&&&&&&&&&& .offset&&&& = SZ_8M,
&&&&&&&&&&&&& .size = SZ_8M,
5.改变内核的ECC类型
在drivers/mtd/nand/s3c2410.c文件内
第846行中的NAND_ECC_SOFT改为NAND_ECC_NONE,即:
&&&&&& chip-&ecc.mode&&&&& &&&= NAND_ECC_NONE;
此处如果不改,虽然能够启动linux内核,但无法加载根文件系统。
6.编译内核
退回到linux-3.4.6的根目录下,复制配置文件:
cp &arch/arm/configs/s3c2410_defconfig &&.config
使用menuconfig来配置内核:
make &menuconfig
在KernelFeatures下选上两项内容,即
Kernel Features ---&
&&&&&&&&&&&&&&&&[*]Use the ARM EABI to compile the kernel
&&&&&&&&&&&&&&&&[*]Allow old ABI binaries to run with this kernel (EXPERIMENTAL)
如果不选择这两项,则在内核启动完,挂载根文件系统时会出现kernel panic:attempted to kill init的错误。
menuconfig的其他内容可以不需要改变,选择默认即可。
最后执行下面两个命令:
make clean
make zImage
等待一段时间后,在arch/arm/boot/目录下会生成zImage文件。
7.制作内核镜像
在上一步虽然我们已经生成了zImage文件,但它还不能被uboot正确引导,我们还需要给zImage文件加上64个字节的数据头,这部分内容包括CPU架构(A)、操作系统(O)、镜像类型(T)、压缩类型(C)、镜像名称(n)、镜像加载地址(a)、镜像入口(e)、源文件(d)。只有加上这些内容uboot才能正确引导内核。
mkimage工具就是uboot用来制作完成上述内容的工具。编译过uboot后,会在tools目录下生成mkimage。为了更方便地应用该工具,我们需要完成下列操作,进入tools目录,以根用户的身份执行下列命令:
cp &&mkimage&&/usr/bin
chmod &&777 &&/usr/bin/mkimage
进入linux-3.4.6目录下的arch/arm/boot/目录,执行下列命令:
mkimage &-n &'linux' &-A &arm &-O &linux &-T&kernel &-C &none&-a &0x &-e 0x &-d &zImage&uImage.img
uImage.img为最终我们需要烧写到nandflash中的文件。在这里,我们是把镜像加载到内存0x地址内的。
8.最后,我们把uImage.img文件烧写到nandflash中的0xx600000中。
三、根文件系统的制作
我们利用busybox来制作根文件系统
1.在下列网站下载busybox-1.15.0.tar.bz2
在当前目录下解压busybox
tar -jxvf busybox-1.15.0.tar.bz2
2.配置编译busybox
使用menuconfig来配置busybox:
make &menuconfig
修改下列内容:
Busybox Settings& ---&&
&&&& Build Options& ---&&
&&&&&& [*] Build BusyBox as a staticbinary (no shared libs) (编译成静态库)
&&&& Busybox Library Tuning& ---&&&
&&&&&& [*]&&&Tabcompletion&&&&&&&& (tab缩进功能)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&& [*]&&&&&Usernamecompletion&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&& [*]&&&Fancy shellprompts& (这两项在创建/etc/profile文件时要用,这样可以命令行有提示符显示)
只需修改上述几个选项,其他配置可以不去改动。
修改Makefile
emacsMakefile
在第164行,改为:
CROSS_COMPILE?=arm-linux-
在第190行,改为:
ARCH ?=arm
执行make命令编译busybox
3.利用下面命令安装busybox:
Make &CONFIG_PREFIX=/home/zhaocj/rootfs &&&&&& install
其中/home/zhaocj/rootfs为指定的安装目录,如果还没有该目录,则需先要用mkdir命令创建该目录。之所以要指定目录,就是为了改变系统默认生成的_stall目录。
安装完毕后,会在/home/zhaocj/rootfs目录下生成bin、linuxrc、sbin、usr这四个目录和文件。
4.进入rootfs目录,自行添加其他目录和文件
首先要创建etc目录,以及在该目录下生成四个文件:etc/inittab、etc/fstab、etc/profile、etc/init.d/rcS
mkdir &etc
emacs &inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:umount-a -r
emacs &fstab
#device&&&&&& mount-point&&& type&&options&&& dump& fsck&order
proc&&&&&&&&& /proc&&&&&&&&& proc&&& defaults&&&0&&& 0
sysfs&&&&&&&&&& /sys&&&&&&&&&& sysfs&& defaults&&&0&& 0
tmpfs&&&&&&&&& /temp&&&&&&&& tmpfs&&& defaults&&&&0&& 0
tmpfs&&&&&&&&&& /dev&&&&&&&&& tmpfs&& defaults&&&0&&& 0
emacs &profile
exportHOSTNAME=zhaocj
exportUSER=root
exportHOME=root
exportPS1=&[$USER@$HOSTNAME \W]\#&
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
exportPATH LD_LIBRARY_PAT
mkdir &init.d
emacs &init.d/rcS
mkdir/dev/pts
mount -tdevpts devpts /dev/pts
echo/sbin/mdev & /proc/sys/kernel/hotplug
在根用户下增加该文件的执行权限
chmod &#43;xrcS
回到主目录下,创建其他目录:
mkdir &dev &home&temp &proc &sys
进入dev目录,并用根用户创建两个基本的设备文件:
mknod &console &c &5 &1
mknod &null &c &1 &3
至此,根文件系统创建完毕。
5.生成cramfs根文件系统
在这里我们要使用cramfs根文件系统,并把它烧写到nandflash中,因此要有编译cramfs的制作工具。在下列网站下载cramfs-1.1.tar.gz。
在当前目录下解压cramfs-1.1.tar.gz,并编译:
tar zxvfcramfs-1.1.tar.gz
编译完成后,会生成mkcramfs和cramfsck两个可执行文件,其中mkcramfs工具是用来创建cramfs文件系统的。
利用mkcramfs压缩根文件系统,生成cramfs:
mkcramfs &rootfs &root-cramfs
rootfs为刚刚制作的根文件系统的目录,root-cramfs为最终生成的cramfs根文件系统。
6.最后,我们把root-cramfs文件烧写到nandflash中的0xx1000000中。
当完成以上三个部分内容后,uboot就能够正确引导linux内核以及加载根文件系统了。下面列出了uboot启动后在串口显示的内容:
U-Boot2011.06 (Aug 31 2012 - 15:08:19)
DRAM:& 64 MiB
Flash: ##Unknown flash on Bank 1 - Size = 0x = 0 MB
NAND:& 256 MiB
***Warning - bad CRC, using default environment
In:&&& serial
Out:&& serial
Err:&& serial
Net:&& dm9000
Hit anykey to stop autoboot:& 0
NANDread: device 0 offset 0x200000, size 0x4304 bytes read: OK
##Booting kernel from Legacy Image at
&& Image Name:&&linux
&& Created:&&&&&& 14:46:43 UTC
&& Image Type:&&ARM Linux Kernel Image (uncompressed)
&& Data Size:&&&2428888 Bytes = 2.3 MiB
&& Load Address:
&& Entry Point:&
&& Verifying Checksum ... OK
&& XIP Kernel Image ... OK
Startingkernel ...
UncompressingLinux... done, booting the kernel.
BootingLinux on physical CPU 0
Linuxversion 3.4.6 (zcj@qihao) (gcc version 4.2.2) #3Sat Sep 1 22:44:40 CST 2012
CPU:ARM920T [] revision 0 (ARMv4T), cr=
CPU: VIVTdata cache, VIVT instruction cache
Machine:SMDK2440
Memorypolicy: ECC disabled, Data cache writeback
CPU S3C2440A(id 0x)
S3C24XX Clocks, Copyright 2004 SimtecElectronics
S3C244X: core 400.000 MHz, memory 100.000MHz, peripheral 50.000 MHz
CLOCK:Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1zonelists in Zone order, mobility grouping on.&Total pages: 16256
Kernelcommand line: root=/dev/mtdblock3 ro noinitrd init=/linuxrcconsole=ttySAC,115200 rootfstype=cramfs mem=64M
PID hashtable entries: 256 (order: -2, 1024 bytes)
Dentrycache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cachehash table entries: 4096 (order: 2, 16384 bytes)
Memory:64MB = 64MB total
Memory:5k available, 5556k reserved, 0K highmem
Virtualkernel memory layout:
&&& vector&: 0xffff0000 - 0xffff1000&& (&& 4 kB)
&&& fixmap&: 0xfff00000 - 0xfffe0000&& ( 896kB)
&&& vmalloc : 0xc4800000 - 0xff000000&& ( 936 MB)
&&& lowmem&: 0xc0000000 - 0xc4000000&& (& 64 MB)
&&& modules : 0xbf000000 - 0xc0000000&& (& 16MB)
&&&&& .text : 0xc0108000 - 0xc0545868&& (4343 kB)
&&&&& .init : 0xc0546000 - 0xc0570000&& ( 168 kB)
&&&&& .data : 0xc0570000 - 0xc05a67a0&& ( 218 kB)
&&&&&& .bss : 0xc05a67c4- 0xc05cf1dc&& ( 163 kB)
NR_IRQS:99
irq:clearing subpending status
sched_clock:32 bits at 200 Hz, resolution 5000000ns, wraps every ms
Console:colour dummy device 80x30
Calibratingdelay loop... 49.56 BogoMIPS (lpj=123904)
pid_max:default: 32768 minimum: 301
Mount-cachehash table entries: 512
CPU:Testing write buffer coherency: ok
Settingup static identity map for 0x- 0x3043561c
gpiochip_add:registered GPIOs 0 to 23 on device: GPIOA
gpiochip_add:registered GPIOs 32 to 47 on device: GPIOB
gpiochip_add:registered GPIOs 64 to 79 on device: GPIOC
gpiochip_add:registered GPIOs 96 to 111 on device: GPIOD
gpiochip_add:registered GPIOs 128 to 143 on device: GPIOE
gpiochip_add:registered GPIOs 160 to 167 on device: GPIOF
gpiochip_add:registered GPIOs 192 to 207 on device: GPIOG
gpiochip_add:registered GPIOs 224 to 234 on device: GPIOH
gpiochip_add:registered GPIOs 256 to 271 on device: GPIOJ
NET:Registered protocol family 16
S3C Power Management, Copyright 2004Simtec Electronics
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C244X: Clock Support, DVS off
bio:create slab &bio-0& at 0
SCSIsubsystem initialized
usbcore:registered new interface driver usbfs
usbcore:registered new interface driver hub
usbcore:registered new device driver usb
s3c-i2cs3c2440-i2c: slave address 0x10
s3c-i2cs3c2440-i2c: bus frequency set to 97 KHz
s3c-i2cs3c2440-i2c: i2c-0:S3C I2C adapter
AdvancedLinux Sound Architecture Driver Version 1.0.25.
NET:Registered protocol family 2
IP routecache hash table entries: 1024 (order: 0, 4096 bytes)
TCPestablished hash table entries: 2048 (order: 2, 16384 bytes)
TCP bindhash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hashtables configured (established 2048 bind 2048)
TCP: reno registered
UDP hashtable entries: 256 (order: 0, 4096 bytes)
UDP-Litehash table entries: 256 (order: 0, 4096 bytes)
NET:Registered protocol family 1
RPC:Registered named UNIX socket transport module.
RPC:Registered udp transport module.
RPC:Registered tcp transport module.
RPC:Registered tcp NFSv4.1 backchannel transport module.
NetWinderFloating Point Emulator V0.97 (extended precision)
jffs2:version 2.2. (NAND) (SUMMARY)& (C) Red Hat, Inc.
ROMFS MTD(C) 2007 Red Hat, Inc.
msgmnihas been set to 117
ioscheduler noop registered
ioscheduler deadline registered
ioscheduler cfq registered (default)
Console:switching to colour frame buffer device 30x40
fb0: s3c2410fb frame buffer device
Serial: driver, 4 ports, IRQ sharing enabled
s3c2440-uart.0: ttySAC0 at MMIO 0x(irq = 70) is a S3C2440
console[ttySAC0] enabled
s3c2440-uart.1: ttySAC1 at MMIO 0x(irq = 73) is a S3C2440
s3c2440-uart.2: ttySAC2 at MMIO 0x(irq = 76) is a S3C2440
lp:driver loaded but no devices found
ppdev:user-space parallel port driver
brd:module loaded
loop:module loaded
UniformMulti-Platform E-IDE driver
ide-gddriver 1.18
ide-cddriver 5.00
S3C24XX NAND Driver, (c) 2004 SimtecElectronics
s3c24xx-nand s3c2440-nand: Tacls=2, 20ns Twrph0=6 60ns, Twrph1=220ns
s3c24xx-nand s3c2440-nand: NAND ECC disabled
NANDdevice: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
NAND_ECC_NONEselected by board driver. This is not recommended!
Scanningdevice for bad blocks
Baderaseblock 615 at 0x00
Baderaseblock 807 at 0x0
Creating4 MTD partitions on &NAND&:
0x-0x: &UBoot&
0x-0x: &Para&
0x-0x: &Kernel&
0x-0x: &rootfs&
dm9000Ethernet Driver, V1.31
ohci_hcd:USB 1.1 'Open' Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci: S3C24XXOHCI
s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned busnumber 1
s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x
hub1-0:1.0: USB hub found
hub1-0:1.0: 2 ports detected
usbcore:registered new interface driver libusual
usbcore:registered new interface driver usbserial
usbcore:registered new interface driver usbserial_generic
USBSerial support registered for generic
usbserial:USB Serial Driver core
usbcore:registered new interface driver ftdi_sio
USB Serialsupport registered for FTDI USB Serial Device
ftdi_sio:v1.6.0:USB FTDI Serial Converters Driver
usbcore:registered new interface driver pl2303
USBSerial support registered for pl2303
mousedev:PS/2 mouse device common for all mice
s3c2410_wdt: S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irqdisabled
TCP:cubic registered
NET:Registered protocol family 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
ALSAdevice list:
& No soundcards found.
VFS:Mounted root (cramfs filesystem) readonly on device 31:3.
Freeinginit memory: 168K
Pleasepress Enter to activate this console.
当我们按下回车键后,会看到linux的提示符:
[root@zhaocj /]#
在该提示符下就可以运行一些linux命令了,如:
[root@zhaocj /]#ls
bin&&&&& etc&&& &&lib&&&&&proc&&&& sys&&&&& usr
dev&&&&& home&&&&linuxrc& sbin&&&& temp
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:559256次
积分:7628
积分:7628
排名:第2229名
原创:88篇
评论:2576条
(3)(1)(1)(2)(2)(1)(4)(2)(2)(1)(2)(1)(1)(2)(2)(2)(2)(1)(2)(2)(2)(5)(3)(2)(2)(1)(2)(2)(2)(1)(3)(3)(1)(1)(2)(1)(2)(2)(6)(3)(6)

我要回帖

更多关于 qt移植到开发板 的文章

 

随机推荐