Revision 419
Added by markw almost 10 years ago
firmware/usb/hid.c | ||
---|---|---|
HID_DESCRIPTOR_REPORT, info->iface[i].iface_idx, size, buf);
|
||
|
||
if(!rcode) {
|
||
hid_debugf("HID report descriptor:");
|
||
hid_debugf("HID report desc:");
|
||
//MWW hexdump(buf, size, 0);
|
||
|
||
// we got a report descriptor. Try to parse it
|
||
... | ... | |
//baseaddr = (unsigned char volatile *)(40000 + atari_regbase);
|
||
//debug_pos=160;
|
||
//printf("Detected USB joystick #%d", joysticks);
|
||
hid_debugf("Detected USB joystick #%d", joysticks);
|
||
hid_debugf("stick #%d", joysticks);
|
||
|
||
info->iface[i].device_type = HID_DEVICE_JOYSTICK;
|
||
info->iface[i].jindex = joysticks++;
|
||
... | ... | |
p = &buf;
|
||
//LOG("LenX:%d\n", p->conf_desc.bLength);
|
||
while(len > 0) {
|
||
//printf("L%02d %02d %02d ",len, p->conf_desc.bLength, p->conf_desc.bDescriptorType);
|
||
hid_debugf("L%02d %02d %02d ",len, p->conf_desc.bLength, p->conf_desc.bDescriptorType);
|
||
|
||
switch(p->conf_desc.bDescriptorType) {
|
||
case USB_DESCRIPTOR_CONFIGURATION:
|
||
// hid_debugf("conf descriptor size %d", p->conf_desc.bLength);
|
||
hid_debugf("conf descriptor size %d", p->conf_desc.bLength);
|
||
// we already had this, so we simply ignore it
|
||
break;
|
||
|
||
case USB_DESCRIPTOR_INTERFACE:
|
||
isGoodInterface = false;
|
||
// hid_debugf("iface descriptor size %d", p->iface_desc.bLength);
|
||
hid_debugf("iface descriptor size %d class %d", p->iface_desc.bLength, p->iface_desc.bInterfaceClass);
|
||
|
||
/* check the interface descriptors for supported class */
|
||
|
||
// only HID interfaces are supported
|
||
if(p->iface_desc.bInterfaceClass == USB_CLASS_HID) {
|
||
hid_debugf("iface is HID");
|
||
// puts("iface is HID");
|
||
|
||
if(info->bNumIfaces < MAX_IFACES) {
|
||
... | ... | |
info->iface[info->bNumIfaces].conf.type = CONFIG_TYPE_NONE;
|
||
|
||
if(p->iface_desc.bInterfaceSubClass == HID_BOOT_INTF_SUBCLASS) {
|
||
// hid_debugf("Iface %d is Boot sub class", info->bNumIfaces);
|
||
hid_debugf("Iface %d is Boot sub class", info->bNumIfaces);
|
||
info->iface[info->bNumIfaces].has_boot_mode = true;
|
||
}
|
||
|
||
hid_debugf("HID protocol is ");
|
||
switch(p->iface_desc.bInterfaceProtocol) {
|
||
case HID_PROTOCOL_NONE:
|
||
hid_debugf("HID protocol is NONE");
|
||
hid_debugf("NONE");
|
||
break;
|
||
|
||
case HID_PROTOCOL_KEYBOARD:
|
||
hid_debugf("HID protocol is KEYBOARD");
|
||
hid_debugf("KEYBOARD");
|
||
info->iface[info->bNumIfaces].device_type = HID_DEVICE_KEYBOARD;
|
||
break;
|
||
|
||
case HID_PROTOCOL_MOUSE:
|
||
hid_debugf("HID protocol is MOUSE");
|
||
hid_debugf("MOUSE");
|
||
info->iface[info->bNumIfaces].device_type = HID_DEVICE_MOUSE;
|
||
break;
|
||
|
||
default:
|
||
hid_debugf("HID protocol is %d", p->iface_desc.bInterfaceProtocol);
|
||
hid_debugf("%d", p->iface_desc.bInterfaceProtocol);
|
||
break;
|
||
}
|
||
}
|
||
... | ... | |
|
||
// only interrupt in endpoints are supported
|
||
if ((p->ep_desc.bmAttributes & 0x03) == 3 && (p->ep_desc.bEndpointAddress & 0x80) == 0x80) {
|
||
hid_debugf("endpoint %d, interval = %dms",
|
||
hid_debugf("ep %d, ival = %dms",
|
||
p->ep_desc.bEndpointAddress & 0x0F, p->ep_desc.bInterval);
|
||
|
||
// Fill in the endpoint info structure
|
||
... | ... | |
break;
|
||
|
||
case HID_DESCRIPTOR_HID:
|
||
hid_debugf("hid descriptor size %d", p->ep_desc.bLength);
|
||
hid_debugf("hid desc size %d type %x", p->ep_desc.bLength, p->hid_desc.bDescrType);
|
||
|
||
if(isGoodInterface) {
|
||
// we need a report descriptor
|
||
if(p->hid_desc.bDescrType == HID_DESCRIPTOR_REPORT) {
|
||
uint16_t len = p->hid_desc.wDescriptorLength[0] +
|
||
256 * p->hid_desc.wDescriptorLength[1];
|
||
hid_debugf(" -> report descriptor size = %d", len);
|
||
hid_debugf(" -> report desc size = %d", len);
|
||
|
||
info->iface[info->bNumIfaces].report_desc_size = len;
|
||
}
|
||
... | ... | |
break;
|
||
|
||
default:
|
||
hid_debugf("unsupported descriptor type %d size %d", p->raw[1], p->raw[0]);
|
||
hid_debugf("unsupd desc type %d size %d", p->raw[1], p->raw[0]);
|
||
}
|
||
|
||
// advance to next descriptor
|
||
... | ... | |
pid = bs16(&buf.dev_desc.idProductL);
|
||
|
||
uint8_t num_of_conf = buf.dev_desc.bNumConfigurations;
|
||
// hid_debugf("number of configurations: %d", num_of_conf);
|
||
hid_debugf("number of configurations: %d", num_of_conf);
|
||
|
||
for(i=0; i<num_of_conf; i++) {
|
||
if(rcode = usb_get_conf_descr(dev, sizeof(usb_configuration_descriptor_t), i, &buf.conf_desc))
|
||
return rcode;
|
||
|
||
// hid_debugf("conf descriptor %d has total size %d", i, buf.conf_desc.wTotalLength);
|
||
uint16_t wTotalLength = bs16(&buf.conf_desc.wTotalLengthL);
|
||
hid_debugf("conf desc %d size %d", i, wTotalLength);
|
||
LOG("conf descriptor %d has total size %d", i, wTotalLength);
|
||
|
||
// parse directly if it already fitted completely into the buffer
|
||
usb_hid_parse_conf(dev, i, wTotalLength);
|
||
}
|
||
|
||
hid_debugf("here:%d vid:%x pid:%x",info->bNumIfaces,vid,pid);
|
||
|
||
// check if we found valid hid interfaces
|
||
if(!info->bNumIfaces) {
|
||
hid_debugf("no hid interfaces found");
|
||
hid_debugf("no hid ifaces found");
|
||
|
||
if((vid == 0x1a34) && (pid == 0x0809) && (i==0)) {
|
||
iprintf("hacking MCC Torid\n");
|
||
if((vid == 0x45e) && (pid == 0x028e)) {
|
||
hid_debugf("hackn Torid\n");
|
||
info->bNumIfaces = 1;
|
||
info->iface[0].iface_idx = p->iface_desc.bInterfaceNumber;
|
||
info->iface[0].iface_idx = 0;
|
||
info->iface[0].has_boot_mode = false;
|
||
info->iface[0].is_5200daptor = false;
|
||
info->iface[0].is_MCC = 3;
|
||
info->iface[0].key_state = 0;
|
||
info->iface[0].device_type = HID_DEVICE_UNKNOWN;
|
||
info->iface[0].device_type = HID_DEVICE_JOYSTICK;
|
||
info->iface[0].conf.type = CONFIG_TYPE_JOYSTICK;
|
||
info->iface[0].jindex = joysticks++;
|
||
info->iface[0].interval = 1;
|
||
info->iface[0].ep.epAddr = 1;
|
||
info->iface[0].ep.maxPktSize = 14;
|
||
info->iface[0].ep.epAttribs = 0;
|
||
info->iface[0].ep.bmNakPower = USB_NAK_NOWAIT;
|
||
|
||
/*info->iface[0].conf.joystick.button[0].byte_offset = 2;
|
||
info->iface[0].conf.joystick.button[0].bitmask;
|
||
... | ... | |
// process all supported interfaces
|
||
for(i=0; i<info->bNumIfaces; i++) {
|
||
// no boot mode, try to parse HID report descriptor
|
||
if(!info->iface[i].has_boot_mode && !info->iface[i].id_MCC) {
|
||
if(!info->iface[i].has_boot_mode && !info->iface[i].is_MCC) {
|
||
|
||
//printf("DESC ");
|
||
hid_debugf("DESC %x ", info->iface[i].report_desc_size);
|
||
rcode = hid_get_report_descr(dev, i, info->iface[i].report_desc_size);
|
||
if(rcode) return rcode;
|
||
|
||
//printf("TYPE%02x ", info->iface[i].device_type);
|
||
hid_debugf("TYPE%02x ", info->iface[i].device_type);
|
||
if(info->iface[i].device_type == CONFIG_TYPE_JOYSTICK) {
|
||
char k;
|
||
|
||
... | ... | |
}
|
||
|
||
if((vid == 0x0079) && (pid == 0x0006) && (i==0)) {
|
||
iprintf("hacking MCC controller\n");
|
||
iprintf("MCC classic\n");
|
||
|
||
info->iface[0].is_MCC = 1;
|
||
}
|
||
if((vid == 0x1a34) && (pid == 0x0809) && (i==0)) {
|
||
iprintf("hacking MCC controller wireless\n");
|
||
iprintf("MCC Xeox\n");
|
||
|
||
info->iface[0].is_MCC = 2;
|
||
}
|
||
... | ... | |
for(i=0;i<info->bNumIfaces;i++) {
|
||
if(info->iface[i].device_type == HID_DEVICE_JOYSTICK) {
|
||
uint8_t c_jindex = info->iface[i].jindex;
|
||
hid_debugf("releasing joystick #%d, renumbering", c_jindex);
|
||
hid_debugf("rel joystick #%d, renum", c_jindex);
|
||
|
||
event_digital_joystick(c_jindex, 0);
|
||
event_analog_joystick(c_jindex, 0,0);
|
||
... | ... | |
for(k=0;k<MAX_IFACES;k++) {
|
||
if(dev[j].hid_info.iface[k].device_type == HID_DEVICE_JOYSTICK) {
|
||
if(dev[j].hid_info.iface[k].jindex > c_jindex) {
|
||
hid_debugf("decreasing jindex of dev #%d from %d to %d", j,
|
||
hid_debugf("dec jindex of dev #%d from %d to %d", j,
|
||
dev[j].hid_info.iface[k].jindex, dev[j].hid_info.iface[k].jindex-1);
|
||
|
||
dev[j].hid_info.iface[k].jindex--;
|
||
... | ... | |
|
||
uint16_t read = iface->ep.maxPktSize;
|
||
uint8_t buf[iface->ep.maxPktSize];
|
||
//hid_debugf("bytes:%d ep:%x",read,iface->ep);
|
||
uint8_t rcode =
|
||
usb_in_transfer(dev, &(iface->ep), &read, buf);
|
||
|
||
... | ... | |
|
||
if(iface->device_type == HID_DEVICE_JOYSTICK) {
|
||
hid_config_t *conf = &iface->conf;
|
||
if(read >= conf->report_size) {
|
||
//hid_debugf("JOY");
|
||
if(iface->is_MCC==3 || read >= conf->report_size) {
|
||
uint32_t jmap = 0;
|
||
uint16_t a[2];
|
||
uint8_t idx, i;
|
||
... | ... | |
left hat button: byte 2: bit 6 (0x40=pressed)
|
||
right hat button: byte 2: bit 7 (0x80=pressed)*/
|
||
|
||
if (buf[2]&1) jmap |= JOY_UP;
|
||
if (buf[2]&2) jmap |= JOY_DOWN;
|
||
if (buf[2]&4) jmap |= JOY_LEFT;
|
||
if (buf[2]&8) jmap |= JOY_RIGHT;
|
||
if (buf[3]&0x80) jmap |= 1<<4; //1
|
||
if (buf[3]&0x20) jmap |= 1<<5; //2
|
||
if (buf[3]&0x10) jmap |= 1<<6; //3
|
||
if (buf[3]&0x40) jmap |= 1<<7; //4
|
||
if (buf[3]&1) jmap |= 1<<8; //l1
|
||
if (buf[3]&2) jmap |= 1<<9; //r1
|
||
if (buf[4]&0x80) jmap |= 1<<10; //l2
|
||
if (buf[5]&0x80) jmap |= 1<<11; //r2
|
||
if (buf[2]&0x20) jmap |= 1<<12; //select
|
||
if (buf[2]&0x10) jmap |= 1<<13; //start
|
||
if (buf[2]&0x40) jmap |= 1<<14; //lstick click
|
||
if (buf[2]&0x80) jmap |= 1<<15; //rstick click
|
||
if (buf[0]==00 && buf[1]==0x14)
|
||
{
|
||
if (buf[2]&1) jmap |= JOY_UP;
|
||
if (buf[2]&2) jmap |= JOY_DOWN;
|
||
if (buf[2]&4) jmap |= JOY_LEFT;
|
||
if (buf[2]&8) jmap |= JOY_RIGHT;
|
||
if (buf[3]&0x80) jmap |= 1<<4; //1
|
||
if (buf[3]&0x20) jmap |= 1<<5; //2
|
||
if (buf[3]&0x10) jmap |= 1<<6; //3
|
||
if (buf[3]&0x40) jmap |= 1<<7; //4
|
||
if (buf[3]&1) jmap |= 1<<8; //l1
|
||
if (buf[3]&2) jmap |= 1<<9; //r1
|
||
if (buf[4]&0x80) jmap |= 1<<10; //l2
|
||
if (buf[5]&0x80) jmap |= 1<<11; //r2
|
||
if (buf[2]&0x20) jmap |= 1<<12; //select
|
||
if (buf[2]&0x10) jmap |= 1<<13; //start
|
||
if (buf[2]&0x40) jmap |= 1<<14; //lstick click
|
||
if (buf[2]&0x80) jmap |= 1<<15; //rstick click
|
||
|
||
a[0] = 128+(int)buf[7];
|
||
a[1] = 128+(int)buf[9];
|
||
a[0] = 128+(int)buf[7];
|
||
a[1] = 128+(int)buf[9];
|
||
}
|
||
else
|
||
{
|
||
jmap = 0;
|
||
a[0] = 128;
|
||
a[1] = 128;
|
||
}
|
||
|
||
//for (i=0;i!=14;++i)
|
||
//{
|
||
// hid_debugf("%02x",buf[i]);
|
||
//}
|
||
//hid_debugf("=jmap:%x",jmap);
|
||
}
|
||
else
|
||
{
|
Also available in: Unified diff
Torid works!