RaspberryPiのデバイスドライバ(第1歩)
以前、RaspberryPi のGPIOレジスタを直接叩いてLEDを点灯させてみましたが、ルート権限で実行させる必要があります。
そこで、まずはデバイスドライバのロード&アンロードを確認するだけのプログラムを試してみました。
◆VM上のEclipseを起動します。
◆Eclipseが自動生成するMakefileでのビルドにチャレンジしましたがエラーが解決できなかった為、手入力したMakefileでビルドするように構成します。
Cプロジェクトの新規作成にて、Makefileプロジェクトの空のプロジェクト、他のツールチェインを選択します。
インクルードパスにRaspbian(Linux)のソースツリーにあるIncludeディレクトリを追加
※ビルドには無関係ですが、ソースコードの定義チェックなどが機能してくれるので定義しておきましょう。
◆正常にビルド完了しました。
このEclipse(Ver3.8)では、printk()やmodule_init()、module_exit()でソースコードの構文解析でエラーがでてしまいますが、ビルドには支障はないようです。
◆RaspberryPi上で動作確認します。
SCPで、main.koをRaspberryPiに転送。
SSHで、RaspberryPiにリモート接続。
insmodでmain.koをロードします。(特権ユーザーで)
lsmodで、mainが正常にロードされた事が確認できました。
rmmodで、アンロード。
最後にdmesgで、ロード、アンロード時にKERN_ALARTに出力した文字列が残っているかチェックし、無事に実行された事が確認できました。
----------------------------------
main.c
MODULE_DESCRIPTION("Hello driver");
MODULE_AUTHOR("777gunslinger");
MODULE_LICENSE("GPL");
static int hello_init(void){
printk(KERN_ALERT "Hello!\n");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT "good bye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
KERNEL_SRC = /home/gunslinger/raspi/linux
BUILD_DIR := $(shell pwd)
MODULES = main.o
obj-m := $(MODULES)
CROSS_COMPILE = /home/gunslinger/raspi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
ARCH = arm
MAKEARCH = $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
all:
$(MAKEARCH) -C $(KERNEL_SRC) SUBDIRS=$(BUILD_DIR) modules
clean:
rm -f *.o
rm -f *.ko
rm -f *.mod.c
----
RaspberryPiのGPIO用の簡易デバドラ作成中・・・・
そこで、まずはデバイスドライバのロード&アンロードを確認するだけのプログラムを試してみました。
◆VM上のEclipseを起動します。
◆Eclipseが自動生成するMakefileでのビルドにチャレンジしましたがエラーが解決できなかった為、手入力したMakefileでビルドするように構成します。
Cプロジェクトの新規作成にて、Makefileプロジェクトの空のプロジェクト、他のツールチェインを選択します。
インクルードパスにRaspbian(Linux)のソースツリーにあるIncludeディレクトリを追加
※ビルドには無関係ですが、ソースコードの定義チェックなどが機能してくれるので定義しておきましょう。
◆正常にビルド完了しました。
このEclipse(Ver3.8)では、printk()やmodule_init()、module_exit()でソースコードの構文解析でエラーがでてしまいますが、ビルドには支障はないようです。
◆RaspberryPi上で動作確認します。
SCPで、main.koをRaspberryPiに転送。
SSHで、RaspberryPiにリモート接続。
insmodでmain.koをロードします。(特権ユーザーで)
lsmodで、mainが正常にロードされた事が確認できました。
rmmodで、アンロード。
最後にdmesgで、ロード、アンロード時にKERN_ALARTに出力した文字列が残っているかチェックし、無事に実行された事が確認できました。
----------------------------------
main.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
MODULE_DESCRIPTION("Hello driver");
MODULE_AUTHOR("777gunslinger");
MODULE_LICENSE("GPL");
static int hello_init(void){
printk(KERN_ALERT "Hello!\n");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT "good bye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
KERNEL_SRC = /home/gunslinger/raspi/linux
BUILD_DIR := $(shell pwd)
MODULES = main.o
obj-m := $(MODULES)
CROSS_COMPILE = /home/gunslinger/raspi/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
ARCH = arm
MAKEARCH = $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
all:
$(MAKEARCH) -C $(KERNEL_SRC) SUBDIRS=$(BUILD_DIR) modules
clean:
rm -f *.o
rm -f *.ko
rm -f *.mod.c
----
RaspberryPiのGPIO用の簡易デバドラ作成中・・・・
コメント
コメントを投稿