cat /proc/cpuinfo两个板卡一致
1.原因分析
先说结论:这个 Serial 不是芯片真实 ID,是 U-Boot 塞进设备树的一个固定值;内核里真正按芯片唯一 ID 计算序列号的代码被一个永远不成立的宏编译掉了。 原因分析/proc/cpuinfo 的 Serial 有两个来源,优先级如下: 设备树根节点的 serial-number 属性(U-Boot 启动时注入)—— setup.c#L959-L970 优先使用它。你们的 U-Boot 是预编译的 uboot.img,它读不到有效的每芯片 ID 时会用固定回退值生成 serial#,于是两块板都是437255c32d0716be。 内核从 OTP 芯片唯一 ID 算出的 CRC 序列号 —— rockchip-cpuinfo.c 会读 OTP 里16字节的芯片 ID(每颗芯片出厂唯一)并算出序列号,但这段代码被 #ifdef CONFIG_NO_GKI 包住,而整个内核树里根本不存在 NO_GKI 这个 Kconfig 符号,所以从未生效。 前提条件其实都齐了:rk3506_emmc_defconfig 已有 CONFIG_ROCKCHIP_CPUINFO=y、CONFIG_NVMEM_ROCKCHIP_OTP=y,rk3502.dtsi 里也有 otp 和 cpuinfo 节点(otp_id:id@a)。 已做的修改 rockchip-cpuinfo.c:去掉 #ifdef CONFIG_NO_GKI 保护,让驱动始终从 OTP 芯片 ID 计算 system_serial_high/low。 setup.c:/proc/cpuinfo 输出时优先使用 OTP 派生的序列号,仅当其为0时才回退到 U-Boot 注入的 serial-number(这样也不受驱动 probe 时序影响)。2.修改patch
modified:SMH-STD3506/sdk_linux/linux-6.1/arch/arm/kernel/setup.c modified:SMH-STD3506/sdk_linux/linux-6.1/drivers/soc/rockchip/rockchip-cpuinfo.c no changes added tocommit(use"git add"and/or"git commit -a")root@a4694c04b1a9:/home/cyzhangep/workspace/3506_130version/std_v3_0319/code/device/board/hhwl# git diff SMH-STD3506/sdk_linux/linux-6.1/arch/arm/kernel/setup.c diff--git a/SMH-STD3506/sdk_linux/linux-6.1/arch/arm/kernel/setup.c b/SMH-STD3506/sdk_linux/linux-6.1/arch/arm/kernel/setup.c index cb88c6e69..d6dca0a7e100644---a/SMH-STD3506/sdk_linux/linux-6.1/arch/arm/kernel/setup.c+++b/SMH-STD3506/sdk_linux/linux-6.1/arch/arm/kernel/setup.c @@-1322,7+1322,15@@staticintc_show(structseq_file*m,void*v)seq_printf(m,"Hardware\t: %s\n",machine_name);seq_printf(m,"Revision\t: %04x\n",system_rev);-seq_printf(m,"Serial\t\t: %s\n",system_serial);+/* prefer the serial derived from the SoC unique chip id over the + * bootloader-provided serial-number DT property, which may be a + * fixed fallback value identical across boards + */+if(system_serial_high||system_serial_low)+seq_printf(m,"Serial\t\t: %08x%08x\n",+system_serial_high,system_serial_low);+else+seq_printf(m,"Serial\t\t: %s\n",system_serial);return0;}root@a4694c04b1a9:/home/cyzhangep/workspace/3506_130version/std_v3_0319/code/device/board/hhwl# root@a4694c04b1a9:/home/cyzhangep/workspace/3506_130version/std_v3_0319/code/device/board/hhwl# root@a4694c04b1a9:/home/cyzhangep/workspace/3506_130version/std_v3_0319/code/device/board/hhwl# git diff SMH-STD3506/sdk_linux/linux-6.1/drivers/soc/rockchip/rockchip-cpuinfo.c diff--git a/SMH-STD3506/sdk_linux/linux-6.1/drivers/soc/rockchip/rockchip-cpuinfo.c b/SMH-STD3506/sdk_linux/linux-6.1/drivers/soc/rockchip/rockchip-cpuinfo.c index02befb165..74f19902c100644---a/SMH-STD3506/sdk_linux/linux-6.1/drivers/soc/rockchip/rockchip-cpuinfo.c+++b/SMH-STD3506/sdk_linux/linux-6.1/drivers/soc/rockchip/rockchip-cpuinfo.c @@-80,13+80,12@@staticintrockchip_cpuinfo_probe(structplatform_device*pdev)dev_info(dev,"SoC\t\t: %lx\n",rockchip_soc_id);-#ifdef CONFIG_NO_GKI+/* derive a per-chip serial from the OTP chip id (unique per die) */system_serial_low=crc32(0,buf,8);system_serial_high=crc32(system_serial_low,buf+8,8);dev_info(dev,"Serial\t\t: %08x%08x\n",system_serial_high,system_serial_low);-#endifreturn0;}