标题:
lwIP+ucos2移植于S3C2440过程
[打印本页]
作者:
yuyang911220
时间:
2015-10-21 08:55
标题:
lwIP+ucos2移植于S3C2440过程
一般采用的步骤:
1.深入了解所采用的系统核心
2.分析所采用的C语言开发工具的特点.
3.编写移植代码.
4.进行移植的测试
5.针对项目的开发平台,封装服务函数.
首先,是芯片的中断处理机制,如何开启,屏蔽中断,可否保存前一次中断状态,芯片是否有软中断或陷阱指令
已经将图片移植成功,是一件很快乐的事情.
现在要将网络也加进去,看一看,想什么办法能够办到.
将lwip组织起来:
lwipopts.h
cc.h
timer.h
Timer0_Init(void)
Timer1_Init(void)
Delay10ms(unsigned short T) ;
Undefine_Init(void) ;
volatile 跟const 相反,可能在外界的影响下改变.编译器不再对其进行优化.
关于时钟中断,可有对应的例子,没有什么关系,如果想把这两个合并在一起不太可能,
因为硬件不同罢了.
Timer0
Timer1 所有的都为了ucos-ii //time tick时钟激发.
SYSTEM CLOCK CONTROL ;
Main.c只是测试一个移植了,只能在串行口里输出测试结果,但并不能表示它已经完成了,对lwip移植任务.
/******************************************************************************/
/--------------------------------/
/最后发现这只是一个应用程序嘛:
/还没有到初始化硬件的地步吧.
/--------------------------------/
lwip_Main.c 其中只有一个函数,这个函数就可以完成你所要的lwip?
看看这个lwip_Main做了那些事情:
1.定义ip结构体 struct ip_addr,netmask ,gw ;
2.定义信号量:sys_sem_t sem ;
3. 初始化一些东西.
初始化 TCP/IP 之前为何还需要实始化系统?
IP4_ADDR(&gw,0,0,0,0) ;
IP4_ADDR(&ipaddr,0,0,0,0) ;
IP4_ADDR(&netmask,0,0,0,0) ;
netif = netif_add(&ipaddr,&netmask,&gw,ethernetif_init,tcpip_input) ;
netif_set_default(netit) ;
dhcp_start(netif) ;
或者形如如此的形式,其的IP地址可以设定的.
udpecho_init() ;
但是这里跟本就没有任务,
是否要把此lwip添加到任务里去?
this is for web page ;in httpd file
httpd.h:
httpd_init() ;
httpd_thread() ;
这里的函数很简洁,但是何时使用httpd_init(void) ;
到现在还没有发现,有那些东西需要做的,
没有步骤
App:应用程序没有必要在这里看,
因为其中一些东西,跟本就不必要的
而需要理解其中的实质,怎么把lwip移植成功?
另外可以借助原先一个例子,可以比较读取,看是否已经到了熟习,或者可以用上派场上.
如果说lwip里没有牵涉到硬件问题,那么我们可以把它当一个库来看待
现在要怎么去使用它的函数,
另一方面,怎么样来初始化其对应的网络接口:8019
问题关键不再放在这个上面,应该更有意义的是看LPC2284.h里是怎么去实现的,
然后我们再把它的实现过程移植s3c2440上去,可以看到结果的时候,就是照搬就快成功了.
而在lwip文件夹下的所有文件已经实现了
这里的代码一定是很比较稳定的,已经实现得比较好的.现在是实现它看看怎么样让调用起它来.
**************************************
如果目标板的初始化,
一:在main里可能就只用到那一个函数:
TargetInit() ---在图片例子里也已经完成了.不是必须的.
二:RTL8019
这个是网卡驱动:
要知道网卡的指针是怎么回事:
网卡的地址:
timer0_init()初始是什么事情?
现在关键问题在:s3c2440代替LPC2294
可不可以把这个封装更简单一些,以便使用更方便?
搞清里面的差别,另外看看,为什么要在LPC2294要用到Timer
原来有网卡驱动需要:
处理计时器:
timeout()函数按受两个参数:
第一指向变量的指针,存储了开始时间,
第二:保存了以秒计数的超时时间.当超过超时间时,该项函数触发一个事件,
开始时间中重新写入当前时间并返
并返回一个非0值.
------------------------------------
应该封闭起lwip,它已经跟其它任何初始硬件无,
只要保证调用它的函数能够起作用,正确使用它即可.
没有必要去读它里的任何一个文件,因为它是协议.
如果不对硬件初始化,那是不可能调用到lwip里的函数的.
注意:
1.可能要使用lwIP时,会做成一个任务,
还要给它分配优先级.Task.h
2.Target.c里去初始化网卡. 找出config.h,因为Target.c里只引用了它.但是好像在config.h里并不怎么实现它.
3.虽然Timer很重要,但是我想没有必要把它也拿出来细究,因为不涉及到lwip
4.
没有看到有那个函数调用汉字打点函数,
为何当你调用Lcd_printf()时也可以出现汉字?
Uart_SendString(pUartMsg) ;
lcd.c:一个向lcd里发送,
printf.c一个向串行端口发送.
Nand.c没有被使用到.
最好想法把所有无关的都剥离出来,然后把相关的分成块.
可以像其它一样:
1.初始化 :像 lcd,printf-Uart,[xxx_init()]
2.将那些相应的函数放到任务里.不停执行.
3.将在单独文件里实现函数.
4.函数里去调用lwip协议函数.
-----------------------------------------------------
分作两部分了.一部分是RTL8019,另一部分:lwip
-----------------------------------------------------
5.RTL8019对网卡的实现函数.
6.lwip实现栈,调用其中的函数实现--栈.
------------------------------------
dm9000已经在RTL8019实现,UBOOT已经有对dm9000实现,可以包装一下,
rtl8019_netif
最好就与主板上分离开,
只要网卡对应地址是
权衡那一种更容易达到效果:
rtl8019一般不是在ARM上,没有办法知道其驱动,
而dm9000是驱动,却又没有与lwip建立关系.
包装dm9000一下,
lwip需要的网络接口,初始化接口:
ethernetif_init()
low_level_output()
ethernetif_input()
ethernetif_init()负责网络的接口初始化.底层收发包函数,MAC地址和硬件初始化等.
low_level_output()负责将上层传来的网络包通过DM9000发送出去.
重新包装DM9000驱动
在UBoot 里有DM9000驱动即可用到.
需要以下几个函数:
int dm9000_eth_init(struct netif*db) ;
void dm9000_eth_send(volatile void *,int) ;
int dm9000_eth_send_done(int) ;
int dm9000_eth_rxlen(void);
int dm9000_eth_rx(U8*rdptr,U16 RxLen) ;
int dm9000_drop_frame(U16 RxLen) ;
其中,只有发送和接收两个函数需要改动,
LWIP上层传给low_level_output()的数据包,
将根据MSS和MTU等值切割成一个个的小包,分别填充到链表pbuf里。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0