Mini UART on RaspberryPi CM3/CM3+

Rouven Czerwinski r.czerwinski at pengutronix.de
Tue Oct 20 08:45:23 EDT 2020


On Tue, 2020-10-20 at 14:22 +0200, Robert Carnecky (Neopsis) wrote:
> On Tue, Oct 20, 2020 at 6:04 AM Rouven Czerwinski
> <r.czerwinski at pengutronix.de> wrote:
> > On Tue, 2020-10-20 at 05:59 +0200, Rouven Czerwinski wrote:
> > > On Tue, 2020-10-20 at 00:29 +0200, Robert Carnecky (Neopsis)
> > > wrote:
> > > > On Mon, Oct 19, 2020 at 11:28 AM Ahmad Fatoum <
> > > > a.fatoum at pengutronix.de> wrote:
> > > > > Hello,
> > > > > 
> > > > > On 10/18/20 1:17 AM, Robert Carnecky (Neopsis) wrote:
> > > > > > On Sat, Oct 17, 2020 at 11:29 PM Ahmad Fatoum <
> > > > > > a.fatoum at pengutronix.de> wrote:
> > > > > > > Hi,
> > > > > > > 
> > > > > > > On 10/17/20 1:31 PM, Robert Carnecky (Neopsis) wrote:
> > > > > > > > Finally, I managed to boot into barebox menu using
> > > > > > > > UART1
> > > > > > > > (/dev/ttyS0)
> > > > > > > > as the console. The solution was to remove all UART
> > > > > > > > related
> > > > > > > > overlays
> > > > > > > > from config.txt and only activate UART1.
> > > > > > > > 
> > > > > > > >    enable_uart=1
> > > > > > > > 
> > > > > > > > Anyway, another problem occurred. When booting via
> > > > > > > > barebox
> > > > > > > > the CPU
> > > > > > > > serial number is wrong. Obviously, barebox somehow
> > > > > > > > manipulates the
> > > > > > > > internal structures and
> > > > > > > > 
> > > > > > > >    cat /proc/cpuinfo
> > > > > > > > 
> > > > > > > > returns always
> > > > > > > > 
> > > > > > > >    Hardware        : BCM2835
> > > > > > > >    Revision          : 0000
> > > > > > > >    Serial              : 0000000000000000
> > > > > > > >    Model              : Raspberry Pi Compute Module 3
> > > > > > > > IO
> > > > > > > > board V3.0
> > > > > > > > 
> > > > > > > > When I boot the same image directly without barebox
> > > > > > > > boot
> > > > > > > > loader, the
> > > > > > > > info is OK.  I found some discussions about U-Boot and
> > > > > > > > wrong serial
> > > > > > > > number here
> > > > > > > > 
> > > > > > > > 
> > > > > > > > https://www.raspberrypi.org/forums/viewtopic.php?t=183474#p1162778
> > > > > > > > 
> > > > > > > > maybe that's barebox related too. Anyway, that is a
> > > > > > > > definitive no go
> > > > > > > > with barebox for us because parts of our software are
> > > > > > > > expecting the
> > > > > > > > unique serial number.
> > > > > > > 
> > > > > > > I believe you can boot Linux with /vc.dtb and you'll get
> > > > > > > the
> > > > > > > same
> > > > > > > device tree passed to Linux as if you booted without
> > > > > > > passing
> > > > > > > through
> > > > > > > barebox.
> > > > > > 
> > > > > > Yes, but then I lose my Linux console! A summary, in all
> > > > > > cases
> > > > > > Barebox device
> > > > > > tree in arch/arm/dts/bcm2837-rpi-cm3.dts was updated
> > > > > > following
> > > > > > your hint, e.g.
> > > > > > 
> > > > > > / {
> > > > > >   chosen {
> > > > > >      stdout-path = "&uart1";
> > > > > >   };
> > > > > >  };
> > > > > > 
> > > > > > &uart1 {
> > > > > >         pinctrl-names = "default";
> > > > > >         pinctrl-0 = <&uart1_gpio14>;
> > > > > >         status = "okay";
> > > > > >  };
> > > > > > 
> > > > > > &uart0 {
> > > > > >      pinctrl-names = "default";
> > > > > >      pinctrl-0 = <&uart0_gpio32>;
> > > > > >      status = "okay";
> > > > > >  };
> > > > > > 
> > > > > > 1. Booting kernel direct, works as expected (console on
> > > > > > uart1),
> > > > > > expected behavior
> > > > > > 
> > > > > > kernel=zImage
> > > > > > enable_uart=1
> > > > > > dtoverlay=uart0,txd0_pin=32,rxd0_pin=33,pin_func=7
> > > > > > dtoverlay=uart1,txd1_pin=14,rxd1_pin=15
> > > > > > 
> > > > > > 2. With Barebox loader. The same config.txt as in case 1),
> > > > > >     - no Barebox console
> > > > > >     - kernel boots with the console on uart1
> > > > > > 
> > > > > > kernel=barebox-raspberry-pi-cm3.img
> > > > > > enable_uart=1
> > > > > > dtoverlay=uart0,txd0_pin=32,rxd0_pin=33,pin_func=7
> > > > > > dtoverlay=uart1,txd1_pin=14,rxd1_pin=15
> > > > > > 
> > > > > > 3.  With Barebox loader, no uart overlays in config.txt.
> > > > > >     - Barebox console on uart1 ok,
> > > > > >     - kernel console on uart1
> > > > > >     - almost done), but ... no cpuinfo
> > > > > > 
> > > > > > kernel=barebox-raspberry-pi-cm3.img
> > > > > > enable_uart=1
> > > > > > 
> > > > > > 4. With Barebox loader, no uart overlays in config.txt,
> > > > > > Linux
> > > > > > boots with vc.dtb.
> > > > > >     - Barebox console on uart1 ok
> > > > > >     - no Linux console, Linux boots with cpuinfo ok
> > > > > > 
> > > > > > kernel=barebox-raspberry-pi-cm3.img
> > > > > > enable_uart=1
> > > > > > 
> > > > > > I did not found any combination when I get the Barebox
> > > > > > console
> > > > > > and
> > > > > > Linux console on uart1
> > > > > > and with cpuinfo ok. If the serial number is not needed,
> > > > > > case
> > > > > > 3) should be ok.
> > > > > 
> > > > > What happens if you combine 2. and 4. ?
> > > > > So you have enable_uart=1, the uart overlays _and_ Linux
> > > > > boots
> > > > > with vc.dtb?
> > > > 
> > > > Negativ. Whenever I enable overlays in the config.txt that map
> > > > uart0
> > > > to pin32/33 and
> > > > uart1 to pin 14/15 (console), I do not get Barebox console. It
> > > > does
> > > > not depend on the device
> > > > tree passed to the kernel. This interaction between Barebox
> > > > device
> > > > tree and Raspberry config.txt
> > > > overlays is a bit strange for me.
> > > > 
> > > > Just an idea - does Barebox fully support this hardware? From
> > > > the
> > > > 2835
> > > > ARM Peripherals Guide,
> > > > chapter 2.2 miniUART :
> > > > 
> > > > > The implemented UART is not a 16650 compatible UART However
> > > > > as
> > > > > far as possible
> > > > > the first 8 control and status registers are laid out like a
> > > > > 16550 UART. Al 16550 register
> > > > > bits which are not supported can be written but will be
> > > > > ignored
> > > > > and read back as 0.
> > > > > All control bits for simple UART receive/transmit operations
> > > > > are
> > > > > available.
> > > > 
> > > > Barebox has support for NS16650 ( CONFIG_DRIVER_SERIAL_NS16550)
> > > > but
> > > > not for
> > > > Raspberry miniUART.
> > > > 
> > > > Anyway, I am giving up. I am sure I tested all combinations of
> > > > overlays, I have written my
> > > > own dts, nothing works as I need (console=uart1, incl. proper
> > > > serial
> > > > number handling).
> > > > There is no problem to get the console on uart0/ttyAMA0, but
> > > > not on
> > > > uart1/ttyS0.
> > > > The Raspberry way how they are handling uarts lacks all logic
> > > > and
> > > > is completely
> > > > unclear.
> > > 
> > > Hi,
> > > 
> > > looking into arch/arm/dts/bcm2837-rpi-cm3.dts:
> > > / {
> > >         chosen {
> > >                 stdout-path = &uart0;
> > >         };
> > > };
> > > 
> > > The CM3 module is currently default configured to use uart0 as
> > > the
> > > stdout path, while bcm2837-rpi-3.dts is configured for uart1.
> > > This was done in ab76f9d09d3b7b77fc00d84bc2fac6bfbf82c69c after
> > > the
> > > miniuart support was added to the NS16550 driver
> > > in 77de547cd179b910cdcb8530df15d77a0fc66a3c.
> > 
> > Disregard this, I didn't read the whole thread. There however was
> > another user who tried to use the miniuart and had failures on
> > probe on
> > the CM3. Unfortunately the barebox archives don't have these mails,
> > I'll attach an mbox which has the whole thread.
> > 
> > 
> > Regards,
> > Rouven Czerwinski
> > 
> 
> The thread sent by Rouven describes really the same issue and, like
> me, without a solution.
> As I wrote in my summary, there is one combination of config.txt and
> barebox
> device tree booting into barebox console on uart1 and kernel console
> on uart1:
> 
> barebox device tree:
> 
> / {
>   chosen {
>      stdout-path = "&uart1";
>   };
>  };
> 
> &uart1 {
>         pinctrl-names = "default";
>         pinctrl-0 = <&uart1_gpio14>;
>         status = "okay";
>  };
> 
> &uart0 {
>      pinctrl-names = "default";
>      pinctrl-0 = <&uart0_gpio32>;
>      status = "okay";
>  };
> 
> 
> config.txt:
> kernel=barebox-raspberry-pi-cm3.img
> enable_uart=1
> 
> Unfortunately, in this case the content of /proc/cpuinfo in Linux
> is  wrong,
> which is in my opinion barebox bug.

According to [1], the serial number is directly read from the device
tree, this node is not populated by barebox. This leaves the following
possible options:

1) Fix the barebox NS16550 driver to probe on the rpi3 CM3 miniuart.
Then boot with the vc.dtb file.

2) Read the serial-number from the vc.dtb file and fixup the serial
number before booting with the barebox device tree

3) Find out if the RPI serial number can be read using the mailbox
communication interface to the VC core, retrieve the number and fix it
up into the device tree before boot. A quick google says this could be
the case, see [2].

[1]: 
https://elixir.bootlin.com/linux/latest/source/arch/arm/kernel/setup.c#L951
[2]: 
https://github.com/Terminus-IMRC/mailbox/blob/b96aa3cc8dfee2be2c8f835e09e812000910a5ff/src/wrap_ours.c#L114

Regards,
Rouven




More information about the barebox mailing list