描述
本文来源电子发烧友社区,作者:李先生, 帖子地址:https://bbs.elecfans.com/jishu_2286690_1_1.html
前言
本文介绍使用framebuffer进行hdmi的显示输出测试。为后续的图形界面的移植(比如LVGL)做好准备。
前提是已经了解应用程序的开发流程,见https://bbs.elecfans.com/jishu_2286643_1_1.html。
编写代码
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
-
int main(int argc, char *argv[])
-
{
-
int fd = -1;
-
int ret = -1;
-
uint8_t *p_fb = 0;
-
struct fb_fix_screeninfo finfo;
-
struct fb_var_screeninfo vinfo;
-
memset(&finfo,0,sizeof(finfo));
-
memset(&vinfo,0,sizeof(vinfo));
-
-
/* 打开设备 */
-
fd = open(argv[1],O_RDWR);
-
if(fd < 0)
-
{
-
fprintf(stderr,"open %s err, %sn",argv[1],strerror(errno));
-
return -1;
-
}
-
-
/* 获取设备信息 */
-
ret = ioctl(fd, FBIOGET_FSCREENINFO, &finfo);
-
if(ret < 0)
-
{
-
fprintf(stderr,"ioctl finfo err, %sn",strerror(errno));
-
close(fd);
-
return -1;
-
}
-
ret = ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);
-
if(ret < 0)
-
{
-
fprintf(stderr,"ioctl vinfo err, %sn",strerror(errno));
-
close(fd);
-
return -1;
-
}
-
-
/* mmap 这里假设bits_per_pixel为32位, 所以p_fb定义为unsigned int *p_fb, 写buffer也是按照unsigned int 写, 实际应该根据bits_per_pixel大小进行读写 */
-
unsigned long len = vinfo.xres_virtual * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;
-
p_fb = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-
if(p_fb == NULL)
-
{
-
fprintf(stderr,"mmap len %ld errn",len);
-
close(fd);
-
return -1;
-
}
-
fprintf(stderr,"x = %d y = %d bits = %d len = %ldn",vinfo.xres_virtual,vinfo.yres_virtual,vinfo.bits_per_pixel,len);
-
volatile int times = 30;
-
while(times--)
-
{
-
if(vinfo.bits_per_pixel == 16)
-
{
-
for(unsigned int i=0; i< len/2; )
-
{
-
*((uint16_t*)(p_fb + i)) = 0xF800;
-
i+=2;
-
}
-
usleep(atoi(argv[2])*1000);
-
for(unsigned int i=0; i< len/2;)
-
{
-
*((uint16_t*)(p_fb + i)) = 0x07E0;
-
i+=2;
-
}
-
usleep(atoi(argv[2])*1000);
-
for(unsigned int i=0; i< len/2;)
-
{
-
*((uint16_t*)(p_fb + i)) = 0x001F;
-
i+=2;
-
}
-
usleep(atoi(argv[2])*1000);
-
}
-
else
-
{
-
for(unsigned int i=0; i< len/4; )
-
{
-
*((uint32_t*)(p_fb + i)) = 0xFF0000;
-
i+=4;
-
}
-
usleep(atoi(argv[2])*1000);
-
for(unsigned int i=0; i< len/4;)
-
{
-
*((uint32_t*)(p_fb + i)) = 0x00FF00;
-
i+=4;
-
}
-
usleep(atoi(argv[2])*1000);
-
for(unsigned int i=0; i< len/4;)
-
{
-
*((uint32_t*)(p_fb + i)) = 0x0000FF;
-
i+=4;
-
}
-
usleep(atoi(argv[2])*1000);
-
}
-
}
-
munmap(p_fb,len);
-
close(fd);
-
-
return 0;
-
}
复制代码
导入代码到开发板
见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回车。
查看效果
总结开发板运行了桌面系统自带编译环境,所以不需要交叉编译,开发起来比较方便。
sudo init 3切换到命令行模式
sudo init 5切换到桌面模式
打开APP阅读更多精彩内容