Pico Core
Loading...
Searching...
No Matches
core_registers.h
Go to the documentation of this file.
1#ifndef REGISTERS_H
2#define REGISTERS_H
3#include <stdint.h>
4#include <reg_types.h>
5#include <core_reg_bits.h>
6#include <cstring> // for strcpy
7
8static const uint8_t CORE_REG_COUNT = 18;
9
10#define APP_REG_START_ADDRESS (32)
11
12// R_OPERATION_CTRL bitfields.
13#define DUMP_OFFSET (3)
14#define MUTE_RPL_OFFSET (4)
15#define VISUAL_EN_OFFSET (5)
16#define OPLEDEN_OFFSET (6)
17#define ALIVE_EN_OFFSET (7)
18
19// RESET_DEV bitfields
20#define RST_DEV_OFFSET (0)
21#define RST_DFU_OFFSET (5)
22#define BOOT_DEF_OFFSET (6)
23#define BOOT_EE_OFFSET (7)
24
29enum op_mode_t: uint8_t
30{
32 ACTIVE = 1,
34 SPEED = 3
35};
36
41enum RegName : uint8_t
42{
44 HW_VERSION_H = 1, // major hardware version
45 HW_VERSION_L = 2, // minor hardware version
59 UUID = 16,
60 TAG = 17,
61};
62
63
64// Byte-align struct data so we can send it out serially byte-by-byte.
65#pragma pack(push, 1)
67{
68 const uint16_t R_WHO_AM_I;
69 const uint8_t R_HW_VERSION_H;
70 const uint8_t R_HW_VERSION_L;
71 const uint8_t R_ASSEMBLY_VERSION;
72 const uint8_t R_HARP_VERSION_H;
73 const uint8_t R_HARP_VERSION_L ;
74 const uint8_t R_FW_VERSION_H;
75 const uint8_t R_FW_VERSION_L;
76 volatile uint32_t R_TIMESTAMP_SECOND;
77 volatile uint16_t R_TIMESTAMP_MICRO;
78 volatile uint8_t R_OPERATION_CTRL;
79 volatile uint8_t R_RESET_DEF;
80 volatile char R_DEVICE_NAME[25];
81 volatile uint16_t R_SERIAL_NUMBER;
82 volatile uint8_t R_CLOCK_CONFIG;
83 volatile uint8_t R_TIMESTAMP_OFFSET;
84 uint8_t R_UUID[16];
85 uint8_t R_TAG[8];
86};
87#pragma pack(pop)
88
90{
91 volatile uint8_t* const base_ptr;
92 const uint8_t num_bytes;
94};
95
97{
98 public:
99 Registers(uint16_t who_am_i,
100 uint8_t hw_version_major, uint8_t hw_version_minor,
101 uint8_t assembly_version,
102 uint8_t harp_version_major, uint8_t harp_version_minor,
103 uint8_t fw_version_major, uint8_t fw_version_minor,
104 uint16_t serial_number, const char name[],
105 const uint8_t tag[]);
106 ~Registers();
107
109
110 // Lookup table. Necessary because register data is not of equal size,
111 // so we can't index into it directly by enum.
112 // TODO: consider generating this table statically with a template.
114 {{(uint8_t*)&regs_.R_WHO_AM_I, sizeof(regs_.R_WHO_AM_I), U16},
115 {(uint8_t*)&regs_.R_HW_VERSION_H, sizeof(regs_.R_HW_VERSION_H), U8},
116 {(uint8_t*)&regs_.R_HW_VERSION_L, sizeof(regs_.R_HW_VERSION_L), U8},
117 {(uint8_t*)&regs_.R_ASSEMBLY_VERSION, sizeof(regs_.R_ASSEMBLY_VERSION), U8},
118 {(uint8_t*)&regs_.R_HARP_VERSION_H, sizeof(regs_.R_HARP_VERSION_H), U8},
119 {(uint8_t*)&regs_.R_HARP_VERSION_L, sizeof(regs_.R_HW_VERSION_L), U8},
120 {(uint8_t*)&regs_.R_FW_VERSION_H, sizeof(regs_.R_FW_VERSION_H), U8},
121 {(uint8_t*)&regs_.R_FW_VERSION_L, sizeof(regs_.R_FW_VERSION_L), U8},
122 {(uint8_t*)&regs_.R_TIMESTAMP_SECOND, sizeof(regs_.R_TIMESTAMP_SECOND), U32},
123 {(uint8_t*)&regs_.R_TIMESTAMP_MICRO, sizeof(regs_.R_TIMESTAMP_MICRO), U16},
124 {(uint8_t*)&regs_.R_OPERATION_CTRL, sizeof(regs_.R_OPERATION_CTRL), U8},
125 {(uint8_t*)&regs_.R_RESET_DEF, sizeof(regs_.R_RESET_DEF), U8},
126 {(uint8_t*)&regs_.R_DEVICE_NAME, sizeof(regs_.R_DEVICE_NAME), U8},
127 {(uint8_t*)&regs_.R_SERIAL_NUMBER, sizeof(regs_.R_SERIAL_NUMBER), U16},
128 {(uint8_t*)&regs_.R_CLOCK_CONFIG, sizeof(regs_.R_CLOCK_CONFIG), U8},
129 {(uint8_t*)&regs_.R_TIMESTAMP_OFFSET, sizeof(regs_.R_TIMESTAMP_OFFSET), U8},
130 {(uint8_t*)&regs_.R_UUID, sizeof(regs_.R_UUID), U8},
131 {(uint8_t*)&regs_.R_TAG, sizeof(regs_.R_TAG), U8},
132 };
133
134 // Syntactic Sugar. Make bitfields for certain registers easier to access.
138};
139
140#endif //REGISTERS_H
static const uint8_t CORE_REG_COUNT
Definition core_registers.h:8
RegName
enum where the name is the name of the register and the value is the address according to the harp pr...
Definition core_registers.h:42
@ ASSEMBLY_VERSION
Definition core_registers.h:46
@ WHO_AM_I
Definition core_registers.h:43
@ HW_VERSION_L
Definition core_registers.h:45
@ TIMESTAMP_SECOND
Definition core_registers.h:51
@ SERIAL_NUMBER
Definition core_registers.h:56
@ FW_VERSION_L
Definition core_registers.h:50
@ TIMESTAMP_OFFSET
Definition core_registers.h:58
@ DEVICE_NAME
Definition core_registers.h:55
@ HARP_VERSION_H
Definition core_registers.h:47
@ UUID
Definition core_registers.h:59
@ TAG
Definition core_registers.h:60
@ CLOCK_CONFIG
Definition core_registers.h:57
@ TIMESTAMP_MICRO
Definition core_registers.h:52
@ HW_VERSION_H
Definition core_registers.h:44
@ RESET_DEF
Definition core_registers.h:54
@ HARP_VERSION_L
Definition core_registers.h:48
@ FW_VERSION_H
Definition core_registers.h:49
@ OPERATION_CTRL
Definition core_registers.h:53
op_mode_t
enum for easier interpretation of the OP_MODE bitfield in the R_OPERATION_CTRL register.
Definition core_registers.h:30
@ SPEED
Definition core_registers.h:34
@ ACTIVE
Definition core_registers.h:32
@ STANDBY
Definition core_registers.h:31
@ RESERVED
Definition core_registers.h:33
reg_type_t
Definition reg_types.h:11
@ U8
Definition reg_types.h:12
@ U32
Definition reg_types.h:16
@ U16
Definition reg_types.h:14
Definition core_reg_bits.h:29
Definition core_reg_bits.h:7
Definition core_registers.h:90
const reg_type_t payload_type
Definition core_registers.h:93
const uint8_t num_bytes
Definition core_registers.h:92
volatile uint8_t *const base_ptr
Definition core_registers.h:91
Definition core_registers.h:67
volatile uint32_t R_TIMESTAMP_SECOND
Definition core_registers.h:76
uint8_t R_TAG[8]
Definition core_registers.h:85
volatile uint8_t R_TIMESTAMP_OFFSET
Definition core_registers.h:83
const uint8_t R_HW_VERSION_H
Definition core_registers.h:69
volatile uint16_t R_SERIAL_NUMBER
Definition core_registers.h:81
volatile uint8_t R_OPERATION_CTRL
Definition core_registers.h:78
const uint16_t R_WHO_AM_I
Definition core_registers.h:68
const uint8_t R_ASSEMBLY_VERSION
Definition core_registers.h:71
volatile uint8_t R_RESET_DEF
Definition core_registers.h:79
volatile uint8_t R_CLOCK_CONFIG
Definition core_registers.h:82
const uint8_t R_FW_VERSION_H
Definition core_registers.h:74
const uint8_t R_HARP_VERSION_L
Definition core_registers.h:73
volatile char R_DEVICE_NAME[25]
Definition core_registers.h:80
const uint8_t R_HARP_VERSION_H
Definition core_registers.h:72
const uint8_t R_HW_VERSION_L
Definition core_registers.h:70
uint8_t R_UUID[16]
Definition core_registers.h:84
const uint8_t R_FW_VERSION_L
Definition core_registers.h:75
volatile uint16_t R_TIMESTAMP_MICRO
Definition core_registers.h:77
Definition core_registers.h:97
ClockConfigBits & r_clock_config_bits
Definition core_registers.h:137
~Registers()
Definition core_registers.cpp:28
RegValues regs_
Definition core_registers.h:108
const RegSpecs address_to_specs[CORE_REG_COUNT]
Definition core_registers.h:113
Registers(uint16_t who_am_i, uint8_t hw_version_major, uint8_t hw_version_minor, uint8_t assembly_version, uint8_t harp_version_major, uint8_t harp_version_minor, uint8_t fw_version_major, uint8_t fw_version_minor, uint16_t serial_number, const char name[], const uint8_t tag[])
Definition core_registers.cpp:3
ResetDefBits & r_reset_def_bits
Definition core_registers.h:136
OperationCtrlBits & r_operation_ctrl_bits
Definition core_registers.h:135
Definition core_reg_bits.h:19