1 | #include <sys/types.h> |
2 | #include <sys/socket.h> |
3 | #include <netinet/in.h> |
4 | #include <arpa/inet.h> |
5 | #include <string.h> |
6 | #include <unistd.h> |
7 | #include <stdlib.h> |
8 | #include <stdio.h> |
9 | |
10 | #include "mem.h" |
11 | #include "cmd.h" |
12 | #include "ingenic_usb.h" |
13 | #include "ingenic_cfg.h" |
14 | |
15 | #define PORT 1338 |
16 | |
17 | #define TYPE_READ8 0 |
18 | #define TYPE_READ16 1 |
19 | #define TYPE_READ32 2 |
20 | #define TYPE_WRITE8 3 |
21 | #define TYPE_WRITE16 4 |
22 | #define TYPE_WRITE32 5 |
23 | |
24 | struct request { |
25 | uint32_t addr; |
26 | uint32_t value; |
27 | uint8_t type; |
28 | }; |
29 | |
30 | struct response { |
31 | uint32_t value; |
32 | }; |
33 | |
34 | #define CONFIG_FILE_PATH "/etc/xburst-tools/usbboot.cfg" |
35 | |
36 | struct ingenic_dev ingenic_dev; |
37 | |
38 | int main(int argc, char *argv[]) |
39 | { |
40 | int s, t; |
41 | unsigned int sinlen; |
42 | struct sockaddr_in sin; |
43 | struct request request; |
44 | struct response response; |
45 | char *cfgpath = CONFIG_FILE_PATH; |
46 | |
47 | if (usb_ingenic_init(&ingenic_dev)) |
48 | return EXIT_FAILURE; |
49 | |
50 | if (parse_configure(&ingenic_dev.config, cfgpath)) |
51 | return EXIT_FAILURE; |
52 | |
53 | boot(&ingenic_dev, STAGE1_FILE_PATH, STAGE2_FILE_PATH); |
54 | |
55 | if ( (s = socket(AF_INET, SOCK_STREAM, 0 ) ) < 0) { |
56 | return -1; |
57 | } |
58 | |
59 | sin.sin_family = AF_INET; /*set protocol family to Internet */ |
60 | sin.sin_port = htons(PORT); /* set port no. */ |
61 | sin.sin_addr.s_addr = INADDR_ANY; /* set IP addr to any interface */ |
62 | |
63 | if (bind(s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ){ |
64 | perror("bind"); return -1; /* bind error */ |
65 | } |
66 | |
67 | /* server indicates it's ready, max. listen queue is 5 */ |
68 | if (listen(s, 5)) { |
69 | return -1; |
70 | } |
71 | |
72 | sinlen = sizeof(sin); |
73 | if ( (t = accept(s, (struct sockaddr *) &sin, &sinlen) ) < 0 ){ |
74 | perror("accept "); /* accpet error */ |
75 | return -1; |
76 | } |
77 | |
78 | while (1) { |
79 | |
80 | if (recv(t, (char*)&request, sizeof(request), 0) < 0) { |
81 | perror("recv"); |
82 | return -1; |
83 | } |
84 | |
85 | /* printf("Got request %x %x %x\n", request.type, request.addr, |
86 | request.value);*/ |
87 | |
88 | switch (request.type) { |
89 | case TYPE_READ8: |
90 | response.value = mem_read8(&ingenic_dev, request.addr); |
91 | break; |
92 | case TYPE_READ16: |
93 | response.value = mem_read16(&ingenic_dev, request.addr); |
94 | break; |
95 | case TYPE_READ32: |
96 | response.value = mem_read32(&ingenic_dev, request.addr); |
97 | break; |
98 | case TYPE_WRITE8: |
99 | mem_write8(&ingenic_dev, request.addr, request.value); |
100 | break; |
101 | case TYPE_WRITE16: |
102 | mem_write16(&ingenic_dev, request.addr, request.value); |
103 | break; |
104 | case TYPE_WRITE32: |
105 | mem_write32(&ingenic_dev, request.addr, request.value); |
106 | break; |
107 | } |
108 | /* printf("Got response %x\n", response.value);*/ |
109 | |
110 | if (send(t, (char*)&response, sizeof(response),0 ) < 0 ) { |
111 | perror("send"); |
112 | return -1; |
113 | } |
114 | } |
115 | |
116 | close(t); |
117 | close(s); |
118 | |
119 | return 0; |
120 | } |
121 | |