添加读取市民卡号和卡有效期
diff --git a/supwisdom/sp_card.c b/supwisdom/sp_card.c
index 5c6796a..c88bfa9 100644
--- a/supwisdom/sp_card.c
+++ b/supwisdom/sp_card.c
@@ -52,7 +52,7 @@
if(!card_cpu_mode())
{
Delay_ms(200);
- if(sp_select_sfi("\x3f\x00") == 0)
+ if(sp_select_sfi("\x3f\x00") == 0)
{
sp_select_adf();
cardpcd->cardphyid[0] = snr[3];
@@ -67,7 +67,7 @@
else
{
cardpcd->cardtype = TAG_TYPE_UNKONWN;
- return 1;
+ return 1;
}
}
return 1;
@@ -78,11 +78,57 @@
return card_cpu_exist();
}
+static uint16 sp_select_adf15()
+{
+ uint16 ret = 0;
+ uint8* temp_buff = NULL;
+ uint8 buff_len = 0;
+ uint8 cmd_buff[] = {"\x00\xA4\x00\x00\x02\x3F\x00"};
+ ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff)-1, 0, &temp_buff, &buff_len);
+ if(ret != RETCODE_OK)
+ {
+ return ret;
+ }
+ return 0;
+}
+
+static uint16 sp_read_binary_file(uint8 out[])
+{
+ uint16 ret = 0;
+ uint8* temp_buff = NULL;
+ uint8 buff_len = 0;
+ uint8 cmd_buff[5] = {"\x00\xB0\x95\x00\x47"};
+ ret = card_cpu_exchange(cmd_buff, sizeof(cmd_buff), 0, &temp_buff, &buff_len);
+ if(ret != RETCODE_OK)
+ {
+ return ret;
+ }
+ MEMCPY(out, temp_buff, buff_len);
+ return 0;
+}
static uint16 sp_cpu_read(sp_card_t* card)
{
uint16 ret = 0;
+ uint8 buff[72];
+ uint8 offset = 0;
+ MEMCLEAR(buff, sizeof(buff));
+ ret = sp_select_adf15();
+ if(ret)
+ {
+ return ret;
+
+ }
+ ret = sp_read_binary_file(buff);
+ if(ret)
+ {
+ return ret;
+ }
MEMCLEAR(card->citizen_cardno, sizeof(card->citizen_cardno));
- MEMCPY(card->expiredate, "\x20\x22\x08\x02", 4);
+ offset += 31;
+ MEMCPY(card->citizen_cardno, buff+offset, sizeof(card->citizen_cardno));
+ offset += 12;
+ offset += 18;
+ MEMCPY(card->expiredate, buff+offset, 4);
return ret;
}