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); } }
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); }
void ae531x_rxbuf_free(ae531xRxBuf_t *rxBuf) { unsigned long oldIntrState; intDisable(oldIntrState); if (rxBuf) { rxBuf->next = ae531xRxFreeList; ae531xRxFreeList = rxBuf; } intEnable(oldIntrState); }
void ae531x_txbuf_free(ae531xTxBuf_t *txBuf) { unsigned long oldIntrState; intDisable(oldIntrState); if (txBuf) { txBuf->next = ae531xTxFreeList; ae531xTxFreeList = txBuf; } intEnable(oldIntrState); }
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; }
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; }
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; }
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; }
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; }
/****************************************************************************** * * 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(); }
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; }
PUBLIC void ixOsalIrqDisable (UINT32 irqLevel) { intDisable (irqLevel); }
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; }
/***************************************************************************** * 函 数 名 : 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; }