【赛昉科技昉·星光RISC-V单板计算机试用体验】基于framebuffer的hdmi显示测试

描述

本文来源电子发烧友社区,作者:李先生, 帖子地址:https://bbs.elecfans.com/jishu_2286690_1_1.html


前言


    本文介绍使用framebuffer进行hdmi的显示输出测试。为后续的图形界面的移植(比如LVGL)做好准备。
前提是已经了解应用程序的开发流程,https://bbs.elecfans.com/jishu_2286643_1_1.html
 
编写代码


  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11.  
  12. int main(int argc, char *argv[])
  13. {
  14.     int fd = -1;
  15.     int ret = -1;
  16.     uint8_t *p_fb = 0;
  17.     struct fb_fix_screeninfo finfo;
  18.     struct fb_var_screeninfo vinfo;
  19.     memset(&finfo,0,sizeof(finfo));
  20.     memset(&vinfo,0,sizeof(vinfo));
  21.  
  22.     /* 打开设备 */
  23.     fd = open(argv[1],O_RDWR);
  24.     if(fd < 0)
  25.     {
  26.         fprintf(stderr,"open %s err, %sn",argv[1],strerror(errno));
  27.         return -1;
  28.     }
  29.  
  30.     /* 获取设备信息 */
  31.     ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
  32.     if(ret < 0)
  33.     {
  34.         fprintf(stderr,"ioctl finfo err, %sn",strerror(errno));
  35.         close(fd);
  36.         return -1;
  37.     }
  38.     ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
  39.     if(ret < 0)
  40.     {
  41.         fprintf(stderr,"ioctl vinfo err, %sn",strerror(errno));
  42.         close(fd);
  43.         return -1;
  44.     }
  45.  
  46.     /* mmap 这里假设bits_per_pixel为32位, 所以p_fb定义为unsigned int *p_fb, 写buffer也是按照unsigned int 写, 实际应该根据bits_per_pixel大小进行读写 */
  47.     unsigned long len = vinfo.xres_virtual  * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;
  48.     p_fb = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  49.     if(p_fb == NULL)
  50.     {
  51.         fprintf(stderr,"mmap len %ld errn",len);
  52.         close(fd);
  53.         return -1;
  54.     }
  55.     fprintf(stderr,"x = %d y = %d bits = %d len = %ldn",vinfo.xres_virtual,vinfo.yres_virtual,vinfo.bits_per_pixel,len);
  56.     volatile int times = 30;
  57.     while(times--)
  58.     {
  59.         if(vinfo.bits_per_pixel == 16)
  60.         {
  61.             for(unsigned int i=0; i< len/2; )
  62.             {
  63.                 *((uint16_t*)(p_fb + i)) = 0xF800;
  64.                 i+=2;
  65.             }
  66.             usleep(atoi(argv[2])*1000);
  67.             for(unsigned int i=0; i< len/2;)
  68.             {
  69.                 *((uint16_t*)(p_fb + i)) = 0x07E0;
  70.                 i+=2;
  71.             }
  72.             usleep(atoi(argv[2])*1000);
  73.             for(unsigned int i=0; i< len/2;)
  74.             {
  75.                 *((uint16_t*)(p_fb + i)) = 0x001F;
  76.                 i+=2;
  77.             }
  78.             usleep(atoi(argv[2])*1000);
  79.         }
  80.         else
  81.         {
  82.             for(unsigned int i=0; i< len/4; )
  83.             {
  84.                 *((uint32_t*)(p_fb + i)) = 0xFF0000;
  85.                 i+=4;
  86.             }
  87.             usleep(atoi(argv[2])*1000);
  88.             for(unsigned int i=0; i< len/4;)
  89.             {
  90.                 *((uint32_t*)(p_fb + i)) = 0x00FF00;
  91.                 i+=4;
  92.             }
  93.             usleep(atoi(argv[2])*1000);
  94.             for(unsigned int i=0; i< len/4;)
  95.             {
  96.                 *((uint32_t*)(p_fb + i)) = 0x0000FF;
  97.                 i+=4;
  98.             }
  99.             usleep(atoi(argv[2])*1000);
  100.         }
  101.     }
  102.     munmap(p_fb,len);
  103.     close(fd);
  104.    
  105.     return 0;
  106. }
复制代码


 
导入代码到开发板

https://bbs.elecfans.com/jishu_2286643_1_1.html,使用rz导入不再赘述。
 
编译

gcc framebuffer.c -o framebuffer 回车
 
运行

关闭桌面系统,否则桌面系统在显示,framebufer无法显示。
输入sudo init 3 回车 提示输入密码时输入starfive回车。
 
用鼠标键盘
输入用户名riscv        
密码 starfive登录
 
输入
sudo ./framebuffer /dev/fb 1000
提示输入密码时输入starfive回车。
 
查看效果
 
RISC-V
RISC-V
 






RISC-V
 
 
总结

开发板运行了桌面系统自带编译环境,所以不需要交叉编译,开发起来比较方便。
sudo init 3切换到命令行模式
sudo init 5切换到桌面模式

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分