瑞芯微硬件识别码

OTP全称为一次性编程存储器(One-Time Programmable),是一种可以只写入一次数据,并且不能再被重复写入的固态存储器。由于otp的数据只能写入一次,因此它可以在生产过程中被用作生产标识、产品序列号或其他关键信息的存储。OTP还可以用于存储敏感数据,例如加密密钥等。
当前瑞芯微RK3568A使用OTP,瑞芯微的CPUID使用OTP存储,硬件识别码考虑用CPUID。
读取CPUID需要适配几点:

1 修改内核驱动,支持驱动与设备树的匹配

1.1  文件 kernel/linux/linux-5.10/drivers/nvmem/rockchip-otp.c 202行参数,修改为rk3568-otp

static const struct of_device_id rockchip_otp_match[] = {
    {
        .compatible = "rockchip,px30-otp",
        .data = (void *)&px30_data,
    },
    {
        .compatible = "rockchip,rk3568-otp", // 改成这里的内容
        .data = (void *)&px30_data,
    },
    { /* sentinel */ },
};

1.2 修改OTP实现

修改文件 kernel/linux/linux-5.10/drivers/nvmem/rockchip-otp.c  246行 参数phy修改为otp_phy
static int rockchip_otp_probe(struct platform_device *pdev)
{
....
    otp->rst = devm_reset_control_get(dev, "otp_phy"); // 改成这里的内容
....
}

2 修改设备树,确保clock-names一致

  使用vi 修改补丁文件:kernel/linux/patch/rk3568/kernel.patch 102150行clock-names。
  注:不能直接vscode修改,会出现格式错误而报错
    otp: otp@fe38c000 {
        compatible = "rockchip,rk3568-otp";
        reg = <0x0 0xfe38c000 0x0 0x4000>;
        #address-cells = <1>;
        #size-cells = <1>;
        clocks = <&cru CLK_OTPC_NS_USR>, <&cru CLK_OTPC_NS_SBPI>,
             <&cru PCLK_OTPC_NS>, <&cru PCLK_OTPPHY>;
        clock-names = "otp", "apb_pclk", "phy";   // 改成这里的内容
        resets = <&cru SRST_OTPPHY>;
        reset-names = "otp_phy";

3 修改c_show,在cat /proc/cpuinfo时输出CPU Serial

修改文件kernel/linux/linux-5.10/arch/arm64/kernel/cpuinfo.c 
函数c_show的倒数第二行,添加seq_printf(m, "CPU Serial\t: %08x%08x\n\n", system_serial_high, system_serial_low);

static int c_show(struct seq_file *m, void *v)
{
....
        seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr));
    }
    seq_printf(m, "CPU Serial\t: %08x%08x\n\n", system_serial_high, system_serial_low);
    return 0;
}

验证:

img

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐