日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框

發布時間:2025/3/20 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
linux設備驅動歸納總結(十二):簡單的數碼相框


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

其實代碼很簡單,實現lcd驅動,使lcd能夠顯示圖片,當按下按鍵后切換圖片。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

先要說明一下幾處地方:

1、代碼中顯示的圖片都是*.bin文件(顯示模式是使用16位數據來表示一個像素的顏色——5:6:5),將jpg文件轉為*.bin文件的工具在我上傳的mkimage目錄中。轉換圖片的尺寸在fb.h中指定,我的圖片是480*272,所以:

#define X 480

#define Y 272

轉換的命令也很簡單:

./mkimage src_file dis_file

源代碼都上傳了,自己摸索,源碼面前沒有秘密。?mkimage.rar???


2、我的lcd480*272,即使是同樣的尺寸的lcd,因為接線的不一樣,我也不能保證能夠驅動成功。但是,顯示器的不同也只需要修改lcd配置函數就可以了。


接下來介紹一下我編寫時的順序。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


一、實現lcd的基本操作:12th_lcd/1st


代碼具體做了以下幾件事:

1、定義了一個結構體:struct _lcd_t

2、實現了lcd即基本操作,包括:

配置lcds3c_lcd_config(struct _lcd_t *lcd)

啟動lcds3c_lcd_enabe(struct _lcd_t *lcd)

關閉lcds3c_lcd_disable(struct _lcd_t *lcd)

3、封裝了lcd設備的初始化和注銷函數:

init_lcd_device(struct _lcd_t *lcd)

destory_lcd_device(struct _lcd_t *lcd)

其中有一個我在之前的總結中沒有介紹的知識點——DMA編程,簡單的理解就會調用一個函數,函數給你返回兩個地址,一個是虛擬地址,一個是對應的物理地址。只要你的程序往虛擬地址中讀寫數據,實際就會往物理地址寫數據。主要的特點就是:數據的傳輸不需要經過處理器,而是2440中的DMA負責傳輸。具體的以后有機會再補充。

其實就是一個函數:

void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)


注意:如果顯示屏不一樣的話,就要修改s3c_lcd_config里面的代碼。


裝載模塊時,會調用test_lcd函數測試是否成功,該函數會讓屏幕全紅。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


二、實現字符型設備:12th_lcd/2nd


第二個代碼在原來的基礎上注冊了雜設備,并且實現了write操作,當在應用層將圖片數據寫到設備文件/dev/test_lcd中,就會將圖片顯示出來。

大致知識點:

·linux設備驅動歸納總結(三):2open.close.read.write

·linux設備驅動歸納總結(十):1.udev&misc


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


三、實現圖片切換:12th_lcd/3rd


第三個代碼要實現的功能是:當按鍵按下時,應用層切換新的圖片傳給lcd


這里要添加兩個東西:

1、添加中斷,當按鍵按下時執行中斷處理函數。

2、添加字符設備的異步通知機制,在中斷處理函數發送信號到應用層,應用程序接到信號后更換圖片。

大致知識點:

·linux設備驅動歸納總結(六):1.中斷的實現


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


四、實現按鍵去抖:12th_lcd/4th


在上面的程序,如果硬件本身不好的話,按下一次的按鍵可能產生多次的中斷,所以按鍵去抖很有必要。實現很簡單,就是添加一個定時器。

大致知識點:

·linux設備驅動歸納總結(七):2.內核定時器


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


五、實現靜態平臺類驅動:12th_lcd/5th


其實就是在原來的程序上加上平臺類驅動的注冊,然后修改3處的內核代碼:

1arch/arm/mach-s3c2440/mach-mini2440.c

250 static struct platform_device *mini2440_devices[] __initdata = {

251 &s3c_device_usb,

252 &s3c_device_rtc,

253 &s3c_device_lcd,

254 &s3c_device_wdt,

255 &s3c_device_led,

256 &s3c_device_wdt_xb,

257 &s3c_device_lcd_xb, //這是新添加的

258 &s3c_device_i2c0,

259 &s3c_device_iis,

260 &s3c_device_dm9k,

261 &net_device_cs8900,

262 &s3c24xx_uda134x,

263 };

2arch/arm/plat-s3c24xx/devs.c

405 static struct resource s3c_lcd_xb_resource[] = {

406 [0] = {

407 .start = 0x4d000000,

408 .end = 0x4d0000ff,

409 .flags = IORESOURCE_MEM,

410 },

411 [1] = {

412 .start = 0x56000000,

413 .end = 0x560000ff,

414 .flags = IORESOURCE_MEM,

415 },

416 [2] = {

417 .start = IRQ_EINT1,

418 .end = IRQ_EINT1,

419 .flags = IORESOURCE_IRQ,

420 }

421 };

422

423 struct platform_device s3c_device_lcd_xb = {

424 .name = "s3c_lcd_xb",

425 .id = -1,

426 .num_resources = ARRAY_SIZE(s3c_lcd_xb_resource),

427 .resource = s3c_lcd_xb_resource,

428 };

429

430 EXPORT_SYMBOL(s3c_device_lcd_xb);

3arch/arm/plat-s3c/include/plat/devs.h

5 extern struct platform_device s3c_device_lcd_xb;

大致知識點:

·linux設備驅動歸納總結(九):1.platform設備驅動


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


六、實現字符設備操作mmap12th_lcd/6th


這個知識點我還沒總結,大體上就是在應用程序中調用mmap,驅動就會把一塊實際的內存地址映射到應用層,并返回一個地址給用戶操作。

具體就是在字符設備中添加mmap操作。詳細請看代碼,我就不詳細介紹了,可以看《LDD3P418


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


七、為驅動添加信號量:12th_lcd/7th


其實這一步在這里可以說是多于的,在非搶占單處理器的情況下根本不需要添加防止并發和競態的機制,我這里也只是僅僅加上,當是復習。

大致知識點:

·linux設備驅動歸納總結(四):5.SMP下的競態和并發


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


八、完善代碼:12th_lcd_8th


之前為了代碼看起來短小一點,我沒有在代碼中添加錯誤操作,如申請中斷號失敗時的操作。這里稍稍修改了一下,添加了一下錯誤檢查的代碼。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

源代碼:?12th_lcd_1.rar???12th_lcd_2.rar????

轉載于:https://www.cnblogs.com/huty/p/8518546.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。