firmware for my Touchscreen E-Paper Input Module for Framework Laptop 16
0

Configure Feed

Select the types of activity you want to include in your feed.

eepy: reorganise syscall handlers

+92 -80
+92 -80
eepy/src/syscall.rs
··· 1 1 use core::arch::global_asm; 2 - use core::sync::atomic::Ordering; 3 2 use defmt::trace; 4 - use eepy_sys::image::{ImageSyscall, RefreshBlockMode}; 5 - use eepy_sys::input::{Event, InputSyscall, ScEventType, TouchEvent, TouchEventType}; 6 - use eepy_sys::misc::MiscSyscall; 7 3 use eepy_sys::syscall::SyscallNumber; 8 - use tp370pgh01::IMAGE_BYTES; 9 - use crate::{DO_REFRESH, EVENT_QUEUE, FAST_REFRESH, IMAGE_BUFFER, REFRESHING, SERIAL_NUMBER, TOUCH_ENABLED}; 10 4 11 5 global_asm!(include_str!("syscall.s")); 12 6 ··· 41 35 ); 42 36 43 37 match SyscallNumber::try_from(syscall_num) { 44 - Ok(SyscallNumber::Misc) => handle_misc(stack_values), 45 - Ok(SyscallNumber::Image) => handle_image(stack_values), 46 - Ok(SyscallNumber::Input) => handle_input(stack_values), 38 + Ok(SyscallNumber::Misc) => misc::handle_misc(stack_values), 39 + Ok(SyscallNumber::Image) => image::handle_image(stack_values), 40 + Ok(SyscallNumber::Input) => input::handle_input(stack_values), 47 41 Ok(SyscallNumber::Usb) => todo!("usb syscalls"), 48 42 _ => panic!("illegal syscall"), 49 43 } 50 44 } 51 45 52 - fn handle_misc(stack_values: &mut [usize]) { 53 - match MiscSyscall::try_from(stack_values[0]) { 54 - Ok(MiscSyscall::GetSerial) => handle_get_serial(stack_values), 55 - _ => panic!("illegal syscall"), 46 + mod misc { 47 + use eepy_sys::misc::MiscSyscall; 48 + use crate::SERIAL_NUMBER; 49 + 50 + pub(super) fn handle_misc(stack_values: &mut [usize]) { 51 + match MiscSyscall::try_from(stack_values[0]) { 52 + Ok(MiscSyscall::GetSerial) => handle_get_serial(stack_values), 53 + _ => panic!("illegal syscall"), 54 + } 55 + } 56 + 57 + fn handle_get_serial(stack_values: &mut [usize]) { 58 + stack_values[0] = (&raw const *SERIAL_NUMBER.get().unwrap()) as usize; 56 59 } 57 60 } 58 61 59 - fn handle_get_serial(stack_values: &mut [usize]) { 60 - stack_values[0] = (&raw const *SERIAL_NUMBER.get().unwrap()) as usize; 61 - } 62 + mod image { 63 + use core::sync::atomic::Ordering; 64 + use eepy_sys::image::{ImageSyscall, RefreshBlockMode}; 65 + use tp370pgh01::IMAGE_BYTES; 66 + use crate::{DO_REFRESH, FAST_REFRESH, IMAGE_BUFFER, REFRESHING}; 62 67 63 - fn handle_image(stack_values: &mut [usize]) { 64 - match ImageSyscall::try_from(stack_values[0]) { 65 - Ok(ImageSyscall::WriteImage) => handle_write_image(stack_values), 66 - Ok(ImageSyscall::Refresh) => handle_refresh(stack_values), 67 - _ => panic!("illegal syscall"), 68 + pub(super) fn handle_image(stack_values: &mut [usize]) { 69 + match ImageSyscall::try_from(stack_values[0]) { 70 + Ok(ImageSyscall::WriteImage) => handle_write_image(stack_values), 71 + Ok(ImageSyscall::Refresh) => handle_refresh(stack_values), 72 + _ => panic!("illegal syscall"), 73 + } 68 74 } 69 - } 70 75 71 - fn handle_write_image(stack_values: &mut [usize]) { 72 - let image: &[u8; IMAGE_BYTES] = unsafe { &*(stack_values[1] as *const [u8; IMAGE_BYTES]) }; 73 - critical_section::with(|cs| IMAGE_BUFFER.borrow_ref_mut(cs).copy_from_slice(image)); 74 - } 76 + fn handle_write_image(stack_values: &mut [usize]) { 77 + let image: &[u8; IMAGE_BYTES] = unsafe { &*(stack_values[1] as *const [u8; IMAGE_BYTES]) }; 78 + critical_section::with(|cs| IMAGE_BUFFER.borrow_ref_mut(cs).copy_from_slice(image)); 79 + } 75 80 76 - fn handle_refresh(stack_values: &mut [usize]) { 77 - let fast_refresh = stack_values[1] != 0; 78 - let blocking_mode = RefreshBlockMode::try_from(stack_values[2]).expect("illegal refresh blocking mode"); 81 + fn handle_refresh(stack_values: &mut [usize]) { 82 + let fast_refresh = stack_values[1] != 0; 83 + let blocking_mode = RefreshBlockMode::try_from(stack_values[2]).expect("illegal refresh blocking mode"); 79 84 80 - DO_REFRESH.store(true, Ordering::Relaxed); 81 - FAST_REFRESH.store(fast_refresh, Ordering::Relaxed); 82 - cortex_m::asm::sev(); 85 + DO_REFRESH.store(true, Ordering::Relaxed); 86 + FAST_REFRESH.store(fast_refresh, Ordering::Relaxed); 87 + cortex_m::asm::sev(); 83 88 84 - if matches!(blocking_mode, RefreshBlockMode::BlockAcknowledge | RefreshBlockMode::BlockFinish) { 85 - while DO_REFRESH.load(Ordering::Relaxed) {} 86 - } 89 + if matches!(blocking_mode, RefreshBlockMode::BlockAcknowledge | RefreshBlockMode::BlockFinish) { 90 + while DO_REFRESH.load(Ordering::Relaxed) {} 91 + } 87 92 88 - if matches!(blocking_mode, RefreshBlockMode::BlockFinish) { 89 - while REFRESHING.load(Ordering::Relaxed) {} 93 + if matches!(blocking_mode, RefreshBlockMode::BlockFinish) { 94 + while REFRESHING.load(Ordering::Relaxed) {} 95 + } 90 96 } 91 97 } 92 98 93 - fn handle_input(stack_values: &mut [usize]) { 94 - match InputSyscall::try_from(stack_values[0]) { 95 - Ok(InputSyscall::NextEvent) => handle_next_event(stack_values), 96 - Ok(InputSyscall::SetTouchEnabled) => handle_set_touch_enabled(stack_values), 97 - Ok(InputSyscall::HasEvent) => handle_has_event(stack_values), 98 - _ => panic!("illegal syscall"), 99 + mod input { 100 + use core::sync::atomic::Ordering; 101 + use eepy_sys::input::{Event, InputSyscall, ScEventType, TouchEvent, TouchEventType}; 102 + use crate::{EVENT_QUEUE, TOUCH_ENABLED}; 103 + 104 + pub(super) fn handle_input(stack_values: &mut [usize]) { 105 + match InputSyscall::try_from(stack_values[0]) { 106 + Ok(InputSyscall::NextEvent) => handle_next_event(stack_values), 107 + Ok(InputSyscall::SetTouchEnabled) => handle_set_touch_enabled(stack_values), 108 + Ok(InputSyscall::HasEvent) => handle_has_event(stack_values), 109 + _ => panic!("illegal syscall"), 110 + } 99 111 } 100 - } 101 112 102 - fn handle_next_event(stack_values: &mut [usize]) { 103 - let next_event = critical_section::with(|cs| EVENT_QUEUE.borrow_ref_mut(cs).pop()); 104 - let mut x = 0; 105 - let mut y = 0; 106 - let sc_ev_type = match next_event { 107 - None => ScEventType::NoEvent, 108 - Some(Event::Touch(TouchEvent { ev_type: TouchEventType::Down, x: px, y: py })) => { 109 - x = px; 110 - y = py; 111 - ScEventType::TouchDown 112 - }, 113 - Some(Event::Touch(TouchEvent { ev_type: TouchEventType::Up, x: px, y: py })) => { 114 - x = px; 115 - y = py; 116 - ScEventType::TouchUp 117 - }, 118 - Some(Event::Touch(TouchEvent { ev_type: TouchEventType::Move, x: px, y: py })) => { 119 - x = px; 120 - y = py; 121 - ScEventType::TouchMove 122 - }, 123 - Some(Event::RefreshFinished) => ScEventType::RefreshFinished, 124 - }; 125 - stack_values[0] = sc_ev_type as usize; 126 - stack_values[1] = x as usize; 127 - stack_values[2] = y as usize; 128 - } 113 + fn handle_next_event(stack_values: &mut [usize]) { 114 + let next_event = critical_section::with(|cs| EVENT_QUEUE.borrow_ref_mut(cs).pop()); 115 + let mut x = 0; 116 + let mut y = 0; 117 + let sc_ev_type = match next_event { 118 + None => ScEventType::NoEvent, 119 + Some(Event::Touch(TouchEvent { ev_type: TouchEventType::Down, x: px, y: py })) => { 120 + x = px; 121 + y = py; 122 + ScEventType::TouchDown 123 + }, 124 + Some(Event::Touch(TouchEvent { ev_type: TouchEventType::Up, x: px, y: py })) => { 125 + x = px; 126 + y = py; 127 + ScEventType::TouchUp 128 + }, 129 + Some(Event::Touch(TouchEvent { ev_type: TouchEventType::Move, x: px, y: py })) => { 130 + x = px; 131 + y = py; 132 + ScEventType::TouchMove 133 + }, 134 + Some(Event::RefreshFinished) => ScEventType::RefreshFinished, 135 + }; 136 + stack_values[0] = sc_ev_type as usize; 137 + stack_values[1] = x as usize; 138 + stack_values[2] = y as usize; 139 + } 129 140 130 - fn handle_set_touch_enabled(stack_values: &mut [usize]) { 131 - let enable = stack_values[1] != 0; 132 - TOUCH_ENABLED.store(enable, Ordering::Relaxed); 133 - if !enable { 134 - critical_section::with(|cs| EVENT_QUEUE.borrow_ref_mut(cs).clear()); 141 + fn handle_set_touch_enabled(stack_values: &mut [usize]) { 142 + let enable = stack_values[1] != 0; 143 + TOUCH_ENABLED.store(enable, Ordering::Relaxed); 144 + if !enable { 145 + critical_section::with(|cs| EVENT_QUEUE.borrow_ref_mut(cs).clear()); 146 + } 135 147 } 136 - } 137 148 138 - fn handle_has_event(stack_values: &mut [usize]) { 139 - let empty = critical_section::with(|cs| EVENT_QUEUE.borrow_ref(cs).is_empty()); 140 - stack_values[0] = (!empty) as usize; 149 + fn handle_has_event(stack_values: &mut [usize]) { 150 + let empty = critical_section::with(|cs| EVENT_QUEUE.borrow_ref(cs).is_empty()); 151 + stack_values[0] = (!empty) as usize; 152 + } 141 153 }