Beagleboard X15 and LVDS

A project log for Transportable bench computer

An ARM open hardware computer in a briefcase

julienJulien 08/24/2017 at 21:280 Comments

The Beagleboard X15 is an incredible machine. The TI's AM5728 is a pretty amazing chip, it contains two 1.5Ghz Cortex-A15 ARM cores, two 750Mhz c66x DSP cores, four 200Mhz Cortex-M4 ARM cores, and f 200Mhz general purpose PRU. With that, there is two SGX544 3D GPU cores and one GC320 2D GPU core.

The board contains two gigabits ethernet ports, three USB-3.0 ports, one SATA, one HDMI, analog audio output and a lot more via four expansion ports (157 gpio ! see last page of X15 schematics). The AM5728 itself allow three video output, and the expansion port of the beagleboard exposes one that I used to interface with the display. There is no direct LVDS output on the board, but SN75LVDS83B can transmit RGB parallel signal to LVDS. The schematics is actually very simple : just read the datasheets and connect the lines. Add some passives and that's it (see ext1_x15.pdf) !
Since the video signal only takes 21 pins, I decided to exposes more to a standard 2,54mm header. I first added the power on signal, so I will be able to connect an external switch button. Then some others GPIO : if I read the AM57xx correctly, I will be able to use them to most usage : SPI, I2C, UART and PWM.

(fast forward, board ordered at OSHPark and components at Digikey, then everything put together)

After wiring LVDS pins between the expansion board and the OLIMEX breakout, it is time to test the software part. A proper DTS is needed for Beagleboard X15 linux drive the new screen :

lcd0: display {
        status = "okay";
        compatible = "", "panel-dpi";
        label = "lcd";
        pinctrl-names = "default";
        pinctrl-0 = <&lcd_pins>;

        enable-gpios = <&gpio4 7 GPIO_ACTIVE_HIGH>;

        panel-timing {
            clock-frequency = <69300000>;
            hactive = <1366>;
            vactive = <768>;
            hsync-len = <10>;
            hfront-porch = <8>;
            hback-porch = <78>;

            vsync-len = <1>;
            vfront-porch = <3>;
            vback-porch = <18>;

            hsync-active = <0>;
            vsync-active = <0>;
            de-active = <1>;
            pixelclk-active = <1>;
            /*syncclk-active = <0>;*/

    port {
        lcd_in: endpoint {
        remote-endpoint = <&dpi_out>;

Mainly, it is the specification of the LCD panel in a config file and I used one of the expansion GPIO as a enable pin. Beagleboard VOUT pins is needed as well (lcd_pins, see complete DTS in source repository)

Some backlight is nice two, so we can change the intensity of the panel's leds, I used another expansion GPIO for that :

backlight {
    status = "okay";
    compatible = "pwm-backlight";
    pwms = <&ehrpwm1 1 500000 0>;
    pwm-names = "LCD";

    /* Anything lower than 241 is no longer visible */
    brightness-levels = <0 30 55 60 75 100 200 240 255>;
    default-brightness-level = <8>;

Finally, this new screen will be the default one :
aliases {
        display0 = &lcd0;
        display1 = &hdmi0;

That's it, I used to easily recompile to DTB, then copy the compiled file to /boot and reboot linux.