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

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库的有不同的地方【原厂支持很重要】
    (四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

IIC和FM1230的通讯,移植过程中采用逻辑分析仪抓包的记录:
(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

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,后面对应移植时也要注意。
    (四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

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

SE相关部分移植到ID² sdk

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

主目录结构

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

modules/irot 目录结构

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

移植步骤

cmake方式改写makefile

确保makefile中对应的配置切换到SE就行了
(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+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文件
(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

修改后的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
(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

实际调用文件是modules/irot/se/src/core/km_to_irot.c
(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

验证和测试

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

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

lib库检查

到目前为止已经得到了关键几个lib静态库
(四)HAAS530 阿里云物联网平台ID²接入实践,FREERTOS+SE芯片

上一篇:org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [41] did not match expected type [java.lang.Integer (n/a)];


下一篇:SQLHelper 简介