From f74c6ffdd575d02fd782e8956981b54195ecd7dc Mon Sep 17 00:00:00 2001 From: stac Date: Sun, 8 Aug 2010 04:15:08 +0000 Subject: [PATCH] i2c: rewrite i2c layer The STM32 I2C block has a number of errata associated with it. These errata are primarily related to timing sensitivities between the peripheral and the interrupt handler. In particular, the correct generation of the stop bit relies on the I2C IRQ running immediately and not being held off for any reason. NOTE: The I2C interrupts must be the highest priority IRQs in the system to ensure correct operation. I2C protocol is now implemented as a formal state machine. See: stm32_i2c_fsm.{dot,jpg} for FSM description. I2C init is now expressed by const initializers in pios_board.c for both OP and AHRS boards. I2C device drivers (ie. bmp085/hmc5843) now pass in const arrays of an unlimited number of bus transfers to be done atomically. The I2C adapter driver now handles all bus-level locking across the list of transactions. Generation of start/restart/stop conditions are handled automatically over the list of transactions. Timeouts have been removed from the API for now. May be added back later. This driver has run error free on both the OP and AHRS boards for up to 48hrs but it still sometimes fails earlier than that on the OP board. There is another possible set of improvements to the driver that could employ the DMA engine for transfers of >= 2bytes. This change would reduce the timing sensitivities between the peripheral and the driver but unfortunately, both the SPI and I2C interfaces share the DMA1 engine. That means only one of these two peripherals can use the DMA engine and right now, SPI between OP and AHRS is already using it. Failures are currently fatal and will lock up the CPU. This allows useful information to be obtained in the failure cases. git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@1241 ebee16cc-31ac-478f-84a7-5cbb03baadba --- flight/AHRS/inc/pios_board.h | 16 +- flight/AHRS/pios_board.c | 87 ++ flight/Doc/Architecture/stm32_i2c_fsm.dot | 175 +++ flight/Doc/Architecture/stm32_i2c_fsm.jpg | Bin 0 -> 215747 bytes flight/OpenPilot/System/inc/pios_board.h | 16 +- flight/OpenPilot/System/pios_board.c | 84 +- flight/PiOS/Common/pios_bmp085.c | 76 +- flight/PiOS/Common/pios_hmc5843.c | 60 +- flight/PiOS/STM32F10x/pios_i2c.c | 1280 +++++++++++---------- flight/PiOS/inc/pios_bmp085.h | 6 +- flight/PiOS/inc/pios_hmc5843.h | 6 +- flight/PiOS/inc/pios_i2c.h | 42 +- flight/PiOS/inc/pios_i2c_priv.h | 96 ++ 13 files changed, 1235 insertions(+), 709 deletions(-) create mode 100644 flight/Doc/Architecture/stm32_i2c_fsm.dot create mode 100644 flight/Doc/Architecture/stm32_i2c_fsm.jpg create mode 100644 flight/PiOS/inc/pios_i2c_priv.h diff --git a/flight/AHRS/inc/pios_board.h b/flight/AHRS/inc/pios_board.h index 3097cba76..1cda2580b 100644 --- a/flight/AHRS/inc/pios_board.h +++ b/flight/AHRS/inc/pios_board.h @@ -99,21 +99,9 @@ TIM8 | | | | //------------------------ // PIOS_I2C +// See also pios_board.c //------------------------ -#define PIOS_I2C_PORT I2C1 -#define PIOS_I2C_CLK RCC_APB1Periph_I2C1 -#define PIOS_I2C_GPIO_PORT GPIOB -#define PIOS_I2C_SCL_PIN GPIO_Pin_6 -#define PIOS_I2C_SDA_PIN GPIO_Pin_7 -#define PIOS_I2C_DUTY_CYCLE I2C_DutyCycle_2 -#define PIOS_I2C_BUS_FREQ 400000 // bit/s -#define PIOS_I2C_TIMEOUT_VALUE 50 // ms -#define PIOS_I2C_IRQ_EV_HANDLER void I2C1_EV_IRQHandler(void) -#define PIOS_I2C_IRQ_ER_HANDLER void I2C1_ER_IRQHandler(void) -#define PIOS_I2C_IRQ_EV_CHANNEL I2C1_EV_IRQn -#define PIOS_I2C_IRQ_ER_CHANNEL I2C1_EV_IRQn -#define PIOS_I2C_IRQ_EV_PRIORITY 2 -#define PIOS_I2C_IRQ_ER_PRIORITY 2 +#define PIOS_I2C_MAIN_ADAPTER 0 //------------------------- // SPI diff --git a/flight/AHRS/pios_board.c b/flight/AHRS/pios_board.c index fed25bff5..abd774326 100644 --- a/flight/AHRS/pios_board.c +++ b/flight/AHRS/pios_board.c @@ -233,3 +233,90 @@ const uint8_t pios_com_num_devices = NELEMENTS(pios_com_devs); #endif /* PIOS_INCLUDE_COM */ +#if defined(PIOS_INCLUDE_I2C) +#include + +/* + * I2C Adapters + */ + +void PIOS_I2C_main_adapter_ev_irq_handler(void); +void PIOS_I2C_main_adapter_er_irq_handler(void); +void I2C1_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_ev_irq_handler"))); +void I2C1_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_er_irq_handler"))); + +const struct pios_i2c_adapter_cfg pios_i2c_main_adapter_cfg = { + .regs = I2C1, + .init = { + .I2C_Mode = I2C_Mode_I2C, + .I2C_OwnAddress1 = 0, + .I2C_Ack = I2C_Ack_Enable, + .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit, + .I2C_DutyCycle = I2C_DutyCycle_2, + .I2C_ClockSpeed = 200000, /* bits/s */ + }, + .transfer_timeout_ms = 50, + .scl = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_6, + .GPIO_Speed = GPIO_Speed_10MHz, + .GPIO_Mode = GPIO_Mode_AF_OD, + }, + }, + .sda = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_7, + .GPIO_Speed = GPIO_Speed_10MHz, + .GPIO_Mode = GPIO_Mode_AF_OD, + }, + }, + .event = { + .handler = PIOS_I2C_main_adapter_ev_irq_handler, + .flags = 0, /* FIXME: check this */ + .init = { + .NVIC_IRQChannel = I2C1_EV_IRQn, + //.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelPreemptionPriority = 2, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, + .error = { + .handler = PIOS_I2C_main_adapter_er_irq_handler, + .flags = 0, /* FIXME: check this */ + .init = { + .NVIC_IRQChannel = I2C1_ER_IRQn, + //.NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelPreemptionPriority = 2, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, +}; + +/* + * Board specific number of devices. + */ +struct pios_i2c_adapter pios_i2c_adapters[] = { + { + .cfg = &pios_i2c_main_adapter_cfg, + }, +}; + +uint8_t pios_i2c_num_adapters = NELEMENTS(pios_i2c_adapters); + +void PIOS_I2C_main_adapter_ev_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_I2C_EV_IRQ_Handler(PIOS_I2C_MAIN_ADAPTER); +} + +void PIOS_I2C_main_adapter_er_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_I2C_ER_IRQ_Handler(PIOS_I2C_MAIN_ADAPTER); +} + +#endif /* PIOS_INCLUDE_I2C */ diff --git a/flight/Doc/Architecture/stm32_i2c_fsm.dot b/flight/Doc/Architecture/stm32_i2c_fsm.dot new file mode 100644 index 000000000..267d75df4 --- /dev/null +++ b/flight/Doc/Architecture/stm32_i2c_fsm.dot @@ -0,0 +1,175 @@ +// Regenerate using graphviz/dotty with this command +// dot -Tjpg ./flight/Doc/Architecture/stm32_i2c_fsm.dot > ./flight/Doc/Architecture/stm32_i2c_fsm.jpg + +digraph stm32_i2c_fsm { + label="STM32 I2C FSM" + labelloc=t + labeljust = l + + { + node [ style=filled,color=lightgray ] + + stopped [ shape="doublecircle" ] + } + + node [ style=filled,color=blue ] + + { + rank=same + stopped + stopping + starting + } + + // start addr/w[A] data[A] stop + // SB ADDR BTF + // ADDR DR + // STOP + // + // start addr/w[A] data[A] data[A] stop + // SB ADDR BTF BTF + // ADDR DR DR + // STOP + // + // start addr/w[A] data[A] data[A] data[A] stop + // SB ADDR BTF BTF BTF + // ADDR DR DR DR + // STOP + // + subgraph cluster_w_last_txn { + label="Final Write Txn" + w_last_txn_addr + w_last_txn_middle + w_last_txn_last + } + + // start addr/w[A] data[A] start + // SB ADDR BTF + // ADDR DR + // START + // + // start addr/w[A] data[A] data[A] start + // SB ADDR BTF BTF + // ADDR DR DR + // START + // + // start addr/w[A] data[A] data[A] data[A] stop + // SB ADDR BTF BTF BTF + // ADDR DR DR DR + // START + // + subgraph cluster_w_more_txn { + label="Write Txn with Restart" + w_more_txn_addr + w_more_txn_middle + w_more_txn_last + } + + // start addr/r[A] [data] N stop + // SB ADDR RXNE + // ADDR STOP DR + // NAK + // + // start addr/r[A] [data] A [data] N stop + // SB ADDR RXNE RXNE + // ADDR DR DR + // ACK NAK + // STOP + // + // start addr/r[A] [data] A [data] A [data] N stop + // SB ADDR RXNE RXNE RXNE + // ADDR DR DR DR + // ACK ACK NAK + // STOP + // + subgraph cluster_r_last_txn { + label="Final Read Txn" + r_last_txn_addr + r_last_txn_pre_one + r_last_txn_pre_first + r_last_txn_pre_middle + r_last_txn_pre_last + r_last_txn_post_last + } + + // start addr/r[A] [data] N start + // SB ADDR RXNE + // ADDR START DR + // NAK + // + // start addr/r[A] [data] A [data] N start + // SB ADDR RXNE RXNE + // ADDR DR DR + // ACK NAK + // START + // + // start addr/r[A] [data] A [data] A [data] N start + // SB ADDR RXNE RXNE RXNE + // ADDR DR DR DR + // ACK ACK NAK + // START + subgraph cluster_r_more_txn { + label="Read Txn with Restart" + r_more_txn_addr + r_more_txn_pre_one + r_more_txn_pre_first + r_more_txn_pre_middle + r_more_txn_pre_last + r_more_txn_post_last + } + + stopping -> stopped [ label="auto" ] + stopped -> starting [ label="start" ] + + starting -> w_last_txn_addr [ label="SB\nop=write\nlast txn" ] + starting -> w_more_txn_addr [ label="SB\nop=write\nmore txn" ] + + starting -> r_last_txn_addr [ label="SB\nop=read\nlast txn" ] + starting -> r_more_txn_addr [ label="SB\nop=read\nmore txn" ] + + w_last_txn_addr -> w_last_txn_last [ label="ADDR\nlen==1" ] + w_more_txn_addr -> w_more_txn_last [ label="ADDR\nlen==1" ] + + w_last_txn_addr -> w_last_txn_middle [ label="ADDR\nlen>1" ] + w_more_txn_addr -> w_more_txn_middle [ label="ADDR\nlen>1" ] + + w_last_txn_middle -> w_last_txn_middle [ label="BTF\nlen>1" ] + w_more_txn_middle -> w_more_txn_middle [ label="BTF\nlen>1" ] + + w_last_txn_middle -> w_last_txn_last [ label="BTF\nlen==1" ] + w_more_txn_middle -> w_more_txn_last [ label="BTF\nlen==1" ] + + w_last_txn_last -> stopped [ label="BTF\nlen==0" ] + w_more_txn_last -> starting [ label="BTF\nlen==0" ] + + + r_last_txn_addr -> r_last_txn_pre_one [ label="ADDR\nlen==1" ] + r_more_txn_addr -> r_more_txn_pre_one [ label="ADDR\nlen==1" ] + + r_last_txn_addr -> r_last_txn_pre_last [ label="ADDR\nlen==2" ] + r_more_txn_addr -> r_more_txn_pre_last [ label="ADDR\nlen==2" ] + + r_last_txn_addr -> r_last_txn_pre_first [ label="ADDR\nlen>2" ] + r_more_txn_addr -> r_more_txn_pre_first [ label="ADDR\nlen>2" ] + + r_last_txn_pre_one -> r_last_txn_post_last [ label="BTF\nlen==1" ] + r_more_txn_pre_one -> r_more_txn_post_last [ label="BTF\nlen==1" ] + + r_last_txn_pre_first -> r_last_txn_pre_last [ label="BTF\nlen==2" ] + r_more_txn_pre_first -> r_more_txn_pre_last [ label="BTF\nlen==2" ] + + r_last_txn_pre_first -> r_last_txn_pre_middle [ label="BTF\nlen>2" ] + r_more_txn_pre_first -> r_more_txn_pre_middle [ label="BTF\nlen>2" ] + + r_last_txn_pre_middle -> r_last_txn_pre_middle [ label="BTF\nlen>2" ] + r_more_txn_pre_middle -> r_more_txn_pre_middle [ label="BTF\nlen>2" ] + + r_last_txn_pre_middle -> r_last_txn_pre_last [ label="BTF\nlen==2" ] + r_more_txn_pre_middle -> r_more_txn_pre_last [ label="BTF\nlen==2" ] + + r_last_txn_pre_last -> r_last_txn_post_last [ label="BTF\nlen==1" ] + r_more_txn_pre_last -> r_more_txn_post_last [ label="BTF\nlen==1" ] + + r_last_txn_post_last -> stopping [ label="auto" ] + r_more_txn_post_last -> starting [ label="auto" ] +} diff --git a/flight/Doc/Architecture/stm32_i2c_fsm.jpg b/flight/Doc/Architecture/stm32_i2c_fsm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd208976c3696fc1caf96e4a59ee3f43173ec452 GIT binary patch literal 215747 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%0AgaXU+QWZnm-K8-XzHLZmg!R2(fvGWZ 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 b%YM=X`4tR)1%qGDz^`ZEZ#)B#-$(un%WA%- literal 0 HcmV?d00001 diff --git a/flight/OpenPilot/System/inc/pios_board.h b/flight/OpenPilot/System/inc/pios_board.h index e5fb4a5aa..1a3f7cb94 100644 --- a/flight/OpenPilot/System/inc/pios_board.h +++ b/flight/OpenPilot/System/inc/pios_board.h @@ -81,21 +81,9 @@ TIM8 | Servo 5 | Servo 6 | Servo 7 | Servo 8 //------------------------ // PIOS_I2C +// See also pios_board.c //------------------------ -#define PIOS_I2C_PORT I2C2 -#define PIOS_I2C_CLK RCC_APB1Periph_I2C2 -#define PIOS_I2C_GPIO_PORT GPIOB -#define PIOS_I2C_SDA_PIN GPIO_Pin_11 -#define PIOS_I2C_SCL_PIN GPIO_Pin_10 -#define PIOS_I2C_DUTY_CYCLE I2C_DutyCycle_2 -#define PIOS_I2C_BUS_FREQ 400000 // bit/s -#define PIOS_I2C_TIMEOUT_VALUE 50 // ms -#define PIOS_I2C_IRQ_EV_HANDLER void I2C2_EV_IRQHandler(void) -#define PIOS_I2C_IRQ_ER_HANDLER void I2C2_ER_IRQHandler(void) -#define PIOS_I2C_IRQ_EV_CHANNEL I2C2_EV_IRQn -#define PIOS_I2C_IRQ_ER_CHANNEL I2C2_ER_IRQn -#define PIOS_I2C_IRQ_EV_PRIORITY PIOS_IRQ_PRIO_HIGH -#define PIOS_I2C_IRQ_ER_PRIORITY PIOS_IRQ_PRIO_HIGH +#define PIOS_I2C_MAIN_ADAPTER 0 //------------------------ // PIOS_BMP085 diff --git a/flight/OpenPilot/System/pios_board.c b/flight/OpenPilot/System/pios_board.c index 679e6486f..623958ed5 100644 --- a/flight/OpenPilot/System/pios_board.c +++ b/flight/OpenPilot/System/pios_board.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -327,7 +328,7 @@ const struct pios_usart_cfg pios_usart_telem_cfg = { .handler = PIOS_USART_telem_irq_handler, .init = { .NVIC_IRQChannel = USART2_IRQn, - .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH, .NVIC_IRQChannelSubPriority = 0, .NVIC_IRQChannelCmd = ENABLE, }, @@ -575,6 +576,87 @@ struct pios_com_dev pios_com_devs[] = { const uint8_t pios_com_num_devices = NELEMENTS(pios_com_devs); +/* + * I2C Adapters + */ + +void PIOS_I2C_main_adapter_ev_irq_handler(void); +void PIOS_I2C_main_adapter_er_irq_handler(void); +void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_ev_irq_handler"))); +void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_main_adapter_er_irq_handler"))); + +const struct pios_i2c_adapter_cfg pios_i2c_main_adapter_cfg = { + .regs = I2C2, + .init = { + .I2C_Mode = I2C_Mode_I2C, + .I2C_OwnAddress1 = 0, + .I2C_Ack = I2C_Ack_Enable, + .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit, + .I2C_DutyCycle = I2C_DutyCycle_2, + .I2C_ClockSpeed = 400000, /* bits/s */ + }, + .transfer_timeout_ms = 50, + .scl = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_10, + .GPIO_Speed = GPIO_Speed_10MHz, + .GPIO_Mode = GPIO_Mode_AF_OD, + }, + }, + .sda = { + .gpio = GPIOB, + .init = { + .GPIO_Pin = GPIO_Pin_11, + .GPIO_Speed = GPIO_Speed_10MHz, + .GPIO_Mode = GPIO_Mode_AF_OD, + }, + }, + .event = { + .handler = PIOS_I2C_main_adapter_ev_irq_handler, + .flags = 0, /* FIXME: check this */ + .init = { + .NVIC_IRQChannel = I2C2_EV_IRQn, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, + .error = { + .handler = PIOS_I2C_main_adapter_er_irq_handler, + .flags = 0, /* FIXME: check this */ + .init = { + .NVIC_IRQChannel = I2C2_ER_IRQn, + .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST, + .NVIC_IRQChannelSubPriority = 0, + .NVIC_IRQChannelCmd = ENABLE, + }, + }, +}; + +/* + * Board specific number of devices. + */ +struct pios_i2c_adapter pios_i2c_adapters[] = { + { + .cfg = &pios_i2c_main_adapter_cfg, + }, +}; + +uint8_t pios_i2c_num_adapters = NELEMENTS(pios_i2c_adapters); + +void PIOS_I2C_main_adapter_ev_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_I2C_EV_IRQ_Handler(PIOS_I2C_MAIN_ADAPTER); +} + +void PIOS_I2C_main_adapter_er_irq_handler(void) +{ + /* Call into the generic code to handle the IRQ for this specific device */ + PIOS_I2C_ER_IRQ_Handler(PIOS_I2C_MAIN_ADAPTER); +} + /** * @} */ diff --git a/flight/PiOS/Common/pios_bmp085.c b/flight/PiOS/Common/pios_bmp085.c index 850e4d919..aecf8ab37 100644 --- a/flight/PiOS/Common/pios_bmp085.c +++ b/flight/PiOS/Common/pios_bmp085.c @@ -145,7 +145,7 @@ void PIOS_BMP085_ReadADC(void) /* Read and store the 16bit result */ if(CurrentRead == TemperatureConv) { /* Read the temperature conversion */ - PIOS_BMP085_Read(BMP085_ADC_MSB, Data, 2); + PIOS_BMP085_Read(BMP085_ADC_MSB, Data, 3); /* Read 3 since it is more reliable on i2c than the proper read of 2 bytes. */ RawTemperature = ((Data[0] << 8) | Data[1]); X1 = (RawTemperature - CalibData.AC6) * CalibData.AC5 >> 15; @@ -196,30 +196,28 @@ int32_t PIOS_BMP085_GetPressure(void) * \return -2 if BMP085 blocked by another task (retry it!) * \return -4 if invalid length */ -int32_t PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len) +bool PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len) { - /* Try to get the I2C peripheral */ - if(PIOS_I2C_LockDevice(0) == FALSE) - { - /* Request a retry */ - return -2; - } + uint8_t addr_buffer[] = { + address, + }; - /* Send I2C address and EEPROM address */ - /* To avoid issues copy address into temporary buffer */ - uint8_t addr_buffer[1] = {(uint8_t)address}; - int32_t error = PIOS_I2C_Transfer(I2C_Write_WithoutStop, BMP085_I2C_ADDR, addr_buffer, 1); + const struct pios_i2c_txn txn_list[] = { + { + .addr = BMP085_I2C_ADDR, + .rw = PIOS_I2C_TXN_WRITE, + .len = sizeof(addr_buffer), + .buf = addr_buffer, + }, + { + .addr = BMP085_I2C_ADDR, + .rw = PIOS_I2C_TXN_READ, + .len = len, + .buf = buffer, + } + }; - /* Now receive byte(s) */ - if(!error) { - error = PIOS_I2C_Transfer(I2C_Read, BMP085_I2C_ADDR, buffer, len); - } - - /* Release I2C peripheral */ - PIOS_I2C_UnlockDevice(); - - /* Return error status */ - return error < 0 ? -1 : 0; + return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); } @@ -231,27 +229,23 @@ int32_t PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len) * \return -1 if error during I2C transfer * \return -2 if BMP085 blocked by another task (retry it!) */ -int32_t PIOS_BMP085_Write(uint8_t address, uint8_t buffer) +bool PIOS_BMP085_Write(uint8_t address, uint8_t buffer) { - /* Try to get the IIC peripheral */ - if(PIOS_I2C_LockDevice(0) == FALSE) - { - /* Request a retry */ - return -2; - } + uint8_t data[] = { + address, + buffer, + }; - /* Send I2C address and data */ - uint8_t WriteBuffer[2]; - WriteBuffer[0] = address; - WriteBuffer[1] = buffer; - - int32_t error = PIOS_I2C_Transfer(I2C_Write, BMP085_I2C_ADDR, WriteBuffer, 2); - - /* Release I2C peripheral */ - PIOS_I2C_UnlockDevice(); - - /* Return error status */ - return error < 0 ? -1 : 0; + const struct pios_i2c_txn txn_list[] = { + { + .addr = BMP085_I2C_ADDR, + .rw = PIOS_I2C_TXN_WRITE, + .len = sizeof(data), + .buf = data, + }, + }; + + return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); } diff --git a/flight/PiOS/Common/pios_hmc5843.c b/flight/PiOS/Common/pios_hmc5843.c index 522e8b916..18bfc7f98 100644 --- a/flight/PiOS/Common/pios_hmc5843.c +++ b/flight/PiOS/Common/pios_hmc5843.c @@ -206,20 +206,28 @@ void PIOS_HMC5843_ReadID(uint8_t out[4]) * \return -1 if error during I2C transfer * \return -4 if invalid length */ -int32_t PIOS_HMC5843_Read(uint8_t address, uint8_t *buffer, uint8_t len) +bool PIOS_HMC5843_Read(uint8_t address, uint8_t *buffer, uint8_t len) { - /* Send I2C address and register address */ - /* To avoid issues copy address into temporary buffer */ - uint8_t addr_buffer[1] = {(uint8_t)address}; - int32_t error = PIOS_I2C_Transfer(I2C_Write_WithoutStop, PIOS_HMC5843_I2C_ADDR, addr_buffer, 1); - - /* Now receive byte(s) */ - if(!error) { - error = PIOS_I2C_Transfer(I2C_Read, PIOS_HMC5843_I2C_ADDR, buffer, len); - } - - /* Return error status */ - return error < 0 ? -1 : 0; + uint8_t addr_buffer[] = { + address, + }; + + const struct pios_i2c_txn txn_list[] = { + { + .addr = PIOS_HMC5843_I2C_ADDR, + .rw = PIOS_I2C_TXN_WRITE, + .len = sizeof(addr_buffer), + .buf = addr_buffer, + }, + { + .addr = PIOS_HMC5843_I2C_ADDR, + .rw = PIOS_I2C_TXN_READ, + .len = len, + .buf = buffer, + } + }; + + return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); } @@ -230,17 +238,23 @@ int32_t PIOS_HMC5843_Read(uint8_t address, uint8_t *buffer, uint8_t len) * \return 0 if operation was successful * \return -1 if error during I2C transfer */ -int32_t PIOS_HMC5843_Write(uint8_t address, uint8_t buffer) +bool PIOS_HMC5843_Write(uint8_t address, uint8_t buffer) { - /* Send I2C address and data */ - uint8_t WriteBuffer[2]; - WriteBuffer[0] = address; - WriteBuffer[1] = buffer; - - int32_t error = PIOS_I2C_Transfer(I2C_Write, PIOS_HMC5843_I2C_ADDR, WriteBuffer, 2); - - /* Return error status */ - return error < 0 ? -1 : 0; + uint8_t data[] = { + address, + buffer, + }; + + const struct pios_i2c_txn txn_list[] = { + { + .addr = PIOS_HMC5843_I2C_ADDR, + .rw = PIOS_I2C_TXN_WRITE, + .len = sizeof(data), + .buf = data, + }, + }; + + return PIOS_I2C_Transfer(PIOS_I2C_MAIN_ADAPTER, txn_list, NELEMENTS(txn_list)); } #endif diff --git a/flight/PiOS/STM32F10x/pios_i2c.c b/flight/PiOS/STM32F10x/pios_i2c.c index 62842d69d..fd98fc465 100644 --- a/flight/PiOS/STM32F10x/pios_i2c.c +++ b/flight/PiOS/STM32F10x/pios_i2c.c @@ -37,81 +37,521 @@ #if defined(PIOS_INCLUDE_I2C) - - -/* Options */ -//#define USE_DEBUG_PINS - -#ifdef PIOS_INCLUDE_FREERTOS - #define USE_FREERTOS +#if defined(PIOS_INCLUDE_FREERTOS) +#define USE_FREERTOS #endif +#include -/* Global Variables */ -volatile uint32_t PIOS_I2C_UnexpectedEvent; +enum i2c_adapter_event { + I2C_EVENT_START, + I2C_EVENT_STARTED_MORE_TXN_READ, + I2C_EVENT_STARTED_MORE_TXN_WRITE, + I2C_EVENT_STARTED_LAST_TXN_READ, + I2C_EVENT_STARTED_LAST_TXN_WRITE, + I2C_EVENT_ADDR_SENT_LEN_EQ_0, + I2C_EVENT_ADDR_SENT_LEN_EQ_1, + I2C_EVENT_ADDR_SENT_LEN_EQ_2, + I2C_EVENT_ADDR_SENT_LEN_GT_2, + I2C_EVENT_TRANSFER_DONE_LEN_EQ_0, + I2C_EVENT_TRANSFER_DONE_LEN_EQ_1, + I2C_EVENT_TRANSFER_DONE_LEN_EQ_2, + I2C_EVENT_TRANSFER_DONE_LEN_GT_2, + I2C_EVENT_AUTO, /* FIXME: remove this */ -/* Local types */ -typedef union { - struct { - unsigned ALL:8; - }; - struct { - unsigned BUSY:1; - unsigned STOP_REQUESTED:1; - unsigned ABORT_IF_FIRST_BYTE_0:1; - unsigned WRITE_WITHOUT_STOP:1; - unsigned INIRQ:1; - }; -} TransferStateTypeDef; + I2C_EVENT_NUM_EVENTS /* Must be last */ +}; + +static void go_faulted (struct pios_i2c_adapter * i2c_adapter); +static void go_stopping (struct pios_i2c_adapter * i2c_adapter); +static void go_stopped (struct pios_i2c_adapter * i2c_adapter); +static void go_starting (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_addr (struct pios_i2c_adapter * i2c_adapter); +static void go_r_more_txn_pre_one (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_pre_first (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_pre_middle (struct pios_i2c_adapter * i2c_adapter); +static void go_r_more_txn_pre_last (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_post_last (struct pios_i2c_adapter * i2c_adapter); + +static void go_r_any_txn_addr (struct pios_i2c_adapter * i2c_adapter); +static void go_r_last_txn_pre_one (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_pre_first (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_pre_middle (struct pios_i2c_adapter * i2c_adapter); +static void go_r_last_txn_pre_last (struct pios_i2c_adapter * i2c_adapter); +static void go_r_any_txn_post_last (struct pios_i2c_adapter * i2c_adapter); + +static void go_w_any_txn_addr (struct pios_i2c_adapter * i2c_adapter); +static void go_w_any_txn_middle (struct pios_i2c_adapter * i2c_adapter); +static void go_w_more_txn_last (struct pios_i2c_adapter * i2c_adapter); + +static void go_w_any_txn_addr (struct pios_i2c_adapter * i2c_adapter); +static void go_w_any_txn_middle (struct pios_i2c_adapter * i2c_adapter); +static void go_w_last_txn_last (struct pios_i2c_adapter * i2c_adapter); + +struct i2c_adapter_transition { + void (*entry_fn)(struct pios_i2c_adapter * i2c_adapter); + enum i2c_adapter_state next_state[I2C_EVENT_NUM_EVENTS]; +}; + +static void i2c_adapter_inject_event(struct pios_i2c_adapter * i2c_adapter, enum i2c_adapter_event event); +static void i2c_adapter_fsm_init(struct pios_i2c_adapter * i2c_adapter); + +const static struct i2c_adapter_transition i2c_adapter_transitions[I2C_STATE_NUM_STATES] = { + [I2C_STATE_FAULTED] = { + .entry_fn = go_faulted, + }, + + [I2C_STATE_STOPPED] = { + .entry_fn = go_stopped, + .next_state = { + [I2C_EVENT_START] = I2C_STATE_STARTING, + }, + }, + + [I2C_STATE_STOPPING] = { + .entry_fn = go_stopping, + .next_state = { + [I2C_EVENT_AUTO] = I2C_STATE_STOPPED, + }, + }, + + [I2C_STATE_STARTING] = { + .entry_fn = go_starting, + .next_state = { + [I2C_EVENT_STARTED_MORE_TXN_READ] = I2C_STATE_R_MORE_TXN_ADDR, + [I2C_EVENT_STARTED_MORE_TXN_WRITE] = I2C_STATE_W_MORE_TXN_ADDR, + [I2C_EVENT_STARTED_LAST_TXN_READ] = I2C_STATE_R_LAST_TXN_ADDR, + [I2C_EVENT_STARTED_LAST_TXN_WRITE] = I2C_STATE_W_LAST_TXN_ADDR, + }, + }, + + /* + * Read with restart + */ + + [I2C_STATE_R_MORE_TXN_ADDR] = { + .entry_fn = go_r_any_txn_addr, + .next_state = { + [I2C_EVENT_ADDR_SENT_LEN_EQ_1] = I2C_STATE_R_MORE_TXN_PRE_ONE, + [I2C_EVENT_ADDR_SENT_LEN_EQ_2] = I2C_STATE_R_MORE_TXN_PRE_LAST, + [I2C_EVENT_ADDR_SENT_LEN_GT_2] = I2C_STATE_R_MORE_TXN_PRE_FIRST, + }, + }, + + [I2C_STATE_R_MORE_TXN_PRE_ONE] = { + .entry_fn = go_r_more_txn_pre_one, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_1] = I2C_STATE_R_MORE_TXN_POST_LAST, + }, + }, + + [I2C_STATE_R_MORE_TXN_PRE_FIRST] = { + .entry_fn = go_r_any_txn_pre_first, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_2] = I2C_STATE_R_MORE_TXN_PRE_LAST, + [I2C_EVENT_TRANSFER_DONE_LEN_GT_2] = I2C_STATE_R_MORE_TXN_PRE_MIDDLE, + }, + }, + + [I2C_STATE_R_MORE_TXN_PRE_MIDDLE] = { + .entry_fn = go_r_any_txn_pre_middle, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_2] = I2C_STATE_R_MORE_TXN_PRE_LAST, + [I2C_EVENT_TRANSFER_DONE_LEN_GT_2] = I2C_STATE_R_MORE_TXN_PRE_MIDDLE, + }, + }, + + [I2C_STATE_R_MORE_TXN_PRE_LAST] = { + .entry_fn = go_r_more_txn_pre_last, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_1] = I2C_STATE_R_MORE_TXN_POST_LAST, + }, + }, + + [I2C_STATE_R_MORE_TXN_POST_LAST] = { + .entry_fn = go_r_any_txn_post_last, + .next_state = { + [I2C_EVENT_AUTO] = I2C_STATE_STARTING, + }, + }, + + /* + * Read + */ + + [I2C_STATE_R_LAST_TXN_ADDR] = { + .entry_fn = go_r_any_txn_addr, + .next_state = { + [I2C_EVENT_ADDR_SENT_LEN_EQ_1] = I2C_STATE_R_LAST_TXN_PRE_ONE, + [I2C_EVENT_ADDR_SENT_LEN_EQ_2] = I2C_STATE_R_LAST_TXN_PRE_FIRST, + [I2C_EVENT_ADDR_SENT_LEN_GT_2] = I2C_STATE_R_LAST_TXN_PRE_FIRST, + }, + }, + + [I2C_STATE_R_LAST_TXN_PRE_ONE] = { + .entry_fn = go_r_last_txn_pre_one, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_1] = I2C_STATE_R_LAST_TXN_POST_LAST, + }, + }, + + [I2C_STATE_R_LAST_TXN_PRE_FIRST] = { + .entry_fn = go_r_any_txn_pre_first, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_2] = I2C_STATE_R_LAST_TXN_PRE_LAST, + [I2C_EVENT_TRANSFER_DONE_LEN_GT_2] = I2C_STATE_R_LAST_TXN_PRE_MIDDLE, + }, + }, + + [I2C_STATE_R_LAST_TXN_PRE_MIDDLE] = { + .entry_fn = go_r_any_txn_pre_middle, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_2] = I2C_STATE_R_LAST_TXN_PRE_LAST, + [I2C_EVENT_TRANSFER_DONE_LEN_GT_2] = I2C_STATE_R_LAST_TXN_PRE_MIDDLE, + }, + }, + + [I2C_STATE_R_LAST_TXN_PRE_LAST] = { + .entry_fn = go_r_last_txn_pre_last, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_1] = I2C_STATE_R_LAST_TXN_POST_LAST, + }, + }, + + [I2C_STATE_R_LAST_TXN_POST_LAST] = { + .entry_fn = go_r_any_txn_post_last, + .next_state = { + [I2C_EVENT_AUTO] = I2C_STATE_STOPPING, + }, + }, -typedef struct { - I2C_TypeDef *base; + /* + * Write with restart + */ - uint8_t i2c_address; - uint8_t *tx_buffer_ptr; - uint8_t *rx_buffer_ptr; - volatile uint16_t buffer_len; - volatile uint16_t buffer_ix; + [I2C_STATE_W_MORE_TXN_ADDR] = { + .entry_fn = go_w_any_txn_addr, + .next_state = { + [I2C_EVENT_ADDR_SENT_LEN_EQ_1] = I2C_STATE_W_MORE_TXN_LAST, + [I2C_EVENT_ADDR_SENT_LEN_EQ_2] = I2C_STATE_W_MORE_TXN_MIDDLE, + [I2C_EVENT_ADDR_SENT_LEN_GT_2] = I2C_STATE_W_MORE_TXN_MIDDLE, + }, + }, - volatile TransferStateTypeDef transfer_state; - volatile int32_t transfer_error; + [I2C_STATE_W_MORE_TXN_MIDDLE] = { + .entry_fn = go_w_any_txn_middle, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_1] = I2C_STATE_W_MORE_TXN_LAST, + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_2] = I2C_STATE_W_MORE_TXN_MIDDLE, + [I2C_EVENT_TRANSFER_DONE_LEN_GT_2] = I2C_STATE_W_MORE_TXN_MIDDLE, + }, + }, -#ifdef USE_FREERTOS - xSemaphoreHandle sem_readySignal; - portBASE_TYPE xHigherPriorityTaskWoken; - xSemaphoreHandle xBusyMutex; + [I2C_STATE_W_MORE_TXN_LAST] = { + .entry_fn = go_w_more_txn_last, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_0] = I2C_STATE_STARTING, + }, + }, + + /* + * Write + */ + + [I2C_STATE_W_LAST_TXN_ADDR] = { + .entry_fn = go_w_any_txn_addr, + .next_state = { + [I2C_EVENT_ADDR_SENT_LEN_EQ_1] = I2C_STATE_W_LAST_TXN_LAST, + [I2C_EVENT_ADDR_SENT_LEN_EQ_2] = I2C_STATE_W_LAST_TXN_MIDDLE, + [I2C_EVENT_ADDR_SENT_LEN_GT_2] = I2C_STATE_W_LAST_TXN_MIDDLE, + }, + }, + + [I2C_STATE_W_LAST_TXN_MIDDLE] = { + .entry_fn = go_w_any_txn_middle, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_1] = I2C_STATE_W_LAST_TXN_LAST, + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_2] = I2C_STATE_W_LAST_TXN_MIDDLE, + [I2C_EVENT_TRANSFER_DONE_LEN_GT_2] = I2C_STATE_W_LAST_TXN_MIDDLE, + }, + }, + + [I2C_STATE_W_LAST_TXN_LAST] = { + .entry_fn = go_w_last_txn_last, + .next_state = { + [I2C_EVENT_TRANSFER_DONE_LEN_EQ_0] = I2C_STATE_STOPPING, + }, + }, +}; + +static void go_faulted (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(0); +} + +static void go_stopping (struct pios_i2c_adapter * i2c_adapter) +{ + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE); + + /* Spin waiting for the stop bit to be cleared before continuing */ +#define I2C_CR1_STOP_REQUESTED 0x0200 + while (i2c_adapter->cfg->regs->CR1 & I2C_CR1_STOP_REQUESTED); +} + +static void go_stopped (struct pios_i2c_adapter * i2c_adapter) +{ +#ifdef USE_FREERTOS + signed portBASE_TYPE pxHigherPriorityTaskWoken = pdFALSE; #endif + + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE); + I2C_AcknowledgeConfig(i2c_adapter->cfg->regs, ENABLE); -} I2CRecTypeDef; +#ifdef USE_FREERTOS + if (xSemaphoreGiveFromISR(i2c_adapter->sem_ready, &pxHigherPriorityTaskWoken) != pdTRUE) { + PIOS_DEBUG_Assert(0); + } + portEND_SWITCHING_ISR(pxHigherPriorityTaskWoken); /* FIXME: is this the right place for this? */ +#endif /* USE_FREERTOS */ +} -/* Local Prototypes */ -static void PIOS_I2C_InitPeripheral(void); -static void EV_IRQHandler(I2CRecTypeDef *i2cx); -static void ER_IRQHandler(I2CRecTypeDef *i2cx); +static void go_starting (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); -/* Local Variables */ -static I2CRecTypeDef I2CRec; + i2c_adapter->active_byte = &(i2c_adapter->active_txn->buf[0]); + i2c_adapter->last_byte = &(i2c_adapter->active_txn->buf[i2c_adapter->active_txn->len - 1]); -/* Local Functions */ -static void TransferStart(I2CRecTypeDef *i2cx); -static void TransferEnd(I2CRecTypeDef *i2cx); + I2C_GenerateSTART(i2c_adapter->cfg->regs, ENABLE); + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE); +} -/* Macros */ -#ifdef USE_DEBUG_PINS - #define DEBUG_PIN_ISR 0 - #define DEBUG_PIN_BUSY 1 - #define DEBUG_PIN_WAIT 2 - #define DEBUG_PIN_ASSERT 7 - #define DebugPinHigh(x) PIOS_DEBUG_PinHigh(x) - #define DebugPinLow(x) PIOS_DEBUG_PinLow(x) -#else - #define DebugPinHigh(x) - #define DebugPinLow(x) -#endif +/* Common to 'more' and 'last' transaction */ +static void go_r_any_txn_addr (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); -#define Assert(exp) PIOS_DEBUG_Assert(exp) + PIOS_DEBUG_Assert(i2c_adapter->active_txn->rw == PIOS_I2C_TXN_READ); + I2C_Send7bitAddress(i2c_adapter->cfg->regs, i2c_adapter->active_txn->addr, I2C_Direction_Receiver); +} + +static void go_r_more_txn_pre_one (struct pios_i2c_adapter * i2c_adapter) +{ + I2C_AcknowledgeConfig(i2c_adapter->cfg->regs, DISABLE); + I2C_GenerateSTART(i2c_adapter->cfg->regs, ENABLE); +} + +static void go_r_last_txn_pre_one (struct pios_i2c_adapter * i2c_adapter) +{ + I2C_AcknowledgeConfig(i2c_adapter->cfg->regs, DISABLE); + I2C_GenerateSTOP(i2c_adapter->cfg->regs, ENABLE); +} + + +/* Common to 'more' and 'last' transaction */ +static void go_r_any_txn_pre_first (struct pios_i2c_adapter * i2c_adapter) +{ + I2C_AcknowledgeConfig(i2c_adapter->cfg->regs, ENABLE); +} + +/* Common to 'more' and 'last' transaction */ +static void go_r_any_txn_pre_middle (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); + + *(i2c_adapter->active_byte) = I2C_ReceiveData(i2c_adapter->cfg->regs); + + /* Move to the next byte */ + i2c_adapter->active_byte++; + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); +} + +static void go_r_more_txn_pre_last (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); + + I2C_AcknowledgeConfig(i2c_adapter->cfg->regs, DISABLE); + PIOS_IRQ_Disable(); + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE); + I2C_GenerateSTART(i2c_adapter->cfg->regs, ENABLE); + *(i2c_adapter->active_byte) = I2C_ReceiveData(i2c_adapter->cfg->regs); + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE); + PIOS_IRQ_Enable(); + + /* Move to the next byte */ + i2c_adapter->active_byte++; + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); +} + +static void go_r_last_txn_pre_last (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); + + I2C_AcknowledgeConfig(i2c_adapter->cfg->regs, DISABLE); + PIOS_IRQ_Disable(); + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE); + I2C_GenerateSTOP(i2c_adapter->cfg->regs, ENABLE); + *(i2c_adapter->active_byte) = I2C_ReceiveData(i2c_adapter->cfg->regs); + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE); + PIOS_IRQ_Enable(); + + /* Move to the next byte */ + i2c_adapter->active_byte++; + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); +} + +/* Common to 'more' and 'last' transaction */ +static void go_r_any_txn_post_last (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte == i2c_adapter->last_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); + + *(i2c_adapter->active_byte) = I2C_ReceiveData(i2c_adapter->cfg->regs); + + /* Move to the next byte */ + i2c_adapter->active_byte++; + + /* Move to the next transaction */ + i2c_adapter->active_txn++; +} + +/* Common to 'more' and 'last' transaction */ +static void go_w_any_txn_addr (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); + + PIOS_DEBUG_Assert(i2c_adapter->active_txn->rw == PIOS_I2C_TXN_WRITE); + + I2C_Send7bitAddress(i2c_adapter->cfg->regs, i2c_adapter->active_txn->addr, I2C_Direction_Transmitter); +} + +static void go_w_any_txn_middle (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte < i2c_adapter->last_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); + + I2C_SendData(i2c_adapter->cfg->regs, *(i2c_adapter->active_byte)); + + /* Move to the next byte */ + i2c_adapter->active_byte++; + PIOS_DEBUG_Assert(i2c_adapter->active_byte <= i2c_adapter->last_byte); +} + +static void go_w_more_txn_last (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte == i2c_adapter->last_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); + + I2C_SendData(i2c_adapter->cfg->regs, *(i2c_adapter->active_byte)); + + /* Move to the next byte */ + i2c_adapter->active_byte++; + + /* Move to the next transaction */ + i2c_adapter->active_txn++; + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); +} + + +static void go_w_last_txn_last (struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_DEBUG_Assert(i2c_adapter->active_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_byte == i2c_adapter->last_byte); + PIOS_DEBUG_Assert(i2c_adapter->active_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn >= i2c_adapter->first_txn); + PIOS_DEBUG_Assert(i2c_adapter->active_txn <= i2c_adapter->last_txn); + + I2C_ITConfig(i2c_adapter->cfg->regs, I2C_IT_BUF, DISABLE); + I2C_SendData(i2c_adapter->cfg->regs, *(i2c_adapter->active_byte)); + +// SHOULD MOVE THIS INTO A STOPPING STATE AND SET IT ONLY AFTER THE BYTE WAS SENT + I2C_GenerateSTOP(i2c_adapter->cfg->regs, ENABLE); + + /* Move to the next byte */ + i2c_adapter->active_byte++; +} + +static void i2c_adapter_inject_event(struct pios_i2c_adapter * i2c_adapter, enum i2c_adapter_event event) +{ + PIOS_IRQ_Disable(); + + /* + * Move to the next state + * + * This is done prior to calling the new state's entry function to + * guarantee that the entry function never depends on the previous + * state. This way, it cannot ever know what the previous state was. + */ + enum i2c_adapter_state prev_state = i2c_adapter->curr_state; + if (prev_state); + + i2c_adapter->curr_state = i2c_adapter_transitions[i2c_adapter->curr_state].next_state[event]; + + /* Call the entry function (if any) for the next state. */ + if (i2c_adapter_transitions[i2c_adapter->curr_state].entry_fn) { + i2c_adapter_transitions[i2c_adapter->curr_state].entry_fn(i2c_adapter); + } + PIOS_IRQ_Enable(); +} + +static void i2c_adapter_process_auto(struct pios_i2c_adapter * i2c_adapter) +{ + PIOS_IRQ_Disable(); + + enum i2c_adapter_state prev_state = i2c_adapter->curr_state; + if (prev_state); + + while (i2c_adapter_transitions[i2c_adapter->curr_state].next_state[I2C_EVENT_AUTO]) { + i2c_adapter->curr_state = i2c_adapter_transitions[i2c_adapter->curr_state].next_state[I2C_EVENT_AUTO]; + + /* Call the entry function (if any) for the next state. */ + if (i2c_adapter_transitions[i2c_adapter->curr_state].entry_fn) { + i2c_adapter_transitions[i2c_adapter->curr_state].entry_fn(i2c_adapter); + } + } + + PIOS_IRQ_Enable(); +} + +static void i2c_adapter_fsm_init(struct pios_i2c_adapter * i2c_adapter) +{ + i2c_adapter->curr_state = I2C_STATE_STOPPED; + //go_stopped(i2c_adapter); +} + + +#include + +static struct pios_i2c_adapter * find_i2c_adapter_by_id (uint8_t adapter) +{ + if (adapter >= pios_i2c_num_adapters) { + /* Undefined I2C adapter for this board (see pios_board.c) */ + return NULL; + } + + /* Get a handle for the device configuration */ + return &(pios_i2c_adapters[adapter]); +} /** * Initializes IIC driver @@ -120,556 +560,232 @@ static void TransferEnd(I2CRecTypeDef *i2cx); */ int32_t PIOS_I2C_Init(void) { - /* Configure IIC pins in open drain mode */ - GPIO_InitTypeDef GPIO_InitStructure; - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; - - GPIO_InitStructure.GPIO_Pin = PIOS_I2C_SCL_PIN; - GPIO_Init(PIOS_I2C_GPIO_PORT, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = PIOS_I2C_SDA_PIN; - GPIO_Init(PIOS_I2C_GPIO_PORT, &GPIO_InitStructure); - - PIOS_I2C_InitPeripheral(); + struct pios_i2c_adapter * i2c_adapter; + for (uint8_t i = 0; i < pios_i2c_num_adapters; i++) { + /* Get a handle for the device configuration */ + i2c_adapter = find_i2c_adapter_by_id(i); + PIOS_DEBUG_Assert(i2c_adapter); #ifdef USE_FREERTOS - vSemaphoreCreateBinary(I2CRec.sem_readySignal); - I2CRec.xBusyMutex = xSemaphoreCreateMutex(); + /* + * Must be done prior to calling i2c_adapter_fsm_init() + * since the sem_ready mutex is used in the initial state. + */ + vSemaphoreCreateBinary(i2c_adapter->sem_ready); + i2c_adapter->sem_busy = xSemaphoreCreateMutex(); #endif // USE_FREERTOS - TransferEnd(&I2CRec); + /* Initialize the state machine */ + i2c_adapter_fsm_init(i2c_adapter); - /* Configure and enable I2C interrupts */ - NVIC_InitTypeDef NVIC_InitStructure; - NVIC_InitStructure.NVIC_IRQChannel = PIOS_I2C_IRQ_EV_CHANNEL; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PIOS_I2C_IRQ_EV_PRIORITY; - NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; - NVIC_Init(&NVIC_InitStructure); + /* Initialize the GPIO pins */ + GPIO_Init(i2c_adapter->cfg->scl.gpio, &(i2c_adapter->cfg->scl.init)); + GPIO_Init(i2c_adapter->cfg->sda.gpio, &(i2c_adapter->cfg->sda.init)); - NVIC_InitStructure.NVIC_IRQChannel = PIOS_I2C_IRQ_ER_CHANNEL; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PIOS_I2C_IRQ_ER_PRIORITY; - NVIC_Init(&NVIC_InitStructure); + /* Enable the associated peripheral clock */ + switch ((uint32_t)i2c_adapter->cfg->regs) { + case (uint32_t)I2C1: + /* Enable I2C peripheral clock (APB1 == slow speed) */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); + break; + case (uint32_t)I2C2: + /* Enable I2C peripheral clock (APB1 == slow speed) */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); + break; + } - DebugPinLow(2); - - /* No error */ - return 0; -} - - -/** -* Internal function to (re-)initialize the I2C peripheral -*/ -static void PIOS_I2C_InitPeripheral(void) -{ - I2C_InitTypeDef I2C_InitStructure; - I2CRecTypeDef *i2cx = &I2CRec; - - /* Prepare I2C init-struct */ - I2C_StructInit(&I2C_InitStructure); - I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; - I2C_InitStructure.I2C_OwnAddress1 = 0; - I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; - I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; - - /* Define base address */ - i2cx->base = PIOS_I2C_PORT; - - /* enable peripheral clock of I2C */ - RCC_APB1PeriphClockCmd(PIOS_I2C_CLK, ENABLE); - - /* Set I2C clock bus clock params */ - /* Note that the STM32 driver handles value <= 100kHz differently! (duty cycle always 1:1) */ - /* Important: bus frequencies > 400kHz don't work stable */ - I2C_InitStructure.I2C_DutyCycle = PIOS_I2C_DUTY_CYCLE; - I2C_InitStructure.I2C_ClockSpeed = PIOS_I2C_BUS_FREQ; - - /* Trigger software reset via I2C_DeInit */ - I2C_DeInit(i2cx->base); - - /* Clear transfer state and error value */ - i2cx->transfer_state.ALL = 0; - i2cx->transfer_error = 0; - - /* Configure I2C peripheral */ - I2C_Init(i2cx->base, &I2C_InitStructure); -} - - -#ifdef USE_FREERTOS -/** -* Semaphore handling: requests the IIC interface -* \param[in] timeout Timeout in ticks, 0 for no delay -* \return TRUE when the lock to the device was obtained -*/ -bool PIOS_I2C_LockDevice(portTickType timeout) -{ - if (xSemaphoreTake(I2CRec.xBusyMutex, timeout) == pdTRUE) - { - // Ok, got device - return TRUE; - } - else - { - return FALSE; - } -} - - - -/** -* Semaphore handling: releases the IIC interface for other tasks -* \return < 0 on errors -*/ -void PIOS_I2C_UnlockDevice(void) -{ - xSemaphoreGive(I2CRec.xBusyMutex); -} - -#endif // USE_FREERTOS - - -/** - * Internal function called at the start of a transfer - */ -static void TransferStart(I2CRecTypeDef *i2cx) -{ - Assert(i2cx->transfer_state.BUSY == 0); - - DebugPinHigh(DEBUG_PIN_BUSY); - i2cx->transfer_state.BUSY = 1; - - // Enable Interrupts: I2V2 event, buffer and error interrupt - I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE); -} - -/** - * Internal function called at the end of a transfer - */ -static void TransferEnd(I2CRecTypeDef *i2cx) -{ - // Disable all interrupts - I2C_ITConfig(i2cx->base, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, DISABLE); - - DebugPinLow(DEBUG_PIN_BUSY); - i2cx->transfer_state.BUSY = 0; - -#ifdef USE_FREERTOS - if (i2cx->transfer_state.INIRQ) - { - xSemaphoreGiveFromISR(i2cx->sem_readySignal, &i2cx->xHigherPriorityTaskWoken); - } - else - { - xSemaphoreGive(i2cx->sem_readySignal); - } +#if 0 /* FIXME: is this reset necessary? Should it be done in the stopped state? */ + /* Reset the I2C block */ + I2C_SoftwareResetCmd(i2c_adapter->cfg->regs, ENABLE); + I2C_SoftwareResetCmd(i2c_adapter->cfg->regs, DISABLE); #endif + + /* Reset the I2C block */ + I2C_DeInit(i2c_adapter->cfg->regs); + + /* Initialize the I2C block */ + I2C_Init(i2c_adapter->cfg->regs, &(i2c_adapter->cfg->init)); + +#if 1 /* FIXME: is this reset necessary? Should it be done in the stopped state? */ +#define I2C_BUSY 0x20 + if (i2c_adapter->cfg->regs->SR2 & I2C_BUSY) { + /* Reset the I2C block */ + I2C_SoftwareResetCmd(i2c_adapter->cfg->regs, ENABLE); + I2C_SoftwareResetCmd(i2c_adapter->cfg->regs, DISABLE); + } +#endif + + /* Configure and enable I2C interrupts */ + NVIC_Init(&(i2c_adapter->cfg->event.init)); + NVIC_Init(&(i2c_adapter->cfg->error.init)); + } + + /* No error */ + return 0; } -/** -* Checks if transfer is finished -* \return 1 if ongoing transfer -* \return <=0 no transfer is busy; return value indicates error value of last transfer -* (PIOS_I2C_TransferBegin() has to be called again) -*/ -int32_t PIOS_I2C_TransferCheck(void) + +bool PIOS_I2C_Transfer(uint8_t i2c, const struct pios_i2c_txn txn_list[], uint32_t num_txns) { - I2CRecTypeDef *i2cx = &I2CRec; + PIOS_DEBUG_Assert(txn_list); + PIOS_DEBUG_Assert(num_txns); - if(i2cx->transfer_state.BUSY) - return 1; + struct pios_i2c_adapter * i2c_adapter; - return i2cx->transfer_error; -} - -/** - * Stop the current transfer - * \param error the error that must be reported - */ -void PIOS_I2C_TerminateTransfer(uint32_t error) -{ - I2CRecTypeDef *i2cx = &I2CRec; - - /* Send stop condition */ - I2C_GenerateSTOP(i2cx->base, ENABLE); - - /* Re-initialize peripheral */ - PIOS_I2C_InitPeripheral(); - - i2cx->transfer_error = error; -} - -/** -* Waits until transfer is finished. -* \return error value of the transfer -*/ -int32_t PIOS_I2C_TransferWait(void) -{ - I2CRecTypeDef *i2cx = &I2CRec; - - DebugPinHigh(DEBUG_PIN_WAIT); + i2c_adapter = find_i2c_adapter_by_id(i2c); + PIOS_DEBUG_Assert(i2c_adapter); #ifdef USE_FREERTOS + /* Lock the bus */ + xSemaphoreTake(i2c_adapter->sem_busy, portMAX_DELAY); +#endif /* USE_FREERTOS */ - if (i2cx->transfer_state.BUSY) - { - // Wait until we see the ready signal - if (xSemaphoreTake(i2cx->sem_readySignal, PIOS_I2C_TIMEOUT_VALUE/portTICK_RATE_MS) == pdTRUE) - { - // OK, got the semaphore, release it again - Assert(i2cx->transfer_state.BUSY == 0); - } - else - { - PIOS_I2C_TerminateTransfer(I2C_ERROR_TIMEOUT); - } - } + PIOS_DEBUG_Assert(i2c_adapter->curr_state == I2C_STATE_STOPPED); + i2c_adapter->first_txn = &txn_list[0]; + i2c_adapter->last_txn = &txn_list[num_txns - 1]; + i2c_adapter->active_txn = i2c_adapter->first_txn; + +#ifdef USE_FREERTOS + /* Make sure the done/ready semaphore is consumed before we start */ + xSemaphoreTake(i2c_adapter->sem_ready, portMAX_DELAY); +#endif + + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_START); + + /* Wait for the transfer to complete */ +#ifdef USE_FREERTOS + xSemaphoreTake(i2c_adapter->sem_ready, portMAX_DELAY); + xSemaphoreGive(i2c_adapter->sem_ready); #else - uint32_t repeat_ctr = PIOS_I2C_TIMEOUT_VALUE*100; // FIXME - uint16_t last_buffer_ix = i2cx->buffer_ix; - - if (i2cx->transfer_state.BUSY) - { - while(--repeat_ctr > 0) - { - /* Check if buffer index has changed - if so, reload repeat counter */ - if(i2cx->buffer_ix != last_buffer_ix) { - repeat_ctr = PIOS_I2C_TIMEOUT_VALUE; - last_buffer_ix = i2cx->buffer_ix; - } - - /* Get transfer state */ - int32_t check_state = PIOS_I2C_TransferCheck(); - - /* Exit if transfer finished */ - if(check_state <= 0) - { - DebugPinLow(DEBUG_PIN_WAIT); - return check_state; - } - } - - /* Timeout error - something is stalling... */ - PIOS_I2C_TerminateTransfer(I2C_ERROR_TIMEOUT); - } -#endif - - DebugPinLow(DEBUG_PIN_WAIT); - - return i2cx->transfer_error; -} - -/** -* Perform a transfer. No previous transfer should be ongoing when this function is called. -* When the function returns, the transfer is finished. -* See PIOS_I2C_StartTransfer() for details on the parameters. -* \return 0 no error -* \return < 0 on errors -* -*/ -int32_t PIOS_I2C_Transfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t *buffer, uint16_t len) -{ - PIOS_I2C_StartTransfer(transfer, address, buffer, len); - return PIOS_I2C_TransferWait(); -} - -/** -* Starts a new transfer. No previous transfer should be ongoing when this function is called. -* When this function returns, the new transfer is ongoing. PIOS_I2C_TransferWait() should be called -* to wait for the transfer to finish and to retrieve the result code. -* \param[in] transfer type:
-*

    -*
  • I2C_Read: a common Read transfer -*
  • I2C_Write: a common Write transfer -*
  • I2C_Write_WithoutStop: don't send stop condition after transfer to allow -* a restart condition (e.g. used to access EEPROMs) -* \param[in] address of I2C device (bit 0 always cleared) -* \param[in] *buffer pointer to transmit/receive buffer -* \param[in] len number of bytes which should be transmitted/received -*/ -void PIOS_I2C_StartTransfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t *buffer, uint16_t len) -{ - I2CRecTypeDef *i2cx = &I2CRec; - - // Should not be busy - if (i2cx->transfer_state.BUSY) - { - Assert(0); - return; - } + /* Spin waiting for the transfer to finish */ + while (i2c_adapter->curr_state != I2C_STATE_STOPPED); +#endif /* USE_FREERTOS */ #ifdef USE_FREERTOS - // Consume Ready semaphore in case it would be there for some reason - xSemaphoreTake(i2cx->sem_readySignal, 0); - Assert(xSemaphoreTake(i2cx->sem_readySignal, 0) == pdFALSE); -#endif + /* Unlock the bus */ + xSemaphoreGive(i2c_adapter->sem_busy); +#endif /* USE_FREERTOS */ - // Clear state - i2cx->transfer_state.ALL = 0; - i2cx->transfer_error = 0; - - // Set buffer length and start index - i2cx->buffer_len = len; - i2cx->buffer_ix = 0; - - if(transfer == I2C_Read) - { - /* Take new address/buffer/len */ - /* Set bit 0 for read operation */ - i2cx->i2c_address = address | 1; - /* Ensure that previous TX buffer won't be accessed */ - i2cx->tx_buffer_ptr = NULL; - i2cx->rx_buffer_ptr = buffer; - // Ack the bytes we will be getting - I2C_AcknowledgeConfig(i2cx->base, ENABLE); - } - else if(transfer == I2C_Write || transfer == I2C_Write_WithoutStop) - { - /* Take new address/buffer/len */ - /* Clear bit 0 for write operation */ - i2cx->i2c_address = address & 0xfe; - i2cx->tx_buffer_ptr = buffer; - /* Ensure that nothing will be received */ - i2cx->rx_buffer_ptr = NULL; - /* Option to skip stop-condition generation after successful write */ - i2cx->transfer_state.WRITE_WITHOUT_STOP = transfer == I2C_Write_WithoutStop ? 1 : 0; - } - else - { - i2cx->transfer_error = I2C_ERROR_UNSUPPORTED_TRANSFER_TYPE; - return; - } - - // Start the transfer - I2C_GenerateSTART(i2cx->base, ENABLE); - TransferStart(i2cx); -} - -/** -* Internal function for handling IIC event interrupts -*/ -static void EV_IRQHandler(I2CRecTypeDef *i2cx) -{ - uint8_t b; - uint32_t event; - - DebugPinHigh(DEBUG_PIN_ISR); - - // Update state - i2cx->transfer_state.INIRQ = 1; -#ifdef USE_FREERTOS - i2cx->xHigherPriorityTaskWoken = pdFALSE; -#endif - - /* Read SR1 and SR2 at the beginning (if not done so, flags may get lost) */ - event = I2C_GetLastEvent(i2cx->base); - - /* The order of the handling blocks is chosen by test results @ 1MHZ */ - /* Don't change this order */ - - /* RxNE set, will be cleared by reading/writing DR */ - /* Note: also BTF will be reset after a read of SR1 (TxE flag) followed by either read/write DR */ - /* Or a START or STOP condition generated */ - /* Failsave: really requested a receive transfer? If not, continue to check TXE flag, if not set, */ - /* We'll end up in the unexpected event handler. */ - if(event & I2C_FLAG_RXNE && i2cx->rx_buffer_ptr != NULL) { - /* Get received data */ - b = I2C_ReceiveData(i2cx->base); - - /* Failsave: still place in buffer? */ - if(i2cx->buffer_ix < i2cx->buffer_len) { - i2cx->rx_buffer_ptr[i2cx->buffer_ix++] = b; - } - - - /* Last byte received, disable interrupts and return. */ - if(i2cx->transfer_state.STOP_REQUESTED) { - TransferEnd(i2cx); - goto isr_return; - } - - /* Request NAK and stop condition before receiving last data */ - if(i2cx->buffer_ix >= i2cx->buffer_len-1) { - /* Request NAK */ - I2C_AcknowledgeConfig(i2cx->base, DISABLE); - /* Request stop condition */ - I2C_GenerateSTOP(i2cx->base, ENABLE); - i2cx->transfer_state.STOP_REQUESTED = 1; - } - goto isr_return; - } - - /* ADDR set, TRA flag not set (indicates transmitter/receiver mode). */ - /* ADDR will be cleared by a read of SR1 followed by a read of SR2 (done by I2C_GetLastEvent) */ - /* If transmitter mode is selected (TRA set), we go on, TXE will be catched to send the first byte */ - if((event & I2C_FLAG_ADDR) && !(event & I2C_FLAG_TRA)) { - /* Address sent (receiver mode), receiving first byte - check if we already have to request NAK/Stop */ - if(i2cx->buffer_len == 1) { - /* Request NAK */ - I2C_AcknowledgeConfig(i2cx->base, DISABLE); - /* Request stop condition */ - I2C_GenerateSTOP(i2cx->base, ENABLE); - i2cx->transfer_state.STOP_REQUESTED = 1; - } - goto isr_return; - } - - /* TxE set, will be cleared by writing DR, or after START or STOP was generated */ - /* This handling also applies for BTF, as TXE will alway be set if BTF is. */ - /* Note: also BTF will be reset after a read of SR1 (TxE flag) followed by either read/write DR */ - /* Or a START or STOP condition generated */ - if(event & I2C_FLAG_TXE) { - /* Last byte already sent, disable interrupts and return. */ - if(i2cx->transfer_state.STOP_REQUESTED) { - TransferEnd(i2cx); - goto isr_return; - } - - if(i2cx->buffer_ix < i2cx->buffer_len) { - /* Checking tx_buffer_ptr for NULL is a failsafe measure. */ - I2C_SendData(i2cx->base, (i2cx->tx_buffer_ptr == NULL) ? 0 : i2cx->tx_buffer_ptr[i2cx->buffer_ix++]); - goto isr_return; - } - - /* Peripheral is transfering last byte, request stop condition / */ - /* On write-without-stop transfer-type, request start condition instead */ - i2cx->transfer_state.STOP_REQUESTED = 1; - if(!i2cx->transfer_state.WRITE_WITHOUT_STOP) - { - I2C_GenerateSTOP(i2cx->base, ENABLE); - } - else - { - DebugPinHigh(2); - } - - if(i2cx->buffer_len == 0) { - TransferEnd(i2cx); - } else { - /* Disable the I2C_IT_BUF interrupt after sending the last buffer data */ - /* (last EV8) to not allow a new interrupt just with TxE - only BTF will generate it */ - /* If this is not done, BUSY will be cleared before the transfer is finished */ - I2C_ITConfig(i2cx->base, I2C_IT_BUF, DISABLE); - } - goto isr_return; - } - - // Send address - /* SB set, cleared by reading SR1 (done by I2C_GetLastEvent) followed by writing DR register */ - if(event & I2C_FLAG_SB) { - /* Don't send address if stop was requested (WRITE_WITHOUT_STOP - mode, start condition was sent) */ - /* We have to wait for the application to start the next transfer */ - if(i2cx->transfer_state.STOP_REQUESTED) { - TransferEnd(i2cx); - DebugPinLow(DEBUG_PIN_ISR); - goto isr_return; - } - - /* Send IIC address */ - I2C_Send7bitAddress(i2cx->base, i2cx->i2c_address, - (i2cx->i2c_address & 1) - ? I2C_Direction_Receiver - : I2C_Direction_Transmitter); - goto isr_return; - } - - DebugPinHigh(DEBUG_PIN_ASSERT);DebugPinLow(DEBUG_PIN_ASSERT); - - // - // FredericG: Despite the comments below, it seems to me that this situation can happen and can - // be ignored without ill effects... - // For now this condition does not stop the transfer, but further investigation in needed - // - -// Assert(0); -// -// /* This code is only reached if something got wrong, e.g. interrupt handler is called too late, */ -// /* The device reset itself (while testing, it was always event 0x00000000). we have to stop the transfer, */ -// /* Else read/write of corrupt data may be the result. */ -// -// /* Notify error */ -// PIOS_I2C_UnexpectedEvent = event; -// i2cx->transfer_error = I2C_ERROR_UNEXPECTED_EVENT; -// -// TransferEnd(i2cx); -// -// /* Do dummy read to send NAK + STOP condition */ -// I2C_AcknowledgeConfig(i2cx->base, DISABLE); -// b = I2C_ReceiveData(i2cx->base); -// I2C_GenerateSTOP(i2cx->base, ENABLE); - -isr_return: - // Cause task-switch when needed -#ifdef USE_FREERTOS - portEND_SWITCHING_ISR(i2cx->xHigherPriorityTaskWoken); -#endif - - // Update state - i2cx->transfer_state.INIRQ = 0; - DebugPinLow(DEBUG_PIN_ISR); -} - - -/** -* Internal function for handling IIC error interrupts -*/ -static void ER_IRQHandler(I2CRecTypeDef *i2cx) -{ - /* Read SR1 and SR2 at the beginning (if not done so, flags may get lost) */ - uint32_t event = I2C_GetLastEvent(i2cx->base); - - i2cx->transfer_state.INIRQ = 1; - - /* Note that only one error number is available */ - /* The order of these checks defines the priority */ - - /* Bus error (start/stop condition during read */ - /* Unlikely, should only be relevant for slave mode?) */ - if(event & I2C_FLAG_BERR) { - I2C_ClearITPendingBit(i2cx->base, I2C_IT_BERR); - i2cx->transfer_error = I2C_ERROR_BUS; - } - - /* Arbitration lost */ - if(event & I2C_FLAG_ARLO) { - I2C_ClearITPendingBit(i2cx->base, I2C_IT_ARLO); - i2cx->transfer_error = I2C_ERROR_ARBITRATION_LOST; - } - - /* No acknowledge received from slave (e.g. slave not connected) */ - if(event & I2C_FLAG_AF) { - I2C_ClearITPendingBit(i2cx->base, I2C_IT_AF); - i2cx->transfer_error = I2C_ERROR_SLAVE_NOT_CONNECTED; - /* Send stop condition to release bus */ - I2C_GenerateSTOP(i2cx->base, ENABLE); - } - - /* Notify that transfer has finished (due to the error) */ - TransferEnd(i2cx); - - i2cx->transfer_state.INIRQ = 0; -} - - -/* Interrupt vectors */ -PIOS_I2C_IRQ_EV_HANDLER -{ - EV_IRQHandler((I2CRecTypeDef *)&I2CRec); -} - -PIOS_I2C_IRQ_ER_HANDLER -{ - ER_IRQHandler((I2CRecTypeDef *)&I2CRec); + return TRUE; } #endif +void PIOS_I2C_EV_IRQ_Handler(uint8_t i2c) +{ + struct pios_i2c_adapter * i2c_adapter; + + i2c_adapter = find_i2c_adapter_by_id(i2c); + PIOS_DEBUG_Assert(i2c_adapter); + + uint32_t event = I2C_GetLastEvent(i2c_adapter->cfg->regs); + + switch (event) { + case (I2C_EVENT_MASTER_MODE_SELECT | 0x40): + /* Unexplained event: EV5 + RxNE : Extraneous Rx. Probably a late NACK from previous read. */ + /* Clean up the extra Rx until the root cause is identified and just keep going */ + (void) I2C_ReceiveData(i2c_adapter->cfg->regs); + /* Fall through */ + case I2C_EVENT_MASTER_MODE_SELECT: /* EV5 */ + switch (i2c_adapter->active_txn->rw) { + case PIOS_I2C_TXN_READ: + if (i2c_adapter->active_txn == i2c_adapter->last_txn) { + /* Final transaction */ + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_STARTED_LAST_TXN_READ); + } else if (i2c_adapter->active_txn < i2c_adapter->last_txn) { + /* More transactions follow */ + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_STARTED_MORE_TXN_READ); + } else { + PIOS_DEBUG_Assert(0); + } + break; + case PIOS_I2C_TXN_WRITE: + if (i2c_adapter->active_txn == i2c_adapter->last_txn) { + /* Final transaction */ + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_STARTED_LAST_TXN_WRITE); + } else if (i2c_adapter->active_txn < i2c_adapter->last_txn) { + /* More transactions follow */ + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_STARTED_MORE_TXN_WRITE); + } else { + PIOS_DEBUG_Assert(0); + } + break; + default: + PIOS_DEBUG_Assert(0); + break; + } + break; + case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED: /* EV6 */ + case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED: /* EV6 */ + switch (i2c_adapter->last_byte - i2c_adapter->active_byte + 1) { + case 0: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_ADDR_SENT_LEN_EQ_0); + break; + case 1: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_ADDR_SENT_LEN_EQ_1); + break; + case 2: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_ADDR_SENT_LEN_EQ_2); + break; + default: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_ADDR_SENT_LEN_GT_2); + break; + } + break; + case 0x80: /* TxE only. TRA + MSL + BUSY have been cleared before we got here. */ + /* Ignore */ + { + static volatile bool halt = FALSE; + while (halt); + } + break; + case 0: /* Unexplained spurious event. Not sure what to do here. */ + case 0x40: /* RxNE only. MSL + BUSY have already been cleared by HW. */ + case 0x44: /* RxNE + BTF. MSL + BUSY have already been cleared by HW. */ + case I2C_EVENT_MASTER_BYTE_RECEIVED: /* EV7 */ + case (I2C_EVENT_MASTER_BYTE_RECEIVED | 0x4): /* EV7 + BTF */ + case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* EV8_2 */ + case 0x84: /* TxE + BTF. EV8_2 but TRA + MSL + BUSY have already been cleared by HW. */ + switch (i2c_adapter->last_byte - i2c_adapter->active_byte + 1) { + case 0: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_TRANSFER_DONE_LEN_EQ_0); + break; + case 1: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_TRANSFER_DONE_LEN_EQ_1); + break; + case 2: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_TRANSFER_DONE_LEN_EQ_2); + break; + default: + i2c_adapter_inject_event(i2c_adapter, I2C_EVENT_TRANSFER_DONE_LEN_GT_2); + break; + } + break; + case I2C_EVENT_MASTER_BYTE_TRANSMITTING: /* EV8 */ + /* Ignore this event and wait for TRANSMITTED in case we can't keep up */ + break; + default: + PIOS_DEBUG_Assert(0); + break; + } + + i2c_adapter_process_auto(i2c_adapter); +} + +void PIOS_I2C_ER_IRQ_Handler(uint8_t i2c) +{ + struct pios_i2c_adapter * i2c_adapter; + + i2c_adapter = find_i2c_adapter_by_id(i2c); + PIOS_DEBUG_Assert(i2c_adapter); + + /* Fail hard on any errors for now */ + PIOS_DEBUG_Assert(0); +} + /** * @} * @} - */ \ No newline at end of file + */ diff --git a/flight/PiOS/inc/pios_bmp085.h b/flight/PiOS/inc/pios_bmp085.h index bd5948bf3..4d2d75012 100644 --- a/flight/PiOS/inc/pios_bmp085.h +++ b/flight/PiOS/inc/pios_bmp085.h @@ -75,12 +75,12 @@ extern void PIOS_BMP085_StartADC(ConversionTypeTypeDef Type); extern void PIOS_BMP085_ReadADC(void); extern int16_t PIOS_BMP085_GetTemperature(void); extern int32_t PIOS_BMP085_GetPressure(void); -extern int32_t PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len); -extern int32_t PIOS_BMP085_Write(uint8_t address, uint8_t buffer); +extern bool PIOS_BMP085_Read(uint8_t address, uint8_t *buffer, uint8_t len); +extern bool PIOS_BMP085_Write(uint8_t address, uint8_t buffer); #endif /* PIOS_BMP085_H */ /** * @} * @} - */ \ No newline at end of file + */ diff --git a/flight/PiOS/inc/pios_hmc5843.h b/flight/PiOS/inc/pios_hmc5843.h index 4acfd4359..545ce68ae 100644 --- a/flight/PiOS/inc/pios_hmc5843.h +++ b/flight/PiOS/inc/pios_hmc5843.h @@ -103,12 +103,12 @@ extern void PIOS_HMC5843_Init(void); extern void PIOS_HMC5843_Config(PIOS_HMC5843_ConfigTypeDef *HMC5843_Config_Struct); extern void PIOS_HMC5843_ReadMag(int16_t out[3]); extern void PIOS_HMC5843_ReadID(uint8_t out[4]); -extern int32_t PIOS_HMC5843_Read(uint8_t address, uint8_t *buffer, uint8_t len); -extern int32_t PIOS_HMC5843_Write(uint8_t address, uint8_t buffer); +extern bool PIOS_HMC5843_Read(uint8_t address, uint8_t *buffer, uint8_t len); +extern bool PIOS_HMC5843_Write(uint8_t address, uint8_t buffer); #endif /* PIOS_HMC5843_H */ /** * @} * @} - */ \ No newline at end of file + */ diff --git a/flight/PiOS/inc/pios_i2c.h b/flight/PiOS/inc/pios_i2c.h index 929ca2194..b884d0b62 100644 --- a/flight/PiOS/inc/pios_i2c.h +++ b/flight/PiOS/inc/pios_i2c.h @@ -31,42 +31,28 @@ #ifndef PIOS_I2C_H #define PIOS_I2C_H -/* Local defines */ -#define I2C_ERROR_INVALID_PORT -1 -#define I2C_ERROR_GENERAL -2 -#define I2C_ERROR_UNSUPPORTED_TRANSFER_TYPE -3 -#define I2C_ERROR_TIMEOUT -4 -#define I2C_ERROR_ARBITRATION_LOST -5 -#define I2C_ERROR_BUS -6 -#define I2C_ERROR_SLAVE_NOT_CONNECTED -7 -#define I2C_ERROR_UNEXPECTED_EVENT -8 -#define I2C_ERROR_RX_BUFFER_OVERRUN -9 -#define I2C_ERROR_BUSY -10 - - /* Global Types */ +enum pios_i2c_txn_direction { + PIOS_I2C_TXN_READ, + PIOS_I2C_TXN_WRITE +}; -typedef enum { - I2C_Read, - I2C_Write, - I2C_Write_WithoutStop -} I2CTransferTypeDef; +struct pios_i2c_txn { + uint16_t addr; + enum pios_i2c_txn_direction rw; + uint32_t len; + uint8_t * buf; +}; /* Public Functions */ extern int32_t PIOS_I2C_Init(void); -extern int32_t PIOS_I2C_TransferCheck(void); -extern int32_t PIOS_I2C_TransferWait(void); -extern int32_t PIOS_I2C_Transfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t *buffer, uint16_t len); -extern void PIOS_I2C_StartTransfer(I2CTransferTypeDef transfer, uint8_t address, uint8_t *buffer, uint16_t len); - -#ifdef PIOS_INCLUDE_FREERTOS -extern bool PIOS_I2C_LockDevice(portTickType timeout); -extern void PIOS_I2C_UnlockDevice(void); -#endif // PIOS_INCLUDE_FREERTOS +extern bool PIOS_I2C_Transfer(uint8_t i2c, const struct pios_i2c_txn txn_list[], uint32_t num_txns); +extern void PIOS_I2C_EV_IRQ_Handler(uint8_t i2c); +extern void PIOS_I2C_ER_IRQ_Handler(uint8_t i2c); #endif /* PIOS_I2C_H */ /** * @} * @} - */ \ No newline at end of file + */ diff --git a/flight/PiOS/inc/pios_i2c_priv.h b/flight/PiOS/inc/pios_i2c_priv.h new file mode 100644 index 000000000..660e92ae3 --- /dev/null +++ b/flight/PiOS/inc/pios_i2c_priv.h @@ -0,0 +1,96 @@ +/** + ****************************************************************************** + * + * @file pios_i2c_priv.h + * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010. + * Parts by Thorsten Klose (tk@midibox.org) + * @brief I2C private definitions. + * @see The GNU Public License (GPL) Version 3 + * + *****************************************************************************/ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef PIOS_I2C_PRIV_H +#define PIOS_I2C_PRIV_H + +#include +#include + +struct pios_i2c_adapter_cfg { + I2C_TypeDef * regs; + I2C_InitTypeDef init; + + uint32_t transfer_timeout_ms; + struct stm32_gpio scl; + struct stm32_gpio sda; + struct stm32_irq event; + struct stm32_irq error; +}; + +enum i2c_adapter_state { + I2C_STATE_FAULTED = 0, /* Must be zero so undefined transitions land here */ + + I2C_STATE_STOPPED, + I2C_STATE_STOPPING, + I2C_STATE_STARTING, + + I2C_STATE_R_MORE_TXN_ADDR, + I2C_STATE_R_MORE_TXN_PRE_ONE, + I2C_STATE_R_MORE_TXN_PRE_FIRST, + I2C_STATE_R_MORE_TXN_PRE_MIDDLE, + I2C_STATE_R_MORE_TXN_PRE_LAST, + I2C_STATE_R_MORE_TXN_POST_LAST, + + I2C_STATE_R_LAST_TXN_ADDR, + I2C_STATE_R_LAST_TXN_PRE_ONE, + I2C_STATE_R_LAST_TXN_PRE_FIRST, + I2C_STATE_R_LAST_TXN_PRE_MIDDLE, + I2C_STATE_R_LAST_TXN_PRE_LAST, + I2C_STATE_R_LAST_TXN_POST_LAST, + + I2C_STATE_W_MORE_TXN_ADDR, + I2C_STATE_W_MORE_TXN_MIDDLE, + I2C_STATE_W_MORE_TXN_LAST, + + I2C_STATE_W_LAST_TXN_ADDR, + I2C_STATE_W_LAST_TXN_MIDDLE, + I2C_STATE_W_LAST_TXN_LAST, + + I2C_STATE_NUM_STATES /* Must be last */ +}; + +struct pios_i2c_adapter { + const struct pios_i2c_adapter_cfg * const cfg; + void (*callback)(uint8_t, uint8_t); +#ifdef PIOS_INCLUDE_FREERTOS + xSemaphoreHandle sem_busy; + xSemaphoreHandle sem_ready; +#endif + + enum i2c_adapter_state curr_state; + const struct pios_i2c_txn * first_txn; + const struct pios_i2c_txn * active_txn; + const struct pios_i2c_txn * last_txn; + + uint8_t * active_byte; + uint8_t * last_byte; +}; + +extern struct pios_i2c_adapter pios_i2c_adapters[]; +extern uint8_t pios_i2c_num_adapters; + +#endif /* PIOS_I2C_PRIV_H */