Skip to content

Commit 6be0a5e

Browse files
committed
[bsp][spacemit/k1] first version
Signed-off-by: GuEe-GUI <2991707448@qq.com>
1 parent 68a5c6a commit 6be0a5e

162 files changed

Lines changed: 29158 additions & 43 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bsp/spacemit/dm/Kconfig

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
SOC_DM_ADC_DIR = $(SOC_DM_DIR)/adc
2+
SOC_DM_CLK_DIR = $(SOC_DM_DIR)/clk
3+
SOC_DM_DMA_DIR = $(SOC_DM_DIR)/dma
4+
SOC_DM_HWCRYPTO_DIR = $(SOC_DM_DIR)/hwcrypto
5+
SOC_DM_HWTIMER_DIR = $(SOC_DM_DIR)/hwtimer
6+
SOC_DM_I2C_DIR = $(SOC_DM_DIR)/i2c
7+
SOC_DM_INPUT_MISC_DIR = $(SOC_DM_DIR)/input/misc
8+
SOC_DM_MBOX_DIR = $(SOC_DM_DIR)/mailbox
9+
SOC_DM_MFD_DIR = $(SOC_DM_DIR)/mfd
10+
SOC_DM_PIC_DIR = $(RTT_DIR)/libcpu/risc-v/common/pic
11+
SOC_DM_PIN_DIR = $(SOC_DM_DIR)/pin
12+
SOC_DM_PINCTRL_DIR = $(SOC_DM_DIR)/pinctrl
13+
SOC_DM_PMDOMAIN_DIR = $(SOC_DM_DIR)/pmdomain
14+
SOC_DM_POWER_RESET_DIR = $(SOC_DM_DIR)/power/reset
15+
SOC_DM_PWM_DIR = $(SOC_DM_DIR)/pwm
16+
SOC_DM_REGULATOR_DIR = $(SOC_DM_DIR)/regulator
17+
SOC_DM_RESET_DIR = $(SOC_DM_DIR)/reset
18+
SOC_DM_RTC_DIR = $(SOC_DM_DIR)/rtc
19+
SOC_DM_SERIAL_DIR = $(SOC_DM_DIR)/serial
20+
SOC_DM_SOC_DIR = $(SOC_DM_DIR)/soc
21+
SOC_DM_SPI_DIR = $(SOC_DM_DIR)/spi
22+
SOC_DM_THERMAL_DIR = $(SOC_DM_DIR)/thermal
23+
SOC_DM_WDT_DIR = $(SOC_DM_DIR)/watchdog

bsp/spacemit/dm/SConscript

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import os
2+
from building import *
3+
4+
cwd = GetCurrentDir()
5+
objs = []
6+
list = os.listdir(cwd)
7+
8+
for d in list:
9+
path = os.path.join(cwd, d)
10+
if os.path.isfile(os.path.join(path, 'SConscript')):
11+
objs = objs + SConscript(os.path.join(d, 'SConscript'))
12+
13+
Return('objs')

bsp/spacemit/dm/adc/Kconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
config RT_ADC_SPACEMIT_PMIC
2+
bool "Spacemit PMIC ADC driver"
3+
depends on RT_USING_DM
4+
depends on RT_USING_ADC
5+
depends on RT_MFD_SPACEMIT_PMIC
6+
default n

bsp/spacemit/dm/adc/SConscript

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from building import *
2+
3+
group = []
4+
cwd = GetCurrentDir()
5+
CPPPATH = [cwd + '/../include']
6+
7+
src = []
8+
9+
if GetDepend(['RT_ADC_SPACEMIT_PMIC']):
10+
src += ['adc-spacemit-pmic.c']
11+
12+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
13+
14+
Return('group')
Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
/*
2+
* Copyright (c) 2006-2024, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2024-5-1 GuEe-GUI first version
9+
*/
10+
11+
#define DBG_TAG "adc.spacemit-pmic"
12+
#define DBG_LVL DBG_INFO
13+
#include <rtdbg.h>
14+
15+
#define __SPACEMIT_ADC_INTERNAL
16+
#include <mfd/spacemit-pmic.h>
17+
18+
struct spacemit_pmic_adc
19+
{
20+
struct rt_adc_device parent;
21+
22+
int irq;
23+
24+
struct spacemit_pmic *pmic;
25+
const struct spacemit_pmic_adc_data *data;
26+
27+
struct rt_mutex lock;
28+
struct rt_completion completion;
29+
};
30+
31+
#define raw_to_spacemit_pmic_adc(raw) rt_container_of(raw, struct spacemit_pmic_adc, parent)
32+
33+
static rt_err_t spacemit_pmic_adc_enabled(struct rt_adc_device *device,
34+
rt_int8_t channel, rt_bool_t enabled)
35+
{
36+
struct spacemit_pmic_adc *pmic_adc = raw_to_spacemit_pmic_adc(device);
37+
38+
if (channel > pmic_adc->data->iio_desc_nr)
39+
{
40+
return -RT_EINVAL;
41+
}
42+
43+
return RT_EOK;
44+
}
45+
46+
static rt_err_t spacemit_pmic_adc_convert(struct rt_adc_device *device,
47+
rt_int8_t channel, rt_uint32_t *value)
48+
{
49+
rt_err_t err;
50+
rt_uint32_t tmp, adc_val_h, adc_val_l;
51+
struct spacemit_pmic_adc *pmic_adc = raw_to_spacemit_pmic_adc(device);
52+
struct spacemit_pmic *pmic = pmic_adc->pmic;
53+
54+
if (channel > pmic_adc->data->iio_desc_nr)
55+
{
56+
return -RT_EINVAL;
57+
}
58+
59+
rt_mutex_take(&pmic_adc->lock, RT_WAITING_FOREVER);
60+
61+
62+
/* Reset the ADC auto register */
63+
spacemit_pmic_update_bits(pmic, SPM8821_ADC_AUTO_REG,
64+
SPM8821_ADC_AUTO_BIT_MSK, 0);
65+
66+
/* Enable the ADC : ADC_CTRL[0] */
67+
spacemit_pmic_update_bits(pmic, SPM8821_ADC_CTRL_REG,
68+
SPM8821_ADC_CTRL_BIT_MSK, (1 << SPM8821_ADC_CTRL_EN_BIT_OFFSET));
69+
70+
/* Choose the channel of adc : ADC_CFG[1] */
71+
spacemit_pmic_update_bits(pmic, SPM8821_ADC_CFG1_REG,
72+
SPM8821_ADC_CFG1_ADC_CHNNL_SEL_BIT_MSK,
73+
(channel + SPM8821_ADC_EXTERNAL_CHANNEL_OFFSET) <<
74+
SPM8821_ADC_CFG1_ADC_CHNNL_SEL_BIT_OFFSET);
75+
76+
/* ADC go */
77+
spacemit_pmic_update_bits(pmic, SPM8821_ADC_CTRL_REG,
78+
SPM8821_ADC_CTRL_BIT_MSK,
79+
(1 << SPM8821_ADC_CTRL_GO_BIT_OFFSET) |
80+
(1 << SPM8821_ADC_CTRL_EN_BIT_OFFSET));
81+
82+
if ((err = rt_completion_wait(&pmic_adc->completion, RT_WAITING_FOREVER)))
83+
{
84+
goto _out_lock;
85+
}
86+
87+
adc_val_h = spacemit_pmic_read(pmic, SPM8821_ADCIN0_RES_H_REG + channel * 2);
88+
adc_val_l = spacemit_pmic_read(pmic, SPM8821_ADCIN0_RES_L_REG + channel * 2);
89+
tmp = spacemit_pmic_read(pmic, SPM8821_VERSION_ID_REG);
90+
91+
*value = (adc_val_h << (__rt_ffs(SPM8821_ADCIN0_REG_L_BIT_MSK) - 1)) |
92+
((adc_val_l & SPM8821_ADCIN0_REG_L_BIT_MSK) >>
93+
(__rt_ffs(SPM8821_ADCIN0_REG_L_BIT_MSK) - 1));
94+
95+
if (tmp == 0)
96+
{
97+
/*
98+
* if the version of P1 is A, the data read from
99+
* the register is the inverse of the real data
100+
* and the conversion accuracy of P1 is 12 bits
101+
*/
102+
*value = 4095 - *value;
103+
}
104+
105+
_out_lock:
106+
rt_mutex_release(&pmic_adc->lock);
107+
108+
return err;
109+
}
110+
111+
static rt_uint8_t spacemit_pmic_adc_get_resolution(struct rt_adc_device *device)
112+
{
113+
return 12;
114+
}
115+
116+
static rt_int16_t spacemit_pmic_adc_get_vref(struct rt_adc_device *device)
117+
{
118+
return 3000;
119+
}
120+
121+
static const struct rt_adc_ops spacemit_pmic_adc_ops =
122+
{
123+
.enabled = spacemit_pmic_adc_enabled,
124+
.convert = spacemit_pmic_adc_convert,
125+
.get_resolution = spacemit_pmic_adc_get_resolution,
126+
.get_vref = spacemit_pmic_adc_get_vref,
127+
};
128+
129+
static void spacemit_pmic_adc_isr(int irq, void *param)
130+
{
131+
struct spacemit_pmic_adc *pmic_adc = param;
132+
133+
rt_completion_done(&pmic_adc->completion);
134+
}
135+
136+
static rt_err_t spacemit_pmic_adc_probe(struct rt_platform_device *pdev)
137+
{
138+
rt_err_t err;
139+
const char *dev_name;
140+
struct rt_device *dev = &pdev->parent;
141+
struct spacemit_pmic *pmic = pdev->priv;
142+
struct spacemit_pmic_adc *pmic_adc = rt_calloc(1, sizeof(*pmic_adc));
143+
const struct spacemit_pmic_adc_data *data = pdev->id->data;
144+
145+
if (!pmic_adc)
146+
{
147+
return -RT_ENOMEM;
148+
}
149+
150+
pmic_adc->pmic = pmic;
151+
pmic_adc->data = data;
152+
153+
if ((pmic_adc->irq = rt_dm_dev_get_irq(dev, 0)) < 0)
154+
{
155+
err = pmic_adc->irq;
156+
goto _fail;
157+
}
158+
159+
/* Enable chop */
160+
spacemit_pmic_update_bits(pmic,
161+
SPM8821_ADC_CFG1_REG,
162+
SPM8821_ADC_CFG1_ADC_CHOP_EN_BIT_MSK,
163+
1 << SPM8821_ADC_CFG1_ADC_CHOP_EN_BIT_OFFSET);
164+
165+
/* Set the vref: 3v3 */
166+
spacemit_pmic_update_bits(pmic,
167+
SPM8821_ADC_CFG2_REG,
168+
SPM8821_ADC_CFG2_REF_SEL_BIT_MSK,
169+
SPM8821_ADC_CFG2_3V3_REF << SPM8821_ADC_CFG2_REF_SEL_BIT_OFFSET);
170+
171+
/* Set adc deb num: 7 */
172+
spacemit_pmic_update_bits(pmic,
173+
SPM8821_ADC_CFG2_REG,
174+
SPM8821_ADC_CFG2_DEB_NUM_BIT_MSK,
175+
SPM8821_ADC_CFG2_7_DEB_NUM << SPM8821_ADC_CFG2_DEB_NUM_BIT_OFFSET);
176+
177+
dev->user_data = pmic_adc;
178+
179+
rt_dm_dev_set_name_auto(&pmic_adc->parent.parent, "adc");
180+
dev_name = rt_dm_dev_get_name(&pmic_adc->parent.parent);
181+
182+
rt_mutex_init(&pmic_adc->lock, dev_name, RT_IPC_FLAG_PRIO);
183+
rt_completion_init(&pmic_adc->completion);
184+
185+
rt_hw_adc_register(&pmic_adc->parent, dev_name, &spacemit_pmic_adc_ops, pmic_adc);
186+
187+
rt_hw_interrupt_install(pmic_adc->irq, spacemit_pmic_adc_isr, pmic_adc, "adc-spacemit-pmic");
188+
rt_hw_interrupt_umask(pmic_adc->irq);
189+
190+
rt_dm_dev_bind_fwdata(dev, RT_NULL, pmic_adc);
191+
192+
return RT_EOK;
193+
194+
_fail:
195+
rt_free(pmic_adc);
196+
197+
return err;
198+
}
199+
200+
static rt_err_t spacemit_pmic_adc_remove(struct rt_platform_device *pdev)
201+
{
202+
struct spacemit_pmic_adc *pmic_adc = pdev->parent.user_data;
203+
204+
rt_hw_interrupt_mask(pmic_adc->irq);
205+
rt_pic_detach_irq(pmic_adc->irq, pmic_adc);
206+
207+
rt_device_unregister(&pmic_adc->parent.parent);
208+
209+
rt_free(pmic_adc);
210+
211+
return RT_EOK;
212+
}
213+
214+
static const struct rt_ofw_node_id spacemit_pmic_adc_ofw_ids[] =
215+
{
216+
{ .compatible = "pmic,adc,spm8821", .data = &spm8821_adc_data },
217+
{ /* sentinel */ }
218+
};
219+
220+
static struct rt_platform_driver spacemit_pmic_adc_driver =
221+
{
222+
.name = "spacemit-pmic-adc",
223+
.ids = spacemit_pmic_adc_ofw_ids,
224+
225+
.probe = spacemit_pmic_adc_probe,
226+
.remove = spacemit_pmic_adc_remove,
227+
};
228+
RT_PLATFORM_DRIVER_EXPORT(spacemit_pmic_adc_driver);

bsp/spacemit/dm/clk/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
menuconfig RT_CLK_SPACEMIT
2+
bool "Spacemit clock controller common"
3+
depends on RT_USING_OFW
4+
default y
5+
6+
config RT_CLK_SPACEMIT_K1X
7+
bool "Spacemit k1x clock controller support"
8+
depends on RT_CLK_SPACEMIT
9+
default n

bsp/spacemit/dm/clk/SConscript

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from building import *
2+
3+
cwd = GetCurrentDir()
4+
src = []
5+
CPPPATH = [cwd + '/../include']
6+
7+
if GetDepend(['RT_CLK_SPACEMIT']):
8+
src += ['ccu_ddn.c', 'ccu_ddr.c', 'ccu_dpll.c', 'ccu_mix.c', 'ccu_pll.c']
9+
10+
if GetDepend(['RT_CLK_SPACEMIT_K1X']):
11+
src += ['ccu-spacemit-k1x.c']
12+
13+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
14+
15+
Return('group')

0 commit comments

Comments
 (0)