ユーザー空間アプリケーションが用意されており、デバイスファイルがmknode、デバイスドライバがカーネルに接続されており、UARTプロトコルを持つデバイスがあります。私はデバイスドライバ(ハードウェアのベースアドレスとIRQライン番号を持っています)とハードウェアの間で何が起こっているのかを理解しようとしています。ユーザースペースアプリケーションが要求を行うと、ハードウェアベースアドレスを持つデバイスドライバがそれを処理し、ハードウェアが要求しようとするとIRQ行をアクティブにします。
質問:
- 8051マイクロコントローラと同じ場所にコードをダンプする必要がありますか?
- いつデバイスの電源を入れる必要がありますか?
交通渋滞を逃した。
答え1
PCI / PCIeバスにはハードウェア自動設定機能があるため、LinuxカーネルにはすべてのPCI / PCIeデバイスのハードウェアIDを読み取ることができるPCIバスドライバが含まれています。でlspci -nn
これらのIDを直接表示できます。
現在のハードウェアのドライバがロードされていない場合、カーネルは次のドライバモジュールのロード要求を生成します。
modprobe pci:v0000<PCI vendor ID>d000<PCI device ID>sv<subvendor ID>sd<subdevice ID>bc<base class ID>sc<subclass ID>i<programming interface ID>
ドライバモジュールには対応する項目を含める必要があります。 モーダル情報、modprobe
一致するモジュールを見つけるために使用されます。を実行すると、modprobe -c | grep pci:
現在インストールされているすべてのドライバモジュールのモダリア行が表示されます。
ドライバがロードされた後(および/またはホットプラグ対応ハードウェアでカーネルレベルPCI(e)ホットプラグイベントがある場合)、ドライバはドライバが認識しているハードウェアを探します。ドライバが実行できるデバイスを見つけたら、通常はudevホットプラグイベントをトリガして必要なデバイスファイルを自動的に生成します。
デフォルトがユースケースに適していない場合は、udevルールを使用してデバイスファイルのパス、名前、所有権、および権限を変更したり、任意のスクリプト操作を実行したりできます。ほとんどの場合、手動操作は必要なく、Linuxはmknod
カーネルバージョン2.6以降、非永続/dev
デバイスファイルシステムを使用しているため、mknod
次回の再起動時に手動コマンドの効果が失われます。
ドライバー可能デバイスが検出されると、デバイスを調査/初期化するための追加の手順が実行されます。あるいは、ドライバは、単にデバイスノードに対応するカーネル側インフラストラクチャを設定し、ユーザ空間の入力を待つことができる。
ドライバが関連ハードウェアを見つけられない場合は、メモリにロードされたままになり、デバイスを再検索するように指示できるカーネルレベルのホットプラグイベントを待ちます。
/dev/ttyS*
ただし、PCI(e)UARTカードはシリアルポートデバイス(デバイスなど)で検出される可能性が高いです。シリアルポート技術は非常に古く、ポートに接続されているものを識別するためにシリアルポートを調べる信頼できる方法はありません。しかし、Linuxでは、通常、gpsd
GPS受信機デバイスなどのユーザースペースで実装されています。ModemManager
3G/4Gワイヤレスモデム。これらのサービスはシリアルポートを照会し、ポートのハンドシェイク回線の状態を確認し、接続があると表示された場合(つまり、シリアルポートの受信DSR回線がアクティブな場合)、受信データを検索するか、またはいくつかの標準を送信します。クエリ文字列。
たとえば、ModemManager はAT
新しいシリアルポートに転送できます。デバイスが応答すると、OK
相手のデバイスは古典的なHayes ATコマンドを理解しているように見えるので、おそらく一種のモデムです。より正確に識別してみてください。
このアクティブプロービングは、UARTデバイスの特定の使用を妨げる可能性があります。必要に応じて、udevルールを使用して、ModemManagerに特定のUARTデバイスを完全に無視するように指示できます。
たとえば、PCIeシリアルカードを搭載したシステムがあります。
# lspci -nn
...
04:00.0 Serial controller [0700]: Oxford Semiconductor Ltd OXPCIe952 Dual 16C950 UART [1415:c158]
...
2つのポートがあり、すべてudevadm info -q all -a -n /dev/ttyS<number>
の/dev/ttyS*
デバイスでそれを実行するとポートを識別できます。最初のポートにはudev属性があり、ATTR{line}=="1"
2番目のポートにはATTR{line}=="2"
。
これで、特別なシリアルデバイスをそのカードのポート1に接続し、次のファイルにudevルールを作成できます/etc/udev/rules.d/99-my-uart-device.rules
。
SUBSYSTEM=="tty", DRIVERS=="serial", ATTRS{vendor}=="0x1415", ATTRS{device}=="0xc158", ATTRS{line}=="1", ALIAS="my_serial_device", ENV{ID_MM_DEVICE_IGNORE}="1"
/dev/my_serial_device
このルールを使用すると、システムに追加できる他のUART類似デバイスと検出順序に関係なく、常にそのシリアルポートカードのポート1を参照するエイリアス(シンボルリンク)が作成されます。また、ModemManagerにこのポート(このENV{ID_MM_DEVICE_IGNORE}="1"
部分)を調査しないように指示します。
/dev/my_serial_device
これを行うようにアプリケーションを設定できます。/dev/ttyS1
これは常に正しい物理シリアルポートを使用してデバイスと通信することを信頼できます。
シリアルカードはPCIeスロットを介して電力が供給されるため、常にコンピュータと一緒に電力が供給され検出されます。ポートに接続されているデバイスは、そのデバイスを使用するアプリケーションが起動するまで電源を切ったままにすることができます。