linux下操作gpio暫存器的方法

2021-09-07 06:50:17 字數 2620 閱讀 1995

一、 在驅動中:

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操作

gpio對映

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

mmap的具體解釋參考:linux 下操作gpio

功能描述: 

mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。munmap執行相反的操作,刪除特定位址區域的物件對映。

基 於檔案的對映,在mmap和munmap執行過程的任何時刻,被對映檔案的st_atime可能被更新。如果st_atime欄位在前述的情況下沒有得到 更新,首次對對映區的第乙個頁索引時會更新該字段的值。用prot_write 和 map_shared標誌建立起來的檔案對映,其st_ctime 和 st_mtime

在對對映區寫入之後,但在msync()通過ms_sync 和 ms_async兩個標誌呼叫之前會被更新。

用法:  

#include

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 實現模型 

linux下操作gpio暫存器的方法

一 在驅動中 1.用的時候對映埠 ioremap define gpio oft x x 0x56000000 define gpfcon volatile unsigned long gpio va gpio oft 0x56000050 gpio va ioremap 0x56000000,0x...

linux下操作cpu暫存器

大多數的核心裡面都有會對gpio的操作,而且核心裡面對gpio進行配置也很方便,要什麼功能就配置成什麼就可以了。還有一些暫存器是核心沒有配置到的,但是我們要操作怎麼辦,核心裡面也定義了相關的介面函式。在u boot中操作某個暫存器 reg readl iomuxc base addr iomuxc ...

GPIO暫存器描述

gpio暫存器描述 stm32參考手冊中文 p75 1 埠配置低暫存器 gpiox crl x a e 2 埠配置高暫存器 gpiox crh x a e 3 埠輸入資料暫存器 gpiox idr x a e 這些位為唯讀並只能以字 16位 的形式讀出。讀出的值為對應i o口的狀態。4 埠輸出資料暫...