Changes in / [af430ce:37b1651d] in mainline


Ignore:
Location:
uspace
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbhid/kbddev.c

    raf430ce r37b1651d  
    289289
    290290        usb_log_debug2("Sending key %d to the console\n", ev.key);
    291         if (kbd_dev->console_phone < 0) {
    292                 usb_log_warning(
    293                     "Connection to console not ready, key discarded.\n");
    294                 return;
    295         }
     291        assert(kbd_dev->console_phone != -1);
    296292       
    297293        async_msg_4(kbd_dev->console_phone, KBD_EVENT, ev.type, ev.key,
  • uspace/drv/usbhid/usbhid.ma

    raf430ce r37b1651d  
    1 100 usb&interface&class=HID&subclass=0x01&protocol=0x01
     110 usb&class=hid
     210 usb&class=HID
    2310 usb&interface&class=HID
     410 usb&hid
  • uspace/lib/usb/src/request.c

    raf430ce r37b1651d  
    504504 *
    505505 * @param[in] pipe Control endpoint pipe (session must be already started).
    506  * @param[in] index String index (in native endianess),
    507  *      first index has number 1 (index from descriptors can be used directly).
     506 * @param[in] index String index (in native endianess).
    508507 * @param[in] lang String language (in native endianess).
    509508 * @param[out] string_ptr Where to store allocated string in native encoding.
     
    516515                return EBADMEM;
    517516        }
    518         /*
    519          * Index is actually one byte value and zero index is used
    520          * to retrieve list of supported languages.
    521          */
    522         if ((index < 1) || (index > 0xFF)) {
     517        /* Index is actually one byte value. */
     518        if (index > 0xFF) {
    523519                return ERANGE;
    524520        }
  • uspace/srv/hid/console/console.c

    raf430ce r37b1651d  
    4141#include <ipc/ns.h>
    4242#include <errno.h>
    43 #include <str_error.h>
    4443#include <ipc/console.h>
    4544#include <unistd.h>
     
    6564#define NAME       "console"
    6665#define NAMESPACE  "term"
    67 /** Interval for checking for new keyboard (1/4s). */
    68 #define HOTPLUG_WATCH_INTERVAL (1000 * 250)
    6966
    7067/** Phone to the keyboard driver. */
     
    728725        }
    729726       
    730         int rc = async_connect_to_me(phone, SERVICE_CONSOLE, 0, 0,
    731             keyboard_events);
     727        /* NB: The callback connection is slotted for removal */
     728        sysarg_t phonehash;
     729        sysarg_t taskhash;
     730        int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, SERVICE_CONSOLE,
     731            0, 0, NULL, NULL, NULL, &taskhash, &phonehash);
    732732        if (rc != EOK) {
    733                 printf(NAME ": " \
    734                     "Failed to create callback from input device: %s.\n",
    735                     str_error(rc));
     733                printf(NAME ": Failed to create callback from input device\n");
    736734                return rc;
    737735        }
    738736       
    739         printf(NAME ": found keyboard \"%s\".\n", path);
     737        async_new_connection(taskhash, phonehash, 0, NULL, keyboard_events);
     738
     739        printf(NAME ": we got a hit (new keyboard \"%s\").\n", path);
    740740
    741741        return phone;
    742742}
    743743
    744 
    745 /** Periodically check for new keyboards in /dev/class/.
     744/** Try to connect to given keyboard, bypassing provided libc routines.
    746745 *
    747  * @param arg Class name.
    748  * @return This function should never exit.
     746 * @param devmap_path Path to keyboard without /dev prefix.
     747 * @return Phone or error code.
    749748 */
     749static int connect_keyboard_bypass(char *devmap_path)
     750{
     751        int devmap_phone = async_connect_me_to_blocking(PHONE_NS,
     752            SERVICE_DEVMAP, DEVMAP_CLIENT, 0);
     753        if (devmap_phone < 0) {
     754                return devmap_phone;
     755        }
     756        ipc_call_t answer;
     757        aid_t req = async_send_2(devmap_phone, DEVMAP_DEVICE_GET_HANDLE,
     758            0, 0,  &answer);
     759
     760        sysarg_t retval = async_data_write_start(devmap_phone,
     761            devmap_path, str_size(devmap_path));
     762        if (retval != EOK) {
     763                async_wait_for(req, NULL);
     764                async_hangup(devmap_phone);
     765                return retval;
     766        }
     767
     768        async_wait_for(req, &retval);
     769
     770        if (retval != EOK) {
     771                async_hangup(devmap_phone);
     772                return retval;
     773        }
     774
     775        devmap_handle_t handle = (devmap_handle_t) IPC_GET_ARG1(answer);
     776
     777        async_hangup(devmap_phone);
     778
     779        int phone = async_connect_me_to(PHONE_NS,
     780            SERVICE_DEVMAP, DEVMAP_CONNECT_TO_DEVICE, handle);
     781        if (phone < 0) {
     782                return phone;
     783        }
     784
     785        /* NB: The callback connection is slotted for removal */
     786        sysarg_t phonehash;
     787        sysarg_t taskhash;
     788        int rc = async_req_3_5(phone, IPC_M_CONNECT_TO_ME, SERVICE_CONSOLE,
     789            0, 0, NULL, NULL, NULL, &taskhash, &phonehash);
     790        if (rc != EOK) {
     791                printf(NAME ": Failed to create callback from input device\n");
     792                return rc;
     793        }
     794
     795        async_new_connection(taskhash, phonehash, 0, NULL, keyboard_events);
     796
     797        printf(NAME ": we got a hit (new keyboard \"/dev/%s\").\n",
     798            devmap_path);
     799
     800        return phone;
     801}
     802
     803
    750804static int check_new_keyboards(void *arg)
    751805{
    752806        char *class_name = (char *) arg;
    753807
    754         size_t index = 1;
     808        int index = 1;
    755809
    756810        while (true) {
    757                 async_usleep(HOTPLUG_WATCH_INTERVAL);
     811                async_usleep(1 * 500 * 1000);
    758812                char *path;
    759                 int rc = asprintf(&path, "/dev/class/%s\\%zu",
    760                     class_name, index);
     813                int rc = asprintf(&path, "class/%s\\%d", class_name, index);
    761814                if (rc < 0) {
    762815                        continue;
    763816                }
    764817                rc = 0;
    765                 rc = connect_keyboard(path);
     818                rc = connect_keyboard_bypass(path);
    766819                if (rc > 0) {
    767820                        /* We do not allow unplug. */
Note: See TracChangeset for help on using the changeset viewer.