ラベル Lichee pi の投稿を表示しています。 すべての投稿を表示
ラベル Lichee pi の投稿を表示しています。 すべての投稿を表示

2021年8月25日水曜日

Lichee Pi Zeroで無線LANを使いたい ESP8266 その1

Lichee Pi向け?の無線LANモジュールはあるみたいだけど、TELEC取得していないので
普通に使うことはできない。
そこで、気にはなっていたけど使ったことがなかったESPを最近使い始めたので、調子に乗ってLicheePIと接続してみたいと思う。
ESP8266(ESP-WROOM-02D (2MB))

UART1を有効にする

コミニュティの手順書を参考にUART1を有効にする
http://zero.lichee.pro/驱动/UART.html

ブロック図では
http://zero.lichee.pro/入门/board_intro.html#id5

IO-E21、IO-E22の割り当てをUART1に変更できる


dts、dtsiファイルの変更

手順書では、sun8i-v8s.dtsiやsun8i-v3s-licheepi-zero.dtsを書き換える手順になっているが、変更箇所を分離して自分の管理下に置きたかったので、別ファイルに記載することにした。

buildrootの外部ツリーに
board/dts/sun8i-v3s-licheepi-zero-dock-with-lcd.dts
を作成


#include "sun8i-v3s-licheepi-zero-dock.dts"

/ {
	backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm 0 1000000 0>;
		brightness-levels = <0 30 40 50 60 70 100>;
		default-brightness-level = <6>;
	};

	soc {
		pio: pinctrl@01c20800 {
			uart1_pins_a: uart1@0 {
				pins = "PE21", "PE22";
				function = "uart1";
				bias-pull-up;
			};
		};
	};
};

&pwm {
	pinctrl-names = "default";
	pinctrl-0 = <&pwm0_pins>;
	status = "okay";
};

&uart1 {
	pinctrl-0 = <&uart1_pins_a>;
	pinctrl-names = "default";
	status = "okay";
};

これを読むようにconfigファイルを変更(menu menuconfig)する

BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/dts/sun8i-v3s-licheepi-zero-dock-with-lcd.dts"

dtsとdtbの相互変換

device-tree-compiler が必要

dtsからdtb

#!/bin/bash

LINUX_KERNEL_SRC=output/build/linux-zero-4.14.y
DTS_SRC_FILE=$1
DTB_OUT_FILE=${DTS_SRC_FILE%.*}.dtb

gcc -E -P -x assembler-with-cpp -I $LINUX_KERNEL_SRC/arch/arm/boot/dts -I $LINUX_KERNEL_SRC/include $DTS_SRC_FILE | dtc -I dts -O dtb -i $LINUX_KERNEL_SRC/arch/arm/boot/dts -o $DTB_OUT_FILE

dtbからdts

作成されたdtbが意図したものになっているかを確認する

dtc -I dtb -O dts -o result.dts sun8i-v3s-licheepi-zero-dock-with-lcd.dtb

動作確認

適当なシリアルターミナルをインストールして確認する
今回はminiconにしてみた
uart1をループさせて、入力したものが返ってくるかを確認する

Lichee PiからESP8266のファーム書き込み

ファーム書き換えの毎にPCに接続するのも大変なので、LicheePiから書き込めるようにする

これには、esptool.pyを使用するとできるようだ
流れとしてはVScodeやArduino IDEでコンパイル→生成したバイナリをLicheePIに転送→LicheePiからESP8266を書き換える といった流れ

まずは、Arduinoは作成したファーム(バイナリ)が残らない?ので、残す方法
以下を参考にやってみる
https://www.jh4vaj.com/archives/8548

Arduino IDEの場合

スケッチ→コンパイルしたバイナリを出力



ワークスペースに[〜〜.ino.generic.bin]というファイル名でバイナリが作成される

VScodeの場合

/home/adeno/.arduino15/preferences.txt

に

build.path=/home/adeno/develop/Arduino/

を追加すると
コンパイル時にここにバイナリを保存しておいてくれる
このときのファイル名は[〜〜.ino.bin]というファイル名でバイナリが生成させる

方法によって、ファイル名が異なるので注意が必要。。

書き込み

esptool.py --port /dev/ttyS1 write_flash 0x0 sketch_mar29a.ino.bin

こんな感じでどーんっ
これで、ようやく環境が出来た、、まだ先は長い



2021年5月8日土曜日

Lichee Pi Zeroで母艦PCとファイル同期させる

あまり手をつけていないが、少しずつやっている
母艦PCとのファイル同期に、開発中はsftpとかで良いんだろうが
例えば、何か作った後に、データを更新させたいといった時
sshはなんか心理的にやだった(何が

フォトフレームとした場合も、写真の更新取得先はdropboxやnextcloudなどクラウドストレージかもしれないし。何かしら同期させる手段が欲しい。

でも個別にサービスに対応させるのはしんどい。
davfs2を最初考えたけど、うまいことマウント出来ずに挫折した。
webdav以外にもつながりたいかもしれないし。
そんなことを悩んでいたら、rcloneというソフトに出会った。

rcloneはすごそう

  • Rclone syncs your files to cloud storage

すごいたくさん対応してるー!
https://rclone.org/#providers

Dropboxもあるし、Google Photos、Nextcloud、webdavなんかもある!
これを導入できれば、スッキリできるかもしれない。

お試し導入してみる

まずはどんなものかを味わうために、ビルド済みのやつを持ってきてみる。
https://rclone.org/downloads/
の[ARMv6 - 32 Bit][linux]というやつ

rclone-v1.54.0-linux-arm.zip

これを展開して、LicheePiに転送。

# ./rclone version
rclone v1.54.0
- os/arch: linux/arm
- go version: go1.15.7

さすが golang すんなり起動するのがすごいね。

対向サーバーは?

さてさて、対向となるサーバーはどうしようかと、あまり手間かけたくないし。
簡易的なwebサーバーで良いんだけど。
なんとなくwebdav使ってみたくて、あれこれ探していたら、wsgidavというソフトに出会った。

https://wsgidav.readthedocs.io/en/latest/index.html
https://qiita.com/Brad-55/items/5b596b76ef7dc1be9a39

インストールはとっても簡単

pip install --upgrade wsgidav

これでOK!
起動もとても簡単!

wsgidav --host=0.0.0.0 --port=8888 --root=/home/adeno/develop/wsgidav --auth=anonymous

これで、とりあえず、認証なしのwebdavサービスが出来上がる。すてき。


 

さて、やってみよう

これもとても簡単
https://rclone.org/webdav/

に従いやっていくだけ

# ./rclone ls chihiro:
1970/01/02 08:10:10 NOTICE: Time may be set wrong - time from "192.168.100.10:8888" is -448164h47m5.409855313s different from this computer
   476690 Screenshot from 2020-04-17 15-46-39.png
   540108 Screenshot from 2020-04-17 15-48-22.png
   272475 chihiro001.jpg
   376802 chihiro002.jpg
   441756 chihiro003.jpg
   297234 chihiro004.jpg
   160027 chihiro005.jpg
   224296 chihiro006.jpg
   276833 chihiro007.jpg
   296495 chihiro008.jpg

おっと、日時設定してなかった。

日時設定

とりあえず手動で

# date --set "2021-02-17 6:00:00"
Wed Feb 17 06:00:00 UTC 2021

あれ、UTCだ。

    BR2_TARGET_TZ_INFO=y
    BR2_TARGET_TZ_ZONELIST="default"
    BR2_TARGET_LOCALTIME="Asia/Tokyo" 

これで、再度ビルドして

# date --set "2021-02-20 19:38:00"
Sat Feb 20 19:38:00 JST 2021

これでOK

NTP導入

手動でうまく行くことがわかったので、今度は自動で調時させたい。

クライアント側

chronyというのを使ってみる。

    BR2_PACKAGE_CHRONY=y

サーバー側

特に何も考えずに、以下を参考に
https://tecadmin.net/setup-time-synchronisation-ntp-server-on-ubuntu-linuxmint/

$ sudo apt install ntp

/etc/ntp.confに追記

restrict 192.168.100.0 mask 255.255.255.0 nomodify notrap

あとはリロード

sudo service ntp reload

ファイアウォールも忘れてはいけない
123/tcpを許可する

実行

# cat /etc/chrony.conf 
server 192.168.100.10
leapsecmode slew
makestep 1.0 3

# /etc/init.d/S49chrony restart
# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^? 192.168.100.10                3   6     1    30  -18678d[-18678d] +/-  134ms
# chronyc makestep
200 OK
<3分くらい後に>
# date
Mon Feb 22 06:18:51 JST 2021

makestep 1.0 3

により、サービス起動時に1.0秒以上のズレがあった場合には即時調時されるっぽい。

buildrootと連携(rcloneパッケージの作成)

今後も見据えてmenuconfigから選択できるようにしたい。
このあたりを参考に

https://buildroot.org/downloads/manual/manual.html#outside-br-custom
https://buildroot.org/downloads/manual/manual.html#adding-packages

パッケージの追加

構成を考える
br2-externalにて指定している外部ツリー

ex_licheepizerodock

の下にpackageディレクトリを作成してもろもろ置いていく。
今回は思考停止して「rclone」とした。

tabが重要なので、エディタのtab→スペース変換はoffにしないとハマる。

ex_licheepizerodock$ tree
.
├── Config.in
<>
├── external.desc
├── external.mk
├── package
│   └── rclone
│       ├── Config.in
│       └── rclone.mk

Config.inとexternal.mkの変更

Config.inの変更

source "$BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH/package/rclone/Config.in"

external.mkの変更

include $(sort $(wildcard $(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/package/*/*.mk))

package内のConfig.inと.mkの作成

Config.inの作成

config BR2_PACKAGE_RCLONE
    bool "rclone sync"
    help
        Rclone syncs your files to cloud storage

rclone.mkの作成

超絶シンプル。zip展開して、バイナリをコピーするだけ。

################################################################################
#
# Rclone syncs.
#
################################################################################

RCLONE_SOURCE = rclone-current-linux-arm.zip
RCLONE_SITE = https://downloads.rclone.org
RCLONE_LICENSE = MIT
RCLONE_SOURCE_BASENAME = rclone
RCLONE_BIN_NAME = rclone

define RCLONE_EXTRACT_CMDS
	unzip -j $(DL_DIR)/$(RCLONE_SOURCE_BASENAME)/$(RCLONE_SOURCE) -d $(@D)
endef

define RCLONE_INSTALL_TARGET_CMDS
	@echo BR2_PACKAGE_RCLONE_INSTALL_TARGET_CMDS
	$(INSTALL) -D -m 0755 $(@D)/$(RCLONE_BIN_NAME) $(TARGET_DIR)/usr/bin
endef

$(eval $(generic-package))

これでOK!


 

2021年3月21日日曜日

Lichee Pi Zeroのソフト開発環境構築6

ようやくバージョンアップの手段を準備できたので、「ソフト開発環境」の準備の入り口を作りたい。

プログラム作成→実行までを考える

簡単なものとして、シェルスクリプトを作成して、LicheePi側で実行したい場合

VScode

とりあえずこれがPC側に
あとは拡張機能をいくつか

SFTP
SSH FS

LicheePi側

sshサーバー

これが無いと始まらないかな。
軽微な修正時に、シリアルコンソールの出番を減らせるし!

BR2_PACKAGE_DROPBEAR

sftpサーバー

これも、入れておくと、VSCodeから更新が簡単にできる!

BR2_PACKAGE_GESFTPSERVER

これで、プログラム作成からファイル転送、実行までVSCode内で完結できる!素敵!


 

ちょっとしたGUIインターフェースにTck/Tk

なつかしー

BR2_PACKAGE_TK
BR2_PACKAGE_TCL

ちょっとしたGUIが簡単に?できるのは素晴らしいと思う。


 

今は、環境構築すすめているので、詳細は別途まとめる

これで、シェルスクリプトの環境がなんとなく整った。
あとは、必要に応じて入れていこうかな、pythonやc/c++が候補。

Python

Lichee Piのスペックで動くか知らないけど、とりあえず入れてみる。

BR2_PACKAGE_PYTHON3

TKINTERは・・・?
https://sourceforge.net/p/armadeus/code/ci/master/tree/patches/buildroot/2017.02/012-armadeus-add-tkinter-support-to-python.patch
を参考に、書き換えてみた。

patch ../../../package/python3/Config.in < 0001-add-tkinter-support-to-python3_Config.in.patch 
patch ../../../package/python3/python3.mk < 0002-add-tkinter-support-to-python3_python3.mk.patch 
--- Config.in	2020-10-12 21:55:06.000000000 +0900
+++ Config.in	2020-12-28 19:28:44.925240000 +0900
@@ -82,6 +82,18 @@
 	help
 	  _ssl module for Python3 (required for https in urllib etc).
 
+config BR2_PACKAGE_PYTHON3_TKINTER
+	depends on BR2_PACKAGE_XORG7
+	depends on BR2_PACKAGE_TCL
+	select BR2_PACKAGE_TK
+	bool "tkinter"
+	help
+	  Tkinter module for Python3.
+
+comment "tkinter needs a X server and tcl"
+	depends on !BR2_PACKAGE_XORG7
+	depends on !BR2_PACKAGE_TCL
+
 config BR2_PACKAGE_PYTHON3_UNICODEDATA
 	bool "unicodedata module"
 	default y
--- python3.mk	2020-12-28 19:29:41.261031000 +0900
+++ python3.mk	2020-12-28 19:30:25.632867000 +0900
@@ -124,6 +124,12 @@
 PYTHON3_CONF_OPTS += --disable-ossaudiodev
 endif
 
+ifeq ($(BR2_PACKAGE_PYTHON3_TKINTER),y)
+PYTHON_DEPENDENCIES += tk
+else
+PYTHON_CONF_OPTS += --disable-tk
+endif
+
 # Make python believe we don't have 'hg', so that it doesn't try to
 # communicate over the network during the build.
 PYTHON3_CONF_ENV += \
@@ -157,7 +163,6 @@
 	--disable-pydoc \
 	--disable-test-modules \
 	--disable-lib2to3 \
-	--disable-tk \
 	--disable-nis \
 	--disable-idle3 \
 	--disable-pyc-build

これで、menuconfigに

BR2_PACKAGE_PYTHON3_TKINTER
が表示される

buildrootのconfig.inやmkファイルにパッチをあてる方法がよくわからない。
なので、手動でパッチをあてた。

#!/bin/bash


apply(){
    patch ../../../package/python3/Config.in < 0001-add-tkinter-support-to-python3_Config.in.patch 
    patch ../../../package/python3/python3.mk < 0002-add-tkinter-support-to-python3_python3.mk.patch
}

redo(){
    patch -R ../../../package/python3/Config.in < 0001-add-tkinter-support-to-python3_Config.in.patch 
    patch -R ../../../package/python3/python3.mk < 0002-add-tkinter-support-to-python3_python3.mk.patch
}

echo "----------------------------------------"
echo " add tkinter support to python3."
echo "----------------------------------------"
case "$1" in
    apply|redo)
		"$1";;
    *)
		echo "Usage: $0 {apply|redo}"
		exit 1
esac

2021年3月15日月曜日

Lichee Pi Zeroのソフト開発環境構築5

SWupdateを使ってみる(整理2)

結局まだ試行錯誤になっているが、段々と形になってきた。気がする。

ルートパーティションの拡張

ルートパーティションの拡張を、raspiなどを参考にして、初回起動時にいい感じに実施するようにしたい。
https://github.com/Squonk42/buildroot-licheepi-zero-old/wiki/Fresh-image-–-Expand-the-root-partition-and-filesystem
http://nahitafu.cocolog-nifty.com/nahitafu/2019/08/post-2df6c8.html

cat S01resize2fs_once
#!/bin/sh

function get_current_root_device
{
	for i in `cat /proc/cmdline`; do
		if [ ${i:0:5} = "root=" ]; then
			CURRENT_ROOT="${i:5}"
            # /dev/mmcblk0p3
		fi
	done
}

case "$1" in
    start)
        echo "Starting resize2fs_once"
        get_current_root_device
        resize2fs $CURRENT_ROOT &&
        rm /etc/init.d/S01resize2fs_once
        ;;
    *)
        echo "Usage: $0 start" >&2
        exit 3
        ;;
esac

これをex_licheepizerodock/board/rootfs-overlay/etc/init.d/に保存した

usb0のネットワークインターフェースを起動時に有効にする

起動時に固定IPでusb0を有効にしておきたい

cat interfaces
auto lo
iface lo inet loopback

auto usb0
iface usb0 inet static
    address 192.168.100.1
    netmask 255.255.255.0

これをex_licheepizerodock/board/rootfs-overlay/etc/network/に保存した

dhcpサーバーを有効にする

どうしようか悩んだけど、usb刺すたびにPC側でIPアドレスの設定をするのも大変だし
なぜか、毎回違うインターフェースとして認識されるみたいだし。
MACアドレスが毎回ランダムで生成されているみたいだからか。。
このあたりは、まだ興味の対象外なので、hdcpサーバーを入れてしまって楽をしようと思う。

BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
BR2_PACKAGE_DHCP
BR2_PACKAGE_DHCP_SERVER

また、設定ファイルとして

cat dhcpd.conf
option subnet-mask 255.255.255.0;
option routers 192.168.100.1;
subnet 192.168.100.0 netmask 255.255.255.0 {
    range 192.168.100.10 192.168.100.250;
}

をex_licheepizerodock/board/rootfs-overlay/etc/dhcp/に保存した

これで、PCとusbつなぐとネットワークが有効化されるようになった

$ ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.246 ms

avahi

まだ、ちゃんと試していないけど、avahiを入れると、host名でアクセスできたり
はたまた、dhcpサーバー建てなくてもローカルリンクアドレスで通信できるようになるみたい。

avahi
IPv4LL network address configuration daemon
mDNS/DNS-SD daemon
libdns_sd compatibility (Bonjour)

IPv4LLがローカルリンクアドレス
mDNSが「host名.local」でのアクセスを可能にする
うーん。どうしようかな。
今は、こういう仕組みがあるという理解だけしておこう。

swupdateのwebサーバーを自動起動させる

init.dにスタートアップはすでにあったので、それを参考に修正する。

/etc/init.d/S80swupdate

にて

/usr/lib/swupdate/swupdate.sh

が呼び出されて、その中で

/etc/swupdate/conf.d and /usr/lib/swupdate/conf.d/

内のファイルを読み込んでいる
なので、/etc/swupdate/conf.d/swupdate.confみたいなファイルを用意しておく

mkdir /swutmp
export TMPDIR=/swutmp
SWUPDATE_ARGS="-p 'reboot'"
SWUPDATE_WEBSERVER_ARGS="--document-root /var/www/swupdate"

これで、起動時からswupdateのwebサービスが動いている
もしも、自動起動させたくないときは、S80swupdateを削除or空ファイルで上書いてしまおうかな。

2021年1月4日月曜日

Lichee Pi Zeroのソフト開発環境構築4

SWupdateを使ってみる(整理)

いろいろ手探りだったので、まとまりがなくなってしまった。
まとめると

パーティションの準備

まずはrootfsを2つ用意する。いわゆる2面持ちをやってみる。
genimage.cfgを修正して、u-boot領域の拡張と、rootfs1、rootfs2を準備した。

#genimage.cfg
image boot.vfat {
	vfat {
		files = {
			"zImage",
			"sun8i-v3s-licheepi-zero-dock-with-lcd.dtb",
			"boot.scr"
		}
	}
	size = 8M
}

image sdcard.img {
	hdimage {
	}

	partition u-boot {
		in-partition-table = "no"
		image = "u-boot-sunxi-with-spl.bin"
		offset = 8192
        size = 679936 #664K 32KB(SPL) + 504KB(Uboot) + Env(128KB)
        #size = 516096 # 512KB - 8192
	}

	partition boot {
		partition-type = 0xC
		bootable = "true"
		image = "boot.vfat"
	}

	partition rootfs1 {
		partition-type = 0x83
		image = "rootfs.ext2"
		size = 200M
	}
	partition rootfs2 {
		partition-type = 0x83
		size = 200M
	}
}

カーネルコンフィング

BR2_PACKAGE_LIBUBOOTENV=y
BR2_PACKAGE_UBOOT_TOOLS=y
BR2_PACKAGE_SWUPDATE=y
BR2_PACKAGE_SWUPDATE_CONFIG="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/package/swupdate/swupdate.config"
BR2_TARGET_ROOTFS_EXT2_GZIP=y

swupdateの設定は、上記の通り別ファイルに書き出している

swupdate.config

デフォルトからの変更点は

CONFIG_UBOOT=y
CONFIG_UBOOT_FWENV="/etc/fw_env.config"
CONFIG_UBOOT_DEFAULTENV="/etc/u-boot-initial-env"
CONFIG_GUNZIP=y
CONFIG_SHELLSCRIPTHANDLER=y

fw_setenvの準備

linux側からu-boot環境変数の参照と書き換えをするために、/etc/fw_env.configを用意する。

cat ex_licheepizerodock/board/rootfs-overlay/etc/fw_env.config
# device name   Device offset   Env. size
/dev/mmcblk0    0x88000 0x20000

boot.scrの変更

u-boot起動時に、rootfsを切り替えれるように、boot.cmdを変更する

echo -------------------- checking rootfspart ----------
if printenv rootfspart; 
    then echo rootfspart found; 
    else echo rootfspart not found; setenv rootfspart 2; setenv modify_save 1; 
fi

setenv bootargs console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p${rootfspart} earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock-with-lcd.dtb

# echo -------------------- printenv --------------------
# printenv
# echo wait 10 sec ...
# sleep 10

echo -------------------- checking modify_save flag -------------------- 
if printenv modify_save; 
    then; 
        if test "${modify_save}" = "1"; 
            then echo modify_save is on.; setenv modify_save 0; saveenv; 
            else echo modify_save is off.;
        fi; 
    else echo modify_save is not found.; 
fi

bootz 0x41000000 - 0x41800000

sw-descriptionの作成

アップデート前後にシェルスクリプトを実行できることがわかったので
書き換え対象のパーティションを自動で切り替えるようにする
http://www.variwiki.com/index.php?title=SWUpdate_Guide
https://sbabic.github.io/swupdate/sw-description.html#scripts
https://translate.google.com/translate?sl=auto&tl=ja&u=https://groups.google.com/g/swupdate/c/26vZgqWNuKY

ただし、「installed-directly = true;」にしていると、プレスクリプトよりも先にファームアップ処理が実施されてしまう仕様みたい。
この一行を削除する。

software =
{
    version = "0.0.2";

        hardware-compatibility: [ "1.0" ];

        images: (
            {
                filename = "rootfs.ext2.gz";
                compressed = "zlib";
                //installed-directly = true;
                device = "/dev/swupdate_rootfs_target";
            }
        );
	    scripts: (
		    {
			    filename = "toggle_partition.sh";
			    type = "shellscript";
		    }
	    );
}

で、スクリプトは

#! /bin/sh

INIT_ACTIVE_PARTITION_NO=2
INIT_STANDBY_PARTITION_NO=3
TARGET_DEVICE_NAME=/dev/swupdate_rootfs_target

echo "======================================"
echo " toggle_partition                     "
echo "======================================"

if [ $# -lt 1 ]; then
    exit 0;
fi


function get_current_root_device
{
	for i in `cat /proc/cmdline`; do
		if [ ${i:0:5} = "root=" ]; then
			CURRENT_ROOT="${i:5}"
            # /dev/mmcblk0p3
		fi
	done
}

function get_update_partition
{
	CURRENT_PARTITION="${CURRENT_ROOT: -1}"
    echo Current Partition is $CURRENT_PARTITION
    UPDATE_PARTITION="$INIT_STANDBY_PARTITION_NO"
	if [ $CURRENT_PARTITION = "$INIT_ACTIVE_PARTITION_NO" ]; then
		UPDATE_PARTITION="$INIT_STANDBY_PARTITION_NO"
	else
		UPDATE_PARTITION="$INIT_ACTIVE_PARTITION_NO"
	fi

    UPDATE_DEVICE_NAME=${CURRENT_ROOT%p?}p$UPDATE_PARTITION
}

function create_symbolic_link
{
    echo Create Symbolic link
    if [ -L $TARGET_DEVICE_NAME ]; then
        echo symbolic link is already exist.
        rm -f $TARGET_DEVICE_NAME
    fi
    ln -s $UPDATE_DEVICE_NAME $TARGET_DEVICE_NAME
    ls -l $TARGET_DEVICE_NAME
}

function delete_symbolic_link
{
    echo Delete Symbolic link
    if [ -L $TARGET_DEVICE_NAME ]; then
        rm -f $TARGET_DEVICE_NAME
    fi
}

function change_active_rootfs_partition
{
    fw_setenv rootfspart $UPDATE_PARTITION
}

get_current_root_device
echo Current ROOT divece is $CURRENT_ROOT
get_update_partition

if [ $1 == "preinst" ]; then
    echo "run pre install script."

    echo SW Update Target Partition is $UPDATE_PARTITION
    echo SW Update Target Device is $UPDATE_DEVICE_NAME
    
    create_symbolic_link
fi

if [ $1 == "postinst" ]; then
    echo "run post install script."

    delete_symbolic_link
    echo "change rootfs partition($CURRENT_PARTITION -> $UPDATE_PARTITION)"
    change_active_rootfs_partition
    echo Partition to be active on reboot is $UPDATE_PARTITION
    
fi

これで、準備ができた。

swuアーカイブを作成する

make後にswuを作成する。

#!/bin/bash

TARGET_DIR=../output/images/
cp sw-description ${TARGET_DIR}
cp toggle_partition.sh ${TARGET_DIR}
cd ${TARGET_DIR}

CONTAINER_VER="1.0.0"
PRODUCT_NAME="my-software"
FILES="sw-description toggle_partition.sh rootfs.ext2.gz"

for i in $FILES;do 
    echo $i;done | cpio -ov -H crc > ${PRODUCT_NAME}_${CONTAINER_VER}.swu

これで、imagesディレクトリにswuファイルが作成される。

アップデートを実行する

# swupdate -v -i /mnt/my-software_1.0.0.swu 
Swupdate v2020.04.0

Licensed under GPLv2. See source distribution for detailed copyright notices.

Registered handlers:
	dummy
	raw
	rawfile
	rawcopy
	shellscript
	preinstall
	postinstall
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running :  [network_initializer] : Main loop Daemon
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/sockinstctrl
[TRACE] : SWUPDATE running :  [extract_sw_description] : Found file:
	filename sw-description
	size 432
	checksum 0x6d0c VERIFIED
[TRACE] : SWUPDATE running :  [get_common_fields] : Version 0.0.2
[TRACE] : SWUPDATE running :  [parse_images] : Found compressed Image: rootfs.ext2.gz in device : /dev/swupdate_rootfs_target for handler raw (installed from stream)
[TRACE] : SWUPDATE running :  [parse_scripts] : Found Script: toggle_partition.sh
[TRACE] : SWUPDATE running :  [cpio_scan] : Found file:
	filename toggle_partition.sh
	size 1947
	REQUIRED
[TRACE] : SWUPDATE running :  [cpio_scan] : Found file:
	filename rootfs.ext2.gz
	size 29271755
	REQUIRED
[DEBUG] : SWUPDATE running :  [preupdatecmd] : Running Pre-update command
[TRACE] : SWUPDATE running :  [extract_next_file] : Copied file:
	filename toggle_partition.sh
	size 1947
	checksum 0x24691 VERIFIED
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] :  toggle_partition                     
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current ROOT divece is /dev/mmcblk0p3
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current Partition is 3
[TRACE] : SWUPDATE running :  [run_system_cmd] : run pre install script.
[TRACE] : SWUPDATE running :  [run_system_cmd] : SW Update Target Partition is 2
[TRACE] : SWUPDATE running :  [run_system_cmd] : SW Update Target Device is /dev/mmcblk0p2
[TRACE] : SWUPDATE running :  [run_system_cmd] : Create Symbolic link
[TRACE] : SWUPDATE running :  [run_system_cmd] : lrwxrwxrwx    1 root     root            14 Jan  6 09:33 /dev/swupdate_rootfs_target -> /dev/mmcblk0p2
[TRACE] : SWUPDATE running :  [run_system_cmd] : /tmp/scripts/toggle_partition.sh preinst  command returned 0
[TRACE] : SWUPDATE running :  [install_single_image] : Found installer for stream rootfs.ext2.gz raw
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] :  toggle_partition                     
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current ROOT divece is /dev/mmcblk0p3
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current Partition is 3
[TRACE] : SWUPDATE running :  [run_system_cmd] : run post install script.
[TRACE] : SWUPDATE running :  [run_system_cmd] : Delete Symbolic link
[TRACE] : SWUPDATE running :  [run_system_cmd] : change rootfs partition(3 -> 2)
[TRACE] : SWUPDATE running :  [run_system_cmd] : Partition to be active on reboot is 2
[TRACE] : SWUPDATE running :  [run_system_cmd] : /tmp/scripts/toggle_partition.sh postinst  command returned 0
Software updated successfully
Please reboot the device to start the new software
[INFO ] : SWUPDATE successful ! 
[DEBUG] : SWUPDATE running :  [postupdate] : Running Post-update command

できたできた!

webUIからアクセス

調子に乗って、WebUIからやってみる。

ifconfig usb0 192.168.100.1
swupdate -v -w "--document-root /var/www/swupdate"


 

しかし、容量不足で失敗Orz

[INFO ] : SWUPDATE started :  Software Update started !
[TRACE] : SWUPDATE running :  [extract_file_to_tmp] : Found file:
	filename sw-description
	size 389
[TRACE] : SWUPDATE running :  [get_common_fields] : Version 0.0.2
[TRACE] : SWUPDATE running :  [parse_images] : Found compressed Image: rootfs.ext2.gz in device : /dev/swupdate_rootfs_target for handler raw
[TRACE] : SWUPDATE running :  [parse_scripts] : Found Script: toggle_partition.sh
[DEBUG] : SWUPDATE running :  [preupdatecmd] : Running Pre-update command
[TRACE] : SWUPDATE running :  [extract_files] : Found file:
	filename toggle_partition.sh
	size 1947 required
[TRACE] : SWUPDATE running :  [extract_files] : Found file:
	filename rootfs.ext2.gz
	size 31060334 required
[  513.054095] swupdate invoked oom-killer: gfp_mask=0x14201ca(GFP_HIGHUSER_MOVABLE|__GFP_COLD), nodemask=(null),  order=0, oom_score_adj=0
[  513.066533] CPU: 0 PID: 184 Comm: swupdate Not tainted 4.14.14-licheepi-zero #1
[  513.073837] Hardware name: Allwinner sun8i Family
[  513.078575] [<c010e894>] (unwind_backtrace) from [<c010b548>] (show_stack+0x10/0x14)
[  513.086318] [<c010b548>] (show_stack) from [<c0673428>] (dump_stack+0x88/0x9c)
[  513.093542] [<c0673428>] (dump_stack) from [<c01b1288>] (dump_header.constprop.4+0x94/0x1b8)
[  513.101976] [<c01b1288>] (dump_header.constprop.4) from [<c01b0970>] (oom_kill_process+0x2fc/0x508)
[  513.111013] [<c01b0970>] (oom_kill_process) from [<c01b0e70>] (out_of_memory+0xfc/0x434)
[  513.119097] [<c01b0e70>] (out_of_memory) from [<c01b5430>] (__alloc_pages_nodemask+0x9bc/0xd90)
[  513.127787] [<c01b5430>] (__alloc_pages_nodemask) from [<c01ae318>] (filemap_fault+0x308/0x5dc)
[  513.136480] [<c01ae318>] (filemap_fault) from [<c0284f94>] (ext4_filemap_fault+0x28/0x3c)
[  513.144656] [<c0284f94>] (ext4_filemap_fault) from [<c01d30e0>] (__do_fault+0x18/0x68)
[  513.152568] [<c01d30e0>] (__do_fault) from [<c01d6fbc>] (handle_mm_fault+0x414/0x964)
[  513.160396] [<c01d6fbc>] (handle_mm_fault) from [<c011295c>] (do_page_fault+0x12c/0x36c)
[  513.168481] [<c011295c>] (do_page_fault) from [<c0101370>] (do_PrefetchAbort+0x38/0xa0)
[  513.176478] [<c0101370>] (do_PrefetchAbort) from [<c010c688>] (ret_from_exception+0x0/0x18)
[  513.184815] Exception stack(0xc31adfb0 to 0xc31adff8)
[  513.189862] dfa0:                                     000005b4 00000002 00000000 017b8d3e
[  513.198030] dfc0: b66445ca 00002d0e 000012f2 00000009 b6643278 00000000 b664b344 00000050
[  513.206197] dfe0: 00000000 b6642a18 00014e70 00014e70 00030010 ffffffff
[  513.212882] Mem-Info:
[  513.215175] active_anon:4942 inactive_anon:6094 isolated_anon:0
[  513.215175]  active_file:23 inactive_file:30 isolated_file:0
[  513.215175]  unevictable:0 dirty:0 writeback:0 unstable:0
[  513.215175]  slab_reclaimable:372 slab_unreclaimable:1169
[  513.215175]  mapped:16 shmem:6114 pagetables:84 bounce:0
[  513.215175]  free:231 free_pcp:17 free_cma:0
[  513.247045] Node 0 active_anon:19768kB inactive_anon:24376kB active_file:92kB inactive_file:120kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:64kB dirty:0kB writeback:0kB shmem:24456kB writeback_tmp:0kB unstable:0kB all_unreclaimable? no
[  513.269541] Normal free:924kB min:924kB low:1152kB high:1380kB active_anon:19768kB inactive_anon:24376kB active_file:92kB inactive_file:120kB unevictable:0kB writepending:0kB present:64036kB managed:54536kB mlocked:0kB kernel_stack:464kB pagetables:336kB bounce:0kB free_pcp:68kB local_pcp:68kB free_cma:0kB
[  513.296613] lowmem_reserve[]: 0 0 0
[  513.300103] Normal: 35*4kB (UME) 24*8kB (UE) 13*16kB (UM) 0*32kB 4*64kB (U) 1*128kB (M) 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 924kB
[  513.312558] 6169 total pagecache pages
[  513.316311] 0 pages in swap cache
[  513.319622] Swap cache stats: add 0, delete 0, find 0/0
[  513.324837] Free swap  = 0kB
[  513.327722] Total swap = 0kB
[  513.330597] 16009 pages RAM
[  513.333386] 0 pages HighMem/MovableOnly
[  513.337224] 2375 pages reserved
[  513.340361] [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name
[  513.348898] [   76]     0    76      547        9       5       0        0             0 syslogd
[  513.357685] [   80]     0    80      547        9       4       0        0             0 klogd
[  513.366296] [   91]     0    91     2614       97       6       0        0         -1000 udevd
[  513.374898] [  126]     0   126     5645     1089      10       0        0             0 Xorg
[  513.383424] [  133]     0   133     9203       15       9       0        0             0 swupdate
[  513.392295] [  135]     0   135      547       19       4       0        0             0 startx
[  513.400992] [  136]     0   136      577       22       3       0        0             0 sh
[  513.409342] [  165]     0   165      712       17       4       0        0             0 xinit
[  513.417954] [  166]     0   166     5936     1400      12       0        0             0 X
[  513.426216] [  169]     0   169     3486     2062      10       0        0             0 feh
[  513.434644] [  181]     0   181     9203       36       9       0        0             0 swupdate
[  513.443517] [  183]     0   183     4593       46       5       0        0             0 swupdate
[  513.452389] Out of memory: Kill process 169 (feh) score 147 or sacrifice child
[  513.459637] Killed process 169 (feh) total-vm:13944kB, anon-rss:8240kB, file-rss:8kB, shmem-rss:0kB
[ERROR] : SWUPDATE failed [0] ERROR core/cpio_utils.c : copy_write : 131 : cannot write 16384 bytes: No space left on device
[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...

ならば、容量不足の解消だ

ルートパーティションの拡張

今、ルートパーティションは200Mの領域を確保しているけど、実際には60Mとなっている。
まずは、これを拡張しようと思う。
https://github.com/Squonk42/buildroot-licheepi-zero-old/wiki/Fresh-image-–-Expand-the-root-partition-and-filesystem
http://nahitafu.cocolog-nifty.com/nahitafu/2019/08/post-2df6c8.html

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                54.1M     52.1M         0 100% /
devtmpfs                 26.1M         0     26.1M   0% /dev
tmpfs                    26.6M         0     26.6M   0% /dev/shm
tmpfs                    26.6M     56.0K     26.6M   0% /tmp
tmpfs                    26.6M    104.0K     26.5M   0% /run

# fdisk -l
Disk /dev/mmcblk0: 3796 MB, 3980394496 bytes, 7774208 sectors
121472 cylinders, 4 heads, 16 sectors/track
Units: sectors of 1 * 512 = 512 bytes

Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type
/dev/mmcblk0p1 *  0,21,22     1,26,25           1344      17727      16384 8192K  c Win95 FAT32 (LBA)
/dev/mmcblk0p2    1,26,26     26,152,62        17728     427327     409600  200M 83 Linux
/dev/mmcblk0p3    26,152,63   52,24,36        427328     836927     409600  200M 83 Linux
Disk /dev/mmcblk1: 3807 MB, 3991928832 bytes, 7796736 sectors
2087 cylinders, 83 heads, 45 sectors/track
Units: sectors of 1 * 512 = 512 bytes

resize2fsの有効化

BR2_PACKAGE_E2FSPROGS_RESIZE2FS [=y]

まずは手動で

# resize2fs /dev/mmcblk0p2 
resize2fs 1.45.6 (20-Mar-2020)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing r[   46.549755] EXT4-fs (mmcblk0p2): resizing filesystem from 61440 to 204800 blocks
equired
old_desc_blocks = 1, new_desc_blocks = 1
[   46.640496] EXT4-fs (mmcblk0p2): resized filesystem to 204800
The filesystem on /dev/mmcblk0p2 is now 204800 (1k) blocks long.

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               190.1M     52.4M    128.1M  29% /
devtmpfs                 26.1M         0     26.1M   0% /dev
tmpfs                    26.6M         0     26.6M   0% /dev/shm
tmpfs                    26.6M     56.0K     26.6M   0% /tmp
tmpfs                    26.6M    104.0K     26.5M   0% /run

よし!

手動でスワップ領域を作成

現状

# free -m
              total        used        free      shared  buff/cache   available
Mem:             53          28           2           0          22          23
Swap:             0           0           0

作成

# dd if=/dev/zero of=/swap bs=1M count=128
128+0 records in
128+0 records out
# mkswap /swap 
Setting up swapspace version 1, size = 104853504 bytes
# chmod 0600 /swap
# swapon /swap
[   95.710423] Adding 131052k swap on /swap.  Priority:-2 extents:4 across:143352k SS
# free -m
              total        used        free      shared  buff/cache   available
Mem:             53          28           3           0          21          23
Swap:           127           0         127

再挑戦

[INFO ] : SWUPDATE started :  Software Update started !
[TRACE] : SWUPDATE running :  [extract_file_to_tmp] : Found file:
	filename sw-description
	size 389
[TRACE] : SWUPDATE running :  [get_common_fields] : Version 0.0.2
[TRACE] : SWUPDATE running :  [parse_images] : Found compressed Image: rootfs.ext2.gz in device : /dev/swupdate_rootfs_target for handler raw
[TRACE] : SWUPDATE running :  [parse_scripts] : Found Script: toggle_partition.sh
[DEBUG] : SWUPDATE running :  [preupdatecmd] : Running Pre-update command
[TRACE] : SWUPDATE running :  [extract_files] : Found file:
	filename toggle_partition.sh
	size 1947 required
[TRACE] : SWUPDATE running :  [extract_files] : Found file:
	filename rootfs.ext2.gz
	size 31060334 required
[ERROR] : SWUPDATE failed [0] ERROR core/cpio_utils.c : copy_write : 131 : cannot write 16384 bytes: No space left on device
[ERROR] : SWUPDATE failed [1] Image invalid or corrupted. Not installing ...

容量不足はメモリじゃなくて、作業領域のほうか・・・勘違い。

SWupdateが使用するテンポラリ領域

ちゃんと、ドキュメント読もう。 と後悔。
https://sbabic.github.io/swupdate/swupdate.html#streaming-feature

TMPDIRに指定すればいいみたい。

export TMPDIR=/swutmp

再挑戦

[INFO ] : SWUPDATE started :  Software Update started !
[TRACE] : SWUPDATE running :  [extract_file_to_tmp] : Found file:
	filename sw-description
	size 389
[TRACE] : SWUPDATE running :  [get_common_fields] : Version 0.0.2
[TRACE] : SWUPDATE running :  [parse_images] : Found compressed Image: rootfs.ext2.gz in device : /dev/swupdate_rootfs_target for handler raw
[TRACE] : SWUPDATE running :  [parse_scripts] : Found Script: toggle_partition.sh
[DEBUG] : SWUPDATE running :  [preupdatecmd] : Running Pre-update command
[TRACE] : SWUPDATE running :  [extract_files] : Found file:
	filename toggle_partition.sh
	size 1947 required
[TRACE] : SWUPDATE running :  [extract_files] : Found file:
	filename rootfs.ext2.gz
	size 31060334 required
[TRACE] : SWUPDATE running :  [extract_padding] : Expecting 20 padding bytes at end-of-file
[TRACE] : SWUPDATE running :  [network_initializer] : Valid image found: copying to FLASH
[INFO ] : SWUPDATE running :  Installation in progress
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] :  toggle_partition                     
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current ROOT divece is /dev/mmcblk0p2
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current Partition is 2
[TRACE] : SWUPDATE running :  [run_system_cmd] : run pre install script.
[TRACE] : SWUPDATE running :  [run_system_cmd] : SW Update Target Partition is 3
[TRACE] : SWUPDATE running :  [run_system_cmd] : SW Update Target Device is /dev/mmcblk0p3
[TRACE] : SWUPDATE running :  [run_system_cmd] : Create Symbolic link
[TRACE] : SWUPDATE running :  [run_system_cmd] : lrwxrwxrwx    1 root     root            14 Jan 10 13:21 /dev/swupdate_rootfs_target -> /dev/mmcblk0p3
[TRACE] : SWUPDATE running :  [run_system_cmd] : /swutmp/scripts/toggle_partition.sh preinst  command returned 0
[TRACE] : SWUPDATE running :  [install_single_image] : Found installer for stream rootfs.ext2.gz raw
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] :  toggle_partition                     
[TRACE] : SWUPDATE running :  [run_system_cmd] : ======================================
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current ROOT divece is /dev/mmcblk0p2
[TRACE] : SWUPDATE running :  [run_system_cmd] : Current Partition is 2
[TRACE] : SWUPDATE running :  [run_system_cmd] : run post install script.
[TRACE] : SWUPDATE running :  [run_system_cmd] : Delete Symbolic link
[TRACE] : SWUPDATE running :  [run_system_cmd] : change rootfs partition(2 -> 3)
[TRACE] : SWUPDATE running :  [run_system_cmd] : Partition to be active on reboot is 3
[TRACE] : SWUPDATE running :  [run_system_cmd] : /swutmp/scripts/toggle_partition.sh postinst  command returned 0
[INFO ] : SWUPDATE successful ! SWUPDATE successful !

ということで、swapは不要だった。テンポラリ領域の変更だけで済んだ。

2020年12月13日日曜日

Lichee Pi Zeroのソフト開発環境構築3

br2-external を使ってカスタマイズファイルを分離する

Buildrootの設定とか、オレオレでやっていたのだけど、そろそろお作法に習ってやらないとあとでわからなくなりそうとおもった。

https://www.slideshare.net/linuxlab_conf/angelo-compagnucci-upgrading-buildroot-based-devices-with-swupdate
https://qiita.com/pu_ri/items/8cdef8f7bb79a2ea0863
https://titanwolf.org/Network/Articles/Article?AID=dee8991f-d9d6-4a55-86ec-a4d3598c4ba0#gsc.tab=0
https://buildroot.org/downloads/manual/manual.html

ファイル構成

上記の説明にならって以下のようにした。

ex_licheepizerodock$ tree
.
├── Config.in
├── board
│   ├── boot.cmd
│   ├── dts
│   │   └── sun8i-v3s-licheepi-zero-dock-with-lcd.dts
│   ├── genimage.cfg
│   └── rootfs-overlay
│       ├── etc
│       │   └── init.d
│       │       └── S99photoframe.app
│       ├── root
│       │   └── photo
│       │       ├── chihiro001.jpg
<略>
│       │       └── chihiro050.jpg
│       └── usr
│           └── share
│               └── X11
│                   └── xorg.conf.d
│                       └── 15-monitor.conf
├── configs
│   ├── licheepi_zero_custom_x_touch_backlight_ext_defconfig
│   └── licheepi_zero_custom_x_touch_defconfig
├── external.desc
└── external.mk

external.desc

あまり何も考えずに以下の感じで

name: LICHEEPI_ZERO_DOCK_EX
desc: LicheePi Zero Dock external tree.

br2-externalの有効化

make list-defconfigs BR2_EXTERNAL=./ex_licheepizerodock
make menuconfig

defconfigファイルの保存

make manuconfig
Location to save buildroot config
BR2_DEFCONFIG='$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/configs/licheepi_zero_custom_x_touch_backlight_ext_defconfig'

rootfs-overlay

BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/rootfs-overlay"

boot.cmd

BR2_TARGET_UBOOT_BOOT_SCRIPT_SOURCE="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/boot.cmd"

genimage.cfg

BR2_ROOTFS_POST_SCRIPT_ARGS="-c $(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/genimage.cfg"

kernelの方のdtsファイル

BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/dts/sun8i-v3s-licheepi-zero-dock-with-lcd.dts"

再構築

makeして、生成できていたらdefconfigを保存しておく

make
make savedefconfig

一度make cleanしてから、再生成してみる

make clean
make list-defconfigs BR2_EXTERNAL=./ex_licheepizerodock
make licheepi_zero_custom_x_touch_backlight_ext_defconfig
make

これで、buildrootのツリーを汚さずに済んだ!

SWupdateを使ってみる(試行錯誤)

ソフト書き換えのたびにSDカードの挿抜がやっぱり面倒になってきたので、
何か良い方法が無いか、バージョンアップのしくみを探していたら
buildrootのパッケージでswupdateというものがあった。

https://sbabic.github.io/swupdate/index.html
https://afterhourscoding.wordpress.com/2020/07/26/integrating-swupdate-with-u-boot/
https://bootlin.com/blog/tag/swupdate/
https://boundarydevices.com/using-swupdate-upgrade-system/

パーティションの準備

まずはrootfsを2つ用意する。いわゆる2面持ちをやってみる。
genimage.cfgを修正して、u-boot領域の拡張と、rootfs1、rootfs2を準備した。

#genimage.cfg
image boot.vfat {
	vfat {
		files = {
			"zImage",
			"sun8i-v3s-licheepi-zero-dock-with-lcd.dtb",
			"boot.scr"
		}
	}
	size = 8M
}

image sdcard.img {
	hdimage {
	}

	partition u-boot {
		in-partition-table = "no"
		image = "u-boot-sunxi-with-spl.bin"
		offset = 8192
		# size = 516096 # 512KB - 8192
        size = 679936 # 664K 32KB(SPL) + 504KB(Uboot) + Env(128KB)
	}

	partition boot {
		partition-type = 0xC
		bootable = "true"
		image = "boot.vfat"
	}

	partition rootfs1 {
		partition-type = 0x83
		image = "rootfs.ext4"
		size = 200M
	}
	partition rootfs2 {
		partition-type = 0x83
		size = 200M
	}
}

これで、以下のようになったはず。

No 開始 サイズ 用途
0 0 8K 未使用のはず
1 8K 664K 32KB(SPL) + 504KB(Uboot) + Env(128KB)
2 672K 8M boot
3 - 200M rootfs1
4 - 200M rootfs2

未使用のはず:https://linux-sunxi.org/Bootable_SD_card#SD_Card_Layout

fw_setenv

linux側からu-boot環境変数の参照と書き換えをしたい。
fw_setenvとfw_printenvというのがあるらしい。

BR2_PACKAGE_UBOOT_TOOLS=y

を有効にしてmakeする

fw_setenv test 1
Cannot parse config file '/etc/fw_env.config': No such file or directory
Error: environment not initialized

/etc/fw_env.configが必要みたいなので、用意する。

cat /etc/fw_env.config
# device name   Device offset   Env. size
/dev/mmcblk0    0x88000 0x20000

記載内容は、デバイス名、開始アドレス、範囲というもので
dl/uboot/git/include/configs に対応させるみたい。
さっきのパーティションとも一致しているね(8k+32k+504k=554k)

#define CONFIG_ENV_OFFSET (544 << 10) /* (8 + 24 + 512) KiB /
#define CONFIG_ENV_SIZE (128 << 10) /
128 KiB */

これで、再度fw_setenvを実行してみる。

# fw_setenv test 1
Warning: Bad CRC, using default environment
# fw_printenv
bootcmd=bootp; setenv bootargs root=/dev/nfs nfsroot=${serverip}:${rootpath} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}::off; bootm
bootdelay=5
baudrate=115200
test=1

boot.scrを手動で作る

u-boot起動時に、rootfsを切り替えれるようにboot.scrを変更したい。
boot.scrだけちょいと変更できるようにしたい。
mkimageが欲しいので、u-boot-toolsをインストール

https://afterhourscoding.wordpress.com/2020/07/26/integrating-swupdate-with-u-boot/
を参考に、boot.cmdを変更する

echo -------------------- checking rootfspart ----------
if printenv rootfspart; 
    then echo rootfspart found; 
    else echo rootfspart not found; setenv rootfspart 2; setenv modify_save 1; 
fi

setenv bootargs console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p${rootfspart} earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock-with-lcd.dtb

# echo -------------------- printenv --------------------
# printenv
# echo wait 10 sec ...
# sleep 10

echo -------------------- checking modify_save flag -------------------- 
if printenv modify_save; 
    then; 
        if test "${modify_save}" = "1"; 
            then echo modify_save is on.; setenv modify_save 0; saveenv; 
            else echo modify_save is off.;
        fi; 
    else echo modify_save is not found.; 
fi

bootz 0x41000000 - 0x41800000

保存先のディレクトリにて

cd ex_licheepizerodock/board
mkimage -A arm -O linux -T script -C none -n "U-Boot script" -d boot.cmd boot.scr

生成されたboot.scrをoutput/imageにコピーしてmakeする

これで、rootfspartをfw_setenv変更することで、rootfsの場所を変更することができるようになった。

sw-descriptionの準備

rootfsのフォーマット変更

sw-descriptionのサンプルに合わせて、ファイルをgzで圧縮する

BR2_TARGET_ROOTFS_EXT2_GZIP=y

genimage.cfgの修正

(省略)
	partition rootfs1 {
		partition-type = 0x83
		image = "rootfs.ext2"
		size = 200M
	}
(省略)

sw-descriptionの作成

software =
{
    version = "2.3.0";

    mylinuxboard = {
        hardware-compatibility: [ "1.0" ];
        rootfs1: {
            images: (
                {
                    filename = "rootfs.ext2.gz";
                    compressed = "zlib";
                    installed-directly = true;
                    device = "/dev/mmcblk0p2";
                }
            );
            bootenv: (
                {
                    name = "rootfspart";
                    value = "2";
                }
            );
        }
        rootfs2: {
            images: (
                {
                    filename = "rootfs.ext2.gz";
                    compressed = "zlib";
                    installed-directly = true;
                    device = "/dev/mmcblk0p3";
                }
            );
            bootenv: (
                {
                    name = "rootfspart";
                    value = "3";
                }
            );
        }
    }
}

swuアーカイブを作成する

今回は手動で、swuを作成する。今後はmake時に自動で実行するようにしたい

#!/bin/bash

TARGET_DIR=../output/images/
cp sw-description ${TARGET_DIR}
cd ${TARGET_DIR}

CONTAINER_VER="1.0.0"
PRODUCT_NAME="my-software"
FILES="sw-description rootfs.ext2.gz"

for i in $FILES;do 
    echo $i;done | cpio -ov -H crc > ${PRODUCT_NAME}_${CONTAINER_VER}.swu

これで、imagesディレクトリにswuファイルが作成される。

実行してみる

swupdate -v -e mylinuxboard,rootfs2 -i /mnt/my-software_1.0.0.swu 
Swupdate v2020.04.0

Licensed under GPLv2. See source distribution for detailed copyright notices.

Registered handlers:
	dummy
	raw
	rawfile
	rawcopy
software set: mylinuxboard mode: rootfs2
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running :  [network_initializer] : Main loop Daemon
[TRACE] : SWUPDATE running :  [extract_sw_description] : Found file:
	filename sw-description
	size 982
	checksum 0xd385 VERIFIED
[TRACE] : SWUPDATE running :  [get_common_fields] : Version 2.3.0
[TRACE] : SWUPDATE running :  [parse_images] : Found compressed Image: rootfs.ext2.gz in device : /dev/mmcblk0p3 for handler raw (installed from stream)
[TRACE] : SWUPDATE running :  [parse_bootloader] : Bootloader var: rootfspart = 3
[ERROR] : SWUPDATE failed [0] ERROR core/parser.c : parse : 282 : bootloader support absent but sw-description has bootloader section!
[ERROR] : SWUPDATE failed [0] ERROR core/swupdate.c : install_from_file : 335 : failed to parse sw-description!

make swupdate-menuconfig

にて

HAVE_LIBUBOOTENV
を有効化する

# swupdate -v -e mylinuxboard,rootfs2 -i /mnt/my-software_1.0.0.swu
Swupdate v2020.04.0

Licensed under GPLv2. See source distribution for detailed copyright notices.

Registered handlers:
	dummy
	uboot
	bootloader
	raw
	rawfile
	rawcopy
software set: mylinuxboard mode: rootfs2
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/swupdateprog
[TRACE] : SWUPDATE running :  [network_initializer] : Main loop Daemon
[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/sockinstctrl
[TRACE] : SWUPDATE running :  [extract_sw_description] : Found file:
	filename sw-description
	size 982
	checksum 0xd385 VERIFIED
[TRACE] : SWUPDATE running :  [get_common_fields] : Version 2.3.0
[TRACE] : SWUPDATE running :  [parse_images] : Found compressed Image: rootfs.ext2.gz in device : /dev/mmcblk0p3 for handler raw (installed from stream)
[TRACE] : SWUPDATE running :  [parse_bootloader] : Bootloader var: rootfspart = 3
[TRACE] : SWUPDATE running :  [cpio_scan] : Found file:
	filename rootfs.ext2.gz
	size 29270917
	REQUIRED
[DEBUG] : SWUPDATE running :  [preupdatecmd] : Running Pre-update command
[TRACE] : SWUPDATE running :  [install_single_image] : Found installer for stream rootfs.ext2.gz raw
Software updated successfully
Please reboot the device to start the new software
[INFO ] : SWUPDATE successful ! 
[DEBUG] : SWUPDATE running :  [postupdate] : Running Post-update command

念の為 fw_printenv rootfspart で確認するとrootfspart = 3となっていた。
再起動すると、p3にて起動した!やった。

swupdate-configの保存

このままだと、make cleanしたときに消えてしまうので
configを外部ツリーに移動させる

BR2_PACKAGE_SWUPDATE_CONFIG="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/package/swupdate/swupdate.config"

また、swupdateの設定変更をした後は

make swupdate-update-config
  cp -f output/build/swupdate-2020.04/.config ex_licheepizerodock/board/package/swupdate/swupdate.config

2020年11月23日月曜日

Lichee Pi Zeroのソフト開発環境構築2

前回、LCDの表示、タッチパネルの有効化まではできた。
あとやりたいこととしては

  • バックライトの制御
  • 音声出力
  • バージョンアップ機能
  • ブラウザ

バックライトの制御(試行錯誤)

u-bootの設定で、LCDのバックライトは

VIDEO_LCD_BL_PWM [=PB4]

としていた。 PWMなので調光できるよねきっと。



https://licheepizero.us/downloads/lichee_zero.pdf

回路図もそうなっているし。
さらりと1kHz以下で使うと書いてある。。

dtsファイルを見てみる

u-bootのconfigでは

BR2_TARGET_UBOOT_BOARD_DEFCONFIG=“LicheePi_Zero_800x480LCD”
BR2_TARGET_UBOOT_BOOT_SCRIPT_SOURCE=“board/licheepi/boot.cmd”

LicheePi_Zero_800x480LCD_defconfig

CONFIG_DEFAULT_DEVICE_TREE=“sun8i-v3s-licheepi-zero”

sun8i-v3s-licheepi-zero.dts

#include “sun8i-v3s.dtsi”
#include “sunxi-common-regulators.dtsi”
pwmの記載なし

sun8i-v3s.dtsi

pwmの記載なし

board/licheepi/boot.cmd

cat board/licheepi/boot.cmd
setenv bootargs console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock.dtb
bootz 0x41000000 - 0x41800000

kernelの起動時にはsun8i-v3s-licheepi-zero-dock.dtbを読み込むのね。きっと

kernelのconfigでは

BR2_LINUX_KERNEL_INTREE_DTS_NAME=“sun8i-v3s-licheepi-zero sun8i-v3s-licheepi-zero-dock sun8i-v3s-licheepi-zero-with-800x480-lcd”
BR2_ROOTFS_POST_IMAGE_SCRIPT=“support/scripts/genimage.sh”
BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/licheepi/genimage.cfg"

こんなに書いてあった

DTS

sun8i-v3s-licheepi-zero
sun8i-v3s-licheepi-zero-dock
sun8i-v3s-licheepi-zero-with-800x480-lcd

[]sun8i-v3s-licheepi-zero-with-800x480-lcd.dts

#include "sun8i-v3s-licheepi-zero-with-lcd.dtsi"

&panel {
	compatible = "urt,umsh-8596md-t", "simple-panel";
};

[]sun8i-v3s-licheepi-zero-with-lcd.dtsi*

backlight関係の定義があった。

#include "sun8i-v3s-licheepi-zero.dts"
/ {
	backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm 0 1000000 0>;
		brightness-levels = <0 30 40 50 60 70 100>;
		default-brightness-level = <6>;
	};

	panel: panel {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			backlight = <&backlight>;
			#address-cells = <1>;
			#size-cells = <0>;

			panel_input: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&tcon0_out_lcd>;
			};
		};
	};

これが他にのdtsファイルにも記載されているといいんだけど。

[]sun8i-v3s-licheepi-zero-dock.dts

dockのボタンとかcodec、mmc1の定義

#include "sun8i-v3s-licheepi-zero.dts"
(略)

support/scripts/genimage.sh

特に関連するものは無いように見える

board/licheepi/genimage.cfg

image boot.vfat {
	vfat {
		files = {
			"zImage",
			"sun8i-v3s-licheepi-zero-dock.dtb",
			"sun8i-v3s-licheepi-zero.dtb",
			"boot.scr"
		}
	}
	size = 8M
}
(略)

整理

混乱してきたので整理
[board/licheepi/boot.cmd]→[sun8i-v3s-licheepi-zero-dock.dts]→[sun8i-v3s-licheepi-zero.dts]

backlightの定義のあるのは
[sun8i-v3s-licheepi-zero-with-800x480-lcd.dts]→[sun8i-v3s-licheepi-zero-with-lcd.dtsi]→[sun8i-v3s-licheepi-zero.dts]

sun8i-v3s-licheepi-zero-dock.dtsに書き足せばいいんじゃねと思ってやってみたのだけど、dtbが更新されない。
make dtbsも無いみたい。

もうひとあがき

すでにあるsun8i-v3s-licheepi-zero-dockで全文検索していたら
Makefileに記載があった。

output/build/linux-zero-4.14.y/arch/arm/boot/dts$ cat Makefile 
(中略)
dtb-$(CONFIG_MACH_SUN8I) += \
(中略)
	sun8i-v3s-licheepi-zero.dtb \
	sun8i-v3s-licheepi-zero-dock.dtb \
	sun8i-v3s-licheepi-zero-with-480x272-lcd.dtb \
	sun8i-v3s-licheepi-zero-with-800x480-lcd.dtb

ここに、dtbを新たに記載してみても、make時に自動生成はされないようだった。
まだちゃんとは確認できていないけど。

個別にdtbファイルを作成する

dtbが作成されないならば、作ってみよう。
https://qiita.com/ikwzm/items/b07af1a861d6f1c0fde2

上記を参考に

#!/bin/bash

LINUX_KERNEL_SRC=output/build/linux-zero-4.14.y
DTS_SRC_FILE=$1
DTB_OUT_FILE=${DTS_SRC_FILE%.*}.dtb


gcc -E -P -x assembler-with-cpp -I $LINUX_KERNEL_SRC/arch/arm/boot/dts -I $LINUX_KERNEL_SRC/include $DTS_SRC_FILE | dtc -I dts -O dtb -i $LINUX_KERNEL_SRC/arch/arm/boot/dts -o $DTB_OUT_FILE

dtbファイルは[sun8i-v3s-licheepi-zero-dock-with-lcd.dts]

#include "sun8i-v3s-licheepi-zero-dock.dts"

/ {
	backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm 0 1000000 0>;
		brightness-levels = <0 30 40 50 60 70 100>;
		default-brightness-level = <6>;
	};

};

&pwm {
	pinctrl-names = "default";
	pinctrl-0 = <&pwm0_pins>;
	status = "okay";
};

先程のスクリプトでdtbファイルが生成されるので
/output/imagesにコピーしてみる

各種ファイルの変更

生成したdtbを参照するように変更していく

BR2_LINUX_KERNEL_INTREE_DTS_NAME

BR2_LINUX_KERNEL_INTREE_DTS_NAME=sun8i-v3s-licheepi-zero-dock-with-lcd

/board/licheepi/boot.cmd

setenv bootargs console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock-with-lcd.dtb
bootz 0x41000000 - 0x41800000

/board/licheepi/genimage.cfg

image boot.vfat {
	vfat {
		files = {
			"zImage",
			"sun8i-v3s-licheepi-zero-dock-with-lcd.dtb",
			"boot.scr"
		}
	}
	size = 8M
}
(略)

いざmake

makeがすんなりと終わって、書き込んでみたら

U-Boot 2017.01-rc2 (Oct 26 2020 - 05:55:22 +0900) Allwinner Technology

CPU:   Allwinner V3s (SUN8I 1681)
Model: Lichee Pi Zero
DRAM:  64 MiB
MMC:   SUNXI SD/MMC: 0
*** Warning - bad CRC, using default environment

Setting up a 800x480 lcd console (overscan 0x0)
dotclock: 33000kHz = 33000kHz: (1 * 3MHz * 66) / 6
In:    serial@01c28000
Out:   serial@01c28000
Err:   serial@01c28000
Net:   No ethernet found.
starting USB...
No controllers found
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
reading /boot.scr
292 bytes read in 15 ms (18.6 KiB/s)
## Executing script at 41900000
reading zImage
4022144 bytes read in 204 ms (18.8 MiB/s)
reading sun8i-v3s-licheepi-zero-dock.dtb
** Unable to read file sun8i-v3s-licheepi-zero-dock.dtb **
ERROR: Did not find a cmdline Flattened Device Tree
Could not find a valid device tree
SCRIPT FAILED: continuing...

「** Unable to read file sun8i-v3s-licheepi-zero-dock.dtb **」・・・Orz

更新できていないみたい。

いったん落ち着いて・・・。

バックライトの制御

make cleanしてやりなおす

よくわからない状態になってしまったので、いったん落ち着いて・・・。

make clean
make licheepi_zero_custom_x_touch_backlight_defconfig

設定を確認していく

BR2_LINUX_KERNEL_INTREE_DTS_NAME

BR2_LINUX_KERNEL_INTREE_DTS_NAME=sun8i-v3s-licheepi-zero-dock-with-lcd

/board/licheepi/boot.cmd

setenv bootargs console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero-dock-with-lcd.dtb
bootz 0x41000000 - 0x41800000

/board/licheepi/genimage.cfg

image boot.vfat {
	vfat {
		files = {
			"zImage",
			"sun8i-v3s-licheepi-zero-dock-with-lcd.dtb",
			"boot.scr"
		}
	}
	size = 8M
}
(略)

dl/linux/git/arch/arm/boot/dts

  • sun8i-v3s-licheepi-zero-dock-with-lcd.dts の追加
  • Makefileの変更
(略)
	sun8i-v3s-licheepi-zero-with-480x272-lcd.dtb \
	sun8i-v3s-licheepi-zero-with-800x480-lcd.dtb \
	sun8i-v3s-licheepi-zero-dock-with-lcd.dtb
dtb-$(CONFIG_MACH_SUN9I) += \
(略)

いざmake

make[2]: *** ターゲット ‘arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock-with-lcd.dtb’ を make するルールがありません. 中止.

output/build/linux-zero-4.14.y/arch/arm/boot/dts

  • sun8i-v3s-licheepi-zero-dock-with-lcd.dts の追加
  • Makefileの変更

これでOK
どうやったら、outputに生成される方にも反映できるのかな・・・

動作確認

以下を参考にあれこれ変えてみる
https://wiki.archlinux.jp/index.php/バックライト

# ls /sys/class/backlight/
backlight
# ls /sys/class/backlight/backlight/
actual_brightness  device             subsystem
bl_power           max_brightness     type
brightness         power              uevent
# cat /sys/class/backlight/backlight/max_brightness 
6
# echo -n 0 > /sys/class/backlight/backlight/brightness 
(消灯した!)
# echo -n 6 > /sys/class/backlight/backlight/brightness 
(点灯した!)

いいね!
最大輝度は結構見やすいと思う。

2020年11月16日月曜日

Lichee Pi Zeroのソフト開発環境構築

なんとなく、公式?の開発環境をさわっているうちに、buildrootに興味が湧いた。
docker内のやつは、ルートシステムを作るのみのように見えた。
u-Boot、カーネルこみこみでやる方法もあるらしいので、次は、それを試してみる。

https://hackaday.io/project/134065-funkey-zero/log/144796-linux-distribution
https://github.com/Squonk42/buildroot-licheepi-zero

Squonk42/buildroot-licheepi-zero

変更履歴もわかりやすいので、最新のbuidrootにも適用できるかもしれないね。
https://github.com/Squonk42/buildroot-licheepi-zero/commit/abe975d2dbfc331343a2c01bfc6e21ef88beac64

リポジトリ取得

まずは、このリポジトリを使わせてもらう

git clone https://github.com/Squonk42/buildroot-licheepi-zero.git
make licheepi_zero_defconfig
make menuconfig
make uboot-menuconfig
make

と特に、エラーもなく進めることができた。

LCD表示対応

以下の内容を反映する
https://licheezero.readthedocs.io/zh/latest/系统开发/uboot_conf.html#lcd

make uboot-menuconfig
Enable graphical uboot console on HDMI, LCD or VGA = y
VIDEO_LCD_MODE [=x:800,y:480,depth:18,pclk_khz:33000,le:87,ri:40,up:31,lo:13,hs:1,vs:1,sync:3,vmode:0]
VIDEO_LCD_BL_PWM [=PB4]
VIDEO_LCD_BL_PWM_ACTIVE_LOW [=n]
VIDEO_LCD_PANEL_PARALLEL [=y]

VIDEO_LCD_BL_PWM_ACTIVE_LOWを忘れていて、液晶バックライトが点灯しなくてかなり悩んだ。
ちゃんとドキュメントは読まないとね。

X11関係のインストール

公式パッケージのでやったようにxclockとか表示させたいので、以下を参考に必要なパッケージをインストール
https://unix.stackexchange.com/questions/70931/how-to-install-x11-on-my-own-linux-buildroot-system

make menuconfig
BR2_PACKAGE_XAPP_TWM [=y]
BR2_PACKAGE_XAPP_XCLOCK [=y]
BR2_PACKAGE_XAPP_XINIT [=y]
BR2_PACKAGE_XDRIVER_XF86_VIDEO_FBDEV [=y]
BR2_PACKAGE_XORG7 [=y]
BR2_PACKAGE_XSERVER_XORG_SERVER [=y]

これで、起動後に

startx /usr/bin/xclock

で、いつものあいつが表示された!

簡易的なフォトフレーム

写真をパラパラ切り替えられたらフォトフレームにできるんじゃないかと思い、調べていると
「feh」というソフトが、ちょうど良さそうだった。早速インストール。

make menuconfig
BR2_PACKAGE_FEH [=y]

/root/に、何枚か写真を置いて

startx /usr/bin/feh ./ -g 800x480 -D 2

これで、2秒周期に写真が切り替わるフォトフレームの完成だ!
と思ったら、10分で消灯してしまった。

10分消灯の対策 - consoleblank

このあたりを参考に、修正してみる
http://lists.busybox.net/pipermail/buildroot/2015-October/142796.html
https://www.olimex.com/forum/index.php?topic=7147.0

board/licheepi/boot.cmd
setenv bootargs console=ttyS0,115200 panic=5 console=tty0 consoleblank=0 rootwait root=/dev/mmcblk0p2 earlyprintk rw

consoleのあとに「consoleblank=0」を追加

消灯後にfeh終了させたら表示が戻った。・・・こっちじゃなかった。
X起動中のみぽいので、xorgのblanktime?なのか。

10分消灯の対策 - xrogの設定

xsetコマンドを使うと設定を切り替えられるらしいので、導入してみる

BR2_PACKAGE_XAPP_XSET=y

その後、

export DISPLAY=:0.0
xset q
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000000
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    off    02: Scroll Lock: off
    03: Shift Lock:  off    04: Group 2:     off    05: Mouse Keys:  off
  auto repeat delay:  660    repeat rate:  25
  auto repeating keys:  00feffffdffffbbf
                        fadfffffffdfe5ef
                        ffffffffffffffff
                        ffffffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  2/1    threshold:  4
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  600    cycle:  600
Colors:
  default colormap:  0x20    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
  /usr/share/fonts/X11//misc/,built-ins
DPMS (Energy Star):
  Standby: 600    Suspend: 600    Off: 600
  DPMS is Enabled
  Monitor is Off

「Screen Saver」と「DPMS」ねー

xset s off -dpms

これで、消灯していたLCDが点灯になった。おかえりなさい!
この設定を永続化するにはどうすればいいのか
https://wiki.archlinux.jp/index.php/Display_Power_Management_Signaling#DPMS_.E3.82.92.E3.82.AA.E3.83.95.E3.81.AB.E3.81.99.E3.82.8B

x起動時のログを見ていたら

Using system config directory "/usr/share/X11/xorg.conf.d"

というのがあった。
ここに15-monitor.confを作成してみる

Section "ServerFlags"
  Option "BlankTime" "0"
  Option "StandbyTime" "0"
  Option "SuspendTime" "0"
  Option "OffTime" "0"
EndSection

https://qiita.com/eagletmt/items/a9f804b7b5a5f5040ad0

フォトフレーム用画像の永続化

rootfs_overlayというしくみを使うといいらしい
https://qiita.com/pu_ri/items/8cdef8f7bb79a2ea0863
https://buildroot.org/downloads/manual/manual.html

make menuconfig
BR2_ROOTFS_OVERLAY [=board/licheepi/rootfs-overlay]

「board/licheepi/rootfs-overlay」にファイルを置くと、ルート直下「/」に配置されるみたい

この仕組みを使えば、設定ファイルも保存できるのか?

xorg設定ファイルを組み込む

overlayの仕組みを使って
"/usr/share/X11/xorg.conf.d/15-monitor.conf"を保存する

せっかくなので自動起動させる

overlayの仕組みを使って
"/etc/init.d/S99photoframe.app"を保存する

#!/bin/sh
startx /usr/bin/feh /root/photo/ -D 5 -g 800x480 &

実行権限を付与しておしまい

Buildroot-2020.08.01でやってみる

いろいろとわかってきたような気がしてきたので、最新のbuildroot-2020.08.01でやってみたいと思う。

入手

https://buildroot.org/download.html
ここからbuildroot-2020.08.1を選択してローカルに保存。

configファイルの用意

他と被らないように、とりあえず[licheepi_zero_custom_defconfig]という名前で

BR2_arm=y
BR2_cortex_a7=y
BR2_ARM_FPU_VFPV4=y
BR2_CCACHE=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_LINARO_ARM=y
BR2_TARGET_GENERIC_HOSTNAME="licheepi-zero"
BR2_TARGET_GENERIC_ISSUE="Welcome to Buildroot for the LicheePi Zero"
BR2_TARGET_GENERIC_ROOT_PASSWD="licheepi"
BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y
BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/licheepi/genimage.cfg"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_GIT=y
BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/Lichee-Pi/linux"
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="zero-4.14.y"
BR2_LINUX_KERNEL_DEFCONFIG="licheepi_zero"
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="sun8i-v3s-licheepi-zero sun8i-v3s-licheepi-zero-dock"
BR2_PACKAGE_LINUX_FIRMWARE=y
BR2_PACKAGE_LINUX_FIRMWARE_RTL_87XX=y
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG=y
BR2_TARGET_UBOOT_CUSTOM_GIT=y
BR2_TARGET_UBOOT_CUSTOM_REPO_URL="https://github.com/Lichee-Pi/u-boot"
BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="v3s-current"
BR2_TARGET_UBOOT_BOARD_DEFCONFIG="LicheePi_Zero_800x480LCD"
BR2_TARGET_UBOOT_FORMAT_CUSTOM=y
BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot-sunxi-with-spl.bin"
BR2_TARGET_UBOOT_BOOT_SCRIPT=y
BR2_TARGET_UBOOT_BOOT_SCRIPT_SOURCE="board/licheepi/boot.cmd"
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_DTC=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS=y

make開始

make licheepi_zero_custom_defconfig
make

これでおしまい

簡易フォトフレーム化

defconfigファイル

増分は

11a12
> BR2_ROOTFS_OVERLAY="rootfs-overlay"
20a22,26
> BR2_PACKAGE_XORG7=y
> BR2_PACKAGE_XSERVER_XORG_SERVER=y
> BR2_PACKAGE_XAPP_XINIT=y
> BR2_PACKAGE_XDRIVER_XF86_VIDEO_FBDEV=y
> BR2_PACKAGE_FEH=y

overlay

こんな感じ

rootfs-overlay/
├── etc
│   └── init.d
│       └── S99photoframe.app
├── root
│   └── photo
│       ├── chihiro001.jpg
((省略))
│       └── chihiro050.jpg
└── usr
    └── share
        └── X11
            └── xorg.conf.d
                └── 15-monitor.conf

画像はこれを使用させてもらった!
http://www.ghibli.jp/info/013344/
すてき!



 

タッチスクリーンを有効にする

せっかくタッチスクリーン搭載の液晶を入手しているので、使えるようにしたい。

LicheepiZeroにはタッチスクリーンICが実装されているみたい。
I2Cバス<0x48>にNS2009というチップ


https://licheepizero.us/downloads/lichee_zero.pdf


DTSファイル確認

U-boot

別にU-boot起動時に使えなくてもいいけど、一応見てみる
defconfigで[LicheePi_Zero_800x480LCD]を指定している

cat LicheePi_Zero_800x480LCD_defconfig
(中略)
CONFIG_DEFAULT_DEVICE_TREE="sun8i-v3s-licheepi-zero"

u-bootにあるsun8i-v3s-licheepi-zero.dtsにはそれらしい記載は無い。

カーネル

こちらが本命。
defconfigで
BR2_LINUX_KERNEL_DEFCONFIG=“licheepi_zero”
BR2_LINUX_KERNEL_INTREE_DTS_NAME=“sun8i-v3s-licheepi-zero sun8i-v3s-licheepi-zero-dock”
としているので

cat sun8i-v3s-licheepi-zero.dts
(中略)
&i2c0 {
	status = "okay";

	ns2009: ns2009@48 {
		compatible = "nsiway,ns2009";
		reg = <0x48>;
	};
};

っぽいのがあった。

カーネルコンフィング

カーネルの設定で使用するようになっているかは

make linux-menuconfig



これも大丈夫そう。


i2c-toolsでみてみる

# i2cdetect -r -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --      

たしかに、0x48にデバイスを認識していて、ドライバで使用中(UU)になっている。
先にこっちを見るべきかもしれないけど、ブートログでも大丈夫そう

# dmesg
(中略)
[    1.012054] i2c /dev entries driver
[    1.016959] input: ns2009_ts as /devices/platform/soc/1c2ac00.i2c/i2c-0/0-0048/input/input1

ということで、ドライバまでは大丈夫そう。

X11側を調べる

https://wiki.archlinux.jp/index.php/タッチスクリーン

汎用ドライバーっぽい「xf86-input-evdev」を入れてみる

*** xf86-input-evdev requires udev to be enabled ***

とあるので、udevも有効にする。

BR2_PACKAGE_EUDEV [=n]
Depends on: BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV [=n] && BR2_USE_MMU [=y] && BR2_USE_WCHAR [=y] && !BR2_STATIC_LIBS [=n]

ついでに[xinput]と[xinput-calibrator]も選択しておく

make
(中略)
checking for library containing clock_gettime... none required
checking for cos in -lm... yes
checking pkg-config is at least version 0.9.0... yes
checking for gobject-introspection... no (disabled, use --enable-introspection to enable)
checking for blkid >= 2.20... no
configure: error: *** blkid support requested but not found

やれやれ。。。 一度[make clean]してから再度やってみると、出来た!

defconfigファイル

増分はこんな感じ

8a9
> BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
21c22
< BR2_LINUX_KERNEL_INTREE_DTS_NAME="sun8i-v3s-licheepi-zero sun8i-v3s-licheepi-zero-dock"
---
> BR2_LINUX_KERNEL_INTREE_DTS_NAME="sun8i-v3s-licheepi-zero sun8i-v3s-licheepi-zero-dock sun8i-v3s-licheepi-zero-with-800x480-lcd"
23a25,26
> BR2_PACKAGE_XAPP_XCALC=y
> BR2_PACKAGE_XAPP_XEYES=y
24a28,32
> BR2_PACKAGE_XAPP_XINPUT=y
> BR2_PACKAGE_XAPP_XINPUT_CALIBRATOR=y
> BR2_PACKAGE_XDRIVER_XF86_INPUT_EVDEV=y
> BR2_PACKAGE_XDRIVER_XF86_INPUT_KEYBOARD=y
> BR2_PACKAGE_XDRIVER_XF86_INPUT_MOUSE=y

タッチスクリーンのキャリブレーション

ズレが気になる。。。


 

https://wiki.archlinux.jp/index.php/タッチスクリーン
https://sites.google.com/site/memomuteki/tinylinux/xinputcalibratorniyorukyaribureshon

xinput_calibratorを使うのが簡単らしい。

### xinput_calibratorの実行

早速実行してみると、LCD上にキャリブレーションの画面が表示される
4点をタッチして完了。
コンソールの方には、以下の表示があり、99-calibration.confみたいな感じで記載するよと。

# startx /usr/bin/xinput_calibrator
xauth:  file /root/.serverauth.428 does not exist


X.Org X Server 1.20.9
X Protocol Version 11, Revision 0
Build Operating System: Linux 5.4.0-42-generic x86_64 
Current Operating System: Linux licheepi-zero 4.14.14-licheepi-zero #1 SMP Wed Oct 21 05:21:56 JST 2020 armv7l
Kernel command line: console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
Build Date: 21 October 2020  05:19:59AM
 
Current version of pixman: 0.40.0
	Before reporting problems, check http://wiki.x.org
	to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
	(++) from command line, (!!) notice, (II) informational,
	(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.2.log", Time: Thu Jan  1 00:20:16 1970
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
Calibrating EVDEV driver for "ns2009_ts" id=7
	current calibration values (from XInput): min_x=0, max_x=4095 and min_y=0, max_y=4095

Doing dynamic recalibration:
	Setting new calibration data: 142, 3919, 312, 3952


--> Making the calibration permanent <--
  copy the snippet below into '/etc/X11/xorg.conf.d/99-calibration.conf'
Section "InputClass"
	Identifier	"calibration"
	MatchProduct	"ns2009_ts"
	Option	"Calibration"	"142 3919 312 3952"
EndSection
xinit: connection to X server lost

waiting for X server to shut down (II) Server terminated successfully (0). Closing log file.

99-calibration.conf

xinput_calibratorの出力に従って、記載をして、xの再起動。

# cat /usr/share/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
	Identifier	"calibration"
	MatchProduct	"ns2009_ts"
	Option	"Calibration"	"142 3919 312 3952"
EndSection

ズレが改善した!!


 

99-calibration.confに書いておけば、永続化されるみたい。
他の個体でも試してみて、補正値が同じような値ならば、まずはこれを標準の設定にしようかな。。