void iniz( u32 idt, u32 gdt ) { exIdt = idt; exGdt = gdt; inizVConsole(); // Configuring PIT (programmable interval timer) // PIT Channel 0 - IRQ0 - scheduler INIT_PIT( PIT_CONFIG_CH0 | PIT_MODE3 | PIT_BIN | PIT_READ_LHB ); SET_PIT( PIT_DIVIDER(20), PIT_CH0 ); // Set 24-hour mode // Set binary data format wrcmos( rdcmos(CMOS_RTC_STATUSB) | 0x4 | 0x2, CMOS_RTC_STATUSB ); // If battery is low... if( !(rdcmos(CMOS_RTC_STATUSD) & 0x80) ) vsprint("warning: cmos battery is low\n"); // Configuring PIC and interrupts setTrapGate( &onIRQ0, IRQ(0) ); setTrapGate( &onIRQ1, IRQ(1) ); SET_PIC_MASK( ~0x0300 ); // Configuring scheduler inizTask( &xtask, TSS_ENTRY(0) ); LTR( xtask.uid ); currentTask = &xtask; currentTask->next = currentTask; };
unsigned long rtc_time_m48t37(paddr_t base, unsigned reg_shift, int mmap, int cent_reg) { struct tm tm; int cent = 0; //Tell Neutrino what kind of chip for 'rtc' utility hwi_add_rtc("m48t37", base, reg_shift, 0x8000, mmap, cent_reg); chip_access(base, reg_shift, mmap, 0x8000); do { tm.tm_sec = rdcmos(M48T37_TIME_REGS + 0x9); tm.tm_min = rdcmos(M48T37_TIME_REGS + 0xa); tm.tm_hour = rdcmos(M48T37_TIME_REGS + 0xb); tm.tm_mday = rdcmos(M48T37_TIME_REGS + 0xd); tm.tm_mon = rdcmos(M48T37_TIME_REGS + 0xe); tm.tm_year = rdcmos(M48T37_TIME_REGS + 0xf); if(cent_reg >= 0) cent = rdcmos(M48T37_TIME_REGS + cent_reg); //Loop while time inconsistent } while(tm.tm_sec != rdcmos(M48T37_TIME_REGS + 0x9)); chip_done(); tm.tm_sec &= ~0x80; tm.tm_sec = bcd2bin(tm.tm_sec); tm.tm_min = bcd2bin(tm.tm_min); tm.tm_hour = bcd2bin(tm.tm_hour); tm.tm_mday = bcd2bin(tm.tm_mday); tm.tm_mon = bcd2bin(tm.tm_mon); tm.tm_year = bcd2bin(tm.tm_year); tm.tm_mon -= 1; if(cent_reg >= 0) { if(cent > 19) tm.tm_year += (bcd2bin(cent)-19) * 100; } else if(tm.tm_year < 70) { tm.tm_year += 100; //21st century. } return(calc_time_t(&tm)); }
unsigned long rtc_time_mc146818(paddr_t base, unsigned reg_shift, int mmap, int cent_reg) { struct tm tm; unsigned save_hour; unsigned reg_b; unsigned cent; unsigned char sra; //Tell Neutrino what kind of chip for 'rtc' utility hwi_add_rtc("mc146818", base, reg_shift, 2, mmap, cent_reg); chip_access(base, reg_shift, mmap, 2); // bail if the clock is not running. sra = rdcmos(MC146818_SRA); if ((sra & 0x60) != 0x20) { chip_write8 (1, (sra | 0x60)); //Check for ATI IXP200 RTC - these bits are reserved if ((rdcmos(MC146818_SRA) & 0x60) != 0) { chip_write8 (1, sra); //restore old value return(0L); } } reg_b = rdcmos(MC146818_SRB); do { tm.tm_sec = rdcmos(0); tm.tm_min = rdcmos(2); tm.tm_hour = rdcmos(4); tm.tm_mday = rdcmos(7); tm.tm_mon = rdcmos(8); tm.tm_year = rdcmos(9); //Loop while time inconsistent } while(tm.tm_sec != rdcmos(0)); chip_done(); save_hour = tm.tm_hour; tm.tm_hour &= ~0x80; if(!(reg_b & MC146818_SRB_DM)) { tm.tm_sec = bcd2bin(tm.tm_sec); tm.tm_min = bcd2bin(tm.tm_min); tm.tm_hour = bcd2bin(tm.tm_hour); tm.tm_mday = bcd2bin(tm.tm_mday); tm.tm_mon = bcd2bin(tm.tm_mon); tm.tm_year = bcd2bin(tm.tm_year); } if(!(reg_b & MC146818_SRB_24_12) && (save_hour & 0x80)) { //12 hour format & past 12pm tm.tm_hour += 12; } tm.tm_mon -= 1; if(cent_reg >= 0) { cent = rdcmos(cent_reg); //century if(!(reg_b & MC146818_SRB_DM)) { cent = bcd2bin(cent_reg); } if(cent == 20) tm.tm_year += 100; } else if(tm.tm_year < 70) { tm.tm_year += 100; //21st century. } return(calc_time_t(&tm)); }