24#if LIBXR_HPM_I2C_SUPPORTED
27namespace HPMI2CPlatform
30constexpr uint8_t kInvalidDmaSource = 0xFFU;
31constexpr int32_t kInvalidIndex = -1;
32constexpr int32_t kInvalidIrq = -1;
42#if defined(HPM_DMA_SRC_I2C0)
43#define LIBXR_HPM_I2C_DMA_SRC_0 HPM_DMA_SRC_I2C0
45#define LIBXR_HPM_I2C_DMA_SRC_0 kInvalidDmaSource
47#if defined(HPM_DMA_SRC_I2C1)
48#define LIBXR_HPM_I2C_DMA_SRC_1 HPM_DMA_SRC_I2C1
50#define LIBXR_HPM_I2C_DMA_SRC_1 kInvalidDmaSource
52#if defined(HPM_DMA_SRC_I2C2)
53#define LIBXR_HPM_I2C_DMA_SRC_2 HPM_DMA_SRC_I2C2
55#define LIBXR_HPM_I2C_DMA_SRC_2 kInvalidDmaSource
57#if defined(HPM_DMA_SRC_I2C3)
58#define LIBXR_HPM_I2C_DMA_SRC_3 HPM_DMA_SRC_I2C3
60#define LIBXR_HPM_I2C_DMA_SRC_3 kInvalidDmaSource
62#if defined(HPM_DMA_SRC_I2C4)
63#define LIBXR_HPM_I2C_DMA_SRC_4 HPM_DMA_SRC_I2C4
65#define LIBXR_HPM_I2C_DMA_SRC_4 kInvalidDmaSource
67#if defined(HPM_DMA_SRC_I2C5)
68#define LIBXR_HPM_I2C_DMA_SRC_5 HPM_DMA_SRC_I2C5
70#define LIBXR_HPM_I2C_DMA_SRC_5 kInvalidDmaSource
72#if defined(HPM_DMA_SRC_I2C6)
73#define LIBXR_HPM_I2C_DMA_SRC_6 HPM_DMA_SRC_I2C6
75#define LIBXR_HPM_I2C_DMA_SRC_6 kInvalidDmaSource
77#if defined(HPM_DMA_SRC_I2C7)
78#define LIBXR_HPM_I2C_DMA_SRC_7 HPM_DMA_SRC_I2C7
80#define LIBXR_HPM_I2C_DMA_SRC_7 kInvalidDmaSource
84#define LIBXR_HPM_I2C_IRQ_0 IRQn_I2C0
86#define LIBXR_HPM_I2C_IRQ_0 kInvalidIrq
89#define LIBXR_HPM_I2C_IRQ_1 IRQn_I2C1
91#define LIBXR_HPM_I2C_IRQ_1 kInvalidIrq
94#define LIBXR_HPM_I2C_IRQ_2 IRQn_I2C2
96#define LIBXR_HPM_I2C_IRQ_2 kInvalidIrq
99#define LIBXR_HPM_I2C_IRQ_3 IRQn_I2C3
101#define LIBXR_HPM_I2C_IRQ_3 kInvalidIrq
103#if defined(IRQn_I2C4)
104#define LIBXR_HPM_I2C_IRQ_4 IRQn_I2C4
106#define LIBXR_HPM_I2C_IRQ_4 kInvalidIrq
108#if defined(IRQn_I2C5)
109#define LIBXR_HPM_I2C_IRQ_5 IRQn_I2C5
111#define LIBXR_HPM_I2C_IRQ_5 kInvalidIrq
113#if defined(IRQn_I2C6)
114#define LIBXR_HPM_I2C_IRQ_6 IRQn_I2C6
116#define LIBXR_HPM_I2C_IRQ_6 kInvalidIrq
118#if defined(IRQn_I2C7)
119#define LIBXR_HPM_I2C_IRQ_7 IRQn_I2C7
121#define LIBXR_HPM_I2C_IRQ_7 kInvalidIrq
124#define LIBXR_HPM_I2C_RESOURCE_ENTRY(index_value) \
125 {HPM_I2C##index_value, static_cast<int32_t>(index_value), \
126 static_cast<uint8_t>(LIBXR_HPM_I2C_DMA_SRC_##index_value), \
127 static_cast<int32_t>(LIBXR_HPM_I2C_IRQ_##index_value)}
129static const Resource kResources[] = {
131 LIBXR_HPM_I2C_RESOURCE_ENTRY(0),
134 LIBXR_HPM_I2C_RESOURCE_ENTRY(1),
137 LIBXR_HPM_I2C_RESOURCE_ENTRY(2),
140 LIBXR_HPM_I2C_RESOURCE_ENTRY(3),
143 LIBXR_HPM_I2C_RESOURCE_ENTRY(4),
146 LIBXR_HPM_I2C_RESOURCE_ENTRY(5),
149 LIBXR_HPM_I2C_RESOURCE_ENTRY(6),
152 LIBXR_HPM_I2C_RESOURCE_ENTRY(7),
154 {
nullptr, kInvalidIndex, kInvalidDmaSource, kInvalidIrq},
157#undef LIBXR_HPM_I2C_RESOURCE_ENTRY
158#undef LIBXR_HPM_I2C_IRQ_7
159#undef LIBXR_HPM_I2C_IRQ_6
160#undef LIBXR_HPM_I2C_IRQ_5
161#undef LIBXR_HPM_I2C_IRQ_4
162#undef LIBXR_HPM_I2C_IRQ_3
163#undef LIBXR_HPM_I2C_IRQ_2
164#undef LIBXR_HPM_I2C_IRQ_1
165#undef LIBXR_HPM_I2C_IRQ_0
166#undef LIBXR_HPM_I2C_DMA_SRC_7
167#undef LIBXR_HPM_I2C_DMA_SRC_6
168#undef LIBXR_HPM_I2C_DMA_SRC_5
169#undef LIBXR_HPM_I2C_DMA_SRC_4
170#undef LIBXR_HPM_I2C_DMA_SRC_3
171#undef LIBXR_HPM_I2C_DMA_SRC_2
172#undef LIBXR_HPM_I2C_DMA_SRC_1
173#undef LIBXR_HPM_I2C_DMA_SRC_0
175static const Resource* Find(I2C_Type* i2c)
182 for (
size_t i = 0U; i < (
sizeof(kResources) /
sizeof(kResources[0])); ++i)
184 if (i2c == kResources[i].base)
186 return &kResources[i];
192static uint8_t ResolveBoardI2cDmaSource(I2C_Type* i2c)
194#if LIBXR_HPM_I2C_HAS_BOARD_HELPER
195#ifdef BOARD_APP_I2C_BASE
196 if (i2c == BOARD_APP_I2C_BASE)
198 return BOARD_APP_I2C_DMA_SRC;
203 const Resource* resource = Find(i2c);
204 return resource !=
nullptr ? resource->dma_source : kInvalidDmaSource;
207static int32_t ResolveI2cIndex(I2C_Type* i2c)
209 const Resource* resource = Find(i2c);
210 return resource !=
nullptr ? resource->index : kInvalidIndex;
213static int32_t ResolveBoardI2cIrq(I2C_Type* i2c)
215#if LIBXR_HPM_I2C_HAS_BOARD_HELPER
216#ifdef BOARD_APP_I2C_BASE
217 if (i2c == BOARD_APP_I2C_BASE)
219 return BOARD_APP_I2C_IRQ;
224 const Resource* resource = Find(i2c);
225 return resource !=
nullptr ? resource->irq : kInvalidIrq;
HPM I2C 主机驱动适配头文件 / Adapter header for the HPM I2C master driver.