blob: d9eb29a8bc43402c7d6a97b3ea93c12d3bfe2319 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2017
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 *
38 * Filename:
39 * ---------
40 * tia_atcmd.c
41 *
42 * Project:
43 * --------
44 * VMOLY
45 *
46 * Description:
47 * ------------
48 * TIA (Thermal Information Acquisition) driver - atcmd
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 * removed!
60 * removed!
61 *
62 * removed!
63 * removed!
64 * removed!
65 *
66 * removed!
67 * removed!
68 * removed!
69 * removed!
70 * removed!
71 * removed!
72 * removed!
73 * removed!
74 *------------------------------------------------------------------------------
75 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
76 *============================================================================
77 ****************************************************************************/
78
79#include "kal_public_api.h"
80#include "drv_comm.h"
81#include "us_timer.h"
82#include "tia_reg.h"
83#include "tia.h"
84
85static kal_timerid atcmd_tmr_id;
86
87static kal_bool tia_atcmd_sensor_info(kal_uint32 len, kal_uint8 *dat)
88{
89 // B0 B1 B2 B3 description
90 // .. all
91 // .. TID TID = 0~3, 4:all
92 tia_dbg_sns_infs((len < 2)? TIA_SENSOR_NUM: dat[1]);
93 return KAL_TRUE;
94}
95
96static kal_bool tia_atcmd_sensor_state(kal_uint32 len, kal_uint8 *dat)
97{
98 // B0 B1 B2 B3 description
99 // .. all
100 // .. TID TID = 0~3, 4:all
101 tia_dbg_thr_cfgs((len < 2)? TIA_SENSOR_NUM: dat[1]);
102 return KAL_TRUE;
103}
104
105static kal_bool tia_atcmd_monitor_state(kal_uint32 len, kal_uint8 *dat)
106{
107 // B0 B1 B2 B3 description
108 // .. all
109 // .. TID TID = 0~3, 4:all
110 tia_dbg_thr_mons((len < 2)? TIA_SENSOR_NUM: dat[1]);
111 return KAL_TRUE;
112}
113
114static kal_bool tia_atcmd_auxadc_efuse(void)
115{
116 tia_adc_dbg_efuse(NULL, NULL);
117 return KAL_TRUE;
118}
119
120static kal_bool tia_atcmd_fake_tmp(kal_uint32 len, kal_uint8 *dat)
121{
122 #ifdef __MTK_INTERNAL__
123 // B0 B1 B2 B3 B4 description
124 // .. disable
125 // .. TID XX YY ZZ enable, TID={0~3, 4:all}, 0xXXYYZZ={ohm}
126 kal_bool ret = KAL_TRUE;
127
128 if (len < 2) {
129 tia_dbg_fake_en(KAL_FALSE);
130 } else if (len >= 5) {
131 kal_uint32 tid, val;
132 tid = dat[1];
133 val = (dat[2] << 16) | (dat[3] << 8) | (dat[4] << 0);
134 tia_dbg_fake_ohm(tid, val);
135 tia_dbg_fake_en(KAL_TRUE);
136 } else {
137 ret = KAL_FALSE;
138 }
139
140 return ret;
141 #else
142 return KAL_FALSE;
143 #endif
144}
145
146static kal_bool tia_atcmd_set_alarm(kal_uint32 len, kal_uint8 *dat)
147{
148 #ifdef __MTK_INTERNAL__
149 kal_uint32 idx, cid;
150 tfwk_thermal_cfg_t cfg[4]={};
151
152 // B1={enable,type}, B2={sid,aid}, B3=thres(signed'C), B4=hyst('C), B5=period(ms) => loop 1~4
153 if ((len != 1+5*1) && (len != 1+5*2) && (len != 1+5*3) && (len != 1+5*4)) {
154 return KAL_FALSE;
155 }
156 for (idx = 1, cid = 0; idx + 5 <= len; idx += 5, cid++) {
157 cfg[cid].enable = dat[idx+0] >> 4;
158 cfg[cid].sensor_alarm_type = dat[idx+0] & 0xF;
159 cfg[cid].sensor_id = dat[idx+1] >> 4;
160 cfg[cid].alarm_id = dat[idx+1] & 0xF;
161 cfg[cid].threshold_value = ((signed char) dat[idx+2]) * 10;
162 cfg[cid].hysteresis_value = dat[idx+3] * 10;
163 cfg[cid].sampling_period = dat[idx+4];
164 }
165 tia_set_alarm(cid, cfg);
166
167 return KAL_TRUE;
168 #else
169 return KAL_FALSE;
170 #endif
171}
172
173static kal_bool tia_atcmd_set_rc(kal_uint32 len, kal_uint8 *dat)
174{
175 #ifdef __MTK_INTERNAL__
176 // B0 B1 B2 description
177 // .. UID RC UID={0:MD,1:GPS,2:AP,3:all}, RC={0:100K,1:30K,2:400K}
178 kal_bool ret = KAL_FALSE;
179 kal_uint32 idx, msk, val;
180 kal_uint32 adr[] = {TIA_TIA2_MD_RC_CTRL, TIA_TIA2_GPS_RC_CTRL, TIA_TIA2_AP_RC_CTRL};
181
182 if ((len >= 3) /*&& (dat[1] <= 3)*/ && (dat[2] <= 2)) {
183 msk = (dat[1] < 3)? (1 << dat[1]): 0x7;
184 val = TIA_TIA2_GPS_RC_CTRL_TSX_RC_SEL_GPS(dat[2])|
185 TIA_TIA2_GPS_RC_CTRL_T0_RC_SEL_GPS(dat[2]) |
186 TIA_TIA2_GPS_RC_CTRL_T1_RC_SEL_GPS(dat[2]) |
187 TIA_TIA2_GPS_RC_CTRL_T2_RC_SEL_GPS(dat[2]) |
188 TIA_TIA2_GPS_RC_CTRL_T3_RC_SEL_GPS(dat[2]);
189 for (idx = 0; idx <= 2; idx++) {
190 if (msk & (1 << idx)) {
191 DRV_WriteReg32(adr[idx], val);
192 }
193 }
194 ret = KAL_TRUE;
195 }
196
197 return ret;
198 #else
199 return KAL_FALSE;
200 #endif
201}
202
203static kal_bool tia_atcmd_all_sensor_temp(void)
204{
205 kal_uint32 idx, us;
206 kal_int32 tmp[TIA_LVTS_GET_ALL_NUM+TIA_SENSOR_NUM] = {};
207
208 us = ust_get_current_time(); UNUSED_PARAMETER(us);
209 TIA_LVTS_GET_ALL_TEMP(TIA_LVTS_GET_ALL_NUM, &tmp[0]);
210 for (idx = 0; idx < TIA_SENSOR_NUM; idx++) {
211 tia_get_temp(TIA_SENSOR_SID(idx), &tmp[TIA_LVTS_GET_ALL_NUM+idx]);
212 }
213 MD_TRC(TIA_MSG_THERMAL_TMP_ALL_8, tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5], tmp[6], tmp[7], us);
214
215 return KAL_TRUE;
216}
217
218static void atcmd_tmr_handler(void *param_ptr)
219{
220 tia_atcmd_all_sensor_temp();
221}
222
223static kal_bool atcmd_tmr_enable(
224 kal_uint32 en/*0:disable,1:enable,2:toggle*/,
225 kal_uint32 ms/*0:default(1000ms),others:XXms*/)
226{
227 static kal_bool tmr_st = KAL_FALSE;
228 kal_uint32 cfg_en = (en == 2)? (!tmr_st): en;
229 kal_uint32 cfg_ms = (ms == 0)? 1000: ms;
230 kal_uint32 tick;
231
232 switch (cfg_en) {
233 case 0:
234 kal_cancel_timer(atcmd_tmr_id);
235 tmr_st = KAL_FALSE;
236 break;
237 case 1:
238 tick = kal_milli_secs_to_ticks(cfg_ms);
239 kal_set_timer(atcmd_tmr_id, atcmd_tmr_handler, NULL, 1, tick);
240 tmr_st = KAL_TRUE;
241 break;
242 default:
243 return KAL_FALSE;
244 }
245 return KAL_TRUE;
246}
247
248static kal_bool tia_atcmd_all_sensor_temp_periodic(kal_uint32 len, kal_uint8 *dat)
249{
250 // B0 B1 B2 B3 description
251 // .. all temperature log periodic - toggle
252 // .. 00 disable
253 // .. 01 [XX YY] enable, default: 1000 ms, others: 0xXXYY ms
254 kal_bool ret = KAL_FALSE;
255
256 if (len == 1) {
257 ret = atcmd_tmr_enable(2, 0);
258 } else if (dat[1] == 0x00) {
259 ret = atcmd_tmr_enable(0, 0);
260 } else if (dat[1] == 0x01) {
261 if (len == 2) {
262 ret = atcmd_tmr_enable(1, 0);
263 } else if (len >= 4) {
264 kal_uint32 ms = (dat[2] << 8) + dat[3];
265 ret = atcmd_tmr_enable(1, ms);
266 }
267 }
268
269 return ret;
270}
271
272void tia_atcmd_init(void)
273{
274 atcmd_tmr_id = kal_create_timer("TIA_ATCMD");
275}
276
277kal_bool tia_atcmd_public(kal_uint32 data_len, kal_uint8 *data_str)
278{
279 kal_bool ret = KAL_FALSE;
280
281 if (data_len < 1) {
282 goto T_EXIT;
283 }
284
285 switch (data_str[0]) {
286 // 0x2x for tia only
287 case 0x20:
288 ret = tia_atcmd_sensor_info(data_len, data_str);
289 break;
290 case 0x21:
291 ret = tia_atcmd_sensor_state(data_len, data_str);
292 break;
293 case 0x22:
294 ret = tia_atcmd_monitor_state(data_len, data_str);
295 break;
296 case 0x24:
297 ret = tia_atcmd_auxadc_efuse();
298 break;
299 case 0x29:
300 ret = tia_atcmd_fake_tmp(data_len, data_str);
301 break;
302 case 0x2A:
303 ret = tia_atcmd_set_alarm(data_len, data_str);
304 break;
305 case 0x2C:
306 ret = tia_atcmd_set_rc(data_len, data_str);
307 break;
308
309 // 0x3x for thermal cross modules (lvts + tia + ...)
310 case 0x30:
311 ret = tia_atcmd_all_sensor_temp();
312 break;
313 case 0x31:
314 ret = tia_atcmd_all_sensor_temp_periodic(data_len, data_str);
315 break;
316 default:
317 break;
318 }
319
320T_EXIT:
321 return ret;
322}