11#if PC_ENABLE_SOUTHBOUND
15#ifndef PC_SOUTHBOUND_MAX_DRIVERS
16#define PC_SOUTHBOUND_MAX_DRIVERS 8
25 const SouthboundDriver *drivers[PC_SOUTHBOUND_MAX_DRIVERS] = {};
31int pc_southbound_register(
const SouthboundDriver *drv)
33 if (!drv || !drv->name)
35 return Sb::SB_ERR_ARG;
37 if (pc_southbound_find(drv->name))
39 return Sb::SB_ERR_DUP;
41 if (s_sb.count >= PC_SOUTHBOUND_MAX_DRIVERS)
43 return Sb::SB_ERR_FULL;
45 s_sb.drivers[s_sb.count++] = drv;
49void pc_southbound_clear(
void)
51 for (
size_t i = 0; i < PC_SOUTHBOUND_MAX_DRIVERS; i++)
53 s_sb.drivers[i] =
nullptr;
58size_t pc_southbound_count(
void)
63const SouthboundDriver *pc_southbound_find(
const char *name)
77 for (
size_t i = 0; i < s_sb.count; i++)
79 if (s_sb.drivers[i] && s_sb.drivers[i]->name && strcmp(s_sb.drivers[i]->name, name) == 0)
81 return s_sb.drivers[i];
87int pc_southbound_read(
const char *name, uint32_t point, int32_t *value_out)
91 return Sb::SB_ERR_ARG;
93 const SouthboundDriver *d = pc_southbound_find(name);
96 return Sb::SB_ERR_NOT_FOUND;
100 return Sb::SB_ERR_UNSUPPORTED;
102 return d->read(d->ctx, point, value_out);
105int pc_southbound_write(
const char *name, uint32_t point, int32_t value)
107 const SouthboundDriver *d = pc_southbound_find(name);
110 return Sb::SB_ERR_NOT_FOUND;
114 return Sb::SB_ERR_UNSUPPORTED;
116 return d->write(d->ctx, point, value);
119int pc_southbound_read_block(
const char *name, uint32_t first, int32_t *out,
size_t n)
123 return Sb::SB_ERR_ARG;
125 const SouthboundDriver *d = pc_southbound_find(name);
128 return Sb::SB_ERR_NOT_FOUND;
132 return Sb::SB_ERR_UNSUPPORTED;
134 return d->read_block(d->ctx, first, out, n);
137int pc_southbound_write_block(
const char *name, uint32_t first,
const int32_t *in,
size_t n)
141 return Sb::SB_ERR_ARG;
143 const SouthboundDriver *d = pc_southbound_find(name);
146 return Sb::SB_ERR_NOT_FOUND;
150 return Sb::SB_ERR_UNSUPPORTED;
152 return d->write_block(d->ctx, first, in, n);
Southbound protocol-driver framework (PC_ENABLE_SOUTHBOUND).