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

11.8代码

利用gpiod子系统实现开发板六盏灯,安装驱动点亮,卸载驱动熄灭

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/gpio/consumer.h>
/*myleds{core-leds{leds = <&gpioz 5 0>,<&gpioz 6 0>,<&gpioz 7 0>;};extend-leds{led1 = <&gpioe 10 0>;led2 = <&gpiof 10 0>;led3 = <&gpioe 8 0>;};};
*/
struct device_node *node;
struct device_node *core_node;
struct device_node *extend_node;
struct gpio_desc *core_desc[3];
struct gpio_desc *extend_desc[3];
char *extend_leds[3] = {"led1", "led2", "led3"};
// 入口
static int __init demo_init(void)
{int i;// 获取父结点node = of_find_node_by_path("/myleds");if (node == NULL){printk("of_find_node_by_path is error\n");return -EIO;}// 获取core子节点core_node = of_get_child_by_name(node, "core-leds");if (core_node == NULL){printk("core of_get_child_by_name is error\n");return -EIO;}// 获取extend子节点extend_node = of_get_child_by_name(node, "extend-leds");if (node == NULL){printk("extend of_get_child_by_name is error\n");return -EIO;}for (i = 0; i < 3; i++){// 获取gpio结构体core_desc[i] = gpiod_get_from_of_node(core_node, "leds", i, GPIOD_OUT_HIGH, NULL);// 申请gpio编号gpiod_get_value(core_desc[i]);// 设置gpio输出为1gpiod_direction_output(core_desc[i], 1);}for (i = 0; i < 3; i++){// 获取gpio结构体extend_desc[i] = gpiod_get_from_of_node(extend_node, extend_leds[i], 0, GPIOD_OUT_HIGH, NULL);// 申请gpio编号gpiod_get_value(extend_desc[i]);// 设置gpio输出为1gpiod_direction_output(extend_desc[i], 1);}return 0;
}
// 出口
static void __exit demo_exit(void)
{int i;for (i = 0; i < 3; i++){// 设置gpio输出为0gpiod_direction_output(core_desc[i], 0);// 释放gpio编号gpiod_put(core_desc[i]);}for (i = 0; i < 3; i++){// 设置gpio输出为0gpiod_direction_output(extend_desc[i], 0);// 释放gpio编号gpiod_put(extend_desc[i]);}
}module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL"); // 许可证

使用linux中断子系统完成三个按键编写

#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
/*mykeys{interrupt-parent=<&gpiof>;interrupts = <9 0>,<7 0>,<8 0>;};
*/
irqreturn_t key1_irq_handler(int irq, void *dev)
{int key = (int)dev;switch (key){case 0:printk("key1 down!!!\n");break;case 1:printk("key2 down!!!\n");break;case 2:printk("key3 down!!!\n");break;default:break;}return IRQ_HANDLED;
}
unsigned int irqnu[3];
char *irname[3] = {"key1", "key2", "key3"};
struct device_node *node;// 入口
static int __init demo_init(void)
{int i;int ret;// 获取结点node = of_find_node_by_path("/mykeys");if (node == NULL){printk("of_find_node_by_path is error\n");return -EIO;}for (i = 0; i < 3; i++){// 获取软中断号irqnu[i] = irq_of_parse_and_map(node, i);// 注册中断子系统ret = request_irq(irqnu[i], key1_irq_handler, IRQF_TRIGGER_FALLING, irname[i], (void *)i);if (ret < 0){printk("%d request_irq is error\n", irqnu[i]);return -EIO;}}return 0;
}
// 出口
static void __exit demo_exit(void)
{int i;for (i = 0; i < 3; i++){// 注销中断free_irq(irqnu[i], NULL);}
}module_exit(demo_exit);
module_init(demo_init);
MODULE_LICENSE("GPL"); // 许可证

http://www.lryc.cn/news/222565.html

相关文章:

  • 常用的表单校验规则——邮箱/QQ/身份证号码/微信/电话/数字字母/整数/文本/密码等
  • Mysql数据库 11.SQL语言 储存过程 下 储存过程管理和游标
  • 如何在Visual Studio上创建项目并运行【超级详细】
  • 《C++ Primer》第7章 类(二)
  • git仓库代码克隆
  • AM@向量代数@向量基本概念和向量线性运算
  • 2023-11-08 LeetCode每日一题(最长平衡子字符串)
  • Web3.0的测试题
  • Javascript知识点详解:对象的继承、原型对象、原型链
  • 学之思开源考试系统部署至Centos7
  • 如何利用浏览器的可见性API优化网站性能
  • 还不知道IP地址不够用是怎么被大牛们解决的?(NAT/NAPT, IPv6, DHCP)
  • 使用决策树预测隐形眼镜类型
  • [ACTF2020 新生赛]BackupFile 1
  • 解决vuex刷新数据丢失
  • linux系统下读取当前硬盘的温度
  • python 深度学习 解决遇到的报错问题8
  • Linux pipe()系统调用示例
  • 音频中的采样率和比特率
  • Python常用脚本
  • Redis5 分布式系统之主从模式
  • 【黑马程序员】Maven 进阶
  • 231108 C语言memset当第三个参数为0,即设置个数为零也不报错
  • HMM与LTP词性标注之马尔科夫模型(HMM原理剖析)
  • Python自动化测试selenium指定截图文件名方法
  • Linux 实现文件后半部分的复制
  • 阿里开源中间件一览
  • Ubuntu20.04下Salome_meca 2022软件安装(支持GPU加速)
  • uniapp:打包ios配置隐私协议框
  • JS逆向爬虫---请求参数加密③【比特币交易爬虫】