blob: d4d8faf152ee560779e0dd11b9b81c6a0d8c53ef [file] [log] [blame]
Harald Weltea40c8e52019-09-27 19:22:34 +02001#include <unistd.h>
2#include <stdio.h>
3#include <errno.h>
4#include <osmocom/core/utils.h>
5
6#include "cuart.h"
7
8static struct card_uart g_cuart;
9
10
11static void handle_event(struct card_uart *cuart, enum card_uart_event evt, void *data)
12{
13 printf("Handle Event '%s'\n", get_value_string(card_uart_event_vals, evt));
14 switch (evt) {
15 case CUART_E_RX_SINGLE:
16 printf("\t%02x\n", *(uint8_t *)data);
17 break;
18 }
19
20}
21
22
23static int get_atr(uint8_t *atr, size_t max_len)
24{
25 int rc;
26 int i = 0;
27
28 card_uart_ctrl(&g_cuart, CUART_CTL_RST, true);
29 usleep(100000);
30 card_uart_ctrl(&g_cuart, CUART_CTL_RST, false);
31
32 sleep(1);
33 osmo_select_main(true);
34
35 for (i = 0; i < max_len; i++) {
36 rc = card_uart_rx(&g_cuart, &atr[i], 1);
37 if (rc <= 0)
38 break;
39 }
40
41 return i;
42}
43
44static void test_apdu(void)
45{
46 const uint8_t select_mf[] = "\xa0\xa4\x04\x00\x02\x3f\x00";
Harald Welte02dd9112019-10-01 08:55:29 +020047 card_uart_tx(&g_cuart, select_mf, 5);
Harald Weltea40c8e52019-09-27 19:22:34 +020048
49 osmo_select_main(true);
Harald Welte18ec3222019-09-28 21:41:59 +020050 sleep(1);
51 osmo_select_main(true);
Harald Weltea40c8e52019-09-27 19:22:34 +020052 /* we should get an RX_SINGLE event here */
53}
54
55
56int main(int argc, char **argv)
57{
58 uint8_t atr[64];
59 int rc;
60
61 g_cuart.handle_event = &handle_event;
62 rc = card_uart_open(&g_cuart, "tty", "/dev/ttyUSB5");
63 if (rc < 0) {
64 perror("opening UART");
65 exit(1);
66 }
67
68 rc = get_atr(atr, sizeof(atr));
69 if (rc < 0) {
70 perror("getting ATR");
71 exit(1);
72 }
73 printf("ATR: %s\n", osmo_hexdump(atr, rc));
74
75 test_apdu();
76
77 exit(0);
78}