VIDPID substitution at the last stage of build.
[gnuk/neug.git] / src / binary-edit.sh
1 # This is a Bash script to be included.
2
3 FILE="build/neug-vidpid.elf"
4
5 # Idx Name          Size      VMA       LMA       File off  Algn
6 # =================
7 #   2 .text         00004a40  080010f0  080010f0  000110f0  2**4
8 # 08006500 l     O .text        00000012 vcom_device_desc
9 # 08006550 l     O .text        00000012 device_desc
10 # =================
11 # VMA =0x080010f0
12 # FOFF=0x000110f0
13 # ADDR=0x08005ad0
14 # file_off_ADDR = ADDR - VMA + FOFF
15 #               = 0x08005ad0 - 0x080010f0 + 0x000110f0 = 0x00015ad0
16
17 function calc_addr () {
18     local line_sym="" VMA FOFF ADDR
19
20     arm-none-eabi-objdump -h -t -j .text $FILE       | \
21     egrep -e '(^ +[0-9] +\.text +|device_desc)' | \
22     while read -r F0 F1 F2 F3 F4 F5 F6; do
23         if [ -z "$line_sym" ]; then
24             VMA=$F3
25             FOFF=$F5
26             line_sym="next is a line for the symbol"
27         else
28             ADDR=$F0
29             echo "$((0x$ADDR - 0x$VMA + 0x$FOFF))"
30         fi
31     done
32 }
33
34 declare -a OFFSETS
35 OFFSETS=($(calc_addr))
36 file_off_ADDR=${OFFSETS[0]}
37 file_off_fraucheky_ADDR=${OFFSETS[1]}
38
39 echo "Offset is $file_off_ADDR"
40 if [ -n "$file_off_fraucheky_ADDR" ]; then
41     echo "Offset is $file_off_fraucheky_ADDR"
42 fi
43
44 function replace_file_byte_at () {
45     printf "\x$1" | dd of=$FILE bs=1 seek=$2 conv=notrunc >& /dev/null
46 }
47
48 #
49 # vid_lsb:         8
50 # vid_msb:         9
51 # pid_lsb:        10
52 # pid_msb:        11
53 # bcd_device_lsb: 12
54 # bcd_device_msb: 13
55 #
56
57 function replace_vid_lsb () {
58     replace_file_byte_at $1 $((addr + 8))
59 }
60
61 function replace_vid_msb () {
62     replace_file_byte_at $1 $((addr + 9))
63 }
64
65 function replace_pid_lsb () {
66     replace_file_byte_at $1 $((addr + 10))
67 }
68
69 function replace_pid_msb () {
70     replace_file_byte_at $1 $((addr + 11))
71 }
72
73 function replace_bcd_device_lsb () {
74     replace_file_byte_at $1 $((addr + 12))
75 }
76
77 function replace_bcd_device_msb () {
78     replace_file_byte_at $1 $((addr + 13))
79 }