构建ARM Linux系统实践
- Cross Tool
http://www.kegel.com/crosstool/
下载交叉编译环境的脚本,修改 demo-arm9tdmi.sh 文件,并执行即可在设定的目录产生全套的 交叉编译环境。
demo-arm9tdmi.sh 支持的选项有 —nounpack , --nobuild , --testlinux , --gdb , --notest 。
Note :脚本运行是可能存在的两个问题: 1) 本地 gcc 版本检测(不支持高于 4.1 的 gcc ,需要修改 Configure 文件,或做 gcc 到低版本的链接); 2 ) Makefile 生成的某个 .h 文件存在问题(记不清具体文件,双引号换行导致的编译错误,修改 Makefile ,添加两个 // 或去掉 //n )。
ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain/
http://www.handhelds.org/download/projects/toolchain/
下载解压即可
- Kernel
http://www.kernel.org/pub/linux/kernel
下载相应的内核
http://maxim.org.za/at91_26.html
下载补丁,支持 SAM9261-EK 板子
修改 /arch/arm/mach-at91rm9200/board-sam9261ek.c 文件
+.left_margin = 48, .right_margin = 16,
+.upper_margin = 31, .lower_margin = 12,
+.hsync_len = 96, .vsync_len = 2,
-.left_margin = 1, .right_margin = 33,
-.upper_margin = 1, .lower_margin = 0,
-.hsync_len = 5, .vsync_len = 1,
建立 make_arm 的脚本,将下面一句话写入,编译内核时,执行 ./make_arm 即可。
make V=1 ARCH=arm CROSS_COMPILE=/opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu- $@
./make_arm menuconfig -- 配置内核。具体配置参照相关资料
./make_arm -- 编译内核,产生压缩的内核映象
./make_arm uImage -- 产生 Uboot 启动的内核映象
- Rootfs
使用 busybox 构建根文件系统
http://www.busybox.net/downloads/
修改 Makefile 如下:
1) ARCH ?= arm
2) CROSS_COMPILE ?= /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
make menuonfig; make;make install
编译时可能存在错误,简单的方法是将对应的命令或选项在配置时屏蔽。
Note :选中 Installation Options 的 Don't use /usr Applets links ...
将 /_install 目录下的 bin , sbin 目录拷贝到要建立的根文件系统目录下,然后建立 dev , etc , lib , proc , sys , tmp 等目 录。
1) 在 dev 目录下执行以下命令:
l sudo mknod -m 666 ttyS0 c 4 64
l sudo chown ruanyu ttyS0
l sudo chgrp ruanyu ttyS0
l ln -s ttyS0 console
2) 拷贝动态链接库
l /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib 拷贝到根文件系统下的 lib 目录
l 以后编译的其他库文件都拷贝到该目录
Note :如果库文件比较大,可以有 strip 将符号表剥离
3) 配置文件
l passwd
root::0:0:root:/:/bin/sh
l group
root:*:0:
l inittab
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
tty0::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
l fstab
proc /proc proc default 0 0
sysfs /sys sysfs default 0 0
#/dev/mtdblock/2 /mnt/app jffs2 default 0 0
l profile
HOME=/
PATH=/bin:/sbin:/usr/bin
l init.d/rcS
#!/bin/sh
/bin/mount -a
/bin/mount -t tmpfs tmpfs /dev
/sbin/udevd --daemon
/sbin/udevstart
ln -s /dev/vc/0 /dev/tty0
ln -s /dev/vc/1 /dev/tty1
ln -s /dev/vc/2 /dev/tty2
ln -s /dev/vc/3 /dev/tty3
/bin/mkdir /dev/pts
/bin/mount -t devpts devpts /dev/pts
/sbin/ifconfig lo 127.0.0.1 up
/sbin/ifconfig eth0 10.19.5.244 netmask 255.255.0.0 up
/sbin/route add default gw 10.19.5.1
/sbin/telnetd -l /bin/login
l resolv.conf
nameserver 202.102.152.3
l protocols -- 拷贝即可
l services - 拷贝即可
最后,创建 jffs2 跟文件系统:
mkfs.jffs2 -r root-fs-base/ -o rootfs.img -e 0x20000 -n
创建 cramfs 或 yaffs 的方法大致相同。
根文件系统的创建是个比较繁琐的过程,按此过程应该可以顺利地创建基本的根文件系统。
- Udev
修改 Makefile 如下:
CROSS_COMPILE ?= /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-
make
将 udevd 、 udevstart 、 udevadm 拷贝到 bin 目录下
在 etc 下添加文件 /udev/rules.d/udev.rules 以及 /udev/udev.conf
/udev/rules.d/udev.rules 如下:
# vc devices
KERNEL=="tty[0-9]*", NAME="vc/%n"
# block devices
KERNEL=="loop[0-9]*", NAME="loop/%n"
# mtd devices
KERNEL=="mtd[0-9]*", NAME="mtd/%n"
KERNEL=="mtdblock[0-9]*", NAME="mtdblock/%n"
# input devices
KERNEL=="mice" NAME="input/%k"
KERNEL=="mouse[0-9]*", NAME="input/%k"
KERNEL=="ts[0-9]*", NAME="input/%k"
KERNEL=="event[0-9]*", NAME="input/%k"
# misc devices
KERNEL=="apm_bios", NAME="misc/%k"
KERNEL=="rtc", NAME="misc/%k"
BusyBox 中已经包含了 mdev ,简化的 udev ,此处可以不 用编译 udev 。
参见: http://hi.baidu.com/zengzhaonong/blog/item/b0895436d24c33dea2cc2b03.html
- Tslib
./autogen.sh
echo “ac_cv_func_malloc_0_nonnull=yes” > arm-linux.cache
./configure –host=arm-9tdmi-linux-gnu –cache-file=arm-linux.cache –prefix=/opt/tslib
make;make install
在目标机上设置以下环境变量:
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/input/ts0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/lib/ts
ts.conf 如下:
module_raw h3600
module pthres pmin=1
module variance delta=30
module dejitter delta=100
module linear
- Ipkg
- Qt
设置环境变量:
export QTEDIR=/home/ruanyu/Desktop/app/qt/qtopia-core-opensource-src-4.3.5
export QTDIR=$QTEDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
编译:
拷贝 /mkspecs/qws/linux-arm-g++ ,改成我们时候的编译器的名字 arm-9tdmi-linux- gnu ,修改 qmake.conf 文 件中编译器相关的内容。 QMAKE_CC , QMAKE_CXX , QMAKE_LINK , QMAKE_LINK_SHLIB , QMAKE_AR , QMAKE_RANLIB , QMAKE_STRIP
此外,若编译时报错( XXX 找不到), 可能还需要修改 io.pri 和 embedded.pri 两个文 件,将 linux 要编译的 文件直接 加入 SOURCE 中(编译 器名称不匹配引起的,导致部分文件没有编译,链接时找不到符号)。
./configure -release -prefix /usr/qt-core -no-qvfb -no-qt3support -qt-gfx-linuxfb -xplatform qws/arm-9tdmi-linux- gnu -embedded arm -depths 4,8,16,24,32 -fast -confirm-license
make;make install
Note :目标机 fonts 目录与编译 时的安装目录一致。不知道是否有环境变量进行设置?
- DirectFB
依赖: zlib , freetype , libpng , jpeg-6b , DirectFB , DirectFB-example
zlib
CC=arm-9tdmi-linux-gnu-gcc AR="arm-9tdmi-linux-gnu-ar rc" ./configure --prefix=/usr/gtk --shared
make;make install
freetype
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu
make:make install
libpng
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu CFLAGS="-I$PREFIX/include" LDFLAGS="-L$PREFIX/lib"
make;make install
libjpeg
修改 configure 文件。编 出动态链接库,需要 configure 时添加 —enable-shared 选项,会导致 ltonfig 出错。在 configure 中查找 ltconfig ,行后添加 host 即可(网上 没有 jpeg 的解决办 法,读脚本中找到的。但在编 DFB 时仍然无法找到动态链接库)。
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=$PREFIX --host=arm-9tdmi-linux-gnu –build=i686-pc-linux- gnu --exec-prefix=$PREFIX --enable-shared
make CC=arm-9tdmi-linux-gnu-gcc CXX=arm-9tdmi-linux-gnu-g++ AR="arm-9tdmi-linux-gnu-ar rc" STRIP=arm-9tdmi-linux-gnu-strip LD=arm-9tdmi-linux-gnu-ld RANLIB=arm-9tdmi-linux-gnu-ranlib
make install;make install-lib;make install-headers
DFB
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu CFLAGS="-I/usr/gtk/ include" LDFLAGS="-L/usr/gtk/lib" CPPFLAGS="-I/usr/gtk/include" --disable-x11 --enable-debug –disable- voodoo --disable-mmx --disable-see --disable-sdl --enable-jpeg --enable-png --disable-gif --enable-freetype --disable-video4linux --disable-video4linux2 --with-gfxdrivers=none --with-tests
make; make install
DFB-eg
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu
make;make install
Note :目标机上的 /directfb-1.2-0 位置与编 译安装时的 /usr/gtk/lib/directfb-1.2-0 相一致; /irectfb-examples 位 置与编译安装时的 /usr/gtk/share/irectfb-examples 相一致。
Note :配置文件 directfbrc
Note : DFB 早期的版本 不能自适应 frame buffer 。 example 与 DFB 也是有对应关系的。
- Gtk+DFB
依赖: zlib , freetype , libpng , jpeg-6b , DirectFB , glib , atk , libxml2 , fontconfig , cario , pango , gtk+
glib
在 configure 中找到 “cannot run test program while cross compiling” 与 “cross-compiling” ,并把各 自所在行的下 方的 “{ (exit 1); exit 1; };” 去掉。
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu
make;make install
atk
修改 MakeFile 中的 glib_genmarshal --> /usr/bin/glib_genmarshal
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu --disable-glibtest
make;make install
libxml2
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu --without-debug --disable-static
make;make install
fontconfig
CC=arm-9tdmi-linux-gnu-gcc ./configure --prefix=/usr/gtk --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu --with-freetype-config=$PREFIX/bin/freetype-config --disable-static --with-confdir=$PREFIX/etc/fonts –enable- libxml2 --with-arch=arm
make;make install
cario
CC=arm-9tdmi-linux-gnu-gcc ./configure --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu -- prefix=$PREFIX --disable-xlib --enable-ps=yes --enable-png=yes --enable-directfb --disable-win32 --without-x --enable-freetype=yes --enable-pdf=yes --enable-svg=yes LDFLAGS="-L$PREFIX/lib" CFLAGS="- I$PREFIX/include"
make;make install
cairo.pc 的 Libs 添加: -lfreetype -lfontconfig -ldirectfb -lz -ldirect -lpng12 -lxml2 -lfusion
pango
CC=arm-9tdmi-linux-gnu-gcc ./configure --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu -- prefix=$PREFIX --without-x LDFLAGS="-L$PREFIX/lib" CFLAGS="-I$PREFIX/include" –enable-pangocairo
make;make install
pango.pc 的 Libs 添加: -lglib-2.0 -lgmodule-2.0 -lgobject-2.0
pangocairo.pc 的 Libs 添加: -lpangoft2-1.0
gtk+
拷贝 zconf.h 和 zlib.h 到 /usr/gtk/include/libpng12/
GLIB_GENMARSHAL=/usr/bin/glib-genmarshal PKG_CONFIG=/usr/bin/pkg-config CC=arm-9tdmi-linux-gnu- gcc ./configure --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu --prefix=$PREFIX –with- gdktarget=directfb --without-libtiff --disable-glibtest --disable-largefile --without-libjpeg LDFLAGS="- L$PREFIX/lib" CFLAGS="-I$PREFIX/include"
make;make install
Note :目标板上一下路径与编译安装是一致。
/usr/gtk/lib/directfb-1.2-0
/usr/gtk/lib/gtk-2.0
/usr/gtk/lib/pango
Note :执行以下命令
gdk-pixbuf-query-loaders >/usr/gtk/etc/gdk_pixbuf.loaders
pango-querymodules >/usr/gtk/etc/pango.modules
Note :拷贝字体文件到 /usr/share/fonts ,路径由 fonts.conf 指定
- Python
参照一下方法可以顺利完成 Python 的交叉编译
http://wiki.woodpecker.org.cn/moin/Cross_Compile_Python_2.5.2_For_ARM
目标板上设置环境变量
export PYTHONHOME=/usr/lib/python2.5
export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
export PATH=$PATH:$PYTHONHOME:$PYTHONPATH
- Gnash
依赖: zlib , libpng , freetype , libjpeg , libxml2 , libcurl , ffmpeg(O) , DirectFB , SDL , boost , agg , glib ,
check , gstreamer , gnash
libcurl
./configure --prefix=/opt/gnash --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu --without-ssl –with- zlib=/opt/gnash/lib
make;make install
SDL
./configure --prefix=/opt/gnash --host=arm-9tdmi-linux-gnu --enable-video-fbcon --disable-video-x11 –disable- dga --disable-esd CFLAGS="-I/opt/gnash/include" LDFLAGS="-L/opt/gnash/lib" CPPFLAGS="- I/opt/gnash/include"
make;make install
boost
ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-g++ g++
ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-ar ar
ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-ranlib ranlib
ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-as as
ln -s /opt/crosstool/gcc-4.1.0-glibc-2.3.2/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-ld ld
export PATH=.:$PATH
bjam --prefix=/opt/gnash --toolset=gcc install
agg
修改 Makefile.in.Linux
AGGLIBS= -lagg -lSDL
AGGCXXFLAGS = -O3 -I/opt/gnash/include/SDL -L/opt/gnash/lib
CXX = arm-9tdmi-linux-gnu-g++
C = arm-9tdmi-linux-gnu-gcc
#CXX = icc
LIB = arm-9tdmi-linux-gnu-ar cr
make
check
echo "ac_cv_func_malloc_0_nonnull=yes" > arm-linux.cache
echo "ac_cv_func_realloc_0_nonnull=yes" >> arm-linux.cahce
./configure --prefix=/opt/gnash --host=arm-9tdmi-linux-gnu –build=i686-pc-linux-gnu –cache-file=arm- linux.cache
make;make install
gstreamer
修改 configure , check 相关
./configure --prefix=/opt/gnash --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu CFLAGS="- I/opt/gnash/include" LDFLAGS="-L/opt/gnash/lib" –disable-tests
make;make install
gnash
修改 configure , CURL_LIBS="${ac_cv_path_curl_lib} -lcurl"
./configure --prefix=/opt/gnash --host=arm-9tdmi-linux-gnu --build=i686-pc-linux-gnu --disable-plugin –disable- debugger --disable-glext --disable-klash --disable-cygnal --disable-menus --disable-rpath --disable- docbook --disable-shared --enable-static --enable-gui=sdl --enable-renderer=agg –with-agg- incl=/home/ruanyu/Desktop/gnash/agg-2.5/include --with-agg-lib=/home/ruanyu/Desktop/gnash/agg-2.5/src --with-libxml-incl=/opt/gnash/include/libxml2 --with-libxml-lib=/opt/gnash/lib –with-sdl-incl=/opt/gnash/include/ SDL/ --with-sdl-lib=/opt/gnash/lib –with-boost- incl=/home/ruanyu/Desktop/gnash/boost-1.34.1/install/include/boost-1_34_1 –with-boost- lib=/home/ruanyu/Desktop/gnash/boost-1.34.1/install/lib --with-zlib-lib=/opt/gnash/lib –with-zlib- incl=/opt/gnash/include --with-curl-lib=/opt/gnash/lib --with-curl-incl=/opt/gnash/include –with-jpeg-lib=/opt/ gnash/lib --with-jpeg-incl=/opt/gnash/include --with-png-incl=/opt/gnash/include/libpng12 –with-png-lib=/opt/ gnash/lib --with-gstreamer-incl=/opt/gnash/include/gstreamer-0.10 --with-gstreamer-lib=/opt/gnash/lib –with-glib- lib=/opt/gnash/lib –with-glib-incl=/opt/gnash/include/glib-2.0
make;make install
Note : boost 的版本 (建议使用 1.34.1 )
Note : boost 编译出的 库比较多,但 gnash 仅使用 三个,如下:
libboost_serialization-gcc41-1_34_1.so.1.34.1
libboost_date_time-gcc41-1_34_1.so.1.34.1
libboost_thread-gcc41-mt-1_34_1.so.1.34.1
Note :将 /opt/gnash 目录下 /include 中的 glib 的头文 件,拷贝到 gstreamer 中
- Bluez
依赖: glib , expat , dbus , bluez
expat
./configure --prefix=/home/ruanyu/Desktop/app/arm-bluez –host=arm-9tdmi-linux-gnu
make;make install
d-bus
修改 configure ,去掉 pie 有关的选项
echo ac_cv_have_abstract_sockets=yes>arm-linux.cache
./configure --prefix=/home/ruanyu/Desktop/app/arm-bluez --host=arm-9tdmi-linux-gnu –cache-file=arm- linux.cache CFLAGS="-I/home/ruanyu/Desktop/app/arm-bluez/include" LDFLAGS="- L/home/ruanyu/Desktop/app/arm-bluez/lib" --with-xml=expat –with-x=no
make;make install
bluez
./configure --prefix=/home/ruanyu/Desktop/app/arm-bluez --host=arm-9tdmi-linux-gnu CFLAGS="- I/home/ruanyu/Desktop/app/arm-bluez/include" LDFLAGS="-L/home/ruanyu/Desktop/app/arm-bluez/lib" --disable-pie
make;make install
Note :目标板配置文件与安装目录相一致
Note : Dbus 需要 messagebus 的用户, 添加到 /etc/password 或 adduser 添加
Note : bluez 通信用的 Unix Socket 的目录为 /var/run/dbus 。可能需 要修改 system.conf 文件, 没有验证 。