1
1

63 строки
1.3 KiB
Bash
Исполняемый файл

#!/usr/bin/env ksh
target="$1"
shift
header="$1"
shift
firmwares="$@"
if [ -z "$firmwares" -o -z "$target" -o -z "$header" ]; then
echo "Nothing to do"
exit 0
fi
nblob=0
for blob in $firmwares; do
((label=nblob+1))
bname="$(basename $blob .bin)"
firmwares_start[$nblob]=_${bname}_start
firmwares_size[$nblob]=_${bname}_size
cat >>"$target"<<EOF
.global ${firmwares_start[$nblob]}
.global ${firmwares_size[$nblob]}
.section .rodata
${firmwares_start[$nblob]}:
.incbin "${blob}"
.align 2
${label}:
${firmwares_size[$nblob]}:
.int ${label}b - ${firmwares_start[$nblob]}
.int 0
EOF
BNAME="$(echo "${bname}" | awk -F_ '{ print toupper($1) }')"
cat >>"$header"<<EOF
#define FIRMWARE_${BNAME} "${bname}"
extern const uint32_t ${firmwares_start[$nblob]};
extern const size_t ${firmwares_size[$nblob]};
EOF
firmwares_name[$nblob]=FIRMWARE_${BNAME}
((nblob++))
done
cat >>"$header"<<EOF
#define FIRMWARE_CNT ${nblob}
struct firmware_list firmwares[FIRMWARE_CNT];
static void init_firmwares(void)
{
EOF
n=0
while [ $n -lt $nblob ]; do
cat >>"$header"<<EOF
firmwares[$n].start = FROM_POINTER_TO_INT(&${firmwares_start[$n]}, uint32_t);
firmwares[$n].size = ${firmwares_size[$n]};
firmwares[$n].name = ${firmwares_name[$n]};
EOF
((n++))
done
cat >>"$header"<<EOF
}
EOF