完美体育·(中国)手机网页版MYS-8MMX开发板试用体验测评——donatello1996
文章来源: 发布日期:2021.9.15 浏览次数:5365 次 |
完美体育·(中国)手机网页版MYS-8MMX开发板试用体验测评
近期,完美体育·(中国)手机网页版科技重磅发布新品“MYS-8MMX”开发板,并在电子发烧友、电路城等各大论坛发布试用通知,受到了众多工程师、广大电子爱好者围观,完美体育·(中国)手机网页版选取了电子发烧友平台一篇优秀试用报告,在此同步给各位小伙伴们。由于篇幅原因:该文章中使用libjpeg库和giflib库显示JPG图片和GIF图片 该测评不一一展示了,想了解具体内容可以复制该链接查看:https://bbs.elecfans.com/jishu_2154638_1_1.html
想要了解MYS-8MMX开发板可以去完美体育·(中国)手机网页版官网查看具体的产品介绍:
需要购买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