大台ヶ原


Date/Time: 2016:05:15 12:23:04
Camera: PENTAX
Model: PENTAX K-5 II s
Exporsure Time: 1/1000
FNumber: 9.0
Aperture Value: 6.3
Focal Length: 21.0

Close

y2blog » BeagleBone用I2S環境の再構築(カーネル構築練習編)

8

24

2019

BeagleBone用I2S環境の再構築(カーネル構築練習編)

Beagle Bone Botic7 環境を自分用にカスタマイズしてみる



Beagle Bone Botic 7 環境をカスタマイズする背景


私のメインのNWオーディオ再生環境は、一般的なRaspberry Pi + Volimio の組み合わせではなく、クライアントシステムとしてBeagleBone Green/Blackの上に、自作のI2S信号インタフェース(Capeボード:Raspberry Pi でいうところの Hat )を載せ、 “デジファイのおと”さんによるMPDベースのレンダラーの”lightMPD with Botic7” を稼働させている.(『beagleboneのbotic kernel』 digifi labo )


サーバシステム側では、PC Engine社のAPU2C4上でCentOS7をKVMホストとして稼働させ、その上にデジタル音源データを配置し、NFSによる音源データの供給を行っている.この組み合わせだけでも、一般的なlightMPDを稼働させるには十分ではあるが、 OpenHomeベースのコントロールアプリに対応できるようにサーバ環境を整えている.


クライアント側の環境はlightMPDなので、そのままではOpenHomeに対応することができない.そこで仮想ホストサーバ上で複数のDebianベースの仮想マシンを動かし、その上で”upmpdci” というMPDベースのレンダラーをUPnP(OpenHome)でコントロールするアプリを稼働させている.


この組み合わせでは、Kazooやfidata Music Appなどのメジャーどころのコントロールアプリを自由に組み合わせることができるので、とても汎用性の高いネットワークオーディオ環境を構築可能だ.


“Botic7″を一言で説明するのは難しいのだが、Beagle Boneのデジタル信号インタフェースピンを通じて、I2S信号や Native DSD信号を出力可能な、高音質デジタルオーディオ再生に的を絞って開発されたもので、Beagle BoneのメインプロセッサであるTI社のSoCチップ “AM3359” に組み込まれている “McASP” というハードウェアベースのデジタルオーディオ信号用のインタフェースモジュールを活用するものだ.


再生用のハードウェアがある訳ではなく、BeagleBone用の高音質なIIS信号出力方式のLinux再生環境(Botic環境用に改造されたLinuxカーネルとドライバモジュール)構築キットと言ったところだろうか.


“Botic7” 環境では、最大で4組(8ch)のI2SPCM信号(4chのDSD信号)をBeagle BoneのGPIO端子を通じて出力することが可能なので、I2S信号に対応したDACモジュールを用意すれば、768kHz/32bitの2ch PCM再生や、5.1chのPCMマルチチャネルオーディオ再生も可能だ.


以前の記事『LightMPD-Boticでマルチチャネル再生を試みる』で、この”Botic7″環境で5.1chのマルチチャネルオーディオ信号再生に挑戦したが、マルチチャネルオーディオ信号のチャネルアサイン問題が発生し、まだこの問題を解決できないでいる.


この問題を解決するには、”Botic7″ のソースコードとLinuxカーネルのサウンドライブラリ、TIによるMcASP関連のソースコードを修正して、Linuxカーネルを再構築する必要がある.


Linuxカーネルの再構築は、組み込み系の開発を行っている人達であればそれ程難しいことではないのだろうが、一般的なLinux系のアプリケーションエンジニアやユーザにとってはかなり勝手の違う世界だ.私も組込み系の開発は殆ど経験が無いド素人なので、今回Linuxカーネルの再構築の練習から始めてみようと思う.



Linuxカーネルの構築の概要


Raspberry Piなどの組み込み用途の小型ボードコンピュータの開発では、カーネルやデバイスドライバ、OSなどの開発を実機の本番環境で行うのはリソースや性能の問題があり現実的ではないので、一般的にはWindowsやLinux, Mac OSなどが稼働するPC上でクロスコンパイル開発環境を整え、PC上で実行環境を構築し、最終的に構築した実行環境をターゲットの小型PCボードに転送する方法が採られる.


今回構築する環境はLinuxベースなので、開発するPC上の環境もLinuxで構築するのが一般的だ.手元のMacやWindowsを使用する場合は、VMWare PlayerやFusionなどで仮想ホスト環境を用意し、その上にUbuntu LinuxなどのLinux開発環境を用意するのが現実的だろう.


カーネルの構築を始めるにあたり、参考になりそうなサイトの情報を幾つか挙げておく.

・TIがBeagleBone Blackに関する開発のための情報をまとめたサイト

  BeagleBone Black Development Board

・ARMが提供しているARMプロセッサ用のクロス開発環境の情報
  GNU Arm Embedded Toolchain

※クロスコンパイラなどのツールチェインやSDKなどで、”armhf”というsuffixを見かけると思うが、”hf” は “Hardware Floatingpoint” を意味している.BeagleBoneBlack/Greenに搭載されているTIのSoC AM3359 のCPUコアである Cortex-A8 にはFloatingPoint Register が搭載されているので、開発ツール類を選択する際は、”hf”対応版の方を選べば良い.


・Robert Nelsonさんが提供している小型コンピュータボードのカーネル構築情報サイト(Digi-KeyのWiki)



このRobert Nelsonさんのサイトの内容に沿って構築していけば、大抵(一般的なLinuxのスキルを持っていれば)の場合比較的容易にLinuxカーネルの再構築を行うことができるだろう.



Robert C. Nelson版Linuxカーネル


Linuxの世界では、ご本家のLinux.orgが開発したLinuxカーネルソースコードをベースに、”Debian”, “Ubuntu”, “RedHat”などのLinux OS ディストリビューションが独自のOS実装を行って無償(サポートは通常有償)で配布していることはご存じのことだろう.


Linuxの世界ではユーザが自由にLinuxカーネルを弄ったり機能を追加したりすることが可能なので、自分たちの利用目的に沿ったカスタマイズが行われており、世の中には非常に多くのLinux実装(ディストリビューション)が出まわっている.


ここで紹介するRobert C. NelsonさんによるLinuxカーネル実装集(Robert C. Nelsonレシピと言った方が分かり易いかな)は小型ボードによるLinux実装の世界では有名らしく、”Botic 7″の実装もこのRobert C. NelsonさんによるLinuxカーネル実装を基にしていると言われている.


世の中には様々なLinuxカーネルの実装が存在しているが、Robert C. NelsonさんのBeagleBone用カーネルを選択するのが無難だろう.


それでは、Robert Nelsonさんのサイトの内容に沿って、実例を示しながらカーネルの再構築を進めて行くことにしよう.このサイトでは2種類のカーネル(メインライン、TIのSDK版ベース?)構築のためのブランチが用意されているが今回はTIのrealtimeブランチを用いてみる.


また、Linuxのディストリビューションの選択は汎用的な “Debian 9” とすることにした.



1.Linuxカーネルの構築


一般的な 64bitのLinux上に開発に必要な各種ツールを実装すれば良いが、手元のPCやMac上でVMWareなどの仮想環境を用意し、その上で64bitのLinuxを稼働させるのが簡単かつ利便性が高いだろう.勿論、Mac OS 環境単独でも開発に必要な環境を用意することは可能だが、想像以上に手間が掛かるので開発環境は素直に64bit系のLinuxを用意するのが無難だ.


今回は、Mac OS上でVMWare Fusion11 を稼働させ、その上で Ubuntu Linux Server 18 LTS 版を用いたが、ディストリビューションによっては追加の開発ツールのインストールが必要になるので、自分で適宜開発ツールをインストールする作業が必要になるだろう.カーネルの構築作業では、カーネルソースのダウンロードや開発ツールのダウンロードなどで結構ディスクスペースを食い潰すので、通常よりも多めにディスクを割り当てて置く方が良いだろう.仮想環境ではディスクスペースやメモリなどのリソースを比較的簡単に拡張することが可能なので、仮想環境での開発を推奨する.


開発ツールのインストール

必要な開発ツール類が開発環境に不足している場合は、この後で実施するカーネル構築スクリプト “build_kernel.sh” の実行がエラーメッセージと共に終了してしまうので、その都度足りない開発ツールをインストールして再度 “build_kernel.sh” を実行する作業を繰り返せば良いのだが、できるだけ最初に必要となるツールをインストールしておく.


Ubuntuのサイトからダウンロードした”ubuntu-18.04.3-live-server-amd64.iso” イメージを用いて、オプションパッケージをインストールしなかった場合の環境では、必要な開発ツールは殆ど何も含まれていないので自分で最初に開発ツールをインストールしておく必要がある.


$ sudo apt-get update
$ sudo apt install build-essential
$ sudo apt-get install lzma gettext bison flex pkg-config libmpc-dev u-boot-tools libncurses5-dev:amd64 libssl-dev:amd64 
$ sudo apt-get install cpio lzop

Robert C. NelsonさんのWikiサイトでは、予め “ARM Cross Compiler: GCC” を linear.org からダウンロードして、そのクロスコンパイラへを環境変数 “CC” に設定しているが、この作業は ブートローダーの “U-Boot” の構築のみで必要となる.


カーネルの構築準備

カーネルを構築するためには面倒で複雑な作業が必要になるが、Robert C. Nelsonさんが GitHub に予めカーネル構築のためのリポジトリを用意してくれているので、それをそのまま使わせて貰うことにする.2種類のカーネルのリポジトリ( “bb-kernel”, “ti-linux-kernel-dev” )が有るのが、今回は “ti-linux-kernel-dev” を選択する.カーネルのバージョンやノーマルカーネル、リアルタイムカーネルなどによって、複数のブランチが用意されているので必要に応じてどれか一つを選べば良い.


【現時点でのカーネルブランチ一覧】

yasuaki@ubuntu18srv:~/bb-kernel$ git branch -r
  origin/3.8.13-xenomai
  origin/HEAD -> origin/master
  origin/am33x-rt-v4.1
  origin/am33x-rt-v4.11
  origin/am33x-rt-v4.13
  origin/am33x-rt-v4.14
  origin/am33x-rt-v4.16
  origin/am33x-rt-v4.18
  origin/am33x-rt-v4.19
  origin/am33x-rt-v4.4
  origin/am33x-rt-v4.6
  origin/am33x-rt-v4.8
  origin/am33x-rt-v4.9
  origin/am33x-rt-v5.0
  origin/am33x-rt-v5.2
  origin/am33x-v3.1
  origin/am33x-v3.11

  ...

  origin/am33x-v4.18
  origin/am33x-v4.19
  origin/am33x-v4.2
  origin/am33x-v4.20
  origin/am33x-v4.3
  origin/am33x-v4.4
  origin/am33x-v4.5
  origin/am33x-v4.6
  origin/am33x-v4.7
  origin/am33x-v4.8
  origin/am33x-v4.9
  origin/am33x-v5.0
  origin/am33x-v5.1
  origin/am33x-v5.2
  origin/am33x-v5.3
  origin/master

yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ git branch -r
  origin/HEAD -> origin/ti-linux-4.14.y
  origin/master
  origin/ti-linux-3.12.y
  origin/ti-linux-3.14.y
  origin/ti-linux-3.8.y
  origin/ti-linux-4.1.y
  origin/ti-linux-4.14.y
  origin/ti-linux-4.19.y
  origin/ti-linux-4.4.y
  origin/ti-linux-4.9.y
  origin/ti-linux-omap2plus-4.1.y
  origin/ti-linux-rt-3.14.y
  origin/ti-linux-rt-4.1.y
  origin/ti-linux-rt-4.14.y
  origin/ti-linux-rt-4.19.y
  origin/ti-linux-rt-4.4.y
  origin/ti-linux-rt-4.9.y
  origin/ti-linux-xenomai-2.6.x-4.4.y
  origin/ti-linux-xenomai-3.14.y
  origin/ti-linux-xenomai-4.14.y
  origin/ti-linux-xenomai-4.4.y
  origin/ti-linux-xenomai-4.9.y
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ 

メインラインの “bb-kernel” では最新のカーネルのバージョンは “5.3” となっている.真ん中に “rt” のサフィックスがついた物はリアルタイムパッチを適用したリアルタイムカーネルということだろう.一方の “ti-linux-kernel-dev” でのカーネルの最新版は “4.19” となっているが、サフィックスに “xenomai” が付いているものがあり、xenomai版のカーネルも選択できるようだ.


今回は、”ti-linux-kernel-dev”版の “ti-linux-rt-4.19.y” ブランチから、カーネルの構築に必要な情報を取得することにする.今回はWikiの内容に沿って、ユーザのホームディレクトリ直下 “~/” に作業用のディレクトリを置く方針とするが、別なディレクトリ配下で作業を行う場合は必要に応じてコマンドや環境変数などの値を書き換えれば良いだろう.


yasuaki@ubuntu18srv:~$ git clone https://github.com/RobertCNelson/ti-linux-kernel-dev.git
Cloning into 'ti-linux-kernel-dev'...
remote: Enumerating objects: 241, done.
remote: Counting objects: 100% (241/241), done.
remote: Compressing objects: 100% (174/174), done.
remote: Total 32343 (delta 149), reused 137 (delta 64), pack-reused 32102
Receiving objects: 100% (32343/32343), 37.44 MiB | 8.44 MiB/s, done.
Resolving deltas: 100% (23656/23656), done.
yasuaki@ubuntu18srv:~$ cd ti-linux-kernel-dev
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ git checkout origin/ti-linux-rt-4.19.y -b tmp
Branch 'tmp' set up to track remote branch 'ti-linux-rt-4.19.y' from 'origin'.
Switched to a new branch 'tmp'
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ 
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ ls -la
total 84
drwxrwxr-x  8 yasuaki yasuaki  4096 Aug 24 04:00 .
drwxr-xr-x  6 yasuaki yasuaki  4096 Aug 24 02:55 ..
drwxrwxr-x  4 yasuaki yasuaki  4096 Aug 24 02:55 3rdparty
-rwxrwxr-x  1 yasuaki yasuaki  5142 Aug 24 04:00 build_deb.sh
-rwxrwxr-x  1 yasuaki yasuaki  7422 Aug 24 04:00 build_kernel.sh
drwxrwxr-x  8 yasuaki yasuaki  4096 Aug 24 04:00 .git
-rw-rw-r--  1 yasuaki yasuaki   226 Aug 24 02:55 .gitignore
-rw-rw-r--  1 yasuaki yasuaki  1111 Aug 24 02:55 LICENSE
drwxrwxr-x 13 yasuaki yasuaki  4096 Aug 24 04:00 patches
-rw-rw-r--  1 yasuaki yasuaki 16130 Aug 24 04:00 patch.sh
-rw-rw-r--  1 yasuaki yasuaki  1103 Aug 24 02:55 readme.md
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 02:55 repo_maintenance
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 02:55 scripts
-rw-rw-r--  1 yasuaki yasuaki  1061 Aug 24 02:55 system.sh.sample
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 04:00 tools
-rw-rw-r--  1 yasuaki yasuaki  1257 Aug 24 04:00 version.sh
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ 

上記の2つのgitコマンド(“git clone”,”git checkout”)を実行すると、オリジナルのLinuxカーネルに適用するパッチ類やカーネル構築のためのスクリプトなどの実行準備が整う.この時点ではLinuxカーネルなどのソースコード類はまだ手元にはなく、この後実行する “build_kernel.sh” というスクリプトによって、クロス開発環境ツールチェインやLinuxカーネルソース、TIが作成したボード関連のソースコードやライブラリなどが自動的にダウンロードされ、カーネルを構築するための環境が整うことになる.


このRobert C. Nelsonさんのカーネル構築環境を利用することで面倒で複雑なカーネル構築手順を簡略化することができ、一般ユーザでも比較的容易にカーネルの構築作業を行うことが可能だ.



カーネルの構築作業

実際のカーネルの構築作業は、”build_kernel.sh” というシェルスクリプトが一連のカーネル構築作業を自動で行ってくれるので、ユーザは吐き出されるメッセージを確認するだけだ.途中、エラーで停止したらその原因を突き止め、エラー原因を取り除いて再度シェルスクリプトを走らせればOKだ.


開発環境の性能やネットワークダウンロード環境にも依るが、カーネルの構築が終了するまで数十分から一時間程度は掛かるのだろう.


yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ ./build_kernel.sh
+ Detected build host [Ubuntu 18.04.3 LTS]
+ host: [x86_64]
+ git HEAD commit: [509eb0d8ebbe58f91750b25ff23e944503fa154d]
-----------------------------
cpio: cpio (GNU cpio) 2.12
lzop: lzop 1.03
'/home/yasuaki/ti-linux-kernel-dev/system.sh.sample' -> '/home/yasuaki/ti-linux-kernel-dev/system.sh'
Installing: 
-----------------------------
--2019-08-24 04:22:09--  https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
Resolving developer.arm.com (developer.arm.com)... 52.138.198.23

  ...   

Saving to: ‘/home/yasuaki/ti-linux-kernel-dev/dl/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz’

 ...

-----------------------------
scripts/git: pulling from: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
From https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
 * branch                      master     -> FETCH_HEAD
Already up to date.
-----------------------------
scripts/git: fetching from: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
remote: Counting objects: 954362, done.
remote: Compressing objects: 100% (211942/211942), done.
Receiving objects: 100% (954362/954362), 659.96 MiB | 4.59 MiB/s, done.
Resolving deltas: 100% (763295/763295), done.
From https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable
 * branch                      master          -> FETCH_HEAD
 * [new tag]                   v2.6.12.1       -> v2.6.12.1
 * [new tag]                   v2.6.12.2       -> v2.6.12.2
 * [new tag]                   v2.6.12.3       -> v2.6.12.3
 
  ...
  
 * [new tag]                   v5.2.8          -> v5.2.8
 * [new tag]                   v5.2.9          -> v5.2.9
Checking out files: 100% (47062/47062), done.
Switched to a new branch 'v4.19.59-ti-rt-r25'
v4.19.59
Starting patch.sh
pulling: [https://github.com/RobertCNelson/ti-linux-kernel.git ti-linux-4.19.y]
remote: Enumerating objects: 10880, done.
remote: Counting objects: 100% (10880/10880), done.
remote: Compressing objects: 100% (1073/1073), done.
remote: Total 13767 (delta 10518), reused 9881 (delta 9807), pack-reused 2887
Receiving objects: 100% (13767/13767), 3.59 MiB | 3.87 MiB/s, done.
Resolving deltas: 100% (11524/11524), completed with 1010 local objects.
From https://github.com/RobertCNelson/ti-linux-kernel
 * branch                      ti-linux-4.19.y -> FETCH_HEAD
Updating 3bd837bfe431..b7ab997cac1c
Fast-forward
 .gitignore                                                                          |    2 +
 Documentation/ABI/testing/sysfs-bus-rpmsg                                           |   29 +
 Documentation/devicetree/bindings/arm/cpus.txt                                      |    2 +
 Documentation/devicetree/bindings/arm/keystone/ti,sci.txt                           |    7 +-
 Documentation/devicetree/bindings/arm/ti/k3.txt                                     |    3 +
 Documentation/devicetree/bindings/clock/ti,sci-clk.txt                              |    7 +
 Documentation/devicetree/bindings/clock/ti,syscon-gate-clock.txt                    |   31 +
 Documentation/devicetree/bindings/crypto/sa2ul.txt                                  |   47 +

  ...

Applying: ARM: omap2: support deasserting reset from dts
dir: packaging
Applying: packaging: sync builddeb changes
dir: readme
Applying: enable: Jenkins: http://gfnd.rcn-ee.org:8080
patch.sh ran successfully
[v4.19.59-ti-rt-r25 08dc0864f94a] 4.19.59-ti-rt-r25 patchset
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
'.config' -> '/home/yasuaki/ti-linux-kernel-dev/patches/ref_omap2plus_defconfig'
'/home/yasuaki/ti-linux-kernel-dev/patches/defconfig' -> '.config'
  UPD     scripts/kconfig/.mconf-cfg
  HOSTCC  scripts/kconfig/mconf.o
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTLD  scripts/kconfig/mconf
scripts/kconfig/mconf  Kconfig
configuration written to .config


カーネル構築スクリプト “build_kernel.sh” の一連の処理が進み、パッチ当て作業が終了すると、テキストベースのカーネル構成メニュー画面が表示される.この構成メニュー画面でカーネル生成に必要な項目をや不要な項目の選定や組み込むカーネルモジュールの指定などを行う.


デジタルオーディオ用途の小型PCボードの場合、高音質化を目指すので有れば必要最小限に絞ってカーネルの構成を決めるが、今回はあまり深いことは考えずに、初期設定で作成されたコンフィグ構成メニューを見ながら適当に設定する.初期標準構成で問題なければ、何も変更を加えずに、そのまま <Exit> すれば良い.


設定項目が膨大かつ内容が良く分からない場合が多いので、一つ一つ内容を確認しながら設定していくのは大変な作業となるので、通常は既にある既存のコンフィグデータをそのまま使うか、少し手を加える程度で済ませることが多い.本番のカーネル構築では、実際の “Botic 7” 環境のコンフィグデータを基に、カーネル構成を行うことになる.



作成するカーネルの構成を設定するカーネルコンフィグメニュー

カーネルコンフィグメニューを終了すると、ダウンロードしたクロスコンパイラツールよるコンパイルリンク作業が始まる.作業が無事完了すると、”deploy” ディレクトリ配下に、カーネルイメージ “xxxxxxxx.zImage” 、tarアーカイブされたカーネルモジュール “xxxxxxxx-modules.tar.gz”、デバイスツリーデータ “xxxxxxxx-dtbs.tar.gz” それにカーネルコンフィグデータ “config-xxxxxxxx” が作成される.


引き続きカーネルのコンパイル、リンク、アーカイブ作業が始まる.


*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.

'.config' -> '/home/yasuaki/ti-linux-kernel-dev/patches/defconfig'
-----------------------------
make -j2 ARCH=arm LOCALVERSION=-ti-rt-r25 CROSS_COMPILE="/home/yasuaki/ti-linux-kernel-dev/dl/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-"  zImage modules
-----------------------------
scripts/kconfig/conf  --syncconfig Kconfig
  SYSHDR  arch/arm/include/generated/uapi/asm/unistd-common.h
  UPD     include/config/kernel.release
  WRAP    arch/arm/include/generated/uapi/asm/bitsperlong.h
  WRAP    arch/arm/include/generated/uapi/asm/bpf_perf_event.h
  WRAP    arch/arm/include/generated/uapi/asm/errno.h
  WRAP    arch/arm/include/generated/uapi/asm/ioctl.h
  WRAP    arch/arm/include/generated/uapi/asm/ipcbuf.h
  WRAP    arch/arm/include/generated/uapi/asm/msgbuf.h
  WRAP    arch/arm/include/generated/uapi/asm/param.h

 ...

  DTC-M   arch/arm/boot/dts/dra76-evm-ov5640.dtb
  DTC-M   arch/arm/boot/dts/dra76-evm-tfp410.dtb
  DTC-M   arch/arm/boot/dts/dra76-evm-tfp410-ov490.dtb
  DTC-M   arch/arm/boot/dts/dra76-evm-tfp410-ov5640.dtb
-----------------------------
'arch/arm/boot/zImage' -> '/home/yasuaki/ti-linux-kernel-dev/deploy/4.19.59-ti-rt-r25.zImage'
'.config' -> '/home/yasuaki/ti-linux-kernel-dev/deploy/config-4.19.59-ti-rt-r25'
-rwxrwxr-x 1 yasuaki yasuaki 9.3M Aug 24 05:42 /home/yasuaki/ti-linux-kernel-dev/deploy/4.19.59-ti-rt-r25.zImage
-----------------------------
Building modules archive...
Compressing 4.19.59-ti-rt-r25-modules.tar.gz...
-rw-rw-r-- 1 yasuaki yasuaki 17M Aug 24 05:42 /home/yasuaki/ti-linux-kernel-dev/deploy/4.19.59-ti-rt-r25-modules.tar.gz
-----------------------------
Building dtbs archive...
Compressing 4.19.59-ti-rt-r25-dtbs.tar.gz...
-rw-rw-r-- 1 yasuaki yasuaki 1.2M Aug 24 05:42 /home/yasuaki/ti-linux-kernel-dev/deploy/4.19.59-ti-rt-r25-dtbs.tar.gz
-----------------------------
Script Complete
eewiki.net: [user@localhost:~$ export kernel_version=4.19.59-ti-rt-r25]
-----------------------------
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ 

構築されたカーネル関連リソースの格納場所を確認する.


yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ ls -la
total 112
drwxrwxr-x 12 yasuaki yasuaki  4096 Aug 24 05:42 .
drwxr-xr-x  6 yasuaki yasuaki  4096 Aug 24 02:55 ..
drwxrwxr-x  4 yasuaki yasuaki  4096 Aug 24 02:55 3rdparty
-rwxrwxr-x  1 yasuaki yasuaki  5142 Aug 24 04:00 build_deb.sh
-rwxrwxr-x  1 yasuaki yasuaki  7422 Aug 24 04:00 build_kernel.sh
-rw-rw-r--  1 yasuaki yasuaki   112 Aug 24 04:34 .CC
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 05:42 deploy
drwxrwxr-x  3 yasuaki yasuaki  4096 Aug 24 04:33 dl
drwxrwxr-x  8 yasuaki yasuaki  4096 Aug 24 04:34 .git
-rw-rw-r--  1 yasuaki yasuaki   226 Aug 24 02:55 .gitignore
drwxrwxr-x  3 yasuaki yasuaki  4096 Aug 24 04:34 ignore
drwxrwxr-x 28 yasuaki yasuaki  4096 Aug 24 05:42 KERNEL
-rw-rw-r--  1 yasuaki yasuaki    18 Aug 24 05:42 kernel_version
-rw-rw-r--  1 yasuaki yasuaki  1111 Aug 24 02:55 LICENSE
drwxrwxr-x 13 yasuaki yasuaki  4096 Aug 24 04:00 patches
-rw-rw-r--  1 yasuaki yasuaki 16130 Aug 24 04:00 patch.sh
-rw-rw-r--  1 yasuaki yasuaki  1103 Aug 24 02:55 readme.md
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 02:55 repo_maintenance
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 02:55 scripts
-rw-rw-r--  1 yasuaki yasuaki  1061 Aug 24 04:22 system.sh
-rw-rw-r--  1 yasuaki yasuaki  1061 Aug 24 02:55 system.sh.sample
drwxrwxr-x  2 yasuaki yasuaki  4096 Aug 24 04:00 tools
-rw-rw-r--  1 yasuaki yasuaki  1257 Aug 24 04:00 version.sh
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ cat kernel_version
4.19.59-ti-rt-r25
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ cd deploy
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev/deploy$ ls -la
total 27796
drwxrwxr-x  2 yasuaki yasuaki     4096 Aug 24 05:42 .
drwxrwxr-x 12 yasuaki yasuaki     4096 Aug 24 05:42 ..
-rw-rw-r--  1 yasuaki yasuaki  1161629 Aug 24 05:42 4.19.59-ti-rt-r25-dtbs.tar.gz
-rw-rw-r--  1 yasuaki yasuaki 17410187 Aug 24 05:42 4.19.59-ti-rt-r25-modules.tar.gz
-rwxrwxr-x  1 yasuaki yasuaki  9718008 Aug 24 05:42 4.19.59-ti-rt-r25.zImage
-rw-rw-r--  1 yasuaki yasuaki   156685 Aug 24 05:42 config-4.19.59-ti-rt-r25
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev/deploy$ 


BeagleBone用Linux実行環境の構築


これまでの一連の作業で、Linuxカーネル、カーネルモジュール、DTBファイルが用意できたとことになるが、この状態ではまだLinux OSとして起動することはできない.Linux OS として使えるようにするには、まだまだ周辺環境を整えて行かなければならない.


我々が一般的に使っているCentOSやDebianなどのLinux OSは、Linuxカーネルと共に、OSとしての基本的な機能を実行する各種モジュール(アプリケーション)を追加した、Linux OSディストリビューションパッケージとして配布されている物である.


PC上でCentOSなどの汎用的なLinux ディストリビューションをインストールして稼働させるには、ユーザが自分のPCハードウェアの構成や特徴を把握できていなくても、インストーラが殆ど全自動で対応してくれるので特に難しいことはないが、BeagleBoneなどの小型コンピュータボードでは、ユーザ側でハードウェアの構成を踏まえた上で必要なモジュールやパッケージを組み込んで行く必要がある.


今回はBeagleBoneの標準的なLinux OS である “Debian” を用いることにする.現時点での最新バージョンは “Debian 10 (buster)” であるが、ここでは Robert C. Nelsonさんのサイトに置かれている “Debian 9 (Stretch)” : https://rcn-ee.com/rootfs/eewiki/minfs/debian-9.9-minimal-armhf-2019-08-11.tar.xz を用いる.


取得した “Debian 9” のミニマルイメージはこの後のSD Card上へのOS起動ディストリビューション作成プロセスで用いるので、ホームディレクトリ上に展開しておく.


yasuaki@ubuntu18srv:~$ wget https://rcn-ee.com/rootfs/eewiki/minfs/debian-9.9-minimal-armhf-2019-08-11.tar.xz
--2019-08-24 08:40:35--  https://rcn-ee.com/rootfs/eewiki/minfs/debian-9.9-minimal-armhf-2019-08-11.tar.xz
Resolving rcn-ee.com (rcn-ee.com)... 2600:3c00::f03c:91ff:fe37:6ad5, 45.33.2.10
Connecting to rcn-ee.com (rcn-ee.com)|2600:3c00::f03c:91ff:fe37:6ad5|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 133526916 (127M) [application/x-xz]
Saving to: ‘debian-9.9-minimal-armhf-2019-08-11.tar.xz’

debian-9.9-minimal-armhf-2019-08- 100%[============================================================>] 127.34M  3.06MB/s    in 41s     

2019-08-24 08:41:18 (3.07 MB/s) - ‘debian-9.9-minimal-armhf-2019-08-11.tar.xz’ saved [133526916/133526916]

yasuaki@ubuntu18srv:~$ sha256sum  debian-9.9-minimal-armhf-2019-08-11.tar.xz
ad823fe9ea077722b65963411d26ed17239b2ea11ef77ac2820a089d2743c317  debian-9.9-minimal-armhf-2019-08-11.tar.xz
yasuaki@ubuntu18srv:~$ curl https://rcn-ee.com/rootfs/eewiki/minfs/debian-9.9-minimal-armhf-2019-08-11.tar.xz.sha256sum
ad823fe9ea077722b65963411d26ed17239b2ea11ef77ac2820a089d2743c317  debian-9.9-minimal-armhf-2019-08-11.tar.xz
yasuaki@ubuntu18srv:~$
yasuaki@ubuntu18srv:~$ tar xvf debian-9.9-minimal-armhf-2019-08-11.tar.xz
./debian-9.9-minimal-armhf-2019-08-11/
./debian-9.9-minimal-armhf-2019-08-11/user_password.list
./debian-9.9-minimal-armhf-2019-08-11/image-builder.project
./debian-9.9-minimal-armhf-2019-08-11/armhf-rootfs-debian-stretch.tar
yasuaki@ubuntu18srv:~$ 


ブートローダ:U-Boot の構築

OSのブートローダも様々な物があるが、今回はDebian系のOSの汎用ブートローダとして一般的な U-Boot を用いることにする.GitHub上に置かれているので、カーネル構築の時と同じ様にU-Bootのソースコードを取得しパッチを当てておく.


GitHubのリポジトリ “https://github.com/u-boot/u-boot” のブランチ情報と、Robert C. NelsonさんのWikiのブランチ情報に食い違いがあり、”v2019.04″ というブランチは現在存在しない?ようだが、とりあえず “git checkout v2019.04 -b tmp” を実施している.パッチ当て作業自体は問題なく完了するので、とりあえずこのまま作業を進める.


yasuaki@ubuntu18srv:~$ git clone https://github.com/u-boot/u-boot
Cloning into 'u-boot'...
remote: Enumerating objects: 637954, done.
remote: Total 637954 (delta 0), reused 0 (delta 0), pack-reused 637954
Receiving objects: 100% (637954/637954), 159.96 MiB | 9.40 MiB/s, done.
Resolving deltas: 100% (520067/520067), done.
Checking out files: 100% (15583/15583), done.
yasuaki@ubuntu18srv:~$ cd u-boot/
yasuaki@ubuntu18srv:~/u-boot$ git branch -r
  origin/HEAD -> origin/master
  origin/WIP/19Aug2019
  origin/master
  origin/next
  origin/origin
  origin/u-boot-2009.11.y
  origin/u-boot-2013.01.y
  origin/u-boot-2016.09.y
yasuaki@ubuntu18srv:~/u-boot$
yasuaki@ubuntu18srv:~/u-boot$ wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
  ...
yasuaki@ubuntu18srv:~/u-boot$ wget -c https://github.com/eewiki/u-boot-patches/raw/master/v2019.04/0002-U-Boot-BeagleBone-Cape-Manager.patch
 ...

yasuaki@ubuntu18srv:~/u-boot$ git checkout v2019.04 -b tmp
Switched to a new branch 'tmp'
yasuaki@ubuntu18srv:~/u-boot$ ls -la
total 592
drwxrwxr-x  26 yasuaki yasuaki   4096 Aug 24 10:03 .
drwxr-xr-x   8 yasuaki yasuaki   4096 Aug 24 10:02 ..
-rw-rw-r--   1 yasuaki yasuaki  39725 Aug 24 10:03 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
-rw-rw-r--   1 yasuaki yasuaki  30640 Aug 24 10:03 0002-U-Boot-BeagleBone-Cape-Manager.patch
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:03 api
drwxrwxr-x  15 yasuaki yasuaki   4096 Aug 24 10:03 arch
drwxrwxr-x 196 yasuaki yasuaki   4096 Aug 24 10:03 board
-rw-rw-r--   1 yasuaki yasuaki    684 Aug 24 10:02 .checkpatch.conf
drwxrwxr-x   5 yasuaki yasuaki   4096 Aug 24 10:03 cmd
drwxrwxr-x   5 yasuaki yasuaki   4096 Aug 24 10:03 common
-rw-rw-r--   1 yasuaki yasuaki   2196 Aug 24 10:02 config.mk
drwxrwxr-x   2 yasuaki yasuaki  73728 Aug 24 10:03 configs
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:03 disk
drwxrwxr-x  10 yasuaki yasuaki  12288 Aug 24 10:03 doc
drwxrwxr-x   6 yasuaki yasuaki   4096 Aug 24 10:03 Documentation
drwxrwxr-x  62 yasuaki yasuaki   4096 Aug 24 10:03 drivers
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:03 dts
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:03 env
drwxrwxr-x   4 yasuaki yasuaki   4096 Aug 24 10:02 examples
drwxrwxr-x  13 yasuaki yasuaki   4096 Aug 24 10:03 fs
drwxrwxr-x   8 yasuaki yasuaki   4096 Aug 24 10:03 .git
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:02 .github
-rw-rw-r--   1 yasuaki yasuaki    885 Aug 24 10:03 .gitignore
drwxrwxr-x  29 yasuaki yasuaki  20480 Aug 24 10:03 include
-rw-rw-r--   1 yasuaki yasuaki   1863 Aug 24 10:02 Kbuild
-rw-rw-r--   1 yasuaki yasuaki  18515 Aug 24 10:03 Kconfig
drwxrwxr-x  17 yasuaki yasuaki   4096 Aug 24 10:03 lib
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:02 Licenses
-rw-rw-r--   1 yasuaki yasuaki   1448 Aug 24 10:03 .mailmap
-rw-rw-r--   1 yasuaki yasuaki  20169 Aug 24 10:03 MAINTAINERS
-rw-rw-r--   1 yasuaki yasuaki  67207 Aug 24 10:03 Makefile
drwxrwxr-x   2 yasuaki yasuaki   4096 Aug 24 10:03 net
drwxrwxr-x   5 yasuaki yasuaki   4096 Aug 24 10:03 post
-rw-rw-r--   1 yasuaki yasuaki 179023 Aug 24 10:03 README
drwxrwxr-x   6 yasuaki yasuaki   4096 Aug 24 10:03 scripts
drwxrwxr-x  12 yasuaki yasuaki   4096 Aug 24 10:03 test
drwxrwxr-x  15 yasuaki yasuaki   4096 Aug 24 10:03 tools
-rw-rw-r--   1 yasuaki yasuaki  16444 Aug 24 10:03 .travis.yml
yasuaki@ubuntu18srv:~/u-boot$ 
yasuaki@ubuntu18srv:~/u-boot$ patch -p1 < 0001-am335x_evm-uEnv.txt-bootz-n-fixes.patch
patching file arch/arm/include/asm/arch-am33xx/hardware_am33xx.h
patching file arch/arm/include/asm/arch-am33xx/sys_proto.h
patching file arch/arm/mach-omap2/am33xx/board.c
patching file arch/arm/mach-omap2/am33xx/clock_am33xx.c
patching file arch/arm/mach-omap2/hwinit-common.c
patching file board/ti/am335x/board.c
patching file board/ti/am335x/board.h
patching file board/ti/am335x/mux.c
patching file configs/am335x_evm_defconfig
patching file env/common.c
patching file include/configs/am335x_evm.h
patching file include/configs/ti_armv7_common.h
patching file include/environment/ti/mmc.h
yasuaki@ubuntu18srv:~/u-boot$ patch -p1 < 0002-U-Boot-BeagleBone-Cape-Manager.patch
patching file board/ti/am335x/board.c
patching file board/ti/am335x/board.h
patching file board/ti/am335x/hash-string.h
patching file include/configs/ti_armv7_common.h
patching file include/configs/ti_armv7_omap.h
patching file include/environment/ti/mmc.h
yasuaki@ubuntu18srv:~/u-boot$ 

カーネル構築の際に取得したクロスコンパイラのパスをシェルの環境変数 "CC" に設定しておく.Rober C. NelsonさんのWikiでは、カーネル構築の前に別途クロスコンパイラツールを自分でダウンロードしてU-Bootの構築を行っているが、この記事では敢えてU-Boot構築作業をカーネル構築後に行い、1種類のクロスコンパイラだけで賄えるようにしている.


カーネル構築の際に使用したクロスコンパイラに関する情報は、カーネル構築時のベースディレクトリ(今回は "~/ti-linux-kernel-dev/")に、".CC" というファイル名でクロスコンパイラのパス情報が残されているので、この情報を利用することにする.


yasuaki@ubuntu18srv:~$ cat ~/ti-linux-kernel-dev/.CC
CC=/home/yasuaki/ti-linux-kernel-dev/dl/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ export CC=/home/yasuaki/ti-linux-kernel-dev/dl/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ echo $CC
/home/yasuaki/ti-linux-kernel-dev/dl/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
yasuaki@ubuntu18srv:~/ti-linux-kernel-dev$ 
yasuaki@ubuntu18srv:~$ cd u-boot

yasuaki@ubuntu18srv:~/u-boot$ make ARCH=arm CROSS_COMPILE=${CC} distclean
yasuaki@ubuntu18srv:~/u-boot$ make ARCH=arm CROSS_COMPILE=${CC} am335x_evm_defconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  YACC    scripts/kconfig/zconf.tab.c
  LEX     scripts/kconfig/zconf.lex.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
yasuaki@ubuntu18srv:~/u-boot$ make ARCH=arm CROSS_COMPILE=${CC}
scripts/kconfig/conf  --syncconfig Kconfig
  CHK     include/config.h
  UPD     include/config.h
  CFG     u-boot.cfg
  GEN     include/autoconf.mk
  GEN     include/autoconf.mk.dep
  CFG     spl/u-boot.cfg
  GEN     spl/include/autoconf.mk
  CHK     include/config/uboot.release
  UPD     include/config/uboot.release
 
 ...
   
  CC      spl/fs/fs_internal.o
  LD      spl/fs/built-in.o
  LDS     spl/u-boot-spl.lds
  LD      spl/u-boot-spl
  OBJCOPY spl/u-boot-spl-nodtb.bin
  COPY    spl/u-boot-spl.bin
  MKIMAGE MLO
  MKIMAGE MLO.byteswap
===================== WARNING ======================
This board does not use CONFIG_DM_MMC. Please update
the board to use CONFIG_DM_MMC before the v2019.04 release.
Failure to update by the deadline may result in board removal.
See doc/driver-model/MIGRATION.txt for more info.
====================================================

...

===================== WARNING ======================
This board does not use CONFIG_DM_SPI_FLASH. Please update
the board to use CONFIG_SPI_FLASH before the v2019.07 release.
Failure to update by the deadline may result in board removal.
See doc/driver-model/MIGRATION.txt for more info.
====================================================
  CFGCHK  u-boot.cfg
yasuaki@ubuntu18srv:~/u-boot$ 

警告メッセージが出力されているが、"MIGRATION.txt" の情報では、U-Bootの "driver model" を新しい方式に変更するので期限(2019年7月)までに新しい方式に書き換えろということのようだ.とりあえず今回は旧式のままでU-Bootを使うことにする.



SD Card版 Debian 9 起動パッケージの作成


Linuxカーネルの構築の最終段階の作業として、作成したLinuxカーネル、カーネルモジュール、DTBファイルやブートローダーなどをターゲットである BeagleBone などのボードコンピュータ上で起動可能な Linux OS 環境として構築しなければならない.BeagleBone Black/Green の場合、ボードに上に実装されている MMCと呼ばれている不揮発性のメモリディスクか、マイクロSDカードなどからOSを起動させる事が可能だ.


今回はカーネル構築の練習なので、マイクロSDカードに直接 Debian Linux 環境を構築することにする.マイクロSDカード上に構築する手順についても、Robert C. Nelsonさんのwikiに詳細な手順が載っているので、それに従って作業を進めて行くことにする.


TIが提供しているSDKツールやサードパーティ製の高機能開発環境を使えばもっと簡単にターゲットデバイス上へ構築した環境を書き込んで実行テストやデバッグを行う事が可能だが、手作業で行うことで小型ボード環境下でのLinuxの取り扱いを習熟するという意味でも丁度良い.


手元のPCやMac上で利用可能なマイクロSDカードリーダ・ライタを用意し、仮想環境上に構築した開発環境(Ubuntu Server 18)側から、このマイクロSDカードリーダ・ライタを読み書き可能な状態にする.(この辺の操作方法は各自の環境に依存するので、使用している仮想環境やゲストOSであるLinux開発ホスト上での取り扱い方法は各自で調べる必要がある)


LinuxゲストOSでマイクロSDカードがどのブロックデバイス名で認識されているか確認する

LinuxゲストOS側にマイクロSDカードを接続(VMWare等の仮想環境では、USB接続されたデバイスを簡単な操作で、ホストOS側とゲストOS側に切り替えることが可能)する.今回は、エレコム製のUSBタイプのSDカードリーダを接続用いる.この状態で、ゲストOS側で"lsblk" コマンドを実行する.





USB SDカードリーダを VMWare FusionのUSB接続切り替え機能を用いてゲストOS側に切り替える

yasuaki@ubuntu18srv:~$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 88.5M  1 loop /snap/core/7270
sda      8:0    0   32G  0 disk 
├─sda1   8:1    0  512M  0 part /boot/efi
└─sda2   8:2    0 31.5G  0 part /
sdb      8:16   1  7.4G  0 disk 
└─sdb1   8:17   1  7.4G  0 part 
sr0     11:0    1 1024M  0 rom  
yasuaki@ubuntu18srv:~$ export DISK=/dev/sdb

今回のゲストOSである Unbuntu Server 18 では、USBタイプのSDカードリーダは "/dev/sdb" のブロックデバイスとして認識されていることが確認できる.今後の作業でこのSDカードリーダデバイス名を何度も使用することになるので、このデバイスのデバイス名をsシェル環境変数 "DISK" として設定しておく.


SDカードの初期化&Linuxファイルシステムの作成

使い古しのSDカードを初期化して使う場合、単純にOSのフォーマット機能によって初期化しただけではディスクのパーティション構造などが中途半端に残って悪さをしてしまう場合があるので、最初に全ての領域をゼロリセットしておくことが理想だが、時間が掛かるので、時間が無い場合は先頭の数MByteだけでもゼロクリアしておくと良いだろう.


通常はこの作業により、MBRやパーティション情報などが破壊されるので、OSからはパーティションもファイルシステムも作成されていない無垢なディスクとして認識されるようになる.この作業は、LinuxやMac OS などで "dd" コマンドを使って簡単に実行可能だが、"dd"コマンドはターゲットの指定先 "of=xxxx" を間違えると、悲惨な事になるので作業は慎重に行う必要がある.


・ゼロクリア&ディスクパーティションツールのバージョン確認

yasuaki@ubuntu18srv:~$ sudo dd if=/dev/zero of=${DISK} bs=4M 
dd: error writing '/dev/sdb': No space left on device
1896+0 records in
1895+0 records out
7948206080 bytes (7.9 GB, 7.4 GiB) copied, 1592.18 s, 5.0 MB/s
yasuaki@ubuntu18srv:~$
yasuaki@ubuntu18srv:~$ sudo sfdisk --version
sfdisk from util-linux 2.31.1
yasuaki@ubuntu18srv:~$ 


・ブートローダー関連ファイルの書き込み

yasuaki@ubuntu18srv:~$ sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k
[sudo] password for yasuaki: 
0+1 records in
0+1 records out
92280 bytes (92 kB, 90 KiB) copied, 0.0125022 s, 7.4 MB/s
yasuaki@ubuntu18srv:~$ sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k
1+1 records in
1+1 records out
474192 bytes (474 kB, 463 KiB) copied, 0.035559 s, 13.3 MB/s
yasuaki@ubuntu18srv:~$ 

・ディスクパーティションツールによるパーティション作成& "ext4" ファイルシステムの作成

yasuaki@ubuntu18srv:~$ sudo sfdisk ${DISK} <<-__EOF__
> 4M,,L,*
> __EOF__
Checking that no-one is using this disk right now ... OK

Disk /dev/sdb: 7.4 GiB, 7948206080 bytes, 15523840 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: 0x530e4a58

Old situation:

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1  *     8192 15523839 15515648  7.4G 83 Linux

>>> Created a new DOS disklabel with disk identifier 0x055d1e33.
/dev/sdb1: Created a new partition 1 of type 'Linux' and of size 7.4 GiB.
/dev/sdb2: Done.

New situation:
Disklabel type: dos
Disk identifier: 0x055d1e33

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1  *     8192 15523839 15515648  7.4G 83 Linux

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
yasuaki@ubuntu18srv:~$
yasuaki@ubuntu18srv:~$ sudo mkfs.ext4 -V
mke2fs 1.44.1 (24-Mar-2018)
	Using EXT2FS Library version 1.44.1
yasuaki@ubuntu18srv:~$ sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1
mke2fs 1.44.1 (24-Mar-2018)
Creating filesystem with 1939456 4k blocks and 485760 inodes
Filesystem UUID: fc7160a0-c1bb-4ecb-aea4-f2bccf8098a1
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

yasuaki@ubuntu18srv:~$
yasuaki@ubuntu18srv:~$ sudo mkdir -p /media/rootfs/
yasuaki@ubuntu18srv:~$ sudo mount ${DISK}1 /media/rootfs/

・カーネルバージョンストリングを環境変数 "kernel_version"に設定する

yasuaki@ubuntu18srv:~$ export kernel_version=`cat ~/ti-linux-kernel-dev/kernel_version`
yasuaki@ubuntu18srv:~$ echo $kernel_version
4.19.59-ti-rt-r25
yasuaki@ubuntu18srv:~$ 

・Debian Linux ルートファイルのコピー

yasuaki@ubuntu18srv:~$ sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/
./
./var/
./var/opt/
./var/cache/
./var/cache/ldconfig/
./var/cache/ldconfig/aux-cache
./var/cache/debconf/
./var/cache/debconf/config.dat-old
./var/cache/debconf/templates.dat
./var/cache/debconf/templates.dat-old
./var/cache/debconf/config.dat
./var/cache/debconf/passwords.dat
./var/cache/apt/

...

./etc/rc4.d/S01nginx
./etc/rc4.d/S01rsyslog
./etc/hostapd/
./etc/hostapd/ifupdown.sh
./media/
./run/
yasuaki@ubuntu18srv:~$ sync
yasuaki@ubuntu18srv:~$ sudo chown root:root /media/rootfs/
yasuaki@ubuntu18srv:~$ sudo chmod 755 /media/rootfs/

・カーネル起動設定ファイル "uEnv.txt" へカーネルバージョンストリングを設定

yasuaki@ubuntu18srv:~$ sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

・カーネルイメージ&カーネルデバイスツリーバイナリ(DTB)のコピー

yasuaki@ubuntu18srv:~$ sudo cp -v ./ti-linux-kernel-dev/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}
'./ti-linux-kernel-dev/deploy/4.19.59-ti-rt-r25.zImage' -> '/media/rootfs/boot/vmlinuz-4.19.59-ti-rt-r25'
yasuaki@ubuntu18srv:~$ sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/
yasuaki@ubuntu18srv:~$ sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/
./am335x-abbbi.dtb
./am335x-baltos-ir2110.dtb
./am335x-baltos-ir3220.dtb
./am335x-baltos-ir5221.dtb
./am335x-base0033.dtb
./am335x-bone-uboot-univ.dtb
./am335x-bone.dtb

 ...

./omap5-igep0050.dtb
./omap5-sbc-t54.dtb
./omap5-uevm.dtb
yasuaki@ubuntu18srv:~$ 


・カーネルモジュールのコピー

yasuaki@ubuntu18srv:~$ sudo tar xfv ./ti-linux-kernel-dev/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/
./lib/
./lib/modules/
./lib/modules/4.19.59-ti-rt-r25/
./lib/modules/4.19.59-ti-rt-r25/modules.devname
./lib/modules/4.19.59-ti-rt-r25/modules.builtin
 
 ...

./lib/modules/4.19.59-ti-rt-r25/modules.order
./lib/modules/4.19.59-ti-rt-r25/modules.dep
./lib/modules/4.19.59-ti-rt-r25/modules.builtin.bin
./lib/modules/4.19.59-ti-rt-r25/build
yasuaki@ubuntu18srv:~$ 

・Linux ルートファイルシステムのマウント設定("/etc/fstab")

yasuaki@ubuntu18srv:~$ sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

・ネットワーク設定("/etc/network/interfaces")

auto lo
iface lo inet loopback
  
auto eth0
iface eth0 inet dhcp

・内蔵のネットワークデバイス名を "eth0" に固定する("/etc/udev/rules.d/70-persistent-net.rules")

# BeagleBone: net device ()
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

・SDカードのアンマウント

yasuaki@ubuntu18srv:~$ sync
yasuaki@ubuntu18srv:~$ sudo umount /media/rootfs
yasuaki@ubuntu18srv:~$ 


BeagleBone上で起動確認


マイクロSDカード上に作成したBeagleBone用のRealtime Kernel版 Debian Linux 9.9 がBeagleBoneの実機上で正常に起動できれば、カーネル構築は成功だ.



U-Boot SPL 2015.01-00001-gb2412df (Jan 29 2015 - 15:01:06)
reading args
spl_load_image_fat_os: error reading image args, err - -1
reading u-boot.img
reading u-boot.img


U-Boot 2015.01-00001-gb2412df (Jan 29 2015 - 15:01:06), Build: jenkins-github_Bootloader-Builder-105

       Watchdog enabled
I2C:   ready
DRAM:  512 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
Using default environment

Net:    not set. Validating first E-fuse MAC
cpsw
Hit any key to stop autoboot:  0
gpio: pin 53 (gpio 53) value is 1
switch to partitions #0, OK
mmc0 is current device
gpio: pin 54 (gpio 54) value is 1
Checking for: /uEnv.txt ...
Checking for: /boot.scr ...
Checking for: /boot/boot.scr ...
Checking for: /boot/uEnv.txt ...
gpio: pin 55 (gpio 55) value is 1
26 bytes read in 16 ms (1000 Bytes/s)
Loaded environment from /boot/uEnv.txt
Checking if uname_r is set in /boot/uEnv.txt...
gpio: pin 56 (gpio 56) value is 1
Running uname_boot ...
loading /boot/vmlinuz-4.19.59-ti-rt-r25 ...
9718008 bytes read in 547 ms (16.9 MiB/s)
loading /boot/dtbs/4.19.59-ti-rt-r25/am335x-boneblack.dtb ...
59403 bytes read in 54 ms (1 MiB/s)
debug: [console=ttyO0,115200n8 root=/dev/mmcblk0p1 ro rootfstype=ext4 rootwait fixrtc] ...
debug: [bootz 0x82000000 - 0x88000000] ...
Kernel image @ 0x82000000 [ 0x000000 - 0x9448f8 ]
## Flattened Device Tree blob at 88000000
   Booting using the fdt blob at 0x88000000
   Loading Device Tree to 8ffee000, end 8ffff80a ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.19.59-ti-rt-r25 (yasuaki@ubuntu18srv) (gcc version 8.3.0 (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36))) #1 SMP PREEMPT RT Sat Aug 24 05:10:34 UTC 2019
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: TI AM335x BeagleBone Black
[    0.000000] Memory policy: Data cache writeback
[    0.000000] cma: Reserved 48 MiB at 0x9c800000
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] AM335X ES2.1 (sgx neon)
[    0.000000] random: get_random_bytes called from start_kernel+0xa0/0x508 with crng_init=0
[    0.000000] percpu: Embedded 18 pages/cpu s44640 r8192 d20896 u73728
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 129412
[    0.000000] Kernel command line: console=ttyO0,115200n8 root=/dev/mmcblk0p1 ro rootfstype=ext4 rootwait fixrtc
[    0.000000] Dentry cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 447580K/522240K available (12288K kernel code, 1070K rwdata, 4104K rodata, 1024K init, 352K bss, 25508K reserved, 49152K cma-reserved, 0K highmem)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)

  ...

[   10.596925] omap_rtc 44e3e000.rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
[   10.598172] ALSA device list:
[   10.598182]   No soundcards found.
[   10.634727] remoteproc remoteproc0: Booting fw image am335x-pm-firmware.elf, size 217168
[   10.645684] remoteproc remoteproc0: remote processor wkup_m3 is now up
[   10.645734] wkup_m3_ipc 44e11324.wkup_m3_ipc: CM3 Firmware Version = 0x193
[   10.677322] EXT4-fs (mmcblk0p1): mounted filesystem with ordered data mode. Opts: (null)
[   10.685811] VFS: Mounted root (ext4 filesystem) readonly on device 179:1.
[   10.694082] devtmpfs: mounted
[   10.704258] Freeing unused kernel memory: 1024K
[   10.709483] Run /sbin/init as init process
[   11.157914] systemd[1]: System time before build time, advancing clock.
[   11.272725] systemd[1]: systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[   11.292054] systemd[1]: Detected architecture arm.

Welcome to Debian GNU/Linux 9 (stretch)!

[   11.320654] systemd[1]: Set hostname to .
[   12.041040] systemd[1]: Reached target Swap.
[  OK  ] Reached target Swap.
[   12.059073] systemd[1]: Listening on fsck to fsckd communication Socket.
[  OK  ] Listening on fsck to fsckd communication Socket.

 ...
 
[  OK  ] Started LSB: set CPUFreq kernel parameters.
[   25.333341] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[  OK  ] Started A high performance web server and a reverse proxy server.

Debian GNU/Linux 9 arm ttyS0

default username:password is [debian:temppwd]

arm login: debian
Password:

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.
debian@arm:~$

Calendar

April 2024
S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930  
  • Blogroll

  • Meta