トップ «前の日記(           ) 最新 次の日記(           )» 編集

L-CardAおぼえがき


            デバイスドライバ関連

_ I/Oポート

<CD-ROOT>/monitor/src/L-CardA/vr4181a.hに以下のような記述を発見.これを元にGPIOをたたけば良いのだろうか?

#define VR4181A_INTCS_BASE      0xaa000000
#define INTCS(a)                (VR4181A_INTCS_BASE+(a))
  :
#define VR4181A_GPMODE0         INTCS(0x00b300)

下のあやしいファイルを探訪中,<CD-ROOT>/linux/include/asm-mips/vr41xx/toadkk-tcs8000.hにI/Oアドレス空間の定義を発見.このファイルをincludeしてドライバを書けば良いらしい.

対応表
拡張バス1ピンNo. VR4181A信号名 レジスタ名 I/Oアドレス
51〜65(奇数) GPIO40〜47 GPMODE5 0x00b30a
52〜66(偶数) GPIO0〜7 GPMODE0 0x00b300
67,69 GPIO48,49 GPMODE6 0x00b30c
68,70 GPIO8,9 GPMODE1 0x00b302

_ あやしいファイル一覧

<CD-ROOT>/linux/以下でTCS8000用の修正が入っていると思われるファイルの一覧

$ find . -type f -exec grep -q TCS8000 {} \; -print
./arch/mips/config-shared.in
./arch/mips/kernel/head.S
./arch/mips/kernel/setup.c
./arch/mips/Makefile
./arch/mips/vr41xx/common/bcu.c
./arch/mips/vr41xx/common/giu.c
./arch/mips/vr41xx/common/icu.c
./arch/mips/vr41xx/common/Makefile
./arch/mips/vr41xx/common/reset.c
./arch/mips/vr41xx/common/serial.c
./arch/mips/vr41xx/toadkk-tcs8000/init.c
./config
./drivers/mtd/maps/vr4181a-flash.c
./drivers/net/ne.c
./drivers/pcmcia/vr4181a_busops.c
./drivers/pcmcia/vr4181a_generic.c
./drivers/pcmcia/vr4181a_generic.c.XXX
./include/asm-mips/bootinfo.h
./include/asm-mips/serial.h
./include/asm-mips/vr41xx/toadkk-tcs8000.h
./include/asm-mips/vr41xx/vr4181a_pcmcia.h
./include/asm-mips/vr41xx/vr41xx.h
$ find . -type f -exec grep -q tcs8000_setup {} \; -print
./arch/mips/boot/vmlinux.binary
./arch/mips/kernel/setup.c
./arch/mips/vr41xx/toadkk-tcs8000/setup.c

arch/mips/vr41xx/common/giu.cがビンゴのような気がするが...

_ ドライバの作成

とりあえず備忘として。

  1. デバイスドライバを書く
    • GPMODEでモード設定
    • GPINENで入出力設定
    • GPDATAで読み書き
  2. デバイスファイルの作成
    mount -o rw,remount /
    mknod /dev/gpio0 c 100 0
      
  3. ドライバのロード
    /sbin/insmod ./tcs_gpio.o
      
  4. テスト
    echo -n "ABCD" > /dev/gpio0
      

これでLEDが無事点滅

◇ 注意点

コンパイル時のオプションをちゃんと指定しないと、デバイスのロード時に

insmod: Relocation overflow of type 4 for printk
などと文句をいわれる。Software Design 2003/7の記事を参考に以下のようなMakefileを作成。
CC = mipsel-linux-gcc
LD = mipsel-linux-ld
SHELL = sh
KERNELDIR = /usr/src/mipsel-linux
 
include $(KERNELDIR)/.config
 
CFLAGS = -D__KERNEL__ -DMODULE -DLINUX -DEXPORT_SYMTAB -DCONFIG_PROC_FS
CFLAGS += -mno-abicalls -fno-pic -mtune=r4600 -mips2 -mlong-calls
CFLAGS += -I$(KERNELDIR)/include -O2 -pipe -Wall
 
all: module.o tcs_gpio.o
 
clean:
        rm -f *.o

_

L-CardAのGI[1-8]を8ビットの入力,GO[1-8]を8ビットの出力に見立てたシンプルなデバイスドライバです.東亜DKKのTCS-8000開発キット上のLEDを点滅させることが出来ます.入力用のスイッチ回路部分は自作する必要があります.上のサブタイトルからソースのtarボールがダウンロードできます.

ライセンス

今回の配布物にはライセンスの記述がありませんが,これは,ライセンスも含めてどう扱おうと自由であるという意思表示だと思って下さい.これはあくまで現時点での判断であり,ここで公開するドライバに,今後もずっとライセンスを付けないという意味ではありません.

ファイル構成

tarボールを展開すると,以下のようなファイル郡が作成されます.

[tcsgpio]
 + Makecile              ドライバのmakefile
 + tcsgpio.h             ドライバのヘッダファイル
 + tcsgpio.c             ドライバ本体
 + rc.gpio               ドライバの追加・削除用スクリプト
 + [user-sample]
    + Makefile           サンプルアプリケーションのmakefile
    + io.c               io サンプル
    + k2000.c            LED 点滅サンプル

コンパイル

tcsgpioディレクトリで make を実行することにより,tcsgpio.oという名前のデバイスドライバモジュールが作成されます.また,user-sampleディレクトリで make を実行すると,サンプルプログラムが作成されます.

使い方

まず,コンパイルしたtcsgpio.oをL-CardAにコピーします.次にinsmodコマンドを使ってモジュールをロードします.

# /sbin/insmod ./tcsgpio.o

insmodコマンドが無事終了したら,デバイス用のスペシャルファイルを作成します.このドライバはデバイス番号の動的な割り当てを使っているので,まず,デバイス番号を調べます.

# cat /proc/devices | sed 's/ tcsgpio//p;/^.*/d'
253                          <- tcsgpio には253番が割り当てられている
# mount -o rw,remount /
# mknod /dev/gpio0 c 253 0   <- メジャー番号 253, マイナー番号 0,デバイスファイル名は/dev/gpio0.
# chown root:admin /dev/gpio0
# chmod g+w /dev/gpio0

これで準備は完了です.

サンプルプログラム「io」

GI[1-8]の状態を読み込んで,標準出力およびGO[1-8]に出力するプログラムです.GI[1-8]に接続したスイッチを切り替えた後に実行すると,その状態に合わせてGO[1-8]に接続されたLED等を明滅させることが出来ます.

サンプルプログラム「k2000」

LEDを点滅させるプログラムです.実行すると単純なパターンでの点滅を永遠に繰り返します.

以上


トップ «前の日記(           ) 最新 次の日記(           )» 編集