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