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
 };
 
 /*

Reply via email to