RaspberryPi

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カーネルのバージョンが新しくなっているためであるとの回答があった。解決策として旧カーネルソースを使うことであるとの回答であった。

前提条件
RaspberryPi 1 model B+(SOCがSamsungのタイプのもの)
OSは2015-01-31-raspbian.img

注意点)raspberryPi 1 model B+ には2種類が存在している。種類というのはsocがSamsungのタイプとELPIDAのタイプである。正解のボードはSamsungのsocを搭載したraspberryPi 1 model B+ である。ELPIDAのraspberryPi 1 model B+は使うことが出来ない。その理由はfirmwareが新しくなったため古いraspbiangが起動できないためである。
補足として今日現在発売されているraspberryPi 1 model B+はELPIDAのタイプしか手に入らない。手に入れるにはオークション等で入手すること

soc.jpg

まず最初にパソコンから旧バージョンのraspbianをダウンロードし、micro sdに焼きraspberryPiで起動する。旧バージョンを使う理由は本の内容が旧バージョンにしか対応していないためである。旧バージョンは「2015-01-31-raspbian.img」をダウンロードする。
RaspberryPiに挿入し起動する。繰り返しの説明になるがsocがELPIDAのraspberry Pi1 model B+では旧バージョンの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が本の内容通りになることを確認する

総括
最新のraspbianにはdevice treeという方式を採用したため本の内容が使えなくなった。著者の方に頑張って書いて頂きたいものである