Hello, I wrote spidev driver for stm32l4 mcu.
spi_trasfer function looks like: static int spi_transfer( spi_bus *base, const spi_ioc_transfer *msgs, uint32_t msg_count) { struct stm32l4_spi_bus *bus = (struct stm32l4_spi_bus *)base; SPI_TypeDef *spix = (SPI_TypeDef *)bus->driver.spix; enum spi_major_num num = get_spi_major_number(spix); bus->msg = &msgs[0]; spi_bus_table[num] = bus; spi_bus_table[num]->msg_count = msg_count; spi_bus_table[num]->messages_left = msg_count; int msg_error = spi_setup_trasfer( spi_bus_table[num], spi_bus_table[num]->msg, spi_bus_table[num]->messages_left); rtems_binary_semaphore_wait(&bus->sem); return (msg_error == 0)? 0 : -EINVAL; } Transmission proceeded via SPI IRQ + DMA IRQ. In DMA IRQ handler after dma successfully transmitted all data I'm using rtems_binary_semaphore_post for corresponding semaphore. bool bus_is_broken = (bus == NULL) || (msg_count < bus->messages_left) || (msg_count == 0); int ret = 0; if(bus_is_broken == true) { return -EINVAL; } if(msgs->cs_change == true) { spi_css_deselect(&bus->driver); } if(bus->messages_left > 0) { const size_t msg_idx = msg_count - bus->messages_left; ret = spi_do_transfer(bus, msgs, msg_idx); bus->messages_left--; if(ret != 0) { rtems_binary_semaphore_post(&bus->sem); return ret; } } else { rtems_binary_semaphore_post(&bus->sem); } return ret; Currently I see that semaphore was successfully posted but control was not returned to spi_transfer. As I know there are can be some issues with a context switching. Does rtems_binary_semaphore_post know about where control should be returned? Thanks. -- -- Kind regards, *Yaroslav Leshchinsky*
_______________________________________________ users mailing list users@rtems.org http://lists.rtems.org/mailman/listinfo/users