質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

187閲覧

RaspberryOS pigpioを使用したデバイスドライバで /usr/include を参照してくれません。

chakotay1

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2024/11/30 10:33

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • Raspberry Pi OSでGPIO割り込みを使用したくてC言語から pigpio を使用したいのですが

/usr/includeにある pigpio.h
が以下の指定で include されません。
#include <pigpio.h>

makeの問題?なのかgccの問題なのか?判断できません。
添付のMakefileで
/usr/include (進展によっては他のpathも追加の可能性がありますが)
をinclude pathに追加する方法を教えてください。

前提

Makefileは以下となります。
MODULEDIR = /lib/modules/uname -r/build
obj-m := gpiodrv.o

modules:
$(MAKE) -C $(MODULEDIR) M=pwd modules

clean:
$(MAKE) -C $(MODULEDIR) M=pwd clean

発生している問題・エラーメッセージ

make -C /lib/modules/uname -r/build M=pwd modules
make[1]: Entering directory '/usr/src/linux-headers-6.6.51+rpt-rpi-v8'
CC [M] /home/foo/work/isr/gpiodrv.o
/home/foo/work/isr/gpiodrv.c:24:10: fatal error: pigpio.h: No such file or directory
24 | #include <pigpio.h> // <2>
| ^~~~~~~~~~
compilation terminated.

該当のソースコード

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> // printk ();

#include <linux/fs.h> // everything
#include <linux/errno.h> // error codes
#include <linux/types.h> // size_t
#include <linux/fcntl.h> // O_ACCMODE
// #include <asm/system.h> // cli(); *_flags
#include <asm/uaccess.h> // copy_from/to_user
#include <linux/cdev.h> // cdev struct.
#include <linux/interrupt.h> // For int
#include <linux/gpio.h> // For GPIO
#include <pigpio.h> // <2>
#include <asm/io.h>

MODULE_LICENSE ("Dual BSD/GPL");

C言語

試したこと

ここに問題に対して試したことを記載してください。
makeを使用せず gcc でコマンドラインコンパイルを行うと /usr/include は参照して pigpio.h はinclude するのですが
#include <linux/init.h>
をincludeできず fatal error となります。

補足情報(FW/ツールのバージョンなど)

$ uname -a
Linux rp4r 6.6.51+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.51-1+rpt3 (2024-10-08) aarch64 GNU/Linux

$ make --version
GNU Make 4.3
Built for aarch64-unknown-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gcc --version
gcc (Debian 12.2.0-14) 12.2.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2024/12/01 02:10

pigpioはデバイスドライバーのようなカーネルモジュールで使うものではなくて、普通のユーザーアプリで使うライブラリではないでしょうか。 こちらのサイトが公式ですか? [pigpio library] https://abyz.me.uk/rpi/pigpio/download.html > /usr/includeにある pigpio.h > が以下の指定で include されません。 > #include <pigpio.h> なので、カーネルモジュール用のビルドでは/usr/includeが除外されている気がします。 。 普通のユーザーランドのアプリをgccでビルドするときにはgccの既定の設定で/usr/include が追加されているはずですが、カーネルモジュール用では外されるのでは。 公式に、pigpioはカーネルモジュール用のビルドができるはずなのであれば、本コメントの限りではありませんが。
chakotay1

2024/12/01 07:02

アドバイスいただきありがとうございます。 元々実現したいことは ・GPIOに外部FPGAで作成した定周期信号(100us)を入力 ・Raspberry PI OSではGPIO割り込み専用のデバイスドライバを作成して、上記信号を検出したらISRを起動 ということです。単にGPIOのinput/outputはデバイスドライバで実現できて、次は割り込み処理というところでかれこれ2週間はまっています。 そういった状態でpigpioは割り込みに対応していること(他のライブラリはpollingが多い)から適用の努力をすすめておりました。 ご指摘のようにこのライブラリがユーザランド専用か否かについては公式サイトを眺めてみても把握できておりません。 問題が発散してしまいそうなのでpigpioの質問と、カーネルモジュールのコンパイルにおける include pathの質問を分離して再度質問させていただきます。
guest

回答1

0

自己解決

元々実現したいことはlinux kernel version 6.6 でGPIOに割り込み設定をしたかったということです。kernel version 6.6ではgpio_to_irq()の引数にGPIO番号を指定できなくなっていてgpio_to_irq()が-22を返していたためWEBで調べたライブラリを適用しようとして、 Makefileとコマンドライン(gcc)でインクルードパスが異なっているという現象に出くわしました。
kernel version 6.5以下であればGPIO番号をピン番号で指定でき、所望の動作を実現できました。その後kernel version 6.6では cat /sys/kernel/debug/gpio で所望のピン番号を指定するインデックスを読むことで暫定的ですが所望の動作を実現できました。
kernel version 6.6はGPIO関連の仕様が変更されたため嵌まってしまったという結論になります。
上記の解決方法の参考URL
https://forum.domoticz.com/viewtopic.php?p=315391#p315391

投稿2024/12/05 12:42

chakotay1

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問