1

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

有没有办法在驱动程序之间共享一个寄存器?

Linux 内核版本是 4.14 ,使用 petalinux

谢谢,冉

4

1 回答 1

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。

于 2018-11-26T20:01:41.800 回答