Software APIs
gpio.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #define UJSON_SERDE_IMPL 1
6 #include "sw/device/lib/testing/json/gpio.h"
7 
9 #include "sw/device/lib/testing/test_framework/ujson_ottf.h"
10 
11 #define MODULE_ID MAKE_MODULE_ID('j', 'g', 'p')
12 
13 status_t gpio_set(ujson_t *uj, const dif_gpio_t *gpio) {
14  gpio_set_t op;
15  TRY(ujson_deserialize_gpio_set_t(uj, &op));
16  switch (op.action) {
17  case kGpioActionWrite:
18  TRY(dif_gpio_write(gpio, (dif_gpio_pin_t)op.pin_mask, (bool)op.state));
19  break;
20  case kGpioActionWriteAll:
21  TRY(dif_gpio_write_all(gpio, (dif_gpio_state_t)op.state));
22  break;
23  case kGpioActionWriteMasked:
24  TRY(dif_gpio_write_masked(gpio, (dif_gpio_mask_t)op.pin_mask,
25  (dif_gpio_state_t)op.state));
26  break;
27  case kGpioActionSetEnabled:
28  TRY(dif_gpio_output_set_enabled(gpio, (dif_gpio_pin_t)op.pin_mask,
29  (dif_toggle_t)op.state));
30  break;
31  case kGpioActionSetEnabledAll:
33  break;
34  case kGpioActionSetEnabledMasked:
36  (dif_gpio_state_t)op.state));
37  break;
38  case kGpioActionSetInputNoiseFilter:
40  gpio, (dif_gpio_mask_t)op.pin_mask, (dif_gpio_state_t)op.state));
41  break;
42  case kGpioActionIrqRestoreAll:
43  TRY(dif_gpio_irq_restore_all(gpio, (dif_gpio_mask_t *)&op.state));
44  break;
45  case kGpioActionIrqDisableAll:
46  TRY(dif_gpio_irq_disable_all(gpio, (dif_gpio_mask_t *)&op.state));
47  break;
48  case kGpioActionIrqAcknowledgeAll:
49  TRY(dif_gpio_irq_acknowledge_all(gpio));
50  break;
51  case kGpioActionIrqSetTriggerRisingEdge:
52  TRY(dif_gpio_irq_set_trigger(gpio, (dif_gpio_mask_t)op.state,
54  break;
55  case kGpioActionIrqSetTriggerFallingEdge:
56  TRY(dif_gpio_irq_set_trigger(gpio, (dif_gpio_mask_t)op.state,
58  break;
59  case kGpioActionIrqSetTriggerHigh:
60  TRY(dif_gpio_irq_set_trigger(gpio, (dif_gpio_mask_t)op.state,
62  break;
63  case kGpioActionIrqSetTriggerLow:
64  TRY(dif_gpio_irq_set_trigger(gpio, (dif_gpio_mask_t)op.state,
66  break;
67  default:
68  return INVALID_ARGUMENT();
69  }
70  return RESP_OK_STATUS(uj);
71 }
72 
73 status_t gpio_get(ujson_t *uj, const dif_gpio_t *gpio) {
74  dif_gpio_state_t state;
75  TRY(dif_gpio_read_all(gpio, &state));
76  gpio_get_t val = {state};
77  return RESP_OK(ujson_serialize_gpio_get_t, uj, &val);
78 }