*[[Raspberry Pi 3 基礎編]] [#td1aabbe]
*[[CentOSからI/Oをアクセス]] [#td1aabbe]
**はじめに [#d7ab3939]
>
>Raspberry Pi 3の基本情報です。
>Raspberry Pi 3にCentOS7をインストールした場合のI/Oへのアクセス方法をまとめました。~
Rasbianでは、各種の方法が提供されているようですが、CentOSの対応状況が不明です。~
そのため、調べた結果をメモします。
<
**シリーズの仕様比較 [#da29060d]
***Wikiよりの転載([[https://ja.wikipedia.org/wiki/Raspberry_Pi]]) [#bbe1a485]
**デバイスツリーサポート状況 [#da29060d]
***デバイスツリー(Device Tree)とは [#bbe1a485]
>
| |CENTER:Raspberry Pi 1&br; Model A|CENTER:Raspberry Pi 1&br; Model A+|CENTER:Raspberry Pi 1&br; Model B|CENTER:Raspberry Pi 1&br; Model B+|CENTER:Raspberry Pi 2&br; Model B|CENTER:Raspberry Pi 3&br; Model B|h
|SoC|>|>|>|CENTER:Broadcom BCM2835|Broadcom BCM2836|Broadcom BCM2837|
|CPU|>|>|>|CENTER:ARM1176JZF-S&br;シングルコア&br;700 MHz&br;ARMv6&br;ARM11|CENTER:ARM Cortex-A7&br;クアッドコア&br;900MHz&br;ARMv7 (32bit)&br;ARM Cortex-A|CENTER:ARM Cortex-A53&br;クアッドコア&br;1.2 GHz&br;ARMv8 (64bit)&br;ARM Cortex-A|
|GPU|>|>|>|Broadcom VideoCore IV&br;250 MHz&br;OpenGL ES 2.0 (24 GFLOPS)&br;MPEG-2, VC-1, 1080p30 H.264/MPEG-4 AVC High Profile ハードウェアデコーダ・エンコーダ|CENTER:Broadcom VideoCore IV&br;400 MHz(3D 250M)&br;OpenGL ES 2.0 (24 GFLOPS)&br;←|CENTER:Broadcom VideoCore IV&br;400 MHz(3D 300M)&br;OpenGL ES 2.0 (24 GFLOPS)&br;← + 1080 60p|
|Memory|>|CENTER:256 MB&br;&br;LPDDR2 SDRAM|CENTER:512 MB&br;(256Mは1GPU共有)&br;LPDDR2 SDRAM|CENTER:512 MB&br;&br;LPDDR2 SDRAM|>|CENTER:1GB&br;&br;LPDDR2 SDRAM|
|USB|>|CENTER:USB 2.0 x 1|CENTER:USB 2.0 x 2&br; (LAN9512内蔵ハブ)[[[>https://ja.wikipedia.org/wiki/Raspberry_Pi#cite_note-SMSC-LAN9512-Website-21]]|>|>|CENTER:USB 2.0 x 4 (LAN9514内蔵ハブ)|
|Camera IF|>|>|>|>|>|CENTER:15ピンMIPIカメラインターフェース (CSI)|
|Display IF|>|>|>|>|>|CENTER:コンポジット RCA (PAL / NTSC) &br;  HDMI1.3 / 1.4&br;DSI|
|Audio in IF|>|>|>|>|>|CENTER:I&sup2;S|
|Audio out IF|>|>|>|>|>|CENTER:3.5 mm ジャック,&br;HDMI&br; I&sup2;S|
|Storage|CENTER:SDカード / MMC|CENTER:microSDカード|CENTER:SDカード / MMC|CENTER:microSDカード|CENTER:microSDカード|CENTER:microSDカード|
|Network|>|CENTER:N/A|CENTER:LAN9512&br;10/100 Mbps イーサネットx1  |CENTER:LAN9514&br;10/100 Mbps イーサネットx1  |CENTER:LAN9514&br;10/100 Mbps イーサネットx1   |CENTER:LAN9514&br;10/100 Mbps イーサネットx1Broadcom BCM43143&br;IEEE 802.11 b/g/n 2.4 GHz&br;Bluetooth 4.1, Bluetooth Low Energy|
|Power|CENTER:5V 300 mA (1.5 W)|CENTER:5V 200 mA (1 W)|CENTER:5V 700 mA (3.5 W)|CENTER:5V 600 mA (3.0 W)|CENTER:5V 900 mA (4.5 - 5.5 W)&br;最大 1.8 A (9 W)|CENTER:5V 1.4A (7 W)&br;最大 2.5 A (12.5 W)|
|Size|CENTER:85.60 mm × 56.5 mm|CENTER:65 mm × 56.5 mm|>|>|>|CENTER:85.60 mm × 56.5 mm |
|Weight|CENTER:45 g|CENTER:23 g|>|>|>|CENTER:45 g|
>聞き慣れない用語ですが、I/Oアクセスに関する記事を検索すると、よく見かけます。~
結局のところ、ARM Linux 用のプロパティ情報を記述した設定ファイルのことらしい。~
Device Treeの仕組みはOpen Firmwareを原点にしており、デバイスのベースアドレスや、~
クロック、割り込み番号といった、ハードウェア固有のプロパティをカーネルから分離し~
デバイスドライバの再利用性を高めることが目的としている。~
結局、ドライバはこの情報を元に、アクセスする。~
Device Treeは2.6.38 以前のLinuxカーネルには存在しない。~
(2.6.38の開発の際に問題となり、対策としてこの手法が以降導入されたらしい)~
~
Linux コミュニティとしては Device Tree 非対応のデバイスドライバのパッチ受け付けは~
しない決まりになったとのことです。
<
***実装状況 [#c5f78f15]
>
>サポートされていると「/proc/device-tree/」で情報を取得できるようなので、調べてみます。
 # ls /proc/device-tree/
 #address-cells  __symbols__  chosen      cpus              memreserve  soc
 #size-cells     aliases      clocks      interrupt-parent  model       system
 __overrides__   axi          compatible  memory            name
 #
 
>サポートはしているようです。新しいカーネルなので、当たり前といえば当たり前ですが。
<
**ドライバーサポート [#sd6266a3]
>
>実際にどのようなドライバーがインストールされているかを調べます。
<
***ドライバーサポート状況 [#zde82794]
>
>モジュールの一覧を調べます。
 # lsmod
 Module                  Size  Used by
 brcmfmac              186339  0
 brcmutil                5661  1 brcmfmac
 cfg80211              427855  1 brcmfmac
 rfkill                 16037  1 cfg80211
 bcm2835_gpiomem         3040  0
 bcm2835_wdt             3225  0
 uio_pdrv_genirq         3164  0
 uio                     8000  1 uio_pdrv_genirq
 ip_tables              11445  0
 x_tables               13165  1 ip_tables
 ipv6                  347466  33
 #
 
>この中で、それらしいのを調べて見ます。
<
-bcm2835_gpiomem

>
>たぶんGPIO用のドライバの用です。まずは、調べてみます。~
[[WiringPi>http://wiringpi.com/]]によると ''bcm2835_gpiomem'' により /dev/gpiomem interface が使用できるようになるということで、~
GPIOについてはRasbianと同様のことができることが期待できます。~
有効ならば、「gpiomem」ができるようです。
 # ll /dev/gpiomem
 crw------- 1 root root 244, 0  1月  1  1970 /dev/gpiomem
 #
 
<
**I/O [#t20837a9]
***GPIO/SPI/IIC/UART [#z1c56eda]
-Pin Layout
>
>ありました。
>次に、rasbianでは、「/sys/class/gpio/」以下に生成されるファイルによりGPI/Oへのアクセスが可能となりますので、あるか調べます。
 # ll /sys/class/gpio/
 合計 0
 --w------- 1 root root 4096  9月 22 21:30 export
 lrwxrwxrwx 1 root root    0  9月 22 21:30 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
 lrwxrwxrwx 1 root root    0  9月 22 21:30 gpiochip100 -> ../../devices/platform/soc/soc:virtgpio/gpio/gpiochip100
 --w------- 1 root root 4096  9月 22 21:30 unexport
 #
 
>ありました。~
これらは、以下のudev ruleが設定されていると動作するらしいです。
 SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
 SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
 SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"
 
<
>
>その他のドライバはデフォルトでは、サポートしていないようで、別途インストールが必要な予感です。
<
***GPIOへのアクセステスト [#rb26857d]
>
>では実際にアクセスできるかテストします。
 # echo 21 > /sys/class/gpio/export
 # ls /sys/class/gpio/
 export  gpio21  gpiochip0  gpiochip100  unexport
 # ls /sys/class/gpio/gpio21/
 active_low  device  direction  edge  power  subsystem  uevent  value
 # echo out > /sys/class/gpio/gpio21/direction
 # echo 1 > /sys/class/gpio/gpio21/value
 # echo 0 > /sys/class/gpio/gpio21/value
 # echo 21 > /sys/class/gpio/unexport
 # ls /sys/class/gpio/
 export  gpiochip0  gpiochip100  unexport
 #
 
<
>
>まずは、GPIOには簡単にアクセスできる方法は用意されていました。
<
***IIC [#z3035714]
>
>IIC(I2C)へのアクセスについても、ドライバーレベルでサポートされるようです。
<
-ドライバーのイネーブル

>
>&ref(raspP1.png,zoom);
>インストールデフォルトでは、ドライバーがイネーブルにならないようで /boot/config.txt にドライバを読み込む設定が必要です。~
以下の2行を追加します。
 dtparam=i2c_arm=on
 dtparam=i2c1=on
 
<
>
>これにより、起動時にドライバーを読み込んでくれるようになります。
 # lsmod
 (中略)
 i2c_dev                 6913  0
 i2c_bcm2708             5994  0
 (以下省略)
 
<
>
 # ll /sys/class/i2c-dev
 合計 0
 lrwxrwxrwx 1 root root 0  8月 12 09:28 i2c-1 -> ../../devices/platform/soc/3f804000.i2c/i2c-1/i2c-dev/i2c-1
 #
 
<
**そのほか [#w07ed0d9]
>
>検索してみたところ、「BCM 2835」という、CのRaspberry Pi 用のIOライブラリがありました。~
早速ダウンロードしてコードを見ると、IOアドレス空間を直接アクセスしています。~
ぎょっとしましたが、Linux Kernel 2.6.23-rc1からUIOがマージされて、このようなことが可能になったようです。~
コードでは、/dev/memをmmapし、メモリ空間をアクセスしています。また、DeviceTreeにも対応しています。~
早速、CentOSでも調べてみます。
 # ll /dev/mem
 crw-r----- 1 root kmem 1, 1  1月  1  1970 /dev/mem
 #
 
>ありました。これでイケルようです。
<
**[[LIB BCM 2835>http://www.airspayce.com/mikem/bcm2835/]] [#s967c43e]
***概要 [#y5fbcb8b]
>
>Raspberry Pi用のCライブラリで、
> This is a C library for Raspberry Pi (RPi). ~
 It provides access to GPIO and other IO functions on the Broadcom BCM 2835 chip, ~
allowing access to the GPIO pins on the 26 pin IDE plug on the RPi board ~
so you can control and interface with various external devices.~
 It provides functions for reading digital inputs and setting digital outputs, ~
using SPI and I2C, and for accessing the system timers. ~
 Pin event detection is supported by polling (interrupts are not supported).~
It is C++ compatible, and installs as a header file and non-shared library ~
on any Linux-based distro (but clearly is no use except on Raspberry Pi ~
or another board with BCM 2835).
>とありますので、UART、割り込み以外は、おおよそ何でもできそうです。
<
***ライブラリのビルド [#sa4394e9]
>
>開発ツールはインストール済みの前提です。
>早速ビルドしてみます。
 # cd /opt/
 # mkdir bcm2835
 # cd bcm2835/
 # curl http://www.airspayce.com/mikem/bcm2835/bcm2835-1.50.tar.gz -O
 # tar zxvf bcm2835-1.50.tar.gz
 # ls
 bcm2835-1.50  bcm2835-1.50.tar.gz
 # cd bcm2835-1.50
 # ./configure
 # make
 # make install
 
<
>
>以下のファイルがインストールされます。
<
>
>>
|種別|ファイル|h
|Lib|/usr/local/lib/libbcm2835.a|
|Header|/usr/local/include/bcm2835.h|
|Document|?|

<<
<
>
>>
>>>
>>>
>>>

<<<
<<
>Kernelをアップデートするたびにmakeしなくてよさそうなのがありがたい。
>>

<<
<
***テスト [#r4263da1]
>
>サンプルのLEDチカチカがありますので、テストします。~
LEDはGPIO-17(コネクタP1の11)に接続し、1秒間隔で点滅(ON:500ms、OFF:500ms)します。
 # cd examples/
 # cd blink/
 # gcc blink.c -o blink_led -l rt -l bcm2835
 # ./blink_led
 
<
>
>※-l rt は[[real-time extensions>http://devlib.symbian.slions.net/belle/GUID-E21287EF-7211-590B-A1E3-E0B37069FCB2.html]]です。(RTカーネルではないので、意味ないかもしれませんが)
<

お疲れ様でした。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS