| /* |
| * rs422.c |
| * |
| * Copyright (C) 2022 Sylvain Munaut <tnt@246tNt.com> |
| * SPDX-License-Identifier: GPL-3.0-or-later |
| */ |
| |
| #include <stdint.h> |
| #include <stdbool.h> |
| |
| #include "console.h" |
| #include "i2c.h" |
| #include "misc.h" |
| |
| #include "config.h" |
| |
| |
| /* Local side buffer control */ |
| #define BUF_TCA9534_ADDR 0x42 |
| #define BUF_TXD_RXEN_n (1 << 0) |
| #define BUF_TXD_TXEN_n (1 << 1) |
| #define BUF_PPS_RXEN_n (1 << 4) |
| #define BUF_PPS_TXEN_n (1 << 5) |
| #define BUF_RXD_RXEN_n (1 << 6) |
| #define BUF_RXD_TXEN_n (1 << 7) |
| |
| /* Isolated side line driver control */ |
| #define LDRV_TCA9534_ADDR 0x40 |
| #define LDRV_TXD_RE_n (1 << 0) |
| #define LDRV_TXD_DE (1 << 1) |
| #define LDRV_RXD_RE_n (1 << 2) |
| #define LDRV_RXD_DE (1 << 3) |
| #define LDRV_PPS_DE (1 << 4) |
| #define LDRV_PPS_RE_n (1 << 5) |
| |
| |
| static void |
| tca9534_set_out(uint8_t dev, uint8_t data) |
| { |
| /* Check device */ |
| if (!i2c_probe(dev)) { |
| printf("[1] Unable to configure TCA9534 at address %02x\n", dev); |
| return; |
| } |
| |
| /* Output values */ |
| i2c_write_reg(dev, 1, data); |
| |
| /* No inversion */ |
| i2c_write_reg(dev, 2, 0x00); |
| |
| /* All pins as output to avoid floating pins */ |
| i2c_write_reg(dev, 3, 0x00); |
| } |
| |
| |
| void |
| rs422_init(void) |
| { |
| /* Reset GPS receiver to free I2C bus */ |
| gpio_out(3, false); |
| gpio_dir(3, true); |
| |
| /* Configure: |
| * - TXD pair: Receive |
| * - RXD pair: Transmit |
| * - PPS pair: Receive |
| */ |
| tca9534_set_out(BUF_TCA9534_ADDR, |
| BUF_TXD_TXEN_n | |
| BUF_RXD_RXEN_n | |
| BUF_PPS_TXEN_n | |
| 0 |
| ); |
| |
| tca9534_set_out(LDRV_TCA9534_ADDR, |
| LDRV_RXD_RE_n | |
| #if 0 |
| /* We don't actually TX anything to the module and |
| * this burns power ... */ |
| LDRV_RXD_DE | |
| #endif |
| 0 |
| ); |
| |
| /* Configure GPIO alt functions */ |
| /* Aux UART RX */ |
| gpio_sfn(0, true); |
| |
| /* Aux UART TX */ |
| gpio_sfn(1, true); |
| |
| /* PPS input */ |
| gpio_dir(2, false); |
| gpio_sfn(2, true); |
| } |