CHABAL David wrote:
> Hello,
> 
> I met some trouble with the 16550A driver provided in Xenomai 2.3.1
> and my Moxa cards (PCI / 8 * RS232 / 168U ).
> 
> It was a problem of baudrate computation before setting the LCR_DLAB
> register.
> 
> The formula implemented by the Xenomai driver is different from the one
> provided by Moxa. So I copy/paste the formula from the mxser.c file
> (present in the
> kernel distro), and it seems to work fine.
> 
> I think it's Moxa card dependant, may be caused by the high default baud
> rate of this card.
> 
> I post here my patch below, it may interest someone.

Thanks for sharing your findings. Will check if/how we can integrate
them. See some comments below already.

[Reminds me that there are more 16550A patches pending in my inbox... :-/]

> 
> David
> 
> ----------------------------------------------
> 
> 
> 
> @@ -29,7 +29,7 @@
>  #define IN_BUFFER_SIZE      4096
>  #define OUT_BUFFER_SIZE     4096
> 
> -#define DEFAULT_BAUD_BASE   115200
> +#define DEFAULT_BAUD_BASE   921600

OK, that's for your convenience right now. We also have a module
parameter to set the base.

>  #define DEFAULT_TX_FIFO     16
> 
>  #define PARITY_MASK         0x03
> @@ -316,8 +316,23 @@
> 
>      if (testbits(config->config_mask, RTSER_SET_BAUD)) {
>          ctx->config.baud_rate = config->baud_rate;
> -        baud_div = (baud_base[dev_id] + (ctx->config.baud_rate >> 1)) /
> -                   ctx->config.baud_rate;
> +        if (ctx->config.baud_rate == 134)
> +        {
> +          baud_div = (2 * baud_base[dev_id] / 269);
> +        }

Well, whoever needs such low rates in practice these days... :)

> +        else
> +        {
> +          if (ctx->config.baud_rate)

Oops, that check protects us from dividing by zero - should be fixed in
any case! Or is baud_div = 0 a special mode with Moxa?

> +          {
> +            baud_div = baud_base[dev_id] / ctx->config.baud_rate;

So this means dividing with round down instead of round up. We could
enable this mode with an additional module parameter, something like
variant = {0: standard, 1: moxa, ...}. That could also raise the default
baudbase for the particular port.

> +                 if (baud_div == 0)
> +              baud_div = 1;

That shouldn't trigger with xeno_16550A because we catch baud_rate >
baud_base already in rt_16550_ioctl.

> +               }
> +          else
> +          {
> +                 baud_div = 0;
> +          }
> +        }
>          outb(LCR_DLAB,        LCR(dev_id));
>          outb(baud_div & 0xff, DLL(dev_id));
>          outb(baud_div >> 8,   DLM(dev_id));
> 

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to