Skip to content

Commit 465b74e

Browse files
iabdalkaderdpgeorge
authored andcommitted
drivers/ninaw10: Add NIC-level ioctl function.
This commit adds support in the driver for irregular commands. It currently supports setting GPIO pin mode, and GPIO pin read/write value.
1 parent 5d6408f commit 465b74e

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

drivers/ninaw10/nina_wifi_drv.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,33 @@ int nina_gethostbyname(const char *name, uint8_t *out_ip) {
701701
return 0;
702702
}
703703

704+
int nina_ioctl(uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface) {
705+
switch (cmd) {
706+
case NINA_CMD_SET_PIN_MODE:
707+
if (len != 2 || nina_send_command_read_ack(NINA_CMD_SET_PIN_MODE,
708+
2, ARG_8BITS, NINA_ARGS(ARG_BYTE(buf[0]), ARG_BYTE(buf[1]))) != SPI_ACK) {
709+
return -1;
710+
}
711+
break;
712+
case NINA_CMD_SET_DIGITAL_WRITE:
713+
if (len != 2 || nina_send_command_read_ack(NINA_CMD_SET_DIGITAL_WRITE,
714+
2, ARG_8BITS, NINA_ARGS(ARG_BYTE(buf[0]), ARG_BYTE(buf[1]))) != SPI_ACK) {
715+
return -1;
716+
}
717+
break;
718+
case NINA_CMD_GET_DIGITAL_READ:
719+
if (len != 1 || nina_send_command_read_vals(NINA_CMD_GET_DIGITAL_READ,
720+
1, ARG_8BITS, NINA_ARGS(ARG_BYTE(buf[0])),
721+
1, ARG_8BITS, NINA_VALS({(uint16_t *)&len, buf})) != 0) {
722+
return -1;
723+
}
724+
break;
725+
default:
726+
return 0;
727+
}
728+
return 0;
729+
}
730+
704731
int nina_socket_socket(uint8_t type) {
705732
uint16_t size = 1;
706733
uint8_t sock = 0;

drivers/ninaw10/nina_wifi_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ int nina_get_rssi(void);
100100
int nina_fw_version(uint8_t *fw_ver);
101101
int nina_set_hostname(const char *name);
102102
int nina_gethostbyname(const char *name, uint8_t *out_ip);
103+
int nina_ioctl(uint32_t cmd, size_t len, uint8_t *buf, uint32_t iface);
103104
int nina_socket_socket(uint8_t type);
104105
int nina_socket_close(int fd);
105106
int nina_socket_bind(int fd, uint8_t *ip, uint16_t port, int type);

extmod/network_ninaw10.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,15 @@ STATIC mp_obj_t network_ninaw10_status(size_t n_args, const mp_obj_t *args) {
317317
}
318318
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(network_ninaw10_status_obj, 1, 2, network_ninaw10_status);
319319

320+
STATIC mp_obj_t network_ninaw10_ioctl(mp_obj_t self_in, mp_obj_t cmd_in, mp_obj_t buf_in) {
321+
nina_obj_t *self = MP_OBJ_TO_PTR(self_in);
322+
mp_buffer_info_t buf;
323+
mp_get_buffer_raise(buf_in, &buf, MP_BUFFER_READ | MP_BUFFER_WRITE);
324+
nina_ioctl(mp_obj_get_int(cmd_in), buf.len, buf.buf, self->itf);
325+
return mp_const_none;
326+
}
327+
STATIC MP_DEFINE_CONST_FUN_OBJ_3(network_ninaw10_ioctl_obj, network_ninaw10_ioctl);
328+
320329
STATIC int network_ninaw10_gethostbyname(mp_obj_t nic, const char *name, mp_uint_t len, uint8_t *out_ip) {
321330
return nina_gethostbyname(name, out_ip);
322331
}
@@ -586,6 +595,7 @@ static const mp_rom_map_elem_t nina_locals_dict_table[] = {
586595
{ MP_ROM_QSTR(MP_QSTR_ifconfig), MP_ROM_PTR(&network_ninaw10_ifconfig_obj) },
587596
{ MP_ROM_QSTR(MP_QSTR_config), MP_ROM_PTR(&network_ninaw10_config_obj) },
588597
{ MP_ROM_QSTR(MP_QSTR_status), MP_ROM_PTR(&network_ninaw10_status_obj) },
598+
{ MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&network_ninaw10_ioctl_obj) },
589599

590600
// Network is not secured.
591601
{ MP_ROM_QSTR(MP_QSTR_OPEN), MP_ROM_INT(NINA_SEC_OPEN) },

0 commit comments

Comments
 (0)