-
-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathicu_mgr.hpp
136 lines (121 loc) · 4.45 KB
/
icu_mgr.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma once
//=========================================================================//
/*! @file
@brief RX621/RX62N グループ・割り込みマネージャー
@author 平松邦仁 ([email protected])
@copyright Copyright (C) 2016, 2024 Kunihito Hiramatsu @n
Released under the MIT license @n
https://github.com/hirakuni45/RX/blob/master/LICENSE
*/
//=========================================================================//
#include "common/device.hpp"
#include "RX600/icu_utils.hpp"
namespace device {
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 割り込みマネージャー・クラス
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
struct icu_mgr {
//-----------------------------------------------------------------//
/*!
@brief 割り込みタスクを設定
@param[in] vec 割り込み要因
@param[in] task 割り込みタスク
*/
//-----------------------------------------------------------------//
static void set_task(ICU::VECTOR vec, icu_utils::ITASK task) noexcept {
set_interrupt_task(task, static_cast<uint32_t>(vec));
}
//-----------------------------------------------------------------//
/*!
@brief 割り込みを設定する(ベクター別)
@param[in] vec 割り込みベクター
@param[in] lvl 割り込みレベル(0の場合、割り込み禁止)
*/
//-----------------------------------------------------------------//
static void set_level(ICU::VECTOR vec, ICU::LEVEL lvl) noexcept
{
bool ena = lvl != ICU::LEVEL::NONE ? true : false;
ICU::IER.enable(vec, 0);
ICU::IPR[vec] = static_cast<uint8_t>(lvl);
ICU::IER.enable(vec, ena);
}
//-----------------------------------------------------------------//
/*!
@brief 割り込みレベルを取得する
@param[in] vec 割り込み要因
@return 割り込みレベル
*/
//-----------------------------------------------------------------//
static auto get_level(ICU::VECTOR vec) noexcept {
return static_cast<ICU::LEVEL>(ICU::IPR[vec]);
}
//-----------------------------------------------------------------//
/*!
@brief 割り込み設定(通常ベクター)
@param[in] vec 割り込み要因
@param[in] task 割り込みタスク
@param[in] lvl 割り込みレベル(0の場合、割り込み禁止)
@return ベクター番号
*/
//-----------------------------------------------------------------//
static ICU::VECTOR set_interrupt(ICU::VECTOR vec, icu_utils::ITASK task, ICU::LEVEL lvl) noexcept
{
set_task(vec, task);
set_level(vec, lvl);
return vec;
}
//-----------------------------------------------------------------//
/*!
@brief DMAC 要因の設定
@param[in] dma_per DMAC ペリフェラル
@param[in] target DMA 要因のベクター番号
@return 成功なら「true」
*/
//-----------------------------------------------------------------//
static bool set_dmac(peripheral dma_per, ICU::VECTOR target) noexcept
{
switch(dma_per) {
case peripheral::DMAC0:
ICU::DMRSR0 = static_cast<uint8_t>(target);
break;
case peripheral::DMAC1:
ICU::DMRSR1 = static_cast<uint8_t>(target);
break;
case peripheral::DMAC2:
ICU::DMRSR2 = static_cast<uint8_t>(target);
break;
case peripheral::DMAC3:
ICU::DMRSR3 = static_cast<uint8_t>(target);
break;
default:
return false;
break;
}
return true;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief グループ割り込みに対するベクタを返すダミー
@return グループベクターでは無いので「NONE]を返す。
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
static ICU::VECTOR get_group_vector(ICU::VECTOR vec) noexcept
{
return ICU::VECTOR::NONE;
}
//-----------------------------------------------------------------//
/*!
@brief グループ割り込み設定のダミー
@param[in] idx インデックス
@param[in] task 割り込みタスク(※nullptr なら無効)
@return グループ割り込み以外なら「false」
*/
//-----------------------------------------------------------------//
static bool install_group_task(ICU::VECTOR idx, icu_utils::GTASK task) noexcept
{
return false;
}
};
}