免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1990 | 回复: 4
打印 上一主题 下一主题

linux2.6下的 ioremap 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-13 13:22 |只看该作者 |倒序浏览
linux2.6下的 ioremap 问题:

实验平台:linux2.6.9
交叉编译器:arm-linux-gcc-3.4.6-glibc-2.3.6

试验程序:
ADDR_SJA1000_ADDR = ioremap(0x04000000,0xff);      
ADDR_SJA1000_DATA = ADDR_SJA1000_ADDR + (0x1<<2);

printk("ADDR_SJA1000_ADDR = %x\n",ADDR_SJA1000_ADDR);
printk("ADDR_SJA1000_DATA = %x\n",ADDR_SJA1000_DATA);

打印结果:
ADDR_SJA1000_ADDR = c4874000
DDR_SJA1000_DATA = c4874010

难道DDR_SJA1000_DATA 的值 不应该是c4874004 吗
在linux2.4.14 下打印DDR_SJA1000_DATA = c4874004


我又在2.6下试了一下发现:
ADDR_SJA1000_DATA = ADDR_SJA1000_ADDR + ?   ----  DDR_SJA1000_DATA =?

(0x1<<2)-----c4874010
(0x1<<1)-----c4874008
(0x1<<0)-----c4874004
而在2.4下 相关数据为
(0x1<<2)-----c4874004
(0x1<<1)-----c4874002
(0x1<<0)-----c4874001

论坛徽章:
0
2 [报告]
发表于 2009-05-13 13:29 |只看该作者
因为ADDR_SJA1000_ADDR数据类型为unsigned int *,还不明白的话去翻翻C语言教程。。。

论坛徽章:
0
3 [报告]
发表于 2009-05-13 14:58 |只看该作者
没明白,楼上解释一下吧

论坛徽章:
0
4 [报告]
发表于 2009-05-13 17:32 |只看该作者
在32位的机子上,int类型是4个字节,而你的指针指向int类型,对该指针加1会移动4个字节的,而你加了4,所以结果是c4874000 + (4*4) = c4874010

[ 本帖最后由 zhiqiang0071 于 2009-5-13 17:34 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-05-13 20:50 |只看该作者
ADDR_SJA1000_Data你这个定义的什么类型啊?
如果是定义的 void * __iomem 的话,就是 ADDR_SJA1000_ADDR +4 ,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP