linux系统操作显存基础知识了解

设备文件是在/dev/目录下
设备文件有主设备号,次设备号.
当操作设备文件, 系统会根据设备文件的设备号找到相应的设备驱动(驱动在内核注册时已指定使用的设备号),并调用相应的功能.
  open ---> sys ----> driver ---> drv_open
  read ---> sys ----> driver ---> drv_read
  ioctl --> sys ----> driver ---> drv_ioctl
    
//

一幅图由很多行数据, 每行由很多个像素点组成.
    800x600: 表示600行, 每行800个像素点
    1024x768

    1024x768x16: 表示共有768行, 每行1024个像素点, 每个像素点的数据占用16位
        rgb565
    1024x768x24: 表示共有768行, 每行1024个像素点, 每个像素点的数据占用24位
        rgb888
    1024x768x32: 表示共有768行, 每行1024个像素点, 每个像素点的数据占用32位
        argb8888   a:透明度


每个像素点表示一个顔色, 一个顔色由三基色(Red, Green, Blue)组成. 也就是说一个像素点的数据位里包含有R多少, G/B各是多少的信息. R,G, B各占用不同的几位来表示

256色:表示共有256种顔色, 每个像素点数据占用一个字节(8位).
      首先把图里使用频率最高的256种顔色做成一个顔色表(每种顔色还是RGB888), 每个像素点的数据不是记录RGB的数据, 而是记录对应顔色表里的索引号

每个像素点占16bit(16位色):
RGB1555:  RGB各占用5bit, 1bit可用于表示透明
RGB565:   R占用高5位(11-15, G占用6位(5--10), B占用5位(0-4)

每个像素点占24bit(24位色):
RGB888:   RGB各用8位

每个像素点占32bit(32位色):
RGB8888:  RGB各占用8位, 最高8位用于透明度的表示


linux系统下, 没有LCD驱动. 对应的驱动应叫framebuffer驱动(显存).
驱动好后, 对应设备文件应是/dev/fb*

显存: 就是在内存里分出一个区域,专用于画出要显示的图像(如窗口系统等). 而LCD的显示是由DMA控制器自动从这个区域里把RGB数据搬到LCD控制器里显示的

DMA控制器:就是数据的搬运工, 只要设好从哪里搬,搬到哪里去. 就可以自动循环工作.


我们要显示一个图片或一个窗口,只需要改变显存里的数据就可以了

//

struct fb_info 的一个对象表示一个framebuffer设备

struct fb_info结构体成员比较多, 最起码需要初始化下面列出的几个成员:

struct fb_info fbi {
    ...
    struct fb_var_screeninfo var;   /* Current var */ 
    struct fb_fix_screeninfo fix;   /* Current fix */ 
    ...
    struct fb_ops *fbops;
    char __iomem *screen_base;  /* Virtual address */
    unsigned long screen_size;  /* Amount of ioremapped VRAM or 0 */ 
    void *pseudo_palette;       /* Fake palette of 16 colors    
    ....
};

struct fb_var_screeninfo {
    __u32 xres;         /* visible resolution       */
    __u32 yres;
    __u32 xres_virtual;     /* virtual resolution       */
    __u32 yres_virtual;
    __u32 bits_per_pixel;       /* guess what           */

    struct fb_bitfield red;     /* bitfield in fb mem if true color, */
    struct fb_bitfield green;   /* else only length is significant */
    struct fb_bitfield blue;
    struct fb_bitfield transp;  /* transparency 
    ....
}

struct fb_fix_screeninfo {
    char id[16];            /* identification string eg "TT Builtin" */
    unsigned long smem_start;   /* Start of frame buffer mem */
                    /* (physical address) */
    __u32 smem_len;         /* Length of frame buffer mem */
    __u32 type;         /* see FB_TYPE_*        */
    __u32 visual;           /* see FB_VISUAL_*      */ 
    __u32 line_length;      /* length of a line in bytes    */ bit
    ....
}


ioctl函数用于从驱动里获取相应的配置信息; 或者把配置信息传递给驱动,让驱动根据相应的配置信息来设置硬件


int ioctl(int fd, int request, ...); //返回值为0表示执行成功,-1表示执行失败
    fd表示打开设备文件获取到的文件描述符
    request表示告诉驱动需要做什么操作. 具体的值是由驱动与应用程序约定好的
    ...不定参数.

man 2 ioctl_list //查看系统里常用的ioctl命令

tes1:

struct fb_fix_screeninfo finfo;
ioctl(fd, FBIOGET_FSCREENINFO, &finfo) 

printf("id = %s\n", finfo.id);
printf("line length = %d\n", finfo.line_length);	

结果:
id = svgadrmfb
line length = 5120  //1280*4

test2:

struct fb_var_screeninfo vinfo;
ioctl(fd, FBIOGET_VSCREENINFO, &vinfo);  

  printf("x = %d, y = %d\n", vinfo.xres, vinfo.yres);  
  printf("bits_per_pixel = %d\n", vinfo.bits_per_pixel);
  printf("red : offset = %d, length = %d\n", vinfo.red.offset, vinfo.red.length);    
  printf("green : offset = %d, length = %d\n", vinfo.green.offset, vinfo.green.length);    
  printf("blue : offset = %d, length = %d\n", vinfo.blue.offset, vinfo.blue.length);    
  printf("transp : offset = %d, length = %d\n", vinfo.transp.offset, vinfo.transp.length);

tetst2结果:

x = 1280, y = 768
bits_per_pixel = 32
red : offset = 16, length = 8
green : offset = 8, length = 8
blue : offset = 0, length = 8
transp : offset = 0, length = 0


///
bmp文件里面除了256色的文件外,  里面每个像素存放的都是RGB数据和一个文件头.

24bit的bmp文件大小:  文件头54字节+分辨率*3字节每个像素

注意:bmp文件里存放的图片数据是反着的, 要正确显示,需要把图中的第0行放到显存里的最后一行, 图里的第一行放到显存里的倒数第一行, 图里的第二行放到屏的倒数第二行....   
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值