mirror of
https://github.com/apache/nuttx.git
synced 2026-05-28 11:56:10 +08:00
Check return from nxsem_wait_uninterruptible()
This commits is for all 1wire drivers under arch/
This commit is contained in:
@@ -129,14 +129,14 @@ struct stm32_1wire_config_s
|
|||||||
struct stm32_1wire_priv_s
|
struct stm32_1wire_priv_s
|
||||||
{
|
{
|
||||||
const struct stm32_1wire_config_s *config; /* Port configuration */
|
const struct stm32_1wire_config_s *config; /* Port configuration */
|
||||||
volatile int refs; /* Referernce count */
|
volatile int refs; /* Referernce count */
|
||||||
sem_t sem_excl; /* Mutual exclusion semaphore */
|
sem_t sem_excl; /* Mutual exclusion semaphore */
|
||||||
sem_t sem_isr; /* Interrupt wait semaphore */
|
sem_t sem_isr; /* Interrupt wait semaphore */
|
||||||
int baud; /* Baud rate */
|
int baud; /* Baud rate */
|
||||||
const struct stm32_1wire_msg_s *msgs; /* Messages data */
|
const struct stm32_1wire_msg_s *msgs; /* Messages data */
|
||||||
uint8_t *byte; /* Current byte */
|
uint8_t *byte; /* Current byte */
|
||||||
uint8_t bit; /* Current bit */
|
uint8_t bit; /* Current bit */
|
||||||
volatile int result; /* Exchange result */
|
volatile int result; /* Exchange result */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 1-Wire device, Instance */
|
/* 1-Wire device, Instance */
|
||||||
@@ -151,20 +151,25 @@ struct stm32_1wire_inst_s
|
|||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline uint32_t stm32_1wire_in(struct stm32_1wire_priv_s *priv, int offset);
|
static inline uint32_t stm32_1wire_in(struct stm32_1wire_priv_s *priv,
|
||||||
static inline void stm32_1wire_out(struct stm32_1wire_priv_s *priv, int offset, uint32_t value);
|
int offset);
|
||||||
|
static inline void stm32_1wire_out(struct stm32_1wire_priv_s *priv,
|
||||||
|
int offset, uint32_t value);
|
||||||
static int stm32_1wire_recv(struct stm32_1wire_priv_s *priv);
|
static int stm32_1wire_recv(struct stm32_1wire_priv_s *priv);
|
||||||
static void stm32_1wire_send(struct stm32_1wire_priv_s *priv, int ch);
|
static void stm32_1wire_send(struct stm32_1wire_priv_s *priv, int ch);
|
||||||
static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv);
|
static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv);
|
||||||
static void stm32_1wire_set_apb_clock(struct stm32_1wire_priv_s *priv, bool on);
|
static void stm32_1wire_set_apb_clock(struct stm32_1wire_priv_s *priv,
|
||||||
|
bool on);
|
||||||
static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv);
|
static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static int stm32_1wire_deinit(FAR struct stm32_1wire_priv_s *priv);
|
static int stm32_1wire_deinit(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static inline void stm32_1wire_sem_init(FAR struct stm32_1wire_priv_s *priv);
|
static inline void stm32_1wire_sem_init(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static inline void stm32_1wire_sem_destroy(FAR struct stm32_1wire_priv_s *priv);
|
static inline void stm32_1wire_sem_destroy(
|
||||||
static inline void stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv);
|
FAR struct stm32_1wire_priv_s *priv);
|
||||||
|
static inline int stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static inline void stm32_1wire_sem_post(FAR struct stm32_1wire_priv_s *priv);
|
static inline void stm32_1wire_sem_post(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
||||||
FAR const struct stm32_1wire_msg_s *msgs, int count);
|
FAR const struct stm32_1wire_msg_s *msgs,
|
||||||
|
int count);
|
||||||
static int stm32_1wire_isr(int irq, void *context, void *arg);
|
static int stm32_1wire_isr(int irq, void *context, void *arg);
|
||||||
static int stm32_1wire_reset(FAR struct onewire_dev_s *dev);
|
static int stm32_1wire_reset(FAR struct onewire_dev_s *dev);
|
||||||
static int stm32_1wire_write(FAR struct onewire_dev_s *dev,
|
static int stm32_1wire_write(FAR struct onewire_dev_s *dev,
|
||||||
@@ -174,7 +179,8 @@ static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer,
|
|||||||
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
||||||
const uint8_t *txbuffer, int txbuflen,
|
const uint8_t *txbuffer, int txbuflen,
|
||||||
uint8_t *rxbuffer, int rxbuflen);
|
uint8_t *rxbuffer, int rxbuflen);
|
||||||
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev, const uint8_t *bit);
|
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev,
|
||||||
|
const uint8_t *bit);
|
||||||
static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit);
|
static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -422,7 +428,8 @@ static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv)
|
|||||||
* usartdiv8 = 2 * fCK / baud
|
* usartdiv8 = 2 * fCK / baud
|
||||||
*/
|
*/
|
||||||
|
|
||||||
usartdiv8 = ((priv->config->apbclock << 1) + (priv->baud >> 1)) / priv->baud;
|
usartdiv8 = ((priv->config->apbclock << 1) + (priv->baud >> 1)) /
|
||||||
|
priv->baud;
|
||||||
|
|
||||||
/* Baud rate for standard USART (SPI mode included):
|
/* Baud rate for standard USART (SPI mode included):
|
||||||
*
|
*
|
||||||
@@ -458,8 +465,8 @@ static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv)
|
|||||||
cr1 |= USART_CR1_OVER8;
|
cr1 |= USART_CR1_OVER8;
|
||||||
}
|
}
|
||||||
|
|
||||||
stm32_1wire_out(priv, STM32_USART_CR1_OFFSET, cr1);
|
stm32_1wire_out(priv, STM32_USART_CR1_OFFSET, cr1);
|
||||||
stm32_1wire_out(priv, STM32_USART_BRR_OFFSET, brr);
|
stm32_1wire_out(priv, STM32_USART_BRR_OFFSET, brr);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -479,8 +486,8 @@ static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv)
|
|||||||
* baud = fCK / (16 * usartdiv)
|
* baud = fCK / (16 * usartdiv)
|
||||||
* usartdiv = fCK / (16 * baud)
|
* usartdiv = fCK / (16 * baud)
|
||||||
*
|
*
|
||||||
* Where fCK is the input clock to the peripheral (PCLK1 for USART2, 3, 4, 5
|
* Where fCK is the input clock to the peripheral (PCLK1 for USART2, 3, 4,
|
||||||
* or PCLK2 for USART1)
|
* 5 or PCLK2 for USART1)
|
||||||
*
|
*
|
||||||
* First calculate (NOTE: all stand baud values are even so dividing by two
|
* First calculate (NOTE: all stand baud values are even so dividing by two
|
||||||
* does not lose precision):
|
* does not lose precision):
|
||||||
@@ -609,9 +616,10 @@ static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
|
|
||||||
stm32_1wire_set_apb_clock(priv, true);
|
stm32_1wire_set_apb_clock(priv, true);
|
||||||
|
|
||||||
/* Configure CR2 */
|
/* Configure CR2
|
||||||
/* Clear STOP, CLKEN, CPOL, CPHA, LBCL, and interrupt enable bits */
|
* Clear STOP, CLKEN, CPOL, CPHA, LBCL, and interrupt enable bits
|
||||||
/* Set LBDIE */
|
* Set LBDIE
|
||||||
|
*/
|
||||||
|
|
||||||
regval = stm32_1wire_in(priv, STM32_USART_CR2_OFFSET);
|
regval = stm32_1wire_in(priv, STM32_USART_CR2_OFFSET);
|
||||||
regval &= ~(USART_CR2_STOP_MASK | USART_CR2_CLKEN | USART_CR2_CPOL |
|
regval &= ~(USART_CR2_STOP_MASK | USART_CR2_CLKEN | USART_CR2_CPOL |
|
||||||
@@ -619,9 +627,10 @@ static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
regval |= USART_CR2_LBDIE;
|
regval |= USART_CR2_LBDIE;
|
||||||
stm32_1wire_out(priv, STM32_USART_CR2_OFFSET, regval);
|
stm32_1wire_out(priv, STM32_USART_CR2_OFFSET, regval);
|
||||||
|
|
||||||
/* Configure CR1 */
|
/* Configure CR1
|
||||||
/* Clear TE, REm, all interrupt enable bits, PCE, PS and M */
|
* Clear TE, REm, all interrupt enable bits, PCE, PS and M
|
||||||
/* Set RXNEIE */
|
* Set RXNEIE
|
||||||
|
*/
|
||||||
|
|
||||||
regval = stm32_1wire_in(priv, STM32_USART_CR1_OFFSET);
|
regval = stm32_1wire_in(priv, STM32_USART_CR1_OFFSET);
|
||||||
regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_ALLINTS |
|
regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_ALLINTS |
|
||||||
@@ -629,12 +638,14 @@ static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
regval |= USART_CR1_RXNEIE;
|
regval |= USART_CR1_RXNEIE;
|
||||||
stm32_1wire_out(priv, STM32_USART_CR1_OFFSET, regval);
|
stm32_1wire_out(priv, STM32_USART_CR1_OFFSET, regval);
|
||||||
|
|
||||||
/* Configure CR3 */
|
/* Configure CR3
|
||||||
/* Clear CTSE, RTSE, and all interrupt enable bits */
|
* Clear CTSE, RTSE, and all interrupt enable bits
|
||||||
/* Set ONEBIT, HDSEL and EIE */
|
* Set ONEBIT, HDSEL and EIE
|
||||||
|
*/
|
||||||
|
|
||||||
regval = stm32_1wire_in(priv, STM32_USART_CR3_OFFSET);
|
regval = stm32_1wire_in(priv, STM32_USART_CR3_OFFSET);
|
||||||
regval &= ~(USART_CR3_CTSIE | USART_CR3_CTSE | USART_CR3_RTSE | USART_CR3_EIE);
|
regval &= ~(USART_CR3_CTSIE | USART_CR3_CTSE | USART_CR3_RTSE |
|
||||||
|
USART_CR3_EIE);
|
||||||
regval |= (USART_CR3_ONEBIT | USART_CR3_HDSEL | USART_CR3_EIE);
|
regval |= (USART_CR3_ONEBIT | USART_CR3_HDSEL | USART_CR3_EIE);
|
||||||
stm32_1wire_out(priv, STM32_USART_CR3_OFFSET, regval);
|
stm32_1wire_out(priv, STM32_USART_CR3_OFFSET, regval);
|
||||||
|
|
||||||
@@ -735,7 +746,8 @@ static inline void stm32_1wire_sem_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void stm32_1wire_sem_destroy(FAR struct stm32_1wire_priv_s *priv)
|
static inline void stm32_1wire_sem_destroy(
|
||||||
|
FAR struct stm32_1wire_priv_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_destroy(&priv->sem_excl);
|
nxsem_destroy(&priv->sem_excl);
|
||||||
nxsem_destroy(&priv->sem_isr);
|
nxsem_destroy(&priv->sem_isr);
|
||||||
@@ -749,9 +761,9 @@ static inline void stm32_1wire_sem_destroy(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv)
|
static inline int stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&priv->sem_excl);
|
return nxsem_wait_uninterruptible(&priv->sem_excl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -773,6 +785,7 @@ static inline void stm32_1wire_sem_post(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
* Description:
|
* Description:
|
||||||
* Execute 1-Wire task
|
* Execute 1-Wire task
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
||||||
FAR const struct stm32_1wire_msg_s *msgs,
|
FAR const struct stm32_1wire_msg_s *msgs,
|
||||||
int count)
|
int count)
|
||||||
@@ -784,7 +797,11 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
|
|
||||||
/* Lock out other clients */
|
/* Lock out other clients */
|
||||||
|
|
||||||
stm32_1wire_sem_wait(priv);
|
ret = stm32_1wire_sem_wait(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
priv->result = ERROR;
|
priv->result = ERROR;
|
||||||
|
|
||||||
@@ -797,6 +814,7 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ONEWIRETASK_RESET:
|
case ONEWIRETASK_RESET:
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
|
|
||||||
priv->baud = RESET_BAUD;
|
priv->baud = RESET_BAUD;
|
||||||
@@ -818,6 +836,7 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
|
|
||||||
case ONEWIRETASK_WRITE:
|
case ONEWIRETASK_WRITE:
|
||||||
case ONEWIRETASK_WRITEBIT:
|
case ONEWIRETASK_WRITEBIT:
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
|
|
||||||
priv->baud = TIMESLOT_BAUD;
|
priv->baud = TIMESLOT_BAUD;
|
||||||
@@ -829,7 +848,8 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
priv->msgs = &msgs[indx];
|
priv->msgs = &msgs[indx];
|
||||||
priv->byte = priv->msgs->buffer;
|
priv->byte = priv->msgs->buffer;
|
||||||
priv->bit = 0;
|
priv->bit = 0;
|
||||||
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ? WRITE_TX1 : WRITE_TX0);
|
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ?
|
||||||
|
WRITE_TX1 : WRITE_TX0);
|
||||||
leave_critical_section(irqs);
|
leave_critical_section(irqs);
|
||||||
|
|
||||||
/* Wait. Break on timeout if TX line closed to GND */
|
/* Wait. Break on timeout if TX line closed to GND */
|
||||||
@@ -841,6 +861,7 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
|
|
||||||
case ONEWIRETASK_READ:
|
case ONEWIRETASK_READ:
|
||||||
case ONEWIRETASK_READBIT:
|
case ONEWIRETASK_READBIT:
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
|
|
||||||
priv->baud = TIMESLOT_BAUD;
|
priv->baud = TIMESLOT_BAUD;
|
||||||
@@ -936,7 +957,8 @@ static int stm32_1wire_isr(int irq, void *context, void *arg)
|
|||||||
|
|
||||||
/* Send next bit */
|
/* Send next bit */
|
||||||
|
|
||||||
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ? WRITE_TX1 : WRITE_TX0);
|
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ?
|
||||||
|
WRITE_TX1 : WRITE_TX0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ONEWIRETASK_READ:
|
case ONEWIRETASK_READ:
|
||||||
@@ -1056,8 +1078,8 @@ static int stm32_1wire_reset(FAR struct onewire_dev_s *dev)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_write(FAR struct onewire_dev_s *dev, const uint8_t *buffer,
|
static int stm32_1wire_write(FAR struct onewire_dev_s *dev,
|
||||||
int buflen)
|
const uint8_t *buffer, int buflen)
|
||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
const struct stm32_1wire_msg_s msgs[1] =
|
const struct stm32_1wire_msg_s msgs[1] =
|
||||||
@@ -1078,7 +1100,8 @@ static int stm32_1wire_write(FAR struct onewire_dev_s *dev, const uint8_t *buffe
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer, int buflen)
|
static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer,
|
||||||
|
int buflen)
|
||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
const struct stm32_1wire_msg_s msgs[1] =
|
const struct stm32_1wire_msg_s msgs[1] =
|
||||||
@@ -1104,7 +1127,6 @@ static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer, int
|
|||||||
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
||||||
const uint8_t *txbuffer, int txbuflen,
|
const uint8_t *txbuffer, int txbuflen,
|
||||||
uint8_t *rxbuffer, int rxbuflen)
|
uint8_t *rxbuffer, int rxbuflen)
|
||||||
|
|
||||||
{
|
{
|
||||||
int result = ERROR;
|
int result = ERROR;
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
@@ -1141,6 +1163,7 @@ static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
|||||||
|
|
||||||
result = stm32_1wire_process(priv, msgs, 2);
|
result = stm32_1wire_process(priv, msgs, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1152,7 +1175,8 @@ static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev, const uint8_t *bit)
|
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev,
|
||||||
|
const uint8_t *bit)
|
||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
const struct stm32_1wire_msg_s msgs[1] =
|
const struct stm32_1wire_msg_s msgs[1] =
|
||||||
@@ -1196,7 +1220,7 @@ static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit)
|
|||||||
* Name: stm32_1wireinitialize
|
* Name: stm32_1wireinitialize
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Initialize the selected 1-Wire port. And return a unique instance of struct
|
* Initialize the selected 1-Wire port. And return a unique instance of
|
||||||
* struct onewire_dev_s. This function may be called to obtain multiple
|
* struct onewire_dev_s. This function may be called to obtain multiple
|
||||||
* instances of the interface, each of which may be set up with a
|
* instances of the interface, each of which may be set up with a
|
||||||
* different frequency and slave address.
|
* different frequency and slave address.
|
||||||
|
|||||||
@@ -122,16 +122,16 @@ struct stm32_1wire_config_s
|
|||||||
struct stm32_1wire_priv_s
|
struct stm32_1wire_priv_s
|
||||||
{
|
{
|
||||||
const struct stm32_1wire_config_s *config; /* Port configuration */
|
const struct stm32_1wire_config_s *config; /* Port configuration */
|
||||||
volatile int refs; /* Referernce count */
|
volatile int refs; /* Referernce count */
|
||||||
sem_t sem_excl; /* Mutual exclusion semaphore */
|
sem_t sem_excl; /* Mutual exclusion semaphore */
|
||||||
sem_t sem_isr; /* Interrupt wait semaphore */
|
sem_t sem_isr; /* Interrupt wait semaphore */
|
||||||
int baud; /* Baud rate */
|
int baud; /* Baud rate */
|
||||||
const struct stm32_1wire_msg_s *msgs; /* Messages data */
|
const struct stm32_1wire_msg_s *msgs; /* Messages data */
|
||||||
uint8_t *byte; /* Current byte */
|
uint8_t *byte; /* Current byte */
|
||||||
uint8_t bit; /* Current bit */
|
uint8_t bit; /* Current bit */
|
||||||
volatile int result; /* Exchange result */
|
volatile int result; /* Exchange result */
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
struct pm_callback_s pm_cb; /* PM callbacks */
|
struct pm_callback_s pm_cb; /* PM callbacks */
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -159,8 +159,9 @@ static void stm32_1wire_set_apb_clock(struct stm32_1wire_priv_s *priv,
|
|||||||
static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv);
|
static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static int stm32_1wire_deinit(FAR struct stm32_1wire_priv_s *priv);
|
static int stm32_1wire_deinit(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static inline void stm32_1wire_sem_init(FAR struct stm32_1wire_priv_s *priv);
|
static inline void stm32_1wire_sem_init(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static inline void stm32_1wire_sem_destroy(FAR struct stm32_1wire_priv_s *priv);
|
static inline void stm32_1wire_sem_destroy(
|
||||||
static inline void stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv);
|
FAR struct stm32_1wire_priv_s *priv);
|
||||||
|
static inline int stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static inline void stm32_1wire_sem_post(FAR struct stm32_1wire_priv_s *priv);
|
static inline void stm32_1wire_sem_post(FAR struct stm32_1wire_priv_s *priv);
|
||||||
static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
||||||
FAR const struct stm32_1wire_msg_s *msgs,
|
FAR const struct stm32_1wire_msg_s *msgs,
|
||||||
@@ -174,7 +175,8 @@ static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer,
|
|||||||
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
||||||
const uint8_t *txbuffer, int txbuflen,
|
const uint8_t *txbuffer, int txbuflen,
|
||||||
uint8_t *rxbuffer, int rxbuflen);
|
uint8_t *rxbuffer, int rxbuflen);
|
||||||
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev, const uint8_t *bit);
|
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev,
|
||||||
|
const uint8_t *bit);
|
||||||
static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit);
|
static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit);
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
||||||
@@ -397,7 +399,8 @@ static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv)
|
|||||||
* usartdiv8 = 2 * fCK / baud
|
* usartdiv8 = 2 * fCK / baud
|
||||||
*/
|
*/
|
||||||
|
|
||||||
usartdiv8 = ((priv->config->apbclock << 1) + (priv->baud >> 1)) / priv->baud;
|
usartdiv8 = ((priv->config->apbclock << 1) + (priv->baud >> 1)) /
|
||||||
|
priv->baud;
|
||||||
|
|
||||||
/* Baud rate for standard USART (SPI mode included):
|
/* Baud rate for standard USART (SPI mode included):
|
||||||
*
|
*
|
||||||
@@ -432,13 +435,13 @@ static void stm32_1wire_set_baud(struct stm32_1wire_priv_s *priv)
|
|||||||
cr1 |= USART_CR1_OVER8;
|
cr1 |= USART_CR1_OVER8;
|
||||||
}
|
}
|
||||||
|
|
||||||
stm32_1wire_out(priv, STM32L4_USART_CR1_OFFSET, cr1);
|
stm32_1wire_out(priv, STM32L4_USART_CR1_OFFSET, cr1);
|
||||||
stm32_1wire_out(priv, STM32L4_USART_BRR_OFFSET, brr);
|
stm32_1wire_out(priv, STM32L4_USART_BRR_OFFSET, brr);
|
||||||
|
|
||||||
if (enabled)
|
if (enabled)
|
||||||
{
|
{
|
||||||
stm32_1wire_out(priv, STM32L4_USART_CR1_OFFSET, cr1 | USART_CR1_UE);
|
stm32_1wire_out(priv, STM32L4_USART_CR1_OFFSET, cr1 | USART_CR1_UE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -533,9 +536,10 @@ static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
|
|
||||||
stm32_1wire_set_apb_clock(priv, true);
|
stm32_1wire_set_apb_clock(priv, true);
|
||||||
|
|
||||||
/* Configure CR2 */
|
/* Configure CR2
|
||||||
/* Clear STOP, CLKEN, CPOL, CPHA, LBCL, and interrupt enable bits */
|
* Clear STOP, CLKEN, CPOL, CPHA, LBCL, and interrupt enable bits
|
||||||
/* Set LBDIE */
|
* Set LBDIE
|
||||||
|
*/
|
||||||
|
|
||||||
regval = stm32_1wire_in(priv, STM32L4_USART_CR2_OFFSET);
|
regval = stm32_1wire_in(priv, STM32L4_USART_CR2_OFFSET);
|
||||||
regval &= ~(USART_CR2_STOP_MASK | USART_CR2_CLKEN | USART_CR2_CPOL |
|
regval &= ~(USART_CR2_STOP_MASK | USART_CR2_CLKEN | USART_CR2_CPOL |
|
||||||
@@ -543,9 +547,10 @@ static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
regval |= USART_CR2_LBDIE;
|
regval |= USART_CR2_LBDIE;
|
||||||
stm32_1wire_out(priv, STM32L4_USART_CR2_OFFSET, regval);
|
stm32_1wire_out(priv, STM32L4_USART_CR2_OFFSET, regval);
|
||||||
|
|
||||||
/* Configure CR1 */
|
/* Configure CR1
|
||||||
/* Clear TE, REm, all interrupt enable bits, PCE, PS and M */
|
* Clear TE, REm, all interrupt enable bits, PCE, PS and M
|
||||||
/* Set RXNEIE */
|
* Set RXNEIE
|
||||||
|
*/
|
||||||
|
|
||||||
regval = stm32_1wire_in(priv, STM32L4_USART_CR1_OFFSET);
|
regval = stm32_1wire_in(priv, STM32L4_USART_CR1_OFFSET);
|
||||||
regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_ALLINTS |
|
regval &= ~(USART_CR1_TE | USART_CR1_RE | USART_CR1_ALLINTS |
|
||||||
@@ -553,12 +558,14 @@ static int stm32_1wire_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
regval |= USART_CR1_RXNEIE;
|
regval |= USART_CR1_RXNEIE;
|
||||||
stm32_1wire_out(priv, STM32L4_USART_CR1_OFFSET, regval);
|
stm32_1wire_out(priv, STM32L4_USART_CR1_OFFSET, regval);
|
||||||
|
|
||||||
/* Configure CR3 */
|
/* Configure CR3
|
||||||
/* Clear CTSE, RTSE, and all interrupt enable bits */
|
* Clear CTSE, RTSE, and all interrupt enable bits
|
||||||
/* Set ONEBIT, HDSEL and EIE */
|
* Set ONEBIT, HDSEL and EIE
|
||||||
|
*/
|
||||||
|
|
||||||
regval = stm32_1wire_in(priv, STM32L4_USART_CR3_OFFSET);
|
regval = stm32_1wire_in(priv, STM32L4_USART_CR3_OFFSET);
|
||||||
regval &= ~(USART_CR3_CTSIE | USART_CR3_CTSE | USART_CR3_RTSE | USART_CR3_EIE);
|
regval &= ~(USART_CR3_CTSIE | USART_CR3_CTSE | USART_CR3_RTSE |
|
||||||
|
USART_CR3_EIE);
|
||||||
regval |= (USART_CR3_ONEBIT | USART_CR3_HDSEL | USART_CR3_EIE);
|
regval |= (USART_CR3_ONEBIT | USART_CR3_HDSEL | USART_CR3_EIE);
|
||||||
stm32_1wire_out(priv, STM32L4_USART_CR3_OFFSET, regval);
|
stm32_1wire_out(priv, STM32L4_USART_CR3_OFFSET, regval);
|
||||||
|
|
||||||
@@ -659,7 +666,8 @@ static inline void stm32_1wire_sem_init(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void stm32_1wire_sem_destroy(FAR struct stm32_1wire_priv_s *priv)
|
static inline void stm32_1wire_sem_destroy(
|
||||||
|
FAR struct stm32_1wire_priv_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_destroy(&priv->sem_excl);
|
nxsem_destroy(&priv->sem_excl);
|
||||||
nxsem_destroy(&priv->sem_isr);
|
nxsem_destroy(&priv->sem_isr);
|
||||||
@@ -673,9 +681,9 @@ static inline void stm32_1wire_sem_destroy(FAR struct stm32_1wire_priv_s *priv)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static inline void stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv)
|
static int void stm32_1wire_sem_wait(FAR struct stm32_1wire_priv_s *priv)
|
||||||
{
|
{
|
||||||
nxsem_wait_uninterruptible(&priv->sem_excl);
|
return nxsem_wait_uninterruptible(&priv->sem_excl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -709,7 +717,11 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
|
|
||||||
/* Lock out other clients */
|
/* Lock out other clients */
|
||||||
|
|
||||||
stm32_1wire_sem_wait(priv);
|
ret = stm32_1wire_sem_wait(priv);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
priv->result = ERROR;
|
priv->result = ERROR;
|
||||||
|
|
||||||
@@ -722,6 +734,7 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case ONEWIRETASK_RESET:
|
case ONEWIRETASK_RESET:
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
|
|
||||||
priv->baud = RESET_BAUD;
|
priv->baud = RESET_BAUD;
|
||||||
@@ -743,6 +756,7 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
|
|
||||||
case ONEWIRETASK_WRITE:
|
case ONEWIRETASK_WRITE:
|
||||||
case ONEWIRETASK_WRITEBIT:
|
case ONEWIRETASK_WRITEBIT:
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
|
|
||||||
priv->baud = TIMESLOT_BAUD;
|
priv->baud = TIMESLOT_BAUD;
|
||||||
@@ -754,7 +768,8 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
priv->msgs = &msgs[indx];
|
priv->msgs = &msgs[indx];
|
||||||
priv->byte = priv->msgs->buffer;
|
priv->byte = priv->msgs->buffer;
|
||||||
priv->bit = 0;
|
priv->bit = 0;
|
||||||
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ? WRITE_TX1 : WRITE_TX0);
|
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ?
|
||||||
|
WRITE_TX1 : WRITE_TX0);
|
||||||
leave_critical_section(irqs);
|
leave_critical_section(irqs);
|
||||||
|
|
||||||
/* Wait. Break on timeout if TX line closed to GND */
|
/* Wait. Break on timeout if TX line closed to GND */
|
||||||
@@ -766,6 +781,7 @@ static int stm32_1wire_process(struct stm32_1wire_priv_s *priv,
|
|||||||
|
|
||||||
case ONEWIRETASK_READ:
|
case ONEWIRETASK_READ:
|
||||||
case ONEWIRETASK_READBIT:
|
case ONEWIRETASK_READBIT:
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
|
|
||||||
priv->baud = TIMESLOT_BAUD;
|
priv->baud = TIMESLOT_BAUD;
|
||||||
@@ -850,7 +866,11 @@ static int stm32_1wire_isr(int irq, void *context, void *arg)
|
|||||||
if (++priv->bit >= 8)
|
if (++priv->bit >= 8)
|
||||||
{
|
{
|
||||||
priv->bit = 0;
|
priv->bit = 0;
|
||||||
if (++priv->byte >= (priv->msgs->buffer + priv->msgs->buflen)) /* Done? */
|
|
||||||
|
/* Done? */
|
||||||
|
|
||||||
|
if (++priv->byte >=
|
||||||
|
(priv->msgs->buffer + priv->msgs->buflen))
|
||||||
{
|
{
|
||||||
priv->msgs = NULL;
|
priv->msgs = NULL;
|
||||||
priv->result = OK;
|
priv->result = OK;
|
||||||
@@ -861,7 +881,8 @@ static int stm32_1wire_isr(int irq, void *context, void *arg)
|
|||||||
|
|
||||||
/* Send next bit */
|
/* Send next bit */
|
||||||
|
|
||||||
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ? WRITE_TX1 : WRITE_TX0);
|
stm32_1wire_send(priv, (*priv->byte & (1 << priv->bit)) ?
|
||||||
|
WRITE_TX1 : WRITE_TX0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ONEWIRETASK_READ:
|
case ONEWIRETASK_READ:
|
||||||
@@ -968,8 +989,9 @@ static int stm32_1wire_reset(FAR struct onewire_dev_s *dev)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_write(FAR struct onewire_dev_s *dev, const uint8_t *buffer,
|
static int stm32_1wire_write(FAR struct onewire_dev_s *dev,
|
||||||
int buflen)
|
const uint8_t *buffer,
|
||||||
|
int buflen)
|
||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
const struct stm32_1wire_msg_s msgs[1] =
|
const struct stm32_1wire_msg_s msgs[1] =
|
||||||
@@ -990,7 +1012,8 @@ static int stm32_1wire_write(FAR struct onewire_dev_s *dev, const uint8_t *buffe
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer, int buflen)
|
static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer,
|
||||||
|
int buflen)
|
||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
const struct stm32_1wire_msg_s msgs[1] =
|
const struct stm32_1wire_msg_s msgs[1] =
|
||||||
@@ -1016,7 +1039,6 @@ static int stm32_1wire_read(FAR struct onewire_dev_s *dev, uint8_t *buffer, int
|
|||||||
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
||||||
FAR const uint8_t *txbuffer, int txbuflen,
|
FAR const uint8_t *txbuffer, int txbuflen,
|
||||||
FAR uint8_t *rxbuffer, int rxbuflen)
|
FAR uint8_t *rxbuffer, int rxbuflen)
|
||||||
|
|
||||||
{
|
{
|
||||||
int result = ERROR;
|
int result = ERROR;
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
@@ -1053,6 +1075,7 @@ static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
|||||||
|
|
||||||
result = stm32_1wire_process(priv, msgs, 2);
|
result = stm32_1wire_process(priv, msgs, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1064,7 +1087,8 @@ static int stm32_1wire_exchange(FAR struct onewire_dev_s *dev, bool reset,
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev, const uint8_t *bit)
|
static int stm32_1wire_writebit(FAR struct onewire_dev_s *dev,
|
||||||
|
const uint8_t *bit)
|
||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
struct stm32_1wire_priv_s *priv = ((struct stm32_1wire_inst_s *)dev)->priv;
|
||||||
const struct stm32_1wire_msg_s msgs[1] =
|
const struct stm32_1wire_msg_s msgs[1] =
|
||||||
@@ -1100,7 +1124,7 @@ static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit)
|
|||||||
return stm32_1wire_process(priv, msgs, 1);
|
return stm32_1wire_process(priv, msgs, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************************
|
/****************************************************************************
|
||||||
* Name: stm32_1wire_pm_prepare
|
* Name: stm32_1wire_pm_prepare
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
@@ -1127,7 +1151,7 @@ static int stm32_1wire_readbit(FAR struct onewire_dev_s *dev, uint8_t *bit)
|
|||||||
* power state change). Drivers are not permitted to return non-zero
|
* power state change). Drivers are not permitted to return non-zero
|
||||||
* values when reverting back to higher power consumption modes!
|
* values when reverting back to higher power consumption modes!
|
||||||
*
|
*
|
||||||
************************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
||||||
@@ -1135,7 +1159,7 @@ static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
|||||||
{
|
{
|
||||||
struct stm32_1wire_priv_s *priv =
|
struct stm32_1wire_priv_s *priv =
|
||||||
(struct stm32_1wire_priv_s *)((char *)cb -
|
(struct stm32_1wire_priv_s *)((char *)cb -
|
||||||
offsetof(struct stm32_1wire_priv_s, pm_cb));
|
offsetof(struct stm32_1wire_priv_s, pm_cb));
|
||||||
int sval;
|
int sval;
|
||||||
|
|
||||||
/* Logic to prepare for a reduced power state goes here. */
|
/* Logic to prepare for a reduced power state goes here. */
|
||||||
@@ -1148,6 +1172,7 @@ static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
|||||||
|
|
||||||
case PM_STANDBY:
|
case PM_STANDBY:
|
||||||
case PM_SLEEP:
|
case PM_SLEEP:
|
||||||
|
|
||||||
/* Check if exclusive lock for 1-Wire bus is held. */
|
/* Check if exclusive lock for 1-Wire bus is held. */
|
||||||
|
|
||||||
if (nxsem_getvalue(&priv->sem_excl, &sval) < 0)
|
if (nxsem_getvalue(&priv->sem_excl, &sval) < 0)
|
||||||
@@ -1166,6 +1191,7 @@ static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
/* Should not get here */
|
/* Should not get here */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -1183,7 +1209,7 @@ static int stm32_1wire_pm_prepare(FAR struct pm_callback_s *cb, int domain,
|
|||||||
* Name: stm32l4_1wireinitialize
|
* Name: stm32l4_1wireinitialize
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Initialize the selected 1-Wire port. And return a unique instance of struct
|
* Initialize the selected 1-Wire port. And return a unique instance of
|
||||||
* struct onewire_dev_s. This function may be called to obtain multiple
|
* struct onewire_dev_s. This function may be called to obtain multiple
|
||||||
* instances of the interface, each of which may be set up with a
|
* instances of the interface, each of which may be set up with a
|
||||||
* different frequency and slave address.
|
* different frequency and slave address.
|
||||||
|
|||||||
Reference in New Issue
Block a user