Subject: Re: Fix build of rkdeveloptool

From: phodina <[email-masked]>
Date: Mon, 09 Jan 2023 15:08:37 +0000

Here's updated patch as it had some conflicts.

Plus I added patch to speedup the transfer. Tested on Pinenote and Quartz64.

----
Petr
------- Original Message -------
On Monday, January 9th, 2023 at 1:49 PM, phodina <[email-masked]> wrote:

> Hi Efraim,
>
> since you fixed the build can for the rkdeveloptool (commit 3ad3869297fd327ef417b1ecb95c2c4caf53d2e6) can you have a look also on the second patch please?
>
> ----
> Petr
> ------- Original Message -------
> On Thursday, December 15th, 2022 at 9:36 PM, phodina <[email-masked]> wrote:
>
>> Hi Ludo’,
>>
>> speaking of lost patches this one is little bit annoying as it does not even build.
>>
>> Excerpt of the build log, build failure caused probably by introducing stricter compilation flags in `gnu-build-system`:
>>
>> starting phase `build'
>> make[1]: Entering directory '/tmp/guix-build-rkdeveloptool-1.3-0.6e92ebc.drv-0/source'
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT crc.o -MD -MP -MF .deps/crc.Tpo -c -o crc.o crc.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT RKBoot.o -MD -MP -MF .deps/RKBoot.Tpo -c -o RKBoot.o RKBoot.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT RKComm.o -MD -MP -MF .deps/RKComm.Tpo -c -o RKComm.o RKComm.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT RKDevice.o -MD -MP -MF .deps/RKDevice.Tpo -c -o RKDevice.o RKDevice.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT RKImage.o -MD -MP -MF .deps/RKImage.Tpo -c -o RKImage.o RKImage.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT RKLog.o -MD -MP -MF .deps/RKLog.Tpo -c -o RKLog.o RKLog.cpp
>> g++ -DHAVE_CONFIG_H -I. -I./cfg -Wall -Werror -Wextra -Wreturn-type -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE -I/gnu/store/vjlg2z75qwbwxdp5qiklcdx7df9xvbb2-libusb-1.0.24/include/libusb-1.0 -g -O2 -MT RKScan.o -MD -MP -MF .deps/RKScan.Tpo -c -o RKScan.o RKScan.cpp
>> mv -f .deps/RKBoot.Tpo .deps/RKBoot.Po
>> mv -f .deps/RKImage.Tpo .deps/RKImage.Po
>> mv -f .deps/RKLog.Tpo .deps/RKLog.Po
>> mv -f .deps/RKDevice.Tpo .deps/RKDevice.Po
>> mv -f .deps/RKComm.Tpo .deps/RKComm.Po
>> mv -f .deps/crc.Tpo .deps/crc.Po
>> mv -f .deps/RKScan.Tpo .deps/RKScan.Po
>> main.cpp: In function ‘bool _Z9mergeBootv.part.0()’:
>> main.cpp:1541:36: error: ‘%s’ directive output may be truncated writing up to 557 bytes into a region of size 5 [-Werror=format-truncation=]
>> 1541 | snprintf(buffer, sizeof(buffer), "%s", chip);
>> | ^~
>> ......
>> 1582 | chipType = convertChipType(chip + 2);
>> | ~~~~~~~~~~~~~~~~~~~~~~~~~
>> main.cpp:1541:10: note: ‘snprintf’ output between 1 and 558 bytes into a destination of size 5
>> 1541 | snprintf(buffer, sizeof(buffer), "%s", chip);
>> | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> cc1plus: all warnings being treated as errors
>> make[1]: *** [Makefile:473: main.o] Error 1
>> make[1]: Leaving directory '/tmp/guix-build-rkdeveloptool-1.3-0.6e92ebc.drv-0/source'
>> make: *** [Makefile:493: all-recursive] Error 1
>> error: in phase 'build': uncaught exception:
>> %exception #<&invoke-error program: "make" arguments: ("-j" "16") exit-status: 2 term-signal: #f stop-signal: #f>
>> phase `build' failed after 2.2 seconds
>> command "make" "-j" "16" failed with status 2
>> builder for `/gnu/store/srykckhmy9lpdg2gl6702vs71b20apsj-rkdeveloptool-1.3-0.6e92ebc.drv' failed with exit code 1
>> build of /gnu/store/srykckhmy9lpdg2gl6702vs71b20apsj-rkdeveloptool-1.3-0.6e92ebc.drv failed
>> View build log at '/var/log/guix/drvs/sr/ykckhmy9lpdg2gl6702vs71b20apsj-rkdeveloptool-1.3-0.6e92ebc.drv.gz'.guix build: error: build of `/gnu/store/srykckhmy9lpdg2gl6702vs71b20apsj-rkdeveloptool-1.3-0.6e92ebc.drv' failed
>> ------- Original Message -------
>> On Monday, February 21st, 2022 at 1:43 PM, phodina <[email-masked]> wrote:
>>
>>> Hi,
>>>
>>> Here's fix of the rkdeveloptool package which fails to build due to GCC complaining about the truncation error.
>>>
>>> See https://github.com/rockchip-linux/rkdeveloptool/pull/62.
>>>
>>> ----
>>> Petr

From 5d339ca82211b7bdecd12ddcd14cf9dcc1dbb98d Mon Sep 17 00:00:00 2001
From: Petr Hodina <[email-masked]>
Date: Mon, 21 Feb 2022 13:33:41 +0100
Subject: [PATCH v2] gnu: Add rkdeveloptool-pine64.

* gnu/packages/hardware.scm (rkdeveloptool-pine64): New variable.
* gnu/local.mk: Add patches.
* gnu/packages/patches/rkdeveloptool-pine64-speed-up-xfer.patch: New file.
* gnu/packages/patches/rkdeveloptool-pine64-dump-over-2gib.patch: New file.

diff --git a/gnu/local.mk b/gnu/local.mk
index f0b1b3fd15..177ad1996b 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1800,6 +1800,8 @@ dist_patch_DATA =						\
   %D%/packages/patches/restic-0.9.6-fix-tests-for-go1.15.patch	\
   %D%/packages/patches/retroarch-LIBRETRO_DIRECTORY.patch	\
   %D%/packages/patches/r-mixedpower-r2power.patch		\
+  %D%/packages/patches/rkdeveloptool-pine64-speed-up-xfer.patch \
+  %D%/packages/patches/rkdeveloptool-pine64-dump-over-2gib.patch \
   %D%/packages/patches/rnp-add-version.cmake.patch		\
   %D%/packages/patches/rnp-disable-ruby-rnp-tests.patch		\
   %D%/packages/patches/rnp-unbundle-googletest.patch		\
diff --git a/gnu/packages/hardware.scm b/gnu/packages/hardware.scm
index 81f38d069b..e86d96b792 100644
--- a/gnu/packages/hardware.scm
+++ b/gnu/packages/hardware.scm
@@ -15,6 +15,7 @@
 ;;; Copyright © 2022 Marcel Kupiec <[email-masked]>
 ;;; Copyright © 2022 Maxim Cournoyer <[email-masked]>
 ;;; Copyright © 2022 Efraim Flashner <[email-masked]>
+;;; Copyright © 2023 Petr Hodina <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -1174,6 +1175,43 @@ (define-public rkdeveloptool
 as the Pinebook Pro.")
       (license license:gpl2+))))
 
+(define-public rkdeveloptool-pine64
+  (package
+    (name "rkdeveloptool-pine64")
+    (version "1.1.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url
+                     "https://gitlab.com/pine64-org/quartz-bsp/rkdeveloptool")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (patches (search-patches
+                        "rkdeveloptool-pine64-speed-up-xfer.patch"
+                        "rkdeveloptool-pine64-dump-over-2gib.patch"))
+              (sha256
+               (base32
+                "0nh9592mllygycnxbw91vg58wwais7w3w62rl9gcvc4m3i909b1z"))))
+    (build-system meson-build-system)
+    (arguments
+     `(#:tests? #f ;no test suite
+       #:phases (modify-phases %standard-phases
+                  ;; attempts to place the file into the udev pkg read-only path
+                  (add-after 'unpack 'fix-udev-path
+                    (lambda* _
+                      (substitute* "meson.build"
+                        (("udev_rules_dir,")
+                         (string-append "'" %output "/lib/udev/rules.d',"))))))))
+    (native-inputs (list pkg-config))
+    (inputs (list eudev libusb))
+    (synopsis "Read from and write to RockChip devices over USB")
+    (description
+     "Rkdeveloptool is a fastboot-like CLI tool to read from and
+write to RockChip devices over USB.  Supports PineNote and Quartz64 as well
+as other Pine64 RK devices.")
+    (home-page "https://gitlab.com/pine64-org/quartz-bsp/rkdeveloptool")
+    (license license:gpl2+)))
+
 (define-public usbguard
   (package
     (name "usbguard")
diff --git a/gnu/packages/patches/rkdeveloptool-pine64-dump-over-2gib.patch b/gnu/packages/patches/rkdeveloptool-pine64-dump-over-2gib.patch
new file mode 100644
index 0000000000..e2c7328bfa
--- /dev/null
+++ b/gnu/packages/patches/rkdeveloptool-pine64-dump-over-2gib.patch
@@ -0,0 +1,54 @@
+diff --git a/main.cpp b/main.cpp
+index 029f0e2..e40bce2 100644
+--- a/main.cpp
++++ b/main.cpp
+@@ -2455,12 +2455,6 @@ bool read_lba(
+ 
+ 	if (!check_device_type(dev, RKUSB_LOADER | RKUSB_MASKROM))
+ 		return false;
+-	if (uiLen % 512) {
+-		fprintf(stderr, "Length must be a multiple of sector size (%d)\n",
+-				SECTOR_SIZE);
+-		return false;
+-	}
+-	uiLen /= 512;
+ 
+ 	if (!bRet) {
+ 		fprintf(stderr, "Read LBA quit, creating comm object failed!\n");
+@@ -3265,7 +3259,7 @@ bool handle_command(int argc, char *argv[], CRKScan *pScan) {
+ 				bRet = get_lba_from_gpt(master_gpt, argv[2], &lba, &lba_end);
+ 				if (bRet) {
+ 					bSuccess = read_lba(dev, (u32)lba,
+-							((u32)(lba_end - lba + 1)) * 512, argv[3]);
++							(u32)(lba_end - lba + 1), argv[3]);
+ 				} else {
+ 					fprintf(stderr, "Could not find the %s partition\n", argv[2]);
+ 				}
+@@ -3276,7 +3270,7 @@ bool handle_command(int argc, char *argv[], CRKScan *pScan) {
+ 	} else if (strcmp(strCmd.c_str(), "RL") == 0 ||
+ 			strcmp(strCmd.c_str(), "READ") == 0) {
+ 		char *pszEnd;
+-		UINT uiBegin, uiLen;
++		UINT uiBegin;
+ 		if (argc != 5)
+ 			fprintf(stderr, "Usage: rkdeveloptool read start-sector num-bytes "
+ 				   "filename\n");
+@@ -3285,11 +3279,15 @@ bool handle_command(int argc, char *argv[], CRKScan *pScan) {
+ 			if (*pszEnd)
+ 				fprintf(stderr, "Begin is invalid, please check!\n");
+ 			else {
+-				uiLen = strtoul(argv[3], &pszEnd, 0);
++				unsigned long long len = strtoull(argv[3], &pszEnd, 0);
+ 				if (*pszEnd)
+ 					fprintf(stderr, "Len is invalid, please check!\n");
+-				else {
+-					bSuccess = read_lba(dev, uiBegin, uiLen, argv[4]);
++				else if (len % 512) {
++					fprintf(stderr, "Length must be a multiple of sector size (%d)\n",
++                		SECTOR_SIZE);
++				} else {
++					len /= 512;
++					bSuccess = read_lba(dev, uiBegin, len, argv[4]);
+ 				}
+ 			}
+ 		}
-- 
2.38.1