diff --git a/embassy/demos/picow/Cargo.lock b/embassy/demos/picow/Cargo.lock
index 222f779fd08d68f6842204b3461995d470786a0f..6b497bd21937a10a91ca4e5abe734c6af2657de8 100644
--- a/embassy/demos/picow/Cargo.lock
+++ b/embassy/demos/picow/Cargo.lock
@@ -687,6 +687,20 @@ dependencies = [
  "heapless",
 ]
 
+[[package]]
+name = "embassy-usb"
+version = "0.1.0"
+source = "git+https://github.com/embassy-rs/embassy?rev=3e730aa8b06401003202bf9e21a9c83ec6b21b0e#3e730aa8b06401003202bf9e21a9c83ec6b21b0e"
+dependencies = [
+ "embassy-futures",
+ "embassy-net-driver-channel",
+ "embassy-sync 0.2.0 (git+https://github.com/embassy-rs/embassy?rev=3e730aa8b06401003202bf9e21a9c83ec6b21b0e)",
+ "embassy-usb-driver",
+ "heapless",
+ "ssmarshal",
+ "usbd-hid",
+]
+
 [[package]]
 name = "embassy-usb-driver"
 version = "0.1.0"
@@ -792,6 +806,12 @@ dependencies = [
  "log",
 ]
 
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
 [[package]]
 name = "errno"
 version = "0.3.1"
@@ -1167,17 +1187,6 @@ version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
 
-[[package]]
-name = "no-panic"
-version = "0.1.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "826c989b63ca62c4f2737e4c9e836a2124927d8aa13f9566b197ef0d191d8ac7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
 [[package]]
 name = "no-std-net"
 version = "0.5.0"
@@ -1566,6 +1575,12 @@ version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
 
+[[package]]
+name = "serde"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
+
 [[package]]
 name = "sha2"
 version = "0.10.6"
@@ -1646,6 +1661,16 @@ dependencies = [
  "lock_api",
 ]
 
+[[package]]
+name = "ssmarshal"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3e6ad23b128192ed337dfa4f1b8099ced0c2bf30d61e551b65fda5916dbb850"
+dependencies = [
+ "encode_unicode",
+ "serde",
+]
+
 [[package]]
 name = "stable_deref_trait"
 version = "1.2.0"
@@ -1702,7 +1727,6 @@ dependencies = [
  "heapless",
  "hmac",
  "log",
- "no-panic",
  "poly1305",
  "pretty-hex",
  "rand_core",
@@ -1752,6 +1776,7 @@ dependencies = [
  "embassy-rp",
  "embassy-sync 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "embassy-time 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "embassy-usb",
  "embedded-hal 1.0.0-alpha.10",
  "embedded-hal-async",
  "embedded-io 0.4.0",
@@ -1895,6 +1920,47 @@ dependencies = [
  "subtle",
 ]
 
+[[package]]
+name = "usb-device"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f6cc3adc849b5292b4075fc0d5fdcf2f24866e88e336dd27a8943090a520508"
+
+[[package]]
+name = "usbd-hid"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "975bd411f4a939986751ea09992a24fa47c4d25c6ed108d04b4c2999a4fd0132"
+dependencies = [
+ "serde",
+ "ssmarshal",
+ "usb-device",
+ "usbd-hid-macros",
+]
+
+[[package]]
+name = "usbd-hid-descriptors"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcbee8c6735e90894fba04770bc41e11fd3c5256018856e15dc4dd1e6c8a3dd1"
+dependencies = [
+ "bitfield",
+]
+
+[[package]]
+name = "usbd-hid-macros"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "261079a9ada015fa1acac7cc73c98559f3a92585e15f508034beccf6a2ab75a2"
+dependencies = [
+ "byteorder",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn",
+ "usbd-hid-descriptors",
+]
+
 [[package]]
 name = "vcell"
 version = "0.1.3"
diff --git a/embassy/demos/picow/Cargo.toml b/embassy/demos/picow/Cargo.toml
index 0fa6a1216a6e764fdcec47f18737de234cedce75..d42d89fda87c31af4132ed6a5557bff56c4510ad 100644
--- a/embassy/demos/picow/Cargo.toml
+++ b/embassy/demos/picow/Cargo.toml
@@ -23,6 +23,7 @@ embassy-net = { version = "0.1.0", features = ["tcp", "dhcpv4", "medium-ethernet
 embassy-net-driver = { version = "0.1.0" }
 embassy-sync = { version = "0.2.0" }
 embassy-futures = { version = "0.1.0" }
+embassy-usb = { version = "0.1.0" }
 atomic-polyfill = "0.1.5"
 static_cell = "1.0"
 
@@ -63,6 +64,7 @@ embassy-executor = { git = "https://github.com/embassy-rs/embassy", rev = "3e730
 embassy-futures = { git = "https://github.com/embassy-rs/embassy", rev = "3e730aa8b06401003202bf9e21a9c83ec6b21b0e" }
 embassy-rp = { git = "https://github.com/embassy-rs/embassy", rev = "3e730aa8b06401003202bf9e21a9c83ec6b21b0e" }
 embassy-net = { git = "https://github.com/embassy-rs/embassy", rev = "3e730aa8b06401003202bf9e21a9c83ec6b21b0e" }
+embassy-usb = { git = "https://github.com/embassy-rs/embassy", rev = "3e730aa8b06401003202bf9e21a9c83ec6b21b0e" }
 # for cyw43
 embassy-net-driver-channel = { git = "https://github.com/embassy-rs/embassy", rev = "3e730aa8b06401003202bf9e21a9c83ec6b21b0e" }
 embassy-net-driver = { git = "https://github.com/embassy-rs/embassy", rev = "3e730aa8b06401003202bf9e21a9c83ec6b21b0e" }
diff --git a/embassy/demos/picow/src/main.rs b/embassy/demos/picow/src/main.rs
index 82919ab82c403c4a2e63adce69156baa16af81ea..9413ae3510db58640dfed04a779b998c0d6e40ed 100644
--- a/embassy/demos/picow/src/main.rs
+++ b/embassy/demos/picow/src/main.rs
@@ -4,7 +4,6 @@
 #![feature(async_fn_in_trait)]
 // #![allow(incomplete_features)]
 
-use defmt::*;
 use embassy_executor::Spawner;
 use embassy_net::Stack;
 use embassy_rp::pio::PioPeripheral;
@@ -18,6 +17,7 @@ use embassy_sync::signal::Signal;
 use embassy_sync::blocking_mutex::raw::NoopRawMutex;
 
 use sunset::*;
+use sunset::prelude::*;
 use sunset_embassy::SSHServer;
 
 pub(crate) use sunset_demo_embassy_common as demo_common;
@@ -25,6 +25,8 @@ use crate::demo_common::singleton;
 
 mod flashconfig;
 mod wifi;
+mod usbserial;
+mod switchpipe;
 
 use demo_common::{SSHConfig, demo_menu, Shell};
 
@@ -32,11 +34,6 @@ const NUM_LISTENERS: usize = 4;
 // +1 for dhcp. referenced directly by wifi_stack() function
 pub(crate) const NUM_SOCKETS: usize = NUM_LISTENERS+1;
 
-#[embassy_executor::task]
-async fn net_task(stack: &'static Stack<cyw43::NetDriver<'static>>) -> ! {
-    stack.run().await
-}
-
 #[embassy_executor::main]
 async fn main(spawner: Spawner) {
     info!("Hello World!");
@@ -62,7 +59,11 @@ async fn main(spawner: Spawner) {
     let stack = wifi::wifi_stack(&spawner, p.PIN_23, p.PIN_24, p.PIN_25, p.PIN_29, p.DMA_CH0, sm,
         wifi_net, wifi_pw).await;
     let stack = &*singleton!(stack);
-    unwrap!(spawner.spawn(net_task(&stack)));
+    spawner.spawn(net_task(&stack)).unwrap();
+
+    let usb_pipe = switchpipe::SwitchPipe::new();
+    let usb_pipe = usb_pipe.base();
+    let r = usb_pipe.switch_read();
 
     for _ in 0..NUM_LISTENERS {
         spawner.spawn(listener(&stack, &ssh_config)).unwrap();
@@ -123,3 +124,20 @@ impl Shell for DemoShell {
         session.await
     }
 }
+
+#[embassy_executor::task]
+async fn net_task(stack: &'static Stack<cyw43::NetDriver<'static>>) -> ! {
+    stack.run().await
+}
+
+#[embassy_executor::task]
+async fn usb_serial_task(usb: embassy_rp::peripherals::USB,
+    irq: embassy_rp::interrupt::USBCTRL_IRQ,
+    ) -> ! {
+
+    // let mut p = embassy_sync::pipe::Pipe(64);
+
+    // usbserial.usb_serial(usb, irq, tx, rx).await;
+    todo!("shoudln't exit");
+}
+