예제 #1
0
static int
aibs_attach(struct device *dev)
{
	struct aibs_softc	*sc;

	sc = device_get_softc(dev);
	sc->sc_dev = dev;
	sc->sc_ah = acpi_get_handle(dev);

	strlcpy(sc->sc_sensordev.xname, device_get_nameunit(dev),
	    sizeof(sc->sc_sensordev.xname));

	aibs_attach_sif(sc, SENSOR_VOLTS_DC);
	aibs_attach_sif(sc, SENSOR_TEMP);
	aibs_attach_sif(sc, SENSOR_FANRPM);

	if (sc->sc_sensordev.sensors_count == 0) {
		device_printf(dev, "no sensors found\n");
		return ENXIO;
	}

	sensor_task_register(sc, aibs_refresh, 5);

	sensordev_install(&sc->sc_sensordev);
	return 0;
}
예제 #2
0
void
lisa_attach(struct device *parent, struct device *self, void *aux)
{
	struct lisa_softc *sc = (struct lisa_softc *)self;
	struct i2c_attach_args *ia = aux;
	int i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	printf(": %s", ia->ia_name);

	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	for (i = 0; i < LISA_NUM_AXIS; i++) {
		strlcpy(sc->sc_sensors[i].desc, lisa_axis[i].name,
		    sizeof(sc->sc_sensors[i].desc));
		sc->sc_sensors[i].type = SENSOR_INTEGER;
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensors[i]);
	}

	if (sensor_task_register(sc, lisa_refresh, 1) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	sensordev_install(&sc->sc_sensordev);
	printf("\n");
}
예제 #3
0
파일: lm78.c 프로젝트: avsm/openbsd-xen-sys
void
lm_attach(struct lm_softc *sc)
{
	u_int i, config;

	for (i = 0; i < sizeof(lm_chips) / sizeof(lm_chips[0]); i++)
		if (lm_chips[i].chip_match(sc))
			break;

	/* No point in doing anything if we don't have any sensors. */
	if (sc->numsensors == 0)
		return;

	if (sensor_task_register(sc, lm_refresh, 5)) {
		printf("%s: unable to register update task\n",
		    sc->sc_dev.dv_xname);
		return;
	}

	/* Start the monitoring loop */
	config = sc->lm_readreg(sc, LM_CONFIG);
	sc->lm_writereg(sc, LM_CONFIG, config | 0x01);

	/* Add sensors */
	for (i = 0; i < sc->numsensors; ++i)
		sensor_attach(&sc->sensordev, &sc->sensors[i]);
	sensordev_install(&sc->sensordev);
}
예제 #4
0
파일: sdtemp.c 프로젝트: ajinkya93/OpenBSD
void
sdtemp_attach(struct device *parent, struct device *self, void *aux)
{
	struct sdtemp_softc *sc = (struct sdtemp_softc *)self;
	struct i2c_attach_args *ia = aux;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	printf(": %s", ia->ia_name);

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[JCTEMP_TEMP].type = SENSOR_TEMP;

	if (sensor_task_register(sc, sdtemp_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[0]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #5
0
파일: asmc.c 프로젝트: ajinkya93/OpenBSD
void
asmc_attach(struct device *parent, struct device *self, void *aux)
{
	struct asmc_softc *sc = (struct asmc_softc *)self;
	struct isa_attach_args *ia = aux;

	if (bus_space_map(ia->ia_iot, ia->ia_iobase, ia->ia_iosize, 0,
	    &sc->sc_ioh)) {
		printf(": can't map i/o space\n");
		return;
	}
	sc->sc_iot = ia->ia_iot;

	printf("\n");

	strlcpy(sc->sc_sensor_dev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensor_dev.xname));

	if (asmc_init(sc)) {
		printf("%s: unable to initialize\n", sc->sc_dev.dv_xname);
		bus_space_unmap(ia->ia_iot, ia->ia_iobase, ASMC_IOSIZE);
		return;
	}

	if (!(sc->sc_sensor_task = sensor_task_register(sc, asmc_update, 8))) {
		printf("%s: unable to register task\n", sc->sc_dev.dv_xname);
		bus_space_unmap(ia->ia_iot, ia->ia_iobase, ASMC_IOSIZE);
		return;
	}
	sensordev_install(&sc->sc_sensor_dev);
}
예제 #6
0
void
owctr_attach(struct device *parent, struct device *self, void *aux)
{
	struct owctr_softc *sc = (struct owctr_softc *)self;
	struct onewire_attach_args *oa = aux;

	sc->sc_onewire = oa->oa_onewire;
	sc->sc_rom = oa->oa_rom;

	/* Initialize counter sensors */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
		sizeof(sc->sc_sensordev.xname));
	sc->sc_counterA.type = SENSOR_INTEGER;
	snprintf(sc->sc_counterA.desc, sizeof(sc->sc_counterA.desc),
		"Counter A sn %012llx", ONEWIRE_ROM_SN(oa->oa_rom));
	sensor_attach(&sc->sc_sensordev, &sc->sc_counterA);
	sc->sc_counterB.type = SENSOR_INTEGER;
	snprintf(sc->sc_counterB.desc, sizeof(sc->sc_counterB.desc),
		"Counter B sn %012llx", ONEWIRE_ROM_SN(oa->oa_rom));
	sensor_attach(&sc->sc_sensordev, &sc->sc_counterB);

	sc->sc_sensortask = sensor_task_register(sc, owctr_update, 10);
	if (sc->sc_sensortask == NULL) {
		printf(": unable to register update task\n");
		return;
	}

	sensordev_install(&sc->sc_sensordev);

	rw_init(&sc->sc_lock, sc->sc_dev.dv_xname);
	printf("\n");
}
예제 #7
0
void
utwitch_attach(struct device *parent, struct device *self, void *aux)
{
	struct utwitch_softc *sc = (struct utwitch_softc *)self;
	struct usb_attach_arg *uaa = aux;
	struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa;
	struct usbd_device *dev = uha->parent->sc_udev;
	int size, repid, err;
	void *desc;

	sc->sc_udev = dev;
	sc->sc_hdev.sc_intr = utwitch_intr;
	sc->sc_hdev.sc_parent = uha->parent;
	sc->sc_hdev.sc_report_id = uha->reportid;

	uhidev_get_report_desc(uha->parent, &desc, &size);
	repid = uha->reportid;
	sc->sc_ilen = hid_report_size(desc, size, hid_input, repid);
	sc->sc_olen = hid_report_size(desc, size, hid_output, repid);
	sc->sc_flen = hid_report_size(desc, size, hid_feature, repid);

	err = uhidev_open(&sc->sc_hdev);
	if (err) {
		printf("utwitch_open: uhidev_open %d\n", err);
		return;
	}
	sc->sc_ibuf = malloc(sc->sc_ilen, M_USBDEV, M_WAITOK);

	printf("\n");


	/* attach sensor */
	strlcpy(sc->sc_sensordev.xname, sc->sc_hdev.sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	/* add BBU sensor */
	sc->sc_sensor_val.type = SENSOR_INTEGER;
	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor_val);
	strlcpy(sc->sc_sensor_val.desc, "BBU",
		sizeof(sc->sc_sensor_val.desc));

	/* add BBU delta sensor */
	sc->sc_sensor_delta.type = SENSOR_INTEGER;
	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor_delta);
	strlcpy(sc->sc_sensor_delta.desc, "mBBU/sec",
		sizeof(sc->sc_sensor_delta.desc));

	sc->sc_sensortask = sensor_task_register(sc, utwitch_refresh, UPDATE_TICK);
	if (sc->sc_sensortask == NULL) {
		printf(", unable to register update task\n");
		return;
	}
	sensordev_install(&sc->sc_sensordev);

	DPRINTF(("utwitch_attach: complete\n"));

	/* init device */ /* XXX */
	utwitch_set_mode(sc, 0);
}
예제 #8
0
void
safte_attach(struct device *parent, struct device *self, void *aux)
{
	struct safte_softc		*sc = (struct safte_softc *)self;
	struct scsi_attach_args		*sa = aux;
	int				i = 0;

	sc->sc_link = sa->sa_sc_link;
	sa->sa_sc_link->device_softc = sc;
	rw_init(&sc->sc_lock, DEVNAME(sc));

	printf("\n");

	sc->sc_encbuf = NULL;
	sc->sc_nsensors = 0;
#if NBIO > 0
	sc->sc_nslots = 0;
#endif

	if (safte_read_config(sc) != 0) {
		printf("%s: unable to read enclosure configuration\n",
		    DEVNAME(sc));
		return;
	}

	if (sc->sc_nsensors > 0) {
		sc->sc_sensortask = sensor_task_register(sc,
		    safte_read_encstat, 10);
		if (sc->sc_sensortask == NULL) {
			printf("%s: unable to register update task\n",
			    DEVNAME(sc));
			sc->sc_nsensors = sc->sc_ntemps = 0;
			free(sc->sc_sensors, M_DEVBUF);
		} else {
			for (i = 0; i < sc->sc_nsensors; i++)
				sensor_attach(&sc->sc_sensordev, 
				    &sc->sc_sensors[i].se_sensor);
			sensordev_install(&sc->sc_sensordev);
		}
	}

#if NBIO > 0
	if (sc->sc_nslots > 0 &&
	    bio_register(self, safte_ioctl) != 0) {
		printf("%s: unable to register ioctl with bio\n", DEVNAME(sc));
		sc->sc_nslots = 0;
	} else
		i++;
#endif

	if (i) /* if we're doing something, then preinit encbuf and sensors */
		safte_read_encstat(sc);
	else {
		free(sc->sc_encbuf, M_DEVBUF);
		sc->sc_encbuf = NULL;
	}
}
예제 #9
0
void
ykbec_attach(device_t parent, device_t self, void *aux)
{
	struct isa_attach_args *ia = aux;
	struct ykbec_softc *sc = device_private(self);
	int i;

	sc->sc_iot = ia->ia_iot;
	if (bus_space_map(sc->sc_iot, ia->ia_iobase, ia->ia_iosize, 0,
	    &sc->sc_ioh)) {
		aprint_error(": couldn't map I/O space");
		return;
	}

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, device_xname(self),
	    sizeof(sc->sc_sensordev.xname));
	if (sensor_task_register(sc, ykbec_refresh, 5) == NULL) {
		aprint_error(", unable to register update task\n");
		return;
	}

#ifdef DEBUG
	ykbec_print_bat_info(sc);
#endif
	aprint_normal("\n");

	for (i = 0; i < YKBEC_NSENSORS; i++) {
		sc->sc_sensor[i].type = ykbec_table[i].type; 
		if (ykbec_table[i].desc) 
			strlcpy(sc->sc_sensor[i].desc, ykbec_table[i].desc,
			    sizeof(sc->sc_sensor[i].desc));
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	}

	sensordev_install(&sc->sc_sensordev);

#if NAPM > 0
	/* make sure we have the apm state initialized before apm attaches */
	ykbec_refresh(sc);
	apm_setinfohook(ykbec_apminfo);
#endif
#if NPCKBD > 0 || NHIDKBD > 0
	timeout_set(&sc->sc_bell_tmo, ykbec_bell_stop, sc);
#if NPCKBD > 0
	pckbd_hookup_bell(ykbec_bell, sc);
#endif
#if NHIDKBD > 0
	hidkbd_hookup_bell(ykbec_bell, sc);
#endif
#endif
	ykbec_sc = sc;
}
예제 #10
0
void
maxtmp_attach(struct device *parent, struct device *self, void *aux)
{
	struct maxtmp_softc *sc = (struct maxtmp_softc *)self;
	struct i2c_attach_args *ia = aux;
	int i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	if (strcmp(ia->ia_name, "max6642") == 0) {
		sc->sc_temp_invalid[0] = MAX6642_TEMP_INVALID;
		sc->sc_temp_invalid[1] = MAX6642_TEMP_INVALID;
		sc->sc_temp2_mask = MAX6642_TEMP2_MASK;
	} else if (strcmp(ia->ia_name, "max6690") == 0 ||
	    strcmp(ia->ia_name, "max6657") == 0 ||
	    strcmp(ia->ia_name, "max6658") == 0 ||
	    strcmp(ia->ia_name, "max6659") == 0) {
		sc->sc_temp_invalid[0] = MAX6690_TEMP_INVALID;
		sc->sc_temp_invalid[1] = MAX6690_TEMP_INVALID2;
		sc->sc_temp2_mask = MAX6690_TEMP2_MASK;
	} else {
		sc->sc_temp_invalid[0] = LM90_TEMP_INVALID;
		sc->sc_temp_invalid[1] = LM90_TEMP_INVALID;
		sc->sc_temp2_mask = LM90_TEMP2_MASK;
	}
	printf(": %s", ia->ia_name);

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[MAXTMP_INT].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[MAXTMP_INT].desc, "Internal",
	    sizeof(sc->sc_sensor[MAXTMP_INT].desc));

	sc->sc_sensor[MAXTMP_EXT].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[MAXTMP_EXT].desc, "External",
	    sizeof(sc->sc_sensor[MAXTMP_EXT].desc));

	if (sensor_task_register(sc, maxtmp_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	for (i = 0; i < MAXTMP_NUM_SENSORS; i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #11
0
void
admtt_attach(struct device *parent, struct device *self, void *aux)
{
	struct admtt_softc *sc = (struct admtt_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data;
	int i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	cmd = ADM1031_FANC;
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		printf(", unable to read fan setting\n");
		return;
	}
	sc->sc_fanmul = 11250/8 * (1 << ADM1024_FANC_VAL(data)) * 60;

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[ADMTT_INT].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[ADMTT_INT].desc, "Internal",
	    sizeof(sc->sc_sensor[ADMTT_INT].desc));

	sc->sc_sensor[ADMTT_EXT].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[ADMTT_EXT].desc, "External",
	    sizeof(sc->sc_sensor[ADMTT_EXT].desc));

	sc->sc_sensor[ADMTT_EXT2].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[ADMTT_EXT2].desc, "External",
	    sizeof(sc->sc_sensor[ADMTT_EXT2].desc));

	sc->sc_sensor[ADMTT_FAN].type = SENSOR_FANRPM;

	sc->sc_sensor[ADMTT_FAN2].type = SENSOR_FANRPM;

	if (sensor_task_register(sc, admtt_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	for (i = 0; i < ADMTT_NUM_SENSORS; i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #12
0
파일: sch311x.c 프로젝트: SylvestreG/bitrig
void
schsio_hwm_init(struct schsio_softc *sc)
{
	int i;

	/* Set up sensors */
	for (i = SCHSIO_SENSOR_FAN1; i < SCHSIO_SENSOR_FAN3 + 1; i++)
		sc->sc_sensor[i].type = SENSOR_FANRPM;

	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT1].desc, "+2.5V",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT1].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT2].desc, "+1.5V (Vccp)",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT2].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT3].desc, "+3.3V (VCC)",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT3].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT4].desc, "+5V",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT4].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT5].desc, "+12V",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT5].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT6].desc, "+3.3V (VTR)",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT6].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_VOLT7].desc, "+3V (Vbat)",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_VOLT7].desc));
	for (i = SCHSIO_SENSOR_VOLT1; i < SCHSIO_SENSOR_VOLT7 + 1; i++)
		sc->sc_sensor[i].type = SENSOR_VOLTS_DC;

	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_TEMP1].desc, "Internal",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_TEMP1].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_TEMP2].desc, "Remote",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_TEMP2].desc));
	strlcpy(sc->sc_sensor[SCHSIO_SENSOR_TEMP3].desc, "Remote",
	    sizeof(sc->sc_sensor[SCHSIO_SENSOR_TEMP3].desc));
	for (i = SCHSIO_SENSOR_TEMP1; i < SCHSIO_SENSOR_TEMP3 + 1; i++)
		sc->sc_sensor[i].type = SENSOR_TEMP;

	strlcpy(sc->sc_sensordev.xname, DEVNAME(sc),
	    sizeof(sc->sc_sensordev.xname));

	for (i = 0; i < SCHSIO_SENSORS; i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);

	if (sensor_task_register(sc, schsio_hwm_update,
	    SCHSIO_HWM_INTERVAL) == NULL) {
		printf(": unable to register update task");
		return;
	}
	sensordev_install(&sc->sc_sensordev);
}
예제 #13
0
void
thmc_attach(struct device *parent, struct device *self, void *aux)
{
	struct thmc_softc *sc = (struct thmc_softc *)self;
	struct i2c_attach_args *ia = aux;
	int numsensors = THMC_NUM_SENSORS;
	int i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	printf(": %s", ia->ia_name);

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[THMC_TEMP0].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[THMC_TEMP0].desc, "Internal",
	    sizeof(sc->sc_sensor[THMC_TEMP0].desc));

	sc->sc_sensor[THMC_TEMP1].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[THMC_TEMP1].desc, "External",
	    sizeof(sc->sc_sensor[THMC_TEMP1].desc));

	if (strcmp(ia->ia_name, "adm1022") == 0) {
		/* Only the adm1022 has a THMC50_TEMP2 sensor */
		sc->sc_sensor[THMC_TEMP2].type = SENSOR_TEMP;
		strlcpy(sc->sc_sensor[THMC_TEMP2].desc, "External",
		    sizeof(sc->sc_sensor[THMC_TEMP2].desc));
	} else {
		sc->sc_sensor[THMC_TEMP2].type = -1;
		numsensors--;
	}

	if (sensor_task_register(sc, thmc_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	for (i = 0; i < numsensors; i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #14
0
파일: km.c 프로젝트: wan721/DragonFlyBSD
static int
km_attach(struct device *dev)
{
	struct km_softc	*sc;

	sc = device_get_softc(dev);
	sc->sc_dev = dev;

	strlcpy(sc->sc_sensordev.xname, device_get_nameunit(dev),
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor.type = SENSOR_TEMP;
	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);

	sensor_task_register(sc, km_refresh, 5);

	sensordev_install(&sc->sc_sensordev);
	return 0;
}
예제 #15
0
파일: aps.c 프로젝트: AhmadTux/DragonFlyBSD
static int
aps_resume(struct device *dev)
{
	struct aps_softc *sc = device_get_softc(dev);
	unsigned char iobuf[16];

	/*
	 * Redo the init sequence on resume, because APS is
	 * as forgetful as it is deaf.
	 */

	/* get APS mode */
	iobuf[APS_CMD] = 0x13;
	if (aps_do_io(sc->sc_iores, iobuf, APS_WRITE_0, APS_READ_1)
	    || aps_init(sc->sc_iores)) {
		device_printf(sc->sc_dev, "failed to wake up\n");
		return EIO;
	}

	sensor_task_register(sc, aps_refresh, 1);
	return 0;
}
예제 #16
0
파일: km.c 프로젝트: AhmadTux/DragonFlyBSD
static int
km_attach(struct device *dev)
{
	struct km_softc	*sc;

	sc = device_get_softc(dev);
	sc->sc_dev = dev;

	strlcpy(sc->sc_sensordev.xname, device_get_nameunit(dev),
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor.type = SENSOR_TEMP;
	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);

	if (sensor_task_register(sc, km_refresh, 5)) {
		device_printf(dev, "unable to register update task\n");
		return ENXIO;
	}

	sensordev_install(&sc->sc_sensordev);
	return 0;
}
예제 #17
0
파일: it.c 프로젝트: wan721/DragonFlyBSD
int
it_attach(struct device *dev)
{
	struct it_softc *sc = device_get_softc(dev);
	int i;
	u_int8_t cr;

	sc->sc_dev = dev;
	sc->sc_iores = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->sc_iorid,
	    0ul, ~0ul, 8, RF_ACTIVE);
	if (sc->sc_iores == NULL) {
		device_printf(dev, "can't map i/o space\n");
		return 1;
	}
	sc->sc_iot = rman_get_bustag(sc->sc_iores);
	sc->sc_ioh = rman_get_bushandle(sc->sc_iores);

	sc->numsensors = IT_NUM_SENSORS;

	it_setup_fan(sc, 0, 3);
	it_setup_volt(sc, 3, 9);
	it_setup_temp(sc, 12, 3);

	sensor_task_register(sc, it_refresh, 5);

	/* Activate monitoring */
	cr = it_readreg(sc, ITD_CONFIG);
	cr |= 0x01 | 0x08;
	it_writereg(sc, ITD_CONFIG, cr);

	/* Initialize sensors */
	strlcpy(sc->sensordev.xname, device_get_nameunit(sc->sc_dev),
	    sizeof(sc->sensordev.xname));
	for (i = 0; i < sc->numsensors; ++i)
		sensor_attach(&sc->sensordev, &sc->sensors[i]);
	sensordev_install(&sc->sensordev);

	return 0;
}
예제 #18
0
파일: km.c 프로젝트: sofuture/bitrig
void
km_attach(struct device *parent, struct device *self, void *aux)
{
	struct km_softc		*sc = (struct km_softc *)self;
	struct pci_attach_args	*pa = aux;

	sc->sc_pc = pa->pa_pc;
	sc->sc_pcitag = pa->pa_tag;

	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor.type = SENSOR_TEMP;
	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);

	if (sensor_task_register(sc, km_refresh, 5) == NULL) {
		printf(": unable to register update task\n");
		return;
	}

	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #19
0
파일: lm75.c 프로젝트: ajinkya93/OpenBSD
void
lmtemp_attach(struct device *parent, struct device *self, void *aux)
{
	struct lmtemp_softc *sc = (struct lmtemp_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	printf(": %s", ia->ia_name);

	/* If in SHUTDOWN mode, wake it up */
	iic_acquire_bus(sc->sc_tag, 0);
	cmd = LM75_REG_CONFIG;
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		iic_release_bus(sc->sc_tag, 0);
		printf(", fails to respond\n");
		return;
	}
	if (data & LM75_CONFIG_SHUTDOWN) {
		data &= ~LM75_CONFIG_SHUTDOWN;
		if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
		    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
			printf(", cannot wake up\n");
			iic_release_bus(sc->sc_tag, 0);
			return;
		}
		printf(", woken up");
	}
	iic_release_bus(sc->sc_tag, 0);

	sc->sc_model = LM_MODEL_LM75;
	sc->sc_bits = 9;
	sc->sc_ratio = 500000;		/* 0.5 degC for LSB */
	if (strcmp(ia->ia_name, "lm77") == 0) {
		sc->sc_model = LM_MODEL_LM77;
		sc->sc_bits = 13;
	} else if (strcmp(ia->ia_name, "lm76") == 0) {
		sc->sc_model = LM_MODEL_LM76;
		sc->sc_bits = 13;
		sc->sc_ratio = 62500;	/* 0.0625 degC for LSB */
	} else if (strcmp(ia->ia_name, "ds1775") == 0) {
		sc->sc_model = LM_MODEL_DS1775;
		//sc->sc_bits = DS1755_CONFIG_RESOLUTION(data);
	} else if (strcmp(ia->ia_name, "lm75a") == 0) {
		/* For simplicity's sake, treat the LM75A as an LM75 */
		sc->sc_model = LM_MODEL_LM75A;
	}

	printf("\n");

	/* Initialize sensor data */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));
	sc->sc_sensor.type = SENSOR_TEMP;

	/* Hook into the hw.sensors sysctl */
	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);
	sensordev_install(&sc->sc_sensordev);

	sensor_task_register(sc, lmtemp_refresh_sensor_data, LM_POLLTIME);
}
예제 #20
0
void
pcfadc_attach(struct device *parent, struct device *self, void *aux)
{
	struct pcfadc_softc *sc = (struct pcfadc_softc *)self;
	u_char chanuse[PCF8591_CHANNELS * 4], desc[PCF8591_CHANNELS * 32];
	u_char *cp;
	u_int8_t junk[PCF8591_CHANNELS + 1];
	u_int32_t transinfo[PCF8591_CHANNELS * 4];
	struct i2c_attach_args *ia = aux;
	int dlen, clen, tlen, node = *(int *)ia->ia_cookie;
	u_int i;

	if ((dlen = OF_getprop(node, "channels-description", desc,
	    sizeof(desc))) < 0) {
		printf(": couldn't find \"channels-description\" property\n");
		return;
	}
	if (dlen > sizeof(desc) || desc[dlen - 1] != '\0') {
		printf(": bad \"channels-description\" property\n");
		return;
	}
	if ((clen = OF_getprop(node, "channels-in-use", chanuse,
	    sizeof(chanuse))) < 0) {
		printf(": couldn't find \"channels-in-use\" property\n");
		return;
	}
	if ((clen % 4) != 0) {
		printf(": invalid \"channels-in-use\" length %d\n", clen);
		return;
	}
	sc->sc_nchan = clen / 4;
	if (sc->sc_nchan > PCF8591_CHANNELS) {
		printf(": invalid number of channels (%d)\n", sc->sc_nchan);
		return;
	}

	if ((tlen = OF_getprop(node, "tables", sc->sc_xlate,
	    sizeof(sc->sc_xlate))) < 0) {
		printf(": couldn't find \"tables\" property\n");
		return;
	}
	/* We only support complete, single width tables */
	if (tlen != 256) {
		printf(": invalid \"tables\" length %d\n", tlen);
		return;
	}

	if ((tlen = OF_getprop(node, "translation", transinfo,
	    sizeof(transinfo))) < 0) {
		printf(": couldn't find \"translation\" property\n");
		return;
	}
	if (tlen != (sc->sc_nchan * 4 * 4)) {
		printf(": invalid \"translation\" length %d\n", tlen);
		return;
	}

	cp = desc;
	for (i = 0; i < sc->sc_nchan; i++) {
		struct pcfadc_channel *chp = &sc->sc_channels[i];

		chp->chan_sensor.type = SENSOR_TEMP;

		if (cp >= desc + dlen) {
			printf(": invalid \"channels-description\"\n");
			return;
		}
		strlcpy(chp->chan_sensor.desc, cp,
		    sizeof(chp->chan_sensor.desc));
		cp += strlen(cp) + 1;

		/*
		 * We only support input temperature channels, with
		 * valid channel numbers, and basic (unscaled) translation
		 * 
		 * XXX TODO: support voltage (type 2) channels and type 4
		 * (scaled) translation tables
		 */
		if (chanuse[(i * 4)] > PCF8591_CHANNELS || /* channel # */
		    chanuse[(i * 4) + 1] != 0 ||	/* dir == input */
		    chanuse[(i * 4) + 2] != 1 ||	/* type == temp */
		    transinfo[(i * 4)] != 3 ||		/* xlate == table */
		    transinfo[(i * 4) + 2] != 0 ||	/* no xlate offset */
		    transinfo[(i * 4) + 3] != 0x100) {	/* xlate tbl length */
			printf(": unsupported sensor %d\n", i);
			return;
		}
		chp->chan_num = chanuse[(i * 4)];
	}

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	iic_acquire_bus(sc->sc_tag, 0);

	/* Try a read now, so we can fail if it doesn't work */
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP, sc->sc_addr,
	    NULL, 0, junk, sc->sc_nchan + 1, 0)) {
		printf(": read failed\n");
		iic_release_bus(sc->sc_tag, 0);
		return;
	}

	iic_release_bus(sc->sc_tag, 0);

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	for (i = 0; i < sc->sc_nchan; i++)
		if (!(sc->sc_channels[i].chan_sensor.flags & SENSOR_FINVALID))
			sensor_attach(&sc->sc_sensordev, 
			    &sc->sc_channels[i].chan_sensor);

	if (sensor_task_register(sc, pcfadc_refresh, 5)) {
		printf(": unable to register update task\n");
		return;
	}

	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #21
0
void
adc_attach(struct device *parent, struct device *self, void *aux)
{
	struct adc_softc *sc = (struct adc_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data;
	int nsens = 0, i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	printf(": %s", ia->ia_name);

	sc->sc_chip = 0;
	if (strcmp(ia->ia_name, "ad7417") == 0)
		sc->sc_chip = 7417;
	if (strcmp(ia->ia_name, "ad7418") == 0)
		sc->sc_chip = 7418;

	if (sc->sc_chip != 0) {
		cmd = AD741X_CONFIG2;
		data = 0;
		if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
		    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
			printf(", config2 reset failed\n");
			return;
		}
	}

	cmd = AD741X_CONFIG;
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		printf(", config reset failed\n");
		return;
	}
	data &= 0xfe;
	if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		printf(", config reset failed\n");
		return;
	}
	sc->sc_config = data;

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[ADC_TEMP].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[ADC_TEMP].desc, "Internal",
	    sizeof(sc->sc_sensor[ADC_TEMP].desc));
	nsens = 1;

	if (sc->sc_chip == 7417 || sc->sc_chip == 7418) {
		sc->sc_sensor[ADC_ADC0].type = SENSOR_INTEGER;
		nsens++;
	}
	if (sc->sc_chip == 7417 || sc->sc_chip == 7418) {
		sc->sc_sensor[ADC_ADC1].type = SENSOR_INTEGER;
		sc->sc_sensor[ADC_ADC2].type = SENSOR_INTEGER;
		sc->sc_sensor[ADC_ADC3].type = SENSOR_INTEGER;
		nsens += 3;
	}

	if (sensor_task_register(sc, adc_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[0]);
	if (sc->sc_chip == 7417 || sc->sc_chip == 7418)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[1]);
	if (sc->sc_chip == 7417)
		for (i = 2; i < nsens; i++)
			sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #22
0
파일: pca9554.c 프로젝트: SylvestreG/bitrig
void
pcagpio_attach(struct device *parent, struct device *self, void *aux)
{
	struct pcagpio_softc *sc = (struct pcagpio_softc *)self;
	struct i2c_attach_args *ia = aux;
	struct gpiobus_attach_args gba;
	int outputs = 0, i, port, bit;
	u_int8_t data[PCAGPIO_NPORTS];

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	if (strcmp(ia->ia_name, "pca9555") == 0) {
		/* The pca9555 has two 8 bit ports */
		sc->sc_regs[0][PCAGPIO_IN] = PCA9555_IN0;
		sc->sc_regs[0][PCAGPIO_OUT] = PCA9555_OUT0;
		sc->sc_regs[0][PCAGPIO_POLARITY] = PCA9555_POLARITY0;
		sc->sc_regs[0][PCAGPIO_CONFIG] = PCA9555_CONFIG0;
		sc->sc_regs[1][PCAGPIO_IN] = PCA9555_IN1;
		sc->sc_regs[1][PCAGPIO_OUT] = PCA9555_OUT1;
		sc->sc_regs[1][PCAGPIO_POLARITY] = PCA9555_POLARITY1;
		sc->sc_regs[1][PCAGPIO_CONFIG] = PCA9555_CONFIG1;
		sc->sc_npins = 16;
	} else {
		/* All other supported devices have one 8 bit port */
		sc->sc_regs[0][PCAGPIO_IN] = PCA9554_IN;
		sc->sc_regs[0][PCAGPIO_OUT] = PCA9554_OUT;
		sc->sc_regs[0][PCAGPIO_POLARITY] = PCA9554_POLARITY;
		sc->sc_regs[0][PCAGPIO_CONFIG] = PCA9554_CONFIG;
		sc->sc_npins = 8;
	}
	if (pcagpio_init(sc, 0, &data[0]) != 0)
		return;
	if (sc->sc_npins > 8 && pcagpio_init(sc, 1, &data[1]) != 0)
		return;

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	for (i = 0; i < sc->sc_npins; i++) {
		port = PCAGPIO_PORT(i);
		bit = PCAGPIO_BIT(i);
		sc->sc_sensor[i].type = SENSOR_INDICATOR;
		if ((sc->sc_control[port] & bit) == 0) {
			strlcpy(sc->sc_sensor[i].desc, "out",
			    sizeof(sc->sc_sensor[i].desc));
			outputs++;
		} else
			strlcpy(sc->sc_sensor[i].desc, "in",
			    sizeof(sc->sc_sensor[i].desc));
	}

	if (sensor_task_register(sc, pcagpio_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

#if 0
	for (i = 0; i < sc->sc_npins; i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);
#endif

	printf(":");
	if (sc->sc_npins - outputs)
		printf(" %d inputs", sc->sc_npins - outputs);
	if (outputs)
		printf(" %d outputs", outputs);
	printf("\n");

	for (i = 0; i < sc->sc_npins; i++) {
		port = PCAGPIO_PORT(i);
		bit = PCAGPIO_BIT(i);

		sc->sc_gpio_pins[i].pin_num = i;
		sc->sc_gpio_pins[i].pin_caps = GPIO_PIN_INPUT | GPIO_PIN_OUTPUT;

		if ((sc->sc_control[port] & bit) == 0) {
			sc->sc_gpio_pins[i].pin_flags = GPIO_PIN_OUTPUT;
			sc->sc_gpio_pins[i].pin_state = data[port] &
			    bit ? GPIO_PIN_HIGH : GPIO_PIN_LOW;
		}
	}

	/* Create controller tag */
	sc->sc_gpio_gc.gp_cookie = sc;
	sc->sc_gpio_gc.gp_pin_read = pcagpio_gpio_pin_read;
	sc->sc_gpio_gc.gp_pin_write = pcagpio_gpio_pin_write;
	sc->sc_gpio_gc.gp_pin_ctl = pcagpio_gpio_pin_ctl;

	gba.gba_name = "gpio";
	gba.gba_gc = &sc->sc_gpio_gc;
	gba.gba_pins = sc->sc_gpio_pins;
	gba.gba_npins = sc->sc_npins;

	config_found(&sc->sc_dev, &gba, gpiobus_print);

}
예제 #23
0
파일: itherm.c 프로젝트: ajinkya93/OpenBSD
void
itherm_attach(struct device *parent, struct device *self, void *aux)
{
	struct itherm_softc *sc = (struct itherm_softc *)self;
	struct pci_attach_args *pa = aux;
	int i;
	pcireg_t v;

	v = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_MAPREG_START);
	v &= PCI_MAPREG_TYPE_MASK | PCI_MAPREG_MEM_TYPE_MASK;
	if (pci_mapreg_map(pa, PCI_MAPREG_START,
	    v, 0, &sc->iot, &sc->ioh, NULL, &sc->size, 0)) {
		printf(": can't map mem space\n");
		return;
	}

	sc->sensors[ITHERM_SENSOR_THERMOMETER].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_CORETEMP1].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_CORETEMP2].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_COREENERGY].type = SENSOR_WATTS;
	sc->sensors[ITHERM_SENSOR_GPUTEMP].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_MAXPROCTEMP].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_DIMMTEMP1].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_DIMMTEMP2].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_DIMMTEMP3].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_DIMMTEMP4].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_GPUTEMP_ABSOLUTE].type = SENSOR_TEMP;
	sc->sensors[ITHERM_SENSOR_PCHTEMP_ABSOLUTE].type = SENSOR_TEMP;

	strlcpy(sc->sensors[ITHERM_SENSOR_THERMOMETER].desc,
	    "Thermometer",
	    sizeof(sc->sensors[ITHERM_SENSOR_THERMOMETER].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_CORETEMP1].desc,
	    "Core 1",
	    sizeof(sc->sensors[ITHERM_SENSOR_CORETEMP1].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_CORETEMP2].desc,
	    "Core 2",
	    sizeof(sc->sensors[ITHERM_SENSOR_CORETEMP2].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_COREENERGY].desc,
	    "CPU power consumption",
	    sizeof(sc->sensors[ITHERM_SENSOR_COREENERGY].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_GPUTEMP].desc,
	    "GPU/Memory Controller Temp",
	    sizeof(sc->sensors[ITHERM_SENSOR_GPUTEMP].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_MAXPROCTEMP].desc,
	    "CPU/GPU Max temp",
	    sizeof(sc->sensors[ITHERM_SENSOR_MAXPROCTEMP].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_DIMMTEMP1].desc,
	    "DIMM 1",
	    sizeof(sc->sensors[ITHERM_SENSOR_DIMMTEMP1].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_DIMMTEMP2].desc,
	    "DIMM 2",
	    sizeof(sc->sensors[ITHERM_SENSOR_DIMMTEMP2].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_DIMMTEMP3].desc,
	    "DIMM 3",
	    sizeof(sc->sensors[ITHERM_SENSOR_DIMMTEMP3].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_DIMMTEMP4].desc,
	    "DIMM 4",
	    sizeof(sc->sensors[ITHERM_SENSOR_DIMMTEMP4].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_GPUTEMP_ABSOLUTE].desc,
	    "GPU/Memory controller abs.",
	    sizeof(sc->sensors[ITHERM_SENSOR_GPUTEMP_ABSOLUTE].desc));

	strlcpy(sc->sensors[ITHERM_SENSOR_PCHTEMP_ABSOLUTE].desc,
	    "PCH abs.",
	    sizeof(sc->sensors[ITHERM_SENSOR_PCHTEMP_ABSOLUTE].desc));

	strlcpy(sc->sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sensordev.xname));

	itherm_enable(sc);

	for (i = 0; i < ITHERM_NUM_SENSORS; i++)
		sensor_attach(&sc->sensordev, &sc->sensors[i]);

	sensordev_install(&sc->sensordev);
	sensor_task_register(sc, itherm_refresh, ITHERM_REFRESH_INTERVAL);

	printf("\n");

	return;
}
예제 #24
0
파일: stsec.c 프로젝트: ajinkya93/OpenBSD
void
stsec_attach(struct device *parent, struct device *self, void *aux)
{
	struct stsec_softc *sc = (struct stsec_softc *)self;
	struct i2c_attach_args *ia = (struct i2c_attach_args *)aux;
	int rev, sig;
	int rc;
	uint i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	/*
	 * Figure out where to get our information, and display microcode
	 * version for geek value if available.
	 */

	sc->sc_base = 0;
	switch (gdium_revision) {
	case 0:
		break;
	default:
		/* read version before sc_base is set */
		rc = stsec_read(sc, ST7_VERSION, &rev);
		if (rc != 0) {
			printf(": can't read microcode revision\n");
			return;
		}
		printf(": revision %d.%d", (rev >> 4) & 0x0f, rev & 0x0f);
		sc->sc_base = ST7_VERSION + 1;
		break;
	}

	printf("\n");

	/*
	 * Better trust the ST7 firmware to control charge operation.
	 */

	rc = stsec_read(sc, ST7_SIGNATURE, &sig);
	if (rc != 0) {
		printf("%s: can't verify charge policy\n", self->dv_xname);
		/* not fatal */
	} else {
		if (sig != STSIG_EC_CONTROL)
			stsec_write(sc, ST7_SIGNATURE, STSIG_EC_CONTROL);
	}

	/*
	 * Setup sensors. We use a quite short refresh interval to react
	 * quickly enough to button presses.
	 * XXX but we don't do anything on lid or button presses... yet
	 */

	strlcpy(sc->sc_sensordev.xname, self->dv_xname,
	    sizeof(sc->sc_sensordev.xname));
	sc->sc_sensors_update_task =
	    sensor_task_register(sc, stsec_sensors_update, 2);
	if (sc->sc_sensors_update_task == NULL) {
		printf("%s: can't initialize refresh task\n", self->dv_xname);
		return;
	}

	for (i = 0; i < nitems(sc->sc_sensors); i++) {
		sc->sc_sensors[i].type = stsec_sensors_template[i].type;
		strlcpy(sc->sc_sensors[i].desc, stsec_sensors_template[i].desc,
		    sizeof(sc->sc_sensors[i].desc));
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensors[i]);
	}
	sensordev_install(&sc->sc_sensordev);
#if NAPM > 0
	/* make sure we have the apm state initialized before apm attaches */
	stsec_sensors_update(sc);
	apm_setinfohook(stsec_apminfo);
#endif
}
예제 #25
0
파일: tsl2560.c 프로젝트: SylvestreG/bitrig
void
tsl_attach(struct device *parent, struct device *self, void *aux)
{
	struct tsl_softc *sc = (struct tsl_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	iic_acquire_bus(sc->sc_tag, 0);
	cmd = TSL2560_REG_CONTROL; data = TSL2560_CONTROL_POWER;
	if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		iic_release_bus(sc->sc_tag, 0);
		printf(": power up failed\n");
		return;
	}
	cmd = TSL2560_REG_TIMING;
	data = TSL2560_TIMING_GAIN | TSL2560_TIMING_INTEG2;
	if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		iic_release_bus(sc->sc_tag, 0);
		printf(": cannot write timing register\n");
		return;
	}
	cmd = TSL2560_REG_ID;
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		iic_release_bus(sc->sc_tag, 0);
		printf(": cannot read ID register\n");
		return;
	}
	iic_release_bus(sc->sc_tag, 0);

	switch (data >> 4) {
	case 0:
		printf(": TSL2560 rev %x", data & 0x0f);
		break;
	case 1:
		printf(": TSL2561 rev %x", data & 0x0f);
		break;
	default:
		printf(": unknown part number %x", data >> 4);
		break;
	}

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));
	sc->sc_sensor.type = SENSOR_LUX;

	if (sensor_task_register(sc, tsl_refresh, 5) == NULL) {
		printf(": unable to register update task\n");
		return;
	}

	sensor_attach(&sc->sc_sensordev, &sc->sc_sensor);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #26
0
파일: adm1021.c 프로젝트: SylvestreG/bitrig
void
admtemp_attach(struct device *parent, struct device *self, void *aux)
{
	struct admtemp_softc *sc = (struct admtemp_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data, stat;
	int xeon = 0, i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	if (strcmp(ia->ia_name, "xeontemp") == 0) {
		printf(": Xeon");
		xeon = 1;
	} else
		printf(": %s", ia->ia_name);

	iic_acquire_bus(sc->sc_tag, 0);
	cmd = ADM1021_CONFIG_READ;
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
		iic_release_bus(sc->sc_tag, 0);
		printf(", cannot get control register\n");
		return;
	}
	if (data & ADM1021_CONFIG_RUN) {
		cmd = ADM1021_STATUS;
		if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
		    sc->sc_addr, &cmd, sizeof cmd, &stat, sizeof stat, 0)) {
			iic_release_bus(sc->sc_tag, 0);
			printf(", cannot read status register\n");
			return;
		}
		if ((stat & ADM1021_STATUS_INVAL) == ADM1021_STATUS_INVAL) {
			if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
			    sc->sc_addr, &cmd, sizeof cmd, &stat, sizeof stat, 0)) {
				iic_release_bus(sc->sc_tag, 0);
				printf(", cannot read status register\n");
				return;
			}
		}

		/* means external is dead */
		if ((stat & ADM1021_STATUS_INVAL) != ADM1021_STATUS_INVAL &&
		    (stat & ADM1021_STATUS_NOEXT))
			sc->sc_noexternal = 1;

		data &= ~ADM1021_CONFIG_RUN;
		cmd = ADM1021_CONFIG_WRITE;
		if (iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
		    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0)) {
			iic_release_bus(sc->sc_tag, 0);
			printf(", cannot set control register\n");
			return;
		}
	}
	iic_release_bus(sc->sc_tag, 0);

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[ADMTEMP_EXT].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[ADMTEMP_EXT].desc,
	    xeon ? "Xeon" : "External",
	    sizeof(sc->sc_sensor[ADMTEMP_EXT].desc));

	sc->sc_sensor[ADMTEMP_INT].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[ADMTEMP_INT].desc,
	    xeon ? "Xeon" : "Internal",
	    sizeof(sc->sc_sensor[ADMTEMP_INT].desc));

	if (sensor_task_register(sc, admtemp_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	for (i = 0; i < (sc->sc_noexternal ? 1 : ADMTEMP_NUM_SENSORS); i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #27
0
void
uoakv_attach(struct device *parent, struct device *self, void *aux)
{
	struct uoakv_softc *sc = (struct uoakv_softc *)self;
	struct usb_attach_arg *uaa = aux;
	struct uhidev_attach_arg *uha = (struct uhidev_attach_arg *)uaa;
	struct usbd_device *dev = uha->parent->sc_udev;

	struct uoak_softc *scc = &sc->sc_uoak_softc;
	int i, err, size, repid;
	void *desc;

	sc->sc_hdev.sc_intr = uoakv_intr;
	sc->sc_hdev.sc_parent = uha->parent;
	sc->sc_hdev.sc_report_id = uha->reportid;

	scc->sc_parent = sc;
	scc->sc_udev = dev;
	scc->sc_hdev = &sc->sc_hdev;
	scc->sc_methods = &uoakv_methods;
	scc->sc_sensordev = &sc->sc_sensordev;

	uhidev_get_report_desc(uha->parent, &desc, &size);
	repid = uha->reportid;
	scc->sc_ilen = hid_report_size(desc, size, hid_input, repid);
	scc->sc_olen = hid_report_size(desc, size, hid_output, repid);
	scc->sc_flen = hid_report_size(desc, size, hid_feature, repid);

	/* device initialize */
	(void)uoak_led_ctrl(scc, OAK_TARGET_RAM, OAK_LED_ON);
	err = uoak_set_sample_rate(scc, OAK_TARGET_RAM, UOAKV_SAMPLE_RATE);
	if (err) {
		printf("%s: could not set sampling rate. exit\n",
		    sc->sc_hdev.sc_dev.dv_xname);
		return;
	}

	/* query and print device setting */
	uoak_get_devinfo(scc);
	uoak_print_devinfo(scc);

	DPRINTF((" config in RAM\n"));
	uoak_get_setting(scc, OAK_TARGET_RAM);
	uoak_print_setting(scc, OAK_TARGET_RAM);
#ifdef UOAKV_DEBUG
	DPRINTF((" config in FRASH\n"));
	uoak_get_setting(scc, OAK_TARGET_FLASH);
	uoak_print_setting(scc, OAK_TARGET_FLASH);
#endif

	/* attach sensor */
	strlcpy(sc->sc_sensordev.xname, sc->sc_hdev.sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));
	for (i = 0; i < OAK_V_MAXSENSORS; i++)
		uoak_sensor_attach(scc, &sc->sc_sensor[i].v, SENSOR_VOLTS_DC);

	/* start sensor */
	sc->sc_sensortask = sensor_task_register(sc, uoakv_refresh,
	    UOAKV_REFRESH_PERIOD);
	if (sc->sc_sensortask == NULL) {
		printf(", unable to register update task\n");
		return;
	}
	sensordev_install(&sc->sc_sensordev);

	err = uhidev_open(&sc->sc_hdev);
	if (err) {
		printf("%s: could not open interrupt pipe, quit\n",
		    sc->sc_hdev.sc_dev.dv_xname);
		return;
	}
	scc->sc_ibuf = malloc(scc->sc_ilen, M_USBDEV, M_WAITOK);

	DPRINTF(("uoakv_attach: complete\n"));
}
예제 #28
0
파일: aps.c 프로젝트: AhmadTux/DragonFlyBSD
static int
aps_attach(struct device *dev)
{
	struct aps_softc *sc = device_get_softc(dev);

	sc->sc_dev = dev;
	sc->sc_iores = bus_alloc_resource_any(dev, SYS_RES_IOPORT,
	    &sc->sc_iorid, RF_ACTIVE);
	if (sc->sc_iores == NULL) {
		device_printf(dev, "can't map i/o space\n");
		return ENXIO;
	}

	if (aps_init(sc->sc_iores)) {
		device_printf(dev, "failed to initialise\n");
		bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_iorid, sc->sc_iores);
		return ENXIO;
	}

	sc->sensors[APS_SENSOR_XACCEL].type = SENSOR_INTEGER;
	ksnprintf(sc->sensors[APS_SENSOR_XACCEL].desc,
	    sizeof(sc->sensors[APS_SENSOR_XACCEL].desc), "X_ACCEL");

	sc->sensors[APS_SENSOR_YACCEL].type = SENSOR_INTEGER;
	ksnprintf(sc->sensors[APS_SENSOR_YACCEL].desc,
	    sizeof(sc->sensors[APS_SENSOR_YACCEL].desc), "Y_ACCEL");

	sc->sensors[APS_SENSOR_TEMP1].type = SENSOR_TEMP;
	sc->sensors[APS_SENSOR_TEMP2].type = SENSOR_TEMP;

	sc->sensors[APS_SENSOR_XVAR].type = SENSOR_INTEGER;
	ksnprintf(sc->sensors[APS_SENSOR_XVAR].desc,
	    sizeof(sc->sensors[APS_SENSOR_XVAR].desc), "X_VAR");

	sc->sensors[APS_SENSOR_YVAR].type = SENSOR_INTEGER;
	ksnprintf(sc->sensors[APS_SENSOR_YVAR].desc,
	    sizeof(sc->sensors[APS_SENSOR_YVAR].desc), "Y_VAR");

	sc->sensors[APS_SENSOR_KBACT].type = SENSOR_INDICATOR;
	ksnprintf(sc->sensors[APS_SENSOR_KBACT].desc,
	    sizeof(sc->sensors[APS_SENSOR_KBACT].desc), "Keyboard Active");

	sc->sensors[APS_SENSOR_MSACT].type = SENSOR_INDICATOR;
	ksnprintf(sc->sensors[APS_SENSOR_MSACT].desc,
	    sizeof(sc->sensors[APS_SENSOR_MSACT].desc), "Mouse Active");

	sc->sensors[APS_SENSOR_LIDOPEN].type = SENSOR_INDICATOR;
	ksnprintf(sc->sensors[APS_SENSOR_LIDOPEN].desc,
	    sizeof(sc->sensors[APS_SENSOR_LIDOPEN].desc), "Lid Open");

	/* stop hiding and report to the authorities */
	strlcpy(sc->sensordev.xname, device_get_nameunit(dev),
	    sizeof(sc->sensordev.xname));
	for (int i = 0; i < APS_NUM_SENSORS ; i++)
		sensor_attach(&sc->sensordev, &sc->sensors[i]);

	/* Refresh sensor data every 1 second */
	/* XXX: a more frequent refresh might be appropriate */
	if (sensor_task_register(sc, aps_refresh, 1)) {
		device_printf(dev, "unable to register update task\n");
		bus_release_resource(dev, SYS_RES_IOPORT, sc->sc_iorid, sc->sc_iores);
		return ENXIO;
	}

	sensordev_install(&sc->sensordev);
	return 0;
}
예제 #29
0
파일: ds1631.c 프로젝트: SylvestreG/bitrig
void
maxds_attach(struct device *parent, struct device *self, void *aux)
{
	struct maxds_softc *sc = (struct maxds_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data;
	int i;

	printf(": %s", ia->ia_name);

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	iic_acquire_bus(sc->sc_tag, 0);

	cmd = DS1631_CONTROL;
	if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
	    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0) {
		if (data & DS1631_CONTROL_1SHOT) {
			/*
			 * 1-Shot mode would require us to write every refresh
			 * which is stupid.  Put us into continuous mode.
			 */
			data &= ~DS1631_CONTROL_1SHOT;

			(void) iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
			    sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0);
			//delay(10 * 1000);
			printf(", continuous");
			goto dostart;
		}
		if (data & DS1631_CONTROL_DONE) {
dostart:
			cmd = DS1631_START;
			if (strcmp(ia->ia_name, "ds1624") == 0)
				cmd = DS1624_START;
			(void) iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
			    sc->sc_addr, &cmd, sizeof cmd, NULL, 0, 0);
			printf(", starting");
		}
	}

	iic_release_bus(sc->sc_tag, 0);

	/* Initialize sensor data. */
	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[MAXDS_TEMP].type = SENSOR_TEMP;
	strlcpy(sc->sc_sensor[MAXDS_TEMP].desc, "Internal",
	    sizeof(sc->sc_sensor[MAXDS_TEMP].desc));

	if (sensor_task_register(sc, maxds_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	for (i = 0; i < MAXDS_NUM_SENSORS; i++)
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
}
예제 #30
0
void
fintek_attach(struct device *parent, struct device *self, void *aux)
{
	struct fintek_softc *sc = (struct fintek_softc *)self;
	struct i2c_attach_args *ia = aux;
	u_int8_t cmd, data;
	int i;

	sc->sc_tag = ia->ia_tag;
	sc->sc_addr = ia->ia_addr;

	iic_acquire_bus(sc->sc_tag, 0);

	cmd = FINTEK_VERSION;
	if (fintek_read_reg(sc, cmd, &data, sizeof data))
		goto failread;

	printf(": F75375 rev %d.%d", data>> 4, data & 0xf);

	/*
	 * It seems the fan in the Thecus n2100 doesn't provide a
	 * reliable fan count.  As a result the automatic fan
	 * controlling mode that the chip comes up in after reset
	 * doesn't work reliably.  So we have a flag to drive the fan
	 * at maximum voltage such that the box doesn't overheat.
	 */
	if (sc->sc_dev.dv_cfdata->cf_flags & FINTEK_OPTION_FULLSPEED)
		fintek_fullspeed(sc);

	iic_release_bus(sc->sc_tag, 0);

	strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
	    sizeof(sc->sc_sensordev.xname));

	sc->sc_sensor[F_VCC].type = SENSOR_VOLTS_DC;
	strlcpy(sc->sc_sensor[F_VCC].desc, "Vcc",
	    sizeof(sc->sc_sensor[F_VCC].desc));

	sc->sc_sensor[F_V1].type = SENSOR_VOLTS_DC;
	sc->sc_sensor[F_V2].type = SENSOR_VOLTS_DC;
	sc->sc_sensor[F_V3].type = SENSOR_VOLTS_DC;

	sc->sc_sensor[F_TEMP1].type = SENSOR_TEMP;
	sc->sc_sensor[F_TEMP2].type = SENSOR_TEMP;

	sc->sc_sensor[F_FAN1].type = SENSOR_FANRPM;
	sc->sc_sensor[F_FAN2].type = SENSOR_FANRPM;

	if (sensor_task_register(sc, fintek_refresh, 5) == NULL) {
		printf(", unable to register update task\n");
		return;
	}

	for (i = 0; i < F_NUM_SENSORS; i++) {
		sc->sc_sensor[i].flags &= ~SENSOR_FINVALID;
		sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
	}
	sensordev_install(&sc->sc_sensordev);

	printf("\n");
	return;

failread:
	printf("unable to read reg %d\n", cmd);
	iic_release_bus(sc->sc_tag, 0);
	return;
}