一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-09-26 15:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux幀緩沖注冊(cè)OLED驅(qū)動(dòng)(上)

1.幀緩沖Framebuff

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

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

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

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

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

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

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

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

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

通過(guò)幀緩沖完成屏幕驅(qū)動(dòng)注冊(cè),會(huì)在/dev下生成設(shè)備節(jié)點(diǎn),主設(shè)備號(hào)為29,注冊(cè)的一個(gè)設(shè)備驅(qū)動(dòng)為/dev/fb0,第二個(gè)為/dev/fb1,依此類推,最大可以注冊(cè)32個(gè)設(shè)備。

2.2 固定參數(shù)

通過(guò)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ù)

??通過(guò)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ū)映射到進(jìn)空間

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


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

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

int main()
{
	/*1.打開(kāi)設(shè)備*/
	int fd=open("/dev/fb0", 2);
	if(fd<0)
	{
		printf("打開(kāi)設(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ū)映射到進(jìn)程空間*/
	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;
}
/*畫點(diǎn)函數(shù)實(shí)現(xiàn)*/
static inline void LCD_DrawPoint(int x,int y,int c)
{
	//獲取要繪制的點(diǎn)的地址
	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)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • OLED
    +關(guān)注

    關(guān)注

    120

    文章

    6286

    瀏覽量

    228057
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213765
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux緩沖注冊(cè)OLED驅(qū)動(dòng)(下)

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

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

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

    請(qǐng)問(wèn)如何在Linux中使用緩沖區(qū)更新epdc顯示?

    我正在使用帶有 epdc 顯示子卡 (IMXEBOOKDC5) 的 IMX8ULP EVK。使用 Linux 映像引導(dǎo)后,epdc 顯示無(wú)法使用緩沖區(qū)進(jìn)行更新。當(dāng)檢查顯示 pmic 的電源使能引腳
    發(fā)表于 04-01 06:41

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

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

    嵌入式linux學(xué)習(xí)筆記20160907-每天進(jìn)步一點(diǎn)點(diǎn),向嵌入式進(jìn)軍-LCD驅(qū)動(dòng)

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

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

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

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

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

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

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

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

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

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

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

    緩沖記憶接口引腳功能

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

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

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

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

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

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

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

    Linux驅(qū)動(dòng)開(kāi)發(fā)-編寫OLED顯示屏驅(qū)動(dòng)

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