导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页

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

    V Series
    5
    5
    2589
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • YuzukiTsuru
      柚木 鉉 LV 9 最后由 YuzukiTsuru 编辑

      原文:https://www.gloomyghost.com/live/20231216.aspx

      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
      

      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.7 主线

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

      c3f3d507-fb8d-4884-bb42-c0c6f811b930-image.png

      下载后解压缩

      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
      

      aa123679-b906-4708-95d4-771fe64b352e-image.png

      然后尝试编译

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

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

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

      正常编译

      39f1c569-d53e-4b8a-8dc9-755344099f12-image.png

      移植 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 填入

      718e9489-b745-4677-a4f5-a1c71761c801-image.png

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

      bd95a9d8-5a8d-4e59-98ff-cf7e2cef309e-image.png

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

      2c7b7518-b1b4-4a25-b034-3afe100455c9-image.png

      将文件中的 SUN20I_D1 改为 SUN8I_V851SE

      7777037d-520a-412f-b514-cac96f93a9ca-image.png

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

      5f5070e0-1bf1-4188-9fd2-544703ec4893-image.png

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

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

      aeaacd14-62ea-4e92-9cf3-4790312bc7c2-image.png

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

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

      100b0282-80d5-447e-b679-322fcf21e25c-image.png

      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
      

      d48c034d-8062-4b05-858e-c16e0b6592d3-image.png

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

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

      307b9619-8039-45d1-890a-1ca986248943-image.png

      正常编译成功

      移植 pinctrl 驱动

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

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

      2d4881b4-d116-4a15-b978-5b21dc8be02d-image.png

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

      3bfaf5ee-8e8f-4fee-874c-c21b70d87bc0-image.png

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

      aa348d61-13c1-4d03-84b6-da6b1fcc0250-图片.png

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

      5131660c-7f5b-4d71-88de-1097ae7e7440-图片.png

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

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

      83d4f1f9-bf7f-49da-866a-cb2a89e4e8f2-图片.png

      编译测试,编译通过

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

      cf9c9eab-7dfd-44d5-a020-040618935fc2-图片.png

      编写设备树

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

      042a70f9-e240-4708-95bc-b8ff787688e8-图片.png

      这部分直接给结果了,把上面适配的设备树放到/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

      29834b75-18bb-44b8-bd60-06de17460d89-图片.png

      sun8i-v851se-tinyvision.dtb
      

      58b5c068-42ff-4ab5-97e9-4663dd5ee4de-图片.png

      生成刷机镜像

      编译内核后,可以在文件夹 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=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
      

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

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

      使用 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}"
      

      准备完成,文件如下所示

      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

      测试

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

      6504b232-942d-4019-bc1d-fe2f55ebc828-图片.png

      可以看到 Linux 版本是 6.7.0

      7b755a0a-f5a7-4ee5-970d-6372edb9c314-图片.png

      D Z 2 条回复 最后回复 回复 引用 分享 10
      • D
        dream LV 6 @YuzukiTsuru 最后由 编辑

        @yuzukitsuru 赞,深度好文。

        1 条回复 最后回复 回复 引用 分享 0
        • Z
          Zyxus LV 3 @YuzukiTsuru 最后由 编辑

          @yuzukitsuru 精采大作,获益良多。

          淘了TinyVision准备折腾。请问SyterKit是您的大作吗?我看src/drivers底下有sys-sdcard及usb/usb_mass代码,请问SyterKit可以用USB OTG模拟成读卡机吗?方便上位机直接写入记忆卡。

          1 条回复 最后回复 回复 引用 分享 0
          • A
            Arnold815 LV 2 最后由 编辑

            已购入TinyVision初步学习,膜拜大佬

            1 条回复 最后回复 回复 引用 分享 0
            • B
              bonge LV 3 最后由 编辑

              这个能使用 V851SE 自带的网络部分吗?

              1 条回复 最后回复 回复 引用 分享 0
              • 1 / 1
              • First post
                Last post

              Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

              行为准则 | 用户协议 | 隐私权政策