完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本文所述的ARM的指的是Cortex A系列以及ARM9,ARM11,跑Linux操作系统。对于CortexM系列并不一定完全适用;
谈到ARM以及启动和烧写等方面,首先我们要明确一下几个关键词:Uboot,Cmdline,启动方式选择,文件系统格式,存储介质,如NAND,EMMC,SD卡等 下面一个一个做相关介绍: |
|
相关推荐
7个回答
|
|
启动方式:
一般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:即裸芯片,没有控制器,针对其主要操作有擦除,读和写 FTL Device: 在裸芯片上加了控制器,比如SD卡,U盘等;加了控制器后,只需要读和写就行了,不需要擦除。控制器做了一系列的工作:擦除,磨损平衡,磨损算法等等,一个控制器算法的好坏直接决定了设备的使用寿命。 |
|
|
|
文件系统:
FAT:windows常用文件系统,一般U盘,sd卡即为fat格式 ext2/3/4,Linux常用文件系统,一般用于FTLDevice,即只有读和写 JFFS2,Linux常用,一般用于容量较小的Flash,且是RawFlash,MTD设备 UBIFS,Linux常用文件系统,只能用于RawFlash,因为kernelubi子系统,有相关的磨损平衡算法,可以保证效率 SD卡启动,文件系统挂载情况: #mount /dev/rooton/typeext4(rw,noatime,data=ordered) procon/proctypeproc(rw,nosuid,nodev,noexec,noatime) sysfson/systypesysfs(rw,nosuid,nodev,noexec,noatime) tmpfson/tmptypetmpfs(rw,nosuid,nodev,noatime) tmpfson/devtypetmpfs(rw,nosuid,relatime,size=512k,mode=755) devptson/dev/ptstypedevpts(rw,nosuid,noexec,relatime,mode=600) debugfson/sys/kernel/debugtypedebugfs(rw,noatime) # #cat/proc/mtd dev:sizeerasesizename mtd0:0050000000020000“boot” mtd1:00a0000000020000“kernel” mtd2:0010000000020000“dtb” mtd3:0f00000000020000“rootfs” NAND启动,文件系统挂载情况: #mount ubi0:rootfson/typeubifs(rw,relatime) devtmpfson/devtypedevtmpfs(rw,relatime,size=89164k,nr_inodes=22291,mode=755) procon/proctypeproc(rw,relatime) devptson/dev/ptstypedevpts(rw,relatime,gid=5,mode=620) tmpfson/dev/shmtypetmpfs(rw,relatime,mode=777) tmpfson/tmptypetmpfs(rw,relatime) tmpfson/runtypetmpfs(rw,nosuid,nodev,relatime,mode=755) sysfson/systypesysfs(rw,relatime) # #cat/proc/mtd dev:sizeerasesizename mtd0:0050000000020000“boot” mtd1:00a0000000020000“kernel” mtd2:0010000000020000“dtb” mtd3:0f00000000020000“rootfs” |
|
|
|
烧写过程:
一般从SD卡等外部方式启动,在Uboot中,使用flash命令及UBI命令分别烧写uboot,dtb,kernel,rootfs到对应的分区即可 第二使用芯片厂家的烧写工具,如nxp的 mfgtoos,在pc上通过u***烧写文件 如已有uboot,在uboot中从sd卡,U盘等读取文件烧写;或tftp从pc下载文件烧写 |
|
|
|
升级过程:
此升级指的是UbootOK的前提下做Uboot,kernel,rootfs等升级 通过SD卡升级,一般是首先在PC上制作SD卡启动分区,通过官方的工具烧写升级文件到SD卡即可;此处的升级文件分两个方面: 最小升级内核,并且包含升级脚本,此脚本会将目标文件烧写到存储介质中 目标升级文件,即要烧写到比如NAND中的文件 以NXPSD卡升级为例说明此过程: 首先是Uboot启动过程: U-Boot2016.03-mys-imx6ulx+gca7b81f(Apr272017-07:55:51+0800) CPU:Freescalei.MX6ULLrev1.0528MHz(runningat396MHz) CPU:Commercialtemperaturegrade(0Cto95C)at39C Resetcause:POR Board:MX6ULL14x14EVK I2C:ready DRAM:512MiB MMC:FSL_SDHC:0,FSL_SDHC:1 ***Warning-badCRC,usingdefaultenvironment Display:TFT43AB(480x272) Video:480x272x24 In:serial Out:serial Err:serial switchtopartitions#0,OK mmc0iscurrentdevice Net:BoardNetInitializationFailed Noethernetfound. NormalBoot Hitanykeytostopautoboot:0 switchtopartitions#0,OK mmc0iscurrentdevice switchtopartitions#0,OK mmc0iscurrentdevice readingboot.scr 423bytesreadin10ms(41KiB/s) Runningbootscriptfrommmc.。. ##Executingscriptat80800000 readingzImage 6789824bytesreadin302ms(21.4MiB/s) readingmys-imx6ull-14x14-evk-gpmi-weim.dtb 36951bytesreadin20ms(1.8MiB/s) Kernelimage@0x83000000[0x000000-0x679ac0] ##FlattenedDeviceTreeblobat84000000 Bootingusingthefdtblobat0x84000000 UsingDeviceTreeinplaceat84000000,end8400c056 Startingkernel.。 最小系统加载启动完毕后,运行升级脚本 VFS:Mountedroot(ext4filesystem)ondevice179:2. devtmpfs:mounted Freeingunusedkernelmemory:432K(80b54000-80bc0000) INIT:version2.88booting Startingudev udevd[114]:startingversion3.1.5 random:udevdurandomreadwith32bitsofentropyavailable EXT4-fs(mmcblk0p2):re-mounted.Opts:data=ordered bootlogd:cannotallocatepseudotty:Nosuchfileordirectory FAT-fs(mmcblk0p1):Volumewasnotproperlyunmounted.Somedatamaybecorrupt.Pleaserunfsck. ALSA:Restoringmixersettings.。. /usr/***in/alsactl:load_state:1735:Nosoundcardsfound.。. INIT:Enteringrunlevel:5 Startingsystemmessagebus:dbus. Systemupdatestart.。. preparefilesareokay 升级脚本分析: root@mys6ull14x14:/run/media/mmcblk0p2#catusr/bin/flash_nand.sh #!/bin/sh part_uboot=0 part_kernel=1 part_dtb=2 part_rootfs=3 echoheartbeat》/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“preparefilesareokay” else echo0》/sys/class/leds/user/brightness echo“fileordirectorynotexist” fi 直接使用Flash命令烧写Uboot到对应分区 echo“Flashinguboot” flash_erase/dev/mtd${part_uboot}00&&kobs-nginit-x-v${uboot} if[$?-eq0] then echo“Flashubootokay” else echo“Flashubootfailed” echo0》/sys/class/leds/user/brightness exit fi 直接使用Flash命令烧写kernel到对应分区 echo“Flashingkernel” flash_erase/dev/mtd${part_kernel}00&&nandwrite-p/dev/mtd${part_kernel}-p${kernel} if[$?-eq0] then echo“Flashkernelokay” else echo“Flashkernelfailed” echo0》/sys/class/leds/user/brightness exit fi 直接使用Flash命令烧写dtb到对应分区 echo“Flashingdtb” flash_erase/dev/mtd${part_dtb}00&&nandwrite-p/dev/mtd${part_dtb}-p${dtb} if[$?-eq0] then echo“Flashdtbfileokay” else echo“Flashdtbfilefailed” echo0》/sys/class/leds/user/brightness exit fi 烧写rootfs比较特别,此处是使用ubifs,因此需要先使用ubi命令在NAND上建立好文件系统格式 echo“Flashingrootfs” flash_erase/dev/mtd${part_rootfs}00 if[$?-ne0] then echo“erase/dev/mtd${part_rootfs}fail” echo0》/sys/class/leds/user/brightness exit fi ubiformat/dev/mtd${part_rootfs} if[$?-ne0] then echo“format/dev/mtd${part_rootfs}fail” echo0》/sys/class/leds/user/brightness exit fi ubiattach/dev/ubi_ctrl-m${part_rootfs} if[$?-ne0] then echo“attach/dev/mtd${part_rootfs}fail” echo0》/sys/class/leds/user/brightness exit fi ubimkvol/dev/ubi0-Nrootfs-m if[$?-ne0] then echo“makevolume/dev/mtd${part_rootfs}fail” echo0》/sys/class/leds/user/brightness exit fi mkdir-p/run/media/mtd${part_rootfs} &&mount-tubifsubi0:rootfs/run/media/mtd${part_rootfs} if[$?-ne0] then echo“mount/dev/mtd${part_rootfs}fail” echo0》/sys/class/leds/user/brightness exit fi 建立好ubi格式之后,直接将rootfs压缩包解压到对应分区即可; tarxvf${rootfs}-C/run/media/mtd${part_rootfs} if[$?-eq0] then echo“Flashfilesystemokay” sync&&sync&&sync echonone》/sys/class/leds/user/trigger echo1》/sys/class/leds/user/brightness else echo“Flashfilesystemfailed” echo0》/sys/class/leds/user/brightness umount/run/media/mtd${part_rootfs} exit fi umount/run/media/mtd${part_rootfs} echo“Programmingsuccess” echo“Youneedreboottheboard” |
|
|
|
只有小组成员才能发言,加入小组>>
828 浏览 1 评论
1008 浏览 1 评论
12447 浏览 0 评论
5888 浏览 3 评论
17679 浏览 6 评论
997浏览 1评论
977浏览 1评论
829浏览 1评论
3945浏览 1评论
1010浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 17:01 , Processed in 0.697615 second(s), Total 90, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号