MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - GPIOのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - GPIO
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == オンライン上にあるGPIOに関するドキュメントの多くは、ArduinoおよびRaspberry PiのようなSoCを対象にしている。<br> SoCとは異なり、GPIOのあるPCはGPIOピンをCPUに直接統合していないが、スーパーI/Oチップ (SIO) を使用している。<br> <br> Qtを使用して、PCのGPIOピンを直接制御することは一般的ではないが、OSやハードウェアに依存した方法を使用することで可能である。<br> <br><br> == GPIOへのアクセス == 多くのLinuxディストリビューションにおいて、GPIOを扱うことができる。<br> 最近のLinuxでは、/dev/gpiochip[n]キャラクタデバイスをマウントするカーネルモジュールを通して、GPIOを公開している。<br> <br> GPIOと対話するための推奨ユーティリティは、<u>gpiod</u>である。<br> これは、GPIOの値の列挙、読み取り、書き込みを行うための一連のCLIを提供するものである。<br> <br> ただし、/dev/gpiochip[n]キャラクタデバイスが無い場合は、Linuxカーネルがハードウェアのドライバが読み込まれていない。<br> <br><br> == BIOS / UEFIの設定 == BIOS / UEFIにおいて、GPIOへのアクセスを提供する必要がある。<br> <br> # まず、BIOS / UEFIの画面から、[Advanced]タブにある[SIO MISC Configuration]メニューから、[WDT, CASE OPEN, GPIO, DEBUG...]を選択する。 # [WDT, CASE OPEN, GPIO, DEBUG...]画面では、ウォッチドッグタイマ、2つのCOMポートモード (RS232、RS485、RS422)、複数のGPIO設定へのアクセス可否の設定がある。 #* GPIOの設定 #*: 各ピンはGPIO[n]という名前である。 (nは0以上の数値) #*: モードは入力または出力で設定できる。 #*: [Output]に設定すると、出力値を<code>Low</code>または<code>High</code>に設定することができる。 #*: 使用する予定の全てのGPIOピンの機能をマッピングすること。 <br> 例えば、以下に示すように、GPIOピンはPCケースに表示されているように、左から右に番号が付けられている。<br> 以下の例では、上段は3.3[V]出力、GPIOピン 4本、GNDピン 2本、下段は3.3[V]出力、GPIOピン 4本、12[V]および5[V]出力がある。<br> 1 2 3 4 5 6 7 3V3 7 6 5 4 GND GND --------------------------- 3V3 3 2 1 0 12V 5V 1 2 3 4 5 6 7 <br><br> == スーパーI/Oチップ名の確認 == BIOS / UEFIには、どのスーパーI/Oチップが使用されているか表示されていない場合もある。<br> スーパーI/Oチップの名前を確認する場合は、PCケースを開けて、GPIOピンの付近にあるチップの表面に描かれているシルク等で確認する。<br> <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> == エラー == ==== GPIOピンの入力を開放する場合 ==== GPIOピンを入力設定 (<code>pull-down</code>オプションを付加) にして開放する場合、該当ピンの状態を確認すると<code>High</code>を返す場合がある。<br> sudo gpioget -B pull-down 0 0 # 出力例: 1 <br> これを解決するには、外付けのプルダウン抵抗を追加することである。<br> 1[K]、10[K]、100[K]のプルダウン抵抗を試して、カット&トライすること。<br> <br><br> == サンプルコード == 以下の例では、Linuxのsysfsインターフェースを使用してGPIO 17を制御している。<br> <br> # まず、exportGpio関数でGPIOをエクスポートして、使用可能にする。<br> # 次に、setGpioDirection関数でGPIOの方向を出力 (out) に設定する。<br> # setGpioValue関数を使用して、GPIOの値を1 (HIGH) 、および、0 (LOW) に交互に設定して、1秒ずつ待機することを5秒繰り返す。 # unexportGpio関数でGPIOをアンエクスポートして、GPIOピンの使用を終了する。 <br> ただし、これを実行する場合は、適切な権限 (通常はスーパーユーザ権限) が必要である。<br> また、使用するGPIOピン番号やパスは、ハードウェアの構成に応じて適宜変更すること。<br> <br> <u>PCのGPIOピンを制御する場合は、ハードウェアの仕様を確認して、適切な保護回路を使用する等、十分な注意が必要である。</u><br> <br> <syntaxhighlight lang="c++"> #include <QCoreApplication> #include <QFile> #include <QTextStream> #include <QThread> const QString GPIO_PATH = "/sys/class/gpio/"; void exportGpio(int gpio) { QFile exportFile(GPIO_PATH + "export"); if (exportFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&exportFile); out << gpio; exportFile.close(); } } void unexportGpio(int gpio) { QFile unexportFile(GPIO_PATH + "unexport"); if (unexportFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&unexportFile); out << gpio; unexportFile.close(); } } void setGpioDirection(int gpio, const QString &direction) { QFile directionFile(GPIO_PATH + "gpio" + QString::number(gpio) + "/direction"); if (directionFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&directionFile); out << direction; directionFile.close(); } } void setGpioValue(int gpio, int value) { QFile valueFile(GPIO_PATH + "gpio" + QString::number(gpio) + "/value"); if (valueFile.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&valueFile); out << value; valueFile.close(); } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); int gpioNumber = 17; // 使用するGPIO番号 exportGpio(gpioNumber); setGpioDirection(gpioNumber, "out"); for (int i = 0; i < 5; ++i) { setGpioValue(gpioNumber, 1); QThread::sleep(1); setGpioValue(gpioNumber, 0); QThread::sleep(1); } unexportGpio(gpioNumber); return a.exec(); } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - GPIO
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse