S3C2440 DM9000C网卡移植(二十六)

发布者:Xiaochen520最新更新时间:2020-07-09 来源: eefocus关键字:S3C2440  DM9000C  网卡移植 手机看文章 扫描二维码
随时随地手机看文章

上一节 我们学习了:


网卡驱动介绍以及制作虚拟网卡驱动:https://blog.csdn.net/xiaodingqq/article/details/81501393


接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。


1、首先来看看DM9000C原理图


如下图所示:


(#表示低电平有效)


SD0~15:16位数据线,有CMD引脚决定访问类型

CMD:命令线,当CMD为高电平,表示SD传输的是数据,当CMD为低电平,表示SD传输的是地址

INT:中断引脚,接在2440的GPF7引脚上

IOR#:读引脚,接在2440的nOE上

IOW#:写引脚,接在2440的nWE上

CS#:片选引脚,放在2440的bank4的片选上面


1.1 其中2440手册的bank4地址区间如下图:


bank4的区间位于:0x2000 0000~0x2800 0000,当我们访问这个区间的地址,内存控制器便会使能网卡DM9000C的使能引脚(被选中了),所以我们的DM9000C的io基地址=0x2000 0000


其中DM9000C的CMD引脚接在bank4的LADDR2上面


比如当在地址0x2000 0000上读写数据时,表示读写的数据是DM9000C的地址


访问的地址0x2000 0004上读写数据时,表示读写的数据是DM9000C的数据


1.2 DM9000C收发过程


当DM9000C收到外部数据后,会暂存到内部地址中,然后产生一个上升沿中断,等待2440读取数据


当DM9000C将2440的数据转发出去后,也会产生一个上升沿中断给2440


如下图所示,DM9000C的中断引脚位于PIN34脚


接在2440的GPF7引脚上,使用的中断为EINT7


接下来便来修改厂家提供的DM9000C源代码 dm9dev9000c.c


2、发现它的init_module()入口函数前有个条件编译


所以要注释掉“#ifdef MODULE”和“#endif”


3、修改入口出口函数名,并修饰它们(修改函数名免与内核的其他函数重名)


4、修改驱动的硬件相异性(设置基地址,寄存器,中断等)


4.1 先来找找代码在哪里初始化DM9000C硬件的


进入dm9000c_init()


-》dmfe_probe()


struct net_device * __init dmfe_probe(void)

{

struct net_device *dev;

... ...

dev= alloc_etherdev(sizeof(struct board_info));//分配一个net_device结构体

    ... ...

err = dmfe_probe1(dev);//设置

... ...

err = register_netdev(dev);//向内核注册net_device结构体

... ...

}

虽然dmfe_probe1()函数是用来初始化DM9000C硬件和设置net_device结构体的成员用的


4.2 进入dmfe_probe1()函数


如下图,这个iobase变量就是我们DM9000C的io基地址0x2000 0000

iobase的作用:


如上图,读一次DM9000C的VID低字节之前,需要先将地址赋为0x2000 0000,也就是将DM9000C的CMD置0,然后向0x2000 0000写入要读的DM9KS_VID_L地址值


最后再将地址+4,也就是赋为0x2000 0100,将CMD置1,然后读出0x2000 0100的值,也就是DM9000C的VID低字节


DM9000C的读写方式都是这样,先将CMD置0,写入DM9000C的地址,然后再将CMD置1来读写数据


4.3 所以在init函数中便重新设置iobase变量,其中iobase是init类型

并在exit出口函数中,添加iounmap()

4.4 继续进入dmfe_probe1()函数,往下看


如下图所示,屏蔽红色下划线的代码,该代码用来核对版本,我们的DM9000C版本号不一样,所以要屏蔽

4.5 在init函数中,修改中断名,将irq修改为IRQ_EINIT7

4.6 修改中断


当使用了register_netdev()注册了网卡驱动net_device后,在内核中使用ifconfig就会进入net_device->open成员函数申请中断,激活队列等


所以我们要修改open成员函数的申请中断,将触发中断改为“IRQT_RISING”,上升沿触发

5、接下来便开始设置2440的存储控制寄存器(Memory Contrller)


设置2440的bank4的硬件位宽,时序,因为不同的硬件,涉及的数据收发都不同


5.1 设置BWSCON,总线宽度控制寄存器


我们只需要设备BANK4的内容,所以只有下面3个(BANK0的位宽由OM[1:0]硬件设置)

设置ST4=0,不使用UB/LB(UB/LB:表示高字节与低字节是否分开传输)


设置WS4=0,其中WAIT引脚为PE4,而我们DM9000C没有引脚接入PE4,所以禁止


设置DW4=0x01,从原理图,我们可知DM9000C的数据线为16位(SD0~SD15)


5.2 设置BANKCON4控制寄存器

设置这些时序之前,首先来看DM9000C芯片手册的时序图和2440的时序图


参考上图,得出BANKCON4寄存器设置如下(HCLK=100MHZ,1个时钟等于10ns)


设置Tacs=0,表示发出片选信号之前,多长时间内要发现地址信号,CS和CMD可以同时结束(bank4地址(也就是CMD)稳定多久后,CS片选才启动)

设置Tcos=T1=0(发出CS片选信号后,多久才能发出读信号nOE)

设置Tacc=T2>=10ns=1,表示读写信号的脉冲长度,2个时钟(access cycle,读写使能后,多久才能访问数据)

设置Tcoh=T4>=3ns=1,表示当读信号nOE变为高电平后,片选信号还要维持多长时间,1个时钟,因为当DM9000C的写信号取消后,数据线上的数据还需要至少3ns才消失;当DM9000C的读信号取消后,数据线上的数据在6ns之内会笑死,取一个宽松值,维持10ns,所以设为01(nOE读写取消后,片选需要维持多长时间)

设置Tcah=0,因为CS和CMD可以同时结束(CS片选变为高电平后,地址(也就是CMD)需要维持多长时间)

 

代码如下图,在init入口函数中设置

(PS:若DM9000C无法驱动,可能是Tacc时间太短,导致读取不到数据,可以将Tacc设大一点)


与硬件相关的部分已经改好了,接下来开始编译


6、编译测试


编译之前,首先添加该驱动需要的内核头文件:


#include

#include

#include

#include

编译无误后,便开始测试DM9000C驱动程序:


1)把已经修改好的驱动程序dm9dev9000c.c放到内核的drivers/net目录下,来替换原来内核的DM9000C


2)修改drivers/net/Makefile



obj-$(CONFIG_DM9000) += dm9000.o

改为(如下图所示)

obj-$(CONFIG_DM9000) += dm9dev9000c.o

3)make uImage


如下图,说明新的驱动已编译进内核

4)使用新内核启动


ifconfig eth0 192.168.1.17


ping 192.168.1.3


如下图,可以ping通,说明移植成功

关键字:S3C2440  DM9000C  网卡移植 引用地址:S3C2440 DM9000C网卡移植(二十六)

上一篇:S3C2440 I2C总线协议 和 I2C总线下的AT24C02存储芯片分析 二十七
下一篇:S3C2440 Nand Flash驱动(分析MTD层并制作NAND驱动)(二十三)

推荐阅读最新更新时间:2024-11-11 03:47

S3C2440微控制器外部中断实验
实验目的:掌握S3C2440微控制器I/O和外部中断的使用方法 实验内容: 用外部中断的方式,实现: (1)按下K11,LED1闪烁2次; (2)按下K12,LED2闪烁2次; (3)按下K13,LED3闪烁2次; (4)按下K14,LED4闪烁2次; (5)按下K15,LED1与LED3一起闪烁2次; (6)按下K16,LED2与LED4一起闪烁2次; 要求使用下降沿触发外部中断。 #include 2440addr.h #include 2440lib.h #define rGPBCON (*(volatile unsigned *)0x56000010) //Port B control #define rGPBD
[单片机]
基于S3C2440芯片和单片机设计压装数据采集系统的设计
引言 随着经济和社会的发展,我国的工业水平和信息技术水平也得到了飞速发展。其中工业中最为常见的零部件组装和装备压装监测设备也得到了不断的改进。压装的过程其实就是按规定的技术要求将零部件进行组培和连接,使之成为半成品或者成品的工艺过程。如图1所示,就是将两个零部件进行过盈无键组装配合,使之牢固结合在一起。工业中很多机械设备都是通过这种压装方式组合到一起的,包括火车轮对、轴承、汽车发动机、变速器、底盘等关键部件。压装的质量决定了以后产品的使用质量和人民的生命财产都息息相关。我们知道压装质量的评判标准,主要是根据压装过程中压力和位移的变化曲线来确定的。而压力位移曲线的获取这就需要由良好的运行稳定的数据采集系统来提供。基于此,本文提出一种
[单片机]
基于<font color='red'>S3C2440</font>芯片和单片机设计压装数据采集系统的设计
韦东山ARM裸机学习笔记——S3C2440的串口驱动编程原理
前言 讲解韦东山JZ2440开发板的串口驱动原理,对韦东山在维基教程串口使用内容的一些补充,串口使用点击这里进入。这里主要讲的是串口驱动的编程思路,如何根据s3c2440的芯片手册编写出最简单的串口驱动。 一、串口的初始化 串口初始化包括引脚初始化、串口时钟初始化和中断模式、波特率配置以及参数配置等。 1、引脚初始化 (1)看JZ2440开发板的原理图,可知UART0的引脚是GPH2(TXD0)和GPH3(RXD0)。 (2)到s3c2440芯片手册295页,看GPHCON(GPH控制寄存器),可以需要把GPH2也就是GPHCON 配置为10,GPH3也就是GPHCON 配置为10。 (3)配置引脚为内部上拉,
[单片机]
韦东山ARM裸机学习笔记——<font color='red'>S3C2440</font>的串口驱动编程原理
基于S3C2440嵌入式Linux系统下的一个DS18B20驱动
用Linux驱动编程的方法写一个DS18B20的温度传感器驱动,从底层采集温度信息。以下乃本人所写的驱动和测试的源码,嵌入式Linux内核版本为2.6.29,硬件平台是友善之臂的QQ2440,DS18B20引脚连接S3C2440的GPIOB1,程序难免存在一定的漏洞,希望大家指出。 #include linux/config.h #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/devfs_fs_kernel.h #include linux/miscdevic
[单片机]
基于<font color='red'>S3C2440</font>嵌入式Linux系统下的一个DS18B20驱动
ARM9_S3C2440学习(七)SDRAM学习总结
1.SDRAM的burst mode SDRAM是一种命令型动作的设备,就算读写资料只有一个也要先下命令才可以用,为了增加工作效率,就产生了一种传送一个命令,写多个数据的模式,这就是burst mode。 burst mode是一种利用内部列地址发生器来工作的高速读写模式,只要设置最开始的列地址,后面的地址就可以通过内部的列地址发生器来自动生成。 2.为什么要做precharge动作? 关闭正在作用的SDRAM bank,算是一种结束命令,后面可以下新的命令。我想这是和SDRAM内部管理有关。(这是从网上查到的,感觉不够详细,也不太理解) 3.自动刷新功能? 动态存储器(Dynamic RAM)都存在刷新问题。这里主要
[单片机]
Linux2.6.32移植到MINI2440(4)移植+分析DM9000网卡驱动
开发环境: 主机:fedora 14 虚拟机:vmware workstation 10 交叉编译工具:arm-linux-gcc 4.3.2 开发板:mini2440(2m nor ,64m sdram,256m nand) 内核版本:linux2.6.32.2 上一篇帖子的uImage可以起yaffs2文件系统,但是起不了nfs,我的yaffs2使用nfs打包来的,换一个内核可以起,bootargs也没有问题,可能是这里网卡没有移植造成的,移植结束之后再看能不能起,因为nfs对后面做驱动开发优势比较大,方便调试看现象,不需要每次都烧写进去,所以还是需要能够起nfs的。DM9000内核
[单片机]
Linux2.6.32<font color='red'>移植</font>到MINI2440(4)<font color='red'>移植</font>+分析DM9000<font color='red'>网卡</font>驱动
s3c2440裸机-电阻触摸屏-4.2-isr设计_支持长按和滑动
1.改进定时器 五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。 #define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc; timer_desc timer_array ; int regi
[单片机]
S3C2440在MDK4.22下使用printf向串口打印调试
背景知识: 串口的基本知识已经在上一篇讲过了。这里重点讲解如何在MDK4.22下使用printf函数,这样的话就可以很方便的打印调试信息,追踪。 这个知识来源于MDK自带的帮助手册。有现成的代码提供。 实现方式有2种,使用标准C库下裁剪合适的函数,使用微库C下裁剪合适的函数。 微库下的情况,在魔术棒那里要勾选上使用微库。然后需要定义如下结构和改写如下函数--FILE stdout fputc ferror。 标准库的情况,也是需要关注FILE stdout fputc ferror。注意网上很多文章说,在标准库下,需要关掉半主机模式,我尝试过,关掉后,需要定义_sys_exit函数,可以达到效果,但是如果不关掉半主机模式,和
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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