Exynos4412——SD卡启动

最新更新时间:2021-07-30来源: eefocus关键字:Exynos4412  SD卡启动

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


关键字:Exynos4412  SD卡启动 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic543315.html

上一篇:移植uboot-分析uboot启动流程(详解)
下一篇:S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具链

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

10. 从0学ARM-基于Exynos4412的pwm详解
方波,从而实现图中三极管1->2周期性导通和关闭来让BUZZER俩边电压产生变化,从而实现电流变化;三极管的基极连接的是SOC的GPD0_0引脚;产生方波我们借助的是PWM,标号为MOTOR_PWM。继续查找MOTOR_PWM:由上图可知,MOTOR_PWM连接的是PWM的XpwmTOUT0,和LCD一起复用引脚GPD0_0,去datasheet继续查看GPD0_0说明,由上图可知,GPD0_0配置由寄存器的GPD0CON[3:0]位控制,要想作为PWM输出,要设置为TOUT_0即0x2。同时也可以看到,该引脚还可以设置为外部中断信号[EXT_INT6]功能即0xF。五、Exynos 4412 PWM1. 概述Exynos 4412
发表于 2021-08-04
10. 从0学ARM-基于<font color='red'>Exynos4412</font>的pwm详解
14. 从0学ARM-exynos4412-看门狗裸机程序编写
一、概念看门狗的简称是WDT(Watch Dog Timer),exynos4412scp中的看门狗定时器(WDT)是一种定时装置。1. 工作原理由(一般需要客户编写)软件读写定时器相关的寄存器,打开看门狗,并设定计数时间(以秒或分钟计算),定时器计数计满,由软件清零,以表明系统状态正常,这时,定时器计数重新开始,反复,否则,看门狗认为系统异常或有其他特定事件发生,触发系统复位信号,或提供中断,系统正常后重复定时器计数。这样只要软件正常运行,就不会出现复位或触发中断。当软件死机或运行出错时,由看门狗定时器对系统进行复位或触发中断,从而保证系统的正常运行。看门狗的定时时间可以由用户设定,这样可以根据需要在指定的时间内复位系统
发表于 2021-08-04
14. 从0学ARM-<font color='red'>exynos4412</font>-看门狗裸机程序编写
Exynos4412芯片的时钟管理单元
本章介绍Exynos4412芯片的时钟管理单元(CMU)。CMU控制锁相环(PLL)并为Exynos4412芯片中的各个IP、总线和模块产生时钟。它们还与电源管理单元(PMU)通信,以便在进入某个低功耗模式之前停止时钟,以通过时钟切换来降低功耗。1.Exynos4412芯片的时钟体系介绍对于PC机来说,CPU、内存、主板、声卡、显卡等等,这些功能部件由不同的芯片组成,在实体上是相互独立的。在嵌入式系统里,一块芯片往往集成了多种功能,比如Exynos4412上面既有CPU,还有音频/视频接口、LCD接口、GPS等模块。这类芯片被称为SoC,即System on Chip,译为芯片级系统或片上系统。在Exynos 4412芯片中,它以
发表于 2020-03-26
<font color='red'>Exynos4412</font>芯片的时钟管理单元
Exynos4412的外部中断是如何安排的?
平台Linux4.9tiny4412概述结合tiny4412开发板分析一下Exynos4412的外部中断是如何组织的。在Exynos4412的用户手册第9章Interrupt Controller列出了支持的外部中断:第1列是按Shared Peripheral Interrupt 排序的第2列是按Software Generated Interrupt + Peripheral Interrupt(PPI+SPI)排序的, 目前GIC提供了16个SGI中断和16个PPI中断从上面可以看到,硬件上提供了32个外部中断,但是我们在第6章的GPIO Control一节说:图2 上面说,有172个外部中断以及32个外部可唤醒
发表于 2020-02-16
<font color='red'>Exynos4412</font>的外部中断是如何安排的?
Exynos4412交叉编译环境搭建
效或者:source /root/.bash_profile使配置文件生效。5)检测交叉编译环境是否安装成功:# arm-linux-gcc -v...gcc version 4.5.1 (ctng-1.8.1-FA) 检测到交叉编译环境版本为4.5.1,安装成功。至此,Exynos4412的交叉编译环境已经搭建完成,可以使用交叉编译工具,编译出能在开发板上运行的应用程序和内核镜像文件。
发表于 2020-02-15
S5PV210的SD卡启动实战1~2
《朱老师物联网大讲堂》学习笔记学习地址:www.zhulaoshi.org 待烧录bin程序大于16kb,分bl1 16kb,16kb以后的为bl2两部分,从sd卡复制bl2到ddr中特定位置,跳转执行bl2。 BL1大致要做,关开门狗,设置栈,开iCache,初始化DDR,从SD卡赋值BL2到DDR中特定位置,然后跳转执行BL2,这个图是SD卡布局图,BLOCK 0是保留的,这个细节在linux下使用命令烧录可以看出来,#!/bin/shsudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1而直接使用烧录工具,这个细节就被工具本身屏蔽了,so
发表于 2020-12-22
S5PV210的<font color='red'>SD卡</font><font color='red'>启动</font>实战1~2
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved