
マザーボードのGPIOピンを動作させようとしていますが、ピンの番号/説明とドライバがロードされているかどうかはわかりません。
私が見つけたこれどこに行くべきか案内してくださいエコ説明をピンで指定し、出力を次にリダイレクトします。/sys/class/gpio/export
/sys/class/gpio # echo 0 > export
だから私はそうでした。これ/システム/クラス/GPIO/私のシステムには、次の内容を含むフォルダがあります。
[user@host ~]$ ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Nov 30 18:12 export
--w------- 1 root root 4096 Nov 30 18:12 unexport
[user@host ~]$
(しかし、このフォルダが表示されたらドライバがロードされたことを意味しますか?)
その後、マザーボードのデータシートで複数のピン名を試しましたが、常に次のような結果が表示されます。
[root@host gpio]# echo 31 > export
echo: write error: Invalid argument
[root@host gpio]#
使っていますアーキテクチャLinux私のカーネルバージョンは4.19.2-arch1-1-ARCHです。
私が使っているマザーボードはスーパーマイクロX10SBA。https://www.supermicro.com/products/motherboard/celeron/x10/x10sba.cfm
マザーボードのGPIOについて見つけることができる唯一の情報は2-25ページにあります。X10SBAマザーボードデータシート:
1 +3.3V
2 SOC_P3V3_GPIO_S5_31
3 SOC_P3V3_GPIO_S5_32
4 SOC_P3V3_GPIO_S5_33
5 SOC_P3V3_GPIO_S5_34
6
SOC_P3V3_GPIO_S5_3
S5 _37
9 SOC_P3V3_GPIO_S5_38
10 グランド
私が理解したところによると、これはボードに8つのGPIOがあることを意味します。
だから様々な組み合わせを試しました。/sys/class/gpio/export良い
echo SOC_P3V3_GPIO_S5_31 > export
echo 111 > export
echo 531 > export
echo S531 > export
echo S5_31 > export
...
など。何も動作しません。
ここで根本的に間違ったことをしているのでしょうか?これらのGPIO名はどこで定義されていますか?どこ出口情報はどこで入手できますか?まず、これらの定義を直接下げる必要がありますか?たぶんカーネルを再コンパイルする必要がありますか?
私はGPIOヘッダーにどのチップが使用されているのかを調べ続けました。
回路基板のGPIOピンヘッダ(JP1)の横にチップがあります。NXP GTL2010(データシート)、D1∼D8のピンがここに接続されています。チップは、出力が3.3Vまたは5Vになるようにわずかな電圧変換を実行するようです。したがって、信号はS1-S8ピンから出なければなりません。残念ながら、トレースはボード上のビアとして接続されているため、GTL2010のソースピンがどこに接続されているかがわかりません。
しかし、ピンがCPUに直接接続されているとします。私はこれについて100%確信していません。しかし、それは私の家です。
マザーボードのCPUはIntel Celeron J1900です。しかし、残念ながら、データシートやGPIOの有無に関する情報が見つかりません。
LinuxのボードにGPIOをリストできますか?特定のGPIOドライバが自分のシステムですでに使用されていることを確認するにはどうすればよいですか?
編集する
ちょっとした調査の終わりにCPUデータシートGPIO設定を変更するには、GPIO_BASE_ADDRESSレジスタ(データシートページ1219)を設定する必要があることがわかりました。このレジスタには、GPIOロジックを持つI / Oスペースのベースアドレスが必要です。ここでどのアドレスを入力するのかわかりません。 I / Oスペースに256個の空きバイトがありますか?
それ以外に、GPIO_BASE_ADDRESSレジスタにアクセスする方法を理解していません。データシートには、このレジスタがPCI構成スペースにあると指定されています。バス0、デバイス31(16進数1f)、機能0。(データシート56ページ)
lspci はデバイス 31 に次の出力を提供します。
[user@host ~]$ sudo lspci -vvvvvv
...
00:1f.0 ISA bridge: Intel Corporation Atom Processor Z36xxx/Z37xxx Series Power Control Unit (rev 0e)
Subsystem: Super Micro Computer Inc Atom Processor Z36xxx/Z37xxx Series Power Control Unit
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Capabilities: [e0] Vendor Specific Information: Len=0c <?>
Kernel driver in use: lpc_ich
Kernel modules: lpc_ich
00:1f.3 SMBus: Intel Corporation Atom Processor E3800 Series SMBus Controller (rev 0e)
Subsystem: Super Micro Computer Inc Atom Processor E3800 Series SMBus Controller
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin B routed to IRQ 18
Region 0: Memory at 90a04000 (32-bit, non-prefetchable) [size=32]
Region 4: I/O ports at e000 [size=32]
Capabilities: [50] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: i801_smbus
Kernel modules: i2c_i801
レジスタにベースアドレスを書き込むためにこの領域にどのようにアクセスする必要があるのかわかりません。 Cでどのようにこれを達成できますか?これを達成するために既存のLinux機能を利用できますか?
編集する
構成スペースの16進ダンプは以下を出力します。
[user@host ~]$ sudo lspci -xxx -s 00:1f.0
[sudo] password for user:
00:1f.0 ISA bridge: Intel Corporation Atom Processor Z36xxx/Z37xxx Series Power Control Unit (rev 0e)
00: 86 80 1c 0f 07 00 10 02 0e 00 01 06 00 00 80 00
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 d9 15 16 08
30: 00 00 00 00 e0 00 00 00 00 00 00 00 00 00 00 00
40: 03 04 00 00 02 30 d0 fe 03 05 00 00 02 c0 d0 fe
50: 02 80 d0 fe 02 10 d0 fe 02 00 f0 fe 02 50 d0 fe
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 cf ff 00 00 00 00 00 00
e0: 09 00 0c 10 00 00 00 00 00 00 00 00 00 00 00 00
f0: 01 c0 d1 fe 00 00 00 00 1a 0f 0e 01 03 03 00 00
[user@host ~]$
私の解釈によると、ACPI_BASE_ADDRESSレジスタ(マニュアル1217ページ)には「03 04 00 00」が含まれています。
GPIO_BASE_ADDRESSレジスタ(マニュアル1219ページ)には「03 05 00 00」が含まれています。
dmesgでacpiを見つけると、複数のエントリが返されます(ここに投稿するには多すぎます)。
/proc/ioports は以下を出力します:
[user@host ~]$ sudo cat /proc/ioports
[sudo] password for user:
0000-006f : PCI Bus 0000:00
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-0060 : keyboard
0064-0064 : keyboard
0070-0077 : PCI Bus 0000:00
0070-0077 : rtc0
0078-0cf7 : PCI Bus 0000:00
0080-008f : dma page reg
00a0-00a1 : pic2
00c0-00df : dma2
00f0-00ff : fpu
02e0-02e7 : serial
02f8-02ff : serial
03e0-03e7 : serial
03f8-03ff : serial
0400-047f : pnp 00:01
0400-0403 : ACPI PM1a_EVT_BLK
0404-0405 : ACPI PM1a_CNT_BLK
0408-040b : ACPI PM_TMR
0420-042f : ACPI GPE0_BLK
0430-0433 : iTCO_wdt.0.auto
0430-0433 : iTCO_wdt
0450-0450 : ACPI PM2_CNT_BLK
0460-047f : iTCO_wdt.0.auto
0460-047f : iTCO_wdt
0500-05fe : pnp 00:01
0600-061f : pnp 00:01
0680-069f : pnp 00:01
0a30-0a3f : pnp 00:07
0cf8-0cff : PCI conf1
0d00-ffff : PCI Bus 0000:00
1000-1fff : PCI Bus 0000:01
b000-cfff : PCI Bus 0000:03
b000-cfff : PCI Bus 0000:04
b000-bfff : PCI Bus 0000:07
b000-b01f : 0000:07:00.0
b000-b01f : ahci
b020-b023 : 0000:07:00.0
b020-b023 : ahci
b030-b037 : 0000:07:00.0
b030-b037 : ahci
b040-b043 : 0000:07:00.0
b040-b043 : ahci
b050-b057 : 0000:07:00.0
b050-b057 : ahci
c000-cfff : PCI Bus 0000:05
c000-c01f : 0000:05:00.0
d000-dfff : PCI Bus 0000:02
d000-d01f : 0000:02:00.0
e000-e01f : 0000:00:1f.3
e000-e01f : i801_smbus
e020-e027 : 0000:00:02.0
答え1
通常、GPIOピンはハードウェアによって大きく異なります。システム名、システムドライバ、システムレジスタはありません。
あなたができる唯一のことは、あなたが持っている情報を読み、グーグルし、推測することです。
マザーボードのマニュアルに示すように、GPIOヘッダがあり、GPIOピンが実際に物理的にルーティングされていると想定できます。 (これは与えられていません。GPIOピンはBIOSで他の目的に使用することも、残すこともできます。開いています)。 「SOC」は「システムオンチップ」を意味し、「3V3」は3.3V(TTLレベル)を意味します。
まず、警告する:このヘッダをSoCに直接接続すると、誤動作によりSoCが破損しやすい。静電気放電、誤った電圧レベル、混乱した入出力などにより、SoCとメインCPUが損傷する可能性があります。いつも使用するには、まずバッファチップを接続してください。隣にあるバッファチップも実際にはこのヘッダを保護するだけで他の何も保護しません。
これでデータテーブルが必要です。 Google検索が出ます。これ、よさそうですね。
これは、SoCにS0用のGPIOピン101個、S5用のGPIOピン43個があることを示しています。そのうち10個だけがマザーボードのヘッダーに表示されていますが、幸いなことに私たちはそれが何であるかを知っています。他のものはマザーボードの他のものに接続することができるので、そのままにすることが重要です。
56ページでは、GPIO(PCU)がI / O構造のPCIデバイスによってデコードされた256バイト長のリムーバブルI / O範囲であることがわかります。どのように説明するのかわかりませんGBA: PCI[B:0,D:31,F:0] + 48h
。とにかく、これが意味するのは、次のステップは、lspci
どのPCIデバイスが意味するのかを理解し、有望に見える256バイトの領域を見つけるのに必要なだけの詳細を使用することです。
1262ページから、PCU(プラットフォームデバイスコントローラ)、特にGPIOレジスタについて詳しく紹介します。
したがって、次のステップは、これらすべてを読んで理解し、正しいPCIカードとゾーンを使用するカーネルドライバを作成することです。このドライバはI / Oピンが下に表示されるようにします/sys/class/gpio
。記事を書いてはいけない。また難しく、既存のGPIOドライバを検索してこのハードウェアに合わせて修正するだけで十分です。 Cでプログラムする方法を知る必要があり、カーネルモジュールの作成方法を自分で教えることができなければなりません。
特定のハードウェア用のドライバがすでに存在しますが、少なくともカーネルには存在しない可能性があります(またはすでにいくつかのピンが表示されています)。
編集する
OK、B、D、FはPCIデバイスのバス、デバイス、および機能と一致しているように見え、SMBusコントローラには2つの32バイト領域があるため、少なくとも1つはマニュアルに記載されている領域と一致します。
ただし、地域はなく、ベンダー固有の00:1f.0
ブロックのみがあります。データシートには+40
ACPI電源管理、+48h
GPIO、および+f0h
RCBAが記載されており、「BAR(デフォルトアドレスレジスタ)または同様のものを使用して設定されます」と記載されているため、BAR /地域ではなくPCI構成のバイトにすることもできます。
lspci -xxx -s 00:1f.0
したがって、構成スペース全体をhexdumpとしてマークするこのような操作(root)を試してください。また、dmesg
起動後にどこかにACPI電源管理が表示されることを確認してくださいcat /proc/ioports
(つまり、接続されたI / Oポートの範囲があるかどうか)。と比較できます+40h
。情報で質問を編集します。
GPIOの範囲がBAR /地域にない場合、有効にするのは非常に困難になります。この時点でカーネルドライバの作成を開始する必要があります。
編集する
Corebootプロジェクトには、次のIntelのGPIOエントリにアクセスするコードもあります。GPIO.cそしてGPIO.hベイトレイルのアーキテクチャ。 Celeron J1900がどのアーキテクチャに属しているかは不明ですが、一致しなくてもGPIO領域が正常に動作するかどうかについてのヒントを与えることができます。
編集する
まあ、BARは実際には空です。 +40hと+48hがストリップのように動作すると仮定すると、両方ともI / Oスペースです(最下位ビットは1)。
+40h (ACPI) = 0400h
+48h (GPIO) = 0500h
/proc/ioports
これは以下と比較すると意味があります。 ACPIは0400-047fで、0500-05feは同じデバイスに予約されていますpnp 00:01
。
これは入出力範囲であり、マッピングされています。/dev/port
正しいオフセットで読み書きしてアクセスしたり、Cプログラムで使用したりできますioperm
。 Linuxカーネル開発者がこれらの機能の1つまたは両方を無効にすることを脅かしていることを覚えておいてくださいが、まだ機能しているかどうかわかりません。この場合、カーネルドライバが必要です。
それにもかかわらず、I / Oスペースを使用するときは非常に注意する必要があります。誤ったアドレスを読み込んでもハードウェアの動作が発生する可能性があります。だからではないhexdump -C /dev/port
。また、アクセスサイズも重要です。
データシートにGPIO I / Oスペースがどのように機能するかについての具体的な内容が見つからないため、より良いデータシートのためにGoogleを検索する必要があるか、Corebootファイルが十分に似ている可能性があります。
答え2
同様のハードウェアを購入しましたが、同様の問題が発生しました。最初は他の方が教えてくれた経路を探索してみて、次のように解決しました。
マイシステム: CPU バージョン: Intel(R) Celeron(R) CPU J1900 @ 1.99GHz
ある時点で、私はこれがIT8786チップに実装されていると思いました。
カーネル構成を確認すると、IT87xシリーズドライバのサポートを見つけることができます(もちろんGPIOドライバの下)。私の場合、モジュールとしてのみ有効になります。
その後、モジュールをロードしました。
sudo insmod /lib/modules/5.8.0-55-generic/kernel/drivers/gpio/gpio-it87.ko
dmesg は次の項目を返します。
gpio_it87: Found Chip IT8786 rev 2. 64 GPIO lines starting at 0a00h
/ devをチェックすると、gpiochip0が表示され、そこで必要に応じてすでに述べた(引退したが)sysfsメソッドを使用できます。
物理ピンをハードウェアに接続する方法がわからない場合は、以下を試してください。
apt-get install gpiod
私の場合、gpioinfoを実行すると次のものが返されます。
gpiochip0 - 64 lines:
line 0: "it87_gp10" unused input active-high
line 1: "it87_gp11" unused input active-high
line 2: "it87_gp12" "sysfs" input active-high [used]
line 3: "it87_gp13" unused input active-high
line 4: "it87_gp14" unused input active-high
line 5: "it87_gp15" unused input active-high
line 6: "it87_gp16" unused input active-high
line 7: "it87_gp17" unused input active-high
line 8: "it87_gp20" unused input active-high
line 9: "it87_gp21" unused input active-high
line 10: "it87_gp22" unused input active-high
line 11: "it87_gp23" unused input active-high
line 12: "it87_gp24" "sysfs" input active-high [used]
line 13: "it87_gp25" unused input active-high
line 14: "it87_gp26" unused input active-high
line 15: "it87_gp27" unused input active-high
line 16: "it87_gp30" unused input active-high
line 17: "it87_gp31" unused input active-high
line 18: "it87_gp32" unused input active-high
line 19: "it87_gp33" unused input active-high
line 20: "it87_gp34" unused input active-high
line 21: "it87_gp35" unused input active-high
line 22: "it87_gp36" "sysfs" output active-high [used]
line 23: "it87_gp37" unused input active-high
line 24: "it87_gp40" unused input active-high
line 25: "it87_gp41" unused input active-high
line 26: "it87_gp42" unused input active-high
line 27: "it87_gp43" unused input active-high
line 28: "it87_gp44" unused input active-high
line 29: "it87_gp45" unused input active-high
line 30: "it87_gp46" unused input active-high
line 31: "it87_gp47" unused input active-high
line 32: "it87_gp50" unused input active-high
line 33: "it87_gp51" unused input active-high
line 34: "it87_gp52" unused input active-high
line 35: "it87_gp53" unused input active-high
line 36: "it87_gp54" unused input active-high
line 37: "it87_gp55" unused input active-high
line 38: "it87_gp56" unused input active-high
line 39: "it87_gp57" unused input active-high
line 40: "it87_gp60" unused input active-high
line 41: "it87_gp61" unused input active-high
line 42: "it87_gp62" unused input active-high
line 43: "it87_gp63" unused input active-high
line 44: "it87_gp64" unused input active-high
line 45: "it87_gp65" unused input active-high
line 46: "it87_gp66" unused input active-high
line 47: "it87_gp67" unused input active-high
line 48: "it87_gp70" unused input active-high
line 49: "it87_gp71" unused input active-high
line 50: "it87_gp72" unused input active-high
line 51: "it87_gp73" "sysfs" input active-high [used]
line 52: "it87_gp74" "sysfs" output active-high [used]
line 53: "it87_gp75" "sysfs" input active-high [used]
line 54: "it87_gp76" "sysfs" input active-high [used]
line 55: "it87_gp77" unused input active-high
line 56: "it87_gp80" unused input active-high
line 57: "it87_gp81" unused output active-high
line 58: "it87_gp82" unused input active-high
line 59: "it87_gp83" unused input active-high
line 60: "it87_gp84" unused input active-high
line 61: "it87_gp85" unused input active-high
line 62: "it87_gp86" unused input active-high
line 63: "it87_gp87" unused input active-high
gpiodユーティリティを使用してさまざまなピンを処理できます。製造元で利用可能なGPI / Oを指示する場合は、「ライン」を「it87_gpXX」部分、つまり製造元が提供できるXXピンに関連付けることができます。
クイックチェックは昔ながらの方法で行うことができます。
/sys/class/gpioにアクセスして、見つかったgpioチップを確認してください。 gpiochip内のベースは開始位置であり、gpioinfoから返される線点はオフセットです。
私の場合、448をベースとして使用しました。 57行目のGP81に達するには、次の手順を実行します。
echo 505 > /sys/class/gpio/export
これが役立つことを願っています!おかげでドライバを書く必要がなくなりました(メーカーからドライバを送信しましたが動作しませんでした)。