[英]How Control Registers are accessed in Linux
我一直在阅读基于ARM Cortex -A7 MPCore - NEON Architecture
的适当平台上的Linux源代码ARM Cortex -A7 MPCore - NEON Architecture
下面的代码显示了在调用API时如何修改模块的控制寄存器
drivers\module\module-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
是一个掩码,让我们说x7FF
和set
是传递的参数,它传达了set / clear的请求
但实际上我怀疑的是修改控制寄存器地址是如何修改要写入寄存器的值... ?? 进一步,如果我看看被称为api,它看起来像下面
arch\arm\include\asm\Io.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函数。 它返回地址。 通常,该地址是寄存器地址开始的基址。 要在寄存器中写入内容,您只需要在此地址中写入数据加上resister offset。 例如:在ARM PXA320上,有一组LCD寄存器。 某人可能会看到离子驱动程序代码 - ioremap(BASE_ADDR,SIZE_OF_ADDR_SET); 为了编写__raw_write(value,base_addr + offset)函数被使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.