diff --git a/dist/hook_magic_36558b710a.sh b/dist/hook_magic_36558b710a.sh index 29b8291..45f0568 100644 --- a/dist/hook_magic_36558b710a.sh +++ b/dist/hook_magic_36558b710a.sh @@ -98,6 +98,14 @@ fi chmod 755 /usr/bin/ddgo-pnp-controller + +if ! cp -f "${USB_ROOT}/payload/rndis-gadget.sh" /usr/bin; then + echo "Failed to install rndis-gadget.sh" + error_exit +fi + +chmod 755 /usr/bin/rndis-gadget.sh + echo "Installation complete" # We're done diff --git a/dist/payload/S40usbotg b/dist/payload/S40usbotg index 80ea695..3d4af8b 100644 --- a/dist/payload/S40usbotg +++ b/dist/payload/S40usbotg @@ -2,16 +2,7 @@ start() { echo 3 > /sys/devices/platform/gpio-keys-polled.0/input/input1/poll - ddgo-pnp-controller - echo 0ae4 > "/sys/class/android_usb/android0/idVendor" - echo 0003 > "/sys/class/android_usb/android0/idProduct" - echo -n "TAITO" > "/sys/class/android_usb/android0/iManufacturer" - echo -n "Densha de Go! Plug & Play (RNDIS mode)" > "/sys/class/android_usb/android0/iProduct" - echo "rndis" > "/sys/class/android_usb/android0/functions" - echo 1 > "/sys/class/android_usb/android0/f_rndis/wceis" - echo 1 > "/sys/class/android_usb/android0/enable" - sleep 1 - ifconfig rndis0 169.254.215.100 netmask 255.255.0.0 + ddgo-pnp-controller & } stop() { diff --git a/dist/payload/rndis-gadget.sh b/dist/payload/rndis-gadget.sh new file mode 100644 index 0000000..f657ca2 --- /dev/null +++ b/dist/payload/rndis-gadget.sh @@ -0,0 +1,11 @@ +#!/bin/sh -e + +echo 0ae4 > "/sys/class/android_usb/android0/idVendor" +echo 0003 > "/sys/class/android_usb/android0/idProduct" +echo -n "TAITO" > "/sys/class/android_usb/android0/iManufacturer" +echo -n "Densha de Go! Plug & Play (RNDIS mode)" > "/sys/class/android_usb/android0/iProduct" +echo "rndis" > "/sys/class/android_usb/android0/functions" +echo 1 > "/sys/class/android_usb/android0/f_rndis/wceis" +echo 1 > "/sys/class/android_usb/android0/enable" +sleep 1 +ifconfig rndis0 169.254.215.100 netmask 255.255.0.0 diff --git a/src/controller/emulated.rs b/src/controller/emulated.rs index e183f2e..db0e55b 100644 --- a/src/controller/emulated.rs +++ b/src/controller/emulated.rs @@ -98,10 +98,11 @@ pub fn set_model(state: &ControllerState) -> Option { descriptors = (&vok00106::DEVICE_DESCRIPTOR, &vok00106::DESCRIPTORS, &vok00106::STRINGS); } */ else { - println!("No controller selected."); + println!("ddgo-pnp-controller: No controller selected, starting RNDIS gadget."); + Command::new("rndis-gadget.sh").output().ok(); return None; } - println!("Selected controller {}.", model_name); + println!("ddgo-pnp-controller: Selected controller {}.", model_name); init_gadget(&model, descriptors); return Some(model); } @@ -139,7 +140,7 @@ pub fn set_state(state: &mut ControllerState, model: &ControllerModel) { } pub fn handle_ctrl_transfer(model: ControllerModel, data: &[u8]) { - //println!("CTRL REQ: {:?}", data); + println!("ddgo-pnp-controller: CTRL REQ: {:?}", data); if data[1] == 6 && data[3] == 34 { // Get HID report descriptor let report: Option<&[u8]>; @@ -164,11 +165,6 @@ pub fn handle_ctrl_transfer(model: ControllerModel, data: &[u8]) { } } else if data[1] == 9 { - // if let Ok(mut ep0) = File::open(&ENDPOINT0) { - // let mut buffer = [0; 8]; - // ep0.read(&mut buffer).ok(); - // println!("CTRL DAT: {:?}", buffer); - // } } } @@ -206,9 +202,9 @@ fn init_gadget(model: &ControllerModel, (device, descriptors, strings): (&Device }); if let Ok(mut ep0) = File::create(&ENDPOINT0) { ep0.write_all(descriptors).ok(); - println!("USB Gadget: Descriptors written to EP0"); + println!("ddgo-pnp-controller: Descriptors written to EP0"); ep0.write_all(strings).ok(); - println!("USB Gadget: Strings written to EP0"); + println!("ddgo-pnp-controller: Strings written to EP0"); } // Init Android Gadget for old 3.4 kernel @@ -222,7 +218,7 @@ fn init_gadget(model: &ControllerModel, (device, descriptors, strings): (&Device fs::write(gadget.join(Path::new("iManufacturer")), &device.i_manufacturer.to_string()).ok(); fs::write(gadget.join(Path::new("iProduct")), &device.i_product.to_string()).ok(); fs::write(gadget.join(Path::new("iSerial")), &device.i_serial_number.to_string()).ok(); - fs::write(gadget.join(Path::new("functions")), "ffs,rndis").ok(); + fs::write(gadget.join(Path::new("functions")), "ffs").ok(); fs::write(gadget.join(Path::new("f_ffs/aliases")), "ffs").ok(); fs::write(gadget.join(Path::new("enable")), "1").ok(); } diff --git a/src/main.rs b/src/main.rs index 5290fe3..e3419dd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ fn main() -> Result<()> { match controller::physical::init() { Ok(dev) => { // Wait 3 seconds and get current state of the controller - println!("Press a button to select the controller model..."); + println!("ddgo-pnp-controller: Press a button to select the controller model..."); sleep(Duration::from_secs(3)); let mut controller_state = Default::default(); controller::physical::get_state(&mut controller_state, &dev); @@ -44,7 +44,7 @@ fn main() -> Result<()> { } return Result::Ok(()); }, - Err(_e) => println!("ERROR: Could not read input devices! Exiting."), + Err(_e) => println!("ddgo-pnp-controller: ERROR: Could not read input devices! Exiting."), } Ok(()) }