Raspberry Pi 1のデバイスドライバ開発
組み込みlinuxで必要となるデバイスドライバを作るため『ARMデバイスドライバープログラミング』という本を見て勉強しようと思った
2017.7.2現在では本の通り進めてもエラーが出て進むことが出来ない。エラーを解決するために行ったことを記録する。
本の通りに行うと100ページのinsmodでエラーが出る。内容は
root@raspberrypi:/home/pi# insmod ssegled.ko
insmod: ERROR: could not insert module ssegled.ko: Device or resource busy
root@raspberrypi:/home/pi# dmesg | tail
[ 1045.453728] ssegled loading...
[ 1045.453773] request_mem_region failed.
[ 1045.457656] Can not use GPIO registers.
である。
エラーの内容を出版社に問い合わせたところエラーの原因はlinuxカーネルのバージョンが新しくなっているためであるとの回答があった。解決策として旧カーネルソースを使うことでエラーが発生しないとの回答であった。旧カーネルソースは「Raspberry Pi 1 model B+」でしか起動できない。さらに付け加えると実はこのボードには2種類あってsocがsamsungとELPIDAの2種類が存在する。通販サイトでは「Raspberry Pi 1 model B+」としか表示されていないので注意すること
条件
ボード:Raspberry Pi 1 model B+(SOCがSamusungのもの)
raspbianバージョン:2015-01-31-raspbian.img
上でも書いたがraspberry Pi 1 model B+ は種類が2種類存在する。種類というのはsocがSamsungのタイプとELPIDAのタイプである。ここで使うボードはSamsungのsoc を搭載したraspberry Pi 1 model B+ である。ELPIDAのraspberry Pi 1 model B+は使うことが出来ないので注意すること。理由はfirmware が新しくなったためである。
ついでに現在発売されているraspberry Pi 1はELPIDAのタイプしか手に入らない。欲しい場合はオークション等でSamsungのsocのraspberry Pi 1を入手すること
それでは実際の手順を紹介する
カーネルのコンパイルはセルフコンパイルすることとする(raspberry Pi 上でコンパイルする)
まずは旧バージョンのraspbianをPCでダウンロードしmicro sdに焼きraspberry Pi 1で起動する。旧バージョンの理由は最新のraspbianはカーネルがdevice treeを採用しているためである。パソコンで旧バージョンのraspbianをダウンロードする。ここでは2015-01-31-raspbian.imgをダウンロードしmicro sdカードに焼く
Raspberry Pi 1に差して起動する。上でも書いたがsocがELPIDAのraspberry Pi 1 ではraspbian が起動しないので注意すること
raspbianが起動したら$startxでxwindowを起動し端末を起動する
以下の通りコマンドを入力する
$sudo wget https://github.com/raspberrypi/linux/archive/rpi-3.18.y.tar.gz //旧カーネルバージョンのカーネルソースをダウンロードする
$tar xfvz rpi-3.18.y.tar.gz //展開する
$cd rpi-3.18.y
$sudo apt-get install bc //makeに必要なbcをインストールする
$sudo make bcmrpi_defconfig
$sudo make //makeに14時間くらい掛かった
$sudo make modules_install
$sudo cp arch/arm/boot/Image /boot/kernel.img //ビルドしたカーネルをコピーする
$sudo reboot //再起動する
あとは本の100ページのinsmodでエラーが起きないことを確認する