Blame view
board/embedian/common/recovery.c
1.71 KB
b03fe7950 Initial Commit fo... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
/* * Copyright (C) 2010-2016 Freescale Semiconductor, Inc. All Rights Reserved. * * SPDX-License-Identifier: GPL-2.0+ */ #include <common.h> #include <malloc.h> #include <recovery.h> #ifdef CONFIG_MXC_KPD #include <mxc_keyb.h> #endif #include <asm/imx-common/boot_mode.h> #ifdef CONFIG_MXC_KPD #define PRESSED_VOL_DOWN 0x01 #define PRESSED_POWER 0x02 #define RECOVERY_KEY_MASK (PRESSED_VOL_DOWN | PRESSED_POWER) inline int test_key(int value, struct kpp_key_info *ki) { return (ki->val == value) && (ki->evt == KDepress); } int check_key_pressing(void) { struct kpp_key_info *key_info = NULL; int state = 0, keys, i; int ret = 0; mxc_kpp_init(); /* due to glitch suppression circuit, wait sometime to let all keys scanned. */ udelay(1000); keys = mxc_kpp_getc(&key_info); printf("Detecting VOL_DOWN+POWER key for recovery(%d:%d) ... ", keys, keys ? key_info->val : 0); if (keys > 1) { for (i = 0; i < keys; i++) { if (test_key(CONFIG_POWER_KEY, &key_info[i])) state |= PRESSED_POWER; else if (test_key(CONFIG_VOL_DOWN_KEY, &key_info[i])) state |= PRESSED_VOL_DOWN; } } if ((state & RECOVERY_KEY_MASK) == RECOVERY_KEY_MASK) ret = 1; if (key_info) free(key_info); return ret; } #else /* If not using mxc keypad, currently we will detect power key on board */ int check_key_pressing(void) { return 0; } #endif void setup_recovery_env(void) { board_recovery_setup(); } /* export to lib_arm/board.c */ void check_recovery_mode(void) { if (check_key_pressing()) { puts("Fastboot: Recovery key pressing got! "); setup_recovery_env(); } else if (check_recovery_cmd_file()) { puts("Fastboot: Recovery command file found! "); setup_recovery_env(); } else { puts("Fastboot: Normal "); } } |