[Armadeus-commitlog] armadeus branch, master, updated. armadeus-5.2-192-gaf229de
Brought to you by:
sszy
|
From: SebR <se...@us...> - 2013-03-09 15:34:00
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "armadeus".
The branch, master has been updated
via af229de7a654de0506182b11f8937ac10abd3a7a (commit)
via d6226d3ec1fd2073bb84fa4abcc8c97f1fbe9a5e (commit)
from 9469621400c9a743ae59d18add534290252e0ad3 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit af229de7a654de0506182b11f8937ac10abd3a7a
Merge: d6226d3 9469621
Author: seb <seb...@ar...>
Date: Sat Mar 9 16:33:34 2013 +0100
Merge branch 'master' of ssh://git.code.sf.net/p/armadeus/code
commit d6226d3ec1fd2073bb84fa4abcc8c97f1fbe9a5e
Author: seb <seb...@ar...>
Date: Sat Mar 9 16:32:31 2013 +0100
[as_devices] complete i2c_eeprom capabilities
-----------------------------------------------------------------------
Summary of changes:
.../package/armadeus/as_devices/as_devices.mk | 2 +-
target/packages/as_devices/Makefile | 6 +-
target/packages/as_devices/c/as_i2c_eeprom.c | 99 ++++++++++++++++++-
target/packages/as_devices/c/as_i2c_eeprom.h | 29 ++++++-
target/packages/as_devices/cpp/as_i2c_eeprom.cpp | 27 ++++++
target/packages/as_devices/cpp/as_i2c_eeprom.hpp | 22 +++++
6 files changed, 173 insertions(+), 12 deletions(-)
diff --git a/buildroot/package/armadeus/as_devices/as_devices.mk b/buildroot/package/armadeus/as_devices/as_devices.mk
index 845d4ea..c0aaf5b 100644
--- a/buildroot/package/armadeus/as_devices/as_devices.mk
+++ b/buildroot/package/armadeus/as_devices/as_devices.mk
@@ -4,7 +4,7 @@
#
#############################################################
-AS_DEVICES_VERSION = 0.16
+AS_DEVICES_VERSION = 0.17
AS_DEVICES_SITE = $(TOPDIR)/../target/packages/as_devices
ifeq ($(generic-package), )
AS_DEVICES_SITE_METHOD = copy
diff --git a/target/packages/as_devices/Makefile b/target/packages/as_devices/Makefile
index 5137497..7c01bbc 100644
--- a/target/packages/as_devices/Makefile
+++ b/target/packages/as_devices/Makefile
@@ -39,13 +39,13 @@ $(CPP_BINARY): main.c test_cpp.h $(CPP_LIB) $(C_LIB)
$(CXX) $(CFLAGS) main.c $(C_LIB) $(CPP_LIB) -I$(C_INCLUDE) -I$(CPP_INCLUDE) -o $(CPP_BINARY) -D__cplusplus
$(CPP_LIB): $(C_LIB)
- make -C cpp/
+ +make -C cpp/
$(C_LIB):
- make -C c/
+ +make -C c/
$(P_WRAPPER): $(C_LIB)
- make -C python/ STAGING_DIR=$(ARMADEUS_STAGING_DIR)
+ +make -C python/ STAGING_DIR=$(ARMADEUS_STAGING_DIR)
touch $(P_WRAPPER)
install:
diff --git a/target/packages/as_devices/c/as_i2c_eeprom.c b/target/packages/as_devices/c/as_i2c_eeprom.c
index 3f5a165..b7a8376 100644
--- a/target/packages/as_devices/c/as_i2c_eeprom.c
+++ b/target/packages/as_devices/c/as_i2c_eeprom.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
+#include <arpa/inet.h>
#include "as_i2c_eeprom.h"
@@ -38,7 +39,7 @@ struct as_i2c_eeprom_device * as_i2c_eeprom_open(int aBusNumber,
uint32_t anEeprom_addr,
uint32_t anAddr_width,
uint32_t aPage_buffer_size,
- uint16_t aNumber_pages,
+ uint16_t aNumber_pages,
uint16_t aPage_size)
{
struct as_i2c_eeprom_device *dev;
@@ -60,7 +61,7 @@ struct as_i2c_eeprom_device * as_i2c_eeprom_open(int aBusNumber,
/* verify datas */
if (!((anAddr_width == 8) || (anAddr_width == 16)))
return NULL;
- if (!((aPage_buffer_size == 16) || (aPage_buffer_size == 32)))
+ if (!((aPage_buffer_size == 4) || (aPage_buffer_size == 16) || (aPage_buffer_size == 32)))
return NULL;
if (!((aNumber_pages == 1) || (aNumber_pages == 2) || (aNumber_pages == 4)))
return NULL;
@@ -81,7 +82,8 @@ struct as_i2c_eeprom_device * as_i2c_eeprom_open(int aBusNumber,
dev->page_buffer_size = aPage_buffer_size;
dev->number_pages = aNumber_pages;
dev->page_size = aPage_size;
-
+ dev->write_time_us = 3000; // compatibility value
+
return dev;
}
@@ -166,8 +168,8 @@ int32_t as_i2c_eeprom_write(struct as_i2c_eeprom_device *aDev, uint16_t aPage_nu
memcpy( buffer+1, aBuffer + current_pos, aDev->page_buffer_size );
msg_size = aDev->page_buffer_size+1;
} else { // 16
- buffer[0] = 0;
- buffer[1] = current_pos;
+ buffer[0] = (current_pos>>8) & 0xFF;
+ buffer[1] = current_pos & 0xFF;
memcpy( buffer+2, aBuffer + current_pos, aDev->page_buffer_size );
msg_size = aDev->page_buffer_size+2;
}
@@ -184,10 +186,95 @@ int32_t as_i2c_eeprom_write(struct as_i2c_eeprom_device *aDev, uint16_t aPage_nu
return -1;
}
- usleep(3000);
+ usleep(aDev->write_time_us);
current_pos += aDev->page_buffer_size;
}
return 0;
}
+
+int32_t as_i2c_eeprom_set_write_time(struct as_i2c_eeprom_device *aDev, uint32_t aWriteTime)
+{
+ aDev->write_time_us = aWriteTime;
+ return 0;
+}
+
+static int32_t as_i2c_eeprom_read_write_mid(struct as_i2c_eeprom_device *aDev, uint16_t aAddr, uint16_t aLen, uint8_t* aBuffer, uint32_t isWrite)
+{
+ static uint8_t buffer[8*1024 + 2];
+ int16_t addr_len = 0;
+ uint16_t fragment_len;
+ uint16_t current_addr = aAddr;
+ uint16_t current_page;
+
+ if (aAddr + aLen > aDev->number_pages * aDev->page_size) {
+ ERROR("Wrong address and length : %04x %d\n", aAddr, aLen);
+ return -1;
+ }
+
+ if (aDev->addr_width == 8) {
+ addr_len = 1;
+ } else { // 16
+ addr_len = 2;
+ }
+
+ while (aLen) {
+ // calculate page and offset
+ current_page = current_addr / aDev->page_size;
+ if (addr_len == 2) {
+ *((uint16_t*)buffer) = htons(current_addr % aDev->page_size);
+ } else {
+ *((uint8_t*)buffer) = (uint8_t)(current_addr % aDev->page_size);
+ }
+
+ // select page to read or write to
+ if (as_i2c_set_slave_addr(aDev->i2c_dev, aDev->eeprom_addr|current_page) < 0) {
+ ERROR("Can't set EEPROM address on I2C\n");
+ return -1;
+ }
+
+ // calculate len of fragment regarding page_buffer_size
+ fragment_len = aDev->page_buffer_size - (current_addr % aDev->page_buffer_size);
+ if (fragment_len > aLen) {
+ fragment_len = aLen;
+ }
+
+ if (isWrite) {
+ memcpy(buffer + 2, aBuffer, fragment_len);
+ // select offset address inside page
+ if (as_i2c_write(aDev->i2c_dev, buffer, addr_len + fragment_len) < 0) {
+ ERROR("Can't write on I2C EEPROM\n");
+ return -1;
+ }
+ usleep(aDev->write_time_us);
+ } else {
+ // select offset address inside page
+ if (as_i2c_write(aDev->i2c_dev, buffer, addr_len) < 0) {
+ ERROR("Can't write on I2C EEPROM\n");
+ return -1;
+ }
+ // read data
+ if (as_i2c_read(aDev->i2c_dev, aBuffer, fragment_len) < 0) {
+ ERROR("Can't read on I2C EEPROM\n");
+ return -1;
+ }
+ }
+
+ current_addr += fragment_len;
+ aBuffer += fragment_len;
+ aLen -= fragment_len;
+ }
+
+ return 0;
+}
+
+int32_t as_i2c_eeprom_read_mid(struct as_i2c_eeprom_device *aDev, uint16_t aAddr, uint16_t aLen, uint8_t* aBuffer)
+{
+ return as_i2c_eeprom_read_write_mid(aDev, aAddr, aLen, aBuffer, 0);
+}
+
+int32_t as_i2c_eeprom_write_mid(struct as_i2c_eeprom_device *aDev, uint16_t aAddr, uint16_t aLen, uint8_t* aBuffer)
+{
+ return as_i2c_eeprom_read_write_mid(aDev, aAddr, aLen, aBuffer, 1);
+}
diff --git a/target/packages/as_devices/c/as_i2c_eeprom.h b/target/packages/as_devices/c/as_i2c_eeprom.h
index 74d20db..773d3a5 100644
--- a/target/packages/as_devices/c/as_i2c_eeprom.h
+++ b/target/packages/as_devices/c/as_i2c_eeprom.h
@@ -50,6 +50,7 @@ struct as_i2c_eeprom_device {
uint32_t page_buffer_size;
uint16_t number_pages;
uint16_t page_size;
+ uint32_t write_time_us;
};
/** @brief open the device
@@ -65,7 +66,7 @@ struct as_i2c_eeprom_device * as_i2c_eeprom_open(int aBusNumber,
uint32_t anEeprom_addr,
uint32_t anAddr_width,
uint32_t aPage_buffer_size,
- uint16_t aNumber_pages,
+ uint16_t aNumber_pages,
uint16_t aPage_size);
/** @brief close the device
@@ -92,9 +93,33 @@ int32_t as_i2c_eeprom_read(struct as_i2c_eeprom_device *aDev, uint16_t aPage_num
*/
int32_t as_i2c_eeprom_write(struct as_i2c_eeprom_device *aDev, uint16_t aPage_number, uint8_t* aBuffer, uint16_t aBuffer_size);
+/** @brief Change write time delay
+ *
+ * @param aDev EEPROM structure
+ * @param aWriteTime delay between 2 write cmd in micro seconds
+ */
+int32_t as_i2c_eeprom_set_write_time(struct as_i2c_eeprom_device *aDev, uint32_t aWriteTime);
+
+/** @brief Write on an EEPROM non sequential
+ *
+ * @param aDev EEPROM structure
+ * @param aAddr address to start write
+ * @param aLen length of data to write
+ * @param aBuffer buffer containing data to write
+ */
+int32_t as_i2c_eeprom_write_mid(struct as_i2c_eeprom_device *aDev, uint16_t aAddr, uint16_t aLen, uint8_t* aBuffer);
+
+/** @brief Read from an EEPROM non sequential
+ *
+ * @param aDev EEPROM structure
+ * @param aAddr address to start read
+ * @param aLen length of data to read
+ * @param aBuffer buffer receiving data
+ */
+int32_t as_i2c_eeprom_read_mid(struct as_i2c_eeprom_device *aDev, uint16_t aAddr, uint16_t aLen, uint8_t* aBuffer);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* AS_I2C_EEPROM_H_ */
-
diff --git a/target/packages/as_devices/cpp/as_i2c_eeprom.cpp b/target/packages/as_devices/cpp/as_i2c_eeprom.cpp
index 7d8768c..f666486 100644
--- a/target/packages/as_devices/cpp/as_i2c_eeprom.cpp
+++ b/target/packages/as_devices/cpp/as_i2c_eeprom.cpp
@@ -66,3 +66,30 @@ long AsI2CEeprom::write(unsigned int aPageNumber, unsigned char* aBuffer, unsign
return -1;
}
}
+
+long AsI2CEeprom::set_write_time(unsigned int aWriteTime)
+{
+ if (mDev != NULL)
+ {
+ return as_i2c_eeprom_set_write_time(mDev, aWriteTime);
+ }
+ return -1;
+}
+
+long AsI2CEeprom::read_mid(unsigned int anAddress, unsigned int aLength, unsigned char* aBuffer)
+{
+ if (mDev != NULL)
+ {
+ return as_i2c_eeprom_read_mid(mDev, anAddress, aLength, aBuffer);
+ }
+ return -1;
+}
+
+long AsI2CEeprom::write_mid(unsigned int anAddress, unsigned int aLength, unsigned char* aBuffer)
+{
+ if (mDev != NULL)
+ {
+ return as_i2c_eeprom_write_mid(mDev, anAddress, aLength, aBuffer);
+ }
+ return -1;
+}
diff --git a/target/packages/as_devices/cpp/as_i2c_eeprom.hpp b/target/packages/as_devices/cpp/as_i2c_eeprom.hpp
index 0c90d2c..b47bb06 100644
--- a/target/packages/as_devices/cpp/as_i2c_eeprom.hpp
+++ b/target/packages/as_devices/cpp/as_i2c_eeprom.hpp
@@ -53,6 +53,28 @@ unsigned long aPageBufferSize, unsigned int aNumberPages, unsigned int aPageSize
*/
long write(unsigned int aPageNumber, unsigned char* aBuffer, unsigned int aBufferSize);
+ /** @brief Change write time delay
+ *
+ * @param aWriteTime delay between 2 write cmd in micro seconds
+ */
+ long set_write_time(unsigned int aWriteTime);
+
+ /** @brief Read from EEPROM non sequential
+ *
+ * @param anAddress address to start write
+ * @param aLength length of data to write
+ * @param aBuffer buffer containing data to write
+ */
+ long read_mid(unsigned int anAddress, unsigned int aLength, unsigned char* aBuffer);
+
+ /** @brief Write on an EEPROM non sequential
+ *
+ * @param aAddress address to start read
+ * @param aLength length of data to read
+ * @param aBuffer buffer receiving data
+ */
+ long write_mid(unsigned int anAddress, unsigned int aLength, unsigned char* aBuffer);
+
protected:
mutable struct as_i2c_eeprom_device *mDev;
};
hooks/post-receive
--
armadeus
|