构建ARM Linux系统实践

构建ARM Linux系统实践

  1. 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/

                  下载解压即可

                 

  1. 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 启动的内核映象

 

  1. 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 的方法大致相同。

                 

                  根文件系统的创建是个比较繁琐的过程,按此过程应该可以顺利地创建基本的根文件系统。

 

  1. 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

 

  1. 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            

                 

  1. Ipkg

                 

                 

  1. 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 目录与编译 时的安装目录一致。不知道是否有环境变量进行设置?

                 

  1. 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 也是有对应关系的。

 

  1. 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 指定

                 

  1. 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

                 

  1. 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

 

  1. 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 文件, 没有验证

              

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值