- UID
- 1029342
- 性别
- 男
|
struct rtc_class_ops {
int (*open)(struct device *); //打开一个设备,在该函数中可以对设备进行初始化。如果这个函数被赋值NULL,那么设备打开永远成功,并不会对设备产生影响
void (*release)(struct device *); //释放open()函数中申请的资源。其将在文件引用计数为0时,被系统调用。对应的应用程序的close()方法,但并不是每一次调用close()都会触发release()函数。其会在对设备文件的所有打开都释放后,才会被调用
int (*ioctl)(struct device *, unsigned int, unsigned long); //提供了一种执行设备特定命令的方法。例如,使设备复位,既不是读操作也不是写操作,不适合用read()和write()方法来实现。如果在应用程序中给ioctl传入没有定义的命令,那么将返回-ENOTTY的错误,表示设备不支持这个命令
int (*read_time)(struct device *, struct rtc_time *); //读取RTC设备的当前时间
int (*set_time)(struct device *, struct rtc_time *); //设置RTC设备的当前时间
int (*read_alarm)(struct device *, struct rtc_wkalrm *); //读取RTC设备的报警时间
int (*set_alarm)(struct device *, struct rtc_wkalrm *); //设置RTC设备的报警时间,当时间到达时,会产生中断信号
int (*proc)(struct device *, struct seq_file *); //用来读取proc文件系统的数据
int (*set_mmss)(struct device *, unsigned long secs);
int (*irq_set_state)(struct device *, int enabled); //设置中断状态
int (*irq_set_freq)(struct device *, int freq); //设置中断频率,最大不能超过64
int (*read_callback)(struct device *, int data);
int (*alarm_irq_enable)(struct device *, unsigned int enabled); //用来设置中断使能状态
int (*update_irq_enable)(struct device *, unsigned int enabled); //更新中断使能状态
};
实时时钟RTC的rtc_class_ops结构体定义如下:
static const struct rtc_class_ops s3c_rtcops = {
.open = s3c_rtc_open,
.release = s3c_rtc_release,
.read_time = s3c_rtc_gettime,
.set_time = s3c_rtc_settime,
.read_alarm = s3c_rtc_getalarm,
.set_alarm = s3c_rtc_setalarm,
.irq_set_freq = s3c_rtc_setfreq,
.irq_set_state = s3c_rtc_setpie,
.proc = s3c_rtc_proc,
};
RTC设备打开函数由s3c_rtc_open()来实现,用户空间调用open时,最终会调用s3c_rtc_open()函数。该函数只要申请了两个中断,一个报警中断,一个计时中断。
static int s3c_rtc_open(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev); //从device结构体转到platform_device
struct rtc_device *rtc_dev = platform_get_drvdata(pdev); //从pdev->dev的私有数据中得到rtc_device
int ret;
ret = request_irq(s3c_rtc_alarmno, s3c_rtc_alarmirq,
IRQF_DISABLED, "s3c2410-rtc alarm", rtc_dev); //申请一个报警中断,将中断函数设为s3c_rtc_alarmirq(),并传递rtc_dev作为参数
if (ret) {
dev_err(dev, "IRQ%d error %d\n", s3c_rtc_alarmno, ret);
return ret;
} |
|