* 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