日前,米爾科技發布了關于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.phatcatt.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開發板可以去米爾官網查看具體的產品介紹:
http://www.phatcatt.com/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開發板可以去米爾官網查看具體的產品介紹:
http://www.phatcatt.com/product/mys-8mmx.htm
需要購買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