Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/iicbus/rtc/pcf85063.c
Show First 20 Lines • Show All 177 Lines • ▼ Show 20 Lines | pcf85063_set_time(device_t dev, struct timespec *ts) | ||||
struct pcf85063_time data; | struct pcf85063_time data; | ||||
struct bcd_clocktime bcd; | struct bcd_clocktime bcd; | ||||
int error; | int error; | ||||
error = iicdev_readfrom(dev, PCF85063_TIME_REG, &ctrl_reg, | error = iicdev_readfrom(dev, PCF85063_TIME_REG, &ctrl_reg, | ||||
sizeof(uint8_t), IIC_WAIT); | sizeof(uint8_t), IIC_WAIT); | ||||
ts->tv_sec -= utc_offset(); | ts->tv_sec -= utc_offset(); | ||||
clock_ts_to_bcd(ts, &bcd, ctrl_reg & PCF85063_CTRL1_TIME_FORMAT); | clock_ts_to_bcd(ts, &bcd, false); | ||||
clock_dbgprint_bcd(dev, CLOCK_DBG_WRITE, &bcd); | clock_dbgprint_bcd(dev, CLOCK_DBG_WRITE, &bcd); | ||||
data.sec = bcd.sec; | data.sec = bcd.sec; | ||||
data.min = bcd.min; | data.min = bcd.min; | ||||
data.hour = bcd.hour; | data.hour = bcd.hour; | ||||
data.dow = bcd.dow - 1; | data.dow = bcd.dow - 1; | ||||
data.day = bcd.day; | data.day = bcd.day; | ||||
data.mon = bcd.mon; | data.mon = bcd.mon; | ||||
data.year = bcd.year; | data.year = bcd.year; | ||||
/* Set this bit in case of 12-hour mode and pm hour. */ | |||||
if (!(ctrl_reg & PCF85063_CTRL1_TIME_FORMAT)) | |||||
if (bcd.ispm) | |||||
data.hour |= 0x20; | |||||
if (ts->tv_nsec > PCF85063_HALF_OF_SEC_NS) | if (ts->tv_nsec > PCF85063_HALF_OF_SEC_NS) | ||||
data.sec++; | data.sec++; | ||||
/* disable clock */ | /* disable clock */ | ||||
error = iicdev_readfrom(dev, PCF85063_CTRL1_REG, &ctrl_reg, | error = iicdev_readfrom(dev, PCF85063_CTRL1_REG, &ctrl_reg, | ||||
sizeof(uint8_t), IIC_WAIT); | sizeof(uint8_t), IIC_WAIT); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
ctrl_reg |= PCF85063_CTRL1_RTC_CLK_STOP; | ctrl_reg |= PCF85063_CTRL1_RTC_CLK_STOP; | ||||
/* Explicitly set 24-hour mode. */ | |||||
ctrl_reg &= ~PCF85063_CTRL1_TIME_FORMAT; | |||||
error = iicdev_writeto(dev, PCF85063_CTRL1_REG, &ctrl_reg, | error = iicdev_writeto(dev, PCF85063_CTRL1_REG, &ctrl_reg, | ||||
sizeof(uint8_t), IIC_WAIT); | sizeof(uint8_t), IIC_WAIT); | ||||
if (error != 0) | if (error != 0) | ||||
return (error); | return (error); | ||||
/* clock is disabled now, write time and date */ | /* clock is disabled now, write time and date */ | ||||
error = iicdev_writeto(dev, PCF85063_TIME_REG, &data, | error = iicdev_writeto(dev, PCF85063_TIME_REG, &data, | ||||
▲ Show 20 Lines • Show All 61 Lines • Show Last 20 Lines |