-
Notifications
You must be signed in to change notification settings - Fork 1
/
em100.h
206 lines (174 loc) · 5.61 KB
/
em100.h
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/*
* Copyright 2015 Google Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef __EM100_H__
#define __EM100_H__
#include <libusb.h>
#define __unused __attribute__((unused))
#define __packed __attribute__((packed))
struct em100 {
libusb_device_handle *dev;
libusb_context *ctx;
uint16_t mcu;
uint16_t fpga;
uint32_t serialno;
uint8_t hwversion;
};
#define NUM_INIT_ENTRIES 212
#define BYTES_PER_INIT_ENTRY 4
typedef struct {
const char *vendor;
const char *name;
unsigned int size;
uint8_t init[NUM_INIT_ENTRIES][BYTES_PER_INIT_ENTRY];
int init_len;
} chipdesc;
/* Hardware versions */
#define HWVERSION_EM100PRO_EARLY 0xff
#define HWVERSION_EM100PRO 0x04
#define HWVERSION_EM100PRO_G2 0x06
#define BULK_SEND_TIMEOUT 5000 /* sentinel value */
/* usb.c */
int send_cmd(libusb_device_handle *dev, void *data);
int get_response(libusb_device_handle *dev, void *data, int length);
/* firmware.c */
int firmware_dump(struct em100 *em100, const char *filename,
int firmware_is_dpfw);
int firmware_update(struct em100 *em100, const char *filename, int verify);
/* fpga.c */
int reconfig_fpga(struct em100 *em100);
int check_fpga_status(struct em100 *em100);
int read_fpga_register(struct em100 *em100, int reg, uint16_t *val);
int write_fpga_register(struct em100 *em100, int reg, int val);
int fpga_set_voltage(struct em100 *em100, int voltage_code);
int fpga_get_voltage(struct em100 *em100, int *voltage_codep);
int fpga_reconfigure(struct em100 *em100);
/* Guessed register names */
#define FPGA_REG_DEVID 0x40
#define FPGA_REG_VENDID 0x42
/* hexdump.c */
void hexdump(const void *memory, size_t length);
/* sdram.c */
int read_sdram(struct em100 *em100, void *data, int address, int length);
int write_sdram(struct em100 *em100, unsigned char *data, int address,
int length);
/* spi.c */
uint32_t get_spi_flash_id(struct em100 *em100);
int erase_spi_flash(struct em100 *em100);
int poll_spi_flash_status(struct em100 *em100);
int read_spi_flash_page(struct em100 *em100, int address, unsigned char *blk);
int write_spi_flash_page(struct em100 *em100, int address, unsigned char *data);
int unlock_spi_flash(struct em100 *em100);
int erase_spi_flash_sector(struct em100 *em100, unsigned int sector);
int read_ht_register(struct em100 *em100, int reg, uint8_t *val);
int write_ht_register(struct em100 *em100, int reg, uint8_t val);
int write_dfifo(struct em100 *em100, size_t length, unsigned int timeout,
unsigned char *blk);
int read_ufifo(struct em100 *em100, size_t length, unsigned int timeout,
unsigned char *blk);
/* system.c */
typedef enum {
out_trigger_vcc = 0,
out_reset_vcc = 1,
out_ref_plus = 2,
out_ref_minus = 3,
out_buffer_vcc = 4
} set_voltage_channel_t;
typedef enum {
in_v1_2 = 0,
in_e_vcc = 1,
in_ref_plus = 2,
in_ref_minus = 3,
in_buffer_vcc = 4,
in_trigger_vcc = 5,
in_reset_vcc = 6,
in_v3_3 = 7,
in_buffer_v3_3 = 8,
in_v5 = 9
} get_voltage_channel_t;
typedef enum {
both_off = 0,
green_on = 1,
red_on = 2,
both_on = 3
} led_state_t;
int get_version(struct em100 *em100);
int set_voltage(struct em100 *em100, set_voltage_channel_t channel, int mV);
int get_voltage(struct em100 *em100, get_voltage_channel_t channel);
int set_led(struct em100 *em100, led_state_t led_state);
/* trace.c */
#define EM100_SPECIFIC_CMD 0x11
#define EM100_MSG_SIGNATURE 0x47364440
typedef enum {
status_reg = 0,
dfifo_bytes_reg = 1,
ufifo_bytes_reg = 2,
em100_id_reg = 3,
ufifo_data_fmt_reg = 4,
timestamp_reg = 5
} ht_register_t;
/* Status register bits */
#define UFIFO_OVERFLOW (1 << 0)
#define BIT8_UFIFO_BYTES (1 << 3)
#define START_SPI_EMULATION (1 << 4)
#define PAUSE_SPI_EMULATION (0 << 4)
#define UFIFO_EMPTY (1 << 5)
#define DFIFO_EMPTY (1 << 6)
struct em100_msg_header{
uint32_t signature;
uint8_t data_type;
uint8_t data_length;
} __attribute__ ((packed));
struct em100_msg{
struct em100_msg_header header;
uint8_t data[255];
} __attribute__ ((packed));
typedef enum {
ht_checkpoint_1byte = 0x01,
ht_checkpoint_2bytes = 0x02,
ht_checkpoint_4bytes = 0x03,
ht_hexadecimal_data = 0x04,
ht_ascii_data = 0x05,
ht_timestamp_data = 0x06,
ht_lookup_table = 0x07
} ht_msg_type_t;
int reset_spi_trace(struct em100 *em100);
int read_spi_trace(struct em100 *em100, int display_terminal,
unsigned long addr_offset);
int read_spi_terminal(struct em100 *em100, int print_counter);
int init_spi_terminal(struct em100 *em100);
/* Archive handling */
typedef struct {
unsigned char *address;
size_t length;
int alloc;
} TFILE;
TFILE *tar_find(TFILE *tfile, const char *name, int casesensitive);
TFILE *tar_load_compressed(char *filename);
int tar_for_each(TFILE *tfile, int (*run)(char *, TFILE *, void *, int), void *data);
int tar_close(TFILE *tfile);
int tar_ls(TFILE *tfile);
int test_tar(void);
/* Network */
void download(const char *name, const char *id);
int update_all_files(void);
/* Misc. */
#define MB * 1024 * 1024
#define FILENAME_BUFFER_SIZE 1024
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
char *get_em100_file(const char *name);
extern int debug;
/* Chips */
int parse_dcfg(chipdesc *chip, TFILE *dcfg);
/* Images */
int autocorrect_image(struct em100 *em100, char *image, size_t size);
#endif