热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

27.LinuxDM9000C网卡移植(详解)

上一节我们学习了: 网卡驱动介绍以及制作虚拟网卡驱动: http:www.cnblogs.comlifexyp7763352.html接下来本节,学习网卡芯片DM9000C,如何编


上一节 我们学习了:  


网卡驱动介绍以及制作虚拟网卡驱动:  http://www.cnblogs.com/lifexy/p/7763352.html


接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。


1.首先来看DM9000C原理图


如下图所示:



( #:表示低电平有效)



  • SD0~15:  16位数据线,有CMD引脚决定访问类型

  • CMD:       命令线,当CMD为高,表示SD 传输的是数据,CMD为低表示传输的是地址

  • INT:          中断引脚,接在2440的GPF7脚上

  • IOR#:       读引脚,接在2440的nOE脚上

  • IOW#:      写引脚,接在2440的nWE脚上

  • CS#:        片选,放在2440的bank4的片选上面


1.1其中2440手册的bank4地址区间如下图:



bank4的区间位于: 0X20000000~0X28000000 ,当我们访问这个区间的地址,内存控制器便会使能网卡DM9000C的使能脚,所以我们的DM9000C的io基地址 =0X20000000


其中DM9000C的CMD引脚接在 bank4 的LADDR2上面


所以当访问的 io基地址=0X2000 0000 ,表示读写的地址里的内容是DM9000C的地址


访问的 io基地址=0X2000 0100 ,表示读写的地址里的内容是DM9000C的数据


1.2 DM9000C收发过程


当DM9000C收到外部的数据后,会暂存到内部地址中,然后产生一个上升沿中断,等待2440读取数据


当DM9000C将2440的数据转发出去后,也会产生一个上升沿中断给2440


如下图所示,DM9000C的中断引脚位于pin34脚




接在2440的GPF7引脚上,使用的中断为 EINT7


接下来便来修改厂家提供的DM9000C源代码


2.发现它的init_module()入口函数前有个条件编译



所以要注释掉  “#ifdef MODULE” “#endif”


3.修改入口出口函数名,并修饰它们(修改函数名避免与内核的其它函数重名)





4.修改驱动的硬件相异性(设置基地址,寄存器,中断等)


4.1先来找找代码在哪里初始化DM9000C硬件的


进入dm9000c_init()


-> dmfe_probe()


其中dmfe_probe()函数如下:



struct net_device * __init dmfe_probe(void)
{
struct net_device *dev;
dev= alloc_etherdev(sizeof(struct board_info)); //分配一个net_device结构体
... ...
err = dmfe_probe1(dev); //调用dmfe_probe1()函数
... ...
err = register_netdev(dev); //向内核注册net_device结构体
... ...
}

显然dmfe_probe1()函数就是用来初始化DM9000C硬件和设置net_device结构体的成员用的


4.2 进入dmfe_probe1()函数


如下图,这个iobase 变量就是我们DM9000C的 io基地址0x20000000



iobase的作用:


如上图, 读一次DM9000C的VID低字节之前,需要先将地址赋为0x20000000,也就是将DM9000C的CMD置0,然后向0x20000000写入要读的 DM9KS_VID_L 地址值


最后再将地址+4,也就是赋为0x20000100,将CMD置1,然后读出0x20000100的值,也就是DM9000C的 VID低字节


DM9000C的读写方式都是这样的,先将CMD置0,写入DM9000C的地址,然后再将CMD置1,来读写数据


4.3所以在init函数中便重新设置iobase 变量,其中iobase是i nt型



并在exit出口函数中,添加 iounmp()



4.4 继续进入dmfe_probe1()函数,往下看


如下图所示,屏蔽红框里的代码,该代码用来核对版本,我们的DM9000C版本号不一样,所以 要屏蔽



4.5 在init函数中,修改中断名,将irq改为IRQ_EINT7



4.6 修改中断


当使用了register_netdev()注册了网卡驱动net_device后,在内核中使用ifconfig就会进入net_device->open成员函数申请中断,激活队列等


所以我们要修改open成员函数的申请中断函数,将触发中断改为 “IRQT_RISING” ,上升沿触发



5. 接下来便开始设置2440 的存储控制寄存器


设置2440的bank4的硬件位宽,时序,因为不同的硬件,涉及的数据收发都不同,


5.1设置BWSCON总线宽度控制寄存器


我们只设置 BANK4 的内容,所以只有下面3个 (BANK0的位宽由OM[1:0] 硬件设置)



设置 ST4=0 ,不使用UB/LB(UB/LB:表示高字节与低字节数据是否分开传输)


设置 WS4=0 ,其中WAIT引脚为PE4,而我们DM9000C没有引脚接入PE4,所以禁止


设置 DW4=0x01 ,我们的DM9000C的数据线为16位


5.2设置BANKCON4控制寄存器



设置这些时序之前,首先来看DM9000C芯片手册时序图和2440的时序图



参考上图,得出 BANKCON4 寄存器设置如下(HCLK=100MHZ,1个时钟等于10ns)


设置 Tacs=0, CS和CMD信号可以同时进行(CMD脚就是2440的地址引脚)


设置 Tcos=T1=0 (CS片选使能后维持时间)


设置 Tacc=T2=0 ,要>=10ns(读写信号的访问维持时间)


设置 Tcoh=T4=1 ,要>=3ns(片选结束维持时间)


设置 Tcah=T8=0 , CS和CMD信号可以同时结束(地址总线结束维持时间)


代码如下图, 在init 入口函数中设置



与硬件相关的部分已经改好了, 接下来开始编译


6.编译测试


编译之前,首先添加该驱动需要的内核头文件:



#include
#include
#include
#include
#include

编译无误后,便开始测试DM9000C驱动程序:


1) 把dm9dev9000c.c放到内核的drivers/net目录下,来 替换 原来内核的DM9000C


2)  修改 drivers/net/Makefile 



obj-$(CONFIG_DM9000) += dm9000.o


改为 (如下图所示)


obj-$(CONFIG_DM9000) += dm9dev9000c.o



3)  make uImage


如下图,说明新的驱动已编译进内核



4)  使用新内核启动


ifconfig eth0 192.168.2.107


ping 192.168.2.1


如下图,可以ping通,说明移植成功





推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • IIS 7及7.5版本中应用程序池的最佳配置策略与实践
    在IIS 7及7.5版本中,优化应用程序池的配置是提升Web站点性能的关键步骤。具体操作包括:首先定位到目标Web站点的应用程序池,然后通过“应用程序池”菜单找到对应的池,右键选择“高级设置”。在一般优化方案中,建议调整以下几个关键参数:1. **基本设置**: - **队列长度**:默认值为1000,可根据实际需求调整队列长度,以提高处理请求的能力。此外,还可以进一步优化其他参数,如处理器使用限制、回收策略等,以确保应用程序池的高效运行。这些优化措施有助于提升系统的稳定性和响应速度。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • PyFasterRCNN配置详解与优化指南
    本文主要讲解Faster-RCNN的配置过程,以及配置过程中遇到问题的解决方案。 1.下载工程gitclone--recursivehttps:github.comr ... [详细]
  • 简书: https:www.jianshu.comp5c3938ce2cf61.官网下载https:nginx.orgendownload.html  2.上传CentOS服务略3 ... [详细]
  • ubuntu下基于c++的opencv学习
    一、环境配置1、安装opencv2、makefile编写makefile模板,与c文件在同一个目录下,用make指令生成可执行文件,然后运 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
author-avatar
go800li
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有