1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * altera-jtag.h |
4 | * |
5 | * altera FPGA driver |
6 | * |
7 | * Copyright (C) Altera Corporation 1998-2001 |
8 | * Copyright (C) 2010 NetUP Inc. |
9 | * Copyright (C) 2010 Igor M. Liplianin <liplianin@netup.ru> |
10 | */ |
11 | |
12 | #ifndef ALTERA_JTAG_H |
13 | #define ALTERA_JTAG_H |
14 | |
15 | /* Function Prototypes */ |
16 | enum altera_jtag_state { |
17 | ILLEGAL_JTAG_STATE = -1, |
18 | RESET = 0, |
19 | IDLE = 1, |
20 | DRSELECT = 2, |
21 | DRCAPTURE = 3, |
22 | DRSHIFT = 4, |
23 | DREXIT1 = 5, |
24 | DRPAUSE = 6, |
25 | DREXIT2 = 7, |
26 | DRUPDATE = 8, |
27 | IRSELECT = 9, |
28 | IRCAPTURE = 10, |
29 | IRSHIFT = 11, |
30 | IREXIT1 = 12, |
31 | IRPAUSE = 13, |
32 | IREXIT2 = 14, |
33 | IRUPDATE = 15 |
34 | |
35 | }; |
36 | |
37 | struct altera_jtag { |
38 | /* Global variable to store the current JTAG state */ |
39 | enum altera_jtag_state jtag_state; |
40 | |
41 | /* Store current stop-state for DR and IR scan commands */ |
42 | enum altera_jtag_state drstop_state; |
43 | enum altera_jtag_state irstop_state; |
44 | |
45 | /* Store current padding values */ |
46 | u32 dr_pre; |
47 | u32 dr_post; |
48 | u32 ir_pre; |
49 | u32 ir_post; |
50 | u32 dr_length; |
51 | u32 ir_length; |
52 | u8 *dr_pre_data; |
53 | u8 *dr_post_data; |
54 | u8 *ir_pre_data; |
55 | u8 *ir_post_data; |
56 | u8 *dr_buffer; |
57 | u8 *ir_buffer; |
58 | }; |
59 | |
60 | #define ALTERA_STACK_SIZE 128 |
61 | #define ALTERA_MESSAGE_LENGTH 1024 |
62 | |
63 | struct altera_state { |
64 | struct altera_config *config; |
65 | struct altera_jtag js; |
66 | char msg_buff[ALTERA_MESSAGE_LENGTH + 1]; |
67 | long stack[ALTERA_STACK_SIZE]; |
68 | }; |
69 | |
70 | int altera_jinit(struct altera_state *astate); |
71 | int altera_set_drstop(struct altera_jtag *js, enum altera_jtag_state state); |
72 | int altera_set_irstop(struct altera_jtag *js, enum altera_jtag_state state); |
73 | int altera_set_dr_pre(struct altera_jtag *js, u32 count, u32 start_index, |
74 | u8 *preamble_data); |
75 | int altera_set_ir_pre(struct altera_jtag *js, u32 count, u32 start_index, |
76 | u8 *preamble_data); |
77 | int altera_set_dr_post(struct altera_jtag *js, u32 count, u32 start_index, |
78 | u8 *postamble_data); |
79 | int altera_set_ir_post(struct altera_jtag *js, u32 count, u32 start_index, |
80 | u8 *postamble_data); |
81 | int altera_goto_jstate(struct altera_state *astate, |
82 | enum altera_jtag_state state); |
83 | int altera_wait_cycles(struct altera_state *astate, s32 cycles, |
84 | enum altera_jtag_state wait_state); |
85 | int altera_wait_msecs(struct altera_state *astate, s32 microseconds, |
86 | enum altera_jtag_state wait_state); |
87 | int altera_irscan(struct altera_state *astate, u32 count, |
88 | u8 *tdi_data, u32 start_index); |
89 | int altera_swap_ir(struct altera_state *astate, |
90 | u32 count, u8 *in_data, |
91 | u32 in_index, u8 *out_data, |
92 | u32 out_index); |
93 | int altera_drscan(struct altera_state *astate, u32 count, |
94 | u8 *tdi_data, u32 start_index); |
95 | int altera_swap_dr(struct altera_state *astate, u32 count, |
96 | u8 *in_data, u32 in_index, |
97 | u8 *out_data, u32 out_index); |
98 | void altera_free_buffers(struct altera_state *astate); |
99 | #endif /* ALTERA_JTAG_H */ |
100 | |