linux系统烧录并读取sn和mac的方法
概述
基于Flash存储客户产品序列号和网络MAC地址的三种方法:可读写分区,只读分区,预留裸分区。
烧录工具擦除选项说明:


一 可读写分区
可读写分区在用烧录工具升级程序时勾选 Flash全部擦除可将 SN/MAC 分区一并擦除,所以如果只是部分更新镜像,最好选择分区擦除。
1.1 SN 和 MAC 分区配置方法
烧录工具 SFC->分区信息页面中添加 SN/MAC 分区,分区位置和大小根据实际需求决定,分区大小必须按擦除块对齐。比如:SPI Nand Flash 分区大小按 128K字节齐。SPI Nor Flash 分区大小依赖实际擦除命令配置,通常情况下按 32K 字节对齐。eMMC Flash 分区大小按 512 字节对齐。
1.1.1 nand配置
SPI Nand Flash 上因为可能存在坏块,所以划分区时要预留坏块,示例中 SN 和MAC 分区大小各 1MBytes。

在POLICY策略配置页面中添加SN和MAC烧写策略,示例中数据来源自SN_ADD和MAC_ADD配置,烧录成功后数据按 16 进制数自动加 1,注意策略中偏移地址与分区配置中偏移地址相同。

烧录完成后:

打开存储读数据的文件内容如下:
hexdump -C -n 20 sn_r.txt
hexdump -C -n 20 mac_r.txt

可见读出来的SN、MAC和烧录工具写入的数据一致。
1.1.2 nor配置
SPI Nor Flash 中没坏块,所以示例中 SN 和 MAC 分区划分 32KBytes 就够了。

在策略配置页面中添加SN和MAC烧写策略,示例中数据来源自SN_ADD和MAC_ADD配置,烧录成功后数据按 16 进制数自动加 1,注意策略中偏移地址与分区配置中偏移地址相同。

烧录完成后:

打开存储读数据的文件内容如下:
hexdump -C -n 20 sn_r.txt
hexdump -C -n 20 mac_r.txt

可见读出来的SN、MAC和烧录工具写入的数据一致。
1.1.3 emmc配置
eMMC 的分区配置在 Uboot 代码板级目录下 partitions.tab 文件中:

在策略配置页面中添加SN和MAC烧写策略,示例中数据来源自SN_ADD和MAC_ADD配置,烧录成功后数据按 16 进制数自动加 1,注意策略中偏移地址与分区配置中偏移地址相同。

1.2 SN 和 MAC 分区存储和读取方法
在烧录工具写 SN 和 MAC 完成后在进度条上显示数据内容。

在文件系统中使用 hexdump 命令读取 SN 和 MAC 数据,例如:
hexdump -C -n 5 /dev/mtd3
hexdump -C -n 12 /dev/mtd4

或者,用 C 语言实现一个读取分区数据的应用程序,示例中 mtd3 是 SN 分区节点,mtd4 是 MAC 分区节点,例如:

在文件系统中执行应用程序读 SN 或 MAC 内容,如下:

二 只读分区
烧录工具配置分区只读权限,在文件系统中不允许擦写只读分区,保护数据不被改写。
2.1 烧录工具只读分区配置方法


2.2 文件系统中验证只读分区
在文件系统中使用 mtdinfo 命令(截至2026.1.8日,kernel4.4对这个命令的支持还有问题,只有kernel5.10支持)查看分区节点信息,如图所示 mtd3 和 mtd4两个分区节点为不可写权限。
mtdinfo -a

使用 echo 命令向只读分区写入数据,提示操作不允许,hexdump 命令读取数据正常。

三 预留裸分区
在内核驱动 MTD 管理层中将 Flash 容量结尾划出一部分区域来存储数据,被划分出来的区域称为裸分区,而裸分区对 MTD 管理层而言是不可见的,所以不能通过正常手段来读写擦裸分区,需要通过特殊接口访问裸分区,从而起到保护的作用。
目前本方法只支持sfc nand启动的系统,对于nor启动和emmc启动的系统,不支持预留裸分区的方法。
3.1 启用预留裸分区配置方法
在 Kernel menuconfig 菜单中选中以下选项:

3.2 烧录工具配置读写预留分区
在策略页面中添加预留分区读写配置,忽略偏移地址。

勾选 SFC->基本信息页面中的“激活 SFC NAND 预留空间”选项。
勾选“预留空间数据保护”的话,同一个板子只能烧录一次,如果需要测试多次烧录预留空间数据,那么就不要勾选“预留空间数据保护”了。

烧写完成后在进度条上显示写入和回读内容。

打开存储读数据的文件内容如下:


3.3 文件系统中读预留裸分区
在文件系统中用 cat 命令读取 SN 和 MAC 预留分区节点,如下所示
# find / -name nand_sn
/sys/devices/platform/ahb2/13440000.sfc/nand_fmw/nand_sn
#
# cat /sys/devices/platform/ahb2/13440000.sfc/nand_fmw/nand_sn
S202601140001
#
# ls /sys/devices/platform/ahb2/13440000.sfc/nand_fmw/
nand_license nand_mac nand_sn
#
# cat /sys/devices/platform/ahb2/13440000.sfc/nand_fmw/nand_mac
112233445566
#
