• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Nanjing Xiaoxiongpai Intelligent Technology Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef __STM32MP1_ADC_H__
17 #define __STM32MP1_ADC_H__
18 
19 #include "adc_core.h"
20 
21 #ifdef __cplusplus
22 #if __cplusplus
23 extern "C" {
24 #endif /* __cplusplus */
25 #endif /* __cplusplus */
26 
27 #define MP1XX_ADC_CHANNEL_COUNT_MAX          20
28 
29 #define MP1_ADC_PIN_DATA_WIDTH               2
30 #define MP1XX_ADC_GPIO_A                     0
31 #define MP1XX_ADC_GPIO_B                     1
32 #define MP1XX_ADC_GPIO_C                     2
33 #define MP1XX_ADC_GPIO_D                     3
34 #define MP1XX_ADC_GPIO_E                     4
35 #define MP1XX_ADC_GPIO_F                     5
36 #define MP1XX_ADC_INJECTED_CHANNEL_TAG       253
37 #define MP1XX_ADC_DEDICATED_PIN_TAG          254
38 #define MP1XX_ADC_UNAVAILABLE_CHANNEL_TAG    255
39 
40 #define MP1XX_ADC_DEVICE_1                   1
41 #define MP1XX_ADC_DEVICE_2                   2
42 
43 /* EACH ADC REGISITERS OFFSET */
44 #define MP1XX_ADC_ISR_OFFSET           0x00  // ADC 中断和状态寄存器 (ADC_ISR)
45 #define MP1XX_ADC_IER_OFFSET           0x04  // ADC 中断使能寄存器(ADC_IER)
46 #define MP1XX_ADC_CR_OFFSET            0x08  // ADC 控制寄存器(ADC_CR)
47 #define MP1XX_ADC_CFGR_OFFSET          0x0C  // ADC 配置寄存器(ADC_CFGR)
48 #define MP1XX_ADC_CFGR2_OFFSET         0x10  // ADC 配置寄存器 2 (ADC_CFGR2)
49 #define MP1XX_ADC_SMPR1_OFFSET         0x14  // ADC 采样时间寄存器 1 (ADC_SMPR1)
50 #define MP1XX_ADC_SMPR2_OFFSET         0x18  // ADC 采样时间寄存器 2 (ADC_SMPR2)
51 #define MP1XX_ADC_PCSEL_OFFSET         0x1C  // ADC 通道预选寄存器(ADC_PCSEL)
52 #define MP1XX_ADC_LTR1_OFFSET          0x20  // ADC 看门狗阈值寄存器 1 (ADC_LTR1)
53 #define MP1XX_ADC_HTR1_OFFSET          0x24  // ADC 看门狗阈值寄存器 1 (ADC_HTR1)
54 #define MP1XX_ADC_SQR1_OFFSET          0x30  // ADC 常规序列寄存器 1 (ADC_SQR1)
55 #define MP1XX_ADC_SQR2_OFFSET          0x34  // ADC 常规序列寄存器 2 (ADC_SQR2)
56 #define MP1XX_ADC_SQR3_OFFSET          0x38  // ADC 常规序列寄存器 3 (ADC_SQR3)
57 #define MP1XX_ADC_SQR4_OFFSET          0x3C  // ADC 常规序列寄存器 4 (ADC_SQR4)
58 #define MP1XX_ADC_DR_OFFSET            0x40  // ADC 常规数据寄存器 (ADC_DR)
59 #define MP1XX_ADC_JSQR_OFFSET          0x4C  // ADC 注入序列寄存器 (ADC_JSQR)
60 #define MP1XX_ADC_OFR1_OFFSET          0x60  // ADC 注入通道 y 偏移寄存器 (ADC_OFR1)
61 #define MP1XX_ADC_OFR2_OFFSET          0x64  // ADC 注入通道 y 偏移寄存器 (ADC_OFR2)
62 #define MP1XX_ADC_OFR3_OFFSET          0x68  // ADC 注入通道 y 偏移寄存器 (ADC_OFR3)
63 #define MP1XX_ADC_OFR4_OFFSET          0x6C  // ADC 注入通道 y 偏移寄存器 (ADC_OFR4)
64 #define MP1XX_ADC_JDR1_OFFSET          0x80  // ADC 注入通道 y 数据寄存器 (ADC_JDR1)
65 #define MP1XX_ADC_JDR2_OFFSET          0x84  // ADC 注入通道 y 数据寄存器 (ADC_JDR2)
66 #define MP1XX_ADC_JDR3_OFFSET          0x88  // ADC 注入通道 y 数据寄存器 (ADC_JDR3)
67 #define MP1XX_ADC_JDR4_OFFSET          0x8C  // ADC 注入通道 y 数据寄存器 (ADC_JDR4)
68 #define MP1XX_ADC_AWD2CR_OFFSET        0xA0  // ADC 模拟看门狗 2 配置寄存器 (ADC_AWD2CR)
69 #define MP1XX_ADC_AWD3CR_OFFSET        0xA4  // ADC 模拟看门狗 3 配置寄存器 (ADC_AWD3CR)
70 #define MP1XX_ADC_LTR2_OFFSET          0xB0  // ADC 看门狗阈值下限寄存器 2 (ADC_LTR2)
71 #define MP1XX_ADC_HTR2_OFFSET          0xB4  // ADC 看门狗高阈值寄存器 2 (ADC_HTR2)
72 #define MP1XX_ADC_LTR3_OFFSET          0xB8  // ADC 看门狗阈值下限寄存器 3 (ADC_LTR3)
73 #define MP1XX_ADC_HTR3_OFFSET          0xBC  // ADC 看门狗高阈值寄存器 3 (ADC_HTR3)
74 #define MP1XX_ADC_DIFSEL_OFFSET        0xC0  // ADC 差分模式选择寄存器(ADC_DIFSEL)
75 #define MP1XX_ADC_CALFACT_OFFSET       0xC4  // ADC 校准因子寄存器 (ADC_CALFACT)
76 #define MP1XX_ADC_CALFACT2_OFFSET      0xC8  // ADC 校准因子寄存器 2 (ADC_CALFACT2)
77 #define MP1XX_ADC_OR_OFFSET            0xD0  // ADC2 选项寄存器(ADC2_OR)
78 
79 /* MASTER AND SLAVE ADC COMMON REGISITERS OFFSET */
80 #define MP1XX_ADC_COMMON_REG_BASE      0x48003300
81 #define MP1XX_ADC_COMMON_REG_SIZE      0x100
82 #define MP1XX_ADC_CCR_OFFSET           0x08
83 #define MP1XX_ADC_CSR_OFFSET           0x00   // ADC 通用状态寄存器(ADC_CSR)
84 #define MP1XX_ADC_CCR_OFFSET           0x08   // ADC 通用控制寄存器(ADC_CCR)
85 #define MP1XX_ADC_CDR_OFFSET           0x0C   // ADC 双模通用常规数据寄存器 (ADC_CDR)
86 #define MP1XX_ADC_CDR2_OFFSET          0x10   // 32位双模ADC常用常规数据寄存器 (ADC_CDR2)
87 #define MP1XX_ADC_HWCFGR0_OFFSET       0x3F0  // ADC 硬件配置寄存器(ADC_HWCFGR0)
88 #define MP1XX_ADC_VERR_OFFSET          0x3F4  // ADC 版本寄存器(ADC_VERR)
89 #define MP1XX_ADC_IPDR_OFFSET          0x3F8  // ADC 识别寄存器(ADC_IPIDR)
90 #define MP1XX_ADC_SIDR_OFFSET          0x3FC  // ADC 大小识别寄存器(ADC_SIDR)
91 
92 #define MP1XX_GPIO_BASE                0x50003000
93 #define MP1XX_GPIO_GROUP_SIZE          0x1000
94 #define MP1XX_GPIO_GROUP_NUMBER        11
95 #define MP1XX_GPIO_MODE_REG_OFFSET     0x0
96 #define MP1XX_GPIO_ANALOG_MODE_MASK    0x3
97 #define MP1XX_GPIO_REG_PIN_SHIFT       2
98 
99 #define MP1XX_ADC_DEVICE_2             2
100 #define MP1XX_ADC_DATA_WIDTH_MAX       16
101 #define MP1XX_CHANNLE_NUM_PER_REG      10
102 #define MP1XX_SAMPLE_TIME_MASK         0x7
103 #define MP1XX_SAMPLE_TIME_BITS         3
104 #define MP1XX_ADC_JQDIS_SHIFT          31
105 #define MP1XX_ADC_SQ1_SHIFT            6
106 #define MP1XX_ADC_ADCAL_SHIFT          31
107 #define MP1XX_ADC_ADSTART_SHIFT        2
108 #define MP1XX_ADC_ENABLE               0x1
109 #define MP1XX_ADC_EOC_MASK             (0x1 << 2)
110 #define MP1XX_ADC_REGULATOR_EN         (0x1 << 28)
111 #define MP1XX_ADC_REGULATOR_RDY_SHIFT  12
112 #define MP1XX_ADC_CKMODE_SEL           (0x2 << 16)
113 #define MP1XX_ADC_CONV_TIME_OUT        100
114 #define MP1XX_ADC_CAL_TIME_OUT         10
115 #define MP1XX_ADC_VDDCORE_CHANNEL      19
116 #define MP1XX_ADC_VREF_CHANNEL         18
117 #define MP1XX_ADC_TSEN_CHANNEL         17
118 #define MP1XX_ADC_VBAT_CHANNEL         16
119 #define MP1XX_ADC_VREF_SHIFT           22
120 #define MP1XX_ADC_TSEN_SHIFT           23
121 #define MP1XX_ADC_VBAT_SHIFT           24
122 
123 struct Mp1xxAdcDevice {
124     struct AdcDevice device;
125     uint32_t regBasePhy;
126     volatile unsigned char  *regBase;
127     uint32_t regSize;
128     uint32_t devNum;
129     uint32_t dataWidth;
130     uint32_t sampleTime;
131     bool adcEnable;
132     uint8_t validChannel[MP1XX_ADC_CHANNEL_COUNT_MAX];
133     uint8_t pins[MP1XX_ADC_CHANNEL_COUNT_MAX * MP1_ADC_PIN_DATA_WIDTH];
134 };
135 
136 #ifdef __cplusplus
137 #if __cplusplus
138 }
139 #endif /* __cplusplus */
140 #endif /* __cplusplus */
141 
142 #endif /* __STM32MP1_ADC_H__ */
143