blob: bda84b2e8eb70b94cb0a344dbdb96bb0c9abc0a6 [file] [log] [blame]
Bilal Wasim503a70a2020-11-23 19:54:31 +05001/*
2 * Copyright (c) 2020 Analog Life LLC
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef QUECTEL_BG9X_H
8#define QUECTEL_BG9X_H
9
Gerard Marull-Paretasfb60aab2022-05-06 10:25:46 +020010#include <zephyr/kernel.h>
Bilal Wasim503a70a2020-11-23 19:54:31 +050011#include <ctype.h>
12#include <errno.h>
Gerard Marull-Paretasfb60aab2022-05-06 10:25:46 +020013#include <zephyr/drivers/gpio.h>
14#include <zephyr/device.h>
15#include <zephyr/init.h>
Bilal Wasim503a70a2020-11-23 19:54:31 +050016
Gerard Marull-Paretasfb60aab2022-05-06 10:25:46 +020017#include <zephyr/net/net_if.h>
Georges Oates_Larsen3c6b7dc2023-01-19 14:17:55 -080018#include <zephyr/net/offloaded_netdev.h>
Gerard Marull-Paretasfb60aab2022-05-06 10:25:46 +020019#include <zephyr/net/net_offload.h>
20#include <zephyr/net/socket_offload.h>
Bilal Wasim503a70a2020-11-23 19:54:31 +050021
22#include "modem_context.h"
23#include "modem_socket.h"
24#include "modem_cmd_handler.h"
25#include "modem_iface_uart.h"
26
Bjarki Arge Andreasena4afcf82022-11-21 07:16:38 +010027#define MDM_UART_NODE DT_INST_BUS(0)
28#define MDM_UART_DEV DEVICE_DT_GET(MDM_UART_NODE)
Bilal Wasim503a70a2020-11-23 19:54:31 +050029#define MDM_CMD_TIMEOUT K_SECONDS(10)
30#define MDM_CMD_CONN_TIMEOUT K_SECONDS(120)
31#define MDM_REGISTRATION_TIMEOUT K_SECONDS(180)
32#define MDM_SENDMSG_SLEEP K_MSEC(1)
33#define MDM_MAX_DATA_LENGTH 1024
34#define MDM_RECV_MAX_BUF 30
35#define MDM_RECV_BUF_SIZE 1024
36#define MDM_MAX_SOCKETS 5
37#define MDM_BASE_SOCKET_NUM 0
38#define MDM_NETWORK_RETRY_COUNT 10
39#define MDM_INIT_RETRY_COUNT 10
Thomas LE ROUXf3607182021-01-14 17:52:46 +010040#define MDM_PDP_ACT_RETRY_COUNT 3
Bilal Wasim503a70a2020-11-23 19:54:31 +050041#define MDM_WAIT_FOR_RSSI_COUNT 10
42#define MDM_WAIT_FOR_RSSI_DELAY K_SECONDS(2)
43#define BUF_ALLOC_TIMEOUT K_SECONDS(1)
Yong Cong Sin084a8b62021-04-13 19:21:06 +080044#define MDM_MAX_BOOT_TIME K_SECONDS(50)
Bilal Wasim503a70a2020-11-23 19:54:31 +050045
46/* Default lengths of certain things. */
47#define MDM_MANUFACTURER_LENGTH 10
48#define MDM_MODEL_LENGTH 16
49#define MDM_REVISION_LENGTH 64
50#define MDM_IMEI_LENGTH 16
51#define MDM_IMSI_LENGTH 16
52#define MDM_ICCID_LENGTH 32
53#define MDM_APN_LENGTH 32
54#define RSSI_TIMEOUT_SECS 30
55
Andrei Hutanu3cf92bc2023-04-22 11:24:01 +020056#define MDM_UNSOL_RDY CONFIG_MODEM_QUECTEL_BG9X_UNSOL_RDY
Bilal Wasim503a70a2020-11-23 19:54:31 +050057#define MDM_APN CONFIG_MODEM_QUECTEL_BG9X_APN
58#define MDM_USERNAME CONFIG_MODEM_QUECTEL_BG9X_USERNAME
59#define MDM_PASSWORD CONFIG_MODEM_QUECTEL_BG9X_PASSWORD
60
61/* Modem ATOI routine. */
62#define ATOI(s_, value_, desc_) modem_atoi(s_, value_, desc_, __func__)
63
64/* pin settings */
65enum mdm_control_pins {
66 MDM_POWER = 0,
67 MDM_RESET,
68#if DT_INST_NODE_HAS_PROP(0, mdm_dtr_gpios)
69 MDM_DTR,
70#endif
Guillaume Paquet143a7762021-01-14 14:45:08 +010071#if DT_INST_NODE_HAS_PROP(0, mdm_wdisable_gpios)
72 MDM_WDISABLE,
73#endif
Bilal Wasim503a70a2020-11-23 19:54:31 +050074};
75
76/* driver data */
77struct modem_data {
78 struct net_if *net_iface;
79 uint8_t mac_addr[6];
80
81 /* modem interface */
82 struct modem_iface_uart_data iface_data;
83 uint8_t iface_rb_buf[MDM_MAX_DATA_LENGTH];
84
85 /* modem cmds */
86 struct modem_cmd_handler_data cmd_handler_data;
87 uint8_t cmd_match_buf[MDM_RECV_BUF_SIZE + 1];
88
89 /* socket data */
90 struct modem_socket_config socket_config;
91 struct modem_socket sockets[MDM_MAX_SOCKETS];
92
93 /* RSSI work */
Peter Bigotcc090722021-03-31 10:31:30 -050094 struct k_work_delayable rssi_query_work;
Bilal Wasim503a70a2020-11-23 19:54:31 +050095
96 /* modem data */
97 char mdm_manufacturer[MDM_MANUFACTURER_LENGTH];
98 char mdm_model[MDM_MODEL_LENGTH];
99 char mdm_revision[MDM_REVISION_LENGTH];
100 char mdm_imei[MDM_IMEI_LENGTH];
101#if defined(CONFIG_MODEM_SIM_NUMBERS)
102 char mdm_imsi[MDM_IMSI_LENGTH];
103 char mdm_iccid[MDM_ICCID_LENGTH];
104#endif /* #if defined(CONFIG_MODEM_SIM_NUMBERS) */
Bartosz Bilasee7cd102021-11-04 20:56:13 +0100105 int mdm_rssi;
Bilal Wasim503a70a2020-11-23 19:54:31 +0500106
107 /* bytes written to socket in last transaction */
108 int sock_written;
109
110 /* Socket from which we are currently reading data. */
111 int sock_fd;
112
113 /* Semaphore(s) */
114 struct k_sem sem_response;
115 struct k_sem sem_tx_ready;
116 struct k_sem sem_sock_conn;
Andrei Hutanu27ad7112023-04-22 11:27:45 +0200117#if !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios)
118 struct k_sem sem_pin_busy;
119#endif
Bilal Wasim503a70a2020-11-23 19:54:31 +0500120};
121
122/* Socket read callback data */
123struct socket_read_data {
124 char *recv_buf;
125 size_t recv_buf_len;
126 struct sockaddr *recv_addr;
127 uint16_t recv_read_len;
128};
129
Anas Nashif5fa12072021-03-31 14:39:38 -0400130#endif /* QUECTEL_BG9X_H */