亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? nbuf.c

?? Kinetis_K60開(kāi)源底層驅(qū)動(dòng)開(kāi)發(fā)包(20120328)
?? C
字號(hào):
/* Buffer Descriptors -- must be aligned on a 4-byte boundary but a 
 * 16-byte boundary is recommended. To avoid playing games with the 
 * various compilers and their different extension to ANSI C, these 
 * buffers are aligned by allocating an extra line of data and 
 * adjusting the pointers in nbuf_init().
 */

#include "common.h"
#include "nbuf.h"

/*FSL: to avoid overlapping, buffers must be declared at the beggining of file*/
/*then pointers can access them correctly*/

/* Data Buffers -- must be aligned on a 16-byte boundary. To avoid 
 * playing games with the various compilers and their different 
 * extension to ANSI C, these buffers are aligned by allocating an 
 * extra line of data and adjusting the pointers in nbuf_init().
 */
static uint8_t unaligned_txbd[(sizeof(NBUF) * NUM_TXBDS) + 16];
static uint8_t unaligned_rxbd[(sizeof(NBUF) * NUM_RXBDS) + 16];
#ifdef USE_DEDICATED_TX_BUFFERS
static uint8_t unaligned_txbuffer[(TX_BUFFER_SIZE * NUM_TXBDS) + 16];
#endif
static uint8_t unaligned_rxbuffer[(RX_BUFFER_SIZE * NUM_RXBDS) + 16];

/* Pointers to alligned buffer descriptors */
static NBUF *TxNBUF;
static NBUF *RxNBUF;

/* Pointers to alligned Tx/Rx data buffers */
#ifdef USE_DEDICATED_TX_BUFFERS
static uint8_t *TxBuffer;
#endif
static uint8_t *RxBuffer;

/* Next BD indicators for static BD queue */ 
static int next_txbd;
static int next_rxbd;

/********************************************************************/
void 
nbuf_alloc(int ch)
{
	int i;
	//uint32_t *temp;

        next_txbd = 0;
        next_rxbd = 0;

	TxNBUF = (NBUF *)(((uint32_t)(unaligned_txbd)) & 0xFFFFFFF0);
	RxNBUF = (NBUF *)(((uint32_t)(unaligned_rxbd)) & 0xFFFFFFF0);

	RxBuffer = (uint8_t *)(((uint32_t)(unaligned_rxbuffer)) & 0xFFFFFFF0);
#ifdef USE_DEDICATED_TX_BUFFERS
	TxBuffer = (uint8_t *)(((uint32_t)(unaligned_txbuffer)) & 0xFFFFFFF0);
#endif
	// Initialize transmit descriptor ring
	for (i = 0; i < NUM_TXBDS; i++)
	{
		TxNBUF[i].status = 0x0000;
		TxNBUF[i].length = 0;		
	        #ifdef USE_DEDICATED_TX_BUFFERS
	           #ifdef NBUF_LITTLE_ENDIAN 
	           TxNBUF[i].data = (uint8_t *)__REV((uint32_t)&TxBuffer[i * TX_BUFFER_SIZE]);
                   #else
                   TxNBUF[i].data = (uint8_t *)(uint32_t)&TxBuffer[i * TX_BUFFER_SIZE];
                   #endif
                #endif
        
                #ifdef ENHANCED_BD
                   TxNBUF[i].ebd_status = TX_BD_IINS | TX_BD_PINS;
                #endif
	}

	// Initialize receive descriptor ring
	for (i = 0; i < NUM_RXBDS; i++)
	{
		RxNBUF[i].status = RX_BD_E;
		RxNBUF[i].length = 0;
                #ifdef NBUF_LITTLE_ENDIAN
		RxNBUF[i].data = (uint8_t *)__REV((uint32_t)&RxBuffer[i * RX_BUFFER_SIZE]);
                #else
                RxNBUF[i].data = (uint8_t *)(uint32_t)&RxBuffer[i * RX_BUFFER_SIZE];
                #endif

                #ifdef ENHANCED_BD
	        RxNBUF[i].bdu = 0x00000000;
	        RxNBUF[i].ebd_status = RX_BD_INT;
                #endif               
	}
        
	// Set the Wrap bit on the last one in the ring
	RxNBUF[NUM_RXBDS - 1].status |= RX_BD_W;
	TxNBUF[NUM_TXBDS - 1].status |= TX_BD_W;
}
/********************************************************************/
void 
nbuf_flush(int ch)
{
	int i;

	next_txbd = 0;
	next_rxbd = 0;
	
	// Reset enet hardware bd pointers also ??

	// Reset receive descriptor ring
	for (i = 0; i < NUM_RXBDS; i++)
	{
		RxNBUF[i].status = RX_BD_E;
		RxNBUF[i].length = 0;
	        #ifdef NBUF_LITTLE_ENDIAN	
		RxNBUF[i].data = (uint8_t *)__REV((uint32_t)&RxBuffer[i * RX_BUFFER_SIZE]);
	        #else
	        RxNBUF[i].data = (uint8_t *)(uint32_t)&RxBuffer[i * RX_BUFFER_SIZE];
	        #endif	
	}

	// Reset transmit descriptor ring
	for (i = 0; i < NUM_TXBDS; i++)
	{
		TxNBUF[i].status = 0x0000;
		TxNBUF[i].length = 0;
	}

	// Set the Wrap bit on the last one in the ring
	RxNBUF[NUM_RXBDS - 1].status |= RX_BD_W;
	TxNBUF[NUM_TXBDS - 1].status |= TX_BD_W;
}
/********************************************************************/
void 
nbuf_init(int ch)
{
	// Set Receive Buffer Size
	ENET_MRBR/*(ch)*/ = (uint16_t)RX_BUFFER_SIZE;  
  
 	// Point to the start of the Tx buffer descriptor queue
	ENET_TDSR/*(ch)*/ = (uint32_t)TxNBUF;
	// Point to the start of the circular Rx buffer descriptor queue
	ENET_RDSR/*(ch)*/ = (uint32_t)RxNBUF;
}
/********************************************************************/
void 
nbuf_start_rx(int ch)
{
        // Indicate Empty buffers have been produced
	ENET_RDAR/*(ch)*/ = ENET_RDAR_RDAR_MASK;

        while( !ENET_RDAR )
        {
          //If RDAR cannot be test,  
          //printf("Error with internal ENET DMA engine\n");
        }
}
/********************************************************************/
void 
enet_get_received_packet(int ch, NBUF * rx_packet)
{
	int last_buffer;
	uint16_t status;
	int index_rxbd;

	last_buffer = 0;
	rx_packet->length = 0;
	
	index_rxbd = next_rxbd;
    
	if(RxNBUF[index_rxbd].status & RX_BD_E)
	{
		printf("Under processing. SHouldnt be here\n");
		return;	
	}
        #ifdef NBUF_LITTLE_ENDIAN
        rx_packet->data = (uint8_t *)__REV((uint32_t)RxNBUF[index_rxbd].data);
        #else
        rx_packet->data = (uint8_t *)(uint32_t)RxNBUF[index_rxbd].data;
        #endif
	// Update next_rxbd pointer and mark buffers as empty again
	while(!last_buffer)
	{
		status = RxNBUF[index_rxbd].status;
	        #ifdef NBUF_LITTLE_ENDIAN	
		rx_packet->length = __REVSH(RxNBUF[index_rxbd].length);
                #else
                rx_packet->length = RxNBUF[index_rxbd].length;
                #endif
                #ifdef ENHANCED_BD
		rx_packet->ebd_status = RxNBUF[index_rxbd].ebd_status;
	            #ifdef NBUF_LITTLE_ENDIAN	
		    rx_packet->timestamp = __REV(RxNBUF[index_rxbd].timestamp);
		    rx_packet->length_proto_type = __REVSH(RxNBUF[index_rxbd].length_proto_type);
		    rx_packet->payload_checksum = __REVSH(RxNBUF[index_rxbd].payload_checksum);
                    #else
		    rx_packet->timestamp = RxNBUF[index_rxbd].timestamp;
		    rx_packet->length_proto_type = RxNBUF[index_rxbd].length_proto_type;
		    rx_packet->payload_checksum = RxNBUF[index_rxbd].payload_checksum;
                    #endif
                #endif

		last_buffer = (status & RX_BD_L);
		if(status & RX_BD_W)
		{
			RxNBUF[index_rxbd].status = (RX_BD_W | RX_BD_E);
			index_rxbd = 0;
		}
		else
		{
			RxNBUF[index_rxbd].status = RX_BD_E;
			index_rxbd++;
		}
	}
	
	// Update the global rxbd index
	next_rxbd = index_rxbd;
	
	// Put the last BD status in rx_packet->status as MISS flags and more 
	// are updated in last BD
	rx_packet->status = status;
}
/********************************************************************/
void enet_fill_txbds(int ch, NBUF * tx_packet)
{
	int num_txbds, i;
	int index_txbd;

	num_txbds = (tx_packet->length/TX_BUFFER_SIZE);
	
	index_txbd = next_txbd;
	
	if((num_txbds * TX_BUFFER_SIZE) < tx_packet->length)
	{
		num_txbds = num_txbds + 1;
	}
    
	// Fill Descriptors
	for (i = 0; i < num_txbds; i++)
	{
		
		TxNBUF[index_txbd].status = TX_BD_TC | TX_BD_R;
                #ifdef ENHANCED_BD
		TxNBUF[index_txbd].bdu = 0x00000000;
		TxNBUF[index_txbd].ebd_status = TX_BD_INT | TX_BD_TS;// | TX_BD_IINS | TX_BD_PINS;
                #endif

		if(i == num_txbds - 1)
		{
		    #ifdef NBUF_LITTLE_ENDIAN 
		    TxNBUF[index_txbd].length = __REVSH((tx_packet->length - (i*TX_BUFFER_SIZE)));
                    #else
                    TxNBUF[index_txbd].length = (tx_packet->length - (i*TX_BUFFER_SIZE));
                    #endif
		    // Set the Last bit on the last BD
		    TxNBUF[index_txbd].status |= TX_BD_L;		 
		}
		else
		{
		    #ifdef NBUF_LITTLE_ENDIAN 
		    TxNBUF[index_txbd].length = __REVSH(TX_BUFFER_SIZE);
		    #else
		    TxNBUF[index_txbd].length = TX_BUFFER_SIZE;
		    #endif
		}
		
		#ifdef USE_DEDICATED_TX_BUFFERS
		  #ifdef NBUF_LITTLE_ENDIAN
		  //Copy data to Tx buffers
                   memcpy((void *)__REV((uint32_t)TxNBUF[index_txbd].data), (void *)(((uint32_t)(tx_packet->data)) + (i*TX_BUFFER_SIZE)),
                          __REVSH(TxNBUF[index_txbd].length));  
                  #else
		  // Copy data to Tx buffers
                  memcpy((void *)(uint32_t)TxNBUF[index_txbd].data, (void *)(((uint32_t)(tx_packet->data)) + (i*TX_BUFFER_SIZE)),
                          TxNBUF[index_txbd].length);         
                  #endif
                #else
                  // Just update data pointer as data is aready there
                  #ifdef NBUF_LITTLE_ENDIAN 
                  TxNBUF[index_txbd].data = (uint8_t *)__REV((((uint32_t)(tx_packet->data)) + (i*TX_BUFFER_SIZE)));
                  #else
                  TxNBUF[index_txbd].data = (uint8_t *)(((uint32_t)(tx_packet->data)) + (i*TX_BUFFER_SIZE));
                  #endif 
                #endif

		// Wrap if this was last TxBD
		if(++index_txbd == NUM_TXBDS)
		{
			TxNBUF[NUM_TXBDS - 1].status |= TX_BD_W;
			index_txbd = 0;
		}
	}
	
	// Update the global txbd index
	next_txbd = index_txbd;
}

void 
enet_transmit_packet(int ch, NBUF * tx_packet)
{
	enet_fill_txbds(ch,tx_packet);
	
	// Indicate that Descriptors are ready to transmit 
	ENET_TDAR/*(ch)*/ = ENET_TDAR_TDAR_MASK;
}
/********************************************************************/

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合成人精品亚洲另类欧美 | 久久综合色婷婷| 福利一区二区在线观看| 五月天丁香久久| 国产精品美女www爽爽爽| 日韩精品一区二区在线| 91黄视频在线观看| 国产69精品久久777的优势| 日韩精品乱码免费| 一区二区三区在线看| 久久这里只精品最新地址| 欧美人体做爰大胆视频| 色婷婷综合激情| 国产成人av一区| 国模冰冰炮一区二区| 日韩在线a电影| 亚洲亚洲人成综合网络| 日韩一区有码在线| 国产精品久久久99| 国产婷婷一区二区| 精品国产自在久精品国产| 欧美区视频在线观看| 91激情在线视频| 在线观看日韩国产| 91免费版在线| 91老师片黄在线观看| 99久久综合99久久综合网站| 国产一区二区三区精品欧美日韩一区二区三区 | 国产成人自拍网| 久久精品72免费观看| 天天av天天翘天天综合网| 亚洲免费av高清| 亚洲欧美国产毛片在线| 国产精品嫩草久久久久| 欧美国产日本韩| 国产精品伦一区| 国产精品欧美一区喷水| 中文字幕高清一区| 成人免费在线观看入口| 1024成人网色www| 亚洲色图清纯唯美| 亚洲男人天堂av| 亚洲成人在线观看视频| 亚洲不卡在线观看| 日本vs亚洲vs韩国一区三区 | 欧美一级免费大片| 日韩免费观看2025年上映的电影| 91精品国产综合久久久久久| 制服丝袜亚洲色图| 欧美电视剧免费全集观看| 久久亚洲综合av| 国产精品麻豆视频| 亚洲欧美日韩久久精品| 亚洲综合自拍偷拍| 天天av天天翘天天综合网| 免费看欧美女人艹b| 久久国产精品露脸对白| 国产成人亚洲精品狼色在线| aa级大片欧美| 欧美日韩亚洲不卡| 精品日韩在线一区| 日本一区二区三区电影| 亚洲男人的天堂一区二区 | 久久66热偷产精品| 粗大黑人巨茎大战欧美成人| 一本一本久久a久久精品综合麻豆| 欧美日韩在线电影| 精品少妇一区二区三区| 亚洲欧美在线视频| 性久久久久久久久久久久| 国内久久精品视频| 91香蕉视频污在线| 欧美一级一区二区| 18成人在线观看| 日本特黄久久久高潮| 国产成人日日夜夜| 欧美亚洲图片小说| xfplay精品久久| 一区二区三区在线观看国产| 美女一区二区三区在线观看| 成人免费黄色大片| 欧美一级黄色录像| 成人欧美一区二区三区白人| 欧美aa在线视频| 99久久777色| 欧美精品一区二区三区高清aⅴ| 1024国产精品| 国产一区二区在线电影| 91官网在线免费观看| 久久美女艺术照精彩视频福利播放| 亚洲精品欧美二区三区中文字幕| 蜜桃av一区二区| 日本久久精品电影| 日本一区二区三区久久久久久久久不| 亚洲成va人在线观看| 国产91精品免费| 精品美女在线观看| 亚洲一区二区不卡免费| 国产91在线看| 日韩视频在线一区二区| 亚洲综合小说图片| 成人性色生活片| 精品国产电影一区二区| 亚洲一区二区三区四区的| 成人少妇影院yyyy| 久久久久久9999| 日韩和的一区二区| 在线欧美日韩精品| 国产精品看片你懂得| 国产在线不卡视频| 欧美一区二区在线免费播放| 亚洲一区二区三区四区的| 99久久99久久精品免费观看| 国产三级久久久| 久久超碰97人人做人人爱| 欧美喷潮久久久xxxxx| 最新不卡av在线| 成人一区二区三区| 中文字幕不卡三区| 国产美女视频91| www久久精品| 黄页网站大全一区二区| 日韩欧美精品在线视频| 日韩精品一二区| 欧美人伦禁忌dvd放荡欲情| 亚洲午夜久久久久久久久电影院| 色琪琪一区二区三区亚洲区| 亚洲天堂a在线| 波多野结衣欧美| 日韩理论片在线| av亚洲精华国产精华精| 国产精品欧美极品| 99久久国产免费看| 亚洲青青青在线视频| 97久久超碰国产精品| 最新国产成人在线观看| 99视频一区二区三区| 成人免费在线视频| 在线免费一区三区| 午夜日韩在线电影| 日韩午夜小视频| 激情av综合网| 亚洲国产精品ⅴa在线观看| eeuss影院一区二区三区 | 国产精品成人免费精品自在线观看| 高清不卡一二三区| 亚洲视频网在线直播| 91视频免费播放| 亚洲成人av一区二区| 日韩欧美国产综合一区| 国产一区二区三区最好精华液| 久久午夜电影网| av一区二区久久| 午夜精品福利一区二区三区av | 91社区在线播放| 一区二区成人在线视频| 欧美日韩不卡一区| 极品少妇一区二区三区精品视频| 精品国产凹凸成av人导航| 成人免费视频caoporn| 一区二区在线观看视频| 7777精品伊人久久久大香线蕉经典版下载 | 午夜久久久久久久久久一区二区| 91超碰这里只有精品国产| 久久99久久精品欧美| 欧美激情在线一区二区三区| 91麻豆蜜桃一区二区三区| 亚洲妇熟xx妇色黄| 精品国产乱码久久久久久闺蜜 | 欧美www视频| www.欧美.com| 日韩成人午夜电影| 国产人成亚洲第一网站在线播放| 91免费观看在线| 久久99日本精品| 亚洲欧美日韩综合aⅴ视频| 欧美丰满美乳xxx高潮www| 国产成人精品综合在线观看 | 高清不卡在线观看av| 亚洲国产综合色| 久久久久久影视| 欧美视频在线一区二区三区| 激情综合五月天| 一区二区成人在线视频| 久久精品一区二区三区av| 欧美日韩亚洲综合一区| 成人教育av在线| 蜜臀av一区二区在线免费观看| 国产精品久久久久久妇女6080| 日韩一级精品视频在线观看| 99精品国产99久久久久久白柏| 蜜臀va亚洲va欧美va天堂| 亚洲激情第一区| 国产嫩草影院久久久久| 欧美一区二区三区四区高清 | 欧美一区二区三区人| 99久久99久久久精品齐齐| 韩国欧美一区二区| 午夜日韩在线电影| 一区二区三区小说|