dc608de144
SX1509 from Semtech is GPIO expander with LED driver and keypad engine. For now, the keypad engine is not supported.
294 lines
9.7 KiB
C
294 lines
9.7 KiB
C
/****************************************************************************
|
|
* 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 <nuttx/config.h>
|
|
|
|
#include <nuttx/wdog.h>
|
|
#include <nuttx/clock.h>
|
|
#include <nuttx/mutex.h>
|
|
#include <nuttx/wqueue.h>
|
|
#include <nuttx/ioexpander/ioexpander.h>
|
|
#include <nuttx/ioexpander/sx1509.h>
|
|
#ifdef CONFIG_SX1509_LED_ENABLE
|
|
# include <nuttx/leds/userled.h>
|
|
#endif
|
|
|
|
#include <nuttx/i2c/i2c_master.h>
|
|
#include <nuttx/irq.h>
|
|
|
|
/****************************************************************************
|
|
* 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 */
|