xref: /DragonOS/kernel/src/driver/video/fbdev/base/fbmem.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
1c566df45SLoGin use core::intrinsics::unlikely;
2c566df45SLoGin 
308a2ee40SLoGin use alloc::{
4c566df45SLoGin     string::{String, ToString},
508a2ee40SLoGin     sync::{Arc, Weak},
602343d0bSLoGin     vec::Vec,
708a2ee40SLoGin };
8c566df45SLoGin 
92eab6dd7S曾俊 use log::error;
1091e9d4abSLoGin use system_error::SystemError;
1191e9d4abSLoGin use unified_init::macros::unified_init;
1208a2ee40SLoGin 
13c566df45SLoGin use crate::{
14c566df45SLoGin     driver::base::{
1508a2ee40SLoGin         class::{class_manager, Class},
16c566df45SLoGin         device::{
17c566df45SLoGin             bus::Bus,
18c566df45SLoGin             device_manager,
19c566df45SLoGin             device_number::{DeviceNumber, Major},
20c566df45SLoGin             driver::Driver,
21*28fe4ad2S黄铭涛             sys_dev_char_kset, Device, DeviceCommonData, DeviceType, IdTable,
22c566df45SLoGin         },
23*28fe4ad2S黄铭涛         kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
24c566df45SLoGin         kset::KSet,
2508a2ee40SLoGin         subsys::SubSysPrivate,
26c566df45SLoGin     },
2702343d0bSLoGin     filesystem::{
2802343d0bSLoGin         devfs::{devfs_register, DevFS, DeviceINode},
2902343d0bSLoGin         kernfs::KernFSInode,
3002343d0bSLoGin         sysfs::AttributeGroup,
3102343d0bSLoGin         vfs::{
3202343d0bSLoGin             file::FileMode, syscall::ModeType, FilePrivateData, FileSystem, FileType, IndexNode,
3302343d0bSLoGin             Metadata,
3402343d0bSLoGin         },
3502343d0bSLoGin     },
36c566df45SLoGin     init::initcall::INITCALL_SUBSYS,
37c566df45SLoGin     libs::{
38c566df45SLoGin         rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
3902343d0bSLoGin         spinlock::{SpinLock, SpinLockGuard},
40c566df45SLoGin     },
4108a2ee40SLoGin };
4208a2ee40SLoGin 
43c566df45SLoGin use super::{fbcon::fb_console_init, fbsysfs::FbDeviceAttrGroup, FbId, FrameBuffer};
4408a2ee40SLoGin 
4508a2ee40SLoGin /// `/sys/class/graphics` 的 class 实例
4608a2ee40SLoGin static mut CLASS_GRAPHICS_INSTANCE: Option<Arc<GraphicsClass>> = None;
4708a2ee40SLoGin 
48c566df45SLoGin lazy_static! {
49c566df45SLoGin     /// 帧缓冲区管理器
50c566df45SLoGin     static ref FRAME_BUFFER_MANAGER: FrameBufferManager = FrameBufferManager::new();
51c566df45SLoGin }
52c566df45SLoGin 
5308a2ee40SLoGin /// 获取 `/sys/class/graphics` 的 class 实例
5408a2ee40SLoGin #[inline(always)]
5508a2ee40SLoGin #[allow(dead_code)]
sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>>5608a2ee40SLoGin pub fn sys_class_graphics_instance() -> Option<&'static Arc<GraphicsClass>> {
5708a2ee40SLoGin     unsafe { CLASS_GRAPHICS_INSTANCE.as_ref() }
5808a2ee40SLoGin }
5908a2ee40SLoGin 
60c566df45SLoGin #[inline(always)]
frame_buffer_manager() -> &'static FrameBufferManager61c566df45SLoGin pub fn frame_buffer_manager() -> &'static FrameBufferManager {
62c566df45SLoGin     &FRAME_BUFFER_MANAGER
63c566df45SLoGin }
64c566df45SLoGin 
6508a2ee40SLoGin /// 初始化帧缓冲区子系统
66c566df45SLoGin #[unified_init(INITCALL_SUBSYS)]
fbmem_init() -> Result<(), SystemError>6708a2ee40SLoGin pub fn fbmem_init() -> Result<(), SystemError> {
6808a2ee40SLoGin     let graphics_class = GraphicsClass::new();
6908a2ee40SLoGin     class_manager().class_register(&(graphics_class.clone() as Arc<dyn Class>))?;
7008a2ee40SLoGin 
7108a2ee40SLoGin     unsafe {
7208a2ee40SLoGin         CLASS_GRAPHICS_INSTANCE = Some(graphics_class);
7308a2ee40SLoGin     }
7408a2ee40SLoGin 
7508a2ee40SLoGin     fb_console_init()?;
7608a2ee40SLoGin     return Ok(());
7708a2ee40SLoGin }
7808a2ee40SLoGin 
7908a2ee40SLoGin /// `/sys/class/graphics` 类
8008a2ee40SLoGin #[derive(Debug)]
8108a2ee40SLoGin pub struct GraphicsClass {
8208a2ee40SLoGin     subsystem: SubSysPrivate,
8308a2ee40SLoGin }
8408a2ee40SLoGin 
8508a2ee40SLoGin impl GraphicsClass {
8608a2ee40SLoGin     const NAME: &'static str = "graphics";
new() -> Arc<Self>8708a2ee40SLoGin     pub fn new() -> Arc<Self> {
8808a2ee40SLoGin         let r = Self {
8908a2ee40SLoGin             subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
9008a2ee40SLoGin         };
9108a2ee40SLoGin         let r = Arc::new(r);
9208a2ee40SLoGin         r.subsystem()
9308a2ee40SLoGin             .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
9408a2ee40SLoGin 
9508a2ee40SLoGin         return r;
9608a2ee40SLoGin     }
9708a2ee40SLoGin }
9808a2ee40SLoGin 
9908a2ee40SLoGin impl Class for GraphicsClass {
name(&self) -> &'static str10008a2ee40SLoGin     fn name(&self) -> &'static str {
10108a2ee40SLoGin         return Self::NAME;
10208a2ee40SLoGin     }
10308a2ee40SLoGin 
dev_kobj(&self) -> Option<Arc<dyn KObject>>10408a2ee40SLoGin     fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
10508a2ee40SLoGin         Some(sys_dev_char_kset() as Arc<dyn KObject>)
10608a2ee40SLoGin     }
10708a2ee40SLoGin 
set_dev_kobj(&self, _kobj: Arc<dyn KObject>)10808a2ee40SLoGin     fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
10908a2ee40SLoGin         unimplemented!("GraphicsClass::set_dev_kobj");
11008a2ee40SLoGin     }
11108a2ee40SLoGin 
subsystem(&self) -> &SubSysPrivate11208a2ee40SLoGin     fn subsystem(&self) -> &SubSysPrivate {
11308a2ee40SLoGin         return &self.subsystem;
11408a2ee40SLoGin     }
11508a2ee40SLoGin }
116c566df45SLoGin 
117c566df45SLoGin /// 帧缓冲区管理器
118c566df45SLoGin #[derive(Debug)]
119c566df45SLoGin pub struct FrameBufferManager {
120c566df45SLoGin     inner: RwLock<InnerFrameBufferManager>,
121c566df45SLoGin }
122c566df45SLoGin 
123c566df45SLoGin #[derive(Debug)]
124c566df45SLoGin struct InnerFrameBufferManager {
125c566df45SLoGin     /// 已经注册的帧缓冲区
126c566df45SLoGin     registered_fbs: [Option<Arc<dyn FrameBuffer>>; FrameBufferManager::FB_MAX],
127c566df45SLoGin }
128c566df45SLoGin 
129c566df45SLoGin impl FrameBufferManager {
130c566df45SLoGin     pub const FB_MAX: usize = 32;
new() -> Self131c566df45SLoGin     pub fn new() -> Self {
132c566df45SLoGin         Self {
133c566df45SLoGin             inner: RwLock::new(InnerFrameBufferManager {
134c566df45SLoGin                 registered_fbs: Default::default(),
135c566df45SLoGin             }),
136c566df45SLoGin         }
137c566df45SLoGin     }
138c566df45SLoGin 
139c566df45SLoGin     /// 注册一个帧缓冲区
140c566df45SLoGin     ///
141c566df45SLoGin     /// # 参数
142c566df45SLoGin     ///
143c566df45SLoGin     /// - fb: 帧缓冲区
register_fb(&self, fb: Arc<dyn FrameBuffer>) -> Result<FbId, SystemError>144c566df45SLoGin     pub fn register_fb(&self, fb: Arc<dyn FrameBuffer>) -> Result<FbId, SystemError> {
145c566df45SLoGin         let id = self.generate_fb_id().expect("no more fb id");
146c566df45SLoGin         fb.set_fb_id(id);
147c566df45SLoGin         let fb_device = FbDevice::new(Arc::downgrade(&fb) as Weak<dyn FrameBuffer>, id);
148c566df45SLoGin         device_manager().device_default_initialize(&(fb_device.clone() as Arc<dyn Device>));
149*28fe4ad2S黄铭涛         fb_device.set_dev_parent(Some(Arc::downgrade(&(fb.clone() as Arc<dyn Device>))));
150c566df45SLoGin 
151c566df45SLoGin         fb.set_fb_device(Some(fb_device.clone()));
152c566df45SLoGin 
153c566df45SLoGin         device_manager().add_device(fb_device.clone() as Arc<dyn Device>)?;
15402343d0bSLoGin         // 添加到devfs
15502343d0bSLoGin         devfs_register(&fb_device.name(), fb_device.clone()).map_err(|e| {
1562eab6dd7S曾俊             error!(
15702343d0bSLoGin                 "register fb device '{}' to devfs failed: {:?}",
15802343d0bSLoGin                 fb_device.name(),
15902343d0bSLoGin                 e
16002343d0bSLoGin             );
16102343d0bSLoGin             device_manager().remove(&(fb_device.clone() as Arc<dyn Device>));
16202343d0bSLoGin             e
16302343d0bSLoGin         })?;
164c566df45SLoGin 
165c566df45SLoGin         // todo: 从Modedb中获取信息
166c566df45SLoGin         // 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1584
167c566df45SLoGin 
168c566df45SLoGin         let mut inner = self.inner.write();
169c566df45SLoGin         inner.registered_fbs[id.data() as usize] = Some(fb.clone() as Arc<dyn FrameBuffer>);
170c566df45SLoGin 
171c566df45SLoGin         // todo: 把fb跟fbcon关联起来
172c566df45SLoGin         return Ok(id);
173c566df45SLoGin     }
174c566df45SLoGin 
175c566df45SLoGin     /// 注销一个帧缓冲区
176c566df45SLoGin     ///
177c566df45SLoGin     /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/video/fbdev/core/fbmem.c#1726
178c566df45SLoGin     #[allow(dead_code)]
unregister_fb(&self, _fb: Arc<dyn FrameBuffer>) -> Result<(), SystemError>179c566df45SLoGin     pub fn unregister_fb(&self, _fb: Arc<dyn FrameBuffer>) -> Result<(), SystemError> {
180c566df45SLoGin         todo!("unregister_fb")
181c566df45SLoGin     }
182c566df45SLoGin 
183c566df45SLoGin     /// 根据id查找帧缓冲区
find_fb_by_id(&self, id: FbId) -> Result<Option<Arc<dyn FrameBuffer>>, SystemError>184c566df45SLoGin     pub fn find_fb_by_id(&self, id: FbId) -> Result<Option<Arc<dyn FrameBuffer>>, SystemError> {
185c566df45SLoGin         if unlikely(!id.is_valid()) {
186c566df45SLoGin             return Err(SystemError::EINVAL);
187c566df45SLoGin         }
188c566df45SLoGin 
189c566df45SLoGin         let inner = self.inner.read();
190c566df45SLoGin         return Ok(inner.registered_fbs[id.data() as usize].clone());
191c566df45SLoGin     }
192c566df45SLoGin 
generate_fb_id(&self) -> Option<FbId>193c566df45SLoGin     fn generate_fb_id(&self) -> Option<FbId> {
194c566df45SLoGin         for i in 0..Self::FB_MAX {
195c566df45SLoGin             if self.inner.read().registered_fbs[i].is_none() {
196c566df45SLoGin                 return Some(FbId::new(i as u32));
197c566df45SLoGin             }
198c566df45SLoGin         }
199c566df45SLoGin         return None;
200c566df45SLoGin     }
201c566df45SLoGin }
202c566df45SLoGin 
203c566df45SLoGin /// 抽象的帧缓冲区设备
204c566df45SLoGin ///
205c566df45SLoGin /// 对应于`/sys/class/graphics/fb(x)`目录下的设备, 其中`(x)`为帧缓冲区的id
206c566df45SLoGin ///
207c566df45SLoGin /// 该设备的父设备为真实的帧缓冲区设备
208c566df45SLoGin #[derive(Debug)]
209c566df45SLoGin #[cast_to([sync] Device)]
210c566df45SLoGin pub struct FbDevice {
211c566df45SLoGin     inner: SpinLock<InnerFbDevice>,
212c566df45SLoGin     kobj_state: LockedKObjectState,
213c566df45SLoGin }
214c566df45SLoGin 
215c566df45SLoGin impl FbDevice {
216c566df45SLoGin     pub const BASENAME: &'static str = "fb";
new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self>217c566df45SLoGin     fn new(fb: Weak<dyn FrameBuffer>, id: FbId) -> Arc<Self> {
21802343d0bSLoGin         let r = Arc::new(Self {
219c566df45SLoGin             inner: SpinLock::new(InnerFbDevice {
220c566df45SLoGin                 fb,
221*28fe4ad2S黄铭涛                 kobject_common: KObjectCommonData::default(),
222*28fe4ad2S黄铭涛                 device_common: DeviceCommonData::default(),
223c566df45SLoGin                 fb_id: id,
22402343d0bSLoGin                 device_inode_fs: None,
22502343d0bSLoGin                 devfs_metadata: Metadata::new(
22602343d0bSLoGin                     FileType::FramebufferDevice,
22702343d0bSLoGin                     ModeType::from_bits_truncate(0o666),
22802343d0bSLoGin                 ),
229c566df45SLoGin             }),
230c566df45SLoGin             kobj_state: LockedKObjectState::new(None),
23102343d0bSLoGin         });
23202343d0bSLoGin 
23302343d0bSLoGin         let mut inner_guard = r.inner.lock();
23402343d0bSLoGin 
23502343d0bSLoGin         inner_guard.devfs_metadata.raw_dev = r.do_device_number(&inner_guard);
23602343d0bSLoGin         drop(inner_guard);
23702343d0bSLoGin 
23802343d0bSLoGin         return r;
239c566df45SLoGin     }
240c566df45SLoGin 
framebuffer(&self) -> Option<Arc<dyn FrameBuffer>>241c566df45SLoGin     pub fn framebuffer(&self) -> Option<Arc<dyn FrameBuffer>> {
242c566df45SLoGin         self.inner.lock().fb.upgrade()
243c566df45SLoGin     }
24402343d0bSLoGin 
24502343d0bSLoGin     /// 获取设备号
device_number(&self) -> DeviceNumber24602343d0bSLoGin     pub fn device_number(&self) -> DeviceNumber {
24702343d0bSLoGin         let inner_guard = self.inner.lock();
24802343d0bSLoGin         self.do_device_number(&inner_guard)
24902343d0bSLoGin     }
25002343d0bSLoGin 
do_device_number(&self, inner_guard: &SpinLockGuard<'_, InnerFbDevice>) -> DeviceNumber25102343d0bSLoGin     fn do_device_number(&self, inner_guard: &SpinLockGuard<'_, InnerFbDevice>) -> DeviceNumber {
25202343d0bSLoGin         DeviceNumber::new(Major::FB_MAJOR, inner_guard.fb_id.data())
25302343d0bSLoGin     }
254*28fe4ad2S黄铭涛 
inner(&self) -> SpinLockGuard<InnerFbDevice>255*28fe4ad2S黄铭涛     fn inner(&self) -> SpinLockGuard<InnerFbDevice> {
256*28fe4ad2S黄铭涛         self.inner.lock()
257*28fe4ad2S黄铭涛     }
258c566df45SLoGin }
259c566df45SLoGin 
260c566df45SLoGin #[derive(Debug)]
261c566df45SLoGin struct InnerFbDevice {
262c566df45SLoGin     fb: Weak<dyn FrameBuffer>,
263*28fe4ad2S黄铭涛     kobject_common: KObjectCommonData,
264*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
265c566df45SLoGin     /// 帧缓冲区id
266c566df45SLoGin     fb_id: FbId,
26702343d0bSLoGin 
26802343d0bSLoGin     /// device inode要求的字段
26902343d0bSLoGin     device_inode_fs: Option<Weak<DevFS>>,
27002343d0bSLoGin     devfs_metadata: Metadata,
271c566df45SLoGin }
272c566df45SLoGin 
273c566df45SLoGin impl KObject for FbDevice {
as_any_ref(&self) -> &dyn core::any::Any274c566df45SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
275c566df45SLoGin         self
276c566df45SLoGin     }
277c566df45SLoGin 
set_inode(&self, inode: Option<Arc<KernFSInode>>)278c566df45SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
279*28fe4ad2S黄铭涛         self.inner().kobject_common.kern_inode = inode;
280c566df45SLoGin     }
281c566df45SLoGin 
inode(&self) -> Option<Arc<KernFSInode>>282c566df45SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
283*28fe4ad2S黄铭涛         self.inner().kobject_common.kern_inode.clone()
284c566df45SLoGin     }
285c566df45SLoGin 
parent(&self) -> Option<Weak<dyn KObject>>286c566df45SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
287*28fe4ad2S黄铭涛         self.inner().kobject_common.parent.clone()
288c566df45SLoGin     }
289c566df45SLoGin 
set_parent(&self, parent: Option<Weak<dyn KObject>>)290c566df45SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
291*28fe4ad2S黄铭涛         self.inner().kobject_common.parent = parent;
292c566df45SLoGin     }
293c566df45SLoGin 
kset(&self) -> Option<Arc<KSet>>294c566df45SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
295*28fe4ad2S黄铭涛         self.inner().kobject_common.kset.clone()
296c566df45SLoGin     }
297c566df45SLoGin 
set_kset(&self, kset: Option<Arc<KSet>>)298c566df45SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
299*28fe4ad2S黄铭涛         self.inner().kobject_common.kset = kset;
300c566df45SLoGin     }
301c566df45SLoGin 
kobj_type(&self) -> Option<&'static dyn KObjType>302c566df45SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
303*28fe4ad2S黄铭涛         self.inner().kobject_common.kobj_type
304c566df45SLoGin     }
305c566df45SLoGin 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)306c566df45SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
307*28fe4ad2S黄铭涛         self.inner().kobject_common.kobj_type = ktype;
308c566df45SLoGin     }
309c566df45SLoGin 
name(&self) -> String310c566df45SLoGin     fn name(&self) -> String {
311c566df45SLoGin         format!("{}{}", Self::BASENAME, self.inner.lock().fb_id.data())
312c566df45SLoGin     }
313c566df45SLoGin 
set_name(&self, _name: String)314c566df45SLoGin     fn set_name(&self, _name: String) {
315c566df45SLoGin         // do nothing
316c566df45SLoGin     }
317c566df45SLoGin 
kobj_state(&self) -> RwLockReadGuard<KObjectState>318c566df45SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
319c566df45SLoGin         self.kobj_state.read()
320c566df45SLoGin     }
321c566df45SLoGin 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>322c566df45SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
323c566df45SLoGin         self.kobj_state.write()
324c566df45SLoGin     }
325c566df45SLoGin 
set_kobj_state(&self, state: KObjectState)326c566df45SLoGin     fn set_kobj_state(&self, state: KObjectState) {
327c566df45SLoGin         *self.kobj_state.write() = state;
328c566df45SLoGin     }
329c566df45SLoGin }
330c566df45SLoGin 
331c566df45SLoGin impl Device for FbDevice {
dev_type(&self) -> DeviceType332c566df45SLoGin     fn dev_type(&self) -> DeviceType {
333c566df45SLoGin         DeviceType::Char
334c566df45SLoGin     }
335c566df45SLoGin 
id_table(&self) -> IdTable336c566df45SLoGin     fn id_table(&self) -> IdTable {
33702343d0bSLoGin         IdTable::new(Self::BASENAME.to_string(), Some(self.device_number()))
338c566df45SLoGin     }
339c566df45SLoGin 
set_bus(&self, _bus: Option<Weak<dyn Bus>>)340c566df45SLoGin     fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
341c566df45SLoGin         todo!()
342c566df45SLoGin     }
343c566df45SLoGin 
class(&self) -> Option<Arc<dyn Class>>344c566df45SLoGin     fn class(&self) -> Option<Arc<dyn Class>> {
345c566df45SLoGin         sys_class_graphics_instance().map(|ins| ins.clone() as Arc<dyn Class>)
346c566df45SLoGin     }
set_class(&self, _class: Option<Weak<dyn Class>>)3474256da7fSLoGin     fn set_class(&self, _class: Option<Weak<dyn Class>>) {
348c566df45SLoGin         // do nothing
349c566df45SLoGin     }
350c566df45SLoGin 
driver(&self) -> Option<Arc<dyn Driver>>351c566df45SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
352c566df45SLoGin         None
353c566df45SLoGin     }
354c566df45SLoGin 
set_driver(&self, _driver: Option<Weak<dyn Driver>>)355c566df45SLoGin     fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) {
356c566df45SLoGin         // do nothing
357c566df45SLoGin     }
358c566df45SLoGin 
is_dead(&self) -> bool359c566df45SLoGin     fn is_dead(&self) -> bool {
360c566df45SLoGin         false
361c566df45SLoGin     }
362c566df45SLoGin 
can_match(&self) -> bool363c566df45SLoGin     fn can_match(&self) -> bool {
364c566df45SLoGin         false
365c566df45SLoGin     }
366c566df45SLoGin 
set_can_match(&self, _can_match: bool)367c566df45SLoGin     fn set_can_match(&self, _can_match: bool) {
368c566df45SLoGin         // do nothing
369c566df45SLoGin     }
370c566df45SLoGin 
state_synced(&self) -> bool371c566df45SLoGin     fn state_synced(&self) -> bool {
372c566df45SLoGin         true
373c566df45SLoGin     }
374c566df45SLoGin 
attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]>375c566df45SLoGin     fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
376c566df45SLoGin         Some(&[&FbDeviceAttrGroup])
377c566df45SLoGin     }
378*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<Weak<dyn Device>>379*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
380*28fe4ad2S黄铭涛         self.inner().device_common.get_parent_weak_or_clear()
381*28fe4ad2S黄铭涛     }
382*28fe4ad2S黄铭涛 
set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>)383*28fe4ad2S黄铭涛     fn set_dev_parent(&self, dev_parent: Option<Weak<dyn Device>>) {
384*28fe4ad2S黄铭涛         self.inner().device_common.parent = dev_parent;
385*28fe4ad2S黄铭涛     }
386c566df45SLoGin }
38702343d0bSLoGin 
38802343d0bSLoGin impl DeviceINode for FbDevice {
set_fs(&self, fs: Weak<DevFS>)38902343d0bSLoGin     fn set_fs(&self, fs: Weak<DevFS>) {
39002343d0bSLoGin         self.inner.lock().device_inode_fs = Some(fs);
39102343d0bSLoGin     }
39202343d0bSLoGin }
39302343d0bSLoGin 
39402343d0bSLoGin impl IndexNode for FbDevice {
open( &self, _data: SpinLockGuard<FilePrivateData>, _mode: &FileMode, ) -> Result<(), SystemError>395dfe53cf0SGnoCiYeH     fn open(
396dfe53cf0SGnoCiYeH         &self,
397dfe53cf0SGnoCiYeH         _data: SpinLockGuard<FilePrivateData>,
398dfe53cf0SGnoCiYeH         _mode: &FileMode,
399dfe53cf0SGnoCiYeH     ) -> Result<(), SystemError> {
40002343d0bSLoGin         Ok(())
40102343d0bSLoGin     }
40202343d0bSLoGin 
close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError>403dfe53cf0SGnoCiYeH     fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
40402343d0bSLoGin         Ok(())
40502343d0bSLoGin     }
read_at( &self, offset: usize, len: usize, buf: &mut [u8], _data: SpinLockGuard<FilePrivateData>, ) -> Result<usize, SystemError>40602343d0bSLoGin     fn read_at(
40702343d0bSLoGin         &self,
40802343d0bSLoGin         offset: usize,
40902343d0bSLoGin         len: usize,
41002343d0bSLoGin         buf: &mut [u8],
411dfe53cf0SGnoCiYeH         _data: SpinLockGuard<FilePrivateData>,
41202343d0bSLoGin     ) -> Result<usize, SystemError> {
41302343d0bSLoGin         let fb = self.inner.lock().fb.upgrade().unwrap();
41402343d0bSLoGin         return fb.fb_read(&mut buf[0..len], offset);
41502343d0bSLoGin     }
41602343d0bSLoGin 
write_at( &self, offset: usize, len: usize, buf: &[u8], _data: SpinLockGuard<FilePrivateData>, ) -> Result<usize, SystemError>41702343d0bSLoGin     fn write_at(
41802343d0bSLoGin         &self,
41902343d0bSLoGin         offset: usize,
42002343d0bSLoGin         len: usize,
42102343d0bSLoGin         buf: &[u8],
422dfe53cf0SGnoCiYeH         _data: SpinLockGuard<FilePrivateData>,
42302343d0bSLoGin     ) -> Result<usize, SystemError> {
42402343d0bSLoGin         let fb = self.inner.lock().fb.upgrade().unwrap();
42502343d0bSLoGin         return fb.fb_write(&buf[0..len], offset);
42602343d0bSLoGin     }
42702343d0bSLoGin 
fs(&self) -> Arc<dyn FileSystem>42802343d0bSLoGin     fn fs(&self) -> Arc<dyn FileSystem> {
42902343d0bSLoGin         self.inner
43002343d0bSLoGin             .lock()
43102343d0bSLoGin             .device_inode_fs
43202343d0bSLoGin             .as_ref()
43302343d0bSLoGin             .unwrap()
43402343d0bSLoGin             .upgrade()
43502343d0bSLoGin             .unwrap()
43602343d0bSLoGin     }
43702343d0bSLoGin 
as_any_ref(&self) -> &dyn core::any::Any43802343d0bSLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
43902343d0bSLoGin         self
44002343d0bSLoGin     }
44102343d0bSLoGin 
list(&self) -> Result<Vec<String>, SystemError>44202343d0bSLoGin     fn list(&self) -> Result<Vec<String>, SystemError> {
44302343d0bSLoGin         todo!()
44402343d0bSLoGin     }
44502343d0bSLoGin 
metadata(&self) -> Result<Metadata, SystemError>44602343d0bSLoGin     fn metadata(&self) -> Result<Metadata, SystemError> {
44702343d0bSLoGin         Ok(self.inner.lock().devfs_metadata.clone())
44802343d0bSLoGin     }
44902343d0bSLoGin 
resize(&self, _len: usize) -> Result<(), SystemError>45002343d0bSLoGin     fn resize(&self, _len: usize) -> Result<(), SystemError> {
45102343d0bSLoGin         return Ok(());
45202343d0bSLoGin     }
45302343d0bSLoGin }
454