我是靠谱客的博主 陶醉巨人,最近开发中收集的这篇文章主要介绍理解RTEMS 的网络驱动结构,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

折腾了大半天,勉强看懂了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.2csrclibchipnetwork 中已经有了 CS8900.C 的驱动程序了。但是驱动是
分两层的,这里实现的是通用的部分,还需要BSP实现具体的接口。

上网找了下家山的s3c2410移植的文章,上面提到了在以下目录有 CS8900 的bsp驱动
csrcliblibbsparmedb7312network
于是翻开看了代码,但是,问题来了,里面并没有实现 rtems_bsdnet_config,而且
csrcliblibbsparmedb7312includebsp.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

最后

以上就是陶醉巨人为你收集整理的理解RTEMS 的网络驱动结构的全部内容,希望文章能够帮你解决理解RTEMS 的网络驱动结构所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部