tag 标签: AM62

相关帖子
相关博文
  • 热度 1
    2024-9-18 18:07
    377 次阅读|
    0 个评论
    B y Toradex 胡珊逢 简介 Verdin AM62 是 Toradex 基于 TI AM623/AM625 SoC 的 Arm 计算机模块。它最多提供 4 个 A53 和 1 个 M4F 处理器。这是 TI 基于其 K3 平台的处理器,虽然和 NXP 的 iMX8M Mini/Plus 都使用 A53 核心,但是由于架构不同,在 Linux 系统中配置外设的方式也不同。文章将介绍如何配置 AM62 的引脚复用关系。 硬件介绍 Verdin AM62 所使用的 AM623/AM625 处理器的 GPIO 控制器如下图所示。GPIO 控制器根据不同的处理器可能有多个模块,AM623/AM625 拥有一个 MCU_GPIO0,一个 GPIO0 和一个 GPIO1 共三个模块。每个模块有 9 个 bank,每个 bank 有 16 个引脚,所以理论上最多有 3x9x46 = 432 个引脚。但 AM623/AM625 SoC 并不能使用所有引脚,SoC 实际可用的为 198 个引脚。Verdin AM62 模块并没有把 SoC 的引脚都引出,因而可用的引脚少于 198。 Device Tree 配置 在写本文章时,Verdin AM62 使用toradex_ti-linux-6.1.y分支内核。每个 GPIO 根据用途的不同,相应的配置分布在多个 device tree 文件中。如下图,k3-am62-mcu.dtsi 和 k3-am62-main.dtsi 中定义了三个 GPIO 控制器模块以及对应的物理地址,k3-am62-verdin.dtsi 中包含每个引脚的具体配置。三个 GPIO 控制器分为两种,MCU_GPIO 和 GPIO0/1,它们可以使用各自专门的函数来配置所控制的引脚。&mcu_pmx0 和 &main_pmx0 分别使用 AM62X_MCU_IOPAD 和 AM62X_IOPAD 配置。下面将介绍如何修改和使用 mcu_gpio0,main_gpio0 和 main_gpio1 模块所控制的引脚。 我们分别选择来自如下三个不同 IO 控制器的引脚,分别是 SOIDMM 19、21、61。 查看Verdi AM62 Datatsheet的 Table 12: Alternate functions 可以确定对应引脚的 SoC Ball ID 和 SoC ball name。在 TIAM623/AM625处理器的 Datasheet 中 Table 6-1. Pin Attributes 可以找到对应 SoC Ball ID 的 PADCONFIG Address。有了这些信息就能够在 Device tree 中进行配置。 SODIMM SoC Ball ID SoC ball name PADCONFIG Address ALT7 61 A6 MCU_UART0_CTSn 0x0408401C MCU_GPIO0_7 21 U24 GPMC0_AD15 0x000F4078 GPIO0_30 19 A14 SPI0_CLK 0x000F41BC GPIO1_17 SODIMM 19 k3-am62-verdin.dtsi 中提供了默认引脚的配置。Toradex 在代码中做了详细的注释,例如以 SODIMM 19 为关键字搜索,可以找到该引脚的默认配置,这里发现关于 SODIMM 19 的配置有两个。SODIMM 19 属于 GPIO1 控制器,所以该配置是 main_pmx0 下面的子节点,并使用 AM62X_IOPAD 函数进行配置。A14(Ball ID)的 PADCONFIG 地址是 0x000F41BC,对应的掩码是 0x1fff,AM62X_IOPAD 使用 0x01bc。 PIN_OUTPUT/PIN_INPUT 表示把该引脚配置为输出/输入状态。数字 2 表示该引脚使用第二个复用配置,即当作 PWM1_A 使用。数字 7 表示该引脚使用第七个复用配置,即当作 GPIO 使用。引脚所有可用的复用关系可在 Verdi AM62 Datatsheet Table 12: Alternate functions 查看。AM62 处理器的引脚最多可以有 10 个复用配置可选,在 Table 12 中由 ALT0 到 ALT9 表示。部分引脚可能少于 10 个复用配置。后面的注释中,A14 为 SoC Ball ID,SPI0_CLK 是 SoC Ball Name,GPIO1_17 指当前选择第七个复用配置,作为 GPIO 对应的编号 GPIO1_17。当配置为 PWM 功能时就由 GPIO1_17 改为 EHRPWM1_A。在修改为其他复用配置后,建议也对应修改注释,便于理解代码。 /* Verdin PWM_3_DSI */ pinctrl_epwm1_a: main-epwm1a-pins- default { pinctrl- single ,pins = < AM62X_IOPAD ( 0 x01bc, PIN_OUTPUT, 2 ) /* (A14) SPI0_CLK.EHRPWM1_A */ /* SODIMM 19 */ ; }; pinctrl_pwm3_dsi_gpio: main-gpio1 -17 -pins- default { pinctrl- single ,pins = < AM62X_IOPAD ( 0 x01bc, PIN_INPUT, 7 ) /* (A14) SPI0_CLK.GPIO1_17 */ /* SODIMM 19 */ ; }; 上面 AM62X_IOPAD 中配置的 PIN_OUTPUT/PIN_INPUT 将设置 PADCONFIG 的寄存器。PIN_OUTPUT/PIN_INPUT 在 k3-pinctrl.h 定义。 /* Only these macros are expected be used directly in device tree files */ # define PIN_OUTPUT (INPUT_DISABLE | PULL_DISABLE) # define PIN_OUTPUT_PULLUP (INPUT_DISABLE | PULL_UP) # define PIN_OUTPUT_PULLDOWN (INPUT_DISABLE | PULL_DOWN) # define PIN_INPUT (INPUT_EN | PULL_DISABLE) # define PIN_INPUT_PULLUP (INPUT_EN | PULL_UP) # define PIN_INPUT_PULLDOWN (INPUT_EN | PULL_DOWN) PIN_OUTPUT/PIN_INPUT 定义的值最终被写入 Pad Configuration 寄存器,具体的说明可以参考 AM623/625 的Technical Reference Manual中 Table 6-2045. Description Of The Pad Configuration Register Bits 相关说明。 根据 pinctrl_epwm1_a 查找,发现该引脚被分配到 epwm1,为了将 SODIMM 19 作为 GPIO 使用,在device tree 需要确保 epwm1 处于 disabled 状态。 /* Verdin PWM_3_DSI */ &epwm1 { pinctrl-names = "default" ; pinctrl-0 = ; status = "disabled" ; }; 如果使用 k3-am625-verdin-nonwifi-dev.dtb,那么在 k3-am62-verdin-dev.dtsi 中需要将 epwm1 禁用。 /* Verdin PWM_3_DSI */ &epwm1 { status = "disabled" ;}; 在 k3-am62-verdin.dtsi 的 main_gpio1 可以为 GPIO1 控制器的引脚添加 line-name,这样在 Linux 中 libgpiod 就能够使用更直观 line-name 直接访问引脚。gpio-line-names 从 gpio1_0 开始为每个引脚添加 line-name,gpio1_17 则设置为 SODIMM_19。 &main_gpio1 { gpio-line-names = "" , /* 0 */ "" , "" , "" , "" , "" , "" , "" , "" , "" , "" , /* 10 */ "" , "" , "" , "" , "SODIMM_15" , "SODIMM_16" , "SODIMM_19" , 由于 SOIDMM 19 属于 GPIO1 控制器,在 k3-am62-verdin-dev.dtsi 中需要添加 main_gpio1 节点并将 pinctrl_pwm3_dsi_gpio 添加到节点中。 &main_gpio1 { pinctrl-names = "default" ; pinctrl-0 = ;}; SODIMM 21 SODIMM 21 也是类似的方法。在 Verdi AM62 Datatsheet Table 12: Alternate functions 中看到 SOIDMM 21 对应的 SoC Ball ID 为 U24,第七复用配置 ALT7 可以作为 GPIO 功能,编号 GPIO0_30,这属于 GPIO0 控制器。TIAM623/AM625处理器的 Datasheet 中 Table 6-1. Pin Attributes 中找到 U24 对应的 PADCONFIG Address 是 0x000F4078。因此,在 AM62X_IOPAD 使用 0x0078。 /* Verdin DSI_1_BKL_EN */ pinctrl_dsi1_bkl_en: main-gpio0 -30 -pins- default { pinctrl- single ,pins = < AM62X_IOPAD ( 0 x0078, PIN_INPUT, 7 ) /* (U24) GPMC0_AD15.GPIO0_30 */ /* SODIMM 21 */ ; }; 在 main_gpio0 中,GPIO0_30 的 line-name 已经被定义为 SODIMM_21。 &main_gpio0 { gpio - line - names = "" , "SODIMM_76" , "SODIMM_21" , /* 30 */ SODIMM 21 属于 GPIO0 控制器,在 k3-am62-verdin-dev.dtsi 中,将 pinctrl_dsi1_bkl_en 添加到 main_gpio0 节点中。 &main_gpio0 { pinctrl-names = "default" ; pinctrl-0 = , , , , , ;}; SODIMM 61 在 Verdi AM62 Datatsheet 的 Table 12 发现 SODIMM 61 对应 ALT7 为 MCU_GPIO0_7,SoC Ball ID 为 A6,SoC ball name 为 MCU_UART0_CTSn。在 TI AM623/AM625 处理器的 Datasheet 中 Table 6-1 中对应的 PADCONFIG Address 是 0x0408401C。使用 0x010c 作为关键字在 k3-am62-verdin.dtsi 检索只发现下面配置,但该子节点属于 main_pmx0 而非为 mcu_pmx0。所以在 k3-am625-verdin-nonwifi-dev.dtb 并未配置 SODIMM 61。那么就需要在 k3-am62-verdin.dtsi 添加相关配置。 pinctrl_sdhci2: main-mmc2-pins- default { pinctrl- single ,pins = < AM62X_IOPAD ( 0 x120, PIN_INPUT, 0 ) /* (C24) MMC2_CMD */ /* WiFi_SDIO_CMD */ AM62X_IOPAD ( 0 x118, PIN_INPUT, 0 ) /* (D25) MMC2_CLK */ /* WiFi_SDIO_CLK */ AM62X_IOPAD ( 0 x114, PIN_INPUT, 0 ) /* (B24) MMC2_DAT0 */ /* WiFi_SDIO_DATA0 */ AM62X_IOPAD ( 0 x110, PIN_INPUT, 0 ) /* (C25) MMC2_DAT1 */ /* WiFi_SDIO_DATA1 */ AM62X_IOPAD ( 0 x10c, PIN_INPUT, 0 ) /* (E23) MMC2_DAT2 */ /* WiFi_SDIO_DATA2 */ 在 mcu_pmx0 中把 SODIMM 61 配置作为子节点添加进去。注意,由于 SODIMM 61 属于 MCU_GPIO 控制器,所以这里使用 AM62X_MCU_IOPAD 来配置。 &mcu_pmx0 { /* Verdin GPIO_9 */ pinctrl_gpio_9: mcu-gpio0 -7 -pins- default { pinctrl-single,pins = < AM62X_MCU_IOPAD ( 0x001c , PIN_INPUT, 7 ) /* (A6) MCU_UART0_CTSn.MCU_GPIO0_7 */ /* SODIMM 61 */ ; }; 在 &mcu_gpio0 中第八个位置添加 MCU_GPIO0_7 对应的 line-name 为 SODIMM_61。其中第一行 SODIMM_244 对应的是 MCU_GPIO0_0,第二行 SODIMM_206 对应的是 MCU_GPIO0_1。 &mcu_gpio0 { gpio-line-names = "SODIMM_244" , "SODIMM_206" , "SODIMM_208" , "SODIMM_210" , "SODIMM_212" , "" , "" , "SODIMM_61" , 在 k3-am62-verdin-dev.dtsi 中的 mcu_gpio0 节点中添加前面配置的 pinctrl_gpio_9。 &mcu_gpio0 { pinctrl-names = "default" ; pinctrl-0 = , , , , , ;}; 引脚测试 上面配置完成后,重新编译 device tree,并部署到的开发板上。 make ti/k3-am625-verdin-nonwifi-dev.dtb 重启后使用gpioinfo命令找到上面配置三个引脚在 Linux 系统中对应的 bank 和 line 编号。 gpiochip1 - 24 lines : line 7 : "SODIMM_61" unused input active-high gpiochip2 - 92 lines : line 30 : "SODIMM_21" unused input active-high gpiochip3 - 52 lines : line 17 : "SODIMM_19" unused input active-high 下面三个命令分别可以把对应的引脚拉高或拉低。 root @verdin - am62 : ~ # gpioset 3 17=1 root @verdin - am62 : ~ # gpioset 2 30=1 root @verdin - am62 : ~ # gpioset 1 7=1 root @verdin - am62 : ~ # gpioset 3 17=0 root @verdin - am62 : ~ # gpioset 2 30=0 root @verdin - am62 : ~ # gpioset 1 7=0 除了像上面直接在 user space 控制 GPIO 的状态,驱动中也可以控制相关引脚。例如在 k3-am62-verdin-dev.dtsi 的根节点下添加一个 LED 子节点并使用 SOIDMM 61 来控制。首先,需要把 pinctrl_gpio_9 从原来 &mcu_gpio0 删除,因为这里该引脚不再作为普通的 GPIO 使用,而是用于 LED 驱动。在 gpios 参数中使用 &mcu_gpio0 7 来引用 SODIMM 61。如果是 main_gpio0 控制器下的 SODIMM 21,则对应需要使用 &main_gpio0 30 来引用。 gpio-leds { compatible = "gpio-leds" ; pinctrl-names = "default" ; pinctrl-0 = ; led-yellow { gpios = <&mcu_gpio0 7 ; default-state = "on" ; label = "status" ; }; }; 总结 文章就 AM623/625 SoC 介绍了如何在 Device tree 中配置和使用 GPIO,需要注意区分 GPIO 来自哪个控制器,并使用对应的函数和引用符号。
  • 热度 1
    2024-9-18 17:48
    1136 次阅读|
    0 个评论
    By Toradex秦海 1).简介 嵌入式设备对于网络安全的要求越来越高,而 Secure boot就是其中重要的一部分。 TI AM62X处理器基于行业标准 X.509认证来提供 Secure boot启动过程中的 Chain of Trust; X.509认证是基于公共密钥加密 (Public Key Cryptography)和数字签名 (Digital Signature)技术来实现 Secure boot的。AM62X处理器涉及 Security的架构框图如下。 AM62X处理器启动流程图参考如下。本文就基于 TI AM625处理器平台简单介绍其 Secure Boot的部署流程。 本文所演示的平台来自于ToradexVerdinAM62嵌入式平台,主要介绍基本的 Chain of Trust,也就是 U-boot和Linux Kernel/DTB两个层级的加密和验证启动,后面 Rootfs以及 Application层面暂不涉及。 2.准备 a).Verdin AM62 ARM核心版配合Dahlia载板,并连接调试串口用于测试。 这里下载 Toradex Yocto Linux BSP6 Reference Image用于后续测试,目前最新的是 6.7.0版本。 3). 生成 Customer Key Set文件 a).TI AM62处理器有如下三种设备类型,其中 GP (General Purpose)类型的处理器是不具备支持 Secure Boot功能的,只有 HS (High Security)类型的处理器是支持的,然后其还细分为两个状态,HS-FS (Field Securable)和 HS-SE (Security Enforced),具体的说明请见如下。TI AM62X HS类型处理器出厂配置为 HS-FS状态,且都已经预先写入了 TI Dummy Key在设备中。 b).由于将 HS设备从 HS-FS状态配置为 HS-SE状态是不可逆的,因此本文为了方便演示流程仅仅使用 TI预置的 Dummy Key在 HS-FS状态下进行 Signed Image Authentication流程演示,但会将 Customer key的生成和烧录流程进行说明。 c).通过下面命令生成 Customer Root Key Set (SMPK)和 Customer Back-up Key Set (BMPK)文件,用于后续的 Boot Image签名以及烧录 Image生成。 -------------------------------- ### key name should not be changed ### $exportCustomer_KEYS_DIR= $ export SMPK_NAME=custMpk $ export BMPK_NAME=backMpk ###Create the SMPK key pair and certificate using RSA 4096### $ cd $Customer_KEYS_DIR $ openssl genrsa -F4 -out ${SMPK_NAME}.key 4096 $ cp ${SMPK_NAME}.key ${SMPK_NAME}.pem $ openssl req -batch -new -x509 -key ${SMPK_NAME}.key -out ${SMPK_NAME}.crt ###Create the BMPK key pair and certificate using RSA 4096### $ openssl genrsa -F4 -out ${BMPK_NAME}.key 4096 $ cp ${BMPK_NAME}.key ${BMPK_NAME}.pem $ openssl req -batch -new -x509 -key ${BMPK_NAME}.key -out ${BMPK_NAME}.crt ### Remove write access to the keys and certificates ### $ chmod a-w * -------------------------------- 4). Boot Image编译和签名 这里说明下载Toradex YoctoLinuxBSP 6.x.y版本包含 U-boot在内的编译 Boot Images所需要的全部源代码 -------------------------------- ###Get the U-Boot source codefor Yocto Linux BSP 6.x.y ### $ git clone -b toradex_ti-u-boot-2023.04 https://git.toradex.cn/u-boot-toradex.git $ export UBOOT_DIR=$(pwd)/u-boot-toradex ###Get the binary-only System Firmware (SYSFW)### $ git clone git://git.ti.com/k3-image-gen/k3-image-gen.git $ export K3_DIR=$(pwd)/k3-image-gen ###Get the TI Linux Firmware### $ git clone -b ti-linux-firmware git://git.ti.com/processor-firmware/ti-linux-firmware.git $ export TI_LINUX_FW_DIR=$(pwd)/ti-linux-firmware ###Get the ARM Trusted Firmware (ATF/TF-A)### $ git clone https://github.com/ARM-software/arm-trusted-firmware.git $ export TFA_DIR=$(pwd)/arm-trusted-firmware ###Get the OP-TEE image source code### $ git clone https://github.com/OP-TEE/optee_os.git $ export OPTEE_DIR=$(pwd)/optee_os ###Get the K3 Security development package:### $ git clone https://git.ti.com/git/security-development-tools/core-secdev-k3.git -b master $ export CORE_SECDEV_K3_DIR=$(pwd)/core-secdev-k3 -------------------------------- b).Customer Key Set需要部署在K3 Security development package和U-Boot source code如下位置,默认部署的是 TI Dummy Key,本文因为都是基于 TI Dummy Key进行测试,因此不做替换修改。 ./K3 Security development package -------------------------------- $ cd $CORE_SECDEV_K3_DIR/keys $ ls custMpk.crt custMpk.key custMpk.pem swrv.txt ti-degenerate-key.pem $ md5sum custMpk.key bd90ee9fe69667315eeee32bc7a01b39 custMpk.key $ md5sum custMpk.pem bd90ee9fe69667315eeee32bc7a01b39 custMpk.pem $ md5sum custMpk.crt f2a1562c002fc38319bf82471b0661a3 custMpk.crt ### replace TI Dummy Key with Customer Key if needed ### $ cp $Customer_KEYS_DIR/* $CORE_SECDEV_K3_DIR/keys -------------------------------- ./U-Boot source code -------------------------------- $ cd $UBOOT_DIR/board/ti/keys/ $ ls custMpk.crt custMpk.key custMpk.pem swrv.txt ti-degenerate-key.pem $ md5sum custMpk.key bd90ee9fe69667315eeee32bc7a01b39 custMpk.key $ md5sum custMpk.pem bd90ee9fe69667315eeee32bc7a01b39 custMpk.pem $ md5sum custMpk.crt f2a1562c002fc38319bf82471b0661a3 custMpk.crt ### replace TI Dummy Key with Customer Key if needed ### $ cp $Customer_KEYS_DIR/* $CORE_SECDEV_K3_DIR/keys -------------------------------- 这里配置交叉编译 toolchain,注意由于不同的固件需要对应 32bit或者 64bit toolchain编译器,因此这里两种 toolchain都需要配置,配置完成后参考如下命令 export 32bit/64bit toolchain相应的环境变量。 -------------------------------- ### 64bit toolchain env ### $ export ARCH=arm64 $ export DTC_FLAGS="-@" $ export PATH=~/gcc-linaro-aarch64/bin/:$PATH $ export CROSS_COMPILE=aarch64-none-linux-gnu- ### 32bit toolchain env ### $ export PATH=~/gcc-linaro-arm/bin/:$PATH -------------------------------- d).参考这里对 Boot Images进行编译 ./ Build ARM Trusted Firmware (ATF/TF-A) -------------------------------- $ cd $TFA_DIR $ export ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- $ unset TFA_EXTRA_ARGS $ make PLAT=k3 SPD=opteed $TFA_EXTRA_ARGS TARGET_BOARD=lite -------------------------------- ./ Build OP-TEE Image -------------------------------- $ cd $OPTEE_DIR $ export OPTEE_EXTRA_ARGS="CFG_WITH_SOFTWARE_PRNG=y" $ export ARCH=arm $ export CROSS_COMPILE=arm-none-linux-gnueabihf- $ export CROSS_COMPILE64=aarch64-none-linux-gnu- $ make PLATFORM=k3-am62x CFG_ARM64_core=y $OPTEE_EXTRA_ARGS -------------------------------- ./ Build U-Boot for R5 -------------------------------- ### Step-1 under U-boot directory ### $ cd $UBOOT_DIR $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- verdin-am62_r5_defconfig $ make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- BINMAN_INDIRS=$TI_LINUX_FW_DIR ### Step-2 under System Firmware directory ### $ cd $K3_DIR $ make SOC=am62x SOC_TYPE="hs-fs" TI_SECURE_DEV_PKG=$CORE_SECDEV_K3_DIR SBL=$UBOOT_DIR/spl/u-boot-spl.bin SYSFW_DIR=$TI_LINUX_FW_DIR/ti-sysfw $ cp tiboot3-am62x-hs-fs-evm.bin ../tiboot3-am62x-hs-fs-verdin.bin -------------------------------- //对应不同的 SOC_TYPE选项,会生成不同的 Binary Image,其对应关系参考如下两个表格,在出厂默认的 HS-FS SoC Type下,需要编译HS-FS对应的固件;而一旦通过 TI OTP Keywriter工具将 Customer Key写入 eFUSE并将设备配置为 HS-SE状态后,就需要编译 HS-SE SOC Type对应的固件才能正常启动了。 ./ Build U-Boot for A53 -------------------------------- ### Default configuration ### $ cd $UBOOT_DIR $ export ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- $ make verdin-am62_a53_defconfig ### Customized configuration to force FIT image to be authenticated ### $ make menuconfig CONFIG_FIT_SIGNATURE_ENFORCE=y ### Compile ### $ make BINMAN_INDIRS=$TI_LINUX_FW_DIR \ BL31=$TFA_DIR/build/k3/lite/release/bl31.bin \ TEE=$OPTEE_DIR/out/arm-plat-k3/core/tee-raw.bin $ cp tispl.bin ../ $ cp u-boot.img ../ -------------------------------- 5). 签名 Linux kernel FIT Image a).此步骤为可选步骤,如果不需要强制 FIT Image Authentication则在上面 4.d Build U-Boot for A53步骤中可以不使能CONFIG_FIT_SIGNATURE_ENFORCE配置,然后跳过此章节直接进行 BSP Image修改部署章节即可。 b).解压 Toradex Ycoto Linux BSP6 Image,获得 LInux Kernel/DTB/DTBO等文件 -------------------------------- ### uncompress BSP Image package ### $ tar xvf Verdin-AM62_Reference-Minimal-Image-Tezi_6.7.0+build.13.tar $ cd Verdin-AM62_Reference-Minimal-Image-Tezi_6.7.0+build.13/ ### uncompress boot filesystem ### $ mkdir bootfs/ $ tarJxfReference-Minimal-Image-verdin-am62.bootfs.tar.xz -C bootfs/ ### copy kernel/dtb/dtbo image fit image work folder ### $ export FIT_IMAGE_DIR= $ cd bootfs/ $cp -r * $FIT_IMAGE_DIR -------------------------------- c).修改 FIT Image描述文件,一个示例说明部分如下,需要根据你实际存放 Linux Kernel/DTB/DTBO文件的位置来修改文件“data”参数本文使用的完整描述文件模板请从这里下载。 ./ fitImage-its--6.1.83+git0+0a32d33d5f-r0-verdin-am62-20240701094251.its -------------------------------- /dts-v1/; / { description = "Kernel fitImage for TDX Wayland with XWayland/6.1.83+gitAUTOINC+0a32d33d5f/verdin-am62"; #address-cells = ; images { kernel-1 { description = "Linux kernel"; data = /incbin/("$FIT_IMAGE_DIR/Image.gz"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "gzip"; load = ; entry = ; hash-1 { algo = "sha512"; }; }; fdt-ti_k3-am625-verdin-nonwifi-dahlia.dtb { description = "Flattened Device Tree blob"; data = /incbin/("$FIT_IMAGE_DIR/k3-am625-verdin-nonwifi-dahlia.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; load = ; hash-1 { algo = "sha512"; }; }; ... ... -------------------------------- d).生成 FIT Image ./由于在生成 FIT Image的时候需要同时将 Public Key信息嵌入到 u-boot.dtb,因此这里需要找到 U-Boot默认的 dtb文件。根据 U-Boot编译 default configuration来确认默认的 dtb文件即为 "arch/arm/dts/k3-am625-verdin-wifi-dev.dtb" -------------------------------- $vi $UBOOT_DIR/configs/verdin-am62_a53_defconfig ... CONFIG_DEFAULT_DEVICE_TREE="k3-am625-verdin-wifi-dev" ... -------------------------------- ./在 FIT Image work folder通过下面命令生成签名的 FIT Image -------------------------------- $ mkimage -f fitImage-its--6.1.83+git0+0a32d33d5f-r0-verdin-am62-20240701094251.its -k $UBOOT_DIR/board/ti/keys -K $UBOOT_DIR/arch/arm/dts/k3-am625-verdin-wifi-dev.dtb -r fitImage -------------------------------- e).根据 4.d Build U-Boot for A53步骤,不修改任何 configuration的情况下,重新编译 U-Boot Image -------------------------------- $ cd $UBOOT_DIR ### Compile ### $ make BINMAN_INDIRS=$TI_LINUX_FW_DIR \ BL31=$TFA_DIR/build/k3/lite/release/bl31.bin \ TEE=$OPTEE_DIR/out/arm-plat-k3/core/tee-raw.bin $ cp tispl.bin ../ $ cp u-boot.img ../ -------------------------------- 6 ). 修改和部署 Yocto Linux BSP a).使用 4.d Build U-Boot for R5步骤生成的“tiboot3-am62x-hs-fs-verdin.bin”文件和 5.e步骤重新编译生成的“tispl.bin”和“u-boot.img”文件修改 Yocto Linux BSP对应的 Boot Images文件 -------------------------------- $ cdVerdin-AM62_Reference-Minimal-Image-Tezi_6.7.0+build.13/ $ rm tiboot3-am62x-hs-fs-verdin.bin tispl.bin u-boot.img $ cp .../tiboot3-am62x-hs-fs-verdin.bin . $ cp .../tispl.bin . $ cp .../u-boot.img . -------------------------------- b).将 5.d步骤生成的 FIT Image部署到刚才解压的Ycoto Linux BSP6 bootfs中,并重新创建bootfs压缩包 -------------------------------- ### copy FIT image to bsp rootfs folder ### $ cp$$FIT_IMAGE_DIR/fitImage.../Verdin-AM62_Reference-Minimal-Image-Tezi_6.7.0+build.13/bootfs/ ### remove default Linux kernel/dtb/dtbo files ### $ cd .../Verdin-AM62_Reference-Minimal-Image-Tezi_6.7.0+build.13/bootfs/ $ rm -rf Image.gz k3-am625-verdin-* overlays ### check bootfs files ### $ tree -L 1 . ├── boot.scr ├── fitImage └── overlays.txt ### compress new bootfs package ### $ tar Jcf ../Reference-Minimal-Image-verdin-am62.bootfs.tar.xz* ### clear bootfs $ cd .. $ rm -rf bootfs/ -------------------------------- c).修改BSP package中的“u-boot-initial-env-sd”文件,增加如下环境变量用于使能 U-Boot加载 FIT Image来启动 -------------------------------- ---a/u-boot-initial-env-sd2024-07-01 18:00:22.000000000 +0800 +++b/u-boot-initial-env-sd2024-09-12 16:35:02.000000000 +0800 @@ -30,6 +30,7 @@ kernel_addr_r=0x88200000 kernel_comp_addr_r=0x80200000 kernel_comp_size=0x08000000 +kernel_image=fitImage load_efi_dtb=load ${devtype} ${devnum}:${distro_bootpart} ${fdt_addr_r} ${prefix}${efi_fdtfile} loadaddr=0x88200000 mmc_boot=if mmc dev ${devnum}; then devtype=mmc; run scan_dev_for_boot_part; fi -------------------------------- d).需要注意的是由于Kernel阶段的Secure Boot相关认证和加载都是基于U-Boot环境变量来实现的, 因此如果要让这个启动机制更加安全可靠,则要让U-Boot保持在上述安全启动路径,而不能通过其他启动介质或者脚本来启动而绕开 Secure Boot,比如 Toradex U-Boot默认是使能 Distro Boot功能的,可以自动扫描外设介质的启动脚本,那么这个功能就需要关闭掉,类似这样的 U-Boot定制化和启动路径固化可以参考如下文章,本文不做进一步介绍。 https://developer.toradex.cn/torizon/security/u-boot-hardening-for-secure-boot/ e).如果你的 Linux BSP Image是通过 Yocto Project编译生成,那么如下是一个 Toradex Security Meta Layer,你可以直接将其集成到你的 Yocto Project编译环境中,然后按照说明配置后直接生成签名甚至加密好的 BSP Image。 https://github.com/toradex/meta-toradex-security 7 ).部署 测试 a).参考这里将上述制作完成数字签名的 BSP Image通过 Toradex Easy Installer更新到 Verdin AM62模块。因为本文测试基于 TI已经预先烧写到 SoC的 dummy key,所以可以直接启动测试,如果是使用 Customized Key,则还需要参考后续 eFuse烧写操作将 Customized Key烧写到 SoC才能正确验证并启动。 ./启动后查看启动log,可以看到 Boot Images和 Linux FIT Image (Kernel Image/DTB/DTBO) Secure Boot验证签名成功并最终完整启动 -------------------------------- U-Boot SPL 2023.04-28170-gc997b1b09fb (Sep 10 2024 - 17:41:33 +0800) SYSFW ABI: 4.0 (firmware rev 0x000a '10.0.8--v10.00.08 (Fiery Fox)') Changed A53 CPU frequency to 1250000000Hz (T grade) in DT SPL initial stack usage: 13472 bytes Trying to boot from MMC1 Authentication passed // ATF authentication Authentication passed // TEE authentication Authentication passed // DM-FW authentication Loading Environment from nowhere... OK init_env from device 9 not supported! Authentication passed // A53 SPL authentication Authentication passed // A53 SPL DTB authentication Starting ATF on ARM64 core... NOTICE: BL31: v2.11.0(release):v2.10.0-1555-g8e9bdc5b1 NOTICE: BL31: Built : 17:04:05, Aug 30 2024 ... U-Boot SPL 2023.04-28170-gc997b1b09fb (Sep 12 2024 - 16:56:27 +0800) SYSFW ABI: 4.0 (firmware rev 0x000a '10.0.8--v10.00.08 (Fiery Fox)') SPL initial stack usage: 1904 bytes Trying to boot from MMC1 Authentication passed // A53 u-boot authentication Authentication passed // A53 u-boot DTB authentication U-Boot 2023.04-28170-gc997b1b09fb (Sep 12 2024 - 16:56:27 +0800) SoC: AM62X SR1.0 HS-FS DRAM: 1 GiB Core: 143 devices, 31 uclasses, devicetree: separate ... Found U-Boot script /boot.scr 6003 bytes read in 10 ms (585.9 KiB/s) ## Executing script at 90280000 82 bytes read in 9 ms (8.8 KiB/s) 8918270 bytes read in 78 ms (109 MiB/s) Bootargs: root=PARTUUID=33e36968-02 ro rootwait console=tty1 console=ttyS2,115200 consol0 ## Loading kernel from FIT Image at 90300000 ... Using 'conf-ti_k3-am625-verdin-wifi-dev.dtb' configuration Verifying Hash Integrity ... sha512,rsa4096:custMpk+ OK // Kernel Image authentication Trying 'kernel-1' kernel subimage Description: Linux kernel Type: Kernel Image Compression: gzip compressed Data Start: 0x90300108 Data Size: 8305029 Bytes = 7.9 MiB Architecture: AArch64 OS: Linux Load Address: 0x80200000 Entry Point: 0x80200000 Hash algo: sha512 Hash value: 1eae3ec7c7d250d709d07f8af174e8de9c2293a9a61683f1f1a4f5981e96dc9ab090cc Verifying Hash Integrity ... sha512+ OK ## Loading fdt from FIT Image at 90300000 ... Using 'conf-ti_k3-am625-verdin-wifi-dev.dtb' configuration Verifying Hash Integrity ... sha512,rsa4096:custMpk+ OK // Kernel DTB authentication Trying 'fdt-ti_k3-am625-verdin-wifi-dev.dtb' fdt subimage ... Verifying Hash Integrity ... sha512+ OK Loading fdt from 0x90b40bd0 to 0x83000000 ## Loading fdt from FIT Image at 90300000 ... Using 'conf-verdin-am62_dsi-to-hdmi_overlay.dtbo' configuration Verifying Hash Integrity ... sha512,rsa4096:custMpk+ OK // DTBO authentication Trying 'fdt-verdin-am62_dsi-to-hdmi_overlay.dtbo' fdt subimage ... Verifying Hash Integrity ... sha512+ OK ## Loading fdt from FIT Image at 90300000 ... Using 'conf-verdin-am62_spidev_overlay.dtbo' configuration Verifying Hash Integrity ... sha512,rsa4096:custMpk+ OK // DTBO authentication Trying 'fdt-verdin-am62_spidev_overlay.dtbo' fdt subimage ... Verifying Hash Integrity ... sha512+ OK Booting using the fdt blob at 0x83000000 Working FDT set to 83000000 Uncompressing Kernel Image Loading Device Tree to 0000000098ec8000, end 0000000098edc6b5 ... OK Working FDT set to 98ec8000 Starting kernel ... Booting Linux on physical CPU 0x0000000000 Linux version 6.1.83-6.7.0+git.0a32d33d5fb7 (oe-user@oe-host) (aarch64-td4 Machine model: Toradex Verdin AM62 WB on Verdin Development Board ... -------------------------------- b). AM62x SoC eFuse烧写以及将设备从 HS-FS转换为 HS-SE状态 ./ eFuse烧写流程详细烧写流程可以参考这里。 ./首先下载安装最新 TI MCU+ SDK,以及对应版本的 CCS和 sysconfig工具到 Linux开发主机 (推荐为 ${HOME}/ti/ )目录,详细过程参考上面的文章链接。 ./安装 TI OTP Keywriter工具软件和使用指南,这些是 secure资料,需要在 TI网站上面注册申请通过后才能获取。安装路径为 /mcu_plus_sdk_am62x_10_00_00_14/source/security。OTP Keywriter的详细使用指南文档是 AM62X_OTP_Keywriter_User_Guide。 -------------------------------- $ tree -L 2 ~/ti/mcu_plus_sdk_am62x_10_00_00_14/source/security/ /home/simon/ti/mcu_plus_sdk_am62x_10_00_00_14/source/security/ ├── sbl_keywriter │├── am62x-sk │├── boardcfgs │├── keywr_bin │├── manifest │├── scripts │└── tools ├── uninstall └── uninstall.dat -------------------------------- ./生成 X.509 Certificate // Keywriter预置 TI dummy key,因此如果是基于 TI dummy key set进行生成,则命令如下。注意“--keyrev”参数,只要这个参数被烧写到了 eFuse上面,那么这个设备就立即转化为 HS-SE状态,所有 secure boot限制将都生效,设备也无法再次刷写其他 key信息,因此此过程可以分步或者一次进行,前期测试阶段建议分步,先烧写 key,进行验证通过后,再进行 keyrev烧写,将设备变更为 HS-SE状态。 -------------------------------- ### Generate X.509 certificate ### ### Option-1, step by step $ cd /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/scripts/cert_gen/am62x ## Generate certificate for programming MSV(Model Specific Value) and TI dummy key sets, but not turn device into HS-SE $ ./gen_keywr_cert.sh -t tifek/ti_fek_public.pem --msv 0xC0FFE -b-def --bmek-def -s-def --smek-def --keycnt 2 ## Generates certificate for setting the program key revision to 1 ./gen_keywr_cert.sh -t tifek/ti_fek_public.pem --keyrev 1 ### Option-2, one-shot ## programming MSV, key sets, and turn device into HS-SE in one shot command $ ./gen_keywr_cert.sh -t tifek/ti_fek_public.pem --msv 0xC0FFE -b-def --bmek-def -s-def --smek-def --keycnt 2 --keyrev 1 ### Convert certificate binary to .h format ### $ cd /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/scripts/x509cert $ python3 ../../../../../tools/bin2c/bin2c.py final_certificate.bin keycert.h KEYCERT 2024 -------------------------------- //如果是基于 customized key set,则要将相关命令修改如下: -------------------------------- ### Copy customized key set for keywriter ### $ cd /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/scripts/cert_gen/am62x $ cp $Customer_KEYS_DIR/custMpk.key keys_devel/smek.key $ cp $Customer_KEYS_DIR/custMpk.pem keys_devel/smpk.pem $ cp $Customer_KEYS_DIR/backMpk.key keys_devel/bmek.key $ cp $Customer_KEYS_DIR/backMpk.pem keys_devel/bmpk.pem ### Generate X.509 certificate ### ### Option-1, step by step $ cd /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/scripts/cert_gen/am62x ## Generate certificate for programming MSV(Model Specific Value) and TI dummy key sets, but not turn device into HS-SE $ ./gen_keywr_cert.sh -t tifek/ti_fek_public.pem --msv 0xC0FFE -b keys_devel/bmpk.pem --bmek keys_devel/bmek.key -s keys_devel/smpk.pem --smek keys_devel/smek.key --keycnt 2 ## Generates certificate for setting the program key revision to 1 ./gen_keywr_cert.sh -t tifek/ti_fek_public.pem --keyrev 1 ### Option-2, one-shot ## programming MSV, key sets, and turn device into HS-SE in one shot command $ ./gen_keywr_cert.sh -t tifek/ti_fek_public.pem --msv 0xC0FFE -b keys_devel/bmpk.pem --bmek keys_devel/bmek.key -s keys_devel/smpk.pem --smek keys_devel/smek.key --keycnt 2 --keyrev 1 ### Convert certificate binary to .h format ### $ cd /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/scripts/x509cert $ python3 ../../../../../tools/bin2c/bin2c.py final_certificate.bin keycert.h KEYCERT 2024 -------------------------------- ./生成 keywriter binary - tiboot3.bin -------------------------------- ###createcompiler softlink### $ cd $ ln -s ccs1271/ccs/tools/compiler/ti-cgt-armllvm_3.2.2.LTS ti-cgt-armllvm_3.2.2.LTS ###Generate binary### $ cd /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/am62x-sk/r5fss0-0_nortos/ti-arm-clang $ make -sj clean PROFILE=debug $ make -sj PROFILE=debug -------------------------------- ./将 tiboot3.bin通过 USB DFU模式加载运行起来,具体的命令可以参考这里,只是需要注意的是由于烧写 eFuse的过程中还需要 AM62X SoC VPP管脚上拉到 1.8V同时具备至少 400mA瞬态电流负载能力,因此需要在载板上面部署相应的硬件设计,以保证仅在烧写 eFuse的时候拉高 VPP管脚同时提供足够的瞬变电流,而在其他任何时候 VPP管脚都是拉低的状态。参考如下 TI AM62 SK开发板设计,如图一布置了一个单独的 LDO电源芯片(TLV75518PDQNR)来给 VPP管脚提供 400mA/1.8V供电,正式由于极高的瞬变电流负载需求,load switch或者 DC/DC电源是不建议使用的;而 LDO的开关则通过 VPP_LDO_EN信号来控制。如图二,则是 AM62X SoC通过 I2C总线连接了一个 GPIO Expander芯片来扩展 GPIO管脚提供 VPP_LDO_EN信号控制。 //对于 IO Expander VPP_LDO_EN GPIO管脚的控制软件代码请参考 MCU+ SDK如下文件,你也可以根据你的实际载板设计来相应修改适配。 /mcu_plus_sdk_am62x_10_00_00_14/source/security/sbl_keywriter/am62x-sk/r5fss0-0_nortos/board.c 8 ).总结 本文基于 TI AM62X处理器简单演示了 Secure Boot流程,涉及 Boot Images和 Linux Kernel/DTB,至于 Rootfs的加密,则需要配置类似 Squashfs只读文件系统配合 Initramfs RAM Disk镜像进行加解密挂载启动,可以结合参考如下两篇文章和相关 meta-toradex-security layer数据参考,本文不做具体测试。 ./嵌入式 ARM 平台使用dm-crypt加密磁盘分区 ./使用Squashfs和Overlayfs提高嵌入式Linux文件系统可靠性 ./https://github.com/toradex/meta-toradex-security ​
  • 热度 1
    2024-7-10 17:00
    540 次阅读|
    0 个评论
    基于 TI AM62 测试 QtWayland 部署
    B y Toradex 秦海 1). 简介 目前主流的 ARM 平台嵌入式 Linux BSP 的显示后端基本都已经从 X11 升级到了 Wayland , 而常用的 Wayland Compositor - Weston 对于 Linux 下常用的 Qt 图形界面开发框架的一些 Plugin ( 比如 Qt VirtualKeyboard) 的配合并不完善,因此 本文就 基于 TI AM62 处理器平台测试 Qt 提供的 Wayland Compositor - QtWayland 的部署测试。 本文所演示的平台来自于 Toradex Verdin AM62 嵌入式平台 。 2. 准备 a). Verdin AM62 ARM 核心版配合 Dahlia 载板, 并连接调试串口和 HDMI 显示器以及 USB 触摸 / 鼠标用于测试 。 3). Verdin AM62 Yocto Linux 编译部署以及配置 a). 由于需要增加对 Qt Eglfs/KMS, QtWayland 和 Qt VirtualKeyboard 的支持,需要 通过 Yocto /Openembedded 框架 重新编译 Yocto Linux BSP ,具体的配置方法请参考 这里 , 部署 如下修改后编译 Reference-Multimedia image 镜像 ------------------------------- # ## local .conf ,增加 Qt eglf s/ kms , Qtwayland 和 Qt VirtualKeyboard 支持 ### + TOOLCHAIN_TARGET_TASK:append = " libgles3-mesa-dev" + IMAGE_INSTALL:append = " qtvirtualkeyboard qtwayland ttf-droid-sans ttf-droid-sans-fallback ttf-droid-sans-mono ttf-droid-serif freetype" + PACKAGECONFIG:append:pn-qtvirtualkeyboard = " lang-zh_CN" + PACKAGECONFIG:append:pn-qtbase = " gles2extra eglfs kms" + PACKAGECONFIG_DISTRO:pn-qtbase = "icu examples accessibility gif gbm kms libinput" + PACKAGECONFIG_FONTS:pn-qtbase = "fontconfig" + PACKAGECONFIG:remove:pn-qtwayland = "xcomposite-egl xcomposite-glx" # ## layers/meta-toradex-ti/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend , 注释掉以下内容 ### ############################### TDX added # from meta-arago/conf/layer.conf -PACKAGECONFIG_GL:am62xx = "gles2extra linuxfb" -PACKAGECONFIG_DISTRO:am62xx = "icu examples accessibility gif gbm kms libinput" -PACKAGECONFIG_FONTS:am62xx = "fontconfig" +#PACKAGECONFIG_GL:am62xx = "gles2extra linuxfb" +#PACKAGECONFIG_DISTRO:am62xx = "icu examples accessibility gif gbm kms libinput" +#PACKAGECONFIG_FONTS:am62xx = "fontconfig" -PACKAGECONFIG:remove:am62xx = "kms" -PACKAGECONFIG:remove:am62xx = "vulkan" -PACKAGECONFIG:remove:am62xx = "glib xcb" +#PACKAGECONFIG:remove:am62xx = "kms" +#PACKAGECONFIG:remove:am62xx = "vulkan" +#PACKAGECONFIG:remove:am62xx = "glib xcb" # they don't apply without changes, drop them for now -SRC_URI:remove = " \ - file://0002-deform-disable-opengl-button.patch \ - \ - file://0001-deform-Fix-how-controls-are-shown.patch \ - file://0001-qtbase-plugins-platforms-eglfs_kms-fix-compiler-erro.patch \ - file://0001-eglfs-Force-888-format-only-on-env-flag.patch \ -" +#SRC_URI:remove = " \ +# file://0002-deform-disable-opengl-button.patch \ +# \ +# file://0001-deform-Fix-how-controls-are-shown.patch \ +# file://0001-qtbase-plugins-platforms-eglfs_kms-fix-compiler-erro.patch \ +# file://0001-eglfs-Force-888-format-only-on-env-flag.patch \ +#" # ## compile Reference-Multimedia image ### $ MACHINE="verdin-am62" bitbake bitbake tdx-reference-multimedia-image # ## compile SDK ### $ MACHINE="verdin-am62" bitbake tdx-reference-multimedia-image -c populate_sdk ------------------------------- b ). Yocto Linux image 部署 参考 这里 通过 Toradex Easy installer 将上面编译好的 image 更新部署到模块 c ). 显示配置 . / HDMI 默认即可正常显示,如果 实际测试是连接其他接口如 LVDS 等显示设备,可以参考这里调整 Device-Tree Overlay 设置来使能相关的显示设备。 . / 输入设备如 USB HID 电容式触摸或者 USB 鼠标通常无需额外设置,插上即可使用。 4 ). Q twayland compositor 编译部署 a ). Qt Qtwayland 组件可以非常方便的使用 C++/ QML 语言开发定制化的 W ayland compositor ,详细说明请见 这里 ,也提供了很多 sample project 供参考 b ). 本文测试所使用的 Q twayland compositor 来自于 Qt 官方的 Pure-qml sample 示例 ,源代码请参考 这里 ,这是一个 基于 QML 开发的并且支持 Qt VirtualKeyboard plugin 的简单 Q twayland compositor c ). 参考 这里 说明使用上面章节 3 .a 编译出的 SDK 文件配置 Q tcreator IDE 工具 交叉编译环境, 然后 下载 Pure-qml 工程源代码后通过 Qtcreator IDE 进行 交叉 编译,生成 pure-qml 可执行二进制文件上传到 Verdin AM62 Linux 系统中 d ). 使用编译好的 pure-qml Q twayland compositor 替换系统默认的 W eston compositor . / 创建 pure-qml .sh 执行脚本文件 ------------------------------- # copy pure-qml binary to /usr/bin $ cp pure-qml /usr/bin/ # create pure-qml .sh script , detailed content in below $ vi /usr/bin/ pure-qml .sh # add executable permission $ chmod +x pure-qml .sh ------------------------------- ./ pure-qml .sh – 由于系统 DRM 挂载显示设备 在启动过程中,其对应的 card 号码可能会变化, 因此脚本前面先对 “ kms .conf” 文件里面的设置和系统启动后的设备 card0 或者 card1 进行 匹配修改 , 然 后再启动 c ompositor 。 ------------------------------- #!/bin/sh set -e # modify kms.conf if seetings is not consistent with system drm card device name if ;then sed -i '2 s/card1/card0/' /etc/qt5/eglfs_kms_cfg.json fi if ;then sed -i '2 s/card0/card1/' /etc/qt5/eglfs_kms_cfg.json fi # execute qtwayland compositor /usr/bin/pure-qml & ------------------------------- . / 创建 Qtwayland systemd service 文件 , 参考 这里 说明, Qt VirtualKeyboard 基于 Wayland Compositor 使用时候,需要在 Compositor 侧配置 “QT_IM_MODULE” 环境变量,而不是应用侧。 ------------------------------- $ vi /lib/systemd/system/qtwayland.service ------ # This is a system unit for launching QtWayland Description=Qt Wayland, a Wayland compositor, as a system service RequiresMountsFor=/run # Make sure we are started after logins are permitted. Requires=systemd-user-sessions.service After=systemd-user-sessions.service After=plymouth-quit-wait.service Before=graphical.target Environment="QT_QPA_EGLFS_KMS_CONFIG=/etc/qt5/eglfs_kms_cfg.json" Environment="QT_QPA_EGLFS_INTEGRATION=eglfs_kms" Environment="QT_QPA_PLATFORM=eglfs" Environment="QT_QPA_EGLFS_KMS_ATOMIC=1" Environment="QT_IM_MODULE=qtvirtualkeyboard" ExecStart=/usr/bin/pure-qml.sh User=root Group=root PAMName=login StandardOutput=journal StandardError=journal WantedBy=graphical.target ------ ------------------------------- e ). 测试 Q twayland compositor ------------------------------- # ## disable default Weston compositor and Q t demo app ### $ systemctl disable weston.service $ systemctl disable weston.socket $ systemctl disable wayland-app-launch ### enable Qt wayland compositor ### $ systemctl enable qtwayland $ reboot ------------------------------- 重启后,可以看到 如下 Qt Compositor pure-qml 显示结果 5 ). Qt VirtualKeyboard Example 应用测试 a ). 分别使用一个 Qt Widget 应用和一个 Qt Quick 应用进行测试 . / Qt Widget 应用 – Line Edits Example ,详细说明请参考 这里 ,源码从 这里 下载, 将编译好的可执行 binary “ lineedits ” 上传到 Verdin AM62 Linux /home/root 目录 . / Qt Quick 应用 – Qt VirtualKeyboard Basic Example ,详细说明请参考 这里 , 源码从这里下载,如上面 4.d 章节所提到的,需要如下修改 main.cpp 将环境变量取消导出,然后 将编译好的可执行 binary “ basic ” 上传到 Verdin AM62 Linux /home/root 目录 ------------------------------- ... int main(int argc, char *argv ; do sleep 0.1; done sleep 1 # run basic or lineedits app /home/root/basic -platform wayland & # /home/root/lineedits -platform wayland & ------------------------------- c). 创建开机自启动 systemd service 文件 ------------------------------- $ vi /lib/systemd/system/qtwayland-app-launch.service Description=Start a Qt wayland application After=qtwayland.service Requires=qtwayland.service Restart=on-failure Type=forking ExecStart=/home/root/qtwayland-app-launch.sh RestartSec=1 WantedBy=graphical.target ------------------------------- d ). enable service 并测试 ------------------------------- $ systemctl enable qtwayland-app-launch $ reboot ------------------------------- e). 重启后 分别启动 basic 和 lineedits 应用 效果如下 , USB HID 电容触摸和鼠标都可以正常操作虚拟键盘输入 6 ). 总结 本文 基于 Ti AM62 处理器演示了 QtWayland compositor 的部署以及 Qt VirtualKeyboard 应用的测试。
  • 热度 4
    2024-4-29 15:32
    452 次阅读|
    0 个评论
    By Toradex胡珊逢 简介 LVGL 是一个免费、开源的图形库,能够在嵌入式设备如上使用 C/C++ 语言轻松绘制图形。由于这是一轻量级图形库,最初广泛被 MCU 处理器使用。随着功能完善,在性能和资源更充裕的 MPU 上也逐渐被使用。文章将介绍如何在 Verdin AM62 计算机模块上移植 LVGL。 硬件介绍 Verdin AM62是一款基于TI AM623/625 SoC 的 Arm 计算机模块,提供多达 4 个 Cortex-A53 内核和一个 Cortex-M4 处理器。最高 RAM 和 Flash 分别为 2GB 和 16GB。支持常见的 I2C、SPI、CAN 和 双路以太网等。模块可选配板载 WIFI/BT 模块。 软件说明 Verdin AM62 提供使用Yocto Project生成的 Linux 镜像。该系统使用 wayland 作为底层图形框架。而 LVGL 目前也已经能够支持 wayland。无需移植硬件显示控制器驱动。如果在 MCU 上使用 LVGL,通常选择所使用的控制器,如 ILI9341。相关内容可以参考我们之前发布的文章。 LVGL 移植 LVGL 的编译需要用到 Linux SDK。可以参考该页面,使用Yocto Project 生成 SDK 文件后进行安装。 首先,使用下面命令下载LVGL v8.1。 gitclone--recursivehttps://github.com/lvgl/lv_port_pc_eclipse.git cdlv_port_pc_eclipse/ gitcheckout-bWORKINGorigin/release/v8.1 gitsubmoduleinit gitsubmoduleupdate 在lv_port_pc_eclipse 目录中,打上补丁文件。 gitapply-p1lvgl_v8.1_verdin_am62.patch LVGL 使用 cmake 编译。在 CMakeLists.txt 中添加了 Linux SDK 的安装目录,以及相关的头文件在 SDK 中对应的位置。 +set(SDK_ROOT "$ENV{SDKPATH}") +include_directories(${PROJECT_SOURCE_DIR}) +include_directories(${SDK_ROOT}/sysroots/aarch64-tdx-linux/usr/include/libdrm) LVGL 包含三部分代码,lvgl 图形库实现代码,lv_drivers 显示驱动,以及演示用的 lv_demos 代码。在 CMakeLists.txt 中定义编译目标。 + target_compile_definitions(lvgl + target_compile_definitions(lv_drivers + target_compile_definitions(lv_demos 关于lvgl 自身功能和属性的配置在 lv_conf.h 中管理。对于资源有限的 MCU 这非常有用。禁用不需要的的功能,能够有效减少编译后二进制文件的大小,并降低 RAM 开销。在 Arm Linux 则没有这样的限制,还可以充分利用 Linux 资源。例如 lvgl 使用 Linux 平台中 glibc 提供的内存管理 API。 # define LV_MEM_CUSTOM_INCLUDE # define LV_MEM_CUSTOM_ALLOC malloc # define LV_MEM_CUSTOM_FREE free # define LV_MEM_CUSTOM_REALLOC realloc lv_drv_conf.h 主要配置 lvgl 输出所需的显示驱动属性。Verdin AM62 的 Linux 中已经实现了显示硬件驱动的配置,lvgl 只需要在 wayland 完成渲染显示即可,在 lv_drv_conf.h 不需要太多的设置,这里只设定了显示窗口大小。 +/* Demo Resolution */ +# define SDL_HOR_RES 800 +# define SDL_VER_RES 400 文章使用lvgl 自带的 demo 作为演示,lv_demo_conf.h 中 demo 外观。 #define LV_USE_DEMO_MUSIC 1 #if LV_USE_DEMO_MUSIC -# define LV_DEMO_MUSIC_LANDSCAPE 0 +# define LV_DEMO_MUSIC_SQUARE 0 +# define LV_DEMO_MUSIC_LANDSCAPE 1 +# define LV_DEMO_MUSIC_ROUND 0 main.c 中初始化 lvgl 相关的 API,并利用 SDL 线程每隔 5ms 调用 lv_tick_inc() 为 lvgl 提供计时。 staticinttick_thread(void*data) { (void)data; while(1) { SDL_Delay(5); lv_tick_inc(5); } return0; } 通过SDL 把触摸屏作为 lvgl 的输入设备。 indev_drv_1.read_cb = sdl_mouse_read; lv_indev_t*mouse_indev =lv_indev_drv_register(&indev_drv_1); 最后,使用Linux SDK 中的 environment-setup-aarch64-tdx-linux 初始化编译环境后完成编译。 source~/LinuxSDK/v6-am62/environment-setup-aarch64-tdx-linux cmake. make 将生成的main 二进制文件复制到 Verdin AM62 上运行即可。 总结 文章介绍了如何将LVGL 移植到 Verdin AM62 模块上,由于底层显示驱动已经在 Linux 中配置,移植过程并不涉及硬件驱动,该方法同样也适用于除了 AM62 以外的其他模块。 参考 ·How to build LVGL applications using STM32CubeIDE ·LVGL Set up a project