xref: /DragonOS/kernel/src/driver/video/fbdev/base/fbmem.rs (revision 91e9d4ab55ef960f57a1b6287bc523ca4341f67a)
108a2ee40SLoGin use alloc::{
208a2ee40SLoGin     string::ToString,
308a2ee40SLoGin     sync::{Arc, Weak},
408a2ee40SLoGin };
5*91e9d4abSLoGin use system_error::SystemError;
6*91e9d4abSLoGin use unified_init::macros::unified_init;
708a2ee40SLoGin 
8*91e9d4abSLoGin use crate::driver::base::{
908a2ee40SLoGin     class::{class_manager, Class},
1008a2ee40SLoGin     device::sys_dev_char_kset,
11*91e9d4abSLoGin     init::SUBSYSTEM_INITIALIZER_SLICE,
1208a2ee40SLoGin     kobject::KObject,
1308a2ee40SLoGin     subsys::SubSysPrivate,
1408a2ee40SLoGin };
1508a2ee40SLoGin 
1608a2ee40SLoGin use super::fbcon::fb_console_init;
1708a2ee40SLoGin 
1808a2ee40SLoGin /// `/sys/class/graphics` 的 class 实例
1908a2ee40SLoGin static mut CLASS_GRAPHICS_INSTANCE: Option<Arc<GraphicsClass>> = None;
2008a2ee40SLoGin 
2108a2ee40SLoGin /// 获取 `/sys/class/graphics` 的 class 实例
2208a2ee40SLoGin #[inline(always)]
2308a2ee40SLoGin #[allow(dead_code)]
2408a2ee40SLoGin pub fn sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>> {
2508a2ee40SLoGin     unsafe { CLASS_GRAPHICS_INSTANCE.as_ref() }
2608a2ee40SLoGin }
2708a2ee40SLoGin 
2808a2ee40SLoGin /// 初始化帧缓冲区子系统
29*91e9d4abSLoGin #[unified_init(SUBSYSTEM_INITIALIZER_SLICE)]
3008a2ee40SLoGin pub fn fbmem_init() -> Result<(), SystemError> {
3108a2ee40SLoGin     let graphics_class = GraphicsClass::new();
3208a2ee40SLoGin     class_manager().class_register(&(graphics_class.clone() as Arc<dyn Class>))?;
3308a2ee40SLoGin 
3408a2ee40SLoGin     unsafe {
3508a2ee40SLoGin         CLASS_GRAPHICS_INSTANCE = Some(graphics_class);
3608a2ee40SLoGin     }
3708a2ee40SLoGin 
3808a2ee40SLoGin     fb_console_init()?;
3908a2ee40SLoGin     return Ok(());
4008a2ee40SLoGin }
4108a2ee40SLoGin 
4208a2ee40SLoGin /// `/sys/class/graphics` 类
4308a2ee40SLoGin #[derive(Debug)]
4408a2ee40SLoGin pub struct GraphicsClass {
4508a2ee40SLoGin     subsystem: SubSysPrivate,
4608a2ee40SLoGin }
4708a2ee40SLoGin 
4808a2ee40SLoGin impl GraphicsClass {
4908a2ee40SLoGin     const NAME: &'static str = "graphics";
5008a2ee40SLoGin     pub fn new() -> Arc<Self> {
5108a2ee40SLoGin         let r = Self {
5208a2ee40SLoGin             subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
5308a2ee40SLoGin         };
5408a2ee40SLoGin         let r = Arc::new(r);
5508a2ee40SLoGin         r.subsystem()
5608a2ee40SLoGin             .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
5708a2ee40SLoGin 
5808a2ee40SLoGin         return r;
5908a2ee40SLoGin     }
6008a2ee40SLoGin }
6108a2ee40SLoGin 
6208a2ee40SLoGin impl Class for GraphicsClass {
6308a2ee40SLoGin     fn name(&self) -> &'static str {
6408a2ee40SLoGin         return Self::NAME;
6508a2ee40SLoGin     }
6608a2ee40SLoGin 
6708a2ee40SLoGin     fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
6808a2ee40SLoGin         Some(sys_dev_char_kset() as Arc<dyn KObject>)
6908a2ee40SLoGin     }
7008a2ee40SLoGin 
7108a2ee40SLoGin     fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
7208a2ee40SLoGin         unimplemented!("GraphicsClass::set_dev_kobj");
7308a2ee40SLoGin     }
7408a2ee40SLoGin 
7508a2ee40SLoGin     fn subsystem(&self) -> &SubSysPrivate {
7608a2ee40SLoGin         return &self.subsystem;
7708a2ee40SLoGin     }
7808a2ee40SLoGin }
79