tag 标签: emmc

相关博文
  • 热度 1
    2025-2-26 12:17
    744 次阅读|
    0 个评论
    ARM 处理器平台 eMMC Flash 存储磨损测试示例
    ​ By Toradex秦海 1).简介 目前工业嵌入式ARM平台最常用的存储器件就是eMMC Nand Flash存储,而由于工业设备一般生命周期都比较长,eMMC存储器件的磨损寿命对于整个设备来说至关重要,因此本文就基于NXP i.MX8M Mini ARM处理器平台演示eMMC器件磨损测试的示例流程。 关于eMMC存储器件的基本介绍可以参考如下文章,eMMC存储器件通常包含有eMMC Nand Flash控制器和一定数量的Nand Flash存储颗粒来组成,ARM处理器主机对于eMMC的操作都要通过Nand Flash控制器进行映射,同时Nand Falsh控制器还负责Wear leveling/ECC/Bad Block Management等功能以保证eMMC器件稳定可靠工作。 eMMC (Linux) | Toradex Developer Center eMMC存储器件的磨损寿命主要由其包含的Nand Flash颗粒存储单元的P/E(programming and erasing)次数来决定,不同Nand Flash颗粒种类通常的P/E次数不同,一个大概的参考如下,不同品牌不同工艺的颗粒会有差异。 ./ SLC Nand Flash - 10K - 100K P/E Cycles ./ MLC Nand Flash - 3K - 10K, normally 3K P/E Cycles ./ 2D TLC Nand Flash - normally 1K P/E Cycles ./ 3D TLC Nand Flash - normally 3K P/E Cycles 但是由于Nand控制器操作Nand Flash存储单元programming写入最小单位是Page,而erasing擦除最小单位是Block,因此当写入/擦除数据不是对应最小单元整数倍时候就会产生额外的开销,同时还附加其他Wear leveling/Garbage collection/Bad Block Management等功能产生的开销,就会导致实际写入的全寿命数据量要小于理论上按照单元P/E Cycles计算的数据量(eMMC capacity * P/E cycles),这个差异就是WAF(Write Amplification Factor)写放大因子((eMMC capacity * P/E cycles)/actual full-lifetime data written)。更多相关说明请参考如下文章。 使用 eMMC 闪存设备的磨损估计 因此由于上述Nand Flash控制器地址映射和WAF的存在,磨损测试是无法直接将Host写入数据和实际Nand Flash颗粒的P/E对应的,而WAF在不同写入情况下又是一个动态数值,所以我们依赖Linux Kernel mmc-utils工具或者eMMC提供商的专用软件来读取Extended CSD rev 1.7 (MMC 5.0)包含的Health Status信息,并通过其每10%的线性变化和实际写入数据是否对应线性变化,以及最终写入数据量,可以推算出实际的WAF。 eMMC (Linux) | Toradex Developer Center 关于CSD Register中Health Status和Spare Block Register的定义说明如下 ./Device life time estimation typeA/B: life time estimationbased on blocks P/E cycles, provided in steps of 10%, e.g.: 0x02 means 10%-20% device life time used. ./Pre EOL information: overall status for reserved blocks. Possible values are: 0x00 - Not defined. 0x01 - Normal: consumed less than 80% of the reserved blocks. 0x02 - Warning: consumed 80% of the reserved blocks. 0x03 - Urgent: consumed 90% of the reserved blocks. 本文所示例的平台来自于ToradexVerdini.MX8MM嵌入式平台。 2.准备 a). Verdin i.MX8MM ARM 核心版配合 Dahlia 载板并连接调试串口用于后续测试 b).参考 这里 下载 Toradex Yocto Linux BSP6 Reference Image c).参考 这里 的说明将上述下载的 BSP Image 安装到 Verdin i.MX8MM 核心板。 d).准备一个 SD 卡,参考 这里 的说明使用上述下载的 BSP Image 制作启动 SD 卡。 3). 测试流程 a).将SD插入Dahlia载板后启动,系统自动会优先从外部SD卡(mmc1)启动,可以通过如下调试串口log信息来进一步判定。 ------------------------------- ...... Hit any key to stop autoboot: 0 switch to partitions #0, OK mmc1 is current device Scanning mmc 1:1... Found U-Boot script /boot.scr ...... ------------------------------- b).因为系统会自动mount eMMC对应设备分区,为了后续测试,需要先关闭自动挂载。 ------------------------------- root@verdin-imx8mm-07276322:~# mount |grep /dev/mmcblk0 /dev/mmcblk0p2 on /media/RFS-mmcblk0p2 type ext4 (rw,relatime) /dev/mmcblk0p1 on /media/BOOT-mmcblk0p1 type vfat (rw,relatime,gid=6,fmask=0007,dmask=0007,allo) ------------------------------- 在设备Linux下执行下面脚本关闭自动挂载,执行成功后上述挂载信息就没有了。 ------------------------------- #!/bin/sh -e systemd-umount /dev/mmcblk0p1 systemd-umount /dev/mmcblk0p2 systemctl stop systemd-udevd systemctl stop systemd-remount-fs count=`ls -1 /etc/udev/rules.d/*automount.rules 2/dev/null |wc -l` if then rm /etc/udev/rules.d/*automount.rules fi ------------------------------- c).接下来要通过Linux磁盘操作工具来进行大量写入数据来测试eMMC的磨损,本文测试使用fio工具,当然还有像dd/hdparm等工具也可以根据情况酌情选择。 ./ 首先创建 fio 配置文件,类似如下,具体说明可以参考 fio官方文档 。 ------------------------------- bs=32k direct=0 ioengine=libaio iodepth=4 verify=crc32c filename=/dev/mmcblk0 ; emmc device filename verify_dump=1 verify_fatal=1 randrepeat=0 description=Write once area, used for testing date retention stonewall rw=write verify_pattern=0xaa555aa5 ; fixed data pattern size=256M offset=0 description=Verify write once area, used for testing data retention stonewall rw=read verify_only size=256M offset=0 description=Write r/w stress data area with random data stonewall rw=write do_verify=0 offset=256M description=Verify r/w stress data area stonewall rw=read verify_only offset=256M ------------------------------- //其中需要说明的是bs (block size)的设置需要根据不同的eMMC手册中定义的Optimal Write Size以尽可能减小WAF,比如当前测试eMMC手册中定义如下 实际读取的寄存器数值如下,对应为32KB,因此fio配置文件中bs参数设置为32k或者其整数倍数,可以保证Nand Flash颗粒存储单元写入都是按照Page Size。 ------------------------------- $mmc extcsd read /dev/mmcblk0 | grep write Optimal write size ------------------------------- ./然后可以通过类似如下测试脚本来进行一次写入和验证,测试fio的配置正确和可用以及当前的eMMC Health Status状态 ------------------------------- #!/bin/bash -e EMMC_DEVICE=/dev/mmcblk0 FIO_TEST_NAME=emmc-pe-test.fio echo " eMMC P/E test preparation on ${EMMC_DEVICE}" echo " eMMC EXTCSD Health Status" mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 DEVICE_LIFE_TIME_EST mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 PRE_EOL_INFO echo " Write once data" fio --section=write-once "${FIO_TEST_NAME}" echo " Verify write once data" fio --section=verify-write-once "${FIO_TEST_NAME}" ------------------------------- ./最后可以通过如下循环写入脚本持续写入测试来测试eMMC磨损情况。 ------------------------------- #!/bin/bash -e EMMC_DEVICE=/dev/mmcblk0 COUNT=0 FIO_TEST_NAME=emmc-pe-test.fio echo " Starting eMMC P/E test on ${EMMC_DEVICE}" while true do echo " Run $COUNT" echo " eMMC EXTCSD Health Status" mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 DEVICE_LIFE_TIME_EST mmc extcsd read "${EMMC_DEVICE}" | fgrep -A1 PRE_EOL_INFO echo " Check write once data" fio --section=verify-write-once "${FIO_TEST_NAME}" echo " Wear eMMC" fio --section=write --section=verify "${FIO_TEST_NAME}" COUNT=$(($COUNT + 1)) done ------------------------------- ./磨损测试一次全盘写入和验证的log信息如下,由于实际测试完成时间会非常长,通常根据eMMC容量不同可能需要几天甚至十几天时间,本文就不演示最终完成的数据。最后可以根据寿命达到90%以上时候全部log信息统计出类似如下表格eMMC每磨损10%实际P/E的次数和数据量,得出eMMC的全寿命磨损数据/磨损是否线性以及实际WAF数值。另外,关于LIFE_TIME_EST_A还是LIFE_TIME_EST_B没有标准定义,由各个厂商自行定义,所以实际以厂商定义为准。 ------------------------------- Starting eMMC P/E test on /dev/mmcblk0 Run 0 eMMC EXTCSD Health Status Device life time estimation type B i.e. 0% - 10% device life time used Device life time estimation type A i.e. 0% - 10% device life time used Pre EOL information i.e. Normal Check write once data verify-write-once: (g=0): rw=read, bs=(R) 32.0KiB-32.0KiB, (W) 32.0KiB-32.0KiB, (T) 32.0KiB-32.4 fio-3.30 Starting 1 process Jobs: 1 (f=1) verify-write-once: (groupid=0, jobs=1): err= 0: pid=583: Fri Apr 29 20:04:38 2022 Description : read: IOPS=4908, BW=153MiB/s (161MB/s)(256MiB/1669msec) ... Run status group 0 (all jobs): READ: bw=153MiB/s (161MB/s), 153MiB/s-153MiB/s (161MB/s-161MB/s), io=256MiB (268MB), run=166c Disk stats (read/write): mmcblk0: ios=1009/0, merge=0/0, ticks=2390/0, in_queue=2391, util=94.47% Wear eMMC write: (g=0): rw=write, bs=(R) 32.0KiB-32.0KiB, (W) 32.0KiB-32.0KiB, (T) 32.0KiB-32.0KiB, ioeng4 verify: (g=1): rw=read, bs=(R) 32.0KiB-32.0KiB, (W) 32.0KiB-32.0KiB, (T) 32.0KiB-32.0KiB, ioeng4 fio-3.30 Starting 2 processes Jobs: 1 (f=1): write: (groupid=0, jobs=1): err= 0: pid=590: Fri Apr 29 20:17:15 2022 Description : write: IOPS=732, BW=22.9MiB/s (24.0MB/s)(14.4GiB/642435msec); 0 zone resets ... verify: (groupid=1, jobs=1): err= 0: pid=607: Fri Apr 29 20:17:15 2022 Description : read: IOPS=4812, BW=150MiB/s (158MB/s)(14.4GiB/97725msec) ... Run status group 0 (all jobs): WRITE: bw=22.9MiB/s (24.0MB/s), 22.9MiB/s-22.9MiB/s (24.0MB/s-24.0MB/s), io=14.4GiB (15.4GB),c Run status group 1 (all jobs): READ: bw=150MiB/s (158MB/s), 150MiB/s-150MiB/s (158MB/s-158MB/s), io=14.4GiB (15.4GB), run=9c Disk stats (read/write): mmcblk0: ios=58819/29449, merge=0/3732727, ticks=143387/81519893, in_queue=81663280, util=99.% ... ------------------------------- 4 ).总结 本文基于NXP i.MX8MM ARM处理器平台说明和演示了eMMC寿命磨损测试的流程,同时由于测试是线性写入,得出的结果和实际应用具体情况可能有不同,不过在实际应用中,为了最大程度的增加eMMC存储器件的寿命和可靠性,在写入数据时候最好不要无论大小数据每次都直接写入磁盘,最好使用缓存将要写入的数据累积到一定量之后,根据具体eMMC Optimal Write Size来最终写入磁盘,以尽可能减少WAF,提高磨损寿命。 ​
  • 热度 1
    2025-2-21 16:23
    500 次阅读|
    0 个评论
    在嵌入式系统开发领域,存储器作为信息交互的核心载体,其技术特性直接影响着系统性能与稳定性。然而,有些人在面对Linux、安卓等复杂操作系统环境时,理解其存储机制尚存局限,为突破这些技术瓶颈,飞凌嵌入式希望通过对存储相关知识的分享,助力大家构建完整的存储知识体系框架。 首先,嵌入式场景中常用来存储数据的介质分为两类: Managed NAND,以eMMC(embedded Multi-Media Card)TF卡、SD卡为主内部带有存储管理控制器。 Raw NAND,以NAND为主的未带有存储管理功能,只包含简单IO逻辑控制。 上图描述了NAND存储和eMMC存储的关系,NAND Controller代指核心板的CPU,NAND指实际参与存储的区域,由此看出实际上eMMC和NAND的区别在于存储管理控制是在eMMC内部还是核心板的 CPU。存储管理主要包括功能:坏块管理、ECC校验、磨损均衡、数据保持和地址管理及映射等。 01 存储的相关概念 存储类型分为SLC、MLC、TLC、QLC。嵌入式常用类型低存储容量一般为SLC和MLC,高存储容量一般是TLC。 SLC (Single-Level Cell) 速度快,寿命长,价格贵,理论擦写次数在10万次左右。 MLC (Multi-Level Cell) 速度较快,寿命较长、价格较贵,理论擦写次数在3000-5000次。 TLC (Trinary-Level Cell) 速度较慢,寿命较短、价格最便宜,理论擦写次数在1000-3000次。 QLC (Quad-Level Cell) 容量可以做的更大,成本上更低,劣势就是P/E寿命更短。 pSLC (pseudo SLC) 以 MLC的FLASH为基础,但在每个Cell中只存1 bit而不是2 bit数据。由于在同一个Cell中跟SLC一样只存储一个bit,但又不是真的 SLC,所以称之pSLC。依上述原理,若将MLC用做pSLC,存储空间将减半,寿命通常可以提升到3万次左右。 P/E (Program/Erase Count) :擦写寿命。耐用性两个指标之一。 TBW (Total Bytes Written) :总写入量。是厂商用以界定质保期的数值,即超过了这个数值的写入量之后,厂商就不再给予质保服务。耐用性两个指标之一。 FW (Firmware) :由于eMMC内部控制器属于软件编程控制器,会需要固件,eMMC在存储厂家出厂前已经烧录对应固件。 WA (Write amplification) :写放大。表示实际写入的物理数据量是写入数据量的多少倍,即:闪存写入的数据量÷主控写入的数据量 = 写放大。 GC (Garbage Collection) :垃圾回收。NAND介质的存储写入是按照页(Page)写入,是按照块(Block)擦除。 02 eMMC和NAND的差异 (1)eMMC与NAND对比 (2) eMMC的相关特点 eMMC使用单独的硬件控制器对存储进行管理,相比于Linux下NAND驱动管理可靠性更高。 内部固件集成多种功能:使用寿命等健康信息记录、根据不同的场景动态调整内部存储策略。 接口标准,各厂家各容量兼容性好。 eMMC的存储寿命普遍不如NAND寿命长。相比于NAND大部分使用SLC或者MLC,eMMC大部分是MLC或者TLC,eMMC相对于NAND单位寿命会低;但是由于eMMC的存储容量一般较大,一定程度上抵消单位寿命低的劣势。 (3)NAND的相关特点 系统的驱动主要是由SoC厂家及系统上游逻辑决定,针对不同的NAND存储介质无法发挥出最大优势,或者存在驱动逻辑兼容性问题。 NAND容易出现位翻转、坏块等情况,相比eMMC内部管理,CPU管理需要占用较大系统开销用来维护存储内容。 接口标准采用ONFI接口协议,但是不同厂家的NAND的页、OOB区及块大小等配置存在差异,如果物料停产需要换型会存在镜像不兼容风险。 NAND的布局控制是由CPU管理,对应的分区管理和逻辑定制会有很大的灵活性,根据实际应用场景制定不同的管理策略。 NAND单位存储寿命较长。 综上,产品存储选型建议使用带有管理功能的eMMC。 03 存储使用建议 eMMC:建议预留25%空间,避免频繁触发GC。 由于存储的最小写入单元是Page,最小的擦除单元是Block。以16K page举例,如果单次写入小于 一个Page的数据,会造成写放大。如果单次写入数据远远小于Page的大小,写放大会很严重。最终会导致寿命大大缩短。建议对小数据先通过DDR内存进行缓冲,缓冲一定数据再组合写入。 使用中如果出现异常断电,定期需要对文件系统使用工具扫描修复,避免由于异常断电数据未及时 保存导致文件系统异常。如果是频繁异常掉电场景,可以增加硬件加掉电保护措施,用来保证系统稳定性。 产品设计初期,需要结合实际应用场景存储数据的频率,为保证产品寿命要求,评估选择合适的存储类型和容量。 04 飞凌嵌入式赋能 (1)针对eMMC,根据对寿命及健康信息读取分析,让应用掌握更全面的存储信息,并作出合理的调整。 应用可以实时监控当前的存储寿命,用来在设备存储寿命降低到自定义阈值时发送报警信号做 特定处理。 应用可以实时查看系统的健康信息,评估存储的写放大系数,用来评估应用软件升级对存储带 来的影响,进而估算剩余寿命。 (2)针对NAND,根据增加手段统计实际NAND的擦写、搬移、标记等信息,给出应用IO操作改善建议。 (3)针对所有类型存储,根据对终端设备不同使用场景特点采集分析,评估出更适合场景的应用编写参考。 终端实际应用场景主要集中在:日志循环存储、应用关键数据参数存储及缓冲数据。 日志循环存储特点:循环擦写,写入频繁,读取不频繁。和文件系统同时存在,会出现写频繁 和只读混放数据,会影响整体的稳定性。举例:大部分eMMC的损耗平衡特性是全盘范围,软件上的文件系统分区未实现想要的数据隔离效果,这个其实可以在初期评估阶段解决。 关键数据特点:小数据量状态信息,比较重要,信息量不大。 缓冲数据特点:顺序写入,整体擦除。 实际软件开发过程中,根据如上数据特点,为保证产品稳定性在如下3个阶段给出优化方案: 产品开发前 做对应存储方案选型,能够提前评估出风险。通过实际应用场景产品的目标寿命, 评估出存储类型、文件系统类型、应用数据读写建议及烧录方式等。 产品开发完成前 做实际存储的优化。产品的样机测试阶段需要对系统实际读写频次、大小做接 口数据统计分析,对存储做数据稳定性分析(例:NAND存储变位及坏块分析)。通过分析给 出读写数据单元大小优化建议、连续/随机读写优化建议。 产品部署前 做最终的预估寿命评估。结合最终优化效果给出实际应用中的一个寿命预估。 除上述优化策略外,不同eMMC、NAND厂家在满足接口协议标准前提下提供了不同的优化特性,部分优化特性需要结合操作系统修改才能发挥出更好的效果。 05 总结 存储稳定性直接关乎到最终产品的稳定性,本文围绕eMMC和NAND的特性做了对比介绍,目的是帮助研发工程师在实际开发产品过程中更简单、更高效。
  • 热度 8
    2023-12-1 11:53
    2154 次阅读|
    0 个评论
    By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 软件配置 Verdin iMX8M Plus 模块使用 Toradex Multimedia Reference Image V6.4.0 版本,其包含 Qt5.15 相关运行环境。默认系统中已经使能了 Verdin iMX8M Plus 原生的 HDMI 和 DSI 转 HDMI 适配板。 root@verdin-imx8mp-07320826:~# cat /boot/overlays.txt fdt_overlays=verdin-imx8mp_hdmi_overlay.dtbo verdin-imx8mp_dsi-to-hdmi_overlay.dtbo 在 /sys/class/drm 目录下可以看到两个 HDMI 接口,分别是 HDMI-A-1 和 HDMI-A-2,但是它们都属于同一个 DRM 接口 card1。所以系统只能运行一个 weston 实例。 root@verdin-imx8mp:/sys/class/drm# ls card0 card1 card1-HDMI-A-1 card1-HDMI-A-2 renderD128 version #gbm-format=argb8888 idle-time=0 use-g2d=1 xwayland=true repaint-window=16 #enable-overlay-view=1 modules=screen-share.so shell=kiosk-shell.so Qt 应用在 weston 环境中运行时会对应一个 app_id,例如 BSP 中默认的应用 /usr/share/cinematicexperience-1.0。在命令行中启动该应用前添加 WAYLAND_DEBUG=1。 root@verdin-imx8mp:~# cd /usr/share/cinematicexperience-1.0 &1|grep app xdg_toplevel@21.set_app_id("Qt5_CinematicExperience") 另外一个 Qt 应用位于 `/usr/share/qtsmarthome-1.0/`中。 root@verdin-imx8mp:~# cd /usr/share/cinematicexperience-1.0 &1|grep app xdg_toplevel@21.set_app_id("smarthome") 从上面的命令中可以看到两个应用的 app_id 分别是 Qt5_CinematicExperience 和 smarthome。相应地在 /etc/xdg/weston/weston.ini 创建两个 。指定在 HDMI-A-1 上显示 Qt5_CinematicExperience 应用,而 HDMI-A-2 上则显示 smarthome 应用。配置完成后保存并重启。 name=HDMI-A-1 app-ids=Qt5_CinematicExperience mode=1920x1080 name=HDMI-A-2 app-ids=smarthome mode=1920x1080 分别启动上面两个 Qt 应用后可以在两个 HDMI 显示器上看到相应的内容。 总结 上面介绍了双屏显示的配置,在 Linux BSP 上可以十分便捷得实现,除了提到的 HDMI 接口,对于 LVDS 也是同样的配置方法。
  • 热度 2
    2023-11-23 14:32
    1486 次阅读|
    1 个评论
    B y Toradex 胡珊逢 简介 存储器的嵌入式设备中扮演着重要角色,上面不仅安装有操作系统,同时也保存着应用程序和运行日志等。对于存储器如eMMC,写入的数据量决定其使用寿命,对于有大量日志记录的应用,通常可以选用一个大容量的存储设备。文件将介绍如何在 Toradex 的计算机模块 Apalis iMX6 上扩展一个外部 eMMC。 Apalis iMX6 具有四个 SDIO 接口,其中一个已经用于模块本身的 eMMC。其余三个均可以用于连接另外的 eMMC。为了提高读写速度,SDIO 接口可配置为 8bit 模式。 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 的供电。 在Apalis Evalution Board 上 Apalis iMX6 的其中一路 SDIO 通过 X5 排针座引出。由于 eMMC 通常不需要热拔插,所以 SDIO 接口的 CD 引脚就不需要再被使用。 我们选取市场上常见的eMMC 模块,制作适合 Apalis Evalution Board 的转接板。在实际应用中,可以把 eMMC 芯片直接焊接在定制的底板上,以增加牢固性和稳定性。 下面是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 信号在设计底板时务必使用等长布线。 将转接板插入到Apalis Evalution Board 的 X5,并提供 3.3V 供电。 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 = ; - cd-gpios = ; + /*pinctrl-names = "default";*/ + /*pinctrl-0 = ;*/ + /*cd-gpios = ;*/ 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-0 = ; /* 8bit */ vqmmc-supply = ; + max-frequency = ; bus-width = ; - disable-wp; + /*disable-wp;*/ no-1-8-v; + mmc-ddr-3_3v; + non-removable; status = "disabled"; }; eMMC 测试 重新启动后查看日志中mmc0 相关信息,mmc0 控制器上时别到外部扩展的 eMMC 模块。 root@apalis-imx6:~#dmesg|grepmmc0 mmc0: SDHCI controller on 2190000.usdhc using ADMA mmc0: new DDR MMC card at address 0001 mmcblk0: mmc0:0001 58A43A 14.6 GiB mmcblk0boot0: mmc0:0001 58A43A partition 1 4.00 MiB mmcblk0boot1: mmc0:0001 58A43A partition 2 4.00 MiB 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:20000000Hz actualclock:19800000Hz vdd:21(3.3~3.4V) busmode:2(push-pull) chipselect: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#timeddif=/dev/zeroof=./write_test_8bit\ bs=1Mcount=1024 1024+0recordsin 1024+0recordsout real1m8.987s user0m0.001s sys0m11.510s 总结 上面演示了如何在Toradex 计算机模块上方便地扩展外部 eMMC,以及一些注意事项如 eMMC 接口的电压选择、调试期间的时钟设置和载板设计中的布线问题。 ​
  • 热度 3
    2023-9-19 16:23
    1390 次阅读|
    0 个评论
    在对评估板进行开发验证时,时常会遇到根目录空间不足的情况,而在其他分区又有冗余空间,这时则需要对分区大小重新进行分配,合理化利用分区空间。 本文将基于HD-RK3568-IOT评估板主要讲解如何修改eMMC分区大小。 ​ 1. 分区表介绍 本文主要通过修改parameter.txt 分区表文件来实现修改分区大小,示例分区表内容如下: FIRMWARE_VER:1.0 MACHINE_MODEL:RK3568 MACHINE_ID:007 MANUFACTURER:RK3568 MAGIC:0x5041524B ATAG:0x00200800 MACHINE:0xffffffff CHECK_MASK:0x80 PWR_HLD:0,0,A,0,1 TYPE:GPT CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00010000@0x00008000(boot),0x00010000@0x00018000(recovery),0x00010000@0x00028000(backup),0x00c00000@0x00038000(rootfs),0x00040000@0x00c38000(oem),-@0x00c78000(userdata:grow) uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9 paramter.txt 中的uboot,misc,boot,recovery,oem,rootfs 分区应该保留,重新分区时无需删除。 分区参数的格式是size@offset(name) ,size 和offset 的单位是块,对EMMC 就是”扇区”,扇区大小是512byte 。EMMC 最前面的8MiB 空间是保留区,分区时必须从8MiB 之后的空间开始。 比如第一个分区是u-boot 分区: 0x00002000@0x00004000(uboot)0x00002000@0x00004000(uboot) size=0x2000*0x200/0x100000=4MiB offset=0x4000*0x200/0x100000=8MiB 分区名 "uboot" 2. 扩展rootfs 分区大小到7GB 目前rootfs 在分区表的大小如下所示: 0x00c00000@0x00038000(rootfs),0x00040000@0x00c38000(oem),-@0x00c78000(userdata:grow) 已知rootfs 分区大小是0x00c00000(6GB ,进制转换*512Byte) ,可以考虑从userdata 分区中回收0x200000(1GB) ,oem 分区大小不动,那么修改后的分区配置是: 0x00e00000@0x00038000(rootfs),0x00040000@0x00e38000(oem),-@0x00e78000(userdata:grow) 修改完后保存,重新将parameter.txt 文件导入到烧写工具中,以及更新修改分区的固件进行烧写,在此需要更新parameter.txt ,rootfs ,oem 以及userdata 。 烧写成功后进入系统使用df-h 查看存储空间,可以看到/dev/root 分区已经从6GB 扩展到7GB 了。
相关资源