polling AXP209 PEK every 30ms

This commit is contained in:
Vincent-FK 2020-01-11 18:06:49 +08:00
parent c633a9435c
commit 6bc084a4d1
5 changed files with 45 additions and 19 deletions

0
.gitignore vendored Normal file → Executable file
View File

View File

@ -58,26 +58,26 @@ bool axp209_init(void) {
// Enable only chosen interrupts (PEK short and long presses) // Enable only chosen interrupts (PEK short and long presses)
int err; int err;
err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_1_ENABLE, 0x00); /*err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_1_ENABLE, 0x00);
if(err < 0){ if(err < 0){
printf("ERROR initializing interrupts 1 for AXP209\n"); printf("ERROR initializing interrupts 1 for AXP209\n");
} }
err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_2_ENABLE, 0x00); err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_2_ENABLE, 0x00);
if(err < 0){ if(err < 0){
printf("ERROR initializing interrupts 2 for AXP209\n"); printf("ERROR initializing interrupts 2 for AXP209\n");
} }*/
err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_3_ENABLE, 0x03); err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_3_ENABLE, 0x03);
if(err < 0){ if(err < 0){
printf("ERROR initializing interrupts 3 for AXP209\n"); printf("ERROR initializing interrupts 3 for AXP209\n");
} }
err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_4_ENABLE, 0x00); /*err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_4_ENABLE, 0x00);
if(err < 0){ if(err < 0){
printf("ERROR initializing interrupts 4 for AXP209\n"); printf("ERROR initializing interrupts 4 for AXP209\n");
} }
err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_5_ENABLE, 0x00); err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_5_ENABLE, 0x00);
if(err < 0){ if(err < 0){
printf("ERROR initializing interrupts 5 for AXP209\n"); printf("ERROR initializing interrupts 5 for AXP209\n");
} }*/
return true; return true;
} }
@ -95,7 +95,7 @@ int axp209_read_interrupt_bank_3(void){
} }
// Clear interrupts // Clear interrupts
int err = i2c_smbus_write_byte_data(fd_axp209 , AXP209_INTERRUPT_BANK_3_STATUS, 0xFF); int err = i2c_smbus_write_byte_data( fd_axp209 ,AXP209_INTERRUPT_BANK_3_STATUS, 0xFF );
if(err < 0){ if(err < 0){
return err; return err;
} }

BIN
funkey_gpio_management_BAK Executable file

Binary file not shown.

14
gpio_mapping.c Normal file → Executable file
View File

@ -39,10 +39,10 @@
// This define forces to perform a gpio sanity check after a timeout. // This define forces to perform a gpio sanity check after a timeout.
// If not declared, there will be no timeout and no periodical sanity check of GPIO expander values // If not declared, there will be no timeout and no periodical sanity check of GPIO expander values
#define TIMEOUT_SEC_SANITY_CHECK_GPIO_EXP 1 //#define TIMEOUT_SEC_SANITY_CHECK_GPIO_EXP 1
//#define TIMEOUT_MICROSEC_SANITY_CHECK_GPIO_EXP (500*1000) #define TIMEOUT_MICROSEC_SANITY_CHECK_GPIO_EXP (30*1000)
// This is for debug purposes on cards or eval boards that do not have the AXP209 // Comment this for debug purposes on cards or eval boards that do not have the AXP209
#define ENABLE_AXP209_INTERRUPTS #define ENABLE_AXP209_INTERRUPTS
#define KEY_IDX_MAPPED_FOR_SHORT_PEK_PRESS 16 //KEY_Q #define KEY_IDX_MAPPED_FOR_SHORT_PEK_PRESS 16 //KEY_Q
@ -62,6 +62,8 @@ static fd_set fds;
static bool * mask_gpio_value; static bool * mask_gpio_value;
static bool interrupt_i2c_expander_found = false; static bool interrupt_i2c_expander_found = false;
static bool interrupt_axp209_found = false; static bool interrupt_axp209_found = false;
static bool mapping_PEK_short_press_activated = false;
static bool mapping_PEK_long_press_activated = false;
/**************************************************************** /****************************************************************
@ -330,8 +332,10 @@ int listen_gpios_interrupts(void)
if(!nb_interrupts){ if(!nb_interrupts){
// Timeout case // Timeout case
GPIO_PRINTF(" Timeout, forcing sanity check\n"); GPIO_PRINTF(" Timeout, forcing sanity check\n");
// Timeout forcing a "Found interrupt" event for sanity check // Timeout forcing a "Found interrupt" event for sanity check
interrupt_i2c_expander_found = true; interrupt_i2c_expander_found = true;
interrupt_axp209_found = true;
} }
else if ( nb_interrupts < 0) { else if ( nb_interrupts < 0) {
perror("select"); perror("select");
@ -385,11 +389,15 @@ int listen_gpios_interrupts(void)
if(val_int_bank_3 & AXP209_INTERRUPT_PEK_SHORT_PRESS){ if(val_int_bank_3 & AXP209_INTERRUPT_PEK_SHORT_PRESS){
GPIO_PRINTF(" AXP209 short PEK key press detected\n"); GPIO_PRINTF(" AXP209 short PEK key press detected\n");
sendKeyAndStopKey(KEY_IDX_MAPPED_FOR_SHORT_PEK_PRESS); sendKeyAndStopKey(KEY_IDX_MAPPED_FOR_SHORT_PEK_PRESS);
/*sendKey(KEY_IDX_MAPPED_FOR_SHORT_PEK_PRESS, !mapping_PEK_short_press_activated);
mapping_PEK_short_press_activated = !mapping_PEK_short_press_activated;*/
} }
if(val_int_bank_3 & AXP209_INTERRUPT_PEK_LONG_PRESS){ if(val_int_bank_3 & AXP209_INTERRUPT_PEK_LONG_PRESS){
GPIO_PRINTF(" AXP209 long PEK key press detected\n"); GPIO_PRINTF(" AXP209 long PEK key press detected\n");
sendKeyAndStopKey(KEY_IDX_MAPPED_FOR_LONG_PEK_PRESS); sendKeyAndStopKey(KEY_IDX_MAPPED_FOR_LONG_PEK_PRESS);
/*sendKey(KEY_IDX_MAPPED_FOR_LONG_PEK_PRESS, !mapping_PEK_long_press_activated);
mapping_PEK_long_press_activated = !mapping_PEK_long_press_activated;*/
} }
} }
#endif //ENABLE_AXP209_INTERRUPTS #endif //ENABLE_AXP209_INTERRUPTS

View File

@ -35,18 +35,11 @@
//#include "config.h" //#include "config.h"
//include "daemon.h" //include "daemon.h"
#include "uinput.h" #include "uinput.h"
#include <time.h>
static int sendRel(int dx, int dy); /****************************************************************
static int sendSync(void); * Defines
****************************************************************/
static struct input_event uidev_ev;
static int uidev_fd;
/*static keyinfo_s lastkey;*/
#define die(str, args...) do { \
perror(str); \
return(EXIT_FAILURE); \
} while(0)
#define DEBUG_UINPUT_PRINTF (0) #define DEBUG_UINPUT_PRINTF (0)
#if DEBUG_UINPUT_PRINTF #if DEBUG_UINPUT_PRINTF
@ -55,6 +48,30 @@ static int uidev_fd;
#define UINPUT_PRINTF(...) #define UINPUT_PRINTF(...)
#endif #endif
#define SLEEP_TIME_SEND_STOP_KEY_US 20*1000
#define die(str, args...) do { \
perror(str); \
return(EXIT_FAILURE); \
} while(0)
/****************************************************************
* Static functions declaration
****************************************************************/
static int sendRel(int dx, int dy);
static int sendSync(void);
/****************************************************************
* Static variables
****************************************************************/
static struct input_event uidev_ev;
static int uidev_fd;
/*static keyinfo_s lastkey;*/
/****************************************************************
* Functions Implementation
****************************************************************/
int init_uinput(void) int init_uinput(void)
{ {
int fd; int fd;
@ -187,6 +204,7 @@ int sendKey(int key, int value)
int sendKeyAndStopKey(int key) int sendKeyAndStopKey(int key)
{ {
sendKey(key, 1); sendKey(key, 1);
usleep(SLEEP_TIME_SEND_STOP_KEY_US);
sendKey(key, 0); sendKey(key, 0);
return 0; return 0;