組み込み Linux の入門 4-1- ライチパイ ナノは TF カードを使用して Linux を実行します

以下の内容は必要なメモの一部です。最も詳細な内容については、Lichee pie の公式ドキュメントを参照してください: http://nano.lichee.pro/get_started/first_eat.html

[簡単] ワンクリックスクリプトを使用してTFカードにシステムを構築します

  1. 次の場所に移動して、Lichee Nano フォルダーのすべてのコンテンツをダウンロードします: https://pan.baidu.com/s/1smzuGS9

  2. Lichee Nano/Mirrorに移動し、必要なファームウェアを見つけます。ここで使用するNano_pub_V4.zip

  3. 解凍し、その下に画像ファイルを入力して必要な画像を見つけます。ここでは Nano_tf_800480.dd を使用します。

  4. TF カードを差し込み、dd コマンドを使用してイメージを TF カードにコピーします (Windows ユーザーは Win32DiskImager ソフトウェアを使用して書き込みます)。

    sudo dd of=tf卡路径 if=镜像文件路径
    

完了しました。単純に使用するだけの場合は、次のプロセスは見ないでください。この方法には問題があります。つまり、ルート ディレクトリの空き容量が 200M 未満であり、TF カードの空き容量はすべて使用されていません。は使用できませんが、単純なアプリケーションにも適しています。公式ドキュメントにもこの問題の解決策が記載されています。「イメージ パッケージのワンクリック書き込み」の章を参照してください。

[複雑] Litchi PieのTFカードにシステムを手動で構築する

コンパイルに使用したホストマシンはubuntu20.04です

1.クロスコンパイルチェーンをインストールする

# 此处为获取7.2.1版本,您可获取其他版本或者通过链接直接下载
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz

tar -vxJf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
sudo cp -r ./gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi /opt/

sudo vi /etc/bash.bashrc

# 在文件末尾 添加以下内容
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
# 添加完毕

# 使路径生效
source /etc/bash.bashrc

#查询版本进行测试,如果成功会打印版本信息
arm-linux-gnueabi-gcc -v

2. u-boot を取得してコンパイルします。

  1. Uブートを入手する

    sudo apt-get install git
    git clone https://github.com/Lichee-Pi/u-boot.git
    cd u-boot
    
    # 查看分支
    git branch -a
    # 切换到 Nano 分支
    git checkout nano-v2018.01
    
  2. U-Bootをコンパイルする

    # 此处告知make采用arm-linux-gnueabi下的所有交叉编译工具,目标架构为Arm,设定各项默认配置为 nano 的spiflash支持版
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- licheepi_nano_spiflash_defconfig
    
    # 若不带spi-flash的板子,请换成 licheepi_nano_defconfig
    
    # 进行可视化配置,我没有配置,直接按默认就行了
    make ARCH=arm menuconfig
    
    # 开始编译
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8
    

    コンパイルが完了したら、u-boot ディレクトリで u-boot-sunxi-with-spl.bin ファイルを見つけます。これは書き込み可能なファイルです。

    間違った解決策をいくつか添付してください(私が遭遇したすべて)

    # 如果在可视化配置时提示 <command-line>: fatal error: curses.h: No such file or directory,进行如下一步来安装支持环境
    sudo apt-get install libncurses5-dev libncursesw5-dev
    
    # 如果在编译时提示/bin/sh: 1: python: not found,安装python即可
    sudo apt-get install python
    
    # 如果编译时提示unable to execute 'swig': No such file or directory,安装swig即可
    sudo apt-get install swig
    
    # 如果编译时提示fatal error: Python.h: No such file or directory,安装python-dev
    sudo apt-get install python-dev
    
  3. Allwinner の F1C100 は、U-Boot Litchi Pi Nano を書き込む
    ために使用され、公式は書き込みツール sunxi-tools を提供しています。これは、fel モードでチップをプログラムするために使用されます。
    まず、書き込みツールを入手してコンパイルし、インストールする必要があります。

    # 如果提示缺少libusb.h,要先安装libusb库
    sudo apt-get install libusb-1.0-0-dev
    
    # 如果提示缺少zlib.h,要先安装libusb库
    sudo apt-get install zlib1g-dev libssl-dev
    
    # 获取并编译安装sunxi-tools
    git clone -b f1c100s-spiflash https://github.com/Icenowy/sunxi-tools.git
    cd sunxi-tools
    make && sudo make install
    

    ボード上の spi1 ペリフェラルの cs ピンをプルダウンし、USB を接続して fel モードに入ります。このとき、次のプロセスを実行して u-boot を焼きます。

    # 2.烧进 spi-flash (开机自启)
    sudo sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin所在路径
    

    プログラミングが成功したら、コア ボードの U0RX および U0TX シリアル ポート ピンを介して u-boot コマンド ラインと対話します。デフォルトのボー レートは 115200 です。

3. TFカードシステムパーティションを構築します

TF カード上に 2 つのパーティションを構築する必要があります

パーティション 1 は、FAT としてフォーマットされたシステム起動ファイルとカーネル関連ファイルの保存に使用され、通常は 32MiB のスペースを割り当てるだけで済みます。

  • boot.scr (u-boot がカーネルをロードするようにガイドするファイル)
  • zImage (システムカーネル)
  • suniv-f1c100s-licheepi-nano.dtb (デバイスツリーファイル)

パーティション 2 は、ext4 としてフォーマットされたルート ファイル システムを保存するために使用され、残りのすべての領域を割り当てます。

fdisk ツールを使用してフォーマットする

sudo fdisk -l     # 首先查看电脑上已插入的TF卡的设备号
sudo umount /dev/sdXx # 若自动挂载了TF设备,请先卸载
sudo fdisk /dev/sdX   # 进行分区操作
# 若已存分区即按 d 删除各个分区
# 通过 n 新建分区,第一分区暂且申请为32M(足够大了...),剩下的空间都给第二分区
# w 保存写入并退出
sudo mkfs.vfat /dev/sdX1 # 将第一分区格式化成FAT
sudo mkfs.ext4 /dev/sdX2 # 将第一分区格式化成EXT4

フォーマットされた結果を表示するには、parted コマンドを使用します。

sudo parted -l

4番目に、u-bootの起動スクリプトを設定します。

nano ボードの u-boot の出力コマンド ラインに対応するシリアル ポートを事前に開いておき、ボードの電源が入ったときに Enter キーを押して u-boot コマンド ラインに入り、printenv コマンドを入力して環境変数を表示します。表示される情報は次のとおりです。# の後には、重要な情報の追加の明確化が示されています。

arch=arm                              # 板子的架构
baudrate=115200                       # 命令行串口波特率
board=sunxi
board_name=sunxi
#略去中间大段信息
boot_scripts=boot.scr.uimg boot.scr   # 启动时寻找名为boot.scr.uimg或boot.scr的启动脚本
boot_targets=fel mmc0 usb0 pxe dhcp   # 启动介质的优先级优先从排在前面的介质引导系统
bootcmd=run distro_bootcmd            # 启动时要执行的指令?唔。。。不太明白
#略去后面信息

boot_scripts 変数によると、boot.scr という名前の起動スクリプトを作成し、このスクリプトを TF カードの最初のパーティション (FAT パーティション) に配置する必要があることがわかります。u-boot が起動すると、このスクリプトが見つかります。そしてそれを実行します。

u-boot のコンパイル時に取得した u-boot ソース コードを覚えていますか? その下の tools ディレクトリに、boot.scr の生成に使用できる mkimage ツールがあります。boot.scr を生成するには、まず次のように記述する必要があります。 mkimage の生成を指示するための boot.cmd スクリプト。スクリプトの内容は次のとおりです。

setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
load mmc 0:1 0x80008000 zImage
bootz 0x80008000 - 0x80C00000

setenv コマンドの最初の行は、変数 bootargs (ブート パラメータ) を次のように設定します: tty0 および ttyS0 シリアル ポートを介してブート情報を出力します。ブートが失敗し、ルート ファイルが 2 番目のパーティションにある場合は 5 秒後に再起動します。読み書き可能なTFカード。

2行目はデバイスツリーのdtbファイルをTFから0x80C00000にロードする場所を指定しています(アドレスは公式SDKを参照しています)

3 行目は、圧縮されたカーネル zImage をロードする場所を 0x80008000 に指定します。

4行目はロードアドレスからカーネルを起動するコマンドです。

次に、boot.scr ファイルを生成し、mkimage が存在するディレクトリに入り、次のコマンドを実行します。

mkimage -C none -A arm -T script -d <boot.cmd路径> <boot.scr输出路径>

結果は次のとおりです。

画像-20220324204508595

生成された boot.scr を TF カードの FAT パーティションにコピーします。

5. Linux カーネルをコンパイルする

  1. Linux ソースコードをダウンロードする

    完全なダウンロード コマンドは次のとおりです。

    git clone https://github.com/Icenowy/linux.git
    

    Git pull は非常に遅い場合があるため、次の構成を行うことをお勧めします。

    sudo vim /etc/hosts
    # 添加下面两行
    192.30.253.112  github.com
    151.101.73.194 github.global.ssl.fastly.net
    # 添加完成
    # 可自行通过dns检测网站检测github.global.ssl.fastly.net,更换为更快的ip地址
    

    完全にプルする Linux は非常に大きいため、待ち時間を短縮するために単一レベルのブランチのみをプルすることをお勧めします。

    git clone --depth=1 -b f1c100s-480272lcd-test https://github.com/Icenowy/linux.git
    

    ここでは単層ブランチのみをプルしました

  2. ソースコードを構成する

    wget dl.sipeed.com/LICHEE/Nano/SDK/config # 下载配置文件
    mv config /linux源码目录/.config           # 移动到linux源码主目录并重命名为.config
    
    # 也可以使用以下指令进行进一步的配置
    make ARCH=arm menuconfig
    
  3. ソースコードをコンパイルします
    Linux ソースコードのメインディレクトリに入ったら、次の操作を実行します

    #配置架构,然后使用可视化配置工具对源码进行配置
    make ARCH=arm menuconfig # 这里可以直接退出配置界面,我们用默认配置就行了
    
    #配置编译用的工具链前缀
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j4 #请自行修改编译线程数
    
  4. コンパイル中に発生した問題の記録

    1. コンパイル プロセス中に、特定の構成を有効にするかどうかを尋ねられます。
      これは、構成ファイル内に対応する構成項目がないためです。状況に応じて選択してください。私は常に n を選択します。それらは必要ありません。

    2. 致命的なエラーの示唆: openssl/bio.h: そのようなファイルまたはディレクトリはありません

      sudo apt install libssl-dev # 缺少这个库
      

マシンのパフォーマンスによっては、コンパイルに時間がかかる場合があります。コンパイルが成功すると、次の情報が表示されます。

備考 2022-03-24 221435

この時点で、Linux ソース コード ディレクトリの Arch/arm/boot/ ディレクトリでカーネル イメージ zImage を見つけ、それを TF カードの最初の FAT パーティションにコピーします。

6、デバイスツリーを構成する

公式ドキュメントの「デバイス ツリーへのノードの追加」の章には詳細な紹介があり、必要に応じて自分で確認できます。コアボードのみを使用するため、dts ファイルを設定する必要はなく、直接コンパイルして dtb を生成するだけです。

Licheepi Nanoに対応するdtsファイルは、Linuxソースコードのメインディレクトリにあるarch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtsです。

Linux ソース コードのメイン ディレクトリに移動し、次のコマンドを実行して dtb ファイルをコンパイルします。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- dtbs -j4

コンパイルが成功すると、Linux ソース コードのメイン ディレクトリの Arch/arm/boot/dts/ に suniv-f1c100s-licheepi-nano.dtb ファイルが見つかります (このファイルのファイル名は、先ほどboot.scrを生成したときにboot.cmdに設定したファイル名(ファイル名は同じです)をTFカードのFAT第1パーティションにコピーします。

7、ルートファイルシステムを構築する

buildroot を使用してルート ファイル システムを構築します。プロセスは次のとおりです。

  1. ダウンロードとインストール

    # 获取所需的头文件
    sudo apt install linux-headers-$(uname -r) #uname -r用于获取内核版本号
    
    # 下载、解压、进入目录(这个国外链接下载有点慢)
    wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
    tar xvf buildroot-2017.08.tar.gz
    cd buildroot-2017.08/
    
  2. buildroot ツールを構成する

    # 进入配置界面
    make menuconfig
    
    以下选项为基础配置:
    
    - Target options
      - Target Architecture (ARM (little endian))
      - Target Variant arm926t
    - Toolchain
      - C library (musl) # 使用musl减小最终体积
    - System configuration
      - Use syslinks to /usr .... # 启用/bin, /sbin, /lib的链接
      - Enable root login # 启用root登录
      - Run a getty after boot # 启用登录密码输入窗口
      - (licheepi) Root password # 默认账户为root 密码为licheepi
    另可自行添加或删除指定的软件包
    
  3. コンパイル

    make
    

    コンパイル プロセス中にソフトウェア パッケージをダウンロードする必要があり、マルチスレッド コンパイルをサポートしていないため、コンパイルに時間がかかります (夜間のコンパイルは忘れてください。起きたら問題ありません)。コンパイルされたファイルが出力されます。 buildroot ディレクトリ内の /images/rootfs.tar

    チップ:

    buildroot によるコンパイル中にソフトウェア パッケージのダウンロードが遅すぎる場合は、dl.zip をダウンロードし、その中のソフトウェア パッケージを buildroot の dl ディレクトリに解凍してください (公式ドキュメントの解決策)。

    または、vi を使用して buildroot の .config ファイルを開き、対応する構成を次の内容に切り替えて、ダウンロード用の国内ミラー ステーションに切り替えることも検討できます (個人的にはこの方法をお勧めします)。

    BR2_BACKUP_SITE="http://sources.buildroot.net"
    BR2_KERNEL_MIRROR="https://mirror.bjtu.edu.cn/kernel/"
    BR2_GNU_MIRROR="http://mirrors.nju.edu.cn/gnu/"
    BR2_LUAROCKS_MIRROR="https://luarocks.cn"
    BR2_CPAN_MIRROR="http://mirrors.nju.edu.cn/CPAN/"
    
  4. コンパイル時の問題解決記録

    1. エラー「gnulib freadahead.c をプラットフォームに移植してください! 同様のエラー

      # 进入buildroot下的如下目录
      cd output/build/host-m4-1.4.18/
      
      # 执行如下指令(查了半天,没搞懂是干嘛的)
      sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
      
      # 在lib/stdio-impl.h文件最后新增一行#define _IO_IN_BACKUP 0x100
      echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
      
      # 之后返回buildroot主目录执行make继续编译
      
      # stackoverflow上一位老哥说了出现这个问题的原因,不知道是不是对的
      # This was an interoperability problem between GNU m4 1.4.18 and 
      # newer glibc header files.
      # It is fixed in GNU m4 1.4.19, available from 
      # https://ftp.gnu.org/gnu/m4/ and the GNU mirrors.
      
      

コンパイル後、buildroot 配下にファイルが出力/images/rootfs.tar されるので、それを TF カードの 2 番目の ext4 パーティションにコピーして解凍します。

チップ!!!

公式ドキュメントには、シリアルポートログインを有効にするには、準備されたルートファイルシステムの etc/inittab ファイルに次のステートメントを追加する必要があると記載されています。

ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL

ここでテストしたところ、追加するとログインが停止することがわかりました。追加しなくても、通常のシリアル ポート ログインには影響しません。実際の状況に応じて自分で検証できます。

8. 検証

TF カードを Litchi Pi nano に挿入し、USB to TTL モジュールを使用して Litchi Pi の U0TX および U0RX シリアル ポートを接続すると、正常に電源がオンになり、ログイン インターフェイスが表示されます。

画像-20220325004013332

ユーザー名 root とパスワード liceepi を使用してログインします。

fdisk コマンドを使用すると、ルート ファイル システムは TF カード内のすべての空き領域をすでに認識できます。

画像-20220325010019140

おすすめ

転載: blog.csdn.net/lczdk/article/details/123747892