Replace lpcrc with lpcfix.
lpcfix -c does what lpcrc did (fix the crc) lpxfix -p <num> sets the protection (CRP) levels new target "make protect" to enable CRP level 2.
This commit is contained in:
parent
86aefd2ff2
commit
c272beda05
|
@ -1,5 +1,3 @@
|
|||
lpcrc.exe
|
||||
lpcrc
|
||||
firmware.bin
|
||||
firmware.elf
|
||||
*.org
|
||||
|
|
11
Makefile
11
Makefile
|
@ -36,7 +36,7 @@ LD_PATH = lpc1xxx
|
|||
LD_SCRIPT = $(LD_PATH)/linkscript.ld
|
||||
LD_TEMP = $(LD_PATH)/memory.ld
|
||||
|
||||
all: firmware
|
||||
all: $(OUTFILE).bin
|
||||
|
||||
%.o : %.c
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
@ -50,10 +50,10 @@ lcd/liblcd.a lcd/render.o lcd/display.o:
|
|||
modules/libmodules.a:
|
||||
cd modules && $(MAKE) ROOT_PATH=../$(ROOT_PATH)
|
||||
|
||||
tools/lpcrc:
|
||||
tools/lpcfix:
|
||||
cd tools && $(MAKE)
|
||||
|
||||
firmware: $(OBJS) $(SYS_OBJS) $(LIBS) $(LPCRC)
|
||||
$(OUTFILE).bin: $(OBJS) $(SYS_OBJS) $(LIBS) $(LPCFIX)
|
||||
-@echo "MEMORY" > $(LD_TEMP)
|
||||
-@echo "{" >> $(LD_TEMP)
|
||||
-@echo " flash(rx): ORIGIN = 0x00000000, LENGTH = $(FLASH)" >> $(LD_TEMP)
|
||||
|
@ -66,7 +66,10 @@ firmware: $(OBJS) $(SYS_OBJS) $(LIBS) $(LPCRC)
|
|||
-@echo ""
|
||||
$(OBJCOPY) $(OCFLAGS) -O binary $(OUTFILE).elf $(OUTFILE).bin
|
||||
-@echo ""
|
||||
$(LPCRC) $(OUTFILE).bin
|
||||
$(LPCFIX) -c $(OUTFILE).bin
|
||||
|
||||
protect: $(OUTFILE).bin
|
||||
$(LPCFIX) -p 2 $(OUTFILE).bin
|
||||
|
||||
clean:
|
||||
rm -f $(OBJS) $(LD_TEMP) $(OUTFILE).elf $(OUTFILE).bin $(OUTFILE).hex
|
||||
|
|
|
@ -24,7 +24,7 @@ SIZE = $(CROSS_COMPILE)size
|
|||
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||
OBJDUMP = $(CROSS_COMPILE)objdump
|
||||
OUTFILE = firmware
|
||||
LPCRC = tools/lpcrc
|
||||
LPCFIX = tools/lpcfix
|
||||
|
||||
ifeq (LPC11xx,$(TARGET))
|
||||
CORTEX_TYPE=m0
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
lpcfix.exe
|
||||
lpcfix
|
|
@ -1,7 +1,7 @@
|
|||
CC = gcc
|
||||
LD = gcc
|
||||
LDFLAGS = -Wall -O4 -std=c99
|
||||
EXES = lpcrc
|
||||
LDFLAGS = -Wall -O2 -std=c99
|
||||
EXES = lpcfix
|
||||
|
||||
all: $(EXES)
|
||||
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
/* LPC CRP enabler / CRC fixer all-in-one
|
||||
*
|
||||
* BSD Licence
|
||||
*
|
||||
* (c) by Sec <sec@42.org> 6/2011
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define CRC_CNT 7
|
||||
#define CRC_T uint32_t
|
||||
|
||||
#define CRP_OFF 0x2fc
|
||||
#define CRP_T uint32_t
|
||||
#define CRP_MAX 4
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
FILE *fp;
|
||||
CRC_T buf[CRC_CNT];
|
||||
CRC_T crc = 0;
|
||||
CRP_T magic[]= { 0x0, 0x12345678, 0x87654321, 0x43218765, 0x4e697370};
|
||||
CRP_T crp;
|
||||
|
||||
char *prog;
|
||||
char c; /* for getopt */
|
||||
|
||||
/* Default values */
|
||||
char verbose=0; // be silent
|
||||
char do_crc= 0; // do fix crc
|
||||
int do_crp=-1; // do not change crp
|
||||
|
||||
/* init section */
|
||||
prog=argv[0];
|
||||
if(!prog)prog="blink";
|
||||
if(strrchr(prog,'/')){
|
||||
prog=strrchr(argv[0],'/');
|
||||
prog++;
|
||||
}
|
||||
|
||||
/* The big getopt loop */
|
||||
while ((c = getopt(argc, argv, "vcp:nh")) != EOF)
|
||||
switch (c) {
|
||||
case 'c':
|
||||
do_crc = 1;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
verbose++;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
do_crp = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
fprintf(stderr, "Usage: %s [options]\n\n"
|
||||
"This program fixes the CRC field for LPC firmware and optionally\n"
|
||||
"enables/disables the content read protection flags\n"
|
||||
"\n\n"
|
||||
"-n Do not change CRC information\n"
|
||||
"-v Be verbose (-v -v = even more)\n"
|
||||
"-c mode Enable CRP (Content read protection) mode\n"
|
||||
"-h This help\n\n"
|
||||
"CRP modes valid:\n"
|
||||
"0 Disable CRP\n"
|
||||
"1-3 Enable CRP 1-3\n"
|
||||
"4 Enable NO_ISP\n"
|
||||
"\n",prog);
|
||||
exit(255);
|
||||
|
||||
}
|
||||
|
||||
argc -= optind; argv += optind;
|
||||
|
||||
if (argc !=1){
|
||||
fprintf(stderr,"Error: No filename given!\n");
|
||||
exit(254);
|
||||
};
|
||||
|
||||
if(do_crp>CRP_MAX){
|
||||
fprintf(stderr, "CRP %d is not allowed\n",do_crp);
|
||||
exit(254);
|
||||
};
|
||||
|
||||
if ((fp = fopen(argv[0],"r+b")) == NULL){
|
||||
fprintf(stderr,"Error: Can't open file %s\n",argv[0]);
|
||||
exit(253);
|
||||
}
|
||||
|
||||
if (do_crc) {
|
||||
if (fread(buf,sizeof(CRC_T),CRC_CNT,fp) != CRC_CNT){
|
||||
fprintf(stderr,"Error: Read failed\n");
|
||||
exit(253);
|
||||
}
|
||||
|
||||
for (int idx=0; idx<CRC_CNT; idx++) {
|
||||
crc += buf[idx];
|
||||
}
|
||||
crc = (~crc) + 1;
|
||||
|
||||
if(verbose)
|
||||
printf("New CRC is: 0x%08x\n",crc);
|
||||
|
||||
if (fseek(fp,CRC_CNT*sizeof(CRC_T),SEEK_SET) != 0){
|
||||
fprintf(stderr, "Error: Seek failed\n");
|
||||
exit(253);
|
||||
}
|
||||
|
||||
// Write CRC
|
||||
if (do_crc)
|
||||
if (fwrite(&crc,sizeof(CRC_T),1,fp) != 1){
|
||||
fprintf(stderr, "Error: CRC write failed\n");
|
||||
exit(253);
|
||||
}
|
||||
};
|
||||
|
||||
if (verbose){
|
||||
if (fseek(fp,CRP_OFF,SEEK_SET) != 0){
|
||||
fprintf(stderr, "Error: CRP Seek failed\n");
|
||||
exit(253);
|
||||
}
|
||||
if (fread(&crp,sizeof(CRP_T),1,fp) != 1){
|
||||
fprintf(stderr,"Error: CRP Read failed\n");
|
||||
exit(253);
|
||||
}
|
||||
int idx;
|
||||
for (idx=1; idx <= CRP_MAX; idx++) {
|
||||
if(crp==magic[idx])
|
||||
break;
|
||||
}
|
||||
if(idx>CRP_MAX)
|
||||
idx=0;
|
||||
printf("Curent CRP: 0x%08x (%d)\n", crp, idx);
|
||||
};
|
||||
|
||||
if (do_crp!=-1){
|
||||
crp=magic[do_crp];
|
||||
if (fseek(fp,CRP_OFF,SEEK_SET) != 0){
|
||||
fprintf(stderr, "Error: CRP Seek failed\n");
|
||||
exit(253);
|
||||
}
|
||||
if (fwrite(&crp,sizeof(CRP_T),1,fp) != 1){
|
||||
fprintf(stderr,"Error: CRP Write failed\n");
|
||||
exit(253);
|
||||
}
|
||||
printf("New CRP value: 0x%08x\n", crp);
|
||||
};
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,97 +0,0 @@
|
|||
/*
|
||||
* Software License Agreement (BSD License)
|
||||
*
|
||||
* Copyright (c) 2010, Roel Verdult
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the copyright holders nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define BLOCK_COUNT 7
|
||||
#define BLOCK_LENGTH 4
|
||||
#define BLOCK_TOTAL (BLOCK_COUNT*BLOCK_LENGTH)
|
||||
|
||||
typedef unsigned char byte_t;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
FILE* pf;
|
||||
byte_t buf[BLOCK_TOTAL];
|
||||
uint32_t crc = 0;
|
||||
uint32_t block;
|
||||
|
||||
// Check for required arguments
|
||||
if (argc < 2)
|
||||
{
|
||||
printf("syntax: lpcrc <firmware.bin>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Try to open the supplied firmware
|
||||
if ((pf = fopen(argv[1],"rb+")) == NULL)
|
||||
{
|
||||
printf("error: could not open file [%s] with write access\n",argv[1]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Read out the data blocks used for crc calculation
|
||||
if (fread(buf,1,BLOCK_TOTAL,pf) != BLOCK_TOTAL)
|
||||
{
|
||||
printf("error: could not read required bytes\n");
|
||||
fclose(pf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Compute the crc value
|
||||
for (block=0; block<BLOCK_COUNT; block++)
|
||||
{
|
||||
crc += *((uint32_t*)(buf+(block*BLOCK_LENGTH)));
|
||||
}
|
||||
crc = (~crc) + 1;
|
||||
|
||||
// Reposition the file stream indicator to switch between read and write
|
||||
if (fseek(pf,0,SEEK_CUR) != 0)
|
||||
{
|
||||
printf("error: could not switch from read to write mode\n");
|
||||
fclose(pf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Write the crc back to the file
|
||||
if (fwrite((byte_t*)&crc,1,BLOCK_LENGTH,pf) != BLOCK_LENGTH)
|
||||
{
|
||||
printf("error: could not write crc back to file\n");
|
||||
fclose(pf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("succesfully updated crc to: %08x\n",crc);
|
||||
fclose(pf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue