framebuffer使用是基于底层的技术,可以锻炼自己的代码编写能力。
基于用户层的调用、、、、、、
framebuffer是一个帧缓冲区,来驱动Linux底层下的视频输出设备。概而言之,framebuffer是显示内存的一个映像,将其映像映射到用户空间之后,用户就可以对其进行读写操作,从而将数据显示在你的屏幕上,而个人PC上,是在纯终端下才是可以看到的。
实现过程:
1、open("dev/fb0",O_RDWR); //第一步打开fb设备文件
2、ioctl
int ioctl(int d, int request, ...); //获得屏幕分辨率及其各个参数的信息
向底层驱动去写发送命令
参数1:
d:打开的文件描述符(open的返回值)
request:VSCREENINFO<linux/fb.h> //文件中定义屏幕相关的宏
第三参数:你定义的结构体的地址struct fb_var_screeninfo
3、mmap
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
//映射共享内存 返回显存空间首地址
参数1:addr :内核分配地址,NULL随机分配
2.length:申请字节长度
3.port:port_read | port_write端口权限
4.flags:MAP_SHARED共享
4.文件描述符
5.偏移量
/* 存放显存空间地址信息 */
RGB_ADDRESS_T gRgbInfo;
/* 存放屏幕信息 */
struct fb_var_screeninfo CurScreenInfo;
/********************************************
*函数名:FrameBuffInit
*功 能:初始化Framebuff显存
*参 数:
* pDevName:FrameBuff设备名称
*返回值:
* 成功返回 显存空间首地址
* 失败返回 NULL
*注意事项:
* 注意当前平台具体为RGB565标准还是RGB888标准
*******************************************/
RGB_ADDRESS_T *FrameBuffInit(const char *pDevName)
{
int Fd = 0;
int Ret = 0;
void *pTmp = NULL;
/* 打开设备 */
Fd = open(pDevName, O_RDWR);
if (-1 == Fd)
{
perror("fail to open");
return NULL;
}
/* 获得屏幕分辨率及像素点所占字节等参数信息 */
Ret = ioctl(Fd, FBIOGET_VSCREENINFO, &CurScreenInfo);//FBIOGET_VSCREENINFO获得屏幕分辨率信息
if (-1 == Ret)
{
perror("fail to ioctl");
return NULL;
}
/* 打印提示 */
printf("=================== Current Screen Resolution =====================\n");
printf("X: %d\n", CurScreenInfo.xres_virtual);
printf("Y: %d\n", CurScreenInfo.yres_virtual);
printf("OnePixelBits: %d bits, %d bytes\n", CurScreenInfo.bits_per_pixel, CurScreenInfo.bits_per_pixel / 8);
printf("----------------------------------------------------\n");
if (2 == CurScreenInfo.bits_per_pixel / 8)
{
gRgbInfo.Format = RGB565FORMAT;
printf("NOTICE: This Board FrameBuff Standard RGB565!!!\n");
}
else if (4 == CurScreenInfo.bits_per_pixel / 8)
{
gRgbInfo.Format = RGB888FORMAT;
printf("NOTICE: This Board FrameBuff Standard RGB888!!!\n");
}
/* 映射内核显存空间 */
pTmp = mmap(NULL, CurScreenInfo.xres_virtual * CurScreenInfo.yres_virtual * CurScreenInfo.bits_per_pixel / 8, PROT_READ | PROT_WRITE, MAP_SHARED, Fd, 0);
if ((void *)-1 == pTmp)
{
perror("fail to mmap");
return NULL;
}
if (gRgbInfo.Format == RGB565FORMAT)
{
gRgbInfo.pRGB565Address = pTmp;
}
else if (gRgbInfo.Format == RGB888FORMAT)
{
gRgbInfo.pRGB888Address = pTmp;
}
return &gRgbInfo;
}