Skip to content

Commit 1553c7a

Browse files
committed
Fix NuMaker I2C timeout
1 parent f38aa59 commit 1553c7a

File tree

7 files changed

+49
-14
lines changed

7 files changed

+49
-14
lines changed

targets/TARGET_NUVOTON/TARGET_M2351/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;
@@ -465,6 +466,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
465466
{
466467
uint32_t t1, t2, elapsed = 0;
467468
int status_assert = 0;
469+
const uint32_t bits = us_ticker_get_info()->bits;
470+
const uint32_t mask = (1 << bits) - 1;
468471

469472
t1 = us_ticker_read();
470473
while (1) {
@@ -474,7 +477,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
474477
}
475478

476479
t2 = us_ticker_read();
477-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
480+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
478481
if (elapsed >= timeout) {
479482
break;
480483
}
@@ -489,6 +492,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
489492
int tran_started;
490493
char *tran_pos = NULL;
491494
char *tran_pos2 = NULL;
495+
const uint32_t bits = us_ticker_get_info()->bits;
496+
const uint32_t mask = (1 << bits) - 1;
492497

493498
i2c_disable_int(obj);
494499
tran_pos = obj->i2c.tran_pos;
@@ -512,7 +517,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
512517
continue;
513518
}
514519

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

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
@@ -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;
@@ -457,6 +458,8 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
457458
{
458459
uint32_t t1, t2, elapsed = 0;
459460
int status_assert = 0;
461+
const uint32_t bits = us_ticker_get_info()->bits;
462+
const uint32_t mask = (1 << bits) - 1;
460463

461464
t1 = us_ticker_read();
462465
while (1) {
@@ -466,7 +469,7 @@ static int i2c_poll_status_timeout(i2c_t *obj, int (*is_status)(i2c_t *obj), uin
466469
}
467470

468471
t2 = us_ticker_read();
469-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
472+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
470473
if (elapsed >= timeout) {
471474
break;
472475
}
@@ -481,6 +484,8 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
481484
int tran_started;
482485
char *tran_pos = NULL;
483486
char *tran_pos2 = NULL;
487+
const uint32_t bits = us_ticker_get_info()->bits;
488+
const uint32_t mask = (1 << bits) - 1;
484489

485490
i2c_disable_int(obj);
486491
tran_pos = obj->i2c.tran_pos;
@@ -504,7 +509,7 @@ static int i2c_poll_tran_heatbeat_timeout(i2c_t *obj, uint32_t timeout)
504509
continue;
505510
}
506511

507-
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + 0xFFFFFFFF - t1 + 1);
512+
elapsed = (t2 > t1) ? (t2 - t1) : ((uint64_t) t2 + mask - t1 + 1);
508513
if (elapsed >= timeout) { // Transfer idle
509514
break;
510515
}

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)