Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Apr 2014 23:34:40 -0500
From:      Jim Thompson <jim@netgate.com>
To:        Larry Baird <lab@gta.com>
Cc:        =?iso-8859-1?Q?Ermal_Lu=E7i?= <eri@freebsd.org>, Freebsd hackers list <freebsd-hackers@freebsd.org>
Subject:   Re: apu1c led driver
Message-ID:  <69BC3E8E-A5D1-4CAD-96A0-9139FFBD8AA3@netgate.com>
In-Reply-To: <20140422020109.GA57760@gta.com>
References:  <20140422020109.GA57760@gta.com>

next in thread | previous in thread | raw e-mail | index | archive | help

Might want to get Ermal to post the driver he did for us (@ pfSense).

Or just submit it to the process for -HEAD.

Jim

On Apr 21, 2014, at 9:01 PM, Larry Baird <lab@gta.com> wrote:

> There exists a nice simple linux driver for the leds on a pc engines =
apu1c
> board at http://daduke.org/linux/apu/.  Converting driver to use =
led(4)
> and run on FreeBSD seemed straight forward.  Or that is until I =
realized
> I don't know how to alloc and write to a fixed set of I/O ports. I =
believe
> the magic happens by using bus_alloc_resource(). Code below attempts =
to allow
> control of the second of three leds on the apu1c board.  Once I get =
that
> working, it should be easy to extend driver to support all three leds.
> What is the correct way to allocate and write to a a set of I/O ports =
at
> address 0xFED801BD?
>=20
> #include <sys/param.h>
> #include <sys/bus.h>
> #include <sys/kernel.h>
> #include <sys/module.h>
> #include <sys/rman.h>
> #include <x86/bus.h>
> #include <dev/led/led.h>
>=20
> #define BASEADDR        (0xFED801BD)
> #define LEDON           (0x8)
> #define LEDOFF          (0xC8)
>=20
> #define GPIO_187      187       // MODESW
> #define GPIO_189      189       // LED1#
> #define GPIO_190      190       // LED2#
> #define GPIO_191      191       // LED3#
>=20
> struct apuled_softc {
> 	device_t	sc_dev;
>        int             sc_rid;
>        int             sc_type;
>        int             sc_offset;
> 	struct resource *sc_res;
> 	void     	*sc_led1;
> };
>=20
> /*
> * Device methods.
> */
> static int	apuled_probe(device_t dev);
> static int	apuled_attach(device_t dev);
> static int	apuled_detach(device_t dev);
>=20
> static device_method_t apuled_methods[] =3D {
> 	/* Device interface */
> 	DEVMETHOD(device_probe,		apuled_probe),
> 	DEVMETHOD(device_attach,	apuled_attach),
> 	DEVMETHOD(device_detach,	apuled_detach),
>=20
> 	DEVMETHOD_END
> };
>=20
> static driver_t apuled_driver =3D {
> 	"apuled",
> 	apuled_methods,
> 	sizeof(struct apuled_softc),
> };
>=20
> static devclass_t apuled_devclass;
> DRIVER_MODULE(apuled, pci, apuled_driver, apuled_devclass, NULL, =
NULL);
>=20
>=20
> static int
> apuled_probe(device_t dev)
> {
> 	device_set_desc(dev, "APU led");
>=20
> 	return (BUS_PROBE_GENERIC);
> }
>=20
> static void
> led_func(void *ptr, int onoff)
> {
> 	struct apuled_softc *sc =3D (struct apuled_softc *)ptr;
> 	u_int8_t value;
>=20
> 	if ( onoff ) {
> 		value =3D LEDON;
> 	} else {
> 		value =3D LEDOFF;
> 	}
>=20
> 	bus_write_1(sc->sc_res, 1, value);
> }
>=20
> static int
> apuled_attach(device_t dev)
> {
> 	struct apuled_softc *sc =3D device_get_softc(dev);
>=20
> 	sc->sc_dev =3D dev;
> 	sc->sc_rid =3D 1;
> 	sc->sc_type =3D SYS_RES_IOPORT;
>=20
> 	if ( (sc->sc_res =3D bus_alloc_resource( sc->sc_dev,
> 					   sc->sc_type,
> 					   &sc->sc_rid,
> 					   BASEADDR,
> 					   BASEADDR + 4,
> 					   4,
> 					   RF_ACTIVE)) =3D=3D NULL ) {
> 		device_printf( sc->sc_dev, "Unable to allocate bus =
resource\n" );
> 		return ENXIO;
>=20
> 	} else if ( (sc->sc_led1 =3D led_create(led_func, sc, "led1")) =
=3D=3D NULL ) {
> 		device_printf( sc->sc_dev, "Unable to create LED 1\n" );
> 		return ENXIO;
>=20
> 	} else {
> 		device_printf( sc->sc_dev, "LED 1 created\n" );
> 	}
>=20
> 	return (0);
> }
>=20
> int
> apuled_detach(device_t dev)
> {
> 	struct apuled_softc *sc =3D device_get_softc(dev);
>=20
> 	if ( sc->sc_led1 !=3D NULL ) {
> 		led_destroy( sc->sc_led1 );
> 	}
>=20
> 	if ( sc->sc_res !=3D NULL ) {
> 		bus_release_resource( sc->sc_dev, sc->sc_type, =
sc->sc_rid, sc->sc_res );
> 	}
>=20
> 	return (0);
> }
>=20
> --=20
> =
------------------------------------------------------------------------
> Larry Baird
> Global Technology Associates, Inc. 1992-2012 	| http://www.gta.com
> Celebrating Twenty Years of Software Innovation | Orlando, FL
> Email: lab@gta.com                 		| TEL 407-380-0220
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to =
"freebsd-hackers-unsubscribe@freebsd.org"




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69BC3E8E-A5D1-4CAD-96A0-9139FFBD8AA3>