acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_gpu_nxp_pxp_osa.c (4187B)

      1 /**
      2  * @file lv_gpu_nxp_pxp_osa.c
      3  *
      4  */
      5 
      6 /**
      7  * MIT License
      8  *
      9  * Copyright (c) 2020 NXP
     10  *
     11  * Permission is hereby granted, free of charge, to any person obtaining a copy
     12  * of this software and associated documentation files (the "Software"), to deal
     13  * in the Software without restriction, including without limitation the rights to
     14  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
     15  * the Software, and to permit persons to whom the Software is furnished to do so,
     16  * subject to the following conditions:
     17  *
     18  * The above copyright notice and this permission notice (including the next paragraph)
     19  * shall be included in all copies or substantial portions of the Software.
     20  *
     21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
     22  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
     23  * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     24  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
     25  * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
     26  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     27  *
     28  */
     29 
     30 /*********************
     31  *      INCLUDES
     32  *********************/
     33 
     34 #include "lv_gpu_nxp_pxp_osa.h"
     35 #if LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT
     36 #include "../misc/lv_log.h"
     37 
     38 
     39 #include "lv_gpu_nxp_pxp.h"
     40 #include "fsl_pxp.h"
     41 
     42 #if defined(SDK_OS_FREE_RTOS)
     43     #include "FreeRTOS.h"
     44     #include "semphr.h"
     45 #endif
     46 
     47 /*********************
     48  *      DEFINES
     49  *********************/
     50 
     51 /**********************
     52  *      TYPEDEFS
     53  **********************/
     54 
     55 /**********************
     56  *  STATIC PROTOTYPES
     57  **********************/
     58 static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void);
     59 static void _lv_gpu_nxp_pxp_interrupt_deinit(void);
     60 static void _lv_gpu_nxp_pxp_run(void);
     61 
     62 /**********************
     63  *  STATIC VARIABLES
     64  **********************/
     65 
     66 #if defined(SDK_OS_FREE_RTOS)
     67     static SemaphoreHandle_t s_pxpIdle;
     68 #else
     69     static volatile bool s_pxpIdle;
     70 #endif
     71 
     72 /**********************
     73  *      MACROS
     74  **********************/
     75 
     76 /**********************
     77  *   GLOBAL FUNCTIONS
     78  **********************/
     79 
     80 /**
     81  * PXP device interrupt handler. Used to check PXP task completion status.
     82  */
     83 void PXP_IRQHandler(void)
     84 {
     85 #if defined(SDK_OS_FREE_RTOS)
     86     BaseType_t taskAwake = pdFALSE;
     87 #endif
     88 
     89     if(kPXP_CompleteFlag & PXP_GetStatusFlags(LV_GPU_NXP_PXP_ID)) {
     90         PXP_ClearStatusFlags(LV_GPU_NXP_PXP_ID, kPXP_CompleteFlag);
     91 #if defined(SDK_OS_FREE_RTOS)
     92         xSemaphoreGiveFromISR(s_pxpIdle, &taskAwake);
     93         portYIELD_FROM_ISR(taskAwake);
     94 #else
     95         s_pxpIdle = true;
     96 #endif
     97 
     98     }
     99 }
    100 
    101 /**********************
    102  *   STATIC FUNCTIONS
    103  **********************/
    104 
    105 /**
    106  * PXP interrupt initialization.
    107  */
    108 static lv_res_t _lv_gpu_nxp_pxp_interrupt_init(void)
    109 {
    110 #if defined(SDK_OS_FREE_RTOS)
    111     s_pxpIdle = xSemaphoreCreateBinary();
    112     if(s_pxpIdle == NULL) {
    113         return LV_RES_INV;
    114     }
    115 
    116     NVIC_SetPriority(LV_GPU_NXP_PXP_IRQ_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
    117 #else
    118     s_pxpIdle = true;
    119 #endif
    120 
    121     NVIC_EnableIRQ(LV_GPU_NXP_PXP_IRQ_ID);
    122 
    123     return LV_RES_OK;
    124 }
    125 
    126 /**
    127  * PXP interrupt de-initialization.
    128  */
    129 static void _lv_gpu_nxp_pxp_interrupt_deinit(void)
    130 {
    131     NVIC_DisableIRQ(LV_GPU_NXP_PXP_IRQ_ID);
    132 #if defined(SDK_OS_FREE_RTOS)
    133     vSemaphoreDelete(s_pxpIdle);
    134 #endif
    135 }
    136 
    137 /**
    138  * Function to start PXP job. This function must wait for task complete.
    139  */
    140 static void _lv_gpu_nxp_pxp_run(void)
    141 {
    142 #if !defined(SDK_OS_FREE_RTOS)
    143     s_pxpIdle = false;
    144 #endif
    145 
    146     PXP_EnableInterrupts(LV_GPU_NXP_PXP_ID, kPXP_CompleteInterruptEnable);
    147     PXP_Start(LV_GPU_NXP_PXP_ID);
    148 
    149 #if defined(SDK_OS_FREE_RTOS)
    150     if(xSemaphoreTake(s_pxpIdle, portMAX_DELAY) != pdTRUE) {
    151         LV_LOG_ERROR("xSemaphoreTake error. Task halted.");
    152         for(; ;) ;
    153     }
    154 #else
    155     while(s_pxpIdle == false) {
    156     }
    157 #endif
    158 }
    159 
    160 lv_nxp_pxp_cfg_t pxp_default_cfg = {
    161     .pxp_interrupt_init = _lv_gpu_nxp_pxp_interrupt_init,
    162     .pxp_interrupt_deinit = _lv_gpu_nxp_pxp_interrupt_deinit,
    163     .pxp_run = _lv_gpu_nxp_pxp_run
    164 };
    165 
    166 #endif /*LV_USE_GPU_NXP_PXP && LV_USE_GPU_NXP_PXP_AUTO_INIT*/