482 lines
14 KiB
Bash
Executable File
482 lines
14 KiB
Bash
Executable File
#! /bin/bash
|
|
|
|
# This is bash which supports ANSI-C Quoting
|
|
nl=$'\n'
|
|
|
|
#
|
|
# This file is *NOT* generated by GNU Autoconf, but written by NIIBE Yutaka
|
|
#
|
|
# Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
|
|
# Free Software Initiative of Japan
|
|
#
|
|
# This file is a part of Gnuk, a GnuPG USB Token implementation.
|
|
#
|
|
# Gnuk is free software: you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Gnuk is distributed in the hope that it will be useful, but WITHOUT
|
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
# License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
# Submodule check
|
|
#
|
|
if ! test -f ../chopstx/rules.mk; then
|
|
echo "Submodule 'chopstx' not found" >&2
|
|
echo "You might need: git submodule update --init" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Default settings
|
|
help=no
|
|
vidpid=none
|
|
target=FST_01
|
|
with_dfu=default
|
|
debug=no
|
|
sys1_compat=yes
|
|
pinpad=no
|
|
certdo=no
|
|
hid_card_change=no
|
|
factory_reset=no
|
|
flash_override=""
|
|
# For emulation
|
|
prefix=/usr/local
|
|
exec_prefix='${prefix}'
|
|
libexecdir='${exec_prefix}/libexec'
|
|
|
|
# Revision number
|
|
if test -e ../.git; then
|
|
if type git >/dev/null 2>&1; then
|
|
REVISION=$(git describe --dirty="-modified")
|
|
else
|
|
# echo 'No git available, please install git'
|
|
GIT_REVISION=$(sed -e 's/^\(.......\).*$/g\1/' "../.git/$(sed -e 's/^ref: //' ../.git/HEAD)")
|
|
REVISION=$(cat ../VERSION)-$GIT_REVISION
|
|
fi
|
|
else
|
|
REVISION=$(cat ../VERSION)
|
|
fi
|
|
|
|
# Process each option
|
|
for option; do
|
|
case $option in
|
|
*=*) optarg=$(expr "X$option" : '[^=]*=\(.*\)') ;;
|
|
*) optarg=yes ;;
|
|
esac
|
|
|
|
case $option in
|
|
-h | --help)
|
|
help=yes ;;
|
|
--vidpid=*)
|
|
vidpid=$optarg ;;
|
|
--target=*)
|
|
target=$optarg ;;
|
|
--enable-debug)
|
|
debug=yes ;;
|
|
--disable-debug)
|
|
debug=no ;;
|
|
--enable-pinpad=*)
|
|
pinpad=$optarg ;;
|
|
--disable-pinpad)
|
|
pinpad=no ;;
|
|
--enable-certdo)
|
|
certdo=yes ;;
|
|
--disable-certdo)
|
|
certdo=no ;;
|
|
--enable-hid-card-change)
|
|
hid_card_change=yes ;;
|
|
--disable-hid-card-change)
|
|
hid_card_change=no ;;
|
|
--enable-sys1-compat)
|
|
sys1_compat=yes ;;
|
|
--disable-sys1-compat)
|
|
sys1_compat=no ;;
|
|
--enable-factory-reset)
|
|
factory_reset=yes ;;
|
|
--disable-factory-reset)
|
|
factory_reset=no ;;
|
|
--with-dfu)
|
|
with_dfu=yes ;;
|
|
--without-dfu)
|
|
with_dfu=no ;;
|
|
#
|
|
# For emulation
|
|
#
|
|
--prefix=*)
|
|
prefix=optarg ;;
|
|
--exec-prefix=*)
|
|
exec_prefix=optarg ;;
|
|
--libexecdir=*)
|
|
libexecdir=optarg ;;
|
|
*)
|
|
echo "Unrecognized option \`$option'" >&2
|
|
echo "Try \`$0 --help' for more information." >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if test "$help" = "yes"; then
|
|
cat <<EOF
|
|
Usage: $0 [OPTION]...
|
|
|
|
Defaults for the options are specified in brackets.
|
|
|
|
Configuration:
|
|
-h, --help display this help and exit [no]
|
|
--vidpid=VID:PID specify vendor/product ID [<NONE>]
|
|
--target=TARGET specify target [FST_01]
|
|
supported targets are:
|
|
FST_01
|
|
FST_01G
|
|
OLIMEX_STM32_H103
|
|
MAPLE_MINI
|
|
ST_DONGLE
|
|
ST_NUCLEO_F103
|
|
NITROKEY_START
|
|
BLUE_PILL
|
|
STM8S_DISCOVERY
|
|
CQ_STARM
|
|
STM32_PRIMER2
|
|
STBEE
|
|
STBEE_MINI
|
|
FST_01_00 (unreleased version with 8MHz XTAL)
|
|
--enable-factory-reset
|
|
support life cycle management [no]
|
|
--enable-debug debug with virtual COM port [no]
|
|
--enable-pinpad=cir
|
|
PIN entry support [no]
|
|
--enable-certdo support CERT.3 data object [no]
|
|
--enable-sys1-compat enable SYS 1.0 compatibility [yes]
|
|
executable is target dependent
|
|
--disable-sys1-compat disable SYS 1.0 compatibility [no]
|
|
executable is target independent
|
|
but requires SYS 2.0 or newer
|
|
--with-dfu build image for DFU [<target specific>]
|
|
EOF
|
|
exit 0
|
|
fi
|
|
|
|
BOARD_HEADER_FILE=board-$(echo $target | tr '_[:upper:]' '-[:lower:]').h
|
|
echo "Header file is: $BOARD_HEADER_FILE"
|
|
ln -sf "../chopstx/board/$BOARD_HEADER_FILE" board.h
|
|
|
|
# Flash page size in byte
|
|
FLASH_PAGE_SIZE=1024
|
|
# Flash memory size in KiB
|
|
FLASH_SIZE=128
|
|
# Memory size in KiB
|
|
MEMORY_SIZE=20
|
|
|
|
# Settings for TARGET
|
|
case $target in
|
|
BLUE_PILL|STM8S_DISCOVERY)
|
|
# It's 64KB version of STM32F103, but actually has 128KB
|
|
flash_override="-DSTM32F103_OVERRIDE_FLASH_SIZE_KB=128"
|
|
;;
|
|
CQ_STARM|STBEE_MINI)
|
|
if test "$with_dfu" = "default"; then
|
|
with_dfu=yes;
|
|
fi ;;
|
|
STM32_PRIMER2)
|
|
FLASH_PAGE_SIZE=2048
|
|
FLASH_SIZE=512
|
|
MEMORY_SIZE=64
|
|
;;
|
|
STBEE)
|
|
FLASH_PAGE_SIZE=2048
|
|
FLASH_SIZE=512
|
|
MEMORY_SIZE=64
|
|
if test "$with_dfu" = "default"; then
|
|
with_dfu=yes;
|
|
fi ;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
if test "$target" = "GNU_LINUX"; then
|
|
ldscript=""
|
|
chip="gnu-linux"
|
|
emulation="yes"
|
|
cross=""
|
|
mcu="none"
|
|
def_emulation="-DGNU_LINUX_EMULATION"
|
|
def_memory_size="-DMEMORY_SIZE=1024"
|
|
enable_hexoutput=""
|
|
libs="-lpthread"
|
|
else
|
|
ldscript="gnuk.ld"
|
|
chip="stm32f103"
|
|
emulation=""
|
|
cross="arm-none-eabi-"
|
|
mcu="cortex-m3"
|
|
def_emulation=""
|
|
def_memory_size="-DMEMORY_SIZE=$MEMORY_SIZE"
|
|
enable_hexoutput=yes
|
|
libs=""
|
|
fi
|
|
|
|
if test "$emulation" = "yes"; then
|
|
if test "$vidpid" = "none"; then
|
|
vidpid=0000:0000
|
|
else
|
|
echo "Please don't specify VID:PID for emulation at compile time;"
|
|
echo "It is a user who should specify VID:PID at run time."
|
|
exit 1
|
|
fi
|
|
else
|
|
if test "$vidpid" = "none"; then
|
|
echo "Please specify Vendor ID and Product ID by --vidpid option." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# --enable-debug option
|
|
if test "$debug" = "yes"; then
|
|
DEBUG_MAKE_OPTION="ENABLE_DEBUG=1"
|
|
DEBUG_DEFINE="#define DEBUG 1"
|
|
echo "Debug option enabled"
|
|
else
|
|
DEBUG_MAKE_OPTION="# ENABLE_DEBUG=1"
|
|
DEBUG_DEFINE="#undef DEBUG"
|
|
echo "Debug option disabled"
|
|
fi
|
|
|
|
# --with-dfu option
|
|
if test "$with_dfu" = "yes"; then
|
|
if test "$target" = "FST_01" -o "$target" = "FST_01G" \
|
|
-o "$target" = "FST_01_00"; then
|
|
echo "FST-01 doesn't have DFU loader, you should not use --with-dfu." >&2
|
|
exit 1
|
|
fi
|
|
echo "Configured for DFU"
|
|
ORIGIN=0x08003000
|
|
FLASH_SIZE=$((FLASH_SIZE - 12))
|
|
DFU_DEFINE="#define DFU_SUPPORT 1"
|
|
else
|
|
with_dfu=no
|
|
echo "Configured for bare system (no-DFU)"
|
|
ORIGIN=0x08000000
|
|
DFU_DEFINE="#undef DFU_SUPPORT"
|
|
fi
|
|
|
|
# --enable-pinpad option
|
|
if test "$pinpad" = "no"; then
|
|
PINPAD_MAKE_OPTION="# ENABLE_PINPAD="
|
|
PINPAD_DEFINE="#undef PINPAD_SUPPORT"
|
|
PINPAD_MORE_DEFINE=""
|
|
echo "PIN pad option disabled"
|
|
else
|
|
PINPAD_MAKE_OPTION="ENABLE_PINPAD=$pinpad"
|
|
PINPAD_DEFINE="#define PINPAD_SUPPORT 1"
|
|
PINPAD_MORE_DEFINE="#define PINPAD_${pinpad^^[a-z]}_SUPPORT 1"
|
|
echo "PIN pad option enabled ($pinpad)"
|
|
fi
|
|
|
|
# --enable-certdo option
|
|
if test "$certdo" = "yes"; then
|
|
CERTDO_DEFINE="#define CERTDO_SUPPORT 1"
|
|
echo "CERT.3 Data Object is supported"
|
|
else
|
|
CERTDO_DEFINE="#undef CERTDO_SUPPORT"
|
|
echo "CERT.3 Data Object is NOT supported"
|
|
fi
|
|
|
|
# --enable-hid-card-change option
|
|
if test "$hid_card_change" = "yes"; then
|
|
HID_CARD_CHANGE_DEFINE="#define HID_CARD_CHANGE_SUPPORT 1"
|
|
echo "Card insert/removal by HID device is supported"
|
|
else
|
|
HID_CARD_CHANGE_DEFINE="#undef HID_CARD_CHANGE_SUPPORT"
|
|
echo "Card insert/removal by HID device is NOT supported"
|
|
fi
|
|
|
|
# --enable-factory-reset option
|
|
if test "$factory_reset" = "yes"; then
|
|
LIFE_CYCLE_MANAGEMENT_DEFINE="#define LIFE_CYCLE_MANAGEMENT_SUPPORT 1"
|
|
echo "Life cycle management is supported"
|
|
else
|
|
LIFE_CYCLE_MANAGEMENT_DEFINE="#undef LIFE_CYCLE_MANAGEMENT_SUPPORT"
|
|
echo "Life cycle management is NOT supported"
|
|
fi
|
|
|
|
### !!! Replace following string of "FSIJ" to yours !!! ####
|
|
SERIALNO="FSIJ-$(sed -e 's%^[^/]*/%%' <../VERSION)-"
|
|
|
|
SERIALNO_STR_LEN_DEFINE="#define SERIALNO_STR_LEN ${#SERIALNO}"
|
|
|
|
|
|
if test "$sys1_compat" = "yes"; then
|
|
CONFIG="$target:dfu=$with_dfu:debug=$debug:pinpad=$pinpad:certdo=$certdo:factory_reset=$factory_reset"
|
|
else
|
|
if test "$with_dfu" = "yes"; then
|
|
echo "Common binary can't support DFU loader, don't use --with-dfu." >&2
|
|
exit 1
|
|
fi
|
|
# Override settings for common binary. Safer side.
|
|
FLASH_PAGE_SIZE=2048
|
|
FLASH_SIZE=128
|
|
MEMORY_SIZE=20
|
|
CONFIG="common:debug=$debug:pinpad=$pinpad:certdo=$certdo:factory_reset=$factory_reset"
|
|
fi
|
|
|
|
output_vid_pid_version () {
|
|
echo "$VIDPID" | \
|
|
sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\):\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%\1\t\2\t\3\t\4%p" | \
|
|
while read -r FIRST SECOND THIRD FOURTH; do
|
|
if test $FIRST != 00; then
|
|
echo replace_vid_msb $FIRST
|
|
fi
|
|
if test $SECOND != 00; then
|
|
echo replace_vid_lsb $SECOND
|
|
fi
|
|
if test $THIRD != 00; then
|
|
echo replace_pid_msb $THIRD
|
|
fi
|
|
if test $FOURTH != 00; then
|
|
echo replace_pid_lsb $FOURTH
|
|
fi
|
|
done
|
|
echo "$VERSION" | \
|
|
sed -n -e "s%^\([0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f]\)$%\1\t\2%p" | \
|
|
while read -r FIRST SECOND; do
|
|
if test $FIRST != 00; then
|
|
echo replace_bcd_device_msb $FIRST
|
|
fi
|
|
if test $SECOND != 00; then
|
|
echo replace_bcd_device_lsb $SECOND
|
|
fi
|
|
done
|
|
}
|
|
|
|
output_vendor_product_serial_strings () {
|
|
name=$1
|
|
|
|
echo "static const uint8_t ${name}string_vendor[] = {"
|
|
echo " ${#VENDOR}*2+2, /* bLength */"
|
|
echo " STRING_DESCRIPTOR, /* bDescriptorType */"
|
|
echo " /* Manufacturer: \"$VENDOR\" */"
|
|
echo "$VENDOR" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p"
|
|
echo '};'
|
|
echo
|
|
echo "static const uint8_t ${name}string_product[] = {"
|
|
echo " ${#PRODUCT}*2+2, /* bLength */"
|
|
echo " STRING_DESCRIPTOR, /* bDescriptorType */"
|
|
echo " /* Product name: \"$PRODUCT\" */"
|
|
echo "$PRODUCT" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p"
|
|
echo '};'
|
|
|
|
if test -n "$name"; then
|
|
echo
|
|
echo "const uint8_t ${name}string_serial[] = {"
|
|
echo " ${#SERIALNO}*2+2+16, /* bLength */"
|
|
echo " STRING_DESCRIPTOR, /* bDescriptorType */"
|
|
echo " /* Serial number: \"$SERIALNO\" */"
|
|
echo "$SERIALNO" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p"
|
|
if test "$emulation" = "yes"; then
|
|
echo " 'E', 0, 'M', 0, 'U', 0, 'L', 0,"
|
|
echo " 'A', 0, 'T', 0, 'E', 0, 'D', 0,"
|
|
else
|
|
echo " 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
|
|
echo " 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,"
|
|
fi
|
|
echo '};'
|
|
echo
|
|
echo '#ifdef USB_STRINGS_FOR_GNUK'
|
|
echo "static const uint8_t ${name}revision_detail[] = {"
|
|
echo " ${#REVISION}*2+2, /* bLength */"
|
|
echo " STRING_DESCRIPTOR, /* bDescriptorType */"
|
|
echo " /* revision detail: \"$REVISION\" */"
|
|
echo "$REVISION" | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p"
|
|
echo '};'
|
|
echo
|
|
echo "static const uint8_t ${name}config_options[] = {"
|
|
echo " ${#CONFIG}*2+2, /* bLength */"
|
|
echo " STRING_DESCRIPTOR, /* bDescriptorType */"
|
|
echo " /* configure options: \"$CONFIG\" */"
|
|
echo $CONFIG | sed -e "s/\(........\)/\1\\${nl}/g" | sed -n -e "s/\(.\)/'\1', 0, /g" -e "s/^/ /" -e "/^ ./s/ $//p"
|
|
echo '};'
|
|
echo '#endif'
|
|
fi
|
|
}
|
|
|
|
(echo "#! /bin/bash"
|
|
echo
|
|
echo 'source "binary-edit.sh"') > put-vid-pid-ver.sh
|
|
|
|
if !(IFS=" "
|
|
while read -r VIDPID VERSION PRODUCT VENDOR; do
|
|
if test "$vidpid" = "$VIDPID"; then
|
|
echo >> put-vid-pid-ver.sh
|
|
echo 'addr=$file_off_ADDR' >> put-vid-pid-ver.sh
|
|
output_vid_pid_version >> put-vid-pid-ver.sh
|
|
output_vendor_product_serial_strings gnuk_ >usb-strings.c.inc
|
|
exit 0
|
|
fi
|
|
done; exit 1) < ../GNUK_USB_DEVICE_ID
|
|
then
|
|
echo "Please specify valid Vendor ID and Product ID." >&2
|
|
echo "Check ../GNUK_USB_DEVICE_ID." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if test "$sys1_compat" = "no"; then
|
|
# Disable when you are sure that it's sys version 3.0 or later.
|
|
# Note that Gnuk 1.0 and NeuG (until 0.06) uses sys version 1.0.
|
|
# Disabling the compatibility, executable will be target independent,
|
|
# assuming the clock initialization will be done by clock_init in
|
|
# SYS.
|
|
use_sys3="-DUSE_SYS3"
|
|
else
|
|
use_sys3=""
|
|
fi
|
|
|
|
|
|
(echo "CHIP=$chip";
|
|
echo "EMULATION=$emulation";
|
|
echo "CROSS=$cross";
|
|
echo "MCU=$mcu";
|
|
echo "DEFS=$use_sys3 $flash_override $def_emulation $def_memory_size";
|
|
echo "LDSCRIPT=$ldscript";
|
|
echo "LIBS=$libs";
|
|
echo "$DEBUG_MAKE_OPTION";
|
|
echo "$PINPAD_MAKE_OPTION";
|
|
echo "ENABLE_FRAUCHEKY=$enable_fraucheky";
|
|
echo "ENABLE_OUTPUT_HEX=$enable_hexoutput"
|
|
if test "$emulation" = "yes"; then
|
|
echo "prefix=$prefix"
|
|
echo "exec_prefix=$exec_prefix"
|
|
echo "libexecdir=$libexecdir"
|
|
fi
|
|
) > config.mk
|
|
|
|
if test "$certdo" = "yes"; then
|
|
sed -e "/^@CERTDO_SUPPORT_START@$/ d" -e "/^@CERTDO_SUPPORT_END@$/ d" \
|
|
-e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
|
|
-e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
|
|
-e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
|
|
< gnuk.ld.in > gnuk.ld
|
|
else
|
|
sed -e "/^@CERTDO_SUPPORT_START@$/,/^@CERTDO_SUPPORT_END@$/ d" \
|
|
-e "s/@ORIGIN@/$ORIGIN/" -e "s/@FLASH_SIZE@/$FLASH_SIZE/" \
|
|
-e "s/@MEMORY_SIZE@/$MEMORY_SIZE/" \
|
|
-e "s/@FLASH_PAGE_SIZE@/$FLASH_PAGE_SIZE/" \
|
|
< gnuk.ld.in > gnuk.ld
|
|
fi
|
|
sed -e "s/@DEBUG_DEFINE@/$DEBUG_DEFINE/" \
|
|
-e "s/@DFU_DEFINE@/$DFU_DEFINE/" \
|
|
-e "s/@PINPAD_DEFINE@/$PINPAD_DEFINE/" \
|
|
-e "s/@PINPAD_MORE_DEFINE@/$PINPAD_MORE_DEFINE/" \
|
|
-e "s/@CERTDO_DEFINE@/$CERTDO_DEFINE/" \
|
|
-e "s/@HID_CARD_CHANGE_DEFINE@/$HID_CARD_CHANGE_DEFINE/" \
|
|
-e "s/@LIFE_CYCLE_MANAGEMENT_DEFINE@/$LIFE_CYCLE_MANAGEMENT_DEFINE/" \
|
|
-e "s/@SERIALNO_STR_LEN_DEFINE@/$SERIALNO_STR_LEN_DEFINE/" \
|
|
< config.h.in > config.h
|
|
exit 0
|