Refs #584. Reintegrated branch for DHCP support development back into the trunk.

git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@572 5dc33758-31d5-4daf-9ae8-b24bf3d40d73
This commit is contained in:
Frank Voorburg 2018-08-02 14:32:30 +00:00
parent 14e2f87abd
commit d407f9b365
212 changed files with 32823 additions and 25469 deletions

View File

@ -50,7 +50,7 @@
/** \brief Motorola or Intel style byte ordering. */ /** \brief Motorola or Intel style byte ordering. */
#define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) #define BOOT_CPU_BYTE_ORDER_MOTOROLA (0)
/** \brief Enable/disable hook function call right before user program start. */ /** \brief Enable/disable hook function call right before user program start. */
#define BOOT_CPU_USER_PROGRAM_START_HOOK (0) #define BOOT_CPU_USER_PROGRAM_START_HOOK (1)
/**************************************************************************************** /****************************************************************************************
@ -80,72 +80,56 @@
* the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a
* message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA
* and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured
* with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configured with the
* BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros * macro BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros
* BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server
* listen on for connections is configured with BOOT_COM_NET_PORT. * listen on for connections is configured with BOOT_COM_NET_PORT.
* In case the network switch/router supports a DHCP server, you can set configuration
* macro BOOT_COM_NET_DHCP_ENABLE to 1 to enable the DHCP client. In this case the
* DHCP client handles the automatic IP address assignment. In this case the macros for
* configuring the IP address, network mask and gateway address are no longer needed.
*/ */
/** \brief Enable/disable the NET transport layer. */ /** \brief Enable/disable the NET transport layer. */
#define BOOT_COM_NET_ENABLE (1) #define BOOT_COM_NET_ENABLE (1)
/** \brief Configure number of bytes in the target->host data packet. */ /** \brief Configure number of bytes in the target->host data packet. */
#define BOOT_COM_NET_TX_MAX_DATA (64) #define BOOT_COM_NET_TX_MAX_DATA (64)
/** \brief Configure number of bytes in the host->target data packet. */ /** \brief Configure number of bytes in the host->target data packet. */
#define BOOT_COM_NET_RX_MAX_DATA (64) #define BOOT_COM_NET_RX_MAX_DATA (64)
/** \brief Configure the port that the TCP/IP server listens on */ /** \brief Configure the port that the TCP/IP server listens on */
#define BOOT_COM_NET_PORT (1000) #define BOOT_COM_NET_PORT (1000)
/** \brief Enable/disable DHCP client for automatically obtaining an IP address. */
#define BOOT_COM_NET_DHCP_ENABLE (1)
/** \brief Configure the 1st byte of the IP address */ /** \brief Configure the 1st byte of the IP address */
#define BOOT_COM_NET_IPADDR0 (169) #define BOOT_COM_NET_IPADDR0 (192)
/** \brief Configure the 2nd byte of the IP address */ /** \brief Configure the 2nd byte of the IP address */
#define BOOT_COM_NET_IPADDR1 (254) #define BOOT_COM_NET_IPADDR1 (168)
/** \brief Configure the 3rd byte of the IP address */ /** \brief Configure the 3rd byte of the IP address */
#define BOOT_COM_NET_IPADDR2 (19) #define BOOT_COM_NET_IPADDR2 (178)
/** \brief Configure the 4th byte of the IP address */ /** \brief Configure the 4th byte of the IP address */
#define BOOT_COM_NET_IPADDR3 (63) #define BOOT_COM_NET_IPADDR3 (50)
/** \brief Configure the 1st byte of the network mask */ /** \brief Configure the 1st byte of the network mask */
#define BOOT_COM_NET_NETMASK0 (255) #define BOOT_COM_NET_NETMASK0 (255)
/** \brief Configure the 2nd byte of the network mask */ /** \brief Configure the 2nd byte of the network mask */
#define BOOT_COM_NET_NETMASK1 (255) #define BOOT_COM_NET_NETMASK1 (255)
/** \brief Configure the 3rd byte of the network mask */ /** \brief Configure the 3rd byte of the network mask */
#define BOOT_COM_NET_NETMASK2 (0) #define BOOT_COM_NET_NETMASK2 (255)
/** \brief Configure the 4th byte of the network mask */ /** \brief Configure the 4th byte of the network mask */
#define BOOT_COM_NET_NETMASK3 (0) #define BOOT_COM_NET_NETMASK3 (0)
/** \brief Configure the 1st byte of the gateway address */ /** \brief Configure the 1st byte of the gateway address */
#define BOOT_COM_NET_GATEWAY0 (169) #define BOOT_COM_NET_GATEWAY0 (192)
/** \brief Configure the 2nd byte of the gateway address */ /** \brief Configure the 2nd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY1 (254) #define BOOT_COM_NET_GATEWAY1 (168)
/** \brief Configure the 3rd byte of the gateway address */ /** \brief Configure the 3rd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY2 (19) #define BOOT_COM_NET_GATEWAY2 (178)
/** \brief Configure the 4th byte of the gateway address */ /** \brief Configure the 4th byte of the gateway address */
#define BOOT_COM_NET_GATEWAY3 (1) #define BOOT_COM_NET_GATEWAY3 (1)
/** \brief Enable/disable a hook function that is called when the IP address is about /** \brief Enable/disable the deferred initialization mechanism. When enabled, the
* to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. * communication interface is only initialized when: (a) no valid user program
* is detected, or (b) when CpuUserProgramStartHook() returns BLT_FALSE. Your
* bootloader application can explicitly initialize the communication interface
* by calling ComDeferredInit().
*/ */
#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) #define BOOT_COM_NET_DEFERRED_INIT_ENABLE (1)
/** \brief Enable/disable a hook function that is called when the netmask is about
* to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values.
*/
#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0)
/** \brief Enable/disable a hook function that is called when the gateway address is
* about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx
* values.
*/
#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_NET_ENABLE > 0)
/* Override the default time that the backdoor is open if firmware updates via TCP/IP
* are supported. in this case a reactivation of the bootloader results in a re-
* initialization of the ethernet MAC. when directly connected to the ethernet port of
* a PC this will go relatively fast (depending on what MS Windows is being used), but
* when connected to the network via a router this can take several seconds. feel free to
* shorten/lengthen this time for finetuning. the only downside of a long backdoor open
* time is that the starting of the user program will also be delayed for this time.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (10000)
#endif
/**************************************************************************************** /****************************************************************************************

View File

@ -30,6 +30,8 @@
* Include files * Include files
****************************************************************************************/ ****************************************************************************************/
#include "boot.h" /* bootloader generic header */ #include "boot.h" /* bootloader generic header */
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#if (BOOT_FILE_LOGGING_ENABLE > 0) #if (BOOT_FILE_LOGGING_ENABLE > 0)
#include "inc/hw_memmap.h" #include "inc/hw_memmap.h"
#include "inc/hw_types.h" #include "inc/hw_types.h"
@ -81,6 +83,11 @@ blt_bool BackDoorEntryHook(void)
****************************************************************************************/ ****************************************************************************************/
blt_bool CpuUserProgramStartHook(void) blt_bool CpuUserProgramStartHook(void)
{ {
/* do not start the user program is the pushbutton is pressed */
if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1) == 0)
{
return BLT_FALSE;
}
/* okay to start the user program */ /* okay to start the user program */
return BLT_TRUE; return BLT_TRUE;
} /*** end of CpuUserProgramStartHook ***/ } /*** end of CpuUserProgramStartHook ***/
@ -193,79 +200,6 @@ blt_bool NvmWriteChecksumHook(void)
#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */ #endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */
/****************************************************************************************
* N E T W O R K I N T E R F A C E H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_COM_NET_IPADDR_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the IP address is about to be configured.
** \param ipAddrArray 4-byte array where the IP address should be stored.
** \return none.
**
****************************************************************************************/
void NetIpAddressHook(blt_int8u *ipAddrArray)
{
/* This hook function allows a dynamic configuration of the IP address. This could for
* example be used if the bootloader is activated from a running user program and
* should have the same IP address as the user program. This IP address could be stored
* at a fixed location in RAM which can be read here. For now the example implemen-
* tation simply configures the bootloader's default IP address.
*/
ipAddrArray[0] = BOOT_COM_NET_IPADDR0;
ipAddrArray[1] = BOOT_COM_NET_IPADDR1;
ipAddrArray[2] = BOOT_COM_NET_IPADDR2;
ipAddrArray[3] = BOOT_COM_NET_IPADDR3;
} /*** end of NetIpAddressHook ***/
#endif /* BOOT_COM_NET_IPADDR_HOOK_ENABLE > 0 */
#if (BOOT_COM_NET_NETMASK_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the network mask is about to be configured.
** \param netMaskArray 4-byte array where the network mask should be stored.
** \return none.
**
****************************************************************************************/
void NetNetworkMaskHook(blt_int8u *netMaskArray)
{
/* This hook function allows a dynamic configuration of the network mask. This could
* for example be used if the bootloader is activated from a running user program and
* should have the same network mask as the user program. This network mask could be
* stored at a fixed location in RAM which can be read here. For now the example
* implementation simply configures the bootloader's default network mask.
*/
netMaskArray[0] = BOOT_COM_NET_NETMASK0;
netMaskArray[1] = BOOT_COM_NET_NETMASK1;
netMaskArray[2] = BOOT_COM_NET_NETMASK2;
netMaskArray[3] = BOOT_COM_NET_NETMASK3;
} /*** end of NetNetworkMaskHook ***/
#endif /* BOOT_COM_NET_NETMASK_HOOK_ENABLE > 0 */
#if (BOOT_COM_NET_GATEWAY_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the gateway address is about to be
** configured.
** \param gatewayAddrArray 4-byte array where the gateway address should be stored.
** \return none.
**
****************************************************************************************/
void NetGatewayAddressHook(blt_int8u *gatewayAddrArray)
{
/* This hook function allows a dynamic configuration of the network mask. This could
* for example be used if the bootloader is activated from a running user program and
* should have the same network mask as the user program. This network mask could be
* stored at a fixed location in RAM which can be read here. For now the example
* implementation simply configures the bootloader's default network mask.
*/
gatewayAddrArray[0] = BOOT_COM_NET_GATEWAY0;
gatewayAddrArray[1] = BOOT_COM_NET_GATEWAY1;
gatewayAddrArray[2] = BOOT_COM_NET_GATEWAY2;
gatewayAddrArray[3] = BOOT_COM_NET_GATEWAY3;
} /*** end of NetGatewayAddressHook ***/
#endif /* BOOT_COM_NET_GATEWAY_HOOK_ENABLE > 0 */
/**************************************************************************************** /****************************************************************************************
* W A T C H D O G D R I V E R H O O K F U N C T I O N S * W A T C H D O G D R I V E R H O O K F U N C T I O N S
****************************************************************************************/ ****************************************************************************************/

View File

@ -22,7 +22,7 @@
build_output_directory="$(ProjectDir)/../bin" build_output_directory="$(ProjectDir)/../bin"
build_remove_unused_symbols="Yes" build_remove_unused_symbols="Yes"
c_preprocessor_definitions="gcc" c_preprocessor_definitions="gcc"
c_user_include_directories="$(ProjectDir)/..;$(ProjectDir)/../lib;$(ProjectDir)/../lib/inc;$(ProjectDir)/../lib/fatfs;$(ProjectDir)/../lib/uip;$(ProjectDir)/../lib/driverlib;$(ProjectDir)/../../../../Source;$(ProjectDir)/../../../../Source/third_party/fatfs/src;$(ProjectDir)/../../../../Source/third_party/uip/uip;$(ProjectDir)/../../../../Source/ARMCM3_LM3S;$(ProjectDir)/../../../../Source/ARMCM3_LM3S/Crossworks" c_user_include_directories="$(ProjectDir)/..;$(ProjectDir)/../lib;$(ProjectDir)/../lib/inc;$(ProjectDir)/../lib/fatfs;$(ProjectDir)/../lib/uip;$(ProjectDir)/../lib/driverlib;$(ProjectDir)/../../../../Source;$(ProjectDir)/../../../../Source/third_party/fatfs/src;$(ProjectDir)/../../../../Source/third_party/uip/uip;$(ProjectDir)/../../../../Source/third_party/uip/apps/dhcpc;$(ProjectDir)/../../../../Source/ARMCM3_LM3S;$(ProjectDir)/../../../../Source/ARMCM3_LM3S/Crossworks"
gcc_entry_point="reset_handler" gcc_entry_point="reset_handler"
gcc_optimization_level="Optimize For Size" gcc_optimization_level="Optimize For Size"
link_include_standard_libraries="Yes" link_include_standard_libraries="Yes"
@ -100,6 +100,8 @@
<file file_name="../blt_conf.h" /> <file file_name="../blt_conf.h" />
<file file_name="../cstart.s" /> <file file_name="../cstart.s" />
<file file_name="../vectors.c" /> <file file_name="../vectors.c" />
<file file_name="../shared_params.c" />
<file file_name="../shared_params.h" />
</folder> </folder>
</folder> </folder>
<folder Name="Source"> <folder Name="Source">
@ -157,6 +159,8 @@
<file file_name="../../../../Source/third_party/uip/uip/uip-neighbor.h" /> <file file_name="../../../../Source/third_party/uip/uip/uip-neighbor.h" />
<file file_name="../../../../Source/third_party/uip/uip/uipopt.h" /> <file file_name="../../../../Source/third_party/uip/uip/uipopt.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip-split.h" /> <file file_name="../../../../Source/third_party/uip/uip/uip-split.h" />
<file file_name="../../../../Source/third_party/uip/apps/dhcpc/dhcpc.c" />
<file file_name="../../../../Source/third_party/uip/apps/dhcpc/dhcpc.h" />
</folder> </folder>
</folder> </folder>
<file file_name="../../../../Source/net.c" /> <file file_name="../../../../Source/net.c" />

View File

@ -1,7 +1,9 @@
<!DOCTYPE CrossStudio_Session_File> <!DOCTYPE CrossStudio_Session_File>
<session> <session>
<Bookmarks/> <Bookmarks/>
<Breakpoints/> <Breakpoints>
<Exceptions set="MemManage;UsageFault_Coprocessor;UsageFault_CheckingError;UsageFault_StateError;BusFault;ExceptionEntryReturnFault;HardFault" />
</Breakpoints>
<ExecutionProfileWindow/> <ExecutionProfileWindow/>
<FrameBufferWindow> <FrameBufferWindow>
<FrameBufferWindow addressText="" bufferWidth="-1" bufferHeight="-1" addressSpace="" /> <FrameBufferWindow addressText="" bufferWidth="-1" bufferHeight="-1" addressSpace="" />
@ -31,6 +33,8 @@
<ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source;ARMCM3_LM3S" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source;ARMCM3_LM3S" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source;ARMCM3_LM3S;GCC" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source;ARMCM3_LM3S;GCC" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source;third_party" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;Source Files;Source;third_party;uip" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;System Files" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;openblt_ek_lm3s6965;System Files" name="unnamed" />
</Project> </Project>
<Register1> <Register1>
@ -66,7 +70,7 @@
<Watches active="0" update="Never" /> <Watches active="0" update="Never" />
</Watch4> </Watch4>
<Files> <Files>
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="../main.c" y="56" path="../main.c" left="0" selected="1" name="unnamed" top="32" /> <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="26" debugPath="../main.c" y="33" path="../main.c" left="0" selected="1" name="unnamed" top="24" />
</Files> </Files>
<ARMCrossStudioWindow activeProject="openblt_ek_lm3s6965" autoConnectTarget="Luminary USB Debug" debugSearchFileMap="" fileDialogInitialDirectory="C:/Work/software/OpenBLT/Target/Source/ARMCM3_LM3S/GCC" fileDialogDefaultFilter="" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Debug" /> <ARMCrossStudioWindow activeProject="openblt_ek_lm3s6965" autoConnectTarget="Luminary USB Debug" debugSearchFileMap="" fileDialogInitialDirectory="C:/Work/software/OpenBLT_DHCP_Support/Target/Source/third_party/uip/apps/dhcpc" fileDialogDefaultFilter="" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Debug" />
</session> </session>

View File

@ -59,6 +59,10 @@
#define NETDEV_DEFAULT_MACADDR5 (0x45) #define NETDEV_DEFAULT_MACADDR5 (0x45)
/*---------------------------------------------------------------------------*/
static struct uip_eth_addr macAddress;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void netdev_init(void) void netdev_init(void)
{ {
@ -142,6 +146,18 @@ void netdev_init_mac(void)
} }
/*---------------------------------------------------------------------------*/
void netdev_get_mac(unsigned char * mac_addr)
{
mac_addr[0] = macAddress.addr[0];
mac_addr[1] = macAddress.addr[1];
mac_addr[2] = macAddress.addr[2];
mac_addr[3] = macAddress.addr[3];
mac_addr[4] = macAddress.addr[4];
mac_addr[5] = macAddress.addr[5];
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned int netdev_read(void) unsigned int netdev_read(void)
{ {

View File

@ -40,6 +40,7 @@
void netdev_init(void); void netdev_init(void);
void netdev_init_mac(void); void netdev_init_mac(void);
void netdev_get_mac(unsigned char * mac_addr);
unsigned int netdev_read(void); unsigned int netdev_read(void);
void netdev_send(void); void netdev_send(void);

View File

@ -98,6 +98,27 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_MAX_LISTENPORTS 1 #define UIP_CONF_MAX_LISTENPORTS 1
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 1
/**
* UDP Maximum Connections
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CONNS 1
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
/** /**
* uIP buffer size. * uIP buffer size.
* *
@ -119,20 +140,6 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_LOGGING 0 #define UIP_CONF_LOGGING 0
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 1
/** /**
* uIP statistics on or off * uIP statistics on or off
* *
@ -140,10 +147,12 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_STATISTICS 0 #define UIP_CONF_STATISTICS 0
/* Here we include the header file for the application(s) we use in /* Here we include the header file for the application(s) we use in
our project. */ our project. */
#include "boot.h" #include "boot.h"
#include "net.h" #include "net.h"
#include "dhcpc.h"
#endif /* __UIP_CONF_H__ */ #endif /* __UIP_CONF_H__ */

View File

@ -40,6 +40,7 @@
#if (BOOT_FILE_LOGGING_ENABLE > 0) #if (BOOT_FILE_LOGGING_ENABLE > 0)
#include "driverlib/uartlib.h" #include "driverlib/uartlib.h"
#endif #endif
#include "shared_params.h" /* Shared parameters header */
/**************************************************************************************** /****************************************************************************************
* Function prototypes * Function prototypes
@ -55,11 +56,44 @@ static void Init(void);
****************************************************************************************/ ****************************************************************************************/
int main(void) int main(void)
{ {
blt_int8u deferredInitRequestFlag = 0;
/* initialize the microcontroller */ /* initialize the microcontroller */
Init(); Init();
/* initialize the shared parameters module */
SharedParamsInit();
/* initialize the bootloader */ /* initialize the bootloader */
BootInit(); BootInit();
#if (BOOT_COM_DEFERRED_INIT_ENABLE == 1)
/* the bootloader is configured to NOT initialize the TCP/IP network stack by default
* to bypass unnecessary delay times before starting the user program. the TCP/IP net-
* work tack is now only initialized when: (a) no valid user program is detected, or
* (b) a forced backdoor entry occurred (CpuUserProgramStartHook() returned BLT_FALSE).
*
* these demo bootloader and user programs have one extra feature implemented for
* demonstration purposes. the demo user program can detect firmware update requests
* from the TCP/IP network in which case it activates the bootloader. But...the
* TCP/IP network stack will not be initialized in this situation. for this reason
* the shared parameter module was integrated in both the bootloader and user program.
* more information about the shared parameter module can be found here:
* https://www.feaser.com/en/blog/?p=216
*
* the shared parameter at the first index (0) contains a flag. this flag is set to
* 1, right before the user program activates this bootloader, to explicitly request
* the bootloader to initialize the TCP/IP network stack. this makes it possible for
* a firmware update to proceed. the code here reads out this flag and performs the
* TCP/IP network stack initialization when requested.
*/
SharedParamsReadByIndex(0, &deferredInitRequestFlag);
if (deferredInitRequestFlag == 1)
{
/* explicitly initialize all communication interface for which the deferred
* initialization feature was enabled.
*/
ComDeferredInit();
}
#endif
/* start the infinite program loop */ /* start the infinite program loop */
while (1) while (1)
{ {
@ -81,6 +115,14 @@ static void Init(void)
{ {
/* set the clocking to run at 50MHz from the PLL */ /* set the clocking to run at 50MHz from the PLL */
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
/* initialize the status button as a digital input. it is used to override the
* starting of the user program.
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
#if (BOOT_COM_UART_ENABLE > 0) #if (BOOT_COM_UART_ENABLE > 0)
#if (BOOT_COM_UART_CHANNEL_INDEX == 0) #if (BOOT_COM_UART_CHANNEL_INDEX == 0)
/* enable and configure UART0 related peripherals and pins */ /* enable and configure UART0 related peripherals and pins */

View File

@ -1,14 +1,15 @@
MEMORY MEMORY
{ {
UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0
SRAM (wx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 SHARED (wx) : ORIGIN = 0x20000000, LENGTH = 64
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00008000 SRAM (wx) : ORIGIN = 0x20000040, LENGTH = 0x00010000 - 64
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00008000
} }
SECTIONS SECTIONS
{ {
__SRAM_segment_start__ = 0x20000000; __SRAM_segment_start__ = 0x20000040;
__SRAM_segment_end__ = 0x20010000; __SRAM_segment_end__ = 0x20010000;
__FLASH_segment_start__ = 0x00000000; __FLASH_segment_start__ = 0x00000000;
__FLASH_segment_end__ = 0x00008000; __FLASH_segment_end__ = 0x00008000;
@ -22,6 +23,17 @@ SECTIONS
__STACKSIZE_UND__ = 0; __STACKSIZE_UND__ = 0;
__HEAPSIZE__ = 128; __HEAPSIZE__ = 128;
.shared (NOLOAD):
{
. = ALIGN(4);
__shared_start__ = .;
*(.shared)
*(.shared.*)
KEEP(*(.shared))
. = ALIGN(4);
__shared_end__ = .;
} > SHARED
__vectors_ram_load_start__ = ALIGN(__SRAM_segment_start__ , 256); __vectors_ram_load_start__ = ALIGN(__SRAM_segment_start__ , 256);
.vectors_ram ALIGN(__SRAM_segment_start__ , 256) (NOLOAD) : AT(ALIGN(__SRAM_segment_start__ , 256)) .vectors_ram ALIGN(__SRAM_segment_start__ , 256) (NOLOAD) : AT(ALIGN(__SRAM_segment_start__ , 256))
{ {

View File

@ -0,0 +1,301 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/shared_params.c
* \brief Shared RAM parameters source file.
* \ingroup Boot_ARMCM3_LM3S_EK_LM3S6965_Crossworks
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stddef.h> /* Standard definitions (NULL). */
#include "shared_params.h" /* Shared parameters header. */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Constant parameter buffer identifier. This value is always located as the
* start of the buffer to validate the the RAM contains valid shared parameters.
*/
#define SHARED_PARAMS_BUFFER_ID (0xCE42E7A2u)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Layout of the shared parameters RAM buffer. */
typedef struct t_shared_params_buffer
{
/** \brief Fixed buffer identifier to validate that the RAM contains valid shared
* parameters.
*/
uint32_t identifier;
/** \brief Array for the actual parameter data. */
uint8_t data[SHARED_PARAMS_CFG_BUFFER_DATA_LEN];
/** \brief Checksum value of all the bytes in the buffer, excluding this checksum
* value of obvious reasons. The checksum is calculated as the Two's
* complement of the sum of the bytes.
*/
uint16_t checksum;
} tSharedParamsBuffer;
/****************************************************************************************
* Global data declarations
****************************************************************************************/
/** \brief Declaration of the actual parameter buffer that this module manages.
* \warning For the shared RAM parameters to work properly for sharing information
* between the bootloader and user program, it is important that this
* variable is linked to the exact same RAM address in both the bootloader
* and the user program. Additionally, it should be configured such that the
* C-startup code does NOT zero its contents during system initialization. This
* is the code that runs in the reset event handler, before function main() is
* called.
* For GCC based embedded toolchains, the solution is to assign this variable
* to a custom section, in this case called ".shared". Then in the linker
* script, add the following to the SECTIONS:
*
* .shared (NOLOAD) :
* {
* . = ALIGN(4);
* _sshared = .;
* __shared_start__ = _sshared;
* *(.shared)
* *(.shared.*)
* KEEP(*(.shared))
* . = ALIGN(4);
* _eshared = .;
* __shared_end__ = _eshared;
* } >SHARED
*
* Next, add a new MEMORY entry for SHARED at the start of RAM and reduce
* the length of the remaining RAM:
*
* SHARED (xrw) : ORIGIN = 0x200000C0, LENGTH = 64
* RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 32K - 192 - 64
*
* Note that the previous example is for an STM32F0 microcontroller where
* the first 192 (0xC0) bytes in RAM are reserved for the user program
* vector table.
*
* \remark This same approach can be applied with other toolchains such as Keil MDK
* and IAR EWARM. Consult the compiler and linker user manuals of your
* toolchain to find out how to place a RAM variable at a fixed memory address
* and to prevent the C-startup code from zeroing its contents.
* Here are a few links to get you started:
* * IAR EWARM:
* https://www.iar.com/support/tech-notes/compiler/
* linker-error-for-absolute-located-variable/
* * Keil MDK:
* http://www.keil.com/support/docs/3480.htm
*/
static tSharedParamsBuffer sharedParamsBuffer __attribute__ ((section (".shared")));
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static bool SharedParamsValidateBuffer(void);
static void SharedParamsWriteChecksum(void);
static bool SharedParamsVerifyChecksum(void);
static uint16_t SharedParamsCalculateChecksum(void);
/************************************************************************************//**
** \brief Initializes the shared RAM parameters module.
** \return none.
**
****************************************************************************************/
void SharedParamsInit(void)
{
uint32_t byteIdx;
/* The shared parameter buffer does not get initialized by the C-startup code. Another
* previously running program could have initialized it, in which case it is ready
* for use and nothing more needs to be done.
*/
if (!SharedParamsValidateBuffer())
{
/* The shared parameter buffer was not yet initialized by a running program. This
* typically happens after a cold reset where the RAM contents were lost. In this
* case we need to explicitly configure and initialize it, since the C-startup code
* was configured to not do this.
*
* The initialization consists of setting the buffer identifier, zeroing the
* actual parameter data and updating the checksum at the end.
*/
sharedParamsBuffer.identifier = SHARED_PARAMS_BUFFER_ID;
for (byteIdx=0; byteIdx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
sharedParamsBuffer.data[byteIdx] = 0;
}
SharedParamsWriteChecksum();
}
} /*** end of SharedParamsInit ***/
/************************************************************************************//**
** \brief Reads a data byte from the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Pointer to where the read data value is stored.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) &&
(value != NULL) )
{
/* Read the value and update the result. */
*value = sharedParamsBuffer.data[idx];
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsReadByIndex ***/
/************************************************************************************//**
** \brief Writes a data byte to the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Value to write.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) )
{
/* Write the value. */
sharedParamsBuffer.data[idx] = value;
/* Update the checksum since the contents were just changed. */
SharedParamsWriteChecksum();
/* Update the result. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsWriteByIndex ***/
/************************************************************************************//**
** \brief Validates the shared parameter buffer contents by looking at the table
** identifier and verifying its checksum.
** \return True if successful, false otherwise.
**
****************************************************************************************/
static bool SharedParamsValidateBuffer(void)
{
bool result = false;
/* Perform validation. */
if ( (sharedParamsBuffer.identifier == SHARED_PARAMS_BUFFER_ID) &&
(SharedParamsVerifyChecksum()) )
{
/* The shared parameter buffer is valid, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsValitabeTable ***/
/************************************************************************************//**
** \brief Calculates and writes the checksum into the buffer.
** \return none.
**
****************************************************************************************/
static void SharedParamsWriteChecksum(void)
{
/* Calculate and write the checksum. */
sharedParamsBuffer.checksum = SharedParamsCalculateChecksum();
} /*** end of SharedParamsWriteChecksum ***/
/************************************************************************************//**
** \brief Calculates and verifies the checksum that is currently present in the
** buffer.
** \return True is the checksum is correct, false otherwise.
**
****************************************************************************************/
static bool SharedParamsVerifyChecksum(void)
{
bool result = false;
/* Calculate and verify the checksum. */
if (SharedParamsCalculateChecksum() == sharedParamsBuffer.checksum)
{
/* Checksum is correct, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsVerifyChecksum ***/
/************************************************************************************//**
** \brief Calculates and returns the checksum value for the current contents in the
** buffer. The checksum is calculated by taking the sum of all bytes in the
** parameter buffer (excluding the checksum at the end) and them taking the
** two's complement value of it.
** \return The calculated checksum value.
**
****************************************************************************************/
static uint16_t SharedParamsCalculateChecksum(void)
{
uint16_t result = 0;
uint32_t byteIdx;
/* Add the identifier bytes to the checksum. */
result += (uint8_t)sharedParamsBuffer.identifier;
result += (uint8_t)(sharedParamsBuffer.identifier >> 8u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 16u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 24u);
/* Loop through the parameter data array. */
for (byteIdx=0; byteIdx<SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
/* Add parameter data byte to the checksum. */
result += (uint8_t)sharedParamsBuffer.data[byteIdx];
}
/* Determine one's complement. */
result = ~result;
/* Determine two's complement. */
result += 1;
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsCalculateChecksum ***/
/*********************************** end of shared_params.c ****************************/

View File

@ -0,0 +1,57 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Boot/shared_params.h
* \brief Shared RAM parameters header file.
* \ingroup Boot_ARMCM3_LM3S_EK_LM3S6965_Crossworks
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef SHARED_PARAMS_H
#define SHARED_PARAMS_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* Standard integer types. */
#include <stdbool.h> /* Standard boolean types. */
/****************************************************************************************
* Configuration macros
****************************************************************************************/
/** \brief Configuration macro for specifying the size of the data inside the parameter
* buffer. This is the length in bytes of the actual parameter data, so
* excluding the bufferId and checksum.
*/
#define SHARED_PARAMS_CFG_BUFFER_DATA_LEN (56u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void SharedParamsInit(void);
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value);
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value);
#endif /* SHARED_PARAMS_H */
/*********************************** end of shared_params.h ****************************/

View File

@ -36,6 +36,7 @@
#include "led.h" /* LED driver */ #include "led.h" /* LED driver */
#include "time.h" /* Timer driver */ #include "time.h" /* Timer driver */
#include "net.h" /* TCP/IP server application */ #include "net.h" /* TCP/IP server application */
#include "shared_params.h" /* Shared parameters header. */
#include "inc/hw_ints.h" #include "inc/hw_ints.h"
#include "inc/hw_memmap.h" #include "inc/hw_memmap.h"
#include "inc/hw_nvic.h" #include "inc/hw_nvic.h"

View File

@ -1,143 +1,196 @@
<!DOCTYPE CrossStudio_Project_File> <!DOCTYPE CrossStudio_Project_File>
<solution Name="lm3s6965_crossworks" target="8" version="2"> <solution Name="lm3s6965_crossworks" target="8" version="2">
<project Name="demoprog_ek_lm3s6965"> <project Name="demoprog_ek_lm3s6965">
<configuration Name="Common" Placement="Flash" Target="LM3S6965" arm_architecture="v7M" arm_core_type="Cortex-M3" arm_gcc_target="arm-unknown-eabi" arm_linker_heap_size="128" arm_linker_process_stack_size="0" arm_linker_stack_size="128" arm_long_calls="Yes" arm_simulator_memory_simulation_filename="$(TargetsDir)/LM3S/LM3SSimulatorMemory.dll" arm_simulator_memory_simulation_parameter="0x40000;0x10000" arm_target_debug_interface_type="ADIv5" arm_target_loader_applicable_loaders="Flash" arm_target_loader_default_loader="Flash" arm_use_gcc_libraries="Yes" build_intermediate_directory="$(Configuration)/../../obj" build_output_directory="$(ProjectDir)/../bin" c_preprocessor_definitions="gcc" c_user_include_directories="$(ProjectDir)/..;$(ProjectDir)/../lib;$(ProjectDir)/../lib/inc;$(ProjectDir)/../lib/uip;$(ProjectDir)/../lib/driverlib;$(ProjectDir)/../../../../Source/third_party/uip/uip" gcc_entry_point="reset_handler" gcc_optimization_level="None" linker_additional_files="" linker_memory_map_file="$(TargetsDir)/LM3S/LM3S6965_MemoryMap.xml" linker_output_format="srec" linker_printf_width_precision_supported="No" linker_scanf_fmt_level="int" linker_section_placement_file="$(StudioDir)/targets/Cortex_M/flash_placement.xml" project_directory="" project_type="Executable" property_groups_file_path="$(TargetsDir)/LM3S/propertyGroups.xml" target_get_partname_script="GetPartName()" target_reset_script="Reset()"/> <configuration
<configuration Name="Flash" arm_target_flash_loader_file_path="$(TargetsDir)/LM3S/Release/Loader.elf" arm_target_flash_loader_type="LIBMEM RPC Loader" target_reset_script="FLASHReset()"/> Name="Common"
Placement="Flash"
Target="LM3S6965"
arm_architecture="v7M"
arm_core_type="Cortex-M3"
arm_gcc_target="arm-unknown-eabi"
arm_linker_heap_size="128"
arm_linker_process_stack_size="0"
arm_linker_stack_size="128"
arm_long_calls="Yes"
arm_simulator_memory_simulation_filename="$(TargetsDir)/LM3S/LM3SSimulatorMemory.dll"
arm_simulator_memory_simulation_parameter="0x40000;0x10000"
arm_target_debug_interface_type="ADIv5"
arm_target_loader_applicable_loaders="Flash"
arm_target_loader_default_loader="Flash"
arm_use_gcc_libraries="Yes"
build_intermediate_directory="$(Configuration)/../../obj"
build_output_directory="$(ProjectDir)/../bin"
c_preprocessor_definitions="gcc"
c_user_include_directories="$(ProjectDir)/..;$(ProjectDir)/../lib;$(ProjectDir)/../lib/inc;$(ProjectDir)/../lib/uip;$(ProjectDir)/../lib/driverlib;$(ProjectDir)/../../../../Source/third_party/uip/uip;$(ProjectDir)/../../../../Source/third_party/uip/apps/dhcpc"
gcc_entry_point="reset_handler"
gcc_optimization_level="None"
linker_additional_files=""
linker_memory_map_file="$(TargetsDir)/LM3S/LM3S6965_MemoryMap.xml"
linker_output_format="srec"
linker_printf_width_precision_supported="No"
linker_scanf_fmt_level="int"
linker_section_placement_file="$(StudioDir)/targets/Cortex_M/flash_placement.xml"
project_directory=""
project_type="Executable"
property_groups_file_path="$(TargetsDir)/LM3S/propertyGroups.xml"
target_get_partname_script="GetPartName()"
target_reset_script="Reset()" />
<configuration
Name="Flash"
arm_target_flash_loader_file_path="$(TargetsDir)/LM3S/Release/Loader.elf"
arm_target_flash_loader_type="LIBMEM RPC Loader"
target_reset_script="FLASHReset()" />
<folder Name="Source Files"> <folder Name="Source Files">
<configuration Name="Common" filter="c;cpp;cxx;cc;h;s;asm;inc"/> <configuration Name="Common" filter="c;cpp;cxx;cc;h;s;asm;inc" />
<folder Name="Demo"> <folder Name="Demo">
<folder Name="Prog" file_name=""> <folder Name="Prog">
<file file_name="../boot.c"/> <file file_name="../boot.c" />
<file file_name="../boot.h"/> <file file_name="../boot.h" />
<file file_name="../cstart.s"/> <file file_name="../cstart.s" />
<file file_name="../header.h"/> <file file_name="../header.h" />
<file file_name="../led.c"/> <file file_name="../led.c" />
<file file_name="../led.h"/> <file file_name="../led.h" />
<file file_name="../main.c"/> <file file_name="../main.c" />
<file file_name="../vectors.c"/> <file file_name="../vectors.c" />
<file file_name="../time.c"/> <file file_name="../time.c" />
<file file_name="../time.h"/> <file file_name="../time.h" />
<file file_name="../net.c"/> <file file_name="../net.c" />
<file file_name="../net.h"/> <file file_name="../net.h" />
<file file_name="../shared_params.c" />
<file file_name="../shared_params.h" />
</folder> </folder>
<folder Name="third_party" file_name=""> <folder Name="third_party">
<file file_name="../../../../Source/third_party/uip/uip/clock.h"/> <file file_name="../../../../Source/third_party/uip/uip/clock.h" />
<file file_name="../../../../Source/third_party/uip/uip/lc.h"/> <file file_name="../../../../Source/third_party/uip/uip/lc.h" />
<file file_name="../../../../Source/third_party/uip/uip/lc-addrlabels.h"/> <file file_name="../../../../Source/third_party/uip/uip/lc-addrlabels.h" />
<file file_name="../../../../Source/third_party/uip/uip/lc-switch.h"/> <file file_name="../../../../Source/third_party/uip/uip/lc-switch.h" />
<file file_name="../../../../Source/third_party/uip/uip/pt.h"/> <file file_name="../../../../Source/third_party/uip/uip/pt.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip.c"/> <file file_name="../../../../Source/third_party/uip/uip/uip.c" />
<file file_name="../../../../Source/third_party/uip/uip/uip.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip_arch.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip_arch.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip_arp.c"/> <file file_name="../../../../Source/third_party/uip/uip/uip_arp.c" />
<file file_name="../../../../Source/third_party/uip/uip/uip_arp.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip_arp.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip_timer.c"/> <file file_name="../../../../Source/third_party/uip/uip/uip_timer.c" />
<file file_name="../../../../Source/third_party/uip/uip/uip_timer.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip_timer.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip-fw.c"/> <file file_name="../../../../Source/third_party/uip/uip/uip-fw.c" />
<file file_name="../../../../Source/third_party/uip/uip/uip-fw.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip-fw.h" />
<file file_name="../../../../Source/third_party/uip/uip/uiplib.c"/> <file file_name="../../../../Source/third_party/uip/uip/uiplib.c" />
<file file_name="../../../../Source/third_party/uip/uip/uiplib.h"/> <file file_name="../../../../Source/third_party/uip/uip/uiplib.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip-neighbor.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip-neighbor.h" />
<file file_name="../../../../Source/third_party/uip/uip/uipopt.h"/> <file file_name="../../../../Source/third_party/uip/uip/uipopt.h" />
<file file_name="../../../../Source/third_party/uip/uip/uip-split.h"/> <file file_name="../../../../Source/third_party/uip/uip/uip-split.h" />
<file file_name="../../../../Source/third_party/uip/apps/dhcpc/dhcpc.c" />
<file file_name="../../../../Source/third_party/uip/apps/dhcpc/dhcpc.h" />
</folder> </folder>
</folder> </folder>
</folder> </folder>
<folder Name="System Files"> <folder Name="System Files">
<file file_name="$(TargetsDir)/LM3S/LM3S_Target.js"> <file file_name="$(TargetsDir)/LM3S/LM3S_Target.js">
<configuration Name="Common" file_type="Reset Script"/> <configuration Name="Common" file_type="Reset Script" />
</file> </file>
<file file_name="../memory.x"> <file file_name="../memory.x">
<configuration Name="Common" file_type="Linker Script"/> <configuration Name="Common" file_type="Linker Script" />
</file> </file>
</folder> </folder>
<folder Name="Library Files"> <folder Name="Library Files">
<folder Name="Inc"> <folder Name="Inc">
<file file_name="../lib/inc/asmdefs.h"/> <file file_name="../lib/inc/asmdefs.h" />
<file file_name="../lib/inc/hw_adc.h"/> <file file_name="../lib/inc/hw_adc.h" />
<file file_name="../lib/inc/hw_comp.h"/> <file file_name="../lib/inc/hw_comp.h" />
<file file_name="../lib/inc/hw_epi.h"/> <file file_name="../lib/inc/hw_epi.h" />
<file file_name="../lib/inc/hw_ethernet.h"/> <file file_name="../lib/inc/hw_ethernet.h" />
<file file_name="../lib/inc/hw_flash.h"/> <file file_name="../lib/inc/hw_flash.h" />
<file file_name="../lib/inc/hw_gpio.h"/> <file file_name="../lib/inc/hw_gpio.h" />
<file file_name="../lib/inc/hw_hibernate.h"/> <file file_name="../lib/inc/hw_hibernate.h" />
<file file_name="../lib/inc/hw_i2c.h"/> <file file_name="../lib/inc/hw_i2c.h" />
<file file_name="../lib/inc/hw_i2s.h"/> <file file_name="../lib/inc/hw_i2s.h" />
<file file_name="../lib/inc/hw_ints.h"/> <file file_name="../lib/inc/hw_ints.h" />
<file file_name="../lib/inc/hw_memmap.h"/> <file file_name="../lib/inc/hw_memmap.h" />
<file file_name="../lib/inc/hw_nvic.h"/> <file file_name="../lib/inc/hw_nvic.h" />
<file file_name="../lib/inc/hw_pwm.h"/> <file file_name="../lib/inc/hw_pwm.h" />
<file file_name="../lib/inc/hw_qei.h"/> <file file_name="../lib/inc/hw_qei.h" />
<file file_name="../lib/inc/hw_ssi.h"/> <file file_name="../lib/inc/hw_ssi.h" />
<file file_name="../lib/inc/hw_sysctl.h"/> <file file_name="../lib/inc/hw_sysctl.h" />
<file file_name="../lib/inc/hw_timer.h"/> <file file_name="../lib/inc/hw_timer.h" />
<file file_name="../lib/inc/hw_types.h"/> <file file_name="../lib/inc/hw_types.h" />
<file file_name="../lib/inc/hw_uart.h"/> <file file_name="../lib/inc/hw_uart.h" />
<file file_name="../lib/inc/hw_udma.h"/> <file file_name="../lib/inc/hw_udma.h" />
<file file_name="../lib/inc/hw_usb.h"/> <file file_name="../lib/inc/hw_usb.h" />
<file file_name="../lib/inc/hw_watchdog.h"/> <file file_name="../lib/inc/hw_watchdog.h" />
<file file_name="../lib/inc/lm3s6965.h"/> <file file_name="../lib/inc/lm3s6965.h" />
</folder> </folder>
<folder Name="Driverlib"> <folder Name="Driverlib">
<file file_name="../lib/driverlib/adc.c"/> <file file_name="../lib/driverlib/adc.c" />
<file file_name="../lib/driverlib/adc.h"/> <file file_name="../lib/driverlib/adc.h" />
<file file_name="../lib/driverlib/comp.c"/> <file file_name="../lib/driverlib/comp.c" />
<file file_name="../lib/driverlib/comp.h"/> <file file_name="../lib/driverlib/comp.h" />
<file file_name="../lib/driverlib/cpu.c"/> <file file_name="../lib/driverlib/cpu.c" />
<file file_name="../lib/driverlib/cpu.h"/> <file file_name="../lib/driverlib/cpu.h" />
<file file_name="../lib/driverlib/debug.h"/> <file file_name="../lib/driverlib/debug.h" />
<file file_name="../lib/driverlib/epi.c"/> <file file_name="../lib/driverlib/epi.c" />
<file file_name="../lib/driverlib/epi.h"/> <file file_name="../lib/driverlib/epi.h" />
<file file_name="../lib/driverlib/ethernet.c"/> <file file_name="../lib/driverlib/ethernet.c" />
<file file_name="../lib/driverlib/ethernet.h"/> <file file_name="../lib/driverlib/ethernet.h" />
<file file_name="../lib/driverlib/flash.c"/> <file file_name="../lib/driverlib/flash.c" />
<file file_name="../lib/driverlib/flash.h"/> <file file_name="../lib/driverlib/flash.h" />
<file file_name="../lib/driverlib/gpio.c"/> <file file_name="../lib/driverlib/gpio.c" />
<file file_name="../lib/driverlib/gpio.h"/> <file file_name="../lib/driverlib/gpio.h" />
<file file_name="../lib/driverlib/hibernate.c"/> <file file_name="../lib/driverlib/hibernate.c" />
<file file_name="../lib/driverlib/hibernate.h"/> <file file_name="../lib/driverlib/hibernate.h" />
<file file_name="../lib/driverlib/i2c.c"/> <file file_name="../lib/driverlib/i2c.c" />
<file file_name="../lib/driverlib/i2c.h"/> <file file_name="../lib/driverlib/i2c.h" />
<file file_name="../lib/driverlib/i2s.c"/> <file file_name="../lib/driverlib/i2s.c" />
<file file_name="../lib/driverlib/i2s.h"/> <file file_name="../lib/driverlib/i2s.h" />
<file file_name="../lib/driverlib/interrupt.c"/> <file file_name="../lib/driverlib/interrupt.c" />
<file file_name="../lib/driverlib/interrupt.h"/> <file file_name="../lib/driverlib/interrupt.h" />
<file file_name="../lib/driverlib/mpu.c"/> <file file_name="../lib/driverlib/mpu.c" />
<file file_name="../lib/driverlib/mpu.h"/> <file file_name="../lib/driverlib/mpu.h" />
<file file_name="../lib/driverlib/pin_map.h"/> <file file_name="../lib/driverlib/pin_map.h" />
<file file_name="../lib/driverlib/pwm.c"/> <file file_name="../lib/driverlib/pwm.c" />
<file file_name="../lib/driverlib/pwm.h"/> <file file_name="../lib/driverlib/pwm.h" />
<file file_name="../lib/driverlib/qei.c"/> <file file_name="../lib/driverlib/qei.c" />
<file file_name="../lib/driverlib/qei.h"/> <file file_name="../lib/driverlib/qei.h" />
<file file_name="../lib/driverlib/rom.h"/> <file file_name="../lib/driverlib/rom.h" />
<file file_name="../lib/driverlib/rom_map.h"/> <file file_name="../lib/driverlib/rom_map.h" />
<file file_name="../lib/driverlib/ssi.c"/> <file file_name="../lib/driverlib/ssi.c" />
<file file_name="../lib/driverlib/ssi.h"/> <file file_name="../lib/driverlib/ssi.h" />
<file file_name="../lib/driverlib/sysctl.c"/> <file file_name="../lib/driverlib/sysctl.c" />
<file file_name="../lib/driverlib/sysctl.h"/> <file file_name="../lib/driverlib/sysctl.h" />
<file file_name="../lib/driverlib/systick.c"/> <file file_name="../lib/driverlib/systick.c" />
<file file_name="../lib/driverlib/systick.h"/> <file file_name="../lib/driverlib/systick.h" />
<file file_name="../lib/driverlib/timer.c"/> <file file_name="../lib/driverlib/timer.c" />
<file file_name="../lib/driverlib/timer.h"/> <file file_name="../lib/driverlib/timer.h" />
<file file_name="../lib/driverlib/uart.c"/> <file file_name="../lib/driverlib/uart.c" />
<file file_name="../lib/driverlib/uart.h"/> <file file_name="../lib/driverlib/uart.h" />
<file file_name="../lib/driverlib/udma.c"/> <file file_name="../lib/driverlib/udma.c" />
<file file_name="../lib/driverlib/udma.h"/> <file file_name="../lib/driverlib/udma.h" />
<file file_name="../lib/driverlib/usb.c"/> <file file_name="../lib/driverlib/usb.c" />
<file file_name="../lib/driverlib/usb.h"/> <file file_name="../lib/driverlib/usb.h" />
<file file_name="../lib/driverlib/watchdog.c"/> <file file_name="../lib/driverlib/watchdog.c" />
<file file_name="../lib/driverlib/watchdog.h"/> <file file_name="../lib/driverlib/watchdog.h" />
</folder> </folder>
<folder Name="uip" file_name=""> <folder Name="uip">
<file file_name="../lib/uip/clock-arch.c"/> <file file_name="../lib/uip/clock-arch.c" />
<file file_name="../lib/uip/clock-arch.h"/> <file file_name="../lib/uip/clock-arch.h" />
<file file_name="../lib/uip/netdev.c"/> <file file_name="../lib/uip/netdev.c" />
<file file_name="../lib/uip/netdev.h"/> <file file_name="../lib/uip/netdev.h" />
<file file_name="../lib/uip/uip-conf.h"/> <file file_name="../lib/uip/uip-conf.h" />
</folder> </folder>
</folder> </folder>
</project> </project>
<configuration Name="THUMB Debug" inherited_configurations="THUMB;Debug"/> <configuration Name="THUMB Debug" inherited_configurations="THUMB;Debug" />
<configuration Name="THUMB" Platform="ARM" arm_instruction_set="THUMB" arm_library_instruction_set="THUMB" c_preprocessor_definitions="__THUMB" hidden="Yes"/> <configuration
<configuration Name="Debug" build_debug_information="Yes" c_preprocessor_definitions="DEBUG" gcc_optimization_level="None" hidden="Yes" link_include_startup_code="No"/> Name="THUMB"
Platform="ARM"
arm_instruction_set="THUMB"
arm_library_instruction_set="THUMB"
c_preprocessor_definitions="__THUMB"
hidden="Yes" />
<configuration
Name="Debug"
build_debug_information="Yes"
c_preprocessor_definitions="DEBUG"
gcc_optimization_level="None"
hidden="Yes"
link_include_startup_code="No" />
</solution> </solution>

View File

@ -21,11 +21,10 @@
<Project> <Project>
<ProjectSessionItem path="lm3s6965_crossworks" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Library Files" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Library Files;uip" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files;Demo" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files;Demo" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files;Demo;Prog" name="unnamed" /> <ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files;Demo;Prog" name="unnamed" />
<ProjectSessionItem path="lm3s6965_crossworks;demoprog_ek_lm3s6965;Source Files;Demo;third_party" name="unnamed" />
</Project> </Project>
<Register1> <Register1>
<RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" decimalNodes="" octalNodes="" asciiNodes="" visibleNodes="" name="" /> <RegisterWindow openNodes="" binaryNodes="" unsignedNodes="" decimalNodes="" octalNodes="" asciiNodes="" visibleNodes="" name="" />
@ -56,11 +55,7 @@
<Watches active="0" update="Never" /> <Watches active="0" update="Never" />
</Watch4> </Watch4>
<Files> <Files>
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="../main.c" y="0" path="../main.c" left="0" selected="0" name="unnamed" top="0" /> <SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="../main.c" y="17" path="../main.c" left="0" selected="1" name="unnamed" top="13" />
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Latin1" x="0" debugPath="../led.c" y="28" path="../led.c" left="0" selected="0" name="unnamed" top="3" />
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Default" x="0" debugPath="../boot.c" y="176" path="../boot.c" left="0" selected="0" name="unnamed" top="150" />
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Default" x="0" debugPath="../net.c" y="164" path="../net.c" left="0" selected="0" name="unnamed" top="158" />
<SessionOpenFile useTextEdit="1" useBinaryEdit="0" codecName="Default" x="0" debugPath="../lib/uip/netdev.c" y="113" path="../lib/uip/netdev.c" left="0" selected="1" name="unnamed" top="85" />
</Files> </Files>
<ARMCrossStudioWindow activeProject="demoprog_ek_lm3s6965" autoConnectTarget="Texas Instruments ICDI" debugSearchFileMap="" fileDialogInitialDirectory="C:/Work/software/OpenBLT/Target/Source/third_party/uip/uip" fileDialogDefaultFilter="*.c" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Debug" /> <ARMCrossStudioWindow activeProject="demoprog_ek_lm3s6965" autoConnectTarget="Texas Instruments ICDI" debugSearchFileMap="" fileDialogInitialDirectory="C:/Work/software/OpenBLT_DHCP_Support/Target/Source/third_party/uip/apps/dhcpc" fileDialogDefaultFilter="" autoConnectCapabilities="388991" debugSearchPath="" buildConfiguration="THUMB Debug" />
</session> </session>

View File

@ -59,6 +59,10 @@
#define NETDEV_DEFAULT_MACADDR5 (0x45) #define NETDEV_DEFAULT_MACADDR5 (0x45)
/*---------------------------------------------------------------------------*/
static struct uip_eth_addr macAddress;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void netdev_init(void) void netdev_init(void)
{ {
@ -142,6 +146,18 @@ void netdev_init_mac(void)
} }
/*---------------------------------------------------------------------------*/
void netdev_get_mac(unsigned char * mac_addr)
{
mac_addr[0] = macAddress.addr[0];
mac_addr[1] = macAddress.addr[1];
mac_addr[2] = macAddress.addr[2];
mac_addr[3] = macAddress.addr[3];
mac_addr[4] = macAddress.addr[4];
mac_addr[5] = macAddress.addr[5];
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned int netdev_read(void) unsigned int netdev_read(void)
{ {

View File

@ -40,6 +40,7 @@
void netdev_init(void); void netdev_init(void);
void netdev_init_mac(void); void netdev_init_mac(void);
void netdev_get_mac(unsigned char * mac_addr);
unsigned int netdev_read(void); unsigned int netdev_read(void);
void netdev_send(void); void netdev_send(void);

View File

@ -98,6 +98,27 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_MAX_LISTENPORTS 1 #define UIP_CONF_MAX_LISTENPORTS 1
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 1
/**
* UDP Maximum Connections
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CONNS 1
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
/** /**
* uIP buffer size. * uIP buffer size.
* *
@ -119,20 +140,6 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_LOGGING 0 #define UIP_CONF_LOGGING 0
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 1
/** /**
* uIP statistics on or off * uIP statistics on or off
* *
@ -140,10 +147,12 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_STATISTICS 0 #define UIP_CONF_STATISTICS 0
/* Here we include the header file for the application(s) we use in /* Here we include the header file for the application(s) we use in
our project. */ our project. */
#include "boot.h" #include "header.h"
#include "net.h" #include "net.h"
#include "dhcpc.h"
#endif /* __UIP_CONF_H__ */ #endif /* __UIP_CONF_H__ */

View File

@ -48,10 +48,17 @@ int main(void)
{ {
/* initialize the microcontroller */ /* initialize the microcontroller */
Init(); Init();
/* initialize the shared parameters module */
SharedParamsInit();
/* initialize the network application */ /* initialize the network application */
NetInit(); NetInit();
/* initialize the bootloader interface */ /* initialize the bootloader interface */
BootComInit(); BootComInit();
/* the shared parameter at index 0 is used as a boolean flag to indicate if the
* bootloader should initialize the TCP/IP network stack. by default this flag
* should be reset.
*/
SharedParamsWriteByIndex(0, 0);
/* start the infinite program loop */ /* start the infinite program loop */
while (1) while (1)

View File

@ -4,7 +4,8 @@ MEMORY
CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000 CM3_System_Control_Space (wx) : ORIGIN = 0xe000e000, LENGTH = 0x00001000
Peripherals (wx) : ORIGIN = 0x40020000, LENGTH = 0x00100000 Peripherals (wx) : ORIGIN = 0x40020000, LENGTH = 0x00100000
FiRM_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00010000 FiRM_Peripherals (wx) : ORIGIN = 0x40000000, LENGTH = 0x00010000
SRAM (wx) : ORIGIN = 0x20000000, LENGTH = 0x00010000 SHARED (wx) : ORIGIN = 0x20000000, LENGTH = 64
SRAM (wx) : ORIGIN = 0x20000040, LENGTH = 0x00010000 - 64
FLASH (rx) : ORIGIN = 0x00008000, LENGTH = 0x00040000 - 0x8000 FLASH (rx) : ORIGIN = 0x00008000, LENGTH = 0x00040000 - 0x8000
} }
@ -17,7 +18,7 @@ SECTIONS
__Peripherals_segment_end__ = 0x40120000; __Peripherals_segment_end__ = 0x40120000;
__FiRM_Peripherals_segment_start__ = 0x40000000; __FiRM_Peripherals_segment_start__ = 0x40000000;
__FiRM_Peripherals_segment_end__ = 0x40010000; __FiRM_Peripherals_segment_end__ = 0x40010000;
__SRAM_segment_start__ = 0x20000000; __SRAM_segment_start__ = 0x20000040;
__SRAM_segment_end__ = 0x20010000; __SRAM_segment_end__ = 0x20010000;
__FLASH_segment_start__ = 0x00008000; __FLASH_segment_start__ = 0x00008000;
__FLASH_segment_end__ = 0x00040000; __FLASH_segment_end__ = 0x00040000;
@ -31,6 +32,17 @@ SECTIONS
__STACKSIZE_UND__ = 0; __STACKSIZE_UND__ = 0;
__HEAPSIZE__ = 128; __HEAPSIZE__ = 128;
.shared (NOLOAD):
{
. = ALIGN(4);
__shared_start__ = .;
*(.shared)
*(.shared.*)
KEEP(*(.shared))
. = ALIGN(4);
__shared_end__ = .;
} > SHARED
__vectors_ram_load_start__ = ALIGN(__SRAM_segment_start__ , 256); __vectors_ram_load_start__ = ALIGN(__SRAM_segment_start__ , 256);
.vectors_ram ALIGN(__SRAM_segment_start__ , 256) (NOLOAD) : AT(ALIGN(__SRAM_segment_start__ , 256)) .vectors_ram ALIGN(__SRAM_segment_start__ , 256) (NOLOAD) : AT(ALIGN(__SRAM_segment_start__ , 256))
{ {

View File

@ -53,6 +53,10 @@
static unsigned long periodicTimerTimeOut; static unsigned long periodicTimerTimeOut;
/** \brief Holds the time out value of the uIP ARP timer. */ /** \brief Holds the time out value of the uIP ARP timer. */
static unsigned long ARPTimerTimeOut; static unsigned long ARPTimerTimeOut;
#if (BOOT_COM_NET_DHCP_ENABLE > 0)
/** \brief Holds the MAC address which is used by the DHCP client. */
static struct uip_eth_addr macAddress;
#endif
/************************************************************************************//** /************************************************************************************//**
@ -71,6 +75,7 @@ void NetInit(void)
ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS; ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS;
/* initialize the uIP TCP/IP stack. */ /* initialize the uIP TCP/IP stack. */
uip_init(); uip_init();
#if (BOOT_COM_NET_DHCP_ENABLE == 0)
/* set the IP address */ /* set the IP address */
uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2, uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2,
BOOT_COM_NET_IPADDR3); BOOT_COM_NET_IPADDR3);
@ -83,10 +88,28 @@ void NetInit(void)
uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2, uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2,
BOOT_COM_NET_GATEWAY3); BOOT_COM_NET_GATEWAY3);
uip_setdraddr(ipaddr); uip_setdraddr(ipaddr);
#else
/* set the IP address */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_sethostaddr(ipaddr);
/* set the network mask */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_setnetmask(ipaddr);
/* set the gateway address */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_setdraddr(ipaddr);
#endif
/* start listening on the configured port for XCP transfers on TCP/IP */ /* start listening on the configured port for XCP transfers on TCP/IP */
uip_listen(HTONS(BOOT_COM_NET_PORT)); uip_listen(HTONS(BOOT_COM_NET_PORT));
/* initialize the MAC and set the MAC address */ /* initialize the MAC and set the MAC address */
netdev_init_mac(); netdev_init_mac();
#if (BOOT_COM_NET_DHCP_ENABLE > 0)
/* initialize the DHCP client application and send the initial request. */
netdev_get_mac(&macAddress.addr[0]);
dhcpc_init(&macAddress.addr[0], 6);
dhcpc_request();
#endif
} /*** end of NetInit ***/ } /*** end of NetInit ***/
@ -117,6 +140,13 @@ void NetApp(void)
/* check if this was an XCP CONNECT command */ /* check if this was an XCP CONNECT command */
if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00)) if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00))
{ {
/* the shared parameter at index 0 is used as a boolean flag to indicate if the
* bootloader should initialize the TCP/IP network stack. we just received a
* firmware update request from the TCP/IP network and we are about to active
* the bootloader for a firmware update via TCP/IP. At this point we should
* set the flag to make sure the bootloader initializes its TCP/IP network stack.
*/
SharedParamsWriteByIndex(0, 1);
/* connection request received so start the bootloader */ /* connection request received so start the bootloader */
BootActivate(); BootActivate();
} }
@ -136,13 +166,13 @@ void NetTask(void)
/* check for an RX packet and read it. */ /* check for an RX packet and read it. */
packetLen = netdev_read(); packetLen = netdev_read();
if(packetLen > 0) if (packetLen > 0)
{ {
/* set uip_len for uIP stack usage */ /* set uip_len for uIP stack usage */
uip_len = (unsigned short)packetLen; uip_len = (unsigned short)packetLen;
/* process incoming IP packets here. */ /* process incoming IP packets here. */
if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP)) if (NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP))
{ {
uip_arp_ipin(); uip_arp_ipin();
uip_input(); uip_input();
@ -150,7 +180,7 @@ void NetTask(void)
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
*/ */
if(uip_len > 0) if (uip_len > 0)
{ {
uip_arp_out(); uip_arp_out();
netdev_send(); netdev_send();
@ -158,7 +188,7 @@ void NetTask(void)
} }
} }
/* process incoming ARP packets here. */ /* process incoming ARP packets here. */
else if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP)) else if (NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP))
{ {
uip_arp_arpin(); uip_arp_arpin();
@ -166,14 +196,14 @@ void NetTask(void)
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
*/ */
if(uip_len > 0) if (uip_len > 0)
{ {
netdev_send(); netdev_send();
uip_len = 0; uip_len = 0;
} }
} }
} }
/* process TCP/IP Periodic Timer here. */ /* process TCP/IP Periodic Timer here. */
if (TimerGet() >= periodicTimerTimeOut) if (TimerGet() >= periodicTimerTimeOut)
{ {
@ -181,6 +211,22 @@ void NetTask(void)
for (connection = 0; connection < UIP_CONNS; connection++) for (connection = 0; connection < UIP_CONNS; connection++)
{ {
uip_periodic(connection); uip_periodic(connection);
/* If the above function invocation resulted in data that
* should be sent out on the network, the global variable
* uip_len is set to a value > 0.
*/
if (uip_len > 0)
{
uip_arp_out();
netdev_send();
uip_len = 0;
}
}
#if UIP_UDP
for (connection = 0; connection < UIP_UDP_CONNS; connection++)
{
uip_udp_periodic(connection);
/* If the above function invocation resulted in data that /* If the above function invocation resulted in data that
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
@ -192,13 +238,14 @@ void NetTask(void)
uip_len = 0; uip_len = 0;
} }
} }
#endif
} }
/* process ARP Timer here. */ /* process ARP Timer here. */
if (TimerGet() >= ARPTimerTimeOut) if (TimerGet() >= ARPTimerTimeOut)
{ {
ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS; ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS;
uip_arp_timer(); uip_arp_timer();
} }
} /*** end of NetServerTask ***/ } /*** end of NetServerTask ***/

View File

@ -0,0 +1,301 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Prog/shared_params.c
* \brief Shared RAM parameters source file.
* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_Crossworks
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stddef.h> /* Standard definitions (NULL). */
#include "shared_params.h" /* Shared parameters header. */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Constant parameter buffer identifier. This value is always located as the
* start of the buffer to validate the the RAM contains valid shared parameters.
*/
#define SHARED_PARAMS_BUFFER_ID (0xCE42E7A2u)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Layout of the shared parameters RAM buffer. */
typedef struct t_shared_params_buffer
{
/** \brief Fixed buffer identifier to validate that the RAM contains valid shared
* parameters.
*/
uint32_t identifier;
/** \brief Array for the actual parameter data. */
uint8_t data[SHARED_PARAMS_CFG_BUFFER_DATA_LEN];
/** \brief Checksum value of all the bytes in the buffer, excluding this checksum
* value of obvious reasons. The checksum is calculated as the Two's
* complement of the sum of the bytes.
*/
uint16_t checksum;
} tSharedParamsBuffer;
/****************************************************************************************
* Global data declarations
****************************************************************************************/
/** \brief Declaration of the actual parameter buffer that this module manages.
* \warning For the shared RAM parameters to work properly for sharing information
* between the bootloader and user program, it is important that this
* variable is linked to the exact same RAM address in both the bootloader
* and the user program. Additionally, it should be configured such that the
* C-startup code does NOT zero its contents during system initialization. This
* is the code that runs in the reset event handler, before function main() is
* called.
* For GCC based embedded toolchains, the solution is to assign this variable
* to a custom section, in this case called ".shared". Then in the linker
* script, add the following to the SECTIONS:
*
* .shared (NOLOAD) :
* {
* . = ALIGN(4);
* _sshared = .;
* __shared_start__ = _sshared;
* *(.shared)
* *(.shared.*)
* KEEP(*(.shared))
* . = ALIGN(4);
* _eshared = .;
* __shared_end__ = _eshared;
* } >SHARED
*
* Next, add a new MEMORY entry for SHARED at the start of RAM and reduce
* the length of the remaining RAM:
*
* SHARED (xrw) : ORIGIN = 0x200000C0, LENGTH = 64
* RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 32K - 192 - 64
*
* Note that the previous example is for an STM32F0 microcontroller where
* the first 192 (0xC0) bytes in RAM are reserved for the user program
* vector table.
*
* \remark This same approach can be applied with other toolchains such as Keil MDK
* and IAR EWARM. Consult the compiler and linker user manuals of your
* toolchain to find out how to place a RAM variable at a fixed memory address
* and to prevent the C-startup code from zeroing its contents.
* Here are a few links to get you started:
* * IAR EWARM:
* https://www.iar.com/support/tech-notes/compiler/
* linker-error-for-absolute-located-variable/
* * Keil MDK:
* http://www.keil.com/support/docs/3480.htm
*/
static tSharedParamsBuffer sharedParamsBuffer __attribute__ ((section (".shared")));
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static bool SharedParamsValidateBuffer(void);
static void SharedParamsWriteChecksum(void);
static bool SharedParamsVerifyChecksum(void);
static uint16_t SharedParamsCalculateChecksum(void);
/************************************************************************************//**
** \brief Initializes the shared RAM parameters module.
** \return none.
**
****************************************************************************************/
void SharedParamsInit(void)
{
uint32_t byteIdx;
/* The shared parameter buffer does not get initialized by the C-startup code. Another
* previously running program could have initialized it, in which case it is ready
* for use and nothing more needs to be done.
*/
if (!SharedParamsValidateBuffer())
{
/* The shared parameter buffer was not yet initialized by a running program. This
* typically happens after a cold reset where the RAM contents were lost. In this
* case we need to explicitly configure and initialize it, since the C-startup code
* was configured to not do this.
*
* The initialization consists of setting the buffer identifier, zeroing the
* actual parameter data and updating the checksum at the end.
*/
sharedParamsBuffer.identifier = SHARED_PARAMS_BUFFER_ID;
for (byteIdx=0; byteIdx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
sharedParamsBuffer.data[byteIdx] = 0;
}
SharedParamsWriteChecksum();
}
} /*** end of SharedParamsInit ***/
/************************************************************************************//**
** \brief Reads a data byte from the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Pointer to where the read data value is stored.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) &&
(value != NULL) )
{
/* Read the value and update the result. */
*value = sharedParamsBuffer.data[idx];
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsReadByIndex ***/
/************************************************************************************//**
** \brief Writes a data byte to the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Value to write.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) )
{
/* Write the value. */
sharedParamsBuffer.data[idx] = value;
/* Update the checksum since the contents were just changed. */
SharedParamsWriteChecksum();
/* Update the result. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsWriteByIndex ***/
/************************************************************************************//**
** \brief Validates the shared parameter buffer contents by looking at the table
** identifier and verifying its checksum.
** \return True if successful, false otherwise.
**
****************************************************************************************/
static bool SharedParamsValidateBuffer(void)
{
bool result = false;
/* Perform validation. */
if ( (sharedParamsBuffer.identifier == SHARED_PARAMS_BUFFER_ID) &&
(SharedParamsVerifyChecksum()) )
{
/* The shared parameter buffer is valid, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsValitabeTable ***/
/************************************************************************************//**
** \brief Calculates and writes the checksum into the buffer.
** \return none.
**
****************************************************************************************/
static void SharedParamsWriteChecksum(void)
{
/* Calculate and write the checksum. */
sharedParamsBuffer.checksum = SharedParamsCalculateChecksum();
} /*** end of SharedParamsWriteChecksum ***/
/************************************************************************************//**
** \brief Calculates and verifies the checksum that is currently present in the
** buffer.
** \return True is the checksum is correct, false otherwise.
**
****************************************************************************************/
static bool SharedParamsVerifyChecksum(void)
{
bool result = false;
/* Calculate and verify the checksum. */
if (SharedParamsCalculateChecksum() == sharedParamsBuffer.checksum)
{
/* Checksum is correct, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsVerifyChecksum ***/
/************************************************************************************//**
** \brief Calculates and returns the checksum value for the current contents in the
** buffer. The checksum is calculated by taking the sum of all bytes in the
** parameter buffer (excluding the checksum at the end) and them taking the
** two's complement value of it.
** \return The calculated checksum value.
**
****************************************************************************************/
static uint16_t SharedParamsCalculateChecksum(void)
{
uint16_t result = 0;
uint32_t byteIdx;
/* Add the identifier bytes to the checksum. */
result += (uint8_t)sharedParamsBuffer.identifier;
result += (uint8_t)(sharedParamsBuffer.identifier >> 8u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 16u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 24u);
/* Loop through the parameter data array. */
for (byteIdx=0; byteIdx<SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
/* Add parameter data byte to the checksum. */
result += (uint8_t)sharedParamsBuffer.data[byteIdx];
}
/* Determine one's complement. */
result = ~result;
/* Determine two's complement. */
result += 1;
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsCalculateChecksum ***/
/*********************************** end of shared_params.c ****************************/

View File

@ -0,0 +1,57 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_Crossworks/Prog/shared_params.h
* \brief Shared RAM parameters header file.
* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_Crossworks
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef SHARED_PARAMS_H
#define SHARED_PARAMS_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* Standard integer types. */
#include <stdbool.h> /* Standard boolean types. */
/****************************************************************************************
* Configuration macros
****************************************************************************************/
/** \brief Configuration macro for specifying the size of the data inside the parameter
* buffer. This is the length in bytes of the actual parameter data, so
* excluding the bufferId and checksum.
*/
#define SHARED_PARAMS_CFG_BUFFER_DATA_LEN (56u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void SharedParamsInit(void);
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value);
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value);
#endif /* SHARED_PARAMS_H */
/*********************************** end of shared_params.h ****************************/

View File

@ -7,45 +7,50 @@ start address 0x00000000
Program Header: Program Header:
LOAD off 0x00010000 vaddr 0x00000000 paddr 0x00000000 align 2**16 LOAD off 0x00010000 vaddr 0x00000000 paddr 0x00000000 align 2**16
filesz 0x00006fbc memsz 0x00006fbc flags r-x filesz 0x000079cc memsz 0x000079cc flags r-x
LOAD off 0x00020000 vaddr 0x20000000 paddr 0x00006fbc align 2**16 LOAD off 0x00020040 vaddr 0x20000040 paddr 0x000079cc align 2**16
filesz 0x000001dc memsz 0x00002098 flags rw- filesz 0x000001dc memsz 0x00002120 flags rw-
LOAD off 0x00030000 vaddr 0x20000000 paddr 0x20000000 align 2**16
filesz 0x00000000 memsz 0x00000040 flags rw-
private flags = 5000200: [Version5 EABI] [soft-float ABI] private flags = 5000200: [Version5 EABI] [soft-float ABI]
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 00006fbc 00000000 00000000 00010000 2**2 0 .shared 00000040 20000000 20000000 00030000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 000001dc 20000000 00006fbc 00020000 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00001ebc 200001dc 00007198 000201dc 2**2
ALLOC ALLOC
3 .ARM.attributes 00000029 00000000 00000000 000201dc 2**0 1 .text 000079cc 00000000 00000000 00010000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .data 000001dc 20000040 000079cc 00020040 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00001f44 2000021c 00007ba8 0002021c 2**2
ALLOC
4 .ARM.attributes 00000029 00000000 00000000 0002021c 2**0
CONTENTS, READONLY CONTENTS, READONLY
4 .comment 0000006e 00000000 00000000 00020205 2**0 5 .comment 0000006e 00000000 00000000 00020245 2**0
CONTENTS, READONLY CONTENTS, READONLY
5 .debug_info 0000fb37 00000000 00000000 00020273 2**0 6 .debug_info 00011169 00000000 00000000 000202b3 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00002575 00000000 00000000 0002fdaa 2**0 7 .debug_abbrev 00002b8d 00000000 00000000 0003141c 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_loc 0000bb26 00000000 00000000 0003231f 2**0 8 .debug_loc 0000c330 00000000 00000000 00033fa9 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_aranges 00000f88 00000000 00000000 0003de45 2**0 9 .debug_aranges 00001100 00000000 00000000 000402d9 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_ranges 00000da8 00000000 00000000 0003edcd 2**0 10 .debug_ranges 00000ee0 00000000 00000000 000413d9 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_macro 00008fe5 00000000 00000000 0003fb75 2**0 11 .debug_macro 0000a351 00000000 00000000 000422b9 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
11 .debug_line 00007367 00000000 00000000 00048b5a 2**0 12 .debug_line 00008415 00000000 00000000 0004c60a 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
12 .debug_str 000284ac 00000000 00000000 0004fec1 2**0 13 .debug_str 0002b14d 00000000 00000000 00054a1f 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
13 .debug_frame 00002c78 00000000 00000000 00078370 2**2 14 .debug_frame 00003004 00000000 00000000 0007fb6c 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
SYMBOL TABLE: SYMBOL TABLE:
20000000 l d .shared 00000000 .shared
00000000 l d .text 00000000 .text 00000000 l d .text 00000000 .text
20000000 l d .data 00000000 .data 20000040 l d .data 00000000 .data
200001dc l d .bss 00000000 .bss 2000021c l d .bss 00000000 .bss
00000000 l d .ARM.attributes 00000000 .ARM.attributes 00000000 l d .ARM.attributes 00000000 .ARM.attributes
00000000 l d .comment 00000000 .comment 00000000 l d .comment 00000000 .comment
00000000 l d .debug_info 00000000 .debug_info 00000000 l d .debug_info 00000000 .debug_info
@ -59,189 +64,218 @@ SYMBOL TABLE:
00000000 l d .debug_frame 00000000 .debug_frame 00000000 l d .debug_frame 00000000 .debug_frame
00000000 l df *ABS* 00000000 vectors.c 00000000 l df *ABS* 00000000 vectors.c
00000000 l df *ABS* 00000000 crtstuff.c 00000000 l df *ABS* 00000000 crtstuff.c
00006fb8 l O .text 00000000 __EH_FRAME_BEGIN__ 000079c8 l O .text 00000000 __EH_FRAME_BEGIN__
000000f0 l F .text 00000000 __do_global_dtors_aux 000000f0 l F .text 00000000 __do_global_dtors_aux
200001dc l .bss 00000000 completed.8603 2000021c l .bss 00000000 completed.8603
200001d8 l O .data 00000000 __do_global_dtors_aux_fini_array_entry 20000218 l O .data 00000000 __do_global_dtors_aux_fini_array_entry
00000114 l F .text 00000000 frame_dummy 00000114 l F .text 00000000 frame_dummy
200001e0 l .bss 00000000 object.8608 20000220 l .bss 00000000 object.8608
200001d4 l O .data 00000000 __frame_dummy_init_array_entry 20000214 l O .data 00000000 __frame_dummy_init_array_entry
00000000 l df *ABS* 00000000 uartlib.c 00000000 l df *ABS* 00000000 uartlib.c
0000014c l F .text 00000068 UARTBaseValid 0000014c l F .text 00000068 UARTBaseValid
00000000 l df *ABS* 00000000 gpio.c 00000000 l df *ABS* 00000000 gpio.c
000003a4 l F .text 00000124 GPIOBaseValid 000003a4 l F .text 00000124 GPIOBaseValid
00000000 l df *ABS* 00000000 ethernet.c 00000000 l df *ABS* 00000000 ethernet.c
0000076c l F .text 0000008a EthernetPacketGetInternal 0000078c l F .text 0000008a EthernetPacketGetInternal
000007f8 l F .text 0000007c EthernetPacketPutInternal 00000818 l F .text 0000007c EthernetPacketPutInternal
00000000 l df *ABS* 00000000 flashlib.c 00000000 l df *ABS* 00000000 flashlib.c
00000000 l df *ABS* 00000000 sysctl.c 00000000 l df *ABS* 00000000 sysctl.c
00000cb0 l F .text 000003f8 SysCtlPeripheralValid 00000cd0 l F .text 000003f8 SysCtlPeripheralValid
000066b8 l O .text 0000006c g_pulXtals 000070c0 l O .text 0000006c g_pulXtals
0000673c l O .text 0000000c g_pulRCGCRegs 00007144 l O .text 0000000c g_pulRCGCRegs
00006748 l O .text 0000000c g_pulSRCRRegs 00007150 l O .text 0000000c g_pulSRCRRegs
00000000 l df *ABS* 00000000 ssi.c 00000000 l df *ABS* 00000000 ssi.c
00001540 l F .text 00000038 SSIBaseValid 00001560 l F .text 00000038 SSIBaseValid
00000000 l df *ABS* 00000000 clock-arch.c
00000000 l df *ABS* 00000000 netdev.c 00000000 l df *ABS* 00000000 netdev.c
00000000 l df *ABS* 00000000 mmc.c 00000000 l df *ABS* 00000000 mmc.c
00001880 l F .text 00000010 power_off 000018b8 l F .text 00000010 power_off
00001890 l F .text 00000058 send_initial_clock_train 000018c8 l F .text 00000058 send_initial_clock_train
000018e8 l F .text 0000008c power_on 00001920 l F .text 0000008c power_on
00001974 l F .text 00000024 xchg_spi 000019ac l F .text 00000024 xchg_spi
00001998 l F .text 00000028 wait_ready 000019d0 l F .text 00000028 wait_ready
000019c0 l F .text 00000018 deselect 000019f8 l F .text 00000018 deselect
000019d8 l F .text 0000002c select 00001a10 l F .text 0000002c select
00001a04 l F .text 00000082 send_cmd 00001a3c l F .text 00000082 send_cmd
00001a88 l F .text 0000000e rcvr_spi_m 00001ac0 l F .text 0000000e rcvr_spi_m
00001a98 l F .text 0000004e rcvr_datablock 00001ad0 l F .text 0000004e rcvr_datablock
00001ae8 l F .text 0000005a xmit_datablock 00001b20 l F .text 0000005a xmit_datablock
00001b44 l F .text 00000044 set_max_speed 00001b7c l F .text 00000044 set_max_speed
200001f8 l O .bss 00000004 CardType 20000238 l O .bss 00000004 CardType
20000000 l O .data 00000001 Stat 20000040 l O .data 00000001 Stat
00000000 l df *ABS* 00000000 cstart.c 00000000 l df *ABS* 00000000 cstart.c
000020c6 l F .text 00000000 zero_loop 000020fe l F .text 00000000 zero_loop
00000000 l df *ABS* 00000000 hooks.c 00000000 l df *ABS* 00000000 hooks.c
00006768 l O .text 0000001b firmwareFilename 00007170 l O .text 0000001b firmwareFilename
200001fc l O .bss 0000022c logfile 2000023c l O .bss 0000022c logfile
00000000 l df *ABS* 00000000 main.c 00000000 l df *ABS* 00000000 main.c
00002204 l F .text 00000024 Init 00002250 l F .text 00000048 Init
00000000 l df *ABS* 00000000 shared_params.c
000022dc l F .text 00000038 SharedParamsCalculateChecksum
00002314 l F .text 0000001c SharedParamsVerifyChecksum
00002330 l F .text 00000024 SharedParamsValidateBuffer
00002354 l F .text 00000010 SharedParamsWriteChecksum
20000000 l O .shared 00000040 sharedParamsBuffer
00000000 l df *ABS* 00000000 assert.c 00000000 l df *ABS* 00000000 assert.c
00000000 l df *ABS* 00000000 file.c 00000000 l df *ABS* 00000000 file.c
00002250 l F .text 0000003c FileLibLongToIntString 000023cc l F .text 0000003c FileLibLongToIntString
0000228c l F .text 0000002a FileLibByteNibbleToChar 00002408 l F .text 0000002a FileLibByteNibbleToChar
000022b8 l F .text 00000020 FileLibByteToHexString 00002434 l F .text 00000020 FileLibByteToHexString
000022d8 l F .text 00000058 FileLibHexStringToByte 00002454 l F .text 00000058 FileLibHexStringToByte
20000428 l O .bss 00000040 loggingStr 20000468 l O .bss 00000040 loggingStr
20000468 l O .bss 00000001 firmwareUpdateState 200004a8 l O .bss 00000001 firmwareUpdateState
2000046c l O .bss 00000008 eraseInfo 200004ac l O .bss 00000008 eraseInfo
20000474 l O .bss 00000458 fatFsObjects 200004b4 l O .bss 00000458 fatFsObjects
200008cc l O .bss 00000184 lineParseObject 2000090c l O .bss 00000184 lineParseObject
00000000 l df *ABS* 00000000 cop.c 00000000 l df *ABS* 00000000 cop.c
00000000 l df *ABS* 00000000 boot.c 00000000 l df *ABS* 00000000 boot.c
00000000 l df *ABS* 00000000 backdoor.c 00000000 l df *ABS* 00000000 backdoor.c
20000a50 l O .bss 00000001 backdoorOpen 20000a90 l O .bss 00000004 backdoorExtensionTime
20000a54 l O .bss 00000004 backdoorOpenTime 20000a94 l O .bss 00000001 backdoorOpen
20000a98 l O .bss 00000004 backdoorOpenTime
00000000 l df *ABS* 00000000 com.c 00000000 l df *ABS* 00000000 com.c
20000001 l O .data 00000001 comActiveInterface 20000041 l O .data 00000001 comActiveInterface
20000a58 l O .bss 00000040 xcpCtoReqPacket.4517 20000a9c l O .bss 00000040 xcpCtoReqPacket.4531
00000000 l df *ABS* 00000000 net.c 00000000 l df *ABS* 00000000 net.c
00002b04 l F .text 000000d4 NetServerTask 00002cc4 l F .text 0000010c NetServerTask
20000a98 l O .bss 00000004 ARPTimerTimeOut 20000adc l O .bss 00000001 netInitializedFlag
20000a9c l O .bss 00000004 periodicTimerTimeOut 20000ae0 l O .bss 00000004 ARPTimerTimeOut
20000ae4 l O .bss 00000006 macAddress
20000042 l O .data 00000001 netInitializationDeferred
20000aec l O .bss 00000004 periodicTimerTimeOut
00000000 l df *ABS* 00000000 xcp.c 00000000 l df *ABS* 00000000 xcp.c
00002cfc l F .text 0000000c XcpProtectResources 00002f64 l F .text 0000000c XcpProtectResources
00002d08 l F .text 00000014 XcpSetCtoError 00002f70 l F .text 00000014 XcpSetCtoError
00002d1c l F .text 0000001c XcpCmdDisconnect 00002f84 l F .text 0000001c XcpCmdDisconnect
00002d38 l F .text 00000020 XcpCmdGetStatus 00002fa0 l F .text 00000020 XcpCmdGetStatus
00002d58 l F .text 0000000a XcpCmdSynch 00002fc0 l F .text 0000000a XcpCmdSynch
00002d64 l F .text 0000002c XcpCmdGetId 00002fcc l F .text 0000002c XcpCmdGetId
00002d90 l F .text 00000018 XcpCmdSetMta 00002ff8 l F .text 00000018 XcpCmdSetMta
00002da8 l F .text 0000000a XcpCmdProgramPrepare 00003010 l F .text 0000000a XcpCmdProgramPrepare
00002db4 l F .text 00000028 XcpCmdProgramStart 0000301c l F .text 00000028 XcpCmdProgramStart
00002ddc l F .text 00000050 XcpCmdConnect 00003044 l F .text 00000050 XcpCmdConnect
00002e2c l F .text 00000040 XcpCmdUpload 00003094 l F .text 00000040 XcpCmdUpload
00002e6c l F .text 00000040 XcpCmdShortUpload 000030d4 l F .text 00000040 XcpCmdShortUpload
00002eac l F .text 00000024 XcpComputeChecksum 00003114 l F .text 00000024 XcpComputeChecksum
00002ed0 l F .text 00000028 XcpCmdBuildCheckSum 00003138 l F .text 00000028 XcpCmdBuildCheckSum
00002ef8 l F .text 00000040 XcpCmdProgramMax 00003160 l F .text 00000040 XcpCmdProgramMax
00002f38 l F .text 0000005c XcpCmdProgram 000031a0 l F .text 0000005c XcpCmdProgram
00002f94 l F .text 00000028 XcpCmdProgramClear 000031fc l F .text 00000028 XcpCmdProgramClear
00002fbc l F .text 00000018 XcpCmdProgramReset 00003224 l F .text 00000018 XcpCmdProgramReset
00002fd4 l F .text 0000000a XcpTransmitPacket 0000323c l F .text 0000000a XcpTransmitPacket
00006964 l O .text 00000008 xcpStationId 0000736c l O .text 00000008 xcpStationId
20000aa0 l O .bss 0000004c xcpInfo 20000af0 l O .bss 0000004c xcpInfo
00000000 l df *ABS* 00000000 timer.c 00000000 l df *ABS* 00000000 timer.c
20000aec l O .bss 00000004 millisecond_counter 20000b3c l O .bss 00000004 millisecond_counter
00000000 l df *ABS* 00000000 flash.c 00000000 l df *ABS* 00000000 flash.c
00003158 l F .text 00000048 FlashGetSector 000033c0 l F .text 00000048 FlashGetSector
000031a0 l F .text 00000038 FlashGetSectorBaseAddr 00003408 l F .text 00000038 FlashGetSectorBaseAddr
000031d8 l F .text 00000038 FlashGetSectorSize 00003440 l F .text 00000038 FlashGetSectorSize
00003210 l F .text 00000026 FlashInitBlock 00003478 l F .text 00000026 FlashInitBlock
00003238 l F .text 0000005c FlashWriteBlock 000034a0 l F .text 0000005c FlashWriteBlock
00003294 l F .text 0000003c FlashSwitchBlock 000034fc l F .text 0000003c FlashSwitchBlock
000032d0 l F .text 0000007a FlashAddToBlock 00003538 l F .text 0000007a FlashAddToBlock
0000334c l F .text 0000005e FlashEraseSectors 000035b4 l F .text 0000005e FlashEraseSectors
0000696c l O .text 000000c0 flashLayout 00007374 l O .text 000000c0 flashLayout
20000af0 l O .bss 00000204 bootBlockInfo 20000b40 l O .bss 00000204 bootBlockInfo
20000cf4 l O .bss 00000204 blockInfo 20000d44 l O .bss 00000204 blockInfo
00000000 l df *ABS* 00000000 cpu.c 00000000 l df *ABS* 00000000 cpu.c
00000000 l df *ABS* 00000000 nvm.c 00000000 l df *ABS* 00000000 nvm.c
00000000 l df *ABS* 00000000 uart.c 00000000 l df *ABS* 00000000 uart.c
000035e0 l F .text 0000003c UartTransmitByte 0000385c l F .text 0000003c UartTransmitByte
0000361c l F .text 00000020 UartReceiveByte 00003898 l F .text 00000020 UartReceiveByte
20000ef8 l O .bss 00000004 xcpCtoRxStartTime.4736 20000f48 l O .bss 00000004 xcpCtoRxStartTime.4748
20000efc l O .bss 00000041 xcpCtoReqPacket.4733 20000f4c l O .bss 00000041 xcpCtoReqPacket.4745
20000f3d l O .bss 00000001 xcpCtoRxLength.4734 20000f8d l O .bss 00000001 xcpCtoRxLength.4746
20000f3e l O .bss 00000001 xcpCtoRxInProgress.4735 20000f8e l O .bss 00000001 xcpCtoRxInProgress.4747
00000000 l df *ABS* 00000000 cpu_comp.c 00000000 l df *ABS* 00000000 cpu_comp.c
00000000 l df *ABS* 00000000 ff.c 00000000 l df *ABS* 00000000 ff.c
00003760 l F .text 0000000a ld_word 000039dc l F .text 0000000a ld_word
0000376c l F .text 00000016 ld_dword 000039e8 l F .text 00000016 ld_dword
00003784 l F .text 00000008 st_word 00003a00 l F .text 00000008 st_word
0000378c l F .text 00000014 st_dword 00003a08 l F .text 00000014 st_dword
000037a0 l F .text 00000012 mem_cpy 00003a1c l F .text 00000012 mem_cpy
000037b4 l F .text 0000000a mem_set 00003a30 l F .text 0000000a mem_set
000037c0 l F .text 0000001e mem_cmp 00003a3c l F .text 0000001e mem_cmp
000037e0 l F .text 00000010 chk_chr 00003a5c l F .text 00000010 chk_chr
000037f0 l F .text 00000018 clust2sect 00003a6c l F .text 00000018 clust2sect
00003808 l F .text 00000024 ld_clust 00003a84 l F .text 00000024 ld_clust
0000382c l F .text 00000024 st_clust 00003aa8 l F .text 00000024 st_clust
00003850 l F .text 0000008c pick_lfn 00003acc l F .text 0000008c pick_lfn
000038dc l F .text 00000070 put_lfn 00003b58 l F .text 00000070 put_lfn
0000394c l F .text 000000a0 gen_numname 00003bc8 l F .text 000000a0 gen_numname
000039ec l F .text 0000001c sum_sfn 00003c68 l F .text 0000001c sum_sfn
00003a08 l F .text 00000052 get_ldnumber 00003c84 l F .text 00000052 get_ldnumber
00003a5c l F .text 00000034 validate 00003cd8 l F .text 00000034 validate
00003a90 l F .text 00000054 sync_window 00003d0c l F .text 00000054 sync_window
00003ae4 l F .text 00000034 move_window 00003d60 l F .text 00000034 move_window
00003b18 l F .text 00000060 check_fs 00003d94 l F .text 00000060 check_fs
00003b78 l F .text 000002d4 find_volume 00003df4 l F .text 000002d4 find_volume
00003e4c l F .text 000000d0 get_fat 000040c8 l F .text 000000d0 get_fat
00003f1c l F .text 000000b2 dir_sdi 00004198 l F .text 000000b2 dir_sdi
00003fd0 l F .text 0000010c put_fat 0000424c l F .text 0000010c put_fat
000040dc l F .text 000000ce create_chain 00004358 l F .text 000000ce create_chain
000041ac l F .text 0000007c remove_chain 00004428 l F .text 0000007c remove_chain
00004228 l F .text 00000126 dir_next 000044a4 l F .text 00000126 dir_next
00004350 l F .text 0000004c dir_alloc 000045cc l F .text 0000004c dir_alloc
0000439c l F .text 000000c4 dir_read 00004618 l F .text 000000c4 dir_read
00004460 l F .text 00000050 dir_remove 000046dc l F .text 00000050 dir_remove
000044b0 l F .text 00000228 create_name 0000472c l F .text 00000228 create_name
000046d8 l F .text 000000e2 get_fileinfo 00004954 l F .text 000000e2 get_fileinfo
000047bc l F .text 000000ac cmp_lfn 00004a38 l F .text 000000ac cmp_lfn
00004868 l F .text 000000e8 dir_find 00004ae4 l F .text 000000e8 dir_find
00004950 l F .text 0000008c follow_path 00004bcc l F .text 0000008c follow_path
000049dc l F .text 0000013c dir_register 00004c58 l F .text 0000013c dir_register
00004b18 l F .text 0000008c sync_fs 00004d94 l F .text 0000008c sync_fs
00005084 l F .text 0000004a putc_bfd 00005300 l F .text 0000004a putc_bfd
20000f40 l O .bss 00000200 LfnBuf 20000f90 l O .bss 00000200 LfnBuf
20001140 l O .bss 00000002 Fsid 20001190 l O .bss 00000002 Fsid
00006a64 l O .text 00000080 ExCvt 0000746c l O .text 00000080 ExCvt
00006ae4 l O .text 0000000d LfnOfs 000074ec l O .text 0000000d LfnOfs
20001144 l O .bss 00000004 FatFs 20001194 l O .bss 00000004 FatFs
00000000 l df *ABS* 00000000 unicode.c 00000000 l df *ABS* 00000000 unicode.c
00006af4 l O .text 000000bc cvt2.4380 000074fc l O .text 000000bc cvt2.4380
00006bb0 l O .text 00000100 Tbl 000075b8 l O .text 00000100 Tbl
00006cb0 l O .text 000001f2 cvt1.4379 000076b8 l O .text 000001f2 cvt1.4379
00000000 l df *ABS* 00000000 uip.c 00000000 l df *ABS* 00000000 uip.c
00005574 l F .text 0000003a chksum 000057f0 l F .text 0000003a chksum
0000560c l F .text 00000030 uip_add_rcv_nxt 00005888 l F .text 00000030 uip_add_rcv_nxt
000056f8 l F .text 0000003c upper_layer_chksum 00005998 l F .text 0000003c upper_layer_chksum
20001148 l O .bss 00000002 tmp16 20001198 l O .bss 00000002 tmp16
2000114a l O .bss 00000002 ipid 2000119a l O .bss 00000002 ipid
2000114c l O .bss 00000004 iss 2000119c l O .bss 00000004 iss
20001150 l O .bss 00000002 lastport 200011a0 l O .bss 00000002 lastport
20001152 l O .bss 00000001 c 200011a2 l O .bss 00000001 c
00000000 l df *ABS* 00000000 uip_arp.c 00000000 l df *ABS* 00000000 uip_arp.c
00006204 l F .text 00000104 uip_arp_update 0000669c l F .text 00000108 uip_arp_update
2000115a l O .bss 00000001 i 200011aa l O .bss 00000001 i
2000115b l O .bss 00000001 tmpage 200011ab l O .bss 00000001 tmpage
2000115c l O .bss 00000060 arp_table 200011ac l O .bss 00000060 arp_table
00006ea4 l O .text 00000006 broadcast_ethaddr 000078ac l O .text 00000006 broadcast_ethaddr
200011bc l O .bss 00000001 c 2000120c l O .bss 00000001 c
200011bd l O .bss 00000001 arptime 2000120d l O .bss 00000001 arptime
200011c0 l O .bss 00000004 ipaddr 20001210 l O .bss 00000004 ipaddr
00000000 l df *ABS* 00000000 uip_timer.c
00000000 l df *ABS* 00000000 dhcpc.c
00006a6c l F .text 0000000e add_msg_type
00006a7c l F .text 0000001c add_server_id
00006a98 l F .text 00000016 add_req_options
00006ab0 l F .text 00000008 add_end
00006ab8 l F .text 0000002c dhcpc_configured
00006ae4 l F .text 0000001c add_req_ipaddr
00006b00 l F .text 00000078 parse_options
00006b78 l F .text 00000080 create_msg
00006bf8 l F .text 00000030 send_discover
00006c28 l F .text 00000034 send_request
00006c5c l F .text 00000058 parse_msg
00006d00 l F .text 00000288 handle_dhcp
000078b4 l O .text 00000004 xid
20001214 l O .bss 00000034 s
000078b8 l O .text 00000004 magic_cookie
00000000 l df *ABS* 00000000 locale.c 00000000 l df *ABS* 00000000 locale.c
000065a8 l F .text 00000018 __get_current_locale 00006f90 l F .text 00000018 __get_current_locale
00000000 l df *ABS* 00000000 mbtowc_r.c 00000000 l df *ABS* 00000000 mbtowc_r.c
00000000 l df *ABS* 00000000 memcmp.c
00000000 l df *ABS* 00000000 memcpy-stub.c 00000000 l df *ABS* 00000000 memcpy-stub.c
00000000 l df *ABS* 00000000 memset.c 00000000 l df *ABS* 00000000 memset.c
00000000 l df *ABS* 00000000 wctomb_r.c 00000000 l df *ABS* 00000000 wctomb_r.c
@ -249,194 +283,216 @@ SYMBOL TABLE:
00000000 l df *ABS* 00000000 c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtn.o 00000000 l df *ABS* 00000000 c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtn.o
00000000 l df *ABS* 00000000 ctype_.c 00000000 l df *ABS* 00000000 ctype_.c
00000000 l df *ABS* 00000000 crtstuff.c 00000000 l df *ABS* 00000000 crtstuff.c
00006fb8 l O .text 00000000 __FRAME_END__ 000079c8 l O .text 00000000 __FRAME_END__
00000000 l df *ABS* 00000000 impure.c 00000000 l df *ABS* 00000000 impure.c
20000004 l O .data 00000060 impure_data 20000044 l O .data 00000060 impure_data
00000000 l df *ABS* 00000000 00000000 l df *ABS* 00000000
00000000 l *UND* 00000000 __bss_start__ 00000000 l *UND* 00000000 __bss_start__
00000000 l *UND* 00000000 __libc_fini_array 00000000 l *UND* 00000000 __libc_fini_array
00000000 l *UND* 00000000 __bss_end__ 00000000 l *UND* 00000000 __bss_end__
00000000 l *UND* 00000000 __call_exitprocs 00000000 l *UND* 00000000 __call_exitprocs
00000000 l *UND* 00000000 software_init_hook 00000000 l *UND* 00000000 software_init_hook
200001d8 l .data 00000000 __init_array_end 20000218 l .data 00000000 __init_array_end
00000000 l *UND* 00000000 hardware_init_hook 00000000 l *UND* 00000000 hardware_init_hook
00000000 l *UND* 00000000 atexit 00000000 l *UND* 00000000 atexit
200001d4 l .data 00000000 __preinit_array_end 20000214 l .data 00000000 __preinit_array_end
00000000 l *UND* 00000000 __stack 00000000 l *UND* 00000000 __stack
200001d4 l .data 00000000 __init_array_start 20000214 l .data 00000000 __init_array_start
00000000 l *UND* 00000000 _exit 00000000 l *UND* 00000000 _exit
200001d4 l .data 00000000 __preinit_array_start 20000214 l .data 00000000 __preinit_array_start
00002a2c g F .text 00000020 ComInit 00002bdc g F .text 00000018 ComInit
000033c4 g F .text 00000068 FlashWrite 0000362c g F .text 00000068 FlashWrite
00005400 g F .text 00000054 f_gets 0000567c g F .text 00000054 f_gets
00002248 g F .text 00000008 AssertFailure 00001858 g F .text 00000010 netdev_get_mac
00000704 g F .text 00000034 GPIOPinTypeSSI 000023c4 g F .text 00000008 AssertFailure
000020a4 g F .text 00000040 reset_handler 00000724 g F .text 00000034 GPIOPinTypeSSI
000016dc g F .text 00000028 SSIDataGet 000020dc g F .text 00000040 reset_handler
0000312c g F .text 0000001c TimerUpdate 000016fc g F .text 00000028 SSIDataGet
0000300c g F .text 00000010 XcpPacketTransmitted 00003394 g F .text 0000001c TimerUpdate
00002a4c g F .text 00000050 ComTask 00003274 g F .text 00000010 XcpPacketTransmitted
00001654 g F .text 00000024 SSIEnable 00002bf4 g F .text 00000050 ComTask
000011bc g F .text 00000008 SysCtlDelay 00001674 g F .text 00000024 SSIEnable
200011c4 g O .bss 00000002 uip_len 000011dc g F .text 00000008 SysCtlDelay
20001154 g O .bss 00000006 uip_ethaddr 20001248 g O .bss 00000002 uip_len
000055b0 g F .text 0000005c uip_add32 200011a4 g O .bss 00000006 uip_ethaddr
00002990 g F .text 00000020 BootInit 00002b90 g F .text 0000000c BackDoorSetExtension
000023f0 g F .text 0000003a FileSrecVerifyChecksum 0000582c g F .text 0000005c uip_add32
000065c0 g F .text 00000014 __locale_ctype_ptr 00002b0c g F .text 00000020 BootInit
00002a0c g F .text 00000020 BackDoorInit 0000256c g F .text 0000003a FileSrecVerifyChecksum
00001578 g F .text 000000dc SSIConfigSetExpClk 00006fa8 g F .text 00000014 __locale_ctype_ptr
0000298c g F .text 00000002 CopService 00002bc4 g F .text 00000018 BackDoorInit
00006fbc g .text 00000000 _etext 00001598 g F .text 000000dc SSIConfigSetExpClk
000010a8 g F .text 000000a4 SysCtlPeripheralReset 00002b08 g F .text 00000002 CopService
00003758 g F .text 00000004 CpuIrqDisable 000079cc g .text 00000000 _etext
000054e0 g F .text 00000094 ff_wtoupper 000010c8 g F .text 000000a4 SysCtlPeripheralReset
00000678 g F .text 00000024 GPIOPinWrite 000039d4 g F .text 00000004 CpuIrqDisable
00001830 g F .text 00000034 netdev_read 0000575c g F .text 00000094 ff_wtoupper
00005740 g F .text 00000a9c uip_process 00000698 g F .text 00000024 GPIOPinWrite
00003540 g F .text 00000006 FlashGetUserProgBaseAddress 00001868 g F .text 00000034 netdev_read
000065f8 g F .text 00000016 memcpy 000059e0 g F .text 00000bec uip_process
00002578 g F .text 00000410 FileTask 000037a8 g F .text 00000006 FlashGetUserProgBaseAddress
00006ffe g F .text 00000016 memcpy
000026f4 g F .text 00000410 FileTask
00000304 g F .text 00000028 UARTSpaceAvail 00000304 g F .text 00000028 UARTSpaceAvail
000030fc g F .text 0000000c TimerReset 00003364 g F .text 0000000c TimerReset
00001b88 g F .text 00000160 disk_initialize 00001bc0 g F .text 00000160 disk_initialize
200011c8 g O .bss 00000004 uip_sappdata 2000124c g O .bss 00000004 uip_sappdata
00001704 g F .text 00000018 netdev_init 0000172c g F .text 00000018 netdev_init
200011cc g O .bss 00000004 uip_acc32 20001250 g O .bss 00000004 uip_acc32
000056d8 g F .text 00000020 uip_ipchksum 00005978 g F .text 00000020 uip_ipchksum
00000358 g F .text 0000002c UARTCharPutNonBlocking 00000358 g F .text 0000002c UARTCharPutNonBlocking
000029b0 g F .text 00000018 BootTask 00002b2c g F .text 00000018 BootTask
0000346c g F .text 0000004c FlashWriteChecksum 000036d4 g F .text 0000004c FlashWriteChecksum
00002aa0 g F .text 0000002c ComTransmitPacket 000065cc g F .text 000000a8 uip_udp_new
00000874 g F .text 00000030 EthernetInitExpClk 00002cac g F .text 00000018 ComDeferredInit
00001ce8 g F .text 00000014 disk_status 00002c48 g F .text 0000002c ComTransmitPacket
0000242c g F .text 0000014c FileSrecParseLine 00000894 g F .text 00000030 EthernetInitExpClk
00005698 g F .text 00000034 uip_listen 00001d20 g F .text 00000014 disk_status
00001864 g F .text 0000001c netdev_send 000025a8 g F .text 0000014c FileSrecParseLine
00001e30 g F .text 00000274 disk_ioctl 00005938 g F .text 00000034 uip_listen
00002370 g F .text 00000030 FileHandleFirmwareUpdateRequest 0000189c g F .text 0000001c netdev_send
000009f0 g F .text 00000050 EthernetPacketPut 00001e68 g F .text 00000274 disk_ioctl
0000114c g F .text 00000070 SysCtlPeripheralEnable 000024ec g F .text 00000030 FileHandleFirmwareUpdateRequest
200011d0 g O .bss 00000001 uip_flags 00000a10 g F .text 00000050 EthernetPacketPut
00002160 g F .text 00000044 FileFirmwareUpdateCompletedHook 0000116c g F .text 00000070 SysCtlPeripheralEnable
00002ffc g F .text 00000010 XcpIsConnected 20001254 g O .bss 00000001 uip_flags
00005344 g F .text 000000bc f_unlink 000021ac g F .text 00000044 FileFirmwareUpdateCompletedHook
00006638 g F .text 00000000 _init 00003264 g F .text 00000010 XcpIsConnected
000035a4 g F .text 00000008 NvmInit 000055c0 g F .text 000000bc f_unlink
000033ac g F .text 00000018 FlashInit 00007040 g F .text 00000000 _init
000035c4 g F .text 00000008 NvmGetUserProgBaseAddress 00003820 g F .text 00000008 NvmInit
20001898 g .bss 00000000 _ebss 00003614 g F .text 00000018 FlashInit
00005454 g F .text 00000050 f_puts 00003840 g F .text 00000008 NvmGetUserProgBaseAddress
20001960 g .bss 00000000 _ebss
000056d0 g F .text 00000050 f_puts
00006cb4 g F .text 0000003c dhcpc_init
00000800 g *ABS* 00000000 __STACKSIZE__ 00000800 g *ABS* 00000000 __STACKSIZE__
00002238 g F .text 00000010 UnusedISR 000022cc g F .text 00000010 UnusedISR
0000099c g F .text 00000054 EthernetPacketGetNonBlocking 000009bc g F .text 00000054 EthernetPacketGetNonBlocking
00002a9c g F .text 00000002 ComFree 00000678 g F .text 00000020 GPIOPinRead
0000069c g F .text 00000034 GPIOPinTypeEthernetLED 00002c44 g F .text 00000002 ComFree
000006bc g F .text 00000034 GPIOPinTypeEthernetLED
20001258 g O .bss 00000004 uip_udp_conn
00000000 w *UND* 00000000 __sf_fake_stderr 00000000 w *UND* 00000000 __sf_fake_stderr
00006a54 g F .text 00000018 timer_expired
00000000 w *UND* 00000000 __deregister_frame_info 00000000 w *UND* 00000000 __deregister_frame_info
0000363c g F .text 00000024 UartInit 000038b8 g F .text 00000024 UartInit
000035b4 g F .text 00000008 NvmErase 00003830 g F .text 00000008 NvmErase
0000171c g F .text 00000114 netdev_init_mac 00002128 g F .text 00000014 CpuUserProgramStartHook
00001744 g F .text 00000114 netdev_init_mac
0000032c g F .text 0000002c UARTCharGetNonBlocking 0000032c g F .text 0000002c UARTCharGetNonBlocking
0000169c g F .text 00000040 SSIDataPut 000016bc g F .text 00000040 SSIDataPut
200001dc g .bss 00000000 _bss 2000021c g .bss 00000000 _bss
0000516c g F .text 00000024 f_close 000053e8 g F .text 00000024 f_close
0000301c g F .text 000000e0 XcpPacketReceived 00003284 g F .text 000000e0 XcpPacketReceived
00005734 g F .text 0000000a uip_tcpchksum 000059d4 g F .text 0000000a uip_tcpchksum
00003548 g F .text 00000008 CpuInit 000037b0 g F .text 00000008 CpuInit
00004d74 g F .text 0000016c f_read 00004ff0 g F .text 0000016c f_read
00003500 g F .text 00000040 FlashDone 00003768 g F .text 00000040 FlashDone
200011d4 g O .bss 00000004 uip_appdata 2000125c g O .bss 00000004 uip_appdata
200011d8 g O .bss 00000004 uip_conn 20001260 g O .bss 00000004 uip_conn
200011dc g O .bss 00000068 uip_conns 00006fe0 g F .text 0000001e memcmp
00000b70 g F .text 000000d8 FlashProgram 20000040 g .shared 00000000 __shared_end__
00002fe0 g F .text 0000001c XcpInit 20001264 g O .bss 00000068 uip_conns
00002330 g F .text 0000002c FileInit 00000b90 g F .text 000000d8 FlashProgram
00000a78 g F .text 00000028 EthernetIntStatus 00003248 g F .text 0000001c XcpInit
00006448 g F .text 00000160 uip_arp_out 000024ac g F .text 0000002c FileInit
00000a98 g F .text 00000028 EthernetIntStatus
000068e4 g F .text 00000160 uip_arp_out
00000000 w *UND* 00000000 __sf_fake_stdin 00000000 w *UND* 00000000 __sf_fake_stdin
0000342c g F .text 00000040 FlashErase 00003694 g F .text 00000040 FlashErase
0000660e g F .text 00000010 memset 00007014 g F .text 00000010 memset
000021a4 g F .text 00000018 FileFirmwareUpdateErrorHook 000021f0 g F .text 00000018 FileFirmwareUpdateErrorHook
00002228 g F .text 00000010 main 00002298 g F .text 00000032 main
000050d0 g F .text 0000009c f_sync 0000534c g F .text 0000009c f_sync
0000133c g F .text 00000204 SysCtlClockGet 0000135c g F .text 00000204 SysCtlClockGet
000023a0 g F .text 00000050 FileSrecGetLineType 0000251c g F .text 00000050 FileSrecGetLineType
000001e4 g F .text 00000038 UARTDisable 000001e4 g F .text 00000038 UARTDisable
0000661e g F .text 0000001a __ascii_wctomb 00007024 g F .text 0000001a __ascii_wctomb
000035cc g F .text 00000014 NvmDone 00003848 g F .text 00000014 NvmDone
0000095c g F .text 00000040 EthernetEnable 0000097c g F .text 00000040 EthernetEnable
00004ba4 g F .text 00000058 f_mount 00004e20 g F .text 00000058 f_mount
00003660 g F .text 00000050 UartTransmitPacket 000038dc g F .text 00000050 UartTransmitPacket
000035bc g F .text 00000008 NvmVerifyChecksum 00003838 g F .text 00000008 NvmVerifyChecksum
00003584 g F .text 00000020 CpuMemCopy 00003800 g F .text 00000020 CpuMemCopy
00006644 g F .text 00000000 _fini 00002364 g F .text 00000030 SharedParamsInit
00005190 g F .text 00000168 f_lseek 0000704c g F .text 00000000 _fini
00006368 g F .text 000000e0 uip_arp_arpin 0000540c g F .text 00000168 f_lseek
00002ae4 g F .text 00000018 ComGetActiveInterfaceMaxTxLen 00006804 g F .text 000000e0 uip_arp_arpin
000036b0 g F .text 000000a8 UartReceivePacket 00002c8c g F .text 00000018 ComGetActiveInterfaceMaxTxLen
00002130 g F .text 00000008 FileGetFirmwareFilenameHook 0000392c g F .text 000000a8 UartReceivePacket
0000375c g F .text 00000004 CpuIrqEnable 0000217c g F .text 00000008 FileGetFirmwareFilenameHook
000008fc g F .text 00000060 EthernetMACAddrSet 000039d8 g F .text 00000004 CpuIrqEnable
20000064 g O .data 00000004 _impure_ptr 0000091c g F .text 00000060 EthernetMACAddrSet
00006308 g F .text 00000060 uip_arp_timer 200000a4 g O .data 00000004 _impure_ptr
20001244 g O .bss 00000002 uip_listenports 000067a4 g F .text 00000060 uip_arp_timer
20001248 g O .bss 00000004 uip_draddr 200012cc g O .bss 00000002 uip_listenports
000065d4 g F .text 00000024 __ascii_mbtowc 200012d0 g O .bss 00000004 uip_draddr
20000000 g .data 00000000 _data 00006fbc g F .text 00000024 __ascii_mbtowc
00000ad4 g F .text 00000044 EthernetPHYRead 20000040 g .data 00000000 _data
000052f8 g F .text 0000004c f_stat 00000af4 g F .text 00000044 EthernetPHYRead
00002988 g F .text 00000002 CopInit 00005574 g F .text 0000004c f_stat
00001678 g F .text 00000024 SSIDisable 00002b04 g F .text 00000002 CopInit
000035ac g F .text 00000008 NvmWrite 00002b9c g F .text 0000000c BackDoorGetExtension
00003550 g F .text 00000034 CpuStartUserProgram 00006a44 g F .text 0000000e timer_set
20002098 g .bss 00000000 _estack 00001698 g F .text 00000024 SSIDisable
000008a4 g F .text 00000058 EthernetConfigSet 00003828 g F .text 00000008 NvmWrite
000034b8 g F .text 00000048 FlashVerifyChecksum 000037b8 g F .text 00000048 CpuStartUserProgram
00002c44 g F .text 0000003c NetTransmitPacket 20002160 g .bss 00000000 _estack
200001dc g .data 00000000 _edata 000008c4 g F .text 00000058 EthernetConfigSet
0000235c g F .text 00000014 FileIsIdle 00003720 g F .text 00000048 FlashVerifyChecksum
000056cc g F .text 0000000a htons 00002e8c g F .text 00000048 NetTransmitPacket
00004ee0 g F .text 000001a4 f_write 2000021c g .data 00000000 _edata
000024d8 g F .text 00000014 FileIsIdle
0000596c g F .text 0000000a htons
00006f88 g F .text 00000008 dhcpc_appcall
0000515c g F .text 000001a4 f_write
00000000 g O .text 000000f0 _vectab 00000000 g O .text 000000f0 _vectab
00000c48 g F .text 00000068 FlashUserGet 00000c68 g F .text 00000068 FlashUserGet
00000738 g F .text 00000034 GPIOPinTypeUART 00000758 g F .text 00000034 GPIOPinTypeUART
00004bfc g F .text 00000178 f_open 20000000 g .shared 00000000 __shared_start__
00001d84 g F .text 000000ac disk_write 00004e78 g F .text 00000178 f_open
000006d0 g F .text 00000034 GPIOPinTypeGPIOOutput 00001dbc g F .text 000000ac disk_write
000021bc g F .text 00000048 FileFirmwareUpdateLogHook 000006f0 g F .text 00000034 GPIOPinTypeGPIOOutput
00002afc g F .text 00000008 ComIsConnected 00002208 g F .text 00000048 FileFirmwareUpdateLogHook
00002ca4 g F .text 00000008 ComIsConnected
00000000 w *UND* 00000000 __sf_fake_stdout 00000000 w *UND* 00000000 __sf_fake_stdout
00000a40 g F .text 00000038 EthernetIntDisable 00000a60 g F .text 00000038 EthernetIntDisable
00006eb4 g O .text 00000101 _ctype_ 000078c6 g O .text 00000101 _ctype_
00000aa0 g F .text 00000034 EthernetIntClear 00000ac0 g F .text 00000034 EthernetIntClear
000020f0 g F .text 00000040 FileIsFirmwareUpdateRequestedHook 0000213c g F .text 00000040 FileIsFirmwareUpdateRequestedHook
00000384 g F .text 00000020 UARTBusy 00000384 g F .text 00000020 UARTBusy
0000563c g F .text 0000005c uip_init 000058b8 g F .text 00000080 uip_init
00002acc g F .text 00000018 ComGetActiveInterfaceMaxRxLen 00001724 g F .text 00000008 clock_time
00002c80 g F .text 0000000a NetReceivePacket 00002ba8 g F .text 0000001c BackDoorRestartTimer
00002c74 g F .text 00000018 ComGetActiveInterfaceMaxRxLen
00002ed4 g F .text 00000018 NetReceivePacket
000004c8 g F .text 00000064 GPIODirModeSet 000004c8 g F .text 00000064 GPIODirModeSet
00001cfc g F .text 00000088 disk_read 00001d34 g F .text 00000088 disk_read
000029c8 g F .text 00000044 BackDoorCheck 00002b44 g F .text 0000004c BackDoorCheck
20001898 g .bss 00000000 _stack 20001960 g .bss 00000000 _stack
2000124c g O .bss 00000004 uip_netmask 00002394 g F .text 00000030 SharedParamsReadByIndex
20001250 g O .bss 00000004 uip_hostaddr 200012d4 g O .bss 00000004 uip_netmask
000054a4 g F .text 0000003c ff_convert 00002e70 g F .text 0000001c NetDeferredInit
00003148 g F .text 00000010 TimerGet 200012d8 g O .bss 00000004 uip_hostaddr
00002c8c g F .text 00000070 NetApp 00005720 g F .text 0000003c ff_convert
000033b0 g F .text 00000010 TimerGet
00002eec g F .text 00000078 NetApp
00000000 w *UND* 00000000 _Jv_RegisterClasses 00000000 w *UND* 00000000 _Jv_RegisterClasses
0000021c g F .text 000000e8 UARTConfigSetExpClk 0000021c g F .text 000000e8 UARTConfigSetExpClk
00002bd8 g F .text 0000006c NetInit 00002dd0 g F .text 000000a0 NetInit
000011c4 g F .text 00000178 SysCtlClockSet 000011e4 g F .text 00000178 SysCtlClockSet
0000052c g F .text 0000014c GPIOPadConfigSet 0000052c g F .text 0000014c GPIOPadConfigSet
00003108 g F .text 00000024 TimerInit 00003370 g F .text 00000024 TimerInit
00000000 w *UND* 00000000 __register_frame_info 00000000 w *UND* 00000000 __register_frame_info
20001254 g O .bss 00000642 uip_buf 200012dc g O .bss 00000642 uip_buf
20000068 g O .data 0000016c __global_locale 200000a8 g O .data 0000016c __global_locale
00000b18 g F .text 00000058 FlashClear 00000b38 g F .text 00000058 FlashClear
000061dc g F .text 00000028 uip_send 00006674 g F .text 00000028 uip_send
20001896 g O .bss 00000002 uip_slen 00006cf0 g F .text 00000010 dhcpc_request
00002138 g F .text 00000028 FileFirmwareUpdateStartedHook 2000191e g O .bss 00000002 uip_slen
00002184 g F .text 00000028 FileFirmwareUpdateStartedHook
20001920 g O .bss 00000040 uip_udp_conns
000001b4 g F .text 00000030 UARTEnable 000001b4 g F .text 00000030 UARTEnable

View File

@ -50,7 +50,7 @@
/** \brief Motorola or Intel style byte ordering. */ /** \brief Motorola or Intel style byte ordering. */
#define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) #define BOOT_CPU_BYTE_ORDER_MOTOROLA (0)
/** \brief Enable/disable hook function call right before user program start. */ /** \brief Enable/disable hook function call right before user program start. */
#define BOOT_CPU_USER_PROGRAM_START_HOOK (0) #define BOOT_CPU_USER_PROGRAM_START_HOOK (1)
/**************************************************************************************** /****************************************************************************************
@ -80,72 +80,56 @@
* the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a
* message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA
* and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured
* with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configured with the
* BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros * macro BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros
* BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server
* listen on for connections is configured with BOOT_COM_NET_PORT. * listen on for connections is configured with BOOT_COM_NET_PORT.
* In case the network switch/router supports a DHCP server, you can set configuration
* macro BOOT_COM_NET_DHCP_ENABLE to 1 to enable the DHCP client. In this case the
* DHCP client handles the automatic IP address assignment. In this case the macros for
* configuring the IP address, network mask and gateway address are no longer needed.
*/ */
/** \brief Enable/disable the NET transport layer. */ /** \brief Enable/disable the NET transport layer. */
#define BOOT_COM_NET_ENABLE (1) #define BOOT_COM_NET_ENABLE (1)
/** \brief Configure number of bytes in the target->host data packet. */ /** \brief Configure number of bytes in the target->host data packet. */
#define BOOT_COM_NET_TX_MAX_DATA (64) #define BOOT_COM_NET_TX_MAX_DATA (64)
/** \brief Configure number of bytes in the host->target data packet. */ /** \brief Configure number of bytes in the host->target data packet. */
#define BOOT_COM_NET_RX_MAX_DATA (64) #define BOOT_COM_NET_RX_MAX_DATA (64)
/** \brief Configure the port that the TCP/IP server listens on */ /** \brief Configure the port that the TCP/IP server listens on */
#define BOOT_COM_NET_PORT (1000) #define BOOT_COM_NET_PORT (1000)
/** \brief Enable/disable DHCP client for automatically obtaining an IP address. */
#define BOOT_COM_NET_DHCP_ENABLE (1)
/** \brief Configure the 1st byte of the IP address */ /** \brief Configure the 1st byte of the IP address */
#define BOOT_COM_NET_IPADDR0 (169) #define BOOT_COM_NET_IPADDR0 (192)
/** \brief Configure the 2nd byte of the IP address */ /** \brief Configure the 2nd byte of the IP address */
#define BOOT_COM_NET_IPADDR1 (254) #define BOOT_COM_NET_IPADDR1 (168)
/** \brief Configure the 3rd byte of the IP address */ /** \brief Configure the 3rd byte of the IP address */
#define BOOT_COM_NET_IPADDR2 (19) #define BOOT_COM_NET_IPADDR2 (178)
/** \brief Configure the 4th byte of the IP address */ /** \brief Configure the 4th byte of the IP address */
#define BOOT_COM_NET_IPADDR3 (63) #define BOOT_COM_NET_IPADDR3 (50)
/** \brief Configure the 1st byte of the network mask */ /** \brief Configure the 1st byte of the network mask */
#define BOOT_COM_NET_NETMASK0 (255) #define BOOT_COM_NET_NETMASK0 (255)
/** \brief Configure the 2nd byte of the network mask */ /** \brief Configure the 2nd byte of the network mask */
#define BOOT_COM_NET_NETMASK1 (255) #define BOOT_COM_NET_NETMASK1 (255)
/** \brief Configure the 3rd byte of the network mask */ /** \brief Configure the 3rd byte of the network mask */
#define BOOT_COM_NET_NETMASK2 (0) #define BOOT_COM_NET_NETMASK2 (255)
/** \brief Configure the 4th byte of the network mask */ /** \brief Configure the 4th byte of the network mask */
#define BOOT_COM_NET_NETMASK3 (0) #define BOOT_COM_NET_NETMASK3 (0)
/** \brief Configure the 1st byte of the gateway address */ /** \brief Configure the 1st byte of the gateway address */
#define BOOT_COM_NET_GATEWAY0 (169) #define BOOT_COM_NET_GATEWAY0 (192)
/** \brief Configure the 2nd byte of the gateway address */ /** \brief Configure the 2nd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY1 (254) #define BOOT_COM_NET_GATEWAY1 (168)
/** \brief Configure the 3rd byte of the gateway address */ /** \brief Configure the 3rd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY2 (19) #define BOOT_COM_NET_GATEWAY2 (178)
/** \brief Configure the 4th byte of the gateway address */ /** \brief Configure the 4th byte of the gateway address */
#define BOOT_COM_NET_GATEWAY3 (1) #define BOOT_COM_NET_GATEWAY3 (1)
/** \brief Enable/disable a hook function that is called when the IP address is about /** \brief Enable/disable the deferred initialization mechanism. When enabled, the
* to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. * communication interface is only initialized when: (a) no valid user program
* is detected, or (b) when CpuUserProgramStartHook() returns BLT_FALSE. Your
* bootloader application can explicitly initialize the communication interface
* by calling ComDeferredInit().
*/ */
#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) #define BOOT_COM_NET_DEFERRED_INIT_ENABLE (1)
/** \brief Enable/disable a hook function that is called when the netmask is about
* to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values.
*/
#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0)
/** \brief Enable/disable a hook function that is called when the gateway address is
* about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx
* values.
*/
#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_NET_ENABLE > 0)
/* Override the default time that the backdoor is open if firmware updates via TCP/IP
* are supported. in this case a reactivation of the bootloader results in a re-
* initialization of the ethernet MAC. when directly connected to the ethernet port of
* a PC this will go relatively fast (depending on what MS Windows is being used), but
* when connected to the network via a router this can take several seconds. feel free to
* shorten/lengthen this time for finetuning. the only downside of a long backdoor open
* time is that the starting of the user program will also be delayed for this time.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (10000)
#endif
/**************************************************************************************** /****************************************************************************************

View File

@ -30,6 +30,8 @@
* Include files * Include files
****************************************************************************************/ ****************************************************************************************/
#include "boot.h" /* bootloader generic header */ #include "boot.h" /* bootloader generic header */
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#if (BOOT_FILE_LOGGING_ENABLE > 0) #if (BOOT_FILE_LOGGING_ENABLE > 0)
#include "inc/hw_memmap.h" #include "inc/hw_memmap.h"
#include "inc/hw_types.h" #include "inc/hw_types.h"
@ -81,6 +83,11 @@ blt_bool BackDoorEntryHook(void)
****************************************************************************************/ ****************************************************************************************/
blt_bool CpuUserProgramStartHook(void) blt_bool CpuUserProgramStartHook(void)
{ {
/* do not start the user program is the pushbutton is pressed */
if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1) == 0)
{
return BLT_FALSE;
}
/* okay to start the user program */ /* okay to start the user program */
return BLT_TRUE; return BLT_TRUE;
} /*** end of CpuUserProgramStartHook ***/ } /*** end of CpuUserProgramStartHook ***/
@ -193,79 +200,6 @@ blt_bool NvmWriteChecksumHook(void)
#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */ #endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */
/****************************************************************************************
* N E T W O R K I N T E R F A C E H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_COM_NET_IPADDR_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the IP address is about to be configured.
** \param ipAddrArray 4-byte array where the IP address should be stored.
** \return none.
**
****************************************************************************************/
void NetIpAddressHook(blt_int8u *ipAddrArray)
{
/* This hook function allows a dynamic configuration of the IP address. This could for
* example be used if the bootloader is activated from a running user program and
* should have the same IP address as the user program. This IP address could be stored
* at a fixed location in RAM which can be read here. For now the example implemen-
* tation simply configures the bootloader's default IP address.
*/
ipAddrArray[0] = BOOT_COM_NET_IPADDR0;
ipAddrArray[1] = BOOT_COM_NET_IPADDR1;
ipAddrArray[2] = BOOT_COM_NET_IPADDR2;
ipAddrArray[3] = BOOT_COM_NET_IPADDR3;
} /*** end of NetIpAddressHook ***/
#endif /* BOOT_COM_NET_IPADDR_HOOK_ENABLE > 0 */
#if (BOOT_COM_NET_NETMASK_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the network mask is about to be configured.
** \param netMaskArray 4-byte array where the network mask should be stored.
** \return none.
**
****************************************************************************************/
void NetNetworkMaskHook(blt_int8u *netMaskArray)
{
/* This hook function allows a dynamic configuration of the network mask. This could
* for example be used if the bootloader is activated from a running user program and
* should have the same network mask as the user program. This network mask could be
* stored at a fixed location in RAM which can be read here. For now the example
* implementation simply configures the bootloader's default network mask.
*/
netMaskArray[0] = BOOT_COM_NET_NETMASK0;
netMaskArray[1] = BOOT_COM_NET_NETMASK1;
netMaskArray[2] = BOOT_COM_NET_NETMASK2;
netMaskArray[3] = BOOT_COM_NET_NETMASK3;
} /*** end of NetNetworkMaskHook ***/
#endif /* BOOT_COM_NET_NETMASK_HOOK_ENABLE > 0 */
#if (BOOT_COM_NET_GATEWAY_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the gateway address is about to be
** configured.
** \param gatewayAddrArray 4-byte array where the gateway address should be stored.
** \return none.
**
****************************************************************************************/
void NetGatewayAddressHook(blt_int8u *gatewayAddrArray)
{
/* This hook function allows a dynamic configuration of the network mask. This could
* for example be used if the bootloader is activated from a running user program and
* should have the same network mask as the user program. This network mask could be
* stored at a fixed location in RAM which can be read here. For now the example
* implementation simply configures the bootloader's default network mask.
*/
gatewayAddrArray[0] = BOOT_COM_NET_GATEWAY0;
gatewayAddrArray[1] = BOOT_COM_NET_GATEWAY1;
gatewayAddrArray[2] = BOOT_COM_NET_GATEWAY2;
gatewayAddrArray[3] = BOOT_COM_NET_GATEWAY3;
} /*** end of NetGatewayAddressHook ***/
#endif /* BOOT_COM_NET_GATEWAY_HOOK_ENABLE > 0 */
/**************************************************************************************** /****************************************************************************************
* W A T C H D O G D R I V E R H O O K F U N C T I O N S * W A T C H D O G D R I V E R H O O K F U N C T I O N S
****************************************************************************************/ ****************************************************************************************/

View File

@ -59,6 +59,10 @@
#define NETDEV_DEFAULT_MACADDR5 (0x45) #define NETDEV_DEFAULT_MACADDR5 (0x45)
/*---------------------------------------------------------------------------*/
static struct uip_eth_addr macAddress;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void netdev_init(void) void netdev_init(void)
{ {
@ -142,6 +146,18 @@ void netdev_init_mac(void)
} }
/*---------------------------------------------------------------------------*/
void netdev_get_mac(unsigned char * mac_addr)
{
mac_addr[0] = macAddress.addr[0];
mac_addr[1] = macAddress.addr[1];
mac_addr[2] = macAddress.addr[2];
mac_addr[3] = macAddress.addr[3];
mac_addr[4] = macAddress.addr[4];
mac_addr[5] = macAddress.addr[5];
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned int netdev_read(void) unsigned int netdev_read(void)
{ {

View File

@ -40,6 +40,7 @@
void netdev_init(void); void netdev_init(void);
void netdev_init_mac(void); void netdev_init_mac(void);
void netdev_get_mac(unsigned char * mac_addr);
unsigned int netdev_read(void); unsigned int netdev_read(void);
void netdev_send(void); void netdev_send(void);

View File

@ -98,6 +98,27 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_MAX_LISTENPORTS 1 #define UIP_CONF_MAX_LISTENPORTS 1
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 1
/**
* UDP Maximum Connections
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CONNS 1
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
/** /**
* uIP buffer size. * uIP buffer size.
* *
@ -119,20 +140,6 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_LOGGING 0 #define UIP_CONF_LOGGING 0
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 1
/** /**
* uIP statistics on or off * uIP statistics on or off
* *
@ -140,10 +147,12 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_STATISTICS 0 #define UIP_CONF_STATISTICS 0
/* Here we include the header file for the application(s) we use in /* Here we include the header file for the application(s) we use in
our project. */ our project. */
#include "boot.h" #include "boot.h"
#include "net.h" #include "net.h"
#include "dhcpc.h"
#endif /* __UIP_CONF_H__ */ #endif /* __UIP_CONF_H__ */

View File

@ -40,6 +40,7 @@
#if (BOOT_FILE_LOGGING_ENABLE > 0) #if (BOOT_FILE_LOGGING_ENABLE > 0)
#include "driverlib/uartlib.h" #include "driverlib/uartlib.h"
#endif #endif
#include "shared_params.h" /* Shared parameters header */
/**************************************************************************************** /****************************************************************************************
* Function prototypes * Function prototypes
@ -55,11 +56,44 @@ static void Init(void);
****************************************************************************************/ ****************************************************************************************/
int main(void) int main(void)
{ {
blt_int8u deferredInitRequestFlag = 0;
/* initialize the microcontroller */ /* initialize the microcontroller */
Init(); Init();
/* initialize the shared parameters module */
SharedParamsInit();
/* initialize the bootloader */ /* initialize the bootloader */
BootInit(); BootInit();
#if (BOOT_COM_DEFERRED_INIT_ENABLE == 1)
/* the bootloader is configured to NOT initialize the TCP/IP network stack by default
* to bypass unnecessary delay times before starting the user program. the TCP/IP net-
* work tack is now only initialized when: (a) no valid user program is detected, or
* (b) a forced backdoor entry occurred (CpuUserProgramStartHook() returned BLT_FALSE).
*
* these demo bootloader and user programs have one extra feature implemented for
* demonstration purposes. the demo user program can detect firmware update requests
* from the TCP/IP network in which case it activates the bootloader. But...the
* TCP/IP network stack will not be initialized in this situation. for this reason
* the shared parameter module was integrated in both the bootloader and user program.
* more information about the shared parameter module can be found here:
* https://www.feaser.com/en/blog/?p=216
*
* the shared parameter at the first index (0) contains a flag. this flag is set to
* 1, right before the user program activates this bootloader, to explicitly request
* the bootloader to initialize the TCP/IP network stack. this makes it possible for
* a firmware update to proceed. the code here reads out this flag and performs the
* TCP/IP network stack initialization when requested.
*/
SharedParamsReadByIndex(0, &deferredInitRequestFlag);
if (deferredInitRequestFlag == 1)
{
/* explicitly initialize all communication interface for which the deferred
* initialization feature was enabled.
*/
ComDeferredInit();
}
#endif
/* start the infinite program loop */ /* start the infinite program loop */
while (1) while (1)
{ {
@ -81,6 +115,14 @@ static void Init(void)
{ {
/* set the clocking to run at 50MHz from the PLL */ /* set the clocking to run at 50MHz from the PLL */
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
/* initialize the status button as a digital input. it is used to override the
* starting of the user program.
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
#if (BOOT_COM_UART_ENABLE > 0) #if (BOOT_COM_UART_ENABLE > 0)
#if (BOOT_COM_UART_CHANNEL_INDEX == 0) #if (BOOT_COM_UART_CHANNEL_INDEX == 0)
/* enable and configure UART0 related peripherals and pins */ /* enable and configure UART0 related peripherals and pins */

View File

@ -82,6 +82,8 @@ PROJ_FILES += ../../../Source/third_party/uip/uip/uip_timer.h
PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.c PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.c
PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.h PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.h
PROJ_FILES += ../../../Source/third_party/uip/uip/uipopt.h PROJ_FILES += ../../../Source/third_party/uip/uip/uipopt.h
PROJ_FILES += ../../../Source/third_party/uip/apps/dhcpc/dhcpc.c
PROJ_FILES += ../../../Source/third_party/uip/apps/dhcpc/dhcpc.h
#|--------------------------------------------------------------------------------------| #|--------------------------------------------------------------------------------------|

View File

@ -1,13 +1,25 @@
MEMORY MEMORY
{ {
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 32K FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 32K
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K SHARED (rwx) : ORIGIN = 0x20000000, LENGTH = 64
SRAM (rwx) : ORIGIN = 0x20000040, LENGTH = 64K - 64
} }
SECTIONS SECTIONS
{ {
__STACKSIZE__ = 2048; __STACKSIZE__ = 2048;
.shared (NOLOAD):
{
. = ALIGN(4);
__shared_start__ = .;
*(.shared)
*(.shared.*)
KEEP(*(.shared))
. = ALIGN(4);
__shared_end__ = .;
} > SHARED
.text : .text :
{ {
KEEP(*(.isr_vector)) KEEP(*(.isr_vector))

View File

@ -0,0 +1,301 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/shared_params.c
* \brief Shared RAM parameters source file.
* \ingroup Boot_ARMCM3_LM3S_EK_LM3S6965_GCC
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stddef.h> /* Standard definitions (NULL). */
#include "shared_params.h" /* Shared parameters header. */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Constant parameter buffer identifier. This value is always located as the
* start of the buffer to validate the the RAM contains valid shared parameters.
*/
#define SHARED_PARAMS_BUFFER_ID (0xCE42E7A2u)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Layout of the shared parameters RAM buffer. */
typedef struct t_shared_params_buffer
{
/** \brief Fixed buffer identifier to validate that the RAM contains valid shared
* parameters.
*/
uint32_t identifier;
/** \brief Array for the actual parameter data. */
uint8_t data[SHARED_PARAMS_CFG_BUFFER_DATA_LEN];
/** \brief Checksum value of all the bytes in the buffer, excluding this checksum
* value of obvious reasons. The checksum is calculated as the Two's
* complement of the sum of the bytes.
*/
uint16_t checksum;
} tSharedParamsBuffer;
/****************************************************************************************
* Global data declarations
****************************************************************************************/
/** \brief Declaration of the actual parameter buffer that this module manages.
* \warning For the shared RAM parameters to work properly for sharing information
* between the bootloader and user program, it is important that this
* variable is linked to the exact same RAM address in both the bootloader
* and the user program. Additionally, it should be configured such that the
* C-startup code does NOT zero its contents during system initialization. This
* is the code that runs in the reset event handler, before function main() is
* called.
* For GCC based embedded toolchains, the solution is to assign this variable
* to a custom section, in this case called ".shared". Then in the linker
* script, add the following to the SECTIONS:
*
* .shared (NOLOAD) :
* {
* . = ALIGN(4);
* _sshared = .;
* __shared_start__ = _sshared;
* *(.shared)
* *(.shared.*)
* KEEP(*(.shared))
* . = ALIGN(4);
* _eshared = .;
* __shared_end__ = _eshared;
* } >SHARED
*
* Next, add a new MEMORY entry for SHARED at the start of RAM and reduce
* the length of the remaining RAM:
*
* SHARED (xrw) : ORIGIN = 0x200000C0, LENGTH = 64
* RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 32K - 192 - 64
*
* Note that the previous example is for an STM32F0 microcontroller where
* the first 192 (0xC0) bytes in RAM are reserved for the user program
* vector table.
*
* \remark This same approach can be applied with other toolchains such as Keil MDK
* and IAR EWARM. Consult the compiler and linker user manuals of your
* toolchain to find out how to place a RAM variable at a fixed memory address
* and to prevent the C-startup code from zeroing its contents.
* Here are a few links to get you started:
* * IAR EWARM:
* https://www.iar.com/support/tech-notes/compiler/
* linker-error-for-absolute-located-variable/
* * Keil MDK:
* http://www.keil.com/support/docs/3480.htm
*/
static tSharedParamsBuffer sharedParamsBuffer __attribute__ ((section (".shared")));
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static bool SharedParamsValidateBuffer(void);
static void SharedParamsWriteChecksum(void);
static bool SharedParamsVerifyChecksum(void);
static uint16_t SharedParamsCalculateChecksum(void);
/************************************************************************************//**
** \brief Initializes the shared RAM parameters module.
** \return none.
**
****************************************************************************************/
void SharedParamsInit(void)
{
uint32_t byteIdx;
/* The shared parameter buffer does not get initialized by the C-startup code. Another
* previously running program could have initialized it, in which case it is ready
* for use and nothing more needs to be done.
*/
if (!SharedParamsValidateBuffer())
{
/* The shared parameter buffer was not yet initialized by a running program. This
* typically happens after a cold reset where the RAM contents were lost. In this
* case we need to explicitly configure and initialize it, since the C-startup code
* was configured to not do this.
*
* The initialization consists of setting the buffer identifier, zeroing the
* actual parameter data and updating the checksum at the end.
*/
sharedParamsBuffer.identifier = SHARED_PARAMS_BUFFER_ID;
for (byteIdx=0; byteIdx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
sharedParamsBuffer.data[byteIdx] = 0;
}
SharedParamsWriteChecksum();
}
} /*** end of SharedParamsInit ***/
/************************************************************************************//**
** \brief Reads a data byte from the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Pointer to where the read data value is stored.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) &&
(value != NULL) )
{
/* Read the value and update the result. */
*value = sharedParamsBuffer.data[idx];
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsReadByIndex ***/
/************************************************************************************//**
** \brief Writes a data byte to the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Value to write.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) )
{
/* Write the value. */
sharedParamsBuffer.data[idx] = value;
/* Update the checksum since the contents were just changed. */
SharedParamsWriteChecksum();
/* Update the result. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsWriteByIndex ***/
/************************************************************************************//**
** \brief Validates the shared parameter buffer contents by looking at the table
** identifier and verifying its checksum.
** \return True if successful, false otherwise.
**
****************************************************************************************/
static bool SharedParamsValidateBuffer(void)
{
bool result = false;
/* Perform validation. */
if ( (sharedParamsBuffer.identifier == SHARED_PARAMS_BUFFER_ID) &&
(SharedParamsVerifyChecksum()) )
{
/* The shared parameter buffer is valid, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsValitabeTable ***/
/************************************************************************************//**
** \brief Calculates and writes the checksum into the buffer.
** \return none.
**
****************************************************************************************/
static void SharedParamsWriteChecksum(void)
{
/* Calculate and write the checksum. */
sharedParamsBuffer.checksum = SharedParamsCalculateChecksum();
} /*** end of SharedParamsWriteChecksum ***/
/************************************************************************************//**
** \brief Calculates and verifies the checksum that is currently present in the
** buffer.
** \return True is the checksum is correct, false otherwise.
**
****************************************************************************************/
static bool SharedParamsVerifyChecksum(void)
{
bool result = false;
/* Calculate and verify the checksum. */
if (SharedParamsCalculateChecksum() == sharedParamsBuffer.checksum)
{
/* Checksum is correct, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsVerifyChecksum ***/
/************************************************************************************//**
** \brief Calculates and returns the checksum value for the current contents in the
** buffer. The checksum is calculated by taking the sum of all bytes in the
** parameter buffer (excluding the checksum at the end) and them taking the
** two's complement value of it.
** \return The calculated checksum value.
**
****************************************************************************************/
static uint16_t SharedParamsCalculateChecksum(void)
{
uint16_t result = 0;
uint32_t byteIdx;
/* Add the identifier bytes to the checksum. */
result += (uint8_t)sharedParamsBuffer.identifier;
result += (uint8_t)(sharedParamsBuffer.identifier >> 8u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 16u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 24u);
/* Loop through the parameter data array. */
for (byteIdx=0; byteIdx<SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
/* Add parameter data byte to the checksum. */
result += (uint8_t)sharedParamsBuffer.data[byteIdx];
}
/* Determine one's complement. */
result = ~result;
/* Determine two's complement. */
result += 1;
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsCalculateChecksum ***/
/*********************************** end of shared_params.c ****************************/

View File

@ -0,0 +1,57 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Boot/shared_params.h
* \brief Shared RAM parameters header file.
* \ingroup Boot_ARMCM3_LM3S_EK_LM3S6965_GCC
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef SHARED_PARAMS_H
#define SHARED_PARAMS_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* Standard integer types. */
#include <stdbool.h> /* Standard boolean types. */
/****************************************************************************************
* Configuration macros
****************************************************************************************/
/** \brief Configuration macro for specifying the size of the data inside the parameter
* buffer. This is the length in bytes of the actual parameter data, so
* excluding the bufferId and checksum.
*/
#define SHARED_PARAMS_CFG_BUFFER_DATA_LEN (56u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void SharedParamsInit(void);
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value);
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value);
#endif /* SHARED_PARAMS_H */
/*********************************** end of shared_params.h ****************************/

View File

@ -7,45 +7,50 @@ start address 0x00008000
Program Header: Program Header:
LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**16 LOAD off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**16
filesz 0x0000a72c memsz 0x0000a72c flags r-x filesz 0x0000b058 memsz 0x0000b058 flags r-x
LOAD off 0x00010000 vaddr 0x20000000 paddr 0x0000a72c align 2**16 LOAD off 0x00010040 vaddr 0x20000040 paddr 0x0000b058 align 2**16
filesz 0x00000008 memsz 0x00000b8c flags rw- filesz 0x00000008 memsz 0x00000c0c flags rw-
LOAD off 0x00020000 vaddr 0x20000000 paddr 0x20000000 align 2**16
filesz 0x00000000 memsz 0x00000040 flags rw-
private flags = 5000200: [Version5 EABI] [soft-float ABI] private flags = 5000200: [Version5 EABI] [soft-float ABI]
Sections: Sections:
Idx Name Size VMA LMA File off Algn Idx Name Size VMA LMA File off Algn
0 .text 0000272c 00008000 00008000 00008000 2**2 0 .shared 00000040 20000000 20000000 00020000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000008 20000000 0000a72c 00010000 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000b84 20000008 0000a734 00010008 2**2
ALLOC ALLOC
3 .ARM.attributes 00000029 00000000 00000000 00010008 2**0 1 .text 00003058 00008000 00008000 00008000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .data 00000008 20000040 0000b058 00010040 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00000c04 20000048 0000b060 00010048 2**2
ALLOC
4 .ARM.attributes 00000029 00000000 00000000 00010048 2**0
CONTENTS, READONLY CONTENTS, READONLY
4 .comment 0000006e 00000000 00000000 00010031 2**0 5 .comment 0000006e 00000000 00000000 00010071 2**0
CONTENTS, READONLY CONTENTS, READONLY
5 .debug_info 000065fb 00000000 00000000 0001009f 2**0 6 .debug_info 00007b79 00000000 00000000 000100df 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
6 .debug_abbrev 00001381 00000000 00000000 0001669a 2**0 7 .debug_abbrev 0000194f 00000000 00000000 00017c58 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
7 .debug_loc 00003dac 00000000 00000000 00017a1b 2**0 8 .debug_loc 0000450b 00000000 00000000 000195a7 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
8 .debug_aranges 00000838 00000000 00000000 0001b7c7 2**0 9 .debug_aranges 00000978 00000000 00000000 0001dab2 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
9 .debug_ranges 00000738 00000000 00000000 0001bfff 2**0 10 .debug_ranges 00000838 00000000 00000000 0001e42a 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
10 .debug_macro 000055c7 00000000 00000000 0001c737 2**0 11 .debug_macro 000070a8 00000000 00000000 0001ec62 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
11 .debug_line 00003380 00000000 00000000 00021cfe 2**0 12 .debug_line 000051e3 00000000 00000000 00025d0a 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
12 .debug_str 00023b30 00000000 00000000 0002507e 2**0 13 .debug_str 000266b4 00000000 00000000 0002aeed 2**0
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
13 .debug_frame 00001540 00000000 00000000 00048bb0 2**2 14 .debug_frame 00001870 00000000 00000000 000515a4 2**2
CONTENTS, READONLY, DEBUGGING CONTENTS, READONLY, DEBUGGING
SYMBOL TABLE: SYMBOL TABLE:
20000000 l d .shared 00000000 .shared
00008000 l d .text 00000000 .text 00008000 l d .text 00000000 .text
20000000 l d .data 00000000 .data 20000040 l d .data 00000000 .data
20000008 l d .bss 00000000 .bss 20000048 l d .bss 00000000 .bss
00000000 l d .ARM.attributes 00000000 .ARM.attributes 00000000 l d .ARM.attributes 00000000 .ARM.attributes
00000000 l d .comment 00000000 .comment 00000000 l d .comment 00000000 .comment
00000000 l d .debug_info 00000000 .debug_info 00000000 l d .debug_info 00000000 .debug_info
@ -59,13 +64,13 @@ SYMBOL TABLE:
00000000 l d .debug_frame 00000000 .debug_frame 00000000 l d .debug_frame 00000000 .debug_frame
00000000 l df *ABS* 00000000 vectors.c 00000000 l df *ABS* 00000000 vectors.c
00000000 l df *ABS* 00000000 crtstuff.c 00000000 l df *ABS* 00000000 crtstuff.c
0000a728 l O .text 00000000 __EH_FRAME_BEGIN__ 0000b054 l O .text 00000000 __EH_FRAME_BEGIN__
000080f4 l F .text 00000000 __do_global_dtors_aux 000080f4 l F .text 00000000 __do_global_dtors_aux
20000008 l .bss 00000000 completed.8603 20000048 l .bss 00000000 completed.8603
20000004 l O .data 00000000 __do_global_dtors_aux_fini_array_entry 20000044 l O .data 00000000 __do_global_dtors_aux_fini_array_entry
00008118 l F .text 00000000 frame_dummy 00008118 l F .text 00000000 frame_dummy
2000000c l .bss 00000000 object.8608 2000004c l .bss 00000000 object.8608
20000000 l O .data 00000000 __frame_dummy_init_array_entry 20000040 l O .data 00000000 __frame_dummy_init_array_entry
00000000 l df *ABS* 00000000 systick.c 00000000 l df *ABS* 00000000 systick.c
00000000 l df *ABS* 00000000 flash.c 00000000 l df *ABS* 00000000 flash.c
00000000 l df *ABS* 00000000 gpio.c 00000000 l df *ABS* 00000000 gpio.c
@ -77,53 +82,81 @@ SYMBOL TABLE:
000088f4 l F .text 0000002c UARTBaseValid 000088f4 l F .text 0000002c UARTBaseValid
00000000 l df *ABS* 00000000 sysctl.c 00000000 l df *ABS* 00000000 sysctl.c
00008a9c l F .text 000001f8 SysCtlPeripheralValid 00008a9c l F .text 000001f8 SysCtlPeripheralValid
0000a694 l O .text 0000005c g_pulXtals 0000afb8 l O .text 0000005c g_pulXtals
0000a708 l O .text 0000000c g_pulRCGCRegs 0000b02c l O .text 0000000c g_pulRCGCRegs
0000a714 l O .text 0000000c g_pulSRCRRegs 0000b038 l O .text 0000000c g_pulSRCRRegs
00000000 l df *ABS* 00000000 clock-arch.c
00000000 l df *ABS* 00000000 netdev.c 00000000 l df *ABS* 00000000 netdev.c
00000000 l df *ABS* 00000000 led.c 00000000 l df *ABS* 00000000 led.c
20000024 l O .bss 00000004 timer_counter_last.4548 20000064 l O .bss 00000004 timer_counter_last.4602
20000028 l O .bss 00000001 led_toggle_state.4547 20000068 l O .bss 00000001 led_toggle_state.4601
00000000 l df *ABS* 00000000 cstart.c 00000000 l df *ABS* 00000000 cstart.c
000092ba l F .text 00000000 zero_loop 000092d2 l F .text 00000000 zero_loop
00000000 l df *ABS* 00000000 main.c 00000000 l df *ABS* 00000000 main.c
000092e4 l F .text 00000018 Init 000092fc l F .text 00000018 Init
2000002c l O .bss 00000004 assert_failure_line.4555 2000006c l O .bss 00000004 assert_failure_line.4609
00000000 l df *ABS* 00000000 boot.c 00000000 l df *ABS* 00000000 boot.c
00009328 l F .text 00000038 BootComUartInit 0000934c l F .text 00000038 BootComUartInit
00009360 l F .text 00000020 UartReceiveByte 00009384 l F .text 00000020 UartReceiveByte
00009390 l F .text 00000098 BootComUartCheckActivationRequest 000093b4 l F .text 00000098 BootComUartCheckActivationRequest
20000030 l O .bss 00000004 xcpCtoRxStartTime.4565 20000070 l O .bss 00000004 xcpCtoRxStartTime.4619
20000034 l O .bss 00000041 xcpCtoReqPacket.4562 20000074 l O .bss 00000041 xcpCtoReqPacket.4616
20000075 l O .bss 00000001 xcpCtoRxLength.4563 200000b5 l O .bss 00000001 xcpCtoRxLength.4617
20000076 l O .bss 00000001 xcpCtoRxInProgress.4564 200000b6 l O .bss 00000001 xcpCtoRxInProgress.4618
00000000 l df *ABS* 00000000 shared_params.c
00009454 l F .text 00000038 SharedParamsCalculateChecksum
0000948c l F .text 0000001c SharedParamsVerifyChecksum
000094a8 l F .text 00000024 SharedParamsValidateBuffer
000094cc l F .text 00000010 SharedParamsWriteChecksum
20000000 l O .shared 00000040 sharedParamsBuffer
00000000 l df *ABS* 00000000 net.c 00000000 l df *ABS* 00000000 net.c
20000078 l O .bss 00000004 ARPTimerTimeOut 200000b8 l O .bss 00000004 ARPTimerTimeOut
2000007c l O .bss 00000004 periodicTimerTimeOut 200000bc l O .bss 00000006 macAddress
200000c4 l O .bss 00000004 periodicTimerTimeOut
00000000 l df *ABS* 00000000 time.c 00000000 l df *ABS* 00000000 time.c
20000080 l O .bss 00000004 millisecond_counter 200000c8 l O .bss 00000004 millisecond_counter
00000000 l df *ABS* 00000000 uip.c 00000000 l df *ABS* 00000000 uip.c
000095f4 l F .text 0000003a chksum 00009740 l F .text 0000003a chksum
0000968c l F .text 00000030 uip_add_rcv_nxt 000097d8 l F .text 00000030 uip_add_rcv_nxt
00009778 l F .text 0000003c upper_layer_chksum 000098e8 l F .text 0000003c upper_layer_chksum
20000084 l O .bss 00000002 tmp16 200000cc l O .bss 00000002 tmp16
20000086 l O .bss 00000002 ipid 200000ce l O .bss 00000002 ipid
20000088 l O .bss 00000004 iss 200000d0 l O .bss 00000004 iss
2000008c l O .bss 00000002 lastport 200000d4 l O .bss 00000002 lastport
2000008e l O .bss 00000001 c 200000d6 l O .bss 00000001 c
00000000 l df *ABS* 00000000 uip_arp.c 00000000 l df *ABS* 00000000 uip_arp.c
0000a25c l F .text 00000104 uip_arp_update 0000a5ec l F .text 00000108 uip_arp_update
20000096 l O .bss 00000001 i 200000de l O .bss 00000001 i
20000097 l O .bss 00000001 tmpage 200000df l O .bss 00000001 tmpage
20000098 l O .bss 00000060 arp_table 200000e0 l O .bss 00000060 arp_table
0000a720 l O .text 00000006 broadcast_ethaddr 0000b044 l O .text 00000006 broadcast_ethaddr
200000f8 l O .bss 00000001 c 20000140 l O .bss 00000001 c
200000f9 l O .bss 00000001 arptime 20000141 l O .bss 00000001 arptime
200000fc l O .bss 00000004 ipaddr 20000144 l O .bss 00000004 ipaddr
00000000 l df *ABS* 00000000 uip_timer.c
00000000 l df *ABS* 00000000 dhcpc.c
0000a9bc l F .text 0000000e add_msg_type
0000a9cc l F .text 0000001c add_server_id
0000a9e8 l F .text 00000016 add_req_options
0000aa00 l F .text 00000008 add_end
0000aa08 l F .text 0000002c dhcpc_configured
0000aa34 l F .text 0000001c add_req_ipaddr
0000aa50 l F .text 00000078 parse_options
0000aac8 l F .text 00000080 create_msg
0000ab48 l F .text 00000030 send_discover
0000ab78 l F .text 00000034 send_request
0000abac l F .text 00000058 parse_msg
0000ac50 l F .text 00000288 handle_dhcp
0000b04c l O .text 00000004 xid
20000148 l O .bss 00000034 s
0000b050 l O .text 00000004 magic_cookie
00000000 l df *ABS* 00000000 memcmp.c
00000000 l df *ABS* 00000000 memcpy-stub.c
00000000 l df *ABS* 00000000 memset.c
00000000 l df *ABS* 00000000 c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crti.o 00000000 l df *ABS* 00000000 c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crti.o
00000000 l df *ABS* 00000000 c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtn.o 00000000 l df *ABS* 00000000 c:/progra~2/gnutoo~1/50a5a~1.420/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7-m/crtn.o
00000000 l df *ABS* 00000000 crtstuff.c 00000000 l df *ABS* 00000000 crtstuff.c
0000a728 l O .text 00000000 __FRAME_END__ 0000b054 l O .text 00000000 __FRAME_END__
00000000 l df *ABS* 00000000 00000000 l df *ABS* 00000000
00000000 l *UND* 00000000 __bss_start__ 00000000 l *UND* 00000000 __bss_start__
00000000 l *UND* 00000000 __libc_fini_array 00000000 l *UND* 00000000 __libc_fini_array
@ -132,102 +165,120 @@ SYMBOL TABLE:
00000000 l *UND* 00000000 __call_exitprocs 00000000 l *UND* 00000000 __call_exitprocs
00000000 l *UND* 00000000 software_init_hook 00000000 l *UND* 00000000 software_init_hook
00000000 l *UND* 00000000 __sf_fake_stdin 00000000 l *UND* 00000000 __sf_fake_stdin
20000004 l .data 00000000 __init_array_end 20000044 l .data 00000000 __init_array_end
00000000 l *UND* 00000000 hardware_init_hook 00000000 l *UND* 00000000 hardware_init_hook
00000000 l *UND* 00000000 atexit 00000000 l *UND* 00000000 atexit
20000000 l .data 00000000 __preinit_array_end 20000040 l .data 00000000 __preinit_array_end
00000000 l *UND* 00000000 __stack 00000000 l *UND* 00000000 __stack
00000000 l *UND* 00000000 __sf_fake_stdout 00000000 l *UND* 00000000 __sf_fake_stdout
20000000 l .data 00000000 __init_array_start 20000040 l .data 00000000 __init_array_start
00000000 l *UND* 00000000 _exit 00000000 l *UND* 00000000 _exit
20000000 l .data 00000000 __preinit_array_start 20000040 l .data 00000000 __preinit_array_start
00009318 g F .text 0000000c __error__ 0000933c g F .text 0000000c __error__
00009298 g F .text 00000040 reset_handler 000091d8 g F .text 00000010 netdev_get_mac
000092b0 g F .text 00000040 reset_handler
00008d34 g F .text 00000008 SysCtlDelay 00008d34 g F .text 00000008 SysCtlDelay
20000100 g O .bss 00000002 uip_len 2000017c g O .bss 00000002 uip_len
20000090 g O .bss 00000006 uip_ethaddr 200000d8 g O .bss 00000006 uip_ethaddr
00009630 g F .text 0000005c uip_add32 0000977c g F .text 0000005c uip_add32
0000a72c g .text 00000000 _etext 0000b058 g .text 00000000 _etext
00008c94 g F .text 00000058 SysCtlPeripheralReset 00008c94 g F .text 00000058 SysCtlPeripheralReset
00008488 g F .text 00000024 GPIOPinWrite 00008488 g F .text 00000024 GPIOPinWrite
000091d0 g F .text 00000038 netdev_read 000091e8 g F .text 00000038 netdev_read
000097c0 g F .text 00000a9c uip_process 00009930 g F .text 00000bec uip_process
000095e4 g F .text 00000010 TimerISRHandler 00009730 g F .text 00000010 TimerISRHandler
20000104 g O .bss 00000004 uip_sappdata 0000aefe g F .text 00000016 memcpy
000090a4 g F .text 00000018 netdev_init 20000180 g O .bss 00000004 uip_sappdata
20000108 g O .bss 00000004 uip_acc32 000090ac g F .text 00000018 netdev_init
00009758 g F .text 00000020 uip_ipchksum 20000184 g O .bss 00000004 uip_acc32
000098c8 g F .text 00000020 uip_ipchksum
0000a51c g F .text 000000a8 uip_udp_new
00008650 g F .text 00000030 EthernetInitExpClk 00008650 g F .text 00000030 EthernetInitExpClk
00009718 g F .text 00000034 uip_listen 00009888 g F .text 00000034 uip_listen
00009208 g F .text 0000001c netdev_send 00009220 g F .text 0000001c netdev_send
000087cc g F .text 00000050 EthernetPacketPut 000087cc g F .text 00000050 EthernetPacketPut
00008cec g F .text 00000038 SysCtlPeripheralEnable 00008cec g F .text 00000038 SysCtlPeripheralEnable
2000010c g O .bss 00000001 uip_flags 20000188 g O .bss 00000001 uip_flags
0000a600 g F .text 00000000 _init 0000af24 g F .text 00000000 _init
00009388 g F .text 00000008 BootActivate 000093ac g F .text 00000008 BootActivate
00008d24 g F .text 00000010 SysCtlReset 00008d24 g F .text 00000010 SysCtlReset
2000078c g .bss 00000000 _ebss 2000084c g .bss 00000000 _ebss
0000ac04 g F .text 0000003c dhcpc_init
00000400 g *ABS* 00000000 __STACKSIZE__ 00000400 g *ABS* 00000000 __STACKSIZE__
00009324 g F .text 00000002 UnusedISR 00009348 g F .text 00000002 UnusedISR
00008778 g F .text 00000054 EthernetPacketGetNonBlocking 00008778 g F .text 00000054 EthernetPacketGetNonBlocking
00009224 g F .text 00000028 LedInit 0000923c g F .text 00000028 LedInit
00008514 g F .text 00000034 GPIOPinTypeEthernetLED 00008514 g F .text 00000034 GPIOPinTypeEthernetLED
000094cc g F .text 000000d8 NetTask 000095e4 g F .text 0000010c NetTask
2000018c g O .bss 00000004 uip_udp_conn
0000a9a4 g F .text 00000018 timer_expired
00000000 w *UND* 00000000 __deregister_frame_info 00000000 w *UND* 00000000 __deregister_frame_info
000090bc g F .text 00000114 netdev_init_mac 000090c4 g F .text 00000114 netdev_init_mac
00008a70 g F .text 0000002c UARTCharGetNonBlocking 00008a70 g F .text 0000002c UARTCharGetNonBlocking
20000008 g .bss 00000000 _bss 20000048 g .bss 00000000 _bss
000097b4 g F .text 0000000a uip_tcpchksum 00009924 g F .text 0000000a uip_tcpchksum
20000110 g O .bss 00000004 uip_appdata 20000190 g O .bss 00000004 uip_appdata
00008170 g F .text 00000020 SysTickPeriodSet 00008170 g F .text 00000020 SysTickPeriodSet
20000114 g O .bss 00000004 uip_conn 20000194 g O .bss 00000004 uip_conn
20000118 g O .bss 0000001e uip_conns 0000aee0 g F .text 0000001e memcmp
20000040 g .shared 00000000 __shared_end__
20000198 g O .bss 0000001e uip_conns
0000950c g F .text 0000002c SharedParamsWriteByIndex
00008854 g F .text 00000028 EthernetIntStatus 00008854 g F .text 00000028 EthernetIntStatus
0000a4a0 g F .text 00000160 uip_arp_out 0000a834 g F .text 00000160 uip_arp_out
000092fc g F .text 0000001c main 0000af14 g F .text 00000010 memset
00009314 g F .text 00000028 main
00008ea0 g F .text 00000204 SysCtlClockGet 00008ea0 g F .text 00000204 SysCtlClockGet
00008950 g F .text 00000038 UARTDisable 00008950 g F .text 00000038 UARTDisable
00008738 g F .text 00000040 EthernetEnable 00008738 g F .text 00000040 EthernetEnable
000095a4 g F .text 0000000c TimerSet 000096f0 g F .text 0000000c TimerSet
00009380 g F .text 00000008 BootComInit 000094dc g F .text 00000030 SharedParamsInit
0000a60c g F .text 00000000 _fini 000093a4 g F .text 00000008 BootComInit
0000a3c0 g F .text 000000e0 uip_arp_arpin 0000af30 g F .text 00000000 _fini
0000a754 g F .text 000000e0 uip_arp_arpin
000086d8 g F .text 00000060 EthernetMACAddrSet 000086d8 g F .text 00000060 EthernetMACAddrSet
0000a360 g F .text 00000060 uip_arp_timer 0000a6f4 g F .text 00000060 uip_arp_timer
20000138 g O .bss 00000002 uip_listenports 200001b8 g O .bss 00000002 uip_listenports
2000013c g O .bss 00000004 uip_draddr 200001bc g O .bss 00000004 uip_draddr
20000000 g .data 00000000 _data 20000040 g .data 00000000 _data
000088b0 g F .text 00000044 EthernetPHYRead 000088b0 g F .text 00000044 EthernetPHYRead
0000924c g F .text 0000004c LedToggle 00009264 g F .text 0000004c LedToggle
20000b8c g .bss 00000000 _estack 0000a994 g F .text 0000000e timer_set
20000c4c g .bss 00000000 _estack
00008680 g F .text 00000058 EthernetConfigSet 00008680 g F .text 00000058 EthernetConfigSet
20000008 g .data 00000000 _edata 20000048 g .data 00000000 _edata
0000974c g F .text 0000000a htons 000098bc g F .text 0000000a htons
0000aed8 g F .text 00000008 dhcpc_appcall
00008000 g O .text 000000f4 _vectab 00008000 g O .text 000000f4 _vectab
00008190 g F .text 00000068 FlashUserGet 00008190 g F .text 00000068 FlashUserGet
000084e0 g F .text 00000034 GPIOPinTypeUART 000084e0 g F .text 00000034 GPIOPinTypeUART
20000000 g .shared 00000000 __shared_start__
000084ac g F .text 00000034 GPIOPinTypeGPIOOutput 000084ac g F .text 00000034 GPIOPinTypeGPIOOutput
0000881c g F .text 00000038 EthernetIntDisable 0000881c g F .text 00000038 EthernetIntDisable
00009428 g F .text 00000008 BootComCheckActivationRequest 0000944c g F .text 00000008 BootComCheckActivationRequest
0000887c g F .text 00000034 EthernetIntClear 0000887c g F .text 00000034 EthernetIntClear
000096bc g F .text 0000005c uip_init 00009808 g F .text 00000080 uip_init
000090a4 g F .text 00000008 clock_time
000082d4 g F .text 00000060 GPIODirModeSet 000082d4 g F .text 00000060 GPIODirModeSet
2000078c g .bss 00000000 _stack 2000084c g .bss 00000000 _stack
20000140 g O .bss 00000004 uip_netmask 200001c0 g O .bss 00000004 uip_netmask
00008150 g F .text 00000010 SysTickEnable 00008150 g F .text 00000010 SysTickEnable
20000144 g O .bss 00000004 uip_hostaddr 200001c4 g O .bss 00000004 uip_hostaddr
000095d8 g F .text 0000000c TimerGet 00009724 g F .text 0000000c TimerGet
0000949c g F .text 00000030 NetApp 000095ac g F .text 00000038 NetApp
00000000 w *UND* 00000000 _Jv_RegisterClasses 00000000 w *UND* 00000000 _Jv_RegisterClasses
00008160 g F .text 00000010 SysTickIntEnable 00008160 g F .text 00000010 SysTickIntEnable
00008988 g F .text 000000e8 UARTConfigSetExpClk 00008988 g F .text 000000e8 UARTConfigSetExpClk
00009430 g F .text 0000006c NetInit 00009538 g F .text 00000074 NetInit
00008d3c g F .text 00000164 SysCtlClockSet 00008d3c g F .text 00000164 SysCtlClockSet
00008334 g F .text 00000154 GPIOPadConfigSet 00008334 g F .text 00000154 GPIOPadConfigSet
000095b0 g F .text 00000028 TimerInit 000096fc g F .text 00000028 TimerInit
00000000 w *UND* 00000000 __register_frame_info 00000000 w *UND* 00000000 __register_frame_info
20000148 g O .bss 00000642 uip_buf 200001c8 g O .bss 00000642 uip_buf
2000078a g O .bss 00000002 uip_slen 0000a5c4 g F .text 00000028 uip_send
0000ac40 g F .text 00000010 dhcpc_request
2000080a g O .bss 00000002 uip_slen
2000080c g O .bss 00000040 uip_udp_conns
00008920 g F .text 00000030 UARTEnable 00008920 g F .text 00000030 UARTEnable

View File

@ -36,6 +36,7 @@
#include "led.h" /* LED driver */ #include "led.h" /* LED driver */
#include "time.h" /* Timer driver */ #include "time.h" /* Timer driver */
#include "net.h" /* TCP/IP server application */ #include "net.h" /* TCP/IP server application */
#include "shared_params.h" /* Shared parameters header. */
#include "inc/hw_ints.h" #include "inc/hw_ints.h"
#include "inc/hw_memmap.h" #include "inc/hw_memmap.h"
#include "inc/hw_nvic.h" #include "inc/hw_nvic.h"

View File

@ -59,6 +59,10 @@
#define NETDEV_DEFAULT_MACADDR5 (0x45) #define NETDEV_DEFAULT_MACADDR5 (0x45)
/*---------------------------------------------------------------------------*/
static struct uip_eth_addr macAddress;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void netdev_init(void) void netdev_init(void)
{ {
@ -142,6 +146,18 @@ void netdev_init_mac(void)
} }
/*---------------------------------------------------------------------------*/
void netdev_get_mac(unsigned char * mac_addr)
{
mac_addr[0] = macAddress.addr[0];
mac_addr[1] = macAddress.addr[1];
mac_addr[2] = macAddress.addr[2];
mac_addr[3] = macAddress.addr[3];
mac_addr[4] = macAddress.addr[4];
mac_addr[5] = macAddress.addr[5];
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned int netdev_read(void) unsigned int netdev_read(void)
{ {

View File

@ -40,6 +40,7 @@
void netdev_init(void); void netdev_init(void);
void netdev_init_mac(void); void netdev_init_mac(void);
void netdev_get_mac(unsigned char * mac_addr);
unsigned int netdev_read(void); unsigned int netdev_read(void);
void netdev_send(void); void netdev_send(void);

View File

@ -98,6 +98,27 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_MAX_LISTENPORTS 1 #define UIP_CONF_MAX_LISTENPORTS 1
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 1
/**
* UDP Maximum Connections
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CONNS 1
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
/** /**
* uIP buffer size. * uIP buffer size.
* *
@ -119,20 +140,6 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_LOGGING 0 #define UIP_CONF_LOGGING 0
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 1
/** /**
* uIP statistics on or off * uIP statistics on or off
* *
@ -140,10 +147,12 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_STATISTICS 0 #define UIP_CONF_STATISTICS 0
/* Here we include the header file for the application(s) we use in /* Here we include the header file for the application(s) we use in
our project. */ our project. */
#include "boot.h" #include "header.h"
#include "net.h" #include "net.h"
#include "dhcpc.h"
#endif /* __UIP_CONF_H__ */ #endif /* __UIP_CONF_H__ */

View File

@ -48,10 +48,17 @@ int main(void)
{ {
/* initialize the microcontroller */ /* initialize the microcontroller */
Init(); Init();
/* initialize the shared parameters module */
SharedParamsInit();
/* initialize the network application */ /* initialize the network application */
NetInit(); NetInit();
/* initialize the bootloader interface */ /* initialize the bootloader interface */
BootComInit(); BootComInit();
/* the shared parameter at index 0 is used as a boolean flag to indicate if the
* bootloader should initialize the TCP/IP network stack. by default this flag
* should be reset.
*/
SharedParamsWriteByIndex(0, 0);
/* start the infinite program loop */ /* start the infinite program loop */
while (1) while (1)

View File

@ -68,6 +68,8 @@ PROJ_FILES += ../../../Source/third_party/uip/uip/uip_timer.h
PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.c PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.c
PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.h PROJ_FILES += ../../../Source/third_party/uip/uip/uiplib.h
PROJ_FILES += ../../../Source/third_party/uip/uip/uipopt.h PROJ_FILES += ../../../Source/third_party/uip/uip/uipopt.h
PROJ_FILES += ../../../Source/third_party/uip/apps/dhcpc/dhcpc.c
PROJ_FILES += ../../../Source/third_party/uip/apps/dhcpc/dhcpc.h
#|--------------------------------------------------------------------------------------| #|--------------------------------------------------------------------------------------|

View File

@ -1,13 +1,25 @@
MEMORY MEMORY
{ {
FLASH (rx) : ORIGIN = 0x00008000, LENGTH = 224K FLASH (rx) : ORIGIN = 0x00008000, LENGTH = 224K
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K SHARED (rwx) : ORIGIN = 0x20000000, LENGTH = 64
SRAM (rwx) : ORIGIN = 0x20000040, LENGTH = 64K - 64
} }
SECTIONS SECTIONS
{ {
__STACKSIZE__ = 1024; __STACKSIZE__ = 1024;
.shared (NOLOAD):
{
. = ALIGN(4);
__shared_start__ = .;
*(.shared)
*(.shared.*)
KEEP(*(.shared))
. = ALIGN(4);
__shared_end__ = .;
} > SHARED
.text : .text :
{ {
KEEP(*(.isr_vector)) KEEP(*(.isr_vector))

View File

@ -53,6 +53,10 @@
static unsigned long periodicTimerTimeOut; static unsigned long periodicTimerTimeOut;
/** \brief Holds the time out value of the uIP ARP timer. */ /** \brief Holds the time out value of the uIP ARP timer. */
static unsigned long ARPTimerTimeOut; static unsigned long ARPTimerTimeOut;
#if (BOOT_COM_NET_DHCP_ENABLE > 0)
/** \brief Holds the MAC address which is used by the DHCP client. */
static struct uip_eth_addr macAddress;
#endif
/************************************************************************************//** /************************************************************************************//**
@ -71,6 +75,7 @@ void NetInit(void)
ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS; ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS;
/* initialize the uIP TCP/IP stack. */ /* initialize the uIP TCP/IP stack. */
uip_init(); uip_init();
#if (BOOT_COM_NET_DHCP_ENABLE == 0)
/* set the IP address */ /* set the IP address */
uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2, uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2,
BOOT_COM_NET_IPADDR3); BOOT_COM_NET_IPADDR3);
@ -83,10 +88,28 @@ void NetInit(void)
uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2, uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2,
BOOT_COM_NET_GATEWAY3); BOOT_COM_NET_GATEWAY3);
uip_setdraddr(ipaddr); uip_setdraddr(ipaddr);
#else
/* set the IP address */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_sethostaddr(ipaddr);
/* set the network mask */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_setnetmask(ipaddr);
/* set the gateway address */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_setdraddr(ipaddr);
#endif
/* start listening on the configured port for XCP transfers on TCP/IP */ /* start listening on the configured port for XCP transfers on TCP/IP */
uip_listen(HTONS(BOOT_COM_NET_PORT)); uip_listen(HTONS(BOOT_COM_NET_PORT));
/* initialize the MAC and set the MAC address */ /* initialize the MAC and set the MAC address */
netdev_init_mac(); netdev_init_mac();
#if (BOOT_COM_NET_DHCP_ENABLE > 0)
/* initialize the DHCP client application and send the initial request. */
netdev_get_mac(&macAddress.addr[0]);
dhcpc_init(&macAddress.addr[0], 6);
dhcpc_request();
#endif
} /*** end of NetInit ***/ } /*** end of NetInit ***/
@ -117,6 +140,13 @@ void NetApp(void)
/* check if this was an XCP CONNECT command */ /* check if this was an XCP CONNECT command */
if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00)) if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00))
{ {
/* the shared parameter at index 0 is used as a boolean flag to indicate if the
* bootloader should initialize the TCP/IP network stack. we just received a
* firmware update request from the TCP/IP network and we are about to active
* the bootloader for a firmware update via TCP/IP. At this point we should
* set the flag to make sure the bootloader initializes its TCP/IP network stack.
*/
SharedParamsWriteByIndex(0, 1);
/* connection request received so start the bootloader */ /* connection request received so start the bootloader */
BootActivate(); BootActivate();
} }
@ -136,13 +166,13 @@ void NetTask(void)
/* check for an RX packet and read it. */ /* check for an RX packet and read it. */
packetLen = netdev_read(); packetLen = netdev_read();
if(packetLen > 0) if (packetLen > 0)
{ {
/* set uip_len for uIP stack usage */ /* set uip_len for uIP stack usage */
uip_len = (unsigned short)packetLen; uip_len = (unsigned short)packetLen;
/* process incoming IP packets here. */ /* process incoming IP packets here. */
if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP)) if (NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP))
{ {
uip_arp_ipin(); uip_arp_ipin();
uip_input(); uip_input();
@ -150,7 +180,7 @@ void NetTask(void)
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
*/ */
if(uip_len > 0) if (uip_len > 0)
{ {
uip_arp_out(); uip_arp_out();
netdev_send(); netdev_send();
@ -158,7 +188,7 @@ void NetTask(void)
} }
} }
/* process incoming ARP packets here. */ /* process incoming ARP packets here. */
else if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP)) else if (NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP))
{ {
uip_arp_arpin(); uip_arp_arpin();
@ -166,14 +196,14 @@ void NetTask(void)
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
*/ */
if(uip_len > 0) if (uip_len > 0)
{ {
netdev_send(); netdev_send();
uip_len = 0; uip_len = 0;
} }
} }
} }
/* process TCP/IP Periodic Timer here. */ /* process TCP/IP Periodic Timer here. */
if (TimerGet() >= periodicTimerTimeOut) if (TimerGet() >= periodicTimerTimeOut)
{ {
@ -181,6 +211,22 @@ void NetTask(void)
for (connection = 0; connection < UIP_CONNS; connection++) for (connection = 0; connection < UIP_CONNS; connection++)
{ {
uip_periodic(connection); uip_periodic(connection);
/* If the above function invocation resulted in data that
* should be sent out on the network, the global variable
* uip_len is set to a value > 0.
*/
if (uip_len > 0)
{
uip_arp_out();
netdev_send();
uip_len = 0;
}
}
#if UIP_UDP
for (connection = 0; connection < UIP_UDP_CONNS; connection++)
{
uip_udp_periodic(connection);
/* If the above function invocation resulted in data that /* If the above function invocation resulted in data that
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
@ -192,13 +238,14 @@ void NetTask(void)
uip_len = 0; uip_len = 0;
} }
} }
#endif
} }
/* process ARP Timer here. */ /* process ARP Timer here. */
if (TimerGet() >= ARPTimerTimeOut) if (TimerGet() >= ARPTimerTimeOut)
{ {
ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS; ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS;
uip_arp_timer(); uip_arp_timer();
} }
} /*** end of NetServerTask ***/ } /*** end of NetServerTask ***/

View File

@ -0,0 +1,301 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Prog/shared_params.c
* \brief Shared RAM parameters source file.
* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_GCC
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stddef.h> /* Standard definitions (NULL). */
#include "shared_params.h" /* Shared parameters header. */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Constant parameter buffer identifier. This value is always located as the
* start of the buffer to validate the the RAM contains valid shared parameters.
*/
#define SHARED_PARAMS_BUFFER_ID (0xCE42E7A2u)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Layout of the shared parameters RAM buffer. */
typedef struct t_shared_params_buffer
{
/** \brief Fixed buffer identifier to validate that the RAM contains valid shared
* parameters.
*/
uint32_t identifier;
/** \brief Array for the actual parameter data. */
uint8_t data[SHARED_PARAMS_CFG_BUFFER_DATA_LEN];
/** \brief Checksum value of all the bytes in the buffer, excluding this checksum
* value of obvious reasons. The checksum is calculated as the Two's
* complement of the sum of the bytes.
*/
uint16_t checksum;
} tSharedParamsBuffer;
/****************************************************************************************
* Global data declarations
****************************************************************************************/
/** \brief Declaration of the actual parameter buffer that this module manages.
* \warning For the shared RAM parameters to work properly for sharing information
* between the bootloader and user program, it is important that this
* variable is linked to the exact same RAM address in both the bootloader
* and the user program. Additionally, it should be configured such that the
* C-startup code does NOT zero its contents during system initialization. This
* is the code that runs in the reset event handler, before function main() is
* called.
* For GCC based embedded toolchains, the solution is to assign this variable
* to a custom section, in this case called ".shared". Then in the linker
* script, add the following to the SECTIONS:
*
* .shared (NOLOAD) :
* {
* . = ALIGN(4);
* _sshared = .;
* __shared_start__ = _sshared;
* *(.shared)
* *(.shared.*)
* KEEP(*(.shared))
* . = ALIGN(4);
* _eshared = .;
* __shared_end__ = _eshared;
* } >SHARED
*
* Next, add a new MEMORY entry for SHARED at the start of RAM and reduce
* the length of the remaining RAM:
*
* SHARED (xrw) : ORIGIN = 0x200000C0, LENGTH = 64
* RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 32K - 192 - 64
*
* Note that the previous example is for an STM32F0 microcontroller where
* the first 192 (0xC0) bytes in RAM are reserved for the user program
* vector table.
*
* \remark This same approach can be applied with other toolchains such as Keil MDK
* and IAR EWARM. Consult the compiler and linker user manuals of your
* toolchain to find out how to place a RAM variable at a fixed memory address
* and to prevent the C-startup code from zeroing its contents.
* Here are a few links to get you started:
* * IAR EWARM:
* https://www.iar.com/support/tech-notes/compiler/
* linker-error-for-absolute-located-variable/
* * Keil MDK:
* http://www.keil.com/support/docs/3480.htm
*/
static tSharedParamsBuffer sharedParamsBuffer __attribute__ ((section (".shared")));
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static bool SharedParamsValidateBuffer(void);
static void SharedParamsWriteChecksum(void);
static bool SharedParamsVerifyChecksum(void);
static uint16_t SharedParamsCalculateChecksum(void);
/************************************************************************************//**
** \brief Initializes the shared RAM parameters module.
** \return none.
**
****************************************************************************************/
void SharedParamsInit(void)
{
uint32_t byteIdx;
/* The shared parameter buffer does not get initialized by the C-startup code. Another
* previously running program could have initialized it, in which case it is ready
* for use and nothing more needs to be done.
*/
if (!SharedParamsValidateBuffer())
{
/* The shared parameter buffer was not yet initialized by a running program. This
* typically happens after a cold reset where the RAM contents were lost. In this
* case we need to explicitly configure and initialize it, since the C-startup code
* was configured to not do this.
*
* The initialization consists of setting the buffer identifier, zeroing the
* actual parameter data and updating the checksum at the end.
*/
sharedParamsBuffer.identifier = SHARED_PARAMS_BUFFER_ID;
for (byteIdx=0; byteIdx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
sharedParamsBuffer.data[byteIdx] = 0;
}
SharedParamsWriteChecksum();
}
} /*** end of SharedParamsInit ***/
/************************************************************************************//**
** \brief Reads a data byte from the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Pointer to where the read data value is stored.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) &&
(value != NULL) )
{
/* Read the value and update the result. */
*value = sharedParamsBuffer.data[idx];
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsReadByIndex ***/
/************************************************************************************//**
** \brief Writes a data byte to the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Value to write.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) )
{
/* Write the value. */
sharedParamsBuffer.data[idx] = value;
/* Update the checksum since the contents were just changed. */
SharedParamsWriteChecksum();
/* Update the result. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsWriteByIndex ***/
/************************************************************************************//**
** \brief Validates the shared parameter buffer contents by looking at the table
** identifier and verifying its checksum.
** \return True if successful, false otherwise.
**
****************************************************************************************/
static bool SharedParamsValidateBuffer(void)
{
bool result = false;
/* Perform validation. */
if ( (sharedParamsBuffer.identifier == SHARED_PARAMS_BUFFER_ID) &&
(SharedParamsVerifyChecksum()) )
{
/* The shared parameter buffer is valid, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsValitabeTable ***/
/************************************************************************************//**
** \brief Calculates and writes the checksum into the buffer.
** \return none.
**
****************************************************************************************/
static void SharedParamsWriteChecksum(void)
{
/* Calculate and write the checksum. */
sharedParamsBuffer.checksum = SharedParamsCalculateChecksum();
} /*** end of SharedParamsWriteChecksum ***/
/************************************************************************************//**
** \brief Calculates and verifies the checksum that is currently present in the
** buffer.
** \return True is the checksum is correct, false otherwise.
**
****************************************************************************************/
static bool SharedParamsVerifyChecksum(void)
{
bool result = false;
/* Calculate and verify the checksum. */
if (SharedParamsCalculateChecksum() == sharedParamsBuffer.checksum)
{
/* Checksum is correct, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsVerifyChecksum ***/
/************************************************************************************//**
** \brief Calculates and returns the checksum value for the current contents in the
** buffer. The checksum is calculated by taking the sum of all bytes in the
** parameter buffer (excluding the checksum at the end) and them taking the
** two's complement value of it.
** \return The calculated checksum value.
**
****************************************************************************************/
static uint16_t SharedParamsCalculateChecksum(void)
{
uint16_t result = 0;
uint32_t byteIdx;
/* Add the identifier bytes to the checksum. */
result += (uint8_t)sharedParamsBuffer.identifier;
result += (uint8_t)(sharedParamsBuffer.identifier >> 8u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 16u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 24u);
/* Loop through the parameter data array. */
for (byteIdx=0; byteIdx<SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
/* Add parameter data byte to the checksum. */
result += (uint8_t)sharedParamsBuffer.data[byteIdx];
}
/* Determine one's complement. */
result = ~result;
/* Determine two's complement. */
result += 1;
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsCalculateChecksum ***/
/*********************************** end of shared_params.c ****************************/

View File

@ -0,0 +1,57 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_GCC/Prog/shared_params.h
* \brief Shared RAM parameters header file.
* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_GCC
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef SHARED_PARAMS_H
#define SHARED_PARAMS_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* Standard integer types. */
#include <stdbool.h> /* Standard boolean types. */
/****************************************************************************************
* Configuration macros
****************************************************************************************/
/** \brief Configuration macro for specifying the size of the data inside the parameter
* buffer. This is the length in bytes of the actual parameter data, so
* excluding the bufferId and checksum.
*/
#define SHARED_PARAMS_CFG_BUFFER_DATA_LEN (56u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void SharedParamsInit(void);
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value);
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value);
#endif /* SHARED_PARAMS_H */
/*********************************** end of shared_params.h ****************************/

View File

@ -1,10 +1,12 @@
/*-Specials-*/ /*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x00000000; define symbol __ICFEDIT_intvec_start__ = 0x00000000;
/*-Memory Regions-*/ /*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000; define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x00007FFF; define symbol __ICFEDIT_region_ROM_end__ = 0x00007FFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_SHARED_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_SHARED_end__ = 0x2000003F;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000040;
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF;
/*-Sizes-*/ /*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x800; define symbol __ICFEDIT_size_cstack__ = 0x800;
define symbol __ICFEDIT_size_heap__ = 0x400; define symbol __ICFEDIT_size_heap__ = 0x400;
@ -20,6 +22,8 @@ initialize by copy { readwrite };
do not initialize { section .noinit }; do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__ICFEDIT_region_SHARED_start__ { readwrite section .shared };
place in ROM_region { readonly }; place in ROM_region { readonly };
place in RAM_region { readwrite, place in RAM_region { readwrite,
block CSTACK, block HEAP }; block CSTACK, block HEAP };

View File

@ -50,7 +50,7 @@
/** \brief Motorola or Intel style byte ordering. */ /** \brief Motorola or Intel style byte ordering. */
#define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) #define BOOT_CPU_BYTE_ORDER_MOTOROLA (0)
/** \brief Enable/disable hook function call right before user program start. */ /** \brief Enable/disable hook function call right before user program start. */
#define BOOT_CPU_USER_PROGRAM_START_HOOK (0) #define BOOT_CPU_USER_PROGRAM_START_HOOK (1)
/**************************************************************************************** /****************************************************************************************
@ -80,72 +80,56 @@
* the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a
* message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA
* and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured
* with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configured with the
* BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros * macro BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros
* BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server
* listen on for connections is configured with BOOT_COM_NET_PORT. * listen on for connections is configured with BOOT_COM_NET_PORT.
* In case the network switch/router supports a DHCP server, you can set configuration
* macro BOOT_COM_NET_DHCP_ENABLE to 1 to enable the DHCP client. In this case the
* DHCP client handles the automatic IP address assignment. In this case the macros for
* configuring the IP address, network mask and gateway address are no longer needed.
*/ */
/** \brief Enable/disable the NET transport layer. */ /** \brief Enable/disable the NET transport layer. */
#define BOOT_COM_NET_ENABLE (1) #define BOOT_COM_NET_ENABLE (1)
/** \brief Configure number of bytes in the target->host data packet. */ /** \brief Configure number of bytes in the target->host data packet. */
#define BOOT_COM_NET_TX_MAX_DATA (64) #define BOOT_COM_NET_TX_MAX_DATA (64)
/** \brief Configure number of bytes in the host->target data packet. */ /** \brief Configure number of bytes in the host->target data packet. */
#define BOOT_COM_NET_RX_MAX_DATA (64) #define BOOT_COM_NET_RX_MAX_DATA (64)
/** \brief Configure the port that the TCP/IP server listens on */ /** \brief Configure the port that the TCP/IP server listens on */
#define BOOT_COM_NET_PORT (1000) #define BOOT_COM_NET_PORT (1000)
/** \brief Enable/disable DHCP client for automatically obtaining an IP address. */
#define BOOT_COM_NET_DHCP_ENABLE (1)
/** \brief Configure the 1st byte of the IP address */ /** \brief Configure the 1st byte of the IP address */
#define BOOT_COM_NET_IPADDR0 (169) #define BOOT_COM_NET_IPADDR0 (192)
/** \brief Configure the 2nd byte of the IP address */ /** \brief Configure the 2nd byte of the IP address */
#define BOOT_COM_NET_IPADDR1 (254) #define BOOT_COM_NET_IPADDR1 (168)
/** \brief Configure the 3rd byte of the IP address */ /** \brief Configure the 3rd byte of the IP address */
#define BOOT_COM_NET_IPADDR2 (19) #define BOOT_COM_NET_IPADDR2 (178)
/** \brief Configure the 4th byte of the IP address */ /** \brief Configure the 4th byte of the IP address */
#define BOOT_COM_NET_IPADDR3 (63) #define BOOT_COM_NET_IPADDR3 (50)
/** \brief Configure the 1st byte of the network mask */ /** \brief Configure the 1st byte of the network mask */
#define BOOT_COM_NET_NETMASK0 (255) #define BOOT_COM_NET_NETMASK0 (255)
/** \brief Configure the 2nd byte of the network mask */ /** \brief Configure the 2nd byte of the network mask */
#define BOOT_COM_NET_NETMASK1 (255) #define BOOT_COM_NET_NETMASK1 (255)
/** \brief Configure the 3rd byte of the network mask */ /** \brief Configure the 3rd byte of the network mask */
#define BOOT_COM_NET_NETMASK2 (0) #define BOOT_COM_NET_NETMASK2 (255)
/** \brief Configure the 4th byte of the network mask */ /** \brief Configure the 4th byte of the network mask */
#define BOOT_COM_NET_NETMASK3 (0) #define BOOT_COM_NET_NETMASK3 (0)
/** \brief Configure the 1st byte of the gateway address */ /** \brief Configure the 1st byte of the gateway address */
#define BOOT_COM_NET_GATEWAY0 (169) #define BOOT_COM_NET_GATEWAY0 (192)
/** \brief Configure the 2nd byte of the gateway address */ /** \brief Configure the 2nd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY1 (254) #define BOOT_COM_NET_GATEWAY1 (168)
/** \brief Configure the 3rd byte of the gateway address */ /** \brief Configure the 3rd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY2 (19) #define BOOT_COM_NET_GATEWAY2 (178)
/** \brief Configure the 4th byte of the gateway address */ /** \brief Configure the 4th byte of the gateway address */
#define BOOT_COM_NET_GATEWAY3 (1) #define BOOT_COM_NET_GATEWAY3 (1)
/** \brief Enable/disable a hook function that is called when the IP address is about /** \brief Enable/disable the deferred initialization mechanism. When enabled, the
* to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. * communication interface is only initialized when: (a) no valid user program
* is detected, or (b) when CpuUserProgramStartHook() returns BLT_FALSE. Your
* bootloader application can explicitly initialize the communication interface
* by calling ComDeferredInit().
*/ */
#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) #define BOOT_COM_NET_DEFERRED_INIT_ENABLE (1)
/** \brief Enable/disable a hook function that is called when the netmask is about
* to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values.
*/
#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0)
/** \brief Enable/disable a hook function that is called when the gateway address is
* about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx
* values.
*/
#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_NET_ENABLE > 0)
/* Override the default time that the backdoor is open if firmware updates via TCP/IP
* are supported. in this case a reactivation of the bootloader results in a re-
* initialization of the ethernet MAC. when directly connected to the ethernet port of
* a PC this will go relatively fast (depending on what MS Windows is being used), but
* when connected to the network via a router this can take several seconds. feel free to
* shorten/lengthen this time for finetuning. the only downside of a long backdoor open
* time is that the starting of the user program will also be delayed for this time.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (10000)
#endif
/**************************************************************************************** /****************************************************************************************

View File

@ -30,6 +30,8 @@
* Include files * Include files
****************************************************************************************/ ****************************************************************************************/
#include "boot.h" /* bootloader generic header */ #include "boot.h" /* bootloader generic header */
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#if (BOOT_FILE_LOGGING_ENABLE > 0) #if (BOOT_FILE_LOGGING_ENABLE > 0)
#include "inc/hw_memmap.h" #include "inc/hw_memmap.h"
#include "inc/hw_types.h" #include "inc/hw_types.h"
@ -81,6 +83,11 @@ blt_bool BackDoorEntryHook(void)
****************************************************************************************/ ****************************************************************************************/
blt_bool CpuUserProgramStartHook(void) blt_bool CpuUserProgramStartHook(void)
{ {
/* do not start the user program if the select pushbutton is pressed */
if (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_1) == 0)
{
return BLT_FALSE;
}
/* okay to start the user program */ /* okay to start the user program */
return BLT_TRUE; return BLT_TRUE;
} /*** end of CpuUserProgramStartHook ***/ } /*** end of CpuUserProgramStartHook ***/
@ -193,79 +200,6 @@ blt_bool NvmWriteChecksumHook(void)
#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */ #endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */
/****************************************************************************************
* N E T W O R K I N T E R F A C E H O O K F U N C T I O N S
****************************************************************************************/
#if (BOOT_COM_NET_IPADDR_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the IP address is about to be configured.
** \param ipAddrArray 4-byte array where the IP address should be stored.
** \return none.
**
****************************************************************************************/
void NetIpAddressHook(blt_int8u *ipAddrArray)
{
/* This hook function allows a dynamic configuration of the IP address. This could for
* example be used if the bootloader is activated from a running user program and
* should have the same IP address as the user program. This IP address could be stored
* at a fixed location in RAM which can be read here. For now the example implemen-
* tation simply configures the bootloader's default IP address.
*/
ipAddrArray[0] = BOOT_COM_NET_IPADDR0;
ipAddrArray[1] = BOOT_COM_NET_IPADDR1;
ipAddrArray[2] = BOOT_COM_NET_IPADDR2;
ipAddrArray[3] = BOOT_COM_NET_IPADDR3;
} /*** end of NetIpAddressHook ***/
#endif /* BOOT_COM_NET_IPADDR_HOOK_ENABLE > 0 */
#if (BOOT_COM_NET_NETMASK_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the network mask is about to be configured.
** \param netMaskArray 4-byte array where the network mask should be stored.
** \return none.
**
****************************************************************************************/
void NetNetworkMaskHook(blt_int8u *netMaskArray)
{
/* This hook function allows a dynamic configuration of the network mask. This could
* for example be used if the bootloader is activated from a running user program and
* should have the same network mask as the user program. This network mask could be
* stored at a fixed location in RAM which can be read here. For now the example
* implementation simply configures the bootloader's default network mask.
*/
netMaskArray[0] = BOOT_COM_NET_NETMASK0;
netMaskArray[1] = BOOT_COM_NET_NETMASK1;
netMaskArray[2] = BOOT_COM_NET_NETMASK2;
netMaskArray[3] = BOOT_COM_NET_NETMASK3;
} /*** end of NetNetworkMaskHook ***/
#endif /* BOOT_COM_NET_NETMASK_HOOK_ENABLE > 0 */
#if (BOOT_COM_NET_GATEWAY_HOOK_ENABLE > 0)
/************************************************************************************//**
** \brief Callback that gets called when the gateway address is about to be
** configured.
** \param gatewayAddrArray 4-byte array where the gateway address should be stored.
** \return none.
**
****************************************************************************************/
void NetGatewayAddressHook(blt_int8u *gatewayAddrArray)
{
/* This hook function allows a dynamic configuration of the network mask. This could
* for example be used if the bootloader is activated from a running user program and
* should have the same network mask as the user program. This network mask could be
* stored at a fixed location in RAM which can be read here. For now the example
* implementation simply configures the bootloader's default network mask.
*/
gatewayAddrArray[0] = BOOT_COM_NET_GATEWAY0;
gatewayAddrArray[1] = BOOT_COM_NET_GATEWAY1;
gatewayAddrArray[2] = BOOT_COM_NET_GATEWAY2;
gatewayAddrArray[3] = BOOT_COM_NET_GATEWAY3;
} /*** end of NetGatewayAddressHook ***/
#endif /* BOOT_COM_NET_GATEWAY_HOOK_ENABLE > 0 */
/**************************************************************************************** /****************************************************************************************
* W A T C H D O G D R I V E R H O O K F U N C T I O N S * W A T C H D O G D R I V E R H O O K F U N C T I O N S
****************************************************************************************/ ****************************************************************************************/

File diff suppressed because it is too large Load Diff

View File

@ -247,7 +247,7 @@
<option> <option>
<name>CCAllowList</name> <name>CCAllowList</name>
<version>1</version> <version>1</version>
<state>00000000</state> <state>11111110</state>
</option> </option>
<option> <option>
<name>CCDebugInfo</name> <name>CCDebugInfo</name>
@ -318,7 +318,7 @@
<state>$PROJ_DIR$\..\..\..\..\Source</state> <state>$PROJ_DIR$\..\..\..\..\Source</state>
<state>$PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src</state> <state>$PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src</state>
<state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip</state> <state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip</state>
<state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\hello-world</state> <state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\dhcpc</state>
<state>$PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S</state> <state>$PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S</state>
<state>$PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR</state> <state>$PROJ_DIR$\..\..\..\..\Source\ARMCM3_LM3S\IAR</state>
<state>$PROJ_DIR$\..</state> <state>$PROJ_DIR$\..</state>
@ -346,7 +346,7 @@
</option> </option>
<option> <option>
<name>CCOptLevel</name> <name>CCOptLevel</name>
<state>1</state> <state>3</state>
</option> </option>
<option> <option>
<name>CCOptStrategy</name> <name>CCOptStrategy</name>
@ -355,7 +355,7 @@
</option> </option>
<option> <option>
<name>CCOptLevelSlave</name> <name>CCOptLevelSlave</name>
<state>1</state> <state>3</state>
</option> </option>
<option> <option>
<name>CompilerMisraRules98</name> <name>CompilerMisraRules98</name>
@ -2074,6 +2074,12 @@
<file> <file>
<name>$PROJ_DIR$\..\main.c</name> <name>$PROJ_DIR$\..\main.c</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\shared_params.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\shared_params.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\vectors.c</name> <name>$PROJ_DIR$\..\vectors.c</name>
</file> </file>
@ -2135,6 +2141,12 @@
<file> <file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h</name> <name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\dhcpc\dhcpc.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\dhcpc\dhcpc.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc-addrlabels.h</name> <name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc-addrlabels.h</name>
</file> </file>

View File

@ -34,12 +34,12 @@
<PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ShowCodeCoverage>0</ShowCodeCoverage><ShowInstrProfiling>0</ShowInstrProfiling></Disassembly> <PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><ShowCodeCoverage>0</ShowCodeCoverage><ShowInstrProfiling>0</ShowInstrProfiling></Disassembly>
<WATCH_1><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><expressions><item>data</item><item>s-&gt;dto_data</item><item/></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>147</item><item>150</item><item>100</item><item>174</item></col-widths></WATCH_1><Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><STACK_1><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><stack>CSTACK</stack><width>4</width><vars>1</vars><offset>0</offset><col-names><item>Data</item><item>Frame</item><item>Location</item><item>Type</item><item>Value</item><item>Variable</item></col-names><col-widths><item>100</item><item>100</item><item>100</item><item>100</item><item>100</item><item>100</item></col-widths></STACK_1><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory></Static> <WATCH_1><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><expressions><item></item></expressions><col-names><item>Expression</item><item>Location</item><item>Type</item><item>Value</item></col-names><col-widths><item>147</item><item>150</item><item>100</item><item>289</item></col-widths></WATCH_1><Register><PreferedWindows><Position>2</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></Register><STACK_1><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><stack>CSTACK</stack><width>4</width><vars>1</vars><offset>0</offset><col-names><item>Data</item><item>Frame</item><item>Location</item><item>Type</item><item>Value</item><item>Variable</item></col-names><col-widths><item>100</item><item>100</item><item>100</item><item>100</item><item>100</item><item>100</item></col-widths></STACK_1><Memory><PreferedWindows><Position>3</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows><FindDirection>1</FindDirection><MemGotoHistory><item>0x20001ec8</item></MemGotoHistory><FindAsHex>0</FindAsHex></Memory><CallStack><col-names><item>Frame</item><item>_I0</item></col-names><col-widths><item>3500</item><item>20</item></col-widths><PreferedWindows><Position>1</Position><ScreenPosX>0</ScreenPosX><ScreenPosY>0</ScreenPosY><Windows/></PreferedWindows></CallStack></Static>
<Windows> <Windows>
<Wnd0> <Wnd1>
<Tabs> <Tabs>
<Tab> <Tab>
<Identity>TabID-4214-26312</Identity> <Identity>TabID-4214-26312</Identity>
@ -51,20 +51,20 @@
</Tab> </Tab>
</Tabs> </Tabs>
<SelectedTab>0</SelectedTab></Wnd0><Wnd1><Tabs><Tab><Identity>TabID-14429-10902</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd1><Wnd4><Tabs><Tab><Identity>TabID-29443-18340</Identity><TabName>Disassembly</TabName><Factory>Disassembly</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd4></Windows> <SelectedTab>0</SelectedTab></Wnd1><Wnd4><Tabs><Tab><Identity>TabID-14429-10902</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd4><Wnd5><Tabs><Tab><Identity>TabID-21835-3732</Identity><TabName>Watch 1</TabName><Factory>WATCH_1</Factory></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd5></Windows>
<Editor> <Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\blt_conf.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>75</YPos2><SelStart2>5273</SelStart2><SelEnd2>5273</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>19</YPos2><SelStart2>2788</SelStart2><SelEnd2>2788</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\lib\fatfs\mmc.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>532</YPos2><SelStart2>17458</SelStart2><SelEnd2>17458</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>5144</YPos2><SelStart2>174744</SelStart2><SelEnd2>174744</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>977</SelStart2><SelEnd2>977</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\lib\driverlib\ethernet.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>1163</YPos2><SelStart2>43132</SelStart2><SelEnd2>43132</SelEnd2></Tab><ActiveTab>5</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor> <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\blt_conf.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>75</YPos2><SelStart2>5274</SelStart2><SelEnd2>5274</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>36</YPos2><SelStart2>2879</SelStart2><SelEnd2>2879</SelEnd2></Tab><ActiveTab>1</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\com.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>102</YPos2><SelStart2>5310</SelStart2><SelEnd2>5310</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\net.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>164</YPos2><SelStart2>7862</SelStart2><SelEnd2>7862</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\ARMCM3_LM3S\cpu.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>63</YPos2><SelStart2>3699</SelStart2><SelEnd2>3699</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Positions> <Positions>
<Top><Row0><Sizes><Toolbar-04DB1F58><key>iaridepm.enu1</key></Toolbar-04DB1F58></Sizes></Row0><Row1><Sizes><Toolbar-0E9D39C0><key>debuggergui.enu1</key></Toolbar-0E9D39C0></Sizes></Row1></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>740</Bottom><Right>285</Right><x>-2</x><y>-2</y><xscreen>240</xscreen><yscreen>243</yscreen><sizeHorzCX>125000</sizeHorzCX><sizeHorzCY>241311</sizeHorzCY><sizeVertCX>149479</sizeVertCX><sizeVertCY>736842</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>740</Bottom><Right>198</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>104167</sizeHorzCX><sizeHorzCY>198610</sizeHorzCY><sizeVertCX>104167</sizeVertCX><sizeVertCY>736842</sizeVertCY></Rect></Wnd4></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1922</Right><x>-2</x><y>-2</y><xscreen>1924</xscreen><yscreen>200</yscreen><sizeHorzCX>1002083</sizeHorzCX><sizeHorzCY>198610</sizeHorzCY><sizeVertCX>104167</sizeVertCX><sizeVertCY>198610</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions> <Top><Row0><Sizes><Toolbar-049D4890><key>iaridepm.enu1</key></Toolbar-049D4890></Sizes></Row0><Row1><Sizes><Toolbar-0DDA0508><key>debuggergui.enu1</key></Toolbar-0DDA0508></Sizes></Row1></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>740</Bottom><Right>285</Right><x>-2</x><y>-2</y><xscreen>240</xscreen><yscreen>243</yscreen><sizeHorzCX>125000</sizeHorzCX><sizeHorzCY>241311</sizeHorzCY><sizeVertCX>149479</sizeVertCX><sizeVertCY>736842</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes><Wnd5><Rect><Top>-2</Top><Left>-2</Left><Bottom>740</Bottom><Right>444</Right><x>-2</x><y>-2</y><xscreen>200</xscreen><yscreen>200</yscreen><sizeHorzCX>104167</sizeHorzCX><sizeHorzCY>198610</sizeHorzCY><sizeVertCX>232292</sizeVertCX><sizeVertCY>736842</sizeVertCY></Rect></Wnd5></Sizes></Row0></Right><Bottom><Row0><Sizes><Wnd4><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1922</Right><x>-2</x><y>-2</y><xscreen>1924</xscreen><yscreen>200</yscreen><sizeHorzCX>1002083</sizeHorzCX><sizeHorzCY>198610</sizeHorzCY><sizeVertCX>104167</sizeVertCX><sizeVertCY>198610</sizeVertCY></Rect></Wnd4></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
</Desktop> </Desktop>
</Project> </Project>

View File

@ -9,7 +9,7 @@ TriggerName=main
LimitSize=0 LimitSize=0
ByteLimit=50 ByteLimit=50
[DebugChecksum] [DebugChecksum]
Checksum=-1582861970 Checksum=2100562844
[Exceptions] [Exceptions]
StopOnUncaught=_ 0 StopOnUncaught=_ 0
StopOnThrow=_ 0 StopOnThrow=_ 0
@ -19,11 +19,9 @@ ShowArgs=0
MixedMode=1 MixedMode=1
[LMIFTDIDriver] [LMIFTDIDriver]
LMI_ResetMode=0x00000000 LMI_ResetMode=0x00000000
LMIFTDIserialNo=04110716A LMIFTDIserialNo=04110450A
LMIFTDIfoundProbes= LMIFTDIfoundProbes=
LMI_LeaveTargetRunning=0x00000000 LMI_LeaveTargetRunning=0x00000000
[watch_formats]
Fmt0={W}0:test_address 4 0
[CallStackLog] [CallStackLog]
Enabled=0 Enabled=0
[DriverProfiling] [DriverProfiling]
@ -32,6 +30,9 @@ Mode=0
Graph=0 Graph=0
Symbiont=0 Symbiont=0
Exclusions= Exclusions=
[watch_formats]
Fmt0={W}0:test_address 4 0
Fmt1={W}1:ulBase 4 0
[Log file] [Log file]
LoggingEnabled=_ 0 LoggingEnabled=_ 0
LogFile=_ "" LogFile=_ ""
@ -42,7 +43,8 @@ LogFile=_ ""
[Disassemble mode] [Disassemble mode]
mode=0 mode=0
[Breakpoints] [Breakpoints]
Count=0 Bp0=_ "STD_CODE" "{$PROJ_DIR$\..\..\..\..\Source\net.c}.300.7" 0 0 0 0 "" 0 ""
Count=1
[Aliases] [Aliases]
Count=0 Count=0
SuppressDialog=0 SuppressDialog=0

View File

@ -25,7 +25,7 @@
<Factory>Workspace</Factory> <Factory>Workspace</Factory>
<Session> <Session>
<NodeDict><ExpandedNode>lm3s6965</ExpandedNode><ExpandedNode>lm3s6965/Boot</ExpandedNode><ExpandedNode>lm3s6965/Output</ExpandedNode><ExpandedNode>lm3s6965/Source</ExpandedNode><ExpandedNode>lm3s6965/Source/ARMCM3_LM3S</ExpandedNode><ExpandedNode>lm3s6965/Source/ARMCM3_LM3S/IAR</ExpandedNode><ExpandedNode>lm3s6965/Source/fatfs</ExpandedNode><ExpandedNode>lm3s6965/Source/third_party</ExpandedNode><ExpandedNode>lm3s6965/Source/third_party/fatfs</ExpandedNode></NodeDict></Session> <NodeDict><ExpandedNode>lm3s6965</ExpandedNode><ExpandedNode>lm3s6965/Boot</ExpandedNode><ExpandedNode>lm3s6965/Output</ExpandedNode><ExpandedNode>lm3s6965/Source</ExpandedNode><ExpandedNode>lm3s6965/Source/ARMCM3_LM3S</ExpandedNode><ExpandedNode>lm3s6965/Source/ARMCM3_LM3S/IAR</ExpandedNode><ExpandedNode>lm3s6965/Source/fatfs</ExpandedNode><ExpandedNode>lm3s6965/Source/third_party</ExpandedNode><ExpandedNode>lm3s6965/Source/third_party/uip</ExpandedNode></NodeDict></Session>
</Tab> </Tab>
</Tabs> </Tabs>
@ -35,14 +35,14 @@
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\blt_conf.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>75</YPos2><SelStart2>5273</SelStart2><SelEnd2>5273</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>19</YPos2><SelStart2>2788</SelStart2><SelEnd2>2788</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\lib\fatfs\mmc.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>532</YPos2><SelStart2>17458</SelStart2><SelEnd2>17458</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>5144</YPos2><SelStart2>174744</SelStart2><SelEnd2>174744</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>0</YPos2><SelStart2>977</SelStart2><SelEnd2>977</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\lib\driverlib\ethernet.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>1163</YPos2><SelStart2>43132</SelStart2><SelEnd2>43132</SelEnd2></Tab><ActiveTab>5</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor> <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\blt_conf.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>75</YPos2><SelStart2>5274</SelStart2><SelEnd2>5274</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>36</YPos2><SelStart2>2624</SelStart2><SelEnd2>2624</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\hooks.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>51</YPos2><SelStart2>3539</SelStart2><SelEnd2>3539</SelEnd2></Tab><ActiveTab>2</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Positions> <Positions>
<Top><Row0><Sizes><Toolbar-04DB1F58><key>iaridepm.enu1</key></Toolbar-04DB1F58></Sizes></Row0><Row1><Sizes/></Row1><Row2><Sizes/></Row2></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>463</Bottom><Right>467</Right><x>-2</x><y>-2</y><xscreen>372</xscreen><yscreen>353</yscreen><sizeHorzCX>193750</sizeHorzCX><sizeHorzCY>350546</sizeHorzCY><sizeVertCX>244271</sizeVertCX><sizeVertCY>461768</sizeVertCY></Rect></Wnd0><Wnd3><Rect><Top>0</Top><Left>0</Left><Bottom>1817980462</Bottom><Right>1545884233</Right><x>-2</x><y>461</y><xscreen>258</xscreen><yscreen>237</yscreen><sizeHorzCX>134375</sizeHorzCX><sizeHorzCY>235353</sizeHorzCY><sizeVertCX>244271</sizeVertCX><sizeVertCY>497517</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes/></Row0></Bottom><Float><Sizes/></Float></Positions> <Top><Row0><Sizes><Toolbar-049D4890><key>iaridepm.enu1</key></Toolbar-049D4890></Sizes></Row0><Row1><Sizes/></Row1><Row2><Sizes/></Row2></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>463</Bottom><Right>467</Right><x>-2</x><y>-2</y><xscreen>372</xscreen><yscreen>353</yscreen><sizeHorzCX>193750</sizeHorzCX><sizeHorzCY>350546</sizeHorzCY><sizeVertCX>244271</sizeVertCX><sizeVertCY>461768</sizeVertCY></Rect></Wnd0><Wnd3><Rect><Top>0</Top><Left>0</Left><Bottom>0</Bottom><Right>7</Right><x>-2</x><y>461</y><xscreen>258</xscreen><yscreen>237</yscreen><sizeHorzCX>134375</sizeHorzCX><sizeHorzCY>235353</sizeHorzCY><sizeVertCX>244271</sizeVertCX><sizeVertCY>497517</sizeVertCY></Rect></Wnd3></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes/></Row0></Bottom><Float><Sizes/></Float></Positions>
</Desktop> </Desktop>
</Workspace> </Workspace>

View File

@ -59,6 +59,10 @@
#define NETDEV_DEFAULT_MACADDR5 (0x45) #define NETDEV_DEFAULT_MACADDR5 (0x45)
/*---------------------------------------------------------------------------*/
static struct uip_eth_addr macAddress;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void netdev_init(void) void netdev_init(void)
{ {
@ -142,6 +146,18 @@ void netdev_init_mac(void)
} }
/*---------------------------------------------------------------------------*/
void netdev_get_mac(unsigned char * mac_addr)
{
mac_addr[0] = macAddress.addr[0];
mac_addr[1] = macAddress.addr[1];
mac_addr[2] = macAddress.addr[2];
mac_addr[3] = macAddress.addr[3];
mac_addr[4] = macAddress.addr[4];
mac_addr[5] = macAddress.addr[5];
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned int netdev_read(void) unsigned int netdev_read(void)
{ {

View File

@ -40,6 +40,7 @@
void netdev_init(void); void netdev_init(void);
void netdev_init_mac(void); void netdev_init_mac(void);
void netdev_get_mac(unsigned char * mac_addr);
unsigned int netdev_read(void); unsigned int netdev_read(void);
void netdev_send(void); void netdev_send(void);

View File

@ -98,6 +98,27 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_MAX_LISTENPORTS 1 #define UIP_CONF_MAX_LISTENPORTS 1
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 1
/**
* UDP Maximum Connections
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CONNS 1
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
/** /**
* uIP buffer size. * uIP buffer size.
* *
@ -119,20 +140,6 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_LOGGING 0 #define UIP_CONF_LOGGING 0
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 1
/** /**
* uIP statistics on or off * uIP statistics on or off
* *
@ -140,10 +147,12 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_STATISTICS 0 #define UIP_CONF_STATISTICS 0
/* Here we include the header file for the application(s) we use in /* Here we include the header file for the application(s) we use in
our project. */ our project. */
#include "boot.h" #include "boot.h"
#include "net.h" #include "net.h"
#include "dhcpc.h"
#endif /* __UIP_CONF_H__ */ #endif /* __UIP_CONF_H__ */

View File

@ -40,6 +40,7 @@
#if (BOOT_FILE_LOGGING_ENABLE > 0) #if (BOOT_FILE_LOGGING_ENABLE > 0)
#include "driverlib/uartlib.h" #include "driverlib/uartlib.h"
#endif #endif
#include "shared_params.h" /* Shared parameters header */
/**************************************************************************************** /****************************************************************************************
* Function prototypes * Function prototypes
@ -55,11 +56,44 @@ static void Init(void);
****************************************************************************************/ ****************************************************************************************/
void main(void) void main(void)
{ {
blt_int8u deferredInitRequestFlag = 0;
/* initialize the microcontroller */ /* initialize the microcontroller */
Init(); Init();
/* initialize the shared parameters module */
SharedParamsInit();
/* initialize the bootloader */ /* initialize the bootloader */
BootInit(); BootInit();
#if (BOOT_COM_DEFERRED_INIT_ENABLE == 1)
/* the bootloader is configured to NOT initialize the TCP/IP network stack by default
* to bypass unnecessary delay times before starting the user program. the TCP/IP net-
* work tack is now only initialized when: (a) no valid user program is detected, or
* (b) a forced backdoor entry occurred (CpuUserProgramStartHook() returned BLT_FALSE).
*
* these demo bootloader and user programs have one extra feature implemented for
* demonstration purposes. the demo user program can detect firmware update requests
* from the TCP/IP network in which case it activates the bootloader. But...the
* TCP/IP network stack will not be initialized in this situation. for this reason
* the shared parameter module was integrated in both the bootloader and user program.
* more information about the shared parameter module can be found here:
* https://www.feaser.com/en/blog/?p=216
*
* the shared parameter at the first index (0) contains a flag. this flag is set to
* 1, right before the user program activates this bootloader, to explicitly request
* the bootloader to initialize the TCP/IP network stack. this makes it possible for
* a firmware update to proceed. the code here reads out this flag and performs the
* TCP/IP network stack initialization when requested.
*/
SharedParamsReadByIndex(0, &deferredInitRequestFlag);
if (deferredInitRequestFlag == 1)
{
/* explicitly initialize all communication interface for which the deferred
* initialization feature was enabled.
*/
ComDeferredInit();
}
#endif
/* start the infinite program loop */ /* start the infinite program loop */
while (1) while (1)
{ {
@ -78,6 +112,14 @@ static void Init(void)
{ {
/* set the clocking to run at 50MHz from the PLL */ /* set the clocking to run at 50MHz from the PLL */
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ); SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ);
/* initialize the status button as a digital input. it is used to override the
* starting of the user program.
*/
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
#if (BOOT_COM_UART_ENABLE > 0) #if (BOOT_COM_UART_ENABLE > 0)
#if (BOOT_COM_UART_CHANNEL_INDEX == 0) #if (BOOT_COM_UART_CHANNEL_INDEX == 0)
/* enable and configure UART0 related peripherals and pins */ /* enable and configure UART0 related peripherals and pins */

View File

@ -0,0 +1,301 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/shared_params.c
* \brief Shared RAM parameters source file.
* \ingroup Boot_ARMCM3_LM3S_EK_LM3S6965_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stddef.h> /* Standard definitions (NULL). */
#include "shared_params.h" /* Shared parameters header. */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Constant parameter buffer identifier. This value is always located as the
* start of the buffer to validate the the RAM contains valid shared parameters.
*/
#define SHARED_PARAMS_BUFFER_ID (0xCE42E7A2u)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Layout of the shared parameters RAM buffer. */
typedef struct t_shared_params_buffer
{
/** \brief Fixed buffer identifier to validate that the RAM contains valid shared
* parameters.
*/
uint32_t identifier;
/** \brief Array for the actual parameter data. */
uint8_t data[SHARED_PARAMS_CFG_BUFFER_DATA_LEN];
/** \brief Checksum value of all the bytes in the buffer, excluding this checksum
* value of obvious reasons. The checksum is calculated as the Two's
* complement of the sum of the bytes.
*/
uint16_t checksum;
} tSharedParamsBuffer;
/****************************************************************************************
* Global data declarations
****************************************************************************************/
/** \brief Declaration of the actual parameter buffer that this module manages.
* \warning For the shared RAM parameters to work properly for sharing information
* between the bootloader and user program, it is important that this
* variable is linked to the exact same RAM address in both the bootloader
* and the user program. Additionally, it should be configured such that the
* C-startup code does NOT zero its contents during system initialization. This
* is the code that runs in the reset event handler, before function main() is
* called.
* For GCC based embedded toolchains, the solution is to assign this variable
* to a custom section, in this case called ".shared". Then in the linker
* script, add the following to the SECTIONS:
*
* .shared (NOLOAD) :
* {
* . = ALIGN(4);
* _sshared = .;
* __shared_start__ = _sshared;
* *(.shared)
* *(.shared.*)
* KEEP(*(.shared))
* . = ALIGN(4);
* _eshared = .;
* __shared_end__ = _eshared;
* } >SHARED
*
* Next, add a new MEMORY entry for SHARED at the start of RAM and reduce
* the length of the remaining RAM:
*
* SHARED (xrw) : ORIGIN = 0x200000C0, LENGTH = 64
* RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 32K - 192 - 64
*
* Note that the previous example is for an STM32F0 microcontroller where
* the first 192 (0xC0) bytes in RAM are reserved for the user program
* vector table.
*
* \remark This same approach can be applied with other toolchains such as Keil MDK
* and IAR EWARM. Consult the compiler and linker user manuals of your
* toolchain to find out how to place a RAM variable at a fixed memory address
* and to prevent the C-startup code from zeroing its contents.
* Here are a few links to get you started:
* * IAR EWARM:
* https://www.iar.com/support/tech-notes/compiler/
* linker-error-for-absolute-located-variable/
* * Keil MDK:
* http://www.keil.com/support/docs/3480.htm
*/
__no_init static tSharedParamsBuffer sharedParamsBuffer @ ".shared";
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static bool SharedParamsValidateBuffer(void);
static void SharedParamsWriteChecksum(void);
static bool SharedParamsVerifyChecksum(void);
static uint16_t SharedParamsCalculateChecksum(void);
/************************************************************************************//**
** \brief Initializes the shared RAM parameters module.
** \return none.
**
****************************************************************************************/
void SharedParamsInit(void)
{
uint32_t byteIdx;
/* The shared parameter buffer does not get initialized by the C-startup code. Another
* previously running program could have initialized it, in which case it is ready
* for use and nothing more needs to be done.
*/
if (!SharedParamsValidateBuffer())
{
/* The shared parameter buffer was not yet initialized by a running program. This
* typically happens after a cold reset where the RAM contents were lost. In this
* case we need to explicitly configure and initialize it, since the C-startup code
* was configured to not do this.
*
* The initialization consists of setting the buffer identifier, zeroing the
* actual parameter data and updating the checksum at the end.
*/
sharedParamsBuffer.identifier = SHARED_PARAMS_BUFFER_ID;
for (byteIdx=0; byteIdx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
sharedParamsBuffer.data[byteIdx] = 0;
}
SharedParamsWriteChecksum();
}
} /*** end of SharedParamsInit ***/
/************************************************************************************//**
** \brief Reads a data byte from the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Pointer to where the read data value is stored.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) &&
(value != NULL) )
{
/* Read the value and update the result. */
*value = sharedParamsBuffer.data[idx];
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsReadByIndex ***/
/************************************************************************************//**
** \brief Writes a data byte to the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Value to write.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) )
{
/* Write the value. */
sharedParamsBuffer.data[idx] = value;
/* Update the checksum since the contents were just changed. */
SharedParamsWriteChecksum();
/* Update the result. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsWriteByIndex ***/
/************************************************************************************//**
** \brief Validates the shared parameter buffer contents by looking at the table
** identifier and verifying its checksum.
** \return True if successful, false otherwise.
**
****************************************************************************************/
static bool SharedParamsValidateBuffer(void)
{
bool result = false;
/* Perform validation. */
if ( (sharedParamsBuffer.identifier == SHARED_PARAMS_BUFFER_ID) &&
(SharedParamsVerifyChecksum()) )
{
/* The shared parameter buffer is valid, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsValitabeTable ***/
/************************************************************************************//**
** \brief Calculates and writes the checksum into the buffer.
** \return none.
**
****************************************************************************************/
static void SharedParamsWriteChecksum(void)
{
/* Calculate and write the checksum. */
sharedParamsBuffer.checksum = SharedParamsCalculateChecksum();
} /*** end of SharedParamsWriteChecksum ***/
/************************************************************************************//**
** \brief Calculates and verifies the checksum that is currently present in the
** buffer.
** \return True is the checksum is correct, false otherwise.
**
****************************************************************************************/
static bool SharedParamsVerifyChecksum(void)
{
bool result = false;
/* Calculate and verify the checksum. */
if (SharedParamsCalculateChecksum() == sharedParamsBuffer.checksum)
{
/* Checksum is correct, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsVerifyChecksum ***/
/************************************************************************************//**
** \brief Calculates and returns the checksum value for the current contents in the
** buffer. The checksum is calculated by taking the sum of all bytes in the
** parameter buffer (excluding the checksum at the end) and them taking the
** two's complement value of it.
** \return The calculated checksum value.
**
****************************************************************************************/
static uint16_t SharedParamsCalculateChecksum(void)
{
uint16_t result = 0;
uint32_t byteIdx;
/* Add the identifier bytes to the checksum. */
result += (uint8_t)sharedParamsBuffer.identifier;
result += (uint8_t)(sharedParamsBuffer.identifier >> 8u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 16u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 24u);
/* Loop through the parameter data array. */
for (byteIdx=0; byteIdx<SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
/* Add parameter data byte to the checksum. */
result += (uint8_t)sharedParamsBuffer.data[byteIdx];
}
/* Determine one's complement. */
result = ~result;
/* Determine two's complement. */
result += 1;
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsCalculateChecksum ***/
/*********************************** end of shared_params.c ****************************/

View File

@ -0,0 +1,57 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Boot/shared_params.h
* \brief Shared RAM parameters header file.
* \ingroup Boot_ARMCM3_LM3S_EK_LM3S6965_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef SHARED_PARAMS_H
#define SHARED_PARAMS_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* Standard integer types. */
#include <stdbool.h> /* Standard boolean types. */
/****************************************************************************************
* Configuration macros
****************************************************************************************/
/** \brief Configuration macro for specifying the size of the data inside the parameter
* buffer. This is the length in bytes of the actual parameter data, so
* excluding the bufferId and checksum.
*/
#define SHARED_PARAMS_CFG_BUFFER_DATA_LEN (56u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void SharedParamsInit(void);
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value);
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value);
#endif /* SHARED_PARAMS_H */
/*********************************** end of shared_params.h ****************************/

View File

@ -36,6 +36,7 @@
#include "led.h" /* LED driver */ #include "led.h" /* LED driver */
#include "time.h" /* Timer driver */ #include "time.h" /* Timer driver */
#include "net.h" /* TCP/IP server application */ #include "net.h" /* TCP/IP server application */
#include "shared_params.h" /* Shared parameters header. */
#include "inc/hw_ints.h" #include "inc/hw_ints.h"
#include "inc/hw_memmap.h" #include "inc/hw_memmap.h"
#include "inc/hw_nvic.h" #include "inc/hw_nvic.h"

File diff suppressed because it is too large Load Diff

View File

@ -321,6 +321,7 @@
<state>$PROJ_DIR$\..\lib\driverlib</state> <state>$PROJ_DIR$\..\lib\driverlib</state>
<state>$PROJ_DIR$\..\lib\uip</state> <state>$PROJ_DIR$\..\lib\uip</state>
<state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip</state> <state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip</state>
<state>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\dhcpc</state>
</option> </option>
<option> <option>
<name>CCStdIncCheck</name> <name>CCStdIncCheck</name>
@ -2186,6 +2187,12 @@
<file> <file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h</name> <name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\dhcpc\dhcpc.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\apps\dhcpc\dhcpc.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc-addrlabels.h</name> <name>$PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\lc-addrlabels.h</name>
</file> </file>
@ -2269,6 +2276,12 @@
<file> <file>
<name>$PROJ_DIR$\..\net.h</name> <name>$PROJ_DIR$\..\net.h</name>
</file> </file>
<file>
<name>$PROJ_DIR$\..\shared_params.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\shared_params.h</name>
</file>
<file> <file>
<name>$PROJ_DIR$\..\time.c</name> <name>$PROJ_DIR$\..\time.c</name>
</file> </file>

View File

@ -35,7 +35,7 @@
<Windows> <Windows>
<Wnd1> <Wnd0>
<Tabs> <Tabs>
<Tab> <Tab>
<Identity>TabID-27300-28131</Identity> <Identity>TabID-27300-28131</Identity>
@ -47,20 +47,20 @@
</Tab> </Tab>
</Tabs> </Tabs>
<SelectedTab>0</SelectedTab></Wnd1><Wnd3><Tabs><Tab><Identity>TabID-32469-16784</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-4992-29791</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd3></Windows> <SelectedTab>0</SelectedTab></Wnd0><Wnd2><Tabs><Tab><Identity>TabID-32469-16784</Identity><TabName>Build</TabName><Factory>Build</Factory><Session/></Tab><Tab><Identity>TabID-4992-29791</Identity><TabName>Debug Log</TabName><Factory>Debug-Log</Factory><Session/></Tab></Tabs><SelectedTab>0</SelectedTab></Wnd2></Windows>
<Editor> <Editor>
<Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\led.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>45</YPos2><SelStart2>3072</SelStart2><SelEnd2>3072</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>61</YPos2><SelStart2>4156</SelStart2><SelEnd2>4156</SelEnd2></Tab><ActiveTab>1</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\net.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>60</YPos2><SelStart2>4159</SelStart2><SelEnd2>4159</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor> <Pane><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\led.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>45</YPos2><SelStart2>3072</SelStart2><SelEnd2>3072</SelEnd2></Tab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\main.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>61</YPos2><SelStart2>3588</SelStart2><SelEnd2>3588</SelEnd2></Tab><ActiveTab>1</ActiveTab><Tab><Factory>TextEditor</Factory><Filename>$WS_DIR$\..\net.c</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd><XPos2>0</XPos2><YPos2>60</YPos2><SelStart2>4159</SelStart2><SelEnd2>4159</SelEnd2></Tab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
<Positions> <Positions>
<Top><Row0><Sizes><Toolbar-05D81F58><key>iaridepm.enu1</key></Toolbar-05D81F58></Sizes></Row0></Top><Left><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>764</Bottom><Right>357</Right><x>-2</x><y>-2</y><xscreen>186</xscreen><yscreen>205</yscreen><sizeHorzCX>96875</sizeHorzCX><sizeHorzCY>203575</sizeHorzCY><sizeVertCX>186979</sizeVertCX><sizeVertCY>760675</sizeVertCY></Rect></Wnd1></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd3><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1922</Right><x>-2</x><y>-2</y><xscreen>1924</xscreen><yscreen>200</yscreen><sizeHorzCX>1002083</sizeHorzCX><sizeHorzCY>198610</sizeHorzCY><sizeVertCX>104167</sizeVertCX><sizeVertCY>198610</sizeVertCY></Rect></Wnd3></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions> <Top><Row0><Sizes><Toolbar-03E54D40><key>iaridepm.enu1</key></Toolbar-03E54D40></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>764</Bottom><Right>357</Right><x>-2</x><y>-2</y><xscreen>186</xscreen><yscreen>205</yscreen><sizeHorzCX>96875</sizeHorzCX><sizeHorzCY>203575</sizeHorzCY><sizeVertCX>186979</sizeVertCX><sizeVertCY>760675</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd2><Rect><Top>-2</Top><Left>-2</Left><Bottom>198</Bottom><Right>1922</Right><x>-2</x><y>-2</y><xscreen>1924</xscreen><yscreen>200</yscreen><sizeHorzCX>1002083</sizeHorzCX><sizeHorzCY>198610</sizeHorzCY><sizeVertCX>104167</sizeVertCX><sizeVertCY>198610</sizeVertCY></Rect></Wnd2></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
</Desktop> </Desktop>
</Workspace> </Workspace>

View File

@ -59,6 +59,10 @@
#define NETDEV_DEFAULT_MACADDR5 (0x45) #define NETDEV_DEFAULT_MACADDR5 (0x45)
/*---------------------------------------------------------------------------*/
static struct uip_eth_addr macAddress;
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void netdev_init(void) void netdev_init(void)
{ {
@ -142,6 +146,18 @@ void netdev_init_mac(void)
} }
/*---------------------------------------------------------------------------*/
void netdev_get_mac(unsigned char * mac_addr)
{
mac_addr[0] = macAddress.addr[0];
mac_addr[1] = macAddress.addr[1];
mac_addr[2] = macAddress.addr[2];
mac_addr[3] = macAddress.addr[3];
mac_addr[4] = macAddress.addr[4];
mac_addr[5] = macAddress.addr[5];
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
unsigned int netdev_read(void) unsigned int netdev_read(void)
{ {

View File

@ -40,6 +40,7 @@
void netdev_init(void); void netdev_init(void);
void netdev_init_mac(void); void netdev_init_mac(void);
void netdev_get_mac(unsigned char * mac_addr);
unsigned int netdev_read(void); unsigned int netdev_read(void);
void netdev_send(void); void netdev_send(void);

View File

@ -98,6 +98,27 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_MAX_LISTENPORTS 1 #define UIP_CONF_MAX_LISTENPORTS 1
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 1
/**
* UDP Maximum Connections
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CONNS 1
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 0
/** /**
* uIP buffer size. * uIP buffer size.
* *
@ -119,20 +140,6 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_LOGGING 0 #define UIP_CONF_LOGGING 0
/**
* UDP support on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP 0
/**
* UDP checksums on or off
*
* \hideinitializer
*/
#define UIP_CONF_UDP_CHECKSUMS 1
/** /**
* uIP statistics on or off * uIP statistics on or off
* *
@ -140,10 +147,12 @@ typedef unsigned short uip_stats_t;
*/ */
#define UIP_CONF_STATISTICS 0 #define UIP_CONF_STATISTICS 0
/* Here we include the header file for the application(s) we use in /* Here we include the header file for the application(s) we use in
our project. */ our project. */
#include "boot.h" #include "header.h"
#include "net.h" #include "net.h"
#include "dhcpc.h"
#endif /* __UIP_CONF_H__ */ #endif /* __UIP_CONF_H__ */

View File

@ -48,10 +48,17 @@ void main(void)
{ {
/* initialize the microcontroller */ /* initialize the microcontroller */
Init(); Init();
/* initialize the shared parameters module */
SharedParamsInit();
/* initialize the network application */ /* initialize the network application */
NetInit(); NetInit();
/* initialize the bootloader interface */ /* initialize the bootloader interface */
BootComInit(); BootComInit();
/* the shared parameter at index 0 is used as a boolean flag to indicate if the
* bootloader should initialize the TCP/IP network stack. by default this flag
* should be reset.
*/
SharedParamsWriteByIndex(0, 0);
/* start the infinite program loop */ /* start the infinite program loop */
while (1) while (1)

View File

@ -1,10 +1,12 @@
/*-Specials-*/ /*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x00008000; define symbol __ICFEDIT_intvec_start__ = 0x00008000;
/*-Memory Regions-*/ /*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x00008000; define symbol __ICFEDIT_region_ROM_start__ = 0x00008000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF; define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; define symbol __ICFEDIT_region_SHARED_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF; define symbol __ICFEDIT_region_SHARED_end__ = 0x2000003F;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000040;
define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF;
/*-Sizes-*/ /*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x400; define symbol __ICFEDIT_size_cstack__ = 0x400;
define symbol __ICFEDIT_size_heap__ = 0x800; define symbol __ICFEDIT_size_heap__ = 0x800;
@ -23,6 +25,7 @@ initialize by copy { readwrite };
do not initialize { section .noinit }; do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__ICFEDIT_region_SHARED_start__ { readwrite section .shared };
place in ROM_region { readonly }; place in ROM_region { readonly };
place in RAM_region { readwrite, place in RAM_region { readwrite,

View File

@ -53,6 +53,10 @@
static unsigned long periodicTimerTimeOut; static unsigned long periodicTimerTimeOut;
/** \brief Holds the time out value of the uIP ARP timer. */ /** \brief Holds the time out value of the uIP ARP timer. */
static unsigned long ARPTimerTimeOut; static unsigned long ARPTimerTimeOut;
#if (BOOT_COM_NET_DHCP_ENABLE > 0)
/** \brief Holds the MAC address which is used by the DHCP client. */
static struct uip_eth_addr macAddress;
#endif
/************************************************************************************//** /************************************************************************************//**
@ -71,6 +75,7 @@ void NetInit(void)
ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS; ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS;
/* initialize the uIP TCP/IP stack. */ /* initialize the uIP TCP/IP stack. */
uip_init(); uip_init();
#if (BOOT_COM_NET_DHCP_ENABLE == 0)
/* set the IP address */ /* set the IP address */
uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2, uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2,
BOOT_COM_NET_IPADDR3); BOOT_COM_NET_IPADDR3);
@ -83,10 +88,28 @@ void NetInit(void)
uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2, uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2,
BOOT_COM_NET_GATEWAY3); BOOT_COM_NET_GATEWAY3);
uip_setdraddr(ipaddr); uip_setdraddr(ipaddr);
#else
/* set the IP address */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_sethostaddr(ipaddr);
/* set the network mask */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_setnetmask(ipaddr);
/* set the gateway address */
uip_ipaddr(ipaddr, 0, 0, 0, 0);
uip_setdraddr(ipaddr);
#endif
/* start listening on the configured port for XCP transfers on TCP/IP */ /* start listening on the configured port for XCP transfers on TCP/IP */
uip_listen(HTONS(BOOT_COM_NET_PORT)); uip_listen(HTONS(BOOT_COM_NET_PORT));
/* initialize the MAC and set the MAC address */ /* initialize the MAC and set the MAC address */
netdev_init_mac(); netdev_init_mac();
#if (BOOT_COM_NET_DHCP_ENABLE > 0)
/* initialize the DHCP client application and send the initial request. */
netdev_get_mac(&macAddress.addr[0]);
dhcpc_init(&macAddress.addr[0], 6);
dhcpc_request();
#endif
} /*** end of NetInit ***/ } /*** end of NetInit ***/
@ -117,6 +140,13 @@ void NetApp(void)
/* check if this was an XCP CONNECT command */ /* check if this was an XCP CONNECT command */
if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00)) if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00))
{ {
/* the shared parameter at index 0 is used as a boolean flag to indicate if the
* bootloader should initialize the TCP/IP network stack. we just received a
* firmware update request from the TCP/IP network and we are about to active
* the bootloader for a firmware update via TCP/IP. At this point we should
* set the flag to make sure the bootloader initializes its TCP/IP network stack.
*/
SharedParamsWriteByIndex(0, 1);
/* connection request received so start the bootloader */ /* connection request received so start the bootloader */
BootActivate(); BootActivate();
} }
@ -136,13 +166,13 @@ void NetTask(void)
/* check for an RX packet and read it. */ /* check for an RX packet and read it. */
packetLen = netdev_read(); packetLen = netdev_read();
if(packetLen > 0) if (packetLen > 0)
{ {
/* set uip_len for uIP stack usage */ /* set uip_len for uIP stack usage */
uip_len = (unsigned short)packetLen; uip_len = (unsigned short)packetLen;
/* process incoming IP packets here. */ /* process incoming IP packets here. */
if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP)) if (NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP))
{ {
uip_arp_ipin(); uip_arp_ipin();
uip_input(); uip_input();
@ -150,7 +180,7 @@ void NetTask(void)
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
*/ */
if(uip_len > 0) if (uip_len > 0)
{ {
uip_arp_out(); uip_arp_out();
netdev_send(); netdev_send();
@ -158,7 +188,7 @@ void NetTask(void)
} }
} }
/* process incoming ARP packets here. */ /* process incoming ARP packets here. */
else if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP)) else if (NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP))
{ {
uip_arp_arpin(); uip_arp_arpin();
@ -166,14 +196,14 @@ void NetTask(void)
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
*/ */
if(uip_len > 0) if (uip_len > 0)
{ {
netdev_send(); netdev_send();
uip_len = 0; uip_len = 0;
} }
} }
} }
/* process TCP/IP Periodic Timer here. */ /* process TCP/IP Periodic Timer here. */
if (TimerGet() >= periodicTimerTimeOut) if (TimerGet() >= periodicTimerTimeOut)
{ {
@ -181,6 +211,22 @@ void NetTask(void)
for (connection = 0; connection < UIP_CONNS; connection++) for (connection = 0; connection < UIP_CONNS; connection++)
{ {
uip_periodic(connection); uip_periodic(connection);
/* If the above function invocation resulted in data that
* should be sent out on the network, the global variable
* uip_len is set to a value > 0.
*/
if (uip_len > 0)
{
uip_arp_out();
netdev_send();
uip_len = 0;
}
}
#if UIP_UDP
for (connection = 0; connection < UIP_UDP_CONNS; connection++)
{
uip_udp_periodic(connection);
/* If the above function invocation resulted in data that /* If the above function invocation resulted in data that
* should be sent out on the network, the global variable * should be sent out on the network, the global variable
* uip_len is set to a value > 0. * uip_len is set to a value > 0.
@ -192,13 +238,14 @@ void NetTask(void)
uip_len = 0; uip_len = 0;
} }
} }
#endif
} }
/* process ARP Timer here. */ /* process ARP Timer here. */
if (TimerGet() >= ARPTimerTimeOut) if (TimerGet() >= ARPTimerTimeOut)
{ {
ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS; ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS;
uip_arp_timer(); uip_arp_timer();
} }
} /*** end of NetServerTask ***/ } /*** end of NetServerTask ***/

View File

@ -0,0 +1,301 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Prog/shared_params.c
* \brief Shared RAM parameters source file.
* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stddef.h> /* Standard definitions (NULL). */
#include "shared_params.h" /* Shared parameters header. */
/****************************************************************************************
* Macro definitions
****************************************************************************************/
/** \brief Constant parameter buffer identifier. This value is always located as the
* start of the buffer to validate the the RAM contains valid shared parameters.
*/
#define SHARED_PARAMS_BUFFER_ID (0xCE42E7A2u)
/****************************************************************************************
* Type definitions
****************************************************************************************/
/** \brief Layout of the shared parameters RAM buffer. */
typedef struct t_shared_params_buffer
{
/** \brief Fixed buffer identifier to validate that the RAM contains valid shared
* parameters.
*/
uint32_t identifier;
/** \brief Array for the actual parameter data. */
uint8_t data[SHARED_PARAMS_CFG_BUFFER_DATA_LEN];
/** \brief Checksum value of all the bytes in the buffer, excluding this checksum
* value of obvious reasons. The checksum is calculated as the Two's
* complement of the sum of the bytes.
*/
uint16_t checksum;
} tSharedParamsBuffer;
/****************************************************************************************
* Global data declarations
****************************************************************************************/
/** \brief Declaration of the actual parameter buffer that this module manages.
* \warning For the shared RAM parameters to work properly for sharing information
* between the bootloader and user program, it is important that this
* variable is linked to the exact same RAM address in both the bootloader
* and the user program. Additionally, it should be configured such that the
* C-startup code does NOT zero its contents during system initialization. This
* is the code that runs in the reset event handler, before function main() is
* called.
* For GCC based embedded toolchains, the solution is to assign this variable
* to a custom section, in this case called ".shared". Then in the linker
* script, add the following to the SECTIONS:
*
* .shared (NOLOAD) :
* {
* . = ALIGN(4);
* _sshared = .;
* __shared_start__ = _sshared;
* *(.shared)
* *(.shared.*)
* KEEP(*(.shared))
* . = ALIGN(4);
* _eshared = .;
* __shared_end__ = _eshared;
* } >SHARED
*
* Next, add a new MEMORY entry for SHARED at the start of RAM and reduce
* the length of the remaining RAM:
*
* SHARED (xrw) : ORIGIN = 0x200000C0, LENGTH = 64
* RAM (xrw) : ORIGIN = 0x20000100, LENGTH = 32K - 192 - 64
*
* Note that the previous example is for an STM32F0 microcontroller where
* the first 192 (0xC0) bytes in RAM are reserved for the user program
* vector table.
*
* \remark This same approach can be applied with other toolchains such as Keil MDK
* and IAR EWARM. Consult the compiler and linker user manuals of your
* toolchain to find out how to place a RAM variable at a fixed memory address
* and to prevent the C-startup code from zeroing its contents.
* Here are a few links to get you started:
* * IAR EWARM:
* https://www.iar.com/support/tech-notes/compiler/
* linker-error-for-absolute-located-variable/
* * Keil MDK:
* http://www.keil.com/support/docs/3480.htm
*/
__no_init static tSharedParamsBuffer sharedParamsBuffer @ ".shared";
/****************************************************************************************
* Function prototypes
****************************************************************************************/
static bool SharedParamsValidateBuffer(void);
static void SharedParamsWriteChecksum(void);
static bool SharedParamsVerifyChecksum(void);
static uint16_t SharedParamsCalculateChecksum(void);
/************************************************************************************//**
** \brief Initializes the shared RAM parameters module.
** \return none.
**
****************************************************************************************/
void SharedParamsInit(void)
{
uint32_t byteIdx;
/* The shared parameter buffer does not get initialized by the C-startup code. Another
* previously running program could have initialized it, in which case it is ready
* for use and nothing more needs to be done.
*/
if (!SharedParamsValidateBuffer())
{
/* The shared parameter buffer was not yet initialized by a running program. This
* typically happens after a cold reset where the RAM contents were lost. In this
* case we need to explicitly configure and initialize it, since the C-startup code
* was configured to not do this.
*
* The initialization consists of setting the buffer identifier, zeroing the
* actual parameter data and updating the checksum at the end.
*/
sharedParamsBuffer.identifier = SHARED_PARAMS_BUFFER_ID;
for (byteIdx=0; byteIdx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
sharedParamsBuffer.data[byteIdx] = 0;
}
SharedParamsWriteChecksum();
}
} /*** end of SharedParamsInit ***/
/************************************************************************************//**
** \brief Reads a data byte from the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Pointer to where the read data value is stored.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) &&
(value != NULL) )
{
/* Read the value and update the result. */
*value = sharedParamsBuffer.data[idx];
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsReadByIndex ***/
/************************************************************************************//**
** \brief Writes a data byte to the shared parameter buffer at the specified index.
** \param idx Index into the parameter data array. A valid value is between 0 and
** (SHARED_PARAMS_CFG_BUFFER_DATA_LEN - 1).
** \param value Value to write.
** \return True if successful, false otherwise.
**
****************************************************************************************/
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value)
{
bool result = false;
/* Only continue if the buffer and the specified parameters are valid. */
if ( (SharedParamsValidateBuffer()) &&
(idx < SHARED_PARAMS_CFG_BUFFER_DATA_LEN) )
{
/* Write the value. */
sharedParamsBuffer.data[idx] = value;
/* Update the checksum since the contents were just changed. */
SharedParamsWriteChecksum();
/* Update the result. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsWriteByIndex ***/
/************************************************************************************//**
** \brief Validates the shared parameter buffer contents by looking at the table
** identifier and verifying its checksum.
** \return True if successful, false otherwise.
**
****************************************************************************************/
static bool SharedParamsValidateBuffer(void)
{
bool result = false;
/* Perform validation. */
if ( (sharedParamsBuffer.identifier == SHARED_PARAMS_BUFFER_ID) &&
(SharedParamsVerifyChecksum()) )
{
/* The shared parameter buffer is valid, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsValitabeTable ***/
/************************************************************************************//**
** \brief Calculates and writes the checksum into the buffer.
** \return none.
**
****************************************************************************************/
static void SharedParamsWriteChecksum(void)
{
/* Calculate and write the checksum. */
sharedParamsBuffer.checksum = SharedParamsCalculateChecksum();
} /*** end of SharedParamsWriteChecksum ***/
/************************************************************************************//**
** \brief Calculates and verifies the checksum that is currently present in the
** buffer.
** \return True is the checksum is correct, false otherwise.
**
****************************************************************************************/
static bool SharedParamsVerifyChecksum(void)
{
bool result = false;
/* Calculate and verify the checksum. */
if (SharedParamsCalculateChecksum() == sharedParamsBuffer.checksum)
{
/* Checksum is correct, so update the result value. */
result = true;
}
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsVerifyChecksum ***/
/************************************************************************************//**
** \brief Calculates and returns the checksum value for the current contents in the
** buffer. The checksum is calculated by taking the sum of all bytes in the
** parameter buffer (excluding the checksum at the end) and them taking the
** two's complement value of it.
** \return The calculated checksum value.
**
****************************************************************************************/
static uint16_t SharedParamsCalculateChecksum(void)
{
uint16_t result = 0;
uint32_t byteIdx;
/* Add the identifier bytes to the checksum. */
result += (uint8_t)sharedParamsBuffer.identifier;
result += (uint8_t)(sharedParamsBuffer.identifier >> 8u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 16u);
result += (uint8_t)(sharedParamsBuffer.identifier >> 24u);
/* Loop through the parameter data array. */
for (byteIdx=0; byteIdx<SHARED_PARAMS_CFG_BUFFER_DATA_LEN; byteIdx++)
{
/* Add parameter data byte to the checksum. */
result += (uint8_t)sharedParamsBuffer.data[byteIdx];
}
/* Determine one's complement. */
result = ~result;
/* Determine two's complement. */
result += 1;
/* Give the result back to the caller. */
return result;
} /*** end of SharedParamsCalculateChecksum ***/
/*********************************** end of shared_params.c ****************************/

View File

@ -0,0 +1,57 @@
/************************************************************************************//**
* \file Demo/ARMCM3_LM3S_EK_LM3S6965_IAR/Prog/shared_params.h
* \brief Shared RAM parameters header file.
* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_IAR
* \internal
*----------------------------------------------------------------------------------------
* C O P Y R I G H T
*----------------------------------------------------------------------------------------
* Copyright (c) 2018 by Feaser http://www.feaser.com All rights reserved
*
*----------------------------------------------------------------------------------------
* L I C E N S E
*----------------------------------------------------------------------------------------
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License along with OpenBLT. It
* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy.
*
* \endinternal
****************************************************************************************/
#ifndef SHARED_PARAMS_H
#define SHARED_PARAMS_H
/****************************************************************************************
* Include files
****************************************************************************************/
#include <stdint.h> /* Standard integer types. */
#include <stdbool.h> /* Standard boolean types. */
/****************************************************************************************
* Configuration macros
****************************************************************************************/
/** \brief Configuration macro for specifying the size of the data inside the parameter
* buffer. This is the length in bytes of the actual parameter data, so
* excluding the bufferId and checksum.
*/
#define SHARED_PARAMS_CFG_BUFFER_DATA_LEN (56u)
/****************************************************************************************
* Function prototypes
****************************************************************************************/
void SharedParamsInit(void);
bool SharedParamsReadByIndex(uint32_t idx, uint8_t * value);
bool SharedParamsWriteByIndex(uint32_t idx, uint8_t value);
#endif /* SHARED_PARAMS_H */
/*********************************** end of shared_params.h ****************************/

View File

@ -70,22 +70,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* B A C K D O O R E N T R Y C O N F I G U R A T I O N * B A C K D O O R E N T R Y C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -70,22 +70,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* B A C K D O O R E N T R Y C O N F I G U R A T I O N * B A C K D O O R E N T R Y C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -70,22 +70,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* B A C K D O O R E N T R Y C O N F I G U R A T I O N * B A C K D O O R E N T R Y C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -70,22 +70,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* B A C K D O O R E N T R Y C O N F I G U R A T I O N * B A C K D O O R E N T R Y C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -98,22 +98,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N * F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -98,22 +98,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N * F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -98,22 +98,6 @@
#define BOOT_COM_USB_RX_MAX_DATA (63) #define BOOT_COM_USB_RX_MAX_DATA (63)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N * F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N
****************************************************************************************/ ****************************************************************************************/

View File

@ -104,18 +104,6 @@
/** \brief Enable/disable the backdoor override hook functions. */ /** \brief Enable/disable the backdoor override hook functions. */
#define BOOT_BACKDOOR_HOOKS_ENABLE (0) #define BOOT_BACKDOOR_HOOKS_ENABLE (0)
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N * N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N

View File

@ -104,18 +104,6 @@
/** \brief Enable/disable the backdoor override hook functions. */ /** \brief Enable/disable the backdoor override hook functions. */
#define BOOT_BACKDOOR_HOOKS_ENABLE (0) #define BOOT_BACKDOOR_HOOKS_ENABLE (0)
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N * N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N

View File

@ -104,18 +104,6 @@
/** \brief Enable/disable the backdoor override hook functions. */ /** \brief Enable/disable the backdoor override hook functions. */
#define BOOT_BACKDOOR_HOOKS_ENABLE (0) #define BOOT_BACKDOOR_HOOKS_ENABLE (0)
#if (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************
* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N * N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N

View File

@ -122,82 +122,56 @@
* the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a
* message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA
* and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured
* with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configured with the
* BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros * macro BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros
* BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server
* listen on for connections is configured with BOOT_COM_NET_PORT. * listen on for connections is configured with BOOT_COM_NET_PORT.
* In case the network switch/router supports a DHCP server, you can set configuration
* macro BOOT_COM_NET_DHCP_ENABLE to 1 to enable the DHCP client. In this case the
* DHCP client handles the automatic IP address assignment. In this case the macros for
* configuring the IP address, network mask and gateway address are no longer needed.
*/ */
/** \brief Enable/disable the NET transport layer. */ /** \brief Enable/disable the NET transport layer. */
#define BOOT_COM_NET_ENABLE (1) #define BOOT_COM_NET_ENABLE (1)
/** \brief Configure number of bytes in the target->host data packet. */ /** \brief Configure number of bytes in the target->host data packet. */
#define BOOT_COM_NET_TX_MAX_DATA (64) #define BOOT_COM_NET_TX_MAX_DATA (64)
/** \brief Configure number of bytes in the host->target data packet. */ /** \brief Configure number of bytes in the host->target data packet. */
#define BOOT_COM_NET_RX_MAX_DATA (64) #define BOOT_COM_NET_RX_MAX_DATA (64)
/** \brief Configure the port that the TCP/IP server listens on */ /** \brief Configure the port that the TCP/IP server listens on */
#define BOOT_COM_NET_PORT (1000) #define BOOT_COM_NET_PORT (1000)
/** \brief Enable/disable DHCP client for automatically obtaining an IP address. */
#define BOOT_COM_NET_DHCP_ENABLE (1)
/** \brief Configure the 1st byte of the IP address */ /** \brief Configure the 1st byte of the IP address */
#define BOOT_COM_NET_IPADDR0 (169) #define BOOT_COM_NET_IPADDR0 (192)
/** \brief Configure the 2nd byte of the IP address */ /** \brief Configure the 2nd byte of the IP address */
#define BOOT_COM_NET_IPADDR1 (254) #define BOOT_COM_NET_IPADDR1 (168)
/** \brief Configure the 3rd byte of the IP address */ /** \brief Configure the 3rd byte of the IP address */
#define BOOT_COM_NET_IPADDR2 (19) #define BOOT_COM_NET_IPADDR2 (178)
/** \brief Configure the 4th byte of the IP address */ /** \brief Configure the 4th byte of the IP address */
#define BOOT_COM_NET_IPADDR3 (63) #define BOOT_COM_NET_IPADDR3 (50)
/** \brief Configure the 1st byte of the network mask */ /** \brief Configure the 1st byte of the network mask */
#define BOOT_COM_NET_NETMASK0 (255) #define BOOT_COM_NET_NETMASK0 (255)
/** \brief Configure the 2nd byte of the network mask */ /** \brief Configure the 2nd byte of the network mask */
#define BOOT_COM_NET_NETMASK1 (255) #define BOOT_COM_NET_NETMASK1 (255)
/** \brief Configure the 3rd byte of the network mask */ /** \brief Configure the 3rd byte of the network mask */
#define BOOT_COM_NET_NETMASK2 (0) #define BOOT_COM_NET_NETMASK2 (255)
/** \brief Configure the 4th byte of the network mask */ /** \brief Configure the 4th byte of the network mask */
#define BOOT_COM_NET_NETMASK3 (0) #define BOOT_COM_NET_NETMASK3 (0)
/** \brief Configure the 1st byte of the gateway address */ /** \brief Configure the 1st byte of the gateway address */
#define BOOT_COM_NET_GATEWAY0 (169) #define BOOT_COM_NET_GATEWAY0 (192)
/** \brief Configure the 2nd byte of the gateway address */ /** \brief Configure the 2nd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY1 (254) #define BOOT_COM_NET_GATEWAY1 (168)
/** \brief Configure the 3rd byte of the gateway address */ /** \brief Configure the 3rd byte of the gateway address */
#define BOOT_COM_NET_GATEWAY2 (19) #define BOOT_COM_NET_GATEWAY2 (178)
/** \brief Configure the 4th byte of the gateway address */ /** \brief Configure the 4th byte of the gateway address */
#define BOOT_COM_NET_GATEWAY3 (1) #define BOOT_COM_NET_GATEWAY3 (1)
/** \brief Enable/disable a hook function that is called when the IP address is about /** \brief Enable/disable the deferred initialization mechanism. When enabled, the
* to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. * communication interface is only initialized when: (a) no valid user program
* is detected, or (b) when CpuUserProgramStartHook() returns BLT_FALSE. Your
* bootloader application can explicitly initialize the communication interface
* by calling ComDeferredInit().
*/ */
#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) #define BOOT_COM_NET_DEFERRED_INIT_ENABLE (1)
/** \brief Enable/disable a hook function that is called when the netmask is about
* to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values.
*/
#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0)
/** \brief Enable/disable a hook function that is called when the gateway address is
* about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx
* values.
*/
#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0)
/****************************************************************************************
* B A C K D O O R C O N F I G U R A T I O N
****************************************************************************************/
#if (BOOT_COM_NET_ENABLE > 0)
/* Override the default time that the backdoor is open if firmware updates via TCP/IP
* are supported. in this case a reactivation of the bootloader results in a re-
* initialization of the ethernet MAC. when directly connected to the ethernet port of
* a PC this will go relatively fast (depending on what MS Windows is being used), but
* when connected to the network via a router this can take several seconds. feel free to
* shorten/lengthen this time for finetuning. the only downside of a long backdoor open
* time is that the starting of the user program will also be delayed for this time.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (10000)
#elif (BOOT_COM_USB_ENABLE > 0)
/* For a USB bootloader, the backdoor needs to stay open long enough for the USB device
* to enumerate on the host PC. Therefore it needs to be set a bit longer than the
* default value, which is done here by overriding the macro. Note that this won't be
* long enough for a first time USB driver install on the host PC. In this case the
* bootloader should be started with the backup backdoor that uses a digital input to
* for the bootloader to stay active. Refer to CpuUserProgramStartHook() to determine
* the digital input to use for this.
*/
#define BOOT_BACKDOOR_ENTRY_TIMEOUT_MS (2000)
#endif
/**************************************************************************************** /****************************************************************************************

View File

@ -37,9 +37,10 @@ SEARCH_DIR(.)
/* Memory Spaces Definitions */ /* Memory Spaces Definitions */
MEMORY MEMORY
{ {
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 48K ROM (rx) : ORIGIN = 0x08000000, LENGTH = 48K
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K SHARED (rwx) : ORIGIN = 0x20000000, LENGTH = 64
CCRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K RAM (rwx) : ORIGIN = 0x20000040, LENGTH = 128K - 64
CCRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 64K
} }
/* Linker script to place sections and symbol values. Should be used together /* Linker script to place sections and symbol values. Should be used together
@ -72,6 +73,17 @@ MEMORY
SECTIONS SECTIONS
{ {
.shared (NOLOAD):
{
. = ALIGN(4);
__shared_start__ = .;
*(.shared)
*(.shared.*)
KEEP(*(.shared))
. = ALIGN(4);
__shared_end__ = .;
} > SHARED
.text : .text :
{ {
KEEP(*(.isr_vector)) KEEP(*(.isr_vector))

View File

@ -405,8 +405,9 @@ static void SetSysClock(void)
RCC->CFGR |= RCC_CFGR_SW_PLL; RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait till the main PLL is used as system clock source */ /* Wait till the main PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL); while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL)
{ {
;
} }
} }
else else

Some files were not shown because too many files have changed in this diff Show More