示例#1
0
/****************************************************************************
 *
 * NAME:       bAppQApiInit
 *
 * DESCRIPTION:
 * Initialised the Application Queue API, Application API and stack. Creates
 * the queues used for passing information up to the application and fills
 * the 'spare buffers' queues with the spare buffer entries. Also registers
 * the callback handlers with the Application API layer so all upward
 * information comes through this module.
 *
 * PARAMETERS: Name            RW  Usage
 *             prMlmeCallback  R   Optional callback when MLME received
 *             prMcpsCallback  R   Optional callback when MCPS received
 *             prHwCallback    R   Optional callback when HW int received
 *
 * RETURNS:
 * TRUE if initialisation was successful
 *
 ****************************************************************************/
PUBLIC uint32 u32AppQApiInit(PR_QIND_CALLBACK prMlmeCallback,
                             PR_QMCPS_CALLBACK prMcpsCallback,
                             PR_HWQINT_CALLBACK prHwCallback)
{
    int i;

    /* Initialise 'spare buffers' queues and fill with spare buffers */
    vFifoInit(&sMlmeIndBufferQueue, apvMlmeIndBufferData, APP_MAX_MLME_IND);
    for (i = 0; i < APP_MAX_MLME_IND; i++)
    {
        bFifoPush(&sMlmeIndBufferQueue, (void *)&asMlmeIndBuffer[i]);
    }

    vFifoInit(&sMcpsIndBufferQueue, apvMcpsIndBufferData, APP_MAX_MCPS_IND);
    for (i = 0; i < APP_MAX_MCPS_IND; i++)
    {
        bFifoPush(&sMcpsIndBufferQueue, (void *)&asMcpsIndBuffer[i]);
    }

    vFifoInit(&sHwIndBufferQueue, apvHwIndBufferData, APP_MAX_HW_IND);
    for (i = 0; i < APP_MAX_HW_IND; i++)
    {
        bFifoPush(&sHwIndBufferQueue, (void *)&asHwIndBuffer[i]);
    }

    /* Initialise 'used buffers' queues */
    vFifoInit(&sMlmeIndQueue, apvMlmeIndData, APP_MAX_MLME_IND);
    vFifoInit(&sMcpsIndQueue, apvMcpsIndData, APP_MAX_MCPS_IND);
    vFifoInit(&sHwIndQueue,   apvHwIndData,   APP_MAX_HW_IND);

    /* Store callbacks */
    prAppMlmeCallback = prMlmeCallback;
    prAppMcpsCallback = prMcpsCallback;
    prAppHwCallback = prHwCallback;

    /* Register peripheral callbacks */
    vAHI_SysCtrlRegisterCallback(vAppQApiPostHwInt);
    vAHI_APRegisterCallback(vAppQApiPostHwInt);
#ifndef GDB
    vAHI_Uart0RegisterCallback(vAppQApiPostHwInt);
#endif
    vAHI_Uart1RegisterCallback(vAppQApiPostHwInt);
    vAHI_TickTimerInit(vAppQApiPostHwInt);
    vAHI_SpiRegisterCallback(vAppQApiPostHwInt);
    vAHI_SiRegisterCallback(vAppQApiPostHwInt);
    vAHI_Timer0RegisterCallback(vAppQApiPostHwInt);
    vAHI_Timer1RegisterCallback(vAppQApiPostHwInt);

    /* Register this layer with AppApi layer */
    return u32AppApiInit(psAppQApiGetMlmeBuffer, vAppQApiPostMlme, NULL,
                         psAppQApiGetMcpsBuffer, vAppQApiPostMcps, NULL);
}
示例#2
0
PROCESS_THREAD(i2c_process, ev, data)
{
  static size_t i;
#if (DEBUG==1)
  static u32_t i2c_ticks;
#endif

  PROCESS_BEGIN();

  vAHI_SiRegisterCallback(i2c_irq);
  vAHI_SiConfigure(true,true,I2C_400KHZ_FAST_MODE);

  while ((transaction=list_pop(transactions)))
  {
#if (DEBUG==1)
    printf("i2c: to 0x%x start, %d written, %d read\n",
           transaction->addr, transaction->wrlen, transaction->rdlen);
    i2c_ticks = u32AHI_TickTimerRead();
#endif

    if (transaction->wrlen) {
      /* send slave address, start condition */
      vAHI_SiWriteData8(transaction->addr);
      vAHI_SiSetCmdReg(E_AHI_SI_START_BIT,     E_AHI_SI_NO_STOP_BIT,
                       E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE,
                       E_AHI_SI_SEND_ACK,      E_AHI_SI_NO_IRQ_ACK);
      PROCESS_YIELD_UNTIL(ev==PROCESS_EVENT_POLL);
      if (i2c_status==FAIL) { /* we only test for ACK on the first byte! */
        if (transaction->cb) transaction->cb(false);
#if (DEBUG==1)
        printf("i2c: to 0x%x failed, %d written, %d read in %d ticks\n",
               transaction->addr, transaction->wrlen, transaction->rdlen,
               u32AHI_TickTimerRead() - i2c_ticks);
#endif
        continue;
      }
    }

    /* send wr data. If repeated_start and there is something to read, send no
     * stop condition, else send a stop condition on the last byte. */
    for (i=0; i<transaction->wrlen; i++) {
      vAHI_SiWriteData8(transaction->buf[i]);
      vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT,
                       (transaction->wrlen!=0) ? E_AHI_SI_NO_STOP_BIT : transaction->rdlen,
                       E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE,
                       E_AHI_SI_SEND_ACK,      E_AHI_SI_NO_IRQ_ACK);
      PROCESS_YIELD_UNTIL(ev==PROCESS_EVENT_POLL);
      if (i2c_status==FAIL) { /* we only test for ACK on the first byte! */
        if (transaction->cb) transaction->cb(false);
#if (DEBUG==1)
        printf("i2c: to 0x%x failed, %d written, %d read in %d ticks\n",
               transaction->addr, transaction->wrlen, transaction->rdlen,
               (uint32_t) u32AHI_TickTimerRead() - i2c_ticks);
#endif
        continue;
      }
    }

    if (transaction->rdlen) {
      /* send slave addr, start condition */
      vAHI_SiWriteData8(transaction->addr|1);
      vAHI_SiSetCmdReg(E_AHI_SI_START_BIT,     E_AHI_SI_NO_STOP_BIT,
                       E_AHI_SI_NO_SLAVE_READ, E_AHI_SI_SLAVE_WRITE,
                       E_AHI_SI_SEND_ACK,      E_AHI_SI_NO_IRQ_ACK);
      PROCESS_YIELD_UNTIL(ev==PROCESS_EVENT_POLL);
    }

    /* read data, send stop condition on last byte, send nak on last byte when
     * end_of_transmission is set.*/
    for (i=0; i<transaction->rdlen; i++) {
      vAHI_SiSetCmdReg(E_AHI_SI_NO_START_BIT, i==transaction->rdlen-1,
                       E_AHI_SI_SLAVE_READ,   E_AHI_SI_NO_SLAVE_WRITE,
                       (i==transaction->rdlen-1) ? E_AHI_SI_SEND_NACK : E_AHI_SI_SEND_ACK,
                       E_AHI_SI_NO_IRQ_ACK);
      PROCESS_YIELD_UNTIL(ev==PROCESS_EVENT_POLL);
      transaction->buf[transaction->wrlen+i] = u8AHI_SiReadData8();
    }

#if (DEBUG==1)
    printf("i2c: to 0x%x completed, %d written, %d read in %d ticks (rd:",
           transaction->addr, transaction->wrlen, transaction->rdlen,
           (u32_t) u32AHI_TickTimerRead() - i2c_ticks);
    for (i=0; i<transaction->rdlen+transaction->wrlen; i++)
      printf("0x%x,", transaction->buf[i]);
    printf(")\n");
#endif

    if (transaction->cb) transaction->cb(i2c_status==SUCCESS);
  }
  vAHI_SiConfigure(false,false,0);

  PROCESS_END();
}
static void Wire_Init(void) {
	vAHI_SiRegisterCallback(SiInterruptHandler);
}