0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于SWD离线烧写OTP

恩智浦MCU加油站 来源:恩智浦MCU加油站 2022-12-22 14:10 次阅读

嵌入式开发的最后阶段是要将成果产品化,要交付工厂量产。对于NXP i.MXRT系列的芯片来说,除了要交付给工厂项目固件外,还需要工厂写OTP区域来配置芯片启动方式或者开启芯片的安全功能。离线编程器烧写固件和OTP的方法有多种,如ISP,SWD或者Jtag等。

今天就为大家介绍下,如何让离线编程器利用SWD接口烧写OTP。

编写OTP烧写算法

直接操作寄存器来写OTP的过程很繁琐。很多编程器借助Flash烧写算法来烧写Flash,我们也可以借助烧写Flash的方法来烧写OTP。 本加油站曾经有一篇《编写Keil的自定义Flash烧写算法FLM》,在这篇文章中,作者介绍了如何利用Keil来编写Flash烧写算法。 编写OTP烧写算法的方法和编写Flash烧写算法的方法一样,只需要复用接口函数Init和UnInit,新增接口OTPWrite。和Flash相关的操作函数可以直接删掉。OTP的烧写算法接口声明如下:

int Init (unsigned long adr, unsigned long clk, unsigned long fnc);

int UnInit (unsigned long fnc);

int OTPWrite (unsigned long idx, unsigned long value);
每个烧写算法接口函数都是对应OTP驱动函数的封装。下面是这3个接口函数的参考实现:
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
    BOARD_BootClockRUN();
#if (defined(FSL_FEATURE_OCOTP_HAS_TIMING_CTRL) && FSL_FEATURE_OCOTP_HAS_TIMING_CTRL)
    OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk));
#else
    OCOTP_Init(OCOTP, 0U);
#endif
    return (0);              
}

int OTPWrite (unsigned long idx, unsigned long value) {
    status_t status = kStatus_Success;
    status = OCOTP_WriteFuseShadowRegister(OCOTP, idx, value);
    return (kStatus_Success == status) ? (0) : (1);
}

int UnInit (unsigned long fnc) {
    OCOTP_Deinit(OCOTP);
    return (0);
}

以OCOTP_开头的函数是OTP driver接口。函数BOARD_BootClockRUN的具体实现请查看SDK内OTP driver的示例。

提取算法代码

Keil MDK生成的后缀为FLM的算法文件实质上是一段与地址无关的代码。对于下载器来说,一种简单的使用方法是把文件内的相关函数指令提取出来。这里需要用到开源项目pyocd里的python脚本FlashAlgo。该项目github地址为:

https://github.com/pyocd/FlashAlgo

FlashAlgo默认会从符号表里查找EraseSector等函数名。所以我们需要做一点改动,把flash相关操作的函数名换成OTP相关操作的函数名。

文件flash_algo.py中集合REQUIRED_SYMBOLS改动如下:

    REQUIRED_SYMBOLS = set([
        "Init",
        "UnInit",
        "OTPWrite", # EraseSector
    ])

文件generate_blobs.py中列表TEMPLATES改动如下:

TEMPLATES = [
    ("c_blob.tmpl", "c_blob.c"),
]

c_blob.tmpl在文件夹templates中,将program_target_t改名为program_ocotp_t,并将其中和flash相关的Erase、Program等项删掉,新增OTPWrite,新增项如下:

static const program_ocotp_t ocotp = {

[...]

{{'0x%08x' % (algo.symbols['OTPWrite'] + header_size + entry)}}, // OTPWrite

[...]

}

在执行脚本之前,先安装python依赖的第三方库,命令行如下:

pip install requirements.txt

执行脚本的命令行如下:

python generate_blobs.py --blob_start 0x20000000otp_prog.FLM

这里的0x20000000是将要运行算法的目标RAM地址,读者可以根据芯片RAM位置配置。otp_prog.FLM为上一小节Keil MDK编译出来的FLM文件。c_blob.c是生成的包含烧写算法及相关信息的文件。

烧写OTP

要通过SWD烧写OTP,就需要实现一个SWD时序协议。ARM公司的开源项目DAPLINK实现了支持arm cortex系列MCU的SWD时序协议。具体的实现在文件swd_host.c内。

该项目地址是https://github.com/armmbed/daplink

这里我们使用swd_host.c中的接口来演示如何烧写OTP。和OTP相关的操作接口函数主要有两个:

uint8_t swd_write_memory(uint32_t address, uint8_t *data, uint32_t size);

uint32_t swd_flash_syscall_exec(const program_syscall_t *sysCallParam, uint32_t entry, uint32_t arg1, uint32_t arg2, uint32_t arg3, uint32_t arg4, flash_algo_return_t return_type);

调用OTP算法需要的主要参数在文件c_blob.c中的结构体program_ocotp_t。我们仿照DAPLINK中program_target_t给出program_ocotp_t的声明:

typedef struct {

    const uint32_t  init;

    const uint32_t  uninit;

    const uint32_t  OCOTPWrite;

    const program_syscall_t sys_call_s;

    const uint32_t  program_buffer;

    const uint32_t  algo_start;

    const uint32_t  algo_size;

    const uint32_t *algo_blob;

    const uint32_t  program_buffer_size;

} program_ocotp_t;

调用swd_write_memory来下载烧写算法到目标地址的示例代码如下:

swd_write_memory(ocotp.algo_start, (uint8_t *)ocotp.algo_blob, ocotp.algo_size);

调用OTP模块初始化函数的示例代码如下:

swd_flash_syscall_exec(&ocotp.sys_call_s, ocotp.init, 0, 0, 0, 0, FLASHALGO_RETURN_BOOL) ;

调用OTP模块写fuse函数的示例代码如下:

swd_flash_syscall_exec(&ocotp.sys_call_s, ocotp.OTPWrite, fuse_idx, fuse_value, 0, 0, FLASHALGO_RETURN_BOOL);

到此,利用SWD烧写OTP就介绍完了。

如果读者熟悉烧写flash的流程,会发现烧写OTP和烧写flash没有差别。

OTP的值可以放在编程器的配置文件中,和固件存储在一起。要想保护OTP的值,可以将它们存储在硬件安全模块(HSM)中。笔者参与的基于RT1020的离线编程器采用了文章中描述的方法烧写OTP。该项目预计明年初会以应用笔记的方式发布在恩智浦官网。

限于篇幅,脚本中有些和flash相关的域我没有删掉,相信聪明的读者可以自行完成。

审核编辑:汤梓红出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NXP
    NXP
    +关注

    关注

    60

    文章

    1096

    浏览量

    175745
  • FlaSh
    +关注

    关注

    9

    文章

    1407

    浏览量

    146202
  • OTP
    OTP
    +关注

    关注

    4

    文章

    111

    浏览量

    46482
  • 烧写
    +关注

    关注

    0

    文章

    52

    浏览量

    14037
  • SWD
    SWD
    +关注

    关注

    1

    文章

    44

    浏览量

    11552
收藏 人收藏

    评论

    相关推荐

    KEIL+SWD+JLINK仿真不能

    很顺利,程序写进去,好像也可以进行在线调试;2、第二次时就不能写进去,提示
    发表于 01-02 10:01

    swd方法

    (开发板为例子)、2.swd方法
    发表于 08-05 07:07

    SWD离线

    SWD离线器本项目使用STM32F103RBT6作为主控,基于ST官方CMSIS-DAP项目进行修改,实现可脱机、可去读保护。GitHub项目地址: OfflineSWD外观项目功能1.
    发表于 08-06 09:50

    怎样去使用一种SWD离线器呢

    SWD离线器有哪些功能?怎样去使用一种SWD离线器呢?
    发表于 11-10 06:07

    如何通过jtag来da14580的OTP image并且修改l蓝牙设备地址?

    da14580的OTP image并且修改l蓝牙设备地址?1、接线连接线VP 6.8V、GND、TMS、TCK。2、HEX2、OTP Header image 以及修改
    发表于 02-09 06:30

    CH573量产是留串口呢还是SWC、SWD呢?

    离线器,脱机看说明,脱机是留串口呢还是SWC、SWD呢?还有,CONFIG配置成RST禁用,SWC,SWD禁用,芯片禁止读出,会不会影响再次
    发表于 09-05 07:02

    Jlink转SWD顶针

    SWD接口,底下是顶针接口,方便小批量程序
    发表于 06-03 16:57 48次下载

    NXP PMIC芯片步骤

    OTP是只能一次的,所以建议先几片,测试确保的脚本没问题后,再进行大批量的,避免造成损失。
    发表于 09-18 09:50 21次下载
    NXP PMIC芯片<b>烧</b><b>写</b>步骤

    STM32 MCU 的软件方法探讨

    。对于广大的开发 者来说,用STlink来进行是最简单和常用的方法。一般来说STLink 可以支持JATG模式和SWD模式。SWD模式对于硬件来说比较简单。对于
    发表于 10-25 20:51 18次下载
    STM32 MCU 的软件<b>烧</b><b>写</b>方法探讨

    ALTERA CPLD离线方案设计(MCU模拟JTAG)

    离线系统,那么必须要通过专门的工具把固件下载到CPLD中去(如USB Blaster),但这样非常繁琐
    发表于 11-05 16:21 11次下载
    ALTERA CPLD<b>离线</b><b>烧</b><b>写</b>方案设计(MCU模拟JTAG)

    PIC OTP 单片机程序方法

    ;作者第一次使用这种OTP单片机,按照惯性遇到的问题一一记录一下;MCU最小系统与引脚用到的工具用到的软件
    发表于 11-16 12:51 12次下载
    PIC <b>OTP</b> 单片机程序<b>烧</b><b>写</b>方法

    JTAG/SWD/ISP/SWIM详解单片机的四种方式

    SWD/ISP/SWIM详解单片机的四种方式单片机是一种可编程控制器,搭好硬件电路后,可以利用程序实现很多非常复杂的逻辑功能,与纯硬件电路相比,简化了硬件外围的设计、方便了逻辑
    发表于 12-03 18:36 18次下载
    JTAG/<b>SWD</b>/ISP/SWIM详解单片机的四种<b>烧</b><b>写</b>方式

    STM32:程序方式

    程序使用专门的编程器/调试器,具有下载功能和调试功能,还可以和IDE结合,实现一键下载和调试。这种接口是通过引脚直连ARM内核的,拥有较高的权限。实物图:引脚图:1.
    发表于 12-07 10:51 14次下载
    STM32:程序<b>烧</b><b>写</b>方式

    升压型STC离线程序器设计方案

    离线器原理图增加了升压电路,输出36v电压 ,可为需要高压供电的板子程序。其中单片机程序只需要在stc软件里面点“将用户程序下载到U8/U7编程器以供脱机下载”按钮
    的头像 发表于 01-12 11:41 2066次阅读

    如何使用串口来给GD32程序

    SWD的方式,确实一直用的好好的。但是,量产的多少,总会出现一些意想不到的情况,比如引出SWD口的焊盘脱落了,或者
    的头像 发表于 12-14 17:03 7546次阅读