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:
#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
#include <os.h>
#include <nspireio2.h>
/* handler.c */
void register360(void);
handler.c
#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?