« hx2750でDebian Lenny を使う - 内臓WiFi構築 | トップページ

2013年12月26日 (木)

hx2750でDebian Lenny を使う - カーネル構築メモ

■hx2750用カーネルコンパイルの手順

○必要なファイル
①クロスコンパイラ(gcc 4.2.1)
 arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
 コンパイル時には、arm-none-linux-gnueabi- を指定
②Linuxカーネルソース
   linux-2.6.23.tar.bz2
③hx2750用パッチセット
   patch-2.6.23.tar.gz
ダウンロード先
https://drive.google.com/folderview?id=0B8KJCKOFsibxNnRtNHA0WDBsNUk&usp=sharing

■コンパイル環境の準備

Ubuntu 10.04 で構築。
必要なファイルをUbuntu配下の/home/hx2750 に転送しておく。
○クロスコンパイラの展開
# cd /usr/local
# bzip2 -dc /home/hx2750/arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 | tar xvf - 

○カーネルソースの展開
# cd /home/hx2750
# tar xvfz linux-2.6.23.tar.bz2 

○パッチセットの展開
# cd /home/hx2750
# tar xvfz patch-2.6.23.tar.gz

○環境変数の設定
# export PATH=/usr/local/arm-2007q3/bin:$PATH
# export ARCH=arm

○パッチセットの適用
# cd /home/hx2750/linux-2.6.23 
# patch -p1 < ../patch-2.6.23/001-001-hx2750_base-r29.patch
# patch -p1 < ../patch-2.6.23/002-hx2750_bl-r9.patch
 ....
# patch -p1 < ../025-htcuni-acx.patch

番号がついているパッチを順番に全て実行する。

○ビルド手順
# cd /home/hx2750/inux-2.6.23

すべての設定されたファイルを削除する
# make mrproper

用意されているconfファイルを利用する
# cp ../patch-2.6.23/defconfig-hx2750 ./.config

ドライバなどの選択をする
# make menuconfig

ビルド実行
# make 

モジュールのインストール(インストールされる場所=/lib/modules/2.6.23)
# make modules_install 

tarで固める
# cd /lib/modules
# tar cvfz /home/hx2750/modules-2.6.23.tar.gz ./2.6.23

カーネルファイル
# cd /home/hx2750
# cp ./linux-2.6.23/arch/arm/boot/zImage ./zImage-2.6.23

SDカードのFATパーティションに以下のファイルを転送する。
zImage-2.6.23、modules-2.6.23.tar.gz

※modules-2.6.23.tar.gz は、iPAQ上でLinuxブート後、以下のような手順で展開する。

# mount -t vfat /dev/mmcblk0p1 /mnt/card
# cd /lib/modules
# tar xvfz /mnt/card/modules-2.6.23.tar.gz

■カーネル構築、起動までの留意事項

①カーネルバージョンによってmmcblk0のメジャー番号が違うことがあった。

2.6.23 では

# cd dev
# mknod mmcblk0 b 179 0
# mknod mmcblk1 b 179 1
# mknod mmcblk2 b 179 2

で作成するが、2.6.20 では

# cd dev
# mknod mmcblk0 b 254 0
# mknod mmcblk1 b 254 1
# mknod mmcblk2 b 254 2

だった。
②ブート時SDカードの認識は遅れる。

ブート時のパラメータに rootdelay=x を入れないと以下のようなメッセージで落ちる。
rootwaitというパラメータもあるらしいが有効ではなかった。

VFS: Cannot open root device "mmcblk0p2" or unknown-block(0,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

③haret.exeで指定しているdefault.txtの起動パラメータ
default.txt

set KERNEL zImage.2.6.23
set MTYPE 709
set CMDLINE "root=/dev/mmcblk0p2 rw rootdelay=6 noinitrd mem=128M cachepolicy=writeback console=tty0 console=ttyS0,115200n8 apm=off"
boot
root=/dev/mmcblk0p2 rw 
...ルートをSDカードの2番目のパーティションに指定する。rw は読み書きありの意味。

rootdelay=6 
...このパラメータがないとSDがないとメッセージが出てルートマウントできない。
   SDカードのパーティションを認識するまで6秒待たせる。

noinitrd
...直接ルートマウントさせる(initrdを使用しない)

mem=128M
...このパラメータがないと64MBのRAMと認識してしまう

console=tty0 console=ttyS0,115200n8
...tty0はタッチパネル、ttyS0はCOM1のこと。
   console=を複数記述することで、複数のコンソール指定が出来る。
   inittabにも記述が必要。

apm=off
...時間がたつと勝手にスリープに入るので止めさせる。

■hx2750用のパッチ入手元
http://www.rpsys.net/openzaurus/patches/
http://www.rpsys.net/openzaurus/patches/ipaq/
http://www.rpsys.net/openzaurus/patches/archive/
http://dev.openaos.org/browser/trunk/buildroot/patches/linux-2.6.23/generic?rev=193

■PCとのUSB接続について

・Linuxでは、USB Gadgetというモジュールがあり、PCとUSB接続できる
・接続できる方法に2種類がある

①USB Ethernet/RNDIS 経由
②USB Serial 経由

○モジュールロード方法
  # modprobe g_ether                   ... USB Ethernet/RNDIS
  # modprobe g_serial use_acm=1        ... USB Serial(CDC-ACM経由)

○PC側は事前にWindowsドライバのインストールが必要。

  USB Ethernet/RNDISは、Linux_USB_Ethernet_RNDIS_Gadget.inf
  USB Serialは、linux-cdc-acm.inf

それぞれググって、ダウンロードしてインストールする。
なお、このファイル単体でインストールできる。
ドライバファイルはOS標準のものを使っている。
○USB SerialはPC側では認識はするがドライバを入れても通信出来なかった。
  →パッチ不十分かも。

○hx2750用には以下のパッチをあてる必要がある。
  →以下のパッチはUSBへの電源ONを行う処理らしい。

--- linux-2.6.17.6/arch/arm/mach-pxa/hx2750.c   2006-08-21 00:53:22.000000000 +0300
+++ b/arch/arm/mach-pxa/hx2750.c        2006-08-21 00:53:59.000000000 +0300
@@ -90,13 +90,21 @@
        return GPLR0 & GPIO_bit(HX2750_GPIO_USBCONNECT);
 }
 
-//static void hx2750_udc_command (int cmd) 
-//{
-//}
+static void hx2750_udc_command (int cmd) 
+{
+       switch (cmd) {
+       case PXA2XX_UDC_CMD_CONNECT:
+               GPSR(HX2750_GPIO_USBPULLUP) = GPIO_bit(HX2750_GPIO_USBPULLUP);
+               break;
+       case PXA2XX_UDC_CMD_DISCONNECT:
+               GPCR(HX2750_GPIO_USBPULLUP) = GPIO_bit(HX2750_GPIO_USBPULLUP);
+               break;
+       }                       
+}
 
 static struct pxa2xx_udc_mach_info hx2750_udc_mach_info = {
        .udc_is_connected = hx2750_udc_is_connected,
-//     .udc_command      = hx2750_udc_command,
+       .udc_command      = hx2750_udc_command,
 };
 
 
--- linux-2.6.17.6/include/asm-arm/arch-pxa/hx2750.h    2006-08-21 00:53:22.000000000 +0300
+++ b/include/asm-arm/arch-pxa/hx2750.h 2006-08-21 00:54:07.000000000 +0300
@@ -49,6 +49,7 @@
 #define HX2750_GPIO_SD_READONLY (103)  /* MMC/SD Write Protection */
 #define HX2750_GPIO_LEDMAIL     (106)  /* Green Mail LED */
 #define HX2750_GPIO_HP_JACK     (108)  /* Head Phone Jack Present */
+#define HX2750_GPIO_USBPULLUP  (114)  /* enable usb pullup output */
 #define HX2750_GPIO_PENDOWN     (117)  /* Touch Screen Pendown */

■クロスコンパイラのバージョンについて
○gcc 4.3.2 では、2.6.24をビルドしようとして以下のコンパイルエラーが発生

kernel/built-in.o: In function `getnstimeofday':
utsname_sysctl.c:(.text+0x2343c): undefined reference to `__aeabi_uldivmod'
kernel/built-in.o: In function `do_gettimeofday':
utsname_sysctl.c:(.text+0x234e8): undefined reference to `__aeabi_uldivmod'
utsname_sysctl.c:(.text+0x23508): undefined reference to `__aeabi_uldivmod'
kernel/built-in.o: In function `timekeeping_resume':
utsname_sysctl.c:(.text+0x2369c): undefined reference to `__aeabi_uldivmod'
utsname_sysctl.c:(.text+0x236b8): undefined reference to `__aeabi_uldivmod'

gcc 4.2.1 で試したところ成功した。
新しいバージョンだとこういうことがあるらしい。

○debian を動かすためにはカーネルの以下の項目は必須。
  debianの各種ファイルは、EABIの為

Kernel Features ---->
        [*] Use the ARM EABIto compile the kernel

■現在のIPアドレスの設定について

eth0  ... 192.168.1.10 / 255.255.255.0
usb0  ... 192.168.0.10 / 255.255.255.0
wlan0 ... 何も設定せず

eth0は、CFスロットにLANカードを入れた場合に認識するデバイス
usb0は、USB Ethernet/RNDISで認識するデバイス

■デバイス情報

①SDカード  ... デバイス名は、mmcblk0、パーティションは、mmcblk0p1, mmcblk0p2となる。
②CFメモリカード  ... デバイス名は、hda、パーティションは、hda1, hda2 となる。
②CF-LANカード(CF-100TX2) ... ドライバ Asix AX88790 で認識、デバイスは、eth0
③タッチスクリーン ... ドライバ tsc2101 で認識、デバイスは/dev/input/event1
④内臓-WIFI ... PCMCIAの1ポートとして認識、デバイスは、wlan0
# pccardctl ident
Socket 0:
  product info: "SAMSUNG", "WLAN CF Card(SWL-2350)", "", ""
  manfid: 0x0250, 0xb001
  function: 6 (network)
⑤USBポート、USB Ethernet/RNDISで認識、デバイスはusb0

|

« hx2750でDebian Lenny を使う - 内臓WiFi構築 | トップページ

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/531329/58825636

この記事へのトラックバック一覧です: hx2750でDebian Lenny を使う - カーネル構築メモ:

« hx2750でDebian Lenny を使う - 内臓WiFi構築 | トップページ