终于开始我的第一篇笔记了。这回要做的事情,是以太网的移植。
使用mini2440已经有一段时间了。诸如裸机的LED,键盘开关等等等等也都试验过了,uCOS,WinCE也是浅尝了一下。如今想到了以太网。
由于mini2440的板上集成了一个DM9000的网卡,并且在CE系统里面成功的使用以太网与PC连接了。于是自然而然的想,能不能在uCOS下也实现以太网接口呢?
一上来什么都不懂,于是找一些资料,在这里要谢谢焦海波老师所著的嵌入式网络系统设计一书,移植过程中很多资料都来源于这本书。其次是mikenoodle的单片机驱动DM9000网卡一文,里面详细地讲述如何在2440裸机下驱动DM9000网卡。
首先明确我们需要做的事情是什么?为了实现在uCOS下的LWIP协议。我们当然需要一个LWIP协议文件,这些程序文件可以在LWIP官网上下载到。目前最新版本是1.3.0,为了方便我第一次移植,我使用了焦海波老师所使用的1.2.0版本的LWIP。其次是DM9000的网卡驱动,再次就是基于2440的uCOS系统。总结一下,我们需要做以下工作:
1、Lwip
2、uCOS for 2440
3、Driver for DM9000
4、Lwip->Driver for DM9000
其中最后一项是Lwip和DM9000驱动的链接程序,也就是我们通常说的协议与硬件的接口。
Lwip可以从官网上下载,只需要稍微修改一下就可以用于2440;uCOS for 2440很容易也有了,剩下的就是后面两项的实现。
DM9000的驱动我找了好久,最后找到一个2440裸机下面的驱动,但是不确定它是不是符合我的需要。因此我决定先在uCOS下将这个驱动实现一下,也就是将裸机下的驱动移植到uCOS下,不经过Lwip协议,直接测试它的可用性。
说道DM9000的驱动,主要是完成两个任务。一个是按照DM9000网卡的技术要求,向DM9000的各个寄存器里面赋值,以实现DM9000的初始化;另一个就是实现DM9000的收发数据函数。关于DM9000的初始化问题,mikenoodle的博客里面做了具体的讲解,总的来说有以下若干个步骤:
1、激活GPIO0,将其设为输入(input),它是DM9000和内部PHY沟通的一个通道。
2、检测DM9000的ID号,这一步的目的是确定使用的芯片是不是DM9000.
3、检测DM9000的类型,这一步是确定网卡的类型。
4、设置PHY的寄存器,也就是对物理层的参数进行初始化。
5、设置网卡的MAC地址。这一步可以手动设置,也可以使用EEPRAM来设置。
6、激活DM9000,主要是设置中断和接收寄存器。
7、等待链接建立并完成初始化。
应注意的是,对DM9000寄存器的赋值,一般过程是先写入寄存器地址,再写入数据。向DM9000写地址和数据的唯一差别就是,写地址参数的地址是基础地址+300,而写数据参数的地址是基础地址+300+4,从电路模型上看,也就是CMD引脚的高低电平区别。高电平代表写入的是数据,低电平代表写入的是地址。另外,向EEPRAM和PHY寄存器赋值的时候,要先选中EEPRAM或者PHY,再向读写EEPRAM/PHY的寄存器赋值。
初始化之后,下一步的任务就是编写收发驱动程序。收发的实现,其实就是把要发送的数据写到DM9000的发送寄存器中,以及将要接收的数据从接收寄存器中读取出来的过程,跟一般的串口收发过程类似。值得注意的时候,其读写寄存器的过程同样需要先写寄存器地址,在对寄存器进行下一步操作。
需要注意的是,DM9000的接收和发送,都有两个寄存器可以进行操作。一个是接收(发送)递增寄存器,每次读取(发送)一位数据之后,它的地址指针会自动递增一位,另一个是接收(发送)不递增寄存器,每次读取(发送)一位数据之后,该地址指针不递增。
以上就是DM9000驱动所要实现的内容。
基于S3C2440和DM9000实现LWIP(二)
完成了DM9000的驱动,下一步就是将这个驱动和LWIP协议链接起来,并将它放置在ucos系统中。根据焦海波先生在嵌入式网络系统设计一书中的介绍,这个过程主要需要完成三个部分的内容。
1、LWIP初始化和网卡初始化之间的关联。
2、LWIP接收和网卡接收驱动的关联。
3、LWIP发送和网卡发送驱动的关联。
总体思路是这样的:
首先,我们从初始化讲起。在UCOS系统中,我们建立一个任务,这个任务的目的是初始化网络接口。这个任务程序首先调用LWIP中的初始化程序,初始化LWIP用到的邮箱、队列、信号量、堆栈等等的一些参数;紧接着,它将我们在DM9000驱动中设定好的网络地址,MAC地址,网关等PIV4协议需要用到的地址参数打包装入LWIP协议中管理这些地址的数据(结构体);然后它调用网卡初始化程序,初始化DM9000,这个时候,DM9000和外部网络的通道就打通了。
但是这个时候,还不能跟外部网络的其他计算机通信,因为即使网络打通了,由于网络上传输的数据需要符合以太网协议才能被识别,所以我们还需要做下面的两个步骤。就是将LWIP协议中处理各种网络协议的接收(发送)程序和DM9000驱动中的接收(发送)程序关联起来。这个关联有两个方法,一个是使用中断的方法关联,就是在2440设置外部中断,在中断程序中读DM9000的中断状态寄存器ISR,判断是接收还是发送中断,然后利用邮箱或者信号量的功能,引导执行相应的程序。另一种就是利用UCOS的任务功能,建立两个任务,一个负责接收,一个负责发送,采用查询的方式来执行。
别忘了,在做完这一步之后,我们还需要在LWIP的input程序和output程序中,调用DM9000驱动中的接收或发送程序,完成彼此之间的链接。
至此,LWIP在2440上便可以投入使用了。