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

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

 

本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,  www.2cto.com  

引导失败等情况时如何重新烧写uboot/kernel.

 

烧写uboot/kernel的方式一般有两种,一种是在linux本身(shell中),直接将uboot/kernel的影像文件(二进制文件)使用操作烧写flash的命令烧写到flash特定分区上,

 

另一种是在uboot界面上,通过配置serverip,ipaddr,使用tftp命令下载uboot/kernel到flash上

 

例子如下:

 

//一,在linux的shell中烧写uboot/kernel

 

mtd write命令是自定义的烧写flash命令。

 

//烧写uboot ,/dev/mtd0 是bootloader 的特定分区

 mtd write u-boot.bin /dev/mtd0 

 

//烧写kernel, mtd1 是kernel的特定分区

mtd write vmlinux.elf /dev/mtd1

 

//重启

reboot 

 

//二,在uboot界面中烧写uboot/kernel,以kernel为例子

 

//在bootloader 界面中

 

//本机uboot 的ip地址

setenv ipaddr 10.10.167.10

 

//服务器ip地址

setenv serverip 10.10.167.249

 

//下载linux内核vmlinux52

tftpboot 0 vmlinux52

 

// 烧写到flash 上。

// 0x20000000 是vmlinux52的存贮位置。 

// 0x1dd00000 是系统内核的起始位置(每个设备位置不同), 

// +0x600000是文件长度

upgrade 0x20000000 0x1dd00000 +0x600000

 

// 重启linux

 

bootoctliux

 

*************************************** **

 

如果因为uboot或者内核有错误而导致启动失败,出现卡死状态等,那么需要判断问题是出在uboot阶段还是linux阶段,这可以通过观察启动过程中的debug信息来判断,

 

如果uboot出现问题是比较麻烦的,因为这需要有一个装有正确的uboot/bootloader的flash芯片作为引导,

 

将系统重新引导至uboot界面中,之后再重新烧写uboot到系统本身的flash中,进而烧写内核(如有必要)。 

 

一,重新烧写uboot

 

首先需要一个特定的PCLL(flash芯片),这个PCLL上固化了一个正确的bootloader, 通过这个bootloader可以成功进入bootloader界面, 在此条件下重新烧写uboot/bootloader。

 

使用此PLCC的步骤是:

 

在系统下电情况下, 使用跳线/拨码开关等将此系统的启动方式变从外部flash(即PLCC)引导,

 

之后将系统上电, 这时会从PLCC 启动。

 

启动成功后,进入uboot界面,  即命令行显示Dream 5220# #(类似命令行提示符)

 

此时将版卡的启动方式变为 从 nor flash 启动。  之后重新烧写uboot到此nor flash 上。  

 

再用 kermit  来操作。

 

Kermit是一个串口服务工具,类似与minicom ,功能比minicom 多。

 

//kermit/usb0.cfg  是kermit 的配置文件, 在其中可以配置 /dev/ttyUSB0 等路径

kermit -y kermit/usb0.cfg

 

-y kermit/usb0.cfg   指定配置文件。

 

该文件内容如下:

/*

 

set line /dev/ttyUSB0                                                                                                                

set speed 115200

set carrier-watch off 

set hardshake none

set flow-control none

robust

set file type bin 

set file name lit 

set rec pack 1000

set send pack 1000

set window 5

 

*/

将此文件保存在主目录下, 命名为:kermit/usb0.cfg(可自定义)

 

执行后进入kermit 界面, 按 c 

 

进入 串口界面(就是设备的界面)

 

切换回kermit 界面快捷键:Ctrl + \  , 之后再按 c  。

 

执行:

Dream 5220# # detect  

 

显示:

Checking for NOR flash...

Flash detect 33554432Mb

 

这说明flash状态良好。

 

//让串口进入接受状态。

Dream 5220# # loadb 

 

进入kermit 界面: ctrl + \  按 c

 

执行:

send  uboot.bin

 

就是将当前目录下的uboot.bin 文件发送给串口。

 

完成后,进入串口界面。

 

执行:

Dream 5220# # upgrade 0x20000000 0x1dc00000 +0xe0000

 

0x20000000 是 kermit 执行 send  后 将文件send 到的默认地址。

再将文件写到nor flash 的首地址:0x1dc00000  +0xe0000为写的长度。

 

执行:reset。让系统重启。

 

/*

 

至此,新的uboot烧写完成,reset后, 如果还是不成功的话,那么问题肯定出在linux的的启动阶段或者新的uboot还是有问题,这可以通过启动过程中的debug信息看出来

 

一,如果内核有问题,导致linux没有进入shell界面,要重新进入Uboot环境,就是在reset 之后,一直按 ctrl + c  ,这样在uboot启动完成后, 不会进入kernel的启动阶段,而是停留在uboot的命令行中,

 

在这个uboot 环境下,烧写新内核, 配置ipaddr,serverip等,同最开始的例子中操作是一样的。

 

//本机uboot 的ip地址

setenv ipaddr 10.10.167.10

 

//服务器ip地址

setenv serverip 10.10.167.249

 

//下载linux内核vmlinux52

// 在服务器的tftpboot目录下存在相应文件,搭建到tftp服务环境

tftpboot 0 vmlinux52

 

// 烧写到flash 上。

// 0x20000000 是vmlinux52的存贮位置。 

// 0x1dd00000 是系统内核的起始位置(每个设备位置不同), 

// +0x600000是文件长度

upgrade 0x20000000 0x1dd00000 +0x600000

 

在reset 之前,一般还要设置一下环境变量。

 

比如

 

setenv linux_args mtdparts=octeon_nor0:1m(BOOT),7m(LINUX),21m(CONFIG),3m(MD)

 

setenv bootcmd 'bootoctlinux 0x1dd00000 coremask=0x3 mem=700'

 

//保存

saveenv

 

bootoctliux

 

二 ,如果新烧写的uboot本身有问题,那么修改uboot代码,编译通过后, 使用PLCC重复上述烧写过程。

时间: 2024-11-02 02:17:22

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

手把手教你烧写烧写u-boot、kernel、rootfs(目标平台S3C2410)

内核分区空间: Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit": 0x00000000-0x00080000 : "Bootloader" 0x00080000-0x00280000 : "Linux Kernel" 0x00280000-0x00680000 : "Root File System" 0x00680000-0x04000000 : "User

友善之臂tiny4412-1306开发板安卓系统烧写

折腾了很久,终于烧写成功.不废话,咱们说说流程吧. 首先,我们需要有一个基于tiny4412的kernel,从友善之臂官网获取. 然后解压: 1.tar -xvf  linux-3.5 .... 然后cp  tiny4412-android_deconfig  .config 接下来make zImage 在 arch/arm/boot/生成对应的zImage ,这个也就是我们的kernrl. 当然在此之前,我们需要安装交叉编译工具arm-linux-gcc.没有的话就装上这个环境,arm-li

S3c2440如何利用JLINK烧写U-boot到NAND Flash中

      很多同学使用笔记本作为自己的ARM开发和学习的平台,绝大多数笔记本都没有并口,也就是无法使用JTag调试和烧写程序到Nand Flash中,幸好我们还有JLINK,用JLINK烧写U-boot到Nor Flash中很简单,大部分NOR Flash都已经被JLink的软件SEGGER所支持,而新手在学习的时候经常会实验各种各样的命令,最悲剧的莫过于将NAND Flash中原有的bootloader给删除了,这时候开发板上电后由于没有bootloader,硬件没有被初始化,在NAND F

Jlink 烧写Uboot

  第一章 Hi3531_SDK_Vx.x.x.x版本升级操作说明    如果您是首次安装本SDK,请直接参看第2章.     第二章首次安装SDK 1.Hi3531 SDK包位置     在"Hi3531_V100R001***/01.software/board"目录下,您可以看到一个Hi3531_SDK_Vx.x.x.x.tgz 的文件, 该文件就是Hi3531的软件开发包.   2.解压缩SDK包     在linux服务器上(或者一台装有linux的PC上,主流的linux发

Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

  很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot-2009.03差别不大,只不过这个u-boot-2009.03是从TI的网站上下载的,是DAVINCI系列最新的u-boot,也适合DM6467和DM365/368,移植的方法承接<Davinci DM6446开发攻略--u-boot-1.3.4移植(1)>,而本篇着重介绍nand flas

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

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

uboot从SD卡烧写内核和文件系统

环境:ubuntu 13.04一.首先制作sd启动盘: 插入SD卡    sudo dd iflag=dsync oflag=dsync if=tiny210v2-uboot.binof=/dev/mmcblk0 seek=1 tiny210v2-uboot.bin来自:  http://www.arm9home.net/read.php?tid-80476.html二.SD卡分区   卸载SD卡,  sudo /sbin/fdisk /dev/mmcblk0     如果你的SD卡上有几个分区

u boot-非uboot模式下,能否烧写程序?

问题描述 非uboot模式下,能否烧写程序? 最近在看有关uboot的资料,突然想到如果我烧写内核的时候,一定要在uboot的模式下吗?可否在非uboot的模式下进行烧写内核. 解决方案 SJFS如何烧写uboot通过uboot烧写yaffs文件系统

FL2440使用J-Link烧写Nand&amp;gt; Flash遇到CPU is not halted!

烧写U-boot遇到了很多问题,在自己坚持不懈的努力下终于把问题都解决了,全是自己的总结,希望对新手带来帮助.下面啊解答方式是一个网友跟我说的,我发现这是一个不正确的解答,其实用其他版本的驱动是一样的,运行的时候只需要先输入"h"命令就不会出现CPU is not  halted!. 遇到的问题:我在使用Jlink V8调试FL2440时,setpc 0命令执行时,总是显示"CPU is not halted !" SEGGER J-Link Commander V