ジャンル不定の日記です。

letsencryptでハマった

先日certbotを最新版にしてたんだが、renew でエラーになってた。
ワイルドカードなんでdns-01だが、
そもそも最初bindが起動してなかった。

certbotを最新版にしたときにkernel?が壊れてOSアップデートしてたんだが、それ以降起動してなかった模様・・・
/etc/apparmor.d/usr.sbin.named
# root hints from dns-data-root
/usr/share/dns/root.* r,
追加で起動した。

でipv4でDNS機能するようになったが、元々bindはAAAA返してないんでipv6を無効化してた。
certbotが
; Communication with ::1#53 failed: timed out
でエラーになる。
bindが起動してない状況だと127.0.0.1:53のエラーも出てた。

調べたがわかんなくて、bindを
listen-on-v6 { any; };
#listen-on-v6 { none; };
でipv6対応にしたら、
Error output from manual-auth-hook command dns-01-auth.sh:
update failed: REFUSED
にエラーが変わった。
この出力はdns-01-auth.shの中で実行してるnsupdateコマンドのエラー出力。

bindのallow-updateが元々127.0.0.1しか許可してなかったので::1を追加したら成功した。

Orange Pi Zeroのspidev

Orange Pi Zeroで制御する感じで3Dプリンタ作ろうといろいろ勉強中だが、
3Dプリンタのホットエンドにはサーミスタがついてて温度によってヒーターのON/OFFを制御しなきゃならない。
サーミスタで温度を取得するのにADコンバータが要るが、Orange Pi Zeroには付いてない。
Raspberry Piでサーミスタ使う情報だと外部のSPI接続のADコンバータを使ってた。

まあそんな感じでSPI接続のADコンバータ使うことになるのかなと思うが、手元のOrange Piではspidevが出てなかった。

Buildrootのパッチ参考に、
sun8i-h2-plus-orangepi-zero.dts
    aliases {
        serial0 = &uart0;
        /* ethernet0 is the H3 emac, defined in sun8i-h3.dtsi */
        ethernet0 = &emac;
        ethernet1 = &xr819;
        spi0 = &spi0;
        spi1 = &spi1;
    };

&spi1 {
    status = "okay";

    spidev@0 {
        compatible = "rohm,dh2228fv";
        reg = <0>;
        spi-max-frequency = <10000000>;
    };
};
dtsをいじってdtbを作り直した。
が、これでまだ出てこない。

menuconfigで、
Device Drivers  --->
  [*] SPI support  --->
    <*>   User mode SPI device driver support
↑ここチェックしないとダメみたい。

/dev/spidev1.0 が出てきた。
これでSPI使えるんだと思う。

LOOX U/C40でVIA VNT-6656認識した

LOOX U/C40のGMA500で動画支援が使えない感じだが、
LOOX U/C40に2つあるminiPCIeスロットの片方にBroadCom Crystal HDをつけるってのもちょい考え中。

ただ、LOOX U/C40の裏カバーすぐにある空きのminiPCIeスロットはUSBしか配線されてないとかで、Atherosかintelのカードしか認識しないとか。
そんなチェックが入ってるとは思えないんで、おそらく裏カバーのスロットがUSB専用で、元々AtherosのWifiがついてるのがPCIe専用なのを理解しないで装着して認識しなかった人が誤情報を発信して広まった感じでは?

というわけで、工人舎SXについてたwifiカード(VIA VNT-6656)をLOOX U/C40の裏カバーすぐのminiPCIeスロットに装着してみた。
工人舎SXでUSBデバイスと認識されてたんでVIA VNT-6656は間違いなくUSBデバイス。
で、普通に認識した。
アンテナのケーブル届かないがナシで接続できた。
工人舎SXではVIA VNT-6656が不安定で頻繁に切断したりして使い物にならなかったが、工人舎SXはかなり熱くなったんで熱が問題じゃないかと思ってるんで、LOOX Uで問題なければ元々ついてるAtherosを外せる。
そうすればこちらのスロットはPCIeなんでBroadCom Crystal HDが機能するんじゃないかと。

Orange Pi ZeroにUSB wifiつけた

ルーターがTKIPだからぽいんだが、Orange Pi ZeroのXR819が使い物にならんのでUSB wifi買ってたが昨日届いたんでつけてみた。

USBなんでとりあえず母艦に装着して、
$ lsusb
0bda:f179 Realtek Semiconductor Corp. 802.11n
出力省略してるけど、デバイス名わからんが 0bda:f179 のデバイスだった。
で、デバイスIDでググったら rtl8188fuぽかった。
なんか8188FU=8189FTVとか書いてある情報が出てくるけど、8189FTVはOrange Pi R1でお世話になったSDIOデバイスだからUSBデバイスじゃないよ。

linuxのmenuconfig確認すると8188xxはあるんだが8188FUはなさげ・・・
というわけで探したが、
https://github.com/kelebek333/rtl8188fu
↑のでビルドできた。
DKMSの説明しか無いが普通に
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- KSRC=../linux-5.8.3 modules
で rtl8188fu.ko が出来上がる。
Makefile はそのまま。
最初
https://github.com/ulli-kroll/rtl8188fu
↑のがDKMSじゃないんでこっちでmakeしたんだが、こっちは5.8.x非対応だった。
rtl8188fu.koを /lib/modules/5.8.3 に、
firmware/rtl8188fufw.bin を /lib/firmware/rtlwifi にコピー
で使える。

が、なんかカーネルメッセージがコンソールに出まくる。
sshなら出てこないけどシリアルコンソールだと出力が邪魔すぎ・・・

/etc/network/interfaces
auto wlan1
iface wlan1 inet dhcp
  pre-up start-stop-daemon -S -x wpa_supplicant -- -B -iwlan1 -c/etc/wpa_supplicant.conf
  pre-down start-stop-daemon -K -q -x wpa_supplicant
こんな感じで起動時に有効になった。
wifiを/etc/network/interfacesでDHCPは初だが、pre-upでwpa_supplicantしないとDHCPできない?

EMGDドライバ入れてみた

工人舎SXとLOOX U/CのGMA500だが、現行カーネルで標準では入るドライバだと動画再生支援が効いて無く、クローズドなIntel EMGDドライバだと効くとか。
だが、Xorg 1.9までにしか対応していなくArch Linuxで入れるのは難しい。
で、https://launchpad.net/~thopiekar/+archive/ubuntu/emgd にドライバとかXorg 1.9とかいろいろあるんでXubuntu 16.04入れてみた。
上記のドライバはubuntu 16.04までしかなさげ。

Xubuntu 16.04なんだが、最初16.04.6入れたらkernelが4.15だった。
で、linux 4.15でemgdドライバがビルドエラー出てた。
他のドライバだが、4.4.xxxのどっかで仕様が変わってダメになるみたいな情報を見たんで同じだと思った。
kernelをダウングレードしてみたんだが、4.4.143より古いのはaptでmodulesが見つからなくて4.4.143にしてみたがダメだった。
16.04に種類があるのは知らなかったが、16.04.1だとkernelバージョンが古いぽいんで入れてみたら4.4.31だった。これは通った。
だからインストールの際に16.04.1のISOを使ってインストール中にダウンロードしないようにしないとめんどいことになる。
http://ubuntutym2.u-toyama.ac.jp/xubuntu/16.04/release/
ISOは↑で拾ってきた。

emgdドライバは、
$ sudo add-apt-repository ppa:thopiekar/emgd
$ sudo apt update
$ sudo apt install emgd-driver
で入る。
Xも入れてくれてる感じだったが、
xorg-serverがなさげだったんで、
$ sudo apt install xserver-xorg-1.9
は別途入れる必要があるかも。

そのまま再起動すると画面表示されず操作不能になる。
事前に、
$ sudo Xorg :1 -configure
してホームディレクトリにxorg.conf.newを作っといたんで、
/etc/X11/xorg.conf にコピーして、Section "Device"の部分以外全部消して、Driver "emgd"
にして再起動した。
すると、画面は出るんだがなんか全然おかしいし、パスワード入れてもlightdmからxfceにログインできない。
というかそもそもオートログインにしてたんだが・・・
ってなことになったが、Alt+Ctrl+F1でlightdmを落として
$ sudo systemctl stop lightdm
$ sudo startxfce4
でXfceが起動した。
がやっぱ画面がおかしい。
上に表示されるべき部分が切れて下に表示されてたり、横幅もなんか変。

http://steadyassimilation.blogspot.com/2011/06/note-looxuc40ubuntu1104.html
↑11.04の情報だが、ちょうどLOOX U/C40の情報があった。
これ参考にxorg.confを修正したら正常に表示された。

なお、当初工人舎SXを使うつもりでそっちで作業してて、
ヒンジの角度?が悪いと画面消えたりして大変だったんだが、
最終的にwifiが何故かhardlockedになっちゃって解除できず、LOOXに代えた。
FANエラーがあるがLOOXのが小さいしいいわ。

これでXfceは起動したが、libvaは別途入れる必要があるみたい。
$ sudo apt install libva-1.0.16
$ sudo apt install vainfo-1.0.16
同じリポジトリにあるバージョンを入れた。
これでvainfoしたら動画支援効きそうな感じだった。
まだブラウザでは試してない。

mSATA to ZIF変換ボード届いた

mSATA to ZIF変換ボード届いた。
そして、今度のは写真の通りロック機構が後側のやつ。
ケーブルがゆるゆるでテープで厚み増やす必要があったが装着して認識した。

というわけで、SSDにArch Linux入れたんだが、
Xfce入れようとしたらlibxcryptってのとglibcが衝突した・・・
で、overwriteで入れたらなんかwifi-menuでネット繋がらなくなった・・・

C言語でGPIO触ってみた

C言語でHello World作ってOrange Piで実行できること確認した後pthread試してみて、あと必要なファイル書き込みやってみた。

#include <unistd.h>
#include <fcntl.h>

int main(void){
    char b;
    int fd=open("/sys/class/gpio/gpio12/value",O_WRONLY);
    b='1';
    write(fd,&b,1);
    sleep(5);
    b='0';
    write(fd,&b,1);
    sleep(5);
    b='1';
    write(fd,&b,1);
    return(0);
}
こんな感じで試してみた。
Orange Pi Zero準備するのめんどいんで、ヘッダーピンつけてないけどルーターとして常時起動してるOrange Pi R1で。GPIOはZeroとR1同じだしハード繋がない実験ならR1でやればいいね。

GPIO12を出力用にして実行してみた。
/sys/class/gpio/gpio12/value に'1'を書き込む。
5秒後に'0'を書き込む。
5秒後に'1'を書き込む。
って感じ。
最初は初回'1'を書き込んだところまでのコードで'1'に書き換わることを確認。
次に'0'を書き込んだとこまでのコードで確認したら'0'になってた。
最後のコードだと'1'だった。
ファイルは閉じずに1byteずつ書き込めば即時書き換わるぽい?
C言語のファイルアクセスはfopen使うのが普通みたいだが、バッファとか使われなそうと思ったんでシステムコール使ってみた。

ファイルはcloseするの忘れてたけどプロセス落ちれば勝手に閉じるよね?

Makefile自分で書いてみた

Orange Piを使ってGPIOを制御するプログラムを作る予定だが、C++はBuildroot標準でコンパイラがないようなので言語はCにする方向になった。
コンパイラを直接使ってOrange Piで動く"Hello World"はできたが、実際にはソースファイルが複数になってコンパイラの引数が多くなってわからなくなるのでmake使ってみることにした。

makeは同じディレクトリのMakefileに従ってコンパイルするマクロ的なもんだが、
ターゲット名:依存ファイル1 依存ファイル2
     コマンド
のような感じで、
:の左側にターゲット名、右側にスペース区切りで依存ファイルを書く。(依存ファイルは1つでもいいし多数でも。)
次の行に先頭からタブを空けてコマンドを書く。(コマンドは複数行書けると思う。)
参考にしたサイトだとどこも:の後にスペースがあったが必要ないみたい。
コマンド行のタブは必須。
単に
$ make
とした場合は最初に記載されたターゲットが処理されるらしい。

まあとりあえず、
CC=gcc

hello:main.o
    $(CC) -o $@ $^

.c.o:
    $(CC) -c $<

clean:
    $(RM) hello main.o
こんな感じで"Hello World"をmakeできるようにしてみた。

CCは変数みたいなものだがマクロと言うらしい。
gccを定義してあるが、ここ変えればクロスコンパイルできる。
定義の際はそのまま書いて使うときは$をつけるが、マクロ名が2文字以上の場合は$(CC)の様に()で囲む必要があるみたい。
$@ $^$<は内部マクロで、
$@=ターゲット名
$^=依存ファイルすべて
$<=依存ファイルの先頭1個
$(RM)は定義済みマクロで rm -f と同じ。

.c.oはサフィックスルールというもので、拡張子を2つ続けて書く感じでワイルドカード的に使える。

今回はソースファイルが main.c 1つなんで main.o は作る必要ないが今後のためにも main.o を作ってから hello コマンドを作る感じにした。
先頭のターゲットがhelloなんでmakeしたらhelloを作ろうとするが main.o がなければサフィックスルールに基づきmain.cからmain.oが作られ、main.oからhelloが作られる。
って感じかな。

Buildrootでクロスコンパイル

x86のArch Linux上でOrange pi用のアプリをコンパイルするのにarm-none-eabi-gcc使おうとしてたんだが、
arm-none-eabi-gccはstdio.hとかiostreamとかが無くてコンパイルできずかなり時間を費やしたが、結局別のクロスコンパイラを使う方法を発見した。
Buildrootのクロスコンパイラを使えばいいのね。

Buildrootってarm-none-eabi-gccを使ってシステムを作るものだと思ってたんだが、クロスコンパイラから作るのね。
いつもBuildrootのビルドするとき
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
こんな感じでやってたが、これ、
$ make
だけでよかったのね。
Buildrootというものを勘違いしてた。

で、buildroot/output/host/bin/ 以下に arm-linux-gccとか arm-buildroot-linux-uclibcgnueabihf-gccがあるが、これがクロスコンパイラ。(どっちでも実体は同じらしい)
で、
$ PATH=$PATH:buildroot/output/host/bin
みたいな感じでPATHに追加して、
$ arm-linux-gcc -o hello hello.c
でコンパイルできた。
Orange Pi R1に転送して実行できた。
ターゲットのシステムに最適なコンパイラだから、Arch Linux標準のコンパイラ使うよりもいいね。

Orange Pi ZeroでGPIO使ってみた

XR819がうまく行かないOrange Pi Zeroだが、
とりあえずシリアルコンソールで制御してGPIO触ってみることにした。
ピンヘッダーはさっきくっつけた。

ピン配列だが、
https://gist.github.com/probonopd/97f6826cc5aa3c0c0950682b0bc266bc
画像検索したら上のページが出てきた。
画像無くなったときのために画像は転載しておく。

LANコネクタある側の外側がGNDで、対角に5Vが2本、外側が3.3V。
テスタで測ったらそんな感じだった。

Raspberry Piの情報だが、
https://www.jtp.co.jp/techport/2016-08-31-002/
↑にファイルアクセスでGPIO制御する方法載ってたんで参考にした。
ググるとPython使ったやり方が出てきたりするがファイルアクセスだけで制御できる。Pythonなんか入れてない。

# cd /sys/class/gpio
# ls -al
total 0
drwxr-xr-x    2 root     root             0 Jan  1 00:00 .
drwxr-xr-x   43 root     root             0 Jan  1 00:00 ..
--w-------    1 root     root          4096 Jan  1 00:00 export
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w-------    1 root     root          4096 Jan  1 00:00 unexport
/sys/class/gpio/export にピン番号を書き込めば有効になってunexportに書き込むと無効になるらしい。
だが、ピン番号がわからない。

https://github.com/orangepi-xunlong/wiringOP
↑にあるWiringOPというコマンドを使うと番号が確認できるみたい。これはwiringPiというRaspberry Pi用のコマンドのOrange Pi用みたい。
BuildrootにもOrange Pi用に使えそうなコマンドがなかったんで上のをビルドしようと思ったが、これクロスコンパイルできない感じ?
なので、上のページに出力結果が載ってるんで信じることにした。
 +------+-----+----------+------+---+  OPi H2  +---+------+----------+-----+------+
 | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | GPIO |
 +------+-----+----------+------+---+----++----+---+------+----------+-----+------+
 |      |     |     3.3V |      |   |  1 || 2  |   |      | 5V       |     |      |
 |   12 |   0 |    SDA.0 | ALT2 | 0 |  3 || 4  |   |      | 5V       |     |      |
 |   11 |   1 |    SCL.0 | ALT2 | 0 |  5 || 6  |   |      | GND      |     |      |
 |    6 |   2 |    PWM.1 |  OFF | 0 |  7 || 8  | 0 | ALT2 | TXD.1    | 3   | 198  |
 |      |     |      GND |      |   |  9 || 10 | 0 | ALT2 | RXD.1    | 4   | 199  |
 |    1 |   5 |    RXD.2 | ALT2 | 0 | 11 || 12 | 0 | OFF  | PA07     | 6   | 7    |
 |    0 |   7 |    TXD.2 | ALT2 | 0 | 13 || 14 |   |      | GND      |     |      |
 |    3 |   8 |    CTS.2 |  OFF | 0 | 15 || 16 | 0 | ALT3 | SDA.1    | 9   | 19   |
 |      |     |     3.3V |      |   | 17 || 18 | 0 | ALT3 | SCK.1    | 10  | 18   |
 |   15 |  11 |   MOSI.1 | ALT2 | 1 | 19 || 20 |   |      | GND      |     |      |
 |   16 |  12 |   MISO.1 | ALT2 | 0 | 21 || 22 | 0 | OFF  | RTS.2    | 13  | 2    |
 |   14 |  14 |   SCLK.1 | ALT2 | 0 | 23 || 24 | 0 | ALT2 | CE.1     | 15  | 13   |
 |      |     |      GND |      |   | 25 || 26 | 0 | OFF  | PA10     | 16  | 10   |
 +------+-----+----------+------+---+----++----+---+------+----------+-----+------+
 | GPIO | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | GPIO |
 +------+-----+----------+------+---+  OPi H2  +---+------+----------+-----+------+
こんな感じで出力されるらしい。
なお、ピン配列の画像のページにもこのコマンドの結果が載ってるが番号が違う。よく見るとh3用をビルドしてるんで違うpiの結果を出力しちゃってるぽい。
H2(ZeroとR1)の配列は上の通りと思われる。
ピンヘッダーの配置と同じ感じの出力になってるわけね。
これのGPIOの欄に書かれている数字が /sys/class/gpio へのアクセスで使う数字ぽい。

# echo "12">export
# ls -al
total 0
drwxr-xr-x    2 root     root             0 Jan  1 00:00 .
drwxr-xr-x   43 root     root             0 Jan  1 00:00 ..
--w-------    1 root     root          4096 Jan  1 01:18 export
lrwxrwxrwx    1 root     root             0 Jan  1 01:18 gpio12 -> ../../devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio/gpio12
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip0 -> ../../devices/platform/soc/1c20800.pinctrl/gpio/gpiochip0
lrwxrwxrwx    1 root     root             0 Jan  1 00:00 gpiochip352 -> ../../devices/platform/soc/1f02c00.pinctrl/gpio/gpiochip352
--w-------    1 root     root          4096 Jan  1 00:00 unexport
3.3Vの隣りにある12番ピンを使うことにした。
exportにechoで"12"を書き込めば /sys/class/gpio/gpio12 が出てくる。
なお、echoのダブルクォート要らないんじゃね?思ったが要るみたい。(改行が入っちゃうとかか?)

# ls -alL gpio12
total 0
drwxr-xr-x    3 root     root             0 Jan  1 01:18 .
drwxr-xr-x    3 root     root             0 Jan  1 01:18 ..
-rw-r--r--    1 root     root          4096 Jan  1 01:19 active_low
drwxr-xr-x    4 root     root             0 Jan  1 00:00 device
-rw-r--r--    1 root     root          4096 Jan  1 01:19 direction
-rw-r--r--    1 root     root          4096 Jan  1 01:19 edge
drwxr-xr-x    2 root     root             0 Jan  1 01:19 power
drwxr-xr-x    2 root     root             0 Jan  1 00:00 subsystem
-rw-r--r--    1 root     root          4096 Jan  1 01:18 uevent
-rw-r--r--    1 root     root          4096 Jan  1 01:19 value
/sys/class/gpio/gpio12 には上記のファイルがある。
directionがin outの向きの確認と変更ができるみたい。
valueで値が確認できる。

# cat gpio12/direction
in
最初はinになってる。

# echo "out">gpio12/direction
# cat gpio12/direction
out
"out"を書き込むとoutになる。

# cat gpio12/value
0
valueの値は0。
この状況でテスタで電圧を測ってみたら0V強だった。
なお、inの状態でのテスタは3V強だった。active_lowだから?

# echo "1">gpio12/value
# cat gpio12/value
1
valueに"1"を書き込んだら1になった。
この状況でテスタで電圧を測ってみたら3V強だった。

テスタ当てるだけで制御できてることが確認できてるわけだが、一応LEDもくっつけてみた。
手元にVf2前後の緑LEDがあったんで20mA程度流せば光るだろうと計算したところ3.3Vに65Ωの抵抗で20mAになることがわかった。
100Ωの抵抗で光るだろうと判断して100Ω抵抗とLEDを直列でGPIO12とGNDの間につないでみた。
で、
# echo "0">gpio12/value
# echo "1">gpio12/value
# echo "0">gpio12/value
と交互に"0"と"1"をvalueに書き込んだら点滅した。