*
* Copyright 2003, 2004, 2006 Develer S.r.l. (http://www.develer.com/)
* Copyright 2000 Bernie Innocenti <bernie@codewiz.org>
- *
* -->
*
* \brief Buffered serial I/O driver
#include <mware/formatwr.h>
-#include <string.h> /* memset */
+#include <cpu/power.h> /* cpu_relax() */
+
+#include <string.h> /* 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
+ #error CONFIG_KERNEL 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 <kern/proc.h>
-#endif
-
-#if CONFIG_SER_TXTIMEOUT != -1 || CONFIG_SER_RXTIMEOUT != -1
- #include <drv/timer.h>
+ #error CONFIG_SER_DEFBAUDRATE missing in cfg_ser.h
#endif
/* 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)
{
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)
{
*/
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;
*/
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;
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);
}
*/
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
*/
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;
}
*/
static int ser_close(struct KFile *fd)
{
- Serial *fds = SERIAL(fd);
+ Serial *fds = SERIAL_CAST(fd);
Serial *port = fds;
ASSERT(port->is_open);
*/
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);
*/
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);
*/
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);