LinkStation?/玄箱のkernelに関するページです。

クロスコンパイル環境の作成

emdebian-tools を用いる場合

apt-cross を用いる場合

crosstoolを用いる場合

loader.o や uloader.o のコンパイルはカーネルをビルドしたのと同じgccのバージョンが必要なので、gcc-2.95.3が必要だった。apt-crossではうまく作成できなかったので、crosstoolを用いた。
参考:Build (and use) a cross-toolchain using Dan Kegel's crosstool 0.38 - NAS-Central Buffalo - The Linkstation Wiki

crosstool本体のダウンロードと展開

$ mkdir workdir
$ cd workdir
$ wget http://www.kegel.com/crosstool/crosstool-0.43.tar.gz
$ tar zxvf crosstool-0.43.tar.gz
$ cd crosstool-0.43

LinkStation?/玄箱用コンフィグファイルのダウンロード

コンフィグファイルの修正

  • powerpc-hdhglan.dat
    $ diff -Nur powerpc-hdhglan.dat.orig powerpc-hdhglan.dat
    --- powerpc-hdhglan.dat.orig	2009-03-21 18:47:06.000000000 +0900
    +++ powerpc-hdhglan.dat	2009-03-21 18:42:26.000000000 +0900
    @@ -1,4 +1,4 @@
     KERNELCONFIG=`pwd`/powerpc-hdhglan.config
    -TARGET=powerpc-hdhglan-linux
    +TARGET=powerpc-linux-gnu
     TARGET_CFLAGS="-O -mcpu=603e"
     GCC_EXTRA_CONFIG="--with-cpu=603e --enable-cxx-flags=-mcpu=603e"
  • powerpc-hdhglan.sh
    $ diff -Nur powerpc-hdhglan.sh.orig powerpc-hdhglan.sh
    --- powerpc-hdhglan.sh.orig	2009-03-21 18:47:14.000000000 +0900
    +++ powerpc-hdhglan.sh	2009-03-21 18:42:26.000000000 +0900
    @@ -1,7 +1,7 @@
     #!/bin/sh
     set -ex
     TARBALLS_DIR=$HOME/downloads
    -RESULT_TOP=/usr/local/linkstation
    +RESULT_TOP=/usr/cross/linkstation
     export TARBALLS_DIR RESULT_TOP
     GCC_LANGUAGES="c,c++"
     export GCC_LANGUAGES
    @@ -11,6 +11,7 @@
     mkdir -p $RESULT_TOP
     
     # Build the toolchain.  Takes a couple hours and a couple gigabytes.
    -eval `cat powerpc-hdhglan.dat gcc-3.3.5-glibc-2.3.2.dat`  sh all.sh --notest
    +eval `cat powerpc-hdhglan.dat gcc-2.95.3-glibc-2.2.5.dat`  sh all.sh --notest
     
     echo Done.
  • gcc-2.95.3-glibc-2.2.5.dat
    • カーネルのバージョンを linux-2.4.17_mvl21-sandpoint にする場合
      $ diff -Nur gcc-2.95.3-glibc-2.2.5.dat.orig gcc-2.95.3-glibc-2.2.5.dat
      --- gcc-2.95.3-glibc-2.2.5.dat.orig	2009-03-21 19:08:38.000000000 +0900
      +++ gcc-2.95.3-glibc-2.2.5.dat	2009-03-21 19:07:25.000000000 +0900
      @@ -1,6 +1,6 @@
       BINUTILS_DIR=binutils-2.15
       GCC_DIR=gcc-2.95.3
       GLIBC_DIR=glibc-2.2.5
      -LINUX_DIR=linux-2.4.26
      +LINUX_DIR=linux-2.4.17_mvl21-sandpoint
       GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.2.5
       GDB_DIR=gdb-6.5
    • カーネルのバージョンを linux-2.4.17_mvl21 にする場合
      $ diff -Nur gcc-2.95.3-glibc-2.2.5.dat.orig gcc-2.95.3-glibc-2.2.5.dat
      --- gcc-2.95.3-glibc-2.2.5.dat.orig	2009-03-21 19:08:38.000000000 +0900
      +++ gcc-2.95.3-glibc-2.2.5.dat	2009-03-21 19:07:25.000000000 +0900
      @@ -1,6 +1,6 @@
       BINUTILS_DIR=binutils-2.15
       GCC_DIR=gcc-2.95.3
       GLIBC_DIR=glibc-2.2.5
      -LINUX_DIR=linux-2.4.26
      +LINUX_DIR=linux-2.4.17_mvl21
       GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.2.5
       GDB_DIR=gdb-6.5

カーネルソースのダウンロードとパッチ当て

インストール先ディレクトリの作成と所有者の変更

$ sudo mkdir /usr/cross
$ sudo chown -R ユーザ名 /usr/cross

実行

$ cd ~/workdir/crosstool-0.43
$ sh ./powerpc-hdhglan.sh

uloader.o の作成

フラッシュROMに内蔵されているカーネルのバージョンに合わせて、uloader.o をコンパイルする。その際に、カーネルをコンパイルしたのと同じ gcc-2.95.3 が必要。ここでは、crosstool でインストールしたものを用いる。

ソースコードのダウンロードと展開

$ mkdir workdir
$ cd workdir
$ wget http://www.linuxnotincluded.pwp.blueyonder.co.uk/linkstation/downloads/uloader-2.4.17.tar.gz
$ tar zxvf uloader-2.4.17.tar.gz
$ cd wget uloader-2.4.17

uloader-2.4.20.tar.gz にも uloader.o 作成用の同じソースコードが含まれる。

クロスコンパイル用にパッチを当てる

--- Makefile.orig	2009-03-25 17:01:32.000000000 +0900
+++ Makefile	2009-03-25 17:09:35.000000000 +0900
@@ -25,7 +25,7 @@
 # 2.4.17_mvl21-sandpoint and gcc 2.95
 
 # Change INCLUDE to match your environment
-INCLUDE = -nostdinc -I/opt/embedded/ppc/list/linux-2.4.17_mvl21-sandpoint.ref/include -I/opt/embedded/ppc/list/linux-2.4.17_mvl21-sandpoint.ref/arch/ppc -I/opt/embedded/ppc/toolchain/usr/lib/gcc-lib/powerpc-linux/2.95.3/include
+INCLUDE = -nostdinc -I/usr/cross/kurohg/gcc-2.95.3-glibc-2.2.5/powerpc-linux-gnu/powerpc-linux-gnu/include -I/usr/cross/kurohg/gcc-2.95.3-glibc-2.2.5/powerpc-linux-gnu/lib/gcc-lib/powerpc-linux-gnu/2.95.3/include
 
 CFLAGS = -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -fsigned-char -msoft-float -pipe -ffixed-r2 -Wno-uninitialized -mmultiple -mstring -DMODULE

コンパイル

$ export PATH=/usr/cross/kurohg/gcc-2.95.3-glibc-2.2.5/powerpc-linux-gnu/bin:$PATH
$ make CROSS_COMPILE=powerpc-linux-gnu-

DTC対応U-Bootの作成

kernel 2.6.20以降からDTCを利用するようになったので、ブートローダもDTCに対応したものでないといけない。ただし、DTCを利用せずに、以前からの loader.o を使った起動も可能。

ダウンロードとパッチ当て

U-Boot 1.2.0 以降しか DTC に対応できないので、U-Boot 1.2.0 と LinkStation? 用パッチをダウンロードする。

$ cd /usr/src
$ wget ftp://ftp.denx.de/pub/u-boot/u-boot-1.2.0.tar.bz2
$ wget http://git.openmoko.org/git/openmoko.git/packages/u-boot/u-boot-1.2.0/u-boot-kurobox.patch
$ wget http://git.openmoko.org/git/openmoko.git/packages/u-boot/u-boot-1.2.0/u-boot-kurobox-fdt.patch
$ wget http://git.openmoko.org/git/openmoko.git/packages/u-boot/u-boot-1.2.0/defconfig_lsppchg
$ tar jxvf u-boot-1.2.0.tar.bz2
$ cd u-boot-1.2.0
$ patch -p 1 < ../u-boot-kurobox.patch
$ patch -p 1 < ../u-boot-kurobox-fdt.patch

include/configs/linkstation.h の編集

IPアドレス関係

#define CONFIG_IPADDR_LS       192.168.10.145	←LinkStation?/玄箱のIPアドレス
#define CONFIG_SERVERIP_LS     192.168.10.21	←nc(network console)を起動するマシンのIPアドレス

ブートパラメータ

ルートパーティションやnc関連の設定を自分の環境に合わせて変更する。

#define CONFIG_BOOTARGS                        "root=/dev/hda1"
							↓
#define CONFIG_BOOTARGS                        "root=/dev/sda1 netconsole=6666@192.168.10.145/,@192.168.10.21/ rtc-rs5c372.probe=0,0x32"

IMAGEROOTの定義

#define IMAGEROOT "usr/src/"追加
#if defined(CONFIG_HLAN) || defined(CONFIG_LAN)
#define UBFILE                 IMAGEROOT "u-boot-hd.flash.bin"
#elif defined(CONFIG_HGLAN)
#define UBFILE                 IMAGEROOT "u-boot-hg.flash.bin"
#elif defined(CONFIG_HTGL)
#define UBFILE                 IMAGEROOT "u-boot-ht.flash.bin"

ubpartの設定

/usr/srcが含まれるパーティションが /dev/hda4 ならば

"ubpart=0:4\0"

となる。

クロスコンパイル用設定

emdebian-tools や apt-cross で構築したクロスコンパイル環境でコンパイルするには、環境変数 CROSS_COMPILE やパスの設定をする必要がある。

  • emdebian-tools の場合
    コンパイラ等のバイナリは /usr/bin にインストールされるので、パス追加する必要はない。しかし、gcc-4.2.4 ではコンパイルはできたが、起動させると FLASH: のところまで表示して、ハングアップしてしまった。apt-cross でも同様。gcc-4 系でのクロスコンパイルに問題があるのかもしれない。(gcc-3.4.6 で動いたので、それ以上は深く追求していない。
    • Makefile
      --- Makefile.orig	2009-03-25 12:13:20.000000000 +0900
      +++ Makefile	2009-03-25 12:13:36.000000000 +0900
      @@ -122,7 +122,7 @@
       CROSS_COMPILE =
       else
       ifeq ($(ARCH),ppc)
      -CROSS_COMPILE = ppc_6xx-
      +CROSS_COMPILE = powerpc-linux-gnu-
       endif
       ifeq ($(ARCH),arm)
       CROSS_COMPILE = arm-linux-
  • gcc-4.2.4 でのコンパイル
    いろいろ試してみたが、以下のところでおかしくなっているようだ。(2009-03-31追記:gcc-4.3.3 でも同様だった。)どうすればよいかは、皆目検討がつかないが...
    • board/linkstation/flash.c
       90 /* Basic Query Structure */
       91 struct cfi_ident {
       92   __u8  qry[3];
       93   __u16 P_ID;
       94   __u16 P_ADR;
       95   __u16 A_ID;
       96   __u16 A_ADR;
       97   __u8  VccMin;
       98   __u8  VccMax;
       99   __u8  VppMin;
      100   __u8  VppMax;
      101   __u8  WordWriteTimeoutTyp;
      102   __u8  BufWriteTimeoutTyp;
      103   __u8  BlockEraseTimeoutTyp;
      104   __u8  ChipEraseTimeoutTyp;
      105   __u8  WordWriteTimeoutMax;
      106   __u8  BufWriteTimeoutMax;
      107   __u8  BlockEraseTimeoutMax;
      108   __u8  ChipEraseTimeoutMax;
      109   __u8  DevSize;
      110   __u16 InterfaceDesc;
      111   __u16 MaxBufWriteSize;
      112   __u8  NumEraseRegions;
      113   __u32 EraseRegionInfo[MAX_ERASE_REGIONS];
      114 } __attribute__((packed));
      115 
      116 struct cfi_private {
      117         __u32 base;
      118         int device_type;
      119         int addr_unlock1;
      120         int addr_unlock2;
      121         struct cfi_ident *cfiq;
      122         int mfr;
      123         int id[3]; /* Supports AMD MirrorBit flash */
      124         char *flash_name;
      125         int  wrd_wr_time;
      126         int  buf_wr_time;
      127         int  erase_time;
      128         int (*blk_erase)(flash_info_t *info, int s_first, int s_last);
      129         int (*blk_write)(flash_info_t *info, __u8 *buf, __u32 addr, int sz);
      130 };
      
      165 flash_info_t flash_info[CFG_MAX_FLASH_BANKS];
      166 static struct cfi_private cfis;
      167 static struct cfi_ident   cfi_idents;
      168 static struct cfi_private *cfi;
      169 
      170 static int cfi_probe_chip(struct cfi_private *cfi);
      171 static unsigned long cfi_amdstd_setup(struct cfi_private *cfi, int primary);
      172 static void print_cfi_ident(struct cfi_ident *)
      
      - gcc-4.2.4 の場合
      address of cfi = 0x7f2d1c8
      address of cfi->cfiq = 0x7f2d198
      
      - gcc-3.4.6 の場合
      address of cfi = 0x7f2c2a8
      address of cfi->cfiq = 0x7f2c2e4
      
      static にメモリを割り当てている変数 cfi と cfi->cfiq のメモリ上の位置が逆転している。そのため、gcc-4.2.4 では、以下に示すように構造体 cfi の内容が改変されてしまう。
      mem[0] = ff
      mem[1] = c0
      mem[2] = 0
      mem[3] = 0
      mem[4] = 0
      mem[5] = 0
      mem[6] = 0
      mem[7] = 2
      mem[8] = 0
      mem[9] = 0
      mem[10] = 0
      mem[11] = 0
      mem[12] = 0
      mem[13] = 0
      mem[14] = 0
      mem[15] = 0
      mem[16] = 7
      mem[17] = f2
      mem[18] = d1
      mem[19] = 98
      mem[20] = 0
      mem[21] = 0
      mem[22] = 0
      mem[23] = 0
      mem[24] = 0
      mem[25] = 0
      mem[26] = 0
      mem[27] = 0
      mem[28] = 0
      mem[29] = 0
      mem[30] = 0
      mem[31] = 0
      mem[32] = 0
      mem[33] = 0
      mem[34] = 0
      mem[35] = 0
      mem[36] = 0
      mem[37] = 0
      mem[38] = 0
      mem[39] = 0
      mem[40] = 0
      mem[41] = 0
      mem[42] = 0
      mem[43] = 0
      mem[44] = 0
      mem[45] = 0
      mem[46] = 0
      mem[47] = 0
      mem[48] = 0
      mem[49] = 0
      mem[50] = 0
      mem[51] = 0
      mem[52] = 0
      mem[53] = 0
      mem[54] = 0
      mem[55] = 0
      mem[56] = 0
      mem[57] = 0
      mem[58] = 0
      mem[59] = 0
      i = 0 addr[ffc00020] = 0x51
      i = 1 addr[ffc00022] = 0x52
      i = 2 addr[ffc00024] = 0x59
      i = 3 addr[ffc00026] = 0x2
      i = 4 addr[ffc00028] = 0x0
      i = 5 addr[ffc0002a] = 0x40
      i = 6 addr[ffc0002c] = 0x0
      i = 7 addr[ffc0002e] = 0x0
      i = 8 addr[ffc00030] = 0x0
      i = 9 addr[ffc00032] = 0x0
      i = 10 addr[ffc00034] = 0x0
      i = 11 addr[ffc00036] = 0x27
      i = 12 addr[ffc00038] = 0x36
      i = 13 addr[ffc0003a] = 0x0
      i = 14 addr[ffc0003c] = 0x0
      i = 15 addr[ffc0003e] = 0x7
      i = 16 addr[ffc00040] = 0x7
      i = 17 addr[ffc00042] = 0xa
      i = 18 addr[ffc00044] = 0x0
      i = 19 addr[ffc00046] = 0x1
      i = 20 addr[ffc00048] = 0x5
      i = 21 addr[ffc0004a] = 0x4
      i = 22 addr[ffc0004c] = 0x0
      i = 23 addr[ffc0004e] = 0x16
      i = 24 addr[ffc00050] = 0x2
      i = 25 addr[ffc00052] = 0x0
      i = 26 addr[ffc00054] = 0x5
      i = 27 addr[ffc00056] = 0x0
      i = 28 addr[ffc00058] = 0x2
      i = 29 addr[ffc0005a] = 0x7
      i = 30 addr[ffc0005c] = 0x0
      i = 31 addr[ffc0005e] = 0x20
      i = 32 addr[ffc00060] = 0x0
      i = 33 addr[ffc00062] = 0x3e
      i = 34 addr[ffc00064] = 0x0
      i = 35 addr[ffc00066] = 0x0
      i = 36 addr[ffc00068] = 0x1
      i = 37 addr[ffc0006a] = 0x0
      i = 38 addr[ffc0006c] = 0x0
      i = 39 addr[ffc0006e] = 0x0
      i = 40 addr[ffc00070] = 0x0
      i = 41 addr[ffc00072] = 0x0
      i = 42 addr[ffc00074] = 0x0
      i = 43 addr[ffc00076] = 0x0
      i = 44 addr[ffc00078] = 0x0
      i = 45 addr[ffc0007a] = 0x0
      i = 46 addr[ffc0007c] = 0x0
      i = 47 addr[ffc0007e] = 0x0
      i = 48 addr[ffc00080] = 0x50
      i = 49 addr[ffc00082] = 0x52
      i = 50 addr[ffc00084] = 0x49
      i = 51 addr[ffc00086] = 0x31
      i = 52 addr[ffc00088] = 0x33
      mem[0] = 50	←ここ
      mem[1] = 52	←ここ
      mem[2] = 49	←ここ
      mem[3] = 31	←ここ
      mem[4] = 33	←ここ
      mem[5] = 0
      mem[6] = 0
      mem[7] = 2
      mem[8] = 0
      mem[9] = 0
      mem[10] = 0
      mem[11] = 0
      mem[12] = 0
      mem[13] = 0
      mem[14] = 0
      mem[15] = 0
      mem[16] = 7
      mem[17] = f2
      mem[18] = d1
      mem[19] = 98
      mem[20] = 0
      mem[21] = 0
      mem[22] = 0
      mem[23] = 0
      mem[24] = 0
      mem[25] = 0
      mem[26] = 0
      mem[27] = 0
      mem[28] = 0
      mem[29] = 0
      mem[30] = 0
      mem[31] = 0
      mem[32] = 0
      mem[33] = 0
      mem[34] = 0
      mem[35] = 0
      mem[36] = 0
      mem[37] = 0
      mem[38] = 0
      mem[39] = 0
      mem[40] = 0
      mem[41] = 0
      mem[42] = 0
      mem[43] = 0
      mem[44] = 0
      mem[45] = 0
      mem[46] = 0
      mem[47] = 0
      mem[48] = 0
      mem[49] = 0
      mem[50] = 0
      mem[51] = 0
      mem[52] = 0
      mem[53] = 0
      mem[54] = 0
      mem[55] = 0
      mem[56] = 0
      mem[57] = 0
      mem[58] = 0
      mem[59] = 0
      fileflash.c デバッグ用に改変した board/linkstation/flash.c
  • apt-cross の場合
    コンパイラー等のインストール先にパスを通す必要がある。
    $ export PATH=/usr/cross/powerpc/bin;$PATH
    あとは、emdebian-tools 同様 Makefile を編集し、コンパイルする。

RAM版 U-Bootのビルド

KuroBox?/Linkstation HDLANの場合

$ cd /usr/src/u-boot-1.2.0
$ make linkstation_HDLAN_RAM_config
$ make linkstation_HDLAN_RAM
$ cp u-boot-hd.ram.bin ..

KuroBoxHG/Linkstation HGLANの場合

$ cd /usr/src/u-boot-1.2.0
$ make linkstation_HGLAN_RAM_config
$ make linkstation_HGLAN_RAM
$ cp u-boot-hg.ram.bin ..

古い binutils だと、以下のようなエラーが出る場合がある。

cd /usr/src/u-boot-1.2.0 && ld -Bstatic -T /usr/src/u-boot-1.2.0/board/linkstation/u-boot.lds
 -Ttext 0x07F00000  -n $UNDEF_SYM cpu/mpc824x/start.o
 --start-group lib_generic/libgeneric.a board/linkstation/liblinkstation.a
 cpu/mpc824x/libmpc824x.a lib_ppc/libppc.a fs/cramfs/libcramfs.a
 fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a
 fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a
 drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a
 drivers/sk98lin/libsk98lin.a post/libpost.a post/cpu/libcpu.a
 common/libcommon.a --end-group -L /usr/lib/gcc-lib/powerpc-linux/3.3.5 -lgcc
 -Map u-boot.map -o u-boot
make[1]: *** [u-boot] Error 139

Binutils のバージョンを上げるか、場当たり的対応だが、Makefileから -Map u-boot.map を消去すればよい。

$ diff -c Makefile.orig Makefile
*** Makefile.orig       Tue Mar 17 10:50:26 2009 [#kcf65739]
--- Makefile    Tue Mar 17 10:50:47 2009
*************** [#w58a450e]
*** 297,303 **** [#p7a43274]
                UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
                cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
                        --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
!                       -Map u-boot.map -o u-boot

  $(OBJS):
                $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))
--- 297,303 ----
                UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
                cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
                        --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
!                       -o u-boot

  $(OBJS):
                $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

FlashROM版 U-Bootのビルド

KuroBox?/Linkstation HDLANの場合

$ cd /usr/src/u-boot-1.2.0
$ make linkstation_HDLAN_config
$ make linkstation_HDLAN
$ cp u-boot-hd.flash.bin ..

KuroBoxHG/Linkstation HGLANの場合

$ cd /usr/src/u-boot-1.2.0
$ make linkstation_HGLAN_config
$ make linkstation_HGLAN
$ cp u-boot-hg.flash.bin ..

コンパイル済みバイナリ

LinkStation? HDLAN/初代KuroBox?

LinkStation? HGLAN/KuroBoxHG用

2.6.28.* のインストール

2.6.28.8

emdebian-tools でクロスコンパイルした場合

$ wget http://ring.maffin.ad.jp/archives/linux/kernel.org/kernel/v2.6/linux-2.6.28.8.tar.bz2
$ tar jxvf linux-2.6.28.8.tar.bz2
$ cd linux-2.6.28.8
$ make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- linkstation_defconfig
$ cp -p ./.config ./.config.orig
$ make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- menuconfig
$ make ARCH=powerpc CROSS_COMPILE=powerpc-linux-gnu- uImage modules
$ &color(blue){
$ &color(blue){
$ &color(blue){

2ちゃん情報

久しぶりにカーネルを上げようと調べてみたら、結構以前と変わっていたので、メモを残す。情報源は2ちゃんねるの「玄人志向「玄箱」で自宅サーバ Part13」の201-218ぐらい。
ただし、kernel-2.6.30 からは dtc の位置が arch/powerpc/boot から scripts/dtc に変更になったので注意。([PATCH] Move dtc and libfdt sources from arch/powerpc/boot to scripts/dtc

201 :193:2009/02/22(日) 00:44:12 ID:???
    初代玄箱でkernel2.6.28.6の動かしかた
    ちょっと長くなる。すまんね。あと自己責任でよろしく。

    ①カーネルコンパイル
    …2.6.28.7でてるし。がっかり。(´・ω・`)
    ダウンロード/解凍していつもどおり。
    # wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.28.6.tar.gz
    # tar -xvzf linux-2.6.28.6.tar.gz
    # cd linux-2.6.28.6
    # make ARCH=powerpc linkstation_defconfig
    # cp -p ./.config ./.config.org
    # make menuconfig
    ※適当にコンフィグ

    # nohup make uImage modules modules_install &

    # cp -p System.map /boot/System.map
    # cp -p arch/powerpc/boot/uImage /boot/vmlinux.UBoot
    ※シンボリックリンクするとかは勝手にどうぞ

    ②dts→dtbにをコンパイルする
    Device Tree Compilerっていうものだそうだよ。
    これで/bootの下にkuroboxHD.dtbってファイルが作られる
    # arch/powerpc/boot/dtc -f -I dts -O dtb -o /boot/kuroboxHD.dtb -V 16 arch/powerpc/boot/dts/kuroboxHD.dts
    ※dtcプログラムはカーンルにソースが同梱されてコンパイルの時に作られる。


202 :193:2009/02/22(日) 00:46:42 ID:???
    続き

    ③u-boot1.2.0化する
    俺はだいぶ前からu-boot1.1.4にしてたから、買ったときからの変更手順忘れた。
    まー危険なので自己責任で。
    http://buffalo.nas-central.org/index.php/Freelink%2BUBoot%2Bkernel2.6_on_Kurobox
    ファイルは上記から外人さんに感謝しながらダウンロードして。

    # cat /proc/mtd
    でmod_bootcodeを調べて
    mtd1: 00070000 00010000 "mtd_bootcode"
    上記だと
    # dd if=u-boot-lsppchd-flash-1.2.0-r2.bin of=/dev/mtdblock1 bs=1k
    なんだかmtd0の人もいるみたい。その場合はmtdblock0で。

    mtd見えないカーネルならflushから起動して確認、書き込みで。

    ④u-bootの環境変数変更
    1.1.4からアップデートだとu-bootの環境変数が1.1.4のままで動かなかった。
    新規u-boot1.2.0だと大丈夫かも。

    設定したのは以下。
    setenv hdload 'echo Loading ${hdpart}:${hdfile}; ext2load ide ${hdpart} ${ldaddr} ${hdfile}; ext2load ide ${hdpart} 7f0000 kuroboxHD.dtb'
    setenv boothd 'setenv bootargs root=/dev/sda2 netconsole=6666@192.168.0.100/,@192.168.0.200/; bootm ${ldaddr} - 7f0000'
    ※kuroboxHD.dtbは②で作ったdtbファイルと同じ名前ね。シンボリックリンクでもおk。
    ※/dev/sda2は"/"があるパーティション
    ※192.168.0.100は玄箱自身、192.168.0.200はncする他のサーバ

    printenvで確認。
    saveenvで書き込み。

    関係ありそうな環境変数は下にようになってたよ。
    ldaddr=800000
    hdpart=0:1
    hdfile=vmlinux.UBoot
    hdboot=run hdload boothd


203 :193:2009/02/22(日) 00:49:11 ID:???
    ⑤u-bootからresetするなり、hdbootで。

    ## Booting image at 00800000 ...
       Image Name:   Linux-2.6.28.6
       Image Type:   PowerPC Linux Kernel Image (gzip compressed)
       Data Size:    1701296 Bytes =  1.6 MB
       Load Address: 00000000
       Entry Point:  00000000
       Verifying Checksum ... OK
       Uncompressing Kernel Image ... OK
       Booting using flat device tree at 0x7f0000
    Using Buffalo Linkstation machine description
    Linux version 2.6.28.6 (root@kurobox) (gcc version 4.3.2 (Debian 4.3.2-1.1) ) #1 Sat Feb 21 23:19:25 JST 2009
    console [udbg0] enabled
    Adding PCI host bridge /soc10x/pci@fec00000
    PCI host bridge /soc10x/pci@fec00000 (primary) ranges:
      IO 0x00000000fe000000..0x00000000febfffff -> 0x0000000000000000
     MEM 0x0000000080000000..0x00000000efffffff -> 0x0000000080000000
    BUFFALO Network Attached Storage Series
    (C) 2002-2005 BUFFALO INC.
    Zone PFN ranges:
      DMA      0x00000000 -> 0x00004000
      Normal   0x00004000 -> 0x00004000
    Movable zone start PFN for each node
    early_node_map[1] active PFN ranges
        0: 0x00000000 -> 0x00004000
    Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
    Kernel command line: root=/dev/sda2 netconsole=6666@192.168.0.100/,@192.168.0.200/
    mpic: Setting up MPIC " EPIC     " version 1.2 at 80040000, max 1 CPUs

    ・・・・あとダラダラ
    とりあえずエラーなさそう。
    でもどーせだから2.6.28.7を今からコンパイルするよ。

204 :193:2009/02/22(日) 00:59:17 ID:???
    ちなみに内蔵HDDはhdaからsdaに変更されるから気をつけて。
    ってあ。上で書くの忘れた。
    新カーネルでブートする前に
    /dev/hda1とかで指定しているならfstabの修正忘れないように。
    カーネルが正しくても起動しなくなるよ。

    副作用として、kuro-sataでIDE-SATA変換してても
    hdparm、hddtemp、smartctlでSMARTとかのパラメータ、
    温度なんか見られるようになった。やほーい。
    ※実はこれが主な目的だったんだけど。 

207 :193:2009/02/22(日) 11:48:55 ID:???
    >41氏の玄箱sarge化実況
    うーん、その辺みてなかったからよくわからん。すまん。

    >両方書いておくと、片方は失敗しつつも(warning程度?)
    >どちらかが成功するってことがあったりしない?

    それでもいけるんじゃないかと思うけど、(errorsの指定はいるけど)
    俺はパーティションにラベルつけて、fstabではラベル指定にした。
    e2label /dev/sda1 /bootでつけて
    fstabには
    LABEL=/boot     /boot           ext3    defaults,noatime,errors=remount-ro      1       1

    SWAPはswapoffしてから
    mkswap -L swap /dev/sda3
    LABEL=swap      swap            swap    defaults                                0       0

    ラベルにして困るのは…クラスタ化そふととか動かさないのなら大丈夫じゃない?
    とりあえず、これで2.6.25でも2.6.28.6動くようになってた。
    (もう戻してないのでわからんけど)

    【そのほか】
    ・あと2.6.28.7も普通に動いたよ。
    ・lennyにするならkuroevtdはコンパイルし直し


208 :193:2009/02/22(日) 14:58:55 ID:???
    カーネル2.6.28.7でシャットダウンの電源停止、
    再起動ができるようになった。
    結果からいうと

    ttyS0:制御用
    ttyS1:シリアルコンソール
    というふうに、今までと逆になってた。
    たぶん2.6.28からだと思われ。
    なのでいろいろ書き直し

    ・/etc/inittab
    シリアルコンソール用
    con:2345:respawn:/sbin/getty 57600 ttyS1

    ・/etc/init.d/kuro_boot, halt, reboot, kuroevtd
    制御用
    /dev/ttyS1から/dev/ttyS0に

    ・kuroevtd.c
    lennyでコンパイルすると警告出たりするのでちょっと修正。

    kurobox:/usr/local/src/kuroevtd# diff kuroevtd.c.org kuroevtd.c -c
    *** kuroevtd.c.org      2004-11-13 00:32:13.000000000 +0900
    --- kuroevtd.c  2009-02-22 12:52:29.000000000 +0900
    ***************
    *** 12,18 ****
      #endif /* NOLOG */

      #define BAUDRATE       B9600
    ! #define DEVICE                "/dev/ttyS1"
      #define EVT_POWER_DOWN        "/etc/kuroevtd/powerdown"
      #define EVT_POWER_UP  "/etc/kuroevtd/powerup"
      #define EVT_POWER_PRESS "/etc/kuroevtd/powerpress"
    --- 12,18 ----
      #endif /* NOLOG */

      #define BAUDRATE       B9600
    ! #define DEVICE                "/dev/ttyS0"
      #define EVT_POWER_DOWN        "/etc/kuroevtd/powerdown"
      #define EVT_POWER_UP  "/etc/kuroevtd/powerup"
      #define EVT_POWER_PRESS "/etc/kuroevtd/powerpress"
    ***************
    *** 23,28 ****
    --- 23,31 ----
      #define SEC_BUTTON_PRESS 3
      #define USEC_POLL_TIME (500 * 1000)

    + #include <string.h>
    + #include <stdlib.h>
    +
      struct termios oldtio;
      int fd = 0;

    いたって順調なので玄箱をトイレに戻すよ。
    echo -n "SSSS" > /dev/ttyS0でちかちか。
    echo -n "RRRR" > /dev/ttyS0でちかちか停止。
    コマンドについては以下を参考にさせてもらった。ありがとう
    http://www.dyg.jp/category/kurobox/22.htm 

独自kernelのインストール

270氏作成のkernelとmoduleは必要最低限のオプションしか設定されておらず、各種USB機器やOpenVPNを利用することができない。しかし、最新カーネルに対するパッチも公開されているので、それを用いて独自のkernelを作成することができる。
270氏関連ファイル公開サイト
上記ミラーサイト

新型HGLANへの対応

最近のHGLANではIDEコントローラにTeraStation?と同じITE社製のIT8211を採用し、クロックのずれ対策もなされている。270氏提供のKuroHG用カーネルでは動かないので、ソースを修正のうえコンパイルする必要がある。

ソースの修正点

diff -Nur linux-2.6.19.1-old/config_kuroboxhg linux-2.6.19.1/config_kuroboxhg
--- linux-2.6.19.1-old/arch/ppc/platforms/linkstation.c 2006-12-29 17:28:04.000000000 +0900
+++ linux-2.6.19.1/arch/ppc/platforms/linkstation.c     2006-12-29 18:00:59.000000000 +0900
@@ -310,7 +310,7 @@
        ulong   freq;

 #if defined(CONFIG_KUROBOXHG)
-       freq=32522240;  /* {32.768MHz*(100% - 0.75%)} * 4 / 4 */
+       freq=32768000;  /* 32.768MHz */
 #elif defined(CONFIG_KUROBOX)
        freq=24391680;  /* {24.576MHz*(100% - 0.75%)} * 3 / 4 */
 #else
--- linux-2.6.19.1-old/config_kuroboxhg 2006-12-29 17:28:04.000000000 +0900
+++ linux-2.6.19.1/config_kuroboxhg     2006-12-29 17:47:25.000000000 +0900
@@ -475,12 +475,12 @@
 # CONFIG_BLK_DEV_JMICRON is not set
 # CONFIG_BLK_DEV_SC1200 is not set
 # CONFIG_BLK_DEV_PIIX is not set
-# CONFIG_BLK_DEV_IT821X is not set
+CONFIG_BLK_DEV_IT821X=y
 # CONFIG_BLK_DEV_NS87415 is not set
 # CONFIG_BLK_DEV_PDC202XX_OLD is not set
 # CONFIG_BLK_DEV_PDC202XX_NEW is not set
 # CONFIG_BLK_DEV_SVWKS is not set
-CONFIG_BLK_DEV_SIIMAGE=y
+# CONFIG_BLK_DEV_SIIMAGE is not set
 # CONFIG_BLK_DEV_SLC90E66 is not set
 # CONFIG_BLK_DEV_TRM290 is not set
 # CONFIG_BLK_DEV_VIA82CXXX is not set

U-Boot対応kernelのコンパイル

参考:

mkimageの作成

U-Boot対応のkernelは make uImage で作成するが、このなかで mkimage コマンドが呼ばれる。これは U-Boot のソースツリーに含まれるので、あらかじめコンパイルしてインストールしておく必要がある。

$ wget ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.4.tar.bz2
$ wget http://www.linuxnotincluded.pwp.blueyonder.co.uk/linkstation/downloads/u-boot-1.1.4-list-2.1.0.diff.gz
$ tar jxvf u-boot-1.1.4.tar.bz2
$ cd u-boot-1.1.4
$ zcat ../u-boot-1.1.4-list-2.1.0.diff.gz | patch -p 1
$ export PATH=/usr/local/linkstation/gcc-4.1.1-glibc-2.3.6/powerpc-hdhlan-linux/bin:$PATH
$ make CROSS_COMPILE=powerpc-hdhlan-linux- linkstation_HDLAN_config
$ make CROSS_COMPILE=powerpc-hdhlan-linux- linkstation_HDLAN

makeのバージョンが3.81以上だと以下のエラーが発生する。

powerpc-hdhlan-linux-gcc -g  -Os   -fPIC -ffixed-r14 -meabi -fno-strict-aliasing
 -D__KERNEL__ -DTEXT_BASE=0xFFF00000 -I/home/itou-r/U-Boot/u-boot-1.1.4.hdlan.orig/include
 -fno-builtin -ffreestanding -nostdinc
 -isystem /usr/local/linkstation/gcc-4.1.1-glibc-2.3.6/powerpc-hdhlan-linux/lib/gcc/powerpc-hdhlan-linux/4.1.1/include
 -pipe  -DCONFIG_PPC -D__powerpc__ -DCONFIG_MPC824X -ffixed-r2 -ffixed-r29
 -mstring -mcpu=603e -msoft-float -DTEXT_BASE=0xFFF00000 -Wall -Wstrict-prototypes
 -c -o stubs.o stubs.c
powerpc-hdhlan-linux-ar crv libstubs.a  ppc_longjmp.o ppc_setjmp.o stubs.o
a - ppc_longjmp.o
a - ppc_setjmp.o
a - stubs.o
make[2]: *** No rule to make target `hello_world.srec', needed by `all'.  Stop.
make[2]: Leaving directory `/home/itou-r/U-Boot/u-boot-1.1.4.hdlan.orig/examples'
make[1]: *** [examples] Error 2
make[1]: Leaving directory `/home/itou-r/U-Boot/u-boot-1.1.4.hdlan.orig'
make: *** [linkstation_HDLAN] Error 2

Makefileの解釈が変わったのが原因。こことかこことかここに情報あり。以下のパッチを example/Makefile に当てることにより回避できる。

diff -Nur u-boot-1.1.4.hdlan.orig/examples/Makefile u-boot-1.1.4/examples/Makefile
--- u-boot-1.1.4.hdlan.orig/examples/Makefile   2005-12-17 01:39:27.000000000 +0900
+++ u-boot-1.1.4/examples/Makefile      2007-10-10 05:34:26.000000000 +0900
@@ -56,39 +56,39 @@
 include $(TOPDIR)/config.mk

 SREC   = hello_world.srec
-BIN    = hello_world.bin hello_world
+BIN    = hello_world hello_world.bin

 ifeq ($(CPU),mpc8xx)
 SREC   = test_burst.srec
-BIN    = test_burst.bin test_burst
+BIN    = test_burst test_burst.bin
 endif

 ifeq ($(ARCH),i386)
 SREC   += 82559_eeprom.srec
-BIN    += 82559_eeprom.bin 82559_eeprom
+BIN    += 82559_eeprom 82559_eeprom.bin
 endif

 ifeq ($(ARCH),ppc)
 SREC   += sched.srec
-BIN    += sched.bin sched
+BIN    += sched sched.bin
 endif

 # The following example is pretty 8xx specific...
 ifeq ($(CPU),mpc8xx)
 SREC   += timer.srec
-BIN    += timer.bin timer
+BIN    += timer timer.bin
 endif

 # The following example is 8260 specific...
 ifeq ($(CPU),mpc8260)
 SREC   += mem_to_mem_idma2intr.srec
-BIN    += mem_to_mem_idma2intr.bin mem_to_mem_idma2intr
+BIN    += mem_to_mem_idma2intr mem_to_mem_idma2intr.bin
 endif

 # Utility for resetting i82559 EEPROM
 ifeq ($(BOARD),oxc)
 SREC   += eepro100_eeprom.srec
-BIN    += eepro100_eeprom.bin eepro100_eeprom
+BIN    += eepro100_eeprom eepro100_eeprom.bin
 endif

 ifeq ($(BIG_ENDIAN),y)
@@ -113,7 +113,7 @@

 CPPFLAGS += -I..

-all:   .depend $(OBJS) $(LIB) $(SREC) $(BIN)
+all:   .depend $(OBJS) $(LIB) $(BIN) $(SREC)

 #########################################################################
 $(LIB): .depend $(LIBOBJS)

toolsディレクトリに mkimage コマンドができるので、これをパスが通っているところにコピーし、実行権を設定する。

$ su
# cp tools/mkimage /usr/local/bin

クロスコンパイル

ソースファイルの展開とLinkStation?/玄箱用のパッチ適用済みとする。

$ make ARCH=ppc CROSS_COMPILE=powerpc-hdhlan-linux- oldconfig

- カーネルのオプションを変更する場合
$ make ARCH=ppc CROSS_COMPILE=powerpc-hdhlan-linux- menuconfig

- 変更しない場合
$ make ARCH=ppc CROSS_COMPILE=powerpc-hdhlan-linux- prepare

$ make ARCH=ppc CROSS_COMPILE=powerpc-hdhlan-linux- uImage
$ make ARCH=ppc CROSS_COMPILE=powerpc-hdhlan-linux- modules
$ make ARCH=ppc CROSS_COMPILE=powerpc-hdhlan-linux- INSTALL_MOD_PATH=../module-tmp modules_install

kernel類とモジュール群をtar ballに固める。

$ cp System.map ../System.map-$(kernelversion)-kuroBOX
$ cp .config ../config-$(kernelversion)-kuroBOX
$ cp arch/ppc/boot/images/uImage ../uImage-$(kernelversion)-kuroBOX
$ cd ..
$ tar cjvf kernel-$(kernelversion)-kuroBOX.tar.bz2 System.map-$(kernelversion)-kuroBOX config-$(kernelversion)-kuroBOX uImage-$(kernelversion)-kuroBOX
$ cd modules-tmp/lib/modules
$ tar cjvf ../../../modules-$(kerneversion)-kuroBOX.tar.bz2 $(kernelversion)-kurobx

未整理


添付ファイル: fileflash.c 862件 [詳細] fileu-boot-1.2.0-hd.flash.bin 340件 [詳細] fileu-boot-1.2.0-hd.ram.bin 371件 [詳細] fileu-boot-1.2.0-hg.flash.bin 1251件 [詳細] fileu-boot-1.2.0-hg.ram.bin 1107件 [詳細] fileuloader-2.4.17_mvl21-sandpoint.o 402件 [詳細] fileuloader-2.4.17_mvl21.o 1045件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-20 (木) 19:10:34 (2534d)