一、 在驅動中:
1. 用的時候對映埠:ioremap;
#define gpio_oft(x) ((x) - 0x56000000)void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);#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暫存器的一些介面:
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 埠輸出資料暫...