シリアル不調?
BBBとUSBシリアルで接続していて、レスポンスが非常に遅くなることがある。
入力も出力も遅い。
LEDのハートビートは元気に動いている。
こんなときはUSBシリアルの抜き差しで。
SDカードリーダ
いままで使っていたエレコムのカードリーダ(CF対応)のものが、SDカードを認識しなくなったので、新たに以下を購入。
まじめにベンチを取ったわけではないけど、以前のUSB2.0に比べて速い気がする。
それにしても安くてお買い得。
BeagleBoneBlackでタッチパネル
BBBにタッチパネルをつけて遊んでみる。購入したのは、これ。
ラズパイ用だけど、HDMI入力で、タッチの制御はUSBで、マルチタッチ。
付属品もケーブル、タッチペン、ACアダプタと豊富。
BBBの方は、最新のdebianイメージを使用。
Debian 9.5 2018-10-07 4GB SD LXQT
1. USBでの認識
タッチパネルを接続する前は、/dev/input下に対応するファイルができていないが、接続するとデバイスファイルが作成される。
接続前
debian@beaglebone:~$ ls /dev/input/
event0
接続後
debian@beaglebone:~$ ls /dev/input/
by-id by-path event0 event1
dmesgで確認すると、TSTP製?らしい。
debian@beaglebone:~$ dmesg | tail
[ 106.428436] remoteproc remoteproc2: 4a338000.pru is available
[ 106.428587] pru-rproc 4a338000.pru: PRU rproc node /ocp/pruss_soc_bus@4a326004/pruss@0/pru@38000 probed successfully
[ 107.998418] usb 1-1.4: new full-speed USB device number 3 using musb-hdrc
[ 108.108822] usb 1-1.4: New USB device found, idVendor=0416, idProduct=c168
[ 108.108846] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 108.108855] usb 1-1.4: Product: MTouch
[ 108.108863] usb 1-1.4: Manufacturer: TSTP
[ 108.137395] hid-generic 0003:0416:C168.0002: hiddev0,hidraw0: USB HID v1.11 Device [TSTP MTouch] on usb-musb-hdrc.1-1.4/input1
[ 109.555257] input: TSTP MTouch as /devices/platform/ocp/47400000.usb/47401c00.usb/musb-hdrc.1/usb1/1-1/1-1.4/1-1.4:1.0/0003:0416:C168.0001/input/input1
[ 109.556543] hid-multitouch 0003:0416:C168.0001: input,hidraw1: USB HID v1.11 Device [TSTP MTouch] on usb-musb-hdrc.1-1.4/input0
debian@beaglebone:~$
この状態で、evtestコマンドでイベントを取得すると、タッチに反応して、座標がパラパラ表示される。
debian@beaglebone:~$ sudo evtest /dev/input/event1
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x416 product 0xc168 version 0x111
Input device name: "TSTP MTouch"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 330 (BTN_TOUCH)
Event type 3 (EV_ABS)
Event code 0 (ABS_X)
Value 1492
Min 0
Max 2048
Resolution 6
Event code 1 (ABS_Y)
Value 786
Min 0
Max 1200
Resolution 5
Event code 47 (ABS_MT_SLOT)
Value 0
Min 0
Max 9
Event code 53 (ABS_MT_POSITION_X)
Value 0
Min 0
Max 2048
Resolution 6
Event code 54 (ABS_MT_POSITION_Y)
Value 0
Min 0
Max 1200
Resolution 5
Event code 57 (ABS_MT_TRACKING_ID)
Value 0
Min 0
Max 65535
Properties:
Property type 1 (INPUT_PROP_DIRECT)
Testing ... (interrupt to exit)Event: time 1559055796.779302, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 1
Event: time 1559055796.779302, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 898
Event: time 1559055796.779302, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 616
Event: time 1559055796.779302, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1559055796.779302, type 3 (EV_ABS), code 0 (ABS_X), value 898
Event: time 1559055796.779302, type 3 (EV_ABS), code 1 (ABS_Y), value 616
Event: time 1559055796.779302, -------------- SYN_REPORT ------------
Event: time 1559055796.834278, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 1
Event: time 1559055796.834278, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 2
Event: time 1559055796.834278, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 1508
Event: time 1559055796.834278, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 390
Event: time 1559055796.834278, -------------- SYN_REPORT ------------
Event: time 1559055796.949172, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 0
Event: time 1559055796.949172, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 1559055796.949172, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 1
Event: time 1559055796.949172, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 1559055796.949172, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 1559055796.949172, -------------- SYN_REPORT ------------
Event: time 1559055797.439261, type 3 (EV_ABS), code 47 (ABS_MT_SLOT), value 0
Event: time 1559055797.439261, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 3
Event: time 1559055797.439261, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 986
Event: time 1559055797.439261, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 682
Event: time 1559055797.439261, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1559055797.439261, type 3 (EV_ABS), code 0 (ABS_X), value 986
Event: time 1559055797.439261, type 3 (EV_ABS), code 1 (ABS_Y), value 682
Event: time 1559055797.439261, -------------- SYN_REPORT ------------
Event: time 1559055797.549158, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value -1
Event: time 1559055797.549158, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 1559055797.549158, -------------- SYN_REPORT ------------
ドライバについては、特にインストールしていないが、標準のもので、hid_multitouchがモジュールとしてロードされており、これが使用されている。
2. Chromiumの起動
接続した時点で、Xが表示されているので、メニューからChromiumを起動する。
Chromium上では、マルチタッチが有効になっており、ピンチインでズームインができる。
また、javascriptでtouchstartイベントを取得もできる。
ここ(touch, click, pointerの実装 - タッチイベントとマウスイベント | CodeGrid)のサンプルページにアクセスしてみると、イベントの詳細がわかる。
Chromiumがタッチで動作可能な理由は、すでに, libinputというライブラリがインストール済みのため。この設定は、/usr/share/X11/xorg.conf.dの中に40-libinput.confがあり、ここに記述される。現状は以下の通り。
debian@beaglebone:/usr/share/X11/xorg.conf.d$ cat 40-libinput.conf
# Match on all types of devices but tablet devices and joysticks
Section "InputClass"
Identifier "libinput pointer catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSectionSection "InputClass"
Identifier "libinput keyboard catchall"
MatchIsKeyboard "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSectionSection "InputClass"
Identifier "libinput touchpad catchall"
MatchIsTouchpad "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSectionSection "InputClass"
Identifier "libinput touchscreen catchall"
MatchIsTouchscreen "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSectionSection "InputClass"
Identifier "libinput tablet catchall"
MatchIsTablet "on"
MatchDevicePath "/dev/input/event*"
Driver "libinput"
EndSection
それにしても、Xの描画が遅い。。。
カーネルオブジェクトのビルド
簡単なカーネルモジュールを作ってみる。
ソース、Makefile
・hello_module.c
#include <linux/module.h>
MODULE_LICENSE("GPL v2");static int hello_init(void)
{
printk( KERN_ERR "Hello world\n");
return 0;
}static void hello_exit(void)
{
/* none */
}module_init(hello_init);
module_exit(hello_exit);
obj-m := hello_module.o
all:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -C $(KERNEL) M=$(PWD) modules
ビルド
カーネルソースの位置を相対的に指定する。ここでは、../kernel_src/kernel/kernel
make KERNEL=../kernel_src/kernel/kernel/
ビルドが完了すると、hello_module.koが作成さる。
モジュールのインストール
作成されたkoファイルをBBBの起動SDへコピーして、BBBを起動する。
BBB起動後、作成されたモジュールをinsmodすると、読み込まれてhello worldが表示される。
insmod hello_module.ko
・参考
https://blukat29.github.io/2017/12/cross-compile-arm-kernel-module/
ビルド環境の再構築
最近、mintのバージョンを上げたので、BBBの開発環境を作り直そうと思った。
が、以前と状況が異なり、カーネルビルドでエラーになった。
(compiler-gcc8.hがない。以前はgcc4系で、現状は8系)
仕方がないので、VirtualBox上でUbuntu16.04をインストールし、もう一度環境構築した。
ツールのインストール
いくつかツールをインストールする。
・Git
インストールされていない場合はインストールする。cloneするために、ユーザー名とメールアドレスを設定しておく。
sudo apt-get install git
git config --global user.email "XXXX@xxxx.co.jp"
git config --global user.name "xxxx"
・lzop
圧縮に使うらしいのでインストールする。
sudo apt-get install lzop
・bison, flex, libssl
u-bootのビルドに必要。
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libssl-dev
・u-boot
以前のサイトにはなくなっていたため、gitでクローンする。
mkdir u-boot
cd u-boot
wget ftp://ftp.denx.de/pub/u-boot/u-boot-latest.tar.bz2
tar xf u-boot-latest.tar.bz2
cd u-boot-2017.09
make sandbox_defconfig tools-only
sudo install tools/mkimage /usr/local/bin
git clone https://github.com/u-boot/u-boot.git
cd u-bootmake sandbox_defconfig tools-only
sudo install tools/mkimage /usr/local/bin
・gcc
使用したカーネルは、GCC4系を想定しているようなので、gcc-4.9のARMコンパイラをインストールする。なぜか、シンボリックリンクが張られなかったので、張っておく。
sudo apt-get install gcc-4.9-arm-linux-gnueabi
cd /usr/bin/
sudo ln -s arm-linux-gnueabi-gcc-4.9 arm-linux-gnueabi-gcc
カーネルソース取得&ビルド
gitでソースをcloneして、パッチを適用する。
mkdir kernel_src
cd kernel_src
git clone https://github.com/beagleboard/kernel.git
cd kernel
git checkout origin/3.13 -b 3.13
./patch.sh
コンフィグファイルを書き換える。
cp configs/beaglebone kernel/arch/arm/configs/beaglebone_defconfig
wget http://arago-project.org/git/projects/?p=am33x-cm3.git\;a=blob_plain\;f=bin/am335x-pm-firmware.bin\;hb=HEAD -O kernel/firmware/am335x-pm-firmware.bin
カーネルのビルドは、通常のカーネルビルドと同じだが、prefixを常につけて行う。
cd kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- beaglebone_defconfig -j2
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage dtbs LOADADDR=0x80008000 -j2
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules -j2
ビルドが完了すると、kernel_src/kernel/kernel/arch/arm/bootにzImageが作成される。
カーネルの更新
事前にビルドしていたカーネルイメージをコピーする。
cd kernel_src/kernel/kernel/arch/arm/boot
sudo cp zImage /media/ubuntu/BOOT/
sudo cp dts/am335x-boneblack.dtb /media/ubuntu/BOOT/dtbs/
cd kernel_src/kernel/kernel
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/media/ubuntu/rootfs modules_install
が、VirtualBoxの問題で直接SDカードをマウントできなかったので、ネットワーク経由でSDへコピーした。
intelliJ IDEAのインストール
Scalaの開発環境としてintelliJ IDEAを使えるらしいので使ってみる。
前提条件として、JDKとScalaがインストールされていること。
参考にしたのは、以下のページ
IDE(Intellij IDEA) · Scala研修テキスト
1. ダウンロード
本家(https://www.jetbrains.com/idea/)からCommunity版をダウンロードして、解凍する。
ファイル名は2019/5/17時点で、ideaIC-2019.1.2.tar.gz
tar xf ideaIC-2019.1.2.tar.gz
2. インストール
解凍してできたbinフォルダの中のidea.shを実行する。
cd bin
./idea.sh
プライバシーポリシーの確認が表示されるので、チェックをつけてContinue。
とりあえず、「Don't send」で次へ進む。ロゴが表示されて、ウェルカム画面になる。
3. プラグインのインストール
Scalaのプラグインを入れるため、「Configure」→「Plugins」を選ぶ。
Scalaがあるのでインストールボタンを押す。インストール後、「Restart IDE」ボタンを押して、再起動する。
4. プロジェクトの作成
ウェルカム画面から「Create Neew Project」を選ぶ。プロジェクトのタイプとして、ScalaとIDEAを選ぶ。
プロジェクト名は「HelloWorld」、JDKは11(newで/usr/lib/jvm/以下のフォルダを選択する)、Scala SDKはscala-sdk-2.11.12(create → browseで/usr/share/scala-2.11を指定)とする。
これで「Finish」するとメイン画面になるので、プログラムを作る。
「run」すると、「HelloWorld」が出力される。
intelliJ IDEAのインストールは以上で終了。