ioremap()函数
我将一个寄存器用ioremap函数定义到驱动中,R_GPECON=ioremap(GPECON,4),我是不是可以这样对这个寄存器直接赋值:
R_GPECON=0xffffffff还是这样*R_GPECON=0xffffffff。到底那个正确呀。
谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
writeb/writew/readb/readw in 2.4 kernel,
writeb(内容,地址)。
R_GPECON=ioremap(GPECON,4);
writew(0xffffffff,R_GPECON);:wink:
ioremap 将物理地址映射到内核中的一段地址,映射之后你看到的R_GPECON跟物理地址有一段偏移,所以不能直接操作~~
就是这个样子~~
ls的,应该是writel(0xffffffff,R_GPECON);吧?看它映射的是32位。还有,一般多用~0,而不是0xffffffff
ls的,应该是writel(0xffffffff,R_GPECON);吧?看它映射的是32位。还有,一般多用~0,而不是0xffffffff
*addr = data时要用修饰词volatile
谢谢各位的指教
一般是推荐用writeX系列函数而不是直接用指针操作,不过原因好像不是你所说的吧?主要是这个函数经常用于映射外设的一些地址空间到虚拟地址中,而外设的访问有时有一些限制,而用writeX系列比较安全。如果是映射一些不用的物理内存如系统启动时保留出来的内存,则直接做内存访问即可。
请教,如果在驱动中~~
#define kaka (*((volatile INT32U *) 0x01c00000))
kaka=0xfc;
可以访问成功么?
1、这段代码是驱动中的,说明执行kaka=0xfc;时享有cpu特权,此时的代码可以做内核能够做得任何事情~~
2、如果有mmu的话,cpu将0x01c00000送给mmu,mmu会查表,找出0x01c00000对应的物理地址(假设是add_temp),
3、mmu从ram中寻址add_temp
4、我也不知道到底能不能正确访问,我是新手,请高人分析一下其中的过程~~
你这样的访问编译后的指令使用的是虚拟地址,能否访问取决于这一地址有没有映射吧。