亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1431 | 回復(fù): 0
打印 上一主題 下一主題

linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(十二):簡單的數(shù)碼相框 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-02-12 18:38 |只看該作者 |倒序?yàn)g覽
linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(十二):簡單的數(shù)碼相框


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

其實(shí)代碼很簡單,實(shí)現(xiàn)lcd驅(qū)動(dòng),使lcd能夠顯示圖片,當(dāng)按下按鍵后切換圖片。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

先要說明一下幾處地方:

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

#define X 480

#define Y 272

轉(zhuǎn)換的命令也很簡單:

./mkimage src_file dis_file

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


2、我的lcd480*272,即使是同樣的尺寸的lcd,因?yàn)榻泳的不一樣,我也不能保證能夠驅(qū)動(dòng)成功。但是,顯示器的不同也只需要修改lcd配置函數(shù)就可以了。


接下來介紹一下我編寫時(shí)的順序。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


一、實(shí)現(xiàn)lcd的基本操作:12th_lcd/1st


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

1、定義了一個(gè)結(jié)構(gòu)體:struct _lcd_t

2、實(shí)現(xiàn)了lcd即基本操作,包括:

配置lcds3c_lcd_config(struct _lcd_t *lcd)

啟動(dòng)lcds3c_lcd_enabe(struct _lcd_t *lcd)

關(guān)閉lcds3c_lcd_disable(struct _lcd_t *lcd)

3、封裝了lcd設(shè)備的初始化和注銷函數(shù):

init_lcd_device(struct _lcd_t *lcd)

destory_lcd_device(struct _lcd_t *lcd)

其中有一個(gè)我在之前的總結(jié)中沒有介紹的知識(shí)點(diǎn)——DMA編程,簡單的理解就會(huì)調(diào)用一個(gè)函數(shù),函數(shù)給你返回兩個(gè)地址,一個(gè)是虛擬地址,一個(gè)是對(duì)應(yīng)的物理地址。只要你的程序往虛擬地址中讀寫數(shù)據(jù),實(shí)際就會(huì)往物理地址寫數(shù)據(jù)。主要的特點(diǎn)就是:數(shù)據(jù)的傳輸不需要經(jīng)過處理器,而是2440中的DMA負(fù)責(zé)傳輸。具體的以后有機(jī)會(huì)再補(bǔ)充。

其實(shí)就是一個(gè)函數(shù):

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


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


裝載模塊時(shí),會(huì)調(diào)用test_lcd函數(shù)測試是否成功,該函數(shù)會(huì)讓屏幕全紅。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


二、實(shí)現(xiàn)字符型設(shè)備:12th_lcd/2nd


第二個(gè)代碼在原來的基礎(chǔ)上注冊(cè)了雜設(shè)備,并且實(shí)現(xiàn)了write操作,當(dāng)在應(yīng)用層將圖片數(shù)據(jù)寫到設(shè)備文件/dev/test_lcd中,就會(huì)將圖片顯示出來。

大致知識(shí)點(diǎn):

·linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(三):2open.close.read.write

·linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(十):1.udev&misc


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


三、實(shí)現(xiàn)圖片切換:12th_lcd/3rd


第三個(gè)代碼要實(shí)現(xiàn)的功能是:當(dāng)按鍵按下時(shí),應(yīng)用層切換新的圖片傳給lcd。


這里要添加兩個(gè)東西:

1、添加中斷,當(dāng)按鍵按下時(shí)執(zhí)行中斷處理函數(shù)。

2、添加字符設(shè)備的異步通知機(jī)制,在中斷處理函數(shù)發(fā)送信號(hào)到應(yīng)用層,應(yīng)用程序接到信號(hào)后更換圖片。

大致知識(shí)點(diǎn):

·linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(六):1.中斷的實(shí)現(xiàn)


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


四、實(shí)現(xiàn)按鍵去抖:12th_lcd/4th


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

大致知識(shí)點(diǎn):

·linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(七):2.內(nèi)核定時(shí)器


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


五、實(shí)現(xiàn)靜態(tài)平臺(tái)類驅(qū)動(dòng):12th_lcd/5th


其實(shí)就是在原來的程序上加上平臺(tái)類驅(qū)動(dòng)的注冊(cè),然后修改3處的內(nèi)核代碼:

1、arch/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 };

2、arch/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);

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

5 extern struct platform_device s3c_device_lcd_xb;

大致知識(shí)點(diǎn):

·linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(九):1.platform設(shè)備驅(qū)動(dòng)


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


六、實(shí)現(xiàn)字符設(shè)備操作mmap12th_lcd/6th


這個(gè)知識(shí)點(diǎn)我還沒總結(jié),大體上就是在應(yīng)用程序中調(diào)用mmap,驅(qū)動(dòng)就會(huì)把一塊實(shí)際的內(nèi)存地址映射到應(yīng)用層,并返回一個(gè)地址給用戶操作。

具體就是在字符設(shè)備中添加mmap操作。詳細(xì)請(qǐng)看代碼,我就不詳細(xì)介紹了,可以看《LDD3P418。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


七、為驅(qū)動(dòng)添加信號(hào)量:12th_lcd/7th


其實(shí)這一步在這里可以說是多于的,在非搶占單處理器的情況下根本不需要添加防止并發(fā)和競態(tài)的機(jī)制,我這里也只是僅僅加上,當(dāng)是復(fù)習(xí)。

大致知識(shí)點(diǎn):

·linux設(shè)備驅(qū)動(dòng)歸納總結(jié)(四):5.SMP下的競態(tài)和并發(fā)


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx


八、完善代碼:12th_lcd_8th


之前為了代碼看起來短小一點(diǎn),我沒有在代碼中添加錯(cuò)誤操作,如申請(qǐng)中斷號(hào)失敗時(shí)的操作。這里稍稍修改了一下,添加了一下錯(cuò)誤檢查的代碼。


xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP