linux下操作gpio寄存器的方法

oucaijun oucaijun     2022-07-31     667

关键词:

一、 在驱动中:

  1. 用的时候映射端口:ioremap;

  #define GPIO_OFT(x) ((x) - 0x56000000)
  #define GPFCON (*(volatile unsigned long *)(gpio_va + GPIO_OFT(0x56000050)))
  gpio_va = ioremap(0x56000000, 0x100000); // 物理地址0x56000000, 映射区分配的大小0x100000字节
  这样映射过后,就可以直接操作寄存器了: 
  配置3引脚为输出: GPFCON &= ~(0x3<<(4*2));

  2. 在linux/include/asm-arm/arch-s3c2410/map.h映射, 在linux/include/asm-arm/arch-s3c2410/regs-gpio.h得到各种寄存器的地址,直接对这些地址进行操作即可。
  参考【linux】 linux gpio操作http://www.cnblogs.com/embedded-tzp/p/4450515.html
     gpio映射 http://blog.chinaunix.net/uid-25100840-id-271146.html
      
    misccr = __raw_readl(S3C24XX_MISCCR);
      misccr &= ~clear;
      misccr ^= change;
      __raw_writel(misccr, S3C24XX_MISCCR);
    
    #define __raw_writel(v,a)    (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a) = (v))
  
   下面是内核代码提供的操作gpio寄存器的一些接口:

void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);

unsigned int s3c2410_gpio_getcfg(unsigned int pin);

void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
unsigned int s3c2410_gpio_getpin(unsigned int pin);
unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change);
int s3c2410_gpio_getirq(unsigned int pin);

linux/include/asm-arm/io.h

#define __raw_writeb(v,a)    (__chk_io_ptr(a), *(volatile unsigned char __force  *)(a) = (v))
#define __raw_writew(v,a)    (__chk_io_ptr(a), *(volatile unsigned short __force *)(a) = (v))
#define __raw_writel(v,a)    (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a) = (v))

#define __raw_readb(a)        (__chk_io_ptr(a), *(volatile unsigned char __force  *)(a))
#define __raw_readw(a)        (__chk_io_ptr(a), *(volatile unsigned short __force *)(a))
#define __raw_readl(a)        (__chk_io_ptr(a), *(volatile unsigned int __force   *)(a))

二、 在linux应用程序中:  mmap

mmap的实例参考:Linux用户态控制GPIO--基于友善mini2440 http://www.cnblogs.com/cute/archive/2011/05/10/2042399.html

mmap的具体解释参考:Linux 下操作gpio http://www.cnblogs.com/lidabo/p/5319219.html

功能描述: 
mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。munmap执行相反的操作,删除特定地址区域的对象映射。
基 于文件的映射,在mmap和munmap执行过程的任何时刻,被映射文件的st_atime可能被更新。如果st_atime字段在前述的情况下没有得到 更新,首次对映射区的第一个页索引时会更新该字段的值。用PROT_WRITE 和 MAP_SHARED标志建立起来的文件映射,其st_ctime 和 st_mtime
在对映射区写入之后,但在msync()通过MS_SYNC 和 MS_ASYNC两个标志调用之前会被更新。

用法:  
#include <sys/mman.h>
void *mmap(void *start, size_t length, int prot, int flags,
  int fd, off_t offset);

int munmap(void *start, size_t length);

 

============================

gpio linux 实现模型 http://www.cnblogs.com/armlinux/archive/2010/12/30/2396865.html

 

ad2428w手册解读之操作与配置(下)

...的1位虚拟端口,由主节点管理。主节点可以在A2B_GPIODDAT寄存器中读取每个虚拟端口的状态。2、GPIO引脚到虚拟端口0~7的灵活映射方案。3、GPIO引脚可以配置为更新A2B_GPIODDAT寄存器内容的输入,也可以配置为反映A2B_GPIODDAT寄存器内... 查看详情

麻烦问一下linux下gpio驱动的问题,ioctl函数和write函数有啥区别,

ioctl函数通过操作IO端口相关的寄存器可以设置端口的高低电平,而write函数是写数据的,这两个怎么使用啊,谢谢!参考技术A可以用man命令查看区别manioctl:NAMEioctl-controldevicemanwrite:NAMEwrite-writetoafiledescriptor本回答被提问者采纳... 查看详情

linux内核里的gpio操作函数

参考技术A1.gpio_set_value(unsignedgpio,intvalue)用来设置gpio寄存器的值2.gpio_direction_output(unsignedgpio,intvalue)用来设置gpio为输出功能,同时设置gpio输出的值。一般来说,设置一个GPIO口为输出,先执行一次gpio_direction_output,然后接下来只需... 查看详情

dsp6416寄存器gpio寄存器写值写不了

今天学习GPIO操作,用的是ti6416dsp开发板,往GPIO寄存器GPGC,等寄存器写值,发现写入不了。经过测试,向EDMA,TIMER等寄存器是可以写入值的。请问,出现这种情况,是GPIO寄存器有问题,还是自己操作上出了问题?请教。。。经... 查看详情

嵌入式gpio接口及操作

...GPIO的操作是对所有硬件的操作最基本的技能。一、通过寄存器来操作GPIO引脚,一个引脚可以用于输入、输出或者其他的特殊功能,那么一定有寄存器来配置这些功能,对于输入,就是读取引脚的状态,一定可以从寄存器在中读... 查看详情

关于分析系统suspend的底电流异常的方法

...suspend的情况下SOC的gpio状态。因为JTAG可以读取这些map好的寄存器的值。关于suspend的注意事项1)驱动suspend时,一般会对外设芯片置于省电模式,或者对外设芯片断电。断电前可能需要读取并保存寄存器的当前状态值,以便resume时... 查看详情

[gpio]推荐一种超简单的硬件位带bitband操作方法,让变量,寄存器控制,io访问更便捷,无需用户计算位置(代码片段)

目录说明:硬件位带操作优势优势1:优势2:背景知识(1)将1MB地址范围0x20000000-0x200FFFFF  映射到32MB空间范围0x22000000-  0x23FFFFFF---->这个对应STM32F4的通用RAM空间。(2)将1MB地址范围0x40000000-0x400FFF 查看详情

linux——linux驱动之完整的驱动操作硬件基础实践,linux下如何像裸机那样通过gpio控制蜂鸣器

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《 查看详情

linux——linux驱动之完整的驱动操作硬件基础实践,linux下如何像裸机那样通过gpio控制蜂鸣器

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《 查看详情

linux——linux驱动之gpio中断的应用实战(下)(中断下文之工作队列的使用,处理非常复杂且耗时的操作)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来!《QT开发实战》《嵌入式通用开发实战》《从0到1学习嵌入式Linux开发》 查看详情

瑞芯微rk3568开发:gpio实践篇

...大道一统的,在各个诸如状态、数据、中断和屏蔽等寄存器具体含义用法,有少许差异。玩好RK的GPIO,需要先理解这类通用接口的框架。    介绍RK3568的GPIO,认为讲2类重要地址和记录几种编程实践方法即可。一... 查看详情

android(linux)控制gpio的方法及实时性分析

  Linux下控制GPIO的方法有N种,详细请参考《RPiGPIOCodeSamples》,文中用十多种语言演示了如何控制GPIO,非常全面详尽。因此,这里不再多做赘述,仅把调试过程中整理的脚本贴上并做简单的分析。特别说明,Linux必须有root权限... 查看详情

gpio操作(代码片段)

...GPIO配置,如下图,控制LED的属于GPF管脚:    GPF的寄存器如下图:  G 查看详情

字符设备驱动程序

...驱动程序的开发过程;5.    学习在内核中访问外设寄存器,操作外设的方法 二、     实验器材1.    Linu 查看详情

使用寄存器点亮led——编程实战

...了,而stm32中,就一个简单的GPIO,我们也需要配置好几个寄存器,而且,就算配置好GPIO寄存器,我们还必须有一步不能缺少的操作,那就是开启对应GPIO的时钟。在stm32的编程中,开启对应时钟是必不可少的一个操作,而且,开... 查看详情

如何在linux系统中直接操作gpio

在一个老手的指导下,应用层可以直接操作GPIO,具体指设置GPIO的输入输出以及输出电平高或者低。这个大大地提高了灵活性,官方的文档有GPIOSysfsInterfaceforUserspace,GPIOSysfs。这里我记录一下使用过例子:#RK30_PIN0_PD4#A0-7->0-7/B0-... 查看详情

rk3568|rk平台gpio冲突检测小技巧(代码片段)

...w平台下如何快速定位gpio复用问题以及如何解决。一、GPIO寄存器查找要想查看某个GPIO引脚可以配置的功能以及地址信息,需要查看TRM手册:《RockchipRK3568TRMPart1》第一步:对于GPIO2A2,我们转换成下面字符串然后搜... 查看详情

rk3568|rk平台gpio冲突检测小技巧(代码片段)

...w平台下如何快速定位gpio复用问题以及如何解决。一、GPIO寄存器查找要想查看某个GPIO引脚可以配置的功能以及地址信息,需要查看TRM手册:《RockchipRK3568TRMPart1》第一步:对于GPIO2A2,我们转换成下面字符串然后搜... 查看详情