#ifndefRTC_PORT#defineRTC_PORT(x)(0x70 (x))#defineRTC_ALWAYS_BCD1/*RTCoperatesinbinarymode*/#endif 显然,RTC_PORT(0)就是指端口0x70,RTC_PORT(1)就是指I/O端口0x71。端口0x70被用作RTC芯片内部寄存器的地址索引端口,而端口0x71则被用作RTC芯片内部寄存器的数据端口。再读写一个RTC寄存器之前,必须先把该寄存器在RTC芯片内部的地址索引值写到端口0x70中。根据这一点,读写一个RTC寄存器的宏定义CMOS_READ()和CMOS_WRITE()如下:
#defineCMOS_READ(addr)({\outb_p((addr),RTC_PORT(0))\inb_p(RTC_PORT(1))\})#defineCMOS_WRITE(val,addr)({\outb_p((addr),RTC_PORT(0))\outb_p((val),RTC_PORT(1))\})#defineRTC_IRQ8 在上述宏定义中,参数addr是RTC寄存器在芯片内部的地址值,取值范围是0x00~0x3F,参数val是待写入寄存器的值。宏RTC_IRQ是指RTC芯片所连接的中断请求输入线号,通常是8
RTC(实时钟)借助电池供电,在系统掉电的情况下依然可以正常计时。它通常还具有产生周期性中断以及闹钟(Alarm〉中断的能力,是一种典型的字符设备。作为一种字符设备驱动,RTC需要有file_operations中接口函数的实现,如open () 、release () 、read () 、poll () 、ioctl ()等,而典型的IOCTL包括RTC_SET_TIME、RTC_ALM_READ、RTC_ALM_SET、RTC_IRQP_SET、RTC_IRQP_READ等,这些对于所有的RTC是通用的,只有底层的具体实现是与设备相关的。因此,drivers/rtc/tc-dev.c实现了RTC驱动通用的字符设备驱动层,它实现了file_opearations的成员函数以及一些通用的关于RTC的控制代码,并向底层导出rtc_device_register () 、rtc_device_unregister ()以注册和注销RTC导出rtc_class_ops结构体以描述底层的RTC硬件 *** 作。这个RTC通用层实现的结果是,底层的RTC驱动不再需要关心RTC作为字符设备驱动的具体实现,也无需关心一些通用的RTC控制逻辑。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)