Skip to content

Commit c4e404b

Browse files
committed
drivers: modem: HL78XX Modem Driver
Adding HL78XX Modem Driver Implementation Using Modem Chat Framework Signed-off-by: Zafer SEN <zafersn93@gmail.com>
1 parent f3ea6c6 commit c4e404b

File tree

7 files changed

+57
-52
lines changed

7 files changed

+57
-52
lines changed

drivers/modem/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,7 @@ if (CONFIG_MODEM_SIM7080)
3535
zephyr_library_sources(simcom-sim7080.c)
3636
endif()
3737

38+
add_subdirectory_ifdef(CONFIG_MODEM_HL78XX hl78xx)
39+
3840
zephyr_library_sources_ifdef(CONFIG_MODEM_CELLULAR modem_cellular.c)
3941
zephyr_library_sources_ifdef(CONFIG_MODEM_AT_SHELL modem_at_shell.c)

drivers/modem/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ source "drivers/modem/Kconfig.cellular"
194194
source "drivers/modem/Kconfig.at_shell"
195195

196196
source "drivers/modem/Kconfig.hl7800"
197+
source "drivers/modem/hl78xx/Kconfig.hl78xx"
197198
source "drivers/modem/Kconfig.simcom-sim7080"
198199

199200
endif # MODEM

drivers/modem/hl78xx/hl78xx.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ static const char *hl78xx_state_str(enum hl78xx_state state)
7676
return "power off pulse";
7777
case MODEM_HL78XX_STATE_AWAIT_POWER_OFF:
7878
return "await power off";
79+
default:
80+
return "UNKNOWN state";
7981
}
8082

8183
return "";
@@ -630,6 +632,7 @@ static int hl78xx_on_reset_pulse_state_leave(struct hl78xx_data *data)
630632
static int hl78xx_on_power_on_pulse_state_enter(struct hl78xx_data *data)
631633
{
632634
const struct hl78xx_config *config = (const struct hl78xx_config *)data->dev->config;
635+
633636
gpio_pin_set_dt(&config->mdm_gpio_pwr_on, 1);
634637
hl78xx_start_timer(data, K_MSEC(config->power_pulse_duration_ms));
635638
return 0;
@@ -654,6 +657,7 @@ static void hl78xx_power_on_pulse_event_handler(struct hl78xx_data *data, enum h
654657
static int hl78xx_on_power_on_pulse_state_leave(struct hl78xx_data *data)
655658
{
656659
const struct hl78xx_config *config = (const struct hl78xx_config *)data->dev->config;
660+
657661
gpio_pin_set_dt(&config->mdm_gpio_pwr_on, 0);
658662
hl78xx_stop_timer(data);
659663
return 0;
@@ -691,6 +695,7 @@ static int hl78xx_on_run_init_script_state_enter(struct hl78xx_data *data)
691695
static void hl78xx_run_init_script_event_handler(struct hl78xx_data *data, enum hl78xx_event evt)
692696
{
693697
const struct hl78xx_config *config = (const struct hl78xx_config *)data->dev->config;
698+
694699
switch (evt) {
695700
case MODEM_HL78XX_EVENT_BUS_OPENED:
696701
modem_chat_attach(&data->chat, data->uart_pipe);
@@ -1397,6 +1402,9 @@ static void hl78xx_event_handler(struct hl78xx_data *data, enum hl78xx_event evt
13971402
case MODEM_HL78XX_STATE_AWAIT_POWER_OFF:
13981403
hl78xx_await_power_off_event_handler(data, evt);
13991404
break;
1405+
default:
1406+
LOG_ERR("%d %s unknown event", __LINE__, __func__);
1407+
break;
14001408
}
14011409

14021410
if (state != data->status.state) {
@@ -1586,24 +1594,23 @@ static DEVICE_API(cellular, hl78xx_api) = {
15861594
.reset_pulse_duration_ms = (reset_ms), \
15871595
.startup_time_ms = (startup_ms), \
15881596
.shutdown_time_ms = (shutdown_ms), \
1589-
.autostarts = (start), \
1590-
.init_chat_script = (init_script), \
1591-
}; \
1592-
\
1597+
.autostarts = (start), \
1598+
.init_chat_script = (init_script), \
1599+
}; \
1600+
\
15931601
static struct hl78xx_data hl78xx_data_##inst = { \
1594-
.buffers.delimiter = "\r\n", \
1595-
.buffers.eof_pattern = EOF_PATTERN, \
1596-
}; \
1597-
\
1598-
PM_DEVICE_DT_INST_DEFINE(inst, mdm_hl78xx_driver_pm_action); \
1599-
\
1600-
DEVICE_DT_INST_DEFINE(inst, hl78xx_init, PM_DEVICE_DT_INST_GET(inst), \
1601-
&hl78xx_data_##inst, &hl78xx_cfg_##inst, POST_KERNEL, \
1602+
.buffers.delimiter = "\r\n", \
1603+
.buffers.eof_pattern = EOF_PATTERN, \
1604+
}; \
1605+
\
1606+
PM_DEVICE_DT_INST_DEFINE(inst, mdm_hl78xx_driver_pm_action); \
1607+
DEVICE_DT_INST_DEFINE(inst, hl78xx_init, PM_DEVICE_DT_INST_GET(inst), \
1608+
&hl78xx_data_##inst, &hl78xx_cfg_##inst, POST_KERNEL, \
16021609
CONFIG_MODEM_HL78XX_DEV_INIT_PRIORITY, &hl78xx_api);
16031610

1604-
#define MODEM_DEVICE_SWIR_HL78XX(inst) \
1605-
MODEM_HL78XX_DEFINE_INSTANCE(inst, 1500, 100, 100, 5000, false, \
1606-
&swir_hl78xx_init_chat_script)
1611+
#define MODEM_DEVICE_SWIR_HL78XX(inst) \
1612+
MODEM_HL78XX_DEFINE_INSTANCE(inst, 1500, 100, 100, \
1613+
5000, false, &swir_hl78xx_init_chat_script)
16071614

16081615
#define DT_DRV_COMPAT swir_hl7812
16091616
DT_INST_FOREACH_STATUS_OKAY(MODEM_DEVICE_SWIR_HL78XX)

drivers/modem/hl78xx/hl78xx.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,8 @@ int modem_cmd_send_int(struct hl78xx_data *user_data,
385385
*
386386
* @return Pointer to the beginning of the found needle, or NULL if not found.
387387
*/
388-
void *c99_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
388+
const void *c99_memmem(const void *haystack, size_t haystacklen, const void *needle,
389+
size_t needlelen);
389390

390391
/**
391392
* @brief Generate a pseudo-random MAC address based on the modem's IMEI.
@@ -399,17 +400,14 @@ void *c99_memmem(const void *haystack, size_t haystacklen, const void *needle, s
399400
*
400401
* @return Pointer to the MAC address buffer.
401402
*/
402-
static inline uint8_t *modem_get_mac(uint8_t *mac_addr, char *imei);
403+
static inline uint8_t *modem_get_mac(uint8_t *mac_addr, char *imei)
403404
{
404405
uint32_t hash_value;
405-
/* const char *dummy_imei = "111111111111111"; */
406-
407406
/* Define MAC address prefix */
408407
mac_addr[0] = 0x00;
409408
mac_addr[1] = 0x10;
410409

411410
/* Generate MAC address based on IMEI */
412-
/* hash_value = hash32(dummy_imei, strlen(dummy_imei)); */
413411
hash_value = hash32(imei, strlen(imei));
414412
UNALIGNED_PUT(hash_value, (uint32_t *)(mac_addr + 2));
415413

drivers/modem/hl78xx/hl78xx_sockets.c

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ static int on_cmd_sockread_common(int socket_id, int socket_data_length, uint16_
465465
struct socket_read_data *sock_data;
466466
int ret = 0;
467467
int packet_size = 0;
468-
uint8_t *eof_ptr;
468+
const uint8_t *eof_ptr;
469469
uint8_t sizeto_eliminate;
470470

471471
sock = modem_socket_from_fd(&socket_data.socket_config, socket_id);
@@ -927,7 +927,6 @@ static ssize_t offload_recvfrom(void *obj, void *buf, size_t len, int flags, str
927927
k_work_submit(&socket_data.mdata_global->chat.receive_work);
928928
socket_data.expected_buf_len = 0;
929929
/* clear socket data */
930-
sock->data = NULL;
931930
return ret;
932931
}
933932

@@ -994,7 +993,7 @@ static int send_data_buffer(const char *buf, const size_t buf_len, int *sock_wri
994993
}
995994

996995
ret = modem_pipe_transmit(socket_data.mdata_global->uart_pipe,
997-
((uint8_t *)buf) + offset, len);
996+
((const uint8_t *)buf) + offset, len);
998997
if (ret <= 0) {
999998
LOG_ERR("Transmit error %d", ret);
1000999
return -1;
@@ -1345,13 +1344,11 @@ static bool offload_is_supported(int family, int type, int proto)
13451344
(proto == IPPROTO_TCP || proto == IPPROTO_UDP);
13461345
}
13471346

1348-
#define MODEM_HL78XX_DEFINE_INSTANCE(inst) \
1349-
\
1350-
NET_DEVICE_OFFLOAD_INIT(inst, "hl78xx_dev", NULL, NULL, &socket_data, NULL, \
1351-
CONFIG_MODEM_HL78XX_OFFLOAD_INIT_PRIORITY, &api_funcs, \
1352-
MDM_MAX_DATA_LENGTH); \
1353-
\
1354-
NET_SOCKET_OFFLOAD_REGISTER(inst, CONFIG_NET_SOCKETS_OFFLOAD_PRIORITY, AF_UNSPEC, \
1347+
#define MODEM_HL78XX_DEFINE_INSTANCE(inst) \
1348+
NET_DEVICE_OFFLOAD_INIT(inst, "hl78xx_dev", NULL, NULL, &socket_data, NULL, \
1349+
CONFIG_MODEM_HL78XX_OFFLOAD_INIT_PRIORITY, \
1350+
&api_funcs, MDM_MAX_DATA_LENGTH); \
1351+
NET_SOCKET_OFFLOAD_REGISTER(inst, CONFIG_NET_SOCKETS_OFFLOAD_PRIORITY, AF_UNSPEC, \
13551352
offload_is_supported, offload_socket);
13561353

13571354
#define MODEM_DEVICE_SWIR_HL78XX(inst) MODEM_HL78XX_DEFINE_INSTANCE(inst)

drivers/modem/hl78xx/hl78xx_utility.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,8 @@ bool hl78xx_is_registered(struct hl78xx_data *data)
5757
uint32_t hash32(const char *str, int len)
5858
{
5959
uint32_t h = 0;
60-
int i;
6160

62-
for (i = 0; i < len; ++i) {
61+
for (int i = 0; i < len; ++i) {
6362
h = (h * HASH_MULTIPLIER) + str[i];
6463
}
6564

@@ -69,7 +68,8 @@ uint32_t hash32(const char *str, int len)
6968
/**
7069
* Portable memmem() replacement for C99.
7170
*/
72-
void *c99_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen)
71+
const void *c99_memmem(const void *haystack, size_t haystacklen, const void *needle,
72+
size_t needlelen)
7373
{
7474
if (!haystack || !needle || needlelen == 0 || haystacklen < needlelen) {
7575
return NULL;
@@ -79,7 +79,7 @@ void *c99_memmem(const void *haystack, size_t haystacklen, const void *needle, s
7979

8080
for (size_t i = 0; i <= haystacklen - needlelen; i++) {
8181
if (memcmp(h + i, needle, needlelen) == 0) {
82-
return (void *)(h + i);
82+
return (h + i);
8383
}
8484
}
8585

@@ -118,7 +118,7 @@ int find_apn(char *apn, int apnlen, const char *profiles, const char *associated
118118

119119
int len = eos - s;
120120

121-
if (len > 0 && len < apnlen) {
121+
if (len > 0 && len < apnlen - 1) {
122122
memcpy(apn, s, len);
123123
apn[len] = '\0';
124124
rc = 0;
@@ -142,7 +142,7 @@ int modem_detect_apn(struct hl78xx_data *data, const char *associated_number)
142142
#else
143143
char mmcmnc[8] = {0};
144144
#endif
145-
*mmcmnc = 0;
145+
mmcmnc[0] = '\0';
146146
strncat(mmcmnc, associated_number, sizeof(mmcmnc) - 1);
147147
/* try to find a matching IMSI, and assign the APN */
148148
rc = find_apn(data->identity.apn, sizeof(data->identity.apn),

drivers/modem/modem_socket.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,10 @@ int modem_socket_get(struct modem_socket_config *cfg, int family, int type, int
173173
cfg->sockets[i].family = family;
174174
cfg->sockets[i].type = type;
175175
cfg->sockets[i].ip_proto = proto;
176-
cfg->sockets[i].id = (cfg->assign_id) ? (i + cfg->base_socket_id) :
177-
(cfg->base_socket_id + cfg->sockets_len);
176+
cfg->sockets[i].id = (cfg->assign_id) ? (i + cfg->base_socket_id)
177+
: (cfg->base_socket_id + cfg->sockets_len);
178178
zvfs_finalize_typed_fd(cfg->sockets[i].sock_fd, &cfg->sockets[i],
179-
(const struct fd_op_vtable *)cfg->vtable, ZVFS_MODE_IFSOCK);
179+
(const struct fd_op_vtable *)cfg->vtable, ZVFS_MODE_IFSOCK);
180180

181181
k_sem_give(&cfg->sem_lock);
182182
return cfg->sockets[i].sock_fd;
@@ -342,6 +342,10 @@ int modem_socket_poll_prepare(struct modem_socket_config *cfg, struct modem_sock
342342
struct zsock_pollfd *pfd, struct k_poll_event **pev,
343343
struct k_poll_event *pev_end)
344344
{
345+
printk("poll_prepare on socket %d: requested events: 0x%x\n", sock->id, pfd->events);
346+
347+
bool event_handled = false;
348+
345349
if (pfd->events & ZSOCK_POLLIN) {
346350
if (*pev == pev_end) {
347351
errno = ENOMEM;
@@ -351,19 +355,16 @@ int modem_socket_poll_prepare(struct modem_socket_config *cfg, struct modem_sock
351355
k_poll_event_init(*pev, K_POLL_TYPE_SIGNAL, K_POLL_MODE_NOTIFY_ONLY,
352356
&sock->sig_data_ready);
353357
(*pev)++;
358+
event_handled = true;
354359
}
355-
356360
if (pfd->events & ZSOCK_POLLOUT) {
357-
if (*pev == pev_end) {
358-
errno = ENOMEM;
359-
return -1;
360-
}
361-
/* Not Implemented */
362-
errno = ENOTSUP;
363-
return -1;
361+
printk("POLLOUT requested but not implemented\n");
362+
/*
363+
* You can implement this later when needed
364+
* For now, just ignore it
365+
*/
364366
}
365-
366-
return 0;
367+
return event_handled ? 0 : -ENOTSUP;
367368
}
368369

369370
int modem_socket_poll_update(struct modem_socket *sock, struct zsock_pollfd *pfd,
@@ -459,14 +460,13 @@ bool modem_socket_id_is_assigned(const struct modem_socket_config *cfg,
459460
{
460461
/* Verify socket is assigned to a valid value */
461462
if ((cfg->base_socket_id <= sock->id) &&
462-
(sock->id < (cfg->base_socket_id + cfg->sockets_len))) {
463+
(sock->id < (cfg->base_socket_id + cfg->sockets_len))) {
463464
return true;
464465
}
465466
return false;
466467
}
467468

468-
int modem_socket_id_assign(const struct modem_socket_config *cfg,
469-
struct modem_socket *sock, int id)
469+
int modem_socket_id_assign(const struct modem_socket_config *cfg, struct modem_socket *sock, int id)
470470
{
471471
/* Verify dynamically assigning id is disabled */
472472
if (cfg->assign_id) {

0 commit comments

Comments
 (0)