int serial_up_to_eleven(void) { int rv; /* Attempt custom baudrate */ rv = osmo_serial_set_custom_baudrate(dnload.serial_fd.fd, 406250); if (rv == 0) return 0; #ifdef I_HAVE_A_CP210x /* and I know what I'm doing, I swear ! */ /* Try closest standard baudrate (CP210x reprogrammed adapters) */ rv = osmo_serial_set_baudrate(dnload.serial_fd.fd, B460800); if (rv == 0) return 0; #endif /* Everything failed */ fprintf(stderr, "!!!\n"); fprintf(stderr, "!!! ERROR !!!\n"); fprintf(stderr, "!!!\n"); fprintf(stderr, "!!! Unable to set custom baudrate, please use appropriate cable\n"); fprintf(stderr, "!!! ( see wiki http://bb.osmocom.org/trac/wiki/Sniffing )\n"); fprintf(stderr, "!!!\n"); exit(-1); }
static int _reset_open(ModemPlugin * modem) { Osmocom * osmocom = modem; ModemPluginHelper * helper = osmocom->helper; char const * device; unsigned int baudrate; int flags; uint32_t tmpaddr = ROMLOAD_ADDRESS; char const * p; if((device = helper->config_get(helper->modem, "device")) == NULL) device = "/dev/modem"; if((p = helper->config_get(helper->modem, "baudrate")) == NULL || (baudrate = strtoul(p, NULL, 10)) == 0) baudrate = 115200; baudrate = _reset_baudrate(modem, baudrate); if((osmocom->fd.fd = osmo_serial_init(device, baudrate)) < 0) { /* XXX report error */ #ifdef DEBUG fprintf(stderr, "DEBUG: %s: %s\n", device, strerror(errno)); #endif return -1; } if(osmo_fd_register(&osmocom->fd) != 0) { #ifdef DEBUG fprintf(stderr, "DEBUG: %s: %s\n", device, strerror(errno)); #endif /* XXX report error */ return -1; } /* Set serial socket to non-blocking mode of operation */ if((flags = fcntl(osmocom->fd.fd, F_GETFL)) != -1) { flags |= O_NONBLOCK; fcntl(osmocom->fd.fd, F_SETFL, flags); } osmocom->dnload.serial_fd.when = BSC_FD_READ; osmocom->dnload.serial_fd.cb = _osmocom_on_serial_read; if(osmocom->dnload.mode == MODE_ROMLOAD) { tmpaddr = ROMLOAD_ADDRESS; osmo_serial_set_baudrate(osmocom->fd.fd, ROMLOAD_INIT_BAUDRATE); osmocom->tick_timer.cb = &_osmocom_on_beacon_timer; osmocom->tick_timer.data = modem; osmo_timer_schedule(&osmocom->tick_timer, 0, osmocom->dnload.beacon_interval); } else { tmpaddr = MTK_ADDRESS; osmo_serial_set_baudrate(osmocom->fd.fd, MTK_INIT_BAUDRATE); osmocom->tick_timer.cb = &_osmocom_on_mtk_timer; osmocom->tick_timer.data = modem; osmo_timer_schedule(&osmocom->tick_timer, 0, osmocom->dnload.beacon_interval); } /* FIXME not endian proof */ osmocom->dnload.load_address[0] = (tmpaddr >> 24) & 0xff; osmocom->dnload.load_address[1] = (tmpaddr >> 16) & 0xff; osmocom->dnload.load_address[2] = (tmpaddr >> 8) & 0xff; osmocom->dnload.load_address[3] = tmpaddr & 0xff; return 0; }