summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaman <[email protected]>2023-10-23 11:30:07 +0530
committerGitHub <[email protected]>2023-10-23 14:00:07 +0800
commit144e662f42e0e6cb773de82edaeab5b1dc086334 (patch)
tree737d2362e4f06ebb57d46039e76444ad4379c720
parent9afd38455d9b02f246e4fc8a3043dc6aa0c27e80 (diff)
AT32UC3B: Implement initial GPIO driver and app test function (#8164)
-rw-r--r--bsp/avr32uc3b0/SConscript11
-rw-r--r--bsp/avr32uc3b0/application.c21
-rw-r--r--bsp/avr32uc3b0/board.c6
-rw-r--r--bsp/avr32uc3b0/drv_gpio.c84
-rw-r--r--bsp/avr32uc3b0/drv_gpio.h20
5 files changed, 134 insertions, 8 deletions
diff --git a/bsp/avr32uc3b0/SConscript b/bsp/avr32uc3b0/SConscript
index 2d83596332..af6a9504bb 100644
--- a/bsp/avr32uc3b0/SConscript
+++ b/bsp/avr32uc3b0/SConscript
@@ -2,7 +2,16 @@ import rtconfig
Import('RTT_ROOT')
from building import *
-src_bsp = ['application.c', 'startup.c', 'board.c', 'drv_uart.c']
+src_bsp = ['application.c', 'startup.c', 'board.c']
+
+if GetDepend(['RT_USING_PIN']):
+ src_bsp += ['drv_gpio.c']
+
+if GetDepend(['RT_USING_SERIAL']):
+ if GetDepend(['RT_USING_SERIAL_V2']):
+ src_bsp += ['drv_uart_v2.c']
+ else:
+ src_bsp += ['drv_uart.c']
src = File(src_bsp)
CPPPATH = [RTT_ROOT + '/bsp/avr32uc3b0']
diff --git a/bsp/avr32uc3b0/application.c b/bsp/avr32uc3b0/application.c
index 57679ffc2d..57ae438d35 100644
--- a/bsp/avr32uc3b0/application.c
+++ b/bsp/avr32uc3b0/application.c
@@ -1,27 +1,33 @@
/*
- * Copyright (c) 2006-2021, RT-Thread Development Team
+ * Copyright (c) 2006-2023, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2010-03-30 Kyle First version
+ * Date Author Notes
+ * 2010-03-30 Kyle First version
+ * 2023-10-20 Raman Gopalan Access GPIO using RT's pin abstractions
*/
#include <rtthread.h>
+#include <rtdevice.h>
#include "compiler.h"
#include "gpio.h"
+#define USER_LED_1 AVR32_PIN_PA08
+#define USER_LED_2 AVR32_PIN_PA07
+
char thread_led1_stack[1024];
struct rt_thread thread_led1;
static void rt_thread_entry_led1(void* parameter)
{
+ rt_pin_mode(USER_LED_1, PIN_MODE_OUTPUT);
while (1)
{
- gpio_tgl_gpio_pin(AVR32_PIN_PA08);
+ rt_pin_write(USER_LED_1, 1);
rt_thread_delay(RT_TICK_PER_SECOND / 2); /* sleep 0.5 second and switch to other thread */
- gpio_tgl_gpio_pin(AVR32_PIN_PA08);
+ rt_pin_write(USER_LED_1, 0);
rt_thread_delay(RT_TICK_PER_SECOND / 2);
}
}
@@ -30,12 +36,13 @@ char thread_led2_stack[1024];
struct rt_thread thread_led2;
void rt_thread_entry_led2(void* parameter)
{
+ rt_pin_mode(USER_LED_2, PIN_MODE_OUTPUT);
while (1)
{
- gpio_tgl_gpio_pin(AVR32_PIN_PA07);
+ rt_pin_write(USER_LED_2, 1);
rt_thread_delay(RT_TICK_PER_SECOND);
- gpio_tgl_gpio_pin(AVR32_PIN_PA07);
+ rt_pin_write(USER_LED_2, 0);
rt_thread_delay(RT_TICK_PER_SECOND);
}
}
diff --git a/bsp/avr32uc3b0/board.c b/bsp/avr32uc3b0/board.c
index 412ee00641..9955c39bec 100644
--- a/bsp/avr32uc3b0/board.c
+++ b/bsp/avr32uc3b0/board.c
@@ -7,6 +7,7 @@
* Date Author Notes
* 2010-03-30 Kyle First version
* 2023-10-13 Raman Gopalan Move UART specific code sections into the drv_uart files
+ * 2023-10-20 Raman Gopalan Initialize GPIO sub-system
*/
#include <rtthread.h>
@@ -16,6 +17,7 @@
#include "usart.h"
#include "intc.h"
#include "drv_uart.h"
+#include "drv_gpio.h"
/**
* System tick interrupt handler.
@@ -72,6 +74,10 @@ void rt_hw_board_init(void)
rt_hw_uart_init();
#endif
+#ifdef RT_USING_PIN
+ rt_hw_gpio_init();
+#endif
+
#ifdef RT_USING_CONSOLE
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif
diff --git a/bsp/avr32uc3b0/drv_gpio.c b/bsp/avr32uc3b0/drv_gpio.c
new file mode 100644
index 0000000000..feab4ba8c0
--- /dev/null
+++ b/bsp/avr32uc3b0/drv_gpio.c
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2023-10-18 Raman Gopalan Initial version
+ */
+
+#include <rtthread.h>
+#include <rtdevice.h>
+#include "gpio.h"
+#include <rtdbg.h>
+
+#ifdef RT_USING_PIN
+
+static void at32uc3b0_pin_mode(struct rt_device *dev, rt_base_t pin, rt_uint8_t mode)
+{
+ RT_ASSERT((AVR32_PIN_PA03 <= pin) && (pin <= AVR32_PIN_PB11));
+ /* Pointer to the register set for this GPIO port */
+ volatile avr32_gpio_port_t *gpio_regs = &AVR32_GPIO.port[pin >> 5];
+
+ /* Decide based on required mode */
+ switch (mode)
+ {
+ case PIN_MODE_OUTPUT:
+ gpio_regs->oders = 1 << (pin & 0x1F); /* Enable output driver */
+ gpio_regs->gpers = 1 << (pin & 0x1F); /* Make GPIO control this pin */
+ break;
+ case PIN_MODE_INPUT:
+ gpio_regs->oderc = 1 << (pin & 0x1F);
+ gpio_regs->gpers = 1 << (pin & 0x1F);
+ break;
+ case PIN_MODE_INPUT_PULLUP:
+ gpio_regs->puers = 1 << (pin & 0x1F);
+ break;
+ case PIN_MODE_INPUT_PULLDOWN:
+ LOG_W("Pull-down enable register not defined for AT32UC3B.");
+ break;
+ case PIN_MODE_OUTPUT_OD:
+ LOG_W("The open-drain mode is not synthesized on the current AVR32 products.");
+ break;
+ }
+}
+
+static void at32uc3b0_pin_write(struct rt_device *dev, rt_base_t pin, rt_uint8_t value)
+{
+ RT_ASSERT((AVR32_PIN_PA03 <= pin) && (pin <= AVR32_PIN_PB11));
+ if (value == PIN_HIGH)
+ {
+ gpio_set_gpio_pin(pin);
+ }
+ else
+ {
+ gpio_clr_gpio_pin(pin);
+ }
+}
+
+static rt_int8_t at32uc3b0_pin_read(struct rt_device *device, rt_base_t pin)
+{
+ RT_ASSERT((AVR32_PIN_PA03 <= pin) && (pin <= AVR32_PIN_PB11));
+ return (gpio_get_pin_value(pin) ? PIN_HIGH : PIN_LOW);
+}
+
+static const struct rt_pin_ops ops =
+{
+ at32uc3b0_pin_mode,
+ at32uc3b0_pin_write,
+ at32uc3b0_pin_read,
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+};
+
+int rt_hw_gpio_init(void)
+{
+ rt_device_pin_register("gpio", &ops, RT_NULL);
+
+ return 0;
+}
+
+#endif /* RT_USING_PIN */
diff --git a/bsp/avr32uc3b0/drv_gpio.h b/bsp/avr32uc3b0/drv_gpio.h
new file mode 100644
index 0000000000..c743f2fd26
--- /dev/null
+++ b/bsp/avr32uc3b0/drv_gpio.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2023-10-18 Raman Gopalan Initial version
+ */
+
+#ifndef __DRV_GPIO_H__
+#define __DRV_GPIO_H__
+
+#include <rtconfig.h>
+
+#ifdef RT_USING_PIN
+int rt_hw_gpio_init(void);
+#endif
+
+#endif /* __DRV_GPIO_H__ */