]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/blob - packages/ti/drv/gpio/test/led_blink/src/main_led_blink.c
[OSAL]: Added testcase for task sub module
[processor-sdk/pdk.git] / packages / ti / drv / gpio / test / led_blink / src / main_led_blink.c
1 /**
2  *  \file   main_led_blink.c
3  *
4  *  \brief  Example application main file. This application will toggle the led.
5  *          The led toggling will be done inside an callback function, which
6  *          will be called by Interrupt Service Routine. Interrupts are
7  *          triggered manually and no external source is used to trigger
8  *          interrupts.
9  *
10  */
12 /*
13  * Copyright (C) 2014 - 2022 Texas Instruments Incorporated - http://www.ti.com/
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  *
19  * Redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer.
21  *
22  * Redistributions in binary form must reproduce the above copyright
23  * notice, this list of conditions and the following disclaimer in the
24  * documentation and/or other materials provided with the
25  * distribution.
26  *
27  * Neither the name of Texas Instruments Incorporated nor the names of
28  * its contributors may be used to endorse or promote products derived
29  * from this software without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
37  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
41  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42  *
43  */
45 #include <ti/csl/arch/csl_arch.h>
47 #include <ti/osal/osal.h>
48 #include <ti/osal/TaskP.h>
50 #include <stdio.h>
51 #include <string.h>
53 /* TI-RTOS Header files */
54 #include <ti/drv/gpio/GPIO.h>
55 #include <ti/drv/gpio/soc/GPIO_soc.h>
57 #include "GPIO_log.h"
58 #include "GPIO_board.h"
60 #include <ti/board/board.h>
62 #if defined(SOC_J721E) || defined(SOC_J7200) || defined(SOC_AM64X) || defined(SOC_J721S2) || defined(SOC_J784S4)
63 #include <ti/csl/soc.h>
64 #endif
66 #if defined(SOC_AM65XX) || defined(SOC_J721E) || defined(SOC_J7200) || defined(SOC_AM64X) || defined(SOC_J721S2) || defined(SOC_J784S4)
67 #include <ti/drv/sciclient/sciclient.h>
68 #endif
70 #if defined (SOC_AM65XX) || defined (SOC_J721E) || defined (SOC_J7200) || defined(SOC_J721S2) || defined(SOC_J784S4)
71 #include <ti/csl/csl_clec.h>
72 #endif
74 #if defined (BUILD_C7X)
75 #include <ti/csl/arch/csl_arch.h>
76 #endif
78 /**********************************************************************
79  ************************** Macros ************************************
80  **********************************************************************/
81 #if defined (SIM_BUILD)
82 /* TODO: To Test on EVM Update the delay macro. */
83 #define DELAY_VALUE       (1)
84 #else
85 #define DELAY_VALUE       (500U)   /* 500 msec */
86 #endif
88 #define APP_TSK_STACK_MAIN              (0x8000U)
90 #if defined (USE_BIOS) || defined (FREERTOS)
91 #if defined (SOC_J721E) || defined(SOC_J7200) || defined (SOC_TPR12) || defined (SOC_AWR294X) || defined(SOC_AM64X) || defined(SOC_AM65XX) || defined(SOC_J721S2) || defined(SOC_J784S4)
92 static uint8_t  gAppTskStackMain[APP_TSK_STACK_MAIN] __attribute__((aligned(32)));
93 #endif
94 #endif
96 /**********************************************************************
97  ************************** Internal functions ************************
98  **********************************************************************/
99 /* Delay function */
100 void AppDelay(unsigned int delayVal);
102 /* Callback function */
103 void AppGpioCallbackFxn(void);
106 #if defined(idkAM574x) || defined(idkAM572x) || defined(idkAM571x)
107 /* GPIO clock and pinmux configurations */
108 extern void AppGPIOInit(void);
109 #endif
111 #if defined(idkAM574x) || defined(idkAM572x)
112 extern void GPIOApp_UpdateBoardInfo(void);
113 extern void GPIOAppUpdateConfig(uint32_t *gpioBaseAddr, uint32_t *gpioPin);
114 #endif
116 #if defined(SOC_AM65XX) || defined(SOC_J721E) || defined(SOC_J7200) || defined(SOC_AM64X) || defined(SOC_J721S2) || defined(SOC_J784S4)
117 /* Main domain GPIO interrupt events */
118 #define MAIN_GPIO_INTRTR_GPIO0_BANK0_INT (0x000000C0) /* GPIO port 0 bank 0 interrupt event #, input to MAIN_GPIO_INTRTR */
119 #define MAIN_GPIO_INTRTR_GPIO1_BANK0_INT (0x000000C8) /* GPIO port 1 bank 0 interrupt event #, input to MAIN_GPIO_INTRTR */
121 /* Main domain GPIO interrupt events */
122 #define WKUP_GPIO_INTRTR_GPIO0_BANK0_INT (0x0000003C) /* GPIO port 0 bank 0 interrupt event #, input to WKUP_GPIO_INTRTR */
125 /* Main to MCU GPIO interrupt router mux output events */
126 #define CSL_MAIN2MCU_INTRTR_PLS_GPIOMUX_INT0_DFLT_PLS  (0x00000000)
127 #define CSL_MAIN2MCU_INTRTR_PLS_GPIOMUX_INT31_DFLT_PLS (0x0000001F)
129 void GPIO_configIntRouter(uint32_t portNum, uint32_t pinNum, uint32_t gpioIntRtrOutIntNum, GPIO_v0_HwAttrs *cfg)
131     GPIO_IntCfg       *intCfg;
132     uint32_t           bankNum = 0U;
134     intCfg = cfg->intCfg;
136 #if defined (am65xx_evm) || defined (am65xx_idk)
138     struct tisci_msg_rm_get_resource_range_resp res = {0};
139     struct tisci_msg_rm_get_resource_range_req  req = {0};
140     int32_t retVal = 0;
141     uint16_t intNum, dst_id = TISCI_DEV_GIC0;
143     {
144         #if defined(BUILD_MCU)
145         CSL_ArmR5CPUInfo r5CpuInfo;
146         CSL_armR5GetCpuID(&r5CpuInfo);
147         if (r5CpuInfo.grpId == (uint32_t)CSL_ARM_R5_CLUSTER_GROUP_ID_0)
148         {
149             if(r5CpuInfo.cpuID == 0U)
150             {
151                 dst_id = TISCI_DEV_MCU_ARMSS0_CPU0;
152             }
153             else
154             {
155                 dst_id = TISCI_DEV_MCU_ARMSS0_CPU1;
156             }
157         }
158         #endif /* defined(BUILD_MCU) */
159     }
161     req.type = TISCI_DEV_WKUP_GPIOMUX_INTRTR0;
162     req.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
163     retVal = Sciclient_rmGetResourceRange(&req,
164                                         &res,
165                                         SCICLIENT_SERVICE_WAIT_FOREVER);
167     if (CSL_PASS != retVal || res.range_num == 0)
168     {
169         UART_printf("\n GPIO LED Blink App - Error \n");
170         UART_printf("\n Could not register interrupts \n");
171     }
172     else
173     {
174         retVal = Sciclient_rmIrqTranslateIrOutput(req.type,
175                                         res.range_start,
176                                         dst_id,
177                                         &intNum);
178     /* no main domain GPIO pins directly connected to LEDs on GP EVM,
179        use WKUP domain GPIO pins which connected to LEDs on base board */
180     cfg->baseAddr = CSL_WKUP_GPIO0_BASE;
182     bankNum = pinNum/16; /* Each GPIO bank has 16 pins */
184     /* WKUP GPIO int router input interrupt is the GPIO bank interrupt */
185     intCfg[pinNum].intNum = intNum + bankNum;
186     intCfg[pinNum].intNum = intNum + bankNum;
188     intCfg[pinNum].eventId = 0;
189     intCfg[pinNum].intcMuxNum = INVALID_INTC_MUX_NUM;
190     intCfg[pinNum].intcMuxInEvent = 0;
191     intCfg[pinNum].intcMuxOutEvent = 0;
193     }
194 #else
195     /* Use main domain GPIO pins directly connected to IDK EVM */
197     bankNum = pinNum/16; /* Each GPIO bank has 16 pins */
198     if (portNum == 0)
199     {
200         /* MAIN GPIO int router input interrupt is the GPIO bank interrupt */
201     #if defined (__aarch64__)
202         #if defined (SOC_AM65XX)
203             intCfg[pinNum].intNum = CSL_GIC0_INTR_MAIN_GPIOMUX_INTROUTER_MAIN_GPIOMUX_INTROUTER_MAIN_0_BUS_OUTP_0 + bankNum;
204         #endif
205     #else
206         #if defined (SOC_AM65XX)
207             intCfg[pinNum].intNum = CSL_MCU0_INTR_MAIN2MCU_PULSE_INTR0_OUTP_0 + bankNum;
208         #endif
209     #endif
210     }
211     else
212     {
213     #if defined (__aarch64__)
214         #if defined (SOC_AM65XX)
215             intCfg[pinNum].intNum = CSL_GIC0_INTR_MAIN_GPIOMUX_INTROUTER_MAIN_GPIOMUX_INTROUTER_MAIN_0_BUS_OUTP_6 + bankNum;
216         #endif
217     #else
218         #if defined (SOC_AM65XX)
219             intCfg[pinNum].intNum = CSL_MCU0_INTR_MAIN2MCU_PULSE_INTR0_OUTP_6 + bankNum;
220         #endif
221     #endif
222     }
223     intCfg[pinNum].eventId = 0;
224     intCfg[pinNum].intcMuxNum = INVALID_INTC_MUX_NUM;
225     intCfg[pinNum].intcMuxInEvent = 0;
226     intCfg[pinNum].intcMuxOutEvent = 0;
228 #endif
230 #if defined(j721e_sim) || defined (j721e_evm) || defined (j7200_evm) || defined(j721s2_evm) || defined(j784s4_evm)
232     /* no main domain GPIO pins directly connected to LEDs on GP EVM,
233        use WKUP domain GPIO pins which connected to LEDs on base board */
234     cfg->baseAddr = CSL_WKUP_GPIO0_BASE;
236 #endif
238 #if defined(am64x_evm)
240     cfg->baseAddr = CSL_GPIO0_BASE;
242     bankNum = pinNum/16; /* Each GPIO bank has 16 pins */
244     /* Main GPIO int router input interrupt is the GPIO bank interrupt */
245     #if defined (BUILD_MPU)
246         intCfg[pinNum].intNum = CSLR_GICSS0_SPI_MAIN_GPIOMUX_INTROUTER0_OUTP_0 + bankNum;
247     #endif
248     #if defined (BUILD_MCU)
249         intCfg[pinNum].intNum = CSLR_R5FSS0_CORE0_INTR_MAIN_GPIOMUX_INTROUTER0_OUTP_0 + bankNum;
250     #endif
251     intCfg[pinNum].intcMuxNum = INVALID_INTC_MUX_NUM;
252     intCfg[pinNum].intcMuxInEvent = 0;
253     intCfg[pinNum].intcMuxOutEvent = 0;
255 #endif
257     GPIO_log("\nIntConfig:  portNum[%d], pinNum[%d], bankNum[%d], intNum[%d], eventId[%d]", portNum, pinNum,bankNum, intCfg[pinNum].intNum, intCfg[pinNum].eventId);
259 #endif /* #if defined(SOC_AM65XX) || defined(SOC_J721E) || defined(SOC_AM64X) */
261 /*
262  *  ======== Board_initI2C ========
263  */
264 static void Board_initGPIO(void)
266     Board_initCfg boardCfg;
268 #if defined(SOC_K2H) || defined(SOC_K2K) || defined(SOC_K2E) || defined(SOC_K2L) || defined(SOC_K2G) || defined(SOC_C6678) || defined(SOC_C6657) || defined(SOC_OMAPL137) || defined(SOC_OMAPL138) || defined(SOC_AM65XX) || defined(SOC_J721E) || defined(SOC_J7200) || defined(SOC_AM64X) || defined(SOC_J721S2) || defined(SOC_J784S4)
269     GPIO_v0_HwAttrs gpio_cfg;
271     /* Get the default SPI init configurations */
272     GPIO_socGetInitCfg(GPIO_LED0_PORT_NUM, &gpio_cfg);
274 #if defined(SOC_K2G)
275     /* Setup GPIO interrupt configurations */
276     GPIO_socSetIntMux(GPIO_LED0_PORT_NUM, GPIO_LED0_PIN_NUM, NULL, GPIO_MUX_SEL);
277 #endif
278 #if defined(SOC_OMAPL137) || defined(SOC_OMAPL138)
279     /* Setup GPIO interrupt configurations */
280     GPIO_socSetBankInt(GPIO_LED0_PORT_NUM, GPIO_LED0_PIN_NUM, NULL);
281 #endif
282 #endif
284 #if defined(evmK2E) || defined(evmC6678)
285     boardCfg = BOARD_INIT_MODULE_CLOCK |
286         BOARD_INIT_UART_STDIO;
287 #else
288     boardCfg = BOARD_INIT_PINMUX_CONFIG |
289         BOARD_INIT_MODULE_CLOCK |
290         BOARD_INIT_UART_STDIO;
291 #endif
292     Board_init(boardCfg);
294 #if defined(idkAM572x) || defined(idkAM574x)
295     GPIOApp_UpdateBoardInfo();
296 #endif
298     /* Modify the default GPIO configurations if necessary */
299 #if defined (am65xx_evm) || defined (am65xx_idk)
301     GPIO_configIntRouter(GPIO_LED0_PORT_NUM, GPIO_LED0_PIN_NUM, 0, &gpio_cfg);
303     /* Set the default GPIO init configurations */
304     GPIO_socSetInitCfg(GPIO_LED0_PORT_NUM, &gpio_cfg);
306 #endif
308     /* Modify the default GPIO configurations if necessary */
309 #if defined (j721e_evm)  || defined (j721e_sim) || defined (j7200_evm) || defined(j721s2_evm) || defined(j784s4_evm)
311         /* change default GPIO port from MAIN GPIO0 to WAKEUP GPIO0 to access TP45 */
312     gpio_cfg.baseAddr = CSL_WKUP_GPIO0_BASE;
314     GPIO_configIntRouter(GPIO_LED0_PORT_NUM, GPIO_LED0_PIN_NUM, 0, &gpio_cfg);
316     /* For J721E EVM, there is not GPIO pin directly connected to LEDs */
317         /* J7ES: use WAKEUP GPIO0_6 --> TP45 for testing */
318     /* Set the default GPIO init configurations */
319     GPIO_socSetInitCfg(GPIO_LED0_PORT_NUM, &gpio_cfg);
321 #endif
322 #if defined (SOC_TPR12) || defined (SOC_AWR294X)
323   GPIO_board_init_pinconfig();
324 #endif
326 #if defined (am64x_evm)
327     GPIO_configIntRouter(GPIO_LED0_PORT_NUM, GPIO_LED0_PIN_NUM, 0, &gpio_cfg);
328     GPIO_socSetInitCfg(GPIO_LED0_PORT_NUM, &gpio_cfg);
329     /* set pinmux for user led0 pin */
330     *((volatile uint32_t *)(0xf4004)) = 0x50007;
331 #endif
334 /**********************************************************************
335  ************************** Global Variables **************************
336  **********************************************************************/
337 volatile uint32_t gpio_intr_triggered = 0;
338 volatile uint32_t last_gpio_intr_count = 0;
339 uint32_t gpioBaseAddr;
340 uint32_t gpioPin;
342 /*
343  *  ======== test function ========
344  */
345 #if defined (RTOS_ENV)
346 void gpio_test(void* arg0, void* arg1)
348 #else
349 int main()
351     Board_initGPIO();
352 #endif
354     /* GPIO initialization */
355     GPIO_init();
357     /* Set the callback function */
358     GPIO_setCallback(USER_LED0, AppGpioCallbackFxn);
360     /* Enable GPIO interrupt on the specific gpio pin */
361     GPIO_enableInt(USER_LED0);
363     /* Write high to gpio pin to control LED1 */
364     GPIO_write((USER_LED1), GPIO_PIN_VAL_HIGH);
365     AppDelay(DELAY_VALUE);
367     GPIO_log("\n GPIO Led Blink Application \n");
369 #if defined(SOC_K2L) || defined(SOC_C6678) || defined(SOC_C6657)
370     /* No GPIO pin directly connected to user LED's on K2L/C6678/C6657/AM65xx EVM, just trigger interrupt once */
371     GPIO_toggle(USER_LED0);
372     while (!gpio_intr_triggered);
374     UART_printStatus("\n All tests have passed \n");
375 #ifdef USE_BIOS
376     Task_exit();
377 #endif
379 #elif defined (SOC_TPR12) || defined (SOC_AWR294X)
380     {
381         uint32_t loopCnt = 4;
382         while (loopCnt-- > 0U)
383         {
384             uint32_t pinVal;
385             while (!gpio_intr_triggered);
386             pinVal = GPIO_read(USER_LED0);
387             GPIO_log(" GPIO USER_LED0 Input pin Value: %d\n", pinVal);
388             gpio_intr_triggered = 0;
389             /* Toggle LED1 */
390             GPIO_toggle(USER_LED1);
391             AppDelay(DELAY_VALUE);
392         }
393         GPIO_log("\n All tests have passed \n");
394     }
395 #else
397     UART_printStatus("\n Awaiting interrupt occurrence \n");
399     while(1)
400     {
401 #if defined(SOC_AM574x) || defined(SOC_AM572x) || defined(SOC_AM571x)|| defined(SOC_AM335x) || defined(SOC_AM437x)
403 #if defined (idkAM572x) || defined (idkAM574x)
404         /* Update GPIO info based on the board */
405         GPIOAppUpdateConfig(&gpioBaseAddr, &gpioPin);
406 #else
407         gpioBaseAddr = GPIO_BASE_ADDR;
408         gpioPin      = GPIO_LED_PIN;
409 #endif
410         /* Trigger interrupt */
411         GPIOTriggerPinInt(gpioBaseAddr, 0, gpioPin);
412 #endif
413 #if defined(SOC_K2H) || defined(SOC_K2K) || defined(SOC_K2E) || defined(SOC_K2G) || defined(SOC_OMAPL137) || defined(SOC_OMAPL138) || defined(SOC_AM65XX) || defined(SOC_J721E) || defined(SOC_J7200) || defined(SOC_J721S2) || defined(SOC_J784S4)
414         GPIO_toggle(USER_LED0);
415 #elif defined(SOC_AM64X)
416         /* In AM64x GP EVM, USER_LED0 (TEST_LED1) is connected to IO EXPANDER.
417          * So, toggling USER_LED1 (TEST_LED2) - connected to MCU_GPIO0_5(EVM-LD26) */
418         GPIO_toggle(USER_LED1);
419 #endif
420         AppDelay(DELAY_VALUE);
421         if (gpio_intr_triggered != last_gpio_intr_count)
422         {
423             UART_printf("\n Blink Iteration - %d \n", gpio_intr_triggered);
424             last_gpio_intr_count = gpio_intr_triggered;
426             /* This string is required to ensure automated tests and result
427                 parser is able to determine status of this application */
428             UART_printStatus("\n All tests have passed \n");
429         }
430     }
431 #endif
434 #if defined (RTOS_ENV)
435 /*
436  *  ======== main ========
437  */
438 int main(void)
440     /* Call board init functions */
441     Board_initGPIO();
443 #if defined(idkAM574x) || defined(idkAM572x) || defined(idkAM571x)
444     AppGPIOInit();
445 #endif
447 #if defined (SOC_J721E) || defined(SOC_J7200) || defined (SOC_TPR12) || defined (SOC_AWR294X) || defined(SOC_AM64X) || defined(SOC_AM65XX) || defined(SOC_J721S2) || defined(SOC_J784S4)
448     TaskP_Params taskParams;
449     
450     /*  This should be called before any other OS calls (like Task creation, OS_start, etc..) */
451     OS_init();
453     TaskP_Params_init(&taskParams);
454     taskParams.priority =2;
455     taskParams.stack        = gAppTskStackMain;
456     taskParams.stacksize    = sizeof (gAppTskStackMain);
458     TaskP_create(gpio_test, &taskParams);
459 #endif
461     OS_start();
463     return (0);
465 #endif
467 /*
468  *  ======== AppDelay ========
469  */
470 void AppDelay(unsigned int delayVal)
472     Osal_delay(delayVal);
475 /*
476  *  ======== AppLoopDelay ========
477  */
478 void AppLoopDelay(uint32_t delayVal)
480     volatile uint32_t i;
482     for (i = 0; i < (delayVal * 1000); i++)
483         ;
486 /*
487  *  ======== Callback function ========
488  */
489 #if defined (SOC_TPR12) || defined (SOC_AWR294X)
490 void AppGpioCallbackFxn(void)
492     gpio_intr_triggered = 1;
494 #else
495 void AppGpioCallbackFxn(void)
497 #if !defined(SOC_J721E) || !defined(SOC_J7200) || !defined(SOC_AM64X) || defined(SOC_J721S2) || defined(SOC_J784S4)
498     /* Toggle LED1 */
499     GPIO_toggle(USER_LED1);
500     AppLoopDelay(DELAY_VALUE);
501 #endif
502     gpio_intr_triggered++;
504 #endif
506 #if defined(BUILD_MPU) || defined (BUILD_C7X)
507 extern void Osal_initMmuDefault(void);
508 void InitMmu(void)
510     Osal_initMmuDefault();
512 #endif