示例#1
0
bool x86_rtc_read(x86_rtc_data_t *dest)
{
    if (!valid) {
        return false;
    }

    unsigned old_status = irq_disable();

    while (is_update_in_progress()) {
        __asm__ volatile ("pause");
    }

    uint8_t b = x86_cmos_read(RTC_REG_B);
    do {
        dest->second  = x86_cmos_read(RTC_REG_SECOND);
        dest->minute  = x86_cmos_read(RTC_REG_MINUTE);
        dest->hour    = x86_cmos_read(RTC_REG_HOUR);
        dest->day     = x86_cmos_read(RTC_REG_DAY);
        dest->month   = x86_cmos_read(RTC_REG_MONTH);
        dest->year    = x86_cmos_read(RTC_REG_YEAR);
        dest->century = bcd2binary(x86_cmos_read(RTC_REG_CENTURY));
    } while (dest->second != x86_cmos_read(RTC_REG_SECOND));
    if (dest->century == 0) {
        dest->century = 20; // safe guess
    }

    if (!(b & RTC_REG_B_BIN)) {
        dest->second  = bcd2binary(dest->second);
        dest->minute  = bcd2binary(dest->minute);
        dest->hour    = ((dest->hour & 0x0F) + (((dest->hour & 0x70) / 16) * 10)) | (dest->hour & 0x80);
        dest->day     = bcd2binary(dest->day);
        dest->month   = bcd2binary(dest->month);
        dest->year    = bcd2binary(dest->year);
    }
    if (!(b & RTC_REG_B_24H) && (dest->hour & 0x80)) {
        dest->hour = ((dest->hour & 0x7F) + 12) % 24;
    }

    irq_restore(old_status);
    return true;
}
示例#2
0
文件: clock.c 项目: CyberjujuM/tacos
// http://www-ivs.cs.uni-magdeburg.de/~zbrog/asm/cmos.html
void clock_init()
{
  struct tm date;
  systime = 0;

  outb(RTC_DATE_OF_MONTH, RTC_REQUEST);
  date.tm_mday = bcd2binary(inb(RTC_ANSWER));
  outb(RTC_MONTH, RTC_REQUEST);
  date.tm_mon = bcd2binary(inb(RTC_ANSWER))-1;
  outb(RTC_YEAR, RTC_REQUEST);
  date.tm_year = bcd2binary(inb(RTC_ANSWER));
  date.tm_year += 100;
  outb(RTC_HOUR, RTC_REQUEST);
  date.tm_hour = bcd2binary(inb(RTC_ANSWER));
  outb(RTC_MINUTE, RTC_REQUEST);
  date.tm_min = bcd2binary(inb(RTC_ANSWER));
  outb(RTC_SECOND, RTC_REQUEST);
  date.tm_sec = bcd2binary(inb(RTC_ANSWER));
  
  systime = mktime(&date);
}
示例#3
0
文件: game.c 项目: ricardoleitee/LCOM
void drawDate()
{
	unsigned long day, month, year;
	getDate(&day,&month,&year);
	unsigned long i = (bcd2binary(day)) / 10;
	unsigned long ii = (bcd2binary(day)) % 10;
	unsigned long j = (bcd2binary(month)) / 10;
	unsigned long jj = (bcd2binary(month)) % 10;
	unsigned long k = (bcd2binary(year)) / 10;
	unsigned long kk = (bcd2binary(year)) % 10;
	printf("%d\n",i);
	if(i == 0)
		vg_draw("/usr/src/drivers/proj/images/image_0.mg", 22, 12, 850, 700);
	else if(i == 1)
		vg_draw("/usr/src/drivers/proj/images/image_1.mg", 22, 12, 850, 700);
	else if(i == 2)
		vg_draw("/usr/src/drivers/proj/images/image_2.mg", 22, 12, 850, 700);
	else if(i == 3)
		vg_draw("/usr/src/drivers/proj/images/image_3.mg", 22, 12, 850, 700);
	else if(i == 4)
		vg_draw("/usr/src/drivers/proj/images/image_4.mg", 22, 12, 850, 700);
	else if(i == 5)
		vg_draw("/usr/src/drivers/proj/images/image_5.mg", 22, 12, 850, 700);
	else if(i == 6)
		vg_draw("/usr/src/drivers/proj/images/image_6.mg", 22, 12, 850, 700);
	else if(i == 7)
		vg_draw("/usr/src/drivers/proj/images/image_7.mg", 22, 12, 850, 700);
	else if(i == 8)
		vg_draw("/usr/src/drivers/proj/images/image_8.mg", 22, 12, 850, 700);
	else if(i == 9)
		vg_draw("/usr/src/drivers/proj/images/image_9.mg", 22, 12, 850, 700);

	if(ii == 0)
		vg_draw("/usr/src/drivers/proj/images/image_0.mg", 22, 12, 862, 700);
	else if(ii == 1)
		vg_draw("/usr/src/drivers/proj/images/image_1.mg", 22, 12, 862, 700);
	else if(ii == 2)
		vg_draw("/usr/src/drivers/proj/images/image_2.mg", 22, 12, 862, 700);
	else if(ii == 3)
		vg_draw("/usr/src/drivers/proj/images/image_3.mg", 22, 12, 862, 700);
	else if(ii == 4)
		vg_draw("/usr/src/drivers/proj/images/image_4.mg", 22, 12, 862, 700);
	else if(ii == 5)
		vg_draw("/usr/src/drivers/proj/images/image_5.mg", 22, 12, 862, 700);
	else if(ii == 6)
		vg_draw("/usr/src/drivers/proj/images/image_6.mg", 22, 12, 862, 700);
	else if(ii == 7)
		vg_draw("/usr/src/drivers/proj/images/image_7.mg", 22, 12, 862, 700);
	else if(ii == 8)
		vg_draw("/usr/src/drivers/proj/images/image_8.mg", 22, 12, 862, 700);
	else if(ii == 9)
		vg_draw("/usr/src/drivers/proj/images/image_9.mg", 22, 12, 862, 700);

	vg_draw("/usr/src/drivers/proj/images/image_11.mg", 22, 12, 874, 700);

	if(j == 0)
		vg_draw("/usr/src/drivers/proj/images/image_0.mg", 22, 12, 886, 700);
	else if(j == 1)
		vg_draw("/usr/src/drivers/proj/images/image_1.mg", 22, 12, 886, 700);
	else if(j == 2)
		vg_draw("/usr/src/drivers/proj/images/image_2.mg", 22, 12, 886, 700);
	else if(j == 3)
		vg_draw("/usr/src/drivers/proj/images/image_3.mg", 22, 12, 886, 700);
	else if(j == 4)
		vg_draw("/usr/src/drivers/proj/images/image_4.mg", 22, 12, 886, 700);
	else if(j == 5)
		vg_draw("/usr/src/drivers/proj/images/image_5.mg", 22, 12, 886, 700);
	else if(j == 6)
		vg_draw("/usr/src/drivers/proj/images/image_6.mg", 22, 12, 886, 700);
	else if(j == 7)
		vg_draw("/usr/src/drivers/proj/images/image_7.mg", 22, 12, 886, 700);
	else if(j == 8)
		vg_draw("/usr/src/drivers/proj/images/image_8.mg", 22, 12, 886, 700);
	else if(j == 9)
		vg_draw("/usr/src/drivers/proj/images/image_9.mg", 22, 12, 886, 700);

	if(jj == 0)
		vg_draw("/usr/src/drivers/proj/images/image_0.mg", 22, 12, 898, 700);
	else if(jj == 1)
		vg_draw("/usr/src/drivers/proj/images/image_1.mg", 22, 12, 898, 700);
	else if(jj == 2)
		vg_draw("/usr/src/drivers/proj/images/image_2.mg", 22, 12, 898, 700);
	else if(jj == 3)
		vg_draw("/usr/src/drivers/proj/images/image_3.mg", 22, 12, 898, 700);
	else if(jj == 4)
		vg_draw("/usr/src/drivers/proj/images/image_4.mg", 22, 12, 898, 700);
	else if(jj == 5)
		vg_draw("/usr/src/drivers/proj/images/image_5.mg", 22, 12, 898, 700);
	else if(jj == 6)
		vg_draw("/usr/src/drivers/proj/images/image_6.mg", 22, 12, 898, 700);
	else if(jj == 7)
		vg_draw("/usr/src/drivers/proj/images/image_7.mg", 22, 12, 898, 700);
	else if(jj == 8)
		vg_draw("/usr/src/drivers/proj/images/image_8.mg", 22, 12, 898, 700);
	else if(jj == 9)
		vg_draw("/usr/src/drivers/proj/images/image_9.mg", 22, 12, 898, 700);

	vg_draw("/usr/src/drivers/proj/images/image_11.mg", 22, 12, 910, 700);

	if(k == 0)
		vg_draw("/usr/src/drivers/proj/images/image_0.mg", 22, 12, 922, 700);
	else if(k == 1)
		vg_draw("/usr/src/drivers/proj/images/image_1.mg", 22, 12, 922, 700);
	else if(k == 2)
		vg_draw("/usr/src/drivers/proj/images/image_2.mg", 22, 12, 922, 700);
	else if(k == 3)
		vg_draw("/usr/src/drivers/proj/images/image_3.mg", 22, 12, 922, 700);
	else if(k == 4)
		vg_draw("/usr/src/drivers/proj/images/image_4.mg", 22, 12, 922, 700);
	else if(k == 5)
		vg_draw("/usr/src/drivers/proj/images/image_5.mg", 22, 12, 922, 700);
	else if(k == 6)
		vg_draw("/usr/src/drivers/proj/images/image_6.mg", 22, 12, 922, 700);
	else if(k == 7)
		vg_draw("/usr/src/drivers/proj/images/image_7.mg", 22, 12, 922, 700);
	else if(k == 8)
		vg_draw("/usr/src/drivers/proj/images/image_8.mg", 22, 12, 922, 700);
	else if(k == 9)
		vg_draw("/usr/src/drivers/proj/images/image_9.mg", 22, 12, 922, 700);

	if(kk == 0)
		vg_draw("/usr/src/drivers/proj/images/image_0.mg", 22, 12, 934, 700);
	else if(kk == 1)
		vg_draw("/usr/src/drivers/proj/images/image_1.mg", 22, 12, 934, 700);
	else if(kk == 2)
		vg_draw("/usr/src/drivers/proj/images/image_2.mg", 22, 12, 934, 700);
	else if(kk == 3)
		vg_draw("/usr/src/drivers/proj/images/image_3.mg", 22, 12, 934, 700);
	else if(kk == 4)
		vg_draw("/usr/src/drivers/proj/images/image_4.mg", 22, 12, 934, 700);
	else if(kk == 5)
		vg_draw("/usr/src/drivers/proj/images/image_5.mg", 22, 12, 934, 700);
	else if(kk == 6)
		vg_draw("/usr/src/drivers/proj/images/image_6.mg", 22, 12, 934, 700);
	else if(kk == 7)
		vg_draw("/usr/src/drivers/proj/images/image_7.mg", 22, 12, 934, 700);
	else if(kk == 8)
		vg_draw("/usr/src/drivers/proj/images/image_8.mg", 22, 12, 934, 700);
	else if(kk == 9)
		vg_draw("/usr/src/drivers/proj/images/image_9.mg", 22, 12, 934, 700);
}