理解RTEMS 的网络驱动结构

来源:互联网 发布:javascript 哪些对象 编辑:程序博客网 时间:2024/05/16 06:15

折腾了大半天,勉强看懂了RTEMS关于网卡驱动部分的架构了。根据 networking 文档的描述,
网卡驱动必须执行 attach函数将驱动和bsd协议栈联系起来 cs8900_driver_attach,然后
这个函数里面将各个驱动函数注册到 rtems_bsdnet_ifconfig,然后注册到系统,这看起来没
什么特别,一般驱动都是这样做。

但是问题来了,cs8900_driver_attach 被谁调用的?查找,竟然找不到,怎么回事?
于是阅读文档
rtems_bsdnet_initialize_network 必须被调用,bsp 调用,或者用户程序调用。
里面有这么一段,很显然就是根据 rtems_bsdnet_config.ifconfig 的内容去完成 attach。
for (ifp = rtems_bsdnet_config.ifconfig ; ifp ; ifp = ifp->next) {
  rtems_bsdnet_attach (ifp);
 }

那查找这个 rtems_bsdnet_config ,发现没有定义!
折腾很久终于发现了在 Rtems_bsdnet.h 中有这么一句说明

/*
 * Default global device configuration structure. This is scanned
 * by the initialize network function. Check the network demo's for
 * an example of the structure. Like the RTEMS configuration tables,
 * they are not part of RTEMS but part of your application or bsp
 * code.
 */
extern struct rtems_bsdnet_config rtems_bsdnet_config;

也就是说 rtems_bsdnet_config 配置结构必须由用户或者BSP来完成,rtems内核并不参与。

在 rtems-4.10.2\c\src\libchip\network 中已经有了 CS8900.C 的驱动程序了。但是驱动是
分两层的,这里实现的是通用的部分,还需要BSP实现具体的接口。

上网找了下家山的s3c2410移植的文章,上面提到了在以下目录有 CS8900 的bsp驱动
\c\src\lib\libbsp\arm\edb7312\network
于是翻开看了代码,但是,问题来了,里面并没有实现 rtems_bsdnet_config,而且
c\src\lib\libbsp\arm\edb7312\include\bsp.h 文件
/*
 * Network driver configuration
 */
#define RTEMS_BSP_NETWORK_DRIVER_NAME "eth0"
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH cs8900_driver_attach

晕死,全文查找找不到 RTEMS_BSP_NETWORK_DRIVER_NAME 在哪里使用。折腾了很久,
最后发现官方原来还有 network 的demo程序 network-demos-4.10.2.tar.bz2

解开阅读后发现,所有的谜团解开了,原来 RTEMS_BSP_NETWORK_DRIVER_NAME 的定义是提供
给 demo 使用的。bsp只有实现代码,但是并没有具体去使用驱动。
要使用驱动,则用户可以自己准备好 rtems_bsdnet_config 结构,然后在 Init 函数可以调用
rtems_bsdnet_initialize_network ,那么如果驱动正常的话,那么网络协议就准备好了。
用户可以写各种网络程序去做需要的事情了。

郁闷了大半天,基本了解了大概结构,接着就是做 8900 的驱动移植了。成功后再写文章。

Etual
2012-12-26

原创粉丝点击