Forum | Documentation | Website | Blog

Skip to content
Snippets Groups Projects
Verified Commit 21796f3f authored by Ayush Singh's avatar Ayush Singh
Browse files

Implement SVC hello request


AP gets pretty chatty after hello request. Will need to implement lot
more svc responses.

Signed-off-by: default avatarAyush Singh <ayushsingh1325@gmail.com>
parent b72dde12
1 merge request!2HDLC MR
Pipeline #4710 passed with stage
in 2 minutes and 27 seconds
......@@ -16,6 +16,8 @@
/* Greybus SVC request types */
#define GB_SVC_TYPE_PROTOCOL_VERSION_REQUEST 0x01
#define GB_SVC_TYPE_PROTOCOL_VERSION_RESPONSE 0x81
#define GB_SVC_TYPE_HELLO_REQUEST 0x02
#define GB_SVC_TYPE_HELLO_RESPONSE 0x82
#define GB_SVC_TYPE_PING_REQUEST 0x13
#define GB_SVC_TYPE_PING_RESPONSE 0x93
......
......@@ -84,6 +84,17 @@ static inline bool gb_hdr_is_response(const struct gb_operation_msg_hdr *hdr) {
return hdr->type & GB_TYPE_RESPONSE_FLAG;
}
/*
* Check if the greybus message header is a successful.
*
* @param hdr: greybus header
*
* @return true if message is successful, else false.
*/
static inline bool gb_hdr_is_success(const struct gb_operation_msg_hdr *hdr) {
return hdr->status == 0x00;
}
/*
* Check if the greybus message is a response.
*
......@@ -95,6 +106,17 @@ static inline bool gb_message_is_response(const struct gb_message *msg) {
return gb_hdr_is_response(&msg->header);
}
/*
* Check if the greybus message is a successful.
*
* @param msg: greybus message
*
* @return true if message is successful, else false.
*/
static inline bool gb_message_is_success(const struct gb_message *msg) {
return gb_hdr_is_success(&msg->header);
}
/*
* Deallocate a greybus message.
*
......
#include "svc.h"
#include "ap.h"
#include "greybus_protocol.h"
#include "operations.h"
#include <errno.h>
......@@ -6,17 +7,63 @@
#include <zephyr/logging/log.h>
#include <zephyr/net/socket.h>
#define ENDO_ID 0x4755
LOG_MODULE_DECLARE(cc1352_greybus, CONFIG_BEAGLEPLAY_GREYBUS_LOG_LEVEL);
struct gb_common_version_request {
struct svc_control_data {
struct k_fifo pending_read;
};
static struct svc_control_data svc_ctrl_data;
struct gb_svc_version_request {
uint8_t major;
uint8_t minor;
} __packed;
/* SVC protocol hello request */
struct gb_svc_hello_request {
uint16_t endo_id;
uint8_t interface_id;
} __packed;
static int control_send_request(void *payload, size_t payload_len,
uint8_t request_type) {
struct gb_message *msg;
msg = gb_message_request_alloc(payload, payload_len, request_type, false);
if (msg == NULL) {
return -ENOMEM;
}
k_fifo_put(&svc_ctrl_data.pending_read, msg);
return SUCCESS;
}
int svc_send_version() {
struct gb_svc_version_request req = {.major = GB_SVC_VERSION_MAJOR,
.minor = GB_SVC_VERSION_MINOR};
return control_send_request(&req, sizeof(struct gb_svc_version_request),
GB_SVC_TYPE_PROTOCOL_VERSION_REQUEST);
}
int svc_send_ping() {
return control_send_request(NULL, 0, GB_SVC_TYPE_PING_REQUEST);
}
int svc_send_hello() {
struct gb_svc_hello_request req = {.endo_id = ENDO_ID,
.interface_id = AP_INF_ID};
return control_send_request(&req, sizeof(struct gb_svc_hello_request),
GB_SVC_TYPE_HELLO_REQUEST);
}
static void svc_version_response_handler(struct gb_message *msg) {
struct gb_common_version_request *response =
(struct gb_common_version_request *)msg->payload;
struct gb_svc_version_request *response =
(struct gb_svc_version_request *)msg->payload;
LOG_DBG("SVC Protocol Version %u.%u", response->major, response->minor);
svc_send_hello();
}
static void svc_ping_response_handler(struct gb_message *msg) {
......@@ -24,6 +71,10 @@ static void svc_ping_response_handler(struct gb_message *msg) {
LOG_DBG("Received Pong");
}
static void svc_hello_response(struct gb_message *msg) {
LOG_DBG("Hello Response Success");
}
static void gb_handle_msg(struct gb_message *msg) {
switch (msg->header.type) {
case GB_SVC_TYPE_PROTOCOL_VERSION_RESPONSE:
......@@ -32,20 +83,17 @@ static void gb_handle_msg(struct gb_message *msg) {
case GB_SVC_TYPE_PING_RESPONSE:
svc_ping_response_handler(msg);
break;
case GB_SVC_TYPE_HELLO_RESPONSE:
svc_hello_response(msg);
break;
default:
LOG_WRN("Handling SVC operation Type %u not supported yet",
LOG_WRN("Handling SVC operation Type %X not supported yet",
msg->header.type);
}
gb_message_dealloc(msg);
}
struct svc_control_data {
struct k_fifo pending_read;
};
static struct svc_control_data svc_ctrl_data;
static struct gb_message *svc_inf_read(struct gb_controller *ctrl,
uint16_t cport_id) {
struct gb_message *msg = k_fifo_get(&svc_ctrl_data.pending_read, K_NO_WAIT);
......@@ -63,30 +111,6 @@ static struct gb_interface intf = {.id = SVC_INF_ID,
.write = svc_inf_write,
.ctrl_data = &svc_ctrl_data}};
static int control_send_request(void *payload, size_t payload_len,
uint8_t request_type) {
struct gb_message *msg;
msg = gb_message_request_alloc(payload, payload_len, request_type, false);
if (msg == NULL) {
return -ENOMEM;
}
k_fifo_put(&svc_ctrl_data.pending_read, msg);
return SUCCESS;
}
int svc_send_version() {
struct gb_common_version_request req = {.major = GB_SVC_VERSION_MAJOR,
.minor = GB_SVC_VERSION_MINOR};
return control_send_request(&req, sizeof(struct gb_common_version_request),
GB_SVC_TYPE_PROTOCOL_VERSION_REQUEST);
}
int svc_send_ping() {
return control_send_request(NULL, 0, GB_SVC_TYPE_PING_REQUEST);
}
struct gb_interface *svc_init() {
k_fifo_init(&svc_ctrl_data.pending_read);
return &intf;
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment