rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame] | 1 | /***************************************************************************** |
| 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 | |
| 85 | static kal_timerid atcmd_tmr_id; |
| 86 | |
| 87 | static 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 | |
| 96 | static 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 | |
| 105 | static 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 | |
| 114 | static kal_bool tia_atcmd_auxadc_efuse(void) |
| 115 | { |
| 116 | tia_adc_dbg_efuse(NULL, NULL); |
| 117 | return KAL_TRUE; |
| 118 | } |
| 119 | |
| 120 | static 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 | |
| 146 | static 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 | |
| 173 | static 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 | |
| 203 | static 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 | |
| 218 | static void atcmd_tmr_handler(void *param_ptr) |
| 219 | { |
| 220 | tia_atcmd_all_sensor_temp(); |
| 221 | } |
| 222 | |
| 223 | static 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 | |
| 248 | static 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 | |
| 272 | void tia_atcmd_init(void) |
| 273 | { |
| 274 | atcmd_tmr_id = kal_create_timer("TIA_ATCMD"); |
| 275 | } |
| 276 | |
| 277 | kal_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 | |
| 320 | T_EXIT: |
| 321 | return ret; |
| 322 | } |