forked from Imagelibrary/rtems
libchip: Add I2C SEMTECH SC620 octal LED driver
This commit is contained in:
@@ -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 \
|
||||
|
||||
95
c/src/libchip/i2c/i2c-sc620.c
Normal file
95
c/src/libchip/i2c/i2c-sc620.c
Normal 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)
|
||||
};
|
||||
40
c/src/libchip/i2c/i2c-sc620.h
Normal file
40
c/src/libchip/i2c/i2c-sc620.h
Normal 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 */
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user