libchip: Add I2C SEMTECH SC620 octal LED driver

This commit is contained in:
Sebastian Huber
2013-01-09 14:31:20 +01:00
parent aeff597721
commit fb070e054d
4 changed files with 141 additions and 0 deletions

View File

@@ -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 \

View File

@@ -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)
};

View File

@@ -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 */

View File

@@ -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