[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