arm9按键驱动:查询的方式获取按键值

本文详细介绍了一种基于Linux内核的嵌入式按键驱动设计方法。内容包括驱动框架搭建、硬件操作配置及应用程序实现。重点讲解了file_operation结构体使用、设备节点自动创建过程、按键IO口初始化和读取电平的方法。
摘要由CSDN通过智能技术生成

一  . 驱动框架:

                       ①file_operation结构体,里面包含open,read,write等操作函数

                       ②写出open,read,write等函数

                       ③结构体要告诉内核,所以要写入口函数,最重要的是register_chrdev(设备号,“设备名”,&xxx_drv_fops)

                       ④对入口函数继续宁修饰后,让内核识别  module_init (xxx_drv_init)

                       ⑤对应的入口函数,同样需要出口函数,unregister_chrdev(设备号,“设备名”)

                       ⑥对出口函数的修饰module_exit(xxx_drv_exit)

                       ⑦内核自动分配设备号。方法:创建一个全局变量 int major 将注册函数中的设备号写0  major=register/_chrdev(0,"设备名",&xxx_drv_fops)

                      ⑧利用mdev机制,可以自动创建设备节点,根据内核自动分配的设备号

                       方法:创建一个类          static struct class *xxxx_class;   
                                                                 static struct class_device    *xxxx_class_dev;  在类下面创建一个设备

                     seconddrv_class = class_create(THIS_MODULE, "xxx");      xxx代表类名  创建一个类
                     seconddrv_class_dev = class_device_create(seconddrv_class, NULL, MKDEV(major, 0), NULL, "aaa");  在类下面创建一个设备  aaa设备名

                     这个要写在入口函数中

                     ⑨相应的在出口函数中要删除相应的类              class_device_unregister(seconddrv_class_dev);
                                                                                                       class_destroy(seconddrv_class);

二 .硬件操作:

                  ①看原理图,在这里看原理图中按键所对应的IO口     EINT0   GPF0  EINT2  GPF2   EINT11  GPG3  EINT19  GPG19

                  ②看2440手册  操作寄存器  GPXCON和GPXDAT

                  ③写代码:a.单片机程序是直接操作物理地址 b.驱动程序操作虚拟地址    虚拟地址就用到ioremap(地址,长度)对物理地址进行映射在入口函数中。对应的在出口函数

                  中要将映射的地址取消iounmap

                  ④在open函数中要将IO口设置为输入模式   输入模式对应的位为 00 例:*gpfcon &=~((0x3<<(0*2))|(0x3<<(2*2)))  所以GPF0和GPF2设置为输入模式

                  ⑤在相应的read函数中写读按键电平的程序  重要的语句:unsigned long    copy_to_user(void __user *to, const void *from, unsigned long n)  实现将内核的数据传入到用户空间  可以将读到的相应引脚的电平存入数组中传给应用函数


三.应用函数

               ①fd = open("/dev/buttons", O_RDWR);

               ②read(fd, key_vals, sizeof(key_vals));   将驱动程序中的数组传入到应用程序中的数组中  
用while死循环的形式实现按键的查询


总结:查询读模式对CPU占用很大在arm板上可以后台运行查看    例:seconddrvtest &        top便可查看



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值