jcs's openbsd hax
openbsd

Support FTDI FT232R. The upper 2 bits encode the fractional component of the FT232R is either 0 or 0.125.

ok dlg@

kevlo bf3df6a1 4b28d16f

+18 -11
+15 -9
sys/dev/usb/uftdi.c
··· 1 - /* $OpenBSD: uftdi.c,v 1.77 2022/04/09 20:07:44 naddy Exp $ */ 1 + /* $OpenBSD: uftdi.c,v 1.78 2022/12/30 00:54:09 kevlo Exp $ */ 2 2 /* $NetBSD: uftdi.c,v 1.14 2003/02/23 04:20:07 simonb Exp $ */ 3 3 4 4 /* ··· 97 97 void uftdi_write(void *sc, int portno, u_char *to, u_char *from, 98 98 u_int32_t *count); 99 99 void uftdi_break(void *sc, int portno, int onoff); 100 - int uftdi_8u232am_getrate(speed_t speed, int *rate); 100 + int uftdi_8u232am_getrate(struct uftdi_softc *sc, speed_t speed, int *rate); 101 101 int uftdi_2232h_getrate(speed_t speed, int *rate); 102 102 103 103 const struct ucom_methods uftdi_methods = { ··· 772 772 if (uaa->release < 0x0200) { 773 773 sc->sc_type = UFTDI_TYPE_SIO; 774 774 sc->sc_hdrlen = 1; 775 + } else if (uaa->release == 0x0600) { 776 + sc->sc_type = UFTDI_TYPE_232R; 777 + sc->sc_hdrlen = 0; 775 778 } else if (uaa->release == 0x0700 || uaa->release == 0x0800) { 776 779 sc->sc_type = UFTDI_TYPE_2232H; 777 780 sc->sc_hdrlen = 0; ··· 1011 1014 } 1012 1015 break; 1013 1016 1017 + case UFTDI_TYPE_232R: 1014 1018 case UFTDI_TYPE_8U232AM: 1015 - if (uftdi_8u232am_getrate(t->c_ospeed, &rate) == -1) 1019 + if (uftdi_8u232am_getrate(sc, t->c_ospeed, &rate) == -1) 1016 1020 return (EINVAL); 1017 1021 break; 1018 1022 case UFTDI_TYPE_2232H: ··· 1131 1135 } 1132 1136 1133 1137 int 1134 - uftdi_8u232am_getrate(speed_t speed, int *rate) 1138 + uftdi_8u232am_getrate(struct uftdi_softc *sc, speed_t speed, int *rate) 1135 1139 { 1136 1140 /* Table of the nearest even powers-of-2 for values 0..15. */ 1137 1141 static const unsigned char roundoff[16] = { ··· 1182 1186 * 0.125. 1183 1187 */ 1184 1188 result = d >> 4; 1185 - if (d & 8) 1186 - result |= 0x4000; 1187 - else if (d & 4) 1188 - result |= 0x8000; 1189 - else if (d & 2) 1189 + if (sc->sc_type == UFTDI_TYPE_8U232AM) { 1190 + if (d & 8) 1191 + result |= 0x4000; 1192 + else if (d & 4) 1193 + result |= 0x8000; 1194 + } 1195 + if (d & 2) 1190 1196 result |= 0xc000; 1191 1197 1192 1198 done:
+3 -2
sys/dev/usb/uftdireg.h
··· 1 - /* $OpenBSD: uftdireg.h,v 1.13 2012/09/11 16:04:44 deraadt Exp $ */ 1 + /* $OpenBSD: uftdireg.h,v 1.14 2022/12/30 00:54:09 kevlo Exp $ */ 2 2 /* $NetBSD: uftdireg.h,v 1.6 2002/07/11 21:14:28 augustss Exp $ */ 3 3 4 4 /* ··· 36 36 enum uftdi_type { 37 37 UFTDI_TYPE_SIO, 38 38 UFTDI_TYPE_8U232AM, 39 - UFTDI_TYPE_2232H 39 + UFTDI_TYPE_2232H, 40 + UFTDI_TYPE_232R 40 41 }; 41 42 42 43 /*