/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"
参考:
地址划分
阶段 | 起始地址 | 长度 | 备注 |
---|---|---|---|
BL32 | 0x4000_0000 | 0x0100_0000 | 16MB |
BL31 | 0x4100_0000 | 0x80000 | 512KB |
BL33 | 0x4A00_0000 | — | — |
SH_MEM | 0x4A08_0000 | 0xF8_0000 | 16M-512K |
Linux | 0x4B00_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_ADDR | 0x4ff80000 | |
SPL_BINMAN_SYMBOLS | ||
CONFIG_SPL_BINMAN_UBOOT_SYMBOLS | ||
CONFIG_SPL_LDSCRIPT | arch/arm/cpu/armv8/u-boot-spl.lds | |
CONFIG_SPL_TEXT_BASE | 0x20060 | |
CONFIG_SPL_STACK_R_ADDR | 0x4fe00000 | |
SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR | 0x40 | |
SYS_MMCSD_RAW_MODE_U_BOOT_DATA_PART_OFFSET | 0x10 | |
SPL_PAYLOAD | u-boot.bin | |
SYS_SPI_U_BOOT_OFFS | 0x8000 | |
CONFIG_SPL_STACK_R_MALLOC_SIMPLE_LEN | 0x100000 |
uboot
load | entry | |
---|---|---|
CONFIG_TEXT_BASE | 0x4a000000 | |
BL31_ADDR | 0x40000000 | 0x40000000 |
u-boot-sunxi-with-spl.bin
0x0000_0000 — 0x0000_a000 | sunxi-spl.bin | 0x9fff |
0x0000_A138 —0x000b_bcdf | u-boot-nodtb.bin | 0xb1ba0 |
0x000b_bce0 — 0x000b_bda0 | atf 标识,填充一些字符串 | |
0x000b_bda0 —0x000C_73E7 | bl31.bin | 0xb647 |
0x000c_7484 — 0x000c_c093 | sun50i-h618-orangepi-zero3.dtb | 0x4c00 |
u-boot-sunxi-with-spl.bin | 0xcc5b0 |
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-a | 0x40000000 | 0x80000 |
optee | 0x40080000 | 0x1200000 |
kernel | 0x40100000 | – |
sram_a2 | 0x00100000 | 0x18000 |
修改环境变量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_START | 0x40280000 |
TZDRAM_SIZE | 0x01000000 |
SHMEM_START | 0x40080000 |
SHMEM_SIZE | 0x00200000 |
TEE_CORE_NB_CORE | 4 |
TZC380 | y |
问题:
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
使能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版本内核代码,全志有些修改有问题,系统虽然能跑起来,但是一些模块不能正常工作。个人倾向于把一些配置合并到全志的主线代码中。
- 操作失误引起的奇葩问题
本文记录,仅为提醒别犯类似错误。
最近在玩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
vpu
Sunxi-Cedrus - linux-sunxi.org
Linux IR 适配红外遥控器
硬件连接:略。
内核配置
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来集成。
获取遥控器键值
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
-
确定键值
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;数据是有规律,多观察就可以发现有用的信息。
-
内核代码:添加键值映射文件
源码目录: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";
字符串=当前遥控器的字符串名称;
-
-
更换内核/设备树,重新启动,设备上电后使用命令
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";
};
};
};
};
};
module | Base addr | length |
---|---|---|
BL31 | 0x40000000 | 0x40000 |
optee-os | 0x41000000 | 0xA00000 |