socsvn commit: r271975 - in soc2014/astarasikov/head/sys: arm/goldfish dev/uart
astarasikov at FreeBSD.org
astarasikov at FreeBSD.org
Wed Aug 6 01:35:09 UTC 2014
Author: astarasikov
Date: Wed Aug 6 01:35:07 2014
New Revision: 271975
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271975
Log:
[goldfish] rework UART to print very early dmesg
Modified:
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_uart.c
soc2014/astarasikov/head/sys/dev/uart/uart.h
soc2014/astarasikov/head/sys/dev/uart/uart_bus_fdt.c
soc2014/astarasikov/head/sys/dev/uart/uart_tty.c
Modified: soc2014/astarasikov/head/sys/arm/goldfish/goldfish_uart.c
==============================================================================
--- soc2014/astarasikov/head/sys/arm/goldfish/goldfish_uart.c Wed Aug 6 01:34:05 2014 (r271974)
+++ soc2014/astarasikov/head/sys/arm/goldfish/goldfish_uart.c Wed Aug 6 01:35:07 2014 (r271975)
@@ -27,24 +27,21 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
+#include <sys/conf.h>
#include <sys/cons.h>
-#include <sys/consio.h>
-#include <sys/kernel.h>
-#include <sys/module.h>
+#include <sys/tty.h>
#include <sys/rman.h>
-
#include <machine/bus.h>
#include <machine/intr.h>
-#include <dev/fdt/fdt_common.h>
-#include <dev/ofw/openfirm.h>
+#include <dev/uart/uart.h>
+#include <dev/uart/uart_cpu.h>
+#include <dev/uart/uart_bus.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
+#include "uart_if.h"
enum goldfish_guart_regs {
TTY_PUT_CHAR = 0x00,
@@ -61,147 +58,183 @@
TTY_CMD_READ_BUFFER = 3,
};
-struct goldfish_guart_softc {
- struct resource * li_res;
- bus_space_tag_t li_bst;
- bus_space_handle_t li_bsh;
+/*
+ * Low-level UART interface.
+ */
+static int goldfish_probe(struct uart_bas *bas);
+static void goldfish_init(struct uart_bas *bas, int, int, int, int);
+static void goldfish_term(struct uart_bas *bas);
+static void goldfish_putc(struct uart_bas *bas, int);
+static int goldfish_rxready(struct uart_bas *bas);
+static int goldfish_getc(struct uart_bas *bas, struct mtx *mtx);
+
+extern SLIST_HEAD(uart_devinfo_list, uart_devinfo) uart_sysdevs;
+
+struct uart_ops uart_goldfish_ops = {
+ .probe = goldfish_probe,
+ .init = goldfish_init,
+ .term = goldfish_term,
+ .putc = goldfish_putc,
+ .rxready = goldfish_rxready,
+ .getc = goldfish_getc,
};
-static int goldfish_guart_probe(device_t);
-static int goldfish_guart_attach(device_t);
+static int
+goldfish_probe(struct uart_bas *bas)
+{
+ return (0);
+}
+
+static void
+goldfish_init(struct uart_bas *bas, int baudrate, int databits, int stopbits,
+ int parity)
+{
+}
-static struct goldfish_guart_softc *uart_softc = NULL;
+static void
+goldfish_term(struct uart_bas *bas)
+{
+}
-#define uart_read_4(reg) \
- bus_space_read_4(uart_softc->li_bst, uart_softc->li_bsh, reg)
-#define uart_write_4(reg, val) \
- bus_space_write_4(uart_softc->li_bst, uart_softc->li_bsh, reg, val)
+static void
+goldfish_putc(struct uart_bas *bas, int c)
+{
+ uart_setreg(bas, TTY_PUT_CHAR, c);
+}
static int
-goldfish_guart_probe(device_t dev)
+goldfish_rxready(struct uart_bas *bas)
{
- if (!ofw_bus_is_compatible(dev, "arm,goldfish-uart"))
- return (ENXIO);
-
- device_set_desc(dev, "Goldfish (Android Emulator) UART");
- return (BUS_PROBE_DEFAULT);
+ return 0;
+ //return (!!uart_getreg(bas, TTY_BYTES_READY));
}
static int
-goldfish_guart_attach(device_t dev)
+goldfish_getc(struct uart_bas *bas, struct mtx *mtx)
{
- struct goldfish_guart_softc *sc = device_get_softc(dev);
- int rid = 0;
+ int c = 0;
+ //uart_setreg(bas, TTY_DATA_PTR, (int)&c);
+ //uart_setreg(bas, TTY_DATA_LEN, 1);
+ //uart_setreg(bas, TTY_CMD, TTY_CMD_READ_BUFFER);
+ return c;
+}
+
+static int goldfish_bus_probe(struct uart_softc *sc);
+static int goldfish_bus_attach(struct uart_softc *sc);
+static int goldfish_bus_flush(struct uart_softc *, int);
+static int goldfish_bus_getsig(struct uart_softc *);
+static int goldfish_bus_ioctl(struct uart_softc *, int, intptr_t);
+static int goldfish_bus_ipend(struct uart_softc *);
+static int goldfish_bus_param(struct uart_softc *, int, int, int, int);
+static int goldfish_bus_receive(struct uart_softc *);
+static int goldfish_bus_setsig(struct uart_softc *, int);
+static int goldfish_bus_transmit(struct uart_softc *);
+
+static kobj_method_t goldfish_methods[] = {
+ KOBJMETHOD(uart_probe, goldfish_bus_probe),
+ KOBJMETHOD(uart_attach, goldfish_bus_attach),
+ KOBJMETHOD(uart_flush, goldfish_bus_flush),
+ KOBJMETHOD(uart_getsig, goldfish_bus_getsig),
+ KOBJMETHOD(uart_ioctl, goldfish_bus_ioctl),
+ KOBJMETHOD(uart_ipend, goldfish_bus_ipend),
+ KOBJMETHOD(uart_param, goldfish_bus_param),
+ KOBJMETHOD(uart_receive, goldfish_bus_receive),
+ KOBJMETHOD(uart_setsig, goldfish_bus_setsig),
+ KOBJMETHOD(uart_transmit, goldfish_bus_transmit),
- if (uart_softc)
- return (ENXIO);
+ {0, 0 }
+};
- sc->li_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
- if (!sc->li_res)
- return (ENXIO);
+int
+goldfish_bus_probe(struct uart_softc *sc)
+{
- sc->li_bst = rman_get_bustag(sc->li_res);
- sc->li_bsh = rman_get_bushandle(sc->li_res);
- uart_softc = sc;
+ sc->sc_txfifosz = 16;
+ sc->sc_rxfifosz = 16;
- uart_write_4(0, 'h');
- uart_write_4(0, 'e');
- uart_write_4(0, 'l');
- uart_write_4(0, 'l');
- uart_write_4(0, 'o');
- uart_write_4(0, '\n');
return (0);
}
-static device_method_t goldfish_guart_methods[] = {
- DEVMETHOD(device_probe, goldfish_guart_probe),
- DEVMETHOD(device_attach, goldfish_guart_attach),
- { 0, 0 }
-};
-
-static driver_t goldfish_guart_driver = {
- "guart",
- goldfish_guart_methods,
- sizeof(struct goldfish_guart_softc),
-};
-
-static devclass_t goldfish_guart_devclass;
+static int
+goldfish_bus_attach(struct uart_softc *sc)
+{
-//DRIVER_MODULE(guart, simplebus, goldfish_guart_driver, goldfish_guart_devclass, 0, 0);
-EARLY_DRIVER_MODULE(guart, fdtbus, goldfish_guart_driver,
- goldfish_guart_devclass, 0, 0, BUS_PASS_BUS);
-EARLY_DRIVER_MODULE(guart, simplebus, goldfish_guart_driver,
- goldfish_guart_devclass, 0, 0, BUS_PASS_BUS);
+ sc->sc_hwiflow = 0;
+ sc->sc_hwoflow = 0;
-static void
-uart_setreg(uint32_t reg, uint32_t val)
-{
- if (uart_softc)
- uart_write_4(reg, val);
+ return (0);
}
-static void
-ub_putc(unsigned char c)
+static int
+goldfish_bus_transmit(struct uart_softc *sc)
{
- if (c == '\n')
- ub_putc('\r');
+ int i;
- uart_setreg(TTY_PUT_CHAR, c);
-}
+ //uart_lock(sc->sc_hwmtx);
-static cn_probe_t uart_cnprobe;
-static cn_init_t uart_cninit;
-static cn_term_t uart_cnterm;
-static cn_getc_t uart_cngetc;
-static cn_putc_t uart_cnputc;
-static cn_grab_t uart_cngrab;
-static cn_ungrab_t uart_cnungrab;
+ for (i = 0; i < sc->sc_txdatasz; i++) {
+ goldfish_putc(&sc->sc_bas, sc->sc_txbuf[i]);
+ //uart_barrier(&sc->sc_bas);
+ }
+
+ //sc->sc_txbusy = 1;
+ //uart_unlock(sc->sc_hwmtx);
+
+ return (0);
+}
-void
-uart_cnputc(struct consdev *cp, int c)
+static int
+goldfish_bus_setsig(struct uart_softc *sc, int sig)
{
- ub_putc(c);
+
+ return (0);
}
-int
-uart_cngetc(struct consdev * cp)
+static int
+goldfish_bus_receive(struct uart_softc *sc)
{
- uint32_t bytes_in_buf = uart_read_4(TTY_BYTES_READY);
- if (bytes_in_buf) {
- char c = 0;
- uart_setreg(TTY_DATA_PTR, (uint32_t)&c);
- uart_setreg(TTY_DATA_LEN, 1);
- uart_setreg(TTY_CMD, TTY_CMD_READ_BUFFER);
- return c;
- }
- return 0;
+ return (0);
}
-static void
-uart_cngrab(struct consdev *cp)
+static int
+goldfish_bus_param(struct uart_softc *sc, int baudrate, int databits,
+ int stopbits, int parity)
{
+ return (0);
}
-static void
-uart_cnungrab(struct consdev *cp)
+static int
+goldfish_bus_ipend(struct uart_softc *sc)
{
+ return (0);
}
-static void
-uart_cnprobe(struct consdev *cp)
+static int
+goldfish_bus_flush(struct uart_softc *sc, int what)
{
- sprintf(cp->cn_name, "uart_goldfish");
- cp->cn_pri = CN_NORMAL;
+
+ return (0);
}
-static void
-uart_cninit(struct consdev *cp)
+static int
+goldfish_bus_getsig(struct uart_softc *sc)
{
+
+ return (0);
}
-static void
-uart_cnterm(struct consdev * cp)
+static int
+goldfish_bus_ioctl(struct uart_softc *sc, int request, intptr_t data)
{
+
+ return (EINVAL);
}
-CONSOLE_DRIVER(uart);
+struct uart_class uart_goldfish_class = {
+ "goldfish class",
+ goldfish_methods,
+ 1,
+ .uc_ops = &uart_goldfish_ops,
+ .uc_range = 8,
+ .uc_rclk = 0,
+};
Modified: soc2014/astarasikov/head/sys/dev/uart/uart.h
==============================================================================
--- soc2014/astarasikov/head/sys/dev/uart/uart.h Wed Aug 6 01:34:05 2014 (r271974)
+++ soc2014/astarasikov/head/sys/dev/uart/uart.h Wed Aug 6 01:35:07 2014 (r271975)
@@ -77,6 +77,7 @@
extern struct uart_class uart_ti8250_class __attribute__((weak));
extern struct uart_class uart_vybrid_class __attribute__((weak));
extern struct uart_class at91_usart_class __attribute__((weak));
+extern struct uart_class uart_goldfish_class __attribute__((weak));
#ifdef FDT
struct ofw_compat_data;
Modified: soc2014/astarasikov/head/sys/dev/uart/uart_bus_fdt.c
==============================================================================
--- soc2014/astarasikov/head/sys/dev/uart/uart_bus_fdt.c Wed Aug 6 01:34:05 2014 (r271974)
+++ soc2014/astarasikov/head/sys/dev/uart/uart_bus_fdt.c Wed Aug 6 01:35:07 2014 (r271975)
@@ -71,6 +71,7 @@
*/
static struct ofw_compat_data compat_data[] = {
{"arm,pl011", (uintptr_t)&uart_pl011_class},
+ {"arm,goldfish-uart", (uintptr_t)&uart_goldfish_class},
{"atmel,at91rm9200-usart",(uintptr_t)&at91_usart_class},
{"atmel,at91sam9260-usart",(uintptr_t)&at91_usart_class},
{"cadence,uart", (uintptr_t)&uart_cdnc_class},
Modified: soc2014/astarasikov/head/sys/dev/uart/uart_tty.c
==============================================================================
--- soc2014/astarasikov/head/sys/dev/uart/uart_tty.c Wed Aug 6 01:34:05 2014 (r271974)
+++ soc2014/astarasikov/head/sys/dev/uart/uart_tty.c Wed Aug 6 01:35:07 2014 (r271975)
@@ -133,7 +133,9 @@
static int
uart_cngetc(struct consdev *cp)
{
-
+ if (!cp || !cp->cn_arg) {
+ return 0;
+ }
return (uart_poll(cp->cn_arg));
}
More information about the svn-soc-all
mailing list