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