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
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Xenomai-core mailing list [email protected] https://mail.gna.org/listinfo/xenomai-core
