Exemplo n.º 1
0
//   ADC初始化
void
adc_init(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC); //使能ADC模块
    SysCtlADCSpeedSet(SYSCTL_ADCSPEED_500KSPS); //设置ADC采样速率
    ADCSequenceDisable(ADC_BASE, 0); // 配置前先禁止采样序列

    ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);
    //配置ADC采样序列的触发事件和优先级:ADC基址,采样序列编号,触发事件,采样优先级
    ADCSequenceStepConfigure(ADC_BASE, 0, 0,
            ADC_CTL_END | ADC_CTL_CH0 | ADC_CTL_IE);

    //配置ADC采样序列发生器的步进 :ADC基址,采样序列编号,步值,通道设置

    intConnect(INT_ADC0, ADC_Sequence_0_ISR, 0u);
    ADCIntEnable(ADC_BASE, 0); //使能ADC采样序列的中断
//    IntEnable(INT_ADC0); // 使能ADC采样序列中断
    intEnable(INT_ADC0);
    IntMasterEnable(); // 使能处理器中断

    ADCSequenceEnable(ADC_BASE, 0); // 使能一个ADC采样序列
    the_lock = semBCreate(0);
//    printf("%x\n", the_lock);

}
Exemplo n.º 2
0
void sysSerialHwInit2(void)
{
    for (uint32_t i = 0; i < ARRAY_SIZE(stm32f1xxUartChan); i++){
       intConnect(uartParas[i].intid, stm32f1xxUartInt, (uint32_t)&stm32f1xxUartChan[i]);
       intEnable(uartParas[i].intid);
    }
}
Exemplo n.º 3
0
void sysSerialHwInit2(void)
{
    uint32_t i;
    // 串口
    for (i = 0; i < ARRAY_SIZE(lm811UartChan); i++){
        intConnect(uartParas[i].intid, lm811UartInt, (uint32_t)&lm811UartChan[i]);
        intEnable(uartParas[i].intid);
    }
}
void sysSerialHwInit2 (void)
{
    int i;
	for (i = 0; i < AMBA_UART_CHANNELS_NUM; i++)
	{
		(void)intConnect (INUM_TO_IVEC(dev_paras[i].vector),
				   balongv7r2_uart_irq_handler, (int) &amba_chan[i] );
		(void)intEnable ((int)dev_paras[i].int_level);
    }
}
Exemplo n.º 5
0
void
ae531x_txbuf_free(ae531xTxBuf_t *txBuf)
{
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (txBuf) {
        txBuf->next = ae531xTxFreeList;
        ae531xTxFreeList = txBuf;
    }
    intEnable(oldIntrState);
}
Exemplo n.º 6
0
static void ag7100_rxbuf_free(ag7100_priv_data_t *ag7100_priv, void *buf)
{
    unsigned long oldIntrState;
    ag7100RxBuf_t *rxBuf = (ag7100RxBuf_t *)buf;

    intDisable(oldIntrState);
    if (rxBuf) {
        rxBuf->next = ag7100_priv->rxFreeList;
        ag7100_priv->rxFreeList = rxBuf;
    }
    intEnable(oldIntrState);
}
Exemplo n.º 7
0
void
ae531x_rxbuf_free(ae531xRxBuf_t *rxBuf)
{
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (rxBuf) {
        rxBuf->next = ae531xRxFreeList;
        ae531xRxFreeList = rxBuf;
    }
    intEnable(oldIntrState);
}
Exemplo n.º 8
0
void *
ag7100_rxbuf_alloc(ag7100_priv_data_t *ag7100_priv, unsigned char **rxBptr)
{
    ag7100RxBuf_t *rxbuf;
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (ag7100_priv->rxFreeList) {
        rxbuf = ag7100_priv->rxFreeList;
        ag7100_priv->rxFreeList = ag7100_priv->rxFreeList->next;
        intEnable(oldIntrState);

        *rxBptr = rxbuf->data;
        return (void *)rxbuf;
    }
    intEnable(oldIntrState);

    *rxBptr = NULL;

    return (void *)NULL;
}
Exemplo n.º 9
0
void  Tmr_TickInit (void)
{
    pLgeTimer0->clear       = 1;                          /* Enable Timer #0 for uC/OS-II Tick Interrupts  */
    pLgeTimer0->load        = SYS_TIMER_CLK / OS_TICKS_PER_SEC;
    pLgeTimer0->control     = TMRCTRL_ENABLE  | TMRCTRL_MODE_PERIODIC | TMRCTRL_PRESCALE16 | TMRCTRL_COUNTER32;

#if 1
    intConnect(INT_LVL_TIMER_0, (PFNCT)Tmr_TickISR, 0, "tick");
#else
    fastintConnect(INT_LVL_TIMER_0, (PFNCT)Tmr_TickISR, 0, "tick");
#endif
    intEnable(INT_LVL_TIMER_0);
}
Exemplo n.º 10
0
static void
ae531x_txbuf_alloc(ae531x_MAC_t *MACInfo, ae531xTxBuf_t **txBptr)
{
    ae531xTxBuf_t *txbuf;
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (ae531xTxFreeList) {
        txbuf = ae531xTxFreeList;
        ae531xTxFreeList = ae531xTxFreeList->next;
        intEnable(oldIntrState);

        *txBptr = txbuf;
        return;
    }
    intEnable(oldIntrState);

    DEBUG_PRINTF("ae531x_txbuf_alloc failed!\n");
    *txBptr = NULL;

    return;
}
Exemplo n.º 11
0
static int ag7100_recv(struct eth_device *dev)  //struct eth_drv_sc *sc, struct eth_drv_sg *sg_list, int sg_len)
{
    ag7100_priv_data_t *ag7100_priv = (ag7100_priv_data_t *)dev->priv;
    ag7100RxBuf_t *rxBuf;
    unsigned long oldIntrState;
    unsigned char *RxBufData;
    struct eth_drv_sg *sg_item;
    int i;

    ARRIVE();

    intDisable(oldIntrState);
    rxBuf = ag7100_priv->rxRecvdListHead;
    ag7100_priv->rxRecvdListHead = ag7100_priv->rxRecvdListHead->next;
    intEnable(oldIntrState);

#if 0 //by Zhangyu    
    if ((char *)sg_list->buf != NULL) {
        /* Copy out from driver Rx buffer to sg_list */
        RxBufData = rxBuf->data;
        sg_item = sg_list;
        for (i=0; i<sg_len; sg_item++, i++) {
            char *segment_addr;
            int segment_len;
    
            segment_addr = (char *)sg_item->buf;
            segment_len = sg_item->len;
    
#if defined(CONFIG_ATHRS26_PHY) && defined(HEADER_EN)
            /* remove header */
            if ((ag7100_priv->enetUnit == 0) && (i == 0)) {
                RxBufData += 2;
                segment_len -= 2;
            }
#endif    
            memcpy(segment_addr, RxBufData, segment_len);
            RxBufData += segment_len;
        }
    } else {
        /* Handle according to convention: bit bucket the packet */
    }
	
#endif

    RxBufData = rxBuf->data;
    NetReceive(RxBufData, AG7100_RX_BUF_SIZE);
    /* Free driver Rx buffer */
    ag7100_rxbuf_free(ag7100_priv, rxBuf);
    LEAVE();
}
Exemplo n.º 12
0
/******************************************************************************
**  Function:  CFE_PSP_Init1HzTone()
**
**  Purpose:
**    Initializes the 1Hz Tone interrupt
**
**  Arguments:
**
**  Return:
**
*/
void CFE_PSP_Init1HzTone()
{
    uint32 val;
    uint32 tone1HzPin = (1 << 7); /* GPIO0_7 */

    val = am335xInLong (AM335X_GPIO0_BASE + AM335X_GPIO_IRQSTATUS_SET1);
    am335xOutLong (AM335X_GPIO0_BASE + AM335X_GPIO_IRQSTATUS_SET1, val | tone1HzPin);

    val = am335xInLong (AM335X_GPIO0_BASE + AM335X_GPIO_RISINGDETECT);
    am335xOutLong (AM335X_GPIO0_BASE + AM335X_GPIO_RISINGDETECT, val | tone1HzPin);

    intConnect((VOIDFUNCPTR *)INUM_TO_IVEC (AM335X_GPIOINT0B), CFE_PSP_ToneISR, 0);
    intEnable(AM335X_GPIOINT0B);
}
Exemplo n.º 13
0
void *
ae531x_rxbuf_alloc(ae531x_MAC_t *MACInfo, char **rxBptr, int *rxBSize)
{
    ae531xRxBuf_t *rxbuf;
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (ae531xRxFreeList) {
        rxbuf = ae531xRxFreeList;
	//DEBUG_PRINTF("ae531xRxFreeList=%p\n",rxbuf);
        ae531xRxFreeList = ae531xRxFreeList->next;
        intEnable(oldIntrState);

        *rxBptr = (char *)rxbuf->data;
        *rxBSize = sizeof(rxbuf->data);
        return (void *)rxbuf;
    }
    intEnable(oldIntrState);

    DEBUG_PRINTF("ae531x_rxbuf_alloc failed!\n");
    *rxBptr = NULL;

    return (void *)NULL;
}
/*
   Wrap the VxWorks intEnable routine
*/
LOCAL int MEI_MyIntEnable_Wrap(int IRQNum)
{
    int ret;
    printf("INT Wrap - intEnable\r\n");

    /*
       pre: do own stuff here
    */


    ret = intEnable(IRQNum);

    /*
       post: do own stuff here
    */

    return ret;
}
Exemplo n.º 15
0
void init(void)
{
	
	int tacheSynchID;
	
	mailBox = msgQCreate( 2, 4, MSG_Q_FIFO);
	if (mailBox!=NULL)
		printf("Boite aux lettres créée\n");
	else
		printf("ERREUR\n");

	*GPT_IR = 0x1;
	*GPT_CR = 0x1c3;
	*GPT_PR = 0x0;
	*GPT_OCR1 = 24000000;



	// Initialisation des GPIO pour la broche GPIO9
	*IOMUXC1_GPIO9=0x05;
	*IOMUXC2_GPIO9=0x1B0B0;

	
	erreur = intConnect(87, (VOIDFUNCPTR)ITserver, 0);
	if (erreur !=OK)
	{
		printf("ERREUR intConnect\n");
		taskDelete(0);
	}
	erreur = intEnable(87);
	if (erreur != OK)
	{
		printf("Erreur intEnable\n");
		taskDelete(0);
	}
	
	
	tacheSynchID = taskSpawn(tacheSynch, 100, 0, 5000, (FUNCPTR)tacheSynch, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
	
	taskDelete(0);
}
Exemplo n.º 16
0
void GPIO_Init(void)
{
	SetGpioConfig(0, 0x8D, GPIO_WRITE);
	SetGpioConfig(0, 0x72, GPIO_READ);
	SetGpioConfig(0, 0x02, GPIO_READ | GPIO_INT_EN | GPIO_INT_F_EDGE );

	SetGpioConfig(1, 0xC3, GPIO_WRITE);

	SetGpioIsr(0, 1, IR_handler);
	intConnect (INT_VEC_GPIO0, (PFNCT)GPIO_ISR, 0, "GPIO0");
	intEnable (INT_VEC_GPIO0);

	GPIO_PowerLEDR(0);
	GPIO_PowerLEDG(1);

	GPIO_VcrMute(TRUE);
	GPIO_MainAudioMute(TRUE);
	GPIO_DelayedAGCOn(FALSE); //default : Self AGC

	return;
}
Exemplo n.º 17
0
PUBLIC IX_STATUS
ixOsalIrqBind (UINT32 irqLevel, IxOsalVoidFnVoidPtr routine, void *parameter)
{

#if CPU==SIMSPARCSOLARIS
    /*
     * No Irq support in simulation env 
     */
    return IX_FAIL;
#else
    if (intConnect
        ((IxOsalVoidFnVoidPtr *)
            irqLevel, (IxOsalVoidFnVoidPtr) routine, (int) parameter) != OK)
    {
        return IX_FAIL;
    }
    intEnable (irqLevel);
    return IX_SUCCESS;

#endif

}
void sysSerialHwInit2 (void)
{
    int i;

	AT91DBGUDevInit2( &at91DBGUChan );

    for (i = 0; i < N_SIO_CHANNELS; i++)
	{
		/*
		 * Connect and enable the interrupt.
		 * We would like to check the return value from this and log a message
		 * if it failed. However, logLib has not been initialised yet, so we
		 * cannot log a message, so there's little point in checking it.
		 * URAT still in quiet state
		 */
		(void) intConnect ( INUM_TO_IVEC(devParas[i].vector),
				   AT91UartInt, (UINT32) &at91UartChan[i] );
		
		intEnable (devParas[i].intLevel);
		AT91UartDevInit2( &at91UartChan[i] );
	}
}
Exemplo n.º 19
0
void GPIO_Init(void)
{
	SetGpioConfig(0, 0x8D, GPIO_WRITE);
	SetGpioConfig(0, 0x72, GPIO_READ);
	SetGpioConfig(0, 0x02, GPIO_READ | GPIO_INT_EN | GPIO_INT_F_EDGE );

	SetGpioConfig(1, 0x43, GPIO_WRITE);
	SetGpioConfig(1, 0x20, GPIO_WRITE);

#if (USE_IR>0)
	SetGpioIsr(0, 1, IR_handler);
#endif	/* USE_IR > 0 */
	intConnect (INT_VEC_GPIO0, (PFNCT)GPIO_ISR, 0, "GPIO0");
	intEnable (INT_VEC_GPIO0);

	GPIO_PowerLEDR(0);
	GPIO_PowerLEDG(1);

	GPIO_VcrMute(FALSE);
	GPIO_MainAudioMute(FALSE);

	return;
}
Exemplo n.º 20
0
PUBLIC void
ixOsalIrqEnable (UINT32 irqLevel)
{
    intEnable (irqLevel);
}
Exemplo n.º 21
0
/*****************************************************************************
* 函 数 名     :  cshell_direction
*
* 功能描述  : 改变cshell的方向
*
* 输入参数  :  cshell_mode_tpye mode :
*                           CSHELL_MODE_UART : 切换到UART
*                           CSHELL_MODE_USB   : 切换到USB
* 输出参数  :  无
*
* 返 回 值     :  无
*
* 修改记录  :
*****************************************************************************/
int cshell_direction(cshell_mode_tpye mode)
{
    int key = 0;
    int fd = 0;
    SHELL_ID ShellID;
    char ttyFg[16] = {0x00};
    char ttyBg[16] = {0x00};
    SHELL_IO_CHAN *ptr_shell = &shell_io_channel;
	SRAM_SMALL_SECTIONS * sram = (SRAM_SMALL_SECTIONS * )SRAM_SMALL_SECTIONS_ADDR;

    if ((cshell_mode_tpye)(ptr_shell->shell_mode) == mode)
    {
		cshell_print_error("C:no need to redirect cshell!\n");
        return OK;
    }

    if (CSHELL_MODE_UART == mode)
    {
        /* coverity[secure_coding] */
        sprintf(ttyFg, "/tyCo/0");
        /* coverity[secure_coding] */
        sprintf(ttyBg, "/tyCo/3");
    }
    else if (CSHELL_MODE_USB == mode)
    {
        /* coverity[secure_coding] */
        sprintf(ttyFg, "/tyCo/3");
        /* coverity[secure_coding] */
        sprintf(ttyBg, "/tyCo/0");
    }
    else
    {
		cshell_print_error("C:redirect parm error[%d]!\n", mode);
        return ERROR;
    }
	if (CSHELL_MODE_UART == mode)
		intEnable((int)sram->UART_INFORMATION[1].interrupt_num);
    else
    {
        /* 禁止串口中断,M核心采用UART */
   	    intDisable((int)sram->UART_INFORMATION[1].interrupt_num);
    }

    key = intLock();
    //taskLock();

    /* 关闭Shell当前使用的串口 */
    fd = ioGlobalStdGet(STD_IN);
    (void)ioctl (fd, FIOSETOPTIONS, OPT_RAW);
    close(fd);

    ShellID = shellFromTaskGet(shellConsoleTaskId);
    shellTerminate(ShellID);/* [false alarm]:误报 */

    if (0 != (fd = open(ttyFg, O_RDWR, 0)))/* [false alarm]:误报 */
    {
        /* 切换成功 */
        ptr_shell->shell_mode = mode;
    }
    else
    {
        /* 切换失败 */
        fd = open(ttyBg, O_RDWR, 0);
        if (0 == fd)
        {
            //taskUnlock();
            intUnlock(key);
            return ERROR;
        }
    }

    /* coverity[noescape] */
    (void)ioctl (fd, FIOSETOPTIONS, OPT_TERMINAL);

    /* coverity[noescape] */
    ioGlobalStdSet (STD_OUT, fd);
    /* coverity[noescape] */
    ioGlobalStdSet (STD_IN,  fd);
    /* coverity[noescape] */
    ioGlobalStdSet (STD_ERR, fd);

    //taskUnlock();
    intUnlock(key);

    usrShell();

    return OK;
}
Exemplo n.º 22
0
static int ae531x_poll(struct eth_device *dev)
{
    ae531xRxBuf_t *rxBuf, *newRxBuf;
    char *rxBufData;
    int unused_length;
    VIRT_ADDR   rxDesc;
    int length;
    ae531x_MAC_t *MACInfo;
    unsigned int cmdsts;
    ae531x_priv_data_t *ae531x_priv;

    ae531x_priv = (ae531x_priv_data_t *)dev->priv;
    MACInfo = (ae531x_MAC_t *)&ae531x_priv->MACInfo;

    do {
        for(;;) {
            rxDesc = MACInfo->rxQueue.curDescAddr;
            cmdsts = AE531X_DESC_STATUS_GET(KSEG1ADDR(rxDesc));

            if (cmdsts & DescOwnByDma) {
                /* There's nothing left to process in the RX ring */
                goto rx_all_done;
            }

            AE531X_PRINT(AE531X_DEBUG_RX,
                  ("consume rxDesc %p with cmdsts=0x%x\n",
                   (void *)rxDesc, cmdsts));
   
            AE531X_CONSUME_DESC((&MACInfo->rxQueue));
    
            A_DATA_CACHE_INVAL(rxDesc, AE531X_DESC_SIZE);

            /*  Process a packet */
            length = AE531X_DESC_STATUS_RX_SIZE(cmdsts) - ETH_CRC_LEN;
            if ( (cmdsts & (DescRxFirst |DescRxLast | DescRxErrors)) ==
                           (DescRxFirst | DescRxLast) ) {
                /* Descriptor status indicates "NO errors" */

                rxBuf = AE531X_DESC_SWPTR_GET(rxDesc);
                /*
                 * Allocate a replacement buffer
                 * We want to get another buffer ready for Rx ASAP.
                 */
                newRxBuf = ae531x_rxbuf_alloc(MACInfo, &rxBufData, &unused_length);
                if(newRxBuf == NULL ) {
                    /*
                     * Give this descriptor back to the DMA engine,
                     * and drop the received packet.
                     */
                    AE531X_PRINT(AE531X_DEBUG_ERROR,
                              ("Can't allocate new rx buf\n"));
                } else {
		   //diag_printf("rxBufData=%p\n",rxBufData);
                    AE531X_DESC_BUFPTR_SET(rxDesc, virt_to_bus(rxBufData));
                    AE531X_DESC_SWPTR_SET(rxDesc, newRxBuf);
                }

                AE531X_DESC_STATUS_SET(rxDesc, DescOwnByDma);
                rxDesc = NULL; /* sanity -- cannot use rxDesc now */
                sysWbFlush();
    
                if (newRxBuf == NULL) {
                    goto no_rx_bufs;
                } else {
                    /* Sync data cache w.r.t. DMA */
                    A_DATA_CACHE_INVAL(rxBuf->data, length);
        
                    /* Send the data up the stack */
                    AE531X_PRINT(AE531X_DEBUG_RX,
                              ("Send data up stack: rxBuf=%p data=%p length=%d\n",
                               (void *)rxBuf, (void *)rxBuf->data, length));

                    {
                        unsigned long oldIntrState;

                        rxBuf->next = NULL;
                        intDisable(oldIntrState);
                        if (ae531xRxRecvdListHead) {
                            ae531xRxRecvdListTail->next = rxBuf;
                            ae531xRxRecvdListTail = rxBuf;
                        } else {
                            ae531xRxRecvdListHead = rxBuf;
                            ae531xRxRecvdListTail = rxBuf;
                        }
                        intEnable(oldIntrState);
                    }
                     NetReceive(rxBuf->data, length);
			    /* Free driver Rx buffer */
    			ae531x_rxbuf_free(rxBuf);
                }
            } else {
                AE531X_PRINT(AE531X_DEBUG_ERROR,
                          ("Bad receive.  rxDesc=%p  cmdsts=0x%8.8x\n",
                           (void *)rxDesc, cmdsts));
            }
        }
    } while (ae531x_ReadDmaReg(MACInfo, DmaStatus) & DmaIntRxCompleted);

rx_all_done:
    ae531x_SetDmaReg(MACInfo, DmaIntrEnb,
                     DmaIeRxCompleted | DmaIeRxNoBuffer);
    ae531x_WriteDmaReg(MACInfo, DmaRxPollDemand, 0);

no_rx_bufs:

    return;
}
Exemplo n.º 23
0
/******************************************************************************
*
* ae531x_DmaReset - Reset DMA and TLI controllers
*
* RETURNS: N/A
*/
void
ae531x_DmaReset(ae531x_MAC_t *MACInfo)
{
    int           i;
    UINT32        descAddr;
    unsigned long oldIntrState;

    ARRIVE();

    /* Disable device interrupts prior to any errors during stop */
    intDisable(oldIntrState);

    /* Disable MAC rx and tx */
    ae531x_ClearMacReg(MACInfo, MacControl, (MacRxEnable | MacTxEnable));

    /* Reset dma controller */
    ae531x_WriteDmaReg(MACInfo, DmaBusMode, DmaResetOn);

    /* Delay 2 usec */
    sysUDelay(2);

    /* Flush the rx queue */
    descAddr = (UINT32)MACInfo->rxQueue.firstDescAddr;
    MACInfo->rxQueue.curDescAddr = MACInfo->rxQueue.firstDescAddr;
    for (i=0;
         i<(MACInfo->rxDescCount);
         i++, descAddr += AE531X_QUEUE_ELE_SIZE) {
            AE531X_DESC_STATUS_SET(descAddr, DescOwnByDma);
    }

    /* Flush the tx queue */
    descAddr = (UINT32)MACInfo->txQueue.firstDescAddr;
    MACInfo->txQueue.curDescAddr = MACInfo->txQueue.firstDescAddr;
    MACInfo->txQueue.reapDescAddr = MACInfo->txQueue.lastDescAddr;
    for (i=0;
         i<(MACInfo->txDescCount);
         i++, descAddr += AE531X_QUEUE_ELE_SIZE) {
            AE531X_DESC_STATUS_SET (descAddr, 0);
    }

    /* Set init register values  */
    ae531x_WriteDmaReg(MACInfo, DmaBusMode, DmaBusModeInit);

    /* Install the first Tx and Rx queues on the device */
    ae531x_WriteDmaReg(MACInfo, DmaRxBaseAddr,
                      (UINT32)MACInfo->rxQueue.firstDescAddr);
    ae531x_WriteDmaReg(MACInfo, DmaTxBaseAddr,
                      (UINT32)MACInfo->txQueue.firstDescAddr);

    ae531x_WriteDmaReg(MACInfo, DmaControl, DmaStoreAndForward);

    ae531x_WriteDmaReg(MACInfo, DmaIntrEnb, DmaIntDisable);

    AE531X_PRINT(AE531X_DEBUG_RESET,
              ("eth%d: DMA RESET!\n", MACInfo->unit));

    /* Turn on device interrupts -- enable most errors */
    ae531x_DmaIntClear(MACInfo);    /* clear interrupt requests  */
    ae531x_DmaIntEnable(MACInfo);   /* enable interrupts */

    ae531x_EndResetMode(MACInfo);

    intEnable(oldIntrState);

    LEAVE();
}
Exemplo n.º 24
0
static int ag7100_poll(struct eth_device *dev)
{
    int length;
    ag7100RxBuf_t *rxBuf, *newRxBuf;
    ag7100_desc_t *f;
    ag7100_mac_t *mac;
    ag7100_priv_data_t *ag7100_priv;
    unsigned char *rxBufData;


    ag7100_priv = (ag7100_priv_data_t *)dev->priv;
    mac = (ag7100_mac_t *)&ag7100_priv->MACInfo;

    if(--ag7100_priv->linkChkCntr == 0) {
        ag7100_priv->linkChkCntr = AG7100_LINK_CHK_INTVL;
        if(ag7100_check_link(mac) == 0) {
            //debug("Link is down\n");
            return;
        }
    }
    
    for(;;){
        f = mac->fifo_rx[mac->next_rx];
        A_DATA_CACHE_INVAL(f, sizeof(*f));
        if(ag7100_rx_owned_by_dma(f))
            goto rx_done;

        length = f->pkt_size;

        rxBuf = f->sw_buf;
        /*
         * Allocate a replacement buffer
         * We want to get another buffer ready for Rx ASAP.
         */
        newRxBuf = (ag7100RxBuf_t *)ag7100_rxbuf_alloc(ag7100_priv, &rxBufData);
        if(newRxBuf == NULL ) {
            /*
             * Give this descriptor back to the DMA engine,
             * and drop the received packet.
             */
            AG7100_PRINT(AG7100_DEBUG_ERROR,
                              ("Can't allocate new rx buf\n"));
        } else {
            //diag_printf("rxBufData=%p\n",rxBufData);
            f->pkt_start_addr = virt_to_bus((uint32_t)rxBufData);
            f->sw_buf = newRxBuf;
        }

        ag7100_rx_give_to_dma(f);
        A_WR_FLUSH();

        if(newRxBuf == NULL) {
            goto no_rx_bufs;
        } else {
            unsigned long oldIntrState;

            /* Sync data cache w.r.t. DMA */
            A_DATA_CACHE_INVAL(rxBuf->data, length);

            /* Send the data up the stack */
            //debug("Send data up stack: rxBuf=%p data=%p length=%d\n", (void *)rxBuf, (void *)rxBuf->data, length);

            rxBuf->next = NULL;
            intDisable(oldIntrState);
            if (ag7100_priv->rxRecvdListHead) {
                ag7100_priv->rxRecvdListTail->next = rxBuf;
                ag7100_priv->rxRecvdListTail = rxBuf;
            } else {
                ag7100_priv->rxRecvdListHead = rxBuf;
                ag7100_priv->rxRecvdListTail = rxBuf;
            }
            intEnable(oldIntrState);

            NetReceive(rxBuf->data, length);
			
            /* Free driver Rx buffer */
            ag7100_rxbuf_free(ag7100_priv, rxBuf);
			
        } 

        if(++mac->next_rx >= AG7100_RX_DESC_CNT) mac->next_rx = 0;
    }

rx_done:
    if (!(ag7100_reg_rd(mac, AG7100_DMA_RX_CTRL))) {
        ag7100_reg_wr(mac, AG7100_DMA_RX_DESC, virt_to_bus((uint32_t)f));
        ag7100_reg_wr(mac, AG7100_DMA_RX_CTRL, AG7100_RXE);
    }

no_rx_bufs:
    return;
}
Exemplo n.º 25
0
int pci_int_connect(int intLine,
		    pci_isr_t isr,
		    void *isr_data)
{
#if !defined(NEGEV)
    extern int sysVectorIRQ0;
#endif

#if defined(NSX) || defined(GTO) || defined(METROCORE)
    int i;
#endif
  
    debugk(DK_PCI,
	   "pci_int_connect: intLine=%d, isr=%p, isr_data=%p\n",
	   intLine, (void *)isr, (void *)isr_data);

#if defined(NSX) || defined(METROCORE)
    /* all int lines */
    for (i = 0; i < 4; i++) {
        /* printk("pciIntConnect int line = %d\n", intLine + i); */
        if (pciIntConnect ((VOIDFUNCPTR *)
                     INUM_TO_IVEC(sysVectorIRQ0 + intLine + i),
                     (VOIDFUNCPTR) isr,
                     PTR_TO_INT(isr_data)) != OK) {
            return -1;
        }
    }
    return 0;
#endif

#if defined(GTO)
    for (i = 0; i < 4; i++) {
        /* PCI interrupts are connected at external interrupt
         * 0, 1, 2, and 3.
         */ 
        if (pciIntConnect ((VOIDFUNCPTR *)
                     INUM_TO_IVEC(sysVectorIRQ0 + i),
                     (VOIDFUNCPTR) isr,
                     PTR_TO_INT(isr_data)) != OK) {
            return -1;
        }

        if (intEnable(sysVectorIRQ0 + i) == ERROR) {
	    return -1;
        }
    }
    return 0;
#endif

#if !defined (NEGEV)
    if (pciIntConnect ((VOIDFUNCPTR *)
		       INUM_TO_IVEC(sysVectorIRQ0 + intLine),
		       (VOIDFUNCPTR) isr,
		       PTR_TO_INT(isr_data)) != OK) {
      return -1;
    }
#endif

#if (CPU_FAMILY != PPC) && !defined(IDTRP334) && \
    !defined(MBZ) && !defined(IDT438) && !defined(NSX) && !defined(ROBO_4704) \
    && !defined(ROBO_4702) && !defined(RAPTOR) && !defined(METROCORE) \
    && !defined(KEYSTONE)
    if (sysIntEnablePIC(intLine) == ERROR) {
	return -1;
    }
#endif
    
#if (CPU_FAMILY == PPC)
    if (intEnable(intLine) != OK) {
	return -1;
    }
#endif /* (CPU_FAMILY == PPC) */

    return 0;
}