Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 0851a3d in mainline


Ignore:
Timestamp:
2017-11-24T08:19:31Z (3 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
ac307b2
Parents:
e7588a8
Message:

Move per-port data to i8042_port_t.

Location:
uspace/drv/char/i8042
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/i8042/i8042.c

    re7588a8 r0851a3d  
    136136        const uint8_t data = IPC_GET_ARG2(*call);
    137137       
    138         circ_buf_t *cbuf = (status & i8042_AUX_DATA) ?
    139             &controller->aux_buffer : &controller->kbd_buffer;
    140138        i8042_port_t *port = (status & i8042_AUX_DATA) ?
    141139            controller->aux : controller->kbd;
     
    143141        fibril_mutex_lock(&port->buf_lock);
    144142       
    145         rc = circ_buf_push(cbuf, &data);
     143        rc = circ_buf_push(&port->cbuf, &data);
    146144        if (rc != EOK)
    147145                ddf_msg(LVL_ERROR, "Buffer overrun");
     
    170168        const size_t cmd_count = sizeof(i8042_cmds) / sizeof(irq_cmd_t);
    171169        irq_cmd_t cmds[cmd_count];
     170        ddf_fun_t *kbd_fun;
     171        ddf_fun_t *aux_fun;
    172172        i8042_regs_t *ar;
    173 
     173       
    174174        int rc;
    175175        bool kbd_bound = false;
    176176        bool aux_bound = false;
    177 
    178         dev->kbd_fun = NULL;
    179         dev->aux_fun = NULL;
    180177       
    181178        if (regs->size < sizeof(i8042_regs_t)) {
     
    189186        }
    190187       
    191         dev->kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a");
    192         if (dev->kbd_fun == NULL) {
     188        kbd_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2a");
     189        if (kbd_fun == NULL) {
    193190                rc = ENOMEM;
    194191                goto error;
    195192        };
    196193       
    197         dev->kbd = ddf_fun_data_alloc(dev->kbd_fun, sizeof(i8042_port_t));
     194        dev->kbd = ddf_fun_data_alloc(kbd_fun, sizeof(i8042_port_t));
    198195        if (dev->kbd == NULL) {
    199196                rc = ENOMEM;
     
    201198        }
    202199       
     200        dev->kbd->fun = kbd_fun;
    203201        dev->kbd->ctl = dev;
    204202        chardev_srvs_init(&dev->kbd->cds);
     
    208206        fibril_condvar_initialize(&dev->kbd->buf_cv);
    209207       
    210         rc = ddf_fun_add_match_id(dev->kbd_fun, "char/xtkbd", 90);
     208        rc = ddf_fun_add_match_id(dev->kbd->fun, "char/xtkbd", 90);
    211209        if (rc != EOK)
    212210                goto error;
    213211       
    214         dev->aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b");
    215         if (dev->aux_fun == NULL) {
     212        aux_fun = ddf_fun_create(ddf_dev, fun_inner, "ps2b");
     213        if (aux_fun == NULL) {
    216214                rc = ENOMEM;
    217215                goto error;
    218216        }
    219217       
    220         dev->aux = ddf_fun_data_alloc(dev->aux_fun, sizeof(i8042_port_t));
     218        dev->aux = ddf_fun_data_alloc(aux_fun, sizeof(i8042_port_t));
    221219        if (dev->aux == NULL) {
    222220                rc = ENOMEM;
     
    224222        }
    225223       
     224        dev->aux->fun = aux_fun;
    226225        dev->aux->ctl = dev;
    227226        chardev_srvs_init(&dev->aux->cds);
     
    231230        fibril_condvar_initialize(&dev->aux->buf_cv);
    232231       
    233         rc = ddf_fun_add_match_id(dev->aux_fun, "char/ps2mouse", 90);
     232        rc = ddf_fun_add_match_id(dev->aux->fun, "char/ps2mouse", 90);
    234233        if (rc != EOK)
    235234                goto error;
    236235       
    237         ddf_fun_set_conn_handler(dev->kbd_fun, i8042_char_conn);
    238         ddf_fun_set_conn_handler(dev->aux_fun, i8042_char_conn);
    239        
    240         circ_buf_init(&dev->kbd_buffer, dev->kbd_data, BUFFER_SIZE, 1);
    241         circ_buf_init(&dev->aux_buffer, dev->aux_data, BUFFER_SIZE, 1);
     236        ddf_fun_set_conn_handler(dev->kbd->fun, i8042_char_conn);
     237        ddf_fun_set_conn_handler(dev->aux->fun, i8042_char_conn);
     238       
     239        circ_buf_init(&dev->kbd->cbuf, dev->kbd->buf_data, BUFFER_SIZE, 1);
     240        circ_buf_init(&dev->aux->cbuf, dev->aux->buf_data, BUFFER_SIZE, 1);
    242241        fibril_mutex_initialize(&dev->write_guard);
    243242       
    244         rc = ddf_fun_bind(dev->kbd_fun);
     243        rc = ddf_fun_bind(dev->kbd->fun);
    245244        if (rc != EOK) {
    246245                ddf_msg(LVL_ERROR, "Failed to bind keyboard function: %s.",
    247                     ddf_fun_get_name(dev->kbd_fun));
     246                    ddf_fun_get_name(dev->kbd->fun));
    248247                goto error;
    249248        }
    250249        kbd_bound = true;
    251250       
    252         rc = ddf_fun_bind(dev->aux_fun);
     251        rc = ddf_fun_bind(dev->aux->fun);
    253252        if (rc != EOK) {
    254253                ddf_msg(LVL_ERROR, "Failed to bind aux function: %s.",
    255                     ddf_fun_get_name(dev->aux_fun));
     254                    ddf_fun_get_name(dev->aux->fun));
    256255                goto error;
    257256        }
     
    332331error:
    333332        if (kbd_bound)
    334                 ddf_fun_unbind(dev->kbd_fun);
     333                ddf_fun_unbind(dev->kbd->fun);
    335334        if (aux_bound)
    336                 ddf_fun_unbind(dev->aux_fun);
    337         if (dev->kbd_fun != NULL)
    338                 ddf_fun_destroy(dev->kbd_fun);
    339         if (dev->aux_fun != NULL)
    340                 ddf_fun_destroy(dev->aux_fun);
     335                ddf_fun_unbind(dev->aux->fun);
     336        if (dev->kbd->fun != NULL)
     337                ddf_fun_destroy(dev->kbd->fun);
     338        if (dev->aux->fun != NULL)
     339                ddf_fun_destroy(dev->aux->fun);
    341340
    342341        return rc;
     
    393392        i8042_port_t *port = (i8042_port_t *)srv->srvs->sarg;
    394393        size_t p;
    395         i8042_t *i8042 = port->ctl;
    396394        uint8_t *destp = (uint8_t *)dest;
    397395        int rc;
    398396       
    399         circ_buf_t *cbuf = (port == i8042->aux) ?
    400             &i8042->aux_buffer : &i8042->kbd_buffer;
    401        
    402397        fibril_mutex_lock(&port->buf_lock);
    403398       
    404         while (circ_buf_nused(cbuf) == 0)
     399        while (circ_buf_nused(&port->cbuf) == 0)
    405400                fibril_condvar_wait(&port->buf_cv, &port->buf_lock);
    406401
    407402        p = 0;
    408403        while (p < size) {
    409                 rc = circ_buf_pop(cbuf, &destp[p]);
     404                rc = circ_buf_pop(&port->cbuf, &destp[p]);
    410405                if (rc != EOK)
    411406                        break;
  • uspace/drv/char/i8042/i8042.h

    re7588a8 r0851a3d  
    22 * Copyright (c) 2006 Josef Cejka
    33 * Copyright (c) 2011 Jan Vesely
     4 * Copyright (c) 2017 Jiri Svoboda
    45 * All rights reserved.
    56 *
     
    5960/** i8042 Port. */
    6061typedef struct {
    61         struct i8042 *ctl;              /**< Controller */
    62         chardev_srvs_t cds;             /**< Character device server data */
    63         fibril_mutex_t buf_lock;        /**< Protect buffer */
    64         fibril_condvar_t buf_cv;        /**< Signal new data in buffer */
     62        /** Controller */
     63        struct i8042 *ctl;
     64        /** Device function */
     65        ddf_fun_t *fun;
     66        /** Character device server data */
     67        chardev_srvs_t cds;
     68        /** Circular buffer */
     69        circ_buf_t cbuf;
     70        /** Buffer data space */
     71        uint8_t buf_data[BUFFER_SIZE];
     72        /** Protect buffer */
     73        fibril_mutex_t buf_lock;
     74        /** Signal new data in buffer */
     75        fibril_condvar_t buf_cv;
    6576} i8042_port_t;
    6677
    6778/** i8042 Controller. */
    6879typedef struct i8042 {
    69         i8042_regs_t *regs;             /**< I/O registers. */
    70         ddf_fun_t *kbd_fun;             /**< Pirmary port device function. */
    71         ddf_fun_t *aux_fun;             /**< Auxiliary port device function. */
    72         circ_buf_t kbd_buffer;          /**< Primary port buffer. */
    73         circ_buf_t aux_buffer;          /**< Aux. port buffer. */
    74         uint8_t aux_data[BUFFER_SIZE];  /**< Primary port buffer space. */
    75         uint8_t kbd_data[BUFFER_SIZE];  /**< Aux. port buffer space. */
     80        /**< I/O registers. */
     81        i8042_regs_t *regs;
     82        /** Keyboard port */
    7683        i8042_port_t *kbd;
     84        /** AUX port */
    7785        i8042_port_t *aux;
    78         fibril_mutex_t write_guard;     /**< Prevents simultanous port writes.*/
     86        /** Prevents simultanous port writes.*/
     87        fibril_mutex_t write_guard;
    7988} i8042_t;
    80 
    8189
    8290extern int i8042_init(i8042_t *, addr_range_t *, int, int, ddf_dev_t *);
Note: See TracChangeset for help on using the changeset viewer.