2013-03-25 91 views
1

我希望在Linux用户空间中的OMAP3530上写入硬件寄存器。请找到下面的代码。 Mmap返回错误:访问Linux用户空间中的硬件寄存器

内存映射失败。错误-1

MMAP:权限被拒绝

#include <stdio.h> 
#include <sys/mman.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <errno.h> 

#define BASE_ADDRESS 0x48050000 

int main() 
{ 
     int mem; 
     unsigned int *value; 
     void *ptr; 

     /* Open /dev/mem */ 
     if ((mem = open ("/dev/mem", O_RDONLY | O_SYNC)) == -1) 
       fprintf(stderr, "Cannot open /dev/mem\n"), exit(1); 

     ptr = mmap (0, 8192, PROT_READ|PROT_WRITE, MAP_SHARED, mem, BASE_ADDRESS); 

     if(ptr == (void *) -1) { 
       printf("Memory map failed. error %i\n", ptr); 
       perror("mmap"); 
       } 

     value = (unsigned int*)(ptr + 0x4BC+((1-1)*0x90)+(0*0x04)); 
     *value = 479*799*3-4; 
     printf("value = %i", value); 

     value = (unsigned int*)(ptr + 0x4C4+((-1)*0x90)); 
     *value = 1; 
     printf("value = %i", value); 

     value = (unsigned int*)(ptr + 0x4C8+((-1)*0x90)); 
     *value = 1; 
     printf("value = %i", value); 
     return 0; 
} 

回答

2

mmap()文档说(重点煤矿):

The mmap() function shall fail if:

EACCES

The fildes argument is not open for read, regardless of the protection specified, or fildes is not open for write and PROT_WRITE was specified for a MAP_SHARED type mapping.

既然你指定PROT_WRITE,该文件应开放供写入。您的代码只能打开它才能阅读。

+0

更改了mem = open(“/ dev/mem”,O_RDWR | O_SYNC),仍然出现错误:内存映射失败。错误1 mmap:不允许操作 – user1016711 2013-03-25 12:55:38

+1

upps,对不起,我得到了x86的错误,但对于ARM OMAP3530它有效。谢谢! – user1016711 2013-03-25 13:04:06