历史上的今天
今天是:2025年07月30日(星期三)
2021年07月30日 | Exynos4412——SD卡启动
2021-07-30 来源:eefocus
实现Tiny4412从SD卡的启动内核与根文件系统。
前面启动开发板时,需要从SD卡启动Uboot,然后从DNW下载内核和根文件系统到RAM,或者NFS挂载根文件系统。
Uboot应该是支持SD卡的,可以从SD卡读取内核。
Uboot把控制权交给内核后,内核必须要支持SD卡,才能访问SD卡的根文件系统,因此需要移植SD卡驱动。
1.关于启动的理解
嵌入式Linux开发一般需要至少三个文件:Bootloader(Uboot)、Kernel(uImage)、根文件系统(rootfs)。Kernel-3.x加入设备树后,又多了个DTB设备树文件。
因此,本次要准备四个文件:Uboot、Kernel、rootfs、DTB。
一般开发板上有多个存储介质,如:Nand Flash、Nor Flash、mmc、emmc、SD卡、网络也算特殊的一种。
前面的四个文件,理论上可以放在板上的任一存储介质里面,然后给SOC信号(开发板上的启动顺序拨码开关),告诉它从哪个存储介质读取相应文件。
但由于一些特殊原因,往往有所限制。比如,Nor Flash比较小,一般只放Uboot,放不下rootfs。好像也没有支持网络NFS启动的Uboot,至少我目前没遇到过。
因此,一般常见的方式是把Uboot放在Nor Flash,其它的放在Nand Flash,就像JZ2440;或者全都放在SD卡/TF卡,就像Ti的AM437X;又或者都放在emmc,像Tiny4412;
总之就是以上的存储介质组合,根据实际情况而定。
需要一提的是,很多SOC现在都在Uboot前封装了一层代码,或者搞了一个其它什么机制,上电后马上初始化了存储介质相关的寄存器,其次才加载用户的第一行代码。
开发板上电后,先内部固化代码先初始化一些必要的东西(有的SOC没有这一机制),然后根据启动引脚的电平,读取相应的存储介质上的Uboot到RAM,启动Uboot后,根据用户传的参数加载内核、设备树、根文件系统到RAM。
这一过程的Uboot所处的存储介质受限比较大,要根据SOC所支持的启动方式来选择。后面Uboot启动后,Uboot会初始化更多的硬件存储介质,也就有了更多的选择。
启动过程其实是先将要启动的文件从存储位置拷贝到内存空间,再在内存中运行。因此所谓不同位置启动,也就是从不同位置拷贝而已。
2.移植SD卡驱动
SD卡移植的工作内容很少,仅对其设备树文件arch/arm/boot/dts/exynos4412-tiny4412.dts添加了一行代码即可:
-- /work/tools/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dts 2017-10-21 08:55:07.000000000 -0700
+++ /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dts 2017-10-31 03:34:04.609606802 -0700
@@ -79,6 +101,7 @@
bus-width = <4>;
pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;
pinctrl-names = "default";
+ vmmc-supply = <&mmc_reg>;
status = "okay";
};
然后奇迹般就可以了。。懵逼。
3.制作SD卡
先将SD卡分为两个区,一个格式为fat32用于放内核和dtb,一个格式为ext3/4用于存放根文件系统。
可以使用fdisk命令分区,mkfs命令进行格式化。这里使用如下的mkcard.sh脚本更方便,原脚本里面的sfdisk是2.26版本的,在Ubuntu14.04运行正常,在Ubuntu16.04是无法运行的,Ubuntu16.014sfdisk的版本是2.27.1。顺便修改了下分区大小,看起来更舒服点,修改后的脚本如下:
#! /bin/sh
# mkcard.sh v0.4
# (c) Copyright 2009 Graeme Gregory # Licensed under terms of GPLv2 # # Parts of the procudure base on the work of Denys Dmytriyenko # http://wiki.omap.com/index.php/MMC_Boot_Format LC_ALL=C if [ $# -ne 1 ]; then echo "Usage: $0 exit 1; fi DRIVE=$1 dd if=/dev/zero of=$DRIVE bs=1024 count=1024 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` echo DISK SIZE - $SIZE bytes CYLINDERS=`echo $SIZE/255/63/512 | bc` echo CYLINDERS - $CYLINDERS # 将SD卡分成2个区 sfdisk --no-reread $DRIVE << EOF 1024,1024000,0x0C,* 1024100,,,- EOF # 格式化第1分区为fat32格式, 并且命名为boot if [ -b ${DRIVE}1 ]; then mkfs.vfat -F 32 -n "boot" ${DRIVE}1 else if [ -b ${DRIVE}p1 ]; then mkfs.vfat -F 32 -n "boot" ${DRIVE}p1 else echo "Cant find boot partition in /dev" fi fi # 格式化第2分区为ext3格式, 并且命名为rootfs if [ -b ${DRIVE}2 ]; then mke2fs -j -L "rootfs" ${DRIVE}2 else if [ -b ${DRIVE}p2 ]; then mke2fs -j -L "rootfs" ${DRIVE}p2 else echo "Cant find rootfs partition in /dev" fi fi sync sudo partprobe $DRIVE sync 参考博客(需梯子) 执行 sudo ./mkcard.sh /dev/mmcblk0 等待一会,使用命令sudo fdisk -l查看分区,如果脚本工作完后,看起来没有分区成功,重启系统再来一次,有点莫名其妙的。 搞定后,此时就会有两个分别名叫boot和rootfs的分区。 cd work/uboot_tiny4412_0929/sd_fuse/tiny4412 sudo ./sd_fusing.sh /dev/mmcblk0 简单看了看sd_fusing.sh脚本,脑补了下此时的SD卡分布: 最后依次将uImage、DTB、rootfs复制到SD卡即可: sudo cp /work/linux-4.13.9/arch/arm/boot/uImage /media/hceng/boot/ sudo cp /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dtb /media/hceng/boot/ sudo cp -rd /work/nfs_rootfs/* /media/hceng/rootfs/ 4.Uboot参数设置 刚开始测试的时候,老是卡在Starting kernel ...,查找了一下午原因,最后发现是Uboot参数设置的时候连写命令所致。 SD卡启动: setenv bootargs 'root=/dev/mmcblk0p2 rw console=ttySAC0,115200 init=/linuxrc' saveenv setenv bootcmd fatload mmc 0:1 0x40000000 uImage;fatload mmc 0:1 0x42000000 exynos4412-tiny4412.dtb;bootm 0x40000000 - 0x42000000 saveenv boot NFS启动: setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.1.226:/work/fs_mini_mdev_new ethmac=00:40:5c:26:0a:5b ip=192.168.1.225:192.168.1.226:192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 init=/linuxrc' saveenv setenv bootcmd fatload mmc 0:1 0x40000000 uImage;fatload mmc 0:1 0x42000000 exynos4412-tiny4412.dtb;bootm 0x40000000 - 0x42000000 saveenv boot 5.实际效果
再使用制作Uboot的sd_fusing.sh脚本。
此时在boot和rootfs分区看不到相关文件的原因可能就是不在分区内。
Uboot启动参数设置如下:
史海拾趣
|
D类放大器首次提出于1958年,近些年已逐渐流行起来。那么,什么是D类放大器?它们与其它类型的放大器相比如何? 为什么D类放大器对于音频应用很有意义?设计一个“优质”D类音频放大器需要考虑哪些因素? 美国模拟器件公司(简称ADI公司)D类放大器产品 ...… 查看全部问答> |
|
本公司根据产品的需要,高薪诚聘有经验的硬件设计工程师/产品设计经理 公司名称:北京天宇威视科技有限公司 岗位职责: 1、根据新产品目标,提出新产品功能要求及硬件结构设计可行性方案; 2、综合考虑功能、成本、稳定性、工艺性等因素,提出 ...… 查看全部问答> |
|
我想在一个多任务程序中用udp方式实现任务之间的通信,应该属于在本地机上实现通信,不知道怎么做啊,把ip设成一样的127.0.0.1就可以了吗?… 查看全部问答> |
|
今天突然发现,430F1232竟然还有很多种型号,后缀名有很多种,恕小弟愚昧,看了资料半天似乎也没发现太大区别,这里请问一下用430的高手,同样是1232的片子后缀名不同区别在哪里呢?比如 MSP430F1232IDW 与 MSP430F1232IPW 有什么区别?… 查看全部问答> |
|
1,FPGA IO 电平标准选择不同时,IO内部的区别是什么?比如设置成3.3V的IO和1.8的IO,FPGA内部的不同是什么?, 2,FPGA内部改变了什么,使FPGA IO 可以设置成不同的电平标准?3,我在配置管脚时,配置的电平的标准是3.3V;但实际的电路是1.8V的(i ...… 查看全部问答> |
|
齐纳二极管调整器设计 作者:Ron Mancini -- EDNIC参考很受电路设计者的欢迎,因为它们不仅精确而且飘移很小。在我今后的一些专栏文章中,将陆续讨论三种IC参考:埋入式齐纳二极管、带隙及XFET。当您用齐纳二极管进行参考设计时,由于齐纳二极管 ...… 查看全部问答> |
|
天线是从地磁传感器上拆下来的。增益估计是比较大的,估计要4DBI左右。 我量了一下,尺寸大概是 :38*38*5 上面的标识是C1.8.0. 高手们能给点指示吗?网上搜不到这个尺寸的陶瓷天线啊。。。。 小弟很急。。。… 查看全部问答> |




