/** * Initialize a serial port. * * \param fd KFile Serial struct interface. * \param unit Serial unit to open. Possible values are architecture dependant. */ static struct Serial *ser_open(struct Serial *fd, unsigned int unit) { ASSERT(unit < countof(ser_handles)); ser_handles[unit] = fd; ASSERT(!fd->is_open); DB(fd->is_open = true); fd->unit = unit; fd->hw = ser_hw_getdesc(unit); /* Initialize circular buffers */ ASSERT(fd->hw->txbuffer); ASSERT(fd->hw->rxbuffer); fifo_init(&fd->txfifo, fd->hw->txbuffer, fd->hw->txbuffer_size); fifo_init(&fd->rxfifo, fd->hw->rxbuffer, fd->hw->rxbuffer_size); fd->hw->table->init(fd->hw, fd); /* Set default values */ #if CONFIG_SER_RXTIMEOUT != -1 || CONFIG_SER_TXTIMEOUT != -1 ser_settimeouts(fd, CONFIG_SER_RXTIMEOUT, CONFIG_SER_TXTIMEOUT); #endif #if CONFIG_SER_DEFBAUDRATE ser_setbaudrate(fd, CONFIG_SER_DEFBAUDRATE); #endif /* Clear error flags */ ser_setstatus(fd, 0); return fd; }
static int8_t _gsmWrite(const char *cmd, size_t count) { size_t i; // NOTE: debugging should no be mixed to modem command and response to // avoid timeing issues and discrepancy between debug and release // versions gsmDebug("TX [%s]\n", cmd); // Purge any buffered data before sending a new command ser_purge(gsm); // Clear error flags ser_setstatus(gsm, 0); // Sending the AT command WATCHDOG_RESET(); for (i=0; cmd[i]!='\0' && count; i++, count--) { kfile_putc(cmd[i], &(gsm->fd)); WATCHDOG_RESET(); } return i; }
static void ser_clearerr(struct KFile *fd) { Serial *fds = SERIAL_CAST(fd); ser_setstatus(fds, 0); }