下面的代码分析是根据linux-2.6.17.14_stm22版本
#define STSYS_WriteRegDev32LE(Address_p, value) writel((u32)value, (void*)Address_p)
在include/asm-sh/io.h
#define writel(v,a) ({__raw_writel((v),(a));mb();})
#define __raw_write(v,a) __writel((v),(void __iomem *)(a))
#define __writel(v,a) sh_mv.mv_writel(v,a)
在arch/sh/kernel/setup.c中把sh_mv.mv_writel->generic_write1
在arch/sh/kernel/io_generic.c中
void generic_writel(U32 b, void __iomem *addr)
{
ctrl_outl(b,(unsigned long __force)addr);
}
在include/asm-sh/io.h
static inline void ctrl_outl(unsigned inst b,unsigned long addr)
{
*(volatile unsigned long *)addr = b;
}
存在一个疑问:
最后是从用户空间直接设置寄存器,但能这样直接赋值吗? 不通过MM吗?