- 论坛徽章:
- 0
|
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就可以了
|