summaryrefslogtreecommitdiffstats
path: root/libdpf/fwload.c
blob: 2b9876291cd752c315186a80fe8161c1598416fa (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/** DPF firmware loader
 *
 * 12/2010 <hackfin@section5.ch>
 *
 * Based on the FX2 ihx loader
 *
 */

#include "dpf.h"
#include <stdio.h>

////////////////////////////////////////////////////////////////////////////

// Demo stuff:

void memory_dump(unsigned char *buf, unsigned int n)
{
	int i = 0;
	int c = 0;

	while (i < n) {
		printf("%02x ", buf[i]);
		c++;
		if (c == 16) { c = 0; printf("\n"); }
			i++;
	}
	if (c)
		printf("\n");
}

////////////////////////////////////////////////////////////////////////////


#if EXPERIMENTAL

int xmain(int argc, char **argv)
{
	int ret;
	int i;
	struct banktable *bt;

	// flash offset, offset after jump table
	unsigned int offset = 0x80000 + 0x200;


	static unsigned char buf[0x10000];
	unsigned int len = sizeof(buf);
	ret = load_ihx(argv[1], buf, &len, 0x127c, g_banktab);
	if (ret < 0) {
		fprintf(stderr, "Failed to load HEX file\n");
		return ret;
	} else {
		printf("Read %d banks\n", ret);
		for (i = 0; i < ret; i++) {
			bt = &g_banktab[i];
			printf("	{ XADDR(0x%04x), XADDR(0x%04x), FOFFS(0x%06x) },\n",
				bt->reloc, bt->reloc + bt->len, offset + bt->offset);

		}
	}
	return 0;
}

#endif

int main(int argc, char **argv)
{
	int ret;
	DPFHANDLE h;

	int i = 2;

	if (argc < 2 || argc > 3) {
		fprintf(stderr, "Usage:\n"
				"%s <generic scsi dev> <.ihx file>\n"
		        "or in USB mode:\n"
		        "%s <.ihx file>\n",
		argv[0], argv[0]);
		return -1;
	}

	if (argc == 2) {
		ret = dpf_open(NULL, &h);
		i--;
	} else
	if (argc == 3) {
		ret = dpf_open(argv[1], &h);
	}

	if (ret < 0) {
		perror("opening DPF device:");
		return ret;
	}

// 	This patches a module to init the relocated jump table on a certain
// 	menu action:
// 	ret = patch_sector(h, 0x1330, 0x4af7a, "hack2.ihx");


// 	patch_sector(h,          0x0,    0x100000, "jumptbl.ihx");

	if (0) {
		patch_sector(h,          0x0,    0x100000, "jumptbl.ihx");
		ret = patch_sector(h,       0x1330,    0x110000, "hack.ihx");
		ret = patch_sector(h, 0x132a,    0x120000, "main.ihx");
		if (ret < 0) printf("Failed.\n");
	} else {
	 // demo0(h);

	}
	ret = load_hexfile(h, argv[i]);
	code_go(h, 0x18a0);
	if (ret < 0) printf("Failed.\n");

	// unsigned char buf[256];
	// ret = read_mem(h, buf, 0x18a0, 64);
	// memory_dump(buf, 64);

	dpf_close(h);
	return ret;
}