在emmc 协议v5.0以上的版本增加了设备使用寿命的预估值以及保留块的使用情况。该两种信息都存在于emmc 的ext_csd(The Extended CSD register)寄存器中。

  • PRE_EOL_INFO[267]

        此寄存器信息固定了保留块的使用情况,当其值为0x02时,表示已经消耗了80%的保留块,提示警告。当为0x03时,提示已经到了使用寿命。

  • DEVICE_LIFE_TIME_EST_TYP_A[268]/B[269]

       设备使用寿命的评估值,以10%使用寿命时间为分隔。当其值为0x0B时表示已经到了使用寿命。

在嵌入式linux下,可以通过cat命令查看emmc的ext_csd寄存器信息。

cat  /sys/kernel/debug/mmc2/mmc2\:0001/ext_csd, 其中mmc2需要从具体的系统中查找。ls /dev/mmcblk?应该显示相应的值,此处应该为mmcblk2。

这样不好查看,一连串16进制字符串,应该有1024个字符。为了方便查看使用重定向后,通过shell 脚本查看。

  • 重定向保存ext_csd寄存器的数值:

cat  /sys/kernel/debug/mmc2/mmc2\:0001/ext_csd > ext_csd.txt

#!/bin/bash

echo "eMMC ext_csd 寄存器值 (索引 0~511)"
echo "=================================="

# 读取整个文件内容
content=$(cat ext_csd.txt | tr -d ' \n\r\t')

# 检查内容长度
content_len=${#content}
echo "文件内容长度: $content_len 个字符"

# 初始化索引
index=0

# 处理连续的十六进制字符串
for ((i=0; i<content_len && index<512; i+=2)); do
    # 提取两个字符作为一个字节
    if [ $((i+1)) -lt $content_len ]; then
        hex_byte="${content:$i:2}"
    else
        # 如果字符串长度是奇数,最后一个字节补0
        hex_byte="${content:$i:1}0"
    fi
    
    # 确保是有效的十六进制数字
    if [[ "$hex_byte" =~ ^[0-9A-Fa-f]{2}$ ]]; then
        # 转换为大写
        hex_byte=$(echo "$hex_byte" | tr '[:lower:]' '[:upper:]')
        
        # 显示 ext_csd[index] 格式
        printf "ext_csd[%3d] : 0x%s\n" $index $hex_byte
        
        # 索引递增
        ((index++))
    fi
done

# 如果内容不足512字节,用0填充剩余索引
while [ $index -lt 512 ]; do
    printf "ext_csd[%3d] : 0x00\n" $index
    ((index++))
done

echo
echo "处理完成,共显示 $index 个寄存器值"
  • 将以上代码保存为extcsd_show.sh文件,并上传至嵌入式系统,和重定向的ext_csd.txt保存在同一路径下。增加extcsd_show.sh的执行权限。
  • chmod a+x extcsd_show.sh,如果非超级用户需要使用sudo 命令,即sudo chmod a+x extcsd_show.sh
  • 然后执行./extcsd_show.sh即可。

从打印输出的信息中可以看到和寿命信息相关的寄存器的值。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐