如何在Linux中访问控制寄存器



我一直在阅读移植到基于ARM Cortex -A7 MPCore - NEON Architecture 的适当平台上的Linux源代码

下面的代码显示了在调用API 时如何修改模块的控制寄存器

driversmodulemodule-specific_file.c
static inline void API(....)
{
    if (set)
        __raw_writel(msk, (void *)((u32) (reg) + 0x1000));
    else
    {
        __raw_writel(msk, (void *)((u32) (reg) + 0x2000));
    }
}

在上面的代码中,reg实际上是一个虚拟地址,msk是一个掩码,比如说x7FFset是一个传递的参数,它传递设置/清除的请求

但实际上我的疑问是,修改控制寄存器地址是如何修改要写入寄存器的值的??此外,如果我看一下被调用的api,它看起来像下面

archarmincludeasmIo.h
static inline void __raw_writel(u32 val, volatile void __iomem *addr)
{
    asm volatile("str %1, %0"
             : "+Qo" (*(volatile u32 __force *)addr)
             : "r" (val));
}

如果有人遇到过这种访问控制寄存器,请告诉我寄存器的内容实际上是如何通过修改虚拟地址来修改的。

正如我所知,寄存器映射在虚拟地址空间中。例如,看看/proc/iomem,你会看到映射的寄存器地址以及它们属于什么硬件。寄存器的地址由硬件开发人员严格确定。通常,要映射寄存器地址,应该调用ioremap函数。它返回地址。这个地址通常是基地址,寄存器地址从这里开始。要在寄存器中写入某些内容,您只需要在该地址中写入数据加上寄存器偏移量。例如:在ARM PXA320上,有一组LCD寄存器。离子驱动程序代码可以在某个地方看到-ioremap(BASE_ADDR,SIZE_OF_ADDR_SET);为了写入__raw_write(值,base_addr+偏移量)函数。

最新更新