ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

2021-10-25 17:02:30  阅读:256  来源: 互联网

标签:set CMAKE lib FREERTOS ID2 CURRENT HAAS530 云物 DIR


ID²和硬件主控的驱动移植

接下去部分实现ID² SE芯片移植

移植准备

SE安全芯片:FM1230
硬件电路:主控—iic—FM1230

原厂提供了STM32下的IIC下的驱动示例
根据自己主控来移植IIC驱动部分,这里是采用GPIO模拟IIC来实现

IIC驱动移植

模拟IIC驱动部分比较常见,我也是从网上找的,贴出几个参考:

https://blog.csdn.net/shaguahaha/article/details/70766665
https://blog.csdn.net/return_oops/article/details/80965437

几个需要注意点是:

  1. SE芯片的IIC地址,FM1230是 0xE2
  2. 在移植过程中设备FM1230从机有回复,但是数据始终不对
    计算算法时不通过,原来是模拟IIC和采用ST 标准IIC库的有不同的地方【原厂支持很重要】
    在这里插入图片描述

IIC和FM1230的通讯,移植过程中采用逻辑分析仪抓包的记录:
在这里插入图片描述

hal相关移植

IIC驱动OK后,主要涉及std_se_adapter.c、se_driver.c两个函数移植
参考原厂示例基本不会有问题

验证ID2相关

我没有将此部分代码一开始就移植到ID²的sdk中去跑,而是单独将此部分调试通过后,跑FM1230部分的示例代码,SM4的加密。

这里需要注意几点:

  1. irot_hal_get_id2中,函数中注释异常判断
irot_result_t irot_hal_get_id2(uint8_t* id, uint32_t* len)
{
    irot_result_t ret;
    irot_result_t close_ret;
    void* handle = NULL;
    uint8_t cmd_buf[MAX_CMD_APDU_LENGTH];
    uint8_t rsp_buf[MAX_RSP_APDU_LENGTH];
    uint32_t rsp_len = sizeof(rsp_buf);

    // open session
    ret = open_session(&handle);
    if (ret != IROT_SUCCESS)
    {
        goto EXIT;
    }

    // select application
#if ID2_SEND_SELECT_COMMAND
    ret = select_application(handle, cmd_buf, rsp_buf, &rsp_len);
    if (ret != IROT_SUCCESS)
    {
        goto EXIT;
    }
#endif
    // get ID
    memset(cmd_buf, 0x00, CMD_APDU_HEAD_LENGTH);
    cmd_buf[INDEX_CLA] = CLA_VALUE;
    cmd_buf[INDEX_INS] = INS_GET_ID;
    cmd_buf[INDEX_LC] = 0x00;
    rsp_len = sizeof(rsp_buf);
    ret = apdu_transmit_wrap(handle, cmd_buf, CMD_APDU_HEAD_LENGTH, rsp_buf, &rsp_len);
    if (ret != IROT_SUCCESS)
    {
        goto EXIT;
    }
    // 3 bytes head
    if (rsp_len != (0x03 + SE_ID2_LENGTH))
    {
        ret = IROT_ERROR_GENERIC;
        goto EXIT;
    }
    // ID2 data
    if (rsp_buf[2] != SE_ID2_LENGTH)
    {
        ret = IROT_ERROR_GENERIC;
        goto EXIT;
    }
    rsp_len -= 0x03;
	/*  注释掉
    if (rsp_len > *len)
    {
        ret = IROT_ERROR_GENERIC;
        goto EXIT;
    }
    else
    */
    {
        // | 2 TAG | 1 len |
        memcpy(id, rsp_buf + 3, rsp_len);
        *len = rsp_len;
    }

EXIT:
    // close session
    close_ret = close_session(handle);

    return ret == IROT_SUCCESS ? close_ret : ret;
}

  1. irot_hal_sym_crypto
    第二个参数传参为1,后面对应移植时也要注意。
    在这里插入图片描述

PS: 将IIC和系统层,需要在示例中跑通后再将此移植到ID²的sdk中会容易很多

SE相关部分移植到ID² sdk

将上文中对应的SE芯片相关代码移植到ID² sdk,先看目录结构

主目录结构

在这里插入图片描述

modules/irot 目录结构

在这里插入图片描述

移植步骤

cmake方式改写makefile

确保makefile中对应的配置切换到SE就行了
在这里插入图片描述

对应cmake下CMakeLists.txt配置如下,关注irot部分就是选择SE目录下的源文件

cmake_minimum_required(VERSION 3.13)
# ... 部分系统相关省略

# set id_lib dir
set(id_lib_dir ${CMAKE_CURRENT_SOURCE_DIR}/id_lib)

# my libs path
set(id_lib_path ${CMAKE_CURRENT_SOURCE_DIR}/lib)

function(add_subdirectory_if_exist dir)
	if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${dir})
		if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/CMakeLists.txt)
			add_subdirectory(${dir})
		endif()
	endif()
endfunction()

# add lib crypto
set(ID2_CRYPTO_DIR id_lib/modules/crypto)
add_subdirectory_if_exist(${ID2_CRYPTO_DIR})

# add lib crypto
set(ID2_HAL_DIR id_lib/modules/hal)
add_subdirectory_if_exist(${ID2_HAL_DIR})

# add lib ID2
set(ID2_ID2_DIR id_lib/modules/id2/lib)
add_subdirectory_if_exist(${ID2_ID2_DIR})

# add lib irot
set(ID2_IROT_DIR id_lib/modules/irot/se)
# set(ID2_IROT_DIR id_lib/modules/irot/demo/)
add_subdirectory_if_exist(${ID2_IROT_DIR})

# add lib itls
set(ID2_ITLS_DIR id_lib/modules/itls)
add_subdirectory_if_exist(${ID2_ITLS_DIR})

# add lib osa
set(ID2_OSA_DIR id_lib/modules/osa)
add_subdirectory_if_exist(${ID2_OSA_DIR})

SE目录原始makefile文件,根据makefile改过来关注重点的部分修改自己的CMakeLists.txt文件
在这里插入图片描述

修改后的CMakeLists.txt文件

cmake_minimum_required(VERSION 3.13)

set(SOURCE_TOP_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(BINARY_TOP_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_C_COMPILER_FORCED   1)
set(CMAKE_CXX_COMPILER_FORCED 1)

set(out_hex_dir ${CMAKE_CURRENT_BINARY_DIR}/hex)
# set(out_lib_dir ${CMAKE_CURRENT_BINARY_DIR}/lib)
set(out_lib_dir ${CMAKE_SOURCE_DIR}/lib)
set(out_inc_dir ${CMAKE_CURRENT_BINARY_DIR}/rel)
set(out_inc_dir ${CMAKE_CURRENT_BINARY_DIR}/include)
set(tools_dir ${CMAKE_CURRENT_SOURCE_DIR}/tools)


set(CHIP_NAME myse)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../include/osa
					${CMAKE_CURRENT_SOURCE_DIR}/../../../include/irot
					${CMAKE_CURRENT_SOURCE_DIR}/../../../include/irot/se
					${CMAKE_CURRENT_SOURCE_DIR}/../../../include/crypto
					${CMAKE_CURRENT_SOURCE_DIR}/./inc
					${CMAKE_CURRENT_SOURCE_DIR}/./chipset/${CHIP_NAME}
)

project(irot)
set(target km)

message(STATUS "build target: " ${target}) 
message(STATUS "CMAKE_CURRENT_SOURCE_DIR: " ${CMAKE_CURRENT_SOURCE_DIR}) 
message(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR}) 

# debug info

add_definitions(-DCONFIG_ID2_DEBUG 
		-DCONFIG_CHIP_KEY_TYPE=CHIP_KEY_TYPE_SM4
		)

file(GLOB SRC_CORE ${CMAKE_CURRENT_SOURCE_DIR}/src/core/*.c)
file(GLOB SRC_LOG ${CMAKE_CURRENT_SOURCE_DIR}/src/log/*.c)
file(GLOB SRC_CHIPSET ${CMAKE_CURRENT_SOURCE_DIR}/chipset/${CHIP_NAME}/se_driver/*.c)

add_library(${target} STATIC
	${SRC_CORE}
	${SRC_LOG}
	${SRC_CHIPSET}
)

set(LIBRARY_OUTPUT_PATH ${out_lib_dir})

# set_target_properties

target_include_directories(${target} PUBLIC include)

根据make.settings修改宏定义
add_definitions(-DCONFIG_ID2_DEBUG 
		-DCONFIG_CHIP_KEY_TYPE=CHIP_KEY_TYPE_SM4
		)
适配接口层

前文提到SM4的加密方式,在irot_hal_sym_crypto中第二个参数改为1

include/irot/se/id2_irot_hal.h(原始文件名称为irot_hal.h)
修改KEY_ID_ID2宏定义为1
在这里插入图片描述

实际调用文件是modules/irot/se/src/core/km_to_irot.c
在这里插入图片描述

验证和测试

为了验证该模块移植是否成功,需要编译app/id2_app对应demo代码,验证是否ok

PS: 这部分不可缺少,这部分没有问题后,再做下一步基本不会出错。

lib库检查

到目前为止已经得到了关键几个lib静态库
在这里插入图片描述

标签:set,CMAKE,lib,FREERTOS,ID2,CURRENT,HAAS530,云物,DIR
来源: https://blog.csdn.net/shengjing2021/article/details/120953636

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有