This source file includes following definitions.
- maxds_match
- maxds_attach
- maxds_refresh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #include <sys/param.h>
20 #include <sys/systm.h>
21 #include <sys/device.h>
22 #include <sys/sensors.h>
23
24 #include <dev/i2c/i2cvar.h>
25
26
27 #define DS1631_START 0x51
28 #define DS1624_START 0xee
29 #define DS1631_TEMP 0xaa
30 #define DS1631_CONTROL 0xac
31 #define DS1631_CONTROL_DONE 0x80
32 #define DS1631_CONTROL_1SHOT 0x01
33
34
35 #define MAXDS_TEMP 0
36 #define MAXDS_NUM_SENSORS 1
37
38 struct maxds_softc {
39 struct device sc_dev;
40 i2c_tag_t sc_tag;
41 i2c_addr_t sc_addr;
42
43 struct ksensor sc_sensor[MAXDS_NUM_SENSORS];
44 struct ksensordev sc_sensordev;
45 };
46
47 int maxds_match(struct device *, void *, void *);
48 void maxds_attach(struct device *, struct device *, void *);
49 void maxds_refresh(void *);
50
51 struct cfattach maxds_ca = {
52 sizeof(struct maxds_softc), maxds_match, maxds_attach
53 };
54
55 struct cfdriver maxds_cd = {
56 NULL, "maxds", DV_DULL
57 };
58
59 int
60 maxds_match(struct device *parent, void *match, void *aux)
61 {
62 struct i2c_attach_args *ia = aux;
63
64 if (strcmp(ia->ia_name, "ds1631") == 0 ||
65 strcmp(ia->ia_name, "ds1624") == 0 ||
66 strcmp(ia->ia_name, "ds1721") == 0)
67 return (1);
68 return (0);
69 }
70
71 void
72 maxds_attach(struct device *parent, struct device *self, void *aux)
73 {
74 struct maxds_softc *sc = (struct maxds_softc *)self;
75 struct i2c_attach_args *ia = aux;
76 u_int8_t cmd, data;
77 int i;
78
79 printf(": %s", ia->ia_name);
80
81 sc->sc_tag = ia->ia_tag;
82 sc->sc_addr = ia->ia_addr;
83
84 iic_acquire_bus(sc->sc_tag, 0);
85
86 cmd = DS1631_CONTROL;
87 if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
88 sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0) {
89 if (data & DS1631_CONTROL_1SHOT) {
90
91
92
93
94 data &= ~DS1631_CONTROL_1SHOT;
95
96 (void) iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
97 sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0);
98
99 printf(", continuous");
100 goto dostart;
101 }
102 if (data & DS1631_CONTROL_DONE) {
103 dostart:
104 cmd = DS1631_START;
105 if (strcmp(ia->ia_name, "ds1624") == 0)
106 cmd = DS1624_START;
107 (void) iic_exec(sc->sc_tag, I2C_OP_WRITE_WITH_STOP,
108 sc->sc_addr, &cmd, sizeof cmd, NULL, 0, 0);
109 printf(", starting");
110 }
111 }
112
113 iic_release_bus(sc->sc_tag, 0);
114
115
116 strlcpy(sc->sc_sensordev.xname, sc->sc_dev.dv_xname,
117 sizeof(sc->sc_sensordev.xname));
118
119 sc->sc_sensor[MAXDS_TEMP].type = SENSOR_TEMP;
120 strlcpy(sc->sc_sensor[MAXDS_TEMP].desc, "Internal",
121 sizeof(sc->sc_sensor[MAXDS_TEMP].desc));
122
123 if (sensor_task_register(sc, maxds_refresh, 5) == NULL) {
124 printf(", unable to register update task\n");
125 return;
126 }
127
128 for (i = 0; i < MAXDS_NUM_SENSORS; i++)
129 sensor_attach(&sc->sc_sensordev, &sc->sc_sensor[i]);
130 sensordev_install(&sc->sc_sensordev);
131
132 printf("\n");
133 }
134
135 void
136 maxds_refresh(void *arg)
137 {
138 struct maxds_softc *sc = arg;
139 u_int8_t cmd, data[2];
140
141 iic_acquire_bus(sc->sc_tag, 0);
142
143 cmd = DS1631_TEMP;
144 if (iic_exec(sc->sc_tag, I2C_OP_READ_WITH_STOP,
145 sc->sc_addr, &cmd, sizeof cmd, &data, sizeof data, 0) == 0)
146 sc->sc_sensor[MAXDS_TEMP].value = 273150000 +
147 ((int)((u_int16_t)data[0] << 8 | data[1])) / 8 * 31250;
148
149 iic_release_bus(sc->sc_tag, 0);
150 }