16
16
*/
17
17
18
18
#include "port_api.h"
19
- #include "cy_gpio .h"
19
+ #include "gpio_api .h"
20
20
21
21
#if DEVICE_PORTIN || DEVICE_PORTOUT
22
22
@@ -26,47 +26,56 @@ extern "C" {
26
26
27
27
void port_init (port_t * obj , PortName port , int mask , PinDirection dir )
28
28
{
29
- obj -> port = Cy_GPIO_PortToAddr (port );
30
- obj -> mask = (uint8_t )mask ;
31
- uint32_t driveMode = dir == PIN_INPUT ? CY_GPIO_DM_HIGHZ : CY_GPIO_DM_STRONG ;
32
- for (int i = 0 ; i < 8 ; i ++ ) {
33
- if (0 != (mask & (1 << i ))) {
34
- Cy_GPIO_Pin_FastInit (obj -> port , i , driveMode , 0 , HSIOM_SEL_GPIO );
29
+ gpio_t gpio ;
30
+ for (uint8_t pin = 0 ; pin < 8 ; pin ++ ) {
31
+ if ((1 << pin ) & mask ) {
32
+ gpio_init (& gpio , port_pin (port , pin ));
33
+ gpio_dir (& gpio , dir );
35
34
}
36
35
}
36
+ obj -> port = port ;
37
+ obj -> mask = mask ;
38
+ obj -> drive_mode = gpio .drive_mode ;
39
+ obj -> direction = gpio .direction ;
37
40
}
38
41
39
42
void port_mode (port_t * obj , PinMode mode )
40
43
{
41
- for (int i = 0 ; i < 8 ; i ++ ) {
42
- if (0 != (obj -> mask & (1 << i ))) {
43
- uint32_t origMode = Cy_GPIO_GetDrivemode (obj -> port , i );
44
- Cy_GPIO_SetDrivemode (obj -> port , i , (origMode & CY_GPIO_DM_HIGHZ ) | mode );
44
+ gpio_t gpio = {.pin = 0 , .direction = obj -> direction , .drive_mode = obj -> drive_mode };
45
+ for (uint8_t pin = 0 ; pin < 8 ; pin ++ ) {
46
+ if ((1 << pin ) & obj -> mask ) {
47
+ gpio .pin = port_pin (obj -> port , pin );
48
+ gpio_mode (& gpio , mode );
45
49
}
46
50
}
47
51
}
48
52
49
53
void port_dir (port_t * obj , PinDirection dir )
50
54
{
51
- for (int i = 0 ; i < 8 ; i ++ ) {
52
- if (0 != (obj -> mask & (1 << i ))) {
53
- uint32_t origMode = Cy_GPIO_GetDrivemode (obj -> port , i );
54
- Cy_GPIO_SetDrivemode (obj -> port , i , origMode == PIN_OUTPUT
55
- ? (origMode & ~CY_GPIO_DM_HIGHZ )
56
- : (origMode | CY_GPIO_DM_HIGHZ ));
55
+ gpio_t gpio = {.pin = 0 , .direction = obj -> direction , .drive_mode = obj -> drive_mode };
56
+ for (uint8_t pin = 0 ; pin < 8 ; pin ++ ) {
57
+ if ((1 << pin ) & obj -> mask ) {
58
+ gpio .pin = port_pin (obj -> port , pin );
59
+ gpio_dir (& gpio , dir );
57
60
}
58
61
}
59
62
}
60
63
61
64
void port_write (port_t * obj , int value )
62
65
{
63
- obj -> port -> OUT_SET = value & obj -> mask ;
64
- obj -> port -> OUT_CLR = (~value ) & obj -> mask ;
66
+ GPIO_PRT_Type * port_type = Cy_GPIO_PortToAddr (obj -> port );
67
+ if (obj -> mask == 0xff ) {
68
+ // Optimization for when all pins on the port is used.
69
+ port_type -> OUT = value ;
70
+ } else {
71
+ port_type -> OUT_SET = value & obj -> mask ;
72
+ port_type -> OUT_CLR = (~value ) & obj -> mask ;
73
+ }
65
74
}
66
75
67
76
int port_read (port_t * obj )
68
77
{
69
- return obj -> port -> IN & obj -> mask ;
78
+ return Cy_GPIO_PortToAddr ( obj -> port ) -> IN & obj -> mask ;
70
79
}
71
80
72
81
#ifdef __cplusplus
0 commit comments