Skip to content

Commit 9ce040e

Browse files
authored
Merge pull request #3551 from TomoYamanaka/master
Fix I2C driver for RZ/A1H
2 parents 209ac78 + 0236d95 commit 9ce040e

File tree

2 files changed

+138
-124
lines changed

2 files changed

+138
-124
lines changed

targets/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c

Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,6 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
416416
int value;
417417
volatile uint32_t work_reg = 0;
418418

419-
if(length <= 0) {
420-
return 0;
421-
}
422419
i2c_set_MR3_ACK(obj);
423420
/* There is a STOP condition for last processing */
424421
if (obj->i2c.last_stop_flag != 0) {
@@ -448,76 +445,90 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
448445
obj->i2c.last_stop_flag = 1;
449446
return I2C_ERROR_NO_SLAVE;
450447
}
451-
/* Read in all except last byte */
452-
if (length > 2) {
453-
/* dummy read */
454-
value = REG(DRR.UINT32);
455-
for (count = 0; count < (length - 1); count++) {
448+
if (length != 0) {
449+
/* Read in all except last byte */
450+
if (length > 2) {
451+
/* dummy read */
452+
value = REG(DRR.UINT32);
453+
for (count = 0; count < (length - 1); count++) {
454+
/* wait for it to arrive */
455+
status = i2c_wait_RDRF(obj);
456+
if (status != 0) {
457+
i2c_set_err_noslave(obj);
458+
return I2C_ERROR_NO_SLAVE;
459+
}
460+
/* Recieve the data */
461+
if (count == (length - 2)) {
462+
value = i2c_do_read(obj, 1);
463+
} else if ((length >= 3) && (count == (length - 3))) {
464+
value = i2c_do_read(obj, 2);
465+
} else {
466+
value = i2c_do_read(obj, 0);
467+
}
468+
data[count] = (char)value;
469+
}
470+
} else if (length == 2) {
471+
/* Set MR3 WAIT bit is 1 */
472+
REG(MR3.UINT32) |= MR3_WAIT;
473+
/* dummy read */
474+
value = REG(DRR.UINT32);
456475
/* wait for it to arrive */
457476
status = i2c_wait_RDRF(obj);
458477
if (status != 0) {
459478
i2c_set_err_noslave(obj);
460479
return I2C_ERROR_NO_SLAVE;
461480
}
462-
/* Recieve the data */
463-
if (count == (length - 2)) {
464-
value = i2c_do_read(obj, 1);
465-
} else if ((length >= 3) && (count == (length - 3))) {
466-
value = i2c_do_read(obj, 2);
467-
} else {
468-
value = i2c_do_read(obj, 0);
469-
}
470-
data[count] = (char)value;
481+
i2c_set_MR3_NACK(obj);
482+
data[count] = (char)REG(DRR.UINT32);
483+
count++;
484+
} else {
485+
/* length == 1 */
486+
/* Set MR3 WAIT bit is 1 */;
487+
REG(MR3.UINT32) |= MR3_WAIT;
488+
i2c_set_MR3_NACK(obj);
489+
/* dummy read */
490+
value = REG(DRR.UINT32);
471491
}
472-
} else if (length == 2) {
473-
/* Set MR3 WAIT bit is 1 */
474-
REG(MR3.UINT32) |= MR3_WAIT;
475-
/* dummy read */
476-
value = REG(DRR.UINT32);
477492
/* wait for it to arrive */
478493
status = i2c_wait_RDRF(obj);
479494
if (status != 0) {
480495
i2c_set_err_noslave(obj);
481496
return I2C_ERROR_NO_SLAVE;
482497
}
483-
i2c_set_MR3_NACK(obj);
484-
data[count] = (char)REG(DRR.UINT32);
485-
count++;
486-
} else {
487-
/* length == 1 */
488-
/* Set MR3 WAIT bit is 1 */;
489-
REG(MR3.UINT32) |= MR3_WAIT;
490-
i2c_set_MR3_NACK(obj);
491-
/* dummy read */
492-
value = REG(DRR.UINT32);
493-
}
494-
/* wait for it to arrive */
495-
status = i2c_wait_RDRF(obj);
496-
if (status != 0) {
497-
i2c_set_err_noslave(obj);
498-
return I2C_ERROR_NO_SLAVE;
499-
}
500498

501-
/* If not repeated start, send stop. */
502-
if (stop) {
503-
(void)i2c_set_STOP(obj);
504-
/* RIICnDRR read */
505-
value = (REG(DRR.UINT32) & 0xFF);
506-
data[count] = (char)value;
507-
/* RIICnMR3.WAIT = 0 */
508-
REG(MR3.UINT32) &= ~MR3_WAIT;
509-
(void)i2c_wait_STOP(obj);
510-
i2c_set_SR2_NACKF_STOP(obj);
499+
/* If not repeated start, send stop. */
500+
if (stop) {
501+
(void)i2c_set_STOP(obj);
502+
/* RIICnDRR read */
503+
value = (REG(DRR.UINT32) & 0xFF);
504+
data[count] = (char)value;
505+
/* RIICnMR3.WAIT = 0 */
506+
REG(MR3.UINT32) &= ~MR3_WAIT;
507+
(void)i2c_wait_STOP(obj);
508+
i2c_set_SR2_NACKF_STOP(obj);
509+
} else {
510+
(void)i2c_restart(obj);
511+
/* RIICnDRR read */
512+
value = (REG(DRR.UINT32) & 0xFF);
513+
data[count] = (char)value;
514+
/* RIICnMR3.WAIT = 0 */
515+
REG(MR3.UINT32) &= ~MR3_WAIT;
516+
(void)i2c_wait_START(obj);
517+
/* SR2.START = 0 */
518+
REG(SR2.UINT32) &= ~SR2_START;
519+
}
511520
} else {
512-
(void)i2c_restart(obj);
513-
/* RIICnDRR read */
514-
value = (REG(DRR.UINT32) & 0xFF);
515-
data[count] = (char)value;
516-
/* RIICnMR3.WAIT = 0 */
517-
REG(MR3.UINT32) &= ~MR3_WAIT;
518-
(void)i2c_wait_START(obj);
519-
/* SR2.START = 0 */
520-
REG(SR2.UINT32) &= ~SR2_START;
521+
/* If not repeated start, send stop. */
522+
if (stop) {
523+
(void)i2c_set_STOP(obj);
524+
(void)i2c_wait_STOP(obj);
525+
i2c_set_SR2_NACKF_STOP(obj);
526+
} else {
527+
(void)i2c_restart(obj);
528+
(void)i2c_wait_START(obj);
529+
/* SR2.START = 0 */
530+
REG(SR2.UINT32) &= ~SR2_START;
531+
}
521532
}
522533

523534
return length;
@@ -527,10 +538,6 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
527538
int cnt;
528539
int status;
529540

530-
if(length <= 0) {
531-
return 0;
532-
}
533-
534541
/* There is a STOP condition for last processing */
535542
if (obj->i2c.last_stop_flag != 0) {
536543
status = i2c_start(obj);

targets/TARGET_RENESAS/TARGET_VK_RZ_A1H/i2c_api.c

Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -418,9 +418,6 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
418418
int value;
419419
volatile uint32_t work_reg = 0;
420420

421-
if(length <= 0) {
422-
return 0;
423-
}
424421
i2c_set_MR3_ACK(obj);
425422
/* There is a STOP condition for last processing */
426423
if (obj->last_stop_flag != 0) {
@@ -450,76 +447,90 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop) {
450447
obj->last_stop_flag = 1;
451448
return I2C_ERROR_NO_SLAVE;
452449
}
453-
/* Read in all except last byte */
454-
if (length > 2) {
455-
/* dummy read */
456-
value = REG(DRR.UINT32);
457-
for (count = 0; count < (length - 1); count++) {
450+
if (length != 0) {
451+
/* Read in all except last byte */
452+
if (length > 2) {
453+
/* dummy read */
454+
value = REG(DRR.UINT32);
455+
for (count = 0; count < (length - 1); count++) {
456+
/* wait for it to arrive */
457+
status = i2c_wait_RDRF(obj);
458+
if (status != 0) {
459+
i2c_set_err_noslave(obj);
460+
return I2C_ERROR_NO_SLAVE;
461+
}
462+
/* Recieve the data */
463+
if (count == (length - 2)) {
464+
value = i2c_do_read(obj, 1);
465+
} else if ((length >= 3) && (count == (length - 3))) {
466+
value = i2c_do_read(obj, 2);
467+
} else {
468+
value = i2c_do_read(obj, 0);
469+
}
470+
data[count] = (char)value;
471+
}
472+
} else if (length == 2) {
473+
/* Set MR3 WAIT bit is 1 */
474+
REG(MR3.UINT32) |= MR3_WAIT;
475+
/* dummy read */
476+
value = REG(DRR.UINT32);
458477
/* wait for it to arrive */
459478
status = i2c_wait_RDRF(obj);
460479
if (status != 0) {
461480
i2c_set_err_noslave(obj);
462481
return I2C_ERROR_NO_SLAVE;
463482
}
464-
/* Recieve the data */
465-
if (count == (length - 2)) {
466-
value = i2c_do_read(obj, 1);
467-
} else if ((length >= 3) && (count == (length - 3))) {
468-
value = i2c_do_read(obj, 2);
469-
} else {
470-
value = i2c_do_read(obj, 0);
471-
}
472-
data[count] = (char)value;
483+
i2c_set_MR3_NACK(obj);
484+
data[count] = (char)REG(DRR.UINT32);
485+
count++;
486+
} else {
487+
/* length == 1 */
488+
/* Set MR3 WAIT bit is 1 */;
489+
REG(MR3.UINT32) |= MR3_WAIT;
490+
i2c_set_MR3_NACK(obj);
491+
/* dummy read */
492+
value = REG(DRR.UINT32);
473493
}
474-
} else if (length == 2) {
475-
/* Set MR3 WATI bit is 1 */
476-
REG(MR3.UINT32) |= MR3_WAIT;
477-
/* dummy read */
478-
value = REG(DRR.UINT32);
479494
/* wait for it to arrive */
480495
status = i2c_wait_RDRF(obj);
481496
if (status != 0) {
482497
i2c_set_err_noslave(obj);
483498
return I2C_ERROR_NO_SLAVE;
484499
}
485-
i2c_set_MR3_NACK(obj);
486-
data[count] = (char)REG(DRR.UINT32);
487-
count++;
488-
} else {
489-
/* length == 1 */
490-
/* Set MR3 WATI bit is 1 */;
491-
REG(MR3.UINT32) |= MR3_WAIT;
492-
i2c_set_MR3_NACK(obj);
493-
/* dummy read */
494-
value = REG(DRR.UINT32);
495-
}
496-
/* wait for it to arrive */
497-
status = i2c_wait_RDRF(obj);
498-
if (status != 0) {
499-
i2c_set_err_noslave(obj);
500-
return I2C_ERROR_NO_SLAVE;
501-
}
502500

503-
/* If not repeated start, send stop. */
504-
if (stop) {
505-
(void)i2c_set_STOP(obj);
506-
/* RIICnDRR read */
507-
value = (REG(DRR.UINT32) & 0xFF);
508-
data[count] = (char)value;
509-
/* RIICnMR3.WAIT = 0 */
510-
REG(MR3.UINT32) &= ~MR3_WAIT;
511-
(void)i2c_wait_STOP(obj);
512-
i2c_set_SR2_NACKF_STOP(obj);
501+
/* If not repeated start, send stop. */
502+
if (stop) {
503+
(void)i2c_set_STOP(obj);
504+
/* RIICnDRR read */
505+
value = (REG(DRR.UINT32) & 0xFF);
506+
data[count] = (char)value;
507+
/* RIICnMR3.WAIT = 0 */
508+
REG(MR3.UINT32) &= ~MR3_WAIT;
509+
(void)i2c_wait_STOP(obj);
510+
i2c_set_SR2_NACKF_STOP(obj);
511+
} else {
512+
(void)i2c_restart(obj);
513+
/* RIICnDRR read */
514+
value = (REG(DRR.UINT32) & 0xFF);
515+
data[count] = (char)value;
516+
/* RIICnMR3.WAIT = 0 */
517+
REG(MR3.UINT32) &= ~MR3_WAIT;
518+
(void)i2c_wait_START(obj);
519+
/* SR2.START = 0 */
520+
REG(SR2.UINT32) &= ~SR2_START;
521+
}
513522
} else {
514-
(void)i2c_restart(obj);
515-
/* RIICnDRR read */
516-
value = (REG(DRR.UINT32) & 0xFF);
517-
data[count] = (char)value;
518-
/* RIICnMR3.WAIT = 0 */
519-
REG(MR3.UINT32) &= ~MR3_WAIT;
520-
(void)i2c_wait_START(obj);
521-
/* SR2.START = 0 */
522-
REG(SR2.UINT32) &= ~SR2_START;
523+
/* If not repeated start, send stop. */
524+
if (stop) {
525+
(void)i2c_set_STOP(obj);
526+
(void)i2c_wait_STOP(obj);
527+
i2c_set_SR2_NACKF_STOP(obj);
528+
} else {
529+
(void)i2c_restart(obj);
530+
(void)i2c_wait_START(obj);
531+
/* SR2.START = 0 */
532+
REG(SR2.UINT32) &= ~SR2_START;
533+
}
523534
}
524535

525536
return length;
@@ -529,10 +540,6 @@ int i2c_write(i2c_t *obj, int address, const char *data, int length, int stop) {
529540
int cnt;
530541
int status;
531542

532-
if(length <= 0) {
533-
return 0;
534-
}
535-
536543
/* There is a STOP condition for last processing */
537544
if (obj->last_stop_flag != 0) {
538545
status = i2c_start(obj);

0 commit comments

Comments
 (0)