static inline void kpd_update_aee_state(void) { if (aee_pressed_keys == ((1 << AEE_VOLUMEUP_BIT) | (1 << AEE_VOLUMEDOWN_BIT))) { /* if volumeup and volumedown was pressed the same time then start the time of ten seconds */ aee_timer_started = true; #if AEE_ENABLE_5_15 aee_timer_5s_started = true; hrtimer_start(&aee_timer_5s, ktime_set(AEE_DELAY_TIME_5S, 0), HRTIMER_MODE_REL); #endif hrtimer_start(&aee_timer, ktime_set(AEE_DELAY_TIME, 0), HRTIMER_MODE_REL); kpd_print("aee_timer started\n"); } else { if (aee_timer_started) { /* * hrtimer_cancel - cancel a timer and wait for the handler to finish. * Returns: * 0 when the timer was not active. * 1 when the timer was active. */ if (hrtimer_cancel(&aee_timer)) { kpd_print("try to cancel hrtimer\n"); #if AEE_ENABLE_5_15 if (flags_5s) { printk ("Pressed Volup + Voldown5s~15s then trigger aee manual dump.\n"); aee_kernel_reminding("manual dump", "Trigger Vol Up +Vol Down 5s"); } #endif } #if AEE_ENABLE_5_15 flags_5s = false; #endif aee_timer_started = false; kpd_print("aee_timer canceled\n"); } #if AEE_ENABLE_5_15 if (aee_timer_5s_started) { /* * hrtimer_cancel - cancel a timer and wait for the handler to finish. * Returns: * 0 when the timer was not active. * 1 when the timer was active. */ if (hrtimer_cancel(&aee_timer_5s)) { kpd_print("try to cancel hrtimer (5s)\n"); } aee_timer_5s_started = false; kpd_print("aee_timer canceled (5s)\n"); } #endif } }
static int proc_write_generate_kernel_notify(struct file* file, const char __user *buf, unsigned long count, void *data) { char msg[164], *colon_ptr; if (count == 0) { return -EINVAL; } if ((count < 5) || (count >= sizeof(msg))) { xlog_printk(ANDROID_LOG_WARN, AEK_LOG_TAG, "aed: %s count sould be >= 5 and <= %d bytes.\n", __func__, sizeof(msg)); return -EINVAL; } if (copy_from_user(msg, buf, count)) { xlog_printk(ANDROID_LOG_WARN, AEK_LOG_TAG, "aed: %s unable to read message\n", __func__); return -EFAULT; } /* Be safe */ msg[count] = 0; if (msg[1] != ':') { return -EINVAL; } colon_ptr = strchr(&msg[2], ':'); if ((colon_ptr == NULL) || ((colon_ptr - msg) > 32)) { xlog_printk(ANDROID_LOG_WARN, AEK_LOG_TAG, "aed: %s cannot find valid module name\n", __func__); return -EINVAL; } *colon_ptr = 0; switch (msg[0]) { case 'R': aee_kernel_reminding(&msg[2], colon_ptr + 1); break; case 'W': aee_kernel_warning(&msg[2], colon_ptr + 1); break; case 'E': aee_kernel_exception(&msg[2], colon_ptr + 1); break; default: return -EINVAL; } return count; }