From 8819276961a48513ae530598f72c33aa89f79f96 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Thu, 5 Jul 2007 18:01:54 +0200 Subject: svn_rev_442 make it a driver --- cpu/arm920t/imx/serial.c | 93 +++++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 44 deletions(-) (limited to 'cpu') diff --git a/cpu/arm920t/imx/serial.c b/cpu/arm920t/imx/serial.c index 339458fef5..278030cbfa 100644 --- a/cpu/arm920t/imx/serial.c +++ b/cpu/arm920t/imx/serial.c @@ -19,14 +19,9 @@ #include #include - -#if defined CONFIG_IMX_SERIAL1 -#define IMX_UART_BASE IMX_UART1_BASE -#elif defined CONFIG_IMX_SERIAL2 -#define IMX_UART_BASE IMX_UART2_BASE -#else -#error "define CONFIG_IMX_SERIAL1, CONFIG_IMX_SERIAL2 or CONFIG_IMX_SERIAL_NONE" -#endif +#include +#include +#include #define URXD0(base) __REG( 0x0 +(base)) /* Receiver Register */ #define URTX0(base) __REG( 0x40 +(base)) /* Transmitter Register */ @@ -63,7 +58,7 @@ extern void imx_gpio_mode(int gpio_mode); * are always 8 data bits, no parity, 1 stop bit, no start bits. * */ -int serial_init (void) +static int imx_serial_init_port(struct console_device *cdev) { #if 0 volatile struct imx_serial* base = (struct imx_serial *)UART_BASE; @@ -137,58 +132,68 @@ int serial_init (void) return 0; } -void serial_setbrg (void) +static void imx_serial_putc(struct console_device *cdev, char c) { - serial_init(); + struct device_d *dev = cdev->dev; + + /* Wait for Tx FIFO not full */ + while (UTS(dev->map_base) & UTS_TXFULL); + + URTX0(dev->map_base) = c; } -/* - * Read a single byte from the serial port. Returns 1 on success, 0 - * otherwise. When the function is successful, the character read is - * written into its argument c. - */ -int serial_getc (void) +static int imx_serial_tstc(struct console_device *cdev) +{ + struct device_d *dev = cdev->dev; + + /* If receive fifo is empty, return false */ + if (UTS(dev->map_base) & UTS_RXEMPTY) + return 0; + return 1; +} + +static int imx_serial_getc(struct console_device *cdev) { + struct device_d *dev = cdev->dev; + unsigned char ch; - while(UTS(IMX_UART_BASE) & UTS_RXEMPTY); + while(UTS(dev->map_base) & UTS_RXEMPTY); - ch = URXD0(IMX_UART_BASE); + ch = URXD0(dev->map_base); return ch; } -/* - * Output a single byte to the serial port. - */ -void serial_putc (const char c) +static int imx_serial_probe(struct device_d *dev) { - /* Wait for Tx FIFO not full */ - while (UTS(IMX_UART_BASE) & UTS_TXFULL); + struct console_device *cdev; - URTX0(IMX_UART_BASE) = c; + cdev = malloc(sizeof(struct console_device)); + dev->type_data = cdev; + cdev->dev = dev; + cdev->flags = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR; + cdev->tstc = imx_serial_tstc; + cdev->putc = imx_serial_putc; + cdev->getc = imx_serial_getc; - /* If \n, also do \r */ - if (c == '\n') - serial_putc ('\r'); -} + imx_serial_init_port(cdev); -/* - * Test whether a character is in the RX buffer - */ -int serial_tstc (void) -{ - /* If receive fifo is empty, return false */ - if (UTS(IMX_UART_BASE) & UTS_RXEMPTY) - return 0; - return 1; + console_register(cdev); + + return 0; } -void -serial_puts (const char *s) +static struct driver_d imx_serial_driver = { + .name = "imx_serial", + .probe = imx_serial_probe, + .type = DEVICE_TYPE_CONSOLE, +}; + +static int imx_serial_init(void) { - while (*s) { - serial_putc (*s++); - } + register_driver(&imx_serial_driver); + return 0; } +console_initcall(imx_serial_init); -- cgit v1.2.3