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