开发环境
操作系统:SylixOS操作系统
编程环境:RealEvo-IDE3.1
开发板:imx6q实验箱
技术实现
SylixOS 内核版本1.4.1的网卡驱动框架与之前的版本相比有了很大变化,最主要的就是由之前的netif结构体变成了现在了netdev结构体。这个版本的网卡驱动框架主要由以下几个部分组成。
网卡驱动框架:网卡驱动入口
在官方提供的imx6Q的BSP工程目录中,SylixOS文件夹主要由三个子文件夹组成,分别是:bsp, driver, user。如图 21所示。
图 21 工程资源文件
bsp文件夹里是跟整个bsp相关的C文件及相关配置文件等,在startup.s之后运行的第一个C文件为:bspInit.c,如图 22所示。
图 22 bspInit.c
驱动程序一般都存放在driver文件夹中。如图 23所示。
图 23 驱动文件夹
网卡驱动代码在driver下的netif子文件内,打开imx6q_netif.h , 整个网卡驱动对外只提供了一个函数:enetInit ,如图 24所示。
图 24 网卡入口函数
enetInit是整个网卡驱动的入口函数,前面说的bspInit.c里halNetifAttch函数里会调用这个函数,进行网络的初始化。如图 25所示。
图 25 调用enetInit
网卡驱动框架:网卡驱动实现
在当前版本的SylixOS 里,网卡驱动主要是实现netdev这样一个结构体,结构体里的成员如图 26所示。
图 26 netdev
这个结构体里的内容主要可以分为以下两类:
配置信息相关
除了netdev_funcs结构体指针变量drv之外,其他的成员都可以分到这一类中,在驱动程序里,只需根据具体情况,对这一类的成员进行对应的赋值即可。如图 27所示。
图 27 配置信息相关
驱动程序相关
这一类的就一个成员,即netdev_funcs结构体指针。它里面定义了所有驱动程序需要实现的内容,这个结构体的定义如图 28所示。
图 28 netdev_funcs
一般,实现了init,transmit,receive这三个成员后,网卡基本就可以正常工作。这三个函数的功能如下:
.init : 进行整个网卡的初始化内容,里面可以包括MAC控制器的初始化,PHY的初始化,描述符的初始化,中断的绑定等等;
.transmit : 上层协议发送数据时,最后调用的就这个函数,因此,它要是实现网卡驱动的发送功能。
.receive : 当网卡收到数据时,会调用这个函数进行接收,同时,它里面还需要实现将收到的信息传到上层协议栈中去的功能。
网卡驱动框架:在系统中添加网卡信息
完成了上述内容之后,整个网卡驱动的内容也已经填充到netdev这个结构体中去了,最后只需要调用netdev_add函数就可以在系统中添加我们实现的这个网卡信息,如图 29所示。
图 29 netdev_add
网卡驱动框架:连接监测线程
在网卡驱动里,可以创建一个线程,用来监测当前网络的连接状态,如图 210所示。
图 210 监测线程
参考资料
无