Skip to content

Commit e4f42d8

Browse files
authored
Merge pull request #13709 from OpenNuvoton/nvt_i2c_timeout_5.15
mbed-os-5.15: Nuvoton: Fix NuMaker I2C timeout
2 parents 99661bd + 3d0be7d commit e4f42d8

File tree

8 files changed

+56
-16
lines changed

8 files changed

+56
-16
lines changed

targets/TARGET_NUVOTON/TARGET_M2351/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "nu_miscutil.h"
2626
#include "nu_bitutil.h"
2727
#include "mbed_critical.h"
28+
#include "us_ticker_api.h"
2829

2930
struct nu_i2c_var {
3031
i2c_t * obj;
@@ -463,6 +464,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
463464
{
464465
uint32_t t1, t2, elapsed = 0;
465466
int status_assert = 0;
467+
const uint32_t bits = us_ticker_get_info()->bits;
468+
const uint32_t mask = (1 << bits) - 1;
466469

467470
t1 = us_ticker_read();
468471
while (1) {
@@ -472,7 +475,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
472475
}
473476

474477
t2 = us_ticker_read();
475-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
478+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
476479
if (elapsed >= timeout) {
477480
break;
478481
}
@@ -487,6 +490,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
487490
int tran_started;
488491
char *tran_pos = NULL;
489492
char *tran_pos2 = NULL;
493+
const uint32_t bits = us_ticker_get_info()->bits;
494+
const uint32_t mask = (1 << bits) - 1;
490495

491496
i2c_disable_int(obj);
492497
tran_pos = obj->i2c.tran_pos;
@@ -510,7 +515,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
510515
continue;
511516
}
512517

513-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
518+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
514519
if (elapsed >= timeout) { // Transfer idle
515520
break;
516521
}

targets/TARGET_NUVOTON/TARGET_M2354/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "nu_miscutil.h"
2929
#include "nu_bitutil.h"
3030
#include "mbed_critical.h"
31+
#include "us_ticker_api.h"
3132

3233
struct nu_i2c_var {
3334
i2c_t * obj;
@@ -466,6 +467,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
466467
{
467468
uint32_t t1, t2, elapsed = 0;
468469
int status_assert = 0;
470+
const uint32_t bits = us_ticker_get_info()->bits;
471+
const uint32_t mask = (1 << bits) - 1;
469472

470473
t1 = us_ticker_read();
471474
while (1) {
@@ -475,7 +478,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
475478
}
476479

477480
t2 = us_ticker_read();
478-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
481+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
479482
if (elapsed >= timeout) {
480483
break;
481484
}
@@ -490,6 +493,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
490493
int tran_started;
491494
char *tran_pos = NULL;
492495
char *tran_pos2 = NULL;
496+
const uint32_t bits = us_ticker_get_info()->bits;
497+
const uint32_t mask = (1 << bits) - 1;
493498

494499
i2c_disable_int(obj);
495500
tran_pos = obj->i2c.tran_pos;
@@ -513,7 +518,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
513518
continue;
514519
}
515520

516-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
521+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
517522
if (elapsed >= timeout) { // Transfer idle
518523
break;
519524
}

targets/TARGET_NUVOTON/TARGET_M251/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "nu_miscutil.h"
2828
#include "nu_bitutil.h"
2929
#include "mbed_critical.h"
30+
#include "us_ticker_api.h"
3031

3132
struct nu_i2c_var {
3233
i2c_t * obj;
@@ -450,6 +451,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
450451
{
451452
uint32_t t1, t2, elapsed = 0;
452453
int status_assert = 0;
454+
const uint32_t bits = us_ticker_get_info()->bits;
455+
const uint32_t mask = (1 << bits) - 1;
453456

454457
t1 = us_ticker_read();
455458
while (1) {
@@ -459,7 +462,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
459462
}
460463

461464
t2 = us_ticker_read();
462-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
465+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
463466
if (elapsed >= timeout) {
464467
break;
465468
}
@@ -474,6 +477,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
474477
int tran_started;
475478
char *tran_pos = NULL;
476479
char *tran_pos2 = NULL;
480+
const uint32_t bits = us_ticker_get_info()->bits;
481+
const uint32_t mask = (1 << bits) - 1;
477482

478483
i2c_disable_int(obj);
479484
tran_pos = obj->i2c.tran_pos;
@@ -497,7 +502,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
497502
continue;
498503
}
499504

500-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
505+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
501506
if (elapsed >= timeout) { // Transfer idle
502507
break;
503508
}

targets/TARGET_NUVOTON/TARGET_M261/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "nu_miscutil.h"
2727
#include "nu_bitutil.h"
2828
#include "mbed_critical.h"
29+
#include "us_ticker_api.h"
2930

3031
struct nu_i2c_var {
3132
i2c_t * obj;
@@ -455,6 +456,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
455456
{
456457
uint32_t t1, t2, elapsed = 0;
457458
int status_assert = 0;
459+
const uint32_t bits = us_ticker_get_info()->bits;
460+
const uint32_t mask = (1 << bits) - 1;
458461

459462
t1 = us_ticker_read();
460463
while (1) {
@@ -464,7 +467,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
464467
}
465468

466469
t2 = us_ticker_read();
467-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
470+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
468471
if (elapsed >= timeout) {
469472
break;
470473
}
@@ -479,6 +482,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
479482
int tran_started;
480483
char *tran_pos = NULL;
481484
char *tran_pos2 = NULL;
485+
const uint32_t bits = us_ticker_get_info()->bits;
486+
const uint32_t mask = (1 << bits) - 1;
482487

483488
i2c_disable_int(obj);
484489
tran_pos = obj->i2c.tran_pos;
@@ -502,7 +507,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
502507
continue;
503508
}
504509

505-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
510+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
506511
if (elapsed >= timeout) { // Transfer idle
507512
break;
508513
}

targets/TARGET_NUVOTON/TARGET_M451/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "nu_miscutil.h"
2626
#include "nu_bitutil.h"
2727
#include "mbed_critical.h"
28+
#include "us_ticker_api.h"
2829

2930
#define NU_I2C_DEBUG 0
3031

@@ -480,6 +481,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
480481
{
481482
uint32_t t1, t2, elapsed = 0;
482483
int status_assert = 0;
484+
const uint32_t bits = us_ticker_get_info()->bits;
485+
const uint32_t mask = (1 << bits) - 1;
483486

484487
t1 = us_ticker_read();
485488
while (1) {
@@ -489,7 +492,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
489492
}
490493

491494
t2 = us_ticker_read();
492-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
495+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
493496
if (elapsed >= timeout) {
494497
#if NU_I2C_DEBUG
495498
MY_I2C_T1 = t1;
@@ -512,6 +515,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
512515
int tran_started;
513516
char *tran_pos = NULL;
514517
char *tran_pos2 = NULL;
518+
const uint32_t bits = us_ticker_get_info()->bits;
519+
const uint32_t mask = (1 << bits) - 1;
515520

516521
i2c_disable_int(obj);
517522
tran_pos = obj->i2c.tran_pos;
@@ -535,7 +540,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
535540
continue;
536541
}
537542

538-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
543+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
539544
if (elapsed >= timeout) { // Transfer idle
540545
#if NU_I2C_DEBUG
541546
MY_I2C = obj->i2c;

targets/TARGET_NUVOTON/TARGET_M480/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "nu_miscutil.h"
2626
#include "nu_bitutil.h"
2727
#include "mbed_critical.h"
28+
#include "us_ticker_api.h"
2829

2930
struct nu_i2c_var {
3031
i2c_t * obj;
@@ -454,6 +455,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
454455
{
455456
uint32_t t1, t2, elapsed = 0;
456457
int status_assert = 0;
458+
const uint32_t bits = us_ticker_get_info()->bits;
459+
const uint32_t mask = (1 << bits) - 1;
457460

458461
t1 = us_ticker_read();
459462
while (1) {
@@ -463,7 +466,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
463466
}
464467

465468
t2 = us_ticker_read();
466-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
469+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
467470
if (elapsed >= timeout) {
468471
break;
469472
}
@@ -478,6 +481,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
478481
int tran_started;
479482
char *tran_pos = NULL;
480483
char *tran_pos2 = NULL;
484+
const uint32_t bits = us_ticker_get_info()->bits;
485+
const uint32_t mask = (1 << bits) - 1;
481486

482487
i2c_disable_int(obj);
483488
tran_pos = obj->i2c.tran_pos;
@@ -501,7 +506,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
501506
continue;
502507
}
503508

504-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
509+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
505510
if (elapsed >= timeout) { // Transfer idle
506511
break;
507512
}

targets/TARGET_NUVOTON/TARGET_NANO100/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "nu_miscutil.h"
2626
#include "nu_bitutil.h"
2727
#include "mbed_critical.h"
28+
#include "us_ticker_api.h"
2829

2930
#define NU_I2C_DEBUG 0
3031

@@ -500,6 +501,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
500501
{
501502
uint32_t t1, t2, elapsed = 0;
502503
int status_assert = 0;
504+
const uint32_t bits = us_ticker_get_info()->bits;
505+
const uint32_t mask = (1 << bits) - 1;
503506

504507
t1 = us_ticker_read();
505508
while (1) {
@@ -509,7 +512,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
509512
}
510513

511514
t2 = us_ticker_read();
512-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
515+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
513516
if (elapsed >= timeout) {
514517
#if NU_I2C_DEBUG
515518
MY_I2C_T1 = t1;
@@ -532,6 +535,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
532535
int tran_started;
533536
char *tran_pos = NULL;
534537
char *tran_pos2 = NULL;
538+
const uint32_t bits = us_ticker_get_info()->bits;
539+
const uint32_t mask = (1 << bits) - 1;
535540

536541
i2c_disable_int(obj);
537542
tran_pos = obj->i2c.tran_pos;
@@ -555,7 +560,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
555560
continue;
556561
}
557562

558-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
563+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
559564
if (elapsed >= timeout) { // Transfer idle
560565
#if NU_I2C_DEBUG
561566
MY_I2C = obj->i2c;

targets/TARGET_NUVOTON/TARGET_NUC472/i2c_api.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "nu_miscutil.h"
2626
#include "nu_bitutil.h"
2727
#include "mbed_critical.h"
28+
#include "us_ticker_api.h"
2829

2930
#define NU_I2C_DEBUG 0
3031

@@ -497,6 +498,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
497498
{
498499
uint32_t t1, t2, elapsed = 0;
499500
int status_assert = 0;
501+
const uint32_t bits = us_ticker_get_info()->bits;
502+
const uint32_t mask = (1 << bits) - 1;
500503

501504
t1 = us_ticker_read();
502505
while (1) {
@@ -506,7 +509,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
506509
}
507510

508511
t2 = us_ticker_read();
509-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
512+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
510513
if (elapsed >= timeout) {
511514
#if NU_I2C_DEBUG
512515
MY_I2C_T1 = t1;
@@ -529,6 +532,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
529532
int tran_started;
530533
char *tran_pos = NULL;
531534
char *tran_pos2 = NULL;
535+
const uint32_t bits = us_ticker_get_info()->bits;
536+
const uint32_t mask = (1 << bits) - 1;
532537

533538
i2c_disable_int(obj);
534539
tran_pos = obj->i2c.tran_pos;
@@ -552,7 +557,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
552557
continue;
553558
}
554559

555-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
560+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
556561
if (elapsed >= timeout) { // Transfer idle
557562
#if NU_I2C_DEBUG
558563
MY_I2C = obj->i2c;

0 commit comments

Comments
 (0)