TinyVision 使用 SyterKit 启动 Linux 6.7 主线内核

news2024/9/23 5:19:38

TinyVision 使用 SyterKit 启动 Linux 6.7 主线内核

SyterKit

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

获取 SyterKit 源码

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

git clone https://github.com/YuzukiHD/SyterKit.git

从零构建 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

image-20231216174136154

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

image-20231216173846369

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

image-20231216174210790

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

image-20231216174311727

移植 Linux 6.7 主线

有了启动引导,接下来是移植 Linux 6.7 主线,前往 https://kernel.org/ 找到 Linux 6.7,选择 tarball 下载

image-20231216174444070

下载后解压缩

tar xvf linux-6.7-rc5.tar.gz

进入 linux 6.7 目录,开始移植相关驱动。

搭建 Kernel 相关环境

Kernel 编译需要一些软件包,需要提前安装。

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

安装完成后可以尝试编译一下,看看能不能编译通过,先应用配置文件

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

image-20231216181640653

然后尝试编译

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

可以用 -j32 来加速编译,32 指的是使用32线程编译,一般cpu有几个核心就设置几线程

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

正常编译

image-20231216183011911

移植 clk 驱动

这里提供已经适配修改后的驱动:https://github.com/YuzukiHD/TinyVision/tree/main/kernel/linux-6.7-driver 可以直接使用。

也可以参考 https://github.com/YuzukiHD/TinyVision/tree/main/kernel/bsp/drivers/clk 中的驱动移植。

进入文件夹 include/dt-bindings/clock/ 新建文件 sun8i-v851se-ccu.h ,将 CLK 填入

image-20231216182350741

进入 include/dt-bindings/reset 新建文件 sun8i-v851se-ccu.h 将 RST 填入

image-20231216182941392

进入 drivers/clk/sunxi-ng 找到 sunxi-ng clk 驱动,复制文件ccu-sun20i-d1.cccu-sun20i-d1.h 文件并改名为 ccu-sun8i-v851se.cccu-sun8i-v851se.h 作为模板。

image-20231216180413415

将文件中的 SUN20I_D1 改为 SUN8I_V851SE

image-20231216180653502

打开芯片数据手册V851SX_Datasheet_V1.2.pdf,找到 CCU 章节

image-20231216180748419

对照手册编写驱动文件适配 V851se 平台。

然后找到 drivers/clk/sunxi-ng/Kconfig 文件,增加刚才编写的驱动的 Kconfig 说明

image-20231216181118674

config SUN8I_V851SE_CCU
	tristate "Support for the Allwinner V851se CCU"
	default y
	depends on MACH_SUN8I || COMPILE_TEST

同时打开 drivers/clk/sunxi-ng/Makefile

image-20231216181248375

obj-$(CONFIG_SUN8I_V851SE_CCU)	+= sun8i-v851se-ccu.o

sun8i-v851se-ccu-y		+= ccu-sun8i-v851se.o

来检查一下是否移植成功,先查看 menuconfig,找到 Device Drivers > Common Clock Framework,查看是否有 V851se 平台选项出现

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

image-20231216183207387

编译测试,有几处未使用的变量的警告,无视即可。

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

image-20231216183406918

正常编译成功

移植 pinctrl 驱动

这里提供已经适配修改后的驱动:https://github.com/YuzukiHD/TinyVision/tree/main/kernel/linux-6.7-driver 可以直接使用。

前往drivers/pinctrl/sunxi/ 新建文件 pinctrl-sun8i-v851se.c

image-20231216183716548

打开 V851SE_PINOUT_V1.0.xlsx 对照填入PIN的值与功能。

image-20231216183825726

同样的,修改 drivers/pinctrl/sunxi/Kconfig 增加选项

image-20231216184038601

修改 drivers/pinctrl/sunxi/Makefile 增加路径

image-20231216184126988

来检查一下是否移植成功,先查看 menuconfig,找到 > Device Drivers > Pin controllers,查看是否有 V851se 平台选项出现

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

image-20231216184259987

编译测试,编译通过

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

image-20231216184649676

编写设备树

这里提供已经适配修改后的驱动:https://github.com/YuzukiHD/TinyVision/tree/main/kernel/linux-6.7-driver/dts 可以直接使用。

image-20231216185413254

这部分直接给结果了,把上面适配的设备树放到/home/yuzuki/WorkSpace/aa/linux-6.7-rc5/arch/arm/boot/dts/allwinner/ ,修改 /home/yuzuki/WorkSpace/aa/linux-6.7-rc5/arch/arm/boot/dts/allwinner/Makefile

image-20231216185113539

sun8i-v851se-tinyvision.dtb

image-20231216185530270

生成刷机镜像

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

image-20231216191248458

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

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

[configs]
bootargs=cma=4M root=/dev/mmcblk0p2 init=/sbin/init console=ttyS0,115200 earlyprintk=sunxi-uart,0x02500000 rootwait clk_ignore_unused 
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 https://github.com/pengutronix/genimage.git
cd genimage
./autogen.sh                        # 配置生成configure
./configure                         # 配置生成makefile
make
sudo make install

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

image-20231216192512837

使用 genimage 打包固件

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

image boot.vfat {
	vfat {
		files = {
			"zImage",
			"sunxi.dtb",
			"config.txt"
		}
	}
	size = 8M
}

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 = 0xC
		bootable = "true"
		image = "boot.vfat"
	}
}

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

#!/usr/bin/env bash

die() {
  cat <<EOF >&2
Error: $@

Usage: ${0} -c GENIMAGE_CONFIG_FILE
EOF
  exit 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 ; do
	case "$1" in
	-c)
	  GENIMAGE_CFG="${2}";
	  shift 2 ;;
	--) # Discard all non-option parameters
	  shift 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}"

准备完成,文件如下所示

image-20231216192612594

运行命令进行打包

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

image-20231216192702018

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

image-20231216192757467

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

image-20231216192825808

测试

插卡,上电,成功启动系统

image-20231216193758046

可以看到 Linux 版本是 6.7.0

image-20231216193814799

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

dbeaver数据库工具配置连接openGauss5.0

在DBeaver数据库工具中配置连接openGauss 5.0&#xff0c;可以通过以下步骤进行&#xff1a; 一、准备工作 下载openGauss JDBC驱动&#xff1a; 访问openGauss的官方网站&#xff08;如https://opengauss.org/zh/&#xff09;&#xff0c;下载适用于您操作系统的JDBC驱动。对…

【01】Eclipse中配置spring的xsd 便于从本地加载而非网络

spring xsd 文章目录 spring xsd1.spring的xsd在Eclipse中的配置1.1xsi:schemaLocation1.2Eclipse中设置的key名1.3在本地文件系统中选择xsd文件进行配置1.4在workspace工作空间中选择xsd文件进行配置 2.重点2.1Key的配置2.2spring配置文件中xml的xsi:schemaLocation的配置变更…

Java重修笔记 第三十九天 集合的体系、Collection方法、迭代器遍历集合、增强for循环遍历集合

集合的体系 1. 单列集合 2. 双列集合 Collection的常用方法 1. boolean add(E e) 添加元素&#xff0c;添加基本数据类型的元素有自动装箱的过程 2. boolean remove(Object o) 删除指定元素&#xff0c;删除成功返回true 3. boolean contains(Object o) 查询指定元素&…

深度学习入门-04

PS&#xff1a;基于小土堆视频学习 1、add_image()的使用 读取样本集中的数据 image_path "data/train/ants_image/0013035.jpg" from PIL import Image img Image.open(image_path)在pycharm的控制台中运行该代码&#xff0c;运行后可以发现&#xff1a; 数据格…

前端面试宝典【设计模式】【4】

在前端开发的世界里,每一次面试都是一次机遇,也是一次挑战。 你是否曾因技术深度不够而错失良机? 或是面对最新的技术趋势感到迷茫? 我们的【前端面试宝典】正是为此而来。 由拥有多年一线实战经验的资深工程师亲自授课,结合最新的行业动态与实战案例,旨在全面提升你的技…

学习大数据DAY44 帆软 report 配置

目录 Linux 系统独立部署 Tomcat 服务器设置 上机练习 Linux 系统独立部署 ## 题目要求 在 LINUX 系统&#xff0c; Tomcat 服务器容器下&#xff0c;完成 FineReport 报表工程的独立部 署&#xff0c;并设置服务器开机自启动&#xff0c;并请实操演示 得分点&#xf…

全感知、全覆盖、全智能的名厨亮灶开源了

简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算法加…

牛客练习小题

目录 牛客. 矩阵最长递增路径 牛客.奇数位丢弃 牛客.天使果冻 牛客.dd爱旋转 牛客. 矩阵最长递增路径 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** 递增路径的最大长…

【C++ Primer Plus习题】3.5

问题: 解答: #include <iostream> using namespace std;int main() {long long populationWorld 0;long long populationChina 0;cout << "请输入全球的人口数:";cin >> populationWorld;cout << "请输入中国的人口数:";cin &g…

【STM32】RTT-Studio中HAL库开发教程五:UART的DMA应用

文章目录 一、简介1.关于DMA2.DMA使用场景3.DMA控制结构4.IDLE空闲中断5.实现方法 二、RTT配置三、串口收发流程四、完整代码五、测试验证 一、简介 1.关于DMA DMA(Direct Memory Access&#xff0c;直接存储器访问) 是所有现代电脑的重要特色&#xff0c;它允许不同速度的硬件…

谷粒商城实战笔记-249-商城业务-消息队列-RabbitMQ工作流程

文章目录 一&#xff0c;基本概念二&#xff0c;消息从producer到consumer的过程 一&#xff0c;基本概念 RabbitMQ是一个流行的开源消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;。以下是RabbitMQ的一些基本概念&#xff1a; Broker&#x…

真题解析 | CCF CSP-J 2020 入门级 C++语言真题及答案

一、单项选择题(共15题&#xff0c;每题2分&#xff0c;共计30分;每题有且仅有一个正确选项) 解析&#xff1a;常识题。在计算机内存中&#xff0c;每个存储单元都有一个唯一的标识号&#xff0c;这个标识号被称为地址。地址用来唯一标识内存中的每个存储单元&#xff0c;类似于…

【Stream】流媒体从入门到入土 (1)

最近工作需要学了很多流媒体相关的知识&#xff0c;谁能想象一个月前还是只听说过 HLS 的快乐小屁孩&#xff0c;现在已经背负了巨大的知识的重担了&#xff0c;头发也秃了几根&#xff0c;发际线严重后移 H.264 (AVC) vs H.265 (HEVC) H.264 和 H.265 是两种视频编码&#x…

【学习笔记】Day 22

一、进度概述 1、机器学习常识23-24&#xff0c;以及相关代码复现 2、python 补完计划&#xff08;详见 python 专题&#xff09; 二、详情 23、U-Net 从宏观结构上来讲&#xff08;以下摘自常识23&#xff09;&#xff1a; U-Net 就是 U 形状的网络, 前半部分 (左边…

[Android studio]无法联网

问题情景&#xff1a; 我的Android studio 更新软件到 Android Studio Koala | 2024.1.1 Patch 1 这个版本后&#xff0c;当前的项目无法正常编译。 因为之前有次更新版本后&#xff0c;我也遇到这个无法编译的问题&#xff0c;后面给解决掉了。想着这次应该也没有事情。 可这…

【通信协议】SPI总线

目录 SPI简介 硬件电路 SPI模式 软件模拟初始化 时序基本单元 起始条件 终止条件 发送与接收 SPI基本单元代码 MySPI.h MySPI.c SPI简介 SPI&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;即串行外围设备接口&#xff0c;是由Motorola公司开…

在 FPGA 上实现以太网的“低级”指南

如今&#xff0c;我们日常的网络连接大多是通过无线方式进行的&#xff0c;因此很容易忘记以太网。但它仍然是一种有用的标准&#xff0c;是一个可靠的高吞吐量网络链接的好方法。为此&#xff0c;[Robert Feranec] 和 [Stacy Rieck] 编写了一个关于如何在 FPGA 上使用以太网的…

uniapp实现苹果账号登录

appleLogin(){uni.showToast({title: 正在进行苹果账户登录...,icon: none})uni.login({provider: apple,success: (loginRes) > {uni.getUserInfo({provider: apple,success: async(userInfoRes) > {console.log(用户信息, userInfoRes)// userInfoRes.userInfo.identit…

Python和MATLAB和R对比敏感度函数导图

&#x1f3af;要点 深度学习网络两种选择的强制选择对比度检测贝叶斯自适应估计对比敏感度函数空间观察对比目标量化视觉皮质感知差异亮度、红/绿值、蓝/黄值色彩空间改变OpenCV图像对比度对比敏感度函数模型空间对比敏感度估计眼球运动医学研究空间时间颜色偏心率对比敏感度函…