[U-Boot] [EXT] Re: [PATCH 2/2] rtc: pcf2127: Fixed bug with rtc settings and getting error time
Chuanhua Han
chuanhua.han at nxp.com
Mon Jun 24 04:48:35 UTC 2019
+ Simon Glass
> -----Original Message-----
> From: Lukasz Majewski <lukma at denx.de>
> Sent: 2019年6月18日 16:06
> To: Chuanhua Han <chuanhua.han at nxp.com>
> Cc: hs at denx.de; sjg at chromium.org; Biwen Li <biwen.li at nxp.com>;
> u-boot at lists.denx.de
> Subject: [EXT] Re: [PATCH 2/2] rtc: pcf2127: Fixed bug with rtc settings and
> getting error time
>
> Hi Chuanhua,
>
> > The previous pcf2127 RTC chip could not read and set the correct time.
> > When reading the data of internal registers, the read address was the
> > value of register plus 1. This is because this chip requires the host
> > to send a stop signal after setting the register address and before
> > reading the register data.
> >
> > This patch sets the DM_I2C_CHIP_ADDR_STOP flag in order to generate a
> > stop signal and fixes the bug of the original read and write time.
>
> Thank you for the patch. It now looks far more better than the previous
> versions.
>
> It is not using generic flag and can be reused by other ICs with similar issues.
>
> Let's wait for Heiko's opinion.
>
> Reviewed-by: Lukasz Majewski <lukma at denx.de>
>
> >
> > Signed-off-by: Biwen Li <biwen.li at nxp.com>
> > Signed-off-by: Chuanhua Han <chuanhua.han at nxp.com>
> > ---
> > Changes in v4:
> > - Replace DM_I2C_CHIP_RD_NO_I2C_SETUP_OFFSET with
> > DM_I2C_CHIP_ADDR_STOP.
> >
> > Changes in v3:
> > - When the rtc time is obtained, the address of the set register is
> > separated from the read data.
> >
> > Changes in v2:
> > - Split the original patch into 3 patches
> > - Add detailed description information for each patch
> >
> > drivers/rtc/pcf2127.c | 20 ++++++++++++++------
> > 1 file changed, 14 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/rtc/pcf2127.c b/drivers/rtc/pcf2127.c index
> > dcf0340b4d..65794b98e6 100644
> > --- a/drivers/rtc/pcf2127.c
> > +++ b/drivers/rtc/pcf2127.c
> > @@ -24,12 +24,9 @@
> >
> > static int pcf2127_rtc_set(struct udevice *dev, const struct rtc_time
> > *tm) {
> > - uchar buf[8];
> > + uchar buf[7] = {0};
> > int i = 0, ret;
> >
> > - /* start register address */
> > - buf[i++] = PCF2127_REG_SC;
> > -
> > /* hours, minutes and seconds */
> > buf[i++] = bin2bcd(tm->tm_sec);
> > buf[i++] = bin2bcd(tm->tm_min);
> > @@ -44,7 +41,7 @@ static int pcf2127_rtc_set(struct udevice *dev,
> > const struct rtc_time *tm) buf[i++] = bin2bcd(tm->tm_year % 100);
> >
> > /* write register's data */
> > - ret = dm_i2c_write(dev, PCF2127_REG_CTRL1, buf, sizeof(buf));
> > + ret = dm_i2c_write(dev, PCF2127_REG_SC, buf, i);
> >
> > return ret;
> > }
> > @@ -54,9 +51,12 @@ static int pcf2127_rtc_get(struct udevice *dev,
> > struct rtc_time *tm) int ret = 0;
> > uchar buf[10] = { PCF2127_REG_CTRL1 };
> >
> > - ret = dm_i2c_write(dev, PCF2127_REG_CTRL1, buf, 1);
> > + /* Set the address of the start register to be read */
> > + ret = dm_i2c_write(dev, PCF2127_REG_CTRL1, NULL, 0);
> > if (ret < 0)
> > return ret;
> > +
> > + /* Read register's data */
> > ret = dm_i2c_read(dev, PCF2127_REG_CTRL1, buf, sizeof(buf));
> > if (ret < 0)
> > return ret;
> > @@ -90,6 +90,13 @@ static int pcf2127_rtc_reset(struct udevice *dev)
> > return 0;
> > }
> >
> > +static int pcf2127_probe(struct udevice *dev) {
> > + i2c_set_chip_flags(dev, DM_I2C_CHIP_ADDR_STOP);
> > +
> > + return 0;
> > +}
> > +
> > static const struct rtc_ops pcf2127_rtc_ops = {
> > .get = pcf2127_rtc_get,
> > .set = pcf2127_rtc_set,
> > @@ -104,6 +111,7 @@ static const struct udevice_id pcf2127_rtc_ids[] =
> > { U_BOOT_DRIVER(rtc_pcf2127) = {
> > .name = "rtc-pcf2127",
> > .id = UCLASS_RTC,
> > + .probe = pcf2127_probe,
> > .of_match = pcf2127_rtc_ids,
> > .ops = &pcf2127_rtc_ops,
> > };
>
>
>
>
> Best regards,
>
> Lukasz Majewski
>
> --
>
> DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
> HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
> Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
More information about the U-Boot
mailing list