1616 */
1717
1818#include "port_api.h"
19- #include "cy_gpio .h"
19+ #include "gpio_api .h"
2020
2121#if DEVICE_PORTIN || DEVICE_PORTOUT
2222
@@ -26,47 +26,59 @@ extern "C" {
2626
2727void port_init (port_t * obj , PortName port , int mask , PinDirection dir )
2828{
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 );
3534 }
3635 }
36+ obj -> port = port ;
37+ obj -> mask = mask ;
38+ obj -> drive_mode = gpio .drive_mode ;
39+ obj -> direction = gpio .direction ;
3740}
3841
3942void port_mode (port_t * obj , PinMode mode )
4043{
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 );
4549 }
4650 }
4751}
4852
4953void port_dir (port_t * obj , PinDirection dir )
5054{
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 );
5760 }
5861 }
5962}
6063
6164void port_write (port_t * obj , int value )
6265{
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+ {
69+ // Optimization for when all pins on the port is used.
70+ port_type -> OUT = value ;
71+ }
72+ else
73+ {
74+ port_type -> OUT_SET = value & obj -> mask ;
75+ port_type -> OUT_CLR = (~value ) & obj -> mask ;
76+ }
6577}
6678
6779int port_read (port_t * obj )
6880{
69- return obj -> port -> IN & obj -> mask ;
81+ return Cy_GPIO_PortToAddr ( obj -> port ) -> IN & obj -> mask ;
7082}
7183
7284#ifdef __cplusplus
0 commit comments