gpt4 book ai didi

c - 写入 Linux on ARM 中的物理地址

转载 作者:太空宇宙 更新时间:2023-11-04 10:04:02 25 4
gpt4 key购买 nike

我想在使用 ARM 平台的 Linux 机器上将一个整数(只是一个值,也可以是其他类型)写入特定寄存器(例如:0x60006666)。

有很多使用 mmap(2) 的示例,但不清楚如何使用 mmap() 将一个值写入特定地址。查看 mmap() 手册,它没有指定要写入特定寄存器的值:http://man7.org/linux/man-pages/man2/mmap.2.html

函数如下:

void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);

很明显*addr是地址,但是我们往哪里插入值写入这个地址呢?

在我的例子中,我想将一个 int 写入一个特定的地址,mmap 会是什么样子?

#define _WRITE_ADDR       0x60006666 //address where to write 
unsigned int value_addr = 0x00000080 //value to be written to the address

我想将上述值写入指定地址。它应该是微不足道的,但不是很清楚,因为自从我处理这类问题以来已经有一段时间了,希望有人能提供一些提示。谢谢!

类似问题:
WRITE and READ registers in Linux on ARM

最佳答案

其实很简单。基于RPI的例子

首先你需要:

mem_fd = open("/dev/mem", O_RDWR | O_SYNC);

然后为 map 分配内存。例如,对于一个 BCM RPi 外围设备,它将是 4K + 4K

periph_mem = malloc( 8*1024 - 1);

然后确保它是 4k 对齐的并且 mmap 它:

gpio_map = (unsigned char *)mmap((caddr_t)poriph_mem, BLOCK_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, mem_fd, PERIPH_BASE    );

其中 PERIPH_BASE 是外设的基地址(例如 GPIO 0x20000000(BCM 外设基址)+ 0x200000)

然后您可以像普通指针一样访问它们(但请记住它们必须volatile)

*(volatile uint32_t *)(periph_mem + OFFSET) = VALUE;

关于c - 写入 Linux on ARM 中的物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53885127/

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