1、首先需要明确wifi模块是USB设备,主控(CPU)端是USB主机; 2、USB主机若需要对wifi模块进行数据的读写时,就必须经过USB接口; 3、既然涉及到数据的读写操作,必然要用相应的读写函数,那么usb_read_port()和usb_write_port()即是它们的读写函数。 我们先从读数据开始进行分析,在分析之前,我们必须了解USB设备驱动的读数据过程。USB读取数据操作流程如下: (1)通过usb_alloc_urb()函数创建并分配一个URB,作为传输USB数据的载体; (2)创建并分配DMA缓冲区,以DMA方式快速传输数据; (3)初始化URB,根据wifi的传输数据量,我们需要初始化为批量URB,相应操作函数为usb_fill_bulk_urb(); (4)将URB提交到USB核心; (5)提交成功后,URB的完成函数将被USB核心调用。 现在我们一步步地详细分析整个过程,所谓的创建和分配,实质上是对内存的分配,必须了解Linux内存管理相关知识及合理使用内存。 当wifi模块有数据可读时,主控端才能成功地读取数据。那么wifi模块什么时候有数据可读呢?wifi模块通过RF端接收到无线网络数据,然后缓存到wifi芯片的RAM中,此时,wifi模块就有数据可读了。
wifi模块的接收函数中 1、usb_alloc_urb()创建一个中断URB 2、在rtw_os_recvbuf_resource_alloc函数中,创建一个批量URB和一个DMA缓冲区 3、在usb_read_port()函数中,通过usb_fill_bulk_urb()初始化批量URB,并且提交给USB核心,也即USB读取数据操作流程的第3、4步。在usb_fill_bulk_urb()函数中,初始化URB的完成函数usb_read_port_complete(),只有当URB提交完成后,函数usb_read_port_complete()将被调用。 通过上面我们可以得知在wifi模块为接收数据做初始化准备时,分配了URB和DMA缓冲区。而在usb_read_port()函数中初始化URB和提交URB。
|