for(i = 0; i < ARRAY_SIZE(buttons_set);i++){
free_irq(buttons_set[i].irqno,&buttons_set[i]);
}
device_destroy(button_dev->cls,button_dev->devno);
class_destroy(button_dev->cls);
cdev_del(button_dev->cdev);
unregister_chrdev_region(button_dev->devno,1);
kfree(button_dev);
}
//声明和认证
module_init(button_init);
module_exit(button_exit);
MODULE_LICENSE('GPL');
#include #include #include #include #include #include #include #include #include #include <linux/input.h> //定义一个按键的数据包 struct button_event{ int code; //按键的名称---键值:KEY_DOWN int value; //按键的状态---按下:1,松开:0 }; int main(void) { int fd; int ret; struct button_event event; struct pollfd pfds[2]; char buf[128]; fd = open('/dev/button',O_RDWR); if(fd < 0){ perror('open'); exit(1); } pfds[0].fd = 0; //标准输入文件描述符 pfds[0].events = POLLIN; //是否可读 pfds[1].fd = fd; //开发板中的键盘 pfds[1].events = POLLIN; //按键是否触发中断 while(1){ ret = poll(pfds,2,-1); if(ret < 0){ perror('poll'); exit(1); } if(ret > 0){ //标准输入可读 if(pfds[0].revents & POLLIN){ fgets(buf,sizeof(buf),stdin); printf('%s',buf); } //开发板中的按键触发了中断 if(pfds[1].revents & POLLIN){ bzero(&event,sizeof(event)); ret = read(fd,&event,sizeof(event)); if(ret < 0){ perror('read'); exit(1); } switch(event.code){ case KEY_UP: if(event.value) printf('按下了上键!n'); else printf('松开了上键!n'); break; case KEY_DOWN: if(event.value) printf('按下了下键!n'); else printf('松开了下键!n'); break; case KEY_LEFT: if(event.value) printf('按下了左键!n'); else printf('松开了左键!n'); break; case KEY_RIGHT: if(event.value) printf('按下了右键!n'); else printf('松开了右键!n'); break; } } } } close(fd); return 0; } #指定内核源码路径 KERNEL_DIR = /home/farsight/s5pv210/kernel/linux-3.0.8 CUR_DIR = $(shell pwd) MYAPP = test all: #让make进入内核源码编译,同时将当前目录中的c程序作为内核模块一起编译 make -C $(KERNEL_DIR) M=$(CUR_DIR) modules arm-none-linux-gnueabi-gcc -o $(MYAPP) $(MYAPP).c clean: #删除上面编译生成的文件 make -C $(KERNEL_DIR) M=$(CUR_DIR) clean rm -rf $(MYAPP) install: cp *.ko $(MYAPP) /opt/rootfs/drv_module #指定当前目录下哪个文件作为内核模块编 obj-m = button_drv.o Stay hungry, stay foolish 待续。。。
上一篇:内核提供的读写寄存器接口实现可移植性
下一篇:ARM—配置交叉编译环境
推荐阅读最新更新时间:2026-03-13 14:58
- BGA3015 - 5 至 300MHz、15dB 反向放大器应用
- led-panel:白光LED的LED面板分线板
- EVAL6480H,L6480 大功率步进电机驱动器演示板
- KIT33816FRDMEVM,MC33816 Freedom Board KL25Z 评估套件,喷油器
- STA333BW,用于数字音频功率放大器电视和便携式应用的评估板
- 使用 Analog Devices 的 LTC1439CG 的参考设计
- 使用 2 速时钟的 7.5us 模数转换器
- LDK130C33R 3.3V、300 mA 低静态电流、极低噪声 LDO 的典型应用固定版本电路
- LX7172、1.4MHz、1.2A 同步降压转换器的典型应用
- MIC2755 的典型应用:电池系统监控器



汽车车身电子控制技术
非常经典的关于LLC的杨波博士论文
7662CPA






京公网安备 11010802033920号