矩陣鍵盤驅(qū)動開發(fā)實(shí)驗報告_第1頁
矩陣鍵盤驅(qū)動開發(fā)實(shí)驗報告_第2頁
矩陣鍵盤驅(qū)動開發(fā)實(shí)驗報告_第3頁
矩陣鍵盤驅(qū)動開發(fā)實(shí)驗報告_第4頁
矩陣鍵盤驅(qū)動開發(fā)實(shí)驗報告_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、實(shí)驗報告書實(shí)驗名稱: 矩陣鍵盤驅(qū)動開發(fā)實(shí)驗 專業(yè)班級: 學(xué) 號: 姓 名: 聯(lián)系電話: 指導(dǎo)老師: 實(shí)驗時間: 2014年11月13日 計算機(jī)學(xué)院 計算機(jī)科學(xué)與技術(shù)一、實(shí)驗?zāi)康?、掌握 44 鍵盤驅(qū)動的寫法;2、深入了解 linux 驅(qū)動架構(gòu)。二、實(shí)驗設(shè)備1、裝有 Linux 系統(tǒng)或裝有Linux 虛擬機(jī)的PC 機(jī)一臺;2、凌陽 ARM9 嵌入式實(shí)驗箱SP-32AM11A 一臺;3、S3C2410 CPU 核心板一塊;4、本實(shí)驗用到實(shí)驗箱的模塊有:S3C2410 CPU 板模塊、44 鍵盤模塊。三、實(shí)驗要求1、實(shí)現(xiàn)功能:編寫 44 鍵盤驅(qū)動,并將鍵值通過控制臺打印出來;2、實(shí)驗現(xiàn)象:每個鍵值通

2、過控制臺打印出來。四、實(shí)驗原理1、硬件原理本實(shí)驗箱采用GPF07 連接44 鍵盤,其中GPF03 與K1K4 連接,GPF47 與KAKD連接,分別用于控制44 鍵盤的縱列和橫列。硬件連接如圖 6.2所示。44 鍵盤一般采用行列掃描方法獲取鍵值,為了進(jìn)一步提高驅(qū)動程序的效率,這里結(jié)合外部中斷獲取鍵值。GPF 組IO 端口都有外部中斷功能,設(shè)置GPF03 為上升沿觸發(fā)外部中斷,設(shè)置GPF47輸出高電平,這樣當(dāng)有任何一個按鍵按下的時候,按鍵所在列對應(yīng)的GPIO 端口就會觸發(fā)外部中斷,由外部中斷服務(wù)程序判斷具體是哪個按鍵被按下。2、外部中斷S3C2410 處理器集成了外部中斷功能,所謂外部中斷是指處

3、理器中具有觸發(fā)中斷功能GPIO,當(dāng)GPIO 出現(xiàn)電平變動時會觸發(fā)中斷。觸發(fā)中斷的方式有多種,比如高電平觸發(fā)低電平觸發(fā)、上升沿觸發(fā),下降沿觸發(fā)等。S3C2410 處理器中具有外部中斷功能的GPIO 每一位都可以單獨(dú)設(shè)定中斷觸發(fā)方式,以滿足不同的需要。在44 鍵盤驅(qū)動中,使用上升沿沿觸發(fā)中斷的方式,當(dāng)按鍵按下時外部中斷被觸發(fā)獲得一次鍵值。在linux 系統(tǒng)中對外部中斷提供了比較好的支持,可以通過以下的函數(shù)設(shè)置外部中斷。【函數(shù)原型】int request_irq(unsigned int irq, void (*handler)(int, void *, struct pt_regs *),unsi

4、gned long irq_flags,const char * devname,void *dev_id)【功 能】 申請中斷【參 數(shù)】 irq:要申請的硬件中斷號handler:向系統(tǒng)登記的中斷處理函數(shù),當(dāng)中斷發(fā)生時,系統(tǒng)調(diào)用這個函數(shù)irqflags:中斷處理的屬性,若設(shè)置了SA_INTERRUPT,則表示中斷處理函數(shù)是快速處理函數(shù);若設(shè)置為SA_SHIRQ 則表示多個設(shè)備共享中斷devname:設(shè)備標(biāo)識字符串dev_id在中斷共享時用到,用于標(biāo)識不同的中斷響應(yīng)?!痉?回 值】成功返回0,失敗返回錯誤碼【函數(shù)原型】int set_external_irq(int irq, int edge

5、, int pullup)【功 能】設(shè)置外部中斷的中斷觸發(fā)方式【參 數(shù)】 irq: 外部中斷號edge:設(shè)置外部中斷觸發(fā)類型pullup:設(shè)置GPIO 上拉或下拉【返 回 值】成功返回0,失敗返回錯誤碼【函數(shù)原型】int disable_irq(int irq)【功 能】禁止外部中斷【參 數(shù)】 irq: 外部中斷號【返 回 值】成功返回0,失敗返回錯誤碼【函數(shù)原型】int enable_irq(int irq)【功 能】使能外部中斷【參 數(shù)】 irq: 外部中斷號【返 回 值】成功返回0,失敗返回錯誤碼【函數(shù)原型】void free_irq(unsigned int irq, void *de

6、v_id)【功 能】釋放外部中斷【參 數(shù)】 irq: 外部中斷號dev_id: 在中斷共享時會用到,用于標(biāo)識不同的中斷,這個參數(shù)要和request_irq函數(shù)中的參數(shù)dev_id 相同【返 回 值】成功返回0,失敗返回錯誤碼3、44 鍵盤驅(qū)動架構(gòu)44 鍵盤驅(qū)動通過全局?jǐn)?shù)據(jù)緩沖隊列實(shí)現(xiàn)在中斷服務(wù)程序和讀取函數(shù)之間數(shù)據(jù)傳遞,鍵值數(shù)據(jù)轉(zhuǎn)移流程如圖 6.3所示。五、實(shí)驗步驟1、實(shí)驗指導(dǎo)書附帶的源碼中已經(jīng)提供了鍵盤的驅(qū)動,驅(qū)動程序源碼的路徑為:driversgpf44Keyboard,里面包含了鍵盤驅(qū)動程序和測試程序,可以使用下面的命令編譯該驅(qū)動程序。其中,-I 參數(shù)后面的斜體部分需要換成實(shí)際的Linu

7、x 源碼路徑。arm-linux-gcc c I/root/kernel/include D_KERNEL_ s3c2410-gpf-keyboard.co s3c2410-gpf-keyboard.o / 編譯驅(qū)動arm-linux-gcc test.c -o test / 編譯應(yīng)用程序2、執(zhí)行上面的命令后,將生成的 s3c2410-gpf-keyboard.o、test 復(fù)制到目標(biāo)板上,增加執(zhí)行權(quán)限,然后使用下面的命令將驅(qū)動程序插入到目標(biāo)Linux 系統(tǒng)的內(nèi)核中,由于在驅(qū)動程序中已經(jīng)使用devfs 為自己創(chuàng)建了設(shè)備文件節(jié)點(diǎn),所以這里無需再使用mknod 命令。最后運(yùn)行測試程序test,按下

8、不同的鍵觀察串口輸出。insmod s3c2410-gpf-keyboard.ochmod +x test./test注意: 按鍵使用的GPF0 與網(wǎng)絡(luò)模塊復(fù)用,應(yīng)將網(wǎng)絡(luò)模塊跳線J8 斷開六、實(shí)驗內(nèi)容1.代碼:驅(qū)動程序:/*= 工程名稱:ex25_4MUL4keyboard_gpf 組成文件:key44_driver.c 功能描述: 實(shí)現(xiàn)帶中斷及定時器的2*3鍵盤,通過管道緩存鍵值,知識點(diǎn)的綜合應(yīng)用 硬件連接:GPF00與鍵盤行相連,GPF24與鍵盤列相連 維護(hù)記錄:2010-08-24 v1.1add by dxh=*/#include /*module_init()*/#include /

9、* printk() */#include /* _init _exit */#include /* file_operation */#include /* copy_to_user, copy_from_user */#include /*class ,class_create ,device_create 等*/#include /* Error number */#include /* mdelay ,ndelay*/#include /* udelay */#include /*S3C2410_GPGCON*/#include /*S3C24XX_VA_GPIO*/#include

10、/set_irq_type ,IRQ_TYPE_EDGE_FALLING#include /IRQ_EINT2#include /request_irq , free_irq#include /#define DEBUG/open debug message#ifdef DEBUG#define PRINTK(fmt, arg.)printk(KERN_WARNING fmt, #arg)#else#define PRINTK(fmt, arg.)printk(KERN_DEBUG fmt, #arg)#endif#define DRIVER_NAMEkey44_eint/#define KE

11、Y1_IRQ IRQ_EINT0/#define KEY2_IRQ IRQ_EINT1/#define KEY3_IRQ IRQ_EINT2/#define KEY4_IRQ IRQ_EINT3#define KEY1_IRQ IRQ_EINT16#define KEY2_IRQ IRQ_EINT17#define KEY3_IRQ IRQ_EINT18#define KEY4_IRQ IRQ_EINT19#define GPFCON (*(volatile unsigned long *)S3C2410_GPGCON)/ADC control#define GPFDAT (*(volatil

12、e unsigned long *)S3C2410_GPGDAT)/ADC touch screen control#define GPFUP (*(volatile unsigned long *)S3C2410_GPGUP)/ADC start or Interval Delaystatic int MAJOR_NR = 0;/* Driver Major Number */static int MINOR_NR = 0;/次設(shè)備起始號struct class *my_class;static struct semaphore readable;/定義信號量#define BUFFER_S

13、IZE16/定義fifo的大小為16static struct kfifo kbuffer;/定義一個fifo變量#define INVALID_KEY0xFFtypedef unsigned char KEYVALUE;static irqreturn_t key44_irqsrv(int irq, void *dev_id);/*request irqs*/static void register_irqs(void)int err = 0;err = request_irq(KEY1_IRQ,&key44_irqsrv,IRQF_DISABLED,KEY1, (void *)0);PRI

14、NTK(nkeyDriver_open int0 %dn,err);err = request_irq(KEY2_IRQ,&key44_irqsrv,IRQF_DISABLED,KEY2, (void *)1);PRINTK(keyDriver_open int1 %dn,err);err = request_irq(KEY3_IRQ,&key44_irqsrv,IRQF_DISABLED,KEY3, (void *)2);PRINTK(keyDriver_open int2 %dn,err);err = request_irq(KEY4_IRQ,&key44_irqsrv,IRQF_DISA

15、BLED,KEY4, (void *)3);PRINTK(keyDriver_open int3 %dn,err);static int release_irqs(void) free_irq(KEY1_IRQ, (void *)0);free_irq(KEY2_IRQ, (void *)1);free_irq(KEY3_IRQ, (void *)2);free_irq(KEY4_IRQ, (void *)3); return 0;/*open the irq_eint*/static void open_irqs(void)enable_irq(KEY1_IRQ);enable_irq(KE

16、Y2_IRQ);enable_irq(KEY3_IRQ);enable_irq(KEY4_IRQ); /*close the irq_eint*/static void close_irqs(void)disable_irq_nosync(KEY1_IRQ);disable_irq_nosync(KEY2_IRQ);disable_irq_nosync(KEY3_IRQ);disable_irq_nosync(KEY4_IRQ);static void init_keyIO(void)PRINTK(in init_keyIO!n);unsigned short data = 0;unsigne

17、d int config = 0;unsigned short up = 0; GPFCON &=(0x0315*2) | (0x0314*2) | (0x0313*2) | (0x0312*2); /清GPF12-15位 GPFCON &=(0x0311*2) | (0x0310*2) | (0x039*2) | (0x038*2); /清GPF8-12位GPFCON |= (0x028*2) | (0x029*2) | (0x0210*2) | (0x0211*2);/gpf4-7設(shè)置為輸出GPFCON |= (0x0115*2) | (0x0114*2) | (0x0113*2) | (

18、0x0112*2);set_irq_type(KEY1_IRQ,IRQ_TYPE_EDGE_FALLING);set_irq_type(KEY2_IRQ,IRQ_TYPE_EDGE_FALLING);set_irq_type(KEY3_IRQ,IRQ_TYPE_EDGE_FALLING);set_irq_type(KEY4_IRQ,IRQ_TYPE_EDGE_FALLING);/GPFUP &= (0x01) | (0x011) | (0x012) |(0x013) | (0x014) | (0x015) | (0x016) |(0x017);GPFUP &= (0x018) | (0x019

19、) | (0x0110) | (0x0111) | (0x0112) | (0x0113) | (0x0114) | (0x0115);GPFDAT &= (0x0112) | (0x0113) | (0x0114) | (0x0115);data = GPFDAT;config = GPFCON;up = GPFUP;PRINTK(init_keyIO data is 0x%x; config is %x; up is %x, data, config, up);static void revs_keyIO(int row)PRINTK(in revs_keyIO!n);PRINTK(rev

20、s_keyIO the row is %dn, row);GPFCON &= (0x0315*2) | (0x0314*2) | (0x0313*2) | (0x0312*2); GPFCON &= (0x0311*2) | (0x0310*2) | (0x039*2) | (0x038*2);GPFCON |= (0x0111*2) | (0x0110*2) | (0x019*2)| (0x018*2);GPFUP &= (0x0112) | (0x0113) | (0x0114) | (0x0115);GPFUP |= (0x018) | (0x019) | (0x0110) | (0x0

21、111);GPFDAT |= (0x0111 )| (0x0110) | (0x019) | (0x01 8);GPFDAT = (0x01 12;PRINTK(line=%d!n,line);return keyMaprowline;/*the interrupt deal function*/static irqreturn_t key44_irqsrv(int irq, void *dev_id)KEYVALUE key;PRINTK(in irqsrv!n);close_irqs();/關(guān)外部中斷PRINTK(row=%d!n,(int)dev_id);key = key_scan(i

22、nt)dev_id);PRINTK(key44_irqsrv key value is %dn, key);if(key!=INVALID_KEY)kfifo_in(&kbuffer,&key,sizeof(key);up(&readable);udelay(1000);init_keyIO();open_irqs();return 0;static int keyDriver_open(struct inode *inode, struct file *file)int err;sema_init(&readable,0);err=kfifo_alloc(&kbuffer,BUFFER_SI

23、ZE,GFP_KERNEL);if(err!=0)PRINTK(kfifo alloc failed!n);return -ENOMEM;init_keyIO();/初始化io口/申請外部中斷register_irqs();return 0;static int keyDriver_read(struct file *filp, char _user *buff, size_t count, loff_t *offp)int ret = 0;KEYVALUE key;if(down_interruptible(&readable) != 0)return 0;if(kfifo_len(&kbu

24、ffer) = sizeof(key)ret = count sizeof(key) ? sizeof(key) : count;if(kfifo_out(&kbuffer, &key, sizeof(key)!=0)ret=copy_to_user(buff, &key, ret);return ret;static int keyDriver_release(struct inode *inode, struct file *file)PRINTK(myDriver release called!n);close_irqs();if(release_irqs()=0)PRINTK(irq

25、free succeed!n);kfifo_free(&kbuffer);return 0;/* Driver Operation structure */static struct file_operations keyDriver_fops = .owner = THIS_MODULE,.read = keyDriver_read,.open = keyDriver_open,.release = keyDriver_release,;static int _init myModule_init(void)PRINTK(keyDriver_initn);/* Driver register */MAJOR_NR = r

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論