2010年7月8日 星期四

製作ARM9的Bootstrap Root Filesystem

JollenRoot Filesystem置技術系列》

製作ARM9Bootstrap Root Filesystem

作者/陳俊宏

http://www.jollen.org

引用自:http://www.jollen.org/cgi-bin/mt3/mt-tb.cgi/339

更新日期:2007/1/23

在「完整註明出處」的前提下(註明方式說明),您能立即擁有轉貼與引用的授權,且毋需知會作者。

目的

製作 bootstrap root filesystembase root filesystem)以提供一個最簡單、陽春且可開機的環境;製作完成的系統可開機到shell模式,並可使用 busybox 提供的指令。

準備工作

首先,您必須準備一台 host 開發環境,並安裝好 cross toolchain;接著,由於本文是做實機測試,因此,如果您沒有 ARM9 開發板,可以考慮使用 Qemu 來做模擬測試。

以下的操作示範,只節錄重點指令片段,您可能必須根據自己的整體實作流程,來微調指令的順序,或是參數等。

Step 1:建立工作目錄

建立一個專用的工作目錄,命名為 arm9.so-busybox/

# mkdir arm9.so-busybox/

# cd arm9.so-busybox/

接著在 arm9.so-busybox/ 目錄下建立 4 個子目錄:

# mkdir src/ install/ mnt/ pub/ build/

實際進行 root filesystem 實作時,我們應該養成將檔案分類擺放的好習慣。以本專案為例,build/ 目錄用來編譯程式,src/ 目錄用來存放原始程式碼,install/ 目錄則用來擺放我們最後的 root filesystem

Step 2:建立目錄架構

根據 FHS 的目錄架構標準,在 root filesystem 目錄下(install/)建立目錄階層架構:

# cd install/

# mkdir bin/ dev/ etc/ mnt/ proc/ sbin/ usr/

另外還有二個必要的目錄:/var /tmp,由於這二個目錄都需要具備寫入權限,所以在這裡我們是以 ramdisk 的做法來 mount 這二個目錄。

Step 3:建立裝置檔

root filesystem dev/ 目錄下建立必要的裝置檔:

crw------- 1 root root 5 1 1 1 1970 console

crw------- 1 root root 29 0 1 1 1970 fb0

crw------- 1 root root 1 3 1 1 1970 null

brw------- 1 root root 1 0 1 1 1970 ram0

crw------- 1 root root 5 0 1 1 1970 tty

crw------- 1 root root 4 0 1 1 1970 tty0

此階段使用 mknod 指令來完成。請先切換到 root filesystem dev/ 目錄下,接著執行以下指令:

# mknod console c 5 1

# mknod fb0 c 29 0

# mknod null c 1 3

# mknod ram0 1 0

# mknod tty c 5 0

# mknod tty0 c 4 0

對於需要產生大量 device file 的場合來說,可以改用 genext2fs ‘-D’ 參數來製作。詳見 Jollen’s Blog[使用 genext2fs '-D'device file table)來建立 root filesystem]

Step 4:加入Busybox

編譯並安裝 Busybox(動態程式庫方式)。將取得的Busybox原始碼解壓縮至 project 目錄裡的 src/ 子目錄下,以下是幾個注意事項:

  • 本教學文件使用 Busybox 1.3.1

  • Busybox 1.3.0 開始,使 Linux Kernel Makefile(因為開始支援 CONFIG_DESKTOP)。Cross compile 時,需要修改 Makefile 如下:

ARCH ?= arm

CROSS_COMPILE ?= /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-

CROSS_COMPILE 的設定是 cross toolchain 的「PREFIX」,視您的 toolchain 而定。您可由 http://www.jollen.org/kit/ 下載本文所使用的 GCC 3.4.1 ARM9 toolchain,以使用與本文完全相同的修改。

Busybox 整合了常用的指令與工具,我們可以設 Busybox,以勾選我們需要的功能選項。進入 Busybox 的設定選單:

# make menuconfig

請注意,init shell 是必選的項目,請檢查是否有勾選這二個功能。同時,也別忘了設定 Busybox 的安裝路徑,將安裝路徑指到我們 root filesystem 目錄下。

接著直接進行編譯(cross compile):

# make

編譯完成後,將 Busybox 安裝至我們的 root filesystem 目錄(即 Step 2 install/ 目錄):

# make install

此時,您應該可以在 root filesystem 目錄下看到 Busybox 所安裝的檔案。

Step 5:加入動態程式庫

編譯完成的 Busybox 已經是給 ARM9 執行的格式了,但我們的編譯設定是將Busybox 編譯成 shared library 架構,因此 Busybox 執行時需要以下的檔案:

˙ libc.so.6C library標準程式庫。

˙ ld-linux.so.2Native dynamic loader

請由 toolchain 將以上二個檔案複製至 root filesystem lib/ 目錄下:

# cd ../../install (切換至root filesystem根目錄)

# cp /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/ld-linux.so.2 lib/ (複制native dynamic loader。以上命令請勿斷行)

# cp /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/arm-9tdmi-linux-gnu/lib/libc.so.6 lib/ (複製C library。以上命令請勿斷行)

Busybox 會因版本與功能選項設定的差異,而需要更多的程式庫。請使用 cross toolchain objdump 指令來檢查 Busybox 的程式庫相依問題(無法使用 ldd 指令),並將所需的程式庫由 toolchain 複製到 root filesystem lib/ 目錄下。

Step 6:加入系統檔案

加入2個重要的系統檔案於 etc/ 目錄下:

˙ fstabmount table

˙ inittab:系統初始表(init table)。

etc/fstab內容如下:

/dev/ram0 / ext2 defaults 1 1

none /proc proc defaults 0 0

/dev/ram1 /tmp ramfs defaults 0 0

/dev/ram2 /var ramfs defaults 0 0

fstab 第一行設定,目的在將 /dev/ram0 重新附掛成 ‘/’root),此動作用意在於重新指定 ‘/’ 的檔案系統為 ext2。最後二行的目的是為了以 ramfs mount 要的二個目錄:/var /tmp;如此一來,就算開機沒做 remount root(詳見後文說明),也能對 /tmp /var 目錄做寫入的動作

etc/inittab內容如下:

:0:sysinit:/etc/rc.d/rc.init

:0:respawn:/bin/sh

根據這個 inittab 設定,當系統開機後便會進入 run level 0,在 run level 0 模式下,init process會執行2個動作:(1) 執行 /etc/rc.d/rc.init,此即「init script」;(2) 執行 /bin/sh,即進入 shell 模式。

在此我們並沒有參照 LSB 的標準來設定 run level,而且也沒有使用 getty 來讓使用者登入(多使用者模式)。

Step 7:編寫 Initial Script

根據 inittab 的設定,我們 root filesystem init script 位於 /etc/rc.d/rc.init。以下提供一個供 Embedded Linux 使用的 init script 範本:

#!/bin/sh

# automount (/etc/fstab)

mount -a

# remount root

mount -o remount rw /

#

mkdir /var/lock

mkdir /var/lock/subsys

mkdir /var/run

# start other applications (Running application automatically during

# booting up.

# eg. /bin/thttpd –p 80 –d /var/www

當我們執行「mount –a」後,mount 便會去讀取前一步驟所設定的 fstab,並根據此表格的內容來做 mount 的動作。另外,這裡有一個 remount 的動作:

# mount -o remount rw /

此動作的目的是將 root’/’)重新 mount 成可讀寫,此動作是選擇性的,若省略不做,請務必保持 /var /tmp 目錄是能寫入的(建議以 ramdisk 方式實作為佳)。

root filesystem 未包含 inittab 設定檔,則 Busybox 會使用以下的內建設定:

::sysinit:/etc/init.d/rcS

::askfirst:/bin/sh

::ctrlaltdel:/sbin/reboot

::shutdown:/sbin/swapoff -a

::shutdown:/bin/umount -a -r

::restart:/sbin/init

不過,還是建議編寫自己的 inittab 定檔。

Step 8:製作 Root Filesystem 映像檔(Image File

截至目前為止,我們的檔案系統已經擁有基本的系統指令與工具。接下來,我們即可將建置完成的 root filesystem 製作成 ext2 格式的映像檔。

以下提供二種 ext2fs image file 的製作方式:(1) 土方法;(2) 使用 genext2fs 工具。

先說明傳統的土方法。首先,先利用dd指令做出一個空白的檔案,大小為 4Mbytes):

# dd if=/dev/zero of=ext2fs bs=1k count=4096

我們將檔案命名為 ext2fs,接著再將 ext2fs 製作成 ext2 格式的檔案系統:

# mkfs.ext2 ext2fs

mke2fs 1.3209-Nov-2002

ext2fs is not a block special device.

Proceed anyway?yny

選擇y後出現以下畫面:

Filesystem label=

OS type Linux

Block size=1024log=0

Fragment size=1024log=0

128 inodes 1024 blocks

51 blocks4.98%reserved for the super user

First data block=1

1 block group

8192 blocks per group 8192 fragments per group

128 inodes per group

Writing inode tables done

Writing superblocks and filesystem accounting information done

This filesystem will be automatically checked every 26 mounts or

180 days whichever comes first. Use tune2fs -c or -i to override.

到這裡我們已經做好一個檔案格式為 ext2 的空白映像檔,再來只要將先前做好的 root filesystem 全部複製到 ext2fs 映像檔「裡面」即可。

先將 ext2fs 附掛至任一空目錄,例如 mnt/

# mkdir mnt/

# mount -t ext2 -o loop ext2fs mnt/ (指定檔案系統為 ext2

複製檔案系統時,我們不使用 cp 指令,而是利用 tar 來完成:

# cd install/

# tar cz * > ../install.tar.gz (將檔案系統做成tarball,同時也備份 root filesystem。)

# cd ..

# cd mnt/

# tar zxvf ../install.tar.gz (再將tarball解至映像檔)

接著將映像檔 umount 並壓縮即可:

# cd ..

# umount mnt/

# gzip -9c ext2fs > pub/ext2fs.gz

最後得到的 ext2fs.gz 即是完成品。請注意,若不使用 tar 來說,也應該使用 cpio 來複製檔案,避免使用 cp 指令。

使 genext2fs

genext2fs 是一個 ext2 filesystem image file 的製作工具,可以讓我們很方便地將 root filesystem 製作成 image 檔。請由 genext2fs 的官方網站下載原始碼套件:

http://genext2fs.sourceforge.net/

編譯後可以取得 genext2fs 檔案,以下是將 install/ 目錄製作成 ext2fs image 檔的指令:

# genext2fs -b 8192 -i 1024 -d install/ ext2fs

執行後,會得到檔名為 ext2fs image 檔,大小為 8 MB(透過 ‘-b’ 參數指定 image file 大小);接著同樣再用 gzip ext2fs 檔壓縮即可。

Step 9:在 Target 端做測試

本步驟以 Jollen-Kit! 為例,Jollen-Kit! 是由 www.jollen.org 所推出的 ARM9 training board,詳細介紹請參考 [http://www.jollen.org/kit/]。請注意,本階段的操作,視 target device 的不同而不同,因此以下示範只適用於 Jollen-Kit! 或是其他的 SMDK2410 平臺。

步驟 8 所得到的 ext2.gz 必須再包裝成 U-Boot 的格式,才能透過 U-Boot 載入到 RAM,以成為 kernel initial ramdiskinitrd):

# mkimage -A arm -O linux -T ramdisk -C none -a 0x30800000 -e 0x30800000 -n ramdisk -d ext2fs.gz urootfs.img

執行後可得到 urootfs.img 檔案,在測試階段為了方便起見,我們可以直接將 urootfs.img 載到 RAM 做測試;U-Boot 指令如下:

jollen.org # tftpboot 32000000 urootfs.img; tftpboot 30F00000 uimage.img; bootm 30F00000 32000000

urootfs.img 是我們製作的 root filesystemuimage.img 則是給 Jollen-Kit! 使用的 Linux kernelpre-built)。

延伸閱讀

--jollen

引用自:http://www.jollen.org/cgi-bin/mt3/mt-tb.cgi/339

2010年7月2日 星期五

Serial port programming

Serial Communications in Win32. Using Windows API calls for serial communications, with code in C. From Microsoft.
如何在 Serial Port 使用 Read/WriteFile() ?
Interfacing the Serial / RS232 Port
keywords: createfile rs232

2010年6月18日 星期五

PPS for Linux - PPS官方 Linux 版本

PPS for Linux - 國內終於有個像樣的Linux下的官方版P2P網絡電視了,這話怎麼那麼繞口。。。上次出的PPLive for Linux,夜火並沒介紹,因為並不是官方的,不知道會不會有什麼問題。現在好了,有官方的PPS for Linux了,官方只說支持Ubuntu 8.04,其他版本並沒說不能安裝運行,但是也看出PPS早有Linux版的開發意向,相信後續版本會越來越好。

國內著名在線播放軟件,PPS網絡電視不動聲響的開放了對應Linux的軟件下載。

支持系統:Ubuntu 8.04
運行環境:Console環境下運行,需要系統安裝Framebuffer驅動
權限要求:root用戶,本程序安裝需要root權限,以保證程序的正常安裝。

安裝使用方法:

  1. 解壓release_for_ubuntu.tgz到任意目錄;tar xzf release_for_ubuntu.tgz;
  2. 進入release_for_ubuntu解壓後目錄:cd release_for_ubuntu;
  3. 運行install.sh安裝PPS點播庫(請確認擁有Root權限):./install.sh;
  4. 安裝完成後,在控制台下行播放器,目前使用的是mplayer播放器進行測試:./mplayer -playlist playlist.txt;
  5. 開始播放,可以使用mplayer的操作按鍵可以實現快進、快退、暫停以及節目切換等功能;

註:PPS for Ubuntu 8.04解碼器包含了rmvb和wmv相關的一些解碼器,假如出現播放時沒有圖像的情況,可選擇安裝這些解碼器。使用方法:加解壓後的動態庫文件 (.so)複製到「/usr/local/lib/codecs/」目錄下即可。

PPS for Linux 下載地址】

PPS for Ubuntu 8.04安裝包
PPS for Ubuntu 8.04解碼器
C2 CC1100
NXP PNX8935
Realtek RTD1073
Davinci DM6446
Telechips TCC8900
Powerlayer PLM3000
Intel CE3100
sample下載


2010年6月13日 星期日

雙卡雙待手機的原理

雙卡雙待手機的原理
source:
夜猫子的家
手機通訊發展到一定程度之後,很多用戶希望擁有或已經擁用多個手機電話號碼,特別是針對那些經常需要出差,需要經常切換SIM卡的商務人士而言,其迫切希 望能將自己的手機承載多個電話號碼, 根據市場上的這一需求,能同時支持兩張SIM卡的手機也應運而生.
早期的多卡手機雖然能夠同時接兩張SIM卡,但實際上當前可用的只有一張,由 硬件電路來實現兩張卡的切換,一般在開機時選擇,因為協議棧的影響,一般在工作狀態中不能實現兩張SIM卡的動態切換,如果切換一般需要重新啟動手機系 統.(主要是啟動手機協議棧/上層軟件等等),此時的手機被稱為雙卡單待系統.
雙卡單待系統只擁有一套RF,一套BaseBand,一套協議棧.
因為雙卡單待系統實際有用的只有一個號碼,造成另外一個號碼不能待機,這就大 大影響了其實際推廣, 其實用性也大打折扣.一種折衷的方案是採用移動運營商提供的呼叫轉移以及來電秘書服務保證另外一個號碼不會丟失呼叫等信息.
正是因為單待手機的一些限制,雙卡雙待手機才根據市場需求登上市場.
在此簡單介紹一下雙模手機的概念,因為目前兩大移動運營商擁有GSM網絡和CDMA網絡,其協議實現有很大的不同,因此很多手機或者只支持GSM,或者只 支持CDMA,雙模手機就是可以支持GSM/CDMA兩種網絡的手機,在此不做詳細介紹,下面主要介紹的還是以GSM網絡為準.
雙卡雙待系統克服了以往單待手機的侷限性,其可以實現兩張SIM卡的同時待 機,類似同時具備兩部手機,顯然實用性得到大大提高.
早期的雙卡雙待機,實際上是擁有兩套系統, 兩套RF/兩套BaseBand/兩套協議棧,擁有兩套系統的雙卡雙待手機也可以稱之為真正的雙卡雙待手機,其有一個最大的特點,也就是一個手機上的兩個號碼可以互相撥號.這也是判斷其是否為真 正雙卡雙待手機的唯一條件.
採用兩套系統的雙卡雙待手機確實可以完成兩套手機的真正同時待機及通話,也可以稱之為雙卡雙待雙通系統,但因為是增加了兩套RF/兩套BaseBand /兩套協議棧軟件, 成本增加了很多,並且相應的耗電量也大大增加了, 因為有兩套硬件設備,手機的體積也隨之增大.對於RF而言,因為存在同頻干擾問題,一般是將一個RF設計在手機頂端,另外一個設計在手機末端,以儘量減少 干擾.兩根天線之間的距離一般必須大於100毫米.
正是因為存在同頻干擾等問題,設計出來的雙卡雙待手機性能方面的一個重要指標就是信號質量問題,另外還需要解 決的就是電源管理衝突問題,功耗問題以及軟件協同工作問題,因為是兩套協議棧在並行工作,承載協議棧的上層OS/DSP/CPU等都比單套系統時增加了一 倍的工作負載.
後期出現的雙卡雙待手機多稱為雙卡雙待單通系統,其相比上面的兩套系統而言,只使用了一套RF,一套 BaseBand,因為上層協議棧需要協同工作,因此原先的兩套獨立運行的協議棧需要密切整合,實際操作將更加複雜化,有可能由一套協議棧軟件來實現該雙 卡雙待效果.(因為兩個SIM卡, 或者說兩套系統並不能夠真正並行運行,某個特定的物理時隙只能分配給其中的某一個號碼, 因此完全用一套協議棧來實現是很有可能的,實際處理當然並非那麼簡單)
該雙卡雙待方案並非真正意義上的雙卡雙待,但其相比上面的系統有很大優勢:
1. 減少了硬件成本,只使用一套RF/BaseBand
2. 減少了體積
3. 不存在同頻干擾問題
4. 更低的功耗
該方案雖然不能實現雙通,但大部分情況下,兩個手機只要不是同時通話,都可以正常待機並接聽電話,同上面真正 雙卡雙待手機的使用效果差別並不是很大.並且一個手機的兩個號碼實現互撥也沒有實際意義.
下面主要就雙卡雙待單通方案談談其可能的工作原理,目前市場上採用單芯片雙卡雙待方案的手機估計都屬於此範疇. (因為水平有限,不能保證推測的工作原理完全正確,僅供大家參考)
目前市場上主要的雙卡雙待單通方案主要集中在MTK和展訊的方案上,其中展訊的方案從其宣傳而言,應該有更好 的性能和更高的雙卡接通率.
一般雙卡雙待單通主要是針對相同運營商的兩個SIM卡而言的,這樣,因為是相同的運營商,其可以實現小區共享,因為兩個卡可以同時駐留到相同的小區,這樣 SI信息可以實現共享.也就是說,只需要解析一次BCCH就可以了.當出現位置更新等階段性任務時,可以分開時間段來執行,或者另外一個SIM卡申請信道 時,如果所分配的信道和當前卡上已分配的信道發生衝突時,可以重新申請信道.因為是同一小區,如果是相同頻點,一般分配的物理信道是不同的.如果是不同頻 點,因為 SDCCH/8+SACCH/C8 可以分配的專用信道一共有8個, 因此出現衝突的機率也並非很大.
需要注意的是,因為協議規定,RF發射和接收之間必須間隔1到2個時隙, (因為RF發射需要佔用上一時隙的 Guard-Period時間, 並不能對鄰近物理信道造成干擾), 因此實際處理兩個SIM卡的動作時需要保證安全的時間間隔.
當處理兩個SIM卡的尋呼/通話信息時,只需要同時檢測相應塊上的PCH信息即可.通道申請和專用信道上的處理流程可以參考前面的論述.當其中一個卡正在 通話時,一般情況下,此時上層軟件可以停掉另外一張卡的動作,其通話請求信息可以利用移動運營商提供的呼叫轉移以及來電秘 書服務等保證信息不被丟失.當所分配的TCH物理信道和TS0物理信道有安全的時間間隔時,例如分配的TCH物理信道為TS3,此時上層軟件可以完全不關 閉另外一張卡的動作,可以繼續解析其相對應的PCH信息,並進而利用通道申請等動作瞭解是否有電話撥入等動作,當然如果通話過程中還需要檢測另一張卡的動 作將會使協議棧和BaseBand的實際工作流程更為複雜.
當所分配的TCH信道為TS0或TS7時, 此時物理上的時間已經重合,其中一張卡在通話時,不能夠檢測另外一張卡的PCH等信息,即便利用26復幀中的IDLE幀也不能滿足需求,因為PCH信道需 要連續的4個Frame才能組成一個信息塊.可能的方法只能是偷取TCH幀的時間.否則的話,將不能保證另外一個電話的撥入動作.
展訊方案所宣傳的可以大大提高兩卡的接通率,不知是否是採用偷TCH幀的方式還是僅僅是商業上的運作或者是有其獨特的解決方案,並且其宣稱可以同時支持兩 個運營商的卡,因為如果是不同運營商的卡,其對應的頻率範圍也是不同的,上面提到的小區共享等動作都是不可能實現的,其出現衝突的幾率會更大.
因為物理上的時間發生重合時,針對一套RF,不可能完成兩個頻點的動作的, 所以估計展訊方案可能是採用偷取TCH幀的方式來解決時間重合問題.(當然如果本身兩個SIM卡的工作時隙具有安全的時間間隔時,兩個SIM卡可以同時工 作)
展訊宣稱的可以同時支持不同運營商的卡,其可能的工作衝突會更大,當兩個不同網的卡的TS0時間衝突時,解析BCCH上的SI都不可能同時 進行,上層協議棧可以採用不同TC週期來解析SI的方式來實現SI的解析動作,雖然可以實現,但和協議棧所要求的在1個TC週期完成的標準相衝突.
the maximum time allowed to read the BCCH data, when being synchronized to a BCCH carrier, is 1.9 s or equal to the scheduling period for the BCCH data, whichever is greater (see 3GPP TS 05.02).

1.9s ( 8 * 51 * FN = 8 * 60/13 ms * 51 = 1.88 s )
另外其宣稱的在通話過程中可以大大提高兩個卡的接通率,估計也是採用偷取TCH幀的方式來實現的,因為每個26復幀中的語音信息塊是採用塊間交織和塊內交 織的方式, 當直接偷走其中間連續的4個Frame時,估計對當前通話質量有一定的損害,並且其要實現對不同運營商的卡的支持,其協議棧和BaseBand的工作將比 上面介紹的方式更加複雜.

2010年6月11日 星期五

鐵路數字移動通信系統(GSM-R)應用基礎理論

《鐵路數字移動通信系統(GSM-R)應用基礎理論》以GSM-R系統規範及標準為基礎,系統深入地闡述了與GSM-R建設緊密相關的應用基礎理論問題,主要包括:無線電波傳播理論、干擾分析理論、頻率規劃理論、無線組網理論、GSM-R系統服務質量理論;鑑於越區切換技術在GSM-R專用模式性能中的重要性,基於對越區切換阻塞率的分析,闡述了越區切換的可靠性問題。
《鐵路數字移動通信系統(GSM-R)應用基礎理論》是一本有關GSM-R系統的理論書籍,可作為高等院校相關專業本科生、研究生學習GSM-R技術和知識的教材和教學參考書,也可作為從事無線通信、鐵路通信系統工程建設的科技工程人員的培訓教材或自學參考書。

「鐵路數字移動通信系統(GSM-R)應用基礎理論」下載網址:
http://www.antsws.com/jiaotongyunshu/108/