[U-Boot] [PATCH 2/2] rtc: pcf2127: Fixed bug with rtc settings and getting error time

Heiko Schocher hs at denx.de
Tue Jun 18 08:18:36 UTC 2019


Hello Lukasz,

Am 18.06.2019 um 10:06 schrieb Lukasz Majewski:
> 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.

Yep!

> It is not using generic flag and can be reused by other ICs with
> similar issues.
> 
> Let's wait for Heiko's opinion.

I already started a travis build, see:

https://travis-ci.org/hsdenx/u-boot-i2c/builds/547057368

Thanks for your comments!

bye,
Heiko
> 
> 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
> 

-- 
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-52   Fax: +49-8142-66989-80   Email: hs at denx.de


More information about the U-Boot mailing list