示例#1
0
文件: stm32l4_rng.c 项目: a1ien/nuttx
static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen)
{
  if (sem_wait(&g_rngdev.rd_devsem) != OK)
    {
      return -errno;
    }
  else
    {
      /* We've got the device semaphore, proceed with reading */

      /* Initialize the operation semaphore with 0 for blocking until the
       * buffer is filled from interrupts.  The waitsem semaphore is used
       * for signaling and, hence, should not have priority inheritance
       * enabled.
       */

      sem_init(&g_rngdev.rd_readsem, 0, 0);
      sem_setprotocol(&g_rngdev.rd_readsem, SEM_PRIO_NONE);

      g_rngdev.rd_buflen = buflen;
      g_rngdev.rd_buf = buffer;

      /* Enable RNG with interrupts */

      stm32l4_rngenable();

      /* Wait until the buffer is filled */

      sem_wait(&g_rngdev.rd_readsem);

      /* Done with the operation semaphore */

      sem_destroy(&g_rngdev.rd_readsem);

      /* Free RNG via the device semaphore for next use */

      sem_post(&g_rngdev.rd_devsem);

      return buflen;
    }
}
示例#2
0
static ssize_t stm32l4_rngread(struct file *filep, char *buffer, size_t buflen)
{
  if (sem_wait(&g_rngdev.rd_devsem) != OK)
    {
      return -errno;
    }
  else
    {
      /* We've got the device semaphore, proceed with reading */

      /* Initialize the operation semaphore with 0 for blocking until
       * the buffer is filled from interrupts.
       */

      sem_init(&g_rngdev.rd_readsem, 0, 0);

      g_rngdev.rd_buflen = buflen;
      g_rngdev.rd_buf = buffer;

      /* Enable RNG with interrupts */

      stm32l4_rngenable();

      /* Wait until the buffer is filled */

      sem_wait(&g_rngdev.rd_readsem);

      /* Done with the operation semaphore */

      sem_destroy(&g_rngdev.rd_readsem);

      /* Free RNG via the device semaphore for next use */

      sem_post(&g_rngdev.rd_devsem);

      return buflen;
    }
}