免费注册 查看新帖 |

Chinaunix

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

数据类型 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-23 16:34 |只看该作者 |倒序浏览
5可用积分
大家帮我看看这几行代码,是不是数据类型有错或者是别的原因导致出现这样的错误

unsigned long hpi_vbase;
unsigned int *tmp;

hpi_vbase =  (unsigned long) ioremap_nocache (HPI_PHYSICAL_BASEADDR, HPI_PHYSICAL_size);

#define HPIA_LW                        (hpi_vbase+0x04)
#define HPIA_HW                        (hpi_vbase+0x06)
#define HPIA_LR                        (hpi_vbase+0x14)
#define HPIA_HR                        (hpi_vbase+0x16)

HPIA_LW和HPIA_LR的区别实际上就是一个是写使能有效,一个是读使能有效,转换成指针指向的外设空间是一样的

writew (0x1234, HPIA_LW);  写入1234
writew (0x5678, HPIA_HW);  写入5678   
*tmp++ = readw (HPIA_LR);  读出1212  , 应该读出1234
*tmp++ = readw (HPIA_HR);  读出5656, 应该读出5678


writel (0x1234, HPIA_LW);  写入1234
writel (0x5678, HPIA_HW);  写入5678   
*tmp++ = readw (HPIA_LR);  读出1234
*tmp++ = readw (HPIA_HR);  读出5656

writel (0x1234, HPIA_LW);  写入1234
writel (0x5678, HPIA_HW);  写入5678   
*tmp++ = readb (HPIA_LR);  读出12
*tmp++ = readb (HPIA_HR);  读出56


#define readw(c) ({ unsigned int __v = (*(volatile unsigned short *)((unsigned long)(c))); __v; })
#define writew(v,c)                (*(volatile unsigned short *)((unsigned long)(c))=v  
#define writel(v,c)                    (*(volatile unsigned int  *)((unsigned long)c))=v
#define readl(c) ({ unsigned int __v = (*(volatile unsigned int *)((unsigned long)(c))); __v; })

最佳答案

查看完整内容

兄弟,你边界地址没对齐阿。你应该是32位机,对不?#define HPIA_LW (hpi_vbase+0x04)#define HPIA_HW (hpi_vbase+0x06)#define HPIA_LR (hpi_vbase+0x14)#define HPIA_HR (hpi_vbase+0x16)如果hpi_vbase是地址对齐,那HPIA_LW && HPIA_LR是4字节地址对齐,但HPIA_HW && HPIA_HR就不是4字节对齐了。如果你是16位机,没问题.改成4字 ...

论坛徽章:
5
2 [报告]
发表于 2009-03-23 16:34 |只看该作者
兄弟,你边界地址没对齐阿。
你应该是32位机,对不?
#define HPIA_LW                        (hpi_vbase+0x04)
#define HPIA_HW                        (hpi_vbase+0x06)
#define HPIA_LR                        (hpi_vbase+0x14)
#define HPIA_HR                        (hpi_vbase+0x16)

如果hpi_vbase是地址对齐,那HPIA_LW && HPIA_LR是4字节地址对齐,但HPIA_HW && HPIA_HR就不是4字节对齐了。

如果你是16位机,没问题.

改成4字节的边界地址,问题应该解决。

[ 本帖最后由 yidou 于 2009-3-24 09:12 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-23 16:54 |只看该作者
你是什么平台啊?外设寄存器能当普通RAM访问么?

论坛徽章:
0
4 [报告]
发表于 2009-03-23 19:07 |只看该作者

回复 #2 garyv 的帖子

arm-linux平台,arm9+linux2.4
把外设寄存器映射后,就可以当普通ram访问了。

初步断定不是大小端的问题,因为我在linux下用我的驱动往外设寄存器里写数据,再读出来(linux下和jtag读都得到一样的结果)都会出现上面提到的错误,可是我用jtag往外设寄存器里写数据后,再在linux下用我的驱动读出来,显示读出的结果和jtag写进去的数据是完全一样的,这可以说明我的驱动是可以正确读外设寄存器的。可是写为什么就不正确啊?readw和writew是一对函数啊!
高手们再帮我琢磨琢磨!多谢各位了!

[ 本帖最后由 yjz98 于 2009-3-23 21:13 编辑 ]

论坛徽章:
5
5 [报告]
发表于 2009-03-24 01:01 |只看该作者
#define HPIA_LW                        (hpi_vbase+0x04)
#define HPIA_HW                        (hpi_vbase+0x06)
#define HPIA_LR                        (hpi_vbase+0x14)
#define HPIA_HR                        (hpi_vbase+0x16)

HPIA_LW和HPIA_LR的区别实际上就是一个是写使能有效,一个是读使能有效,转换成指针指向的外设空间是一样的

writew (0x1234, HPIA_LW);  写入1234
writew (0x5678, HPIA_HW);  写入5678   
*tmp++ = readw (HPIA_LR);  读出1212  , 应该读出1234
*tmp++ = readw (HPIA_HR);  读出5656, 应该读出5678


writew (0x1234, HPIA_LW);  写入1234
writew (0x5678, HPIA_HW);  写入5678    //非4字节对齐地址, 非法语句
*tmp++ = readw (HPIA_LR);  读出1212  , 应该读出1234   //奇怪, 写入HPIA_LW && HPIA_HW, 怎么读HPIA_LR && HPIA_HR?
*tmp++ = readw (HPIA_HR);  读出5656, 应该读出5678  //非4字节对齐地址, 非法语句

[ 本帖最后由 yidou 于 2009-3-24 09:19 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-03-24 08:37 |只看该作者
楼上说的应该是正确的,确实没有字边界对齐,你在读写的时候被强制字对齐了,所以能读出一半正确数据。

论坛徽章:
5
7 [报告]
发表于 2009-03-24 08:54 |只看该作者
NULL

[ 本帖最后由 yidou 于 2009-3-24 08:57 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-03-24 09:15 |只看该作者
原帖由 yidou 于 2009-3-24 01:01 发表
删除错误结论



他的 0x14  好像是4字节对齐的吧? 改成 0x12 反而没有对齐

论坛徽章:
5
9 [报告]
发表于 2009-03-24 09:17 |只看该作者
原帖由 star316 于 2009/3/24 09:15 发表



他的 0x14  好像是4字节对齐的吧? 改成 0x12 反而没有对齐



眼花了, 所述有误, 已作纠正.

论坛徽章:
0
10 [报告]
发表于 2009-03-24 09:53 |只看该作者
原帖由 yidou 于 2009-3-24 01:01 发表


writew (0x1234, HPIA_LW);  写入1234
writew (0x5678, HPIA_HW);  写入5678    //非4字节对齐地址, 非法语句
*tmp++ = readw (HPIA_LR);  读出1212  , 应该读出1234   //奇怪, 写入HPIA_LW && HPIA_HW,  ...


他的读写地址是地址编码的, 所以地址是不同的, 不过 他的 writew 本身就是2字节读写,应该没有问题啊?   有问题的话也是后面的writel/readl 才会造成字节对齐的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP