feat(drivers): GLCDC support for RX72 family (#6291)

This commit is contained in:
becseya
2024-06-03 19:43:35 +02:00
committed by GitHub
parent a8be38b297
commit ceadda8a46
12 changed files with 311 additions and 76 deletions

View File

@@ -41,6 +41,7 @@ extensions = [
'breathe',
'sphinx_sitemap',
'lv_example',
'sphinx_design',
'sphinx_rtd_dark_mode',
'link_roles',
'sphinxcontrib.mermaid'

View File

@@ -29,66 +29,160 @@ It is able to drive LCD panles via a higly configurable RGB interface.
More info can be found at the :ref:`dirver's page<renesas_glcdc>`.
Certified boards
Supported boards
----------------
LVGL has `certified <https://lvgl.io/certificate>`__ one Renesas board so far (more will come soon).
.. list-table::
:widths: 10 30 30 30
.. raw:: html
* -
- **EK-RA8D1**
- **EK-RA6M3G**
- **RX72N Envision Kit**
* - CPU
- 480MHz, Arm Cortex-M85 core
- 120MHz, Arm Cortex-M4 core
- 240MHz, Renesas RXv3 core
* - Memory
-
| 1MB internal, 64MB external SDRAM
| 2MB internal, 64MB External Octo-SPI Flash
-
| 640kB internal SRAM
| 2MB internal, 32MB external QSPI Flash
-
| 1MB internal SRAM
| 4MB internal, 32MB external QSPI Flash
* - Display
-
| 4.5”
| 480x854
| 2-lane MIPI
-
| 4.3”
| 480x272
| Parallel RGB565
-
| 4.3”
| 480x272
| Parallel RGB565
* - `Certification <https://lvgl.io/certificate>`__ video
- .. raw:: html
<iframe width="560" height="315" src="https://www.youtube.com/embed/LHPIqBV_MGA?si=mtW3g-av56bCdR4k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
<iframe width="320" height="180" src="https://www.youtube.com/embed/LHPIqBV_MGA?si=mtW3g-av56bCdR4k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
- Coming soon
- Coming soon
* - Links
- `Demo repository for EK-RA8D1 <https://github.com/lvgl/lv_port_renesas_ek-ra8d1>`__
- `Demo repository for EK-RA6M3G <https://github.com/lvgl/lv_port_renesas_ek-ra6m3g>`__
- `Demo repository for RX72N Envision Kit <https://github.com/lvgl/lv_port_renesas_rx72n-envision-kit>`__
Get started with the Renesas ecosystem
--------------------------------------
The official IDE of Renesas is called `e² studio <https://www.renesas.com/us/en/software-tool/e-studio?gad_source=1&gclid=CjwKCAjw5ImwBhBtEiwAFHDZx2V3lumaenbyJnc5Ctrclr_lEQM3G22iZgB-4F92OVLCI7xmzp1YQRoCcRgQAvD_BwE>`__. As it's Eclipse-based, it runs on Windows, Linux, and Mac as well.
.. |img_debug_btn| image:: /misc/renesas/debug_btn.png
:alt: Debug button
To get started, just download and install e² studio.
.. dropdown:: RA Family
JLink is used for debugging, it can be downloaded [here](https://www.segger.com/downloads/jlink/)
- The official IDE of Renesas is called e² studio. As it's Eclipse-based, it runs on Windows, Linux, and Mac as well. The RA family requires the latest version with FSP 5.3. It can be downloaded `here <https://www.renesas.com/us/en/software-tool/flexible-software-package-fsp>`__.
Getting started with LVGL
-------------------------
- JLink is used for debugging, it can be downloaded `here <https://www.segger.com/downloads/jlink/>`__.
LVGL provides a ready-to-use project for the `EK-RA8D1 <https://www.renesas.com/us/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra8d1-evaluation-kit-ra8d1-mcu-group>`__ development board. Its main features from the HMI's point of view are:
- 480MHz, Arm Cortex®-M85 core
- 2MB Code Flash, 1MB SRAM
- MIPI DSI & Parallel Graphics Expansion Ports
- 4.5 Inch backlit TFT display, 16.7M display colors
- 480x854 pixels resolution
- Clone the ready-to-use repository for your selected board:
**Setting up the project**
.. code-block:: shell
- First, clone the ready-to-use `lv_port_renesas_ek-ra8d1 <https://github.com/lvgl/lv_port_renesas_ek-ra8d1.git>`__ repository:
git clone https://github.com/lvgl/lv_port_renesas_ek-ra8d1.git --recurse-submodules
.. code-block:: shell
Downloading the `.zip` from GitHub doesn't work as it doesn't download the submodules.
git clone https://github.com/lvgl/lv_port_renesas_ek-ra8d1.git --recurse-submodules
- Open e² studio, go to ``File`` -> ``Import project`` and select ``General`` / ``Exsisting projects into workspace``
- Open e² studio, go to ``File`` -> ``Import project`` and select ``General`` / ``Exsisting projects into workspace``
- Browse the cloned folder and press ``Finish``.
.. image:: /misc/renesas/import.png
:alt: Importing the project
- Browse the cloned folder and press ``Finish``
- Double click on ``configuration.xml``. This will activate the `Configuration Window`.
- Double click on ``configuration.xml``. This will activate the configuration window.
Renesas' Flexible Software Package (FSP) incudes BSP and HAL layer support extended with multiple RTOS variants and other middleware stacks.
The components will be available via code generation, incuding the entry point of *"main.c"*.
Renesas' Flexible Software Package (FSP) incudes BSP and HAL layer support extended with multiple RTOS variants and other middleware stacks.
The components will be available via code generation, incuding the entry point of *"main.c"*.
Press ``Generate Project Content`` in the top right corner.
Press ``Generate Project Content`` in the top right corner.
.. image:: /misc/renesas/generate.png
:alt: Code generation with FSP
.. image:: /misc/renesas/generate.png
:alt: Code generation with FSP
- Build the project by pressing ``Ctrl`` + ``Alt`` + ``B``
- Build the project by pressing ``Ctrl`` + ``Alt`` + ``B``
- Click the Debug button (|img_debug_btn|). If prompted with `Debug Configurations`, on the `Debugger` tab select the ``J-Link ARM`` as `Debug hardware` and the proper IC as `Target Device`:
- Click the Debug button. When prompted select the `J-Link ARM` Debugger and the `R7FA8D1BH` MCU.
- ``R7FA8D1BH`` for EK-RA8D1
Note that on the ``SW1`` DIP switch (middle of the board) 7 should be ON, all others are OFF.
.. image:: /misc/renesas/debug_ra8.png
:alt: Debugger parameters for RA8
- ``R7FA6M3AH`` for EK-RA6M3G
.. image:: /misc/renesas/debug_ra6.png
:alt: Debugger parameters for RA6
.. note::
On EK-RA8D1 boards, the ``SW1`` DIP switch (middle of the board) 7 should be ON, all others are OFF.
.. dropdown:: RX Family
- The official IDE of Renesas is called e² studio. As it's Eclipse-based, it runs on Windows, Linux, and Mac as well. It can be downloaded `here <https://www.renesas.com/us/en/software-tool/e-studio>`__.
- Download and install the required driver for the debugger
- for Windows: `64 bit here <https://www.renesas.com/us/en/document/uid/usb-driver-renesas-mcu-tools-v27700-64-bit-version-windows-os?r=488806>`__ and `32 bit here <https://www.renesas.com/us/en/document/uid/usb-driver-renesas-mcu-toolse2e2-liteie850ie850apg-fp5-v27700for-32-bit-version-windows-os?r=488806>`__
- for Linux: `here <https://www.renesas.com/us/en/document/swo/e2-emulator-e2-emulator-lite-linux-driver?r=488806>`__
- RX72 requires an external compiler for the RXv3 core. A free and open-source version is available `here <https://llvm-gcc-renesas.com/rx-download-toolchains/>`__ after a registration.
The compiler must be activated in e² studio:
- Go to go to ``Help`` -> ``Add Renesas Toolchains``
- Presss the ``Add... `` button
- Browse the installation folder of the toolchain
|
.. image:: /misc/renesas/toolchains.png
:alt: Toolchains
- Clone the ready-to-use `lv_port_renesas_rx72n-envision-kit <https://github.com/lvgl/lv_port_renesas_rx72n-envision-kit.git>`__ repository:
.. code-block:: shell
git clone https://github.com/lvgl/lv_port_renesas_rx72n-envision-kit.git --recurse-submodules
Downloading the `.zip` from GitHub doesn't work as it doesn't download the submodules.
- Open e² studio, go to ``File`` -> ``Import project`` and select ``General`` / ``Exsisting projects into workspace``
- Select the cloned folder and press ``Finish``.
- Double click on ``RX72N_EnVision_LVGL.scfg``. This will activate the `Configuration Window`.
Renesas' Smart Configurator (SMC) incudes BSP and HAL layer support extended with multiple RTOS variants and other middleware stacks.
The components will be available via code generation, incuding the entry point of the application.
Press ``Generate Code`` in the top right corner.
.. image:: /misc/renesas/generate_smc.png
:alt: Code generation with SMC
- Build the project by pressing ``Ctrl`` + ``Alt`` + ``B``
- Click the Debug button (|img_debug_btn|). If prompted with `Debug Configurations`, on the `Debugger` tab select the ``E2 Lite`` as `Debug hardware` and ``R5F572NN`` as `Target Device`:
.. image:: /misc/renesas/debug_rx72.png
:alt: Debugger parameters for RX72
.. note::
Make sure that both channels of ``SW1`` DIP switch (next to ``ECN1``) are OFF.
Modify the project
------------------
@@ -96,24 +190,24 @@ Modify the project
Open a demo
~~~~~~~~~~~
In `LVGL_thread_entry <https://github.com/lvgl/lv_port_renesas_ek-ra8d1/blob/master/src/LVGL_thread_entry.c>`__, the demos are automatically enabled based on the settings in `lv_conf.h <https://github.com/lvgl/lv_port_renesas_ek-ra8d1/blob/master/src/lv_conf.h>`__.
The entry point of the main task is contained in ``src/LVGL_thread_entry.c`` in all 3 projects.
You can disable all demos (or just comment them out) and call some ``lv_example_...()`` functions, or add your custom code.
You can disable the LVGL demos (or just comment them out) and call some ``lv_example_...()`` functions, or add your custom code.
Configuration
~~~~~~~~~~~~~
``lv_conf.h`` contains the most important settings for LVGL. Namely:
``src/lv_conf.h`` contains the most important settings for LVGL. Namely:
- ``LV_COLOR_DEPTH`` to set LVGL's default color depth
- ``LV_MEM_SIZE to`` set the maximum RAM available for LVGL
- ``LV_USE_DAVE2D`` to enable the GPU
``configuration.xml`` contains the settings for the board and the MCU. By opening this file, all the hardware and software components can be customized in a visual way.
Hardware and software components can be modified in a visual way using the `Configuration Window`.
Support
-------
In case of an problems or questions open an issue in the `lv_port_renesas_ek-ra8d1 <https://github.com/lvgl/lv_port_renesas_ek-ra8d1/issues>`__ repository.
In case of any problems or questions open an issue in the corresponding repository.

View File

@@ -25,14 +25,17 @@ It is designed to automatically generate timing and data signals for different L
- Supports brightness adjustment, contrast adjustment, and gamma correction
- Supports GLCDC interrupts to handle frame-buffer switching or underflow detection
| Setting up a project and further integration with Renesas' ecosystem is described in detail on :ref:`page Renesas <renesas>`.
| Check out the `EK-RA8D1 example repository <https://github.com/lvgl/lv_port_renesas_ek-ra8d1>`__ for a ready-to-use example.
| Setting up a project and further integration with Renesas' ecosystem is described in detail on :ref:`page Renesas <renesas>`.
| Check out the following repositories for ready-to-use examples:
- `EK-RA8D1 <https://github.com/lvgl/lv_port_renesas_ek-ra8d1>`__
- `EK-RA6M3G <https://github.com/lvgl/lv_port_renesas_ek-ra6m3g>`__
- `RX72N Envision Kit <https://github.com/lvgl/lv_port_renesas_rx72n-envision-kit>`__
Prerequisites
-------------
- This diver relies on FSP generated code. Missing the step while setting up the project will cause a compilation error.
- Activate the diver by setting :c:macro:`LV_USE_DRAW_PXP` to ``1`` in your *"lv_conf.h"*.
- This diver relies on code generated by e² studio. Missing the step while setting up the project will cause a compilation error.
- Activate the diver by setting :c:macro:`LV_USE_RENESAS_GLCDC` to ``1`` in your *"lv_conf.h"*.
Usage
-----

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -11,5 +11,6 @@ sphinxcontrib-jsmath
sphinxcontrib-qthelp
sphinxcontrib-serializinghtml
sphinxcontrib-mermaid
sphinx-design
sphinx-rtd-dark-mode
typing-extensions

View File

@@ -3,6 +3,21 @@
*
*/
/*********************
*PLATFORM ABSTRACTION
*********************/
#ifdef _RENESAS_RA_
#define USE_FREE_RTOS (BSP_CFG_RTOS == 2)
#else // RX with SMC code generation
#ifndef _RENESAS_RX_
#define _RENESAS_RX_ 1
#endif
#define USE_FREE_RTOS 1
#define DISPLAY_HSIZE_INPUT0 LCD_CH0_IN_GR2_HSIZE
#define DISPLAY_VSIZE_INPUT0 LCD_CH0_IN_GR2_VSIZE
#endif /*_RENESAS_RA_*/
/*********************
* INCLUDES
*********************/
@@ -10,13 +25,22 @@
#if LV_USE_RENESAS_GLCDC
#include "LVGL_thread.h"
#ifdef _RENESAS_RA_
#include "LVGL_thread.h"
#else /* RX */
#include "hal_data.h"
#include "platform.h"
#include "r_glcdc_rx_if.h"
#include "r_glcdc_rx_pinset.h"
#endif /*_RENESAS_RA_*/
#include <stdbool.h>
#include "../../../display/lv_display_private.h"
/*********************
* DEFINES
*********************/
#define BYTES_PER_PIXEL 2
/**********************
* TYPEDEFS
@@ -25,16 +49,33 @@
/**********************
* STATIC PROTOTYPES
**********************/
static lv_display_t * glcdc_create(void * buf1, void * buf2, uint32_t buf_size, lv_display_render_mode_t render_mode);
static void glcdc_init(void);
static void give_vsync_sem_and_yield(void);
static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t * px_map);
static void flush_partial(lv_display_t * display, const lv_area_t * area, uint8_t * px_map);
static void flush_wait_direct(lv_display_t * display);
static void flush_wait_partial(lv_display_t * display);
#ifdef _RENESAS_RX_
static void enable_dave2d_drw_interrupt(void);
#endif /*_RENESAS_RX_*/
/**********************
* STATIC VARIABLES
**********************/
#ifdef _RENESAS_RX_
static uint8_t fb_background[2][LCD_CH0_IN_GR2_HSIZE * LCD_CH0_IN_GR2_VSIZE * BYTES_PER_PIXEL]__attribute__((
section(".framebuffer"), aligned(64), used));
static SemaphoreHandle_t _SemaphoreVsync = NULL;
static glcdc_cfg_t g_config;
static glcdc_runtime_cfg_t g_layer_change;
/* A global variable that Dave 2D driver relies on. (Being auto generated on RA platforms)*/
display_t g_display0_cfg;
#endif /*_RENESAS_RX_*/
/**********************
* MACROS
**********************/
@@ -45,43 +86,21 @@ static void flush_wait_partial(lv_display_t * display);
lv_display_t * lv_renesas_glcdc_direct_create(void)
{
glcdc_init();
lv_display_t * display = lv_display_create(DISPLAY_HSIZE_INPUT0, DISPLAY_VSIZE_INPUT0);
lv_display_set_flush_cb(display, flush_direct);
lv_display_set_flush_wait_cb(display, flush_wait_direct);
lv_display_set_buffers(display, &fb_background[0][0], &fb_background[1][0], sizeof(fb_background[0]),
LV_DISPLAY_RENDER_MODE_DIRECT);
return display;
return glcdc_create(&fb_background[0][0], &fb_background[1][0], sizeof(fb_background[0]),
LV_DISPLAY_RENDER_MODE_DIRECT);
}
lv_display_t * lv_renesas_glcdc_partial_create(void * buf1, void * buf2, size_t buf_size)
{
glcdc_init();
lv_display_t * display = lv_display_create(DISPLAY_HSIZE_INPUT0, DISPLAY_VSIZE_INPUT0);
lv_display_set_flush_cb(display, flush_partial);
lv_display_set_flush_wait_cb(display, flush_wait_partial);
lv_display_set_buffers(display, buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL);
return display;
return glcdc_create(buf1, buf2, buf_size, LV_DISPLAY_RENDER_MODE_PARTIAL);
}
/*This function is declared in and being used by FSP generated code modules*/
#ifdef _RENESAS_RA_
void glcdc_callback(display_callback_args_t * p_args)
{
if(DISPLAY_EVENT_LINE_DETECTION == p_args->event) {
#if BSP_CFG_RTOS == 2 /*FreeRTOS*/
BaseType_t context_switch;
/*Set Vsync semaphore*/
xSemaphoreGiveFromISR(_SemaphoreVsync, &context_switch);
/*Return to the highest priority available task*/
portYIELD_FROM_ISR(context_switch);
#else
#endif
give_vsync_sem_and_yield();
}
else if(DISPLAY_EVENT_GR1_UNDERFLOW == p_args->event) {
__BKPT(0); /*Layer 1 Underrun*/
@@ -92,18 +111,80 @@ void glcdc_callback(display_callback_args_t * p_args)
else { /*DISPLAY_EVENT_FRAME_END*/
__BKPT(0);
}
}
#else /* RX */
void glcdc_callback(glcdc_callback_args_t * p_args)
{
if(GLCDC_EVENT_LINE_DETECTION == p_args->event) {
give_vsync_sem_and_yield();
}
else if(GLCDC_EVENT_GR1_UNDERFLOW == p_args->event) {
while(1); /*Layer 1 Underrun*/
}
else if(GLCDC_EVENT_GR2_UNDERFLOW == p_args->event) {
while(1); /*Layer 2 Underrun*/
}
else {/*DISPLAY_EVENT_FRAME_END*/
while(1);
}
}
#endif /*_RENESAS_RA_*/
/**********************
* STATIC FUNCTIONS
**********************/
static lv_display_t * glcdc_create(void * buf1, void * buf2, uint32_t buf_size, lv_display_render_mode_t render_mode)
{
#ifdef _RENESAS_RA_
glcdc_init();
#else
g_display0_cfg.input->format = LCD_CH0_IN_GR2_FORMAT;
_SemaphoreVsync = xSemaphoreCreateBinary();
glcdc_init();
enable_dave2d_drw_interrupt();
#endif /*_RENESAS_RA_*/
lv_display_t * display = lv_display_create(DISPLAY_HSIZE_INPUT0, DISPLAY_VSIZE_INPUT0);
if(render_mode == LV_DISPLAY_RENDER_MODE_DIRECT) {
lv_display_set_flush_cb(display, flush_direct);
lv_display_set_flush_wait_cb(display, flush_wait_direct);
}
else if(render_mode == LV_DISPLAY_RENDER_MODE_PARTIAL) {
lv_display_set_flush_cb(display, flush_partial);
lv_display_set_flush_wait_cb(display, flush_wait_partial);
}
else {
LV_ASSERT(0);
}
lv_display_set_buffers(display, buf1, buf2, buf_size, render_mode);
return display;
}
static void give_vsync_sem_and_yield(void)
{
#if USE_FREE_RTOS
BaseType_t context_switch;
/*Set Vsync semaphore*/
xSemaphoreGiveFromISR(_SemaphoreVsync, &context_switch);
/*Return to the highest priority available task*/
portYIELD_FROM_ISR(context_switch);
#else
#endif /*USE_FREE_RTOS*/
}
static void glcdc_init(void)
{
/* Fill the Frame buffer with black colour (0x0000 in RGB565), for a clean start after previous runs */
lv_memzero(fb_background, sizeof(fb_background));
#ifdef _RENESAS_RA_
/* Initalize GLCDC driver */
uint8_t * p_fb = &fb_background[1][0];
fsp_err_t err;
@@ -124,6 +205,32 @@ static void glcdc_init(void)
(uint8_t *) p_fb,
(display_frame_layer_t) 0);
} while(FSP_ERR_INVALID_UPDATE_TIMING == err);
#else /* RX */
glcdc_err_t err;
glcdc_runtime_cfg_t layer_change;
R_GLCDC_PinSet();
err = R_GLCDC_Open(&g_config);
if(GLCDC_SUCCESS != err) {
while(1);
}
err = R_GLCDC_Control(GLCDC_CMD_START_DISPLAY, &g_config);
if(GLCDC_SUCCESS != err) {
while(1);
}
g_layer_change.input = g_config.input[GLCDC_FRAME_LAYER_2];
g_layer_change.chromakey = g_config.chromakey[GLCDC_FRAME_LAYER_2];
g_layer_change.blend = g_config.blend[GLCDC_FRAME_LAYER_2];
layer_change.input.p_base = (uint32_t *)&fb_background[1][0];
do {
err = R_GLCDC_LayerChange(GLCDC_FRAME_LAYER_2, &g_layer_change);
} while(GLCDC_ERR_INVALID_UPDATE_TIMING == err);
#endif /*_RENESAS_RA_*/
}
static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t * px_map)
@@ -138,23 +245,33 @@ static void flush_direct(lv_display_t * display, const lv_area_t * area, uint8_t
SCB_CleanInvalidateDCache_by_Addr(px_map, sizeof(fb_background[0]));
#endif
#ifdef _RENESAS_RA_
R_GLCDC_BufferChange(&g_display0_ctrl,
(uint8_t *) px_map,
(display_frame_layer_t) 0);
#else /* RX */
glcdc_err_t err;
g_layer_change.input.p_base = (uint32_t *)px_map;
do {
err = R_GLCDC_LayerChange(GLCDC_FRAME_LAYER_2, &g_layer_change);
} while(GLCDC_ERR_INVALID_UPDATE_TIMING == err);
#endif /*_RENESAS_RA_*/
}
static void flush_wait_direct(lv_display_t * display)
{
if(!lv_display_flush_is_last(display)) return;
#if BSP_CFG_RTOS == 2 /*FreeRTOS*/
#if USE_FREE_RTOS
/*If Vsync semaphore has already been set, clear it then wait to avoid tearing*/
if(uxSemaphoreGetCount(_SemaphoreVsync)) {
xSemaphoreTake(_SemaphoreVsync, 10);
}
xSemaphoreTake(_SemaphoreVsync, portMAX_DELAY);
#endif
#endif /*USE_FREE_RTOS*/
}
@@ -173,9 +290,10 @@ static void flush_partial(lv_display_t * display, const lv_area_t * area, uint8_
int32_t i;
for(i = 0; i < h; i++) {
lv_memcpy(fb, img, w * 2);
lv_memcpy(fb, img, w * BYTES_PER_PIXEL);
#if defined(RENESAS_CORTEX_M85) && (BSP_CFG_DCACHE_ENABLED)
SCB_CleanInvalidateDCache_by_Addr(fb, w * 2);
SCB_CleanInvalidateDCache_by_Addr(fb, w * BYTES_PER_PIXEL);
#endif
fb += DISPLAY_HSIZE_INPUT0;
img += w;
@@ -189,4 +307,22 @@ static void flush_wait_partial(lv_display_t * display)
return;
}
#ifdef _RENESAS_RX_
extern void drw_int_isr(void);
static void enable_dave2d_drw_interrupt(void)
{
bsp_int_ctrl_t grpal1;
/* Specify the priority of the group interrupt. */
grpal1.ipl = 5;
/* Use the BSP API to register the interrupt handler for DRW2D. */
R_BSP_InterruptWrite(BSP_INT_SRC_AL1_DRW2D_DRW_IRQ, (bsp_int_cb_t)drw_int_isr);
/* Use the BSP API to enable the group interrupt. */
R_BSP_InterruptControl(BSP_INT_SRC_AL1_DRW2D_DRW_IRQ, BSP_INT_CMD_GROUP_INTERRUPT_ENABLE, (void *)&grpal1);
}
#endif /*_RENESAS_RX_*/
#endif /*LV_USE_RENESAS_GLCDC*/