diff options
author | Randall Spangler <rspangler@chromium.org> | 2012-03-16 15:43:34 -0700 |
---|---|---|
committer | Randall Spangler <rspangler@chromium.org> | 2012-03-19 09:04:56 -0700 |
commit | 2a9f80d2d990816fe1e5bb1222a6b294673ce7b2 (patch) | |
tree | d0c6f16db3b667379b598ae5b733c69a6e2ebe68 | |
parent | eb3920ec7a6a5e3e28529fd51a6c63cb6e7509e4 (diff) | |
download | chrome-ec-2a9f80d2d990816fe1e5bb1222a6b294673ce7b2.tar.gz |
More cleanup of board/chip configs and initialization
More modules can be disabled individually through CONFIG_ defines.
Reordered early module pre-init and init, and added comments to
explain why things are ordered in main() the way they are.
Fixed a few assorted init-related bugs along the way, like st32m
keyboard scan double-initializing.
BUG=none
TEST=build link, bds, daisy
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Change-Id: I04a7fa51d743adfab4be4bdddaeef68943b96dec
-rw-r--r-- | board/link/board.h | 8 | ||||
-rw-r--r-- | chip/lm4/build.mk | 10 | ||||
-rw-r--r-- | chip/lm4/config.h | 5 | ||||
-rw-r--r-- | chip/lm4/flash.c | 2 | ||||
-rw-r--r-- | chip/lm4/gpio.c | 6 | ||||
-rw-r--r-- | chip/lm4/keyboard_scan.c | 6 | ||||
-rw-r--r-- | chip/lm4/uart.c | 4 | ||||
-rw-r--r-- | chip/stm32l/build.mk | 3 | ||||
-rw-r--r-- | chip/stm32l/gpio.c | 6 | ||||
-rw-r--r-- | chip/stm32l/keyboard_scan.c | 23 | ||||
-rw-r--r-- | chip/stm32l/stubs.c | 30 | ||||
-rw-r--r-- | common/build.mk | 15 | ||||
-rw-r--r-- | common/main.c | 71 | ||||
-rw-r--r-- | common/system_common.c (renamed from common/system.c) | 2 | ||||
-rw-r--r-- | common/usb_charge.c | 7 | ||||
-rw-r--r-- | include/flash.h | 4 |
16 files changed, 109 insertions, 93 deletions
diff --git a/board/link/board.h b/board/link/board.h index 81b764946f..4e75dd7e28 100644 --- a/board/link/board.h +++ b/board/link/board.h @@ -9,13 +9,17 @@ #define __BOARD_H /* Optional features */ +#define CONFIG_BATTERY_ATL706486 #define CONFIG_CHARGER +#define CONFIG_CHARGER_BQ24725 #define CONFIG_LIGHTBAR #define CONFIG_ONEWIRE #define CONFIG_PECI #define CONFIG_POWER_LED #define CONFIG_PSTORE +#define CONFIG_SMART_BATTERY #define CONFIG_TMP006 +#define CONFIG_USB_CHARGE /* 66.667 Mhz clock frequency */ #define CPU_CLOCK 66666667 @@ -71,7 +75,6 @@ enum adc_channel }; /* Charger module */ -#define CONFIG_CHARGER_BQ24725 /* Set charger input current limit * Note - this value should depend on external power adapter, * designed charging voltage, and the maximum power of @@ -83,9 +86,6 @@ enum adc_channel #define CONFIG_BQ24725_R_SNS 10 /* 10 mOhm charge sense resistor */ #define CONFIG_BQ24725_R_AC 20 /* 20 mOhm input current sense resistor */ -/* Battery module */ -#define CONFIG_SMART_BATTERY -#define CONFIG_BATTERY_ATL706486 /* I2C ports */ #define I2C_PORT_BATTERY 0 diff --git a/chip/lm4/build.mk b/chip/lm4/build.mk index fadc116f11..56bf793582 100644 --- a/chip/lm4/build.mk +++ b/chip/lm4/build.mk @@ -8,10 +8,14 @@ # LM4 SoC has a Cortex-M4 ARM core CORE:=cortex-m -chip-y=i2c.o adc.o jtag.o -chip-y+=clock.o gpio.o system.o uart.o -chip-y+=watchdog.o eeprom.o hwtimer.o +# Required chip modules +chip-y=clock.o gpio.o hwtimer.o jtag.o system.o uart.o watchdog.o + +# Optional chip modules +chip-$(CONFIG_ADC)+=adc.o +chip-$(CONFIG_EEPROM)+=eeprom.o chip-$(CONFIG_FLASH)+=flash.o +chip-$(CONFIG_I2C)+=i2c.o chip-$(CONFIG_LPC)+=lpc.o chip-$(CONFIG_ONEWIRE)+=onewire.o chip-$(CONFIG_PECI)+=peci.o diff --git a/chip/lm4/config.h b/chip/lm4/config.h index c1f86756b9..4ad329665d 100644 --- a/chip/lm4/config.h +++ b/chip/lm4/config.h @@ -42,10 +42,13 @@ #define CONFIG_DEBUG /* Optional features present on this chip */ +#define CONFIG_ADC +#define CONFIG_EEPROM #define CONFIG_FLASH +#define CONFIG_FPU +#define CONFIG_I2C #define CONFIG_LPC #define CONFIG_PWM -#define CONFIG_FPU /* Compile for running from RAM instead of flash */ /* #define COMPILE_FOR_RAM */ diff --git a/chip/lm4/flash.c b/chip/lm4/flash.c index 9d7d33f2ed..bc1505e791 100644 --- a/chip/lm4/flash.c +++ b/chip/lm4/flash.c @@ -287,7 +287,7 @@ int flash_get_write_protect_status(void) } -int flash_init(void) +int flash_pre_init(void) { /* Calculate usable flash size. Reserve one protection block * at the top to hold the write protect range. FSIZE already diff --git a/chip/lm4/gpio.c b/chip/lm4/gpio.c index 4c11e30d58..81b7312f03 100644 --- a/chip/lm4/gpio.c +++ b/chip/lm4/gpio.c @@ -98,6 +98,12 @@ int gpio_pre_init(void) /* Interrupt is enabled by gpio_enable_interrupt() */ } + return EC_SUCCESS; +} + + +int gpio_init(void) +{ /* Enable IRQs now that pins are set up */ task_enable_irq(LM4_IRQ_GPIOA); task_enable_irq(LM4_IRQ_GPIOB); diff --git a/chip/lm4/keyboard_scan.c b/chip/lm4/keyboard_scan.c index 2966713768..380c9c4974 100644 --- a/chip/lm4/keyboard_scan.c +++ b/chip/lm4/keyboard_scan.c @@ -359,9 +359,6 @@ int keyboard_scan_init(void) update_key_state(); recovery_key_pressed = check_recovery_key(); - /* Enable interrupts, now that we're set up */ - task_enable_irq(KB_SCAN_ROW_IRQ); - return EC_SUCCESS; } @@ -374,6 +371,9 @@ void keyboard_scan_task(void) if (recovery_key_pressed) uart_puts("[KB recovery key pressed at init!]\n"); + /* Enable interrupts */ + task_enable_irq(KB_SCAN_ROW_IRQ); + while (1) { wait_for_interrupt(); task_wait_msg(-1); diff --git a/chip/lm4/uart.c b/chip/lm4/uart.c index e3201056fe..fa9ddb005f 100644 --- a/chip/lm4/uart.c +++ b/chip/lm4/uart.c @@ -99,8 +99,7 @@ static void uart_1_interrupt(void) /* Clear transmit and receive interrupt status */ LM4_UART_ICR(1) = 0x70; - /* TODO: (crosbug.com/p/7488) handle input */ - +#ifdef CONFIG_LPC /* If we have space in our FIFO and a character is pending in LPC, * handle that character. */ if (!(LM4_UART_FR(1) & 0x20) && lpc_comx_has_char()) { @@ -115,6 +114,7 @@ static void uart_1_interrupt(void) * on the UART receive-side either. */ if (!(LM4_UART_FR(1) & 0x10)) lpc_comx_put_char(LM4_UART_DR(1)); +#endif } /* Must be same prio as LPC interrupt handler so they don't preempt */ DECLARE_IRQ(LM4_IRQ_UART1, uart_1_interrupt, 2); diff --git a/chip/stm32l/build.mk b/chip/stm32l/build.mk index 884528b52d..6d46ed91f6 100644 --- a/chip/stm32l/build.mk +++ b/chip/stm32l/build.mk @@ -8,7 +8,6 @@ # STM32L15xx SoC family has a Cortex-M3 ARM core CORE:=cortex-m -chip-y=uart.o clock.o hwtimer.o system.o gpio.o -chip-y+=jtag.o stubs.o +chip-y=clock.o gpio.o hwtimer.o jtag.o system.o uart.o chip-$(CONFIG_TASK_WATCHDOG)+=watchdog.o chip-$(CONFIG_TASK_KEYSCAN)+=keyboard_scan.o diff --git a/chip/stm32l/gpio.c b/chip/stm32l/gpio.c index cfcb66212a..a5734ccb58 100644 --- a/chip/stm32l/gpio.c +++ b/chip/stm32l/gpio.c @@ -61,6 +61,12 @@ int gpio_pre_init(void) /* Interrupt is enabled by gpio_enable_interrupt() */ } + return EC_SUCCESS; +} + + +int gpio_init(void) +{ /* Enable IRQs now that pins are set up */ task_enable_irq(STM32L_IRQ_EXTI0); task_enable_irq(STM32L_IRQ_EXTI1); diff --git a/chip/stm32l/keyboard_scan.c b/chip/stm32l/keyboard_scan.c index b9a6f1b927..108de81ec8 100644 --- a/chip/stm32l/keyboard_scan.c +++ b/chip/stm32l/keyboard_scan.c @@ -51,6 +51,9 @@ * KB_COL05:06 = PC14:15 * KB_COL07 = PD2 * Other: + * + * TODO: clean up the nomenclature above; it's weird that KB_ROW00 is a column + * and KB_COL00 is a row... */ extern struct gpio_info gpio_list[]; @@ -204,6 +207,7 @@ static void select_column(int col) } } + int keyboard_scan_init(void) { int i, j; @@ -287,15 +291,6 @@ int keyboard_scan_init(void) * key mask properly */ actual_key_mask = actual_key_masks[0]; - gpio_enable_interrupt(KB_COL00); - gpio_enable_interrupt(KB_COL01); - gpio_enable_interrupt(KB_COL02); - gpio_enable_interrupt(KB_COL03); - gpio_enable_interrupt(KB_COL04); - gpio_enable_interrupt(KB_COL05); - gpio_enable_interrupt(KB_COL06); - gpio_enable_interrupt(KB_COL07); - return EC_SUCCESS; } @@ -418,7 +413,15 @@ void keyboard_scan_task(void) { int key_press_timer = 0; - keyboard_scan_init(); + /* Enable interrupts for keyboard rows */ + gpio_enable_interrupt(KB_COL00); + gpio_enable_interrupt(KB_COL01); + gpio_enable_interrupt(KB_COL02); + gpio_enable_interrupt(KB_COL03); + gpio_enable_interrupt(KB_COL04); + gpio_enable_interrupt(KB_COL05); + gpio_enable_interrupt(KB_COL06); + gpio_enable_interrupt(KB_COL07); while (1) { wait_for_interrupt(); diff --git a/chip/stm32l/stubs.c b/chip/stm32l/stubs.c deleted file mode 100644 index cf585c8012..0000000000 --- a/chip/stm32l/stubs.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ -/* Stubs for non implemented drivers */ - -#include "common.h" - -/** - * TODO: implement - */ -int eeprom_init(void) -{ - return EC_SUCCESS; -} - -int i2c_init(void) -{ - return EC_SUCCESS; -} - -int power_button_init(void) -{ - return EC_SUCCESS; -} - -int adc_init(void) -{ - return EC_SUCCESS; -} diff --git a/common/build.mk b/common/build.mk index fab876b4fb..5b9308116d 100644 --- a/common/build.mk +++ b/common/build.mk @@ -5,15 +5,19 @@ # Common files build # -common-y=main.o util.o console.o vboot.o uart_buffering.o usb_charge_commands.o -common-y+=memory_commands.o shared_mem.o system.o usb_charge.o +common-y=main.o util.o console.o vboot.o uart_buffering.o +common-y+=memory_commands.o shared_mem.o system_common.o common-y+=gpio_commands.o version.o +common-$(CONFIG_BATTERY_ATL706486)+=battery_atl706486.o +common-$(CONFIG_CHARGER_BQ24725)+=charger_bq24725.o common-$(CONFIG_FLASH)+=flash_commands.o common-$(CONFIG_LIGHTBAR)+=leds.o common-$(CONFIG_LPC)+=port80.o host_event_commands.o common-$(CONFIG_POWER_LED)+=power_led.o common-$(CONFIG_PSTORE)+=pstore_commands.o common-$(CONFIG_PWM)+=pwm_commands.o +common-$(CONFIG_SMART_BATTERY)+=smart_battery.o charge_state.o \ + battery_commands.o common-$(CONFIG_TASK_GAIAPOWER)+=gaia_power.o common-$(CONFIG_TASK_HOSTCMD)+=host_command.o common-$(CONFIG_TASK_I8042CMD)+=i8042.o keyboard.o @@ -21,9 +25,4 @@ common-$(CONFIG_TASK_TEMPSENSOR)+=temp_sensor.o temp_sensor_commands.o common-$(CONFIG_TASK_THERMAL)+=thermal.o thermal_commands.o common-$(CONFIG_TASK_X86POWER)+=x86_power.o common-$(CONFIG_TMP006)+=tmp006.o - -# Board driver modules -common-$(CONFIG_BATTERY_ATL706486)+=battery_atl706486.o -common-$(CONFIG_CHARGER_BQ24725)+=charger_bq24725.o -common-$(CONFIG_SMART_BATTERY)+=smart_battery.o charge_state.o \ - battery_commands.o +common-$(CONFIG_USB_CHARGE)+=usb_charge.o usb_charge_commands.o diff --git a/common/main.c b/common/main.c index be9653cfb6..7af2959317 100644 --- a/common/main.c +++ b/common/main.c @@ -38,44 +38,72 @@ int main(void) { - /* Configure the pin multiplexers */ + /* Pre-initialization (pre-verified boot) stage. Initialization at + * this level should do as little as possible, because verified boot + * may need to jump to another image, which will repeat this + * initialization. In particular, modules should NOT enable + * interrupts.*/ + + /* Configure the pin multiplexers and GPIOs */ configure_board(); jtag_pre_init(); + gpio_pre_init(); + +#ifdef CONFIG_FLASH + flash_pre_init(); +#endif + + /* Verified boot pre-init. This write-protects flash if necessary. + * Flash and GPIOs must be initialized first. */ + vboot_pre_init(); /* Initialize the system module. This enables the hibernate clock * source we need to calibrate the internal oscillator. */ system_pre_init(); - /* Set the CPU clocks / PLLs and timer */ + /* Set the CPU clocks / PLLs. System is now running at full speed. */ clock_init(); - timer_init(); - /* The timer used by get_time() is now started, so everything after - * this can be benchmarked. */ - - /* Do system, gpio, and vboot pre-initialization so we can jump to - * another image if necessary. This must be done as early as - * possible, so that the minimum number of components get - * re-initialized if we jump to another image. */ - gpio_pre_init(); - vboot_pre_init(); + /* Initialize interrupts, but don't enable any of them. Note that + * task scheduling is not enabled until task_start() below. */ task_init(); + /* Main initialization stage. Modules may enable interrupts here. */ + + /* Initialize UART. uart_printf(), etc. may now be used. */ + uart_init(); + #ifdef CONFIG_TASK_WATCHDOG + /* Intialize watchdog timer. All lengthy operations between now and + * task_start() must periodically call watchdog_reload() to avoid + * triggering a watchdog reboot. (This pretty much applies only to + * verified boot, because all *other* lengthy operations should be done + * by tasks.) */ watchdog_init(1100); #endif - uart_init(); - system_init(); + + /* Initialize timer. Everything after this can be benchmarked. + * get_time() and udelay() may now be used. usleep() requires task + * scheduling, so cannot be used yet. */ + timer_init(); + + /* Verified boot needs to read the initial keyboard state and EEPROM + * contents. */ #ifdef CONFIG_TASK_KEYSCAN keyboard_scan_init(); #endif -#ifdef CONFIG_FLASH - flash_init(); -#endif +#ifdef CONFIG_EEPROM eeprom_init(); +#endif + /* Verified boot initialization. This may jump to another image, which + * will need to reconfigure / reinitialize the system, so as little as + * possible should be done above this step. */ vboot_init(); + system_init(); + gpio_init(); + #ifdef CONFIG_LPC port_80_init(); lpc_init(); @@ -84,7 +112,9 @@ int main(void) #ifdef CONFIG_PWM pwm_init(); #endif +#ifdef CONFIG_I2C i2c_init(); +#endif #ifdef CONFIG_TASK_TEMPSENSOR temp_sensor_init(); chip_temp_sensor_init(); @@ -92,18 +122,21 @@ int main(void) #ifdef CONFIG_TASK_POWERBTN power_button_init(); #endif +#ifdef CONFIG_ADC adc_init(); - usb_charge_init(); +#endif #ifdef CONFIG_ONEWIRE onewire_init(); #endif #ifdef CONFIG_CHARGER charger_init(); #endif - #ifdef CONFIG_PECI peci_init(); #endif +#ifdef CONFIG_USB_CHARGE + usb_charge_init(); +#endif /* Print the init time and reset cause. Init time isn't completely * accurate because it can't take into account the time for the first diff --git a/common/system.c b/common/system_common.c index abcd2c69f1..e52cac05b6 100644 --- a/common/system.c +++ b/common/system_common.c @@ -230,7 +230,7 @@ static enum lpc_status host_command_get_version(uint8_t *data) strzcpy(r->version_string_rw_b, system_get_version(SYSTEM_IMAGE_RW_B), sizeof(r->version_string_rw_b)); - switch(system_get_image_copy()) { + switch (system_get_image_copy()) { case SYSTEM_IMAGE_RO: r->current_image = EC_LPC_IMAGE_RO; break; diff --git a/common/usb_charge.c b/common/usb_charge.c index 28c98e4130..883bae5039 100644 --- a/common/usb_charge.c +++ b/common/usb_charge.c @@ -14,7 +14,6 @@ static void usb_charge_set_control_mode(int port_id, int mode) { -#ifdef BOARD_link if (port_id == 0) { gpio_set_level(GPIO_USB1_CTL1, (mode & 0x4) >> 2); gpio_set_level(GPIO_USB1_CTL2, (mode & 0x2) >> 1); @@ -25,32 +24,26 @@ static void usb_charge_set_control_mode(int port_id, int mode) gpio_set_level(GPIO_USB2_CTL2, (mode & 0x2) >> 1); gpio_set_level(GPIO_USB2_CTL3, mode & 0x1); } -#endif } static void usb_charge_set_enabled(int port_id, int en) { -#ifdef BOARD_link if (port_id == 0) gpio_set_level(GPIO_USB1_ENABLE, en); else gpio_set_level(GPIO_USB2_ENABLE, en); -#endif } static void usb_charge_set_ilim(int port_id, int sel) { -#ifdef BOARD_link if (port_id == 0) gpio_set_level(GPIO_USB1_ILIM_SEL, sel); else gpio_set_level(GPIO_USB2_ILIM_SEL, sel); -#endif } int usb_charge_set_mode(int port_id, enum usb_charge_mode mode) { - if (port_id >= USB_CHARGE_PORT_COUNT) return EC_ERROR_INVAL; diff --git a/include/flash.h b/include/flash.h index 8b965d0147..551068b2a9 100644 --- a/include/flash.h +++ b/include/flash.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. +/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ @@ -19,7 +19,7 @@ /* Initializes the module. */ -int flash_init(void); +int flash_pre_init(void); /* Returns the usable size of flash in bytes. Note that this is * smaller than the actual flash size, */ |