diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2014-11-03 15:37:53 +0100 |
---|---|---|
committer | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2014-11-05 19:48:30 +0100 |
commit | 4cf8ce38c84dee7042e2093393924f8c86c2b207 (patch) | |
tree | 05dd8b120381ff5bf048a51470391856b0e4e761 | |
parent | 93d5916ad2f5ec55b1971f0ee4e97d45462e3626 (diff) | |
download | microcom-4cf8ce38c84dee7042e2093393924f8c86c2b207.tar.gz microcom-4cf8ce38c84dee7042e2093393924f8c86c2b207.tar.xz |
Use a lookup table for baudrate conversions
Commit bd88192bf9b8 added support for some high speed baudrates to
baudrate_to_flag but forgot to do the same for flag_to_baudrate.
The table introduced here supports the conversions supported by
baudrate_to_flag previously, so as a side effect the conversions that
were missed to be added in bd88192bf9b8 are available now.
Fixes: bd88192bf9b8 ("microcom: add more baudrates")
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
-rw-r--r-- | microcom.c | 117 |
1 files changed, 57 insertions, 60 deletions
@@ -59,94 +59,91 @@ void restore_terminal(void) tcsetattr(STDIN_FILENO, TCSANOW, &sots); } -int baudrate_to_flag(int speed, speed_t *flag) -{ - switch(speed) { - case 50: *flag = B50; return 0; - case 75: *flag = B75; return 0; - case 110: *flag = B110; return 0; - case 134: *flag = B134; return 0; - case 150: *flag = B150; return 0; - case 200: *flag = B200; return 0; - case 300: *flag = B300; return 0; - case 600: *flag = B600; return 0; - case 1200: *flag = B1200; return 0; - case 1800: *flag = B1800; return 0; - case 2400: *flag = B2400; return 0; - case 4800: *flag = B4800; return 0; - case 9600: *flag = B9600; return 0; - case 19200: *flag = B19200; return 0; - case 38400: *flag = B38400; return 0; - case 57600: *flag = B57600; return 0; - case 115200: *flag = B115200; return 0; - case 230400: *flag = B230400; return 0; +static const struct { + int speed; + speed_t flag; +} bd_to_flg[] = { + { 50, B50 }, + { 75, B75 }, + { 110, B110 }, + { 134, B134 }, + { 150, B150 }, + { 200, B200 }, + { 300, B300 }, + { 600, B600 }, + { 1200, B1200}, + { 1800, B1800}, + { 2400, B2400}, + { 4800, B4800}, + { 9600, B9600}, + { 19200, B19200}, + { 38400, B38400}, + { 57600, B57600}, + { 115200, B115200}, + { 230400, B230400}, #ifdef B460800 - case 460800: *flag = B460800; return 0; + { 460800, B460800}, #endif #ifdef B500000 - case 500000: *flag = B500000; return 0; + { 500000, B500000}, #endif #ifdef B576000 - case 576000: *flag = B576000; return 0; + { 576000, B576000}, #endif #ifdef B921600 - case 921600: *flag = B921600; return 0; + { 921600, B921600}, #endif #ifdef B1000000 - case 1000000: *flag = B1000000; return 0; + { 1000000, B1000000}, #endif #ifdef B1152000 - case 1152000: *flag = B1152000; return 0; + { 1152000, B1152000}, #endif #ifdef B1500000 - case 1500000: *flag = B1500000; return 0; + { 1500000, B1500000}, #endif #ifdef B2000000 - case 2000000: *flag = B2000000; return 0; + { 2000000, B2000000}, #endif #ifdef B2500000 - case 2500000: *flag = B2500000; return 0; + { 2500000, B2500000}, #endif #ifdef B3000000 - case 3000000: *flag = B3000000; return 0; + { 3000000, B3000000}, #endif #ifdef B3500000 - case 3500000: *flag = B3500000; return 0; + { 3500000, B3500000}, #endif #ifdef B4000000 - case 4000000: *flag = B4000000; return 0; + { 4000000, B4000000}, #endif - default: - printf("unknown speed: %d\n",speed); - return -1; - } +}; + +int baudrate_to_flag(int speed, speed_t *flag) +{ + size_t i; + + /* possible optimisation: binary search for speed */ + for (i = 0; i < ARRAY_SIZE(bd_to_flg); ++i) + if (bd_to_flg[i].speed == speed) { + *flag = bd_to_flg[i].flag; + return 0; + } + + printf("unknown speed: %d\n", speed); + return -1; } int flag_to_baudrate(speed_t speed) { - switch(speed) { - case B50: return 50; - case B75: return 75; - case B110: return 110; - case B134: return 134; - case B150: return 150; - case B200: return 200; - case B300: return 300; - case B600: return 600; - case B1200: return 1200; - case B1800: return 1800; - case B2400: return 2400; - case B4800: return 4800; - case B9600: return 9600; - case B19200: return 19200; - case B38400: return 38400; - case B57600: return 57600; - case B115200: return 115200; - case B230400: return 230400; - default: - printf("unknown speed: %d\n",speed); - return -1; - } + size_t i; + + for (i = 0; i < ARRAY_SIZE(bd_to_flg); ++i) + if (bd_to_flg[i].flag == speed) + return bd_to_flg[i].speed; + + printf("unknown speed flag: 0x%x\n", (unsigned)speed); + return -1; } void microcom_exit(int signal) |