1.驱动成代码,注册节点。
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <linux/gpio.h>
static long exynos_liao_ioctl(struct file *file,unsigned int cmd,unsigned long arg)
{
int ret;
// 先检查参数是否有效
if (arg < 0 ) {
return -EINVAL; // 参数无效,返回错误码
}
// 请求注册 GPIO 资源并检查返回值
ret = gpio_request(arg, "liao_gpio");
if (ret < 0) {
return ret; // 注册失败,返回错误码
}
// 设置 GPIO 值
gpio_set_value(arg, cmd);
// 释放 GPIO 资源
gpio_free(arg);
return 0;
}
static int exynos_liao_open(struct inode *inode, struct file *filp)
{
printk(KERN_ALERT"打开/dev/liao成功 !\n");
return 0;
}
static int exynos_liao_release(struct inode *inode, struct file *filp)
{
printk(KERN_ALERT"关闭文件/dev/liao!\n");
return 0;
}
static struct file_operations liao_dev_fops = {
owner: THIS_MODULE,
open: exynos_liao_open,
// read: exynos_adc_read,
unlocked_ioctl: exynos_liao_ioctl,
release: exynos_liao_release,
};
static struct miscdevice gpio_liao_dev = {
.minor = MISC_DYNAMIC_MINOR,
.name = "liao",
.fops = &liao_dev_fops,
};
static int __init gpio_hello_module_init(void)
{
int ret;
ret = misc_register(&gpio_liao_dev);
if(ret==0)
{
printk(KERN_ALERT"注册成功 !\n");
}
printk(KERN_ALERT"Hello, gpio_hello module is installed !\n");
return 0;
}
static void __exit gpio_hello_module_cleanup(void)
{
// gpio_free(221);
misc_deregister(&gpio_liao_dev);
printk(KERN_ALERT"Good-bye, Tiny4412 module was removed!\n");
}
module_init(gpio_hello_module_init);
module_exit(gpio_hello_module_cleanup);
//modinfo 模块名 查看下面信息
MODULE_LICENSE("GPL");
MODULE_AUTHOR("LIAO"); //驱动作者
MODULE_DESCRIPTION("2023 GPIO"); //驱动信息
MODULE_VERSION("v1.0"); //版本号
2.用户层中直接调用ioctl函数对GPIO口进行拉高拉低操作。
int main(void)
{
int fd;
fd = open("/dev/liao", O_RDWR | O_NOCTTY | O_NDELAY);
printf("%d\n",fd);
if (fd <0)
{
printf("open error!\n");
return 0;
}
else
{
printf("打开成功!\n");
// ioctl(fd,0);
ioctl(fd,1,221); //1是拉高0拉低,221是GPIO口编号
}
close(fd);
return 0;
}