Author Topic: [Solved] Crashing and I Do Not Know Why  (Read 5292 times)

0 Members and 1 Guest are viewing this topic.

Offline gudenau

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 18
  • Rating: +0/-0
    • View Profile
[Solved] Crashing and I Do Not Know Why
« on: September 16, 2013, 08:16:02 pm »
Edit{
Forgot nl_set_resident();
}

So, I am trying to get a hang of the drivers, so I am making a simple one. When I plug the 360 controller in, it crashes my calculator, I thick it is in attach, don't know for sure.

main.c:
Code: [Select]
#include <os.h>
#include <usbdi.h>
#include <usb.h>
#include <nspireio2.h>

int main(void) {
assert_ndless_rev(750);

register360();

nl_no_scr_redraw();
nio_grid_puts(0, 0, 12, 1, "360 drivers installed!", is_cx ? NIO_COLOR_BLACK : NIO_COLOR_WHITE, is_cx ? NIO_COLOR_WHITE : NIO_COLOR_BLACK);

return 0;
}

main.h
Code: [Select]
#include <os.h>
#include <nspireio2.h>

/* handler.c */
void register360(void);

handler.c
Code: [Select]
#include <os.h>
#include <usbdi.h>
#include <usb.h>
#include <nspireio2.h>
#include "main.h"

static int match(device_t self) {
struct usb_attach_arg *uaa = device_get_ivars(self);

if (!uaa->iface){
return UMATCH_NONE;
}

usb_interface_descriptor_t *id = usbd_get_interface_descriptor(uaa->iface);

if (!id){
return UMATCH_NONE;
}

if (id->bInterfaceClass == UICLASS_VENDOR &&
id->bInterfaceSubClass == UISUBCLASS_XBOX360_CONTROLLER &&
id->bInterfaceProtocol == UIPROTO_XBOX360_GAMEPAD){
return UMATCH_IFACECLASS;
}else{
return UMATCH_NONE;
}
}

struct softc_360 {
// Standered
device_t sc_dev;
usbd_interface_handle sc_iface;
usbd_pipe_handle sc_intrpipe;
int sc_ep_addr;
struct s_usb_pipe_buf sc_ibuf;
int sc_isize;
int sc_enabled;

// Device specific
int16_t buttons;
signed char lTrigger;
signed char rTrigger;
int16_t leftX;
int16_t leftY;
int16_t rightX;
int16_t rightY;
};

struct report_360 {
char unused[2];
int16_t buttons;
signed char lTrigger;
signed char rTrigger;
int16_t leftX;
int16_t leftY;
int16_t rightX;
int16_t rightY;
char unused2[6];
};

static void intr_360(usbd_xfer_handle __attribute__((unused)) xfer, usbd_private_handle addr, usbd_status status){
struct softc_360 *sc = addr;
struct report_360 *ibuf = (struct report_360 *)sc->sc_ibuf.buf;

if(status != USBD_NORMAL_COMPLETION){
return;
}

sc->buttons = ibuf->buttons;
sc->lTrigger = ibuf->lTrigger;
sc->rTrigger = ibuf->rTrigger;
sc->leftX = ibuf->leftX;
sc->leftY = ibuf->leftY;
sc->rightX = ibuf->rightX;
sc->rightY = ibuf->rightY;
}

static int attach(device_t self){
struct softc_360 *sc = device_get_softc(self);
struct usb_attach_arg *uaa = device_get_ivars(self);
usbd_status err;

if(sc == NULL){
return ENXIO;
}

sc->sc_iface = uaa->iface;
sc->sc_dev = self;
usb_endpoint_descriptor_t *ed = usbd_interface2endpoint_descriptor(sc->sc_iface, 0);
sc->sc_ep_addr = ed->bEndpointAddress;
sc->sc_isize = sizeof(struct softc_360);

usbd_set_protocol(sc->sc_iface, 0);
usbd_set_idle(sc->sc_iface, 0, 0);

sc->sc_ibuf.dummy1 = 0;
sc->sc_ibuf.dummy2 = 0;
sc->sc_ibuf.buf = malloc(sc->sc_isize);

if(!sc->sc_ibuf.buf){
return ENXIO;
}

err = usbd_open_pipe_intr(sc->sc_iface, sc->sc_ep_addr, USBD_SHORT_XFER_OK, &sc->sc_intrpipe, sc, &sc->sc_ibuf, sc->sc_isize, intr_360, USBD_DEFAULT_INTERVAL);

if(err){
free(sc->sc_ibuf.buf);
return ENXIO;
}

sc->sc_enabled = 1;
return 0;
}

static int detach(device_t self){
struct softc_360 *sc = device_get_softc(self);

if(sc->sc_enabled){
usbd_abort_pipe(sc->sc_intrpipe);
usbd_close_pipe(sc->sc_intrpipe);
free(sc->sc_ibuf.buf);
sc->sc_enabled = 0;
}

return 0;
}

static int (*methods[])(device_t) = {match, attach, detach, NULL};

void register360(void){
nl_relocdata((unsigned*)methods, sizeof(methods) / sizeof(methods[0]) - 1);
usb_register_driver(2, methods, "c360", 0, sizeof(struct softc_360));
}

Any help?
« Last Edit: September 25, 2013, 02:44:33 pm by gudenau »

Offline ExtendeD

  • Project Author
  • LV8 Addict (Next: 1000)
  • *
  • Posts: 825
  • Rating: +167/-2
    • View Profile
Re: Crashing and I Do Not Know Why
« Reply #1 on: September 17, 2013, 03:03:41 am »
Nice to see a new third party USB driver for the TI-Nspire :)
Does it crash when plugging in an other USB device?
To pinpoint the issue you should either use nspireio or the on-calc debugger ODB if you are familiar with ARM assembly: http://ndlessly.wordpress.com/2012/04/09/introducing-ocd-the-ti-nspire-on-calc-debugger/ (untested on CX, it should probably be recompiled with the latest nspireio).
Ndless.me with the finest TI-Nspire programs

Offline gudenau

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 18
  • Rating: +0/-0
    • View Profile
Re: Crashing and I Do Not Know Why
« Reply #2 on: September 18, 2013, 02:11:29 pm »
Let me check, forgot about that!

Edit:
Yep, still crashes. :-/
« Last Edit: September 18, 2013, 02:12:38 pm by gudenau »

Offline gudenau

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 18
  • Rating: +0/-0
    • View Profile
Re: Crashing and I Do Not Know Why
« Reply #3 on: September 19, 2013, 01:56:04 pm »
Crashes with and without hidn by the way.

Offline Legimet

  • LV6 Super Member (Next: 500)
  • ******
  • Posts: 336
  • Rating: +29/-0
    • View Profile
Re: Crashing and I Do Not Know Why
« Reply #4 on: September 19, 2013, 06:37:18 pm »
As ExtendeD said, either use printf debugging with nspireio or use the OCD debugger to find where it crashes.

And instead of double posting, click the modify button to edit your post. :)

Offline gudenau

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 18
  • Rating: +0/-0
    • View Profile
Re: Crashing and I Do Not Know Why
« Reply #5 on: September 20, 2013, 08:52:26 pm »
It had been a while. I am trying to get a good thing going for serial.

Edit:
Forgot nl_set_resident();
« Last Edit: September 25, 2013, 02:44:00 pm by gudenau »