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 */
+
}
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/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..b1837fac53 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);
@@ -87,15 +91,8 @@ void rt_hw_board_init()
MAP_SysTickIntEnable();
MAP_SysTickEnable();
- /* 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();
+ 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");
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/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/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__
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
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 */
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;
+}
+
+
+
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
diff --git a/tools/building.py b/tools/building.py
index cafad2047a..d95cf3672f 100644
--- a/tools/building.py
+++ b/tools/building.py
@@ -256,15 +256,24 @@ 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 BuildOptions
global Env
global Rtt_Root
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',