RTT 网口驱动分析

时间:2024-04-02 17:58:39

RTT 网口驱动的核心是这个文件ethernetif.c

此文件定义了网口驱动的架构,还有几个常用的命令,比如list_if set_if() set_dns(),

eth_device_init()- > eth_device_init_with_flag(), 这些函数是在具体网卡芯片的驱动初始化里调用 的,

比如我用的ksz8851我的驱动初始化是rt_hw_ksz8851a_init()中调用了eth_device_init(),

RTT 网口驱动分析

下面这个网卡核心数据结构体,也很重要的

RTT 网口驱动分析

在rt_hw_ksz8851a_init()及其随后的调用中会初始化里面大部分内容,而只有struct netif *netif;成员,是在eth_device_init()中分配地址空间并初始化的,

网卡芯片的驱动程序只要提供eth_rx ,eth_tx 这2个主要函数,基本就可以工作了。这就是RTT以太网驱动的大概结构。

再说说网卡实际收发数据,RTT标准驱动网卡收发数据是各创建了一个线程,etx etr线程,

发送网络数据比较简单就不分析了,,接收网络数据采用了一个巧妙的机制,

首先创建了一个接收邮箱eth_rx_thread_mb,(为什么不是信号量?),当网卡芯片收到数据时,一般都会产生一个接收中断,在中断服务程序里就可以往这个eth_rx_thread_mb发送数据,发送的邮箱数据为此网卡的数据结构体指针,这样eth_rx_thread_entry线程收到这个邮件后,判断出是哪个网卡有数据要接收,就可以通过网卡结构体指针->直接调用哪个网卡的底层接收函数接收原始数据了。正因为是这样设计,才为我顺利的实现了RTT下多网卡奠定了基础。

 

我自己实现了ppp 3G/4G驱动并不是这么写的,因为是PPPOS,所以就直接实现了PPPOS需要的几个函数

pppos_output_cb,                                    

pppos_status_cb,

PPP持续接收()线程。

就可以了,并没有实现标准的RTT网卡驱动。

下一步实现 在RTT标准网卡驱动的基础上实现ECM,准备更高效率的驱动3G/4G模块。