⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framebuff.c

📁 周立功magic2410实验箱源码 第6章Linux高级实验(part2) 6.9 IDE硬盘实验. 6.10 USB主机驱动编译与加载实验 6.11 U盘驱动程序编译与使用实验 6.12
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: framebuff.c
** Last modified Date: 2006-01-14 
** Last Version: v1.0
** Description: Linxu系统下Fram Buffer应用程序。
** Note: 
**------------------------------------------------------------------------------------------------------
** Created By: 周立山
** Created date: 2006-01-01 
** Version: v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>

int main()
{
    int fbfd = 0;
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    struct fb_cmap cmapinfo;
    long int screensize = 0;
    char *fbp = 0;
    int x = 0, y = 0;
    long int location = 0;
		int b,g,r;
    // Open the file for reading and writing
    fbfd = open("/dev/fb0", O_RDWR);					// 打开Frame Buffer设备
    if (fbfd < 0) {
				printf("Error: cannot open framebuffer device.%x\n",fbfd);
				exit(1);
    }
    printf("The framebuffer device was opened successfully.\n");

    // Get fixed screen information
    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {			// 获取设备固有信息
				printf("Error reading fixed information.\n");
				exit(2);
    }
		printf(finfo.id);
    printf("\ntype:0x%x\n", finfo.type );							// FrameBuffer 类型,如0为象素
    printf("visual:%d\n", finfo.visual );						// 视觉类型:如真彩2,伪彩3 
    printf("line_length:%d\n", finfo.line_length );		// 每行长度
    printf("\nsmem_start:0x%x,smem_len:%d\n", finfo.smem_start, finfo.smem_len ); // 映象RAM的参数
    printf("mmio_start:0x%x ,mmio_len:%d\n", finfo.mmio_start, finfo.mmio_len );
    
    // Get variable screen information
    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {			// 获取设备可变信息
				printf("Error reading variable information.\n");
				exit(3);
    }
    printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel );
    // Figure out the size of the screen in bytes
    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;
    // Map the device to memory
    fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED,
		       fbfd, 0);
    if ((int)fbp == -1) {
				printf("Error: failed to map framebuffer device to memory.\n");
				exit(4);
    }
    printf("The framebuffer device was mapped to memory successfully.\n");

    vinfo.xoffset = (640-420)/2; 
    vinfo.yoffset = (480-340)/2;       // Where we are going to put the pixel
		 b = 10;
		 g = 100;     // A little green
		 r = 100;    // A lot of red
    // Figure out where in memory to put the pixel
    for ( y = 0; y < 340; y++ )				// 行扫描
		for ( x = 0; x < 420; x++ ) {			// 列扫描
	
		    location = (x+vinfo.xoffset) * (vinfo.bits_per_pixel/8) +	// 定位
			       (y+vinfo.yoffset) * finfo.line_length;
	
		    if ( vinfo.bits_per_pixel == 32 ) {		//		
						*(fbp + location) = b;            // Some blue
						*(fbp + location + 1) = g;   			// A little green
						*(fbp + location + 2) = r;  			// A lot of red
						*(fbp + location + 3) = 0;      	// No transparency
		    } else  { 														//assume 16bpp
	
						unsigned short int t = r<<11 | g << 5 | b;
						*((unsigned short int*)(fbp + location)) = t;
		    }
	
		}
    munmap(fbp, screensize);
    close(fbfd);
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -