Skip to content

Commit 3b089f3

Browse files
committed
device: separate backend operations
Separate backend operations into control and console operations. Main idea is that each device has single set of console ops (conmux or console) and at most one way to control it. Each backend driver exports a structure with the set of callbacks. Signed-off-by: Dmitry Baryshkov <[email protected]>
1 parent fb23cab commit 3b089f3

File tree

9 files changed

+171
-78
lines changed

9 files changed

+171
-78
lines changed

alpaca.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
#include "cdba-server.h"
4545
#include "alpaca.h"
46+
#include "device.h"
4647

4748
struct alpaca {
4849
int alpaca_fd;
@@ -147,3 +148,10 @@ void alpaca_key(struct device *dev, int key, bool asserted)
147148
break;
148149
}
149150
}
151+
152+
const struct control_ops alpaca_ops = {
153+
.open = alpaca_open,
154+
.power = alpaca_power,
155+
.usb = alpaca_usb,
156+
.key = alpaca_key,
157+
};

cdb_assist.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343

4444
#include "cdba-server.h"
4545
#include "cdb_assist.h"
46+
#include "device.h"
4647

4748
struct cdb_assist {
4849
char serial[9];
@@ -382,3 +383,12 @@ void cdb_assist_key(struct device *dev, int key, bool asserted)
382383
break;
383384
}
384385
}
386+
387+
const struct control_ops cdb_assist_ops = {
388+
.open = cdb_assist_open,
389+
.close = cdb_assist_close,
390+
.power = cdb_assist_power,
391+
.print_status = cdb_assist_print_status,
392+
.usb = cdb_assist_usb,
393+
.key = cdb_assist_key,
394+
};

conmux.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242

4343
#include "cdba-server.h"
4444
#include "conmux.h"
45+
#include "device.h"
4546

4647
extern int h_errno;
4748

@@ -331,3 +332,18 @@ int conmux_write(struct device *dev, const void *buf, size_t len)
331332

332333
return write(conmux->fd, buf, len);
333334
}
335+
336+
void *conmux_console_open(struct device *dev)
337+
{
338+
return dev->cdb;
339+
}
340+
341+
const struct control_ops conmux_ops = {
342+
.open = conmux_open,
343+
.power = conmux_power,
344+
};
345+
346+
const struct console_ops conmux_console_ops = {
347+
.open = conmux_console_open,
348+
.write = conmux_write,
349+
};

console.c

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,17 @@
3232
#include <sys/stat.h>
3333

3434
#include <err.h>
35+
#include <stdlib.h>
3536
#include <unistd.h>
3637

3738
#include "cdba-server.h"
3839
#include "device.h"
3940

41+
struct console {
42+
int console_fd;
43+
struct termios console_tios;
44+
};
45+
4046
static int console_data(int fd, void *data)
4147
{
4248
char buf[128];
@@ -51,21 +57,36 @@ static int console_data(int fd, void *data)
5157
return 0;
5258
}
5359

54-
void console_open(struct device *device)
60+
void *console_open(struct device *device)
5561
{
56-
device->console_fd = tty_open(device->console_dev, &device->console_tios);
57-
if (device->console_fd < 0)
62+
struct console *console;
63+
64+
console = calloc(1, sizeof(*console));
65+
console->console_fd = tty_open(device->console_dev, &console->console_tios);
66+
if (console->console_fd < 0)
5867
err(1, "failed to open %s", device->console_dev);
5968

60-
watch_add_readfd(device->console_fd, console_data, device);
69+
watch_add_readfd(console->console_fd, console_data, device);
70+
71+
return console;
6172
}
6273

6374
int console_write(struct device *device, const void *buf, size_t len)
6475
{
65-
return write(device->console_fd, buf, len);;
76+
struct console *console = device->console;
77+
78+
return write(console->console_fd, buf, len);;
6679
}
6780

6881
void console_send_break(struct device *device)
6982
{
70-
tcsendbreak(device->console_fd, 0);
83+
struct console *console = device->console;
84+
85+
tcsendbreak(console->console_fd, 0);
7186
}
87+
88+
const struct console_ops console_ops = {
89+
.open = console_open,
90+
.write = console_write,
91+
.send_break = console_send_break,
92+
};

device.c

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,23 @@
4343
#include "cdba-server.h"
4444
#include "device.h"
4545
#include "fastboot.h"
46-
#include "console.h"
4746
#include "list.h"
4847
#include "ppps.h"
4948

5049
#define ARRAY_SIZE(x) ((sizeof(x)/sizeof((x)[0])))
5150

51+
#define device_has_control(_dev, _op) \
52+
((_dev)->control_ops && (_dev)->control_ops->_op)
53+
54+
#define device_control(_dev, _op, ...) \
55+
(_dev)->control_ops->_op((_dev) , ## __VA_ARGS__)
56+
57+
#define device_has_console(_dev, _op) \
58+
((_dev)->console_ops && (_dev)->console_ops->_op)
59+
60+
#define device_console(_dev, _op, ...) \
61+
(_dev)->console_ops->_op((_dev) , ## __VA_ARGS__)
62+
5263
static struct list_head devices = LIST_INIT(devices);
5364

5465
void device_add(struct device *device)
@@ -118,21 +129,24 @@ struct device *device_open(const char *board,
118129
return NULL;
119130

120131
found:
121-
assert(device->open || device->console_dev);
122-
123132
if (!device_check_access(device, username))
124133
return NULL;
125134

135+
assert(device->console_ops);
136+
assert(device->console_ops->open);
137+
assert(device->console_ops->write);
138+
126139
device_lock(device);
127140

128-
if (device->open) {
129-
device->cdb = device->open(device);
141+
if (device_has_control(device, open)) {
142+
device->cdb = device_control(device, open);
130143
if (!device->cdb)
131144
errx(1, "failed to open device controller");
132145
}
133146

134-
if (device->console_dev)
135-
console_open(device);
147+
device->console = device_console(device, open);
148+
if (!device->console)
149+
errx(1, "failed to open device console");
136150

137151
if (device->usb_always_on)
138152
device_usb(device, true);
@@ -144,13 +158,13 @@ struct device *device_open(const char *board,
144158

145159
static void device_impl_power(struct device *device, bool on)
146160
{
147-
device->power(device, on);
161+
device_control(device, power, on);
148162
}
149163

150164
static void device_key(struct device *device, int key, bool asserted)
151165
{
152-
if (device->key)
153-
device->key(device, key, asserted);
166+
if (device_has_control(device, key))
167+
device_control(device, key, key, asserted);
154168
}
155169

156170
enum {
@@ -219,7 +233,7 @@ static void device_tick(void *data)
219233

220234
static int device_power_on(struct device *device)
221235
{
222-
if (!device || !device->power)
236+
if (!device || !device_has_control(device, power))
223237
return 0;
224238

225239
device->state = DEVICE_STATE_START;
@@ -230,10 +244,10 @@ static int device_power_on(struct device *device)
230244

231245
static int device_power_off(struct device *device)
232246
{
233-
if (!device || !device->power)
247+
if (!device || !device_has_control(device, power))
234248
return 0;
235249

236-
device->power(device, false);
250+
device_control(device, power, false);
237251

238252
return 0;
239253
}
@@ -248,26 +262,24 @@ int device_power(struct device *device, bool on)
248262

249263
void device_print_status(struct device *device)
250264
{
251-
if (device->print_status)
252-
device->print_status(device);
265+
if (device_has_control(device, print_status))
266+
device_control(device, print_status);
253267
}
254268

255269
void device_usb(struct device *device, bool on)
256270
{
257271
if (device->ppps_path)
258272
ppps_power(device, on);
259-
else if (device->usb)
260-
device->usb(device, on);
273+
else if (device_has_control(device, usb))
274+
device_control(device, usb, on);
261275
}
262276

263277
int device_write(struct device *device, const void *buf, size_t len)
264278
{
265279
if (!device)
266280
return 0;
267281

268-
assert(device->write);
269-
270-
return device->write(device, buf, len);
282+
return device_console(device, write, buf, len);
271283
}
272284

273285
void device_fastboot_boot(struct device *device)
@@ -292,8 +304,8 @@ void device_boot(struct device *device, const void *data, size_t len)
292304

293305
void device_send_break(struct device *device)
294306
{
295-
if (device->send_break)
296-
device->send_break(device);
307+
if (device_has_console(device, send_break))
308+
device_console(device, send_break);
297309
}
298310

299311
void device_list_devices(const char *username)
@@ -346,6 +358,6 @@ void device_close(struct device *dev)
346358
device_usb(dev, false);
347359
device_power(dev, false);
348360

349-
if (dev->close)
350-
dev->close(dev);
361+
if (device_has_control(dev, close))
362+
device_control(dev, close);
351363
}

device.h

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,23 @@
77
struct cdb_assist;
88
struct fastboot;
99
struct fastboot_ops;
10+
struct device;
11+
12+
struct control_ops {
13+
void *(*open)(struct device *dev);
14+
void (*close)(struct device *dev);
15+
int (*power)(struct device *dev, bool on);
16+
void (*usb)(struct device *dev, bool on);
17+
void (*key)(struct device *device, int key, bool asserted);
18+
void (*print_status)(struct device *dev);
19+
};
20+
21+
struct console_ops {
22+
void *(*open)(struct device *dev);
23+
int (*write)(struct device *dev, const void *buf, size_t len);
24+
25+
void (*send_break)(struct device *dev);
26+
};
1027

1128
struct device {
1229
char *board;
@@ -27,22 +44,13 @@ struct device {
2744

2845
void (*boot)(struct device *);
2946

30-
void *(*open)(struct device *dev);
31-
void (*close)(struct device *dev);
32-
int (*power)(struct device *dev, bool on);
33-
void (*usb)(struct device *dev, bool on);
34-
void (*print_status)(struct device *dev);
35-
int (*write)(struct device *dev, const void *buf, size_t len);
36-
void (*fastboot_key)(struct device *dev, bool on);
37-
void (*key)(struct device *device, int key, bool asserted);
47+
const struct control_ops *control_ops;
48+
const struct console_ops *console_ops;
3849

39-
void (*send_break)(struct device *dev);
4050
const char *set_active;
4151

4252
void *cdb;
43-
44-
int console_fd;
45-
struct termios console_tios;
53+
void *console;
4654

4755
struct list_head node;
4856
};
@@ -78,4 +86,13 @@ enum {
7886
DEVICE_KEY_POWER,
7987
};
8088

89+
extern const struct control_ops alpaca_ops;
90+
extern const struct control_ops cdb_assist_ops;
91+
extern const struct control_ops conmux_ops;
92+
extern const struct control_ops ftdi_gpio_ops;
93+
extern const struct control_ops qcomlt_dbg_ops;
94+
95+
extern const struct console_ops conmux_console_ops;
96+
extern const struct console_ops console_ops;
97+
8198
#endif

0 commit comments

Comments
 (0)