« 風邪? | Main | ALIX2 BIOS update »

December 01, 2007

弁当箱サイズFreeBSD

仕事が忙しすぎて手につかなかったのですが、なんとか。

少し前から計画していた弁当箱サイズのFreeBSDの箱を作成。

物はPC Engines ALIX2を利用。7v-18v 1A程度の電源で動きます。
本当はWRAPを狙っていたんですけどね。
B5の紙より小さいわけですが、以前に使っていたPentium200よりよっぽど速い。

http://ytw.jp/content/view/61/39/
http://www.ytw.co.jp/catalog/default.php?cPath=38

FreeBSD 6.2-Rを使う場合、癖があるので少しメモ。

■EHCIのkernel panic
GENERIC KERNELではUSBのEHCIの部分でpanicするので、他のPCでEHCIを外したkernelを作り、それをインストールしておく。

■ブートローダ
標準のは動かないので、ports/sysutilsからgrubをインストールして利用。--force-lbaオプションを付ける。メニューは以下の感じ。

timeout 3
default 0

serial --unit=0 --speed=9600
terminal --timeout=3 serial

title FreeBSD-6
root (hd0,0,a)
kernel /boot/loader

■シリアルコンソール
comconsoleを利用するので/etc/ttysをいじって、/boot/loader.confに「console=comconsole」を追加して、/boot.configに「-h」を記述。/etc/ttys はconsoleの項目を利用。

console "/usr/libexec/getty std.9600"   cons25  on secure

■reboot失敗 その1
rebootすると「Keyboard reset did not work, attempting CPU shutdown」とか言われるので、/usr/src/sys/i386/i386/vm_machdep.cを見て、kernel confに「options BROKEN_KEYBOARD_RESET」を追加。

■reboot失敗、その2
更に、reboot時にreset部分で「Fatal double fault:」を起こすのでLinuxのkernel sourceからreset部分をでっちあげて移植。(stable版に追加されつつあるよーな気もするのだがresetは未だ対応してなかった。)変更部分は次の様な感じ。

/usr/src/sys/i386/include/cputypes.h

#define CPU_GEODE1100   17      /* NS Geode SC1100 */
#define CPU_GEODELX     18      /* AMD Geode LX */

末尾を追加

/usr/src/sys/i386/i386/vm_machdep.c

cpu_reset_real()
{
        u_int64_t msreg;
<snip>
        if (cpu == CPU_GEODE1100) {
                /* Attempt Geode's own reset */
                outl(0xcf8, 0x80009044ul);
                outl(0xcfc, 0xf);
        } else if ( cpu == CPU_GEODELX) {
                msreg = rdmsr(0x4c000014);
                msreg |= ((0xde << 16) | (1<<14) | (1<<13) | (1<<0));
                wrmsr(0x4c000014, msreg);
        }

u_int64_t msreg;と最後の else if 以降を追加。

/usr/src/sys/i386/i386/identcpu.c

                strcpy(cpu_model, "AMD ");
                switch (cpu_id & 0xFF0) {

(snip)

                case 0x5a0:
                        strcat(cpu_model, "Geode LX");
                        cpu = CPU_GEODELX;
/*                      tsc_is_broken = 1;*/
                        /*
                         * Make sure the TSC runs through suspension,
                         * otherwise we can't use it as timecounter
                         */
                        wrmsr(0x1900, rdmsr(0x1900) | 0x20ULL);
                        break;

こちらはstableのsource?から拝借。 tsc_is_brokenはstable sourceを見つけるまで自分が勝手に使っていたコード。

う~ん…AKI H8+uClinuxでやろうとしていることを、こっちでやる方が楽な気がしてきた…。H8のuClinuxは開発環境作るだけで苦労し過ぎ。

|

« 風邪? | Main | ALIX2 BIOS update »

Comments

みんな の プロフィールは、アクセスアップをお手伝いするサイトです。
http://blog.livedoor.jp/mipurofi/


より多くのひとに貴方のブログを見てもらえます。

Posted by: みんな の プロフィール | December 05, 2007 at 04:08 AM

Post a comment



(Not displayed with comment.)




« 風邪? | Main | ALIX2 BIOS update »