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

发布时间:2022-12-20  

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    参数——汽车软件开发中最大的挑战之一;一个参数很少单独出现。 我们的许多客户已经在他们的应用程序中实现了成百上千个参数,以便在车辆中参数化(即应用)软件。这不仅体现在动力系统和发动机的开发上,还体......
    调速变频器怎样调快慢参数 变频器调速怎么设定 变频器过载故障处理;  调速变频器怎样调快慢参数   调速变频器的调整参数包括基本参数和高级参数两部分,其中基本参数主要包括输出频率、最大频率、最小......
    pid调节器的使用操作与参数设置;  pid调节器的使用操作与调整   PID调节器的使用操作一般包括以下几个步骤:   设置目标值:确定需要控制的目标值,例如温度、压力、流量等。   连接......
    三菱FX系列PLC通过指令与A700变频器通讯;一、A700/F700变频器相关参数 l 操作模式: 参数Pr79=0 l 通讯站号: 参数Pr331=0 l 通讯速率: 参数Pr332=96 l......
    C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例);我们在C语言编程中会遇到一些参数个数可变的函数,一般人对它的实现不理解。例如Printf():   Printf......
    什么是矢量网络分析仪的S参数?;矢量网络分析仪测量时,经常会用到的一个参数就是S参数,S参数是射频通信领域应用的一种测量参数,全称是散射参数,是网络分析的语言。矢量网络分析仪对S参数进行测量时,会有......
    伺服控制器的参数设置_伺服控制器报警代码;  伺服控制器的参数设置   伺服控制器的参数设置涉及到多个方面,包括电气参数、控制参数、运动参数等。下面列举一些常见的伺服控制器参数设置:   电气参数......
    西门子博途:SET:置位字节数组指令参数及工作原理;说明 可以使用“置位位数组”指令,将指定区域中位的信号状态置位为“1”。在参数 S_BIT 中使用指针定义范围起点。如果指针指向外部 I/O 的存......
    西门子g120变频器快速调试步骤;一、操作面板的认知与操作 1、 基本操作面板BOP-2 图1-1 基本操作面板 BOP-2基本操作面板安装于控制单元上方,可以用于对变频器的调试,运行监控以及输入某个参数......
    G120变频器参数设置实用技巧;关于启程 启程自动化培训成立于2012年,创始人工控老鬼。培训项目主打三菱、西门子PLC编程系统集成、工业机器人编程、EPLAN电气设计、视觉......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>