linux应用层中使用ioctl函数操作对驱动层中的GPIO进行拉高拉低操作

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值