Project Description
I plan on continuing on with my Linux Kernel Library efforts from Hackweek 19. This time I'd like to spice things up a bit by plumbing USB devices into LKL, allowing reuse of native Linux USB host and filesystem drivers on non-root Android.
Goals
- enumerate USB devices on Android
- use the Android USB getFileDescriptor API to obtain a file descriptor for a connected USB device
- find out what kind of magic is needed to plumb the USB device fd into LKL
- XHCI emulation (see crosvm implementation) or...
- a simple proxy: Android USB fd <-> LKL GadgetFS driver <-> LKL dummy-hcd loopback
- successfully mount a Btrfs filesystem from LKL
- stretch goal: help out again with LKL mainlining efforts
- stretch goal: add DocumentsProvider integration so that LKL mounts are accessible to the Android device
- stretch goal: map a LUKS/dm-crypt device
Resources
Looking for hackers with the skills:
Nothing? Add some keywords!
This project is part of:
Hack Week 20 Hack Week 21
Activity
Comments
-
over 3 years ago by dmdiss | Reply
With hackweek now over, below is a summary of what I achieved. I decided to prioritize learning a new language, which saw me use Rust for the implementation. This slowed me down quite a bit, leaving:
- revisited current upstream lkl state
- found current UML merge submissions lack Android support, so instead fell-back to thehajime's lkl-next repo
- rebased ceph-walkley (from hw19) against lkl-v5.10
- submitted a couple of minor PRs upstream: 1 and 2
- rebased ceph-walkley's embedded wireguard library against upstream
- reworked the ceph-walkley build process to better handle kconfig and parallel build jobs
- learned Rust's bindgen to generate lkl_host and libusb language bindings
- investigated Linux's functionfs gadget API, mostly via the upstream example
- wrote basic lkl boot / init program in Rust
- wrote libusb dev/config/interface/endpoint enumeration utility in Rust
- revisited current upstream lkl state
-
over 3 years ago by dmdiss | Reply
I've published my Hackweek 20 source code at https://github.com/ddiss/walkley-usb. This is my first proper Rust project, which probably shows. To build, it requires lkl-next-5.10 liblkl at
$LKL_DIR
, which will be statically linked. -
over 2 years ago by dmdiss | Reply
I plan on continuing with this project during the upcoming Hackweek 21. Upstream LKL appears to be lagging behind mainline a bit, so I'll probably start there. After that I'd like to get the
USB host device <-> LKL GadgetFS driver <-> LKL dummy-hcd loopback
I/O path working on "regular" openSUSE Linux first before attempting to port to Android.-
over 2 years ago by dmdiss | Reply
I've pushed my work from Hack Week 21 to https://github.com/ddiss/walkley . USB device pass-through configuration is triggered via the
./walkley --usb VENDOR_ID:PRODUCT_ID
whereVENDOR_ID
andPRODUCT_ID
match a host-connected USB device.USB I/O proxying between host chardev and lkl functionfs endpoints needs more work and hasn't been merged yet.
Demo:
``` Host shell: walkley (main)> lsusb ... Bus 004 Device 002: ID 11b0:3307 ATECH FLASH TECHNOLOGY UHSII uSD Reader
walkley (main)> make -j3 DEBUG=yes LKLCONFIG=lklusbconfig && ./walkley --usb 11b0:3307
[ 0.014564] dummyhcd dummyhcd.0: USB Host+Gadget Emulator, driver 02 May 2005 [ 0.014576] dummyhcd dummyhcd.0: Dummy host controller [ 0.014589] dummyhcd dummyhcd.0: new USB bus registered, assigned bus number 1 [ 0.014792] hub 1-0:1.0: USB hub found [ 0.014813] hub 1-0:1.0: 1 port detected [ 0.015186] Btrfs loaded, crc32c=crc32c-generic ... (walkley.c:865) checking USB bus at /dev/bus/usb/004 (walkley.c:884) opening USB device at /dev/bus/usb/004/002 (walkley.c:760) read 62 bytes data from /dev/bus/usb/004/002 /dev/bus/usb/002/003 Vendor=0x11b0 Product=0x3307 -> matched, proceeding with passthrough. (walkley.c:696) USB interface Class=8, SubClass=6, Protocol=80, Endpoints=2 [ 0.292754] file system registered (walkley.c:715) -> EP 9: IN (0x81) (walkley.c:723) -> Skipping non-endpoint type 0x30 (walkley.c:718) -> EP 22: OUT (0x2) (walkley.c:723) -> Skipping non-endpoint type 0x30
walkley:/> cat /proc/mounts none / rootfs rw 0 0 proc /proc proc rw,relatime 0 0 configfs /configfs configfs rw,relatime 0 0 devtmpfs /dev devtmpfs rw,relatime 0 0 walkley /walkley_ffs functionfs rw,relatime 0 0
walkley:/> cat /configfs/usbgadget/0x0/idProduct 0x3307 walkley:/> cat /configfs/usbgadget/0x0/idVendor 0x11b0 walkley:/> ls /walkley_ffs . .. ep0
```
-
Similar Projects
This project is one of its kind!