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.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年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でデバイスドライバをビルドする方法 […]