从内核映射内存区域
mapping a memory region from kernel
我有一个寄存器需要从多个驱动程序访问。
它是驻留在 FPGA 中的全局只读寄存器 space
寄存器地址通过设备树导出。
第一次调用 "request_mem_region" 没问题,但任何连续调用都会失败。
有没有办法在驱动程序之间共享寄存器?
Linux 内核版本为 4.14,使用 petalinux
谢谢,
运行
您需要在请求后使用类似 ioremap() 的方法重新映射内存区域。
然后,正如 Tsyvarev 和其他人提到的,在 "parent" 驱动程序中创建并导出一个函数,returns 映射内存。
这里是一些粗略的代码:
void * mapped_mem;
void * map_addr(unsigned int phy_addr, char * name) {
struct resource * resource;
void * mapped_mem;
resource = request_mem_region(phy_addr, page_size * 4, name);
// check for errors
mapped_mem= ioremap_nocache(phy_addr, page_size * 4);
// check for errors
return mappedMem;
//handle errors
}
void * get_mapped_addr(void) {
return mapped_mem
}
EXPORT_SYMBOL( get_mapped_addr);
现在,mapped_mem 实际上应该作为您设备私人信息的一部分进行跟踪,但我认为这超出了问题的范围。另外,请确保检查所有可能的错误。确保 request_mem_region() returns >0 而不是 Null。
我有一个寄存器需要从多个驱动程序访问。 它是驻留在 FPGA 中的全局只读寄存器 space 寄存器地址通过设备树导出。 第一次调用 "request_mem_region" 没问题,但任何连续调用都会失败。
有没有办法在驱动程序之间共享寄存器?
Linux 内核版本为 4.14,使用 petalinux
谢谢, 运行
您需要在请求后使用类似 ioremap() 的方法重新映射内存区域。
然后,正如 Tsyvarev 和其他人提到的,在 "parent" 驱动程序中创建并导出一个函数,returns 映射内存。
这里是一些粗略的代码:
void * mapped_mem;
void * map_addr(unsigned int phy_addr, char * name) {
struct resource * resource;
void * mapped_mem;
resource = request_mem_region(phy_addr, page_size * 4, name);
// check for errors
mapped_mem= ioremap_nocache(phy_addr, page_size * 4);
// check for errors
return mappedMem;
//handle errors
}
void * get_mapped_addr(void) {
return mapped_mem
}
EXPORT_SYMBOL( get_mapped_addr);
现在,mapped_mem 实际上应该作为您设备私人信息的一部分进行跟踪,但我认为这超出了问题的范围。另外,请确保检查所有可能的错误。确保 request_mem_region() returns >0 而不是 Null。