FreeCalypso > hg > fc-magnetite
view src/cs/services/cst/cst_stack.c @ 629:3231dd9b38c1
armio.c: make GPIOs 8 & 13 outputs driving 1 on all "classic" targets
Calypso GPIOs 8 & 13 are pinmuxed with MCUEN1 & MCUEN2, respectively,
and on powerup these pins are MCUEN, i.e., outputs driving 1. TI's code
for C-Sample and earlier turns them into GPIOs configured as outputs also
driving 1 - so far, so good - but TI's code for BOARD 41 (which covers
D-Sample, Leonardo and all real world Calypso devices derived from the
latter) switches them from MCUEN to GPIOs, but then leaves them as inputs.
Given that the hardware powerup state of these two pins is outputs driving 1,
every Calypso board design MUST be compatible with such driving; typically
these GPIO signals will be either unused and unconnected or connected as
outputs driving some peripheral. Turning these pins into GPIO inputs will
result in floating inputs on every reasonably-wired board, thus I am
convinced that this configuration is nothing but a bug on the part of
whoever wrote this code at TI.
This floating input bug had already been fixed earlier for GTA modem and
FCDEV3B targets; the present change makes the fix unconditional for all
"classic" targets. The newly affected targets are D-Sample, Leonardo,
Tango and GTM900.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 02 Jan 2020 05:38:26 +0000 |
| parents | 945cf7f506b2 |
| children |
line wrap: on
line source
/******************************************************************************* * * CST_STACK.C * * Tasks and HISRs stacks monitoring. * * (C) Texas Instruments 2000 * ******************************************************************************/ #include <stdio.h> #include <string.h> #include "nucleus.h" #include "cs_defs.h" #include "tc_defs.h" // The following stack sizes are defined in int.s #define IRQ_STACK_SIZE 128 // Number of bytes in IRQ stack #define FIQ_STACK_SIZE 512 // Number of bytes in FIQ stack. #define SYSTEM_SIZE 1024 // Define the system stack size int vsi_o_trace (char * caller, unsigned long tclass, char * text); int vsi_t_sleep (char * caller, unsigned long tvalue); void CST_stack_trace() { int jndex, count, char_count; TC_TCB *head, *ptr; extern CS_NODE *TCD_Created_Tasks_List; extern CS_NODE *TCD_Created_HISRs_List; unsigned untouched; char *top_stack, *top, *bottom; extern char *TCT_System_Limit; char result[80]; char name[9]; vsi_o_trace("CST", 0x08, "Stack Info ..."); vsi_o_trace("CST", 0x08, " Name top bottom current untouched"); vsi_o_trace("CST", 0x08, "-------------------------------------------------"); for (jndex=0; jndex<2; jndex++) { // make use of TCB and HCB having same structure from beginning to past stack info if (jndex == 0) ptr = head = (TC_TCB *)TCD_Created_Tasks_List; else { ptr = head = (TC_TCB *)TCD_Created_HISRs_List; vsi_o_trace("CST", 0x08, "-------------------------------------------------"); } count = 0; do { untouched = 0; top_stack = (char *)ptr->tc_stack_start; while (*top_stack == 0xFE && top_stack <= (char *)ptr->tc_stack_end) { untouched++; top_stack++; } // Avoid to get a spurious character when tasks names are 8 characters long memcpy (name, ptr->tc_name, 8); name[8] = 0; sprintf(result, "%8s: %08x %08x %08x 0x%x", name, ptr->tc_stack_start, ptr->tc_stack_end, ptr->tc_stack_pointer, untouched); vsi_o_trace("CST", 0x08, result); vsi_t_sleep("",30); ptr = (TC_TCB*) ptr->tc_created.cs_next; } while (ptr != head && count++ < 50); //count is protection from infinite loops } // end of for (jndex=0; jndex<2; jndex++) // stack allocation algorithm from the int.s function INT_Initialize() // // \ \ // \----------\ // \ \ // \ \ // \ \ // \ SYSSTACK \ // \ \ // \ \ // \ \ // \----------\ // \ \ // \ IRQSTACK \ // \ \ // \----------\ // \ \ // \ \ // \ FIQSTACK \ // \ \ // \ \ // \----------\ // \ \ untouched = 0; top_stack = top = (char *)TCT_System_Limit; bottom = (char *) ((unsigned)TCT_System_Limit + SYSTEM_SIZE); while (*top_stack == 0xFE && top_stack <= bottom) { untouched++; top_stack++; } // "CST" being the current active task with its related CST_Stack, // the System Stack is unused (current sp_svc = System Stack Bottom) sprintf(result, "SYSSTACK: %08x %08x %08x 0x%x", top, bottom, bottom, // current sp_svc = System Stack Bottom untouched); vsi_o_trace("CST", 0x08, "-------------------------------------------------"); vsi_o_trace("CST", 0x08, result); vsi_t_sleep("",30); untouched = 0; top_stack = top = bottom + 4; bottom = (char *) ((unsigned)bottom + IRQ_STACK_SIZE); while (*top_stack == 0xFE && top_stack <= bottom) { untouched++; top_stack++; } // Since the processor is in supervisor mode (no IRQ & no FIQ), // current sp_irq = IRQ Stack bottom sprintf(result, "IRQSTACK: %08x %08x %08x 0x%x", top, bottom, bottom, // current sp_irq = IRQ Stack bottom untouched); vsi_o_trace("CST", 0x08, result); vsi_t_sleep("",30); untouched = 0; top_stack = top = bottom + 4; bottom = (char *) ((unsigned)bottom + FIQ_STACK_SIZE); while (*top_stack == 0xFE && top_stack <= bottom) { untouched++; top_stack++; } // Since the processor is in supervisor mode (no IRQ & no FIQ), // current sp_fiq = FIQ Stack bottom sprintf(result, "FIQSTACK: %08x %08x %08x 0x%x", top, bottom, bottom, // current sp_fiq = FIQ Stack bottom untouched); vsi_o_trace("CST", 0x08, result); vsi_o_trace("CST", 0x08, "-------------------------------------------------"); vsi_t_sleep("",30); }
