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

UbuntuMATEをRaspberry Piにインストールするためには、以下のサイトから ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz をダウンロードします。
https://ubuntu-mate.org/download/
インストール方法はこちらのサイトが大変丁寧にまとまっていましたので紹介しておきます。
インストール後、自動アップデートを無効にしておきます。
本来ならば常に最新版を使用するべきです。 しかし、Raspberry Piのような非力なPCでは自動アップデートが裏で走っているとほかの作業がほとんどできませんので、無効にします。 自分でアップデートすれば問題ないですしね。
sudo systemctl disable apt-daily.servicesudo systemctl disable apt-daily.timerubuntu.comからダウンロードできるubuntuのイメージには /usr/src/ 以下に linux-headers がありますが、このUbuntuMATEのイメージには入っていません。
まずはカーネルのヘッダをインストールします。以下のコマンドでインストールするべきバージョンが確認できます。
uname -r【2017年8月6日追記】
2017年1月に本エントリを公開した際は、手動でdebパッケージ(linux-headers-4.1.19-v7+_4.1.19-v7+-2_armhf.deb)をインストールしていましたが、以下のコマンドでインストールできます。
sudo apt install raspberrypi-kernel-headers2017年2月のアップデートで最新版のカーネルは 4.4.38-v7+ になりました。バージョンにかかわらず上記のコマンドでインストールできるようです。
本エントリの初回公開時は linux-headers という名前で探していたので「初期のリポジトリに登録されていません」としていました。
しかし、実際には raspberrypi-kernel-headers だったため、見つけられなかっただけでした。当時も存在していたようです。
確認不足で誤った情報を公開してしまい、申し訳ありません。ご迷惑をおかけ致しました。
初回公開時の手順(現在は不要)
今回のUbuntuMATE 16.04LTSでは 4.1.19-v7+ でした。
このバージョンのlinux-headersをaptでインストールすることができればよいのですが、初期のリポジトリに登録されていません。
そこで、.debファイルをダウンロードし、dpkgコマンドを使ってインストールすることにします。
まずはダウンロードします。2017年1月21日現在、以下のURLからダウンロードできるようです。
mkdir -p ~/tmpcd ~/tmpwget http://phil.lavin.me.uk/downloads/linux-headers-rpi/linux-headers-4.1.19-v7%2B_4.1.19-v7%2B-2_armhf.deblinux-headers-4.1.19-v7+_4.1.19-v7+-2_armhf.deb をインストールに必要なパッケージを追加インストールします。
sudo apt install dkmssudo apt install gcc-4.7sudo apt-get install -fsudo 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+/*試しにデバイスドライバをmakeしてみます。
git clone https://github.com/Tiryoh/raspigibbon_driver.gitcd raspigibbon_drivermakeerror と出ておらず、 Leaving directory '/usr/src/linux-headers-4.1.19-v7+' と出ているので無事にビルドできたことが確認できました。
ubuntu@raspberrypi3:~/raspigibbon_driver$ makemake -C /usr/src/linux-headers-`uname -r` M=`pwd` V=1 modulesmake[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.ordermake -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.omake[1]: Leaving directory '/usr/src/linux-headers-4.1.19-v7+'関連記事
- (Updated )Raspberry Pi 3にUbuntu 14.04をインストールする方法RaspberryPi2までは公式のファームウェアをmicroSDカードに書き込むだけで使えていました(RaspberryPi2にUbuntu14.04をインストールする方法 | Memoteki)が、RaspberryPi3からはそう簡単ではなくなってしまったので対応方法を2種類メモしておきます。
- Raspberry Pi 3B/3B+用Ubuntuイメージで初回起動に時間がかかる問題をなんとかする2019年6月現在公開されているRaspberry Pi 3 Model B/B+用64bitUbuntuイメージを使ってオフラインでUbuntuをセットアップしようとすると、外部ネットワークへの接続待ちで数分待つことがあります。長いんですよね…… 素直にLANケーブルを接続すればよいのですが、そうでなくても動くように
- (Updated )Raspberry Pi 3用UbuntuMATEのイメージ書き込み方このエントリではRaspberry Pi 3で使えるUbuntuMATEのイメージの書き込み手順を説明します。
- (Updated )Raspberry Pi 3用Ubuntu MATEのカーネルのアップデート方法ディスプレイに接続しなくても、Raspberry Pi用Ubuntu MATEのイメージをセットアップし、Raspberry Pi 3で使えるように編集しました。
- (Updated )Raspberry Pi 3上でUbuntu 18.04 + ROS Melodicの動作確認をしましたRaspberry Pi 3上でUbuntu 18.04 + ROS Melodic Morenia(以下、ROS Melodic)の動作確認をしました。