1. 自制BL2
在官方提供的BL1或自制的BL1基础上,可以自制BL2。如果是使用U-Boot,编译时生成u-booot-spl.bin也是制作BL2的原材料。 如果是自制的BL1,BL2可以根据BL1随心定制。如果是在官方提供的BL1基础上进行开发,BL2要求为16k,其中最后2k使用0填充。可执行文件的大下不能超过(14k-4)字节,其中14k的最后4个字节是存储校验值的。相较于BL1的校验值,BL2的校验简单的多,只是把前(14k-4)的内容按字节进行累加即可。
这样生成的BL2在Exynos4412和Exynos 4412 Prime上是都可以使用的。当然,这里要求是非安全启动方式。
1.1. mkbl2源码
网上有C语言版本,懒得整理就用Python来实现了。
1#!/usr/bin/env python3
2# -*- coding:utf-8 -*-
3
4import os
5import sys
6import argparse
7
8BL2_HEAD_SIZE = 4
9BL2_SIZE = 14 * 1024
10PAD_SIZE = 2 * 1024
11BL2_CHKSUM_OFFSET = BL2_SIZE - BL2_HEAD_SIZE
12
13def main(args):
14 filename = args.file
15 output_file = args.output
16
17 data = None
18 try:
19 with open(filename, 'rb') as f:
20 data = f.read()
21 except Exception as e:
22 logging.error(e)
23 sys.exit(1)
24
25 zero = 0
26 if len(data) < BL2_CHKSUM_OFFSET:
27 data += zero.to_bytes(BL2_CHKSUM_OFFSET - len(data), byteorder='little')
28
29 data = data[:BL2_CHKSUM_OFFSET]
30
31 chk_sum = 0
32 for d in data:
33 chk_sum += d
34
35 data += chk_sum.to_bytes(4, byteorder='little')
36 data += zero.to_bytes(PAD_SIZE, byteorder='little')
37
38 with open(output_file, 'wb') as f:
39 f.write(data)
40
41if __name__ == '__main__':
42 parser = argparse.ArgumentParser()
43
44 parser.add_argument('-o', '--output', required=True, type=str, help='output file')
45 parser.add_argument('file', type=str, help='file')
46
47 args = parser.parse_args()
48
49 main(args)