h618 optee demo运行成功

/dev/tee0      /dev/teepriv0
[root@buildroot:/root #]op
openvt                        optee_example_hotp
optee_example_acipher         optee_example_plugins
optee_example_aes             optee_example_random
optee_example_hello_world     optee_example_secure_storage
[root@buildroot:/root #]optee_example_hello_world
D/TC:? 0 tee_ta_init_pseudo_ta_session:303 Lookup pseudo TA 8aaaf200-2450-11e4-abe2-0002a5d5c51b
D/TC:? 0 ldelf_load_ldelf:110 ldelf load address 0x80007000
D/LD:  ldelf:142 Loading TS 8aaaf200-2450-11e4-abe2-0002a5d5c51b
F/TC:? 0 trace_syscall:147 syscall #3 (syscall_get_property)
F/TC:? 0 trace_syscall:147 syscall #5 (syscall_open_ta_session)
D/TC:? 0 ldelf_syscall_open_bin:163 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (Secure Storage TA)
I/TC: WARNING (insecure configuration): Failed to get monotonic counter for REE FS, using 0
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x29
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x63
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x4D
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x55
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x8F
I/TC: WARNING (insecure configuration): Failed to commit dirh counter 2
D/TC:? 0 ldelf_syscall_open_bin:167 res=0xffff0008
D/TC:? 0 ldelf_syscall_open_bin:163 Lookup user TA ELF 8aaaf200-2450-11e4-abe2-0002a5d5c51b (REE)
F/TC:? 0 plat_prng_add_jitter_entropy:68 0xC6
D/TC:? 0 ldelf_syscall_open_bin:167 res=0
F/TC:? 0 trace_syscall:147 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:147 syscall #7 (syscall_invoke_ta_command)
F/TC:? 0 trace_syscall:147 syscall #3 (syscall_get_property)
F/TC:? 0 trace_syscall:147 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:147 syscall #8 (syscall_check_access_rights)
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x21
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x3B
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x47
F/TC:? 0 plat_prng_add_jitter_entropy:68 0xD5
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x94
F/TC:? 0 plat_prng_add_jitter_entropy:68 0xF0
F/TC:? 0 plat_prng_add_jitter_entropy:68 0xE4
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x7C
F/TC:? 0 plat_prng_add_jitter_entropy:68 0xDF
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x33
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x50
F/TC:? 0 plat_prng_add_jitter_entropy:68 0x94
F/TC:? 0 trace_syscall:147 syscall #6 (syscall_close_ta_session)
F/TC:? 0 trace_syscall:147 syscall #3 (syscall_get_property)
D/LD:  ldelf:176 ELF (8aaaf200-2450-11e4-abe2-0002a5d5c51b) at 0x80016000
F/TC:? 0 trace_syscall:147 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:147 syscall #8 (syscall_check_access_rights)
F/TC:? 0 trace_syscall:147 syscall #4 (syscall_get_property_name_to_index)
D/TA:  TA_CreateEntryPoint:39 has been called
D/TA:  __GP11_TA_OpenSessionEntryPoint:68 has been called
I/TA: Hello World!
F/TC:? 0 plat_prng_add_jitter_entropy:68 0xE0
Invoking TA to iD/TA:  inc_value:105 has been called
ncrement 42
I/TA: Got value: 42 from NW
I/TA: Increase value to: 43
TA incremented vD/TC:? 0 tee_ta_close_session:460 csess 0x40083f40 id 1
alue to 43
D/TC:? 0 tee_ta_close_session:479 Destroy session
I/TA: Goodbye!
D/TA:  TA_DestroyEntryPoint:50 has been called
D/TC:? 0 destroy_context:318 Destroy TA ctx (0x40083ee0)
[root@buildroot:/root #]lscpu
-sh: lscpu: not found
[root@buildroot:/root #]uname -a
Linux buildroot 6.1.31 #1 SMP Sun Nov  3 14:12:06 CST 2024 aarch64 GNU/Linux
[root@buildroot:/root #]cat /proc/c
cgroups    cmdline    config.gz  consoles   cpuinfo    crypto
[root@buildroot:/root #]cat /proc/cpuinfo
processor       : 0
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

[root@buildroot:/root #]
在这里插入代码片

Prerequisites — OP-TEE documentation documentation (optee.readthedocs.io)

注意需要加速访问docker.io,自行百度。

编辑/etc/docker/daemon.json,并重启服务。

sudo systemctl daemon-reload
sudo systemctl restart docker

由于国内网络问题,需要注释掉一部分配置:

FROM ubuntu:22.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt update && apt upgrade -y
RUN apt install -y \
    adb \
    acpica-tools \
    autoconf \
    automake \
    bc \
    bison \
    build-essential \
    ccache \
    cpio \
    cscope \
    curl \
    device-tree-compiler \
    e2tools \
    expect \
    fastboot \
    flex \
    ftp-upload \
    gdisk \
    git \
    libattr1-dev \
    libcap-ng-dev \
    libfdt-dev \
    libftdi-dev \
    libglib2.0-dev \
    libgmp3-dev \
    libhidapi-dev \
    libmpc-dev \
    libncurses5-dev \
    libpixman-1-dev \
    libslirp-dev \
    libssl-dev \
    libtool \
    libusb-1.0-0-dev \
    make \
    mtools \
    netcat \
    ninja-build \
    python3-cryptography \
    python3-pip \
    python3-pyelftools \
    python3-serial \
    python-is-python3 \
    rsync \
    swig \
    unzip \
    uuid-dev \
    wget \
    xalan \
    xdg-utils \
    xterm \
    xz-utils \
    zlib1g-dev
#RUN curl https://storage.googleapis.com/git-repo-downloads/repo > /bin/repo && chmod a+x /bin/repo
RUN mkdir /optee
WORKDIR /optee
#RUN repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml && repo sync -j10
#WORKDIR /optee/build
#RUN make -j2 toolchains
#RUN make -j$(nproc) check

拷贝到文件,并编译镜像,

参考:Ubuntu使用Docker搭建编译环境完整教程_ubuntu docker 安装编译-优快云博客

touch dockerfile
sudo docker build -t optee-ubuntu:22.04 .

sudo docker run -d  -it -v /home/yd/optee:/optee:rw -p 12306:22 --name=ubuntu optee-ubuntu:22.04 /bin/bash
sudo docker exec -it ubuntu /bin/bash

参考:git-repo | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
mv repo /usr/bin/
chmod +x /usr/bin/repo
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
git config --global user.email "1137827242@qq.com"
git config --global user.name "yangdong"
git config --global url.https://ghp.ci/https://github.com/.insteadOf https://github.com/

repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml
repo init -u http://192.168.10.20:3000/yangdong/manifest.git -m qemu_v8.xml
repo sync -j10

固件更新脚本

cd /work/orange_zero_3/arm-trusted-firmware
make PLAT=sun50i_h616 CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- LOG_LEVEL=50 DEBUG=1 -j32 SPD=opteed
cp /work/orange_zero_3/arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin ../u-boot-orangepi/
cd /work/orange_zero_3/optee_os
make ARCH=arm PLATFORM=sunxi PLATFORM_FLAVOR=sun50i_h616 CROSS_COMPILE64=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- -j12 
cp out/arm-plat-sunxi/core/tee-pager_v2.bin ../u-boot-orangepi/
cd /work/orange_zero_3/u-boot-orangepi
make ARCH=arm CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- BL31=./bl31.bin SCP=/dev/null TEE=./tee-pager_v2.bin -j12
echo "ok"

参考:

地址划分

阶段起始地址长度备注
BL320x4000_00000x0100_000016MB
BL310x4100_00000x80000512KB
BL330x4A00_0000
SH_MEM0x4A08_00000xF8_000016M-512K
Linux0x4B00_0000

TF-A

eaaf26e3e6

make PLAT=sun50i_h616 CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- -j32 SPD=opteed

make PLAT=sun50i_h616 CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- LOG_LEVEL=50 DEBUG=1 -j32 SPD=opteed

uboot

U-Boot 2024.01

编译命令
make ARCH=arm distclean
make ARCH=arm orangepi_zero3_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- BL31=./bl31.bin SCP=/dev/null -j12

make ARCH=arm CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- BL31=./bl31.bin SCP=/dev/null TEE=./tee.elf -j12

make ARCH=arm CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- BL31=./bl31.bin SCP=/dev/null TEE=./tee-pager_v2.bin -j12

注意:使用buildroot生成的编译器要使用绝对路径

spl

SPL_BSS_START_ADDR0x4ff80000
SPL_BINMAN_SYMBOLS
CONFIG_SPL_BINMAN_UBOOT_SYMBOLS
CONFIG_SPL_LDSCRIPTarch/arm/cpu/armv8/u-boot-spl.lds
CONFIG_SPL_TEXT_BASE0x20060
CONFIG_SPL_STACK_R_ADDR0x4fe00000
SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR0x40
SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET0x10
SPL_PAYLOADu-boot.bin
SYS_SPI_U_BOOT_OFFS0x8000
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN0x100000

uboot

loadentry
CONFIG_TEXT_BASE0x4a000000
BL31_ADDR0x400000000x40000000

u-boot-sunxi-with-spl.bin

0x0000_0000 — 0x0000_a000sunxi-spl.bin0x9fff
0x0000_A138 —0x000b_bcdfu-boot-nodtb.bin0xb1ba0
0x000b_bce0 — 0x000b_bda0atf 标识,填充一些字符串
0x000b_bda0 —0x000C_73E7bl31.bin0xb647
0x000c_7484 — 0x000c_c093sun50i-h618-orangepi-zero3.dtb0x4c00
u-boot-sunxi-with-spl.bin0xcc5b0

u-boot-sunxi-with-spl.map

ImagePos    Offset      Size  Name
00000000  00000000  000cc5b1  u-boot-sunxi-with-spl
00000000   00000000  0000a000  blob
0000a000   0000a000  000c25b1  fit
0000a138    00000138  000b1ba8  uboot
0000a138     00000000  000b1ba8  u-boot-nodtb
000bbda0    000b1da0  0000b648  atf
000bbda0     00000000  0000b648  atf-bl31

binman描述位置:arch/arm/dts/sunxi-u-boot.dtsi,有效字段如下

&binman {
	u-boot-sunxi-with-spl {
		filename = "u-boot-sunxi-with-spl.bin";
		pad-byte = <0xff>;

		blob {
			/*
			 * This value matches SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
			 * and SYS_SPI_U_BOOT_OFFS if those are defined.
			 */
			min-size = <0x8000>;
			filename = "spl/sunxi-spl.bin";
		};
		
		fit {
			description = "Configuration to load ATF before U-Boot";
			#address-cells = <1>;
			fit,fdt-list = "of-list";

			images {
				uboot {
					description = "U-Boot (64-bit)";
					type = "standalone";
					os = "u-boot";
					arch = "arm64";
					compression = "none";
					load = <CONFIG_TEXT_BASE>;

					u-boot-nodtb {
					};
				};

				atf {
					description = "ARM Trusted Firmware";
					type = "firmware";
					os = "arm-trusted-firmware";
					arch = "arm64";
					compression = "none";
					load = <BL31_ADDR>;
					entry = <BL31_ADDR>;

					atf-bl31 {
						filename = "bl31.bin";
						missing-msg = "atf-bl31-sunxi";
					};
				};

				@fdt-SEQ {
					description = "NAME";
					type = "flat_dt";
					compression = "none";
				};
			};

			configurations {
				default = "@config-DEFAULT-SEQ";

				@config-SEQ {
					description = "NAME";
					firmware = "atf";
					loadables = "uboot";
					fdt = "fdt-SEQ";
				};
			};
		};
	};
};

添加optee相关的配置,请参考doc/develop/package/entries.rst。

关于spl烧写位置的问题,doc/board/allwinner/sunxi.rst文档中描述说可以烧写到8k或者128k的位置,但是再H618这款芯片上,实测烧写到128KB不能启动,进入了fel模式,

地址划分
模块起始地址长度
tf-a0x400000000x80000
optee0x400800000x1200000
kernel0x40100000
sram_a20x001000000x18000

修改环境变量kernel_addr_r=0x40080000,include/configs/sunxi-common.h +136

#define KERNEL_ADDR_R     __stringify(SDRAM_OFFSET(0080000))

optee-os

编译
make PLATFORM_FLAVOR=sun50i_a64 ARCH=arm PLATFORM=sunxi CROSS_COMPILE64=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- -j12

make ARCH=arm PLATFORM=sunxi PLATFORM_FLAVOR=sun50i_h616 CROSS_COMPILE64=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- -j12 

注意:使用buildroot生成的编译器要使用绝对路径

宏定义
TZDRAM_START0x40280000
TZDRAM_SIZE0x01000000
SHMEM_START0x40080000
SHMEM_SIZE0x00200000
TEE_CORE_NB_CORE4
TZC380y
问题:
pem_to_pub_c.py", line 24, in main:  No module named 'cryptography'
pip3 install pycryptodomex
pip3 install pycrypto
pip install cryptography

kernel

编译命令
make ARCH=arm64 distclean
make ARCH=arm64 orangepi-zero3_defconfig
make ARCH=arm64 menuconfig
make ARCH=arm64 CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- -j12
动态打印
mount -t debugfs none /sys/kernel/debug

参考:Linux 调试之动态打印-优快云博客

使能nec协议

echo nec > /sys/class/rc/rc0/protocols

参考:2. Remote Controller’s sysfs nodes — The Linux Kernel documentation

ir-keytable -t
[root@buildroot:/root #]irw
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010201 00 KEY_NUMERIC_1 devinput-32
0000000080010201 00 KEY_NUMERIC_1 devinput-32
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010202 00 KEY_NUMERIC_2 devinput-32
0000000080010203 00 KEY_NUMERIC_3 devinput-32
0000000080010203 00 KEY_NUMERIC_3 devinput-32
0000000080010204 00 KEY_NUMERIC_4 devinput-32
0000000080010204 00 KEY_NUMERIC_4 devinput-32
0000000080010204 00 KEY_NUMERIC_4 devinput-32
0000000080010205 00 KEY_NUMERIC_5 devinput-32
0000000080010205 00 KEY_NUMERIC_5 devinput-32
0000000080010205 00 KEY_NUMERIC_5 devinput-32

scp yd@192.168.10.20:/work/orange_zero_3/buildroot/output/images/Image /boot
scp yd@192.168.10.20:/work/orange_zero_3/buildroot/output/images/allwinner/sun50i-h618-orangepi-zero3.dtb /boot/allwinner/

scp yd@192.168.10.20:/work/orange_zero_3/linux-orangepi/arch/arm64/boot/Image /boot
scp yd@192.168.10.20:/work/orange_zero_3/linux-orangepi/arch/arm64/boot/dts/allwinner/sun50i-h618-orangepi-zero3.dtb /boot/allwinner/

scp yd@192.168.10.20:/work/orange_zero_3/linux-6.12/arch/arm64/boot/Image /boot
scp yd@192.168.10.20:/work/orange_zero_3/linux-6.12/arch/arm64/boot/dts/allwinner/sun50i-h618-orangepi-zero3.dtb /boot/allwinner/
问题

1、gpio gpiochip0: Static allocation of GPIO base is deprecated, use dynamic allocation.

drivers/gpio/gpiolib.c,只是个警告,不影响功能

base = gc->base;
		if (base < 0) {
			base = gpiochip_find_base_unlocked(gc->ngpio);
			if (base < 0) {
				ret = base;
				base = 0;
				goto err_free_label;
			}

			/*
			 * TODO: it should not be necessary to reflect the
			 * assigned base outside of the GPIO subsystem. Go over
			 * drivers and see if anyone makes use of this, else
			 * drop this and assign a poison instead.
			 */
			gc->base = base;
		} else {
			dev_warn(&gdev->dev,
				 "Static allocation of GPIO base is deprecated, use dynamic allocation.\n");
		}

2、sun50i-h616-r-pinctrl 7022000.pinctrl: supply vcc-pl not found, using dummy regulator

gpiol的电源电压,orangepi-zero3固定设置为3.3v,此处不用理会。

为什么不移植代码到最新内核?

6.12版本内核代码,全志有些修改有问题,系统虽然能跑起来,但是一些模块不能正常工作。个人倾向于把一些配置合并到全志的主线代码中。

  1. 操作失误引起的奇葩问题

本文记录,仅为提醒别犯类似错误。

最近在玩orangei zero3板子,遇到一个问题,设备树节点状态为"okay",

相应驱动也编进去了,在probe中加了很多打印,dmesg信息中没有打印且设备节点没有生成。

调试过程中在drm_module_platform_driver也加了打印,确定驱动的init函数执行了,但是probe一直没执行。cat /pro/device-tree 节点也处于OK的状态。

错误的设备树:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正确的设备树

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:全志官方更新了H616 cpu相关的设备树配置,个人在做比较和合并时,误把de节点直接“复制到右边”,放在了cpus{ … }范围内,出现了hdmi驱动不加载的情况,drm注册失败的现象。

结论:设备节点不能放到cpus的区域内。

buildroot

编译
make yd_orangepi_zero3_tz_defconfig
make

img

vpu

Sunxi-Cedrus - linux-sunxi.org

Linux IR 适配红外遥控器

HX1838-IR-DIY-HX1838-DIY.jpg_6

硬件连接:略。
内核配置

Device Drivers --> Remote Controller support --> …

CONFIG_RC_CORE=y
CONFIG_LIRC=y
CONFIG_RC_MAP=y
CONFIG_RC_DECODERS=y
CONFIG_IR_IMON_DECODER=y
CONFIG_IR_JVC_DECODER=y
CONFIG_IR_MCE_KBD_DECODER=y
CONFIG_IR_NEC_DECODER=y
CONFIG_IR_RC5_DECODER=y
CONFIG_IR_RC6_DECODER=y
CONFIG_IR_RCMM_DECODER=y
CONFIG_IR_SANYO_DECODER=y
CONFIG_IR_SHARP_DECODER=y
CONFIG_IR_SONY_DECODER=y
CONFIG_IR_XMP_DECODER=y
CONFIG_RC_DEVICES=y

尽量选中 Remote controller decoders中的所有项,方面后面适配不同协议的遥控器。

测试程序

交叉编译v4l-utils tools,lirc-tools,可以使用buildroot/busybox来集成。

获取遥控器键值
  1. cat /sys/class/rc/rc0/protocols
rc-5 nec rc-6 jvc sony rc-5-sz sanyo sharp mce_kbd xmp imon rc-mm [lirc]

中括号包含的才是当前使能的协议,可以使用echo ""+nec" > /sys/class/rc/rc0/protocols使能。

使能NEC协议,根据遥控器类型配置,如果不清楚,可以使能全部(参考:2. Remote Controller’s sysfs nodes — The Linux Kernel documentation

echo nec > /sys/class/rc/rc0/protocols
  1. 确定键值 hexdump /dev/input/event0,仅供参考。

    [root@buildroot:/root #]hexdump /dev/input/event0
    0000000 5253 0001 0000 0000 416e 0000 0000 0000
    0000010 0004 0004 0045 0000 5253 0001 0000 0000
    0000020 416e 0000 0000 0000 0000 0000 0000 0000
    0000030 5253 0001 0000 0000 0ba7 0001 0000 0000
    0000040 0004 0004 0045 0000 5253 0001 0000 0000
    0000050 0ba7 0001 0000 0000 0000 0000 0000 0000
    0000060 5253 0001 0000 0000 b1d3 0002 0000 0000
    0000070 0004 0004 0045 0000 5253 0001 0000 0000
    0000080 b1d3 0002 0000 0000 0000 0000 0000 0000
    

    整理如下:

    5253 0001 0000 0000 416e 0000 0000 0000 0004 0004 0045 0000 
    5253 0001 0000 0000 416e 0000 0000 0000 0000 0000 0000 0000
    5253 0001 0000 0000 0ba7 0001 0000 0000 0004 0004 0045 0000 
    5253 0001 0000 0000 0ba7 0001 0000 0000 0000 0000 0000 0000
    5253 0001 0000 0000 b1d3 0002 0000 0000 0004 0004 0045 0000 
    5253 0001 0000 0000 b1d3 0002 0000 0000 0000 0000 0000 0000
    

    第一行/第三行/第五行的倒数第二个数据为当前按键的键值:0x45;数据是有规律,多观察就可以发现有用的信息。

  2. 内核代码:添加键值映射文件

    源码目录:drivers/media/rc/keymaps/

    主要操作,

    • 复制rc-wetek-play2.c为rc-xxx.c;

    • 修改include/media/rc-map.h,添加当前遥控器的字符串名称

    • 修改rc-xxx.c中的static struct rc_map_table xxx结构体,把键值和按键宏定义一一对应;

    • 修改static struct rc_map_list xxx中的name = RC_MAP_XXX,当前遥控器的字符串名称

    • 修改static struct rc_map_list xxx中的.rc_proto = RC_PROTO_NEC,当前遥控器支持的协议

    • 修改注释/函数名称/模块信息(可选);

    • 修改设备树中ir节点,添加linux,rc-map-name = "rc-xxx";字符串=当前遥控器的字符串名称

  3. 更换内核/设备树,重新启动,设备上电后使用命令irw测试:

    [root@buildroot:/root #]irw
    0000000080010201 00 KEY_NUMERIC_1 devinput-32
    0000000080010201 00 KEY_NUMERIC_1 devinput-32
    0000000080010200 00 KEY_NUMERIC_0 devinput-32
    0000000080010160 00 KEY_OK devinput-32
    0000000080010209 00 KEY_NUMERIC_9 devinput-32
    

ir-keytable获取ir信息

正常工作的:

[root@buildroot:/root #]ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-taobao
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc nec
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms
[root@buildroot:/root #]ir-keytable -t
Testing events. Please, press CTRL-C to abort.
246.661852: lirc protocol(nec): scancode = 0x19
246.661884: event type EV_MSC(0x04): scancode = 0x19
246.661884: event type EV_KEY(0x01) key_down: KEY_NUMERIC_0(0x0200)
246.661884: event type EV_SYN(0x00).
246.713570: lirc protocol(nec): scancode = 0x19 repeat
246.713581: event type EV_MSC(0x04): scancode = 0x19
246.713581: event type EV_SYN(0x00).
246.848031: event type EV_KEY(0x01) key_up: KEY_NUMERIC_0(0x0200)
246.848031: event type EV_SYN(0x00).
252.053993: lirc protocol(nec): scancode = 0x15
252.054010: event type EV_MSC(0x04): scancode = 0x15
252.054010: event type EV_KEY(0x01) key_down: KEY_NUMERIC_8(0x0208)
252.054010: event type EV_SYN(0x00).
252.105833: lirc protocol(nec): scancode = 0x15 repeat
252.105843: event type EV_MSC(0x04): scancode = 0x15
252.105843: event type EV_SYN(0x00).
252.213907: lirc protocol(nec): scancode = 0x15 repeat
252.213919: event type EV_MSC(0x04): scancode = 0x15
252.213919: event type EV_SYN(0x00).
252.348029: event type EV_KEY(0x01) key_up: KEY_NUMERIC_8(0x0208)
252.348029: event type EV_SYN(0x00).

未适配的

[root@buildroot:/root #]ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-empty
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms
辅助测试命令总结

mode2 -d /dev/lircX

正常会打印:code: xxxxx , Partial read XX bytes on /dev/lircX;硬件连接正常、内核配置正常。

如果没有输出,请检查配置或者硬件连接;提示:遥控器可以通过手机拍照,手动按下键后,看是否有红色的光闪烁。

mode2 -d /dev/input/eventX

有输出,则当前内核支持测试的遥控器。

示例:

code: 0xcc6d01000000000036190900000000000400040045000000
code: 0xcc6d01000000000036190900000000000100010201000000
code: 0xcc6d01000000000036190900000000000000000000000000
code: 0xcc6d0100000000000be30900000000000400040045000000
code: 0xcc6d0100000000000be30900000000000000000000000000
code: 0xcc6d01000000000050e80b00000000000100010200000000
code: 0xcc6d01000000000050e80b00000000000000000000000000

ir-keytable

[root@buildroot:/root #]ir-keytable
Found /sys/class/rc/rc0/ with:
        Name: sunxi-ir
        Driver: sunxi-ir
        Default keymap: rc-taobao
        Input device: /dev/input/event0
        LIRC device: /dev/lirc0
        Supported kernel protocols: lirc rc-5 rc-5-sz jvc sony nec sanyo mce_kbd rc-6 sharp xmp imon rc-mm
        Enabled kernel protocols: lirc nec
        bus: 25, vendor/product: 0001:0001, version: 0x0100
        Repeat delay = 500 ms, repeat period = 125 ms

最后,冲浪还发现树莓派都是用lirc_dev这个软件包来适配,但是我没有搞定,所以还是用这种代码的方式来开发。

总结

划分好每个固件的ram地址范围,

RAM–> |OPTEE-OS |TF_A|Linux|kernel|DTB|

修改位置:

tf-a

需要添加映射optee-os的内存地址;

增加编译选项SPD=opteed

uboot

修改binman的描述文件,sunxi-u-boot.dtsi

增加设备树optee的ram描述

修改内核的加载地址,不要踩踏其他固件的

kernel

选中optee驱动;

增加设备树optee的ram描述

rootfs(buildroot)

选中optee-os/client/example软件包;

在boot选项中,选中optee,包含TF-A/u-boot

修改boot/uboot/uboot.mk,UBOOT_MAKE_OPTS += TEE=$(BINARIES_DIR)/tee-pager_v2.bin,指定文件从tee.elf改为tee-pager_v2.bin。

修改genimage.cfg,固件体积增大,需要扩大u-boot-sunxi-with-spl.bin的大小

调试

setenv serverip 192.168.10.20
setenv ipaddr 192.168.10.118
tftp 0x42000000 Image
rm dl/uboot dl/arm-trusted-firmware/ dl/optee-os/ output/build/linux output/build/optee-os-master/ output/build/uboot-v2024.01/ output/build/arm-trusted-firmware-master/ -rf
mount -t nfs -o nolock 192.168.10.20:/home/yd /tmp/

LibreELEC.tv

git clone https://github.com/LibreELEC/LibreELEC.tv.git
git switch libreelec-12.0

注意:一定要切到指定分支,master分支可能存在问题。

如果出现’:443… failed: Connection timed out.',可以尝试把链接在局域网的一台电脑上用浏览器访问下载,可能编译机器就可以正常下载了。

下载命令
PROJECT=Allwinner DEVICE=H6 ARCH=arm64 tools/download-tool
下载脚本:vi down.sh
while true
do
        PROJECT=Allwinner DEVICE=H6 ARCH=arm tools/download-tool
        if [ $? -ne 0 ]; then
                exit 0
        fi
done
提高下载速度的骚操作

vi tools/download-tool

for package in $(find packages/ -name package.mk); do
  if [ -n "$(echo $package | grep addons)" -a -z "$ALL_PACKAGES" ]; then
    continue
  fi
  ./scripts/get $(basename `dirname $package`) &
done

‘./scripts/get $(basename dirname $package) &’ ,同时并行下载,把速度快的包下载了。

编译命令
PROJECT=Allwinner ARCH=aarch64 DEVICE=H6 make image
./scripts/clean package_name
PROJECT=Allwinner DEVICE=H3 ARCH=arm tools/download-tool

参考:Build Commands LE 12.0.x | LibreELEC.wiki

vscode阅读Linux代码(clangd)

Linux主机配置
sudo apt install clangd bear

编译内核代码,并生成编译信息文件

make ARCH=arm64 orangepi-zero3_defconfig
make ARCH=arm64 CROSS_COMPILE=/work/orange_zero_3/buildroot/output/host/bin/aarch64-linux- -j12

或者在make前面添加命令:bear --append -- ,下面步骤可以不做

生成compile_commands.json

python3 ./scripts/clang-tools/gen_compile_commands.py
vscode配置

禁用或卸载官方C/C++插件

安装插件:clangd,LLDB DAP,CMake Tools

全局配置(局部配置需要手动创建json文件),如需使用,仅需复制clangd部分即可。

{
    "remote.SSH.remotePlatform": {
        "192.168.10.10": "linux",
        "192.168.10.11": "linux",
        "192.168.10.20": "linux"
    },
    "window.commandCenter": false,
    "files.defaultLanguage": "display",
    "workbench.colorTheme": "One Dark Modern",
    "cmake.showOptionsMovedNotification": false,
    "terminal.integrated.enableMultiLinePasteWarning": false,
    "arduino.useArduinoCli": true,
    "editor.minimap.enabled": false,
    "workbench.editorAssociations": {
        "*.bin": "default",
        "*.scr": "default"
    },
    "makefile.configureOnOpen": true,
    "search.collapseResults": "auto",
    "search.defaultViewMode": "tree",
    "editor.accessibilitySupport": "off",
    "git.openRepositoryInParentFolders": "never",
    "C_Cpp.intelliSenseEngine": "disabled",
    "cmake.generator": "Ninja",
    "cmake.preferredGenerators": [

    ],
    "cmake.configureSettings": {
    "CMAKE_EXPORT_COMPILE_COMMANDS": 1,
    },
  // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
    "clangd.arguments": [
      "--all-scopes-completion",
      "--completion-style=bundled",
      "--cross-file-rename",
      "--header-insertion=never",
      "--header-insertion-decorators",
      "--background-index",
      "--clang-tidy",
      "-j=16",
      "--pch-storage=memory",
      "--function-arg-placeholders=false",
      "--compile-commands-dir=${workspaceFolder}"
    ],
}

配置clangd

设置—>搜索clangd—>Clangd: Arguments—>添加项

--compile-commands-dir=${workspaceFolder}

删除配置(否则会报Clang Language Server client: couldn’t create connection to server.)

--compile-commands-dir=build

创建.clangd文件(源码目录下面)

解决error: invalid AST错误,此处是照抄别人的配置,具体含义未知。

CompileFlags:       
  Remove: -mabi=lp64
参考

vscode使用clangd报error: invalid AST错误-优快云博客

vscode+clangd阅读Linux内核源码_vscode阅读linux源码-优快云博客

Couldn’t build compiler instance · Issue #734 · clangd/clangd (github.com)

附件

arch/arm/dts/sunxi-u-boot.dtsi

#include <config.h>


#define BL31_ADDR 0x40000000

/ {
	aliases {
		mmc0 = &mmc0;
#if CONFIG_MMC_SUNXI_SLOT_EXTRA == 2
		mmc1 = &mmc2;
#endif
	};

	binman: binman {
		multiple-images;
	};
};

/* Let U-Boot be the firmware layer that controls the watchdog. */
#ifdef CONFIG_MACH_SUN8I_R528
&wdt {
	status = "okay";
};
#endif

&binman {
	u-boot-sunxi-with-spl {
		filename = "u-boot-sunxi-with-spl.bin";
		pad-byte = <0xff>;

		blob {
			/*
			 * This value matches SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR
			 * and SYS_SPI_U_BOOT_OFFS if those are defined.
			 */
			min-size = <0x8000>;
			filename = "spl/sunxi-spl.bin";
		};

		fit {
			description = "Configuration to load ATF before U-Boot";
			#address-cells = <1>;
			fit,fdt-list = "of-list";

			images {
				uboot {
					description = "U-Boot (64-bit)";
					type = "standalone";
					os = "u-boot";
					arch = "arm64";
					compression = "none";
					load = <CONFIG_TEXT_BASE>;

					u-boot-nodtb {
					};
				};

				atf {
					description = "ARM Trusted Firmware";
					type = "firmware";
					os = "arm-trusted-firmware";
					arch = "arm64";
					compression = "none";
					load = <BL31_ADDR>;
					entry = <BL31_ADDR>;

					atf-bl31 {
						filename = "bl31.bin";
						missing-msg = "atf-bl31-sunxi";
					};
				};

				tee {
					description = "test tee";
					type = "tee";
					arch = "arm64";
					os = "tee";
					compression = "none";
					load = <0x40080000>;

					tee-os {
						optional;
					};
				};

				@fdt-SEQ {
					description = "NAME";
					type = "flat_dt";
					compression = "none";
				};
			};

			configurations {
				default = "@config-DEFAULT-SEQ";

				@config-SEQ {
					description = "NAME";
					firmware = "atf";
					loadables = "uboot";
					fdt = "fdt-SEQ";
				};
			};
		};
	};
};

moduleBase addrlength
BL310x400000000x40000
optee-os0x410000000xA00000
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值