从内核映射内存区域

时间:2018-11-25 15:53:20

标签: linux-kernel linux-device-driver memory-mapping petalinux

我有一个寄存器,需要从一个以上的驱动程序进行访问。 它是驻留在FPGA空间中的全局只读寄存器 寄存器地址通过设备树导出。 第一次调用“ request_mem_region”是可以的,但是任何后续调用都将失败。

是否可以在驱动程序之间共享寄存器?

使用petalinux的Linux Kernel版本是4.14

谢谢, 然

1 个答案:

答案 0 :(得分:0)

请求后,您需要使用ioremap()之类的内容重新映射内存区域。

然后,就像Tsyvarev和其他人提到的那样,在“父”驱动程序中创建并导出一个函数,该函数返回映射的内存。

以下是一些粗略的代码:

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()返回> 0而不是Null。