kernel
mtk_agpsd
[ccci1/chr]write error done on ttyC2, l=26 r=-19
/vendor/etc/init/mtk_agpsd.rc
on post-fs-data
mkdir /data/agps_supl 0771 gps system
service agpsd /vendor/bin/mtk_agpsd
class main
socket agpsd stream 660 gps system
socket agpsd2 stream 660 gps inet
socket agpsd3 stream 660 gps inet
user gps
group gps radio inet sdcard_r sdcard_rw misc system
stop agpsd
wdtk
每隔20秒1次。
[wdk-c] cpu=1,lbit=0x2,cbit=0xf,0,1,771100078,[1271090987183]
[thread:247][RT:1271091038491] 2025-03-26 10:29:17.603658 UTC;android time 2025-03-26 18 :29:17.603658
[wdk-c] cpu=0,lbit=0x3,cbit=0xf,0,1,771100078,[1271094292568]
[wdk-c] cpu=2,lbit=0x7,cbit=0xf,0,1,771100078,[1271094302799]
[wdk-k] cpu=3,lbit=0xf,cbit=0xf,0,1,771100078,[1271094308799]
drivers/watchdog/mediatek/wdk/wd_common_drv.c
481 static void kwdt_process_kick(int local_bit, int cpu, char msg_buf[])
482 {
483 local_bit = kick_bit;
484 if ((local_bit & (1 << cpu)) == 0) {
485 /* pr_debug("[wdk] set kick_bit\n"); */
486 local_bit |= (1 << cpu);
487 /* aee_rr_rec_wdk_kick_jiffies(jiffies); */
488 }
489
490 /*
491 * do not print message with spinlock held to
492 * avoid bulk of delayed printk happens here
493 */
494 snprintf(msg_buf, WK_MAX_MSG_SIZE,
495 "[wdk-c] cpu=%d,lbit=0x%x,cbit=0x%x,%d,%d,%lld,[%lld]\n",
496 cpu, local_bit, wk_check_kick_bit(), lasthpg_cpu, lasthpg_act,
497 lasthpg_t, sched_clock());
498
499 if (local_bit == wk_check_kick_bit()) {
500 msg_buf[5] = 'k';
501 mtk_wdt_restart(WD_TYPE_NORMAL);/* for KICK external wdt */
502 local_bit = 0;
503 }
504
505 kick_bit = local_bit;
506 spin_unlock(&lock);
507
508 /*
509 * [wdt-c]: mark local bit only.
510 * [wdt-k]: kick watchdog actaully, this log is more important thus
511 * using printk_deferred to ensure being printed.
512 */
513 if (msg_buf[5] != 'k')
514 pr_info("%s", msg_buf);
515 else
516 printk_deferred("%s", msg_buf);
517
518 #ifdef CONFIG_LOCAL_WDT
519 printk_deferred("[wdk] cpu:%d, kick local wdt,RT[%lld]\n",
520 cpu, sched_clock());
521 /* kick local wdt */
522 mpcore_wdt_restart(WD_TYPE_NORMAL);
523 #endif
524 }
/proc/wdk
# cat /proc/wdk
mode interval timeout enable
2 20 -1 1
write
%d %d %d %d %d
mode, kinterval, timeout, debug_sleep, en
MIN_KICK_INTERVAL 1
MAX_KICK_INTERVAL 30
36 enum ext_wdt_mode {
37 WDT_IRQ_ONLY_MODE,
38 WDT_HW_REBOOT_ONLY_MODE,
39 WDT_DUAL_MODE,
40 };
/proc/mrdump_rst
write
%d %d %d
mrdump_rst_source, mode, en
mrdump_rst_source(%d) value need smaller than 2
mrdump_rst_mode(%d) value should be smaller than 2
61 #define MRDUMP_SYSRESETB 0
62 #define MRDUMP_EINTRST 1
watchdog
每隔30秒1次。system_server进程中有个watchdog线程每30秒喂一次狗,持续5分钟没喂狗,内核hang_detect线程检测到系统挂起,创建dump_last_thread线程,打印backtrace。busybox pstree -p `pidof system_server`。
AEEIOCTL_RT_MON_Kick ( 300)
[Hang_Detect] hang_detect enabled 10
ioctl
265 /* QHQ RT Monitor */
266 if (cmd == AEEIOCTL_RT_MON_Kick) {
267 pr_info("AEEIOCTL_RT_MON_Kick ( %d)\n", (int)arg);
268 aee_kernel_RT_Monitor_api((int)arg);
269 return ret;
270 }
271 /* QHQ RT Monitor end */
api
HD_INTER 30,检测间隔30秒。
lParam | hd_detect_enabled | hang_detect_counter | hd_timeout |
0 | 0 | = hd_timeout | |
& 0x1000 | (lParam & 0x0fff) + HD_INTER - 1) / (HD_INTER) | (lParam & 0x0fff) + HD_INTER - 1) / (HD_INTER) | |
1 | ((long)lParam + HD_INTER - 1) / (HD_INTER) | ((long)lParam + HD_INTER - 1) / (HD_INTER) |
1834 void aee_kernel_RT_Monitor_api(int lParam)
1835 {
1836 reset_hang_info();
1837 if (reboot_flag) {
1838 pr_info("[Hang_Detect] in reboot flow.\n");
1839 return;
1840 }
1841
1842 if (lParam == 0) {
1843 hd_detect_enabled = 0;
1844 hang_detect_counter = hd_timeout;
1845 pr_info("[Hang_Detect] hang_detect disabled\n");
1846 } else if (lParam > 0) {
1847 /* lParem=0x1000|timeout,only set in aee call when NE in
1848 * system_server so only change hang_detect_counter when
1849 * call from AEE
1850 * Others ioctl, will change
1851 * hd_detect_enabled & hang_detect_counter
1852 */
1853 if (lParam & 0x1000) {
1854 hang_detect_counter = hd_timeout =
1855 ((long)(lParam & 0x0fff) + HD_INTER - 1) / (HD_INTER);
1856 } else {
1857 hd_detect_enabled = 1;
1858 hang_detect_counter = hd_timeout =
1859 ((long)lParam + HD_INTER - 1) / (HD_INTER);
1860 }
1861 if (hd_timeout < 10) {
1862 /* hang detect min timeout is 10 (5min) */
1863 hang_detect_counter = 10;
1864 hd_timeout = 10;
1865 }
1866 pr_info("[Hang_Detect] hang_detect enabled %d\n", hd_timeout);
1867 }
1868 }
hang_detect
每隔30秒1次。低内存检测,默认关闭。system_server检测,systerm_server重启,给2分钟时间重启。init AEEIOCTL_SET_HANG_REBOOT时,reboot_flag=true,3秒超时1次。
[Hang_Detect] hang_detect thread counts down 10:10, status 1.
thread
drivers/misc/mediatek/aee/aed/monitor_hang.c
1706 static int hang_detect_thread(void *arg)
1707 {
1708
1709 /* unsigned long flags; */
1710 struct sched_param param = {
1711 .sched_priority = 99
1712 };
1713 struct task_struct *hd_thread;
1714 struct pt_regs saved_regs;
1715 #ifdef HANG_LOW_MEM
1716 char *buf = NULL;
1717 #endif
1718
1719 sched_setscheduler(current, SCHED_FIFO, ¶m);
1720 reset_hang_info();
1721 msleep(120 * 1000);
1722 pr_debug("[Hang_Detect] hang_detect thread starts.\n");
1723 while (1) {
1724 pr_info(
1725 "[Hang_Detect] hang_detect thread counts down %d:%d, status %d.\n",
1726 hang_detect_counter, hd_timeout, hd_detect_enabled);
1727 system_server_pid = FindTaskByName("system_server");
/dev/RT_Monitor
crw------- 1 system system 10, 54 2025-03-27 09:26 /dev/RT_Monitor
/proc/monitor_hang
CONFIG_MTK_ENG_BUILD时才创建。0-disable ke,1-enable ke,2,3,4-disable coredump,5-enable coredump,10-show_native_bt_by_pid。
drivers/misc/mediatek/Kconfig
100 config MTK_ENG_BUILD
101 bool "flag for MTK eng/usr build verification"
102 default n
103 help
104 Y means this kernel version is engineering mode and has more debugging
105 features built-in. This option is supposed to specifiy engineering or
106 user load for this build.
107 If you are not sure about this, set n
proc_write
141 static ssize_t monitor_hang_proc_write(struct file *filp, const char *ubuf,
142 size_t cnt, loff_t *data)
143 {
144 char buf[64];
145 long val;
146 int ret;
147
148 if (cnt >= sizeof(buf))
149 return -EINVAL;
150
151 if (copy_from_user(&buf, ubuf, cnt))
152 return -EFAULT;
153
154 buf[cnt] = 0;
155
156 ret = kstrtoul(buf, 10, (unsigned long *)&val);
157
158 if (ret < 0)
159 return ret;
160
161 if (val == 1) {
162 monit_hang_flag = 1;
163 pr_debug("[hang_detect] enable ke.\n");
164 } else if (val == 0) {
165 monit_hang_flag = 0;
166 pr_debug("[hang_detect] disable ke.\n");
167 } else if (val == 2) {
168 reset_hang_info();
169 ShowStatus(0);
170 } else if (val == 3) {
171 reset_hang_info();
172 ShowStatus(1);
173 } else if (val == 4) {
174 hang_aee_warn = 0;
175 pr_info("[hang_detect] disable coredump.\n");
176 } else if (val == 5) {
177 hang_aee_warn = 2;
178 pr_info("[hang_detect] denable coredump.\n");
179 } else if (val > 10) {
180 show_native_bt_by_pid((int)val);
181 }
182
183 return cnt;
184 }
alarm_dev
[1071:AlarmManager]alarm 2 set 13913.486000000
[1071:AlarmManager]alarm 3 set 1320.000000000
[667:system_server]: alarmtimer_enqueue, 14684832000000
[1071:AlarmManager]: alarmtimer_enqueue, 14684832000000
[1221:LocationManager]alarm_dev: set rtc 1743038791 0 - rtc 01:26:31 03/27/2025
[1221:LocationManager]alarm_dev: set rtc 1743039602 0 - rtc 01:40:02 03/27/2025
[1221:LocationManager]alarm_dev: set rtc 1743045009 0 - rtc 03:10:09 03/27/2025
alarm_dev
drivers/staging/android/alarm-dev.c
165 static void alarm_set(enum android_alarm_type alarm_type, struct timespec *ts)
166 {
167 u32 alarm_type_mask = 1U << alarm_type;
168 unsigned long flags;
169
170 pr_notice("alarm %d set %ld.%09ld\n", alarm_type,
171 ts->tv_sec, ts->tv_nsec);
172 if (alarm_type == ANDROID_ALARM_POWER_ON) {
173 alarm_set_power_on(*ts, false);
174 return;
175 }
176 if (alarm_type == ANDROID_ALARM_POWER_ON_LOGO) {
177 alarm_set_power_on(*ts, true);
178 return;
179 }
180
181 spin_lock_irqsave(&alarm_slock, flags);
182 alarm_enabled |= alarm_type_mask;
183 devalarm_start(&alarms[alarm_type], timespec_to_ktime(*ts));
184 spin_unlock_irqrestore(&alarm_slock, flags);
185 }
android_alarm_type
drivers/staging/android/android_alarm.h
33 enum android_alarm_type {
34 /* return code bit numbers or set alarm arg */
35 ANDROID_ALARM_RTC_WAKEUP,
36 ANDROID_ALARM_RTC,
37 ANDROID_ALARM_ELAPSED_REALTIME_WAKEUP,
38 ANDROID_ALARM_ELAPSED_REALTIME,
39 ANDROID_ALARM_SYSTEMTIME,
40
41 ANDROID_ALARM_TYPE_COUNT,
42
43 ANDROID_ALARM_POWER_ON = 6,
44 ANDROID_ALARM_POWER_ON_LOGO = 7,
45 /* return code bit numbers */
46 /* ANDROID_ALARM_TIME_CHANGE = 16 */
47 };
alarmtimer_enqueue
kernel/time/alarmtimer.c
129 /**
130 * alarmtimer_enqueue - Adds an alarm timer to an alarm_base timerqueue
131 * @base: pointer to the base where the timer is being run
132 * @alarm: pointer to alarm being enqueued.
133 *
134 * Adds alarm to a alarm_base timerqueue
135 *
136 * Must hold base->lock when calling.
137 */
138 static void alarmtimer_enqueue(struct alarm_base *base, struct alarm *alarm)
139 {
140 static DEFINE_RATELIMIT_STATE(ratelimit, HZ - 1, 5);
141
142 if (alarm->state & ALARMTIMER_STATE_ENQUEUED)
143 timerqueue_del(&base->timerqueue, &alarm->node);
144
145 if (__ratelimit(&ratelimit)) {
146 ratelimit.begin = jiffies;
147 pr_notice("%s, %lld\n", __func__, alarm->node.expires.tv64);
148 }
149
150 timerqueue_add(&base->timerqueue, &alarm->node);
151 alarm->state |= ALARMTIMER_STATE_ENQUEUED;
152 }
alarm_set_rtc
215 static int alarm_set_rtc(struct timespec *ts)
216 {
217 struct rtc_time new_rtc_tm;
218 struct rtc_device *rtc_dev;
219 unsigned long flags;
220 int rv = 0;
221
222 rtc_time_to_tm(ts->tv_sec, &new_rtc_tm);
223 pr_notice("set rtc %ld %ld - rtc %02d:%02d:%02d %02d/%02d/%04d\n",
224 ts->tv_sec, ts->tv_nsec,
225 new_rtc_tm.tm_hour, new_rtc_tm.tm_min,
226 new_rtc_tm.tm_sec, new_rtc_tm.tm_mon + 1,
227 new_rtc_tm.tm_mday, new_rtc_tm.tm_year + 1900);
228 rtc_dev = alarmtimer_get_rtcdev();
229 rv = do_settimeofday(ts);
230 if (rv < 0)
231 return rv;
232 if (rtc_dev)
233 rv = rtc_set_time(rtc_dev, &new_rtc_tm);
234
235 spin_lock_irqsave(&alarm_slock, flags);
236 alarm_pending |= ANDROID_ALARM_TIME_CHANGE_MASK;
237 wake_up(&alarm_wait_queue);
238 spin_unlock_irqrestore(&alarm_slock, flags);
239
240 return rv;
241 }
mt635x_auxadc_read_raw
[20134:kworker/u8:5]mt635x_auxadc_read_raw: 5 callbacks suppressed
drivers/misc/mediatek/pmic/common/mt635x-auxadc.c
237 static int mt635x_auxadc_read_raw(struct iio_dev *indio_dev,
238 struct iio_chan_spec const *chan,
239 int *val,
240 int *val2,
241 long mask)
242 {
243 struct mt635x_auxadc_device *adc_dev = iio_priv(indio_dev);
244 const struct auxadc_channels *auxadc_chan;
245 unsigned short auxadc_out;
246 int ret;
247 static DEFINE_RATELIMIT_STATE(ratelimit, 2 * HZ, 1);
248
249 mutex_lock(&adc_dev->lock);
250 pm_stay_awake(adc_dev->dev);
251
252 auxadc_out = get_auxadc_out(adc_dev, chan->channel);
253
254 pm_relax(adc_dev->dev);
255 mutex_unlock(&adc_dev->lock);
256
257 auxadc_chan = &auxadc_chans[chan->channel];
258 switch (mask) {
259 case IIO_CHAN_INFO_PROCESSED:
260 *val = (int)(auxadc_out * auxadc_chan->r_ratio[0] * VOLT_FULL);
261 *val = (*val / auxadc_chan->r_ratio[1]) >> auxadc_chan->res;
262 if (auxadc_chan->cali_fn)
263 *val = auxadc_chan->cali_fn(*val, 10);
264 ret = IIO_VAL_INT;
265 break;
266 case IIO_CHAN_INFO_RAW:
267 *val = (int)auxadc_out;
268 ret = IIO_VAL_INT;
269 break;
270 default:
271 return -EINVAL;
272 }
273 if (__ratelimit(&ratelimit)) {
274 dev_dbg(adc_dev->dev,
275 "name:%s, channel=%d, adc_out=0x%x, adc_result=%d\n",
276 auxadc_chan->ch_name, auxadc_chan->ch_num,
277 auxadc_out, *val);
278 } else {
279 HKLOG("name:%s, channel=%d, adc_out=0x%x, adc_result=%d\n",
280 auxadc_chan->ch_name, auxadc_chan->ch_num,
281 auxadc_out, *val);
282 }
283 return ret;
284 }
HKLOG
drivers/misc/mediatek/pmic/include/mt6357/mtk_pmic_info.h
41 #define PMIC_LOG_DBG 4
42 #define PMIC_LOG_INFO 3
43 #define PMIC_LOG_NOT 2
44 #define PMIC_LOG_WARN 1
45 #define PMIC_LOG_ERR 0
52 #define HKLOG(fmt, arg...) do { \
53 if (gPMICHKDbgLvl >= PMIC_LOG_DBG) \
54 pr_notice(PMICTAG "%s: " fmt, __func__, ##arg); \
55 } while (0)
pmic_dbg_level_set
drivers/misc/mediatek/pmic/mt6357/v1/pmic_debugfs.c
26 /*
27 * PMIC debug level
28 */
29 unsigned int pmic_dbg_level_set(unsigned int level)
30 {
31 unsigned char Dlevel = (level & 0x7);
32 unsigned char HKlevel = (level & 0x38) >> 3;
33 unsigned char COMlevel = (level & 0x1C0) >> 6;
34 unsigned char IRQlevel = (level & 0xE00) >> 9;
35 unsigned char REGlevel = (level & 0x7000) >> 12;
36
37 gPMICDbgLvl = Dlevel > PMIC_LOG_DBG ? PMIC_LOG_DBG : Dlevel;
38 gPMICHKDbgLvl = HKlevel > PMIC_LOG_DBG ? PMIC_LOG_DBG : HKlevel;
39 gPMICCOMDbgLvl = COMlevel > PMIC_LOG_DBG ? PMIC_LOG_DBG : COMlevel;
40 gPMICIRQDbgLvl = IRQlevel > PMIC_LOG_DBG ? PMIC_LOG_DBG : IRQlevel;
41 gPMICREGDbgLvl = REGlevel > PMIC_LOG_DBG ? PMIC_LOG_DBG : REGlevel;
42 return 0;
43 }
pmic_dbg_level_show
drivers/misc/mediatek/pmic/common/upmu_debugfs.c
30 /*-------pmic_dbg_level global variable-------*/
31 unsigned int gPMICDbgLvl;
32 unsigned int gPMICHKDbgLvl;
33 unsigned int gPMICIRQDbgLvl;
34 unsigned int gPMICREGDbgLvl;
35 unsigned int gPMICCOMDbgLvl; /* so far no used */
196 static int pmic_dbg_level_show(struct seq_file *s, void *unused)
197 {
198 seq_puts(s, "4:PMIC_LOG_DBG\n");
199 seq_puts(s, "3:PMIC_LOG_INFO\n");
200 seq_puts(s, "2:PMIC_LOG_NOT\n");
201 seq_puts(s, "1:PMIC_LOG_WARN\n");
202 seq_puts(s, "0:PMIC_LOG_ERR\n");
203 seq_printf(s, "PMIC_Dbg_Lvl = %d\n", gPMICDbgLvl);
204 seq_printf(s, "PMIC_HK_Dbg_Lvl = %d\n", gPMICHKDbgLvl);
205 seq_printf(s, "PMIC_IRQ_Dbg_Lvl = %d\n", gPMICIRQDbgLvl);
206 seq_printf(s, "PMIC_REG_Dbg_Lvl = %d\n", gPMICREGDbgLvl);
207 seq_printf(s, "PMIC_COM_Dbg_Lvl = %d\n", gPMICCOMDbgLvl);
208 return 0;
209 }
pmic_dbg_level_write
160 /*-------pmic_dbg_level-------*/
161 static ssize_t pmic_dbg_level_write(struct file *file,
162 const char __user *buf,
163 size_t size,
164 loff_t *ppos)
165 {
166 char info[10];
167 unsigned int value = 0;
168 int ret = 0;
169
170 memset(info, 0, 10);
171
172 ret = simple_write_to_buffer(info, sizeof(info) - 1, ppos, buf, size);
173 if (ret < 0)
174 return ret;
175
176 ret = kstrtou32(info, 16, (unsigned int *)&value);
177 if (ret)
178 return ret;
179
180 pr_info("[%s] value=0x%x\n", __func__, value);
181 if (value != 0xFFFF) {
182 pmic_dbg_level_set(value);
183 pr_info("D %d, HK %d, IRQ %d, REG %d, COM %d\n",
184 gPMICDbgLvl, gPMICHKDbgLvl, gPMICIRQDbgLvl,
185 gPMICREGDbgLvl, gPMICCOMDbgLvl);
186 } else {
187 #ifdef CONFIG_MTK_TINYSYS_SSPM_SUPPORT
188 pmic_ipi_test_code();
189 pr_info("pmic_ipi_test_code\n");
190 #endif
191 }
192
193 return size;
194 }
pmic_dbg_level
# echo 0x20 > /d/mtk_pmic/pmic_dbg_level
# cat /d/mtk_pmic/pmic_dbg_level
4:PMIC_LOG_DBG
3:PMIC_LOG_INFO
2:PMIC_LOG_NOT
1:PMIC_LOG_WARN
0:PMIC_LOG_ERR
PMIC_Dbg_Lvl = 0
PMIC_HK_Dbg_Lvl = 4
PMIC_IRQ_Dbg_Lvl = 0
PMIC_REG_Dbg_Lvl = 0
PMIC_COM_Dbg_Lvl = 0
debug log
25122:kworker/u8:3][PMIC] mt635x_auxadc_read_raw: name:VCORE_TEMP, channel=4, adc_out=0x5d0, adc_result=653
17695:kworker/u8:4][PMIC] mt635x_auxadc_read_raw: name:CHIP_TEMP, channel=4, adc_out=0x60b, adc_result=679
20134:kworker/u8:5][PMIC] mt635x_auxadc_read_raw: name:VCORE_TEMP, channel=4, adc_out=0x5d3, adc_result=655
17695:kworker/u8:4][PMIC] mt635x_auxadc_read_raw: name:VPROC_TEMP, channel=4, adc_out=0x5d1, adc_result=654
20134:kworker/u8:5][PMIC] mt635x_auxadc_read_raw: name:CHIP_TEMP, channel=4, adc_out=0x60b, adc_result=679
usb_state
[16611.891462](1)[5676:kworker/1:2]: usb_state<CONFIGURED>
[16617.008105](1)[5676:kworker/1:2]: usb_state<CONFIGURED>
[16622.128418](1)[5676:kworker/1:2]: usb_state<CONFIGURED>
do_usb_state_monitor_work
drivers/usb/gadget/configfs.c (drivers/usb/gadget/meta.c、drivers/usb/gadget/android.c)
1672 #define USB_STATE_MONITOR_DELAY 5000
1673 static struct delayed_work usb_state_monitor_dw;
1674 static void do_usb_state_monitor_work(struct work_struct *work)
1675 {
1676 struct gadget_info *gi = dev_get_drvdata(android_device);
1677 struct usb_composite_dev *cdev = &gi->cdev;
1678 char *usb_state = "NO-DEV";
1679 unsigned long flags;
1680
1681 spin_lock_irqsave(&cdev->lock, flags);
1682 if (cdev->config)
1683 usb_state = "CONFIGURED";
1684 else if (gi->connected)
1685 usb_state = "CONNECTED";
1686 else
1687 usb_state = "DISCONNECTED";
1688 spin_unlock_irqrestore(&cdev->lock, flags);
1689
1690 pr_info("usb_state<%s>\n", usb_state);
1691 schedule_delayed_work(&usb_state_monitor_dw,
1692 msecs_to_jiffies(USB_STATE_MONITOR_DELAY));
1693 }