Merge pull request #759 from masaohamanaka/master

Targets: RZ_A1H - Fix bugs that I2C freq become fixed 100kHz and a static value will be indefiniteness.
pull/763/head
Martin Kojtal 2014-12-04 07:28:24 +00:00
commit e815194b57
3 changed files with 18 additions and 17 deletions

View File

@ -67,17 +67,15 @@ static gpio_irq_event irq_event;
static void handle_interrupt_in(void) { static void handle_interrupt_in(void) {
int i; int i;
uint16_t irqs; uint16_t irqs;
int irq_num;
irqs = INTCIRQRR; irqs = INTCIRQRR;
for(i = 0; i< 8; i++) { for(i = 0; i< 8; i++) {
if (channel_ids[i] && (irqs & (1 << i))) { if (channel_ids[i] && (irqs & (1 << i))) {
irq_handler(channel_ids[i], irq_event); irq_handler(channel_ids[i], irq_event);
INTCIRQRR &= ~(1 << i); 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) { int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) {

View File

@ -72,8 +72,10 @@ static void i2c_reg_reset(i2c_t *obj) {
REG(MR1.UINT8[0]) = 0x08; // P_phi /8 9bit (including Ack) REG(MR1.UINT8[0]) = 0x08; // P_phi /8 9bit (including Ack)
REG(SER.UINT8[0]) = 0x00; // no slave addr enabled REG(SER.UINT8[0]) = 0x00; // no slave addr enabled
// set default frequency at 100k // set frequency
i2c_frequency(obj, 100000); REG(MR1.UINT8[0]) |= obj->pclk_bit;
REG(BRL.UINT32) = obj->width;
REG(BRH.UINT32) = obj->width;
REG(MR2.UINT8[0]) = 0x07; REG(MR2.UINT8[0]) = 0x07;
REG(MR3.UINT8[0]) = 0x00; REG(MR3.UINT8[0]) = 0x00;
@ -130,6 +132,9 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl) {
// enable power // enable power
i2c_power_enable(obj); i2c_power_enable(obj);
// set default frequency at 100k
i2c_frequency(obj, 100000);
// full reset // full reset
i2c_reg_reset(obj); i2c_reg_reset(obj);
@ -209,15 +214,14 @@ void i2c_frequency(i2c_t *obj, int hz) {
uint32_t width = 0; uint32_t width = 0;
uint8_t count; uint8_t count;
uint8_t pclk_bit = 0; uint8_t pclk_bit = 0;
/* set PCLK */ /* set PCLK */
if (false == RZ_A1_IsClockMode0()) if (false == RZ_A1_IsClockMode0()) {
{
pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK; pclk_base = (uint32_t)CM1_RENESAS_RZ_A1_P0_CLK;
} else { } else {
pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK; pclk_base = (uint32_t)CM0_RENESAS_RZ_A1_P0_CLK;
} }
/* Min 10kHz, Max 400kHz */ /* Min 10kHz, Max 400kHz */
if (hz < 10000) { if (hz < 10000) {
freq = 10000; freq = 10000;
@ -226,7 +230,7 @@ void i2c_frequency(i2c_t *obj, int hz) {
} else { } else {
freq = hz; freq = hz;
} }
for (count = 0; count < 7; count++) { for (count = 0; count < 7; count++) {
// IIC phi = P0 phi / rate // IIC phi = P0 phi / rate
pclk = pclk_base / (2 << count); pclk = pclk_base / (2 << count);
@ -250,15 +254,12 @@ void i2c_frequency(i2c_t *obj, int hz) {
if (width != 0) { if (width != 0) {
// I2C Rate // I2C Rate
REG(MR1.UINT8[0]) |= pclk_bit; // P_phi / xx obj->pclk_bit = pclk_bit; // P_phi / xx
width |= 0x000000E0; obj->width = (width | 0x000000E0);
REG(BRL.UINT32) = width;
REG(BRH.UINT32) = width;
} else { } else {
// Default // Default
REG(MR1.UINT8[0]) |= 0x00; // P_phi / 1 obj->pclk_bit = 0x00; // P_phi / 1
REG(BRL.UINT32) = 0x000000FF; obj->width = 0x000000FF;
REG(BRH.UINT32) = 0x000000FF;
} }
} }

View File

@ -30,6 +30,8 @@ extern "C" {
struct i2c_s { struct i2c_s {
uint32_t i2c; uint32_t i2c;
uint32_t dummy; uint32_t dummy;
uint8_t pclk_bit;
uint32_t width;
}; };
struct spi_s { struct spi_s {