米爾MYS-8MMX開發板試用體驗測評——donatello1996
文章來源: 發布日期:2021.9.15 瀏覽次數:3181 次 |
米爾MYS-8MMX開發板試用體驗測評
近期,米爾科技重磅發布新品“MYS-8MMX”開發板,并在電子發燒友、電路城等各大論壇發布試用通知,受到了眾多工程師、廣大電子愛好者圍觀,米爾選取了電子發燒友平臺一篇優秀試用報告,在此同步給各位小伙伴們。由于篇幅原因:該文章中使用libjpeg庫和giflib庫顯示JPG圖片和GIF圖片 該測評不一一展示了,想了解具體內容可以復制該鏈接查看:https://bbs.elecfans.com/jishu_2154638_1_1.html
想要了解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
QT開發板本地開發framebuffer&x11vnc的妙用




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