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