Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Committer:
RuslanUrya
Date:
Sat Apr 14 10:25:32 2018 +0000
Revision:
0:dfe6edabb8ec
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RuslanUrya 0:dfe6edabb8ec 1 /*
RuslanUrya 0:dfe6edabb8ec 2 * Bosch C_CAN controller API.
RuslanUrya 0:dfe6edabb8ec 3 *
RuslanUrya 0:dfe6edabb8ec 4 * Copyright (C) 2015 Pavel Kirienko <pavel.kirienko@gmail.com>
RuslanUrya 0:dfe6edabb8ec 5 */
RuslanUrya 0:dfe6edabb8ec 6
RuslanUrya 0:dfe6edabb8ec 7 #pragma once
RuslanUrya 0:dfe6edabb8ec 8
RuslanUrya 0:dfe6edabb8ec 9 #include <cstdint>
RuslanUrya 0:dfe6edabb8ec 10 #include <cstddef>
RuslanUrya 0:dfe6edabb8ec 11
RuslanUrya 0:dfe6edabb8ec 12 namespace uavcan_lpc11c24
RuslanUrya 0:dfe6edabb8ec 13 {
RuslanUrya 0:dfe6edabb8ec 14 namespace c_can
RuslanUrya 0:dfe6edabb8ec 15 {
RuslanUrya 0:dfe6edabb8ec 16
RuslanUrya 0:dfe6edabb8ec 17 struct MsgIfaceType
RuslanUrya 0:dfe6edabb8ec 18 {
RuslanUrya 0:dfe6edabb8ec 19 std::uint32_t CMDREQ;
RuslanUrya 0:dfe6edabb8ec 20
RuslanUrya 0:dfe6edabb8ec 21 union
RuslanUrya 0:dfe6edabb8ec 22 {
RuslanUrya 0:dfe6edabb8ec 23 std::uint32_t W;
RuslanUrya 0:dfe6edabb8ec 24 std::uint32_t R;
RuslanUrya 0:dfe6edabb8ec 25 } CMDMSK;
RuslanUrya 0:dfe6edabb8ec 26
RuslanUrya 0:dfe6edabb8ec 27 std::uint32_t MSK1;
RuslanUrya 0:dfe6edabb8ec 28 std::uint32_t MSK2;
RuslanUrya 0:dfe6edabb8ec 29
RuslanUrya 0:dfe6edabb8ec 30 std::uint32_t ARB1;
RuslanUrya 0:dfe6edabb8ec 31 std::uint32_t ARB2;
RuslanUrya 0:dfe6edabb8ec 32
RuslanUrya 0:dfe6edabb8ec 33 std::uint32_t MCTRL;
RuslanUrya 0:dfe6edabb8ec 34
RuslanUrya 0:dfe6edabb8ec 35 std::uint32_t DA1;
RuslanUrya 0:dfe6edabb8ec 36 std::uint32_t DA2;
RuslanUrya 0:dfe6edabb8ec 37 std::uint32_t DB1;
RuslanUrya 0:dfe6edabb8ec 38 std::uint32_t DB2;
RuslanUrya 0:dfe6edabb8ec 39
RuslanUrya 0:dfe6edabb8ec 40 const std::uint32_t _skip[13];
RuslanUrya 0:dfe6edabb8ec 41 };
RuslanUrya 0:dfe6edabb8ec 42
RuslanUrya 0:dfe6edabb8ec 43 static_assert(offsetof(MsgIfaceType, CMDMSK) == 0x04, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 44 static_assert(offsetof(MsgIfaceType, MSK1) == 0x08, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 45 static_assert(offsetof(MsgIfaceType, ARB1) == 0x10, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 46 static_assert(offsetof(MsgIfaceType, MCTRL) == 0x18, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 47 static_assert(offsetof(MsgIfaceType, DA1) == 0x1c, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 48 static_assert(offsetof(MsgIfaceType, DB2) == 0x28, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 49
RuslanUrya 0:dfe6edabb8ec 50 static_assert(sizeof(MsgIfaceType) == 96, "C_CAN size");
RuslanUrya 0:dfe6edabb8ec 51
RuslanUrya 0:dfe6edabb8ec 52
RuslanUrya 0:dfe6edabb8ec 53 struct Type
RuslanUrya 0:dfe6edabb8ec 54 {
RuslanUrya 0:dfe6edabb8ec 55 std::uint32_t CNTL;
RuslanUrya 0:dfe6edabb8ec 56 std::uint32_t STAT;
RuslanUrya 0:dfe6edabb8ec 57 const std::uint32_t EC;
RuslanUrya 0:dfe6edabb8ec 58 std::uint32_t BT;
RuslanUrya 0:dfe6edabb8ec 59 const std::uint32_t INT;
RuslanUrya 0:dfe6edabb8ec 60 std::uint32_t TEST;
RuslanUrya 0:dfe6edabb8ec 61 std::uint32_t BRPE;
RuslanUrya 0:dfe6edabb8ec 62
RuslanUrya 0:dfe6edabb8ec 63 const std::uint32_t _skip_a[1];
RuslanUrya 0:dfe6edabb8ec 64
RuslanUrya 0:dfe6edabb8ec 65 MsgIfaceType IF[2]; // [0] @ 0x020, [1] @ 0x080
RuslanUrya 0:dfe6edabb8ec 66
RuslanUrya 0:dfe6edabb8ec 67 const std::uint32_t _skip_b[8];
RuslanUrya 0:dfe6edabb8ec 68
RuslanUrya 0:dfe6edabb8ec 69 const std::uint32_t TXREQ[2]; // 0x100
RuslanUrya 0:dfe6edabb8ec 70
RuslanUrya 0:dfe6edabb8ec 71 const std::uint32_t _skip_c[6];
RuslanUrya 0:dfe6edabb8ec 72
RuslanUrya 0:dfe6edabb8ec 73 const std::uint32_t ND[2]; // 0x120
RuslanUrya 0:dfe6edabb8ec 74
RuslanUrya 0:dfe6edabb8ec 75 const std::uint32_t _skip_d[6];
RuslanUrya 0:dfe6edabb8ec 76
RuslanUrya 0:dfe6edabb8ec 77 const std::uint32_t IR[2]; // 0x140
RuslanUrya 0:dfe6edabb8ec 78
RuslanUrya 0:dfe6edabb8ec 79 const std::uint32_t _skip_e[6];
RuslanUrya 0:dfe6edabb8ec 80
RuslanUrya 0:dfe6edabb8ec 81 const std::uint32_t MSGV[2]; // 0x160
RuslanUrya 0:dfe6edabb8ec 82
RuslanUrya 0:dfe6edabb8ec 83 const std::uint32_t _skip_f[6];
RuslanUrya 0:dfe6edabb8ec 84
RuslanUrya 0:dfe6edabb8ec 85 std::uint32_t CLKDIV; // 0x180
RuslanUrya 0:dfe6edabb8ec 86 };
RuslanUrya 0:dfe6edabb8ec 87
RuslanUrya 0:dfe6edabb8ec 88 static_assert(offsetof(Type, CNTL) == 0x000, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 89 static_assert(offsetof(Type, STAT) == 0x004, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 90 static_assert(offsetof(Type, TEST) == 0x014, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 91 static_assert(offsetof(Type, BRPE) == 0x018, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 92 static_assert(offsetof(Type, IF[0]) == 0x020, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 93 static_assert(offsetof(Type, IF[1]) == 0x080, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 94 static_assert(offsetof(Type, TXREQ) == 0x100, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 95 static_assert(offsetof(Type, ND) == 0x120, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 96 static_assert(offsetof(Type, IR) == 0x140, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 97 static_assert(offsetof(Type, MSGV) == 0x160, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 98 static_assert(offsetof(Type, CLKDIV) == 0x180, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 99
RuslanUrya 0:dfe6edabb8ec 100 static_assert(offsetof(Type, IF[0].DB2) == 0x048, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 101 static_assert(offsetof(Type, IF[1].DB2) == 0x0A8, "C_CAN offset");
RuslanUrya 0:dfe6edabb8ec 102
RuslanUrya 0:dfe6edabb8ec 103
RuslanUrya 0:dfe6edabb8ec 104 volatile Type& CAN = *reinterpret_cast<volatile Type*>(0x40050000);
RuslanUrya 0:dfe6edabb8ec 105
RuslanUrya 0:dfe6edabb8ec 106
RuslanUrya 0:dfe6edabb8ec 107 /*
RuslanUrya 0:dfe6edabb8ec 108 * CNTL
RuslanUrya 0:dfe6edabb8ec 109 */
RuslanUrya 0:dfe6edabb8ec 110 static constexpr std::uint32_t CNTL_TEST = 1 << 7;
RuslanUrya 0:dfe6edabb8ec 111 static constexpr std::uint32_t CNTL_CCE = 1 << 6;
RuslanUrya 0:dfe6edabb8ec 112 static constexpr std::uint32_t CNTL_DAR = 1 << 5;
RuslanUrya 0:dfe6edabb8ec 113 static constexpr std::uint32_t CNTL_EIE = 1 << 3;
RuslanUrya 0:dfe6edabb8ec 114 static constexpr std::uint32_t CNTL_SIE = 1 << 2;
RuslanUrya 0:dfe6edabb8ec 115 static constexpr std::uint32_t CNTL_IE = 1 << 1;
RuslanUrya 0:dfe6edabb8ec 116 static constexpr std::uint32_t CNTL_INIT = 1 << 0;
RuslanUrya 0:dfe6edabb8ec 117
RuslanUrya 0:dfe6edabb8ec 118 static constexpr std::uint32_t CNTL_IRQ_MASK = CNTL_EIE | CNTL_IE | CNTL_SIE;
RuslanUrya 0:dfe6edabb8ec 119
RuslanUrya 0:dfe6edabb8ec 120 /*
RuslanUrya 0:dfe6edabb8ec 121 * TEST
RuslanUrya 0:dfe6edabb8ec 122 */
RuslanUrya 0:dfe6edabb8ec 123 static constexpr std::uint32_t TEST_RX = 1 << 7;
RuslanUrya 0:dfe6edabb8ec 124 static constexpr std::uint32_t TEST_LBACK = 1 << 4;
RuslanUrya 0:dfe6edabb8ec 125 static constexpr std::uint32_t TEST_SILENT = 1 << 3;
RuslanUrya 0:dfe6edabb8ec 126 static constexpr std::uint32_t TEST_BASIC = 1 << 2;
RuslanUrya 0:dfe6edabb8ec 127 static constexpr std::uint32_t TEST_TX_SHIFT = 5;
RuslanUrya 0:dfe6edabb8ec 128
RuslanUrya 0:dfe6edabb8ec 129 enum class TestTx : std::uint32_t
RuslanUrya 0:dfe6edabb8ec 130 {
RuslanUrya 0:dfe6edabb8ec 131 Controller = 0,
RuslanUrya 0:dfe6edabb8ec 132 SamplePoint = 1,
RuslanUrya 0:dfe6edabb8ec 133 LowDominant = 2,
RuslanUrya 0:dfe6edabb8ec 134 HighRecessive = 3
RuslanUrya 0:dfe6edabb8ec 135 };
RuslanUrya 0:dfe6edabb8ec 136
RuslanUrya 0:dfe6edabb8ec 137 /*
RuslanUrya 0:dfe6edabb8ec 138 * STAT
RuslanUrya 0:dfe6edabb8ec 139 */
RuslanUrya 0:dfe6edabb8ec 140 static constexpr std::uint32_t STAT_BOFF = 1 << 7;
RuslanUrya 0:dfe6edabb8ec 141 static constexpr std::uint32_t STAT_EWARN = 1 << 6;
RuslanUrya 0:dfe6edabb8ec 142 static constexpr std::uint32_t STAT_EPASS = 1 << 5;
RuslanUrya 0:dfe6edabb8ec 143 static constexpr std::uint32_t STAT_RXOK = 1 << 4;
RuslanUrya 0:dfe6edabb8ec 144 static constexpr std::uint32_t STAT_TXOK = 1 << 3;
RuslanUrya 0:dfe6edabb8ec 145 static constexpr std::uint32_t STAT_LEC_MASK = 7;
RuslanUrya 0:dfe6edabb8ec 146 static constexpr std::uint32_t STAT_LEC_SHIFT = 0;
RuslanUrya 0:dfe6edabb8ec 147
RuslanUrya 0:dfe6edabb8ec 148 enum class StatLec : std::uint32_t
RuslanUrya 0:dfe6edabb8ec 149 {
RuslanUrya 0:dfe6edabb8ec 150 NoError = 0,
RuslanUrya 0:dfe6edabb8ec 151 StuffError = 1,
RuslanUrya 0:dfe6edabb8ec 152 FormError = 2,
RuslanUrya 0:dfe6edabb8ec 153 AckError = 3,
RuslanUrya 0:dfe6edabb8ec 154 Bit1Error = 4,
RuslanUrya 0:dfe6edabb8ec 155 Bit0Error = 5,
RuslanUrya 0:dfe6edabb8ec 156 CRCError = 6,
RuslanUrya 0:dfe6edabb8ec 157 Unused = 7
RuslanUrya 0:dfe6edabb8ec 158 };
RuslanUrya 0:dfe6edabb8ec 159
RuslanUrya 0:dfe6edabb8ec 160 /*
RuslanUrya 0:dfe6edabb8ec 161 * IF.CMDREQ
RuslanUrya 0:dfe6edabb8ec 162 */
RuslanUrya 0:dfe6edabb8ec 163 static constexpr std::uint32_t IF_CMDREQ_BUSY = 1 << 15;
RuslanUrya 0:dfe6edabb8ec 164
RuslanUrya 0:dfe6edabb8ec 165 /*
RuslanUrya 0:dfe6edabb8ec 166 * IF.CMDMSK
RuslanUrya 0:dfe6edabb8ec 167 */
RuslanUrya 0:dfe6edabb8ec 168 static constexpr std::uint32_t IF_CMDMSK_W_DATA_A = 1 << 0;
RuslanUrya 0:dfe6edabb8ec 169 static constexpr std::uint32_t IF_CMDMSK_W_DATA_B = 1 << 1;
RuslanUrya 0:dfe6edabb8ec 170 static constexpr std::uint32_t IF_CMDMSK_W_TXRQST = 1 << 2;
RuslanUrya 0:dfe6edabb8ec 171 static constexpr std::uint32_t IF_CMDMSK_W_CTRL = 1 << 4;
RuslanUrya 0:dfe6edabb8ec 172 static constexpr std::uint32_t IF_CMDMSK_W_ARB = 1 << 5;
RuslanUrya 0:dfe6edabb8ec 173 static constexpr std::uint32_t IF_CMDMSK_W_MASK = 1 << 6;
RuslanUrya 0:dfe6edabb8ec 174 static constexpr std::uint32_t IF_CMDMSK_W_WR_RD = 1 << 7;
RuslanUrya 0:dfe6edabb8ec 175
RuslanUrya 0:dfe6edabb8ec 176 /*
RuslanUrya 0:dfe6edabb8ec 177 * IF.MCTRL
RuslanUrya 0:dfe6edabb8ec 178 */
RuslanUrya 0:dfe6edabb8ec 179 static constexpr std::uint32_t IF_MCTRL_NEWDAT = 1 << 15;
RuslanUrya 0:dfe6edabb8ec 180 static constexpr std::uint32_t IF_MCTRL_MSGLST = 1 << 14;
RuslanUrya 0:dfe6edabb8ec 181 static constexpr std::uint32_t IF_MCTRL_INTPND = 1 << 13;
RuslanUrya 0:dfe6edabb8ec 182 static constexpr std::uint32_t IF_MCTRL_UMASK = 1 << 12;
RuslanUrya 0:dfe6edabb8ec 183 static constexpr std::uint32_t IF_MCTRL_TXIE = 1 << 11;
RuslanUrya 0:dfe6edabb8ec 184 static constexpr std::uint32_t IF_MCTRL_RXIE = 1 << 10;
RuslanUrya 0:dfe6edabb8ec 185 static constexpr std::uint32_t IF_MCTRL_RMTEN = 1 << 9;
RuslanUrya 0:dfe6edabb8ec 186 static constexpr std::uint32_t IF_MCTRL_TXRQST = 1 << 8;
RuslanUrya 0:dfe6edabb8ec 187 static constexpr std::uint32_t IF_MCTRL_EOB = 1 << 7;
RuslanUrya 0:dfe6edabb8ec 188 static constexpr std::uint32_t IF_MCTRL_DLC_MASK = 15;
RuslanUrya 0:dfe6edabb8ec 189
RuslanUrya 0:dfe6edabb8ec 190 }
RuslanUrya 0:dfe6edabb8ec 191 }