MTK BT/WIFI小析

闲的时候查阅了MTK BT/WIFI相应资料,了解了一点框架知识,并且对底层驱动做了简单的代码流程跟踪,也留有一些问题,现做简单记录,不确定以后是否还有时间和机会再继续完善。

下图是MT6589平台,SDIO接口的硬件电路图,该平台有四组SDIO,其中MT6520/28会用到其中一组,当然SDIO仅用于WIFI的数据通信。

在init.project.rc文件,

mknod/dev/stpbt  c 192 0;

insmod/system/lib/modules/mtk_hif_sdio.ko

查看生成mtk_hif_sdio.ko的MakeFile文件,从而可以找到对应的源文件,

obj-$(CONFIG_MTK_COMBO) += mtk_hif_sdio$(EXT_FLAG).o

mtk_hif_sdio$(EXT_FLAG)-objs    := linux/pub/hif_sdio.o

mtk_hif_sdio$(EXT_FLAG)-objs    += linux/pub/hif_sdio_chrdev.o

mtk_hif_sdio$(EXT_FLAG)-objs    += platform/alps/mtk_wcn_cmb_hw.o

mtk_hif_sdio$(EXT_FLAG)-objs    += platform/alps/wmt_plat_alps.o

mtk_hif_sdio$(EXT_FLAG)-objs    += linux/pub/osal.o

模块入口:

mediatek\kernel\drivers\combo\common\linux\pub\hif_sdio.c

同理,可得到如下结果,

insmod/system/lib/modules/mtk_stp_wmt.ko

# WMT DRIVER

obj-$(CONFIG_MTK_COMBO) += mtk_stp_wmt$(EXT_FLAG).o

# WMT DRIVER-core part

mtk_stp_wmt$(EXT_FLAG)-objs     := core/wmt_core.o core/wmt_ctrl.o  core/wmt_func.o core/wmt_ic_6620.ocore/wmt_lib.o core/wmt_conf.o

#ifeq ($(MTK_COMBO_CHIP), MT6628)

mtk_stp_wmt$(EXT_FLAG)-objs     += core/wmt_ic_6628.o

#endif

# WMT DRIVER-linux private part

mtk_stp_wmt$(EXT_FLAG)-objs     += linux/pri/wmt_dev.o linux/pri/wmt_exp.o

mtk_stp_wmt$(EXT_FLAG)-objs     += linux/pri/wmt_tm.o

# WMT DRIVER-OSAL

mtk_stp_wmt$(EXT_FLAG)-objs     += linux/pub/osal.o

# WMT DRIVER-platform implementation

ccflags-y += -D WMT_PLAT_ALPS

mtk_stp_wmt$(EXT_FLAG)-objs     += platform/alps/wmt_plat_alps.o

mtk_stp_wmt$(EXT_FLAG)-objs     += platform/alps/wmt_plat_stub.o

# FIXME: select desired hw according to projectconfiguration

#ifeq ($(MTK_COMBO_CHIP), MT6628)

#mtk_stp_wmt$(EXT_FLAG)-objs    += platform/alps/mtk_wcn_cmb_hw_6628.o

#else

mtk_stp_wmt$(EXT_FLAG)-objs     += platform/alps/mtk_wcn_cmb_hw.o

#endif

mtk_stp_wmt$(EXT_FLAG)-objs     += linux/pri/stp_exp.o core/stp_core.ocore/psm_core.o core/btm_core.o linux/pri/stp_dbg.o

#ifeq ($(MTK_COMBO_CHIP), MT6628)

# WMT stub part (built-in kernel image)

obj-y                  += platform/alps/mtk_wcn_cmb_stub_alps.o

#endif

模块入口为:mediatek\kernel\drivers\combo\common\linux\pri\wmt_dev.c

insmod/system/lib/modules/mtk_stp_uart.ko

mediatek\kernel\drivers\combo\common\linux\pri\stp_uart.c

insmod/system/lib/modules/mtk_stp_bt.ko

mediatek\kernel\drivers\combo\common\linux\pub\stp_chrdev_bt.c

hif_sdio.c文件简单分析

hif_sdio_init:

第1794行,注册sdio总线上的驱动mtk_sdio_client_drv,

sdio总线上驱动与设备匹配时通过mtk_sdio_id_tbl来配对。

而对的sdio_func设备,由host给设备上电,识别等一系列动作找到并生成。

hif_sdio_probe函数:找到对应的sdio_func后,加入list表;使能该func,设置host与之通信时最大的数据传输buf。

////enables a SDIO functionfor usage

SDIO设备的识别过程大概如下,

kernel\drivers\mmc\core\host.c

mmc_alloc_host函数中INIT_DELAYED_WORK(&host->detect,mmc_rescan);

mmc_rescan ----> mmc_rescan_try_freq ---->mmc_attach_sdio

如果有时间可以继续了解Mtk host 的实现代码及host->detect调用。

回到hif_sdio_init函数,第1798行,调用hifsdiod_start函数,

创建consys-id-query线程,每10s运行一次,还不明白这样做的目的是什么?

回到hif_sdio_init函数,第1800行,调用hif_sdio_create_dev_node函数

创建hifsdiod字符设备,获取ChipId。

WMT驱动

mediatek\kernel\drivers\combo\common\linux\pri\wmt_dev.c

WMT_init函数,

第1680行,调用stp_drv_init,主要是初始化stp_core_ctx结构体。

第1682~1696行,注册mtk_stp_wmt字符设备,mknod /dev/stpwmt c 190 0;即其设备为/dev/stpwmt

后续会简单跟踪BT数据的简单流程,在BT驱动加载后,会生成/dev/stpbt设备文件,mtk 库文件中的操作函数,通过对内核stpbt设备文件进行操作控制。

BT

mediatek\kernel\drivers\combo\common\linux\pub\Stp_chrdev_bt.c

注册mtk_stp_BT_chrdev字符设备,而BT_DEV_MAJOR为192,在init.project.rc: mknod /dev/stpbt  c 192 0;故该字符设备为/dev/stpbt,对应的设备操作如下:

BT_open:

mtk_wcn_wmt_func_on(WMTDRV_TYPE_BT)->mtk_wcn_wmt_func_ctrl(WMTDRV_TYPE_BT,WMT_OPID_FUNC_ON); 即发送(WMTDRV_TYPE_BT,WMT_OPID_FUNC_ON)的消息给处理中心,

第81行从gDevWmt.rFreeOpQ.queue数组中获取P_OSAL_OP,

gDevWmt.rFreeOpQ.queue队列在

mediatek\kernel\drivers\combo\common\core\wmt_lib.c:wmt_lib_init函数中由gDevWmt.arQue完全填充,如下代码所示,

第98行,wmt_lib_host_awake_get ->wmt_plat_wake_lock_ctrl(WL_OP_GET);如下面代码所示,

根据counter是否大于0来加/解睡眠锁wmtWakeLock。

第100行,DISABLE_PSM_MONITOR ->wmt_lib_ps_disable ->mtk_wcn_stp_psm_disable

mtk_wcn_stp_is_uart_fullset_mode判断是否为MTKSTP_UART_FULL_MODE

STP_SET_SUPPORT_PROTOCOL <- mtk_wcn_stp_set_mode <-wmt_ctrl_stp_conf_ex <-

wmt_ctrl_stp_conf 对应函数指针数组wmt_ctrl_func中的WMT_CTRL_STP_CONF数据成员,<- wmt_ctrl <-

mt6628_sw_init <- wmt_ic_ops_mt6628 <-wmt_core_hw_check 对应的操作入口保存在gMtkWmtCtx.p_ic_ops。

opfunc_pwr_on -> wmt_core_stp_init

mediatek\kernel\drivers\combo\common\core\wmt_lib.c:wmtd_thread消息队列转发机制处理中心,

由WMT_init -> wmt_lib_init创建。

mtk_wcn_stp_is_ready判断stp是否ready

第106行,wmt_lib_put_act_op将P_OSAL_OP加入rActiveOpQ队列,唤醒消息处理线程,并等待处理结果的返回。

处理流程:

pOp->op.opId= WMT_OPID_FUNC_ON;

pOp->op.au4OpData[0]= WMTDRV_TYPE_BT;

wmt_core_opid-> wmt_core_opid_handler -> opfunc_func_on ->

iRet= (*(gpWmtFuncOps[drvType]->func_on))(gMtkWmtCtx.p_ic_ops,wmt_conf_get_cfg()); ->

wmt_func_bt_ops-> wmt_func_bt_on -> wmt_core_func_ctrl_cmd(WMTDRV_TYPE_BT,MTK_WCN_BOOL_TRUE);该函数代码如下,

wmt_core_tx -> wmt_ctrl_tx_ex ->mtk_wcn_stp_send_data(pData, size, WMT_TASK_INDX);

-> stp_send_tx_queue(stp_core_ctx.sequence.txseq);->

(*sys_if_tx)(&stp_core_ctx.tx_buf[tx_read],last_len, &ret);

sys_if_tx函数指针在mtk_wcn_stp_init函数中赋值,从stp_drv_init函数中可得知对应的函数为mtk_wcn_sys_if_tx,其代码如下,

stp_uart_if_tx由stp_uart_tty_open函数调用mtk_wcn_stp_register_if_tx赋值为mtk_wcn_uart_tx,即最终的数据由uart发送出去。

后续uart是怎么确定哪个及如何衔接数据调用流程,还是继续分析。

mtk_wcn_wmt_msgcb_reg(WMTDRV_TYPE_BT, bt_cdev_rst_cb)

WIFI

时间: 2024-10-08 00:32:47

MTK BT/WIFI小析的相关文章

Python之美[从菜鸟到高手]--NotImplemented小析

今天写代码时无意碰到NotImplemented,我一愣,难道是NotImplementedError的胞弟,所以稍微研究了一下. NotImplemented故名思议,就是"未实现",一般是用在一些比较算法中的,如class的__eq__,__lt__等,注意NotImplemented并不是异常,所以不能 使用raise,当没有实现时应该是return NotImplemented. 我们可以看看django中的Field的实现, @total_ordering class Fie

DIY wifi 小四轴

四轴飞行器最近很火,taobao上卖的匿名.圆点博士.烈火的都很不错,原理图和代码都是开源的. 最近在网上看到了一个国外开源的四轴,叫crazyflie 四轴飞行器. 我想做一个wifi 四轴 ,现在每个人手里都有手机,手机通过wifi控制四轴岂不是更好. 在 amobbs 论坛上就看到了有人做了一个wifi 四轴 ,帖子地址如下: http://www.amobbs.com/thread-5545172-1-1.html 看了还不错,有了资料就可以自己DIY了. DIY wifi 小四轴,布布

Poco logger 日志使用小析

Poco logger 日志使用小析 Poco logger 日志使用小析 日志 logger 库选择 Pocologger 架构简析 步骤一 生成消息 步骤二 写入logger 步骤三 导入channel 步骤四 写文件 使用 h file cpp file main 入口函数 备注 拓展 总结 转载请注明本文链接 日志 在软件开发过程中,为了定位软件运行过程中可能出现的错误,一种常用的做法是在潜在的错误位置,设置防御代码,并且将错误代码执行后的错误信息记录下来,以供后续改进代码提供支持. 在

ASP.NET 异步Web API + jQuery Ajax 文件上传代码小析

该示例中实际上应用了 jquery ajax(web client) + async web api 双异步. jquery ajax post 1 $.ajax({ 2 type: "POST", 3 url: "/api/FileUpload", 4 contentType: false, 5 processData: false, 6 data: data, 7 success: function (results) { 8 ShowUploadControl

百词斩数据之小析

       作为一位英语爱好者,百词斩是我每天都会用的一款APP,这款应用可以自测词汇量,并巩固你的单词量,确实是一款用心的产品.作为一名雅思7分的选手,个人觉得里面的发音和例句,对于口语还是有很大的帮助,可以边听边读,做到碎片化的学习.总言而之,推荐大家都体验一下.        好吧,本人使用百词斩也是一年之久,时间久了总会发现一些不足之处,也会在它的官方渠道提出一些自己的需求和缺陷,而且该公司和我工作的地方都在一个园区,客服妹妹也很热情的邀请我去她们办公区坐坐,当然这都是客气话了.我个人

ArcGIS Earth数据小析

ArcGIS Earth,一款轻量级的三维地球应用.因为工作关系下载试用了半天,正好借这个机会简单研究一下ArcGIS Earth的大概思路,特别是地形数据的组成和影像数据的加载,在这总结整理一下.下面ArcGIS Earth简称为AE. 好了,本文先说点人话,接着上硬菜,最后再上点调味小菜.废话不多,说走就走. 本人用的是官网最新版本,刚好发布一周,界面风格和VS的神似,相信开发人员会有一种似曾相识的感觉.不过安装过程并不顺利,安装过程中提示我安装.Net Framework4.5.2版本及以

Python字典的小析(增删改查)

作为Python的初学者,难免会为了一两个小问题找资料,然而一找资料,发现Python关于字典这方面的解析很少,我在此稍稍解析一下字典的用法和含义,若有不足,望大家批评.(在这我直接以代码形式为大家解析) 先来讲讲我对字典的理解吧 简单粗暴,字典就是键值对,而且是无序的,可控的键值对,并且python中字典可以嵌套字典 一.字典的创建 1.传统的文字表达式 a={'name':'Tom','age':20,'job':'Student'} print a >>> {'name':'Tom

正则表达式小析

1.正则表达式匹配的步骤 a.用"import re"导入正则表达式模块 b.用"re.compile()"函数创建一个Regex对象(使用原始字符串) c.向Regex对象的search()方法传入想查找的字符串,它返回一个Match对象 d.调用Match对象的group()方法,返回实际匹配文本的字符串 import re spam ='我的电话是:177-2345-6789' PhonenumberRegex = re.compile(r'\d\d\d-\d

[Node.js] ECMAScript 6中的生成器及koa小析

原文地址:http://www.moye.me/2014/11/10/ecmascript-6-generator/ 引子 老听人说 koa大法好,这两天我也赶了把时髦:用 n 安上了node 0.11.12,下了个koa开启harmony模式试水.在一系列文档和贴子的教育下,大概认识到: koa 是TJ大神主导的新一代Web框架 koa 的中间件基于ES6的生成器函数(function *)形式 koa的核心流程库是 co,它能很好的解决Pyramid of Doom问题 在接触 Node.j