On Wed, May 04, 2016 at 07:26:15AM -0500, Chase Davis wrote: > This was added to GENERIC: > > sel* at acpi? > > and these four lines were added to files.acpi: > # SEL embedded controller > device sel > attach sel at acpi with sel_acpi > file dev/acpi/sel_acpi.c sel_acpi > > With SEL0002 being the first item in the array, shouldn't it at least > match it if it exists? We will add NULL to the HID array and see what > happens. >
I tossed your acpidump from last week. Is SEL0002 in your AML delimited with a _HID section? If not, you may want to attach this device ala acpisony or acpidock - see sys/dev/acpi/acpi.c around line 1080 or so for an example. In that case match the containing node instead. PS - moving this discussion to tech@, where it belongs. -ml > On Tue, May 3, 2016 at 5:29 PM, Mike Larkin <[email protected]> wrote: > > On Tue, May 03, 2016 at 03:32:34PM -0500, Chase Davis wrote: > >> Mike, > >> > >> We took your suggestion and re-wrote the driver to model sdhc_acpi. I > >> have attached the new code. However, the match function never returns > >> a 1. We put temporary print statements in the match routine. It is > >> being called several times during the kernel boot process, but it > >> never finds a device with HID SEL0002. Do you have any suggestions for > >> why it would show up in the DSDT tables when we do an acpidump, but > >> that the match routine never finds it? > >> > >> This is a snippet from the dmesg boot log > >> > >> Attempting to match SEL: result (0) > >> acpitimer0 at acpi0: 3579545 Hz, 24 bits > >> Attempting to match SEL: result (0) > >> Attempting to match SEL: result (0) > >> Attempting to match SEL: result (0) > >> Attempting to match SEL: result (0) > >> acpihpet0 at acpi0: 14318179 Hz > >> Attempting to match SEL: result (0) > >> acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat > >> > >> int > >> sel_acpi_match(struct device *parent, void *match, void *aux) > >> { > >> struct acpi_attach_args *aaa = aux; > >> struct cfdata *cf = match; > >> printf("Attempting to match SEL: "); > >> int res = acpi_matchhids(aaa, sel_hids, cf->cf_driver->cd_name); > >> printf("result (%d)\n", res); > >> return res; > >> } > >> > >> Thanks, > >> Chase > > > > I think this diff is missing some parts. Like GENERIC? > > > > Also, you need a NULL after your last HID or matchhids will walk all > > through memory until it hits a NULL. > > > > -ml > > > >> /* $OpenBSD: sel.c,v 1.0 2016/04/01 05:00:00 jsg Exp $ */ > >> /* > >> * Copyright (c) 2016 PREMIER System Integrators > >> * > >> * Permission to use, copy, modify, and distribute this software for any > >> * purpose with or without fee is hereby granted, provided that the above > >> * copyright notice and this permission notice appear in all copies. > >> * > >> * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES > >> * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF > >> * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR > >> * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES > >> * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN > >> * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF > >> * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > >> * > >> * Schweitzer Engineering Laboratories: SEL-3355 Embedded controller > >> */ > >> > >> #include <sys/types.h> > >> #include <sys/param.h> > >> #include <sys/systm.h> > >> #include <sys/device.h> > >> #include <sys/kernel.h> > >> #include <sys/malloc.h> > >> > >> #include <machine/bus.h> > >> > >> #include <dev/acpi/acpireg.h> > >> #include <dev/acpi/acpivar.h> > >> #include <dev/acpi/acpidev.h> > >> #include <dev/acpi/amltypes.h> > >> #include <dev/acpi/dsdt.h> > >> > >> #include <dev/isa/selreg.h> > >> > >> struct sel_host; > >> > >> struct sel_softc { > >> /* sc_dev must be the first item in the struct */ > >> struct device sc_dev; > >> struct sel_host **sc_host; > >> }; > >> > >> struct sel_acpi_softc { > >> struct sel_softc sc; > >> struct acpi_softc *sc_acpi; > >> struct aml_node *sc_node; > >> > >> /* device access through bus space */ > >> bus_space_tag_t sc_iot; > >> bus_space_handle_t sc_ioh; > >> bus_addr_t sc_addr; > >> bus_size_t sc_size; > >> > >> struct sel_host *sc_host; > >> }; > >> > >> int sel_wait(bus_space_tag_t, bus_space_handle_t, bool); > >> > >> /* Autoconfiguration glue */ > >> int sel_acpi_match(struct device *, void *, void *); > >> void sel_acpi_attach(struct device *, struct device *, void *); > >> int sel_print(void *, const char *); > >> int sel_wd_cb(void *, int); > >> > >> /* functions to interact with the controller */ > >> void sel_write_wdog(bus_space_tag_t, bus_space_handle_t, int); > >> u_int8_t sel_read_wdog(bus_space_tag_t, bus_space_handle_t); > >> u_int8_t sel_read_status(bus_space_tag_t, bus_space_handle_t); > >> void sel_abort(bus_space_tag_t, bus_space_handle_t); > >> u_int32_t sel_read_boardid(bus_space_tag_t, bus_space_handle_t); > >> u_int32_t sel_read_mcversion(bus_space_tag_t, bus_space_handle_t); > >> u_int16_t sel_read_pciboardid(bus_space_tag_t, bus_space_handle_t); > >> u_int8_t sel_read_ledctl0(bus_space_tag_t, bus_space_handle_t); > >> void sel_write_ledctl0(bus_space_tag_t, bus_space_handle_t, u_int8_t); > >> u_int8_t sel_read_ledctl1(bus_space_tag_t, bus_space_handle_t); > >> void sel_write_ledctl1(bus_space_tag_t, bus_space_handle_t, u_int8_t); > >> u_int8_t sel_read_miscctl0(bus_space_tag_t, bus_space_handle_t); > >> u_int8_t sel_read_miscctl1(bus_space_tag_t, bus_space_handle_t); > >> void sel_read_modelno(bus_space_tag_t, bus_space_handle_t, char*); > >> void sel_read_serialno(bus_space_tag_t, bus_space_handle_t, char*); > >> void sel_read_configid(bus_space_tag_t, bus_space_handle_t, char*); > >> > >> /* macros to extract bits from the status register */ > >> #define EC_STATUS_IBF(status) (((status) >> 0x1) & 0x1) > >> #define EC_STATUS_OBF(status) (((status) & 0x1)) > >> #define EC_STATUS_BUSY(status) (((status) >> 0x4) & 0x1) > >> #define EC_STATUS_STATE(status) (((status) >> 0x6) & 0x3) > >> > >> struct cfattach sel_acpi_ca = { > >> sizeof(struct sel_acpi_softc), sel_acpi_match, sel_acpi_attach > >> }; > >> > >> struct cfdriver sel_cd = { > >> NULL, "sel", DV_DULL > >> }; > >> > >> const char* sel_hids[] = { "SEL0002" }; > >> > >> int sel_wait(bus_space_tag_t iot, bus_space_handle_t ioh, bool useobf) > >> { > >> uint32_t timeout = 0; > >> uint8_t status = 0; > >> > >> while (timeout < 50) { > >> status = bus_space_read_1(iot, ioh, SELWD_CMD); > >> if ((EC_STATUS_IBF(status) == 0x0) && > >> (EC_STATUS_BUSY(status) == 0x0) && > >> (EC_STATUS_STATE(status) != 0x3) && > >> ((EC_STATUS_OBF(status) == 0x0) || !useobf)) { > >> return 1; > >> } > >> delay(10); > >> ++timeout; > >> } > >> return 0; > >> } > >> > >> static __inline void > >> sel_conf_enable(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t cmd) > >> { > >> /* write the desired command to the command register */ > >> bus_space_write_1(iot, ioh, SELWD_CMD, cmd); > >> /* wait for controller to be ready */ > >> sel_wait(iot,ioh,0); > >> } > >> > >> static __inline u_int8_t > >> sel_conf_read(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t target) > >> { > >> /* write the target address to the data register */ > >> bus_space_write_1(iot, ioh, SELWD_DATA, target); > >> /* wait for controller to be ready */ > >> sel_wait(iot, ioh,1); > >> /* return the value from the data register */ > >> return (bus_space_read_1(iot, ioh, SELWD_DATA)); > >> } > >> > >> static __inline void > >> sel_conf_write(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t > >> target, > >> u_int8_t data) > >> { > >> /* write the target address to the data register */ > >> bus_space_write_1(iot, ioh, SELWD_DATA, target); > >> /* wait for controller to be ready */ > >> sel_wait(iot, ioh,0); > >> /* write the desired data to the data register */ > >> bus_space_write_1(iot, ioh, SELWD_DATA, data); > >> /* wait for controller to be ready */ > >> sel_wait(iot, ioh,0); > >> } > >> > >> int > >> sel_acpi_parse_resources(union acpi_resource *crs, void *arg) > >> { > >> struct sel_acpi_softc *sc = arg; > >> int type = AML_CRSTYPE(crs); > >> > >> printf(" SEL parse resource type (%d)", type); > >> > >> sc->sc_addr = crs->lr_m32fixed._bas; > >> sc->sc_size = crs->lr_m32fixed._len; > >> > >> return 0; > >> } > >> > >> int > >> sel_acpi_match(struct device *parent, void *match, void *aux) > >> { > >> struct acpi_attach_args *aaa = aux; > >> struct cfdata *cf = match; > >> > >> printf("Attempting to match SEL: "); > >> int res = acpi_matchhids(aaa, sel_hids, cf->cf_driver->cd_name); > >> printf("result (%d)\n", res); > >> return res; > >> } > >> > >> void > >> sel_acpi_attach(struct device *parent, struct device *self, void *aux) > >> { > >> struct acpi_attach_args *aaa = aux; > >> struct sel_acpi_softc *sc = (struct sel_acpi_softc *)self; > >> struct aml_value res; > >> > >> sc->sc_acpi = (struct acpi_softc *)parent; > >> sc->sc_node = aaa->aaa_node; > >> printf(": %s", sc->sc_node->name); > >> > >> if (aml_evalname(sc->ac_acpi, sc->sc_node, "_CRS", 0, NULL, &res)) { > >> printf(", can't find registers\n"); > >> return; > >> } > >> > >> aml_parse_resource(&res, sel_acpi_parse_resources, sc); > >> printf(" addr 0x%1x/0x%1x", sc->sc_addr, sc->sc_size); > >> if (sc->sc_addr == 0 || sc->sc_size == 0) { > >> printf("\n"); > >> return; > >> } > >> printf(" irq %d", sc->sc_irq); > >> > >> /* Match by device ID */ > >> sc->sc_iot = aaa->aaa_memt; > >> if (bus_space_map(sc->sc_iot, sc->sc_addr, sc->sc_size, 0, > >> &sc->sc_ioh)) { > >> printf(", can't map registers\n"); > >> return; > >> } > >> > >> /* read from bus space first */ > >> u_int8_t test = bus_space_read_1(sc->sc_iot, sc->sc_ioh, SELWD_DATA); > >> /* if 0xFF is returned, there is nothing at the specified address */ > >> if (test == 0xff) { > >> bus_space_unmap(sc->sc_iot, sc->sc_ioh, SELWD_IOSIZE); > >> return; > >> } > >> > >> /* read board ID */ > >> u_int32_t devid = sel_read_boardid(sc->sc_iot, sc->sc_ioh); > >> printf(": SEL Board ID (%x)",devid); > >> > >> /* read model number */ > >> char *model = malloc(sizeof(char)*16, M_DEVBUF, M_WAITOK | M_ZERO); > >> sel_read_modelno(sc->sc_iot, sc->sc_ioh, model); > >> printf(", Model No (%s)",model); > >> free(model, M_DEVBUF, 0); > >> > >> /* read serial number */ > >> char *serial = malloc(sizeof(char)*16, M_DEVBUF, M_WAITOK | M_ZERO); > >> sel_read_serialno(sc->sc_iot, sc->sc_ioh, serial); > >> printf(", Serial No (%s)\n",serial); > >> free(serial, M_DEVBUF, 0); > >> > >> /* write to Enabled and Alarm LEDs */ > >> /* turns Enabled green and Alarm off */ > >> u_int8_t led0 = 0x02; > >> sel_write_ledctl0(sc->sc_iot, sc->sc_ioh, led0); > >> > >> /* write to Aux LEDs */ > >> /* turns off the LEDs */ > >> u_int8_t led1 = 0x00; > >> sel_write_ledctl1(sc->sc_iot, sc->sc_ioh, led1); > >> > >> sc->sc.sc_host = &sc->sc_host; > >> //wdog_register(sel_wd_cb,sc); > >> } > >> > >> int > >> sel_wd_cb(void *arg, int period) > >> { > >> /* This function is called by the watchdog daemon */ > >> /* Get a reference to the software context */ > >> struct sel_softc *sc = arg; > >> if (period < 0) > >> period = 0; > >> /* The period value is in seconds, the watchdog value is in > >> twos-of-secs */ > >> int wd = period / 2; > >> /* write watchdog value */ > >> sel_write_wdog(sc->sc_iot, sc->sc_ioh, wd); > >> /* return the period back to the daemon */ > >> return period; > >> } > >> > >> void > >> sel_write_wdog(bus_space_tag_t iot, bus_space_handle_t ioh, int value) > >> { > >> /* Check to make sure that the state is idle */ > >> sel_abort(iot, ioh); > >> /* Write watchdog timer value */ > >> /* write the WRITECFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_WRITECFG); > >> /* write the watchdog value to the watchdog address */ > >> sel_conf_write(iot, ioh, SELWD_CFG_WATCHDOG, value); > >> } > >> > >> u_int8_t > >> sel_read_wdog(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the watchdog value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t wdog; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the WATCHDOG data value from the data register */ > >> wdog = sel_conf_read(iot, ioh, SELWD_CFG_WATCHDOG); > >> return wdog; > >> } > >> > >> u_int8_t > >> sel_read_status(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the command/status register */ > >> u_int8_t status = 0; > >> status = bus_space_read_1(iot, ioh, SELWD_CMD); > >> return status; > >> } > >> > >> void > >> sel_abort(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* write the abort value to the command/status register */ > >> u_int8_t status = 0; > >> /* first read the status register */ > >> status = bus_space_read_1(iot, ioh, SELWD_CMD); > >> /* if the state is IDLE return */ > >> if (EC_STATUS_STATE(status) == 0) > >> return; > >> uint32_t timeout = 0; > >> /* make sure status is 0 before proceeding */ > >> while (EC_STATUS_STATE(status) != 0 && timeout < 50) { > >> /* write the abort command */ > >> bus_space_write_1(iot, ioh, SELWD_CMD, SELWD_CMD_ABORT); > >> /* wait until controller isn't busy */ > >> sel_wait(iot, ioh, 0); > >> /* read the status register */ > >> status = bus_space_read_1(iot, ioh, SELWD_CMD); > >> delay(10); > >> /* increment timeout */ > >> ++timeout; > >> } > >> > >> } > >> > >> u_int32_t > >> sel_read_boardid(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the board ID from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg0, reg1, reg2, reg3; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the BOARID0 data value from the data register */ > >> reg0 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID0); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the BOARID1 data value from the data register */ > >> reg1 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID1); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the BOARID2 data value from the data register */ > >> reg2 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID2); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the BOARID3 data value from the data register */ > >> reg3 = sel_conf_read(iot, ioh, SELWD_CFG_BOARDID3); > >> > >> /* convert the 4 bytes into a 32 bit number */ > >> u_int32_t boardid = (reg3 << 24) | (reg2 << 16) | (reg1 << 8) | reg0; > >> return boardid; > >> } > >> > >> u_int32_t > >> sel_read_mcversion(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the MC version from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg0, reg1, reg2, reg3; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the VERSION0 data value from the data register */ > >> reg0 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION0); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the VERSION1 data value from the data register */ > >> reg1 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION1); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the VERSION2 data value from the data register */ > >> reg2 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION2); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the VERSION3 data value from the data register */ > >> reg3 = sel_conf_read(iot, ioh, SELWD_CFG_VERSION3); > >> > >> /* convert the 4 bytes into a 32 bit number */ > >> u_int32_t version = (reg3 << 24) | (reg2 << 16) | (reg1 << 8) | reg0; > >> return version; > >> } > >> > >> > >> u_int16_t > >> sel_read_pciboardid(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the PCI board ID from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg0, reg1; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the PCIBRDID0 data value from the data register */ > >> reg0 = sel_conf_read(iot, ioh, SELWD_CFG_PCIBRDID0); > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the PCIBRDID1 data value from the data register */ > >> reg1 = sel_conf_read(iot, ioh, SELWD_CFG_PCIBRDID1); > >> > >> /* convert the 2 bytes into a 16 bit number */ > >> u_int16_t boardid = (reg1 << 8) | reg0; > >> return boardid; > >> } > >> > >> u_int8_t > >> sel_read_miscctl0(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the misc control 0 value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the MISCCTL0 data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_MISCCTL0); > >> return reg; > >> } > >> > >> u_int8_t > >> sel_read_miscctl1(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the misc control 1 value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the MISCCTL1 data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_MISCCTL1); > >> return reg; > >> } > >> > >> u_int8_t > >> sel_read_ledctl0(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the LED control 0 value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the LEDCTRL0 data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_LEDCTRL0); > >> return reg; > >> } > >> > >> void > >> sel_write_ledctl0(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t > >> data) > >> { > >> /* write the LED control 0 value to the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> /* write the WRITECFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_WRITECFG); > >> /* write the LEDCTRL0 data value to the data register */ > >> sel_conf_write(iot, ioh, SELWD_CFG_LEDCTRL0, data); > >> } > >> > >> u_int8_t > >> sel_read_ledctl1(bus_space_tag_t iot, bus_space_handle_t ioh) > >> { > >> /* read the LED control 1 value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the LEDCTRL1 data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_LEDCTRL1); > >> return reg; > >> } > >> > >> > >> void > >> sel_write_ledctl1(bus_space_tag_t iot, bus_space_handle_t ioh, u_int8_t > >> data) > >> { > >> /* write the LED control 1 value to the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> /* write the WRITECFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_WRITECFG); > >> /* write the LEDCTRL1 data value to the data register */ > >> sel_conf_write(iot, ioh, SELWD_CFG_LEDCTRL1, data); > >> } > >> > >> void > >> sel_read_modelno(bus_space_tag_t iot, bus_space_handle_t ioh, char* model) > >> { > >> /* read the MODEL NUMBER value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> int i = 0; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the MODELNO data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_MODELNO); > >> while (reg != 0 && i < 15) { > >> model[i] = reg; > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the MODELNO data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_MODELNO); > >> i++; > >> } > >> > >> } > >> > >> void > >> sel_read_serialno(bus_space_tag_t iot, bus_space_handle_t ioh, char* > >> serial) > >> { > >> /* read the SERIAL NUMBER value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> int i = 0; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the SERIALNO data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_SERIALNO); > >> while (reg != 0 && i < 15) { > >> serial[i] = reg; > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the SERIALNO data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_SERIALNO); > >> i++; > >> } > >> > >> } > >> > >> void > >> sel_read_configid(bus_space_tag_t iot, bus_space_handle_t ioh, char* > >> configid) > >> { > >> /* read the CONFIGURATION ID value from the controller */ > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> u_int8_t reg; > >> int i = 0; > >> > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the CONFIGID data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_CONFIGID); > >> while (reg != 0 && i < 15) { > >> configid[i] = reg; > >> /* make sure status is 0 before proceeding */ > >> sel_abort(iot, ioh); > >> /* write the READCFG command to the command register */ > >> sel_conf_enable(iot, ioh, SELWD_CMD_READCFG); > >> /* read the CONFIGID data value from the data register */ > >> reg = sel_conf_read(iot, ioh, SELWD_CFG_CONFIGID); > >> i++; > >> } > >> > >> } > > > >> /* > >> * > >> * Definitions for the SEL Watchdog device. > >> * > >> */ > >> > >> #define SELWD_DATA 0x00 > >> #define SELWD_CMD 0x01 > >> #define SELWD_IOSIZE 0x02 > >> > >> /* Valid Device IDs */ > >> #define SELWD_DEV_3355 "3355" > >> #define SELWD_DEV_3360 "3360" > >> > >> /* Config Register Map */ > >> #define SELWD_CFG_BOARDID0 0x00 > >> #define SELWD_CFG_BOARDID1 0x01 > >> #define SELWD_CFG_BOARDID2 0x02 > >> #define SELWD_CFG_BOARDID3 0x03 > >> #define SELWD_CFG_VERSION0 0x0c > >> #define SELWD_CFG_VERSION1 0x0d > >> #define SELWD_CFG_VERSION2 0x0e > >> #define SELWD_CFG_VERSION3 0x0f > >> #define SELWD_CFG_LEDCTRL0 0x10 > >> #define SELWD_CFG_LEDCTRL1 0x11 > >> #define SELWD_CFG_JUMPER0 0x20 > >> #define SELWD_CFG_WATCHDOG 0x30 > >> #define SELWD_CFG_SERIALCTL 0x40 > >> #define SELWD_CFG_MISCCTL0 0x42 > >> #define SELWD_CFG_MISCCTL1 0x43 > >> #define SELWD_CFG_SERIALNO 0x50 > >> #define SELWD_CFG_MODELNO 0x51 > >> #define SELWD_CFG_CONFIGID 0x52 > >> #define SELWD_CFG_PCIBRDID0 0x70 > >> #define SELWD_CFG_PCIBRDID1 0x71 > >> > >> /* Command functions */ > >> #define SELWD_CMD_WRITECFG 0x10 > >> #define SELWD_CMD_WRITEDIAG 0x11 > >> #define SELWD_CMD_READCFG 0x20 > >> #define SELWD_CMD_READDIAG 0x21 > >> #define SELWD_CMD_ABORT 0x00 > > > > > > -- > Chase Davis
