Enabling Dual Display in Ubuntu with the i.MX53 Quick Start Board
Here you will learn how to enable two displays in a Ubuntu system running in an iMX53 Quick Start Board.
We assume here that you already have a micro SD card with a valid Ubuntu image (including uboot, Linux kernel and Ubuntu filesystem).
You can use the original SD card that comes with the i.MX53 Quick Start Board, which brings an image of Ubuntu or, if you do not have the original SD card, you can reproduce it by downloading Ubuntu binaries package (L2.6.35_MX53_ER_1101_IMAGE) from Freescale iMX53qsb download area. You will also need to update U-boot and kernel binaries in the SD card with more recent images. You can find the most recent binaries (L2.6.35_MX53_ER_1109_IMAGE_) from Freescale iMX53qsb download area as well.
To enable dual display, you need to perform two tasks:
- Enable two displays at kernel level
- Configure your Xorg server accordingly
Enabling Two Displays at Kernel Level
To enable two displays at kernel level means to map one display interface to fb0 device and the other to fb1 device. So first thing is to choose which interface will be the primary one, mapped as fb0. As an example, we consider the VGA interface as primary in this tutorial.
Second thing is to choose one of the other available external video interfaces to be secondary, mapped as fb1 device in the system. We consider the 4.3" seiko LCD display in this tutorial as the secondary interface.
Once chosen primary and secondary interfaces, we need to configure kernel video arguments accordingly. The arguments are available in specific variables in the U-boot that comes with the Ubuntu binaries. You can see them (HDMI, VGA, etc.) by printing the U-boot environment variables from the U-boot shell, but you will probably not find those variables in other versions of U-boot and their contents will probably need to be adapted to the kernel version in use, as arguments recognized by kernel modules varies considerably between kernel versions.
You can always refer to the Linux Release Notes documents for video arguments. It's available for each Linux BSP that can be found on the Freescale website. For the 1109 BSP, we have the following video arguments (extracted from i.MX53_START_Linux_BSP_Release_Note.pdf that comes with L2.6.35_11.09.01_ER_docs.tar.gz downloaded from here - IMX53_1109_LINUXDOCS_BUNDLE):
- VGA: video=mxcdi1fb:GBR24,VGA-XGA di1_primary vga
- SEIKO LCD: video=mxcdi0fb:RGB24,SEIKO-WVGA di0_primary
Both are considered primary, because these are the arguments for single display setups.
Now that we have video arguments for both desired interfaces, we only need to merge them together removing the primary argument from the one that is the secondary. In our case, we need to pass the following arguments to the kernel:
video=mxcdi1fb:GBR24,VGA-XGA di1_primary vga video=mxcdi0fb:RGB24,SEIKO-WVGA
For this, we can add these arguments to one of the variables that are used in the boot process. We can add the content to bootarg_base, for instance. In the U-boot command line, execute following commands to setup the environment:
setenv vga_and_seiko 'video=mxcdi1fb:GBR24,VGA-XGA di1_primary vga video=mxcdi0fb:RGB24,SEIKO-WVGA' setenv bootargs_base 'setenv bootargs console=ttymxc0,115200 vga_and_seiko' saveenv
After applying a reset and booting the board, you shall have both interfaces enabled, but the secondary will not be used by the Xorg server until we complete the next step.
Configuring Xorg Server
Now that we have two video interfaces properly configured and mapped to /dev/fb0 and /dev/fb1 devices, we need to tell Xorg server how to use them.
Here is an example of xorg.conf file that you can use to replace the default one, found at /etc/X11:
Section "InputDevice" Identifier "Generic Keyboard" Driver "kbd" Option "XkbRules" "xorg" Option "XkbModel" "pc105" Option "XkbLayout" "us" EndSection Section "InputDevice" Identifier "Configured Mouse" Driver "mouse" Option "CorePointer" EndSection Section "Device" Identifier "i.MX Accelerated Framebuffer Device 0" Driver "imx" Option "fbdev" "/dev/fb0" # This option only recognized when "mxc_epdc_fb" frame buffer driver in # use. Values are "RGB565" (default, 16-bit RGB), "Y8" (8-bit gray), # and "Y8INV" (8-bit gray inverted). Option "FormatEPDC" "Y8INV" EndSection Section "Device" Identifier "i.MX Accelerated Framebuffer Device 1" Driver "imx" Option "fbdev" "/dev/fb1" EndSection Section "Monitor" Identifier "Configured Monitor 0" EndSection Section "Monitor" Identifier "Configured Monitor 1" EndSection Section "Screen" Identifier "Screen 0" Monitor "Configured Monitor 0" Device "i.MX Accelerated Framebuffer Device 0" # These "Display" SubSection's are needed for working with the # "mxc_epdc_fb" frame buffer driver. SubSection "Display" Depth 8 Visual "StaticGray" EndSubSection SubSection "Display" Depth 16 Visual "TrueColor" EndSubSection EndSection Section "Screen" Identifier "Screen 1" Monitor "Configured Monitor 1" Device "i.MX Accelerated Framebuffer Device 1" EndSection Section "ServerLayout" Identifier "Xinerama Layout" Screen "Screen 0" Screen "Screen 1" RightOf "Screen 0" EndSection Section "ServerFlags" Option "Xinerama" "true" EndSection
The following picture shows the i.MX 53 QSB running the extended desktop previously configured.
You can see the VGA monitor with a Firefox instance and the SEIKO LCD display with a calc instance.