void sysSerialReset (void)
{
    int i;
	
	at91DBGUChan.regs ->DBGU_IDR = 0xFFFFFFFF;
	at91DBGUChan.regs ->DBGU_CR = UART_CR_RESET_RECV | UART_CR_RESET_TRAN | UART_CR_RX_DIS | UART_CR_TX_DIS;

    for (i = 0; i < N_SIO_CHANNELS ; i++)
	{
		/* disable serial interrupts */
		intDisable (devParas[i].intLevel);
		
		/*
		 *	disable all interrupt source first
		 */
		at91UartChan[i].regs->US_IDR = 0xFFFFFFFF;
		
		/*
		 *	set all channel to quiet state.
		 */
		at91UartChan[i].regs->US_CR = UART_CR_RESET_RECV | UART_CR_RESET_TRAN | UART_CR_RX_DIS | UART_CR_TX_DIS;
		at91UartChan[i].regs->US_MR = UART_MR_CHAR_8BIT | UART_MR_STOP_1BIT | UART_MR_PARITY_NONE
					| UART_MR_CLK_USE_MCKDIV| UART_MR_TEST_NORMAL_MODE| UART_MR_UART_MODE_NORMAL;
	}
}
void sysSerialReset (void)
{
    int i;

    for (i = 0; i < AMBA_UART_CHANNELS_NUM; i++)
	{
	    /* disable serial interrupts */
	    (void)intDisable ((int)dev_paras[i].int_level);
	}
}
예제 #3
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);
}
예제 #4
0
void
ae531x_rxbuf_free(ae531xRxBuf_t *rxBuf)
{
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (rxBuf) {
        rxBuf->next = ae531xRxFreeList;
        ae531xRxFreeList = rxBuf;
    }
    intEnable(oldIntrState);
}
예제 #5
0
void
ae531x_txbuf_free(ae531xTxBuf_t *txBuf)
{
    unsigned long oldIntrState;

    intDisable(oldIntrState);
    if (txBuf) {
        txBuf->next = ae531xTxFreeList;
        ae531xTxFreeList = txBuf;
    }
    intEnable(oldIntrState);
}
예제 #6
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();
}
/*
   Wrap the VxWorks intDisable routine
*/
LOCAL int MEI_MyIntDisable_Wrap(int IRQNum)
{
    int ret;
    printf("INT Wrap - intDisable\r\n");

    /*
       pre: do own stuff here
    */

    ret = intDisable(IRQNum);

    /*
       post: do own stuff here
    */

    return ret;
}
예제 #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;
}
예제 #9
0
PUBLIC IX_STATUS
ixOsalIrqUnbind (UINT32 irqLevel)
{
    /*
     * disable interrupts for this vector 
     */
    if (intDisable (IVEC_TO_INUM (irqLevel)) != OK)
    {
        return IX_FAIL;
    }

    /*
     * register a dummy ISR 
     */
    if (intConnect ((IxOsalVoidFnVoidPtr
                *) irqLevel, (IxOsalVoidFnVoidPtr) ixOsalDummyIsr, 0) != OK)
    {
        return IX_FAIL;
    }
    return IX_SUCCESS;
}
예제 #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;
}
예제 #11
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;
}
예제 #12
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();
}
예제 #13
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;
}
예제 #14
0
PUBLIC void
ixOsalIrqDisable (UINT32 irqLevel)
{
    intDisable (irqLevel);
}
예제 #15
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;
}
예제 #16
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;
}