Using a second UART to control a serial device

Pflaum, Clemens clemens.pflaum at mytum.de
Sat Apr 25 13:56:16 CEST 2015


Hi L4 Hackers,
Since i sadly still cant get the uart to work i have some more 
questions.

1. I've noticed that the offsets of all the registers in the 
/drivers-frst/uart/src/uart_pxa.cc are are incorrect by a multiple of 4. 
So if IER is defined to be at 0x01 it is actually at 0x04, respectivly 
the LCR which is said to be at 0x03 is actually at 0x0C. After I changed 
these values to reflect the allwinner A20 manual, the kernel stopped 
loading properly. It gets stuck on bootup at "Starting kernel...". In 
fact it does continue although at a pace of one character every 5 to 6 
minutes. So after 30mins i had "L4 Bootstra" in the next line. My 
assumption is that my UART0 from which i run the console on my linux pc 
actually uses the uart_pxa driver with the incorrect register offset and 
it works for it. By changing the registers I somehow break my UART0. If 
I'm correct then I should be able to find the routine which the kernel 
uses to initilize UART0, to help me understand how to get UART3 to work. 
Sadly I couldn't find anything alike.

2.So i went on by writing a new uart_16550bananapi.cc with changed 
registers. It did infact solve the kernel not starting issue. I can now 
access and write to all of the uart registers... apart from the Line 
Control Register(LCR). It starts off with 0x03 written to it although it 
has a default of 0x00(in the a20 manual) as soon as i write 0x00 to it 
my console starts throwing out seemingly random chars:

This code in the uart startup() function:

     scratch = _regs->read<unsigned char>(LCR);
     printf("\ncurrent LCR: %#010x\n", scratch);
     printf("Setting LCR to 0\n");
     printf("This gets overritten\n");
     _regs->write<unsigned char>(LCR, 0);            /* clear line 
control register */
     printf("It worked\n");

gives me this outpot on console:

Maestro |
Maestro | current LCR: 0x00000003
Maestro | Setting LCR to 0
Maese|iw�k�{m{[e|{m{[e|pp`'br�l�z{mos�pppppn{m{[e��r|{m{[e        
       p�ot[
lLzppppp{m{[e|pq`�rppppp{m{ێm[e|pqlNzppppv{m{[e|pq`�rppppp{m{ێm[e     
       q


The same thing happens if i write 0x80 to it to add the DLAB bit that i 
need to access the two Divisor Latch registers to initilize the Baudrate 
for the first time. The 0x03 in LCR means that i run my Uart in 8N1 mode 
setting which my UART0 console is running aswell. Setting it to 0 means 
to run 5N1. So I assume for some reason it might somehow change my UART0 
settings if i write to UART3 LCR reg. But the same error occurs if i 
write 0x83 to it to leave 8N1 on and set the DLAB bit, so that cant be 
the case can it? Without setting Baudrate however i obviously cant hope 
for UART3 to work.


Thanks for any answers in advance,

Clemens




More information about the l4-hackers mailing list