> Date: Wed, 14 May 2014 11:04:56 +0200
> From: Martin Pieuchot <[email protected]>
> 
> On 13/05/14(Tue) 21:24, Mike Larkin wrote:
> > On Wed, May 14, 2014 at 11:02:49AM +0900, SASANO Takayoshi wrote:
> > > Hi,
> > > 
> > > Simply magic values are rewrited with #define.
> > > If these values need to be disassembled, please take a while...
> > > 
> > 
> > I think we need to understand what those values mean. When I mentioned
> > #defines, I meant something like:
> > 
> > #define UCHCOM_SOME_FLAG 0x1234
> > #define UCHCOM_SOME_OTHER_FLAG 0x5678
> > ...
> > ...
> > #define UCHCOM_RESET_VALUE (UCHCOM_SOME_FLAG | UCHCOM_SOME_OTHER_FLAG)
> > 
> > That way we know what the values do. If the value we're setting is not
> > a flag, we should understand what 0x501F and 0xD90A actually mean.
> 
> Unfortunately a lot of USB drivers are written without spec. and some
> values are taken by analysing the traffic generated by drivers on other
> OS.
> 
> > If we don't do it this way, the next person to come along and try to
> > work on this code won't have any idea what to do.
> 
> I also really don't like magic values, but I don't see how we could do
> it differently.  Maybe somebody can send an email to the author of the
> linux driver and ask him what these values are.  But I'd bet he doesn't
> no neither.

And really, the old code had magic numbers as well.

> > > Index: uchcom.c
> > > ===================================================================
> > > RCS file: /cvs/src/sys/dev/usb/uchcom.c,v
> > > retrieving revision 1.19
> > > diff -u -p -r1.19 uchcom.c
> > > --- uchcom.c      15 Nov 2013 10:17:39 -0000      1.19
> > > +++ uchcom.c      14 May 2014 01:43:34 -0000
> > > @@ -91,18 +91,14 @@ int   uchcomdebug = 0;
> > >  #define UCHCOM_BRK1_MASK 0x01
> > >  #define UCHCOM_BRK2_MASK 0x40
> > >  
> > > -#define UCHCOM_LCR1_MASK 0xAF
> > > -#define UCHCOM_LCR2_MASK 0x07
> > > -#define UCHCOM_LCR1_PARENB       0x80
> > > -#define UCHCOM_LCR2_PAREVEN      0x07
> > > -#define UCHCOM_LCR2_PARODD       0x06
> > > -#define UCHCOM_LCR2_PARMARK      0x05
> > > -#define UCHCOM_LCR2_PARSPACE     0x04
> > > -
> > >  #define UCHCOM_INTR_STAT1        0x02
> > >  #define UCHCOM_INTR_STAT2        0x03
> > >  #define UCHCOM_INTR_LEAST        4
> > >  
> > > +/* these values come from Linux (drivers/usb/serial/ch341.c) */
> > > +#define UCHCOM_RESET_VALUE       0x501F  /* XXX default line mode? */
> > > +#define UCHCOM_RESET_INDEX       0xD90A  /* XXX default baud rate? */
> > > +
> > >  #define UCHCOMIBUFSIZE 256
> > >  #define UCHCOMOBUFSIZE 256
> > >  
> > > @@ -707,27 +703,10 @@ uchcom_set_dte_rate(struct uchcom_softc 
> > >  int
> > >  uchcom_set_line_control(struct uchcom_softc *sc, tcflag_t cflag)
> > >  {
> > > - usbd_status err;
> > > - uint8_t lcr1 = 0, lcr2 = 0;
> > > -
> > > - err = uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2,
> > > -     &lcr2);
> > > - if (err) {
> > > -         printf("%s: cannot get LCR: %s\n",
> > > -                sc->sc_dev.dv_xname, usbd_errstr(err));
> > > -         return EIO;
> > > - }
> > > -
> > > - lcr1 &= ~UCHCOM_LCR1_MASK;
> > > - lcr2 &= ~UCHCOM_LCR2_MASK;
> > > -
> > >   /*
> > >    * XXX: it is difficult to handle the line control appropriately:
> > > -  *   - CS8, !CSTOPB and any parity mode seems ok, but
> > > -  *   - the chip doesn't have the function to calculate parity
> > > -  *     in !CS8 mode.
> > > -  *   - it is unclear that the chip supports CS5,6 mode.
> > > -  *   - it is unclear how to handle stop bits.
> > > +  *   work as chip default - CS8, no parity, !CSTOPB
> > > +  *   other modes are not supported.
> > >    */
> > >  
> > >   switch (ISSET(cflag, CSIZE)) {
> > > @@ -739,21 +718,8 @@ uchcom_set_line_control(struct uchcom_so
> > >           break;
> > >   }
> > >  
> > > - if (ISSET(cflag, PARENB)) {
> > > -         lcr1 |= UCHCOM_LCR1_PARENB;
> > > -         if (ISSET(cflag, PARODD))
> > > -                 lcr2 |= UCHCOM_LCR2_PARODD;
> > > -         else
> > > -                 lcr2 |= UCHCOM_LCR2_PAREVEN;
> > > - }
> > > -
> > > - err = uchcom_write_reg(sc, UCHCOM_REG_LCR1, lcr1, UCHCOM_REG_LCR2,
> > > -     lcr2);
> > > - if (err) {
> > > -         printf("%s: cannot set LCR: %s\n",
> > > -                sc->sc_dev.dv_xname, usbd_errstr(err));
> > > -         return EIO;
> > > - }
> > > + if (ISSET(cflag, PARENB) || ISSET(cflag, CSTOPB))
> > > +         return EINVAL;
> > >  
> > >   return 0;
> > >  }
> > > @@ -778,38 +744,12 @@ int
> > >  uchcom_reset_chip(struct uchcom_softc *sc)
> > >  {
> > >   usbd_status err;
> > > - uint8_t lcr1, lcr2, pre, div, mod;
> > > - uint16_t val=0, idx=0;
> > > -
> > > - err = uchcom_read_reg(sc, UCHCOM_REG_LCR1, &lcr1, UCHCOM_REG_LCR2, 
> > > &lcr2);
> > > - if (err)
> > > -         goto failed;
> > > -
> > > - err = uchcom_read_reg(sc, UCHCOM_REG_BPS_PRE, &pre, UCHCOM_REG_BPS_DIV,
> > > -     &div);
> > > - if (err)
> > > -         goto failed;
> > > -
> > > - err = uchcom_read_reg(sc, UCHCOM_REG_BPS_MOD, &mod, UCHCOM_REG_BPS_PAD,
> > > -     NULL);
> > > - if (err)
> > > -         goto failed;
> > > -
> > > - val |= (uint16_t)(lcr1&0xF0) << 8;
> > > - val |= 0x01;
> > > - val |= (uint16_t)(lcr2&0x0F) << 8;
> > > - val |= 0x02;
> > > - idx |= pre & 0x07;
> > > - val |= 0x04;
> > > - idx |= (uint16_t)div << 8;
> > > - val |= 0x08;
> > > - idx |= mod & 0xF8;
> > > - val |= 0x10;
> > >  
> > > - DPRINTF(("%s: reset v=0x%04X, i=0x%04X\n",
> > > -          sc->sc_dev.dv_xname, val, idx));
> > > + DPRINTF(("%s: reset\n", sc->sc_dev.dv_xname));
> > >  
> > > - err = uchcom_generic_control_out(sc, UCHCOM_REQ_RESET, val, idx);
> > > + err = uchcom_generic_control_out(sc, UCHCOM_REQ_RESET,
> > > +                                  UCHCOM_RESET_VALUE,
> > > +                                  UCHCOM_RESET_INDEX);
> > >   if (err)
> > >           goto failed;
> > > 
> > 
> 
> 

Reply via email to