国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程

這篇具有很好參考價(jià)值的文章主要介紹了LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.LCD 操作原理

在 Linux 系統(tǒng)中通過(guò) Framebuffer 驅(qū)動(dòng)程序來(lái)控制 LCD。Frame 是幀的意思buffer 是緩沖的意思,這意味著 Framebuffer 就是一塊內(nèi)存,里面保存著一幀圖像。Framebuffer 中保存著一幀圖像的每一個(gè)像素顏色值,假設(shè) LCD 的分辨率是 1024x768,每一個(gè)像素的顏色用 32 位來(lái)表示,那么 Framebuffer 的大小就是:1024x768x32/8=3145728 字節(jié)。LCD的操作原理:

  1. 驅(qū)動(dòng)程序設(shè)置好 LCD 控制器:
    根據(jù) LCD 的參數(shù)設(shè)置 LCD 控制器的時(shí)序、信號(hào)極性;
    根據(jù) LCD 分辨率、 BPP 分配 Framebuffer
  2. APP 使用 ioctl 獲得 LCD 分辨率、 BPP
  3. APP 通過(guò) mmap 映射 Framebuffer ,在 Framebuffer 中寫入數(shù)據(jù)

LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程,Linux系統(tǒng)應(yīng)用,linux

? ? ? ? bpp:每個(gè)像素用多少位來(lái)表示它的顏色
????????假設(shè)需要設(shè)置 LCD 中坐標(biāo) (x,y) 處像素的顏色,首要要找到這個(gè)像素對(duì)應(yīng)的內(nèi)存,然后根據(jù)它的 BPP 值設(shè)置顏色。假設(shè) fb_base APP 執(zhí)行 mmap 后得到的 Framebuffer 地址,如圖
LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程,Linux系統(tǒng)應(yīng)用,linux
可以用以下公式算出 (x,y) 坐標(biāo)處像素對(duì)應(yīng)的 Framebuffer 地址:
(x,y)像素起始地址=fb_base+(xres*bpp/8)*y + x*bpp/8
最后一個(gè)要解決的問(wèn)題就是像素的顏色怎么表示?它是用 RGB 三原色 ( 紅、綠、 藍(lán)) 來(lái)表示的,在不同的 BPP 格式中,用不同的位來(lái)分別表示 R 、 G 、 B ,如圖 所示:
LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程,Linux系統(tǒng)應(yīng)用,linux
????????對(duì)于 32BPP ,一般只設(shè)置其中的低 24 位,高 8 位表示透明度,一般的 LCD 都不支持。
????????對(duì)于 24BPP ,硬件上為了方便處理,在 Framebuffer 中也是用 32 位來(lái)表 示,效果跟 32BPP 是一樣的。
????????對(duì)于 16BPP ,常用的是 RGB565 ;很少的場(chǎng)合會(huì)用到 RGB555 ,這可以通過(guò) ioctl 讀取驅(qū)動(dòng)程序中的 RGB 位偏移來(lái)確定使用哪一種格式。

2.涉及的 API 函數(shù)

? ? ? ? open?打開 LCD 設(shè)備節(jié)點(diǎn)
????????ioctl??獲取LCD黑色版分辨率等參數(shù)
????????mmap ?映射 Framebuffer
????????最后實(shí)現(xiàn)描點(diǎn)函數(shù)。

2.1 open 函數(shù)

????????在 Ubuntu 中執(zhí)行“ man 2 open ”,可以看到 open 函數(shù)的說(shuō)明。
? ? ? ? 頭文件:
??
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

? ? ? ? 函數(shù)原型:

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

????????函數(shù)說(shuō)明:

  1. pathname 表示打開文件的路徑;
  2. Flags 表示打開文件的方式,常用的有以下 6 種,
    O_RDWR 表示可讀可寫方式打開 ;
    O_RDONLY 表示只讀方式打開 ;
    O_WRONLY 表示只寫方式打開 ;
    O_APPEND 表示如果這個(gè)文件中本來(lái)是有內(nèi)容的,則新寫入的內(nèi)容會(huì)接續(xù)到原來(lái)內(nèi)容的后面;
    O_TRUNC 表示如果這個(gè)文件中本來(lái)是有內(nèi)容的,則原來(lái)的內(nèi)容會(huì)被丟棄,截?cái)啵?
    O_CREAT 表示當(dāng)前打開文件不存在,我們創(chuàng)建它并打開它,通常與 O_EXCL 結(jié)合使用,當(dāng)沒(méi)有文件時(shí)創(chuàng)建文件,有這個(gè)文件時(shí)會(huì)報(bào)錯(cuò)提醒我們;
  3. Mode 表示創(chuàng)建文件的權(quán)限,只有在 flags 中使用了 O_CREAT 時(shí)才有效,否則忽略。
  4. 返回值:打開成功返回文件描述符,失敗將返回 -1 。

2.2?ioctl 函數(shù)

???????? Ubuntu 中執(zhí)行“ man ioctl ”,可以看到 ioctl 函數(shù)的說(shuō)明。
? ? ? ? 頭文件:
#include <sys/ioctl.h>

? ? ? ? 函數(shù)原型:

int ioctl(int fd, unsigned long request, ...);

????????函數(shù)說(shuō)明:

  1. fd 表示文件描述符;
  2. request 表示與驅(qū)動(dòng)程序交互的命令,用不同的命令控制驅(qū)動(dòng)程序輸出我們需要的數(shù)據(jù);
  3. 表示可變參數(shù) arg ,根據(jù) request 命令,設(shè)備驅(qū)動(dòng)程序返回輸出的數(shù)據(jù)。
  4. 返回值:打開成功返回文件描述符,失敗將返回 -1
????????ioctl 的作用非常強(qiáng)大、靈活。不同的驅(qū)動(dòng)程序內(nèi)部會(huì)實(shí)現(xiàn)不同的 ioctl, APP 可以使用各種 ioctl 跟驅(qū)動(dòng)程序交互:可以傳數(shù)據(jù)給驅(qū)動(dòng)程序,也可以從驅(qū)動(dòng)程序中讀出數(shù)據(jù)。

2.3?mmap 函數(shù)

????????在 Ubuntu 中執(zhí)行“ man mmap ”,可以看到 mmap 函數(shù)的說(shuō)明;
? ? ? ? 頭文件:
? ? ? ?
#include <sys/mman.h>

? ? ? ? 函數(shù)原型:

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);

????????函數(shù)說(shuō)明:

  1. addr 表示指定映射的內(nèi)存起始地址,通常設(shè)為 NULL 表示讓系統(tǒng)自動(dòng)選定地址,并在成功映射后返回該地址;
  2. length 表示將文件中多大的內(nèi)容映射到內(nèi)存中;
  3. prot 表示映射區(qū)域的保護(hù)方式,可以為以下 4 種方式的組合
    PROT_EXEC 映射區(qū)域可被執(zhí)行
    PROT_READ 映射區(qū)域可被讀出
    PROT_WRITE 映射區(qū)域可被寫入
    PROT_NONE 映射區(qū)域不能存取
  4. Flags 表示影響映射區(qū)域的不同特性,常用的有以下兩種
    MAP_SHARED 表示對(duì)映射區(qū)域?qū)懭氲臄?shù)據(jù)會(huì)復(fù)制回文件內(nèi),原來(lái)的文件會(huì)改變。
    MAP_PRIVATE 表示對(duì)映射區(qū)域的操作會(huì)產(chǎn)生一個(gè)映射文件的復(fù)制,對(duì)此區(qū)域的任何修改都不會(huì)寫回原來(lái)的文件內(nèi)容中。
  5. 返回值:若成功映射,將返回指向映射的區(qū)域的指針,失敗將返回 -1

3.Framebuffer 程序分析

3.1 打開設(shè)備節(jié)點(diǎn)

fd_fb = open("/dev/fb0", O_RDWR);//打開設(shè)備節(jié)點(diǎn)
if (fd_fb < 0)
{
	printf("can't open /dev/fb0\n");
	return -1;
}

3.2 獲取 LCD 參數(shù)

????????LCD 驅(qū)動(dòng)程序給 APP 提供 2 類參數(shù):可變的參數(shù) fb_var_screeninfo 、固定的參數(shù) fb_fix_screeninfo 。編寫應(yīng)用程序時(shí)主要關(guān)心可變參數(shù),它的結(jié)構(gòu)體定義如下(#include <linux/fb.h>)

LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程,Linux系統(tǒng)應(yīng)用,linux文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-737662.html

可以使用以下代碼獲取 fb_var_screeninfo
static struct fb_var_screeninfo var;	/* Current var */
if (ioctl(fd_fb, FBIOGET_VSCREENINFO, &var))
{
	printf("can't get var\n");
	return -1;
}
注意到 ioctl 里用的參數(shù)是: FBIOGET_VSCREENINFO ,它表示 get var screen info,獲得屏幕的可變信息;當(dāng)然也可以使用 FBIOPUT_VSCREENINFO 來(lái)調(diào)整這些參數(shù),但是很少用到。
對(duì)于固定的參數(shù) fb_fix_screeninfo,在應(yīng)用編程中很少用到。它的結(jié)構(gòu)體定義如下:
LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程,Linux系統(tǒng)應(yīng)用,linux
可以使用 ioctl FBIOGET_FSCREENINFO 來(lái)讀出這些信息,但是很少用到。

3.3?映射 Framebuffer

????????要映射一塊內(nèi)存,需要知道它的地址──這由驅(qū)動(dòng)程序來(lái)設(shè)置,需要知道它的大小──這由應(yīng)用程序決定。代碼如下:
line_width  = var.xres * var.bits_per_pixel / 8;//屏幕寬度大?。ǘ嗌賯€(gè)字節(jié))
pixel_width = var.bits_per_pixel / 8;//一個(gè)像素大小(多少個(gè)字節(jié))
screen_size = var.xres * var.yres * var.bits_per_pixel / 8; //屏幕大?。ǘ嗌賯€(gè)字節(jié))
fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
if (fb_base == (unsigned char *)-1)
{
	printf("can't mmap\n");
	return -1;
}
????????screen_size 是整個(gè) Framebuffer 的大?。?/span> PROT_READ | PROT_WRITE 表示該區(qū)域可讀、可寫; MAP_SHARED 表示該區(qū)域是共享的, APP 寫入數(shù)據(jù)時(shí),會(huì)直達(dá)驅(qū)動(dòng)程序,這個(gè)參數(shù)的更深刻理解可以參考后面驅(qū)動(dòng)基礎(chǔ)中講到的 mmap 知識(shí)。

3.4 描點(diǎn)函數(shù)

能夠在 LCD 上描繪指定像素后,就可以寫字、畫圖,描點(diǎn)函數(shù)是基礎(chǔ)。代碼如下:
 //傳入的 color 表示顏色,它的格式永遠(yuǎn)是 0x00RRGGBB,即 RGB888。當(dāng) LCD 是 16bpp 時(shí),要把 color 變量中的 R、G、B 抽出來(lái)再合并成 RGB565 格式
void lcd_put_pixel(int x, int y, unsigned int color)
{
	unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;//計(jì)算要顯示的坐標(biāo)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;//對(duì)于 8bpp,color 就不再表示 RBG 三原色了,這涉及調(diào)色板的概念,color 是調(diào)色板的值。
			break;
		}
		case 16:
		{
			/* 565 */
			red   = (color >> 16) & 0xff; //32位red數(shù)據(jù)是:16~24  24~32沒(méi)用
			green = (color >> 8) & 0xff;  //32位green數(shù)據(jù)是:8~16
			blue  = (color >> 0) & 0xff;  //32位blue數(shù)據(jù)是:0~8
			//總共16位:紅保留高5位放在11~16,綠保留高6位放在5~11,藍(lán)保留高5位放在0~5
			color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
			*pen_16 = color;//將計(jì)算的位置坐標(biāo)顯示該顏色
			break;
		}
		case 32:
		{
			*pen_32 = color;//對(duì)于 32bpp,顏色格式跟 color 參數(shù)一致,可以直接寫入Framebuffer。
			break;
		}
		default:
		{
			printf("can't surport %dbpp\n", var.bits_per_pixel);
			break;
		}
	}
}

3.5?隨便畫幾個(gè)點(diǎn)的完整程序

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>

static int fd_fb;
static struct fb_var_screeninfo var;	/* Current var */
static int screen_size;
static unsigned char *fb_base;
static unsigned int line_width;
static unsigned int pixel_width;

 //傳入的 color 表示顏色,它的格式永遠(yuǎn)是 0x00RRGGBB,即 RGB888。當(dāng) LCD 是 16bpp 時(shí),要把 color 變量中的 R、G、B 抽出來(lái)再合并成 RGB565 格式
void lcd_put_pixel(int x, int y, unsigned int color)
{
	unsigned char *pen_8 = fb_base+y*line_width+x*pixel_width;//計(jì)算要顯示的坐標(biāo)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;//對(duì)于 8bpp,color 就不再表示 RBG 三原色了,這涉及調(diào)色板的概念,color 是調(diào)色板的值。
			break;
		}
		case 16:
		{
			/* 565 */
			red   = (color >> 16) & 0xff; //32位red數(shù)據(jù)是:16~24  24~32沒(méi)用
			green = (color >> 8) & 0xff;  //32位green數(shù)據(jù)是:8~16
			blue  = (color >> 0) & 0xff;  //32位blue數(shù)據(jù)是:0~8
			//總共16位:紅保留高5位放在11~16,綠保留高6位放在5~11,藍(lán)保留高5位放在0~5
			color = ((red >> 3) << 11) | ((green >> 2) << 5) | (blue >> 3);
			*pen_16 = color;//將計(jì)算的位置坐標(biāo)顯示該顏色
			break;
		}
		case 32:
		{
			*pen_32 = color;//對(duì)于 32bpp,顏色格式跟 color 參數(shù)一致,可以直接寫入Framebuffer。
			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);//打開設(shè)備節(jié)點(diǎn)
	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;
	}

	line_width  = var.xres * var.bits_per_pixel / 8;//屏幕寬度大?。ǘ嗌賯€(gè)字節(jié))
	pixel_width = var.bits_per_pixel / 8;//一個(gè)像素大?。ǘ嗌賯€(gè)字節(jié))
	screen_size = var.xres * var.yres * var.bits_per_pixel / 8; //屏幕大?。ǘ嗌賯€(gè)字節(jié))
	fb_base = (unsigned char *)mmap(NULL , screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);
	if (fb_base == (unsigned char *)-1)
	{
		printf("can't mmap\n");
		return -1;
	}

	/* 清屏: 全部設(shè)為白色 */
	memset(fb_base, 0xff, screen_size);

	/* 隨便設(shè)置出100個(gè)為紅色 */
	for (i = 0; i < 100; i++)
		lcd_put_pixel(var.xres/2+i, var.yres/2, 0xFF0000);
	
	munmap(fb_base , screen_size);
	close(fd_fb);
	
	return 0;	
}

到了這里,關(guān)于LCD驅(qū)動(dòng)程序——Framebuffer應(yīng)用編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 驅(qū)動(dòng)與應(yīng)用程序通信

    本文講述的是 Windows操作系統(tǒng)下驅(qū)動(dòng)程序與應(yīng)用程序之間的通信 ,說(shuō)簡(jiǎn)單點(diǎn)就是相互發(fā)送數(shù)據(jù)。 在應(yīng)用程序中,可以通過(guò) CreateFile 來(lái)打開設(shè)備,然后通過(guò) DeviceIoControl 來(lái)向驅(qū)動(dòng)發(fā)送或接收數(shù)據(jù);而驅(qū)動(dòng)程序則需要通過(guò) 創(chuàng)建控制設(shè)備對(duì)象 ,并 創(chuàng)建符號(hào)鏈接 ,通過(guò) 分發(fā)函數(shù) 來(lái)

    2024年02月06日
    瀏覽(22)
  • Linux設(shè)備驅(qū)動(dòng)程序(一)——設(shè)備驅(qū)動(dòng)簡(jiǎn)介

    這一部分主要是用來(lái)介紹 Linux 設(shè)備驅(qū)動(dòng)程序的一些基本概念,包括:Linux 設(shè)備驅(qū)動(dòng)程序的作用、內(nèi)核功能的劃分、設(shè)備和模塊的分類以及版本編號(hào)。 設(shè)備驅(qū)動(dòng)程序就像一個(gè)個(gè)的“黑盒子”,使某個(gè)特定硬件響應(yīng)一個(gè)定義良好的內(nèi)部編程接口,這些操作完全隱藏了設(shè)備的工作

    2024年02月05日
    瀏覽(24)
  • Linux驅(qū)動(dòng)(一)之最簡(jiǎn)單的驅(qū)動(dòng)程序

    Linux驅(qū)動(dòng)(一)之最簡(jiǎn)單的驅(qū)動(dòng)程序

    為什么要有驅(qū)動(dòng)?為了防止像我等小菜程序員寫應(yīng)用程序的時(shí)候權(quán)限過(guò)高直接去操作底層設(shè)備,給設(shè)備造成不可挽回的損失,所以要過(guò)度一下,讓大牛們將底層封裝好,應(yīng)用開發(fā)工程師只需要通過(guò)特定的接口來(lái)完成特定的功能就可以了。 通常情況下,應(yīng)用開發(fā)只需要open一個(gè)

    2024年02月17日
    瀏覽(21)
  • 【Linux】按鍵驅(qū)動(dòng)程序

    【Linux】按鍵驅(qū)動(dòng)程序

    【Linux】按鍵驅(qū)動(dòng)程序 前言: 一、按鍵驅(qū)動(dòng)程序的背景知識(shí) 1.1 查詢方式 1.2 休眠-喚醒方式 1.3 poll方式 1.4 異步通知? 1.5 總結(jié)? 二、按鍵驅(qū)動(dòng)程序的框架 三、按鍵驅(qū)動(dòng)程序?qū)崙?zhàn) 3.1 頭文件(button_drv.h) 3.2?驅(qū)動(dòng)程序(button_drv.c) 3.3?驅(qū)動(dòng)程序(button_100ask_imx6ull.c) 3.4?Makefil

    2024年02月10日
    瀏覽(21)
  • 5.2.10.應(yīng)用程序如何調(diào)用驅(qū)動(dòng) mknod /dev/test c 250 0 創(chuàng)建設(shè)備文件,應(yīng)用app 程序 調(diào)用 我們 驅(qū)動(dòng) 殼子

    5.2.10.應(yīng)用程序如何調(diào)用驅(qū)動(dòng) mknod /dev/test c 250 0 創(chuàng)建設(shè)備文件,應(yīng)用app 程序 調(diào)用 我們 驅(qū)動(dòng) 殼子

    5.2.10.應(yīng)用程序如何調(diào)用驅(qū)動(dòng) 5.2.10.1、驅(qū)動(dòng)設(shè)備文件的創(chuàng)建 (1)何為設(shè)備文件 ? ??索引驅(qū)動(dòng) (2)設(shè)備文件的關(guān)鍵信息是:設(shè)備號(hào) = 主設(shè)備號(hào) + 次設(shè)備號(hào),使用ls -l去查看設(shè)備文件,就可以得到這個(gè)設(shè)備文件對(duì)應(yīng)的主次設(shè)備號(hào)。 ????????4顆LED不可能 都占用 主設(shè)備號(hào),設(shè)備號(hào)

    2024年02月16日
    瀏覽(28)
  • Linux 驅(qū)動(dòng)開發(fā)基礎(chǔ)知識(shí)——Hello驅(qū)動(dòng)程序(一)

    Linux 驅(qū)動(dòng)開發(fā)基礎(chǔ)知識(shí)——Hello驅(qū)動(dòng)程序(一)

    ?個(gè)人名片: ??作者簡(jiǎn)介:一名喜歡分享和記錄學(xué)習(xí)的在校大學(xué)生 ??個(gè)人主頁(yè):妄北y ??個(gè)人QQ:2061314755 ??個(gè)人郵箱:2061314755@qq.com ??個(gè)人WeChat:Vir2021GKBS ?? 本文由妄北y原創(chuàng),首發(fā)CSDN ?????? ??座右銘:大多數(shù)人想要改造這個(gè)世界,但卻罕有人想改造自己。 專欄導(dǎo)

    2024年01月19日
    瀏覽(23)
  • Linux 設(shè)備驅(qū)動(dòng)程序(四)

    Linux 設(shè)備驅(qū)動(dòng)程序(四)

    Linux 內(nèi)核設(shè)計(jì)與實(shí)現(xiàn) 深入理解 Linux 內(nèi)核 Linux 設(shè)備驅(qū)動(dòng)程序(一) Linux 設(shè)備驅(qū)動(dòng)程序(二) Linux 設(shè)備驅(qū)動(dòng)程序(三) Linux 設(shè)備驅(qū)動(dòng)程序(四) Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解 深入理解Linux虛擬內(nèi)存管理 ? ? ? ? ? ? ? ? ①②③④⑤⑥⑦⑧⑨⑩???????????????

    2024年02月16日
    瀏覽(20)
  • Linux 驅(qū)動(dòng)開發(fā)基礎(chǔ)知識(shí)——認(rèn)識(shí)LED驅(qū)動(dòng)程序 (二)

    Linux 驅(qū)動(dòng)開發(fā)基礎(chǔ)知識(shí)——認(rèn)識(shí)LED驅(qū)動(dòng)程序 (二)

    ?個(gè)人名片: ??作者簡(jiǎn)介:一名喜歡分享和記錄學(xué)習(xí)的在校大學(xué)生 ??個(gè)人主頁(yè):妄北y ??個(gè)人QQ:2061314755 ??個(gè)人郵箱:2061314755@qq.com ??個(gè)人WeChat:Vir2021GKBS ?? 本文由妄北y原創(chuàng),首發(fā)CSDN ?????? ??座右銘:大多數(shù)人想要改造這個(gè)世界,但卻罕有人想改造自己。 專欄導(dǎo)

    2024年01月21日
    瀏覽(23)
  • Linux驅(qū)動(dòng)實(shí)踐:帶你一步一步編譯內(nèi)核驅(qū)動(dòng)程序

    記得以前我在開始學(xué)習(xí)驅(qū)動(dòng)開發(fā)的時(shí)候,找來(lái)很多文章、資料來(lái)學(xué)習(xí),但是總是覺得缺少了點(diǎn)全局視角。 就好像:我想看清一座山的全貌,但總是被困在一個(gè)、又一個(gè)山谷中一樣。 主要的困惑有?3?點(diǎn): 每一篇文章的介紹都是正確的,但是如果把很多文章放在一起看,就會(huì)

    2023年04月24日
    瀏覽(22)
  • linux的SPI設(shè)備驅(qū)動(dòng)程序

    linux的SPI設(shè)備驅(qū)動(dòng)程序

    ? ? ? ? 串行外設(shè)接口(SPI)是四線總線:MOSI、MISO、串行時(shí)鐘SCK和片選CS。它常用于連接閃存、AD/DA轉(zhuǎn)換器。主設(shè)備生成時(shí)鐘和管理片選CS,速度可達(dá)80MB,遠(yuǎn)超I2C總線。 ? ? ? ? SPI設(shè)備在內(nèi)核中表示為struct spi_device{},管理他們的驅(qū)動(dòng)程序的實(shí)例是struct spi_driver{}。spi的拓?fù)浣Y(jié)構(gòu)

    2024年02月13日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包