forked from Imagelibrary/rtems
2005-11-02 straumanatslacdotstanford.edu
* libchip/i2c/i2c-2b-eeprom.c, libchip/i2c/i2c-2b-eeprom.h,
libchip/i2c/i2c-ds1621.c, libchip/i2c/i2c-ds1621.h: New files.
* libchip/Makefile.am, libchip/preinstall.am, wrapup/Makefile.am:
added a simple API/library
for i2c devices and drivers for i2c 2-byte eeproms and a ds1621
temperature sensor; API is documented in libi2c.h
This commit is contained in:
@@ -1,3 +1,12 @@
|
|||||||
|
2005-11-02 straumanatslacdotstanford.edu
|
||||||
|
|
||||||
|
* libchip/i2c/i2c-2b-eeprom.c, libchip/i2c/i2c-2b-eeprom.h,
|
||||||
|
libchip/i2c/i2c-ds1621.c, libchip/i2c/i2c-ds1621.h: New files.
|
||||||
|
* libchip/Makefile.am, libchip/preinstall.am, wrapup/Makefile.am:
|
||||||
|
added a simple API/library
|
||||||
|
for i2c devices and drivers for i2c 2-byte eeproms and a ds1621
|
||||||
|
temperature sensor; API is documented in libi2c.h
|
||||||
|
|
||||||
2005-10-26 Ralf Corsepius <ralf.corsepius@rtems.org>
|
2005-10-26 Ralf Corsepius <ralf.corsepius@rtems.org>
|
||||||
|
|
||||||
* libnetworking/pppd/ipxcp.c,
|
* libnetworking/pppd/ipxcp.c,
|
||||||
|
|||||||
@@ -62,6 +62,15 @@ endif
|
|||||||
EXTRA_DIST += rtc/README.ds1643 rtc/README.icm7170 rtc/README.m48t08 \
|
EXTRA_DIST += rtc/README.ds1643 rtc/README.icm7170 rtc/README.m48t08 \
|
||||||
rtc/README.m48t18 rtc/STATUS
|
rtc/README.m48t18 rtc/STATUS
|
||||||
|
|
||||||
|
# i2c
|
||||||
|
if LIBCHIP
|
||||||
|
include_libchip_HEADERS += i2c/i2c-ds1621.h i2c/i2c-2b-eeprom.h
|
||||||
|
|
||||||
|
noinst_LIBRARIES += libi2cio.a
|
||||||
|
libi2cio_a_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
libi2cio_a_SOURCES = i2c/i2c-ds1621.c i2c/i2c-2b-eeprom.c
|
||||||
|
endif
|
||||||
|
|
||||||
# serial
|
# serial
|
||||||
if LIBCHIP
|
if LIBCHIP
|
||||||
include_libchip_HEADERS += serial/mc68681.h serial/ns16550.h serial/z85c30.h \
|
include_libchip_HEADERS += serial/mc68681.h serial/ns16550.h serial/z85c30.h \
|
||||||
|
|||||||
132
c/src/libchip/i2c/i2c-2b-eeprom.c
Normal file
132
c/src/libchip/i2c/i2c-2b-eeprom.c
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Trivial i2c driver for reading "2-byte eeproms".
|
||||||
|
* On 'open' the read-pointer is reset to 0, subsequent
|
||||||
|
* read operations slurp data from there...
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Author: Till Straumann, 2005 */
|
||||||
|
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/libi2c.h>
|
||||||
|
|
||||||
|
#include <libchip/i2c-2b-eeprom.h>
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
|
||||||
|
#define EEPROM_PG_SZ 32
|
||||||
|
#define ALGN(x) (((unsigned32)(x) + EEPROM_PG_SZ) & ~(EEPROM_PG_SZ-1))
|
||||||
|
|
||||||
|
static rtems_status_code
|
||||||
|
send_file_ptr (rtems_device_minor_number minor, unsigned pos, int tout)
|
||||||
|
{
|
||||||
|
int sc;
|
||||||
|
unsigned char bytes[2];
|
||||||
|
|
||||||
|
bytes[0] = (pos >> 8) & 0xff;
|
||||||
|
bytes[1] = (pos) & 0xff;
|
||||||
|
|
||||||
|
/* poll addressing the next page; if 'tout' is <=0 we only try once
|
||||||
|
* and return the status. If 'tout' is positive, we try 'tout' times
|
||||||
|
* and return RTEMS_TIMEOUT if it didnt work
|
||||||
|
*/
|
||||||
|
while ((sc = rtems_libi2c_start_write_bytes (minor, bytes, 2)) < 0) {
|
||||||
|
if (--tout <= 0)
|
||||||
|
return tout ? -sc : RTEMS_TIMEOUT;
|
||||||
|
rtems_task_wake_after (1);
|
||||||
|
}
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_status_code
|
||||||
|
i2c_2b_eeprom_write (rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor, void *arg)
|
||||||
|
{
|
||||||
|
rtems_libio_rw_args_t *rwargs = arg;
|
||||||
|
unsigned off = rwargs->offset;
|
||||||
|
int cnt = rwargs->count;
|
||||||
|
char *buf = rwargs->buffer;
|
||||||
|
int sc;
|
||||||
|
unsigned end;
|
||||||
|
int l;
|
||||||
|
|
||||||
|
if (cnt <= 0)
|
||||||
|
return RTEMS_SUCCESSFUL;
|
||||||
|
|
||||||
|
if ((sc = send_file_ptr (minor, off, 0)))
|
||||||
|
return sc;
|
||||||
|
|
||||||
|
do {
|
||||||
|
/* write up to next page boundary */
|
||||||
|
end = ALGN (off);
|
||||||
|
l = end - off;
|
||||||
|
if (l > cnt)
|
||||||
|
l = cnt;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_write_bytes (minor, buf, l);
|
||||||
|
if (sc < 0)
|
||||||
|
return -sc;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_send_stop (minor);
|
||||||
|
if (sc)
|
||||||
|
return sc;
|
||||||
|
|
||||||
|
rwargs->bytes_moved += l;
|
||||||
|
|
||||||
|
buf += l;
|
||||||
|
cnt -= l;
|
||||||
|
off += l;
|
||||||
|
|
||||||
|
/* poll addressing the next page */
|
||||||
|
if ((sc = send_file_ptr (minor, off, 100)))
|
||||||
|
return sc;
|
||||||
|
|
||||||
|
} while (cnt > 0);
|
||||||
|
|
||||||
|
return rtems_libi2c_send_stop (minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_status_code
|
||||||
|
i2c_2b_eeprom_read (rtems_device_major_number major,
|
||||||
|
rtems_device_minor_number minor, void *arg)
|
||||||
|
{
|
||||||
|
int sc;
|
||||||
|
rtems_libio_rw_args_t *rwargs = arg;
|
||||||
|
|
||||||
|
if (RTEMS_SUCCESSFUL != (sc = send_file_ptr (minor, rwargs->offset, 0)))
|
||||||
|
return -sc;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_start_read_bytes (minor, rwargs->buffer, rwargs->count);
|
||||||
|
|
||||||
|
if (sc < 0) {
|
||||||
|
rwargs->bytes_moved = 0;
|
||||||
|
return -sc;
|
||||||
|
}
|
||||||
|
rwargs->bytes_moved = sc;
|
||||||
|
|
||||||
|
return rtems_libi2c_send_stop (minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_driver_address_table myops = {
|
||||||
|
read_entry: i2c_2b_eeprom_read,
|
||||||
|
write_entry: i2c_2b_eeprom_write,
|
||||||
|
};
|
||||||
|
|
||||||
|
static rtems_libi2c_drv_t my_drv_tbl = {
|
||||||
|
ops: &myops,
|
||||||
|
size: sizeof (my_drv_tbl),
|
||||||
|
};
|
||||||
|
|
||||||
|
/* provide a second table for R/O access */
|
||||||
|
static rtems_driver_address_table my_ro_ops = {
|
||||||
|
read_entry: i2c_2b_eeprom_read,
|
||||||
|
};
|
||||||
|
|
||||||
|
static rtems_libi2c_drv_t my_ro_drv_tbl = {
|
||||||
|
ops: &my_ro_ops,
|
||||||
|
size: sizeof (my_ro_drv_tbl),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
rtems_libi2c_drv_t *i2c_2b_eeprom_driver_descriptor = &my_drv_tbl;
|
||||||
|
rtems_libi2c_drv_t *i2c_2b_eeprom_ro_driver_descriptor = &my_ro_drv_tbl;
|
||||||
32
c/src/libchip/i2c/i2c-2b-eeprom.h
Normal file
32
c/src/libchip/i2c/i2c-2b-eeprom.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
#ifndef I2C_2B_EEPROM_DRIVER_H
|
||||||
|
#define I2C_2B_EEPROM_DRIVER_H
|
||||||
|
|
||||||
|
/* Trivial i2c driver for reading and writing "2-byte eeproms".
|
||||||
|
* On 'open' the file-pointer is reset to 0, subsequent
|
||||||
|
* read/write operations slurp/write data from there...
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Author: Till Straumann, 2005 */
|
||||||
|
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/libi2c.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* pass one of these to rtems_libi2c_register_drv() */
|
||||||
|
|
||||||
|
/* These ops provide no write access */
|
||||||
|
extern rtems_libi2c_drv_t *i2c_2b_eeprom_ro_driver_descriptor;
|
||||||
|
|
||||||
|
/* Use these for writing and reading */
|
||||||
|
extern rtems_libi2c_drv_t *i2c_2b_eeprom_driver_descriptor;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
87
c/src/libchip/i2c/i2c-ds1621.c
Normal file
87
c/src/libchip/i2c/i2c-ds1621.c
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
|
||||||
|
/* Trivial i2c driver for the maxim DS1621 temperature sensor;
|
||||||
|
* just implements reading constant conversions with 8-bit
|
||||||
|
* resolution.
|
||||||
|
* Demonstrates the implementation of a i2c high-level driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Author: Till Straumann, 2005 */
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/libi2c.h>
|
||||||
|
|
||||||
|
#include <libchip/i2c-ds1621.h>
|
||||||
|
|
||||||
|
#include <rtems/libio.h>
|
||||||
|
|
||||||
|
|
||||||
|
static rtems_status_code
|
||||||
|
ds1621_init (rtems_device_major_number major, rtems_device_minor_number minor,
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
int sc;
|
||||||
|
char csr[2] = { DS1621_CMD_CSR_ACCESS, 0 }, cmd;
|
||||||
|
|
||||||
|
/* First start command acquires a lock for the bus */
|
||||||
|
|
||||||
|
/* Initialize; switch continuous conversion on */
|
||||||
|
sc = rtems_libi2c_start_write_bytes (minor, csr, 1);
|
||||||
|
if (sc < 0)
|
||||||
|
return -sc;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_start_read_bytes (minor, csr + 1, 1);
|
||||||
|
if (sc < 0)
|
||||||
|
return -sc;
|
||||||
|
|
||||||
|
csr[1] &= ~DS1621_CSR_1SHOT;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_start_write_bytes (minor, csr, 2);
|
||||||
|
if (sc < 0)
|
||||||
|
return -sc;
|
||||||
|
|
||||||
|
/* Start conversion */
|
||||||
|
cmd = DS1621_CMD_START_CONV;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_start_write_bytes (minor, &cmd, 1);
|
||||||
|
if (sc < 0)
|
||||||
|
return -sc;
|
||||||
|
|
||||||
|
/* sending 'stop' relinquishes the bus mutex -- don't hold it
|
||||||
|
* across system calls!
|
||||||
|
*/
|
||||||
|
return rtems_libi2c_send_stop (minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_status_code
|
||||||
|
ds1621_read (rtems_device_major_number major, rtems_device_minor_number minor,
|
||||||
|
void *arg)
|
||||||
|
{
|
||||||
|
int sc;
|
||||||
|
rtems_libio_rw_args_t *rwargs = arg;
|
||||||
|
char cmd = DS1621_CMD_READ_TEMP;
|
||||||
|
|
||||||
|
sc = rtems_libi2c_start_write_bytes (minor, &cmd, 1);
|
||||||
|
if (sc < 0)
|
||||||
|
return -sc;
|
||||||
|
if (sc < 1)
|
||||||
|
return RTEMS_IO_ERROR;
|
||||||
|
sc = rtems_libi2c_start_read_bytes (minor, rwargs->buffer, 1);
|
||||||
|
if (sc < 0) {
|
||||||
|
rwargs->bytes_moved = 0;
|
||||||
|
return -sc;
|
||||||
|
}
|
||||||
|
rwargs->bytes_moved = 1;
|
||||||
|
return rtems_libi2c_send_stop (minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtems_driver_address_table myops = {
|
||||||
|
initialization_entry: ds1621_init,
|
||||||
|
read_entry: ds1621_read,
|
||||||
|
};
|
||||||
|
|
||||||
|
static rtems_libi2c_drv_t my_drv_tbl = {
|
||||||
|
ops: &myops,
|
||||||
|
size: sizeof (my_drv_tbl),
|
||||||
|
};
|
||||||
|
|
||||||
|
rtems_libi2c_drv_t *i2c_ds1621_driver_descriptor = &my_drv_tbl;
|
||||||
39
c/src/libchip/i2c/i2c-ds1621.h
Normal file
39
c/src/libchip/i2c/i2c-ds1621.h
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
/* $Id$ */
|
||||||
|
#ifndef I2C_DS_1621_DRIVER_H
|
||||||
|
#define I2C_DS_1621_DRIVER_H
|
||||||
|
|
||||||
|
/* Trivial i2c driver for the maxim DS1621 temperature sensor;
|
||||||
|
* just implements reading constant conversions with 8-bit
|
||||||
|
* resolution.
|
||||||
|
* Demonstrates the implementation of a i2c high-level driver.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Author: Till Straumann, 2005 */
|
||||||
|
|
||||||
|
#define DS1621_CMD_READ_TEMP 0xaa
|
||||||
|
#define DS1621_CMD_CSR_ACCESS 0xac
|
||||||
|
#define DS1621_CMD_START_CONV 0xee
|
||||||
|
|
||||||
|
/* CSR bits */
|
||||||
|
#define DS1621_CSR_DONE (1<<7)
|
||||||
|
#define DS1621_CSR_TEMP_HI (1<<6) /* T >= hi register */
|
||||||
|
#define DS1621_CSR_TEMP_LO (1<<5) /* T <= lo register */
|
||||||
|
#define DS1621_CSR_NVMEM_BSY (1<<4) /* non-volatile memory busy */
|
||||||
|
#define DS1621_CSR_OUT_POL (1<<1) /* Thermostat output active polarity */
|
||||||
|
#define DS1621_CSR_1SHOT (1<<0) /* Oneshot mode */
|
||||||
|
|
||||||
|
#include <rtems.h>
|
||||||
|
#include <rtems/libi2c.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* for registration with libi2c */
|
||||||
|
extern rtems_libi2c_drv_t *i2c_ds1621_driver_descriptor;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -77,6 +77,14 @@ $(PROJECT_INCLUDE)/libchip/rtc.h: rtc/rtc.h $(PROJECT_INCLUDE)/libchip/$(dirstam
|
|||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/rtc.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/rtc.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/rtc.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/rtc.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/libchip/i2c-ds1621.h: i2c/i2c-ds1621.h $(PROJECT_INCLUDE)/libchip/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $@
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/i2c-ds1621.h
|
||||||
|
|
||||||
|
$(PROJECT_INCLUDE)/libchip/i2c-2b-eeprom.h: i2c/i2c-2b-eeprom.h $(PROJECT_INCLUDE)/libchip/$(dirstamp)
|
||||||
|
$(INSTALL_DATA) $< $@
|
||||||
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/i2c-2b-eeprom.h
|
||||||
|
|
||||||
$(PROJECT_INCLUDE)/libchip/icm7170.h: rtc/icm7170.h $(PROJECT_INCLUDE)/libchip/$(dirstamp)
|
$(PROJECT_INCLUDE)/libchip/icm7170.h: rtc/icm7170.h $(PROJECT_INCLUDE)/libchip/$(dirstamp)
|
||||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/icm7170.h
|
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/libchip/icm7170.h
|
||||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/icm7170.h
|
PREINSTALL_FILES += $(PROJECT_INCLUDE)/libchip/icm7170.h
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ SRCS += ../libchip/libide.a
|
|||||||
if HAS_NETWORKING
|
if HAS_NETWORKING
|
||||||
SRCS += ../libchip/libnetchip.a
|
SRCS += ../libchip/libnetchip.a
|
||||||
endif
|
endif
|
||||||
|
SRCS += ../libchip/libi2cio.a
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if HAS_MP
|
if HAS_MP
|
||||||
|
|||||||
Reference in New Issue
Block a user