FreeCalypso > hg > fc-sim-tools
changeset 42:6cc3eea720cb
serial: speed enhancement implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 20 Mar 2021 21:17:56 +0000 |
parents | 5ee00413b8af |
children | be27d1c85861 |
files | serial/Makefile serial/main.c serial/spenh.c |
diffstat | 3 files changed, 77 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/serial/Makefile Sat Mar 20 20:53:51 2021 +0000 +++ b/serial/Makefile Sat Mar 20 21:17:56 2021 +0000 @@ -7,7 +7,8 @@ INSTBIN=${INSTALL_PREFIX}/bin ATR_OBJS= atrmain.o baud_parse.o collect_atr.o invtable.o serport.o -MAIN_OBJS= baud_parse.o collect_atr.o invtable.o main.o serport.o xmit.o +MAIN_OBJS= baud_parse.o collect_atr.o invtable.o main.o serport.o spenh.o \ + xmit.o all: ${PROGS}
--- a/serial/main.c Sat Mar 20 20:53:51 2021 +0000 +++ b/serial/main.c Sat Mar 20 21:17:56 2021 +0000 @@ -5,7 +5,7 @@ #include <stdio.h> #include <stdlib.h> -extern unsigned baud_base; +extern unsigned baud_base, baud_spenh; main(argc, argv) char **argv; @@ -25,6 +25,8 @@ if (rc < 0) exit(1); print_atr("A"); + if (baud_spenh) + spenh_logic(); /* remaining logic to be implemented */ exit(0);
--- /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); +}