mirror of https://github.com/ARMmbed/mbed-os.git
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
commit
e815194b57
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue