Changeset 9be360ee in mainline for uspace/srv/hid/kbd/generic/kbd.c


Ignore:
Timestamp:
2011-06-11T22:06:47Z (13 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
4f3f9659
Parents:
56ad818
Message:

Allow keyboard server to handle more than one driver at the same time.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/kbd/generic/kbd.c

    r56ad818 r9be360ee  
    11/*
    22 * Copyright (c) 2006 Josef Cejka
     3 * Copyright (c) 2011 Jiri Svoboda
    34 * All rights reserved.
    45 *
     
    3637 */
    3738
     39#include <adt/list.h>
    3840#include <ipc/services.h>
    3941#include <ipc/kbd.h>
     
    6365#define NAMESPACE  "hid_in"
    6466
     67static void kbd_devs_yield(void);
     68static void kbd_devs_reclaim(void);
     69
    6570int client_phone = -1;
    6671
     
    7176static unsigned lock_keys;
    7277
    73 static kbd_port_ops_t *kbd_port;
    74 static kbd_ctl_ops_t *kbd_ctl;
     78/** List of keyboard devices */
     79static link_t kbd_devs;
    7580
    7681bool irc_service = false;
     
    8792static int active_layout = 0;
    8893
    89 void kbd_push_scancode(int scancode)
     94void kbd_push_scancode(kbd_dev_t *kdev, int scancode)
    9095{
    9196/*      printf("scancode: 0x%x\n", scancode);*/
    92         (*kbd_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
     100void kbd_push_ev(kbd_dev_t *kdev, int type, unsigned int key)
    96101{
    97102        kbd_event_t ev;
     
    133138
    134139                        /* Update keyboard lock indicator lights. */
    135                         (*kbd_ctl->set_ind)(mods);
     140                        (*kdev->ctl_ops->set_ind)(mods);
    136141                } else {
    137142                        lock_keys = lock_keys & ~mod_mask;
     
    204209                        break;
    205210                case KBD_YIELD:
    206                         (*kbd_port->yield)();
     211                        kbd_devs_yield();
    207212                        retval = 0;
    208213                        break;
    209214                case KBD_RECLAIM:
    210                         (*kbd_port->reclaim)();
     215                        kbd_devs_reclaim();
    211216                        retval = 0;
    212217                        break;
     
    218223}
    219224
    220 static void kbd_select_drivers(kbd_port_ops_t **port, kbd_ctl_ops_t **ctl)
    221 {
     225/** Add new keyboard device. */
     226static 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;
     252fail:
     253        free(kdev);
     254}
     255
     256/** Add legacy drivers/devices. */
     257static 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         */
    222263#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
     312static 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
     324static 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        }
    273334}
    274335
     
    279340        sysarg_t fhc;
    280341        sysarg_t obio;
     342       
     343        list_initialize(&kbd_devs);
    281344       
    282345        if (((sysinfo_get_value("kbd.cir.fhc", &fhc) == EOK) && (fhc))
     
    289352        }
    290353       
    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();
    301356
    302357        /* Initialize (reset) layout. */
Note: See TracChangeset for help on using the changeset viewer.