more USB work

This commit is contained in:
Markus Fröschle
2017-01-15 14:14:40 +00:00
parent 06eeb67033
commit 9038bb15ae
13 changed files with 292 additions and 174 deletions

View File

@@ -54,7 +54,7 @@
#include "usb.h"
#include "usb_hub.h"
#define DEBUG
// #define DEBUG
#include "debug.h"
struct hci
@@ -156,7 +156,7 @@ int usb_init(int32_t handle, const struct pci_device_id *ent)
case PCI_CLASS_SERIAL_USB_OHCI:
dbg("initialize ohci host controller interface\r\n");
//res = ohci_usb_lowlevel_init(handle, ent, (void *) &priv);
res = ohci_usb_lowlevel_init(handle, ent, (void *) &priv);
break;
case PCI_CLASS_SERIAL_USB_EHCI:
@@ -322,7 +322,7 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
{
/* request for a asynch control pipe is not allowed */
dbg("request for an async control pipe is not allowed\r\n");
err("request for an async control pipe is not allowed\r\n");
return -1;
}
@@ -333,9 +333,9 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
setup_packet->index = swpw(index);
setup_packet->length = swpw(size);
dbg("usb_control_msg: request: 0x%X, requesttype: 0x%X, value 0x%X index 0x%X length 0x%X\r\n", request, requesttype, value, index, size);
dbg("request: 0x%X, requesttype: 0x%X, value 0x%X index 0x%X length 0x%X\r\n", request, requesttype, value, index, size);
switch(priv->ent->class)
switch (priv->ent->class)
{
case PCI_CLASS_SERIAL_USB_OHCI:
dev->status = USB_ST_NOT_PROC; /* not yet processed */
@@ -631,6 +631,7 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type, unsigned char
{
int res;
dbg("dev=%d type=%d, index=%d\r\n", dev->devnum, type, index);
res = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN, (type << 8) + index, 0, buf, size, USB_CNTL_TIMEOUT);
return res;
@@ -695,6 +696,8 @@ int usb_set_interface(struct usb_device *dev, int interface, int alternate)
struct usb_interface_descriptor *if_face = NULL;
int ret, i;
dbg("set interface number=%d (alternate=%d)\r\n", interface, alternate);
for (i = 0; i < dev->config.bNumInterfaces; i++)
{
if (dev->config.if_desc[i].bInterfaceNumber == interface)
@@ -763,6 +766,8 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
*/
int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol)
{
dbg("set protocol %d on interface %d\r\n", protocol, ifnum);
return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
USB_REQ_SET_PROTOCOL, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
protocol, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
@@ -773,6 +778,8 @@ int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol)
*/
int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id)
{
dbg("set if %d idle for %d (report id %d)\r\n", ifnum, duration, report_id);
return usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
USB_REQ_SET_IDLE, USB_TYPE_CLASS | USB_RECIP_INTERFACE,
(duration << 8) | report_id, ifnum, NULL, 0, USB_CNTL_TIMEOUT);
@@ -784,6 +791,8 @@ int usb_set_idle(struct usb_device *dev, int ifnum, int duration, int report_id)
int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
unsigned char id, void *buf, int size)
{
dbg("get report on if %d, type %d, id %d\r\n", ifnum, type, id);
return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
USB_REQ_GET_REPORT, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
@@ -795,6 +804,8 @@ int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
unsigned char type, unsigned char id, void *buf, int size)
{
dbg("get class descriptor of if %d, type %d, id %d\r\n", ifnum, type, id);
return usb_control_msg(dev, usb_rcvctrlpipe(dev, 0),
USB_REQ_GET_DESCRIPTOR, USB_RECIP_INTERFACE | USB_DIR_IN,
(type << 8) + id, ifnum, buf, size, USB_CNTL_TIMEOUT);
@@ -895,7 +906,7 @@ static int usb_string_sub(struct usb_device *dev, unsigned int langid, unsigned
int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
{
unsigned char *tbuf;
int err;
int error;
unsigned int u, idx;
if (size <= 0 || !buf || !index)
@@ -915,16 +926,16 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
/* get langid for strings if it's not yet known */
if (!dev->have_langid)
{
err = usb_string_sub(dev, 0, 0, tbuf);
if (err < 0)
error = usb_string_sub(dev, 0, 0, tbuf);
if (error < 0)
{
dbg("error getting string descriptor 0 (error=%lx)\r\n", dev->status);
err("error getting string descriptor 0 (error=%lx)\r\n", dev->status);
driver_mem_free(tbuf);
return -1;
}
else if (tbuf[0] < 4)
{
dbg("string descriptor 0 too short\r\n");
err("string descriptor 0 too short\r\n");
driver_mem_free(tbuf);
return -1;
}
@@ -936,15 +947,16 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
dbg("USB device number %d default language ID 0x%x\r\n", dev->devnum, dev->string_langid);
}
}
err = usb_string_sub(dev, dev->string_langid, index, tbuf);
if (err < 0)
error = usb_string_sub(dev, dev->string_langid, index, tbuf);
if (error < 0)
{
err("failed to get lang id\r\n");
driver_mem_free(tbuf);
return err;
return error;
}
size--; /* leave room for trailing NULL char in output buffer */
for (idx = 0, u = 2; u < err; u += 2)
for (idx = 0, u = 2; u < error; u += 2)
{
if (idx >= size)
{
@@ -960,9 +972,9 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size)
}
}
buf[idx] = 0;
err = idx;
error = idx;
driver_mem_free(tbuf);
return err;
return error;
}
/*
@@ -1078,12 +1090,10 @@ struct usb_device *usb_alloc_new_device(int bus, void *priv)
int usb_new_device(struct usb_device *dev)
{
int addr;
int err;
int error;
int tmp;
unsigned char *tmpbuf;
dbg("\r\n");
#ifndef CONFIG_LEGACY_USB_INIT_SEQ
struct usb_device_descriptor *desc;
int port = -1;
@@ -1093,7 +1103,7 @@ int usb_new_device(struct usb_device *dev)
if (dev == NULL)
{
dbg("called with NULL device\r\n");
err("called with NULL device\r\n");
return 1;
}
@@ -1104,7 +1114,7 @@ int usb_new_device(struct usb_device *dev)
tmpbuf = (unsigned char *) driver_mem_alloc(USB_BUFSIZ);
if (tmpbuf == NULL)
{
dbg("malloc failure\r\n");
err("malloc failure\r\n");
return 1;
}
@@ -1121,10 +1131,10 @@ int usb_new_device(struct usb_device *dev)
dev->maxpacketsize = PACKET_SIZE_8;
dev->epmaxpacketin[0] = 8;
dev->epmaxpacketout[0] = 8;
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);
error = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, 8);
if (err < 8)
{
dbg("\r\nUSB device not responding, giving up (status=%lX)\r\n", dev->status);
err("\r\nUSB device not responding, giving up (status=%lX)\r\n", dev->status);
driver_mem_free(tmpbuf);
return 1;
}
@@ -1151,11 +1161,11 @@ int usb_new_device(struct usb_device *dev)
dev->maxpacketsize = PACKET_SIZE_64;
dev->epmaxpacketin[0] = 64;
dev->epmaxpacketout[0] = 64;
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
error = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
if (err < 0)
if (error < 0)
{
dbg("usb_new_device: usb_get_descriptor() failed\r\n");
err("usb_new_device: usb_get_descriptor() failed\r\n");
driver_mem_free(tmpbuf);
return 1;
}
@@ -1177,17 +1187,17 @@ int usb_new_device(struct usb_device *dev)
if (port < 0)
{
dbg("usb_new_device: cannot locate device's port.\r\n");
err("usb_new_device: cannot locate device's port.\r\n");
driver_mem_free(tmpbuf);
return 1;
}
/* reset the port for the second time */
err = hub_port_reset(dev->parent, port, &portstatus);
if (err < 0)
error = hub_port_reset(dev->parent, port, &portstatus);
if (error < 0)
{
dbg("\r\nCouldn't reset port %d\r\n", port);
err("\r\nCouldn't reset port %d\r\n", port);
driver_mem_free(tmpbuf);
return 1;
@@ -1206,28 +1216,28 @@ int usb_new_device(struct usb_device *dev)
}
dev->devnum = addr;
err = usb_set_address(dev); /* set address */
error = usb_set_address(dev); /* set address */
if (err < 0)
if (error < 0)
{
dbg("\r\nUSB device not accepting new address (error=%lX)\r\n", dev->status);
err("\r\nUSB device not accepting new address (error=%lX)\r\n", dev->status);
driver_mem_free(tmpbuf);
return 1;
}
wait(10); /* Let the SET_ADDRESS settle */
wait_us(10); /* Let the SET_ADDRESS settle */
tmp = sizeof(dev->descriptor);
err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, sizeof(dev->descriptor));
if (err < tmp)
error = usb_get_descriptor(dev, USB_DT_DEVICE, 0, &dev->descriptor, sizeof(dev->descriptor));
if (error < tmp)
{
if (err < 0)
if (error < 0)
{
dbg("unable to get device descriptor (error=%d)\r\n", err);
err("unable to get device descriptor (error=%d)\r\n", error);
}
else
{
dbg("USB device descriptor short read (expected %i, got %i)\r\n", tmp, err);
err("USB device descriptor short read (expected %i, got %i)\r\n", tmp, error);
}
driver_mem_free(tmpbuf);
@@ -1253,9 +1263,10 @@ int usb_new_device(struct usb_device *dev)
{
dbg("failed to set default configuration len %d, status %lX\r\n", dev->act_len, dev->status);
driver_mem_free(tmpbuf);
return -1;
}
dbg("new device strings: Mfr=%d, Product=%d, SerialNumber=%d\r\n",
dbg("new device strings: Manufacturer=%d, Product=%d, SerialNumber=%d\r\n",
dev->descriptor.iManufacturer, dev->descriptor.iProduct,
dev->descriptor.iSerialNumber);
@@ -1275,9 +1286,9 @@ int usb_new_device(struct usb_device *dev)
{
usb_string(dev, dev->descriptor.iSerialNumber, dev->serial, sizeof(dev->serial));
}
dbg("Manufacturer %s\r\n", dev->mf);
dbg("Product %s\r\n", dev->prod);
dbg("SerialNumber %s\r\n", dev->serial);
inf("Manufacturer %s\r\n", dev->mf);
inf("Product %s\r\n", dev->prod);
inf("SerialNumber %s\r\n", dev->serial);
/* now probe if the device is a hub */
usb_hub_probe(dev, 0);

View File

@@ -27,13 +27,8 @@
#include "usb.h"
//// #define DEBUG_USBKBD
#ifdef DEBUG_USBKBD
#define dbg(format, arg...) do { xprintf("DEBUG: %s(): " format, __FUNCTION__, ##arg); } while (0)
#else
#define dbg(format, arg...) do { ; } while (0)
#endif /* DEBUG_USBKBD */
#define err(format, arg...) do { xprintf("ERROR: %s(): " format, __FUNCTION__, ##arg); } while (0)
// #define DEBUG
#include "debug.h"
#ifdef USE_COUNTRYCODE
static int usb_kbd_get_hid_desc(struct usb_device *dev);
@@ -541,7 +536,7 @@ int usb_kbd_register(struct usb_device *dev)
{
if(!kbd_installed && (dev->devnum != -1) && (usb_kbd_probe(dev, 0) == 1))
{ /* Ok, we found a keyboard */
//dbg("USB KBD found (iorec: 0x%x, USB: %d, devnum: %d)\r\n", iorec, dev->usbnum, dev->devnum);
dbg("USB KBD found (USB: %d, devnum: %d)\r\n", dev->usbnum, dev->devnum);
num_lock = caps_lock = scroll_lock = old_modifier = 0;
flags.s = 0;
kbd_installed = 1;
@@ -809,7 +804,7 @@ static int usb_kbd_translate(unsigned char scancode, unsigned char modifier, int
flags.b.left_shift_host = 0;
}
#ifdef CONFIG_USB_INTERRUPT_POLLING
level = asm_set_ipl(7); /* mask interrupts for use call_ikbdvec() */
level = set_ipl(7); /* mask interrupts for use call_ikbdvec() */
#endif
if(pressed && (flags.b.force_alt_shift))
{
@@ -841,7 +836,7 @@ static int usb_kbd_translate(unsigned char scancode, unsigned char modifier, int
usb_kbd_send_code(0x38); /* ALT */
}
}
if((keycode !=0) && (keycode <= MAX_VALUE_ATARI))
if ((keycode !=0) && (keycode <= MAX_VALUE_ATARI))
usb_kbd_send_code(pressed ? keycode : keycode | 0x80);
if(!pressed && (flags.b.force_alt_shift))
{
@@ -874,9 +869,9 @@ static int usb_kbd_translate(unsigned char scancode, unsigned char modifier, int
}
}
#ifdef CONFIG_USB_INTERRUPT_POLLING
asm_set_ipl(level);
set_ipl(level);
#endif
if(pressed == 1)
if (pressed == 1)
{
if(scancode == NUM_LOCK)
{