基于S3C2440和DM9000移植LWIP(一)
终于开始我的第一篇笔记了。这回要做的事情,是以太网的移植。
使用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驱动所要实现的内容。