From bc2a890ab08d163ccea323f7e719c4fdf53050cd Mon Sep 17 00:00:00 2001 From: ArdaFu Date: Thu, 31 Jul 2014 14:11:26 +0800 Subject: [PATCH 01/10] [BSP] TM4C129X: fix the bug that components_init do not work in IAR project 1. modify each dirver's INIT_EXPORT micro. 2. modify the lwip parameters' in rtconfig.h 3. insert keep section .rti_fn* in IAR link file 4. change part id from TM4C129XNCZAD to TM4C1294NCPDT --- bsp/tm4c129x/applications/application.c | 11 +------- bsp/tm4c129x/applications/board.c | 34 +++++++++++++------------ bsp/tm4c129x/drivers/drv_eth.c | 9 ++++++- bsp/tm4c129x/drivers/drv_eth.h | 2 +- bsp/tm4c129x/drivers/drv_uart.c | 4 +-- bsp/tm4c129x/libraries/SConscript | 2 -- bsp/tm4c129x/rtconfig.h | 12 ++++----- bsp/tm4c129x/rtconfig.py | 4 +-- bsp/tm4c129x/template.uvproj | 18 ++++++------- bsp/tm4c129x/tm4c_rom.icf | 3 ++- 10 files changed, 49 insertions(+), 50 deletions(-) diff --git a/bsp/tm4c129x/applications/application.c b/bsp/tm4c129x/applications/application.c index 984e622157..0ed8ab21d4 100644 --- a/bsp/tm4c129x/applications/application.c +++ b/bsp/tm4c129x/applications/application.c @@ -13,23 +13,13 @@ */ #include -#include #include -#ifdef RT_USING_LWIP -#include "drv_eth.h" -#endif /* thread phase init */ void rt_init_thread_entry(void *parameter) { /* Initialization RT-Thread Components */ rt_components_init(); -#ifdef RT_USING_FINSH - finsh_set_device(RT_CONSOLE_DEVICE_NAME); -#endif -#ifdef RT_USING_LWIP - rt_hw_tiva_eth_init(); -#endif } int rt_application_init(void) @@ -42,3 +32,4 @@ int rt_application_init(void) return 0; } + diff --git a/bsp/tm4c129x/applications/board.c b/bsp/tm4c129x/applications/board.c index 2953e76c58..b0b3bd649a 100644 --- a/bsp/tm4c129x/applications/board.c +++ b/bsp/tm4c129x/applications/board.c @@ -15,9 +15,9 @@ #include #include - +#include #include "board.h" -#include "drv_uart.h" + #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" @@ -61,23 +61,27 @@ extern void HardFault_Handler(void); */ void rt_hw_board_init() { - MAP_IntMasterDisable(); + //init low level drivers. e.g. cpu uart etc. + rt_components_board_init(); + //redirect RTT stdio to CONSOLE device + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +} + +int rt_hw_cpu_init(void) +{ + MAP_IntMasterDisable(); IntRegister(FAULT_HARD, HardFault_Handler); IntRegister(FAULT_PENDSV, PendSV_Handler); IntRegister(FAULT_SYSTICK, SysTick_Handler); - // // Enable lazy stacking for interrupt handlers. This allows floating-point // instructions to be used within interrupt handlers, but at the expense of // extra stack usage. - // MAP_FPULazyStackingEnable(); - // // Set the clocking to run directly from the external crystal/oscillator. // TODO: The SYSCTL_XTAL_ value must be changed to match the value of the // crystal on your board. - // SysClock = MAP_SysCtlClockFreqSet( (SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), SYS_CLOCK_DEFAULT); @@ -89,13 +93,11 @@ void rt_hw_board_init() /* set pend exception priority */ //IntPrioritySet(FAULT_PENDSV, (1 << 5) - 1); - - /*init uart device*/ - rt_hw_uart_init(); - //redirect RTT stdio to CONSOLE device - rt_console_set_device(RT_CONSOLE_DEVICE_NAME); - // - // Enable interrupts to the processor. - // - MAP_IntMasterEnable(); + + /*Enable interrupts to the processor.*/ + MAP_IntMasterEnable(); + return 0; } +// rt_hw_cpu_init should be run before any other INIT_BOARD_EXPORT +// We use INIT_EXPORT here and set the sequence index to "0.xxxx" +INIT_EXPORT(rt_hw_cpu_init, "0.post"); \ No newline at end of file diff --git a/bsp/tm4c129x/drivers/drv_eth.c b/bsp/tm4c129x/drivers/drv_eth.c index 1355f533cf..9d68a5d718 100644 --- a/bsp/tm4c129x/drivers/drv_eth.c +++ b/bsp/tm4c129x/drivers/drv_eth.c @@ -146,6 +146,8 @@ extern void lwIPHostGetTime(u32_t *time_s, u32_t *time_ns); #include "lwipopts.h" #include "drv_eth.h" +#include + /** * A structure used to keep track of driver state and error counts. */ @@ -1378,7 +1380,7 @@ static struct pbuf* eth_dev_rx(rt_device_t dev) return (result == RT_EOK)? (struct pbuf*)temp : RT_NULL; } -rt_err_t rt_hw_tiva_eth_init(void) +int rt_hw_tiva_eth_init(void) { rt_err_t result; @@ -1406,6 +1408,11 @@ rt_err_t rt_hw_tiva_eth_init(void) result = eth_device_init(&(eth_dev->parent), "e0"); return result; } +// eth_device_init using malloc +// We use INIT_COMPONENT_EXPORT insted of INIT_BOARD_EXPORT +INIT_COMPONENT_EXPORT(rt_hw_tiva_eth_init); + + #if 0 #ifdef RT_USING_FINSH #include "finsh.h" diff --git a/bsp/tm4c129x/drivers/drv_eth.h b/bsp/tm4c129x/drivers/drv_eth.h index 5f27139d5f..54431405fe 100644 --- a/bsp/tm4c129x/drivers/drv_eth.h +++ b/bsp/tm4c129x/drivers/drv_eth.h @@ -15,6 +15,6 @@ #ifndef __TIVA_ETH_H__ #define __TIVA_ETH_H__ -rt_err_t rt_hw_tiva_eth_init(void); +int rt_hw_tiva_eth_init(void); #endif diff --git a/bsp/tm4c129x/drivers/drv_uart.c b/bsp/tm4c129x/drivers/drv_uart.c index 20ce0db224..7365278991 100644 --- a/bsp/tm4c129x/drivers/drv_uart.c +++ b/bsp/tm4c129x/drivers/drv_uart.c @@ -18,7 +18,7 @@ #include #include "board.h" -//#include +#include #include "inc/hw_memmap.h" #include "driverlib/sysctl.h" @@ -220,4 +220,4 @@ int rt_hw_uart_init(void) #endif return 0; } -//INIT_BOARD_EXPORT(rt_hw_uart_init); +INIT_BOARD_EXPORT(rt_hw_uart_init); diff --git a/bsp/tm4c129x/libraries/SConscript b/bsp/tm4c129x/libraries/SConscript index 02874cac12..8b48a34c7d 100644 --- a/bsp/tm4c129x/libraries/SConscript +++ b/bsp/tm4c129x/libraries/SConscript @@ -14,8 +14,6 @@ elif rtconfig.CROSS_TOOL == 'keil': src += ['startup/startup_rvmdk.S'] elif rtconfig.CROSS_TOOL == 'iar': src += ['startup/startup_ewarm.c'] -elif rtconfig.CROSS_TOOL == 'ccs': - src += ['startup/startup_ccs.c'] CPPPATH = [cwd, cwd + '/inc', cwd + '/driverlib'] diff --git a/bsp/tm4c129x/rtconfig.h b/bsp/tm4c129x/rtconfig.h index 9d76c80f06..c00e4537ad 100644 --- a/bsp/tm4c129x/rtconfig.h +++ b/bsp/tm4c129x/rtconfig.h @@ -180,19 +180,19 @@ // #define RT_LWIP_DNS // -#define RT_LWIP_PBUF_NUM 4 +#define RT_LWIP_PBUF_NUM 8 // -#define RT_LWIP_TCP_PCB_NUM 3 +#define RT_LWIP_TCP_PCB_NUM 5 // -#define RT_LWIP_TCP_SND_BUF 4086 +#define RT_LWIP_TCP_SND_BUF 8192 // -#define RT_LWIP_TCP_WND 2048 +#define RT_LWIP_TCP_WND 8192 // // #define RT_LWIP_SNMP // -// #define RT_LWIP_DHCP + #define RT_LWIP_DHCP // -#define RT_LWIP_TCP_SEG_NUM 12 +#define RT_LWIP_TCP_SEG_NUM 24 // #define RT_LWIP_TCPTHREAD_PRIORITY 12 // diff --git a/bsp/tm4c129x/rtconfig.py b/bsp/tm4c129x/rtconfig.py index 93e3f3e257..ba3fc51c93 100644 --- a/bsp/tm4c129x/rtconfig.py +++ b/bsp/tm4c129x/rtconfig.py @@ -29,8 +29,8 @@ elif CROSS_TOOL == 'iar': if os.getenv('RTT_EXEC_PATH'): EXEC_PATH = os.getenv('RTT_EXEC_PATH') -BUILD = 'debug' -#BUILD = 'release' +#BUILD = 'debug' +BUILD = 'release' if PLATFORM == 'gcc': # tool-chains diff --git a/bsp/tm4c129x/template.uvproj b/bsp/tm4c129x/template.uvproj index 1a84ba0131..342711d8be 100644 --- a/bsp/tm4c129x/template.uvproj +++ b/bsp/tm4c129x/template.uvproj @@ -12,26 +12,26 @@ ARM-ADS - TM4C129XNCZAD + TM4C1294NCPDT Texas Instruments Keil.TM4C_DFP.1.0.0 http://www.keil.com/pack/ IROM(0x00000000,0x100000) IRAM(0x20000000,0x040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(120000000) ELITTLE - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C129_1024 -FS00 -FL0100000 -FP0($$Device:TM4C129XNCZAD$Flash\TM4C129_1024.FLM)) - 7096 - $$Device:TM4C129XNCZAD$Device\Include\TM4C129\TM4C129.h + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0TM4C129_1024 -FS00 -FL0100000 -FP0($$Device:TM4C1294NCPDT$Flash\TM4C129_1024.FLM)) + 7088 + $$Device:TM4C1294NCPDT$Device\Include\TM4C129\TM4C129.h - -DTM4C129XNCZAD + -DTM4C1294NCPDT - $$Device:TM4C129XNCZAD$SVD\TM4C129\TM4C129XNCZAD.svd + $$Device:TM4C1294NCPDT$SVD\TM4C129\TM4C1294NCPDT.svd 0 0 @@ -52,7 +52,7 @@ 0 0 1 - 0 + 1 .\ 1 0 @@ -148,7 +148,7 @@ 1 0 - 3 + 6 @@ -162,7 +162,7 @@ - BIN\lmidk-agdi.dll + Segger\JL2CM3.dll diff --git a/bsp/tm4c129x/tm4c_rom.icf b/bsp/tm4c129x/tm4c_rom.icf index b09595243d..c5838c98ea 100644 --- a/bsp/tm4c129x/tm4c_rom.icf +++ b/bsp/tm4c129x/tm4c_rom.icf @@ -77,4 +77,5 @@ place at start of SRAM { section VTABLE }; // place in SRAM { readwrite, block HEAP }; keep { section FSymTab }; -keep { section VSymTab }; \ No newline at end of file +keep { section VSymTab }; +keep { section .rti_fn* }; \ No newline at end of file From 0e4bd64089ced05dca7e6fc2a0c74bf28ad3f2e2 Mon Sep 17 00:00:00 2001 From: ArdaFu Date: Mon, 24 Nov 2014 12:21:11 +0800 Subject: [PATCH 02/10] 1. [Core] Add INIT_EXPORT_EX micro define. this micro will help the user to organize the start sequence of board/device/application initialization functions. --- include/rtdef.h | 57 ++++++++++++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/include/rtdef.h b/include/rtdef.h index 55f6e6b945..adc46afc1a 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -29,6 +29,7 @@ * RT_USING_MEMHEAP condition. * 2012-12-30 Bernard add more control command for graphic. * 2013-01-09 Bernard change version number. + * 2014-11-24 Arda.Fu add INIT_EXPORT_EX micro define */ #ifndef __RT_DEF_H__ @@ -172,43 +173,55 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ /* initialization export */ #ifdef RT_USING_COMPONENTS_INIT -typedef int (*init_fn_t)(void); -#ifdef _MSC_VER /* we do not support MS VC++ compiler */ + typedef int (*init_fn_t)(void); + #ifdef _MSC_VER /* we do not support MS VC++ compiler */ + #define INIT_EXPORT(fn, level) + #define INIT_EXPORT_EX(fn, level, sublevel) + #else + #if RT_DEBUG_INIT + struct rt_init_desc + { + const char* fn_name; + const init_fn_t fn; + }; + #define INIT_EXPORT(fn, level) \ + const char __rti_##fn##_name[] = "["#level"]"#fn; \ + const struct rt_init_desc __rt_init_desc_##fn \ + SECTION(".rti_fn."level) = { __rti_##fn##_name, fn}; + #define INIT_EXPORT_EX(fn, level, index) \ + const char __rti_##fn##_name[] = "["#level":"#index"]"#fn; \ + const struct rt_init_desc __rt_init_desc_##fn \ + SECTION(".rti_fn."level#index) = { __rti_##fn##_name, fn}; + #else + #define INIT_EXPORT(fn, level) \ + const init_fn_t __rt_init_##fn \ + SECTION(".rti_fn."level) = fn + #define INIT_EXPORT_EX(fn, level, index) \ + const init_fn_t __rt_init_##fn \ + SECTION(".rti_fn."level#index) = fn + #endif + #endif +#else #define INIT_EXPORT(fn, level) -#else - #if RT_DEBUG_INIT - struct rt_init_desc - { - const char* fn_name; - const init_fn_t fn; - }; - #define INIT_EXPORT(fn, level) \ - const char __rti_##fn##_name[] = #fn; \ - const struct rt_init_desc __rt_init_desc_##fn SECTION(".rti_fn."level) = \ - { __rti_##fn##_name, fn}; - #else - #define INIT_EXPORT(fn, level) \ - const init_fn_t __rt_init_##fn SECTION(".rti_fn."level) = fn - #endif -#endif -#else -#define INIT_EXPORT(fn, level) + #define INIT_EXPORT_EX(fn, level, sublevel) #endif /* board init routines will be called in board_init() function */ #define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") +#define INIT_BOARD_EXPORT_EX(fn, index) INIT_EXPORT_EX(fn, "1", index) /* device/component/fs/app init routines will be called in init_thread */ /* device initialization */ #define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "2") +#define INIT_DEVICE_EXPORT_EX(fn, index) INIT_EXPORT_EX(fn, "2", index) /* components initialization (dfs, lwip, ...) */ #define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "3") /* file system initialization (dfs-elm, dfs-rom, ...) */ #define INIT_FS_EXPORT(fn) INIT_EXPORT(fn, "4") /* environment initialization (mount disk, ...) */ -#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5") +#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5") /* appliation initialization (rtgui application etc ...) */ #define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6") - +#define INIT_APP_EXPORT_EX(fn, index) INIT_EXPORT_EX(fn, "6", index) #if !defined(RT_USING_FINSH) /* define these to empty, even if not include finsh.h file */ #define FINSH_FUNCTION_EXPORT(name, desc) From 0b5958d7006faf711fcf7fe33a4992bfb588aeee Mon Sep 17 00:00:00 2001 From: Bright Pan Date: Mon, 9 Mar 2015 09:31:23 +0800 Subject: [PATCH 03/10] Fix compile warning: ..\..\libcpu\arm\cortex-m3\context_rvds.S(207): warning: A1581W: Added 2 bytes of padding at address 0xd6 --- libcpu/arm/cortex-m3/context_rvds.S | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libcpu/arm/cortex-m3/context_rvds.S b/libcpu/arm/cortex-m3/context_rvds.S index c86b70e1f9..33fcd124d9 100644 --- a/libcpu/arm/cortex-m3/context_rvds.S +++ b/libcpu/arm/cortex-m3/context_rvds.S @@ -203,4 +203,5 @@ HardFault_Handler PROC BX lr ENDP - END + NOP + END \ No newline at end of file From 5fe489a3949cdbb947d3c719a7ef958a37e8d826 Mon Sep 17 00:00:00 2001 From: ardafu Date: Tue, 10 Mar 2015 12:00:20 +0800 Subject: [PATCH 04/10] Revert "1. [Core] Add INIT_EXPORT_EX micro define. this micro will help the user to organize the start sequence of board/device/application initialization functions." This reverts commit 0e4bd64089ced05dca7e6fc2a0c74bf28ad3f2e2. --- include/rtdef.h | 57 +++++++++++++++++++------------------------------ 1 file changed, 22 insertions(+), 35 deletions(-) diff --git a/include/rtdef.h b/include/rtdef.h index adc46afc1a..55f6e6b945 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -29,7 +29,6 @@ * RT_USING_MEMHEAP condition. * 2012-12-30 Bernard add more control command for graphic. * 2013-01-09 Bernard change version number. - * 2014-11-24 Arda.Fu add INIT_EXPORT_EX micro define */ #ifndef __RT_DEF_H__ @@ -173,55 +172,43 @@ typedef rt_base_t rt_off_t; /**< Type for offset */ /* initialization export */ #ifdef RT_USING_COMPONENTS_INIT - typedef int (*init_fn_t)(void); - #ifdef _MSC_VER /* we do not support MS VC++ compiler */ - #define INIT_EXPORT(fn, level) - #define INIT_EXPORT_EX(fn, level, sublevel) - #else - #if RT_DEBUG_INIT - struct rt_init_desc - { - const char* fn_name; - const init_fn_t fn; - }; - #define INIT_EXPORT(fn, level) \ - const char __rti_##fn##_name[] = "["#level"]"#fn; \ - const struct rt_init_desc __rt_init_desc_##fn \ - SECTION(".rti_fn."level) = { __rti_##fn##_name, fn}; - #define INIT_EXPORT_EX(fn, level, index) \ - const char __rti_##fn##_name[] = "["#level":"#index"]"#fn; \ - const struct rt_init_desc __rt_init_desc_##fn \ - SECTION(".rti_fn."level#index) = { __rti_##fn##_name, fn}; - #else - #define INIT_EXPORT(fn, level) \ - const init_fn_t __rt_init_##fn \ - SECTION(".rti_fn."level) = fn - #define INIT_EXPORT_EX(fn, level, index) \ - const init_fn_t __rt_init_##fn \ - SECTION(".rti_fn."level#index) = fn - #endif - #endif -#else +typedef int (*init_fn_t)(void); +#ifdef _MSC_VER /* we do not support MS VC++ compiler */ #define INIT_EXPORT(fn, level) - #define INIT_EXPORT_EX(fn, level, sublevel) +#else + #if RT_DEBUG_INIT + struct rt_init_desc + { + const char* fn_name; + const init_fn_t fn; + }; + #define INIT_EXPORT(fn, level) \ + const char __rti_##fn##_name[] = #fn; \ + const struct rt_init_desc __rt_init_desc_##fn SECTION(".rti_fn."level) = \ + { __rti_##fn##_name, fn}; + #else + #define INIT_EXPORT(fn, level) \ + const init_fn_t __rt_init_##fn SECTION(".rti_fn."level) = fn + #endif +#endif +#else +#define INIT_EXPORT(fn, level) #endif /* board init routines will be called in board_init() function */ #define INIT_BOARD_EXPORT(fn) INIT_EXPORT(fn, "1") -#define INIT_BOARD_EXPORT_EX(fn, index) INIT_EXPORT_EX(fn, "1", index) /* device/component/fs/app init routines will be called in init_thread */ /* device initialization */ #define INIT_DEVICE_EXPORT(fn) INIT_EXPORT(fn, "2") -#define INIT_DEVICE_EXPORT_EX(fn, index) INIT_EXPORT_EX(fn, "2", index) /* components initialization (dfs, lwip, ...) */ #define INIT_COMPONENT_EXPORT(fn) INIT_EXPORT(fn, "3") /* file system initialization (dfs-elm, dfs-rom, ...) */ #define INIT_FS_EXPORT(fn) INIT_EXPORT(fn, "4") /* environment initialization (mount disk, ...) */ -#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5") +#define INIT_ENV_EXPORT(fn) INIT_EXPORT(fn, "5") /* appliation initialization (rtgui application etc ...) */ #define INIT_APP_EXPORT(fn) INIT_EXPORT(fn, "6") -#define INIT_APP_EXPORT_EX(fn, index) INIT_EXPORT_EX(fn, "6", index) + #if !defined(RT_USING_FINSH) /* define these to empty, even if not include finsh.h file */ #define FINSH_FUNCTION_EXPORT(name, desc) From 1daa96a214d0fd2c85fc339f47de7d14899afd8f Mon Sep 17 00:00:00 2001 From: ardafu Date: Tue, 10 Mar 2015 12:13:14 +0800 Subject: [PATCH 05/10] 1. [BSP] TM4C129x : Fix the bug that enable global INT before OS scheduler start the fist thread. 2. [BSP] TM4C129x : According to LunchPad, change device id from TM4C1294XCNZAD to TM4C1294NCPDT --- bsp/tm4c129x/applications/board.c | 7 +- bsp/tm4c129x/applications/board.h | 2 +- .../inc/{tm4c129xnczad.h => tm4c1294ncpdt.h} | 1663 +---------------- 3 files changed, 8 insertions(+), 1664 deletions(-) rename bsp/tm4c129x/libraries/inc/{tm4c129xnczad.h => tm4c1294ncpdt.h} (90%) diff --git a/bsp/tm4c129x/applications/board.c b/bsp/tm4c129x/applications/board.c index b0b3bd649a..b1837fac53 100644 --- a/bsp/tm4c129x/applications/board.c +++ b/bsp/tm4c129x/applications/board.c @@ -91,13 +91,8 @@ int rt_hw_cpu_init(void) MAP_SysTickIntEnable(); MAP_SysTickEnable(); - /* set pend exception priority */ - //IntPrioritySet(FAULT_PENDSV, (1 << 5) - 1); - - /*Enable interrupts to the processor.*/ - MAP_IntMasterEnable(); return 0; } // rt_hw_cpu_init should be run before any other INIT_BOARD_EXPORT // We use INIT_EXPORT here and set the sequence index to "0.xxxx" -INIT_EXPORT(rt_hw_cpu_init, "0.post"); \ No newline at end of file +INIT_EXPORT(rt_hw_cpu_init, "0.post"); diff --git a/bsp/tm4c129x/applications/board.h b/bsp/tm4c129x/applications/board.h index f382ae4b6a..9423c80edf 100644 --- a/bsp/tm4c129x/applications/board.h +++ b/bsp/tm4c129x/applications/board.h @@ -17,7 +17,7 @@ #ifndef __BOARD_H__ #define __BOARD_H__ -#include "tm4c129xnczad.h" +#include "tm4c1294ncpdt.h" #include #include #include diff --git a/bsp/tm4c129x/libraries/inc/tm4c129xnczad.h b/bsp/tm4c129x/libraries/inc/tm4c1294ncpdt.h similarity index 90% rename from bsp/tm4c129x/libraries/inc/tm4c129xnczad.h rename to bsp/tm4c129x/libraries/inc/tm4c1294ncpdt.h index cb5d91d22d..bebf6fdc2c 100644 --- a/bsp/tm4c129x/libraries/inc/tm4c129xnczad.h +++ b/bsp/tm4c129x/libraries/inc/tm4c1294ncpdt.h @@ -1,6 +1,6 @@ //***************************************************************************** // -// tm4c129xnczad.h - TM4C129XNCZAD Register Definitions +// tm4c1294ncpdt.h - TM4C1294NCPDT Register Definitions // // Copyright (c) 2013-2014 Texas Instruments Incorporated. All rights reserved. // Software License Agreement @@ -37,8 +37,8 @@ // //***************************************************************************** -#ifndef __TM4C129XNCZAD_H__ -#define __TM4C129XNCZAD_H__ +#ifndef __TM4C1294NCPDT_H__ +#define __TM4C1294NCPDT_H__ //***************************************************************************** // @@ -135,22 +135,14 @@ #define INT_GPIOQ5 105 // GPIO Port Q5 #define INT_GPIOQ6 106 // GPIO Port Q6 #define INT_GPIOQ7 107 // GPIO Port Q7 -#define INT_GPIOR 108 // GPIO Port R -#define INT_GPIOS 109 // GPIO Port S -#define INT_SHA0 110 // SHA/MD5 -#define INT_AES0 111 // AES -#define INT_DES0 112 // DES -#define INT_LCD0 113 // LCD #define INT_TIMER6A 114 // 16/32-Bit Timer 6A #define INT_TIMER6B 115 // 16/32-Bit Timer 6B #define INT_TIMER7A 116 // 16/32-Bit Timer 7A #define INT_TIMER7B 117 // 16/32-Bit Timer 7B #define INT_I2C6 118 // I2C 6 #define INT_I2C7 119 // I2C 7 -#define INT_ONEWIRE0 121 // 1-Wire #define INT_I2C8 125 // I2C 8 #define INT_I2C9 126 // I2C 9 -#define INT_GPIOT 127 // GPIO T //***************************************************************************** // @@ -1414,9 +1406,6 @@ (*((volatile uint32_t *)0x40058548)) #define GPIO_PORTA_AHB_PP_R (*((volatile uint32_t *)0x40058FC0)) #define GPIO_PORTA_AHB_PC_R (*((volatile uint32_t *)0x40058FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1459,9 +1448,6 @@ (*((volatile uint32_t *)0x40059548)) #define GPIO_PORTB_AHB_PP_R (*((volatile uint32_t *)0x40059FC0)) #define GPIO_PORTB_AHB_PC_R (*((volatile uint32_t *)0x40059FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1504,9 +1490,6 @@ (*((volatile uint32_t *)0x4005A548)) #define GPIO_PORTC_AHB_PP_R (*((volatile uint32_t *)0x4005AFC0)) #define GPIO_PORTC_AHB_PC_R (*((volatile uint32_t *)0x4005AFC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1549,9 +1532,6 @@ (*((volatile uint32_t *)0x4005B548)) #define GPIO_PORTD_AHB_PP_R (*((volatile uint32_t *)0x4005BFC0)) #define GPIO_PORTD_AHB_PC_R (*((volatile uint32_t *)0x4005BFC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1594,9 +1574,6 @@ (*((volatile uint32_t *)0x4005C548)) #define GPIO_PORTE_AHB_PP_R (*((volatile uint32_t *)0x4005CFC0)) #define GPIO_PORTE_AHB_PC_R (*((volatile uint32_t *)0x4005CFC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1639,9 +1616,6 @@ (*((volatile uint32_t *)0x4005D548)) #define GPIO_PORTF_AHB_PP_R (*((volatile uint32_t *)0x4005DFC0)) #define GPIO_PORTF_AHB_PC_R (*((volatile uint32_t *)0x4005DFC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1684,9 +1658,6 @@ (*((volatile uint32_t *)0x4005E548)) #define GPIO_PORTG_AHB_PP_R (*((volatile uint32_t *)0x4005EFC0)) #define GPIO_PORTG_AHB_PC_R (*((volatile uint32_t *)0x4005EFC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1729,9 +1700,6 @@ (*((volatile uint32_t *)0x4005F548)) #define GPIO_PORTH_AHB_PP_R (*((volatile uint32_t *)0x4005FFC0)) #define GPIO_PORTH_AHB_PC_R (*((volatile uint32_t *)0x4005FFC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1774,9 +1742,6 @@ (*((volatile uint32_t *)0x40060548)) #define GPIO_PORTJ_AHB_PP_R (*((volatile uint32_t *)0x40060FC0)) #define GPIO_PORTJ_AHB_PC_R (*((volatile uint32_t *)0x40060FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1815,9 +1780,6 @@ #define GPIO_PORTK_WAKESTAT_R (*((volatile uint32_t *)0x40061548)) #define GPIO_PORTK_PP_R (*((volatile uint32_t *)0x40061FC0)) #define GPIO_PORTK_PC_R (*((volatile uint32_t *)0x40061FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1856,9 +1818,6 @@ #define GPIO_PORTL_WAKESTAT_R (*((volatile uint32_t *)0x40062548)) #define GPIO_PORTL_PP_R (*((volatile uint32_t *)0x40062FC0)) #define GPIO_PORTL_PC_R (*((volatile uint32_t *)0x40062FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1897,9 +1856,6 @@ #define GPIO_PORTM_WAKESTAT_R (*((volatile uint32_t *)0x40063548)) #define GPIO_PORTM_PP_R (*((volatile uint32_t *)0x40063FC0)) #define GPIO_PORTM_PC_R (*((volatile uint32_t *)0x40063FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1938,9 +1894,6 @@ #define GPIO_PORTN_WAKESTAT_R (*((volatile uint32_t *)0x40064548)) #define GPIO_PORTN_PP_R (*((volatile uint32_t *)0x40064FC0)) #define GPIO_PORTN_PC_R (*((volatile uint32_t *)0x40064FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -1979,9 +1932,6 @@ #define GPIO_PORTP_WAKESTAT_R (*((volatile uint32_t *)0x40065548)) #define GPIO_PORTP_PP_R (*((volatile uint32_t *)0x40065FC0)) #define GPIO_PORTP_PC_R (*((volatile uint32_t *)0x40065FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -2020,132 +1970,6 @@ #define GPIO_PORTQ_WAKESTAT_R (*((volatile uint32_t *)0x40066548)) #define GPIO_PORTQ_PP_R (*((volatile uint32_t *)0x40066FC0)) #define GPIO_PORTQ_PC_R (*((volatile uint32_t *)0x40066FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) - -//***************************************************************************** -// -// GPIO registers (PORTR) -// -//***************************************************************************** -#define GPIO_PORTR_DATA_BITS_R ((volatile uint32_t *)0x40067000) -#define GPIO_PORTR_DATA_R (*((volatile uint32_t *)0x400673FC)) -#define GPIO_PORTR_DIR_R (*((volatile uint32_t *)0x40067400)) -#define GPIO_PORTR_IS_R (*((volatile uint32_t *)0x40067404)) -#define GPIO_PORTR_IBE_R (*((volatile uint32_t *)0x40067408)) -#define GPIO_PORTR_IEV_R (*((volatile uint32_t *)0x4006740C)) -#define GPIO_PORTR_IM_R (*((volatile uint32_t *)0x40067410)) -#define GPIO_PORTR_RIS_R (*((volatile uint32_t *)0x40067414)) -#define GPIO_PORTR_MIS_R (*((volatile uint32_t *)0x40067418)) -#define GPIO_PORTR_ICR_R (*((volatile uint32_t *)0x4006741C)) -#define GPIO_PORTR_AFSEL_R (*((volatile uint32_t *)0x40067420)) -#define GPIO_PORTR_DR2R_R (*((volatile uint32_t *)0x40067500)) -#define GPIO_PORTR_DR4R_R (*((volatile uint32_t *)0x40067504)) -#define GPIO_PORTR_DR8R_R (*((volatile uint32_t *)0x40067508)) -#define GPIO_PORTR_ODR_R (*((volatile uint32_t *)0x4006750C)) -#define GPIO_PORTR_PUR_R (*((volatile uint32_t *)0x40067510)) -#define GPIO_PORTR_PDR_R (*((volatile uint32_t *)0x40067514)) -#define GPIO_PORTR_SLR_R (*((volatile uint32_t *)0x40067518)) -#define GPIO_PORTR_DEN_R (*((volatile uint32_t *)0x4006751C)) -#define GPIO_PORTR_LOCK_R (*((volatile uint32_t *)0x40067520)) -#define GPIO_PORTR_CR_R (*((volatile uint32_t *)0x40067524)) -#define GPIO_PORTR_AMSEL_R (*((volatile uint32_t *)0x40067528)) -#define GPIO_PORTR_PCTL_R (*((volatile uint32_t *)0x4006752C)) -#define GPIO_PORTR_ADCCTL_R (*((volatile uint32_t *)0x40067530)) -#define GPIO_PORTR_DMACTL_R (*((volatile uint32_t *)0x40067534)) -#define GPIO_PORTR_SI_R (*((volatile uint32_t *)0x40067538)) -#define GPIO_PORTR_DR12R_R (*((volatile uint32_t *)0x4006753C)) -#define GPIO_PORTR_WAKEPEN_R (*((volatile uint32_t *)0x40067540)) -#define GPIO_PORTR_WAKELVL_R (*((volatile uint32_t *)0x40067544)) -#define GPIO_PORTR_WAKESTAT_R (*((volatile uint32_t *)0x40067548)) -#define GPIO_PORTR_PP_R (*((volatile uint32_t *)0x40067FC0)) -#define GPIO_PORTR_PC_R (*((volatile uint32_t *)0x40067FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) - -//***************************************************************************** -// -// GPIO registers (PORTS) -// -//***************************************************************************** -#define GPIO_PORTS_DATA_BITS_R ((volatile uint32_t *)0x40068000) -#define GPIO_PORTS_DATA_R (*((volatile uint32_t *)0x400683FC)) -#define GPIO_PORTS_DIR_R (*((volatile uint32_t *)0x40068400)) -#define GPIO_PORTS_IS_R (*((volatile uint32_t *)0x40068404)) -#define GPIO_PORTS_IBE_R (*((volatile uint32_t *)0x40068408)) -#define GPIO_PORTS_IEV_R (*((volatile uint32_t *)0x4006840C)) -#define GPIO_PORTS_IM_R (*((volatile uint32_t *)0x40068410)) -#define GPIO_PORTS_RIS_R (*((volatile uint32_t *)0x40068414)) -#define GPIO_PORTS_MIS_R (*((volatile uint32_t *)0x40068418)) -#define GPIO_PORTS_ICR_R (*((volatile uint32_t *)0x4006841C)) -#define GPIO_PORTS_AFSEL_R (*((volatile uint32_t *)0x40068420)) -#define GPIO_PORTS_DR2R_R (*((volatile uint32_t *)0x40068500)) -#define GPIO_PORTS_DR4R_R (*((volatile uint32_t *)0x40068504)) -#define GPIO_PORTS_DR8R_R (*((volatile uint32_t *)0x40068508)) -#define GPIO_PORTS_ODR_R (*((volatile uint32_t *)0x4006850C)) -#define GPIO_PORTS_PUR_R (*((volatile uint32_t *)0x40068510)) -#define GPIO_PORTS_PDR_R (*((volatile uint32_t *)0x40068514)) -#define GPIO_PORTS_SLR_R (*((volatile uint32_t *)0x40068518)) -#define GPIO_PORTS_DEN_R (*((volatile uint32_t *)0x4006851C)) -#define GPIO_PORTS_LOCK_R (*((volatile uint32_t *)0x40068520)) -#define GPIO_PORTS_CR_R (*((volatile uint32_t *)0x40068524)) -#define GPIO_PORTS_AMSEL_R (*((volatile uint32_t *)0x40068528)) -#define GPIO_PORTS_PCTL_R (*((volatile uint32_t *)0x4006852C)) -#define GPIO_PORTS_ADCCTL_R (*((volatile uint32_t *)0x40068530)) -#define GPIO_PORTS_DMACTL_R (*((volatile uint32_t *)0x40068534)) -#define GPIO_PORTS_SI_R (*((volatile uint32_t *)0x40068538)) -#define GPIO_PORTS_DR12R_R (*((volatile uint32_t *)0x4006853C)) -#define GPIO_PORTS_WAKEPEN_R (*((volatile uint32_t *)0x40068540)) -#define GPIO_PORTS_WAKELVL_R (*((volatile uint32_t *)0x40068544)) -#define GPIO_PORTS_WAKESTAT_R (*((volatile uint32_t *)0x40068548)) -#define GPIO_PORTS_PP_R (*((volatile uint32_t *)0x40068FC0)) -#define GPIO_PORTS_PC_R (*((volatile uint32_t *)0x40068FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) - -//***************************************************************************** -// -// GPIO registers (PORTT) -// -//***************************************************************************** -#define GPIO_PORTT_DATA_BITS_R ((volatile uint32_t *)0x40069000) -#define GPIO_PORTT_DATA_R (*((volatile uint32_t *)0x400693FC)) -#define GPIO_PORTT_DIR_R (*((volatile uint32_t *)0x40069400)) -#define GPIO_PORTT_IS_R (*((volatile uint32_t *)0x40069404)) -#define GPIO_PORTT_IBE_R (*((volatile uint32_t *)0x40069408)) -#define GPIO_PORTT_IEV_R (*((volatile uint32_t *)0x4006940C)) -#define GPIO_PORTT_IM_R (*((volatile uint32_t *)0x40069410)) -#define GPIO_PORTT_RIS_R (*((volatile uint32_t *)0x40069414)) -#define GPIO_PORTT_MIS_R (*((volatile uint32_t *)0x40069418)) -#define GPIO_PORTT_ICR_R (*((volatile uint32_t *)0x4006941C)) -#define GPIO_PORTT_AFSEL_R (*((volatile uint32_t *)0x40069420)) -#define GPIO_PORTT_DR2R_R (*((volatile uint32_t *)0x40069500)) -#define GPIO_PORTT_DR4R_R (*((volatile uint32_t *)0x40069504)) -#define GPIO_PORTT_DR8R_R (*((volatile uint32_t *)0x40069508)) -#define GPIO_PORTT_ODR_R (*((volatile uint32_t *)0x4006950C)) -#define GPIO_PORTT_PUR_R (*((volatile uint32_t *)0x40069510)) -#define GPIO_PORTT_PDR_R (*((volatile uint32_t *)0x40069514)) -#define GPIO_PORTT_SLR_R (*((volatile uint32_t *)0x40069518)) -#define GPIO_PORTT_DEN_R (*((volatile uint32_t *)0x4006951C)) -#define GPIO_PORTT_LOCK_R (*((volatile uint32_t *)0x40069520)) -#define GPIO_PORTT_CR_R (*((volatile uint32_t *)0x40069524)) -#define GPIO_PORTT_AMSEL_R (*((volatile uint32_t *)0x40069528)) -#define GPIO_PORTT_PCTL_R (*((volatile uint32_t *)0x4006952C)) -#define GPIO_PORTT_ADCCTL_R (*((volatile uint32_t *)0x40069530)) -#define GPIO_PORTT_DMACTL_R (*((volatile uint32_t *)0x40069534)) -#define GPIO_PORTT_SI_R (*((volatile uint32_t *)0x40069538)) -#define GPIO_PORTT_DR12R_R (*((volatile uint32_t *)0x4006953C)) -#define GPIO_PORTT_WAKEPEN_R (*((volatile uint32_t *)0x40069540)) -#define GPIO_PORTT_WAKELVL_R (*((volatile uint32_t *)0x40069544)) -#define GPIO_PORTT_WAKESTAT_R (*((volatile uint32_t *)0x40069548)) -#define GPIO_PORTT_PP_R (*((volatile uint32_t *)0x40069FC0)) -#define GPIO_PORTT_PC_R (*((volatile uint32_t *)0x40069FC4)) -#define GPIO_PCTL_PR_R (*((volatile uint32_t *)0x00012000)) -#define GPIO_PCTL_PS_R (*((volatile uint32_t *)0x00013000)) -#define GPIO_PCTL_PT_R (*((volatile uint32_t *)0x00014000)) //***************************************************************************** // @@ -2171,22 +1995,6 @@ #define EEPROM_EEDBGME_R (*((volatile uint32_t *)0x400AF080)) #define EEPROM_PP_R (*((volatile uint32_t *)0x400AFFC0)) -//***************************************************************************** -// -// One wire registers (ONEWIRE0) -// -//***************************************************************************** -#define ONEWIRE0_CS_R (*((volatile uint32_t *)0x400B6000)) -#define ONEWIRE0_TIM_R (*((volatile uint32_t *)0x400B6004)) -#define ONEWIRE0_DATW_R (*((volatile uint32_t *)0x400B6008)) -#define ONEWIRE0_DATR_R (*((volatile uint32_t *)0x400B600C)) -#define ONEWIRE0_IM_R (*((volatile uint32_t *)0x400B6100)) -#define ONEWIRE0_RIS_R (*((volatile uint32_t *)0x400B6104)) -#define ONEWIRE0_MIS_R (*((volatile uint32_t *)0x400B6108)) -#define ONEWIRE0_ICR_R (*((volatile uint32_t *)0x400B610C)) -#define ONEWIRE0_DMA_R (*((volatile uint32_t *)0x400B6120)) -#define ONEWIRE0_PP_R (*((volatile uint32_t *)0x400B6FC0)) - //***************************************************************************** // // I2C registers (I2C8) @@ -2777,7 +2585,6 @@ #define SYSCTL_USBMPC_R (*((volatile uint32_t *)0x400FE284)) #define SYSCTL_EMACPDS_R (*((volatile uint32_t *)0x400FE288)) #define SYSCTL_EMACMPC_R (*((volatile uint32_t *)0x400FE28C)) -#define SYSCTL_LCDMPC_R (*((volatile uint32_t *)0x400FE294)) #define SYSCTL_PPWD_R (*((volatile uint32_t *)0x400FE300)) #define SYSCTL_PPTIMER_R (*((volatile uint32_t *)0x400FE304)) #define SYSCTL_PPGPIO_R (*((volatile uint32_t *)0x400FE308)) @@ -2823,8 +2630,6 @@ #define SYSCTL_SRQEI_R (*((volatile uint32_t *)0x400FE544)) #define SYSCTL_SREEPROM_R (*((volatile uint32_t *)0x400FE558)) #define SYSCTL_SRCCM_R (*((volatile uint32_t *)0x400FE574)) -#define SYSCTL_SRLCD_R (*((volatile uint32_t *)0x400FE590)) -#define SYSCTL_SROWIRE_R (*((volatile uint32_t *)0x400FE598)) #define SYSCTL_SREMAC_R (*((volatile uint32_t *)0x400FE59C)) #define SYSCTL_RCGCWD_R (*((volatile uint32_t *)0x400FE600)) #define SYSCTL_RCGCTIMER_R (*((volatile uint32_t *)0x400FE604)) @@ -2844,8 +2649,6 @@ #define SYSCTL_RCGCQEI_R (*((volatile uint32_t *)0x400FE644)) #define SYSCTL_RCGCEEPROM_R (*((volatile uint32_t *)0x400FE658)) #define SYSCTL_RCGCCCM_R (*((volatile uint32_t *)0x400FE674)) -#define SYSCTL_RCGCLCD_R (*((volatile uint32_t *)0x400FE690)) -#define SYSCTL_RCGCOWIRE_R (*((volatile uint32_t *)0x400FE698)) #define SYSCTL_RCGCEMAC_R (*((volatile uint32_t *)0x400FE69C)) #define SYSCTL_SCGCWD_R (*((volatile uint32_t *)0x400FE700)) #define SYSCTL_SCGCTIMER_R (*((volatile uint32_t *)0x400FE704)) @@ -2865,8 +2668,6 @@ #define SYSCTL_SCGCQEI_R (*((volatile uint32_t *)0x400FE744)) #define SYSCTL_SCGCEEPROM_R (*((volatile uint32_t *)0x400FE758)) #define SYSCTL_SCGCCCM_R (*((volatile uint32_t *)0x400FE774)) -#define SYSCTL_SCGCLCD_R (*((volatile uint32_t *)0x400FE790)) -#define SYSCTL_SCGCOWIRE_R (*((volatile uint32_t *)0x400FE798)) #define SYSCTL_SCGCEMAC_R (*((volatile uint32_t *)0x400FE79C)) #define SYSCTL_DCGCWD_R (*((volatile uint32_t *)0x400FE800)) #define SYSCTL_DCGCTIMER_R (*((volatile uint32_t *)0x400FE804)) @@ -2886,8 +2687,6 @@ #define SYSCTL_DCGCQEI_R (*((volatile uint32_t *)0x400FE844)) #define SYSCTL_DCGCEEPROM_R (*((volatile uint32_t *)0x400FE858)) #define SYSCTL_DCGCCCM_R (*((volatile uint32_t *)0x400FE874)) -#define SYSCTL_DCGCLCD_R (*((volatile uint32_t *)0x400FE890)) -#define SYSCTL_DCGCOWIRE_R (*((volatile uint32_t *)0x400FE898)) #define SYSCTL_DCGCEMAC_R (*((volatile uint32_t *)0x400FE89C)) #define SYSCTL_PCWD_R (*((volatile uint32_t *)0x400FE900)) #define SYSCTL_PCTIMER_R (*((volatile uint32_t *)0x400FE904)) @@ -2907,8 +2706,6 @@ #define SYSCTL_PCQEI_R (*((volatile uint32_t *)0x400FE944)) #define SYSCTL_PCEEPROM_R (*((volatile uint32_t *)0x400FE958)) #define SYSCTL_PCCCM_R (*((volatile uint32_t *)0x400FE974)) -#define SYSCTL_PCLCD_R (*((volatile uint32_t *)0x400FE990)) -#define SYSCTL_PCOWIRE_R (*((volatile uint32_t *)0x400FE998)) #define SYSCTL_PCEMAC_R (*((volatile uint32_t *)0x400FE99C)) #define SYSCTL_PRWD_R (*((volatile uint32_t *)0x400FEA00)) #define SYSCTL_PRTIMER_R (*((volatile uint32_t *)0x400FEA04)) @@ -2928,10 +2725,7 @@ #define SYSCTL_PRQEI_R (*((volatile uint32_t *)0x400FEA44)) #define SYSCTL_PREEPROM_R (*((volatile uint32_t *)0x400FEA58)) #define SYSCTL_PRCCM_R (*((volatile uint32_t *)0x400FEA74)) -#define SYSCTL_PRLCD_R (*((volatile uint32_t *)0x400FEA90)) -#define SYSCTL_PROWIRE_R (*((volatile uint32_t *)0x400FEA98)) #define SYSCTL_PREMAC_R (*((volatile uint32_t *)0x400FEA9C)) -#define SYSCTL_CCMCGREQ_R (*((volatile uint32_t *)0x44030204)) //***************************************************************************** // @@ -2982,165 +2776,6 @@ #define CCM0_CRCDIN_R (*((volatile uint32_t *)0x44030414)) #define CCM0_CRCRSLTPP_R (*((volatile uint32_t *)0x44030418)) -//***************************************************************************** -// -// SHA/MD5 registers (SHAMD5) -// -//***************************************************************************** -#define SHAMD5_ODIGEST_A_R (*((volatile uint32_t *)0x44034000)) -#define SHAMD5_ODIGEST_B_R (*((volatile uint32_t *)0x44034004)) -#define SHAMD5_ODIGEST_C_R (*((volatile uint32_t *)0x44034008)) -#define SHAMD5_ODIGEST_D_R (*((volatile uint32_t *)0x4403400C)) -#define SHAMD5_ODIGEST_E_R (*((volatile uint32_t *)0x44034010)) -#define SHAMD5_ODIGEST_F_R (*((volatile uint32_t *)0x44034014)) -#define SHAMD5_ODIGEST_G_R (*((volatile uint32_t *)0x44034018)) -#define SHAMD5_ODIGEST_H_R (*((volatile uint32_t *)0x4403401C)) -#define SHAMD5_IDIGEST_A_R (*((volatile uint32_t *)0x44034020)) -#define SHAMD5_IDIGEST_B_R (*((volatile uint32_t *)0x44034024)) -#define SHAMD5_IDIGEST_C_R (*((volatile uint32_t *)0x44034028)) -#define SHAMD5_IDIGEST_D_R (*((volatile uint32_t *)0x4403402C)) -#define SHAMD5_IDIGEST_E_R (*((volatile uint32_t *)0x44034030)) -#define SHAMD5_IDIGEST_F_R (*((volatile uint32_t *)0x44034034)) -#define SHAMD5_IDIGEST_G_R (*((volatile uint32_t *)0x44034038)) -#define SHAMD5_IDIGEST_H_R (*((volatile uint32_t *)0x4403403C)) -#define SHAMD5_DIGEST_COUNT_R (*((volatile uint32_t *)0x44034040)) -#define SHAMD5_MODE_R (*((volatile uint32_t *)0x44034044)) -#define SHAMD5_LENGTH_R (*((volatile uint32_t *)0x44034048)) -#define SHAMD5_DATA_0_IN_R (*((volatile uint32_t *)0x44034080)) -#define SHAMD5_DATA_1_IN_R (*((volatile uint32_t *)0x44034084)) -#define SHAMD5_DATA_2_IN_R (*((volatile uint32_t *)0x44034088)) -#define SHAMD5_DATA_3_IN_R (*((volatile uint32_t *)0x4403408C)) -#define SHAMD5_DATA_4_IN_R (*((volatile uint32_t *)0x44034090)) -#define SHAMD5_DATA_5_IN_R (*((volatile uint32_t *)0x44034094)) -#define SHAMD5_DATA_6_IN_R (*((volatile uint32_t *)0x44034098)) -#define SHAMD5_DATA_7_IN_R (*((volatile uint32_t *)0x4403409C)) -#define SHAMD5_DATA_8_IN_R (*((volatile uint32_t *)0x440340A0)) -#define SHAMD5_DATA_9_IN_R (*((volatile uint32_t *)0x440340A4)) -#define SHAMD5_DATA_10_IN_R (*((volatile uint32_t *)0x440340A8)) -#define SHAMD5_DATA_11_IN_R (*((volatile uint32_t *)0x440340AC)) -#define SHAMD5_DATA_12_IN_R (*((volatile uint32_t *)0x440340B0)) -#define SHAMD5_DATA_13_IN_R (*((volatile uint32_t *)0x440340B4)) -#define SHAMD5_DATA_14_IN_R (*((volatile uint32_t *)0x440340B8)) -#define SHAMD5_DATA_15_IN_R (*((volatile uint32_t *)0x440340BC)) -#define SHAMD5_REVISION_R (*((volatile uint32_t *)0x44034100)) -#define SHAMD5_SYSCONFIG_R (*((volatile uint32_t *)0x44034110)) -#define SHAMD5_SYSSTATUS_R (*((volatile uint32_t *)0x44034114)) -#define SHAMD5_IRQSTATUS_R (*((volatile uint32_t *)0x44034118)) -#define SHAMD5_IRQENABLE_R (*((volatile uint32_t *)0x4403411C)) -#define SHAMD5_DMAIM_R (*((volatile uint32_t *)0x144030010)) -#define SHAMD5_DMARIS_R (*((volatile uint32_t *)0x144030014)) -#define SHAMD5_DMAMIS_R (*((volatile uint32_t *)0x144030018)) -#define SHAMD5_DMAIC_R (*((volatile uint32_t *)0x14403001C)) - -//***************************************************************************** -// -// AES registers (AES) -// -//***************************************************************************** -#define AES_KEY2_6_R (*((volatile uint32_t *)0x44036000)) -#define AES_KEY2_7_R (*((volatile uint32_t *)0x44036004)) -#define AES_KEY2_4_R (*((volatile uint32_t *)0x44036008)) -#define AES_KEY2_5_R (*((volatile uint32_t *)0x4403600C)) -#define AES_KEY2_2_R (*((volatile uint32_t *)0x44036010)) -#define AES_KEY2_3_R (*((volatile uint32_t *)0x44036014)) -#define AES_KEY2_0_R (*((volatile uint32_t *)0x44036018)) -#define AES_KEY2_1_R (*((volatile uint32_t *)0x4403601C)) -#define AES_KEY1_6_R (*((volatile uint32_t *)0x44036020)) -#define AES_KEY1_7_R (*((volatile uint32_t *)0x44036024)) -#define AES_KEY1_4_R (*((volatile uint32_t *)0x44036028)) -#define AES_KEY1_5_R (*((volatile uint32_t *)0x4403602C)) -#define AES_KEY1_2_R (*((volatile uint32_t *)0x44036030)) -#define AES_KEY1_3_R (*((volatile uint32_t *)0x44036034)) -#define AES_KEY1_0_R (*((volatile uint32_t *)0x44036038)) -#define AES_KEY1_1_R (*((volatile uint32_t *)0x4403603C)) -#define AES_IV_IN_0_R (*((volatile uint32_t *)0x44036040)) -#define AES_IV_IN_1_R (*((volatile uint32_t *)0x44036044)) -#define AES_IV_IN_2_R (*((volatile uint32_t *)0x44036048)) -#define AES_IV_IN_3_R (*((volatile uint32_t *)0x4403604C)) -#define AES_CTRL_R (*((volatile uint32_t *)0x44036050)) -#define AES_C_LENGTH_0_R (*((volatile uint32_t *)0x44036054)) -#define AES_C_LENGTH_1_R (*((volatile uint32_t *)0x44036058)) -#define AES_AUTH_LENGTH_R (*((volatile uint32_t *)0x4403605C)) -#define AES_DATA_IN_0_R (*((volatile uint32_t *)0x44036060)) -#define AES_DATA_IN_1_R (*((volatile uint32_t *)0x44036064)) -#define AES_DATA_IN_2_R (*((volatile uint32_t *)0x44036068)) -#define AES_DATA_IN_3_R (*((volatile uint32_t *)0x4403606C)) -#define AES_TAG_OUT_0_R (*((volatile uint32_t *)0x44036070)) -#define AES_TAG_OUT_1_R (*((volatile uint32_t *)0x44036074)) -#define AES_TAG_OUT_2_R (*((volatile uint32_t *)0x44036078)) -#define AES_TAG_OUT_3_R (*((volatile uint32_t *)0x4403607C)) -#define AES_REVISION_R (*((volatile uint32_t *)0x44036080)) -#define AES_SYSCONFIG_R (*((volatile uint32_t *)0x44036084)) -#define AES_SYSSTATUS_R (*((volatile uint32_t *)0x44036088)) -#define AES_IRQSTATUS_R (*((volatile uint32_t *)0x4403608C)) -#define AES_IRQENABLE_R (*((volatile uint32_t *)0x44036090)) -#define AES_DIRTYBITS_R (*((volatile uint32_t *)0x44036094)) -#define AES_DMAIM_R (*((volatile uint32_t *)0x144030020)) -#define AES_DMARIS_R (*((volatile uint32_t *)0x144030024)) -#define AES_DMAMIS_R (*((volatile uint32_t *)0x144030028)) -#define AES_DMAIC_R (*((volatile uint32_t *)0x14403002C)) - -//***************************************************************************** -// -// DES registers (DES) -// -//***************************************************************************** -#define DES_KEY3_L_R (*((volatile uint32_t *)0x44038000)) -#define DES_KEY3_H_R (*((volatile uint32_t *)0x44038004)) -#define DES_KEY2_L_R (*((volatile uint32_t *)0x44038008)) -#define DES_KEY2_H_R (*((volatile uint32_t *)0x4403800C)) -#define DES_KEY1_L_R (*((volatile uint32_t *)0x44038010)) -#define DES_KEY1_H_R (*((volatile uint32_t *)0x44038014)) -#define DES_IV_L_R (*((volatile uint32_t *)0x44038018)) -#define DES_IV_H_R (*((volatile uint32_t *)0x4403801C)) -#define DES_CTRL_R (*((volatile uint32_t *)0x44038020)) -#define DES_LENGTH_R (*((volatile uint32_t *)0x44038024)) -#define DES_DATA_L_R (*((volatile uint32_t *)0x44038028)) -#define DES_DATA_H_R (*((volatile uint32_t *)0x4403802C)) -#define DES_REVISION_R (*((volatile uint32_t *)0x44038030)) -#define DES_SYSCONFIG_R (*((volatile uint32_t *)0x44038034)) -#define DES_SYSSTATUS_R (*((volatile uint32_t *)0x44038038)) -#define DES_IRQSTATUS_R (*((volatile uint32_t *)0x4403803C)) -#define DES_IRQENABLE_R (*((volatile uint32_t *)0x44038040)) -#define DES_DIRTYBITS_R (*((volatile uint32_t *)0x44038044)) -#define DES_DMAIM_R (*((volatile uint32_t *)0x144030030)) -#define DES_DMARIS_R (*((volatile uint32_t *)0x144030034)) -#define DES_DMAMIS_R (*((volatile uint32_t *)0x144030038)) -#define DES_DMAIC_R (*((volatile uint32_t *)0x14403003C)) - -//***************************************************************************** -// -// LCD registers (LCD0) -// -//***************************************************************************** -#define LCD0_PID_R (*((volatile uint32_t *)0x44050000)) -#define LCD0_CTL_R (*((volatile uint32_t *)0x44050004)) -#define LCD0_LIDDCTL_R (*((volatile uint32_t *)0x4405000C)) -#define LCD0_LIDDCS0CFG_R (*((volatile uint32_t *)0x44050010)) -#define LCD0_LIDDCS0ADDR_R (*((volatile uint32_t *)0x44050014)) -#define LCD0_LIDDCS0DATA_R (*((volatile uint32_t *)0x44050018)) -#define LCD0_LIDDCS1CFG_R (*((volatile uint32_t *)0x4405001C)) -#define LCD0_LIDDCS1ADDR_R (*((volatile uint32_t *)0x44050020)) -#define LCD0_LIDDCS1DATA_R (*((volatile uint32_t *)0x44050024)) -#define LCD0_RASTRCTL_R (*((volatile uint32_t *)0x44050028)) -#define LCD0_RASTRTIM0_R (*((volatile uint32_t *)0x4405002C)) -#define LCD0_RASTRTIM1_R (*((volatile uint32_t *)0x44050030)) -#define LCD0_RASTRTIM2_R (*((volatile uint32_t *)0x44050034)) -#define LCD0_RASTRSUBP1_R (*((volatile uint32_t *)0x44050038)) -#define LCD0_RASTRSUBP2_R (*((volatile uint32_t *)0x4405003C)) -#define LCD0_DMACTL_R (*((volatile uint32_t *)0x44050040)) -#define LCD0_DMABAFB0_R (*((volatile uint32_t *)0x44050044)) -#define LCD0_DMACAFB0_R (*((volatile uint32_t *)0x44050048)) -#define LCD0_DMABAFB1_R (*((volatile uint32_t *)0x4405004C)) -#define LCD0_DMACAFB1_R (*((volatile uint32_t *)0x44050050)) -#define LCD0_SYSCFG_R (*((volatile uint32_t *)0x44050054)) -#define LCD0_RISSET_R (*((volatile uint32_t *)0x44050058)) -#define LCD0_MISCLR_R (*((volatile uint32_t *)0x4405005C)) -#define LCD0_IM_R (*((volatile uint32_t *)0x44050060)) -#define LCD0_IENC_R (*((volatile uint32_t *)0x44050064)) -#define LCD0_CLKEN_R (*((volatile uint32_t *)0x4405006C)) -#define LCD0_CLKRESET_R (*((volatile uint32_t *)0x44050070)) - //***************************************************************************** // // NVIC registers (NVIC) @@ -12358,8 +11993,8 @@ #define SYSCTL_DID1_FAM_M 0x0F000000 // Family #define SYSCTL_DID1_FAM_TIVA 0x00000000 // Tiva family of microcontollers #define SYSCTL_DID1_PRTNO_M 0x00FF0000 // Part Number -#define SYSCTL_DID1_PRTNO_TM4C129XNCZAD \ - 0x00320000 // TM4C129XNCZAD +#define SYSCTL_DID1_PRTNO_TM4C1294NCPDT \ + 0x001F0000 // TM4C1294NCPDT #define SYSCTL_DID1_PINCNT_M 0x0000E000 // Package Pin Count #define SYSCTL_DID1_PINCNT_100 0x00004000 // 100-pin LQFP package #define SYSCTL_DID1_PINCNT_64 0x00006000 // 64-pin LQFP package @@ -12913,16 +12548,6 @@ #define SYSCTL_EMACMPC_PWRCTL_ON \ 0x00000003 // Array On -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_LCDMPC register. -// -//***************************************************************************** -#define SYSCTL_LCDMPC_PWRCTL_M 0x00000003 // Memory Array Power Control -#define SYSCTL_LCDMPC_PWRCTL_OFF \ - 0x00000000 // Array OFF -#define SYSCTL_LCDMPC_PWRCTL_ON 0x00000003 // Array On - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_PPWD register. @@ -12958,9 +12583,6 @@ // The following are defines for the bit fields in the SYSCTL_PPGPIO register. // //***************************************************************************** -#define SYSCTL_PPGPIO_P17 0x00020000 // GPIO Port T Present -#define SYSCTL_PPGPIO_P16 0x00010000 // GPIO Port S Present -#define SYSCTL_PPGPIO_P15 0x00008000 // GPIO Port R Present #define SYSCTL_PPGPIO_P14 0x00004000 // GPIO Port Q Present #define SYSCTL_PPGPIO_P13 0x00002000 // GPIO Port P Present #define SYSCTL_PPGPIO_P12 0x00001000 // GPIO Port N Present @@ -13206,9 +12828,6 @@ // The following are defines for the bit fields in the SYSCTL_SRGPIO register. // //***************************************************************************** -#define SYSCTL_SRGPIO_R17 0x00020000 // GPIO Port T Software Reset -#define SYSCTL_SRGPIO_R16 0x00010000 // GPIO Port S Software Reset -#define SYSCTL_SRGPIO_R15 0x00008000 // GPIO Port R Software Reset #define SYSCTL_SRGPIO_R14 0x00004000 // GPIO Port Q Software Reset #define SYSCTL_SRGPIO_R13 0x00002000 // GPIO Port P Software Reset #define SYSCTL_SRGPIO_R12 0x00001000 // GPIO Port N Software Reset @@ -13356,20 +12975,6 @@ #define SYSCTL_SRCCM_R0 0x00000001 // CRC and Cryptographic Modules // Software Reset -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_SRLCD register. -// -//***************************************************************************** -#define SYSCTL_SRLCD_R0 0x00000001 // LCD Module 0 Software Reset - -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_SROWIRE register. -// -//***************************************************************************** -#define SYSCTL_SROWIRE_R0 0x00000001 // 1-Wire Module Software Reset - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_SREMAC register. @@ -13417,12 +13022,6 @@ // register. // //***************************************************************************** -#define SYSCTL_RCGCGPIO_R17 0x00020000 // GPIO Port T Run Mode Clock - // Gating Control -#define SYSCTL_RCGCGPIO_R16 0x00010000 // GPIO Port S Run Mode Clock - // Gating Control -#define SYSCTL_RCGCGPIO_R15 0x00008000 // GPIO Port R Run Mode Clock - // Gating Control #define SYSCTL_RCGCGPIO_R14 0x00004000 // GPIO Port Q Run Mode Clock // Gating Control #define SYSCTL_RCGCGPIO_R13 0x00002000 // GPIO Port P Run Mode Clock @@ -13620,23 +13219,6 @@ #define SYSCTL_RCGCCCM_R0 0x00000001 // CRC and Cryptographic Modules // Run Mode Clock Gating Control -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_RCGCLCD register. -// -//***************************************************************************** -#define SYSCTL_RCGCLCD_R0 0x00000001 // LCD Controller Module 0 Run Mode - // Clock Gating Control - -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_RCGCOWIRE -// register. -// -//***************************************************************************** -#define SYSCTL_RCGCOWIRE_R0 0x00000001 // 1-Wire Module 0 Run Mode Clock - // Gating Control - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_RCGCEMAC @@ -13693,12 +13275,6 @@ // register. // //***************************************************************************** -#define SYSCTL_SCGCGPIO_S17 0x00020000 // GPIO Port T Sleep Mode Clock - // Gating Control -#define SYSCTL_SCGCGPIO_S16 0x00010000 // GPIO Port S Sleep Mode Clock - // Gating Control -#define SYSCTL_SCGCGPIO_S15 0x00008000 // GPIO Port R Sleep Mode Clock - // Gating Control #define SYSCTL_SCGCGPIO_S14 0x00004000 // GPIO Port Q Sleep Mode Clock // Gating Control #define SYSCTL_SCGCGPIO_S13 0x00002000 // GPIO Port P Sleep Mode Clock @@ -13896,23 +13472,6 @@ #define SYSCTL_SCGCCCM_S0 0x00000001 // CRC and Cryptographic Modules // Sleep Mode Clock Gating Control -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_SCGCLCD register. -// -//***************************************************************************** -#define SYSCTL_SCGCLCD_S0 0x00000001 // LCD Controller Module 0 Sleep - // Mode Clock Gating Control - -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_SCGCOWIRE -// register. -// -//***************************************************************************** -#define SYSCTL_SCGCOWIRE_S0 0x00000001 // 1-Wire Module 0 Sleep Mode Clock - // Gating Control - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_SCGCEMAC @@ -13969,12 +13528,6 @@ // register. // //***************************************************************************** -#define SYSCTL_DCGCGPIO_D17 0x00020000 // GPIO Port T Deep-Sleep Mode - // Clock Gating Control -#define SYSCTL_DCGCGPIO_D16 0x00010000 // GPIO Port S Deep-Sleep Mode - // Clock Gating Control -#define SYSCTL_DCGCGPIO_D15 0x00008000 // GPIO Port R Deep-Sleep Mode - // Clock Gating Control #define SYSCTL_DCGCGPIO_D14 0x00004000 // GPIO Port Q Deep-Sleep Mode // Clock Gating Control #define SYSCTL_DCGCGPIO_D13 0x00002000 // GPIO Port P Deep-Sleep Mode @@ -14174,24 +13727,6 @@ // Deep-Sleep Mode Clock Gating // Control -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_DCGCLCD register. -// -//***************************************************************************** -#define SYSCTL_DCGCLCD_D0 0x00000001 // LCD Controller Module 0 - // Deep-Sleep Mode Clock Gating - // Control - -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_DCGCOWIRE -// register. -// -//***************************************************************************** -#define SYSCTL_DCGCOWIRE_D0 0x00000001 // 1-Wire Module 0 Deep-Sleep Mode - // Clock Gating Control - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_DCGCEMAC @@ -14236,9 +13771,6 @@ // The following are defines for the bit fields in the SYSCTL_PCGPIO register. // //***************************************************************************** -#define SYSCTL_PCGPIO_P17 0x00020000 // GPIO Port T Power Control -#define SYSCTL_PCGPIO_P16 0x00010000 // GPIO Port S Power Control -#define SYSCTL_PCGPIO_P15 0x00008000 // GPIO Port R Power Control #define SYSCTL_PCGPIO_P14 0x00004000 // GPIO Port Q Power Control #define SYSCTL_PCGPIO_P13 0x00002000 // GPIO Port P Power Control #define SYSCTL_PCGPIO_P12 0x00001000 // GPIO Port N Power Control @@ -14385,21 +13917,6 @@ #define SYSCTL_PCCCM_P0 0x00000001 // CRC and Cryptographic Modules // Power Control -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_PCLCD register. -// -//***************************************************************************** -#define SYSCTL_PCLCD_P0 0x00000001 // LCD Controller Module 0 Power - // Control - -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_PCOWIRE register. -// -//***************************************************************************** -#define SYSCTL_PCOWIRE_P0 0x00000001 // 1-Wire Module 0 Power Control - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_PCEMAC register. @@ -14445,9 +13962,6 @@ // The following are defines for the bit fields in the SYSCTL_PRGPIO register. // //***************************************************************************** -#define SYSCTL_PRGPIO_R17 0x00020000 // GPIO Port T Peripheral Ready -#define SYSCTL_PRGPIO_R16 0x00010000 // GPIO Port S Peripheral Ready -#define SYSCTL_PRGPIO_R15 0x00008000 // GPIO Port R Peripheral Ready #define SYSCTL_PRGPIO_R14 0x00004000 // GPIO Port Q Peripheral Ready #define SYSCTL_PRGPIO_R13 0x00002000 // GPIO Port P Peripheral Ready #define SYSCTL_PRGPIO_R12 0x00001000 // GPIO Port N Peripheral Ready @@ -14595,21 +14109,6 @@ #define SYSCTL_PRCCM_R0 0x00000001 // CRC and Cryptographic Modules // Peripheral Ready -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_PRLCD register. -// -//***************************************************************************** -#define SYSCTL_PRLCD_R0 0x00000001 // LCD Controller Module 0 - // Peripheral Ready - -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_PROWIRE register. -// -//***************************************************************************** -#define SYSCTL_PROWIRE_R0 0x00000001 // 1-Wire Module 0 Peripheral Ready - //***************************************************************************** // // The following are defines for the bit fields in the SYSCTL_PREMAC register. @@ -14618,16 +14117,6 @@ #define SYSCTL_PREMAC_R0 0x00000001 // Ethernet MAC Module 0 Peripheral // Ready -//***************************************************************************** -// -// The following are defines for the bit fields in the SYSCTL_CCMCGREQ -// register. -// -//***************************************************************************** -#define SYSCTL_CCMCGREQ_DESCFG 0x00000004 // DES Clock Gating Request -#define SYSCTL_CCMCGREQ_AESCFG 0x00000002 // AES Clock Gating Request -#define SYSCTL_CCMCGREQ_SHACFG 0x00000001 // SHA/MD5 Clock Gating Request - //***************************************************************************** // // The following are defines for the bit fields in the UDMA_STAT register. @@ -15009,1146 +14498,6 @@ #define CCM_CRCRSLTPP_RSLTPP_M 0xFFFFFFFF // Post Processing Result #define CCM_CRCRSLTPP_RSLTPP_S 0 -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_A -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_A_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_A_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_B -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_B_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_B_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_C -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_C_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_C_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_D -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_D_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_D_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_E -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_E_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_E_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_F -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_F_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_F_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_G -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_G_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_G_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_ODIGEST_H -// register. -// -//***************************************************************************** -#define SHAMD5_ODIGEST_H_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_ODIGEST_H_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_A -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_A_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_A_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_B -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_B_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_B_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_C -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_C_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_C_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_D -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_D_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_D_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_E -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_E_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_E_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_F -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_F_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_F_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_G -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_G_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_G_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IDIGEST_H -// register. -// -//***************************************************************************** -#define SHAMD5_IDIGEST_H_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_IDIGEST_H_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DIGEST_COUNT -// register. -// -//***************************************************************************** -#define SHAMD5_DIGEST_COUNT_M 0xFFFFFFFF // Digest Count -#define SHAMD5_DIGEST_COUNT_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_MODE register. -// -//***************************************************************************** -#define SHAMD5_MODE_HMAC_OUTER_HASH \ - 0x00000080 // HMAC Outer Hash Processing - // Enable -#define SHAMD5_MODE_HMAC_KEY_PROC \ - 0x00000020 // HMAC Key Processing Enable -#define SHAMD5_MODE_CLOSE_HASH 0x00000010 // Performs the padding, the - // Hash/HMAC will be 'closed' at - // the end of the block, as per - // MD5/SHA-1/SHA-2 specification -#define SHAMD5_MODE_ALGO_CONSTANT \ - 0x00000008 // The initial digest register will - // be overwritten with the - // algorithm constants for the - // selected algorithm when hashing - // and the initial digest count - // register will be reset to 0 -#define SHAMD5_MODE_ALGO_M 0x00000007 // Hash Algorithm -#define SHAMD5_MODE_ALGO_MD5 0x00000000 // MD5 -#define SHAMD5_MODE_ALGO_SHA1 0x00000002 // SHA-1 -#define SHAMD5_MODE_ALGO_SHA224 0x00000004 // SHA-224 -#define SHAMD5_MODE_ALGO_SHA256 0x00000006 // SHA-256 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_LENGTH -// register. -// -//***************************************************************************** -#define SHAMD5_LENGTH_M 0xFFFFFFFF // Block Length/Remaining Byte - // Count -#define SHAMD5_LENGTH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_0_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_0_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_0_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_1_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_1_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_1_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_2_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_2_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_2_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_3_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_3_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_3_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_4_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_4_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_4_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_5_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_5_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_5_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_6_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_6_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_6_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_7_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_7_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_7_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_8_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_8_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_8_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_9_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_9_IN_DATA_M 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_9_IN_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_10_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_10_IN_DATA_M \ - 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_10_IN_DATA_S \ - 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_11_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_11_IN_DATA_M \ - 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_11_IN_DATA_S \ - 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_12_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_12_IN_DATA_M \ - 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_12_IN_DATA_S \ - 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_13_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_13_IN_DATA_M \ - 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_13_IN_DATA_S \ - 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_14_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_14_IN_DATA_M \ - 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_14_IN_DATA_S \ - 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DATA_15_IN -// register. -// -//***************************************************************************** -#define SHAMD5_DATA_15_IN_DATA_M \ - 0xFFFFFFFF // Digest/Key Data -#define SHAMD5_DATA_15_IN_DATA_S \ - 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_REVISION -// register. -// -//***************************************************************************** -#define SHAMD5_REVISION_M 0xFFFFFFFF // Revision Number -#define SHAMD5_REVISION_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_SYSCONFIG -// register. -// -//***************************************************************************** -#define SHAMD5_SYSCONFIG_SADVANCED \ - 0x00000080 // Advanced Mode Enable -#define SHAMD5_SYSCONFIG_SIDLE_M \ - 0x00000030 // Sidle mode -#define SHAMD5_SYSCONFIG_SIDLE_FORCE \ - 0x00000000 // Force-idle mode -#define SHAMD5_SYSCONFIG_DMA_EN 0x00000008 // uDMA Request Enable -#define SHAMD5_SYSCONFIG_IT_EN 0x00000004 // Interrupt Enable -#define SHAMD5_SYSCONFIG_SOFTRESET \ - 0x00000002 // Soft reset - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_SYSSTATUS -// register. -// -//***************************************************************************** -#define SHAMD5_SYSSTATUS_RESETDONE \ - 0x00000001 // Reset done status - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IRQSTATUS -// register. -// -//***************************************************************************** -#define SHAMD5_IRQSTATUS_CONTEXT_READY \ - 0x00000008 // Context Ready Status -#define SHAMD5_IRQSTATUS_INPUT_READY \ - 0x00000002 // Input Ready Status -#define SHAMD5_IRQSTATUS_OUTPUT_READY \ - 0x00000001 // Output Ready Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_IRQENABLE -// register. -// -//***************************************************************************** -#define SHAMD5_IRQENABLE_CONTEXT_READY \ - 0x00000008 // Mask for context ready interrupt -#define SHAMD5_IRQENABLE_INPUT_READY \ - 0x00000002 // Mask for input ready interrupt -#define SHAMD5_IRQENABLE_OUTPUT_READY \ - 0x00000001 // Mask for output ready interrupt - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DMAIM register. -// -//***************************************************************************** -#define SHAMD5_DMAIM_COUT 0x00000004 // Context Out DMA Done Interrupt - // Mask -#define SHAMD5_DMAIM_DIN 0x00000002 // Data In DMA Done Interrupt Mask -#define SHAMD5_DMAIM_CIN 0x00000001 // Context In DMA Done Interrupt - // Mask - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DMARIS -// register. -// -//***************************************************************************** -#define SHAMD5_DMARIS_COUT 0x00000004 // Context Out DMA Done Raw - // Interrupt Status -#define SHAMD5_DMARIS_DIN 0x00000002 // Data In DMA Done Raw Interrupt - // Status -#define SHAMD5_DMARIS_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DMAMIS -// register. -// -//***************************************************************************** -#define SHAMD5_DMAMIS_COUT 0x00000004 // Context Out DMA Done Masked - // Interrupt Status -#define SHAMD5_DMAMIS_DIN 0x00000002 // Data In DMA Done Masked - // Interrupt Status -#define SHAMD5_DMAMIS_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the SHAMD5_O_DMAIC register. -// -//***************************************************************************** -#define SHAMD5_DMAIC_COUT 0x00000004 // Context Out DMA Done Masked - // Interrupt Status -#define SHAMD5_DMAIC_DIN 0x00000002 // Data In DMA Done Interrupt Clear -#define SHAMD5_DMAIC_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_6 register. -// -//***************************************************************************** -#define AES_KEY2_6_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_6_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_7 register. -// -//***************************************************************************** -#define AES_KEY2_7_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_7_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_4 register. -// -//***************************************************************************** -#define AES_KEY2_4_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_4_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_5 register. -// -//***************************************************************************** -#define AES_KEY2_5_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_5_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_2 register. -// -//***************************************************************************** -#define AES_KEY2_2_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_2_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_3 register. -// -//***************************************************************************** -#define AES_KEY2_3_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_3_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_0 register. -// -//***************************************************************************** -#define AES_KEY2_0_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_0_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY2_1 register. -// -//***************************************************************************** -#define AES_KEY2_1_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY2_1_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_6 register. -// -//***************************************************************************** -#define AES_KEY1_6_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_6_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_7 register. -// -//***************************************************************************** -#define AES_KEY1_7_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_7_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_4 register. -// -//***************************************************************************** -#define AES_KEY1_4_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_4_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_5 register. -// -//***************************************************************************** -#define AES_KEY1_5_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_5_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_2 register. -// -//***************************************************************************** -#define AES_KEY1_2_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_2_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_3 register. -// -//***************************************************************************** -#define AES_KEY1_3_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_3_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_0 register. -// -//***************************************************************************** -#define AES_KEY1_0_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_0_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_KEY1_1 register. -// -//***************************************************************************** -#define AES_KEY1_1_KEY_M 0xFFFFFFFF // Key Data -#define AES_KEY1_1_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_IV_IN_0 register. -// -//***************************************************************************** -#define AES_IV_IN_0_DATA_M 0xFFFFFFFF // Initialization Vector Input -#define AES_IV_IN_0_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_IV_IN_1 register. -// -//***************************************************************************** -#define AES_IV_IN_1_DATA_M 0xFFFFFFFF // Initialization Vector Input -#define AES_IV_IN_1_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_IV_IN_2 register. -// -//***************************************************************************** -#define AES_IV_IN_2_DATA_M 0xFFFFFFFF // Initialization Vector Input -#define AES_IV_IN_2_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_IV_IN_3 register. -// -//***************************************************************************** -#define AES_IV_IN_3_DATA_M 0xFFFFFFFF // Initialization Vector Input -#define AES_IV_IN_3_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_CTRL register. -// -//***************************************************************************** -#define AES_CTRL_CTXTRDY 0x80000000 // Context Data Registers Ready -#define AES_CTRL_SVCTXTRDY 0x40000000 // AES TAG/IV Block(s) Ready -#define AES_CTRL_SAVE_CONTEXT 0x20000000 // TAG or Result IV Save -#define AES_CTRL_CCM_M_M 0x01C00000 // Counter with CBC-MAC (CCM) -#define AES_CTRL_CCM_L_M 0x00380000 // L Value -#define AES_CTRL_CCM_L_2 0x00080000 // width = 2 -#define AES_CTRL_CCM_L_4 0x00180000 // width = 4 -#define AES_CTRL_CCM_L_8 0x00380000 // width = 8 -#define AES_CTRL_CCM 0x00040000 // AES-CCM Mode Enable -#define AES_CTRL_GCM_M 0x00030000 // AES-GCM Mode Enable -#define AES_CTRL_GCM_NOP 0x00000000 // No operation -#define AES_CTRL_GCM_HLY0ZERO 0x00010000 // GHASH with H loaded and - // Y0-encrypted forced to zero -#define AES_CTRL_GCM_HLY0CALC 0x00020000 // GHASH with H loaded and - // Y0-encrypted calculated - // internally -#define AES_CTRL_GCM_HY0CALC 0x00030000 // Autonomous GHASH (both H and - // Y0-encrypted calculated - // internally) -#define AES_CTRL_CBCMAC 0x00008000 // AES-CBC MAC Enable -#define AES_CTRL_F9 0x00004000 // AES f9 Mode Enable -#define AES_CTRL_F8 0x00002000 // AES f8 Mode Enable -#define AES_CTRL_XTS_M 0x00001800 // AES-XTS Operation Enabled -#define AES_CTRL_XTS_NOP 0x00000000 // No operation -#define AES_CTRL_XTS_TWEAKJL 0x00000800 // Previous/intermediate tweak - // value and j loaded (value is - // loaded via IV, j is loaded via - // the AAD length register) -#define AES_CTRL_XTS_K2IJL 0x00001000 // Key2, n and j are loaded (n is - // loaded via IV, j is loaded via - // the AAD length register) -#define AES_CTRL_XTS_K2ILJ0 0x00001800 // Key2 and n are loaded; j=0 (n is - // loaded via IV) -#define AES_CTRL_CFB 0x00000400 // Full block AES cipher feedback - // mode (CFB128) Enable -#define AES_CTRL_ICM 0x00000200 // AES Integer Counter Mode (ICM) - // Enable -#define AES_CTRL_CTR_WIDTH_M 0x00000180 // AES-CTR Mode Counter Width -#define AES_CTRL_CTR_WIDTH_32 0x00000000 // Counter is 32 bits -#define AES_CTRL_CTR_WIDTH_64 0x00000080 // Counter is 64 bits -#define AES_CTRL_CTR_WIDTH_96 0x00000100 // Counter is 96 bits -#define AES_CTRL_CTR_WIDTH_128 0x00000180 // Counter is 128 bits -#define AES_CTRL_CTR 0x00000040 // Counter Mode -#define AES_CTRL_MODE 0x00000020 // ECB/CBC Mode -#define AES_CTRL_KEY_SIZE_M 0x00000018 // Key Size -#define AES_CTRL_KEY_SIZE_128 0x00000008 // Key is 128 bits -#define AES_CTRL_KEY_SIZE_192 0x00000010 // Key is 192 bits -#define AES_CTRL_KEY_SIZE_256 0x00000018 // Key is 256 bits -#define AES_CTRL_DIRECTION 0x00000004 // Encryption/Decryption Selection -#define AES_CTRL_INPUT_READY 0x00000002 // Input Ready Status -#define AES_CTRL_OUTPUT_READY 0x00000001 // Output Ready Status -#define AES_CTRL_CCM_M_S 22 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_C_LENGTH_0 -// register. -// -//***************************************************************************** -#define AES_C_LENGTH_0_LENGTH_M 0xFFFFFFFF // Data Length -#define AES_C_LENGTH_0_LENGTH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_C_LENGTH_1 -// register. -// -//***************************************************************************** -#define AES_C_LENGTH_1_LENGTH_M 0xFFFFFFFF // Data Length -#define AES_C_LENGTH_1_LENGTH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_AUTH_LENGTH -// register. -// -//***************************************************************************** -#define AES_AUTH_LENGTH_AUTH_M 0xFFFFFFFF // Authentication Data Length -#define AES_AUTH_LENGTH_AUTH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DATA_IN_0 -// register. -// -//***************************************************************************** -#define AES_DATA_IN_0_DATA_M 0xFFFFFFFF // Secure Data RW - // Plaintext/Ciphertext -#define AES_DATA_IN_0_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DATA_IN_1 -// register. -// -//***************************************************************************** -#define AES_DATA_IN_1_DATA_M 0xFFFFFFFF // Secure Data RW - // Plaintext/Ciphertext -#define AES_DATA_IN_1_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DATA_IN_2 -// register. -// -//***************************************************************************** -#define AES_DATA_IN_2_DATA_M 0xFFFFFFFF // Secure Data RW - // Plaintext/Ciphertext -#define AES_DATA_IN_2_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DATA_IN_3 -// register. -// -//***************************************************************************** -#define AES_DATA_IN_3_DATA_M 0xFFFFFFFF // Secure Data RW - // Plaintext/Ciphertext -#define AES_DATA_IN_3_DATA_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_TAG_OUT_0 -// register. -// -//***************************************************************************** -#define AES_TAG_OUT_0_HASH_M 0xFFFFFFFF // Hash Result -#define AES_TAG_OUT_0_HASH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_TAG_OUT_1 -// register. -// -//***************************************************************************** -#define AES_TAG_OUT_1_HASH_M 0xFFFFFFFF // Hash Result -#define AES_TAG_OUT_1_HASH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_TAG_OUT_2 -// register. -// -//***************************************************************************** -#define AES_TAG_OUT_2_HASH_M 0xFFFFFFFF // Hash Result -#define AES_TAG_OUT_2_HASH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_TAG_OUT_3 -// register. -// -//***************************************************************************** -#define AES_TAG_OUT_3_HASH_M 0xFFFFFFFF // Hash Result -#define AES_TAG_OUT_3_HASH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_REVISION register. -// -//***************************************************************************** -#define AES_REVISION_M 0xFFFFFFFF // Revision number -#define AES_REVISION_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_SYSCONFIG -// register. -// -//***************************************************************************** -#define AES_SYSCONFIG_K3 0x00001000 // K3 Select -#define AES_SYSCONFIG_KEYENC 0x00000800 // Key Encoding -#define AES_SYSCONFIG_MAP_CONTEXT_OUT_ON_DATA_OUT \ - 0x00000200 // Map Context Out on Data Out - // Enable -#define AES_SYSCONFIG_DMA_REQ_CONTEXT_OUT_EN \ - 0x00000100 // DMA Request Context Out Enable -#define AES_SYSCONFIG_DMA_REQ_CONTEXT_IN_EN \ - 0x00000080 // DMA Request Context In Enable -#define AES_SYSCONFIG_DMA_REQ_DATA_OUT_EN \ - 0x00000040 // DMA Request Data Out Enable -#define AES_SYSCONFIG_DMA_REQ_DATA_IN_EN \ - 0x00000020 // DMA Request Data In Enable -#define AES_SYSCONFIG_SOFTRESET 0x00000002 // Soft reset - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_SYSSTATUS -// register. -// -//***************************************************************************** -#define AES_SYSSTATUS_RESETDONE 0x00000001 // Reset Done - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_IRQSTATUS -// register. -// -//***************************************************************************** -#define AES_IRQSTATUS_CONTEXT_OUT \ - 0x00000008 // Context Output Interrupt Status -#define AES_IRQSTATUS_DATA_OUT 0x00000004 // Data Out Interrupt Status -#define AES_IRQSTATUS_DATA_IN 0x00000002 // Data In Interrupt Status -#define AES_IRQSTATUS_CONTEXT_IN \ - 0x00000001 // Context In Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_IRQENABLE -// register. -// -//***************************************************************************** -#define AES_IRQENABLE_CONTEXT_OUT \ - 0x00000008 // Context Out Interrupt Enable -#define AES_IRQENABLE_DATA_OUT 0x00000004 // Data Out Interrupt Enable -#define AES_IRQENABLE_DATA_IN 0x00000002 // Data In Interrupt Enable -#define AES_IRQENABLE_CONTEXT_IN \ - 0x00000001 // Context In Interrupt Enable - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DIRTYBITS -// register. -// -//***************************************************************************** -#define AES_DIRTYBITS_S_DIRTY 0x00000002 // AES Dirty Bit -#define AES_DIRTYBITS_S_ACCESS 0x00000001 // AES Access Bit - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DMAIM register. -// -//***************************************************************************** -#define AES_DMAIM_DOUT 0x00000008 // Data Out DMA Done Interrupt Mask -#define AES_DMAIM_DIN 0x00000004 // Data In DMA Done Interrupt Mask -#define AES_DMAIM_COUT 0x00000002 // Context Out DMA Done Interrupt - // Mask -#define AES_DMAIM_CIN 0x00000001 // Context In DMA Done Interrupt - // Mask - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DMARIS register. -// -//***************************************************************************** -#define AES_DMARIS_DOUT 0x00000008 // Data Out DMA Done Raw Interrupt - // Status -#define AES_DMARIS_DIN 0x00000004 // Data In DMA Done Raw Interrupt - // Status -#define AES_DMARIS_COUT 0x00000002 // Context Out DMA Done Raw - // Interrupt Status -#define AES_DMARIS_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DMAMIS register. -// -//***************************************************************************** -#define AES_DMAMIS_DOUT 0x00000008 // Data Out DMA Done Masked - // Interrupt Status -#define AES_DMAMIS_DIN 0x00000004 // Data In DMA Done Masked - // Interrupt Status -#define AES_DMAMIS_COUT 0x00000002 // Context Out DMA Done Masked - // Interrupt Status -#define AES_DMAMIS_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the AES_O_DMAIC register. -// -//***************************************************************************** -#define AES_DMAIC_DOUT 0x00000008 // Data Out DMA Done Interrupt - // Clear -#define AES_DMAIC_DIN 0x00000004 // Data In DMA Done Interrupt Clear -#define AES_DMAIC_COUT 0x00000002 // Context Out DMA Done Masked - // Interrupt Status -#define AES_DMAIC_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_KEY3_L register. -// -//***************************************************************************** -#define DES_KEY3_L_KEY_M 0xFFFFFFFF // Key Data -#define DES_KEY3_L_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_KEY3_H register. -// -//***************************************************************************** -#define DES_KEY3_H_KEY_M 0xFFFFFFFF // Key Data -#define DES_KEY3_H_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_KEY2_L register. -// -//***************************************************************************** -#define DES_KEY2_L_KEY_M 0xFFFFFFFF // Key Data -#define DES_KEY2_L_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_KEY2_H register. -// -//***************************************************************************** -#define DES_KEY2_H_KEY_M 0xFFFFFFFF // Key Data -#define DES_KEY2_H_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_KEY1_L register. -// -//***************************************************************************** -#define DES_KEY1_L_KEY_M 0xFFFFFFFF // Key Data -#define DES_KEY1_L_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_KEY1_H register. -// -//***************************************************************************** -#define DES_KEY1_H_KEY_M 0xFFFFFFFF // Key Data -#define DES_KEY1_H_KEY_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_IV_L register. -// -//***************************************************************************** -#define DES_IV_L_M 0xFFFFFFFF // Initialization vector for CBC, - // CFB modes (LSW) -#define DES_IV_L_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_IV_H register. -// -//***************************************************************************** -#define DES_IV_H_M 0xFFFFFFFF // Initialization vector for CBC, - // CFB modes (MSW) -#define DES_IV_H_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_CTRL register. -// -//***************************************************************************** -#define DES_CTRL_CONTEXT 0x80000000 // If 1, this read-only status bit - // indicates that the context data - // registers can be overwritten and - // the host is permitted to write - // the next context -#define DES_CTRL_MODE_M 0x00000030 // Select CBC, ECB or CFB mode0x0: - // ECB mode0x1: CBC mode0x2: CFB - // mode0x3: reserved -#define DES_CTRL_TDES 0x00000008 // Select DES or triple DES - // encryption/decryption -#define DES_CTRL_DIRECTION 0x00000004 // Select encryption/decryption - // 0x0: decryption is selected0x1: - // Encryption is selected -#define DES_CTRL_INPUT_READY 0x00000002 // When 1, ready to encrypt/decrypt - // data -#define DES_CTRL_OUTPUT_READY 0x00000001 // When 1, Data decrypted/encrypted - // ready -#define DES_CTRL_MODE_S 4 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_LENGTH register. -// -//***************************************************************************** -#define DES_LENGTH_M 0xFFFFFFFF // Cryptographic data length in - // bytes for all modes -#define DES_LENGTH_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DATA_L register. -// -//***************************************************************************** -#define DES_DATA_L_M 0xFFFFFFFF // Data for encryption/decryption, - // LSW -#define DES_DATA_L_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DATA_H register. -// -//***************************************************************************** -#define DES_DATA_H_M 0xFFFFFFFF // Data for encryption/decryption, - // MSW -#define DES_DATA_H_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_REVISION register. -// -//***************************************************************************** -#define DES_REVISION_M 0xFFFFFFFF // Revision number -#define DES_REVISION_S 0 - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_SYSCONFIG -// register. -// -//***************************************************************************** -#define DES_SYSCONFIG_DMA_REQ_CONTEXT_IN_EN \ - 0x00000080 // DMA Request Context In Enable -#define DES_SYSCONFIG_DMA_REQ_DATA_OUT_EN \ - 0x00000040 // DMA Request Data Out Enable -#define DES_SYSCONFIG_DMA_REQ_DATA_IN_EN \ - 0x00000020 // DMA Request Data In Enable -#define DES_SYSCONFIG_SIDLE_M 0x0000000C // Sidle mode -#define DES_SYSCONFIG_SIDLE_FORCE \ - 0x00000000 // Force-idle mode -#define DES_SYSCONFIG_SOFTRESET 0x00000002 // Soft reset - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_SYSSTATUS -// register. -// -//***************************************************************************** -#define DES_SYSSTATUS_RESETDONE 0x00000001 // Reset Done - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_IRQSTATUS -// register. -// -//***************************************************************************** -#define DES_IRQSTATUS_DATA_OUT 0x00000004 // This bit indicates data output - // interrupt is active and triggers - // the interrupt output -#define DES_IRQSTATUS_DATA_IN 0x00000002 // This bit indicates data input - // interrupt is active and triggers - // the interrupt output -#define DES_IRQSTATUS_CONTEX_IN 0x00000001 // This bit indicates context - // interrupt is active and triggers - // the interrupt output - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_IRQENABLE -// register. -// -//***************************************************************************** -#define DES_IRQENABLE_M_DATA_OUT \ - 0x00000004 // If this bit is set to 1 the data - // output interrupt is enabled -#define DES_IRQENABLE_M_DATA_IN 0x00000002 // If this bit is set to 1 the data - // input interrupt is enabled -#define DES_IRQENABLE_M_CONTEX_IN \ - 0x00000001 // If this bit is set to 1 the - // context interrupt is enabled - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DIRTYBITS -// register. -// -//***************************************************************************** -#define DES_DIRTYBITS_S_DIRTY 0x00000002 // This bit is set to 1 by the - // module if any of the DES_* - // registers is written -#define DES_DIRTYBITS_S_ACCESS 0x00000001 // This bit is set to 1 by the - // module if any of the DES_* - // registers is read - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DMAIM register. -// -//***************************************************************************** -#define DES_DMAIM_DOUT 0x00000004 // Data Out DMA Done Interrupt Mask -#define DES_DMAIM_DIN 0x00000002 // Data In DMA Done Interrupt Mask -#define DES_DMAIM_CIN 0x00000001 // Context In DMA Done Interrupt - // Mask - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DMARIS register. -// -//***************************************************************************** -#define DES_DMARIS_DOUT 0x00000004 // Data Out DMA Done Raw Interrupt - // Status -#define DES_DMARIS_DIN 0x00000002 // Data In DMA Done Raw Interrupt - // Status -#define DES_DMARIS_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DMAMIS register. -// -//***************************************************************************** -#define DES_DMAMIS_DOUT 0x00000004 // Data Out DMA Done Masked - // Interrupt Status -#define DES_DMAMIS_DIN 0x00000002 // Data In DMA Done Masked - // Interrupt Status -#define DES_DMAMIS_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - -//***************************************************************************** -// -// The following are defines for the bit fields in the DES_O_DMAIC register. -// -//***************************************************************************** -#define DES_DMAIC_DOUT 0x00000004 // Data Out DMA Done Interrupt - // Clear -#define DES_DMAIC_DIN 0x00000002 // Data In DMA Done Interrupt Clear -#define DES_DMAIC_CIN 0x00000001 // Context In DMA Done Raw - // Interrupt Status - //***************************************************************************** // // The following are defines for the bit fields in the NVIC_ACTLR register. @@ -17260,4 +15609,4 @@ #endif -#endif // __TM4C129XNCZAD_H__ +#endif // __TM4C1294NCPDT_H__ From a61d228b764baa422ad39dc14f91e80f225369df Mon Sep 17 00:00:00 2001 From: Bright Pan Date: Tue, 10 Mar 2015 18:07:33 +0800 Subject: [PATCH 06/10] Nanopb is a plain-C implementation of Google's Protocol Buffers data format. It is targeted at 32 bit microcontrollers, but is also fit for other embedded systems with tight (2-10 kB ROM, <1 kB RAM) memory constraints.(http://koti.kapsi.fi/jpa/nanopb/) How to use the example: 1. move examples/nanopb to bsp/xxxx/ 2. enable macro RT_USING_NANOPB in rtconfig.h 3. regenerate the project file (scons --target=xxxx) 4. rebuild the project --- bsp/stm32f10x/rtconfig.h | 3 + components/external/nanopb/CHANGELOG.txt | 183 ++++ components/external/nanopb/README.txt | 61 ++ components/external/nanopb/SConscript | 14 + components/external/nanopb/pb.h | 518 ++++++++++ components/external/nanopb/pb_common.c | 90 ++ components/external/nanopb/pb_common.h | 42 + components/external/nanopb/pb_decode.c | 1165 ++++++++++++++++++++++ components/external/nanopb/pb_decode.h | 149 +++ components/external/nanopb/pb_encode.c | 664 ++++++++++++ components/external/nanopb/pb_encode.h | 154 +++ examples/nanopb/SConscript | 13 + examples/nanopb/simple.c | 73 ++ examples/nanopb/simple.options | 1 + examples/nanopb/simple.pb.c | 18 + examples/nanopb/simple.pb.h | 45 + examples/nanopb/simple.proto | 10 + 17 files changed, 3203 insertions(+) create mode 100644 components/external/nanopb/CHANGELOG.txt create mode 100644 components/external/nanopb/README.txt create mode 100644 components/external/nanopb/SConscript create mode 100644 components/external/nanopb/pb.h create mode 100644 components/external/nanopb/pb_common.c create mode 100644 components/external/nanopb/pb_common.h create mode 100644 components/external/nanopb/pb_decode.c create mode 100644 components/external/nanopb/pb_decode.h create mode 100644 components/external/nanopb/pb_encode.c create mode 100644 components/external/nanopb/pb_encode.h create mode 100644 examples/nanopb/SConscript create mode 100644 examples/nanopb/simple.c create mode 100644 examples/nanopb/simple.options create mode 100644 examples/nanopb/simple.pb.c create mode 100644 examples/nanopb/simple.pb.h create mode 100644 examples/nanopb/simple.proto diff --git a/bsp/stm32f10x/rtconfig.h b/bsp/stm32f10x/rtconfig.h index 1223f3dfb5..6e1aee4eaa 100644 --- a/bsp/stm32f10x/rtconfig.h +++ b/bsp/stm32f10x/rtconfig.h @@ -184,4 +184,7 @@ // // #define RT_USING_BSP_CMSIS +/* nanopb support */ +/* #define RT_USING_NANOPB */ + #endif diff --git a/components/external/nanopb/CHANGELOG.txt b/components/external/nanopb/CHANGELOG.txt new file mode 100644 index 0000000000..6087a29fd5 --- /dev/null +++ b/components/external/nanopb/CHANGELOG.txt @@ -0,0 +1,183 @@ +nanopb-0.3.1 (2014-09-11) + Fix security issue due to size_t overflows. (issue 132) + Fix memory leak with duplicated fields and PB_ENABLE_MALLOC + Fix crash if pb_release() is called twice. + Fix cyclic message support (issue 130) + Fix error in generated initializers for repeated pointer fields. + Improve tests (issues 113, 126) + +nanopb-0.3.0 (2014-08-26) + NOTE: See docs/migration.html or online at + http://koti.kapsi.fi/~jpa/nanopb/docs/migration.html + for changes in this version. Most importantly, you need to add + pb_common.c to the list of files to compile. + + Separated field iterator logic to pb_common.c (issue 128) + Change the _count fields to use pb_size_t datatype (issue 82) + Added PB_ prefix to macro names (issue 106) + Added #if version guard to generated files (issue 129) + Added migration document + +nanopb-0.2.9 (2014-08-09) + NOTE: If you are using the -e option with the generator, you have + to prepend . to the argument to get the same behaviour as before. + + Do not automatically add a dot with generator -e option. (issue 122) + Fix problem with .options file and extension fields. (issue 125) + Don't use SIZE_MAX macro, as it is not in C89. (issue 120) + Generate #defines for initializing message structures. (issue 79) + Add skip_message option to generator. (issue 121) + Add PB_PACKED_STRUCT support for Keil MDK-ARM toolchain (issue 119) + Give better messages about the .options file path. (issue 124) + Improved tests + +nanopb-0.2.8 (2014-05-20) + Fix security issue with PB_ENABLE_MALLOC. (issue 117) + Add option to not add timestamps to .pb.h and .pb.c preambles. (issue 115) + Documentation updates + Improved tests + +nanopb-0.2.7 (2014-04-07) + Fix bug with default values for extension fields (issue 111) + Fix some MISRA-C warnings (issue 91) + Implemented optional malloc() support (issue 80) + Changed pointer-type bytes field datatype + Add a "found" field to pb_extension_t (issue 112) + Add convenience function pb_get_encoded_size() (issue 16) + +nanopb-0.2.6 (2014-02-15) + Fix generator error with bytes callback fields (issue 99) + Fix warnings about large integer constants (issue 102) + Add comments to where STATIC_ASSERT is used (issue 96) + Add warning about unknown field names on .options (issue 105) + Move descriptor.proto to google/protobuf subdirectory (issue 104) + Improved tests + +nanopb-0.2.5 (2014-01-01) + Fix a bug with encoding negative values in int32 fields (issue 97) + Create binary packages of the generator + dependencies (issue 47) + Add support for pointer-type fields to the encoder (part of issue 80) + Fixed path in FindNanopb.cmake (issue 94) + Improved tests + +nanopb-0.2.4 (2013-11-07) + Remove the deprecated NANOPB_INTERNALS functions from public API. + Document the security model. + Check array and bytes max sizes when encoding (issue 90) + Add #defines for maximum encoded message size (issue 89) + Add #define tags for extension fields (issue 93) + Fix MISRA C violations (issue 91) + Clean up pb_field_t definition with typedefs. + +nanopb-0.2.3 (2013-09-18) + Improve compatibility by removing ternary operator from initializations (issue 88) + Fix build error on Visual C++ (issue 84, patch by Markus Schwarzenberg) + Don't stop on unsupported extension fields (issue 83) + Add an example pb_syshdr.h file for non-C99 compilers + Reorganize tests and examples into subfolders (issue 63) + Switch from Makefiles to scons for building the tests + Make the tests buildable on Windows + +nanopb-0.2.2 (2013-08-18) + Add support for extension fields (issue 17) + Fix unknown fields in empty message (issue 78) + Include the field tags in the generated .pb.h file. + Add pb_decode_delimited and pb_encode_delimited wrapper functions (issue 74) + Add a section in top of pb.h for changing compilation settings (issue 76) + Documentation improvements (issues 12, 77 and others) + Improved tests + +nanopb-0.2.1 (2013-04-14) + NOTE: The default callback function signature has changed. + If you don't want to update your code, define PB_OLD_CALLBACK_STYLE. + + Change the callback function to use void** (issue 69) + Add support for defining the nanopb options in a separate file (issue 12) + Add support for packed structs in IAR and MSVC (in addition to GCC) (issue 66) + Implement error message support for the encoder side (issue 7) + Handle unterminated strings when encoding (issue 68) + Fix bug with empty strings in repeated string callbacks (issue 73) + Fix regression in 0.2.0 with optional callback fields (issue 70) + Fix bugs with empty message types (issues 64, 65) + Fix some compiler warnings on clang (issue 67) + Some portability improvements (issues 60, 62) + Various new generator options + Improved tests + +nanopb-0.2.0 (2013-03-02) + NOTE: This release requires you to regenerate all .pb.c + files. Files generated by older versions will not + compile anymore. + + Reformat generated .pb.c files using macros (issue 58) + Rename PB_HTYPE_ARRAY -> PB_HTYPE_REPEATED + Separate PB_HTYPE to PB_ATYPE and PB_HTYPE + Move STATIC_ASSERTs to .pb.c file + Added CMake file (by Pavel Ilin) + Add option to give file extension to generator (by Michael Haberler) + Documentation updates + +nanopb-0.1.9 (2013-02-13) + Fixed error message bugs (issues 52, 56) + Sanitize #ifndef filename (issue 50) + Performance improvements + Add compile-time option PB_BUFFER_ONLY + Add Java package name to nanopb.proto + Check for sizeof(double) == 8 (issue 54) + Added generator option to ignore some fields. (issue 51) + Added generator option to make message structs packed. (issue 49) + Add more test cases. + +nanopb-0.1.8 (2012-12-13) + Fix bugs in the enum short names introduced in 0.1.7 (issues 42, 43) + Fix STATIC_ASSERT macro when using multiple .proto files. (issue 41) + Fix missing initialization of istream.errmsg + Make tests/Makefile work for non-gcc compilers (issue 40) + +nanopb-0.1.7 (2012-11-11) + Remove "skip" mode from pb_istream_t callbacks. Example implementation had a bug. (issue 37) + Add option to use shorter names for enum values (issue 38) + Improve options support in generator (issues 12, 30) + Add nanopb version number to generated files (issue 36) + Add extern "C" to generated headers (issue 35) + Add names for structs to allow forward declaration (issue 39) + Add buffer size check in example (issue 34) + Fix build warnings on MS compilers (issue 33) + +nanopb-0.1.6 (2012-09-02) + Reorganize the field decoder interface (issue 2) + Improve performance in submessage decoding (issue 28) + Implement error messages in the decoder side (issue 7) + Extended testcases (alltypes test is now complete). + Fix some compiler warnings (issues 25, 26, 27, 32). + +nanopb-0.1.5 (2012-08-04) + Fix bug in decoder with packed arrays (issue 23). + Extended testcases. + Fix some compiler warnings. + +nanopb-0.1.4 (2012-07-05) + Add compile-time options for easy-to-use >255 field support. + Improve the detection of missing required fields. + Added example on how to handle union messages. + Fix generator error with .proto without messages. + Fix problems that stopped the code from compiling with some compilers. + Fix some compiler warnings. + +nanopb-0.1.3 (2012-06-12) + Refactor the field encoder interface. + Improve generator error messages (issue 5) + Add descriptor.proto into the #include exclusion list + Fix some compiler warnings. + +nanopb-0.1.2 (2012-02-15) + Make the generator to generate include for other .proto files (issue 4). + Fixed generator not working on Windows (issue 3) + +nanopb-0.1.1 (2012-01-14) + Fixed bug in encoder with 'bytes' fields (issue 1). + Fixed a bug in the generator that caused a compiler error on sfixed32 and sfixed64 fields. + Extended testcases. + +nanopb-0.1.0 (2012-01-06) + First stable release. diff --git a/components/external/nanopb/README.txt b/components/external/nanopb/README.txt new file mode 100644 index 0000000000..0f2ade8bd7 --- /dev/null +++ b/components/external/nanopb/README.txt @@ -0,0 +1,61 @@ +Nanopb is a small code-size Protocol Buffers implementation in ansi C. It is +especially suitable for use in microcontrollers, but fits any memory +restricted system. + +Homepage: http://kapsi.fi/~jpa/nanopb/ + + + + +Using the nanopb library +======================== +To use the nanopb library, you need to do two things: + +1) Compile your .proto files for nanopb, using protoc. +2) Include pb_encode.c and pb_decode.c in your project. + +The easiest way to get started is to study the project in "examples/simple". +It contains a Makefile, which should work directly under most Linux systems. +However, for any other kind of build system, see the manual steps in +README.txt in that folder. + + + +Using the Protocol Buffers compiler (protoc) +============================================ +The nanopb generator is implemented as a plugin for the Google's own protoc +compiler. This has the advantage that there is no need to reimplement the +basic parsing of .proto files. However, it does mean that you need the +Google's protobuf library in order to run the generator. + +If you have downloaded a binary package for nanopb (either Windows, Linux or +Mac OS X version), the 'protoc' binary is included in the 'generator-bin' +folder. In this case, you are ready to go. Simply run this command: + + generator-bin/protoc --nanopb_out=. myprotocol.proto + +However, if you are using a git checkout or a plain source distribution, you +need to provide your own version of protoc and the Google's protobuf library. +On Linux, the necessary packages are protobuf-compiler and python-protobuf. +On Windows, you can either build Google's protobuf library from source or use +one of the binary distributions of it. In either case, if you use a separate +protoc, you need to manually give the path to nanopb generator: + + protoc --plugin=protoc-gen-nanopb=nanopb/generator/protoc-gen-nanopb ... + + + +Running the tests +================= +If you want to perform further development of the nanopb core, or to verify +its functionality using your compiler and platform, you'll want to run the +test suite. The build rules for the test suite are implemented using Scons, +so you need to have that installed. To run the tests: + + cd tests + scons + +This will show the progress of various test cases. If the output does not +end in an error, the test cases were successful. + + diff --git a/components/external/nanopb/SConscript b/components/external/nanopb/SConscript new file mode 100644 index 0000000000..66cf05fb5a --- /dev/null +++ b/components/external/nanopb/SConscript @@ -0,0 +1,14 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +src = Split(''' +pb_common.c +pb_decode.c +pb_encode.c +''') +CPPPATH = [RTT_ROOT + '/components/external/nanopb'] + +group = DefineGroup('Nanopb', src, depend = ['RT_USING_NANOPB'], CPPPATH = CPPPATH) + +Return('group') \ No newline at end of file diff --git a/components/external/nanopb/pb.h b/components/external/nanopb/pb.h new file mode 100644 index 0000000000..7523b95eca --- /dev/null +++ b/components/external/nanopb/pb.h @@ -0,0 +1,518 @@ +/* Common parts of the nanopb library. Most of these are quite low-level + * stuff. For the high-level interface, see pb_encode.h and pb_decode.h. + */ + +#ifndef PB_H_INCLUDED +#define PB_H_INCLUDED + +/***************************************************************** + * Nanopb compilation time options. You can change these here by * + * uncommenting the lines, or on the compiler command line. * + *****************************************************************/ + +/* Enable support for dynamically allocated fields */ +/* #define PB_ENABLE_MALLOC 1 */ + +/* Define this if your CPU architecture is big endian, i.e. it + * stores the most-significant byte first. */ +/* #define __BIG_ENDIAN__ 1 */ + +/* Increase the number of required fields that are tracked. + * A compiler warning will tell if you need this. */ +#define PB_MAX_REQUIRED_FIELDS 256 + +/* Add support for tag numbers > 255 and fields larger than 255 bytes. */ +#define PB_FIELD_16BIT 1 + +/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ +/* #define PB_FIELD_32BIT 1 */ + +/* Disable support for error messages in order to save some code space. */ +/* #define PB_NO_ERRMSG 1 */ + +/* Disable support for custom streams (support only memory buffers). */ +/* #define PB_BUFFER_ONLY 1 */ + +/* Switch back to the old-style callback function signature. + * This was the default until nanopb-0.2.1. */ +/* #define PB_OLD_CALLBACK_STYLE */ + + +/****************************************************************** + * You usually don't need to change anything below this line. * + * Feel free to look around and use the defined macros, though. * + ******************************************************************/ + + +/* Version of the nanopb library. Just in case you want to check it in + * your own program. */ +#define NANOPB_VERSION nanopb-0.3.1 + +/* Include all the system headers needed by nanopb. You will need the + * definitions of the following: + * - strlen, memcpy, memset functions + * - [u]int8_t, [u]int16_t, [u]int32_t, [u]int64_t + * - size_t + * - bool + * + * If you don't have the standard header files, you can instead provide + * a custom header that defines or includes all this. In that case, + * define PB_SYSTEM_HEADER to the path of this file. + */ +#ifdef PB_SYSTEM_HEADER +#include PB_SYSTEM_HEADER +#else +#include +#include +#include +#include + +#ifdef PB_ENABLE_MALLOC +#include +#endif +#endif + +/* Macro for defining packed structures (compiler dependent). + * This just reduces memory requirements, but is not required. + */ +#if defined(__GNUC__) || defined(__clang__) + /* For GCC and clang */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed __attribute__((packed)) +#elif defined(__ICCARM__) || defined(__CC_ARM) + /* For IAR ARM and Keil MDK-ARM compilers */ +# define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") +# define PB_PACKED_STRUCT_END _Pragma("pack(pop)") +# define pb_packed +#elif defined(_MSC_VER) && (_MSC_VER >= 1500) + /* For Microsoft Visual C++ */ +# define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) +# define PB_PACKED_STRUCT_END __pragma(pack(pop)) +# define pb_packed +#else + /* Unknown compiler */ +# define PB_PACKED_STRUCT_START +# define PB_PACKED_STRUCT_END +# define pb_packed +#endif + +/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ +#ifndef PB_UNUSED +#define PB_UNUSED(x) (void)(x) +#endif + +/* Compile-time assertion, used for checking compatible compilation options. + * If this does not work properly on your compiler, use + * #define PB_NO_STATIC_ASSERT to disable it. + * + * But before doing that, check carefully the error message / place where it + * comes from to see if the error has a real cause. Unfortunately the error + * message is not always very clear to read, but you can see the reason better + * in the place where the PB_STATIC_ASSERT macro was called. + */ +#ifndef PB_NO_STATIC_ASSERT +#ifndef PB_STATIC_ASSERT +#define PB_STATIC_ASSERT(COND,MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND)?1:-1]; +#define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) +#define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##LINE##COUNTER +#endif +#else +#define PB_STATIC_ASSERT(COND,MSG) +#endif + +/* Number of required fields to keep track of. */ +#ifndef PB_MAX_REQUIRED_FIELDS +#define PB_MAX_REQUIRED_FIELDS 64 +#endif + +#if PB_MAX_REQUIRED_FIELDS < 64 +#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). +#endif + +/* List of possible field types. These are used in the autogenerated code. + * Least-significant 4 bits tell the scalar type + * Most-significant 4 bits specify repeated/required/packed etc. + */ + +typedef uint8_t pb_type_t; + +/**** Field data types ****/ + +/* Numeric types */ +#define PB_LTYPE_VARINT 0x00 /* int32, int64, enum, bool */ +#define PB_LTYPE_UVARINT 0x01 /* uint32, uint64 */ +#define PB_LTYPE_SVARINT 0x02 /* sint32, sint64 */ +#define PB_LTYPE_FIXED32 0x03 /* fixed32, sfixed32, float */ +#define PB_LTYPE_FIXED64 0x04 /* fixed64, sfixed64, double */ + +/* Marker for last packable field type. */ +#define PB_LTYPE_LAST_PACKABLE 0x04 + +/* Byte array with pre-allocated buffer. + * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ +#define PB_LTYPE_BYTES 0x05 + +/* String with pre-allocated buffer. + * data_size is the maximum length. */ +#define PB_LTYPE_STRING 0x06 + +/* Submessage + * submsg_fields is pointer to field descriptions */ +#define PB_LTYPE_SUBMESSAGE 0x07 + +/* Extension pseudo-field + * The field contains a pointer to pb_extension_t */ +#define PB_LTYPE_EXTENSION 0x08 + +/* Number of declared LTYPES */ +#define PB_LTYPES_COUNT 9 +#define PB_LTYPE_MASK 0x0F + +/**** Field repetition rules ****/ + +#define PB_HTYPE_REQUIRED 0x00 +#define PB_HTYPE_OPTIONAL 0x10 +#define PB_HTYPE_REPEATED 0x20 +#define PB_HTYPE_MASK 0x30 + +/**** Field allocation types ****/ + +#define PB_ATYPE_STATIC 0x00 +#define PB_ATYPE_POINTER 0x80 +#define PB_ATYPE_CALLBACK 0x40 +#define PB_ATYPE_MASK 0xC0 + +#define PB_ATYPE(x) ((x) & PB_ATYPE_MASK) +#define PB_HTYPE(x) ((x) & PB_HTYPE_MASK) +#define PB_LTYPE(x) ((x) & PB_LTYPE_MASK) + +/* Data type used for storing sizes of struct fields + * and array counts. + */ +#if defined(PB_FIELD_32BIT) +#define PB_SIZE_MAX ((uint32_t)-1) + typedef uint32_t pb_size_t; + typedef int32_t pb_ssize_t; +#elif defined(PB_FIELD_16BIT) +#define PB_SIZE_MAX ((uint16_t)-1) + typedef uint16_t pb_size_t; + typedef int16_t pb_ssize_t; +#else +#define PB_SIZE_MAX ((uint8_t)-1) + typedef uint8_t pb_size_t; + typedef int8_t pb_ssize_t; +#endif + +/* This structure is used in auto-generated constants + * to specify struct fields. + * You can change field sizes if you need structures + * larger than 256 bytes or field tags larger than 256. + * The compiler should complain if your .proto has such + * structures. Fix that by defining PB_FIELD_16BIT or + * PB_FIELD_32BIT. + */ +PB_PACKED_STRUCT_START +typedef struct pb_field_s pb_field_t; +struct pb_field_s { + pb_size_t tag; + pb_type_t type; + pb_size_t data_offset; /* Offset of field data, relative to previous field. */ + pb_ssize_t size_offset; /* Offset of array size or has-boolean, relative to data */ + pb_size_t data_size; /* Data size in bytes for a single item */ + pb_size_t array_size; /* Maximum number of entries in array */ + + /* Field definitions for submessage + * OR default value for all other non-array, non-callback types + * If null, then field will zeroed. */ + const void *ptr; +} pb_packed; +PB_PACKED_STRUCT_END + +/* Make sure that the standard integer types are of the expected sizes. + * All kinds of things may break otherwise.. atleast all fixed* types. + * + * If you get errors here, it probably means that your stdint.h is not + * correct for your platform. + */ +PB_STATIC_ASSERT(sizeof(int8_t) == 1, INT8_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(uint8_t) == 1, UINT8_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(int16_t) == 2, INT16_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(uint16_t) == 2, UINT16_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(int32_t) == 4, INT32_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(uint32_t) == 4, UINT32_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(int64_t) == 8, INT64_T_WRONG_SIZE) +PB_STATIC_ASSERT(sizeof(uint64_t) == 8, UINT64_T_WRONG_SIZE) + +/* This structure is used for 'bytes' arrays. + * It has the number of bytes in the beginning, and after that an array. + * Note that actual structs used will have a different length of bytes array. + */ +#define PB_BYTES_ARRAY_T(n) struct { pb_size_t size; uint8_t bytes[n]; } +#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes)) + +struct pb_bytes_array_s { + pb_size_t size; + uint8_t bytes[1]; +}; +typedef struct pb_bytes_array_s pb_bytes_array_t; + +/* This structure is used for giving the callback function. + * It is stored in the message structure and filled in by the method that + * calls pb_decode. + * + * The decoding callback will be given a limited-length stream + * If the wire type was string, the length is the length of the string. + * If the wire type was a varint/fixed32/fixed64, the length is the length + * of the actual value. + * The function may be called multiple times (especially for repeated types, + * but also otherwise if the message happens to contain the field multiple + * times.) + * + * The encoding callback will receive the actual output stream. + * It should write all the data in one call, including the field tag and + * wire type. It can write multiple fields. + * + * The callback can be null if you want to skip a field. + */ +typedef struct pb_istream_s pb_istream_t; +typedef struct pb_ostream_s pb_ostream_t; +typedef struct pb_callback_s pb_callback_t; +struct pb_callback_s { +#ifdef PB_OLD_CALLBACK_STYLE + /* Deprecated since nanopb-0.2.1 */ + union { + bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void *arg); + bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, const void *arg); + } funcs; +#else + /* New function signature, which allows modifying arg contents in callback. */ + union { + bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); + bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void * const *arg); + } funcs; +#endif + + /* Free arg for use by callback */ + void *arg; +}; + +/* Wire types. Library user needs these only in encoder callbacks. */ +typedef enum { + PB_WT_VARINT = 0, + PB_WT_64BIT = 1, + PB_WT_STRING = 2, + PB_WT_32BIT = 5 +} pb_wire_type_t; + +/* Structure for defining the handling of unknown/extension fields. + * Usually the pb_extension_type_t structure is automatically generated, + * while the pb_extension_t structure is created by the user. However, + * if you want to catch all unknown fields, you can also create a custom + * pb_extension_type_t with your own callback. + */ +typedef struct pb_extension_type_s pb_extension_type_t; +typedef struct pb_extension_s pb_extension_t; +struct pb_extension_type_s { + /* Called for each unknown field in the message. + * If you handle the field, read off all of its data and return true. + * If you do not handle the field, do not read anything and return true. + * If you run into an error, return false. + * Set to NULL for default handler. + */ + bool (*decode)(pb_istream_t *stream, pb_extension_t *extension, + uint32_t tag, pb_wire_type_t wire_type); + + /* Called once after all regular fields have been encoded. + * If you have something to write, do so and return true. + * If you do not have anything to write, just return true. + * If you run into an error, return false. + * Set to NULL for default handler. + */ + bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension); + + /* Free field for use by the callback. */ + const void *arg; +}; + +struct pb_extension_s { + /* Type describing the extension field. Usually you'll initialize + * this to a pointer to the automatically generated structure. */ + const pb_extension_type_t *type; + + /* Destination for the decoded data. This must match the datatype + * of the extension field. */ + void *dest; + + /* Pointer to the next extension handler, or NULL. + * If this extension does not match a field, the next handler is + * automatically called. */ + pb_extension_t *next; + + /* The decoder sets this to true if the extension was found. + * Ignored for encoding. */ + bool found; +}; + +/* Memory allocation functions to use. You can define pb_realloc and + * pb_free to custom functions if you want. */ +#ifdef PB_ENABLE_MALLOC +# ifndef pb_realloc +# define pb_realloc(ptr, size) realloc(ptr, size) +# endif +# ifndef pb_free +# define pb_free(ptr) free(ptr) +# endif +#endif + +/* This is used to inform about need to regenerate .pb.h/.pb.c files. */ +#define PB_PROTO_HEADER_VERSION 30 + +/* These macros are used to declare pb_field_t's in the constant array. */ +/* Size of a structure member, in bytes. */ +#define pb_membersize(st, m) (sizeof ((st*)0)->m) +/* Number of entries in an array. */ +#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) +/* Delta from start of one member to the start of another member. */ +#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) +/* Marks the end of the field list */ +#define PB_LAST_FIELD {0,(pb_type_t) 0,0,0,0,0,0} + +/* Macros for filling in the data_offset field */ +/* data_offset for first field in a message */ +#define PB_DATAOFFSET_FIRST(st, m1, m2) (offsetof(st, m1)) +/* data_offset for subsequent fields */ +#define PB_DATAOFFSET_OTHER(st, m1, m2) (offsetof(st, m1) - offsetof(st, m2) - pb_membersize(st, m2)) +/* Choose first/other based on m1 == m2 (deprecated, remains for backwards compatibility) */ +#define PB_DATAOFFSET_CHOOSE(st, m1, m2) (int)(offsetof(st, m1) == offsetof(st, m2) \ + ? PB_DATAOFFSET_FIRST(st, m1, m2) \ + : PB_DATAOFFSET_OTHER(st, m1, m2)) + +/* Required fields are the simplest. They just have delta (padding) from + * previous field end, and the size of the field. Pointer is used for + * submessages and default values. + */ +#define PB_REQUIRED_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +/* Optional fields add the delta to the has_ variable. */ +#define PB_OPTIONAL_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ + fd, \ + pb_delta(st, has_ ## m, m), \ + pb_membersize(st, m), 0, ptr} + +/* Repeated fields have a _count field and also the maximum number of entries. */ +#define PB_REPEATED_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_REPEATED | ltype, \ + fd, \ + pb_delta(st, m ## _count, m), \ + pb_membersize(st, m[0]), \ + pb_arraysize(st, m), ptr} + +/* Allocated fields carry the size of the actual data, not the pointer */ +#define PB_REQUIRED_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Optional fields don't need a has_ variable, as information would be redundant */ +#define PB_OPTIONAL_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m[0]), 0, ptr} + +/* Repeated fields have a _count field and a pointer to array of pointers */ +#define PB_REPEATED_POINTER(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_POINTER | PB_HTYPE_REPEATED | ltype, \ + fd, pb_delta(st, m ## _count, m), \ + pb_membersize(st, m[0]), 0, ptr} + +/* Callbacks are much like required fields except with special datatype. */ +#define PB_REQUIRED_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REQUIRED | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +#define PB_OPTIONAL_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +#define PB_REPEATED_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_REPEATED | ltype, \ + fd, 0, pb_membersize(st, m), 0, ptr} + +/* Optional extensions don't have the has_ field, as that would be redundant. */ +#define PB_OPTEXT_STATIC(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_STATIC | PB_HTYPE_OPTIONAL | ltype, \ + 0, \ + 0, \ + pb_membersize(st, m), 0, ptr} + +#define PB_OPTEXT_CALLBACK(tag, st, m, fd, ltype, ptr) \ + {tag, PB_ATYPE_CALLBACK | PB_HTYPE_OPTIONAL | ltype, \ + 0, 0, pb_membersize(st, m), 0, ptr} + +/* The mapping from protobuf types to LTYPEs is done using these macros. */ +#define PB_LTYPE_MAP_BOOL PB_LTYPE_VARINT +#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES +#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 +#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT +#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 +#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 +#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 +#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT +#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT +#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE +#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 +#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 +#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT +#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT +#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING +#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT +#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT +#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION + +/* This is the actual macro used in field descriptions. + * It takes these arguments: + * - Field tag number + * - Field type: BOOL, BYTES, DOUBLE, ENUM, FIXED32, FIXED64, + * FLOAT, INT32, INT64, MESSAGE, SFIXED32, SFIXED64 + * SINT32, SINT64, STRING, UINT32, UINT64 or EXTENSION + * - Field rules: REQUIRED, OPTIONAL or REPEATED + * - Allocation: STATIC or CALLBACK + * - Placement: FIRST or OTHER, depending on if this is the first field in structure. + * - Message name + * - Field name + * - Previous field name (or field name again for first field) + * - Pointer to default value or submsg fields. + */ + +#define PB_FIELD(tag, type, rules, allocation, placement, message, field, prevfield, ptr) \ + PB_ ## rules ## _ ## allocation(tag, message, field, \ + PB_DATAOFFSET_ ## placement(message, field, prevfield), \ + PB_LTYPE_MAP_ ## type, ptr) + + +/* These macros are used for giving out error messages. + * They are mostly a debugging aid; the main error information + * is the true/false return value from functions. + * Some code space can be saved by disabling the error + * messages if not used. + */ +#ifdef PB_NO_ERRMSG +#define PB_RETURN_ERROR(stream,msg) \ + do {\ + PB_UNUSED(stream); \ + return false; \ + } while(0) +#define PB_GET_ERROR(stream) "(errmsg disabled)" +#else +#define PB_RETURN_ERROR(stream,msg) \ + do {\ + if ((stream)->errmsg == NULL) \ + (stream)->errmsg = (msg); \ + return false; \ + } while(0) +#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") +#endif + +#endif diff --git a/components/external/nanopb/pb_common.c b/components/external/nanopb/pb_common.c new file mode 100644 index 0000000000..a9cade6391 --- /dev/null +++ b/components/external/nanopb/pb_common.c @@ -0,0 +1,90 @@ +/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c. + * + * 2014 Petteri Aimonen + */ + +#include "pb_common.h" + +bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct) +{ + iter->start = fields; + iter->pos = fields; + iter->required_field_index = 0; + iter->dest_struct = dest_struct; + iter->pData = (char*)dest_struct + iter->pos->data_offset; + iter->pSize = (char*)iter->pData + iter->pos->size_offset; + + return (iter->pos->tag != 0); +} + +bool pb_field_iter_next(pb_field_iter_t *iter) +{ + const pb_field_t *prev_field = iter->pos; + + if (prev_field->tag == 0) + { + /* Handle empty message types, where the first field is already the terminator. + * In other cases, the iter->pos never points to the terminator. */ + return false; + } + + iter->pos++; + + if (iter->pos->tag == 0) + { + /* Wrapped back to beginning, reinitialize */ + (void)pb_field_iter_begin(iter, iter->start, iter->dest_struct); + return false; + } + else + { + /* Increment the pointers based on previous field size */ + size_t prev_size = prev_field->data_size; + + if (PB_ATYPE(prev_field->type) == PB_ATYPE_STATIC && + PB_HTYPE(prev_field->type) == PB_HTYPE_REPEATED) + { + /* In static arrays, the data_size tells the size of a single entry and + * array_size is the number of entries */ + prev_size *= prev_field->array_size; + } + else if (PB_ATYPE(prev_field->type) == PB_ATYPE_POINTER) + { + /* Pointer fields always have a constant size in the main structure. + * The data_size only applies to the dynamically allocated area. */ + prev_size = sizeof(void*); + } + + if (PB_HTYPE(prev_field->type) == PB_HTYPE_REQUIRED) + { + /* Count the required fields, in order to check their presence in the + * decoder. */ + iter->required_field_index++; + } + + iter->pData = (char*)iter->pData + prev_size + iter->pos->data_offset; + iter->pSize = (char*)iter->pData + iter->pos->size_offset; + return true; + } +} + +bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag) +{ + const pb_field_t *start = iter->pos; + + do { + if (iter->pos->tag == tag && + PB_LTYPE(iter->pos->type) != PB_LTYPE_EXTENSION) + { + /* Found the wanted field */ + return true; + } + + (void)pb_field_iter_next(iter); + } while (iter->pos != start); + + /* Searched all the way back to start, and found nothing. */ + return false; +} + + diff --git a/components/external/nanopb/pb_common.h b/components/external/nanopb/pb_common.h new file mode 100644 index 0000000000..60b3d37491 --- /dev/null +++ b/components/external/nanopb/pb_common.h @@ -0,0 +1,42 @@ +/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c. + * These functions are rarely needed by applications directly. + */ + +#ifndef PB_COMMON_H_INCLUDED +#define PB_COMMON_H_INCLUDED + +#include "pb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Iterator for pb_field_t list */ +struct pb_field_iter_s { + const pb_field_t *start; /* Start of the pb_field_t array */ + const pb_field_t *pos; /* Current position of the iterator */ + unsigned required_field_index; /* Zero-based index that counts only the required fields */ + void *dest_struct; /* Pointer to start of the structure */ + void *pData; /* Pointer to current field value */ + void *pSize; /* Pointer to count/has field */ +}; +typedef struct pb_field_iter_s pb_field_iter_t; + +/* Initialize the field iterator structure to beginning. + * Returns false if the message type is empty. */ +bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_field_t *fields, void *dest_struct); + +/* Advance the iterator to the next field. + * Returns false when the iterator wraps back to the first field. */ +bool pb_field_iter_next(pb_field_iter_t *iter); + +/* Advance the iterator until it points at a field with the given tag. + * Returns false if no such field exists. */ +bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif + diff --git a/components/external/nanopb/pb_decode.c b/components/external/nanopb/pb_decode.c new file mode 100644 index 0000000000..d1efd1b516 --- /dev/null +++ b/components/external/nanopb/pb_decode.c @@ -0,0 +1,1165 @@ +/* pb_decode.c -- decode a protobuf using minimal resources + * + * 2011 Petteri Aimonen + */ + +/* Use the GCC warn_unused_result attribute to check that all return values + * are propagated correctly. On other compilers and gcc before 3.4.0 just + * ignore the annotation. + */ +#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) + #define checkreturn +#else + #define checkreturn __attribute__((warn_unused_result)) +#endif + +#include "pb.h" +#include "pb_decode.h" +#include "pb_common.h" + +/************************************** + * Declarations internal to this file * + **************************************/ + +typedef bool (*pb_decoder_t)(pb_istream_t *stream, const pb_field_t *field, void *dest) checkreturn; + +static bool checkreturn buf_read(pb_istream_t *stream, uint8_t *buf, size_t count); +static bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest); +static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, uint8_t *buf, size_t *size); +static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type); +static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter); +static bool checkreturn find_extension_field(pb_field_iter_t *iter); +static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct); +static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest); +static bool checkreturn pb_skip_varint(pb_istream_t *stream); +static bool checkreturn pb_skip_string(pb_istream_t *stream); + +#ifdef PB_ENABLE_MALLOC +static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size); +static void pb_release_single_field(const pb_field_iter_t *iter); +#endif + +/* --- Function pointers to field decoders --- + * Order in the array must match pb_action_t LTYPE numbering. + */ +static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT] = { + &pb_dec_varint, + &pb_dec_uvarint, + &pb_dec_svarint, + &pb_dec_fixed32, + &pb_dec_fixed64, + + &pb_dec_bytes, + &pb_dec_string, + &pb_dec_submessage, + NULL /* extensions */ +}; + +/******************************* + * pb_istream_t implementation * + *******************************/ + +static bool checkreturn buf_read(pb_istream_t *stream, uint8_t *buf, size_t count) +{ + uint8_t *source = (uint8_t*)stream->state; + stream->state = source + count; + + if (buf != NULL) + { + while (count--) + *buf++ = *source++; + } + + return true; +} + +bool checkreturn pb_read(pb_istream_t *stream, uint8_t *buf, size_t count) +{ +#ifndef PB_BUFFER_ONLY + if (buf == NULL && stream->callback != buf_read) + { + /* Skip input bytes */ + uint8_t tmp[16]; + while (count > 16) + { + if (!pb_read(stream, tmp, 16)) + return false; + + count -= 16; + } + + return pb_read(stream, tmp, count); + } +#endif + + if (stream->bytes_left < count) + PB_RETURN_ERROR(stream, "end-of-stream"); + +#ifndef PB_BUFFER_ONLY + if (!stream->callback(stream, buf, count)) + PB_RETURN_ERROR(stream, "io error"); +#else + if (!buf_read(stream, buf, count)) + return false; +#endif + + stream->bytes_left -= count; + return true; +} + +/* Read a single byte from input stream. buf may not be NULL. + * This is an optimization for the varint decoding. */ +static bool checkreturn pb_readbyte(pb_istream_t *stream, uint8_t *buf) +{ + if (stream->bytes_left == 0) + PB_RETURN_ERROR(stream, "end-of-stream"); + +#ifndef PB_BUFFER_ONLY + if (!stream->callback(stream, buf, 1)) + PB_RETURN_ERROR(stream, "io error"); +#else + *buf = *(uint8_t*)stream->state; + stream->state = (uint8_t*)stream->state + 1; +#endif + + stream->bytes_left--; + + return true; +} + +pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize) +{ + pb_istream_t stream; +#ifdef PB_BUFFER_ONLY + stream.callback = NULL; +#else + stream.callback = &buf_read; +#endif + stream.state = buf; + stream.bytes_left = bufsize; +#ifndef PB_NO_ERRMSG + stream.errmsg = NULL; +#endif + return stream; +} + +/******************** + * Helper functions * + ********************/ + +static bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest) +{ + uint8_t byte; + uint32_t result; + + if (!pb_readbyte(stream, &byte)) + return false; + + if ((byte & 0x80) == 0) + { + /* Quick case, 1 byte value */ + result = byte; + } + else + { + /* Multibyte case */ + uint8_t bitpos = 7; + result = byte & 0x7F; + + do + { + if (bitpos >= 32) + PB_RETURN_ERROR(stream, "varint overflow"); + + if (!pb_readbyte(stream, &byte)) + return false; + + result |= (uint32_t)(byte & 0x7F) << bitpos; + bitpos = (uint8_t)(bitpos + 7); + } while (byte & 0x80); + } + + *dest = result; + return true; +} + +bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest) +{ + uint8_t byte; + uint8_t bitpos = 0; + uint64_t result = 0; + + do + { + if (bitpos >= 64) + PB_RETURN_ERROR(stream, "varint overflow"); + + if (!pb_readbyte(stream, &byte)) + return false; + + result |= (uint64_t)(byte & 0x7F) << bitpos; + bitpos = (uint8_t)(bitpos + 7); + } while (byte & 0x80); + + *dest = result; + return true; +} + +bool checkreturn pb_skip_varint(pb_istream_t *stream) +{ + uint8_t byte; + do + { + if (!pb_read(stream, &byte, 1)) + return false; + } while (byte & 0x80); + return true; +} + +bool checkreturn pb_skip_string(pb_istream_t *stream) +{ + uint32_t length; + if (!pb_decode_varint32(stream, &length)) + return false; + + return pb_read(stream, NULL, length); +} + +bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof) +{ + uint32_t temp; + *eof = false; + *wire_type = (pb_wire_type_t) 0; + *tag = 0; + + if (!pb_decode_varint32(stream, &temp)) + { + if (stream->bytes_left == 0) + *eof = true; + + return false; + } + + if (temp == 0) + { + *eof = true; /* Special feature: allow 0-terminated messages. */ + return false; + } + + *tag = temp >> 3; + *wire_type = (pb_wire_type_t)(temp & 7); + return true; +} + +bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type) +{ + switch (wire_type) + { + case PB_WT_VARINT: return pb_skip_varint(stream); + case PB_WT_64BIT: return pb_read(stream, NULL, 8); + case PB_WT_STRING: return pb_skip_string(stream); + case PB_WT_32BIT: return pb_read(stream, NULL, 4); + default: PB_RETURN_ERROR(stream, "invalid wire_type"); + } +} + +/* Read a raw value to buffer, for the purpose of passing it to callback as + * a substream. Size is maximum size on call, and actual size on return. + */ +static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, uint8_t *buf, size_t *size) +{ + size_t max_size = *size; + switch (wire_type) + { + case PB_WT_VARINT: + *size = 0; + do + { + (*size)++; + if (*size > max_size) return false; + if (!pb_read(stream, buf, 1)) return false; + } while (*buf++ & 0x80); + return true; + + case PB_WT_64BIT: + *size = 8; + return pb_read(stream, buf, 8); + + case PB_WT_32BIT: + *size = 4; + return pb_read(stream, buf, 4); + + default: PB_RETURN_ERROR(stream, "invalid wire_type"); + } +} + +/* Decode string length from stream and return a substream with limited length. + * Remember to close the substream using pb_close_string_substream(). + */ +bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream) +{ + uint32_t size; + if (!pb_decode_varint32(stream, &size)) + return false; + + *substream = *stream; + if (substream->bytes_left < size) + PB_RETURN_ERROR(stream, "parent stream too short"); + + substream->bytes_left = size; + stream->bytes_left -= size; + return true; +} + +void pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream) +{ + stream->state = substream->state; + +#ifndef PB_NO_ERRMSG + stream->errmsg = substream->errmsg; +#endif +} + +/************************* + * Decode a single field * + *************************/ + +static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + pb_type_t type; + pb_decoder_t func; + + type = iter->pos->type; + func = PB_DECODERS[PB_LTYPE(type)]; + + switch (PB_HTYPE(type)) + { + case PB_HTYPE_REQUIRED: + return func(stream, iter->pos, iter->pData); + + case PB_HTYPE_OPTIONAL: + *(bool*)iter->pSize = true; + return func(stream, iter->pos, iter->pData); + + case PB_HTYPE_REPEATED: + if (wire_type == PB_WT_STRING + && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) + { + /* Packed array */ + bool status = true; + pb_size_t *size = (pb_size_t*)iter->pSize; + pb_istream_t substream; + if (!pb_make_string_substream(stream, &substream)) + return false; + + while (substream.bytes_left > 0 && *size < iter->pos->array_size) + { + void *pItem = (uint8_t*)iter->pData + iter->pos->data_size * (*size); + if (!func(&substream, iter->pos, pItem)) + { + status = false; + break; + } + (*size)++; + } + pb_close_string_substream(stream, &substream); + + if (substream.bytes_left != 0) + PB_RETURN_ERROR(stream, "array overflow"); + + return status; + } + else + { + /* Repeated field */ + pb_size_t *size = (pb_size_t*)iter->pSize; + void *pItem = (uint8_t*)iter->pData + iter->pos->data_size * (*size); + if (*size >= iter->pos->array_size) + PB_RETURN_ERROR(stream, "array overflow"); + + (*size)++; + return func(stream, iter->pos, pItem); + } + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +} + +#ifdef PB_ENABLE_MALLOC +/* Allocate storage for the field and store the pointer at iter->pData. + * array_size is the number of entries to reserve in an array. + * Zero size is not allowed, use pb_free() for releasing. + */ +static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size) +{ + void *ptr = *(void**)pData; + + if (data_size == 0 || array_size == 0) + PB_RETURN_ERROR(stream, "invalid size"); + + /* Check for multiplication overflows. + * This code avoids the costly division if the sizes are small enough. + * Multiplication is safe as long as only half of bits are set + * in either multiplicand. + */ + { + const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4); + if (data_size >= check_limit || array_size >= check_limit) + { + const size_t size_max = (size_t)-1; + if (size_max / array_size < data_size) + { + PB_RETURN_ERROR(stream, "size too large"); + } + } + } + + /* Allocate new or expand previous allocation */ + /* Note: on failure the old pointer will remain in the structure, + * the message must be freed by caller also on error return. */ + ptr = pb_realloc(ptr, array_size * data_size); + if (ptr == NULL) + PB_RETURN_ERROR(stream, "realloc failed"); + + *(void**)pData = ptr; + return true; +} + +/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */ +static void initialize_pointer_field(void *pItem, pb_field_iter_t *iter) +{ + if (PB_LTYPE(iter->pos->type) == PB_LTYPE_STRING || + PB_LTYPE(iter->pos->type) == PB_LTYPE_BYTES) + { + *(void**)pItem = NULL; + } + else if (PB_LTYPE(iter->pos->type) == PB_LTYPE_SUBMESSAGE) + { + pb_message_set_to_defaults((const pb_field_t *) iter->pos->ptr, pItem); + } +} +#endif + +static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ +#ifndef PB_ENABLE_MALLOC + PB_UNUSED(wire_type); + PB_UNUSED(iter); + PB_RETURN_ERROR(stream, "no malloc support"); +#else + pb_type_t type; + pb_decoder_t func; + + type = iter->pos->type; + func = PB_DECODERS[PB_LTYPE(type)]; + + switch (PB_HTYPE(type)) + { + case PB_HTYPE_REQUIRED: + case PB_HTYPE_OPTIONAL: + if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE && + *(void**)iter->pData != NULL) + { + /* Duplicate field, have to release the old allocation first. */ + pb_release_single_field(iter); + } + + if (PB_LTYPE(type) == PB_LTYPE_STRING || + PB_LTYPE(type) == PB_LTYPE_BYTES) + { + return func(stream, iter->pos, iter->pData); + } + else + { + if (!allocate_field(stream, iter->pData, iter->pos->data_size, 1)) + return false; + + initialize_pointer_field(*(void**)iter->pData, iter); + return func(stream, iter->pos, *(void**)iter->pData); + } + + case PB_HTYPE_REPEATED: + if (wire_type == PB_WT_STRING + && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) + { + /* Packed array, multiple items come in at once. */ + bool status = true; + pb_size_t *size = (pb_size_t*)iter->pSize; + size_t allocated_size = *size; + void *pItem; + pb_istream_t substream; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + while (substream.bytes_left) + { + if ((size_t)*size + 1 > allocated_size) + { + /* Allocate more storage. This tries to guess the + * number of remaining entries. Round the division + * upwards. */ + allocated_size += (substream.bytes_left - 1) / iter->pos->data_size + 1; + + if (!allocate_field(&substream, iter->pData, iter->pos->data_size, allocated_size)) + { + status = false; + break; + } + } + + /* Decode the array entry */ + pItem = *(uint8_t**)iter->pData + iter->pos->data_size * (*size); + initialize_pointer_field(pItem, iter); + if (!func(&substream, iter->pos, pItem)) + { + status = false; + break; + } + + if (*size == PB_SIZE_MAX) + { +#ifndef PB_NO_ERRMSG + stream->errmsg = "too many array entries"; +#endif + status = false; + break; + } + + (*size)++; + } + pb_close_string_substream(stream, &substream); + + return status; + } + else + { + /* Normal repeated field, i.e. only one item at a time. */ + pb_size_t *size = (pb_size_t*)iter->pSize; + void *pItem; + + if (*size == PB_SIZE_MAX) + PB_RETURN_ERROR(stream, "too many array entries"); + + (*size)++; + if (!allocate_field(stream, iter->pData, iter->pos->data_size, *size)) + return false; + + pItem = *(uint8_t**)iter->pData + iter->pos->data_size * (*size - 1); + initialize_pointer_field(pItem, iter); + return func(stream, iter->pos, pItem); + } + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +#endif +} + +static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + pb_callback_t *pCallback = (pb_callback_t*)iter->pData; + +#ifdef PB_OLD_CALLBACK_STYLE + void *arg = pCallback->arg; +#else + void **arg = &(pCallback->arg); +#endif + + if (pCallback->funcs.decode == NULL) + return pb_skip_field(stream, wire_type); + + if (wire_type == PB_WT_STRING) + { + pb_istream_t substream; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + do + { + if (!pCallback->funcs.decode(&substream, iter->pos, arg)) + PB_RETURN_ERROR(stream, "callback failed"); + } while (substream.bytes_left); + + pb_close_string_substream(stream, &substream); + return true; + } + else + { + /* Copy the single scalar value to stack. + * This is required so that we can limit the stream length, + * which in turn allows to use same callback for packed and + * not-packed fields. */ + pb_istream_t substream; + uint8_t buffer[10]; + size_t size = sizeof(buffer); + + if (!read_raw_value(stream, wire_type, buffer, &size)) + return false; + substream = pb_istream_from_buffer(buffer, size); + + return pCallback->funcs.decode(&substream, iter->pos, arg); + } +} + +static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + switch (PB_ATYPE(iter->pos->type)) + { + case PB_ATYPE_STATIC: + return decode_static_field(stream, wire_type, iter); + + case PB_ATYPE_POINTER: + return decode_pointer_field(stream, wire_type, iter); + + case PB_ATYPE_CALLBACK: + return decode_callback_field(stream, wire_type, iter); + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +} + +/* Default handler for extension fields. Expects a pb_field_t structure + * in extension->type->arg. */ +static bool checkreturn default_extension_decoder(pb_istream_t *stream, + pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type) +{ + const pb_field_t *field = (const pb_field_t*)extension->type->arg; + pb_field_iter_t iter; + + if (field->tag != tag) + return true; + + /* Fake a field iterator for the extension field. + * It is not actually safe to advance this iterator, but decode_field + * will not even try to. */ + (void)pb_field_iter_begin(&iter, field, extension->dest); + iter.pData = extension->dest; + iter.pSize = &extension->found; + + return decode_field(stream, wire_type, &iter); +} + +/* Try to decode an unknown field as an extension field. Tries each extension + * decoder in turn, until one of them handles the field or loop ends. */ +static bool checkreturn decode_extension(pb_istream_t *stream, + uint32_t tag, pb_wire_type_t wire_type, pb_field_iter_t *iter) +{ + pb_extension_t *extension = *(pb_extension_t* const *)iter->pData; + size_t pos = stream->bytes_left; + + while (extension != NULL && pos == stream->bytes_left) + { + bool status; + if (extension->type->decode) + status = extension->type->decode(stream, extension, tag, wire_type); + else + status = default_extension_decoder(stream, extension, tag, wire_type); + + if (!status) + return false; + + extension = extension->next; + } + + return true; +} + +/* Step through the iterator until an extension field is found or until all + * entries have been checked. There can be only one extension field per + * message. Returns false if no extension field is found. */ +static bool checkreturn find_extension_field(pb_field_iter_t *iter) +{ + const pb_field_t *start = iter->pos; + + do { + if (PB_LTYPE(iter->pos->type) == PB_LTYPE_EXTENSION) + return true; + (void)pb_field_iter_next(iter); + } while (iter->pos != start); + + return false; +} + +/* Initialize message fields to default values, recursively */ +static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct) +{ + pb_field_iter_t iter; + + if (!pb_field_iter_begin(&iter, fields, dest_struct)) + return; /* Empty message type */ + + do + { + pb_type_t type; + type = iter.pos->type; + + if (PB_ATYPE(type) == PB_ATYPE_STATIC) + { + if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL) + { + /* Set has_field to false. Still initialize the optional field + * itself also. */ + *(bool*)iter.pSize = false; + } + else if (PB_HTYPE(type) == PB_HTYPE_REPEATED) + { + /* Set array count to 0, no need to initialize contents. */ + *(pb_size_t*)iter.pSize = 0; + continue; + } + + if (PB_LTYPE(iter.pos->type) == PB_LTYPE_SUBMESSAGE) + { + /* Initialize submessage to defaults */ + pb_message_set_to_defaults((const pb_field_t *) iter.pos->ptr, iter.pData); + } + else if (iter.pos->ptr != NULL) + { + /* Initialize to default value */ + memcpy(iter.pData, iter.pos->ptr, iter.pos->data_size); + } + else + { + /* Initialize to zeros */ + memset(iter.pData, 0, iter.pos->data_size); + } + } + else if (PB_ATYPE(type) == PB_ATYPE_POINTER) + { + /* Initialize the pointer to NULL. */ + *(void**)iter.pData = NULL; + + /* Initialize array count to 0. */ + if (PB_HTYPE(type) == PB_HTYPE_REPEATED) + { + *(pb_size_t*)iter.pSize = 0; + } + } + else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) + { + /* Don't overwrite callback */ + } + } while (pb_field_iter_next(&iter)); +} + +/********************* + * Decode all fields * + *********************/ + +bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + uint8_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 7) / 8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint32_t extension_range_start = 0; + pb_field_iter_t iter; + + /* Return value ignored, as empty message types will be correctly handled by + * pb_field_iter_find() anyway. */ + (void)pb_field_iter_begin(&iter, fields, dest_struct); + + while (stream->bytes_left) + { + uint32_t tag; + pb_wire_type_t wire_type; + bool eof; + + if (!pb_decode_tag(stream, &wire_type, &tag, &eof)) + { + if (eof) + break; + else + return false; + } + + if (!pb_field_iter_find(&iter, tag)) + { + /* No match found, check if it matches an extension. */ + if (tag >= extension_range_start) + { + if (!find_extension_field(&iter)) + extension_range_start = (uint32_t)-1; + else + extension_range_start = iter.pos->tag; + + if (tag >= extension_range_start) + { + size_t pos = stream->bytes_left; + + if (!decode_extension(stream, tag, wire_type, &iter)) + return false; + + if (pos != stream->bytes_left) + { + /* The field was handled */ + continue; + } + } + } + + /* No match found, skip data */ + if (!pb_skip_field(stream, wire_type)) + return false; + continue; + } + + if (PB_HTYPE(iter.pos->type) == PB_HTYPE_REQUIRED + && iter.required_field_index < PB_MAX_REQUIRED_FIELDS) + { + fields_seen[iter.required_field_index >> 3] |= (uint8_t)(1 << (iter.required_field_index & 7)); + } + + if (!decode_field(stream, wire_type, &iter)) + return false; + } + + /* Check that all required fields were present. */ + { + /* First figure out the number of required fields by + * seeking to the end of the field array. Usually we + * are already close to end after decoding. + */ + unsigned req_field_count; + pb_type_t last_type; + unsigned i; + do { + req_field_count = iter.required_field_index; + last_type = iter.pos->type; + } while (pb_field_iter_next(&iter)); + + /* Fixup if last field was also required. */ + if (PB_HTYPE(last_type) == PB_HTYPE_REQUIRED && iter.pos->tag != 0) + req_field_count++; + + /* Check the whole bytes */ + for (i = 0; i < (req_field_count >> 3); i++) + { + if (fields_seen[i] != 0xFF) + PB_RETURN_ERROR(stream, "missing required field"); + } + + /* Check the remaining bits */ + if (fields_seen[req_field_count >> 3] != (0xFF >> (8 - (req_field_count & 7)))) + PB_RETURN_ERROR(stream, "missing required field"); + } + + return true; +} + +bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + bool status; + pb_message_set_to_defaults(fields, dest_struct); + status = pb_decode_noinit(stream, fields, dest_struct); + +#ifdef PB_ENABLE_MALLOC + if (!status) + pb_release(fields, dest_struct); +#endif + + return status; +} + +bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + pb_istream_t substream; + bool status; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + status = pb_decode(&substream, fields, dest_struct); + pb_close_string_substream(stream, &substream); + return status; +} + +#ifdef PB_ENABLE_MALLOC +static void pb_release_single_field(const pb_field_iter_t *iter) +{ + pb_type_t type; + type = iter->pos->type; + + if (PB_ATYPE(type) == PB_ATYPE_POINTER) + { + if (PB_HTYPE(type) == PB_HTYPE_REPEATED && + (PB_LTYPE(type) == PB_LTYPE_STRING || + PB_LTYPE(type) == PB_LTYPE_BYTES)) + { + /* Release entries in repeated string or bytes array */ + void **pItem = *(void***)iter->pData; + pb_size_t count = *(pb_size_t*)iter->pSize; + while (count--) + { + pb_free(*pItem); + *pItem++ = NULL; + } + *(pb_size_t*)iter->pSize = 0; + } + else if (PB_LTYPE(type) == PB_LTYPE_SUBMESSAGE) + { + /* Release fields in submessages */ + void *pItem = *(void**)iter->pData; + if (pItem) + { + pb_size_t count = 1; + + if (PB_HTYPE(type) == PB_HTYPE_REPEATED) + { + count = *(pb_size_t*)iter->pSize; + *(pb_size_t*)iter->pSize = 0; + } + + while (count--) + { + pb_release((const pb_field_t*)iter->pos->ptr, pItem); + pItem = (uint8_t*)pItem + iter->pos->data_size; + } + } + } + + /* Release main item */ + pb_free(*(void**)iter->pData); + *(void**)iter->pData = NULL; + } +} + +void pb_release(const pb_field_t fields[], void *dest_struct) +{ + pb_field_iter_t iter; + + if (!pb_field_iter_begin(&iter, fields, dest_struct)) + return; /* Empty message type */ + + do + { + pb_release_single_field(&iter); + } while (pb_field_iter_next(&iter)); +} +#endif + +/* Field decoders */ + +bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest) +{ + uint64_t value; + if (!pb_decode_varint(stream, &value)) + return false; + + if (value & 1) + *dest = (int64_t)(~(value >> 1)); + else + *dest = (int64_t)(value >> 1); + + return true; +} + +bool pb_decode_fixed32(pb_istream_t *stream, void *dest) +{ + #ifdef __BIG_ENDIAN__ + uint8_t *bytes = (uint8_t*)dest; + uint8_t lebytes[4]; + + if (!pb_read(stream, lebytes, 4)) + return false; + + bytes[0] = lebytes[3]; + bytes[1] = lebytes[2]; + bytes[2] = lebytes[1]; + bytes[3] = lebytes[0]; + return true; + #else + return pb_read(stream, (uint8_t*)dest, 4); + #endif +} + +bool pb_decode_fixed64(pb_istream_t *stream, void *dest) +{ + #ifdef __BIG_ENDIAN__ + uint8_t *bytes = (uint8_t*)dest; + uint8_t lebytes[8]; + + if (!pb_read(stream, lebytes, 8)) + return false; + + bytes[0] = lebytes[7]; + bytes[1] = lebytes[6]; + bytes[2] = lebytes[5]; + bytes[3] = lebytes[4]; + bytes[4] = lebytes[3]; + bytes[5] = lebytes[2]; + bytes[6] = lebytes[1]; + bytes[7] = lebytes[0]; + return true; + #else + return pb_read(stream, (uint8_t*)dest, 8); + #endif +} + +static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint64_t value; + if (!pb_decode_varint(stream, &value)) + return false; + + switch (field->data_size) + { + case 1: *(int8_t*)dest = (int8_t)value; break; + case 2: *(int16_t*)dest = (int16_t)value; break; + case 4: *(int32_t*)dest = (int32_t)value; break; + case 8: *(int64_t*)dest = (int64_t)value; break; + default: PB_RETURN_ERROR(stream, "invalid data_size"); + } + + return true; +} + +static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint64_t value; + if (!pb_decode_varint(stream, &value)) + return false; + + switch (field->data_size) + { + case 4: *(uint32_t*)dest = (uint32_t)value; break; + case 8: *(uint64_t*)dest = value; break; + default: PB_RETURN_ERROR(stream, "invalid data_size"); + } + + return true; +} + +static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + int64_t value; + if (!pb_decode_svarint(stream, &value)) + return false; + + switch (field->data_size) + { + case 4: *(int32_t*)dest = (int32_t)value; break; + case 8: *(int64_t*)dest = value; break; + default: PB_RETURN_ERROR(stream, "invalid data_size"); + } + + return true; +} + +static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + PB_UNUSED(field); + return pb_decode_fixed32(stream, dest); +} + +static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + PB_UNUSED(field); + return pb_decode_fixed64(stream, dest); +} + +static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint32_t size; + size_t alloc_size; + pb_bytes_array_t *bdest; + + if (!pb_decode_varint32(stream, &size)) + return false; + + if (size > PB_SIZE_MAX) + PB_RETURN_ERROR(stream, "bytes overflow"); + + alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size); + if (size > alloc_size) + PB_RETURN_ERROR(stream, "size too large"); + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { +#ifndef PB_ENABLE_MALLOC + PB_RETURN_ERROR(stream, "no malloc support"); +#else + if (!allocate_field(stream, dest, alloc_size, 1)) + return false; + bdest = *(pb_bytes_array_t**)dest; +#endif + } + else + { + if (alloc_size > field->data_size) + PB_RETURN_ERROR(stream, "bytes overflow"); + bdest = (pb_bytes_array_t*)dest; + } + + bdest->size = (pb_size_t)size; + return pb_read(stream, bdest->bytes, size); +} + +static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + uint32_t size; + size_t alloc_size; + bool status; + if (!pb_decode_varint32(stream, &size)) + return false; + + /* Space for null terminator */ + alloc_size = size + 1; + + if (alloc_size < size) + PB_RETURN_ERROR(stream, "size too large"); + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { +#ifndef PB_ENABLE_MALLOC + PB_RETURN_ERROR(stream, "no malloc support"); +#else + if (!allocate_field(stream, dest, alloc_size, 1)) + return false; + dest = *(void**)dest; +#endif + } + else + { + if (alloc_size > field->data_size) + PB_RETURN_ERROR(stream, "string overflow"); + } + + status = pb_read(stream, (uint8_t*)dest, size); + *((uint8_t*)dest + size) = 0; + return status; +} + +static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest) +{ + bool status; + pb_istream_t substream; + const pb_field_t* submsg_fields = (const pb_field_t*)field->ptr; + + if (!pb_make_string_substream(stream, &substream)) + return false; + + if (field->ptr == NULL) + PB_RETURN_ERROR(stream, "invalid field descriptor"); + + /* New array entries need to be initialized, while required and optional + * submessages have already been initialized in the top-level pb_decode. */ + if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED) + status = pb_decode(&substream, submsg_fields, dest); + else + status = pb_decode_noinit(&substream, submsg_fields, dest); + + pb_close_string_substream(stream, &substream); + return status; +} diff --git a/components/external/nanopb/pb_decode.h b/components/external/nanopb/pb_decode.h new file mode 100644 index 0000000000..3d433155b8 --- /dev/null +++ b/components/external/nanopb/pb_decode.h @@ -0,0 +1,149 @@ +/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c. + * The main function is pb_decode. You also need an input stream, and the + * field descriptions created by nanopb_generator.py. + */ + +#ifndef PB_DECODE_H_INCLUDED +#define PB_DECODE_H_INCLUDED + +#include "pb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure for defining custom input streams. You will need to provide + * a callback function to read the bytes from your storage, which can be + * for example a file or a network socket. + * + * The callback must conform to these rules: + * + * 1) Return false on IO errors. This will cause decoding to abort. + * 2) You can use state to store your own data (e.g. buffer pointer), + * and rely on pb_read to verify that no-body reads past bytes_left. + * 3) Your callback may be used with substreams, in which case bytes_left + * is different than from the main stream. Don't use bytes_left to compute + * any pointers. + */ +struct pb_istream_s +{ +#ifdef PB_BUFFER_ONLY + /* Callback pointer is not used in buffer-only configuration. + * Having an int pointer here allows binary compatibility but + * gives an error if someone tries to assign callback function. + */ + int *callback; +#else + bool (*callback)(pb_istream_t *stream, uint8_t *buf, size_t count); +#endif + + void *state; /* Free field for use by callback implementation */ + size_t bytes_left; + +#ifndef PB_NO_ERRMSG + const char *errmsg; +#endif +}; + +/*************************** + * Main decoding functions * + ***************************/ + +/* Decode a single protocol buffers message from input stream into a C structure. + * Returns true on success, false on any failure. + * The actual struct pointed to by dest must match the description in fields. + * Callback fields of the destination structure must be initialized by caller. + * All other fields will be initialized by this function. + * + * Example usage: + * MyMessage msg = {}; + * uint8_t buffer[64]; + * pb_istream_t stream; + * + * // ... read some data into buffer ... + * + * stream = pb_istream_from_buffer(buffer, count); + * pb_decode(&stream, MyMessage_fields, &msg); + */ +bool pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +/* Same as pb_decode, except does not initialize the destination structure + * to default values. This is slightly faster if you need no default values + * and just do memset(struct, 0, sizeof(struct)) yourself. + * + * This can also be used for 'merging' two messages, i.e. update only the + * fields that exist in the new message. + * + * Note: If this function returns with an error, it will not release any + * dynamically allocated fields. You will need to call pb_release() yourself. + */ +bool pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +/* Same as pb_decode, except expects the stream to start with the message size + * encoded as varint. Corresponds to parseDelimitedFrom() in Google's + * protobuf API. + */ +bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct); + +#ifdef PB_ENABLE_MALLOC +/* Release any allocated pointer fields. If you use dynamic allocation, you should + * call this for any successfully decoded message when you are done with it. If + * pb_decode() returns with an error, the message is already released. + */ +void pb_release(const pb_field_t fields[], void *dest_struct); +#endif + + +/************************************** + * Functions for manipulating streams * + **************************************/ + +/* Create an input stream for reading from a memory buffer. + * + * Alternatively, you can use a custom stream that reads directly from e.g. + * a file or a network socket. + */ +pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize); + +/* Function to read from a pb_istream_t. You can use this if you need to + * read some custom header data, or to read data in field callbacks. + */ +bool pb_read(pb_istream_t *stream, uint8_t *buf, size_t count); + + +/************************************************ + * Helper functions for writing field callbacks * + ************************************************/ + +/* Decode the tag for the next field in the stream. Gives the wire type and + * field tag. At end of the message, returns false and sets eof to true. */ +bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); + +/* Skip the field payload data, given the wire type. */ +bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type); + +/* Decode an integer in the varint format. This works for bool, enum, int32, + * int64, uint32 and uint64 field types. */ +bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest); + +/* Decode an integer in the zig-zagged svarint format. This works for sint32 + * and sint64. */ +bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest); + +/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to + * a 4-byte wide C variable. */ +bool pb_decode_fixed32(pb_istream_t *stream, void *dest); + +/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to + * a 8-byte wide C variable. */ +bool pb_decode_fixed64(pb_istream_t *stream, void *dest); + +/* Make a limited-length substream for reading a PB_WT_STRING field. */ +bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream); +void pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/components/external/nanopb/pb_encode.c b/components/external/nanopb/pb_encode.c new file mode 100644 index 0000000000..cdd789555a --- /dev/null +++ b/components/external/nanopb/pb_encode.c @@ -0,0 +1,664 @@ +/* pb_encode.c -- encode a protobuf using minimal resources + * + * 2011 Petteri Aimonen + */ + +#include "pb.h" +#include "pb_encode.h" +#include "pb_common.h" + +/* Use the GCC warn_unused_result attribute to check that all return values + * are propagated correctly. On other compilers and gcc before 3.4.0 just + * ignore the annotation. + */ +#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) + #define checkreturn +#else + #define checkreturn __attribute__((warn_unused_result)) +#endif + +/************************************** + * Declarations internal to this file * + **************************************/ +typedef bool (*pb_encoder_t)(pb_ostream_t *stream, const pb_field_t *field, const void *src) checkreturn; + +static bool checkreturn buf_write(pb_ostream_t *stream, const uint8_t *buf, size_t count); +static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, const void *pData, size_t count, pb_encoder_t func); +static bool checkreturn encode_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData); +static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension); +static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_t *field, const void *pData); +static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src); +static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src); + +/* --- Function pointers to field encoders --- + * Order in the array must match pb_action_t LTYPE numbering. + */ +static const pb_encoder_t PB_ENCODERS[PB_LTYPES_COUNT] = { + &pb_enc_varint, + &pb_enc_uvarint, + &pb_enc_svarint, + &pb_enc_fixed32, + &pb_enc_fixed64, + + &pb_enc_bytes, + &pb_enc_string, + &pb_enc_submessage, + NULL /* extensions */ +}; + +/******************************* + * pb_ostream_t implementation * + *******************************/ + +static bool checkreturn buf_write(pb_ostream_t *stream, const uint8_t *buf, size_t count) +{ + uint8_t *dest = (uint8_t*)stream->state; + stream->state = dest + count; + + while (count--) + *dest++ = *buf++; + + return true; +} + +pb_ostream_t pb_ostream_from_buffer(uint8_t *buf, size_t bufsize) +{ + pb_ostream_t stream; +#ifdef PB_BUFFER_ONLY + stream.callback = (void*)1; /* Just a marker value */ +#else + stream.callback = &buf_write; +#endif + stream.state = buf; + stream.max_size = bufsize; + stream.bytes_written = 0; +#ifndef PB_NO_ERRMSG + stream.errmsg = NULL; +#endif + return stream; +} + +bool checkreturn pb_write(pb_ostream_t *stream, const uint8_t *buf, size_t count) +{ + if (stream->callback != NULL) + { + if (stream->bytes_written + count > stream->max_size) + PB_RETURN_ERROR(stream, "stream full"); + +#ifdef PB_BUFFER_ONLY + if (!buf_write(stream, buf, count)) + PB_RETURN_ERROR(stream, "io error"); +#else + if (!stream->callback(stream, buf, count)) + PB_RETURN_ERROR(stream, "io error"); +#endif + } + + stream->bytes_written += count; + return true; +} + +/************************* + * Encode a single field * + *************************/ + +/* Encode a static array. Handles the size calculations and possible packing. */ +static bool checkreturn encode_array(pb_ostream_t *stream, const pb_field_t *field, + const void *pData, size_t count, pb_encoder_t func) +{ + size_t i; + const void *p; + size_t size; + + if (count == 0) + return true; + + if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size) + PB_RETURN_ERROR(stream, "array max size exceeded"); + + /* We always pack arrays if the datatype allows it. */ + if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) + { + if (!pb_encode_tag(stream, PB_WT_STRING, field->tag)) + return false; + + /* Determine the total size of packed array. */ + if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32) + { + size = 4 * count; + } + else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64) + { + size = 8 * count; + } + else + { + pb_ostream_t sizestream = PB_OSTREAM_SIZING; + p = pData; + for (i = 0; i < count; i++) + { + if (!func(&sizestream, field, p)) + return false; + p = (const char*)p + field->data_size; + } + size = sizestream.bytes_written; + } + + if (!pb_encode_varint(stream, (uint64_t)size)) + return false; + + if (stream->callback == NULL) + return pb_write(stream, NULL, size); /* Just sizing.. */ + + /* Write the data */ + p = pData; + for (i = 0; i < count; i++) + { + if (!func(stream, field, p)) + return false; + p = (const char*)p + field->data_size; + } + } + else + { + p = pData; + for (i = 0; i < count; i++) + { + if (!pb_encode_tag_for_field(stream, field)) + return false; + + /* Normally the data is stored directly in the array entries, but + * for pointer-type string and bytes fields, the array entries are + * actually pointers themselves also. So we have to dereference once + * more to get to the actual data. */ + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER && + (PB_LTYPE(field->type) == PB_LTYPE_STRING || + PB_LTYPE(field->type) == PB_LTYPE_BYTES)) + { + if (!func(stream, field, *(const void* const*)p)) + return false; + } + else + { + if (!func(stream, field, p)) + return false; + } + p = (const char*)p + field->data_size; + } + } + + return true; +} + +/* Encode a field with static or pointer allocation, i.e. one whose data + * is available to the encoder directly. */ +static bool checkreturn encode_basic_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + pb_encoder_t func; + const void *pSize; + bool implicit_has = true; + + func = PB_ENCODERS[PB_LTYPE(field->type)]; + + if (field->size_offset) + pSize = (const char*)pData + field->size_offset; + else + pSize = &implicit_has; + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + { + /* pData is a pointer to the field, which contains pointer to + * the data. If the 2nd pointer is NULL, it is interpreted as if + * the has_field was false. + */ + + pData = *(const void* const*)pData; + implicit_has = (pData != NULL); + } + + switch (PB_HTYPE(field->type)) + { + case PB_HTYPE_REQUIRED: + if (!pData) + PB_RETURN_ERROR(stream, "missing required field"); + if (!pb_encode_tag_for_field(stream, field)) + return false; + if (!func(stream, field, pData)) + return false; + break; + + case PB_HTYPE_OPTIONAL: + if (*(const bool*)pSize) + { + if (!pb_encode_tag_for_field(stream, field)) + return false; + + if (!func(stream, field, pData)) + return false; + } + break; + + case PB_HTYPE_REPEATED: + if (!encode_array(stream, field, pData, *(const pb_size_t*)pSize, func)) + return false; + break; + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } + + return true; +} + +/* Encode a field with callback semantics. This means that a user function is + * called to provide and encode the actual data. */ +static bool checkreturn encode_callback_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + const pb_callback_t *callback = (const pb_callback_t*)pData; + +#ifdef PB_OLD_CALLBACK_STYLE + const void *arg = callback->arg; +#else + void * const *arg = &(callback->arg); +#endif + + if (callback->funcs.encode != NULL) + { + if (!callback->funcs.encode(stream, field, arg)) + PB_RETURN_ERROR(stream, "callback error"); + } + return true; +} + +/* Encode a single field of any callback or static type. */ +static bool checkreturn encode_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + switch (PB_ATYPE(field->type)) + { + case PB_ATYPE_STATIC: + case PB_ATYPE_POINTER: + return encode_basic_field(stream, field, pData); + + case PB_ATYPE_CALLBACK: + return encode_callback_field(stream, field, pData); + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } +} + +/* Default handler for extension fields. Expects to have a pb_field_t + * pointer in the extension->type->arg field. */ +static bool checkreturn default_extension_encoder(pb_ostream_t *stream, + const pb_extension_t *extension) +{ + const pb_field_t *field = (const pb_field_t*)extension->type->arg; + return encode_field(stream, field, extension->dest); +} + +/* Walk through all the registered extensions and give them a chance + * to encode themselves. */ +static bool checkreturn encode_extension_field(pb_ostream_t *stream, + const pb_field_t *field, const void *pData) +{ + const pb_extension_t *extension = *(const pb_extension_t* const *)pData; + PB_UNUSED(field); + + while (extension) + { + bool status; + if (extension->type->encode) + status = extension->type->encode(stream, extension); + else + status = default_extension_encoder(stream, extension); + + if (!status) + return false; + + extension = extension->next; + } + + return true; +} + +/********************* + * Encode all fields * + *********************/ + +static void *remove_const(const void *p) +{ + /* Note: this casts away const, in order to use the common field iterator + * logic for both encoding and decoding. */ + union { + void *p1; + const void *p2; + } t; + t.p2 = p; + return t.p1; +} + +bool checkreturn pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + pb_field_iter_t iter; + if (!pb_field_iter_begin(&iter, fields, remove_const(src_struct))) + return true; /* Empty message type */ + + do { + if (PB_LTYPE(iter.pos->type) == PB_LTYPE_EXTENSION) + { + /* Special case for the extension field placeholder */ + if (!encode_extension_field(stream, iter.pos, iter.pData)) + return false; + } + else + { + /* Regular field */ + if (!encode_field(stream, iter.pos, iter.pData)) + return false; + } + } while (pb_field_iter_next(&iter)); + + return true; +} + +bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + return pb_encode_submessage(stream, fields, src_struct); +} + +bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct) +{ + pb_ostream_t stream = PB_OSTREAM_SIZING; + + if (!pb_encode(&stream, fields, src_struct)) + return false; + + *size = stream.bytes_written; + return true; +} + +/******************** + * Helper functions * + ********************/ +bool checkreturn pb_encode_varint(pb_ostream_t *stream, uint64_t value) +{ + uint8_t buffer[10]; + size_t i = 0; + + if (value == 0) + return pb_write(stream, (uint8_t*)&value, 1); + + while (value) + { + buffer[i] = (uint8_t)((value & 0x7F) | 0x80); + value >>= 7; + i++; + } + buffer[i-1] &= 0x7F; /* Unset top bit on last byte */ + + return pb_write(stream, buffer, i); +} + +bool checkreturn pb_encode_svarint(pb_ostream_t *stream, int64_t value) +{ + uint64_t zigzagged; + if (value < 0) + zigzagged = ~((uint64_t)value << 1); + else + zigzagged = (uint64_t)value << 1; + + return pb_encode_varint(stream, zigzagged); +} + +bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value) +{ + #ifdef __BIG_ENDIAN__ + const uint8_t *bytes = value; + uint8_t lebytes[4]; + lebytes[0] = bytes[3]; + lebytes[1] = bytes[2]; + lebytes[2] = bytes[1]; + lebytes[3] = bytes[0]; + return pb_write(stream, lebytes, 4); + #else + return pb_write(stream, (const uint8_t*)value, 4); + #endif +} + +bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value) +{ + #ifdef __BIG_ENDIAN__ + const uint8_t *bytes = value; + uint8_t lebytes[8]; + lebytes[0] = bytes[7]; + lebytes[1] = bytes[6]; + lebytes[2] = bytes[5]; + lebytes[3] = bytes[4]; + lebytes[4] = bytes[3]; + lebytes[5] = bytes[2]; + lebytes[6] = bytes[1]; + lebytes[7] = bytes[0]; + return pb_write(stream, lebytes, 8); + #else + return pb_write(stream, (const uint8_t*)value, 8); + #endif +} + +bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number) +{ + uint64_t tag = ((uint64_t)field_number << 3) | wiretype; + return pb_encode_varint(stream, tag); +} + +bool checkreturn pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field) +{ + pb_wire_type_t wiretype; + switch (PB_LTYPE(field->type)) + { + case PB_LTYPE_VARINT: + case PB_LTYPE_UVARINT: + case PB_LTYPE_SVARINT: + wiretype = PB_WT_VARINT; + break; + + case PB_LTYPE_FIXED32: + wiretype = PB_WT_32BIT; + break; + + case PB_LTYPE_FIXED64: + wiretype = PB_WT_64BIT; + break; + + case PB_LTYPE_BYTES: + case PB_LTYPE_STRING: + case PB_LTYPE_SUBMESSAGE: + wiretype = PB_WT_STRING; + break; + + default: + PB_RETURN_ERROR(stream, "invalid field type"); + } + + return pb_encode_tag(stream, wiretype, field->tag); +} + +bool checkreturn pb_encode_string(pb_ostream_t *stream, const uint8_t *buffer, size_t size) +{ + if (!pb_encode_varint(stream, (uint64_t)size)) + return false; + + return pb_write(stream, buffer, size); +} + +bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct) +{ + /* First calculate the message size using a non-writing substream. */ + pb_ostream_t substream = PB_OSTREAM_SIZING; + size_t size; + bool status; + + if (!pb_encode(&substream, fields, src_struct)) + { +#ifndef PB_NO_ERRMSG + stream->errmsg = substream.errmsg; +#endif + return false; + } + + size = substream.bytes_written; + + if (!pb_encode_varint(stream, (uint64_t)size)) + return false; + + if (stream->callback == NULL) + return pb_write(stream, NULL, size); /* Just sizing */ + + if (stream->bytes_written + size > stream->max_size) + PB_RETURN_ERROR(stream, "stream full"); + + /* Use a substream to verify that a callback doesn't write more than + * what it did the first time. */ + substream.callback = stream->callback; + substream.state = stream->state; + substream.max_size = size; + substream.bytes_written = 0; +#ifndef PB_NO_ERRMSG + substream.errmsg = NULL; +#endif + + status = pb_encode(&substream, fields, src_struct); + + stream->bytes_written += substream.bytes_written; + stream->state = substream.state; +#ifndef PB_NO_ERRMSG + stream->errmsg = substream.errmsg; +#endif + + if (substream.bytes_written != size) + PB_RETURN_ERROR(stream, "submsg size changed"); + + return status; +} + +/* Field encoders */ + +static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + int64_t value = 0; + + /* Cases 1 and 2 are for compilers that have smaller types for bool + * or enums. */ + switch (field->data_size) + { + case 1: value = *(const int8_t*)src; break; + case 2: value = *(const int16_t*)src; break; + case 4: value = *(const int32_t*)src; break; + case 8: value = *(const int64_t*)src; break; + default: PB_RETURN_ERROR(stream, "invalid data_size"); + } + + return pb_encode_varint(stream, (uint64_t)value); +} + +static bool checkreturn pb_enc_uvarint(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + uint64_t value = 0; + + switch (field->data_size) + { + case 4: value = *(const uint32_t*)src; break; + case 8: value = *(const uint64_t*)src; break; + default: PB_RETURN_ERROR(stream, "invalid data_size"); + } + + return pb_encode_varint(stream, value); +} + +static bool checkreturn pb_enc_svarint(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + int64_t value = 0; + + switch (field->data_size) + { + case 4: value = *(const int32_t*)src; break; + case 8: value = *(const int64_t*)src; break; + default: PB_RETURN_ERROR(stream, "invalid data_size"); + } + + return pb_encode_svarint(stream, value); +} + +static bool checkreturn pb_enc_fixed64(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + PB_UNUSED(field); + return pb_encode_fixed64(stream, src); +} + +static bool checkreturn pb_enc_fixed32(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + PB_UNUSED(field); + return pb_encode_fixed32(stream, src); +} + +static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + const pb_bytes_array_t *bytes = (const pb_bytes_array_t*)src; + + if (src == NULL) + { + /* Threat null pointer as an empty bytes field */ + return pb_encode_string(stream, NULL, 0); + } + + if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && + PB_BYTES_ARRAY_T_ALLOCSIZE(bytes->size) > field->data_size) + { + PB_RETURN_ERROR(stream, "bytes size exceeded"); + } + + return pb_encode_string(stream, bytes->bytes, bytes->size); +} + +static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + size_t size = 0; + size_t max_size = field->data_size; + const char *p = (const char*)src; + + if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) + max_size = (size_t)-1; + + if (src == NULL) + { + size = 0; /* Threat null pointer as an empty string */ + } + else + { + /* strnlen() is not always available, so just use a loop */ + while (size < max_size && *p != '\0') + { + size++; + p++; + } + } + + return pb_encode_string(stream, (const uint8_t*)src, size); +} + +static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_t *field, const void *src) +{ + if (field->ptr == NULL) + PB_RETURN_ERROR(stream, "invalid field descriptor"); + + return pb_encode_submessage(stream, (const pb_field_t*)field->ptr, src); +} + diff --git a/components/external/nanopb/pb_encode.h b/components/external/nanopb/pb_encode.h new file mode 100644 index 0000000000..e992c8dca1 --- /dev/null +++ b/components/external/nanopb/pb_encode.h @@ -0,0 +1,154 @@ +/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c. + * The main function is pb_encode. You also need an output stream, and the + * field descriptions created by nanopb_generator.py. + */ + +#ifndef PB_ENCODE_H_INCLUDED +#define PB_ENCODE_H_INCLUDED + +#include "pb.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure for defining custom output streams. You will need to provide + * a callback function to write the bytes to your storage, which can be + * for example a file or a network socket. + * + * The callback must conform to these rules: + * + * 1) Return false on IO errors. This will cause encoding to abort. + * 2) You can use state to store your own data (e.g. buffer pointer). + * 3) pb_write will update bytes_written after your callback runs. + * 4) Substreams will modify max_size and bytes_written. Don't use them + * to calculate any pointers. + */ +struct pb_ostream_s +{ +#ifdef PB_BUFFER_ONLY + /* Callback pointer is not used in buffer-only configuration. + * Having an int pointer here allows binary compatibility but + * gives an error if someone tries to assign callback function. + * Also, NULL pointer marks a 'sizing stream' that does not + * write anything. + */ + int *callback; +#else + bool (*callback)(pb_ostream_t *stream, const uint8_t *buf, size_t count); +#endif + void *state; /* Free field for use by callback implementation. */ + size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ + size_t bytes_written; /* Number of bytes written so far. */ + +#ifndef PB_NO_ERRMSG + const char *errmsg; +#endif +}; + +/*************************** + * Main encoding functions * + ***************************/ + +/* Encode a single protocol buffers message from C structure into a stream. + * Returns true on success, false on any failure. + * The actual struct pointed to by src_struct must match the description in fields. + * All required fields in the struct are assumed to have been filled in. + * + * Example usage: + * MyMessage msg = {}; + * uint8_t buffer[64]; + * pb_ostream_t stream; + * + * msg.field1 = 42; + * stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); + * pb_encode(&stream, MyMessage_fields, &msg); + */ +bool pb_encode(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +/* Same as pb_encode, but prepends the length of the message as a varint. + * Corresponds to writeDelimitedTo() in Google's protobuf API. + */ +bool pb_encode_delimited(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +/* Encode the message to get the size of the encoded data, but do not store + * the data. */ +bool pb_get_encoded_size(size_t *size, const pb_field_t fields[], const void *src_struct); + +/************************************** + * Functions for manipulating streams * + **************************************/ + +/* Create an output stream for writing into a memory buffer. + * The number of bytes written can be found in stream.bytes_written after + * encoding the message. + * + * Alternatively, you can use a custom stream that writes directly to e.g. + * a file or a network socket. + */ +pb_ostream_t pb_ostream_from_buffer(uint8_t *buf, size_t bufsize); + +/* Pseudo-stream for measuring the size of a message without actually storing + * the encoded data. + * + * Example usage: + * MyMessage msg = {}; + * pb_ostream_t stream = PB_OSTREAM_SIZING; + * pb_encode(&stream, MyMessage_fields, &msg); + * printf("Message size is %d\n", stream.bytes_written); + */ +#ifndef PB_NO_ERRMSG +#define PB_OSTREAM_SIZING {0,0,0,0,0} +#else +#define PB_OSTREAM_SIZING {0,0,0,0} +#endif + +/* Function to write into a pb_ostream_t stream. You can use this if you need + * to append or prepend some custom headers to the message. + */ +bool pb_write(pb_ostream_t *stream, const uint8_t *buf, size_t count); + + +/************************************************ + * Helper functions for writing field callbacks * + ************************************************/ + +/* Encode field header based on type and field number defined in the field + * structure. Call this from the callback before writing out field contents. */ +bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_t *field); + +/* Encode field header by manually specifing wire type. You need to use this + * if you want to write out packed arrays from a callback field. */ +bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number); + +/* Encode an integer in the varint format. + * This works for bool, enum, int32, int64, uint32 and uint64 field types. */ +bool pb_encode_varint(pb_ostream_t *stream, uint64_t value); + +/* Encode an integer in the zig-zagged svarint format. + * This works for sint32 and sint64. */ +bool pb_encode_svarint(pb_ostream_t *stream, int64_t value); + +/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */ +bool pb_encode_string(pb_ostream_t *stream, const uint8_t *buffer, size_t size); + +/* Encode a fixed32, sfixed32 or float value. + * You need to pass a pointer to a 4-byte wide C variable. */ +bool pb_encode_fixed32(pb_ostream_t *stream, const void *value); + +/* Encode a fixed64, sfixed64 or double value. + * You need to pass a pointer to a 8-byte wide C variable. */ +bool pb_encode_fixed64(pb_ostream_t *stream, const void *value); + +/* Encode a submessage field. + * You need to pass the pb_field_t array and pointer to struct, just like + * with pb_encode(). This internally encodes the submessage twice, first to + * calculate message size and then to actually write it out. + */ +bool pb_encode_submessage(pb_ostream_t *stream, const pb_field_t fields[], const void *src_struct); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/examples/nanopb/SConscript b/examples/nanopb/SConscript new file mode 100644 index 0000000000..7c8bce9f26 --- /dev/null +++ b/examples/nanopb/SConscript @@ -0,0 +1,13 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +src = Split(''' +simple.c +simple.pb.c +''') +CPPPATH = [RTT_ROOT + '/examples/nanopb'] + +group = DefineGroup('Nanopb_test', src, depend = ['RT_USING_NANOPB'], CPPPATH = CPPPATH) + +Return('group') \ No newline at end of file diff --git a/examples/nanopb/simple.c b/examples/nanopb/simple.c new file mode 100644 index 0000000000..2b793c014f --- /dev/null +++ b/examples/nanopb/simple.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include "simple.pb.h" + +int nanopb_test() +{ + /* This is the buffer where we will store our message. */ + uint8_t buffer[128]; + size_t message_length; + bool status; + + /* Encode our message */ + { + /* Allocate space on the stack to store the message data. + * + * Nanopb generates simple struct definitions for all the messages. + * - check out the contents of simple.pb.h! */ + SimpleMessage message = SimpleMessage_init_zero; + + /* Create a stream that will write to our buffer. */ + pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); + + /* Fill in the lucky number */ + message.lucky_number = 13; + + /* Now we are ready to encode the message! */ + status = pb_encode(&stream, SimpleMessage_fields, &message); + message_length = stream.bytes_written; + + /* Then just check for any errors.. */ + if (!status) + { + rt_kprintf("Encoding failed: %s\n", PB_GET_ERROR(&stream)); + return 1; + } + } + + /* Now we could transmit the message over network, store it in a file or + * wrap it to a pigeon's leg. + */ + + /* But because we are lazy, we will just decode it immediately. */ + + { + /* Allocate space for the decoded message. */ + SimpleMessage message; + + /* Create a stream that reads from the buffer. */ + pb_istream_t stream = pb_istream_from_buffer(buffer, message_length); + + /* Now we are ready to decode the message. */ + status = pb_decode(&stream, SimpleMessage_fields, &message); + + /* Check for errors... */ + if (!status) + { + rt_kprintf("Decoding failed: %s\n", PB_GET_ERROR(&stream)); + return 1; + } + + /* Print the data contained in the message. */ + rt_kprintf("Your lucky number was %d!\n", message.lucky_number); + } + + return 0; +} + +#ifdef RT_USING_FINSH +#include +FINSH_FUNCTION_EXPORT(nanopb_test, nanopb encode/decode test.) +#endif diff --git a/examples/nanopb/simple.options b/examples/nanopb/simple.options new file mode 100644 index 0000000000..90960d0d34 --- /dev/null +++ b/examples/nanopb/simple.options @@ -0,0 +1 @@ +SimpleMessage.name max_size:16 \ No newline at end of file diff --git a/examples/nanopb/simple.pb.c b/examples/nanopb/simple.pb.c new file mode 100644 index 0000000000..eaf09e58da --- /dev/null +++ b/examples/nanopb/simple.pb.c @@ -0,0 +1,18 @@ +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.3.1 at Tue Mar 10 01:16:15 2015. */ + +#include "simple.pb.h" + +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + + + +const pb_field_t SimpleMessage_fields[3] = { + PB_FIELD( 1, INT32 , REQUIRED, STATIC , FIRST, SimpleMessage, lucky_number, lucky_number, 0), + PB_FIELD( 2, BYTES , REQUIRED, STATIC , OTHER, SimpleMessage, name, lucky_number, 0), + PB_LAST_FIELD +}; + + diff --git a/examples/nanopb/simple.pb.h b/examples/nanopb/simple.pb.h new file mode 100644 index 0000000000..47521dee69 --- /dev/null +++ b/examples/nanopb/simple.pb.h @@ -0,0 +1,45 @@ +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.3.1 at Tue Mar 10 01:16:15 2015. */ + +#ifndef PB_SIMPLE_PB_H_INCLUDED +#define PB_SIMPLE_PB_H_INCLUDED +#include + +#if PB_PROTO_HEADER_VERSION != 30 +#error Regenerate this file with the current version of nanopb generator. +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Enum definitions */ +/* Struct definitions */ +typedef PB_BYTES_ARRAY_T(16) SimpleMessage_name_t; + +typedef struct _SimpleMessage { + int32_t lucky_number; + SimpleMessage_name_t name; +} SimpleMessage; + +/* Default values for struct fields */ + +/* Initializer values for message structs */ +#define SimpleMessage_init_default {0, {0, {0}}} +#define SimpleMessage_init_zero {0, {0, {0}}} + +/* Field tags (for use in manual encoding/decoding) */ +#define SimpleMessage_lucky_number_tag 1 +#define SimpleMessage_name_tag 2 + +/* Struct field encoding specification for nanopb */ +extern const pb_field_t SimpleMessage_fields[3]; + +/* Maximum encoded size of messages (where known) */ +#define SimpleMessage_size 29 + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/examples/nanopb/simple.proto b/examples/nanopb/simple.proto new file mode 100644 index 0000000000..1905d0e50b --- /dev/null +++ b/examples/nanopb/simple.proto @@ -0,0 +1,10 @@ +// A very simple protocol definition, consisting of only +// one message. + +message SimpleMessage { + required int32 lucky_number = 1; + required bytes name = 2; +} + + + From 351dd923e35108aeb6b5cb6ab2f9328e34369a68 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 11 Mar 2015 15:24:09 +0800 Subject: [PATCH 07/10] bsp stm32f10x add uart4 drive --- bsp/stm32f10x/drivers/usart.c | 82 +++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/bsp/stm32f10x/drivers/usart.c b/bsp/stm32f10x/drivers/usart.c index b10b971538..cf7c2a1d51 100644 --- a/bsp/stm32f10x/drivers/usart.c +++ b/bsp/stm32f10x/drivers/usart.c @@ -35,6 +35,12 @@ #define UART3_GPIO_RX GPIO_Pin_11 #define UART3_GPIO GPIOB +/* USART4 */ +#define UART4_GPIO_TX GPIO_Pin_10 +#define UART4_GPIO_RX GPIO_Pin_11 +#define UART4_GPIO GPIOC + + /* STM32 uart driver */ struct stm32_uart { @@ -264,6 +270,45 @@ void USART3_IRQHandler(void) } #endif /* RT_USING_UART3 */ +#if defined(RT_USING_UART4) +/* UART4 device driver structure */ +struct stm32_uart uart4 = +{ + UART4, + UART4_IRQn, +}; +struct rt_serial_device serial4; + +void UART4_IRQHandler(void) +{ + struct stm32_uart* uart; + + uart = &uart4; + + /* enter interrupt */ + rt_interrupt_enter(); + if(USART_GetITStatus(uart->uart_device, USART_IT_RXNE) != RESET) + { + rt_hw_serial_isr(&serial4, RT_SERIAL_EVENT_RX_IND); + /* clear interrupt */ + USART_ClearITPendingBit(uart->uart_device, USART_IT_RXNE); + } + if (USART_GetITStatus(uart->uart_device, USART_IT_TC) != RESET) + { + /* clear interrupt */ + USART_ClearITPendingBit(uart->uart_device, USART_IT_TC); + } + if (USART_GetFlagStatus(uart->uart_device, USART_FLAG_ORE) == SET) + { + stm32_getc(&serial4); + } + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* RT_USING_UART3 */ + + static void RCC_Configuration(void) { #if defined(RT_USING_UART1) @@ -286,6 +331,14 @@ static void RCC_Configuration(void) /* Enable UART clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); #endif /* RT_USING_UART3 */ + +#if defined(RT_USING_UART4) + /* Enable UART GPIO clocks */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); + /* Enable UART clock */ + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); +#endif /* RT_USING_UART4 */ + } static void GPIO_Configuration(void) @@ -326,6 +379,18 @@ static void GPIO_Configuration(void) GPIO_InitStructure.GPIO_Pin = UART3_GPIO_TX; GPIO_Init(UART3_GPIO, &GPIO_InitStructure); #endif /* RT_USING_UART3 */ + +#if defined(RT_USING_UART4) + /* Configure USART Rx/tx PIN */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_InitStructure.GPIO_Pin = UART4_GPIO_RX; + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_InitStructure.GPIO_Pin = UART4_GPIO_TX; + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); +#endif /* RT_USING_UART4 */ + } static void NVIC_Configuration(struct stm32_uart* uart) @@ -393,4 +458,21 @@ void rt_hw_usart_init(void) RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, uart); #endif /* RT_USING_UART3 */ + +#if defined(RT_USING_UART4) + uart = &uart4; + + config.baud_rate = BAUD_RATE_115200; + + serial4.ops = &stm32_uart_ops; + serial4.config = config; + + NVIC_Configuration(&uart4); + + /* register UART4 device */ + rt_hw_serial_register(&serial4, "uart4", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + uart); +#endif /* RT_USING_UART4 */ + } From 1d23ce6cbd9fa1e221b6e91a7b8c1dac80e80b92 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Sat, 14 Mar 2015 09:46:37 +0800 Subject: [PATCH 08/10] [Tools] Add bsp_directory. Add bsp_directory for PrepareModuleBuilding function and module building environment can parse rtconfig.h too. --- tools/building.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/building.py b/tools/building.py index cafad2047a..0b361dde28 100644 --- a/tools/building.py +++ b/tools/building.py @@ -256,7 +256,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ return objs -def PrepareModuleBuilding(env, root_directory): +def PrepareModuleBuilding(env, root_directory, bsp_directory): import rtconfig global Env @@ -265,6 +265,14 @@ def PrepareModuleBuilding(env, root_directory): Env = env Rtt_Root = root_directory + # parse bsp rtconfig.h to get used component + PreProcessor = SCons.cpp.PreProcessor() + f = file(bsp_directory + '/rtconfig.h', 'r') + contents = f.read() + f.close() + PreProcessor.process_contents(contents) + BuildOptions = PreProcessor.cpp_namespace + # add build/clean library option for library checking AddOption('--buildlib', dest='buildlib', From 43e020d48162504ddf48f4385a7b4099eece8772 Mon Sep 17 00:00:00 2001 From: Grissiom Date: Wed, 18 Mar 2015 15:50:10 +0800 Subject: [PATCH 09/10] building: PrepareBuilding forgot to declare BuildOptions as global The global variables in the building.py are totally a pile of shit. --- tools/building.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/building.py b/tools/building.py index 0b361dde28..d95cf3672f 100644 --- a/tools/building.py +++ b/tools/building.py @@ -259,6 +259,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ def PrepareModuleBuilding(env, root_directory, bsp_directory): import rtconfig + global BuildOptions global Env global Rtt_Root From 767c16d59651b3fc4f1c212d391eec4a41b62f9e Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 19 Mar 2015 08:52:28 +0000 Subject: [PATCH 10/10] [USBH] fix the spelling wrong --- components/drivers/usb/usbhost/class/adk.c | 6 +++--- components/drivers/usb/usbhost/core/core.c | 10 +++++----- components/drivers/usb/usbhost/core/hub.c | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/components/drivers/usb/usbhost/class/adk.c b/components/drivers/usb/usbhost/class/adk.c index fd6619599c..1481d27ea6 100644 --- a/components/drivers/usb/usbhost/class/adk.c +++ b/components/drivers/usb/usbhost/class/adk.c @@ -67,7 +67,7 @@ RTM_EXPORT(rt_usbh_adk_set_string); */ static rt_err_t rt_usbh_adk_get_protocol(struct uintf* intf, rt_uint16_t *protocol) { - struct ureqest setup; + struct urequest setup; uinst_t device; int timeout = 100; @@ -101,7 +101,7 @@ static rt_err_t rt_usbh_adk_get_protocol(struct uintf* intf, rt_uint16_t *protoc static rt_err_t rt_usbh_adk_send_string(struct uintf* intf, rt_uint16_t index, const char* str) { - struct ureqest setup; + struct urequest setup; uinst_t device; int timeout = 100; @@ -134,7 +134,7 @@ static rt_err_t rt_usbh_adk_send_string(struct uintf* intf, rt_uint16_t index, */ static rt_err_t rt_usbh_adk_start(struct uintf* intf) { - struct ureqest setup; + struct urequest setup; uinst_t device; int timeout = 100; diff --git a/components/drivers/usb/usbhost/core/core.c b/components/drivers/usb/usbhost/core/core.c index af53370f4b..144358a4d3 100644 --- a/components/drivers/usb/usbhost/core/core.c +++ b/components/drivers/usb/usbhost/core/core.c @@ -246,7 +246,7 @@ rt_err_t rt_usbh_detach_instance(uinst_t device) rt_err_t rt_usbh_get_descriptor(uinst_t device, rt_uint8_t type, void* buffer, int nbytes) { - struct ureqest setup; + struct urequest setup; int timeout = 100; RT_ASSERT(device != RT_NULL); @@ -272,7 +272,7 @@ rt_err_t rt_usbh_get_descriptor(uinst_t device, rt_uint8_t type, void* buffer, */ rt_err_t rt_usbh_set_address(uinst_t device) { - struct ureqest setup; + struct urequest setup; int timeout = 100; RT_ASSERT(device != RT_NULL); @@ -306,7 +306,7 @@ rt_err_t rt_usbh_set_address(uinst_t device) */ rt_err_t rt_usbh_set_configure(uinst_t device, int config) { - struct ureqest setup; + struct urequest setup; int timeout = 100; /* check parameter */ @@ -335,7 +335,7 @@ rt_err_t rt_usbh_set_configure(uinst_t device, int config) */ rt_err_t rt_usbh_set_interface(uinst_t device, int intf) { - struct ureqest setup; + struct urequest setup; int timeout = 100; /* check parameter */ @@ -364,7 +364,7 @@ rt_err_t rt_usbh_set_interface(uinst_t device, int intf) */ rt_err_t rt_usbh_clear_feature(uinst_t device, int endpoint, int feature) { - struct ureqest setup; + struct urequest setup; int timeout = 100; /* check parameter */ diff --git a/components/drivers/usb/usbhost/core/hub.c b/components/drivers/usb/usbhost/core/hub.c index a71aa4f89c..bde316ae77 100644 --- a/components/drivers/usb/usbhost/core/hub.c +++ b/components/drivers/usb/usbhost/core/hub.c @@ -43,7 +43,7 @@ static struct uclass_driver hub_driver; rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer, rt_size_t nbytes) { - struct ureqest setup; + struct urequest setup; int timeout = 100; /* parameter check */ @@ -72,7 +72,7 @@ rt_err_t rt_usbh_hub_get_descriptor(struct uinstance* device, rt_uint8_t *buffer */ rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint8_t* buffer) { - struct ureqest setup; + struct urequest setup; int timeout = 100; int length = 4; @@ -104,7 +104,7 @@ rt_err_t rt_usbh_hub_get_status(struct uinstance* device, rt_uint8_t* buffer) rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, rt_uint8_t* buffer) { - struct ureqest setup; + struct urequest setup; int timeout = 100; int length = 4; @@ -144,7 +144,7 @@ rt_err_t rt_usbh_hub_get_port_status(uhub_t hub, rt_uint16_t port, rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, rt_uint16_t feature) { - struct ureqest setup; + struct urequest setup; int timeout = 100; /* parameter check */ @@ -183,7 +183,7 @@ rt_err_t rt_usbh_hub_clear_port_feature(uhub_t hub, rt_uint16_t port, rt_err_t rt_usbh_hub_set_port_feature(uhub_t hub, rt_uint16_t port, rt_uint16_t feature) { - struct ureqest setup; + struct urequest setup; int timeout = 100; /* parameter check */