色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

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

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

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

1.幀緩沖Framebuff

在 linux 系統中 LCD 這類設備稱為幀緩沖設備,英文 frameBuffer 設備。

frameBuffer 是出現在 2.2.xx 內核當中的一種驅動程序接口

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

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

幀緩沖驅動是字符類設備的一種,主設備號為29,生成的設備節點為/dev/fb*。

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

2.幀緩沖Framebuff應用編程

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

2.1 幀緩沖Framebuff設備節點

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

2.2 固定參數

通過ioctl函數,命令參數為FBIOGET_FSCREENINFO,固定參數結構體為struct fb_fix_screeninfo。在固定參數可獲得的屏幕信息有:smem_len屏幕緩沖區大小、line_length一行的字節數。

#define FBIOGET_FSCREENINFO	0x4602 /*獲取屏幕固定參數*/
/*固定參數結構體*/
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 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 一行的字節數   */
	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 可變參數

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

#define FBIOGET_VSCREENINFO	0x4600 /*獲取屏幕可變參數*/
/*可變參數結構體*/
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	顏色位數		*/
	__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 將屏幕緩沖區映射到進空間

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


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

2.5 幀緩沖獲取固定參數和可變參數示例

int main()
{
	/*1.打開設備*/
	int fd=open("/dev/fb0", 2);
	if(fd<0)
	{
		printf("打開設備失敗n");
	}
	/*2.獲取固定參數*/
	memset(&fb_fix,0, sizeof(fb_fix));
 	ioctl(fd,FBIOGET_FSCREENINFO,&fb_fix);
	printf("屏幕緩存大小:%dn",fb_fix.smem_len);
	printf("一行的字節數:%dn",fb_fix.line_length);
	/*3.獲取屏幕可變參數*/
	memset(&fb_var,0, sizeof(fb_var));
	ioctl(fd,FBIOGET_VSCREENINFO,&fb_var);
	printf("屏幕尺寸:%d*%dn",fb_var.xres,fb_var.yres);
	printf("顏色位數:%dn",fb_var.bits_per_pixel);
	/*4.將屏幕緩沖區映射到進程空間*/
	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");
		return 0;
	}
	memset(lcd_p,0xff,fb_fix.smem_len);//將屏幕清空為白色
	//取消映射
	munmap(lcd_p,fb_fix.smem_len);
	return 0;
}
/*畫點函數實現*/
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;//寫入顏色值
}
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • OLED
    +關注

    關注

    119

    文章

    6200

    瀏覽量

    224216
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209524
收藏 人收藏

    評論

    相關推薦

    Linux緩沖注冊OLED驅動(下)

    OLED,即有機發光二極管( Organic Light Emitting Diode)。 OLED 由于同時具備自發光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、 構造及制程較簡單等優異之特性,被認為是下一代的平面顯示器新興應用
    的頭像 發表于 09-26 15:54 ?2423次閱讀
    <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'>驅動</b>(下)

    基于Linux使用spidev驅動OLED

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

    迅為4412開發板Linux驅動教程——總線_設備_驅動注冊流程詳解

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

    嵌入式linux學習筆記20160907-每天進步一點點,向嵌入式進軍-LCD驅動

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

    Linux總線設備驅動注冊流程

    Linux總線設備驅動注冊流程
    發表于 09-16 19:11

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

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

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

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

    如何為iMX8 LVDS1添加第二個緩沖區?

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

    基于Linux的嵌入式LCD設計

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

    基于嵌入式Linux的TFT LCD IP及驅動的設計

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

    緩沖記憶接口引腳功能

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

    Linux下的LCD驅動程序實現

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

    Linux下的緩沖lcd應用編程及Framebuffer驅動程序模型

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

    STM32驅動OLED屏設計方案完成漢字滾動顯示

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

    Linux驅動開發-編寫OLED顯示屏驅動

    OLED顯示屏在是智能手環,智能手表用的非常的多,功耗低,不刺眼,優點特別多。本篇文章就介紹,在Linux系統里如何使用OLED顯示屏,要使用OL
    的頭像 發表于 09-17 15:19 ?4291次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>驅動</b>開發-編寫<b class='flag-5'>OLED</b>顯示屏<b class='flag-5'>驅動</b>
    主站蜘蛛池模板: 久久久久激情免费观看| 德国xxxx| 长篇高h肉爽文丝袜| 亚洲国产在线精品国偷产拍| 熟女人妻AV五十路六十路| 日本高清无人区影院| 欧美性猛交xxxxxxxx软件| 内射少妇36P九色| 嫩草电影网嫩草影院| 嫩草亚洲国产精品| 欧美黑人巨大性极品hd欧| 男助理憋尿PLAY灌尿BL出去| 男人私gay挠脚心vk视频| 欧美丰满熟妇BBB久久久| 欧美顶级情欲片免费看| 青青草A在在观免费线观看| 日本xxxxxxxxx老师59| 日本妈妈JMZZZZZ| 十九岁在线观看免费完整版电影| 桃隐社区最新最快地址| 午夜国产精品视频在线| 亚洲精品www久久久久久| 亚洲视频在线免费看| 怡春院国产精品视频| 2019久久这里只精品热在线观看| 99成人在线视频| xnxnxn69日本| 国产国产乱老熟视频网站| 国产亚洲精品字幕在线观看| 精品一区二区三区四区五区六区 | 日日碰狠狠躁久久躁77777| 日韩免费一区| 羞羞答答dc视频| 夜色帮首页| 99热在线视频这里只精品| 扒开黑女人p大荫蒂老女人| 国产AV麻豆出品在线播放| 果冻传媒在线播放 免费观看| 久久亚洲黄色| 日本浴室日产在线系列| 性满足久久久久久久久|