RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux幀緩沖注冊O(shè)LED驅(qū)動(上)

嵌入式技術(shù) ? 來源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-09-26 15:47 ? 次閱讀

Linux幀緩沖注冊OLED驅(qū)動(上)

1.幀緩沖Framebuff

在 linux 系統(tǒng)中 LCD 這類設(shè)備稱為幀緩沖設(shè)備,英文 frameBuffer 設(shè)備。

frameBuffer 是出現(xiàn)在 2.2.xx 內(nèi)核當(dāng)中的一種驅(qū)動程序接口。

幀緩沖( framebuffer)是 Linux 系統(tǒng)為顯示設(shè)備提供的一個接口,它將顯示緩沖區(qū)抽象,屏蔽圖像硬件的底層差異,允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作。用戶不必關(guān)心物理顯示緩沖區(qū)的具體位置及存放方式,這些都由幀緩沖設(shè)備驅(qū)動本身來完成。

用戶可以將 Framebuffer 看成是顯示內(nèi)存的一個映像, 將其映射到進程地址空間之后,就可以直接進行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。

幀緩沖驅(qū)動是字符類設(shè)備的一種,主設(shè)備號為29,生成的設(shè)備節(jié)點為/dev/fb*。

使用幀緩沖完成屏幕驅(qū)動注冊,應(yīng)用層只需調(diào)用open函數(shù)打開失敗,再通過ioctl函數(shù)獲取屏幕的參數(shù)信息,再調(diào)用mmap函數(shù)將屏幕顯存地址映射到進程空間,接下來對地址的寫入即是對屏幕的刷。

2.幀緩沖Framebuff應(yīng)用編程

幀緩沖應(yīng)用層編程步驟
打開LCD設(shè)備open(“/dev/fb0”,2);
獲取固定參數(shù)和可變參數(shù)ioctl;
將屏幕緩沖區(qū)映射到進程空間mmap;
實現(xiàn)屏幕最核心函數(shù)畫點函數(shù);

2.1 幀緩沖Framebuff設(shè)備節(jié)點

通過幀緩沖完成屏幕驅(qū)動注冊,會在/dev下生成設(shè)備節(jié)點,主設(shè)備號為29,注冊的一個設(shè)備驅(qū)動為/dev/fb0,第二個為/dev/fb1,依此類推,最大可以注冊32個設(shè)備。

2.2 固定參數(shù)

通過ioctl函數(shù),命令參數(shù)為FBIOGET_FSCREENINFO,固定參數(shù)結(jié)構(gòu)體為struct fb_fix_screeninfo。在固定參數(shù)可獲得的屏幕信息有:smem_len屏幕緩沖區(qū)大小、line_length一行的字節(jié)數(shù)。

#define FBIOGET_FSCREENINFO	0x4602 /*獲取屏幕固定參數(shù)*/
/*固定參數(shù)結(jié)構(gòu)體*/
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 屏幕緩沖區(qū)大小*/
	__u32 type;			/* see FB_TYPE_*		*/
	__u32 type_aux;			/* Interleave for interleaved Planes */
	__u32 visual;			/* see FB_VISUAL_*		*/ 
	__u16 xpanstep;			/* zero if no hardware panning  */
	__u16 ypanstep;			/* zero if no hardware panning  */
	__u16 ywrapstep;		/* zero if no hardware ywrap    */
	__u32 line_length;		/* length of a line in bytes 一行的字節(jié)數(shù)   */
	unsigned long mmio_start;	/* Start of Memory Mapped I/O   */
					/* (physical address) */
	__u32 mmio_len;			/* Length of Memory Mapped I/O  */
	__u32 accel;			/* Indicate to driver which	*/
					/*  specific chip/card we have	*/
	__u16 capabilities;		/* see FB_CAP_*			*/
	__u16 reserved[2];		/* Reserved for future compatibility */
};

2.3 可變參數(shù)

??通過ioctl函數(shù),命令參數(shù)為FBIOGET_VSCREENINFO,固定參數(shù)結(jié)構(gòu)體為struct fb_fix_screeninfo。在固定參數(shù)可獲得的屏幕信息有:屏幕寬度xres、屏幕高度yres、顏色位數(shù)bits_per_pixel。

#define FBIOGET_VSCREENINFO	0x4600 /*獲取屏幕可變參數(shù)*/
/*可變參數(shù)結(jié)構(gòu)體*/
struct fb_var_screeninfo {
	__u32 xres;			/* visible resolution屏幕寬度		*/
	__u32 yres;			/*屏幕高度*/
	__u32 xres_virtual;		/* virtual resolution		*/
	__u32 yres_virtual;
	__u32 xoffset;			/* offset from virtual to visible */
	__u32 yoffset;			/* resolution			*/

	__u32 bits_per_pixel;		/* guess what	顏色位數(shù)		*/
	__u32 grayscale;		/* 0 = color, 1 = grayscale,	*/
					/* >1 = FOURCC			*/
	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			*/	

	__u32 nonstd;			/* != 0 Non standard pixel format */

	__u32 activate;			/* see FB_ACTIVATE_*		*/

	__u32 height;			/* height of picture in mm    */
	__u32 width;			/* width of picture in mm     */

	__u32 accel_flags;		/* (OBSOLETE) see fb_info.flags */

	/* Timing: All values in pixclocks, except pixclock (of course) */
	__u32 pixclock;			/* pixel clock in ps (pico seconds) */
	__u32 left_margin;		/* time from sync to picture	*/
	__u32 right_margin;		/* time from picture to sync	*/
	__u32 upper_margin;		/* time from sync to picture	*/
	__u32 lower_margin;
	__u32 hsync_len;		/* length of horizontal sync	*/
	__u32 vsync_len;		/* length of vertical sync	*/
	__u32 sync;			/* see FB_SYNC_*		*/
	__u32 vmode;			/* see FB_VMODE_*		*/
	__u32 rotate;			/* angle we rotate counter clockwise */
	__u32 colorspace;		/* colorspace for FOURCC-based modes */
	__u32 reserved[4];		/* Reserved for future compatibility */
};

2.4 將屏幕緩沖區(qū)映射到進空間

#include 
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
函數(shù)功能: 將文件映射到進程空間
形參: addr --映射的虛擬地址,一般填NULL,有系統(tǒng)自行分配
???length --要映射的空間大小
???prot --PROT_READ可讀;PROT_WRITE可寫
???flags --MAP_SHARED可讀寫,讀寫內(nèi)容同步到文件;MAP_PRIVATE修改的內(nèi)容不會同步到文件
???fd --文件描述符
???offset --一般填0,表示映射整個文件
返回值: 成功返回映射的地址
???失敗返回-1


int munmap(void *addr, size_t length);
形參: addr --mamp函數(shù)返回值
???length --映射空間大小

2.5 幀緩沖獲取固定參數(shù)和可變參數(shù)示例

int main()
{
	/*1.打開設(shè)備*/
	int fd=open("/dev/fb0", 2);
	if(fd<0)
	{
		printf("打開設(shè)備失敗n");
	}
	/*2.獲取固定參數(shù)*/
	memset(&fb_fix,0, sizeof(fb_fix));
 	ioctl(fd,FBIOGET_FSCREENINFO,&fb_fix);
	printf("屏幕緩存大小:%dn",fb_fix.smem_len);
	printf("一行的字節(jié)數(shù):%dn",fb_fix.line_length);
	/*3.獲取屏幕可變參數(shù)*/
	memset(&fb_var,0, sizeof(fb_var));
	ioctl(fd,FBIOGET_VSCREENINFO,&fb_var);
	printf("屏幕尺寸:%d*%dn",fb_var.xres,fb_var.yres);
	printf("顏色位數(shù):%dn",fb_var.bits_per_pixel);
	/*4.將屏幕緩沖區(qū)映射到進程空間*/
	lcd_p=mmap(NULL,fb_fix.smem_len,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
	close(fd);
	if(lcd_p==(void *)-1)
	{
		printf("內(nèi)存映射失敗n");
		return 0;
	}
	memset(lcd_p,0xff,fb_fix.smem_len);//將屏幕清空為白色
	//取消映射
	munmap(lcd_p,fb_fix.smem_len);
	return 0;
}
/*畫點函數(shù)實現(xiàn)*/
static inline void LCD_DrawPoint(int x,int y,int c)
{
	//獲取要繪制的點的地址
	unsigned int *p= (unsigned int *)(lcd_p+y*fb_fix.line_length+x*fb_var.bits_per_pixel/8);
	*p=c;//寫入顏色值
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OLED
    +關(guān)注

    關(guān)注

    119

    文章

    6198

    瀏覽量

    224087
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11292

    瀏覽量

    209318
收藏 人收藏

    評論

    相關(guān)推薦

    Linux緩沖注冊OLED驅(qū)動(下)

    OLED,即有機發(fā)光二極管( Organic Light Emitting Diode)。 OLED 由于同時具備自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應(yīng)速度快、可用于撓曲性面板、使用溫度范圍廣、 構(gòu)造及制程較簡單等優(yōu)異之特性,被認為是下一代的平面顯示器新興應(yīng)用
    的頭像 發(fā)表于 09-26 15:54 ?2411次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>幀</b><b class='flag-5'>緩沖</b><b class='flag-5'>注冊</b><b class='flag-5'>OLED</b><b class='flag-5'>驅(qū)動</b>(下)

    基于Linux使用spidev驅(qū)動OLED

    如果不想編寫spi設(shè)備驅(qū)動,那么linux內(nèi)核提供了一個通用的spidev設(shè)備驅(qū)動,提供統(tǒng)一的字符設(shè)備操作,那么只需要在應(yīng)用層讀寫和控制即可。以SPI OLED為例子,使用spidev
    發(fā)表于 06-16 10:36 ?4370次閱讀
    基于<b class='flag-5'>Linux</b>使用spidev<b class='flag-5'>驅(qū)動</b><b class='flag-5'>OLED</b>

    迅為4412開發(fā)板Linux驅(qū)動教程——總線_設(shè)備_驅(qū)動注冊流程詳解

    /platform/ 驅(qū)動注冊? 驅(qū)動注冊– 很重要,牢牢掌握,以后寫任何Linux驅(qū)動都會
    發(fā)表于 08-12 14:13

    嵌入式linux學(xué)習(xí)筆記20160907-每天進步一點點,向嵌入式進軍-LCD驅(qū)動

    fb_var_screeninfo var 和struct fb_fix_screeninfo fix 成員。2.根據(jù)具體LCD 屏幕的特點,完成LCD 控制器硬件的初始化。3.申請緩沖設(shè)備的顯示緩沖區(qū)空間。4.
    發(fā)表于 09-07 11:13

    Linux總線設(shè)備驅(qū)動注冊流程

    Linux總線設(shè)備驅(qū)動注冊流程
    發(fā)表于 09-16 19:11

    【HarmonyOS HiSpark Wi-Fi IoT 套件試用OLED驅(qū)動oled屏的使用和oled驅(qū)動測試

    在測試HarmonyOS Wi-Fi IoT 套件Hi3861過程,套件oled屏幕不亮了,最后排查發(fā)現(xiàn)是測試新程序的時候把之前的測試程序入口更改了,無法驅(qū)動oled了。論壇上有連
    發(fā)表于 11-15 20:37

    IMX6緩沖區(qū)會阻塞原因?如何讓它更快?

    我對 IMX-6 板Linux 緩沖區(qū)有疑問。要將 ioctl 命令 FBIOPAN_DISPLAY 發(fā)送到 /dev/fb0,它會阻塞 5 秒。這個問題就在關(guān)機/開機之后,正
    發(fā)表于 03-15 07:16

    如何為iMX8 LVDS1添加第二個緩沖區(qū)?

    為 lvds1 創(chuàng)建第二個緩沖區(qū)?Linux 內(nèi)核版本為 5.4.70 (linux-imx)。請注意,我確實找到了一篇 NXP 社
    發(fā)表于 04-10 08:34

    基于Linux的嵌入式LCD設(shè)計

    本文介紹了基于Linux 的嵌入式LCD 設(shè)計的實現(xiàn),以ARM 處理器S3C2410X 嵌入式芯片為平臺,設(shè)計了嵌入式Linux 下的設(shè)備驅(qū)動程序和
    發(fā)表于 09-01 09:50 ?18次下載

    基于嵌入式Linux的TFT LCD IP及驅(qū)動的設(shè)計

    基于嵌入式Linux 的TFT LCD IP 及驅(qū)動的設(shè)計:Nios II 處理器在SDRAM 中開辟緩沖(Frame buffer),可以是單
    發(fā)表于 03-18 17:48 ?4次下載

    緩沖記憶接口引腳功能

    緩沖記憶接口引腳功能 緩沖記憶接口引腳功能PIN TYPE PIN NO 功能MAI[9:0] O 113-112
    發(fā)表于 01-16 23:54 ?626次閱讀

    Linux下的LCD驅(qū)動程序?qū)崿F(xiàn)

    通過對LCD和Framebuffer原理的說明,以ARM處理器S3C2410嵌入式芯片為平臺,設(shè)計了嵌入式Linux下的基于緩沖的LCD設(shè)備驅(qū)動程序。通過測試程序的編譯運行,在LCD
    發(fā)表于 02-09 15:10 ?68次下載
    <b class='flag-5'>Linux</b>下的LCD<b class='flag-5'>驅(qū)動</b>程序?qū)崿F(xiàn)

    Linux下的緩沖lcd應(yīng)用編程及Framebuffer驅(qū)動程序模型

    緩沖(framebuffer)是 Linux 為顯示設(shè)備提供的一個接口,把顯存抽象后的一種設(shè)備,他允許上層應(yīng)用程序在圖形模式下直接對顯示緩沖區(qū)進行讀寫操作。
    發(fā)表于 04-28 17:40 ?1408次閱讀

    STM32驅(qū)動OLED屏設(shè)計方案完成漢字滾動顯示

    OLED實現(xiàn)字符串滾動顯示。 ??0.96寸OLED分辨率為128*64(128列,64行)。我們可以定義二維數(shù)組緩沖區(qū)buff[64][128],先將要顯示的數(shù)據(jù)放在
    的頭像 發(fā)表于 05-31 17:31 ?6703次閱讀
    STM32<b class='flag-5'>驅(qū)動</b><b class='flag-5'>OLED</b>屏設(shè)計方案完成漢字滾動顯示

    Linux驅(qū)動開發(fā)-編寫OLED顯示屏驅(qū)動

    OLED顯示屏在是智能手環(huán),智能手表用的非常的多,功耗低,不刺眼,優(yōu)點特別多。本篇文章就介紹,在Linux系統(tǒng)里如何使用OLED顯示屏,要使用OL
    的頭像 發(fā)表于 09-17 15:19 ?4276次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動</b>開發(fā)-編寫<b class='flag-5'>OLED</b>顯示屏<b class='flag-5'>驅(qū)動</b>
    RM新时代网站-首页