From 7ea20169533a5fbb10decd377bca55d1fb521c5b Mon Sep 17 00:00:00 2001 From: Masao Hamanaka Date: Thu, 4 Dec 2014 15:40:38 +0900 Subject: [PATCH 1/2] Fix a bug that I2C freq become fixed 100kHz When I2C read/write, I2C freq ignores the setting of user and it become fixed 100kHz. Implement change the freq according to the setting of user. --- .../TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c | 29 ++++++++++--------- .../TARGET_RENESAS/TARGET_RZ_A1H/objects.h | 2 ++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c index 875033b303..d18b92fd92 100644 --- a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c +++ b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/i2c_api.c @@ -72,8 +72,10 @@ static void i2c_reg_reset(i2c_t *obj) { REG(MR1.UINT8[0]) = 0x08; // P_phi /8 9bit (including Ack) REG(SER.UINT8[0]) = 0x00; // no slave addr enabled - // set default frequency at 100k - i2c_frequency(obj, 100000); + // set frequency + REG(MR1.UINT8[0]) |= obj->pclk_bit; + REG(BRL.UINT32) = obj->width; + REG(BRH.UINT32) = obj->width; REG(MR2.UINT8[0]) = 0x07; REG(MR3.UINT8[0]) = 0x00; @@ -130,6 +132,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) { // enable power i2c_power_enable(obj); + // set default frequency at 100k + i2c_frequency(obj, 100000); + // full reset i2c_reg_reset(obj); @@ -209,15 +214,14 @@ void i2c_frequency(i2c_t *obj, int hz) { uint32_t width = 0; uint8_t count; uint8_t pclk_bit = 0; - + /* set PCLK */ - if (false == RZ_A1_IsClockMode0()) - { + if (false == RZ_A1_IsClockMode0()) { pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK; } else { pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK; } - + /* Min 10kHz, Max 400kHz */ if (hz < 10000) { freq = 10000; @@ -226,7 +230,7 @@ void i2c_frequency(i2c_t *obj, int hz) { } else { freq = hz; } - + for (count = 0; count < 7; count++) { // IIC phi = P0 phi / rate pclk = pclk_base / (2 << count); @@ -250,15 +254,12 @@ void i2c_frequency(i2c_t *obj, int hz) { if (width != 0) { // I2C Rate - REG(MR1.UINT8[0]) |= pclk_bit; // P_phi / xx - width |= 0x000000E0; - REG(BRL.UINT32) = width; - REG(BRH.UINT32) = width; + obj->pclk_bit = pclk_bit; // P_phi / xx + obj->width = (width | 0x000000E0); } else { // Default - REG(MR1.UINT8[0]) |= 0x00; // P_phi / 1 - REG(BRL.UINT32) = 0x000000FF; - REG(BRH.UINT32) = 0x000000FF; + obj->pclk_bit = 0x00; // P_phi / 1 + obj->width = 0x000000FF; } } diff --git a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/objects.h b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/objects.h index db8ed0d8d3..378c38531e 100644 --- a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/objects.h +++ b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/objects.h @@ -30,6 +30,8 @@ extern "C" { struct i2c_s { uint32_t i2c; uint32_t dummy; + uint8_t pclk_bit; + uint32_t width; }; struct spi_s { From fe61d8c4f774d469f0930ac4d056d49b50bea1ca Mon Sep 17 00:00:00 2001 From: Masao Hamanaka Date: Thu, 4 Dec 2014 16:03:50 +0900 Subject: [PATCH 2/2] Fix a fear of bug that a static value will be indefiniteness. There was a function that has the potential to be called with indefiniteness argument. Modify to not call the function with indefiniteness argument. --- .../targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/gpio_irq_api.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/gpio_irq_api.c b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/gpio_irq_api.c index a07770a297..da046e3f4a 100644 --- a/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/gpio_irq_api.c +++ b/libraries/mbed/targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/gpio_irq_api.c @@ -67,17 +67,15 @@ static gpio_irq_event irq_event; static void handle_interrupt_in(void) { int i; uint16_t irqs; - int irq_num; irqs = INTCIRQRR; for(i = 0; i< 8; i++) { if (channel_ids[i] && (irqs & (1 << i))) { irq_handler(channel_ids[i], irq_event); INTCIRQRR &= ~(1 << i); - irq_num = i; + GIC_EndInterrupt((IRQn_Type)(nIRQn_h + i)); } } - GIC_EndInterrupt((IRQn_Type)(nIRQn_h + irq_num)); } int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {