【移植驱动到Linux3.4.2内核之一】移植DM9000C网卡驱动

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

之前已经把uboot,内核,文件系统,都移植好了,今天开始我们把第二期写的Linux2.6.22.6内核的驱动程序全部移植到我们新3.4.2内核中去。首先移植网卡驱动程序吧,因为,我们后面需要用到网络文件系统来更简便的学习。

文章目录

    • 1 移植DM9000网卡驱动程序概览
    • 2.移植内核自带的网卡驱动程序
    • 3.移植最新网卡驱动程序(自己写的网卡驱动程序)的步骤
    • 4.最后,我们来设置一下开机直接挂载网络根文件系统:

1 移植DM9000网卡驱动程序概览

一.移植的步骤:

  1. 编译
  2. 解决错误
    2.1 头文件不对:去掉或改名
    2.2 宏不对:改名使用新的宏
    2.3 有些函数没有了:改名使用新函数

2.移植内核自带的网卡驱动程序

在移植之前,首先我们来看一下mini2440(对应的机器ID为:set machid 7CF)中,是如何支持dm9000网卡的。
进入到入口函数,找到结构体:

static struct platform_driver dm9000_driver = {.driver	= {.name    = "dm9000",.owner	 = THIS_MODULE,.pm	 = &dm9000_drv_pm_ops,},.probe   = dm9000_probe,.remove  = __devexit_p(dm9000_drv_remove),
};

一般是通过.name这个成员进行匹配的,搜索字符串“dm9000”,找到如下结构体(在平台文件中:arch\arm\mach-s3c24xx\Mach-mini2440.c):

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_device_eth,找到:


static struct platform_device *mini2440_devices[] __initdata = {&s3c_device_ohci,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_rtc,&s3c_device_usbgadget,&mini2440_device_eth,  //在这里&mini2440_led1,&mini2440_led2,&mini2440_led3,&mini2440_led4,&mini2440_button_device,&s3c_device_nand,&s3c_device_sdi,&s3c_device_iis,&uda1340_codec,&mini2440_audio,&samsung_asoc_dma,
};

然后再搜索:mini2440_devices,找到:

	platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));

这就是把结构体mini2440_devices添加到内核,里面的关于网卡的结构在里面,最终匹配驱动程序,就可以使用驱动程序了。
(这就是所谓的平台设备平台驱动的东西了,把可变的东西抽象出来放到平台相关的文件中定义,而我们的驱动程序,基本上是不需要改变的,它是稳定的内容,我们移植的时候,只需要把平台层可变的相关结构体加上,需要修改的资源,进行修改就可以了)。

而我们用的是smdk2440(对应的机器ID为:set machid 16a),然后我在Mach-smdk2440.c中添加以下函数:

/* lyy 以下为添加* The DM9000 has no eeprom, and it's MAC address is set by* the bootloader before starting the kernel.*//* DM9000AEP 10/100 ethernet controller */#define MACH_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)static struct resource smdk2440_dm9k_resource[] = {[0] = {.start = MACH_SMDK2440_DM9K_BASE,.end   = MACH_SMDK2440_DM9K_BASE + 3,.flags = IORESOURCE_MEM},[1] = {.start = MACH_SMDK2440_DM9K_BASE + 4,.end   = MACH_SMDK2440_DM9K_BASE + 7,.flags = IORESOURCE_MEM},[2] = {.start = IRQ_EINT7,.end   = IRQ_EINT7,.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,}
};static struct dm9000_plat_data smdk2440_dm9k_pdata = {.flags		= (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};static struct platform_device smdk2440_device_eth = {.name		= "dm9000",.id		= -1,.num_resources	= ARRAY_SIZE(smdk2440_dm9k_resource),.resource	= smdk2440_dm9k_resource,.dev		= {.platform_data	= &smdk2440_dm9k_pdata,},
};/* lyy:以上为添加 */

在结构体smdk2440_devices中添加网卡成员:

static struct platform_device *smdk2440_devices[] __initdata = {&s3c_device_ohci,&s3c_device_lcd,&s3c_device_wdt,&s3c_device_i2c0,&s3c_device_iis,&smdk2440_device_eth, /* lyy:添加 */
};

添加头文件:

#include <linux/dm9000.h>  /* lyy:添加 */

然后重新编译内核。成功。烧写新内核:
nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000

然后挂载网络文件系统(挂载之前设置ip,我的是自动设置ip了,所以就shenglve):
mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt

成功挂载网络文件系统。

3.移植最新网卡驱动程序(自己写的网卡驱动程序)的步骤

有时候,内核自带的网卡驱动程序比较老,而我们的硬件有可能比较新,那么我们就不能使用内核的网卡驱动程序了,就需要去移植最新的网卡驱动程序,那么这种类型的,又该如何移植呢?

首先,移植的步骤就主要是改错误的过程,错误较多,这里就不一一列出了(如若需要该网卡驱动程序,可以加最底下我的联系方式),假设我们已经改好的网卡驱动程序为:dm9dev9000c.c,编译也没有错误。我们将它拷贝到内核相关目录:
cp dm9dev9000c.c /work/system/linux-3.4.2/drivers/net/ethernet/davicom/
修改该目录Makefile文件:

#
# Makefile for the Davicom device drivers.
##obj-$(CONFIG_DM9000) += dm9000.o
obj-$(CONFIG_DM9000) += dm9dev9000c.o

然后重新编译内核。烧写,看看网卡是否可以正常使用,以及是否可以挂载网络根文件系统。
nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
mount -t nfs -o nolock,vers=2 192.168.1.101:/work/nfs_root/fs_mini_mdev_new /mnt
可以成功挂载网络根文件系统,所以网卡移植是成功的。

4.最后,我们来设置一下开机直接挂载网络根文件系统:

uboot中设置:set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.101:/work/nfs_root/fs_mini_mdev_new ip=192.168.1.104:192.168.1.101:192.168.1.1:255.255.255.0::eth0:off

ip=192.168.1.104:为单板ip,192.168.1.101:为服务器ip,192.168.1.1为网关,255.255.255.0为子网掩码

然后启动内核:nfs 30000000 192.168.1.101:/work/nfs_root/uImage_net_new; bootm 30000000
这样就可以直接开机启动网络根文件系统了。以后开发就更加方便了。

想一起探讨以及获得各种学习资源加我(有我博客中写的代码的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

位运算实现一些小算法

package com.asiainfo.cem_volte_hbase;/*** ClassName Test* Description 有意思的小算法* Author qianxl* Date 2019-08-02 17:34* Version 1.0**/ public class Test {/*** * param num1 * param num2* description: 写一个函数&#xff0c;求两个整数之和&#xff0c;要求…

关于dhtmlxScheduler的使用说明(ADD EDIT DEL,自定义CelendarBox)

由于比较多朋友询问我的使用问题&#xff0c;所以写一篇简单的使用说明&#xff1a; 可以看回以前相关的文章&#xff1a; 基于dhtmlxScheduler的个人计划... 探讨:OA系统的设计问题. weebox[ PopUp - 弹出窗 对话框 ]weebox是一个基于jquery的弹窗插件dhtmlxScheduler[ Cale…

【移植驱动到Linux3.4.2内核之二】LCD,触摸屏,按键,USB等驱动程序的移植心得总结

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录一移植驱动程序心得体会二移植LCD驱动程序记录三移植按键输入子系统驱动程序四移植触摸屏驱动程序五移植USB驱动程序今天移植了按键&#xff…

idea 解决jar 的冲突

1.maven 组件会自动去除重复的jar 注意&#xff01;灰色是去重的jar &#xff0c;实体颜色是使用的jar; 2.springboot 关于 Class path contains multiple SLF4J bindings.警告的解决 2.1查询jar的依赖结构: 查询出slf4j-log4j12 查询到然后执行exclude https://blog.csdn.ne…

永远要跟比你更成功的人在一起

永远要跟比你更成功的人在一起 (本文只有在月09日可以学习到。) 在你的朋友圈中&#xff0c;如果你是最成功的那一个&#xff0c;你就不会更成功了。 别怕与大人物打交道。最成功的人都是那些最容易与别人相处打交道的人&#xff0c;当你总是与最顶尖的人在一起时&#xff0c;你…

【C++深度剖析教程18】逗号操作符的分析

今天来学习C中的逗号操作符。那么什么是逗号操作符呢&#xff1f; *逗号操作符&#xff08;&#xff0c;&#xff09;可以构成逗号表达式 逗号表达式用于将多个子表达式连接为一个表达式逗号表达式的值为最后一个子表达式的值逗号表达式的前N-1个表达式的值可以没有返回值逗号…

UML 模型

1.五分钟读懂UML类图 https://blog.csdn.net/soft_zzti/article/details/79811923

CRM软件设计评测点与采集测评点

系统架构 在这部分&#xff0c;我们首先会验证参测产品的开发平台以及支持的客户端种类等情况&#xff0c;以便于用户的IT部门了解这些产品的技术基础。同时我们也会考察产品与第 三方管理系统交互的能力&#xff0c;比如是否支持按照各种常见客户信息管理应用的数据格式进行导…

【C++深度剖析教程19】前置操作符与后置操作符

今天来学习C中的前置操作符&#xff08;i&#xff09;与后置操作符&#xff08;i&#xff09;。 一回顾 以前在C语言的理论课程中&#xff0c;我们就学过&#xff0c;前置和后置操作符&#xff0c;有一定的区别&#xff1a; 但是我们可以看到下图&#xff0c;发现前置和后…

吞吐量(TPS)、QPS、并发数、响应时间(RT)

开发的原因&#xff0c;需要对吞吐量&#xff08;TPS&#xff09;、QPS、并发数、响应时间&#xff08;RT&#xff09;几个概念做下了解&#xff0c;查自百度百科&#xff0c;记录如下&#xff1a; 1. 响应时间(RT)   响应时间是指系统对请求作出响应的时间。直观上看&#…

【C++的深度剖析教程20】类型转换函数上

今天来学习类型转换函数。 一回顾 我们学习C语言的时候&#xff0c;都知道&#xff0c;标准的数据类型之间&#xff0c;是可以做类型的转换的。分为隐式类型转换和强制类型转换。那么强制类型转换呢&#xff0c;比较简单。但是隐式类型转换&#xff0c;却存在诸多问题。下面我…

【C++的深度剖析教程21】类型转换函数下

上一篇文章写了关于普通类型转换为类类型的语法与性质&#xff0c;今天我们来看一下&#xff1a;类类型如何转换为普通类型。 一、类型转换函数&#xff1a; C类中&#xff0c;可以定义类型转换函数&#xff0c;类型转换函数用于将类对象转换为其他类型。 语法规则&#xff…

JQuery技巧(转)

转自http://www.cnblogs.com/top5/archive/2010/01/17/1649984.html1.禁用右键菜单$(document).ready(function(){$(document).bind("contextmenu",function(e){return false;});});2.让字体闪烁jQuery.fn.flash function( color, duration ){var current this.css…

自定义链表增,删除,链表逆序

工作时间长了&#xff0c;经常用框架&#xff0c;感觉真的成了coding,建议有时间可以刷一下lettcode 时间一长就会忘&#xff0c;写了大半天&#xff0c;记录一下&#xff0c;理解后再写特别简单&#xff0c;链表逆序看了很多博客&#xff0c;写法各式各样&#xff0c;但是感觉…

【C++深度剖析教程22】继承的概念和意义

今天我们来学习C中的继承的概念和意义。 一、类之间的组合关系 问题&#xff1a;类之间是否存在直接的关联关系&#xff1f; 回答&#xff1a;类之间存在组合的关系&#xff0c;整体与部分的关系。 可以看一下生活中的例子&#xff1a; 下面我们以一个简单的程序来看一下…

前端学习(94):css重置样式

CSS Reset&#xff0c;意为重置默认样式。HTML中绝大部分标签元素在网页显示中都有一个默认属性值&#xff0c;通常为了避免重复定义元素样式&#xff0c;需要进行重置默认样式&#xff08;CSS Reset&#xff09;。举几个例子&#xff1a; 1.淘宝&#xff08;CSS Reset&#xf…

设计模式笔记(24)---访问者模式(行为型)

Gof定义 表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。 动机 在软件构建过程中&#xff0c;由于需求的改变&#xff0c;某些类层次结构中常常需要增加新的行为&#xff08;方法&#xff09;&#xff0c;如果直接…

git 提交遇到error:fail to push some refer to 远程地址(url)

最近项目遇到一个问题&#xff0c;就是git 提交老是报错&#xff0c;但是在其他小伙伴&#xff0c;机器上没有事&#xff0c;调试了半天发现是git 提交时 -m ‘信息不能以“#”号开头’ 参考了下面博客&#xff0c;第一种操作方式&#xff1a; https://www.cnblogs.com/zndxal…

前端学习(95):ps基本操作与图片格式

jpg 色彩比较丰富 gif 动图 png 半透明 psd原始图片

【C++深度剖析教程23】继承中的访问级别

本C课程学习记录&#xff0c;完全来源于狄泰软件学院的相关课程&#xff0c;想一起学习的加我q1126137994或者q群199546072 给你推荐更多相关课程。 今天学习C中继承的访问级别。首先我们思考一个问题&#xff0c;子类是否可以直接访问父类的私有成员&#xff1f;&#xff1f…