免费注册 查看新帖 |

Chinaunix

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

请教S3C2440的RTC驱动问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-16 21:21 |只看该作者 |倒序浏览
5可用积分
驱动成功 insmod 上去之后,用测试程序一打开设备就死在那里了,发现问题应该出在驱动的open()函数。
我想在打开设备的同时就注册中断和设置时间
驱动的open()函数代码在这里
------------------------------------------------------------------------------------------------------------
static int RTC_open(struct inode *inode,struct file *filp)
{
int ret;
ret=request_irq(DEVICE_IRQ,&RTC_interrupt,SA_INTERRUPT,DEVICE_NAME,NULL);
if(ret <0){
printk("Request irq failed!\n");
return ret;
}
        /*调用open函数会在这个地方停住,就是中断注册完就不能往下走了*/
outl(0x01,S3C2410_RTCCON);  //写BCD寄存器前RTCCON置1
outl(0,S3C2410_RTCSEC); //设置BCD寄存器内的实时时间,用BCD码写入
outl((3 < <4)|0,S3C2410_RTCMIN);  //设置分钟
outl((1 < <4)|2,S3C2410_RTCHOUR);  //设置小时
outl(0x00,S3C2410_RTCCON); //写完BCD寄存器RTCCON清0
outl(127|(1 < <7),S3C2410_TICNT);  //设置时钟节拍中断为一秒,启动节拍
return 0;
}
--------------------------------------------------------------------------------------------------------------
我自己调试过了,测试程序调用open函数时,会停在outl(0x01,S3C2410_RTCCON)这个地方,中断是可以注册成功的。
把所有outl注释掉,测试程序就能成功运行,当然,那样RTC就根本没设置了。
我查来查去outl()的使用没什么问题阿,为什么就不走了

请大家帮我看看是哪个地方出错了,还是RTC和系统的关系驱动不能这样写?

最佳答案

查看完整内容

找个2410的rtc驱动看一下,一般你需要把rtc的寄存器通过ioremap一下,然后才能访问,直接read,write就可以了

论坛徽章:
0
2 [报告]
发表于 2009-09-16 21:21 |只看该作者

回复 #3 hjw951 的帖子

找个2410的rtc驱动看一下,一般你需要把rtc的寄存器通过ioremap一下,
然后才能访问,直接read,write就可以了

论坛徽章:
0
3 [报告]
发表于 2009-09-16 23:25 |只看该作者
好像必须进行寄存器io端口映射吧,否则直接写io可以吗?
参考一下:
http://www.diybl.com/course/6_sy ... 20071226/94190.html

论坛徽章:
0
4 [报告]
发表于 2009-09-17 00:04 |只看该作者

回复 #2 emmoblin 的帖子

这些寄存器是在linux源码包s3c2410目录里的头文件定义的
比如 S3C2410_RTCCON 控制寄存器他是这样定义的:

#define S3C2410_RTCCON              S3C2410_RTCREG(0x40)
而前面还有一行
#define S3C2410_RTCREG(x)     ((x) + S3C24XX_VA_RTC)


头文件已经这样定义了是不是您所说的端口映射呢?

[ 本帖最后由 hjw951 于 2009-9-17 00:43 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-09-17 20:34 |只看该作者

回复 #1 hjw951 的帖子

"会停在outl(0x01,S3C2410_RTCCON)这个地方"的原因是:
outl函数只用于I/O端口的访问,而I/O端口一般存在于x86处理器中,ARM处理器是没有I/O端口的,只有I/O内存,所以使用outl会出错。

解决办法:
S3C2410_RTCCON等已经是虚拟地址,所以可以使用ioread8, ioread16, ioread32, iowrite8, iowrite16, iowrite32等函数进行读写。具体可参见《Linux设备驱动开发详解》第11章:内存与I/O访问。

论坛徽章:
0
6 [报告]
发表于 2009-09-19 14:33 |只看该作者

回复 #5 gqwang2005 的帖子

非常感谢您,今天要考试
找时间我按照您的指点再试试,谢谢

论坛徽章:
0
7 [报告]
发表于 2009-09-20 23:54 |只看该作者

回复 #2 tonyen 的帖子

谢谢,是用ioremap解决了问题
不过头文件里面定义的那些东西到底是什么?我还以为就是对虚拟地址的映射了呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP