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