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来实现了。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
import sys
import argparse
BL2_HEAD_SIZE = 4
BL2_SIZE = 14 * 1024
PAD_SIZE = 2 * 1024
BL2_CHKSUM_OFFSET = BL2_SIZE - BL2_HEAD_SIZE
def main(args):
filename = args.file
output_file = args.output
data = None
try:
with open(filename, 'rb') as f:
data = f.read()
except Exception as e:
logging.error(e)
sys.exit(1)
zero = 0
if len(data) < BL2_CHKSUM_OFFSET:
data += zero.to_bytes(BL2_CHKSUM_OFFSET - len(data), byteorder='little')
data = data[:BL2_CHKSUM_OFFSET]
chk_sum = 0
for d in data:
chk_sum += d
data += chk_sum.to_bytes(4, byteorder='little')
data += zero.to_bytes(PAD_SIZE, byteorder='little')
with open(output_file, 'wb') as f:
f.write(data)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('-o', '--output', required=True, type=str, help='output file')
parser.add_argument('file', type=str, help='file')
args = parser.parse_args()
main(args)