Mini UART on RaspberryPi CM3/CM3+

Robert Carnecky (Neopsis) robert at neopsis.com
Wed Oct 21 04:21:43 EDT 2020


On Tue, Oct 20, 2020 at 7:04 PM Robert Carnecky (Neopsis)
<robert at neopsis.com> wrote:
>
> On Tue, Oct 20, 2020 at 2:45 PM Rouven Czerwinski
> <r.czerwinski at pengutronix.de> wrote:
> >
> > 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
> >
>
>
>   OK, I did not know that barebox do not populate the serial number.
> I will do it in my app from the mailbox.
>
> FYI I found various ways how to read the S/N here
>
> https://github.com/AndrewFromMelbourne/raspi_serialnumber
>
> Robert

I can confirm, that this piece of code returns the right serial
number. Now I have the barebox and Linux
console on uart1/ttyS0 and the application can use uart0/ttyAMA0.
Thank you for your help.

uint32_t get_serial_number() {

int fd = open("/dev/vcio", 0);
    if (fd == -1)
    {
        log_error("open /dev/vcio");
        exit(EXIT_FAILURE);
    }

    uint32_t property[32] =
    {
        0x00000000,
        0x00000000,
        0x00010004,
        0x00000010,
        0x00000000,
        0x00000000,
        0x00000000,
        0x00000000,
        0x00000000,
        0x00000000
    };

    property[0] = 10 * sizeof(property[0]);

    if (ioctl(fd, _IOWR(100, 0, char *), property) == -1)
    {
        log_error("ioctl");
        exit(EXIT_FAILURE);
    }

    close(fd);

    return  property[5];
}



More information about the barebox mailing list