按键输入实验

  • 一、驱动源码
  • 二、应用源码
  • 三、实验总结

一、驱动源码

硬件原理图

#include "nuc972_gpio.h"#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h> #include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>#define KEY_DEV_NUMS 1
#define KEY_NAME "key"struct key_dev{dev_t devid;int major;int minor;  struct cdev cdev;struct class *class;struct device *device;
};struct key_dev key;/* */
#define SET_DIR 0X0100
#define GET_DIR 0X0200
#define SET_ODR 0X0300
#define GET_ODR 0X0400
#define GET_IDR 0X0500#define GPIOA 0x0000
#define GPIOB 0x0001
#define GPIOC 0x0002
#define GPIOD 0x0003
#define GPIOE 0x0004
#define GPIOF 0x0005
#define GPIOG 0x0006
#define GPIOH 0x0007
#define GPIOI 0x0008
#define GPIOJ 0x0009/* PF13-KEY1 PF14-KEY2 */
static int key_gpio_init(void)
{int temp;int ret = 0;set_gpio_direction(GPIOF,0x0000);return ret;
}static int key_open(struct inode *inode, struct file *filp)
{key_gpio_init();return 0;
}static ssize_t key_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
{int temp;int ret = 0;temp = get_gpio_idr(GPIOF);ret = copy_to_user(buf,&temp,sizeof(temp));return 0;
}static int key_release(struct inode *inode, struct file *filp)
{return 0;
}static struct file_operations key_fops = {.owner = THIS_MODULE,.open = key_open,.read = key_read,.release = key_release,
};static int __init key_init(void)
{int ret = 0; key.major = 0;if(key.major){key.devid = MKDEV(key.major, 0);ret = register_chrdev_region(key.devid,KEY_DEV_NUMS,KEY_NAME);}else{ret = alloc_chrdev_region(&key.devid,0,KEY_DEV_NUMS,KEY_NAME);   key.major = MAJOR(key.devid);key.minor = MINOR(key.devid);}if(ret < 0){printk("register chrdev failed!\r\n");goto fail_devid;}printk("key major = %d, minor = %d \r\n", key.major,key.minor);cdev_init(&key.cdev, &key_fops);key.cdev.owner = THIS_MODULE;ret = cdev_add(&key.cdev, key.devid, KEY_DEV_NUMS);if(ret < 0){printk("cdev_add failed!\r\n");goto fail_cdevadd;}key.class = class_create(THIS_MODULE, KEY_NAME);if(IS_ERR(key.class)){printk("class_create failed!\r\n");ret = PTR_ERR(key.class);goto fail_class;}key.device = device_create(key.class, NULL, key.devid, 0, KEY_NAME);if(IS_ERR(key.device)){printk("device_create failed!\r\n");ret = PTR_ERR(key.device);goto fail_device;}printk("key init success!\r\n");return 0; fail_device:class_destroy(key.class);
fail_class:cdev_del(&key.cdev);
fail_cdevadd:unregister_chrdev_region(key.devid,KEY_DEV_NUMS);
fail_devid:return ret;
}static void __exit key_exit(void)
{device_destroy(key.class,key.devid);class_destroy(key.class);cdev_del(&key.cdev);unregister_chrdev_region(key.devid, KEY_DEV_NUMS);printk("key_exit!\r\n");
}module_init(key_init);
module_exit(key_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("mx");

MakeFile

#
#obj-m += nuc972_gpio.okey-objs  := key_input.o nuc972_gpio.o
obj-m := key.oPWD  := $(shell pwd)
KVER ?= $(shell uname -r)KDIR :=/home/maxuan/linuxbsp/linux-3.10.x
all:$(MAKE) -C $(KDIR) M=$(PWD)
clean:rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

二、应用源码

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "unistd.h"int main(int argc, char *argv[])
{int keyvalue = 0;int destvalue = 0;int fd;int ret = 0;char *filename;if(argc != 2){printf("Error Usage!\r\n");return -1;}filename = argv[1];fd = open(filename,O_RDWR);if(fd < 0){printf("file %s open failed!\r\n",filename);return -1;}destvalue = 1<<13;while(1){keyvalue = 0xffff;read(fd,&keyvalue,sizeof(keyvalue));if(keyvalue & destvalue){}else{printf("KEY1 is pressed!!\r\n");}}close(fd);return 0;
}

三、实验总结

1、能跑起来,没做消抖,先这样吧

【吃灰板子捡起来】按键输入实验相关推荐

  1. 【吃灰板子捡起来】字符设备驱动开发实验

    字符设备驱动开发实验 一.驱动框架 二.Makefile 三.测试程序 四.过程总结 该实验与正点原子教程一致,先将该实验视频过一遍,然后根据文档进行实验. 一.驱动框架 (1)注册驱动 //incl ...

  2. 【吃灰板子捡起来】内核定时器实验

    内核定时器实验 一.相关知识 二.驱动源码 三.APP源码 四.实验总结 一.相关知识 jiffies extern u64 __jiffy_data jiffies_64; extern unsig ...

  3. 【吃灰板子捡起来】新字符设备驱动开发实验

    新字符设备驱动开发实验 一.设备号 二.字符设备 三.设备节点 四.驱动源码 五.总结 一.设备号 定义:/fs/char_dev.c #include <linux/fs.h>/*** ...

  4. 【吃灰板子捡起来】LED驱动开发实验

    LED驱动开发实验 一.地址映射 二.内存访问 三.应用源码 四.驱动源码 五.实验总结 一.地址映射 #include <asm/io.h>#define ioremap(cookie, ...

  5. 【吃灰板子捡起来】酷客NUC972开发板

    文章目录 酷客NUC972开发板 把吃灰一年的板子捡起来. -时间:2022.03.30 酷客NUC972开发板 4.3寸电阻屏套餐

  6. stm32 工业按键检测_「正点原子STM32Mini板资料连载」第七章 按键输入实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上一章,我们介 ...

  7. 判断按键值_ALIENTEK 阿波罗 STM32F767 开发板资料连载第七章 按键输入实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上 ...

  8. ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

    参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/ ...

  9. 【正点原子MP157连载】第十二章 按键输入实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. CVPR2020论文解析:视频分类Video Classification
  2. python求偶奇数和差编程_选择最大奇数Python
  3. Linux驱动学习笔记之并发控制
  4. aspnetboilerplate .net core 使用原生sql
  5. CodeForces - 1036B Diagonal Walking v.2(思维)
  6. 鬼才!用Python计算圆周率 π
  7. linux中swi指令,Linux系统调用、新增系统调用方法
  8. 9月8日全球域名商(国际域名)解析新增量TOP20
  9. 分布式场景下redis已经逐渐取代了memcached,那么各有什么使用场景和优缺点呢?
  10. 使用xml和java代码混合控制UI界面
  11. 2023长安大学物流管理专硕考研成功经验分享
  12. 二十年经典港台电视剧回顾
  13. Linux开发板无法连接ssh
  14. python二元一次方程组用鸡兔同笼的思路来写编程_《应用二元一次方程组——鸡兔同笼》...
  15. Unity3D 游戏摄像机的环绕与拉近
  16. 全球及中国代餐轻食市场发展现状与消费需求前景调研报告2022版
  17. mysql字符集校对_MySQL字符集与校对
  18. 优质的APP推广渠道那么多,怎么选才好?
  19. Unity3D for Android 纹理压缩支持
  20. 华为自带邮箱下载_超级好看的微信气泡主题设置方法介绍教程!仅华为用户拥有!...

热门文章

  1. ubuntu ukylin wineqq 登录时提示:您的号码暂时不能使用低版本的qq
  2. win+R 远程桌面快捷键
  3. SpringCloud微服务治理技术入门
  4. 发现百度百科的cookie更容易理解【手动滑稽】
  5. VUE+ElementUI图片上传的判断格式、大小、尺寸(即宽高比)完整实现。
  6. echarts 刻度线
  7. 毕业季即将到来,码教授为您准备了一份礼物
  8. aect17定义_教育技术学AECT历史定义大全
  9. 放生怎么会一再演变成“放死”?
  10. ubuntu18.04设置静态ip地址(简单版)个人学习使用