xref: /nrf52832-nimble/rt-thread/components/utilities/zmodem/zdef.h (revision 104654410c56c573564690304ae786df310c91fc)
1 #ifndef __ZDEF_H__
2 #define __ZDEF_H__
3 
4 #include <rtthread.h>
5 #include "crc.h"
6 #define ZPAD      '*'	/* 052 padding character begins frames */
7 #define ZDLE      030	/* ctrl-X ZMODEM escape - `ala BISYNC DLE */
8 #define ZDLEE     (ZDLE^0100)	/* escaped ZDLE as transmitted */
9 #define ZBIN      'A'	/* binary frame indicator (CRC-16) */
10 #define ZHEX      'B'	/* hex frame indicator */
11 #define ZBIN32    'C'	/* binary frame with 32 bit FCS */
12 #define ZBINR32   'D'	/* RLE packed Binary frame with 32 bit FCS */
13 #define ZVBIN     'a'	/* binary frame indicator (CRC-16) */
14 #define ZVHEX     'b'	/* hex frame indicator */
15 #define ZVBIN32   'c'	/* binary frame with 32 bit FCS */
16 #define ZVBINR32  'd'	/* RLE packed Binary frame with 32 bit FCS */
17 #define ZRESC	  0176	/* RLE flag/escape character */
18 
19 
20 /* Frame types */
21 #define ZRQINIT	  0	    /* request receive init */
22 #define ZRINIT    1     /* receive init */
23 #define ZSINIT    2	    /* send init sequence (optional) */
24 #define ZACK      3	    /* ACK to above */
25 #define ZFILE     4	    /* file name from sender */
26 #define ZSKIP     5	    /* ro sender: skip this file */
27 #define ZNAK      6	    /* last packet was garbled */
28 #define ZABORT    7	    /* abort batch transfers */
29 #define ZFIN      8	    /* finish session */
30 #define ZRPOS     9	    /* resume data trans at this position */
31 #define ZDATA     10    /* data packet(s) follow */
32 #define ZEOF      11    /* end of file */
33 #define ZFERR     12    /* fatal Read or Write error Detected */
34 #define ZCRC      13    /* request for file CRC and response */
35 #define ZCHALLENGE 14   /* receiver's Challenge */
36 #define ZCOMPL    15	/* request is complete */
37 #define ZCAN      16	/* other end canned session with CAN*5 */
38 #define ZFREECNT  17	/* request for free bytes on filesystem */
39 #define ZCOMMAND  18	/* command from sending program */
40 
41 /* ZDLE sequfences */
42 #define ZCRCE     'h'	/* CRC next, frame ends, header packet follows */
43 #define ZCRCG     'i'	/* CRC next, frame continues nonstop */
44 #define ZCRCQ     'j'	/* CRC next, frame continues, ZACK expected */
45 #define ZCRCW     'k'	/* CRC next, ZACK expected, end of frame */
46 #define ZRUB0     'l'	/* translate to rubout 0177 */
47 #define ZRUB1     'm'	/* translate to rubout 0377 */
48 
49 /* zdlread return values (internal) */
50 /* -1 is general error, -2 is timeout */
51 #define GOTOR     0400
52 #define GOTCRCE   (ZCRCE|GOTOR)	/* ZDLE-ZCRCE received */
53 #define GOTCRCG   (ZCRCG|GOTOR)	/* ZDLE-ZCRCG received */
54 #define GOTCRCQ   (ZCRCQ|GOTOR)	/* ZDLE-ZCRCQ received */
55 #define GOTCRCW   (ZCRCW|GOTOR)	/* ZDLE-ZCRCW received */
56 #define GOTCAN	  (GOTOR|030)	/* CAN*5 seen */
57 
58 /* Byte positions within header array */
59 #define ZF0	      3	    /* first flags byte */
60 #define ZF1	      2
61 #define ZF2	      1
62 #define ZF3	      0
63 #define ZP0	      0	    /* low order 8 bits of position */
64 #define ZP1	      1
65 #define ZP2	      2
66 #define ZP3	      3	    /* high order 8 bits of file position */
67 
68 /* parameters for ZRINIT header */
69 #define ZRPXWN	  8	    /* 9th byte in header contains window size/256 */
70 #define ZRPXQQ	  9	    /* 10th to 14th bytes contain quote mask */
71 /* bit Masks for ZRINIT flags byte ZF0 */
72 #define CANFDX	  0x01	/* rx can send and receive true FDX */
73 #define CANOVIO	  0x02	/* rx can receive data during disk I/O */
74 #define CANBRK	  0x04	/* rx can send a break signal */
75 #define CANRLE	  0x10	/* receiver can decode RLE */
76 #define CANLZW	  0x20	/* receiver can uncompress */
77 #define CANFC32	  0x28	/* receiver can use 32 bit Frame Check */
78 #define ESCCTL    0x64	/* receiver expects ctl chars to be escaped */
79 #define ESC8      0xc8	/* receiver expects 8th bit to be escaped */
80 
81 /* bit Masks for ZRINIT flags byte ZF1 */
82 #define CANVHDR	  01	/* variable headers OK */
83 #define ZRRQWN	  8	    /* receiver specified window size in ZRPXWN */
84 #define ZRRQQQ	  16	/* additional control chars to quote in ZRPXQQ	*/
85 #define ZRQNVH	  (ZRRQWN|ZRRQQQ)	/* variable len hdr reqd to access info */
86 
87 /* Parameters for ZSINIT frame */
88 #define ZATTNLEN  32	/* max length of attention string */
89 #define ALTCOFF   ZF1	/* offset to alternate canit string, 0 if not used */
90 
91 /* Parameters for ZFILE frame */
92 /* Conversion options one of these in ZF0 */
93 #define ZCBIN	  1	   /* binary transfer - inhibit conversion */
94 #define ZCNL	  2	   /* convert NL to local end of line convention */
95 #define ZCRESUM	  3	   /* resume interrupted file transfer */
96 /* management include options, one of these ored in ZF1 */
97 #define ZMSKNOLOC 0200 /* skip file if not present at rx */
98 /* management options, one of these ored in ZF1 */
99 #define ZMMASK	  037  /* mask for the choices below */
100 #define ZMNEWL	  1	   /* transfer if source newer or longer */
101 #define ZMCRC	  2	   /* transfer if different file CRC or length */
102 #define ZMAPND	  3	   /* append contents to existing file (if any) */
103 #define ZMCLOB	  4	   /* replace existing file */
104 #define ZMNEW	  5	   /* transfer if source newer */
105 /* number 5 is alive ... */
106 #define ZMDIFF	  6	   /* transfer if dates or lengths different */
107 #define ZMPROT	  7	   /* protect destination file */
108 #define ZMCHNG	  8	   /* change filename if destination exists */
109 /* transport options, one of these in ZF2 */
110 #define ZTLZW	  1	   /* lempel-Ziv compression */
111 #define ZTRLE	  3	   /* run Length encoding */
112 /* extended options for ZF3, bit encoded */
113 #define ZXSPARS	  64   /* encoding for sparse file operations */
114 #define ZCANVHDR  01   /* variable headers OK */
115 /* receiver window size override */
116 #define ZRWOVR    4	   /* byte position for receive window override/256 */
117 
118 /* parameters for ZCOMMAND frame ZF0 (otherwise 0) */
119 #define ZCACK1	  1	   /* acknowledge, then do command */
120 extern char Attn[ZATTNLEN+1];	/* Attention string rx sends to tx on err */
121 
122 /* globals used by ZMODEM functions */
123 extern rt_uint8_t  Rxframeind;     /* ZBIN ZBIN32, or ZHEX type of frame */
124 extern char header_type;	       /* type of header received */
125 extern rt_uint8_t  rx_header[4];   /* received header */
126 extern rt_uint8_t  tx_header[4];   /* transmitted header */
127 extern rt_uint8_t  Txfcs32;		   /* TRUE means send binary frames with 32 bit FCS */
128 extern rt_uint16_t Rxcount;	       /* count of data bytes received */
129 extern rt_uint16_t Rxtimeout;      /* tenths of seconds to wait for something */
130 extern rt_uint32_t Rxpos;	       /* received file position */
131 extern rt_uint32_t Txpos;	       /* transmitted file position */
132 extern rt_uint8_t  Txfcs32;	       /* TURE means send binary frames with 32 bit FCS */
133 
134 /* ward Christensen / CP/M parameters - Don't change these! */
135 #define ENQ     005
136 #define CAN     ('X'&037)
137 #define XOFF    ('s'&037)
138 #define XON     ('q'&037)
139 #define SOH     1
140 #define STX     2
141 #define ETX     3
142 #define SYN     026
143 #define ESC     033
144 #define WANTG   0107	/* send G not NAK to get nonstop batch xmsn */
145 #define EOT     4
146 #define ACK     6
147 #define NAK     025
148 #define CPMEOF  032
149 #define WANTCRC 0103	/* send C not NAK to get crc not checksum */
150 #define TIMEOUT (-2)
151 #define RCDO    (-3)
152 #define GCOUNT  (-4)
153 #define ERRORMAX 5
154 #define RETRYMAX 5
155 #define WCEOT   (-10)
156 
157 
158 
159 
160 
161 #define BITRATE 115200
162 #define TX_BUFFER_SIZE  1024
163 #define RX_BUFFER_SIZE  1024	  /* sender or receiver's max buffer size */
164 extern char ZF0_CMD;	          /* local ZMODEM file conversion request */
165 extern char ZF1_CMD;	          /* local ZMODEM file management request */
166 extern char ZF2_CMD;	          /* local ZMODEM file management request */
167 extern char ZF3_CMD;	          /* local ZMODEM file management request */
168 extern rt_uint32_t Baudrate ;
169 extern rt_uint32_t Left_bytes;
170 extern rt_uint32_t Left_sizes;
171 
172 
173 struct zmodemf
174 {
175     struct rt_semaphore zsem;
176     rt_device_t device;
177 };
178 extern struct zmodemf zmodem;
179 
180 struct zfile
181 {
182 	char *fname;
183 	rt_int32_t   fd;
184 	rt_uint32_t  ctime;
185     rt_uint32_t  mode;
186 	rt_uint32_t  bytes_total;
187 	rt_uint32_t  bytes_sent;
188 	rt_uint32_t  bytes_received;
189 	rt_uint32_t  file_end;
190 
191 };
192 extern struct finsh_shell* shell;
193 
194 #define ZDEBUG 0
195 /* sz.c */
196 extern void zs_start(char *path);
197 /* rz.c */
198 extern void zr_start(char *path);
199 
200 /* zcore.c */
201 extern void zinit_parameter(void);
202 extern rt_int16_t zget_header(rt_uint8_t *hdr);
203 extern void zsend_bin_header(rt_uint8_t type, rt_uint8_t *hdr);
204 extern void zsend_hex_header(rt_uint8_t type, rt_uint8_t *hdr);
205 extern rt_int16_t zget_data(rt_uint8_t *buf, rt_uint16_t len);
206 extern void zsend_bin_data(rt_uint8_t *buf, rt_int16_t len, rt_uint8_t frameend);
207 extern void zput_pos(rt_uint32_t pos);
208 extern void zget_pos(rt_uint32_t pos);
209 /* zdevice.c */
210 extern rt_uint32_t get_device_baud(void);
211 extern void zsend_byte(rt_uint16_t c);
212 extern void zsend_line(rt_uint16_t c);
213 extern rt_int16_t zread_line(rt_uint16_t timeout);
214 extern void zsend_break(char *cmd);
215 extern void zsend_can(void);
216 
217 #endif  /* __ZDEF_H__ */
218