📄 netkernel.c
字号:
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)¶m + 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 + -