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:
Jérôme Duval 2004-09-19 20:45:25 +00:00
parent 3b00a056c7
commit 2197729c08
2 changed files with 56 additions and 22 deletions

View File

@ -42,7 +42,7 @@ const char *mouse_base_name = "input/mouse/usb/";
my_device_info *
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;
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);
my_dev->dev = dev;
my_dev->ifno = ifno;
my_dev->open = 0;
my_dev->open_fds = NULL;
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
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
*/
@ -610,7 +641,7 @@ kb_device_added(const usb_device *dev, void **cookie)
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);
return B_ERROR;
}
@ -655,7 +686,7 @@ kb_device_added(const usb_device *dev, void **cookie)
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)));
/* issue interrupt transfer */
my_dev->ept = &intf->endpoint [0]; /* interrupt IN */
@ -785,24 +816,28 @@ my_device_control(driver_cookie *cookie, uint32 op,
if (!my_dev->active)
return B_ERROR; /* already unplugged */
switch (op) {
case 0x270f:
err = acquire_sem_etc(my_dev->sem_cb, 1, B_CAN_INTERRUPT, 0LL);
if (err != B_OK)
if (my_dev->is_keyboard) {
switch (op) {
case 0x270f:
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;
cbuf_getn(my_dev->cbuf, arg, sizeof(raw_key_info));
return err;
break;
case 0x2711:
break;
break;
case 0x2711:
set_leds(my_dev, (uint8 *)arg);
break;
default:
/* not implemented */
break;
}
default:
/* not implemented */
break;
} else {
}
return err;
}

View File

@ -118,6 +118,7 @@ typedef struct my_device_info
uint8 last_buffer[32];
const usb_device *dev;
uint16 ifno;
char name[30];
cbuffer *cbuf;
@ -140,17 +141,15 @@ typedef struct my_device_info
bool is_keyboard;
} my_device_info;
/* driver.c */
/* hid.c */
extern usb_module_info *usb;
extern const char *my_driver_name;
extern const char *keyboard_base_name;
extern const char *mouse_base_name;
/* devmgmt.c */
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
remove_device (my_device_info *my_dev);