- 追加された行はこの色です。
- 削除された行はこの色です。
*[[CentOSからI/Oをアクセス]] [#td1aabbe]
**はじめに [#d7ab3939]
>
>Raspberry Pi 3にCentOS7をインストールした場合のI/Oへのアクセス方法をまとめました。
>Raspberry Pi 3にCentOS7をインストールした場合のI/Oへのアクセス方法をまとめました。~
Rasbianでは、各種の方法が提供されているようですが、CentOSの対応状況が不明です。~
そのため、調べた結果をメモします。
<
**デバイスツリーサポート状況 [#da29060d]
***デバイスツリー(Device Tree)とは [#bbe1a485]
>
>聞き慣れない用語ですが、I/Oアクセスに関する記事を検索すると、よく見かけます。~
結局のところ、ARM Linux 用のプロパティ情報を記述した設定ファイルのことらしい。~
Device Treeの仕組みはOpen Firmwareを原点にしており、デバイスのベースアドレスや、~
クロック、割り込み番号といった、ハードウェア固有のプロパティをカーネルから分離し~
デバイスドライバの再利用性を高めることが目的としている。~
結局、ドライバはこの情報を元に、アクセスする。~
Device Treeは2.6.38 以前のLinuxカーネルには存在しない。~
(2.6.38の開発の際に問題となり、対策としてこの手法が以降導入されたらしい)~
~
Linux コミュニティとしては Device Tree 非対応のデバイスドライバのパッチ受け付けは~
しない決まりになったとのことです。
<
**シリーズの仕様比較 [#da29060d]
***Wikiよりの転載([[https://ja.wikipedia.org/wiki/Raspberry_Pi]]) [#bbe1a485]
***実装状況 [#c5f78f15]
>
| |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²S|
|Audio out IF|>|>|>|>|>|CENTER:3.5 mm ジャック,&br;HDMI&br; I²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|
>サポートされていると「/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カーネルではないので、意味ないかもしれませんが)
<
お疲れ様でした。