/**************************************************************************** * drivers/ioexpander/sx1509.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ #ifndef __DRIVERS_IOEXPANDER_SX1509_H #define __DRIVERS_IOEXPANDER_SX1509_H /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include #include #ifdef CONFIG_SX1509_LED_ENABLE # include #endif #include #include /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ /* SX1509 Definitions *******************************************************/ /* I2C frequency */ #define SX1509_I2C_MAXFREQUENCY 400000 /* 400KHz */ /* SX1509 *******************************************************************/ /* Device and IO Banks */ #define SX1509_REGINPUTDISABLE_B 0x00 #define SX1509_REGINPUTDISABLE_A 0x01 #define SX1509_REGLONGSLEW_B 0x02 #define SX1509_REGLONGSLEW_A 0x03 #define SX1509_REGLOWDRIVE_B 0x04 #define SX1509_REGLOWDRIVE_A 0x05 #define SX1509_REGPULLUP_B 0x06 #define SX1509_REGPULLUP_A 0x07 #define SX1509_REGPULLDOWN_B 0x08 #define SX1509_REGPULLDOWN_A 0x09 #define SX1509_REGOPENDRAIN_B 0x0a #define SX1509_REGOPENDRAIN_A 0x0b #define SX1509_REGPOLARITY_B 0x0c #define SX1509_REGPOLARITY_A 0x0d #define SX1509_REGDIR_B 0x0e #define SX1509_REGDIR_A 0x0f #define SX1509_REGDATA_B 0x10 #define SX1509_REGDATA_A 0x11 #define SX1509_REGINTERRUPTMASK_B 0x12 #define SX1509_REGINTERRUPTMASK_A 0x13 #define SX1509_REGSENSEHIGH_B 0x14 #define SX1509_REGSENSELOW_B 0x15 #define SX1509_REGSENSEHIGH_A 0x16 #define SX1509_REGSENSELOW_A 0x17 #define SX1509_REGINTERRUPTSOURCE_B 0x18 #define SX1509_REGINTERRUPTSOURCE_A 0x19 #define SX1509_REGEVENTSTATUS_B 0x1a #define SX1509_REGEVENTSTATUS_A 0x1b #define SX1509_REGLEVELSHIFTER_1 0x1c #define SX1509_REGLEVELSHIFTER_2 0x1d #define SX1509_REGCLOCK 0x1e #define SX1509_REGMISC 0x1f #define SX1509_REGLEDDRIVERENABLE_B 0x20 #define SX1509_REGLEDDRIVERENABLE_A 0x21 /* Debounce and Keypad Engine */ #define SX1509_REGDEBOUNCE_CONFIG 0x22 #define SX1509_REGDEBOUNCEENABLE_B 0x23 #define SX1509_REGDEBOUNCEENABLE_A 0x24 #define SX1509_REGKEYCONFIG_1 0x25 #define SX1509_REGKEYCONFIG_2 0x26 #define SX1509_REGKEYDATA_1 0x27 #define SX1509_REGKEYDATA_2 0x28 /* LED Driver (PWM, blinking, breathing) */ #define SX1509_REGTON_0 0x29 #define SX1509_REGION_0 0x2a #define SX1509_REGOFF_0 0x2b #define SX1509_REGTON_1 0x2c #define SX1509_REGION_1 0x2d #define SX1509_REGOFF_1 0x2e #define SX1509_REGTON_2 0x2f #define SX1509_REGION_2 0x30 #define SX1509_REGOFF_2 0x31 #define SX1509_REGTON_3 0x32 #define SX1509_REGION_3 0x33 #define SX1509_REGOFF_3 0x34 #define SX1509_REGTON_4 0x35 #define SX1509_REGION_4 0x36 #define SX1509_REGOFF_4 0x37 #define SX1509_TRISE_4 0x38 #define SX1509_TFALL_4 0x39 #define SX1509_REGTON_5 0x3a #define SX1509_REGION_5 0x3b #define SX1509_REGOFF_5 0x3c #define SX1509_TRISE_5 0x3d #define SX1509_TFALL_5 0x3e #define SX1509_REGTON_6 0x3f #define SX1509_REGION_6 0x40 #define SX1509_REGOFF_6 0x41 #define SX1509_TRISE_6 0x42 #define SX1509_TFALL_6 0x43 #define SX1509_REGTON_7 0x44 #define SX1509_REGION_7 0x45 #define SX1509_REGOFF_7 0x46 #define SX1509_TRISE_7 0x47 #define SX1509_TFALL_7 0x48 #define SX1509_REGTON_8 0x49 #define SX1509_REGION_8 0x4a #define SX1509_REGOFF_8 0x4b #define SX1509_REGTON_9 0x4c #define SX1509_REGION_9 0x4d #define SX1509_REGOFF_9 0x4e #define SX1509_REGTON_10 0x4f #define SX1509_REGION_10 0x50 #define SX1509_REGOFF_10 0x51 #define SX1509_REGTON_11 0x52 #define SX1509_REGION_11 0x53 #define SX1509_REGOFF_11 0x54 #define SX1509_REGTON_12 0x55 #define SX1509_REGION_12 0x56 #define SX1509_REGOFF_12 0x57 #define SX1509_TRISE_12 0x58 #define SX1509_TFALL_12 0x59 #define SX1509_REGTON_13 0x5a #define SX1509_REGION_13 0x5b #define SX1509_REGOFF_13 0x5c #define SX1509_TRISE_13 0x5d #define SX1509_TFALL_13 0x5e #define SX1509_REGTON_14 0x5f #define SX1509_REGION_14 0x60 #define SX1509_REGOFF_14 0x61 #define SX1509_TRISE_14 0x62 #define SX1509_TFALL_14 0x63 #define SX1509_REGTON_15 0x64 #define SX1509_REGION_15 0x65 #define SX1509_REGOFF_15 0x66 #define SX1509_TRISE_15 0x67 #define SX1509_TFALL_15 0x68 /* Miscellaneous */ #define SX1509_REGHIGHINPUT_B 0x69 #define SX1509_REGHIGHINPUT_A 0x6a /* Software Reset */ #define SX1509_REGRESET 0x7d /* Test */ #define SX1509_REGTEST1 0x7e #define SX1509_REGTEST2 0x7f /* RegSense */ #define SX1509_SENSE_MASK (0x3) #define SX1509_SENSE_NONE (0) #define SX1509_SENSE_RISING (1) #define SX1509_SENSE_FALLING (2) #define SX1509_SENSE_BOTH (3) /* RegClock */ #define SX1509_OSC_OFF (0 << 5) #define SX1509_OSC_EXT (1 << 5) #define SX1509_OSC_INT (2 << 5) /* RegMisc */ #define SX1509_LEDCLK_SHIFT (4) /* RegTOnX */ #define SX1509_TON_SHIFT (0) #define SX1509_TON_1_MAX (15) #define SX1509_TON_2_MAX (15) /* RegOffX */ #define SX1509_IOFF_SHIFT (0) #define SX1509_TOFF_SHIFT (3) #define SX1509_TOFF_1_MAX (15) #define SX1509_TOFF_2_MAX (15) /* Driver definitions */ #define SX1509_NR_GPIO_MAX 16 #define SX1509_POLLDELAY (CONFIG_SX1509_INT_POLLDELAY / USEC_PER_TICK) #define SX1509_INTOSC_FREQ (2000000) /**************************************************************************** * Public Types ****************************************************************************/ #ifdef CONFIG_IOEXPANDER_INT_ENABLE /* This type represents on registered pin interrupt callback */ struct sx1509_callback_s { ioe_pinset_t pinset; /* Set of pin interrupts that will generate * the callback. */ ioe_callback_t cbfunc; /* The saved callback function pointer */ FAR void *cbarg; /* Callback argument */ }; #endif /* This structure represents the state of the SX1509 driver */ struct sx1509_dev_s { struct ioexpander_dev_s dev; /* Nested structure to allow casting * as public gpio expander. */ #ifdef CONFIG_SX1509_MULTIPLE /* Supports a singly linked list of drivers */ FAR struct sx1509_dev_s *flink; #endif FAR struct sx1509_config_s *config; /* Board configuration data */ FAR struct i2c_master_s *i2c; /* Saved I2C driver instance */ mutex_t lock; /* Mutual exclusion */ #ifdef CONFIG_IOEXPANDER_INT_ENABLE # ifdef CONFIG_SX1509_INT_POLL /* Timer used to poll for missed interrupts */ struct wdog_s wdog; # endif /* Supports the interrupt handling "bottom half" */ struct work_s work; /* Saved callback information for each I/O expander client */ struct sx1509_callback_s cb[CONFIG_SX1509_INT_NCALLBACKS]; #endif #ifdef CONFIG_SX1509_LED_ENABLE /* Lower half LED driver */ struct userled_lowerhalf_s userleds; /* Pin number to LED number map. If set to -1 then no LED assigned. */ int8_t pin2led[SX1509_NR_GPIO_MAX]; /* LED driver clock frequency */ uint32_t led_freq; /* LED driver timings */ uint32_t t_on_1_ms; uint32_t t_on_2_ms; uint32_t t_off_1_ms; uint32_t t_off_2_ms; #endif }; #endif /* __DRIVERS_IOEXPANDER_SX1509_H */