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

Reply via email to