aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/flashing/eva_ramboot.py
blob: b182f09d21c7232b5cc66d9fdefa489c523bc60f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python3

import argparse

from ftplib import FTP
from sys import argv
from os import stat

parser = argparse.ArgumentParser(description='Tool to boot AVM EVA ramdisk images.')
parser.add_argument('ip', type=str, help='IP-address to transfer the image to')
parser.add_argument('image', type=str, help='Location of the ramdisk image')
parser.add_argument('--offset', type=lambda x: int(x,0), help='Offset to load the image to in hex format with leading 0x. Only needed for non-lantiq devices.')
args = parser.parse_args()

size = stat(args.image).st_size
# arbitrary size limit, to prevent the address calculations from overflows etc.
assert size < 0x2000000

if args.offset:
	addr = size
	haddr = args.offset
else:
	# We need to align the address.
	# A page boundary seems to be sufficient on 7362sl and 7412
	addr = ((0x8000000 - size) & ~0xfff)
	haddr = 0x80000000 + addr

img = open(args.image, "rb")
ftp = FTP(args.ip, 'adam2', 'adam2')

def adam(cmd):
	print("> %s"%(cmd))
	resp = ftp.sendcmd(cmd)
	print("< %s"%(resp))
	assert resp[0:3] == "200"

ftp.set_pasv(True)
# The following parameters allow booting the avm recovery system with this
# script.
adam('SETENV memsize 0x%08x'%(addr))
adam('SETENV kernel_args_tmp mtdram1=0x%08x,0x88000000'%(haddr))
adam('MEDIA SDRAM')
ftp.storbinary('STOR 0x%08x 0x88000000'%(haddr), img)
img.close()
ftp.close()
) || (ptr = (char *) mmap(0, search_space + CMDLINE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)) == (void *) (-1)) { fprintf(stderr, "Could not open kernel image"); goto err2; } for (p = ptr; p < (ptr + search_space); p += 4) { if (memcmp(p, "CMDLINE:", 8) == 0) { found = 1; p += 8; break; } } if (!found) { fprintf(stderr, "Command line marker not found!\n"); goto err3; } memset(p, 0, CMDLINE_MAX - 8); strcpy(p, argv[2]); msync(p, CMDLINE_MAX, MS_SYNC|MS_INVALIDATE); ret = 0; err3: munmap((void *) ptr, len); err2: if (fd > 0) close(fd); err1: return ret; }