【整理】--ARM GPIO概述

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为具体的数值。

时间: 2024-10-27 10:47:32

【整理】--ARM GPIO概述的相关文章

3、C#基础整理(语句概述)

语句 语句分为四个大类: * 分支语句:if,if... else,if ...else if... else,switch case * 循环语句:for,while,do while,foreach * 跳转语句:break,continue * 异常语句:try catch finally 用法: 1.if的用法 第一种:if(true){语句}else{语句} 第二种:if(true){语句}else if{语句}…n个else if{语句}…else{语句} 第三种:if(true){

学习ARM+Linux的很好的资料(转)

前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到***和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友,耐心的回答我提出的问题.感激.图报,很简单的想法.希望这次整理的资料帖能对更多的嵌入式爱好者朋友带来帮助! PS:    在此特别感谢 古道热肠 版主把我的帖子加精,给小弟极大鼓舞! 嵌入式入门篇: 什么是嵌入式系统                         http://www.helloa

基于ARM Cortex-M和Eclipse的SWO单总线输出

最近在MCU on Eclipse网站上看到Erich Styger所写的一篇有关通过SWD的跟踪接口SWO获取ARM Cortex-M相关信息的文章,文章结构明晰,讲解透彻,本人深受启发,特意将其翻译过来供各位同仁参考.当然限于个人水平,有不当之处恳请指正.原文网址:https://mcuoneclipse.com/2016/10/17/tutorial-using-single-wire-output-swo-with-arm-cortex-m-and-eclipse/ 作为一个标准过程,我

以软件推动工业进步 -嵌入式学习网站

http://www.cnblogs.com/cubean/archive/2010/04/26/1721035.html 以下内容转自:http://bbs.msembed.com/showtopic-1238.aspx 嵌入式入门篇:什么是嵌入式系统                        http://www.helloarm.com/Embedded-Learn/58.htm嵌 入式资深工程师白话说“嵌入式”        http://www.helloarm.com/Embed

2019入门物联网教程 物联网开发视频教程 物联网零基础教程 物联网模块教程 物联网技术教程

┣━━10 – 全面掌握嵌入式系统移植 [4.8G]┃ ┣━━D1 – 系统移植概述及环境搭建(上) [1007.2M]┃ ┃ ┣━━L10-D1-1.mp4 [154.4M]┃ ┃ ┣━━L10-D1-2.mp4 [228.3M]┃ ┃ ┣━━L10-D1-3.mp4 [166.5M]┃ ┃ ┣━━L10-D1-4.mp4 [136.7M]┃ ┃ ┣━━L10-D1-5.mp4 [159.2M]┃ ┃ ┗━━L10-D1-6.mp4 [162.2M]┃ ┣━━D2 – 系统移植概述及环境搭建(

Android异步消息处理机制(3)asyncTask基本使用

本文翻译自android官方文档,结合自己测试,整理如下. 概述 AsyncTask抽象类,翻译过来就是异步任务,能够合理并方便的使用UI线程.该类可以实现将后台操作结果显示在UI线程中,而不需要我们自己实现子线程或者handler(当然它内部也是借助这两者实现的). 虽然AsyncTask可以提供后台运行并将结果显示在UI上,但是理想情况应该是后台操作最多只能是几秒钟,若要执行长时间的操作强烈建议使用java中的Executor,ThreadPoolExecutor,FutureTask等.

解读Android之Fragment

本文翻译自android官方文档,结合自己测试,整理如下. 概述 Fragment在activity中表示一个行为或者UI的一部分.我们可以在一个activity中使用多个fragments或者在多个activities复用一个fragment.我们可以把fragment作为activity模块化的一部分,fragment有自己的生命周期,UI布局.我们可以在activity运行时动态添加或删除fragment. fragment必须要嵌入到activity中,fragment的生命周期受到宿主

解读Android之任务和Back栈

本文翻译自android官方文档,结合自己测试,整理如下. 概述 一个应用程序通常包括多个activities,每个activity需要指定特定的功能,有时候需要启动其它activity.如一个邮件应用中可能有一个用于显示内容列表的activity,当用户选择某个邮件内容时,则会打开一个新的activity,该activity用于显示邮件具体内容. 一个Activity甚至可以去启动设备上其它应用程序的Activity.例如,如果我们的程序想要发送一封邮件,我们可以通过定义一个带有send动作以

【嵌入式Linux+ARM】ARM体系结构与编程(ARM概述)

ARM体系结构与编程 本文章记录一些看<ARM体系结构与编程>这一本书的记录: 个人觉得,学习ARM体系时,不需要死记硬背,只要把某些关键的大致记住,比如ARM寄存器(通用寄存器.PC.LR.SP.CPSR.SPSR).ARM中断处理体系.常用的ARM汇编指令等. 本文基本都是从书上截图,都是一些关键的知识,需要我们时常去复习的. 一.ARM概述 ARM处理器的7种工作模式: ARM处理器寄存器: ARM中PC(R15)寄存器: ARM中CPSR寄存器: ARM异常处理模式--响应过程和返回过