diff options
| author | Evan Lojewski <github@meklort.com> | 2019-06-22 21:37:45 -0600 |
|---|---|---|
| committer | Evan Lojewski <github@meklort.com> | 2019-06-22 21:37:45 -0600 |
| commit | 8ac9845d3e1fdf9c5691eca90b6ef4bc96cae11e (patch) | |
| tree | 636ab9d7a223a74c85ebd62d9558308564ff85e0 /include | |
| parent | b4668768e1281ad943cc04deca0bd5feabd3b448 (diff) | |
| download | bcm5719-ortega-8ac9845d3e1fdf9c5691eca90b6ef4bc96cae11e.tar.gz bcm5719-ortega-8ac9845d3e1fdf9c5691eca90b6ef4bc96cae11e.zip | |
Add APE_DEBUG.h header for console prints.
Diffstat (limited to 'include')
| -rw-r--r-- | include/APE_DEBUG.h | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/include/APE_DEBUG.h b/include/APE_DEBUG.h new file mode 100644 index 0000000..41d2242 --- /dev/null +++ b/include/APE_DEBUG.h @@ -0,0 +1,274 @@ +//////////////////////////////////////////////////////////////////////////////// +/// +/// @file APE_DEBUG.h +/// +/// @project ape +/// +/// @brief APE_DEBUG +/// +//////////////////////////////////////////////////////////////////////////////// +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// @copyright Copyright (c) 2018, Evan Lojewski +/// @cond +/// +/// All rights reserved. +/// +/// Redistribution and use in source and binary forms, with or without +/// modification, are permitted provided that the following conditions are met: +/// 1. Redistributions of source code must retain the above copyright notice, +/// this list of conditions and the following disclaimer. +/// 2. Redistributions in binary form must reproduce the above copyright notice, +/// this list of conditions and the following disclaimer in the documentation +/// and/or other materials provided with the distribution. +/// 3. Neither the name of the <organization> nor the +/// names of its contributors may be used to endorse or promote products +/// derived from this software without specific prior written permission. +/// +//////////////////////////////////////////////////////////////////////////////// +/// +/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +/// POSSIBILITY OF SUCH DAMAGE. +/// @endcond +//////////////////////////////////////////////////////////////////////////////// + +/** @defgroup APE_DEBUG_H APE_DEBUG */ +/** @addtogroup APE_DEBUG_H + * @{ + */ +#ifndef APE_DEBUG_H +#define APE_DEBUG_H + +#include <types.h> + +#ifdef CXX_SIMULATOR /* Compiling c++ simulator code - uses register wrappers */ +void init_APE_DEBUG_sim(void* base); +void init_APE_DEBUG(void); + +#include <CXXRegister.h> +typedef CXXRegister<uint8_t, 0, 8> APE_DEBUG_H_uint8_t; +typedef CXXRegister<uint16_t, 0, 16> APE_DEBUG_H_uint16_t; +typedef CXXRegister<uint32_t, 0, 32> APE_DEBUG_H_uint32_t; +#define APE_DEBUG_H_uint8_t_bitfield(__pos__, __width__) CXXRegister<uint8_t, __pos__, __width__> +#define APE_DEBUG_H_uint16_t_bitfield(__pos__, __width__) CXXRegister<uint16_t, __pos__, __width__> +#define APE_DEBUG_H_uint32_t_bitfield(__pos__, __width__) CXXRegister<uint32_t, __pos__, __width__> +#define register_container struct +#define volatile +#define BITFIELD_BEGIN(__type__, __name__) struct { +#define BITFIELD_MEMBER(__type__, __name__, __offset__, __bits__) __type__##_bitfield(__offset__, __bits__) __name__; +#define BITFIELD_END(__type__, __name__) } __name__; + +#else /* Firmware Data types */ +typedef uint8_t APE_DEBUG_H_uint8_t; +typedef uint16_t APE_DEBUG_H_uint16_t; +typedef uint32_t APE_DEBUG_H_uint32_t; +#define register_container union +#define BITFIELD_BEGIN(__type__, __name__) struct { +#define BITFIELD_MEMBER(__type__, __name__, __offset__, __bits__) __type__ __name__:__bits__; +#define BITFIELD_END(__type__, __name__) } __name__; +#endif /* !CXX_SIMULATOR */ + +#define REG_DEBUG_BASE ((volatile void*)0x60221000) /* Device SHM Registers, function 1 for debug */ +#define REG_DEBUG_SIZE (sizeof(DEBUG_t)) + +#define REG_DEBUG_WRITE_POINTER ((volatile APE_DEBUG_H_uint32_t*)0x60221000) /* Offset in the debug buffer to write data. */ +#define DEBUG_WRITE_POINTER_OFFSET_SHIFT 0u +#define DEBUG_WRITE_POINTER_OFFSET_MASK 0xffffffffu +#define GET_DEBUG_WRITE_POINTER_OFFSET(__reg__) (((__reg__) & 0xffffffff) >> 0u) +#define SET_DEBUG_WRITE_POINTER_OFFSET(__val__) (((__val__) << 0u) & 0xffffffffu) + +/** @brief Register definition for @ref DEBUG_t.WritePointer. */ +typedef register_container RegDEBUGWritePointer_t { + /** @brief 32bit direct register access. */ + APE_DEBUG_H_uint32_t r32; + + BITFIELD_BEGIN(APE_DEBUG_H_uint32_t, bits) +#if defined(__LITTLE_ENDIAN__) + /** @brief All bits */ + BITFIELD_MEMBER(APE_DEBUG_H_uint32_t, offset, 0, 32) +#elif defined(__BIG_ENDIAN__) + /** @brief All bits */ + BITFIELD_MEMBER(APE_DEBUG_H_uint32_t, offset, 0, 32) +#else +#error Unknown Endian +#endif + BITFIELD_END(APE_DEBUG_H_uint32_t, bits) +#ifdef CXX_SIMULATOR + /** @brief Register name for use with the simulator. */ + const char* getName(void) { return "WritePointer"; } + + /** @brief Print register value. */ + void print(void) { r32.print(); } + + RegDEBUGWritePointer_t() + { + /** @brief constructor for @ref DEBUG_t.WritePointer. */ + r32.setName("WritePointer"); + bits.offset.setBaseRegister(&r32); + bits.offset.setName("offset"); + } + RegDEBUGWritePointer_t& operator=(const RegDEBUGWritePointer_t& other) + { + r32 = other.r32; + return *this; + } +#endif /* CXX_SIMULATOR */ +} RegDEBUGWritePointer_t; + +#define REG_DEBUG_READ_POINTER ((volatile APE_DEBUG_H_uint32_t*)0x60221004) /* Offset in the debug buffer to read data. */ +#define DEBUG_READ_POINTER_OFFSET_SHIFT 0u +#define DEBUG_READ_POINTER_OFFSET_MASK 0xffffffffu +#define GET_DEBUG_READ_POINTER_OFFSET(__reg__) (((__reg__) & 0xffffffff) >> 0u) +#define SET_DEBUG_READ_POINTER_OFFSET(__val__) (((__val__) << 0u) & 0xffffffffu) + +/** @brief Register definition for @ref DEBUG_t.ReadPointer. */ +typedef register_container RegDEBUGReadPointer_t { + /** @brief 32bit direct register access. */ + APE_DEBUG_H_uint32_t r32; + + BITFIELD_BEGIN(APE_DEBUG_H_uint32_t, bits) +#if defined(__LITTLE_ENDIAN__) + /** @brief All bits */ + BITFIELD_MEMBER(APE_DEBUG_H_uint32_t, offset, 0, 32) +#elif defined(__BIG_ENDIAN__) + /** @brief All bits */ + BITFIELD_MEMBER(APE_DEBUG_H_uint32_t, offset, 0, 32) +#else +#error Unknown Endian +#endif + BITFIELD_END(APE_DEBUG_H_uint32_t, bits) +#ifdef CXX_SIMULATOR + /** @brief Register name for use with the simulator. */ + const char* getName(void) { return "ReadPointer"; } + + /** @brief Print register value. */ + void print(void) { r32.print(); } + + RegDEBUGReadPointer_t() + { + /** @brief constructor for @ref DEBUG_t.ReadPointer. */ + r32.setName("ReadPointer"); + bits.offset.setBaseRegister(&r32); + bits.offset.setName("offset"); + } + RegDEBUGReadPointer_t& operator=(const RegDEBUGReadPointer_t& other) + { + r32 = other.r32; + return *this; + } +#endif /* CXX_SIMULATOR */ +} RegDEBUGReadPointer_t; + +#define REG_DEBUG_BUFFER ((volatile APE_DEBUG_H_uint32_t*)0x60221008) /* Debug memory */ +#define DEBUG_BUFFER_ALL_SHIFT 0u +#define DEBUG_BUFFER_ALL_MASK 0xffffffffu +#define GET_DEBUG_BUFFER_ALL(__reg__) (((__reg__) & 0xffffffff) >> 0u) +#define SET_DEBUG_BUFFER_ALL(__val__) (((__val__) << 0u) & 0xffffffffu) + +/** @brief Register definition for @ref DEBUG_t.Buffer. */ +typedef register_container RegDEBUGBuffer_t { + /** @brief 32bit direct register access. */ + APE_DEBUG_H_uint32_t r32; + + BITFIELD_BEGIN(APE_DEBUG_H_uint32_t, bits) +#if defined(__LITTLE_ENDIAN__) + /** @brief All bits */ + BITFIELD_MEMBER(APE_DEBUG_H_uint32_t, all, 0, 32) +#elif defined(__BIG_ENDIAN__) + /** @brief All bits */ + BITFIELD_MEMBER(APE_DEBUG_H_uint32_t, all, 0, 32) +#else +#error Unknown Endian +#endif + BITFIELD_END(APE_DEBUG_H_uint32_t, bits) +#ifdef CXX_SIMULATOR + /** @brief Register name for use with the simulator. */ + const char* getName(void) { return "Buffer"; } + + /** @brief Print register value. */ + void print(void) { r32.print(); } + + RegDEBUGBuffer_t() + { + /** @brief constructor for @ref DEBUG_t.Buffer. */ + r32.setName("Buffer"); + bits.all.setBaseRegister(&r32); + bits.all.setName("all"); + } + RegDEBUGBuffer_t& operator=(const RegDEBUGBuffer_t& other) + { + r32 = other.r32; + return *this; + } +#endif /* CXX_SIMULATOR */ +} RegDEBUGBuffer_t; + +/** @brief Component definition for @ref DEBUG. */ +typedef struct DEBUG_t { + /** @brief Offset in the debug buffer to write data. */ + RegDEBUGWritePointer_t WritePointer; + + /** @brief Offset in the debug buffer to read data. */ + RegDEBUGReadPointer_t ReadPointer; + + /** @brief Debug memory */ + RegDEBUGBuffer_t Buffer[1022]; + +#ifdef CXX_SIMULATOR + DEBUG_t() + { + WritePointer.r32.setComponentOffset(0x0); + ReadPointer.r32.setComponentOffset(0x4); + for(int i = 0; i < 1022; i++) + { + Buffer[i].r32.setComponentOffset(0x8 + (i * 4)); + } + } + void print() + { + WritePointer.print(); + ReadPointer.print(); + for(int i = 0; i < 1022; i++) + { + Buffer[i].print(); + } + } + typedef uint32_t (*callback_t)(uint32_t, uint32_t, void*); + callback_t mIndexReadCallback; + void* mIndexReadCallbackArgs; + + callback_t mIndexWriteCallback; + void* mIndexWriteCallbackArgs; + + uint32_t read(int offset) { return mIndexReadCallback(0, offset, mIndexReadCallbackArgs); } + void write(int offset, uint32_t value) { (void)mIndexWriteCallback(value, offset, mIndexWriteCallbackArgs); } +#endif /* CXX_SIMULATOR */ +} DEBUG_t; + +/** @brief Device SHM Registers, function 1 for debug */ +extern volatile DEBUG_t DEBUG; + + + +#ifdef CXX_SIMULATOR /* Compiling c++ code - uses register wrappers */ +#undef volatile +#endif /* CXX_SIMULATOR */ + +#undef register_container +#undef BITFIELD_BEGIN +#undef BITFIELD_MEMBER +#undef BITFIELD_END + +#endif /* !APE_DEBUG_H */ + +/** @} */ |

