- 论坛徽章:
- 0
|
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字 ...
|