第一步:先得用open函数打开一下
rtcfd = open(rtcdev,O_RDWR);
if(rtcfd == -1){
perror("open rtc error!");
}
第二部:用ioctl函数获取结构体对象tm,也就是时间;然后再循环发送出去,使用sendto函数:
while(1){
ret = ioctl(rtcfd, RTC_RD_TIME, &tm); //获取时间
printf("[app] ret= %d , tm_sec=%d,tm_min=%d\r\n",ret, tm.tm_sec, tm.tm_min);
sendto(socketfd, &tm, sizeof(tm), 0, NULL, 0);
sleep(1);
}
//时间在rtc.h里面有定义,如下:
//open对应的是rtc-dev.c里面的:

//上层的ioctl在驱动里面都到了这里:

//在rtc.h里面,可以看到有rtc device的实例里面的ops是找的rtc_class_ops,那么我们找到rtc对应的ops,我们的上层ioctl调用的最后都到了这里:

我们这里可以看到之前第二部分的ioctl(),它的原型就在这里:
int(*ioctl)(struct device *,unsigned int,unsigned long);
因此我们填入的是 int ioctl(rtcfd ,RTC_RD_TIME,&tm);这里的rtcfd就是struct device,RTC_RD_TIME在这里就是控制的io,后面的&tm就是unsigned long,然后这个函数 ioctl本身就是对上面ops里面的函数指针(int)(ioctl *)(XXXX)的调用,这里相当于省略了ioctl=ioctl这一步,他们的首地址是一样的,因为名字都ioctl
然后前面的define定义的宏,就是对cmd里面的RTC_RD_TIME这样的IO进行的定义。


这里注意一下,具体的这个参数fd,也就是struct device的初始化,是去找的cdev_int 和cdev这些。
等于说写这么个程序就是先open(),然后再写个循环去调用ioctl获取时间,再通过网络或者串口什么的东西传出去。这里写个127.0.0.1的回环地址来方便测试一下。