-
-
Notifications
You must be signed in to change notification settings - Fork 175
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WP test app over USB CDC #65
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
cmake_minimum_required(VERSION 3.0) | ||
ENABLE_LANGUAGE(ASM) | ||
|
||
include_directories( | ||
${CMAKE_CURRENT_SOURCE_DIR} | ||
) | ||
|
||
find_package(CHIBIOS REQUIRED) | ||
include_directories(${CHIBIOS_INCLUDE_DIRS}) | ||
|
||
|
||
# pass the RTOS option to the compiler flags | ||
# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CHIBIOS_COMPILE_OPTIONS} ") | ||
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CHIBIOS_COMPILE_OPTIONS} ") | ||
|
||
set(PROJECT_SOURCES | ||
# test app | ||
main.c | ||
usbcfg.c | ||
|
||
# required files to add Wire Protocol | ||
WireProtocol_Receiver.c | ||
WireProtocol_Commands.c | ||
) | ||
|
||
add_executable( | ||
# executables for project, project sources | ||
${CMAKE_PROJECT_NAME} ${PROJECT_SOURCES} | ||
|
||
# sources for ChibiOS | ||
${CHIBIOS_SOURCES} | ||
) | ||
|
||
CHIBIOS_SET_LINKER_OPTIONS(${CMAKE_PROJECT_NAME}) | ||
|
||
CHIBIOS_ADD_HEX_BIN_DUMP_TARGETS(${CMAKE_PROJECT_NAME}) | ||
|
||
CHIBIOS_PRINT_SIZE_OF_TARGETS(${CMAKE_PROJECT_NAME}) | ||
|
||
# generate map file | ||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.map,--library-path=${PROJECT_BINARY_DIR}/ChibiOS_Source/common/ports/ARMCMx/compilers/GCC,--defsym=__main_stack_size__=0x400,--defsym=__process_stack_size__=0x400") | ||
|
||
set(HEX_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.hex) | ||
set(S19_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.s19) | ||
set(BIN_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.bin) | ||
set(DUMP_FILE ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME}.lst) | ||
|
||
# generate HEX, BIN and LST files as needed | ||
if(CMAKE_BUILD_TYPE EQUAL "Release") | ||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD | ||
# copy target image to other formats | ||
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}> ${HEX_FILE} | ||
COMMAND ${CMAKE_OBJCOPY} -Osrec $<TARGET_FILE:${PROJECT_NAME}> ${S19_FILE} | ||
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}> ${BIN_FILE} | ||
|
||
# copy target file to build folder (this is only usefull for debugging in VS Code because of path in launch.json) | ||
COMMAND ${CMAKE_OBJCOPY} $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME} | ||
|
||
COMMENT "Generate HEX and BIN files fro deployment") | ||
else() | ||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD | ||
# copy target image to other formats | ||
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}> ${HEX_FILE} | ||
COMMAND ${CMAKE_OBJCOPY} -Osrec $<TARGET_FILE:${PROJECT_NAME}> ${S19_FILE} | ||
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}> ${BIN_FILE} | ||
|
||
# copy target file to build folder (this is only usefull for debugging in VS Code because of path in launch.json) | ||
COMMAND ${CMAKE_OBJCOPY} $<TARGET_FILE:${PROJECT_NAME}> ${PROJECT_SOURCE_DIR}/build/${PROJECT_NAME} | ||
|
||
# dump target image as source code listing | ||
COMMAND ${CMAKE_OBJDUMP} -d -EL -S $<TARGET_FILE:${PROJECT_NAME}> > ${DUMP_FILE} | ||
COMMENT "Generate HEX and BIN files for deployment, LST file for debug") | ||
endif() |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
For the ChibiOS test app to build succesfully the following changes are required: | ||
|
||
In _halconf.g_ (when compared with a default file) | ||
- HAL_USE_SERIAL to TRUE | ||
- HAL_USE_SERIAL_USB to TRUE | ||
- HAL_USE_USB to TRUE | ||
- SERIAL_DEFAULT_BITRATE to 115200 | ||
|
||
In _mcuconf.h_ (when compared with a default file) | ||
- STM32_SERIAL_USE_USART2 to TRUE | ||
- STM32_USB_USE_OTG1 to TRUE | ||
|
||
When making the build the first time it will fail with an error about a duplicate definition of __dso_handle. | ||
Edit the file _../various/cpp_wrappers/syscalls_cpp.hpp_ located in the ChibiOS source folder and comment the line where it's being defined there. | ||
|
||
NOTE: this configuration was sucessfully tested in a ST_STM32F4_DISCOVERY board using the Serial over USB connection on USB port 1 that creates a virtual COM port. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
// | ||
// Copyright (c) 2017 The nano Framework project contributors | ||
// Some parts are taken from .NET Microframework source code | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// See LICENSE file in the project root for full license information. | ||
// | ||
|
||
#ifndef _WIREPROTOCOL_H_ | ||
#define _WIREPROTOCOL_H_ | ||
|
||
#include <ch.h> | ||
|
||
#define MARKER_DEBUGGER_V1 "MSdbgV1" // Used to identify the debugger at boot time. | ||
#define MARKER_PACKET_V1 "MSpktV1" // Used to identify the start of a packet. | ||
|
||
struct WP_Packet; | ||
struct WP_Message; | ||
|
||
// enum with Wire Protocol flags | ||
// backwards compatible with .NETMF | ||
typedef enum WP_Flags | ||
{ | ||
WP_Flags_c_NonCritical = 0x0001, // This doesn't need an acknowledge. | ||
WP_Flags_c_Reply = 0x0002, // This is the result of a command. | ||
WP_Flags_c_BadHeader = 0x0004, | ||
WP_Flags_c_BadPayload = 0x0008, | ||
WP_Flags_c_Spare0010 = 0x0010, | ||
WP_Flags_c_Spare0020 = 0x0020, | ||
WP_Flags_c_Spare0040 = 0x0040, | ||
WP_Flags_c_Spare0080 = 0x0080, | ||
WP_Flags_c_Spare0100 = 0x0100, | ||
WP_Flags_c_Spare0200 = 0x0200, | ||
WP_Flags_c_Spare0400 = 0x0400, | ||
WP_Flags_c_Spare0800 = 0x0800, | ||
WP_Flags_c_Spare1000 = 0x1000, | ||
WP_Flags_c_NoCaching = 0x2000, | ||
WP_Flags_c_NACK = 0x4000, | ||
WP_Flags_c_ACK = 0x8000 | ||
}WP_Flags; | ||
|
||
// structure for Wire Protocol packet | ||
// backwards compatible with .NETMF | ||
typedef struct WP_Packet | ||
{ | ||
uint8_t m_signature[8]; | ||
uint32_t m_crcHeader; | ||
uint32_t m_crcData; | ||
|
||
uint32_t m_cmd; | ||
uint16_t m_seq; | ||
uint16_t m_seqReply; | ||
uint32_t m_flags; | ||
uint32_t m_size; | ||
}WP_Packet; | ||
|
||
// structure for Wire Protocol message | ||
// backwards compatible with .NETMF equivalent in names and types to help code reuse | ||
typedef struct WP_Message | ||
{ | ||
WP_Packet m_header; | ||
uint8_t* m_payload; | ||
|
||
uint8_t* m_pos; | ||
uint16_t m_size; | ||
int m_rxState; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
}WP_Message; | ||
|
||
|
||
// This structure is never used, its purpose is to generate a compiler error in case the size of any structure changes. | ||
struct WP_CompileCheck | ||
{ | ||
char buf1[ sizeof(WP_Packet) == 8 * 4 ? 1 : -1 ]; | ||
}; | ||
|
||
#endif // _WIREPROTOCOL_H_ |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// | ||
// Copyright (c) 2017 The nano Framework project contributors | ||
// Some parts are taken from .NET Microframework source code | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// See LICENSE file in the project root for full license information. | ||
// | ||
|
||
#include "WireProtocol_Commands.h" | ||
|
||
// this one is implemented at WireProtocol_Receiver.c | ||
extern void ReplyToCommand(WP_Message* message, bool fSuccess, bool fCritical, void* ptr, int size); | ||
|
||
|
||
bool Monitor_Ping(WP_Message* message) | ||
{ | ||
if((message->m_header.m_flags & WP_Flags_c_Reply) == 0) | ||
{ | ||
Monitor_Ping_Reply cmdReply; | ||
// TODO | ||
// set flag with NanoBooter or NanoCLR according to the thread we are running | ||
cmdReply.m_source = Monitor_Ping_c_Ping_Source_NanoBooter; | ||
|
||
ReplyToCommand(message, true, false, &cmdReply, sizeof(cmdReply)); | ||
} | ||
|
||
return true; | ||
} | ||
|
||
bool Monitor_OemInfo(WP_Message* message) | ||
{ | ||
if((message->m_header.m_flags & WP_Flags_c_Reply ) == 0) | ||
{ | ||
Monitor_OemInfo_Reply cmdReply; | ||
|
||
bool fOK = NanoBooter_GetReleaseInfo(&cmdReply.m_releaseInfo) == true; | ||
|
||
ReplyToCommand(message, fOK, false, &cmdReply, sizeof(cmdReply) ); | ||
} | ||
|
||
return true; | ||
} | ||
|
||
////////////////////////////////////////////////////////////////////// | ||
// helper functions | ||
|
||
bool NanoBooter_GetReleaseInfo(ReleaseInfo* releaseInfo) | ||
{ | ||
releaseInfo->version.usMajor = 0; | ||
releaseInfo->version.usMinor = 0; | ||
releaseInfo->version.usBuild = 12345; | ||
releaseInfo->version.usRevision = 1; | ||
|
||
// TODO replace this with string from (possibly...) main config file | ||
memcpy(&releaseInfo->infoString, ">>>> nanoFramework RULES <<<<", sizeof(releaseInfo->infoString)); | ||
|
||
return true; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
// | ||
// Copyright (c) 2017 The nano Framework project contributors | ||
// Some parts are taken from .NET Microframework source code | ||
// Copyright (c) Microsoft Corporation. All rights reserved. | ||
// See LICENSE file in the project root for full license information. | ||
// | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please use the new 'Portions' copyright header. |
||
|
||
#ifndef _WIREPROTOCOL_COMMANDS_H_ | ||
#define _WIREPROTOCOL_COMMANDS_H_ | ||
|
||
#include <string.h> | ||
#include "WireProtocol.h" | ||
|
||
////////////////////////////////////////// | ||
// enums | ||
|
||
// enum with CLR and debugger commands | ||
// backwards compatible with .NETMF | ||
typedef enum CLR_DBG_Commands | ||
{ | ||
CLR_DBG_Commands_c_Monitor_Ping = 0x00000000, // The payload is empty, this command is used to let the other side know we are here... | ||
CLR_DBG_Commands_c_Monitor_Message = 0x00000001, // The payload is composed of the string characters, no zero at the end. | ||
CLR_DBG_Commands_c_Monitor_ReadMemory = 0x00000002, | ||
CLR_DBG_Commands_c_Monitor_WriteMemory = 0x00000003, | ||
CLR_DBG_Commands_c_Monitor_CheckMemory = 0x00000004, | ||
CLR_DBG_Commands_c_Monitor_EraseMemory = 0x00000005, | ||
CLR_DBG_Commands_c_Monitor_Execute = 0x00000006, | ||
CLR_DBG_Commands_c_Monitor_Reboot = 0x00000007, | ||
CLR_DBG_Commands_c_Monitor_MemoryMap = 0x00000008, | ||
CLR_DBG_Commands_c_Monitor_ProgramExit = 0x00000009, // The payload is empty, this command is used to tell the PC of a program termination | ||
CLR_DBG_Commands_c_Monitor_CheckSignature = 0x0000000A, | ||
CLR_DBG_Commands_c_Monitor_DeploymentMap = 0x0000000B, | ||
CLR_DBG_Commands_c_Monitor_FlashSectorMap = 0x0000000C, | ||
CLR_DBG_Commands_c_Monitor_SignatureKeyUpdate = 0x0000000D, | ||
CLR_DBG_Commands_c_Monitor_OemInfo = 0x0000000E, | ||
}CLR_DBG_Commands; | ||
|
||
// enum with flags for Monitor ping source and debugger flags | ||
// backwards compatible with .NETMF in debugger flags only | ||
// adds NEW flags for nanoBooter and nanoCLR | ||
typedef enum Monitor_Ping_Source_Flags | ||
{ | ||
Monitor_Ping_c_Ping_Source_NanoCLR = 0x00010000, | ||
Monitor_Ping_c_Ping_Source_NanoBooter = 0x00010001, | ||
|
||
Monitor_Ping_c_Ping_DbgFlag_Stop = 0x00000001, | ||
Monitor_Ping_c_Ping_DbgFlag_AppExit = 0x00000004, | ||
}Monitor_Ping_Source_Flags; | ||
|
||
////////////////////////////////////////// | ||
// typedefs | ||
|
||
// structure for Monitor Ping Reply | ||
// backwards compatible with .NETMF | ||
typedef struct Monitor_Ping_Reply | ||
{ | ||
uint32_t m_source; | ||
uint32_t m_dbg_flags; | ||
|
||
}Monitor_Ping_Reply; | ||
|
||
// structure to hold 'standard' version information | ||
// equivalent with .NETMF MFVersion | ||
typedef struct VersionInfo | ||
{ | ||
unsigned short usMajor; | ||
unsigned short usMinor; | ||
unsigned short usBuild; | ||
unsigned short usRevision; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. uint16_t ? |
||
|
||
}VersionInfo; | ||
|
||
// structure to hold nano Framework release information | ||
// equivalent with .NETMF MfReleaseInfo | ||
typedef struct ReleaseInfo | ||
{ | ||
|
||
VersionInfo version; | ||
|
||
uint8_t infoString[64-sizeof(VersionInfo)]; | ||
|
||
}ReleaseInfo; | ||
|
||
// structure with reply for OEM information command | ||
typedef struct Monitor_OemInfo_Reply | ||
{ | ||
|
||
ReleaseInfo m_releaseInfo; | ||
|
||
}Monitor_OemInfo_Reply; | ||
|
||
////////////////////////////////////////// | ||
// function declarations (commands) | ||
|
||
bool Monitor_Ping(WP_Message* message); | ||
bool Monitor_OemInfo(WP_Message* message); | ||
|
||
////////////////////////////////////////// | ||
// helper functions | ||
bool NanoBooter_GetReleaseInfo(ReleaseInfo* releaseInfo); | ||
|
||
#endif //_WIREPROTOCOL_COMMANDS_H_ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please use the new 'Portions' copyright header.