source: mainline/uspace/srv/hid/input/port/chardev_mouse.c@ 15f3c3f

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 15f3c3f was 15f3c3f, checked in by Jiri Svoboda <jiri@…>, 14 years ago

Rename devmap to loc, devfs to locfs.

  • Property mode set to 100644
File size: 3.9 KB
RevLine 
[9f51afc]1/*
[1875a0c]2 * Copyright (c) 2011 Martin Decky
[9f51afc]3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
[1875a0c]29/** @addtogroup mouse_port
30 * @ingroup mouse
[9f51afc]31 * @{
[1875a0c]32 */
[9f51afc]33/** @file
[1875a0c]34 * @brief Chardev mouse port driver.
[9f51afc]35 */
36
37#include <ipc/char.h>
[1875a0c]38#include <stdio.h>
[9f51afc]39#include <async.h>
40#include <errno.h>
[15f3c3f]41#include <loc.h>
[1875a0c]42#include <input.h>
[9f51afc]43#include <mouse_port.h>
[1875a0c]44#include <mouse.h>
[9f51afc]45
[1875a0c]46static mouse_dev_t *mouse_dev;
[a40dea3]47static async_sess_t *dev_sess;
[9f51afc]48
[1875a0c]49/** List of devices to try connecting to. */
50static const char *in_devs[] = {
51 "char/ps2b",
52};
[9f51afc]53
[1875a0c]54static const unsigned int num_devs = sizeof(in_devs) / sizeof(in_devs[0]);
55
56static void mouse_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg)
57{
58 /* Ignore parameters, the connection is already opened */
59 while (true) {
60 ipc_call_t call;
61 ipc_callid_t callid = async_get_call(&call);
62
63 if (!IPC_GET_IMETHOD(call)) {
64 /* TODO: Handle hangup */
65 return;
66 }
67
68 int retval;
69
70 switch (IPC_GET_IMETHOD(call)) {
71 case CHAR_NOTIF_BYTE:
72 mouse_push_data(mouse_dev, IPC_GET_ARG1(call));
73 break;
74 default:
75 retval = ENOENT;
76 }
77
78 async_answer_0(callid, retval);
79 }
80}
81
82static int chardev_port_init(mouse_dev_t *mdev)
[9f51afc]83{
[15f3c3f]84 service_id_t service_id;
[1875a0c]85 unsigned int i;
[a40dea3]86 int rc;
87
[1875a0c]88 mouse_dev = mdev;
[79ae36dd]89
[1875a0c]90 for (i = 0; i < num_devs; i++) {
[15f3c3f]91 rc = loc_service_get_id(in_devs[i], &service_id, 0);
[1875a0c]92 if (rc == EOK)
93 break;
94 }
95
96 if (i >= num_devs) {
97 printf("%s: Could not find any suitable input device\n", NAME);
98 return -1;
[9f51afc]99 }
[79ae36dd]100
[15f3c3f]101 dev_sess = loc_service_connect(EXCHANGE_ATOMIC, service_id,
[a40dea3]102 IPC_FLAG_BLOCKING);
103 if (dev_sess == NULL) {
[1875a0c]104 printf("%s: Failed connecting to device\n", NAME);
[79ae36dd]105 return ENOENT;
[9f51afc]106 }
[79ae36dd]107
[1875a0c]108 async_exch_t *exch = async_exchange_begin(dev_sess);
[a40dea3]109 if (exch == NULL) {
[1875a0c]110 printf("%s: Failed starting exchange with device\n", NAME);
[a40dea3]111 async_hangup(dev_sess);
112 return ENOMEM;
113 }
114
[9f51afc]115 /* NB: The callback connection is slotted for removal */
[1875a0c]116 rc = async_connect_to_me(exch, 0, 0, 0, mouse_port_events, NULL);
[a40dea3]117 async_exchange_end(exch);
118
119 if (rc != 0) {
[1875a0c]120 printf("%s: Failed to create callback from device\n", NAME);
[a40dea3]121 async_hangup(dev_sess);
[1875a0c]122 return -1;
[9f51afc]123 }
[79ae36dd]124
[9f51afc]125 return 0;
126}
127
[1875a0c]128static void chardev_port_yield(void)
[9f51afc]129{
130}
131
[1875a0c]132static void chardev_port_reclaim(void)
[9f51afc]133{
134}
135
[1875a0c]136static void chardev_port_write(uint8_t data)
[9f51afc]137{
[a40dea3]138 async_exch_t *exch = async_exchange_begin(dev_sess);
139 if (exch == NULL) {
[1875a0c]140 printf("%s: Failed starting exchange with device\n", NAME);
[a40dea3]141 return;
142 }
[1875a0c]143
[a40dea3]144 async_msg_1(exch, CHAR_WRITE_BYTE, data);
145 async_exchange_end(exch);
[9f51afc]146}
147
[1875a0c]148mouse_port_ops_t chardev_mouse_port = {
149 .init = chardev_port_init,
150 .yield = chardev_port_yield,
151 .reclaim = chardev_port_reclaim,
152 .write = chardev_port_write
153};
[9f51afc]154
155/**
156 * @}
[1875a0c]157 */
Note: See TracBrowser for help on using the repository browser.