分析,图是采用矩阵按键,我们为了方便,直接改成GPIO中断方式。
修改方案:将KEYOUT0在设置为GPIO功能,并在初始化时设置为低电平。
KEYIN和KEYIN1,初始化时,设置为高电平。电平触发,在按下时,会产生低电平。
注意:在pinmap中KEYIN和KEYIN1需要配置为外部中断,上拉。KEYOUT0配置为GPIO模式。
1、Uboot中的设置 /u-boot15/board/spreadtrum/sp7731e_1h10/sprd_kp.c 3static struct key_info KEYS[] = { 24 { 25 .tag = "Volume Up", 26 .offset = SPRD_DDIE_EIC_EXTINT3, 27 .type = TYPE_EIC, 28 .keycode = KEY_VOLUMEUP, 29 .active = 0, //低电平按下 30 }, 31 { 32 .tag = "Volume Down", 33 .offset = SPRD_DDIE_EIC_EXTINT2, 34 .type = TYPE_EIC, 35 .keycode = KEY_VOLUMEDOWN, 36 .active = 0, //低电平按下 37 }, 38}; 2、 Kernel 中的设置 kernel/arch/arm/boot/dts/sp7731e-1h10-native.dts key-volumedown { label = "Volume Down Key"; linux,code = <114>; gpios = <&ap_eic 2 1>; //1 正常状态为高电平 debounce-interval = <2>; gpio-key,wakeup; gpio-key,level-trigger; }; key-volumeup { label = "Volume Up Key"; linux,code = <115>; gpios = <& ap_eic 3 1>; //正常状态为高电平 debounce-interval = <2>; gpio-key,wakeup; gpio-key,level-trigger; }; key-power { label = "Power Key"; linux,code = <116>; gpios = <&pmic_eic 1 1>; debounce-interval = <2>; gpio-key,wakeup; gpio-key,level-trigger; }; }; 3 u-boot15/board/spreadtrum/sp7731e_1h10/sp7731e_1h10.c 在board_init()函数中添加代码代码 sprd_gpio_request(NULL, 55); sprd_gpio_direction_output(NULL, 55, 0); ---------------------------------------------------------------------- int board_init() 56{ 57 //gd->bd->bi_arch_number = MACH_TYPE_OPENPHONE; 58 /*get env transfer from chipram*/ 59 setup_chipram_env(); 60#ifndef CONFIG_FPGA 61 gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100; 62 ADI_init(); 63 pmic_misc_init(); 64 board_regulator_init(); 65 pmic_adc_Init(); 66 pin_init(); 67 sprd_eic_init(); 68 sprd_intc_enable(); 69 sprd_gpio_init(); 70 init_ldo_sleep_gr(); 71// TDPllRefConfig(1); 72 sprd_pmu_init(); 73#endif 74 return 0; 75}