L-Card+16Mでドライバーモジュールを動かす
L-Card+で実績があるドライバーを
L-Card+16Mで試してみたところ、
kernelがtrapで止まってしまいました。
その原因と解決方を調べましたので、報告します。
まちがい、もっと良い解決方法など
ありましたら、教えて下さい。
- insmodの問題
L-Card+16Mのinsmodコマンド(実体は busybox)は、
問題があって動きません。
insmodを作るを参照し、できた insmod.staticを
L-Card+16Mに転送し、使用して下さい。
- こけ方
上述のinsmodでカーネルのモジュールの組み込みは
できますが、デバイスにアクセスしてみると、
こけます。こんな感じです。
あとは、電源を入れ直して rebootするしかありません。
- こける場所
こける場所を探して行くと、
MOD_INC_USE_COUNT でこけることが、わかりました。
さらに調べて行くと、
atomic_addが怪しそうです。
CONFIG_CPU_HAS_LLSCのマクロの有無で
動作が違います。
古いL-Card+のソースで調べると、このマクロは定義されていませんが、
L-Card+16M添付のカーネルソースの設定のデフォルトでは、
定義されるようです。
- 対策
- cp config.l-card .config
- make menuconfig
- 何も修正せず、kernelのconfigurationをセーブして、exit
- make dep
- mipsel-linux-gcc用の include/linux, include/asm以下を更新。
インストール時にcp -r したのであれば、再度 cp -r.
シンボリックリンクを張っているのであれば何もしないで良い。
- ドライバーモジュールを再コンパイルする。
|