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

 
(同じ利用者による、間の4版が非表示)
32行目: 32行目:
オンライン上にあるGPIOに関するドキュメントの多くは、ArduinoおよびRaspberry PiのようなSoCを対象にしている。<br>
オンライン上にあるGPIOに関するドキュメントの多くは、ArduinoおよびRaspberry PiのようなSoCを対象にしている。<br>
PCにおいては、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>
<br>
Qtを使用して、PCのGPIOピンを直接制御することは一般的ではないが、OSやハードウェアに依存した方法を使用することで可能である。<br>
Qtを使用して、PCのGPIOピンを直接制御することは一般的ではないが、OSやハードウェアに依存した方法を使用することで可能である。<br>
70行目: 72行目:
BIOS / UEFIには、どのスーパーI/Oチップが使用されているか表示されていない場合もある。<br>
BIOS / UEFIには、どのスーパーI/Oチップが使用されているか表示されていない場合もある。<br>
スーパーI/Oチップの名前を確認する場合は、PCケースを開けて、GPIOピンの付近にあるチップの表面に描かれているシルク等で確認する。<br>
スーパーI/Oチップの名前を確認する場合は、PCケースを開けて、GPIOピンの付近にあるチップの表面に描かれているシルク等で確認する。<br>
<br>
==== スーパーI/Oチップのカーネルモジュールの有効化 ====
まず、付属しているスーパーI/Oチップのカーネルモジュールを知りたい場合は、[https://github.com/torvalds/linux Linux KernelのGithub]にあるgit repoから、スーパーI/Oチップ名で検索する。<br>
<br>
以下の例では、スーパーI/Oチップ名が"iTE IT8786E-I"の場合である。<br>
repo:torvalds/linux iTE IT8786E-I
<br>
<syntaxhighlight lang="c">
/* linux/drivers/gpio/gpio-it78.cファイル */
/* gpio-it78.c */
/*
  *  GPIO interface for IT87xx Super I/O chips
  *
  *  Author: Diego Elio Pettenò <flameeyes@flameeyes.eu>
  *  Copyright (c) 2017 Google, Inc.
  *
  *  Based on it87_wdt.c    by Oliver Schuster
  *          gpio-it8761e.c by Denis Turischev
  *          gpio-stmpe.c  by Rabin Vincent
  */
</syntaxhighlight>
<br>
<syntaxhighlight lang="make">
# linux/drivers/gpio/Makefileファイル
# ※ "CONFIG_GPIO_IT87"という部分の文字列を控えておくこと
obj-$(CONFIG_GPIO_IT87) += gpio-it87.o
</syntaxhighlight>
<br>
# linux/drivers/gpio/Kconfigファイル
Kconfig snippet:
config GPIO_IT87
        tristate "IT87xx GPIO support"
        help
          Say yes here to support GPIO functionality of IT87xx Super I/O chips.
          This driver is tested with ITE IT8728 and IT8732 Super I/O chips, and
          supports the IT8761E, IT8613, IT8620E, and IT8628E Super I/O chips as
          well.
          To compile this driver as a module, choose M here: the module will
          be called gpio_it87.
<br>
スーパーI/Oチップ名を確認して、該当するカーネルモジュールがインストールされているかどうかを確認する。<br>
find /lib/modules/$(uname -r)/kernel/drivers/gpio -iname "*gpio*" | grep -i gpio-it87
<br>
スーパーI/Oチップ名を確認して、該当するカーネルモジュールが読み込まれているかどうかを確認する。<br>
grep CONFIG_GPIO_IT87 /boot/config-$(uname -r)
# 出力例:
# mと出力される場合、そのカーネルモジュールがデフォルトでは無効であることを意味する
CONFIG_GPIO_IT87=m
<br>
スーパーI/Oチップのカーネルモジュールを有効にする。<br>
sudo modprobe gpio-it87
<br>
GPIOピンの入出力に関する設定はBIOS / UEFIを通してのみ変更可能であり、GPIOの値を設定 / 取得する場合はスーパーユーザ権限が必要である。<br>
<br>
もし、gpiolibのピン番号がBIOS / UEFIのピン番号と一致しない場合は、各ピンをブレッドボード上のLEDに接続して、以下のようなシェルスクリプトを実行する。<br>
以下の例では、チップセット0の全ピンを1秒間ごとにトグルしている。<br>
ただし、実行前に、BIOS / UEFIにおいて、全てのGPIOピンを出力モードに割り当てること。<br>
<syntaxhighlight lang="sh">
for i in $(seq 0 63)
do
    echo -n "$i on "
    sudo gpioset 0 "$i=1"
    sleep 1
    echo off
    sudo gpioset 0 "$i=0"
done
</syntaxhighlight>
<br><br>
<br><br>


75行目: 152行目:
sysfsを使用して、GPIOを制御することができる。<br>
sysfsを使用して、GPIOを制御することができる。<br>
<br>
<br>
===== GPIOの操作インタフェースの公開 =====
==== GPIOの操作インタフェースの公開 ====
まず、/sys/class/gpioディレクトリにアクセスして、カーネル空間からユーザ空間にGPIOの操作インタフェースを公開する。<br>
まず、/sys/class/gpioディレクトリにアクセスして、カーネル空間からユーザ空間にGPIOの操作インタフェースを公開する。<br>
<br>
<br>
105行目: 182行目:
各レジスタの制御ピンの開始番号ベース、レジスタ名、総ピン数を含む。<br>
各レジスタの制御ピンの開始番号ベース、レジスタ名、総ピン数を含む。<br>
<br>
<br>
===== gpioカーネルモジュールのインストール =====
==== gpioカーネルモジュールのインストール ====
<u>もし、gpioカーネルモジュールが無い場合は、インストールする必要がある。</u><br>
<u>もし、gpioカーネルモジュールが無い場合は、インストールする必要がある。</u><br>
<br>
<br>
138行目: 215行目:
*: 一般的に、カーネルモジュールは、/lib/modules/$(uname -r)/extraディレクトリにインストールされる。
*: 一般的に、カーネルモジュールは、/lib/modules/$(uname -r)/extraディレクトリにインストールされる。
*: 任意のディレクトリに配置したい場合、<code>INSTALL_MOD_DIR</code>オプションを付加して、extraディレクトリに代わるパスを指定する。
*: 任意のディレクトリに配置したい場合、<code>INSTALL_MOD_DIR</code>オプションを付加して、extraディレクトリに代わるパスを指定する。
*: 例えば、<code>INSTALL_MOD_DIR=fs/f2fs</code>と指定する場合、インストールディレクトリは<code>/lib/modules/$(uname -r)/fs/f2fs</code>ディレクトリとなる。
*: 例えば、<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 scripts prepare modules_prepare -j $(nproc)
  sudo make -C . M=fs/f2fs -j $(nproc)
  sudo make -C . M=drivers/gpio -j $(nproc)
   
   
  sudo mkdir -p /lib/modules/$(uname -r)/kernel/fs/f2fs/
  sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/gpio
  sudo cp fs/f2fs/f2fs.ko  /lib/modules/$(uname -r)/kernel/fs/f2fs/
  sudo cp drivers/gpio/gpio-it87.ko  /lib/modules/$(uname -r)/kernel/drivers/gpio
   
   
  # または
  # または
149行目: 226行目:
  sudo make prepare -j $(nproc)
  sudo make prepare -j $(nproc)
  sudo make modules_prepare -j $(nproc)
  sudo make modules_prepare -j $(nproc)
  sudo make M=fs/f2fs -j $(nproc)
  sudo make M=drivers/gpio -j $(nproc)
  sudo make modules M=fs/f2fs -j $(nproc)
  sudo make modules M=drivers/gpio -j $(nproc)
  sudo make modules_install M=fs/f2fs INSTALL_MOD_DIR=kernel/fs/f2fs -j $(nproc)
  sudo make modules_install M=drivers/gpio INSTALL_MOD_DIR=kernel/drivers/gpio -j $(nproc)
<br>
<br>
Linuxカーネルモジュールのインストール後は、Linuxカーネルのビルドファイルを削除する。(ファイル容量が膨大なため)<br>
Linuxカーネルモジュールのインストール後は、Linuxカーネルのビルドファイルを削除する。(ファイル容量が膨大なため)<br>
157行目: 234行目:
  または
  または
  sudo make distclean -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>