Ignore:
Timestamp:
2011-09-24T14:20:29Z (13 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5bf76c1
Parents:
867e2555 (diff), 1ab4aca (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.
Message:

Merge mainline changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbhid/kbd/kbddev.c

    r867e2555 r925a21e  
    4343#include <ipc/kbdev.h>
    4444#include <async.h>
    45 #include <async_obsolete.h>
    4645#include <fibril.h>
    4746#include <fibril_synch.h>
     
    7170#include "../usbhid.h"
    7271
    73 // FIXME: remove this header
    74 #include <kernel/ipc/ipc_methods.h>
    75 
    7672/*----------------------------------------------------------------------------*/
    7773
     
    10298
    10399const char *HID_KBD_FUN_NAME = "keyboard";
    104 const char *HID_KBD_CLASS_NAME = "keyboard";
     100const char *HID_KBD_CATEGORY_NAME = "keyboard";
    105101
    106102static void usb_kbd_set_led(usb_hid_dev_t *hid_dev, usb_kbd_t *kbd_dev);
     
    167163 *
    168164 * Currently recognizes only one method (IPC_M_CONNECT_TO_ME), in which case it
    169  * assumes the caller is the console and thus it stores IPC phone to it for
     165 * assumes the caller is the console and thus it stores IPC session to it for
    170166 * later use by the driver to notify about key events.
    171167 *
     
    178174{
    179175        sysarg_t method = IPC_GET_IMETHOD(*icall);
    180         int callback;
    181        
    182         usb_kbd_t *kbd_dev = (usb_kbd_t *)fun->driver_data;
     176       
     177        usb_kbd_t *kbd_dev = (usb_kbd_t *) fun->driver_data;
    183178        if (kbd_dev == NULL) {
    184179                usb_log_debug("default_connection_handler: "
     
    187182                return;
    188183        }
    189 
    190         switch (method) {
    191         case IPC_M_CONNECT_TO_ME:
    192                 callback = IPC_GET_ARG5(*icall);
    193 
    194                 if (kbd_dev->console_phone != -1) {
     184       
     185        async_sess_t *sess =
     186            async_callback_receive_start(EXCHANGE_SERIALIZE, icall);
     187        if (sess != NULL) {
     188                if (kbd_dev->console_sess == NULL) {
     189                        kbd_dev->console_sess = sess;
     190                        usb_log_debug("default_connection_handler: OK\n");
     191                        async_answer_0(icallid, EOK);
     192                } else {
    195193                        usb_log_debug("default_connection_handler: "
    196                             "console phone already set\n");
     194                            "console session already set\n");
    197195                        async_answer_0(icallid, ELIMIT);
    198                         return;
    199                 }
    200 
    201                 kbd_dev->console_phone = callback;
    202                
    203                 usb_log_debug("default_connection_handler: OK\n");
    204                 async_answer_0(icallid, EOK);
    205                 break;
    206         case KBDEV_SET_IND:
    207                 kbd_dev->mods = IPC_GET_ARG1(*icall);
    208                 usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev);
    209                 async_answer_0(icallid, EOK);
    210                 break;
    211         default:
    212                 usb_log_debug("default_connection_handler: Wrong function.\n");
    213                 async_answer_0(icallid, EINVAL);
    214                 break;
     196                }
     197        } else {
     198                switch (method) {
     199                case KBDEV_SET_IND:
     200                        kbd_dev->mods = IPC_GET_ARG1(*icall);
     201                        usb_kbd_set_led(kbd_dev->hid_dev, kbd_dev);
     202                        async_answer_0(icallid, EOK);
     203                        break;
     204                default:
     205                        usb_log_debug("default_connection_handler: Wrong function.\n");
     206                        async_answer_0(icallid, EINVAL);
     207                        break;
     208                }
    215209        }
    216210}
     
    301295{
    302296        usb_log_debug2("Sending kbdev event %d/%d to the console\n", type, key);
    303         if (kbd_dev->console_phone < 0) {
     297        if (kbd_dev->console_sess == NULL) {
    304298                usb_log_warning(
    305299                    "Connection to console not ready, key discarded.\n");
     
    307301        }
    308302       
    309         async_obsolete_msg_2(kbd_dev->console_phone, KBDEV_EVENT, type, key);
     303        async_exch_t *exch = async_exchange_begin(kbd_dev->console_sess);
     304        async_msg_2(exch, KBDEV_EVENT, type, key);
     305        async_exchange_end(exch);
    310306}
    311307
     
    510506        }
    511507       
    512         kbd_dev->console_phone = -1;
     508        kbd_dev->console_sess = NULL;
    513509        kbd_dev->initialized = USB_KBD_STATUS_UNINITIALIZED;
    514510       
     
    524520        assert(kbd_dev != NULL);
    525521       
    526         /* Create the function exposed under /dev/devices. */
     522        /* Create the exposed function. */
    527523        usb_log_debug("Creating DDF function %s...\n", HID_KBD_FUN_NAME);
    528524        ddf_fun_t *fun = ddf_fun_create(hid_dev->usb_dev->ddf_dev, fun_exposed,
     
    551547            HID_KBD_FUN_NAME, fun->handle);
    552548       
    553         usb_log_debug("Adding DDF function to class %s...\n",
     549        usb_log_debug("Adding DDF function to category %s...\n",
    554550            HID_KBD_CLASS_NAME);
    555         rc = ddf_fun_add_to_class(fun, HID_KBD_CLASS_NAME);
     551        rc = ddf_fun_add_to_category(fun, HID_KBD_CATEGORY_NAME);
    556552        if (rc != EOK) {
    557553                usb_log_error(
    558                     "Could not add DDF function to class %s: %s.\n",
     554                    "Could not add DDF function to category %s: %s.\n",
    559555                    HID_KBD_CLASS_NAME, str_error(rc));
    560556                ddf_fun_destroy(fun);
     
    734730        int rc = usb_kbd_create_function(hid_dev, kbd_dev);
    735731        if (rc != EOK) {
    736                 usb_kbd_free(&kbd_dev);
     732                usb_kbd_destroy(kbd_dev);
    737733                return rc;
    738734        }
     
    779775 * @param kbd_dev Pointer to the structure to be destroyed.
    780776 */
    781 void usb_kbd_free(usb_kbd_t **kbd_dev)
    782 {
    783         if (kbd_dev == NULL || *kbd_dev == NULL) {
     777void usb_kbd_destroy(usb_kbd_t *kbd_dev)
     778{
     779        if (kbd_dev == NULL) {
    784780                return;
    785781        }
    786782       
    787         // hangup phone to the console
    788         async_obsolete_hangup((*kbd_dev)->console_phone);
    789        
    790         if ((*kbd_dev)->repeat_mtx != NULL) {
     783        // hangup session to the console
     784        async_hangup(kbd_dev->console_sess);
     785       
     786        if (kbd_dev->repeat_mtx != NULL) {
    791787                //assert(!fibril_mutex_is_locked((*kbd_dev)->repeat_mtx));
    792788                // FIXME - the fibril_mutex_is_locked may not cause
    793789                // fibril scheduling
    794                 while (fibril_mutex_is_locked((*kbd_dev)->repeat_mtx)) {}
    795                 free((*kbd_dev)->repeat_mtx);
     790                while (fibril_mutex_is_locked(kbd_dev->repeat_mtx)) {}
     791                free(kbd_dev->repeat_mtx);
    796792        }
    797793       
    798794        // free all buffers
    799         if ((*kbd_dev)->keys != NULL) {
    800                 free((*kbd_dev)->keys);
    801         }
    802         if ((*kbd_dev)->keys_old != NULL) {
    803                 free((*kbd_dev)->keys_old);
    804         }
    805         if ((*kbd_dev)->led_data != NULL) {
    806                 free((*kbd_dev)->led_data);
    807         }
    808         if ((*kbd_dev)->led_path != NULL) {
    809                 usb_hid_report_path_free((*kbd_dev)->led_path);
    810         }
    811         if ((*kbd_dev)->output_buffer != NULL) {
    812                 usb_hid_report_output_free((*kbd_dev)->output_buffer);
    813         }
    814 
    815         free(*kbd_dev);
    816         *kbd_dev = NULL;
     795        if (kbd_dev->keys != NULL) {
     796                free(kbd_dev->keys);
     797        }
     798        if (kbd_dev->keys_old != NULL) {
     799                free(kbd_dev->keys_old);
     800        }
     801        if (kbd_dev->led_data != NULL) {
     802                free(kbd_dev->led_data);
     803        }
     804        if (kbd_dev->led_path != NULL) {
     805                usb_hid_report_path_free(kbd_dev->led_path);
     806        }
     807        if (kbd_dev->output_buffer != NULL) {
     808                usb_hid_report_output_free(kbd_dev->output_buffer);
     809        }
    817810}
    818811
     
    830823                        usb_kbd_mark_unusable(kbd_dev);
    831824                } else {
    832                         usb_kbd_free(&kbd_dev);
     825                        usb_kbd_destroy(kbd_dev);
    833826                }
    834827        }
Note: See TracChangeset for help on using the changeset viewer.