在Linux用户空间中访问硬件寄存器 [英] Accessing hardware registers in Linux userspace

查看:593
本文介绍了在Linux用户空间中访问硬件寄存器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想写Linux用户空间中OMAP3530上的硬件寄存器.请找到下面的代码. Mmap返回错误:

I wpuld like to write to hardware registers on OMAP3530 in Linux userspace. Please, find below code. Mmap returns error:

内存映射失败.错误-1

Memory map failed. error -1

mmap:权限被拒绝

mmap: Permission denied

#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;
}

推荐答案

mmap()的文档说(强调我):

如果出现以下情况,mmap()函数将失败:

EACCES

无论指定了何种保护, fildes 参数都不会打开以供读取,或者 fildes 不能打开以进行写,并且PROT_WRITE 是为MAP_SHARED类型映射指定的.

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,因此应打开该文件以进行写入.您的代码仅将其打开以供读取.

Since you specify PROT_WRITE, the file should be open for write. Your code only opens it for read.

这篇关于在Linux用户空间中访问硬件寄存器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆