2017/9/27

reading notes : uarts in raspberry pi 3

ref:
PI 3 因為BT 的關係,所以原來的 uart console 被拿去給 bt 用了,
所以有一堆..

PI3 有兩個 uart:
  • PL011 : /dev/ttyAMA0 -- BT
  • mini UART : /dev/ttyS0 --console
Primary Console : /dev/serial0 是被指定給 console 用的,
所以指定 誰是 /dev/serial0,誰就會變 console。

miniUART 有些問題。
他的 baurate 是從 VPU 的 clk 除的。
所以跟 VPU 的頻率相關。
當使用 dvfs時,VPU 的頻率是會變的,有時候甚至會關閉,
這樣就導致 miniUART 的 baudrate 無法固定,關閉時甚至無法是用。

可以在 config.txt 中加上 enable_uart=1
這樣,VPU 的 core_freq 就會固定 250MHz,
如果加上 force_turbo 就會固定 400MHz。

enable_uart 只跟 miniUART 有關,不會影響到 PL011

UART 和 GPIO

pi 的 kernel 是用 devicetree overlay 來處理不同 device tree 配置問題。
有兩個:
  • pi3-disable-bt : 這個會 關掉 ttyAMA0,並且把 tx, rx 接到 GPIO 14, 15 pin 上
  • pi3-miniuart-bt : 這個會讓 bt 使用 miniuart (ttyS0),一樣把 ttyAMA0 的 tx, rx 接到 GPIO 14, 15 pin 上
所以簡單(不用bt)的作法,就是在 boot/config.txt 加上
dtoverlay=pi3-disable-bt
就可以用 最旁邊的第3(GND), 4(TX), 5(RX) 做 console uart 了。


在 yocto project 中
在自己增加的 layer 中...
recipes-bsp/bootfiles/rpi-config_git.bbappend:
SRCREV = "648ffc470824c43eb0d16c485f4c24816b32cd6f"

do_deploy_append() {
    if [ -n "${ENABLE_RPI3_SERIAL_CONSOLE}" ]; then
        echo "" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt
        echo "## Disable RPi3 bluetooth to enable serial console on UART0" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt
        echo "dtoverlay=pi3-disable-bt" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt
    fi
}

2017/9/26

another one : build yocto for rpi

這次是 這一篇

git clone -b krogoth git://git.yoctoproject.org/poky
git clone -b krogoth git://git.openembedded.org/meta-openembedded
git clone -b krogoth git://git.yoctoproject.org/meta-raspberrypi

oe-init-env build之後,到 build/conf 下 修改 local.conf..
加上:
MACHINE = "raspberrypi3"
PREFERRED_VERSION_LINUX-raspberrypi = "4.%"
DISTRO_FEATURES_remove += "x11 wayland"
DISTRO_FEATURES_append += "systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"

bblayers.conf 修改成..
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""


BBLAYERS ?= " \
  /home/charles-chang/rpi2016/sources/poky/meta \
  /home/charles-chang/rpi2016/sources/poky/meta-poky \
  /home/charles-chang/rpi2016/sources/poky/meta-yocto-bsp \
  /home/charles-chang/rpi2016/sources/meta-openembedded/meta-oe \
  /home/charles-chang/rpi2016/sources/meta-openembedded/meta-multimedia \
  /home/charles-chang/rpi2016/sources/meta-raspberrypi \
  "

BBLAYERS_NO_REMOVABLE ?= " \
  /home/charles-chang/rpi2016/sources/poky/meta \
  /home/charles-chang/rpi2016/sources/poky/meta-poky \
  "

然後 bitbake rpi-basic-image 就成工了。
build 完 dd , 可以開機。
但是 dtoverlay=pi3-disable-bt 沒作用。
uart 還是沒辦法當 console。只能用 hdmi + keyboard

Qt5 for embedded

Qt5 - embedd Linux
以前有 Qt for embedded,現在好像變成 plugin 了。
這一篇就在說明 plugin 的內容。

至於 license... 好像不清楚。
這一頁的各個 component 沒有列出..

2017/9/25

try : yocto for raspberry pi 3

先是參考 這一篇

clone git.yoctoproject.org/poky。
clone git,openembedded,org/meta-openembedded
clone github.com/meta-qt5/meta-qt5
clone git.yoctoproject.org/meta-raspberrypi
clone github.com/jumpnow/meta-rpi

作者的 meta-rpi 有提供 conf 下的 local.conf 和 bblayers.conf。
copy 過來,修改一下 bblayers.conf 裡的 path..

bitbake qt5-basic-image 出現 error:
Please use a locale setting which supports utf-8.
Python can't change the filesystem locale after loading so we need a utf-8 when python starts or things won't work.

進入 python, 用 sys.getfilesystemencoding() 看,過然,是 ANSI....
所以 follow 這一篇:
$sudo apt-get install locales
$sudo dpkg-reconfigure locales 
$sudo locale-gen en_US.UTF-8
Generating locales
 en_US.UTF-8... done
Generation complete.
$sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$export LANG=en_US.UTF-8

然後 build 出現 error:
ERROR: bcm2835-bootfiles-20170530-r60 do_fetch: Fetcher failure for URL: 
'https://codeload.github.com/raspberrypi/firmware/tar.gz/0f315f88ac91f9be93544bfd757f8d55ca4cf099'. Checksum mismatch!
File: '/home/charles-chang/rpi-yocto/build/downloads/0f315f88ac91f9be93544bfd757f8d55ca4cf099' 
has md5 checksum c8bf818d14ee260c6d318a8ab037b1b8 when 2fe42603602158796625989c73e5088b was expected
File: '/home/charles-chang/rpi-yocto/build/downloads/0f315f88ac91f9be93544bfd757f8d55ca4cf099' 
has sha256 checksum bfeb5471762bef90fb8accb135e9cf4bb08c4a7556df42f31987bd4184f52d10 
when 79dcd9f47fbae16e9ec80f96a48e4e04c0ee2076ddbb7f73429510d812a8ef89 was expected
If this change is expected (e.g. you have upgraded to a new version without updating the checksums) then you can use 
these lines within the recipe:
SRC_URI[md5sum] = "c8bf818d14ee260c6d318a8ab037b1b8"
SRC_URI[sha256sum] = "bfeb5471762bef90fb8accb135e9cf4bb08c4a7556df42f31987bd4184f52d10"
Otherwise you should retry the download and/or check with upstream to determine if the file has become corrupted or 
otherwise unexpectedly modified.

ERROR: bcm2835-bootfiles-20170530-r60 do_fetch: Fetcher failure for URL: 
'https://codeload.github.com/raspberrypi/firmware/tar.gz/0f315f88ac91f9be93544bfd757f8d55ca4cf099'. Unable to fetch URL from any source.
ERROR: bcm2835-bootfiles-20170530-r60 do_fetch: Function failed: base_do_fetch
ERROR: Logfile of failure stored in: /home/charles-chang/rpi-yocto/build/tmp/work/raspberrypi2-poky-linux-gnueabi/bcm2835-bootfiles/20170530-r60/temp/log.do_fetch.10803
ERROR: Task (/home/charles-chang/rpi-yocto/meta-raspberrypi/recipes-bsp/bootfiles/bcm2835-bootfiles.bb:do_fetch) failed with exit code '1'
這個是 meta-rpi/recipes-bsp/bootfiles/bcm2835-bootfiles.bbappend 裡的:
RPIFW_DATE = "20170530"
SRCREV = "0f315f88ac91f9be93544bfd757f8d55ca4cf099"
SRC_URI[md5sum] = "2fe42603602158796625989c73e5088b"
SRC_URI[sha256sum] = "79dcd9f47fbae16e9ec80f96a48e4e04c0ee2076ddbb7f73429510d812a8ef89"

RPIFW_SRC_URI = "https://codeload.github.com/raspberrypi/firmware/tar.gz/${SRCREV}"
RPIFW_S = "${WORKDIR}/firmware-${SRCREV}"

PR = "r60"

do_unpack() {
    tar -C ${WORKDIR} -xzf ${DL_DIR}/${SRCREV}
}
所以到 github.com/raspberrypi/firmware/,按下release" 會到每次 release 的 tarball 頁面。
裡面沒有20170530..

最接近的是https://github.com/raspberrypi/firmware/archive/1.20170515.tar.gz 他的linkname 也不是直接 ${SRCREV}, 而是 1.${RREPFW_DATE}。
反而比較像 meta-raspberrypi/recipes-bsp/bootfiles/../common/firmware.inc:
RPIFW_DATE ?= "20170405"
RPIFW_SRC_URI ?= "https://github.com/raspberrypi/firmware/archive/1.${RPIFW_DATE}.tar.gz"
RPIFW_S ?= "${WORKDIR}/firmware-1.${RPIFW_DATE}"

SRC_URI = "${RPIFW_SRC_URI}"
SRC_URI[md5sum] = "ea82d14a7cd8cfae9b78e00d4e56bc71"
SRC_URI[sha256sum] = "2f4e5bddbac1372590db203002c35cbba3fb9d6172a93c314ee27bf05ae13bff"

PV = "${RPIFW_DATE}"

是 bbappend,所以刪掉這個bootfile.bbappend,重新build 一次...
faile 在其他地方:
| arm-poky-linux-gnueabi-strip omxplayer.bin
| make: *** [omxplayer.1] Error 52
| ERROR: Function failed: do_compile (log file is located at 
/home/charles-chang/rpi-yocto/build/tmp/work/cortexa7hf-neon-vfpv4-poky-linux-gnueabi/omxplayer/git-r4/temp/log.do_compile.16373)
ERROR: Task (/home/charles-chang/rpi-yocto/meta-raspberrypi/recipes-multimedia/omxplayer/omxplayer_git.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 3371 tasks of which 1026 didn't need to be rerun and 1 failed.
看log,看不出fail 在那裡。
bitbake omxplayer
OK
再 bitbake qt5-basic-image
OK

loopback filesystem, growable loopback device

ref:
就是做出一個loopback filesystem,是用多少,長多少,不用先 dd 一個位子出來。

2017/9/21

bitbake -- print environment variable

ref: https://douglasfranca.tech.blog/2016/12/29/yocto-printing-environments-variables/

在 bitbake 的 conf, layer, bb 等有一堆變數。
要怎麼知道這些變數在 make 得時候,是什麼內容?

bitbake -e recipts-name 印出所有build 內容,然後用 grep ^VARNAME= 來取出..

例如,最後 build image 的 command 是 ..
bitbake fsl-image-qt5
我想知道所有的 DISTRO_FEATURES 是?
$ bitbake -e fsl-image-qt5 | grep ^DISTRO_FEATURES=

DISTRO_FEATURES="alsa argp bluetooth ext2 irda largefile pcmcia usbgadget usbhost wifi xattr nfs zeroconf pci 3g nfc 
ipv4 ipv6 libc-backtrace libc-big-macros libc-bsd libc-cxx-tests libc-catgets libc-charsets libc-crypt libc-crypt-ufc 
libc-db-aliases libc-envz libc-fcvt libc-fmtmsg libc-fstab libc-ftraverse libc-getlogin libc-idn libc-inet-anl 
libc-libm libc-locales libc-locale-code libc-memusage libc-nis libc-nsswitch libc-rcmd libc-rtld-debug libc-spawn 
libc-streams libc-sunrpc libc-utmp libc-utmpx libc-wordexp libc-posix-clang-wchar libc-posix-regexp 
libc-posix-regexp-glibc libc-posix-wchar-io largefile opengl ptest multiarch bluez pulseaudio sysvinit bluez5 
gobject-introspection-data"

bitbake another tools - bb

ref:https://github.com/kergoth/bb

git clone 下來後 run
bb/bin/bb init
# Load bb automatically by adding
# the following to ~/.bash_profile:

eval "$(/home/charles-chang/bb/bin/bb init -)"
所以就照著他說...
姊果不能用...

bitbake -- function document..

bitbake 一堆 conf, layer, bb 裡面用的語法,function,說明文件都在...source code 裡..
bb.utils.contains('DISTRO_FEATURES', 'wayland', 'west-init', '',d) 為例...
poky/bitbake/lib/bb/utils.py:
def contains(variable, checkvalues, truevalue, falsevalue, d):
    """Check if a variable contains all the values specified.

    Arguments:

    variable -- the variable name. This will be fetched and expanded (using
    d.getVar(variable, True)) and then split into a set().

    checkvalues -- if this is a string it is split on whitespace into a set(),
    otherwise coerced directly into a set().

    truevalue -- the value to return if checkvalues is a subset of variable.

    falsevalue -- the value to return if variable is empty or if checkvalues is
    not a subset of variable.

    d -- the data store.
    """

2017/9/15

docker -- embedded system 開發團隊使用docker 做開發環境的方法

先規定 一個 共用帳號,在 container 中,除了 root,就會使用這個帳號。

如果沒有辦法提供 dnsmasg, 而又需要修改 /etc/hosts 的話,可能會有點麻煩。
因為 container 每次從 image 啟動的時候,id 都不一樣,所以 docker 會複寫 /etc/hosts。
導致 image 中的 /etc/hosts 被修改。

所以如果要提供自己的 hosts,必須要在 container 啟動之後,自己加 (用 command 或 script)

docker -- share folder with host

docker vm (container) 可以跟 host 共用 folder。
應該說,可以把 host 的 folder mount 進來。
只有 container 可以,而且是在 start 時指定。
用:
-v "host\folder\path:container\path"
用這個方式,host 的 found 會被擺在 container 中,但是 file attr, uid/gid 都不變。

如果

docker . lxc + aufs

docker 的 image, container 概念大概就是出自於他使用的 aufs 檔案系統。
image 就是 DVD 類似的媒體。一般是 read only.
docker 的 'vm' 要啟動時,就以image 為base,上面疊上另一個 aufs 的 overlay。
這樣,任何的檔案修改,都只會紀錄在 aufs 上面那一層,不會改到下面的 image

所以docker 就有 image 和 container 兩種分類的命令。

docker 把放置所有 image 的地方叫 registry。
如果不另外自行配置,都會用官方的 registry (在 github?)。每個人都可以註冊帳號。之後就可以使用自己的帳號存放自己做的 image

container 一旦啟動之後,即使 exit, stop。container 的狀況依然保留著(裝過的packeg,修改的 file 部會消失),
大概是因為那個放container 上層 filesystem 的 folder 沒有刪除。
所以任何時候都可以再 star。
也因為 container 有自己要用的上層 filesystem (folder),所以整個 server 中,同樣的 container 只能有一個。
user A start 後, user B 無法再 start。
但是 user B stop 的話,user A 也會被 exit

container 狀態要保存的話,可以用 commit 命令把他變成 image。
這樣每個 user 都可以自己從這格image run 出一個 container 來。

另外,也可以用 export 命令,把 container export 成一個檔案。
當然,這格檔案就變成 image 了 (ro)
然後這個檔案可以 copy 到任何機器上,用 import 命令吃進 docker 系統,變成docker 系統的 image
-- 這樣就不用經過 docker registry server 了。

2017/9/14

docker ... misc

follow 這一篇,大概就是,把 https://download.docker.com 加到 apt source 中。
install docker-ce

會順便裝 aufs

裝完run docker info 說我 permission deny
所以把自己加到 docker 的 groupe 中,再是一次 , OK
ps 看,果然增加 docker-containerd, dockerd 兩個 daemon

docker build 之後, file 有錯,修改完,直接再 build 一次就可以。

run 過的 image 會產生一個 container,即使exit 了,container 依然在,所以 image 沒辦法rm
要先 docker rm container-id 之後,才能 docker rmi image-id
container id 可以用 docker ps -a -q 列出。
如果有兩個 reposity 使用相同的 image-id,就要加上 -f 才能刪除。
docker login 後,才能用 docker push images 到 docker hub 上自己的目錄。

docker swarm init 因為機器有兩個 網卡,所以要加上 --advertise-addr eth0 指定使用 eth0


docker run image 後就會產生一個 container,並且在其中執行。
之後這個container 就一直存在著,即使 exit 或是用 stop command 停止他,他都還在。
只要用 start command 啟動他,他的裝態都還是持續著 (安裝,修改過的東西不會reset)。

但是如果這個
另外,這個 github example 很不錯。

這一篇: How can I use docker without sudo 說,某一版之後,只要加入 docker group,就可以不用sudo 了。
但是要注意,docker group 有類似 root 的權限。
這個 是官方的說明。

更新 stretch

update
upgrade
dist-upgrade (沒事)
修改 sources.list
update
upgrade (一堆)
dist-upgrade (爆多,3G)

更新完後,要改 lightdm.conf 成autologin
dnsmasq,conf 也要改。
最後 apt-get autoremove

dmesg

升級完後,dmesg 竟然說 permission deny。
follow 這一篇, 用:
% sudo sysctl kernel.dmesg_restrict=0
kernel.dmesg_restrict = 0

所以把
kernel.dmesg_restrict = 0
加到 /etc/sysctl.conf 後面..就 OK 了。

nfs

mount v4 的 nfs 卻出現fail..dmesg 出現..NFS: nfs4_discover_server_trunking unhandled error -22. Exiting with error EIO
google 一下是新 bug..,所以 follow 這一篇 ...
echo 'blacklist rpcsec_gss_krb5' > /etc/modprobe.d/blacklist-rpcsec-gss-krb5.conf
reboot
結果 一樣..

sudo use vi, and no password
ref:https://askubuntu.com/questions/539243/how-to-change-visudo-editor-from-nano-to-vim
$sudo update-alternatives --config editor

ref:https://www.mxp.tw/2014/06/25/ubuntu-sudo-nopasswd-%E4%B8%8D%E7%94%A8%E8%BC%B8%E5%85%A5%E5%AF%86%E7%A2%BC%E8%A8%AD%E5%AE%9A/
就是...把 "NOPASSWD:" 插到..
sudo   ALL=(ALL:ALL) NOPASSWD:ALL

10/10 apt repository update

apt-get update 先出現 /var/lib/apt/list/lock (?)不能 lock。
去找一下,發現這個 lock file 存在,所以手動刪除,繼續...
然後出現一堆 /var/lib/apt/list/ooxx 的Error
follow 說明 apt-get clean 再 updat...
然後說 deb-multimedia.org 的 hash 不對。
所以手動,把 /var/lib/apt/lists 下所有檔案刪除,,,
OK

2017/9/11

隨便的 agl worklog...

有一個 Error
ERROR: weston-1.9.0-r0 do_populate_sysroot: The recipe weston is trying to install files into a shared area when those files already exist. Those files and their manifest location are:
   /home/charles-chang/AGL/build/tmp/sysroots/raspberrypi3/lib/systemd/system/weston.service
 Matched in manifest-raspberrypi3-weston-init.populate_sysroot

Please verify which recipe should provide the above files.

The build has stopped as continuing in this scenario WILL break things, if not now, possibly in the future (we've seen builds fail several months later). 
If the system knew how to recover from this automatically it would however there are several different scenarios which can result in this and we don't know 
which one this is. 
It may be you have switched providers of something like virtual/kernel (e.g. from linux-yocto to linux-yocto-dev), in that case you need to execute the clean
 task for both recipes and it will resolve this error. 
It may be you changed DISTRO_FEATURES from systemd to udev or vice versa. Cleaning those recipes should again resolve this error however switching
 DISTRO_FEATURES on an existing build directory is not supported, you should really clean out tmp and rebuild (reusing sstate should be safe). 
It could be the overlapping files detected are harmless in which case adding them to SSTATE_DUPWHITELIST may be the correct solution. 
It could also be your build is including two different conflicting versions of things (e.g. bluez 4 and bluez 5 and the correct solution for that would be to
 resolve the conflict. 
If in doubt, please ask on the mailing list, sharing the error and filelist above.

ERROR: weston-1.9.0-r0 do_populate_sysroot: If the above message is too much, the simpler version is you're advised to wipe out tmp and rebuild (reusing sstate
 is fine). That will likely fix things in most (but not all) cases.
ERROR: weston-1.9.0-r0 do_populate_sysroot: Function failed: sstate_task_postfunc

ERROR: Logfile of failure stored in: /home/charles-chang/AGL/build/tmp/work/cortexa7hf-neon-vfpv4-agl-linux-gnueabi/weston/1.9.0
-r0/temp/log.do_populate_sysroot.21390

ERROR: Task 311 (/home/charles-chang/AGL/meta-agl/meta-agl/recipes-graphics/wayland/weston_1.9.0.bb, do_populate_sysroot) failed with exit code '1'

三代 pi

一個是roy的..
一片1325



糟糕,pi 3 原本的 console uart 已經被拿去給 bt 用,所以uart console 不能用了。
因為修改方式好像很麻煩,而且會喪失 bt 功能,所以還是用 hdmi + keyboard/mouse 開機好了。
開機超快,插上電大概 3 sec..

桌面是 LXDE,browser 是 chrome。

裝 FlintOS (ChromeOS), 很慢,不堪用。

2017/9/6

開機後 進入 文字模式

無法啟動 gui
login 後手動 startx
出現 error message : cannot find display

所以把 /etc/X11/xorg.conf 刪除就可以了。