How to compile BPI-M3-bsp kernel on BPI-M3
1,at first download code
git clone https://github.com/BPI-SINOVOIP/BPI-M3-bsp.git
2, Add depend package
apt-get install git build-essential libncurses5-dev
3.edit BPI-M3-bsp/Makefile delete the cross compiler options
.PHONY: all clean help
.PHONY: u-boot kernel kernel-config
.PHONY: linux pack
include chosen_board.mk
SUDO=sudo
#unmark for use new toolchain , this time just for KERNEL TEST ONLY
#DONOT USE FOR UBOOT this time,
#due to allwinner UBOOT release without some source code issue.
OUTPUT_DIR=$(CURDIR)/output
U_CONFIG_H=$(U_O_PATH)/include/config.h
K_DOT_CONFIG=$(K_O_PATH)/.config
LICHEE_KDIR=$(CURDIR)/linux-sunxi
ROOTFS=$(CURDIR)/rootfs/linux/default_linux_rootfs.tar.gz
Q=
J=$(shell expr `grep ^processor /proc/cpuinfo | wc -l` \* 2)
all: bsp
## DK, if u-boot and kernel KBUILD_OUT issue fix, u-boot-clean and kernel-clean
## are no more needed
clean: u-boot-clean kernel-clean
rm -f chosen_board.mk
## pack
pack: sunxi-pack
$(Q)scripts/mk_pack.sh
# u-boot
$(U_CONFIG_H): u-boot-sunxi
$(Q)$(MAKE) -C u-boot-sunxi $(UBOOT_CONFIG)_config -j$J
u-boot: $(U_CONFIG_H)
$(Q)$(MAKE) -C u-boot-sunxi all -j$J
u-boot-clean:
rm -f sunxi-pack/chips/sun8iw6p1/bin/u-boot-sun8iw6p1.bin
rm -f u-boot-sunxi/tools/sunxi_env_gen
$(Q)$(MAKE) -C u-boot-sunxi -j$J distclean
## linux
$(K_DOT_CONFIG): linux-sunxi
$(Q)$(MAKE) -C linux-sunxi ARCH=arm $(KERNEL_CONFIG)
kernel: $(K_DOT_CONFIG)
$(Q)$(MAKE) -C linux-sunxi ARCH=arm -j$J INSTALL_MOD_PATH=output uImage modules
$(Q)$(MAKE) -C linux-sunxi/modules/gpu ARCH=arm LICHEE_KDIR=${LICHEE_KDIR}
$(Q)$(MAKE) -C linux-sunxi ARCH=arm -j$J INSTALL_MOD_PATH=output modules_install
$(Q)$(MAKE) -C linux-sunxi ARCH=arm -j$J headers_install
#cd linux-sunxi && ${K_CROSS_COMPILE}objcopy -R .note.gnu.build-id -S -O binary vmlinux bImage
kernel-clean:
$(Q)$(MAKE) -C linux-sunxi/arch/arm/mach-sunxi/pm/standby ARCH=arm clean
$(Q)$(MAKE) -C linux-sunxi/modules/gpu ARCH=arm LICHEE_KDIR=${LICHEE_KDIR} clean
$(Q)$(MAKE) -C linux-sunxi ARCH=arm -j$J distclean
rm -rf linux-sunxi/output/
rm -f linux-sunxi/bImage
kernel-config: $(K_DOT_CONFIG)
$(Q)$(MAKE) -C linux-sunxi ARCH=arm -j$J menuconfig
cp linux-sunxi/.config linux-sunxi/arch/arm/configs/$(KERNEL_CONFIG)
## bsp
bsp: u-boot kernel
## linux
linux:
$(Q)scripts/mk_linux.sh $(ROOTFS)
help:
@echo ""
@echo "Usage:"
@echo " make bsp - Default 'make'"
@echo " make linux - Build target for linux platform, as ubuntu, need permisstion confirm during the build process"
@echo " Arguments:"
@echo " ROOTFS= - Source rootfs (ie. rootfs.tar.gz with absolute path)"
@echo ""
@echo " make pack - pack the images and rootfs to a PhenixCard download image."
@echo " make clean"
@echo ""
@echo "Optional targets:"
@echo " make kernel - Builds linux kernel"
@echo " make kernel-config - Menuconfig"
@echo " make u-boot - Builds u-boot"
@echo ""
4.eidt BPI-M3-bsp/linux-sunxi/arch/arm/mach-sunxi/pm/standby/Makefile
find here
always := standby.code resume1.code
targets := standby.elf resume1.elf
and add
hostprogs-y := mksunxichecksum
change 103、104 line to
$(obj)/resume1.code: $(obj)/resume1.bin $(obj)/mksunxichecksum
$(obj)/mksunxichecksum $(obj)/resume1.bin $(obj)/super/resume/resume1.code
- at BPI-M3-bsp/linux-sunxi/arch/arm/mach-sunxi/pm/standby/ dir add file: mksunxichecksum.c as below:
/*
* (C) Copyright 2015 Jean-Francois Moine
* (C) Copyright 2014 Henrik Nordstrom
*
* Based on mksunxiboot
*
* (C) Copyright 2007-2011
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdint.h>
#include <stdlib.h>
/* boot head definition from sun4i boot code */
struct boot_file_head {
uint32_t b_instruction; /* one intruction jumping to real code */
uint8_t magic[8]; /* ="eGON.BT0" or "eGON.BT1", not C-style str */
uint32_t check_sum; /* generated by PC */
uint32_t length; /* generated by PC */
/*
* We use a simplified header, only filling in what is needed
* for checksum calculation.
*/
};
#define STAMP_VALUE 0x5F0A6C39
/* check sum functon from sun4i boot code */
static int gen_check_sum(struct boot_file_head *head_p)
{
uint32_t length;
uint32_t *buf;
uint32_t loop;
uint32_t i;
uint32_t sum;
length = head_p->length;
// if ((length & 0x3) != 0) /* must 4-byte-aligned */
// return -1;
buf = (uint32_t *)head_p;
head_p->check_sum = STAMP_VALUE; /* fill stamp */
loop = length >> 2;
/* calculate the sum */
for (i = 0, sum = 0; i < loop; i++)
sum += buf;
/* write back check sum */
head_p->check_sum = sum;
return 0;
}
int main(int argc, char *argv[])
{
struct boot_file_head h, *buf;
unsigned file_size;
FILE *f;
if (argc != 3) {
printf("Usage: %s file.bin file.code\n"
"calculates BROM checksum in boot header of given .bin file and writes to .code file\n"
"", argv[0]);
exit(1);
}
f = fopen(argv[1], "rb");
if (!f) {
perror("Open input file");
exit(1);
}
fread(&h, 1, sizeof h, f);
file_size = h.length; // wanted length
buf = malloc(file_size);
memset(buf, 0xff, file_size);
rewind(f);
fread(buf, 1, file_size, f);
fclose(f);
gen_check_sum(buf);
f = fopen(argv[2], "wb");
if (!f) {
perror("Open output file");
exit(1);
}
fwrite(buf, 1, file_size, f);
fclose(f);
return 0;
}
save and exit.
run
./build.sh
compile : 1(1-6) choose compile : 3(1-6) begin to compile .
After the completion of the copy Uimage to boot partition boot/BPI m3 below