Update notes from
previous post - install root file system on i.MX6 from Debian jessie distro and configure GL/GLES. Other people got this working a while before I did so it's mostly a matter of putting all various notes in order. To begin with, keeping links to a few references handy, some resources require registration on Freescale website (as of about 12/2015 will need to update links to NXP domain).
Setup root filesystem
This is for system boot from SD card - with the card already prepped i.e. partitioned, bootloader intsalled, ext4 fs, and mounted e.g.
/dev/sda. A suitable
debootstrap command to install base Debian root filesystem onto SD card might be:
sudo debootstrap jessie /media/sda1
On the SabreSD board, I have upgraded to
kernel imx_3.14.38_6qp_ga (link to
source snapshot tarballs) ... this kernel provides
Galcore version 5.0.11. To configure the kernel, I start with '
make imx_v7_defconfig', then make the following additions to
.config:
CONFIG_DRM=m
CONFIG_DRM_VIVANTE=m
CONFIG_FHANDLE=y
CONFIG_EXPORTFS=y
CONFIG_DEBUG_LL=y
CONFIG_DEBUG_IMX6Q_UART=y
CONFIG_EARLY_PRINTK=y
CONFIG_USB_SERIAL_PL2303=m # a Prolific USB serial port I'm using
Finish kernel installation to rfs:
cp arch/arm/boot/zImage arch/arm/boot/dts/imx6q-sabresd.dtb /boot/
echo vivante >> /mnt/sda/etc/modules
Install
udev rules configuration file for imx (allow group access to /dev/galcore):
cp 10.imx-rules /etc/udev/rules.d
Reboot, confirm modules loaded (vivante, drm):
dmesg | grep Galcore
[ 2.421028] Galcore version 5.0.11.33433
ls -l /dev/galcore
crw-rw---- 1 root video 199, 0 May 12 21:48 /dev/galcore
I
built patched .deb packages
for libdrm, mesa, xorg-server to incorporate a
critical patch from
Freescale for the i.MX6. The idea is that only the packages affected by
xfor86drm.h are locally built, and the rest installed from Debian distribution as normal. (Run grep across sources of libdrm, mesa, and xorg-server to see affected files). I'm sure there are more elegant strategies to finesse the local built packages onto the system, but here is a series of commands below demonstrate one attempt to install distribution packages along with local built
.debs in the right order to meet package dependencies. Note -provide simple compile link test for DRM_CAS defined for arm in running system as well as build environments). Also note latest versions, at this time running X.org X Server 1.16.4 - which seems to work perfectly well without any noticeable incompatibilies (refer to comments regarding Vivante EXA driver below and ignore any instructions on my old blogs to pin the distribution to any previous iteration of
snapshot.debian.org).
Create entries in
/etc/apt/preferences.d to make apt respect locally built/installed packages e.g. essentially enumerating all the local
debuilded .deb packages:
sabrehd@sabresd:~$ find /etc/apt/preferences.d/
/etc/apt/preferences.d/
/etc/apt/preferences.d/libdrm
/etc/apt/preferences.d/xorg-server
/etc/apt/preferences.d/mesa
Versions of local packages built installed with dpkg and packages apt-getted are all as downloaded from
http://ftp.us.debian.org/debian at the time this system was built and indicated in commands below. To being with, all can be installed from libdrm even though the drm drivers installed have nothing to do with the arm architecture but are harmless and still needed by other modules on the sytem anyway ...
dpkg -i `ls libdrm/*\.deb` is of course one way to do it or you could try:
dpkg -i ./libdrm-freedreno1_2.4.58-2_armhf.deb libdrm-nouveau2_2.4.58-2_armhf.deb libdrm-radeon1_2.4.58-2_armhf.deb libdrm2_2.4.58-2_armhf.deb
At the end there should be a nice xfce4 desktop (a little script might be nice here):
apt-get install libllvm3.5 libexpat1 libelf1
dpkg -i mesa/libgl1-mesa-dri_10.3.2-1+deb8u1_armhf.deb
apt-get
install x11-common libxaw7 libxkbfile1 libxt6 libepoxy0 libpciaccess0
libpixman-1-0 libxfont1 libxshmfence1 xkb-data x11-xkb-utils
dpkg -i xorg-server/xserver-common_1.16.4-1_all.deb
apt-get
install keyboard-configuration libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0
libxcb-glx0 libxcb-present0 libxcb-sync1 libxdamage1 libxfixes3
libxxf86vm1 libxcb-render0 libxcb-shape0 libxcb-xfixes0
libwayland-client0 libwayland-server0
dpkg -i mesa/libglapi-mesa_10.3.2-1+deb8u1_armhf.deb
dpkg -i mesa/libgbm1_10.3.2-1+deb8u1_armhf.deb
dpkg -i mesa/libgl1-mesa-glx_10.3.2-1+deb8u1_armhf.deb
dpkg -i mesa/libegl1-mesa_10.3.2-1+deb8u1_armhf.deb
dpkg -i ./xorg-server/xserver-xorg-core_1.16.4-1_armhf.deb
apt-get install xserver-xorg-video-fbdev xserver-xorg xinit
apt-get install xfce4
It should be possible to
startx at this point. However there are more dev packages to be installed as the EXA driver for Vivante GPU is also going to be native-built on this system farther below - it's not necessary to native build it (I just don't bother setting up cross-tools), but it must be built I think against the version of X.org release intending to run on the rfs.
apt-get install libpixman-1-dev x11proto-core-dev x11proto-input-dev x11proto-xext-dev x11proto-video-dev x11proto-randr-dev x11proto-render-dev x11proto-dri2-dev x11proto-gl-dev
apt-get install x11proto-fonts-dev x11proto-xinerama-dev x11proto-kb-dev x11proto-xf86dri-dev x11proto-resource-dev x11proto-scrnsaver-dev x11proto-xf86bigfont-dev x11proto-dri3-dev x11proto-present-dev
apt-get install libxkbfile-dev libpciaccess-dev
dpkg -i ./mesa/mesa-common-dev_10.3.2-1+deb8u1_armhf.deb
dpkg -i xorg-server/xserver-xorg-dev_1.16.4-1_armhf.deb
Here is the origin of most of the complexity of this system! Note the locations of packages to installed from the
FSL Community BSP which can also slightly more conveniently be download directly from yocto project:
http://downloads.yoctoproject.org/mirror/sources/
http://downloads.yoctoproject.org/mirror/sources/xserver-xorg-video-imx-viv-5.0.11.p7.1.tar.gz
http://downloads.yoctoproject.org/mirror/sources/imx-gpu-viv-5.0.11.p7.1-hfp.bin
xserver-xorg-video-imx-viv is source code of Vivante EXA driver (build steps to follow in sections below).
imx-gpu-viv is Freescale's implementation of GL/GLES associated runtime libraries and development headers and more or less takes the place of any existing libdrm and mesa implementations on the system - therefore it is likely that installed versions of some of these libs and header files are already on the system. Note that Debian the package management system already installs libGL*
and friends to
/usr/lib/arm-linux-gnueabihf/, while
imx-gpu-viv will wind up in base of /usr/lib which as higher search precedence with
ldconfig (the distro versions are not removed).
I used tar to create an archive of
imx-gpu-viv-5.0.11.p7.1-hfp/gpu-core/usr/ and to extract the contents over the
/usr/ filesystem e.g. resulting in
/usr/lib/libGL.so etc. The updated header files are found in
/usr/include/GL (should not have any mesa dev packages installed from the distro).
Explanation for the sym-linking scheme, which is done as a way to switch between X11, Wayland or framebuffer versions of the libraries, seems to have been dropped from recent versions of the documentation (
i.MX 6Dual/6Quad Linux Reference Manual, Rev. L3.0.35_4.1.0 page 81) but most people in i.MX6 land seem to already be aware of it by now.
On X11 systems, the symbolic links to these libraries need to be redirected. This can be
done using the following sequence of commands:
> cd /usr/lib
> sudo ln -s libGAL-x11.so libGAL.so
> sudo ln -s libEGL-x11.so libEGL.so
> sudo ln -s libEGL-x11.so libEGL.so.1
> sudo ln -s libVIVANTE-x11.so libVIVANTE.so
On directFB backend, the symbolic links to these libraries need to be redirected. This can
be done using the following sequence of commands:
> cd /usr/lib
> sudo ln -s libGAL-dfb.so libGAL.so
> sudo ln -s libEGL-dfb.so libEGL.so
> sudo ln -s libEGL-dfb.so libEGL.so.1
> sudo ln -s libVIVANTE-dfb.so libVIVANTE.so
Note dpkg apt and company have an annoying habit of completing package installs with an invocation of ldconfig which clobbers the links (
"sbin/ldconfig.real: /usr/lib/libOpenVG.so is not a symbolic link").
By changing the sim links it should be possible to run some demos on the framebuffer display (
imx-gpu-viv-5.0.11.p7.1-hfp/gpu-demos/opt/viv_samples/vdk/) . It is in fact possible to run these in a
chroot environment - be sure to use
mount -o bind to setup
/dev /proc etc. and also, permission 660 on
/dev/galcore as mentioned previously allows non-root access to device for owning group (video).
xserver-xorg-video-imx-viv provides the Vivante EXA driver as source code - it must be built against the version of X.org release intending to run on the rfs, and in addition depends on Freescsale's version of libraries and system headers from
imx-gpu-viv-5.0.11.p7.1-hfp.bin. The following compile line should work and some additional notes may be useful for troubleshooting problems:
./fastbuild.sh XSERVER_GREATER_THAN_13=1 BUILD_HARD_VFP=1 BUSID_HAS_NUMBER=1
So what could go wrong?
No such file or directory
#include "xorg-server.h" ... this is fixed by installing xserver-xorg-dev (installed from local built .deb) ... note this and other references may need to be modified to
#include "xorg/xorg-server.h".
One compile problem that may be encountered in
xserver-xorg-video-imx-viv-5.0.11.p7.1.tar.gz is path to
drm.h ... easily corrected in
EXA/src/makefile.linux i.e.
/usr/include/libdrm/drm.h
Previous versions of
xserver-xorg-video-imx tended to have many more compile problems when built against newer versions of X.org, e.g. as shown in the notes below in case the information is useful to anybody. In fact any failures building DRI_1.10.4 can probably be ignored, as this is probably by now already provided by X.org server and is no longer distributed with 5.0.11 series (fastbuild may still try to build it and errors out).
gcc -mfpu=vfp -mfloat-abi=hard -fvisibility=hidden -fPIC -DPIC -I. -I.. -I//usr/include -I//usr/include/xorg -I//usr/include/pixman-1 -I../../EXA/src/vivante_gal -march=armv7-a -marm -o dri.o -c dri.c
dri.c:42:18: fatal error: xf86.h: No such file or directory
#include "xf86.h"
(Also may need to be changed to
"xorg/xf86.h")
makefile.linux:71: recipe for target 'dri.o' failed
DRI_1.10.4/src/drm.h
from dri.c:52:
./drm.h:620:26: fatal error: drm/drm_mode.h: No such file or directory
If you got through all that then finally, install the driver,
configure X.org server:
cp src/xserver-xorg-video-imx-viv-3.10.31-1.1.0-beta/EXA/src/vivante_drv.so /usr/lib/xorg/modules/drivers/
cp Download/sys/xorg.conf /usr/share/X11/xorg.conf.d/
... and then hopefully enjoy a successful startx moment:
$ grep VIVANTE: /var/log/Xorg.0.log
[ 188.626] (II) VIVANTE: driver for vivante fb: VivanteGC500, VivanteGC2100,
sabrehd@sabresd:~/Downloads$
For bonus points, debuild and install mesa-utils and maybe at least one prerequisite:
sudo dpkg -i mesa/libgles2-mesa_10.3.2-1+deb8u1_armhf.deb
sudo dpkg -i mesa-utils/mesa-utils-extra_8.2.0-1_armhf.deb
Enjoy!