apu1c led driver

Jim Thompson jim at netgate.com
Tue Apr 22 04:34:54 UTC 2014


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 at 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?
> 
> #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>
> 
> #define BASEADDR        (0xFED801BD)
> #define LEDON           (0x8)
> #define LEDOFF          (0xC8)
> 
> #define GPIO_187      187       // MODESW
> #define GPIO_189      189       // LED1#
> #define GPIO_190      190       // LED2#
> #define GPIO_191      191       // LED3#
> 
> struct apuled_softc {
> 	device_t	sc_dev;
>        int             sc_rid;
>        int             sc_type;
>        int             sc_offset;
> 	struct resource *sc_res;
> 	void     	*sc_led1;
> };
> 
> /*
> * Device methods.
> */
> static int	apuled_probe(device_t dev);
> static int	apuled_attach(device_t dev);
> static int	apuled_detach(device_t dev);
> 
> static device_method_t apuled_methods[] = {
> 	/* Device interface */
> 	DEVMETHOD(device_probe,		apuled_probe),
> 	DEVMETHOD(device_attach,	apuled_attach),
> 	DEVMETHOD(device_detach,	apuled_detach),
> 
> 	DEVMETHOD_END
> };
> 
> static driver_t apuled_driver = {
> 	"apuled",
> 	apuled_methods,
> 	sizeof(struct apuled_softc),
> };
> 
> static devclass_t apuled_devclass;
> DRIVER_MODULE(apuled, pci, apuled_driver, apuled_devclass, NULL, NULL);
> 
> 
> static int
> apuled_probe(device_t dev)
> {
> 	device_set_desc(dev, "APU led");
> 
> 	return (BUS_PROBE_GENERIC);
> }
> 
> static void
> led_func(void *ptr, int onoff)
> {
> 	struct apuled_softc *sc = (struct apuled_softc *)ptr;
> 	u_int8_t value;
> 
> 	if ( onoff ) {
> 		value = LEDON;
> 	} else {
> 		value = LEDOFF;
> 	}
> 
> 	bus_write_1(sc->sc_res, 1, value);
> }
> 
> static int
> apuled_attach(device_t dev)
> {
> 	struct apuled_softc *sc = device_get_softc(dev);
> 
> 	sc->sc_dev = dev;
> 	sc->sc_rid = 1;
> 	sc->sc_type = SYS_RES_IOPORT;
> 
> 	if ( (sc->sc_res = bus_alloc_resource( sc->sc_dev,
> 					   sc->sc_type,
> 					   &sc->sc_rid,
> 					   BASEADDR,
> 					   BASEADDR + 4,
> 					   4,
> 					   RF_ACTIVE)) == NULL ) {
> 		device_printf( sc->sc_dev, "Unable to allocate bus resource\n" );
> 		return ENXIO;
> 
> 	} else if ( (sc->sc_led1 = led_create(led_func, sc, "led1")) == NULL ) {
> 		device_printf( sc->sc_dev, "Unable to create LED 1\n" );
> 		return ENXIO;
> 
> 	} else {
> 		device_printf( sc->sc_dev, "LED 1 created\n" );
> 	}
> 
> 	return (0);
> }
> 
> int
> apuled_detach(device_t dev)
> {
> 	struct apuled_softc *sc = device_get_softc(dev);
> 
> 	if ( sc->sc_led1 != NULL ) {
> 		led_destroy( sc->sc_led1 );
> 	}
> 
> 	if ( sc->sc_res != NULL ) {
> 		bus_release_resource( sc->sc_dev, sc->sc_type, sc->sc_rid, sc->sc_res );
> 	}
> 
> 	return (0);
> }
> 
> -- 
> ------------------------------------------------------------------------
> Larry Baird
> Global Technology Associates, Inc. 1992-2012 	| http://www.gta.com
> Celebrating Twenty Years of Software Innovation | Orlando, FL
> Email: lab at gta.com                 		| TEL 407-380-0220
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"



More information about the freebsd-hackers mailing list