63 строки
1.3 KiB
Bash
Исполняемый файл
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
|