panic: bus_add_child is not implemented

Matías Perret Cantoni perretcantonim at gmail.com
Tue Mar 3 03:54:25 UTC 2015


Yes Warner, here it is. I think I got yours from here:
http://people.freebsd.org/~imp/led.tar.gz

/*
 * Prototipo 3 - Driver newbus simple para escribir un registro de la FPGA
 */

/*
 * Copyright (c) 2000. M. Warner Losh.  All Rights Reserved.
 *
 * "THE BEER-WARE LICENSE" (Revision 42):
 * <imp at FreeBSD.ORG> wrote this file.  As long as you retain this notice you
 * can do whatever you want with this stuff. If we meet some day, and you
think
 * this stuff is worth it, you can buy me a beer in return.   M. Warner Losh
 */

/*
 * Simple driver for the I-Opener LED, but likely could be adapted
 * to any led driver.  This is intended to be a thought excersize
 * as well as a useful sample driver.  Since I don't have a hackable
 * iopener around to test it out on.
 *
 * The LED is located at 0x404c on the iopener.  Likely we should find this
 * in the pci space, and then do stuff from tehre.  However, it appears to
 * be controlled in some way by acpi, so I'm going to try to write this
driver
 * to not interfere with that.
 *
 * the lower two bits of this register control the state of the LED.  The
left
 * led, with the mail ICON, is controlled by bit 0.  The phone led is
 * controlled by bit 1.
 *
 * This is a bog simple ISA driver...  Would make a useful example, imho.
 *
 * Since I'm lazy, I have only a write interface.  The characters recieved
 * by the driver are masked and the results sent to these gpios.  This
 * allows things like '1' to turn on the led and '0' to turn off the led.
 * There is a minor number for each led controlled.
 *
 * The read interface returns 1 character ('0' off '1' on) for the state
 * of the led.
 *
 * thanks to "roastbeef" who posted technical information about this to the
 * I-Opener BBS web site.
 */


#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>

#include <sys/bus.h>
#include <sys/conf.h>
#include <sys/uio.h>

#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>

#define REG_IOADDR 0x67000000

struct reg_softc
{
struct cdev *dev0;
struct resource *res;
int rid;
};

static d_open_t reg_open;
static d_close_t reg_close;
static d_read_t reg_read;
static d_write_t reg_write;

static struct cdevsw reg_cdevsw = {
.d_version = D_VERSION,
.d_open = reg_open,
.d_close = reg_close,
.d_read = reg_read,
.d_write = reg_write,
.d_name = "simple_register",
};

static devclass_t reg_devclass;

static int reg_open(struct cdev *dev, int flags, int fmt, struct thread *p)
{
uprintf("Open: simple_register.\n");
return 0;
}
static int
reg_close(struct cdev *dev, int flags, int fmt, struct thread *p)
{
uprintf("Close: simple_register.\n");
return 0;
}

static int
reg_read(struct cdev *dev, struct uio *uio, int flag)
{
struct reg_softc *sc = dev->si_drv1;
int err;
u_int8_t ch;

ch = bus_read_1(sc->res, 0);
 err = uiomove(&ch, 1, uio);

return err;
}

static int
reg_write(struct cdev *dev, struct uio *uio, int flag)
{

struct reg_softc *sc = dev->si_drv1;
int err;
u_int8_t ch;

err = uiomove(&ch, 1, uio);
if (err != 0)
return (err);
 bus_write_1(sc->res, 0, ch);
 return err;
}
static void
reg_identify (driver_t *driver, device_t parent)
{
device_t child;
 child= device_find_child(parent, "simple_register", -1);

if (!child) {
child = BUS_ADD_CHILD(parent, 0, "simple_register", -1);
bus_set_resource(child, SYS_RES_IOPORT, 0, REG_IOADDR, 1);
}
}

static int
reg_probe(device_t dev)
{
if ( 0 == bus_get_resource_start(dev, SYS_RES_IOPORT, 0) )
return (ENXIO);
 device_set_desc(dev, "simple_register_driver");
return(BUS_PROBE_SPECIFIC);
}

static int
reg_attach(device_t dev)
{

struct reg_softc *sc;
sc = (struct reg_softc *) device_get_softc(dev);
sc->rid = 0;
 /* Solicita el recurso */
sc->res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &sc->rid, RF_ACTIVE);
if (sc->res == NULL){
  device_printf(dev, "No se pudo obtener el puerto de E/S\n");
  return ENXIO;
}
 /* Crea el nodo correspondiente en </dev> */
sc->dev0 = make_dev(&reg_cdevsw, 0, UID_ROOT, GID_WHEEL, 0644,
"simple_reg");

return 0;
}

static int
reg_detach(device_t dev)
{
struct reg_softc *sc;
sc = (struct reg_softc *) device_get_softc(dev);
 /* Destruye el nodo */
destroy_dev(sc->dev0);

/* Devuelve los recursos */
bus_release_resource(dev, SYS_RES_IOPORT, sc->rid, sc->res);
 return 0;
}

static device_method_t reg_methods[] = {
/* Device interface */
DEVMETHOD(device_identify, reg_identify),
DEVMETHOD(device_probe, reg_probe),
DEVMETHOD(device_attach, reg_attach),
DEVMETHOD(device_detach, reg_detach),

{ 0, 0 }
};

/* Declaracion del driver */
static driver_t reg_driver = {
"simple_register",
reg_methods,
sizeof(struct reg_softc),
};

DRIVER_MODULE(simple_register, simplebus, reg_driver, reg_devclass, 0, 0);


2015-03-02 22:48 GMT-03:00 Warner Losh <imp at bsdimp.com>:

> can you send me the source?
>
> Warner
>
> > On Mar 2, 2015, at 6:11 PM, Matías Perret Cantoni <
> perretcantonim at gmail.com> wrote:
> >
> > Hello!
> >
> > I wrote a simple newbus driver for reading and writing a specific I/O
> port,
> > which is basically a copy of the Warner Losh example driver for the
> iOpener
> > Led. I compiled with no errors, but I get a kernel panic " bus_add_child
> is
> > not implemented" when I try to load it in my development board which is a
> > Zedboard with FreeBSD.
> >
> >
> > The way I compiled it:
> >
> > # cd /usr/src
> > root at matiBSD:/usr/src # make buildenv TARGET_ARCH=armv6
> > BUILDENV_SHELL=/usr/local/bin/bash
> > KERNBUILDDIR=/usr/obj/arm.armv6/usr/src/sys/ZEDBOARD
> > Entering world for armv6:arm
> > [root at matiBSD /usr/src]# cd /home/drivers/p3
> > [root at matiBSD /home/drivers/p3]# make
> >
> >
> > The content of the Makefile I used:
> >
> > KMOD =p3
> > SRCS =p3.c device_if.c bus_if.h
> > .include <bsd.knod.mk>
> >
> >
> > The way I tried to load it:
> >
> > root at zedboard:/usr # kldload /boot/msdos/p3.ko
> > panic: bus_add_child is not implemented
> > cpuid = 1
> >
> >
> > My only guess here is that I should compile the driver with the kernel so
> > that the linker can properly link the BUS_ADD_CHILD() method call in the
> > drivers identify() method.
> >
> > My host is:    FreeBSD matiBSD  10.1-BETA2 FreeBSD 10.1-BETA2
> > My target is: FreeBSD zedboard 10.1-BETA2 FreeBSD 10.1-BETA2
> >
> >
> > I'm new at this, so any income is appreciated!
> >
> > Regards,
> > Matias.
> > _______________________________________________
> > freebsd-arm at freebsd.org mailing list
> > http://lists.freebsd.org/mailman/listinfo/freebsd-arm
> > To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org"
>
>


More information about the freebsd-arm mailing list