在基于全志V851se的TinyVision上手动构建 Linux 6.1 + Debian 12 镜像

构建 SyterKit 作为 Bootloader

SyterKit 是一个纯裸机框架,用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板,SyterKit 使用 CMake 作为构建系统构建,支持多种应用与多种外设驱动。同时 SyterKit 也具有启动引导的功能,可以替代 U-Boot 实现快速启动

获取 SyterKit 源码

SyterKit 源码位于GitHub,可以前往下载。

git clone GitHub - YuzukiHD/SyterKit: SyterKit is a baremetal framework, As bootloader, MPU framework, Support T113, V853, H618, T527, Running on SRAM

从零构建 SyterKit

构建 SyterKit 非常简单,只需要在 Linux 操作系统中安装配置环境即可编译。SyterKit 需要的软件包有:

  • gcc-arm-none-eabi
  • CMake

对于常用的 Ubuntu 系统,可以通过如下命令安装

sudo apt-get update
sudo apt-get install gcc-arm-none-eabi cmake build-essential -y

然后新建一个文件夹存放编译的输出文件,并且进入这个文件夹

mkdir build
cd build

然后运行命令编译 SyterKit

cmake ..
make

f6cd8396-6b9e-4171-a32f-b6e908fa1fb9-image.png

编译后的可执行文件位于 build/app 中,这里包括 SyterKit 的多种APP可供使用。

ecd7330e-1281-4296-9de7-0433e12fef2f-image.png

这里我们使用的是 syter_boot 作为启动引导。进入 syter_boot 文件夹,可以看到这些文件

d631adb8-9d69-4f38-99f4-f080a3d04cc4-image.png

由于 TinyVision 是 TF 卡启动,所以我们需要用到 syter_boot_bin_card.bin

0bee1188-3372-4a0a-94c3-5ae19322eab3-image.png

编译 Linux-6.1 内核

由于 Debian 12 配套的内核是 Linux 6.1 LTS,所以这里我们选择构建 Linux 6.1 版本内核。

搭建编译环境

安装一些必要的安装包

sudo apt-get update && sudo apt-get install -y gcc-arm-none-eabi gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf build-essential libncurses5-dev zlib1g-dev gawk flex bison quilt libssl-dev xsltproc libxml-parser-perl mercurial bzr ecj cvs unzip lsof

获取内核源码

内核源码托管在 Github 上,可以直接获取到,这里使用 --depth=1 指定 git 深度为 1 加速下载。

git clone GitHub - YuzukiHD/TinyVision: TinyVision - A Tiny Linux Board / IPC / Server / Router / And so on... --depth=1

然后进入内核文件夹

cd kernel/linux-6.1

配置内核选项

应用 defconfig

CROSS_COMPILE=arm-linux-gnueabihf- make ARCH=arm tinyvision_defconfig

进入 menuconfig 配置选项

CROSS_COMPILE=arm-linux-gnueabihf- make ARCH=arm menuconfig

进入 General Setup ->,选中 Control Group Support

image-20231221104449523

image-20231221122711591

前往 File Systems 找到 FUSE (Filesystem in Userspace) support

image-20231221104607368

前往 File Systems 找到 Inotify support for userspace

image-20231221122848948

编译内核

CROSS_COMPILE=arm-linux-gnueabihf- make ARCH=arm

使用 debootstrap 构建 debian rootfs

准备环境,依赖

下载安装依赖环境

sudo apt install debootstrap qemu qemu-user-static qemu-system qemu-utils qemu-system-misc binfmt-support dpkg-cross debian-ports-archive-keyring --no-install-recommends

生成目标镜像,配置环境,这里我们生成一个 1024M 的镜像文件用于存放 rootfs

dd if=/dev/zero of=rootfs.img bs=1M count=1024
mkdir rootfs
mkfs.ext4 rootfs.img
sudo mount rootfs.img rootfs

开始构建基础 rootfs

这里我们选择最新的 debian12 (bookwarm) 作为目标镜像,使用清华源来构建,输出到目标目录 rootfs_data 文件夹中。新版本的 debootstrap 只需要运行一次即可完成两次 stage 的操作,相较于老版本方便许多。

sudo debootstrap --arch=armhf bookworm rootfs_data Index of /debian/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

image-20231221093653561

看到 I: Base system installed successfully. 就是构建完成了

image-20231221094602269

等待构建完成后,使用chroot进入到目录,这里编写一个挂载脚本方便挂载使用,新建文件 ch-mount.sh 并写入以下内容:

#!/bin/bashfunction mnt() {echo "MOUNTING"sudo mount -t proc /proc ${2}procsudo mount -t sysfs /sys ${2}syssudo mount -o bind /dev ${2}devsudo mount -o bind /dev/pts ${2}dev/pts		sudo chroot ${2}
}function umnt() {echo "UNMOUNTING"sudo umount ${2}procsudo umount ${2}syssudo umount ${2}dev/ptssudo umount ${2}dev}if [ "$1" == "-m" ] && [ -n "$2" ] ;
thenmnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
thenumnt $1 $2
elseecho ""echo "Either 1'st, 2'nd or both parameters were missing"echo ""echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"echo ""echo "For example: ch-mount -m /media/sdcard/"echo ""echo 1st parameter : ${1}echo 2nd parameter : ${2}
fi

然后赋予脚本执行的权限

chmod 777 ch-mount.sh
  • 使用 ./ch-mount.sh -m rootfs_data 挂载
  • 使用 ./ch-mount.sh -u rootfs_data 卸载

执行挂载,可以看到进入了 debian 的 rootfs

image-20231221094725953

配置系统字符集,选择 en_US 作为默认字符集

export LC_ALL=en_US.UTF-8
apt-get install locales
dpkg-reconfigure locales

选择一个就可以

image-20231221095332517

直接 OK 下一步

image-20231221095409399

安装 Linux 基础工具

apt install sudo ssh openssh-server net-tools ethtool wireless-tools network-manager iputils-ping rsyslog alsa-utils bash-completion gnupg busybox kmod wget git curl --no-install-recommends

安装编译工具

apt install build-essential

安装 Linux nerd 工具

apt install vim nano neofetch

设置本机入口 ip 地址

cat <<EOF > /etc/hosts
127.0.0.1       localhost
127.0.1.1       $HOST
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
EOF

配置网卡

mkdir -p /etc/network
cat >/etc/network/interfaces <<EOF
auto lo
iface lo inet loopbackauto eth0
iface eth0 inet dhcp
EOF

配置 DNS 地址

cat >/etc/resolv.conf <<EOF
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF

配置分区

cat >/etc/fstab <<EOF
#<file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mmcblk0p1  /boot   vfat    defaults                0       0
/dev/mmcblk0p2  /       ext4    defaults,noatime        0       1
EOF

配置 root 密码

passwd

配置主机名

echo TinyVision > /etc/hostname

退出 chroot

exit

取消挂载 chroot

./ch-mount.sh -u rootfs_data/

拷贝 rootfs 到镜像中

sudo cp -raf rootfs_data/* rootfs

取消挂载

sudo umount rootfs

至此 debian rootfs 就制作好了。

打包固件

编译完成 bootloader,内核,rootfs 后,还需要打包固件成为可以 dd 写入的固件,这里我们使用 genimage 工具来生成构建。

生成刷机镜像

编译内核后,可以在文件夹 arch/arm/boot/dts/allwinner 生成sun8i-v851se-tinyvision.dtb ,在文件夹arch/arm/boot 生成 zImage ,把他们拷贝出来。

33140ec9-fd56-4cef-9250-ffa210b74178.png

然后将 sun8i-v851se-tinyvision.dtb 改名为 sunxi.dtb ,这个设备树名称是定义在 SyterKit 源码中的,如果之前修改了 SyterKit 的源码需要修改到对应的名称,SyterKit 会去读取这个设备树。

然后编写一个 config.txt 作为配置文件

[configs]
bootargs=root=/dev/mmcblk0p2 earlyprintk=sunxi-uart,0x02500000 loglevel=2 initcall_debug=0 rootwait console=ttyS0 init=/sbin/init
mac_addr=4a:13:e4:f9:79:75
bootdelay=3

安装 GENIMAGE

这里我们使用 genimage 作为打包工具

sudo apt-get install libconfuse-dev #安装genimage依赖库
sudo apt-get install genext2fs      # 制作镜像时genimage将会用到
git clone GitHub - pengutronix/genimage: tool to generate multiple filesystem and flash images from a tree
cd genimage
./autogen.sh                        # 配置生成configure
./configure                         # 配置生成makefile
make
sudo make install

编译后运行试一试,这里正常

8dd643b9-5f40-4b9e-a355-457fd80d8c5b.png

使用 GENIMAGE 打包固件

编写 genimage.cfg 作为打包的配置

image boot.vfat {vfat {files = {"zImage","sunxi.dtb","config.txt"}}size = 32M
}image sdcard.img {hdimage {}partition boot0 {in-partition-table = "no"image = "syter_boot_bin_card.bin"offset = 8K}partition boot0-gpt {in-partition-table = "no"image = "syter_boot_bin_card.bin"offset = 128K}partition kernel {partition-type = 0xCbootable = "true"image = "boot.vfat"}partition rootfs {partition-type = 0x83bootable = "true"image = "rootfs.img"}
}

由于genimage的脚本比较复杂,所以编写一个 genimage.sh 作为简易使用的工具

#!/usr/bin/env bashdie() {cat <<EOF >&2
Error: $@Usage: ${0} -c GENIMAGE_CONFIG_FILE
EOFexit 1
}# Parse arguments and put into argument list of the script
opts="$(getopt -n "${0##*/}" -o c: -- "$@")" || exit $?
eval set -- "$opts"GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp"while true ; docase "$1" in-c)GENIMAGE_CFG="${2}";shift 2 ;;--) # Discard all non-option parametersshift 1;break ;;*)die "unknown option '${1}'" ;;esac
done[ -n "${GENIMAGE_CFG}" ] || die "Missing argument"# Pass an empty rootpath. genimage makes a full copy of the given rootpath to
# ${GENIMAGE_TMP}/root so passing TARGET_DIR would be a waste of time and disk
# space. We don't rely on genimage to build the rootfs image, just to insert a
# pre-built one in the disk image.trap 'rm -rf "${ROOTPATH_TMP}"' EXIT
ROOTPATH_TMP="$(mktemp -d)"
GENIMAGE_TMP="$(mktemp -d)"
rm -rf "${GENIMAGE_TMP}"genimage \--rootpath "${ROOTPATH_TMP}"     \--tmppath "${GENIMAGE_TMP}"    \--inputpath "${BINARIES_DIR}"  \--outputpath "${BINARIES_DIR}" \--config "${GENIMAGE_CFG}"

准备完成,文件如下所示

8986491d-003b-479e-9ef0-01f3c93ca43c.png

运行命令进行打包

chmod 777 genimage.sh
./genimage.sh -c genimage.cfg

1ad6cdd4-59b6-4089-a5f4-2aac0e3538ef.png

打包完成,可以找到 sdcard.img

使用软件烧录固件到TF卡上

d06e037d-102f-46cc-80c1-49b47f72b8b1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280851.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 数组(Array)

C# 数组&#xff08;Array&#xff09; 初始化数组 声明一个数组不会在内存中初始化数组。当初始化数组变量时&#xff0c;您可以赋值给数组。 数组是一个引用类型&#xff0c;所以您需要使用 new 关键字来创建数组的实例。 例如&#xff1a; double[] b new double[10];…

宝宝洗衣机十大排名:2024年十大超高销量婴儿洗衣机整理

婴儿的衣物对于卫生要求需要高一些&#xff0c;其抵抗力是比较弱的&#xff0c;再加上普通洗衣机无法对婴儿的衣物进行有效的消毒处理&#xff0c;轻则会对婴儿的健康造成威胁&#xff0c;重则会导致皮肤病的发生。因此&#xff0c;一台可以对衣物进行高温除菌的婴儿洗衣机非常…

【Flutter】文件选择器(file_picker)的用法

Flutter 没有提供内置的文件选择器&#xff0c;但社区内有人贡献了一个比较完整的解决方案——file_picker。 file_picker 的 API 简洁易用&#xff0c;支持全平台&#xff08;Android / iOS / Mac / Linux / Windows&#xff09;&#xff0c;是我开发桌面应用时的首选。 这边…

蓝桥杯刷题-替换字符

代码&#xff1a; 顺着题目意思写即可 sinput() nint(input()) for i in range(n):l, r, x, y input().split() if x not in s[int(l)-1:int(r)]: # 如果待替换字符不在区间内则跳过continueelse:# 找到待替换字符的位置&#xff0c;用replace函数进行替换ss[:int(l)-1]s[in…

【C++】CC++内存管理

目录 一、C/C内存分布二 、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型3.3 长度域 四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型5.2 自定义类…

第十二届蓝桥杯省赛CC++ 研究生组-货物摆放

还是整数分解问题,注意n本身也是约数 #include <iostream> int main(){printf("2430");return 0; }#include <iostream> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const ll n 2021041820210418LL…

更安全的C gets()和str* 以及fgets和strcspn的用法

#include <stdio.h>int main() {char *str;gets(str);puts(str);return(0); }可以说全是错误 首先char *str没有指向一个分配好的地址&#xff0c;就直接读入&#xff0c;危险 ps: 怎么理解char *str "Hello World" 是将一个存储在一个只读的数据段中字符串常…

Linux查看硬件型号详细信息

1.查看CPU &#xff08;1&#xff09;使用cat /proc/cpuinfo或lscpu &#xff08;2&#xff09;使用dmidecode -i processor Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息。Dmidecode 遵循 SMBIOS/DMI 标准&#xff0c;其输出的信息包括 BIOS、系统、主板、…

Docker启动失败,报错Is the docker daemon running? Is the docker daemon running?

问题&#xff1a; docker没有正常启动 解决方法&#xff1a; systemctl daemon-reload systemctl restart docker.service

chrome浏览器扩展插件开发包括打包、注册开发者账号、发布

打包chrome扩展程序 注册开发者账号 https://developer.chrome.com/docs/webstore/register?hlzh-cn 人工智能学习网站&#xff1a; https://chat.xutongbao.top

【学习】python函数语法(面像对象、封装函数)

阅读开源深度学习源码的时候&#xff0c;使用到了很多封装函数以及Python的高级语法&#xff0c;看起来很混乱很痛苦很困难。对python函数语法做个总结&#xff01;&#xff01;&#xff01; Table of Contents 熟练Python语法&#xff0c;尤其是函数参数、迭代器与生成器、函…

内网横向1

IPC$详解 IPC( Internet Process Connection) 共享 “ 命名管道 ” 的资源 , 是为了实现进程间通信而开放的命名管道。 IPC 可以通过验证用户名和密码获得相应的权限&#xff0c;通常在远程管理计算机和查看计算机的共享资源时使用 通过 ipc$ &#xff0c;可以与目标机器建立连…

C++ 模板入门详解

目录 0. 模板引入 1.函数模板 1. 函数重载的缺点 2. 函数模板的概念和格式 2. 函数模板的实例化 2.1 隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 2.2 显式实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 2.3 函数模板参数的匹…

Linux常用命令之文件权限类

1.1 Linux的文件属性 在Linux里使用ll或者ls-l命令来显示一个文件的属性以及文件所属的用户和组。 以-开头&#xff1a;普通文件 以d开头&#xff1a;目录 以l开头&#xff1a;链接 以c开头&#xff1a;字符类型的设备文件(例如&#xff1a;鼠标、键盘&#xff0c;他们输入…

matlab simulink 电力系统同步发电机励磁系统的建模与仿真

1、内容简介 略 77-可以交流、咨询、答疑 电力系统同步发电机励磁系统的建模与仿真 建立MATLAB的同步发电机励磁调节系统仿真模型&#xff0c;最后建立了以PID和PSS为励磁控制方式的同步发电机励磁调节系统数学模型&#xff0c;在Simulink环境下进行了仿真&#xff0c;收到…

区域规划(Regional Planning)的学习笔记

目录 一、概念题 1.区域的概念、类型、特性 2.区域分析的概念、主要内容 3.自然环境、自然资源的概念 4.区域自然资源评价的内容 5.可持续发展理论定义 6.经济增长、经济结构定义 7.产业结构概念 8.人口增长分析的含义、指标 9.技术进步概念、类型 10.技术进步对区域…

javaSwing推箱子游戏

一、简介 策略性游戏可以锻炼人的思维能力还能缓解人的压力&#xff0c;使人们暂时忘却生活当中的烦恼&#xff0c;增强人们的逻辑思维能力&#xff0c;游戏的艺术美也吸引着越来越多的玩家和厂商&#xff0c;寓教于乐&#xff0c;在放松人们心情的同时还可以活跃双手。在人类…

【算法】差分算法(空调)

可用于求一个数组要变为另一个数组最少要改变多少次的次数 Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。 有些奶牛喜欢温度低一些&#xff0c;而有些奶牛则喜欢温度高一些。 Farmer John 的牛棚包含一排 N 个牛栏&#xff0c;编号为 1…N&#xff0c;每个牛栏里有一头…

IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析

基于LoRa蓝牙的室内场景定位技术&#xff0c;蓝牙主要负责位置服务&#xff0c;LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”&#xff0c;是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术&#xff0c;抗干…

Java版直播商城免 费 搭 建:电商、小程序、三级分销及免 费 搭 建,平台规划与营销策略全掌握

随着互联网的快速发展&#xff0c;越来越多的企业开始注重数字化转型&#xff0c;以提升自身的竞争力和运营效率。在这个背景下&#xff0c;鸿鹄云商SAAS云产品应运而生&#xff0c;为企业提供了一种简单、高效、安全的数字化解决方案。 鸿鹄云商SAAS云产品是一种基于云计算的软…