历史上的今天
返回首页

历史上的今天

今天是: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的分区。


再使用制作Uboot的sd_fusing.sh脚本。

cd work/uboot_tiny4412_0929/sd_fuse/tiny4412


sudo ./sd_fusing.sh /dev/mmcblk0


简单看了看sd_fusing.sh脚本,脑补了下此时的SD卡分布:


此时在boot和rootfs分区看不到相关文件的原因可能就是不在分区内。

最后依次将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参数设置的时候连写命令所致。


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.实际效果


推荐阅读

史海拾趣

Ethertronics公司的发展小趣事

Ethertronics公司的发展故事一:技术突破与初创期

Ethertronics公司成立于XXXX年,由一群热衷于无线通信技术创新的工程师共同创立。在创立初期,公司就瞄准了天线技术的未来发展方向,致力于研发高性能、多频段、小型化的天线产品。通过不断的技术创新和实验,Ethertronics成功开发出了一系列具有革命性的天线产品,这些产品不仅性能卓越,而且体积小巧,可以广泛应用于各种电子设备中。这些技术突破为公司赢得了业界的广泛认可,也为公司的后续发展奠定了坚实的基础。

Ethertronics公司的发展故事二:市场拓展与合作伙伴关系

随着技术的不断成熟和产品的不断完善,Ethertronics开始积极拓展市场。公司与多家知名电子设备制造商建立了长期稳定的合作伙伴关系,为其提供定制化的天线解决方案。通过与这些合作伙伴的紧密合作,Ethertronics的产品逐渐打入了主流市场,并被广泛应用于智能手机、平板电脑、笔记本电脑等各种电子设备中。这些合作伙伴的信任和支持,为公司的发展提供了强大的动力。

Ethertronics公司的发展故事三:持续创新与研发投入

作为一家以技术为核心的公司,Ethertronics始终将创新作为公司发展的核心动力。公司不断加大对研发的投入,积极引进和培养高素质的研发人才,不断推出具有竞争力的新产品。同时,公司还与多家高校和科研机构建立了紧密的合作关系,共同开展技术研究和创新。这些持续的创新和研发投入,使Ethertronics在天线技术领域始终保持领先地位。

Ethertronics公司的发展故事四:国际化战略与全球布局

随着全球市场的不断开放和竞争的加剧,Ethertronics开始实施国际化战略,积极拓展海外市场。公司在全球范围内建立了多个研发中心和销售机构,与当地的合作伙伴建立了紧密的合作关系。通过这些机构,Ethertronics能够更好地了解当地市场需求和竞争态势,为客户提供更加优质和高效的服务。同时,公司的国际化战略也为其带来了更多的商业机会和发展空间。

Ethertronics公司的发展故事五:社会责任与可持续发展

作为一家有着高度社会责任感的企业,Ethertronics始终将可持续发展作为公司发展的重要目标。公司积极倡导环保和节能的理念,致力于开发更加环保和节能的产品。同时,公司还积极参与各种公益活动和社会责任项目,为社会做出积极贡献。这些举措不仅提升了公司的品牌形象和社会声誉,也为公司的长期发展奠定了更加坚实的基础。

ADATA公司的发展小趣事

ADATA科技成立于2001年,是一家专注于提供存储解决方案的公司,以下是该公司发展的五个相关故事:

  1. 公司成立与初期发展: ADATA科技成立于2001年,总部位于台湾新北市,最初致力于生产和销售DRAM模块。随着存储技术的不断发展,公司逐渐扩展了业务范围,涵盖了闪存产品、固态硬盘、移动存储设备等多个领域。

  2. 技术创新与产品推出: ADATA科技在存储领域进行了持续的技术创新,并推出了一系列具有竞争力的产品。公司不断提升产品性能、降低成本,并注重产品的设计和用户体验。除了传统的DRAM模块,公司还推出了闪存卡、固态硬盘、移动硬盘等产品,满足了不同客户和市场的需求。

  3. 市场拓展与国际化发展: ADATA科技积极拓展国内外市场,并逐步实现了国际化发展。公司产品远销全球各地,与全球范围内的主要零售商、电子产品制造商建立了合作关系。通过与合作伙伴的紧密合作,公司产品在国际市场上得到了广泛认可和好评。

  4. 品牌建设与市场影响力: ADATA科技通过持续的品牌建设活动,不断提升了在存储领域的市场影响力。公司参加各类行业展会、展示活动,并投入大量资源进行市场推广和宣传。同时,公司还与体育、文化等领域开展赞助活动,提升品牌知名度和美誉度。

  5. 未来展望与持续发展: 作为一家专注于存储解决方案的企业,ADATA科技将继续致力于技术创新和产品开发。公司将不断改进现有产品,推出更多性能更好、功能更丰富的存储产品,以满足不断变化的市场需求。同时,公司还将继续拓展国际市场,加强与合作伙伴的合作,实现业务的持续增长和发展。

Comus_International公司的发展小趣事

在过去几十年里,Comus International通过持续的有机增长和收购增长相结合的方式,实现了公司的快速发展。这种增长策略不仅使公司规模不断扩大,也使其业务范围更加广泛。最终,Comus International成功发展成为一家集团公司,成为电子行业中的佼佼者。

以上就是Comus International在电子行业中的五个发展故事。这些故事充分展示了公司在创新、质量、服务以及市场拓展等方面的卓越表现,也揭示了其能够在竞争激烈的电子行业中脱颖而出的原因。

Equator Technologies公司的发展小趣事

面对日益激烈的市场竞争和技术变革,Equator始终保持着持续创新的精神。公司不断投入研发资源,探索新的技术方向和应用场景。例如,在人工智能和机器学习领域,Equator正在积极开展相关研究和实践工作,探索将这些先进技术应用于视频处理领域的可能性。通过持续创新和努力,Equator正致力于引领电子行业未来的发展方向。

Anritsu公司的发展小趣事

在XX年代中期,Equator迎来了一个重要的转折点——被Pixelworks公司收购。Pixelworks是一家在显示图像处理领域具有领先地位的公司,其产品线广泛,包括用于各种显示设备的图像处理芯片和软件。与Pixelworks的合并使Equator获得了更广阔的市场和资源支持,加速了其技术和产品的发展。合并后,Equator继续专注于视频处理技术的研发,并与Pixelworks共同推出了多款创新产品。

Collins Electronics Corp公司的发展小趣事

随着科技的飞速发展,Collins Electronics Corp意识到技术创新是企业持续发展的关键。他们投入大量资源进行研发,推出了一系列具有创新技术的电子产品。其中,他们开发的一款新型高频无线电收发器,因其传输速度快、信号稳定而广受好评。这项技术不仅为公司带来了可观的利润,还推动了整个电子行业的技术进步。

问答坊 | AI 解惑

D类放大器原理详解及应用设计指南(完整版)

D类放大器首次提出于1958年,近些年已逐渐流行起来。那么,什么是D类放大器?它们与其它类型的放大器相比如何? 为什么D类放大器对于音频应用很有意义?设计一个“优质”D类音频放大器需要考虑哪些因素? 美国模拟器件公司(简称ADI公司)D类放大器产品 ...…

查看全部问答>

硬件设计工程师招聘信息

本公司根据产品的需要,高薪诚聘有经验的硬件设计工程师/产品设计经理 公司名称:北京天宇威视科技有限公司 岗位职责: 1、根据新产品目标,提出新产品功能要求及硬件结构设计可行性方案; 2、综合考虑功能、成本、稳定性、工艺性等因素,提出 ...…

查看全部问答>

急!急!急!请教一个关于udp通信的问题

我想在一个多任务程序中用udp方式实现任务之间的通信,应该属于在本地机上实现通信,不知道怎么做啊,把ip设成一样的127.0.0.1就可以了吗?…

查看全部问答>

LM358电路分析

请各位大侠帮小弟分析分析上图两个LM358的输出为什么不同。谢谢师傅赐教…

查看全部问答>

430F1232几种型号的区别

今天突然发现,430F1232竟然还有很多种型号,后缀名有很多种,恕小弟愚昧,看了资料半天似乎也没发现太大区别,这里请问一下用430的高手,同样是1232的片子后缀名不同区别在哪里呢?比如  MSP430F1232IDW 与 MSP430F1232IPW 有什么区别?…

查看全部问答>

FPGA IO 电平标准 不同时,FPGA IO 的差别

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. 高手们能给点指示吗?网上搜不到这个尺寸的陶瓷天线啊。。。。 小弟很急。。。…

查看全部问答>