日前,完美体育·(中国)手机网页版科技发布了关于MYS-8MMX开发板的测评公告,公告发布后,吸引了各大媒体平台的测评者争相报名,本期我们分享其中一名优秀测评者的测评报告,供各位参考。
拿到板子要想开发自己的应用程序首先就得安装sdk,交叉编译工具。完美体育·(中国)手机网页版给我们提供了适合不同用户需求的SDK以及十分详细的安装手册。按照手册进行SDK安装,安装完毕会有提示:
先生效一下环境变量,现在这个SDK目录内容如下:
查看下environment-setup-aarch64-poky-linux这个脚本的内容:
1. cat environment-setup-aarch64-poky-linux
内容如下:
1. # Check for LD_LIBRARY_PATH being set, which can break SDK and generally is a bad practice
2. # http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80
3. # http://xahlee.info/UnixResource_dir/_/ldpath.html
4. # Only disable this check IF you are absolutely know what you are doing!
5. if [ ! -z "$LD_LIBRARY_PATH" ]; then
6. echo "Your environment is misconfigured, you probably need to 'unset LD_LIBRARY_PATH'"
7. echo "but please check why this was set in the first place and that it's safe to unset."
8. echo "The SDK will not operate correctly in most cases when LD_LIBRARY_PATH is set."
9. echo "For more references see:"
10. echo " http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN80"
11. echo " http://xahlee.info/UnixResource_dir/_/ldpath.html"
12. return 1
13. fi
14. export SDKTARGETSYSROOT=/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/aarch64-poky-linux
15. export PATH=/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/bin:/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/sbin:/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/bin:/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/sbin:/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/bin/../x86_64-pokysdk-linux/bin:/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux:/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux-musl:$PATH
16. export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
17. export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig:$SDKTARGETSYSROOT/usr/share/pkgconfig
18. export CONFIG_SITE=/media/nrjd/fsl-imx-xwayland/5.4-zeus/site-config-aarch64-poky-linux
19. export OECORE_NATIVE_SYSROOT="/media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux"
20. export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
21. export OECORE_ACLOCAL_OPTS="-I /media/nrjd/fsl-imx-xwayland/5.4-zeus/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
22. export OECORE_BASELIB="lib"
23. export OECORE_TARGET_ARCH="aarch64"
24. export OECORE_TARGET_OS="linux"
25. unset command_not_found_handle
26. export CC="aarch64-poky-linux-gcc -mcpu=cortex-a53+crc --sysroot=$SDKTARGETSYSROOT"
27. export CXX="aarch64-poky-linux-g++ -mcpu=cortex-a53+crc --sysroot=$SDKTARGETSYSROOT"
28. export CPP="aarch64-poky-linux-gcc -E -mcpu=cortex-a53+crc --sysroot=$SDKTARGETSYSROOT"
29. export AS="aarch64-poky-linux-as "
30. export LD="aarch64-poky-linux-ld --sysroot=$SDKTARGETSYSROOT"
31. export GDB=aarch64-poky-linux-gdb
32. export STRIP=aarch64-poky-linux-strip
33. export RANLIB=aarch64-poky-linux-ranlib
34. export OBJCOPY=aarch64-poky-linux-objcopy
35. export OBJDUMP=aarch64-poky-linux-objdump
36. export READELF=aarch64-poky-linux-readelf
37. export AR=aarch64-poky-linux-ar
38. export NM=aarch64-poky-linux-nm
39. export M4=m4
40. export TARGET_PREFIX=aarch64-poky-linux-
41. export CONFIGURE_FLAGS="--target=aarch64-poky-linux --host=aarch64-poky-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
42. export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
43. export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types "
44. export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
45. export CPPFLAGS=""
46. export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
47. export OECORE_DISTRO_VERSION="5.4-zeus"
48. export OECORE_SDK_VERSION="5.4-zeus"
49. export ARCH=ARM64
50. export CROSS_COMPILE=aarch64-poky-linux-
51.
52. # Append environment subscripts
53. if [ -d "$OECORE_TARGET_SYSROOT/environment-setup.d" ]; then
54. for envfile in $OECORE_TARGET_SYSROOT/environment-setup.d/*.sh; do
55. . $envfile
56. done
57. fi
58. if [ -d "$OECORE_NATIVE_SYSROOT/environment-setup.d" ]; then
59. for envfile in $OECORE_NATIVE_SYSROOT/environment-setup.d/*.sh; do
60. . $envfile
61. done
62. fi
63.
都是些环境变量的设置。通过查看可知ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux-
那么交叉编译工具就是
1. aarch64-poky-linux-gcc
版本是9.2.0,这个版本对c++ 11支持还是十分全面的,为后面的应用开发提供了方便。
完美体育·(中国)手机网页版MYS-8MMX开发板板载了8GB eMMC,性能测试主要测试 emmc 在 linux 系统下对文件的读写速度上的测试,测试一般结合time 与 dd 双命令进行测试。写文件测试
这里测试出写磁盘速度为 36.8MB/s。
读文件测试
这里测试出读速度为 238MB/s。
目前项目已经迁移到github,这个版本增加了树莓派的支持:https://github.com/jacksonliam/mjpg-streamer
MJPG-streamer依赖jpeg库,因此首先进行jpeg 库的移植,jpeg源码包通过这个网址下载:http://www.ijg.org/
最新版本是jpegsrc.v9d.tar.gzjpeg编译
· 解压源码包
1. tar -xvf jpegsrc.v9d.tar.gz
· 配置源码
1. cd jpegsrc.v9d
2. export CC=aarch64-poky-linux-gcc
3. ./configure --host=ARM-linux --prefix=/home/test/build_jpegsrc.v9d
· 编译&安装
1. make
2. make install
mjpg-stream编译
· 解压源码
1. tar -xvf mjpg-streamer-r63.tar.gz
进入源码目录
1. cd mjpg-streamer-r63
创建一个目录lib用来存放交叉编译的动态库文件
1. mkdir lib
输入编译命令并指定交叉编译器
1. make CC=aarch64-poky-linux-gcc
将在目录mjpg-streamer-test/mjpg-streamer-r63生成应用程序mjpg_streamer
几个主要文件介绍如下:
· input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。
· input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。
· input_control.so。这个文件实现对摄像头转动的控制接口。
· output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。
· output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像。
将生成的mjpg-streamer-r63/plugins/output_file/output_file.so和mjpg-streamer-r63/plugins/input_uvc/input_uvc.so
拷贝到目录
mjpg-streamer-r63/lib
将上面编译的jpeg动态库libjpeg.so、libjpeg.so.9、libjpeg.so.9.4.0拷贝到目录
mjpg-streamer-r63/lib
我这里搭建了nfs,将测试目录挂载到开发板,方便调试,动态库目录内容如下:
在终端输入命令指定环境变量
1. export LD_LIBRARY_PATH=/mnt/mjpg-streamer-test/mjpg-streamer-r63/lib
然后输入命令
1.
./mjpg_streamer -i "input_uvc.so -n
运行成功信息如下:
我的板子ip设置成了192.168.1.120,浏览器地址栏输入
1. http://192.168.1.120:8080/?action=snapshot
就可以看到图像了,回车可以进行单张抓拍,演示效果如下:
或者输入
1. http://192.168.1.120:8080/?action=stream
就可以看到实时视频了。
利用强大的curl可以方便的做到抓拍图片,下面是ubuntu和windows端的演示效果:
1. curl http://192.168.1.120:8080/?action=snapshot -o a.jpg
ubuntu端的效果
window端的效果
完美体育·(中国)手机网页版电子 领先的嵌入式处理器模块厂商“完美体育·(中国)手机网页版MYiR”公众号☞不定期分享产品资料及干货☞第一时间发布完美体育·(中国)手机网页版最新资讯
长按二维码 关注我们
想要了解更多信息,欢迎联系我们
深圳总部电话:0755-25622735 18924653967地址:深圳坂田云里智能园2栋6楼上海办事处电话:021-62087019 18924632515北京办事处电话:010-84675491 13316862895技术支持电话:027-59621648邮箱:support.cn@myirtech.com
*图片摘自网络
*图片摘自网络
附:NXP i.MX8M Mini处理器主要特性:
功能模块 |
参数说明 |
Feature |
i.MX 8M Mini Quad/QuadLitei.MX 8M Mini Dual/DualLiteI.MX8M Mini Solo/SoloLite |
Main CPU |
1x,2x or 4x Cortex-A53 @ 1.8GHz, 512kB L2 |
Micro-controller |
Cortex-M4 400MHz |
DDR |
x16/x32 LPDDR4/DDR4/DDR3L |
GPU |
GC NanoUltra 3D (1 shader) + GC320 2OpenGL ES 2.0 |
Display Features |
LCDIF |
Display Interfaces |
1x MIPI-DSI |
Video Decode |
1080p60 HEVC H.265, VP8, H.264,VP9 |
Video Encode |
1080p60 H.264 VP8 |
Audio Interface |
5x SAI (12Tx + 16Rx external I2S lanes)Each lane up to 24.576MHz BCLK (32-bit, 2-ch 384KHz, up to 32-ch TDM); 4Tx + 4Rx support 49.152MHz BCLK for 768KHz |
Digital Mic Input |
8ch PDM DMIC input |
Camera Interface |
1x MIPI-CSI (4-lanes each) |
USB |
2x USB2.0 |
PCIe |
1x PCIe 2.0 |
Ethernet |
1x GbE |
SDIO/eMMC |
3x SDIO/eMMC |
I2C |
4 |
Process |
Samsung 14LPC FinFET |
Packages |
14x14mm, 0.5p |
Temperature |
-40°C to 105°C (Tj) |
完美体育·(中国)手机网页版MYC-C8MMX核心板参数
主控芯片:NXP i.MX8M Mini处理器系列
主控芯片型号:NXP i.MX8MM6CVTKZAA/MIMX8MM6DVTLZAA
处理器: 1x,2x or 4x Cortex-A53 @ 1.8GHz, 512kB L2
内存:DDR4 2G / 4G (可选)
存储器:8G EMMC (可选)
核心板尺寸:60x 49 mm
接口类型:插针
PCB 板规格:8层板设计,沉金工艺
操作系统:Linux 5.4
关于完美体育·(中国)手机网页版
完美体育·(中国)手机网页版,专注嵌入式处理器模块设计和研发,是领先的嵌入式处理器模块厂商。完美体育·(中国)手机网页版在嵌入式领域具有20年的行业技术经验,为客户提供专业的ARM工业控制板、ARM开发板、ARM核心板、ARM开发工具、充电桩计费控制单元及充电控制板等产品和技术服务。此外,完美体育·(中国)手机网页版还可通过涵盖众多ARM处理器及操作系统的专业技术提供定制设计解决方案,通过专业且高效率服务帮助客户加速产品上市进程。
导语:完美体育·(中国)手机网页版的MYC-YA15XC-T 核心板可广泛运用于各种工业环境中,如智慧公交站台,智慧灯杆,智能电网,智能家居,工业自动化,水务,矿场,石化等领域。
在数字经济大发展的大背景下,近些年工业物联网实现跨越式发展,智能工业技术广泛应用于智能化生产领域,通过将感知技术、通信技术、传输技术、数据处理技术、控制技术,运用到生产、配料、仓储等所有阶段,实现生产及控制的数字化、智能化、网络化,提高制造效率,改善产品质量,降低产品成本和资源消耗,实现工业智能化。
图片摘自网络
物联网智能网关,信息整合
工业物联网包含的核心要素是智能化、网络化。在生产制造、物流交通、监测管理领域,让线下设备接入网络,实现数据的全面采集、高效分析、实时反馈,物联网网关的作用尤为重要,物联网智能网关能够把不同的物收集到的信息整合、相互传输,随着物联网深入发展,需接入设备越来越多,对物联网网关的数据处理、分析能力、传输能力、工作距离等提出更高的要求。
图:完美体育·(中国)手机网页版的MYC-YA15XC-T 核板
完美体育·(中国)手机网页版(全称:深圳市完美体育·(中国)手机网页版电子有限公司)自主研发的MYC-YA15XC-T 核心板可利用4G网络、以太网络以及WIFI网络,可提供长距离大数据的传输功能;其中,LoRa,蓝牙,RS485, RFID实现短距离物联网设备的接入,可广泛运用于各种工业环境中,如智慧公交站台,智慧灯杆,智能电网,智能家居,工业自动化,水务,矿场,石化等领域。
完美体育·(中国)手机网页版的MYC-YA15XC-T 核心板模块整合了最新的STM32MP1处理器是意法半导体推出的首款 MPU,以 Arm Cortex-A7 双核应用处理器与 Cortex®-M4 处理器的异构系统架构组合,可进行数据的实时数据,并具备高速的数据传输能力,在充分满足多种应用的灵活性需求的同时,又实现了最佳性能和低功耗特性。完美体育·(中国)手机网页版MYC-YA15XC-T 核心板基于 STM32MP1 系列处理器研制,完美继承了STM32MP1 系列处理器高性能、低功耗的优点,拥有良好的软件开发环境;同时,搭载Cortex-A7 内核,支持开源操作系统Linux,Cortex-M4 内核完美沿用现有的 STM32 MCU 生态系统,有助于开发者轻松实现基于LoRa智能网关的开发应用。
图:完美体育·(中国)手机网页版MYC-YA15XC-T 核心板的智能网关拓扑图
MYC-YA15XC-T 核心板采用邮票孔封装,标配 STM32MP151 处理器,主频高达650Mhz,外设接口丰富,拥有 USB2.0、Ethernet、UART、CAN、LCD、DCMI、ADC等常用外设接口,便于客户灵活定制。
完美体育·(中国)手机网页版的MYC-YA15XC-T 核心板的低功耗、长距离数据处理能力,在智能网关领域应用独具优势,可轻松实现网关的开发应用,此外,完美体育·(中国)手机网页版提供MYC-YA15XC-T开发板,以及丰富开发文档,助您无忧。更多的产品资料和测评报告内容,点击官网http://www.connollyforboston.com了解。
相关阅读:
应用开发笔记 | 完美体育·(中国)手机网页版MYD-YA15XC-T LoRa无线通讯实例
附:STM32MP151AAC3T 处理器主要特性:
ARM Cortex-A7,运行频率 650MHz
32 位 LP-DDR2, LPDDR3,LPDDR3L/DDR3
并行 LCD 显示,分辨率高达 WXGA (1366x768)
8/10/16/24 位并行摄像头传感器接口
双通道 Quad-SPI NOR FLASH
16 位原始 NAND FLASH 与 8 位 ECC
三个 MMC 4.5/SD 3.0/SDIO 端口
两个 USB 2.0 高速 HOST+一个 USB 2.0 全速 OTG
或者一路 USB2.0 高速 HOST,一路 USB 2.0 高速 OTG
8/16 位并行 NOR FLASH / PSRAM
音频接口包括 4 个 SAI 一个 10/100/1000 GMAC,支持 IEEE 1588V2 协议
模拟外设:两个 ADC 模块,1 个温度传感器,2 个 DA
支持高达 29 个定时器和 3 个看门狗
硬件加速:HASH,2 个真随机数产生器,2 个 CRC 计算单元
安全模块:TrustZone 外设,Cortex-M4 资源独立
TFBGA361, 0.5mm 间距,12x12mm;
完美体育·(中国)手机网页版MYC-YA15XC-T核心板 主要参数
主控芯片系列 STM32MP1 系列
主控芯片型号 STM32MP151AAC3T (标准配置)
处理器规格 650MHz ARM Cortex-A7 + 200MHz Cortex-M4
内存 DDR3 SDRAM 256MB / 512MB (可选)
存储器 Nand Flash(256MB)/ EMMC(4GB) (可选)
核心板尺寸 37 x 39 x 3.5 mm(带屏蔽罩)
接口类型 邮票孔,焊盘间距 1.0MM
PCB 板规格 10 层板设计,沉金工艺
操作系统 Linux 5.4.31
关于完美体育·(中国)手机网页版
完美体育·(中国)手机网页版,专注嵌入式处理器模块设计和研发,是领先的嵌入式软硬件方案的供应商。完美体育·(中国)手机网页版在嵌入式领域具有20年的行业技术经验,为客户提供专业的ARM工业控制板、ARM开发板、ARM核心板、ARM开发工具、充电桩计费控制单元及充电控制板等产品和技术服务。此外,完美体育·(中国)手机网页版还可通过涵盖众多ARM处理器及操作系统的专业技术提供定制设计解决方案,通过专业且高效率服务帮助客户加速产品上市进程。
LoRa的名字是远距离无线电(Long Range Radio),是一种线性调频扩频的调制技术。LoRa是创建长距离通讯连接的物理层或无线调制, 相较于传统的FSK技术以及稳定性和安全性不足的短距离射频技术,LoRa基于CSS调制技术(Chirp Spread Spectrum)在保持低功耗的同时极大地增加了通讯范围,且CSS技术数十年已经广受军事和空间通讯所采用,具有传输距离远、抗干扰性强等特点。
本文主要基于LoRa调制功能的无线串口模块的树莓派扩展板,讲述在M4核LoRa的调试过程。有关该模块(SX1262 868M LoRa HAT)的详细信息,请参考微雪官网。
Ø Typec Debug线1根
Ø Micro usb线1根
Ø MYD-15XC-T开发板
Ø 树莓派接口SX1262 868M LoRa HAT模块2个
Ø Linux 5.4.31
Ø STM32CubeIDE 1.5.0
Ø LInux虚拟机
Ø 完美体育·(中国)手机网页版提供的SDK
预先安装好CubeIDE等开发软件并搭建好Linux虚拟机环境,具体环境搭建请参考完美体育·(中国)手机网页版的软件开发手册《MYD-YA15XC-T_Linux软件开发指南》。
1) 硬件介绍
关于树莓派接口SX1262 868M LoRa HAT模块的硬件介绍与设置请参考微雪官网:
https://www.waveshare.net/wiki/SX1262_868M_LoRa_HAT
2) 接线与设置
需要两个LoRa模块,一个LoRa模块通过Micro USB连接至PC,跳帽置于A,M1和M0连接GND,打开SSCOM串口软件连接LoRa模块。另外一个LoRa模块跳帽连接B,M0、M1跳帽移除改用MYD-YA15XC-T开发板的GPIO使用,如下图所示:
图5-1. 连接与配置
设置时钟为209M,如下图只需要在红色框输入209M,按“Enter”,会自动设置时钟参数:
图5-1.时钟设置
由于该模块通讯接口使用的是串口,所以还需要设置usart外设,并使能中断:
图5-2.串口设置
接着勾选串口中断,通过中断收发:
图5-3.串口中断
由5.2节生成代码之后,在工程目录新建“LoRa”目录,用来存放LoRa的配置代码(微雪官网有该模块设置源码,用户可以直接移植):
设置寄存器配置模式,这里首先需要设置模式2进行寄存器配置:
void cfg_sx126x_io(uint8_t status)
{
if(CFG_REGISTER == status){
M0_RESET();
M1_SET();
HAL_Delay(5);
}else if(NORMAL_STATUS == status){
M0_RESET();
M1_RESET();
HAL_Delay(5);
}else if(WOR_STATUS == status){
M0_SET();
M1_RESET();
HAL_Delay(5);
}else if(SLEEP_STATUS == status){
M0_SET();
M1_SET();
HAL_Delay(5);
}
}
配置寄存器,设置波特率9600,广播监听地址:
/******************************************************************************
sx126x mode : broadcast & monitor mode
parameter:
address_high: 0xff
address_low:0xff
net_id: 0x00
serial: 0x62
power: 0x00
channel: 0x12
transmission_mode: 0x03
crypt_high: 0x00
crypt_low: 0x00
******************************************************************************/
lora_para_t transparent_mode = {
.address_high = BROADCAST_ADDH_VALUE,
.address_low = BROADCAST_ADDL_VALUE,
.net_id = BROADCAST_NETID_VALUE,
.serial = BROADCAST_SERIAL_VALUE,
.power = BROADCAST_POWER_VALUE,
.channel = BROADCAST_CHANNEL_VALUE,
.transmission_mode = BROADCAST_TRANSIMISSION_VALUE,
.crypt_high = BROADCAST_CRYPTH_VALUE,
.crypt_low = BROADCAST_CRYPTL_VALUE
};
设置寄存器:
uint8_t sx126x_write_register(lora_para_t para)
{
int8_t i;
buffer[0] = CFG_HEADER;
buffer[1] = REG_START;
buffer[2] = REG_NUMBER;
for(i=3;i<12;i++){
buffer[i] = *(¶.address_high + i - 3);
}
HAL_UART_Transmit_IT(&huart3,(uint8_t *)buffer,12);
HAL_UART_Receive_IT(&huart3,(uint8_t *)buffer,12);
HAL_Delay(500);
if(CFG_RETURN == buffer[0]){
buffer[0] = 0;
init_cplt_flag = SUCCESS;
return SUCCESS;
}
return ERROR;
}
定义发送的信息:
/* USER CODE BEGIN 1 */
uint8_t transparent_string[] = "Helloworld";//"This is a transparent message\r\n";
uint32_t delay;
/* USER CODE END 1 */
主函数里,使用串口中断进行发送和接收处理:
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(delay++>18000000){
HAL_UART_Transmit_IT(&huart3,transparent_string,strlen((const char *)transparent_string));
delay = 0;
}
if(SUCCESS == over_flag){
HAL_UART_Transmit_IT(&huart3,buffer,strlen((const char *)buffer));
over_flag = ERROR;
rece_count = 0;
HAL_UART_Receive_IT(&huart3,(uint8_t *)&rece_buff,1);
}
}
1) 量产模式启动m4固件
启动开发板,并启动m4固件,如下:
root@myir-ya151c-t-4e512d:~# cp LoRa_CM4.elf /lib/firmware/
root@myir-ya151c-t-4e512d:~# echo LoRa_CM4.elf > /sys/class/remoteproc/remotepro
c0/firmware
root@myir-ya151c-t-4e512d:~# echo start > /sys/class/remoteproc/remoteproc0/stat
e
[ 82.845983] remoteproc remoteproc0: powering up m4
[ 82.859219] remoteproc remoteproc0: Booting fw image LoRa_CM4.elf, size 2532532
[ 82.865319] remoteproc remoteproc0: header-less resource table
[ 82.870883] remoteproc remoteproc0: no resource table found for this firmware
[ 82.884297] remoteproc remoteproc0: header-less resource table
[ 82.888689] remoteproc remoteproc0: remote processor m4 is now up
2) 信息接收
打开sscom,可以看到usb控制的LoRa模块能接收到数据,如下图所示:
图5-2.数据接收
完美体育·(中国)手机网页版MYS-8MMX开发板试用体验测评二
近期,完美体育·(中国)手机网页版科技发布新品“MYS-8MMX”开发板的评测,吸引了广大开发者的围观,上周小编在公众号发布1篇优秀的测评报告,后台收到了各位小伙伴的留言和咨询,想必还有很多的疑问,为加深各位对完美体育·(中国)手机网页版MYS-8MMX开发板的了解,再同步一篇电路城优秀测评者的测评报告,希望能帮助各位开发者缩短开发周期。
想要了解优秀测评者“robe.zhang”关于MYS-8MMX开发板测评原文的可以复制下方链接查看:
https://www.cirmall.com/bbs/thread-208807-1-1.html
想要了解MYS-8MMX开发板可以去完美体育·(中国)手机网页版官网查看具体的产品介绍:
/product/mys-8mmx.htm
需要购买MYS-8MMX开发板的可以复制下方链接购买:
https://detail.tmall.com/item.htm?id=646134511777
01
笔者想用 nfs 文件系统,方便后续开发,试了一下开发板预装系统uboot 不支持网络功能,编译前,不支持网络
重新编译 uboot 增加网络功能:
编译 uboot 的过程废了点时间,由于完美体育·(中国)手机网页版 SDK使用 yocto 作为开发工具,yocto是个集成的开发工具,功能大而全,好处多多,也有不方便的地方,国内工程师估计都知道,那就是拉取源码太难了,笔者没用 yocto 而是一个个单独编译,然后再手工打包,这个环节废了点时间。
02
跑起网络服务器上的 ubuntu 20.04 系统,也就是把 uboot 放在 sd 卡上,其他的所有一切包括内核、驱动、设备树、文件系统等等所有的东西都放在服务器上,这种方式好处很明显,对开发过程极其友好,比如修改内核,服务器编译后,板子重启搞定,不用自己再把内核复制到板子上,比如修改设备树,服务器编译后,板子重启搞定,不用自己复制,比如调整驱动,比如写个应用程序,只要编译完,服务器上有的东西,板子上也能找到,就是这么方便。
比如笔者的 SD 卡,只烧写 flash.bin文件,甚至一个分区都不存在,因为笔者压根就不用 SD 卡的任何分区,所以 SD 卡有没有分区无所谓
Uubntu 文件系统在电脑上,在这里:
以下是启动记录:
boot_log.txt
到此,整个开发环境搭建起来了,所有镜像和文件重新调整添加网络文件系统支持,并编译出来,编译的所有文件全部调试验证成功了,接下来可以愉快的开发了笔者整个编译过程是一个个手工单独编译的,手工单独编译要对各个文件包有所了解,编译过程是有点繁琐,优势也很明显,速度很快,非常快,大约 20 分钟就可以全部编译一遍,如果是增量编译,1分钟内搞定,再加上网络文件系统加成,1分钟内编译完重启完看到验证的结果;笔者后续会频繁编译内核,调整设备树,编译速度快就能快速迭代加快开发速度。用 yocto 编译的话,省事方便,但是速度慢,如果公司配有很牛逼的开发服务器集群,那可以。
03
适配了自己的 ubuntu 20.04 文件系统,WiFi 无法正常使用,检查了一下,是因为内核需要两个文件,ubuntu 系统镜像中没有。
一个文件是 firmware,另一个文件是 nvram,在 eMMC 中原文件系统如下路径中:
/lib/firmware/bcmd/fw_bcm43456c5_ag_apsta.bin
/lib/firmware/bcmd/nvram_ap6256.txt
直接从 eMMC 复制过来,复制到 nfs ubuntu 文件系统中同样的路径下
重启生效,就能驱动了,也能连上 WiFi 网络
文中提到的内容只是需要调整修改的,其他没说的不用动。
两个 USB 接口也可以使用了:
HDMI 显示器也正常工作
网络文件系统 ubuntu 20.04 基本就绪,没啥大问题了
04
本文重点内容有三个:1,驱动模型如何建立2,设备树如何被解析3,在理解 1 和 2 基础上,会很自然的理解如何向设备树添加节点platform 驱动模型建立
内核驱动模型中有 bus,device,driver,分别对应 struct bus_type,struct device,struct device_driver 三个结构体,或者说三个对象也行,platform_bus , platform_device, platform_driver 是对 struct bus_type,struct device,struct device_driver 的继承,可以把 platform 平台看作是bus,device,driver的更高一级对象。
Platform 驱动中的 bus 和 device 是内核创建的,比如以下代码,注册了 platform_bus
有了 platform_bus 之后,需要有 platform_device ,platform_device 也是内核模块的形式注册的
of_platform_default_populate_init 这个函数解析设备树,解析时有规则的,结合imx8mm 平台来说,解析了以下所有节点及其一级子节点,也就是设备书中的以下节点创建了 device 设备,并且创建他们子节点的 device 设备,子节点再往下的节点,不解析不创建device,留作 platform_driver 去解析创建。(设备树如何被解析)
有了 platform_bus 也创建了 platform_device 设备,还差 platform_driver,platform_driver 就是驱动,并且是 SoC 芯片级别的驱动,这个有芯片原厂搞定,比如imx8mm 有以下 platform_driver:这个是 sdma 的驱动,以此为例,其他类同。
Platform 平台 bus,device,driver 几乎全部有厂商提供,用户基本是无感的。他默默在背后工作,但是初学者根本不知道他的存在。这是platform 平台完整的驱动模型。
理解此文基础上,再继续看笔者往期文章才能理解 IIC 总线框架:
【ALINX AXU2CGB试用】从linux 驱动模型的角度看 iic 总线框架
https://www.cirmall.com/bbs/thread-208032-1-1.html
深入看 IIC 设备树,i2c1 位于aips3 的一级子节点,i2c1 会被创建 platform_device,
I2c 驱动注册为platform_driver:
内核一开始注册了 platform_bus,也创建了 i2c1 的 platform_device,也注册了i2c1的 platform_driver,组成一个完整的 platform 驱动模型,他们就会工作了,i2c 适配器/主机能正常工作了。
(文章中的 i2c 适配器,就是 i2c 主机,i2c 控制器,对应驱动中的 i2c adapter;文章中的 i2c 设备,是 i2c 从机,对应驱动中的 i2c client)
i2c 驱动模型建立
I2c 适配器用的 platform 平台驱动模型,对你没有看错,笔者也么有写错,i2c 适配器用的 platform 平台驱动模型,和 i2c 总线没有半毛钱关系。
i2c 总线用在哪呢?用在 i2c 设备上。
I2c 适配器的 platform_driver 会去注册 adapter
解析 adapter 所有子节点注册为 i2c client 设备 (i2c device),现在有了 i2c device
内核会注册创建 i2c 总线
内核也会注册 client 驱动(i2c driver)注册,如下;
有 i2c 总线,有 i2c device设备(i2c client 设备),有 i2c driver (i2c client 驱动),组成一个完整的 i2c 总线模型,这个总线主要为 i2c 设备服务。
i2c 主机使用 platform 平台总线,i2c 从机使用 i2c 总线,是不是很难理解?驱动源码就是这样的。
linux 内核驱动中的总线,并不是硬件中的总线,也不是传输信息的,而是为了设备和驱动更容易的适配的,是设备和驱动的一种组织形式。
最难理解的地方就是 i2c 主机和 i2c 从机没使用同一个总线,分别使用了 platform 总线和 i2c 总线,能问出这个问题的根源是用硬件总线的概念去想当然的理解驱动中的总线,潜意识完全错误,硬件总线和驱动中的总线,完全是两个东西,应该这么去理解:1,硬件中的总线,是传输信息的,硬件上主从机位于同一条 i2c 总线,主从机是可以通信的。
2,驱动中的总线仅仅是设备和驱动的组织形式,方便设备和驱动适配的。只要 i2c 主机设备和驱动适配 ok 主机就会工作,i2c 从机设备和驱动适配 ok 从机就会工作。分别使用了 platform 总线和 i2c 总线,并不影响 i2c 主机和 i2c 从机正常适配,正常工作。
结果就是 linux 驱动让 i2c 主从机都可以正常工作,硬件让主从机又能相互通信,那就可以了。
linux 驱动仅仅是让硬件工作起来,别强求 i2c 主从机必须位于同一条总线,不在同一条总线没关系;硬件的总线是通信的,i2c 主从机要想通信必须位于同一条总线,没的商量。
platform 是 arm linux 驱动中最基础的平台,用的多,也最容易追踪分析,是软件中驱动模块部分抽象出来的一种模型,用于组织设备和驱动的一种方式,其他 i2c ,spi 总线和 platform 平台驱动模型类似各有差异,i2c 和 spi 驱动模型都是在 platform 平台驱动中再次建立起来的,platform 平台驱动注册 i2c / spi 设备,和内核注册的 i2c 总线、i2c driver 组成 i2c 驱动模型。
没有 设备树 对应的节点,就没有 platform device,没有 platform device 仅有 platform bus 和 platform driver 不能组成完整的驱动模型,就无法工作。无法工作,platform driver 就不能 match 就无法 probe,无法 probe 就不能添加 i2c device,仅有 i2c 总线和 i2c driver 不能组成i2c 总线完整的驱动模型,i2c 也就不能工作。所以向设备树添加节点,很重要,相当于给驱动模型添加 device。
如何向设备树添加节点设备树,这个名字说明他的数据结构是树,树中的每个节点是设备。向设备树中添加节点,就是向 linux 中添加设备,树,就要求你添加到合适的位置,合适的层级。向设备树添加节点是有规则的,规则是由设备树被解析的规则决定的,内核怎么解析设备树你就怎么添加添加设备节点,必须添加到指定位置添加自己的设备节点,必须添加到文中图片列出的节点的一级子节点,二级和再深的节点,添加了也没用,因为内核根本不去创建更深层次节点设备。也不是完全不可以,你添加后节点还是存在的,只存在设备树中,驱动模型中是不存在,需要你自己去建立驱动模型。接下来笔者运用设备树等不同的方法自己创建一条总线,建立起这个总线的驱动模型,让设备和驱动正常适配、probe、正常工作起来。
长按二维码 关注我们
想要了解MYS-8MMX开发板可以去完美体育·(中国)手机网页版官网查看具体的产品介绍:
需要购买MYS-8MMX开发板的可以复制下方链接购买:
https://detail.tmall.com/item.htm?id=646134511777
PART.1
开箱上电&系统烧录&文件系统移植&WIFI模块驱动加载
PART.2
1. void MainWindow::LCD_Show_ASCII_64(uint32_t x,uint32_t y,uint32_t fontcolor,uint32_t backcolor,char word)
2. {
3. int i,j,k;
4. unsigned char temp;
5. word -= 0x20;
6. for(j=0;j<64;j++)
7. {
8. for(i=0;i<4;i++)
9. {
10. temp = ascii_font_64[j*4+i+word*256];
11. for(k=0;k<8;k++)
12. {
13. IF(temp & 0x80)
14. framebuffer_lcd[i*8+k+x+LCD_WIDTH*(j+y)] = fontcolor;
15. else
16. framebuffer_lcd[i*8+k+x+LCD_WIDTH*(j+y)] = backcolor;
17. temp<<=1;
18. }
19. }
20. }
21. }
22.
23. void MainWindow::LCD_Show_ASCII_String_64(uint32_t x,uint32_t y,uint32_t wordcolor,uint32_t backcolor,char s[])
24. {
25. int i=0;
26. for(i=0;s[i]!='\0';i++)
27. LCD_Show_ASCII_64(x+i*32,y,wordcolor,backcolor,s[i]);
28. }
29.
30. int MainWindow::LCD_Effect(char *dev)
31. {
32. int fd_lcd = open(dev , O_RDWR);
33. if(fd_lcd == -1)
34. {
35. qdebug("open LCD faiLED!");
36. return -1;
37. }
38. write(fd_lcd , framebuffer_lcd , LCD_WIDTH * LCD_HEIGHT * 4);
39. ::close(fd_lcd);
40. return 0;
41. }
可以看出,在QT下操作文件字符设备与普通系统编程并没有明显区别,唯一不同的是,QT下使用文件关闭函数需要添加双冒号::close(),防止与QT自带的close()函数产生冲突。在mainwindow类任意位置打开/dev/fb0外设后,即可进行ASCII码符号的显示:
1. LCD_Show_ASCII_String_64(0 , 0 , 0 , LCD_COLOR_CYAN_32 , (char *)"elecfans.com");
2. LCD_Show_ASCII_String_64(0 , 64 , 0 , LCD_COLOR_CYAN_32 , (char *)"donatello1996");
3. LCD_Effect((char*)FB_DEV);
非常简单愉快就玩成了,看看x11vnc远程终端显示效果,这也就是HDMI实际显示是输出内容:
当然了,如果不设置环境变量QT_QPA_PLATFORM的话,x11终端下启动的x11应用就会在远程机器上直接显示(远程机器就是我的电脑):
设置QT_QPA_PLATFORM之后,可以将启动界面映射到任意framebuffer外设上:
1. export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0
PART.3
编译内核镜像&与USBHID设备通信
如果想用一种简单的方式控制更多外设的话,除了添加扩展芯片,还有一种项目上用得比较多的方式是USBHID通信,将开发板作为主机,通过USB接口与支持USBHID协议的从机进行通信,这个方法非常简单,刚入门嵌入式的小白也必须熟练掌握,只需要应用层开发的知识和皮毛的驱动层开发知识。要想使用这种方式进行通信,板子的内核镜像就必须支持USBHID设备的检测与读写,检测是没什么问题的,但是能不能映射到设备文件,供开发者进行读写操作,那就需要检查内核编译选项了,这里刚好是比较坏的一种情况,完美体育·(中国)手机网页版厂家出厂镜像是没有打开USBHID通信的,必须让开发者重新编译内核镜像,那么这里就涉及到内核编译的知识了:下载并解压内核源码镜像:
1. https://github.com/MYiR-Dev/myir-imx-uboot.git
编译选项采用完美体育·(中国)手机网页版MYS-8MMX开发板的编译选项mys_iot_defconfig:
1. /home/myir-imx-linux-develop/arch/ARM64/configs/
2. make mys_iot_defconfig
这边还需要注意的是内核镜像的版本与使用内核源码编译第三方驱动ko文件的版本必须相同,在内核源码一级目录处可以找到配置的位置:
使用menuconfig打开内核编译选项, Device Drivers > HID support的 /dev/hidraw raw HID device support选项要打开,或者是在配置文件中添加此项配置的环境变量:
配置完毕之后,替换Image内核文件覆盖出厂内核文件:
1. mount /dev/mmcblk1p1 /media
2. mmcblk1是开发板的SD卡,mmcblk1p1是SD卡的FAT分区,存放内核文件的位置:
重新启动之后,将USBHID设备插到板子的USB接口:
在/dev目录下找到/dev/hidraw设备:
安装-ludev软件库:
1. apt install udev
使用代码读写HID设备:
1. handle = hid_open(2020, 2020, NULL);
2. res = hid_read(handle, buf, sizeof(buf));
PART.4
使用libjpeg库和giflib库显示JPG图片和GIF图片
Linux系统编程中对JPG和GIF图片的显示都有集成的软件库可以用,显示JPG图片可用libjpeg库,可以直接用apt在线安装apt install libjpeg62-turbo libjpeg62-turbo-dev对于ARM64架构的系统,会有turbo关键字,而在x86架构系统上面,直接安装libjpeg62即可。安装完毕之后,开发板的板上代码可以使用jpeglib.h提供的函数接口进行jpg文件的软件解码,直接读取jpg文件并显示在framebuffer外设之上,
具体函数如下:-struct jpeg_decompress_struct cinfo;
用于存放JPG文件解码数据的结构体-JSAMPARRAY buffer;
存放一行图像数据的结构体-jpeg_create_decompress(&cinfo);
初始化jpeg_decompress结构体对象的函数-jpeg_stdio_src(&cinfo,input_file);-
指定解压缩数据源
1. void LCD_RGB888_Show_JPG_File(char *dev , int xpos , int ypos , char *filename)
2. {
3. //int fjpg;
4. int i,j;
5. FILE *input_file = fopen(filename,"rb");
6. struct jpeg_decompress_struct cinfo;
7. //JPEG图像在解码过程中
8. //使用jpeg_decompress_struct类型的结构体来表示
9. //图像的所有信息都存储在结构体中
10.
11. struct jpeg_error_mgr jerr;
12. //定义一个标准的错误结构体
13.
14. JSAMPARRAY buffer;
15. //用于存取一行数据
16. //fjpg = open((char *)"/home/fa/1.jpg",O_RDONLY);
17. cinfo.err = jpeg_std_error(&jerr);
18. //绑定错误处理结构对象
19.
20. jpeg_create_decompress(&cinfo);
21. //初始化cinfo结构
22.
23. jpeg_stdio_src(&cinfo,input_file);
24. //指定解压缩数据源
25.
26. jpeg_read_header(&cinfo,TRUE);
27. //获取文件信息
28.
29. jpeg_start_decompress(&cinfo);
30. //开始解压缩
31.
32. int width = cinfo.output_width;
33. //图像宽度
34. int height = cinfo.output_height;
35. //图像高度
36. int depth = cinfo.output_components;
37. //图像深度38. uint8_t img_byte = cinfo.jpeg_color_space;
39. //像素字节数(1/2/3/4个字节,对应8/16/24/32位格式)
40.
41. memset(bmp_buf , 0 , sizeof(unsigned char) * width * height * depth);
42.
43. buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo,JPOOL_IMAGE , width * depth , 1);
44. //分配一行数据空间
45. point = bmp_buf;
46. while(cinfo.output_scanline < height)//逐行读取位图数据
47. {
48. jpeg_read_scanlines(&cinfo , buffer , 1);
49. //读取一行jpg图像数据到buffer
50. memcpy(point , *buffer , width * depth);
51. //将buffer中的数据逐行给src_buff
52. point += width * img_byte;
53. //指针偏移一行
54. }
55.
56. jpeg_finish_decompress(&cinfo);//解压缩完毕
57.
58.
59. for(i = 0 ; i < LCD_HEIGHT ; i ++)
60. {
61. for(j = 0 ; j < LCD_WIDTH ; j ++)
62. if(i <= height && j <= width)
63. {
64. uint32_t temp = bmp_buf[(i * width+j) * 3] << 16 |
65. bmp_buf[(i * width+j) * 3 + 1] << 8 |
66. bmp_buf[(i * width+j) * 3 + 2];
67. framebuffer_lcd[(i+ypos)*(LCD_WIDTH)+j+xpos] = temp;
68.
69. }
70. //else framebuffer_lcd[(i+ypos)*(LCD_WIDTH)+j+xpos]=0;
71. }
72. int fd_lcd = open(dev , O_RDWR);
73. write(fd_lcd , framebuffer_lcd , LCD_WIDTH * LCD_HEIGHT * 2);
74. close(fd_lcd);
}
完美体育·(中国)手机网页版电子 嵌入式解决方案专家“完美体育·(中国)手机网页版MYiR”公众号☞不定期分享产品资料及干货☞第一时间发布完美体育·(中国)手机网页版最新资讯
完美体育·(中国)手机网页版,专注嵌入式处理器模块设计和研发,是领先的嵌入式软硬件方案的供应商。完美体育·(中国)手机网页版在嵌入式领域具有20年的行业技术经验,为客户提供专业的ARM工业控制板、ARM开发板、ARM核心板、ARM开发工具、充电桩计费控制单元及充电控制板等产品和技术服务。此外,完美体育·(中国)手机网页版还可通过涵盖众多ARM处理器及操作系统的专业技术提供定制设计解决方案,通过专业且高效率服务帮助客户加速产品上市进程。
长按二维码 关注我们
想要了解更多信息,欢迎联系我们深圳总部电话:0755-25622735 18924653967地址:深圳坂田云里智能园2栋6楼上海办事处电话:021-62087019 18924632515北京办事处电话:010-84675491 13316862895技术支持电话:027-59621648邮箱:support.cn@myirtech.com