forked from Imagelibrary/rtems
Add NXP PCA9548A 8-channel switch I2C driver
This commit is contained in:
@@ -9,6 +9,7 @@ include_dev_i2c_HEADERS =
|
||||
include_dev_i2c_HEADERS += include/dev/i2c/eeprom.h
|
||||
include_dev_i2c_HEADERS += include/dev/i2c/gpio-nxp-pca9535.h
|
||||
include_dev_i2c_HEADERS += include/dev/i2c/i2c.h
|
||||
include_dev_i2c_HEADERS += include/dev/i2c/switch-nxp-pca9548a.h
|
||||
|
||||
include_linuxdir = $(includedir)/linux
|
||||
include_linux_HEADERS =
|
||||
@@ -22,6 +23,7 @@ libdev_a_SOURCES += i2c/eeprom.c
|
||||
libdev_a_SOURCES += i2c/gpio-nxp-pca9535.c
|
||||
libdev_a_SOURCES += i2c/i2c-bus.c
|
||||
libdev_a_SOURCES += i2c/i2c-dev.c
|
||||
libdev_a_SOURCES += i2c/switch-nxp-pca9548a.c
|
||||
|
||||
include $(srcdir)/preinstall.am
|
||||
include $(top_srcdir)/automake/local.am
|
||||
|
||||
99
cpukit/dev/i2c/switch-nxp-pca9548a.c
Normal file
99
cpukit/dev/i2c/switch-nxp-pca9548a.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief Switch NXP PCA9548A Driver Implementation
|
||||
*
|
||||
* @ingroup I2CSWITCHNXPPCA9548A
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#if HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <dev/i2c/switch-nxp-pca9548a.h>
|
||||
|
||||
static int switch_nxp_pca9548a_do_get_control(
|
||||
i2c_dev *dev,
|
||||
uint8_t *val
|
||||
)
|
||||
{
|
||||
i2c_msg msg = {
|
||||
.addr = dev->address,
|
||||
.flags = I2C_M_RD,
|
||||
.len = (uint16_t) sizeof(*val),
|
||||
.buf = val
|
||||
};
|
||||
|
||||
return i2c_bus_transfer(dev->bus, &msg, 1);
|
||||
}
|
||||
|
||||
static int switch_nxp_pca9548a_do_set_control(
|
||||
i2c_dev *dev,
|
||||
uint8_t val
|
||||
)
|
||||
{
|
||||
i2c_msg msg = {
|
||||
.addr = dev->address,
|
||||
.flags = 0,
|
||||
.len = (uint16_t) sizeof(val),
|
||||
.buf = &val
|
||||
};
|
||||
|
||||
return i2c_bus_transfer(dev->bus, &msg, 1);
|
||||
}
|
||||
|
||||
static int switch_nxp_pca9548a_ioctl(
|
||||
i2c_dev *dev,
|
||||
ioctl_command_t command,
|
||||
void *arg
|
||||
)
|
||||
{
|
||||
uint8_t v8 = (uint8_t)(uintptr_t) arg;
|
||||
int err;
|
||||
|
||||
switch (command) {
|
||||
case SWITCH_NXP_PCA9548A_GET_CONTROL:
|
||||
err = switch_nxp_pca9548a_do_get_control(dev, arg);
|
||||
break;
|
||||
case SWITCH_NXP_PCA9548A_SET_CONTROL:
|
||||
err = switch_nxp_pca9548a_do_set_control(dev, v8);
|
||||
break;
|
||||
default:
|
||||
err = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int i2c_dev_register_switch_nxp_pca9548a(
|
||||
const char *bus_path,
|
||||
const char *dev_path,
|
||||
uint16_t address
|
||||
)
|
||||
{
|
||||
i2c_dev *dev;
|
||||
|
||||
dev = i2c_dev_alloc_and_init(sizeof(*dev), bus_path, address);
|
||||
if (dev == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
dev->ioctl = switch_nxp_pca9548a_ioctl;
|
||||
|
||||
return i2c_dev_register(dev, dev_path);
|
||||
}
|
||||
68
cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h
Normal file
68
cpukit/dev/include/dev/i2c/switch-nxp-pca9548a.h
Normal file
@@ -0,0 +1,68 @@
|
||||
/**
|
||||
* @file
|
||||
*
|
||||
* @brief Switch NXP PCA9548A Driver API
|
||||
*
|
||||
* @ingroup I2CSWITCHNXPPCA9548A
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2014 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _DEV_I2C_SWITCH_NXP_PCA9548A_H
|
||||
#define _DEV_I2C_SWITCH_NXP_PCA9548A_H
|
||||
|
||||
#include <dev/i2c/i2c.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/**
|
||||
* @defgroup I2CSWITCHNXPPCA9548A Switch NXP PCA9535 Driver
|
||||
*
|
||||
* @ingroup I2CDevice
|
||||
*
|
||||
* @brief Driver for NXP PCA9548A 8-channel switch device.
|
||||
*
|
||||
* @{
|
||||
*/
|
||||
|
||||
int i2c_dev_register_switch_nxp_pca9548a(
|
||||
const char *bus_path,
|
||||
const char *dev_path,
|
||||
uint16_t address
|
||||
);
|
||||
|
||||
#define SWITCH_NXP_PCA9548A_GET_CONTROL (I2C_DEV_IO_CONTROL + 0)
|
||||
|
||||
#define SWITCH_NXP_PCA9548A_SET_CONTROL (I2C_DEV_IO_CONTROL + 1)
|
||||
|
||||
static inline int switch_nxp_pca9548a_get_control(int fd, uint8_t *val)
|
||||
{
|
||||
return ioctl(fd, SWITCH_NXP_PCA9548A_GET_CONTROL, val);
|
||||
}
|
||||
|
||||
static inline int switch_nxp_pca9548a_set_control(int fd, uint8_t val)
|
||||
{
|
||||
return ioctl(fd, SWITCH_NXP_PCA9548A_SET_CONTROL, (void *)(uintptr_t) val);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _DEV_I2C_SWITCH_NXP_PCA9548A_H */
|
||||
@@ -35,6 +35,10 @@ $(PROJECT_INCLUDE)/dev/i2c/i2c.h: include/dev/i2c/i2c.h $(PROJECT_INCLUDE)/dev/i
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/dev/i2c/i2c.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/dev/i2c/i2c.h
|
||||
|
||||
$(PROJECT_INCLUDE)/dev/i2c/switch-nxp-pca9548a.h: include/dev/i2c/switch-nxp-pca9548a.h $(PROJECT_INCLUDE)/dev/i2c/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/dev/i2c/switch-nxp-pca9548a.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/dev/i2c/switch-nxp-pca9548a.h
|
||||
|
||||
$(PROJECT_INCLUDE)/linux/$(dirstamp):
|
||||
@$(MKDIR_P) $(PROJECT_INCLUDE)/linux
|
||||
@: > $(PROJECT_INCLUDE)/linux/$(dirstamp)
|
||||
|
||||
Reference in New Issue
Block a user