一、 概述
在汽车电子产品的开发中,很多都需要实现信息安全的功能,其中安全烧录也是其中一项重要的功能,主要的功能需求是控制器在需要对 Flash 进行烧写时,
通过通信总线将 flash 驱动代码从外部传入,实现刷写功能后将 flash 驱动删除。从而避免代码对 flash 进行误操作,主要本文将介绍如何基于 SemiDrive E3
平台实现安全烧录的功能。
二、 软硬件准备
(1)E3110 官方开发板 图 2.1 E3110 官方开发板
(2)Jlink V11 调试器
图 2.2 Jlink 调试器
(3)Micro USB 数据线
图 2.3 Micro USB 数据线
(4)SSDK PTG3.0
图 2.4 SSDK PTG3.0 文件目录
(5)IAR (8.50.6 版本及以上)
图 2.5 IAR 软件界面
(6)串口调试工具 Putty
图 2.6 串口调试工具 Putty
三、 操作步骤
由于 E3 flash 驱动中的擦写和烧录函数都需要调用到 sdrv_xspi_proto_setup 函数,该函数内部实现都是寄存器操作,不存在外部调用,
因此可以将该函数指定到固定的地址中,然后提取出来,烧录时通过外部传入后拷贝到指定的地址,烧录完成后则删除。以下将使用
ssdk\boards\e3_176_ref\driver_demo\spi_nor\spi_nor_sync_polling 路径下的这个工程进行验证。
(1)将 sdrv_xspi_proto_setup 函数指定到 TCM 段中,起始地址为 0x40
图 3.1 指定函数到固定地址
查看 map 文件发现该函数已经指定到 0x40 的地址,函数大小为 0x3ac 字节。
图 3.2 map 文件
(2)通过串口将 0x40 地址中的数据打印出来,保存成数组。
图 3.3 将函数保存成数组
(3)将 sdrv_xspi_proto_setup 函数屏蔽掉里面的函数实现,并对其中的状态标志位置为失败,目的是为了执行完这个函数后不会出现阻塞,重新编译,并提取出来保存成数组
图 3.4 修改 sdrv_xspi_proto_setup 函数
图 3.5 将修改后的函数保存成数组
(4)在XSPI 驱动文件c 中的以下两个地方添加两行代码 ,保证调用空的 sdrv_xspi_proto_setup 函数不会出现阻塞。
图 3.6 第一处驱动代码修改
图 3.7 第二处驱动代码修改
(5)编译工程,进行验证,串口打印如下图,调用空的 sdrv_xspi_proto_setup 函数不会出现代码阻塞,读写操作均返回失败。
图 3.8 串口打印提示擦写失败
(6)在 c 中添加 flash_drv_load 函数,将数组中的驱动代码拷贝到 0x40 处,修改 main 函数,重新编译运行,从串口打印可以看出通过加载
完 flash 驱动到 0x40 地址后, flash 读写的测试便返回成功。
图 3.9 flash_drv_load 函数实现
图 3.10 修改 main 函数
图 3.11 修改后的串口打印
至此,我们已经实现了通过外部传入 flash 驱动进行烧写的验证。
评论