0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ARM以及启动和烧写等方面

电子设计 来源:电子设计 作者:电子设计 2022-02-18 13:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文所述的ARM的指的是Cortex A系列以及ARM9,ARM11,跑Linux操作系统。对于CortexM系列并不一定完全适用;

谈到ARM以及启动和烧写等方面,首先我们要明确一下几个关键词:Uboot,Cmdline,启动方式选择,文件系统格式,存储介质,如NAND,EMMC,SD卡等

下面一个一个做相关介绍:

启动方式:

① 一般CPU都可以配置为从多种介质启动,比如SPI Nor Flash,NAND,EMMC,SD卡,U盘等

② 大致原理是CPU内部ROM有一段固化的启动代码,根据CPU配置引脚,判断启动位置,然后从外部介质读取数据启动

③ 一般启动介质的前一部分代码的作用必须是:初始化硬件参数,自身拷贝

④ 关于自拷贝:因为CPU内部RAM很小,因此只能读取一部分启动介质的数据即Uboot到内部RAM运行,所以Uboot前一部分的工作需要将自身剩余部分拷贝到外部RAM中,然后加载运行

Uboot:

① 主要作用:引导Linux系统(主要是从存储介质的哪个地方读取Kernel,传递什么样的启动参数)

② 其他功能:支持很多命令,主要是存储控制和网络命令,最终目的还是引导和升级系统用

③ 常用操作:TFTP,NAS,Flash操作,UBI操作,Setenv,boot等

④ 一般升级系统流程:使用tftp方式从主机下载kernel及文件系统等文件,然后使用flash等命令烧写到存储介质如NAND,最后设定启动参数,然后引导系统启动;

⑤ 一般调试流程,介绍2种:

- 使用NAS从主机直接加载文件系统,直接在线调试,快捷方便

- 设定从SD卡启动,从SD卡加载kernel和文件系统调试

CMDLINE:

① 一般由Uboot传递给Kernel,或者Kernel中配置写死不过一般很少见

② 主要2个参数:

第一,指定console设备,用于打印输出及做控制台用

第二,指定rootfs挂载分区和类型

③ 看2个例子:

从NAND启动,/proc/cmdline,加载的是UBI文件系统,位置在mtd3

console=ttymxc0,115200 ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:5m(boot),10m(kernel),1m(dtb),-(rootfs)

从SD卡启动,/proc/cmdline,加载的是ext4文件系统,位置在sd卡第二分区mmcblk0p2

console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw rootdelay=5 mem=256M fstype=ext4 mtdparts=gpmi-nand:5m(boot),10m(kernel),1m(dtb),-(rootfs)

存储介质:

主要介绍Raw Flash 及 FTL devices区别

Flash特点:写入前需要先擦除,有寿命且不长,而且容易产生坏块

RAW Flash:即裸芯片,没有控制器,针对其主要操作有擦除,读和写

Device: 在裸芯片上加了控制器,比如SD卡,U盘等;加了控制器后,只需要读和写就行了,不需要擦除。控制器做了一系列的工作:擦除,磨损平衡,磨损算法等等,一个控制器算法的好坏直接决定了设备的使用寿命。

文件系统:

① FAT:windows常用文件系统,一般U盘,sd卡即为fat格式

② ext2/3/4,Linux常用文件系统,一般用于FTL Device,即只有读和写

③ JFFS2,Linux常用,一般用于容量较小的Flash,且是Raw Flash,MTD设备

④ UBIFS,Linux常用文件系统,只能用于Raw Flash,因为kernel ubi子系统,有相关的磨损平衡算法,可以保证效率

⑤ SD卡启动,文件系统挂载情况:

# mount

/dev/root on / type ext4 (rw,noatime,data=ordered)

proc on /proc type proc (rw,nosuid,nodev,noexec,noatime)

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,noatime)

tmpfs on /tmp type tmpfs (rw,nosuid,nodev,noatime)

tmpfs on /dev type tmpfs (rw,nosuid,relatime,size=512k,mode=755)

devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,mode=600)

debugfs on /sys/kernel/debug type debugfs (rw,noatime)

#

# cat /proc/mtd

dev: size erasesize name

mtd0: 00500000 00020000 “boot”

mtd1: 00a00000 00020000 “kernel”

mtd2: 00100000 00020000 “dtb”

mtd3: 0f000000 00020000 “rootfs”

⑥ NAND启动,文件系统挂载情况:

# mount

ubi0:rootfs on / type ubifs (rw,relatime)

devtmpfs on /dev type devtmpfs (rw,relatime,size=89164k,nr_inodes=22291,mode=755)

proc on /proc type proc (rw,relatime)

devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777)

tmpfs on /tmp type tmpfs (rw,relatime)

tmpfs on /run type tmpfs (rw,nosuid,nodev,relatime,mode=755)

sysfs on /sys type sysfs (rw,relatime)

#

# cat /proc/mtd

dev: size erasesize name

mtd0: 00500000 00020000 “boot”

mtd1: 00a00000 00020000 “kernel”

mtd2: 00100000 00020000 “dtb”

mtd3: 0f000000 00020000 “rootfs”

烧写过程:

① 一般从SD卡等外部方式启动,在Uboot中,使用flash命令及UBI命令分别烧写uboot,dtb,kernel,rootfs到对应的分区即可

② 第二使用芯片厂家的烧写工具,如nxp的 mfgtoos,在pc上通过usb烧写文件

③ 如已有uboot,在uboot中从sd卡,U盘等读取文件烧写;或tftp从pc下载文件烧写

升级过程:

① 此升级指的是Uboot OK的前提下做Uboot,kernel,rootfs等升级

② 通过SD卡升级,一般是首先在PC上制作SD卡启动分区,通过官方的工具烧写升级文件到SD卡即可;此处的升级文件分两个方面:

最小升级内核,并且包含升级脚本,此脚本会将目标文件烧写到存储介质中

目标升级文件,即要烧写到比如NAND中的文件

③ 以NXP SD卡升级为例说明此过程:

首先是Uboot启动过程:

U-Boot 2016.03-mys-imx6ulx+gca7b81f (Apr 27 2017 - 07:55:51 +0800)

CPU: Freescale i.MX6ULL rev1.0 528 MHz (running at 396 MHz)

CPU: Commercial temperature grade (0C to 95C) at 39C

Reset cause: POR

Board: MX6ULL 14x14 EVK

I2C: ready

DRAM: 512 MiB

MMC: FSL_SDHC: 0, FSL_SDHC: 1

*** Warning - bad CRC, using default environment

Display: TFT43AB (480x272)

Video: 480x272x24

In: serial

Out: serial

Err: serial

switch to partitions #0, OK

mmc0 is current device

Net: Board Net Initialization Failed

No ethernet found.

Normal Boot

Hit any key to stop autoboot: 0

switch to partitions #0, OK

mmc0 is current device

switch to partitions #0, OK

mmc0 is current device

reading boot.scr

423 bytes read in 10 ms (41 KiB/s)

Running bootscript from mmc 。..

## Executing script at 80800000

reading zImage

6789824 bytes read in 302 ms (21.4 MiB/s)

reading mys-imx6ull-14x14-evk-gpmi-weim.dtb

36951 bytes read in 20 ms (1.8 MiB/s)

Kernel image @ 0x83000000 [ 0x000000 - 0x679ac0 ]

## Flattened Device Tree blob at 84000000

Booting using the fdt blob at 0x84000000

Using Device Tree in place at 84000000, end 8400c056

Starting kernel 。.

最小系统加载启动完毕后,运行升级脚本

VFS: Mounted root (ext4 filesystem) on device 179:2.

devtmpfs: mounted

Freeing unused kernel memory: 432K (80b54000 - 80bc0000)

INIT: version 2.88 booting

Starting udev

udevd[114]: starting version 3.1.5

random: udevd urandom read with 32 bits of entropy available

EXT4-fs (mmcblk0p2): re-mounted. Opts: data=ordered

bootlogd: cannot allocate pseudo tty: No such file or directory

FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

ALSA: Restoring mixer settings.。.

/usr/sbin/alsactl: load_state:1735: No soundcards found.。.

INIT: Entering runlevel: 5

Starting system message bus: dbus.

System update start 。..

prepare files are okay

升级脚本分析:

root@mys6ull14x14:/run/media/mmcblk0p2# cat usr/bin/flash_nand.sh

#!/bin/sh

part_uboot=0

part_kernel=1

part_dtb=2

part_rootfs=3

echo heartbeat 》 /sys/class/leds/user/trigger

mfg_path=/run/media/mmcblk0p1/mfg-images

//升级目标文件

uboot=${mfg_path}/u-boot.imx

kernel=${mfg_path}/zImage

dtb=${mfg_path}/gpmi-weim.dtb

rootfs=${mfg_path}/core-image-base.rootfs.tar.xz

if [ -d $mfg_path ] && [ -s $uboot ] && [ -s $kernel ] && [ -s $dtb ] && [ -s $rootfs ]

then

echo “prepare files are okay”

else

echo 0 》 /sys/class/leds/user/brightness

echo “file or directory not exist”

fi

直接使用Flash命令烧写Uboot到对应分区

echo “Flashing uboot”

flash_erase /dev/mtd${part_uboot} 0 0 && kobs-ng init -x -v ${uboot}

if [ $? -eq 0 ]

then

echo “Flash uboot okay”

else

echo “Flash uboot failed”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

直接使用Flash命令烧写kernel到对应分区

echo “Flashing kernel”

flash_erase /dev/mtd${part_kernel} 0 0 && nandwrite -p /dev/mtd${part_kernel} -p ${kernel}

if [ $? -eq 0 ]

then

echo “Flash kernel okay”

else

echo “Flash kernel failed”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

直接使用Flash命令烧写dtb到对应分区

echo “Flashing dtb”

flash_erase /dev/mtd${part_dtb} 0 0 && nandwrite -p /dev/mtd${part_dtb} -p ${dtb}

if [ $? -eq 0 ]

then

echo “Flash dtb file okay”

else

echo “Flash dtb file failed”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

烧写rootfs比较特别,此处是使用ubifs,因此需要先使用ubi命令在NAND上建立好文件系统格式

echo “Flashing rootfs”

flash_erase /dev/mtd${part_rootfs} 0 0

if [ $? -ne 0 ]

then

echo “erase /dev/mtd${part_rootfs} fail”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

ubiformat /dev/mtd${part_rootfs}

if [ $? -ne 0 ]

then

echo “format /dev/mtd${part_rootfs} fail”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

ubiattach /dev/ubi_ctrl -m ${part_rootfs}

if [ $? -ne 0 ]

then

echo “attach /dev/mtd${part_rootfs} fail”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

ubimkvol /dev/ubi0 -Nrootfs -m

if [ $? -ne 0 ]

then

echo “make volume /dev/mtd${part_rootfs} fail”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

mkdir -p /run/media/mtd${part_rootfs} /

&& mount -t ubifs ubi0:rootfs /run/media/mtd${part_rootfs}

if [ $? -ne 0 ]

then

echo “mount /dev/mtd${part_rootfs} fail”

echo 0 》 /sys/class/leds/user/brightness

exit

fi

建立好ubi格式之后,直接将rootfs压缩包解压到对应分区即可;

tar xvf ${rootfs} -C /run/media/mtd${part_rootfs}

if [ $? -eq 0 ]

then

echo “Flash filesystem okay”

sync && sync && sync

echo none 》 /sys/class/leds/user/trigger

echo 1 》 /sys/class/leds/user/brightness

else

echo “Flash filesystem failed”

echo 0 》 /sys/class/leds/user/brightness

umount /run/media/mtd${part_rootfs}

exit

fi

umount /run/media/mtd${part_rootfs}

echo “Programming success”

echo “You need reboot the board”

版权声明:本文为博主 WindLOR 原创文章,

遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/wind0419/article/details/77973144

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    135

    文章

    9499

    浏览量

    388768
  • 烧写
    +关注

    关注

    0

    文章

    58

    浏览量

    14817
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    迅为RK3588开发板Android系统及注意事项

    迅为RK3588开发板Android系统及注意事项
    的头像 发表于 12-03 15:17 5797次阅读
    迅为RK3588开发板Android系统<b class='flag-5'>烧</b><b class='flag-5'>写</b>及注意事项

    开发者指南 | 华为昇腾Ascend310B启动镜像制作与写全攻略

    在嵌入式Linux开发中,启动镜像的制作与是硬件部署的核心环节。本文详细解析华为昇腾Ascend310B启动镜像的完整流程,从环境搭建到
    的头像 发表于 11-24 18:03 1447次阅读
    开发者指南 | 华为昇腾Ascend310B<b class='flag-5'>启动</b>镜像制作与<b class='flag-5'>烧</b>写全攻略

    FLASH/编程白皮书

    白皮书:如何Flash——不同场景不同需求下的选择认识Flash NAND vs. NOR如何/编程不同方案比较
    发表于 07-28 16:05 0次下载

    关于cyusb3014I2C EEPROM的问题求解

    到I2C EEprom,并且可以写成功,然后将模式改为1FF,系统偶尔可以启动成功,绝大多数上电没有反应,请问这是什么原因?以及解决该问题的办法。
    发表于 07-16 07:38

    FPGA远程bit文件和调试ILA指南

    在 FPGA 开发过程中,bit文件和使用ILA进行调试是再常见不过的操作。但如果 FPGA 板卡被放在机房,或者通过PCIe插在服务器上,那么每次调试时我们都不得不带着笔记本电脑跑去机房或服务器旁,接上 JTAG 线后才能进行调试,非常不便。
    的头像 发表于 06-05 16:41 1993次阅读
    FPGA远程<b class='flag-5'>烧</b><b class='flag-5'>写</b>bit文件和调试ILA指南

    AGM FPGA/MCU文件类型有哪些及用途

    AGM FPGA/MCU文件类型有哪些及用途 AGM有FPGA和MCU器件,那FPGA/MCU文件类型有哪些及用途,让我们一起梳理一下。 一、AG256 / 576系列: .p
    发表于 03-14 09:54

    迅为RK3588开发板技术分享 TF卡大于4G容量镜像

    RK3588技术分享 | TF卡大于4G容量镜像
    的头像 发表于 03-10 14:39 993次阅读
    迅为RK3588开发板技术分享 TF卡<b class='flag-5'>烧</b><b class='flag-5'>写</b>大于4G容量镜像

    Linux固件中的陷阱:文件系统异步写入引发的问题

    成后蜂鸣器提示,产线工人听到蜂鸣器鸣叫后就直接断电重启,进入测试环节,结果在测试中发现有部分产品启动就出现异常。客户用解压方式系统固件,解压命令执行完后,再运行
    的头像 发表于 03-07 11:34 642次阅读
    Linux固件<b class='flag-5'>烧</b><b class='flag-5'>写</b>中的陷阱:文件系统异步写入引发的问题

    【北京迅为】itop-3568 开发板openharmony鸿蒙及测试-第1章 体验OpenHarmony—镜像

    【北京迅为】itop-3568 开发板openharmony鸿蒙及测试-第1章 体验OpenHarmony—镜像
    的头像 发表于 03-04 16:31 876次阅读
    【北京迅为】itop-3568 开发板openharmony鸿蒙<b class='flag-5'>烧</b><b class='flag-5'>写</b>及测试-第1章 体验OpenHarmony—<b class='flag-5'>烧</b><b class='flag-5'>写</b>镜像

    请问DLPC4422 flash首次需要离线完成吗?

    做了一块dlpc4422单板,flash第一次需要使用片机进行吗,文件是.img文件吗 还是直接贴装上,第一次就可以在线
    发表于 02-26 07:07

    DLPC的boot flash在上机贴片之前需要预先程序吗?

    您好,请问下,DLPC的boot flash在上机贴片之前需要预先程序吗?是否可以先贴片后经过USB img启动
    发表于 02-21 16:56

    迅为RK3588开发板实时系统编译-Preemption系统/ Xenomai系统编译-实时系统-固件

    按键启动开发板,此时工具会提示发现新设备,就可以松开 VOL +按键了。VOL +按键如下图所示: 注意: 如果您的工具没有发现设备
    发表于 02-18 11:32

    请问DLPC3479如何固件?

    1.已下载了3479firmware,.img文件。请问是直接通过器将.img文件写到spi flash中吗?还是先将.img解压(尝试解压,一直失败)? 2.
    发表于 02-18 06:31

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之方法

    ,或者不管它,直到写完成。如图:六、系统写完成之后,出现“Done”,之后点击“Stop”,停止。再点击“Exit”,关闭工具。然后断电,将拨码开关3拨到ON,1,2,4,5,
    发表于 12-20 09:07

    飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之方法

    Mfgtools工具是NXP官方提供的用于其系列产品系统的软件,可以从官方网站下载,我们的ELF 1开发资料包中也放了这个工具,路径为:ELF 1开发板资料包\\06-常用工具\\06-4
    发表于 12-19 09:09