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(),
下面这个网卡核心数据结构体,也很重要的
在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模块。