首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

lwIP+ucos2移植于S3C2440过程

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里。
继承事业,薪火相传
返回列表