NXP i.MX8M纳米CPU提供了一组一次性可编程比特(eFuses),结构为15个银行。每个码组由四个32位的字组成。

内核配置

您可以通过内核配置选项管理OTP驱动程序支持:

  • NXP NVMEM片上OTP内存支持CONFIG_NVMEM_IMX_OCOTP

的内置选项已启用ConnectCore 8M Nano默认内核配置文件

内核驱动程序

OTP内存驱动程序位于:

文件 描述

司机/ nvmem / imx-ocotp.c

i.MX 6/7/8片上OTP控制器支持

设备树绑定

i.MX8M Nano OTP内存驱动程序设备树绑定记录在文档/ devicetree /绑定/ nvmem / imx-ocotp.txt

i.MX8M纳米器件树
Ocotp: ocotp-ctrl@30350000 {compatible = "fsl,imx8mq-ocotp", "fsl,imx7d-ocotp", "syscon";Reg = <0x30350000 0x10000>;clock = <&clk IMX8MN_CLK_OCOTP_ROOT>;*/ #address-cells = <1>;#size-cells = <1>;};

ConnectCore 8M Nano器件树集只读访问OTP位以防止电子引信的意外编程。

ConnectCore 8M纳米器件树
&ocotp{/*默认情况下,将OTP位设置为只读*/只读;};

OTP用户空间使用情况

OTP字可以通过sysfs at访问/ sys /汽车/ nvmem /设备/ imx-ocotp0 / nvmem

读取OTP位

转储所有OTP字的值。

#Hexdump -e ' '"%08_ax: " 4/4 "%08x " "\n"' /sys/bus/nvmem/devices/imx- ocopt0 /nvmem 00000000: feafa9eb 50d00200 24226998 00000000 0000000000 00000010: 20000800 00020000 0000007f 08000000 00000020: 20000000 00000000 00000000 00000030: 00000000 00000000 00000000 00000000 000090: 14100009 118e0b01 0007b848 00000000 000000a0: badabada badabada badabada badabada badabada badabada badabada badabada00000000 00000000 00000000 00000000 * 00000000 f0: badabada badabada badabada 00000000 00000100: 00000000 00000000 00000000 00000000 * 00000000: badabada badabada badabada badabada 00000140: 55002001 00028840 0000 0003 f000 eddc 00028840: 0000年a8c1302b ede8 a881300b 00025 c54 00025: 52801 e00 52801 00000000 00000000 00000000: 00000000 00000000 00000000 00000000 * 00000000 e0: 00000000 00000000 00000000 07 c31a01 00000000 f0: badabada badabada badabada badabada
下面的值显示badabada对应于无法读取的OTP字,如加密密钥。

要转储某一个OTP字,不要使用- s的参数。hexdump命令。相反,使用dd命令并将结果管道到hexdump.要计算单词的偏移量,请使用以下公式:

\$"Offset" = ("Bank" * 4) + "Word"\$

例如,对于Bank 9 Word 1,偏移量为9 * 4 + 1 =37

使用dd块大小(bs)为4字节,计数为1个字,并跳过计算偏移量:

#Dd status=none if=/sys/bus/nvmem/devices/imx-ocotp0/nvmem of=/dev/stdout bs=4 count=1 skip=37 | hexdump -v -e '4/4 "%08x " "\n"' 118e0b01 . if=/sys/bus/nvmem/devices/imx-ocotp0/nvmem of=/dev/stdout bs= 1 count=1

写OTP位

OTP位只能被吹一次。给它们编程是一个不可逆的操作。

缺省情况下,OTP位访问配置为只读。要启用写权限,请在设备树中添加以下设备:

& octp {/delete-property/read-only;};

重新编译设备树并将其部署到您的设备。

OTP位访问是用32位字完成的。要将32位值写入特定字,请使用printf并将输出管道传输到dd

#printf<值>| dd of=/sys/bus/nvmem/devices/imx-ocotp0/nvmem bs=4 count=1 seek=<抵消>conv = notrunc

地点:

  • <值>要写入的32位值。以小端字节顺序指定值。

  • b = 4以4字节(一个完整的32位字)设置块大小。

  • 数= 1设置以1(4字节)写入的块(字)。

  • 寻求=<抵消>设置写入位置的偏移量(以字为单位)。

  • conv = notrunc避免截断输出。

要计算单词的偏移量,请使用以下公式:

\$"Offset" = ("Bank" * 4) + "Word"\$

例如,对于Bank 9 Word 1,偏移量为9 * 4 + 1 =37

写下这个词0 x12345678对于该偏移量,交换字节以小端字节形式将它们呈现给printf命令:

#Printf '\x78\x56\x34\x12' | dd of=/sys/bus/nvmem/devices/imx-ocotp0/nvmem bs=4 count=1 seek=37 conv=notrunc