diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-01-09 14:31:20 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2013-01-09 16:45:26 +0100 |
commit | fb070e054d514e96bd2e9213ffc7cb2a4466bb3e (patch) | |
tree | f8689f076e118effb74c6aa9c40a46a2037511c1 | |
parent | bsps/powerpc: Add probe handler to I2C driver (diff) | |
download | rtems-fb070e054d514e96bd2e9213ffc7cb2a4466bb3e.tar.bz2 |
libchip: Add I2C SEMTECH SC620 octal LED driver
-rw-r--r-- | c/src/libchip/Makefile.am | 2 | ||||
-rw-r--r-- | c/src/libchip/i2c/i2c-sc620.c | 95 | ||||
-rw-r--r-- | c/src/libchip/i2c/i2c-sc620.h | 40 | ||||
-rw-r--r-- | c/src/libchip/preinstall.am | 4 |
4 files changed, 141 insertions, 0 deletions
diff --git a/c/src/libchip/Makefile.am b/c/src/libchip/Makefile.am index 46c06b47cc..5e4ffabca9 100644 --- a/c/src/libchip/Makefile.am +++ b/c/src/libchip/Makefile.am @@ -67,6 +67,7 @@ EXTRA_DIST += rtc/README.ds1643 rtc/README.icm7170 rtc/README.m48t08 \ # i2c include_libchip_HEADERS += i2c/i2c-ds1621.h \ i2c/i2c-2b-eeprom.h \ + i2c/i2c-sc620.h \ i2c/spi-memdrv.h \ i2c/spi-flash-m25p40.h \ i2c/spi-fram-fm25l256.h \ @@ -82,6 +83,7 @@ libi2cio_a_SOURCES = i2c/i2c-ds1621.h \ i2c/spi-fram-fm25l256.h \ i2c/i2c-ds1621.c \ i2c/i2c-2b-eeprom.c \ + i2c/i2c-sc620.c \ i2c/spi-memdrv.c \ i2c/spi-flash-m25p40.c \ i2c/spi-fram-fm25l256.c \ diff --git a/c/src/libchip/i2c/i2c-sc620.c b/c/src/libchip/i2c/i2c-sc620.c new file mode 100644 index 0000000000..105d35d7cb --- /dev/null +++ b/c/src/libchip/i2c/i2c-sc620.c @@ -0,0 +1,95 @@ +/** + * @file + * + * @brief I2C Driver for SEMTECH SC620 Octal LED Driver + */ + +/* + * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 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.com/license/LICENSE. + */ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include <libchip/i2c-sc620.h> + +#include <rtems/libio.h> + +#define SC620_REG_COUNT 10 + +static rtems_status_code i2c_sc620_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code sc = RTEMS_IO_ERROR; + rtems_libio_rw_args_t *rw = arg; + unsigned char *buf = (unsigned char *) &rw->buffer[0]; + + if (rw->count == 2 && buf[0] < SC620_REG_COUNT) { + int rv; + + rv = rtems_libi2c_start_write_bytes( + minor, buf, 2 + ); + if (rv == 2) { + sc = rtems_libi2c_send_stop(minor); + } + } + + rw->bytes_moved = sc == RTEMS_SUCCESSFUL ? 2 : 0; + + return sc; +} + +static rtems_status_code i2c_sc620_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code sc = RTEMS_IO_ERROR; + rtems_libio_rw_args_t *rw = arg; + unsigned char *buf = (unsigned char *) &rw->buffer[0]; + + if (rw->count == 1 && buf[0] < SC620_REG_COUNT) { + int rv; + + rv = rtems_libi2c_start_write_bytes(minor, buf, 1); + if (rv == 1) { + sc = rtems_libi2c_send_addr(minor, 0); + if (sc == RTEMS_SUCCESSFUL) { + rv = rtems_libi2c_read_bytes(minor, buf, 1); + if (rv == 1) { + sc = rtems_libi2c_send_stop(minor); + } + } + } + } + + rw->bytes_moved = sc == RTEMS_SUCCESSFUL ? 1 : 0; + + return sc; +} + +static rtems_driver_address_table i2c_sc620_ops = { + .read_entry = i2c_sc620_read, + .write_entry = i2c_sc620_write +}; + +rtems_libi2c_drv_t i2c_sc620_driver = { + .ops = &i2c_sc620_ops, + .size = sizeof(i2c_sc620_driver) +}; diff --git a/c/src/libchip/i2c/i2c-sc620.h b/c/src/libchip/i2c/i2c-sc620.h new file mode 100644 index 0000000000..119cd3d559 --- /dev/null +++ b/c/src/libchip/i2c/i2c-sc620.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2013 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.com/license/LICENSE. + */ + +#ifndef I2C_SC620_H +#define I2C_SC620_H + +#include <rtems/libi2c.h> + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @brief I2C driver for SEMTECH SC620 octal LED driver. + * + * A write() must use two character buffer. The buffer[0] value specifies the + * register and the buffer[1] value specifies the register data. + * + * A read() must use a one character buffer. The buffer[0] value specifies the + * register on function entry. The buffer[0] value contains the register value + * after a successful operation. + */ +extern rtems_libi2c_drv_t i2c_sc620_driver; + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* I2C_SC620_H */ diff --git a/c/src/libchip/preinstall.am b/c/src/libchip/preinstall.am index 51c9a4d5aa..7e80d6d598 100644 --- a/c/src/libchip/preinstall.am +++ b/c/src/libchip/preinstall.am @@ -126,6 +126,10 @@ $(PROJECT_INCLUDE)/libchip/i2c-2b-eeprom.h: i2c/i2c-2b-eeprom.h $(PROJECT_INCLUD $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/i2c-2b-eeprom.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/i2c-2b-eeprom.h +$(PROJECT_INCLUDE)/libchip/i2c-sc620.h: i2c/i2c-sc620.h $(PROJECT_INCLUDE)/libchip/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/i2c-sc620.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/i2c-sc620.h + $(PROJECT_INCLUDE)/libchip/spi-memdrv.h: i2c/spi-memdrv.h $(PROJECT_INCLUDE)/libchip/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/spi-memdrv.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/spi-memdrv.h |