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