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
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
|
/* $FreeBSD$ */
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2010 Lev Serebryakov <lev@FreeBSD.org>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef _UMCS7840_H_
#define _UMCS7840_H_
#define UMCS7840_MAX_PORTS 4
#define UMCS7840_READ_LENGTH 1 /* bytes */
#define UMCS7840_CTRL_TIMEOUT 500 /* ms */
/* Read/Wrtire registers vendor commands */
#define MCS7840_RDREQ 0x0d
#define MCS7840_WRREQ 0x0e
/* Read/Wrtie EEPROM values */
#define MCS7840_EEPROM_RW_WVALUE 0x0900
/*
* All these registers are documented only in full datasheet,
* which can be requested from MosChip tech support.
*/
#define MCS7840_DEV_REG_SP1 0x00 /* Options for UART 1, R/W */
#define MCS7840_DEV_REG_CONTROL1 0x01 /* Control bits for UART 1,
* R/W */
#define MCS7840_DEV_REG_PINPONGHIGH 0x02 /* High bits of ping-pong
* register, R/W */
#define MCS7840_DEV_REG_PINPONGLOW 0x03 /* Low bits of ping-pong
* register, R/W */
/* DCRx_1 Registers goes here (see below, they are documented) */
#define MCS7840_DEV_REG_GPIO 0x07 /* GPIO_0 and GPIO_1 bits,
* undocumented, see notes
* below R/W */
#define MCS7840_DEV_REG_SP2 0x08 /* Options for UART 2, R/W */
#define MCS7840_DEV_REG_CONTROL2 0x09 /* Control bits for UART 2,
* R/W */
#define MCS7840_DEV_REG_SP3 0x0a /* Options for UART 3, R/W */
#define MCS7840_DEV_REG_CONTROL3 0x0b /* Control bits for UART 3,
* R/W */
#define MCS7840_DEV_REG_SP4 0x0c /* Options for UART 4, R/W */
#define MCS7840_DEV_REG_CONTROL4 0x0d /* Control bits for UART 4,
* R/W */
#define MCS7840_DEV_REG_PLL_DIV_M 0x0e /* Pre-diviedr for PLL, R/W */
#define MCS7840_DEV_REG_UNKNOWN1 0x0f /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_PLL_DIV_N 0x10 /* Loop divider for PLL, R/W */
#define MCS7840_DEV_REG_CLOCK_MUX 0x12 /* PLL input clock & Interrupt
* endpoint control, R/W */
#define MCS7840_DEV_REG_UNKNOWN2 0x11 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_CLOCK_SELECT12 0x13 /* Clock source for ports 1 &
* 2, R/W */
#define MCS7840_DEV_REG_CLOCK_SELECT34 0x14 /* Clock source for ports 3 &
* 4, R/W */
#define MCS7840_DEV_REG_UNKNOWN3 0x15 /* NOT MENTIONED AND NOT USED */
/* DCRx_2-DCRx_4 Registers goes here (see below, they are documented) */
#define MCS7840_DEV_REG_UNKNOWN4 0x1f /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWN5 0x20 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWN6 0x21 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWN7 0x22 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWN8 0x23 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWN9 0x24 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWNA 0x25 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWNB 0x26 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWNC 0x27 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWND 0x28 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWNE 0x29 /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_UNKNOWNF 0x2a /* NOT MENTIONED AND NOT USED */
#define MCS7840_DEV_REG_MODE 0x2b /* Hardware configuration,
* R/Only */
#define MCS7840_DEV_REG_SP1_ICG 0x2c /* Inter character gap
* configuration for Port 1,
* R/W */
#define MCS7840_DEV_REG_SP2_ICG 0x2d /* Inter character gap
* configuration for Port 2,
* R/W */
#define MCS7840_DEV_REG_SP3_ICG 0x2e /* Inter character gap
* configuration for Port 3,
* R/W */
#define MCS7840_DEV_REG_SP4_ICG 0x2f /* Inter character gap
* configuration for Port 4,
* R/W */
#define MCS7840_DEV_REG_RX_SAMPLING12 0x30 /* RX sampling for ports 1 &
* 2, R/W */
#define MCS7840_DEV_REG_RX_SAMPLING34 0x31 /* RX sampling for ports 3 &
* 4, R/W */
#define MCS7840_DEV_REG_BI_FIFO_STAT1 0x32 /* Bulk-In FIFO Stat for Port
* 1, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BO_FIFO_STAT1 0x33 /* Bulk-out FIFO Stat for Port
* 1, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BI_FIFO_STAT2 0x34 /* Bulk-In FIFO Stat for Port
* 2, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BO_FIFO_STAT2 0x35 /* Bulk-out FIFO Stat for Port
* 2, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BI_FIFO_STAT3 0x36 /* Bulk-In FIFO Stat for Port
* 3, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BO_FIFO_STAT3 0x37 /* Bulk-out FIFO Stat for Port
* 3, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BI_FIFO_STAT4 0x38 /* Bulk-In FIFO Stat for Port
* 4, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_BO_FIFO_STAT4 0x39 /* Bulk-out FIFO Stat for Port
* 4, contains number of
* available bytes, R/Only */
#define MCS7840_DEV_REG_ZERO_PERIOD1 0x3a /* Period between zero out
* frames for Port 1, R/W */
#define MCS7840_DEV_REG_ZERO_PERIOD2 0x3b /* Period between zero out
* frames for Port 1, R/W */
#define MCS7840_DEV_REG_ZERO_PERIOD3 0x3c /* Period between zero out
* frames for Port 1, R/W */
#define MCS7840_DEV_REG_ZERO_PERIOD4 0x3d /* Period between zero out
* frames for Port 1, R/W */
#define MCS7840_DEV_REG_ZERO_ENABLE 0x3e /* Enable/disable of zero out
* frames, R/W */
#define MCS7840_DEV_REG_THR_VAL_LOW1 0x3f /* Low 8 bits of threshold
* value for Bulk-Out for Port
* 1, R/W */
#define MCS7840_DEV_REG_THR_VAL_HIGH1 0x40 /* High 1 bit of threshold
* value for Bulk-Out and
* enable flag for Port 1, R/W */
#define MCS7840_DEV_REG_THR_VAL_LOW2 0x41 /* Low 8 bits of threshold
* value for Bulk-Out for Port
* 2, R/W */
#define MCS7840_DEV_REG_THR_VAL_HIGH2 0x42 /* High 1 bit of threshold
* value for Bulk-Out and
* enable flag for Port 2, R/W */
#define MCS7840_DEV_REG_THR_VAL_LOW3 0x43 /* Low 8 bits of threshold
* value for Bulk-Out for Port
* 3, R/W */
#define MCS7840_DEV_REG_THR_VAL_HIGH3 0x44 /* High 1 bit of threshold
* value for Bulk-Out and
* enable flag for Port 3, R/W */
#define MCS7840_DEV_REG_THR_VAL_LOW4 0x45 /* Low 8 bits of threshold
* value for Bulk-Out for Port
* 4, R/W */
#define MCS7840_DEV_REG_THR_VAL_HIGH4 0x46 /* High 1 bit of threshold
* value for Bulk-Out and
* enable flag for Port 4, R/W */
/* Bits for SPx registers */
#define MCS7840_DEV_SPx_LOOP_PIPES 0x01 /* Loop Bulk-Out FIFO to the
* Bulk-In FIFO, default = 0 */
#define MCS7840_DEV_SPx_SKIP_ERR_DATA 0x02 /* Drop data bytes from UART,
* which were recevied with
* errors, default = 0 */
#define MCS7840_DEV_SPx_RESET_OUT_FIFO 0x04 /* Reset Bulk-Out FIFO */
#define MCS7840_DEV_SPx_RESET_IN_FIFO 0x08 /* Reset Bulk-In FIFO */
#define MCS7840_DEV_SPx_CLOCK_MASK 0x70 /* Mask to extract Baud CLK
* source */
#define MCS7840_DEV_SPx_CLOCK_X1 0x00 /* CLK = 1.8432Mhz, max speed
* = 115200 bps, default */
#define MCS7840_DEV_SPx_CLOCK_X2 0x10 /* CLK = 3.6864Mhz, max speed
* = 230400 bps */
#define MCS7840_DEV_SPx_CLOCK_X35 0x20 /* CLK = 6.4512Mhz, max speed
* = 403200 bps */
#define MCS7840_DEV_SPx_CLOCK_X4 0x30 /* CLK = 7.3728Mhz, max speed
* = 460800 bps */
#define MCS7840_DEV_SPx_CLOCK_X7 0x40 /* CLK = 12.9024Mhz, max speed
* = 806400 bps */
#define MCS7840_DEV_SPx_CLOCK_X8 0x50 /* CLK = 14.7456Mhz, max speed
* = 921600 bps */
#define MCS7840_DEV_SPx_CLOCK_24MHZ 0x60 /* CLK = 24.0000Mhz, max speed
* = 1.5 Mbps */
#define MCS7840_DEV_SPx_CLOCK_48MHZ 0x70 /* CLK = 48.0000Mhz, max speed
* = 3.0 Mbps */
#define MCS7840_DEV_SPx_CLOCK_SHIFT 4 /* Value 0..7 can be shifted
* to get clock value */
#define MCS7840_DEV_SPx_UART_RESET 0x80 /* Reset UART */
/* Bits for CONTROLx registers */
#define MCS7840_DEV_CONTROLx_HWFC 0x01 /* Enable hardware flow
* control (when power
* down? It is unclear
* in documents),
* default = 0 */
#define MCS7840_DEV_CONTROLx_UNUNSED1 0x02 /* Reserved */
#define MCS7840_DEV_CONTROLx_CTS_ENABLE 0x04 /* CTS changes are
* translated to MSR,
* default = 0 */
#define MCS7840_DEV_CONTROLx_UNUSED2 0x08 /* Reserved for ports
* 2,3,4 */
#define MCS7840_DEV_CONTROL1_DRIVER_DONE 0x08 /* USB enumerating is
* finished, USB
* enumeration memory
* can be used as FIFOs */
#define MCS7840_DEV_CONTROLx_RX_NEGATE 0x10 /* Negate RX input,
* works for IrDA mode
* only, default = 0 */
#define MCS7840_DEV_CONTROLx_RX_DISABLE 0x20 /* Disable RX logic,
* works only for
* RS-232/RS-485 mode,
* default = 0 */
#define MCS7840_DEV_CONTROLx_FSM_CONTROL 0x40 /* Disable RX FSM when
* TX is in progress,
* works for IrDA mode
* only, default = 0 */
#define MCS7840_DEV_CONTROLx_UNUSED3 0x80 /* Reserved */
/*
* Bits for PINPONGx registers
* These registers control how often two input buffers
* for Bulk-In FIFOs are swapped. One of buffers is used
* for USB trnasfer, other for receiving data from UART.
* Exact meaning of 15 bit value in these registers is unknown
*/
#define MCS7840_DEV_PINPONGHIGH_MULT 128 /* Only 7 bits in PINPONGLOW
* register */
#define MCS7840_DEV_PINPONGLOW_BITS 7 /* Only 7 bits in PINPONGLOW
* register */
/*
* THIS ONE IS UNDOCUMENTED IN FULL DATASHEET, but e-mail from tech support
* confirms, that it is register for GPIO_0 and GPIO_1 data input/output.
* Chips has 2 GPIO, but first one (lower bit) MUST be used by device
* authors as "number of port" indicator, grounded (0) for two-port
* devices and pulled-up to 1 for 4-port devices.
*/
#define MCS7840_DEV_GPIO_4PORTS 0x01 /* Device has 4 ports
* configured */
#define MCS7840_DEV_GPIO_GPIO_0 0x01 /* The same as above */
#define MCS7840_DEV_GPIO_GPIO_1 0x02 /* GPIO_1 data */
/*
* Constants for PLL dividers
* Ouptut frequency of PLL is:
* Fout = (N/M) * Fin.
* Default PLL input frequency Fin is 12Mhz (on-chip).
*/
#define MCS7840_DEV_PLL_DIV_M_BITS 6 /* Number of useful bits for M
* divider */
#define MCS7840_DEV_PLL_DIV_M_MASK 0x3f /* Mask for M divider */
#define MCS7840_DEV_PLL_DIV_M_MIN 1 /* Minimum value for M, 0 is
* forbidden */
#define MCS7840_DEV_PLL_DIV_M_DEF 1 /* Default value for M */
#define MCS7840_DEV_PLL_DIV_M_MAX 63 /* Maximum value for M */
#define MCS7840_DEV_PLL_DIV_N_BITS 6 /* Number of useful bits for N
* divider */
#define MCS7840_DEV_PLL_DIV_N_MASK 0x3f /* Mask for N divider */
#define MCS7840_DEV_PLL_DIV_N_MIN 1 /* Minimum value for N, 0 is
* forbidden */
#define MCS7840_DEV_PLL_DIV_N_DEF 8 /* Default value for N */
#define MCS7840_DEV_PLL_DIV_N_MAX 63 /* Maximum value for N */
/* Bits for CLOCK_MUX register */
#define MCS7840_DEV_CLOCK_MUX_INPUTMASK 0x03 /* Mask to extract PLL clock
* input */
#define MCS7840_DEV_CLOCK_MUX_IN12MHZ 0x00 /* 12Mhz PLL input, default */
#define MCS7840_DEV_CLOCK_MUX_INEXTRN 0x01 /* External (device-depended)
* PLL input */
#define MCS7840_DEV_CLOCK_MUX_INRSV1 0x02 /* Reserved */
#define MCS7840_DEV_CLOCK_MUX_INRSV2 0x03 /* Reserved */
#define MCS7840_DEV_CLOCK_MUX_PLLHIGH 0x04 /* 0 = PLL Output is
* 20MHz-100MHz (default), 1 =
* 100MHz-300MHz range */
#define MCS7840_DEV_CLOCK_MUX_INTRFIFOS 0x08 /* Enable additional 8 bytes
* fro Interrupt USB pipe with
* USB FIFOs statuses, default
* = 0 */
#define MCS7840_DEV_CLOCK_MUX_RESERVED1 0x10 /* Unused */
#define MCS7840_DEV_CLOCK_MUX_RESERVED2 0x20 /* Unused */
#define MCS7840_DEV_CLOCK_MUX_RESERVED3 0x40 /* Unused */
#define MCS7840_DEV_CLOCK_MUX_RESERVED4 0x80 /* Unused */
/* Bits for CLOCK_SELECTxx registers */
#define MCS7840_DEV_CLOCK_SELECT1_MASK 0x07 /* Bits for port 1 in
* CLOCK_SELECT12 */
#define MCS7840_DEV_CLOCK_SELECT1_SHIFT 0 /* Shift for port 1in
* CLOCK_SELECT12 */
#define MCS7840_DEV_CLOCK_SELECT2_MASK 0x38 /* Bits for port 2 in
* CLOCK_SELECT12 */
#define MCS7840_DEV_CLOCK_SELECT2_SHIFT 3 /* Shift for port 2 in
* CLOCK_SELECT12 */
#define MCS7840_DEV_CLOCK_SELECT3_MASK 0x07 /* Bits for port 3 in
* CLOCK_SELECT23 */
#define MCS7840_DEV_CLOCK_SELECT3_SHIFT 0 /* Shift for port 3 in
* CLOCK_SELECT23 */
#define MCS7840_DEV_CLOCK_SELECT4_MASK 0x38 /* Bits for port 4 in
* CLOCK_SELECT23 */
#define MCS7840_DEV_CLOCK_SELECT4_SHIFT 3 /* Shift for port 4 in
* CLOCK_SELECT23 */
#define MCS7840_DEV_CLOCK_SELECT_STD 0x00 /* STANDARD baudrate derived
* from 96Mhz, default for all
* ports */
#define MCS7840_DEV_CLOCK_SELECT_30MHZ 0x01 /* 30Mhz */
#define MCS7840_DEV_CLOCK_SELECT_96MHZ 0x02 /* 96Mhz direct */
#define MCS7840_DEV_CLOCK_SELECT_120MHZ 0x03 /* 120Mhz */
#define MCS7840_DEV_CLOCK_SELECT_PLL 0x04 /* PLL output (see for M and N
* dividers) */
#define MCS7840_DEV_CLOCK_SELECT_EXT 0x05 /* External clock input
* (device-dependend) */
#define MCS7840_DEV_CLOCK_SELECT_RES1 0x06 /* Unused */
#define MCS7840_DEV_CLOCK_SELECT_RES2 0x07 /* Unused */
/* Bits for MODE register */
#define MCS7840_DEV_MODE_RESERVED1 0x01 /* Unused */
#define MCS7840_DEV_MODE_RESET 0x02 /* 0: RESET = Active High
* (default), 1: Reserved (?) */
#define MCS7840_DEV_MODE_SER_PRSNT 0x04 /* 0: Reserved, 1: Do not use
* hardocded values (default)
* (?) */
#define MCS7840_DEV_MODE_PLLBYPASS 0x08 /* 1: PLL output is bypassed,
* default = 0 */
#define MCS7840_DEV_MODE_PORBYPASS 0x10 /* 1: Power-On Reset is
* bypassed, default = 0 */
#define MCS7840_DEV_MODE_SELECT24S 0x20 /* 0: 4 Serial Ports / IrDA
* active, 1: 2 Serial Ports /
* IrDA active */
#define MCS7840_DEV_MODE_EEPROMWR 0x40 /* EEPROM write is enabled,
* default */
#define MCS7840_DEV_MODE_IRDA 0x80 /* IrDA mode is activated
* (could be turned on),
* default */
/* Bits for SPx ICG */
#define MCS7840_DEV_SPx_ICG_DEF 0x24 /* All 8 bits is used as
* number of BAUD clocks of
* pause */
/*
* Bits for RX_SAMPLINGxx registers
* These registers control when bit value will be sampled within
* the baud period.
* 0 is very beginning of period, 15 is very end, 7 is the middle.
*/
#define MCS7840_DEV_RX_SAMPLING1_MASK 0x0f /* Bits for port 1 in
* RX_SAMPLING12 */
#define MCS7840_DEV_RX_SAMPLING1_SHIFT 0 /* Shift for port 1in
* RX_SAMPLING12 */
#define MCS7840_DEV_RX_SAMPLING2_MASK 0xf0 /* Bits for port 2 in
* RX_SAMPLING12 */
#define MCS7840_DEV_RX_SAMPLING2_SHIFT 4 /* Shift for port 2 in
* RX_SAMPLING12 */
#define MCS7840_DEV_RX_SAMPLING3_MASK 0x0f /* Bits for port 3 in
* RX_SAMPLING23 */
#define MCS7840_DEV_RX_SAMPLING3_SHIFT 0 /* Shift for port 3 in
* RX_SAMPLING23 */
#define MCS7840_DEV_RX_SAMPLING4_MASK 0xf0 /* Bits for port 4 in
* RX_SAMPLING23 */
#define MCS7840_DEV_RX_SAMPLING4_SHIFT 4 /* Shift for port 4 in
* RX_SAMPLING23 */
#define MCS7840_DEV_RX_SAMPLINGx_MIN 0 /* Max for any RX Sampling */
#define MCS7840_DEV_RX_SAMPLINGx_DEF 7 /* Default for any RX
* Sampling, center of period */
#define MCS7840_DEV_RX_SAMPLINGx_MAX 15 /* Min for any RX Sampling */
/* Bits for ZERO_PERIODx */
#define MCS7840_DEV_ZERO_PERIODx_DEF 20 /* Number of Bulk-in requests
* befor sending zero-sized
* reply */
/* Bits for ZERO_ENABLE */
#define MCS7840_DEV_ZERO_ENABLE_PORT1 0x01 /* Enable of sending
* zero-sized replies for port
* 1, default */
#define MCS7840_DEV_ZERO_ENABLE_PORT2 0x02 /* Enable of sending
* zero-sized replies for port
* 2, default */
#define MCS7840_DEV_ZERO_ENABLE_PORT3 0x04 /* Enable of sending
* zero-sized replies for port
* 3, default */
#define MCS7840_DEV_ZERO_ENABLE_PORT4 0x08 /* Enable of sending
* zero-sized replies for port
* 4, default */
/* Bits for THR_VAL_HIGHx */
#define MCS7840_DEV_THR_VAL_HIGH_MASK 0x01 /* Only one bit is used */
#define MCS7840_DEV_THR_VAL_HIGH_MUL 256 /* This one bit is means "256" */
#define MCS7840_DEV_THR_VAL_HIGH_SHIFT 8 /* This one bit is means "256" */
#define MCS7840_DEV_THR_VAL_HIGH_ENABLE 0x80 /* Enable threshold */
/* These are documented in "public" datasheet */
#define MCS7840_DEV_REG_DCR0_1 0x04 /* Device contol register 0 for Port
* 1, R/W */
#define MCS7840_DEV_REG_DCR1_1 0x05 /* Device contol register 1 for Port
* 1, R/W */
#define MCS7840_DEV_REG_DCR2_1 0x06 /* Device contol register 2 for Port
* 1, R/W */
#define MCS7840_DEV_REG_DCR0_2 0x16 /* Device contol register 0 for Port
* 2, R/W */
#define MCS7840_DEV_REG_DCR1_2 0x17 /* Device contol register 1 for Port
* 2, R/W */
#define MCS7840_DEV_REG_DCR2_2 0x18 /* Device contol register 2 for Port
* 2, R/W */
#define MCS7840_DEV_REG_DCR0_3 0x19 /* Device contol register 0 for Port
* 3, R/W */
#define MCS7840_DEV_REG_DCR1_3 0x1a /* Device contol register 1 for Port
* 3, R/W */
#define MCS7840_DEV_REG_DCR2_3 0x1b /* Device contol register 2 for Port
* 3, R/W */
#define MCS7840_DEV_REG_DCR0_4 0x1c /* Device contol register 0 for Port
* 4, R/W */
#define MCS7840_DEV_REG_DCR1_4 0x1d /* Device contol register 1 for Port
* 4, R/W */
#define MCS7840_DEV_REG_DCR2_4 0x1e /* Device contol register 2 for Port
* 4, R/W */
/* Bits of DCR0 registers, documented in datasheet */
#define MCS7840_DEV_DCR0_PWRSAVE 0x01 /* Shutdown transiver
* when USB Suspend is
* engaged, default = 1 */
#define MCS7840_DEV_DCR0_RESERVED1 0x02 /* Unused */
#define MCS7840_DEV_DCR0_GPIO_MODE_MASK 0x0c /* GPIO Mode bits, WORKS
* ONLY FOR PORT 1 */
#define MCS7840_DEV_DCR0_GPIO_MODE_IN 0x00 /* GPIO Mode - Input
* (0b00), WORKS ONLY
* FOR PORT 1 */
#define MCS7840_DEV_DCR0_GPIO_MODE_OUT 0x08 /* GPIO Mode - Input
* (0b10), WORKS ONLY
* FOR PORT 1 */
#define MCS7840_DEV_DCR0_RTS_ACTIVE_HIGH 0x10 /* RTS Active is HIGH,
* default = 0 (low) */
#define MCS7840_DEV_DCR0_RTS_AUTO 0x20 /* RTS is controlled by
* state of TX buffer,
* default = 0
* (controlled by MCR) */
#define MCS7840_DEV_DCR0_IRDA 0x40 /* IrDA mode */
#define MCS7840_DEV_DCR0_RESERVED2 0x80 /* Unused */
/* Bits of DCR1 registers, documented in datasheet */
#define MCS7840_DEV_DCR1_GPIO_CURRENT_MASK 0x03 /* Mask to extract GPIO
* current value, WORKS
* ONLY FOR PORT 1 */
#define MCS7840_DEV_DCR1_GPIO_CURRENT_6MA 0x00 /* GPIO output current
* 6mA, WORKS ONLY FOR
* PORT 1 */
#define MCS7840_DEV_DCR1_GPIO_CURRENT_8MA 0x01 /* GPIO output current
* 8mA, defauilt, WORKS
* ONLY FOR PORT 1 */
#define MCS7840_DEV_DCR1_GPIO_CURRENT_10MA 0x02 /* GPIO output current
* 10mA, WORKS ONLY FOR
* PORT 1 */
#define MCS7840_DEV_DCR1_GPIO_CURRENT_12MA 0x03 /* GPIO output current
* 12mA, WORKS ONLY FOR
* PORT 1 */
#define MCS7840_DEV_DCR1_UART_CURRENT_MASK 0x0c /* Mask to extract UART
* signals current value */
#define MCS7840_DEV_DCR1_UART_CURRENT_6MA 0x00 /* UART output current
* 6mA */
#define MCS7840_DEV_DCR1_UART_CURRENT_8MA 0x04 /* UART output current
* 8mA, defauilt */
#define MCS7840_DEV_DCR1_UART_CURRENT_10MA 0x08 /* UART output current
* 10mA */
#define MCS7840_DEV_DCR1_UART_CURRENT_12MA 0x0c /* UART output current
* 12mA */
#define MCS7840_DEV_DCR1_WAKEUP_DISABLE 0x10 /* Disable Remote USB
* Wakeup */
#define MCS7840_DEV_DCR1_PLLPWRDOWN_DISABLE 0x20 /* Disable PLL power
* down when not needed,
* WORKS ONLY FOR PORT 1 */
#define MCS7840_DEV_DCR1_LONG_INTERRUPT 0x40 /* Enable 13 bytes of
* interrupt data, with
* FIFO statistics,
* WORKS ONLY FOR PORT 1 */
#define MCS7840_DEV_DCR1_RESERVED1 0x80 /* Unused */
/*
* Bits of DCR2 registers, documented in datasheet
* Wakeup will work only if DCR0_IRDA = 0 (RS-xxx mode) and
* DCR1_WAKEUP_DISABLE = 0 (wakeup enabled).
*/
#define MCS7840_DEV_DCR2_WAKEUP_CTS 0x01 /* Wakeup on CTS change,
* default = 0 */
#define MCS7840_DEV_DCR2_WAKEUP_DCD 0x02 /* Wakeup on DCD change,
* default = 0 */
#define MCS7840_DEV_DCR2_WAKEUP_RI 0x04 /* Wakeup on RI change,
* default = 1 */
#define MCS7840_DEV_DCR2_WAKEUP_DSR 0x08 /* Wakeup on DSR change,
* default = 0 */
#define MCS7840_DEV_DCR2_WAKEUP_RXD 0x10 /* Wakeup on RX Data change,
* default = 0 */
#define MCS7840_DEV_DCR2_WAKEUP_RESUME 0x20 /* Wakeup issues RESUME
* signal, DISCONNECT
* otherwise, default = 1 */
#define MCS7840_DEV_DCR2_RESERVED1 0x40 /* Unused */
#define MCS7840_DEV_DCR2_SHDN_POLARITY 0x80 /* 0: Pin 12 Active Low, 1:
* Pin 12 Active High, default
* = 0 */
/* Interrupt endpoint bytes & bits */
#define MCS7840_IEP_FIFO_STATUS_INDEX 5
/*
* Thesse can be calculated as "1 << portnumber" for Bulk-out and
* "1 << (portnumber+1)" for Bulk-in
*/
#define MCS7840_IEP_BO_PORT1_HASDATA 0x01
#define MCS7840_IEP_BI_PORT1_HASDATA 0x02
#define MCS7840_IEP_BO_PORT2_HASDATA 0x04
#define MCS7840_IEP_BI_PORT2_HASDATA 0x08
#define MCS7840_IEP_BO_PORT3_HASDATA 0x10
#define MCS7840_IEP_BI_PORT3_HASDATA 0x20
#define MCS7840_IEP_BO_PORT4_HASDATA 0x40
#define MCS7840_IEP_BI_PORT4_HASDATA 0x80
/* Documented UART registers (fully compatible with 16550 UART) */
#define MCS7840_UART_REG_THR 0x00 /* Transmitter Holding
* Register W/Only */
#define MCS7840_UART_REG_RHR 0x00 /* Receiver Holding Register
* R/Only */
#define MCS7840_UART_REG_IER 0x01 /* Interrupt enable register -
* R/W */
#define MCS7840_UART_REG_FCR 0x02 /* FIFO Control register -
* W/Only */
#define MCS7840_UART_REG_ISR 0x02 /* Interrupt Status Registter
* R/Only */
#define MCS7840_UART_REG_LCR 0x03 /* Line control register R/W */
#define MCS7840_UART_REG_MCR 0x04 /* Modem control register R/W */
#define MCS7840_UART_REG_LSR 0x05 /* Line status register R/Only */
#define MCS7840_UART_REG_MSR 0x06 /* Modem status register
* R/Only */
#define MCS7840_UART_REG_SCRATCHPAD 0x07 /* Scratch pad register */
#define MCS7840_UART_REG_DLL 0x00 /* Low bits of BAUD divider */
#define MCS7840_UART_REG_DLM 0x01 /* High bits of BAUD divider */
/* IER bits */
#define MCS7840_UART_IER_RXREADY 0x01 /* RX Ready interrumpt mask */
#define MCS7840_UART_IER_TXREADY 0x02 /* TX Ready interrumpt mask */
#define MCS7840_UART_IER_RXSTAT 0x04 /* RX Status interrumpt mask */
#define MCS7840_UART_IER_MODEM 0x08 /* Modem status change
* interrumpt mask */
#define MCS7840_UART_IER_SLEEP 0x10 /* SLEEP enable */
/* FCR bits */
#define MCS7840_UART_FCR_ENABLE 0x01 /* Enable FIFO */
#define MCS7840_UART_FCR_FLUSHRHR 0x02 /* Flush RHR and FIFO */
#define MCS7840_UART_FCR_FLUSHTHR 0x04 /* Flush THR and FIFO */
#define MCS7840_UART_FCR_RTLMASK 0xa0 /* Mask to select RHR
* Interrupt Trigger level */
#define MCS7840_UART_FCR_RTL_1_1 0x00 /* L1 = 1, L2 = 1 */
#define MCS7840_UART_FCR_RTL_1_4 0x40 /* L1 = 1, L2 = 4 */
#define MCS7840_UART_FCR_RTL_1_8 0x80 /* L1 = 1, L2 = 8 */
#define MCS7840_UART_FCR_RTL_1_14 0xa0 /* L1 = 1, L2 = 14 */
/* ISR bits */
#define MCS7840_UART_ISR_NOPENDING 0x01 /* No interrupt pending */
#define MCS7840_UART_ISR_INTMASK 0x3f /* Mask to select interrupt
* source */
#define MCS7840_UART_ISR_RXERR 0x06 /* Recevir error */
#define MCS7840_UART_ISR_RXHASDATA 0x04 /* Recevier has data */
#define MCS7840_UART_ISR_RXTIMEOUT 0x0c /* Recevier timeout */
#define MCS7840_UART_ISR_TXEMPTY 0x02 /* Transmitter empty */
#define MCS7840_UART_ISR_MSCHANGE 0x00 /* Modem status change */
/* LCR bits */
#define MCS7840_UART_LCR_DATALENMASK 0x03 /* Mask for data length */
#define MCS7840_UART_LCR_DATALEN5 0x00 /* 5 data bits */
#define MCS7840_UART_LCR_DATALEN6 0x01 /* 6 data bits */
#define MCS7840_UART_LCR_DATALEN7 0x02 /* 7 data bits */
#define MCS7840_UART_LCR_DATALEN8 0x03 /* 8 data bits */
#define MCS7840_UART_LCR_STOPBMASK 0x04 /* Mask for stop bits */
#define MCS7840_UART_LCR_STOPB1 0x00 /* 1 stop bit in any case */
#define MCS7840_UART_LCR_STOPB2 0x04 /* 1.5-2 stop bits depends on
* data length */
#define MCS7840_UART_LCR_PARITYMASK 0x38 /* Mask for all parity data */
#define MCS7840_UART_LCR_PARITYON 0x08 /* Parity ON/OFF - ON */
#define MCS7840_UART_LCR_PARITYODD 0x00 /* Parity Odd */
#define MCS7840_UART_LCR_PARITYEVEN 0x10 /* Parity Even */
#define MCS7840_UART_LCR_PARITYODD 0x00 /* Parity Odd */
#define MCS7840_UART_LCR_PARITYFORCE 0x20 /* Force parity odd/even */
#define MCS7840_UART_LCR_BREAK 0x40 /* Send BREAK */
#define MCS7840_UART_LCR_DIVISORS 0x80 /* Map DLL/DLM instead of
* xHR/IER */
/* LSR bits */
#define MCS7840_UART_LSR_RHRAVAIL 0x01 /* Data available for read */
#define MCS7840_UART_LSR_RHROVERRUN 0x02 /* Data FIFO/register overflow */
#define MCS7840_UART_LSR_PARITYERR 0x04 /* Parity error */
#define MCS7840_UART_LSR_FRAMEERR 0x10 /* Framing error */
#define MCS7840_UART_LSR_BREAKERR 0x20 /* BREAK signal received */
#define MCS7840_UART_LSR_THREMPTY 0x40 /* THR register is empty,
* ready for transmit */
#define MCS7840_UART_LSR_HASERR 0x80 /* Has error in receiver FIFO */
/* MCR bits */
#define MCS7840_UART_MCR_DTR 0x01 /* Force DTR to be active
* (low) */
#define MCS7840_UART_MCR_RTS 0x02 /* Force RTS to be active
* (low) */
#define MCS7840_UART_MCR_IE 0x04 /* Enable interrupts (from
* code, not documented) */
#define MCS7840_UART_MCR_LOOPBACK 0x10 /* Enable local loopback test
* mode */
#define MCS7840_UART_MCR_CTSRTS 0x20 /* Enable CTS/RTS flow control
* in 550 (FIFO) mode */
#define MCS7840_UART_MCR_DTRDSR 0x40 /* Enable DTR/DSR flow control
* in 550 (FIFO) mode */
#define MCS7840_UART_MCR_DCD 0x80 /* Enable DCD flow control in
* 550 (FIFO) mode */
/* MSR bits */
#define MCS7840_UART_MSR_DELTACTS 0x01 /* CTS was changed since last
* read */
#define MCS7840_UART_MSR_DELTADSR 0x02 /* DSR was changed since last
* read */
#define MCS7840_UART_MSR_DELTARI 0x04 /* RI was changed from low to
* high since last read */
#define MCS7840_UART_MSR_DELTADCD 0x08 /* DCD was changed since last
* read */
#define MCS7840_UART_MSR_NEGCTS 0x10 /* Negated CTS signal */
#define MCS7840_UART_MSR_NEGDSR 0x20 /* Negated DSR signal */
#define MCS7840_UART_MSR_NEGRI 0x40 /* Negated RI signal */
#define MCS7840_UART_MSR_NEGDCD 0x80 /* Negated DCD signal */
/* SCRATCHPAD bits */
#define MCS7840_UART_SCRATCHPAD_RS232 0x00 /* RS-485 disabled */
#define MCS7840_UART_SCRATCHPAD_RS485_DTRRX 0x80 /* RS-485 mode, DTR High
* = RX */
#define MCS7840_UART_SCRATCHPAD_RS485_DTRTX 0xc0 /* RS-485 mode, DTR High
* = TX */
#define MCS7840_CONFIG_INDEX 0
#define MCS7840_IFACE_INDEX 0
#endif
|