我想在使用 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
我想将上述值写入指定地址。它应该是微不足道的,但不是很清楚,因为自从我处理这类问题以来已经有一段时间了,希望有人能提供一些提示。谢谢!
最佳答案
其实很简单。基于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/