2011年3月7日月曜日

カーネルモジュールをマケ(M001)

一応、私が試したM001用のカーネルモジュール構築手順を書いてみる。
あくまでも、手順の一例なので、これをそのまんま実行すればできるというものじゃないことを先にお断りしておく。
と言うのも、記憶を頼りに書いてる部分もあるので抜けてたりする(笑)
さらに、自力で調べる部分もあったりして手抜き満載。
最低、Linuxの知識とカーネルソースの泳ぎ方を知らないと手に負えない部分もあるのでそのつもりで読んでくだされ( ・ω・)

まず、クロスコンパイル環境を構築しておくこと。
環境へのPATH通しも忘れずに。

ARMクロスコンパイル環境
http://m001etc.blogspot.com/2011/03/arm.html

まず、、、
カーネルソースを展開

http://github.com/projectgus/kernel_wm8505

から、カーネルソースを取得してくる。
WM8505用のカーネルソース一式。

私が以前、拾ったのは。
projectgus-kernel_wm8505-v2.6.29-261-g59df0a4.tar.gz

今見たら、
projectgus-kernel_wm8505-v2.6.29-270-g33e33aa.tar.gz
ってのがそうみたい。

以下、ディレクトリ名など適当に読み替えてね。

mykernel以下に展開

# mkdir ~/mykernel
# cd ~/mykernel
# tar zxfv projectgus-kernel_wm8505-v2.6.29-261-g59df0a4.tar.gz
# cd ~/mykernel/projectgus-kernel_wm8505-59df0a4

READMEを読む。

カーネルコンフィグレーションの方法とかいろいろ書いてるのでチェックしておく。
とりあえず、M001のファクトリーコンフィグを雛形にドライバを作ってモジュール化する.configを作ってみる。

取得したカーネルソースだけど、これ一式でM001用カーネルを作ることはできる。
実際、M001 Debian のカーネルはこれがベースになってる。
でも、Androidについては、現状のカーネルを置き換えるまでには情報がなく、そのまま置き換えるのが難しい。
そこで、考え方を変えて、モジュール化できるドライバだけを makeして、現状のM001に移植できないか?できるだろ!?
という方針で進めていく。

まず、configの雛形をコピー

# cp arch/arm/configs/eken_m001_factory_configuration .config
# make menuconfig

configの内容だけど、今回は USB Serial の CP2101ドライバを作りたいので、目標のCONFIG値がセットされるように操作すれば基本的にOK
余計なところは触らない。。。。
ま、ちょっとくらいなら触っても、、、(´・ω・`)死んでもしらん(笑)

具体的な設定は、

Device Drivers -> USB support -> USB Serial Converter support -> USB CP2101 UART Bridge Controller

を "M" 設定(モジュール)する。
他にもよく使われそうな、コントローラの名前が見えるねー(^_^;

さて、 .config をセーブしてカーネルコンフィグはOK
ちなみに、設定されるべき define は

CONFIG_USB_SERIAL_CP2101=m

んで、カーネルバージョンの詐称をする。
カーネルは自分が知ってるドライバしかロードしないので、カーネルとドライバのバージョンを合わせておく必要がある。
とりあえず、Makefile の記述を下記のように直す。

VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 29
EXTRAVERSION = -00236-g4f8dbbb-dirty

dirtyな捏造( ̄ー ̄)
EXTRAVERSIONは端末情報のカーネルバージョン見れば分かる。

以上。ビルド準備完了。

んじゃ、make


# make via_obj

これはなんだろう?ソース読んでないからわかんないケド、READMEにそうすれと書いてあった(笑)必要ないかも(^_^;

んで、モジュールを作る。

# make modules ARCH=arm CROSS_COMPILE=arm-none-eabi-

しばらく待つと出来上がり。
できたモジュールは各モジュールソースのディレクトリ内にできてるはずなので探すべし。

さて、実際に出来上がった cp2101.ko を実機にコピーして手動で insmod してやると、

USB Serial support registered for cp2101
usbcore: registered new interface driver cp2101
cp2101: v0.07:Silicon Labs CP2101/CP2102 RS232 serial adaptor driver

こんな具合にドライバが組み込まれる。

んでもって、USBにデバイスを接続すると、

usb 2-2: new full speed USB device using uhci_hcd and address 2
usb 2-2: configuration #1 chosen from 1 choice
cp2101 2-2:1.0: cp2101 converter detected
usb 2-2: reset full speed USB device using uhci_hcd and address 2
usb 2-2: cp2101 converter now attached to ttyUSB0

こんな感じで、シリアルポートとして認識され、/dev/ttyUSB0 が割り当てられているのがわかる。


以上。

簡単に見えるけど、実際はエラーが出たりして細かい修正を手動で行う必要があったりするかも。
それと、何でもモジュール化できるか?と言うと、そうではなくて、カーネル内に内蔵されているモジュールによっては作成できないものもあるし、ロードが拒否されるものもあるだろう。
この辺りは、情報がないので試してみるしか方法がない。

手探りでトライ!
(・∀・)

2 件のコメント:

  1. ありがとうございます。早速ドライバ作成の参考にさせていただきます。

    返信削除
  2. こばんわん(`・ω・´)
    いへいへ、役立つかどうかは分かりませんけど(^_^;
    factory_configurationが正しいとして、それを見れば大体どんな具合なのか分かると思います。
    少なくとも、これでmakeして動かしてるので大丈夫とは思います。

    返信削除