添加读取市民卡号和卡有效期
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;
 }