From 2dff75274013b12b7edf0574aec401a2e64782be Mon Sep 17 00:00:00 2001 From: Bogdan Marinescu Date: Tue, 13 Aug 2013 23:59:32 +0300 Subject: [PATCH] Added stm32.pio platform specific module Also removed the platform specific initialization code, this is now automatic. --- boards/known/stm32-p407.lua | 1 + config/modules.lua | 2 +- src/platform/stm32f4/build_config.lua | 2 + src/platform/stm32f4/conf.lua | 2 +- src/platform/stm32f4/cpu.c | 2 - src/platform/stm32f4/platform.c | 45 +---- src/platform/stm32f4/platform_conf.h.old | 212 ----------------------- src/platform/stm32f4/stm32_pio.c | 88 ++++++++++ 8 files changed, 94 insertions(+), 260 deletions(-) delete mode 100644 src/platform/stm32f4/platform_conf.h.old create mode 100644 src/platform/stm32f4/stm32_pio.c diff --git a/boards/known/stm32-p407.lua b/boards/known/stm32-p407.lua index 292ef60b..dcb96bbc 100644 --- a/boards/known/stm32-p407.lua +++ b/boards/known/stm32-p407.lua @@ -24,6 +24,7 @@ return { modules = { generic = { 'all', "-i2c", "-net" }, platform = 'all', + platform_name = 'stm32' }, } diff --git a/config/modules.lua b/config/modules.lua index 1df23f92..94b31fd2 100644 --- a/config/modules.lua +++ b/config/modules.lua @@ -199,7 +199,7 @@ function gen_module_list( desc, plconf, platform, boardname ) local pltabname = mdesc.platform_name or platform for m, _ in pairs( gen_list_platform ) do nguards = nguards + #( platform_modules[ m ].guards or {} ) end if nguards == 0 then -- nothing to guard - gstr = gstr .. gen.print_define( "PLATFORM_MODULES_LINE", sf( '_ROM( "%s", luaopen_platform, platform_map )', platform ) ) + gstr = gstr .. gen.print_define( "PLATFORM_MODULES_LINE", sf( '_ROM( "%s", luaopen_platform, platform_map )', pltabname ) ) gstr = gstr .. gen.print_define( "PS_LIB_TABLE_NAME", sf( '"%s"', pltabname ) ) gstr = gstr .. gen.print_define( "PLATFORM_MODULES_ENABLE" ) else diff --git a/src/platform/stm32f4/build_config.lua b/src/platform/stm32f4/build_config.lua index cde3c58d..3654a8dc 100644 --- a/src/platform/stm32f4/build_config.lua +++ b/src/platform/stm32f4/build_config.lua @@ -25,5 +25,7 @@ end -- Return an array of all the available platform modules for the given cpu function get_platform_modules( board, cpu ) + return { pio = { lib = '"pio"', map = "stm32_pio_map", open = false }, + cpu = { lib = '"cpu"', map = "stm32_cpu_map", open = "luaopen_stm32_cpu" } } end diff --git a/src/platform/stm32f4/conf.lua b/src/platform/stm32f4/conf.lua index e84c26e1..7589646a 100644 --- a/src/platform/stm32f4/conf.lua +++ b/src/platform/stm32f4/conf.lua @@ -9,7 +9,7 @@ addi( sf( 'src/platform/%s/FWLib/USB/VCP/inc', platform ) ) local fwlib_files = utils.get_files( "src/platform/" .. platform .. "/FWLib/library/src", ".*%.c$" ) fwlib_files = fwlib_files .. " " .. utils.get_files( "src/platform/" .. platform .. "/FWLib/USB/", "%.c$" ) -specific_files = "system_stm32f4xx.c startup_stm32f4xx.s stm32f4xx_it.c platform.c platform_int.c cpu.c" +specific_files = "system_stm32f4xx.c startup_stm32f4xx.s stm32f4xx_it.c platform.c platform_int.c cpu.c stm32_pio.c" local ldscript = "stm32.ld" -- Prepend with path diff --git a/src/platform/stm32f4/cpu.c b/src/platform/stm32f4/cpu.c index 5ccba948..d721fc33 100644 --- a/src/platform/stm32f4/cpu.c +++ b/src/platform/stm32f4/cpu.c @@ -11,8 +11,6 @@ #include "auxmods.h" #include "cpu.h" - - //Lua: reset() static int cpu_reset( lua_State *L ) { diff --git a/src/platform/stm32f4/platform.c b/src/platform/stm32f4/platform.c index dfd73bd3..9527dbf7 100644 --- a/src/platform/stm32f4/platform.c +++ b/src/platform/stm32f4/platform.c @@ -193,7 +193,7 @@ static void NVIC_Configuration(void) // PIO // This is pretty much common code to all STM32 devices. // todo: Needs updates to support different processor lines. -static GPIO_TypeDef * const pio_port[] = { GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH, GPIOI }; +GPIO_TypeDef * const pio_port[] = { GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH, GPIOI }; static const u32 pio_port_clk[] = { RCC_AHB1Periph_GPIOA , RCC_AHB1Periph_GPIOB , RCC_AHB1Periph_GPIOC , RCC_AHB1Periph_GPIOD , RCC_AHB1Periph_GPIOE , RCC_AHB1Periph_GPIOF , RCC_AHB1Periph_GPIOG , RCC_AHB1Periph_GPIOH @@ -1642,46 +1642,3 @@ int platform_flash_erase_sector( u32 sector_id ) #endif // #ifdef BUILD_WOFS - -// **************************************************************************** -// Platform specific modules go here - -#ifdef ENABLE_STM32_CPU - -#define MIN_OPT_LEVEL 2 -#include "lrodefs.h" -extern const LUA_REG_TYPE stm32_cpu_map[]; - -const LUA_REG_TYPE platform_map[] = -{ -#if LUA_OPTIMIZE_MEMORY > 0 - { LSTRKEY( "cpu" ), LROVAL( stm32_cpu_map ) }, -#endif - { LNILKEY, LNILVAL } -}; - -LUALIB_API int luaopen_platform( lua_State *L ) -{ -#if LUA_OPTIMIZE_MEMORY > 0 - return 0; -#else // #if LUA_OPTIMIZE_MEMORY > 0 - luaL_register( L, PS_LIB_TABLE_NAME, platform_map ); - - // Setup the new tables inside platform table - lua_newtable( L ); - luaL_register( L, NULL, stm32_cpu_map ); - lua_setfield( L, -2, "cpu" ); - - return 1; -#endif // #if LUA_OPTIMIZE_MEMORY > 0 -} - -#else // #ifdef ENABLE_ENC - -LUALIB_API int luaopen_platform( lua_State *L ) -{ - return 0; -} - -#endif // #ifdef ENABLE_ENC - diff --git a/src/platform/stm32f4/platform_conf.h.old b/src/platform/stm32f4/platform_conf.h.old deleted file mode 100644 index 973b4414..00000000 --- a/src/platform/stm32f4/platform_conf.h.old +++ /dev/null @@ -1,212 +0,0 @@ -// eLua platform configuration - -#ifndef __PLATFORM_CONF_H__ -#define __PLATFORM_CONF_H__ - -#include "auxmods.h" -#include "type.h" -#include "stacks.h" -#include "stm32f4xx_conf.h" -#include "elua_int.h" -#include "sermux.h" - -// ***************************************************************************** -// Define here what components you want for this platform - -#define BUILD_XMODEM -#define BUILD_SHELL -#define BUILD_ROMFS -//#define BUILD_MMCFS -#define BUILD_TERM -//#define BUILD_UIP -//#define BUILD_DHCPC -//#define BUILD_DNS -#define BUILD_CON_GENERIC -#define BUILD_ADC -#define BUILD_RPC -//#define BUILD_RFS -//#define BUILD_CON_TCP -#define BUILD_LINENOISE -#define BUILD_C_INT_HANDLERS -#define BUILD_LUA_INT_HANDLERS -//#define ENABLE_ENC -#define ENABLE_STM32_CPU - -#define PLATFORM_HAS_SYSTIMER - -//#define ENABLE_TRACE // Enable the ETM TRACE interface (TRACECLK, TRACE D0-3) -#define ENABLE_JTAG_SWD // Do NOT remove this unless you really not need JTAG/SWD - -// ***************************************************************************** -// UART/Timer IDs configuration data (used in main.c) - -#define CON_UART_ID 0 -#define CON_UART_SPEED 115200 -#define TERM_LINES 25 -#define TERM_COLS 80 - -// ***************************************************************************** -// Auxiliary libraries that will be compiled for this platform - -//#ifdef FORSTM3210E_EVAL -//#define AUXLIB_LCD "stm3210lcd" -//LUALIB_API int ( luaopen_lcd )( lua_State* L ); -//#define LCDLINE _ROM( AUXLIB_LCD, luaopen_lcd, lcd_map ) -//#else -#define LCDLINE -//#endif - -#ifdef ENABLE_STM32_CPU -#define PS_LIB_TABLE_NAME "stm32" -#endif - - -#ifdef BUILD_ADC -#define ADCLINE _ROM( AUXLIB_ADC, luaopen_adc, adc_map ) -#else -#define ADCLINE -#endif - -#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 - -#ifdef PS_LIB_TABLE_NAME -#define PLATLINE _ROM( PS_LIB_TABLE_NAME, luaopen_platform, platform_map ) -#else -#define PLATLINE -#endif - -#define LUA_PLATFORM_LIBS_ROM\ - _ROM( AUXLIB_PIO, luaopen_pio, pio_map )\ - _ROM( AUXLIB_SPI, luaopen_spi, spi_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_CPU, luaopen_cpu, cpu_map )\ - _ROM( AUXLIB_ELUA, luaopen_elua, elua_map )\ - _ROM( AUXLIB_TMR, luaopen_tmr, tmr_map )\ - ADCLINE\ - _ROM( AUXLIB_CAN, luaopen_can, can_map )\ - _ROM( AUXLIB_PWM, luaopen_pwm, pwm_map )\ - RPCLINE\ - LCDLINE\ - _ROM( AUXLIB_ELUA, luaopen_elua, elua_map )\ - _ROM( LUA_MATHLIBNAME, luaopen_math, math_map )\ - PLATLINE - -// ***************************************************************************** -// Configuration data - -#define EGC_INITIAL_MODE 1 - -// Virtual timers (0 if not used) -#define VTMR_NUM_TIMERS 4 -#define VTMR_FREQ_HZ 10 - -// Number of resources (0 if not available/not implemented) -#define NUM_PIO 5 -#define NUM_SPI 3 -#define NUM_UART 6 -#define NUM_TIMER 12 -#define NUM_PHYS_TIMER 12 -#define NUM_PWM 4 -#define NUM_ADC 16 -#define NUM_CAN 1 - -// Enable RX buffering on UART -//#define BUF_ENABLE_UART -//#define CON_BUF_SIZE BUF_SIZE_128 - -// ADC Configuration Params -#define ADC_BIT_RESOLUTION 12 -#define BUF_ENABLE_ADC -#define ADC_BUF_SIZE BUF_SIZE_2 - -// These should be adjusted to support multiple ADC devices -#define ADC_TIMER_FIRST_ID 0 -#define ADC_NUM_TIMERS 4 - -// RPC boot options -#define RPC_UART_ID CON_UART_ID -#define RPC_UART_SPEED CON_UART_SPEED - -// MMCFS Support (FatFs on SD/MMC) -// For STM32F407VGT6 - PA5 = CLK, PA6 = MISO, PA7 = MOSI, PA4 = CS -#define MMCFS_TICK_HZ 10 -#define MMCFS_TICK_MS ( 1000 / MMCFS_TICK_HZ ) -#define MMCFS_CS_PORT 1 -#define MMCFS_CS_PIN 11 -#define MMCFS_SPI_NUM 1 - -// CPU frequency (needed by the CPU module, 0 if not used) -u32 platform_s_cpu_get_frequency(); -#define CPU_FREQUENCY platform_s_cpu_get_frequency() - -// PIO prefix ('0' for P0, P1, ... or 'A' for PA, PB, ...) -#define PIO_PREFIX 'A' -// 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_PINS_PER_PORT 16 - -// Remote file system data -#define RFS_BUFFER_SIZE BUF_SIZE_512 -#define RFS_UART_ID 0 -#define RFS_TIMEOUT 100000 -#define RFS_UART_SPEED 115200 - -// Linenoise buffer sizes -#define LINENOISE_HISTORY_SIZE_LUA 50 -#define LINENOISE_HISTORY_SIZE_SHELL 10 - -// Allocator data: define your free memory zones here in two arrays -// (start address and end address) -// The F4 has 196K in total, but it is split into 3 sections: -// SRAM (xrw) : ORIGIN = 0x20000000, SIZE = 128K // Major SRAM -// CCMDATARAM (xrw) : ORIGIN = 0x10000000, SIZE = 64K // Core Coupled Data SRAM -// BKPSRAM, SIZE = 4K // Backup SRAM -// -#define CCMDATARAM_SIZE ( 64 * 1024 ) -#define SRAM_SIZE ( 128 * 1024 ) -#define MEM_START_ADDRESS { ( void* )end, (void* )( CCMDATARAM_BASE ) } -#define MEM_END_ADDRESS { ( void* )( SRAM_BASE + SRAM_SIZE - STACK_SIZE_TOTAL - 1 ), (void*)( CCMDATARAM_BASE + CCMDATARAM_SIZE - 1 ) } - -// Flash data (only for ELUA_CPU_STM32F407VG for now) -#ifdef ELUA_CPU_STM32F407VG -#define INTERNAL_FLASH_SIZE ( 1024 * 1024 ) -#define INTERNAL_FLASH_SECTOR_ARRAY { 16384, 16384, 16384, 16384, 65536, 131072, 131072, 131072, 131072, 131072, 131072, 131072 } -#define INTERNAL_FLASH_START_ADDRESS 0x08000000 -#define BUILD_WOFS -#endif // #ifdef ELUA_CPU_STM32F407VG - -// Interrupt queue size -#define PLATFORM_INT_QUEUE_LOG_SIZE 5 - -// Interrupt list -#define INT_GPIO_POSEDGE ELUA_INT_FIRST_ID -#define INT_GPIO_NEGEDGE ( ELUA_INT_FIRST_ID + 1 ) -#define INT_TMR_MATCH ( ELUA_INT_FIRST_ID + 2 ) -#define INT_UART_RX ( ELUA_INT_FIRST_ID + 3 ) -#define INT_ELUA_LAST INT_UART_RX - -#define PLATFORM_CPU_CONSTANTS\ - _C( INT_GPIO_POSEDGE ), \ - _C( INT_GPIO_NEGEDGE ), \ - _C( INT_TMR_MATCH ), \ - _C( INT_UART_RX ) - -// Conver from GPIO_PinSourceXX to GPIO_Pin_XX -#define GPIO_SOURCE2PIN(n) (1 << (n)) - -#endif // #ifndef __PLATFORM_CONF_H__ - diff --git a/src/platform/stm32f4/stm32_pio.c b/src/platform/stm32f4/stm32_pio.c new file mode 100644 index 00000000..df169226 --- /dev/null +++ b/src/platform/stm32f4/stm32_pio.c @@ -0,0 +1,88 @@ +// STM32 specific PIO support + +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +#include "platform.h" +#include "lrotable.h" +#include "platform_conf.h" +#include "auxmods.h" +#include "stm32f4xx_conf.h" +#include + +#if LUA_OPTIMIZE_MEMORY == 0 +#error stm32.pio can only be compiled with LTR on (optram=true) +#endif + +#define PIN_FUNC_GPIO ( -1 ) +#define PIN_FUNC_ADC ( -2 ) +#define PIN_FUNC_ALT_FIRST 0 +#define PIN_FUNC_ALT_LAST 15 + +extern GPIO_TypeDef * const pio_port[]; + +// Lua: stm32.pio.set_function( function, pin1, pin2, ..., pinn ) +// Function can be stm32.pio.GPIO, stm32.pio.AFx (x = 0..15), stm32.pio.ADC +static int stm32_pio_set_function( lua_State *L ) +{ + int func = luaL_checkinteger( L, 1 ), gpio, pin, port, idx; + int total = lua_gettop( L ), i; + GPIO_TypeDef *base; + + if( total == 1 ) + return luaL_error( L, "no pin specified" ); + for( i = 2; i <= total; i ++ ) + { + gpio = luaL_checkinteger( L, i ); + port = PLATFORM_IO_GET_PORT( gpio ); + pin = PLATFORM_IO_GET_PIN( gpio ); + base = pio_port[ port ]; + if( func == PIN_FUNC_GPIO ) + base->MODER &= ~( 0x03 << ( pin * 2 ) ); + else if( func == PIN_FUNC_ADC ) + base->MODER |= 0x03 << ( pin * 2 ); + else if( func >= PIN_FUNC_ALT_FIRST && func <= PIN_FUNC_ALT_LAST ) + { + base->MODER &= ~( 0x03 << ( pin * 2 ) ); + base->MODER |= 0x02 << ( pin * 2 ); + if( pin >= 8 ) + { + pin -= 8; + idx = 1; + } + else + idx = 0; + base->AFR[ idx ] &= ~( 0x0F << ( pin * 4 ) ); + base->AFR[ idx ] |= func << ( pin * 4 ); + } + } + return 0; +} + +// Module function map +#define MIN_OPT_LEVEL 2 +#include "lrodefs.h" +const LUA_REG_TYPE stm32_pio_map[] = +{ + { LSTRKEY( "set_function" ), LFUNCVAL( stm32_pio_set_function ) }, + { LSTRKEY( "GPIO" ), LNUMVAL( PIN_FUNC_GPIO ) }, + { LSTRKEY( "ADC" ), LNUMVAL( PIN_FUNC_ADC ) }, + { LSTRKEY( "AF0" ), LNUMVAL( 0 ) }, + { LSTRKEY( "AF1" ), LNUMVAL( 1 ) }, + { LSTRKEY( "AF2" ), LNUMVAL( 2 ) }, + { LSTRKEY( "AF3" ), LNUMVAL( 3 ) }, + { LSTRKEY( "AF4" ), LNUMVAL( 4 ) }, + { LSTRKEY( "AF5" ), LNUMVAL( 5 ) }, + { LSTRKEY( "AF6" ), LNUMVAL( 6 ) }, + { LSTRKEY( "AF7" ), LNUMVAL( 7 ) }, + { LSTRKEY( "AF8" ), LNUMVAL( 8 ) }, + { LSTRKEY( "AF9" ), LNUMVAL( 9 ) }, + { LSTRKEY( "AF10" ), LNUMVAL( 10 ) }, + { LSTRKEY( "AF11" ), LNUMVAL( 11 ) }, + { LSTRKEY( "AF12" ), LNUMVAL( 12 ) }, + { LSTRKEY( "AF13" ), LNUMVAL( 13 ) }, + { LSTRKEY( "AF14" ), LNUMVAL( 14 ) }, + { LSTRKEY( "AF15" ), LNUMVAL( 15 ) }, + { LNILKEY, LNILVAL } +}; +