概述
折腾了大半天,勉强看懂了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 的网络驱动结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复