Remove terasic drivers used on the Cambridge BERI tablet.
Reviewed by: brooks Sponsored by: The University of Cambridge, Google Inc. Differential Revision: https://reviews.freebsd.org/D34057
This commit is contained in:
parent
6a2d75d248
commit
ac4643ef78
@ -52,6 +52,9 @@
|
||||
# xargs -n1 | sort | uniq -d;
|
||||
# done
|
||||
|
||||
# 20220127: terasic_mtl.4 removed
|
||||
OLD_FILES+=usr/share/man/man4/terasic_mtl.4.gz
|
||||
|
||||
# 20211229: libc++ moved to /lib
|
||||
MOVED_LIBS+=usr/lib/libc++.so.1
|
||||
|
||||
|
@ -546,7 +546,6 @@ MAN= aac.4 \
|
||||
tcp.4 \
|
||||
tcp_bbr.4 \
|
||||
tdfx.4 \
|
||||
terasic_mtl.4 \
|
||||
termios.4 \
|
||||
textdump.4 \
|
||||
ti.4 \
|
||||
|
@ -1,131 +0,0 @@
|
||||
.\"-
|
||||
.\" Copyright (c) 2012 Robert N. M. Watson
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" This software was developed by SRI International and the University of
|
||||
.\" Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
.\" ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd August 18, 2012
|
||||
.Dt TERASIC_MTL 4
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm terasic_mtl
|
||||
.Nd driver for the Terasic/Cambridge Multi-Touch LCD device
|
||||
.Sh SYNOPSIS
|
||||
.Cd "device terasic_mtl"
|
||||
.Pp
|
||||
In
|
||||
.Pa /boot/device.hints :
|
||||
.Cd hint.terasic_mtl.0.at="nexus0"
|
||||
.Cd hint.terasic_mtl.0.reg_maddr=0x70400000
|
||||
.Cd hint.terasic_mtl.0.reg_msize=0x1000
|
||||
.Cd hint.terasic_mtl.0.pixel_maddr=0x70000000
|
||||
.Cd hint.terasic_mtl.0.pixel_msize=0x177000
|
||||
.Cd hint.terasic_mtl.0.text_maddr=0x70177000
|
||||
.Cd hint.terasic_mtl.0.text_msize=0x2000
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
device driver provides support for the Terasic Multi-Touch LCD combined as
|
||||
controlled by a University of Cambridge's IP Core.
|
||||
Three device nodes are instantiated, representing various services supported
|
||||
by the device:
|
||||
.Bl -tag -width terasic_pixelX
|
||||
.It terasic_regX
|
||||
Memory-mapped register interface, including touch screen input.
|
||||
.It terasic_pixelX
|
||||
Memory-mapped pixel-oriented frame buffer.
|
||||
.It terasic_textX
|
||||
Memory-mapped text-oriented frame buffer.
|
||||
.El
|
||||
.Pp
|
||||
.Nm
|
||||
devices are also attached to the
|
||||
.Xr syscons 4
|
||||
framework, which implements a VT-compatible terminal connected to the
|
||||
.Xr tty 4
|
||||
framework.
|
||||
.Li ttyvX
|
||||
device nodes may be added to
|
||||
.Xr ttys 5
|
||||
in order to launch
|
||||
.Xr login 1
|
||||
sessions at boot.
|
||||
.Pp
|
||||
Register, text, and pixel devices may be accessed using
|
||||
.Xr read 2
|
||||
and
|
||||
.Xr write 2
|
||||
system calls, and also memory mapped using
|
||||
.Xr mmap 2 .
|
||||
.Sh SEE ALSO
|
||||
.Xr login 1 ,
|
||||
.Xr ioctl 2 ,
|
||||
.Xr mmap 2 ,
|
||||
.Xr poll 2 ,
|
||||
.Xr read 2 ,
|
||||
.Xr write 2 ,
|
||||
.Xr syscons 4 ,
|
||||
.Xr tty 4 ,
|
||||
.Xr ttys 5
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
device driver first appeared in
|
||||
.Fx 10.0 .
|
||||
.Sh AUTHORS
|
||||
The
|
||||
.Nm
|
||||
device driver and this manual page were
|
||||
developed by SRI International and the University of Cambridge Computer
|
||||
Laboratory under DARPA/AFRL contract
|
||||
.Pq FA8750-10-C-0237
|
||||
.Pq Do CTSRD Dc ,
|
||||
as part of the DARPA CRASH research programme.
|
||||
This device driver was written by
|
||||
.An Robert N. M. Watson .
|
||||
.Sh BUGS
|
||||
The
|
||||
.Xr syscons 4
|
||||
attachment does not support the hardware cursor feature.
|
||||
.Pp
|
||||
A more structured interface to control registers using the
|
||||
.Xr ioctl 2
|
||||
system call, would sometimes be preferable to memory mapping.
|
||||
For touch screen input, it would be highly desirable to offer a streaming
|
||||
interface whose events can be managed using
|
||||
.Xr poll 2
|
||||
and related system calls, with the kernel performing polling rather than the
|
||||
userspace application.
|
||||
.Pp
|
||||
.Nm
|
||||
supports only a
|
||||
.Li nexus
|
||||
bus attachment, which is appropriate for system-on-chip busses such as
|
||||
Altera's Avalon bus.
|
||||
If the IP core is configured off of another bus type, then additional bus
|
||||
attachments will be required.
|
@ -1,192 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#include <dev/led/led.h>
|
||||
#include <dev/terasic/de4led/terasic_de4led.h>
|
||||
|
||||
devclass_t terasic_de4led_devclass;
|
||||
|
||||
static void
|
||||
terasic_de4led_update(struct terasic_de4led_softc *sc)
|
||||
{
|
||||
|
||||
TERASIC_DE4LED_LOCK_ASSERT(sc);
|
||||
|
||||
bus_write_1(sc->tdl_res, TERASIC_DE4LED_OFF_LED, sc->tdl_bits);
|
||||
}
|
||||
|
||||
static void
|
||||
led_update(struct terasic_de4led_softc *sc, int bit, int onoff)
|
||||
{
|
||||
|
||||
TERASIC_DE4LED_LOCK(sc);
|
||||
TERASIC_DE4LED_SETLED(sc, bit, onoff);
|
||||
terasic_de4led_update(sc);
|
||||
TERASIC_DE4LED_UNLOCK(sc);
|
||||
}
|
||||
|
||||
static void
|
||||
led_0(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 0, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_1(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 1, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_2(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 2, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_3(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 3, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_4(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 4, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_5(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 5, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_6(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 6, onoff);
|
||||
}
|
||||
|
||||
static void
|
||||
led_7(void *arg, int onoff)
|
||||
{
|
||||
|
||||
led_update(arg, 7, onoff);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_de4led_attach(struct terasic_de4led_softc *sc)
|
||||
{
|
||||
const char *cmd;
|
||||
|
||||
TERASIC_DE4LED_LOCK_INIT(sc);
|
||||
|
||||
/*
|
||||
* Clear the LED array before we start.
|
||||
*/
|
||||
TERASIC_DE4LED_LOCK(sc);
|
||||
TERASIC_DE4LED_CLEARBAR(sc);
|
||||
terasic_de4led_update(sc);
|
||||
TERASIC_DE4LED_UNLOCK(sc);
|
||||
|
||||
/*
|
||||
* Register the LED array with led(4).
|
||||
*/
|
||||
sc->tdl_leds[0] = led_create(led_0, sc, "de4led_0");
|
||||
sc->tdl_leds[1] = led_create(led_1, sc, "de4led_1");
|
||||
sc->tdl_leds[2] = led_create(led_2, sc, "de4led_2");
|
||||
sc->tdl_leds[3] = led_create(led_3, sc, "de4led_3");
|
||||
sc->tdl_leds[4] = led_create(led_4, sc, "de4led_4");
|
||||
sc->tdl_leds[5] = led_create(led_5, sc, "de4led_5");
|
||||
sc->tdl_leds[6] = led_create(led_6, sc, "de4led_6");
|
||||
sc->tdl_leds[7] = led_create(led_7, sc, "de4led_7");
|
||||
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_0_cmd", &cmd) == 0)
|
||||
led_set("de4led_0", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_1_cmd", &cmd) == 0)
|
||||
led_set("de4led_1", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_2_cmd", &cmd) == 0)
|
||||
led_set("de4led_2", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_3_cmd", &cmd) == 0)
|
||||
led_set("de4led_3", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_4_cmd", &cmd) == 0)
|
||||
led_set("de4led_4", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_5_cmd", &cmd) == 0)
|
||||
led_set("de4led_5", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_6_cmd", &cmd) == 0)
|
||||
led_set("de4led_6", cmd);
|
||||
if (resource_string_value(device_get_name(sc->tdl_dev),
|
||||
sc->tdl_unit, "de4led_7_cmd", &cmd) == 0)
|
||||
led_set("de4led_7", cmd);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_de4led_detach(struct terasic_de4led_softc *sc)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
led_destroy(sc->tdl_leds[i]);
|
||||
sc->tdl_leds[i] = NULL;
|
||||
}
|
||||
TERASIC_DE4LED_LOCK(sc);
|
||||
TERASIC_DE4LED_CLEARBAR(sc);
|
||||
terasic_de4led_update(sc);
|
||||
TERASIC_DE4LED_UNLOCK(sc);
|
||||
TERASIC_DE4LED_LOCK_DESTROY(sc);
|
||||
}
|
@ -1,79 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _DEV_TERASIC_DE4LED_H_
|
||||
#define _DEV_TERASIC_DE4LED_H_
|
||||
|
||||
#define TERASIC_DE4LED_NUMLEDS 8
|
||||
struct terasic_de4led_softc {
|
||||
device_t tdl_dev;
|
||||
int tdl_unit;
|
||||
struct resource *tdl_res;
|
||||
int tdl_rid;
|
||||
struct mtx tdl_lock;
|
||||
uint8_t tdl_bits;
|
||||
struct cdev *tdl_leds[TERASIC_DE4LED_NUMLEDS];
|
||||
};
|
||||
|
||||
#define TERASIC_DE4LED_LOCK(sc) mtx_lock(&(sc)->tdl_lock)
|
||||
#define TERASIC_DE4LED_LOCK_ASSERT(sc) mtx_assert(&(sc)->tdl_lock, MA_OWNED)
|
||||
#define TERASIC_DE4LED_LOCK_DESTROY(sc) mtx_destroy(&(sc)->tdl_lock)
|
||||
#define TERASIC_DE4LED_LOCK_INIT(sc) mtx_init(&(sc)->tdl_lock, \
|
||||
"terasic_de4led", NULL, MTX_DEF)
|
||||
#define TERASIC_DE4LED_UNLOCK(sc) mtx_unlock(&(sc)->tdl_lock)
|
||||
|
||||
/*
|
||||
* Setting and clearing LEDs. tdl_bits is in the bit order preferred for I/O.
|
||||
* The LED elements are labelled 1..8 on the DE-4, so bit 0 is LED 1, and so
|
||||
* on.
|
||||
*/
|
||||
#define TERASIC_DE4LED_CLEARBAR(sc) do { \
|
||||
(sc)->tdl_bits = 0; \
|
||||
} while (0)
|
||||
#define TERASIC_DE4LED_SETLED(sc, led, onoff) do { \
|
||||
(sc)->tdl_bits &= ~(1 << (led)); \
|
||||
(sc)->tdl_bits |= ((onoff != 0) ? 1 : 0) << (led); \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Only one offset matters for this device -- 0.
|
||||
*/
|
||||
#define TERASIC_DE4LED_OFF_LED 0
|
||||
|
||||
void terasic_de4led_attach(struct terasic_de4led_softc *sc);
|
||||
void terasic_de4led_detach(struct terasic_de4led_softc *sc);
|
||||
|
||||
extern devclass_t terasic_de4led_devclass;
|
||||
|
||||
#endif /* _DEV_TERASIC_DE4LED_H_ */
|
@ -1,123 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/bio.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#include <dev/fdt/fdt_common.h>
|
||||
#include <dev/ofw/openfirm.h>
|
||||
#include <dev/ofw/ofw_bus.h>
|
||||
#include <dev/ofw/ofw_bus_subr.h>
|
||||
|
||||
#include <dev/terasic/de4led/terasic_de4led.h>
|
||||
|
||||
/*
|
||||
* Nexus bus attachment for the 8-element LED on the Terasic DE-4 FPGA board,
|
||||
* which is hooked up to the processor via a memory-mapped Avalon bus.
|
||||
*/
|
||||
static int
|
||||
terasic_de4led_fdt_probe(device_t dev)
|
||||
{
|
||||
|
||||
if (!ofw_bus_status_okay(dev))
|
||||
return (ENXIO);
|
||||
|
||||
if (ofw_bus_is_compatible(dev, "sri-cambridge,de4led")) {
|
||||
device_set_desc(dev, "Terasic DE4 8-element LED");
|
||||
return (BUS_PROBE_DEFAULT);
|
||||
}
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_de4led_fdt_attach(device_t dev)
|
||||
{
|
||||
struct terasic_de4led_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->tdl_dev = dev;
|
||||
sc->tdl_unit = device_get_unit(dev);
|
||||
sc->tdl_rid = 0;
|
||||
sc->tdl_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&sc->tdl_rid, RF_ACTIVE);
|
||||
if (sc->tdl_res == NULL) {
|
||||
device_printf(dev, "couldn't map memory\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
terasic_de4led_attach(sc);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_de4led_fdt_detach(device_t dev)
|
||||
{
|
||||
struct terasic_de4led_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
KASSERT(sc->tdl_res != NULL, ("%s: resources not allocated",
|
||||
__func__));
|
||||
terasic_de4led_detach(sc);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->tdl_rid, sc->tdl_res);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static device_method_t terasic_de4led_fdt_methods[] = {
|
||||
DEVMETHOD(device_probe, terasic_de4led_fdt_probe),
|
||||
DEVMETHOD(device_attach, terasic_de4led_fdt_attach),
|
||||
DEVMETHOD(device_detach, terasic_de4led_fdt_detach),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t terasic_de4led_fdt_driver = {
|
||||
"terasic_de4led",
|
||||
terasic_de4led_fdt_methods,
|
||||
sizeof(struct terasic_de4led_softc),
|
||||
};
|
||||
|
||||
DRIVER_MODULE(terasic_de4led, simplebus, terasic_de4led_fdt_driver,
|
||||
terasic_de4led_devclass, 0, 0);
|
@ -1,112 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/bio.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#include <dev/terasic/de4led/terasic_de4led.h>
|
||||
|
||||
/*
|
||||
* Nexus bus attachment for the 8-element LED on the Terasic DE-4 FPGA board,
|
||||
* which is hooked up to the processor via a memory-mapped Avalon bus.
|
||||
*/
|
||||
static int
|
||||
terasic_de4led_nexus_probe(device_t dev)
|
||||
{
|
||||
|
||||
device_set_desc(dev, "Terasic DE4 8-element LED");
|
||||
return (BUS_PROBE_NOWILDCARD);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_de4led_nexus_attach(device_t dev)
|
||||
{
|
||||
struct terasic_de4led_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->tdl_dev = dev;
|
||||
sc->tdl_unit = device_get_unit(dev);
|
||||
sc->tdl_rid = 0;
|
||||
sc->tdl_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&sc->tdl_rid, RF_ACTIVE);
|
||||
if (sc->tdl_res == NULL) {
|
||||
device_printf(dev, "couldn't map memory\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
terasic_de4led_attach(sc);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_de4led_nexus_detach(device_t dev)
|
||||
{
|
||||
struct terasic_de4led_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
KASSERT(sc->tdl_res != NULL, ("%s: resources not allocated",
|
||||
__func__));
|
||||
terasic_de4led_detach(sc);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->tdl_rid, sc->tdl_res);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static device_method_t terasic_de4led_nexus_methods[] = {
|
||||
DEVMETHOD(device_probe, terasic_de4led_nexus_probe),
|
||||
DEVMETHOD(device_attach, terasic_de4led_nexus_attach),
|
||||
DEVMETHOD(device_detach, terasic_de4led_nexus_detach),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t terasic_de4led_nexus_driver = {
|
||||
"terasic_de4led",
|
||||
terasic_de4led_nexus_methods,
|
||||
sizeof(struct terasic_de4led_softc),
|
||||
};
|
||||
|
||||
DRIVER_MODULE(terasic_de4led, nexus, terasic_de4led_nexus_driver,
|
||||
terasic_de4led_devclass, 0, 0);
|
@ -1,134 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_syscons.h"
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h> /* struct vt_mode */
|
||||
#include <sys/endian.h>
|
||||
#include <sys/fbio.h> /* video_adapter_t */
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
/*
|
||||
* Device driver for the Terasic Multitouch LCD (MTL). Three separate
|
||||
* sub-drivers that support, respectively, access to device control registers,
|
||||
* the pixel frame buffer, and the text frame buffer. The pixel frame buffer
|
||||
* is hooked up to vt(4), and the text frame buffer to syscons(4).
|
||||
*
|
||||
* Eventually, the frame buffer control registers and touch screen input FIFO
|
||||
* will end up being separate sub-drivers as well.
|
||||
*
|
||||
* Note: sub-driver detach routines must check whether or not they have
|
||||
* attached as they may be called even if the attach routine hasn't been, on
|
||||
* an error.
|
||||
*/
|
||||
|
||||
devclass_t terasic_mtl_devclass;
|
||||
|
||||
int
|
||||
terasic_mtl_attach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = terasic_mtl_reg_attach(sc);
|
||||
if (error)
|
||||
goto error;
|
||||
error = terasic_mtl_pixel_attach(sc);
|
||||
if (error)
|
||||
goto error;
|
||||
error = terasic_mtl_text_attach(sc);
|
||||
if (error)
|
||||
goto error;
|
||||
/*
|
||||
* XXXRW: Once we've attached syscons or vt, we can't detach it, so do
|
||||
* it last.
|
||||
*/
|
||||
#if defined(DEV_VT)
|
||||
terasic_mtl_reg_pixel_endian_set(sc, BYTE_ORDER == BIG_ENDIAN);
|
||||
error = terasic_mtl_fbd_attach(sc);
|
||||
if (error)
|
||||
goto error;
|
||||
terasic_mtl_blend_pixel_set(sc, TERASIC_MTL_ALPHA_OPAQUE);
|
||||
terasic_mtl_blend_textfg_set(sc, TERASIC_MTL_ALPHA_TRANSPARENT);
|
||||
terasic_mtl_blend_textbg_set(sc, TERASIC_MTL_ALPHA_TRANSPARENT);
|
||||
#endif
|
||||
#if defined(DEV_SC)
|
||||
error = terasic_mtl_syscons_attach(sc);
|
||||
if (error)
|
||||
goto error;
|
||||
terasic_mtl_blend_pixel_set(sc, TERASIC_MTL_ALPHA_TRANSPARENT);
|
||||
terasic_mtl_blend_textfg_set(sc, TERASIC_MTL_ALPHA_OPAQUE);
|
||||
terasic_mtl_blend_textbg_set(sc, TERASIC_MTL_ALPHA_OPAQUE);
|
||||
#endif
|
||||
terasic_mtl_blend_default_set(sc, TERASIC_MTL_COLOR_BLACK);
|
||||
return (0);
|
||||
error:
|
||||
terasic_mtl_text_detach(sc);
|
||||
terasic_mtl_pixel_detach(sc);
|
||||
terasic_mtl_reg_detach(sc);
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_detach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
/* XXXRW: syscons and vt can't detach, but try anyway, only to panic. */
|
||||
#if defined(DEV_SC)
|
||||
terasic_mtl_syscons_detach(sc);
|
||||
#endif
|
||||
#if defined(DEV_VT)
|
||||
terasic_mtl_fbd_detach(sc);
|
||||
#endif
|
||||
|
||||
/* All other aspects of the driver can detach just fine. */
|
||||
terasic_mtl_text_detach(sc);
|
||||
terasic_mtl_pixel_detach(sc);
|
||||
terasic_mtl_reg_detach(sc);
|
||||
}
|
@ -1,235 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD$
|
||||
*/
|
||||
|
||||
#ifndef _DEV_TERASIC_MTL_H_
|
||||
#define _DEV_TERASIC_MTL_H_
|
||||
|
||||
#include "opt_syscons.h"
|
||||
|
||||
struct terasic_mtl_softc {
|
||||
#if defined(DEV_SC)
|
||||
/*
|
||||
* syscons requires that its video_adapter_t be at the front of the
|
||||
* softc, so place syscons fields first, which we otherwise would
|
||||
* probably not do.
|
||||
*/
|
||||
video_adapter_t mtl_va;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Bus-related fields.
|
||||
*/
|
||||
device_t mtl_dev;
|
||||
int mtl_unit;
|
||||
|
||||
/*
|
||||
* The MTL driver doesn't require a lot of synchronisation; however,
|
||||
* the lock is used to protect read-modify-write operations on MTL
|
||||
* registers.
|
||||
*/
|
||||
struct mtx mtl_lock;
|
||||
|
||||
/*
|
||||
* Control register device -- mappable from userspace.
|
||||
*/
|
||||
struct cdev *mtl_reg_cdev;
|
||||
struct resource *mtl_reg_res;
|
||||
int mtl_reg_rid;
|
||||
|
||||
/*
|
||||
* Graphics frame buffer device -- mappable from userspace, and used
|
||||
* by the vt framebuffer interface.
|
||||
*/
|
||||
struct cdev *mtl_pixel_cdev;
|
||||
struct resource *mtl_pixel_res;
|
||||
int mtl_pixel_rid;
|
||||
|
||||
/*
|
||||
* Text frame buffer device -- mappable from userspace, and syscons
|
||||
* hookup.
|
||||
*/
|
||||
struct cdev *mtl_text_cdev;
|
||||
struct resource *mtl_text_res;
|
||||
int mtl_text_rid;
|
||||
uint16_t *mtl_text_soft;
|
||||
|
||||
/*
|
||||
* Framebuffer hookup for vt(4).
|
||||
*/
|
||||
struct fb_info mtl_fb_info;
|
||||
};
|
||||
|
||||
#define TERASIC_MTL_LOCK(sc) mtx_lock(&(sc)->mtl_lock)
|
||||
#define TERASIC_MTL_LOCK_ASSERT(sc) mtx_assert(&(sc)->mtl_lock, MA_OWNED)
|
||||
#define TERASIC_MTL_LOCK_DESTROY(sc) mtx_destroy(&(sc)->mtl_lock)
|
||||
#define TERASIC_MTL_LOCK_INIT(sc) mtx_init(&(sc)->mtl_lock, \
|
||||
"terasic_mtl", NULL, MTX_DEF)
|
||||
#define TERASIC_MTL_UNLOCK(sc) mtx_unlock(&(sc)->mtl_lock)
|
||||
|
||||
/*
|
||||
* Constant properties of the MTL text frame buffer.
|
||||
*/
|
||||
#define TERASIC_MTL_COLS 100
|
||||
#define TERASIC_MTL_ROWS 40
|
||||
|
||||
/*
|
||||
* MTL control register offsets.
|
||||
*/
|
||||
#define TERASIC_MTL_OFF_BLEND 0
|
||||
#define TERASIC_MTL_OFF_TEXTCURSOR 4
|
||||
#define TERASIC_MTL_OFF_TEXTFRAMEBUFADDR 8
|
||||
#define TERASIC_MTL_OFF_TOUCHPOINT_X1 12
|
||||
#define TERASIC_MTL_OFF_TOUCHPOINT_Y1 16
|
||||
#define TERASIC_MTL_OFF_TOUCHPOINT_X2 20
|
||||
#define TERASIC_MTL_OFF_TOUCHPOINT_Y2 24
|
||||
#define TERASIC_MTL_OFF_TOUCHGESTURE 28
|
||||
|
||||
/*
|
||||
* Constants to help interpret various control registers.
|
||||
*/
|
||||
#define TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP 0x10000000
|
||||
#define TERASIC_MTL_BLEND_DEFAULT_MASK 0x0f000000
|
||||
#define TERASIC_MTL_BLEND_DEFAULT_SHIFT 24
|
||||
#define TERASIC_MTL_BLEND_PIXEL_MASK 0x00ff0000
|
||||
#define TERASIC_MTL_BLEND_PIXEL_SHIFT 16
|
||||
#define TERASIC_MTL_BLEND_TEXTFG_MASK 0x0000ff00
|
||||
#define TERASIC_MTL_BLEND_TEXTFG_SHIFT 8
|
||||
#define TERASIC_MTL_BLEND_TEXTBG_MASK 0x000000ff
|
||||
#define TERASIC_MTL_BLEND_TEXTBG_SHIFT 0
|
||||
#define TERASIC_MTL_TEXTCURSOR_COL_MASK 0xff00
|
||||
#define TERASIC_MTL_TEXTCURSOR_COL_SHIFT 8
|
||||
#define TERASIC_MTL_TEXTCURSOR_ROW_MASK 0xff
|
||||
|
||||
/*
|
||||
* Colours used both by VGA-like text rendering, and for the default display
|
||||
* colour.
|
||||
*/
|
||||
#define TERASIC_MTL_COLOR_BLACK 0
|
||||
#define TERASIC_MTL_COLOR_DARKBLUE 1
|
||||
#define TERASIC_MTL_COLOR_DARKGREEN 2
|
||||
#define TERASIC_MTL_COLOR_DARKCYAN 3
|
||||
#define TERASIC_MTL_COLOR_DARKRED 4
|
||||
#define TERASIC_MTL_COLOR_DARKMAGENTA 5
|
||||
#define TERASIC_MTL_COLOR_BROWN 6
|
||||
#define TERASIC_MTL_COLOR_LIGHTGREY 7
|
||||
#define TERASIC_MTL_COLOR_DARKGREY 8
|
||||
#define TERASIC_MTL_COLOR_LIGHTBLUE 9
|
||||
#define TERASIC_MTL_COLOR_LIGHTGREEN 10
|
||||
#define TERASIC_MTL_COLOR_LIGHTCYAN 11
|
||||
#define TERASIC_MTL_COLOR_LIGHTRED 12
|
||||
#define TERASIC_MTL_COLOR_LIGHTMAGENTA 13
|
||||
#define TERASIC_MTL_COLOR_LIGHTYELLOW 14
|
||||
#define TERASIC_MTL_COLOR_WHITE 15
|
||||
#define TERASIC_MTL_COLORMASK_BLINK 0x80
|
||||
|
||||
/*
|
||||
* Constants to help interpret the text frame buffer.
|
||||
*/
|
||||
#define TERASIC_MTL_TEXTFRAMEBUF_EXPECTED_ADDR 0x0177000
|
||||
#define TERASIC_MTL_TEXTFRAMEBUF_CHAR_SHIFT 0
|
||||
#define TERASIC_MTL_TEXTFRAMEBUF_ATTR_SHIFT 8
|
||||
|
||||
/*
|
||||
* Framebuffer constants.
|
||||
*/
|
||||
#define TERASIC_MTL_FB_WIDTH 800
|
||||
#define TERASIC_MTL_FB_HEIGHT 640
|
||||
|
||||
/*
|
||||
* Alpha-blending constants.
|
||||
*/
|
||||
#define TERASIC_MTL_ALPHA_TRANSPARENT 0
|
||||
#define TERASIC_MTL_ALPHA_OPAQUE 255
|
||||
|
||||
/*
|
||||
* Driver setup routines from the bus attachment/teardown.
|
||||
*/
|
||||
int terasic_mtl_attach(struct terasic_mtl_softc *sc);
|
||||
void terasic_mtl_detach(struct terasic_mtl_softc *sc);
|
||||
|
||||
extern devclass_t terasic_mtl_devclass;
|
||||
|
||||
/*
|
||||
* Sub-driver setup routines.
|
||||
*/
|
||||
int terasic_mtl_fbd_attach(struct terasic_mtl_softc *sc);
|
||||
void terasic_mtl_fbd_detach(struct terasic_mtl_softc *sc);
|
||||
int terasic_mtl_pixel_attach(struct terasic_mtl_softc *sc);
|
||||
void terasic_mtl_pixel_detach(struct terasic_mtl_softc *sc);
|
||||
int terasic_mtl_reg_attach(struct terasic_mtl_softc *sc);
|
||||
void terasic_mtl_reg_detach(struct terasic_mtl_softc *sc);
|
||||
int terasic_mtl_syscons_attach(struct terasic_mtl_softc *sc);
|
||||
void terasic_mtl_syscons_detach(struct terasic_mtl_softc *sc);
|
||||
int terasic_mtl_text_attach(struct terasic_mtl_softc *sc);
|
||||
void terasic_mtl_text_detach(struct terasic_mtl_softc *sc);
|
||||
|
||||
/*
|
||||
* Control register I/O routines.
|
||||
*/
|
||||
void terasic_mtl_reg_blank(struct terasic_mtl_softc *sc);
|
||||
|
||||
void terasic_mtl_reg_blend_get(struct terasic_mtl_softc *sc,
|
||||
uint32_t *blendp);
|
||||
void terasic_mtl_reg_blend_set(struct terasic_mtl_softc *sc,
|
||||
uint32_t blend);
|
||||
void terasic_mtl_reg_textcursor_get(struct terasic_mtl_softc *sc,
|
||||
uint8_t *colp, uint8_t *rowp);
|
||||
void terasic_mtl_reg_textcursor_set(struct terasic_mtl_softc *sc,
|
||||
uint8_t col, uint8_t row);
|
||||
void terasic_mtl_reg_textframebufaddr_get(struct terasic_mtl_softc *sc,
|
||||
uint32_t *addrp);
|
||||
void terasic_mtl_reg_textframebufaddr_set(struct terasic_mtl_softc *sc,
|
||||
uint32_t addr);
|
||||
|
||||
/*
|
||||
* Read-modify-write updates of sub-bytes of the blend register.
|
||||
*/
|
||||
void terasic_mtl_blend_default_set(struct terasic_mtl_softc *sc,
|
||||
uint8_t colour);
|
||||
void terasic_mtl_blend_pixel_set(struct terasic_mtl_softc *sc,
|
||||
uint8_t alpha);
|
||||
void terasic_mtl_blend_textfg_set(struct terasic_mtl_softc *sc,
|
||||
uint8_t alpha);
|
||||
void terasic_mtl_blend_textbg_set(struct terasic_mtl_softc *sc,
|
||||
uint8_t alpha);
|
||||
void terasic_mtl_reg_pixel_endian_set(struct terasic_mtl_softc *sc,
|
||||
int endian_swap);
|
||||
|
||||
/*
|
||||
* Text frame buffer I/O routines.
|
||||
*/
|
||||
void terasic_mtl_text_putc(struct terasic_mtl_softc *sc, u_int x, u_int y,
|
||||
uint8_t c, uint8_t a);
|
||||
|
||||
#endif /* _DEV_TERASIC_MTL_H_ */
|
@ -1,217 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012-2013 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h> /* struct vt_mode */
|
||||
#include <sys/fbio.h> /* video_adapter_t */
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#include <dev/fdt/fdt_common.h>
|
||||
#include <dev/ofw/openfirm.h>
|
||||
#include <dev/ofw/ofw_bus.h>
|
||||
#include <dev/ofw/ofw_bus_subr.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
#include "fb_if.h"
|
||||
|
||||
static int
|
||||
terasic_mtl_fdt_probe(device_t dev)
|
||||
{
|
||||
|
||||
if (!ofw_bus_status_okay(dev))
|
||||
return (ENXIO);
|
||||
|
||||
if (ofw_bus_is_compatible(dev, "sri-cambridge,mtl")) {
|
||||
device_set_desc(dev, "Terasic Multi-touch LCD (MTL)");
|
||||
return (BUS_PROBE_DEFAULT);
|
||||
}
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_fdt_attach(device_t dev)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
int error;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->mtl_dev = dev;
|
||||
sc->mtl_unit = device_get_unit(dev);
|
||||
|
||||
/*
|
||||
* FDT allows multiple memory resources to be defined for a device;
|
||||
* query them in the order registers, pixel buffer, text buffer.
|
||||
* However, we need to sanity-check that they are page-aligned and
|
||||
* page-sized, so we may still abort.
|
||||
*/
|
||||
sc->mtl_reg_rid = 0;
|
||||
sc->mtl_reg_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&sc->mtl_reg_rid, RF_ACTIVE);
|
||||
if (sc->mtl_reg_res == NULL) {
|
||||
device_printf(dev, "couldn't map register memory\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
if (rman_get_start(sc->mtl_reg_res) % PAGE_SIZE != 0) {
|
||||
device_printf(dev, "improper register address\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
if (rman_get_size(sc->mtl_reg_res) % PAGE_SIZE != 0) {
|
||||
device_printf(dev, "improper register size\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
device_printf(sc->mtl_dev, "registers at mem %p-%p\n",
|
||||
(void *)rman_get_start(sc->mtl_reg_res),
|
||||
(void *)(rman_get_start(sc->mtl_reg_res) +
|
||||
rman_get_size(sc->mtl_reg_res)));
|
||||
|
||||
sc->mtl_pixel_rid = 1;
|
||||
sc->mtl_pixel_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&sc->mtl_pixel_rid, RF_ACTIVE);
|
||||
if (sc->mtl_pixel_res == NULL) {
|
||||
device_printf(dev, "couldn't map pixel memory\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
if (rman_get_start(sc->mtl_pixel_res) % PAGE_SIZE != 0) {
|
||||
device_printf(dev, "improper pixel address\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
if (rman_get_size(sc->mtl_pixel_res) % PAGE_SIZE != 0) {
|
||||
device_printf(dev, "improper pixel size\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
device_printf(sc->mtl_dev, "pixel frame buffer at mem %p-%p\n",
|
||||
(void *)rman_get_start(sc->mtl_pixel_res),
|
||||
(void *)(rman_get_start(sc->mtl_pixel_res) +
|
||||
rman_get_size(sc->mtl_pixel_res)));
|
||||
|
||||
sc->mtl_text_rid = 2;
|
||||
sc->mtl_text_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&sc->mtl_text_rid, RF_ACTIVE);
|
||||
if (sc->mtl_text_res == NULL) {
|
||||
device_printf(dev, "couldn't map text memory\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
if (rman_get_start(sc->mtl_text_res) % PAGE_SIZE != 0) {
|
||||
device_printf(dev, "improper text address\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
if (rman_get_size(sc->mtl_text_res) % PAGE_SIZE != 0) {
|
||||
device_printf(dev, "improper text size\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
device_printf(sc->mtl_dev, "text frame buffer at mem %p-%p\n",
|
||||
(void *)rman_get_start(sc->mtl_text_res),
|
||||
(void *)(rman_get_start(sc->mtl_text_res) +
|
||||
rman_get_size(sc->mtl_text_res)));
|
||||
|
||||
error = terasic_mtl_attach(sc);
|
||||
if (error == 0)
|
||||
return (0);
|
||||
error:
|
||||
if (sc->mtl_text_res != NULL)
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_text_rid,
|
||||
sc->mtl_text_res);
|
||||
if (sc->mtl_pixel_res != NULL)
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_pixel_rid,
|
||||
sc->mtl_pixel_res);
|
||||
if (sc->mtl_reg_res != NULL)
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_reg_rid,
|
||||
sc->mtl_reg_res);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_fdt_detach(device_t dev)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
terasic_mtl_detach(sc);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_text_rid,
|
||||
sc->mtl_text_res);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_pixel_rid,
|
||||
sc->mtl_pixel_res);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_reg_rid,
|
||||
sc->mtl_reg_res);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static struct fb_info *
|
||||
terasic_mtl_fb_getinfo(device_t dev)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
return (&sc->mtl_fb_info);
|
||||
}
|
||||
|
||||
static device_method_t terasic_mtl_fdt_methods[] = {
|
||||
DEVMETHOD(device_probe, terasic_mtl_fdt_probe),
|
||||
DEVMETHOD(device_attach, terasic_mtl_fdt_attach),
|
||||
DEVMETHOD(device_detach, terasic_mtl_fdt_detach),
|
||||
DEVMETHOD(fb_getinfo, terasic_mtl_fb_getinfo),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t terasic_mtl_fdt_driver = {
|
||||
"terasic_mtl",
|
||||
terasic_mtl_fdt_methods,
|
||||
sizeof(struct terasic_mtl_softc),
|
||||
};
|
||||
|
||||
DRIVER_MODULE(mtl, simplebus, terasic_mtl_fdt_driver, terasic_mtl_devclass, 0,
|
||||
0);
|
@ -1,208 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h> /* struct vt_mode */
|
||||
#include <sys/fbio.h> /* video_adapter_t */
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
#include "fb_if.h"
|
||||
|
||||
static int
|
||||
terasic_mtl_nexus_probe(device_t dev)
|
||||
{
|
||||
|
||||
device_set_desc(dev, "Terasic Multi-touch LCD (MTL)");
|
||||
return (BUS_PROBE_NOWILDCARD);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_nexus_attach(device_t dev)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long pixel_maddr, text_maddr, reg_maddr;
|
||||
u_long pixel_msize, text_msize, reg_msize;
|
||||
int error;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
sc->mtl_dev = dev;
|
||||
sc->mtl_unit = device_get_unit(dev);
|
||||
|
||||
/*
|
||||
* Query non-standard hints to find the locations of our two memory
|
||||
* regions. Enforce certain alignment and size requirements.
|
||||
*/
|
||||
if (resource_long_value(device_get_name(dev), device_get_unit(dev),
|
||||
"reg_maddr", ®_maddr) != 0 || (reg_maddr % PAGE_SIZE != 0)) {
|
||||
device_printf(dev, "improper register address\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
if (resource_long_value(device_get_name(dev), device_get_unit(dev),
|
||||
"reg_msize", ®_msize) != 0 || (reg_msize % PAGE_SIZE != 0)) {
|
||||
device_printf(dev, "improper register size\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
if (resource_long_value(device_get_name(dev), device_get_unit(dev),
|
||||
"pixel_maddr", &pixel_maddr) != 0 ||
|
||||
(pixel_maddr % PAGE_SIZE != 0)) {
|
||||
device_printf(dev, "improper pixel frame buffer address\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
if (resource_long_value(device_get_name(dev), device_get_unit(dev),
|
||||
"pixel_msize", &pixel_msize) != 0 ||
|
||||
(pixel_msize % PAGE_SIZE != 0)) {
|
||||
device_printf(dev, "improper pixel frame buffer size\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
if (resource_long_value(device_get_name(dev), device_get_unit(dev),
|
||||
"text_maddr", &text_maddr) != 0 ||
|
||||
(text_maddr % PAGE_SIZE != 0)) {
|
||||
device_printf(dev, "improper text frame buffer address\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
if (resource_long_value(device_get_name(dev), device_get_unit(dev),
|
||||
"text_msize", &text_msize) != 0 ||
|
||||
(text_msize % PAGE_SIZE != 0)) {
|
||||
device_printf(dev, "improper text frame buffer size\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate resources.
|
||||
*/
|
||||
sc->mtl_reg_rid = 0;
|
||||
sc->mtl_reg_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
|
||||
&sc->mtl_reg_rid, reg_maddr, reg_maddr + reg_msize - 1,
|
||||
reg_msize, RF_ACTIVE);
|
||||
if (sc->mtl_reg_res == NULL) {
|
||||
device_printf(dev, "couldn't map register memory\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
device_printf(sc->mtl_dev, "registers at mem %p-%p\n",
|
||||
(void *)reg_maddr, (void *)(reg_maddr + reg_msize));
|
||||
sc->mtl_pixel_rid = 0;
|
||||
sc->mtl_pixel_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
|
||||
&sc->mtl_pixel_rid, pixel_maddr, pixel_maddr + pixel_msize - 1,
|
||||
pixel_msize, RF_ACTIVE);
|
||||
if (sc->mtl_pixel_res == NULL) {
|
||||
device_printf(dev, "couldn't map pixel memory\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
device_printf(sc->mtl_dev, "pixel frame buffer at mem %p-%p\n",
|
||||
(void *)pixel_maddr, (void *)(pixel_maddr + pixel_msize));
|
||||
sc->mtl_text_rid = 0;
|
||||
sc->mtl_text_res = bus_alloc_resource(dev, SYS_RES_MEMORY,
|
||||
&sc->mtl_text_rid, text_maddr, text_maddr + text_msize - 1,
|
||||
text_msize, RF_ACTIVE);
|
||||
if (sc->mtl_text_res == NULL) {
|
||||
device_printf(dev, "couldn't map text memory\n");
|
||||
error = ENXIO;
|
||||
goto error;
|
||||
}
|
||||
device_printf(sc->mtl_dev, "text frame buffer at mem %p-%p\n",
|
||||
(void *)text_maddr, (void *)(text_maddr + text_msize));
|
||||
error = terasic_mtl_attach(sc);
|
||||
if (error == 0)
|
||||
return (0);
|
||||
error:
|
||||
if (sc->mtl_text_res != NULL)
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_text_rid,
|
||||
sc->mtl_text_res);
|
||||
if (sc->mtl_pixel_res != NULL)
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_pixel_rid,
|
||||
sc->mtl_pixel_res);
|
||||
if (sc->mtl_reg_res != NULL)
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_reg_rid,
|
||||
sc->mtl_reg_res);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_nexus_detach(device_t dev)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
terasic_mtl_detach(sc);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_text_rid,
|
||||
sc->mtl_text_res);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_pixel_rid,
|
||||
sc->mtl_pixel_res);
|
||||
bus_release_resource(dev, SYS_RES_MEMORY, sc->mtl_reg_rid,
|
||||
sc->mtl_reg_res);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static struct fb_info *
|
||||
terasic_mtl_fb_getinfo(device_t dev)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = device_get_softc(dev);
|
||||
return (&sc->mtl_fb_info);
|
||||
}
|
||||
|
||||
static device_method_t terasic_mtl_nexus_methods[] = {
|
||||
DEVMETHOD(device_probe, terasic_mtl_nexus_probe),
|
||||
DEVMETHOD(device_attach, terasic_mtl_nexus_attach),
|
||||
DEVMETHOD(device_detach, terasic_mtl_nexus_detach),
|
||||
DEVMETHOD(fb_getinfo, terasic_mtl_fb_getinfo),
|
||||
{ 0, 0 }
|
||||
};
|
||||
|
||||
static driver_t terasic_mtl_nexus_driver = {
|
||||
"terasic_mtl",
|
||||
terasic_mtl_nexus_methods,
|
||||
sizeof(struct terasic_mtl_softc),
|
||||
};
|
||||
|
||||
DRIVER_MODULE(mtl, nexus, terasic_mtl_nexus_driver, terasic_mtl_devclass, 0,
|
||||
0);
|
@ -1,161 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h> /* struct vt_mode */
|
||||
#include <sys/fbio.h> /* video_adapter_t */
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <machine/vm.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
static d_mmap_t terasic_mtl_pixel_mmap;
|
||||
static d_read_t terasic_mtl_pixel_read;
|
||||
static d_write_t terasic_mtl_pixel_write;
|
||||
|
||||
static struct cdevsw mtl_pixel_cdevsw = {
|
||||
.d_version = D_VERSION,
|
||||
.d_mmap = terasic_mtl_pixel_mmap,
|
||||
.d_read = terasic_mtl_pixel_read,
|
||||
.d_write = terasic_mtl_pixel_write,
|
||||
.d_name = "terasic_mtl_pixel",
|
||||
};
|
||||
|
||||
/*
|
||||
* All I/O to/from the MTL pixel device must be 32-bit, and aligned to 32-bit.
|
||||
*/
|
||||
static int
|
||||
terasic_mtl_pixel_read(struct cdev *dev, struct uio *uio, int flag)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long offset, size;
|
||||
uint32_t v;
|
||||
int error;
|
||||
|
||||
if (uio->uio_offset < 0 || uio->uio_offset % 4 != 0 ||
|
||||
uio->uio_resid % 4 != 0)
|
||||
return (ENODEV);
|
||||
sc = dev->si_drv1;
|
||||
size = rman_get_size(sc->mtl_pixel_res);
|
||||
error = 0;
|
||||
if ((uio->uio_offset + uio->uio_resid < 0) ||
|
||||
(uio->uio_offset + uio->uio_resid > size))
|
||||
return (ENODEV);
|
||||
while (uio->uio_resid > 0) {
|
||||
offset = uio->uio_offset;
|
||||
if (offset + sizeof(v) > size)
|
||||
return (ENODEV);
|
||||
v = bus_read_4(sc->mtl_pixel_res, offset);
|
||||
error = uiomove(&v, sizeof(v), uio);
|
||||
if (error)
|
||||
return (error);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_pixel_write(struct cdev *dev, struct uio *uio, int flag)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long offset, size;
|
||||
uint32_t v;
|
||||
int error;
|
||||
|
||||
if (uio->uio_offset < 0 || uio->uio_offset % 4 != 0 ||
|
||||
uio->uio_resid % 4 != 0)
|
||||
return (ENODEV);
|
||||
sc = dev->si_drv1;
|
||||
size = rman_get_size(sc->mtl_pixel_res);
|
||||
error = 0;
|
||||
while (uio->uio_resid > 0) {
|
||||
offset = uio->uio_offset;
|
||||
if (offset + sizeof(v) > size)
|
||||
return (ENODEV);
|
||||
error = uiomove(&v, sizeof(v), uio);
|
||||
if (error)
|
||||
return (error);
|
||||
bus_write_4(sc->mtl_pixel_res, offset, v);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_pixel_mmap(struct cdev *dev, vm_ooffset_t offset,
|
||||
vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
int error;
|
||||
|
||||
sc = dev->si_drv1;
|
||||
error = 0;
|
||||
if (trunc_page(offset) == offset &&
|
||||
rman_get_size(sc->mtl_pixel_res) >= offset + PAGE_SIZE) {
|
||||
*paddr = rman_get_start(sc->mtl_pixel_res) + offset;
|
||||
*memattr = VM_MEMATTR_UNCACHEABLE;
|
||||
} else
|
||||
error = ENODEV;
|
||||
return (error);
|
||||
}
|
||||
|
||||
int
|
||||
terasic_mtl_pixel_attach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
sc->mtl_pixel_cdev = make_dev(&mtl_pixel_cdevsw, sc->mtl_unit,
|
||||
UID_ROOT, GID_WHEEL, 0400, "mtl_pixel%d", sc->mtl_unit);
|
||||
if (sc->mtl_pixel_cdev == NULL) {
|
||||
device_printf(sc->mtl_dev, "%s: make_dev failed\n", __func__);
|
||||
return (ENXIO);
|
||||
}
|
||||
/* XXXRW: Slight race between make_dev(9) and here. */
|
||||
sc->mtl_pixel_cdev->si_drv1 = sc;
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_pixel_detach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
if (sc->mtl_pixel_cdev != NULL)
|
||||
destroy_dev(sc->mtl_pixel_cdev);
|
||||
}
|
@ -1,296 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h> /* struct vt_mode */
|
||||
#include <sys/endian.h>
|
||||
#include <sys/fbio.h> /* video_adapter_t */
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <machine/vm.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
static d_mmap_t terasic_mtl_reg_mmap;
|
||||
static d_read_t terasic_mtl_reg_read;
|
||||
static d_write_t terasic_mtl_reg_write;
|
||||
|
||||
static struct cdevsw terasic_mtl_reg_cdevsw = {
|
||||
.d_version = D_VERSION,
|
||||
.d_mmap = terasic_mtl_reg_mmap,
|
||||
.d_read = terasic_mtl_reg_read,
|
||||
.d_write = terasic_mtl_reg_write,
|
||||
.d_name = "terasic_mtl_reg",
|
||||
};
|
||||
|
||||
/*
|
||||
* All I/O to/from the MTL register device must be 32-bit, and aligned to
|
||||
* 32-bit.
|
||||
*/
|
||||
static int
|
||||
terasic_mtl_reg_read(struct cdev *dev, struct uio *uio, int flag)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long offset, size;
|
||||
uint32_t v;
|
||||
int error;
|
||||
|
||||
if (uio->uio_offset < 0 || uio->uio_offset % 4 != 0 ||
|
||||
uio->uio_resid % 4 != 0)
|
||||
return (ENODEV);
|
||||
sc = dev->si_drv1;
|
||||
size = rman_get_size(sc->mtl_reg_res);
|
||||
error = 0;
|
||||
if ((uio->uio_offset + uio->uio_resid < 0) ||
|
||||
(uio->uio_offset + uio->uio_resid > size))
|
||||
return (ENODEV);
|
||||
while (uio->uio_resid > 0) {
|
||||
offset = uio->uio_offset;
|
||||
if (offset + sizeof(v) > size)
|
||||
return (ENODEV);
|
||||
v = bus_read_4(sc->mtl_reg_res, offset);
|
||||
error = uiomove(&v, sizeof(v), uio);
|
||||
if (error)
|
||||
return (error);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_reg_write(struct cdev *dev, struct uio *uio, int flag)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long offset, size;
|
||||
uint32_t v;
|
||||
int error;
|
||||
|
||||
if (uio->uio_offset < 0 || uio->uio_offset % 4 != 0 ||
|
||||
uio->uio_resid % 4 != 0)
|
||||
return (ENODEV);
|
||||
sc = dev->si_drv1;
|
||||
size = rman_get_size(sc->mtl_reg_res);
|
||||
error = 0;
|
||||
while (uio->uio_resid > 0) {
|
||||
offset = uio->uio_offset;
|
||||
if (offset + sizeof(v) > size)
|
||||
return (ENODEV);
|
||||
error = uiomove(&v, sizeof(v), uio);
|
||||
if (error)
|
||||
return (error);
|
||||
bus_write_4(sc->mtl_reg_res, offset, v);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_reg_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr,
|
||||
int nprot, vm_memattr_t *memattr)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
int error;
|
||||
|
||||
sc = dev->si_drv1;
|
||||
error = 0;
|
||||
if (trunc_page(offset) == offset &&
|
||||
offset + PAGE_SIZE > offset &&
|
||||
rman_get_size(sc->mtl_reg_res) >= offset + PAGE_SIZE) {
|
||||
*paddr = rman_get_start(sc->mtl_reg_res) + offset;
|
||||
*memattr = VM_MEMATTR_UNCACHEABLE;
|
||||
} else
|
||||
error = ENODEV;
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_blend_get(struct terasic_mtl_softc *sc, uint32_t *blendp)
|
||||
{
|
||||
|
||||
*blendp = le32toh(bus_read_4(sc->mtl_reg_res, TERASIC_MTL_OFF_BLEND));
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_blend_set(struct terasic_mtl_softc *sc, uint32_t blend)
|
||||
{
|
||||
|
||||
bus_write_4(sc->mtl_reg_res, TERASIC_MTL_OFF_BLEND, htole32(blend));
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_blend_default_set(struct terasic_mtl_softc *sc, uint8_t colour)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
TERASIC_MTL_LOCK(sc);
|
||||
terasic_mtl_reg_blend_get(sc, &v);
|
||||
v &= ~TERASIC_MTL_BLEND_DEFAULT_MASK;
|
||||
v |= colour << TERASIC_MTL_BLEND_DEFAULT_SHIFT;
|
||||
terasic_mtl_reg_blend_set(sc, v);
|
||||
TERASIC_MTL_UNLOCK(sc);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_blend_pixel_set(struct terasic_mtl_softc *sc, uint8_t alpha)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
TERASIC_MTL_LOCK(sc);
|
||||
terasic_mtl_reg_blend_get(sc, &v);
|
||||
v &= ~TERASIC_MTL_BLEND_PIXEL_MASK;
|
||||
v |= alpha << TERASIC_MTL_BLEND_PIXEL_SHIFT;
|
||||
terasic_mtl_reg_blend_set(sc, v);
|
||||
TERASIC_MTL_UNLOCK(sc);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_blend_textfg_set(struct terasic_mtl_softc *sc, uint8_t alpha)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
TERASIC_MTL_LOCK(sc);
|
||||
terasic_mtl_reg_blend_get(sc, &v);
|
||||
v &= ~TERASIC_MTL_BLEND_TEXTFG_MASK;
|
||||
v |= alpha << TERASIC_MTL_BLEND_TEXTFG_SHIFT;
|
||||
terasic_mtl_reg_blend_set(sc, v);
|
||||
TERASIC_MTL_UNLOCK(sc);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_blend_textbg_set(struct terasic_mtl_softc *sc, uint8_t alpha)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
TERASIC_MTL_LOCK(sc);
|
||||
terasic_mtl_reg_blend_get(sc, &v);
|
||||
v &= ~TERASIC_MTL_BLEND_TEXTBG_MASK;
|
||||
v |= alpha << TERASIC_MTL_BLEND_TEXTBG_SHIFT;
|
||||
terasic_mtl_reg_blend_set(sc, v);
|
||||
TERASIC_MTL_UNLOCK(sc);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_pixel_endian_set(struct terasic_mtl_softc *sc, int endian_swap)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
TERASIC_MTL_LOCK(sc);
|
||||
terasic_mtl_reg_blend_get(sc, &v);
|
||||
if (endian_swap)
|
||||
v |= TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP;
|
||||
else
|
||||
v &= ~TERASIC_MTL_BLEND_PIXEL_ENDIAN_SWAP;
|
||||
terasic_mtl_reg_blend_set(sc, v);
|
||||
TERASIC_MTL_UNLOCK(sc);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_textcursor_get(struct terasic_mtl_softc *sc, uint8_t *colp,
|
||||
uint8_t *rowp)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
v = bus_read_4(sc->mtl_reg_res, TERASIC_MTL_OFF_TEXTCURSOR);
|
||||
v = le32toh(v);
|
||||
*colp = (v & TERASIC_MTL_TEXTCURSOR_COL_MASK) >>
|
||||
TERASIC_MTL_TEXTCURSOR_COL_SHIFT;
|
||||
*rowp = (v & TERASIC_MTL_TEXTCURSOR_ROW_MASK);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_textcursor_set(struct terasic_mtl_softc *sc, uint8_t col,
|
||||
uint8_t row)
|
||||
{
|
||||
uint32_t v;
|
||||
|
||||
v = (col << TERASIC_MTL_TEXTCURSOR_COL_SHIFT) | row;
|
||||
v = htole32(v);
|
||||
bus_write_4(sc->mtl_reg_res, TERASIC_MTL_OFF_TEXTCURSOR, v);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_blank(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
device_printf(sc->mtl_dev, "%s: not yet\n", __func__);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_textframebufaddr_get(struct terasic_mtl_softc *sc,
|
||||
uint32_t *addrp)
|
||||
{
|
||||
uint32_t addr;
|
||||
|
||||
addr = bus_read_4(sc->mtl_reg_res, TERASIC_MTL_OFF_TEXTFRAMEBUFADDR);
|
||||
*addrp = le32toh(addr);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_textframebufaddr_set(struct terasic_mtl_softc *sc,
|
||||
uint32_t addr)
|
||||
{
|
||||
|
||||
addr = htole32(addr);
|
||||
bus_write_4(sc->mtl_reg_res, TERASIC_MTL_OFF_TEXTFRAMEBUFADDR, addr);
|
||||
}
|
||||
|
||||
int
|
||||
terasic_mtl_reg_attach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
sc->mtl_reg_cdev = make_dev(&terasic_mtl_reg_cdevsw, sc->mtl_unit,
|
||||
UID_ROOT, GID_WHEEL, 0400, "mtl_reg%d", sc->mtl_unit);
|
||||
if (sc->mtl_reg_cdev == NULL) {
|
||||
device_printf(sc->mtl_dev, "%s: make_dev failed\n", __func__);
|
||||
return (ENXIO);
|
||||
}
|
||||
/* XXXRW: Slight race between make_dev(9) and here. */
|
||||
sc->mtl_reg_cdev->si_drv1 = sc;
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_reg_detach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
if (sc->mtl_reg_cdev != NULL)
|
||||
destroy_dev(sc->mtl_reg_cdev);
|
||||
}
|
@ -1,476 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h>
|
||||
#include <sys/fbio.h>
|
||||
#include <sys/kbio.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <machine/vm.h>
|
||||
|
||||
#include <dev/fb/fbreg.h>
|
||||
|
||||
#include <dev/kbd/kbdreg.h>
|
||||
|
||||
#include <dev/syscons/syscons.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
/*
|
||||
* Terasic Multitouch LCD (MTL) syscons driver. Implement syscons(4)'s
|
||||
* video_switch_t KPI using MTL's text frame buffer. In principle, we could
|
||||
* actually implement sc_rndr_sw_t, since the MTL text frame buffer implements
|
||||
* a VGA-like memory mapping. However, this requires a lot more book-keeping
|
||||
* with only minor performance improvements (avoiding indirection), as well as
|
||||
* introducing potential endianness issues. Instead we accept one additional
|
||||
* memory copy between a software frame buffer and the hardware frame buffer
|
||||
* and the generic frame buffer (gfb) framework.
|
||||
*/
|
||||
|
||||
MALLOC_DEFINE(M_TERASIC_MTL, "mtl_syscons", "MTL syscons frame buffer");
|
||||
|
||||
/*
|
||||
* Run early so that boot-time console support can be initialised before
|
||||
* newbus gets around to configuring syscons.
|
||||
*
|
||||
* XXXRW: We may need to do more here in order to see earlier boot messages.
|
||||
*/
|
||||
static int
|
||||
terasic_mtl_syscons_configure(int flags)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_probe(int unit, video_adapter_t **adp, void *args,
|
||||
int flags)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_init(int unit, video_adapter_t *adp, int flags)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
video_info_t *vi;
|
||||
|
||||
sc = (struct terasic_mtl_softc *)adp;
|
||||
|
||||
vi = &adp->va_info;
|
||||
vid_init_struct(adp, "terasic_mtl_syscons", -1, unit);
|
||||
|
||||
vi->vi_width = TERASIC_MTL_COLS;
|
||||
if (vi->vi_width > COL)
|
||||
vi->vi_width = COL;
|
||||
vi->vi_height = TERASIC_MTL_ROWS;
|
||||
if (vi->vi_height > ROW)
|
||||
vi->vi_height = ROW;
|
||||
|
||||
/*
|
||||
* XXXRW: It's not quite clear how these should be initialised.
|
||||
*/
|
||||
vi->vi_cwidth = 0;
|
||||
vi->vi_cheight = 0;
|
||||
vi->vi_flags = V_INFO_COLOR;
|
||||
vi->vi_mem_model = V_INFO_MM_OTHER;
|
||||
|
||||
/*
|
||||
* Software text frame buffer from which we update the actual MTL
|
||||
* frame buffer when asked to.
|
||||
*/
|
||||
adp->va_window = (vm_offset_t)sc->mtl_text_soft;
|
||||
|
||||
/*
|
||||
* Declare video adapter capabilities -- at this point, simply color
|
||||
* support, as MTL doesn't support screen borders, font loading, or
|
||||
* mode changes.
|
||||
*
|
||||
* XXXRW: It's unclear if V_ADP_INITIALIZED is needed here; other
|
||||
* syscons(4) drivers are inconsistent about this and
|
||||
* V_ADP_REGISTERED.
|
||||
*/
|
||||
adp->va_flags |= V_ADP_COLOR | V_ADP_INITIALIZED;
|
||||
if (vid_register(adp) < 0) {
|
||||
device_printf(sc->mtl_dev, "%s: vid_register failed\n",
|
||||
__func__);
|
||||
return (ENXIO);
|
||||
}
|
||||
adp->va_flags |= V_ADP_REGISTERED;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_get_info(video_adapter_t *adp, int mode, video_info_t *info)
|
||||
{
|
||||
|
||||
bcopy(&adp->va_info, info, sizeof(*info));
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_query_mode(video_adapter_t *adp, video_info_t *info)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_set_mode(video_adapter_t *adp, int mode)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_save_font(video_adapter_t *adp, int page, int size,
|
||||
int width, u_char *data, int c, int count)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_load_font(video_adapter_t *adp, int page, int size,
|
||||
int width, u_char *data, int c, int count)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_show_font(video_adapter_t *adp, int page)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_save_palette(video_adapter_t *adp, u_char *palette)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_load_palette(video_adapter_t *adp, u_char *palette)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_set_border(video_adapter_t *adp, int border)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_save_state(video_adapter_t *adp, void *p, size_t size)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_load_state(video_adapter_t *adp, void *p)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_set_win_org(video_adapter_t *adp, off_t offset)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_read_hw_cursor(video_adapter_t *adp, int *colp, int *rowp)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
uint8_t col, row;
|
||||
|
||||
sc = (struct terasic_mtl_softc *)adp;
|
||||
terasic_mtl_reg_textcursor_get(sc, &col, &row);
|
||||
*colp = col;
|
||||
*rowp = row;
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_set_hw_cursor(video_adapter_t *adp, int col, int row)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = (struct terasic_mtl_softc *)adp;
|
||||
terasic_mtl_reg_textcursor_set(sc, col, row);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_set_hw_cursor_shape(video_adapter_t *adp, int base,
|
||||
int height, int celsize, int blink)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_blank_display(video_adapter_t *adp, int mode)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = (struct terasic_mtl_softc *)adp;
|
||||
terasic_mtl_reg_blank(sc);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_mmap(video_adapter_t *adp, vm_ooffset_t offset,
|
||||
vm_paddr_t *paddr, int prot, vm_memattr_t *memattr)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_ioctl(video_adapter_t *adp, u_long cmd, caddr_t data)
|
||||
{
|
||||
|
||||
return (fb_commonioctl(adp, cmd, data));
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_clear(video_adapter_t *adp)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
|
||||
sc = (struct terasic_mtl_softc *)adp;
|
||||
printf("%s: not yet terasic_mtl_io_clear(sc);\n", __func__);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_fill_rect(video_adapter_t *adp, int val, int x, int y,
|
||||
int cx, int cy)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_bitblt(video_adapter_t *adp, ...)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_diag(video_adapter_t *adp, int level)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_save_cursor_palette(video_adapter_t *adp, u_char *palette)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_load_cursor_palette(video_adapter_t *adp, u_char *palette)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_copy(video_adapter_t *adp, vm_offset_t src, vm_offset_t dst,
|
||||
int n)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_putp(video_adapter_t *adp, vm_offset_t off, uint32_t p,
|
||||
uint32_t a, int size, int bpp, int bit_ltor, int byte_ltor)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_putc(video_adapter_t *adp, vm_offset_t off, uint8_t c,
|
||||
uint8_t a)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_int col, row;
|
||||
|
||||
sc = (struct terasic_mtl_softc *)adp;
|
||||
col = (off % adp->va_info.vi_width);
|
||||
row = (off / adp->va_info.vi_width);
|
||||
terasic_mtl_text_putc(sc, col, row, c, a);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_puts(video_adapter_t *adp, vm_offset_t off, u_int16_t *s,
|
||||
int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
vidd_putc(adp, off + i, s[i] & 0xff, (s[i] & 0xff00) >> 8);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_vidsw_putm(video_adapter_t *adp, int x, int y,
|
||||
uint8_t *pixel_image, uint32_t pixel_mask, int size, int width)
|
||||
{
|
||||
|
||||
printf("%s: not yet\n", __func__);
|
||||
return (ENODEV);
|
||||
}
|
||||
|
||||
int
|
||||
terasic_mtl_syscons_attach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
int error;
|
||||
|
||||
sc->mtl_text_soft =
|
||||
malloc(sizeof(uint16_t) * TERASIC_MTL_ROWS * TERASIC_MTL_COLS,
|
||||
M_TERASIC_MTL, M_WAITOK | M_ZERO);
|
||||
error = terasic_mtl_vidsw_init(0, &sc->mtl_va, 0);
|
||||
if (error)
|
||||
goto out;
|
||||
error = sc_attach_unit(sc->mtl_unit, device_get_flags(sc->mtl_dev) |
|
||||
SC_AUTODETECT_KBD);
|
||||
if (error)
|
||||
device_printf(sc->mtl_dev, "%s: sc_attach_unit failed (%d)\n",
|
||||
__func__, error);
|
||||
out:
|
||||
if (error)
|
||||
free(sc->mtl_text_soft, M_TERASIC_MTL);
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_syscons_detach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
free(sc->mtl_text_soft, M_TERASIC_MTL);
|
||||
panic("%s: not supported by syscons", __func__);
|
||||
}
|
||||
|
||||
static video_switch_t terasic_mtl_vidsw = {
|
||||
.probe = terasic_mtl_vidsw_probe,
|
||||
.init = terasic_mtl_vidsw_init,
|
||||
.get_info = terasic_mtl_vidsw_get_info,
|
||||
.query_mode = terasic_mtl_vidsw_query_mode,
|
||||
.set_mode = terasic_mtl_vidsw_set_mode,
|
||||
.save_font = terasic_mtl_vidsw_save_font,
|
||||
.load_font = terasic_mtl_vidsw_load_font,
|
||||
.show_font = terasic_mtl_vidsw_show_font,
|
||||
.save_palette = terasic_mtl_vidsw_save_palette,
|
||||
.load_palette = terasic_mtl_vidsw_load_palette,
|
||||
.set_border = terasic_mtl_vidsw_set_border,
|
||||
.save_state = terasic_mtl_vidsw_save_state,
|
||||
.load_state = terasic_mtl_vidsw_load_state,
|
||||
.set_win_org = terasic_mtl_vidsw_set_win_org,
|
||||
.read_hw_cursor = terasic_mtl_vidsw_read_hw_cursor,
|
||||
.set_hw_cursor = terasic_mtl_vidsw_set_hw_cursor,
|
||||
.set_hw_cursor_shape = terasic_mtl_vidsw_set_hw_cursor_shape,
|
||||
.blank_display = terasic_mtl_vidsw_blank_display,
|
||||
.mmap = terasic_mtl_vidsw_mmap,
|
||||
.ioctl = terasic_mtl_vidsw_ioctl,
|
||||
.clear = terasic_mtl_vidsw_clear,
|
||||
.fill_rect = terasic_mtl_vidsw_fill_rect,
|
||||
.bitblt = terasic_mtl_vidsw_bitblt,
|
||||
.diag = terasic_mtl_vidsw_diag,
|
||||
.save_cursor_palette = terasic_mtl_vidsw_save_cursor_palette,
|
||||
.load_cursor_palette = terasic_mtl_vidsw_load_cursor_palette,
|
||||
.copy = terasic_mtl_vidsw_copy,
|
||||
.putp = terasic_mtl_vidsw_putp,
|
||||
.putc = terasic_mtl_vidsw_putc,
|
||||
.puts = terasic_mtl_vidsw_puts,
|
||||
.putm = terasic_mtl_vidsw_putm,
|
||||
};
|
||||
VIDEO_DRIVER(terasic_mtl_syscons, terasic_mtl_vidsw,
|
||||
terasic_mtl_syscons_configure);
|
||||
extern sc_rndr_sw_t txtrndrsw;
|
||||
RENDERER(terasic_mtl_syscons, 0, txtrndrsw, gfb_set);
|
||||
RENDERER_MODULE(terasic_mtl_syscons, gfb_set);
|
@ -1,196 +0,0 @@
|
||||
/*-
|
||||
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
||||
*
|
||||
* Copyright (c) 2012 Robert N. M. Watson
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/consio.h> /* struct vt_mode */
|
||||
#include <sys/endian.h>
|
||||
#include <sys/fbio.h> /* video_adapter_t */
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/rman.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <machine/bus.h>
|
||||
#include <machine/resource.h>
|
||||
#include <machine/vm.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
static d_mmap_t terasic_mtl_text_mmap;
|
||||
static d_read_t terasic_mtl_text_read;
|
||||
static d_write_t terasic_mtl_text_write;
|
||||
|
||||
static struct cdevsw terasic_mtl_text_cdevsw = {
|
||||
.d_version = D_VERSION,
|
||||
.d_mmap = terasic_mtl_text_mmap,
|
||||
.d_read = terasic_mtl_text_read,
|
||||
.d_write = terasic_mtl_text_write,
|
||||
.d_name = "terasic_mtl_text",
|
||||
};
|
||||
|
||||
/*
|
||||
* All I/O to/from the mtl device must be 16-bit, and aligned to 16-bit.
|
||||
*/
|
||||
static int
|
||||
terasic_mtl_text_read(struct cdev *dev, struct uio *uio, int flag)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long offset, size;
|
||||
uint16_t v;
|
||||
int error;
|
||||
|
||||
if (uio->uio_offset < 0 || uio->uio_offset % 2 != 0 ||
|
||||
uio->uio_resid % 2 != 0)
|
||||
return (ENODEV);
|
||||
sc = dev->si_drv1;
|
||||
size = rman_get_size(sc->mtl_text_res);
|
||||
error = 0;
|
||||
if ((uio->uio_offset + uio->uio_resid < 0) ||
|
||||
(uio->uio_offset + uio->uio_resid > size))
|
||||
return (ENODEV);
|
||||
while (uio->uio_resid > 0) {
|
||||
offset = uio->uio_offset;
|
||||
if (offset + sizeof(v) > size)
|
||||
return (ENODEV);
|
||||
v = bus_read_2(sc->mtl_text_res, offset);
|
||||
error = uiomove(&v, sizeof(v), uio);
|
||||
if (error)
|
||||
return (error);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_text_write(struct cdev *dev, struct uio *uio, int flag)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
u_long offset, size;
|
||||
uint16_t v;
|
||||
int error;
|
||||
|
||||
if (uio->uio_offset < 0 || uio->uio_offset % 2 != 0 ||
|
||||
uio->uio_resid % 2 != 0)
|
||||
return (ENODEV);
|
||||
sc = dev->si_drv1;
|
||||
size = rman_get_size(sc->mtl_text_res);
|
||||
error = 0;
|
||||
while (uio->uio_resid > 0) {
|
||||
offset = uio->uio_offset;
|
||||
if (offset + sizeof(v) > size)
|
||||
return (ENODEV);
|
||||
error = uiomove(&v, sizeof(v), uio);
|
||||
if (error)
|
||||
return (error);
|
||||
bus_write_2(sc->mtl_text_res, offset, v);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
terasic_mtl_text_mmap(struct cdev *dev, vm_ooffset_t offset,
|
||||
vm_paddr_t *paddr, int nprot, vm_memattr_t *memattr)
|
||||
{
|
||||
struct terasic_mtl_softc *sc;
|
||||
int error;
|
||||
|
||||
sc = dev->si_drv1;
|
||||
error = 0;
|
||||
if (trunc_page(offset) == offset &&
|
||||
offset + PAGE_SIZE > offset &&
|
||||
rman_get_size(sc->mtl_text_res) >= offset + PAGE_SIZE) {
|
||||
*paddr = rman_get_start(sc->mtl_text_res) + offset;
|
||||
*memattr = VM_MEMATTR_UNCACHEABLE;
|
||||
} else
|
||||
error = ENODEV;
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_text_putc(struct terasic_mtl_softc *sc, u_int x, u_int y,
|
||||
uint8_t c, uint8_t a)
|
||||
{
|
||||
u_int offset;
|
||||
uint16_t v;
|
||||
|
||||
KASSERT(x < TERASIC_MTL_COLS, ("%s: TERASIC_MTL_COLS", __func__));
|
||||
KASSERT(y < TERASIC_MTL_ROWS, ("%s: TERASIC_MTL_ROWS", __func__));
|
||||
|
||||
offset = sizeof(uint16_t) * (x + y * TERASIC_MTL_COLS);
|
||||
v = (c << TERASIC_MTL_TEXTFRAMEBUF_CHAR_SHIFT) |
|
||||
(a << TERASIC_MTL_TEXTFRAMEBUF_ATTR_SHIFT);
|
||||
v = htole16(v);
|
||||
bus_write_2(sc->mtl_text_res, offset, v);
|
||||
}
|
||||
|
||||
int
|
||||
terasic_mtl_text_attach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
uint32_t v;
|
||||
u_int offset;
|
||||
|
||||
terasic_mtl_reg_textframebufaddr_get(sc, &v);
|
||||
if (v != TERASIC_MTL_TEXTFRAMEBUF_EXPECTED_ADDR) {
|
||||
device_printf(sc->mtl_dev, "%s: unexpected text frame buffer "
|
||||
"address (%08x); cannot attach\n", __func__, v);
|
||||
return (ENXIO);
|
||||
}
|
||||
for (offset = 0; offset < rman_get_size(sc->mtl_text_res);
|
||||
offset += sizeof(uint16_t))
|
||||
bus_write_2(sc->mtl_text_res, offset, 0);
|
||||
|
||||
sc->mtl_text_cdev = make_dev(&terasic_mtl_text_cdevsw, sc->mtl_unit,
|
||||
UID_ROOT, GID_WHEEL, 0400, "mtl_text%d", sc->mtl_unit);
|
||||
if (sc->mtl_text_cdev == NULL) {
|
||||
device_printf(sc->mtl_dev, "%s: make_dev failed\n", __func__);
|
||||
return (ENXIO);
|
||||
}
|
||||
/* XXXRW: Slight race between make_dev(9) and here. */
|
||||
TERASIC_MTL_LOCK_INIT(sc);
|
||||
sc->mtl_text_cdev->si_drv1 = sc;
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_text_detach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
|
||||
if (sc->mtl_text_cdev != NULL) {
|
||||
destroy_dev(sc->mtl_text_cdev);
|
||||
TERASIC_MTL_LOCK_DESTROY(sc);
|
||||
}
|
||||
}
|
@ -1,133 +0,0 @@
|
||||
/*-
|
||||
* Copyright (c) 2014 Ed Maste
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software was developed by SRI International and the University of
|
||||
* Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237)
|
||||
* ("CTSRD"), as part of the DARPA CRASH research programme.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/fbio.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/rman.h>
|
||||
|
||||
#include <dev/fdt/fdt_common.h>
|
||||
#include <dev/ofw/ofw_bus.h>
|
||||
#include <dev/ofw/ofw_bus_subr.h>
|
||||
|
||||
#include <dev/terasic/mtl/terasic_mtl.h>
|
||||
|
||||
#include <dev/vt/colors/vt_termcolors.h>
|
||||
|
||||
/*
|
||||
* Terasic Multitouch LCD (MTL) vt(4) framebuffer driver.
|
||||
*/
|
||||
|
||||
#include <vm/vm.h>
|
||||
#include <vm/pmap.h>
|
||||
|
||||
static int
|
||||
terasic_mtl_fbd_panel_info(struct terasic_mtl_softc *sc, struct fb_info *info)
|
||||
{
|
||||
phandle_t node;
|
||||
pcell_t dts_value[2];
|
||||
int len;
|
||||
|
||||
if ((node = ofw_bus_get_node(sc->mtl_dev)) == -1)
|
||||
return (ENXIO);
|
||||
|
||||
/* panel size */
|
||||
if ((len = OF_getproplen(node, "panel-size")) != sizeof(dts_value))
|
||||
return (ENXIO);
|
||||
OF_getencprop(node, "panel-size", dts_value, len);
|
||||
info->fb_width = dts_value[0];
|
||||
info->fb_height = dts_value[1];
|
||||
info->fb_bpp = info->fb_depth = 32;
|
||||
info->fb_stride = info->fb_width * (info->fb_depth / 8);
|
||||
|
||||
/*
|
||||
* Safety belt to ensure framebuffer params are as expected. May be
|
||||
* removed when we have full confidence in fdt / hints params.
|
||||
*/
|
||||
if (info->fb_width != TERASIC_MTL_FB_WIDTH ||
|
||||
info->fb_height != TERASIC_MTL_FB_HEIGHT ||
|
||||
info->fb_stride != 3200 ||
|
||||
info->fb_bpp != 32 || info->fb_depth != 32) {
|
||||
device_printf(sc->mtl_dev,
|
||||
"rejecting invalid panel params width=%u height=%u\n",
|
||||
(unsigned)info->fb_width, (unsigned)info->fb_height);
|
||||
return (EINVAL);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
terasic_mtl_fbd_attach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
struct fb_info *info;
|
||||
device_t fbd;
|
||||
|
||||
info = &sc->mtl_fb_info;
|
||||
info->fb_name = device_get_nameunit(sc->mtl_dev);
|
||||
info->fb_pbase = rman_get_start(sc->mtl_pixel_res);
|
||||
info->fb_size = rman_get_size(sc->mtl_pixel_res);
|
||||
info->fb_vbase = (intptr_t)pmap_mapdev(info->fb_pbase, info->fb_size);
|
||||
if (terasic_mtl_fbd_panel_info(sc, info) != 0) {
|
||||
device_printf(sc->mtl_dev, "using default panel params\n");
|
||||
info->fb_bpp = info->fb_depth = 32;
|
||||
info->fb_width = 800;
|
||||
info->fb_height = 480;
|
||||
info->fb_stride = info->fb_width * (info->fb_depth / 8);
|
||||
}
|
||||
|
||||
fbd = device_add_child(sc->mtl_dev, "fbd",
|
||||
device_get_unit(sc->mtl_dev));
|
||||
if (fbd == NULL) {
|
||||
device_printf(sc->mtl_dev, "Failed to attach fbd child\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
if (device_probe_and_attach(fbd) != 0) {
|
||||
device_printf(sc->mtl_dev,
|
||||
"Failed to attach fbd device\n");
|
||||
return (ENXIO);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
terasic_mtl_fbd_detach(struct terasic_mtl_softc *sc)
|
||||
{
|
||||
panic("%s: detach not implemented", __func__);
|
||||
}
|
||||
|
||||
extern device_t fbd_driver;
|
||||
extern devclass_t fbd_devclass;
|
||||
DRIVER_MODULE(fbd, terasic_mtl, fbd_driver, fbd_devclass, 0, 0);
|
Loading…
Reference in New Issue
Block a user