真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

嵌入式LinuxFramebuffer怎么描點(diǎn)畫線

這篇文章主要講解了“嵌入式Linux Framebuffer怎么描點(diǎn)畫線”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“嵌入式Linux Framebuffer怎么描點(diǎn)畫線”吧!

錦屏網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

Framebuffer顧名思義,Frame是幀的意思,buffer是緩沖區(qū)的。Framebuffer中保存著每一幀圖像的每一個(gè)像素的顏色值。

LCD操作原理

  • 驅(qū)動(dòng)程序設(shè)置好LCD控制器

    • 根據(jù)LCD參數(shù)設(shè)置LCD控制器的時(shí)序,信號(hào)極性

    • 根據(jù)LCD分辨率,BPP分配Framebuffer

  • APP通過ioctl獲取LCD的分辨率,BPP等參數(shù)

  • APP通過mmap映射Framebuffer,在Framebuffer中寫入數(shù)據(jù)。 嵌入式Linux Framebuffer怎么描點(diǎn)畫線 從上圖可以看到Framebuffer和LCD的可顯示區(qū)域是一一對(duì)應(yīng)的。使用Framebuffer顯示實(shí)際就是向Framebuffer寫入每個(gè)像素點(diǎn)的顏色數(shù)據(jù)。LCD的像素點(diǎn)的坐標(biāo)與Framebuffer中的位置關(guān)系如下圖 嵌入式Linux Framebuffer怎么描點(diǎn)畫線

給出任意屏幕坐標(biāo)(x,y),以及Framebuffer的基地址fb_base.另外LCD的分辨率是Xres x Yres,表示單個(gè)像素顏色的二進(jìn)制位數(shù)bpp。則其顏色數(shù)據(jù)在framebuffer中的地址是:

(x,y)像素起始地址=fb_base + (y*Xres+x)*bpp/8

像素顏色表示

嵌入式Linux Framebuffer怎么描點(diǎn)畫線

示例代碼

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
static int fd_fb;
static struct fb_var_screeninfo var;	/* Current var */
static int screen_size;					/* 一幀數(shù)據(jù)所占用的字節(jié)數(shù)*/
static unsigned char *fb_base;			/* Framebuffer首地址*/
static unsigned int line_width;			/* 一行數(shù)據(jù)所占用的字節(jié)數(shù)*/
static unsigned int pixel_width;		/* 單個(gè)像素所占用的字節(jié)數(shù)*/

/**********************************************************************
 * 函數(shù)名稱: lcd_put_pixel
 * 功能描述: 在LCD指定位置上輸出指定顏色(描點(diǎn))
 * 輸入?yún)?shù): x坐標(biāo),y坐標(biāo),顏色
 * 輸出參數(shù): 無
 * 返 回 值: 會(huì)
 * 修改日期        版本號(hào)     修改人	      修改內(nèi)容
 * -----------------------------------------------
 * 2020/05/12	     V1.0	  zh(angenao)	      創(chuàng)建
 ***********************************************************************/ 
void lcd_put_pixel(int x, int y, unsigned int color){
	unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;
	unsigned short *pen_16;	
	unsigned int *pen_32;	

	unsigned int red, green, blue;	

	pen_16 = (unsigned short *)pen_8;
	pen_32 = (unsigned int *)pen_8;

	switch (var.bits_per_pixel){
		case 8:{
			*pen_8 = color;
			break;
		}
		case 16:{
			/* 565 */
			red   = (color >> 16) & 0xff;
			green = (color >> 8) & 0xff;
			blue  = (color >> 0) & 0xff;
			color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
			*pen_16 = color;
			break;
		}
		case 32:{
			*pen_32 = color;
			break;
		}
		default:{
			printf("can't surport %dbpp\n", var.bits_per_pixel);
			break;
		}
	}
}
int main(int argc, char **argv){
	int i;
	fd_fb = open("/dev/fb0", O_RDWR);/** 打開fb設(shè)備*/
	if (fd_fb < 0){
		printf("can't open /dev/fb0\n");
		return -1;
	}
	if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var)){/** 獲取屏幕可變信息*/
		printf("can't get var\n");
		return -1;
	}
	printf("RES:%d x %d\n",var.xres,var.yres);
	printf("one pixel bits:%d\n",var.bits_per_pixel);
	line_width  = var.xres * var.bits_per_pixel / 8;// 一行數(shù)據(jù) 占據(jù)字節(jié)數(shù)
	printf("line_width:%d byte\n",line_width);
	pixel_width = var.bits_per_pixel / 8;///單個(gè)像素占用的字節(jié)數(shù)
	printf("pixel_width:%d byte\n",pixel_width);
	screen_size = var.xres * var.yres * var.bits_per_pixel / 8;//一幀畫面占用的字節(jié)數(shù)
	printf("screen_size:%d byte\n",screen_size);
	fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);/** 映射framebuffer的首地址*/
	if (fb_base == (unsigned char *)-1){
		printf("can't mmap\n");
		return -1;
	}
	memset(fb_base, 0x00, screen_size);/* 清屏: 全部設(shè)為黑色 */
	/* 隨便設(shè)置出100個(gè)為紅點(diǎn) */
	const double T=2*3.14;//周期
	const int A=100;//振幅
	double x,sin_y,cos_y;
	int start_x,start_y;//繪圖的起始點(diǎn)像素坐標(biāo)
	start_x=0;
	start_y = var.yres/2;
	
	while(1){
		for(i=0;i

上述代碼示例效果(手機(jī)拍出來效果略微偏色) 嵌入式Linux Framebuffer怎么描點(diǎn)畫線

感謝各位的閱讀,以上就是“嵌入式Linux Framebuffer怎么描點(diǎn)畫線”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)嵌入式Linux Framebuffer怎么描點(diǎn)畫線這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


網(wǎng)頁標(biāo)題:嵌入式LinuxFramebuffer怎么描點(diǎn)畫線
新聞來源:http://weahome.cn/article/jpcohd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部