X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Fser.c;h=5f2b6fcd66af4298bdae8d95891c31276854ed57;hb=a271c7198a59f307b43c74cc3f2741ece9bafcbc;hp=c8ca15be17b1bf20a2ae355fc6c951fd5bde5840;hpb=df94a4b7d8102b20810f889fbc926ac4823b61d9;p=bertos.git diff --git a/bertos/drv/ser.c b/bertos/drv/ser.c index c8ca15be..5f2b6fcd 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 @@ -79,8 +78,10 @@ #error CONFIG_SER_DEFBAUDRATE missing in config.h #endif -#if CONFIG_KERNEL +#if CONFIG_KERNEL && CONFIG_KERN_SCHED #include +#else + #define proc_yield() do {} while(0) #endif #if CONFIG_SER_TXTIMEOUT != -1 || CONFIG_SER_RXTIMEOUT != -1 @@ -113,11 +114,10 @@ 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 + proc_yield(); + wdt_reset(); + #if CONFIG_SER_TXTIMEOUT != -1 if (timer_clock() - start_time >= port->txtimeout) { @@ -158,14 +158,14 @@ 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 + proc_yield(); + wdt_reset(); + #if CONFIG_SER_RXTIMEOUT != -1 if (timer_clock() - start_time >= port->rxtimeout) { @@ -210,7 +210,7 @@ int ser_getchar_nowait(struct Serial *fd) */ static size_t ser_read(struct KFile *fd, void *_buf, size_t size) { - Serial *fds = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); size_t i = 0; char *buf = (char *)_buf; @@ -235,7 +235,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 = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); const char *buf = (const char *)_buf; size_t i = 0; @@ -298,13 +298,13 @@ void ser_setparity(struct Serial *fd, int parity) static int ser_error(struct KFile *fd) { - Serial *fds = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); return ser_getstatus(fds); } static void ser_clearerr(struct KFile *fd) { - Serial *fds = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); ser_setstatus(fds, 0); } @@ -346,7 +346,7 @@ void ser_purgeTx(struct Serial *fd) */ static int ser_flush(struct KFile *fd) { - Serial *fds = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); /* * Wait until the FIFO becomes empty, and then until the byte currently in @@ -355,10 +355,8 @@ 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 + proc_yield(); wdt_reset(); } return 0; @@ -411,7 +409,7 @@ static struct Serial *ser_open(struct Serial *fd, unsigned int unit) */ static int ser_close(struct KFile *fd) { - Serial *fds = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); Serial *port = fds; ASSERT(port->is_open); @@ -436,7 +434,7 @@ static int ser_close(struct KFile *fd) */ static struct KFile *ser_reopen(struct KFile *fd) { - Serial *fds = SERIALKFILE(fd); + Serial *fds = SERIAL_CAST(fd); ser_close(fd); ser_open(fds, fds->unit); @@ -469,7 +467,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 = SERIALKFILE(fd); + Serial *fd_spi = SERIAL_CAST(fd); ser_flush(&fd_spi->fd); ser_purgeRx(fd_spi); @@ -500,7 +498,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 = SERIALKFILE(fd); + Serial *fd_spi = SERIAL_CAST(fd); ser_purgeRx(fd_spi);