• 如何获取CMOS内存的时间


    参考Linux V1.0

    定义CMOS_READ模块

    cmos_read.h

    --------------------------------------------------------------------------------------------------------------------------

    #define CMOS_READ(addr) ({outb(addr|0x80,0x70);inb(0x71);})
    #define outb(value,port)
    __asm__ ("outb %%al,%%dx"::"a"(value),"d"(port))

    #define inb(port) ({
            unsigned char _v;
            __asm__ volatile("inb %%dx,%%al":"=a"(_v):"d"(port));
            _v;
            })

    #define RTC_REG_A       10
    #define RTC_REG_B  11
    #define RTC_DM_BINARY 0x04
    #define RTC_ALWAYS_BCD  1
    #define RTC_FREQ_SELECT RTC_REG_A
    #define RTC_UIP 0x80

    #define RTC_SECONDS  0
    #define RTC_MINUTES  2
    #define RTC_HOURS    4
    #define RTC_DAY_OF_WEEK  6
    #define RTC_DAY_OF_MONTH 7
    #define RTC_MONTH  8
    #define RTC_YEAR  9
    #define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
    #define RTC_CONTROL RTC_REG_B

    #define MINUTE 60
    #define HOUR (60*MINUTE)
    #define DAY (24*HOUR)
    #define YEAR (365*DAY)
         
    struct mktime {
           int sec;
           int min;
           int hour;
           int day;
           int mon;
           int year;
           };

    --------------------------------------------------------------------------------------------------------------------------

    cmos_read.c

    --------------------------------------------------------------------------------------------------------------------------

    #include "stdio.h"
    #include "stdlib.h"
    #include "cmos_read.h"

    void time_get(void)
    {
         struct mktime time;
         int i;
         for(i = 0; i < 1000000 ; i++)
               if (CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP)
               break;
         for(i = 0; i < 1000000 ; i++)
               if (!(CMOS_READ(RTC_FREQ_SELECT) & RTC_UIP))
               break;
         do{
               time.sec = CMOS_READ(RTC_SECONDS);
               time.min = CMOS_READ(RTC_MINUTES);
               time.hour = CMOS_READ(RTC_HOURS);
               time.day = CMOS_READ(RTC_DAY_OF_MONTH);
               time.mon = CMOS_READ(RTC_MONTH);
               time.year = CMOS_READ(RTC_YEAR);
         } while (time.sec != CMOS_READ(RTC_SECONDS));
         if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
       {
         BCD_TO_BIN(time.sec);
         BCD_TO_BIN(time.min);
         BCD_TO_BIN(time.hour);
         BCD_TO_BIN(time.day);
         BCD_TO_BIN(time.mon);
         BCD_TO_BIN(time.year);
       } 
    }
          
    main()
    {

          printf("hello ");
          time_get();
          system("pause");
    }      

    //End

  • 相关阅读:
    depression...
    Childhood is certainly not the happiest time of your time
    我在上海的日子(前言)
    struts国际化的一点尝试
    脚本(js)控制页面输入
    db2和oracle的一些区别
    工作几年是个坎?
    来深圳这半个月
    10年编程无师自通
    初试java mail
  • 原文地址:https://www.cnblogs.com/sagerking/p/6368044.html
Copyright © 2020-2023  润新知