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>