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

📄 lwippppeasyarm2200smartarm2200.txt

📁 lwip之ppp在EasyARM2200和SmartARM2200上的移植说明文档!
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#define CYGPKG_LWIP_STATS 0

/* ---------- 调试选项 ---------- */
//#define CYGPKG_LWIP_ASSERTS 0

//#define CYGPKG_LWIP_DEBUG 0

//new add by yy
#define LWIP_PROVIDE_ERRNO

//arch/init.c
#define CYGPKG_LWIP_SERV_ADDR 192,168,0,1
#define CYGPKG_LWIP_MY_ADDR 192,168,0,6
#define CYGPKG_LWIP_NETMASK 255,255,255,0
-------------------------------------------------------------------------------------------

/netif/ppp/ppp.c
-------------------------------------------------------------------------------------------
......
while (lcp_phase[pd] != PHASE_DEAD) {
if (pc->kill_link) {
PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d kill_link -> pppStopCB\
", pd));
pc->errCode = PPPERR_USER;
/* This will leave us at PHASE_DEAD. */
tcpip_callback(pppStopCB, arg);
pc->kill_link = 0;
}
else if (pc->sig_hup) {
PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d sig_hup -> pppHupCB\
", pd));
pc->sig_hup = 0;
tcpip_callback(pppHupCB, arg);
} else {
if(!get_dcd_status()){
printf("\
\
\
Lost carrier......!!!\
\
\
");
pppSigHUP(pd); //载波丢失,关闭PPP。 
m_state=MDM_COMMAND;
vbx_pppup = 0;
continue;
}
//////c = sio_read(pc->fd, p->payload, p->len);//保留
//c = sio_read(pc->fd, p->payload, 1);//本版本不支持串口非阻塞方式,若没有读够指定长度字符数则不退出。因此挂起等1个字符。
c=read_queue(p->payload); //我自己设计的串口读API

if(c > 0) {
pppInProc(pd, p->payload, c);
} else {
PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d sio_read len=%d returned %d\
", pd, p->len, c));
sys_msleep(250); /* give other tasks a chance to run */
}
}
}
......
-------------------------------------------------------------------------------------------

/include/arch/cc.h
-------------------------------------------------------------------------------------------
//确定大小端类型
#include 

#if (CYG_BYTEORDER == CYG_LSBFIRST)
#define BYTE_ORDER LITTLE_ENDIAN
#else
#define BYTE_ORDER BIG_ENDIAN
#endif

//定义结构无关类型
typedef unsigned char u8_t;
typedef signed char s8_t;
typedef unsigned short u16_t;
typedef signed short s16_t;
typedef unsigned long u32_t;
typedef signed long s32_t;
typedef unsigned long mem_ptr_t;

//定义编译器字节对齐方式
#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
#define PACK_STRUCT_STRUCT __attribute__((packed))
#define PACK_STRUCT_BEGIN
#define PACK_STRUCT_END

//定义结构相关诊断打印输出
#include 
#include 
//#define LWIP_PLATFORM_DIAG(x) {diag_printf x;}
#define LWIP_PLATFORM_DIAG(x) {}
#define LWIP_PLATFORM_ASSERT(x) {CYG_FAIL(x);}

//定义保护模式
#define SYS_ARCH_DECL_PROTECT(x)
#define SYS_ARCH_PROTECT(x)
#define SYS_ARCH_UNPROTECT(x)
-------------------------------------------------------------------------------------------

/netif/ppp/modem.c
-------------------------------------------------------------------------------------------
int ppp_timeout_num; //num个250ms没有收到串口数据
int ppp_drop_num; //抛包数
long modem_disconnect_num; //每次重连Modem,此变量都加1。

static char cmd_changecode[]={"+++"}; //+++是数据,不是命令
static char cmd_hangup[]={"ATH\\r\
"};
static char cmd_init[]={"ATZE1V1\\r\
"};
static char cmd_pickup[]={"ATH1\\r\
"};
static char cmd_dial[]={"ATDT*99***1#\\r\
"};
static char cmd_cdmadial[]={"ATDT#777\\r\
"};
static char cmd_cdmainit[]={"AT+CRM=1;+CPS=33;+CMUX=1;+CTA=0\\r\
"};

extern char vbx_g_ispnum[20];
extern unsigned char flag_watchdog;

#ifdef TEL_RING
static char tel_ring_flag = 0;
extern char vbx_g_ring;
#endif

ModemState m_state; //Modem状态,命令和数据
MODEMqueue mqueue;
cyg_sem_t semq;

//#define STACK_SIZE 0x1000
static char stack[STACK_SIZE];
static cyg_thread thread_data;
static cyg_handle_t thread_handle;

void modem_init(void * ser)
{
m_state=MDM_COMMAND;

mqueue.num = mqueue.in = mqueue.out = 0;

cyg_semaphore_init(&semq,1); //创建信号量,初始为真。

cyg_thread_create(5, // Priority - just a number
mgetty, // entry
ser, // entry parameter
"mgetty", // Name
&stack[0], // Stack
STACK_SIZE, // Size
&thread_handle, // Handle
&thread_data // Thread data structure
);
cyg_thread_resume(thread_handle); // Start it
}

void modem_driver(void * dev)
{
int len;
int i,t;
char vbuf[50];

ppp_timeout_num=0;
ppp_drop_num=0;
modem_disconnect_num=0;

printf("\
modem_driver\
");
m_state=MDM_COMMAND;

#ifdef TEL_RING
if(vbx_g_ring != 1){//未激活
tel_ring_flag = 0 ;

do{
cyg_thread_delay(100);
printf("Set DTR low...1\
");
set_dtr(0);
cyg_thread_delay(10);

printf("Set DTR high...\
");
set_dtr(1);

cyg_thread_delay(10);
len=sizeof(cmd_hangup)-1;
sio_write(dev, cmd_hangup, len);
cyg_thread_delay(10);
}while(get_dcd_status());

cyg_thread_delay(100);

len=sizeof(cmd_init)-1;
sio_write(dev, cmd_init, len);

printf("Wait Ring...\
");
while(tel_ring_flag == 0){
flag_watchdog = 1;
printf("*");
cyg_thread_delay(100);
}
vbx_g_ring = 1;
WriteVbxRing((unsigned char *)&vbx_g_ring);
}
#endif

t = 0;
modem_begin:
/*
printf("Reset CDMA\
");
reset_cdma();
cyg_thread_delay(1000);
*/
m_state=MDM_COMMAND;

if(t >= 3){
cyg_thread_delay(6000);
}

flag_watchdog = 1;

do{
cyg_thread_delay(100);
printf("Set DTR low...2\
");
set_dtr(0);
cyg_thread_delay(10);

printf("Set DTR high...\
");
set_dtr(1);

cyg_thread_delay(10);
len=sizeof(cmd_hangup)-1;
sio_write(dev, cmd_hangup, len);
cyg_thread_delay(10);
}while(get_dcd_status());

flag_watchdog = 1;
cyg_thread_delay(100);
//------------------------------------------------------------------------------------------------
// 1秒 +++ 1秒 换码序列 
//ATH(0)挂机 
//初始化"ATZE0&C1V1M0&D0&S0&K3"
//ATH1摘机
//------------------------------------------------------------------------------------------------
//初始化"ATZE0&C1V1M0&D0&S0&K3"
//Z复位、恢复保存的缺省文件,E0关闭回显。
//&C1检测到载波时DCD才有效,V1结果码以字符形式显示
//M0关闭扬声器,&D0忽略DTR信号,&S0 DSR一直有效
//&K3允许RTS/CTS流控
//CGCLASS+CGDCONT+CSQ+CGREG+CGATT+CGACT+IPR已经预先写在SIM卡里了。ATZ就可以恢复卡里的配置。
len=sizeof(cmd_init)-1;
printf("\
ATZE1V1\\\\r\\\
(%d)\
",len);
sio_write(dev, cmd_init, len);

cyg_thread_delay(100);

//台湾CDMA初始化
//len=sizeof(cmd_cdmainit)-1;
//printf("\
AT+CRM=1;+CPS=33;+CMUX=1;+CTA=0\\\\r\\\
(%d)\
",len);
//sio_write(dev, cmd_cdmainit, len);
//cyg_thread_delay(500);

#if MODEM_CDMA
//ATDT#777音频拨号,返回CONNECT。
/*
len=sizeof(cmd_cdmadial)-1;
printf("\
ATDT#777\\\\r\\\
(%d)\
",len);
sio_write(dev, cmd_cdmadial, len);
*/
sprintf(vbuf,"ATDT%s\\r\
",vbx_g_ispnum);
len = strlen(vbuf);
sio_write(dev, vbuf, len);
printf("\
%s\
",vbuf);
#else //GPRS
//ATDT*99***1#音频拨号,返回CONNECT。

len=sizeof(cmd_dial)-1;
printf("\
ATDT*99***1#\\\\r\\\
(%d)\
",len);
sio_write(dev, cmd_dial, len);
#endif

cyg_thread_delay(200);///////////////////////

flag_watchdog = 1;

for(i=0;i<5;i++){
if(get_dcd_status()){
printf("Detect carrier!...\
");
break;
}
cyg_thread_delay(50);
}

if(i >= 5){
printf("Redail......\
");
t++;
goto modem_begin;
}

m_state=MDM_DATA;
}

void mgetty(void * dev)
{
unsigned char c,len;
#ifdef TEL_RING
int i;
char buf[100];

i = 0 ;
#endif

do{
len=sio_read(dev,&c,1);
if(len>0){
if(m_state==MDM_DATA)
write_queue(c);
else{
//processcmd;
printf("%c",c);
#ifdef TEL_RING
if(vbx_g_ring != 1){//未激活
if(i < 100 && c != \'\
\'){
buf[i++] = c ;
}
else{
i = 0;
buf[4] = \'\\0\' ;
if(0 == strcmp(buf,"RING")){
tel_ring_flag = 1 ;
}
}
}
#endif
}
}
else
cyg_thread_delay(25);
}while(1);
}

void write_queue(unsigned char c)
{
cyg_semaphore_wait(&semq);

//mqueue.buf[mqueue.num++]=c;
if(mqueue.num < MAX_MODEM_QUEUE){
mqueue.buf[mqueue.in++]=c;
if(mqueue.in >= MAX_MODEM_QUEUE)
mqueue.in = 0 ;
mqueue.num++;
}

cyg_semaphore_post(&semq);
}

int read_queue(unsigned char * buf)
{
int i;

cyg_semaphore_wait(&semq);

/*for(i=0;i for(i=0;i *buf++=mqueue.buf;

mqueue.num=0;
*/
for(i=0;i < mqueue.num && i < 1024;i++){
*buf++ = mqueue.buf[mqueue.out++];
if(mqueue.out >= MAX_MODEM_QUEUE)
mqueue.out = 0;
}
mqueue.num = mqueue.num - i;

cyg_semaphore_post(&semq);

return i;
}


//------------------------------------------------
bool get_dcd_status(void) //DCD为0时有效
{
unsigned short Control;
unsigned char Data;

HAL_READ_UINT16( CYGARC_REG_PDCR , Control ); 
Control = ( Control & 0xffcf ) | 0x0020;
HAL_WRITE_UINT16( CYGARC_REG_PDCR, Control );
HAL_READ_UINT8( CYGARC_REG_PDDR, Data );
Data = Data & 0x04;
if(Data == 0) return true;
else return false;
}


void reset_cdma(void)
void set_dtr(unsigned char Level)
-------------------------------------------------------------------------------------------

-----------
| PPP测试 |
-----------
刚开始测试时最好使用NULL-MODEM线连接开发板和Linux系统,使用本地测试,节省费用。
NULL-MODEM接线方式、Linux下PPP server配置(略)

NULL-MODEM PAP 测试
NULL-MODEM CHAP 测试

GPRS PAP 测试
GPRS CHAP 测试

CDMA PAP 测试
CDMA CHAP 测试

-----------
| DNS实现 |
-----------
DNS遵循RFC1034/1035协议

按照协议要求组成一个请求包,然后解析应答包内容就可以从域名得到IP地址。下面有一个示例,一般在单片机里实现的DNS就是指域名到IP转换,不必实现完整协议。在ECOS或LINUX里有源码。

因为对外的IP地址可能动态变化,所以最好用域名,方便用户访问。
可以使用代理网关,或者ADSL,或CDMA等连接公网,关键是得到公网IP才能被访问,否则只能发起主动连接。当得到动态公网IP时,就刷新DNS,用户用DNS就能间接访问到WEB。

www.163.com域名解析实例(2005/03/08 12:45 test by YangYi)

dns send 29 bytes:0,0,1,0,0,1,0,0,0,0,0,0,3,77,77,77,3,31,36,33,3,63,6f,6d,0,0,1,0,1

dns recv 230 bytes:0,0,81,80,0,1,0,6,0,2,0,2,3,77,77,77,3,31,36,33,3,63,6f,6d,0,
0,1,0,1,c0,c,0,5,0,1,0,0,3a,c9,0,1d,3,77,77,77,5,63,61,63,68,65,5,73,70,6c,69,74
,7,6e,65,74,65,61,73,65,3,63,6f,6d,0,c0,29,0,1,0,1,0,0,8,60,0,4,ca,6a,a8,6d,c0,2
9,0,1,0,1,0,0,8,60,0,4,ca,6a,a8,79,c0,29,0,1,0,1,0,0,8,60,0,4,ca,6c,24,99,c0,29,
0,1,0,1,0,0,8,60,0,4,ca,6a,a8,67,c0,29,0,1,0,1,0,0,8,60,0,4,ca,6a,a8,68,c0,33,0,
2,0,1,0,0,40,a0,0,c,9,6e,73,2d,73,70,6c,69,74,32,c0,39,c0,33,0,2,0,1,0,0,40,a0,0
,c,9,6e,73,2d,73,70,6c,69,74,31,c0,39,c0,a2,0,1,0,1,0,0,3a,be,0,4,ca,6a,ba,7d,c0
,ba,0,1,0,1,0,0,3a,b0,0,4,ca,6a,a8,4f

PASS:

name = "www.163.com" <-----> IP = 202.106.168.109

--------------------------
| 《ecos增值包》二次开发 |
--------------------------
《ecos增值包》提供了lwip的运行平台库和调试开发环境,包括串口驱动、线程、内存管理、信号量、时间管理等丰富的API函数。
在ecos平台上移植lwip的感觉是非常方便,不用改造现有的API函数,该有的功能都有,可以专注于移植工作。
ecos应用程序可以直接访问硬件,这使得用户绕过程序库移植CF卡、SD卡、USB等驱动到ecos上成为可能,同时还可以借助ecos现成的功能简化设计,实在是一个非常好的快速验证平台和二次开发平台。

⌨️ 快捷键说明

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