rt2870驱动解析
来源:互联网 发布:三维人体解剖学软件 编辑:程序博客网 时间:2024/04/29 17:53
就如一个驱动架构,2870的驱动结构也是init,exit,probe,下面就我们关注的probe函数进行说明
2820的probe函数rtusb_probe里面调用了rt2870_probe
在rt2870_probe函数里,
先完成一些互斥锁和同步信号量的分配
然后调用USBDevConfigInit完成了usb端点配置,就是一个输入端点和6个输出端点,控制端点呢?
然后调用RtmpPhyNetDevInit初始化一些和上层交互的接口
然后调用RTMP_DRIVER_MAC_ADDR_GET和RtmpOSNetDevAddrSet设置MAC地址
其他待分析
2012-04-30
rt2870_probe函数里
首先调用RTMPAllocAdapterBlock,由名字来看是分配一些适配器快,进入该函数,
首先是函数RtmpUtilInit,它初始化了一个Util的锁UtilSemLock,然后调用AdapterBlockAllocateMemory分配一个适配器pAd,该适配器是整个程序数据沟通的桥梁,查看它的结构struct _RTMP_ADAPTER,挺多的,我最关注的是USB配置的信息和上层网络交互的信息
{
...
/*****************************************************************************************/
/* USB related parameters */
/*****************************************************************************************/
/* struct usb_config_descriptor *config; */
VOID *config;
UINT BulkInEpAddr; /* bulk-in endpoint address */
UINT BulkOutEpAddr[6]; /* bulk-out endpoint address */
UINT NumberOfPipes;
USHORT BulkOutMaxPacketSize;
USHORT BulkInMaxPacketSize;
/*======Control Flags */
ULONG BulkFlags;
BOOLEAN bUsbTxBulkAggre; /* Flags for bulk out data priority */
/*======Cmd Thread */
/* CmdQ CmdQ; */
/* NDIS_SPIN_LOCK CmdQLock; // CmdQLock spinlock */
/* RTMP_OS_TASK cmdQTask; */
/*======Semaphores (event) */
RTMP_OS_SEM UsbVendorReq_semaphore;
RTMP_OS_SEM UsbVendorReq_semaphore2;
PVOID UsbVendorReqBuf;
/* wait_queue_head_t *wait; */
VOID *wait;
...
}
接着调用RTMPAllocTxRxRingMemory,分配发送发送和接收缓冲,进入该函数
调用NICInitTransmit分配发送urb,调用NICInitRecv分配接收urb
还调用了RTMP_AllocateFragPacketBuffer分配了一个skb,属于FRAGMENT_FRAME FragFrame; /* Frame storage for fragment frame */,做什么的呢?
接下来是函数USBDevConfigInit,就是设备配置初始化,无非是检查一些配置是否合理
然后是RtmpRaDevCtrlInit,这个函数也一些配置初始化
然后是RtmpPhyNetDevInit,这个函数比较关键,它初始化了变量pNetDevHook,它具有RTMP_OS_NETDEV_OP_HOOK结构,该结构定义
typedef struct _RTMP_OS_NETDEV_OP_HOOK_ {
void *open; //初始化为MainVirtualIF_open
void *stop;
void *xmit;
void *ioctl;
void *get_stats;
void *priv;
void *get_wstats;
void *iw_handler;
int priv_flags;
unsigned char devAddr[6];
unsigned char devName[16];
unsigned char needProtcted;
} RTMP_OS_NETDEV_OP_HOOK, *PRTMP_OS_NETDEV_OP_HOOK;
显然它提供了和上层交互的接口,其中open函数初始化为MainVirtualIF_open,这个函数是在启用该网卡设备时调用的,进入该函数
它调用VIRTUAL_IF_UP
__inline INT VIRTUAL_IF_UP(VOID *pAd)
{
RT_CMD_INF_UP_DOWN InfConf = { rt28xx_open, rt28xx_close };
if (RTMP_COM_IoctlHandle(pAd, NULL, CMD_RTPRIV_IOCTL_VIRTUAL_INF_UP,
0, &InfConf, 0) != NDIS_STATUS_SUCCESS)
return -1;
return 0;
}
进入rt28xx_open函数,
里面调用rt28xx_init,
又调用RtmpNetTaskInit
NDIS_STATUS RtmpNetTaskInit(
IN RTMP_ADAPTER *pAd)
{
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
/* Create receive tasklet */
RTMP_OS_TASKLET_INIT(pAd, &pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd);
#ifdef RALINK_ATE
RTMP_OS_TASKLET_INIT(pAd, &pObj->ate_ac0_dma_done_task, rtusb_ate_ac0_dma_done_tasklet, (unsigned long)pAd);
#endif /* RALINK_ATE */
RTMP_OS_TASKLET_INIT(pAd, &pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->hcca_dma_done_task, rtusb_hcca_dma_done_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd);
RTMP_OS_TASKLET_INIT(pAd, &pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);
return NDIS_STATUS_SUCCESS;
}
查看下宏RTMP_OS_TASKLET_INIT
#define RTMP_OS_TASKLET_INIT(__pAd, __pTasklet, __pFunc, __Data) \
tasklet_init(__pTasklet, __pFunc, __Data)
是个tasklet,随便进入一个函数,如rtusb_ac3_dma_done_tasklet,里面调用RTUSBKickBulkOut
该函数正是提交urb的地方
今天到此
- rt2870驱动解析
- 移植RT2870无线网卡驱动到s3c2416
- raspberry 树莓派 360/百度(RT2870 MT7601) WIFI驱动
- bbb rt2870
- 关于RT2870 linux驱动Ad-Hoc模式下出错的调试
- 雷凌 Ralink RT2070 RT3070 RT2870系列芯片驱动移植到LPC3250Demo板的ifconfig ra0 up问题解决方案~~
- fedora 8 rt2870驱动报错,827: warning: passing argument 4 of ‘iwe_stream_add_event’ makes pointer from integer without a cast
- 在KUKA-youbot的板载PC上安装RT2870型无线网卡驱动并实现远程控制
- ubuntu10.04 安装ralink rt2870
- ubuntu10.04 安装ralink rt2870
- RT2870 Wireless Lan Linux Driver
- zynq移植RT2870调试记录
- SIS900 驱动程式解析
- 转:DM9000驱动解析
- DM9000驱动解析
- ril驱动解析
- 驱动模块Makefile解析
- 驱动模块Makefile解析
- 不适合创业
- 《Expert Cube Development with Microsoft SQL Server 2008 Analysis Services》读书笔记第九章:保护Cube(一)
- MFC改变控件位置和大小
- VC生成DICOM文件及 DICOM,DVT,DCMTK开发知识汇总
- 判断一个数是否是2的幂
- rt2870驱动解析
- s3c2440 primary boot from nand flash
- C++在嵌入式应用中的安全问题
- ios 实现谷歌地图
- 黑马程序员_张孝祥交通灯
- 电影推荐
- MATLAB位运算(转)
- 动态规划求解01背包相关的基本问题
- 设置samba共享文件写入权限(备忘)