TinaSDKV2.0 Kernel基本开发

news2024/11/15 11:12:29

TinaSDKV2.0 Kernel基本开发

Tina-SDK Linux系统启动流程:

在这里插入图片描述

Linux Kerenl目录结构

设备树配置文件位置

  • 100ASK_T113s3-Industrial-DevKit开发板LinuxKernel配置文件: device/config/chips/t113/configs/100ask/linux/config-5.4

在这里插入图片描述

  • 100ASK_T113s3-Industrial-DevKit开发板LinuxKernel设备树文件: device/config/chips/t113/configs/100ask/board.dts

在这里插入图片描述

可以在tina-sdk source后,在tina-sdk任意目录内执行 cconfigs命令直接切换到板级 Linux 设备树 和 配置文件目录。

在这里插入图片描述

  • 100ASK_T113s3-Industrial-DevKit开发板设备树 board.dts 父级设备树名称 sun8iw20p1.dtsi

在这里插入图片描述

内核源码位置

  • Linux-5.4内核源码:lichee/linux-5.4

在这里插入图片描述

可以在tina-sdk source后,在tina-sdk任意目录内执行 ckernel命令直接切换到linux内核源码目录下。

在这里插入图片描述

  • 100ASK_T113s3-Industrial-DevKit开发板父级设备树 sun8iw20p1.dtsi所在位置 lichee/linux-5.4/arch/arm/boot/dts

在这里插入图片描述

可以在tina-sdk source后,在tina-sdk任意目录内执行 cdts命令直接切换到linux内核源码设备树目录下。

在这里插入图片描述

env环境变量

  • 100ASK_T113s3-Industrial-DevKit开发板启动环境变量:device/config/chips/t113/configs/100ask/env.cfg

在这里插入图片描述

设备树打包

boot_package.cfg 文件描述了,Linux内核设备树所在位置。

  1. 为了在启动内核前更新参数到内核dts 和可以在U-Boot 控制台查看修改dts。按阶段划分可以分为使用内部dts 阶段和使用内核dts 阶段。如下图所示。

在这里插入图片描述

  1. 可以通过命令set_working_fdt来切换当前生效的fdt。
[04.562]update bootcmd
[04.576]change working_fdt 0x7bebee58 to 0x7be8ee58
[04.587]update dts
Hit any key to stop autoboot: 0
=> set
set_working_fdt setenv setexpr
=> set_working_fdt 0x7bebee58
change working_fdt 0x7be8ee58 to 0x7bebee58
=>

参考:D1-H_Tina_Linux_U-Boot_开发指南.pdf

单独编译Linux

在TinaSDK内,单独编译LinuxKernel 只需要在源码 根 目录下执行 mkernel命令即可开始针对于 kernel的编译操作,这里需要注意的是,mkernel 命令默认是没有生效的,您如果关闭了之前编译的终端/host系统,则需要重新 执行 source build/envsetup.sh 命令来初始化 TinaSDK的编译环境。并且因为缓存问题,强烈建议 你 执行make clean 后执行,lunch 命令,输入 4 重新选择我们的 4. t113_100ask-tina 单板

ubuntu@ubuntu1804:~/tina-d1-h$ source build/envsetup.sh 
Setup env done! Please run lunch next.
ubuntu@ubuntu1804:~/tina-d1-h$ lunch 

You're building on Linux

Lunch menu... pick a combo:
     1. d1-h_nezha_min-tina
     2. d1-h_nezha-tina
     3. d1s_nezha-tina
     4. t113_100ask-tina

Which would you like? [Default t113_100ask]: 4
============================================
TINA_BUILD_TOP=/home/ubuntu/tina-d1-h
TINA_TARGET_ARCH=arm
TARGET_PRODUCT=t113_100ask
TARGET_PLATFORM=t113
TARGET_BOARD=t113-100ask
TARGET_PLAN=100ask
TARGET_BUILD_VARIANT=tina
TARGET_BUILD_TYPE=release
TARGET_KERNEL_VERSION=5.4
TARGET_UBOOT=u-boot-2018
TARGET_CHIP=sun8iw20p1
============================================
clean buildserver
[2]+  Killed                  $T/tools/build/buildserver --path $T 2> /dev/null 1>&2
[1] 49529
ubuntu@ubuntu1804:~/tina-d1-h$ 

单独编译kernel

前面介绍,在TinaSDK 环境内,单独编译 Linux kernel只需要 mkernel一个命令即可,如下图所示:

ubuntu@ubuntu1804:~/tina-d1-h$ mkernel
===This's tina environment.===
special target, skip mboot,marisc
make[1]: Entering directory '/home/ubuntu/tina-d1-h'
make[2]: Entering directory '/home/ubuntu/tina-d1-h/target/allwinner'
make[3]: Entering directory '/home/ubuntu/tina-d1-h/target/allwinner/t113-100ask'
/home/ubuntu/tina-d1-h/scripts/kconfig.pl  + /home/ubuntu/tina-d1-h/target/allwinner/generic/config-5.4 /home/ubuntu/tina-d1-h/device/config/chips/t113/configs/100ask/linux/config-5.4 > /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.target
awk '/^(#[[:space:]]+)?CONFIG_KERNEL/{sub("CONFIG_KERNEL_","CONFIG_");print}' /home/ubuntu/tina-d1-h/.config >> /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.target
echo "# CONFIG_KALLSYMS_EXTRA_PASS is not set" >> /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.target
echo "# CONFIG_KALLSYMS_ALL is not set" >> /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.target
echo "CONFIG_KALLSYMS_UNCOMPRESSED=y" >> /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.target
/home/ubuntu/tina-d1-h/scripts/metadata.pl kconfig /home/ubuntu/tina-d1-h/tmp/.packageinfo /home/ubuntu/tina-d1-h/.config 5.4 > /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.override
/home/ubuntu/tina-d1-h/scripts/kconfig.pl 'm+' '+' /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.target /dev/null /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.override > /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.set
......
rm -f /home/ubuntu/tina-d1-h/out/t113-100ask/rootfs.img
rm -f /home/ubuntu/tina-d1-h/out/t113-100ask/usr.img
dd if=/home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/root.squashfs of=/home/ubuntu/tina-d1-h/out/t113-100ask/rootfs.img bs=128k conv=sync
282+1 records in
283+0 records out
37093376 bytes (37 MB, 35 MiB) copied, 0.0216129 s, 1.7 GB/s
( cd /home/ubuntu/tina-d1-h/out/t113-100ask ; find -maxdepth 1 -type f \! -name 'md5sums'  -printf "%P\n" | sort | xargs md5sum --binary > md5sums )
( cd /home/ubuntu/tina-d1-h/out/t113-100ask ; find -maxdepth 1 -type f \! -name 'md5sums'  -printf "%P\n" | sort | xargs openssl dgst -sha256 > sha256sums )
make[4]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner/generic/image'
make[3]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner/t113-100ask'
make[2]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner'
make[1]: Leaving directory '/home/ubuntu/tina-d1-h'

#### make completed successfully (25 seconds) ####

如果你得 kernel没有修改,整个编译过程非常快,TinaSDK系统默认会检查配置文件,看是否有改动,如果有改动,则会编译改动位置,如果无改动,就会直接跳过进行后续的头处理 打包处理。

Kconfig 配置方法

如果你需要修改内核配置项,可以在TinaSDK源码目录下执行 make kernel_menuconfig命令来进入到 内核的菜单选项界面。

对于menuconfig是一种图形化配置工具,这里以 kernel menuconfig 作为例子,讲解如何使用 Kconfig 基础配置方法。

首先我们进入 kernel menuconfig

make kernel_menuconfig
ubuntu@ubuntu1804:~/tina-d1-h$ make kernel_menuconfig
===This's tina environment.===
special target, skip mboot,marisc
export MAKEFLAGS= ;make V=ss -C target/allwinner menuconfig
make[1]: Entering directory '/home/ubuntu/tina-d1-h/target/allwinner'
make[2]: Entering directory '/home/ubuntu/tina-d1-h/target/allwinner/t113-100ask'
rm -f /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config.prev
rm -f /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.configured
/home/ubuntu/tina-d1-h/scripts/kconfig.pl  + /home/ubuntu/tina-d1-h/target/allwinner/generic/config-5.4 /home/ubuntu/tina-d1-h/device/config/chips/t113/configs/100ask/linux/config-5.4 > /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61/.config
export MAKEFLAGS= ;make -C /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61 -C /home/ubuntu/tina-d1-h/out/t113-100ask/compile_dir/target/linux-t113-100ask/linux-5.4.61 HOSTCFLAGS="-O2 -I/home/ubuntu/tina-d1-h/out/host/include -I/home/ubuntu/tina-d1-h/out/host/usr/include  -Wall -Wmissing-prototypes -Wstrict-prototypes" CROSS_COMPILE="arm-openwrt-linux-muslgnueabi-" ARCH="arm" KBUILD_HAVE_NLS=no KBUILD_BUILD_USER="" KBUILD_BUILD_HOST="" CONFIG_SHELL="bash" V=''  CC="arm-openwrt-linux-muslgnueabi-gcc" menuconfig
make[3]: Entering directory '/home/ubuntu/tina-d1-h/lichee/linux-5.4'
--define-variable argument does not have a value for the variable
--define-variable argument does not have a value for the variable
scripts/kconfig/mconf  Kconfig
configuration written to .config

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

make[3]: Leaving directory '/home/ubuntu/tina-d1-h/lichee/linux-5.4'
make[2]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner/t113-100ask'
make[1]: Leaving directory '/home/ubuntu/tina-d1-h/target/allwinner'

#### make completed successfully (6 seconds) ####

这里就是 kernel menuconfig 的主目录。其具体的操作方法如下图所示。

在这里插入图片描述

我们再进入较为常用的 Device Driver ,看一下各个符号的含义。

在这里插入图片描述

其中,可以使用 空格键 选中各个选项,这里以 Multimedia support 选项为例:

在这里插入图片描述

也可以使用 Y M N 键来修改选项:

在这里插入图片描述

遇到被其他依赖选择的选项,可以查看 Help 页面检查被什么选项所依赖。

在这里插入图片描述

进入 Help 页面后,便可以查看这个选项的依赖情况。需要注意的是,有些选项是作为底层依赖无法随意取消,例如这里示例的 Hardware Monitoring support 选项。

在这里插入图片描述

Kconfig 所创建的界面还有一个功能,就是搜索功能,方便快速的找到目标选项。这里以搜索 LCD 屏幕 icn6202 驱动为例。

在 Kconfig 的界面中按 / 键,进入搜索页面。

在这里插入图片描述

Kconfig修改配置示例

调整 kernel打印等级默认为7

在这里插入图片描述

默认不知道 kernel的printk打印等级配置在哪里,通过搜索得到路径,上面那个 Enable support for printk 并不是 我们要找到的 调整系统默认打印等级的配置项。继续往下,找到了 一个 Delay each boot printk message by N milliseconds 通过查看这个也不是,这个配置和是 用来 调整 因为系统信息显示过快 而 调整 每个 printk的打印间隔时间的。

还有一个 Early printk 看着类似,但是也不是,不过我们可以大概 知道 是在 Kernel hacking这个 类目内,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CONFIG_MESSAGE_LOGLEVEL_DEFAULT

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

打包kernel

编译完成后,执行 pack 命令即可开始打包系统操作,打包完成后,最后会 提示 pack finish 以及使用 红色背景色 告诉你 最终输出的镜像文件。

我们通过 ssh / vmware 拖拽等工具,将其 copy 出来即可。

在这里插入图片描述

烧写更新

根据之前烧写的文章进行镜像烧录操作。

启动验证

启动系统后,执行 cat /proc/sys/kernel/printk来查看系统默认是否已经把 printk 打印等级调整到了最高。如果如下图 红色箭头 7 所示,就表示已经成功。

在这里插入图片描述

增加一个已有的内核模块

7寸1024x600分辨率+电容触摸屏:https://item.taobao.com/item.htm?id=611156659477&

查看原理图

在这里插入图片描述

在这里插入图片描述

通过对比原理图,可以得到触摸屏信号和主控 对应的引脚关系为如下表格所示:

电路图引脚标号T113s3引脚名
CTP_INTPE1
CTP_RSTPE0
RPI_SCLPE12
RPI_SDAPE13

注意:此内容假设您已经了解I2C驱动开发,熟悉input子系统,可以看懂电路图等基础,如果不具备 建议 观看 韦老师的视频 I2C子系统开发 https://ldd.100ask.net/04_I2C/01/ Input子系统开发: https://ldd.100ask.net/05_Input/04_5/

全志TinaSDK TWI 开发参考文档: https://tina.100ask.net/SdkModule/Linux_TWI_DevelopmentGuide-01/

通过查看数据手册 T113-s3_datasheet_v1.6.pdf P41 可以看出来,PE12 PE13 复用模式为 function2 时为 I2c(全志这里叫TWI) ,由此 我们知道 需要在内核设备树内 twi2 节点下进行初始化,并增加 gt911 触摸设备书节点。

在这里插入图片描述

确认设备树

TinaSDK dts设备树语法定义使用等可以参考文档: https://tina.100ask.net/SdkModule/Linux_Deploy_DevelopmentGuide-03/ 如果希望深入学习 dts 可以参考视频深入学习 https://www.100ask.net/video/detail/p_5e61a9f374112_5P2wQoy0

在最开始我们知道内核的设备树文件在 device/config/chips/t113/configs/100ask/ 目录下,名为 board.dts ,通过 vim /gedit等工具编译 board.dts文件

  1. 先找到 引脚定义 &pio 节点,在里面添加 twi2 引脚复用,把PE12 PE13 复用为 twi2 模式。
  2. 在底部增加 &twi2 节点路径,并参考其他节点设置,将其启用。
  3. 节点内 增加 我们的gt911 触摸屏的触摸设备节点,并根据节点属性 和实际的 屏幕参数 添加对应值,需要 注意 ctp_int_port 就是我们的 CTP_INT 引脚,ctp_wakeup 就是我们原理图上 CTP_RST 引脚。
  4. 保存后,退出即可,需要注意的是,如果您自行添加 类似的触摸屏节点,则需要检查一下 你增加的 设备树节点 引脚 是否和默认的存在冲突,如果存在冲突需要解决后 才能正确添加并使用
&pio {
		twi2_pins_a: twi2@0 {
                pins = "PE12", "PE13";
                function = "twi2";
                drive-strength = <10>;
        };

        twi2_pins_b: twi2@1 {
                pins = "PE12", "PE13";
                function = "gpio_in";
        };
};

在这里插入图片描述

&twi2 {
        clock-frequency = <400000>;
        pinctrl-0 = <&twi2_pins_a>;
        pinctrl-1 = <&twi2_pins_b>;
        pinctrl-names = "default", "sleep";
        dmas = <&dma 45>, <&dma 45>;
        dma-names = "tx", "rx";
        status = "okay";

        ctp@14 {
                compatible = "allwinner,goodix";
                device_type = "ctp";
                reg = <0x14>;
                status = "okay";
                ctp_name = "gt9xxnew_ts";
                ctp_twi_id = <0x2>;
                ctp_twi_addr = <0x14>;
                ctp_screen_max_x = <0x400>;
                ctp_screen_max_y = <0x258>;
                ctp_revert_x_flag = <0x0>;
                ctp_revert_y_flag = <0x0>;
                ctp_exchange_x_y_flag = <0x0>;
                ctp_int_port = <&pio PE 1 GPIO_ACTIVE_HIGH>;
                ctp_wakeup = <&pio PE 0 GPIO_ACTIVE_HIGH>;
        };
};

在这里插入图片描述

​ 在TinaSDK 内Linux kernel的设备树 会默认和 boot0 uboot optee保存在一起,以便加速启动,所以 没有办法 单独编译设备树,去打包升级,我们只能通过在TinaSDK目录下使用 make 命令 来打包整个系统 系统会自动帮你编译 Linux设备树文件。

配置内核模块

在上一章节,介绍了如何使用Kconfig修改配置,举例使用在 tina-sdk 源码目录下 通过 make kernel_menuconfig命令直接进入内核菜单选项,进行配置内核选项,但是这种做法,只能保证本次编译有效,一旦使用了 make distclean 或者 make clean 过内核源码目录缓存,配置就会失效。

在TinaSDK 里面,整套编译系统框架基于 openwrt 14版本进行扩展支持,所以在内核选项配置层面,也延续了 原有的编译修改方式。如果我们需要修改内核配置项,并保存生效,则需要了解清楚openwrt对内核模块/配置文件是如何进行处理的。


内核默认配置文件在 device/config/chips/t113/configs/100ask/linux/目录下,一般情况下原厂提供SDK都会提供,默认的config文件和 tinasdk的关联性很强,一般情况下不能直接去 修改这里的 config文件,修改过后导致你编译kernel时出现很多选项依赖问题。

如果遇到修改内核配置并保存,我们应该如何操作呢?

在这里插入图片描述

如下所示,我们以增加 选择 默认支持的 gt911驱动模块为例,不使用 make kernel_menuconfig进入内核菜单配置界面,而是直接在 TinaSDK源码根目录下 执行 make menuconfig 进入 到 kernel modules 一层层找到 我们的 驱动模块。

你可以理解为 TinaSDK 帮我们提前把 模块之间的依赖都处理好了,我们只需要选择 使用那个模块就可以。

在这里插入图片描述

如上所示,TinaSDK提前帮我们把内核模块配置项依赖关系帮我们处理好了,那么在哪里处理呢? 对于我们的100ASK_T113s3-Industrial-DevKit开发板 在 **target/allwinner/t113-common/**目录内 这里有个 modules.mk 文件。

在这里插入图片描述

打开 modules.mk文件 找到 gt911驱动模块驱动的TinaSDK选项位置,可以看到如下图所示,系统已经帮我们提前配置好了 这个模块的依赖关系,以及生成的模块驱动,我们只需要 在TinaSDK config内选中就可以直接用了。

在这里插入图片描述

配置成功后,保存推出主界面,就可以继续执行 make 命令来完整的编译系统了。

编译打包

编译完成后,执行 pack 命令即可开始打包系统操作,打包完成后,最后会 提示 pack finish 以及使用 红色背景色 告诉你 最终输出的镜像文件。

我们通过 ssh / vmware 拖拽等工具,将其 copy 出来即可。

在这里插入图片描述

烧录更新

根据之前烧写的文章进行镜像烧录操作。

重启验证

首先:确保屏幕和100ASK_T113s3-Industrial-DevKit 开发板 fpc连接好,屏幕背光启动后会自动亮,等待系统启动,

启动过程中,可以看到 一些 关于gt9xx 模块的装载信息

在这里插入图片描述

当一个系统内有很多input输入设备在dev目录下可看到很多个 event 节点,我们不知道设备之间对应关系,就可以执行 cat /proc/bus/input/devices 来查看你得设备具体对应的 event节点是那个。

在这里插入图片描述

通过下图,列出了系统所有的input 设备,可以看到 蓝框所示,是我们的 gt9xx驱动模块,对应的 event节点是2.

在这里插入图片描述

此时通过 cat /dev/input/event2命令,同时手放在触摸屏上,就可以看到触摸驱动已经正常,硬件也正常,但是我们现在没有 tslib / ui工具来验证 坐标是否和实物一致,后期可以通过 libinput evtest等开源工具进行验证。

在这里插入图片描述

增加按键驱动

以开发板上 K1 K2 K3 K4 为例,通过查看原理图,增加设备树, 增加驱动支持,编译烧写启动,通过 getevent 验证。

查看开发板硬件接口

参考底板原理图:T113-S3_Industrial-DevKit_V11.pdf

在这里插入图片描述

对应开发板 实物图

在这里插入图片描述

GPADC

GPADC(General Purpose Analog to Digital Converter)是指高精度数模转换模块,拥有12bit分辨率,8位采集精度。模拟输入范围0~1.8V,最高采样率1MHz。

GPADC 驱动路径:

/home/ubuntu/tina-d1-h/lichee/linux-5.4/drivers/input/sensor/sunxi_gpadc.c
/home/ubuntu/tina-d1-h/lichee/linux-5.4/drivers/input/sensor/sunxi_gpadc.h

GPADC硬件介绍

在这里插入图片描述

AVCC 为 1.8V 电源供电,通过一个电阻串联到GPADC的按键组。按键通过不同阻值的电阻相连接,按下不同的按键,GPADC0 口的电压不同,CPU 通过对这个电压的采样来决定具体是哪一个按键被按下。上图按键与电压的对应关系如下表所示:

0.21V0.41V0.59V0.75V
VOL+VOL-MENUENTER

当按键按下时,会触发 GPADC 模块的中断,CPU 会采集 GPADC 的数据,采集到的数据转换成相应的键值之后通过 input 子系统上传到 /dev/input/event 节点,程序便可以从相应的节点获取数据。

GPADC软件介绍

设备树配置:

GPADC 的设备树配置分为两个部分:

第一部分包括基础的寄存器配置、设备驱动绑定配置和时钟中断配置。这一部分的配置位于 linux-5.4/arch/arm/boot/dts/sun8iw20p1.dtsi 文件内。这一部分通常不需要修改。

gpadc: gpadc@2009000 {
        compatible = "allwinner,sunxi-gpadc";
        reg = <0x0 0x02009000 0x0 0x400>;
        interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
        clocks = <&ccu CLK_BUS_GPADC>;
        clock-names = "bus";
        resets = <&ccu RST_BUS_GPADC>;
        status = "okay";
};

第二部分包括采样相关的配置,键值,电压数据等等,在 config/chips/t113/configs/100ask_devkit/linux-5.4/board.dts 文件内

&gpadc {
        channel_num = <1>;
        channel_select = <0x1>;
        channel_data_select = <0>;
        channel_compare_select = <0x1>;
        channel_cld_select = <0x1>;
        channel_chd_select = <0>;
        channel0_compare_lowdata = <1700000>;
        channel0_compare_higdata = <1200000>;
        channel1_compare_lowdata = <460000>;
        channel1_compare_higdata = <1200000>;
        key_cnt = <5>;
        key0_vol = <210>;
        key0_val = <115>;
        key1_vol = <410>;
        key1_val = <114>;
        key2_vol = <590>;
        key2_val = <119>;
        key3_vol = <750>;
        key3_val = <373>;
        key4_vol = <880>;
        key4_val = <28>;
        status = "okay";
};

内核驱动配置:

make kernel_menuconfig 进入内核配置界面,找到Device Drivers,进入。

在这里插入图片描述

找到 Input device support ,进入。

在这里插入图片描述

找到 Sensors 空格勾选并进入。

在这里插入图片描述

空格选中 <*> sunxi gpadc driver support ,保存并退出配置页面。

在这里插入图片描述

之后编译内核,打包烧录即可。

烧写方式 有两种,一种是线刷,使用 PhoenixSuit 将编译生成的镜像烧录至 spi nand 存储设备上,另一种是通过 PhoenixCard-V2.8 工具将系统镜像烧录至TF卡启动。 我们推荐使用 线刷 烧录至 spi nand 方便快速实验。

参考文档:https://allwinner-docs.100ask.net/Board/100ASK_T113-PRO/03-1_FlashSystem.html

参考视频:https://www.bilibili.com/video/BV1Nx4y1w7AF/?p=11&share_source=copy_web&vd_source=e3bf42462ab8667ad5a5469f71947458

测试 GPADC

make menuconfig 进入 openWrt 配置页面,找到 getevent 软件包。

在这里插入图片描述

之后编译打包烧录到开发板上,运行 getevent,可以看到sunxi-gpadc。此时按下按键,可以看到按键键值显示出来了。

在这里插入图片描述

烧写方式 有两种,一种是线刷,使用 PhoenixSuit 将编译生成的镜像烧录至 spi nand 存储设备上,另一种是通过 PhoenixCard-V2.8 工具将系统镜像烧录至TF卡启动。 我们推荐使用 线刷 烧录至 spi nand 方便快速实验。

参考文档:https://allwinner-docs.100ask.net/Board/100ASK_T113-PRO/03-1_FlashSystem.html

参考视频:https://www.bilibili.com/video/BV1Nx4y1w7AF/?p=11&share_source=copy_web&vd_source=e3bf42462ab8667ad5a5469f71947458

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

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

相关文章

学习笔记--算法(滑动窗口)9

长度最小的子数组 链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a;给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0…

高性能日志系统 性能测试

百万并发压测 测试环境 云服务器环境 2核2G 2M Linux华为云服务器Ubuntu系统本地电脑环境 处理器&#xff1a;AMD Ryzen 7 4800H with Radeon Graphics2.90 GHz已安装的内存(RAM):16.0GB(15.4GB可用)系统类型&#xff1a;64位操作系统&#xff0c;基于x64的处理器 测试结果 响应…

软件工程造价师习题练习 5

1.下面哪项是EO的主要目的&#xff08; &#xff09; A. 改变应用行为 B. 维护一个或多个ILFs C. 呈现信息给用户 D. 执行数学公式和计算 外部输出&#xff08;EO&#xff09;是发送数据或控制信息到边界外部的基本过程&#xff0c;与EQ相比还包含了额外的处理逻辑。EO的主…

TypeError: Cannot read properties of undefined (reading ‘scrollIntoView‘)(已解决)

问题复现&#xff1a;眨眼睛使用vitevue3实现跳转dom功能时使用了scrollIntoView方法&#xff0c;在打包上传以后使用该功能报错 小友可能会陷入误区&#xff0c;以为是函数方法有问题&#xff0c;毕竟在开发时是没有问题的&#xff0c; 而实际上呢问题出在获取节点失败了 在这…

企业级批量无人值守安装

企业级批量无人值守安装 一、批量无人值守安装1.简介PXE工作流程 2.核心技术&#xff08;dhcp、httpd、tftp&#xff09;3.实验3.1 准备环境3.2 防护关闭3.3 软件安装3.4 软件配置DHCP服务设置httpd服务配置tftp服务配置 3.5 编写引导安装相关文件&#xff0c;放到指定位置3.5.…

基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码

介绍 适用于高能耗企业、建筑、工厂、园区的水、电、气、热、油、空压机等能源数据采集、分析、报表&#xff1b; 基于SpringCloud的能源管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 软件架构 软件功能 数字大屏 使用说明

关于鸣潮启动器450张图片杂谈—从代码分析为何使用帧动画

关于鸣潮启动器450张图片杂谈—从代码分析为何使用帧动画 前言 在鸣潮启动器的目录下 Wuthering Waves\kr_game_cache\animate_bg\99de27ae82e3c370286fba14c4fcb699打开该目录发现有450张图片&#xff0c;不难看出启动器的背景动画是由这450张图片不断切换实现的 qt框架 从…

小白公式量化--用Python指标公式模块做量化策略研究

《小白公式量化系统》是纯Python开发的&#xff0c;因此我们可以借用《小白公式量化系统》的金融模块&#xff0c;来实现自己的Python量化框架&#xff0c;以及用Python实现量化研究、选股、人工智能机器学习&#xff0c;以及打造自己的行情软件和量化平台。我们后面文章讲介绍…

【大模型从入门到精通27】开源库框架LangChain 语义搜索:高级检索策略1

这里写目录标题 语义搜索&#xff1a;高级检索策略简介最大边际相关性 (MMR)自我查询检索上下文压缩增强语义搜索的高级文档检索技术引言设置环境导入必要的库初始化向量数据库以进行相似性搜索导入 Chroma 向量存储库和 OpenAI 嵌入 填充向量数据库定义文本列表以填充数据库创…

基于YOLOv8-pose的手部关键点检测(3)- 实现实时手部关键点检测

目录 前言 1.扩大检测框区域 2.先检测手部&#xff0c;后检测手部关键点 3.正面视角检测 4.侧面视角检测 5.摄像头视角检测 6.遮挡视角检测 7.结论 前言 使用YOLOv8-m对图像进行手部检测&#xff0c;然后扩大检测框区域&#xff0c;并对该区域使用YOLOv8-s-pose使用关键…

达梦数据库版本介绍

达梦数据库根据不同用户的不同需求&#xff0c;提供了三种版本的数据库&#xff1a;DM Standard Edition 标准版、DM Enterprise Edition 企业版、DM Security Edition 安全版。那么这三种版本有什么区别&#xff0c;我们该如何选择合适的版本&#xff1f;下面先介绍三种版本各…

【笔记】泰山派环境配置遇到E: Unable to locate package repo

答案来自通义千问&#xff0c;解决了我的问题&#xff0c;做一些记录 你尝试在Ubuntu或Debian系统上使用apt命令安装repo工具&#xff0c;但是遇到了问题&#xff0c;因为repo不是直接在软件源中作为一个独立的包提供的。repo是Google的一个Git仓库管理工具&#xff0c;通常用…

【系统架构设计】系统性能评价(二)

【系统架构设计】系统性能评价&#xff08;二&#xff09; 性能指标性能计算性能设计阿姆达尔解决方案负载均衡 性能评估基准测试程序Web 服务器的性能评估 性能指标 性能计算 性能设计 阿姆达尔解决方案 阿姆达尔定律&#xff1a; 系统中对某部件采用某种更快的执行方式&a…

Centos8和stream 9防火墙基本使用

查发行版&#xff1a; [rootlocalhost nps-0.26.10]# cat /etc/redhat-releaseCentOS Stream release 9查看防火墙状态 systemctl status firewalld firewall-cmd --state开启/关闭/重启防火墙 systemctl start firewalld[rootlocalhost conf]# systemctl start firewalld …

Eureka原理与实践:深入探索微服务架构的核心组件

在微服务架构日益盛行的今天&#xff0c;服务之间的注册与发现成为了保证系统高可用性和灵活性的关键。Eureka&#xff0c;作为Netflix开源的服务注册与发现框架&#xff0c;凭借其简单、健壮的特性&#xff0c;在微服务领域占据了举足轻重的地位。本文将深入剖析Eureka的原理&…

ubuntu 24.04 安装 Nvidia 显卡驱动 + CUDA + cuDNN,配置 AI 深度学习训练环境,简单易懂,一看就会!

ubuntu 24.04 安装 Nvidia 显卡驱动 CUDA cuDNN&#xff0c;配置 AI 深度学习训练环境&#xff0c;简单易懂&#xff0c;一看就会&#xff01; 1.查看本机显卡型号 lspci | grep -i nvidia输出如下&#xff1a; 01:00.0 3D controller: NVIDIA Corporation GM108M [GeForc…

焦虑迷雾中的幻觉挑战?专家教你如何拨云见日!

在这个快节奏、高压力的时代&#xff0c;焦虑症已成为许多人难以言说的秘密。它不仅让人心情沉重&#xff0c;更有可能在极端情况下引发幻觉&#xff0c;仿佛置身于一个光怪陆离、难以分辨真假的世界。面对这样的困境&#xff0c;我们该如何自救&#xff0c;如何找到那束穿透焦…

ansible【自动化配置】(thirty day)

回顾 1、mysql和python &#xff08;1&#xff09;不需要执行mysql_ssl_rsa_setup &#xff08;2&#xff09;Change_master_to.不需要get public key 2、可以使用pymysql非交互的管理mysql &#xff08;1&#xff09;connpymysql.connect(host,user,password,database,prot) …

OpenCV图像处理——积分图像计算(C++/Python)

概述 积分图像是一种高效的图像处理技术&#xff0c;最初由Crow在1984年提出&#xff0c;目的是为了提高多尺度透视投影的渲染速度。它通过构建一个积分图&#xff0c;使得图像中任意矩形区域的像素和能够在常数时间内快速计算出来&#xff0c;极大地减少了在图像模糊、边缘提…

WARNING: There was an error checking the latest version of pip. 解决方案

WARNING: There was an error checking the latest version of pip. 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开…