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