カーネル/VM式 ARMマイコン入門

  • 7,941 views
Uploaded on

PCと同じようなLinux環境が動くパワフルなマイコンボードBeagleBoneBlack …

PCと同じようなLinux環境が動くパワフルなマイコンボードBeagleBoneBlack
今回はこのボードの楽しみ方を紹介します

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
7,941
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
39
Comments
0
Likes
16

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. カーネル/VM式 ARMマイコン入門 Naomasa Matsubayashi
  • 2. @fadis_ Naomasa Matsubayashi
  • 3. BeagleBoardって知ってる?
  • 4. スマートフォンとかに載ってるARMプロセッサ DVI-D $150 USB Ethernet
  • 5. BeagleBoard $125 RaspberryPi $25 超特価
  • 6. BeagleBone 89 $ RaspberryPi $25
  • 7. BeagleBoneBlack 5 $4 RaspberryPi $25
  • 8. USB OTG microHDMI どうやって起動すれば良いの?
  • 9. eMMC eMMCとは マルチメディアカードの ガワを無くして 基板に直接ハンダ付け できるようにしたもの BeagleBoneBlackのeMMCには 最初からÅngströmが書き込まれている どうやって起動すれば良いの?
  • 10. 実装された運用 顧客が本当に必要だった物 どうやって起動すれば良いの?
  • 11. に をインストールしよう どうやって起動すれば良いの?
  • 12. もし既にGentooを使っているのなら、 BeagleBone BlackにGentooをインストールするのは難しくありません http://dev.gentoo.org/ armin76/arm/beagleboneblack/install.xml Gentooをインストールしよう
  • 13. こっちが優先 am335x microSD MLO u-boot.img MLO u-boot.img ROM eMMC U-Boot SLP GRUBでいうstage1 zImage U-Boot GRUBでいうstage2 ブートの流れ
  • 14. # crossdev -S armv7a-hardfloat-linux-gnueabi クロスコンパイラをインストール # wget ftp://ftp.denx.de/pub/u-boot/u-boot-2013.04.tar.bz2 # tar xjpf u-boot-2013.04.tar.bz2 && cd u-boot-2013.04 # git clone https://github.com/beagleboard/metabeagleboard.git # for i in meta-beagleboard/common-bsp/recipes-bsp/u-boot/ u-boot-denx/00*; do patch -p1 < $i; done U-Bootのソースをダウンロードして BeagleBoard用のパッチを当てる # make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linuxgnueabi- am335x_evm_config # make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linuxgnueabi- U-Bootをビルド U-Bootをビルドしよう
  • 15. SDカード リーダー /dev/sdb # wget http://dev.gentoo.org/~armin76/arm/beaglebone/ mkcard.sh # bash mkcard.sh /dev/sdb ROMから実行されるブートローダーが読めるように パーティションを切る 面倒なので用意されたスクリプトに丸投げ U-Bootをインストールしよう
  • 16. /dev/sdb1 * 63 144584 72261 c W95 FAT32 (LBA) /dev/sdb2 144585 15647309 7751362+ 83 Linux # mkdir /mnt/p1 && mount /dev/sdb1 /mnt/p1 # cp MLO u-boot.img /mnt/p1 シリアルポート USB シリアルコンバータ (3.3V用) U-Bootをインストールしよう
  • 17. musb-hdrc: MHDRC RTL version 2.0 musb-hdrc: setup fifo_mode 4 musb-hdrc: 28/31 max ep, 16384/16384 memory USB Peripheral mode controller at 47401000 using PIO, IRQ 0 musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn) musb-hdrc: MHDRC RTL version 2.0 musb-hdrc: setup fifo_mode 4 musb-hdrc: 28/31 max ep, 16384/16384 memory USB Host mode controller at 47401800 using PIO, IRQ 0 Net: <ethaddr> not set. Validating first Efuse MAC cpsw, usb_ether U-Boot# U-Bootコンソール U-Bootをインストールしよう
  • 18. BeagleBoneBlackのペリフェラルのドライバは バニラカーネルに入っていない 3.8 + パッチ = イージーモード 3.11 + パッチ = ハードモード カーネルをビルドしよう
  • 19. # # # # # git clone https://github.com/beagleboard/kernel.git cd kernel git checkout origin/3.8 -b 3.8 ./patch.sh cd kernel カーネルを拾ってきてパッチを当てる # wget "http://arago-project.org/git/projects/?p=am33xcm3.git;a=blob_plain;f=bin/am335x-pm-firmware.bin;hb=HEAD" -O firmware/am335x-pm-firmware.bin 電源管理用プロセッサに食べさせるファームウェア # cp ../configs/beaglebone .config # make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linuxgnueabi- menuconfig BeagleBone用の設定からmenuconfig カーネルをビルドしよう
  • 20. General setup -> Kernel compression mode gzip以外でカーネルを圧縮すると 何故かearly printkより前でハングしてしまう カーネルをビルドしよう
  • 21. General setup -> TI OMAP2/3/4 Specific Fearures TI OMAP3 AM33XX Generic OMAP2+ board OMAP3 BEAGLE board 要らないボードのサポートを切る ドライバ一覧から明らかに不要なドライバが消える カーネルをビルドしよう
  • 22. TPS65950 OMAP3 BeagleBoard AM335x BeagleBoneBlack Davinci OMAP3とAM335x
  • 23. General setup -> TI OMAP2/3/4 Specific Fearures OMAP3とBEAGLE boardを有効にしておかないと 一部のBeagleBoneに必要な設定が隠れてしまう カーネルをビルドしよう
  • 24. Kernel Features -> Compile the kernel in Thump-2 mode カーネルをThumb-2ではなく ARM命令セットでビルドする カーネルをビルドしよう
  • 25. Thumb命令セット 2バイト固定長 大体のARM命令セットに対応する命令を備える 例外が発生するとARM命令セットに戻る ARM命令セットと切り替えながら使う ARM Thumb ソフトウェア割り込みでARMに戻ってしまうため カーネルをARM、ユーザ空間をThumbにして使う ARM命令セットとThumb命令セット
  • 26. Thumb-2命令セット 2バイト/4バイト可変長 全てのARM命令セットに対応する命令を備える 例外をThumb命令セットでハンドリング出来る Androidに愛されている ソフトウェア割り込みが Thumbだけで片付けられるので カーネル、ユーザ空間共にThumbに出来る ARM命令セットとThumb命令セット
  • 27. Linaro ARM Linuxの総本山
  • 28. Phoronixのベンチマークによると、 GentooがLinaroに勝ってしまったことがある http://www.phoronix.com/scan.php?page=article&item=gentoo_linaro_odroid ARM命令セットとThumb命令セット
  • 29. Phoronixのベンチマークによると、 GentooがLinaroに勝ってしまったことがある GentooはARM命令セットを LinaroはThumb-2命令セットを使っていた Thumb-2命令セットは 実行可能バイナリの高密度化と引き換えに ARM命令セットより性能が落ちる傾向にある ARM命令セットとThumb命令セット
  • 30. Device Drivers -> Graphics support OMAP2+ Display Subsystem supportは 必ずモジュール<M>に カーネルをビルドしよう
  • 31. Device Drivers -> MMC/SD/SDIO card support -> TI OMAP Multimedia Card Interface support Hight Speedじゃない方のMMCのドライバを切る カーネルをビルドしよう
  • 32. マルチメディアカード SDカード 上位互換 MMCとSDカードの関係
  • 33. DAT GND CLK VDD GND CMD 未割り当て MMCとSDカードの関係
  • 34. DAT1 DAT0 4つのデータ線で通信する → High Speed MMC GND CLK VDD GND CMD DAT3 DAT2 MMCとSDカードの関係
  • 35. DAT1 microSDもデータ線は4本 DAT0 GND CLK VDD GND CMD DAT3 DAT2 MMCとSDカードの関係
  • 36. Device Drivers -> MMC/SD/SDIO card support -> TI OMAP Multimedia Card Interface support 遅い方のMMCドライバの初期化が先に走る 速い方はデバイスが使用中で初期化に失敗する カーネルをビルドしよう
  • 37. # make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linuxgnueabi- おもむろにビルド # mkfs.f2fs -L gentoo /dev/sdb2 # mkdir -p /mnt/p2 && mount /dev/sdb2 /mnt/p2 # cd /mnt/p2 # make ARCH=arm CROSS_COMPILE=armv7a-hardfloat-linuxgnueabi- INSTALL_MOD_PATH=/mnt/p2 modules_install firmware_install # cp arch/arm/boot/zImage /mnt/p1/ # mkdir -p /mnt/p1/dtbs # cp arch/arm/boot/dts/am335x-boneblack.dtb /mnt/p1/dtbs SDカードの2つめのパーティションを 好きなファイルシステムでフォーマットして カーネルをインストール カーネルをビルドしよう
  • 38. # cd /mnt/p2 # wget http://ftp.iij.ad.jp/pub/linux/gentoo/releases/arm/ autobuilds/current-stage3-armv7a_hardfp/stage3armv7a_hardfp-20131006.tar.bz2 # tar xjpf stage3-armv7a_hardfp-20131006.tar.bz2 # wget http://ftp.iij.ad.jp/pub/linux/gentoo/snapshots/ portage-latest.tar.xz # tar xJpf portage-latest.tar.xz -C /mnt/p2/usr stage3とportageを展開 # cat <<EOF >etc/fstab /dev/mmcblk0p1 /boot vfat noauto,noatime! 1 2 /dev/mmcblk0p2 / f2fs! noatime! ! 0 1 EOF fstabを設定 Gentooをインストールしよう
  • 39. /dev/sdaじゃないの? がSDカードのプロトコルを喋る SDカード リーダー がSDカードをUSBマスストレージに見せかける がUSBマスストレージをSCSIディスクに見せかける が/dev/sdb(SCSIディスク)に見える mmcblk
  • 40. /dev/sdaじゃないの? がSDカードのプロトコルを喋る そのまま に届く! USBマスストレージドライバではなく MMCブロックデバイスドライバが処理 mmcblk
  • 41. /dev/sdaじゃないの? このドライバが作るブロックデバイスに カーネルが付ける名前 /dev/mmcblk[0-9]+p[0-9]+ デバイスを識別する番号 パーティションを識別する番号 USBマスストレージドライバではなく MMCブロックデバイスドライバが処理 mmcblk
  • 42. # openssl passwd -1 Password: Verifying - Password: $1$N3kc0bfR$skOb0RdWIHxOen69/pstu0 # vim etc/shadow ... root:$1$N3kc0bfR$skOb0RdWIHxOen69/pstu0:10770:0::::: ... rootパスワードを設定 # ln -sf /etc/init.d/swclock etc/runlevels/boot # rm etc/runlevels/boot/hwclock # touch sbin/rc 起動時の処理からハードウェアクロックを外して ソフトウェアクロックを追加する Gentooをインストールしよう
  • 43. PCには 電源が供給されていない間 BIOSの設定の維持と 時計を動かし続けるための 電池がついている 電池とかついてない 1970 1974 2000 1999 1998 1997 1996 1995 1994 1993 1992 1991 1990 1989 1988 1987 1986 1985 1983 1982 1981 1980 1979 1973 1972 1971 1984 1978 1977 1976 1975 Gentooをインストールしよう
  • 44. あるプロセスの手記 1970年 1月 1日  俺はいつものようにファイルの最終更新時刻を チェックしようとして、奇妙な事に気がついた。  ファイルが 43年後の未来に編集された事になっているのだ。 わけが分からなくなった俺は思わずこう叫んだ 「abort();」 Gentooをインストールしよう
  • 45. /etc/init.d/swclockで惨劇を回避する システムをシャットダウンする直前に /sbin/rcの最終更新時刻を更新する システム起動時に /sbin/rcの最終更新時刻を現在の時刻にする システムの時刻は正しい現在時刻ではないが 他の全てのファイルの最終更新時刻よりは 進んだ時刻になる Gentooをインストールしよう
  • 46. # vim etc/inittab ... s1:12345:respawn:/sbin/agetty -L 9600 ttyS1 vt100 を s1:12345:respawn:/sbin/agetty -L 115200 ttyO0 vt100 で置き換える ... シリアルからログイン出来るようにする Gentooをインストールしよう
  • 47. kernel_file=zImage initrd_file=uInitrd console=ttyO0,115200n8 mmcroot=/dev/mmcblk0p2 ro mmcrootfstype=f2fs rootwait fixrtc optargs=capemgr.disable_partno=BB-BONELT-HDMIN loadkernel=load mmc ${mmcdev}:${mmcpart} 0x80008000 ${kernel_file} loadinitrd=load mmc ${mmcdev}:${mmcpart} 0x81000000 ${initrd_file}; setenv initrd_size ${filesize} loadfdt=load mmc ${mmcdev}:${mmcpart} 0x815f0000 /dtbs/${fdtfile} console=ttyS0,115200n8 root=${mmcroot} rootfstype=${mmcrootfstype} $ {optargs} vram=24M omapfb.mode=hdmi:1024x768MR-16@60 omapdss.def_disp=hdmi omapfb.vram=0:4M,1:4M,2:4M,nolock mmcargs=setenv bootargs console=${console} console=ttyS0,115200n8 root=${mmcroot} rootfstype=${mmcrootfstype} ${optargs} vram=24M omapfb.mode=hdmi:1280x720@60 omapdss.def_disp=hdmi omapfb.vram=0:8M, 1:8M,2:8M,nolock boot_ftd=run loadkernel; run loadfdt uenvcmd=run boot_ftd; run mmcargs; bootz 0x80008000 - 0x815f0000 {initrd_size} 0x815f0000 U-Bootの設定ファイル uEnv.txt を書く Gentooをインストールしよう
  • 48. # cp uEnv.txt /mnt/p1/ # umount /mnt/p1 # umount /mnt/p2 uEnv.txtをzImageと同じディレクトリに置く SDカード リーダー Gentooをインストールしよう
  • 49. U-Boot SPL 2013.04-dirty (Jun 19 2013 - 09:57:14) musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn) musb-hdrc: MHDRC RTL version 2.0 musb-hdrc: setup fifo_mode 4 musb-hdrc: 28/31 max ep, 16384/16384 memory USB Peripheral mode controller at 47401000 using PIO, IRQ 0 musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, HB-ISO Rx, HB-ISO Tx, SoftConn) musb-hdrc: MHDRC RTL version 2.0 musb-hdrc: setup fifo_mode 4 musb-hdrc: 28/31 max ep, 16384/16384 memory USB Host mode controller at 47401800 using PIO, IRQ 0 OMAP SD/MMC: 0 mmc_send_cmd : timeout: No status update reading u-boot.img reading u-boot.img U-Boot 2013.04-dirty (Jun 19 2013 - 09:57:14) I2C: ready DRAM: 512 MiB WARNING: Caches not enabled NAND: No NAND device found!!! 0 MiB Gentooをインストールしよう
  • 50. # cat <<EOF >>/etc/conf.d/net config_eth0="dhcp" # cp /etc/init.d/net.lo /etc/init.d/net.eth0 # rc-update add net.eth0 default # /etc/init.d/net.eth0 start eth0を叩き起こす # vim /etc/portage/make.conf ... CFLAGS=”-O2 -pipe -march=armv7-a -mfpu=vfpv3-fp16 -mfloatabi=hard” を CFLAGS="-Os -pipe -march=armv7-a -mcpu=cortex-a8 mfpu=neon -mfloat-abi=hard" に変える ... CPUをCortex-A8に FPUをNEONに emergeの準備
  • 51. ARMには2種類の浮動小数点数演算器がある VFP NEON VFPとNEON
  • 52. VFP 64bitのレジスタが16本または32本 単精度最大2つ、倍精度最大1つが入る ベクタ同士の計算はシーケンシャルに実行するかも IEEE754丸めモードに対応 非正規化数を扱える ARMv5から拡張命令として搭載 VFPとNEON N
  • 53. NEON 128bitのレジスタが16本 単精度最大4つ、32bit整数最大4個、 16bit整数最大8個、8bit整数最大16個が入る ベクタ同士の計算はSIMDで実行する IEEE754丸めモード非対応 非正規化数を扱えない ARMv7から拡張命令として搭載 VFPとNEON
  • 54. VFP NEON NEONのレジスタはVFPのレジスタを 2つづつ組にしたものになっている 双方の命令を組み合わせて不足を補いながら計算する VFPとNEON
  • 55. gccはVFPとNEONをどう使うか -mfpu=vfpv3 VFPv3を使って浮動小数点数を計算 通常のARM命令を使って整数を計算 -mfpu=neon VFPv3を使って浮動小数点数を計算 通常のARM命令とNEONを使って整数を計算 VFPとNEON
  • 56. gccはVFPとNEONをどう使うか vadd.i32 q1, q3, q5 s0∼s32 VFPレジスタ q0∼q16 NEONレジスタ VFPとNEON
  • 57. gccはVFPとNEONをどう使うか vadd.f32 s5, s6, s14 s0∼s32 VFPレジスタ q0∼q16 NEONレジスタ VFPとNEON
  • 58. NEON 128bitのレジスタが16本 単精度最大4つ、32bit整数最大4個、 16bit整数最大8個、8bit整数最大16個が入る ベクタ同士の計算はSIMDで実行 IEEE754丸めモード非対応 非正規化数を扱えない ARMv7から拡張命令として搭載 こんなヤバい浮動小数点数演算器つかえねぇよ! VFPとNEON
  • 59. 禁断の呪文 こんなヤバい浮動小数点数演算器つかえねぇよ! -funsafe-math-optimizations 引数が有効な値であることを仮定 IEEEやANSIの標準に違反する挙動を許容 浮動小数点数をNEONで計算するよ VFPとNEON
  • 60. gccはVFPとNEONをどう使うか vadd.f32 q2, s2, s12 s0∼s32 VFPレジスタ q0∼q16 NEONレジスタ VFPとNEON
  • 61. システムの全てのパッケージのビルドに -funsafe-math-optimizations  を付けるのは怖い # cat <<EOF >/etc/portage/env/enable_neon_fp CFLAGS="-O3 -pipe -march=armv7-a -mcpu=cortex-a8 mfpu=neon -mfloat-abi=hard -ftree-vectorize -funsafe-mathoptimizations -funroll-loops" CXXFLAGS="${CFLAGS}" EOF # cat <<EOF >/etc/portage/package.env media-libs/faad2 enable_neon_fp media-sound/mpg123 enable_neon_fp media-libs/mesa enable_neon_fp media-libs/libjpeg-turbo enable_neon_fp ... 浮動小数点数が重要そうなパッケージだけ 付けていって、ヤバそうだったら引っ込める emergeの準備
  • 62. 次の世代のARMv8(64bit ARM)では 標準に準拠したVFPの挙動で NEONの幅の浮動小数演算が出来るようになっている 64bit ARM はやく普及してー
  • 63. ARMv3 ARMv4 ARMv5 ARMv6 ARMv7 ARMv8 ARM7 T M R A ARM9 ARM11 ARM10 Cortex-M Cortex-R Cortex-A T: Thumb命令対応 M: マイクロコントローラ(Thumb2のみ対応) R: リアルタイムプロセッサ A: アプリケーションプロセッサ(全部入り) ARMアーキテクチャの種類
  • 64. ARMv3 ARMv4 ARMv5 ARMv6 ARMv7 ARMv8 ARM7 ARM9 T M R A ARM11 ARM10 Cortex-M Cortex-R Cortex-A ニンテンドーDS ゲームボーイアドバンス mbed LPC11U24 Arduino Due Zaurus SLシリーズ iPhone5s BeagleBoard RaspberryPi 初代iPhone TrimSlice 大体のスマートフォン PSVITA ARMアーキテクチャの種類
  • 65. 仮想化支援 ARMv8a ARMv7a Thumb2EE RaspberryPi Thumb2 Thumb ARMv4 ARMv5 ARMv6 ARMv3 DSP演算 FPU VFPv2 BeagleBone VFPv3 NEON VFPv4 NEON 暗号化 ARMアーキテクチャの種類
  • 66. ARMv7a Out of Order スーパースカラ マルチコア A5 VFPv4 ○ A7 ○ A8 ○ 仮想化支援 ○ ○ ○ ○ LPAE ○ A9 ○ ○ ○ A12 ○ ○ ○ ○ ○ ○ A15 ○ ○ ○ ○ ○ ○ ○ ARMアーキテクチャの種類
  • 67. -march=armv7-a -mcpu=cortex-a8 gccにARMv7aシリーズのCortexA8でよろしく と言うための呪文 emergeの準備
  • 68. -mfloat-abi 浮動小数点数の処理方法が3種類から選べる 汎用レジスタで受け渡して -mfloat-abi=soft ソフトウェアで計算 汎用レジスタで受け渡して -mfloat-abi=softfp ハードウェアで計算 -mfloat-abi=hard VFPレジスタで受け渡して ハードウェアで計算 ここでABI互換が無くなるので 上と下のバイナリは混ぜるな危険 浮動小数点数のABI
  • 69. -mfloat-abi armv7a armv7a_hardfp 取り違えないように注意 浮動小数点数のABI
  • 70. BeagleBoneの為のCFLAGS CFLAGS=”-Os -pipe -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=hard” CFLAGS=”-Os -pipe -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=hard -ftree-vectorize” Auto-vectorizationを使う場合 emergeの準備
  • 71. 真っ先にインストールすべき物 distcc # USE=-* emerge distcc インストールして # cat <<EOF >>/etc/portage/make.conf MAKEOPTS="-j4" FEATURES="distcc" EOF # distcc-config --set-hosts "<ビルドを肩代わりするホスト>" ビルドを任せるホストを設定 Gentooをインストールしよう
  • 72. # vim /etc/conf.d/distccd ... DISTCCD_OPTS="${DISTCCD_OPTS} --listen <BeagleBoneBlackの IPアドレス>" ... BeagleBoneからの要求を受け入れるように設定 # /etc/init.d/distccd start # /etc/init.d/distccd start 両方でdistccdを起動 Gentooをインストールしよう
  • 73. ARMマイコン上でのビルド時間を 劇的に短縮する Intelのテクノロジー Gentooをインストールしよう
  • 74. あとはx86の と変わらないので省略 Gentooをインストールしよう
  • 75. 映像出力があるんだから Xサーバが動いて然るべき microHDMI Xを動かそう
  • 76. 作戦1 xf86-video-omapfb [ 10301.728] (II) Module omapfb: vendor="X.Org Foundation" [ 10301.728] ! compiled for 1.13.4, module version = 0.1.1 [ 10301.728] ! ABI class: X.Org Video Driver, version 13.1 [ 10301.728] (II) omapfb: Driver for OMAP framebuffer (omapfb) and external LCD controllers: ! omap1/2/3, S1D13745, HWA742 [ 10301.728] (--) using VT number 3 [ 10301.741] [ 10301.741] [ 10301.741] [ 10301.741] Fatal server [ 10301.741] (WW) Falling back to old probe method for OMAPFB (WW) OMAPFBProbe: Not an omapfb device: (EE) No devices detected. error: no screens found Xを動かそう
  • 77. 作戦2 xf86-video-omap # modprobe omapdss modprobe: ERROR: could not insert 'omapdss': No such device linux-3.8でカーネルドライバをロードしようとすると 何故かデバイスが無いと言われる linux-3.2では動いていたらしい Xを動かそう
  • 78. 作戦3 xf86-video-fbdev # ls /dev/fb0 /dev/fb0 フレームバッファデバイスは動いている アクセラレーションは全く効かなくなるけど fbdevドライバでXを起動出来る 何故かeMMCのAngstromもこの方法でXを起動してる Xを動かそう
  • 79. Xを動かそう
  • 80. Digi-Keyとかで売ってるよ! どこで買えば良いの?
  • 81. 大阪 東京 共立電子 秋月電子 どこで買えば良いの?
  • 82. そろそろマイコンっぽく使おう
  • 83. カーネル/VM式 ARMマイコン入門 Naomasa Matsubayashi
  • 84. ここにLEDが4つ付いている BeagleBoneのオンボードLEDは GPIOに接続された上で カーネルのLEDドライバが操作している # ls /sys/class/leds/ beaglebone:green:usr0 beaglebone:green:usr2 beaglebone:green:usr1 beaglebone:green:usr3 LED
  • 85. # ls /sys/class/leds/beaglebone:green:usr3/ brightness max_brightness subsystem uevent device power trigger brightness 明るさを設定する LEDが明るさ調節の可能な方法で接続されている場合 0からmax_birightnessまでの数値を書き込むと LEDの明るさが変化する 残念ながらGPIO接続のLEDは明るさを調節出来ない LED
  • 86. # ls /sys/class/leds/beaglebone:green:usr3/ brightness max_brightness subsystem uevent device power trigger trigger LEDを光らせる条件を設定する 読み出すとシステムがサポートする LEDを光らせる条件が列挙される # cat /sys/class/leds/beaglebone:green:usr3/trigger none nand-disk mmc0 [mmc1] timer oneshot heartbeat backlight gpio cpu0 default-on transient このLEDはmmc1(eMMC)へのアクセス時に光る LED
  • 87. # ls /sys/class/leds/beaglebone:green:usr3/ brightness max_brightness subsystem uevent device power trigger trigger # echo timer >/sys/class/leds/beaglebone:green:usr3/trigger Lチカをやりたいので条件をtimerに切り替え # ls /sys/class/leds/beaglebone:green:usr3/ brightness delay_on max_brightness subsystem delay_off device power trigger uevent delay_onとdelay_offが現れる LED
  • 88. # ls /sys/class/leds/beaglebone:green:usr3/ brightness delay_on max_brightness subsystem delay_off device power trigger uevent delay_on/delay_off ONになる時間、OFFになる時間 それぞれミリ秒で設定する # echo 10 >/sys/class/leds/beaglebone:green:usr3/delay_on # echo 490 >/sys/class/leds/beaglebone:green:usr3/delay_off LED
  • 89. 自分で外に付けたLEDを カーネルのLEDドライバで動かすには カーネルにLEDがあることを伝える必要がある LED
  • 90. PCだとデバイスの情報を に教えてくれる奴が居る UEFI BIOS ACPI他 ARMマイコンボードにはそういう仕組みが無い は事前に構成を知っていなければならない DeviceTree
  • 91. は事前に構成を知っていなければならない # find /usr/src/linux-3.8.13-gentoo/arch/arm/mach-* /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91 /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/stamp9g20.h /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/soc.h /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/setup.c /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/sam9_smc.h /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/sam9_smc.c /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/pm_slowclock.S /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/pm.h /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/pm.c /usr/src/linux-3.8.13-gentoo/arch/arm/mach-at91/leds.c ... 特定のハードウェアの情報を並べたコードの数々 DeviceTree
  • 92. Linus氏ぶち切れる http://thread.gmane.org/gmane.linux.kernel/1114495/focus=112007 DeviceTree
  • 93. デバイス情報をカーネル以外の所に分離しよう DeviceTree OpenFirmwareで使われている システムのデバイス情報を記述するフォーマット dtc DTS デバイスの種類と 設定を記述 DTB 一緒にロードして ブート DeviceTree
  • 94. DTSの在処 ${KERNEL_DIR}/arch/arm/boot/dts am33xx.dtsi AM33xxシリーズ 共通の情報 BeagleBoneシリーズ am335x-bone-common.dtsi 固有の情報 am335x-boneblack.dts BeagleBoneBlack 固有の情報 DeviceTree
  • 95. am335x-bone-common.dtsi ... gpio-leds { compatible = "gpio-leds"; pinctrl-names = "default"; pinctrl-0 = <&userled_pins>; led0 { label = "beaglebone:green:usr0"; gpios = <&gpio2 21 0>; linux,default-trigger = "heartbeat"; default-state = "off"; }; ... gpio2の21番目に gpio-ledsドライバが 扱うことができる LEDが繋がっていて 名前は beaglebone:green:usr0 デフォルトの用途は heartbeat DeviceTree
  • 96. BeagleBoneにはCapeと呼ばれる拡張ボードがある http://circuitco.com/support/index.php?title=BeagleBone_Capes Arduinoで言うshieldみたいなもん CapeManager
  • 97. 拡張ヘッダのデバイスを付け替える度に DeviceTreeを変えて再起動はメンドクサイ これ こっちも 再起動しないでDeviceTreeの一部を更新したい CapeManager
  • 98. # ls /lib/firmware/*.dtbo /lib/firmware/BB-ADC-00A0.dtbo /lib/firmware/BB-BONE-AUDI-01-00A0.dtbo /lib/firmware/BB-BONE-BACON-00A0.dtbo /lib/firmware/BB-BONE-BACONE-00A0.dtbo ... 色んな拡張ボード用のDeviceTreeのプラグイン # cat /sys/devices/bone_capemgr.*/slots 0: 54:PF--1: 55:PF--2: 56:PF--3: 57:PF--4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BBBONE-EMMC-2G 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BBBONELT-HDMI 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BBBONELT-HDMIN 現在ロードされているDeviceTreeのプラグイン CapeManager
  • 99. 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BBBONELT-HDMIN 現在ロードされているDeviceTreeのプラグイン # echo cape-bone-iio >/sys/devices/bone_capemgr.10/slots ADCをIIOデバイスとして使うプラグインをロード # cat /sys/devices/bone_capemgr.*/slots 0: 54:PF--1: 55:PF--2: 56:PF--3: 57:PF--4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BBBONE-EMMC-2G 5: ff:P-O-L Bone-Black-HDMI,00A0,Texas Instrument,BBBONELT-HDMI 6: ff:P-O-- Bone-Black-HDMIN,00A0,Texas Instrument,BBBONELT-HDMIN 8: ff:P-O-L Override Board Name,00A0,Override Manuf,capebone-iio CapeManager
  • 100. # # # # # # # # # emerge libftdi cd /usr/src git clone https://github.com/beagleboard/kernel.git cd kernel git checkout origin/3.8 -b 3.8 ./patch.sh cd kernel make scripts/dtc cp scripts/dtc /usr/sbin DeviceTreeコンパイラをインストール # # # # # cd /usr/src git clone https://github.com/nomel/beaglebone.git cd beaglebone/led-header/generated/ ./compile.sh ./install.sh LEDのDTSを既に作っている人がいる LED
  • 101. # cd kernel # make scripts/dtc # cp scripts/dtc /usr/sbin DeviceTreeコンパイラをインストール # # # # # cd /usr/src git clone https://github.com/nomel/beaglebone.git cd beaglebone/led-header/generated/ ./compile.sh ./install.sh LEDのDeviceTreeを既に作っている人がいる # echo led-P9.12 >/sys/devices/bone_capemgr.*/slots 左側の拡張ヘッダの12番ピンをLEDとする # ls /sys/class/leds/ beaglebone:green:usr0 beaglebone:green:usr1 beaglebone:green:usr2 beaglebone:green:usr3 leds:P9.12 やせいの LEDが とびだしてきた LED
  • 102. BeagleBoneの拡張ヘッダは 6mAまでしか流せない 最大 200Ω LED 小さいLEDでもArduinoのように直接繋ぐのは やめておいた方が良い LED
  • 103. 200Ω 100kΩ LED LED
  • 104. # echo timer >/sys/class/leds/leds:P9.12/trigger # echo 10 >/sys/class/leds/leds:P9.12/delay_on # echo 490 >/sys/class/leds/leds:P9.12/delay_off LED
  • 105. スイッチを付けよう 10μF 100kΩ GPIO
  • 106. # cd /usr/src/beaglebone/gpio-header/generated/ # ./compile.sh # ./install.sh GPIOのDeviceTreeプラグインをインストール # echo gpio-P8.8 >/sys/devices/bone_capemgr.*/slots 右側の拡張ヘッダの8番ピンをGPIOとする # echo rxEnable_pullUp >/sys/devices/ocp.*/gpioP8.8_gpio67.*/state ピンの状態を入力かつプルアップにする 右側8番ピンはSoCのGPIO67に繋がっている # echo 67 >/sys/class/gpio/export GPIO67をGPIOドライバの配下に GPIO
  • 107. 右側8番ピンはSoCのGPIO67に繋がっている # echo 67 >/sys/class/gpio/export GPIO67をGPIOドライバの配下に # cat /sys/class/gpio/gpio67/value 0 # cat /sys/class/gpio/gpio67/value 1 GPIO
  • 108. スイッチが切り替わった瞬間に処理をしたい 今のままではユーザ空間でポーリングが必要 切り替わった瞬間に から通知して欲しい Linux Input Subsystem evdev
  • 109. Device Drivers -> Input device support -> Keyboards -> GPIO Buttons 切ってあったら有効にする モジュールでもOK evdev
  • 110. --- gpio-P8.8-00A0.dts! 2013-10-15 22:29:14.871094049 +0900 +++ key-P8.8-00A0.dts! 2013-10-17 16:44:45.044921918 +0900 @@ -8,7 +8,7 @@ ! compatible = "ti,beaglebone", "ti,beaglebone-black"; ! -! +! ! /* identification */ part-number = "gpio-P8.8"; part-number = "key-P8.8"; /* version = "00A0"; */ ! @@ ! ! ! +! +! +! +! +! +! +! +! +! ! ! /* state the resources this cape uses */ -106,6 +106,15 @@ ! ! ! pinctrl-4 = <&gpio_P8_8_rxDisable_pullDown>; ! ! ! pinctrl-5 = <&gpio_P8_8_rxEnable_pullDown>; ! ! }; ! ! gpio-key { ! ! ! compatible = "gpio-keys"; ! ! ! button@67 { ! ! ! ! linux,code = <67>; ! ! ! ! label = "toggle0"; ! ! ! ! gpios = <&gpio3 3 0>; ! ! ! ! gpio-key,wakeup; ! ! ! }; ! ! }; ! }; }; キーコード: 67(適当) 名前: toggle0(適当) GPIO: GPIO3の3番目
  • 111. # dtc -@ -O dtb -o key-P8.8-00A0.dtbo key-P8.8-00A0.dts # cp key-P8.8-00A0.dtb0 /lib/firmwares gpio-keyのDeviceTreeをインストール # echo key-P8.8 >/sys/devices/bone_capemgr.*/slots そしてロード # echo rxEnable_pullUp >/sys/devices/ocp.*/gpioP8.8_gpio67.*/state ピンの状態を入力かつプルアップにする # ls /dev/input/by-path/ platform-44e0b000.i2c-event platform-gpio-keys.9-event platform-gpio-key.17-event 新しいイベントデバイスが現れた! evdev
  • 112. # ls /dev/input/by-path/ platform-44e0b000.i2c-event platform-gpio-keys.9-event platform-gpio-key.17-event 新しいイベントデバイスが現れた! # cat /dev/input/event2 |hexdump evdev
  • 113. # ls /dev/input/by-path/ platform-44e0b000.i2c-event platform-gpio-keys.9-event platform-gpio-key.17-event 新しいイベントデバイスが現れた! # cat /dev/input/event2 |hexdump 0000000 9c1c 525f d80a 000d 0001 0043 0000 0000 0000010 9c1c 525f d80a 000d 0000 0000 0000 0000 evdev
  • 114. # ls /dev/input/by-path/ platform-44e0b000.i2c-event platform-gpio-keys.9-event platform-gpio-key.17-event 新しいイベントデバイスが現れた! # cat /dev/input/event2 |hexdump 0000000 9c1c 525f d80a 000d 0001 0000010 9c1c 525f d80a 000d 0000 0000020 9c1f 525f e8ad 0008 0001 0000030 9c1f 525f e8ad 0008 0000 evdev 0043 0000 0043 0000 0000 0000 0001 0000 0000 0000 0000 0000
  • 115. linux/input.h struct input_event { ! struct timeval time; ! __u16 type; ! __u16 code; ! __s32 value; }; time: イベントが発生した時刻 type: イベントの種類(キー入力とかマウスの移動とか) code: 何に変化があったか(マウスの右ボタンとか) value: どういう状態になったか evdev
  • 116. httpd sshd snmpd デーモン起動するスイッチとか作れる evdev
  • 117. やっぱり久々の起動でも 正しい時間になっててほしいよね 電池 時計 I2C接続RTC M41T62 苺Linuxで525円 http://strawberry-linux.com/catalog/items?code=12062 リアルタイムクロック
  • 118. I2Cとは Inter-Integrated Circuit 略して あいすくえあしー チップ間のシリアル通信の為の規格 2本の信号線 半二重通信 1つのホストコントローラに複数のデバイス デバイスを識別するための7bit又は10bitのアドレス AM335xにもI2Cホストが3つ載っている I2C
  • 119. AM335xにもI2Cホストが3つ載っている ただし拡張ヘッダに出てるのは2つ I2C1 SCL 17 18 I2C1 SDA I2C2 SCL 19 20 I2C2 SDA I2C2 SCL 21 22 I2C2 SDA 23 24 I2C1 SCL 25 26 I2C1 SDA BeagleBoneのI2C
  • 120. BeagleBoneのI2C2にRTCを繋ぐ SDA 1 8 2 7 GND 3 6 VDD 4 SCL 5 I2C1 SCL 17 18 I2C1 SDA I2C2 SCL 19 20 I2C2 SDA I2C2 SCL 21 22 I2C2 SDA 23 24 I2C1 SCL 25 26 I2C1 SDA リアルタイムクロック
  • 121. #include <iostream> #include <string> #include <cstdlib> #include <cstdint> #include <boost/date_time/gregorian/gregorian.hpp> #include <boost/date_time/posix_time/posix_time.hpp> #include <boost/spirit/include/karma.hpp> #include <boost/range/irange.hpp> #include <boost/range/algorithm.hpp> #include <boost/program_options.hpp> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <linux/i2c-dev.h> uint8_t unpack( uint8_t value ) { return ( ( value >> 4 ) & 0xF ) * 10 + ( value uint8_t pack( uint8_t value ) { return ( ( value / 10 ) << 4 ) | ( value % 10 ); struct communication_failed {}; boost::posix_time::ptime get_time( int fd ) { std::vector< uint8_t > dump; dump.reserve( 8u ); boost::transform(boost::irange( 0u, 8u ), std::back_inserter( dump ), [&]( uint8_t addr ) { if( write( fd, &addr, 1 ) < 0 ) throw communication_failed(); uint8_t data;if( read( fd, &data, 1 ) < 0 ) throw communication_failed(); return data; } ); boost::posix_time::ptime now( boost::gregorian::date(2000+unpack( dump[ 7 ] ), unpack( dump[ 6 ] & 0x1F ), boost::posix_time::time_duration(unpack( dump[ 3 ] & 0x3F ), unpack( dump[ 2 ); return now; } void set_time( int fd, const boost::posix_time::ptime &time ) { std::vector< uint8_t > dump{{0,0, pack( time.time_of_day().seconds() ), pack( time.time_of_day().minutes() ), pack( time.time_of_day().hours() ), pack( time.date().week_number() ), pack( time.date().day() ), pack( time.date().month() ), pack( time.date().year() - 2000 ) }}; if( write( fd, dump.data(), dump.size() ) < 0 ) throw communication_failed(); } int main( int argc, char* argv[] ) { & 0xF ); } } unpack( dump[ 5 ] & 0x3F )), ] & 0x7F ), unpack( dump[ 1 ] & 0x7F )) リアルタイムクロック
  • 122. boost::posix_time::ptime now( boost::gregorian::date(2000+unpack( dump[ 7 ] ), unpack( dump[ 6 ] & 0x1F ), unpack( dump[ 5 ] & 0x3F )), boost::posix_time::time_duration(unpack( dump[ 3 ] & 0x3F ), unpack( dump[ 2 ] & 0x7F ), unpack( dump[ 1 ] & 0x7F )) ); return now; } void set_time( int fd, const boost::posix_time::ptime &time ) { std::vector< uint8_t > dump{{0,0, pack( time.time_of_day().seconds() ), pack( time.time_of_day().minutes() ), pack( time.time_of_day().hours() ), pack( time.date().week_number() ), pack( time.date().day() ), pack( time.date().month() ), pack( time.date().year() - 2000 ) }}; if( write( fd, dump.data(), dump.size() ) < 0 ) throw communication_failed(); } int main( int argc, char* argv[] ) { boost::program_options::options_description options("Options"); options.add_options()( "help,h", "show this message" ) ( "device,d", boost::program_options::value< std::string >(), "I2C device" ) ( "set,s", boost::program_options::value< std::string >(), "set current time" ) ( "get,g", "get current time" ); boost::program_options::variables_map variables; boost::program_options::store( boost::program_options::parse_command_line( argc, argv, options ), variables ); boost::program_options::notify( variables ); if( variables.count( "help" ) || !( variables.count( "device" ) ) || !( variables.count( "set" ) || variables.count( "get" ) ) || ( variables.count( "set" ) && variables.count( "get" ) ) ) std::cout << options << std::endl; else { const int fd = open( variables[ "device" ].as< std::string >().c_str(), O_RDWR ); if( fd < 0 ) exit( 1 ); ioctl( fd, I2C_SLAVE, 0x68 ); try { if( variables.count( "set" ) ) set_time( fd, boost::posix_time::time_from_string( variables[ "set" ].as< std::string >() ) ); else if( variables.count( "get" ) ) std::cout << get_time( fd ) << std::endl; } catch( const communication_failed& ) { exit( 1 ); } } } const int fd = open( variables["device"].as<std::string>().c_str(), O_RDWR ); ioctl( fd, I2C_SLAVE, 0x68 ); write( fd, dump.data(), dump.size() ); read( fd, &data, 1 ); リアルタイムクロック
  • 123. ちょっと叩いてみる # ./i2c_clock -d /dev/i2c-1 -g 2013-Oct-15 08:28:13 リアルタイムクロック
  • 124. 実はカーネルドライバがある Device Drivers -> Real Time Clock -> Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON AX-8025 リアルタイムクロック
  • 125. 実はカーネルドライバがある # echo m41t62 0x68 >/sys/class/i2c-adapter/i2c-1/new_device # ls /dec/rtc* /dev/rtc0 # hwclock Tue Oct 15 08:29:19 2013 -0.872509 seconds Linuxらしい方法で時刻がとれる # rc-update delete swclock boot # rc-update add hwclock boot # vim /etc/init.d/hwclock ... start() { echo m41t62 0x68 >/sys/class/i2c-adapter/i2c-1/new_device ... リアルタイムクロック
  • 126. # rc-update delete swclock boot # rc-update add hwclock boot # vim /etc/init.d/hwclock ... start() { echo m41t62 0x68 >/sys/class/i2c-adapter/i2c-1/new_device ... これで電源を落としても 次回起動時正しい時刻になっている リアルタイムクロック
  • 127. I2Cがいけたから 次はSPIいってみよう
  • 128. テキトーなSPIのデバイス L3G4200D 秋月電子で3000円 http://akizukidenshi.com/catalog/g/gM-06433/ ジャイロセンサー
  • 129. SPIとは Serial Peripheral Interface 周辺機器のシリアル通信の為の規格 3本の信号線 全二重通信 1つのホストコントローラに複数のデバイス チップセレクト線の本数だけデバイスを付けられる AM335xにもSPIホストが2つ載っている SPI
  • 130. AM335xにもSPIホストが2つ載っている ただし1本はオーディオ信号と競合 もう1本はI2Cと競合 SPI0 CS0 17 18 SPI0 D1 SPI0 CS1 19 20 SPI1 CS0 SPO0 D0 21 22 SCI0 SCLK ... ... 27 28 SPI1 CS0 SPI1 D0 29 30 SPI1 D1 SPI1 SCLK 31 32 ... ... 41 42 SPI1 CS1 BeagleBoneのSPI
  • 131. 8 7 SDO 6 SDI 5 SCL 4 CS 3 VIN 2 GND 1 SPI0 CS0 17 18 SPI0 D1 SPI0 CS1 19 20 SPI1 CS0 SPO0 D0 21 22 SCI0 SCLK ... ... ジャイロセンサー SPI1 CS0 27 28
  • 132. Device Drivers -> Industrial I/O support -> Digital gyroscope sensors -> STMicroelectronics gyroscopes 3-Axis Driver ジャイロセンサー
  • 133. --- am335x-bone-common.dtsi.orig! 2013-10-17 23:18:50.595705986 +0900 +++ am335x-bone-common.dtsi! 2013-10-17 23:24:48.398440404 +0900 @@ -52,6 +52,14 @@ ! ! ! ! 0x160 0x2f /* GPIO0_6 (PIN_INPUT | MUX_MODE7) */ ! ! ! >; ! ! }; +! ! spi0_pins: pinmux_spi0_pins { +! ! ! pinctrl-single,pins = < +! ! ! ! 0x150 0x30 /* spi0_sclk.gpio0_2, OUTPUT_PULLUP | MODE0 */ +! ! ! ! 0x154 0x30 /* spi0_d0.gpio0_3, INPUT_PULLUP | MODE0 */ +! ! ! ! 0x158 0x10 /* spi0_d1.i2c1_sda, OUTPUT_PULLUP | MODE0 */ +! ! ! ! 0x15c 0x10 /* spi0_cs0.i2c1_scl, OUTPUT_PULLUP | MODE0 */ +! ! ! >; +! ! }; ! }; ! ocp: ocp { @@ -548,3 +556,14 @@ ! status = "okay"; }; +&spi0 { +! pinctrl-names = "default"; +! pinctrl-0 = <&spi0_pins>; +! status = "okay"; +! gyrometer {
  • 134. ! +! +! +! +! +! +! +! +! ! ! ! ! ! ! ! ! ! ! }; }; spi0_pins: pinmux_spi0_pins { ! pinctrl-single,pins = < ! ! 0x150 0x30 /* spi0_sclk.gpio0_2, OUTPUT_PULLUP | MODE0 */ ! ! 0x154 0x30 /* spi0_d0.gpio0_3, INPUT_PULLUP | MODE0 */ ! ! 0x158 0x10 /* spi0_d1.i2c1_sda, OUTPUT_PULLUP | MODE0 */ ! ! 0x15c 0x10 /* spi0_cs0.i2c1_scl, OUTPUT_PULLUP | MODE0 */ ! >; }; ! ocp: ocp { @@ -548,3 +556,14 @@ ! status = "okay"; }; +&spi0 { +! pinctrl-names = "default"; SPI0のCS0にジャイロがある +! pinctrl-0 = <&spi0_pins>; +! status = "okay"; ハードウェアはl3g4200gで +! gyrometer { +! ! compatible = "st,l3g4200d"; 最大10MHzで通信出来る +! ! reg = <0>; +! ! spi-max-frequency = <1000000>; +! }; +}; +
  • 135. # ls /sys/bus/iio/devices/iio:device0/ dev in_anglvel_z_scale in_anglvel_scale_available name in_anglvel_x_raw power in_anglvel_x_scale sampling_frequency in_anglvel_y_raw sampling_frequency_available in_anglvel_y_scale subsystem in_anglvel_z_raw uevent # cat /sys/bus/iio/devices/iio:device0/in_anglvel_z_raw -105 角速度がとれる サーバが何故か高速回転していたら アラートメールを飛ばす とかできる ジャイロセンサー
  • 136. アナログ信号を読もう
  • 137. AM335xには8チャネルのADCがある ただし拡張ヘッダに出ているのは7本 32 VDD_ADC AIN4 33 34 GNDA_ADC AIN6 35 36 AIN5 AIN2 37 38 AIN3 AIN0 39 40 AIN1 BeagleBoneのADC
  • 138. BeagleBoneのプロセッサは 1.8Vで動いている デジタル信号用のピンは 3.3V 全て に変換されている ADコンバータの基準電圧は 1.8Vになっている GND 3.3V電源 5V電源 1.8V電源 3.3V I/O 1.8V I/O ADC
  • 139. ADコンバータの基準電圧は 1.8Vになっている 3軸加速度センサー 苺Linuxで 840円 動作電圧: 3.3V http://strawberry-linux.com/catalog/items?code=12101 各軸方向の加速度が 最大3.3Vのアナログ信号で出てくる 1.8VのADCは死ぬ ADC
  • 140. 手持ちの部品の中で1.8VのADCに繋げそうなヤツ 謎のスライドボリューム 50円 ADC
  • 141. ?Ω ADC
  • 142. Device Drivers -> Industrial I/O support -> Analog to digital converters -> TI s ADC driver ADC
  • 143. # modprobe ti_am335x_adc # echo BB-ADC >/sys/devices/bone_capemgr.10/slots # ls /sys/bus/iio/devices/iio:device1/ ls /sys/bus/iio/devices/iio:device1/ buffer in_voltage4_raw scan_elements dev in_voltage5_raw subsystem in_voltage0_raw in_voltage6_raw trigger in_voltage1_raw in_voltage7_raw uevent in_voltage2_raw name in_voltage3_raw power ADCのモジュールとDTSをロード # cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw 2367 ADC
  • 144. # cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw 1 # cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw 607 # cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw 1728 # cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw 2871 # cat /sys/bus/iio/devices/iio:device1/in_voltage0_raw 4094 本当はタッチパネル用らしい ADC
  • 145. AM335xには8チャネルのPWMがある はずなんだけど # echo bone_pwm_P8_13 >/sys/devices/bone_capemgr.*/slots # dmesg [ 1757.358156] bone-capemgr bone_capemgr.10: part_number 'bone_pwm_P8_13', version 'N/A' [ 1757.358250] bone-capemgr bone_capemgr.10: slot #9: generic override [ 1757.358275] bone-capemgr bone_capemgr.10: bone: Using override eeprom data at slot 9 [ 1757.358301] bone-capemgr bone_capemgr.10: slot #9: 'Override Board Name, 00A0,Override Manuf,bone_pwm_P8_13' [ 1757.358497] bone-capemgr bone_capemgr.10: slot #9: Requesting part number/version based 'bone_pwm_P8_13-00A0.dtbo [ 1757.358524] bone-capemgr bone_capemgr.10: slot #9: Requesting firmware 'bone_pwm_P8_13-00A0.dtbo' for board-name 'Override Board Name', version '00A0' [ 1757.358553] bone-capemgr bone_capemgr.10: slot #9: dtbo 'bone_pwm_P8_13-00A0.dtbo' loaded; converting to live tree [ 1757.358987] bone-capemgr bone_capemgr.10: slot #9: #2 overlays [ 1757.359830] bone-capemgr bone_capemgr.10: slot #9: Applied #2 overlays. [ 1757.373925] pwm_test pwm_test_P8_13.17: unable to request PWM [ 1757.373986] platform pwm_test_P8_13.17: Driver pwm_test requests probe deferral なんかドライバの初期化でこけてる PWM
  • 146. まとめ
  • 147. PC Linuxでのプログラミングと マイコンプログラミングの融合 BeagleBoneBlack
  • 148. 配線は計画的に
  • 149. おまけ
  • 150. Intel Arduino http://arduino.cc/en/Main/ArduinoBoardTre beagleboard.org Arduino TI AM3359搭載 Arduino Tre
  • 151. http://arduino.cc/en/ArduinoCertified/IntelGalileo Intel Arduino Intel Quark SoC X1000搭載 Galileo
  • 152. 参考URL BeagleBoneBlack Wiki http://circuitco.com/support/index.php?title=BeagleBoneBlack ARM Infocenter http://infocenter.arm.com/help/index.jsp Gentoo on the BeagleBone Black http://dev.gentoo.org/ armin76/arm/beagleboneblack/install.xml BeagleBoard.org on Github https://github.com/beagleboard beaglebone gpio/led-header on Github https://github.com/nomel/beaglebone hipstercircuits http://hipstercircuits.com/
  • 153. PWMが動かなくて 出番が無かったbeep基板 Thank you for listening