基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通

最近有个学生毕业设计需要实现基于ARM的DM9000网卡通信,但是linux2.6.30.4内核已经把DM9000网卡封装好了,这样我们只能将其拿出编译成模块也就是.ko文件进行加载调试。下面讲解下编译步骤和关于DM9000网卡的一些信息。
因为我们从内核中看了dm9000的驱动源代码(/drivers/net/dm9000.c),在最后模块加载函数时候dm9000网卡驱动程序最后加载到了platform虚拟总线驱动上了,所以刚开始我直接编译dm9000驱动,加载没有效果,结果就查资料后来知道了,dm9000是依赖于plagform驱动之上,所以我们单独编译驱动的时候还要注册dm9000在platform之上的设备。
图1 未修改之前的dm9000.c的加载函数
1199  static int __init
1200  dm9000_init(void)
1201  {
1202   printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);
1203
1204   return platform_driver_register(&dm9000_driver); /* search board and register */
1205  }
platform是一个虚拟的地址总线,它主要用于描述SOC上的片上资源。
platform所描述的资源有一个共同点,就是在CPU的总线上直接取址。
因为内核只是封装了platform_driver,所以单独编译DM9000.c网卡还是不可用的。

我们需要注册platform_device,即注册platform设备就可以使用DM9000网卡工作了。

在linux2.6.30.4/include/linux/platform_device.h:


  16struct platform_device {  //这个结构直接和硬件交互
  17 const char * name;
  18 u32 id;
  19 struct device dev;
  20 u32 num_resources;
  21 struct resource * resource;  //所描述的设备的硬件资源
  22};

在 linux+v2.6.30.4/include/linux/ioport.h:


  16 struct resource {
  17         const char *name;  
  18         unsigned long start, end;
  19         unsigned long flags;
  20         struct resource *parent, *sibling, *child;
  21 };

//挂在CPU上的每个独立的设备单元,都需要一段线性的地址空间来描述-查看memory map.

//resource->start描述设备实体在cpu总线上的线性起始物理地址;

//resource->end -描述设备实体在cpu总线上的线性结尾物理地址;

//resource->name 描述这个设备实体的名称,这个名字开发人员可以随意起,但最好贴切;

// resource->flag 描述这个设备实体的一些共性和特性的标志位;

图2 DM9000的芯片

对于DM9000 的resource资源,我们需要知道一下信息:
(1) DM9000的访问基地址:即为nLAN_CS2的基地址。注意要是物理地址。
(2) DM9000只用到一条地址线:LADDR2。
    对于DM9000的CMD引脚:当CMD为低电平时,LDATA0~LDATA15线上传输的是地址信号。
                        当CMD为高电平时,LDATA0~LDATA15线上传输的是数据信号。
(3) DM9000的中断引脚: ENT7。
(4) 总线位宽:这里是16位。
在linux2.6.30.4/driver/net/dm9000.h 添加如下资源

在 linux2.6.17/drivers/net/dm9000.c添加注册platform设备:

static int __init
dm9000_init(void)
{
    printk(KERN_INFO "%s Ethernet Driver\n", CARDNAME);    
    platform_driver_register(&dm9000_driver); /* search board and register */
    platform_device_register(&s3c_device_dm9000); //注册设备 
    return 0;
}

static void __exit
dm9000_cleanup(void)
{
    platform_driver_unregister(&dm9000_driver); //注销驱动
    platform_device_unregister(&s3c_device_dm9000); //注销设备
}

在加载DM9000.ko之前需要mii接口模块和crc32模块。
在linux-2.6.30.4/lib目录下有crc32.ko。
在linux-2.6.30.4/drivers/net/目录下有mii.c。可以将此编译为模块加入到内核。
经过查看这两个模块默认都被编译到内核里面去了,要是没有的话可以编译下。
DM9000的重要驱动是内核提供的源代码。
这里只是简单的增加设备的硬件资源。
下面回到linux内核根目录make menuconfig 将默认的dm9000前面的* 改成M
如图:
回到linux内核根目录make zImage 编译成功会在当前目录下生成一个zImage.bin 文件
make SUBDIR=drivers/net/ modules 将dm9000.c编译成一个dm9000.ko文件
将dm9000.ko拷贝到ARM开发板上加权限 chmod +x dm9000.ko
加载dm9000网卡 insmod dm9000.ko 他会有一个提示语,并且会打印出eth0 相关的信息,这就代表驱动模块加载成功了。
将新添加的网卡挂载起来
ifconfig eth0 up 设定IP 就能ping通了。
希望能帮到您!


基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通相关推荐

  1. linux 2440网卡驱动,Linux-2.6.30平台下移植DM9000网卡驱动到TQ2440

    平台:虚拟机Ubuntu 12.04  内核:linux-2.6.30 开发板:TQ2440 包括编译内核.制作文件系统,到目前可以在虚拟机上可以通过交叉网线可以和开发板互通,用了弄了差不多快两天时间 ...

  2. linux-2.6.30平台下移植DM9000网卡驱动到TQ2440

    平台:虚拟机ubuntu12.04  内核:linux-2.6.30 开发板:TQ2440 包括编译内核.制作文件系统,到目前可以在虚拟机上可以通过交叉网线可以和开发板互通,用了弄了差不多快两天时间吧 ...

  3. 移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植

    移植基于linux-2.6.26.5内核s3c2410触摸屏驱动移植的过程记录下来: (1)首先打一个补丁:s3c2410_touchscreen.patch, 在内核解压的根目录下 patch -N ...

  4. 以太网卡驱动程序移植linux,基于S3C2440的DM9000网卡驱动的移植

    摘  要: 主要研究了基于Linux内核的网卡驱动的移植.Linux网络设备驱动程序的体系结构可以分为4层,首先分析了各层的具体功能实现,并在此基础上充分利用S3C2440开发板完成DM9000网卡驱 ...

  5. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  6. linux 内核 网卡驱动 移植,linux内核移植步骤添加dm9000网卡驱动(设备树).docx

    linux内核移植步骤添加dm9000网卡驱动(设备树).docx LINUX内核移植步骤2015年05月13日星期三上午1105往设备树中添加网卡驱动1.选平台,指定交叉编译工具链1.在MAKEFI ...

  7. arm平台linux的ethtool配置,ARM-Linux驱动--DM9000网卡驱动分析(四)

    原标题:ARM-Linux驱动--DM9000网卡驱动分析(四) 硬件平台:FL2440 (S3C2440) 内核版本:2.6.35 主机平台:Ubuntu 11.04 内核版本:2.6.39 交叉编 ...

  8. 关于linux内核无法编译成模块的解决方法

    在做驱动时,往往想编译成模块,让后加载来使用,这样灵活性较高,无需重新编译内核. 然后在使用供应商提供的内核时,往往无法编译成内核.也就是说把宏设置为y,编译进内核没有问题,但是设置成m编译成模块却不 ...

  9. STM32CubeMX+ETH+DP83848+Lwip 成功ping通(基于stm32F107开发板)

    开发环境说明: STM32CubeMX6.2.1 Keil5 本实验基于开发板STM32F107VCTx 目录 一.实验目的 二.实验步骤 1.创建工程 2.在System Core这一项中进行SYS ...

最新文章

  1. 自动驾驶行业观察 | 停车不再难,L2到L4的泊车辅助系统技术剖析
  2. 【机器学习】什么是机器学习?(上)
  3. DL之Perceptron:Perceptron感知器(感知机/多层感知机/人工神经元)的简介、原理、案例应用(相关配图)之详细攻略
  4. Eclipse新建的Maven项目想修改DynamicWebModule,直接去项目目录下修改
  5. SQL语句的基本语法一
  6. Maven---学习心得---maven的Dependency Mechanism(依赖关系机制)
  7. oracle删除建分区索引,Oracle分区表之创建维护分区表索引的详细步骤
  8. Windows Server 2012 R2 里面如何安装Net Framework 3.5
  9. ios web页面测试方法
  10. 哔哩哔哩2019年Q4及全年财报:全年营收67.8亿元,同比增长64%
  11. Android图片,PNG还是JPG?用哪种?
  12. listen()函数中的SOMAXCONN含义
  13. Windows基本磁盘结构简析(二)——MBR结构分析
  14. C语言编写贪吃蛇小游戏
  15. Flutter系列-flutter路由管理
  16. C# 通过网络和三菱的PLC通信
  17. 【任务分解】 向埃隆·马斯克学习任务分解
  18. 软件(程序)编写通法
  19. 认知计算Cognitive Computing 各章总结
  20. 笔记本WIN7建立共享wifi的简单方法

热门文章

  1. access里面的表达式运用_表达式的示例
  2. Kotlin学习笔记五、控制语句
  3. 从数码宝贝看spring bean的生命周期
  4. html左侧悬浮音乐插件,固定在网页底部的HTML5音乐播放器插件代码
  5. 3.抽象类(shape)
  6. 字节跳动岗位薪酬体系曝光,看完感叹:不服不行,想高薪还得是学这个。。。。
  7. 青岛VR全景制作免费方法教程
  8. 2021-03-19我的博客
  9. H5页面、微页、轻应用、轻app、场景应用制作工具:
  10. 刚挣钱的程序猿同学该怎样花钱?