STM32MP25x开发板Bring Up培训课程(中)

2025-02-20

380

来源:米尔电子
米尔基于STM32MP257核心板及开发板
2.修改设备树
查看生成的Bring up工程空文件的设备树,CA35的设备树文件夹,其他的是M33核的工程资料。
我们可以看到生成的设备树文件如下:
myir@myir-vm:/mnt/hgfs/ShareWorkspace/stm32mp25x-bringup/Bringup/CA35/DeviceTree/Bringup$ tree -l . ├── kernel │ ├── stm32mp257d-bringup-mx.dts │ └── stm32mp257d-bringup-mx-resmem.dtsi ├── optee-os │ ├── stm32mp257d-bringup-mx.dts │ ├── stm32mp257d-bringup-mx-rcc.dtsi │ ├── stm32mp257d-bringup-mx-resmem.dtsi │ └── stm32mp257d-bringup-mx-rif.dtsi ├── tf-a │ ├── stm32mp257d-bringup-mx.dts │ ├── stm32mp257d-bringup-mx-fw-config.dts │ ├── stm32mp257d-bringup-mx-rcc.dtsi │ └── stm32mp25-mx.dtsi └── u-boot ├── stm32mp257d-bringup-mx.dts ├── stm32mp257d-bringup-mx-resmem.dtsi └── stm32mp257d-bringup-mx-u-boot.dtsi 4 directories, 13 files
以上的设备树已经配置了大部分内容的工程,但是工程是还无法全部启动,我们需要先把设备树同步到相应的BSP代码中。
stm32mp25x-BringUp-bsp.tar.gz已拷贝并解压到虚拟机:/home/myir。
注:windows和ubuntu之间目录共享
myir@myir-vm:~/stm32mp25x-BringUp-bsp$ tree -L 2 . ├── Bringup │ ├── Bringup.ioc │ ├── CA35 │ ├── CM33 │ ├── Common │ └── Drivers ├── build ├── FIP_artifacts │ ├── arm-trusted-firmware │ ├── fip │ ├── flash-all.sh │ ├── FlashLayout_emmc_stm32mp25x-bringup-mx.tsv │ ├── flash.sh │ ├── optee │ └── u-boot ├── myir-st-optee │ ├── fiptool-stm32mp │ ├── Makefile.sdk │ ├── myir-st-external-dt │ ├── myir-st-optee │ └── README ├── myir-st-tfa │ ├── fiptool-stm32mp │ ├── Makefile.sdk │ └── tf-a-myir ├── myir-st-uboot │ ├── fiptool-stm32mp │ ├── Makefile.sdk │ └── u-boot-myir └── stm32mp-ddr-phy-A2022 .11 -r0 ├── README.HOW_TO.txt └── stm32mp-ddr-phy-A2022 .11 19 directories, 13 files
在“虚拟机设置”选项中设置完成后, 启动虚拟机执行如下命令进行挂载:
myir@myir-vm# sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
sudo 密码为:123456
在虚拟机的/mnt/hgfs目录下已经成功挂载上共享的目录,如未挂载上,可以重新启动下虚拟机。
/home/myir/目录为我这边虚拟机的目录,实际目录以自己本机为准。
tf-a设备树软链接:
myir@myir-vm:/mnt/hgfs/ShareWorkspace# ln -s /mnt/hgfs/ShareWorkspace/Bringup/CA35/DeviceTree/bringup/tf-a/* /home/myir/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir/fdts/
Optee-os设备树stm32mp257d-bringup-mx.dts和stm32mp257d-bringup-mx-rcc.dtsi软链接:
myir@myir-vm:/mnt/hgfs/ShareWorkspace# ln -s /mnt/hgfs/ShareWorkspace/Bringup/CA35/DeviceTree/bringup/optee-os/stm32mp257d-bringup-mx.dts /home/myir/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee/core/arch/arm/dts/ root@myir-vm:/mnt/hgfs/ShareWorkspace# ln -s /mnt/hgfs/ShareWorkspace/Bringup/CA35/DeviceTree/bringup/optee-os/stm32mp257d-bringup-mx-rcc.dtsi /home/myir/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee/core/arch/arm/dts/
Optee-os设备树stm32mp257d-bringup-mx-resmem.dtsi和stm32mp257d-bringup-mx-rif.dtsi直接使用SourceCode压缩包Optee-os目录中的文件,可通过软链接或者拷贝的方式放到stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee/core/arch/arm/dts/目录下。
Uboot设备树软链接:
myir@myir-vm:/mnt/hgfs/ShareWorkspace# ln -s /mnt/hgfs/ShareWorkspace/Bringup/CA35/DeviceTree/bringup/u-boot/* /home/myir/stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir/arch/arm/dts/
Kernel设备树软链接:
Note:STM32CubeMX的规则是先生成Kernel的dts,然后将生成的dts文件拷贝到u-boot目录下,也就是说u-boot的设备树stm32mp257d-bringup-mx.dts是从kernel目录拷贝过来的,所以在U-Boot阶段修改设备树,添加User code时,请同步修改kernel的设备树或者将修改好的设备树拷贝到Kernel目录,防止下次使用CubeMX生成设备树的时候,u-boot部分的修改被kernel未修改的设备树覆盖。
2.1.配置和编译TF-A
需要手动添加TF-A阶段的串口配置的user code.使用文本编辑工具打开生成的 打开 TF-A 设备树(BringupCA35DeviceTreeBringuptf-astm32mp257d-bringup-mx.dts)
添加头文件
/* USER CODE BEGIN includes */ #include "stm32mp25xf.dtsi" #include "stm32mp25-pinctrl.dtsi" /* USER CODE END includes */
在“USER CODE BEGIN root”位置添加“chosen”和“aliases”节点:
/* USER CODE BEGIN root */ aliases { serial0 = &usart2; }; chosen { stdout-path = "serial0:115200n8"; }; /* USER CODE END root */
增加PMIC配置
&i2c7{ pinctrl-names = "default"; pinctrl-0 = <&i2c7_pins_mx>; status = "okay"; /* USER CODE BEGIN i2c7 */ pmic2: stpmic@33 { compatible = "st,stpmic2"; reg = <0x33>; status = "okay"; regulators { compatible = "st,stpmic2-regulators"; vddcpu: buck1 { regulator-name = "vddcpu"; regulator-min-microvolt = <800000>; regulator-max-microvolt = <910000>; regulator-always-on; }; vddcore: buck2 { regulator-name = "vddcore"; regulator-min-microvolt = <820000>; regulator-max-microvolt = <820000>; regulator-always-on; }; vddgpu: buck3 { regulator-name = "vddgpu"; regulator-min-microvolt = <800000>; regulator-max-microvolt = <900000>; regulator-always-on; }; vddio_pmic: buck4 { regulator-name = "vddio_pmic"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; v1v8: buck5 { regulator-name = "v1v8"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; }; vdd2_ddr: buck6 { regulator-name = "vdd2_ddr"; regulator-min-microvolt = <1100000>; regulator-max-microvolt = <1100000>; }; v3v3: buck7 { regulator-name = "v3v3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vdda1v8_aon: ldo1 { regulator-name = "vdda1v8_aon"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; }; vdd_emmc: ldo2 { regulator-name = "vdd_emmc"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vdd1_ddr: ldo3 { regulator-name = "vdd1_ddr"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-enable-ramp-delay = <1000>; }; vdd3v3_usb: ldo4 { regulator-name = "vdd3v3_usb"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; v5v_hdmi: ldo5 { regulator-name = "v5v_hdmi"; regulator-min-microvolt = <2000000>; regulator-max-microvolt = <2000000>; }; vdd_sdcard: ldo7 { regulator-name = "vdd_sdcard"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; vddio_sdcard: ldo8 { regulator-name = "vddio_sdcard"; st,regulator-bypass-microvolt = <3300000>; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; }; }; }; /* USER CODE END i2c7 */ }; &ddr{ status = "okay"; /* USER CODE BEGIN ddr */ vdd1-supply = <&vdd1_ddr>; vdd2-supply = <&vdd2_ddr>; vddq-supply = <&vdd2_ddr>; /* USER CODE END ddr */ };
使用文本编辑工具打开生成的 打开TF-A设备树(BringupCA35DeviceTreeBringuptf-astm32mp257d-bringup-mx-fw-config.dts)
本次配置不涉及防火墙内容,因此屏蔽如下内容:
/* st-mem-firewall { bl31_context: bl31-context@81ff0000 { reg = <0x0 0x81ff0000 0x0 0x10000>; st,protreg = <RISAFPROT(RISAF_REG_ID(7), 0, 0, 0, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; }; op_tee: op-tee@82000000 { reg = <0x0 0x82000000 0x0 0x2000000>; st,protreg = <RISAFPROT(RISAF_REG_ID(8), 0, 0, 0, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; }; }; */
新增如下内容:
/* USER CODE BEGIN root */ dtb-registry { soc_fw-config { load-address = <0x0 0x81fc0000>; max-size = <0x40000>; }; tos_fw { load-address = <0x0 0x82000000>; max-size = <0x2000000>; }; }; st-mem-firewall { bl31_context: bl31-context@81fc0000 { reg = <0x0 0x81fc0000 0x0 0x40000>; st,protreg = <RISAFPROT(RISAF_REG_ID(7),RIF_CID0_BF|RIF_CID1_BF, RIF_CID0_BF|RIF_CID1_BF, 0, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; }; op_tee: op-tee@82000000 { reg = <0x0 0x82000000 0x0 0x2000000>; st,protreg = <RISAFPROT(RISAF_REG_ID(8), RIF_CID0_BF|RIF_CID1_BF, RIF_CID0_BF|RIF_CID1_BF, 0, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; }; }; /* USER CODE END root */
以上已完成配置,就可以进行TF-A的单独编译。
myir@myir-vm: cd /home/myir/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir$ source /opt/st/myd-ld25x/4.2.4-snapshot/environment-setup-cortexa35-ostl-linux myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir$ export FIP_DEPLOYDIR_ROOT=../../FIP_artifacts myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir$ export FWDDR_DIR=../../stm32mp-ddr-phy-A2022.11-r0/stm32mp-ddr-phy-A2022.11 myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir$ make -f $PWD/../Makefile.sdk DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware TF_A_CONFIG="optee-emmc usb" TF_A_DEVICETREE=stm32mp257d-bringup-mx ELF_DEBUG_ENABLE='1' stm32 metadata
注:已将上述TF-A单独编译的命令存放在/home/myir/stm32mp25x-BringUp-bsp/myir-st-tfa/tf-a-myir/build.sh
编译完成:
2.2.配置与编译Optee-OS
现在进行OP-TEE的配置编译,首先需要在设备树中添加串口UART以及PWR相关的配置:
串口部分配置:
在之前STM32CubeMX配置串口的过程中,UART的配置是没办法在OP-TEE中使能的,也就是说OP-TEE的设备树中没有任何关于串口的配置,包括UART节点以及引脚,这些都需要我们手动添加上去:
(BringupCA35DeviceTreeBringupoptee-osstm32mp257d-bringup-mx.dts)
/* USER CODE BEGIN includes */ #include "stm32mp25-pinctrl.dtsi" #include <dt-bindings/mfd/st,stpmic2.h> #include <dt-bindings/regulator/st,stm32mp25-regulator.h> #include <dt-bindings/reset/stm32mp25-resets.h> #include <dt-bindings/soc/stm32mp-provisioning.h> #include <dt-bindings/tamper/st,stm32mp25-tamp.h> #include "stm32mp25xf.dtsi" /* USER CODE END includes */
/* USER CODE BEGIN root */ aliases { serial0 = &usart2; }; chosen { stdout-path = "serial0:115200n8"; }; shadow-prov { compatible = "st,provisioning"; hconf1_prov { nvmem-cells = <&hconf1_otp>; st,shadow-value = <0x00008DB6>; }; };
/* USER CODE END root */ &rcc{ status = "okay"; /* USER CODE BEGIN rcc */ st,c1msrd = <2>; st,clk_opp { st,ck_cpu1 { cfg_1 { hz = <1000000000>; st,clksrc = <0>; st,pll = <&pll1_cfg_1000Mhz>; }; cfg_2 { hz = <600000000>; st,clksrc = <0>; st,pll = <&pll2_cfg_600Mhz>; }; }; }; /* USER CODE END rcc */ };
添加pin脚定义
/* USER CODE BEGIN addons */ &usart2 { pinctrl-names = "default"; pinctrl-0 = <&usart2_pins_a>; status = "okay"; }; /* USER CODE BEGIN addons */
使用是PMIC,那么VDD_CPU的配置需要包含在PMIC中,所以同样的建议copy tf-a里的配置,增加到I2C7的设备树里。
&i2c7{ status = "okay"; /* USER CODE BEGIN i2c7 */ pinctrl-names = "default", "sleep"; pinctrl-0 = <&i2c7_pins_a>; pinctrl-1 = <&i2c7_sleep_pins_a>; i2c-scl-rising-time-ns = <185>; i2c-scl-falling-time-ns = <20>; clock-frequency = <400000>; #address-cells = <1>; #size-cells = <0>; pmic2: stpmic2@33 { compatible = "st,stpmic2"; reg = <0x33>; st,wakeup-pin-number = <1>; st,pmic-it-id = <IT_PKEY_FA IT_PKEY_RI>; st,notif-it-id = <0 1>; status = "okay"; regulators { compatible = "st,stpmic2-regulators"; ldo1-supply = <&vddio_pmic>; vddcpu: buck1 { regulator-name = "vddcpu"; regulator-min-microvolt = <800000>; regulator-max-microvolt = <910000>; regulator-always-on; st,pwrctrl-sel = <2>; st,pwrctrl-enable; default { regulator-off-in-suspend; }; lplv { regulator-off-in-suspend; }; standby { regulator-off-in-suspend; }; off { regulator-off-in-suspend; }; }; vddcore: buck2 { regulator-name = "vddcore"; regulator-min-microvolt = <820000>; regulator-max-microvolt = <820000>; regulator-always-on; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; regulator-suspend-microvolt = <820000>; }; lplv { regulator-on-in-suspend; regulator-suspend-microvolt = <670000>; }; standby { regulator-off-in-suspend; }; off { regulator-off-in-suspend; }; }; vddgpu_pmic: buck3 { regulator-name = "vddgpu_pmic";regulator-min-microvolt = <800000>; regulator-max-microvolt = <900000>; regulator-over-current-protection; }; vddio_pmic: buck4 { regulator-name = "vddio_pmic"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; st,mask-reset; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; regulator-suspend-microvolt = <3300000>; }; lplv { regulator-on-in-suspend; regulator-suspend-microvolt = <3300000>; }; standby { regulator-on-in-suspend; regulator-suspend-microvolt = <3300000>; }; off { /* ToDo: switch to LP */ regulator-on-in-suspend; regulator-suspend-microvolt = <3300000>; }; }; v1v8: buck5 { regulator-name = "v1v8"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; regulator-suspend-microvolt = <1800000>; }; lplv { regulator-on-in-suspend; regulator-suspend-microvolt = <1800000>; }; standby {regulator-off-in-suspend; }; off { regulator-off-in-suspend; }; }; vdd2_ddr: buck6 { regulator-name = "vdd2_ddr"; regulator-min-microvolt = <1100000>; regulator-max-microvolt = <1100000>; regulator-always-on; //regulator-pull-down; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; regulator-suspend-microvolt = <1100000>; }; lplv { regulator-on-in-suspend; regulator-suspend-microvolt = <1100000>; }; standby { regulator-on-in-suspend; regulator-suspend-microvolt = <1100000>; }; off { regulator-off-in-suspend; }; }; v3v3: buck7 { regulator-name = "v3v3"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; regulator-over-current-protection; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; regulator-suspend-microvolt = <3300000>; }; lplv { regulator-on-in-suspend; regulator-suspend-microvolt = <3300000>; }; standby { regulator-off-in-suspend; }; off { regulator-off-in-suspend; }; }; vdda1v8_aon: ldo1 { regulator-name = "vdda1v8_aon"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; st,alternate-input-source; st,mask-reset; }; vdd_emmc: ldo2 { regulator-name = "vdd_emmc"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-over-current-protection; st,pwrctrl-sel = <3>; st,pwrctrl-reset; }; vdd1_ddr: ldo3 { regulator-name = "vdd1_ddr"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; regulator-suspend-microvolt = <1800000>; }; lplv { regulator-on-in-suspend; regulator-suspend-microvolt = <1800000>; }; standby { regulator-on-in-suspend; regulator-suspend-microvolt = <1800000>; }; off { regulator-off-in-suspend; }; }; vdd3v3_usb: ldo4 { regulator-name = "vdd3v3_usb"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-always-on; regulator-over-current-protection; }; v5v_hdmi: ldo5 { regulator-name = "v5v_hdmi"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; st,regulator-bypass-microvolt = <5000000>; st,pwrctrl-sel = <0>; st,pwrctrl-enable; }; v5v_vconn: ldo6 { regulator-name = "v5v_vconn"; regulator-min-microvolt = <5000000>; regulator-max-microvolt = <5000000>; regulator-always-on; st,regulator-bypass-microvolt = <5000000>; st,pwrctrl-sel = <0>; st,pwrctrl-reset; }; vdd_sdcard: ldo7 { regulator-name = "vdd_sdcard"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-over-current-protection; st,regulator-bypass-microvolt = <3300000>; st,pwrctrl-sel = <3>; st,pwrctrl-reset; }; vddio_sdcard: ldo8 { regulator-name = "vddio_sdcard"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; regulator-over-current-protection; st,regulator-bypass-microvolt = <3300000>; st,pwrctrl-sel = <3>; st,pwrctrl-reset; }; vref_ddr: refddr { regulator-name = "vref_ddr"; regulator-always-on; st,pwrctrl-sel = <1>; st,pwrctrl-enable; default { regulator-on-in-suspend; }; lplv { regulator-on-in-suspend; }; standby { regulator-on-in-suspend; }; off { regulator-off-in-suspend; }; }; }; }; }; /* USER CODE END i2c7 */ };
增加CPU电源配置
/* USER CODE BEGIN addons */ &pwr { pinctrl-names = "default"; pinctrl-0 = <&wakeup_pins>; status = "okay"; vdd33ucpd: vdd33ucpd { status = "okay"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; vdd33ucpd-supply = <&vdd3v3_usb>; regulator-always-on; }; vdda18adc: vdda18adc { status = "okay"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; vdda18adc-supply = <&v1v8>; regulator-always-on; }; vddgpu: vddgpu { status = "okay"; vddgpu-supply = <&vddgpu_pmic>; }; vddio1: vddio1 { status = "okay"; regulator-min-microvolt = <3300000>; regulator-max-microvolt = <3300000>; vddio1-supply = <&vddio_sdcard>; }; vddio2: vddio2 { status = "okay"; vddio2-supply = <&v1v8>; regulator-always-on; }; vddio3: vddio3 { status = "okay"; vddio3-supply = <&vddio_pmic>; regulator-always-on; }; vddio4: vddio4 { status = "okay"; vddio4-supply = <&vddio_pmic>; regulator-always-on; }; vddio: vddio { status = "okay"; vdd-supply = <&vddio_pmic>; }; }; &cpu0 { cpu-supply = <&vddcpu>; }; &scmi_regu { scmi_vddcore: voltd-vddcore { reg = <VOLTD_SCMI_STPMIC2_BUCK2>; voltd-supply = <&vddcore>; }; scmi_v1v8: voltd-v1v8 { reg = <VOLTD_SCMI_STPMIC2_BUCK5>; voltd-supply = <&v1v8>; }; scmi_v3v3: voltd-v3v3 { reg = <VOLTD_SCMI_STPMIC2_BUCK7>; voltd-supply = <&v3v3>; }; scmi_vdd_emmc: voltd-vdd-emmc { reg = <VOLTD_SCMI_STPMIC2_LDO2>; voltd-supply = <&vdd_emmc>; }; scmi_vdd3v3_usb: voltd-vdd3v3-usb { reg = <VOLTD_SCMI_STPMIC2_LDO4>; voltd-supply = <&vdd3v3_usb>; }; scmi_vdd_sdcard: voltd-vdd_sdcard { reg = <VOLTD_SCMI_STPMIC2_LDO7>; voltd-supply = <&vdd_sdcard>; }; }; /* USER CODE END addons */
/* USER CODE BEGIN addons */ &risaf2 { status = "disabled"; }; &risaf5 { status = "disabled"; }; &rtc { status = "okay"; }; &tamp { wakeup-source; wakeup-parent = <&exti2>; st,tamp-passive-precharge = <2>; st,tamp-passive-nb-sample = <4>; st,tamp-passive-sample-clk-div = <16384>; /* Tamper button */ tamp_button: tamp-passive@1 { status = "disabled"; reg = <EXT_TAMPER_1 0>; pinctrl-0 = <&tamp_in1_pin_a>; st,tamp-mode = <TAMPER_POTENTIAL_MODE>; }; }; /* USER CODE END addons */
在上一章节中提到stm32mp257d-bringup-mx-resmem.dtsi和stm32mp257d-bringup-mx-rif.dtsi直接使用SourceCode压缩包Optee-os目录中的文件,如果还未拷贝,需要将其通过软链接或者拷贝的方式放到stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee/core/arch/arm/dts/目录下。
编译Optee
myir@myir-vm: cd /home/myir/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee$ source /opt/st/myd-ld25x/4.2.4-snapshot/environment-setup-cortexa35-ostl-linux myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee$ export FIP_DEPLOYDIR_ROOT=../../FIP_artifacts myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee$ export FWDDR_DIR=../../stm32mp-ddr-phy-A2022.11-r0/stm32mp-ddr-phy-A2022.11 myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee$ make -f $PWD/../Makefile.sdk DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/optee CFG_EMBED_DTB_SOURCE_FILE=stm32mp257d-bringup-mx optee
注:已将上述Optee单独编译的命令存放在/home/myir/stm32mp25x-BringUp-bsp/myir-st-optee/myir-st-optee/build.sh
可以看到已经生成了bin文件

2.3.配置和编译Uboot
已同样的方式进行手动添加uboot的设备树的一些配置,使用编辑工具打开uboot下的(BringupCA35DeviceTreeBringupu-bootstm32mp257d-bringup-mx.dts)
/* USER CODE BEGIN root */ aliases { serial0 = &usart2; }; chosen { stdout-path = "serial0:115200n8"; }; /* USER CODE END root */
需要增加eMMC的配置
&sdmmc2{ pinctrl-names = "default", "opendrain", "sleep"; pinctrl-0 = <&sdmmc2_pins_mx>; pinctrl-1 = <&sdmmc2_opendrain_pins_mx>; pinctrl-2 = <&sdmmc2_sleep_pins_mx>; status = "okay"; /* USER CODE BEGIN sdmmc2 */ non-removable; no-sd; no-sdio; st,neg-edge; bus-width = <8>; vmmc-supply = <&scmi_vdd_emmc>; vqmmc-supply = <&scmi_vddio2>; mmc-ddr-1_8v; mmc-hs200-1_8v; /* USER CODE END sdmmc2 */ };
添加USB配置,后续用于刷机
/* USER CODE BEGIN addons */ &usb2_phy1{ status = "okay"; /* USER CODE BEGIN usb2_phy1 */ vdd33-supply = <&scmi_vdd3v3_usb>; /* USER CODE END usb2_phy1 */ }; &usb2_phy2{ status = "okay"; /* USER CODE BEGIN usb2_phy2 */ vdd33-supply = <&scmi_vdd3v3_usb>; /* USER CODE END usb2_phy2 */ }; &usb3dr{ status = "okay"; /* USER CODE BEGIN usb3dr */ dwc3: usb@48300000 { maximum-speed = "high-speed"; usb-role-switch; port { dwc3_ep: endpoint { remote-endpoint = <&typec_ep>; }; }; }; /* USER CODE END usb3dr */ }; &usbh{ status = "okay"; /* USER CODE BEGIN usbh */ usbh_ehci: usb@482f0000 { #address-cells = <1>; #size-cells = <0>; /* onboard HUB */ hub@1 { compatible = "usb424,2514"; reg = <1>; vdd-supply = <&scmi_v3v3>; }; }; usbh_ohci: usb@482e0000 { status = "disabled"; }; /* USER CODE END usbh */ }; &scmi_regu { scmi_vddio1: regulator@0 { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <3300000>; }; scmi_vddcore: regulator@11 { reg = <VOLTD_SCMI_STPMIC2_BUCK2>; regulator-name = "vddcore"; }; scmi_v1v8: regulator@14 { reg = <VOLTD_SCMI_STPMIC2_BUCK5>; regulator-name = "v1v8"; }; scmi_v3v3: regulator@16 { reg = <VOLTD_SCMI_STPMIC2_BUCK7>; regulator-name = "v3v3"; }; scmi_vdd_emmc: regulator@18 { reg = <VOLTD_SCMI_STPMIC2_LDO2>; regulator-name = "vdd_emmc"; }; scmi_vdd3v3_usb: regulator@20 { reg = <VOLTD_SCMI_STPMIC2_LDO4>; regulator-name = "vdd3v3_usb"; }; scmi_vdd_sdcard: regulator@23 { reg = <VOLTD_SCMI_STPMIC2_LDO7>; regulator-name = "vdd_sdcard"; }; }; &mlahb { intc_rpmsg: interrupt-controller@1 { compatible = "rpmsg,intc"; reg = <1 0>; #interrupt-cells = <1>; interrupt-controller; }; i2c_rpmsg: i2c@2 { compatible = "rpmsg,i2c-controller"; reg = <2 0>; rpmsg,dev-id = "rpmsg_i2c"; #address-cells = <1>; #size-cells = <0>; status = "okay"; typec@35 { compatible = "st,stm32mp25-typec"; reg = <0x35>; interrupts-extended = <&intc_rpmsg 0>; status = "okay"; connector { compatible = "usb-c-connector"; label = "USB-C"; port { typec_ep: endpoint { remote-endpoint = <&dwc3_ep>; }; }; }; }; }; }; /* USER CODE END addons */
使用编辑工具打开uboot下的(BringupCA35DeviceTreeBringupu-bootstm32mp257d-bringup-mx-u-boot.dtsi)
/* USER CODE BEGIN addons */ &dwc3 { dr_mode = "peripheral"; /delete-node/ port; }; &i2c_rpmsg { /delete-node/ typec@35; }; &usart2 { u-boot,dm-pre-reloc; }; &usart2_pins_mx { u-boot,dm-pre-reloc; pins1 { u-boot,dm-pre-reloc; }; pins2 { u-boot,dm-pre-reloc; }; }; /* USER CODE END addons */
PMIC配置与tf-a一样,这里略写。
修改完成后,编译U-Boot
myir@myir-vm:~$ cd stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir$ source /opt/st/myd-ld25x/4.2.4-snapshot/environment-setup-cortexa35-ostl-linux myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir$ export FIP_DEPLOYDIR_ROOT=../../FIP_artifacts myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir$ export FWDDR_DIR=../../stm32mp-ddr-phy-A2022.11-r0/stm32mp-ddr-phy-A2022.11 myir@myir-vm:~/stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir$ make -f $PWD/../Makefile.sdk DEPLOYDIR=../../FIP_artifacts/u-boot UBOOT_CONFIG=default UBOOT_DEFCONFIG=stm32mp25_defconfig UBOOT_BINARY=u-boot.dtb DEVICETREE=stm32mp257d-bringup-mx FIP_CONFIG="optee-emmc" all
注:已将上述uboot单独编译的命令存放在/home/myir/stm32mp25x-BringUp-bsp/myir-st-uboot/u-boot-myir/build.sh
编译完成后生成fip文件在定义的FIP_artifacts文件夹下,如下图所示:
2025-02-27
STM32MP25x开发板Bring Up培训课程(下)
STM32MP25x开发板Bring Up培训课程(上)STM32MP25x开发板Bring Up培训课程(中)米尔基于STM32MP257核心板及开发板3.USB启动USB启动用于烧录镜像到外部flash,例如NAND,SD卡等,从PC端烧录镜像到外部 Flash是由U-Boot结合STM32CubeProgrammer完成的,配置并编译U-Boot是烧录的前提,根据STM32MPU的启动顺序:
2025-02-20
STM32MP25x开发板Bring Up培训课程(中)
STM32MP25x开发板Bring Up培训课程(上)米尔基于STM32MP257核心板及开发板2.修改设备树查看生成的Bring up工程空文件的设备树,CA35的设备树文件夹,其他的是M33核的工程资料。我们可以看到生成的设备树文件如下:myir@myir-vm:/mnt/hgfs/ShareWorkspace/stm32mp25x-bringup/Bringup/CA35/DeviceTr
2025-02-13
STM32MP25x开发板Bring Up培训课程(上)
1.概述本文将以MYIR的MYC-LD25X核心模块及MYD-LD25X开发平台为例,讲解如何使用 STM32CubeMX 来实现Developer package最小系统和外设资源的配置。米尔基于STM32MP257核心板及开发板1.1.创建系统工程1.1.1.创建默认工程打开STM32CubeMX,可以看到主界面,我们需要从选择芯片开始点击“ACCESS TO MCU SELECTOR”。进入
2023-02-17
嵌入式Linux入门级板卡的神经网络框架ncnn移植与测试-米尔i.MX6UL开发板
本篇测评由电子发烧友的优秀测评者“ALSET”提供。电子发烧友网发布了一款试用产品:米尔 MYD-Y6ULX-V2 开发板,基于 NXP i.MX6UL/i.MX6UL L处理器,该开发板被米尔称之为经典王牌产品。本次测试目标是在此开发板上进行神经网络框架ncnn的移植与测试开发,测试ncnn在此开发板上的性能与应用测试。01.什么是ncnnncnn 是腾讯优图推出的在手机端极致优化的高性能神经网
2022-11-24
FPGA+MPU+MCU三芯合一!米尔全自动血细胞分析仪解决方案
全自动血细胞分析仪是医院临床检验应用非常广泛的仪器之一,用来检测红细胞、血红蛋白、白细胞、血小板等项目。是基于电子技术和自动化技术的全自动智能设备,功能齐全,操作简单,依托相关计算机系统在数据处理和数据分析等方面具有出色表现,可同时进行多个参数的可靠分析,通过联网互通和交互式触摸屏可以实现线上信息共享等功能,被广泛应用在医院临床检验中
2022-10-18
基于Zynq-7000高速数据采集解决方案—米尔MYD-C7Z010/20-V2开发板
近年来,科技日新月异,随着机器视觉、人工智能的迅速发展,相关行业对数据采集系统的性能要求更加苛刻,要求能够同时采样的通道更多,采样的精度和速度要求更高。在雷达,航天,视频传输,工业控制等领域,采样率、分辨率、传输速率成为评价超高速数据采集系统的最重要技术指标,所以芯片的选择就变得尤为重要,既需要具备高精度、高采样速率等模块,又需要可以嵌入操作便捷、用户体验更友好的操作系统,实现良好的人机交互功能。
2022-08-26
开发环境篇:Linux C按键控制LED--米尔MYD-YT507H开发板
本篇测评由电子工程世界的优秀测评者“qinyunti”提供。此次板卡的测试,是Linux C开发环境下按键控制LED的操作实录。前言对于核心板或者开发板的选型我们一样会考虑二次开发的便捷性,开发环境,手册等的易用性和完整性。下面我们就从开发者的角度体验,从Linux C开发,Qt开发,python开发等常见开发入手进行体验。现在开始第一部分Linux C开发环境的简单体验。准备串口登录丝印Debu
2022-08-22
第一视角体验国产处理器全志T507-H开发板
现在车规级芯片市场潜力巨大,需求旺盛,芯片都在逐渐走向国产化。本期要介绍的主角是米尔基于全志T507-H的MYD-YT507H开发板,是米尔结合国产工业级平台CPU:全志T507-H芯片研制的CPU模组,集成了四核Cortex-A53的CPU和G31MP2的GPU,具有强大的图像处理功能,并拥有多路视频输入和输出的接口。
2022-08-05
米尔的国产T507-H开发板怎么玩?macOS如何将Ubuntu系统烧录到eMMC的完全调教指南!
本篇测评由电子发烧友的优秀测评者“HonestQiao”提供。此次板卡的测试,是用macOS将Ubuntu系统烧录到eMMC的操作实录。米尔MYD-YT507H开发板,官方提供了HMI系统和Ubuntu18.04镜像,体验过默认的HMI系统后,我就换上了我喜欢的Ubuntu系统了。一、系统烧录参考官方的文档,使用全志的图形界面烧录工具,在Windows下烧录简单又方便:因为我使用的是macOS系统
2022-07-15
如何实现异构处理器间相互通讯——米尔带您玩转i.MX 8M Plus开发板
本篇测评由电子工程世界的优秀测评者“bloong”提供。此次测试的项目,是异构处理器间相互通讯项目。MYD-JX8MPQ配备了一颗异构的Cortex-M7协处理器,可以同时运行Linux和RTOS。本文主要介绍协处理器M7使用方法。M7在运行时可能会涉及到和A53核共用资源,这里列举出会冲突资源如下:ECSPI0/ECSPI2,FLEXCAN,GPIO1/GPIO5,GPT1,I2C3,I2S3,