mirror of
https://github.com/whowechina/chu_pico.git
synced 2025-02-17 18:49:18 +01:00
AIME reader (80%, felica card works)
This commit is contained in:
parent
87eb1a81e1
commit
87cfc39bee
@ -322,19 +322,12 @@ static int cmd_felica_encap_read()
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
uint8_t *service = req_data + 8;
|
||||
uint8_t svc_num = service[0];
|
||||
uint16_t svc_codes[svc_num];
|
||||
for (int i = 0; i < svc_num; i++) {
|
||||
svc_codes[i] = service[i + 1] | (service[i + 2] << 8);
|
||||
if (req_data[8] != 1) {
|
||||
printf("Felica Encap READ Error: service_num != 1\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint8_t *block = req_data + 9 + svc_num * 2;
|
||||
uint8_t block_num = block[0];
|
||||
uint16_t block_list[block_num];
|
||||
for (int i = 0; i < block_num; i++) {
|
||||
block_list[i] = (block[i + 1] << 8) | block[i + 2];
|
||||
}
|
||||
uint16_t svc_code = req_data[9] | (req_data[10] << 8);
|
||||
|
||||
typedef struct __attribute__((packed)) {
|
||||
uint8_t rw_status[2];
|
||||
@ -345,10 +338,14 @@ static int cmd_felica_encap_read()
|
||||
felica_encap_resp_t *encap_resp = (felica_encap_resp_t *) response.payload;
|
||||
encap_read_resp_t *read_resp = (encap_read_resp_t *) encap_resp->data;
|
||||
|
||||
if (!pn532_felica_read_wo_encrypt(svc_num, svc_codes, block_num, block_list,
|
||||
read_resp->block_data)) {
|
||||
printf("Felica READ failed\n");
|
||||
return -1;
|
||||
uint8_t *block = req_data + 11;
|
||||
uint8_t block_num = block[0];
|
||||
|
||||
memset(read_resp->block_data, 0, sizeof(read_resp->block_data));
|
||||
|
||||
for (int i = 0; i < block_num; i++) {
|
||||
uint16_t block_id = (block[i * 2 + 1] << 8) | block[i * 2 + 2];
|
||||
pn532_felica_read_wo_encrypt(svc_code, block_id, read_resp->block_data[i]);
|
||||
}
|
||||
|
||||
read_resp->rw_status[0] = 0x00;
|
||||
@ -358,21 +355,22 @@ static int cmd_felica_encap_read()
|
||||
return sizeof(*read_resp);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int cmd_felica_encap_write()
|
||||
{
|
||||
printf("\tWRITE\n");
|
||||
felica_encap_resp_t *encap_resp = (felica_encap_resp_t *) response.payload;
|
||||
encap_resp->data[0] = 0;
|
||||
encap_resp->data[1] = 0;
|
||||
return 2;
|
||||
}
|
||||
|
||||
break;
|
||||
#if 0
|
||||
|
||||
case CMD_FELICA_THROUGH_NDA_A4:
|
||||
printf("\tNDA_A4\n");
|
||||
build_response(11);
|
||||
resp->payload[0] = 0x00;
|
||||
break;
|
||||
case CMD_FELICA_THROUGH_WRITE:
|
||||
printf("\tWRITE\n");
|
||||
build_response(12);
|
||||
resp->other.rw_status[0] = 0;
|
||||
resp->other.rw_status[1] = 0;
|
||||
break;
|
||||
default:
|
||||
printf("\tUnknown through: %02x\n", code);
|
||||
build_response(0);
|
||||
@ -406,6 +404,9 @@ static void cmd_felica_encap()
|
||||
case CMD_FELICA_THROUGH_READ:
|
||||
datalen = cmd_felica_encap_read();
|
||||
break;
|
||||
case CMD_FELICA_THROUGH_WRITE:
|
||||
datalen = cmd_felica_encap_write();
|
||||
break;
|
||||
default:
|
||||
printf("Unknown code %d\n", encap_req->code);
|
||||
break;
|
||||
|
@ -348,12 +348,6 @@ int pn532_felica_command(uint8_t cmd, const uint8_t *param, uint8_t param_len, u
|
||||
memcpy(cmd_buf + 3, felica_poll_cache.idm, 8);
|
||||
memcpy(cmd_buf + 11, param, param_len);
|
||||
|
||||
printf("IndataEx [%d]: ", cmd_len);
|
||||
for (int i = 0; i < cmd_len; i++) {
|
||||
printf(" %02x", cmd_buf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
int ret = pn532_write_command(0x40, cmd_buf, sizeof(cmd_buf));
|
||||
if (ret < 0) {
|
||||
printf("Failed send felica command\n");
|
||||
@ -361,11 +355,6 @@ int pn532_felica_command(uint8_t cmd, const uint8_t *param, uint8_t param_len, u
|
||||
}
|
||||
|
||||
int result = pn532_read_response(0x40, readbuf, sizeof(readbuf));
|
||||
printf("Result: %d - ", result);
|
||||
for (int i = 0; i < result; i++) {
|
||||
printf(" %02x", readbuf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
int outlen = readbuf[1] - 1;
|
||||
if (readbuf[0] & 0x3f != 0 || result - 2 != outlen) {
|
||||
@ -378,36 +367,14 @@ int pn532_felica_command(uint8_t cmd, const uint8_t *param, uint8_t param_len, u
|
||||
}
|
||||
|
||||
|
||||
bool pn532_felica_read_wo_encrypt(uint8_t svc_num, const uint16_t *svc_codes,
|
||||
uint8_t block_num, const uint16_t *block_list,
|
||||
uint8_t block_data[][16])
|
||||
bool pn532_felica_read_wo_encrypt(uint16_t svc_code, uint16_t block_id, uint8_t block_data[16])
|
||||
{
|
||||
uint8_t param_len = 1 + 2 * svc_num + 1 + 2 * block_num;
|
||||
uint8_t param[param_len];
|
||||
uint8_t param[] = { 1, svc_code & 0xff, svc_code >> 8,
|
||||
1, block_id >> 8, block_id & 0xff };
|
||||
|
||||
uint8_t *service = param;
|
||||
service[0] = svc_num;
|
||||
for (int i = 0; i < svc_num; i++) {
|
||||
service[1 + 2 * i] = svc_codes[i] & 0xff;
|
||||
service[2 + 2 * i] = svc_codes[i] >> 8;
|
||||
}
|
||||
int result = pn532_felica_command(0x06, param, sizeof(param), readbuf);
|
||||
|
||||
uint8_t *block = param + 1 + 2 * svc_num;
|
||||
block[0] = block_num;
|
||||
for (int i = 0; i < block_num; i++) {
|
||||
block[1 + 2 * i] = block_list[i] >> 8;
|
||||
block[2 + 2 * i] = block_list[i] & 0xff;
|
||||
}
|
||||
|
||||
printf("PN532 Felica READ [%d]: ", param_len);
|
||||
for (int i = 0; i < param_len; i++) {
|
||||
printf("%02x ", param[i]);
|
||||
}
|
||||
printf("\n");
|
||||
|
||||
int result = pn532_felica_command(0x06, param, param_len, readbuf);
|
||||
|
||||
if (result != 12 + 16 * block_num || readbuf[9] != 0 || readbuf[10] != 0) {
|
||||
if (result != 12 + 16 || readbuf[9] != 0 || readbuf[10] != 0) {
|
||||
printf("PN532 Felica READ read response failed %d %02x %02x\n",
|
||||
result, readbuf[9], readbuf[10]);
|
||||
for (int i = 0; i < result; i++) {
|
||||
@ -418,9 +385,7 @@ bool pn532_felica_read_wo_encrypt(uint8_t svc_num, const uint16_t *svc_codes,
|
||||
}
|
||||
|
||||
const uint8_t *result_data = readbuf + 12;
|
||||
for (int i = 0; i < block_num; i++) {
|
||||
memcpy(block_data[i], result_data + 16 * i, 16);
|
||||
}
|
||||
memcpy(block_data, result_data, 16);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ bool pn532_set_rf_field(uint8_t auto_rf, uint8_t on_off);
|
||||
|
||||
bool pn532_poll_mifare(uint8_t *uid, int *len);
|
||||
bool pn532_poll_felica(uint8_t uid[8], uint8_t pmm[8], uint8_t syscode[2]);
|
||||
bool pn532_felica_read_wo_encrypt(uint8_t svc_num, const uint16_t *svc_codes,
|
||||
uint8_t block_num, const uint16_t *block_list,
|
||||
uint8_t block_data[][16]);
|
||||
bool pn532_felica_read_wo_encrypt(uint16_t svc_code, uint16_t block_id, uint8_t block_data[16]);
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user