gpt4 book ai didi

c - mmap() 失败,而 devme2 成功 (C/CPP) [Allwinner A20]

转载 作者:行者123 更新时间:2023-11-30 16:59:54 25 4
gpt4 key购买 nike

我正在尝试访问硬件registers of an A20 SOM通过将它们映射到用户空间。在本例中,目标是 PIO,在物理地址 0x01C20800 处列出。

正在使用官方 Olimex Debian7 (wheezy) 镜像。内核Linux a20-olimex 3.4.90+

我能够使用 devmem2 tool 验证位置以及全志关于该内存空间的文档(用devmem切换pinmode和level)。

另一方面,mmap 调用

*map = mmap(
NULL,
BLOCK_SIZE, // = (4 * 1024)
PROT_READ | PROT_WRITE,
MAP_SHARED,
*mem_fd,
*addr_p
);

失败并出现mmap错误:参数无效

这是代码的更完整版本:http://pastebin.com/mfEuVdbJ

不必担心指针,因为在 0x01C28000 访问 UART0 时,相同的代码确实可以工作。虽然只有 UART0(和 UART4),它用作串行控制台。我已经反编译了 script.bin(尽管有 DTB,但仍在使用),但没有成功,因为那里启用了 UART 0、7 和 8。

我也以 root 用户身份登录

我仍然会猜测与权限相关的内容,但我现在很迷茫,因为 devmem 根本没有问题

> root@a20-olimex:~# devmem2 0x01c20800 w /dev/mem opened. Memory mapped
> at address 0xb6f85000.

最佳答案

同时sourcejedi确实没有解决我的问题,他给了我正确的方法。我看了一下前面提到的devmem tool's source发现 mmap 调用的地址被屏蔽了

address & ~MAP_MASK 获取整个页面,这与我的评论中的操作本质上相同。

但是,要在完成映射后返回到正确的位置,您必须重新添加 mask

最终地址 = 映射地址 + (目标地址 & MAP_MASK);

这产生了以下代码(基于 OP's pastebin )

哪里MAP_MASK = (sysconf(_SC_PAGE_SIZE) - 1) 在这种情况下4095

int map_peripheral(unsigned long *addr_p, int *mem_fd, void **map, volatile unsigned int **addr)
{
if (!(*addr_p)) {
printf("Called map_peripheral with uninitilized struct.\n");
return -1;
}

// Open /dev/mem
if ((*mem_fd = open("/dev/mem", O_RDWR | O_SYNC)) < 0) {
printf("Failed to open /dev/mem, try checking permissions.\n");
return -1;
}

*map = mmap(
NULL,
MAP_SIZE,
PROT_READ | PROT_WRITE,
MAP_SHARED,
*mem_fd, // file descriptor to physical memory virtual file '/dev/mem'

*addr_p & ~MAP_MASK // address in physical map to be exposed
/************* magic is here **************************************/
);

if (*map == MAP_FAILED) {
perror("mmap error");
return -1;
}

*addr = (volatile unsigned int *)(*map + (*addr_p & MAP_MASK));
/************* and here ******************************************/
return 0;
}

关于c - mmap() 失败,而 devme2 成功 (C/CPP) [Allwinner A20],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37922380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com