目录

    • ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C)
    • 一、CryptoAuthLib
    • 二、Nxp RT10xx平台上移植CryptoAuthLib
      • 2.1、在官网下载最新的CryptoAuthLib库:
      • 2.2、将\lib\hal中无用的代码去掉,并新建自己Driver的.c/h
      • 2.3、根据Nxp平台实现初始化、收发等函数:
      • 2.4、在atca_hal.h中打开I2C接口的宏开关
    • 三、驱动代码分析:
  • 博主热门文章推荐:

ATECC508A芯片开发笔记(十一):NXP 平台移植x08库(I2C)

  • CryptoAuthLib最新库
  • Nxp RT10xx平台上移植CryptoAuthLib
  • 驱动代码分析

硬件环境: Nxp的i.Mx RT1060 MCU
软件环境: cryptoauthlib-20190903 (MicroChip官网下载)

之前在Nxp平台上使用过ATECC608A,所以将CryptoAuthLib移植后的代码分享出来。。

最近太忙,好久没有写博客了,刚发现ATECCx08系列都写到第十一啦。。。。


一、CryptoAuthLib

概述

Atmel CryptoAuthentication Library是Atmel 兼容其加密芯片系列一个总的软件库,里面实现了从底层到命令层以及应用层开发使用的所有API,并支持Git使用。
该库还在不断完善,兼容Atmel许多开发板,目前能够support的加密芯片有:

  • ATECCx08A (ATECC108A, ATECC508A, ATECC608A)
  • ATSHA204A
  • ATAES132A
    : 目录结构

该软件库的说明文档还是写的比较清楚的,其目录 结构如下:


二、Nxp RT10xx平台上移植CryptoAuthLib

基础知识可以参见之前的博客:

ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

2.1、在官网下载最新的CryptoAuthLib库:

https://www.microchip.com/wwwproducts/en/ATECC608A

2.2、将\lib\hal中无用的代码去掉,并新建自己Driver的.c/h

参见 ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

2.3、根据Nxp平台实现初始化、收发等函数:

  • hal_i2c_init
ATCA_STATUS hal_i2c_init(void *hal, ATCAIfaceCfg *cfg)
{hal_i2c_log("ini i2c\r\n");/* BEGIN: Added by Howard Xue, 2018/10/28 */lpi2c_master_config_t masterConfig = {0};//  LPI2C_MasterGetDefaultConfig(&lpi2cConfig);masterConfig.enableMaster            = true;masterConfig.debugEnable             = false;masterConfig.enableDoze              = true;masterConfig.ignoreAck               = true;masterConfig.pinConfig               = kLPI2C_2PinOpenDrain;masterConfig.baudRate_Hz             = 400000U;masterConfig.busIdleTimeout_ns       = 0;masterConfig.pinLowTimeout_ns        = 0;masterConfig.sdaGlitchFilterWidth_ns = 0;masterConfig.sclGlitchFilterWidth_ns = 0;masterConfig.hostRequest.enable      = false;masterConfig.hostRequest.source      = kLPI2C_HostRequestExternalPin;masterConfig.hostRequest.polarity    = kLPI2C_HostRequestPinActiveHigh;LPI2C_MasterInit(ATECC608_LPI2C_BASEADDR, &masterConfig, LPI2C_CLOCK_FREQUENCY);return ATCA_SUCCESS;}
  • hal_i2c_send
ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength)
{hal_i2c_log("send i2c\r\n");ATCAIfaceCfg *cfg = atgetifacecfg(iface);status_t reVal;// txdata[0] is using _reserved byte of the ATCAPackettxdata[0] = 0x03;   // insert the Word Address Value, Command tokentxlength++;         // account for word address value byte.lpi2c_master_transfer_t transfer;transfer.flags          = kLPI2C_TransferDefaultFlag;transfer.slaveAddress = (cfg->atcai2c.slave_address);transfer.direction       = kLPI2C_Write;transfer.subaddress     = 0;transfer.subaddressSize = 0;transfer.data         = txdata;transfer.dataSize     = txlength;reVal = LPI2C_MasterTransferBlocking(ATECC608_LPI2C_BASEADDR, &transfer);return reVal;hal_i2c_log("send i2c ok\r\n");return ATCA_SUCCESS;}
  • hal_i2c_receive:
ATCA_STATUS hal_i2c_receive(ATCAIface iface, uint8_t *rxdata, uint16_t *rxlength)
{hal_i2c_log("recv i2c\r\n");ATCAIfaceCfg *cfg = atgetifacecfg(iface);/* BEGIN: Added by Howard Xue, 2018/10/28 */status_t reVal;lpi2c_master_transfer_t transfer;transfer.flags         = kLPI2C_TransferDefaultFlag;transfer.slaveAddress = (cfg->atcai2c.slave_address);transfer.direction       = kLPI2C_Read;transfer.subaddress  = 0;transfer.subaddressSize = 0;transfer.data         = rxdata;transfer.dataSize     = *rxlength;LPI2C_MasterTransferBlocking(ATECC608_LPI2C_BASEADDR, &transfer);hal_i2c_log("recv i2c ok\r\n");return ATCA_SUCCESS;}
  • hal_i2c_wake
/** \brief wake up CryptoAuth device using I2C bus* \param[in] iface  interface to logical device to wakeup* \return ATCA_SUCCESS on success, otherwise an error code.*/ATCA_STATUS hal_i2c_wake(ATCAIface iface)
{ATCAIfaceCfg *cfg = atgetifacecfg(iface);uint8_t  address = cfg->atcai2c.slave_address;uint32_t bdrt = cfg->atcai2c.baud;uint8_t data[4], expected[4] = { 0x04, 0x11, 0x33, 0x43 };uint8_t dummy_byte = 0x00;if (bdrt >= 400000)     //Howard :  if not already at 100KHz, change it to 100K for wake sequence{change_i2c_speed(iface, 100000);}// Send the wake by writing to an address of 0x00// Create wake up pulse by sending a slave address 0f 0x00.// This slave address is sent to device by using a dummy write command.// Dummy Write// This command will always return NACK.// So, the return code is being ignored.hal_i2c_send(ATECC_LPI2C_BASEADDR, 0, &dummy_byte, 1);hal_i2c_abort(ATECC_LPI2C_BASEADDR);// if necessary, revert baud rate to what came in.if (bdrt >= 400000){change_i2c_speed(iface, bdrt);}atca_delay_us(cfg->wake_delay); // Howard: wait tWHI + tWLO which is configured based on device type and configuration structurestatus_t err_code = hal_i2c_receive(ATECC_LPI2C_BASEADDR, address, data, 4);if (err_code != kStatus_Success){return ATCA_RX_NO_RESPONSE;}// compared with fixed wakeup data.if (memcmp(data, expected, 4) == 0){return ATCA_SUCCESS;}return ATCA_COMM_FAIL;
}
  • 延时函数 (基于FreeRTOS):
#define AT608_DELAY_CPU_FREQ_CYCLE      (60)
#define AT608_FREERTOS                  (1)void hardware_delay_us(uint32_t us)
{volatile uint32_t i = 0;if(us == 0)return;for (i = 0; i < us*AT608_DELAY_CPU_FREQ_CYCLE; ++i){__asm("NOP"); /* delay */}
}/*** \brief This function delays for a number of microseconds.** \param[in] delay number of 0.001 milliseconds to delay*/
void atca_delay_us(uint32_t delay)
{/* BEGIN: Modified by Howard Xue, 2020/6/28 */
#ifdef AT608_FREERTOSif(atecc_init)vTaskDelay( 1 + (delay * (( ((uint64_t)configTICK_RATE_HZ) << 32 )/1000000) >> 32) );elsehardware_delay_us( 1 + delay);
#elsehardware_delay_us( 1 + delay);
#endif
/* END:   Modified by Howard Xue, 2020/6/28   PN: */}/*** \brief This function delays for a number of milliseconds.**        You can override this function if you like to do*        something else in your system while delaying.** \param[in] delay number of milliseconds to delay*/
void atca_delay_ms(uint32_t delay)
{#ifdef AT608_FREERTOSif(atecc_init)vTaskDelay( 1 + (delay * ((configTICK_RATE_HZ << 8)/1000) >> 8) );elsehal_i2c_delay( 1 + delay*1000);
#elsehal_i2c_delay( 1 + delay*1000);
#endif
}

2.4、在atca_hal.h中打开I2C接口的宏开关

至此,移植工作就结束了,接下来可以对加密芯片硬件或CryptoAuthLib进行简单的测试,参照ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

完整Driver代码下载地址:
https://download.csdn.net/download/HowieXue/11967660


三、驱动代码分析:

之前博文的代码分析,结构是一样的
第一层:
在atca_iface.c (libraries\cryptoauthlib\lib目录)中 ,有_atinit()这么一个函数,会在atcab_init初始化设备时调用,函数里实现了hal层通讯函数与API层的绑定:

ATCA_STATUS _atinit(ATCAIface caiface, ATCAHAL_t *hal)
{// get method mapping to HAL methods for this interfacehal_iface_init( caiface->mIfaceCFG, hal );caiface->atinit     = hal->halinit;caiface->atpostinit = hal->halpostinit;caiface->atsend     = hal->halsend;caiface->atreceive  = hal->halreceive;caiface->atwake     = hal->halwake;caiface->atsleep    = hal->halsleep;caiface->atidle     = hal->halidle;caiface->hal_data   = hal->hal_data;return ATCA_SUCCESS;
}

第二层:
在atca_hal.c (libraries\cryptoauthlib\lib\hal) 中,实现了Hal层与底层通讯驱动函数的绑定,例如在前面我们打开了I2C宏: ATCA_I2C_IFACE,则现在hal层各函数就会与I2C相关函数绑定:

ATCA_STATUS hal_iface_init( ATCAIfaceCfg *cfg, ATCAHAL_t *hal )
{ATCA_STATUS status = ATCA_COMM_FAIL;switch (cfg->iface_type) {case ATCA_I2C_IFACE:#ifdef ATCA_HAL_I2Chal->halinit = &hal_i2c_init;hal->halpostinit = &hal_i2c_post_init;hal->halreceive = &hal_i2c_receive;hal->halsend = &hal_i2c_send;hal->halsleep = &hal_i2c_sleep;hal->halwake = &hal_i2c_wake;hal->halidle = &hal_i2c_idle;hal->halrelease = &hal_i2c_release;hal->hal_data = NULL;status = ATCA_SUCCESS;#endifbreak;case ATCA_SWI_IFACE:#ifdef ATCA_HAL_SWI...

第三层:
进入Hal_i2c_bitbang.c (libraries\cryptoauthlib\lib\hal),执行相应函数,比如上层通过atsend调用到了hal_i2c_send,就会执行该函数:该函数模拟了I2C通讯时序,(既先Start信号拉低SDA,之后发送7位地址位+1位读写,然后发送数据位、最后Stop信号拉高SDA),将一串数据发送到I2C总线。

ATCA_STATUS hal_i2c_send(ATCAIface iface, uint8_t *txdata, int txlength)
{ATCAIfaceCfg *cfg = atgetifacecfg(iface);ATCA_STATUS status = ATCA_TX_TIMEOUT;int bus     = cfg->atcai2c.bus;txdata[0] = 0x03;   //!< Word Address Value = Commandtxlength++;         //!< count Word Address byte towards txlength//! Set I2C pinsi2c_set_pin(i2c_hal_data[bus]->pin_sda, i2c_hal_data[bus]->pin_scl);do {//! Address the device and indicate that bytes are to be writtenstatus = hal_i2c_send_slave_address(iface, I2C_WRITE);if (status != ATCA_SUCCESS)break;//! Send the remaining bytesstatus = i2c_send_bytes(txlength, txdata);} while (0);//! Send STOP regardless of i2c_statusi2c_send_stop();return status;
}

支持原创,转载请附引用链接。

博主热门文章推荐:

一篇读懂系列:

  • 一篇读懂无线充电技术(附方案选型及原理分析)
  • 一篇读懂:Android/iOS手机如何通过音频接口(耳机孔)与外设通信
  • 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

LoRa Mesh系列:

  • LoRa学习:LoRa关键参数(扩频因子,编码率,带宽)的设定及解释
  • LoRa学习:信道占用检测原理(CAD)
  • LoRa/FSK 无线频谱波形分析(频谱分析仪测试LoRa/FSK带宽、功率、频率误差等)

网络安全系列:

  • ATECC508A芯片开发笔记(一):初识加密芯片
  • SHA/HMAC/AES-CBC/CTR 算法执行效率及RAM消耗 测试结果
  • 常见加密/签名/哈希算法性能比较 (多平台 AES/DES, DH, ECDSA, RSA等)
  • AES加解密效率测试(纯软件AES128/256)–以嵌入式Cortex-M0与M3 平台为例

嵌入式开发系列:

  • 嵌入式学习中较好的练手项目和课题整理(附代码资料、学习视频和嵌入式学习规划)
  • IAR调试使用技巧汇总:数据断点、CallStack、设置堆栈、查看栈使用和栈深度、Memory、Set Next Statement等
  • Linux内核编译配置(Menuconfig)、制作文件系统 详细步骤
  • Android底层调用C代码(JNI实现)
  • 树莓派到手第一步:上电启动、安装中文字体、虚拟键盘、开启SSH等
  • Android/Linux设备有线&无线 双网共存(同时上内、外网)

AI / 机器学习系列:

  • AI: 机器学习必须懂的几个术语:Lable、Feature、Model…
  • AI:卷积神经网络CNN 解决过拟合的方法 (Overcome Overfitting)
  • AI: 什么是机器学习的数据清洗(Data Cleaning)
  • AI: 机器学习的模型是如何训练的?(在试错中学习)
  • 数据可视化:TensorboardX安装及使用(安装测试+实例演示)

ATECC508A芯片开发笔记(十一):NXP 平台移植ATECCx08 CryptoAuthLib库(I2C)相关推荐

  1. ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植

    目录 ATECC508A芯片开发笔记(二):开发准备之 CryptoAuthLib 库简介与移植 Atmel两个官方lib介绍 一.CryptoAuthLib简介 Lib中最主要的三种对象类型: 二. ...

  2. ATECC508A芯片开发笔记(一):初识加密芯片

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,一起学习探讨软硬件技术知识经验,关注就有海量学习资料免费领哦: ---------- 目录 一.ATECC508A概述: 二.ATECC50 ...

  3. ATECC508A芯片开发笔记(九):加密读写508芯片数据的流程及相应设置

    目录 ATECC508A芯片开发笔记(九):加密读写508芯片数据的流程及相应设置 1.Encrypted Read 1.1 Standard Encrypted Read Flow 1.2 Simp ...

  4. ATECC508A芯片开发笔记(八):ECDH算法配置方法、执行过程及实现原理

    目录 AATECC508A芯片开发笔记(八):ECDH算法配置方法.过程原理及示例代码 1.ECDH介绍及原理 2.ECDH执行过程 3.508A某一slot执行Ecdh需要配置的参数 4.示例代码 ...

  5. ATECC508A芯片开发笔记(六):产生CSR以及申请证书(X.509)流程及其内容分析

    目录 ATECC508A芯片开发笔记(六):产生CSR以及申请证书(X.509)流程及其内容分析 一.508A产生CSR文件流程 实例图1:申请证书流程: 实例图2:设备认证流程(使用证书): 二.C ...

  6. ATECC508A芯片开发笔记(七):实现数字签名(Sign)并校验(Verify)证书签名

    目录 ATECC508A芯片开发笔记(七):实现对数据数字签名(Sign)并验证(Verify)证书签名 一.数据签名.验证基本流程 二.利用508对数据签名并验证 代码实现: Sign(数字签名)实 ...

  7. 【嵌入式硬件芯片开发笔记】4-20mA DAC芯片AD5421配置流程

    [嵌入式硬件芯片开发笔记]4-20mA DAC芯片AD5421配置流程 16位.串行输入.环路供电.4 mA至20 mA DAC 可用于HART协议相关电路 同AD5700配合使用 AD5421的SP ...

  8. 【嵌入式硬件芯片开发笔记】HART调制解调器AD5700芯片配置流程

    [嵌入式硬件芯片开发笔记]HART调制解调器AD5700芯片配置流程 低功耗HART调制解调器 适用于AD5700/AD5700-1 我的是XTAL_EN接地,CLK_CFG的两个引脚由同一个GPIO ...

  9. 【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

    [嵌入式硬件芯片开发笔记]HART协议调制解调芯片AD5700配置流程 XTAL_EN接地,CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制 ...

最新文章

  1. 一起聊聊好玩的Openresty
  2. Json 不同语言的使用
  3. Linux驱动开发环境配置(内核源码树构造)
  4. python之while循环用法举例,break与continue的区别,格式化输出及运算符
  5. 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
  6. JDBC实现从Hive抽取数据导入Oracle
  7. 架构设计 | 分布式体系下,服务分层监控策略
  8. mysql排序之order by
  9. Office Word 使用笔记
  10. 转载:图解SSL/TLS协议
  11. 如何估算网站日承受最大访问PV
  12. Jquery 动画
  13. setuna截图怎么放大缩小_实用的高清截图系列小窍门详解,一章带你“真正学会”截图!...
  14. java爬取前程无忧(51job)
  15. solidworks重建模型好慢_解决SolidWorks拉伸模型提示“重建模型错误”的方法
  16. 2019春季PAT甲级题解
  17. iOS简历这样写,才能找到好工作
  18. ArcGIS Pro中管线三维符号化方法
  19. ORA-00955: name is already used by an existing object
  20. HTML点击图片实现跳转的两种方法

热门文章

  1. 上位机.net大佬博客大全-菜鸟学习上位机C#那些事儿
  2. python opencv resize函数_python cv2.resize函数high和width注意事项说明
  3. Z-Wave技术的五大协议介绍(ZWave中心)
  4. 人工智能几乎会影响到 IT 行业的每个方面,包括编程和开发
  5. 提高期英语学习——第二次罗塞塔
  6. linux和windows内存管理知乎,windows server 哪个版本好 知乎
  7. 【Java进阶营】阿里架构师手把手教你如何简单快捷地构建Spring应用
  8. python基础学习(三)之线性数据结构
  9. CG 函数之选手得分
  10. noexcept与栈展开(stack unwinding)