void xbee_term( xbee_serial_t *port) { int ch, retval; char buffer[40]; // set up the console for nonblocking xbee_term_console_init(); puts( "Simple XBee Terminal"); puts( "CTRL-X to EXIT, CTRL-K toggles break, CTRL-R toggles RTS, " "TAB changes bps."); print_baudrate( port); set_rts( port, RTS_ASSERT); check_cts( port); puts( ""); for (;;) { check_cts( port); ch = xbee_term_getchar(); if (ch == CTRL('X')) { break; // exit terminal } else if (ch == CTRL('R')) { set_rts( port, RTS_TOGGLE); } else if (ch == CTRL('K')) { set_break( port, BREAK_TOGGLE); } else if (ch == CTRL('I')) // tab { next_baudrate( port); } else if (ch > 0) { // Pass all characters out serial port, converting LF to CR // since XBee expects CR for line endings. xbee_ser_putchar( port, ch == '\n' ? '\r' : ch); // Only print printable characters or CR, LF or backspace to stdout. if (isprint( ch) || ch == '\r' || ch == '\n' || ch == '\b') { set_color( SOURCE_KEYBOARD); // stdout expects LF for line endings putchar( ch == '\r' ? '\n' : ch); fflush( stdout); } } retval = xbee_ser_read( port, buffer, sizeof buffer); if (retval > 0) { dump_serial_data( buffer, retval); } } xbee_term_console_restore(); puts( ""); }
void hd_scan_serial(hd_data_t *hd_data) { hd_t *hd, *hd2; serial_t *ser, *next; hd_res_t *res, *res2; int i; char buf[4], *skip_dev[16]; str_list_t *sl, *cmd; unsigned skip_devs = 0; if(!hd_probe_feature(hd_data, pr_serial)) return; hd_data->module = mod_serial; /* some clean-up */ remove_hd_entries(hd_data); hd_data->serial = NULL; PROGRESS(1, 0, "read info"); get_serial_info(hd_data); if((hd_data->debug & HD_DEB_SERIAL)) dump_serial_data(hd_data); for(i = 0; i < 2; i++) { cmd = get_cmdline(hd_data, i == 0 ? "yast2ser" : "console"); for(sl = cmd; sl; sl = sl->next) { if(sscanf(sl->str, "tty%3[^,]", buf) == 1) { if(buf[1] == 0) { switch(*buf) { case 'a': strcpy(buf, "S0"); break; case 'b': strcpy(buf, "S1"); break; } } if(skip_devs < sizeof skip_dev / sizeof *skip_dev) { skip_dev[skip_devs] = NULL; str_printf(&skip_dev[skip_devs++], 0, "/dev/tty%s", buf); } } } free_str_list(cmd); } PROGRESS(2, 0, "build list"); for(ser = hd_data->serial; ser; ser = ser->next) { hd = add_hd_entry(hd_data, __LINE__, 0); hd->base_class.id = bc_comm; hd->sub_class.id = sc_com_ser; hd->prog_if.id = 0x80; for(i = 0; (unsigned) i < sizeof ser_names / sizeof *ser_names; i++) { if(strstr(ser->name, ser_names[i])) hd->prog_if.id = i; } hd->device.name = new_str(ser->name); hd->func = ser->line; if(ser->name && !strcmp(ser->name, "AgereModem")) { str_printf(&hd->unix_dev_name, 0, "/dev/ttyAGS%u", ser->line); } else { str_printf(&hd->unix_dev_name, 0, "/dev/ttyS%u", ser->line); } for(i = 0; i < (int) skip_devs; i++) { if(!strcmp(skip_dev[i], hd->unix_dev_name)) { hd->tag.skip_mouse = hd->tag.skip_modem = hd->tag.skip_braille = 1; break; } } if(ser->device) { if(strstr(ser->device, "modem-printer")) { hd->tag.ser_device = 1; } else if(strstr(ser->device, "infrared")) { hd->tag.ser_device = 2; } else if(strstr(ser->device, "modem")) { hd->tag.ser_device = 3; } } if(ser->baud) { res = add_res_entry(&hd->res, new_mem(sizeof *res)); res->baud.type = res_baud; res->baud.speed = ser->baud; } res = add_res_entry(&hd->res, new_mem(sizeof *res)); res->io.type = res_io; res->io.enabled = 1; res->io.base = ser->port; res->io.access = acc_rw; res = add_res_entry(&hd->res, new_mem(sizeof *res)); res->irq.type = res_irq; res->irq.enabled = 1; res->irq.base = ser->irq; /* skip Dell Remote Access Cards - bug #145051 */ for(hd2 = hd_data->hd; hd2; hd2 = hd2->next) { if( hd2->vendor.id == MAKE_ID(TAG_PCI, 0x1028) && /* Dell */ hd2->device.id >= MAKE_ID(TAG_PCI, 0x07) && hd2->device.id <= MAKE_ID(TAG_PCI, 0x12) /* range that covers DRACs */ ) { for(res2 = hd2->res; res2; res2 = res2->next) { if( res2->any.type == res_io && ser->port >= res2->io.base && ser->port < res2->io.base + res2->io.range ) { hd->tag.skip_mouse = hd->tag.skip_modem = hd->tag.skip_braille = 1; } } } } } for(ser = hd_data->serial; ser; ser = next) { next = ser->next; free_mem(ser->name); free_mem(ser->device); free_mem(ser); } hd_data->serial = NULL; #if 0 if(hd_module_is_active(hd_data, "irda")) { hd = add_hd_entry(hd_data, __LINE__, 0); hd->base_class.id = bc_comm; hd->sub_class.id = sc_com_ser; hd->prog_if.id = 0x80; hd->device.name = new_str("IrDA Serial"); hd->unix_dev_name = new_str("/dev/ircomm0"); } #endif }