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

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

?? networkstack.c

?? WWVB receiver using AVR.
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* $Id: networkstack.c,v 1.45 2005/10/30 21:06:14 simimeie Exp $ * Basic Network Stack. Handles ARP / IP. * * I need to give some credits here: * Most of the code here is basically a port of Dave Clausen's assembler * code, at the time of writing this available under the GPL from * http://www.dclausen.net/projects/avr_ethernet/index.html * There is a lot of code in C out on the internet for using a NE2000 from * an AVR, but his assembler code was way better commented, documented and * easier to understand than anything I could find in C. */  #define BV _BV#include <avr/io.h>#include <avr/delay.h>#include <string.h>#include "networkstack.h"#include "ledmodule.h"#include "debugconsole.h"#include "dcf77.h"#include "timers.h"#include "clockface.h"#ifdef NET_NOUSELESSCRAP#define NET_NOTCPRESET#define NET_NODPORTUNREACH#endif/* Network Configuration. This gets read from EEPROM, set it in eepromdata.h */uint8_t net_ip[4];#if 0uint8_t net_mask[4];uint8_t net_gate[4];#endifuint8_t net_mac[6];uint8_t net_rconpass[9];uint8_t net_packet[1518];uint16_t net_recvdbytes;#ifdef NETWORKSTATSuint32_t net_rxbytes; /* Received Bytes */uint32_t net_txbytes; /* Transmitted Bytes */uint32_t net_pings; /* ICMP Pings */uint32_t net_ntpqs; /* NTP Queries */uint32_t net_rcons; /* Remote Control Commands */#endif/* On our board, address pin 15 on the atmel goes to address pin 9 of the ISA * bus. * So every access to a memory address above 0x8000 goes to the ISA bus, and * accesses I/O Port (0x200 + (address % 0x200)) there. * So if your NE2000 is on I/O 0x300, set this to 0x8100 or 0x8300 * or 0x8500 or ... */#define NE2KBASE	0x8300/* Register Offsets */#define NECMDR	0x00	/* Command Register (page *)*/#define NEPSTA	0x01	/* Page Start Register (page 0 = w, page 2 = r) */#define NEPAR0	0x01	/* Physical Address Register Byte 0 (page 1 = rw) */#define NEPSTO	0x02	/* Page Stop Register (page 0 = w, page 2 = r) */#define NEBNRY	0x03	/* Boundary Register (page 0 = rw) */#define NETPSR	0x04	/* Transmit Page Start Register (page 0 = w) */#define NETBCR0	0x05	/* Transmit Byte Count Register 0 (page 0 = w) */#define NETBCR1	0x06	/* Transmit Byte Count Register 1 (page 0 = w) */#define NEISR	0x07	/* Interrupt Status Register */#define NECURR	0x07	/* Current Page Register (page 1 = rw) */#define NERSAR0	0x08	/* Remote Start Address Register 0 (page 0 = w) */#define NERSAR1	0x09	/* Remote Start Address Register 1 (page 0 = w) */#define NERBCR0	0x0A	/* Remote Byte Count Register 0 (page 0 = w) */#define NERBCR1	0x0B	/* Remote Byte Count Register 1 (page 0 = w) */#define NERCR	0x0C	/* Receive Control Register */#define NETCR	0x0D	/* Transmission Control Register */#define NEDCR	0x0E	/* Data Control Register */#define NEIMR	0x0F	/* Interrupt Mask Register */#define NERDMA	0x10	/* Remote DMA */#define NERESET	0x1f	/* Well guess, what does the "reset" register do? *//* Bit defines *//* For the command register */#define CMDR_STOP	0x01	/* Stop (Reset) NIC */#define CMDR_START	0x02	/* Start NIC */#define CMDR_TRANSMIT	0x04	/* Must be 1 to transmit packet */#define CMDR_DMAREAD	0x08	/* remote DMA read */#define CMDR_DMAWRITE	0x10	/* remote DMA write */#define CMDR_NODMA	0x20	/* abort/complete remote DMA */#define CMDR_PAGE0	0x00	/* select register page 0 */#define CMDR_PAGE1	0x40	/* select register page 1 */#define CMDR_PAGE2	0x80	/* select register page 2 *//* For the Receive Control Register */#define RCR_BCAST	0x04#define RCR_MCAST	0x08#define RCR_PROMISCUOUS	0x10#define RCR_MONITOR	0x20/* For the Data Control Register */#define DCR_BYTEDMA	0x00#define DCR_WORDDMA	0x01#define DCR_NOLPBK	0x08#define DCR_FIFO2	0x00#define DCR_FIFO4	0x20#define DCR_FIFO8	0x40#define DCR_FIFO12	0x60/* For the Transmission Control Register */#define TCR_NOLPBK	0x00#define TCR_INTLPBK	0x02#define TCR_EXTLPBK	0x04#define TCR_EXTLPBK2	0x06/* Address defines * These defines should be correct for most ne2k compatibles. * It seems they usually have RAM available between 0x4000 and 0x8000. * These values are page numbers, with a page being 256 (0x100 bytes). */#define RXSTART	0x46	/* Start of RX buffers */#define RXSTOP	0x5f	/* End of RX buffers */#define TXSTART	0x40	/* Start of TX buffers */static void isareset(void) {	uint16_t i;	/* PortD Pin 4 is ISA RESET */	DDRD |= BV(PD4);	PORTD |= BV(PD4);	for (i=0; i<20000; i++) {		_delay_loop_1(250);	}	PORTD &= (uint8_t)~BV(PD4);	for (i=0; i<20000; i++) {		_delay_loop_1(250);	}}static void writene2kreg(uint8_t nr, uint8_t val) {	*((volatile uint8_t *)(NE2KBASE + nr)) = val;}static uint8_t readne2kreg(uint8_t nr) {	return *((volatile uint8_t *)(NE2KBASE + nr));}void net_sendpacket(uint8_t * packet, uint16_t len) {	uint16_t i;	if (len < 0x40) { len = 0x40; }	i = 0;	/* If there is still a packet in transmission, wait until it's done! */	while ((i < 50000) && (readne2kreg(NECMDR) & CMDR_TRANSMIT)) {		i++;	}	/* Abort any currently running "DMA" operations */	writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_NODMA);	writene2kreg(NERBCR0, len & 0xff);	writene2kreg(NERBCR1, len >> 8);	writene2kreg(NERSAR0, 0x00);	writene2kreg(NERSAR1, TXSTART);	writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_DMAWRITE);	for (i = 0; i < len; i++) {		writene2kreg(NERDMA, packet[i]);	}	/* Wait for something here? */	writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_NODMA);	writene2kreg(NETBCR0, len & 0xff);	writene2kreg(NETBCR1, len >> 8);	writene2kreg(NETPSR, TXSTART);	writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_TRANSMIT);	led_statusleds |= led_status_nettx;#ifdef NETWORKSTATS	net_txbytes += len;#endif}uint16_t net_receivepacket(void) {	uint8_t curr, bnry;	net_recvdbytes = 0;	/* goto register page 1 */	writene2kreg(NECMDR, CMDR_PAGE1 | CMDR_START | CMDR_NODMA);	/* read the CURRent pointer */	curr = readne2kreg(NECURR);	/* goto register page 0 */	writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_NODMA);	/* read the boundary pointer */	bnry = readne2kreg(NEBNRY) + 1;	if (bnry > RXSTOP - 1) { bnry = RXSTART; }	if (bnry != curr) { /* data available - read it */		uint16_t i;#if 0		debugconsole_printtext("P:");		debugconsole_printhex8(curr);		debugconsole_printtext(",");		debugconsole_printhex8(bnry);		debugconsole_printtext("->");#endif		/* i don't know how many bytes i intend to read, so just set		 * this to the maximum */		writene2kreg(NERBCR0, 0xff);		writene2kreg(NERBCR1, 0xff);		writene2kreg(NERSAR0, 0); /* low byte of start address (0) */		writene2kreg(NERSAR1, bnry); /* high byte of start address (BNRY) */		/* begin the dma read */		writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_DMAREAD);		readne2kreg(NERDMA); /* Status flags, throw away */		bnry = readne2kreg(NERDMA) - 1; /* next-pointer */		if (bnry < RXSTART) { bnry = RXSTOP - 1; }		net_recvdbytes = readne2kreg(NERDMA); /* receive byte count low */		net_recvdbytes |= (((uint16_t)readne2kreg(NERDMA)) << 8); /* receive byte count high */#if 0		debugconsole_printhex8(bnry);		debugconsole_printtext(" ");		debugconsole_printhex8(net_recvdbytes >> 8);		debugconsole_printhex8(net_recvdbytes & 0xff);		debugconsole_printtext("\r\n");#endif		if (net_recvdbytes > 1518) { net_recvdbytes = 1518; }		for (i = 0; i < net_recvdbytes; i++) {			net_packet[i] = readne2kreg(NERDMA);#if 0			debugconsole_printhex8(net_packet[i]);			if ((i % 20) == 0) {				debugconsole_printtext("\r\n");			}#endif		}		/* debugconsole_printtext("\r\n"); */		writene2kreg(NECMDR, CMDR_PAGE0 | CMDR_START | CMDR_NODMA);		/* write updated bnry pointer */		writene2kreg(NEBNRY, bnry);		led_statusleds |= led_status_netrx;#ifdef NETWORKSTATS		net_rxbytes += net_recvdbytes;#endif	}	return net_recvdbytes;}static void swapdestandsrceth(void) {	uint8_t c;	for (c = 0; c < 6; c++) {		/* set dst to src, and src to our mac */		net_packet[c] = net_packet[c+6];		net_packet[c+6] = net_mac[c];	}}static void swapdestandsrcarp(void) {	uint8_t c;		for (c = 0; c < 4; c++) {		net_packet[c+38] = net_packet[c+28];		net_packet[c+28] = net_ip[c];	}	for (c = 0; c < 6; c++) {		net_packet[c+32] = net_packet[c+22];		net_packet[c+22] = net_mac[c];	}}static void swapdestandsrcip(void) {	uint8_t c;		for (c = 0; c < 4; c++) {		net_packet[c+30] = net_packet[c+26];		net_packet[c+26] = net_ip[c];	}}void net_handlearp(void) {	/* 14 - 15  hardware type	 * 16 - 17  protocol	 * 18       hardware address size	 * 19       protocol address size	 * 20 - 21  type (0x0001 = request, 0x0002 = reply)	 * 22 - 27  sender hw address	 * 28 - 31  sender ip address	 * 32 - 37  target hw address	 * 38 - 41  target ip address	 */	if ((net_packet[14] == 0x00) /* Hardware type */	 && (net_packet[15] == 0x01)	 && (net_packet[16] == 0x08) /* Protocol */	 && (net_packet[17] == 0x00)	 && (net_packet[18] == 0x06) /* Hardware size */	 && (net_packet[19] == 0x04) /* Protocol size */	 && (net_packet[20] == 0x00) /* ARP Request */	 && (net_packet[21] == 0x01)	   ) {		if (memcmp(&net_packet[38], net_ip, 4)) {			/* Not for us */			return;		}		/* OK this is a request for our IP. Send a reply. */		/* We just rewrite the existing packet */		/* It's now an ARP REPLY, not a request */		net_packet[21] = 0x02;		swapdestandsrceth();		swapdestandsrcarp();		net_sendpacket(net_packet, 0x40);	}}uint16_t net_calcipchecksum(uint8_t * packet, uint8_t end) {	uint32_t tmp = 0;	uint16_t * pp;	uint8_t i;		pp = (uint16_t *)packet;	for (i = end; i > 1; i-=2) {		tmp += *pp;		pp++;	}	if (i > 0) {		tmp += (*pp & 0xff00);	}	while ((tmp >> 16) > 0) {		tmp = (tmp >> 16) + (tmp & 0xffffUL);	}	/* No idea why it works with the byte order swapped?	 * anyways, you will have to swap the byte order of the result! */	return (uint16_t)~tmp;}static void net_handleicmp(uint8_t hlen) {	/* ICMP: IP Header + type (1 byte) + code (1 byte) + checksum (2 bytes) 	 *                 + parameters (0-4 bytes) + data	 *       type  8 code 0:  echo request	 *       type  0 code 0:  echo reply	 *       type 11 code 0:  TTL exceeded	 */	if ((net_packet[hlen] == 8) && (net_packet[hlen+1] == 0)) {		/* We have an echo request - send it back almost unmodified? */		uint16_t cs;		if (net_packet[16] > 1) {			/* We don't do more than 511 bytes */			return;		}		net_packet[hlen] = 0;		swapdestandsrceth();		swapdestandsrcip();		net_packet[24] = net_packet[25] = 0;		cs = net_calcipchecksum(&net_packet[14], (hlen - 14));		net_packet[24] = cs & 0xff;		net_packet[25] = cs >> 8;		net_packet[hlen+2] = net_packet[hlen+3] = 0;		cs = net_calcipchecksum(&net_packet[hlen], (net_recvdbytes - hlen - 4));		net_packet[hlen+2] = cs & 0xff;		net_packet[hlen+3] = cs >> 8;		net_sendpacket(net_packet, net_recvdbytes - 4);		led_statusleds |= led_status_netping;#ifdef NETWORKSTATS

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一线二线三线视频| 成av人片一区二区| 99re热这里只有精品视频| 2022国产精品视频| 国产精品资源网| 国产日韩欧美精品电影三级在线| 国产精品小仙女| 亚洲欧美一区二区久久| 欧美午夜视频网站| 久久不见久久见免费视频1| 久久青草欧美一区二区三区| 99国产精品久| 日本一道高清亚洲日美韩| 久久蜜臀精品av| 欧美影院一区二区| 理论片日本一区| 国产精品久久久久久久久搜平片| 色网站国产精品| 久久国产三级精品| 中文字幕视频一区| 欧美精品乱人伦久久久久久| 激情六月婷婷久久| 一区二区在线观看av| 精品国产免费视频| 欧美自拍丝袜亚洲| 韩国精品一区二区| 亚洲国产一区在线观看| 国产日韩欧美电影| 3d成人h动漫网站入口| 国产91丝袜在线播放0| 香蕉av福利精品导航| 亚洲国产精品成人综合色在线婷婷| 在线影院国内精品| 成人性色生活片| 蜜桃av一区二区| 亚洲在线中文字幕| 中文字幕一区二区5566日韩| 国产性色一区二区| 欧美性大战久久久| 成人免费毛片app| 精品无码三级在线观看视频| 亚洲国产精品一区二区www| 中文字幕成人av| 久久日韩精品一区二区五区| 91麻豆精品91久久久久同性| 在线观看日韩电影| 99精品久久99久久久久| 国产精品一区二区在线观看不卡 | 亚洲欧美日韩国产一区二区三区| 91精品国产色综合久久不卡蜜臀 | 亚洲人成精品久久久久| 欧美videos大乳护士334| 欧美日韩国产一区二区三区地区| 99久久综合精品| 国产91在线观看丝袜| 国模少妇一区二区三区| 久久国产欧美日韩精品| 日本中文在线一区| 日本sm残虐另类| 日韩福利电影在线观看| 天堂va蜜桃一区二区三区| 亚洲愉拍自拍另类高清精品| 中文字幕一区二区三区蜜月| 国产亚洲精品精华液| 久久久精品免费网站| 久久综合五月天婷婷伊人| 精品免费视频.| 久久久精品影视| 国产精品视频在线看| 最新国产の精品合集bt伙计| 亚洲蜜臀av乱码久久精品蜜桃| 国产精品国产三级国产aⅴ无密码| 亚洲国产精品t66y| 一色屋精品亚洲香蕉网站| 专区另类欧美日韩| 亚洲一区在线电影| 男女视频一区二区| 国产一区美女在线| www.欧美精品一二区| 色欧美日韩亚洲| 欧美一区午夜精品| 国产日韩精品久久久| 专区另类欧美日韩| 青青国产91久久久久久| 国产高清精品在线| 91久久久免费一区二区| 67194成人在线观看| 久久久久久久电影| 亚洲午夜激情av| 久久99久久久欧美国产| 成人涩涩免费视频| 欧美亚男人的天堂| 久久新电视剧免费观看| 亚洲美女视频在线观看| 日韩avvvv在线播放| 懂色av一区二区夜夜嗨| 欧美亚洲综合久久| 国产网站一区二区| 午夜电影一区二区| 丁香婷婷深情五月亚洲| 欧美高清视频不卡网| 精品国产一区a| 亚洲精品日产精品乱码不卡| 激情成人午夜视频| 欧美亚洲自拍偷拍| 日本一区二区三区高清不卡| 午夜欧美在线一二页| 成人av资源下载| 精品嫩草影院久久| 亚洲国产成人va在线观看天堂| 九色porny丨国产精品| 色欧美片视频在线观看在线视频| 日韩美一区二区三区| 国产精品久久久久一区| 久久精品国产一区二区| 91精品办公室少妇高潮对白| 国产清纯在线一区二区www| 日韩综合一区二区| 日本高清不卡视频| 国产精品毛片无遮挡高清| 久久成人免费日本黄色| 欧美日韩在线播放三区| 一区二区三区.www| 99久久精品99国产精品| 欧美国产一区在线| 国产综合久久久久影院| 欧美一区二区三区成人| 亚洲综合免费观看高清完整版在线 | 婷婷综合在线观看| 91福利社在线观看| 亚洲精品日韩专区silk| 99国产欧美另类久久久精品 | 成人激情黄色小说| 精品福利在线导航| 韩国中文字幕2020精品| 日韩欧美区一区二| 麻豆91在线播放免费| 日韩欧美在线1卡| 老汉av免费一区二区三区| 日韩欧美黄色影院| 毛片av一区二区| 精品国产乱码久久久久久久久 | 精品视频在线免费观看| 亚洲一区二区三区美女| 欧美三级中文字幕在线观看| 亚洲高清视频中文字幕| 9191精品国产综合久久久久久| 肉肉av福利一精品导航| 精品毛片乱码1区2区3区| 国产精品综合在线视频| 国产精品视频看| 91国模大尺度私拍在线视频 | 91精品国产一区二区三区蜜臀| 日韩精彩视频在线观看| 欧美videossexotv100| 国产精品夜夜嗨| 亚洲欧洲在线观看av| 91国偷自产一区二区开放时间 | 亚洲午夜视频在线| 欧美一区二区在线视频| 国产美女精品在线| 亚洲欧洲www| 欧美欧美欧美欧美| 国产麻豆一精品一av一免费| 国产精品久久久久久久久果冻传媒 | 午夜精品久久久久久久久| 日韩视频一区二区三区在线播放| 美腿丝袜一区二区三区| 国产欧美1区2区3区| 一本久久精品一区二区| 青青草97国产精品免费观看无弹窗版| 久久丝袜美腿综合| 日本丰满少妇一区二区三区| 美女爽到高潮91| 国产精品福利电影一区二区三区四区| 欧美性色黄大片| 国产精品自在欧美一区| 亚洲自拍偷拍av| 久久久久九九视频| 欧美日韩一区二区欧美激情| 国产精品羞羞答答xxdd| 午夜免费欧美电影| 国产精品狼人久久影院观看方式| 欧美男女性生活在线直播观看| 国产aⅴ精品一区二区三区色成熟| 亚洲黄色片在线观看| 国产亚洲欧美色| 日韩欧美色电影| 在线观看91视频| av一区二区三区在线| 国产在线播放一区三区四| 亚洲电影一区二区三区| 日韩精品高清不卡| 国产精品国产a级| 欧美一级一区二区| 99精品视频一区| 国产在线播精品第三| 午夜精品久久久久| 亚洲资源在线观看| 亚洲视频在线一区观看|