summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/boards/rockchip.rst15
-rw-r--r--arch/sandbox/configs/hosttools_defconfig1
-rw-r--r--arch/sandbox/configs/targettools_defconfig1
-rw-r--r--scripts/.gitignore2
-rw-r--r--scripts/Kconfig78
-rw-r--r--scripts/Makefile24
-rw-r--r--scripts/bareboximd.c100
-rw-r--r--scripts/common.c168
-rw-r--r--scripts/common.h10
-rw-r--r--scripts/imx/imx-image.c47
-rw-r--r--scripts/imx/imx-usb-loader.c77
-rw-r--r--scripts/omap3-usb-loader.c47
-rw-r--r--scripts/rk-usb-loader-target.c1
-rw-r--r--scripts/rk-usb-loader.c328
-rw-r--r--scripts/rkimage.c71
-rw-r--r--scripts/rockchip.h35
-rw-r--r--scripts/socfpga_mkimage.c51
17 files changed, 692 insertions, 364 deletions
diff --git a/Documentation/boards/rockchip.rst b/Documentation/boards/rockchip.rst
index 55a3956dd4..d52d979cbf 100644
--- a/Documentation/boards/rockchip.rst
+++ b/Documentation/boards/rockchip.rst
@@ -84,3 +84,18 @@ A bootable SD card can be created with:
The barebox image is written to the raw device, so make sure the partitioning
doesn't conflict with the are barebox is written to. Starting the first
partition at offset 8MiB is a safe bet.
+
+USB bootstrapping
+^^^^^^^^^^^^^^^^^
+
+The RK3568 can be bootstrapped via USB for which the rk-usb-loader tool in the barebox
+repository can be used. The tool takes the same images as written on SD cards:
+
+.. code-block:: sh
+
+ ./scripts/rk-usb-loader images/barebox-rk3568-evb.img
+
+Note that the boot order of the RK3568 is not configurable. The SoC will only enter USB
+MaskROM mode when no other bootsource contains a valid bootloader. This means to use USB
+you have to make all other bootsources invalid by removing SD cards and shortcircuiting
+eMMCs. The RK3568 EVB has a pushbutton to disable the eMMC.
diff --git a/arch/sandbox/configs/hosttools_defconfig b/arch/sandbox/configs/hosttools_defconfig
index 7d33853124..0b62b648c7 100644
--- a/arch/sandbox/configs/hosttools_defconfig
+++ b/arch/sandbox/configs/hosttools_defconfig
@@ -4,3 +4,4 @@ CONFIG_ARCH_IMX_USBLOADER=y
CONFIG_MVEBU_HOSTTOOLS=y
CONFIG_OMAP3_USB_LOADER=y
CONFIG_OMAP4_HOSTTOOL_USBBOOT=y
+CONFIG_RK_USB_LOADER=y
diff --git a/arch/sandbox/configs/targettools_defconfig b/arch/sandbox/configs/targettools_defconfig
index d06074790c..22845def61 100644
--- a/arch/sandbox/configs/targettools_defconfig
+++ b/arch/sandbox/configs/targettools_defconfig
@@ -7,3 +7,4 @@ CONFIG_MVEBU_KWBOOT_TARGET=y
CONFIG_ARCH_IMX_USBLOADER_TARGET=y
CONFIG_OMAP3_USB_LOADER_TARGET=y
CONFIG_OMAP4_USBBOOT_TARGET=y
+CONFIG_RK_USB_LOADER_TARGET=y
diff --git a/scripts/.gitignore b/scripts/.gitignore
index cf645ec746..ae70c92af8 100644
--- a/scripts/.gitignore
+++ b/scripts/.gitignore
@@ -31,6 +31,8 @@ omap4_usbboot
omap4_usbboot-target
omap3-usb-loader
omap3-usb-loader-target
+rk-usb-loader
+rk-usb-loader-target
mips-relocs
rsatoc
stm32image
diff --git a/scripts/Kconfig b/scripts/Kconfig
index a490aaa44e..9b744deba9 100644
--- a/scripts/Kconfig
+++ b/scripts/Kconfig
@@ -12,6 +12,69 @@ config COMPILE_HOST_TOOLS
source "scripts/imx/Kconfig"
+config SOCFPGA_MKIMAGE
+ bool "SoCFPGA mkimage" if COMPILE_HOST_TOOLS
+ depends on ARCH_SOCFPGA || COMPILE_HOST_TOOLS
+ default y if ARCH_SOCFPGA
+ help
+ This enables building the image creation tool for SoCFPGA
+
+config ZYNQ_MKIMAGE
+ bool "Zynq mkimage" if COMPILE_HOST_TOOLS
+ depends on ARCH_ZYNQ || COMPILE_HOST_TOOLS
+ default y if ARCH_ZYNQ
+ help
+ This enables building the image creation tool for Zynq
+
+config MXS_HOSTTOOLS
+ bool "MXS host tools" if COMPILE_HOST_TOOLS
+ depends on ARCH_MXS || COMPILE_HOST_TOOLS
+ default y if ARCH_MXS
+ help
+ This enables building the host tools for Freescale MXS SoCs
+
+config LAYERSCAPE_PBLIMAGE
+ bool "Layerscape PBL image tool" if COMPILE_HOST_TOOLS
+ depends on ARCH_LAYERSCAPE || COMPILE_HOST_TOOLS
+ default y if ARCH_LAYERSCAPE
+ help
+ This enables building the PBL image tool for Freescale Layerscape SoCs
+
+config STM32_IMAGE
+ bool "STM32MP image tool" if COMPILE_HOST_TOOLS
+ depends on ARCH_STM32MP || COMPILE_HOST_TOOLS
+ default y if ARCH_STM32MP
+ help
+ This enables building the image creation tool for STM32MP SoCs
+
+config RK_IMAGE
+ bool "Rockchip image tool" if COMPILE_HOST_TOOLS
+ depends on ARCH_ROCKCHIP || COMPILE_HOST_TOOLS
+ default y if ARCH_ROCKCHIP
+ help
+ This enables building the image creation tool for Rockchip SoCs
+
+config OMAP_IMAGE
+ bool "TI OMAP image tools" if COMPILE_HOST_TOOLS
+ depends on ARCH_OMAP || COMPILE_HOST_TOOLS
+ default y if ARCH_OMAP
+ help
+ This enables building the image creation tools for TI OMAP SoCs
+
+config S5P_IMAGE
+ bool "S5P image tool" if COMPILE_HOST_TOOLS
+ depends on ARCH_S5PCxx || COMPILE_HOST_TOOLS
+ default y if ARCH_S5PCxx
+ help
+ This enables building the image creation tool for S5P SoCs
+
+config DAVINCI_IMAGE
+ bool "Davinci image tool" if COMPILE_HOST_TOOLS
+ depends on ARCH_DAVINCI || COMPILE_HOST_TOOLS
+ default y if ARCH_DAVINCI
+ help
+ This enables building the image creation tool for Davinci SoCs
+
config MVEBU_HOSTTOOLS
bool "mvebu hosttools" if COMPILE_HOST_TOOLS
depends on ARCH_MVEBU || COMPILE_HOST_TOOLS
@@ -39,6 +102,14 @@ config OMAP4_HOSTTOOL_USBBOOT
You need libusb-1.0 to compile this tool.
+config RK_USB_LOADER
+ bool "Rockchip USB loader"
+ depends on ARCH_ROCKCHIP || COMPILE_HOST_TOOLS
+ help
+ Say Y here to build the rockchip usb loader tool.
+
+ You need libusb-1.0 to compile this tool.
+
endmenu
menu "Target Tools"
@@ -104,4 +175,11 @@ config OMAP4_USBBOOT_TARGET
Say Y here to build the omap4 usb loader tool for the target.
The cross toolchain needs libusb-1.0 to compile this tool.
+config RK_USB_LOADER_TARGET
+ bool "Rockchip USB loader for target"
+ depends on HAS_TARGET_LIBUSB_1_0
+ help
+ Say Y here to build the rockchip usb loader tool for the target.
+ The cross toolchain needs libusb-1.0 to compile this tool.
+
endmenu
diff --git a/scripts/Makefile b/scripts/Makefile
index 1527b07d47..dc5fa75f90 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -15,17 +15,17 @@ hostprogs-always-$(CONFIG_IMD) += bareboximd
hostprogs-always-$(CONFIG_KALLSYMS) += kallsyms
hostprogs-always-$(CONFIG_MIPS) += mips-relocs
hostprogs-always-$(CONFIG_MVEBU_HOSTTOOLS) += kwbimage kwboot mvebuimg
-hostprogs-always-$(CONFIG_ARCH_OMAP) += omap_signGP mk-omap-image
-hostprogs-always-$(CONFIG_ARCH_S5PCxx) += s5p_cksum
-hostprogs-always-$(CONFIG_ARCH_DAVINCI) += mkublheader
+hostprogs-always-$(CONFIG_OMAP_IMAGE) += omap_signGP mk-omap-image
+hostprogs-always-$(CONFIG_S5P_IMAGE) += s5p_cksum
+hostprogs-always-$(CONFIG_DAVINCI_IMAGE) += mkublheader
HOSTCFLAGS_zynq_mkimage.o = -I$(srctree) -I$(srctree)/arch/arm/mach-zynq/include
-hostprogs-always-$(CONFIG_ARCH_ZYNQ) += zynq_mkimage
-hostprogs-always-$(CONFIG_ARCH_SOCFPGA) += socfpga_mkimage
-hostprogs-always-$(CONFIG_ARCH_MXS) += mxsimage mxsboot
-hostprogs-always-$(CONFIG_ARCH_LAYERSCAPE) += pblimage
-hostprogs-always-$(CONFIG_ARCH_STM32MP) += stm32image
+hostprogs-always-$(CONFIG_ZYNQ_MKIMAGE) += zynq_mkimage
+hostprogs-always-$(CONFIG_SOCFPGA_MKIMAGE) += socfpga_mkimage
+hostprogs-always-$(CONFIG_MXS_HOSTTOOLS) += mxsimage mxsboot
+hostprogs-always-$(CONFIG_LAYERSCAPE_PBLIMAGE) += pblimage
+hostprogs-always-$(CONFIG_STM32_IMAGE) += stm32image
hostprogs-always-$(CONFIG_RISCV) += prelink-riscv
-hostprogs-always-$(CONFIG_ARCH_ROCKCHIP) += rkimage
+hostprogs-always-$(CONFIG_RK_IMAGE) += rkimage
HOSTCFLAGS_rkimage = `pkg-config --cflags openssl`
HOSTLDLIBS_rkimage = `pkg-config --libs openssl`
KBUILD_HOSTCFLAGS += -I$(srctree)/scripts/include/
@@ -36,6 +36,9 @@ hostprogs-always-$(CONFIG_OMAP3_USB_LOADER) += omap3-usb-loader
HOSTCFLAGS_omap4_usbboot.o = `pkg-config --cflags libusb-1.0`
HOSTLDLIBS_omap4_usbboot = -lpthread `pkg-config --libs libusb-1.0`
hostprogs-always-$(CONFIG_OMAP4_HOSTTOOL_USBBOOT) += omap4_usbboot
+HOSTCFLAGS_rk-usb-loader.o = `pkg-config --cflags libusb-1.0`
+HOSTLDLIBS_rk-usb-loader = `pkg-config --libs libusb-1.0`
+hostprogs-always-$(CONFIG_RK_USB_LOADER) += rk-usb-loader
userprogs-always-$(CONFIG_BAREBOXENV_TARGET) += bareboxenv-target
userprogs-always-$(CONFIG_KERNEL_INSTALL_TARGET) += kernel-install-target
@@ -44,11 +47,14 @@ userprogs-always-$(CONFIG_IMD_TARGET) += bareboximd-target
userprogs-always-$(CONFIG_OMAP3_USB_LOADER_TARGET) += omap3-usb-loader-target
userprogs-always-$(CONFIG_OMAP4_USBBOOT_TARGET) += omap4_usbboot-target
userprogs-always-$(CONFIG_MVEBU_KWBOOT_TARGET) += kwboot-target
+userprogs-always-$(CONFIG_RK_USB_LOADER_TARGET) += rk-usb-loader-target
omap3-usb-loader-target-userccflags += `$(CROSS_PKG_CONFIG) --cflags libusb-1.0`
omap3-usb-loader-target-userldlibs += `$(CROSS_PKG_CONFIG) --libs libusb-1.0`
omap4_usbboot-target-userccflags += `$(CROSS_PKG_CONFIG) --cflags libusb-1.0`
omap4_usbboot-target-userldlibs += -lpthread `$(CROSS_PKG_CONFIG) --libs libusb-1.0`
+rk-usb-loader-target-userccflags += `$(CROSS_PKG_CONFIG) --cflags libusb-1.0`
+rk-usb-loader-target-userldlibs += `$(CROSS_PKG_CONFIG) --libs libusb-1.0`
userccflags += -I $(srctree)/$(src)/include -isystem $(srctree)/scripts/include
diff --git a/scripts/bareboximd.c b/scripts/bareboximd.c
index c3dcb4dcf0..a734399aa5 100644
--- a/scripts/bareboximd.c
+++ b/scripts/bareboximd.c
@@ -17,6 +17,8 @@
#include <linux/kernel.h>
#include <sys/mman.h>
+#include "common.h"
+#include "common.c"
#include "../include/image-metadata.h"
#define eprintf(args...) fprintf(stderr, ## args)
@@ -40,104 +42,6 @@ int imd_command_setenv(const char *variable_name, const char *value)
return -EINVAL;
}
-static int write_file(const char *filename, const void *buf, size_t size)
-{
- int fd, ret = 0;
- int now;
-
- fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
- if (fd < 0)
- return fd;
-
- while (size) {
- now = write(fd, buf, size);
- if (now < 0) {
- ret = now;
- goto out;
- }
- size -= now;
- buf += now;
- }
-
-out:
- close(fd);
-
- return ret;
-}
-
-static int read_file_2(const char *filename, size_t *size, void **outbuf, size_t max_size)
-{
- off_t fsize;
- ssize_t rsize;
- int ret, fd;
- void *buf;
-
- *size = 0;
- *outbuf = NULL;
-
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "Cannot open %s: %s\n", filename, strerror(errno));
- return -errno;
- }
-
- fsize = lseek(fd, 0, SEEK_END);
- if (fsize == -1) {
- fprintf(stderr, "Cannot get size %s: %s\n", filename, strerror(errno));
- ret = -errno;
- goto close;
- }
-
- if (fsize < max_size)
- max_size = fsize;
-
- if (lseek(fd, 0, SEEK_SET) == -1) {
- fprintf(stderr, "Cannot seek to start %s: %s\n", filename, strerror(errno));
- ret = -errno;
- goto close;
- }
-
- buf = mmap(NULL, max_size, PROT_READ, MAP_SHARED, fd, 0);
- if (buf == MAP_FAILED ) {
- buf = malloc(max_size);
- if (!buf) {
- fprintf(stderr, "Cannot allocate memory\n");
- ret = -ENOMEM;
- goto close;
- }
-
- *outbuf = buf;
-
- while (*size < max_size) {
- rsize = read(fd, buf, max_size - *size);
- if (rsize == 0) {
- ret = -EIO;
- goto free;
- }
-
- if (rsize < 0) {
- ret = -errno;
- goto free;
- }
-
- buf += rsize;
- *size += rsize;
- }
- } else {
- *outbuf = buf;
- *size = max_size;
- }
-
- ret = 0;
- goto close;
-free:
- *outbuf = NULL;
- free(buf);
-close:
- close(fd);
- return ret;
-}
-
static inline void read_file_2_free(void *buf)
{
/*
diff --git a/scripts/common.c b/scripts/common.c
new file mode 100644
index 0000000000..b780b09941
--- /dev/null
+++ b/scripts/common.c
@@ -0,0 +1,168 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <stdio.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <sys/mman.h>
+
+#include "common.h"
+
+int read_file_2(const char *filename, size_t *size, void **outbuf, size_t max_size)
+{
+ off_t fsize;
+ ssize_t rsize;
+ int ret, fd;
+ void *buf;
+
+ *size = 0;
+ *outbuf = NULL;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0) {
+ fprintf(stderr, "Cannot open %s: %s\n", filename, strerror(errno));
+ return -errno;
+ }
+
+ fsize = lseek(fd, 0, SEEK_END);
+ if (fsize == -1) {
+ fprintf(stderr, "Cannot get size %s: %s\n", filename, strerror(errno));
+ ret = -errno;
+ goto close;
+ }
+
+ if (fsize < max_size)
+ max_size = fsize;
+
+ if (lseek(fd, 0, SEEK_SET) == -1) {
+ fprintf(stderr, "Cannot seek to start %s: %s\n", filename, strerror(errno));
+ ret = -errno;
+ goto close;
+ }
+
+ buf = mmap(NULL, max_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+ if (buf == MAP_FAILED ) {
+ buf = malloc(max_size);
+ if (!buf) {
+ fprintf(stderr, "Cannot allocate memory\n");
+ ret = -ENOMEM;
+ goto close;
+ }
+
+ *outbuf = buf;
+
+ while (*size < max_size) {
+ rsize = read(fd, buf, max_size - *size);
+ if (rsize == 0) {
+ ret = -EIO;
+ goto free;
+ }
+
+ if (rsize < 0) {
+ ret = -errno;
+ goto free;
+ }
+
+ buf += rsize;
+ *size += rsize;
+ }
+ } else {
+ *outbuf = buf;
+ *size = max_size;
+ }
+
+ ret = 0;
+ goto close;
+free:
+ *outbuf = NULL;
+ free(buf);
+close:
+ close(fd);
+ return ret;
+}
+
+void *read_file(const char *filename, size_t *size)
+{
+ int ret;
+ void *buf;
+
+ ret = read_file_2(filename, size, &buf, (size_t)-1);
+ if (!ret)
+ return buf;
+
+ errno = -ret;
+
+ return NULL;
+}
+
+int write_file(const char *filename, const void *buf, size_t size)
+{
+ int fd, ret = 0;
+ int now;
+
+ fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT,
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (fd < 0) {
+ fprintf(stderr, "Cannot open %s: %s\n", filename, strerror(errno));
+ return -errno;
+ }
+
+ while (size) {
+ now = write(fd, buf, size);
+ if (now < 0) {
+ fprintf(stderr, "Cannot write to %s: %s\n", filename,
+ strerror(errno));
+ ret = -errno;
+ goto out;
+ }
+ size -= now;
+ buf += now;
+ }
+
+out:
+ close(fd);
+
+ return ret;
+}
+
+int read_full(int fd, void *buf, size_t size)
+{
+ size_t insize = size;
+ int now;
+ int total = 0;
+
+ while (size) {
+ now = read(fd, buf, size);
+ if (now == 0)
+ return total;
+ if (now < 0)
+ return now;
+ total += now;
+ size -= now;
+ buf += now;
+ }
+
+ return insize;
+}
+
+int write_full(int fd, void *buf, size_t size)
+{
+ size_t insize = size;
+ int now;
+
+ while (size) {
+ now = write(fd, buf, size);
+ if (now <= 0)
+ return now;
+ size -= now;
+ buf += now;
+ }
+
+ return insize;
+}
diff --git a/scripts/common.h b/scripts/common.h
new file mode 100644
index 0000000000..820108c52c
--- /dev/null
+++ b/scripts/common.h
@@ -0,0 +1,10 @@
+#ifndef __COMMON_H
+#define __COMMON_H
+
+int read_file_2(const char *filename, size_t *size, void **outbuf, size_t max_size);
+void *read_file(const char *filename, size_t *size);
+int write_file(const char *filename, const void *buf, size_t size);
+int read_full(int fd, void *buf, size_t size);
+int write_full(int fd, void *buf, size_t size);
+
+#endif /* __COMMON_H */
diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c
index b97f561897..439912a805 100644
--- a/scripts/imx/imx-image.c
+++ b/scripts/imx/imx-image.c
@@ -15,6 +15,7 @@
#include <linux/kernel.h>
#include <sys/file.h>
#include "../compiler.h"
+#include "../common.h"
#include "imx.h"
@@ -23,6 +24,8 @@
#define FLASH_HEADER_OFFSET 0x400
#define ARM_HEAD_SIZE_INDEX (ARM_HEAD_SIZE_OFFSET / sizeof(uint32_t))
+#include "../common.c"
+
/*
* Conservative DCD element limit set to restriction v2 header size to
* HEADER_SIZE
@@ -721,38 +724,6 @@ static int hab_sign(struct config_data *data)
return 0;
}
-static void *xread_file(const char *filename, size_t *size)
-{
- int fd, ret;
- void *buf;
- struct stat s;
-
- fd = open(filename, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "Cannot open %s: %s\n", filename, strerror(errno));
- exit(1);
- }
-
- ret = fstat(fd, &s);
- if (ret) {
- fprintf(stderr, "Cannot stat %s: %s\n", filename, strerror(errno));
- exit(1);
- }
-
- *size = s.st_size;
- buf = malloc(*size);
- if (!buf) {
- perror("malloc");
- exit(1);
- }
-
- xread(fd, buf, *size);
-
- close(fd);
-
- return buf;
-}
-
static bool cpu_is_aarch64(const struct config_data *data)
{
return cpu_is_mx8m(data);
@@ -914,8 +885,10 @@ int main(int argc, char *argv[])
if (data.signed_hdmi_firmware_file) {
free(buf);
- buf = xread_file(data.signed_hdmi_firmware_file,
+ buf = read_file(data.signed_hdmi_firmware_file,
&signed_hdmi_firmware_size);
+ if (!buf)
+ exit(1);
signed_hdmi_firmware_size =
roundup(signed_hdmi_firmware_size,
@@ -957,7 +930,9 @@ int main(int argc, char *argv[])
bb_header[0] = data.first_opcode;
bb_header[ARM_HEAD_SIZE_INDEX] = barebox_image_size;
- infile = xread_file(imagename, &insize);
+ infile = read_file(imagename, &insize);
+ if (!infile)
+ exit(1);
outfd = open(data.outfile, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if (outfd < 0) {
@@ -1024,7 +999,9 @@ int main(int argc, char *argv[])
if (create_usb_image) {
uint32_t *dcd;
- infile = xread_file(data.outfile, &insize);
+ infile = read_file(data.outfile, &insize);
+ if (!infile)
+ exit(1);
dcd = infile + dcd_ptr_offset;
*dcd = dcd_ptr_content;
diff --git a/scripts/imx/imx-usb-loader.c b/scripts/imx/imx-usb-loader.c
index cff77f27f2..d8b2842989 100644
--- a/scripts/imx/imx-usb-loader.c
+++ b/scripts/imx/imx-usb-loader.c
@@ -34,9 +34,12 @@
#include <arpa/inet.h>
#include <linux/kernel.h>
+#include "../common.h"
#include "../compiler.h"
#include "imx.h"
+#include "../common.c"
+
#define get_min(a, b) (((a) < (b)) ? (a) : (b))
#define FT_APP 0xaa
@@ -409,61 +412,6 @@ static void dump_bytes(const void *src, unsigned cnt, unsigned addr)
}
}
-static long get_file_size(FILE *xfile)
-{
- long size;
- fseek(xfile, 0, SEEK_END);
- size = ftell(xfile);
- rewind(xfile);
-
- return size;
-}
-
-static int read_file(const char *name, unsigned char **buffer, unsigned *size)
-{
- FILE *xfile;
- unsigned fsize;
- int cnt;
- unsigned char *buf;
- xfile = fopen(name, "rb");
- if (!xfile) {
- printf("error, can not open input file: %s\n", name);
- return -5;
- }
-
- fsize = get_file_size(xfile);
- if (fsize < 0x20) {
- printf("error, file: %s is too small\n", name);
- fclose(xfile);
- return -2;
- }
-
- buf = malloc(ALIGN(fsize, 4));
- if (!buf) {
- printf("error, out of memory\n");
- fclose(xfile);
- return -2;
- }
-
- cnt = fread(buf, 1 , fsize, xfile);
- if (cnt < fsize) {
- printf("error, cannot read %s\n", name);
- fclose(xfile);
- free(buf);
- return -1;
- }
-
- if (size)
- *size = fsize;
-
- if (buffer)
- *buffer = buf;
- else
- free(buf);
-
- return 0;
-}
-
/*
* HID Class-Specific Requests values. See section 7.2 of the HID specifications
*/
@@ -1381,7 +1329,7 @@ static int do_irom_download(struct usb_work *curr, int verify)
{
int ret;
unsigned char type;
- unsigned fsize = 0;
+ size_t fsize = 0;
unsigned header_offset;
unsigned char *buf = NULL;
unsigned char *image;
@@ -1391,9 +1339,9 @@ static int do_irom_download(struct usb_work *curr, int verify)
unsigned header_addr = 0;
unsigned total_size = 0;
- ret = read_file(curr->filename, &buf, &fsize);
- if (ret < 0)
- return ret;
+ buf = read_file(curr->filename, &fsize);
+ if (!buf)
+ return -errno;
max_length = fsize;
@@ -1436,7 +1384,7 @@ static int do_irom_download(struct usb_work *curr, int verify)
}
}
- printf("loading binary file(%s) to 0x%08x, fsize=%u type=%d...\n",
+ printf("loading binary file(%s) to 0x%08x, fsize=%zu type=%d...\n",
curr->filename, header_addr, fsize, type);
ret = load_file(image, fsize, header_addr, type, false);
@@ -1552,13 +1500,12 @@ static int mxs_load_file(libusb_device_handle *dev, uint8_t *data, int size)
static int mxs_work(struct usb_work *curr)
{
- unsigned fsize = 0;
+ size_t fsize = 0;
unsigned char *buf = NULL;
- int ret;
- ret = read_file(curr->filename, &buf, &fsize);
- if (ret < 0)
- return ret;
+ buf = read_file(curr->filename, &fsize);
+ if (!buf)
+ return -errno;
return mxs_load_file(usb_dev_handle, buf, fsize);
}
diff --git a/scripts/omap3-usb-loader.c b/scripts/omap3-usb-loader.c
index 0f352c8453..a8d626c32f 100644
--- a/scripts/omap3-usb-loader.c
+++ b/scripts/omap3-usb-loader.c
@@ -30,6 +30,9 @@
#include <libusb.h> /* the main event */
+#include "common.h"
+#include "common.c"
+
/* Device specific defines (OMAP)
* Primary source: http://www.ti.com/lit/pdf/sprugn4
* Section 26.4.5 "Peripheral Booting"
@@ -325,50 +328,6 @@ found:
return handle;
}
-static unsigned char *read_file(char *path, size_t *readamt)
-{
- FILE *fp = fopen(path, "rb");
-
- if (!fp) {
- log_error("failed to open file \'%s\': %s\n", path,
- strerror(errno));
- return NULL;
- }
-
- unsigned char *data = NULL;
- size_t allocsize = 0;
- size_t iter = 0;
-
- while (1) {
- allocsize += 1024;
- data = realloc(data, allocsize);
- if (!data)
- return NULL;
-
- size_t readsize = allocsize - iter;
- size_t ret = fread(data + iter, sizeof (unsigned char), readsize, fp);
-
- iter += ret;
-
- if (ret != readsize) {
- if (feof(fp)) {
- break;
- } else if (ferror(fp)) {
- log_error("error file reading file \'%s\': %s\n",
- path, strerror(errno));
- free(data);
- return NULL;
- }
- }
- }
-
- /* trim the allocation down to size */
- data = realloc(data, iter);
- *readamt = iter;
-
- return data;
-}
-
static int transfer_first_stage(libusb_device_handle * handle, struct arg_state *args)
{
unsigned char *buffer = NULL;
diff --git a/scripts/rk-usb-loader-target.c b/scripts/rk-usb-loader-target.c
new file mode 100644
index 0000000000..fe1540d752
--- /dev/null
+++ b/scripts/rk-usb-loader-target.c
@@ -0,0 +1 @@
+#include "rk-usb-loader.c"
diff --git a/scripts/rk-usb-loader.c b/scripts/rk-usb-loader.c
new file mode 100644
index 0000000000..9c2367ed28
--- /dev/null
+++ b/scripts/rk-usb-loader.c
@@ -0,0 +1,328 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/*
+ * rk-usb-loader: A tool to USB Bootstrap Rockchip SoCs
+ *
+ * This tool bootstraps Rockchip SoCs via USB. It is known to work
+ * on these SoCs:
+ *
+ * - RK3568
+ * - RK3566
+ *
+ * rk-usb-loader takes the barebox images the barebox build process
+ * generates as input. The upload protocol has been taken from the
+ * rkdevelop tool, but it's not a full replacement of that tool.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <getopt.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <libusb.h>
+
+#include "common.h"
+#include "common.c"
+#include "rockchip.h"
+
+static void log_error(char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ fprintf(stdout, "[-] ");
+ vfprintf(stdout, fmt, va);
+ va_end(va);
+}
+
+static void log_info(char *fmt, ...)
+{
+ va_list va;
+
+ va_start(va, fmt);
+ fprintf(stdout, "[+] ");
+ vfprintf(stdout, fmt, va);
+ va_end(va);
+}
+
+static int debug;
+
+static void log_debug(char *fmt, ...)
+{
+ va_list va;
+
+ if (!debug)
+ return;
+
+ va_start(va, fmt);
+ fprintf(stdout, "[D] ");
+ vfprintf(stdout, fmt, va);
+ va_end(va);
+}
+
+static libusb_device_handle *rk_usb_open(libusb_context *ctx, uint16_t vendor, uint16_t product)
+{
+ libusb_device **devlist;
+ libusb_device_handle *handle;
+ struct libusb_device_descriptor desc;
+ ssize_t count, i;
+ int ret;
+
+ log_info("scanning for USB device matching %04hx:%04hx...\n",
+ vendor, product);
+
+ while (1) {
+ if ((count = libusb_get_device_list(ctx, &devlist)) < 0) {
+ log_error("failed to gather USB device list: %s\n",
+ libusb_error_name(count));
+ return NULL;
+ }
+
+ for (i = 0; i < count; i++) {
+ ret = libusb_get_device_descriptor(devlist[i], &desc);
+ if (ret < 0) {
+ log_error("failed to get USB device descriptor: %s\n",
+ libusb_error_name(ret));
+ libusb_free_device_list(devlist, 1);
+ return NULL;
+ }
+
+ if (desc.idVendor != vendor)
+ continue;
+
+ if (product) {
+ if (desc.idProduct != product)
+ continue;
+ goto found;
+ }
+ }
+
+ libusb_free_device_list(devlist, 1);
+
+ /* nothing found yet. have a 10ms nap */
+ usleep(10000);
+ }
+found:
+
+ ret = libusb_open(devlist[i], &handle);
+ if (ret < 0) {
+ log_error("failed to open USB device %04hx:%04hx: %s\n",
+ vendor, product, libusb_error_name(ret));
+ libusb_free_device_list(devlist, 1);
+ return NULL;
+ }
+
+ ret = libusb_claim_interface(handle, 0);
+ if (ret) {
+ printf("Claim failed\n");
+ return NULL;
+ }
+
+ log_info("successfully opened %04hx:%04hx\n", vendor, product);
+
+ return handle;
+}
+
+#define poly16_CCITT 0x1021 /* crc-ccitt mask */
+
+static uint16_t crc_calculate(uint16_t crc, unsigned char ch)
+{
+ unsigned int i;
+
+ for (i = 0x80; i != 0; i >>= 1) {
+ if (crc & 0x8000) {
+ crc <<= 1;
+ crc ^= poly16_CCITT;
+ } else {
+ crc <<= 1;
+ }
+
+ if (ch & i)
+ crc ^= poly16_CCITT;
+ }
+ return crc;
+}
+
+static uint16_t crc_ccitt(unsigned char *p, int n)
+{
+ uint16_t crc = 0xffff;
+
+ while (n--) {
+ crc = crc_calculate(crc, *p);
+ p++;
+ }
+
+ return crc;
+}
+
+static int upload(libusb_device_handle *dev, unsigned int dwRequest, void *buf, int n_bytes)
+{
+ uint16_t crc;
+ uint8_t *data;
+ int sent = 0, ret;
+
+ data = calloc(n_bytes + 5, 1);
+ memcpy(data, buf, n_bytes);
+
+ crc = crc_ccitt(data, n_bytes);
+ data[n_bytes] = (crc & 0xff00) >> 8;
+ data[n_bytes + 1] = crc & 0x00ff;
+ n_bytes += 2;
+
+ while (sent < n_bytes) {
+ int now;
+
+ if (n_bytes - sent > 4096)
+ now = 4096;
+ else
+ now = n_bytes - sent;
+
+ ret = libusb_control_transfer(dev, 0x40, 0xC, 0, dwRequest,
+ data + sent, now, 0);
+ if (ret != now) {
+ log_error("DeviceRequest 0x%x failed, err=%d",
+ dwRequest, ret);
+
+ ret = -EIO;
+ goto err;
+ }
+ sent += now;
+ }
+
+ ret = 0;
+err:
+ free(data);
+
+ return ret;
+}
+
+static int upload_image(const char *filename)
+{
+ libusb_context *ctx;
+ libusb_device_handle *dev;
+ int ret;
+ void *buf;
+ struct newidb *hdr;
+ int i, n_files;
+ size_t size;
+
+ buf = read_file(filename, &size);
+ if (!buf)
+ exit(1);
+
+ hdr = buf;
+
+ if (hdr->magic != NEWIDB_MAGIC) {
+ log_error("%s has invalid magic 0x%08x ( != 0x%08x )\n", filename,
+ hdr->magic, NEWIDB_MAGIC);
+ exit(1);
+ }
+
+ ret = libusb_init(&ctx);
+ if (ret < 0) {
+ log_error("failed to initialize libusb context: %s\n",
+ libusb_error_name(ret));
+ return ret;
+ }
+
+ dev = rk_usb_open(ctx, 0x2207, 0x350a);
+ if (!dev) {
+ libusb_exit(ctx);
+ return 1;
+ }
+
+ n_files = hdr->n_files >> 16;
+
+ if (n_files > 2) {
+ /*
+ * This tool is designed for barebox images generated with rkimage.
+ * These have one blob containing the SDRAM setup sent with the
+ * CODE471_OPTION and one blob containing the barebox image sent with
+ * the CODE472_OPTION.
+ */
+ log_error("Invalid image with %d blobs\n", n_files);
+ ret = -EINVAL;
+ goto err;
+ }
+
+ for (i = 0; i < n_files; i++) {
+ struct newidb_entry *entry = &hdr->entries[i];
+ int foffset, fsize, wIndex;
+
+ if (i)
+ wIndex = 0x472;
+ else
+ wIndex = 0x471;
+
+ log_info("Uploading %d/%d\n", i + 1, n_files);
+
+ foffset = (entry->sector & 0xffff) * SECTOR_SIZE;
+ fsize = (entry->sector >> 16) * SECTOR_SIZE;
+
+ log_debug("image starting at offset 0x%08x, size 0x%08x\n", foffset, fsize);
+
+ ret = upload(dev, wIndex, buf + foffset, fsize);
+ if (ret)
+ goto err;
+ }
+
+ ret = 0;
+err:
+ libusb_close(dev);
+ libusb_exit(ctx);
+
+ return ret;
+}
+
+static void usage(const char *prgname)
+{
+ printf(
+"Usage: %s [OPTIONS] <IMAGE>\n"
+"\n"
+"Options:\n"
+" -d Enable debugging output\n"
+" -h This help\n",
+ prgname);
+}
+
+static struct option cbootcmd[] = {
+ {"debug", 0, NULL, 'd'},
+ {"help", 0, NULL, 'h'},
+ {0, 0, 0, 0},
+};
+
+int main(int argc, char **argv)
+{
+ int opt, ret;
+ const char *filename;
+
+ while ((opt = getopt_long(argc, argv, "hd", cbootcmd, NULL)) > 0) {
+ switch (opt) {
+ case 'h':
+ usage(argv[0]);
+ exit(0);
+ case 'd':
+ debug = 1;
+ break;
+ }
+ }
+
+ if (argc == optind) {
+ usage(argv[0]);
+ exit(1);
+ }
+
+ filename = argv[optind];
+
+ ret = upload_image(filename);
+ if (ret)
+ exit(1);
+
+ exit(0);
+}
diff --git a/scripts/rkimage.c b/scripts/rkimage.c
index dde9724886..6e68d508ac 100644
--- a/scripts/rkimage.c
+++ b/scripts/rkimage.c
@@ -13,6 +13,10 @@
#include <errno.h>
#include <stdbool.h>
+#include "common.h"
+#include "common.c"
+#include "rockchip.h"
+
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
@@ -34,37 +38,6 @@ static void sha512(const void *buf, int len, void *out)
SHA512_Final(out, &sha512);
}
-#define NEWIDB_MAGIC 0x534e4b52 /* 'RKNS' */
-
-struct newidb_entry {
- uint32_t sector;
- uint32_t unknown_ffffffff;
- uint32_t unknown1;
- uint32_t image_number;
- unsigned char unknown2[8];
- unsigned char hash[64];
-};
-
-struct newidb {
- uint32_t magic;
- unsigned char unknown1[4];
- uint32_t n_files;
- uint32_t hashtype;
- unsigned char unknown2[8];
- unsigned char unknown3[8];
- unsigned char unknown4[88];
- struct newidb_entry entries[4];
- unsigned char unknown5[40];
- unsigned char unknown6[512];
- unsigned char unknown7[16];
- unsigned char unknown8[32];
- unsigned char unknown9[464];
- unsigned char hash[512];
-};
-
-#define SECTOR_SIZE 512
-#define PAGE_SIZE 2048
-
typedef enum {
HASH_TYPE_SHA256 = 1,
HASH_TYPE_SHA512 = 2,
@@ -149,42 +122,6 @@ static void usage(const char *prgname)
prgname);
}
-static int read_full(int fd, void *buf, size_t size)
-{
- size_t insize = size;
- int now;
- int total = 0;
-
- while (size) {
- now = read(fd, buf, size);
- if (now == 0)
- return total;
- if (now < 0)
- return now;
- total += now;
- size -= now;
- buf += now;
- }
-
- return insize;
-}
-
-static int write_full(int fd, void *buf, size_t size)
-{
- size_t insize = size;
- int now;
-
- while (size) {
- now = write(fd, buf, size);
- if (now <= 0)
- return now;
- size -= now;
- buf += now;
- }
-
- return insize;
-}
-
int main(int argc, char *argv[])
{
int opt, i, fd;
diff --git a/scripts/rockchip.h b/scripts/rockchip.h
new file mode 100644
index 0000000000..8cc14f8f2f
--- /dev/null
+++ b/scripts/rockchip.h
@@ -0,0 +1,35 @@
+#ifndef __ROCKCHIP_H
+#define __ROCKCHIP_H
+
+#define NEWIDB_MAGIC 0x534e4b52 /* 'RKNS' */
+
+struct newidb_entry {
+ uint32_t sector;
+ uint32_t unknown_ffffffff;
+ uint32_t unknown1;
+ uint32_t image_number;
+ unsigned char unknown2[8];
+ unsigned char hash[64];
+};
+
+struct newidb {
+ uint32_t magic;
+ unsigned char unknown1[4];
+ uint32_t n_files;
+ uint32_t hashtype;
+ unsigned char unknown2[8];
+ unsigned char unknown3[8];
+ unsigned char unknown4[88];
+ struct newidb_entry entries[4];
+ unsigned char unknown5[40];
+ unsigned char unknown6[512];
+ unsigned char unknown7[16];
+ unsigned char unknown8[32];
+ unsigned char unknown9[464];
+ unsigned char hash[512];
+};
+
+#define SECTOR_SIZE 512
+#define PAGE_SIZE 2048
+
+#endif /* __ROCKCHIP_H */
diff --git a/scripts/socfpga_mkimage.c b/scripts/socfpga_mkimage.c
index 73dfbeae3a..e88e75962f 100644
--- a/scripts/socfpga_mkimage.c
+++ b/scripts/socfpga_mkimage.c
@@ -10,6 +10,9 @@
#include <fcntl.h>
#include <endian.h>
+#include "common.h"
+#include "common.c"
+
#define VALIDATION_WORD 0x31305341
#define BRANCH_INST 0xea /* ARM opcode for "b" (unconditional branch) */
@@ -65,42 +68,6 @@ static uint32_t bb_header[] = {
0xea00006b, /* entry. b 0x200 (offset may be adjusted) */
};
-static int read_full(int fd, void *buf, size_t size)
-{
- size_t insize = size;
- int now;
- int total = 0;
-
- while (size) {
- now = read(fd, buf, size);
- if (now == 0)
- return total;
- if (now < 0)
- return now;
- total += now;
- size -= now;
- buf += now;
- }
-
- return insize;
-}
-
-static int write_full(int fd, void *buf, size_t size)
-{
- size_t insize = size;
- int now;
-
- while (size) {
- now = write(fd, buf, size);
- if (now <= 0)
- return now;
- size -= now;
- buf += now;
- }
-
- return insize;
-}
-
static const uint32_t crc_table[256] = {
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
@@ -381,17 +348,9 @@ int main(int argc, char *argv[])
if (ret)
exit(1);
- fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0644);
- if (fd < 0) {
- perror("open outfile");
- exit(1);
- }
-
- ret = write_full(fd, buf, s.st_size + 4 + addsize + pad);
- if (ret < 0) {
- perror("write outfile");
+ ret = write_file(outfile, buf, s.st_size + 4 + addsize + pad);
+ if (ret)
exit(1);
- }
exit(0);
}