Omnimaga > Ndless

[Solved] Crashing and I Do Not Know Why

(1/2) > >>

gudenau:
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: ---#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;
}

--- End code ---

main.h

--- Code: ---#include <os.h>
#include <nspireio2.h>

/* handler.c */
void register360(void);
--- End code ---

handler.c

--- Code: ---#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));
}
--- End code ---

Any help?

ExtendeD:
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).

gudenau:
Let me check, forgot about that!

Edit:
Yep, still crashes. :-/

gudenau:
Crashes with and without hidn by the way.

Legimet:
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. :)

Navigation

[0] Message Index

[#] Next page

Go to full version