沼津高専 電子制御工学科
MIRSATLM LCDデバイスドライバ取扱説明書
MIRSATLM-SOFT-1003
改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2000.10.13 田口 大庭
初版
A02 2000.10.19 田口 大庭
LCDドライバプログラムを扱う上での注意を追加
A03 2000.12.7 田口 田口
ioctl関数のコマンドを追加、試験方法の修正
A04 2001.1.6 田口 田口 2行の文字表示方法、ダウンロードファイルの追加、試験方法の更新等
A05 2001.3.13 田口 遠山 最終的な仕様に修正

目次


1 .はじめに

 本ドキュメントは、LCDデバイスドライバプログラムの取扱い方法について説明するものである。

2 .システム内の位置

 図にMIRSATLMのソフトウェアシステム内においてのLCDデバイスドライバの位置を示す。


Fig.1 システム内のLCDデバイスドライバの位置

3 .LCDデバイスドライバの機能概要

 LCDデバイスドライバは、MIRSATLMに搭載されるLCD(SC1602BS)への表示を行うLINUX用デバイスドライバである。
 またioctl関数を用いて複数のコマンドを用意することにより、上位プログラム上でLCDモジュールの初期設定を行うことができる。

4 .アプリケーションインターフェース

4-1 .デバイスドライバプログラム構成図
 図にLCDデバイスドライバプログラム構成図を示す。


Fig.2 LCDデバイスドライバプログラム構成図

4-2 .上位プログラムで使用する関数
 上位プログラムで使用する関数・引数と、その関数が行う動作を以下に示す。

●int fd=open("/dev/lcd$i",f_mode)
	第1引数:LCDデバイスドライバを指定($iは0,1などの整数である。)
	第2引数:ファイルの読み書きの属性(O_RDONLY、O_WRONLY、O_RDWR、etc)
 ・LCDデバイスファイルをopenすると、open時にI/Oポートアドレスのチェックと登録を行う。もしI/Oポートが使用中な
  らerrを返す。
 ・初めてopenされたときは、LCDモジュールに最低限の初期設定(LCDモジュールのディスプレイ・カーソルON、2行表示に
  設定、表示クリア)を行う。


●read(fd, char *buf,size_t count,loff_t offset)
	第1引数:LCDドライバファイルを指定
	第2引数:表示文字の格納領域
	第3引数:読み込み文字のバイト数
	第4引数:オフセット
 ・readメソッドは呼び出されると、LCDモジュールに表示されている文字データを第3引数で指定されたバイト数分I/Oポ
  ートから読み込み、bufに格納する。カーソルがあったアドレスより前の文字データしか格納されていない事に注
  意が必要。また、2行にわたって表示している場合は、表示設定を行わない限り(例えばアドレスを1行目の最後
  の文字の所にするとか)2行目の文字のみデータは格納されている。
  [例]10バイト分読み込みたい→現在LCDに表示されている文字は1行目に5文字、2行目に3文字、カーソルは2行目に表示
    されている文字の後→
    結果:2行目の3文字分のデータしか格納されていないので、10バイト分指定したにもかかわらず3バイト分だけ読み
       込む。
 ・もしデータが獲得できなかった場合は-ENOMSGを返す。


●write(fd, char *buf,int count,offset)
	第1引数:LCDドライバファイルを指定
	第2引数:表示文字の格納領域
	第3引数:書込み文字のバイト数
	第4引数:オフセット
 ・write関数は呼び出されると、bufに格納した文字データをデバイスに書き出す。そしてI/Oポートアドレスに文字デー
  タを書き込んで表示する。表示文字を書き込む前に表示設定(ioctl関数にて)を行わない限り、書き込んだ文字は、現
  在表示されている文字の後に表示される。
 ・もし第3引数が0(もしくは0以下)場合は-EINVALを返す。また、最大書き込み文字(32字)以上書き込むと-EMSGSIZEを返
  す。
 ・2行分の文字を1度に書き込む方法に関しては下記(5-3)参照。


●ioctl(fd,int cmd,int &ctl_nr)
	第1引数:LCDドライバファイルを指定
	第2引数:コマンド選択値
	第3引数:表示設定値
 ・ioctl関数では第2引数の値によってコマンドを選択し、LCDデバイスの様々な表示設定を行う。コマンドは9つあり、選
  択したコマンドによって表示設定信号を作成してI/Oポートに書き込むことにより、LCDの表示クリアやカーソルの進む
  方向などを設定できる。


●close(fd)
	第1引数:LCDドライバファイルを指定
 ・引数にLCDドライバファイルを指定すると、release関数はI/Oポートを開放してcloseする。

4-3 .ioctl関数のコマンド
 ioctl関数で引数として用いるコマンド選択値と表示設定値の対応および、それによって行われるLCDモジュールの設定内容について以下の表に示す。
 また、表示設定内容が1つのコマンドにつき2つ以上ある場合は、表示設定値を以下の表の@→A(→B)の順に配列に代入するものとする。(順番を間違えると正しい設定はできない。)
 (ioctl関数の第2引数は以下の表のコマンド(LCD_CLEAR等)を代入する。)

コマンド(cmd)
コマンド値
設定内容
表示設定値(ctl_nr)
LCD_CLEAR
40
表示クリア
なし
LCD_ADD_ZERO
41
表示アドレスを0番地にセット(表示内容不変化)
なし
LCD_CURSOR_SHIFT
42
@カーソル進行方向
A表示シフト
@インクリメント:1,デクリメント:0
AYES:1,NO:0
LCD_ON_OFF
43
@全表示のON/OFF
AカーソルのON/OFF
B文字のブリンク
@ON:1,OFF:0
AON:1,OFF:0
BYES:1,NO:0
(@*0x04 + A*0x02 + B)
LCD_LIST_OR_CURSOR
44
@表示シフトorカーソル移動(表示内容不変化)
Aシフト方向
@表示シフト:1,カーソル移動:0
A右:1,左:0
LCD_TWO_SET
45
表示アドレスを2行目0番地にセット
なし
LCD_ADD_SET
46
表示文字のアドレスセット
表示文字アドレス値
LCD_BF_ADD
47
@ビジーフラグの読み出し
A表示文字アドレスの読み出し
@内部動作中:1,命令受付可:0
A表示文字アドレス値
LCD_HARDRESET
48
利用度数のリセット
なし

5 .LCDデバイスドライバプログラムを扱う上での注意

5-1 .ioctlコマンドの定義
 ioctl関数のコマンドを使用するには、LCDデバイスドライバと上位プログラムでコマンド番号を合わせる必要がある。(コマンド番号が一致してなければ、もちろんLCDデバイスドライバのioctlコマンドを使用することはできない。)そのため、ヘッダファイルにコマンド番号を定義したので、このファイルを上位プログラムにincludeする。以下にヘッダファイルの中身(一部分のみ)を示す。
#define LCD_IOC_MAGIC 'l'

#define LCD_CLEAR          _IO(LCD_IOC_MAGIC,40)
#define LCD_ADD_ZERO       _IO(LCD_IOC_MAGIC,41)
#define LCD_CURSOR_SHIFT   _IOW(LCD_IOC_MAGIC,42,&ctl_nr)
#define LCD_ON_OFF         _IOW(LCD_IOC_MAGIC,43,&ctl_nr)
#define LCD_LIST_OR_CURSOR _IOW(LCD_IOC_MAGIC,44,&ctl_nr)
#define LCD_TWO_SET        _IO(LCD_IOC_MAGIC,45)
#define LCD_ADD_SET        _IOW(LCD_IOC_MAGIC,46,&ctl_nr)
#define LCD_BF_ADD         _IOR(LCD_IOC_MAGIC,47,&ctl_nr)
#define LCD_HRADRESET      _IO(LCD_IOC_MAGIC,48)

#definr LCD_IOC_MAXNR 48
※上記のLCD_IOC_MAGICとは、LCDデバイスドライバのマジックナンバーがlであることを意味する。(マジックナンバーは、ドライバ全体にわたって使われる番号。これは、間違ったデバイスに正しいコマンドを発行するというエラーを防ぐためにあるものである。これによって誤動作してしまうのを防ぐ。)

5-2 .文字表示可能範囲
 LCDデバイスドライバが表示できる文字を以下の表に示す。ただしATL-MIRSプロジェクトでは、カタカナやギリシャ文字は表示する必要性がないのでLCDデバイスドライバではこれらの文字の表示機能を有しない。よって、LCDデバイスドライバでは、アスキーコード表に記された文字(ただしアスキーコード表の「5C」は"\"から"\"、「7E」は" ~ "から"→"、「7F」は" "(空白)から"←"に対応するものとする)のみ表示する機能を有する。また、" ^ "は2行表示のときの識別文字に用いるので使用不可とする。


Fig.3 LCDデバイスドライバ文字変換表

5-3 .2行分の文字を1度に書き込む方法
 2行分の文字を1度に書き込みたい場合は、1行目に表示したい文字と2行目に表示したい文字の間に『^』を挿入することによって行える。
 例をあげると、
uss→
 100mm
という文字を表示したいときは、
uss~^ 100mm  (『 ~ 』はLCDでは『 → 』となる(上記5-2. 参照))
という文字列を用意すればよい。

6 .組込みの方法

6-1 .ダウンロード
 以下のファイルをダウンロードし、解凍する。
lcd.zip
 この圧縮ファイルの中身は
・lcd.c
・lcd_test.c
・lcd_nr.h
である。

6-2 .コンパイル
 lcd.cをコンパイルしてlcd.oを作る。コンパイルには以下の操作を行う。
gcc -Wall -O2 -c lcd.c

6-3 .LCDデバイスドライバの組み込み
 次に、以下の操作を行って、LCDデバイスドライバをモジュールとして組み込む。(スーパユーザでなければこのコマンドは実行できない。)
insmod lcd.o
LCDデバイスドライバモジュールの組み込み完了を確認したい場合は、lsmodというコマンドを使う。
 また、LCDデバイスドライバモジュールを削除するには、
rmmod lcd
というコマンドを用いる。

6-4 .LCDデバイスファイル(デバイスノード)の作成
 以下の操作を行って、LCDデバイスファイルを作成する。
mknod -m 444 /dev/lcd$i c 60 $i (ただし$iは0〜255の範囲(でも使うのはほとんど0のみ))
これで、アクセス権が444、デバイスファイル名が/dev/lcd$i、メジャー番号が60、マイナー番号$iとしてLCDデバイスノードが作成される。(ちなみにcは、キャラクタ型デバイスでLCDデバイスドライバを登録するということ。)
 また、デバイスファイルを削除するには、
rm /dev/lcd$i
というコマンドを用いる。

7 .単体試験
 LCDデバイスドライバの単体試験を行う前に、必要なハードウェアを実装する。実装方法は、ハードウェアの仕様書に提示されているのでそれを見て行うこと。

7-1 .コマンドによる試験
 LCDデバイスドライバの試験で、コマンドによって試験できるのはWRITEメソッドのみ(OEPNメソッド→WRITEメソッド→CLOSEメソッド)である。以前の仕様ではREADメソッドもコマンドによって試験できたが、現在の仕様ではcatコマンドを使うと4000バイト以上読み込んでしまうので使用不可。
echo -n (適当な文字列) > /dev/lcd$i
echoとは、メジャー番号とマイナー番号を頼りにデバイスドライバをopen→write→closeするコマンドのこと。(-nで改行が入らないようにする。)このコマンドにより文字が液晶ディスプレイモジュールに書き込まれる。

7-2 .テストプログラムによる試験
 この試験に必要なファイルとコンパイル方法を提示する。この試験方法では、5つのメソッド全てを試験することができる。(OPENメソッド及びRELEASEメソッドは、テストプログラムがオープン・クローズできた時点で正常に動作しているということになる。)

7-2-1 . コンパイル
 6-1のダウンロードファイルの中のlcd_test.cをコンパイルする。
gcc -o test lcd_test.c

7-2-2 . 試験方法
 テストプログラムの実行は、以下のコマンドで行う。実行後は、指示に従って番号を選択していけば各メソッドの試験ができる。
./test
  ※注:もし「Cannot Open LCD-Device-Driver.」とパソコンに表示された場合の原因としては、
@lcd.cがinsmodされていない
Alcdデバイスドライバのnodeが作成されていない
Blcdデバイスドライバが使用中でOPENできない
  等の理由があげられる。

8 .使用例
 以下のファイルにLCDデバイスドライバの使用例を示した。
example.zip


関連文書