文章目录
1 编写驱动程序
本实验例程路径:i.MX6UL终结者光盘资料/06_Linux驱动例程/12_key_poll
创建key_poll.c文件,具体内容如下(在阻塞实验的驱动文件上修改,内容有省略):
1 #include <linux/types.h>
2 #include <linux/kernel.h>
3 #include <linux/delay.h>
......
21 #include <asm/uaccess.h>
22 #include <asm/io.h>
23
24 #define IMX6UIRQ_CNT 1 /* 设备号个数 */
25 #define IMX6UIRQ_NAME "noblockio" /* 名字 */
26 #define KEY0VALUE 0X01 /* KEY0按键值 */
27 #define INVAKEY 0XFF /* 无效的按键值 */
28 #define KEY_NUM 1 /* 按键数量 */
......
178 /*
179 * @description : 从设备读取数据
180 * @param - filp : 要打开的设备文件(文件描述符)
181 * @param - buf : 返回给用户空间的数据缓冲区
182 * @param - cnt : 要读取的数据长度
183 * @param - offt : 相对于文件首地址的偏移
184 * @return : 读取的字节数,如果为负值,表示读取失败
185 */
186 static ssize_t imx6uirq_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
187 {
188 int ret = 0;
189 unsigned char keyvalue = 0;
190 unsigned char releasekey = 0;
191 struct imx6uirq_dev *dev = (struct imx6uirq_dev *)filp->private_data;
192
193 if (filp->f_flags & O_NONBLOCK) {
/* 非阻塞访问 */
194 if(atomic_read(&dev->releasekey) == 0) /* 没有按键按下,返回-EAGAIN */
195 return -EAGAIN;
196 } else {
/* 阻塞访问 */
197 /* 加入等待队列,等待被唤醒,也就是有按键按下 */
198 ret = wait_event_interruptible(dev->r_wait, atomic_read(&dev->releasekey));
199 if (ret) {
200 goto wait_error;
201 }
202 }
......
220 wait_error:
221 return ret;
222 data_error:
223 return -EINVAL