Skip to content

Commit

Permalink
version 2.13.0.4
Browse files Browse the repository at this point in the history
  • Loading branch information
ajisilabs committed Jan 8, 2025
1 parent f73c4df commit 5cbe5a3
Show file tree
Hide file tree
Showing 42 changed files with 2,353 additions and 660 deletions.
Binary file modified Firmware/pmemdata_wlan_bt_9117
Binary file not shown.
Empty file modified LICENSE
100644 → 100755
Empty file.
6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,10 @@ COMMAND_84_ERROR_WAR=y
mac80211 will do scan
OFFLOAD_SCAN_TO_DEVICE=y

EXTRA_CFLAGS += -DLINUX -Wimplicit -Wstrict-prototypes -Wall -Wno-implicit-fallthrough
#Uncomment below line to skip loading firmware
#EXTRA_CFLAGS += -DNO_FIRMWARE_LOAD_SUPPORT

EXTRA_CFLAGS += -DLINUX -Wimplicit -Wstrict-prototypes -Wall -Wno-implicit-fallthrough -Wno-address
EXTRA_CFLAGS += -I$(PWD)/include
EXTRA_CFLAGS += -DCONFIG_RSI_DEBUGFS

Expand Down Expand Up @@ -204,3 +207,4 @@ clean:
@find . -name 'onebox_util' | xargs rm -rf
@find . -name 'transmit' | xargs rm -rf
@find . -name 'transmit_packet' | xargs rm -rf
@find . -name 'mfg' | xargs rm -rf
83 changes: 59 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,59 @@
# SiWT917 Open Source Driver

This software package contains following folders/files :

## Package

SiWT917.X.X.X.X

├── Firmware
├── apps
├── release
└── rsi

## Content Description

- Firmware : This folder contains firmware binary for SiWT917.

- apps : This folder contains driver tools source code.

- release : This folder contains kernel modules, configuration files of
supplicant, hostapd and script files.

- rsi : This folder contains SiWT917 RCP driver source code.

# SiWT917 Open Source Driver
The SiWT917 RCP Driver is a SoftMAC driver that interacts with the Linux wireless MAC layer, MAC80211. It consists of simple and efficient kernel modules that currently support SiWT917 RCP chipsets and can be ported to any embedded platform, in addition to the X-86 platform.

- [Release Notes](#release-notes)
- [Licensing](#licensing)
- [Documentation](#documentation)
- [Software Reference](#software-reference)
- [Hardware Reference](#hardware-reference)
- [Package structure](#Package-structure)



## Release Notes

- See [here](https://github.com/SiliconLabs/si91x-rcp-driver/blob/master/docs/release-notes/index.md) for the latest RCP release notes.

## Licensing

The default license for SiWT917 RCP Driver is [GNU General Public License v2.0](https://github.com/SiliconLabs/si91x-rcp-driver/blob/master/LICENSE).

## Documentation

The online RCP documentation is available [here](https://docs.silabs.com/wifi91xrcp/latest/wifi91xrcp-developing-in-rcp-mode/).

### Software Reference

- See the [Getting Started Guide](https://docs.silabs.com/wifi91xrcp/latest/wifi91xrcp-getting-started/) section for instructions on how to set up the SiWT917 Linux driver in RCP mode.
- [SiWT917 Software Reference Manual](https://docs.silabs.com/wifi91xrcp/latest/wifi91xrcp-developers-guide-overview/)

### Hardware Reference

- [SiWT917 RCP Datasheet](https://www.silabs.com/documents/public/data-sheets/siwt917-rcp-datasheet.pdf)


## Package Structure

This software package contains following folders/files :

SiWT917.X.X.X.X

├── Firmware
├── apps
├── release
├── rsi
└── docs

### Content Description

- Firmware : This folder contains firmware binary for SiWT917.

- apps : This folder contains driver tools source code.

- release : This folder contains kernel modules, configuration files of
supplicant, hostapd and script files.

- rsi : This folder contains SiWT917 RCP driver source code.

- docs : This folder contains release notes.

3 changes: 3 additions & 0 deletions apps/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ all:
$(CC) -o ble_receive ble_receive.c per_sock.c $(CFLAGS)
$(CC) -o transmit_packet transmit_packet.c per_sock.c $(CFLAGS)
$(CC) -o bbp_util matlab_utils.c per_sock.c -lm -lpthread $(CFLAGS)
#Uncomment the -D DEBUG flags in the below statement to increase log level for cmfg
$(CC) -o mfg cmfg/*.c -Icmfg/ #-D DEBUG

@echo -e "Copying to release folder...."
$(cpy) receive ../release/
Expand All @@ -29,3 +31,4 @@ all:
$(cpy) transmit_packet ../release/
$(cpy) bt_ble_gain_table_update ../release/
$(cpy) bbp_util ../release/
$(cpy) mfg ../release/
11 changes: 10 additions & 1 deletion apps/ble_transmit.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,16 @@ int main(int argc, char *argv[])
printf("Invalid rf chain \n");
return ONEBOX_STATUS_FAILURE;
}

//__9117_CODE_START
#ifdef CONFIG_917
if ((ble_per_params.ble_rate == BLE_2MBPS)) {
if ((ble_per_params.bt_tx_rf_chnl == 39) || (ble_per_params.bt_rx_rf_chnl == 39)) {
printf("invalid rf channel configuration");
return ONEBOX_STATUS_FAILURE;
}
}
#endif
//__9117_CODE_END
printf("the packet length is %d \n", ble_per_params.pkt_length);

bb_rf_params.value = PER_BLE_TRANSMIT;
Expand Down
48 changes: 41 additions & 7 deletions apps/bt_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ int main(int argc, char *argv[])
int cmdNo = -1;
struct bb_rf_param_bt_t bb_rf_params;
int no_of_packets;
unsigned int bb_addr = 0, bb_val = 0;
unsigned int bb_addr = 0, bb_val = 0, len = 0;
unsigned char ii = 0;
struct nlmsghdr *nlh;

memset(&bb_rf_params, 0, sizeof(bb_rf_params));

Expand All @@ -52,7 +54,7 @@ int main(int argc, char *argv[])
return ONEBOX_STATUS_FAILURE;
}
} else {
printf("Usage: ./bt_util bt_e2e_stats < filename >\n");
usage();
}

} break;
Expand All @@ -62,7 +64,7 @@ int main(int argc, char *argv[])
return ONEBOX_STATUS_FAILURE;
}
} else {
printf("Usage: ./bt_util bt_e2e_periodic_stats < filename > < duration >\n");
usage();
}
} break;
case RSI_GET_BT_STATS: {
Expand All @@ -72,7 +74,7 @@ int main(int argc, char *argv[])
return ONEBOX_STATUS_FAILURE;
}
} else {
printf("Usage: ./bt_util bt_stats < filename > <no_of_packets>\n");
usage();
}
} break;

Expand All @@ -87,14 +89,43 @@ int main(int argc, char *argv[])
bb_rf_params.Data[0] = bb_addr;
bb_rf_params.Data[1] = bb_val;
} else {
printf("Usage: bb_write addr \n");
usage();
return ONEBOX_STATUS_FAILURE;
}
if (send_bb_write_frame_to_drv(bb_rf_params, sfd) < 0) {
if (send_bb_read_write_frame_to_drv(bb_rf_params, sfd) < 0) {
printf("Unable to perform BB_WRITE\n");
} else
printf("SUCCESS Writing to BB: \n");
break;
case RSI_SET_BB_READ:
len = sizeof(bb_rf_params);
if (argc == 3) {
bb_addr = strtol(argv[2], NULL, 16);
ONEBOX_PRINT("BB addr: 0x%x \n", bb_addr);
bb_rf_params.value = 0; //BB_READ_TYPE
bb_rf_params.no_of_values = 1;
bb_rf_params.soft_reset = 0;
bb_rf_params.Data[0] = bb_addr;
} else {
usage();
return ONEBOX_STATUS_FAILURE;
}
if (send_bb_read_write_frame_to_drv(bb_rf_params, sfd) < 0) {
printf("Unable to perform BB_READ\n");
} else
printf("SUCCESS in Reading BB: \n");
nlh = common_recv_mesg_wrapper(sfd, len);
if (nlh == NULL) {
printf("Error receving from bb\n");
break;
} else {
memcpy(&bb_rf_params, NLMSG_DATA(nlh), len);
for (ii = 0; ii < bb_rf_params.no_of_values; ii++) {
printf("BB_read value is 0x%x\n", bb_rf_params.Data[ii]);
}
}
free(nlh);
break;
default:
break;
}
Expand Down Expand Up @@ -180,7 +211,7 @@ int send_bt_stat_frame_to_drv(struct bb_rf_param_bt_t bb_rf_params, int sfd)
return ret;
}

int send_bb_write_frame_to_drv(struct bb_rf_param_bt_t bb_rf_params, int sfd)
int send_bb_read_write_frame_to_drv(struct bb_rf_param_bt_t bb_rf_params, int sfd)
{
struct sockaddr_nl dest_addr;
struct nlmsghdr *nlh = NULL;
Expand Down Expand Up @@ -586,6 +617,8 @@ int get_bt_cmdnumber(char *command)
return RSI_GET_BT_STATS;
else if (!strcmp(command, "bb_write"))
return RSI_SET_BB_WRITE;
else if (!strcmp(command, "bb_read"))
return RSI_SET_BB_READ;
else
usage();
return ONEBOX_STATUS_SUCCESS;
Expand All @@ -601,5 +634,6 @@ void usage()
ONEBOX_PRINT("Usage: ./bt_util bt_e2e_periodic_stats < filename > < duration >\n");
ONEBOX_PRINT("Usage: ./bt_util bt_stats < filename > <no_of_packets>\n");
ONEBOX_PRINT("Usage: ./bt_util bb_write <addr> < value> \n");
ONEBOX_PRINT("Usage: ./bt_util bb_read <addr>\n");
return;
}
109 changes: 109 additions & 0 deletions apps/cmfg/cmfg.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright 2020-2023 Silicon Labs, Inc.
*/

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>

#include <arpa/inet.h>
#include <sys/socket.h>
#include <linux/netlink.h>

#define SOCKET_PROTOCOL 31

// Minimun TX packet length
#define TX_CMD_DESC 14
// Minimun RX packet length
#define RX_CMD_DESC 10
// Maximum TX packet buffer
#define MAX_TX_BUFF_SUPPORTED (4096 + TX_CMD_DESC)
// Maximum RX packet buffer
#define MAX_RX_BUFF_SUPPORTED (4096 + RX_CMD_DESC)

// MCU commands
#define RESET_INTERFACE_COMMAND 0x0000
#define INIT_INTERFACE_COMMAND 0x0001
#define RESET_TARGET_COMMAND 0x0002
#define POWER_TARGET_COMMAND 0x0003
#define READ_MEMORY_COMMAND 0x0004
#define WRITE_MEMORY_COMMAND 0x0005

// Error Marcos
#define MEMORY_ALLOCATION_FAILURE 0x0
#define TX_PACKET_CRC_CHECK_ERROR 0xE0
#define RX_PACKET_CRC_CHECK_ERROR 0xE1
#define INVALID_COMMAND 0xE2
#define UNSUPPORTED_COMMAND 0xE3
#define SOFT_RESET_TARGET 0x4

#define CMFG_MAX_COMMAND_LENGTH MAX_TX_BUFF_SUPPORTED
#define CMFG_MIN_COMMAND_LENGTH TX_CMD_DESC

// Transfer packet Structure
typedef struct tx_packet_command_desc_s {
uint8_t start_tag;
uint8_t sequence_number;
uint16_t packet_length;
uint16_t MCU_command;
uint16_t length;
uint32_t address;
uint8_t content[0];
} tx_packet_command_desc_t;

// Receive Packet Structure
typedef struct rx_packet_command_desc_s {
uint8_t start_tag;
uint8_t sequence_number;
uint16_t packet_length;
uint32_t status;
uint8_t content[0];
} rx_packet_command_desc_t;

// TCP socket related
#define SOURCE_PORT 51917
int tcp_server(void);
int server_response(rx_packet_command_desc_t *, uint16_t, int);
int process_request(tx_packet_command_desc_t *, uint16_t, int);
int allocate_tx_buffer(tx_packet_command_desc_t **);
void allocate_rx_buffer(rx_packet_command_desc_t **);
void sig_handler(int);
void interrupt_checker(void);

// Netlink socket related
#define WLAN_PACKET 1
#define MANUFACTURING 16
#define MFG_READ 'R'
#define MFG_WRITE 'W'
#define MFG_RESET 'X'
// Master structure for read and write
typedef struct mfg_rw_s {
uint32_t address;
uint16_t length;
uint8_t data[MAX_TX_BUFF_SUPPORTED];
uint32_t reset_value;
char read_write;
} mfg_rw_t;
//Command Type
struct rsi_nl_desc {
uint16_t desc_word[0];
};

extern int netlink_sfd;
int netlink_socket_creation(void);
int send_tx_packet(mfg_rw_t *, int, int);
int receive_rx_packet(mfg_rw_t *, int, int);

// Device R/W Routines
void reset_routine(rx_packet_command_desc_t *, int);
void read_routine(rx_packet_command_desc_t *, tx_packet_command_desc_t *, int);
void write_routine(rx_packet_command_desc_t *, tx_packet_command_desc_t *, int);

// CRC related
uint16_t crc16_computation(uint8_t *, uint16_t);
void rx_crc_check(rx_packet_command_desc_t *, uint32_t content_len);
Loading

0 comments on commit 5cbe5a3

Please sign in to comment.