基礎からのデバイスドライバ作成講座(第1回)

Linuxシリアルポート デバイスドライバの解説と使い方

CQ出版発行の組み込みエンジニアのための Embedded Unix の記事関連のダウンロード・コーナです。

株式会社デバイスドライバーズ

第1回目は最も身近で、古くて皆さんにもなじみのある、EIA-232-E方式の非同期通信を中心に、シリアルポートのドライバをテーマにして、Linuxでの実例を紹介しながら、解説しています。

本誌ではシリアルポートの一般的な知識、ハードウェアとソフトウェアの一般的な解説のほか、シリアルポートのデバイスドライバ開発に必要な技術情報、Linuxのデバイスドライバの解説、開発方法(または改造方法)と、簡単なテスト用プログラムを掲載して解説しています。

記事中で紹介しましたように、高速モード・シリアルポート対応ドライバ(SHSMOD)のLinux用を今回開発し直して、ソースコードを含めて以下に公開しました。しかしLinux用SHSMODの最新版はV1.93になりましたので、最新版はSHSMODのページからダウンロードして入手して下さい。

高速モード・シリアルポート対応ドライバ(SHSMOD)は、一般的なPCアーキテクチャのマシンに使用されている、SMC、NS、Winbond、ALI等のSuperIO / SouthBridgeの機能拡張モードを使って、115,200bpsを超えるシリアル通信を実現させるソフトウェアです。元々は筆者の知り合いのGigo氏が開発した、DOSの小さな別の名前のプログラムだったのですが、WindowsNT用やWindows95用がやがて作られ、さらには他の協力者の手によって、FreeBSD用やLinux用も作られまています。今回はWindows用SHSMODシリーズの最後の版に手に入れて、アプリケーション・モードでのデバイス制御を行う版と、Linuxの標準シリアルポート・ドライバである、serial.cの改造パッチとして動作させます。

ダウンロード・ファイル

ファイル 説明
serial.c デバッグ表示用パッチ
serial.patch
カーネル2.4.18のserial.c にprintk()によるデバッグ分を追加し、デバイスドライバの動作を確認する
テスト用プログラム
onebypne.c
ループバック*1を使って1バイト分の文字データを出力と入力を繰り返す
テスト用プログラム
block.c
ループバック*1を使ってまとめて出力したデータをまとめて入力する
テスト用プログラム
thread-io.c
Threadを使ってまとめて入出力を行い、RTS/CTSのフロー制御を行う(ループバック使用*1
性能評価用用プログラム
perform.c
ループバック*1を使った実効転送速度の性能評価プログラム
(記事中には掲載していません)
高速モード・シリアルポート対応プログラム
shsmod.c shstable.c shschip.c shstable.h
アプリケーション・モードでのデバイス制御を行うSHSMOD V1.91相当のツール
*2VIA VT82C686A|Bでの使用には注意が必要
シリアルポート・ドライバの
高速モード・シリアルポート化Patch
serial-shsmod-v1.91.patch.gz
Linuxの標準シリアルポート・ドライバであるserial.cの高速モード・シリアルポート化改造パッチ (kernel 2.4.18以降用)
コンパイルにはこのパッチのほかにshstable.c shatable.h shschip.cが必要*3 *4
e-unix-vol2-serial.tar.gz 上記すべてとMakefile等をまとめたパッケージ
★ご注意-1:
各テスト用プログラムと性能評価用プログラムの実行には、記事中で紹介しているような「ループバック・コネクタ」を接続するか、または対向接続しているマシン上で「ループバック・プログラム」を動作させておく必要があります。
★ご注意-2:
このプログラムでは、ユーザモード・アプリケーションでPCIコンフィグレーションを制御しているため、VIA VT82C686Aまたは686Bを使用しているマシンのX-window環境で使用した場合には、画面のチラツキやウィンドウ、キーボードの操作に不具合が発生する場合があります。あくまでもプログラミングのための参考として使用して下さい。
★ご注意-3:
パッチは、Linux kernel-2.4.18, 2.4.19, Red Hat Linux 8.0で使用されている2.4.18-14 で確認しています。パッチを当てた後コンパイルするためには、同じディレクトリ上に、インクルードして使用するshstable.c shatable.h shschip.c が必要になります。
★ご注意-4:
ドライバがインストールされた時から高速通信モードに設定されますが、実際に高速通信を行うためには、以下のような手順で、ポートの通信速度を設定させる必要があります。
WinbondとNS環境でのシェルからの設定例
# stty -F /dev/ttyS0 speed 230400

または
# stty -F /dev/ttyS1 speed 460800
SMSC, ALi, VIA環境でのシェルからの設定例
# setserial /dev/ttyS0 divisor 0x8002 spd_cust
# stty -F /dev/ttyS0 speed 38400

または
# setserial /dev/ttyS1 divisor 0x8001 spd_cust
# stty -F /dev/ttyS1 speed 38400

setserialでの設定値: 0x8002 ==> 230400bps, 0x8001 ==> 460800 bps

本文で紹介しているリンク先

サイト 説明
Linux JF Project
http://www.linux.or.jp/JF/ (日本語)
Linux Serial HOWTO (2000/05/11)
ハードウェアの構成・接続から、モデムやカードの使い方、設定方法やアプリケーションまでシリアルポート関連の全般にわたって解説しています。

The Linux Serial Programming HOWTO (1998/02/26)
シリアルポートを使った通信プログラムのプログラミングに関する解説です。

Modem-HOWTO (2000/02/04)
モデムだけでなく、シリアルポートの設定方法やアプリケーションについてまで解説し、トラブルシューティングもあります。
The Linux Document Project
http://tldp.org/ (英語)
Linux Serial HOWTO (Mar. 2002)
The Linux Serial Programming HOWTO (Aug. 2001)
Modem-HOWTO (Sep. 2002)

UART互換チップのデータシートの入手先

サイト 製品種類 製品例
National Semiconductor
http://www.national.com/
6550系 PC16550D
Super IO PC87338ほか
EXAR
http://www.exar.com/
16450系 ST16C450ほか
16550系 ST16C550ほか
16650系 ST16C650Aほか
16850系 XR16C850ほか
Texas Instruments
http://www.ti.com/
16450系 TL16C450ほか
16550系 TL16C550Cほか
16750系 TL16C750ほか
Oxford Semiconductor
http://www.oxsemi.com/
16950系 OX16C950Bほか
SMSC
http://www.smsc.com/
Super IO FDC37C669ほか
Winbond
http://www.winbond.com/
Super IO W83627HFほか
ITE
http://www.ite.com.tw/
Super IO IT8172ほか

更新日:3月14日

日高亜友(ひだか あとむ)
Hidaka, Atomu


戻る→

ホームへ戻る  株式会社デバイスドライバーズ
  TEL: 042-363-8294
  FAX: 042-363-8255