米爾MYS-8MMX開(kāi)發(fā)板試用體驗(yàn)測(cè)評(píng)
近期,米爾科技重磅發(fā)布新品“MYS-8MMX”開(kāi)發(fā)板,并在電子發(fā)燒友、電路城等各大論壇發(fā)布試用通知,受到了眾多工程師、廣大電子愛(ài)好者圍觀,米爾選取了電子發(fā)燒友平臺(tái)一篇優(yōu)秀試用報(bào)告,在此同步給各位小伙伴們。由于篇幅原因:該文章中使用libjpeg庫(kù)和giflib庫(kù)顯示JPG圖片和GIF圖片 該測(cè)評(píng)不一一展示了,想了解具體內(nèi)容可以復(fù)制該鏈接查看:https://bbs.elecfans.com/jishu_2154638_1_1.htmlPART.1
開(kāi)箱上電&系統(tǒng)燒錄&文件系統(tǒng)移植&WIFI模塊驅(qū)動(dòng)加載
米爾MYS-8MMX開(kāi)發(fā)板支持兩種系統(tǒng)啟動(dòng)方式,兩種燒錄方式,兩種系統(tǒng)啟動(dòng)方式為SD卡啟動(dòng)或板上EMMC啟動(dòng),兩種燒錄方式為卡刷和線刷,其中卡刷又分為SD卡啟動(dòng)和SD卡燒寫(xiě)EMMC,SD卡啟動(dòng)是開(kāi)發(fā)者常用系統(tǒng)啟動(dòng)模式,因?yàn)榭梢噪S時(shí)在遠(yuǎn)端主機(jī)上對(duì)SD卡文件進(jìn)行增刪查改;而產(chǎn)品項(xiàng)目中則常用SD卡燒寫(xiě)EMMC的方式,因?yàn)椴僮骱?jiǎn)單,反饋清晰(只需要一盞LED燈即可監(jiān)控燒錄是否完成)。實(shí)際上,SD卡啟動(dòng)還有一種用途就是可以在SD卡的系統(tǒng)中對(duì)EMMC內(nèi)容進(jìn)行修改,因此是最適合開(kāi)發(fā)者的模式。若無(wú)特別說(shuō)明,本次帖子及今后帖子我都在SD卡的系統(tǒng)中進(jìn)行開(kāi)發(fā)。要制作SD啟動(dòng)卡,需要按照使用手冊(cè)獲取SD卡啟動(dòng)鏡像,名為myir-image-full-mys-8mmx.wic,與手冊(cè)所寫(xiě)myir-image-full-mys-8mmx.sdcard不符:?使用Win32DiskImager或別的燒錄工具進(jìn)行燒錄即可。燒錄完畢后,SD卡會(huì)分為三個(gè)部分,最前面8MB為預(yù)留空間不做分區(qū),中間89MB為FAT分區(qū)存放BOOT.bin/內(nèi)核文件/設(shè)備樹(shù)dtb文件,后面的EXT分區(qū),其中后面的EXT分區(qū)為開(kāi)發(fā)者可以自由操作的分區(qū),可對(duì)此分區(qū)進(jìn)行分割,合并,擴(kuò)容,刪除等,一般有基礎(chǔ)的開(kāi)發(fā)者會(huì)將該分區(qū)的廠家出廠文件系統(tǒng)做備份然后刪除,擴(kuò)容并替換為自己的文件系統(tǒng)分區(qū),文件系統(tǒng)發(fā)行版為Ubuntu/Debian/Centos/Redhat/ARMbian等,根據(jù)個(gè)人喜好而定,這么做的好處是,不影響內(nèi)核驅(qū)動(dòng)開(kāi)發(fā)的版本兼容問(wèn)題,并且能按照個(gè)人意愿自選安裝各種第三方軟件,如桌面運(yùn)行擴(kuò)展,x11擴(kuò)展,網(wǎng)絡(luò)擴(kuò)展等,而我為了方便使用apt插件安裝各種軟件,選擇的文件系統(tǒng)發(fā)行版依然為之前一直沿用的Debian 10 for arm64,?該文件系統(tǒng)發(fā)行版可用在所有arm64架構(gòu)開(kāi)發(fā)板上:搭建文件系統(tǒng)的帖子我之前發(fā)表過(guò),可參考此帖:https://bbs.elecfans.com/jishu_2030659_1_1.html替換完畢后,啟動(dòng)系統(tǒng),查看CPU信息和運(yùn)行內(nèi)存信息:??CPU為IMX8mini,四核A53,內(nèi)存2GB。替換文件系統(tǒng)后,需要移植/lib/modules內(nèi)核驅(qū)動(dòng)目錄,以便開(kāi)機(jī)時(shí)由內(nèi)核文件正確加載各個(gè)ko文件:?正確加載/usr/lib/modules/5.4.3-2.0.0+gbed0791/kernel/drivers/net/wireless/bcmdhd/bcmdhd.ko文件后,板載WIFI模塊便可正常使用:?1.ifconfig wlan02.nmcli dev wifi?PART.2
QT開(kāi)發(fā)板本地開(kāi)發(fā)framebuffer&x11vnc的妙用
安裝QT開(kāi)發(fā)環(huán)境,即QT creator和QT5軟件庫(kù):1.apt install qt5-default qtcreator安裝x11界面遠(yuǎn)程登錄軟件x11vnc1.apt install x11vnc在進(jìn)行QT開(kāi)發(fā)之前,我先用vnc工具實(shí)時(shí)映射板子HDMI輸出的界面,即/dev/fb0:1.x11vnc -rawfb /dev/fb0 -clip 1920x1080??至于啟動(dòng)QT環(huán)境開(kāi)發(fā)的方式有兩種,第一種是使用SSH遠(yuǎn)程代碼調(diào)試軟件如VSCode,SourceInsight等,通過(guò)SSH方式登錄到板子上,另外一種方法則是直接在板子的MobaXterm SSH終端啟動(dòng)QT creator:?我個(gè)人傾向于兩種方式結(jié)合使用,在不同的開(kāi)發(fā)場(chǎng)合下使用不同方式。QT creator默認(rèn)配置編譯環(huán)境gcc:QT下操作framebuffer外設(shè)顯示一行文字: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. else16. 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下操作文件字符設(shè)備與普通系統(tǒng)編程并沒(méi)有明顯區(qū)別,唯一不同的是,QT下使用文件關(guān)閉函數(shù)需要添加雙冒號(hào)::close(),防止與QT自帶的close()函數(shù)產(chǎn)生沖突。在mainwindow類任意位置打開(kāi)/dev/fb0外設(shè)后,即可進(jìn)行ASCII碼符號(hào)的顯示: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);非常簡(jiǎn)單愉快就玩成了,看看x11vnc遠(yuǎn)程終端顯示效果,這也就是HDMI實(shí)際顯示是輸出內(nèi)容:?當(dāng)然了,如果不設(shè)置環(huán)境變量QT_QPA_PLATFORM的話,x11終端下啟動(dòng)的x11應(yīng)用就會(huì)在遠(yuǎn)程機(jī)器上直接顯示(遠(yuǎn)程機(jī)器就是我的電腦):?設(shè)置QT_QPA_PLATFORM之后,可以將啟動(dòng)界面映射到任意framebuffer外設(shè)上:1.export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0?PART.3
編譯內(nèi)核鏡像&與USBHID設(shè)備通信
如果想用一種簡(jiǎn)單的方式控制更多外設(shè)的話,除了添加擴(kuò)展芯片,還有一種項(xiàng)目上用得比較多的方式是USBHID通信,將開(kāi)發(fā)板作為主機(jī),通過(guò)USB接口與支持USBHID協(xié)議的從機(jī)進(jìn)行通信,這個(gè)方法非常簡(jiǎn)單,剛?cè)腴T(mén)嵌入式的小白也必須熟練掌握,只需要應(yīng)用層開(kāi)發(fā)的知識(shí)和皮毛的驅(qū)動(dòng)層開(kāi)發(fā)知識(shí)。要想使用這種方式進(jìn)行通信,板子的內(nèi)核鏡像就必須支持USBHID設(shè)備的檢測(cè)與讀寫(xiě),檢測(cè)是沒(méi)什么問(wèn)題的,但是能不能映射到設(shè)備文件,供開(kāi)發(fā)者進(jìn)行讀寫(xiě)操作,那就需要檢查內(nèi)核編譯選項(xiàng)了,這里剛好是比較壞的一種情況,米爾廠家出廠鏡像是沒(méi)有打開(kāi)USBHID通信的,必須讓開(kāi)發(fā)者重新編譯內(nèi)核鏡像,那么這里就涉及到內(nèi)核編譯的知識(shí)了:下載并解壓內(nèi)核源碼鏡像:1.https://github.com/MYiR-Dev/myir-imx-uboot.git?編譯選項(xiàng)采用米爾MYS-8MMX開(kāi)發(fā)板的編譯選項(xiàng)mys_iot_defconfig:1./home/myir-imx-linux-develop/arch/ARM64/configs/2.make mys_iot_defconfig?這邊還需要注意的是內(nèi)核鏡像的版本與使用內(nèi)核源碼編譯第三方驅(qū)動(dòng)ko文件的版本必須相同,在內(nèi)核源碼一級(jí)目錄處可以找到配置的位置:??使用menuconfig打開(kāi)內(nèi)核編譯選項(xiàng), Device Drivers > HID support的 /dev/hidraw raw HID device support選項(xiàng)要打開(kāi),或者是在配置文件中添加此項(xiàng)配置的環(huán)境變量:??配置完畢之后,替換Image內(nèi)核文件覆蓋出廠內(nèi)核文件:1.mount /dev/mmcblk1p1 /media2.mmcblk1是開(kāi)發(fā)板的SD卡,mmcblk1p1是SD卡的FAT分區(qū),存放內(nèi)核文件的位置:?重新啟動(dòng)之后,將USBHID設(shè)備插到板子的USB接口:?在/dev目錄下找到/dev/hidraw設(shè)備:安裝-ludev軟件庫(kù):?1.apt install udev使用代碼讀寫(xiě)HID設(shè)備:1.handle = hid_open(2020, 2020, NULL);2.res = hid_read(handle, buf, sizeof(buf));?PART.4
使用libjpeg庫(kù)和giflib庫(kù)顯示JPG圖片和GIF圖片
Linux系統(tǒng)編程中對(duì)JPG和GIF圖片的顯示都有集成的軟件庫(kù)可以用,顯示JPG圖片可用libjpeg庫(kù),可以直接用apt在線安裝apt install libjpeg62-turbo libjpeg62-turbo-dev對(duì)于ARM64架構(gòu)的系統(tǒng),會(huì)有turbo關(guān)鍵字,而在x86架構(gòu)系統(tǒng)上面,直接安裝libjpeg62即可。安裝完畢之后,開(kāi)發(fā)板的板上代碼可以使用jpeglib.h提供的函數(shù)接口進(jìn)行jpg文件的軟件解碼,直接讀取jpg文件并顯示在framebuffer外設(shè)之上,具體函數(shù)如下:-struct jpeg_decompress_struct cinfo;用于存放JPG文件解碼數(shù)據(jù)的結(jié)構(gòu)體-JSAMPARRAY buffer;存放一行圖像數(shù)據(jù)的結(jié)構(gòu)體-jpeg_create_decompress(&cinfo);初始化jpeg_decompress結(jié)構(gòu)體對(duì)象的函數(shù)-jpeg_stdio_src(&cinfo,input_file);-指定解壓縮數(shù)據(jù)源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圖像在解碼過(guò)程中8. //使用jpeg_decompress_struct類型的結(jié)構(gòu)體來(lái)表示9. //圖像的所有信息都存儲(chǔ)在結(jié)構(gòu)體中10.11. struct jpeg_error_mgr jerr;12. //定義一個(gè)標(biāo)準(zhǔn)的錯(cuò)誤結(jié)構(gòu)體13.14. JSAMPARRAY buffer;15. //用于存取一行數(shù)據(jù)16. //fjpg = open((char *)"/home/fa/1.jpg",O_RDONLY);17. cinfo.err = jpeg_std_error(&jerr);18. //綁定錯(cuò)誤處理結(jié)構(gòu)對(duì)象19.20. jpeg_create_decompress(&cinfo);21. //初始化cinfo結(jié)構(gòu)22.23. jpeg_stdio_src(&cinfo,input_file);24. //指定解壓縮數(shù)據(jù)源25.26. jpeg_read_header(&cinfo,TRUE);27. //獲取文件信息28.29. jpeg_start_decompress(&cinfo);30. //開(kāi)始解壓縮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. //像素字節(jié)數(shù)(1/2/3/4個(gè)字節(jié),對(duì)應(yīng)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. //分配一行數(shù)據(jù)空間45. point = bmp_buf;46. while(cinfo.output_scanline < height)//逐行讀取位圖數(shù)據(jù)47. {48. jpeg_read_scanlines(&cinfo , buffer , 1);49. //讀取一行jpg圖像數(shù)據(jù)到buffer50. memcpy(point , *buffer , width * depth);51. //將buffer中的數(shù)據(jù)逐行給src_buff52. 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”公眾號(hào)?不定期分享產(chǎn)品資料及干貨?第一時(shí)間發(fā)布米爾最新資訊原文標(biāo)題:米爾MYS-8MMX開(kāi)發(fā)板試用體驗(yàn)測(cè)評(píng)——donatello1996
文章出處:【微信公眾號(hào):米爾MYiR】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
測(cè)評(píng)
+關(guān)注
關(guān)注
0文章
42瀏覽量
3098
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論