It looks like other devices have: Name (_HID, EisaId ("PNP0501")
instead of: Name (_HID, "SEL0002")I'm not sure what the significance of EisaId is, but it doesn't show up for our device. On Wed, May 4, 2016 at 9:34 AM, Chase Davis <[email protected]> wrote: > Mike, > > Yes I think that it is shown correctly. See attached file. > > Thanks, > Chase > > On Wed, May 4, 2016 at 8:28 AM, Mike Larkin <[email protected]> wrote: >> 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 > > > > -- > Chase Davis -- Chase Davis
