Added support for keyboard LEDs
Should be changed one day to take into account the report descriptor git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9003 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -42,7 +42,7 @@ const char *mouse_base_name = "input/mouse/usb/";
|
|||||||
|
|
||||||
my_device_info *
|
my_device_info *
|
||||||
create_device(const usb_device *dev, const usb_interface_info *ii,
|
create_device(const usb_device *dev, const usb_interface_info *ii,
|
||||||
bool is_keyboard)
|
uint16 ifno, bool is_keyboard)
|
||||||
{
|
{
|
||||||
my_device_info *my_dev = NULL;
|
my_device_info *my_dev = NULL;
|
||||||
int number;
|
int number;
|
||||||
@@ -94,6 +94,7 @@ create_device(const usb_device *dev, const usb_interface_info *ii,
|
|||||||
|
|
||||||
sprintf(my_dev->name, "%s%d", base_name, number);
|
sprintf(my_dev->name, "%s%d", base_name, number);
|
||||||
my_dev->dev = dev;
|
my_dev->dev = dev;
|
||||||
|
my_dev->ifno = ifno;
|
||||||
my_dev->open = 0;
|
my_dev->open = 0;
|
||||||
my_dev->open_fds = NULL;
|
my_dev->open_fds = NULL;
|
||||||
my_dev->active = true;
|
my_dev->active = true;
|
||||||
@@ -369,6 +370,9 @@ const uint32 key_table[] = {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// here we don't need to follow a report descriptor for typical keyboards
|
||||||
|
// TODO : but we should for keypads for example because they aren't boot keyboard devices !
|
||||||
|
// see hidparse.c
|
||||||
static void
|
static void
|
||||||
interpret_kb_buffer(my_device_info *my_dev)
|
interpret_kb_buffer(my_device_info *my_dev)
|
||||||
{
|
{
|
||||||
@@ -436,6 +440,33 @@ interpret_kb_buffer(my_device_info *my_dev)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO : here we don't follow a report descriptor but we actually should
|
||||||
|
// see hidparse.c
|
||||||
|
static void
|
||||||
|
set_leds(my_device_info *my_dev, uint8* data)
|
||||||
|
{
|
||||||
|
status_t st;
|
||||||
|
size_t actual = 1;
|
||||||
|
uint8 leds = 0;
|
||||||
|
int report_id = 0;
|
||||||
|
if (data[0] == 1)
|
||||||
|
leds |= (1 << 0);
|
||||||
|
if (data[1] == 1)
|
||||||
|
leds |= (1 << 1);
|
||||||
|
if (data[2] == 1)
|
||||||
|
leds |= (1 << 2);
|
||||||
|
|
||||||
|
st = usb->send_request (my_dev->dev,
|
||||||
|
USB_REQTYPE_INTERFACE_OUT | USB_REQTYPE_CLASS,
|
||||||
|
0x09,
|
||||||
|
0x200 | report_id, my_dev->ifno, actual,
|
||||||
|
&leds, actual, &actual);
|
||||||
|
DPRINTF_INFO ((MY_ID "set_leds: leds=0x%02x, st=%d, len=%d\n",
|
||||||
|
leds, (int) st, (int)actual));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
callback: got a report, issue next request
|
callback: got a report, issue next request
|
||||||
*/
|
*/
|
||||||
@@ -610,7 +641,7 @@ kb_device_added(const usb_device *dev, void **cookie)
|
|||||||
|
|
||||||
is_keyboard = memcmp (rep_desc, "\x05\x01\x09\x06", 4) == 0;
|
is_keyboard = memcmp (rep_desc, "\x05\x01\x09\x06", 4) == 0;
|
||||||
|
|
||||||
if ((my_dev = create_device (dev, intf, is_keyboard)) == NULL) {
|
if ((my_dev = create_device (dev, intf, ifno, is_keyboard)) == NULL) {
|
||||||
free (rep_desc);
|
free (rep_desc);
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
}
|
}
|
||||||
@@ -655,7 +686,7 @@ kb_device_added(const usb_device *dev, void **cookie)
|
|||||||
my_dev->timestamp = system_time ();
|
my_dev->timestamp = system_time ();
|
||||||
|
|
||||||
DPRINTF_INFO ((MY_ID "%08lx %08lx %08lx\n", *(((uint32*)my_dev->buffer)), *(((uint32*)my_dev->buffer)+1), *(((uint32*)my_dev->buffer)+2)));
|
DPRINTF_INFO ((MY_ID "%08lx %08lx %08lx\n", *(((uint32*)my_dev->buffer)), *(((uint32*)my_dev->buffer)+1), *(((uint32*)my_dev->buffer)+2)));
|
||||||
|
|
||||||
/* issue interrupt transfer */
|
/* issue interrupt transfer */
|
||||||
|
|
||||||
my_dev->ept = &intf->endpoint [0]; /* interrupt IN */
|
my_dev->ept = &intf->endpoint [0]; /* interrupt IN */
|
||||||
@@ -785,24 +816,28 @@ my_device_control(driver_cookie *cookie, uint32 op,
|
|||||||
if (!my_dev->active)
|
if (!my_dev->active)
|
||||||
return B_ERROR; /* already unplugged */
|
return B_ERROR; /* already unplugged */
|
||||||
|
|
||||||
switch (op) {
|
if (my_dev->is_keyboard) {
|
||||||
case 0x270f:
|
switch (op) {
|
||||||
err = acquire_sem_etc(my_dev->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
case 0x270f:
|
||||||
if (err != B_OK)
|
err = acquire_sem_etc(my_dev->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
|
||||||
|
if (err != B_OK)
|
||||||
|
return err;
|
||||||
|
cbuf_getn(my_dev->cbuf, arg, sizeof(raw_key_info));
|
||||||
return err;
|
return err;
|
||||||
cbuf_getn(my_dev->cbuf, arg, sizeof(raw_key_info));
|
break;
|
||||||
return err;
|
|
||||||
break;
|
case 0x2711:
|
||||||
|
set_leds(my_dev, (uint8 *)arg);
|
||||||
case 0x2711:
|
break;
|
||||||
|
|
||||||
break;
|
default:
|
||||||
|
/* not implemented */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
} else {
|
||||||
/* not implemented */
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ typedef struct my_device_info
|
|||||||
|
|
||||||
uint8 last_buffer[32];
|
uint8 last_buffer[32];
|
||||||
const usb_device *dev;
|
const usb_device *dev;
|
||||||
|
uint16 ifno;
|
||||||
char name[30];
|
char name[30];
|
||||||
|
|
||||||
cbuffer *cbuf;
|
cbuffer *cbuf;
|
||||||
@@ -140,17 +141,15 @@ typedef struct my_device_info
|
|||||||
bool is_keyboard;
|
bool is_keyboard;
|
||||||
} my_device_info;
|
} my_device_info;
|
||||||
|
|
||||||
/* driver.c */
|
/* hid.c */
|
||||||
|
|
||||||
extern usb_module_info *usb;
|
extern usb_module_info *usb;
|
||||||
extern const char *my_driver_name;
|
extern const char *my_driver_name;
|
||||||
extern const char *keyboard_base_name;
|
extern const char *keyboard_base_name;
|
||||||
extern const char *mouse_base_name;
|
extern const char *mouse_base_name;
|
||||||
|
|
||||||
/* devmgmt.c */
|
|
||||||
|
|
||||||
my_device_info *
|
my_device_info *
|
||||||
create_device (const usb_device *dev, const usb_interface_info *ii, bool is_keyboard);
|
create_device (const usb_device *dev, const usb_interface_info *ii, uint16 ifno, bool is_keyboard);
|
||||||
|
|
||||||
void
|
void
|
||||||
remove_device (my_device_info *my_dev);
|
remove_device (my_device_info *my_dev);
|
||||||
|
|||||||
Reference in New Issue
Block a user