当前位置: 首页 > news >正文

史上最简单的TinkerBoard 2s RK339 GPIO 按键驱动以及嵌入式linux中断编程入门

1 单按键模块的信号线接 TinkerBoard 的物理 21号引脚,通过 gpio readall 命令可以得知此引脚对应的CPU引脚号是39,后面有用。
在这里插入图片描述
从上图可以得知 21号引脚的名称是 GPIO1_A7,
也就是它是rk3399 GPIO 分组1 里面的第8个gpio 口,
查看rk3399的芯片手册的第20章,可以知道 分组1 的基地址是 0xFF730000
,方向寄存器的偏移是 0x0004。 中断寄存器的偏移是 0x0030,
如下所示:

#define GPIO_1_BASE  0xFF730000
#define  GPIO1_SWPORTA_DDR  0xFF730004
#define  GPIO_INTEN   (GPIO_1_BASE + 0x0030)

以下就是具体流程:

1 设置方向寄存器对应的bit位为0,也就是输入。
2 设置方向寄存器对应的bit位为1,也就是启用中断。
3 通过gpio_to_irq获得中断号。
4 调用request_irq(num, key_handler, IRQF_TRIGGER_LOW,
“key”, NULL),注意是低电平触发,key_handler为回调函数。

以下是完整代码:

#include <linux/uaccess.h>
#include <linux/fs.h>
#include <linux/stat.h>
#include <linux/cdev.h>
#include <linux/io.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/init.h> /* Needed for the macros */
#include <linux/kernel.h> /* Needed for pr_info() */
#include <linux/module.h> /* Needed by all modules */
#include <linux/gpio/driver.h>
#include <linux/platform_device.h>
#include <linux/slab.h>

#define  GPIO_PIN  39
#define GPIO_1_BASE  0xFF730000
//#define  GPIO1_SWPORTA_DR GPIO_1_BASE
#define  GPIO1_SWPORTA_DDR  0xFF730004
#define  GPIO_INTEN   (GPIO_1_BASE + 0x0030)

// GPIO1_A7
#define LOCATION  7

irqreturn_t key_handler(int irq, void *dev_id) {
	pr_err("my key_handler   \n");
	return IRQ_HANDLED;
}

const struct file_operations my_fops = { .owner = THIS_MODULE, };

unsigned int num;

static __init int my_init(void) {
	int ret;
	unsigned int __iomem *direction = ioremap(GPIO1_SWPORTA_DDR, 4);
	unsigned int a = readl(direction);
	unsigned int __iomem *irq = ioremap(GPIO_INTEN, 4);

// set direction in
	writel(readl(direction) & (~(1 << LOCATION)), direction);
	//just check
	a = readl(direction);
	pr_err("direction: %d \n", a);

	pr_err("direction 1 or 0  ? : %d \n", (a & (1 << LOCATION)) >> LOCATION);

// enable Interrupt
	writel(readl(irq) | (1 << LOCATION), irq);

	pr_err("Interrupt 1 or 0  ? : %d \n",
		(readl(irq) & (1 << LOCATION)) >> LOCATION);

	num = gpio_to_irq(GPIO_PIN);

	pr_info("irq_num:%d\n",num);

	ret = request_irq(num, key_handler, IRQF_TRIGGER_LOW,
				"hahahhaha", NULL);

	if (ret < 0) {
			pr_err("request_irq  failed \n");
			return ret;
		}
	pr_info(
		"a3 init_module success\n");
	return 0;
}

static void __exit my_exit(void) {
		free_irq(num, NULL);
}

module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Andy");
MODULE_DESCRIPTION("andy one-key driver");
MODULE_ALIAS("one-key");


需要交叉编译,然后scp至开发板,通过sudo insmod 来安装,然后sudo dmesg -w
来查看日志,然后就可以触摸按键测试。
欢迎评论交流.

相关文章:

  • 基于Matlab在以地球为中心的场景中模拟和跟踪航路飞机仿真(附源码)
  • TYUT太原理工大学2022需求工程考试填空题
  • Flink 成长之路简介
  • 软件测试面试,如何自我介绍?如何介绍项目?如何介绍个人技术?(提供面试话术)
  • Vue2 之 Vuex - 状态管理
  • 一篇带你走进Vue+阿里云的uni-app开发(HBuilder X开发版)
  • 高蛋白饮食≠健康 多组学分析揭示植物高蛋白对血糖和肝脏脂质代谢的影响
  • 【HTML+CSS+JS表白网站搭建】520七夕到了,快搭个漂亮的表白网站送给TA吧
  • 【云原生】Elasticsearch + kibana on k8s 讲解与实战操作
  • 10月计算机类SCI合集来了,多领域极速审稿,想要快速录用吗?
  • (9)目标检测_SSD的原理
  • Java反射小练之手写BeanUtils的copyProperties(Upgrade)
  • 千粉缔造760w播放!B站“新人”UP主在B站怎么加速上位?
  • 对于B+树,为什么说一般查找行记录,最多只需1~3次磁盘IO
  • 如何在充满不确定性的当下探索未来?
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular 2 DI - IoC DI - 1
  • css系列之关于字体的事
  • export和import的用法总结
  • Fabric架构演变之路
  • HashMap ConcurrentHashMap
  • interface和setter,getter
  • JavaScript的使用你知道几种?(上)
  • Java应用性能调优
  • Leetcode 27 Remove Element
  • REST架构的思考
  • SQLServer插入数据
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 简单实现一个textarea自适应高度
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信支付JSAPI,实测!终极方案
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 阿里云ACE认证学习知识点梳理
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​什么是bug?bug的源头在哪里?
  • (30)数组元素和与数字和的绝对差
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (八)Flask之app.route装饰器函数的参数
  • (三分钟)速览传统边缘检测算子
  • (转)项目管理杂谈-我所期望的新人
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net/c# memcached 获取所有缓存键(keys)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • @Bean, @Component, @Configuration简析
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [20171106]配置客户端连接注意.txt
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗