原创 扩展外部eMMC存储

2023-11-23 14:32 958 1 2 分类: MCU/ 嵌入式

By Toradex胡珊逢

简介

存储器的嵌入式设备中扮演着重要角色,上面不仅安装有操作系统,同时也保存着应用程序和运行日志等。对于存储器如 eMMC,写入的数据量决定其使用寿命,对于有大量日志记录的应用,通常可以选用一个大容量的存储设备。文件将介绍如何在 Toradex 的计算机模块 Apalis iMX6 上扩展一个外部 eMMC。

 

Apalis iMX6 具有四个 SDIO 接口,其中一个已经用于模块本身的 eMMC。其余三个均可以用于连接另外的 eMMC。为了提高读写速度,SDIO 接口可配置为 8bit 模式。

扩展外部eMMC存储315.png 

eMMC 模块硬件连接

eMMC 内部有一个控制器,负责执行来自 host 的 MMC 指令、将数据写入到存储单元、维护映射关系确保每个存储单元可以均衡得写入等。该控制器通常需要两路电压。如下图的 VCCQ 用于驱动控制器本身,该电压也用于面向 host 的 SDIO 接口,因此需要于 host 端的 SDIO 电平一致。Apalis iMX6 的 SDIO 为 3.3V,Toradex 另外一个系列 Verdin 模块的接口则为 1.8V。目前绝大多数的 eMMC 都可以支持 1.8V 和 3.3V 两种电压。图中另外一个电源 VCC 用于存储单元 NAND 的供电。

扩展外部eMMC存储606.png 

 

 

在 Apalis Evalution Board 上 Apalis iMX6 的其中一路 SDIO 通过 X5 排针座引出。由于 eMMC 通常不需要热拔插,所以 SDIO 接口的 CD 引脚就不需要再被使用。

扩展外部eMMC存储716.png 

 

我们选取市场上常见的 eMMC 模块,制作适合 Apalis Evalution Board 的转接板。在实际应用中,可以把 eMMC 芯片直接焊接在定制的底板上,以增加牢固性和稳定性。

扩展外部eMMC存储813.png 

 

下面是 eMMC 模块转接板原理图。其中 U1 是 eMMC 模块底部的 B2B 链接器,上面的引脚都直接来自 eMMC 芯片。其中使用到了 CMD、CLK、DATA0~7。由于 Apalis iMX6 的 SDIO 为 3.3V,所以 eMMC 模块的两路电源均使用 3.3V。iMX6 SoC 只有其中的两路 SDIO 才有 Reset 引脚,其中一路已经用于模块自身的 eMMC,另一路的 SD4_RESET 没有引出到模块的金手指上。这对于扩展的 eMMC 来说将失去硬件复位功能,只能采用断电复位 eMMC。图中 H1 是 2.54mm 排针,可以直接连接 Apalis Evalution Board。另外,对于 CMD、CLK、DATA0~7 信号在设计底板时务必使用等长布线。

扩展外部eMMC存储1163.png 

 

 

将转接板插入到 Apalis Evalution Board 的 X5,并提供 3.3V 供电。

扩展外部eMMC存储1216.png 

 

 

Device tree 修改

软件方面采用 Linux BSP v3,对应内核为 toradex_4.14-2.3.x-imx分支。对 eMMC 的配置较为简单,在 device tree 中完成即可。

 

修改 `imx6q-apalis-eval.dts` 中的 usdhc1 节点,删除原来的 CD 引脚。

diff --git a/arch/arm/boot/dts/imx6q-apalis-eval.dts \

b/arch/arm/boot/dts/imx6q-apalis-eval.dts

index 70be137c1f8b..6accb3611bcf 100644

--- a/arch/arm/boot/dts/imx6q-apalis-eval.dts

+++ b/arch/arm/boot/dts/imx6q-apalis-eval.dts

@@ -468,9 +468,9 @@

 

/* MMC1 */

&usdhc1 {

- pinctrl-names = "default";

- pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit &pinctrl_mmc_cd>;

- cd-gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;

+ /*pinctrl-names = "default";*/

+ /*pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit &pinctrl_mmc_cd>;*/

+ /*cd-gpios = <&gpio4 20 GPIO_ACTIVE_LOW>;*/

status = "okay";

};

 

 

修改 `imx6qdl-apalis.dtsi` 中 usdhc1 引脚配置,添加 non-removable 属性。这里限制了 SDIO 的最高频率为 20MHz。原因是在测试中发现通过转接板方式连接 eMMC 模块,当 SDIO 使用高频率时钟通信时容易引起发 MMC 相关错误。如果在定制底板上直接放置 eMMC 芯片并合理布线,则不会存在该问题。

diff --git a/arch/arm/boot/dts/imx6qdl-apalis.dtsi \

b/arch/arm/boot/dts/imx6qdl-apalis.dtsi

index e18ac19dd3bf..5622d1aadb88 100644

--- a/arch/arm/boot/dts/imx6qdl-apalis.dtsi

+++ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi

@@ -910,11 +910,14 @@

/* MMC1 */

&usdhc1 {

pinctrl-names = "default";

- pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit>;

+ pinctrl-0 = <&pinctrl_usdhc1_4bit &pinctrl_usdhc1_8bit>; /* 8bit */

vqmmc-supply = <®_module_3v3>;

+ max-frequency =<20000000>;

bus-width = <8>;

- disable-wp;

+ /*disable-wp;*/

no-1-8-v;

+ mmc-ddr-3_3v;

+ non-removable;

status = "disabled";

};

 

 

eMMC 测试

重新启动后查看日志中 mmc0 相关信息,mmc0 控制器上时别到外部扩展的 eMMC 模块。

root@apalis-imx6:~# dmesg|grep mmc0

[ 2.823135] mmc0: SDHCI controller on 2190000.usdhc [2190000.usdhc] using ADMA

[ 2.951996] mmc0: new DDR MMC card at address 0001

[ 2.962770] mmcblk0: mmc0:0001 58A43A 14.6 GiB

[ 2.975332] mmcblk0boot0: mmc0:0001 58A43A partition 1 4.00 MiB

[ 2.987248] mmcblk0boot1: mmc0:0001 58A43A partition 2 4.00 MiB

[ 2.998825] mmcblk0rpmb: mmc0:0001 58A43A partition 3 4.00 MiB, chardev (245:1)

 

 

由于前面设置了 20MHz 的最高时钟,mmc0 的实际频率为 19.8MHz,8bit 总线模式。

root@apalis-imx6:~# cat /sys/kernel/debug/mmc0/ios

clock: 20000000 Hz

actual clock: 19800000 Hz

vdd: 21 (3.3 ~ 3.4 V)

bus mode: 2 (push-pull)

chip select: 0 (don't care)

power mode: 2 (on)

bus width: 3 (8 bits)

timing spec: 8 (mmc DDR52)

signal voltage: 0 (3.30 V)

driver type: 0 (driver type B)

 

测试写入一个 1GB 文件,速度约为 14MB/s。

root@apalis-imx6:/media/mmcblk0p1# time dd if=/dev/zero of=./write_test_8bit \

bs=1M count=1024

 

1024+0 records in

1024+0 records out

 

real 1m8.987s

user 0m0.001s

sys 0m11.510s

 

 

总结

上面演示了如何在 Toradex 计算机模块上方便地扩展外部 eMMC,以及一些注意事项如 eMMC 接口的电压选择、调试期间的时钟设置和载板设计中的布线问题。

作者: hai.qin_651820742, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-1864768.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

给作者打赏,鼓励TA抓紧创作!

赞赏支持
点赞 1
赞赏0

文章评论1条评论)

登录后参与讨论

开发工匠 2023-12-6 09:09

写的好,学习和参考
相关推荐阅读
hai.qin_651820742 2024-01-26 14:31
嵌入式Linux下使用 Plymouth 实现开机画面示例
By Toradex秦海1). 简介嵌入式 Linux 下传统实现 Splash Screen 的方式是通过替换 kernel 默认的 TUX 小企鹅 logo 为定制的开机画面图片来实现嵌入式设备开...
hai.qin_651820742 2024-01-19 14:39
Flutter 在嵌入式 Linux 的应用
By Toradex胡珊逢简介在嵌入式 Linux 设备上常使用 Qt 作为开发图形界面应用的框架,随着 web 和移动端图形框架技术快速发...
hai.qin_651820742 2023-12-26 16:02
Apalis_iMX6_eMMC常驻ToradexEasyInstaller
By Toradex胡珊逢简介Toradex Easy Installer 是 Toradex 计算机模块上出厂预装的软件,可以令开发人员首次安装不同的操作系统,同时也适生产线上模块的批量烧写作业。通...
hai.qin_651820742 2023-12-22 10:44
NXP iMX8MM 通过 TFTP和 NFS 启动示例
By Toradex秦海1). 简介嵌入式 Linux 设备开发调试时候为了方便部署各种配置和修改常用的一种方法就是通过网络启动,具体就是将 Linux Ker...
hai.qin_651820742 2023-12-01 11:53
NXP iMX8M Plus Qt5 双屏显示
By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 T...
我要评论
1
1
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /4 下一条