From 7f5f7be3e5df92ec2e9447b3d5d0b8ddeb96c9a0 Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Tue, 3 Jul 2012 14:45:59 -0700 Subject: 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 Change-Id: I9edbd0a1468b5d4160ce67c471332226e51fa868 Reviewed-on: https://gerrit.chromium.org/gerrit/26719 Reviewed-by: Simon Glass --- common/charge_state.c | 40 ++++++++++++++++++---------------------- common/host_command.c | 40 +++++++++++++++++++++++++++++++++++++++- common/temp_sensor.c | 11 +++++------ 3 files changed, 62 insertions(+), 29 deletions(-) (limited to 'common') 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(); } } -- cgit v1.2.1