linux下操作gpio寄存器的方法


一、 在驅動中:

  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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM