カーネルモジュールでISAバスを読み書きする方法は?

カーネルモジュールでISAバスを読み書きする方法は?

私はRedhat 6.2を実行しているx86シングルボードコンピュータでカスタム(私が設計していない)ISAボードと通信しようとしています。このカスタムボードとの通信方法について私が持っている唯一の情報は、カスタムボードが応答するISAバスアドレスとデータです(ISAバスをロジックアナライザに接続してこれを知りました)。

たとえば、私が見ている共通バスアドレスは、カスタムボード0xE30000のFPGAにアクセスすることです。もともと、シングルボードコンピュータのバスアドレスと物理アドレスが同じであることを望みました。これにより、mmap/ioremap仮定された物理アドレスを0xE30000書き込むことができる仮想アドレスに設定できます。残念ながら、Redhatのカーネルはユーザースペースがそれほど高いアドレスにアクセスすることを許可しませんmmap。私が作成したカーネルモジュールからそれにアクセスしようとしたときに、物理アドレスがすでにシステムRAM用に予約されていることがわかりました。

[root@rheldev ~]# cat /proc/iomem
00000000-00000fff : reserved
00001000-0009dfff : System RAM
0009e000-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000cbfff : Video ROM
000e0000-000fffff : reserved
  000f0000-000fffff : System ROM
00100000-07ffffff : System RAM  // <--- 0xE30000 sits in there
  00400000-008364e2 : Kernel code
  008364e3-00a917c7 : Kernel data
  00b15000-00c3af6f : Kernel bss
c0000000-c3ffffff : 0000:00:00.0
e0000000-e0000fff : 0000:00:0f.0
  e0000000-e0000fff : e100
e0020000-e003ffff : 0000:00:0f.0
  e0020000-e003ffff : e100
ff000000-ff00ffff : 0000:00:0f.0
fff00000-ffffffff : reserved

今私は再び原点に戻り、ISAバスに書き込む方法を探しています。オープンソースのPC / 104ドライバは見つかりましたが、ISAドライバに関する情報はあまり見つかりませんでした。ここ。ただし、もう少し詳しく調べると、ポートマッピングを使用してバスに書き込んでポートXに書き込むと、0xE30000ISA(および/またはPC / 104)バスに必要なバスアドレスが入力されていることを確認する方法がわかりません。

私はこれが私の理解を完全に超えている領域であることを認めています。これは非常に基本的で単純に見え、大きな問題にはなりませんが、これに関する情報を見つけることが私が望んでいたほど単純ではないほど古いプロトコルです。私に教えることができるリソース/チュートリアル/例に感謝します!

修正する:

正しい方向を教えてくれた@dirktの答えありがとうございます! ISAバスに直接アクセスしようとしていますが、実際にはPCIバスに接続されているブリッジです。

[root@rheldev ~]# lspci
00:00.0 Host bridge: VIA Technologies, Inc. VT8605 [ProSavage PM133]
00:01.0 PCI bridge: VIA Technologies, Inc. VT8605 [PM133 AGP]
00:07.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 40)
00:07.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06)
00:07.4 Non-VGA unclassified device: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 40)
00:0f.0 Ethernet controller: Intel Corporation 8255xER/82551IT Fast Ethernet Controller (rev 10)

詳しく見るとそこにはたくさんありませんが、/sys/bus/isa/以下に00:07:0 ISAブリッジが表示されます/sys/bus/pci/devices/。フォルダの内容は次のとおりです。

[root@rheldev 0000:00:07.0]# ls
broken_parity_status  enable         msi_bus  reset             uevent
class                 irq            power    resource          vendor
config                local_cpulist  ppdev    subsystem
device                local_cpus     remove   subsystem_device
driver                modalias       rescan   subsystem_vendor

今私の質問を更新してください。 PCIバスに接続されたISAブリッジを介してISAバスを読み書きする方法は?

私はいくつかのサイトでISAバスにアクセスするためにより低いメモリ/ポートを使用する方法を説明していますが、より高いISAアドレス(0xE00000で始まる)を使用する必要があるため、それは私には適していないようです。 (@dirktの回答に関する私のコメントも参照してください)

もう一度申し上げますが、ISAバスにより高いISAバスアドレスを配置できるように、ISAブリッジと通信したいとPCIバスに知らせる方法についてのリソースを教えていただきありがとうございます。ありがとうございます!

アップデート2:

@dirktが提案したようにliloを調べている間、Re​​dhat 6のインストールはgrub 2の代わりに古いバージョンのgrubを使用していることがわかったので、まずgrub 2がメモリホールを有効にして何をするかを調べることにしました。ローカルでコンパイルして自分のコンピュータに手動でインストールした後(redhat 6パッケージがないため)、状況が期待していたよりも良くなったようです!

14 MBから16 MBのメモリを予約済みとしてマークするために、grubにカー​​ネルラインパラメータを追加しました。 @dirktに関する私の意見で指摘したように、カーネルはこうなるでしょうreserved/proc/iomem/

簡単なCプログラムとロジックアナライザを使用すると、このアドレスにデータを読み書きすることができます。次のステップは、ISAバスへの読み書きを適切に処理するために適切なカーネルモジュールを作成することです。しかし、今動作するので、比較的簡単な作業になります!

答え1

私はかなり一般的な答えだけを与えることができますが、これがあなたに正しい方向を示してくれることを願っています。

どのx86ボードを使用しているかを指定していませんが、非古いシステムでは、ISAバスはPCI-ISAブリッジの背後にあります。これを使ってlspci足を見つけることができます。ブリッジは、メインメモリとI / O空間をISAバスメモリとI / O空間にマッピングする機能を提供します。これは、BIOS(レガシーPNPを含むACPIなど)に提供されている情報に基づいて起動時にカーネルによって設定されます。dmesgこのプロセスを開始した後、このプロセスに関する情報を表示できます。

最新のシステムでも、従来のISAデバイスがまだ存在しています。しかし、今は実際のISAバスではなく、LPCバスにあります。これらのデバイス用のLinuxカーネルドライバ(例:8042 / 2キーボード/マウスドライバ)(drivers/input/serioPSrequest_regioni8042_platform_initi8042-io.hinboutb/proc/ioports

ブリッジはに表示する必要があります/sys/bus/pci/devices。おそらくそこからより多くの情報を見つけることができます。また/sys/bus/isa、どのような状況でカーネルが情報でいっぱいかはわかりません。

まず、マザーボードが特定のI / Oポートに反応していることを確認します。また、PNP列挙プロセスを試してください(またはdmesg起動時にまだ完了していないことを確認してください)。これに答えると、残りははるかに簡単になります。

最後に、PCI-ISA ブリッジがメモリ空間をどのようにマッピングするか、このメモリ空間を予約するには、どのカーネル操作が必要かを把握し、再調査して何が起こるかを確認できます。

編集する:

この本Linuxデバイスドライバ、第3版ISAメモリアクセスに関する情報があります。9.4.5

編集する:

試してみる価値があるもの:

1)liloブートの代わりに を使用して、grubBIOS で「ホール」(ISA マッピング) を有効にしてブートすることを確認します。はい、liloそれでも動作します。

2)VIA VT82C686A South BridgeデータシートはGoogleで確認してください。 PCI-ISAブリッジのPCI構成空間には、次のレジスタがあります。

Offset 43 - ROM Decode Control  

Setting these bits enables the indicated address range to be
included in the ROMCS# decode:  

7    FFFE0000h-FFFEFFFFh  
6    FFF80000h-FFFDFFFFh 
5    000E8000h-000EFFFFh  
4    000E0000h-000E7FFFh 
3    000D8000h-000DFFFFh  
2    000D0000h-000D7FFFh  
1    000C8000h-000CFFFFh 
0    000C0000h-000C7FFFh  

したがって、起動後に「ホール」(ISAマッピング)を有効にして、ロジックアナライザとして機能していることを確認できます。カードが高いビットをデコードできない場合は、代わりに試してFFFE0000hみる価値があります。000E0000h

これを正しく実行し、変更されたマッピングをLinuxカーネルに通知する方法がわかりません。たぶんこれには起動オプションもあります。

ダミーファイルを介してPCI構成スペースにアクセスできることがわかっているので、/sys/bus/pci/devices/0000:00:07.0/configカーネルドライバーの外部でこれを試すこともできます。

3)本人のカードが列挙されていることを必ず確認してdmesg確認してください。/sys/bus/pnp出力内容がわからない場合は、dmesg貼り付けボックスに入れてリンクを投稿してみてください。

関連情報