/** Set VLAN (802.1q) tag. * * Set whether the tag is to be signaled in offload info and * if the tag should be stripped from received frames and added * to sent frames automatically. Not every combination of add * and strip must be supported. * * @param[in] dev_sess * @param[in] tag VLAN priority (top 3 bits) and * the VLAN tag (bottom 12 bits) * @param[in] add Add the VLAN tag automatically (boolean) * @param[in] strip Strip the VLAN tag automatically (boolean) * * @return EOK If the operation was successfully completed * */ int nic_vlan_set_tag(async_sess_t *dev_sess, uint16_t tag, bool add, bool strip) { async_exch_t *exch = async_exchange_begin(dev_sess); int rc = async_req_4_0(exch, DEV_IFACE_ID(NIC_DEV_IFACE), NIC_VLAN_SET_TAG, (sysarg_t) tag, (sysarg_t) add, (sysarg_t) strip); async_exchange_end(exch); return rc; }
int win_damage(async_sess_t *sess, sysarg_t x, sysarg_t y, sysarg_t width, sysarg_t height) { async_exch_t *exch = async_exchange_begin(sess); int ret = async_req_4_0(exch, WINDOW_DAMAGE, x, y, width, height); async_exchange_end(exch); return ret; }
/** Control sending and reception of the PAUSE frame. * * @param[in] dev_sess * @param[in] allow_send Allow sending the PAUSE frame (true/false) * @param[in] allow_receive Allow reception of the PAUSE frame (true/false) * @param[in] pause Pause length in 512 bit units written * to transmitted frames. The value 0 means * auto value (the best). If the requested * time cannot be set the driver is allowed * to set the nearest supported value. * * @return EOK If the operation was successfully completed * */ int nic_set_pause(async_sess_t *dev_sess, int allow_send, int allow_receive, uint16_t pause) { async_exch_t *exch = async_exchange_begin(dev_sess); int rc = async_req_4_0(exch, DEV_IFACE_ID(NIC_DEV_IFACE), NIC_SET_PAUSE, allow_send, allow_receive, pause); async_exchange_end(exch); return rc; }
/** * Switch IPC exchange to a STREAM mode. * @param exch IPC exchange. * @param id context id this stream should be associated with * @param flags set stream properties * @param format format of the new stream. * @param bsize size of the server side buffer. * @return Error code. */ int hound_service_stream_enter(async_exch_t *exch, hound_context_id_t id, int flags, pcm_format_t format, size_t bsize) { const format_convert_t c = { .f = { .channels = format.channels, .rate = format.sampling_rate / 100, .format = format.sample_format, }}; return async_req_4_0(exch, IPC_M_HOUND_STREAM_ENTER, id, flags, c.arg, bsize); }
/** Set current operation mode. * * If the NIC has auto-negotiation enabled, this command * disables auto-negotiation and sets the operation mode. * * @param[in] dev_sess * @param[in] speed Operation speed in Mbps * @param[in] duplex Full duplex/half duplex * @param[in] role Master/slave/auto (e.g. in Gbit Ethernet] * * @return EOK If the operation was successfully completed * */ int nic_set_operation_mode(async_sess_t *dev_sess, int speed, nic_channel_mode_t duplex, nic_role_t role) { async_exch_t *exch = async_exchange_begin(dev_sess); int rc = async_req_4_0(exch, DEV_IFACE_ID(NIC_DEV_IFACE), NIC_SET_OPERATION_MODE, (sysarg_t) speed, (sysarg_t) duplex, (sysarg_t) role); async_exchange_end(exch); return rc; }
int main(int argc, char **argv) { sysarg_t baud = 38400; service_id_t svc_id; char *serial_port_name = NULL; int arg = 1; int rc; isdv4_event_fn event_fn = emit_event; if (argc > arg && str_test_prefix(argv[arg], "--baud=")) { size_t arg_offset = str_lsize(argv[arg], 7); char* arg_str = argv[arg] + arg_offset; if (str_length(arg_str) == 0) { fprintf(stderr, "--baud requires an argument\n"); syntax_print(); return 1; } char *endptr; baud = strtol(arg_str, &endptr, 10); if (*endptr != '\0') { fprintf(stderr, "Invalid value for baud\n"); syntax_print(); return 1; } arg++; } if (argc > arg && str_cmp(argv[arg], "--print-events") == 0) { event_fn = print_and_emit_event; arg++; } if (argc > arg) { serial_port_name = argv[arg]; rc = loc_service_get_id(serial_port_name, &svc_id, 0); if (rc != EOK) { fprintf(stderr, "Cannot find device service %s\n", argv[arg]); return 1; } arg++; } else { category_id_t serial_cat_id; rc = loc_category_get_id("serial", &serial_cat_id, 0); if (rc != EOK) { fprintf(stderr, "Failed getting id of category " "'serial'\n"); return 1; } service_id_t *svc_ids; size_t svc_count; rc = loc_category_get_svcs(serial_cat_id, &svc_ids, &svc_count); if (rc != EOK) { fprintf(stderr, "Failed getting list of services\n"); return 1; } if (svc_count == 0) { fprintf(stderr, "No service in category 'serial'\n"); free(svc_ids); return 1; } svc_id = svc_ids[0]; rc = loc_service_get_name(svc_id, &serial_port_name); if (rc != EOK) { fprintf(stderr, "Failed getting name of serial service\n"); return 1; } free(svc_ids); } if (argc > arg) { fprintf(stderr, "Too many arguments\n"); syntax_print(); return 1; } fibril_mutex_initialize(&client_mutex); printf(NAME ": Using serial port %s\n", serial_port_name); async_sess_t *sess = loc_service_connect(svc_id, INTERFACE_DDF, IPC_FLAG_BLOCKING); if (!sess) { fprintf(stderr, "Failed connecting to service\n"); } async_exch_t *exch = async_exchange_begin(sess); rc = async_req_4_0(exch, SERIAL_SET_COM_PROPS, baud, SERIAL_NO_PARITY, 8, 1); async_exchange_end(exch); if (rc != EOK) { fprintf(stderr, "Failed setting serial properties\n"); return 2; } rc = isdv4_init(&state, sess, event_fn); if (rc != EOK) { fprintf(stderr, "Failed initializing isdv4 state"); return 2; } rc = isdv4_init_tablet(&state); if (rc != EOK) { fprintf(stderr, "Failed initializing tablet"); return 2; } printf("Tablet information:\n"); printf(" Stylus: %ux%u pressure: %u tilt: ", state.stylus_max_x, state.stylus_max_y, state.stylus_max_pressure); if (state.stylus_tilt_supported) { printf("%ux%u\n", state.stylus_max_xtilt, state.stylus_max_ytilt); } else { printf("not supported\n"); } printf(" Touch: %ux%u type: %s\n", state.touch_max_x, state.touch_max_y, touch_type(state.touch_type)); fid_t fibril = fibril_create(read_fibril, NULL); /* From this on, state is to be used only by read_fibril */ fibril_add_ready(fibril); async_set_fallback_port_handler(mouse_connection, NULL); rc = loc_server_register(NAME); if (rc != EOK) { printf("%s: Unable to register driver.\n", NAME); return rc; } service_id_t service_id; char *service_name; rc = asprintf(&service_name, "mouse/isdv4-%" PRIun, svc_id); if (rc < 0) { printf(NAME ": Unable to create service name\n"); return rc; } rc = loc_service_register(service_name, &service_id); if (rc != EOK) { printf(NAME ": Unable to register service %s.\n", service_name); return rc; } category_id_t mouse_category; rc = loc_category_get_id("mouse", &mouse_category, IPC_FLAG_BLOCKING); if (rc != EOK) { printf(NAME ": Unable to get mouse category id.\n"); } else { rc = loc_service_add_to_cat(service_id, mouse_category); if (rc != EOK) { printf(NAME ": Unable to add device to mouse category.\n"); } } printf("%s: Accepting connections\n", NAME); task_retval(0); async_manager(); /* Not reached */ return 0; }
int main(int argc, char **argv) { sysarg_t baud = 9600; service_id_t svc_id; int arg = 1; int rc; if (argc > arg && str_test_prefix(argv[arg], "--baud=")) { size_t arg_offset = str_lsize(argv[arg], 7); char* arg_str = argv[arg] + arg_offset; if (str_length(arg_str) == 0) { fprintf(stderr, "--baud requires an argument\n"); syntax_print(); return 1; } char *endptr; baud = strtol(arg_str, &endptr, 10); if (*endptr != '\0') { fprintf(stderr, "Invalid value for baud\n"); syntax_print(); return 1; } arg++; } if (argc > arg) { rc = loc_service_get_id(argv[arg], &svc_id, 0); if (rc != EOK) { fprintf(stderr, "Cannot find device service %s\n", argv[arg]); return 1; } arg++; } else { category_id_t serial_cat_id; rc = loc_category_get_id("serial", &serial_cat_id, 0); if (rc != EOK) { fprintf(stderr, "Failed getting id of category " "'serial'\n"); return 1; } service_id_t *svc_ids; size_t svc_count; rc = loc_category_get_svcs(serial_cat_id, &svc_ids, &svc_count); if (rc != EOK) { fprintf(stderr, "Failed getting list of services\n"); return 1; } if (svc_count == 0) { fprintf(stderr, "No service in category 'serial'\n"); free(svc_ids); return 1; } svc_id = svc_ids[0]; free(svc_ids); } if (argc > arg) { fprintf(stderr, "Too many arguments\n"); syntax_print(); return 1; } async_sess_t *sess = loc_service_connect(svc_id, INTERFACE_DDF, IPC_FLAG_BLOCKING); if (!sess) { fprintf(stderr, "Failed connecting to service\n"); } async_exch_t *exch = async_exchange_begin(sess); rc = async_req_4_0(exch, SERIAL_SET_COM_PROPS, baud, SERIAL_NO_PARITY, 8, 1); async_exchange_end(exch); if (rc != EOK) { fprintf(stderr, "Failed setting serial properties\n"); return 2; } uint8_t *buf = (uint8_t *) malloc(BUF_SIZE); if (buf == NULL) { fprintf(stderr, "Failed allocating buffer\n"); return 3; } while (true) { ssize_t read = char_dev_read(sess, buf, BUF_SIZE); if (read < 0) { fprintf(stderr, "Failed reading from serial device\n"); break; } ssize_t i; for (i = 0; i < read; i++) { printf("%02hhx ", buf[i]); } fflush(stdout); } free(buf); return 0; }