⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 net_init.c

📁 linux平台上的开放源代码的网络摄像机程序.实现视频捕捉,传输以及云台控制等.非常具有参考价值.
💻 C
字号:
// modified by Andrey#include <sv_addr_ag.h>#include <svinto_boot.h>	#define modifiedByAndreyextern udword bss_start;//#define DEBUG_FAILURE // hardware problems in one camera#ifdef modifiedByAndreyvoid send_network_response(udword action);#endifvoid net_init(){  *R_NETWORK_GA_1 = *R_NETWORK_GA_0 = 0;    SET_ETHER_ADDR(0x01,0x40,0x8c,0x00,0x01,0x00,0x01,0x40,0x8c,0x00,0x01,0x00);  *R_NETWORK_REC_CONFIG =      IO_STATE (R_NETWORK_REC_CONFIG, duplex,     half)    |    IO_STATE (R_NETWORK_REC_CONFIG, bad_crc,    discard) |    IO_STATE (R_NETWORK_REC_CONFIG, oversize,   discard) |    IO_STATE (R_NETWORK_REC_CONFIG, undersize,  discard) |    IO_STATE (R_NETWORK_REC_CONFIG, all_roots,  discard) |    IO_STATE (R_NETWORK_REC_CONFIG, broadcast,  discard) |    IO_STATE (R_NETWORK_REC_CONFIG, individual, discard) |    IO_STATE (R_NETWORK_REC_CONFIG, ma1,        disable) |    IO_STATE (R_NETWORK_REC_CONFIG, ma0,        enable);  *R_NETWORK_MGM_CTRL =      IO_FIELD(R_NETWORK_MGM_CTRL, txd_pins, 0)       |    IO_FIELD(R_NETWORK_MGM_CTRL, txer_pin, 0)       |    IO_FIELD(R_NETWORK_MGM_CTRL, mdck,     0)       |    IO_STATE(R_NETWORK_MGM_CTRL, mdoe,     disable) |    IO_FIELD(R_NETWORK_MGM_CTRL, mdio,     0);    *R_NETWORK_TR_CTRL =     (IO_STATE (R_NETWORK_TR_CTRL, clr_error, clr)     |     IO_STATE (R_NETWORK_TR_CTRL, delay,     none)    |     IO_STATE (R_NETWORK_TR_CTRL, cancel,    dont)    |     IO_STATE (R_NETWORK_TR_CTRL, cd,        enable)  |     IO_STATE (R_NETWORK_TR_CTRL, pad,       enable) |     IO_STATE (R_NETWORK_TR_CTRL, crc,       enable)  |     IO_STATE (R_NETWORK_TR_CTRL, retry,     enable));       *R_NETWORK_GEN_CONFIG =      IO_STATE (R_NETWORK_GEN_CONFIG, loopback, off)   |    IO_STATE (R_NETWORK_GEN_CONFIG, frame,    ether) |    IO_STATE (R_NETWORK_GEN_CONFIG, vg,       off)   |    IO_STATE (R_NETWORK_GEN_CONFIG, phy,      mii_clk)   |    IO_STATE (R_NETWORK_GEN_CONFIG, enable,   on);  *R_DMA_CH0_CMD = IO_STATE(R_DMA_CH0_CMD, cmd, reset);  *R_DMA_CH1_CMD = IO_STATE(R_DMA_CH1_CMD, cmd, reset);  rx_descr.sw_len = NETWORK_HEADER_LENGTH;  rx_descr.ctrl   = TX_CTRL;  rx_descr.next   = (udword)&rx_descr2;  rx_descr.buf    = (udword)&rx_header;  rx_descr2.sw_len = 1500;  rx_descr2.ctrl   = TX_CTRL_EOP;  rx_descr2.buf    = *(udword*)(boot_crt1-4);  /* Endian dependent, but saves a few bytes... */  *(udword*)&tx_header.src[0] = htonl(0x02408c00);   *(uword*)&tx_header.src[4]  = htons(0x0100);   tx_header.length = 0;  tx_header.snap1  = htonl(0xaaaa0300);  tx_header.snap2  = htonl(0x408c8856);  tx_header.tag    = htonl(0xfffffffe);  tx_header.seq    = 0;  tx_header.type   = 0;  tx_descr.sw_len = NETWORK_HEADER_LENGTH;  tx_descr.ctrl   = TX_CTRL_EOP;  tx_descr.buf    = (udword)&tx_header;    set_dest        = FALSE;  seq = 0;  send_ack[NETWORK]    = send_network_ack;  send_string[NETWORK] = send_network_string;  *R_DMA_CH1_FIRST = (udword)&rx_descr;  *R_DMA_CH1_CMD   = IO_STATE(R_DMA_CH1_CMD, cmd, start);}inthandle_network_read(){#ifdef modifiedByAndreyudword xchecksum;int i;udword *xdata;#endif  /* Even if wasn't to us, we must do this... */  rx_descr2.status = 0;  *R_DMA_CH1_FIRST = (udword)&rx_descr;  /*id finns inte vid boot!*/  /* rx_header.id == seq */#ifdef DEBUG_FAILUREsend_serial_hex(ntohl(rx_header.seq), NL);#endif  if (ntohl(rx_header.seq) == seq) { /* Was it to me? */    interface        = NETWORK;    last_timeout     = *R_TIMER_DATA >> IO_BITNR(R_TIMER_DATA, timer0);#ifdef modifiedByAndrey// calculate checksum    xchecksum=rx_header.seq;	// byte-reverse    xdata = (udword *) rx_descr2.buf;    for (i=0;i< ((rx_descr2.hw_len - CRC_LEN)>>2); i++)        xchecksum+=xdata[i];//compare calculated xchecksum with received "ID"    if (rx_header.seq && (rx_header.id != xchecksum)) { // seq==0 does not heve ID field      send_network_response(REJECT);      return (FALSE);	// did not match    } else {      nbr_read        += rx_descr2.hw_len - CRC_LEN;      rx_descr2.buf   += rx_descr2.hw_len - CRC_LEN;      rx_descr2.sw_len = rx_descr2.sw_len + NETWORK_HEADER_LENGTH < 64        ? 64 - NETWORK_HEADER_LENGTH : rx_descr2.sw_len; /* Less than minimum                                                             eth packet? */      send_network_response(ACK);      seq++;      return(TRUE);    }#else    nbr_read        += rx_descr2.hw_len - CRC_LEN;    rx_descr2.buf   += rx_descr2.hw_len - CRC_LEN;    rx_descr2.sw_len = rx_descr2.sw_len + NETWORK_HEADER_LENGTH < 64      ? 64 - NETWORK_HEADER_LENGTH : rx_descr2.sw_len; /* Less than minimum                                                            eth packet? */    send_network_ack();    seq++;    return(TRUE);#endif  }  return(FALSE);}#ifdef modifiedByAndreyvoidsend_network_ack(){send_network_response(ACK);}voidsend_network_response(udword action)#elsevoidsend_network_ack()#endif{  /*  send_serial_string(">send_network_ack.\r\n");*/    if (!set_dest) {		/* Copy destination address from first received packet */    set_dest = TRUE;    /* If we have done a bootrom network boot, source address is in a different     place... */    if (((*R_BUS_STATUS & IO_MASK(R_BUS_STATUS, boot))	 >> IO_BITNR(R_BUS_STATUS, boot)) - 1 == NETWORK) {      *(udword*)&tx_header.dest[0] = *(udword*)0x380000dc;      *(uword*)&tx_header.dest[4]  = *(uword*)0x380000e0;    }    else {      *(udword*)&tx_header.dest[0] = *(udword*)&rx_header.src[0];      *(uword*)&tx_header.dest[4]  = *(uword*)&rx_header.src[4];    }  }#ifdef modifiedByAndrey    tx_header.type  = htonl(action);	//ACK or REJECT#else    tx_header.type  = htonl(ACK);#endif#if 1    tx_header.seq   = htonl(seq);#else    tx_header.seq   = htonl(seq);    tx_header.type  = *(udword*)((&bss_start)+1);    tx_header.id    = htonl(rx_descr2.sw_len);    /* tx_header.id already set in boot_crt1. */#endif    tx_descr.ctrl   = TX_CTRL_EOP;    tx_descr.sw_len = NETWORK_HEADER_LENGTH;        start_network_trans();    }voidstart_network_trans(){  /*  send_serial_string(">start_network_trans\r\n");*/    /* Clear possible underrun or excessive retry errors */  /*  *R_NETWORK_TR_CTRL = */  /*    (IO_STATE (R_NETWORK_TR_CTRL, clr_error, clr)     |*/  /*     IO_STATE (R_NETWORK_TR_CTRL, delay,     none)    |*/  /*     IO_STATE (R_NETWORK_TR_CTRL, cancel,    dont)    |*/  /*     IO_STATE (R_NETWORK_TR_CTRL, cd,        enable)  |*/  /*     IO_STATE (R_NETWORK_TR_CTRL, pad,       enable) |*/  /*     IO_STATE (R_NETWORK_TR_CTRL, crc,       enable)  |*/  /*     IO_STATE (R_NETWORK_TR_CTRL, retry,     enable));*/    *R_DMA_CH0_FIRST = (udword)&tx_descr;  *R_DMA_CH0_CMD = IO_STATE(R_DMA_CH0_CMD, cmd, start);  while(*R_DMA_CH0_FIRST)    ;}void send_network_string(char *str){  int i;  print_hex(6);  tx_descr.next   = (udword)&tx_descr2;  tx_descr.ctrl   = TX_CTRL;  for (i=0; str[i]; i++);	/* strlen */    tx_header.type   = STRING;    tx_descr2.ctrl   = TX_CTRL_EOP;  tx_descr2.buf    = (udword)str;  tx_descr2.sw_len = i;    start_network_trans();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -