From ea1947ffcc606d757357398b24e74a3f4ecefa07 Mon Sep 17 00:00:00 2001 From: neonloop Date: Wed, 20 Oct 2021 14:54:27 +0000 Subject: Initial commit from steward-fu release --- modules/libjoy/caanoo/te9_tf9_hybrid_driver.h | 466 ++++++++++++++++++++++++++ 1 file changed, 466 insertions(+) create mode 100644 modules/libjoy/caanoo/te9_tf9_hybrid_driver.h (limited to 'modules/libjoy/caanoo/te9_tf9_hybrid_driver.h') diff --git a/modules/libjoy/caanoo/te9_tf9_hybrid_driver.h b/modules/libjoy/caanoo/te9_tf9_hybrid_driver.h new file mode 100644 index 0000000..5cad296 --- /dev/null +++ b/modules/libjoy/caanoo/te9_tf9_hybrid_driver.h @@ -0,0 +1,466 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#define KIONIX_DRV_VERSION "091130_1.0.0" + +#define KX_PLATFORM_LINUX +//#define KX_PLATFORM_WIN32 +//#define KX_PLATFORM_WINCE +//#define KX_PLATFORM_REX +//#define KX_PLATFORM_FIRMWARE + + +/*================================================================================================== + Module Name: te9_tf9_hybrid_driver + + General Description: this file contains function calls to control Kionix KXTE9 and KXTF9 via I2C. +==================================================================================================== +Revision History: + Modification Tracking +Author Date Number Description of Changes +------------------------- ------------ ---------- ------------------------------------------- +Chris Hudson 03/26/2009 Cleaned up +Chris Hudson 03/23/2009 Added more differentiation between E9 and F9 functions +Chris Hudson 02/04/2009 Modified driver for use in a Linux environment +Izudin Cemer/Ken Foust 01/02/2009 Unified the driver for TE9 and TF9 product series +Izudin Cemer/Ken Foust 10/08/2008 Cleaned up code for initial release +Izudin Cemer/Ken Foust 08/27/2008 Initial support +==================================================================================================== + INCLUDE FILES +==================================================================================================*/ + +// TODO: +#ifdef KX_PLATFORM_LINUX + + #include + #include + #include + #include + #include + #include + #include +// #include "i2c-dev.h" + +#elif defined(KX_PLATFORM_WIN32) + #include + +#elif defined(KX_PLATFORM_WINCE) + #include + +#elif defined(KX_PLATFORM_REX) + #include "task.h" + + #include "sleep.h" + #include "dog.h" + #include "bio.h" + #include "gpio_int.h" + #include "pm.h" + #include "i2c.h" + #include "accel_task.h" + #include "accel_types.h" + #include "ui.h" + #include "i2c.h" + #include + #include "KxCriticalSection.h" +#elif defined(KX_PLATFORM_FIRMWARE) + + #include + #include "def.h" + #include "option.h" + #include "2440addr.h" + #include "2440lib.h" + #include "2440slib.h" + + #include "IIC.h" + #include "eint.h" + +#endif + +/*================================================================================================== + LOCAL CONSTANTS +==================================================================================================*/ +#ifdef KX_PLATFORM_LINUX + //#define ACCEL_GPIO_INT (GPIO_INT_85) /* KIONIX_ACCEL interrupt pin is connected to GPIO 85 on Blaze */ + //#define ACCEL_GPIO_INT (GPIO_INT_19) /* KIONIX_ACCEL interrupt pin is connected to GPIO 19 on Halo */ + #define I2C_BUS_HW_CTRL 1 + #define I2C_REG_DEV 1 + #define I2C_STOP_START_BEFORE_READ 1 + #define ACCEL_EVENT_INTERRUPT 1 + #define DETECT_EDGE 1 + #define ACTIVE_HIGH 1 + #define GPIO_INT_85 1 + +#elif defined(KX_PLATFORM_WIN32) + +#elif defined(KX_PLATFORM_WINCE) + +#elif defined(KX_PLATFORM_REX) + +#elif defined(KX_PLATFORM_FIRMWARE) + +#endif + +typedef struct +{ + int x; + int y; + int z; +} ACCEL_XYZ; + +//added by lars - 20100308 +#define DEVICE_TYPE_KIONIX_KXTE9 0 +#define DEVICE_TYPE_KIONIX_KXTF9 1 +#define DEVICE_TYPE_KIONIX_KXSD9 2 + + +/*================================================================================================== + MACROS +==================================================================================================*/ +#ifdef KX_PLATFORM_LINUX + #define KxPrint printf + + #define KxMSleep(v) usleep((v)*1000) + #define KxUSleep(v) usleep(v) + + #define KIONIX_InitializeCriticalSection(x) + #define KIONIX_EnterCriticalSection(x) + #define KIONIX_LeaveCriticalSection(x) + #define KIONIX_DeleteCriticalSection(x) + + #define KX_INTLOCK() + #define KX_INTFREE() + +#elif defined(KX_PLATFORM_WIN32) || defined(KX_PLATFORM_WINCE) + #define KxPrint printf + + #define KxMSleep(v) Sleep(v) + #define KxUSleep(v) Sleep(v/1000) + + #define KIONIX_InitializeCriticalSection(x) + #define KIONIX_EnterCriticalSection(x) + #define KIONIX_LeaveCriticalSection(x) + #define KIONIX_DeleteCriticalSection(x) + + #define KX_INTLOCK() + #define KX_INTFREE() + +#elif defined(KX_PLATFORM_REX) + #define KxPrint printf + + #define KxMSleep(v) rex_sleep(v) + #define KxUSleep(v) rex_sleep(v/1000) + + #define KIONIX_InitializeCriticalSection(x) rex_init_crit_sect(x) + #define KIONIX_EnterCriticalSection(x) rex_enter_crit_sect(x) + #define KIONIX_LeaveCriticalSection(x) rex_leave_crit_sect(x) + #define KIONIX_DeleteCriticalSection(x) + + #define KX_INTLOCK() REX_INTLOCK() + #define KX_INTFREE() REX_INTFREE() + +#elif defined(KX_PLATFORM_FIRMWARE) + #define KxPrint Uart_Printf + + #define KxMSleep(v) Delay(v) // ms, // rex_sleep(x) + #define KxUSleep(v) Delay(v/1000) + + #define KIONIX_InitializeCriticalSection(x) + #define KIONIX_EnterCriticalSection(x) + #define KIONIX_LeaveCriticalSection(x) + #define KIONIX_DeleteCriticalSection(x) + + #define KX_INTLOCK() + #define KX_INTFREE() + + //#define USE_I2C_INT + //#define USE_I2C_POLL + #define USE_I2C_GPIO +#endif + +#define BIT(x) (1<>1) // KXSD9 +#define KIONIX_ACCEL_I2C_SLV_ADDR (0x1E>>1) // KXTE9, KXTF9 +#endif +/*================================================================================================== + COMMON REGISTERS +==================================================================================================*/ +#define KIONIX_ACCEL_I2C_ST_RESP 0x0C +#define KIONIX_ACCEL_I2C_WHO_AM_I 0x0F +#define KIONIX_ACCEL_I2C_TILT_POS_CUR 0x10 +#define KIONIX_ACCEL_I2C_TILT_POS_PRE 0x11 +#define KIONIX_ACCEL_I2C_STATUS_REG 0x18 +#define KIONIX_ACCEL_I2C_INT_REL 0x1A +#define KIONIX_ACCEL_I2C_CTRL_REG1 0x1B +#define KIONIX_ACCEL_I2C_CTRL_REG2 0x1C +#define KIONIX_ACCEL_I2C_CTRL_REG3 0x1D +#define KIONIX_ACCEL_I2C_INT_CTRL_REG2 0x1F +#define KIONIX_ACCEL_I2C_TILT_TIMER 0x28 +#define KIONIX_ACCEL_I2C_WUF_TIMER 0x29 +#define KIONIX_ACCEL_I2C_WUF_THRESH 0x5A +/*================================================================================================== + KXTE9-SPECIFIC REGISTERS +==================================================================================================*/ +#define KXTE9_I2C_XOUT 0x12 +#define KXTE9_I2C_YOUT 0x13 +#define KXTE9_I2C_ZOUT 0x14 +#define KXTE9_I2C_INT_SRC_REG1 0x16 +#define KXTE9_I2C_INT_SRC_REG2 0x17 +#define KXTE9_I2C_INT_CTRL_REG1 0x1E +#define KXTE9_I2C_B2S_TIMER 0x2A +#define KXTE9_I2C_B2S_THRESH 0x5B +/*================================================================================================== + KXTF9-SPECIFIC REGISTERS +==================================================================================================*/ +#define KXTF9_I2C_XOUT_HPF_L 0x00 +#define KXTF9_I2C_XOUT_HPF_H 0x01 +#define KXTF9_I2C_YOUT_HPF_L 0x02 +#define KXTF9_I2C_YOUT_HPF_H 0x03 +#define KXTF9_I2C_ZOUT_HPF_L 0x04 +#define KXTF9_I2C_ZOUT_HPF_H 0x05 +#define KXTF9_I2C_XOUT_L 0x06 +#define KXTF9_I2C_XOUT_H 0x07 +#define KXTF9_I2C_YOUT_L 0x08 +#define KXTF9_I2C_YOUT_H 0x09 +#define KXTF9_I2C_ZOUT_L 0x0A +#define KXTF9_I2C_ZOUT_H 0x0B +#define KXTF9_I2C_INT_SRC_REG1 0x15 +#define KXTF9_I2C_INT_SRC_REG2 0x16 +#define KXTF9_I2C_INT_CTRL_REG1 0x1E +#define KXTF9_I2C_INT_CTRL_REG3 0x20 +#define KXTF9_I2C_DATA_CTRL_REG 0x21 +#define KXTF9_I2C_TDT_TIMER 0x2B +#define KXTF9_I2C_TDT_H_THRESH 0x2C +#define KXTF9_I2C_TDT_L_THRESH 0x2D +#define KXTF9_I2C_TDT_TAP_TIMER 0x2E +#define KXTF9_I2C_TDT_TOTAL_TIMER 0x2F +#define KXTF9_I2C_TDT_LATENCY_TIMER 0x30 +#define KXTF9_I2C_TDT_WINDOW_TIMER 0x31 +/*================================================================================================== + KIONIX ACCEL CONTROL BIT DEFINITION +==================================================================================================*/ +/*================================================================================================== + COMMON CONTROL BITS +==================================================================================================*/ +#define CTRL_REG1_TPE 0x01 /* enables tilt position function */ +#define CTRL_REG1_WUFE 0x02 /* enables wake up function */ +#define CTRL_REG1_PC1 0x80 /* operating mode 1 = full power mode; 0 = stand by mode */ +#define CTRL_REG2_FUM 0x01 /* face up state mask */ +#define CTRL_REG2_FDM 0x02 /* face down state mask */ +#define CTRL_REG2_UPM 0x04 /* up state mask */ +#define CTRL_REG2_DOM 0x08 /* down state mask */ +#define CTRL_REG2_RIM 0x10 /* right state mask */ +#define CTRL_REG2_LEM 0x20 /* left state mask */ +#define CTRL_REG3_OWUFB 0x01 /* active mode output data rate */ +#define CTRL_REG3_OWUFA 0x02 /* active mode output data rate */ +#define CTRL_REG3_STC 0x10 /* initiates self-test function */ +#define CTRL_REG3_OTPB 0x20 /* sets output data rate for tilt position function */ +#define CTRL_REG3_OTPA 0x40 /* sets output data rate for tilt position function */ +#define CTRL_REG3_SRST 0x80 /* software reset */ +#define INT_CTRL_REG2_XBW 0x80 /* X-axis motion mask */ +#define INT_CTRL_REG2_YBW 0x40 /* Y-axis motion mask */ +#define INT_CTRL_REG2_ZBW 0x20 /* Z-axis motion mask */ +/*================================================================================================== + KXTE9-SPECIFIC CONTROL BITS +==================================================================================================*/ +#define CTRL_REG1_B2SE 0x04 /* enables back to sleep function on KXTE9 */ +#define CTRL_REG1_ODRB 0x08 /* bit0 for selecting the output data rate on KXTE9 */ +#define CTRL_REG1_ODRA 0x10 /* bit1 for selecting the output data rate on KXTE9 */ +#define CTRL_REG3_OB2SB 0x04 /* sets output data rate when in inactive mode (KXTE9) */ +#define CTRL_REG3_OB2SA 0x08 /* sets output data rate when in incative mode (KXTE9) */ +#define KXTE9_INT_CTRL_REG1_IEL 0x04 /* sets response of physical interrupt pin */ +#define KXTE9_INT_CTRL_REG1_IEA 0x08 /* sets polarity of the physical interrupt pin*/ +#define KXTE9_INT_CTRL_REG1_IEN 0x10 /* enables/disables the physical interrupt pin; 1=enable; 0=disable */ +#define FULL_SCALE_RANGE_2_G 2000 /* indicates full scale g-range of the KIONIX_ACCEL */ +#define BIT_SENSITIVITY_2_G 16 /* indicates sensitivity of the KIONIX_ACCEL ((2^6)/4) */ +#define ZERO_G_OFFSET 32 /* indicates 0g offset of the KIONIX_ACCEL ((2^6)/2) */ +/*================================================================================================== + KXTF9-SPECIFIC CONTROL BITS +==================================================================================================*/ +#define CTRL_REG1_TDTE 0x04 /* enables tap/double tap function on KXTF9 */ +#define CTRL_REG1_GSEL0 0x08 /* bit0 used for selecting the g range */ +#define CTRL_REG1_GSEL1 0x10 /* bit1 used for selecting the g range */ +#define CTRL_REG1_DRDYE 0x20 /* enables physical interrupt when new accel data is available on KXTF9 */ +#define CTRL_REG1_RES 0x40 /* performance mode on KXTF9 */ +#define CTRL_REG3_OTDTB 0x04 /* sets output data rate for tap double tap function */ +#define CTRL_REG3_OTDTA 0x08 /* sets output data rate for tap double tap function */ +#define INT_CTRL_REG3_TFUM 0x01 /* Z positive tap detection mask */ +#define INT_CTRL_REG3_TFDM 0x02 /* Z negative tap detection mask */ +#define INT_CTRL_REG3_TUPM 0x04 /* Y positive tap detection mask */ +#define INT_CTRL_REG3_TDOM 0x08 /* Y negative tap detection mask */ +#define INT_CTRL_REG3_TRIM 0x10 /* X positive tap detection mask */ +#define INT_CTRL_REG3_TLEM 0x20 /* X negative tap detection mask */ +#define KXTF9_INT_CTRL_REG1_STPOL 0x02 /* ST (self test) polarity bit */ +#define KXTF9_INT_CTRL_REG1_ULMB 0x04 /* unlatched mode for WUF 1=unlatche; 0=latched */ +#define KXTF9_INT_CTRL_REG1_IEL 0x08 /* sets response of physical interrupt pin */ +#define KXTF9_INT_CTRL_REG1_IEA 0x10 /* sets polarity of the physical interrupt pin*/ +#define KXTF9_INT_CTRL_REG1_IEN 0x20 /* enables/disables the physical interrupt pin; 1=enable; 0=disable */ +#define DATA_CTRL_REG_OSAC 0x01 /* sets LPF Acceleration output data rates */ +#define DATA_CTRL_REG_OSAB 0x02 /* sets LPF Acceleration output data rates */ +#define DATA_CTRL_REG_OSAA 0x04 /* sets LPF Acceleration output data rates */ +#define DATA_CTRL_REG_HPFROB 0x10 /* sets HPF roll-off frequency */ +#define DATA_CTRL_REG_HPFROA 0x20 /* sets HPF roll-off frequency */ +/*================================================================================================== + GLOBAL VARIABLES +==================================================================================================*/ +static int KIONIX_ACCEL_g_range = 2000; /* KIONIX_ACCEL factory default G range in milli g */ +/*================================================================================================== + COMMON FUNCTIONS +==================================================================================================*/ +int KIONIX_ACCEL_read_bytes(int reg, char* data, int length); +int KIONIX_ACCEL_write_byte(int reg, int data); +int KIONIX_ACCEL_get_device_type(void); +int KIONIX_ACCEL_deinit(void); +int KIONIX_ACCEL_init(void); +void KIONIX_ACCEL_isr(void); +void KIONIX_ACCEL_enable_interrupt(void); +void KIONIX_ACCEL_disable_interrupt(void); +int KIONIX_ACCEL_enable_outputs(void); +int KIONIX_ACCEL_disable_outputs(void); +int KIONIX_ACCEL_enable_tilt_function(void); +int KIONIX_ACCEL_disable_tilt_function(void); +int KIONIX_ACCEL_enable_wake_up_function(void); +int KIONIX_ACCEL_disable_wake_up_function(void); +int KIONIX_ACCEL_enable_all(void); +int KIONIX_ACCEL_disable_all(void); +int KIONIX_ACCEL_sleep(void); +int KIONIX_ACCEL_read_interrupt_status(void); +int KIONIX_ACCEL_read_interrupt_source(char* interrupt_source); +int KIONIX_ACCEL_read_previous_position(char* previous_position); +int KIONIX_ACCEL_read_current_position(char* current_position); +int KIONIX_ACCEL_reset(void); +int KIONIX_ACCEL_tilt_timer(int tilt_timer); +int KIONIX_ACCEL_wuf_timer(int wuf_timer); +int KIONIX_ACCEL_wuf_thresh(int wuf_thresh); +int KIONIX_ACCEL_motion_mask_z(void); +int KIONIX_ACCEL_motion_unmask_z(void); +int KIONIX_ACCEL_motion_mask_y(void); +int KIONIX_ACCEL_motion_unmask_y(void); +int KIONIX_ACCEL_motion_mask_x(void); +int KIONIX_ACCEL_motion_unmask_x(void); +int KIONIX_ACCEL_position_mask_fu(void); +int KIONIX_ACCEL_position_mask_fd(void); +int KIONIX_ACCEL_position_mask_up(void); +int KIONIX_ACCEL_position_mask_do(void); +int KIONIX_ACCEL_position_mask_ri(void); +int KIONIX_ACCEL_position_mask_le(void); +int KIONIX_ACCEL_position_unmask_fu(void); +int KIONIX_ACCEL_position_unmask_fd(void); +int KIONIX_ACCEL_position_unmask_up(void); +int KIONIX_ACCEL_position_unmask_do(void); +int KIONIX_ACCEL_position_unmask_ri(void); +int KIONIX_ACCEL_position_unmask_le(void); +int KIONIX_ACCEL_set_odr_motion(int frequency); +//int KIONIX_ACCEL_service_interrupt(int* source_of_interrupt); +int KIONIX_ACCEL_service_interrupt(void); +int KIONIX_ACCEL_read_LPF_cnt(int* x, int* y, int* z); +int KIONIX_ACCEL_read_LPF_g(int* gx, int* gy, int* gz); +int KIONIX_ACCEL_read_current_odr_motion(double* ODR_rate_motion); +int KIONIX_ACCEL_read_position_status(void); +int KIONIX_ACCEL_read_wuf_status(void); +int KIONIX_ACCEL_enable_int(void); +int KIONIX_ACCEL_disable_int(void); +int KIONIX_ACCEL_int_activeh(void); +int KIONIX_ACCEL_int_activel(void); +int KIONIX_ACCEL_int_latch(void); +int KIONIX_ACCEL_int_pulse(void); +/*================================================================================================== + KXTE9-SPECIFIC FUNCTIONS +==================================================================================================*/ +int KIONIX_ACCEL_enable_back_to_sleep(void); +int KIONIX_ACCEL_disable_back_to_sleep(void); +int KXTE9_read_b2s_status(void); +int KXTE9_b2s_timer(int b2s_timer); +int KXTE9_b2s_thresh(int b2s_thresh); +/*================================================================================================== + KXTF9-SPECIFIC FUNCTIONS +==================================================================================================*/ +int KXTF9_enable_tap_detection(void); +int KXTF9_disable_tap_detection(void); +int KXTF9_read_single_tap_status(void); +int KXTF9_read_double_tap_status(void); +int KXTF9_set_odr_tilt(int frequency); +int KXTF9_set_G_range(int range); +int KXTF9_read_HPF_cnt(int* x, int* y, int* z); +int KXTF9_read_HPF_g(int* gx, int* gy, int* gz); +int KXTF9_read_current_odr_tilt(double* ODR_rate_tilt); +int KXTF9_read_current_odr_tap(double* ODR_rate_tap); +int KXTF9_read_tap_direction(char* int_src_reg1); +int KXTF9_int_alt_disable(void); +int KXTF9_int_alt_enable(void); +int KXTF9_tdt_timer(int tdt_timer); +int KXTF9_tdt_h_thresh(int tdt_h_thresh); +int KXTF9_tdt_l_thresh(int tdt_l_thresh); +int KXTF9_tdt_tap_timer(int tdt_tap_timer); +int KXTF9_tdt_total_timer(int tdt_total_timer); +int KXTF9_tdt_latency_timer(int tdt_latency_timer); +int KXTF9_tdt_window_timer(int tdt_window_timer); +int KXTF9_tap_mask_TFU(void); +int KXTF9_tap_unmask_TFU(void); +int KXTF9_tap_mask_TFD(void); +int KXTF9_tap_unmask_TFD(void); +int KXTF9_tap_mask_TUP(void); +int KXTF9_tap_unmask_TUP(void); +int KXTF9_tap_mask_TDO(void); +int KXTF9_tap_unmask_TDO(void); +int KXTF9_tap_mask_TRI(void); +int KXTF9_tap_unmask_TRI(void); +int KXTF9_tap_mask_TLE(void); +int KXTF9_tap_unmask_TLE(void); +int KXTF9_tap_mask_all_direction(void); +int KXTF9_tap_unmask_all_direction(void); +int KXTF9_set_odr_tap(int alpha); +int KXTF9_set_lpf_odr(int frequency); +int KXTF9_set_resolution(int resolution); + +enum { + PROCESS_NONE=0, + PROCESS_INTERRUPT, + PROCESS_SHAKEPOLL, + PROCESS_OTHER, +}; + +//************************************************************* +// Name : shake.h +// Author : Kionix, Inc. +// Version : 1.0 +// Copyright : +// Description : shake detection +//************************************************************* + +#define CONFIG_RATE 50 // data rate (hz) +#define CONFIG_DURATION 180 // max length of a shake (ms) +#define CONFIG_DELAY 0 // min seperation between shakes (ms) +#define CONFIG_TIMEOUT 580 //280 // max seperation between shakes (ms) +#define CONFIG_THRESHOLD 3000 //20000 // min shake threshold ((x^2 + y^2 + z^2) / 1000) + +typedef struct +{ + long cntShake; // valid shake count + long cntInvalid; // invalid shake count + + long cntDuration; // duration timer + long cntDelay; // delay timer + long cntTimeout; // timeout timer + + long maxDuration; // duration threshold + long maxDelay; // delay threshold + long maxTimeout; // timeout threshold + +} shake_data; + +void KIONIX_SHAKE_Init(shake_data* data); +long KIONIX_SHAKE_Update(shake_data* data, long val); + +#ifdef __cplusplus +} +#endif -- cgit v1.2.3