基于S3C2440和DM9000移植LWIP

发布者:MysticGarden最新更新时间:2024-07-09 来源: elecfans关键字: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驱动所要实现的内容。

基于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上便可以投入使用了。


关键字:S3C2440  DM9000  移植LWIP 引用地址:基于S3C2440和DM9000移植LWIP

上一篇:ARM9 S3C2440 定时器中断
下一篇:linux-3.0内核移植到fl2440开发板(以MINI2440为模板)

推荐阅读最新更新时间:2024-11-12 13:20

s3c2440裸机-LCD编程-1-LCD硬件原理
1.LCD示意图 下图是LCD示意图,里面的每个点就是一个像素点。 它里面有一个电子枪,一边移动,一边发出各种颜色的光。用动态图表示如下: 电子枪是如何移动的? 有一条CLK时钟线与LCD相连,每发出一次CLK(高低电平),电子枪就移动一个像素。 颜色如何确定? 由连接LCD的三组线RGB三原色混合而成:R(Red)、G(Green)、B(Blue)确定。 电子枪如何得知应跳到下一行? 有一条HSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到下一行,该信号叫做行同步信号。 电子枪如何得知应跳到原点? 有一条VSYNC信号线与LCD相连,每发出一次脉冲(高低电平),电子枪就跳到原点,该信
[单片机]
<font color='red'>s3c2440</font>裸机-LCD编程-1-LCD硬件原理
S3C2440 体系结构图
ARM bank: Arm State 寄存器: Thumb State 寄存器: CPRS 寄存器: 模式控制 M0-M4: PC 值计算: 大小端: 中断向量:
[单片机]
s3c2440时钟频率设置
时钟源选择 在nRESET的上升沿锁存OM 引脚,两个引脚在原理图中都接地,所以都为低电平。所以MPLL的时钟源来源于晶振;UPLL的时钟源也来源于晶振。 2. 配置流程 t1时刻:上电后,晶振起振,FCLK直接由晶振产生; t2时刻:nRESET拉高,OM 被所存,晶振作为MPLL与UPLL的输入,但是由于MPLL与UPLL还未配置,所以FCLK还是工作于晶振时钟; t3时刻:软件设置PLL CONTROL REGISTER (MPLLCON & UPLLCON)寄存器,配置MDIV、PDIV、SDIV的值,决定MPLL与UPLL的输出频率;紧接着设置CLOCK DIVIDER CONTROL (CLKDIVN)寄存器,
[单片机]
S3C2440 RTC实时时钟 驱动分析以及使用(三十)
RTC驱动分析总结: driversrtcrtc-s3c.c s3c_rtc_init platform_driver_register s3c_rtc_probe rtc_device_register( s3c , &pdev- dev, &s3c_rtcops, THIS_MODULE) rtc_dev_prepare cdev_init(&rtc- char_dev, &rtc_dev_fops); rtc_dev_add_device cdev_add linux中的rtc驱动位于drivers/rtc下,里面包含了许多开发平台的RTC驱动,我们这里是以S3C24XX为主,所以它的RTC驱
[单片机]
<font color='red'>S3C2440</font> RTC实时时钟 驱动分析以及使用(三十)
s3c2410与s3c2440的全方位对比
1. 最高主频不相同:2410为200M,2440为400M。 我们在用这两款处理器时,一般使用的主频是不相同的,而这个不相同,不仅影响是的运行的速度,最主要的是会影响一些外设(如串口)的时钟,这些外设的时钟如果不正确,就会出现问题。 又比如内存总线设置,2410 和 2440 主频不一样,总线定时所要求的时钟数也会不一样。 ---------------------------------------------------------------------------- 2. MPLL和UPLL的计算公式不相同:2440的MPLL是2410的两倍;2440的MPLL计算与UPLL的计算不相同。 2
[单片机]
基于S3C2440的嵌入式Linux根文件系统构建
嵌入式Linux早已成为IT界家喻户晓的一个名字,使用Linux进行嵌入式产品开发有一个很大的优势,就是开发资源丰富,且成本低廉,嵌入式Linux操作系统越来越受到重视,其应用也越来越广泛。而文件系统作为操作系统的重要组成部分,用于控制对数据文件及设备的存取,提供对文件和目录的分层组织形式,数据缓冲以及对文件存取权限的控制。根文件系统一直是Linux系统不可或缺的组件,在嵌入式Lin-ux中,内核在启动期间进行的最后操作之一就是安装根文件系统。Busybox是构建嵌入式Linux根文件系统的软件,用它制作根文件系统简单、方便,而且设置灵活。 1 根文件 Linux要在一个分区上存放系统启动所必需的文件,如内核映像文件、内核
[单片机]
基于<font color='red'>S3C2440</font>的嵌入式Linux根文件系统构建
S3C2440使用bin文件机器码点灯
S3C2440芯片手册导读 https://blog.csdn.net/qq_28258885/article/details/111461640 这次我们先点亮另外一个LED灯,于是先阅读芯片手册 这次配置LED2, 那么我们将GPFCON的 设置成01,也就是0x400 编程 /* *点亮LED:GPF4 */ .text //表明它是代码段 .global _start _start: /*配置GPF4为输出引脚 *把0x100写到地址0x56000050上,熄灭led */ ldr r1, =0x56000050 /*将这个地址存放到r1中*/ ldr r0, =0x400 /*或者使
[单片机]
<font color='red'>S3C2440</font>使用bin文件机器码点灯
Jlink + ADS调试 S3C2440
我只会在SDRAM中调试,说一下: ADS 项目属性设置: -ro-base = 0x30000000 entry 0x30000000 Init Section: 2440init.o Init AXD下需要加载一个SDRAM初始化文件。 AXD下-- Option- Config Interface- session file- run configuration script. 选择一个初始化文件,内容如下: Setmem 0x53000000 0x00000000 32 Setmem 0x4A000008 0xFFFFFFFF 32 Setmem 0x4A00001C 0x000007FF 32 Setmem 0x53
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved