AM335X的SD卡更新系统学习记录

发布者:RainbowGarden最新更新时间:2024-08-19 来源: cnblogs关键字:AM335X  SD卡 手机看文章 扫描二维码
随时随地手机看文章

一般利用一张SD卡就能进行系统的更新,以前一直不知是什么原理,最近了解了下,对了解到的内容做个记录。使用的是AM335X平台,系统是Linux,文件系统是EXT3:


1、首先需要一张分好分区的SD卡(分区方法这里不做详细介绍,一般可使用TI官方提供的create-sdcard.sh脚本可以进行分区)。其中分区1(FAT32)存放MLO、u-boot.img、uImage三个文件;分区2(EXT3)存放需要从SD卡启动的Linux文件系统。


2、AM335X上电后,根据Boot Sequence启动配置(LCD0-LCD15引脚,具体可参考TI官方的335X参考手册),从相应的存储设备启动,这里配置的是从SD卡启动。


3、AM335X上电后首先执行固化在芯片内部ROM中的代码,我们称之为BLO,BLO的功能很强大,能读取SD卡中的第一个分区(必须是FAT格式)的MLO文件,复制到AM335X内部的RAM中吞下,复制的起始地址为0x402f0400,所以编译MLO时,连接地址必须设置为0x402F0400。


4、一般的,MLO的作用是:禁用中断、关看门狗、设置栈、初始化时钟、初始化DDR3、初始化串口、最后复制S卡中boot(FAT32)分区的u-boot.img到DDR3的0x80000000(内存)处运行。MLO的最大体积可以达到109K,对于简单的逻辑程序绰绰有余了。


5、u-boot的功能主要是启动内核:u-boot从SD卡的boot(FAT32)分区复制uImage到内存运行。


6、启动Linux后挂载SD卡的rootfs分区(EXT3)的文件系统


7、文件系统是利用Busybox工具集创建的,首先内核会启动BusyBox里的Init进程。init进程首先主要对/etc/inittab文件进行解析,然后按照它的指示创建各种子进程。


8、inittab文件的内容主要以下几部分。其中系统运行后最先执行的是/etc/rc.d/rcS进程,并且它只执行一次,其它进程只有等它执行完毕后才能运行,u-boot、内核、文件系统的烧写在这里执行。


1 ::sysinit:/etc/rc.d/rcS

2 ::respawn:/sbin/getty 9600 tty1

3 ::ctrlaltdel:/sbin/reboot

4 ::shutdown:/etc/rc.d/rcS stop

5 ::restart:/sbin/init

9、接着继续看到/etc/rc.d/rcS文件,这是一个脚本文件,下面一一分析它做的工作


#!/bin/sh


# minimal startup script, will work with msh (this is best available in

# MMUless format).


mode=${1:-start}                           #若第一个参数存在,则mode的值为第一个参数;否则mode等于start


# load the configuration information

if [ -x /etc/rc.d/rc.conf ]

then

    . /etc/rc.d/rc.conf                    #不管/etc/rc.d/rc.conf是否可执行,都去执行它,等价于sh /etc/rc.d/rc.conf

fi


if [ $mode = 'start' ]                     #若mode的值为start,

then

    services=$cfg_services                 #那么services等于$cfg_services(这个值在/etc/rc.d/rc.conf中定义:'crond mount-proc-sys hostname depmod modules udev filesystems inetd')

else

    services=$cfg_services_r               #否则services等于$cfg_services_r (这个值在/etc/rc.d/rc.conf中定义:'inetd filesystems udev modules depmod hostname mount-proc-sys crond')

fi

cfg_services=${2:-$services}               #若第二个参数存在,则cfg_services的值为第二个参数;否则cfg_services等于services


# run the configured sequence              #按配置的顺序,启动各个进程

for i in $cfg_services

do

    if [ -x /etc/rc.d/init.d/$i ]             #如果进程是可执行的,那么

    then

        echo '/etc/rc.d/init.d/'$i $mode      #打印进程信息

        /etc/rc.d/init.d/$i $mode             #挨个执行

    fi

done


if [ $# -ge 2 ]                              #如果参数个数大于等于2

then

    exit 0                                   #退出

fi

if [ $mode = 'start' ]                       #若mode的值为start,

then

    # show all kernel log messages

    if [ -x /proc/sys/kernel/printk ]        #若/proc/sys/kernel/printk可执行

    then

        #echo 8 >  /proc/sys/kernel/printk

        echo 0 >  /proc/sys/kernel/printk    #清空/proc/sys/kernel/printk

    fi


    # echo set kernel halt time

    echo -e '�33[9;0]' > /dev/tty0


    #echo Bringing lo up

    /sbin/ifconfig lo 127.0.0.1 up 2>/dev/null

    /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 gw 127.0.0.1 dev lo 2>/dev/null


    #echo eth0 setting                              #网卡0设置

    if [ -x /etc/eth0-setting ]

    then

        echo 'Found /etc/eth0-setting...'

        /etc/rc.d/ifconfig-eth0 /etc/eth0-setting   #在/etc/eth0-setting文件中配置IP、MASK、GATEWAY信息

    fi


    #echo eth1 setting                              #网卡1设置

    if [ -x /etc/eth1-setting ]

    then

        echo 'Found /etc/eth1-setting...'

        /etc/rc.d/ifconfig-eth1 /etc/eth1-setting   #在/etc/eth1-setting文件中配置IP、MASK、GATEWAY信息

    fi


    #echo wlan0 setting                              #wlan0设置

    if [ -x /etc/wlan0-setting ]

    then

        echo 'Found /etc/wlan0-setting...'

        wpa_supplicant -B -D wext -c /etc/wpa.conf -i wlan0

        wpa_cli add_network

        wpa_cli enable_network 0

        /etc/rc.d/ifconfig-wlan0 /etc/wlan0-setting

    fi


fi


# run rc.local if present and executable

if [ -x /etc/rc.d/rc.local ]                       #如果/etc/rc.d/rc.local可执行

then


    echo 'Found /etc/rc.d/rc.local...' 

    /etc/rc.d/rc.local $mode                       #那么,直接执行它。整个启动脚本的重点在这里,后面分析它

fi


# run startx if present and executable

if [ -x /usr/bin/startx ]

then

    if [ $mode = 'start' ]

then

        rm /tmp/.X0-lock

        startx

    fi

fi


/etc/rc.d/rcS脚本可以总结为如下的功能:

a、配置脚本运行的环境变量,文件为/etc/rc.d/rc.conf

b、运行系统服务进程:crond mount-proc-sys hostname depmod modules udev filesystems inetd

c、设置网络IP/etc/rc.d/ifconfig-eth0 /etc/eth0-setting、/etc/rc.d/ifconfig-eth1 /etc/eth1-setting

d、运行/etc/rc.d/rc.local脚本程序


10、分析/etc/rc.d/rc.local start脚本程序


#!/bin/sh

mode=${1:-start}                              #mode等于传入的参数1为start

if [ $mode = 'start' ]                        #如果mode的值等于start,那么运行以下程序

then


#set sgtl5000 volume 0~127

amixer cset numid=5 65                        #猜测是设置蜂鸣器音量,还不确定


echo 'start format board mmc...'

echo 1 > /sys/class/leds/user_buzzer/brightness   #打开蜂鸣器,说明开始运行此脚本更新系统


/etc/rc.d/spi.sh                                  #运行/etc/rc.d/spi.sh脚本,把/boot/u-boot.spi.512拷贝到Flash中,以后程序从此处取出u-boot运行

    以下为/etc/rc.d/spi.sh脚本内容:

        #!/bin/sh


        echo '****************************************************'

        echo '****************************************************'

        echo ''

        echo ' Hua Ming spi Flashing Script - 01/01/2015'

        echo ''


        echo 'erase spi flash...'

        flash_erase /dev/mtd0 0 8


        echo 'write boot/u-boot.spi.512 ...'

        flashcp /boot/u-boot.spi.512 /dev/mtd0

        echo 'done'    


/etc/rc.d/mmc.sh /dev/mmcblk1               #运行/etc/rc.d/mmc.sh脚本对mmc以ext3文件系统格式进行分区,分为4个区分别为sys、opt、user、Reserved。


mount /dev/mmcblk1p1 /mnt                   #挂接sys分区,将rfs_335x.tar.gz的文件进行解压缩,里面存放了最小根文件系统

cd /mnt

tar -xzvf ../rfs_335x.tar.gz


mount /dev/mmcblk1p2 /mnt/opt               #挂接opt分区,将HmReader.tar.gz解压缩,里面存放了应用程序

tar -xzvf ../../HmReader.tar.gz


cd boot

ln -s boot.scr.mmc1 boot.scr


sync


echo 0 > /sys/class/leds/user_buzzer/brightness    #蜂鸣器关闭

echo 'format finished ...'                         #格式化结束,更新完成


fi


/etc/rc.d/rc.local start脚本程序功能总结如下:

1、将/boot/u-boot.spi.512拷贝到Flash中,在从spi启动时启动u-boot。

2、对MMC1进行分区,分为四个区分别为sys、opt、user、Reserved

3、将最小根文件系统解压缩到sys分区

4、将应用程序解压缩到opt分区


11、对/etc/rc.d/mmc.sh脚本的分析:


#!/bin/sh


echo '****************************************************'

echo '****************************************************'

echo ''

echo ' Hua Ming Example Flashing Script - 01/01/2015'

echo ''


if [[ -z $1 ]]                #如果传入脚本的参数1不存在的话

then

        echo 'mmc.sh Usage:'

        echo '  mmc.sh

        echo '  Example: mmc.sh /dev/mmcblk0'

        exit                    #退出脚本

fi


STARTTIME=$(date +%s)            #获得当前时间


##---------Start of variables---------------------##


## Declare eMMC device name here

#DRIVE='/dev/mmcblk0'

DRIVE=$1                    #DRIVE=/dev/mmcblk1


##----------End of variables-----------------------##


## Kill any partition info that might be there

dd if=/dev/zero of=$DRIVE bs=4k count=1    #猜测是清除设备原有的分区

sync

sync                                       #马上写入设备


## Figure out how big the eMMC is in bytes

SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`    #算出块设备的大小(以字节为单位)


## Translate size into segments, which traditional tools call Cylinders. eMMC is not a spinning disk.

## We are basically ignoring what FDISK and SFDISK are reporting because it is not really accurate.

## we are translating this info to something that makes more sense for eMMC.

CYLINDERS=`echo $SIZE/255/63/512 | bc`    #作数学运算算出一个柱面的大小


## Check to see if the eMMC partitions have automatically loaded from the old MBR.

[1] [2]
关键字:AM335X  SD卡 引用地址:AM335X的SD卡更新系统学习记录

上一篇:利用Crosstool-ng制作交叉编译工具链
下一篇:AM335X的应用程序自启动流程以及U盘更新应用程序记录

推荐阅读最新更新时间:2026-03-24 10:45

静待工业元宇宙爆发,NVIDIA发布芯片、系统及云三项重要更新
随着元宇宙概念的兴起,包括数字孪生、5G、机器人、智能工厂等技术革新都在尝试与元宇宙相结合,从而更直观更高效的导入新技术。作为元宇宙的布道者之一,NVIDIA正在进行一系列举措,以加速元宇宙向工业市场渗透的趋势。 在2022秋季GTC上,NVIDIA就发布了Ada Lovelace RTX 6000 GPU、第二代第二代 NVIDIA OVX系统、以及Omniverse Cloud服务,从而全方位的构建新一代工业元宇宙的基础。 Ada架构的RTX 6000 NVIDIA RTX 6000基于全球领先的 GPU 架构——NVIDIA Ada 架构打造而成,具有最先进的 NVIDIA RTX 技术,其性能是上一代 RTX
[工业控制]
为何iOS 15系统更新率远不如前
临近年末,各大社交媒体应用、科技公司们都开始发布年度报告展示成就,试图用一件件事标记这一年。按照惯例,苹果也会在年末公布 iOS 系统的更新率。   然而,惯例被打破了,苹果不仅没有公布,就连它引以为傲的高升级率也出现了意外。   根据数据分析公司 Mixpanel 发布的报告,9 月份发布的 iOS 15 系统,到今年 12 月 20 日使用率不过 65.3%,而去年同期的 iOS 14 系统使用率达到了 80.9%。   从 iOS 12 到 iOS 14,新 iOS 系统发布一个月内使用率一般都能超过 50%,对比 Android 这一成绩确实亮眼,但今年 iOS 15 发布一个月后使用率仅为 34.1%,升级新系
[手机便携]
微软Surface Duo 2双屏安卓手机推2021.830.19系统更新
据 onMSFT 报道,近期,微软开始为 Surface Duo 2推出新的固件更新。最新的更新没有带来任何新功能,它只包括 Surface Duo 2 的 11 月安全补丁。   2021 年 11 月的更新下载包大小为 84.41MB,升级到 2021.830.19 软件版本。更新日志显示,这个版本的日期可以追溯到 11 月 19 日,它特别旨在解决一些关键的安全问题。   要更新 Surface Duo 2 手机,用户需要前往设置 系统 系统更新 检查更新。   与 Surface Duo 一样,微软承诺为 Surface Duo 2 提供 3 年的软件更新,尽管我们知道当涉及到操作系统更新时,微软表现
[手机便携]
德国希望数码产品厂商提供7年的系统更新服务和备用零件
根据德国政府向欧盟提出的建议,包括苹果在内的智能手机生产商应被要求为iPhone和其他设备提供为期7年的安全补丁支持和备件,以使该产品类别更有利于环境。德国联邦政府已经与欧盟委员会进行了谈判,以改变影响智能手机和平板电脑维修和服务的提案。   虽然欧盟委员会正在努力推动设备供应商提供为期五年的零部件和支持,但德国希望能做得更多。   欧盟打算将五年的更新适用于智能手机和平板电脑,但智能手机的零部件可以提供五年,而平板电脑的零部件可以由制造商提供六年。Heise.de报道说,联邦经济部希望这些期限能延长到七年。   除了延长支持周期,德国还希望制造商以“合理的价格”提供零部件。这包括要求供应商公布备件的价格,并且不随时
[手机便携]
国行Switch系统更新12.1.0 支持分享截图或者视频到微博
近日,国行Switch发布了12.1.0系统更新,也正式上线了将国行Nintendo Switch游戏的截图或视频分享到微博的新功能。 1.打开主页菜单中的“相册”,选择想要分享的截图或视频后,按下A键(共享和编辑),选择“发布”。分享截图时,最多可选择9张来自同一款游戏的截图(选择“一起发布”); 2.如果是初次使用微博分享功能: 在选择好分享内容和发布者后,需要在Nintendo Switch中登录微博账号。按照系统提示,使用“微博”App扫描主机屏幕中的二维码完成登录。如果大家勾选了“记住微博账号”,后续,对应用户账号的分享内容将默认发布在已登录的微博账号上; 3.之后,便可在发布页面中编辑微博内容(文字内
[手机便携]
国行Switch<font color='red'>系统</font><font color='red'>更新</font>12.1.0 支持分享截图或者视频到微博
华为将为 2021 年 4 月前于海外发布的荣耀手机提供系统更新
集微网 6 月 29 日消息,近期芬兰媒体 SuomiMobiili.fi 向荣耀和华为询问了在荣耀从华为独立之后,之前在海外以华为身份发布的荣耀机型后续支持将由谁负责的问题,并得到了明确的答复。 根据荣耀和华为的介绍,华为将负责支持在 2021 年 4 月 1 日发布的荣耀手机,直到产品的生命周期结束。而荣耀将负责 2021 年 4 月 1 日之后发布和上市的设备。 同时荣耀也承诺,在转接给华为客户服务之前,客服会尽可能地为购买华为拥有期间发布的荣耀手机的消费者提供帮助。
[手机便携]
谷歌发布了Android系统2021年4月安全更新
当地时间 4 月 5 日,谷歌发布了 2021 年 4 月 Android 安全更新公告,并开始向受支持的 Pixel 手机推出更新。   开发者现可查看 2021 年 4 月 Android 安全公告,其中详细列出了多个安全漏洞。这些漏洞影响开放源代码组件,以及高通、联发科等供应商部分封闭源代码组件。   IT之家了解到,公告中还提及了一些针对谷歌 Pixel 手机的漏洞。该漏洞被归类为 “中等”,会影响到 Pixel 手机的 Android 框架和高通位置 / GPS 实施。   此外,谷歌还修复了 Pixel 手机最新更新中一些面向用户的问题,改善了第三方应用的相机质量等。
[手机便携]
谷歌发布了Android<font color='red'>系统</font>2021年4月安全<font color='red'>更新</font>
三星Note 10系列国行推出One UI 3.1系统更新
近期,三星 Note10、Note10 + 手机国行开始推送最新的 One UI 3.1 系统更新。带来了日历、提醒从中提取日期和地址并推荐自动注册。IT之家获悉,本次更新还提升了照相机的性能。支持在 Galaxy 手机和平板电脑之间自动切换 Buds。新添加了应用程序 - 百度网盘。   日历   从事件标题中提取日期和地址并推荐自动注册。   从 Samsung Connect 设备接收通知。此类设备还具有指定的时间表通知。   照相机   提升了照相机的性能。   显示   增加了眼睛舒适度保护功能。   屏幕的色温会根据一天中的时间自动调整。   Buds 自动切换   支持在 Galaxy 手机和平板电脑之间自
[手机便携]
三星Note 10系列国行推出One UI 3.1<font color='red'>系统</font><font color='red'>更新</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved