diff --git a/src/main.rs b/src/main.rs
index 755771196e2e85df464aee29aa96d83a3597fff5..75b754b40a8ab5ce866e91dd6e372d8ecb6f7b18 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -44,7 +44,6 @@ use libtock::buttons::ButtonState;
 use libtock::console::Console;
 use libtock::leds::LedsDriver;
 use libtock::result::TockResult;
-use libtock::syscalls;
 use libtock::timer;
 #[cfg(feature = "debug_ctap")]
 use libtock::timer::Timer;
@@ -363,7 +362,7 @@ fn check_user_presence(cid: ChannelID) -> Result<(), Ctap2StatusCode> {
         let keepalive_alarm = keepalive.set_alarm(KEEPALIVE_DELAY).unwrap();
 
         // Wait for a button touch or an alarm.
-        syscalls::yieldk_for(|| button_touched.get() || keepalive_expired.get());
+        usb_ctap_hid::yieldk_for(|| button_touched.get() || keepalive_expired.get());
 
         // Cleanup alarm callback.
         match keepalive.stop_alarm(keepalive_alarm) {
@@ -403,4 +402,4 @@ fn check_user_presence(cid: ChannelID) -> Result<(), Ctap2StatusCode> {
     } else {
         Err(Ctap2StatusCode::CTAP2_ERR_USER_ACTION_TIMEOUT)
     }
-}
+}
\ No newline at end of file
diff --git a/src/usb_ctap_hid.rs b/src/usb_ctap_hid.rs
index 8e35151a1c19e36588ec32c2fa22a40c5560762f..07152e1bcba87b9e04f3bc4ba77b6f020418c49a 100644
--- a/src/usb_ctap_hid.rs
+++ b/src/usb_ctap_hid.rs
@@ -81,7 +81,7 @@ pub fn recv(buf: &mut [u8; 64]) -> bool {
         return false;
     }
 
-    syscalls::yieldk_for(|| done.get());
+    yieldk_for(|| done.get());
     true
 }
 
@@ -104,7 +104,7 @@ pub fn send(buf: &mut [u8; 64]) -> bool {
         return false;
     }
 
-    syscalls::yieldk_for(|| done.get());
+    yieldk_for(|| done.get());
     true
 }
 
@@ -154,7 +154,7 @@ pub fn send_or_recv(buf: &mut [u8; 64]) -> SendOrRecvStatus {
         return SendOrRecvStatus::Error;
     }
 
-    syscalls::yieldk_for(|| status.get().is_some());
+    yieldk_for(|| status.get().is_some());
     status.get().unwrap()
 }
 
@@ -261,7 +261,7 @@ fn recv_with_timeout_detail(
         return Some(SendOrRecvStatus::Error);
     }
 
-    syscalls::yieldk_for(|| status.get().is_some() || timeout_expired.get());
+    yieldk_for(|| status.get().is_some() || timeout_expired.get());
 
     // Cleanup alarm callback.
     match timeout.stop_alarm(timeout_alarm) {
@@ -362,7 +362,7 @@ fn send_or_recv_with_timeout_detail(
         return Some(SendOrRecvStatus::Error);
     }
 
-    syscalls::yieldk_for(|| status.get().is_some() || timeout_expired.get());
+    yieldk_for(|| status.get().is_some() || timeout_expired.get());
 
     // Cleanup alarm callback.
     match timeout.stop_alarm(timeout_alarm) {
@@ -411,3 +411,11 @@ fn send_or_recv_with_timeout_detail(
 
     status.get()
 }
+
+pub(crate) fn yieldk_for<F: Fn() -> bool>(cond: F) {
+    while !cond() {
+        unsafe {
+            syscalls::raw::yieldk();
+        }
+    }
+}
\ No newline at end of file