私はインテルシステムを持っていEthernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 04)
ます。のデータシートのようなデータシートをダウンロードしましたIntel ® 82579 Gigabit Ethernet PHY
今、私は次のようなpciイーサネットデバイスのresource0を読んでいます
if((fd = open("/sys/bus/pci/devices/0000:00:19.0/resource1", O_RDWR | O_SYNC)) == -1) {
perror("Error: open error");
}
int map_size = 4096UL;
...
map_base = mmap(0,4096UL , PROT_READ, MAP_SHARED, fd, Register_Values_From_Datasheet);
x86-64 ビット システムを使用しています。カリ Linux 5.7。だから私は Register_Values_From_Datasheet
上記のようにデータシートからのレジスタオフセット値で置き換えています0x00008
for STATUS:Device Status Register
=from datasheet
しかし、mmap() の errno は、22:EINVAL
mmap 呼び出し後に値を持っています。無効な引数を意味します。データシートから読み取っているオフセット値は、別の方法で解釈する必要があるかもしれません。
イーサネットデバイスの sys/bus/pci/devices/0000:00:19.0 にある私のリソースファイルは次のようなものです
0x00000000fe400000 0x00000000fe41ffff 0x0000000000040200
0x00000000fe427000 0x00000000fe427fff 0x0000000000040200
0x000000000000f060 0x000000000000f07f 0x0000000000040101
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
上記のリソース テキスト ファイル (resource0) のダンプから、メモリ マップド IO が 0x00000000fe400000 から始まることがわかります。だから私は mmap (return (void*)=&0x00000000fe400000)= の戻りアドレスであるべきだと思いますが、私は次のようなものを取得してい0xffffffff
ます.errnoは22です。オフセットをどのように解釈する必要があるかについて、正しい方向に私を導くことができますかデータシートから。また、pci イーサネット デバイスのパケットを取得するために、通常どのレジスタにアクセスする必要がありますか。私はデバイスプログラミングが初めてなので。