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

📄 slipif.c

📁 LwIP adaptation for Fujitsu MB90f497 and CS8900A Ethernet driver
💻 C
字号:
#include "lwip\debug.h"
#include "lwip\pbuf.h"
#include "lwip\netif.h"
#include "lwip\slipif.h"
#include "lwip\err.h"
#include "lwip\lib.h"
#include "lwip\lcd.h"
//#include <stddef.h>
#include "mb90495.h"
//static u8_t connected=0;



#define SLIP_END     0xc0
#define SLIP_ESC     0xdb
#define SLIP_ESC_END 0xdc
#define SLIP_ESC_ESC 0xdd
static struct netif *slip_netif;
static err_t
slipif_output(struct netif *netif, struct pbuf *p,
	     struct ip_addr *ipaddr);
char const client[6]="CLIENT";
char const server[12]="CLIENTSERVER";
char tx_state=0;
u8_t txbuf[SLIP_BUF_SIZE*4];
u8_t *tx_end_ptr, *tx_ptr;
struct pbuf *if_p, *if_q, *if_tx;
u8_t *ptr;
static u8_t connect_counter=0;

enum slipif_state {
	NOTCONNECTED,
	SENDREPLY,
	REC1,
	REC2,
	READY
	} if_state,storage;

void slipif_init(struct netif *netif) {
    /* serial mode register (mode 0, 9600Baud, SOE enable) */
    SMR1 = 0x11;    /* (00011001) */

    /* UART1 prescaler control register */
    CDCR1 = 0x80;   /* (10000011) div = 1 */

    /* Serial control register */
    SCR1 = 0x13;    /* (00010000) 1 stop bit, datalength 8 */

    SSR1 = 0x0A;    /* (00001010) transfer starts with LSB, Rx and Tx int. enable */


    DDR4 = 0x04;    /* enable SOT1 (00000100) */

	netif->name[0]='s';
	netif->name[1]='l';
	netif->output=slipif_output;
	slip_netif=netif;
	if_p=pbuf_alloc(PBUF_RAW,SLIP_BUF_SIZE,PBUF_RAM);
	if_state=storage=NOTCONNECTED;
	}


static err_t
slipif_output(struct netif *netif, struct pbuf *p,
	     struct ip_addr *ipaddr) {
  struct pbuf *q;
  u8_t cnt;
  tx_end_ptr=txbuf;
	if(if_state==NOTCONNECTED) return ERR_CONN;
	    for(q = p; q != NULL; q = q->next) {
	      bcopy(q->payload, tx_end_ptr, q->len);
	      tx_end_ptr+= q->len;
	    }
       tx_ptr=txbuf;
//SetCur(0,0);
//for(cnt=0;cnt<20;cnt++) {
	// mprintf((float)(tx_end_ptr-tx_ptr),3,0);
//	 Put_Char(' ');
//	}   

	SODR1=SLIP_END;
	SSR1_TIE=1;
	return ERR_OK;

}


void slip() {
#ifdef SLIP_DEBUG
//	SetCur(3,0);
	if(if_state!=storage)
	switch(if_state) {
	case NOTCONNECTED: Put_String("Slip: no conn.\n");
		break;
	case SENDREPLY: Put_String("Slip: conn: reply\n");
		break;
	case REC1: Put_String("Slip: REC1\n");	
		break;
	case REC2: Put_String("Slip: REC2\n");
		break;
	case READY: Put_String("Slip: Recived data\n");	
	}
	storage=if_state;
#endif
	if(if_state!=READY) return;
//	mprintf((float)*((u8_t*)if_p->payload),3,0);
 	if_q=if_p;
	if_p=pbuf_alloc(PBUF_RAW,SLIP_BUF_SIZE,PBUF_RAM);
	ptr=if_p->payload;
	if_p->len=0;
	if_state=REC1;
	slip_netif->input(if_q,slip_netif);
}      	
	

__interrupt void Uart1Reciv(void) {
 u8_t c;
if(SSR1_FRE || SSR1_ORE || SSR1_PE) {
    SCR1_REC=0;
    switch (if_state) {
	 case NOTCONNECTED: connect_counter=0;
		return;
		break;
	 case REC1: case REC2: ptr=if_p->payload;
			       if_p->len=0;
				return;
				break;
	default : return;
		  break;		
	}
	} else {
		c=SIDR1;
		switch(if_state) {
	
		case NOTCONNECTED: if(c!=client[connect_counter]) connect_counter=0;
					else if(connect_counter++!=5) return;
					else { if_state=SENDREPLY;
						connect_counter=0;
						SODR1=server[0];
						SSR1_TIE=1;
						return;
						}	
				   break;

		case SENDREPLY:  break;	

		case REC1:	//if((if_p->len==0) && (c==192)) return; 
				if(c==SLIP_ESC) { if_state=REC2;
						   return; }
				 if(c==SLIP_END) if(if_p->len>0) {
					if_state=READY;
					return;
					} else return;	
				 if(if_p->len < SLIP_BUF_SIZE) {
					 *ptr++=c;
					  if_p->len++;
					  return;
						}
					break;
		
		case REC2:	 switch(c) {
					case SLIP_ESC_END:
					  	c = SLIP_END;
						break;

					case SLIP_ESC_ESC:
						c = SLIP_ESC;
						break;

					default:  ptr=if_p->payload;
			       			if_p->len=0;	
				                break;
					}

                                      if(if_p->len < SLIP_BUF_SIZE) {
					 *ptr++=c;
					  if_p->len++;
					 }
					if_state=REC1;
					return;
					break;	
			case READY:     break;	

				 }
			}
	}


__interrupt void Uart1Transmit(void) {
	if(if_state==SENDREPLY) {

		if(++connect_counter < 12) SODR1=server[connect_counter];
			else {
				connect_counter=0;
				SSR1_TIE=0;
				if_state=REC1;
			}
		} else {
		        if(tx_ptr <= tx_end_ptr) {
				if(tx_state==0) {
				  if(*tx_ptr==SLIP_END) {
					SODR1=SLIP_ESC;
					tx_state=1;
					return;
					}	 
				  if(*tx_ptr==SLIP_ESC) {
					SODR1=SLIP_ESC;
					tx_state=2;
					return;
					}	 

					SODR1=*tx_ptr;
					tx_ptr++;
				};

			     if(tx_state==1) {
				tx_state=0;
				tx_ptr++;
				SODR1=SLIP_ESC_END;
				return;
				}
			     if(tx_state==2) {
				tx_state=0;
				tx_ptr++;
				SODR1=SLIP_ESC_ESC;
				return;
				}
			}	
			else {  SODR1=SLIP_END;
				SSR1_TIE=0;
			     }	
	}
}

⌨️ 快捷键说明

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