Пример #1
0
static unsigned char add_sync_cap(dterm_t* dt, int fd)
{
    dterm_mark_t prop;
    dterm_mark_t c_list;
    unsigned char bitmask[1];  // 4 SYN events.
    int i = 0;

    if (ioctl(fd, EVIOCGBIT(EV_SYN, sizeof(bitmask)), bitmask) < 0) {
        return IEDRV_RES_IO_ERROR;
    }

    dterm_tuple_begin(dt, &prop);
    dterm_atom(dt, ie_sync);
    dterm_list_begin(dt, &c_list);

    // Add all capabilities present
    for(i = 0; i < sizeof(sync_cap_map) / sizeof(sync_cap_map[0]); ++i)  {
        if (t_bit(bitmask, sync_cap_map[i].bit)) {
            dterm_mark_t cap_tuple;
            dterm_tuple_begin(dt, &cap_tuple);
            dterm_atom(dt, sync_cap_map[i].atom);
            dterm_tuple_end(dt, &cap_tuple);
        }
    }

    dterm_list_end(dt, &c_list);
    dterm_tuple_end(dt, &prop);

    return IEDRV_RES_OK;
}
Пример #2
0
static unsigned char add_switch_cap(dterm_t* dt, int fd)
{
    dterm_mark_t prop;
    dterm_mark_t c_list;
#ifndef SW_CNT
#define SW_CNT SW_MAX
#endif
    unsigned char bitmask[SW_CNT / 8 + 1];
    int i = 0;

    if (ioctl(fd, EVIOCGBIT(EV_SW, sizeof(bitmask)), bitmask) < 0) {
        return IEDRV_RES_IO_ERROR;
    }

    dterm_tuple_begin(dt, &prop);
    dterm_atom(dt, ie_switch);
    dterm_list_begin(dt, &c_list);

    // Add all capabilities present
    for(i = 0; i < sizeof(sw_cap_map) / sizeof(sw_cap_map[0]); ++i)  {
        if (t_bit(bitmask, sw_cap_map[i].bit)) {
            dterm_mark_t cap_tuple;
            dterm_tuple_begin(dt, &cap_tuple);
            dterm_atom(dt, sw_cap_map[i].atom);
            dterm_tuple_end(dt, &cap_tuple);
        }
    }

    dterm_list_end(dt, &c_list);
    dterm_tuple_end(dt, &prop);

    return IEDRV_RES_OK;
}
Пример #3
0
static unsigned char add_key_cap(dterm_t* dt, int fd)
{
    dterm_mark_t prop;
    dterm_mark_t c_list;
#ifndef KEY_CNT
#define KEY_CNT KEY_UNKNOWN
#endif
    unsigned char bitmask[KEY_CNT / 8 + 1];

    int i = 0;


    if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(bitmask)), bitmask) < 0) {
        return IEDRV_RES_IO_ERROR;
    }

    dterm_tuple_begin(dt, &prop);
    dterm_atom(dt, ie_key);
    dterm_list_begin(dt, &c_list);

    // Add all capabilities present
    for(i = 0; i < sizeof(key_cap_map) / sizeof(key_cap_map[0]); ++i)
        if (t_bit(bitmask, key_cap_map[i].bit)) {
            dterm_mark_t cap_tuple;
            dterm_tuple_begin(dt, &cap_tuple);
            dterm_atom(dt, key_cap_map[i].atom);
            dterm_int(dt, key_cap_map[i].bit);
            dterm_tuple_end(dt, &cap_tuple);
        }

    dterm_list_end(dt, &c_list);
    dterm_tuple_end(dt, &prop);

    return IEDRV_RES_OK;
}
Пример #4
0
static unsigned char add_abs_cap(dterm_t* dt, int fd)
{
    dterm_mark_t prop;
    dterm_mark_t c_list;
    unsigned char bitmask[KEY_CNT / 8 + 1];

    int i = 0;


    if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitmask)), bitmask) < 0) {
        return IEDRV_RES_IO_ERROR;
    }

    dterm_tuple_begin(dt, &prop);
    dterm_atom(dt, ie_abs);
    dterm_list_begin(dt, &c_list);

    // Add all capabilities present.
    // Each element will have the format
    // { Cap (abs_x), { CurrentVal, Min, Max, Fuzz, Flat, Resolution }}
    for(i = 0; i < sizeof(abs_cap_map) / sizeof(abs_cap_map[0]); ++i) {
        struct input_absinfo abs_info;
        dterm_mark_t a_prop;

        if (!t_bit(bitmask, abs_cap_map[i].bit))
            continue;

        if (ioctl(fd, EVIOCGABS(abs_cap_map[i].bit), &abs_info) < 0) {
            continue;
        }

        dterm_tuple_begin(dt, &a_prop);{
            dterm_mark_t cap_tuple;
            dterm_tuple_begin(dt, &cap_tuple);
            dterm_atom(dt, abs_cap_map[i].atom);
            dterm_atom(dt, ie_absinfo);
            dterm_int(dt, abs_info.value);
            dterm_int(dt, abs_info.minimum);
            dterm_int(dt, abs_info.maximum);
            dterm_int(dt, abs_info.fuzz);
            dterm_int(dt, abs_info.flat);
//            dterm_int(dt, abs_info.resolution);  // Not available in ARM7
            dterm_tuple_end(dt, &cap_tuple);
        }
        dterm_tuple_end(dt, &a_prop);
    }

    dterm_list_end(dt, &c_list);
    dterm_tuple_end(dt, &prop);

    return IEDRV_RES_OK;
}
Пример #5
0
// Build a list of modem state flags
int modem_state_dterm(dterm_t* t, uart_modem_state_t state)
{
    dterm_mark_t m;

    dterm_list_begin(t, &m);
    if (state & UART_DTR) dterm_atom(t, am_dtr);
    if (state & UART_RTS) dterm_atom(t, am_rts);
    if (state & UART_CTS) dterm_atom(t, am_cts);
    if (state & UART_CD)  dterm_atom(t, am_cd);
    if (state & UART_RI)  dterm_atom(t, am_ri);
    if (state & UART_DSR) dterm_atom(t, am_dsr);
    // SW is not really in modem state but used with flow control
    if (state & UART_SW)  dterm_atom(t, am_sw);
    dterm_list_end(t, &m);
    return dterm_used_size(t);
}
Пример #6
0
static unsigned char add_cap(dterm_t* dt, int fd)
{
    unsigned char master_bitmask[EV_MAX / 8 + 1];
    unsigned res = IEDRV_RES_OK;
    dterm_mark_t c_list;

    dterm_list_begin(dt, &c_list);

    // Retrieve maste capabilities.
    if (ioctl(fd, EVIOCGBIT(0, sizeof(master_bitmask)), master_bitmask) < 0) {
        res = IEDRV_RES_IO_ERROR;
        goto end;
    }

    if (t_bit(master_bitmask, EV_SYN) &&
        (res = add_sync_cap(dt, fd)) != IEDRV_RES_OK)
        goto end;

    if (t_bit(master_bitmask, EV_REL) &&
        (res = add_rel_cap(dt, fd)) != IEDRV_RES_OK)
        goto end;

    if (t_bit(master_bitmask, EV_ABS) &&
        (res = add_abs_cap(dt, fd)) != IEDRV_RES_OK)
        goto end;

    if (t_bit(master_bitmask, EV_KEY) &&
        (res = add_key_cap(dt, fd)) != IEDRV_RES_OK)
        goto end;

    if (t_bit(master_bitmask, EV_SW) &&
        (res = add_switch_cap(dt, fd)) != IEDRV_RES_OK)
        goto end;

end:
    dterm_list_end(dt, &c_list);

    return res;
}