linux网卡驱动移植

发布者:SereneWhisper最新更新时间:2025-01-20 来源: elecfans关键字:linux  网卡驱动  移植 手机看文章 扫描二维码
随时随地手机看文章

这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层。DM9000A将MAC和PHY做到一起,也可以像IIS设备那样,SOC内有IIS的控制器,而声卡UDA1341放在片外。网卡当然也有这种设计,它是把PHY的下层MAC放入SOC内,片外的是PHY,当然我暂时还没见过这种的。DM9000A的输入是并行的总线,可以和CPU直接IO。而IIS那种需要通过:CPU CORE BUS->I2S控制器->外设。通过对比,应该了解DM9000A怎样进行IO了吧。其中PHY receiver中的AUTO-MDIX控制网卡的自适应,也就是说它能自动检测连接的是什么速度的网络,切换100,10。如果双方都是自适应的,那就依据误码率来选择。图中的EEPROM当然存放的是MAC的地址,那么驱动从哪里得到MAC地址的?1)你手工设置的,然后他给你写入到EEPROM里2)要么就是EEPROM里面应该好了。图中的MII是一种称为媒体独立接口的东西,是为了和PHY连接而设计的。


再来看一下上边这个DM9000A的原理图,它的CMD引脚接在CPU的ADDR2上。这里的地址线和数据线是进行复用的。当CMD为0时,SD0~SD15传的是地址,当CMD为1时,SD0~SD15传的是数据。


DM9000A的驱动作为platform_driver注册到内核中,根据Linux设备驱动模型,还应该有一个platform_device,但是源码里没有这个,这就需要我们自己来添加了,在arch/arm/plat-s3c24xx/devs.c中,添加:


#include    

   

/* DM9000 Net Card */    

static struct resource s3c_dm9000_resource[] = {    

        [0] = {    

        .start = S3C24XX_PA_DM9000,    

        .end   = S3C24XX_PA_DM9000+ 0x3,    

        .flags = IORESOURCE_MEM    

        },    

        [1]={    

        .start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2    

        .end = S3C24XX_PA_DM9000 + 0x4 + 0x3,    

        .flags = IORESOURCE_MEM    

        },    

        [2] = {    

        .start = IRQ_EINT7,    

        .end   = IRQ_EINT7,    

        .flags = IORESOURCE_IRQ    

        },    

        };    

   

        static struct dm9000_plat_data s3c_device_dm9000_platdata = {    

        .flags= DM9000_PLATF_16BITONLY,    

        };    

   

        struct platform_device s3c_device_dm9000 = {    

        .name= 'dm9000',    

        .id= 0,    

        .num_resources= ARRAY_SIZE(s3c_dm9000_resource),    

        .resource= s3c_dm9000_resource,    

          .dev= {    

        .platform_data = &s3c_device_dm9000_platdata,    

          }    

};    

EXPORT_SYMBOL(s3c_device_dm9000);  


注意这里第一个IO内存资源的范围是从S3C24XX_PA_DM9000~ S3C24XX_PA_DM9000+ 0x3,第二个IO内存资源的范围是从S3C24XX_PA_DM9000 + 0x4~ S3C24XX_PA_DM9000 + 0x4 + 0x3。这相当于两个32位的寄存器。一个是地址寄存器,一个是数据寄存器。向地址寄存器中写入0x1相当于选中了offset为1的NCR。向数据寄存器中写入数据他会自动写入TX RAM中。什么是TX RAM在DM9000A的驱动框架源码分析文档中已经解释了,这里就不再赘述。在这个文件中添加了平台设备的资源和平台设备。那么这个平台设备又是什么时候注册进内核的呢?我们继续往下看。在设备列表添加对DM9000A设备的支持,在arch/arm/mach-s3c2440/mach-smdk2440.c文件中,添加红色这一行:


static struct platform_device *smdk2440_devices[] __initdata = {   

    &s3c_device_usb,   

    &s3c_device_lcd,   

    &s3c_device_wdt,   

    &s3c_device_i2c0,   

    &s3c_device_iis,   

    &s3c_device_rtc,   

    &s3c_device_dm9000,   

};  


那么这些platform_device是什么时候注册的呢,看这个文件下边的代码,很明了了,在系统初始化的时候会注册这个设备列表中的每一个设备。


static void __init smdk2440_machine_init(void)   

{   

    s3c24xx_fb_set_platdata(&smdk2440_fb_info);   

    s3c_i2c0_set_platdata(NULL);   

    platform_add_devices(smdk2440_devices, ARRAY_SIZE(smdk2440_devices));   

    smdk_machine_init();   

}    

MACHINE_START(S3C2440, 'SMDK2440')   

    /* Maintainer: Ben Dooks */   

    .phys_io    = S3C2410_PA_UART,   

    .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,   

    .boot_params    = S3C2410_SDRAM_PA + 0x100,   

    .init_irq   = s3c24xx_init_irq,   

    .map_io     = smdk2440_map_io,   

    .init_machine   = smdk2440_machine_init,   

    .timer      = &s3c24xx_timer,   

MACHINE_END 


后修改arch/arm/plat-s3c24xx/include/mach/devs.h,添加:


extern struct platform_device s3c_device_dm9000;  


修改arch/arm/mach-s3c2410/include/mach/map.h 文件


/* DM9000 */   

#define   S3C24XX_PA_DM9000 0x20000000   

#define   S3C24XX_VA_DM9000 0xE0000000 

 


这里设定了网卡的物理地址和虚拟地址,在arch/arm/mach-s3c2410/mach-smdk2410.c中进行静态映射,在static struct platform_device *smdk2410_devices[] __initdata中添加


view plainprint?

 

static struct map_desc smdk2410_iodesc[] __initdata = {   

[0] = {   

.virtual   = (unsigned long)S3C24XX_VA_DM9000,   

.pfn       = __phys_to_pfn(S3C24XX_PA_DM9000),   

.length     = SZ_1M,   

.type     = MT_DEVICE,   

},   

};  

这样在程序中访问S3C24XX_PA_DM9000,S3C24XX_PA_DM9000 + 0x4对应的物理地址,就直接转换到相应的虚拟地址了。至此DM9000A平台设备的添加和IO地址的静态映射完成。然后就是修改DM9000A中的MAC地址等了。


修改drivers/net/dm9000.c 文件,增加3行:


view plainprint?

#include      

#include   

#include   

修改dm9000_probe函数,添加:


unsigned char mac_addr[]={0x00,0x11,0x22,0x33,0x44,0x55};   

static void *bwscon;   

static void *gpfcon;   

static void *extint0;   

static void *intmsk;   

#define BWSCON           (0x48000000)   

#define GPFCON           (0x56000050)   

#define EXTINT0           (0x56000088)   

#define INTMSK           (0x4A000008)   

           

bwscon=ioremap_nocache(BWSCON,0x0000004);   

gpfcon=ioremap_nocache(GPFCON,0x0000004);   

extint0=ioremap_nocache(EXTINT0,0x0000004);   

intmsk=ioremap_nocache(INTMSK,0x0000004);   

                          

writel(readl(bwscon)|0xc0000,bwscon);   

writel( (readl(gpfcon) & ~(0x3 << 14)) | (0x2 << 14), gpfcon);    

writel( readl(gpfcon) | (0x1 << 7), gpfcon); // Disable pull-up   

writel( (readl(extint0) & ~(0xf << 28)) | (0x4 << 28), extint0); //rising edge   

writel( (readl(intmsk))  & ~0x80, intmsk);  


这里主要设置了总线宽度&等待寄存器,设置相应的GPIO引脚为EXINT7,中断为上升沿触发。


在这个函数的最后需要修改:


view plainprint?

if (!is_valid_ether_addr(ndev->dev_addr)) {  

                /* try reading from mac */  

                mac_src = 'chip';  

                for (i = 0; i < 6; i++)  

                        //ndev->dev_addr[i] = ior(db, i+DM9000_PAR);      

                        ndev->dev_addr[i] = mac_addr[i];  

}  

在文件系统中添加网络配置文件,使系统在开机过程中自动完成对网卡的配置


1)在文件系统/etc/net.conf文件中添加内容


IPADDR=192.168.0.105  

NETMASK=255.255.255.0  

GATEWAY=192.168.0.1  

MAC=00:11:22:33:44:55  

 


2)在文件系统/sbin/目录下新建一个可执行的脚本文件net_config,注意文件的权限(可执行)


#!/bin/sh  

echo Try to bring eth0 interface up ...>/dev/s3c2410_serial0  

if [ -f /etc/net.conf ] ; then  

    source /etc/net.conf  

    ifconfig eth0 down  

    ifconfig eth0 hw ether $MAC  

    echo ifconfig eth0 hw ether $MAC >/dev/s3c2410_serial0  

    ifconfig eth0 $IPADDR netmask $NETMASK up  

    echo ifconfig eth0 $IPADDR netmask $NETMASK up >/dev/s3c2410_serial0  

    route add default gw $GATEWAY  

    echo add default gw $GATEWAY >/dev/s3c2410_serial0  

else  

    ifconfig eth0 hw ether 00:11:22:33:44:55  

    ifconfig eth0 192.168.1.105 netmask 255.255.255.0 up  

    route add default gw 192.168.0.1  

    echo ifconfig eth0 hw ether 00:11:22:33:44:55 >/dev/s3c2410_serial0  

    echo ifconfig eth0 192.168.0.105 netmask 255.255.255.0 up >/dev/s3c2410_serial0  

    echo route add default gw 192.168.0.1 >/dev/s3c2410_serial0  

fi  

echo Done > /dev/s3c2410_serial0  

 


3)在文件系统/etc/init.d/rcS文件中添加网络配置语句


/sbin/ifconfig lo 127.0.0.1     #设置本地回环设备的IP地址  

net_config&                #执行上面的net_config文件对网卡进行设置  

 


在文件系统中添加完上述网卡配置信息后重新编译文件系统下载到开发板,系统上电启动后就会对网卡自动配置,并执行#ifconfig命令可以看到网卡的配置信息


测试与主机的通信,开发板的IP地址可以在/etc/net.conf中修改


s5pv210网卡驱动移植:http://www.openedv.com/thread-46879-1-1.html


实际上给内核移植DM9000驱动时,修改的代码不超过到5行,但是为什么这样改,一定要弄明白。 首先看改的代码: 因为板子上DM9000接在BANK1位置,所以在Map.h (archarmmach-s5pv210includemach) 中添加S5PV210_PA_SROM_BANK1的地址定义


......

#define S5PV210_PA_SROM_BANK5 0xA8000000 #define S5PV210_PA_SROM_BANK1 0x88000000 ...... 因为u-boot中已经对DM9000已经初始化了,所以要屏蔽掉Mach-smdkv210.c (archarmmach-s5pv210) 中的初始化代码:

[1] [2]
关键字:linux  网卡驱动  移植 引用地址:linux网卡驱动移植

上一篇:Xboot基础
下一篇:Smart210学习记录------linux串口驱动

推荐阅读最新更新时间:2026-03-20 10:58

linux网卡驱动移植
这里重要的是物理层PHY receiver,MAC(media access control)层,这里与软件中的协议栈不同,在硬件上MAC是PHY的下一层。DM9000A将MAC和PHY做到一起,也可以像IIS设备那样,SOC内有IIS的控制器,而声卡UDA1341放在片外。网卡当然也有这种设计,它是把PHY的下层MAC放入SOC内,片外的是PHY,当然我暂时还没见过这种的。DM9000A的输入是并行的总线,可以和CPU直接IO。而IIS那种需要通过:CPU CORE BUS- I2S控制器- 外设。通过对比,应该了解DM9000A怎样进行IO了吧。其中PHY receiver中的AUTO-MDIX控制网卡的自适应,也就是说它能自
[单片机]
Linux3.4.2移植CS8900网卡驱动到优龙FS2410开发板
一、S3C2410和CS8900的硬件连接 FS2410开发板的原理图我没有找到,但可看参考资料2,里面写的非常详细 二、移植过程 a) 配置内核支持S3C2410 选好Samsung S3C24XX SoCs后,会自动返回到上一级菜单(即前一张图),然后选择: b) 配置内核支持CS89x0网卡 Device Drivers-- Network device support-- Ethernet driver support— c) 修改drivers/net/ethenet/cirrus/cs89x0.c: (1)在文件开头增加以下几行,它们在宏CONFIG_ARCH_S3C24XX
[单片机]
<font color='red'>Linux</font>3.4.2<font color='red'>移植</font>CS8900<font color='red'>网卡</font><font color='red'>驱动</font>到优龙FS2410开发板
linux-2.6.32在mini2440开发板上移植*移植DM9000 网卡驱动
1 设备资源初始化 Linux-2..6.32.2 已经自带了完善的DM9000 网卡驱动驱动(源代码位置:linux-2.6.32.2/ drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相 应的结构表即可,具体步骤如下: 首先添加驱动所需的头文件dm9000.h: #include linux/dm9000.h 再定义DM9000 网卡设备的物理基地址,以便后面用到: /* DM9000AEP 10/100 ethernet controller */ #define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300) 再填充该平台
[单片机]
tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动
一、思路 上一节我们通过DNW将内核、文件系统、设备树文件烧入到内存中,并使用bootm启动内核:bootm0x40600000 0x41000000 0x42000000。因为此时内核并没有SD卡驱动,和EMMC驱动,我们只能直接将系统拷贝至内存中然后启动。当时我们进入文件系统后,并无法挂载外面的网络文件系统,对开发带来很多不便,所以这一节,我们移植网卡,让系统启动后可以挂接虚拟机中的网络文件系统,或者直接挂载虚拟机中的网络文件系统。 实验参考摩斯电码的博客:http://www.cnblogs.com/pengdonglin137/p/5153794.html tiny4412网卡跟DM9000差别很大,DM9000是
[单片机]
tiny4412学习(三)之<font color='red'>移植</font><font color='red'>linux</font>-4.x<font color='red'>驱动</font>(1)支持<font color='red'>网卡</font><font color='red'>驱动</font>
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内核
[单片机]
<font color='red'>Linux</font>2.6.32<font color='red'>移植</font>到MINI2440(4)<font color='red'>移植</font>+分析DM9000<font color='red'>网卡</font><font color='red'>驱动</font>
USB无线网卡Linux驱动移植
  引言   COMFAST CF150NS USB无线网卡使用IEEE802.11n无线技术,无线传输速率最高达150 Mbps。相比传统的54 Mbps IEEE802.11g产品,拥有更高的无线带宽,让局域网内的数据传输更加高效,能有效地减少网络延迟,使语音视频、网络游戏、在线点播更流畅。CF150NS还使用了CCA(Clear Channel Assessment)空频道检测技术,在检测到周边有无线信号干扰时,可自动调整频宽模式,避开信道干扰,使无线信号更加稳定。当干扰消失时,又可自动捆绑空闲信道,充分利用信道捆绑优势,提升无线性能。CF150NS主要技术参数:主芯片Realtek 8188SU,接口USB2.0,频率范围为
[嵌入式]
u-boot-2009.08在mini2440上的移植 增加DM9000网卡驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 u-boot-2009.08版本已经对CS8900、RTL8019和DM9000X等网卡有比较完善的代码支持(代码在drivers/net/目录下),而且在S3C24XX系列中默认对CS8900网卡进行配置使用。而mini2440开发板使用的则是DM9000网卡芯片
[单片机]
jz2440 ----移植自制的USB RTL8188EUS网卡驱动
1:google 下载rtl8188eus的网卡驱动源码 https://github.com/quickreflex/rtl8188eus 2.解压缩下载的文件,把驱动文件rtl8192_8188eus_linux_xxx.tar.gz(xxx是版本号)添加到要编译的内核树里面去 (1)假定你的内核位置为/root/linux-kernel,解压缩驱动文件,并且把解压缩后的驱动文件夹名改为rtl8192eus。 (2)把改好名字的驱动文件夹rtl8192eus复制到/root/linux-kernel/drivers/net/wireless/下。 (3)修改/root/linux-kernel/driver
[单片机]
jz2440 ----<font color='red'>移植</font>自制的USB RTL8188EUS<font color='red'>网卡</font><font color='red'>驱动</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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