From 449716c4775236ac2eb5287d488012d9e68856b6 Mon Sep 17 00:00:00 2001 From: Bogdan Marinescu Date: Sat, 14 Jul 2012 16:46:31 +0300 Subject: [PATCH] LPC288x platform conversion + other changes - LPC288x platform converted to the new build system - changed generation for the 'extmem' attribute - added combined attributes (validated against two or more possible types) --- boards/known/lpc-h2888.lua | 20 ++++++ config/attributes.lua | 16 ++++- config/configurations.lua | 18 ++--- src/platform/lpc288x/cpu_lpc2888.h | 37 ++++++++++ src/platform/lpc288x/platform_conf.h | 94 ------------------------- src/platform/lpc288x/platform_generic.h | 9 +++ 6 files changed, 88 insertions(+), 106 deletions(-) create mode 100644 boards/known/lpc-h2888.lua create mode 100644 src/platform/lpc288x/cpu_lpc2888.h delete mode 100644 src/platform/lpc288x/platform_conf.h create mode 100644 src/platform/lpc288x/platform_generic.h diff --git a/boards/known/lpc-h2888.lua b/boards/known/lpc-h2888.lua new file mode 100644 index 00000000..a4ad625f --- /dev/null +++ b/boards/known/lpc-h2888.lua @@ -0,0 +1,20 @@ +-- LPC-H2888 build configuration + +return { + cpu = 'lpc2888', + components = { + sercon = { uart = 0, speed = 115200, timer = 0 }, + romfs = true, + shell = true, + term = { lines = 25, cols = 80 }, + xmodem = true, + rpc = { uart = 0, speed = 115200 } + }, + config = { + extmem = { start = { "SDRAM_BASE_ADDR" }, size = { "SDRAM_SIZE" } } + }, + modules = { + generic = { 'pio', 'tmr', 'pd', 'uart', 'term', 'pack', 'bit', 'elua', 'cpu', 'rpc', 'math' } + } +} + diff --git a/config/attributes.lua b/config/attributes.lua index 3b6c2700..dddd22ff 100644 --- a/config/attributes.lua +++ b/config/attributes.lua @@ -58,7 +58,6 @@ end -- Return the string if OK, (false, errmsg) for error -- Needs: attrmaxsize - maximum size of the string local function _validate_string( adesc, aname, aval, elname, sectname ) - aval = tostring( aval ) if type( aval ) ~= "string" then return false, sf( "value of attribute '%s' for element '%s' in section '%s' must be a string", aname, elname, sectname ) end @@ -113,6 +112,16 @@ local validate_log2 = build_validator( _validate_log2 ) local validate_string = build_validator( _validate_string ) local validate_ip = build_validator( _validate_ip ) +-- Composite validator: run each validator in turn +local function composite_validator( adesc, aname, aval, elname, sectname ) + for _, onedesc in pairs( adesc.attrs ) do + onedesc.is_array = adesc.is_array + local res, err = onedesc.validator( onedesc, aname, aval, elname, sectname ) + if res then return res end + end + return false, sf( "Invalid value '%s' for attribute '%s' of element '%s' in section '%s'", tostring( aval ), aname, elname, sectname ) +end + ------------------------------------------------------------------------------- -- Public interface @@ -167,6 +176,11 @@ function ip_attr( macro, default ) return { macro = macro, default = default, validator = validate_ip, is_ip = true } end +-- Returns a new combined attribute +function combine_attr( macro, attrs ) + return { macro = macro, validator = composite_validator, attrs = attrs } +end + -- Make the given attribute optional function make_optional( attr ) attr.optional = true diff --git a/config/configurations.lua b/config/configurations.lua index 711cd6b9..9d541e1f 100644 --- a/config/configurations.lua +++ b/config/configurations.lua @@ -72,18 +72,14 @@ local function mem_generator( desc, vals, generated ) generated.MEM_END_ADDRESS = true return gstr end + local function fmtval( s ) return tonumber( s ) and tostring( s ) .. "UL" or ( "( u32 )( " .. s .. " )" ) end local startvals = vals.MEM_START_ADDRESS.value local sizevals = vals.MEM_END_ADDRESS.value - table.insert( startvals, 1, "INTERNAL_RAM_FIRST_FREE" ) - table.insert( sizevals, 1, "INTERNAL_RAM_LAST_FREE" ) - -- Transform the data in 'sizevals' to 'last address' (the format accepted by eLua) + table.insert( startvals, 1, "( u32 )( INTERNAL_RAM_FIRST_FREE )" ) + table.insert( sizevals, 1, "( u32 )( INTERNAL_RAM_LAST_FREE )" ) for i = 2, #sizevals do - sizevals[ i ] = tonumber( startvals[ i ] ) + tonumber( sizevals[ i ] ) - 1 - end - -- Prefix all the values in the 'start' and 'size' arrays with 'u32' - for i = 1, #sizevals do - startvals[ i ] = "( u32 )( " .. tostring( startvals[ i ] ) .. ( i > 1 and "u" or "" ) .. " )" - sizevals[ i ] = "( u32 )( " .. tostring( sizevals[ i ] ) .. ( i > 1 and "u" or "" ) .. " )" + sizevals[ i ] = sf( "( %s + %s - 1 )", fmtval( startvals[ i ] ), fmtval( sizevals[ i ] ) ) + startvals[ i ] = sf( "( %s )", fmtval( startvals[ i ] ) ) end local gstr = gen.simple_gen( "MEM_START_ADDRESS", vals, generated ) gstr = gstr .. gen.simple_gen( "MEM_END_ADDRESS", vals, generated ) @@ -148,8 +144,8 @@ function init() gen = mem_generator, confcheck = mem_checker, attrs = { - start = at.array_of( at.int_attr( 'MEM_START_ADDRESS' ) ), - size = at.array_of( at.int_attr( 'MEM_END_ADDRESS', 1 ) ) + start = at.array_of( at.combine_attr( 'MEM_START_ADDRESS', { at.int_attr( '' ), at.string_attr( '' ) } ) ), + size = at.array_of( at.combine_attr( 'MEM_END_ADDRESS', { at.int_attr( '', 1 ), at.string_attr( '' ) } ) ), }, required = {} } diff --git a/src/platform/lpc288x/cpu_lpc2888.h b/src/platform/lpc288x/cpu_lpc2888.h new file mode 100644 index 00000000..b5d0ff21 --- /dev/null +++ b/src/platform/lpc288x/cpu_lpc2888.h @@ -0,0 +1,37 @@ +// LPC2888 CPU definition + +#ifndef __CPU_LPC2888_H__ +#define __CPU_LPC2888_H__ + +#include "stacks.h" +#include "target.h" + +// Number of resources (0 if not available/not implemented) +#define NUM_PIO 8 +#define NUM_SPI 0 +#define NUM_UART 1 +#define NUM_TIMER 2 +#define NUM_PWM 0 +#define NUM_ADC 0 +#define NUM_CAN 0 + +// CPU frequency (needed by the CPU module and MMCFS code, 0 if not used) +#define CPU_FREQUENCY Fcclk + +// PIO prefix ('0' for P0, P1, ... or 'A' for PA, PB, ...) +#define PIO_PREFIX '0' +// Pins per port configuration: +// #define PIO_PINS_PER_PORT (n) if each port has the same number of pins, or +// #define PIO_PIN_ARRAY { n1, n2, ... } to define pins per port in an array +// Use #define PIO_PINS_PER_PORT 0 if this isn't needed +#define PIO_PIN_ARRAY { 32, 20, 4, 6, 12, 6, 4, 1 } + +// Allocator data: define your free memory zones here in two arrays +// (start address and end address) +#define SRAM_ORIGIN 0x00400000 +#define SRAM_SIZE 0x10000 +#define INTERNAL_RAM_FIRST_FREE end +#define INTERNAL_RAM_LAST_FREE ( SRAM_ORIGIN + SRAM_SIZE - STACK_SIZE_TOTAL - 1 ) + +#endif // #ifndef __CPU_LPC2888_H__ + diff --git a/src/platform/lpc288x/platform_conf.h b/src/platform/lpc288x/platform_conf.h deleted file mode 100644 index 7d46479c..00000000 --- a/src/platform/lpc288x/platform_conf.h +++ /dev/null @@ -1,94 +0,0 @@ -// eLua platform configuration - -#ifndef __PLATFORM_CONF_H__ -#define __PLATFORM_CONF_H__ - -#include "auxmods.h" -#include "stacks.h" -#include "target.h" - -// ***************************************************************************** -// Define here what components you want for this platform - -#define BUILD_XMODEM -#define BUILD_SHELL -#define BUILD_ROMFS -#define BUILD_TERM -#define BUILD_CON_GENERIC -//#define BUILD_RPC - -// ***************************************************************************** -// UART/Timer IDs configuration data (used in main.c) - -#define CON_UART_ID 0 -#define CON_UART_SPEED 115200 -#define CON_TIMER_ID 0 -#define TERM_LINES 25 -#define TERM_COLS 80 - -#define PLATFORM_TMR_COUNTS_DOWN - -// ***************************************************************************** -// Configuration data - -// Virtual timers (0 if not used) -#define VTMR_NUM_TIMERS 0 - -// Number of resources (0 if not available/not implemented) -#define NUM_PIO 8 -#define NUM_SPI 0 -#define NUM_UART 1 -#define NUM_TIMER 2 -#define NUM_PWM 0 -#define NUM_ADC 0 -#define NUM_CAN 0 - -// RPC boot options -#define RPC_UART_ID CON_UART_ID -#define RPC_TIMER_ID CON_TIMER_ID -#define RPC_UART_SPEED CON_UART_SPEED - -// CPU frequency (needed by the CPU module and MMCFS code, 0 if not used) -#define CPU_FREQUENCY Fcclk - -// PIO prefix ('0' for P0, P1, ... or 'A' for PA, PB, ...) -#define PIO_PREFIX '0' -// Pins per port configuration: -// #define PIO_PINS_PER_PORT (n) if each port has the same number of pins, or -// #define PIO_PIN_ARRAY { n1, n2, ... } to define pins per port in an array -// Use #define PIO_PINS_PER_PORT 0 if this isn't needed -#define PIO_PIN_ARRAY { 32, 20, 4, 6, 12, 6, 4, 1 } - -// Allocator data: define your free memory zones here in two arrays -// (start address and end address) -#define SRAM_ORIGIN 0x00400000 -#define SRAM_SIZE 0x10000 -#define MEM_START_ADDRESS { ( void* )end, ( void* )SDRAM_BASE_ADDR } -#define MEM_END_ADDRESS { ( void* )( SRAM_ORIGIN + SRAM_SIZE - STACK_SIZE_TOTAL - 1 ), ( void* )( SDRAM_BASE_ADDR + SDRAM_SIZE - 1 ) } - -// ***************************************************************************** -// Auxiliary libraries that will be compiled for this platform - -#if defined( ELUA_BOOT_RPC ) && !defined( BUILD_RPC ) -#define BUILD_RPC -#endif - -#if defined( BUILD_RPC ) -#define RPCLINE _ROM( AUXLIB_RPC, luaopen_rpc, rpc_map ) -#else -#define RPCLINE -#endif - -#define LUA_PLATFORM_LIBS_ROM\ - _ROM( AUXLIB_PIO, luaopen_pio, pio_map )\ - _ROM( AUXLIB_TMR, luaopen_tmr, tmr_map )\ - _ROM( AUXLIB_PD, luaopen_pd, pd_map )\ - _ROM( AUXLIB_UART, luaopen_uart, uart_map )\ - _ROM( AUXLIB_TERM, luaopen_term, term_map )\ - _ROM( AUXLIB_PACK, luaopen_pack, pack_map )\ - _ROM( AUXLIB_BIT, luaopen_bit, bit_map )\ - _ROM( AUXLIB_ELUA, luaopen_elua, elua_map )\ - RPCLINE\ - _ROM( LUA_MATHLIBNAME, luaopen_math, math_map ) - -#endif // #ifndef __PLATFORM_CONF_H__ diff --git a/src/platform/lpc288x/platform_generic.h b/src/platform/lpc288x/platform_generic.h new file mode 100644 index 00000000..ca9c412b --- /dev/null +++ b/src/platform/lpc288x/platform_generic.h @@ -0,0 +1,9 @@ +// Platform customization header + +#ifndef __PLATFORM_GENERIC_H__ +#define __PLATFORM_GENERIC_H__ + +#define PLATFORM_TMR_COUNTS_DOWN + +#endif // #ifndef __PLATFORM_GENERIC_H__ +