漫威专卖店:linux下使用mmap控制GPIO

来源:百度文库 编辑:中财网 时间:2024/04/29 17:36:29
2008-07-12 7:41
欢迎看看我的另一个小窝,说不定有意外的惊喜哦 ^_^ www.devres.info
如果没有/dev/mem,则执行
mknod /dev/mem c 1 1
编译下面的代码
#include
#include
#include
#include
#include
#include
#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");
}