GNU/Linux >> Linux の 問題 >  >> Linux

周辺ポートを制御する方法:Linux上のCを使用したパラレルポートへのアクセスと書き込み。パートI

PCの周辺機器ポートを制御するための最も印象的で新しいユースケースの1つはホームオートメーションです。このテクノロジーは、私たちの家に無限の可能性をもたらします。ホームオートメーションは、社会的側面を備えた技術分野です。私たちのアプローチは、いくつかのキーフレーズを使用して、生活の質を改善し、コミュニケーションを拡大し、プロセスを自動化することです。これはすべて非常に単純なようですが、ホームオートメーションのこの新しい世界に固有の複雑さはエキサイティングです。理由を見てみましょう。

ホームオートメーションは、いくつかの理由で複雑な活動です。まず、家庭用機器(センサー、スマートアプライアンス、アクチュエーターなど)での操作により、機械的量子や光電効果などの複雑な物理現象がわかります。さらに、これらのデバイスの1つは、必ずしも単純なタスクではなく、さまざまなタスクを実行できます。第二に、ホームオートメーションについて話すことは、常に簡単に相互作用するとは限らない多くの異なるコンポーネントで構成されるシステムについて話します(ビデオカメラ、存在検出器、通信機器、リモート警告システムを備えたアラームなどを含むホームセキュリティシステムを想像してください)。 ....)。最後に、そして最も重要なことは、社会システムによる技術システムの自動化に直面しているため、複雑です。

用語の定義

パラレルポート:

パラレルポートは、コンピュータと周辺機器の間のインターフェイスであり、その主な特徴は、データビットが一緒に移動し、一度にパケットバイトを送信することです。データの各ビットのケーブルまたは物理的な経路は、8回線のバスを形成することによって実装されます。パラレルポートを介して、ライト、モーター、その他のデバイスなどの周辺機器を制御することもできます。

Webインターフェース:

Webインターフェイスを使用すると、ユーザーはWebブラウザーを介してデバイスを制御および操作できます。これは、リモートコントロール、ライブラリ管理、視覚的なフィードバック、およびその他の多くのことに使用できます。

ホームオートメーション:

これは、家を自動化し、エネルギー管理サービス、セキュリティ、福祉、通信を提供できるすべてのシステムの自動化であり、有線または無線の屋内および屋外の通信ネットワークに統合できます。

Cでパラレルポートを操作する方法

私たちの主な目的である基本的なホームオートメーションでは、パラレルポートを使用して、単純なデバイスを制御するためにいくつかのバイトを書き込む(または読み取る)方法を示します。 PC ECPタイプのパラレルポートには、メスのDB25タイプの出力コネクタがあり、その図と信号を次の図に示します。

図1:パラレルポートの図。メスコネクタのピン配列。ウィキペディアの礼儀

パラレルポート出力

セントロニクス規格によると、PCのパラレルポートは、双方向の8データビット通信バスと、プロトコル用の一連の回線で構成されています。通信回線には、新しいデータが書き込まれるまで書き込まれた最後の値を保持するリテーナがあります。電気的特性は次のとおりです。

  • 高レベル電圧:3.3〜5V。
  • 低レベル電圧:0V。
  • 最大出力電流:2.6mA。
  • 最大入力電流:24mA。

電圧と電流は、LED、リレー、ソリッドステートスイッチなどの一連の制御デバイスに供給することができます。これらのバッファは、消費電力の高い要素をオフまたはオンにするために必要です。

アドレス指定

標準のパラレルポートのアドレス指定は、コンピュータから、および識別目的で使用されるリソースが多様であるため、重要です。標準のパラレルポートは、通常次のいずれかの範囲にある3つの連続したアドレスを使用します。

3BCh 3BDh 3BEh
378h 379h 37Ah
278h 279h 27Ah


範囲の最初のアドレスは、ポートのベースアドレスであり、データレジスタまたは単にポートアドレスとも呼ばれます。 2番目のアドレスはポートのステータスレジスタで、3番目は制御レジスタです。

EPPおよびECPは、ポートごとに追加のアドレスを予約します。 EPPはベースアドレス+3からベースアドレス+7に5つのレジスタを追加し、ECPはベースアドレス+400hからベースアドレス+402hに3つのレジスタを追加します。ベースアドレスが378hの場合、EPPレジスタは37Bhから37Fhにあり、ECPレジスタは778hから77Fhにあります。

DMAチャネル

ECPは、パラレルポートへのデータ転送にダイレクトメモリアクセス(DMA)を使用できます。 DMA転送中、CPUは他のことを自由に実行できるため、DMA転送により全体的なパフォーマンスが向上する可能性があります。 DMAを使用するには、ポートに0〜3の範囲のDMAチャネルが割り当てられている必要があります。

Linux上の物理ポートへのアクセス

PCのポートハードウェアはLinuxカーネルによって直接制御されるため、パラレルポートバスに関連する特定のヘッダーにアクセスする必要があります。 GCCコンパイラはこれらのヘッダーにアクセスできますが、アクセスエラーを回避するには、ユーザーがroot権限を持っている必要があることを常に念頭に置いてください。これらのヘッダーは次のとおりです。

  • stdio.h:「標準入出力ヘッダー」(標準ヘッダーI / O)は、操作を実行するためのCプログラミング言語の標準ライブラリ内のマクロ定義、定数、関数宣言を含むヘッダーファイルです。入力と出力、およびそのような操作に必要なタイプの定義。互換性の理由から、プログラミング言語C ++(C派生)にも、cstdioファイルヘッダーで宣言されたこれらの関数の独自の実装があります。私が使用しなければならない関数は、エラーが発生した場合にターミナルウィンドウに印刷できるfprintfです。
  • stdlib.h:汎用プログラミング言語Cの標準ライブラリのヘッダーファイルです。動的メモリ管理、プロセス制御などのC関数プロトタイプが含まれています。 cstdlibとして知られているC++をサポートします。私が使用する関数は、エラーが発生したときに終了することです
  • unistd.h:POSIXオペレーティングシステムAPIへのアクセスを提供するヘッダーファイル。 Unixライクなシステムでは、unistd.hで定義されるインターフェイスは通常、フォーク、パイプ、I / Oプリミティブ(読み取り、書き込み、閉じるなど)などのシステムコールラッパー関数で主に構成されます。
  • sys / io.h:この関数ファミリーは、低レベルのポート入出力を行うために使用されます。 out *関数はポート出力を行い、in*関数はポート入力を行います。 bサフィックス関数はバイト幅で、wサフィックス関数はワード幅です。 _p-suffix関数は、I/Oが完了するまで一時停止します。この家族機能のうち、outbを使用します。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

Linuxでは、パラレルポートへのアクセスと制御は簡単ですが、ルートアクセスを十分に考慮する必要があります。上記はすべて、今日のチュートリアルに必要なライブラリです。

パラレルポートのメモリアドレスの定義

ライブラリを含めたら、前述のように、パラレルポートに割り当てられたメモリアドレスを定義する必要があります。最初のパラレルポートのデフォルトアドレスは0x378です。

#define base 0x378           /* parallel port base address */

このアドレスを試す際に問題が発生した場合は、0x278を試してください。

データバスを出力ポートとして使用する

この最初の部分のチュートリアルでは、データバスを出力ポートとして使用します。次の章では、データ入力用のポートとして、または混合ポートとしても使用する方法を説明します。下の画像では、電流制限抵抗を介して、アドレス0x378に割り当てられた値に応答するパラレルポートに接続された8個のLEDの制御を確認できます。抵抗の値は100オームから300オームまで変化する可能性があります。電流を制限しないとポートが損傷する可能性があるため、この部分は重要です。

回路図


注:LEDの色は重要ではありません。

実回路



注意:パラレルポートコネクタの取り扱いには注意してください。 PCの電源を切る前に、回路を切断しないでください。これにより、ポートまたはマザーボードに損傷を与える可能性があります。ハードウェアデバイスに損害を与える可能性があることを想定することはできません。

ソフトウェアの実装

私の目的のために、ポートにいくつかの値を入れる方法と、それらの値のタイミングをどのように行う必要があるかを示します。これは、それがどのように機能するかを示す非常に簡単なルーチンです。

次に、制御ソフトウェアで使用されるすべてのコマンドと単語について説明します。

  • ステップ1:ユーザーがポートにアクセスするためのroot権限を持っているかどうかを確認します。この条件付きコマンドの引数は、ポートアドレスベースのポートアクセス許可ビットを設定するiopermです。
if (ioperm(base,1,1))
  • ステップ2:ユーザーがパラレルポートにアクセスするための十分な権限を持っていない場合、アクセスエラーが表示され、プログラムの実行が終了します。
fprintf(stderr, "Access denied to %x\n", base), exit(1);
  • ステップ3:アクセスが許可されている場合、forループは、ポートに表示する事前定義された値によってLEDにオンとオフのシーケンスを提供します。私が使用したタイミング関数はsleep()で、引数の秒数が経過するまで呼び出し元のスレッドをスリープ状態にします。
    w=0;
    for (x=0; x=7; x++)  
        {        
        y=pow(2,w);
        outb(y, base);
        sleep(1);
        w=w+1;
           }


コード処理がアクセス許可行を通過すると、'fprintf(stderr、 "Access denied to%x \ n"、base)、exit(1); '、パラレルポートのデータピンは自由に利用できます。私の場合、2の累乗を使用して、最初から最後まで1秒間隔で単純なシーケンスを実行するだけです(ビデオリンクを参照)。ただし、可能性は無限です。実際、多重化を使用せずに最大8つの独立した出力を制御でき、多重化出力を使用すると最大255の可能性に成長できます。アプリケーションに応じて、ホームオートメーションの観点からかどうかにかかわらず、多重化せずにポートを処理し、より高い電流負荷を処理するための適切なバッファを配置できます。これについては、後で別のチュートリアルで扱います。


参照:

Martin H、Saez F. Domotica、UnEnfoqueSociotécnico。 2006年6月。FundaciónRogelioSegoviaparael Desarrollo de las Telecomunicaciones、Ciudad Universitaria、s / n 28040-マドリード、ISBN:84-7402-335-1。

アクセルソンJ.パラレルポートコンプリート。 PCのパラレルプリンタポ​​ートのプログラミング、インターフェイス、および使用。 Amazon INC .. ISBN:0-9650819-1-5

KerriskM.Linuxプログラミングインターフェイス。 Linuxのマニュアルページプロジェクト。 ISBN 978-1-59327-220-3


Linux
  1. LinuxでSUIDおよびSGID権限を持つファイルを検索する方法

  2. Linux上のFlatpak:それは何であり、それを使ってアプリをインストールする方法

  3. Linux の C でのシリアル ポートへの読み取りと書き込み

  1. Linuxでファイルとディレクトリを圧縮する方法(例付き)

  2. netstat、lsof、およびnmapを使用してLinuxで開いているポートを確認する方法

  3. Linuxでユーザーとグループを操作する方法

  1. RHEL 8 / CentOS8Linuxでポートを開閉する方法

  2. TCPおよびUDPポートをリアルタイムで監視する方法

  3. Linux マシンでどのポートがビジーで、どのポートが空いているかを確認するにはどうすればよいですか?