2010年3月30日 星期二

建立一個簡單的distribution for arm

在開始前,先大約介紹一下有用到的東西,
bootloader: redboot
kernel: 2.6.31 ltib for imx51
rootfs: emdebian or ubuntu rootstock
board: freescale imx51


1. 先編kernel。這裡是用freescale 對於這塊板子提供的其中一個工貝,叫ltib。可以想像它就像是LFS寫成一個shell script,幫你從頭到尾建立kernel及roorfs,省去cross compiler的時間。比較重要的是這個ltib是由freescale 所提供的,所以裡面有板子的BSP,及kernel的patch,不然ltib其實是個open project。
***這包ltib在freescale的文件中說,要在Ubuntu 9.04下執行,才能正常work!!!!***
1. Download package L2.6.31_09.12.00_SDK_source.tar.gz
2. tar xvf L2.6.31_09.12.00_SDK_source.tar.gz
3. cd L2.6.31_09.12.00_SDK_source
4. ./install
5. cd ltib
6. ./ltib -m config
7. 等一段時間......
8. 會出現一個要你選rootfs的畫面,選min profile就好(因為它很小,省時間,重點是最後根本不需要..)
9. 再東選選西選選,重點要選目前用的板子,imx51_babbage
10. ./ltib
11.等一段時間......
12.中間會出現kernel的menuconfig,選你要的drivers吧
13.選完後,再等一下,就會在目前的資料夾產生一堆東西
14.重要的兩個,分別是roofs 資料夾(rootfs/boot/zImage<--kernel),及rpm 資料夾(rpm/BUILD/linux-2.6.31<--kernel source tree and some modules)


2. 燒寫bootloader 及kernel
1. bootloader。在這裡是用redboot,你也可以用uboot,但在freescale 的教學文件中都是用redboot。
1. Download package L2.6.31_09.12.00_SDK_images_MX51.tar.bz2
2. tar xvf L2.6.31_09.12.00_SDK_images_MX51.tar.bz2
3. cd L2.6.31_09.12.00_SDK_images_MX51
4. tar xvf redboot_200952.tar.bz2
5. cd redboot_200952/bin
6. dd if=mx51_babbage_redboot.bin of=/dev/sdb && sync && sync (假設SD卡為 /dev/sdb)
7. cd $ur_ltib_location/ltib/rootfs/boot/
8. dd if=zImage of=/dev/sdb bs=512 seek=2048 && sync && sync

2. 分割SD磁區。這裡是要將kernel跟rootfs分開。
1. fdisk /dev/sdb
The number of cylinders for this disk is set to 8491.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): u
Changing display/entry units to sectors
Command (m for help): d
Selected partition 1
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First sector (48-7744511, default 48): 8192
Last sector or +size or +sizeM or +sizeK (8192-7744511, default 7744511):

Using default value 7744511
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or
resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.

2. umount /dev/sdb1
3. mkfs.ext3 /dev/sdb1


所以,/dev/sdb1巳經被格式化為ext3,等著後面要做的rootfs,做好的rootfs,就可以放到這裡來。
且SD卡前面的4M,存放著bootload及kernel。

理論上來說,這張SD卡巳經可以開機,只需要設定一下redboot的參數,
開機時,趕按 ctrl+C,進⼊bootloader
RedBoot> fis init
RedBoot> fis create -n -b 0x100000 -f 0x100000 -l 0x300000 kernel
RedBoot> fconfig
Run script at boot: true
Boot script:
Enter script, terminate with empty line
>> fis load kernel
>> exec –c “noinitrd console=tty1 console=ttymxc0, 115200 root=/dev/mmcblk0p1 rw video=mxcfb:800x600-16@60”
>>
Boot script timeout (1000ms resolution): 1
Use BOOTP for network configuration: true
Default server IP address: 192.168.0.1
Board specifics: 0
Console baud rate: 115200
Set eth0 network hardware address [MAC]: false
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration - continue (y/n)? y
... Read from 0x07ee0000-0x07eff000 at 0xeff80000: .
... Erase from 0xeff80000-0xeffa0000: .
... Program from 0x07ee0000-0x07f00000 at 0xeff80000: .
RedBoot>


重啟電腦,但一定會出現kernel panic,因為這時還沒有rootfs啊。

2010年3月17日 星期三

Qt embedded porting

這次是要將 QT proting到 freescale的板子上,大約列一下所用到的硬體及環境
1.Host: x86 with fedora 11
2.Target: freescale imx51 with ubuntu for arm
3.cross compiler tools: arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu
4.Qt: qt-everywhere-opensource-src-4.6.2


網路上有很多資源,不過其中我試的是這位Simon大大的教學文章
http://zylix666.blogspot.com/2008/10/qt-embedded-porting-on-arm-platform.html

但在這之前,還有些設定要做,下列是我的作法及步驟
###先安裝cross compiler tools及設定好環境
1. 將下載下來的 arm-none-linux-gnueabi解壓縮
$ tar -xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
2. 將其中的bin設定到$PATH當中
$ export PATH="$PATH":/home/sam/Download/arm/arm2009q3/bin
又或者想要一開terminal就載入環境變數
在~/.bashrc裡加入
$ export PATH="$PATH":/home/sam/Download/arm/arm2009q3/bin

3. 這時候在terminal直接打arm-none-linux,TAB兩下,如果有顯示出所有arm-linux-none- 相關執行檔,這樣表示環境變數設定成功

###開始安裝Qt embedded及設定
接下來的步驟,幾乎跟Simon大大的步驟一樣
1. 將下載下來的Qt embedded package解壓縮
$ tar -xvf qt-everywhere-opensource-src-4.6.2.tar.gz
2. 修改mkspecs/qws/linux-arm-g++/qmake.conf內的編譯器設定,將其設為目前所使用的tool chain
QMAKE_CC = arm-none-linux-gnueabi-gcc
QMAKE_CXX = arm-none-linux-gnueabi-g++
QMAKE_LINK = arm-none-linux-gnueabi-g++
QMAKE_LINK_SHLIB = arm-none-linux-gnueabi-g++
QMAKE_AR = arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = arm-none-linux-gnueabi-objcopy
QMAKE_STRIP = arm-none-linux-gnueabi-strip

3. 然後執行:
$ ./configure -embedded arm -qt-zlib -qt-libpng -qt-gif -qt-libtiff -qt-libmng -qt-libjpeg -qt-freetype -no-openssl
$ make
$ make install

4. 安裝完,預設會安裝到/usr/local/下,會在這裡看到一個Trolltech的資料夾,會有一個QtEmbedded-4.6.2-arm,所有的需要的都在這裡
5. 將剛才編譯好的QtEmbedded-4.6.2-arm,上傳至target board上的root file system。並且放在/usr/local/Trolltech下,Trolltech資料夾在target board上要自己建
$ mkdir /usr/local/Trolltech
6. 要執行範例程式之前,先設定好環境參數:
$ export QTDIR=/usr/local/Trolltech/QtEmbedded-4.6.2-arm
$ export PATH=$QTDIR/bin:$PATH
$ export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

7. 可在/usr/local /Trolltech/QtEmbedded-4.4.3-arm/example 或者是demos內找到一些可執行的範例
8. ***重點來了***,由於對方沒有給touch screen,所以我沒有編touch的driver, 也就是tslib for arm,取而代之,是用電腦的mouse及keyboard,但在執行Qt embedded的範例時,mouse及keyboard都不會動,花了很多時間找,網路都是用tslib,也就是有touch screen的硬體,所以需要下列方式解決:
$ QWS_MOUSE_PROTO=/dev/input/mice
$ QWS_KEYBOARD=/dev/tty0

9. ***執行範例,還是不會動***,看了營幕顯示的訊息表示,
'/dev/input/mice' permission deny
'/dev/tty0' permission deny

所以改了這兩的權限
$ chmod 777 /dev/input/mice
$ chmod 777 /dev/tty0

10. 這樣就可以動了,挑個範例試試
$ /usr/local/Trolltech/QtEmbedded-4.6.2-arm/demos/browser/browser -qws
注意要加上-qws這個flag

###編譯自己寫的程式且port到板子上
如果自己有寫個Qt的程式,假設程式是放在,/usr/local/Trolltech/QtEmbedded-4.6.2-arm/examples/Hello底下,想port到板子上,用下面的方法:
$ /usr/local/Trolltech/QtEmbedded-4.6.2-arm/bin/qmake -spec ../../mkspecs/qws/linux-arm-g++ -unix -o Makefile Hello.pro
此時在同個目錄會產生一個Makefile檔,再執行
$ make
就會編譯出一個Hello的binary file for arm,仔細一看,確實是ARM的執行檔
$ file ./Hello
$ Hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped

之後,就可以將這個執行檔搬到板子上了,且順利執行!

其中,板子上是安裝ubuntu 9.10 for arm 的版本,網路上下載的到,而且還是針對
freescale imx51這槐板子所做的,功能該有的都有,但由於desktop是用Gnome,對於
板子來說太肥,跑的不順,所以改裝LXDE,順多了…
sudo apt-get install lxde
本來是要調更多有關板子效能的問題,例如快速開機,或是砍掉多餘的service等,
但時間不多,所以只改了desktop的部份。