Skip to content

Commit 5abecc1

Browse files
GuEe-GUIRbb666
authored andcommitted
[dm][graphic] support dm mode
1. Add backlight framework for graphic. 2. Add framebuffer and plane, power, EDID for graphic framework 3. Add boot logo render for graphic 4. Update lcd.h Signed-off-by: GuEe-GUI <[email protected]>
1 parent 35bae68 commit 5abecc1

File tree

19 files changed

+4188
-1
lines changed

19 files changed

+4188
-1
lines changed

components/drivers/graphic/Kconfig

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
config RT_USING_LCD
2-
bool "Using LCD graphic drivers"
2+
bool "Using LCD graphic drivers" if !RT_USING_DM
33
default n
4+
5+
menuconfig RT_USING_GRAPHIC
6+
bool "Using Graphics device drivers"
7+
depends on RT_USING_DM
8+
default n
9+
10+
if RT_USING_GRAPHIC
11+
rsource "backlight/Kconfig"
12+
rsource "framebuffer/Kconfig"
13+
rsource "logo/Kconfig"
14+
endif
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from building import *
2+
3+
group = []
4+
objs = []
5+
6+
if not GetDepend(['RT_USING_GRAPHIC']):
7+
Return('group')
8+
9+
cwd = GetCurrentDir()
10+
list = os.listdir(cwd)
11+
CPPPATH = [cwd + '/../include']
12+
13+
src = ['graphic.c', 'graphic_primary.c', 'graphic_simple.c']
14+
15+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
16+
17+
for d in list:
18+
path = os.path.join(cwd, d)
19+
if os.path.isfile(os.path.join(path, 'SConscript')):
20+
objs = objs + SConscript(os.path.join(d, 'SConscript'))
21+
objs = objs + group
22+
23+
Return('objs')
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
menuconfig RT_GRAPHIC_BACKLIGHT
2+
bool "Backlight support"
3+
default n
4+
5+
if RT_GRAPHIC_BACKLIGHT
6+
osource "$(SOC_DM_GRAPHIC_BACKLIGHT_DIR)/Kconfig"
7+
endif
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+
5+
if not GetDepend(['RT_GRAPHIC_BACKLIGHT']):
6+
Return('group')
7+
8+
cwd = GetCurrentDir()
9+
CPPPATH = [cwd + '/../../include']
10+
11+
src = ['backlight.c']
12+
13+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
14+
Return('group')
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
/*
2+
* Copyright (c) 2006-2023, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2023-02-25 GuEe-GUI the first version
9+
*/
10+
11+
#include <rtthread.h>
12+
13+
#define DBG_TAG "rtdm.backlight"
14+
#define DBG_LVL DBG_INFO
15+
#include <rtdbg.h>
16+
17+
#include <stdlib.h>
18+
#include <drivers/core/dm.h>
19+
#include <drivers/backlight.h>
20+
21+
static struct rt_dm_ida backlight_ida = RT_DM_IDA_INIT(GRAPHIC_BACKLIGHT);
22+
23+
static rt_ssize_t _backlight_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
24+
{
25+
rt_ssize_t res;
26+
int brightness_len;
27+
rt_uint32_t brightness;
28+
char string[sizeof("4294967295")];
29+
struct rt_backlight_device *bl = rt_container_of(dev, struct rt_backlight_device, parent);
30+
31+
if ((res = rt_backlight_get_brightness(bl, &brightness)))
32+
{
33+
return res;
34+
}
35+
36+
brightness_len = rt_sprintf(string, "%u", brightness);
37+
38+
if (pos < brightness_len)
39+
{
40+
size = rt_min_t(rt_size_t, size, brightness_len - pos);
41+
rt_strncpy(buffer, &string[pos], size);
42+
43+
return size;
44+
}
45+
else
46+
{
47+
return 0;
48+
}
49+
}
50+
51+
static rt_ssize_t _backlight_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
52+
{
53+
rt_ssize_t res;
54+
rt_uint32_t brightness = atoi(buffer);
55+
struct rt_backlight_device *bl = rt_container_of(dev, struct rt_backlight_device, parent);
56+
57+
if (brightness > bl->props.max_brightness)
58+
{
59+
LOG_D("%s: brightness(%u) > max_brightness(%u)",
60+
rt_dm_dev_get_name(dev), brightness, bl->props.max_brightness);
61+
62+
return -RT_EINVAL;
63+
}
64+
65+
if ((res = rt_backlight_set_brightness(bl, brightness)))
66+
{
67+
return res;
68+
}
69+
70+
LOG_D("%s: brightness to %u", rt_dm_dev_get_name(dev), brightness);
71+
72+
return size;
73+
}
74+
75+
#ifdef RT_USING_DEVICE_OPS
76+
const static struct rt_device_ops _backlight_ops =
77+
{
78+
.read = _backlight_read,
79+
.write = _backlight_write,
80+
};
81+
#endif
82+
83+
rt_err_t rt_backlight_register(struct rt_backlight_device *bl)
84+
{
85+
rt_err_t err;
86+
int device_id;
87+
const char *dev_name;
88+
89+
if (!bl || !bl->ops)
90+
{
91+
return -RT_EINVAL;
92+
}
93+
94+
if ((device_id = rt_dm_ida_alloc(&backlight_ida)) < 0)
95+
{
96+
return -RT_EFULL;
97+
}
98+
99+
rt_dm_dev_set_name(&bl->parent, "backlight%u", device_id);
100+
dev_name = rt_dm_dev_get_name(&bl->parent);
101+
102+
rt_mutex_init(&bl->lock, dev_name, RT_IPC_FLAG_PRIO);
103+
104+
bl->parent.type = RT_Device_Class_Char;
105+
#ifdef RT_USING_DEVICE_OPS
106+
bl->parent.ops = &_backlight_ops;
107+
#else
108+
bl->parent.read = _backlight_read;
109+
bl->parent.write = _backlight_write;
110+
#endif
111+
bl->parent.master_id = backlight_ida.master_id;
112+
bl->parent.device_id = device_id;
113+
114+
if ((err = rt_device_register(&bl->parent, dev_name, RT_DEVICE_FLAG_RDWR)))
115+
{
116+
rt_dm_ida_free(&backlight_ida, device_id);
117+
118+
return err;
119+
}
120+
121+
return RT_EOK;
122+
}
123+
124+
rt_err_t rt_backlight_unregister(struct rt_backlight_device *bl)
125+
{
126+
if (!bl)
127+
{
128+
return -RT_EINVAL;
129+
}
130+
131+
rt_backlight_set_power(bl, RT_BACKLIGHT_POWER_POWERDOWN);
132+
133+
rt_dm_ida_free(&backlight_ida, bl->parent.device_id);
134+
135+
rt_device_unregister(&bl->parent);
136+
137+
return RT_EOK;
138+
}
139+
140+
rt_err_t rt_backlight_set_power(struct rt_backlight_device *bl, enum rt_backlight_power power)
141+
{
142+
rt_err_t err;
143+
enum rt_backlight_power old_power;
144+
145+
if (!bl || power >= RT_BACKLIGHT_POWER_NR)
146+
{
147+
return -RT_EINVAL;
148+
}
149+
150+
rt_mutex_take(&bl->lock, RT_WAITING_FOREVER);
151+
152+
old_power = bl->props.power;
153+
bl->props.power = power;
154+
155+
if ((err = bl->ops->update_status(bl)))
156+
{
157+
bl->props.power = old_power;
158+
}
159+
160+
rt_mutex_release(&bl->lock);
161+
162+
return err;
163+
}
164+
165+
rt_err_t rt_backlight_get_power(struct rt_backlight_device *bl, enum rt_backlight_power *out_power)
166+
{
167+
if (!bl || !out_power)
168+
{
169+
return -RT_EINVAL;
170+
}
171+
172+
rt_mutex_take(&bl->lock, RT_WAITING_FOREVER);
173+
174+
*out_power = bl->props.power;
175+
176+
rt_mutex_release(&bl->lock);
177+
178+
return RT_EOK;
179+
}
180+
181+
rt_err_t rt_backlight_set_brightness(struct rt_backlight_device *bl, rt_uint32_t brightness)
182+
{
183+
rt_err_t err;
184+
rt_uint32_t old_brightness;
185+
186+
if (!bl || brightness > bl->props.max_brightness)
187+
{
188+
return -RT_EINVAL;
189+
}
190+
191+
rt_mutex_take(&bl->lock, RT_WAITING_FOREVER);
192+
193+
old_brightness = bl->props.brightness;
194+
bl->props.brightness = brightness;
195+
196+
if ((err = bl->ops->update_status(bl)))
197+
{
198+
bl->props.brightness = old_brightness;
199+
}
200+
201+
rt_mutex_release(&bl->lock);
202+
203+
return err;
204+
}
205+
206+
rt_err_t rt_backlight_get_brightness(struct rt_backlight_device *bl, rt_uint32_t *out_brightness)
207+
{
208+
rt_err_t err;
209+
210+
if (!bl || !out_brightness)
211+
{
212+
return -RT_EINVAL;
213+
}
214+
215+
rt_mutex_take(&bl->lock, RT_WAITING_FOREVER);
216+
217+
if (bl->ops->get_brightness)
218+
{
219+
err = bl->ops->get_brightness(bl, out_brightness);
220+
}
221+
else
222+
{
223+
*out_brightness = rt_backlight_power_brightness(bl);
224+
225+
err = RT_EOK;
226+
}
227+
228+
rt_mutex_release(&bl->lock);
229+
230+
return err;
231+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
menuconfig RT_GRAPHIC_FB
2+
bool "LCD and Frame buffer support"
3+
select RT_USING_LCD
4+
default y
5+
6+
if RT_GRAPHIC_FB
7+
osource "$(SOC_DM_GRAPHIC_FB_DIR)/Kconfig"
8+
endif
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from building import *
2+
3+
group = []
4+
5+
if not GetDepend(['RT_GRAPHIC_FB']):
6+
Return('group')
7+
8+
cwd = GetCurrentDir()
9+
list = os.listdir(cwd)
10+
CPPPATH = [cwd + '/../../include']
11+
12+
src = []
13+
14+
group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)
15+
16+
Return('group')

0 commit comments

Comments
 (0)