xref: /DragonOS/kernel/src/driver/video/fbdev/vesafb.rs (revision 02343d0b5b47c07e7f4ec3818940795b1009fae1)
1c566df45SLoGin use core::{
2c566df45SLoGin     ffi::{c_uint, c_void},
3c566df45SLoGin     mem::MaybeUninit,
4c566df45SLoGin     sync::atomic::AtomicBool,
5c566df45SLoGin };
6c566df45SLoGin 
7c566df45SLoGin use alloc::{
8c566df45SLoGin     string::{String, ToString},
9c566df45SLoGin     sync::{Arc, Weak},
10c566df45SLoGin     vec::Vec,
11c566df45SLoGin };
12c566df45SLoGin use system_error::SystemError;
13c566df45SLoGin use unified_init::macros::unified_init;
14c566df45SLoGin 
15c566df45SLoGin use crate::{
16c566df45SLoGin     arch::MMArch,
17c566df45SLoGin     driver::{
18c566df45SLoGin         base::{
19c566df45SLoGin             class::Class,
20c566df45SLoGin             device::{
21c566df45SLoGin                 bus::Bus, device_manager, driver::Driver, Device, DeviceState, DeviceType, IdTable,
22c566df45SLoGin             },
23c566df45SLoGin             kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
24c566df45SLoGin             kset::KSet,
25c566df45SLoGin             platform::{
26c566df45SLoGin                 platform_device::{platform_device_manager, PlatformDevice},
27c566df45SLoGin                 platform_driver::{platform_driver_manager, PlatformDriver},
28c566df45SLoGin                 CompatibleTable,
29c566df45SLoGin             },
30c566df45SLoGin         },
31c566df45SLoGin         tty::serial::serial8250::send_to_default_serial8250_port,
32c566df45SLoGin         video::fbdev::base::{fbmem::frame_buffer_manager, FbVisual},
33c566df45SLoGin     },
34c566df45SLoGin     filesystem::{
35c566df45SLoGin         kernfs::KernFSInode,
36c566df45SLoGin         sysfs::{file::sysfs_emit_str, Attribute, AttributeGroup, SysFSOpsSupport},
37c566df45SLoGin         vfs::syscall::ModeType,
38c566df45SLoGin     },
39c566df45SLoGin     include::bindings::bindings::{
40c566df45SLoGin         multiboot2_get_Framebuffer_info, multiboot2_iter, multiboot_tag_framebuffer_info_t,
41c566df45SLoGin     },
42c566df45SLoGin     init::{boot_params, initcall::INITCALL_DEVICE},
43c566df45SLoGin     libs::{
44c566df45SLoGin         align::page_align_up,
45c566df45SLoGin         once::Once,
46c566df45SLoGin         rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
47c566df45SLoGin         spinlock::SpinLock,
48c566df45SLoGin     },
49c566df45SLoGin     mm::{
50c566df45SLoGin         allocator::page_frame::PageFrameCount, no_init::pseudo_map_phys, MemoryManagementArch,
51c566df45SLoGin         PhysAddr, VirtAddr,
52c566df45SLoGin     },
53c566df45SLoGin };
54c566df45SLoGin 
55c566df45SLoGin use super::base::{
56c566df45SLoGin     fbmem::FbDevice, BlankMode, BootTimeVideoType, FbAccel, FbActivateFlags, FbId, FbState, FbType,
57c566df45SLoGin     FbVModeFlags, FbVarScreenInfo, FbVideoMode, FixedScreenInfo, FrameBuffer, FrameBufferInfo,
58c566df45SLoGin     FrameBufferOps,
59c566df45SLoGin };
60c566df45SLoGin 
61c566df45SLoGin /// 当前机器上面是否有vesa帧缓冲区
62c566df45SLoGin static HAS_VESA_FB: AtomicBool = AtomicBool::new(false);
63c566df45SLoGin 
64c566df45SLoGin lazy_static! {
65c566df45SLoGin     static ref VESAFB_FIX_INFO: RwLock<FixedScreenInfo> = RwLock::new(FixedScreenInfo {
66c566df45SLoGin         id: FixedScreenInfo::name2id("VESA VGA"),
67c566df45SLoGin         fb_type: FbType::PackedPixels,
68c566df45SLoGin         accel: FbAccel::None,
69c566df45SLoGin         ..Default::default()
70c566df45SLoGin     });
71c566df45SLoGin     static ref VESAFB_DEFINED: RwLock<FbVarScreenInfo> = RwLock::new(FbVarScreenInfo {
72c566df45SLoGin         activate: FbActivateFlags::FB_ACTIVATE_NOW,
73c566df45SLoGin         height: None,
74c566df45SLoGin         width: None,
75c566df45SLoGin         right_margin: 32,
76c566df45SLoGin         upper_margin: 16,
77c566df45SLoGin         lower_margin: 4,
78c566df45SLoGin         vsync_len: 4,
79c566df45SLoGin         vmode: FbVModeFlags::FB_VMODE_NONINTERLACED,
80c566df45SLoGin 
81c566df45SLoGin         ..Default::default()
82c566df45SLoGin     });
83c566df45SLoGin }
84c566df45SLoGin 
85c566df45SLoGin #[derive(Debug)]
86c566df45SLoGin #[cast_to([sync] Device)]
87c566df45SLoGin #[cast_to([sync] PlatformDevice)]
88c566df45SLoGin pub struct VesaFb {
89c566df45SLoGin     inner: SpinLock<InnerVesaFb>,
90c566df45SLoGin     kobj_state: LockedKObjectState,
91c566df45SLoGin }
92c566df45SLoGin 
93c566df45SLoGin impl VesaFb {
94c566df45SLoGin     pub const NAME: &'static str = "vesa_vga";
95c566df45SLoGin     pub fn new() -> Self {
96c566df45SLoGin         return Self {
97c566df45SLoGin             inner: SpinLock::new(InnerVesaFb {
98c566df45SLoGin                 bus: None,
99c566df45SLoGin                 class: None,
100c566df45SLoGin                 driver: None,
101c566df45SLoGin                 kern_inode: None,
102c566df45SLoGin                 parent: None,
103c566df45SLoGin                 kset: None,
104c566df45SLoGin                 kobj_type: None,
105c566df45SLoGin                 device_state: DeviceState::NotInitialized,
106c566df45SLoGin                 pdev_id: 0,
107c566df45SLoGin                 pdev_id_auto: false,
108c566df45SLoGin                 fb_id: FbId::INIT,
109c566df45SLoGin                 fb_device: None,
110c566df45SLoGin                 fb_state: FbState::Suspended,
111c566df45SLoGin             }),
112c566df45SLoGin             kobj_state: LockedKObjectState::new(None),
113c566df45SLoGin         };
114c566df45SLoGin     }
115c566df45SLoGin }
116c566df45SLoGin 
117c566df45SLoGin #[derive(Debug)]
118c566df45SLoGin struct InnerVesaFb {
119c566df45SLoGin     bus: Option<Weak<dyn Bus>>,
120c566df45SLoGin     class: Option<Arc<dyn Class>>,
121c566df45SLoGin     driver: Option<Weak<dyn Driver>>,
122c566df45SLoGin     kern_inode: Option<Arc<KernFSInode>>,
123c566df45SLoGin     parent: Option<Weak<dyn KObject>>,
124c566df45SLoGin     kset: Option<Arc<KSet>>,
125c566df45SLoGin     kobj_type: Option<&'static dyn KObjType>,
126c566df45SLoGin     device_state: DeviceState,
127c566df45SLoGin     pdev_id: i32,
128c566df45SLoGin     pdev_id_auto: bool,
129c566df45SLoGin     fb_id: FbId,
130c566df45SLoGin     fb_device: Option<Arc<FbDevice>>,
131c566df45SLoGin     fb_state: FbState,
132c566df45SLoGin }
133c566df45SLoGin 
134c566df45SLoGin impl FrameBuffer for VesaFb {
135c566df45SLoGin     fn fb_id(&self) -> FbId {
136c566df45SLoGin         self.inner.lock().fb_id
137c566df45SLoGin     }
138c566df45SLoGin 
139c566df45SLoGin     fn set_fb_id(&self, id: FbId) {
140c566df45SLoGin         self.inner.lock().fb_id = id;
141c566df45SLoGin     }
142c566df45SLoGin }
143c566df45SLoGin 
144c566df45SLoGin impl PlatformDevice for VesaFb {
145c566df45SLoGin     fn pdev_name(&self) -> &str {
146c566df45SLoGin         Self::NAME
147c566df45SLoGin     }
148c566df45SLoGin 
149c566df45SLoGin     fn set_pdev_id(&self, id: i32) {
150c566df45SLoGin         self.inner.lock().pdev_id = id;
151c566df45SLoGin     }
152c566df45SLoGin 
153c566df45SLoGin     fn set_pdev_id_auto(&self, id_auto: bool) {
154c566df45SLoGin         self.inner.lock().pdev_id_auto = id_auto;
155c566df45SLoGin     }
156c566df45SLoGin 
157c566df45SLoGin     fn compatible_table(&self) -> CompatibleTable {
158c566df45SLoGin         todo!()
159c566df45SLoGin     }
160c566df45SLoGin 
161c566df45SLoGin     fn is_initialized(&self) -> bool {
162c566df45SLoGin         self.inner.lock().device_state == DeviceState::Initialized
163c566df45SLoGin     }
164c566df45SLoGin 
165c566df45SLoGin     fn set_state(&self, set_state: DeviceState) {
166c566df45SLoGin         self.inner.lock().device_state = set_state;
167c566df45SLoGin     }
168c566df45SLoGin }
169c566df45SLoGin 
170c566df45SLoGin impl Device for VesaFb {
171c566df45SLoGin     fn dev_type(&self) -> DeviceType {
172c566df45SLoGin         DeviceType::Char
173c566df45SLoGin     }
174c566df45SLoGin 
175c566df45SLoGin     fn id_table(&self) -> IdTable {
176c566df45SLoGin         IdTable::new(self.name(), None)
177c566df45SLoGin     }
178c566df45SLoGin 
179c566df45SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
180c566df45SLoGin         self.inner.lock().bus.clone()
181c566df45SLoGin     }
182c566df45SLoGin 
183c566df45SLoGin     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
184c566df45SLoGin         self.inner.lock().bus = bus;
185c566df45SLoGin     }
186c566df45SLoGin 
187c566df45SLoGin     fn set_class(&self, class: Option<Arc<dyn Class>>) {
188c566df45SLoGin         self.inner.lock().class = class;
189c566df45SLoGin     }
190c566df45SLoGin 
191c566df45SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
192c566df45SLoGin         self.inner.lock().driver.clone()?.upgrade()
193c566df45SLoGin     }
194c566df45SLoGin 
195c566df45SLoGin     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
196c566df45SLoGin         self.inner.lock().driver = driver;
197c566df45SLoGin     }
198c566df45SLoGin 
199c566df45SLoGin     fn is_dead(&self) -> bool {
200c566df45SLoGin         false
201c566df45SLoGin     }
202c566df45SLoGin 
203c566df45SLoGin     fn can_match(&self) -> bool {
204c566df45SLoGin         true
205c566df45SLoGin     }
206c566df45SLoGin 
207c566df45SLoGin     fn set_can_match(&self, _can_match: bool) {}
208c566df45SLoGin 
209c566df45SLoGin     fn state_synced(&self) -> bool {
210c566df45SLoGin         true
211c566df45SLoGin     }
212c566df45SLoGin }
213c566df45SLoGin 
214c566df45SLoGin impl KObject for VesaFb {
215c566df45SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
216c566df45SLoGin         self
217c566df45SLoGin     }
218c566df45SLoGin 
219c566df45SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
220c566df45SLoGin         self.inner.lock().kern_inode = inode;
221c566df45SLoGin     }
222c566df45SLoGin 
223c566df45SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
224c566df45SLoGin         self.inner.lock().kern_inode.clone()
225c566df45SLoGin     }
226c566df45SLoGin 
227c566df45SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
228c566df45SLoGin         self.inner.lock().parent.clone()
229c566df45SLoGin     }
230c566df45SLoGin 
231c566df45SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
232c566df45SLoGin         self.inner.lock().parent = parent;
233c566df45SLoGin     }
234c566df45SLoGin 
235c566df45SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
236c566df45SLoGin         self.inner.lock().kset.clone()
237c566df45SLoGin     }
238c566df45SLoGin 
239c566df45SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
240c566df45SLoGin         self.inner.lock().kset = kset;
241c566df45SLoGin     }
242c566df45SLoGin 
243c566df45SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
244c566df45SLoGin         self.inner.lock().kobj_type
245c566df45SLoGin     }
246c566df45SLoGin 
247c566df45SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
248c566df45SLoGin         self.inner.lock().kobj_type = ktype;
249c566df45SLoGin     }
250c566df45SLoGin 
251c566df45SLoGin     fn name(&self) -> String {
252c566df45SLoGin         Self::NAME.to_string()
253c566df45SLoGin     }
254c566df45SLoGin 
255c566df45SLoGin     fn set_name(&self, _name: String) {
256c566df45SLoGin         // do nothing
257c566df45SLoGin     }
258c566df45SLoGin 
259c566df45SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
260c566df45SLoGin         self.kobj_state.read()
261c566df45SLoGin     }
262c566df45SLoGin 
263c566df45SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
264c566df45SLoGin         self.kobj_state.write()
265c566df45SLoGin     }
266c566df45SLoGin 
267c566df45SLoGin     fn set_kobj_state(&self, state: KObjectState) {
268c566df45SLoGin         *self.kobj_state.write() = state;
269c566df45SLoGin     }
270c566df45SLoGin }
271c566df45SLoGin 
272c566df45SLoGin impl FrameBufferOps for VesaFb {
273c566df45SLoGin     fn fb_open(&self, _user: bool) {
274c566df45SLoGin         todo!()
275c566df45SLoGin     }
276c566df45SLoGin 
277c566df45SLoGin     fn fb_release(&self, _user: bool) {
278c566df45SLoGin         todo!()
279c566df45SLoGin     }
280c566df45SLoGin 
281c566df45SLoGin     fn fb_set_color_register(
282c566df45SLoGin         &self,
283c566df45SLoGin         _regno: u16,
284c566df45SLoGin         _red: u16,
285c566df45SLoGin         _green: u16,
286c566df45SLoGin         _blue: u16,
287c566df45SLoGin     ) -> Result<(), SystemError> {
288c566df45SLoGin         todo!()
289c566df45SLoGin     }
290c566df45SLoGin 
291c566df45SLoGin     fn fb_blank(&self, _blank_mode: BlankMode) -> Result<(), SystemError> {
292c566df45SLoGin         todo!()
293c566df45SLoGin     }
294c566df45SLoGin 
295c566df45SLoGin     fn fb_destroy(&self) {
296c566df45SLoGin         todo!()
297c566df45SLoGin     }
298*02343d0bSLoGin 
299*02343d0bSLoGin     fn fb_read(&self, buf: &mut [u8], pos: usize) -> Result<usize, SystemError> {
300*02343d0bSLoGin         let bp = boot_params().read();
301*02343d0bSLoGin 
302*02343d0bSLoGin         let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
303*02343d0bSLoGin         let size = self.current_fb_fix().smem_len;
304*02343d0bSLoGin         drop(bp);
305*02343d0bSLoGin         if pos >= size {
306*02343d0bSLoGin             return Ok(0);
307*02343d0bSLoGin         }
308*02343d0bSLoGin 
309*02343d0bSLoGin         let pos = pos as i64;
310*02343d0bSLoGin         let size = size as i64;
311*02343d0bSLoGin 
312*02343d0bSLoGin         let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
313*02343d0bSLoGin 
314*02343d0bSLoGin         let slice = unsafe { core::slice::from_raw_parts(vaddr.as_ptr::<u8>(), size as usize) };
315*02343d0bSLoGin         buf[..len].copy_from_slice(&slice[pos as usize..(pos as usize + len)]);
316*02343d0bSLoGin 
317*02343d0bSLoGin         return Ok(len);
318*02343d0bSLoGin     }
319*02343d0bSLoGin 
320*02343d0bSLoGin     fn fb_write(&self, buf: &[u8], pos: usize) -> Result<usize, SystemError> {
321*02343d0bSLoGin         let bp = boot_params().read();
322*02343d0bSLoGin 
323*02343d0bSLoGin         let vaddr = bp.screen_info.lfb_virt_base.ok_or(SystemError::ENODEV)?;
324*02343d0bSLoGin         let size = self.current_fb_fix().smem_len;
325*02343d0bSLoGin 
326*02343d0bSLoGin         if pos >= size {
327*02343d0bSLoGin             return Ok(0);
328*02343d0bSLoGin         }
329*02343d0bSLoGin 
330*02343d0bSLoGin         let pos = pos as i64;
331*02343d0bSLoGin         let size = size as i64;
332*02343d0bSLoGin 
333*02343d0bSLoGin         let len = core::cmp::min(size - pos, buf.len() as i64) as usize;
334*02343d0bSLoGin 
335*02343d0bSLoGin         let slice = unsafe { core::slice::from_raw_parts_mut(vaddr.as_ptr::<u8>(), size as usize) };
336*02343d0bSLoGin         slice[pos as usize..(pos as usize + len)].copy_from_slice(&buf[..len]);
337*02343d0bSLoGin 
338*02343d0bSLoGin         return Ok(len);
339*02343d0bSLoGin     }
340c566df45SLoGin }
341c566df45SLoGin 
342c566df45SLoGin impl FrameBufferInfo for VesaFb {
343c566df45SLoGin     fn fb_device(&self) -> Option<Arc<FbDevice>> {
344c566df45SLoGin         self.inner.lock().fb_device.clone()
345c566df45SLoGin     }
346c566df45SLoGin 
347c566df45SLoGin     fn set_fb_device(&self, device: Option<Arc<FbDevice>>) {
348c566df45SLoGin         self.inner.lock().fb_device = device;
349c566df45SLoGin     }
350c566df45SLoGin 
351c566df45SLoGin     fn screen_size(&self) -> usize {
352c566df45SLoGin         todo!()
353c566df45SLoGin     }
354c566df45SLoGin 
355c566df45SLoGin     fn current_fb_var(&self) -> FbVarScreenInfo {
356c566df45SLoGin         VESAFB_DEFINED.read().clone()
357c566df45SLoGin     }
358c566df45SLoGin 
359c566df45SLoGin     fn current_fb_fix(&self) -> FixedScreenInfo {
360c566df45SLoGin         VESAFB_FIX_INFO.read().clone()
361c566df45SLoGin     }
362c566df45SLoGin 
363c566df45SLoGin     fn video_mode(&self) -> Option<&FbVideoMode> {
364c566df45SLoGin         todo!()
365c566df45SLoGin     }
366c566df45SLoGin 
367c566df45SLoGin     fn state(&self) -> FbState {
368c566df45SLoGin         self.inner.lock().fb_state
369c566df45SLoGin     }
370c566df45SLoGin }
371c566df45SLoGin 
372c566df45SLoGin #[derive(Debug)]
373c566df45SLoGin #[cast_to([sync] PlatformDriver)]
374c566df45SLoGin struct VesaFbDriver {
375c566df45SLoGin     inner: SpinLock<InnerVesaFbDriver>,
376c566df45SLoGin     kobj_state: LockedKObjectState,
377c566df45SLoGin }
378c566df45SLoGin 
379c566df45SLoGin impl VesaFbDriver {
380c566df45SLoGin     pub fn new() -> Arc<Self> {
381c566df45SLoGin         let r = Arc::new(Self {
382c566df45SLoGin             inner: SpinLock::new(InnerVesaFbDriver {
383c566df45SLoGin                 ktype: None,
384c566df45SLoGin                 kset: None,
385c566df45SLoGin                 parent: None,
386c566df45SLoGin                 kernfs_inode: None,
387c566df45SLoGin                 devices: Vec::new(),
388c566df45SLoGin                 bus: None,
389c566df45SLoGin                 self_ref: Weak::new(),
390c566df45SLoGin             }),
391c566df45SLoGin             kobj_state: LockedKObjectState::new(None),
392c566df45SLoGin         });
393c566df45SLoGin 
394c566df45SLoGin         r.inner.lock().self_ref = Arc::downgrade(&r);
395c566df45SLoGin 
396c566df45SLoGin         return r;
397c566df45SLoGin     }
398c566df45SLoGin }
399c566df45SLoGin 
400c566df45SLoGin #[derive(Debug)]
401c566df45SLoGin struct InnerVesaFbDriver {
402c566df45SLoGin     ktype: Option<&'static dyn KObjType>,
403c566df45SLoGin     kset: Option<Arc<KSet>>,
404c566df45SLoGin     parent: Option<Weak<dyn KObject>>,
405c566df45SLoGin     kernfs_inode: Option<Arc<KernFSInode>>,
406c566df45SLoGin     devices: Vec<Arc<dyn Device>>,
407c566df45SLoGin     bus: Option<Weak<dyn Bus>>,
408c566df45SLoGin 
409c566df45SLoGin     self_ref: Weak<VesaFbDriver>,
410c566df45SLoGin }
411c566df45SLoGin 
412c566df45SLoGin impl VesaFbDriver {
413c566df45SLoGin     const NAME: &'static str = "vesa-framebuffer";
414c566df45SLoGin }
415c566df45SLoGin 
416c566df45SLoGin impl PlatformDriver for VesaFbDriver {
417c566df45SLoGin     fn probe(&self, device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
418c566df45SLoGin         let device = device
419c566df45SLoGin             .clone()
420c566df45SLoGin             .arc_any()
421c566df45SLoGin             .downcast::<VesaFb>()
422c566df45SLoGin             .map_err(|_| SystemError::EINVAL)?;
423c566df45SLoGin 
424c566df45SLoGin         device.set_driver(Some(self.inner.lock_irqsave().self_ref.clone()));
425c566df45SLoGin 
426c566df45SLoGin         return Ok(());
427c566df45SLoGin     }
428c566df45SLoGin 
429c566df45SLoGin     fn remove(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
430c566df45SLoGin         todo!()
431c566df45SLoGin     }
432c566df45SLoGin 
433c566df45SLoGin     fn shutdown(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
434c566df45SLoGin         // do nothing
435c566df45SLoGin         return Ok(());
436c566df45SLoGin     }
437c566df45SLoGin 
438c566df45SLoGin     fn suspend(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
439c566df45SLoGin         // do nothing
440c566df45SLoGin         return Ok(());
441c566df45SLoGin     }
442c566df45SLoGin 
443c566df45SLoGin     fn resume(&self, _device: &Arc<dyn PlatformDevice>) -> Result<(), SystemError> {
444c566df45SLoGin         todo!()
445c566df45SLoGin     }
446c566df45SLoGin }
447c566df45SLoGin 
448c566df45SLoGin impl Driver for VesaFbDriver {
449c566df45SLoGin     fn id_table(&self) -> Option<IdTable> {
450c566df45SLoGin         Some(IdTable::new(VesaFb::NAME.to_string(), None))
451c566df45SLoGin     }
452c566df45SLoGin 
453c566df45SLoGin     fn devices(&self) -> Vec<Arc<dyn Device>> {
454c566df45SLoGin         self.inner.lock().devices.clone()
455c566df45SLoGin     }
456c566df45SLoGin 
457c566df45SLoGin     fn add_device(&self, device: Arc<dyn Device>) {
458c566df45SLoGin         let mut guard = self.inner.lock();
459c566df45SLoGin         // check if the device is already in the list
460c566df45SLoGin         if guard.devices.iter().any(|dev| Arc::ptr_eq(dev, &device)) {
461c566df45SLoGin             return;
462c566df45SLoGin         }
463c566df45SLoGin 
464c566df45SLoGin         guard.devices.push(device);
465c566df45SLoGin     }
466c566df45SLoGin 
467c566df45SLoGin     fn delete_device(&self, device: &Arc<dyn Device>) {
468c566df45SLoGin         let mut guard = self.inner.lock();
469c566df45SLoGin         guard.devices.retain(|dev| !Arc::ptr_eq(dev, device));
470c566df45SLoGin     }
471c566df45SLoGin 
472c566df45SLoGin     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
473c566df45SLoGin         self.inner.lock().bus = bus;
474c566df45SLoGin     }
475c566df45SLoGin 
476c566df45SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
477c566df45SLoGin         self.inner.lock().bus.clone()
478c566df45SLoGin     }
479c566df45SLoGin 
480c566df45SLoGin     fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] {
481c566df45SLoGin         return &[&VesaFbAnonAttributeGroup];
482c566df45SLoGin     }
483c566df45SLoGin }
484c566df45SLoGin 
485c566df45SLoGin impl KObject for VesaFbDriver {
486c566df45SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
487c566df45SLoGin         self
488c566df45SLoGin     }
489c566df45SLoGin 
490c566df45SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
491c566df45SLoGin         self.inner.lock().kernfs_inode = inode;
492c566df45SLoGin     }
493c566df45SLoGin 
494c566df45SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
495c566df45SLoGin         self.inner.lock().kernfs_inode.clone()
496c566df45SLoGin     }
497c566df45SLoGin 
498c566df45SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
499c566df45SLoGin         self.inner.lock().parent.clone()
500c566df45SLoGin     }
501c566df45SLoGin 
502c566df45SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
503c566df45SLoGin         self.inner.lock().parent = parent;
504c566df45SLoGin     }
505c566df45SLoGin 
506c566df45SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
507c566df45SLoGin         self.inner.lock().kset.clone()
508c566df45SLoGin     }
509c566df45SLoGin 
510c566df45SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
511c566df45SLoGin         self.inner.lock().kset = kset;
512c566df45SLoGin     }
513c566df45SLoGin 
514c566df45SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
515c566df45SLoGin         self.inner.lock().ktype
516c566df45SLoGin     }
517c566df45SLoGin 
518c566df45SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
519c566df45SLoGin         self.inner.lock().ktype = ktype;
520c566df45SLoGin     }
521c566df45SLoGin 
522c566df45SLoGin     fn name(&self) -> String {
523c566df45SLoGin         Self::NAME.to_string()
524c566df45SLoGin     }
525c566df45SLoGin 
526c566df45SLoGin     fn set_name(&self, _name: String) {
527c566df45SLoGin         // do nothing
528c566df45SLoGin     }
529c566df45SLoGin 
530c566df45SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
531c566df45SLoGin         self.kobj_state.read()
532c566df45SLoGin     }
533c566df45SLoGin 
534c566df45SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
535c566df45SLoGin         self.kobj_state.write()
536c566df45SLoGin     }
537c566df45SLoGin 
538c566df45SLoGin     fn set_kobj_state(&self, state: KObjectState) {
539c566df45SLoGin         *self.kobj_state.write() = state;
540c566df45SLoGin     }
541c566df45SLoGin }
542c566df45SLoGin 
543c566df45SLoGin #[derive(Debug)]
544c566df45SLoGin struct VesaFbAnonAttributeGroup;
545c566df45SLoGin 
546c566df45SLoGin impl AttributeGroup for VesaFbAnonAttributeGroup {
547c566df45SLoGin     fn name(&self) -> Option<&str> {
548c566df45SLoGin         None
549c566df45SLoGin     }
550c566df45SLoGin 
551c566df45SLoGin     fn attrs(&self) -> &[&'static dyn Attribute] {
552c566df45SLoGin         &[&AnonAttrPhysAddr as &'static dyn Attribute]
553c566df45SLoGin     }
554c566df45SLoGin 
555c566df45SLoGin     fn is_visible(
556c566df45SLoGin         &self,
557c566df45SLoGin         _kobj: Arc<dyn KObject>,
558c566df45SLoGin         attr: &'static dyn Attribute,
559c566df45SLoGin     ) -> Option<ModeType> {
560c566df45SLoGin         Some(attr.mode())
561c566df45SLoGin     }
562c566df45SLoGin }
563c566df45SLoGin 
564c566df45SLoGin #[derive(Debug)]
565c566df45SLoGin struct AnonAttrPhysAddr;
566c566df45SLoGin 
567c566df45SLoGin impl Attribute for AnonAttrPhysAddr {
568c566df45SLoGin     fn name(&self) -> &str {
569c566df45SLoGin         "smem_start"
570c566df45SLoGin     }
571c566df45SLoGin 
572c566df45SLoGin     fn mode(&self) -> ModeType {
573c566df45SLoGin         ModeType::S_IRUGO
574c566df45SLoGin     }
575c566df45SLoGin 
576c566df45SLoGin     fn support(&self) -> SysFSOpsSupport {
577c566df45SLoGin         SysFSOpsSupport::SHOW
578c566df45SLoGin     }
579c566df45SLoGin 
580c566df45SLoGin     fn show(&self, _kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> {
581c566df45SLoGin         sysfs_emit_str(
582c566df45SLoGin             buf,
583c566df45SLoGin             format!(
584c566df45SLoGin                 "0x{:x}\n",
585c566df45SLoGin                 VESAFB_FIX_INFO
586c566df45SLoGin                     .read()
587c566df45SLoGin                     .smem_start
588c566df45SLoGin                     .unwrap_or(PhysAddr::new(0))
589c566df45SLoGin                     .data()
590c566df45SLoGin             )
591c566df45SLoGin             .as_str(),
592c566df45SLoGin         )
593c566df45SLoGin     }
594c566df45SLoGin }
595c566df45SLoGin 
596c566df45SLoGin #[unified_init(INITCALL_DEVICE)]
597c566df45SLoGin pub fn vesa_fb_driver_init() -> Result<(), SystemError> {
598c566df45SLoGin     let driver = VesaFbDriver::new();
599c566df45SLoGin 
600c566df45SLoGin     platform_driver_manager().register(driver)?;
601c566df45SLoGin 
602c566df45SLoGin     return Ok(());
603c566df45SLoGin }
604c566df45SLoGin 
605c566df45SLoGin /// 在内存管理初始化之前,初始化vesafb
606c566df45SLoGin pub fn vesafb_early_init() -> Result<VirtAddr, SystemError> {
607c566df45SLoGin     let mut _reserved: u32 = 0;
608c566df45SLoGin 
609c566df45SLoGin     let mut fb_info: MaybeUninit<multiboot_tag_framebuffer_info_t> = MaybeUninit::uninit();
610c566df45SLoGin     //从multiboot2中读取帧缓冲区信息至fb_info
611c566df45SLoGin 
612c566df45SLoGin     // todo: 换成rust的,并且检测是否成功获取
613c566df45SLoGin     unsafe {
614c566df45SLoGin         multiboot2_iter(
615c566df45SLoGin             Some(multiboot2_get_Framebuffer_info),
616c566df45SLoGin             fb_info.as_mut_ptr() as usize as *mut c_void,
617c566df45SLoGin             &mut _reserved as *mut c_uint,
618c566df45SLoGin         )
619c566df45SLoGin     };
620c566df45SLoGin     unsafe { fb_info.assume_init() };
621c566df45SLoGin     let fb_info: multiboot_tag_framebuffer_info_t = unsafe { core::mem::transmute(fb_info) };
622c566df45SLoGin 
623c566df45SLoGin     // todo: 判断是否有vesa帧缓冲区,这里暂时直接设置true
624c566df45SLoGin     HAS_VESA_FB.store(true, core::sync::atomic::Ordering::SeqCst);
625c566df45SLoGin 
626c566df45SLoGin     let width = fb_info.framebuffer_width;
627c566df45SLoGin     let height = fb_info.framebuffer_height;
628c566df45SLoGin 
629c566df45SLoGin     let mut boot_params_guard = boot_params().write();
630c566df45SLoGin     let boottime_screen_info = &mut boot_params_guard.screen_info;
631c566df45SLoGin 
632c566df45SLoGin     boottime_screen_info.is_vga = true;
633c566df45SLoGin 
634c566df45SLoGin     boottime_screen_info.lfb_base = PhysAddr::new(fb_info.framebuffer_addr as usize);
635c566df45SLoGin 
636c566df45SLoGin     if fb_info.framebuffer_type == 2 {
637c566df45SLoGin         //当type=2时,width与height用字符数表示,故depth=8
638c566df45SLoGin         boottime_screen_info.origin_video_cols = width as u8;
639c566df45SLoGin         boottime_screen_info.origin_video_lines = height as u8;
640c566df45SLoGin         boottime_screen_info.video_type = BootTimeVideoType::Mda;
641c566df45SLoGin         boottime_screen_info.lfb_depth = 8;
642c566df45SLoGin     } else {
643c566df45SLoGin         //否则为图像模式,depth应参照帧缓冲区信息里面的每个像素的位数
644c566df45SLoGin         boottime_screen_info.lfb_width = width;
645c566df45SLoGin         boottime_screen_info.lfb_height = height;
646c566df45SLoGin         boottime_screen_info.video_type = BootTimeVideoType::Vlfb;
647c566df45SLoGin         boottime_screen_info.lfb_depth = fb_info.framebuffer_bpp as u8;
648c566df45SLoGin     }
649c566df45SLoGin 
650c566df45SLoGin     boottime_screen_info.lfb_size =
651c566df45SLoGin         (width * height * ((fb_info.framebuffer_bpp as u32 + 7) / 8)) as usize;
652c566df45SLoGin 
653c566df45SLoGin     let buf_vaddr = VirtAddr::new(0xffff800003200000);
654c566df45SLoGin     boottime_screen_info.lfb_virt_base = Some(buf_vaddr);
655c566df45SLoGin 
656c566df45SLoGin     let init_text = "Video driver to map.\n\0";
657c566df45SLoGin     send_to_default_serial8250_port(init_text.as_bytes());
658c566df45SLoGin 
659c566df45SLoGin     // 地址映射
660c566df45SLoGin     let paddr = PhysAddr::new(fb_info.framebuffer_addr as usize);
661c566df45SLoGin     let count =
662c566df45SLoGin         PageFrameCount::new(page_align_up(boottime_screen_info.lfb_size) / MMArch::PAGE_SIZE);
663c566df45SLoGin     unsafe { pseudo_map_phys(buf_vaddr, paddr, count) };
664c566df45SLoGin     return Ok(buf_vaddr);
665c566df45SLoGin }
666c566df45SLoGin 
667c566df45SLoGin #[unified_init(INITCALL_DEVICE)]
668c566df45SLoGin fn vesa_fb_device_init() -> Result<(), SystemError> {
669c566df45SLoGin     // 如果没有vesa帧缓冲区,直接返回
670c566df45SLoGin     if !HAS_VESA_FB.load(core::sync::atomic::Ordering::SeqCst) {
671c566df45SLoGin         return Ok(());
672c566df45SLoGin     }
673c566df45SLoGin 
674c566df45SLoGin     static INIT: Once = Once::new();
675c566df45SLoGin     INIT.call_once(|| {
676c566df45SLoGin         kinfo!("vesa fb device init");
677c566df45SLoGin 
678c566df45SLoGin         let mut fix_info_guard = VESAFB_FIX_INFO.write_irqsave();
679c566df45SLoGin         let mut var_info_guard = VESAFB_DEFINED.write_irqsave();
680c566df45SLoGin 
681c566df45SLoGin         let boot_params_guard = boot_params().read();
682c566df45SLoGin         let boottime_screen_info = &boot_params_guard.screen_info;
683c566df45SLoGin 
684c566df45SLoGin         fix_info_guard.smem_start = Some(boottime_screen_info.lfb_base);
685c566df45SLoGin         fix_info_guard.smem_len = boottime_screen_info.lfb_size;
686c566df45SLoGin 
687c566df45SLoGin         if boottime_screen_info.video_type == BootTimeVideoType::Mda {
688c566df45SLoGin             fix_info_guard.visual = FbVisual::Mono10;
689c566df45SLoGin             var_info_guard.bits_per_pixel = 8;
690c566df45SLoGin             fix_info_guard.line_length = (boottime_screen_info.origin_video_cols as u32)
691c566df45SLoGin                 * (var_info_guard.bits_per_pixel / 8);
692c566df45SLoGin             var_info_guard.xres_virtual = boottime_screen_info.origin_video_cols as u32;
693c566df45SLoGin             var_info_guard.yres_virtual = boottime_screen_info.origin_video_lines as u32;
694c566df45SLoGin         } else {
695c566df45SLoGin             fix_info_guard.visual = FbVisual::TrueColor;
696c566df45SLoGin             var_info_guard.bits_per_pixel = boottime_screen_info.lfb_depth as u32;
697c566df45SLoGin             fix_info_guard.line_length =
698c566df45SLoGin                 (boottime_screen_info.lfb_width as u32) * (var_info_guard.bits_per_pixel / 8);
699c566df45SLoGin             var_info_guard.xres_virtual = boottime_screen_info.lfb_width as u32;
700c566df45SLoGin             var_info_guard.yres_virtual = boottime_screen_info.lfb_height as u32;
701c566df45SLoGin         }
702c566df45SLoGin 
703c566df45SLoGin         drop(var_info_guard);
704c566df45SLoGin         drop(fix_info_guard);
705c566df45SLoGin 
706c566df45SLoGin         let device = Arc::new(VesaFb::new());
707c566df45SLoGin         device_manager().device_default_initialize(&(device.clone() as Arc<dyn Device>));
708c566df45SLoGin 
709c566df45SLoGin         platform_device_manager()
710c566df45SLoGin             .device_add(device.clone() as Arc<dyn PlatformDevice>)
711c566df45SLoGin             .expect("vesa_fb_device_init: platform_device_manager().device_add failed");
712c566df45SLoGin 
713c566df45SLoGin         frame_buffer_manager()
714c566df45SLoGin             .register_fb(device.clone() as Arc<dyn FrameBuffer>)
715c566df45SLoGin             .expect("vesa_fb_device_init: frame_buffer_manager().register_fb failed");
716c566df45SLoGin 
717c566df45SLoGin         // 设置vesa fb的状态为运行中
718c566df45SLoGin         device.inner.lock().fb_state = FbState::Running;
719c566df45SLoGin     });
720c566df45SLoGin 
721c566df45SLoGin     return Ok(());
722c566df45SLoGin }
723