summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVishal Bhoj <vishal.bhoj@linaro.org>2015-12-16 00:25:24 +0530
committerVishal Bhoj <vishal.bhoj@linaro.org>2015-12-16 01:24:42 +0530
commitca1fbcdffcd4c471027f00085525a0df9e66d788 (patch)
tree744bb1cddd851242865bb6f1618ad77ad230e88e
parent78e9049cf98bd4d6fab6e0a4ce76a83f61a82426 (diff)
downloadhikey-ca1fbcdffcd4c471027f00085525a0df9e66d788.tar.gz
Add Installer for bootloader
Add prebuilt UEFI bootloader which could be flashed from scratch. Bootloader is built from sources from earlier commit. Includes an installer script which helps to flash the bootloader and AOSP images built from sources: https://github.com/96boards/edk2/commit/14eae0c12e71fd33c4c0fc51e4475e8db02566cf https://github.com/96boards/arm-trusted-firmware/commit/e9b4909dcd75fc4ae7041cfb83d28ab9adb7afdf https://github.com/96boards/l-loader/commit/6b784ad5c4ab00e2b1c6f53cd5f74054e5d00a78 https://git.linaro.org/uefi/uefi-tools.git/commit/abe618f8ab72034fff1ce46c9c006a2c6bd40a7e Change-Id: I006f33083fc5d1868345be7daff52fa69ea64334 Signed-off-by: Vishal Bhoj <vishal.bhoj@linaro.org>
-rw-r--r--bootloader/EFI/BOOT/fastboot.efi (renamed from bootloader/fastboot.efi)bin63968 -> 62528 bytes
-rw-r--r--bootloader/EFI/BOOT/grub.cfg (renamed from bootloader/grub/grub.cfg)13
-rw-r--r--bootloader/EFI/BOOT/grubaa64.efi (renamed from bootloader/grubaa64.efi)bin497152 -> 497152 bytes
-rw-r--r--build/tasks/boot_fat.mk2
-rw-r--r--installer/README38
-rwxr-xr-xinstaller/bl1.binbin0 -> 45064 bytes
-rw-r--r--installer/fip.binbin0 -> 1183464 bytes
-rwxr-xr-xinstaller/flash-all.sh23
-rw-r--r--installer/hisi-idt.py262
-rw-r--r--installer/l-loader.binbin0 -> 47616 bytes
-rw-r--r--installer/nvme.imgbin0 -> 131072 bytes
-rw-r--r--installer/ptable-aosp.imgbin0 -> 17920 bytes
12 files changed, 336 insertions, 2 deletions
diff --git a/bootloader/fastboot.efi b/bootloader/EFI/BOOT/fastboot.efi
index 2fce0fd9..8758eb5c 100644
--- a/bootloader/fastboot.efi
+++ b/bootloader/EFI/BOOT/fastboot.efi
Binary files differ
diff --git a/bootloader/grub/grub.cfg b/bootloader/EFI/BOOT/grub.cfg
index 2dadf7e2..e2443b01 100644
--- a/bootloader/grub/grub.cfg
+++ b/bootloader/EFI/BOOT/grub.cfg
@@ -1,17 +1,28 @@
set default="0"
-set timeout=2
+set timeout=1
menuentry 'AOSP@720P' {
+ search.fs_label boot root
+ set root=($root)
linux /Image console=ttyAMA3,115200 androidboot.console=ttyAMA3 androidboot.hardware=hikey firmware_class.path=/system/etc/firmware efi=noruntime video=HDMI-A-1:1280x720@60 androidboot.selinux=permissive
initrd /ramdisk.img
devicetree /hi6220-hikey.dtb
}
menuentry 'AOSP@SVGA' {
+ search.fs_label boot root
+ set root=($root)
linux /Image console=ttyAMA3,115200 androidboot.console=ttyAMA3 androidboot.hardware=hikey firmware_class.path=/system/etc/firmware efi=noruntime video=HDMI-A-1:800x600@60 androidboot.selinux=permissive
initrd /ramdisk.img
devicetree /hi6220-hikey.dtb
}
menuentry 'AOSP' {
+ search.fs_label boot root
+ set root=($root)
linux /Image console=ttyAMA3,115200 androidboot.console=ttyAMA3 androidboot.hardware=hikey firmware_class.path=/system/etc/firmware efi=noruntime androidboot.selinux=permissive
initrd /ramdisk.img
devicetree /hi6220-hikey.dtb
}
+
+menuentry 'Fastboot' {
+ search.fs_label boot root
+ chainloader ($root)/EFI/BOOT/fastboot.efi
+}
diff --git a/bootloader/grubaa64.efi b/bootloader/EFI/BOOT/grubaa64.efi
index 01728a60..d7561229 100644
--- a/bootloader/grubaa64.efi
+++ b/bootloader/EFI/BOOT/grubaa64.efi
Binary files differ
diff --git a/build/tasks/boot_fat.mk b/build/tasks/boot_fat.mk
index 39375101..f886659b 100644
--- a/build/tasks/boot_fat.mk
+++ b/build/tasks/boot_fat.mk
@@ -1,7 +1,7 @@
$(PRODUCT_OUT)/boot_fat.uefi.img: $(PRODUCT_OUT)/kernel $(PRODUCT_OUT)/hi6220-hikey.dtb $(PRODUCT_OUT)/ramdisk.img
# $@ is referring to $(PRODUCT_OUT)/boot_fat.uefi.img
dd if=/dev/zero of=$@ bs=512 count=98304
- mkfs.fat -n "BOOT IMG" $@
+ mkfs.fat -n "boot" $@
mcopy -i $@ $(PRODUCT_OUT)/kernel ::Image
mcopy -i $@ $(PRODUCT_OUT)/hi6220-hikey.dtb ::hi6220-hikey.dtb
mcopy -s -i $@ device/linaro/hikey/bootloader/* ::
diff --git a/installer/README b/installer/README
new file mode 100644
index 00000000..73fbb45c
--- /dev/null
+++ b/installer/README
@@ -0,0 +1,38 @@
+These instruction should help you in flashing the bootloader
+and AOSP images built from sources.
+Detailed instructions on how to setup the Board can be found
+here:
+https://github.com/96boards/documentation/wiki/HiKeyGettingStarted
+
+For flashing the bootloader, the top two links should be installed
+(closed) and the 3rd link should be removed (open):
+
+---------------------------------------------------------
+| Name | Link | State |
+| Auto Power up | Link 1-2 | closed |
+| Boot Select | Link 3-4 | closed |
+| GPIO3-1 | Link 5-6 | open |
+---------------------------------------------------------
+
+Link 1-2 causes HiKey to auto-power up when power is installed. Link
+3-4 causes the HiKey SoC internal ROM to start up in at a special
+"install bootloader" mode which will install a supplied bootloader
+from the microUSB OTG port into RAM, and will present itself to a
+connected PC as a ttyUSB device.
+
+Note: The HiKey board will remain in USB load mode for 90 seconds
+from power up. If you take longer than 90 seconds to start the install
+then power cycle the board before trying again.
+
+Wait about 5 seconds and then check that the HiKey board has been
+recognized by your Linux PC:
+$ ls /dev/ttyUSB*
+or
+$ dmesg
+
+
+Run the flash-all.sh script after building AOSP for hikey with the right
+right UART recognised in the above command:
+$ ./flash-all.sh /dev/ttyUSBX
+
+Remove the link 3-4 and power on the board.
diff --git a/installer/bl1.bin b/installer/bl1.bin
new file mode 100755
index 00000000..e4ba5254
--- /dev/null
+++ b/installer/bl1.bin
Binary files differ
diff --git a/installer/fip.bin b/installer/fip.bin
new file mode 100644
index 00000000..948794cd
--- /dev/null
+++ b/installer/fip.bin
Binary files differ
diff --git a/installer/flash-all.sh b/installer/flash-all.sh
new file mode 100755
index 00000000..4860c45f
--- /dev/null
+++ b/installer/flash-all.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+if [ $# -eq 0 ]
+ then
+ echo "Provide the right /dev/ttyUSBX specific to recovery device"
+ exit
+fi
+
+if [ ! -e $1 ]
+ then
+ echo "device: $1 does not exist"
+ exit
+fi
+
+INSTALLER_DIR="`dirname $0`"
+ANDROID_TOP=${INSTALLER_DIR}/../../../../
+python ${INSTALLER_DIR}/hisi-idt.py --img1=${INSTALLER_DIR}/l-loader.bin -d ${1}
+fastboot flash ptable ${INSTALLER_DIR}/ptable-aosp.img
+fastboot flash fastboot ${INSTALLER_DIR}/fip.bin
+fastboot flash nvme ${INSTALLER_DIR}/nvme.img
+fastboot flash boot ${ANDROID_TOP}/out/target/product/hikey/boot_fat.uefi.img
+fastboot flash system ${ANDROID_TOP}/out/target/product/hikey/system.img
+fastboot flash cache ${ANDROID_TOP}/out/target/product/hikey/cache.img
+fastboot flash userdata ${ANDROID_TOP}/out/target/product/hikey/userdata.img
diff --git a/installer/hisi-idt.py b/installer/hisi-idt.py
new file mode 100644
index 00000000..071d4959
--- /dev/null
+++ b/installer/hisi-idt.py
@@ -0,0 +1,262 @@
+#!/usr/bin/python
+#-*- coding: utf-8 -*-
+
+import os
+import os.path
+import serial, time
+import array
+import sys, getopt
+
+class bootdownload(object):
+ '''
+ Hisilicon boot downloader
+
+ >>> downloader = bootdownload()
+ >>> downloader.download(filename)
+
+ '''
+
+ # crctab calculated by Mark G. Mendel, Network Systems Corporation
+ crctable = [
+ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
+ 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
+ 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
+ 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
+ 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
+ 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
+ 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
+ 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
+ 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
+ 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
+ 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
+ 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
+ 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
+ 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
+ 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
+ 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
+ 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
+ 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
+ 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
+ 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
+ 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
+ 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
+ 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
+ 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
+ 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
+ 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
+ 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
+ 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
+ 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
+ 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
+ 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
+ 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
+ ]
+
+ startframe = {
+ 'hi3716cv200':[0xFE,0x00,0xFF,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x01]
+ }
+
+ headframe = {
+ 'hi3716cv200':[0xFE,0x00,0xFF,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x02,0x01]
+ }
+
+ bootheadaddress = {
+ 'hi3716cv200':0xF9800800
+ }
+
+ bootdownloadaddress = {
+ 'hi3716cv200':0x07000000
+ }
+
+ BOOT_HEAD_LEN = 0x4F00
+ MAX_DATA_LEN = 0x400
+
+ def __init__(self,chiptype,serialport):
+ try:
+ self.s = serial.Serial(port=serialport, baudrate=115200, timeout=1)
+ except serial.serialutil.SerialException:
+ #no serial connection
+ self.s = None
+ print "\nFailed to open serial!", serialport
+ sys.exit(2)
+
+ self.chip = chiptype
+
+ def __del__(self):
+ if self.s != None:
+ self.s.close()
+
+ def calc_crc(self, data, crc=0):
+ for char in data:
+ crc = ((crc << 8) | ord(char)) ^ self.crctable[(crc >> 8) & 0xff]
+ for i in range(0,2):
+ crc = ((crc << 8) | 0) ^ self.crctable[(crc >> 8) & 0xff]
+ return crc & 0xffff
+
+ def getsize(self, filename):
+ st = os.stat(filename)
+ return st.st_size
+
+ def sendframe(self, data, loop):
+ for i in range(1, loop):
+ self.s.flushOutput()
+ self.s.write(data)
+ self.s.flushInput()
+ try:
+ ack = self.s.read()
+ if len(ack) == 1:
+ if ack == chr(0xaa):
+ return None
+ except:
+ return None
+
+ print 'failed'
+
+ def sendstartframe(self):
+ self.s.setTimeout(0.01)
+ data = array.array('B', self.startframe[self.chip]).tostring()
+ crc = self.calc_crc(data)
+ data += chr((crc >> 8)&0xff)
+ data += chr(crc&0xff)
+ self.sendframe(data,10000)
+
+ def sendheadframe(self,length,address):
+ self.s.setTimeout(0.03)
+ self.headframe[self.chip][4] = (length>>24)&0xff
+ self.headframe[self.chip][5] = (length>>16)&0xff
+ self.headframe[self.chip][6] = (length>>8)&0xff
+ self.headframe[self.chip][7] = (length)&0xff
+ self.headframe[self.chip][8] = (address>>24)&0xff
+ self.headframe[self.chip][9] = (address>>16)&0xff
+ self.headframe[self.chip][10] = (address>>8)&0xff
+ self.headframe[self.chip][11] = (address)&0xff
+
+ data = array.array('B', self.headframe[self.chip]).tostring()
+ crc = self.calc_crc(data)
+
+ data += chr((crc >> 8)&0xff)
+ data += chr(crc&0xff)
+
+ self.sendframe(data,16)
+
+
+ def senddataframe(self,seq,data):
+ self.s.setTimeout(0.15)
+ head = chr(0xDA)
+ head += chr(seq&0xFF)
+ head += chr((~seq)&0xFF)
+
+ data = head + data
+
+ crc = self.calc_crc(data)
+ data += chr((crc >> 8)&0xff)
+ data += chr(crc&0xff)
+
+ self.sendframe(data,32)
+
+ def sendtailframe(self,seq):
+ data = chr(0xED)
+ data += chr(seq&0xFF)
+ data += chr((~seq)&0xFF)
+ crc = self.calc_crc(data)
+ data += chr((crc >> 8)&0xff)
+ data += chr(crc&0xff)
+
+ self.sendframe(data,16)
+
+ def senddata(self, data, address):
+ length=len(data)
+ self.sendheadframe(length,address)
+ seq=1
+ while length > self.MAX_DATA_LEN:
+ self.senddataframe(seq,data[(seq-1)*self.MAX_DATA_LEN:seq*self.MAX_DATA_LEN])
+ seq = seq+1
+ length = length-self.MAX_DATA_LEN
+ self.senddataframe(seq,data[(seq-1)*self.MAX_DATA_LEN:])
+ self.sendtailframe(seq+1)
+
+
+ def download(self, filename1, filename2):
+
+ f=open(filename1,"rb")
+ data = f.read()
+ f.close()
+
+ print 'Sending', filename1, '...'
+ self.senddata(data,self.bootheadaddress[self.chip])
+ print 'Done\n'
+
+ if filename2:
+ f=open(filename2,"rb")
+ data = f.read()
+ f.close()
+
+ print 'Sending', filename2, '...'
+ self.senddata(data,self.bootdownloadaddress[self.chip])
+ print 'Done\n'
+
+
+def burnboot(chiptype, serialport, filename1, filename2=''):
+ downloader = bootdownload(chiptype, serialport)
+ downloader.download(filename1, filename2)
+
+def startterm(serialport=0):
+ try:
+ miniterm = Miniterm(
+ serialport,
+ 115200,
+ 'N',
+ rtscts=False,
+ xonxoff=False,
+ echo=False,
+ convert_outgoing=2,
+ repr_mode=0,
+ )
+ except serial.SerialException, e:
+ sys.stderr.write("could not open port %r: %s\n" % (port, e))
+ sys.exit(1)
+ miniterm.start()
+ miniterm.join(True)
+ miniterm.join()
+
+def main(argv):
+ '''
+ img2 = 'fastboot2.img'
+ '''
+ img1 = 'fastboot1.img'
+ img2 = ''
+ dev = '/dev/serial/by-id/usb-䕇䕎䥎_㄰㌲㔴㜶㤸-if00-port0'
+ try:
+ opts, args = getopt.getopt(argv,"hd:",["img1=","img2="])
+ except getopt.GetoptError:
+ print 'hisi-idt.py -d device --img1 <fastboot1> --img2 <fastboot2>'
+ sys.exit(2)
+ for opt, arg in opts:
+ if opt == '-h':
+ print 'hisi-idt.py -d device --img1 <fastboot1> --img2 <fastboot2>'
+ sys.exit()
+ elif opt in ("-d"):
+ dev = arg
+ elif opt in ("--img1"):
+ img1 = arg
+ elif opt in ("--img2"):
+ img2 = arg
+ print '+----------------------+'
+ print ' Serial: ', dev
+ print ' Image1: ', img1
+ print ' Image2: ', img2
+ print '+----------------------+\n'
+
+ if not os.path.isfile(img1):
+ print "Image don't exists:", img1
+ sys.exit(1)
+
+ if (img2):
+ if not os.path.isfile(img2):
+ print "Image don't exists:", img2
+ sys.exit(1)
+
+ burnboot('hi3716cv200', dev, img1, img2)
+
+if __name__ == "__main__":
+ main(sys.argv[1:])
diff --git a/installer/l-loader.bin b/installer/l-loader.bin
new file mode 100644
index 00000000..3456ad64
--- /dev/null
+++ b/installer/l-loader.bin
Binary files differ
diff --git a/installer/nvme.img b/installer/nvme.img
new file mode 100644
index 00000000..e2c8fe92
--- /dev/null
+++ b/installer/nvme.img
Binary files differ
diff --git a/installer/ptable-aosp.img b/installer/ptable-aosp.img
new file mode 100644
index 00000000..d3f732a4
--- /dev/null
+++ b/installer/ptable-aosp.img
Binary files differ