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

简易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");

<完> 

http://www.xdnf.cn/news/655.html

相关文章:

  • vivo把三颗「主摄」放进了手机
  • 博客系统-RabbitMQ
  • 用键盘实现控制小球上下移动——java的事件控制
  • STM32单片机入门学习——第44节: [13-1] PWR电源控制
  • RAG框架精选2
  • Java优雅实现判空方法
  • 编码器---正交编码器
  • 【AI论文】对人工智能生成文本的稳健和细粒度检测
  • 【Rust 精进之路之第4篇-数据基石·上】标量类型:整数、浮点数、布尔与字符的精妙之处
  • 关于进程状态
  • QEMU源码全解析 —— 块设备虚拟化(20)
  • Linux——SSH
  • FTP客户端实现(文件传输)
  • AI提效思考 - 第一期
  • 区块链预言机(Oracle)详解:如何打通链上与现实世界的关键桥梁?
  • HeavyKeeper 算法
  • ESP32快速上手
  • 使用 Visual Studio 2022 中的 .http 文件
  • 基于SpringAI Alibaba实现RAG架构的深度解析与实践指南
  • 内容合作方资源哪里找?如何管理?
  • 【C语言】关于位置标识符
  • Kubernetes控制平面组件:API Server代码基础概念
  • 游戏引擎学习第238天:让 OpenGL 使用我们的屏幕坐标
  • 计算机视觉cv2入门之视频处理
  • 北理工宫某的瓜ppt下载地址
  • 算法篇之单调栈
  • 嵌入式学习——虚拟机通信
  • 堆排序的C++相关实现
  • Java编程基础(第四篇:字符串初次介绍)
  • 51单片机的原理图和PCB绘制