




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验8-2 键盘中断驱动实验【实验目的】 掌握键盘原理。 熟悉驱动的中断机制。【实验步骤】第一步: 利用vi编辑器,编写一个Keypad.c驱动代码;1、 增加驱动所需的头文件和变量#include #include #include #include #include #include #include #include MODULE_LICENSE(GPL);#define DEVICE_NAMEemdoor_kbd#define KEYVALUE_HAVE 1#define KEYVALUE_NO 0#define KPC_DIR15#define KPC_MAT1private_data;KBD_RET kbd_ret;while(1)if(kbd-kbd_status=KEYVALUE_HAVE) kbd_ret = kbd-kbd_buff; copy_to_user(buffer, &kbd_ret, sizeof(KBD_RET); kbd-kbd_status=KEYVALUE_NO; return sizeof(KBD_RET);elseif (filp-f_flags & O_NONBLOCK) return -EAGAIN;interruptible_sleep_on(&(kbd-wq);if (signal_pending(current)return -ERESTARTSYS;return sizeof(KBD_RET);3、 实现键盘驱动中断服务例程static void Emdoor_isr_kbd(int irq, void *dev_id, struct pt_regs *reg)printk(KERN_EMERGEmdoor_isr_kbd,Interruptn);int kpc_value;KBD_DEV * kbd = (KBD_DEV *) dev_id;spin_lock_irq(&(kbd-lock);kpc_value=KPC;if(kpc_value&KPC_MAT) kbd-kbd_buff=KPAS&0xFF;if(kbd-kbd_buff!=0xFF) switch(kbd-kbd_buff)case 0x0: kbd-kbd_buff=5; break;case 0x1: kbd-kbd_buff=6; break;case 0x2: kbd-kbd_buff=7; break;case 0x5: kbd-kbd_buff=8; break;case 0x10: kbd-kbd_buff=9; break;case 0x11: kbd-kbd_buff=10; break;case 0x12: kbd-kbd_buff=11; break;case 0x15: kbd-kbd_buff=12; break;case 0x20: kbd-kbd_buff=13; break;case 0x21: kbd-kbd_buff=14; break;case 0x22: kbd-kbd_buff=15; break;case 0x25: kbd-kbd_buff=16; break;default: break;kbd-kbd_status=KEYVALUE_HAVE;else if(kpc_value&KPC_DIR)kbd-kbd_buff=KPDK&0xFF;if(kbd-kbd_buff!=0x0) switch(kbd-kbd_buff)case 0x40: kbd-kbd_buff=1; break;case 0x2: kbd-kbd_buff=2; break;case 0x4: kbd-kbd_buff=3; break;case 0x20: kbd-kbd_buff=4; break;default: break;kbd-kbd_status=KEYVALUE_HAVE;if ( fasync )kill_fasync( &(fasync), SIGIO, POLL_IN );wake_up_interruptible(&(kbd-wq);spin_unlock_irq(&(kbd-lock);4、 实现键盘驱动设备打开操作函数static int Emdoor_kbd_open(struct inode *inode, struct file *filp)int ret;printk(KERN_EMERG Emdoor_kbd_open!n);KBD_DEV * kbd;kbd =(KBD_DEV *) kmalloc(sizeof(KBD_DEV ), GFP_KERNEL);KPC=KPC_ASACT | (326) | (723 ) | KPC_IMKP | KPC_MS6 | KPC_MS5 |KPC_MS4 | KPC_MS3 | KPC_MS2 | KPC_MS1 | KPC_MS0 | KPC_ME |KPC_MIE | (7wq);pxa_gpio_mode(94 | GPIO_ALT_FN_1_IN);/KP_DKINpxa_gpio_mode(95 | GPIO_ALT_FN_1_IN);/KP_DKINpxa_gpio_mode(98 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(99 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(100 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(101 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(102 | GPIO_ALT_FN_1_IN);pxa_gpio_mode(103 | GPIO_ALT_FN_2_OUT);/KP_MKOUTpxa_gpio_mode(104 | GPIO_ALT_FN_2_OUT);/KP_MKOUTpxa_gpio_mode(105 | GPIO_ALT_FN_2_OUT);/KP_MKOUTpxa_gpio_mode(108 | GPIO_ALT_FN_2_OUT);/KP_MKOUTkbd-kbd_status=KEYVALUE_NO;filp-private_data=kbd;ret = request_irq(IRQ_KEYPAD, Emdoor_isr_kbd, SA_INTERRUPT, DEVICE_NAME, kbd);if (ret) printk(KERN_EMERG Interrupt init=%x!n,ret); return ret;return 0;5、 实现键盘驱动select和poll操作函数static unsigned int Emdoor_kbd_poll(struct file *filp,struct poll_table_struct *wait)printk(KERN_EMERG Emdoor_kbd_poll!n);KBD_DEV * kbd=filp-private_data;poll_wait(filp,&(kbd-wq),wait);return (kbd-kbd_status=KEYVALUE_HAVE) ? (POLLIN|POLLRDNORM): 0 ;static int Emdoor_kbd_release(struct inode *inode, struct file *filp) printk(KERN_EMERG Emdoor_kbd_release!n);KBD_DEV * kbd = filp-private_data;KPC=0x0;Emdoor_kbd_fasync(-1, filp, 0);kfree(kbd );free_irq(IRQ_KEYPAD, kbd);return 0;6、 实现键盘驱动非阻塞访问操作函数static int Emdoor_kbd_fasync(int fd, struct file * file, int mode)return fasync_helper(fd, file, mode, &(fasync) );7、 键盘驱动文件结构体定义static struct file_operations Keypad_fops = open:Emdoor_kbd_open,read:Emdoor_kbd_read,release:Emdoor_kbd_release,poll:Emdoor_kbd_poll,fasync:Emdoor_kbd_fasync,owner:THIS_MODULE,;8、 键盘驱动初始化函数定义static int _init Emdoor_kbd_init(void)printk(KERN_EMERG Emdoor_kpd initializedn);int ret;ret = register_chrdev(62, DEVICE_NAME, &Keypad_fops);if (ret 0) printk(DEVICE_NAME cant get major numbern);return ret;free_irq(IRQ_KEYPAD,NULL);udelay(10);return 0;9、 键盘驱动退出函数定义static void _exit Emdoor_kbd_exit(void)printk(KERN_EMERG Emdoor_kpd exitn);unregister_chrdev(62, DEVICE_NAME);module_init(Emdoor_kbd_init);module_exit(Emdoor_kbd_exit);MODULE_AUTHOR(B);MODULE_DESCRIPTION(This is a Keypad driver demo); 第二步: 利用vi编辑器,编写一个用于编译Keypad驱动的Makefile# Makefile for the Keypad. #CFLAGS +=$(DEBFLAGS) -Wallifneq ($(KERNELRELEASE),)obj-m :=Keypad.oelseKERNELDIR ?=/root/work/linux-2.6.9PWD :=$(shell pwd)ALL:$(MAKE) $(CFLAGS) -C $(KERNELDIR) M=$(PWD) modulesendifclean:rm -fr *.o *.ko * core .depend .*.cmd *.mod.c .tmp_versions第三步: 运行make编译命令,用ls命令查看编译后的结果,在该目录中应生成Keypad.ko模块文件,利用file命令查看Keypad.ko文件的格式,应为ARM格式的ELF文件。【图8-2-1】第四步: 利用vi编辑器在test目录下编译测试驱动的Keypad_test.c源文件。#include #include #include #include #include #include #include int fd, fd_max;fd_set readfds;void handle();int main(void) fd=-1; long oflags; fd= open(/dev/emdoor_kbd,O_RDWR); if(fd0) printf(Keypad device open success!n); else printf(Keypad device open fail!n); return 0; fd_max = fd; signal(SIGIO, &handle); fcntl(fd, F_SETOWN, getpid(); oflags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, oflags | FASYNC); printf(Please press the keypad:n); while(1) ; void handle() char buf=0; FD_ZERO(&readfds); FD_SET(fd, &readfds); select(fd_max + 1, &readfds, NULL, NULL, NULL); if ( FD_ISSET(fd, &readfds) read(fd, &buf, sizeof(char); printf(Scancode is 0x%08xn, buf); 第五步: 利用vi编辑器,编写一个用于编译Keypad_test.c的Makefile文件;其中CC = arm-linux-gcc为交叉编译工具所在的路径位置,INCLUDEDIR = /usr/local/xscalev1/arm-linux/include为头文件所在的路径 # Makefile for Keypad test#CC = /opt/xscalev1/bin/arm-linux-gccINCLUDEDIR = /usr/local/xscalev1/arm-linux/includeCFLAGS = -Wall -I. -I$(INCLUDEDIR)TARGET_TEST=Keypad_testOBJ_TEST = $(TARGET_TEST)SOURCE_TEST = $(TARGET_TEST).cALL: $(CC) $(CFLAGS) -o $(OBJ_TEST) $(SOURCE_TEST)clean:rm -rf $(OBJ_TEST)第六步: 运行mak
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程项目方案评估(3篇)
- 2025年中高压变量叶片泵项目合作计划书
- 培训采访题目及答案
- 2025年三年级品社试卷及答案
- 中医妇科科普讲座题目及答案
- 物流四级考试试题及答案
- 幼儿游戏课程题库及答案
- 2025年五人制考试试题及答案
- 富士山课件时间
- 劳动社会学理论知识考核测试试题及答案
- 高三生物一轮复习课件病毒 微专题
- 畲族民俗文化课件
- 2025-2030男装市场市场现状供需分析及投资评估规划分析研究报告
- 航海概论航海技术臧继明课件
- 急性脑梗死静脉溶栓护理查房
- 2024年中国农业银行秋季校园招聘考试真题及答案
- 乡村医生药品管理培训
- 医院培训课件:《危重病人心电监测》
- 医院规培合同范本
- 银行贷款电子合同电子版(2025年版)
- 非物质文化遗产微短剧叙事策略与文化传承路径研究
评论
0/150
提交评论