高通无线接收流程
来源:互联网 发布:pb数据窗口列标题修改 编辑:程序博客网 时间:2024/05/22 03:53
http://blog.csdn.net/suiyuan19840208/article/details/17562465
1:数据处理函数tasklet,workqueue
在之前的初始化代码中的函数__ath_attach()中,有如下的代码:#ifndef ATH_SUPPORT_HTC
#ifdef ADF_SUPPORT
ATH_INIT_TQUEUE(&osdev->intr_tq, (adf_os_defer_fn_t)ath_tasklet, (void*)dev);
#else
ATH_INIT_TQUEUE(&osdev->intr_tq, ath_tasklet, dev);
#endif
#endif
首先开看看 ATH_INIT_TQUEUE()是怎么定义的:
#ifdef DECLARE_TASKLET /* native tasklets */
#define tq_struct tasklet_struct
#define ATH_INIT_TQUEUE(a,b,c) tasklet_init((a),(b),(unsigned long)(c))
#define ATH_SCHEDULE_TQUEUE(a,b) tasklet_schedule((a))
typedef unsigned long TQUEUE_ARG;
#define mark_bh(a)
#else /* immediate work queue */
#define ATH_INIT_TQUEUE(a,b,c) INIT_TQUEUE(a,b,c)
#define ATH_SCHEDULE_TQUEUE(a,b) do { \
*(b) |= queue_task((a), &tq_immediate); \
} while(0)
typedef void *TQUEUE_ARG;
#define tasklet_disable(t) do { (void) t; local_bh_disable(); } while (0)
#define tasklet_enable(t) do { (void) t; local_bh_enable(); } while (0)
#endif /* !DECLARE_TASKLET */
有上面的定义可以知道:次数定义的是中断处理函数的下半部,其实现采用俩种方式:tasklet和work_queue。
在中断处理函数中将会调用task或者queue的调度函数即上面定义的:ATH_SCHEDULE_TQUEUE
函数ath_tasklet()定义如下:
static void ath_tasklet(TQUEUE_ARG data)
{
struct net_device *dev = (struct net_device *)data;
struct ath_softc_net80211 *scn = ath_netdev_priv(dev);
do_ath_handle_intr(scn->sc_dev);
}
#define do_ath_handle_intr(_dev) do{ ath_handle_intr_generic(_dev);}while(0)
#define ath_handle_intr_generic(_dev) scn->sc_ops->handle_intr(_dev)
static const struct ath_ops ath_ar_ops = {
ath_handle_intr, /* handle_intr */
ath_rx_tasklet, /* rx_proc */
}
2:中断的申请
在__ath_attach()有如下中断申请代码
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
if (request_irq(dev->irq, ath_isr, SA_SHIRQ, dev->name, dev)) {
#else
#ifdef ATH_AHB
if (request_irq(dev->irq, ath_isr, IRQF_DISABLED, dev->name, dev)) {
#else
if (request_irq(dev->irq, ath_isr, IRQF_SHARED, dev->name, dev)) {
#endif
#endif
printk(KERN_WARNING "%s: request_irq failed\n", dev->name);
error = -EIO;
goto bad3;
} 由此可知,中断处理函数为:
ath_isr(int irq, void *dev_id, struct pt_regs *regs)
{
do_ath_isr(irq,dev_id,regs);
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
#define do_ath_isr(_irq,_dev_id) do{ return ath_isr_generic(_irq,_dev_id);}while(0)
#else
#define do_ath_isr(_irq,_dev_id,_regs) do{ return ath_isr_generic(_irq,_dev_id,_regs);}while(0)
#endif //if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
irqreturn_t ath_isr_generic(int irq, void *dev_id, struct pt_regs *regs)
#endif
{
struct net_device *dev = dev_id;
struct ath_softc_net80211 *scn = ath_netdev_priv(dev);
int sched, needmark = 0;
/* always acknowledge the interrupt */
sched = scn->sc_ops->isr(scn->sc_dev);
switch(sched)
{
case ATH_ISR_NOSCHED:
return IRQ_HANDLED;
case ATH_ISR_NOTMINE:
return IRQ_NONE;
default:
if ((dev->flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP))
{
DPRINTF_INTSAFE(scn, ATH_DEBUG_INTR, "%s: flags 0x%x\n", __func__, dev->flags);
scn->sc_ops->disable_interrupt(scn->sc_dev); /* disable further intr's */
return IRQ_HANDLED;
}
}
/*
** See if the transmit queue processing needs to be scheduled
*/
ATH_SCHEDULE_TQUEUE(&scn->sc_osdev->intr_tq, &needmark);
if (needmark)
mark_bh(IMMEDIATE_BH);
return IRQ_HANDLED;
}上面已经说明了在中断处理函数中对tasklet或者workqueue的调度。
3:代码执行流程
其代码执行过程如下:
当数据数据之后,会交给函数ieee80211_input(),在测函数中会处理80211的三大数据包类似,数据帧,管理帧和控制帧。
- 高通无线接收流程
- atheros无线驱动之:数据接收流程
- atheros无线驱动之:数据接收流程
- atheros无线网卡数据包接收流程
- 高通camera流程
- MSP430F147无线温度接收
- 高通培训无线互联应用
- 高通培训无线互联应用
- 高通研发出无线充电系统
- 如何利用无线路由接收无线信号
- 高通camera流程注释
- 高通平台启动流程
- 网络接收流程描述
- IPMSG---文件接收流程
- android 接收短信流程
- jrtplib接收数据包流程
- 接收H248数据包流程
- android sms接收流程
- jQuery选择器 过滤选择器(二.内容过滤选择器)
- 使用window.open()方式打开新页面,关闭后浏览器不能释放资源,需要等待主界面关闭后才能释放
- OpenGLES2.0 概念
- 微信小程序switch图标垂直居中
- JDK中IO包的源码解读配合大神的一起看,秒懂。
- 高通无线接收流程
- tortoisegit使用密钥连接服务器
- Python Flask Web框架(六)
- Java网络爬虫--HtmlParser应用
- APP实用开发——SplashScreen页面倒计时跳转
- 5.1面向对象<封装>(函数,类和对象)
- javaScript变量提升?
- ORA-00913: too many values 错误分析
- dlib::array2d<unsigned char> 与 cv::Mat 互转