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)