Changeset 58775d30 in mainline for uspace/drv/time/cmos-rtc/cmos-rtc.c
- Timestamp:
- 2015-03-16T16:07:21Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2003739
- Parents:
- 6069061 (diff), 795e2bf (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/time/cmos-rtc/cmos-rtc.c
r6069061 r58775d30 76 76 int clients_connected; 77 77 /** time at which the system booted */ 78 time_t boottime;78 struct timeval boot_time; 79 79 } rtc_t; 80 80 … … 97 97 static int rtc_dev_remove(ddf_dev_t *dev); 98 98 static void rtc_register_write(rtc_t *rtc, int reg, int data); 99 static time_t uptime_get(void);100 99 static bool is_battery_ok(rtc_t *rtc); 101 100 static int rtc_fun_online(ddf_fun_t *fun); … … 205 204 ddf_msg(LVL_DEBUG, "rtc_dev_initialize %s", ddf_dev_get_name(rtc->dev)); 206 205 207 rtc->boottime = 0; 206 rtc->boot_time.tv_sec = 0; 207 rtc->boot_time.tv_usec = 0; 208 208 rtc->clients_connected = 0; 209 209 … … 326 326 fibril_mutex_lock(&rtc->mutex); 327 327 328 if (rtc->boot time != 0) {328 if (rtc->boot_time.tv_sec) { 329 329 /* There is no need to read the current time from the 330 330 * device because it has already been cached. 331 331 */ 332 332 333 time_t cur_time = rtc->boottime + uptime_get(); 334 333 struct timeval curtime; 334 335 getuptime(&curtime); 336 tv_add(&curtime, &rtc->boot_time); 335 337 fibril_mutex_unlock(&rtc->mutex); 336 338 337 return time_ local2tm(cur_time, t);339 return time_tv2tm(&curtime, t); 338 340 } 339 341 … … 344 346 } 345 347 348 /* Microseconds are below RTC's resolution, assume 0. */ 349 t->tm_usec = 0; 350 346 351 /* now read the registers */ 347 352 do { 348 353 /* Suspend until the update process has finished */ 349 while (rtc_update_in_progress(rtc)); 350 351 t->tm_sec = rtc_register_read(rtc, RTC_SEC); 352 t->tm_min = rtc_register_read(rtc, RTC_MIN); 354 while (rtc_update_in_progress(rtc)) 355 ; 356 357 t->tm_sec = rtc_register_read(rtc, RTC_SEC); 358 t->tm_min = rtc_register_read(rtc, RTC_MIN); 353 359 t->tm_hour = rtc_register_read(rtc, RTC_HOUR); 354 360 t->tm_mday = rtc_register_read(rtc, RTC_DAY); 355 t->tm_mon 361 t->tm_mon = rtc_register_read(rtc, RTC_MON); 356 362 t->tm_year = rtc_register_read(rtc, RTC_YEAR); 357 363 358 364 /* Now check if it is stable */ 359 } while(t->tm_sec 360 t->tm_min 365 } while(t->tm_sec != rtc_register_read(rtc, RTC_SEC) || 366 t->tm_min != rtc_register_read(rtc, RTC_MIN) || 361 367 t->tm_mday != rtc_register_read(rtc, RTC_DAY) || 362 t->tm_mon 368 t->tm_mon != rtc_register_read(rtc, RTC_MON) || 363 369 t->tm_year != rtc_register_read(rtc, RTC_YEAR)); 364 370 … … 366 372 bool _12h_mode = !(rtc_register_read(rtc, RTC_STATUS_B) & 367 373 RTC_B_24H); 368 369 374 if (_12h_mode) { 370 375 /* The RTC is working in 12h mode, check if it is AM or PM */ … … 378 383 /* Check if the RTC is working in BCD mode */ 379 384 bcd_mode = !(rtc_register_read(rtc, RTC_STATUS_B) & RTC_B_BCD); 380 381 385 if (bcd_mode) { 382 t->tm_sec 383 t->tm_min 386 t->tm_sec = bcd2bin(t->tm_sec); 387 t->tm_min = bcd2bin(t->tm_min); 384 388 t->tm_hour = bcd2bin(t->tm_hour); 385 389 t->tm_mday = bcd2bin(t->tm_mday); 386 t->tm_mon 390 t->tm_mon = bcd2bin(t->tm_mon); 387 391 t->tm_year = bcd2bin(t->tm_year); 388 392 } … … 414 418 result = EINVAL; 415 419 else { 416 rtc->boottime = r - uptime_get(); 420 struct timeval uptime; 421 422 getuptime(&uptime); 423 rtc->boot_time.tv_sec = r; 424 rtc->boot_time.tv_usec = t->tm_usec; /* normalized */ 425 tv_sub(&rtc->boot_time, &uptime); 417 426 result = EOK; 418 427 } … … 435 444 bool bcd_mode; 436 445 time_t norm_time; 437 time_t uptime; 446 struct timeval uptime; 447 struct timeval ntv; 438 448 int reg_b; 439 449 int reg_a; … … 445 455 return EINVAL; 446 456 447 uptime = uptime_get(); 448 if (norm_time <= uptime) { 457 ntv.tv_sec = norm_time; 458 ntv.tv_usec = t->tm_usec; 459 getuptime(&uptime); 460 461 if (tv_gteq(&uptime, &ntv)) { 449 462 /* This is not acceptable */ 450 463 return EINVAL; … … 458 471 } 459 472 460 /* boottime must be recomputed */ 461 rtc->boottime = 0; 473 /* boot_time must be recomputed */ 474 rtc->boot_time.tv_sec = 0; 475 rtc->boot_time.tv_usec = 0; 462 476 463 477 /* Detect the RTC epoch */ … … 731 745 } 732 746 733 static time_t734 uptime_get(void)735 {736 struct timeval tv;737 738 getuptime(&tv);739 740 return tv.tv_sec;741 }742 743 747 static int 744 748 rtc_fun_online(ddf_fun_t *fun)
Note:
See TracChangeset
for help on using the changeset viewer.