S3C6410的GPIO引脚相对来说比较多,而且大部分引脚都具有多重复用功能,如何在linux上用最简单的方式来控制GPIO这需要我们好好研究一下底层的代码了,其实方法有很多种,鉴于在操作系统端控制GPIO并不像控制传统的单片机那样。

这里我将提及一种方法来讲述,这种方法也是我至今看到最简单的方法

首先我们打开linux-3.0.1\arch\arm\plat-samsung\include\plat下gpio-cfg.h这个头文件,仔细浏览后发现,我们可以使用的函数:

1.设置单一io口

int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);

里面有两个参数,第一个pin是选择哪个引脚,第二个参数有三种定义

设置成输出模式  #define S3C_GPIO_INPUT (S3C_GPIO_SPECIAL(0))

设置成输入模式  #define S3C_GPIO_OUTPUT (S3C_GPIO_SPECIAL(1))

复用功能选择    #define S3C_GPIO_SFN(x) (S3C_GPIO_SPECIAL(x))

其实根据我使用的情况来说第1,2两个定义根本就是鸡肋,只有第3个S3C_GPIO_SFN(x)才是最有用的,举个例子:

Ok6410的开发板的DS18B20的接口,器件被接在GPE0上,而GPE有如下复用功能

其中的参数x就是对应上表的复用功能,当x=0时是输入功能,x=1时是输出功能......下面我想不用我说大家也明白了吧。

这个例子s3c_gpio_cfgpin(S3C64XX_GPE(0), S3C_GPIO_SFN(1));说明GPE0口配置为输出模式。

1.获取io口的配置
unsigned s3c_gpio_getcfg(unsigned int pin);这个函数跟上面讲到的刚好相反,是读取当前一个io口的配置,pin参数是要获得的引脚配置,函数会返回一个相应的值

2.设置一组io
int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, unsigned int cfg);

第一个参数start是开始的引脚,第二个nr是从start开始到第一个,注意配置的io必须是同一组的io,第三个cfg是配置状态

3.设置单一io的上拉电阻

int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull);

设置单个io为不同的上拉模式,模式分别为

S3C_GPIO_PULL_NONE

S3C_GPIO_PULL_DOWN

S3C_GPIO_PULL_UP

5.获取io口的上拉电阻配置

s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin);

获取单个io的上拉配置状态,会返回一个配置模式

6.设置一组io(包括上拉电阻)

int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, unsigned int cfg, s3c_gpio_pull_t pull);

讲了这么多看到最后一个函数不讲也应该能看出到底是如何配置了吧

讲了这么多io口的配置方法,来看看如何来配置输出的电平状态。

打开linux-3.0.1\include\linux下的gpio.h的头文件,发现里面有好多的引脚函数其中最重要的也就这么几句

1.设置一个引脚的电平状态

static inline void gpio_set_value(unsigned gpio, int value)

第一个参数gpio为指定的引脚,第二个参数value为要设置的高低电平

2.获得一个引脚的电平状态

static inline int gpio_get_value(unsigned gpio)

第一个参数为gpio为指定的引脚,会返回一个电平状态

讲了上面这些我们基本能控制一个io了,现在我在介绍一种方法,这种方法只能进行输入和输出不能进行io的复用配置

1.io输出

static inline int gpio_direction_output(unsigned gpio, int value)

第一个参数gpio为指定的引脚,第二个参数为电平状态

2.io输入

static inline int gpio_direction_input(unsigned gpio)

第一个参数gpio为指定的引脚,会返回一个电平状态

出了上面方法外我们还可以直接对gpio的地址访问,linux已经为我们准备了这样的接口函数

#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a))
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))
其中的a值为
S3C64XX_GPMCON

S3C64XX_GPMPUD

S3C64XX_GPMDAT

在reg-gpio.h中已经有了以上的定义

V为具体的数值。

linux之GPIO的使用相关推荐

  1. linux源码gpio模拟i2c,linux内核gpio模拟i2c实例.doc

    linux内核gpio模拟i2c实例.doc linux内核GPIO模拟I2C实例2010-10-11作者:cvip302814来源:cvip302814的blog前言:在许多情况下,我们并没有足够的 ...

  2. 树莓派linux下gpio驱动,树莓派官方自带gpio驱动bcm2708_gpio.c原理分析 linux gpio架构 gpio子系统...

    对树莓派gpio的操作有好多方法,比如mmap映射cpu内存,编写内核驱动模块等.这里推荐一篇文章外链网址已屏蔽 其实树莓派官方使用linux内核gpio驱动框架内置了一个驱动,让我们可以直接使用标准 ...

  3. 【全志T113-S3_100ask】15-2 linux系统gpio模拟spi驱动屏幕——ILI9341

    [全志T113-S3_100ask]15-2 linux系统gpio模拟spi驱动屏幕--ILI9341 背景 (一)查阅参考文档 (二)使能内核模块 (三)修改设备树 (四)测试 (五)后语 背景 ...

  4. arm linux 申请gpio,Linux GPIO 的注册与申请

    Linux GPIO 的注册与申请 Linux Kernel, GPIO, ARM 在Linux kernel代码中,经常会使用 GPIO 来作为一个特殊的信号,如作为芯片的片选信号等. GPIO 申 ...

  5. linux 应用层gpio中断_如何在嵌入式Linux中检测GPIO线路上的中断?

    在pandaboard OMAP4中,GPIO_39上每隔10ms产生一次中断.我已在Linux驱动程序代码中为此注册了处理程序,但由于未检测到中断,因此未处理该处理程序. 我确保在硬件级别(通过探测 ...

  6. linux 标准 GPIO 操作

    Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现. #include    int gpio_request(unsigned ...

  7. Linux通过GPIO状态实现按键上报(按键功能)

    GPIO是集成电路或电子电路板上未提交的数字信号引脚,用于将微控制器连接到其他电子设备的标准接口.当然,我们也可以通过几个GPIO口编写一个键盘驱动,驱动挂载后拥有按键功能.   示例驱动基于ARM6 ...

  8. linux的gpio设备,Linux 4.x之Gpio分析(一)Gpiolib库1

    下面的内容均在imx6平台上举例,这一次分析希望将整个GPIO子系统的所有细节整理清晰. 第一篇从gpiolib入手,后面的边分析边写. 开始之前给自己提几个问题 驱动开发中的GPIO API 究竟是 ...

  9. linux 应用层gpio中断_linux下GPIO中断驱动US100传感器--Apple的学习笔记

    一,前言 资源就的利用起来.linux下串口raw驱动(US100超声波)--Apple的学习笔记已经用US100玩了串口,US100还可以用GPIO和中断来玩.原理就是triq发送大于10us的高电 ...

最新文章

  1. 经历小升初择校,我明白了几个道理
  2. Java数据结构2:堆排序思考
  3. 某大佬的20+公司面试题总结和自己的补充
  4. 牛客题霸 [最长公共子串]C++题解/答案
  5. Django之templates模板
  6. redis和mysql双写一致_缓存与库双写一致,这种“老大难”怎么给它制服?
  7. 盘点劳务公司和中介所的那些黑心套路
  8. CentOS7.6Arm Qt开发环境(GCC+Qt5+QtCreator+JDK8+MySQL8+CMake+ProtoBuf+Python+SVN)
  9. input输入框历史记录清除
  10. 计算机里面的硬盘图标怎么会变,win7系统电脑硬盘图标变样的解决方法
  11. tps在区块链是什么意思_超百万的TPS拯救不了区块链技术,区块链还差什么?
  12. 思维导图工具Thebrain:动态思维导图简介
  13. Linux C++ 获取文件夹大小2(通过ftw实现)
  14. 上周技术关注:计算机图书2005之荐
  15. CStdioFile 一些基本用法
  16. 25万英汉词典汉英词典ACCESS\SQLite3数据库
  17. 35+的互联网程序员,人都哪去了?
  18. MySQL基础知识,如果有疏漏、错误的地方请大家指出
  19. 实现 JSON.parse
  20. 搬家公司派单订单管理系统 php,订单派单管理系统哪些功能可以帮助企业发展...

热门文章

  1. android art虚拟机安装,Android中art虚拟机启动流程
  2. linux 换行符_一个linux帮你做高效数据统计
  3. CentOS7部署jar包
  4. cakephp oracle,Cakephp的魔法函数解析,findBy…
  5. 【转】自然语言系列学习之表示学习与知识获取(一)分布式表示
  6. Hive DDL操作
  7. 三十六、数据仓库的实现
  8. 家里“娘娘”发钱,臣不得不遵命呀
  9. 微软太良心,这么强大的软件竟然完全免费!
  10. matlab loopcount,求助一个数值积分问题,用matlab的quadgk函数来计算,谢谢!