资料介绍
本文所述的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
- 认识linux文件系统——文件系统启动过程介绍 1次下载
- ROC RK3399 PC Pro文件系统Linux根文件系统镜像(arm64/arm32)
- Core 3399 JD4 V2文件系统Linux根文件系统镜像(arm64/arm32)
- Core 3399Pro JD4文件系统Linux根文件系统镜像(arm64&arm32)
- Core 3399 JD4文件系统Linux根文件系统镜像(arm64&arm32)
- FATFS文件系统详解
- DCS和PLC控制系统升级改造分析
- 通过minicom和kermit利用串口下载内核映象和文件系统 4次下载
- ARM的启动过程start.S汇编文件的指令的详细分析 46次下载
- 嵌入式系统文件系统比较 1次下载
- 《Linux设备驱动开发详解》第5章、Linux文件系统与设备文件系统 0次下载
- 单片机C51程序烧写过程 0次下载
- Linux源码分析系列之文件系统 51次下载
- 基于ARM的SD卡文件系统设计
- Linux文件系统课程 0次下载
- 如何修改buildroot和debian文件系统 254次阅读
- Linux 文件系统层的主要结构 872次阅读
- 分析ARM Cortex-M内核复位启动过程 2047次阅读
- 如何制作ubuntu20.04的文件系统 3488次阅读
- 深入剖析Linux内核虚拟文件系统 2952次阅读
- 什么是分布式文件系统 3990次阅读
- 汽车电子系统中闪存文件系统的应用设计与研究 1768次阅读
- 基于FPGA和Nios II处理器IP软核实现实现SD卡接口和文件系统的设计 2117次阅读
- 在QEMU上用Busybox模拟ARM文件系统的步骤 3101次阅读
- 基于Buildroot的Linux系统构建之根文件系统 2478次阅读
- 使用RT-Thread文件系统 8484次阅读
- 文件系统是什么?浅谈EXT文件系统历史 5548次阅读
- debian安装zfs文件系统 1w次阅读
- 详解bootloader的执行流程与ARM Linux启动过程分析 1w次阅读
- 玩转Linux,先把文件系统搞懂 2009次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多