s3c2440的GPIO驱动
S3C2440包含有130多个通用的GPIO,同时这些端口也拥有一些复用功能(如ADC输入),有部分端口只能输入,有部分端口只能输出,今天我们来看看如何设置一个GPIO的输出电平以及如何获取一个端口的GPIO电平
对GPIO进行操作分为以下几步
1. 功能设置,GPXCON寄存器,针对于2440addr.h,分别为
rGPACON, rGPBCON, rGPCCON, rGPDCON, rGPECON, rGPFCON, rGPGCON, rGPHCON, rGPJCON
通过设置不同的值来选着不同的功能,输入,输出,复用,等
2. 数据读写,GPXDAT寄存器,在输入模式下,dat寄存器相应位代表相应引脚的当前电平,在输出模式下, dat寄存器相应位代想要设置的相应电平
(注,2440addr.h中的寄存器前面都有一个小写r开头).
3. 内部上拉寄存器GPXUP寄存器,可以设置相应位的内部上拉是否打开
设置好这三位之后,GPIO就可以正常操作了
以下是GPIO输出LED,使用GPB5-GPB8
Led.c
#include "led.h" void LedInit(void)
{
//GPB 01为输出模式,先清零寄存器为00
rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));//10 b5 12 b6 14 b7 16 b8
//设置相应寄存器为01
rGPBCON |= ((1<<10)|(1<<12)|(1<<14)|(1<<16));
//禁止上拉,因为是输出
rGPBUP &= ~((1<<5)|(1<<6)|(1<<7)|(1<<8));
//设置初始化为1 led处于熄灭状态
rGPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8));
} void LedSet(u8 ch,u8 value)
{
switch(ch)
{
case 0:
if(value)rGPBDAT |= (1<<5);
else rGPBDAT &= ~(1<<5);
break;
case 1:
if(value)rGPBDAT |= (1<<6);
else rGPBDAT &= ~(1<<6);
break;
case 2:
if(value)rGPBDAT |= (1<<7);
else rGPBDAT &= ~(1<<7);
break;
case 3:
if(value)rGPBDAT |= (1<<8);
else rGPBDAT &= ~(1<<8);
break;
}
}
Led.h
#ifndef __LED_H
#define __LED_H
#include "2440addr.h"
#include "def.h" void LedInit(void); void LedSet(u8 ch,u8 value); #endif
以下是GPIO输入按键检测,使用GPIOF 0 1 2 4
Key.c
#include "key.h" u8 keyValue = 0; void KeyInit(void)
{
rGPFCON &=~((3<<2)|(3<<8)|(3<<4)|(3<<0)); //对GPFCON[10:17]清零
rGPFUP &=~((1<<1)|(1<<4)|(1<<2)|(1<<0)); //设置上拉功能
rGPFDAT |=(1<<1)|(1<<4)|(1<<2)|(1<<0); //设定初始值
} //按键按下,相关端口为0,没有按键按下时,不会自动清零,会保持最后一次的状态,需要用户自己去清零
u8 GetKeyValue(void)
{
u32 temp = rGPFDAT;
if(!(temp & (1<<0))) //如果相关端口为0
{
keyValue = KEY_UP;
return keyValue;
}
if(!(temp & (1<<1)))
{
keyValue = KEY_DOWN;
return keyValue;
}
if(!(temp & (1<<2)))
{
keyValue = KEY_LEFT;
return keyValue;
}
if(!(temp & (1<<4)))
{
keyValue = KEY_RIGHT;
return keyValue;
}
return 0;
}
Key.h
#ifndef __KEY_H
#define __KEY_H #include "2440addr.h"
#include "def.h" //按键全部上拉
//key1 对应 F1
//key2 对应 F4
//key3 对应 F2
//key4 对应 F0 #define KEY_UP 1
#define KEY_DOWN 2
#define KEY_LEFT 3
#define KEY_RIGHT 4 extern u8 keyValue; void KeyInit(void); u8 GetKeyValue(void); #endif
s3c2440的GPIO驱动的更多相关文章
- S3C2440上LCD驱动(FrameBuffer)实例开发讲解
一.开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二.背景知识 ...
- Linux下GPIO驱动(三) ----gpio_desc()的分析
上篇最后提出的疑问是结构体gpio_chip中的成员函数set等是怎么实现的,在回答之前先介绍下gpio_desc这个结构体. 如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二
/** ****************************************************************************** * @author 暴走的小 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一
/** ****************************************************************************** * @author 暴走的小 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三
/** ****************************************************************************** * @author 暴走的小 ...
- 开发GPIO驱动的基本套路
最近完成了基于AR9331的GPIO驱动的开发,主要包括:控制一个连接GPIO的灯控:接收一个连接GPIO的按键事件:以及接收一个连接GPIO的脉冲事件. 这里,结合开发实践,总结一下GPIO驱动开发 ...
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
本文转载自:http://m.blog.csdn.net/kris_fei/article/details/69553422 Platform: ROCKCHIPOS: Android 6.0Kern ...
- uboot的GPIO驱动分析--基于全志的A10芯片【转】
本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...
- MM32F0020 GPIO驱动LED灯(MM32F0020 GPIO Toggle)
目录: 1.MM32F0020简介 2.MM32F0020系统时钟配置 3.MM32F0020的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0020 GPIO驱 ...
随机推荐
- CentOS 下mysql 的安装
1.安装mysql服务器 yum -y install mysql-server 2.装入service启动服务 /etc/rc.d/init.d/mysqld start 3.设置mysql服务开机 ...
- CodeForces 678B The Same Calendar
暴力.一年一年判断过去.如果某一年与输入的年份闰年性质相同,并且1月1日是星期几相同,那么输出. #include<cstdio> #include<cstring> #inc ...
- JSP内置对象--session对象(getId(),getCreationTime(),getLastAccessedTime(),isNew(),invalidate(),setAttribute(),getAttribute())
session对象是javax.servlet.http.HttpSession接口的实例,但是不像HttpServletRequest或HttpServletResponse一样,有父接口,他没有父 ...
- CF 389 E 贪心(第一次遇到这么水的E)
http://codeforces.com/contest/389/problem/E 这道题目刚开始想的特别麻烦...但是没想到竟然是贪心 我们只需要知道偶数的时候可以对称取的,然后奇数的时候没次取 ...
- ubuntu下如何安装及使用 pysvn-workbench
网上对于 pysvn-workbench 的教程几乎没有,没办法,只好去官网自学了,现在能正常上传资料了,写点东西,以免今后忘了 安装方面:在新立得中查找svn-workbench,subversio ...
- 安装psutil模块报错&安装python-devel
psutil/_psutil_linux.c:9:20: 错误:Python.h:没有那个文件或目录 In file included from psutil/_psutil_linux.c:19:p ...
- 基于JAVA语言的多线程技术
1.简介 多线程技术属于操作系统范围内的知识: 进程与线程 可以这么理解,一个应用程序就是一个进程,在一个进程中包含至少一个线程:进程就是线程的容器,真正工作.处理任务的是线程. 进程是操作系统分配资 ...
- C# Guid用法
GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空 中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多 ...
- 基于POI的Excel导入导出(JAVA实现)
今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...
- MySQL:MySQL的安装
一.Linux:MySQL的源码安装 1.安装前的准备 在安装之前需要安装一下必备的包和工具 gcc/g++:MySQL5.6开始,需要使用g++进行编译. cmake:MySQL5.5开始,使用cm ...