i.MX6ULL终结者Linux阻塞和非阻塞IO实验非阻塞IO实验

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值