目录
1 芯片介绍
vSE1801A安全芯片是广东为辰信息科技有限公司针对智能汽车网络安全需求定制研发的安全专用芯片,通过CC EAL4+认证,具有安全性高、支持密码算法丰富、功耗低等特点。经国家密码管理局批准,配用SM2、SM3、SM4等商用密码算法,同时支持DES、3DES、AES、RSA、ECC、SHA等国际常用密码算法。
vSE1801A安全芯片内置安全协处理器,主要提供**生成、数字签名、签名验证、数据加解密等密码服务,并提供安全存储空间用于保存**及用户私有数据。
芯片COS系统符合GlobalPlatform、JavaCard等国际标准,具有完善的安全管理体系,**的生成、存储及管理符合国家密码管理局相关规范。
芯片CPU工作频率为40MHz,工作温度范围为-40~85摄氏度。
芯片封装:QFN 32PIN
硬件接口:SPI/IIC
2 运行环境
硬件环境:高通MDM9607
运行系统:linux kernel3.18
3 硬件原理图
SPI接口:
4 调试修改步骤
本芯片采用SPI接口可看做标准的spi slave设备
a 创建SPI master和 slave node DTS配置:(master部分一般配置好了不用修改)
..\kernel\arch\arm\boot\dts\qcom\mdm9607.dtsi
aliases {
……
/* spi device */
spi1 = &spi_1; /*suvine add for spi2*/
……
};
spi_1: [email protected] { /* BLSP1 QUP1 */
compatible = "qcom,spi-qup-v2";
#address-cells = <1>;
#size-cells = <0>;
reg-names = "spi_physical", "spi_bam_physical";
reg = <0x78b6000 0x600>,
<0x7884000 0x2b000>;
interrupt-names = "spi_irq", "spi_bam_irq";
interrupts = <0 96 0>, <0 238 0>;
spi-max-frequency = <19200000>;
pinctrl-names = "spi_default", "spi_sleep";
pinctrl-0 = <&spi1_default &spi1_cs0_active>;
pinctrl-1 = <&spi1_sleep &spi1_cs0_sleep>;
clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>,
<&clock_gcc clk_gcc_blsp1_qup2_spi_apps_clk>;
clock-names = "iface_clk", "core_clk";
qcom,infinite-mode = <0>;
qcom,use-bam;
qcom,use-pinctrl;
qcom,ver-reg-exists;
qcom,bam-consumer-pipe-index = <14>;
qcom,bam-producer-pipe-index = <15>;
qcom,master-id = <86>;
status = "ok";
status = "ok";
compatible= "vecentek,vSE1801A";
reg= <0>;
spi-max-frequency= <1000000>;
};
};
b 配置相应管脚
..\kernel\arch\arm\boot\dts\qcom\mdm9607-pinctrl.dtsi
&soc {
tlmm_pinmux: [email protected] {
……//snip
spi1 {
spi1_default: spi1_default {
/* active state */
mux {
/* MOSI, MISO, CLK */
pins = "gpio4", "gpio5", "gpio7";
function = "blsp_spi2";
};
config {
pins = "gpio4", "gpio5", "gpio7";
drive-strength = <12>; /* 12 MA */
bias-disable = <0>; /* No PULL */
};
};
spi1_sleep: spi1_sleep {
/* suspended state */
mux {
/* MOSI, MISO, CLK */
pins = "gpio4", "gpio5", "gpio7";
function = "gpio";
};
config {
pins = "gpio4", "gpio5", "gpio7";
drive-strength = <2>; /* 2 MA */
bias-pull-down; /* PULL Down */
};
};
spi1_cs0_active: cs0_active {
/* CS */
mux {
pins = "gpio6";
function = "blsp_spi2";
};
config {
pins = "gpio6";
drive-strength = <2>;
bias-disable = <0>;
};
};
spi1_cs0_sleep: cs0_sleep {
/* CS */
mux {
pins = "gpio6";
function = "gpio";
};
config {
pins = "gpio6";
drive-strength = <2>;
bias-disable = <0>;
};
};
};
如果以上配置正确的话 SPI 总线会被注册在 /sys/class/spi_master/spi
c 使用kernel自带的spidev驱动
..\kernel\arch\arm\configs\mdm9607_defconfig:
……
CONFIG_SPI_SPIDEV=y
……
..\kernel\drivers\spi\spidev.c:
static const struct of_device_id spidev_dt_ids[] = {
{ .compatible = "rohm,dh2228fv", },
{ .compatible = "qcom,spi-msm-codec-slave", },
{ .compatible = "vecentek,vSE1801A", }, //对应DTS的compatible
{},
};
以上配置修改正确后可以看见spi slave设备节点
d 由于reset脚接在pmic的GPIO_04上,我们可以直接用qpnp-pin驱动
DTS配置mdm9607-mtp.dtsi:
……
&pm8019_gpios {
[email protected] { /* GPIO 4 */
qcom,mode = <1>; /* Digital output */
qcom,output-type = <1>; /* CMOS logic */
qcom,invert = <1>; /* Output high */
qcom,vin-sel = <0>; /* VPH_PWR */
qcom,src-sel = <0>; /* GPIO */
qcom,out-strength = <1>; /* Low drive strength */
qcom,master-en = <1>; /* Enable GPIO */
};
};
打开CONFIG_GPIO_QPNP_PIN_DEBUG宏就可控制reset脚了
..\kernel\arch\arm\configs\mdm9607_defconfig:
……
CONFIG_GPIO_QPNP_PIN_DEBUG=y
……
相应控制节点:
Echo 1 > invert 拉高;0 拉低
5 芯片测试
芯片厂商给了个自测程序代码,整合进我们的平台交缠编译生成可执行文件se_spi_test
执行se_spi_test后14s左右后正确结果会显示如下log,否则失败:
……
se_applet_version_get finish
SE get applet version surcess.
SNContent:
00010003
se_get_se_applet_version_self_test PASS.
6 参考文档
80-p1511-1b_f_mdm9x07_mdm8207_mdm9628_gpio_pin_assignment_spreadsheet.xlsm
80-nu767-1_h_linux_bam_low-speed_peripherals_configuration_and_debug_guide.pdf
mdm9x07_linux_pmic_gpio_and_mpp_software_configuration.pdf