comparison serial/spenh.c @ 42:6cc3eea720cb

serial: speed enhancement implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 20 Mar 2021 21:17:56 +0000
parents
children fbedb67d234f
comparison
equal deleted inserted replaced
41:5ee00413b8af 42:6cc3eea720cb
1 /*
2 * This module implements speed enhancement logic for our serial
3 * SIM interface back end.
4 */
5
6 #include <sys/types.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 extern u_char atr_buf[];
11 extern unsigned baud_spenh, spenh_host_max;
12
13 void
14 spenh_logic()
15 {
16 unsigned spenh_sim_max, use_spenh;
17 u_char pts_req[4], pts_resp[4];
18 int rc;
19
20 if (!(atr_buf[1] & 0x10)) {
21 no_spenh: printf("X SIM does not support speed enhancement\n");
22 return;
23 }
24 switch (atr_buf[2]) {
25 case 0x94:
26 spenh_sim_max = 1;
27 break;
28 case 0x95:
29 spenh_sim_max = 2;
30 break;
31 case 0x96:
32 spenh_sim_max = 4;
33 break;
34 case 0x97:
35 spenh_sim_max = 8;
36 break;
37 default:
38 goto no_spenh;
39 }
40 use_spenh = spenh_sim_max;
41 if (use_spenh > spenh_host_max)
42 use_spenh = spenh_host_max;
43 pts_req[0] = 0xFF;
44 pts_req[1] = 0x10;
45 switch (use_spenh) {
46 case 1:
47 pts_req[2] = 0x94;
48 break;
49 case 2:
50 pts_req[2] = 0x95;
51 break;
52 case 4:
53 pts_req[2] = 0x96;
54 break;
55 case 8:
56 pts_req[2] = 0x97;
57 break;
58 }
59 pts_req[3] = pts_req[0] ^ pts_req[1] ^ pts_req[2];
60 rc = send_bytes_to_sim(pts_req, 4);
61 if (rc < 0)
62 exit(1);
63 rc = collect_bytes_from_sim(pts_resp, 4);
64 if (rc < 0)
65 exit(1);
66 if (bcmp(pts_req, pts_resp, 4)) {
67 fprintf(stderr, "error: PTS response does not match request\n");
68 exit(1);
69 }
70 set_serial_params(baud_spenh * use_spenh);
71 printf("X Using F=512 D=%u speed enhancement\n", use_spenh * 8);
72 }