linux-sd/tf卡启动

概述

大多时候开发板的片内(soc内部)nor/nand flash是比较小的。当我们的rootfs因为应用需求,需要更大的存储空间时,问题就来了,一般的解决方案是:
1、加片外nand;2、暂时通过SD卡启动,不影响开发业务层代码的周期。

本文档最终目的:uboot、kernel还放在片内的片内flash中,占rom较大的rootfs放在sd卡中。

下面介绍SD/TF卡启动方式的具体步骤。

uboot支持SD卡

首先需要uboot阶段能找到SD/TF卡设备,才能继续之后的操作。

uboot阶段找不到emmc设备

现象: 在bootcmd阶段,执行fatls mmc 0,报找不到mmc设备
原因: uboot没有将操作emmc设备的接口编译进去
解决:
环境:ingenic x1000/e
vi include/configs/halley2.h
添加如下:
其中定义CONFIG_JZ_MMC_MSC0 或 CONFIG_JZ_MMC_MSC1,是根据boot cmd下mmcinfo查看到的,一般为MSC0

//include/configs/halley2.h 

#ifdef CONFIG_CMD_MMC
#define CONFIG_GENERIC_MMC		1
#define CONFIG_MMC			1
#define CONFIG_JZ_MMC			1
/* suns add */
#define CONFIG_JZ_MMC_MSC0	1
/* suns end */

烧写,在boot cmd下执行:fatls mmc 0,可以看到能显示sd/tf卡中的文件名

其他环境:
法1:可在include/configs/自己的平台.h中搜索MMC,找到相应的宏,将其打开,即可
法2:在顶层的boards.cfg中找到自己平台对应的编译规则那一行,在行的最后一项中添加相应的宏。boards.cfg文件内容可自行百度。

制作SD卡文件系统

目的:将SD卡的一个分区制作成文件系统,在bootargs中,指定rootfs路径,kernel起来将挂载它。

PC端:
插入读卡器,在虚拟机中操作它:
1、确定设备文件
执行:ls /dev/sd* -l
拔、插读卡器,看sd卡对应的是哪个设备,我这里是/dev/sdc
2、创建分区
fdisk /dev/sdc,依次输入如下:
d: 如果之前有分区,把它删掉
n: 添加一个分区
p: 添加一个主分区
1:添加第一个分区
指定起始位置、结束位置,我这里第一个分区,起始位置和结束位置全用默认值。
w:使上述修改生效。

分区已经ok。
ls /dev/sd*
可以看到sdc1,即sdc的分区1。

制作ext2文件系统格式:

1、格式化分区为:ext2,也可别的fs类型
mkfs.ext2 /dev/sdc2
2、挂载到本地的/mnt/test目录
mkdir /mnt/test  
mount -t ext2 /dev/sdc2 /mnt/test  
3、拷贝之前通过busybox制作好的rootfs目录下的所有文件,到上述sd/tf卡的挂载目录下
cp -rf my_rootfs/* /mnt/test   
4、注意:拷贝结束后,需要umount,直接拔出tf卡,会导致写入失败
umount /mnt/test  

此时,rootfs已经在sd卡的分区1上了。

kernel支持ext2文件系统

kernel起来后,将按照bootcmd去挂载rootfs,那首先就需要kernel支持sd卡上写入的文件系统格式,按上述,我们的fs格式是ext2。
配置如下:
设备端:
在设备端:cat /proc/filesystems,查看kernel支持的文件系统,如果不包含ext2,需要添加支持。
步骤如下:
在kernel源码顶层目录
1、make menuconfig
2、File systems
勾选:
–>Ext3相关
–>Ext4相关
kernel配置

修改bootcmd

既然要在sd卡中启动rootfs,就需要uboot告诉内核,你应该在哪里找rootfs。具体如下

1、将tf\sd卡插入开发板,ls /dev/,查看分区在设备内显示的是什么名字,例如,/dev/mmcblk0p2
说明:tf/sd在设备中的默认挂载路径是/dev/mmcblk0p2
2、vi include/configs/xxx.h
其中xxx.h是你的平台名对应的配置文件。
修改CONFIG_BOOTARGS的内容:
①、rootfstype: ext2
②、root:/dev/mmcblk0p2
3、编译

烧写验证

经过上述所有步骤,可得到:
1、包含rootfs数据的sd卡
2、支持ext2 fs的kernel img
3、修改了bootcmd的uboot img
插入tf/sd卡,烧录上述img验证即可。
结果如下:
结果

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SD/TF是一种常用的存储媒介,而C51是一种基于8051架构的单片机。硬件SPI(Serial Peripheral Interface,串行外设接口)是一种通信协议,用于设备之间的数据传输。因此,在C51程序中通过硬件SPI访问SD/TF需要以下步骤: 首先,配置C51的SPI接口。C51单片机通常具有多个SPI接口,所以需要选择一个可用的接口,并配置相关的寄存器。具体的配置包括设置钟频率、数据位宽、传输模式(主从模式)、信号极性和相位等参数。 接下来,初始化SD/TFSD/TF在使用之前需要进行初始化,包括发送命令和接收响应。通常,通过SPI接口发送一系列的命令到SD/TF,以初始化片并获取片的状态。 然后,进行读写操作。读写操作需要发送相应的命令和数据到SD/TF,然后从片读取或写入数据。在读取数据,需要设置读取的起始地址和读取的字节数,然后通过SPI接口将读取到的数据传输到C51单片机。 最后,处理错误和异常情况。在SD/TF的读写过程中,可能会发生错误或异常情况,如通信超、数据传输错误等。在C51程序中需要根据具体情况对这些异常进行处理,以确保程序的正常运行。 总之,通过硬件SPI访问SD/TF需要进行SPI接口配置、片初始化、读写操作和异常处理等步骤。这些步骤是C51程序中实现SD/TF访问的基本过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值