qcom wlan kernel 解读 WCNSS_qcom_cfg.ini 文件
CORE/HDD/src/wlan_hdd_main.c
模块初始化:
static int __init hdd_module_init ( void)
{
return hdd_driver_init();
}
static int hdd_driver_init( void)
{
VOS_STATUS status;
v_CONTEXT_t pVosContext = NULL;
struct device *dev = NULL;
int ret_status = 0;
#ifdef HAVE_WCNSS_CAL_DOWNLOAD
int max_retries = 0;
#endif
#ifdef HAVE_CBC_DONE
int max_cbc_retries = 0;
#endif
#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
wlan_logging_sock_init_svc();
#endif
ENTER();
vos_wake_lock_init(&wlan_wake_lock, "wlan");
pr_info("%s: loading driver v%s\n", WLAN_MODULE_NAME,
QWLAN_VERSIONSTR TIMER_MANAGER_STR MEMORY_DEBUG_STR);
#ifdef ANI_BUS_TYPE_PCI
dev = wcnss_wlan_get_device();
#endif // ANI_BUS_TYPE_PCI
#ifdef ANI_BUS_TYPE_PLATFORM
#ifdef HAVE_WCNSS_CAL_DOWNLOAD
/* wait until WCNSS driver downloads NV */
while (!wcnss_device_ready() && 10 >= ++max_retries) {
msleep(1000);
}
if (max_retries >= 10) {
hddLog(VOS_TRACE_LEVEL_FATAL,"%s: WCNSS driver not ready", __func__);
vos_wake_lock_destroy(&wlan_wake_lock);
#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
wlan_logging_sock_deinit_svc();
#endif
return -ENODEV;
}
#endif
#ifdef HAVE_CBC_DONE
while (!wcnss_cbc_complete() && 10 >= ++max_cbc_retries) {
msleep(1000);
}
if (max_cbc_retries >= 10) {
hddLog(VOS_TRACE_LEVEL_FATAL, "%s:CBC not completed", __func__);
}
#endif
dev = wcnss_wlan_get_device();
#endif // ANI_BUS_TYPE_PLATFORM
do {
if (NULL == dev) {
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: WLAN device not found!!",__func__);
ret_status = -1;
break;
}
#ifdef TIMER_MANAGER
vos_timer_manager_init();
#endif
/* Preopen VOSS so that it is ready to start at least SAL */
status = vos_preOpen(&pVosContext);
if (!VOS_IS_STATUS_SUCCESS(status))
{
hddLog(VOS_TRACE_LEVEL_FATAL,"%s: Failed to preOpen VOSS", __func__);
ret_status = -1;
break;
}
hddTraceInit();
hdd_register_debug_callback();
#ifndef MODULE
/* For statically linked driver, call hdd_set_conparam to update curr_con_mode
*/
hdd_set_conparam((v_UINT_t)con_mode);
#endif
// Call our main init function
if (hdd_wlan_startup(dev))
{
hddLog(VOS_TRACE_LEVEL_FATAL,"%s: WLAN Driver Initialization failed",
__func__);
vos_preClose( &pVosContext );
ret_status = -1;
break;
}
} while (0);
if (0 != ret_status)
{
#ifdef TIMER_MANAGER
vos_timer_exit();
#endif
#ifdef MEMORY_DEBUG
vos_mem_exit();
#endif
vos_wake_lock_destroy(&wlan_wake_lock);
#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
wlan_logging_sock_deinit_svc();
#endif
pr_err("%s: driver load failure\n", WLAN_MODULE_NAME);
}
else
{
//Send WLAN UP indication to Nlink Service
send_btc_nlink_msg(WLAN_MODULE_UP_IND, 0);
pr_info("%s: driver loaded\n", WLAN_MODULE_NAME);
}
EXIT();
return ret_status;
}
int hdd_wlan_startup(struct device *dev )
{
....
// Read and parse the qcom_cfg.ini file
status = hdd_parse_config_ini( pHddCtx );
if ( VOS_STATUS_SUCCESS != status )
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: error parsing %s",
__func__, WLAN_INI_FILE);
goto err_config;
}
#ifdef MEMORY_DEBUG
if (pHddCtx->cfg_ini->IsMemoryDebugSupportEnabled)
vos_mem_init();
hddLog(VOS_TRACE_LEVEL_INFO, "%s: gEnableMemoryDebug=%d",
__func__, pHddCtx->cfg_ini->IsMemoryDebugSupportEnabled);
#endif
...
// 设置日志输出的等级
// Update VOS trace levels based upon the cfg.ini
hdd_vos_trace_enable(VOS_MODULE_ID_BAP,
pHddCtx->cfg_ini->vosTraceEnableBAP);
hdd_vos_trace_enable(VOS_MODULE_ID_TL,
pHddCtx->cfg_ini->vosTraceEnableTL);
hdd_vos_trace_enable(VOS_MODULE_ID_WDI,
pHddCtx->cfg_ini->vosTraceEnableWDI);
hdd_vos_trace_enable(VOS_MODULE_ID_HDD,
pHddCtx->cfg_ini->vosTraceEnableHDD);
hdd_vos_trace_enable(VOS_MODULE_ID_SME,
pHddCtx->cfg_ini->vosTraceEnableSME);
hdd_vos_trace_enable(VOS_MODULE_ID_PE,
pHddCtx->cfg_ini->vosTraceEnablePE);
hdd_vos_trace_enable(VOS_MODULE_ID_PMC,
pHddCtx->cfg_ini->vosTraceEnablePMC);
hdd_vos_trace_enable(VOS_MODULE_ID_WDA,
pHddCtx->cfg_ini->vosTraceEnableWDA);
hdd_vos_trace_enable(VOS_MODULE_ID_SYS,
pHddCtx->cfg_ini->vosTraceEnableSYS);
hdd_vos_trace_enable(VOS_MODULE_ID_VOSS,
pHddCtx->cfg_ini->vosTraceEnableVOSS);
hdd_vos_trace_enable(VOS_MODULE_ID_SAP,
pHddCtx->cfg_ini->vosTraceEnableSAP);
hdd_vos_trace_enable(VOS_MODULE_ID_HDD_SOFTAP,
pHddCtx->cfg_ini->vosTraceEnableHDDSAP);
// Update WDI trace levels based upon the cfg.ini
hdd_wdi_trace_enable(eWLAN_MODULE_DAL,
pHddCtx->cfg_ini->wdiTraceEnableDAL);
hdd_wdi_trace_enable(eWLAN_MODULE_DAL_CTRL,
pHddCtx->cfg_ini->wdiTraceEnableCTL);
hdd_wdi_trace_enable(eWLAN_MODULE_DAL_DATA,
pHddCtx->cfg_ini->wdiTraceEnableDAT);
hdd_wdi_trace_enable(eWLAN_MODULE_PAL,
pHddCtx->cfg_ini->wdiTraceEnablePAL);
...
}
static void hdd_vos_trace_enable(VOS_MODULE_ID moduleId, v_U32_t bitmask)
{
wpt_tracelevel level;
/* if the bitmask is the default value, then a bitmask was not
specified in cfg.ini, so leave the logging level alone (it
will remain at the "compiled in" default value) */
// 0xffff
if (CFG_VOS_TRACE_ENABLE_DEFAULT == bitmask)
{
return;
}
/* a mask was specified. start by disabling all logging */
vos_trace_setValue(moduleId, VOS_TRACE_LEVEL_NONE, 0);
/* now cycle through the bitmask until all "set" bits are serviced */
level = VOS_TRACE_LEVEL_FATAL;
while (0 != bitmask)
{
if (bitmask & 1)
{
vos_trace_setValue(moduleId, level, 1);
}
level++;
bitmask >>= 1;
}
}
CORE/HDD/src/wlan_hdd_cfg.c
VOS_STATUS hdd_parse_config_ini(hdd_context_t* pHddCtx)
{
int status, i=0;
/** Pointer for firmware image data */
const struct firmware *fw = NULL;
char *buffer, *line, *pTemp = NULL;
size_t size;
char *name, *value;
/* cfgIniTable is static to avoid excess stack usage */
//MAX_CFG_INI_ITEMS 512, 最多512条
static tCfgIniEntry cfgIniTable[MAX_CFG_INI_ITEMS];
VOS_STATUS vos_status = VOS_STATUS_SUCCESS;
memset(cfgIniTable, 0, sizeof(cfgIniTable));
status = request_firmware(&fw, WLAN_INI_FILE, pHddCtx->parent_dev);
if(status)
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: request_firmware failed %d",__func__, status);
vos_status = VOS_STATUS_E_FAILURE;
goto config_exit;
}
if(!fw || !fw->data || !fw->size)
{
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: %s download failed",
__func__, WLAN_INI_FILE);
vos_status = VOS_STATUS_E_FAILURE;
goto config_exit;
}
hddLog(VOS_TRACE_LEVEL_INFO , "%s: qcom_cfg.ini Size %zu", __func__, fw->size);
buffer = (char*)vos_mem_vmalloc(fw->size);
if(NULL == buffer) {
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: kmalloc failure",__func__);
release_firmware(fw);
return VOS_STATUS_E_FAILURE;
}
pTemp = buffer;
vos_mem_copy((void*)buffer,(void *)fw->data, fw->size);
size = fw->size;
while (buffer != NULL)
{
/*
* get_next_line function used to modify the \n and \r delimiter
* to \0 before returning, without checking if it is over parsing the
* source buffer. So changed the function not to modify the buffer
* passed to it and letting the calling/caller function to take
* care of the return pointer validation and modification of the buffer.
* So validating if the return pointer is not greater than the end
* buffer address and modifying the buffer value.
*/
line = get_next_line(buffer, (pTemp + (fw->size-1)));
if(line >= (pTemp + fw->size)) {
hddLog(VOS_TRACE_LEVEL_FATAL, "%s: INI file seems to be corrupted",
__func__);
vos_status = VOS_STATUS_E_FAILURE;
goto config_exit;
}
else if(line) {
*(line - 1) = '\0';
}
buffer = i_trim(buffer);
hddLog(LOG1, "%s: item", buffer);
// "#"注释不解读
if(strlen((char*)buffer) == 0 || *buffer == '#') {
buffer = line;
continue;
}
// 匹配到END退出解读ini文件
else if(strncmp(buffer, "END", 3) == 0 ) {
break;
}
else
{
name = buffer;
while(*buffer != '=' && *buffer != '\0')
buffer++;
if(*buffer != '\0') {
*buffer++ = '\0';
i_trim(name);
if(strlen (name) != 0) {
buffer = i_trim(buffer);
if(strlen(buffer)>0) {
value = buffer;
while(!i_isspace(*buffer) && *buffer != '\0')
buffer++;
*buffer = '\0';
cfgIniTable[i].name= name;
cfgIniTable[i++].value= value;
if(i >= MAX_CFG_INI_ITEMS) {
hddLog(LOGE,"%s: Number of items in %s > %d",
__func__, WLAN_INI_FILE, MAX_CFG_INI_ITEMS);
break;
}
}
}
}
}
buffer = line;
}
//Loop through the registry table and apply all these configs
vos_status = hdd_apply_cfg_ini(pHddCtx, cfgIniTable, i);
config_exit:
release_firmware(fw);
vos_mem_vfree(pTemp);
return vos_status;
}
2018-8-13, Shenzhen
qcom wlan kernel 解读 WCNSS_qcom_cfg.ini 文件的更多相关文章
- WCNSS_qcom_cfg.ini WIFI配置文件参数详细解析
STA相关的一般配置 参数 含义 最小值 最大值 默认值 gNeighborLookupThreshold 1 触发roam scan发生的条件在WCNSS_qcom_cfg.ini文件中gNeigh ...
- Android qualcomm WCNSS_qcom_cfg.ini 参数介绍
本文介绍WCNSS_qcom_cfg.ini中常用参数的作用. wifi 日志等级 vosTraceEnableBAP=255 vosTraceEnableTL=255 vosTraceEnableW ...
- (转)浅析Mysql的my.ini文件
原文:http://blog.csdn.net/heirenheiren/article/details/7895139 转载:http://hunanpengdake.iteye.com/admin ...
- mysql的my.ini文件详解
mysql数据库在配置时包含很多信息:端口号,字符编码,指定根路径 basedir,指定数据存放的路径等信息 mysql的字体编码分为两种: 服务器编码 客户端输入的编码 通常服务器的编码都是utf- ...
- 浅析Mysql的my.ini文件
转载:http://hunanpengdake.iteye.com/admin/blogs/1647725 今天闲的蛋疼,没事想了解mysql,大家都知道在配置Mysql的过程中,my.ini非常重要 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- C#读取ini文件的方法
最近项目用到ini文件,读取ini文件,方法如下: using System; using System.Collections.Generic; using System.Linq; using S ...
- IIS不能下载ini文件
1.打开IIS. 2.选择站点或者存放*.ini文件的目录,右键菜单中选择属性. 3.选择“HTTP头”选项卡. 4.点击“MINE类型”. 5.点击“新建”. 6.这是跳出一个对话框,在“扩展名”一 ...
- c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)
c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...
随机推荐
- html5中audio的详细使用
html5的audio功能上已经非常强大,回放,跳转,缓冲等以前只能用flash才能实现的功能,html5的audio都能轻松搞定 最近的一个项目使用到了这个功能,把我使用的情况写下来,供大家参考, ...
- yum 卸载 error: %preun(tengine-2.1.0-1.el6.x86_64) scriptlet failed, exit status 6
error: %preun(tengine-2.1.0-1.el6.x86_64) scriptlet failed, exit status 6 Error in PREUN scriptlet i ...
- JavaScript 模块化简述
JavaScript 模块化简述 前言 关于模块化,最直接的表现就是我们写的 require 和 import 关键字,如果查阅相关资料,就一定会遇到 CommonJS .CMD AMD 这些名词,以 ...
- 【Java】Java复习笔记-第四部分
反射 反射: 在运行时动态分析或使用一个类进行工作. java.lang.Class类:描述类信息的类. 类对象:描述一个类信息的对象,当虚拟机加载类的时候,就会创建这个类的类对象并加载该对象,Cla ...
- 【ARM】2410裸机系列-中断处理
目的 为了更好地掌握S3C2410中断的原理及中断程序的编写. 内容利用S3C2410的外部中断0和外部中断1实现两个按键功能 原理 本次选择的是外部中断EXTINT0和EXTINT11.中断的产生分 ...
- asp.net上传大文件-请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- MySQL字段数据全部查出【只保留中文、英文、数字、空格的词表】
select * from xxx_xxx_bak where slot_type_id in ('xxx', 'xxx') ; by @大超超 记录备查
- sql server 与oracle 中字段类型的对应
SqlServer 2k转换为Oracle 10g 列名 SqlServer数据类型 SqlServer长度 Oracle数据类型 column1 ) column2 ) column3 ) colu ...
- 让cpu跑到100%的bat文件
请你新建一个叫“virus.bat”的批处理文件,里面填写上如下三段命令: Echo "welcom to the aqjava's world"Tree /fCall virus ...
- [转] 怎么减少编程中的 bug?
[转]http://macshuo.com/?p=1361 怎么减少编程中的 bug? Posted on 2016 年 2 月 17 日 为什么要编程?因为代码没在那里.创造一个世界是如此让人着迷, ...