X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fser.c;h=a684ebbaf6cdcb22767afe8ad248fb09db685235;hb=42c8858fcf3b852cb7e34d7e9170b484da59e63a;hp=0ab31aaa93e27437af693809ee903598eb295e8a;hpb=5052c1fc4ec98aee492d449e853febc1a2b09d40;p=bertos.git diff --git a/bertos/drv/ser.c b/bertos/drv/ser.c index 0ab31aaa..a684ebba 100644 --- a/bertos/drv/ser.c +++ b/bertos/drv/ser.c @@ -28,7 +28,6 @@ * * Copyright 2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/) * Copyright 2000 Bernie Innocenti - * * --> * * \brief Buffered serial I/O driver @@ -53,38 +52,33 @@ #include "ser.h" #include "wdt.h" +#include "timer.h" #include "ser_p.h" #include "cfg/cfg_ser.h" -#include "cfg/cfg_kern.h" +#include "cfg/cfg_proc.h" #include #include -#include /* memset */ +#include /* cpu_relax() */ + +#include /* memset() */ /* * Sanity check for config parameters required by this module. */ -#if !defined(CONFIG_KERNEL) || ((CONFIG_KERNEL != 0) && CONFIG_KERNEL != 1) - #error CONFIG_KERNEL must be set to either 0 or 1 in config.h +#if !defined(CONFIG_KERN) || ((CONFIG_KERN != 0) && CONFIG_KERN != 1) + #error CONFIG_KERN must be set to either 0 or 1 in cfg_kern.h #endif #if !defined(CONFIG_SER_RXTIMEOUT) - #error CONFIG_SER_TXTIMEOUT missing in config.h + #error CONFIG_SER_TXTIMEOUT missing in cfg_ser.h #endif #if !defined(CONFIG_SER_RXTIMEOUT) - #error CONFIG_SER_RXTIMEOUT missing in config.h + #error CONFIG_SER_RXTIMEOUT missing in cfg_ser.h #endif #if !defined(CONFIG_SER_DEFBAUDRATE) - #error CONFIG_SER_DEFBAUDRATE missing in config.h -#endif - -#if CONFIG_KERNEL - #include -#endif - -#if CONFIG_SER_TXTIMEOUT != -1 || CONFIG_SER_RXTIMEOUT != -1 - #include + #error CONFIG_SER_DEFBAUDRATE missing in cfg_ser.h #endif @@ -113,11 +107,8 @@ static int ser_putchar(int c, struct Serial *port) /* Wait while buffer is full... */ do { - wdt_reset(); -#if CONFIG_KERNEL && CONFIG_KERN_SCHED - /* Give up timeslice to other processes. */ - proc_switch(); -#endif + cpu_relax(); + #if CONFIG_SER_TXTIMEOUT != -1 if (timer_clock() - start_time >= port->txtimeout) { @@ -158,14 +149,12 @@ static int ser_getchar(struct Serial *port) ticks_t start_time = timer_clock(); #endif + /* Wait while buffer is empty */ do { - wdt_reset(); -#if CONFIG_KERNEL && CONFIG_KERN_SCHED - /* Give up timeslice to other processes. */ - proc_switch(); -#endif + cpu_relax(); + #if CONFIG_SER_RXTIMEOUT != -1 if (timer_clock() - start_time >= port->rxtimeout) { @@ -210,7 +199,7 @@ int ser_getchar_nowait(struct Serial *fd) */ static size_t ser_read(struct KFile *fd, void *_buf, size_t size) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); size_t i = 0; char *buf = (char *)_buf; @@ -235,7 +224,7 @@ static size_t ser_read(struct KFile *fd, void *_buf, size_t size) */ static size_t ser_write(struct KFile *fd, const void *_buf, size_t size) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); const char *buf = (const char *)_buf; size_t i = 0; @@ -252,38 +241,20 @@ static size_t ser_write(struct KFile *fd, const void *_buf, size_t size) #if CONFIG_SER_RXTIMEOUT != -1 || CONFIG_SER_TXTIMEOUT != -1 void ser_settimeouts(struct Serial *fd, mtime_t rxtimeout, mtime_t txtimeout) { - fd->rxtimeout = ms_to_ticks(rxtimeout); - fd->txtimeout = ms_to_ticks(txtimeout); + #if CONFIG_SER_RXTIMEOUT != -1 + fd->rxtimeout = ms_to_ticks(rxtimeout); + #else + (void)rxtimeout; + #endif + + #if CONFIG_SER_TXTIMEOUT != -1 + fd->txtimeout = ms_to_ticks(txtimeout); + #else + (void)txtimeout; + #endif } #endif /* CONFIG_SER_RXTIMEOUT || CONFIG_SER_TXTIMEOUT */ -#if CONFIG_SER_RXTIMEOUT != -1 -/** - * Discard input to resynchronize with remote end. - * - * Discard incoming data until the port stops receiving - * characters for at least \a delay milliseconds. - * - * \note Serial errors are reset before and after executing the purge. - */ -void ser_resync(struct Serial *fd, mtime_t delay) -{ - mtime_t old_rxtimeout = ticks_to_ms(fd->rxtimeout); - - ser_settimeouts(fd, delay, ticks_to_ms(fd->txtimeout)); - do - { - ser_setstatus(fd, 0); - ser_getchar(fd); - } - while (!(ser_getstatus(fd) & SERRF_RXTIMEOUT)); - - /* Restore port to an usable status */ - ser_setstatus(fd, 0); - ser_settimeouts(fd, old_rxtimeout, ticks_to_ms(fd->txtimeout)); -} -#endif /* CONFIG_SER_RXTIMEOUT */ - void ser_setbaudrate(struct Serial *fd, unsigned long rate) { @@ -298,13 +269,13 @@ void ser_setparity(struct Serial *fd, int parity) static int ser_error(struct KFile *fd) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); return ser_getstatus(fds); } static void ser_clearerr(struct KFile *fd) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); ser_setstatus(fds, 0); } @@ -346,7 +317,7 @@ void ser_purgeTx(struct Serial *fd) */ static int ser_flush(struct KFile *fd) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); /* * Wait until the FIFO becomes empty, and then until the byte currently in @@ -354,13 +325,7 @@ static int ser_flush(struct KFile *fd) */ while (!fifo_isempty(&fds->txfifo) || fds->hw->table->txSending(fds->hw)) - { - #if CONFIG_KERNEL && CONFIG_KERN_SCHED - /* Give up timeslice to other processes. */ - proc_switch(); - #endif - wdt_reset(); - } + cpu_relax(); return 0; } @@ -411,7 +376,7 @@ static struct Serial *ser_open(struct Serial *fd, unsigned int unit) */ static int ser_close(struct KFile *fd) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); Serial *port = fds; ASSERT(port->is_open); @@ -436,7 +401,7 @@ static int ser_close(struct KFile *fd) */ static struct KFile *ser_reopen(struct KFile *fd) { - Serial *fds = SERIAL(fd); + Serial *fds = SERIAL_CAST(fd); ser_close(fd); ser_open(fds, fds->unit); @@ -469,7 +434,7 @@ void ser_init(struct Serial *fds, unsigned int unit) */ static size_t spimaster_read(struct KFile *fd, void *_buf, size_t size) { - Serial *fd_spi = SERIAL(fd); + Serial *fd_spi = SERIAL_CAST(fd); ser_flush(&fd_spi->fd); ser_purgeRx(fd_spi); @@ -500,7 +465,7 @@ static size_t spimaster_read(struct KFile *fd, void *_buf, size_t size) */ static size_t spimaster_write(struct KFile *fd, const void *buf, size_t size) { - Serial *fd_spi = SERIAL(fd); + Serial *fd_spi = SERIAL_CAST(fd); ser_purgeRx(fd_spi);