Changeset 9be360ee in mainline for uspace/srv/hid/kbd/generic/kbd.c
- Timestamp:
- 2011-06-11T22:06:47Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4f3f9659
- Parents:
- 56ad818
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/kbd/generic/kbd.c
r56ad818 r9be360ee 1 1 /* 2 2 * Copyright (c) 2006 Josef Cejka 3 * Copyright (c) 2011 Jiri Svoboda 3 4 * All rights reserved. 4 5 * … … 36 37 */ 37 38 39 #include <adt/list.h> 38 40 #include <ipc/services.h> 39 41 #include <ipc/kbd.h> … … 63 65 #define NAMESPACE "hid_in" 64 66 67 static void kbd_devs_yield(void); 68 static void kbd_devs_reclaim(void); 69 65 70 int client_phone = -1; 66 71 … … 71 76 static unsigned lock_keys; 72 77 73 static kbd_port_ops_t *kbd_port; 74 static kbd_ctl_ops_t *kbd_ctl;78 /** List of keyboard devices */ 79 static link_t kbd_devs; 75 80 76 81 bool irc_service = false; … … 87 92 static int active_layout = 0; 88 93 89 void kbd_push_scancode( int scancode)94 void kbd_push_scancode(kbd_dev_t *kdev, int scancode) 90 95 { 91 96 /* printf("scancode: 0x%x\n", scancode);*/ 92 (*k bd_ctl->parse_scancode)(scancode);93 } 94 95 void kbd_push_ev( int type, unsigned int key)97 (*kdev->ctl_ops->parse_scancode)(scancode); 98 } 99 100 void kbd_push_ev(kbd_dev_t *kdev, int type, unsigned int key) 96 101 { 97 102 kbd_event_t ev; … … 133 138 134 139 /* Update keyboard lock indicator lights. */ 135 (*k bd_ctl->set_ind)(mods);140 (*kdev->ctl_ops->set_ind)(mods); 136 141 } else { 137 142 lock_keys = lock_keys & ~mod_mask; … … 204 209 break; 205 210 case KBD_YIELD: 206 (*kbd_port->yield)();211 kbd_devs_yield(); 207 212 retval = 0; 208 213 break; 209 214 case KBD_RECLAIM: 210 (*kbd_port->reclaim)();215 kbd_devs_reclaim(); 211 216 retval = 0; 212 217 break; … … 218 223 } 219 224 220 static void kbd_select_drivers(kbd_port_ops_t **port, kbd_ctl_ops_t **ctl) 221 { 225 /** Add new keyboard device. */ 226 static void kbd_add_dev(kbd_port_ops_t *port, kbd_ctl_ops_t *ctl) 227 { 228 kbd_dev_t *kdev; 229 230 kdev = malloc(sizeof(kbd_dev_t)); 231 if (kdev == NULL) { 232 printf(NAME ": Failed adding keyboard device. Out of memory.\n"); 233 return; 234 } 235 236 link_initialize(&kdev->kbd_devs); 237 kdev->port_ops = port; 238 kdev->ctl_ops = ctl; 239 240 /* Initialize port driver. */ 241 if ((*kdev->port_ops->init)(kdev) != 0) 242 goto fail; 243 244 /* Initialize controller driver. */ 245 if ((*kdev->ctl_ops->init)(kdev) != 0) { 246 /* XXX Uninit port */ 247 goto fail; 248 } 249 250 list_append(&kdev->kbd_devs, &kbd_devs); 251 return; 252 fail: 253 free(kdev); 254 } 255 256 /** Add legacy drivers/devices. */ 257 static void kbd_add_legacy_devs(void) 258 { 259 /* 260 * Need to add these drivers based on config unless we can probe 261 * them automatically. 262 */ 222 263 #if defined(UARCH_amd64) 223 *port = &chardev_port; 224 *ctl = &pc_ctl; 225 #elif defined(UARCH_arm32) && defined(MACHINE_gta02) 226 *port = &chardev_port; 227 *ctl = &stty_ctl; 228 #elif defined(UARCH_arm32) && defined(MACHINE_testarm) 229 *port = &gxemul_port; 230 #ifdef CONFIG_FB 231 *ctl = &gxe_fb_ctl; 232 #else 233 *ctl = &stty_ctl; 234 #endif 235 #elif defined(UARCH_arm32) && defined(MACHINE_integratorcp) 236 *port = &pl050_port; 237 *ctl = &pc_ctl; 238 #elif defined(UARCH_ia32) 239 *port = &chardev_port; 240 *ctl = &pc_ctl; 241 #elif defined(MACHINE_i460GX) 242 *port = &chardev_port; 243 *ctl = &pc_ctl; 244 #elif defined(MACHINE_ski) 245 *port = &ski_port; 246 *ctl = &stty_ctl; 247 #elif defined(MACHINE_msim) 248 *port = &msim_port; 249 *ctl = &stty_ctl; 250 #elif defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul) 251 *port = &gxemul_port; 252 #ifdef CONFIG_FB 253 *ctl = &gxe_fb_ctl; 254 #else 255 *ctl = &stty_ctl; 256 #endif 257 #elif defined(UARCH_ppc32) 258 *port = &adb_port; 259 *ctl = &apple_ctl; 260 #elif defined(UARCH_sparc64) && defined(PROCESSOR_sun4v) 261 *port = &niagara_port; 262 *ctl = &stty_ctl; 263 #elif defined(UARCH_sparc64) && defined(MACHINE_serengeti) 264 *port = &sgcn_port; 265 *ctl = &stty_ctl; 266 #elif defined(UARCH_sparc64) && defined(MACHINE_generic) 267 *port = &sun_port; 268 *ctl = &sun_ctl; 269 #else 270 *port = &dummy_port; 271 *ctl = &pc_ctl; 272 #endif 264 kbd_add_dev(&chardev_port, &pc_ctl); 265 #endif 266 #if defined(UARCH_arm32) && defined(MACHINE_gta02) 267 kbd_add_dev(&chardev_port, &stty_ctl); 268 #endif 269 #if defined(UARCH_arm32) && defined(MACHINE_testarm) && defined(CONFIG_FB) 270 kbd_add_dev(&gxemul_port, &gxe_fb_ctl); 271 #endif 272 #if defined(UARCH_arm32) && defined(MACHINE_testarm) && !defined(CONFIG_FB) 273 kbd_add_dev(&gxemul_port, &stty_ctl); 274 #endif 275 #if defined(UARCH_arm32) && defined(MACHINE_integratorcp) 276 kbd_add_dev(&pl050_port, &pc_ctl); 277 #endif 278 #if defined(UARCH_ia32) 279 kbd_add_dev(&chardev_port, &pc_ctl); 280 #endif 281 #if defined(MACHINE_i460GX) 282 kbd_add_dev(&chardev_port, &pc_ctl); 283 #endif 284 #if defined(MACHINE_ski) 285 kbd_add_dev(&ski_port, &stty_ctl); 286 #endif 287 #if defined(MACHINE_msim) 288 kbd_add_dev(&msim_port, &pc_ctl); 289 #endif 290 #if (defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul)) && defined(CONFIG_FB) 291 kbd_add_dev(&gxemul_port, &gxe_fb_ctl); 292 #endif 293 #if defined(MACHINE_lgxemul) || defined(MACHINE_bgxemul) && !defined(CONFIG_FB) 294 kbd_add_dev(&gxemul_port, &stty_ctl); 295 #endif 296 #if defined(UARCH_ppc32) 297 kbd_add_dev(&adb_port, &apple_ctl); 298 #endif 299 #if defined(UARCH_sparc64) && defined(PROCESSOR_sun4v) 300 kbd_add_dev(&niagara_port, &stty_ctl); 301 #endif 302 #if defined(UARCH_sparc64) && defined(MACHINE_serengeti) 303 kbd_add_dev(&sgcn_port, &stty_ctl); 304 #endif 305 #if defined(UARCH_sparc64) && defined(MACHINE_generic) 306 kbd_add_dev(&sun_port, &sun_ctl); 307 #endif 308 /* Silence warning on abs32le about kbd_add_dev() being unused */ 309 (void) kbd_add_dev; 310 } 311 312 static void kbd_devs_yield(void) 313 { 314 /* For each keyboard device */ 315 list_foreach(kbd_devs, kdev_link) { 316 kbd_dev_t *kdev = list_get_instance(kdev_link, kbd_dev_t, 317 kbd_devs); 318 319 /* Yield port */ 320 (*kdev->port_ops->yield)(); 321 } 322 } 323 324 static void kbd_devs_reclaim(void) 325 { 326 /* For each keyboard device */ 327 list_foreach(kbd_devs, kdev_link) { 328 kbd_dev_t *kdev = list_get_instance(kdev_link, kbd_dev_t, 329 kbd_devs); 330 331 /* Reclaim port */ 332 (*kdev->port_ops->reclaim)(); 333 } 273 334 } 274 335 … … 279 340 sysarg_t fhc; 280 341 sysarg_t obio; 342 343 list_initialize(&kbd_devs); 281 344 282 345 if (((sysinfo_get_value("kbd.cir.fhc", &fhc) == EOK) && (fhc)) … … 289 352 } 290 353 291 /* Select port and controller drivers. */ 292 kbd_select_drivers(&kbd_port, &kbd_ctl); 293 294 /* Initialize port driver. */ 295 if ((*kbd_port->init)() != 0) 296 return -1; 297 298 /* Initialize controller driver. */ 299 if ((*kbd_ctl->init)(kbd_port) != 0) 300 return -1; 354 /* Add legacy devices. */ 355 kbd_add_legacy_devs(); 301 356 302 357 /* Initialize (reset) layout. */
Note:
See TracChangeset
for help on using the changeset viewer.