QNX操作系统及网络设备驱动模块
(1)初始化
初始化包括两个方面,一方面是初始化网络设备,使其正常工作;另一个方面,是向io-net正确注册驱动模块,表明自己的属性,方便上层正确操作。网络设备的初始化工作和硬件紧密相关,这里就不一一描述。
驱动模块向io-net加载自己的时候,系统遵循如下工作流程:
①io-net搜索全局的符合io_net_dll_entry。它定义了驱动的初始化函数,io-net会直接调用这个函数。
②初始化函数向io-net注册驱动和相应的函数。
③初始化函数告诉io-net和它的模块自己的通信能力。
经过以上流程以后,io-net中就建立起有关此驱动程序的数据和函数调用列表。驱动程序必须正确编写初始化函数,并将该函数正确链接至io_net_dll_entry。
(2)从网络设备接收数据
当有包到达网络设备的时候,网络设备就会用某种方式通知驱动程序(例如中断),此时,驱动程序就要采取某种策略来处理到来的帧或数据。通常驱动程序这时候需要做以下工作:
①通过DMA将包取回来;
②做相应的必要处理,如通知网络设备释放当前帧的缓存,配置寄存器让网络设备等待下一帧到来等;
③通过调用io-net的tx_up_start()函数把包传递给上层模块。
当上层所有的模块都完成对这个包的处理以后,io-net调用我们驱动中的tx_done()函数,它来做最后的处理工作。
tx_up_start()函数是设备驱动中比较关键的函数,下面简要部分一下这个函数的入口参数。
npkt_t*(*tx_up_start)(int registrant_hdl,
nptk_t *npkt,
int off,
int framelen_sub,
uint16_t cell,
uint 16_t endpoint,
uint16_t iface,
void *done_hdl)
其中:int registrant_hdl--本驱动在io-net中的句柄,注册时由io-net生成;
nptk_t *npkt --需要处理的包的指针;
int off--底层协议包头长度,如以太网帧头部长度;
int framelen_sub--尾部填充的长度,对于以太网这个值为零;
uint16_t cell、uint16_t endpoint--endpoint和cell是io-ne
《QNX操作系统及网络设备驱动模块(第2页)》