eMMC write protect开发记录。

问题背景

  出现一题设备经过压力测试后无法正常开机,分析后发现eMMC GPT和bl2区域数据被损坏。客户希望对改区域增加write protect功能,避免有软件误写导致数据损坏。

方案设计

  一开始认为这个需求比较适合使用power-on write protect。因为GPT和bl2区域只有在烧录和bl2阶段有写入数据的需求。所以设计等待开机到BL2结束时设定power-on wp,这样可以让kernel阶段得到保护,而且重新上电后write protect又消失,不影响bl2阶段对GPT和BL2的写入。

 

但是忽略了一个问题,kernel里面eMMC driver存在power cycle和hardware reset,这两个动作都会让power-on wp失效。包括正常开机和读写出错的场景都会触发。

 于是将方案修改成使用temporary write protect。每次开机在hsm中,eMMC初始化完成后就disable temporary write protect,等开到bl2之后,再enable temporary write protect。

问题记录

1.如何测试是否被写保护。

使用dd命令读取写保护数据:dd if=/dev/mmcblk0 of=/data/dump_raw bs=512 count=10 skip=1024 (跳过1024个bs,连续读取10个bs)

再写入golden data: dd if=/dev/zero of=/dev/mmcblk0 bs=512 count=10 seek=1024; sync(跳过1024个bs, 注意写入数据和dump_raw要不同)

接着回读数据,确保没有写入。echo 3 > /proc/sys/vm/drop_cache; dd if=/dev/mmcblk0 of=/data/read_back bs=512 count=10 skip=1024.

必须加上sync和drop_cache, 不然有可能数据没有真实的执行写入eMMC和从eMMC回读。特别是drop_cache, 实验中发现,即使数据没有写入eMMC,也从cache中读到了上一次写入的数据,原因就是数据在cache中没有被清除。

 

posted @ 2025-02-27 22:21  老胡同学  阅读(50)  评论(0)    收藏  举报