GPIOピン番号を識別するには? GPIOドライバがロードされましたか?

GPIOピン番号を識別するには? GPIOドライバがロードされましたか?

マザーボードの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です。
私が使っているマザーボードはスーパーマイクロX10SBAhttps://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ブロックのみがあります。データシートには+40ACPI電源管理、+48hGPIO、および+f0hRCBAが記載されており、「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ファイルが十分に似ている可能性があります。

おすすめ記事