Need to handle padding at the end of the binary
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2507 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
36dab07f02
commit
5dfa34ce1c
@ -49,9 +49,13 @@
|
||||
#include "lpchdr.h"
|
||||
|
||||
/************************************************************************************
|
||||
* Definitions
|
||||
* Pre-processor Definitions
|
||||
************************************************************************************/
|
||||
|
||||
#define IO_BUF_SIZE 1024
|
||||
#define HDR_SIZE 0x80
|
||||
#define HDR_CRC_SIZE 0x6c
|
||||
|
||||
/************************************************************************************
|
||||
* Private Data
|
||||
************************************************************************************/
|
||||
@ -108,10 +112,10 @@ static void parse_args(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t infilecrc32(int infd, size_t len)
|
||||
static inline uint32_t infilecrc32(int infd, size_t len, size_t padlen)
|
||||
{
|
||||
off_t offset;
|
||||
uint8_t buffer[1024];
|
||||
uint8_t buffer[IO_BUF_SIZE];
|
||||
ssize_t nbytes;
|
||||
size_t bytesread;
|
||||
uint32_t crc;
|
||||
@ -126,7 +130,7 @@ static uint32_t infilecrc32(int infd, size_t len)
|
||||
crc = 0;
|
||||
for (bytesread = 0; bytesread < len; bytesread += nbytes)
|
||||
{
|
||||
nbytes = read(infd, buffer, 1024);
|
||||
nbytes = read(infd, buffer, IO_BUF_SIZE);
|
||||
if (nbytes < 0)
|
||||
{
|
||||
fprintf(stderr, "read failed: %s\n", strerror(errno));
|
||||
@ -142,13 +146,17 @@ static uint32_t infilecrc32(int infd, size_t len)
|
||||
crc = crc32part(buffer, nbytes, crc);
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
|
||||
/* Add the zero-padding at the end of the binary in the CRC */
|
||||
|
||||
memset(buffer, 0, IO_BUF_SIZE);
|
||||
return crc32part(buffer, padlen, crc);
|
||||
}
|
||||
|
||||
static void writefile(int infd, int outfd, size_t len)
|
||||
static inline void writefile(int infd, int outfd, size_t len, size_t padlen)
|
||||
{
|
||||
off_t offset;
|
||||
uint8_t buffer[1024];
|
||||
uint8_t buffer[IO_BUF_SIZE];
|
||||
ssize_t nbytesread;
|
||||
ssize_t nbyteswritten;
|
||||
size_t totalread;
|
||||
@ -162,7 +170,7 @@ static void writefile(int infd, int outfd, size_t len)
|
||||
|
||||
for (totalread = 0; totalread < len; totalread += nbytesread)
|
||||
{
|
||||
nbytesread = read(infd, buffer, 1024);
|
||||
nbytesread = read(infd, buffer, IO_BUF_SIZE);
|
||||
if (nbytesread < 0)
|
||||
{
|
||||
fprintf(stderr, "read failed: %s\n", strerror(errno));
|
||||
@ -188,6 +196,21 @@ static void writefile(int infd, int outfd, size_t len)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Write the zero-padding at the end of the binary */
|
||||
|
||||
memset(buffer, 0, IO_BUF_SIZE);
|
||||
nbyteswritten = write(outfd, buffer, padlen);
|
||||
if (nbyteswritten < 0)
|
||||
{
|
||||
fprintf(stderr, "write failed: %s\n", strerror(errno));
|
||||
exit(4);
|
||||
}
|
||||
else if (nbyteswritten != padlen)
|
||||
{
|
||||
fprintf(stderr, "Short writes not handled\n");
|
||||
exit(4);
|
||||
}
|
||||
}
|
||||
|
||||
/************************************************************************************
|
||||
@ -199,6 +222,7 @@ int main(int argc, char **argv, char **envp)
|
||||
struct lpc313x_header_s g_hdr;
|
||||
struct stat buf;
|
||||
ssize_t nbytes;
|
||||
size_t padlen;
|
||||
int infd;
|
||||
int outfd;
|
||||
int ret;
|
||||
@ -239,12 +263,19 @@ int main(int argc, char **argv, char **envp)
|
||||
g_hdr.magic = 0x41676d69;
|
||||
g_hdr.imageType = 0x0000000b;
|
||||
g_hdr.imageLength = (buf.st_size + sizeof(struct lpc313x_header_s) + 511) & ~0x1ff;
|
||||
g_hdr.execution_crc32 = infilecrc32(infd, buf.st_size);
|
||||
g_hdr.header_crc32 = crc32((const uint8_t*)&g_hdr, 0x6c);
|
||||
|
||||
/* This is how much we must pad at the end of the binary image. */
|
||||
|
||||
padlen = g_hdr.imageLength - buf.st_size;
|
||||
|
||||
/* Calculate CRCs */
|
||||
|
||||
g_hdr.execution_crc32 = infilecrc32(infd, buf.st_size, padlen);
|
||||
g_hdr.header_crc32 = crc32((const uint8_t*)&g_hdr, HDR_CRC_SIZE);
|
||||
|
||||
/* Write the header */
|
||||
|
||||
nbytes = write(outfd, &g_hdr, 0x80);
|
||||
nbytes = write(outfd, &g_hdr, HDR_SIZE);
|
||||
if (nbytes != 0x80)
|
||||
{
|
||||
fprintf(stderr, "write of header to of %s failed: %s\n", g_outfile, strerror(errno));
|
||||
@ -253,7 +284,7 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
/* Copy the input file to the output */
|
||||
|
||||
writefile(infd, outfd, buf.st_size);
|
||||
writefile(infd, outfd, buf.st_size, padlen);
|
||||
close(infd);
|
||||
close(outfd);
|
||||
return 0;
|
||||
|
60
configs/ea3131/tools/mklpc.sh
Executable file
60
configs/ea3131/tools/mklpc.sh
Executable file
@ -0,0 +1,60 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script lies in sub-directory configs/ea3131/tools but make be executed
|
||||
# from either that directory or TOPDIR
|
||||
|
||||
MYNAME=`basename $0`
|
||||
if [ -x "$PWD/$MYNAME" ]; then
|
||||
TOPDIR="$PWD/../../.."
|
||||
else
|
||||
if [ -x "$PWD/configs/ea3131/tools/$MYNAME" ]; then
|
||||
TOPDIR="$PWD"
|
||||
else
|
||||
echo "This script must be executed from a known director"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
echo "TOOLDIR: $TOOLDIR"
|
||||
|
||||
# The lpchdr could be named lpchdr.exe if we are running under Cygwin or
|
||||
# just lpchdr under Linux
|
||||
|
||||
TOOLDIR=$TOPDIR/configs/ea3131/tools
|
||||
|
||||
if [ ! -d "$TOOLDIR" ]; then
|
||||
echo "Tool directory $TOOLDIR does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -x "$TOOLDIR/lpchdr.exe" ]; then
|
||||
LPCHDR="$TOOLDIR/lpchdr.exe"
|
||||
else
|
||||
if [ -x "$TOOLDIR/lpchdr" ]; then
|
||||
LPCHDR="$TOOLDIR/lpchdr"
|
||||
else
|
||||
echo "lpchdr executable does not exist in $TOODIR"
|
||||
echo " - cd $TOOLDIR"
|
||||
echo " - make"
|
||||
fi
|
||||
fi
|
||||
echo "LPCHDR: $LPCHDR"
|
||||
|
||||
# Now get the path to the NuttX executable
|
||||
|
||||
NUTTXPATH="$TOPDIR/nuttx"
|
||||
|
||||
if [ ! -f "$NUTTXPATH" ]; then
|
||||
echo "NuttX binary does not exist at $NUTTXPATH"
|
||||
echo " - cd $TOPDIR"
|
||||
echo " - make"
|
||||
exit 1
|
||||
fi
|
||||
echo "NUTTXPATH: $NUTTXPATH"
|
||||
|
||||
# Create the binary
|
||||
|
||||
echo "COMMAND: $LPCHDR -o $TOPDIR/nuttx.lpc $NUTTXPATH"
|
||||
"$LPCHDR" -o "$TOPDIR/nuttx.lpc" "$NUTTXPATH" || \
|
||||
{ echo "$LPCHDR failed" ; exit 1 ; }
|
||||
echo "Successfully created binary"
|
||||
|
Loading…
Reference in New Issue
Block a user