On Thu, Dec 29, 2022 at 03:05:35PM +0800, Kevin Lo wrote: > 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?
looks nice and simple to me. 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 > }; > > /* >