summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2012-07-03 14:45:59 -0700
committerGerrit <chrome-bot@google.com>2012-07-07 17:14:18 -0700
commit7f5f7be3e5df92ec2e9447b3d5d0b8ddeb96c9a0 (patch)
treef58e23fa5d053e31163faf8279882f0d9891c1fe /common
parent0e42faf85b3a4adbc83cb087e0bdab7641df9f1b (diff)
downloadchrome-ec-7f5f7be3e5df92ec2e9447b3d5d0b8ddeb96c9a0.tar.gz
Add memory-mapped data support for I2C and SPI protocols
And fix returning memory-mapped string length on LPC as well. BUG=chrome-os-partner:11090 TEST=manual from EC, 'hostevent set 0x40000' from host, 'ectool eventget' --> should print 0x40000 Signed-off-by: Randall Spangler <rspangler@chromium.org> Change-Id: I9edbd0a1468b5d4160ce67c471332226e51fa868 Reviewed-on: https://gerrit.chromium.org/gerrit/26719 Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/charge_state.c40
-rw-r--r--common/host_command.c40
-rw-r--r--common/temp_sensor.c11
3 files changed, 62 insertions, 29 deletions
diff --git a/common/charge_state.c b/common/charge_state.c
index 338e2f873e..128a1db293 100644
--- a/common/charge_state.c
+++ b/common/charge_state.c
@@ -8,14 +8,14 @@
#include "battery.h"
#include "battery_pack.h"
-#include "board.h"
#include "charge_state.h"
#include "charger.h"
#include "chipset.h"
+#include "common.h"
#include "console.h"
#include "gpio.h"
+#include "host_command.h"
#include "lpc.h"
-#include "ec_commands.h"
#include "power_button.h"
#include "power_led.h"
#include "printf.h"
@@ -41,37 +41,34 @@ static void update_battery_info(void)
int batt_serial;
/* Design Capacity of Full */
- battery_design_capacity((int *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_DCAP));
+ battery_design_capacity((int *)host_get_memmap(EC_MEMMAP_BATT_DCAP));
/* Design Voltage */
- battery_design_voltage((int *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_DVLT));
+ battery_design_voltage((int *)host_get_memmap(EC_MEMMAP_BATT_DVLT));
/* Last Full Charge Capacity */
- battery_full_charge_capacity((int *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_LFCC));
+ battery_full_charge_capacity(
+ (int *)host_get_memmap(EC_MEMMAP_BATT_LFCC));
/* Cycle Count */
- battery_cycle_count((int *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_CCNT));
+ battery_cycle_count((int *)host_get_memmap(EC_MEMMAP_BATT_CCNT));
/* Battery Manufacturer string */
- batt_str = (char *)(lpc_get_memmap_range() + EC_MEMMAP_BATT_MFGR);
+ batt_str = (char *)host_get_memmap(EC_MEMMAP_BATT_MFGR);
memset(batt_str, 0, EC_MEMMAP_TEXT_MAX);
battery_manufacturer_name(batt_str, EC_MEMMAP_TEXT_MAX);
/* Battery Model string */
- batt_str = (char *)(lpc_get_memmap_range() + EC_MEMMAP_BATT_MODEL);
+ batt_str = (char *)host_get_memmap(EC_MEMMAP_BATT_MODEL);
memset(batt_str, 0, EC_MEMMAP_TEXT_MAX);
battery_device_name(batt_str, EC_MEMMAP_TEXT_MAX);
/* Battery Type string */
- batt_str = (char *)(lpc_get_memmap_range() + EC_MEMMAP_BATT_TYPE);
+ batt_str = (char *)host_get_memmap(EC_MEMMAP_BATT_TYPE);
battery_device_chemistry(batt_str, EC_MEMMAP_TEXT_MAX);
/* Smart battery serial number is 16 bits */
- batt_str = (char *)(lpc_get_memmap_range() + EC_MEMMAP_BATT_SERIAL);
+ batt_str = (char *)host_get_memmap(EC_MEMMAP_BATT_SERIAL);
memset(batt_str, 0, EC_MEMMAP_TEXT_MAX);
if (battery_serial_number(&batt_serial) == 0)
snprintf(batt_str, EC_MEMMAP_TEXT_MAX, "%04X", batt_serial);
@@ -474,14 +471,13 @@ void charge_state_machine_task(void)
ctx.charger = charger_get_info();
/* Setup LPC direct memmap */
- ctx.memmap_batt_volt = (uint32_t *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_VOLT);
- ctx.memmap_batt_rate = (uint32_t *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_RATE);
- ctx.memmap_batt_cap = (uint32_t *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_CAP);
- ctx.memmap_batt_flags = (uint8_t *)(lpc_get_memmap_range() +
- EC_MEMMAP_BATT_FLAG);
+ ctx.memmap_batt_volt =
+ (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_VOLT);
+ ctx.memmap_batt_rate =
+ (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_RATE);
+ ctx.memmap_batt_cap =
+ (uint32_t *)host_get_memmap(EC_MEMMAP_BATT_CAP);
+ ctx.memmap_batt_flags = host_get_memmap(EC_MEMMAP_BATT_FLAG);
while (1) {
diff --git a/common/host_command.c b/common/host_command.c
index cc7de1e473..3647e50cda 100644
--- a/common/host_command.c
+++ b/common/host_command.c
@@ -23,6 +23,18 @@
static int host_command[2];
+#ifndef CONFIG_LPC
+static uint8_t host_memmap[EC_MEMMAP_SIZE];
+#endif
+
+uint8_t *host_get_memmap(int offset)
+{
+#ifdef CONFIG_LPC
+ return lpc_get_memmap_range() + offset;
+#else
+ return host_memmap + offset;
+#endif
+}
void host_command_received(int slot, int command)
{
@@ -93,6 +105,32 @@ static int host_command_read_test(uint8_t *data, int *resp_size)
}
DECLARE_HOST_COMMAND(EC_CMD_READ_TEST, host_command_read_test);
+#ifndef CONFIG_LPC
+/*
+ * Host command to read memory map is not needed on LPC, because LPC can
+ * directly map the data to the host's memory space.
+ */
+static int host_command_read_memmap(uint8_t *data, int *resp_size)
+{
+ struct ec_params_read_memmap *p = (struct ec_params_read_memmap *)data;
+ struct ec_response_read_memmap *r =
+ (struct ec_response_read_memmap *)data;
+
+ /* Copy params out of data before we overwrite it with output */
+ uint8_t offset = p->offset;
+ uint8_t size = p->size;
+
+ if (size > sizeof(r->data) || offset > EC_MEMMAP_SIZE ||
+ offset + size > EC_MEMMAP_SIZE)
+ return EC_RES_INVALID_PARAM;
+
+ memcpy(r->data, host_get_memmap(offset), size);
+
+ *resp_size = size;
+ return EC_RES_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_READ_MEMMAP, host_command_read_memmap);
+#endif
#ifdef CONFIG_LPC
/* ACPI query event handler. Note that the returned value is NOT actually
@@ -114,7 +152,7 @@ static int host_command_acpi_query_event(uint8_t *data, int *resp_size)
return 0;
}
DECLARE_HOST_COMMAND(EC_CMD_ACPI_QUERY_EVENT, host_command_acpi_query_event);
-#endif
+#endif /* CONFIG_LPC */
/* Finds a command by command number. Returns the command structure, or NULL if
diff --git a/common/temp_sensor.c b/common/temp_sensor.c
index 0cfcade505..257b1a372b 100644
--- a/common/temp_sensor.c
+++ b/common/temp_sensor.c
@@ -5,14 +5,13 @@
/* Temperature sensor module for Chrome EC */
-#include "board.h"
#include "chip_temp_sensor.h"
#include "chipset.h"
+#include "common.h"
#include "console.h"
#include "gpio.h"
#include "i2c.h"
-#include "lpc.h"
-#include "ec_commands.h"
+#include "host_command.h"
#include "peci.h"
#include "task.h"
#include "temp_sensor.h"
@@ -74,10 +73,10 @@ static void poll_fast_sensors(void)
}
-static void update_lpc_mapped_memory(void)
+static void update_mapped_memory(void)
{
int i, t;
- uint8_t *mapped = lpc_get_memmap_range() + EC_MEMMAP_TEMP_SENSOR;
+ uint8_t *mapped = host_get_memmap(EC_MEMMAP_TEMP_SENSOR);
memset(mapped, 0xff, 16);
@@ -104,7 +103,7 @@ void temp_sensor_task(void)
poll_fast_sensors();
}
poll_slow_sensors();
- update_lpc_mapped_memory();
+ update_mapped_memory();
}
}