88#include "amk_hal.h"
99#include "amk_gpio.h"
1010
11+ #define INPUT_FLOATING 0
12+ #define INPUT_PULL_DOWN 1
13+ #define INPUT_PULL_UP 2
14+
15+ #define OUTPUT_PUSHPULL 0
16+ #define OUTPUT_OPENDRAIN 1
17+
1118int gpio_read_pin (pin_t pin )
1219{
1320 return GPIO_PinRead (GPIO , GET_PORT (pin ), GET_PIN (pin ));
@@ -18,38 +25,48 @@ void gpio_write_pin(pin_t pin, int value)
1825 GPIO_PinWrite (GPIO ,GET_PORT (pin ), GET_PIN (pin ), value );
1926}
2027
21- static void gpio_set_mode (pin_t pin , uint32_t mode , uint32_t strength , uint32_t otype , uint32_t pull )
28+ static void gpio_set_mode (pin_t pin , uint32_t mode , uint32_t otype , uint32_t pull )
2229{
23- gpio_init_type config = {0 };
24- config .gpio_pins = GET_PIN (pin );
25- config .gpio_out_type = otype ;
26- config .gpio_pull = pull ;
27- config .gpio_mode = mode ;
28- config .gpio_drive_strength = strength ;
29- gpio_init (GET_PORT (pin ), & config );
30+ // set direction
31+ gpio_pin_config_t config = {
32+ .pinDirection = mode ,
33+ .outputLogic = 0U
34+ };
35+ uint32_t p_port = GET_PORT (pin );
36+ uint32_t p_pin = GET_PIN (pin );
37+ GPIO_PinInit (GPIO , p_port , p_pin , & config );
38+
39+ IOCON -> PIO [p_port ][p_pin ] = ((IOCON -> PIO [p_port ][p_pin ] & (~(IOCON_PIO_FUNC_MASK |
40+ IOCON_PIO_MODE_MASK |
41+ IOCON_PIO_DIGIMODE_MASK |
42+ IOCON_PIO_OD_MASK )))
43+ | IOCON_PIO_FUNC (IOCON_FUNC0 )
44+ | IOCON_PIO_MODE (pull )
45+ | IOCON_PIO_DIGIMODE (1 )
46+ | IOCON_PIO_OD (otype ));
3047}
3148
3249void gpio_set_output_pushpull (pin_t pin )
3350{
34- gpio_set_mode (pin , GPIO_MODE_OUTPUT , GPIO_DRIVE_STRENGTH_STRONGER , GPIO_OUTPUT_PUSH_PULL , GPIO_PULL_NONE );
51+ gpio_set_mode (pin , kGPIO_DigitalOutput , OUTPUT_PUSHPULL , INPUT_FLOATING );
3552}
3653
3754void gpio_set_output_opendrain (pin_t pin )
3855{
39- gpio_set_mode (pin , GPIO_MODE_OUTPUT , GPIO_DRIVE_STRENGTH_STRONGER , GPIO_OUTPUT_OPEN_DRAIN , GPIO_PULL_NONE );
56+ gpio_set_mode (pin , kGPIO_DigitalOutput , OUTPUT_OPENDRAIN , INPUT_FLOATING );
4057}
4158
4259void gpio_set_input_floating (pin_t pin )
4360{
44- gpio_set_mode (pin , GPIO_MODE_INPUT , GPIO_DRIVE_STRENGTH_STRONGER , GPIO_OUTPUT_PUSH_PULL , GPIO_PULL_NONE );
61+ gpio_set_mode (pin , kGPIO_DigitalInput , OUTPUT_PUSHPULL , INPUT_FLOATING );
4562}
4663
4764void gpio_set_input_pullup (pin_t pin )
4865{
49- gpio_set_mode (pin , GPIO_MODE_INPUT , GPIO_DRIVE_STRENGTH_STRONGER , GPIO_OUTPUT_PUSH_PULL , GPIO_PULL_UP );
66+ gpio_set_mode (pin , kGPIO_DigitalInput , OUTPUT_PUSHPULL , INPUT_PULL_UP );
5067}
5168
5269void gpio_set_input_pulldown (pin_t pin )
5370{
54- gpio_set_mode (pin , GPIO_MODE_INPUT , GPIO_DRIVE_STRENGTH_STRONGER , GPIO_OUTPUT_PUSH_PULL , GPIO_PULL_DOWN );
71+ gpio_set_mode (pin , kGPIO_DigitalInput , OUTPUT_PUSHPULL , INPUT_PULL_DOWN );
5572}
0 commit comments