1. 项目背景与核心需求
在嵌入式安全领域,TPM(可信平台模块)作为硬件级的安全解决方案,正逐渐成为各类终端设备的标配。海思Hi3403作为一款广泛应用于网络摄像机、智能门禁等场景的主控芯片,其与TPM2.0模块的协同工作能力直接关系到设备的安全性能。本次调试的核心目标,是实现Hi3403通过SPI接口与TPM2.0芯片的稳定通信,为后续的安全启动、密钥管理等功能奠定硬件基础。
注意:TPM2.0模块选型时需确认其支持SPI接口协议,常见型号如ST33TPHF20SPI、IFX9670等均符合要求
2. 硬件连接与电路设计
2.1 引脚定义与接线规范
Hi3403的SPI控制器通常位于其扩展接口上,以某款开发板为例,关键引脚定义如下:
| Hi3403引脚 | TPM2.0引脚 | 功能说明 |
|---|---|---|
| GPIO12 | CS | 片选信号(低电平有效) |
| GPIO11 | CLK | 时钟信号(默认1MHz) |
| GPIO9 | MOSI | 主设备输出从设备输入 |
| GPIO10 | MISO | 主设备输入从设备输出 |
| 3.3V | VCC | 电源输入(注意电平匹配) |
| GND | GND | 共地连接 |
实操技巧:在PCB布局时,SPI信号线应尽量等长且远离高频信号线,CLK线可串联22Ω电阻抑制振铃
2.2 电源与信号完整性
TPM2.0模块通常工作在3.3V电压下,需特别注意:
- 电源滤波:在VCC引脚就近放置0.1μF+1μF去耦电容
- 电平转换:若Hi3403接口电压为1.8V,需使用TXS0108E等电平转换芯片
- 上拉电阻:CS信号建议增加10kΩ上拉电阻,避免初始状态浮空
3. 内核驱动配置
3.1 Linux内核选项开启
Hi3403 SDK通常基于Linux 4.9内核,需确保以下配置已启用:
code复制CONFIG_TCG_TPM=y
CONFIG_TCG_TIS_SPI=y
CONFIG_HISI_SPI=y
配置路径:
bash复制make menuconfig
-> Device Drivers
-> TPM Hardware Support
[*] TPM Interface Specification 2.0
[*] TPM 2.0 SPI Interface
3.2 设备树(DTS)配置示例
在hi3403.dtsi中添加SPI控制器和TPM节点:
dts复制&spi_0 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins>;
cs-gpios = <&gpio0 12 0>;
tpm@0 {
compatible = "tcg,tpm_tis-spi";
reg = <0>;
spi-max-frequency = <1000000>;
interrupt-parent = <&gpio0>;
interrupts = <13 IRQ_TYPE_LEVEL_LOW>;
};
};
关键参数说明:
spi-max-frequency:根据模块规格设置(通常1MHz)interrupts:连接TPM的IRQ引脚(如有)cs-gpios:必须与硬件连接的CS引脚一致
4. 系统层调试与验证
4.1 驱动加载检查
系统启动后执行:
bash复制dmesg | grep -i tpm
预期输出应包含:
code复制tpm_tis_spi spi0.0: 2.0 TPM (device-id 0x1B, rev-id 16)
tpm tpm0: TPM is ready
4.2 基础功能测试
使用tpm2-tools工具包进行验证:
bash复制tpm2_getrandom 8 --hex
tpm2_pcrread sha256:0
常见问题处理:
- 若出现"TPM not found"错误:
- 检查/sys/class/tpm/tpm0目录是否存在
- 用示波器测量SPI信号是否正常
- 通信超时问题:
- 降低spi-max-frequency至500kHz测试
- 确认CS信号极性设置正确
5. 性能优化与安全配置
5.1 SPI传输优化
通过调整DMA缓冲区提升吞吐量:
c复制static struct tpm_tis_spi_phy hi3403_tpm_phy = {
.iobuf = devm_kzalloc(&spi->dev, MAX_SPI_FRAMESIZE, GFP_KERNEL),
.flow_control = 1,
.latency = 100,
};
5.2 安全启动集成
在U-Boot中增加TPM测量功能:
c复制int tpm_measure_bootloader(void)
{
u8 digest[SHA256_DIGEST_SIZE];
sha256_csum(blob, len, digest);
return tpm2_pcr_extend(0, digest);
}
6. 生产测试方案
6.1 自动化测试脚本
示例测试流程:
python复制import tpm2_pytss
tpm = tpm2_pytss.TCTI()
print(tpm.get_capability(tpm2_pytss.TPM2_CAP_TPM_PROPERTIES))
6.2 故障注入测试
需验证的特殊场景:
- SPI时钟抖动容忍度(±10%频率偏移)
- 电源跌落测试(3.3V→2.8V阶跃变化)
- 异常报文处理(故意发送错误CRC)
经验总结:在实际项目中,我们发现ST33TPHF20SPI模块对CS信号下降沿非常敏感,建议在驱动中添加50μs的CS建立时间延迟。此外,海思芯片的SPI控制器时钟分频寄存器存在特定步进要求,需参照《Hi3403硬件设计指南》第7.3章设置。
