PX4IO_serial::PX4IO_serial() : Device("PX4IO_serial"), _tx_dma(nullptr), _rx_dma(nullptr), _rx_dma_status(_dma_status_inactive), _bus_semaphore(SEM_INITIALIZER(0)), _completion_semaphore(SEM_INITIALIZER(0)), _pc_txns(perf_alloc(PC_ELAPSED, "io_txns ")), _pc_dmasetup(perf_alloc(PC_ELAPSED, "io_dmasetup ")), _pc_retries(perf_alloc(PC_COUNT, "io_retries ")), _pc_timeouts(perf_alloc(PC_COUNT, "io_timeouts ")), _pc_crcerrs(perf_alloc(PC_COUNT, "io_crcerrs ")), _pc_dmaerrs(perf_alloc(PC_COUNT, "io_dmaerrs ")), _pc_protoerrs(perf_alloc(PC_COUNT, "io_protoerrs")), _pc_uerrs(perf_alloc(PC_COUNT, "io_uarterrs ")), _pc_idle(perf_alloc(PC_COUNT, "io_idle ")), _pc_badidle(perf_alloc(PC_COUNT, "io_badidle ")) { g_interface = this; }
#include <nuttx/config.h> #include <string.h> #include <semaphore.h> #include <debug.h> #include <errno.h> #include <nuttx/module.h> #include "module.h" /**************************************************************************** * Private Data ****************************************************************************/ static sem_t g_mod_lock = SEM_INITIALIZER(1); static FAR struct module_s *g_mod_registry; /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * Name: mod_registry_lock * * Description: * Get exclusive access to the module registry. * * Input Parameters: * None *
#if defined(CONFIG_RAMLOG_CONSOLE) || defined(CONFIG_RAMLOG_SYSLOG) static char g_sysbuffer[CONFIG_RAMLOG_BUFSIZE]; /* This is the device structure for the console or syslogging function. It * must be statically initialized because the RAMLOG syslog_putc function * could be called before the driver initialization logic executes. */ static struct ramlog_dev_s g_sysdev = { #ifndef CONFIG_RAMLOG_NONBLOCKING 0, /* rl_nwaiters */ #endif 0, /* rl_head */ 0, /* rl_tail */ SEM_INITIALIZER(1), /* rl_exclsem */ #ifndef CONFIG_RAMLOG_NONBLOCKING SEM_INITIALIZER(0), /* rl_waitsem */ #endif CONFIG_RAMLOG_BUFSIZE, /* rl_bufsize */ g_sysbuffer /* rl_buffer */ }; #endif /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: ramlog_pollnotify ****************************************************************************/
#include <semaphore.h> #include <fcntl.h> #include <spawn.h> #include <debug.h> #include <nuttx/spawn.h> #include "task/spawn.h" #include "task/task.h" /**************************************************************************** * Public Data ****************************************************************************/ sem_t g_spawn_parmsem = SEM_INITIALIZER(1); #ifndef CONFIG_SCHED_WAITPID sem_t g_spawn_execsem = SEM_INITIALIZER(0); #endif struct spawn_parms_s g_spawn_parms; /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: spawn_close, spawn_dup2, and spawn_open * * Description: * Implement individual file actions *
#include <errno.h> #include <assert.h> #include <debug.h> #include <nuttx/kmalloc.h> #include <nuttx/drivers/drivers.h> #if !defined(CONFIG_DISABLE_MOUNTPOINT) && \ !defined(CONFIG_DISABLE_PSEUDOFS_OPERATIONS) /**************************************************************************** * Private Data ****************************************************************************/ static uint32_t g_devno; static sem_t g_devno_sem = SEM_INITIALIZER(1); /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: unique_chardev * * Description: * Create a unique temporary device name in the /dev/ directory of the * psuedo-file system. We cannot use mktemp for this because it will * attempt to open() the file. * * Input Parameters: * None
/**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #define SDIF0_BASE (0x4004A000) #define SDIF1_BASE (0x4004B000) #define DET_TIME (10000) /* 10ms */ /**************************************************************************** * Private Data ****************************************************************************/ static sem_t _sdc_sem[2] = { SEM_INITIALIZER(1), SEM_INITIALIZER(1) }; static struct SdDrCfg_s _sdch0; static struct SdDrCfg_s _sdch1; static struct SdDrCfg_s *_cfg[2] = { &_sdch0, &_sdch1 }; static unsigned long _work0[512/4]; #ifdef CONFIG_LC823450_SDIF_SDC static unsigned long _work1[512/4];
{ pipecommon_open, /* open */ pipe_close, /* close */ pipecommon_read, /* read */ pipecommon_write, /* write */ 0, /* seek */ pipecommon_ioctl, /* ioctl */ #ifndef CONFIG_DISABLE_POLL pipecommon_poll, /* poll */ #endif #ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS pipecommon_unlink /* unlink */ #endif }; static sem_t g_pipesem = SEM_INITIALIZER(1); static uint32_t g_pipeset = 0; static uint32_t g_pipecreated = 0; /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: pipe_allocate ****************************************************************************/ static inline int pipe_allocate(void) { int pipeno; int ret = -ENFILE;
{ .lock = spi_lock, .select = spi_select, .setfrequency = spi_setfrequency, .status = spi_status, #ifdef CONFIG_SPI_CMDDATA .cmddata = spi_cmddata, #endif .send = spi_send, .sndblock = spi_sndblock, .recvblock = spi_recvblock, .registercallback = 0, /* Not implemented */ }; static struct spi_dev_s g_spidev = {&g_spiops}; static sem_t g_exclsem = SEM_INITIALIZER(1); /* For mutually exclusive access */ /**************************************************************************** * Public Data ****************************************************************************/ /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: spi_lock * * Description: * On SPI busses where there are multiple devices, it will be necessary to * lock SPI to have exclusive access to the busses for a sequence of
PX4IO_serial_f7::PX4IO_serial_f7() : _tx_dma(nullptr), _rx_dma(nullptr), _current_packet(nullptr), _rx_dma_status(_dma_status_inactive), _completion_semaphore(SEM_INITIALIZER(0)), #if 0 _pc_dmasetup(perf_alloc(PC_ELAPSED, "io_dmasetup ")), _pc_dmaerrs(perf_alloc(PC_COUNT, "io_dmaerrs ")) #else _pc_dmasetup(nullptr), _pc_dmaerrs(nullptr) #endif { } PX4IO_serial_f7::~PX4IO_serial_f7() { if (_tx_dma != nullptr) { stm32_dmastop(_tx_dma); stm32_dmafree(_tx_dma); } if (_rx_dma != nullptr) { stm32_dmastop(_rx_dma); stm32_dmafree(_rx_dma); } /* reset the UART */ rCR1 = 0; rCR2 = 0; rCR3 = 0; /* detach our interrupt handler */ up_disable_irq(PX4IO_SERIAL_VECTOR); irq_detach(PX4IO_SERIAL_VECTOR); /* restore the GPIOs */ px4_arch_unconfiggpio(PX4IO_SERIAL_TX_GPIO); px4_arch_unconfiggpio(PX4IO_SERIAL_RX_GPIO); /* Disable APB clock for the USART peripheral */ modifyreg32(PX4IO_SERIAL_RCC_REG, PX4IO_SERIAL_RCC_EN, 0); /* and kill our semaphores */ px4_sem_destroy(&_completion_semaphore); perf_free(_pc_dmasetup); perf_free(_pc_dmaerrs); } int PX4IO_serial_f7::init() { /* initialize base implementation */ int r; if ((r = PX4IO_serial::init((IOPacket *)ROUND_UP_TO_POW2_CT((uintptr_t)_io_buffer_storage, CACHE_LINE_SIZE))) != 0) { return r; } /* allocate DMA */ _tx_dma = stm32_dmachannel(PX4IO_SERIAL_TX_DMAMAP); _rx_dma = stm32_dmachannel(PX4IO_SERIAL_RX_DMAMAP); if ((_tx_dma == nullptr) || (_rx_dma == nullptr)) { return -1; } /* Enable the APB clock for the USART peripheral */ modifyreg32(PX4IO_SERIAL_RCC_REG, 0, PX4IO_SERIAL_RCC_EN); /* configure pins for serial use */ px4_arch_configgpio(PX4IO_SERIAL_TX_GPIO); px4_arch_configgpio(PX4IO_SERIAL_RX_GPIO); /* reset & configure the UART */ rCR1 = 0; rCR2 = 0; rCR3 = 0; /* clear data that may be in the RDR and clear overrun error: */ if (rISR & USART_ISR_RXNE) { (void)rRDR; } rICR = rISR & rISR_ERR_FLAGS_MASK; /* clear the flags */ /* configure line speed */ uint32_t usartdiv32 = (PX4IO_SERIAL_CLOCK + (PX4IO_SERIAL_BITRATE) / 2) / (PX4IO_SERIAL_BITRATE); rBRR = usartdiv32; /* attach serial interrupt handler */ irq_attach(PX4IO_SERIAL_VECTOR, _interrupt, this); up_enable_irq(PX4IO_SERIAL_VECTOR); /* enable UART in DMA mode, enable error and line idle interrupts */ rCR3 = USART_CR3_EIE; /* TODO: maybe use DDRE */ rCR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE | USART_CR1_IDLEIE; /* TODO: maybe we need to adhere to the procedure as described in the reference manual page 1251 (34.5.2) */ /* create semaphores */ px4_sem_init(&_completion_semaphore, 0, 0); /* _completion_semaphore use case is a signal */ px4_sem_setprotocol(&_completion_semaphore, SEM_PRIO_NONE); /* XXX this could try talking to IO */ return 0; }
PX4IO_serial_f4::PX4IO_serial_f4() : _tx_dma(nullptr), _rx_dma(nullptr), _current_packet(nullptr), _rx_dma_status(_dma_status_inactive), _completion_semaphore(SEM_INITIALIZER(0)), #if 0 _pc_dmasetup(perf_alloc(PC_ELAPSED, "io_dmasetup ")), _pc_dmaerrs(perf_alloc(PC_COUNT, "io_dmaerrs ")) #else _pc_dmasetup(nullptr), _pc_dmaerrs(nullptr) #endif { } PX4IO_serial_f4::~PX4IO_serial_f4() { if (_tx_dma != nullptr) { stm32_dmastop(_tx_dma); stm32_dmafree(_tx_dma); } if (_rx_dma != nullptr) { stm32_dmastop(_rx_dma); stm32_dmafree(_rx_dma); } /* reset the UART */ rCR1 = 0; rCR2 = 0; rCR3 = 0; /* detach our interrupt handler */ up_disable_irq(PX4IO_SERIAL_VECTOR); irq_detach(PX4IO_SERIAL_VECTOR); /* restore the GPIOs */ px4_arch_unconfiggpio(PX4IO_SERIAL_TX_GPIO); px4_arch_unconfiggpio(PX4IO_SERIAL_RX_GPIO); /* Disable APB clock for the USART peripheral */ modifyreg32(PX4IO_SERIAL_RCC_REG, PX4IO_SERIAL_RCC_EN, 0); /* and kill our semaphores */ px4_sem_destroy(&_completion_semaphore); perf_free(_pc_dmasetup); perf_free(_pc_dmaerrs); } int PX4IO_serial_f4::init() { /* initialize base implementation */ int r; if ((r = PX4IO_serial::init(&_io_buffer_storage)) != 0) { return r; } /* allocate DMA */ _tx_dma = stm32_dmachannel(PX4IO_SERIAL_TX_DMAMAP); _rx_dma = stm32_dmachannel(PX4IO_SERIAL_RX_DMAMAP); if ((_tx_dma == nullptr) || (_rx_dma == nullptr)) { return -1; } /* Enable the APB clock for the USART peripheral */ modifyreg32(PX4IO_SERIAL_RCC_REG, 0, PX4IO_SERIAL_RCC_EN); /* configure pins for serial use */ px4_arch_configgpio(PX4IO_SERIAL_TX_GPIO); px4_arch_configgpio(PX4IO_SERIAL_RX_GPIO); /* reset & configure the UART */ rCR1 = 0; rCR2 = 0; rCR3 = 0; /* eat any existing interrupt status */ (void)rSR; (void)rDR; /* configure line speed */ uint32_t usartdiv32 = PX4IO_SERIAL_CLOCK / (PX4IO_SERIAL_BITRATE / 2); uint32_t mantissa = usartdiv32 >> 5; uint32_t fraction = (usartdiv32 - (mantissa << 5) + 1) >> 1; rBRR = (mantissa << USART_BRR_MANT_SHIFT) | (fraction << USART_BRR_FRAC_SHIFT); /* attach serial interrupt handler */ irq_attach(PX4IO_SERIAL_VECTOR, _interrupt, this); up_enable_irq(PX4IO_SERIAL_VECTOR); /* enable UART in DMA mode, enable error and line idle interrupts */ rCR3 = USART_CR3_EIE; rCR1 = USART_CR1_RE | USART_CR1_TE | USART_CR1_UE | USART_CR1_IDLEIE; /* create semaphores */ px4_sem_init(&_completion_semaphore, 0, 0); /* _completion_semaphore use case is a signal */ px4_sem_setprotocol(&_completion_semaphore, SEM_PRIO_NONE); /* XXX this could try talking to IO */ return 0; }
/* 62**1 = 62 * 62**2 = 3844 * 62**3 = 238328 * 62**4 = 14776336 * 62**5 = 916132832 * 62**6 = 56800235584 > UINT32_MAX */ #define BIG_XS 5 /**************************************************************************** * Private Data ****************************************************************************/ static uint8_t g_base62[MAX_XS]; static sem_t g_b62sem = SEM_INITIALIZER(1); /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: base62_to_char * * Description: * Convert a base62 value to a printable character. * ****************************************************************************/ static char base62_to_char(uint8_t base62) {
FAR pid_t *pid; FAR const char *path; FAR const posix_spawn_file_actions_t *file_actions; FAR const posix_spawnattr_t *attr; FAR char *const *argv; }; /**************************************************************************** * Public Data ****************************************************************************/ /**************************************************************************** * Private Data ****************************************************************************/ static sem_t g_ps_parmsem = SEM_INITIALIZER(1); #ifndef CONFIG_SCHED_WAITPID static sem_t g_ps_execsem = SEM_INITIALIZER(0); #endif static struct spawn_parms_s g_ps_parms; /**************************************************************************** * Private Functions ****************************************************************************/ /**************************************************************************** * Name: spawn_semtake and spawn_semgive * * Description: * Give and take semaphores *
#include "vnc_server.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #undef VNCSERVER_SEM_DEBUG /* Define to dump queue/semaphore state */ #undef VNCSERVER_SEM_DEBUG_SILENT /* Define to dump only suspicious conditions */ /**************************************************************************** * Private Data ****************************************************************************/ #ifdef VNCSERVER_SEM_DEBUG static sem_t g_dbgsem = SEM_INITIALIZER(1); #endif /* A rectangle represent the entire local framebuffer */ static const struct nxgl_rect_s g_wholescreen = { { 0, 0 }, { CONFIG_VNCSERVER_SCREENWIDTH - 1, CONFIG_VNCSERVER_SCREENHEIGHT - 1 } };
NULL, /* pause */ NULL, /* resume */ #endif NULL, /* allocbuffer */ NULL, /* freebuffer */ NULL, /* enqueue_buffer */ NULL, /* cancel_buffer */ NULL, /* ioctl */ NULL, /* read */ NULL, /* write */ NULL, /* reserve */ NULL /* release */ }; static uint8_t chunk_buf[TFA9890_MAX_I2C_SIZE + 1]; static sem_t bulk_write_lock = SEM_INITIALIZER(1); #ifdef DEBUG static void tfa9890_dump_reg(FAR struct tfa9890_dev_s *priv, uint16_t reg) { int ret = tfa9890_reg_read(priv, reg); if (ret < 0) { lldbg("failed to read 0x%04x\n", reg); return; } lldbg("tfa9890 reg 0x%04x value 0x%04x\n", reg, ret); } static void tfa9890_dump_regs(FAR struct tfa9890_dev_s *priv) {
#define KXTJ9_G_8G (1 << 4) /* INTERRUPT CONTROL REGISTER 1 BITS */ /* Set these during probe if using irq mode */ #define KXTJ9_IEL (1 << 3) #define KXTJ9_IEA (1 << 4) #define KXTJ9_IEN (1 << 5) #define KXTJ9_SRST 0x80 #define WHO_AM_I_KXCJ9 0x0A #define KXTJ9_I2C_ADDR 0x0E #define ACCEL_NUM_RETRIES 5 #define KXTJ9_CTRL1_CONFIG (RES_12BIT | KXTJ9_G_2G | DRDYE) static sem_t sem = SEM_INITIALIZER(1); struct kxtj9_data { struct i2c_dev_s *i2c; bool enable; uint8_t shift; uint8_t ctrl_reg1; uint8_t data_ctrl; uint8_t int_ctrl; bool power_enabled; }; static FAR struct kxtj9_data *g_data; static void kxtj9_soft_reset(void); static void kxtj9_set_mode_standby(void);