📄 net_init.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 + -