Changeset 49ff5f3 in mainline for uspace/srv/hid
- Timestamp:
- 2012-04-18T20:55:21Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7769ec9
- Parents:
- e895352 (diff), 63920b0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/srv/hid
- Files:
-
- 5 added
- 2 deleted
- 19 edited
- 1 moved
-
console/console.c (modified) (3 diffs)
-
fb/fb.c (modified) (3 diffs)
-
fb/port/ega.c (modified) (2 diffs)
-
fb/port/kchar.c (modified) (2 diffs)
-
fb/port/kfb.c (modified) (3 diffs)
-
fb/port/niagara.c (modified) (2 diffs)
-
input/Makefile (modified) (2 diffs)
-
input/generic/input.c (modified) (8 diffs)
-
input/include/mouse.h (modified) (1 diff)
-
input/include/mouse_proto.h (modified) (1 diff)
-
input/port/chardev.c (modified) (1 diff)
-
input/port/chardev_mouse.c (deleted)
-
input/port/gxemul.c (modified) (4 diffs)
-
input/port/msim.c (modified) (4 diffs)
-
input/port/niagara.c (modified) (3 diffs)
-
input/port/ns16550.c (modified) (4 diffs)
-
input/port/pl050.c (modified) (4 diffs)
-
input/proto/adb.c (modified) (1 diff)
-
input/proto/mousedev.c (modified) (1 diff)
-
input/proto/ps2.c (deleted)
-
remcons/Makefile (added)
-
remcons/remcons.c (added)
-
remcons/remcons.h (added)
-
remcons/telnet.h (moved) (moved from uspace/lib/usbdev/src/pipepriv.h ) (2 diffs)
-
remcons/user.c (added)
-
remcons/user.h (added)
-
s3c24xx_ts/s3c24xx_ts.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/console/console.c
re895352 r49ff5f3 481 481 event->c = c; 482 482 483 /* Kernel console does not read events 483 /* 484 * Kernel console does not read events 484 485 * from us, so we will redirect them 485 486 * to the (last) active userspace console … … 487 488 */ 488 489 console_t *target_console = cons_get_active_uspace(); 489 490 490 491 prodcons_produce(&target_console->input_pc, 491 492 &event->link); … … 824 825 825 826 /* Register server */ 826 int rc = loc_server_register(NAME, client_connection); 827 async_set_client_connection(client_connection); 828 int rc = loc_server_register(NAME); 827 829 if (rc < 0) { 828 830 printf("%s: Unable to register server (%s)\n", NAME, -
uspace/srv/hid/fb/fb.c
re895352 r49ff5f3 304 304 } 305 305 306 frontbuf->data = as_get_mappable_page(frontbuf->size); 307 int rc = async_answer_1(callid, EOK, (sysarg_t) frontbuf->data); 308 if (rc != EOK) { 306 int rc = async_share_out_finalize(callid, &frontbuf->data); 307 if ((rc != EOK) || (frontbuf->data == (void *) -1)) { 309 308 free(frontbuf); 310 309 async_answer_0(iid, ENOMEM); … … 348 347 } 349 348 350 imagemap->data = as_get_mappable_page(imagemap->size); 351 int rc = async_answer_1(callid, EOK, (sysarg_t) imagemap->data); 352 if (rc != EOK) { 349 int rc = async_share_out_finalize(callid, &imagemap->data); 350 if ((rc != EOK) || (imagemap->data == (void *) -1)) { 353 351 free(imagemap); 354 352 async_answer_0(iid, ENOMEM); … … 989 987 990 988 /* Register server */ 991 int rc = loc_server_register(NAME, client_connection); 989 async_set_client_connection(client_connection); 990 int rc = loc_server_register(NAME); 992 991 if (rc != EOK) { 993 992 printf("%s: Unable to register driver (%d)\n", NAME, rc); -
uspace/srv/hid/fb/port/ega.c
re895352 r49ff5f3 117 117 uint8_t glyph; 118 118 119 if ( (field->ch >= 0) && (field->ch < 128))119 if (ascii_check(field->ch)) 120 120 glyph = field->ch; 121 121 else … … 280 280 281 281 ega.size = (width * height) << 1; 282 ega.addr = as_get_mappable_page(ega.size); 283 if (ega.addr == NULL) 284 return ENOMEM; 285 286 rc = physmem_map((void *) paddr, ega.addr, 287 ALIGN_UP(ega.size, PAGE_SIZE) >> PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); 282 283 rc = physmem_map((void *) paddr, 284 ALIGN_UP(ega.size, PAGE_SIZE) >> PAGE_WIDTH, 285 AS_AREA_READ | AS_AREA_WRITE, (void *) &ega.addr); 288 286 if (rc != EOK) 289 287 return rc; -
uspace/srv/hid/fb/port/kchar.c
re895352 r49ff5f3 48 48 static void kchar_putchar(wchar_t ch) 49 49 { 50 if ( (ch >= 0) && (ch < 128))50 if (ascii_check(ch)) 51 51 *kchar.addr = ch; 52 52 else … … 83 83 return rc; 84 84 85 kchar.addr = as_get_mappable_page(1); 86 if (kchar.addr == NULL) 87 return ENOMEM; 88 89 rc = physmem_map((void *) paddr, kchar.addr, 90 ALIGN_UP(1, PAGE_SIZE) >> PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); 85 rc = physmem_map((void *) paddr, 86 ALIGN_UP(1, PAGE_SIZE) >> PAGE_WIDTH, 87 AS_AREA_READ | AS_AREA_WRITE, (void *) &kchar.addr); 91 88 if (rc != EOK) 92 89 return rc; -
uspace/srv/hid/fb/port/kfb.c
re895352 r49ff5f3 409 409 charfield_t *field = screenbuffer_field_at(vp->backbuf, col, row); 410 410 411 pixel_t bgcolor ;412 pixel_t fgcolor ;411 pixel_t bgcolor = 0; 412 pixel_t fgcolor = 0; 413 413 attrs_rgb(field->attrs, &bgcolor, &fgcolor); 414 414 … … 525 525 } 526 526 527 pixel_t bgcolor ;528 pixel_t fgcolor ;527 pixel_t bgcolor = 0; 528 pixel_t fgcolor = 0; 529 529 attrs_rgb(vp->attrs, &bgcolor, &fgcolor); 530 530 … … 756 756 757 757 kfb.size = scanline * height; 758 kfb.addr = as_get_mappable_page(kfb.size); 759 if (kfb.addr == NULL) { 760 free(kfb.glyphs); 761 return ENOMEM; 762 } 763 764 rc = physmem_map((void *) paddr + offset, kfb.addr, 765 ALIGN_UP(kfb.size, PAGE_SIZE) >> PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); 758 759 rc = physmem_map((void *) paddr + offset, 760 ALIGN_UP(kfb.size, PAGE_SIZE) >> PAGE_WIDTH, 761 AS_AREA_READ | AS_AREA_WRITE, (void *) &kfb.addr); 766 762 if (rc != EOK) { 767 763 free(kfb.glyphs); -
uspace/srv/hid/fb/port/niagara.c
re895352 r49ff5f3 68 68 static void niagara_putchar(wchar_t ch) 69 69 { 70 if ( (ch >= 0) && (ch < 128))70 if (ascii_check(ch)) 71 71 niagara_putc(ch); 72 72 else … … 103 103 return rc; 104 104 105 niagara.fifo = 106 (output_fifo_t *) as_get_mappable_page(sizeof(output_fifo_t)); 107 if (niagara.fifo == NULL) 108 return ENOMEM; 109 110 rc = physmem_map((void *) paddr, (void *) niagara.fifo, 1, 111 AS_AREA_READ | AS_AREA_WRITE); 105 rc = physmem_map((void *) paddr, 1, 106 AS_AREA_READ | AS_AREA_WRITE, (void *) &niagara.fifo); 112 107 if (rc != EOK) 113 108 return rc; -
uspace/srv/hid/input/Makefile
re895352 r49ff5f3 43 43 port/adb_mouse.c \ 44 44 port/chardev.c \ 45 port/chardev_mouse.c \46 45 port/gxemul.c \ 47 46 port/msim.c \ … … 52 51 proto/adb.c \ 53 52 proto/mousedev.c \ 54 proto/ps2.c \55 53 ctl/apple.c \ 56 54 ctl/gxe_fb.c \ -
uspace/srv/hid/input/generic/input.c
re895352 r49ff5f3 39 39 #include <adt/list.h> 40 40 #include <bool.h> 41 #include <fibril_synch.h> 41 42 #include <ipc/services.h> 42 43 #include <ipc/input.h> … … 83 84 async_sess_t *irc_sess = NULL; 84 85 86 static FIBRIL_MUTEX_INITIALIZE(discovery_lock); 87 85 88 void kbd_push_data(kbd_dev_t *kdev, sysarg_t data) 86 89 { … … 172 175 173 176 /** Mouse pointer has moved. */ 174 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy )177 void mouse_push_event_move(mouse_dev_t *mdev, int dx, int dy, int dz) 175 178 { 176 179 async_exch_t *exch = async_exchange_begin(client_sess); 177 async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy); 180 if (dx || dy) 181 async_msg_2(exch, INPUT_EVENT_MOVE, dx, dy); 182 if (dz) { 183 // TODO: Implement proper wheel support 184 keycode_t code = dz > 0 ? KC_UP : KC_DOWN; 185 for (int i = 0; i < 3; ++i) { 186 async_msg_4(exch, INPUT_EVENT_KEY, KEY_PRESS, code, 0, 0); 187 } 188 async_msg_4(exch, INPUT_EVENT_KEY, KEY_RELEASE, code, 0, 0); 189 } 178 190 async_exchange_end(exch); 179 191 } … … 397 409 * them automatically. 398 410 */ 399 #if defined(UARCH_amd64)400 kbd_add_dev(&chardev_port, &pc_ctl);401 #endif402 411 #if defined(UARCH_arm32) && defined(MACHINE_gta02) 403 412 kbd_add_dev(&chardev_port, &stty_ctl); … … 411 420 #if defined(UARCH_arm32) && defined(MACHINE_integratorcp) 412 421 kbd_add_dev(&pl050_port, &pc_ctl); 413 #endif414 #if defined(UARCH_ia32)415 kbd_add_dev(&chardev_port, &pc_ctl);416 #endif417 #if defined(MACHINE_i460GX)418 kbd_add_dev(&chardev_port, &pc_ctl);419 422 #endif 420 423 #if defined(MACHINE_ski) … … 450 453 * them automatically. 451 454 */ 452 #if defined(UARCH_amd64)453 mouse_add_dev(&chardev_mouse_port, &ps2_proto);454 #endif455 #if defined(UARCH_ia32)456 mouse_add_dev(&chardev_mouse_port, &ps2_proto);457 #endif458 #if defined(MACHINE_i460GX)459 mouse_add_dev(&chardev_mouse_port, &ps2_proto);460 #endif461 455 #if defined(UARCH_ppc32) 462 456 mouse_add_dev(&adb_mouse_port, &adb_proto); … … 602 596 int rc; 603 597 598 fibril_mutex_lock(&discovery_lock); 599 604 600 rc = dev_check_new_kbdevs(); 605 if (rc != EOK) 601 if (rc != EOK) { 602 fibril_mutex_unlock(&discovery_lock); 606 603 return rc; 604 } 607 605 608 606 rc = dev_check_new_mousedevs(); 609 if (rc != EOK) 607 if (rc != EOK) { 608 fibril_mutex_unlock(&discovery_lock); 610 609 return rc; 611 610 } 611 612 fibril_mutex_unlock(&discovery_lock); 613 612 614 return EOK; 613 615 } … … 658 660 659 661 /* Register driver */ 660 int rc = loc_server_register(NAME, client_connection); 662 async_set_client_connection(client_connection); 663 int rc = loc_server_register(NAME); 661 664 if (rc < 0) { 662 665 printf("%s: Unable to register server (%d)\n", NAME, rc); -
uspace/srv/hid/input/include/mouse.h
re895352 r49ff5f3 62 62 63 63 extern void mouse_push_data(mouse_dev_t *, sysarg_t); 64 extern void mouse_push_event_move(mouse_dev_t *, int, int );64 extern void mouse_push_event_move(mouse_dev_t *, int, int, int); 65 65 extern void mouse_push_event_button(mouse_dev_t *, int, int); 66 66 -
uspace/srv/hid/input/include/mouse_proto.h
re895352 r49ff5f3 48 48 49 49 extern mouse_proto_ops_t adb_proto; 50 extern mouse_proto_ops_t ps2_proto;51 50 extern mouse_proto_ops_t mousedev_proto; 52 51 -
uspace/srv/hid/input/port/chardev.c
re895352 r49ff5f3 63 63 /** List of devices to try connecting to. */ 64 64 static const char *in_devs[] = { 65 "char/ps2a",66 65 "char/s3c24ser" 67 66 }; -
uspace/srv/hid/input/port/gxemul.c
re895352 r49ff5f3 57 57 static kbd_dev_t *kbd_dev; 58 58 59 static irq_pio_range_t gxemul_ranges[] = { 60 { 61 .base = 0, 62 .size = 1 63 } 64 }; 65 59 66 static irq_cmd_t gxemul_cmds[] = { 60 67 { … … 69 76 70 77 static irq_code_t gxemul_kbd = { 78 sizeof(gxemul_ranges) / sizeof(irq_pio_range_t), 79 gxemul_ranges, 71 80 sizeof(gxemul_cmds) / sizeof(irq_cmd_t), 72 81 gxemul_cmds … … 81 90 82 91 sysarg_t addr; 83 if (sysinfo_get_value("kbd.address. virtual", &addr) != EOK)92 if (sysinfo_get_value("kbd.address.physical", &addr) != EOK) 84 93 return -1; 85 94 … … 89 98 90 99 async_set_interrupt_received(gxemul_irq_handler); 100 gxemul_ranges[0].base = addr; 91 101 gxemul_cmds[0].addr = (void *) addr; 92 register_irq(inr, device_assign_devno(), 0, &gxemul_kbd);102 irq_register(inr, device_assign_devno(), 0, &gxemul_kbd); 93 103 return 0; 94 104 } -
uspace/srv/hid/input/port/msim.c
re895352 r49ff5f3 57 57 static kbd_dev_t *kbd_dev; 58 58 59 static irq_pio_range_t msim_ranges[] = { 60 { 61 .base = 0, 62 .size = 1 63 } 64 }; 65 59 66 static irq_cmd_t msim_cmds[] = { 60 67 { … … 69 76 70 77 static irq_code_t msim_kbd = { 78 sizeof(msim_ranges) / sizeof(irq_pio_range_t), 79 msim_ranges, 71 80 sizeof(msim_cmds) / sizeof(irq_cmd_t), 72 81 msim_cmds … … 79 88 kbd_dev = kdev; 80 89 81 sysarg_t vaddr;82 if (sysinfo_get_value("kbd.address. virtual", &vaddr) != EOK)90 sysarg_t paddr; 91 if (sysinfo_get_value("kbd.address.physical", &paddr) != EOK) 83 92 return -1; 84 93 … … 87 96 return -1; 88 97 89 msim_cmds[0].addr = (void *) vaddr; 98 msim_ranges[0].base = paddr; 99 msim_cmds[0].addr = (void *) paddr; 90 100 async_set_interrupt_received(msim_irq_handler); 91 register_irq(inr, device_assign_devno(), 0, &msim_kbd);101 irq_register(inr, device_assign_devno(), 0, &msim_kbd); 92 102 93 103 return 0; -
uspace/srv/hid/input/port/niagara.c
re895352 r49ff5f3 63 63 #define POLL_INTERVAL 10000 64 64 65 /**66 * Virtual address mapped to the buffer shared with the kernel counterpart.67 */68 static uintptr_t input_buffer_addr;69 70 65 /* 71 66 * Kernel counterpart of the driver pushes characters (it has read) here. … … 102 97 return -1; 103 98 104 input_buffer_addr = (uintptr_t) as_get_mappable_page(PAGE_SIZE); 105 int rc = physmem_map((void *) paddr, (void *) input_buffer_addr, 106 1, AS_AREA_READ | AS_AREA_WRITE); 107 99 int rc = physmem_map((void *) paddr, 1, 100 AS_AREA_READ | AS_AREA_WRITE, (void *) &input_buffer); 108 101 if (rc != 0) { 109 102 printf("Niagara: uspace driver couldn't map physical memory: %d\n", … … 111 104 return rc; 112 105 } 113 114 input_buffer = (input_buffer_t) input_buffer_addr;115 106 116 107 thread_id_t tid; -
uspace/srv/hid/input/port/ns16550.c
re895352 r49ff5f3 70 70 #define LSR_DATA_READY 0x01 71 71 72 static irq_pio_range_t ns16550_ranges[] = { 73 { 74 .base = 0, 75 .size = 8 76 } 77 }; 78 72 79 static irq_cmd_t ns16550_cmds[] = { 73 80 { … … 98 105 99 106 irq_code_t ns16550_kbd = { 107 sizeof(ns16550_ranges) / sizeof(irq_pio_range_t), 108 ns16550_ranges, 100 109 sizeof(ns16550_cmds) / sizeof(irq_cmd_t), 101 110 ns16550_cmds … … 105 114 106 115 static uintptr_t ns16550_physical; 107 static uintptr_t ns16550_kernel;108 116 109 117 static kbd_dev_t *kbd_dev; … … 124 132 return -1; 125 133 126 if (sysinfo_get_value("kbd.address.kernel", &ns16550_kernel) != EOK)127 return -1;128 129 134 sysarg_t inr; 130 135 if (sysinfo_get_value("kbd.inr", &inr) != EOK) 131 136 return -1; 132 137 133 ns16550_kbd.cmds[0].addr = (void *) (ns16550_kernel + LSR_REG); 134 ns16550_kbd.cmds[3].addr = (void *) (ns16550_kernel + RBR_REG); 138 ns16550_kbd.ranges[0].base = ns16550_physical; 139 ns16550_kbd.cmds[0].addr = (void *) (ns16550_physical + LSR_REG); 140 ns16550_kbd.cmds[3].addr = (void *) (ns16550_physical + RBR_REG); 135 141 136 142 async_set_interrupt_received(ns16550_irq_handler); 137 register_irq(inr, device_assign_devno(), inr, &ns16550_kbd);143 irq_register(inr, device_assign_devno(), inr, &ns16550_kbd); 138 144 139 145 return pio_enable((void *) ns16550_physical, 8, &vaddr); -
uspace/srv/hid/input/port/pl050.c
re895352 r49ff5f3 61 61 static kbd_dev_t *kbd_dev; 62 62 63 #define PL050_STAT 4 64 #define PL050_DATA 8 65 63 66 #define PL050_STAT_RXFULL (1 << 4) 67 68 static irq_pio_range_t pl050_ranges[] = { 69 { 70 .base = 0, 71 .size = 9, 72 } 73 }; 64 74 65 75 static irq_cmd_t pl050_cmds[] = { … … 91 101 92 102 static irq_code_t pl050_kbd = { 103 sizeof(pl050_ranges) / sizeof(irq_pio_range_t), 104 pl050_ranges, 93 105 sizeof(pl050_cmds) / sizeof(irq_cmd_t), 94 106 pl050_cmds … … 102 114 103 115 sysarg_t addr; 104 if (sysinfo_get_value("kbd.address. status", &addr) != EOK)116 if (sysinfo_get_value("kbd.address.physical", &addr) != EOK) 105 117 return -1; 106 118 107 pl050_kbd.cmds[0].addr = (void *) addr; 108 109 if (sysinfo_get_value("kbd.address.data", &addr) != EOK) 110 return -1; 111 112 pl050_kbd.cmds[3].addr = (void *) addr; 119 pl050_kbd.ranges[0].base = addr; 120 pl050_kbd.cmds[0].addr = (void *) addr + PL050_STAT; 121 pl050_kbd.cmds[3].addr = (void *) addr + PL050_DATA; 113 122 114 123 sysarg_t inr; … … 117 126 118 127 async_set_interrupt_received(pl050_irq_handler); 119 register_irq(inr, device_assign_devno(), 0, &pl050_kbd);128 irq_register(inr, device_assign_devno(), 0, &pl050_kbd); 120 129 121 130 return 0; -
uspace/srv/hid/input/proto/adb.c
re895352 r49ff5f3 82 82 83 83 if (dx != 0 || dy != 0) 84 mouse_push_event_move(mouse_dev, dx, dy );84 mouse_push_event_move(mouse_dev, dx, dy, 0); 85 85 } 86 86 -
uspace/srv/hid/input/proto/mousedev.c
re895352 r49ff5f3 91 91 switch (IPC_GET_IMETHOD(call)) { 92 92 case MOUSEEV_MOVE_EVENT: 93 mouse_push_event_move(mousedev->mouse_dev, IPC_GET_ARG1(call), 94 IPC_GET_ARG2(call)); 93 mouse_push_event_move(mousedev->mouse_dev, 94 IPC_GET_ARG1(call), IPC_GET_ARG2(call), 95 IPC_GET_ARG3(call)); 95 96 retval = EOK; 96 97 break; 97 98 case MOUSEEV_BUTTON_EVENT: 98 mouse_push_event_button(mousedev->mouse_dev, IPC_GET_ARG1(call),99 IPC_GET_ARG 2(call));99 mouse_push_event_button(mousedev->mouse_dev, 100 IPC_GET_ARG1(call), IPC_GET_ARG2(call)); 100 101 retval = EOK; 101 102 break; -
uspace/srv/hid/remcons/telnet.h
re895352 r49ff5f3 1 1 /* 2 * Copyright (c) 201 1Vojtech Horky2 * Copyright (c) 2012 Vojtech Horky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup libusbdev29 /** @addtogroup remcons 30 30 * @{ 31 31 */ 32 32 /** @file 33 * Library internal functions on USB pipes.34 33 */ 35 #ifndef LIBUSBDEV_PIPEPRIV_H_36 #define LIBUSBDEV_PIPEPRIV_H_37 34 38 #i nclude <usb/dev/pipes.h>39 # include <bool.h>35 #ifndef TELNET_H_ 36 #define TELNET_H_ 40 37 41 void pipe_acquire(usb_pipe_t *); 42 void pipe_release(usb_pipe_t *); 38 #include <inttypes.h> 43 39 44 void pipe_start_transaction(usb_pipe_t *); 45 void pipe_end_transaction(usb_pipe_t *); 40 typedef uint8_t telnet_cmd_t; 46 41 47 int pipe_add_ref(usb_pipe_t *, bool); 48 void pipe_drop_ref(usb_pipe_t *); 42 /* 43 * Telnet commands. 44 */ 45 46 #define TELNET_IAC 255 47 48 #define TELNET_WILL 251 49 #define TELNET_WONT 252 50 #define TELNET_DO 253 51 #define TELNET_DONT 254 52 53 #define TELNET_IS_OPTION_CODE(code) (((code) >= 251) && ((code) <= 254)) 54 55 #define TELNET_ECHO 1 56 #define TELNET_SUPPRESS_GO_AHEAD 3 57 #define TELNET_LINEMODE 34 49 58 50 59 51 60 #endif 61 52 62 /** 53 63 * @} -
uspace/srv/hid/s3c24xx_ts/s3c24xx_ts.c
re895352 r49ff5f3 62 62 63 63 static irq_code_t ts_irq_code = { 64 0, 65 NULL, 64 66 sizeof(ts_irq_cmds) / sizeof(irq_cmd_t), 65 67 ts_irq_cmds … … 85 87 86 88 printf(NAME ": S3C24xx touchscreen driver\n"); 87 88 rc = loc_server_register(NAME, s3c24xx_ts_connection); 89 90 async_set_client_connection(s3c24xx_ts_connection); 91 rc = loc_server_register(NAME); 89 92 if (rc < 0) { 90 93 printf(NAME ": Unable to register driver.\n"); … … 139 142 140 143 async_set_interrupt_received(s3c24xx_ts_irq_handler); 141 register_irq(inr, device_assign_devno(), 0, &ts_irq_code);144 irq_register(inr, device_assign_devno(), 0, &ts_irq_code); 142 145 143 146 s3c24xx_ts_wait_for_int_mode(ts, updn_down);
Note:
See TracChangeset
for help on using the changeset viewer.
