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
MTK BT/WIFI小析相关推荐
- MTK IMS框架简析(2)——IMS注册过程
之前在<MTK IMS框架简析(1)--代码架构及模块初始化> 中已经分析了ims代码的构成和重点类的初始化,接下来以启用VOLTE子功能为例,具体分析AP侧IMS服务的注册过程. 概要 ...
- 新版WIFI小程序分销系统微信源码序WiFi大师版流量主搭建独立源码WiFi分销源码
网传版本,未测试,新版WIFI大师v4.47小程序源码,WIFI分销系统带流量主和独立运行版. 更新内容: 1.后台更多板块列表新增分页 2.平台管理端图标优化 3.平台管理端新增平台统计 4.优化后 ...
- win10任务栏WIFI小图标不见了--解决办法
记录一下昨天遇到的一个小问题,昨天重启电脑后发现任务栏WIFI小图标不见了,但是还是在快捷操作的列表里可以看到,控制面板也可以看到,就是找不到小图标了.经过一番试错,最终 找到一种最有效的方法分享出来 ...
- 用devc++表白_「你表白,我宠你」520—实验猿的表白日,小析姐的“宠粉”节
520又双叒叕来了 网上那些经典的表白方式依然历历在目 河北省邯郸市鸡泽县小伙儿豆子旺用九万九千九百九十九只红辣椒摆成巨大"心"形向女友求婚. 在圣亚极地世界<白鲸传奇> ...
- Poco logger 日志使用小析
Poco logger 日志使用小析 Poco logger 日志使用小析 日志 logger 库选择 Pocologger 架构简析 步骤一 生成消息 步骤二 写入logger 步骤三 导入chan ...
- Python 实现 一键Wifi小助手
这个小程序已经放到 github 上面,欢迎交流:https://github.com/AngryHacker/Wifi_Assistant ============================= ...
- 赤兔WiFi分销小程序源码,一键连接wifi小程序开发wifi大师软件源码
产品详细介绍 赤兔WiFi小程序开发,本小程序对接腾讯流量主,用于赚取流量主收益 后台功能: 可开团队,拓展员,商家,可设置各级分成的设置 后台拥有强大的用户管理系统,实时管理用户的佣金情况 感兴趣可 ...
- wifi小程序源码-微信小程序源码
3.0.9独立可运营版,看到很多人都分享,但是版本都是之前的 并且版本不是最新的,自己花大价钱买来的,目前这款版本最新的就是这款了,可以正常搭建运营,有不懂的在下方询问,无联系方式! 虚拟主机或者服务 ...
- MTK 手机开发小技巧(2)
MMICheckDiskDisplay 开机点亮背光 PEN_CHECK_BOUND 检查触笔位置是否在控制区域 wgui_general_pen_do ...
最新文章
- 交叉验证的意义和目的_干货:详解原料药的工艺验证
- 简单题汇总,小知识点
- android tls1.2用法,如何添加特定TLSv1.2工作CipherSuits与OkHttp支持 - Android 4.4的奇巧(API 19)...
- Ajenti-Linux控制面板之自动化运维工具
- javascript:with的用法以及延长作用域链
- 5.6.50 mysql 用什么驱动_日均5亿查询量的京东订单中心,为什么舍弃MySQL用ES?
- php去除英文和标点,php 过滤英文标点符号及过滤中文标点符号代码_php技巧
- 自己动手制作一门语言(1)波罗语
- 思科交换机配置试题_【干货】思科交换机路由器怎么配置密码?
- 超外差和超再生模块有何区别?
- 【电脑帮助】解决Wind10系统桌面没有“我的电脑”图标的问题
- 语法的集合?协议可没那么简单
- LeetCode 939. Minimum Area Rectangle (最小面积矩形)
- Atitit 个人 企业 政府 等组织 财政收入分类与提升途径attilax总结 v2
- wps 项目进度_wps excle做甘特图|如何利用excel自动生成施工进度计划横道图
- Visual C++——定时器(计时器)SetTimer函数
- 最新版IDEA Lombok插件安装
- 学习笔记(五)——相关系数及Excel实现相关分析操作
- 在移动硬盘上安装Deepin Linux 操作系统
- python制作相册影集_最新的有趣开源,Python制作抖音特有的重影彩色图片!
热门文章
- sift是图像匹配的非常经典的算法
- 抖音取图表情包小程序源码+创作者入驻+流量主
- 《了凡四训》全文 + 译文
- 今日头条优化实践: iOS 包大小二进制优化,一行代码减少 60 MB 下载大小
- 坚果G9致命缺点,一篇文章告诉你坚果G9到底好不好
- ansys时间步长怎么设置_在 ANSYS Workbench 的动态、静态仿真中,设置子步长(时间步长)的目的分别是什么?_学小易找答案...
- 苹果电脑显示内存不足有什么办法解决
- 【线性代数】【笔记】【@汤家凤】【数一】【第二章 矩阵】
- Team Project Proposal: 开始页--为你的Outlook而生--By Qiaolin Xia
- 口红送什么色号,这是一个难题,爬取口红数据,希望对你有所帮助