FC2ブログ

[RPi]Linuxデバドラ

使ってるのはたぶんラズパイ2.
# uname -a

Linux rp2 4.4.38-v7+ #938 SMP Thu Dec 15 15:22:21 GMT 2016 armv7l armv7l armv7l GNU/Linux


# cat /etc/issue

Ubuntu 16.04.2 LTS \n \l




参照先の記事作成者に感謝。


組み込みLinuxデバイスドライバの作り方 (1)

https://qiita.com/take-iwiw/items/1fdd2e0faaaa868a2db2

# sudo apt-get install raspberrypi-kernel-headers

# vi MyModule.c

#include

static int test_init(void)
{
printk("Hello my module\n");
return 0;
}

static void test_exit(void)
{
printk("Bye bye my module\n");
}

module_init(test_init);
module_exit(test_exit);



# vi Makefile

CFILES = MyModule.c

obj-m := MyModule.o
MyModule-objs := $(CFILES:.c=.o)

all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean


# make
# sudo insmod MyModule.ko
# sudo rmmod MyModule.ko
# dmesg


[ 3088.36446 ] Hello my module
[ 3142.463604 ] Bye bye module



確かにモジュールのロード、アンロードのメッセージが出てた。



組み込みLinuxデバイスドライバの作り方 (2)

https://qiita.com/take-iwiw/items/580ec7db2e88beeac3de

# vi Makefile

CFILE =MyDeviceDriver.c
obj-m:=MyDeviceDriver.o
MyDeviceDriver-objs:=$(CFILE:.c=.o)

all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean


# vi MyDeviceDriver.c
 ※ 記事と同じため省略。

ビルドする。
# make
ロードする。
# sudo insmod MyDeviceModule.ko
# cat /proc/devices

1 mem
4 /dev/vc/0
5 /dev/tty
5 /dev/ptmx
5 ttyprintk
7 vcs
10 misc
13 input
14 sound
29 fb
63 MyDevice_NAME > ★ここに現れた



ユーザがアクセス出来るようにデバイスファイルを作る
# sudo mknod /dev/myDevice c 63 1
# sudo chmod 666 /dev/myDevice
# ls -lsta

0 crw-rw-rw- 1 root root 63, 1 2月 2 14:27 myDevice



シェルからWriteしてみる。
# echo "a" > /dev/myDevice
# dmesg

[ xxxx.xxxx ] myDevice_open
[ xxxx.xxxx ] myDevice_write
[ xxxx.xxxx ] myDevice_write
[ xxxx.xxxx ] myDevice_close



シェルからReadしてみる。
# cat /dev/myDevice
これを実行したら延々とAが出力された。

使い終わったら以下で削除する。
# sudo rmmod MyDeviceModule
# sudo rm /dev/myDevice



組み込みLinuxデバイスドライバの作り方 (3)

https://qiita.com/take-iwiw/items/6b02494a3668f79800e6


# vi Makefile
 ※ 記事の通り。
# vi MyDeviceDriver.c
 ※ 記事の通り。
# make
# sudo insmod MyDeviceModule.ko
実験的に3つ作成。
# sudo mknod --mode=666 /dev/mydevice0 c `grep MyDevice /proc/devices | awk '{print $1;}'` 0
# sudo mknod --mode=666 /dev/mydevice0 c `grep MyDevice /proc/devices | awk '{print $1;}'` 1
# sudo mknod --mode=666 /dev/mydevice0 c `grep MyDevice /proc/devices | awk '{print $1;}'` 2

静的な場合と同じく以下で削除。
# sudo rmmod MyDeviceDriver
# sudo rm /dev/mydevice0
# sudo rm /dev/mydevice1
# sudo rm /dev/mydevice2

ここまでで、メジャー番号の動的割り当てが出来た。
この後は、Linuxのudevの仕組みを使って、ロード(insmod)、及びデバイスファイル作成を自動化する。

# vi MyDeviceDriver.c
 ※ 記事と同じ。

これでudevにより/sys/class/mydevice/mydevice0/dev情報を基に自動的に
デバイスファイル/dev/mydevice0が作られるが、defaultでは一般ユーザのアクセス権が無い。
そこでルールファイルを作り、権限を変更してやる。

sudoでは/etc/udev/rule.d/の中をいじれないらしいのでrootになる。
# sudo -i
.ruleの前の名前は何でも良いらしい。
# echo 'KERNEL=="mydevice[0-9]*", GROUP="root", MODE="0666"' >> /etc/udev/rules.d/81-my.rules
# exit

# make

error implicit declaration of function 'class_create'


って言われた。
原因は以下が無かったから。

#include



ビルドし直してからロード。
# sudo insmod MyDeviceDriver.ko
デバイスファイルが自動で生成されたか確かめる。
# ls -lsta /dev/my*

0 crw-rw-rw- 1 root root 242, 0 2月 2 16:36 /dev/mydevice0
0 crw-rw-rw- 1 root root 242, 1 2月 2 16:36 /dev/mydevice1


メジャー番号242、マイナー番号0/1でmydevice0/1が生成されてる。

さらにデバイス情報のファイルが以下にあった。
# cat /sys/class/mydevice/mydevice0/dev

242:0

# cat /sys/class/mydevice/mydevice0/uevent

MAJOR=242
MINOR=0
DEVNAME=mydevice0





組み込みLinuxデバイスドライバの作り方 (4)

https://qiita.com/take-iwiw/items/26d5f7f4894ccc4ce227

ラズパイのメモリ空間が上記記事に添付されてる。



I2Cデバイスドライバ作成トライ

https://www.kernel.org/doc/Documentation/i2c/dev-interface

それぞれのI2Cアダプタは0から連番の番号を割り振られる。以下いずれかの方法で確認出来る。
# ls -lst /sys/class/i2c-dev/*

0 lrwxrwxrwx 1 root root 0 2月 17 14:18 i2c-1 -> ../../devices/platform/soc/3f804000.i2c/i2c-1/i2c-dev/i2c-1



# i2cdetect -l

i2c-1 i2c 3f804000.i2c I2C adapter




#include
#include

int file;
int adapter_nr = 2; /* probably dynamically determined */
char filename[20];

snprintf(filename, 19, "/dev/i2c-1", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
exit(1);
}

int addr = 0x40; /* The I2C address */

if (ioctl(file, I2C_SLAVE, addr) < 0) {
/* ERROR HANDLING; you can check errno to see what went wrong */
exit(1);
}

スポンサーサイト

[RP2][Ubuntu]コマンド

OSインストール手順

ラズパイの公式ページから以下をダウンロード。
ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz
解凍すると、
①ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img
が出て来た。

Ubuntuを書き込む前に、SDカードをフォーマットするらしい。
SD_CardFormatter0500SetupEN.exe
をインストールして、SDカードをクイックフォーマットした。

ここからSDカードへの書き込みツールを入手。
https://ja.osdn.net/projects/sfnet_win32diskimager/downloads/Archive/Win32DiskImager-1.0.0-binary.zip/
これを解凍するとインストール不要でそのまま実行可能なexeがある。

これで①imgファイルをSDカードへ書き込む。



I2C Enable方法

方法1

# sudo raspi-config
 > 3.Interfacing Options
 > P4 I2C
 > Would you like the ARM I2C interface to be enabled?
 > Yes

方法2

# vi /boot/config.txt

dtparam=i2c_arm=on


上の方法1をやる前は、コメントアウトされていて、更にoffだったが、ここが既にonになってた。



Ubuntuアップデート

# sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove && sudo apt-get -y autoclean

1.最新アップデートを確認。
2.確認したアップデートを適用。
3.ディストリビューションを最新のものに適用。
4.依存関係解決後に未使用のパッケージ削除。
5.作業時のaptキャッシュを削除。キャッシュ/var/cache/apt/archivesの肥大化防止。





RP2 ModelBとBME280でIoT

秋月電子
BME280使用 温湿度・気圧センサモジュールキット 1080円
http://akizukidenshi.com/catalog/g/gK-09421/

・BME280モジュールにピンヘッダを半田付けする。

・ラズパイ2 ModelBとBME280モジュールを接続する。
①BME280
②Raspberry Pi2

①1番ピン:VDD --- ②1番ピン:3V3
①2番ピン:GND --- ②6番ピン:GND
①3番ピン:CSB --- ②17番ピン:3V3
①4番ピン:SDI --- ②3番ピン:SDA1
①5番ピン:SDO --- ②14番ピン:GND
①6番ピン:SCK --- ②5番ピン:SCL1



# sudo apt-get install i2c-tools
# sudo apt-get install python-smbus
これはどちらもインストール済みだった。

# sudo i2cdetect -y 1
これで行70、列6の場所に、76と表示。これで接続が正常という事らしい。

尚、最後の引数はラズパイのリビジョンによって使い分けるとの事。
  リビジョン1(2012年10月14日以前の発送分のRaspberry Pi Model Bまで): 引数0を指定
  リビジョン2: 引数1を指定
今回使ったものはRaspberry Pi2 Model Bだが、引数1で動作した。



# wget https://raw.githubusercontent.com/SWITCHSCIENCE/BME280/master/Python27/bme280_sample.py
bme280_sample.pyをダウンロード。

# sudo python bme280_sample.py

Traceback (most recent call last):
File "bme280_sample.py", line 3, in
from smbus2 import SMBus
ImportError: No module named smbus2



エラーの原因はbme280_sample.pyの以下記述間違いとの事。

誤 3行目 from smbus2 import SMBus
正 3行目 from smbus import SMBus



修正後に再度実行するとセンサーデータ取得できた。
# sudo python bme280_sample.py

temp : 28.87 ℃
pressure : 1006.20 hPa
hum : 56.82 %



よくよく調べると、そもそもsmbus2をインストールして無い事が原因らしい。
事前に必要なものからインストールしていく。
# sudo apt-get install python-pip
pipを使うためのコマンドだが、python-pipは既に最新バージョン(8.1.1-2ubuntu0.4)が入っていると言われた。

# sudo pip install smbus2

The directory '/home/xxx/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disable.

Collecting smbus2
Downloading smbus2-0.1.5.tar.gz
Installing collected packages: smbus2
Running setup.py install for smbus2 ... done
Successfully installed smbus2-0.1.5

You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.



smbus2がインストールされた。さらにpipが古いというので、
アップデートした。
# sudo pip install --upgrade pip

# vi bme280_sample.py

元のsmbus2に戻した → 3行目 from smbus2 import SMBus



# sudo python bme280_sample.py

temp : 29.19 ℃
pressure : 1006.06 hPa
hum : 54.42 %

これで元々のソースで動作確認出来た。スイッチサイエンスさん疑ってすみません。

# sudo i2cdump -y 1 0x76

No size specified (using byte-data access)
   0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 00 00 00 00 ・・・
10: 00 00 00 00 ・・・

80: 8b 70 89 48 4a 31 28 ・・・






OSバージョン確認

# cat /etc/issue
Ubuntu 16.04.2 LTS \n \xx




PHP関連パッケージ表示

# dpkg -l | grep php | awk '{print $2}'





mosquittoインストール

# sudo apt-get install mosquitto
# sudo apt-get install mosquitto-clients
# sudo service mosquitto status

# /usr/sbin/mosquitto
起動すると、Address already in useと怒られる。

インストール時に既に起動してるらしい。また以下コマンドで起動してるの確認出来るらしい。
# mosquitto_sub -t '$SYS/#' -v





ネットワーク有効化

# vi /etc/network/interfaces
最終的にこの設定。dhcpではなくstaticにして固定IP割り振る。

auto lo
iface lo inet loopback

auto enxbxxxxxxx > これが無いと自動起動してくれない
iface enxbxxxxxxx inet static
adress 192.168.xxx.xxx
netmask 192.168.xxx.0
gateway 192.168.xxx.yyy
dns-nameservers 192.168.xxx.zzz



# vi /etc/resolv.conf
nameserver 192.168.xxx.vvv



# ifup enxbxxxxxxx
これで有効化された。
 > 最初、/etc/init.d/networking restart でやってたが、これでは有効化されなかった。

# ifconfig
enxbxxxxxにIPが割り振られている。

# ping 192.168.xxx.xxx
自分自身にpingが通る。

# ping 192.168.xxx.yyy
GATEWAYにもpingが通る。

# ping 8.8.8.8
外部DNSサーバにもpingが通る。




Teraterm SSH SCPでファイル転送

ラズパイ(Ubuntu)とWindows間でファイル転送してみる。

・まずラズパイのSSHを有効にする。

# raspi-config
 > Interfacing Options > SSH > YES > Enabledと言われるのでOK > Finish

I2Cを有効にするには/etc/modulesの中に、i2c-dev、を追記する必要があるらしい。
raspi-configでEnableにしてもしなくても、i2c-devの記載があった。

有効になったか確認。
# lsmod | grep i2c

i2c_bcm2708 4834 0
i2c_dev 5859 0



・WindowsのTeratermからSSH、22番ポートで接続する。
 > もしかしたらこれ不要かも。

・Teraterm > File > SSH SCP
 > Windowsから送る場合は上のSendの方。受け取る場合は下のReceiveの方を使う。
   送るファイルと、受け取る側のパスを指定するだけだから非常に簡単。

[RP2][RHEL]トラブルシュート

yum -y updateがエラー

時刻が1970年になってたので以下で設定したら直った。
2017/07/13 23:42
# date 071323422017


キーマップが日本語に出来ない(RHEL7.1)

具体的には「:」が打てず、「Shift + ;」になってる。

# vi /etc/sysconfig/keyboard

KEYTABLE="jp106"
MODEL="jp106"
LAYOUT="jp"
KEYBOARDTYPE="pc"


これでダメ。

KEYTABLE="jp106"
MODEL="jp106+inet"
LAYOUT="jp"
KEYBOARDTYPE="pc"


inetつけてもダメ。



apt-getでdpkg was interrupted, you must manually run 'sudo dpkg --configure -a'

I2Cデバイスドライバを作るために、i2c_smbus_read_byte_dataなどを使ったCソースをmakeしたら、
undefined reference to `i2c_smbus_read_byte_data'
と指摘入った。
調べると、以下パッケージが不足じゃね?という情報あったので、apt-getしてみた。
# apt-get install libi2c-dev

E: dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the probrem.



# dpkg --configure -a

Processing triggers for ufw (0.35-0ubuntu2) ...
Setting up libicu55:armhf (55.1-7ubuntu0.3) ...
 :
Setting up apache2 (2.4.18-2ubuntu3.5) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Errors were encounterd while processing:
python-samba
smbclient
samba-common-bin



なんかエラーが出たようだが、とにかく再度apt-getやってみる。
# apt-get install libi2c-dev
Reading package lists... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
libsmbclient : Depends: samba-libs (= 2:4.3.11+dfsg-0ubuntu0.16.04.9) but 2:4.3.11+dfsg-0ubuntu0.16.04.12 is to be installed
samba-common-bin : Depends: samba-common (= 2:4.3.11+dfsg-0ubuntu0.16.04.12) but 2:4.3.11+dfsg-0ubuntu0.16.04.9 is to be installed
samba-libs : Depends: libwbclient0 (= 2:4.3.11+dfsg-0ubuntu0.16.04.12) but 2:4.3.11+dfsg-0ubuntu0.16.04.9 is to be installed
smbclient : Depends: samba-common (= 2:4.3.11+dfsg-0ubuntu0.16.04.12) but 2:4.3.11+dfsg-0ubuntu0.16.04.9 is to be installed
Depends: libwbclient0 (= 2.4.3.11+dfsg-0ubuntu0.16.04.12) but 2:4.3.11+dfsg-0ubuntu0.16.04.9 is to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).


またエラー出た。案内されたようにやってみる。
# apt-get -f install
Reading package lists... Done
 :
4 not fuly installed or removed.
Need to get 0 B/4,589 kB of archives.
After this operation

[RP2][Fedora](1)基本設定

CentOS7.1は日本語キーボードのキーマップがおかしくて解決策がわからない。
Fedoraで試してみる。

■DD for WindowsでFedora-xxx-sda.rawを書き込み > 起動失敗

・どっかのサイトから984MBの以下を入手。
 Fedora-Mate-armhfp-21-5-sda.raw.xz
 たぶんここ。
 https://dl.fedoraproject.org/pub/fedora/linux/releases/21/Images/armhfp/

・7zipで解凍すると、6.316GBの以下が出来上がる。
 Fedora-Mate-armhfp-21-5-sda.raw

・Trancend microSDXC 64GBをSDリーダー経由でPCへ接続。

・DD for Windowsを管理者モードで実行して起動。

・SDカードのドライブを指定し、書込みを実行。いろいろ聞かれるけど全て「はい」。

・これだとラズベリーパイ2が起動しなかった。

■CentOS xzcatでFedora-xxx-sda.raw.xzを書き込み > 起動失敗

・VMwareのCentOS 6.7を起動。

・USBリーダー経由でmicroSDXCを接続。/dev/sdbとして認識された。

・次のコマンドで書き込み。10~15分ほどかかった。

 xzcat Fedora-Mate-armhfp-21-5-sda.raw.xz > /dev/sdb -v



・これでもラズベリーパイ2は起動せず。
 尚、/dev/sdbをfdiskでパーティションを全て削除して、容量全体を含めた1つだけのパーティションにしてから
 書き込みしてみても起動はしなかった。

[RP2][CentOS](2)iSCSI設定

yum install iscsi-initiator-utils > インストール成功
yum install scsi-target-utils > 「No package scsi-target-utils avairable.」
カレンダー
08 | 2018/09 | 10
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード