[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