]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/freedom-metal/src/drivers/sifive_gpio0.c
55ff458bf4615514d9155fc124a7973278ff32e7
[freertos] / FreeRTOS / Demo / RISC-V_RV32_SiFive_HiFive1_GCC / freedom-metal / src / drivers / sifive_gpio0.c
1 /* Copyright 2018 SiFive, Inc */
2 /* SPDX-License-Identifier: Apache-2.0 */
3
4 #include <metal/machine/platform.h>
5
6 #ifdef METAL_SIFIVE_GPIO0
7
8 #include <metal/drivers/sifive_gpio0.h>
9 #include <metal/io.h>
10 #include <metal/machine.h>
11
12 int __metal_driver_sifive_gpio0_disable_input(struct metal_gpio *ggpio, long source)
13 {
14     long base = __metal_driver_sifive_gpio0_base(ggpio);
15
16     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_INPUT_EN))  &= ~source;
17
18     return 0;
19 }
20
21 long __metal_driver_sifive_gpio0_output(struct metal_gpio *ggpio)
22 {
23     long base = __metal_driver_sifive_gpio0_base(ggpio);
24
25     return __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT));
26 }
27
28 int __metal_driver_sifive_gpio0_enable_output(struct metal_gpio *ggpio, long source)
29 {
30     long base = __metal_driver_sifive_gpio0_base(ggpio);
31
32     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_OUTPUT_EN))  |= source;
33
34     return 0;
35 }
36
37 int __metal_driver_sifive_gpio0_output_set(struct metal_gpio *ggpio, long value)
38 {
39     long base = __metal_driver_sifive_gpio0_base(ggpio);
40
41     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) |= value;
42
43     return 0;
44 }
45
46 int __metal_driver_sifive_gpio0_output_clear(struct metal_gpio *ggpio, long value)
47 {
48     long base = __metal_driver_sifive_gpio0_base(ggpio);
49
50     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) &= ~value;
51
52     return 0;
53 }
54
55 int __metal_driver_sifive_gpio0_output_toggle(struct metal_gpio *ggpio, long value)
56 {
57     long base = __metal_driver_sifive_gpio0_base(ggpio);
58
59     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) =
60         __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_PORT)) ^ value;
61
62     return 0;
63 }
64
65 int __metal_driver_sifive_gpio0_enable_io(struct metal_gpio *ggpio, long source, long dest)
66 {
67     long base = __metal_driver_sifive_gpio0_base(ggpio);
68
69     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_IOF_SEL)) &= ~source;
70     __METAL_ACCESS_ONCE((__metal_io_u32 *)(base + METAL_SIFIVE_GPIO0_IOF_EN))  |= dest;
71
72     return 0;
73 }
74
75 __METAL_DEFINE_VTABLE(__metal_driver_vtable_sifive_gpio0) = {
76     .gpio.disable_input = __metal_driver_sifive_gpio0_disable_input,
77     .gpio.output        = __metal_driver_sifive_gpio0_output,
78     .gpio.enable_output = __metal_driver_sifive_gpio0_enable_output,
79     .gpio.output_set    = __metal_driver_sifive_gpio0_output_set,
80     .gpio.output_clear  = __metal_driver_sifive_gpio0_output_clear,
81     .gpio.output_toggle = __metal_driver_sifive_gpio0_output_toggle,
82     .gpio.enable_io = __metal_driver_sifive_gpio0_enable_io,
83 };
84
85 #endif /* METAL_SIFIVE_GPIO0 */