Skip to content

Commit 1cb0917

Browse files
committed
refactor and enable bootloader detection
1 parent 966c729 commit 1cb0917

File tree

5 files changed

+204
-52
lines changed

5 files changed

+204
-52
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
© [2024] Microchip Technology Inc. and its subsidiaries.
3+
4+
Subject to your compliance with these terms, you may use Microchip
5+
software and any derivatives exclusively with Microchip products.
6+
You are responsible for complying with 3rd party license terms
7+
applicable to your use of 3rd party software (including open source
8+
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
9+
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
10+
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
11+
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
12+
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
13+
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
14+
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
15+
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
16+
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
17+
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
18+
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
19+
THIS SOFTWARE.
20+
*/
21+
22+
#include <stdbool.h>
23+
24+
static bool icspEnabled = false;
25+
26+
//temp stubs - replace with real implementation
27+
bool ICSP_INHIBIT_IsEnabled(void)
28+
{
29+
return icspEnabled;
30+
}
31+
32+
bool ICSP_INHIBIT_Enable()
33+
{
34+
icspEnabled = true;
35+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
© [2024] Microchip Technology Inc. and its subsidiaries.
3+
4+
Subject to your compliance with these terms, you may use Microchip
5+
software and any derivatives exclusively with Microchip products.
6+
You are responsible for complying with 3rd party license terms
7+
applicable to your use of 3rd party software (including open source
8+
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
9+
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
10+
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
11+
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
12+
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
13+
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
14+
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
15+
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
16+
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
17+
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
18+
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
19+
THIS SOFTWARE.
20+
*/
21+
22+
#ifndef ICSP_INHIBIT_H
23+
#define ICSP_INHIBIT_H
24+
25+
#include <stdbool.h>
26+
27+
bool ICSP_INHIBIT_IsEnabled(void);
28+
bool ICSP_INHIBIT_Enable(void);
29+
30+
#endif

secure_boot_and_secure_firmware_upgrade_over_canfd/icsp_inhibit.X/main.c

Lines changed: 56 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include "mcc_generated_files/flash/flash.h"
2626
#include "mcc_generated_files/flash/flash_types.h"
2727
#include "mcc_generated_files/boot/boot_config.h"
28+
#include "mcc_generated_files/uart/uart1.h"
29+
#include "mcc_generated_files/system/system.h"
2830
#include "icsp_inhibit.h"
2931
#include "terminal.h"
3032

@@ -34,18 +36,23 @@
3436

3537
#define USER_INPUT_BUFFER_SIZE 50
3638
#define UNLOCK_COMMAND "LOCKDEVICE"
37-
#define MATCHES 0
39+
#define STRCMP_MATCHES 0
3840
#define ENTER '\r'
41+
#define TERMINAL_LINE_ERROR 7
42+
#define TERMINAL_LINE_INPUT 5
43+
#define TERMINAL_LINE_HOME 1
3944

4045
// Function prototypes
4146
static void PrintWarning(void);
4247
static uint32_t GetResetAddress();
4348
static bool WasLoadedByBootloader();
4449
static void PrintBootloaderRequired(void);
45-
static char* ScanINPUT(void);
46-
static void DisableProgrammingPort(void);
50+
static char* ScanInput(void);
4751
static void PrintErrorMessage(char* error);
4852
static void PrintProgrammingDisabled(void);
53+
static void ClearUserInput(void);
54+
static void ClearErrorMessage(void);
55+
static void ResetPrompt(void);
4956

5057
// Local Variables
5158
static char userInput[USER_INPUT_BUFFER_SIZE] = {0};
@@ -57,14 +64,14 @@ int main(void)
5764

5865
SYSTEM_Initialize();
5966

60-
// if(WasLoadedByBootloader() == false)
61-
// {
62-
// PrintBootloaderRequired();
63-
//
64-
// while(1)
65-
// {
66-
// }
67-
// }
67+
if(WasLoadedByBootloader() == false)
68+
{
69+
PrintBootloaderRequired();
70+
71+
while(1)
72+
{
73+
}
74+
}
6875

6976
if(ICSP_INHIBIT_IsEnabled())
7077
{
@@ -79,11 +86,11 @@ int main(void)
7986

8087
while (1)
8188
{
82-
char* userInput = ScanINPUT();
89+
char* userInput = ScanInput();
8390

84-
if(strcmp(userInput, keyword) == MATCHES)
91+
if(strcmp(userInput, keyword) == STRCMP_MATCHES)
8592
{
86-
DisableProgrammingPort();
93+
ICSP_INHIBIT_Enable();
8794

8895
PrintProgrammingDisabled();
8996

@@ -98,10 +105,40 @@ int main(void)
98105
}
99106
}
100107

108+
static char* ScanInput(void)
109+
{
110+
uint8_t userInputOffset = 0;
111+
char key;
112+
113+
ClearUserInput();
114+
115+
do
116+
{
117+
key = UART1_Read();
118+
119+
/* If there is still an error message after the first user key press,
120+
* clear the error and reset the prompt before printing their input. */
121+
if(errorPresent)
122+
{
123+
ClearErrorMessage();
124+
ResetPrompt();
125+
}
126+
127+
if((key != ENTER) && (userInputOffset < sizeof(userInput)))
128+
{
129+
userInput[userInputOffset++] = key;
130+
printf("%c", key);
131+
}
132+
}
133+
while(key != ENTER);
134+
135+
return userInput;
136+
}
137+
101138
static void PrintProgrammingDisabled(void)
102139
{
103140
TERMINAL_EnableCursor(false);
104-
TERMINAL_MoveCursor(1);
141+
TERMINAL_MoveCursor(TERMINAL_LINE_HOME);
105142
TERMINAL_ClearScreen();
106143

107144
printf("\r\n");
@@ -112,22 +149,17 @@ static void PrintProgrammingDisabled(void)
112149
printf("Use the bootloader to load all future applications into this board.");
113150
}
114151

115-
static void DisableProgrammingPort(void)
116-
{
117-
ICSP_INHIBIT_Enable();
118-
}
119-
120152
static void ClearErrorMessage(void)
121153
{
122-
TERMINAL_MoveCursor(7);
154+
TERMINAL_MoveCursor(TERMINAL_LINE_ERROR);
123155
TERMINAL_ClearLine();
124156

125157
errorPresent = false;
126158
}
127159

128160
static void ResetPrompt(void)
129161
{
130-
TERMINAL_MoveCursor(5);
162+
TERMINAL_MoveCursor(TERMINAL_LINE_INPUT);
131163
TERMINAL_ClearLine();
132164
printf(">> ");
133165
}
@@ -147,38 +179,10 @@ static void ClearUserInput(void)
147179
memset(userInput, 0, sizeof(userInput));
148180
}
149181

150-
static char* ScanINPUT(void)
151-
{
152-
uint8_t offset = 0;
153-
char key;
154-
155-
ClearUserInput();
156-
157-
do
158-
{
159-
key = UART1_Read();
160-
161-
if(errorPresent)
162-
{
163-
ClearErrorMessage();
164-
ResetPrompt();
165-
}
166-
167-
if(key != ENTER)
168-
{
169-
userInput[offset++] = key;
170-
printf("%c", key);
171-
}
172-
}
173-
while((key != ENTER) && (offset < sizeof(userInput)));
174-
175-
return userInput;
176-
}
177-
178182
static void PrintWarning(void)
179183
{
180184
TERMINAL_EnableCursor(false);
181-
TERMINAL_MoveCursor(1);
185+
TERMINAL_MoveCursor(TERMINAL_LINE_HOME);
182186
TERMINAL_ClearScreen();
183187

184188
printf("Type LOCKDEVICE (plus ENTER) to enable the ICSP Inhibit feature.\r\n");
@@ -193,7 +197,7 @@ static void PrintWarning(void)
193197
static void PrintBootloaderRequired(void)
194198
{
195199
TERMINAL_EnableCursor(false);
196-
TERMINAL_MoveCursor(1);
200+
TERMINAL_MoveCursor(TERMINAL_LINE_HOME);
197201
TERMINAL_ClearScreen();
198202

199203
printf("NO BOOTLOADER DETECTED!\r\n");
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
© [2024] Microchip Technology Inc. and its subsidiaries.
3+
4+
Subject to your compliance with these terms, you may use Microchip
5+
software and any derivatives exclusively with Microchip products.
6+
You are responsible for complying with 3rd party license terms
7+
applicable to your use of 3rd party software (including open source
8+
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
9+
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
10+
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
11+
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
12+
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
13+
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
14+
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
15+
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
16+
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
17+
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
18+
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
19+
THIS SOFTWARE.
20+
*/
21+
22+
#include <stdbool.h>
23+
24+
void TERMINAL_ClearScreen(void)
25+
{
26+
printf("\033[2J");
27+
}
28+
29+
void TERMINAL_ClearLine(void)
30+
{
31+
printf("\33[2K\r");
32+
}
33+
34+
void TERMINAL_MoveCursor(int row)
35+
{
36+
printf("\033[%d;0f", row);
37+
}
38+
39+
/*
40+
* "\033[?25h" for cursor enable
41+
* "\033[?25l" for cursor disable
42+
*/
43+
void TERMINAL_EnableCursor(bool enable)
44+
{
45+
printf("\033[?25%c", enable ? 'h' : 'l');
46+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/* Microchip Technology Inc. and its subsidiaries. You may use this software
2+
* and any derivatives exclusively with Microchip products.
3+
*
4+
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
5+
* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
6+
* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
7+
* PARTICULAR PURPOSE, OR ITS INTERACTION WITH MICROCHIP PRODUCTS, COMBINATION
8+
* WITH ANY OTHER PRODUCTS, OR USE IN ANY APPLICATION.
9+
*
10+
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
11+
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
12+
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
13+
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
14+
* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS
15+
* IN ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF
16+
* ANY, THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
17+
*
18+
* MICROCHIP PROVIDES THIS SOFTWARE CONDITIONALLY UPON YOUR ACCEPTANCE OF THESE
19+
* TERMS.
20+
*/
21+
22+
#ifndef TERMINAL_H
23+
#define TERMINAL_H
24+
25+
#include <stdbool.h>
26+
27+
void TERMINAL_ClearScreen(void);
28+
void TERMINAL_ClearLine(void);
29+
void TERMINAL_MoveCursor(int row);
30+
31+
/*
32+
* "\033[?25h" for cursor enable
33+
* "\033[?25l" for cursor disable
34+
*/
35+
void TERMINAL_EnableCursor(bool enable);
36+
37+
#endif

0 commit comments

Comments
 (0)