Yocto Projectを触ってみる

Raspberry Pi OS(旧Raspbian)、Lite版でも大きいよねって事で、Yocto Projectで専用ディストリビューションを作ってみる手順を記録します。

今回の件とは関係ないどけど、ルートファイルシステムをイメージ化?して、ファームウェア更新とかできるといいなぁ。

 

公式サイトはこちら。

 

www.yoctoproject.org

 

なおビルド環境はLinux Mint (Ubuntu系)のPCを想定しています。Yocto Project自体のバージョンは現時点の最新版である3.4(Honister)を使います。

 

まずは環境を整えるために公式のリファレンスを参考にします。基本的にはaptで必要なパッケージをさくっとインストール。

 

docs.yoctoproject.org

 

次に、作業ディレクトリを作成します。ホームディレクトリの下にyoctoディレクトリを作る体で進めます。そこにリファレンスビルドシステム Pokyを配置します。今回はブランチを指定してクローンしました。LTSを使用したい場合はDunfell (3.1)を指定することになると思います。

 

wiki.yoctoproject.org

 

$ mkdir ~/yocto
$ cd ~/yocto
$ git clone git://git.yoctoproject.org/poky -b honister

 

次にOpenEmbedded-CoreとBSPを配置します。OpenEmbedded-Coreは組込みLinuxディストリビューションを作る際のフレームワークのようで、組み込むOSSのレシピ集とありました。BSPはハードウェアのドライバやライブラリ、サンプルコードになるようです。

 

$ cd ~/yocto/poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b honister

$ git clone git://git.openembedded.org/meta-openembedded -b honister

 

必要なものの配置が終わったら設定を行います。手順は先程配置した

meta-raspberrypiのREADMEにあるようです。

 

$ cd ~/yocto/poky
$ source oe-init-build-env rpi-build

 

環境が設定された状態ではrpi-buildディレクトリが作成され、ここに移動します。この状態でクローンしたRaspberry Pi用のレイヤーを追加します。

 

$ pwd
~/yocto/poky/rpi-build
$ bitbake-layers add-layer ../meta-raspberrypi/

 

次にREADMEに記載されている依存レイヤーを追加していきます。これらのレイヤーは追加する順番に依存性があるようです。


$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/

 

レイヤーが追加できたらビルド対象を設定します。設定はlocal.confのMACHINEに記載します。設定値一覧は下記サイトのMachineを参考にします。今回は"raspberrypi4-64"で試しています。

 

layers.openembedded.org

 

ここまでの設定が完了したらビルドを開始します。

 

$ cd ~/yocto/poky/rpi-build
$ bitbake core-image-base

 

時間が数時間。ストレージの容量も50GB以上使うようなので気長に待ちます。

OSのイメージはrpi-build/tmp/deploy/images/raspberrypi4-64に出力されるのでbmaptoolか、一度展開してwicファイルをSDカードに書き込みます。書き込んだSDカードをRaspberry Piに挿し、ブートするとログインプロンプトが出ますので、root、パスワードなしでログインできます。

NuvotonマイコンをNuEclipseで開発してみたい (2/2)

キリが悪かったので2回目に分割。

 

新規でプロジェクトを作成してビルドができるようになるのが目標です。と言ってもサンプルプロジェクトの内容をそっくりコピーするだけですが。

 

NuEclipseの[File]-[New]-[C Project]から[Executable]-[Empty Project]-[Cross ARM GCC]で空のプロジェクトを作成します。Comfigurationsやコンパイラの指定はデフォルトで[Finish]を押します。

 

f:id:nitteru:20211016105600p:plain

C Projectの作成

 

作成されたProjectを右クリックしで[Import]から[General]-[File System]で[Next]。[From directory]に[Browse]でインポートするフォルダを指定します。今回は落としてきたBSPライブラリのLibraryフォルダを選択して、Libraryフォルダ以下をすべてインポートします。[Finish]で完了。

 

f:id:nitteru:20211016105927p:plain

インポート設定

f:id:nitteru:20211016110304p:plain

インポートフォルダの選択

 

次はmain.cをインポートします。初期化コードをゼロから書くのは面倒なので、適当なサンプルコードから拝借します。今回はUARTのサンプルからインポートしました。

 

f:id:nitteru:20211016113532p:plain

main.cのインポート

 

 

インポートが完了したらInclude設定を行います。Projectの右クリックからPropertiesを選び、プロジェクトのプロパティを呼び出します。[C/C++ General]-[Path and Symbols]を選び、[Includes]-[Languages]-[GNU C]にインクルードパスを設定します。

[Add]で設定画面を呼び出し、その中で[Workspace]を選び下記3つのフォルダを指定します。

  • [Project Name]/CMSIS/Include
  • [Project Name]/Device/Nuvoton/[MCUシリーズ名]/Include
  • [Project Name]/StdDriver/Inc

 

次にTools Pathを設定します。同じくプロジェクトのプロパティから[C/C++ Build]-[Tools Path]を選びます。ここでBuild ToolsとToolchainを指定します。

 

さらにリンカやビルドの最適化、MCUバイスを設定します。[C/C++ Build]-[Settings]を開きます。まずは[Tool Settings]から[Target Processor]-[ARM family]を設定します。今回は[cortex-m0]を指定します。

 

f:id:nitteru:20211016111421p:plain

Settings

次にリンカの設定をします。[Cross ARM GNU C Linker]-[General]から[Script files (-T)]を追加します。緑のプラスアイコンを押すと設定画面が出ます。デフォルトで入力されるかもしれませんが設定内容は下記の通りです。NuvotonとSourceの間は落としてきたBSPライブラリによって変化します。

 

"${workspace_loc:/${ProjName}/Device/Nuvoton/NUC100Series/Source/GCC/gcc_arm.ld}"

 

f:id:nitteru:20211016114131p:plain

リンカスクリプトの設定


次に[Miscellaneous]で[Use newlib-nano (--specs=nano.specs)]をONにします。

 

f:id:nitteru:20211016112448p:plain

リンカ設定 Misc

 

次は最適化の設定です。[Tool Settings]の[Optimization]から[Optimization Level]を必要に応じて変更します。ここではサイズ優先(-Os)にしています。

 

f:id:nitteru:20211016113216p:plain

オプティマイズ設定

 

次はターゲットデバイスの設定です。[C/C++ Build]-[Settings]の[Device]からターゲットのMCUを選択します。

 

f:id:nitteru:20211016113038p:plain

ターゲットデバイス

ここまで設定できたら[OK]を押してプロパティを閉じます。その後、プロジェクトを右クリックして[Build Project]を押すなりでプロジェクトをビルドします。設定が間違っていなければビルドが通る、はずです。

 

f:id:nitteru:20211016114803p:plain

ビルド完了

 

ここまで来たらあとはmain.cを書き換えるなりコードを追加するなりで作りたいものを作れ…ればいいなぁ。

NuvotonマイコンをNuEclipseで開発してみたい (1/2)

秋月電子でNuvoton製のARMマイコン開発ボードを買ってたのすっかり忘れていました。これを使えるように開発環境を整えてみたいと思います。

 

akizukidenshi.com

 

以前ならCoocox CoIDEというフリーの開発環境があって別シリーズのマイコン開発で使っていたのですが、いつの間にやらなくなってしまっていました。バージョンアップの途中でフェードアウトした印象ですが、実際どうだったんでしょう。

 

無くなってしまったものは仕方がないので新しい開発環境を探さねばなりません。STMicroelectronicsとかであれば色々あるんですが、と思っていたらメーカーから公式で出ているものがあります。EclipseベースのNuEclipseというらしいです。名前ややこしい上にググビラティが低い…。

おまけにNuvotonとしてはKEIL MDK Nuvoton editionが推しおっぽい気もしますね。

 

www2.keil.com

 

ともかく興味本位もあってNuEclipseを落としてきてインストールしてみます。途中でBuild ToolsとCompilerのインストールについて聞かれますが、理由がなければ同梱の物を使った方がいいかもしれません。プログラマのドライバも一緒にインストールします。

 

で。このNuEclipseはあんまり面倒見が良くなくCoIDEの時にやってくれた事を自分でやらねばなりません。BSPライブラリやCMSISの入手とかですね。BSPについてはメーカーのサイトから入手します。ライブラリ中にCMSISやサンプルコード、ドライバが入っています。

サンプルコードをビルドするだけであれば、NuEclipseの[File]-[Import]から[General]-[Exisiting Projects into Workspace]からBSPライブラリのSampleCodeにある各々のサンプルからGCCフォルダにあるプロジェクトをインポートすればビルド可能な状態で取り込むことができます。

 

問題は自分でプロジェクトをイチから作りたいとき。[File]-[New]-[C|C++ Project]-[Hello World Nuvoton Cortex-M C Project]がそれっぽいのでそのままプロジェクトを作成してみたところコードの不足した半端なプロジェクトが出力されます。もちろんそのままビルド不可。

という事で、先程落としてきたBSPライブラリのサンプルから必要そうなものをインポートしてみようという作戦に出ることにしてみました。

 

そして次回へ続きます。

MAX10-FBで遊ぶ、準備編

マルツから発売されているFPGA入門基板「MAX10-FB」を触ってみることにしました。FPGA触れると…なかなか楽しそうじゃないですか。

 

www.marutsu.co.jp

 

FPGAそのものはIntel(ALTERA) MAX10シリーズを搭載しています。大事な大事な開発環境はIntel Quartus Primeを使います。お金がないので無償版のLite Edition。Pro Editionよりバージョンは下がって20.1.1になるようです(2021年10月現在)。

 

fpgasoftware.intel.com

 

Lite Editionであれば、落とすのは一式の方でよさそうです。とは言っても容量は約6GB。時間がかかるので余裕があるときにやりましょう。珍しく?tarボールで固められているので対応しているアーカイバで展開、インストール用のBatファイルを実行します。

インストールは基本デフォルトで大丈夫なようです。元が大きいので時間かかりますが終わるまで根気よく待ちます。最後の最後にダウンロードケーブル (マイコンだとプログラマ/デバッガ) USB-Blaster用のドライバをインストールで完了です。

 

ちなみにドライバのインストール、落としてきたQuartus Primeが20.1だと失敗します。署名の有効期限が切れてるみたいですね。20.1.1だとインストールできたと思いますが、実際にUSB-Blasterを接続したときにドライバのインストールに失敗するかもしれません。

この件についてはIntelとマクニカのサイトに記事があります。

 

www.intel.com

 

www.macnica.co.jp

 

IntelのサイトにはLite Editionについての記載はありませんが、マクニカの情報によるとLite Editionでも適用可のようです。実際にやったら無事に通りました。

Quartus Prime Programmer and Toolsではなく、Quartus Prime Lite Editionをインストールしましたので、quartus-0.0-0.02i-windows.exeを落としてきて適用します。あとはデバイスマネージャから手動でドライバを当てて完了です。このドライバはマルツのJTAGキットであるMAX10-JBにも適用できます。

 

これでようやく実際に触る準備ができました。

今後は、書籍「MAX10実験キットで学ぶFPGA&コンピュータ」の内容を頭から舐めてみたいと思います。

 

実はここまでくるのに苦労しました。特にパッチの存在とダウンロードページを見つけること、Lite Editionに適用できる(していいのか)の情報の有無が大きな要因ですせめてQuartus Primeのダウンロードページにパッチがあれば…。

WebRTCサーバー Janusを試してみる

ちょっとしたことで監視カメラを作りたくなったので、WebRTCサーバーのJanusを試してみることにしました。今の所録画は考えておらず、逆に必要な時だけ映像を受信できる形に持っていきたいのです。

 

本来映像のストリーミングは、RTMPなりをnginxとnginx-rtmp-moduleで受けてHLS配信するのがお手軽簡単かと思います。ただし、Webサーバーを自宅に配置するとポートを開ける必要がありますし、かといってクラウド上に置くとRTMPのデータを四六時中受ける必要があるためお金がかかるという理解です。

 

ここで映像をエンコードRTMPで配信する部分を必要に応じてオンオフできると節約になるんじゃないかと思いました。ついでに触ったことのないWebRTCに興味があったので試してみようと思い立ったわけです。聞いたところによるとラグも少ないみたいですし。

 

もしかしたらオンオフ制御はそのままでHLS配信になるかもしれませんが…。

 

WebRTCは下記の記事を参考にしました。

 

qiita.com

 

仕事で WebRTC · GitHub

 

 

Janusについて、試してみた手順はおおむねこちらの通りです。

 

www.mikan-tech.net

 

www.mikan-tech.net

 

これらの記事にもあるように。libniceやlibrtsp、libwebsocketsはaptでインストールできるものとは相性がよくありませんでした。

 

また最近?のブラウザはWebRTCを使うのにhttps接続が必須になるようです。記事中にもあるように自己署名証明書を用意して使うようにしました。

 

これでJanusのStreamサンプルが動作し、Raspberry Pi カメラモジュールの映像を受信することができています。次回から、WebSocketで配信(ffmpegかGstream)をオンオフできるようにしたいと思います。

調べ物のメモ (x86について)

x86なPCがどんな風に動いてきたのか、興味が湧いたので整理がてらメモを残すことにしました。

 

ja.wikipedia.org

 

ja.wikipedia.org

 

とりあえずは8080、8086からでしょうか。本来なら4004、4040からなんでしょうが、今の流れの根幹として8080ということで。x86アセンブラはこの辺のレベルで解説しているサイトが多いイメージ。

 

ja.wikipedia.org

 

ja.wikipedia.org

 

今現役のx86の根幹がこの辺り。リアルモードとプロテクトモードが実装されたのは80286。リアルモードは8086互換でアドレス幅は16bit。DOSとかがこのモードで動く。プロテクトモードが使われたのはWindows 3.0かららしい。

 

PCを触り始めた頃はMS-DOS 3.3系かWindows 3.1だったなぁ…。

 

x86のCPUはリアルモードで起動し、後にプロテクトモードに切り替える。

ELECOM NSR-MSシリーズのNASからデータをサルベージしてみた記録

すごく久しぶりにブログで記録を取りたいなと思ったネタが上がってきました。一言で申しますと、先人の知恵は素晴らしい!!

 

ネタとしては掲題の通り、ELECOM製のNASNSR-MSシリーズのHDDからデータサルベージを行いました。(下記リンクは製品の一例です)

 

www.elecom.co.jp

 

症状としては本体の基板が故障して起動しなくなってしまったようです。HDDからは異音はせずPCからデバイスとして認識したためハード的には無事と判断。そのためHDDからデータサルベージを試してみることにしました。ちなみにファームウェアにバグがあるのか設定が悪かったのかバックアップが正しく動作していなかったようで…。

 

先に試したのはRAID 1で構成していたHDDアレイのうち1台を単純にマウントしてみること。手持ちの古いUSB-SATA変換ケーブルを使ったところ、fdiskでパーティション情報が表示されませんでした。持ち込んできた方いわくそんなはずはないとのことで、裸族を使って確認したところいくつかのパーティションが見つかりました。一番大きいサイズのパーティションが実際にデータが格納されていることろのようです。

 

パーティションがわかればこっちのもの、と思ったものの、EXT4で認識されているにも関わらず"EXT4-fs :bad block size 65536"とエラーが表示されてマウント失敗。その他LVMやxfsを疑ったりググって出てきたツール類を試すもすべてダメ。

 

ここで自分の知っている範疇を超えてきたのでネット上でどなたか解決しているかを確認してみました。型番やメーカーではかからないのですが、先に確認したエラーメッセージで調べるとYahoo!知恵袋のある質問を見つけることができました。数日かかって解決されたようで24ぐらいまで伸びています。

 

detail.chiebukuro.yahoo.co.jp

 

最終的には23、24を見れば概ね解決方法が書いています。少し記事を追いにくいのと、別のNASやHDDが故障した場合に役に立ちそうなのでこちらで纏める事にしました。

 

手順としてはソフトウェアRAID機能の管理ツールmdadmを使ってミラーしているHDDを1台でマウントします。マウントするのはディスクそのものでもいいですが、アクセス中の故障が怖い場合はあらかじめddコマンドなどでイメージファイル化しておきましょう。ちなみにこのNAS。ディスクに書き込んでいるエンディアンx86なPCと違うのかなと思ってddコマンドで変換しながらイメージ化してもダメなようです。確か東芝のHDDレコーダーがこの方式を採用してましたね。

 

HDDを接続時に自動でディスクアレイを構成していることがあるので現在の状況を確認します。パーティションがsda2の場合でディスクアレイが構築されている場合は下記のような表示になります。

 

$ cat /proc/mdstat
(一部抜粋)
md125 : active (auto-read-only) raid1 sdb2[2] sda2[0] 953153536 blocks super 1.2 [2/2] [UU]

 

ディスクアレイの解除はすべての/dev/md?デバイスをStopする方法で対応しました。

 

# mdadm --stop /dev/md124
(/dev/md?があるだけ)

 

/dev/md0としてディスク1台だけでソフトウェアRAIDアレイを作成します。その後にfsckファイルシステムをチェック。

 

# mdadm --verbose --assemble /dev/md0 /dev/sda2 --force
# mdadm /dev/md0 --grow --raid-devices=1 --force
# fsck.ext4 -fy /dev/md0

 

あとはサルベージ先を用意します(サルベージ先デバイスは/dev/sdb1)。

 

# mkfs.ext4 /dev/sdb1
# mkdir /salvage
# mount -t ext4 /dev/sdb1 /salvage
# chmod 755 /salvage
# cd /salvage

 

ここでRAIDのディスク(/dev/md0)をext4でマウントしようとすると、最初に見たエラーが出るだけなので、debugfsなるツールを使用します。これでマウントせずにデバイスやディスクイメージからデータを吸い取れるようです。rdumpの引数で、/dev/md0のディレクトリdataの内容をサルベージ先ディスクのカレントディレクトリにコピーします。

 

# debugfs -R "rdump /data ." -c /dev/md0

 

サルベージが完了したらsshやsftpなどを使うなりでWindows機にコピーするか、Linuxから移行先のNASに接続してコピーしてやってください。これで作業は完了です。無事にデータをサルベージすることができました。

 

今回はこの知恵袋に大変助けられました。ext4に見えてるけどマウントできないってのはディスクのパーティション、フォーマット構成をちゃんと理解して解析すれば普通に対応できたのかもしれません。が、今回はdebugfsなるツールが大活躍でした。USB-SATA変換ケーブルも相性というか読める読めないが出てくるんですね…早めに買い換えないといけません。