xref: /DragonOS/kernel/src/driver/video/fbdev/base/fbmem.rs (revision 08a2ee408498b0db4c76c57b149f1cf047758f3c)
1*08a2ee40SLoGin use alloc::{
2*08a2ee40SLoGin     string::ToString,
3*08a2ee40SLoGin     sync::{Arc, Weak},
4*08a2ee40SLoGin };
5*08a2ee40SLoGin 
6*08a2ee40SLoGin use crate::{
7*08a2ee40SLoGin     driver::base::{
8*08a2ee40SLoGin         class::{class_manager, Class},
9*08a2ee40SLoGin         device::sys_dev_char_kset,
10*08a2ee40SLoGin         kobject::KObject,
11*08a2ee40SLoGin         subsys::SubSysPrivate,
12*08a2ee40SLoGin     },
13*08a2ee40SLoGin     syscall::SystemError,
14*08a2ee40SLoGin };
15*08a2ee40SLoGin 
16*08a2ee40SLoGin use super::fbcon::fb_console_init;
17*08a2ee40SLoGin 
18*08a2ee40SLoGin /// `/sys/class/graphics` 的 class 实例
19*08a2ee40SLoGin static mut CLASS_GRAPHICS_INSTANCE: Option<Arc<GraphicsClass>> = None;
20*08a2ee40SLoGin 
21*08a2ee40SLoGin /// 获取 `/sys/class/graphics` 的 class 实例
22*08a2ee40SLoGin #[inline(always)]
23*08a2ee40SLoGin #[allow(dead_code)]
24*08a2ee40SLoGin pub fn sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>> {
25*08a2ee40SLoGin     unsafe { CLASS_GRAPHICS_INSTANCE.as_ref() }
26*08a2ee40SLoGin }
27*08a2ee40SLoGin 
28*08a2ee40SLoGin /// 初始化帧缓冲区子系统
29*08a2ee40SLoGin pub fn fbmem_init() -> Result<(), SystemError> {
30*08a2ee40SLoGin     let graphics_class = GraphicsClass::new();
31*08a2ee40SLoGin     class_manager().class_register(&(graphics_class.clone() as Arc<dyn Class>))?;
32*08a2ee40SLoGin 
33*08a2ee40SLoGin     unsafe {
34*08a2ee40SLoGin         CLASS_GRAPHICS_INSTANCE = Some(graphics_class);
35*08a2ee40SLoGin     }
36*08a2ee40SLoGin 
37*08a2ee40SLoGin     fb_console_init()?;
38*08a2ee40SLoGin     return Ok(());
39*08a2ee40SLoGin }
40*08a2ee40SLoGin 
41*08a2ee40SLoGin /// `/sys/class/graphics` 类
42*08a2ee40SLoGin #[derive(Debug)]
43*08a2ee40SLoGin pub struct GraphicsClass {
44*08a2ee40SLoGin     subsystem: SubSysPrivate,
45*08a2ee40SLoGin }
46*08a2ee40SLoGin 
47*08a2ee40SLoGin impl GraphicsClass {
48*08a2ee40SLoGin     const NAME: &'static str = "graphics";
49*08a2ee40SLoGin     pub fn new() -> Arc<Self> {
50*08a2ee40SLoGin         let r = Self {
51*08a2ee40SLoGin             subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
52*08a2ee40SLoGin         };
53*08a2ee40SLoGin         let r = Arc::new(r);
54*08a2ee40SLoGin         r.subsystem()
55*08a2ee40SLoGin             .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
56*08a2ee40SLoGin 
57*08a2ee40SLoGin         return r;
58*08a2ee40SLoGin     }
59*08a2ee40SLoGin }
60*08a2ee40SLoGin 
61*08a2ee40SLoGin impl Class for GraphicsClass {
62*08a2ee40SLoGin     fn name(&self) -> &'static str {
63*08a2ee40SLoGin         return Self::NAME;
64*08a2ee40SLoGin     }
65*08a2ee40SLoGin 
66*08a2ee40SLoGin     fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
67*08a2ee40SLoGin         Some(sys_dev_char_kset() as Arc<dyn KObject>)
68*08a2ee40SLoGin     }
69*08a2ee40SLoGin 
70*08a2ee40SLoGin     fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
71*08a2ee40SLoGin         unimplemented!("GraphicsClass::set_dev_kobj");
72*08a2ee40SLoGin     }
73*08a2ee40SLoGin 
74*08a2ee40SLoGin     fn subsystem(&self) -> &SubSysPrivate {
75*08a2ee40SLoGin         return &self.subsystem;
76*08a2ee40SLoGin     }
77*08a2ee40SLoGin }
78