1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*
- * Read/write DS3231M RTC
- */
- #include "fw.h"
- #include "console.h"
- #include "io.h"
- static inline uint32_t i2c_wait(void)
- {
- uint32_t rdata;
- while ((rdata = I2C_RDATA) & I2C_BUSY)
- pause();
- return rdata;
- }
- static void i2c_send(uint8_t byte, uint8_t ctl)
- {
- i2c_wait();
- I2C_WDATA = (byte << 8) | I2C_NAK | ctl;
- }
- static bool i2c_acked(void)
- {
- return !(i2c_wait() & I2C_NAK);
- }
- static int i2c_recv(uint8_t ctl)
- {
- uint32_t rdata;
-
- i2c_wait();
- I2C_WDATA = (~0xff) | ctl;
- rdata = i2c_wait();
- return rdata >> 8;
- }
- #define RTC_REGS 19
- #define RTC_ADDR 0x68
- #define RTC_WCMD ((RTC_ADDR << 1)+0)
- #define RTC_RCMD ((RTC_ADDR << 1)+1)
- void read_rtc(void)
- {
- uint8_t rtc_regs[RTC_REGS];
- int i;
-
- i2c_set_speed(400);
-
- /* Synchronize I2C */
- i2c_send(0xff, I2C_P);
-
- i2c_send(RTC_WCMD, 0);
- if (!i2c_acked()) {
- con_printf("No RTC detected at I2C address 0x%02x\n", RTC_ADDR);
- i2c_send(0xff, I2C_P);
- return;
- }
-
- i2c_send(0, I2C_SR);
- i2c_send(RTC_RCMD, 0);
- con_printf("RTC register content:\n");
- for (i = 0; i < RTC_REGS-1; i++) {
- rtc_regs[i] = i2c_recv(0);
- con_printf("%02x ", rtc_regs[i]);
- }
- rtc_regs[i] = i2c_recv(I2C_NAK | I2C_P);
- con_printf("%02x\n", rtc_regs[i]);
- }
|