掉电读卡器设计文档
版本V0.1
深圳融卡科技有限公司 |
公 司 网 址:http://rongcard.com
公 司 电 话:0755-86032937
地 址:深圳市南山区软件产业基地5B303
版本历史
版本 | 日期 | 版本描述 |
V1.0 | 2021/12/03 | 初次发布版本 |
目录
1. 概述
2. 模块设计
2.1. 主机通讯模块
2.1.1. 主机命令
2.1.2. URAT协议
2.2.3. RFU
2.2. 内核模块
2.3. 从机驱动模块
2.3.1. ISO7816
2.3.2. SPI
2.3.3. I2C
2.3.4. RFU
2.4. 私有指令处理模块
2.4.1. CMD_SET_WORKING_MODE
2.4.2. CMD_SET_SLAVE_EXE_TIME_LIMIT
2.4.3. RFU
2.5. 掉电指令处理模块
2.5.1. Init_PD_parameter
2.5.2. Get_PD_count
2.5.3. Set_PD_PageWriteCnt
2.5.4. Get_COS_info
2.5.5. RFU
3. 流程
3.1. 基本逻辑
3.2. 主机通讯流程
3.2.1. 拦截特殊指令
3.2.2. 处理特殊命令
3.2.3. 主机协议解析失败
3.2.3. 主机通讯超时
3.3. 从机通讯流程
3.3.2. 从机通讯超时处理
3.3.3. 从机协议解析失败
3.4. 掉电测试流程
3.4.1. 从机命令未能按预期触发掉电
4. 函数接口
4.1. 读卡器管理接口
4.1.1. 读卡器初始化
4.1.2. 读卡器配置
4.1.3. 主机消息分发
4.1.4. 打开指定的定时器
4.1.5. 关闭指定的定时器
4.1.6. 关闭所有定时器
4.1.7. 从机超时管理
4.2. 主机侧协议接口
4.2.1. 侦听主机消息
4.2.2. 主机侧协议解析
4.2.3. 读卡器响应数据封包
4.2.4. 响应主机消息
4.3. 从机侧协议接口
4.3.1. 侦听从机消息
4.3.2. 从机侧协议解析
4.3.3. 读卡器下发数据封包
4.3.4. 下发从机消息
4.3.5. 从机上电
4.3.6. 从机冷复位
4.3.7. 从机热复位
4.3.8. 从机下电
4.3.9 从机响应特殊状态字封包
4.3.10. 维护从机响应的等待时间
4.3.11. 从机超时中断处理
附录A 掉电时间计算公式
附录B 常量
附录C 全局变量
为了搭建 SE 的自动化测试环境,需要设计一种高契合度的读卡器:
l 为了在性能测试中得到更精准的执行时间,它具有计时功能;
l 为了在掉电测试中模拟更真实的用户场景,它提供一套掉电测试接口;
l 为了解决 SE 异常时总需要物理拔插的问题,它能根据在执行测试之前预设的策略模拟人为操作,并会以事先约定好的方式告知测试脚本,使测试可以更好地自动化;
它还可以在兼顾上述特性的同时,满足 SE 测试不同协议的需求,以确保测试环境的一致性。
图 1.1 是一种支持自动化的测试环境示意图。
图 1.2 是上述读卡器的框图。
图 1.1 | 图 1.2 |
本读卡器在同一时刻只支持连接一个主机和一个从机。
本读卡器共有5个模块,分别是:主机通讯模块、私有指令处理模块、掉电指令处理模块、内核模块、从机驱动模块。
工程文件结构可能如下:
该模块负责与主机通讯,定义了主机通过读卡器操作从机的一些命令,以及主机与读卡器之间的通讯协议。
名称 | 命令 |
冷复位 | FE FE FE FE |
热复位 | FE FE FE FD |
断电 | FE FE FE FC |
注意,连接的操作等同于冷复位,与复位的区别在于主机显不显示复位应答的值。
接口 类型 | 后续 长度 | 数据 Tag | 数据 Len | 数据 Value | 时间 Tag | 时间 Len | 时间 Value | |
长度(字节) | 1 | 2 | 1 | 2 | X | 1 | 1 | X |
值 | XX | XXXX | 00 | XXXX | XXXXX | 01 | XX | XXXXX |
接口名称 | 值 |
ISO7816 | 0x00 |
SPI | 0x01 |
I2C | 0x02 |
... |
--> 表示主机下发至读卡器
<-- 表示读卡器响应至主机
--> 00 0009 00 0004 FEFEFEFE 01 00
<-- 00 0017 00 0010 3B1D968117081212003D17060000C300 01 02 0108
--> 00 0009 00 0004 FEFEFEFD 01 00
<-- 00 0017 00 0010 3B1D968117081212003D17060000C300 01 02 0054
--> 00 0009 00 0004 FEFEFEFC 01 00
<-- 00 0017 00 0002 9000 01 02 0012
保留扩展其它主机协议。
该模块充当主机和从机之间的“中间人”,使得它们之间无需实现对方的通讯协议,所有的交互均通过读卡器完成,包括一些基本的从机异常管理机制,以及记录从机的执行时间。
由于允许主机和从机支持多种通讯协议,因此该模块的实现方式可能是:主机和从机协议侧的接口定义为函数指针,协议切换时指向对应的协议实现函数,内核模块可以直接通过函数指针调用。
该模块负责与从机通讯,定义了从机与读卡器之间的通讯协议。
略
略
略
保留扩展其它从机协议。
该模块定义了一些供主机使用的私有指令。
设置读卡器的工作模式。
编码 | 值(HEX) |
CLA | FF |
INS | CC |
P1 | 00 |
P2 | 00 |
LC | 02 |
DATA | 见数据域 |
DATA_1 | DATA_2 | 说明 |
01 | 00 | 正常模式 |
01 | 01 | 保留 EMV |
01 | 02 | 保留 Memory card mode |
01 | 04 | 保留 NFC Test Mode |
01 | 80 | 掉电模式 |
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
设置读卡器支持从机执行一条命令的最长时间。在达到该限制时间后,读卡器主动使从机下电。
编码 | 值(HEX) |
CLA | FF |
INS | CC |
P1 | 01 |
P2 | 00 |
LC | 04 |
DATA | 见数据域 |
四字节无符号整数,详见表 7.1 定义的 g_SlaveExeTimeLimit 全局变量。
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
保留扩展其它私有指令。
与在程序中设置掉电桩的测试方法不同,掉电读卡器更加贴近用户场景,其原理是先执行一遍需要测试的指令,得到执行时间之后设置一个掉电时间的步长(例如1ms)和预期掉电的执行时间,然后再次执行测试指令,当测试指令执行到指定时间段后,掉电读卡器控制从机下电,返回掉电状态字给主机,然后主机可通过掉电读卡器让从机上电,进行一些掉电测试验证。
打桩掉电与掉电读卡器的主要区别在于前者可以精准测试上层逻辑,但无法在类似Flash擦写的过程中掉电,而后者可以覆盖任意时间段。
初始化掉电相关参数配置。
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 00 |
P2 | 00 |
LC | 00:默认时间系数为 1.0 |
DATA | 见数据域 |
LE |
一字节时间系数的整数 + 一字节时间系数的小数。
由读卡器组合,例如 00 + 05 = 0.5
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
获取上一条指令的执行时间。
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 01 |
P2 | 00 |
LE | 03 |
三字节无符号数值:表示上一条指令的执行时间,单位ms。
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
设置掉电时间的参数(启动掉电测试)
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 02 |
P2 | 00 |
LC | 03 |
DATA | 见数据域 |
DATA_1 | DATA_2 | DATA_3 | 说明 |
XX | 时间参数的高字节 | 时间参数的低字节 | 读卡器应忽略 DATA_1,在附录A中定义时间参数 |
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
获取卡片信息(已废弃)。
编码 | 值(HEX) |
CLA | 52 |
INS | DF |
P1 | 03 |
P2 | 00 |
LE | FF |
2 字节 map 计数 + 4 字节 used_addr_no + 2 字节 RTR_ADDR + 247 字节用户地址所在页有效数据
响应中可能出现的状态码:
SW1 | SW2 | 说明 |
90 | 00 | 执行成功 |
保留扩展其它掉电指令
图 3.1.1 |
图 3.2.1 |
图 3.2.2 读卡器只有一个掉电子功能的场景 |
图 3.2.3 |
图 3.2.4 |
图 3.2.5 |
图 3.3.1 |
图 3.3.2 |
图 3.3.3 |
图 3.4.1 |
这种情况读卡器将直接返回从机的响应数据,所以只需关闭掉电定时器。
图 3.4.2 |
以下协议接口将被定义为函数指针,由设置从机协议时读卡器完成切换协议实现函数。
表 4.1.1.1
接口名称 | Reader_Init | ||
接口描述 | 执行一些初始化操作 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.1.2.1
接口名称 | Reader_config | ||
接口描述 | 根据主机下发的命令参数和附带的数据执行私有命令 | ||
类别 | 名称 | 类型 | 描述 |
参数 | cmd_type | u8 | 命令类型 |
cmd_para | u32 | 命令参数 | |
返回值 | void | 无返回 |
表 4.1.3.1
接口名称 | Reader_handleHostCommand | ||
接口描述 | 处理主机侧命令 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 待执行的主机消息 |
host_bufL | u16 | 待执行的主机消息长度 | |
返回值 | void | 无返回 |
表 4.1.4.1
接口名称 | Reader_timerOpen | ||
接口描述 | 计算掉电时间并打开定时器中断 | ||
类别 | 名称 | 类型 | 描述 |
参数 | calc_mode | u8 | 详见附录A定义的计算掉电时间 |
need_timer | u8 | 0:等待时间定时器 | |
返回值 | void | 无返回 |
表 4.1.5.1
接口名称 | Reader_timerClose | ||
接口描述 | 关闭定时器中断 | ||
类别 | 名称 | 类型 | 描述 |
参数 | need_timer | u8 | 0:等待时间定时器 |
返回值 | void | 无返回 |
表 4.1.6.1
接口名称 | Reader_timerCloseAll | ||
接口描述 | 关闭所有定时器中断 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.1.7.1
接口名称 | Reader_slaveTimerOutManage | ||
接口描述 | 由从机超时中断处理函数调用,负责完成一些与协议无关的超时处理。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
暂时由读卡器直接调用指定主机协议类型的侦听接口,后续可能需要支持自动识别。
表 4.2.1.1
接口名称 | Reader_listenHost | ||
接口描述 | 侦听主机下发的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 存储主机侧下发的消息 |
返回值 | message_length | u16 | 收到的消息长度 |
表 4.2.2.1
接口名称 | Reader_resolveHostPackage | ||
接口描述 | 解析主机侧下发的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 待解析的主机消息 |
host_bufL | u16 | 待解析的主机消息长度 | |
返回值 | result | boolean | 解析结果 |
表 4.2.3.1
接口名称 | Reader_packResp | ||
接口描述 | 将需要返回给主机的信息进行协议封包 | ||
类别 | 名称 | 类型 | 描述 |
参数 | reader_buf | u8 * | 读卡器的响应数据 |
reader_bufL | u16 | 读卡器响应数据的长度 | |
host_buf | u8 * | 存储待响应给主机的消息 | |
返回值 | message_length | void | 待响应给主机的消息长度 |
表 4.2.4.1
接口名称 | Reader_response | ||
接口描述 | 将协议包发送给主机 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 待响应给主机的消息 |
host_bufL | u16 | 待响应给主机的消息长度 | |
返回值 | result | boolean | 通讯结果 |
表 4.3.1.1
接口名称 | Reader_listenSlave | ||
接口描述 | 侦听从机响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | host_buf | u8 * | 存储从机侧响应的消息 |
返回值 | message_length | u16 | 收到的消息长度 |
表 4.3.2.1
接口名称 | Reader_resolveSlavePackage | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | slave_buf | u8 * | 待解析的从机消息 |
slave_bufL | u16 | 待解析的从机消息长度 | |
返回值 | result | boolean | 解析结果 |
表 4.3.3.1
接口名称 | Reader_packCommand | ||
接口描述 | 将需要下发给从机的信息进行协议封包 | ||
类别 | 名称 | 类型 | 描述 |
参数 | reader_buf | u8 * | 读卡器的命令数据 |
reader_bufL | u16 | 读卡器命令数据的长度 | |
slave_buf | u8 * | 存储待下发给从机的消息 | |
返回值 | message_length | void | 待下发给从机的消息长度 |
表 4.3.4.1
接口名称 | Reader_send | ||
接口描述 | 将协议包发送给从机 | ||
类别 | 名称 | 类型 | 描述 |
参数 | slave_buf | u8 * | 待响应给主机的消息 |
slave_bufL | u16 | 待响应给主机的消息长度 | |
返回值 | result | boolean | 通讯结果 |
表 4.3.5.1
接口名称 | Reader_slavePowerON | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.3.6.1
接口名称 | Reader_slaveColdReset | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.3.7.1
接口名称 | Reader_slaveWarmReset | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.3.8.1
接口名称 | Reader_slavePowerOFF | ||
接口描述 | 解析从机侧响应的消息 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.3.9.1
接口名称 | Reader_packSlaveRecv | ||
接口描述 | 将需要模拟从机响应的特殊状态字进行协议封包。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | slave_buf | u8 * | 存储从机消息 |
special_sw | u16 | 待封包的特殊状态字 | |
返回值 | slave_bufL | u16 | 存储从机消息的长度 |
表 4.3.10.1
接口名称 | Reader_slaveWTX | ||
接口描述 | 读卡器将在下发从机命令之后,在侦听从机消息之前调用该接口,以处理协议中的延长等待时间操作。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
表 4.3.11.1
接口名称 | Reader_slaveTimerOutIRQHandle | ||
接口描述 | 读卡器在协议规定时间内未接收到从机发送的延长等待时间消息时,触发从机超时中断,进入该中断处理函数,完成与协议相关的超时处理之后,调用第 4.1.7 章节定义的从机超时管理接口。 | ||
类别 | 名称 | 类型 | 描述 |
参数 | void | 无参数 | |
返回值 | void | 无返回 |
时间参数用于控制预期掉电的执行时间;时间系数用于微调掉电时间。
简单模式:掉电时间(ms) = 时间参数 * 时间系数
表 6.1
常量名 | 常量值 | 描述 |
SW_POWER_OFF | 0x6FFF | 成功触发掉电定时器 |
表 7.1
变量名 | 类型 | 长度 | 描述 |
g_ReaderMode | u8 | 1 | 读卡器工作模式 |
g_ReaderState | u8 | 1 | 读卡器状态,详见第 3.2 章节 |
g_PowerOffTimePara | u16 | 2 | 掉电时间参数,详见附录A |
g_PowerOffTimeFactor | float | 2 | 掉电时间系数,详见附录A |
g_PowerOffFlag | boolean | 1 | 掉电测试开关 0:默认值,表示没有特殊操作 1:表示启动掉电测试,详见第 3.2.5 章节 |
g_MessageBuf | u8 数组 | 1024 | 存储消息数据 |
g_CommandRespBuf | u8 数组 | 1024 | 存储命令和响应数据 |
g_SlaveExeTimeLimit | u32 | 4 | 设置从机执行一条命令的最长时间(ms) |