2012年8月10日金曜日

ターミナル入力・・・・UART+MMU+割り込み(2)

続き。

■仮想メモリ割り当て
設計したメモリマップにしたがって固定のページテーブルを作成する


■割り込み初期化手順
(1)CPUのIRQ割り込みハンドラを登録
(2)CPUの割り込み有効化
 asm ("cpsie i"); でIRQ有効化

(3)UARTにクロック供給
(4)UARTのIRQハンドラを登録
(5)UARTのIRQ出力有効化
 受信割り込みのみ有効化する。
  OMAP3530仕様書の2693ページ 17.6.1 UART/IrDA/CIRレジスタ IER_REGを参照
  IER_REGに1(RHR_ITビット)を書き込み

■割り込みハンドラ
IRQハンドラだけ作成
IRQ以外の割り込みは使用しないのでnop
ハンドラではレジスタをスタックに保存してIRQ処理に飛ぶ

.extern interruptHandler
.global interruptVector

_irq_entry:
    stmfd sp!, {r0 - r12, lr};

    mov r0, #6;
    bl interruptHandler;

    ldmfd sp!, {r0 - r12, lr};
    subs pc, lr, #4;

interruptVector:
    nop;    // Reset
    nop;    // Invalid code
    nop;     // Software Service.
    nop;     // Prefetch Abort
    nop;    // Data Abort
    nop;
    ldr pc, =_irq_entry;
    nop;    // Fast IRQ

■UART割り込みハンドラ
 UARTドライバの割り込みハンドラでは割り込み時にRHRから1文字読み取ってバッファに記録

■サンプル
ソースコード

2012年6月4日月曜日

ターミナル入力・・・・UART+MMU+割り込み

UARTの制御と割り込みを使ってターミナルから文字列を入力してそれを表示してみる。

■実装方針
1、メモリマップ
 物理メモリのアドレス=仮想アドレスを基本とする。
BeagleBoardは物理メモリが0x8000 0000~0x8FFF FFFF の256Mbyte
割り込みベクタは上位ベクタ0xFFFF 0000が使えるように割り当てる。
ハードウェアレジスタは256M分のメモリの上位、すなわち0x90000000~に割り当て
コードとデータはオフセット0x400000~に配置。その下をスタックとする
 以上の方針によりメモリマップは以下のように設定


2、割り込み駆動
UARTへの入力はポーリングによってバッファの状態を確認するのではなく、割り込みで入力を検知する。
BeagleBoardの端子はUART3に接続なのでIRQ74に対応するハンドラを登録する。
OMAP35x Technical Reference Manual 10.3.2 Interrupt Request Linesを参照

■メイン処理
(1)UART入力バッファが空か確認
(2)読み込み可能フラグが立つまで無限ループ
 →IRQ74が発生したらフラグを立てる
(3)バッファから1文字読み込み
(4)読み込んだ文字をUART出力
(5)(1)に戻る


2012年5月13日日曜日

割り込み

次はCPU割り込み処理を実装する。
ARMには7種類の割り込みがある。
リセット、未定義命令、ソフトウェア割り込み、プリフェッチアボート、データアボート、IRQ、FastIRQ

割り込みハンドラは割り込みベクタにアドレスを設定する。
割り込みベクタは通常は0x00000000に、上位ベクタ機能を有効にした場合は0xFFFF0000にある
 ARM v7 Architecture Reference Manualの54ページA2.6 例外

割り込みからの復帰はlrレジスタを使う。しかし割り込みの種類によって復帰命令が異なる
以下の表に割り込みの一覧と復帰命令を記載する

■割り込みベクタ
割り込み オフセット 復帰命令 説明
リセット 0 なし CPUリセット時に実行される
未定義命令 4 movs pc, lr CPUがサポートしていない不正な命令を実行しようとした場合に呼び出される
ソフトウェア割り込み 8 movs pc, lr ソフトウェア割り込み命令SWIを実行した場合に呼び出される。大方の場合カーネルサービス呼び出しに使用する
プリフェッチアボート 12 subs pc, lr, #4 命令コードをフェッチしようとしたときにコードを読み出そうとしたアドレスからメモリ読み出しが出来なかったときに呼び出される。MMUが有効化していて仮想アドレスのエントリが不在となっている場合に発生する
データアボート 16 subs pc, lr, #8 読み出そうとしたアドレスからメモリ読み出しが出来なかったときに呼び出される。MMUが有効化していて仮想アドレスのエントリが不在となっている場合に発生する
未使用 20
未使用の割り込みエントリ
IRQ 24 subs pc, lr, #4 ハードウェアからIRQが発生したときに呼び出される。
FastIRQ 28 subs pc, lr, #4 ハードウェアからIRQが発生したときに呼び出される。

■割り込みベクタ設定例
アセンブラ命令で割り込みベクタの各エントリに割り込みハンドラへのジャンプ命令を設定する。
割り込みベクタ先頭をinterrupt_vector_startとすると以下のように記述する

interrupt_vector_start:
    ldr pc, =_reset;
    ldr pc, =_invalid_opcode;
    ldr pc, =_service;
    ldr pc, =_prefetch_abort;
    ldr pc, =_data_abort;
    nop;
    ldr pc, =_irq;
    ldr pc, =_fast_irq;



■上位ベクタ
通常の割り込みベクタアドレスは0x00000000だが、これを上位アドレス0xFFFF0000に移すことができる。上位ベクタ機能はCP15 C1 Control RegisterのVビットを1にセットすることで有効化できる
当然のことながらMMUを有効化して0xFFFF0000の仮想アドレスに対するメモリを設定しておく必要がある。

31   30     29     28      27    26    25  24                     13 12 11 10        2    1   0
+---------------------------------------------------------------------+
| 0 | TE | AFE | TRE | NMFI |  0  | EE |            0          | V | I | Z |    0    | C | A | M |
+---------------------------------------------------------------------+


■上位ベクタ有効化

unsigned long value;
asm("mrc p15, 0, %0, c1, c0, 0" : "=r"(value));

value |= (1 << 13);

asm("mcr p15, 0, %0, c1, c0, 0;" : : "r"(value));

2012年5月7日月曜日

MMU有効化

ページテーブルのフォーマットがわかったのでMMUを有効化してみる
有効化はコプロセッサ操作で行う。


MMUを有効化するコプロセッサレジスタはCP15レジスタC1 Control Register
Cortex-A8 Technical Reference Manualの122ページ 3.2.25 c1, Control Register参照

■CP15 C1 Control Registerフォーマット


31   30     29     28      27    26    25  24                     13 12 11 10        2    1   0
+---------------------------------------------------------------------+
| 0 | TE | AFE | TRE | NMFI |  0  | EE |            0          | V | I | Z |    0    | C | A | M |
+---------------------------------------------------------------------+

MMUを有効化する場合はTTBRレジスタにページテーブルの物理アドレスを指定した状態でCP15 C1レジスタのMビットを1にする。

コプロセッサの値変更はアセンブラコプロセッサ命令を使用する


■コプロセッサレジスタ値取得

unsigned long value;

asm("mrc p15, 0, %0, c1, c0, 0" : "=r"(value));


■コプロセッサレジスタ値設定
unsigned long value = 設定値;

asm("mcr p15, 0, %0, c1, c0, 0;" : : "r"(value));


■MMU有効化

unsigned long value;
asm("mrc p15, 0, %0, c1, c0, 0" : "=r"(value));

value |= 1;

asm("mcr p15, 0, %0, c1, c0, 0;" : : "r"(value));

2012年4月13日金曜日

仮想メモリ・・・その準備

仮想メモリの実現を2方法検討

(1)タスク毎に独立した4Gbyteのメモリ空間
この場合はタスクスイッチ時にページテーブルを切り替える
全てのタスクが広大なメモリ空間を扱えるが、タスクスイッチコストが重い

(2)カーネルとユーザータスクが4Gbyteのメモリ空間を共有
  カーネルAPI呼び出し時にページテーブルを切り替える必要がない
ただし、カーネルとユーザーでメモリ空間を折半することになる


まずはいずれの場合でも必要となるページ機能有効化とページテーブルの設定方法を確認
例によって仕様書

■Cortex-A8仕様書
Cortex-A8 Technical Reference Manual


ページテーブルの物理アドレスはARMコプロセッサで設定する
設定するコプロセッサレジスタはTranslation Table Base Register(略してTTBR)

136ページ 3.2.31 c2, Translation Table Base Register 0
137ページ 3.2.32 c2, Translation Table Base Register 1

TTBR0がユーザープロセス用、TTBR1がOS用ということらしい。
TTBR0とTTBR1のどっちを使うか、または両方使うかはTranslation Table Base Control Register(略してTTBCR)で設定する
138ページ 3.2.33 c2, Translation Table Base Control Register

OS用であるTTBR1は固定で16kbyteのサイズを持つテーブルへのアドレスを保持する。
それに対してTTBR0が指すテーブルはTTBRC.Nビットで指定されるサイズになる。このサイズは128byte~16kbyteである。
N=0の時に最大サイズ16kbyteになる。この時はTTBR0で指定されるページテーブルのみでアドレス変換が行われる。これはARMv6仕様の仮想メモリ機構と同一動作となる。

■TTBRフォーマット

31                           14 13               5 4       3   2   1   0
+------------------------------------------------+
|    Base Address           |         0          | RGN | P | 0 | C |
+------------------------------------------------+

ページテーブルは16kbyteのサイズ(TTBCRで変えられる)
RGN、P、Cはページテーブルのキャッシュに関する設定
面倒だからオール0(キャッシュしない)でまずは試す

ページテーブル内のフォーマットについてはARM v7 Architecture Reference Manualを参照する

■TTBCRフォーマット

31                                               6     5     4   3        0
+------------------------------------------------+
|                        0                         |PD1|PD0| 0 |    N   |
+------------------------------------------------+

セキュリティ拡張機能が実装されている場合の話だが、PD0, PD1はTTBR0,1それぞれを使ってアドレス変換をするかどうかを指定する。
1だと変換しない。例えばPD0=1とするとTTBR0によるページ変換をしなくなる。
もしTTBR0で指定されるページテーブルでアドレス変換しなければならない場合はページフォールトが発生する。

セキュリティ拡張機能が実装されていない場合はPD0、PD1は存在しない。NビットのみがTTBCRに存在することになる。

NはTTBR0のサイズを指定、すなわちTTBR0でアドレス変換をするメモリ範囲を指定する。
12-NがTTBR0を使ってアドレス変換する第1レベル記述子のインデックス範囲になる。
N=0なら12ビット範囲(0~0xFFF)、すなわち全第1レベル記述子範囲がTTBR0になる。
N=7なら5ビット範囲(0~32)、すなわち第1レベル記述子の最初の方、メモリアドレスで言うと0~0x2000000(2^5*256*4096)がTTBR0になる。

Linuxカーネルみたいに0xC0000000~0xFFFFFFFFをカーネル領域としてTTBR1に変換させたい場合は・・・、残念ながらN=1で0~0x80000000がTTBR0範囲となるためこの仕組みでは実現できない。

■ページテーブルフォーマット
ARM v7 Architecture Reference Manualの729ページ B4.7.4 第1 レベル記述子

第1レベル記述子はコアースページテーブル、セクションテーブル、スーパーセクションテーブルの3種類がある
とりあえずコアースページテーブルで実装する。


(コアースページテーブル)

31                                                10  9    8          5 4  2 1   0
+------------------------------------------------------+

|    第2レベル記述子 Base Address       | IMP | Domain |  0  | 01  |
+------------------------------------------------------+

IMPの部分が何を意味するか良くわからない。
どうもユーザーが勝手に使って良いビットのようだが・・・。とりあえず0にしておく。
Domainはアクセス権に関係する設定。
別途ドメインアクセス制御レジスタ(DACR)を使ってあるメモリ領域ごとにアクセス権を設定できる。まずは0を指定して全領域ドメイン0で動かす。


■第2レベル記述子
ARM v7 Architecture Reference Manualの733ページB4.7.7 第2 レベル記述子 - コアースページテーブルのフォーマット

1ページメモリを4kbyteで扱う場合はスモールページを使う


(スモールページ)

31                                                12 11 10 9    8 7    6 5     4  3   2   1  0
+---------------------------------------------------------------+
|    物理メモリページ Base Address       | AP3 | AP2 | AP1 | AP0 | C | B | 10 |
+---------------------------------------------------------------+

APはアクセス権設定に関係する。詳細は 710ページ B4.3 メモリアクセスの制御を参照
Cはキャッシュ可能か否か。1で可能
Bはバッファ可能か否か。1で可能


上記は古いARMのフォーマット。Cortex-A8はVMSAv7なので以下のフォーマット

31                                                12  11  10     9    8    6 5  4   3   2   1  0
+----------------------------------------------------------------+
|    物理メモリページ Base Address       | nG | S | APX | TEX | AP | C | B | 10 |
+----------------------------------------------------------------+

C,Bの詳細は713ページ B4.4.1 C、B、TEX のエンコードを参照

2012年4月10日火曜日

coutではなくbout

UART3からデータ出力できるようになったので文字列出力ライブラリを作成する
C++では標準でcoutという出力ストリームがあるのでこれを真似る
BeagleBoardなのでboutという名前にしておこうか

実装は適当なC++のiostreamヘッダーを参考にして出力先がUARTになるようなものにする

UARTからHello World

次はUART出力からターミナルにHello Worldと表示することを目指す
まずは仕様書の確認

■BeagleBoard仕様書
BeagleBoard SRM


■OMAP3530仕様書
OMAP3530はBeagleBoardに搭載されているCortex-A8のマイコン
OMAP35x Technical Reference Manual


OMAP3530仕様書のを見ると2638ページ「UART/IrDA/CIR Overview」からUARTデバイスは3つ存在することがわかる
また、BeagleBoard仕様書の23ページ「5.18 RS232 Header」からBeagleBoardのシリアル端子はUART3に繋がっているとわかる
したがってUARTからPCのシリアルポートにHello Worldを出力するにはUART3を制御することになる

UART3を制御する手順は以下の通り

■制御手順
(1)OMAP3530 Perブロックの電源をON
OMAP3530仕様書の582ページを参照
PM_PWSTCTRL_PERレジスタのPOWERSTATEに0x3を設定

(2)OMAP3530 Perブロック内UART3にクロック供給
供給するクロックはFunctionクロックとInterfaceクロックの2つ
  OMAP3530仕様書の492ページを参照
  CM_FCLKEN_PERレジスタとCM_ICLKEN_PERレジスタのUART3ビットを立てる

(3)UART3初期化
OMAP3530仕様書の2697ページを参照
[1]MDR1_REGレジスタに0x7を書き込んでUART無効化(2716ページ)
  [2]LCR_REGレジスタに0x83を書き込んでConfigモードAに移行(2707ページ)
  [3]DLL_REGレジスタ、DLH_REGレジスタの2つでボーレート設定(2697ページ、2701ページ)
      DLL, DLHに設定する値の計算は2672ページ 17.4.4.1.1 UART Clock Generation: Baud Rate Generationを参照
    (*)x16モードで動作させた場合にボーレートを115200にするのはDLL=0x1A, DLH=0x00
  [4]LCR_REGレジスタに0x3を書き込んで通常モードに戻る
  [5]MDR1_REGレジスタに0を書き込んでx16モードで動作開始

(4)出力バッファの空き確認
LSR_REGレジスタのTX_FIFO_Eビットがクリアされるまでループする(2710ページ)

(5)文字を出力バッファに書き込む
   THR_REGレジスタに文字コードを書き込む(2698ページ)

(4)(5)を繰り返すことで文字列を出力


注意点はUARTレジスタは全て8ビットでアクセスすること

■サンプル
ソースコード




2012年3月27日火曜日

デバッグ実行

作成したwhileループするだけのアプリケーションをEclipseからデバッグ実行する

■手順
(1)OpenOCDを起動
 以前にセットアップしたOpenOCDを起動する
 Eclipseのメニュー「Run」-[External Tools」から「openocd」を選択

(2)Eclipseデバッガ起動設定
 Eclipseのメニュー「Run」-「Debug Configurations」を選択
 左のリストから「GDB Hardware Debugging」を選択して新規作成する

 Application には作成したアプリケーションkernel.elf を選択する


 DebuggerにはG++LiteをインストールしたフォルダにあるGDBを選択する
 OpenOCDはTCPポート3333で動作しているのでPort numberは3333にしておく


 Startupはデフォルトの設定に加えて「monitor reset halt」の記述を追加
 

 以上でデバッグ実行の設定は終わり


(3)ブレークポイントの設定
 ちゃんとブレークするかどうかMain.cpp#main_start()のwhileループにEclipse上からブレークを張る

(4)デバッグ実行
 (2)で設定したデバッグ設定でデバッグ実行を開始





 実行を開始するとブレークした状態で始まる。Debugウィンドウの再生ボタンぽいのを押して実行を継続するとMain.cppのwhileループに張ったブレークポイントまで実行して再度ブレークする

 とりあえずEclipseでソース編集、デバッグ実行するところまで環境が整った

実装開始!

まずは起動してすぐwhileループするプログラムを書く
電源ONして最初に動き出す処理はC++ではかけないので最初だけアセンブラとCを使う

■エントリポイント(Start.S)
.global start

.extern main_start

/**
 * BeagleBoard は物理メモリが0x80000000~にある.
 *
 * プログラムコードを0x80040000からにしてそれ以下はスタックやら適当に使う
 */
start:
    ldr sp, =0x80040000
    ldr pc, =main_start


■メイン関数(Main.cpp)
extern "C" {

void main_start() {
    while (1) {}
}

}


■コンパイル
上記2つのアセンブラとCのソースコードをコンパイルする。
実装方針で示したようにC++の例外機構は使わない。
またデバッグがしやすいように最適化もしない。
よってコンパイル時は以下のオプション

arm-none-linux-gnueabi-gcc -c -O0 -g -mcpu=cortex-a8 -mabi=aapcs-linux -Wall -fno-exceptions -fno-enforce-eh-specs -fno-rtti Start.S Main.cpp

-mabi=aapcs-linuxオプションをつけないとリンク時にエラーが起きてしまう。
生成するオブジェクトファイルの形式に関する指定だと思われるが調査は後回し

■リンク
リンクするときにはプログラムをロードする先がBeagleBoardのメインメモリが存在するアドレスになるようにオプションを指定する。
又、-nostartfiles を指定して通常アプリ用のライブラリのリンクを禁じる
デバッグ用にマップファイルも生成するようにした時は以下のオプション

arm-none-linux-gnueabi-ld -nostartfiles -e start -Ttext 0x80040000 -Map kernel.map -o kernel.elf Start.o Main.o


2012年3月23日金曜日

実装は・・・

実装方針

■言語
 C++。Cよりコードを書かずに済むから
 アセンブラが必要な部分もあるが、可能な限りC++で記述する
 C++例外機構は面倒なのでまずは使わない

■メモリ管理
 MMUによるページ管理を行う
 ただし、実装が軌道に乗るまではページ管理はしない

■CPU例外機構
 実装が軌道に乗るまで使用しない。不具合で例外が発生した場合は無限ループに突入させる
 ページ管理が出来るようになった後に正式な形に実装する

■マイルストーン
1、デバッガからスタートアップコードの起動
  無限ループするコードをデバッガで起動して実行できるようにする

2、UARTデバイスドライバの作成
  ターミナルソフトと通信できるようにするためのドライバを作成する

3、printf, cout的な文字列出力処理を作成

4、ページ管理機能作成

5、CPU例外処理機構実装

6、マルチタスク化

7、VGAドライバ作成
  DVI出力から画面表示できるようにする。
  まずは矩形描画程度まで

8、SD/MMCドライバ作成
  MMCモードでのデータ転送が出来るドライバを作成する

9、ファイルシステムドライバ作成
  一般的なSDカードのファイルシステムFATに対応する

10、ファイル入力機能作成
 SDカードからファイルを読み込めるようにする

11、画像ファイルの画面表示
 JPEGファイルを読み込んで画面に表示できるようにする
 
 以上ここまでで、簡易画像ビューワを実現するところまでまずは実装する

2012年3月14日水曜日

デバッグ準備 - OpenOCD起動

いよいよデバッガを起動させる。
デバッグにはOpenOCDとCode Sourcery G++Liteが必要。

まずEclipseからOpenOCDを起動させる設定を行う
Eclipseメニューの[Run]-[External Tools]-[External Tools Configurations] を選択
Programとして新規項目を作成する







LocationにOpenOCDの実行ファイルを指定する
Working Directoryは適当に。
ArgumentはFlyswatterとBeagleBoardの組み合わせで使用するので以下のようにする

-f interface/flyswatter.cfg -f board/ti_beagleboard.cfg

[Run]ボタンを押して実行したら以下のようなコンソール表示が出たらOK


Open On-Chip Debugger 0.4.0 (2010-02-22-19:05)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.berlios.de/doc/doxygen/bugs.html
RCLK - adaptive
Warn : omap3530.dsp: huge IR length 38
RCLK - adaptive
trst_only separate trst_push_pull
Info : RCLK (adaptive clock speed) not supported - fallback to 1000 kHz
Info : JTAG tap: omap3530.jrc tap/device found: 0x0b7ae02f (mfg: 0x017, part: 0xb7ae, ver: 0x0)
Info : JTAG tap: omap3530.dap enabled
Info : omap3530.cpu: hardware has 6 breakpoints, 2 watchpoints
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011140
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x54011150
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x540111c0
Error: JTAG-DP STICKY ERROR
Error: MEM_AP_CSW 0x2800042, MEM_AP_TAR 0x540111c0

Eclipseの準備

ソースコードの作成、デバッグは全てEclipse環境で行う。
そのための下準備。

まずはCDTプラグインをインストールする。






次にCDTプラグインのオプションであるHardware Debuggingプラグインを追加する
利用可能なアップデートサイト一覧からCDTを選択





そして、Hardware Debuggingを選択してインストール




これで準備は完了


2012年3月10日土曜日

ドライバのインストール

FlyswatterはPCとUSBで接続。その際にドライバをインストールする必要がある。
ドライバはOpenOCDをインストールしたフォルダにある

C:/Program Files/OpenOCDにインストールしたとすると
C:/Program Files/OpenOCD/0.4.0/drivers/libusb-win32_ft2232_driver-***.zipというのがある。これがドライバ。
これを解凍してドライバインストール画面から選択すればOK

インストールするとデバイスマネージャーで2つのデバイスとして認識される。
USB Serial Converter AとB
このうちUSB Serial Converter Aのドライバを手動で変更する

デバイスマネージャーでUSB Serial Converter Aを選択して「ドライバの更新」→「ドライバを手動で検索してインストール」→「一覧から選択」

ここで、一覧の中から「TinCanTools Flyswatter (Channel A)」を選択してインストールする。

・・・WindowsXPはこれで素直にインストールできるのだがWindows7では出来ない
ドライバに署名がないといわれて怒られる。
仕方ないのでWindows7はテストモードにして署名を回避する。ただし、セキュリティ的に問題ありなのかもしれない・・・

テストモードへはコマンドプロンプト(管理者権限で実行)からのコマンド実行で入れる
bcdedit /set TESTSIGNING ON

テストモードから抜ける場合は
bcdedit /set TESTSIGNING OFF

開発環境

BeagleBoardとFlyswatterで開発するためのソフトウェア環境について

■OS
 Windows XP もしくは 7

■コンパイラ
 CodeSourcery G++Lite ARM版

■デバッガ
 Open OCD 0.4.0
 この辺りにビルド済みのOpen OCDバイナリがある

■統合開発環境
 Eclipse 3.7 Indigo
 ソースコードの編集、Open OCDと連携してのデバッグ実行のために使用

狩のための武装

何はともあれBeagleBoardとデバッグツールの購入
デバッグツールにはTincan tools社Flyswatterを使うことにした。

BeagleBoardはDigiKeyで注文。Flyswatterも同時に注文したかったけど残念ながら扱っていない様子
仕方ないのでFlyswatterは個人輸入サービスを使うことにした。
UNIPOSで扱っていたのでこちらで注文。
BeagleBoard接続用にBeagleBoard Adapter Kitというオプションがあるので、それも合わせて注文

今なら円高なのでどちらも安めに買えるかも♪

そうして届いたBeagleBoardとFlyswatterがこちら。


旅立ち


BeagleBoardという組み込み基板がある。
BeagleBoardといえばLinuxを動かしたり、Androidを動かしたりという記事を良く見かける。
それはそれで面白いのだが、出来ればOSを0から自分で作ってみたいと思う。

そこで無謀かもしれないがBeagleBoard上で動くOSを0から作る事にチャレンジする。
このブログはOSを「動かす」のではなく「作る」作業の記録。
主に自分のための作業記録だが、誰か他のエンジニアの役に立てば幸いである。

さぁ、では行こうか