aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tmk_core/protocol/arm_atsam/main_arm_atsam.c1
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_device_conf.h4
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c42
-rw-r--r--tmk_core/protocol/chibios/usb_main.c20
-rw-r--r--tmk_core/protocol/lufa/lufa.c2
-rw-r--r--tmk_core/protocol/usb_descriptor.c16
-rw-r--r--tmk_core/protocol/vusb/vusb.c55
7 files changed, 78 insertions, 62 deletions
diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
index 9c8073dd9..e952a427e 100644
--- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c
+++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
@@ -130,7 +130,6 @@ void send_extra(uint8_t report_id, uint16_t data) {
130 130
131void send_system(uint16_t data) { 131void send_system(uint16_t data) {
132#ifdef EXTRAKEY_ENABLE 132#ifdef EXTRAKEY_ENABLE
133 if (data != 0) data = data - SYSTEM_POWER_DOWN + 1;
134 send_extra(REPORT_ID_SYSTEM, data); 133 send_extra(REPORT_ID_SYSTEM, data);
135#endif // EXTRAKEY_ENABLE 134#endif // EXTRAKEY_ENABLE
136} 135}
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h
index f22f5003a..80556205f 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h
+++ b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h
@@ -327,7 +327,7 @@ typedef struct {
327} udi_hid_exk_desc_t; 327} udi_hid_exk_desc_t;
328 328
329typedef struct { 329typedef struct {
330 uint8_t array[54]; 330 uint8_t array[50];
331} udi_hid_exk_report_desc_t; 331} udi_hid_exk_report_desc_t;
332 332
333# define UDI_HID_EXK_DESC \ 333# define UDI_HID_EXK_DESC \
@@ -429,7 +429,7 @@ typedef struct {
429} udi_hid_raw_desc_t; 429} udi_hid_raw_desc_t;
430 430
431typedef struct { 431typedef struct {
432 uint8_t array[27]; 432 uint8_t array[26];
433} udi_hid_raw_report_desc_t; 433} udi_hid_raw_report_desc_t;
434 434
435# define UDI_HID_RAW_DESC \ 435# define UDI_HID_RAW_DESC \
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
index 5b3295407..cf9297dc7 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
@@ -377,39 +377,33 @@ static uint8_t udi_hid_exk_report_trans[UDI_HID_EXK_REPORT_SIZE];
377 377
378COMPILER_WORD_ALIGNED 378COMPILER_WORD_ALIGNED
379UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = {{ 379UDC_DESC_STORAGE udi_hid_exk_report_desc_t udi_hid_exk_report_desc = {{
380 // clang-format off
380 0x05, 0x01, // Usage Page (Generic Desktop) 381 0x05, 0x01, // Usage Page (Generic Desktop)
381 0x09, 0x80, // Usage (System Control) 382 0x09, 0x80, // Usage (System Control)
382 0xA1, 0x01, // Collection (Application) 383 0xA1, 0x01, // Collection (Application)
383 0x85, REPORT_ID_SYSTEM, // Report ID 384 0x85, REPORT_ID_SYSTEM, // Report ID
384 0x1A, 0x81, 385 0x19, 0x01, // Usage Minimum (Pointer)
385 0x00, // Usage Minimum (81) (System Power Down) 386 0x2A, 0xB7, 0x00, // Usage Maximum (System Display LCD Autoscale)
386 0x2A, 0x83, 387 0x15, 0x01, // Logical Minimum
387 0x00, // Usage Maximum (83) (System Wake Up) 388 0x26, 0xB7, 0x00, // Logical Maximum
388 0x16, 0x01, 389 0x95, 0x01, // Report Count (1)
389 0x00, // Logical Minimum (1) 390 0x75, 0x10, // Report Size (16)
390 0x26, 0x03, 391 0x81, 0x00, // Input (Data, Array, Absolute)
391 0x00, // Logical Maximum (3) 392 0xC0, // End Collection
392 0x95, 0x01, // Report Count (1)
393 0x75, 0x10, // Report Size (16)
394 0x81, 0x00, // Input (Data, Array, Absolute)
395 0xC0, // End Collection
396 393
397 0x05, 0x0C, // Usage Page (Consumer) 394 0x05, 0x0C, // Usage Page (Consumer)
398 0x09, 0x01, // Usage (Consumer Control) 395 0x09, 0x01, // Usage (Consumer Control)
399 0xA1, 0x01, // Collection (Application) 396 0xA1, 0x01, // Collection (Application)
400 0x85, REPORT_ID_CONSUMER, // Report ID 397 0x85, REPORT_ID_CONSUMER, // Report ID
401 0x1A, 0x01, 398 0x19, 0x01, // Usage Minimum (Consumer Control)
402 0x00, // Usage Minimum (Consumer Control) 399 0x2A, 0xA0, 0x02, // Usage Maximum (AC Desktop Show All Applications)
403 0x2A, 0x9C, 400 0x15, 0x01, // Logical Minimum
404 0x02, // Usage Maximum (AC Distribute Vertically) 401 0x26, 0xA0, 0x02, // Logical Maximum
405 0x16, 0x01, 402 0x95, 0x01, // Report Count (1)
406 0x00, // Logical Minimum 403 0x75, 0x10, // Report Size (16)
407 0x26, 0x9C, 404 0x81, 0x00, // Input (Data, Array, Absolute)
408 0x02, // Logical Maximum 405 0xC0 // End Collection
409 0x95, 0x01, // Report Count (1) 406 //clang-format on
410 0x75, 0x10, // Report Size (16)
411 0x81, 0x00, // Input (Data, Array, Absolute)
412 0xC0 // End Collection
413}}; 407}};
414 408
415static bool udi_hid_exk_setreport(void); 409static bool udi_hid_exk_setreport(void);
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index d5eeffcbe..ec95167cf 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -732,7 +732,7 @@ void shared_in_cb(USBDriver *usbp, usbep_t ep) {
732 */ 732 */
733 733
734#ifdef EXTRAKEY_ENABLE 734#ifdef EXTRAKEY_ENABLE
735static void send_extra_report(uint8_t report_id, uint16_t data) { 735static void send_extra(uint8_t report_id, uint16_t data) {
736 osalSysLock(); 736 osalSysLock();
737 if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) { 737 if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
738 osalSysUnlock(); 738 osalSysUnlock();
@@ -744,15 +744,19 @@ static void send_extra_report(uint8_t report_id, uint16_t data) {
744 usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t)); 744 usbStartTransmitI(&USB_DRIVER, SHARED_IN_EPNUM, (uint8_t *)&report, sizeof(report_extra_t));
745 osalSysUnlock(); 745 osalSysUnlock();
746} 746}
747#endif
747 748
748void send_system(uint16_t data) { send_extra_report(REPORT_ID_SYSTEM, data); } 749void send_system(uint16_t data) {
749 750#ifdef EXTRAKEY_ENABLE
750void send_consumer(uint16_t data) { send_extra_report(REPORT_ID_CONSUMER, data); } 751 send_extra(REPORT_ID_SYSTEM, data);
752#endif
753}
751 754
752#else /* EXTRAKEY_ENABLE */ 755void send_consumer(uint16_t data) {
753void send_system(uint16_t data) { (void)data; } 756#ifdef EXTRAKEY_ENABLE
754void send_consumer(uint16_t data) { (void)data; } 757 send_extra(REPORT_ID_CONSUMER, data);
755#endif /* EXTRAKEY_ENABLE */ 758#endif
759}
756 760
757/* --------------------------------------------------------- 761/* ---------------------------------------------------------
758 * Console functions 762 * Console functions
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index 933b212c9..738c2a6d3 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -690,7 +690,7 @@ static void send_extra(uint8_t report_id, uint16_t data) {
690 */ 690 */
691static void send_system(uint16_t data) { 691static void send_system(uint16_t data) {
692#ifdef EXTRAKEY_ENABLE 692#ifdef EXTRAKEY_ENABLE
693 send_extra(REPORT_ID_SYSTEM, data - SYSTEM_POWER_DOWN + 1); 693 send_extra(REPORT_ID_SYSTEM, data);
694#endif 694#endif
695} 695}
696 696
diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c
index 70032d69f..f2b91b099 100644
--- a/tmk_core/protocol/usb_descriptor.c
+++ b/tmk_core/protocol/usb_descriptor.c
@@ -166,10 +166,10 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
166 HID_RI_USAGE(8, 0x80), // System Control 166 HID_RI_USAGE(8, 0x80), // System Control
167 HID_RI_COLLECTION(8, 0x01), // Application 167 HID_RI_COLLECTION(8, 0x01), // Application
168 HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM), 168 HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
169 HID_RI_USAGE_MINIMUM(16, 0x0081), // System Power Down 169 HID_RI_USAGE_MINIMUM(8, 0x01), // Pointer
170 HID_RI_USAGE_MAXIMUM(16, 0x0083), // System Wake Up 170 HID_RI_USAGE_MAXIMUM(16, 0x00B7), // System Display LCD Autoscale
171 HID_RI_LOGICAL_MINIMUM(16, 0x0001), 171 HID_RI_LOGICAL_MINIMUM(8, 0x01),
172 HID_RI_LOGICAL_MAXIMUM(16, 0x0003), 172 HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
173 HID_RI_REPORT_COUNT(8, 1), 173 HID_RI_REPORT_COUNT(8, 1),
174 HID_RI_REPORT_SIZE(8, 16), 174 HID_RI_REPORT_SIZE(8, 16),
175 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), 175 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
@@ -179,10 +179,10 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
179 HID_RI_USAGE(8, 0x01), // Consumer Control 179 HID_RI_USAGE(8, 0x01), // Consumer Control
180 HID_RI_COLLECTION(8, 0x01), // Application 180 HID_RI_COLLECTION(8, 0x01), // Application
181 HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER), 181 HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
182 HID_RI_USAGE_MINIMUM(16, 0x0001), // Consumer Control 182 HID_RI_USAGE_MINIMUM(8, 0x01), // Consumer Control
183 HID_RI_USAGE_MAXIMUM(16, 0x029C), // AC Distribute Vertically 183 HID_RI_USAGE_MAXIMUM(16, 0x02A0), // AC Desktop Show All Applications
184 HID_RI_LOGICAL_MINIMUM(16, 0x0001), 184 HID_RI_LOGICAL_MINIMUM(8, 0x01),
185 HID_RI_LOGICAL_MAXIMUM(16, 0x029C), 185 HID_RI_LOGICAL_MAXIMUM(16, 0x02A0),
186 HID_RI_REPORT_COUNT(8, 1), 186 HID_RI_REPORT_COUNT(8, 1),
187 HID_RI_REPORT_SIZE(8, 16), 187 HID_RI_REPORT_SIZE(8, 16),
188 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), 188 HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index 2d2e5ca5c..abf723952 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -129,7 +129,7 @@ static void send_extra(uint8_t report_id, uint16_t data) {
129 129
130static void send_system(uint16_t data) { 130static void send_system(uint16_t data) {
131#ifdef EXTRAKEY_ENABLE 131#ifdef EXTRAKEY_ENABLE
132 send_extra(REPORT_ID_SYSTEM, data - SYSTEM_POWER_DOWN + 1); 132 send_extra(REPORT_ID_SYSTEM, data);
133#endif 133#endif
134} 134}
135 135
@@ -251,7 +251,9 @@ const PROGMEM uchar keyboard_hid_report[] = {
251 0xC0 // End Collection 251 0xC0 // End Collection
252}; 252};
253 253
254const PROGMEM uchar mouse_hid_report[] = { 254#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
255const PROGMEM uchar mouse_extra_hid_report[] = {
256# ifdef MOUSE_ENABLE
255 // Mouse report descriptor 257 // Mouse report descriptor
256 0x05, 0x01, // Usage Page (Generic Desktop) 258 0x05, 0x01, // Usage Page (Generic Desktop)
257 0x09, 0x02, // Usage (Mouse) 259 0x09, 0x02, // Usage (Mouse)
@@ -300,17 +302,18 @@ const PROGMEM uchar mouse_hid_report[] = {
300 0x81, 0x06, // Input (Data, Variable, Relative) 302 0x81, 0x06, // Input (Data, Variable, Relative)
301 0xC0, // End Collection 303 0xC0, // End Collection
302 0xC0, // End Collection 304 0xC0, // End Collection
305# endif
303 306
304#ifdef EXTRAKEY_ENABLE 307# ifdef EXTRAKEY_ENABLE
305 // Extrakeys report descriptor 308 // Extrakeys report descriptor
306 0x05, 0x01, // Usage Page (Generic Desktop) 309 0x05, 0x01, // Usage Page (Generic Desktop)
307 0x09, 0x80, // Usage (System Control) 310 0x09, 0x80, // Usage (System Control)
308 0xA1, 0x01, // Collection (Application) 311 0xA1, 0x01, // Collection (Application)
309 0x85, REPORT_ID_SYSTEM, // Report ID 312 0x85, REPORT_ID_SYSTEM, // Report ID
310 0x1A, 0x81, 0x00, // Usage Minimum (System Power Down) 313 0x19, 0x01, // Usage Minimum (Pointer)
311 0x2A, 0x83, 0x00, // Usage Maximum (System Wake Up) 314 0x2A, 0xB7, 0x00, // Usage Maximum (System Display LCD Autoscale)
312 0x16, 0x01, 0x00, // Logical Minimum 315 0x15, 0x01, // Logical Minimum
313 0x26, 0x03, 0x00, // Logical Maximum 316 0x26, 0xB7, 0x00, // Logical Maximum
314 0x95, 0x01, // Report Count (1) 317 0x95, 0x01, // Report Count (1)
315 0x75, 0x10, // Report Size (16) 318 0x75, 0x10, // Report Size (16)
316 0x81, 0x00, // Input (Data, Array, Absolute) 319 0x81, 0x00, // Input (Data, Array, Absolute)
@@ -320,16 +323,17 @@ const PROGMEM uchar mouse_hid_report[] = {
320 0x09, 0x01, // Usage (Consumer Control) 323 0x09, 0x01, // Usage (Consumer Control)
321 0xA1, 0x01, // Collection (Application) 324 0xA1, 0x01, // Collection (Application)
322 0x85, REPORT_ID_CONSUMER, // Report ID 325 0x85, REPORT_ID_CONSUMER, // Report ID
323 0x1A, 0x01, 0x00, // Usage Minimum (Consumer Control) 326 0x19, 0x01, // Usage Minimum (Consumer Control)
324 0x2A, 0x9C, 0x02, // Usage Maximum (AC Distribute Vertically) 327 0x2A, 0xA0, 0x02, // Usage Maximum (AC Desktop Show All Applications)
325 0x16, 0x01, 0x00, // Logical Minimum 328 0x15, 0x01, // Logical Minimum
326 0x26, 0x9C, 0x02, // Logical Maximum 329 0x26, 0xA0, 0x02, // Logical Maximum
327 0x95, 0x01, // Report Count (1) 330 0x95, 0x01, // Report Count (1)
328 0x75, 0x10, // Report Size (16) 331 0x75, 0x10, // Report Size (16)
329 0x81, 0x00, // Input (Data, Array, Absolute) 332 0x81, 0x00, // Input (Data, Array, Absolute)
330 0xC0 // End Collection 333 0xC0 // End Collection
331#endif 334# endif
332}; 335};
336#endif
333 337
334#ifndef USB_MAX_POWER_CONSUMPTION 338#ifndef USB_MAX_POWER_CONSUMPTION
335# define USB_MAX_POWER_CONSUMPTION 500 339# define USB_MAX_POWER_CONSUMPTION 500
@@ -350,10 +354,19 @@ const PROGMEM char usbDescriptorConfiguration[] = {
350 /* USB configuration descriptor */ 354 /* USB configuration descriptor */
351 9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */ 355 9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
352 USBDESCR_CONFIG, /* descriptor type */ 356 USBDESCR_CONFIG, /* descriptor type */
353 9 + (9 + 9 + 7) + (9 + 9 + 7), 0, 357# if defined (MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
358 59, // 9 + (9 + 9 + 7) + (9 + 9 + 7)
359#else
360 34, // 9 + (9 + 9 + 7)
361# endif
362 0,
354 // 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0, 363 // 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0,
355 /* total length of data returned (including inlined descriptors) */ 364 /* total length of data returned (including inlined descriptors) */
365# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
356 2, /* number of interfaces in this configuration */ 366 2, /* number of interfaces in this configuration */
367# else
368 1,
369#endif
357 1, /* index of this configuration */ 370 1, /* index of this configuration */
358 0, /* configuration name string index */ 371 0, /* configuration name string index */
359# if USB_CFG_IS_SELF_POWERED 372# if USB_CFG_IS_SELF_POWERED
@@ -391,8 +404,9 @@ const PROGMEM char usbDescriptorConfiguration[] = {
391 USB_POLLING_INTERVAL_MS, /* in ms */ 404 USB_POLLING_INTERVAL_MS, /* in ms */
392# endif 405# endif
393 406
407# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
394 /* 408 /*
395 * Mouse interface 409 * Mouse/extrakeys interface
396 */ 410 */
397 /* Interface descriptor */ 411 /* Interface descriptor */
398 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */ 412 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */
@@ -411,8 +425,8 @@ const PROGMEM char usbDescriptorConfiguration[] = {
411 0x00, /* target country code */ 425 0x00, /* target country code */
412 0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */ 426 0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */
413 0x22, /* descriptor type: report */ 427 0x22, /* descriptor type: report */
414 sizeof(mouse_hid_report), 0, /* total length of report descriptor */ 428 sizeof(mouse_extra_hid_report), 0, /* total length of report descriptor */
415# if USB_CFG_HAVE_INTRIN_ENDPOINT3 /* endpoint descriptor for endpoint 3 */ 429# if USB_CFG_HAVE_INTRIN_ENDPOINT3 /* endpoint descriptor for endpoint 3 */
416 /* Endpoint descriptor */ 430 /* Endpoint descriptor */
417 7, /* sizeof(usbDescrEndpoint) */ 431 7, /* sizeof(usbDescrEndpoint) */
418 USBDESCR_ENDPOINT, /* descriptor type = endpoint */ 432 USBDESCR_ENDPOINT, /* descriptor type = endpoint */
@@ -420,6 +434,7 @@ const PROGMEM char usbDescriptorConfiguration[] = {
420 0x03, /* attrib: Interrupt endpoint */ 434 0x03, /* attrib: Interrupt endpoint */
421 8, 0, /* maximum packet size */ 435 8, 0, /* maximum packet size */
422 USB_POLLING_INTERVAL_MS, /* in ms */ 436 USB_POLLING_INTERVAL_MS, /* in ms */
437# endif
423# endif 438# endif
424}; 439};
425#endif 440#endif
@@ -448,10 +463,12 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
448 usbMsgPtr = (unsigned char *)(usbDescriptorConfiguration + 9 + 9); 463 usbMsgPtr = (unsigned char *)(usbDescriptorConfiguration + 9 + 9);
449 len = 9; 464 len = 9;
450 break; 465 break;
466#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
451 case 1: 467 case 1:
452 usbMsgPtr = (unsigned char *)(usbDescriptorConfiguration + 9 + (9 + 9 + 7) + 9); 468 usbMsgPtr = (unsigned char *)(usbDescriptorConfiguration + 9 + (9 + 9 + 7) + 9);
453 len = 9; 469 len = 9;
454 break; 470 break;
471#endif
455 } 472 }
456 break; 473 break;
457 case USBDESCR_HID_REPORT: 474 case USBDESCR_HID_REPORT:
@@ -461,10 +478,12 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
461 usbMsgPtr = (unsigned char *)keyboard_hid_report; 478 usbMsgPtr = (unsigned char *)keyboard_hid_report;
462 len = sizeof(keyboard_hid_report); 479 len = sizeof(keyboard_hid_report);
463 break; 480 break;
481#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
464 case 1: 482 case 1:
465 usbMsgPtr = (unsigned char *)mouse_hid_report; 483 usbMsgPtr = (unsigned char *)mouse_extra_hid_report;
466 len = sizeof(mouse_hid_report); 484 len = sizeof(mouse_extra_hid_report);
467 break; 485 break;
486#endif
468 } 487 }
469 break; 488 break;
470 } 489 }