blob: 4bdcb6c69cc883c3cb96a82b2249a463762b3d5a [file] [log] [blame]
Sylvain Munaut34b0d022022-09-01 18:16:19 +02001/*
2 * rs422.c
3 *
4 * Copyright (C) 2022 Sylvain Munaut <tnt@246tNt.com>
5 * SPDX-License-Identifier: GPL-3.0-or-later
6 */
7
8#include <stdint.h>
9#include <stdbool.h>
10
11#include "console.h"
12#include "i2c.h"
13#include "misc.h"
14
15#include "config.h"
16
17
18/* Local side buffer control */
19#define BUF_TCA9534_ADDR 0x42
20#define BUF_TXD_RXEN_n (1 << 0)
21#define BUF_TXD_TXEN_n (1 << 1)
22#define BUF_PPS_RXEN_n (1 << 4)
23#define BUF_PPS_TXEN_n (1 << 5)
24#define BUF_RXD_RXEN_n (1 << 6)
25#define BUF_RXD_TXEN_n (1 << 7)
26
27/* Isolated side line driver control */
28#define LDRV_TCA9534_ADDR 0x40
29#define LDRV_TXD_RE_n (1 << 0)
30#define LDRV_TXD_DE (1 << 1)
31#define LDRV_RXD_RE_n (1 << 2)
32#define LDRV_RXD_DE (1 << 3)
33#define LDRV_PPS_DE (1 << 4)
34#define LDRV_PPS_RE_n (1 << 5)
35
36
37static void
38tca9534_set_out(uint8_t dev, uint8_t data)
39{
40 /* Check device */
41 if (!i2c_probe(dev)) {
42 printf("[1] Unable to configure TCA9534 at address %02x\n", dev);
43 return;
44 }
45
46 /* Output values */
47 i2c_write_reg(dev, 1, data);
48
49 /* No inversion */
50 i2c_write_reg(dev, 2, 0x00);
51
52 /* All pins as output to avoid floating pins */
53 i2c_write_reg(dev, 3, 0x00);
54}
55
56
57void
58rs422_init(void)
59{
60 /* Reset GPS receiver to free I2C bus */
61 gpio_out(3, false);
62 gpio_dir(3, true);
63
64 /* Configure:
65 * - TXD pair: Receive
66 * - RXD pair: Transmit
67 * - PPS pair: Receive
68 */
69 tca9534_set_out(BUF_TCA9534_ADDR,
70 BUF_TXD_TXEN_n |
71 BUF_RXD_RXEN_n |
72 BUF_PPS_TXEN_n |
73 0
74 );
75
76 tca9534_set_out(LDRV_TCA9534_ADDR,
77 LDRV_RXD_RE_n |
78#if 0
79 /* We don't actually TX anything to the module and
80 * this burns power ... */
81 LDRV_RXD_DE |
82#endif
83 0
84 );
85
86 /* Configure GPIO alt functions */
87 /* Aux UART RX */
88 gpio_sfn(0, true);
89
90 /* Aux UART TX */
91 gpio_sfn(1, true);
92
93 /* PPS input */
94 gpio_dir(2, false);
95 gpio_sfn(2, true);
96}