简介

前面通过libgpio的方式介绍了内核空间对GPIO进行操作的接口,其做了较好的封装,同时Linux系统的sysfs机制已经在系统路径下/sys/class/gpio注册了相应的节点,通过读写该节点下的文件就能轻松的完成GPIO输入输出配置以及引脚状态的获取。

原理图

我使用的Rockchippx30,引脚是GPIO3_D0,具体硬件肯定会不同,注意参考socdatasheet和硬件原理图,先定位正确需要操作的GPIO,千里之行始于足下。

节点

/sys/class/gpio路径下有exportunexport这两个文件;GPIO3_D0在这里是120,具体硬件和数字的对应关系后面会继续讲到;

echo 120 > /sys/class/gpio/export

执行以上这条指令后,会在/sys/class/gpio/下生成gpio120节点,简单看一下该路径下都有哪些文件;

$ /sys/class/gpio/gpio120
$ active_low device direction edge power subsystem uevent value

设置为输出

$ cd /sys/class/gpio/gpio120
$ echo 0 > active_low
$ echo out > direction
$ echo 1 > value #输出高
$ echo 0 > value #输出低

另一种情况,设置active_low1,就会出现另一种情况;

$ cd /sys/class/gpio/gpio120
$ echo 1 > active_low
$ echo out > direction
$ echo 1 > value #输出低
$ echo 0 > value #输出高

由此看出,active_low的作用已经很明显了,后面没有特别指出的情况下,active_low的值默认为0;一表胜过千言万语,简单整理一个表格,如下所示;

active_low value 实际GPIO输出
0 1 high
0 0 low
1 1 low
1 0 high

设置为输入

$ cd /sys/class/gpio/gpio120
$ echo int > direction
$ cat value #读取GPIO的电平状态

映射关系

Rockchip px30平台的GPIO总共分为GPIO0~GPIO3四组,每一组最多有32个GPIO,依次分为ABCD四个小组,每组最多8个,对于硬件上实际没有达到8个的情况下,计算偏移的时候,也按照8来计算。RK平台可以参考dt-bindings/pinctrl/rockchip.h。其他平台的话,如果有源代码可以参考以下厂商给出的具体定义,并结合SOC的原理图和硬件原理图,来计算。

具体计算如下表所示;依次类推;

引脚 计算
GPIO3_D0 3*32 + 3*8 + 0 = 120
GPIO3_D1 3*32 + 3*8 + 1 = 121
GPIO2_A1 2*32 + 0*8 + 1 = 65

debugfs

debugfs 是 Linux系统下为了方便驱动开发人员对驱动调试的文件系统。

$ cat /sys/kernel/debug/gpio

可以通过debugfs查看gpio-120硬件上的实际输出和软件上是否相符合;

pwm demo

强迫症的我简单写了一个模拟pwmshell,虽然比较鸡肋,因为是占空比,频率都是不可调的,单纯是为了看一下控制的效果,前提是已经执行echo 120 > export这条指令并且成功生成相应的节点,代码简单如下;

 #!/bin/bash
GPIO=120
i=0
value=0
while [ 1 -eq 1 ]
do
i=$(($i + 1))
if [ $(( $i % 2 )) -eq 0 ]
then
value=0
else
value=1
fi
echo "current i is $i"
echo "current value is $value"
echo $value > /sys/class/gpio/gpio$GPIO/value
usleep 1000
done

用示波器测量GPIO3_D0引脚的波形,和预期的一样;

Linux内核驱动学习(七)应用层直接操作GPIO的更多相关文章

  1. Linux内核驱动学习(八)GPIO驱动模拟输出PWM

    文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...

  2. Linux内核驱动学习(六)GPIO之概览

    文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...

  3. linux内核驱动中对字符串的操作【转】

    转自:http://www.360doc.com/content/12/1224/10/3478092_255969530.shtml Linux内核中关于字符串的相关操作,首先包含头文件: #inc ...

  4. linux内核驱动学习指南

    1. 参考链接 小白的博客 ONE_Tech 你为什么看不懂Linux内核驱动源码? 求教怎么学习linux内核驱动

  5. Linux内核驱动学习(九)GPIO外部输入的处理

    文章目录 前言 设备树 两个结构体 gpio_platform_data gpio_demo_device 两种方式 轮询 外部中断 总结 附录 前言 前面是如何操作GPIO进行输出,这里我重新实现了 ...

  6. Linux内核驱动学习(三)字符型设备驱动之初体验

    Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...

  7. Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig

    文章目录 目标 drivers/Kconfig demo下的Kconfig 和 Makefile Kconfig Makefile demo_gpio.c 目标 Kernel:Linux 4.4 我编 ...

  8. Linux内核驱动学习(十)Input子系统详解

    文章目录 前言 框架 如何实现`input device` 设备驱动? 头文件 注册input_dev设备 上报按键值 dev->open()和dev->close() 其他事件类型,处理 ...

  9. Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld

    文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...

随机推荐

  1. codeforces 122C perfect team

    You may have already known that a standard ICPC team consists of exactly three members. The perfect ...

  2. NIO教程 ——检视阅读

    NIO教程 --检视阅读 参考 BIO,NIO,AIO 总结 Java NIO浅析 Java NIO 教程--极客,蓝本 Java NIO 系列教程 --并发编程网 BIO,NIO--知乎 NIO 入 ...

  3. vue2.x学习笔记(六)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12571171.html. class与style绑定 操作元素的class列表和内联样式,是数据绑定的一个常见需求 ...

  4. phpstudy之访问loaclhost显示目录

    phpstudy版本:phpstudy2018 具体操作: 当前版本的默认设置访问网站根目录是不会显示目录的,需要我们设置,其实也很简单,只需两步就可以搞定 1.找到phpstudy目录下的www文件 ...

  5. Java 自定义注解及注解读取解析--模拟框架生成SQL语句

    假设们使用一张简单的表,结构如下: 定义注解: 表注解: package com.xzlf.annotation; import java.lang.annotation.ElementType; i ...

  6. Linux必须会的命令---也是以前记录的,ctrl+z fg 啥的 jobs 比较实用

    fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令 ...

  7. wait,waitpid的学习使用

    man wait man waitpid 从中可知 函数原型 pid_t wait(int* status); pid_t waitpid(pid_t pid, int* status, int op ...

  8. 非阻塞算法(Lock-Free)的实现

    目录 非阻塞的栈 非阻塞的链表 非阻塞算法(Lock-Free)的实现 上篇文章我们讲到了使用锁会带来的各种缺点,本文将会讲解如何使用非阻塞算法.非阻塞算法一般会使用CAS来协调线程的操作. 虽然非阻 ...

  9. Linux改中文乱码显示

    Linux改中文乱码显示                可以使用locale命令,查看当前系统默认采用的字符集# locale在RedHat/CentOS系统下,记录系统默认使用语言的文件是/etc/ ...

  10. Ubuntu登陆时忘记密码怎么办

    有时候由于各种原因,用户会忘记自己登陆Ubuntu的登陆密码,这个时候我们能怎么办呢? 第一步:先重启电脑,开机时长按shift键,进入grub菜单: 第二步:按“e”键编辑启动项,显示如下图,将下图 ...