mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-11-30 08:24:11 +01:00
5f8760a55c
This allows the spektrum and sbus receiver drivers to bind directly to the usart layer using a properly exported API rather than overriding the interrupt handler. Bytes are now pushed directly from the usart layer into the com layer without any buffering. The com layer performs all of the buffering. A further benefit from this approach is that we can put all blocking/non-blocking behaviour into the COM layer and not in the underlying drivers. Misc related changes: - Remove obsolete .handler field from irq configs - Adapt all users of PIOS_COM_* functions to new API - Fixup callers of PIOS_USB_HID_Init()
99 lines
2.0 KiB
C
99 lines
2.0 KiB
C
/* Project Includes */
|
|
#include "pios.h"
|
|
|
|
#if defined(PIOS_INCLUDE_RCVR)
|
|
|
|
#include <pios_rcvr_priv.h>
|
|
|
|
enum pios_rcvr_dev_magic {
|
|
PIOS_RCVR_DEV_MAGIC = 0x99aabbcc,
|
|
};
|
|
|
|
struct pios_rcvr_dev {
|
|
enum pios_rcvr_dev_magic magic;
|
|
uint32_t lower_id;
|
|
const struct pios_rcvr_driver * driver;
|
|
};
|
|
|
|
static bool PIOS_RCVR_validate(struct pios_rcvr_dev * rcvr_dev)
|
|
{
|
|
return (rcvr_dev->magic == PIOS_RCVR_DEV_MAGIC);
|
|
}
|
|
|
|
#if defined(PIOS_INCLUDE_FREERTOS) && 0
|
|
static struct pios_rcvr_dev * PIOS_RCVR_alloc(void)
|
|
{
|
|
struct pios_rcvr_dev * rcvr_dev;
|
|
|
|
rcvr_dev = (struct pios_rcvr_dev *)malloc(sizeof(*rcvr_dev));
|
|
if (!rcvr_dev) return (NULL);
|
|
|
|
rcvr_dev->magic = PIOS_RCVR_DEV_MAGIC;
|
|
return(rcvr_dev);
|
|
}
|
|
#else
|
|
static struct pios_rcvr_dev pios_rcvr_devs[PIOS_RCVR_MAX_DEVS];
|
|
static uint8_t pios_rcvr_num_devs;
|
|
static struct pios_rcvr_dev * PIOS_RCVR_alloc(void)
|
|
{
|
|
struct pios_rcvr_dev * rcvr_dev;
|
|
|
|
if (pios_rcvr_num_devs >= PIOS_RCVR_MAX_DEVS) {
|
|
return (NULL);
|
|
}
|
|
|
|
rcvr_dev = &pios_rcvr_devs[pios_rcvr_num_devs++];
|
|
rcvr_dev->magic = PIOS_RCVR_DEV_MAGIC;
|
|
|
|
return (rcvr_dev);
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* Initialises RCVR layer
|
|
* \param[out] handle
|
|
* \param[in] driver
|
|
* \param[in] id
|
|
* \return < 0 if initialisation failed
|
|
*/
|
|
int32_t PIOS_RCVR_Init(uint32_t * rcvr_id, const struct pios_rcvr_driver * driver, uint32_t lower_id)
|
|
{
|
|
PIOS_DEBUG_Assert(rcvr_id);
|
|
PIOS_DEBUG_Assert(driver);
|
|
|
|
struct pios_rcvr_dev * rcvr_dev;
|
|
|
|
rcvr_dev = (struct pios_rcvr_dev *) PIOS_RCVR_alloc();
|
|
if (!rcvr_dev) goto out_fail;
|
|
|
|
rcvr_dev->driver = driver;
|
|
rcvr_dev->lower_id = lower_id;
|
|
|
|
*rcvr_id = (uint32_t)rcvr_dev;
|
|
return(0);
|
|
|
|
out_fail:
|
|
return(-1);
|
|
}
|
|
|
|
int32_t PIOS_RCVR_Read(uint32_t rcvr_id, uint8_t channel)
|
|
{
|
|
struct pios_rcvr_dev * rcvr_dev = (struct pios_rcvr_dev *)rcvr_id;
|
|
|
|
if (!PIOS_RCVR_validate(rcvr_dev)) {
|
|
/* Undefined RCVR port for this board (see pios_board.c) */
|
|
PIOS_Assert(0);
|
|
}
|
|
|
|
PIOS_DEBUG_Assert(rcvr_dev->driver->read);
|
|
|
|
return rcvr_dev->driver->read(rcvr_dev->lower_id, channel);
|
|
}
|
|
|
|
#endif
|
|
|
|
/**
|
|
* @}
|
|
* @}
|
|
*/
|