20#if EFI_PROD_CODE && (BOARD_DRV8860_COUNT > 0)
26#define DRIVER_NAME "drv8860"
59 void spi_send(uint16_t tx);
61 void update_outputs();
66 uint16_t o_state_cached;
73static Drv8860
chips[BOARD_DRV8860_COUNT];
76 "drv8860.OUT1",
"drv8860.OUT2",
"drv8860.OUT3",
"drv8860.OUT4",
77 "drv8860.OUT5",
"drv8860.OUT6",
"drv8860.OUT7",
"drv8860.OUT8",
78 "drv8860.OUT9",
"drv8860.OUT10",
"drv8860.OUT11",
"drv8860.OUT12",
79 "drv8860.OUT13",
"drv8860.OUT14",
"drv8860.OUT15",
"drv8860.OUT16",
91void Drv8860::spi_send(uint16_t tx) {
92 SPIDriver *spi = cfg->spi_bus;
97 spiStart(spi, &cfg->spi_config);
101 spiPolledExchange(spi, tx);
112void Drv8860::update_outputs() {
117 spi_send(o_state & 0xffff);
120 o_state_cached = o_state;
131int Drv8860::chip_init() {
143int Drv8860::wake_driver() {
145 chibios_rt::CriticalSectionLocker csl;
147 chSemSignalI(&drv8860_wake);
162 chRegSetThreadName(DRIVER_NAME);
165 msg = chSemWaitTimeout(&drv8860_wake, TIME_MS2I(DRV8860_POLL_INTERVAL_MS));
170 for (i = 0; i < BOARD_DRV8860_COUNT; i++) {
171 auto chip = &
chips[i];
172 if ((chip->cfg == NULL) ||
177 chip->update_outputs();
192int Drv8860::writePad(
size_t pin,
int value) {
193 if (
pin >= DRV8860_OUTPUTS)
198 o_state |= (1 <<
pin);
200 o_state &= ~(1 <<
pin);
222 chThdCreateStatic(drv8860_thread_1_wa,
sizeof(drv8860_thread_1_wa),
223 PRIO_GPIOCHIP, drv8860_driver_thread, NULL);
239 if ((!cfg) || (!cfg->
spi_bus) || (index >= BOARD_DRV8860_COUNT))
247 auto& chip =
chips[index];
255 chip.o_state_cached = 0;
272 (void)base; (void)index; (void)cfg;
int gpiochip_register(brain_pin_e base, const char *name, GpioChip &gpioChip, size_t size)
Register gpiochip.
int gpiochips_setPinNames(brain_pin_e base, const char **names)
Set pins names for registered gpiochip.
static bool drv_task_ready
static const char * drv8860_pin_names[DRV8860_OUTPUTS]
SEMAPHORE_DECL(drv8860_wake, 10)
static Drv8860 chips[BOARD_DRV8860_COUNT]
static THD_FUNCTION(drv8860_driver_thread, p)
int drv8860_add(brain_pin_e base, unsigned int index, const drv8860_config *cfg)
DRV8860 driver add.
static THD_WORKING_AREA(drv8860_thread_1_wa, 256)
virtual brain_pin_diag_e getDiag(size_t)
virtual int writePad(size_t, int)