1

Linux マシン (Debian Wheezy) でパラレル ポートにアクセスしようとしましたrequest_region()が、システムが既にカーネル モジュールをロードしていたため、アクセスできませんでしたparport...

したがって、rmmodモジュールlpppdevparport_pcおよびparport. その後、モジュールを正常に挿入できました。

inb()ただし、返されたベースアドレスからは、0xffどのような値が書き込まれても.

カーネルからのこれらのモジュールの前にrmmod、このレジスタを読み書きできました。次に、これらのモジュールをシステムの起動時にロードされないようにブラックリストに登録しました。これらのレジスタを読み書きでき、モジュールも機能しました。のclearup機能がparport_pcハードウェアを使用不能にするようなことをしたようです。(少なくとも、ポートのステータスは、モジュールがロードされる前と同じではありません)。

私の質問はなぜですか、そして reload の代わりにポートを回復するにはどうすればよいparport_pcですか?

4

2 に答える 2

2

C を使用して、outb および inb 関数を介してパラレル ポートのピンとの間で直接読み書きする小さなプログラムを作成できます。次に、他のスクリプトからシェルのコマンド ラインから C プログラムを呼び出すだけです。通常、(デフォルトでは) アドレス 0x378 はメモリ内のパラレル ポート LPT0 のアドレスであるため、inb と outp を使用してこのアドレスを読み書きするだけです。例えば:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>

#define base 0x378   //LPT0

//to compile:  gcc -O parport.c -o parport
//after compiling, set suid:  chmod +s parport   then, copy to /usr/sbin/


int main(void) {
  if(ioperm(base,1,1)) 
    fprintf(stderr, "Couldn't open parallel port"), exit(1);

  outb(255,base);  //set all pins hi
  sleep(5); 
  outb(0,base);    //set all pins lo

  return 0;
}
于 2013-07-25T19:01:14.430 に答える
1

一部のドライバー MOD により、パラレル ポートへのアクセスがブロックされています。/etc/modprobe.d/blacklist.conf ファイルを編集して次の行を追加し、Linux を再起動します。

blacklist ppdev
blacklist lp
blacklist parport_pc
blacklist parport

cups がインストールされている場合は、/etc/modules-load.d/cups-filters.conf を変更する必要があります。

#lp
#ppdev
#parport_pc

詳細は次のとおりです。 https://stackoverflow.com/a/27423675/4350106

于 2014-12-11T13:12:33.803 に答える