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; }
// 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); }
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); }