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

简易Linux GPIO工具

环境

# cat /proc/version
Linux version 6.11.0-21-generic (buildd@lcy02-amd64-097) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #21~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Feb 24 16:52:15 UTC 2
 

效果

root@ubuntu:/home/vboxuser/home/linux/kmodule/02_simple_gpio# gpioset 0 1 1
bank0_1=1
root@ubuntu:/home/vboxuser/home/linux/kmodule/02_simple_gpio# gpioset 0 1 0
bank0_1=0
root@ubuntu:/home/vboxuser/home/linux/kmodule/02_simple_gpio#
 

simple_gpio.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/gpio.h>#define TAG "HELLO# "static char info[64];
static int bank;
static int bit;
static int val;static ssize_t my_misc_read (struct file *filp, char __user *buf, size_t size, loff_t *off)
{val = gpio_get_value(bank * 32 + bit);snprintf(info, sizeof(info), "bank%d_%d=%d\n", bank, bit, val);return simple_read_from_buffer(buf, size, off, info, sizeof(info));
}static ssize_t my_misc_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{ssize_t ret;if(*pos > sizeof(info))return -EINVAL;ret = simple_write_to_buffer(info, sizeof(info), pos, buf, count);if(sscanf(info, "gpio%d_%d=%d", &bank, &bit, &val) == 3) {printk(TAG "%s called [W]gpio%d_%d=%d\n", __func__, bank, bit, val);gpio_direction_output(bank * 32 + bit, !!val);}else if(sscanf(info, "gpio%d_%d", &bank, &bit) == 2) {printk(TAG "%s called [R]gpio%d_%d=%d\n", __func__, bank, bit, val);}else {return -EINVAL;};return ret;
}static const struct file_operations my_misc_fops = {.read           = my_misc_read,.write          = my_misc_write,
};static struct miscdevice my_misc_dev = {.minor =        MISC_DYNAMIC_MINOR,.name =         "my_misc",.fops =         &my_misc_fops
};static int my_misc_init(void)
{int ret;ret = misc_register(&my_misc_dev);printk(TAG "%s called\n", __func__);return ret;
}
static void my_misc_exit(void)
{misc_deregister(&my_misc_dev);printk(TAG "%s called\n", __func__);
}module_init(my_misc_init);
module_exit(my_misc_exit);
MODULE_LICENSE("GPL");

<完> 

相关文章:

  • linux多线(进)程编程——(9)信号量(二)
  • Kotlin实现Android应用保活方案
  • 【Linux】Rhcsa复习5
  • 电压、电阻、电流型输入的区别
  • npm link 使用指南
  • 《前端面试题之 Vue 篇(第三集)》
  • pivot_root:原理、用途及最简单 Demo
  • Doris + Iceberg 构建冷热分层数据湖架构:架构设计与实战指南
  • 计算机视觉cv2入门之视频处理
  • 编码器---正交编码器
  • 算法—合并排序—js(场景:大数据且需稳定性)
  • 80 7816协议与串口uart协议时序图
  • 【CPU】中断即时性
  • 自然语言处理(9)—— 共现词矩阵及Python实现
  • C#进阶学习(八)常见的泛型数据结构类(3)SortedDictionary<TKey, TValue>与SortedList<TKey, TValue>
  • OJ - 设计循环队列
  • 交换机端口安全
  • C++学习:六个月从基础到就业——内存管理:内存泄漏与避免
  • chili3d调试6 添加左侧面板
  • 【第四十一周】文献阅读:HippoRAG:受神经生物学启发的大型语言模型长期记忆机制
  • 电动自行车新国标将于9月1日落地,首批6家检测机构出炉
  • 中宣部等十部门联合印发《新时代职业道德建设实施纲要》
  • 大国重器飞天背后,有一位上海航天的“老法师”
  • 多元布局、抱团取暖……上海虹口区召开外向型企业圆桌会议
  • 上海这台人形机器人完成半马:无故障、无摔倒,冲过终点不忘挥手致意
  • 观察|美军在菲律宾部署新导弹,试图继续构建“导弹链”