我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致。
举个例子:
寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是在uboot中设置,现在我想在Linux运行后,读出改寄存器的值,再来检查该寄存器是否与uboot的配置一致。
Linux应用程序运行的是虚拟空间,有没有什么机制可以是完成我提到的这一需求。若行,还请附些测试代码。
谢谢!
这个需要用mmap()函数将寄存器物理地址映射为用户空间的虚拟地址,即将寄存器的那段内存映射到用户空间,函数介绍如下:
void* mmap(void * addr, size_t len, int prot, int flags, int fd, off_t offset)
该函数映射文件描述符 fd 指定文件的 [offset, offset + len] 物理内存区至调用进程的 [addr, addr + len] 的用户空间虚拟内存区,通常用于内存共享或者用户空间程序控制硬件设备,函数的返回值为最后文件映射到用户空间的地址,进程可直接 *** 作该地址。下面是测试代码(仅供参考):
#define DDR2_REG_BASE (0x20000000)
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
static unsigned int pTestRegBase
static int dev_fd
dev_fd = open("/dev/mem", O_RDWR | O_NDELAY)
if (dev_fd <</SPAN>0) {
LOGE("open(/dev/mem) failed.")
return
}
pTestRegBase = (void *)mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, dev_fd,DDR2_REG_BASE &~MAP_MASK)
if (MAP_FAILED == pTestRegBase) {
printf("mmap failed. fd(%d), addr(0x%x), size(%d)\n", dev_fd, DDR2_REG_BASE, MAP_SIZE)
} else {
unsigned int reg_value = *((volatile unsigned int *)(pTestRegBase + 10))
printf("reg_value = 0xx\n", reg_value)
munmap((void*)pTestRegBase, MAP_SIZE)
}
pTestRegBase = 0
if(dev_fd)
close(dev_fd)
这里将DDR2_REG_BASE开始大小为1个page的物理地址映射到了用户空间,然后就可以用pTestRegBase作为起始地址 *** 作寄存器了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)