What can I do so that this small but important change becomes part of trunk & Linux kernel trunk?
2014-02-28 18:56 GMT+01:00 Alex Walker <alexaaronwal...@gmail.com>: > Dear folks, > > I noticed that the bit timing of the UART in the WR703N / AR9331 > device is inaccurate and provide a patch to improve timing accuracy. > > I suppose to change > #define AR933X_UART_MAX_STEP 0xffff > to > #define AR933X_UART_MAX_STEP 0x3333 > in > linux-3.10.32/drivers/tty/serial/ar933x_uart.c > > The maximum value of UART_STEP should be 13107 as suggested by the > AR9331 datasheet. > See section 6.2.3: > This value should range between 1310-13107 to > maintain a better than +5% accuracy. > 13107 corresponds to 0x3333. > > I did a detailed timing analysis using an oscilloscope. I'm using a > different version of picocom which in turn uses termios2 to support > arbitrary baud rates [2]. These are my findings. See [3] for the > screenshots. > > > Sending ASCII 'U' = 0x55 = 0b01010101 > This results in a nice square wave with the start and stop bit. The > bit timing is generated from the 25 MHz internal frequency by a > fractional baud rate generator. This is state of the art to generate > 'odd' baud rates as 115200 from 'even' clock rates as 25 MHz. > > The setting of UART_CLOCK_SCALE and UART_CLOCK_STEP determine the bit > rate of the UART. These settings are dynamically calculated when > changing the baud rate. > > On: BARRIER BREAKER (Bleeding Edge, r39757) > Linux myhost 3.10.32 #1 Fri Feb 28 11:03:52 CET 2014 mips GNU/Linux > > Baud 115200 > Screenshot 10 - 22 > > You can see a significant jitter of each bit time. At this baud rate > this is not yet a problem. > > Baud 921600 > Screenshot 23 - 38 > > At this baud rate the jitter already accumulated to a significant > portion of the bit time. This can make the connection unreliable. > > Baud 500000 > Screenshot 39 - 41 > > The setting of UART_BAUD_STEP is much to high resulting in a jitter > that prevented me from having a reliable loopback connection. > > I assume that for > > Uart Clock: 25000000 > Uart Baud: 500000 > > the kernel calculates the following value > > Uart Scale: 15 > Uart Step: 41943 > > This gist [1] for a user-landed code from the driver. > > The granulation of the bit timing is 640 nsec and the UART_STEP is > 41943. This value violates the recommendation from the data sheet. > > I then applied my proposed change. > > New Kernel with patch 104-tty-ar933x_uart-fix-clock-step-max.patch applied > Linux myhost 3.10.32 #1 Fri Feb 28 17:00:25 CET 2014 mips GNU/Linux > > 115200 Baud > [ 182.150000] ar933x_uart_get_scale_step: clk 25000000, baud 115200, > scale 20, step 12683 > Screenshot 42 > compare to screenshot 10 and see that the jitter is a little smaller. > > 500000 Baud > [ 426.870000] ar933x_uart_get_scale_step: clk 25000000, baud 500000, > scale 4, step 13107 > Screenshot 43 > As remainder(25E6, 5E5) is 0 there is no jitter with this > configuration. The bit timing is near perfect. > > 1 MBaud > [ 690.900000] ar933x_uart_get_scale_step: clk 25000000, baud 1000000, > scale 1, step 10485 > Screenshot 44, 45 > > 2 MBaud > [ 804.230000] ar933x_uart_get_scale_step: clk 25000000, baud 2000000, > scale 0, step 10485 > Screenshot 46, 47 > > 3 MBaud > The code fails so I propose to work on that ... > [ 919.830000] ar933x_uart_get_scale_step: clk 25000000, baud 115200, > scale 20, step 12683 > > 921600 Baud > [ 993.680000] ar933x_uart_get_scale_step: clk 25000000, baud 921600, > scale 1, step 9663 > Screenshot 48, 49 > Finally, for the highest baudrate that is supported by an unpatched > picoterm the timing is nearly perfect, too. > > Here is the patch: > > Signed-off-by: Alex Aaron Walker <alexaaronwal...@gmail.com> > --- > Index: linux-3.10.32/drivers/tty/serial/ar933x_uart.c > =================================================================== > --- linux-3.10.32.orig/drivers/tty/serial/ar933x_uart.c 2014-02-28 > 12:12:03.356386552 +0100 > +++ linux-3.10.32/drivers/tty/serial/ar933x_uart.c 2014-02-28 > 12:15:21.716502356 +0100 > @@ -33,7 +33,7 @@ > #define DRIVER_NAME "ar933x-uart" > > #define AR933X_UART_MAX_SCALE 0xff > -#define AR933X_UART_MAX_STEP 0xffff > +#define AR933X_UART_MAX_STEP 0x3333 > > #define AR933X_UART_MIN_BAUD 300 > #define AR933X_UART_MAX_BAUD 3000000 > @@ -221,6 +221,7 @@ > *step = tstep; > } > } > + printk("ar933x_uart_get_scale_step: clk %u, baud %u, scale %u, > step %u\n", clk, baud, *scale, *step); > } > > static void ar933x_uart_set_termios(struct uart_port *port, > > -- > > All feedback welcome > > Alex > > [1] https://gist.github.com/anonymous/9275937 > [2] https://github.com/jmesmon/picocom.git > [3] https://plus.google.com/113941111747937474864/posts/ZnmUHycHXbJ _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel