xref: /openbmc/u-boot/tools/gdb/gdbsend.c (revision 1021af4d)
1 /*
2  * (C) Copyright 2000
3  * Murray Jensen <Murray.Jensen@csiro.au>
4  *
5  * SPDX-License-Identifier:	GPL-2.0+
6  */
7 
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <fcntl.h>
12 #include <unistd.h>
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include "serial.h"
16 #include "error.h"
17 #include "remote.h"
18 
19 char *serialdev = "/dev/term/b";
20 speed_t speed = B230400;
21 int verbose = 0, docont = 0;
22 unsigned long addr = 0x10000UL;
23 
24 int
25 main(int ac, char **av)
26 {
27     int c, sfd, ifd;
28     char *ifn, *image;
29     struct stat ist;
30 
31     if ((pname = strrchr(av[0], '/')) == NULL)
32 	pname = av[0];
33     else
34 	pname++;
35 
36     while ((c = getopt(ac, av, "a:b:cp:v")) != EOF)
37 	switch (c) {
38 
39 	case 'a': {
40 	    char *ep;
41 
42 	    addr = strtol(optarg, &ep, 0);
43 	    if (ep == optarg || *ep != '\0')
44 		Error("can't decode address specified in -a option");
45 	    break;
46 	}
47 
48 	case 'b':
49 	    if ((speed = cvtspeed(optarg)) == B0)
50 		Error("can't decode baud rate specified in -b option");
51 	    break;
52 
53 	case 'c':
54 	    docont = 1;
55 	    break;
56 
57 	case 'p':
58 	    serialdev = optarg;
59 	    break;
60 
61 	case 'v':
62 	    verbose = 1;
63 	    break;
64 
65 	default:
66 	usage:
67 	    fprintf(stderr,
68 		"Usage: %s [-a addr] [-b bps] [-c] [-p dev] [-v] imagefile\n",
69 		pname);
70 	    exit(1);
71 	}
72 
73     if (optind != ac - 1)
74 	goto usage;
75     ifn = av[optind++];
76 
77     if (verbose)
78 	fprintf(stderr, "Opening file and reading image...\n");
79 
80     if ((ifd = open(ifn, O_RDONLY)) < 0)
81 	Perror("can't open kernel image file '%s'", ifn);
82 
83     if (fstat(ifd, &ist) < 0)
84 	Perror("fstat '%s' failed", ifn);
85 
86     if ((image = (char *)malloc(ist.st_size)) == NULL)
87 	Perror("can't allocate %ld bytes for image", ist.st_size);
88 
89     if ((c = read(ifd, image, ist.st_size)) < 0)
90 	Perror("read of %d bytes from '%s' failed", ist.st_size, ifn);
91 
92     if (c != ist.st_size)
93 	Error("read of %ld bytes from '%s' failed (%d)", ist.st_size, ifn, c);
94 
95     if (close(ifd) < 0)
96 	Perror("close of '%s' failed", ifn);
97 
98     if (verbose)
99 	fprintf(stderr, "Opening serial port and sending image...\n");
100 
101     if ((sfd = serialopen(serialdev, speed)) < 0)
102 	Perror("open of serial device '%s' failed", serialdev);
103 
104     remote_desc = sfd;
105     remote_reset();
106     remote_write_bytes(addr, image, ist.st_size);
107 
108     if (docont) {
109 	if (verbose)
110 	    fprintf(stderr, "[continue]");
111 	remote_continue();
112     }
113 
114     if (serialclose(sfd) < 0)
115 	Perror("close of serial device '%s' failed", serialdev);
116 
117     if (verbose)
118 	fprintf(stderr, "Done.\n");
119 
120     return (0);
121 }
122