1ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
2ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
3ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Copyright (C) 2009-2012 Broadcom Corporation
4ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
5ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Licensed under the Apache License, Version 2.0 (the "License");
6ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  you may not use this file except in compliance with the License.
7ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  You may obtain a copy of the License at:
8ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
9ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  http://www.apache.org/licenses/LICENSE-2.0
10ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
11ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Unless required by applicable law or agreed to in writing, software
12ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  distributed under the License is distributed on an "AS IS" BASIS,
13ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  See the License for the specific language governing permissions and
15ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  limitations under the License.
16ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
17ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/
18ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
19ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
20ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
21ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Filename:      conf.c
22ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
23ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *  Description:   Contains functions to conduct run-time module configuration
24ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *                 based on entries present in the .conf file
25ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville *
26ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville ******************************************************************************/
27ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
28ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define LOG_TAG "bt_vnd_conf"
29ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
30ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <utils/Log.h>
31ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include <string.h>
32ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#include "bt_vendor_brcm.h"
33ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
34ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
35ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Externs
36ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
37ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint userial_set_port(char *p_conf_name, char *p_conf_value, int param);
38ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint hw_set_patch_file_path(char *p_conf_name, char *p_conf_value, int param);
39ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint hw_set_patch_file_name(char *p_conf_name, char *p_conf_value, int param);
40ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
41ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilleint hw_set_patch_settlement_delay(char *p_conf_name, char *p_conf_value, int param);
42ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
43ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
44ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
45ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
46ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Local type definitions
47ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
48ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
49ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define CONF_COMMENT '#'
50ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define CONF_DELIMITERS " =\n\r\t"
51ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define CONF_VALUES_DELIMITERS "=\n\r\t"
52ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#define CONF_MAX_LINE_LEN 255
53ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
54ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilletypedef int (conf_action_t)(char *p_conf_name, char *p_conf_value, int param);
55ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
56ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savilletypedef struct {
57ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    const char *conf_entry;
58ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    conf_action_t *p_action;
59ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    int param;
60ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville} conf_entry_t;
61ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
62ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/******************************************************************************
63ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**  Static variables
64ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville******************************************************************************/
65ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
66ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*
67ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville * Current supported entries and corresponding action functions
68ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville */
69ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillestatic const conf_entry_t conf_table[] = {
70ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {"UartPort", userial_set_port, 0},
71ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {"FwPatchFilePath", hw_set_patch_file_path, 0},
72ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {"FwPatchFileName", hw_set_patch_file_name, 0},
73ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#if (VENDOR_LIB_RUNTIME_TUNING_ENABLED == TRUE)
74ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {"FwPatchSettlementDelay", hw_set_patch_settlement_delay, 0},
75ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville#endif
76ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {(const char *) NULL, NULL, 0}
77ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville};
78ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
79ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*****************************************************************************
80ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**   CONF INTERFACE FUNCTIONS
81ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*****************************************************************************/
82ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
83ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville/*******************************************************************************
84ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
85ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Function        vnd_load_conf
86ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
87ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Description     Read conf entry from p_path file one by one and call
88ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**                 the corresponding config function
89ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
90ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville** Returns         None
91ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville**
92ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville*******************************************************************************/
93ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Savillevoid vnd_load_conf(const char *p_path)
94ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville{
95ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    FILE    *p_file;
96ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char    *p_name;
97ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char    *p_value;
98ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    conf_entry_t    *p_entry;
99ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    char    line[CONF_MAX_LINE_LEN+1]; /* add 1 for \0 char */
100ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
101ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    ALOGI("Attempt to load conf from %s", p_path);
102ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
103ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    if ((p_file = fopen(p_path, "r")) != NULL)
104ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
105ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        /* read line by line */
106ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        while (fgets(line, CONF_MAX_LINE_LEN+1, p_file) != NULL)
107ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        {
108ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            if (line[0] == CONF_COMMENT)
109ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                continue;
110ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
111ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            p_name = strtok(line, CONF_DELIMITERS);
112ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
113ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            if (NULL == p_name)
114ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
115ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                continue;
116ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
117ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
118ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            p_value = strtok(NULL, CONF_DELIMITERS);
119ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
120ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            if (NULL == p_value)
121ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
122ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                ALOGW("vnd_load_conf: missing value for name: %s", p_name);
123ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                continue;
124ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
125ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
126ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            p_entry = (conf_entry_t *)conf_table;
127ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
128ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            while (p_entry->conf_entry != NULL)
129ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            {
130ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                if (strcmp(p_entry->conf_entry, (const char *)p_name) == 0)
131ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                {
132ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                    p_entry->p_action(p_name, p_value, p_entry->param);
133ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                    break;
134ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                }
135ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
136ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville                p_entry++;
137ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville            }
138ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        }
139ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
140ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        fclose(p_file);
141ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
142ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    else
143ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    {
144ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville        ALOGI( "vnd_load_conf file >%s< not found", p_path);
145ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville    }
146ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville}
147ee836ae92bf015f6c0b00a974ace3b9188bd6c66Wink Saville
148