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

📄 netkernel.c

📁 一个ARM7 芯片Bootload中几个重要的实用代码。比如DHCP
💻 C
📖 第 1 页 / 共 2 页
字号:

		if ((ip->ippro == IP_PRO_UDP) && (!CompareIP(ip->destIP, _HostIP)))
			return -1;		/* UDP packet for us */
	}
	
	return 0;
}



INT  NET_flush()
{
	if (_NetTerm.state != TCP_CONNECTED)
	{
		if (_NetTerm.tx_head+2 >= TCP_TX_BUF_SIZE)
			_NetTerm.tx_head -= 2;
		return -1;
	}
	
	if (_NetTerm.tx_head == 0)
		return 0;
	//uHALr_printf("NET_flush - %d\n", _NetTerm.tx_head);
	TCP_SendPacket(_NetTerm.tx_buff, _NetTerm.tx_head, TCP_PSH | TCP_ACK, 0);
	_NetTerm.tx_head = 0;
	return 0;
}


extern CHAR TxReady0;
void  NET_putchar(CHAR Ch)
{
	volatile unsigned int i;
	//uHALr_printf("NET_putchar=%c, %d\n", Ch, _NetTerm.tx_head);
	//for(i=0;i<DELAY;i++);
//	while(!TxReady0);
	
//	NET_flush();
	_NetTerm.tx_buff[_NetTerm.tx_head++] = Ch;
//	if( Ch == '\n' )
//		_NetTerm.tx_buff[_NetTerm.tx_head++] = '\r';
	
	NET_flush();


	if( Ch == '\n' )
	{
//		NET_flush();
//		while(!TxReady0);
		//for(i=0;i<DELAY;i++);
		_NetTerm.tx_buff[_NetTerm.tx_head++] = '\r';
		NET_flush();
	}

#if 0	
	if (Ch == '\n')
		_NetTerm.tx_buff[_NetTerm.tx_head++] = '\r';
		
	if ((Ch == '\r') || (Ch == '\n') || 
		(_NetTerm.tx_head + 2 >= TCP_TX_BUF_SIZE) ||
		(_NetTerm.tx_head + 2 >= 1452))
		NET_flush();
#endif		
}



CHAR  NET_getchar()
{
	CHAR	ch;
	
	while ((volatile)_NetTerm.rx_head == (volatile)_NetTerm.rx_tail)
		;
		
	ch = _NetTerm.rx_buff[_NetTerm.rx_head];
	_NetTerm.rx_head = (_NetTerm.rx_head+1) % TCP_RX_BUF_SIZE;
	
	return ch; 
}


INT  NET_kbhit()
{
	CHAR	ch;
	
	if((volatile)_NetTerm.rx_head == (volatile)_NetTerm.rx_tail)
		return 0; 
	else
		return 1;
}





INT  Net_Init(INT dhcp)
{
	_NetTerm.tx_head = _NetTerm.tx_tail = 0;
	_NetTerm.rx_head = _NetTerm.rx_tail = 0;
	_NetTerm.state = TCP_DISCONNECT;
	_NetTerm.my_port = NET_TERM_PORT;
	_NetTerm.seqNum = 0x12345678;

#if USE_SIB
	memcpy((CHAR *)_HostMAC, (CHAR *)_bmSIB.HostMAC, 6);
	memcpy((CHAR *)_HostIP, (CHAR *)_bmSIB.HostIP, 4);
#else
	GetMacAddress(_HostMAC);	
#endif

	if (!_netbuf_ready)
	{
		if (NetBuf_Init() < 0)
			return -1;
		_netbuf_ready = 1;
	}

	if (_mac_inited == 0)
	{
		NIC_InitDriver();
		_mac_inited = 1;
	}
	else
       	Mac_EnableInt();

	NIC_EnableBroadcast();

	if (dhcp)
	{
		if (GetIpByDhcp() < 0)
		{
			//uHALr_printf("DHCP failed!\n");
			NIC_ShutDown();
			return -1;
		}
	}

	return 0;
}




#if 0		/* for debugging */


#define  FALSE  0
#define  TRUE   1


#define vaStart(list, param) list = (CHAR*)((INT)&param + sizeof(param))
#define vaArg(list, type) ((type *)(list += sizeof(type)))[-1]


static void  NU_PutString(CHAR *string)
{
	while (*string != '\0')
	{
		NET_putchar(*string);
		string++;
	}
}



static void  PutRepChar(CHAR c, INT count)
{
	while (count--)
		NET_putchar(c);
}


static void  PutStringReverse(CHAR *s, INT index)
{
	while ((index--) > 0)
		NET_putchar(s[index]);
}


static void  PutNumber(INT value, INT radix, INT width, CHAR fill)
{
	CHAR    buffer[40];
	INT     bi = 0;
	UINT  uvalue;
	UINT16  digit;
	UINT16  left = FALSE;
	UINT16  negative = FALSE;

	if (fill == 0)
		fill = ' ';

	if (width < 0)
	{
		width = -width;
		left = TRUE;
	}

	if (width < 0 || width > 80)
		width = 0;

	if (radix < 0)
	{
		radix = -radix;
		if (value < 0)
		{
			negative = TRUE;
			value = -value;
		}
	}

	uvalue = value;

	do
	{
		if (radix != 16)
		{
			digit = uvalue % radix;
			uvalue = uvalue / radix;
		}
		else
		{
			digit = uvalue & 0xf;
			uvalue = uvalue >> 4;
		}
		buffer[bi] = digit + ((digit <= 9) ? '0' : ('A' - 10));
		bi++;

		if (uvalue != 0)
		{
			if ((radix == 10)
				&& ((bi == 3) || (bi == 7) || (bi == 11) | (bi == 15)))
			{
				buffer[bi++] = ',';
			}
		}
	}
	while (uvalue != 0);

	if (negative)
	{
		buffer[bi] = '-';
		bi += 1;
	}

	if (width <= bi)
		PutStringReverse(buffer, bi);
	else
	{
		width -= bi;
		if (!left)
			PutRepChar(fill, width);
		PutStringReverse(buffer, bi);
		if (left)
			PutRepChar(fill, width);
	}
}


static CHAR  *FormatItem(CHAR *f, INT a)
{
	CHAR   c;
	INT    fieldwidth = 0;
	INT    leftjust = FALSE;
	INT    radix = 0;
	CHAR   fill = ' ';

	if (*f == '0')
		fill = '0';

	while ((c = *f++) != 0)
	{
		if (c >= '0' && c <= '9')
		{
			fieldwidth = (fieldwidth * 10) + (c - '0');
		}
		else
			switch (c)
			{
				case '\000':
					return (--f);
				case '%':
					NET_putchar('%');
					return (f);
				case '-':
					leftjust = TRUE;
					break;
				case 'c':
					{
						if (leftjust)
							NET_putchar(a & 0x7f);

						if (fieldwidth > 0)
							PutRepChar(fill, fieldwidth - 1);

						if (!leftjust)
							NET_putchar(a & 0x7f);
						return (f);
					}
				case 's':
					{
						if (leftjust)
							NU_PutString((CHAR *)a);
						if (fieldwidth > strlen((CHAR *)a))
							PutRepChar(fill,
									   fieldwidth - strlen((CHAR *)a));
						if (!leftjust)
							NU_PutString((CHAR *)a);
						return (f);
					}
				case 'd':
				case 'i':
					radix = -10;
					break;
				case 'u':
					radix = 10;
					break;
				case 'x':
					radix = 16;
					break;
				case 'X':
					radix = 16;
					break;
				case 'o':
					radix = 8;
					break;
				default:
					radix = 3;
					break;      /* unknown switch! */
			}
		if (radix)
			break;
	}

	if (leftjust)
		fieldwidth = -fieldwidth;

	PutNumber(a, radix, fieldwidth, fill);

	return (f);
}



void  NU_printf(CHAR *f, ...) /* variable arguments */
{
	CHAR  *argP;

	vaStart(argP, f);       /* point at the end of the format string */
	while (*f)
	{                       /* this works because args are all ints */
		if (*f == '%')
			f = FormatItem(f + 1, vaArg(argP, INT));
		else
			NET_putchar(*f++);
	}
}


#endif

⌨️ 快捷键说明

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