11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序

发布者:西周以前的最新更新时间:2022-05-26 来源: eefocus关键字:S3C2440  linux  网卡驱动 手机看文章 扫描二维码
随时随地手机看文章

我们实现了一个虚拟网卡驱动程序,现在我们针对真实的网卡芯片DM9000C,编写移植DM9000C网卡驱动程序。


一、移植分析

协议类的驱动,我们的主要工作往往是将现有的驱动和我们的硬件所匹配起来。协议类的函数往往已经成型不需要我们去修改和编写。比如发包函数:hard_start_xmit函数和netif_rx上报函数都不需要我们编写。网络驱动是针对很多硬件编写出来的,我们使用的是什么硬件CPU,比如ARM9,以及我们使用的系统版本。我们只需要修改驱动,告诉驱动现在的硬件情况是怎么样的,基地址是多少,中断引脚是哪个、设置下内存管理器以满足时序等等。这也是网络驱动移植的简单之处。


(1)DM9000C


一般一款网卡芯片,出厂的时候会有厂家自带的驱动程序代码,我们只需要在厂家的基础上去修改移植成适合我们CPU和系统的驱动程序。


(2)厂家自带驱动程序分析


入口函数:

init_module--》


dmfe_probe


{


err = dmfe_probe1(dev);


err = register_netdev(dev);


}


显然dmfe_probe1函数在做注册前的设置。

dmfe_probe1


{


/* Search All DM9000 serial NIC */

 do {

 outb(DM9KS_VID_L, iobase);

 id_val = inb(iobase + 4);

 outb(DM9KS_VID_H, iobase);

 id_val |= inb(iobase + 4) << 8;

 outb(DM9KS_PID_L, iobase);

 id_val |= inb(iobase + 4) << 16;

 outb(DM9KS_PID_H, iobase);

 id_val |= inb(iobase + 4) << 24;



dev->base_addr= iobase;

dev->irq= irq;

dev->open = &dmfe_open;

dev->hard_start_xmit= &dmfe_start_xmit;

dev->watchdog_timeo= 5*HZ;

dev->tx_timeout= dmfe_timeout;

dev->stop = &dmfe_stop;

dev->get_stats  = &dmfe_get_stats;

dev->set_multicast_list = &dm9000_hash_table;

dev->do_ioctl  = &dmfe_do_ioctl;


}

iobase、irq需要我们根据硬件CPU去设置。


使用的时候open

需要根据硬件连接,注册中断。

片选合适:CPU发出的地址位于0x20000000-0x28000000之间

修改一下几项 找出相异性

二、移植

(1)注释掉

(2)修改入口出口函数名称

(3)iobase需要设置,入口函数设置最好:

(4)注释掉版本核对

(5)查看中断号

(6)入口函数设置中断号

设置中断触发方式-上升沿触发

(7)编译

(8)加入缺少的头文件

(9)类型转换


(10)基本移植好,但是时序没有和CPU进行匹配,不同硬件,涉及到文件收发,一定有时序要求。因此要设置内存控制器中关于网卡部分的寄存器以满足时间参数。具体设计过程,暂时先不介绍。


Nwe写信号


Noe读信号


地址信号

信号的时间怎么设置内存控制器满足时序?(uboot已经设置过)


int __init dm9000c_init(void)

{

volatile unsigned long *bwscon; // 0x48000000

volatile unsigned long *bankcon4; // 0x48000014

unsigned long val;



iobase = (int)ioremap(0x20000000, 1024);  /* thisway.diy@163.com */

irq    = IRQ_EINT7;                  /* thisway.diy@163.com */


/* 设置S3C2440的memory controller */

bwscon   = ioremap(0x48000000, 4);

bankcon4 = ioremap(0x48000014, 4);


/* DW4[17:16]: 01-16bit

* WS4[18]   : 0-WAIT disable

* ST4[19]   : 0 = Not using UB/LB (The pins are dedicated nWBE[3:0])

*/

val = *bwscon;

val &= ~(0xf<<16);

val |= (1<<16);

*bwscon = val;


/*

* Tacs[14:13]: 发出片选信号之前,多长时间内要先发出地址信号

*              DM9000C的片选信号和CMD信号可以同时发出,

*              所以它设为0

* Tcos[12:11]: 发出片选信号之后,多长时间才能发出读信号nOE

*              DM9000C的T1>=0ns, 

*              所以它设为0

* Tacc[10:8] : 读写信号的脉冲长度, 

*              DM9000C的T2>=10ns, 

*              所以它设为1, 表示2个hclk周期,hclk=100MHz,就是20ns

* Tcoh[7:6]  : 当读信号nOE变为高电平后,片选信号还要维持多长时间

*              DM9000C进行写操作时, nWE变为高电平之后, 数据线上的数据还要维持最少3ns

*              DM9000C进行读操作时, nOE变为高电平之后, 数据线上的数据在6ns之内会消失

*              我们取一个宽松值: 让片选信号在nOE放为高电平后,再维持10ns, 

*              所以设为01

* Tcah[5:4]  : 当片选信号变为高电平后, 地址信号还要维持多长时间

*              DM9000C的片选信号和CMD信号可以同时出现,同时消失

*              所以设为0

* PMC[1:0]   : 00-正常模式

*

*/

*bankcon4 = (1<<8)|(1<<6); /* 对于DM9000C可以设Tacc为1, 对于DM9000E,Tacc要设大一点,比如最大值7  */

//*bankcon4 = (7<<8)|(1<<6);  /* MINI2440使用DM9000E,Tacc要设大一点 */


iounmap(bwscon);

iounmap(bankcon4);

。。。


}


三、代码及测试

(1)驱动代码:


主要为修改的以上内容


(2)makefile



KERN_DIR = /work/system/linux-2.6.22.6

 

all:

make -C $(KERN_DIR) M=`pwd` modules 

 

clean:

make -C $(KERN_DIR) M=`pwd` modules clean

rm -rf modules.order

 

obj-m += dm9dev9000c.o

(3)测试DM9000C驱动程序:

1. 把dm9dev9000c.c放到内核的drivers/net目录下

2. 修改drivers/net/Makefile 

obj-$(CONFIG_DM9000) += dm9000.o

改为

obj-$(CONFIG_DM9000) += dm9dev9000c.o

3. make uImage

   使用新内核启动

4. 

使用NFS启动

ifconfig eth0 192.168.1.17

ping 192.168.1.1   


关键字:S3C2440  linux  网卡驱动 引用地址:11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(二)移植DM9000C网卡驱动程序

上一篇:AT91RM9200Linux移植笔记(二)-移植u-boot-1.1.6
下一篇:11-S3C2440驱动学习(五)嵌入式linux-网络设备驱动(一)虚拟网卡驱动程序

推荐帖子

哪位兄弟有远峰开发板的CE5.0的BSP哦
基于SamArmDvk9Ⅱ开发板,哪位朋友有WinCE5.0的BSP哦??哪位兄弟有远峰开发板的CE5.0的BSP哦可能没人有吧!就是有,可能也没人给你。靠自己吧!远峰开发板带的是4.2的吧5.0有也没人会给你,还是4.2将就点用~~~~那哪位TX有5.0滴经验哦,指点一哈
quuuuok 嵌入式系统
不知算不上stm32vet6Z的硬件BUG
USART3映射方式2(映射到PD8,PD9)时,要先开启AFIO功能,再初始化相关外设后,USART才有效。以下代码是正确的:u32backRcc=RCC-APB2ENR&(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO);//readstatusofrcc_gpiob&rcc_afioRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Per
mary1127 stm32/stm8
科技新品
aifang 移动便携
LaunchPad_实验板触摸感应子卡使用指南
LaunchPad_实验板触摸感应子卡使用指南LaunchPad_实验板触摸感应子卡使用指南
tiankai001 微控制器 MCU
c51程序调用不了头文件啊
写了一个很简单的程序,不知道为什么调用不了头文件啊程序贴上#includereg51.h#includeabsacc.h#defineucharunsignedcharmain(){ucharcont;uchari;bitwrong=0;P1^7=0;P1^6=0;cont=0x8000;i=20;while(i--){xbyte=0x88;
jiaolvming 51单片机
【Follow me第二季第2期】基于Home Assistant的智能温湿度监测系统
本次活动的板卡实物照片:任务1:搭建环境并开启第一步Blink/串口打印HelloEEWorld!板载LED小灯连接到MCUP102引脚。软件流程图:接下来在Arduino环境里控制LED与串口打印://thesetupfunctionrunsoncewhenyoupressresetorpowertheboardvoidsetup(){Serial.begin(115200);//Initializes
慕容雪花 DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

更多开源项目推荐
换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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