Skip to content

Commit 2575d98

Browse files
committed
snagrecover: Add rockchip support
Add support for booting a rockchip bin file, made with boot_merger. It can be: - a file containing the rockchip miniloader, but in this case, it's not useful, as rockusb is not implemented - a file containing uboot tpl and spl. In this case, if u-boot is configured for SPL DFU, the snagrecover configuration file may specify an u-boot FIT image to load into the first DFU slot. This will allow booting u-boot proper and then to fastboot/ums/dfu/... to flash. Signed-off-by: Arnaud Patard <[email protected]>
1 parent 8fcddbc commit 2575d98

File tree

8 files changed

+126
-1
lines changed

8 files changed

+126
-1
lines changed

src/snagrecover/50-snagboot.rules

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,14 @@ SUBSYSTEM=="usb", ATTRS{idVendor}=="0451", ATTRS{idProduct}=="d022", MODE="0660"
7676

7777
#Xilinx rules
7878
SUBSYSTEM=="usb", ATTRS{idVendor}=="03fd", ATTRS{idProduct}=="0050", MODE="0660", TAG+="uaccess"
79+
80+
#Rockchip systems
81+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="301a", MODE="0660", TAG+="uaccess"
82+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="310c", MODE="0660", TAG+="uaccess"
83+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="320b", MODE="0660", TAG+="uaccess"
84+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="320a", MODE="0660", TAG+="uaccess"
85+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="320c", MODE="0660", TAG+="uaccess"
86+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="330a", MODE="0660", TAG+="uaccess"
87+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="330c", MODE="0660", TAG+="uaccess"
88+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="350a", MODE="0660", TAG+="uaccess"
89+
SUBSYSTEM=="usb", ATTRS{idVendor}=="2207", ATTRS{idProduct}=="350b", MODE="0660", TAG+="uaccess"

src/snagrecover/config.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@
5252
"imx8mm": "1fc9:0134",
5353
"imx8mq": "1fc9:012b",
5454
"imx53" : "15a2:004e",
55+
},
56+
"rockchip": {
57+
"rk3036": "2207:310a",
58+
"rk3128": "2207:310c",
59+
"rk3229": "2207:320b",
60+
"rk3288": "2207:320a",
61+
"rk3328": "2207:320c",
62+
"rk3368": "2207:330a",
63+
"rk3399": "2207:330c",
64+
"rk3566": "2207:350a",
65+
"rk3588": "2207:350b"
5566
}
5667
}
5768

@@ -80,6 +91,8 @@ def init_config(args: list):
8091
if args.usb_path is None:
8192
if soc_family == "imx":
8293
usb_ids = default_usb_ids["imx"][soc_model]
94+
elif soc_family == "rockchip":
95+
usb_ids = default_usb_ids["rockchip"][soc_model]
8396
else:
8497
usb_ids = default_usb_ids[soc_family]
8598

src/snagrecover/firmware/firmware.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ def run_firmware(port, fw_name: str, subfw_name: str = ""):
146146
elif soc_family == "zynqmp":
147147
from snagrecover.firmware.zynqmp_fw import zynqmp_run
148148
zynqmp_run(port, fw_name, fw_blob, subfw_name)
149+
elif soc_family == "rockchip":
150+
from snagrecover.firmware.rk_fw import rockchip_run
151+
rockchip_run(port, fw_name, fw_blob)
149152
else:
150153
raise Exception(f"Unsupported SoC family {soc_family}")
151154
logger.info(f"Done installing firmware {fw_name}")
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import usb
2+
import logging
3+
logger = logging.getLogger("snagrecover")
4+
from snagrecover.firmware.firmware import run_firmware
5+
from snagrecover.utils import get_usb
6+
from snagrecover.config import recovery_config
7+
from snagrecover.protocols import dfu
8+
import sys
9+
import time
10+
11+
def main():
12+
usb_addr = recovery_config["usb_path"]
13+
dev = get_usb(usb_addr)
14+
15+
logger.debug(f"Rockchip usb dev {usb_addr}")
16+
17+
# Blob made with boot_merger
18+
if "xpl" in recovery_config["firmware"]:
19+
try:
20+
run_firmware(dev, "xpl")
21+
usb.util.dispose_resources(dev)
22+
except Exception as e:
23+
logger.error(f"Failed to run firmware: {e}")
24+
sys.exit(-1)
25+
# u-boot binaries.
26+
elif "code471" in recovery_config["firmware"] and "code472" in recovery_config["firmware"]:
27+
try:
28+
run_firmware(dev, "code471")
29+
usb.util.dispose_resources(dev)
30+
except Exception as e:
31+
logger.error(f"Failed to run code471 firmware: {e}")
32+
sys.exit(-1)
33+
if "delay" in recovery_config["firmware"]["code471"]:
34+
delay = recovery_config["firmware"]["code471"]["delay"]
35+
logger.info(f"Sleeping {delay}ms")
36+
time.sleep(delay / 1000)
37+
try:
38+
run_firmware(dev, "code472")
39+
usb.util.dispose_resources(dev)
40+
except Exception as e:
41+
logger.error(f"Failed to run code472 firmware: {e}")
42+
sys.exit(-1)
43+
if "delay" in recovery_config["firmware"]["code472"]:
44+
delay = recovery_config["firmware"]["code472"]["delay"]
45+
logger.info(f"Sleeping {delay}ms")
46+
time.sleep(delay / 1000)
47+
else:
48+
logger.error("Missing code471/code472 binary configuration")
49+
sys.exit(-1)
50+
51+
52+
if "u-boot-fit" in recovery_config["firmware"]:
53+
dev = get_usb(usb_addr)
54+
id = dfu.search_partid(dev, "u-boot.itb")
55+
if id is None:
56+
logger.error("Missing u-boot.itb DFU partition")
57+
dfu_cmd = dfu.DFU(dev, stm32=False)
58+
dfu_cmd.get_status()
59+
with open(recovery_config["firmware"]["u-boot-fit"]["path"], "rb") as fd:
60+
blob = fd.read()
61+
try:
62+
dfu_cmd.download_and_run(blob, id, 0, len(blob))
63+
dfu_cmd.get_status()
64+
dfu_cmd.detach(id)
65+
except Exception as e:
66+
logger.error(f"Failed to load u-boot.itb: {e}")
67+
sys.exit(-1)

src/snagrecover/supported_socs.yaml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ tested:
5757
family: stm32mp
5858
zynqmp:
5959
family: zynqmp
60+
rk3399:
61+
family: rockchip
6062
untested:
6163
a10:
6264
family: sunxi
@@ -144,4 +146,19 @@ untested:
144146
family: sunxi
145147
v853:
146148
family: sunxi
147-
149+
rk3036:
150+
family: rockchip
151+
rk3128:
152+
family: rockchip
153+
rk3229:
154+
family: rockchip
155+
rk3288:
156+
family: rockchip
157+
rk3328:
158+
family: rockchip
159+
rk3368:
160+
family: rockchip
161+
rk3566:
162+
family: rockchip
163+
rk3588:
164+
family: rockchip
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
xpl:
2+
# u-boot TPL+SPL in SPL DFU mode
3+
path: rk3399_uboot.bin
4+
u-boot-fit:
5+
# proper u-boot
6+
path: u-boot.itb
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
code471:
2+
path: u-boot-rockchip-usb471.bin
3+
delay: 1
4+
code472:
5+
path: u-boot-rockchip-usb472.bin

src/snagrecover/utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ def get_recovery(soc_family: str):
191191
elif soc_family == "zynqmp":
192192
from snagrecover.recoveries.zynqmp import main as zynqmp_recovery
193193
return zynqmp_recovery
194+
elif soc_family == "rockchip":
195+
from snagrecover.recoveries.rockchip import main as rockchip_recovery
196+
return rockchip_recovery
194197
else:
195198
cli_error(f"unsupported board family {soc_family}")
196199

0 commit comments

Comments
 (0)