gpio口的标准函数

这篇博客介绍了GPIO在嵌入式平台上的标准访问方法,包括GPIO的申请、释放、配置为输入/输出以及设置和获取电平值。通过使用头文件中的函数,如gpio_request、gpio_direction_output、gpio_direction_input和gpio_set_value,可以更方便地操作GPIO,这些函数是平台无关的。
摘要由CSDN通过智能技术生成
  1. 前面访问GPIO的方法:

request_mem_region()申请GPIO寄存器的物理内存区---->ioremap()IO内存的动态映射,得到虚拟地址---->访问虚拟地址。

需要查找CPU的使用手册。

  1. 后面的简单的GPIO访问方法:

GPIO是嵌入式平台最常见的一个硬件模块,所以linux内核将GPIO的访问过程封装成了标准的接口函数,这些接口函数在调用的时候和平台无关的。

平常使用iowrite32、ioread32等这些函数有以下优缺点:

优点:能够对申请到寄存器资源进行访问,例如GPIO寄存器、串口寄存器、ADC寄存器、I2C寄存器等。

缺点:针对GPIO配置与控制有点繁琐

因此,GPIO标准接口函数就解决了iowrite32与ioread32的缺点,操作GPIO更加的简单。

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论
    以下是标准的控制 GPIO 状态的 Linux 内核驱动示例代码: ```c #include <linux/module.h> // 模块化编程所需的头文件 #include <linux/init.h> // 内核初始化所需的头文件 #include <linux/gpio.h> // GPIO 相关头文件 #include <linux/fs.h> // 文件系统相关头文件 #include <linux/cdev.h> // 字符设备相关头文件 #include <asm/uaccess.h> // 用户空间访问内核空间的头文件 #define LED_PIN 4 // LED 所连接的 GPIO 号 #define DEVICE_NAME "led" // 字符设备名称 MODULE_LICENSE("GPL"); // 模块许可证声明 static dev_t devno; // 用于保存设备号 static struct cdev led_cdev; // 字符设备结构体 static int gpio_status = 0; // GPIO 状态变量 // 字符设备打开函数 static int led_open(struct inode *inode, struct file *filp) { return 0; } // 字符设备读函数 static ssize_t led_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { return 0; } // 字符设备写函数 static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { char kbuf[8]; int ret; if (count > sizeof(kbuf) - 1) { count = sizeof(kbuf) - 1; } if (copy_from_user(kbuf, buf, count)) { return -EFAULT; } kbuf[count] = '\0'; if (kbuf[0] == '0') { gpio_status = 0; gpio_set_value(LED_PIN, 0); // 将 LED 置为低电平 } else if (kbuf[0] == '1') { gpio_status = 1; gpio_set_value(LED_PIN, 1); // 将 LED 置为高电平 } else { return -EINVAL; } ret = count; return ret; } // 字符设备关闭函数 static int led_release(struct inode *inode, struct file *filp) { return 0; } // 字符设备操作函数集合 static struct file_operations led_fops = { .owner = THIS_MODULE, .open = led_open, .read = led_read, .write = led_write, .release = led_release, }; // 模块初始化函数 static int __init led_init(void) { int ret; // 申请 GPIO if (gpio_request(LED_PIN, "led")) { printk(KERN_ALERT "Failed to request GPIO %d\n", LED_PIN); return -EBUSY; } // 配置 GPIO 为输出模式 if (gpio_direction_output(LED_PIN, 0)) { printk(KERN_ALERT "Failed to set GPIO %d as output\n", LED_PIN); gpio_free(LED_PIN); return -EINVAL; } // 分配设备号 ret = alloc_chrdev_region(&devno, 0, 1, DEVICE_NAME); if (ret < 0) { printk(KERN_ALERT "Failed to allocate device number\n"); gpio_free(LED_PIN); return ret; } // 初始化字符设备结构体 cdev_init(&led_cdev, &led_fops); led_cdev.owner = THIS_MODULE; // 注册字符设备 ret = cdev_add(&led_cdev, devno, 1); if (ret < 0) { printk(KERN_ALERT "Failed to add character device\n"); unregister_chrdev_region(devno, 1); gpio_free(LED_PIN); return ret; } printk(KERN_INFO "led: registered character device\n"); return 0; } // 模块卸载函数 static void __exit led_exit(void) { // 删除字符设备 cdev_del(&led_cdev); // 释放设备号 unregister_chrdev_region(devno, 1); // 释放 GPIO gpio_set_value(LED_PIN, 0); // 将 LED 置为低电平 gpio_free(LED_PIN); printk(KERN_INFO "led: unregistered character device\n"); } module_init(led_init); // 注册模块初始化函数 module_exit(led_exit); // 注册模块卸载函数 ``` 该驱动将 LED 连接到 GPIO 4 上,并实现了一个字符设备 `/dev/led`,通过该设备可以控制 LED 的亮灭。在写该设备时,写入 `0` 表示将 LED 置为低电平,写入 `1` 表示将 LED 置为高电平。对该设备进行读操作时,将返回 0。在模块加载时,将申请 GPIO 并配置为输出模式,同时分配设备号并注册字符设备;在模块卸载时,将删除字符设备并释放设备号和 GPIO
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    hqb_newfarmer

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值