====== 各種ペリフェラルの使用方法 ======
~~ODT~~
===== スイッチ類 =====
''GPIO class driver'' として実装。''/sys/class/gpio/[Node]/value'' を ''read()'' する。\\
極性は **Active High** (スイッチ ON で 1)。
^ Node ^ Switch ^ Note ^
|SW_VOLUME_UP| 音量大 | |
|SW_VOLUME_DOWN| 音量小 | |
|SW_EMERGENCY| 緊急通報 | |
|SW_MENU| メニュー | |
|SW_NEXT| 次へ | |
|SW_BACK| 前へ | |
|SW_OK| 決定 | |
|DIN| 外部入出力 | 入力 |
\\
==== 割込 ====
v1.0.0β4 より、割込機能を追加。\\
''/sys/class/gpio/[Node]/edge'' に ''rising'' を書き込むことで該当する入力の割込機能が有効になる。
root@plum-lcd:/sys/class/gpio/SW_OK# pwd
/sys/class/gpio/SW_OK
root@plum-lcd:/sys/class/gpio/SW_OK# ls -l
total 0
-rw-r--r-- 1 root root 4096 Aug 2 15:24 active_low
lrwxrwxrwx 1 root root 0 Aug 2 15:24 device -> ../../../gpiochip7
-rw-r--r-- 1 root root 4096 Aug 2 15:24 edge
drwxr-xr-x 2 root root 0 Aug 2 15:24 power
lrwxrwxrwx 1 root root 0 Aug 2 15:18 subsystem -> ../../../../../../../../class/gpio
-rw-r--r-- 1 root root 4096 Aug 2 15:18 uevent
-rw-r--r-- 1 root root 4096 Aug 2 15:24 value
root@plum-lcd:/sys/class/gpio/SW_OK# cat edge
none
root@plum-lcd:/sys/class/gpio/SW_OK# echo rising > edge
root@plum-lcd:/sys/class/gpio/SW_OK# cat edge
rising
root@plum-lcd:/sys/class/gpio/SW_OK#
root@plum-lcd:/sys/class/gpio/SW_OK# cat /sys/kernel/debug/gpio
...
gpiochip7: GPIOs 486-493, parent: platform/11000004.gpio, xioirq-gpio:
gpio-486 ( |SW_VOLUME_UP ) in lo
gpio-487 ( |SW_VOLUME_DOWN ) in lo
gpio-488 ( |SW_EMERGENCY ) in lo
gpio-489 ( |SW_MENU ) in lo
gpio-490 ( |SW_NEXT ) in lo
gpio-491 ( |SW_BACK ) in lo
gpio-492 ( |SW_OK ) in lo IRQ <--- "IRQ" が有効になる
gpio-493 ( |DIN ) in lo
-----------------------------
XIO ENABLE: 40
XIO STATUS: 00
XIO VALUE: 00
-----------------------------
...
\\
===== ラジオ電源 =====
''LED class driver'' として実装。''/sys/class/leds/RADIO_POWER/brightness'' に 0(OFF) or 255(ON) を ''write()'' する。
\\
===== 外部出力 =====
''LED class driver'' として実装。''/sys/class/leds/DO/brightness'' に 0(OFF) or 255(ON) を ''write()'' する。
\\
===== LCD バックライト =====
''Backlight driver'' として実装。''/sys/class/backlight/plumLCD-Backlight/brightness'' に 0(消灯) 〜 10(最大輝度) を ''write()'' する。
root@plum-lcd:/sys/class/backlight/plumLCD-Backlight# ls -l
total 0
-r--r--r-- 1 root root 4096 Jun 25 10:36 actual_brightness
-rw-r--r-- 1 root root 4096 Jun 25 10:36 bl_power
-rw-r--r-- 1 root root 4096 Jun 25 10:36 brightness <--------------------------
lrwxrwxrwx 1 root root 0 Jun 25 10:36 device -> ../../../11000016.gpio
-r--r--r-- 1 root root 4096 Jun 25 10:36 max_brightness
drwxr-xr-x 2 root root 0 Jun 25 10:36 power
lrwxrwxrwx 1 root root 0 Jun 25 10:36 subsystem -> ../../../../../../../class/backlight
-r--r--r-- 1 root root 4096 Jun 25 10:36 type
-rw-r--r-- 1 root root 4096 Jun 25 10:36 uevent
\\
===== UART =====
==== ラジオ ====
''/dev/ttyO1'' に接続。
\\
==== 無線 ====
''/dev/ttyO0'' に接続。
\\
===== USB =====
Dual-roleDevice として実装。初期状態では、gadget として cdc-acm x 2, cdc-ether x 1 として見せるようになっている。\\
USB typeA - microB ケーブル((Android スマートフォンを接続するケーブル)) でホスト PC と接続可能。\\
ホスト側での見え方は下記のとおり。
[2337306.688997] usb 1-4.2.2: new high-speed USB device number 53 using xhci_hcd
[2337306.820140] usb 1-4.2.2: New USB device found, idVendor=1d6b, idProduct=0104
[2337306.820143] usb 1-4.2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[2337306.820145] usb 1-4.2.2: Product: Bar Gadget
[2337306.820146] usb 1-4.2.2: Manufacturer: Foo Inc.
[2337306.820148] usb 1-4.2.2: SerialNumber: 0123456789
[2337306.844287] cdc_acm 1-4.2.2:1.0: ttyACM0: USB ACM device
[2337306.854312] cdc_acm 1-4.2.2:1.2: ttyACM1: USB ACM device
[2337306.872420] cdc_ether 1-4.2.2:1.4 usb0: register 'cdc_ether' at usb-0000:03:00.0-4.2.2, CDC Ethernet Device, c2:87:0e:76:f3:5b
T: Bus=01 Lev=03 Prnt=08 Port=01 Cnt=02 Dev#= 53 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=1d6b ProdID=0104 Rev= 0.01
S: Manufacturer=Foo Inc.
S: Product=Bar Gadget
S: SerialNumber=0123456789
C:* #Ifs= 6 Cfg#= 1 Atr=80 MxPwr= 2mA
A: FirstIf#= 0 IfCount= 2 Cls=02(comm.) Sub=02 Prot=01
A: FirstIf#= 2 IfCount= 2 Cls=02(comm.) Sub=02 Prot=01
A: FirstIf#= 4 IfCount= 2 Cls=02(comm.) Sub=06 Prot=00
I:* If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=cdc_acm
E: Ad=82(I) Atr=03(Int.) MxPS= 10 Ivl=32ms
I:* If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
E: Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 2 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=02 Prot=01 Driver=cdc_acm
E: Ad=84(I) Atr=03(Int.) MxPS= 10 Ivl=32ms
I:* If#= 3 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
E: Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
I:* If#= 4 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=06 Prot=00 Driver=cdc_ether
E: Ad=86(I) Atr=03(Int.) MxPS= 16 Ivl=32ms
I: If#= 5 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether
I:* If#= 5 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_ether
E: Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
\\
==== cdc-acm (serial) ====
2つの ''tty'' では ''getty'' を起動しているため、ホスト側からログイン可能。
Ubuntu 16.04.4 LTS plum-lcd ttyGS0
plum-lcd login: user1
Password:
Last login: Mon Jun 25 10:07:02 JST 2018 from 192.168.253.1 on pts/0
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.14.51-PlumLCD+ armv7l)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
user1@plum-lcd:~$
\\
==== cdc-ether (Ethernet) ====
''usb0'' という I/F として見えるので、Ethernet(ethX) と同様に設定し、ホスト側から SSH などでログイン可能。
user1@plum-lcd:~$ ifconfig usb0
usb0 Link encap:Ethernet HWaddr 22:00:0e:1c:7a:75
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
user1@plum-lcd:~$
\\
===== Audio =====
ALSA として実装。
user1@plum-lcd:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: AM335xPlumLCD [AM335x-Plum-LCD], device 0: AIC3X tlv320aic3x-hifi-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
user1@plum-lcd:~$ aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
pulse
PulseAudio Sound Server
default:CARD=AM335xPlumLCD
AM335x-Plum-LCD,
Default Audio Device
sysdefault:CARD=AM335xPlumLCD
AM335x-Plum-LCD,
Default Audio Device
dmix:CARD=AM335xPlumLCD,DEV=0
AM335x-Plum-LCD,
Direct sample mixing device
dsnoop:CARD=AM335xPlumLCD,DEV=0
AM335x-Plum-LCD,
Direct sample snooping device
hw:CARD=AM335xPlumLCD,DEV=0
AM335x-Plum-LCD,
Direct hardware device without any conversions
plughw:CARD=AM335xPlumLCD,DEV=0
AM335x-Plum-LCD,
Hardware device with all software conversions
user1@plum-lcd:~$
\\
入出力は下記のとおり接続されている。
^ Device ^ PIN ^ IN/OUT ^ Note |
| ラジオ | LINE1L | IN | モノラル, Lch |
| LINE出力 | LINE OUT(Rch) | OUT | モノラル, Rch |
| 内蔵スピーカー | SPOP / SPOM | OUT | モノラル, Lch |
\\
===== AD Converter =====
==== channel 2 ====
電池電圧を読み取ることが可能。
root@plum-lcd:~# cat /sys/bus/iio/devices/iio\:device0/in_voltage2_raw
3583
* 1/6.11 に分圧
* 基準電圧 1.8V
* 12bit ADC
となっているため、電池電圧を算出するには下記計算を行う。
$$ V_{[電池]} = \frac{ADC\_DATA}{4095} \times 1.8 \times 6.11 $$
\\
==== channel 3 ====
電源電圧を読み取ることが可能。
root@plum-lcd:~# cat /sys/bus/iio/devices/iio\:device0/in_voltage3_raw
2541
* 1/10.77 に分圧
* 基準電圧 1.8V
* 12bit ADC
となっているため、電源電圧を算出するには下記計算を行う。
$$ V_{[電源]} = \frac{ADC\_DATA}{4095} \times 1.8 \times 10.77 $$