Linux2.6.32移植到MINI2440(4)移植+分析DM9000网卡驱动

发布者:幸福满溢最新更新时间:2021-11-10 来源: eefocus关键字:Linux2  6  移植到  MINI2440  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内核其实已经是支持了,我们需要根据mini2440的具体的硬件资源做添加和修改。


首先,明确一下mini2440上dm9000的硬件资源,dm9000是直接挂在s3c2440的bank4上面,连接了16条数据线,1条地址线,这条地址线判断是地址还是数据传输,然后通过16条数据线来传输,也就是复用。


一、添加头文件


   在mach-mini2440.c中:


    添加头文件如下:


    #include


 


二、添加物理基地址宏定义


#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4+0X300)


这个地址是怎么来的呢,这里S3C2410_CS4指的是BANK4的起始地址:0x20000000,后面加上0x300一开始我理解的是,就像我们烧写到sdram的时候虽然sdram挂在0x30000000上,我们烧写的时候还是会留点余地,烧写到0x30008000,这里的0x300和这个是一个意思,但是不超过128M,这样就到下一个BANK去了。


三、添加mini2440_dm9k_resource


static struct resource mini2440_dm9k_resource[]={


    [0] =   {


       .start =   MACH_MINI2440_DM9K_BASE,


       .end   =   MACH_MINI2440_DM9K_BASE+3,


       .flags =   IORESOURCE_MEM


       },


    [1] =   {


       .start =   MACH_MINI2440_DM9K_BASE_4,


       .end   =   MACH_MINI2440_DM9K_BASE+7,


       .flags =   IORESOURCE_MEM


       },


    [2] =   {


       .start =   IRQ_EINT7,


       .end   =   IRQ_EINT7,


       .flags =   IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHEDGE,


       }


};


这个函数是为了填充平台资源,以便和DM9000接口配合起来。


MACH_MINI2440_DM9K_BASE存放的是要发送的地址,MACH_MINI2440_DM9K_BASE+4存放的是要发送的数据,因为是地址和数据复用,所以要分开传送,两次,0代表地址,1代表数据。一个地址需要四个字节传送,所以每次end都要在start基础上+3,这样就是四个字节的大小。数组2则是跟中断有关的资源。


三、设置传送总线位宽


static struct dm9000_plat_data mini2440_dm9k_pdata   =   {


    .flags =   (DM9000_PLATF_16BITONLY|DM9000_PLATF_NO_EEPROM),


    };


四、添加设备注册函数


    static struct platform_device mini2440_device_eth = {


    .name  =   "dm9000",


    .id =   -1,


    .num_resources    =   ARRAY_SIZE(mini2440_dm9k_resource),


    .resource  =   mini2440_dm9k_resource,


    .dev   =   {


       .platform_data    =   &mini2440_dm9k_pdata,


       },


    };


五、添加平台设备函数


    在mini2440_devices[]中:


    static struct platform_device*mini2440_devices[] __initdata = {


    &s3c_device_usb,


    &s3c_device_lcd,


    &s3c_device_wdt,


    &s3c_device_i2c0,


    &s3c_device_iis,


    &s3c_device_nand,


    &s3c_device_eth,


};


六、修改drivers/net/dm9000.c文件


添加头文件:


#ifdefined(CONFIG_ARCH_S3C2410)


#include


#endif


    修改dm9000_init函数:


staticint __init


dm9000_init(void)


{


#if defined(CONFIG_ARCH_S3C2410)


       unsigned intoldval_bwscon  =   *(volatile unsigned int *)S3C2410_BWSCON;


       unsigned intoldval_bankcon4    =   *(volatile unsigned int *)S3C2410_BANKCON4;


       *((volatile unsigned int*)S3C2410_BWSCON)    =    (oldval_bwscon&~(3<<16))|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4;


       *((volatile unsigned int*)S3C2410_BANKCON4)  =   0x1f7c;


#endif


    printk(KERN_INFO "%s Ethernet Driver,V%sn", CARDNAME, DRV_VERSION);


 


    return platform_driver_register(&dm9000_driver);


}


这里:


       unsigned int oldval_bwscon  =   *(volatile unsigned int *)S3C2410_BWSCON;


       unsigned intoldval_bankcon4    =   *(volatile unsigned int *)S3C2410_BANKCON4;


是将两个寄存器的值保存,volatile是防止编译器因为优化省略掉它,要保证每次都去读他的值。


下面首先设置BWSCON,可以查看datasheet:

这里,oldval_bwscon&~(3<<16)是保留原来寄存器的值,但是对16,17位清零,然后|S3C2410_BWSCON_DW4_16|S3C2410_BWSCON_WS4|S3C2410_BWSCON_ST4,这里的三个宏定义如下,在arch/arm/mach-s3c2410/include/mach/regs-mem.h:


    /*bank 4 configurations */


#defineS3C2410_BWSCON_DW4_16      (1<<16)


#defineS3C2410_BWSCON_WS4      (1<<18)


#defineS3C2410_BWSCON_ST4      (1<<19)


所以再对照datasheet就可知,设置总线位宽为16位,使能WAIT,使用UB/LB。


在下面对S3C2410_BANKCON4赋值0x1f7c,这个查看datasheet,可以找到寄存器:

这里0x1f7c分解开来就是:0001 1111 0111 1100,可以自行对照datasheet查看其含义。这里应该是跟时序有关的设置,具体不清楚的可以去网上搜dm9000时序相关的帖子,这里知道其含义,不做深究了。

七、修改dm9000_probe函数


        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);


    }


   


    memcpy(ndev->dev_addr,"x08x90x90x90x90x90",6);


 


    if(!is_valid_ether_addr(ndev->dev_addr))


       dev_warn(db->dev,"%s: Invalid ethernet MAC address. Please "


            "set using ifconfign",ndev->name);


红色字体为添加部分,大概在1463行。这其实添加“软”mac地址,不添加的话,可能无法挂在我们的nfs,很重要的哦。


八、编译测试


    #make menuconfig


    DeviceDrivers à


       Networkdevice support à


           Ethernet(10or 100Mbit) à


              <*>DM9000 support


    #make zImage


转换成uImage烧写到开发板,这里我从nand启动,然后起了yaffs2之后使用ifconfig没有出来东西,然后我修改bootargs,这里我的是:


setenv bootargs console=ttySAC0root=/dev/nfs nfsroot=192.168.1.122:/opt/rootfsip=192.168.1.226:192.168.1.122:192.168.1.122:255.255.255.0:SMDK2440A.arm9.net:eth0:off


然后重新启动,这时候我的nfs就起来了,输出如下信息:


    eth0:link down


    IP-Config: Complete:


    device=eth0, addr=192.168.1.226, mask=255.255.255.0, gw=192.168.1.122,


    host=SMDK2440A, domain=, nis-domain=arm9.net,


    bootserver=192.168.1.122, rootserver=192.168.1.122, rootpath=


    Lookingup port of RPC 100003/2 on 192.168.1.122


    eth0:link up, 100Mbps, full-duplex, lpa 0xDDE1


    Lookingup port of RPC 100005/1 on 192.168.1.122


    VFS:Mounted root (nfs filesystem) on device 0:14.


    Freeinginit memory: 132K


    Pleasepress Enter to activate this console.


    Processing/etc/profile... Done


    / #


    / # ls


    bin      etc     linuxrc  proc     sys     usr


    dev      lib     mnt      sbin     tmp     var


移植分析结束,如有不正确的地方,还请指出来,大家共同进步!

关键字:Linux2  6  移植到  MINI2440  DM9000  网卡驱动 引用地址:Linux2.6.32移植到MINI2440(4)移植+分析DM9000网卡驱动

上一篇:mini2440 dm9000 网卡驱动详解 (三)
下一篇:mini2440_uboot移植笔记

推荐阅读最新更新时间:2024-11-05 20:21

STM32基础7--通用定时器(PWM输出)
通用定时器框图 在通用定时器中,内部结构与基本定时器是不一样的。下面是通用定时器TIM10/TIM11 和 TIM13/TIM14的内部结构,可以看到它支持一个通(TIMx_CH1)道,其他的通用定时器内部结构不一样在于它们支持的通道数。 从图中可以看到,通用定时除了基本的定时(基本定时的作用)功能以外,还支持信号的输入,信号的输出,也多了一个捕捉比较寄存器。 PWM(Pulse Width Modulation—脉冲宽度调制技术) 在一个周期波形中,高电平占整个周期的比例称之为占空比,而高电平宽度通常被称为脉冲宽度。当我们在控制占空比,从而控制电路导通或者关闭时间,从而控制导通的有效电压。由于这个特性,我们在需要控制LE
[单片机]
STM<font color='red'>32</font>基础7--通用定时器(PWM输出)
STM32入门系列-库目录及文件介绍
已经介绍了过了CMSIS标准,ST公司按照这个标准设计了一套基于STM32F10x的固件库,我们可以直接在ST公司的官网进行下载,现在给大家STM32最新固件库v3.5,在网盘上给大家提供了下载包,链接及提取码如下。 链接:http://pan.baidu.com/s/1nuXXLt3 密码:wztk 文件夹介绍 下面就来介绍下库文件的目录及文件。打开下载好的固件库包如下图所示。 下面简单介绍各个文件件及文件的作用。 _htmresc 文件夹:存放ST公司的LOGO图标,这个文件夹不用管。 Libraries 文件夹:在这个文件夹内有两个子目录,CMSIS文件夹用于存放符合CMSIS标准的文件,包括STM32启动文
[单片机]
STM<font color='red'>32</font>入门系列-库目录及文件介绍
掌握这三个思路告诉你如何使用STM32测量频率和占空比
题目 (1)测量脉冲信号频率fo,频率范围为10Hz~2MHz,测量误差的绝对值不大于0.1%。 (2)测量脉冲信号占空比D,测量范围为10%~90%,测量误差的绝对值不大于2%。 使用官方STM32F429 Discovery开发板,主频180MHz,定时器频率90MHz。 思路一、外部中断 这种方法是很容易想到的,而且对几乎所有MCU都适用(连51都可以)。方法也很简单,声明一个计数变量TIM_cnt,每次一个上升沿/下降沿就进入一次中断,对TIM_cnt++,然后定时统计即可。如果需要占空比,那么就另外用一个定时器统计上升沿、下降沿之间的时间即可。 缺陷显而易见,当频率提高,将会频繁进入中断,占用大量时间。而当频
[单片机]
掌握这三个思路告诉你如何使用STM<font color='red'>32</font>测量频率和占空比
STM32单片机学习---PWM输出
实现功能:采用定时器2的通道2,使PA1输出频率1K,占空比40的PWM波形,用PA8随意延时取反led灯,指示程序运行。 首先熟悉一下定时器的PWM相关部分。 其实PWM就是定时器的一个比较功能而已。 CNT里的值不断++,一旦加到与CCRX寄存器值相等,那么就产生相应的动作。这点和AVR单片机很类似。既然这样,我们要产生需要的PWM信号,就需要设定PWM的频率和PWM的占空比。 首先说频率的确定。由于通用定时器的时钟来源是PCLK1,而我又喜欢用固件库的默认设置,那么定时器的时钟频率就这样来确定了,如下: AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时
[单片机]
STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
Ⅰ、概述 上一篇文章讲述的内容是:三通道逐次转换(单次、单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值。 本文讲述三通道DMA连续转换(3通道、软件单次触发),也就是说3条通道只需要一次软件触发就能完成转换,使用DMA保存在数值。 上一篇文章实例是使用间断模式单次触发单条通道采集,本文是使用DMA模式单次触发三条通道采集。使用DMA传输的好处就是效率很高,我们直接读取转换的结果就是了,比如想做的示波器实例就是要求效率很高。 实例实验效果: 本文的实验效果和上一篇文章一样,只是实现的方式不一样 通道1接地、通道2接1.5V电源、通道3接VCC 上一篇文章内容:
[单片机]
STM<font color='red'>32</font>F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
我的单片机驱动ILI9320源码
ili9320.h 1 #ifndef __ILI9320_H__ 2 #define __ILI9320_H__ 3 #include reg52.h 4 5 #define u8 unsigned char 6 #define u16 unsigned int 7 #define uchar unsigned char 8 #define uint unsigned int 9 10 //#define LCD_COLORS_NUM 65536 11 #define LCD_SIZE_X 240 12 #define LCD_SIZE_Y 320 13 14 15 16 //------
[单片机]
基于WinCE6.0的LPC3250串口驱动程序开发
   引 言   Windows CE是一个开放的、可升级、可裁减的32位实时嵌入式操作系统,具有可靠性好、实时性高、内核体积小的特点,广泛应用于工业控制、信息家电、移动通信、汽车电子、个人电子消费品等领域。最新版本Windows Em-bedded CE 6.0于2006年11月发布,其特点有:最大进程数量到32K,且每个进程有最大2 GB的虚拟内存空间;将关键的驱动程序、文件系统和图形界面管理器移到了内核中,大大减少了CPU在内核态和用户态间切换造成的性能损失等。 LPC3250是NXP半导体公司(由Philips公司成立)推出的带有矢量浮点协处理器的ARM926EJ-SCPU内核的微控制器。它具有丰富的外围接口,包括7个
[嵌入式]
意法半导体超低功耗STM32MCU上新,让便携产品轻松拥有惊艳图效
新款STM32U5片上集成矢量图形加速器及大容量SRAM存储器 2024年2月5日, 中国 - 意法半导体推出了集成新的专用图形加速器的STM32*微控制器(MCU),让成本敏感的小型产品也能为用户带来更好的图形体验。 超低功耗MCU STM32U5F9/G9和STM32U5F7/G7集成3MB片上动态存储器(SRAM),可以为图形显示屏提供多个帧缓存区,以节省外部存储芯片。新产品还集成了意法半导体的NeoChromVG图形处理器(GPU),能够实现的图形效果可与更昂贵的高端微处理器相媲美。 新系列STM32U5内置 NeoChromVG图形处理器,是STM32首批支持硬件加速矢量运算的MCU,能够渲染 SVG图像和
[单片机]
意法半导体超低功耗STM<font color='red'>32</font>MCU上新,让便携产品轻松拥有惊艳图效
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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