历史上的今天
返回首页

历史上的今天

今天是:2025年12月20日(星期六)

2022年12月20日 | 基于S3C2440的DM9000网卡驱动的移植

2022-12-20 来源:zhihu

0 引言

  以太网(Ethernet)是一种计算机局域网组网技术。在局域网中,多个节点是共享传输介质的,这就必须由某种机制来决定某个时刻哪个设备占用传输介质来传输数据,因此,局域网的链路层要有介质访问控制的功能,即数据链路层分为逻辑链路控制LLC子层和介质访问控制MAC子层[1]。

  本文主要研究基于S3C2440的DM9000网卡驱动的移植。网络对于嵌入式系统来说是必不可少的,但是S3C2440没有集成以太网接口,所以要想使S3C2440具备以太网的功能,就必须扩展网卡接口。本文选择外接DM9000,使其可以与以太网相连接,并完成DM9000网卡驱动的移植。


1 Linux网络驱动层次

  Linux网络驱动可以划分为4层,即网络协议接口层、网络设备接口层、设备驱动功能层和设备物理媒介层,内核中是通过以dev_base为头指针的设备链表来管理所有的网络设备的。网络设备驱动的编写主要是网络设备net_device的初始化和数据包的收发函数[2]。

  网络协议接口层最主要的功能是给上层协议提供透明的数据包发送和接收接口,当上层的API或IP需要发送数据包时,它将调用网络协议接口层的dev_queue_xmit函数发送一个内容为sk_buff的数据;当上层需要接收数据时,则是通过向netif_rx函数传递一个sk_buff数据结构的指针来完成的[3]。

  网络设备接口层主要是为变化多端的网络定义了一个统一且抽象的net_device,实现了多种硬件在软件层次上的统一。网络设备驱动主要是填充net_device的成员并注册net_device来实现硬件操作函数和内核的挂接。通常情况下,网络设备驱动以中断方式接收数据,而net_device中则定义了poll_controller这种纯轮询的接口方式,以提高Linux在宽带系统上的性能。

  设备驱动功能层中对于具体的设备,工程师应该实现net_device中的open、stop、tx、hard_header、get_stats、tx_timeout、interruppt等函数。

  网络设备媒介层直接对应实际的硬件设备,需要定义一组读写设备内部寄存器的函数,如ior、iow[4]。


2 网络设备驱动移植

  2.1 基于S3C2440的DM9000网卡驱动的移植

  首先看内核DM9000代码,在/driver/net/Makefile查看:

  obj-$(CONFIG_DM9000)+=dm9000.o

  在/driver/net/Kconfig查看:

  menuconfig NET_ETHERNET

  bool "Ethernet (10 or 100Mbit)"

  config DM9000

  tristate "DM9000 support"

  depends on ARM||BLACKFIN||MIPS

  select CRC32

  select MII

  所以配置内核make menuconfig时,需要选中这一项。

  根据开发板电路图知道,DM9000的AEN端口接到了nGCS4上,INT端口接到了IRQ_EINT7上,CMD端口接到了LADDR2上,数据线是SD0~SD15,即数据线的位数是16 bit。

  根据S3C2440地址空间的分配与片选信号的定义知道,引脚nGCS4对应的空间的起始地址为0x20000000,这由系统地址线控制。同时,DM9000使用的中断号是IRQ_EINT7。另外,DM9000上的CMD信号用来控制是地址端口还是数据端口,如果CMD为0,即LADDR2为0,表示访问地址寄存器;当CMD为1,即LADDR2为1,表示访问数据寄存器[5]。


  2.2 DM9000驱动的移植

  在mach-S3C2440.c中添加如下代码:

  #include

  #define MACH_S3C2440_DM9K_BASE(S3C2410_CS4+0x300)

  Static struct resource S3C2440_dm9k_resource[]={

  [0]={//地址端口

  .start=MACH_S3C2440_DM9K_BASE,

  .end=MACH_S3C2440_DM9K_BASE+3,

  .flags=IORESOURCE_MEM

  },

  [1]={//数据端口

  .start=MACH_S3C2440_DM9K_BASE+4,

  .end=MACH_S3C2440_DM9K_BASE+7,

  .flags=IORESOURCE_MEM

  },

  [2]={//中断号

  .start=IRQ_EINT7,

  .end=IRQ_EINT7,

  .flags=IORESOURCE_IRQ|IORESOURCE_IRQ_HIGHEDGE,

  //高电平触发

  }

  };

  Static struct dm9000_plat_data S3C2440_dm9k_pdata={

  //数据线的位数是16 bit,没有使用E2PROM

  .flags=(DM9000_PLATF_16BITONLY|DM9000_PLATF_NO_ EEPROM),

  .dev_addr={0x08,0x90,0x90,0x90,0x90,0x90},

  //MAC地址

  };

  static struct platform_device S3C2440_device_eth={

  .name="dm9000",//设备名

  .id=-1,

  .num_resources=ARRAY_SIZE(S3C2440_dm9k_resource),

  .resource=S3C2440_dm9k_resource,//资源

  .dev={

  .platform_data=&S3C2440_dm9k_pdata,

  //私有数据

  },

  };

  最后在S3C2440的BSP文件mach-S3C2440.c中添加如下代码:

  static struct platform_device*S3C2440_devices[]__initdata={

  ……

  & S3C2440_device_eth,//添加

  };

  移植完毕后编译内核生成内核镜像。


3 网络设备驱动测试

  网络设备没有字符设备里的open、close等函数,而是靠IP地址选择路由,Linux网络系统的路由选择会自动查找匹配合适的驱动,这是网络驱动与其他两种驱动的主要区别[6]。

  下面给出三种测试网络驱动是否正常的方法。

  (1)使用ifconfig进行IP地址的设置。

  (2)为了让用户获取网络统计的数据,驱动一般有一个net_device_stats结构体,并提供get_stats函数接收它。

  (3)应用程序使用标准的socket、bind、send等操作。

  本文采用第一种方法进行双向ping通测试。首先在开发板终端上输入命令ifconfig eth0 10.10.150.180,设置好开发板IP地址,再将网口通过网线与PC相连,查得PC IP地址是10.10.150.174。在Windows命令行界面上输入命令ping 10.10.150.180,得到如下结果:

  Ping 10.10.150.180 with 32 bytes of data:

  Reply from 10.10.150.180:bytes=32 time<1ms TTL=64

  Reply from 10.10.150.180:bytes=32 time<1ms TTL=64

  Reply from 10.10.150.180:bytes=32 time<1ms TTL=64

  接着在开发板终端上输入命令ping 10.10.150.174,得到如下结果:

  Ping 10.10.150.174(10.10.150.174):56 data bytes

  64 bytes from 10.10.150.174:icmp_seq=0 ttl=64 time=0.9ms

  64 bytes from 10.10.150.174:icmp_seq=1 ttl=64 time=0.9ms

  64 bytes from 10.10.150.174:icmp_seq=2 ttl=64 time=0.9ms

  测试结果表明网络驱动正常。


4 结论

  本文基于S3C2440开发板,通过外接DM9000网卡,完成网卡驱动的移植,编译内核生成内核镜像,实现网络设备驱动的匹配。最后通过ping命令测试网口是否能正常工作。本文的移植方法可为其他网络驱动移植作为参考。

  参考文献

  [1] 李方军,金炜东.嵌入式Linux网络驱动程序的研究与实现[J].现代电子技术,2005(16):20-30.

  [2] 宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2010.

  [3] 贺金平.嵌入式Linux下DM9000网卡驱动的移植与实现[J].电脑知识与技术,2009,22(5):82-86.

  [4] 丁忠,林畅卫.功基于Linux的网络设备驱动程序设计[J].微计算机应用,2007(9):56-77.

  [5] 潘攀.Linux在嵌入式系统上的移植[J].科技信息,2010(20):45-63.

  [6] 吴士力.嵌入式Linux应用开发全程解析与实战[M].北京:机械工业出版社,2010


推荐阅读

史海拾趣

AIC [Analog Intergrations Corporation]公司的发展小趣事
  1. 公司成立与初期发展:Analog Integrations Corporation(AIC)是一家总部位于台湾的半导体公司,专注于设计、制造和销售高性能模拟集成电路(IC)产品。公司成立于1996年,由一群拥有丰富经验的工程师共同创立。最初,AIC致力于为广泛的应用领域提供稳定可靠的模拟芯片解决方案,如消费电子、通信、工业控制等。

  2. 技术创新与产品发展:AIC在技术创新和产品研发方面投入了大量资源,不断推出具有竞争力的新产品。公司的产品涵盖了各种模拟IC产品系列,包括功率管理IC、放大器、比较器、数据转换器等。这些产品具有高性能、低功耗、小尺寸等特点,得到了广大客户的青睐。

  3. 全球市场拓展:随着公司技术和产品的不断成熟,AIC开始着眼于国际市场的拓展。公司积极参与国际电子展览和行业会议,与全球客户建立合作关系,拓展海外市场份额。通过建立销售代理商、设立海外办事处等方式,AIC在北美、欧洲、亚太等地区建立了稳固的销售网络。

  4. 质量管理与认证:AIC始终将产品质量视为企业发展的关键。公司严格遵循国际质量管理体系标准,建立了完善的质量管理体系。AIC的生产工艺和产品测试流程经过精心设计和严格监控,确保产品质量的稳定性和可靠性。此外,公司的产品经过了多项国际认证,包括ISO 9001质量管理体系认证、ISO 14001环境管理体系认证等。

  5. 社会责任与可持续发展:作为一家负责任的企业,AIC积极履行社会责任,关注环境保护和可持续发展。公司致力于降低能源消耗和减少废物排放,推动绿色生产和循环利用。此外,AIC积极参与社会公益活动,支持教育、健康、环保等多个领域的项目,为社会发展做出积极贡献。

博通集成(BEKEN)公司的发展小趣事

博通集成深知技术创新是企业发展的核心动力。因此,公司始终保持高额的研发投入,不断推动技术创新和产品研发。公司拥有一支专业的研发团队,具备强大的研发实力和创新能力。通过持续的研发投入和技术创新,博通集成在无线连接芯片设计领域取得了显著的成果和进展。

DMS Electronic Components, Inc公司的发展小趣事

DMS在追求经济效益的同时,也积极履行社会责任。公司注重环境保护和资源节约,采用环保材料和工艺进行生产。同时,DMS还积极参与公益事业和社会活动,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了基础。

请注意,以上故事是基于对电子行业和DMS公司业务范围的推测和构想,并不代表DMS公司真实的发展历程。如需了解更多关于DMS公司的具体信息,建议查阅公司官方网站或相关新闻报道。

绿宝石(BERYL)公司的发展小趣事

绿宝石公司自创立之初,便致力于电子材料领域的研发。某年,公司研发团队成功开发了一种具有优异性能的绿宝石电子材料,这种材料在高频、高温等极端环境下仍能保持稳定性能,为电子行业带来了革命性的变革。随着这一技术的广泛应用,绿宝石公司在行业内逐渐树立了技术领先的形象,市场份额稳步上升。

南京绿芯(Grenergy)公司的发展小趣事

随着国内市场的饱和,绿宝石公司开始积极拓展国际市场。公司加强了与国际知名企业的合作,共同开发新产品、新技术。同时,绿宝石公司还在海外设立了研发中心和生产基地,以便更好地服务全球客户。通过一系列的市场拓展和国际化战略,绿宝石公司的国际影响力不断提升。

Elektron公司的发展小趣事

Elektron公司一直注重技术研发和创新投入,致力于在行业中保持领先地位。公司不断推出具有创新性和领先性的产品,如高性能的电池充电器、先进的焊接和切割设备等。这些产品的推出不仅提高了公司的市场竞争力,也推动了整个行业的发展和进步。同时,Elektron还积极参与行业标准的制定和推广工作,为行业的健康发展做出了重要贡献。

问答坊 | AI 解惑

求职交战指南(工程师级别)

金融风暴来把很多人从岗位上吹落。在找工作时总结了些经验,在此谈谈。 我不是被吹落的, 1、写简历时要把能做出的,成熟的,写的尽量放在前面,不可一带而过,把新掌握的技术写在后面。 2、找工作时尽量从网上找,因为现在的网络求职已很成熟。 ...…

查看全部问答>

AVR芯片锁死求助

今天用ISp下载atmega16,芯片好像遭锁死了,我用的是progisp软件 前面买到新的芯片后,把一片Atmega16和51的焊在同一块板子上,用同一个电源 51和atmega16的都用ISP下载,51和atmega16都外接了一个11.0592的晶振 那个软件打开后,默认的熔丝位是 ...…

查看全部问答>

SYN6288-A语音合成(TTS)超小型评估板

SYN6288-A语音合成评估板销售热线:13528479747孙先生    SYN6288-A语音合成评估板是一款性价比更高,效果更自然的一款中高端语音合技术。SYN6288-A通过异步串口接收待合成的文本,实现文本到声音(TTS)的转换。    国内首 ...…

查看全部问答>

USB设备CreateFile总是返回Invalid Handle

{         //3.  SetupDiEnumDeviceInte…

查看全部问答>

请教 cy7c68013的固件问题

用68013开发USB触摸屏, 现在我想实现的很简单, 就是有两个中断端点, 然后实现分别从这两个端点读写设备,   试了开发包中的那些固件例子好象都读写有点问题,  请问我需要自己写个固件吗, 还是有例子可以用或者参考?…

查看全部问答>

锂电池如何选择保护板?

学生比赛,在二手市场逃到一批4500mah的锂电池,准备拆成三个1500mah的电池,但是要加保护板,1500mah的电池需要加多大电流的保护板呢?有没有什么可以参考的呢?…

查看全部问答>

基于SensorTag+智能手机APP的运动记录器

1.利用SensorTag的温度、湿度传感器,将用户所处的位置的温度、湿度等天气情况传给智能手机,结合智能手机的GPS功能共享准确的实时的天气信息,进过数据分析推送给用户穿衣指数、运动建议等,并通过手机的APP共享信息形成其他用户的信息利用与互动 ...…

查看全部问答>

开关电源

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 开关电源手册,需要的看看    …

查看全部问答>

关于C6678多核启动的一些问题请大牛帮解答

我还没有拿到板子,现在想了解一些问题,希望大家不吝赐教。 1.关于c6678多核启动的顺序问题 我看了一些资料,上电后core0先开始执行内部的bootloader,进行初始化,然后会跳转到magic address的位置开始执行(core1~core7应该也要完成初始化,然 ...…

查看全部问答>