xref: /DragonOS/kernel/src/driver/video/mod.rs (revision bacd691c9ef0502b5cc618aad50517f9e59df5e0)
1 use core::{ptr::null_mut, sync::atomic::{AtomicBool, Ordering}};
2 
3 use alloc::sync::Arc;
4 
5 use crate::{
6     exception::softirq::{SoftirqNumber, SoftirqVec, softirq_vectors},
7     include::bindings::bindings::video_refresh_framebuffer,
8 };
9 
10 #[derive(Debug)]
11 pub struct VideoRefreshFramebuffer{
12     running: AtomicBool
13 }
14 
15 impl SoftirqVec for VideoRefreshFramebuffer {
16     fn run(&self) {
17         if self.set_run() == false{
18             return;
19         }
20 
21         unsafe {
22             video_refresh_framebuffer(null_mut());
23         }
24 
25         self.clear_run();
26     }
27 }
28 impl VideoRefreshFramebuffer {
29     pub fn new() -> VideoRefreshFramebuffer {
30         VideoRefreshFramebuffer {
31             running: AtomicBool::new(false)
32         }
33     }
34 
35     fn set_run(&self) -> bool {
36         let x = self
37             .running
38             .compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed);
39         if x.is_ok() {
40             return true;
41         } else {
42             return false;
43         }
44     }
45 
46     fn clear_run(&self) {
47         self.running.store(false, Ordering::Release);
48     }
49 }
50 
51 pub fn register_softirq_video() {
52     // kdebug!("register_softirq_video");
53     let handler = Arc::new(VideoRefreshFramebuffer::new());
54     softirq_vectors()
55         .register_softirq(SoftirqNumber::VideoRefresh, handler)
56         .expect("register_softirq_video run failed");
57 }
58 // ======= 以下为给C提供的接口,video重构完后请删除 =======
59 #[no_mangle]
60 pub extern "C" fn rs_register_softirq_video() {
61     register_softirq_video();
62 }
63