diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/serial/spenh.c	Sat Mar 20 21:17:56 2021 +0000
@@ -0,0 +1,72 @@
+/*
+ * This module implements speed enhancement logic for our serial
+ * SIM interface back end.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern u_char atr_buf[];
+extern unsigned baud_spenh, spenh_host_max;
+
+void
+spenh_logic()
+{
+	unsigned spenh_sim_max, use_spenh;
+	u_char pts_req[4], pts_resp[4];
+	int rc;
+
+	if (!(atr_buf[1] & 0x10)) {
+no_spenh:	printf("X SIM does not support speed enhancement\n");
+		return;
+	}
+	switch (atr_buf[2]) {
+	case 0x94:
+		spenh_sim_max = 1;
+		break;
+	case 0x95:
+		spenh_sim_max = 2;
+		break;
+	case 0x96:
+		spenh_sim_max = 4;
+		break;
+	case 0x97:
+		spenh_sim_max = 8;
+		break;
+	default:
+		goto no_spenh;
+	}
+	use_spenh = spenh_sim_max;
+	if (use_spenh > spenh_host_max)
+		use_spenh = spenh_host_max;
+	pts_req[0] = 0xFF;
+	pts_req[1] = 0x10;
+	switch (use_spenh) {
+	case 1:
+		pts_req[2] = 0x94;
+		break;
+	case 2:
+		pts_req[2] = 0x95;
+		break;
+	case 4:
+		pts_req[2] = 0x96;
+		break;
+	case 8:
+		pts_req[2] = 0x97;
+		break;
+	}
+	pts_req[3] = pts_req[0] ^ pts_req[1] ^ pts_req[2];
+	rc = send_bytes_to_sim(pts_req, 4);
+	if (rc < 0)
+		exit(1);
+	rc = collect_bytes_from_sim(pts_resp, 4);
+	if (rc < 0)
+		exit(1);
+	if (bcmp(pts_req, pts_resp, 4)) {
+		fprintf(stderr, "error: PTS response does not match request\n");
+		exit(1);
+	}
+	set_serial_params(baud_spenh * use_spenh);
+	printf("X Using F=512 D=%u speed enhancement\n", use_spenh * 8);
+}