沼津高専 電子制御工学科
MIRSMG3D モータ制御用デバイスドライバ
MIRSMG3D-DEVD-0001
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2009.3.26 細川 牛丸 初版


目次








1.はじめに


本ドキュメントは、MIRSMG3Dのモータ制御用デバイスドライバについてまとめたドキュメントである。




2.システム内の位置


Fig.1にシステム内においてのモータ制御用デバイスドライバの位置を示す。


        Fig.1 システム内の位置



3.機能概要


モータ制御用デバイスドライバは、MIRSに搭載されるモータを制御するためにモータコントロールボードに搭載されているPICとCPUの間でのシリアル通信を行うためのLinux用デバイスドライバである。



4.デバイスドライバの動作詳細


4.1.デバイスドライバプログラム構成


    モータ制御用デバイスドライバは以下の要素で構成される。

    • ISR(割り込み処理)
    • ファイル処理ハンドラ
    • FIFO
    • その他のサブルーチン

    以下に、モータ制御用デバイスドライバで使用される主だった関数を示す。

    ●ISR(割り込み処理)
      static irqreturn_t isr (int irq, void *arg, struct pt_regs *regs)

    ●ファイル処理ハンドラ
      static int sci_ioctl (struct inode*, struct file*, unsigned int, unsigned long)
      static int sci_open (struct inode *inode, struct file *filp)
      static unsigned int sci_poll (struct file *filp, poll_table *wait_table)
      static int sci_release (struct inode *inode, struct file *filp)
      static ssize_t sci_read (struct file *, char __user *, size_t , loff_t *)
      static ssize_t sci_write (struct file*, const char __user*, size_t , loff_t*)
      static int sci_fsync (struct file *, struct dentry *, int datasync)

    ●FIFO
      struct mg3_fifo; int mg3_fifo_init (struct mg3_fifo *, size_t buf_size, gfp_t, spinlock_t *);
      void mg3_fifo_destroy (struct mg3_fifo *fifo);
      int mg3_fifo_getc (struct mg3_fifo *fifo, unsigned char *c);
      int mg3_fifo_peek (struct mg3_fifo *fifo, unsigned char *c);
      int mg3_fifo_putc (struct mg3_fifo *fifo, unsigned char c);
      int mg3_fifo_seek (struct mg3_fifo *fifo);
      size_t mg3_fifo_size (struct mg3_fifo *fifo);
      void mg3_fifo_reset (struct mg3_fifo *fifo);
      static size_t mg3_fifo_capacity (const struct mg3_fifo *fifo);


4.2.データの読み込み


    上位プログラムからPICのデータの読み込み方法の概要を以下に示す。

    1、エラーチェック
    2、読み込み動作
      2.1、FIFOバッファから1文字読み込む。
        2.1.1、1文字読み込む(シークしない)。
        2.1.2、データが存在せずに読み込みに失敗した場合スリープする。
            スリープが解除されたら、2.1.1にもどる。
      2.2、ユーザ指定のバッファに書き込む。
        2.2.1、バッファに書き込む。
        2.2.2、書き込みに成功したら、FIFOバッファをシークさせる。
        2.2.3、書き込みに失敗したら、終了する。
      2.3、指定された文字数に達するまで2.1にもどる。
    3、終了


4.3.データの書き込み


    上位プログラムからPICへのデータの書き込み方法の概要を以下に示す。

    1、エラーチェック
    2、書き込み動作
      2.1、1文字のみの送信の場合、直接デバイスに書き込み、終了する。
      2.2、書き込み動作
        2.2.1、ユーザバッファより、1文字読み込む。
        2.2.2、FIFOバッファに1文字書き込む。
        2.2.3、FIFOが満杯で書き込みに失敗した場合、
            デバイスに送信開始を指示し、スリープする。
            スリープが解除されたら,2.2.2にもどる。
        2.2.4、指定された文字数に達するまで2.2.1に戻る。
        2.2.5、送信中でなければ、デバイスに送信開始を指示する。
          2.2.5.1、送信割り込みを許可する。
          2.2.5.2、FIFOから1文字読み、
               読み送信レジスタにデータを書く。
          2.2.5.3、送信ステータスをクリアする。
    3、終了

    書き込み時のプログラムの推移をタイムチャートとしてFig.2に示す。



                                       Fig.2 書き込み時のタイムチャート


4.4.ISR(割り込み処理)


    割り込み処理の概要を以下に示す。

    1、デバイスから受信データを読み込む。
    2、各種ステータスをデバイスから読み込む。
    3、必要ならエラー処理を行う。
      3.1 送受信割り込みを禁止する。
      3.2スリープしているスレッドを起こす。
    4、必要なら受信処理を行う。
      4.1 FIFOに読み込んだデータを書く。
      4.2スリープしているスレッドを起こす。
    5、必要なら送信処理を行う。
      5.1 FIFOから1文字読み、送信レジスタに書き込む。
      5.2 送信ステータスをクリアする。
      5.3 スリープしているスレッドを起こす。
    6、終了




5.組み込み方法


1、以下のファイルを/home/mirs/src/にダウンロードし、解凍する。


2、motor_driver内でコンパイルを行う。


3、ディレクトリを移動する。


4、デバイスドライバを組み込む。





6.試験方法


 デバイスドライバは、上位プログラムとハードウェアが揃った状態で動作するので、単体での試験は難しい。
 そこで、
「MIRSMG3D-ASSM-0001 組み立て手順書」「MIRSMG3D-DOUB-0005ドータボード取扱説明書」を参考にハードウェアを組み立て、モータを動かしながら、デバイスドライバの正常動作を確認する。
以下に手順を示す。

1、ハードウェアを組み立てる。

2、上記「5.組み込み方法」を参照し、デバイスドライバを組み込む。

3、テストプログラムがあるディレクトリに移動し、コンパイルを行う。
4、プログラムを実行し、モータが正常に回転することを確認する。プログラムは片方のモータが前後に数秒ずつ回転を行うものである。
$ sudo ./sample






関連文書