📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

 
(同じ利用者による、間の12版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
GPIO (General Purpose Input/Output (汎用入出力)) は、マイクロコントローラやシングルボードコンピュータ等のデバイスに搭載されている汎用のピンのことである。<br>
これらのピンは、ソフトウェアにより入力または出力として設定して、制御することができる。<br>
<br>
GPIOの主な概念は以下に示す。<br>
* 入力
*: GPIOピンを入力として設定する場合、外部のデバイスやスイッチの状態を読み取ることができる。
*: 例えば、ボタンが押下されているかどうかを検出するために使用できる。
*: <br>
* 出力
*: GPIOピンを出力として設定する場合、ピンの状態をHIGH (通常は3.3[V]または5[V])、または、LOW (0[V]) に設定できる。
*: これにより、LEDの点灯 / 消灯、他のデバイスの制御が可能になる。
*: <br>
* プルアップ / プルダウン抵抗
*: GPIOピンは、プルアップ抵抗またはプルダウン抵抗を内部に持つことができる。
*: これらの抵抗は、ピンが明確な状態 (HIGHまたはLOW) を持つようにするために使用される。
*: <br>
* 割り込み
*: 一部のGPIOピンは、割り込み機能をサポートしている。
*: これにより、ピンの状態が変化した時に、CPUに割り込み信号を送ることができる。
*: これは、リアルタイムの応答が必要な場合に使用する。
* PWM
*: 一部のGPIOピンは、PWM機能をサポートしている。
*: PWMはデューティ比を変化させることにより、LEDの明るさ、モータの速度を制御するために使用される。
<br>
GPIOは、ボタン、スイッチ、LED、センサ、ディスプレイ、モータ等の様々な電子部品やデバイスとのインターフェースに使用されている。<br>
GPIOを使用することにより、これらのデバイスとソフトウェアを連携させて、独自のプロジェクトや組み込みシステムを開発することができる。<br>
<br>
ただし、GPIOを使用する際は、電気的な特性や制限に注意が必要となる。<br>
不適切な使用は、デバイスの損傷や誤動作につながる可能性があることに注意する。<br>
<br>
オンライン上にあるGPIOに関するドキュメントの多くは、ArduinoおよびRaspberry PiのようなSoCを対象にしている。<br>
オンライン上にあるGPIOに関するドキュメントの多くは、ArduinoおよびRaspberry PiのようなSoCを対象にしている。<br>
SoCとは異なり、GPIOのあるPCはGPIOピンをCPUに直接統合していないが、スーパーI/Oチップ (SIO) を使用している。<br>
PCにおいては、SoCとは異なり、GPIOのあるPCはGPIOピンをCPUに直接統合していないが、スーパーI/Oチップ (SIO) を使用している。<br>
<br>
[[ファイル:Qt GPIO 1.png|フレームなし|中央]]
<br>
Qtを使用して、PCのGPIOピンを直接制御することは一般的ではないが、OSやハードウェアに依存した方法を使用することで可能である。<br>
<br><br>
<br><br>


34行目: 68行目:
<br><br>
<br><br>


== スーパーI/Oチップ名の確認 ==
== スーパーI/Oチップを使用する場合 (スーパーI/Oチップ付属のPCの場合) ==
==== スーパーI/Oチップ名の確認 ====
BIOS / UEFIには、どのスーパーI/Oチップが使用されているか表示されていない場合もある。<br>
BIOS / UEFIには、どのスーパーI/Oチップが使用されているか表示されていない場合もある。<br>
スーパーI/Oチップの名前を確認する場合は、PCケースを開けて、GPIOピンの付近にあるチップの表面に描かれているシルク等で確認する。<br>
スーパーI/Oチップの名前を確認する場合は、PCケースを開けて、GPIOピンの付近にあるチップの表面に描かれているシルク等で確認する。<br>
<br><br>
<br>
 
==== スーパーI/Oチップのカーネルモジュールの有効化 ====
== スーパーI/Oチップのカーネルモジュールの有効化 ==
まず、付属しているスーパーI/Oチップのカーネルモジュールを知りたい場合は、[https://github.com/torvalds/linux Linux KernelのGithub]にあるgit repoから、スーパーI/Oチップ名で検索する。<br>
まず、付属しているスーパーI/Oチップのカーネルモジュールを知りたい場合は、[https://github.com/torvalds/linux Linux KernelのGithub]にあるgit repoから、スーパーI/Oチップ名で検索する。<br>
<br>
<br>
46行目: 80行目:
<br>
<br>
  <syntaxhighlight lang="c">
  <syntaxhighlight lang="c">
/* linux/drivers/gpio/gpio-it78.cファイル */
  /* gpio-it78.c */
  /* gpio-it78.c */
   
   
61行目: 97行目:
<br>
<br>
  <syntaxhighlight lang="make">
  <syntaxhighlight lang="make">
  # Makefile
  # linux/drivers/gpio/Makefileファイル
  # ※ "CONFIG_GPIO_IT87"という部分の文字列を控えておくこと
  # ※ "CONFIG_GPIO_IT87"という部分の文字列を控えておくこと
   
   
  obj-$(CONFIG_GPIO_IT87)                     += gpio-it87.o
  obj-$(CONFIG_GPIO_IT87) += gpio-it87.o
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
# linux/drivers/gpio/Kconfigファイル
  Kconfig snippet:
  Kconfig snippet:
   
   
80行目: 118行目:
           To compile this driver as a module, choose M here: the module will
           To compile this driver as a module, choose M here: the module will
           be called gpio_it87.
           be called gpio_it87.
<br>
スーパーI/Oチップ名を確認して、該当するカーネルモジュールがインストールされているかどうかを確認する。<br>
find /lib/modules/$(uname -r)/kernel/drivers/gpio -iname "*gpio*" | grep -i gpio-it87
<br>
<br>
スーパーI/Oチップ名を確認して、該当するカーネルモジュールが読み込まれているかどうかを確認する。<br>
スーパーI/Oチップ名を確認して、該当するカーネルモジュールが読み込まれているかどうかを確認する。<br>
89行目: 130行目:
<br>
<br>
スーパーI/Oチップのカーネルモジュールを有効にする。<br>
スーパーI/Oチップのカーネルモジュールを有効にする。<br>
  sudo modprobe gpio_it87
  sudo modprobe gpio-it87
<br>
<br>
GPIOピンの入出力に関する設定はBIOS / UEFIを通してのみ変更可能であり、GPIOの値を設定 / 取得する場合はスーパーユーザ権限が必要である。<br>
GPIOピンの入出力に関する設定はBIOS / UEFIを通してのみ変更可能であり、GPIOの値を設定 / 取得する場合はスーパーユーザ権限が必要である。<br>
106行目: 147行目:
  done  
  done  
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
== sysfsの使用 (スーパーI/Oチップが無いPCおよびSBCの場合) ==
sysfsを使用して、GPIOを制御することができる。<br>
<br>
==== GPIOの操作インタフェースの公開 ====
まず、/sys/class/gpioディレクトリにアクセスして、カーネル空間からユーザ空間にGPIOの操作インタフェースを公開する。<br>
<br>
exportファイルにGPIO番号を書き込む。<br>
* direction
*: GPIOの入力 / 出力を指定する。
* value
*: GPIOの出力の制御、あるいは、GPIOの入力を取得する。
<br>
ファイルIOでGPIOを操作する。<br>
これは、open、close、read、writeの4つの関数が存在する。<br>
<br>
まず、システム内に/sys/class/gpioディレクトリが存在するかどうかを確認する。<br>
<br>
/sys/class/gpioディレクトリにおいて、ユーザ空間の/sys/class/gpioディレクトリにgpiochipファイルが存在するかどうかを確認する。<br>
ls /sys/class/gpio
# 出力例 :
export    gpiochip0  unexport
<br>
gpio_operationは、/sys/ファイルインターフェースを通して、IOポートGPIOとファイルシステムのマッピングを操作する。<br>
GPIOを制御するためのディレクトリは、/sys/class/gpioディレクトリに存在する。<br>
<br>
/sys/class/gpio/exportファイルは、制御されているGPIOピン番号をエクスポートする必要性をシステムに通知するために使用される。<br>
<br>
/sys/class/gpio/unexportファイルは、システムにエクスポートのキャンセルを通知するために使用される。<br>
<br>
/sys/class/gpio/gpiochipXディレクトリは、システムのGPIOレジスタの情報を保存する。<br>
各レジスタの制御ピンの開始番号ベース、レジスタ名、総ピン数を含む。<br>
<br>
==== gpioカーネルモジュールのインストール ====
<u>もし、gpioカーネルモジュールが無い場合は、インストールする必要がある。</u><br>
<br>
Linuxカーネルのソースコードをダウンロードする。<br>
* パッケージ管理システムから、Linuxカーネルのソースコードをインストールする場合
*: <code>sudo zypper install kernel-source</code>
*: <br>
* Linuxカーネルの公式webサイトから、Linuxカーネルのソースコードをダウンロードする場合
*: [https://www.kernel.org Linuxカーネルの公式webサイト]または[https://github.com/torvalds/linux/tags Github]にアクセスして、対応するバージョンのLinuxカーネルのソースコードをダウンロードする。
*: あるいは、[https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git/refs/tags Linuxカーネルの公式webサイトにあるGit]から、対応するバージョンのLinuxカーネルをダウンロードする。
*: ダウンロードしたファイルを解凍する。
*: <code>tar xf linux-<バージョン>.tar.gz</code>
*: <code>cd linux-<バージョン></code>
<br>
既存のカーネルコンフィグ(/bootディレクトリ内にあるカーネルコンフィグ)を元に、新しいカーネルコンフィグを生成する。<br>
<code>make olderconfig</code>コマンドは、可能な限り既存のカーネルコンフィグの設定を使用して、ビルドディレクトリ内に必要なファイルを生成する。<br>
make -j $(nproc) olddefconfig O=.
# または
sudo make -j $(nproc) olddefconfig O=.
<br>
gpioカーネルモジュールのビルド設定を行うため、<code>make menuconfig</code>コマンドを実行する。<br>
make menuconfig -j $(nproc)
# または
sudo make menuconfig -j $(nproc)
<br>
TUI画面が起動するので、[Device Drivers] - [GPIO Support] - [/sys/class/gpio/... (sysfs interface)]に移動して、[M]キーを押下する。<br>
TUI画面下にある[Save]を選択して、上記の設定を保存する。<br>
<br>
Linuxカーネルから、gpioカーネルモジュールのみをビルドする。<br>
<br>
* INSTALL_MOD_DIRオプション
*: 一般的に、カーネルモジュールは、/lib/modules/$(uname -r)/extraディレクトリにインストールされる。
*: 任意のディレクトリに配置したい場合、<code>INSTALL_MOD_DIR</code>オプションを付加して、extraディレクトリに代わるパスを指定する。
*: 例えば、<code>INSTALL_MOD_DIR=drivers/gpio</code>と指定する場合、インストールディレクトリは<code>/lib/modules/$(uname -r)/kernel/drivers/gpio</code>ディレクトリとなる。
sudo make scripts prepare modules_prepare -j $(nproc)
sudo make -C . M=drivers/gpio -j $(nproc)
sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/gpio
sudo cp drivers/gpio/gpio-it87.ko  /lib/modules/$(uname -r)/kernel/drivers/gpio
# または
sudo make prepare -j $(nproc)
sudo make modules_prepare -j $(nproc)
sudo make M=drivers/gpio -j $(nproc)
sudo make modules M=drivers/gpio -j $(nproc)
sudo make modules_install M=drivers/gpio INSTALL_MOD_DIR=kernel/drivers/gpio -j $(nproc)
<br>
Linuxカーネルモジュールのインストール後は、Linuxカーネルのビルドファイルを削除する。(ファイル容量が膨大なため)<br>
sudo make clean -j $(nproc)      # .configファイルを残す
または
sudo make distclean -j $(nproc)  # .configファイル等の設定ファイルを全て削除する
<br>
==== Linuxカーネルモジュールの読み込み (セキュアブートが無効の場合) ====
Linuxカーネルモジュール全体を読み込む。<br>
sudo depmod -a $(uname -r)
<br>
PCを再起動して、gpioカーネルモジュールが正常に動作するかどうかを確認する。<br>
また、gpioカーネルモジュールが正常に読み込まれているかどうかを確認する。<br>
lsmod | grep gpio-it87
# または
sudo modinfo gpio-it87
<br>
必要であれば、F2FSモジュールをXZ形式またはZstandard形式に圧縮する。(任意)<br>
# XZ形式の場合
cd /lib/modules/$(uname -r)/kernel/drivers/gpio
sudo xz -f gpio-it87.ko
# Zstandard形式の場合
cd /lib/modules/$(uname -r)/kernel/drivers/gpio
sudo zstd --rm gpio-it87.ko
<br><br>
<br><br>


204行目: 351行目:
<br><br>
<br><br>


{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]