用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别

原文:http://blog.sina.com.cn/s/blog_6b94d5680100nd48.html

文章结构
结构顺序有变化
-1:烧写uboot
0: bootargs bootcmd 命令参数的设置
1:制作yaffs2的过程
2:烧写yaffs2的过程
3:制作uimage 的过程
4: 烧写uiamge的过程
5:uimage zimage vmlinux 的区别
6: uboot传递给内核的参数结构 tag
7:bootm go 的 启动过程 以及区别
8:加载地址 入口地址 等

///////////////////通过uboot烧写uboot到nandflash/////////////
//////////////
nand  erase  0  50000
//////////////
tftpboot  30008000  u-boot.bin
/////
Loading: T ##################
done
Bytes transferred = 257164 (3ec8c hex)
[[email protected]]# nand  write  0x30008000  0  3f000
//////////////
nand  write  0x30008000  0  3f000( 3ec8c最靠近2K整数倍的值 )

///////////////////通过uboot烧写内核到nandflash/////////////
先查看你自己板子的nandflash分区表
通过实例分析:下面的烧写内核出错
[[email protected]]# tftpboot 30008000 uImage
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:08:11:18:12:27
operating at 100M full duplex mode
Using dm9000 device
TFTP from server 192.168.0.100; our IP address is 192.168.0.10
Filename ‘uImage‘.
Load address: 0x30008000
Loading: T #################################################################
         #################################################################
         ##########################
done
Bytes transferred = 2287128 (22e618 hex)
[[email protected]]# nand erase 0x60000 0x500000

NAND erase: device 0 offset 0x60000, size 0x500000
Erasing at 0x54000002800000 --   0% complete.
OK
[[email protected]]# nand write 0x30008000 0x60000 22e618
NAND write: device 0 offset 0x60000, size 0x22e618
Attempt to write non page aligned data
 2287128 bytes written: ERROR
下面的烧写正确:
NAND erase: device 0 offset 0x80000, size 0x500000
Erasing at 0x54000002800000 --   0% complete.
OK
[[email protected]]# nand write 0x30008000 0x80000 22e800
NAND write: device 0 offset 0x80000, size 22e800
改了两个地方:
1:0x60000 ->0x80000
2:0x22e618 ->22e800
修改的原因是:1:从0x60000檫除 会把bootargs bootcmd 也给檫除了 所以选择从0x80000开始檫除
2:0x22e618 虽然是通过tftpboot下载的内核的实际大小,但是这里是write指令 后面的参数是指明要檫写的长度  檫写长度要求是2k(2048)的整数倍(也就是整页 整页的檫除) 而0x22e618 不是2K的整数倍 ,出现错误Attempt to write non page aligned data  2287128 bytes written: ERROR ,于是取一个最靠近的数  就选择了22e800 就OK乐
/////////////////////设置自启动参数bootcmd///////////////////
我刚开始时 是这样写的:
setenv  bootcmd  nand read 30008000 80000 22e800 ; bootm 30008000
按确定后 直接执行了bootm这个命令 于是改了:
setenv  bootcmd  nand read 30008000 80000 22e800 \; bootm 30008000 就OK了
/////////////////////下载yaffs2映像到nandflash中/////////////////////////
生产yaffs2 以及工具请可以参考Tekkaman Ninja 的文件 uboot 烧写yaffs2文件系统
方法是类似于内核的烧写
先查看你自己板子的nandflash分区表( 比如128M的板子 128M ->8000000 檫写地址是从0x580000开始 所以 两个相减 等于 7a80000 而我的是256M的 前面的内核是从0x80000开始的 檫除了0x500000 长度 所以这里文件系统 从0x580000 开始 结束到 nandflash的结束  )
128M
先察除:nand erase 0x580000 7a80000 
再写  :nand write.yaffs 30008000 0x580000 dbb040(文件系统的大小,而这里文件系统 不像内核一样 烧写长度 不是2K的整数倍 我不确定我从网络上找到的答案是否是对的,自己也没有去查证:用mkyaffs2image 生成的文件系统 在2K数据对齐的问题上 已经采取了对齐措施 用户不用在考虑数据对齐的问题,而mkimage等工具没有采用对齐措施 所以是要注意)
256M:
先察除:nand erase 0x580000 FA80000 
再写  :nand write.yaffs 30008000 0x580000 dbb040
///////////设置bootargs参数////////////////////////////////////
1:如果用yaffs2文件系统
setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
2:如果用NFS文件系统
setenv bootargs noinitrd root=/dev/nfs rw nfsroot= 192.168.0.100 :/ home/lq/rootfs ip=192.168.0.10 console=ttySAC0 mem=64M
///////////////bootatgs 参数解析/////////////////////////
root
用来指定rootfs的位置, 常见的情况有:
    root=/dev/ram rw   
    root=/dev/ram0 rw
  请 注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝 试。
    root=/dev/mtdx rw
    root=/dev/mtdblockx rw
    root=/dev/mtdblock/x rw
    root=31:0x
上 面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系 统支持上面那种情况下,不过root=/dev/mtdblockx rw比较通用。此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。
    root=/dev/nfs
在文件系统为基于nfs的文件系统的时候使用。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,即指明文件系统存在那个主机的那个目录下面。
B. rootfstype
    这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.
C. console
console=tty  使用虚拟串口终端设备 .
console=ttyS[,options] 使用特定的串口,options可以是这样的形式bbbbpnx,这里bbbb是指串口的波特率,p是奇偶位(从来没有看过使用过),n是指的bits。
console=ttySAC[,options] 同上面。
看 你当前的环境,有时用ttyS,有时用ttySAC,网上有人说,这是跟内核的版本有关,2.4用ttyS,2.6用ttySAC,但实际情况是官方文档 中也是使用ttyS,所以应该是跟内核版本没有关联的。可以查看Documentation/serial-console.txt找到相关描述。
D. mem
mem=xxM 指定内存的大小,不是必须的
E. ramdisk_size
ramdisk=xxxxx           不推荐   
ramdisk_size=xxxxx   推荐
上 面这两个都可以告诉ramdisk 驱动,创建的ramdisk的size,默认情况下是4m(s390默认8M),你可以查看Documentation/ramdisk.txt找到相关 的描述,不过ramdisk=xxxxx在新版的内核都已经没有提了,不推荐使用。
F. initrd, noinitrd
当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。
G. init
init 指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc, 或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操 作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢 了。
H. mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要 想这个参数起作用,内核中的mtd驱动必须要支持,即内核配置时需要选上Device Drivers  ---> Memory Technology Device (MTD) support  ---> Command line partition table parsing
mtdparts的格式如下:
mtdparts=[;
  := :[,]
  := [@offset][][ro]
   := unique id used in mapping driver/device
    := standard linux memsize OR "-" to denote all remaining space
    := (NAME)
因此你在使用的时候需要按照下面的格式来设置:
mtdparts=mtd-id:@(),@()
这里面有几个必须要注意的:
a.  mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效
b.  size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为‘-‘这表示剩余的所有空间。
举例:
假设flash 的mtd-id是sa1100,那么你可以使用下面的方式来设置:
mtdparts=sa1100:-     →  只有一个分区
mtdparts=sa1100:256k(ARMboot)ro,-(root)  →  有两个分区
可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。
I. ip
指定系统启动之后网卡的ip地址,如果你使用基于nfs的文件系统,那么必须要有这个参数,其他的情况下就看你自己的喜好了。设置ip有两种方法:
ip = ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
4). 假设文件系统是基于nfs的,bootargs的设置应该如下
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’
或者
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
//////////bootm go 的 启动过程 以及区别/////////////////////
Bootm命令在/common/cmd_bootm.c中do_bootm函数中
//////////////////
通过mkimage这个tool可以给zImage添加一个header:
typedef struct image_header
{
  uint32_t ih_magic;
  uint32_t ih_hcrc; 
  uint32_t ih_time; 
  uint32_t ih_size; 
  uint32_t ih_load; 
  uint32_t ih_ep;   
  uint32_t ih_dcrc; 
  uint8_t  ih_os;   
  uint8_t  ih_arch; 
  uint8_t  ih_type; 
  uint8_t  ih_comp; 
  uint8_t  ih_name[IH_NMLEN];   
} image_header_t;
这个头的大小是 0x40  64个字节,64byte的信息,供建立tag之用,通过tag 传递参数给内核
mkimage 参数说明:
对于ARM linux内核映象用法:
-A arm    -------- 架构是arm
-O linux  -------- 操作系统是linux
-T kernel -------- 类型是kernel
-C none/bzip/gzip   -------- 压缩类型
-a 30008000  ---- image的载入地址(hex),通常为0xX00008000
-e 300080XX  ---- 内核的入口地址(hex),XX为0x40或者0x00
-n linux-XXX --- image的名字,任意
-d nameXXX   ---- 无头信息的image文件名,你的源内核文件
uImageXXX    ---- 加了头信息之后的image文件名,任意取

mkimage -n ‘liquan_kernel‘ -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage A_zImage
mkimage -n ‘liquan_kernel‘ -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage B_zImage
上面通过mkimage命令创建了两个带有bootm命令用的头的uImage内核映像
做过这样的一个实验:
1:
tftpboot 30008000 A_zImage
bootm 30008000
2:
tftpboot 31000000 B_zImage
bootm 31000000
都可以成功启动
对应第二个实验 如果在生产B_zImage时改为-a 0x30008000 -e 0x30008040 也就是说 内核的加载地址 与 内核的入口地址不一样 这样再tftpboot 31000000 B_zImage;bootm 31000000  这样就启动不了
tftpboot xxxx 内核映像
bootm    xxxx
对于非gzip压缩的内核映像( 非gzip压缩 请看下面 这里 -C none 没有压缩的 )
bootm命令会首先判断bootm xxxx 中xxxx是否与 mkimage 中 -a指定的加载地址相同。
1:相同
   如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部,再启动
2:不同
   如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之 所以这个情况下 是要求 -a 0x30008000 -e 0x30008000 也就是要求 内核入口地址与加载地址要相同就是这样要求 因为 已经没有头部了
对于gzip压缩过的内核:(解压内核到-a指定的地址 这个地址 这时也就是内核入口地址了)
因为u-boot要对其解压,因此tftpboot下载地址是不能等于-a指定的地址的,且必须有一定的间隔,否则解压到-a的内核会覆盖当前运行的程序 。此时要求-a等于-e指定的地址

///////////////////////各种压缩文件的区别//////////////////////////////////////////
通过内核的编译 会生产zImage  zImage是vmlinux经过gzip压缩后的文件,它们不仅是一个压缩文件,而且在这个文件的开头部分内嵌有gzip解压缩代码。
通过mkimage -C none/bzip2/gzip  可以决定是否生产的uImage 进行压缩(所以上面的uImage 是gzip压缩的)
如果mkimage -C bzip2/gzip 对zImage 进行了进一步的压缩 那么下载内sdram里面后 首先是bootm 实现针对mkimage -C bzip2/gzip 对uImage进行第一步解压(这部可以叫做u-boot解压) 然后再进行zImage的自解压(kernel自解压)
////////////////
zImage在前面已经被压缩了一次(这次的解压是自解压的 不是uboot压缩的 所以对于uboot来说 这个不是压缩文件),所以在用mkimage时 如果 -c 指定要压缩 那么U-boot 对内核添加头部时,可以对原来的zImage/Image添加了U-boot的压缩方式,使得生成的uImage变小。此时-c gzip 若不对zImage/Image用gzip命令压缩,则-c none。综合上面分析,mkimage的影响因子为:
-e     :内核的入口地址是否与-a相同
Tftpaddr:即将内核加载到RAM中运行的地址,决定是否搬运或解压内核,Tftpaddr 与-a指定的加载地址相同,如果 如果Tftpaddr 与-a 不同 则去掉头部后搬运至-a处运行,如果-c 压缩过 tftpboot 地址 还不能与-a 相同 以防覆盖
-c     :内核是否经过gzip压缩过,决定了是搬运还是解压 压缩的 就解压到-a的地址处  没有压缩的 如果Tftpaddr 与-a 不同 则去掉头部后搬运至-a处运行
/////////////////
vmlinux:
编译出来的最原始的内核文件,未压缩。 
zImage :
vmlinux经过gzip压缩后的文件,它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解 压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
bzImage:
bz表示“bigzImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。 
uImageU-boot:
专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。
vmlinuz:
bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage 或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。
////////////////////////bootm go 启动//////////////////////////////////////////////
通过仿真器可以很清晰的看到bootm先后完成了2部分工作。可以分析bootm源码
1.set bootargs 传递参数
2.set pc ,r0 ,r1
通过仿真器可以很清晰的看到go先后完成了2部分工作。可以分析bootm源码
go命令本质就是改变当前pc值
通过仿真器对go命令加以改造
a.将通用寄存器值改成
b.通过仿真器修改 0x08000100 地址的值
然后让程序执行,这样通过uboot也可以让zImage得以执行。

可见go和bootm差异就是 go只是改写pc值,而bootm 除了改PC外 传递r0,r1,r2还有bootargs
/////////////////bootm启动过程///////////////////////////////////////////////
Bootm命令在/common/cmd_bootm.c中do_bootm函数
 》》》》》》》》》》》获取当前内核的地址,默认地址或者bootm的第一个参数
默认的加载地址或传递给bootm命令(优先)与实际的内核存放地址需要一致
if (argc < 2) {
                addr = load_addr; // load_addr = CFG_LOAD_ADDR;
        } else {
                addr = simple_strtoul(argv[1], NULL, 16);
        }
printf ("## Booting image at lx ...\n", addr);
 
》》》》》》》》》》》》获得image头,没有mkimage的就返回了
memmove (&header, (char *)addr, sizeof(image_header_t));
 
》》》》》》》》》》》》打印头部信息
print_image_hdr ((image_header_t *)addr);
实例:
Image Name:   dd-kernel-2.4.19
   Image Type:   ARM Linux Kernel Image (gzip compressed)
   Data Size:    869574 Bytes = 849.2 kB
   Load Address: 20008000
   Entry Point:  20008000
 
》》》》》》》》》》》》校验image头部
printf ("   Verifying Checksum ... ");       printf ("OK\n");
 
》》》》》》》》》》》》检查image支持的体系结构即—A 选项是否为arm或者ppc等
 
》》》》》》》》》》》》检查image的类型
TYPE_MULTI 是否指内核与文件系统一起,内核后面有个分界线
switch (hdr->ih_type)
case IH_TYPE_KERNEL:
                name = "Kernel Image";
                break;
        case IH_TYPE_MULTI:
 
》》》》》》》》》》判断内核的压缩类型
此处的内核是否压缩非zImage和Image的概念,而是指内核在被mkimage处理前是否用gunzip等压缩过
switch (hdr->ih_comp) { 
        case IH_COMP_NONE:         // 非压缩内核
                if(ntohl(hdr->ih_load) == addr) {     
// 当前内核存放的地址与-a指定的一致,则不搬动,-e必须必-a大0x40
                       printf ("   XIP %s ... ", name);
                } else {
//当前内核存放的地址与-a指定的不一致,则将内核搬到-a地址,此时-a与-e必相同
memmove ((void *) ntohl(hdr->ih_load), (uchar *)data, len);
。。。。
case IH_COMP_GZIP:
                printf ("   Uncompressing %s ... ", name);
                if (gunzip ((void *)ntohl(hdr->ih_load), unc_len,
//压缩内核,将除去头部的内核解压到-a 指定的地址了,要求-a与-e相同
// 为防止解压缩时覆盖,对于压缩内核,内核存放地址最好在—a后面
                           (uchar *)data, (int *)&len) != 0) {
                       do_reset (cmdtp, flag, argc, argv);
                }
                break;
 
》》》》》》》》》》》》》》》》判断操作系统类型
switch (hdr->ih_os) {
        default:                   
        case IH_OS_LINUX:
            do_bootm_linux  (cmdtp, flag, argc, argv, addr, len_ptr, verify);       
//前四个为传给bootm的,addr为内核最初的存放地址,没有用处
            break;
 
#ifdef CONFIG_PPC
static boot_os_Fcn do_bootm_linux;
#else
extern boot_os_Fcn do_bootm_linux;
由上可知,对于ppc和其他体系结构的do_bootm_linux函数实现是不一样的
》》》》》》》》》》》》》》启动Linux内核
do_bootm_linux (cmd_tbl_t *cmdtp, int flag,
                int    argc, char *argv[],
                ulong        addr,
                ulong        *len_ptr,
                int    verify)
 
》》》》》》》》》》》》获取命令行参数
if ((s = getenv("bootargs")) == NULL)
                s = "";
        strcpy (cmdline, s);
 
》》》》》》》》》》》》赋内核启动地址
kernel = (void (*)(bd_t *, ulong, ulong, ulong, ulong))hdr->ih_ep;
注意,对于压缩过的内核,会将内核解压到-a指定的地址,此时-a 与-e 地址必须相同
 
》》》》》》》》》》》判断bootm的命令参数中是否有initrd
        if (argc >= 3) {
                addr = simple_strtoul(argv[2], NULL, 16);
                printf ("## Loading RAMDisk Image at lx ...\n", addr);
 
若有initrd则赋值,否则为0
 
》》》》》》》》》》》》》》》启动Linux内核

//*kbd = *(gd->bd); 在上面赋值的
        (*kernel) (kbd, initrd _start, initrd_end, cmd_start, cmd_end);

用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别,布布扣,bubuko.com

时间: 2024-10-01 08:51:13

用uboot 烧写uboot linux内核 文件系统到nandflash的 过程以及bootm go命令启动与区别的相关文章

通过NORFLASH中的uboot烧写uboot到nandFlash

在mini2440的教程中,在构建nandflash系统的时候是首先通过supervivi借助dnw烧写uboot.bin到nand flash 第零块, 由于我使用的是64位操作系统,usb驱动没安装成功,就尝试了其他方法烧写uboot.bin到nandflash,尝试了N多种方法都失败了, 静下心来一想,既然NORFLASh中的uboot可以启动,为什么不直接通过uboot烧写呢,于是就试了一下,UBOOT下用tftp下载到内存,然后用nand write 指令烧写,成功了

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflash或者nandflash:只好用另一块arm9(i.mx283a)来继续学习: 从开发教程上面可知,烧写uboot和Linux是通过各种批处理脚本和exe程序来执行的,称之为固件烧写,然而并没有需要我们选择uboot路径.Linux内核和文件系统的地方.这样的话是不是意味着只能烧写官方默认提供的文件

EASYARM-IMX283 烧写uboot和linux系统

新入手一台EASYARM-IMX283开发板(以下简称IMX823),价格比较便宜,配置也不错. 开发板默认安装了WINCE,我还是决定重新烧写uboot和linux内核. 开发板配套光盘里面有不少烧写工具,其中大部分都是windows平台下的工具,所以我选择从windows平台下执行烧写 . 参考光盘内的<EasyARM-iMX283 Linux开发指南 V1.03>(以下简称<IMX283开发指南>)烧写uboot和linux内核. 因为以前安装了WINCE,根据<<

嵌入式 hi3518c裸板uboot烧写、kernel烧写、fs烧写小结

1.在uboot中我可以添加自己的命令,添加的方法是找到一个uboot的命令,然后模仿着去增加属于自己的命令代码以及实现函数就可以 2.记住在使用printf进行调试的时候,在遇到指针或者字符串的时候最好使用“%x”,以为我不知道指针或者字符串中是否包含不可见字符,如果有不可见字符会导致错误,而且错误不好查找 3.对于uboot中的环境变量,其实是放在uboot里面的,也就是环境变量占用的是uboot的空间,如果不需要去实时修改环境变量的值那么就可以不用env这个分区:但是如果需要修改环境变量,

嵌入式系统烧写uboot/bootloader/kernel的一般方法

本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,  www.2cto.com 引导失败等情况时如何重新烧写uboot/kernel. 烧写uboot/kernel的方式一般有两种,一种是在linux本身(shell中),直接将uboot/kernel的影像文件(二进制文件)使用操作烧写flash的命令烧写到flash特定分区上, 另一种是在uboot界面上,通过配置serverip,ipaddr,使用tftp命令下载ub

mini2440 uboot烧写uImage

mini2440下烧写u-boot后,就可以用u-boot烧写linux内核了. 安装mkimage工具: apt-get install u-boot-tools 解压缩官方mini2440 linux包: tar xf linux-2.6.32.2-mini2440-20130614.tar.gz 然后进入文件夹,并进行编译(配置文件应该选择和自己的lcd对应的配置来进行拷贝,因为我的开发板没有屏幕,所以就随便选取了一个配置): cd linux-2.6.32.2cp config_mini

debian下使用ft232为stm32f429i-discovery烧写uboot和uImage

操作系统:debian 软件: openocd  minicom 硬件:  MiniUSB线.stm32f429i-discovery, WaveShare FT232串口模块(可以在淘宝上买到) 关于openocd的配置可以参看我的博文: <debian下烧写stm32f429I discovery裸机程序> u-boot源码下载: git clone https://github.com/EmcraftSystems/u-boot.git linux源码下载: git clone http

Tiny4412 烧写uboot到emmc步骤

将uboot写入emmc,并通过EMMC驱动,不在只用SD卡启动 烧写uboot的之前用如下命令查看EMMC卡信息及分区信息: mmcinfo 0: 查看mmc卡信息, 0表示SD卡:1表示emmc卡 fdisk -p 0: 查看mmc卡分区信息 1.格式化emmc卡: fdisk -c 320 809 524 :可参考前面查看的信息格式化 fatformat mmc 1:1 ext3format mmc 1:2 ext3format mmc 1:3 ext3format mmc 1:4 2.将

6410开发板sd卡启动时烧写u-boot.bin以及u-boot-spl-16k.bin步骤

参考文档:<SMDK6410_IROM_APPLICATION NOTE_REV 1.00>(可以从这里下载到> 参考博客:Tekkaman的博文<u-boot-2010.09 for mini6410 (add MMC support)> <Tiny6410_SMDK从SD卡直接启动裸板代码> <使uboot支持S3C6410的SD启动> <S3C6410开发全纪录(一)<还原SD卡启动的真相>> sd卡启动布局方式(假定一个