分享

linux下使用mmap控制GPIO

 guitarhua 2011-12-24
linux下使用mmap控制GPIO
2008-07-12 7:41

欢迎看看我的另一个小窝,说不定有意外的惊喜哦 ^_^ www.

如果没有/dev/mem,则执行

mknod /dev/mem c 1 1

编译下面的代码

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include<sys/mman.h> 
#include<fcntl.h> 
#include <asm/page.h>


#define GPIO_CTL_BASE 0x56000000 
#define rGPBCON 0x10 
#define rGPBDAT 0x14 
#define rGPBUP 0x18

unsigned int *GPBCON,*GPBDAT,*GPBUP;

void Led_Display(int data)
{
   *(volatile unsigned int *)GPBDAT= (~data & 0xf)<<7;//因为是第7-10位,且只有4位,故 左移7 
}

int main(int argc, char** argv) 

int gpio_fd, ip=0, i=0; 
unsigned char *gpio_map;

gpio_map = NULL; 
GPBCON = NULL; 
GPBDAT = NULL; 
GPBUP = NULL;

gpio_fd =open("/dev/mem",O_RDWR); 
if (gpio_fd == -1) 

   printf("can't open /dev/mem.\n"); 
   return ; 
}

gpio_map = (unsigned char *)mmap(0, 0xbc,PROT_READ | PROT_WRITE, MAP_SHARED,gpio_fd, GPIO_CTL_BASE); 
GPBCON = (volatile unsigned int *) (gpio_map+rGPBCON); 
GPBDAT = (volatile unsigned int *) (gpio_map+rGPBDAT); 
GPBUP = (volatile unsigned int *) (gpio_map+rGPBUP);

//初始化io
*(volatile unsigned int *)GPBCON=0x154000;
*(volatile unsigned int *)GPBUP=0x7ff;

for(i=0;i<16;i++)
{
   Led_Display(i);
   sleep(1);
}

munmap(0, 0xbc);
if (gpio_fd != 0x0) 

   close(gpio_fd); 
}

printf("GPIO Control Test end\n"); 

}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多