Linux驱动开发——(Linux内核GPIO操作库函数)gpio(1)

简介: Linux驱动开发——(Linux内核GPIO操作库函数)gpio(1)

文章目录

Linux内核GPIO操作库函数

int gpio_request(unsigned gpio, const char *label)

void gpio_free(unsigned gpio)

int gpio_direction_output(unsigned gpio, int value)

int gpio_direction_input(unsigned gpio)

int gpio_set_value(unsigned gpio, int value)

int gpio_get_value(unsigned gpio)

示例:实现注册驱动后指定LED灯亮起

示例具体代码

执行过程

总结


Linux内核GPIO操作库函数

GPIO操作分为“输入操作”和“输出操作”,“输入操作”的GPIO引脚的电平由外设决定,“输出操作”的GPIO引脚的电平由CPU决定,Linux内核已经实现以下关于GPIO调用的库函数,只需要在需要的适合调用即可:


int gpio_request(unsigned gpio, const char *label)

  • 函数功能:CPU的任何一个GPIO引脚硬件资源对于Linux内核来说都是一种宝贵的资源,如果某个内核程序要想访问这个GPIO引脚资源,首先必须想Linux内核申请资源(类似malloc)
  • 参数说明:
  • gpio:GPIO引脚硬件在linux内核中的软件编号,也就是
  • 对于任何一个GPIO引脚,linux内核都给分配一个唯一的
  • 软件编号(类似GPIO引脚的身份证号)
  • GPIO硬件 GPIO软件编号
  • GPIOC12 PAD_GPIO_C+12
  • GPIOB11 PAD_GPIO_B+11
  • … …
  • label:给申请的硬件GPIO引脚指定的名称,随便取。
  • 返回值:看内核大神的代码如何判断即可,照猫画虎
  • 头文件:
  • #include
  • #include
  • #include
  • #include

void gpio_free(unsigned gpio)

  • 函数功能:内核程序如果不再使用访问GPIO硬件资源记得要将硬件资源归还给linux内核,类似free。
  • 参数:
  • gpio:要释放的GPIO硬件资源对应的软件编号

int gpio_direction_output(unsigned gpio, int value)

  • 函数功能:配置GPIO引脚为输出功能,并且输出一个value值(1高电平/0低电平)
  • 参数:
  • gpio:GPIO硬件对应的软件编号
  • value:输出的值

int gpio_direction_input(unsigned gpio)

  • 函数功能:配置GPIO为输入功能

int gpio_set_value(unsigned gpio, int value)

  • 函数功能:设置GPIO引脚的输出值为value(1:高/0:低),前提是必须首先将GPIO配置为输出功能

int gpio_get_value(unsigned gpio)

  • 函数功能:获取GPIO引脚的电平状态,返回值就是引脚的电平状态(返回1:高电平;返回0:低电平),此引脚到底是输入还是输出没关系!

示例:实现注册驱动后指定LED灯亮起

  • 板子上LED灯为共阳极方式连接,所以当CPU输出低电平时LED灯会亮起,高电平时会熄灭。
  • 使用板子为三星的S5P6818开发板,上面的LED灯连接的GPIO管脚分别为:GPIO_C_12、GPIO_C_7、GPIO_C_11、GPIO_B_26。

示例具体代码

led_drv.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/gpio.h>
#include <mach/platform.h> //PAD_GPIO_C
//声明描述LED硬件相关的数据结构
struct led_resource {
    int gpio; //GPIO软件编号
    char *name; //LED的名称
};
//定义初始化四个LED灯的硬件信息对象
static struct led_resource led_info[] = {
    {
        .name = "LED1",
        .gpio = PAD_GPIO_C+12
    },
  {
        .name = "LED2",
        .gpio = PAD_GPIO_C+7
    },
  {
        .name = "LED3",
        .gpio = PAD_GPIO_C+11
    },
  {
        .name = "LED4",
        .gpio = PAD_GPIO_B+26
    }
};
//入口:insmod
static int led_init(void)
{
    int i;
    //1.先向内核申请GPIO硬件资源
    //2.然后配置GPIO为输出功能,输出0,开灯
    for(i = 0; i < ARRAY_SIZE(led_info); i++) {
        gpio_request(led_info[i].gpio, 
                        led_info[i].name);
        gpio_direction_output(led_info[i].gpio, 0);
    }
  printk("led init...\n");
    return 0;
}
//出口:rmmod
static void led_exit(void)
{
    int i;
    //1.输出1,关灯
    //2.释放GPIO硬件资源
    for(i = 0; i < ARRAY_SIZE(led_info); i++) {
        gpio_set_value(led_info[i].gpio, 1);
        gpio_free(led_info[i].gpio);
    } 
    printk("led exit...\n");
}
module_init(led_init);
module_exit(led_exit);
MODULE_LICENSE("GPL");


  • 通过代码能看出当执行insmod led_drv.ko即想Linux内核加载led_drv驱动模块时,根据Linux驱动调用方式会首先执行led_init函数,即实现了指定gpio管脚输出0(点亮LED灯)。
  • Makefile:
kernel_dir=/home/ww/ARM/kernel
obj-m += led_drv.o
all:
        make -C ${kernel_dir} SUBDIRS=$(PWD) modules
clean:
        make -C ${kernel_dir} SUBDIRS=$(PWD) clean


执行过程

  • make进行驱动模块编译

2019122320240537.png

  • 在开发板上加载led_drv.ko

20191223202747573.png

  • 卸载led_drv驱动

20191223202824445.png

总结

Linux驱动控制GPIO管脚最底层的操作就是通过这几个函数来实现,但是具体到我们真正用到的时候肯定不能仅仅通过一个点亮LED灯来实现,并且现在的LED灯的点亮方式还是通过加载驱动模块的操作来完成的。不过后面我们会需要用户在应用层调用Linux驱动来达到操作底层硬件的基本方法。


相关文章
|
6月前
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
603 1
|
6月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
401 0
|
Linux C++
linux下练习 c++ 库函数排序使用举例
//使用库函数排序举例 #include #include #include //内有排序库函数 using namespace std; #ifndef person_h_1 //预定义指令 #define person_h_...
795 0
|
5月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
606 1
二、Linux文本处理与文件操作核心命令
|
5月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
385 137
|
5月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
924 57
|
8月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
740 143
linux命令—tree
|
4月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
851 2
|
5月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
459 0
Linux内存问题排查命令详解