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