tag 标签: imx6

相关博文
  • 热度 1
    2023-12-26 16:02
    1676 次阅读|
    0 个评论
    B y Toradex 胡珊逢 简介 Toradex Easy Installer 是 Toradex 计算机模块上出厂预装的软件,可以令开发人员首次安装不同的操作系统,同时也适生产线上模块的批量烧写作业。通常在安装系统后,Toradex Easy Installer 将被从模块的存储上擦除。本文将介绍如何使 Toradex Easy Installer 常驻在存储,并用其重装系统。 实现该操作的方法为在存储设备上创建一个专门存放 Toradex Easy Installer 的分区。每次安装系统时将 Toradex Easy Installer 写入到该分区。由于 Toradex 的 U-Boot 支持 distro_boot 功能,通过修改默认的启动命令,令 U-Boot 在启动时加载 Toradex Easy Installer 而不是 Linux 系统。 硬件介绍 这里使用 Apalis iMX6 模块进行演示。Apalis iMX6 的 eMMC 存储做如下分区规划。 Parition 1 Parition 2 Parition 3 Parition 4 FAT32 EXT4 FAT32 EXT4 bootfs rootfs tezi user data 第一个分区是用于存放 Linux kernel、 device tree 等文件,格式为 FAT。第二个是 Linux 的系统文件,格式 EXT4。第三个则是 Toradex Easy Installer 的相关文件,格式为 FAT。第四个是用户文件分区,这里格式为 EXT4,也可以调整为其他格式类型。 Toradex Easy Installer 更改 Toradex Easy Installer 中的 image.json 文件可以在安装系统时对存储进行分区操作,为每个分区写入对应的文件,从而实现上面规划的分区。这里我们以 Linux BSP v5.7 和 Toradex Easy Installer v5.7 为例,创建一个系统安装包,使其同时包含上面两个系统。 首先解压 Linux BSP 的安装文件夹,在 image.json 文件的 blockdevs 下面有一个 partitions 变量,这里可以指定需要创建的分区。其中 label 为 BOOT 和 RFS 对应上面的第一和第二分区。接下来在 partitions 中添加 label 为 TEZI 和 DATA 两个分区。 TEZI分区中写入 tezi_on_emmc.tar.xz 文件。关于 image.json 配置的详细说明请参考 这里 。tezi_on_emmc.tar.xz 中包含了 Toradex Easy Installer 相关启动文件。解压上面下载的 Toradex Easy Installer 文件,由于不需要在恢复模式下加载,因此删除其中的 recovery 文件夹后,重新压缩其他内容。 $ cd /Apalis-iMX6_ToradexEasyInstaller_5.7.3+build.17 $ rm -rf recovery $ tar -cJf ../tezi_on_emmc.tar.xz . DATA 分区可以存储用户自己的数据,如应用程序或者配置文件,将其同样也打包为 EZ2files.tar.xz 文件,在安装时写入 DATA 分区。 将准备好的 tezi_on_emmc.tar.xz 和 EZ2files.tar.xz 文件都复制到解压后 Linux BSP 的安装文件夹中可以看到有如下文件。 $ tree . ├── EZ2files.tar.xz ├── image.json ├── LA_OPT_NXP_SW.html ├── marketing.tar ├── prepare.sh ├── Reference-Minimal-Image-apalis-imx6.bootfs.tar.xz ├── Reference-Minimal-Image-apalis-imx6.tar.xz ├── SPL ├── tezi_on_emmc.tar.xz ├── toradexlinux.png ├── u-boot.img ├── u-boot-initial-env-spl └── wrapup.sh 将上面系统安装到 Apalis iMX6 模块,重新启动后可以看到 eMMC 上存在四个分区。 mmcblk2p3 上即为存放 Toradex Easy Installer 相关文件。启动时加载该分区上的 boot-tezi.scr 便能够运行。 修改 U-Boot 启动参数 U-Boot 中默认的启动参数 distro_bootcmd 最终寻找到 BOOT 分区下的 boot.scr 文件,进而启动 Linux 系统。为了加载 TEZI 分区上的 boot-tezi.scr,在 Linux 系统中运行下面命令,修改 bootcmd 参数。Linux BSP 安装文件中的 u-boot-initial-env-spl 会在系统安装期间将 bootcmd 重新修改会默认设置,所以当安装完毕后不会再次启动 TEZI 分区上的 Toradex Easy Installer。 $ fw_setenv boot_TEZI 'setenv devtype mmc; setenv devnum 0; setenv distro_bootpart 3; setenv bootfstype fat; setenv prefix /; load mmc 0:3 ${scriptaddr} /boot-tezi.scr; source ${scriptaddr}' $ fw_setenv bootcmd "run boot_TEZI" $ sync $ reboot -f 运行上面命令并重启后,Apalis iMX6 会启动 eMMC 上的 Toradex Easy Installer。此时,用户可以再次安装系统,而不必进入恢复模式。 总结 常驻在 eMMC 上的 Toradex Easy Installer 能够允许用户直接在设备上运行,便于恢复或者更新系统。
  • 热度 2
    2023-12-1 11:53
    1709 次阅读|
    0 个评论
    By Toradex胡珊逢 简介 双屏显示在显示设备中有着广泛的应用,可以面向不同群体展示特定内容。文章接下来将使用 Verdin iMX8M Plus 的 Arm 计算机模块演示如何方便地在 Toradex 的 Linux BSP 上实现在两个屏幕上显示独立的 Qt 应用。 硬件介绍 软件配置 Verdin iMX8M Plus 模块使用 Toradex Multimedia Reference Image V6.4.0 版本,其包含 Qt5.15 相关运行环境。默认系统中已经使能了 Verdin iMX8M Plus 原生的 HDMI 和 DSI 转 HDMI 适配板。 root@verdin-imx8mp-07320826:~# cat /boot/overlays.txt fdt_overlays=verdin-imx8mp_hdmi_overlay.dtbo verdin-imx8mp_dsi-to-hdmi_overlay.dtbo 在 /sys/class/drm 目录下可以看到两个 HDMI 接口,分别是 HDMI-A-1 和 HDMI-A-2,但是它们都属于同一个 DRM 接口 card1。所以系统只能运行一个 weston 实例。 root@verdin-imx8mp:/sys/class/drm# ls card0 card1 card1-HDMI-A-1 card1-HDMI-A-2 renderD128 version #gbm-format=argb8888 idle-time=0 use-g2d=1 xwayland=true repaint-window=16 #enable-overlay-view=1 modules=screen-share.so shell=kiosk-shell.so Qt 应用在 weston 环境中运行时会对应一个 app_id,例如 BSP 中默认的应用 /usr/share/cinematicexperience-1.0。在命令行中启动该应用前添加 WAYLAND_DEBUG=1。 root@verdin-imx8mp:~# cd /usr/share/cinematicexperience-1.0 &1|grep app xdg_toplevel@21.set_app_id("Qt5_CinematicExperience") 另外一个 Qt 应用位于 `/usr/share/qtsmarthome-1.0/`中。 root@verdin-imx8mp:~# cd /usr/share/cinematicexperience-1.0 &1|grep app xdg_toplevel@21.set_app_id("smarthome") 从上面的命令中可以看到两个应用的 app_id 分别是 Qt5_CinematicExperience 和 smarthome。相应地在 /etc/xdg/weston/weston.ini 创建两个 。指定在 HDMI-A-1 上显示 Qt5_CinematicExperience 应用,而 HDMI-A-2 上则显示 smarthome 应用。配置完成后保存并重启。 name=HDMI-A-1 app-ids=Qt5_CinematicExperience mode=1920x1080 name=HDMI-A-2 app-ids=smarthome mode=1920x1080 分别启动上面两个 Qt 应用后可以在两个 HDMI 显示器上看到相应的内容。 总结 上面介绍了双屏显示的配置,在 Linux BSP 上可以十分便捷得实现,除了提到的 HDMI 接口,对于 LVDS 也是同样的配置方法。
  • 热度 2
    2023-11-23 14:32
    999 次阅读|
    1 个评论
    B y Toradex 胡珊逢 简介 存储器的嵌入式设备中扮演着重要角色,上面不仅安装有操作系统,同时也保存着应用程序和运行日志等。对于存储器如eMMC,写入的数据量决定其使用寿命,对于有大量日志记录的应用,通常可以选用一个大容量的存储设备。文件将介绍如何在 Toradex 的计算机模块 Apalis iMX6 上扩展一个外部 eMMC。 Apalis iMX6 具有四个 SDIO 接口,其中一个已经用于模块本身的 eMMC。其余三个均可以用于连接另外的 eMMC。为了提高读写速度,SDIO 接口可配置为 8bit 模式。 eMMC 模块硬件连接 eMMC 内部有一个控制器,负责执行来自 host 的 MMC 指令、将数据写入到存储单元、维护映射关系确保每个存储单元可以均衡得写入等。该控制器通常需要两路电压。如下图的 VCCQ 用于驱动控制器本身,该电压也用于面向 host 的 SDIO 接口,因此需要于 host 端的 SDIO 电平一致。Apalis iMX6 的 SDIO 为 3.3V,Toradex 另外一个系列 Verdin 模块的接口则为 1.8V。目前绝大多数的 eMMC 都可以支持 1.8V 和 3.3V 两种电压。图中另外一个电源 VCC 用于存储单元 NAND 的供电。 在Apalis Evalution Board 上 Apalis iMX6 的其中一路 SDIO 通过 X5 排针座引出。由于 eMMC 通常不需要热拔插,所以 SDIO 接口的 CD 引脚就不需要再被使用。 我们选取市场上常见的eMMC 模块,制作适合 Apalis Evalution Board 的转接板。在实际应用中,可以把 eMMC 芯片直接焊接在定制的底板上,以增加牢固性和稳定性。 下面是eMMC 模块转接板原理图。其中 U1 是 eMMC 模块底部的 B2B 链接器,上面的引脚都直接来自 eMMC 芯片。其中使用到了 CMD、CLK、DATA0~7。由于 Apalis iMX6 的 SDIO 为 3.3V,所以 eMMC 模块的两路电源均使用 3.3V。iMX6 SoC 只有其中的两路 SDIO 才有 Reset 引脚,其中一路已经用于模块自身的 eMMC,另一路的 SD4_RESET 没有引出到模块的金手指上。这对于扩展的 eMMC 来说将失去硬件复位功能,只能采用断电复位 eMMC。图中 H1 是 2.54mm 排针,可以直接连接 Apalis Evalution Board。另外,对于 CMD、CLK、DATA0~7 信号在设计底板时务必使用等长布线。 将转接板插入到Apalis Evalution Board 的 X5,并提供 3.3V 供电。 Device tree 修改 软件方面采用Linux BSP v3,对应内核为 toradex_4.14-2.3.x-imx 分支。对eMMC 的配置较为简单,在 device tree 中完成即可。 修改`imx6q-apalis-eval.dts`中的 usdhc1 节点,删除原来的 CD 引脚。 diff --git a/arch/arm/boot/dts/imx6q-apalis-eval.dts \ b/arch/arm/boot/dts/imx6q-apalis-eval.dts index 70be137c1f8b..6accb3611bcf 100644 --- a/arch/arm/boot/dts/imx6q-apalis-eval.dts +++ b/arch/arm/boot/dts/imx6q-apalis-eval.dts @@ -468,9 +468,9 @@ /* MMC1 */ &usdhc1 { - pinctrl-names = "default"; - pinctrl-0 = ; - cd-gpios = ; + /*pinctrl-names = "default";*/ + /*pinctrl-0 = ;*/ + /*cd-gpios = ;*/ status = "okay"; }; 修改`imx6qdl-apalis.dtsi`中 usdhc1 引脚配置,添加 non-removable 属性。这里限制了 SDIO 的最高频率为 20MHz。原因是在测试中发现通过转接板方式连接 eMMC 模块,当 SDIO 使用高频率时钟通信时容易引起发 MMC 相关错误。如果在定制底板上直接放置 eMMC 芯片并合理布线,则不会存在该问题。 diff --git a/arch/arm/boot/dts/imx6qdl-apalis.dtsi \ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi index e18ac19dd3bf..5622d1aadb88 100644 --- a/arch/arm/boot/dts/imx6qdl-apalis.dtsi +++ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi @@ -910,11 +910,14 @@ /* MMC1 */ &usdhc1 { pinctrl-names = "default"; - pinctrl-0 = ; + pinctrl-0 = ; /* 8bit */ vqmmc-supply = ; + max-frequency = ; bus-width = ; - disable-wp; + /*disable-wp;*/ no-1-8-v; + mmc-ddr-3_3v; + non-removable; status = "disabled"; }; eMMC 测试 重新启动后查看日志中mmc0 相关信息,mmc0 控制器上时别到外部扩展的 eMMC 模块。 root@apalis-imx6:~#dmesg|grepmmc0 mmc0: SDHCI controller on 2190000.usdhc using ADMA mmc0: new DDR MMC card at address 0001 mmcblk0: mmc0:0001 58A43A 14.6 GiB mmcblk0boot0: mmc0:0001 58A43A partition 1 4.00 MiB mmcblk0boot1: mmc0:0001 58A43A partition 2 4.00 MiB mmcblk0rpmb: mmc0:0001 58A43A partition 3 4.00 MiB, chardev (245:1) 由于前面设置了20MHz 的最高时钟,mmc0 的实际频率为 19.8MHz,8bit 总线模式。 root@apalis-imx6:~#cat/sys/kernel/debug/mmc0/ios clock:20000000Hz actualclock:19800000Hz vdd:21(3.3~3.4V) busmode:2(push-pull) chipselect:0(don't care) power mode: 2 (on) bus width: 3 (8 bits) timing spec: 8 (mmc DDR52) signal voltage: 0 (3.30 V) driver type: 0 (driver type B) 测试写入一个1GB 文件,速度约为 14MB/s。 root@apalis-imx6:/media/mmcblk0p1#timeddif=/dev/zeroof=./write_test_8bit\ bs=1Mcount=1024 1024+0recordsin 1024+0recordsout real1m8.987s user0m0.001s sys0m11.510s 总结 上面演示了如何在Toradex 计算机模块上方便地扩展外部 eMMC,以及一些注意事项如 eMMC 接口的电压选择、调试期间的时钟设置和载板设计中的布线问题。 ​
  • 2023-6-30 13:53
    0 个评论
    【飞凌嵌入式产品体验官】招募中!100个名额限时开放啦! 【飞凌嵌入式产品体验官】招募中!100个名额限时开放啦! 【飞凌嵌入式产品体验官】招募中!100个名额限时开放啦! 【飞凌嵌入式产品体验官】招募中!100个名额限时开放啦! 【飞凌嵌入式产品体验官】招募中!100个名额限时开放啦!
  • 热度 5
    2023-4-7 16:02
    396 次阅读|
    0 个评论
    为了能够让更多工程师朋友了解多核异构处理器,飞凌嵌入式特别推出了【玩转多核异构】专题,帮助大家解决在多核异构处理器的开发过程中遇到的问题。专题持续更新中,欢迎您的订阅关注。 SPI(串行外围设备接口)是一种低成本、易使用的接口协议,具备全双工、高速、通讯简单的特点,被广泛应用于微控制器和外围设备芯片之间的通讯。当SPI接口作为主模式时可以连接Flash存储器、AD采样芯片、实时时钟RTC、LCD显示屏、音频芯片以及各种传感器。 随着产品功能的愈加丰富,多处理器使用SPI接口进行通讯的场景开始出现,而多个SPI设备之间通信必须由主设备(Master)来控制从设备(Slave)。小编手上的OKMX8MP-C开发板基于NXP i.MX8M Plus多核异构处理器设计,它的M核有1路SPI,因而为实现SPI的相互通讯,我们就需要两块OKMX8MP-C开发板的SPI互作主从设备进行通信。本文小编就将从应用角度为大家讲解M核SPI间通讯的实现方式。 01 SPI主模式 SPI初始化 SPI初始化主要包括总线时钟、管脚和相应寄存器的初始化。具体如下: (1)SPI总线时钟:现将SPI总线倍频到800MHz,再10分频到80MHz。 CLOCK_SetRootMux(kCLOCK_RootEcspi2, kCLOCK_EcspiRootmuxSysPll1); //SPI2总线时钟使用PLL1-800MHz CLOCK_SetRootDivider(kCLOCK_RootEcspi2, 2U, 5U); //分频因子为2*5=10,设置SPI2总线时钟为80MHz (2)管脚配置:选择SPI2的四个管脚。 IOMUXC_SetPinMux(IOMUXC_ECSPI2_MISO_ECSPI2_MISO, 0U); // SPI2-MISO IOMUXC_SetPinMux(IOMUXC_ECSPI2_MOSI_ECSPI2_MOSI, 0U); // SPI2-MOSI IOMUXC_SetPinMux(IOMUXC_ECSPI2_SCLK_ECSPI2_SCLK, 0U); // SPI2-SCLK IOMUXC_SetPinMux(IOMUXC_ECSPI2_SS0_ECSPI2_SS0, 0U); // SPI2-SSO (3)SPI速率:设置速率为500K。 define TRANSFER_BAUDRATE 500000U // 速率 500K (4)数据长度选择:8bit。 burstLength = 8; // 数据长度 8bit (5)四种模式选择:CPOL和CPHA的四种组合即为SPI的四种模式。 clockInactiveState = kECSPI_ClockInactiveStateLow; // 时钟SCL: 活动时低电平,空闲时高电平 dataLineInactiveState = kECSPI_DataLineInactiveStateLow;// 数据MOSI&MISO: 活动时低电平,空闲时高电平 chipSlectActiveState = kECSPI_ChipSelectActiveStateLow;// 片选SS: 低电平选中,高电平无效 polarity = kECSPI_PolarityActiveHigh; // 时钟信号极性,即CPOL为0的话 SCLK高电平有效(空闲的时候为低电平),为1的话SCLK低电平有效(空闲的时候为高电平)。 phase = kECSPI_ClockPhaseFirstEdge; // 时钟相位,即CPHA为0的话串行时钟的第一个跳变沿(上升沿或下降沿)采集数据,为1的话串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。 (6)主模式选择:设置SPI为主模式。 channelConfig.channelMode = kECSPI_Master; // 主模式 (7)通道选择:一个 SPI 有四个硬件片选信号,每个片选信号是一个硬件通道,本程序选择通道0。 channel = kECSPI_Channel0; // 通道0 (8)关闭自回环:如果开启了自回环,那么SPI数据会在芯片内回环,不会到外部管脚,在程序调试时可以排除外部端子的干扰,但真实应用时,需要关闭自回环,从外部管脚收发数据。 enableLoopBack = false; // 不回环,使用外部管脚 SPI收发流程 我们分别将两块OKMX8MP-C开发板命名为开发板1和开发板2,并且将开发板1的SPI接口采用主模式,使能收发中断;将开发板2的SPI接口采用从模式,使能收发中断。 SPI主发送64字节数据,SPI从接收后,将数据回传。SPI主接收回传信息后,比对接收和发送的数据是否一致,输出比对结果。如一致,本次传输结束,等待输入任何按键启动下一次传输。 (1)SPI发送数据:EXAMPLE_ECSPI_MASTER_BASEADDR 表示为SPI2,g_m_handle为SPI实例,包含了发送接收中断及其回调函数,masterXfer为要发送的64字节数据。 ECSPI_MasterTransferNonBlocking(EXAMPLE_ECSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer); //主模式中断方式发送数据 (2)SPI接收数据:SPI总线的发送和接收都是主模式控制的,因此接收函数的过程和发送是一致的。 (3)接收和发送数据对比: for (i = 0U; i < TRANSFER_SIZE; i++) { if (masterTxData != masterRxData ) { errorCount++; } } 02 SPI从模式 SPI初始化 SPI从模式初始化与主模式要保持一致,除了将工作模式设为从模式,其他设置均一样。主从模式选择:设置SPI为从模式。 channelConfig.channelMode = kECSPI_Slave; //从模式 SPI收发流程 开发板2的SPI接口采用从模式,使能收发中断。 SPI从进入等待接收状态,在片选有效后,通过接收中断获取数据,并回传信息,再次进入接收状态。 (1)SPI接收数据:EXAMPLE_ECSPI_SLAVE_BASEADDR表示为SPI2,g_m_handle为SPI实例,包含了发送接收中断及其回调函数,slaveXfer存储接收的数据。 ECSPI_SlaveTransferNonBlocking(EXAMPLE_ECSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer); //从模式中断方式接收数据 (2)SPI发送数据:SPI总线的发送和接收都是主模式控制的,因此接收函数的过程和发送是一致的。 03 A核修改 A核设备树中若保留SPI2,内核解析设备树,在/dev下生成设备文件spidev1.0。这样待M核运行后,A核将重新对SPI2初始化,造成M核SPI功能异常,因此需要去除A核对SPI的控制。 修改设备树 (1)在设备树OK8MP-C.dts中,删除SPI2设备节点相关信息。 &ecspi2 { #address-cells = ; #size-cells = ; fsl,spi-num-chipselects = ; pinctrl-names = "default"; pinctrl-0 = ; cs-gpios = ; status = "okay"; spidev1: spi@0 { reg = ; compatible = "rohm,dh2228fv"; spi-max-frequency = ; }; }; pinctrl_ecspi2: ecspi2grp { fsl,pins = ; }; pinctrl_ecspi2_cs: ecspi2cs { fsl,pins = ; }; (2)编译生成新的内核镜像Image及设备树OK8MP-C.dtb。 (3)将生成的OK8MP-C.dtb和Image拷贝至开发板/run/media/mmcblk2p1/目录下,输入sync命令,重启开发板。 (4)输ls /dev查看发现没有SPI2设备文件spidev1.0。 04 程序验证 硬件连接 使用杜邦线将两块OKMX8MP-C开发板的SPI一一对应连接,线序如下: M核程序 修改uboot环境变量设置M核自启动,同时将M核程序forlinx_m7_tcm_firmware.bin 【玩转多核异构】M核程序的启动、编写和仿真。 实际测试 (1)开发板2先上电,M核程序启动,完成SPI初始化后,进入接收等待状态; (2)开发板1后上电,M核程序启动,完成SPI初始化后,主动发送64字节数据; (3)开发板2的SPI接收数据,通过串口打印接收的数据,并将接收的数据再次发送; (4)开发板1的SPI接收到回传信息,通过串口打印接收的数据。和发送数据比对,输出结果。 (5)此时在开发板1调试串口输入任意键,即可开启新一轮的SPI发送和接收流程。 以上就是小编为小伙伴带来的OKMX8MP-C开发板M核控制SPI主从模式的使用方法了,是不是感觉性能很强大呢?
相关资源