Ignore:
Timestamp:
2011-11-06T22:21:05Z (14 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
898e847
Parents:
2bdf8313 (diff), 7b5f4c9 (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 moved

Legend:

Unmodified
Added
Removed
  • uspace/srv/hid/input/port/adb_mouse.c

    r2bdf8313 rb0f00a9  
    11/*
    2  * Copyright (c) 2009 Jiri Svoboda
     2 * Copyright (c) 2011 Martin Decky
    33 * All rights reserved.
    44 *
     
    2727 */
    2828
    29 /** @addtogroup mouse
     29/** @addtogroup mouse_port
     30 * @ingroup mouse
    3031 * @{
    31  */ 
     32 */
    3233/** @file
    33  * @brief
     34 * @brief ADB mouse port driver.
    3435 */
    3536
    36 #include <ipc/char.h>
     37#include <ipc/adb.h>
    3738#include <async.h>
    38 #include <vfs/vfs.h>
    39 #include <fcntl.h>
     39#include <input.h>
     40#include <mouse_port.h>
     41#include <mouse.h>
    4042#include <errno.h>
     43#include <loc.h>
     44#include <stdio.h>
    4145
    42 #include <char_mouse.h>
    43 #include <mouse_port.h>
     46static mouse_dev_t *mouse_dev;
     47static async_sess_t *dev_sess;
    4448
    45 static void chardev_events(ipc_callid_t iid, ipc_call_t *icall);
    46 
    47 static int dev_phone;
    48 
    49 #define NAME "char_mouse"
    50 
    51 int mouse_port_init(void)
    52 {
    53         const char *input = "/dev/char/ps2b";
    54         int input_fd;
    55 
    56         printf(NAME ": open %s\n", input);
    57 
    58         input_fd = open(input, O_RDONLY);
    59         if (input_fd < 0) {
    60                 printf(NAME ": Failed opening %s (%d)\n", input, input_fd);
    61                 return false;
    62         }
    63 
    64         dev_phone = fd_phone(input_fd);
    65         if (dev_phone < 0) {
    66                 printf(NAME ": Failed to connect to device\n");
    67                 return false;
    68         }
    69 
    70         /* NB: The callback connection is slotted for removal */
    71         if (async_connect_to_me(dev_phone, 0, 0, 0, chardev_events) != 0) {
    72                 printf(NAME ": Failed to create callback from device\n");
    73                 return false;
    74         }
    75 
    76         return 0;
    77 }
    78 
    79 void mouse_port_yield(void)
    80 {
    81 }
    82 
    83 void mouse_port_reclaim(void)
    84 {
    85 }
    86 
    87 void mouse_port_write(uint8_t data)
    88 {
    89         async_msg_1(dev_phone, CHAR_WRITE_BYTE, data);
    90 }
    91 
    92 static void chardev_events(ipc_callid_t iid, ipc_call_t *icall)
     49static void mouse_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    9350{
    9451        /* Ignore parameters, the connection is already opened */
    9552        while (true) {
    96 
    9753                ipc_call_t call;
    9854                ipc_callid_t callid = async_get_call(&call);
    99 
     55               
    10056                int retval;
    101 
    102                 switch (IPC_GET_IMETHOD(call)) {
    103                 case IPC_M_PHONE_HUNGUP:
     57               
     58                if (!IPC_GET_IMETHOD(call)) {
    10459                        /* TODO: Handle hangup */
    10560                        return;
    106                 case IPC_FIRST_USER_METHOD:
    107                         mouse_handle_byte(IPC_GET_ARG1(call));
     61                }
     62               
     63                switch (IPC_GET_IMETHOD(call)) {
     64                case ADB_REG_NOTIF:
     65                        mouse_push_data(mouse_dev, IPC_GET_ARG1(call));
    10866                        break;
    10967                default:
    11068                        retval = ENOENT;
    11169                }
     70               
    11271                async_answer_0(callid, retval);
    11372        }
    11473}
    11574
     75static int adb_port_init(mouse_dev_t *mdev)
     76{
     77        const char *dev = "adb/mouse";
     78       
     79        mouse_dev = mdev;
     80       
     81        service_id_t service_id;
     82        int rc = loc_service_get_id(dev, &service_id, 0);
     83        if (rc != EOK)
     84                return rc;
     85       
     86        dev_sess = loc_service_connect(EXCHANGE_ATOMIC, service_id, 0);
     87        if (dev_sess == NULL) {
     88                printf("%s: Failed to connect to device\n", NAME);
     89                return ENOENT;
     90        }
     91       
     92        async_exch_t *exch = async_exchange_begin(dev_sess);
     93        if (exch == NULL) {
     94                printf("%s: Failed starting exchange with device\n", NAME);
     95                async_hangup(dev_sess);
     96                return ENOMEM;
     97        }
     98       
     99        /* NB: The callback connection is slotted for removal */
     100        rc = async_connect_to_me(exch, 0, 0, 0, mouse_port_events, NULL);
     101        async_exchange_end(exch);
     102        if (rc != EOK) {
     103                printf("%s: Failed to create callback from device\n", NAME);
     104                async_hangup(dev_sess);
     105                return rc;
     106        }
     107       
     108        return EOK;
     109}
     110
     111static void adb_port_yield(void)
     112{
     113}
     114
     115static void adb_port_reclaim(void)
     116{
     117}
     118
     119static void adb_port_write(uint8_t data)
     120{
     121}
     122
     123mouse_port_ops_t adb_mouse_port = {
     124        .init = adb_port_init,
     125        .yield = adb_port_yield,
     126        .reclaim = adb_port_reclaim,
     127        .write = adb_port_write
     128};
     129
    116130/**
    117131 * @}
Note: See TracChangeset for help on using the changeset viewer.