Raspberry Piで学ぶARMデバイスドライバープログラミング
米田聡
- 定価
- 3,278円(本体価格 2,980円)
- 発売日
- 2014年9月20日
- 判型/ページ数
- B5変型/312ページ
- ISBN
- 978-4-88337-940-8
SOLD OUT
本書は、Raspberry Pi をベースに、そこへ接続した各種デバイスのドライバーを作ろうという趣旨の書籍です。
本書で取り扱っているのはRaspberry Pi、つまりARM ベースのシステムでのデバイスドライバー開発ですが、基本的な考え方、方法は他のアーキテクチャでも変わりませんので、PC でLinux 用のデバイスドライバーを書きたいと思っている人の参考にもなるはずです。また、Raspbian というDebian 系のディストリビューションを使って解説をしていますが、これ以外のディストリビューションで開発しようという人でも参考になる情報は多いと思います。
現在ではLinux におけるドライバーまわりの整備も進み、普通に売っているデバイスをこうしたシングルボードコンピューターに接続する程度でしたら、ドライバーを書く必要はあまりないのですが、それでも本書の中で触れているように、特別なことをしたい、あるいは特別なデバイスをつなげたい場合には、デバイスドライバーを書く必要に迫られることがあります。
本書は、そうしたややニッチな、しかし、どうしてもドライバーを書かなくてはならなくなってしまった人向けに書かれています。このため、Raspberry Pi についてはもとより、デジタル回路やC プログラミングの知識はすでにお持ちだという前提で説明を進めていきます。
もくじ
第1章 RasberryPiにデバイスをつなごう!
デバイスドライバーってなんだろう?
■カーネルとユーザーランド
特権レベル
仮想記憶(オンデマンドページング仮想記憶)
■Linuxのドライバーはカーネルの一部
モノリシックカーネル
カーネルモジュール開発とユーザープログラム開発の違い
■RaspberryPiはドライバー作成の教材に最適
何度ハングアップしても(たいして)困らない
ドライバーを作る意味がある
カーネルモジュールの作成環境を整える
■Raspbianを利用する
カーネルのバージョンを最新に
RaspberryPi上でツリーを作る利点と欠点
PC上でツリーを作る利点と欠点
■カーネルビルドツリーの作成
PC上に作成する
RaspberryPi上でカーネルビルドツリーを作成する
RaspberryPiの3つのモデル
■4種類のRaspberryPi
■RaspberryPiModelBRev.2
■RaspberryPiModelB+
■RaspberryPiComputeMoudle
第2章 7セグLEDで作る初めてのデバイスドライバー
いまだに便利な7セグLED
■アノードコモンとカソードコモン
■LEDドライバーIC「74HC4511」を使おう
■RaspberryPiとの接続
まずはユーザーランドでGPIOの制御を習得
■GPIOFunctionSelectレジスタ
■GPIOPinSetレジスタ
■GPIOPinClearレジスタ
■GPIOPinLevelレジスタ
■GPIOPull-up/downレジスタ・GPIOPull-up/downClocレジスタ
■ユーザーランドでGPIOを制御するライブラリの作成
■GPIOを制御するライブラリ本体
ユーザー仮想アドレス空間に物理アドレスをマッピングする
GPIOファンクション設定
GPIOプルアップ/プルダウンコントロール
GPIOに対するリードライト
ライブラリの作成
■7セグLEDを使ってみよう
コラムioread系APIとiowrite系APIについて/
コラムGPIOドライバーを通じたGPIOの制御方法/
初めてのカーネルモジュール〜7セグLEDドライバーを作る
■Linuxのデバイスドライバー〜カーネルモジュールの基本
デバイスノードとは
キャラクタ型とブロック型
伝統を継承?
カーネルモジュールの基本構造
■7セグLEDドライバーの作成
ビルドディレクトリの用意
定数、グローバル変数、関数定義
キャラクタ型デバイスのレジストレーション
物理メモリーアドレスのマッピング
モジュールの初期化コード
モジュールの終了処理
open及びreleaseの実装
writeのコールバック関数の実装
■ssegledモジュールをビルドして使ってみよう
PC上でモジュール開発を行う場合
Raspbianの場合
ビルドしよう
カーネルモジュールを使ってみよう
module_param()を使って表示しているデータを参照できるようにする
コラムprintk()によるデバッグメッセージ出力/
第3章 7セグLEDでタイマーを使ってみよう
7セグLEDのダイナミック駆動
■ダイナミック駆動とは
■ダイナミック駆動を行う回路を作ろう
7セグLED4桁モジュール(アノードコモン)を使ってみよう
点灯する桁を制御する
カソード側の制御
4桁表示の回路を作る
■ユーザープログラムで試してみよう
ユーザープロセスによるダイナミック駆動の問題点
カーネルタイマーを使ってみよう
■カーネルタイマーの使い方
■カーネルタイマーでダイナミック駆動を試してみよう
試してみよう……だが問題あり?
■高解像度タイマーを使おう
高解像度タイマーの使い方
高解像度タイマーを試してみよう
■ssegled4dを試してみよう
複数のマイナー番号を使いこなす
■複数のマイナー番号を使い分ける方法
同期制御(spinlock)
■ドライバーを完成させよう
第4章 I2C接続のLCDを使ってみよう〜
I2Cクライアントドライバーの作成
I2C接続のデバイスを利用してみる
■I2Cとは
■I2Cを使ったデータのやり取り
I2Cの電気的な仕様
7bitアドレスモードでのデータのやり取り
10bitアドレスモードでのデータのやり取り
■I2Cの通信速度
I2C接続のキャラクタLCDを使ってみよう
■I2CLCDの取り付け
LinuxのI2Cドライバースタック
I2CLCDの接続をチェックする
■I2CLCDをユーザーランドで使ってみよう
I2CLCDの制御方法
II2Cを制御するAPIの使い方
キャラクタLCD制御用ヘッダファイル
■I2CLCDを制御するライブラリを作ろう
ライブラリを使ってLCDに文字を表示しよう
I2CLCD用クライアントドライバーを作成しよう
■I2Cクライアントドライバーの基本的な構造
■I2CLCDドライバーを作成する〜probeとremoveの実装
I2Cクライアントドライバーを使ってみよう
■i2c_lcdドライバーを完成させよう
デバイスファイルの使い方
i2c_lcdにデバイスファイルによる入出力を追加する
完成したi2c_lcdドライバーを利用しよう
第5章 ADCドライバーを作ろう〜
SPIデバイスのデバイスドライバー
SPIとADC
■SPIとは
■SPI接続のADC「MCP3204」
■ADCをRaspberryPiに接続しよう
ユーザーランドでSPIとADCを使ってみよう
■SPIアダプタドライバーを有効にする
■/dev/spidevN.Nを介したSPIバスの使い方
spidevのオープンとSPI動作モード設定
SPIを用いたデータ転送
■SPIを利用するライブラリの製作
■MCP3204の使い方
MCP3204を使ってみよう
■アナログ入力の保護について
MCP3204ドライバーの作成
■統一的フレームワークLinuxIIOについて
■SPIドライバーの基本形
■SPIバスのデータ転送を行うAPI
■mcp3204_probe()とmcp3204_remove()の実装
■AD変換値の取得〜mutexについて
■ユーザーランドから値を取得する
■MCP3204ドライバーを使ってみよう
コラムそのほかのSPIバスの転送を行うAPI/
Appendix
カーネルAPI/構造体リファレンス
■キャラクタ型ドライバー関連
■タイマー関連
■I2C関連
■SPI関連
■その他
本書で使用したドライバーの全ソース
■Chapter2で使用したドライバーのソースコード
■Chapter3で使用したドライバーのソースコード
■Chapter4で使用したドライバーのソースコード
■Chapter5で使用したドライバーのソースコード
ダウンロードデータ
本書で解説したサンプルデータをダウンロードできます。
なお、使用方法などに関しては、必ず書籍の該当箇所をご確認の上、ご利用ください。
ダウンロード後、解凍したファイル内に「readme.txt」ファイルなどが含まれる場合は、使用前にこちらもご確認ください。
正誤情報
初版第1刷に誤りがありました。
【表の誤り】
P.50の表2-2において、
GPFSEL3の物理アドレスが0x2020008となっています。
正しくは、0x202000cとなります。
【ご注意】
カーネルバージョン3.17以降、DEVICE_ATTRマクロのmodeパラメータに S_IWOTHを指定することができなくなりました。
カーネルバージョン3.17以降でコンパイルする際には、DEVICE_ATTRのmodeパラメータからS_IWOTHを削除してください。
また、この制限によりデバイスファイルへの書き込みが行えるユーザーが制限されますが、これはLinuxカーネルによる制限です。
お問い合わせ
本書に関するお問い合わせは、下記のボタンをクリックしてお問い合わせフォームよりお問い合わせください。