Raspberry PiのUbuntu MATEでデバイスドライバをビルドする方法

Raspberry PiのUbuntuMATEでデバイスドライバをビルドする方法をメモしておきます。

UbuntuMATEをRaspberry Piにインストールするためには、以下のサイトから ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz をダウンロードします。
https://ubuntu-mate.org/download/

インストール方法はこちらのサイトが大変丁寧にまとまっていましたので紹介しておきます。

第48回「ラズベリーパイにUbuntu MATEをインストール!」 | Device Plus – デバプラ
http://deviceplus.jp/hobby/raspberrypi_entry_048/

インストール後、自動アップデートを無効にしておきます。
本来ならば常に最新版を使用するべきです。
しかし、Raspberry Piのような非力なPCでは自動アップデートが裏で走っているとほかの作業がほとんどできませんので、無効にします。
自分でアップデートすれば問題ないですしね。

sudo systemctl disable apt-daily.service
sudo systemctl disable apt-daily.timer

ubuntu.comからダウンロードできるubuntuのイメージには /usr/src/ 以下に linux-headers がありますが、このUbuntuMATEのイメージには入っていません。

まずはカーネルのヘッダをインストールします。以下のコマンドでインストールするべきバージョンが確認できます。

uname -r


今回のUbuntuMATE 16.04LTSでは `4.1.19-v7+` でした。
このバージョンのlinux-headersをaptでインストールすることができればよいのですが、初期のリポジトリに登録されていません。
そこで、.debファイルをダウンロードし、dpkgコマンドを使ってインストールすることにします。
まずはダウンロードします。2017年1月21日現在、以下のURLからダウンロードできるようです。

mkdir -p ~/tmp
cd ~/tmp
wget http://phil.lavin.me.uk/downloads/linux-headers-rpi/linux-headers-4.1.19-v7%2B_4.1.19-v7%2B-2_armhf.deb


`linux-headers-4.1.19-v7+_4.1.19-v7+-2_armhf.deb` をインストールに必要なパッケージを追加インストールします。

sudo apt install dkms
sudo apt install gcc-4.7
sudo apt-get install -f
sudo dpkg -i linux-headers-4.1.19-v7+_4.1.19-v7+-2_armhf.deb


インストール後、 `/usr/src/linux-headers-4.1.19-v7+/*` のパーミッションを変更します。dpkgコマンドでインストールするだけではrootユーザ以外には権限が与えられないようです。

sudo chmod -R o+r /usr/src/linux-headers-4.1.19-v7+/*
sudo chmod -R g+r /usr/src/linux-headers-4.1.19-v7+/*

2017年8月6日追記

2017年1月に本エントリを公開した際は、手動でdebパッケージ(`linux-headers-4.1.19-v7+_4.1.19-v7+-2_armhf.deb`)をインストールしていましたが、
以下のコマンドでインストールできます。

sudo apt install raspberrypi-kernel-headers

2017年2月のアップデートで最新版のカーネルは`4.4.38-v7+`になりました。バージョンにかかわらず上記のコマンドでインストールできるようです。

本エントリの初回公開時は`linux-headers`という名前で探していたので「初期のリポジトリに登録されていません」としていました。
しかし、実際には`raspberrypi-kernel-headers`だったため、見つけられなかっただけでした。当時も存在していたようです。
確認不足で誤った情報を公開してしまい、申し訳ありません。ご迷惑をおかけ致しました。

試しにデバイスドライバをmakeしてみます。

git clone https://github.com/Tiryoh/raspigibbon_driver.git
cd raspigibbon_driver
make

error と出ておらず、 Leaving directory '/usr/src/linux-headers-4.1.19-v7+' と出ているので無事にビルドできたことが確認できました。

ubuntu@raspberrypi3:~/raspigibbon_driver$ make
make -C /usr/src/linux-headers-`uname -r` M=`pwd` V=1 modules
make[1]: Entering directory '/usr/src/linux-headers-4.1.19-v7+'
test -e include/generated/autoconf.h -a -e include/config/auto.conf || (		\
echo >&2;							\
echo >&2 "  ERROR: Kernel configuration is invalid.";		\
echo >&2 "         include/generated/autoconf.h or include/config/auto.conf are missing.";\
echo >&2 "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\
echo >&2 ;							\
/bin/false)
mkdir -p /home/ubuntu/raspigibbon_driver/.tmp_versions ; rm -f /home/ubuntu/raspigibbon_driver/.tmp_versions/*
make -f ./scripts/Makefile.build obj=/home/ubuntu/raspigibbon_driver
  gcc -Wp,-MD,/home/ubuntu/raspigibbon_driver/.rtled.o.d  -nostdinc -isystem /usr/lib/gcc/arm-linux-gnueabihf/4.7/include -I./arch/arm/include -Iarch/arm/include/generated/uapi -Iarch/arm/include/generated  -Iinclude -I./arch/arm/include/uapi -Iarch/arm/include/generated/uapi -I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-bcm2709/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 -fno-dwarf2-cfi-asm -fno-omit-frame-pointer -mapcs -mno-sched-prolog -fno-ipa-sra -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -O2 --param=allow-store-data-races=0 -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -DCC_HAVE_ASM_GOTO  -DMODULE  -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(rtled)"  -D"KBUILD_MODNAME=KBUILD_STR(rtled)" -c -o /home/ubuntu/raspigibbon_driver/.tmp_rtled.o /home/ubuntu/raspigibbon_driver/rtled.c
  if [ "-pg" = "-pg" ]; then if [ /home/ubuntu/raspigibbon_driver/rtled.o != "scripts/mod/empty.o" ]; then ./scripts/recordmcount  "/home/ubuntu/raspigibbon_driver/rtled.o"; fi; fi;
  gcc -Wp,-MD,/home/ubuntu/raspigibbon_driver/.rtswitch.o.d  -nostdinc -isystem /usr/lib/gcc/arm-linux-gnueabihf/4.7/include -I./arch/arm/include -Iarch/arm/include/generated/uapi -Iarch/arm/include/generated  -Iinclude -I./arch/arm/include/uapi -Iarch/arm/include/generated/uapi -I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-bcm2709/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 -fno-dwarf2-cfi-asm -fno-omit-frame-pointer -mapcs -mno-sched-prolog -fno-ipa-sra -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -O2 --param=allow-store-data-races=0 -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -DCC_HAVE_ASM_GOTO  -DMODULE  -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(rtswitch)"  -D"KBUILD_MODNAME=KBUILD_STR(rtswitch)" -c -o /home/ubuntu/raspigibbon_driver/.tmp_rtswitch.o /home/ubuntu/raspigibbon_driver/rtswitch.c
/home/ubuntu/raspigibbon_driver/rtswitch.c:196:5: warning: initialization from incompatible pointer type [enabled by default]
/home/ubuntu/raspigibbon_driver/rtswitch.c:196:5: warning: (near initialization for ‘sw_fops.read’) [enabled by default]
/home/ubuntu/raspigibbon_driver/rtswitch.c:95:13: warning: ‘rpi_gpio_set32’ defined but not used [-Wunused-function]
/home/ubuntu/raspigibbon_driver/rtswitch.c:99:13: warning: ‘rpi_gpio_clear32’ defined but not used [-Wunused-function]
  if [ "-pg" = "-pg" ]; then if [ /home/ubuntu/raspigibbon_driver/rtswitch.o != "scripts/mod/empty.o" ]; then ./scripts/recordmcount  "/home/ubuntu/raspigibbon_driver/rtswitch.o"; fi; fi;
(cat /dev/null;   echo kernel//home/ubuntu/raspigibbon_driver/rtled.ko;   echo kernel//home/ubuntu/raspigibbon_driver/rtswitch.ko;) > /home/ubuntu/raspigibbon_driver/modules.order
make -f ./scripts/Makefile.modpost
  find /home/ubuntu/raspigibbon_driver/.tmp_versions -name '*.mod' | xargs -r grep -h '\.ko$' | sort -u | sed 's/\.ko$/.o/' | scripts/mod/modpost -m -a -i ./Module.symvers -I /home/ubuntu/raspigibbon_driver/Module.symvers  -o /home/ubuntu/raspigibbon_driver/Module.symvers -S -w  -s -T -
  gcc -Wp,-MD,/home/ubuntu/raspigibbon_driver/.rtled.mod.o.d  -nostdinc -isystem /usr/lib/gcc/arm-linux-gnueabihf/4.7/include -I./arch/arm/include -Iarch/arm/include/generated/uapi -Iarch/arm/include/generated  -Iinclude -I./arch/arm/include/uapi -Iarch/arm/include/generated/uapi -I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-bcm2709/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 -fno-dwarf2-cfi-asm -fno-omit-frame-pointer -mapcs -mno-sched-prolog -fno-ipa-sra -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -O2 --param=allow-store-data-races=0 -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -DCC_HAVE_ASM_GOTO  -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(rtled.mod)"  -D"KBUILD_MODNAME=KBUILD_STR(rtled)" -DMODULE  -c -o /home/ubuntu/raspigibbon_driver/rtled.mod.o /home/ubuntu/raspigibbon_driver/rtled.mod.c
  ld -EL -r  -T ./scripts/module-common.lds --build-id  -o /home/ubuntu/raspigibbon_driver/rtled.ko /home/ubuntu/raspigibbon_driver/rtled.o /home/ubuntu/raspigibbon_driver/rtled.mod.o
  gcc -Wp,-MD,/home/ubuntu/raspigibbon_driver/.rtswitch.mod.o.d  -nostdinc -isystem /usr/lib/gcc/arm-linux-gnueabihf/4.7/include -I./arch/arm/include -Iarch/arm/include/generated/uapi -Iarch/arm/include/generated  -Iinclude -I./arch/arm/include/uapi -Iarch/arm/include/generated/uapi -I./include/uapi -Iinclude/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -Iarch/arm/mach-bcm2709/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -std=gnu89 -fno-dwarf2-cfi-asm -fno-omit-frame-pointer -mapcs -mno-sched-prolog -fno-ipa-sra -mabi=aapcs-linux -mno-thumb-interwork -mfpu=vfp -funwind-tables -marm -D__LINUX_ARM_ARCH__=7 -march=armv7-a -msoft-float -Uarm -fno-delete-null-pointer-checks -O2 --param=allow-store-data-races=0 -Wframe-larger-than=1024 -fno-stack-protector -Wno-unused-but-set-variable -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-var-tracking-assignments -pg -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-overflow -fconserve-stack -Werror=implicit-int -Werror=strict-prototypes -DCC_HAVE_ASM_GOTO  -D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(rtswitch.mod)"  -D"KBUILD_MODNAME=KBUILD_STR(rtswitch)" -DMODULE  -c -o /home/ubuntu/raspigibbon_driver/rtswitch.mod.o /home/ubuntu/raspigibbon_driver/rtswitch.mod.c
  ld -EL -r  -T ./scripts/module-common.lds --build-id  -o /home/ubuntu/raspigibbon_driver/rtswitch.ko /home/ubuntu/raspigibbon_driver/rtswitch.o /home/ubuntu/raspigibbon_driver/rtswitch.mod.o
make[1]: Leaving directory '/usr/src/linux-headers-4.1.19-v7+'

コメント

  1. […] Raspberry PiのUbuntu MATEでデバイスドライバをビルドする方法 […]