The diff below makes the serial interface of the Genio 1200 demo board (FT232R) work. The upper 2 bits encode the fractional component of the FT232R is either 0 or 0.125.
uftdi0 at uhub0 port 3 configuration 1 interface 0 "FTDI FT232R USB UART" rev 2.00/6.00 addr 2 ucom0 at uftdi0 portno 1 Tested with cu. ok? Index: sys/dev/usb/uftdi.c =================================================================== RCS file: /cvs/src/sys/dev/usb/uftdi.c,v retrieving revision 1.77 diff -u -p -u -p -r1.77 uftdi.c --- sys/dev/usb/uftdi.c 9 Apr 2022 20:07:44 -0000 1.77 +++ sys/dev/usb/uftdi.c 29 Dec 2022 06:40:32 -0000 @@ -97,7 +97,7 @@ void uftdi_read(void *sc, int portno, u_ void uftdi_write(void *sc, int portno, u_char *to, u_char *from, u_int32_t *count); void uftdi_break(void *sc, int portno, int onoff); -int uftdi_8u232am_getrate(speed_t speed, int *rate); +int uftdi_8u232am_getrate(struct uftdi_softc *sc, speed_t speed, int *rate); int uftdi_2232h_getrate(speed_t speed, int *rate); const struct ucom_methods uftdi_methods = { @@ -772,6 +772,9 @@ uftdi_attach(struct device *parent, stru if (uaa->release < 0x0200) { sc->sc_type = UFTDI_TYPE_SIO; sc->sc_hdrlen = 1; + } else if (uaa->release == 0x0600) { + sc->sc_type = UFTDI_TYPE_232R; + sc->sc_hdrlen = 0; } else if (uaa->release == 0x0700 || uaa->release == 0x0800) { sc->sc_type = UFTDI_TYPE_2232H; sc->sc_hdrlen = 0; @@ -1011,8 +1014,9 @@ uftdi_param(void *vsc, int portno, struc } break; + case UFTDI_TYPE_232R: case UFTDI_TYPE_8U232AM: - if (uftdi_8u232am_getrate(t->c_ospeed, &rate) == -1) + if (uftdi_8u232am_getrate(sc, t->c_ospeed, &rate) == -1) return (EINVAL); break; case UFTDI_TYPE_2232H: @@ -1131,7 +1135,7 @@ uftdi_break(void *vsc, int portno, int o } int -uftdi_8u232am_getrate(speed_t speed, int *rate) +uftdi_8u232am_getrate(struct uftdi_softc *sc, speed_t speed, int *rate) { /* Table of the nearest even powers-of-2 for values 0..15. */ static const unsigned char roundoff[16] = { @@ -1182,11 +1186,13 @@ uftdi_8u232am_getrate(speed_t speed, int * 0.125. */ result = d >> 4; - if (d & 8) - result |= 0x4000; - else if (d & 4) - result |= 0x8000; - else if (d & 2) + if (sc->sc_type == UFTDI_TYPE_8U232AM) { + if (d & 8) + result |= 0x4000; + else if (d & 4) + result |= 0x8000; + } + if (d & 2) result |= 0xc000; done: Index: sys/dev/usb/uftdireg.h =================================================================== RCS file: /cvs/src/sys/dev/usb/uftdireg.h,v retrieving revision 1.13 diff -u -p -u -p -r1.13 uftdireg.h --- sys/dev/usb/uftdireg.h 11 Sep 2012 16:04:44 -0000 1.13 +++ sys/dev/usb/uftdireg.h 29 Dec 2022 06:40:32 -0000 @@ -36,7 +36,8 @@ enum uftdi_type { UFTDI_TYPE_SIO, UFTDI_TYPE_8U232AM, - UFTDI_TYPE_2232H + UFTDI_TYPE_2232H, + UFTDI_TYPE_232R }; /*