免费注册 查看新帖 |

Chinaunix

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

关于驱动的问题,用到了ioremap和(*(unsgined char *))virtual_addr=0xff这种赋值方式 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-25 22:59 |只看该作者 |倒序浏览
源码大概这个样子的:
平台是ARM9
virtual_addr=ioremap(phy_addr,1);virtual_addr是一个外设寄存器地址,是两字节的;
*((unsigned int *)virtual_addr)virtual_addr=0xffff;
程序遇到了问题,出错了.
请教一下,这种操作方式有什么错误??和ioremap()中第二个参数1有关吗?我查到的是这个参数指资源个数,但不理解是怎么回事
顺便再问下,outb,outw,inb,inw这类函数能用在上面.我自己感觉这类函数是linux为了支持IO端口空间和内存空间单映射才加上的,说白了就是x86下的in,out指令,所以在ARM平台下是不可用的.而且我用的时候也确实出了问题.不知道这么说对不对?

论坛徽章:
0
2 [报告]
发表于 2008-02-26 14:08 |只看该作者
I think u should call request_mem_region() before ioremap(), and use the following helper functions to access your ioport or iomem rather than direct access, cause they can handle the difference between ioport and iomem:

unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);

void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
......

I'm not familiar ARM9 platform, but if it functions well when using inb/outb, the phy_addr should be an ioport. For ioports, Linux also provide:

void __iomem *ioport_map(unsigned long port, unsigned int nr);

which remap ioport into iomem.

But I still suggest u use the helper functions I listed to access ur io regions whether u did ioport_map() or not.

I'd like to receive ur comment.

论坛徽章:
0
3 [报告]
发表于 2008-02-26 23:35 |只看该作者
谢谢帮顶~~~
你说的我今天查了查,大概了解了点:
IO映射到内存后,理论上是可以直接访问地址来访问相应存储器的;但linux为兼容多个平台,提供了writeb,readb,writew,readw之类的函数,它们在不同的平台下有不同的实现形式.
我下午又调了调程序,将程序改成了这个样子
virtual_addr=(unsigned long)ioremap(phy_addr,1);
writeb(0xc0,vritual_addr);
这样就可以工作了;
但我要写的寄存器不光是单字节的,还有一个双字节的,我用了下面的程序去写
virtual_addr=(unsigned long)ioremap(phy_addr,2);
writew(0x5000,virtual_addr);
但却写不进去,我用readw(virtual_addr)读回来的结果一直是0

论坛徽章:
0
4 [报告]
发表于 2008-02-26 23:36 |只看该作者
我上面提到的writeb(w),是在网上查到的结果,也是用来读写IO的,不知道和你说的iowrite有什么区别没?我明天试下,谢谢了

论坛徽章:
0
5 [报告]
发表于 2008-03-11 15:21 |只看该作者

回复 #3 et8848 的帖子

给你一个思路:
    你考虑过little-ending 的问题吗,如果cpu和device的字节序是不一样,那肯定会出错的

另外,好奇,你既然是io寄存器,为什么不直接调用inb,outb, inw,outw,呢,map一个寄存器,2个寄存器,整个开销太大了。
另外ioremap面向页的,存在一些align问题,最好map一段连续的页对齐的空间

[ 本帖最后由 longda 于 2008-3-11 15:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP