* PIFWの開発設計メモ [#yc9ad9ac]
このページは筆者の開発メモであり、一般公開している情報ではありません。~
各種問い合わせ等には対応できませんのでご了承ください。

** 仕様 [#bbdd07b5]
- 入出力端子
-- LINE-OUT(TSフォンx2)
-- LINE-IN(TSフォンx2 または TRSフォンx1)
-- HEADPHONE-OUT(TRSフォンx1)
-- MIDI-IN
-- MIDI-OUT
-- DC 5Vまたは12V(ACアダプタ入力) ◆T.B.D
- 操作系
-- LINE-IN LEVEL
-- LINE-OUT LEVEL
-- HEADPHONE-OUT LEVEL(LINE-OUT連動でも可)
-- プッシュスイッチ(L/R/U/Dの最大4個)
-- ロータリーエンコーダ(VALUE)
-- タッチパネル
- 表示系
-- 5インチLCD(800x480 HDMI接続)または3.5インチLCD(480x320 SPI接続) ◆T.B.D

** raspbian イメージ [#j9a623a2]
https://www.raspberrypi.org/downloads/raspbian/

ここから、「RASPBIAN JESSIE WITH PIXEL」のZIPを取得する。~
ZIP解凍後SDカードにddする。~
LITEから最小限必要なモジュールを組み込んだイメージができあがった。

** WaveShare互換 3.5インチ TOUCH LCD [#i5177b97]
WaveShareの製品が何もせずそのまま使える。(標準でドライバモジュールが組み込まれているので有効にするだけ)~

公式からLCD-Showをダウンロードしてtar展開。
http://www.waveshare.com/wiki/3.5inch_RPi_LCD_(A)

 $ tar xvf LCD-show-*.tar.gz
 $ cd LCD-show/
 $ chmod +x LCD35-show
 $ ./LCD35-show

これをやると/boot/config.txtを上書きするので、その他の設定をしていた場合は消える。~
したがって、LCDの設定関係は最初にやるべき。

*** LCDの上下反転方法 [#ve12ba42]

/boot/config.txt
 dtoverlay=waveshare35a
これを
 dtoverlay=waveshare35a:rotate=270
に、変更すると上下反転する。
続いてタッチパネルのキャリブレーションを行う。

次のコマンドを実行しても同じ(ただし、config.txtが上書きされる)

 $ cd LCD-show/
 $ ./LCD35-show 180


** OSOYOの3.5インチ [#wad6dbe6]
OSOYOは専用カーネルが必要でドライバは非公開。(OS Updateすると動かなくなる)


** 5インチ MDMI タッチLCD [#bec53b11]

HDMI 5インチHDMIに出力するための設定
 $ cd LCD-show
 $ ./LCD5-show

/boot/config.txtに次の1行を追記して上下反転させる

 display_rotate=2

今まで設定してあったAudio等の設定はすべて消えるので、config.txtを修正する

** タッチパネルのキャリブレーション [#k681b465]
 $ sudo apt-get install -y xinput-calibrator
 $ DISPLAY=:0.0 xinput_calibrator

コンソールに表示されたメッセージをメモっておく

 $ sudo vi /usr/share/X11/xorg.conf.d/99-calibration.conf

設定ファイルを開いて、Calibrationの所の4つの数字を書き換える

 Section "InputClass"
         Identifier      "calibration"
         MatchProduct    "ADS7846 Touchscreen"
         Option  "Calibration"   "3952 219 184 3911"
         Option  "SwapAxes"      "1"
 EndSection

** WiFiかLANでInternetにつなぐ [#f23b16ac]

** OSアップデート [#zd20370d]
 $ sudo apt-get update
 $ sudo apt-get upgrade

** モジュールインストール [#x54375bd]
 $ sudo apt-get install freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev usbmount

JUCE5対応
 $ sudo apt-get install freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev webkit2gtk-4.0-dev
 $ sudo apt-get install webkit2gtk-4.0-dev

** pifwインストール [#m007cf70]
 $ chmod 755 pifw
 $ chmod 755 sw_pifw.py
 $ sudo cp pifw /usr/local/bin/
 $ sudo cp sw_pifw.py /usr/local/bin/

.xsessionに「/usr/local/bin/pifw」を記述

** 画面スリープの抑止 [#be2b6eca]

.xinitrcを用意して以下の内容を書き込む~
 xset s off
 xset -dpms
 xset s noblank

/etc/lightdm/lightdm.confを以下のように編集する~
 < xserver-command=X
 ---
 > xserver-command=X -s 0 -dpms

編集したらlightdmを再起動する~
 sudo /etc/init.d/lightdm restart

.config/autostart/screensaver.desktopを作成し、以下の内容を書き込む~
 [Desktop Entry]
 Type=Application
 Exec=/home/pi/.xinitrc

** クロック固定(1200MHz化) [#h1aa2ad2]
cpu freq utlをインストール
 $ sudo apt install cpufrequtils

設定する
 $ sudo cpufreq-set -g performance

/boot/config.txtを編集(行追加)
 arm_freq=1200

/etc/init.d/cpufrequtilsを修正(オンデマンドではなく固定にする)
 ENABLE="true"
 #GOVERNOR="ondemand"
 GOVERNOR="performance"
 MAX_SPEED="0"
 MIN_SPEED="0"

再起動して確認する
 $ sudo reboot

 $ cpufreq-info
600MHzが0%、1200MHzが100%になっていれば固定化できている

 $ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

CPU温度の確認
 $ vcgencmd measure_temp

** I2S Audio Interfece [#f5c55f31]
WM8731を使用する。~
オーディオはI2S、制御はI2Cで行っている。

- I/Oリスト
-- LINE-IN
-- MIC-IN(使わない)
-- LINE-OUT
-- HP-OUT

- ドライバの話~
https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=157834

- ボード~
http://www.dm9records.com/index.php/release/sound/piaif/~
MCK=12.288MHzでFs=44.1KHzは使用できない(信号処理の精度は高い)~
http://audioinjector.net/~
MCK=12.000MHzですべてのFsが使用できる(信号処理の精度は劣る)

- ドライバの有効化
config.txtを編集
 dtparam=i2c_arm=on
 dtparam=i2s=on
 dtoverlay=i2s-mmap
 dtoverlay=rpi-proto ←使用するAIFに合わせる必要がある(後述)
設定した最初の1回目は起動直後にエラーがでて進まなくなる。~
強制OFFして起動しなおせばOK。
内蔵AUDIOのほうは止めておいたほうが良いかもしれない。

- セットアップ
-- Settings - OUTPUT → snd_rpi_proto : Direct hardware device without any conversions
-- Settings - INPUT → snd_rpi_proto : Direct hardware device without any conversions
-- コンソールでalsamixerを操作する必要がある(やらないと音が出ない)
--- F6で対象デバイスリストを開いてsnd_rpi_protoを選択する
--- F5でALLを選択する
--- Masterを「↑」「↓」キーで増減させて0dBに設定する
--- Lineまで移動して、「;」キーでLのOn/Off、「’」キーでRのOn/Off~
L Rの表示が出るようにしておく。これでLINE-INが有効
--- Captureまで移動して、「↑」「↓」キーで増減させて0dBに設定する
--- Input Muxまで移動して、「↑」「↓」キーでLine Inに設定する
--- Output Mixer HiFiまで移動して、「M」を押してミュート解除する(表示は00)

#ref(alsamixer.PNG,left);
Master : 79/79 0.00dB/0.00dB~
Master Plauback: MM~
Sidetone: 0~
Line: L R/Capture~
Mic: --~
Mic Boost: 0~
Mic Boost: 0~
Playback Deem: MM~
Capture: 75/75 6.00dB/6.00dB(GAIN調整品)~
ADC Hich Pass: 00~
Input Mux: Line In~
Output Mixer HiFi: 00~
Output Mixer Line Bypass: MM~
Output Mixer MIC Sidetone: MM~
Store DC Offset: MM~

-メモ
-- PiAIF基板は全ジャックの配線がL/Rテレンコになってる(→本番で直す)
-- BUFFERは32 samples (0.7ms)が良い。16ではわずかにチリチリノイズが乗る。
-- OUTに周期的なパルス性ノイズが漏洩している(→本番ではフィルター追加)
-- 3.3V LDOが納期遅延して入手できていないため、β1は3.3V_AをPi3本体からもらう(ノイズレベルが悪くなるが許容範囲)

*** ドライバ [#j91a9173]
- rpi-proto~
/boot/config.txtに「dtoverlay=rpi-proto」を追記する。~
AIFのクロックは12.288MHz。Fs=44.1KHzは使えない。~
BUGがあってFs=48K以外は動かない。~
Fs=48kのみで使用するならクロックの関係で音は良いはず。

- audioinjector-wm8731-audio~
/boot/config.txtに「dtoverlay=audioinjector-wm8731-audio」を追記する。~
AIFのクロックは12.000MHz。すべてのFsが使用できる。~
すべてのFsが使えるがクロックの関係で音質は多少劣るはず。

** スイッチボード [#qba5afb4]
#ref(sw_board.png,left);

** AIFボード MIDI用拡張ポート(β1のみ) [#o41ad1c0]
#ref(EXP_CN_MIDI.png);

** MIDI [#jbb78f4d]
UARTにMIDIを通すには、UARTクロックを変更する必要がある。~
https://openenergymonitor.org/forum-archive/node/12412.html

*** GPIO UARTクロックを変更し、Bluetoothを無効にする [#o6f2139d]
Bluetoothを無効にする
 $ sudo systemctl disable hciuart
 $ sudo nano /lib/systemd/system/hciuart.service
 change the first ttyAMA0 in ttyS0

/boot/cmdline.txt から、次の文字列を削除する(デフォルトではUARTはコンソール)
 console=serial0,115200

/boot/config.txt に、次の文字列を追加する
 dtoverlay=pi3-miniuart-bt
 init_uart_clock=39062500
 init_uart_baud=38400
 dtparam=uart0_clkrate=48000000

再起動
 $ sudo reboot

*** ALSAにMIDIデバイスとして見えるようにする [#gbb64b54]
https://github.com/cjbarnes18/ttymidi

*** UART-MIDI I/F [#cb464dd9]
#ref(MIDI-UART.png);

フォトカプラは高速品が好ましいが汎用品でも問題ない。~
トランジスタも汎用品(2SC1815等)でも問題ない。~
回路図の型番は表面実装用のチップ。

** GPIO [#p16a80fc]

|RIGHT:                 |CENTER:        |CENTER:        |LEFT:                  |c
|SIGNAL			|PIN(内)	|PIN(外)	|SIGNAL			|
|3.3V			|1		|2		|5V			|
|GPIO-2(I2C SDA)	|3		|4		|5V			|
|GPIO-3(I2C SCL)	|5		|6		|GND			|
|GPIO-4(空き)		|7		|8		|GPIO-14(UART TXD)	|
|GND			|9		|10		|GPIO-15(UART RXD)	|
|GPIO-17(TP IRQ)	|11		|12		|GPIO-18(I2S BCK)	|
|GPIO-27(空き)		|13		|14		|GND			|
|GPIO-22(空き)		|15		|16		|GPIO-23(空き)		|
|3.3V			|17		|18		|GPIO-24(LCD RS)	|
|GPIO-10(SPI MOSI)	|19		|20		|GND			|
|GPIO-9(SPI MISO)	|21		|22		|GPIO-25(空き)		|
|GPIO-11(SPI SCK)	|23		|24		|GPIO-8(LCD CS)		|
|GND			|25		|26		|GPIO-7(TP CS)		|
|ID-SD			|27		|28		|ID-SC			|
|GPIO-5(ENC-B)		|29		|30		|GND			|
|GPIO-6(ENC-A)		|31		|32		|GPIO-12(LEFT)		|
|GPIO-13(DOWN)		|33		|34		|GND			|
|GPIO-19(I2S LRCK)	|35		|36		|GPIO-16(RIGHT)		|
|GPIO-26(UP)		|37		|38		|GPIO-20(I2S DIN)	|
|GND			|39		|40		|GPIO-21(I2S DOUT)	|

LCDとTPは共用でSPIを使っていて、CSで切り替えている。~
TPは割り込み(IRQ)で取り込む。~

AUDIOはI2Sで接続。~
AD/DAチップの制御はI2Cで行っている(レジスタ設定時のみ)。

UARTはMIDIに使用予定。

その他の空きGPIOはスイッチ類に使用予定。~
現在はプッシュスイッチ2個とロータリーエンコーダーのみ。

** ストレージのサイズ変更(縮小) [#m6b50878]
以下は別PC(Linux専用機)のFedoraでの作業

概要:
第2パーティションの使用量は2GB弱。~
目標パーティションサイズを2.3GBとする。(少し余裕を残さないと後で困る)~
resize2fsで縮小するサイズは2.2GBとする。


 e2sck -f /dev/sdd2
 チェックする(必須)
 
 resize2fs -p /dev/sdd2 2200M
 目標パーティションサイズより少し少なくする
 指定サイズが小さすぎて縮小が無理だとエラーがでる
 
 fdisk /dev/sdd
 dコマンドで第2パーティションを削除する
 pコマンドで状態を確認する
 nコマンドで新しいパーティションを作る(開始シリンダに注意)
 pコマンドで状態を確認する
 wコマンドで書き込む

** ストレージのサイズ変更(最大に拡張) [#da6b2f05]
 
 e2fsck -f /dev/sdd2
 チェックする(必須)
 
 fdisk /dev/sdd
 dコマンドで第2パーティションを削除する
 pコマンドで状態を確認する
 nコマンドで新しいパーティションを作る(開始シリンダに注意)
 pコマンドで状態を確認する
 wコマンドで書き込む
 
 resize2fs -p /dev/sdd2
 サイズ指定をしなければ、パーティションサイズまで自動で拡張される

** SDカードからイメージを作成 [#m230823c]
SDカードに作成した状態から、最小限のサイズだけイメージ化する。~
例えば、8GBのカードに最小構成を作成して上記パーティションの縮小作業をして2GBまで切り詰めたとする。~
これをそのままddやWin32DiskImageでイメージ化すると、8GBカードの後半6GBもゴミデータとしてファイルに書き出されてしまう。

- ストレージのサイズ変更(縮小)の作業を行って、パーティションサイズを少し余裕を持たせて最小にする。
- 別のLinux機にカードを接続する(ここでは/dev/sddに乗ったとする)
- 自動マウントされた場合はアンマウントする
- fdisk /dev/sdd でパーティションの最終セクタを確認する
 # fdisk /dev/sdd
 Welcome to fdisk (util-linux 2.23.2).
 
 Changes will remain in memory only, until you decide to write them.
 Be careful before using the write command.
 
 
 Command (m for help): p
 
 Disk /dev/sdd: 7948 MB, 7948206080 bytes, 15523840 sectors
 Units = sectors of 1 * 512 = 512 bytes
 Sector size (logical/physical): 512 bytes / 512 bytes
 I/O size (minimum/optimal): 512 bytes / 512 bytes
 Disk label type: dos
 Disk identifier: 0xf8e23f7b
 
    Device Boot      Start         End      Blocks   Id  System
 /dev/sdd1            8192       92159       41984    c  W95 FAT32 (LBA)
 /dev/sdd2           92160     4140072     2023956+  83  Linux
 
 Command (m for help): q

- 最終セクタは4140072と分かった。これに1足して4140073とする。
- 次に、dd コマンドでファイル化する
 dd if=/dev/sdd of=raspbian_pifw.img bs=512 count=4140073

こうしてやれば、出来上がったイメージを4GBのカードに展開することもできる。

** IPアドレスを調べるスクリプト [#u565f8bd]
 #!/bin/sh
 /sbin/ifconfig -a |
    grep "inet addr" |
    grep -v "127." |
    sed -E 's/[\t ]+inet //g' |
    sed -e 's/ Bcast/\nBcast/g' |
    sed -e 's/ Mask/\nMask/g'
 sleep 10

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS