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

2020年10月21日水曜日

Lichee Zero-Dockを使ってみる

LCDが使用できて、安価なSBCを探していたら、見つけた。
https://akizukidenshi.com/catalog/g/gM-15544/
https://akizukidenshi.com/catalog/g/gM-14787/
https://akizukidenshi.com/catalog/g/gM-14873/

日本語の情報があまりないように思えるので、ちょっと気が重いがとりあえず購入。

情報源

公式はこのあたりなのかな
http://zero.lichee.pro/
http://nano.lichee.pro/
https://licheepizero.us/
https://licheepizero.us/downloads/readme_en.txt
https://dl.sipeed.com/LICHEE/Zero

中国語読めないよー

翻訳版

https://translate.google.co.jp/translate?hl=ja&sl=auto&tl=ja&u=http%3A%2F%2Fzero.lichee.pro%2F

作成済みイメージで動作確認

作成済みイメージをダウンロード

情報源や、貴重な日本語ページを参考にさせていただいてイメージをダウンロードする
https://qiita.com/17_kitano/items/8f8add216affa81ad321
https://dl.sipeed.com/LICHEE/Zero/Images/dd_img

minX_dd.tar.bz2
にしてみた。

適当なmicroSDカードに書き込んでみる

udo dd bs=4M if=minX_dd/lichee_zero-mindX_alpha.dd of=/dev/sdd conv=fsync

そして、Licheeに装着、シリアルコンソールも接続
TX,RXの表示は基板シルクが正しいみたい(webのは間違っている?)

起動してみる

シリアルコンソールの設定は、115200-8-N-1

Linux LicheePi 4.10.2-licheepi-zero+ #15 SMP Sat Apr 15 21:38:23 CST 2017 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@LicheePi:~#

初期パスワードはroot/licheepiだった。

液晶パネルを接続してみる

40pinのRGB液晶が対応しているというざっくりとした情報しかなくて
かなり不安だったが、とりあえずつなげてみた


 

接続したのは、同じところが出しているこれ
https://akizukidenshi.com/catalog/g/gM-14873/

u-Bootの表示がされたみたい。

調子に乗って、startxしてみたけどウィンドウマネージャ的なものが無いのか起動はしなかった。
でもXサーバーは起動しているようだ。一歩づついこう。

xアプリケーションを起動してみる

なんて呼んだらいいかわからないけど、xclockとかxcalc、xeyesなんかのx系のアプリケーションが入っているみたい。

root@LicheePi:~# ls /usr/bin/x*
/usr/bin/x-terminal-emulator  /usr/bin/xgamma	   /usr/bin/xmore
/usr/bin/x11perf	      /usr/bin/xgc	   /usr/bin/xprop
/usr/bin/x11perfcomp	      /usr/bin/xhost	   /usr/bin/xrandr
/usr/bin/xargs		      /usr/bin/xinit	   /usr/bin/xrdb
/usr/bin/xauth		      /usr/bin/xkbbell	   /usr/bin/xrefresh
/usr/bin/xbiff		      /usr/bin/xkbcomp	   /usr/bin/xset
/usr/bin/xcalc		      /usr/bin/xkbevd	   /usr/bin/xsetmode
/usr/bin/xclipboard	      /usr/bin/xkbprint    /usr/bin/xsetpointer
/usr/bin/xclock		      /usr/bin/xkbvleds    /usr/bin/xsetroot
/usr/bin/xcmsdb		      /usr/bin/xkbwatch    /usr/bin/xsm
/usr/bin/xconsole	      /usr/bin/xkeystone   /usr/bin/xstdcmap
/usr/bin/xcursorgen	      /usr/bin/xkill	   /usr/bin/xsubpp
/usr/bin/xcutsel	      /usr/bin/xload	   /usr/bin/xterm
/usr/bin/xditview	      /usr/bin/xlogo	   /usr/bin/xvidtune
/usr/bin/xdpyinfo	      /usr/bin/xlsatoms    /usr/bin/xvinfo
/usr/bin/xdriinfo	      /usr/bin/xlsclients  /usr/bin/xwd
/usr/bin/xedit		      /usr/bin/xlsfonts    /usr/bin/xwininfo
/usr/bin/xev		      /usr/bin/xmag	   /usr/bin/xwud
/usr/bin/xeyes		      /usr/bin/xman	   /usr/bin/xxd
/usr/bin/xfd		      /usr/bin/xmessage
/usr/bin/xfontsel	      /usr/bin/xmodmap

実行してみよう

startx /usr/bin/xclock -- :0


 

うぉー懐かしい。久しぶりに見たなこれー

開発環境を導入する

このままでは何ができるのかとか手探りになってしまうので
思い切って開発環境を導入してみようと思う
作成済みのイメージでは、以下のやり方がわからなかった。

  • 有線LANが使えない
  • タッチパネルのキャリブレーションができない
  • ウィンドウマネージャが開かない

公式の方法 Dockerで環境構築

http://zero.lichee.pro/入门/docker_index.html
の手順でやってみる。

adeno@drakorange:~/develop$ docker pull zepan/licheepi
Using default tag: latest
latest: Pulling from zepan/licheepi
9fb6c798fa41: Pull complete 
3b61febd4aef: Pull complete 
9d99b9777eb0: Pull complete 
d010c8cf75d7: Pull complete 
7fac07fb303e: Pull complete 
4a3e8d4abe49: Pull complete 
4e7cdc979849: Pull complete 
68de60586b36: Pull complete 
Digest: sha256:da6824787eb6b2e8b2556be6863b4dbfbe1683a1c834f257f9f8f5d993224bae
Status: Downloaded newer image for zepan/licheepi:latest
docker.io/zepan/licheepi:latest

取得できた

adeno@drakorange:~/develop$ docker run -d -p 6666:22 zepan/licheepi /usr/sbin/sshd -D
<略>
adeno@drakorange:~/develop$ ssh root@localhost -p 6666
The authenticity of host '[localhost]:6666 ([127.0.0.1]:6666)' can't be established.
ECDSA key fingerprint is <略>
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:6666' (ECDSA) to the list of known hosts.
root@localhost's password: 
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 5.4.0-42-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Thu Oct  5 09:15:27 2017 from 192.168.242.1
root@50959d444d56:~# cat README.txt 
u-boot	is mainline uboot, support tf or spi nor boot.
linux is mainline linux, 4.13 branch.
lichee is BSP linux, 3.4 kernel.
camdroid is BSP camdroid.

every dir have rebuild.sh to rebuild the source code.

sshでコンテナ内に入れた

U-bootのコンパイル

http://zero.lichee.pro/系统开发/uboot_index.html

コンフィングファイルは

root@50959d444d56:~/u-boot# ls configs/Lichee*
configs/LicheePi_Zero_480x272LCD_defconfig  configs/LicheePi_Zero_defconfig
configs/LicheePi_Zero_800x480LCD_defconfig

繋いでいるLCDは800x480だったような気がするので

make LicheePi_Zero_800x480LCD_defconfig

とりあえず、何か変えてU-bootが更新できることを確認する。

サンプルとして紹介されている、起動時の「バージョン情報の非表示」をやってみる
http://zero.lichee.pro/系统开发/uboot_logo.html

#define CONFIG_HIDE_LOGO_VERSION

/* Locals */
static GraphicDevice *pGD;      /* Pointer to Graphic array */

249行目辺りに #define CONFIG_HIDE_LOGO_VERSION を追記した。
コンパイルは

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
または
./rebuild.sh

で行う。
すると
u-boot-sunxi-with-spl.bin
が生成される

U-bootの更新

早速、更新してみる。
http://zero.lichee.pro/系统开发/uboot_build.html
には、
「コンパイル後、u-boot-sunxi-with-spl.binが現在のディレクトリに生成されます。これを8Kオフセットに書き込んで開始できます。」 by Google翻訳
とある。
8Kオフセットとは?なので、他の情報源にて探してみる。
https://linux-sunxi.org/Mainline_U-Boot#Compile_U-Boot
ここによると

dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8

sdXの部分を自分の環境に合わせる。
ハマったのはデバイス全体?を指定すること。sdd1にしていたら、起動できなくて。。。

8Kオフセットの説明は、ここにあった。
https://linux-sunxi.org/Bootable_SD_card#SD_Card_Layout

このSDカードを刺して起動してみると、ちゃんと?バージョン情報が非表示になった。

USB OTGで仮想イーサーネットを使用する

U-bootやカーネル更新毎にSDカード挿抜するのは大変だし、耐久性が心配。
挿抜が面倒。挿抜が面倒。

USB-OTG

仮想イーサーネットが使用できるらしいので使ってみる
http://zero.lichee.pro/应用/otg2PC.html

Lichee Zero側

インターフェースを作成する

root@LicheePi:~# ifconfig usb0 192.168.10.100
root@LicheePi:~# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

usb0      Link encap:Ethernet  HWaddr 4e:40:46:**:**:**  
          inet addr:192.168.10.100  Bcast:192.168.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4 errors:0 dropped:3 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:592 (592.0 B)  TX bytes:0 (0.0 B)

PC側

特に複雑な手順はなし。

adeno@drakorange:~/develop/licheepizoro$ lsusb
Bus 001 Device 009: ID 0525:a4aa Netchip Technology, Inc. Linux-USB CDC Composite Gadge (Ethernet and ACM)

adeno@drakorange:~/develop/licheepizoro$ ifconfig

enp1s0f0u3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
        inet6 ****::****:****:****:****  prefixlen 64  scopeid 0x20<link>
        ether 6a:91:64:**:**:**  txqueuelen 1000  (イーサネット)
        RX packets 6  bytes 392 (392.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 143  bytes 24341 (24.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

やってみる

u-Bootイメージファイルをscpで、Licheeに転送。
そして、自身でdd使って書き換える。

root@LicheePi:~# fdisk -l                           

Disk /dev/mmcblk0: 3.7 GiB, 3980394496 bytes, 7774208 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x33f10fcb

Device         Boot Start     End Sectors  Size Id Type
/dev/mmcblk0p1       2048   34815   32768   16M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      34816 1419263 1384448  676M 83 Linux

root@LicheePi:~# dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8

できた!

でも、でも、接続のたびにMACアドレスが変わってしまい、インターフェース設定をやり直す必要があるみたい。

イーサーネットを使用する

せっかくLANコネクタのあるDockを入手したので、LANを有用化したい。
http://zero.lichee.pro/驱动/Ethernet.html

Linuxカーネルコンパイル

root@50959d444d56:~# cat README.txt 
u-boot	is mainline uboot, support tf or spi nor boot.
linux is mainline linux, 4.13 branch.
lichee is BSP linux, 3.4 kernel.
camdroid is BSP camdroid.

every dir have rebuild.sh to rebuild the source code.

linuxディレクトリの中に入り
手順通り、dts、dtsiファイルを修正して

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

arch/arm/boot/zImage
arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dtb
をSDカードにコピーして、再起動

eth0の有効化

無事に起動したら

root@LicheePi:~# ifup eth0
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

[  374.205155] Generic PHY stmmac-0:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=stmmac-0:01, irq=-1)
[  374.217488] dwmac-sun8i 1c30000.ethernet eth0: No MAC Management Counters available
[  374.225386] dwmac-sun8i 1c30000.ethernet eth0: PTP not supported by HW
Listening on LPF/eth0/02:0f:e2:**:**:**
Sending on   LPF/eth0/02:0f:e2:**:**:**
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 7
[  381.526816] dwmac-sun8i 1c30000.ethernet eth0: Link is Up - 100Mbps/Full - flow control off
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 8
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.1.1
DHCPACK from 192.168.1.1
bound to 192.168.1.121 -- renewal in 83698 seconds.
root@LicheePi:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:0f:e2:**:**:**
          inet addr:192.168.1.121  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:45 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4536 (4.4 KiB)  TX bytes:4124 (4.0 KiB)
          Interrupt:35 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:112 (112.0 B)  TX bytes:112 (112.0 B)

root@LicheePi:~# 

いけた!

LAN未接続で、待たされる件

喜んでいたのだが
LAN未接続時に

a start job is running for raise network interfaces

で20秒くらい待たされてしまう。なんとかしたい。
https://askubuntu.com/questions/862176/how-to-fix-a-start-job-is-running-for-the-raise-network-in-ubuntu-server-16

mkdir -p /etc/systemd/system/networking.service.d/
bash -c 'echo -e "[Service]\nTimeoutStartSec=5sec" > /etc/systemd/system/networking.service.d/timeout.conf'
systemctl daemon-reload

いいね!

U-Bootの自己書き換え

といっても、sshできているので、PCから/boot/あたりにイメージデータを保存して
以下を実行するだけ、/dev/以降が変わるくらいで、他に気にするところはなかった。

dd if=/boot/u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8

状況の整理

いろいろやりながらで、時間も経ってきたのでよくわからなくなってきた。
今一度整理。

分類 方法 状況 ソース
U-boot docker内の u-boot 出来た。ブート時のLCD表示もOK http://zero.lichee.pro/系统开发/uboot_build.html おそらく [git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current]
Linuxカーネル docker内の linux 出来た。 eth0の有効化もOK http://zero.lichee.pro/驱动/Ethernet.html
ルートシステム docker内の emdebian emdebianの開発終了のため試していない https://en.wikipedia.org/wiki/Emdebian_Grip
ルートシステム docker内の buildroot ルートシステムを作るのみ?
統合 buildroot 最新のやつはlicheepi対応しているみたいだが、LCDの確認はまだ
統合 OpenWrt 不明 https://qinfengling.pro/build_openwrt_image_for_licheepi_nano.html

docker内にいろいろサンプルがあるのがありがたい。

buildrootのあれこれ

buildrootって敷居が高かったのだけど、調べてみたらちょっとやってみたくなってきた。
docker内のやつは、ルートシステムを作るのみのように見えた。
u-Boot、カーネルこみこみでやる方法もあるらしいので、次は、それを試してみる。

https://qiita.com/aselectroworks/items/550370b4129c0afdda68
https://github.com/unframework/licheepi-nano-buildroot
https://github.com/Squonk42/buildroot-licheepi-zero
https://hackaday.io/project/134065-funkey-zero/log/144796-linux-distribution

2020年4月17日金曜日

3Dプリンタでマスク作ってみる

作りたいな、作ってみたいなと思って、かなり時間が経ってしまった。


ネットで公開されているありがたいデータ

国内は以下のような感じ? 海外のは、フェイスガードが多いのかな。
名称 リンク 備考
イグアス http://www.iguazu-3d.jp/case_study/laboratory/3d_mask/ 男性/女性/子供向けがある♥
PITATT 3D print mask https://www.rootech360.com/ REGULAR/SMALLがある
NANOHACK 2.0 https://copper3d.com/hackthepandemic/ 本格的
イヤーガードとフェイスシールド https://flashforge.co.jp/stl-earguard-faceshield/
データ集 https://cults3d.com/en/collections/useful-3d-printed-coronavirus-covid19-tool 一覧になっていて見やすい

PITATT 3D print maskのシミュレーション

PITATT 3D print maskを出力した場合のシミュレーション
REGULARで、3時間45分くらいかかる見込み。


イグアス マスクのシミュレーション

イグアス マスクを出力した場合のシミュレーション
男性向けで、6時間45分くらいかかる見込み。


でも、サポート部分の印刷が支配的なので、PITATT 3D print maskのように配置を変えれば印刷時間変わるかもしれない。

X方向を60°にしたら、いい感じになった。 約3時間


PITATT 3D print maskを印刷してみた



フィラメントが劣化してしまったのか、ガタガタになってしまったOrz
乾燥させないとなー。めんどー。
微速度撮影にチャレンジしてみたよ。



動画の編集には「OpenShot」を使ってみた。
だけど、日本語入力が出来ないOrz
それと、ハードウェアエンコードが出来ない・・・。
課題はたくさんある。

2020年4月15日水曜日

YouPHPTube(avideo)を試してみる

動画管理・・・気になってやってみたかった。
https://www.moongift.jp/2017/06/youphptube-php製のyoutubeクローン/
試すだけ、、、なのできっとDockerがいいんじゃないかなと思った。


↑はフリー素材の犬 かわいい
https://pixabay.com/ja/videos/犬-飲酒-ペット-食品-5631/

Dockerでやってみる

久しぶりです。
Docker自体のインストールもやらないとね

Docker自体のインストール

・docker-ce
https://docs.docker.com/engine/install/ubuntu/
LinuxMintの場合は、Ubuntuじゃないので、注意。
「$(lsb_release -cs)」の部分を「bionic」書き換える。
https://continue-to-challenge.blogspot.com/2019/07/redmine.html
・docker-composer
https://docs.docker.com/compose/install/

ubuntuイメージの取得

$ sudo docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
5bed26d33875: Pull complete
f11b29a9c730: Pull complete
930bda195c84: Pull complete
78bf9a5ad49e: Pull complete
Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               4e5021d210f6        2 weeks ago         64.2MB
起動
$ sudo docker run -it -d --name YouPHPTube -p 127.0.0.1:10080:80 ubuntu:18.04
1e9996bda6d080f5c7697bacdefd5f0f817dc6303b15003726c2bc2cbb10178c
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1e9996bda6d0        ubuntu:18.04        "/bin/bash"         18 seconds ago      Up 17 seconds       127.0.0.1:10080->80/tcp   YouPHPTube

環境の準備

起動したコンテナにアタッチする
$ sudo docker attach 1e9996bda6d0
<コンテナ側>
apt upate
apt upgrade
これで準備OKのはず

apacheのインストール

作成したコンテナにapacheをインストールしてみる
<コンテナ側>
apt install -y apache2 apache2-utils
service apache2 start
母艦側のでlocalhost:10080にアクセスしてみる


まずはOK

MariaDBのインストール

本当は、1コンテナ(イメージ)に複数のサービスを入れるのは推奨されないみたいだけど、今回はお試しということで、詰め込んじゃう。
公式の手順では、MySQLになっているけど、なんとなくMariaDBにしてみた。
apt install mariadb-server mariadb-client
service mysql start
mysql_secure_installation
アクセスできるかな?
mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 51
Server version: 10.1.44-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
OKそう

AVideo用のユーザー・データベース作成

データベース:AVideo
ユーザー:AVideo
mysql -u root
create database AVideo;
create user AVideo@localhost identified by '**********';
grant all privileges on AVideo.* to AVideo@localhost;
もうひとつEncoder用
データベース:AVideoEncoder
mysql -u root
create database AVideoEncoder;
grant all privileges on AVideoEncoder.* to AVideo@localhost;

その他必要なもの

apt install php libapache2-mod-php php-mysql php-curl php-gd php-intl ffmpeg git libimage-exiftool-perl php-mbstring php-gettext python curl
これで、下準備完了

YouPHPTube(AVideo)のインストール

手順書どおりにやってみる
cd /var/www/html
git clone https://github.com/WWBN/AVideo.git
git clone https://github.com/WWBN/AVideo-Encoder.git
curl -L https://yt-dl.org/downloads/latest/youtube-dl -o /usr/local/bin/youtube-dl
chmod a+rx /usr/local/bin/youtube-dl
a2enmod rewrite
phpenmod mbstring
service apache2 restart

apacheの設定

/etc/apache2/apache2.confで AllowOverride All に変更する
<Directory /var/www/>
          Options Indexes FollowSymLinks
          AllowOverride All
          Require all granted
</Directory>
そのあと更新
a2enmod rewrite
service apache2 restart

アクセスしてみよう

母艦から
http://localhost:10080/AVideo
にアクセスしてみる


ほう。
指示に従って解決していこう

Your videos directory must be writable

「>Details」を開くとやり方が出てきた
mkdir /var/www/html/AVideo/videos
chown www-data:www-data /var/www/html/AVideo/videos && chmod 755 /var/www/html/AVideo/videos

Your post_max_size is 8M, it must be at least 100M

POSTのサイズ
nano /etc/php/7.2/apache2/php.ini
; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 8M
とりあえず2Gにしてみた。

Your upload_max_filesize is 2M, it must be at least 100M

アップロードサイズ的なやつか
nano /etc/php/7.2/apache2/php.ini
; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M
こちらも2Gにしてみた
変更後は、apacheの再起動を行う

セットアップを続けてみよう

あれー


もう一度やろうとすると、、起動しちゃったYO


こっちはこれでいいのかな

YouPHPTube(AVideo)-Encoder にアクセスしてみよう

セットアップウィザード

母艦から
http://localhost:10080/AVideo-Encoder
にアクセスしてみる


ほう。
指示に従って解決していこう
  • Your videos directory must be writable
  • Your max_execution_time is 30, it must be at least 7200
     とりあえず、7200にしてみた
  • Your memory_limit is 128M, it must be at least 512M
    とりあえず2Gにしてみた
これでよし


ここでのSteramerURLはDockerの中なので、**localhost:80/AVideo/**になるので注意

各種設定

基本設定

管理者でログインして
[設定]-[サイトの構成]から各種設定を行っていく

サインイン/アップ

[設定]-[一般的な設定]から
名称 説明 設定値
userMustBeLoggedIn Hide the website to non logged users 有効
doNotIndentifyByEmail Do not show user’s email on the site 有効
doNotIndentifyByUserName Do not show user’s username on the site 有効

プラグイン

[設定]-[その他]-[プラグイン]
名前 要約
Hotkeys Enable hotkeys for videos, like F for fullscreen, space for play/pause, etc…
SeekButton Add seek buttons to the control bar
VideoTags User interface for managing tags
これでしばらく使ってみようかね

コンテナの開始と終了など

忘れてたけど、まだアタッチで起動していただけだった。
アタッチで起動したものはコマンドプロンプトからCtrl+P → Ctrl+Qで抜ける
sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
1e9996bda6d0        ubuntu:18.04        "/bin/bash"         3 days ago          Up 3 days           127.0.0.1:10080->80/tcp   YouPHPTube

#終了
sudo docker stop 1e9996bda6d0

#開始
sudo docker start 1e9996bda6d0

#各種サービス起動
sudo docker exec -it 1e9996bda6d0 service apache2 start
sudo docker exec -it 1e9996bda6d0 service mysql start

#アタッチ
sudo docker attach 1e9996bda6d0

参考

https://github.com/WWBN/AVideo/wiki/How-to-install-LAMP,-FFMPEG-and-Git-on-a-fresh-Ubuntu-18.x-for-AVideo-Platform-version-4.x-or-newer
https://qiita.com/tsumtsumyuma/items/de7678d7f118793ea3e0
http://enakai00.hatenablog.com/entry/20140628/1403933390