Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2977719
  • 博文数量: 685
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5303
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-19 14:17
个人简介

文章分类

全部博文(685)

文章存档

2015年(116)

2014年(569)

分类: 嵌入式

2014-09-03 18:58:05

ioctl函数:分用户程序的ioctl和驱动程序中的ioctl,他们之间通过内核的一些结构体联系在一起。
Wifi驱动的Ioctl函数:os/linux/Ap_ioctl.c(rt28xx_ap_ioctl)
该函数用来处理iwpriv、iwconfig、iwlist等无线工具命令。
rt2880_module_init------>
RtmpPhyNetDevInit(pAd, &netDevHook)和RtmpOSNetDevAttach(pAd->OpMode, net_dev, &netDevHook)------>
pNetDevHook->ioctl = rt28xx_ioctl;------>
rt28xx_ioctl(struct net_device *net_dev,struct ifreq *rq,INT cmd)------>
rt28xx_ap_ioctl(struct net_device *net_dev,struct ifreq *rq,INT cmd)。


ap代码分析:
BUILD_TIMER_FUNCTION(APScanTimeout);---Rtmp_timer.c,BUILD_TIMER_FUNCTION用于往定时器进程中添加定时器处理函数,具体定义见下文。
APScanTimeout(ap扫描超时的处理函数,executed in timer thread);---ap/Ap_sync.c。
MlmeEnqueue(其他thread向Mlme进程发送一个消息)及RTMP_MLME_HANDLER(执行相应的状态机处理函数)---Mlme.c




wsc:简单WiFi设置,wpa:Wi-Fi Protected Access,有WPA 和 WPA2两个标准。
apcli:ap客户端。
ap的Mlme状态机:AP_ASSOC_STATE_MACHINE、AP_AUTH_STATE_MACHINE、AP_SYNC_STATE_MACHINE、AP_CNTL_STATE_MACHINE
、WSC_STATE_MACHINE、WSC_UPNP_STATE_MACHINE。
APCLI_ASSOC_STATE_MACHINE、APCLI_AUTH_STATE_MACHINE、APCLI_SYNC_STATE_MACHINE、APCLI_CTRL_STATE_MACHINE
WPA_STATE_MACHINE。


BUILD_TIMER_FUNCTION(ApCliAssocTimeout):ap/Apcli_assoc.c。
BUILD_TIMER_FUNCTION(ApCliAuthTimeout):ap/Apcli_auth.c。
BUILD_TIMER_FUNCTION(ApCliProbeTimeout):ap/Apcli_sync.c。
BUILD_TIMER_FUNCTION(APDetectOverlappingExec):ap/ap_mlme.c。
BUILD_TIMER_FUNCTION(GREKEYPeriodicExec):ap/ap_wpa.c。
BUILD_TIMER_FUNCTION(APScanTimeout):ap/ap_sync.c。
BUILD_TIMER_FUNCTION(RTMPIdsPeriodicExec):ap/ap_ids.c。IDS为入侵检测。
==================================================================================================================
#define BUILD_TIMER_FUNCTION(_func) \
void rtmp_timer_##_func(unsigned long data) \
{ \
PRALINK_TIMER_STRUCT _pTimer = (PRALINK_TIMER_STRUCT)data; \
RTMP_TIMER_TASK_ENTRY *_pQNode; \
RTMP_ADAPTER *_pAd; \
\
_pTimer->handle = _func; \
_pAd = (RTMP_ADAPTER *)_pTimer->pAd; \
_pQNode = RtmpTimerQInsert(_pAd, _pTimer); \
if ((_pQNode == NULL) && (_pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)) \
RTMP_OS_Add_Timer(&_pTimer->TimerObj, OS_HZ);               \
}
-------------------------------------------------------------------------------------------------------------------
注:##为字符串连接符,如ABC##123,变成ABC123
-------------------------------------------------------------------------------------------------------------------
static inline VOID __RTMP_OS_Add_Timer(
IN OS_NDIS_MINIPORT_TIMER * pTimer,
IN unsigned long timeout)
{
if (timer_pending(pTimer))
return;


timeout = ((timeout * OS_HZ) / 1000);
pTimer->expires = jiffies + timeout;
add_timer(pTimer);---------add_timer为内核提供的定时器添加接口
}




=======================================================================================================================
PCI接口:static struct pci_driver rt2860_driver,注册netdev和pAd及驱动操作函数pRtmpDrvOps(rt2860_probe)、注册rt2860_resume等驱动操作函数---os/linux/Pci_main_dev.c
rt2860_resume(struct pci_dev *pci_dev)---os/linux/Pci_main_dev.c
rt28xx_open(VOID *dev)---os/linux/Rt_main_dev.c
rt28xx_init()---common/Rtmp_init_inf.c
RTMP_CHIP_SPECIFIC(即__pAd->chipOps.ChipSpecific)---rtmp_chip.h




Rbus接口:module_init(rt2880_module_init),注册netdev和pAd及驱动操作函数集合pRtmpDrvOps;---os/linux/Rbus_main_dev.c
RTMP_DRV_OPS_FUNCTION(pRtmpDrvOps, NULL, NULL, NULL)
RTMP_BUILD_DRV_OPS_FUNCTION_BODY
RtmpDrvOpsInit(为pRtmpDrvOps赋值,其中rt28xx_init也被赋值给pRtmpDrvOps)---common/Rtmp_init_inf.c


=======================================================================================================================
rt2880_module_init()---os/linux/Rbus_main_dev.c
rt28xx_init()或RTMPAllocAdapterBlock()---common/Rtmp_init.c
RTMPAllocTxRxRingMemory(IN PRTMP_ADAPTER pAd)---common/Cmm_mac_pci.c


rt2880_module_init()---os/linux/Rbus_main_dev.c
RtmpRaDevCtrlInit(VOID *pAdSrc,RTMP_INF_TYPE infType)---common/Rtmp_init.c






















阅读(1749) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~