type
status
date
slug
summary
tags
category
icon
password
URL
一、问题背景
写这篇文章的主要原因是由于在MTK一个GKI2.0项目中,user版本发现了wlan log吐不出来。尽管已经在debuglogUI→Log Level→wifi driver log level 调整为extreme都无法生效。
所以追踪了一下代码,以期待解决此问题并从原理角度进行分析。
二、问题分析
通过抓取userdebug log,我们可以得到动态调整dbglevel的相关log
从log我们可以看到动态调整dbglevel的原理是通过向
/proc/net/wlan/dbgLevel
写值完成的。下面进行到代码追踪,来看看这个节点是如何被创建出来的,以及write的动作进行了哪些操作?
2.1 dbgLevel的创建
代码位于:vendor/mediatek/kernel_modules/connectivity/wlan/core/gen4m/os/linux/gl_proc.c
从这边可以看到wlan在初始化时会根据
BUILD_QA_DBG
使用proc_creat创建dbgLevel
节点,同时file_operations为dbglevel_ops
关于
BUILD_QA_DBG
的定义下面会说明,暂时先忽略。2.2 dbgLevel write函数
当write时,将会调用
procDbgLevelWrite
2.3 wlanSetDriverDbgLevel的原理
2.4 aucDebugModule与log打印的关系
代码位于:vendor/mediatek/kernel_modules/connectivity/wlan/core/gen4m/include/debug.h
这里定义的
DBGLOG
的宏函数,通过解析aucDebugModule[DBG_##_Mod##_IDX]来传参,最后将解析出的参数通过LOG_FUNC
来打印。LOG_FUNC
其实就是kalPrint
,其实就是pr_info
而这个
DBG_##_Mod##_IDX
,就是数组元素名,是一种enum类型,其定义在vendor/mediatek/kernel_modules/connectivity/wlan/core/gen4m/include/debug.h
解析出,Mod就是第二个字串
2.5 BUILD_QA_DBG
设置
在一开始时提到的
BUILD_QA_DBG
,现在来解释一下。三、实验验证
首先,先读取当前手机WLAN驱动各模块的log等级。
可以看到当前所有模块log等级都为0x7F
使用指令1:
得到结果

使用指令2:
