Add support for host based protocol code
This commit is contained in:
parent
c4bc7f524b
commit
c5a0982ee5
|
@ -217,7 +217,8 @@ void capi_DivaStreamingOn(struct capi_pvt *i, byte streamCommand, _cword message
|
||||||
ret = diva_stream_create (&pE->diva_stream, NULL, 255, divaStreamingMessageRx, pE, trace_ident);
|
ret = diva_stream_create (&pE->diva_stream, NULL, 255, divaStreamingMessageRx, pE, trace_ident);
|
||||||
|
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
byte* description = (byte*)pE->diva_stream->description (pE->diva_stream);
|
static byte addie[] = { 0x2d, 0x01, 0x00, 0x00 };
|
||||||
|
byte* description = (byte*)pE->diva_stream->description (pE->diva_stream, addie, (byte)sizeof(addie));
|
||||||
MESSAGE_EXCHANGE_ERROR error;
|
MESSAGE_EXCHANGE_ERROR error;
|
||||||
|
|
||||||
description[1] = streamCommand;
|
description[1] = streamCommand;
|
||||||
|
|
|
@ -33,7 +33,7 @@ typedef struct _diva_segment_alloc_access {
|
||||||
void* (*segment_alloc)(struct _diva_segment_alloc* ifc, dword* lo, dword* hi);
|
void* (*segment_alloc)(struct _diva_segment_alloc* ifc, dword* lo, dword* hi);
|
||||||
void (*segment_free)(struct _diva_segment_alloc* ifc, void* addr, dword lo, dword hi);
|
void (*segment_free)(struct _diva_segment_alloc* ifc, void* addr, dword lo, dword hi);
|
||||||
dword (*get_segment_length)(struct _diva_segment_alloc* ifc);
|
dword (*get_segment_length)(struct _diva_segment_alloc* ifc);
|
||||||
void* (*map_address)(struct _diva_segment_alloc* ifc, dword lo, dword hi);
|
void* (*map_address)(struct _diva_segment_alloc* ifc, dword lo, dword hi, int map_host);
|
||||||
void* (*umap_address)(struct _diva_segment_alloc* ifc, dword lo, dword hi, void* local);
|
void* (*umap_address)(struct _diva_segment_alloc* ifc, dword lo, dword hi, void* local);
|
||||||
int (*write_address)(struct _diva_segment_alloc* ifc, dword lo, dword hi, dword data);
|
int (*write_address)(struct _diva_segment_alloc* ifc, dword lo, dword hi, dword data);
|
||||||
void (*resource_removed)(struct _diva_segment_alloc* ifc);
|
void (*resource_removed)(struct _diva_segment_alloc* ifc);
|
||||||
|
|
|
@ -50,7 +50,7 @@ typedef struct _diva_streaming_idi_host_ifc_w_access {
|
||||||
dword (*get_free)(const struct _diva_streaming_idi_host_ifc_w* ifc);
|
dword (*get_free)(const struct _diva_streaming_idi_host_ifc_w* ifc);
|
||||||
dword (*get_length)(const struct _diva_streaming_idi_host_ifc_w* ifc);
|
dword (*get_length)(const struct _diva_streaming_idi_host_ifc_w* ifc);
|
||||||
byte (*description)(struct _diva_streaming_idi_host_ifc_w* ifc, byte* dst, byte max_length);
|
byte (*description)(struct _diva_streaming_idi_host_ifc_w* ifc, byte* dst, byte max_length);
|
||||||
int (*init)(struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dword counter);
|
int (*init)(struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dword counter, dword info);
|
||||||
diva_streaming_idi_result_t (*sync)(struct _diva_streaming_idi_host_ifc_w* ifc, dword ident);
|
diva_streaming_idi_result_t (*sync)(struct _diva_streaming_idi_host_ifc_w* ifc, dword ident);
|
||||||
diva_streaming_idi_result_t (*trace_ident)(struct _diva_streaming_idi_host_ifc_w* ifc);
|
diva_streaming_idi_result_t (*trace_ident)(struct _diva_streaming_idi_host_ifc_w* ifc);
|
||||||
} diva_streaming_idi_host_ifc_w_access_t;
|
} diva_streaming_idi_host_ifc_w_access_t;
|
||||||
|
|
|
@ -43,7 +43,7 @@ static int write_message (struct _diva_streaming_idi_host_ifc_w* ifc,
|
||||||
const void* data,
|
const void* data,
|
||||||
dword data_length);
|
dword data_length);
|
||||||
static byte description (diva_streaming_idi_host_ifc_w_t* ifc, byte* dst, byte max_length);
|
static byte description (diva_streaming_idi_host_ifc_w_t* ifc, byte* dst, byte max_length);
|
||||||
static int init (struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dword counter);
|
static int init (struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dword counter, dword info);
|
||||||
static diva_streaming_idi_result_t sync_req (struct _diva_streaming_idi_host_ifc_w* ifc, dword ident);
|
static diva_streaming_idi_result_t sync_req (struct _diva_streaming_idi_host_ifc_w* ifc, dword ident);
|
||||||
static int ack_data (struct _diva_streaming_idi_host_ifc_w* ifc, dword length);
|
static int ack_data (struct _diva_streaming_idi_host_ifc_w* ifc, dword length);
|
||||||
static int ack_rx_data (struct _diva_streaming_idi_host_ifc_w* ifc, dword length, int flush_ack);
|
static int ack_rx_data (struct _diva_streaming_idi_host_ifc_w* ifc, dword length, int flush_ack);
|
||||||
|
@ -322,13 +322,15 @@ static byte description (diva_streaming_idi_host_ifc_w_t* ifc, byte* dst, byte m
|
||||||
return (length);
|
return (length);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init (struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dword counter) {
|
static int init (struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dword counter, dword info) {
|
||||||
diva_segment_alloc_access_t* segment_alloc_access = diva_get_segment_alloc_ifc (ifc->segment_alloc);
|
diva_segment_alloc_access_t* segment_alloc_access = diva_get_segment_alloc_ifc (ifc->segment_alloc);
|
||||||
|
|
||||||
ifc->remote_counter_offset = counter % (4*1024);
|
ifc->remote_counter_offset = counter % (4*1024);
|
||||||
ifc->remote_counter_base = counter - ifc->remote_counter_offset;
|
ifc->remote_counter_base = counter - ifc->remote_counter_offset;
|
||||||
|
|
||||||
ifc->remote_counter_mapped_base = segment_alloc_access->map_address (ifc->segment_alloc, ifc->remote_counter_base, 0);
|
ifc->remote_counter_mapped_base = segment_alloc_access->map_address (ifc->segment_alloc,
|
||||||
|
ifc->remote_counter_base, 0,
|
||||||
|
(info & DIVA_STREAMING_MANAGER_HOST_USER_MODE_STREAM) != 0);
|
||||||
if (ifc->remote_counter_mapped_base != 0) {
|
if (ifc->remote_counter_mapped_base != 0) {
|
||||||
byte* p = ifc->remote_counter_mapped_base;
|
byte* p = ifc->remote_counter_mapped_base;
|
||||||
ifc->remote_counter_mapped = (dword*)&p[ifc->remote_counter_offset];
|
ifc->remote_counter_mapped = (dword*)&p[ifc->remote_counter_offset];
|
||||||
|
|
|
@ -253,7 +253,7 @@ static int diva_streaming_idi_host_rx_process_message (struct _diva_streaming_id
|
||||||
|
|
||||||
DBG_TRC(("version:%u counter:%08x info:%08x [%s]", version, counter, info, ifc->trace_ident))
|
DBG_TRC(("version:%u counter:%08x info:%08x [%s]", version, counter, info, ifc->trace_ident))
|
||||||
|
|
||||||
ifc->tx_ifc->init (ifc->tx, version, counter);
|
ifc->tx_ifc->init (ifc->tx, version, counter, info);
|
||||||
ifc->tx_ifc->trace_ident (ifc->tx);
|
ifc->tx_ifc->trace_ident (ifc->tx);
|
||||||
ifc->notify_user_proc (ifc->user_context, DIVA_STREAM_MESSAGE_INIT << 8 | 0xffU, 0, 0, 0);
|
ifc->notify_user_proc (ifc->user_context, DIVA_STREAM_MESSAGE_INIT << 8 | 0xffU, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ static diva_streaming_idi_result_t diva_stream_manager_release (struct _diva_str
|
||||||
static diva_streaming_idi_result_t diva_stream_manager_release_stream (struct _diva_stream* ifc);
|
static diva_streaming_idi_result_t diva_stream_manager_release_stream (struct _diva_stream* ifc);
|
||||||
static diva_streaming_idi_result_t diva_stream_manager_write (struct _diva_stream* ifc, dword message, const void* data, dword length);
|
static diva_streaming_idi_result_t diva_stream_manager_write (struct _diva_stream* ifc, dword message, const void* data, dword length);
|
||||||
static diva_streaming_idi_result_t diva_stream_manager_wakeup (struct _diva_stream* ifc);
|
static diva_streaming_idi_result_t diva_stream_manager_wakeup (struct _diva_stream* ifc);
|
||||||
static const byte* diva_stream_manager_description (struct _diva_stream* ifc);
|
static const byte* diva_stream_manager_description (struct _diva_stream* ifc, const byte* addie, byte addielen);
|
||||||
static diva_streaming_idi_result_t diva_stream_manager_sync_req (struct _diva_stream* ifc, dword ident);
|
static diva_streaming_idi_result_t diva_stream_manager_sync_req (struct _diva_stream* ifc, dword ident);
|
||||||
static diva_streaming_idi_result_t diva_stream_flush (struct _diva_stream* ifc);
|
static diva_streaming_idi_result_t diva_stream_flush (struct _diva_stream* ifc);
|
||||||
static dword diva_stream_get_tx_free (const struct _diva_stream* ifc);
|
static dword diva_stream_get_tx_free (const struct _diva_stream* ifc);
|
||||||
|
@ -193,7 +193,7 @@ static diva_streaming_idi_result_t diva_stream_manager_wakeup (struct _diva_stre
|
||||||
return (pI->rx_ifc->wakeup (pI->rx));
|
return (pI->rx_ifc->wakeup (pI->rx));
|
||||||
}
|
}
|
||||||
|
|
||||||
const byte* diva_stream_manager_description (struct _diva_stream* ifc) {
|
const byte* diva_stream_manager_description (struct _diva_stream* ifc, const byte* addie, byte addielen) {
|
||||||
diva_stream_manager_t* pI = DIVAS_CONTAINING_RECORD(ifc, diva_stream_manager_t, ifc);
|
diva_stream_manager_t* pI = DIVAS_CONTAINING_RECORD(ifc, diva_stream_manager_t, ifc);
|
||||||
byte length = 4, len_tx, len_rx;
|
byte length = 4, len_tx, len_rx;
|
||||||
|
|
||||||
|
@ -209,6 +209,21 @@ const byte* diva_stream_manager_description (struct _diva_stream* ifc) {
|
||||||
pI->description[2] = len_rx+len_tx+1; /* Structure length */
|
pI->description[2] = len_rx+len_tx+1; /* Structure length */
|
||||||
pI->description[3] = 0; /* Version */
|
pI->description[3] = 0; /* Version */
|
||||||
|
|
||||||
|
if (addie != 0 && addielen != 0) {
|
||||||
|
byte* description = &pI->description[0];
|
||||||
|
byte* start = &description[3];
|
||||||
|
|
||||||
|
start[0] |= 2U;
|
||||||
|
start = start + start[-1];
|
||||||
|
memcpy (start, addie, addielen);
|
||||||
|
start += addielen;
|
||||||
|
*start++ = 0;
|
||||||
|
|
||||||
|
description[2] += addielen+1;
|
||||||
|
description[0] += addielen+1;
|
||||||
|
length += addielen+1;
|
||||||
|
}
|
||||||
|
|
||||||
DBG_TRC(("description length %u [%s]", length, pI->trace_ident))
|
DBG_TRC(("description length %u [%s]", length, pI->trace_ident))
|
||||||
DBG_BLK(((void*)pI->description, length))
|
DBG_BLK(((void*)pI->description, length))
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ typedef struct _diva_stream {
|
||||||
diva_streaming_idi_result_t (*release_stream)(struct _diva_stream* ifc); /**< destroy stream */
|
diva_streaming_idi_result_t (*release_stream)(struct _diva_stream* ifc); /**< destroy stream */
|
||||||
diva_streaming_idi_result_t (*write)(struct _diva_stream* ifc, dword message, const void* data, dword length); /**< write data to stream */
|
diva_streaming_idi_result_t (*write)(struct _diva_stream* ifc, dword message, const void* data, dword length); /**< write data to stream */
|
||||||
diva_streaming_idi_result_t (*wakeup)(struct _diva_stream* ifc);
|
diva_streaming_idi_result_t (*wakeup)(struct _diva_stream* ifc);
|
||||||
const byte* (*description)(struct _diva_stream* ifc);
|
const byte* (*description)(struct _diva_stream* ifc, const byte* addie, byte addielength);
|
||||||
diva_streaming_idi_result_t (*sync)(struct _diva_stream* ifc, dword ident);
|
diva_streaming_idi_result_t (*sync)(struct _diva_stream* ifc, dword ident);
|
||||||
diva_streaming_idi_result_t (*flush_stream)(struct _diva_stream* ifc);
|
diva_streaming_idi_result_t (*flush_stream)(struct _diva_stream* ifc);
|
||||||
dword (*get_tx_free)(const struct _diva_stream* ifc);
|
dword (*get_tx_free)(const struct _diva_stream* ifc);
|
||||||
|
@ -57,6 +57,7 @@ typedef struct _diva_stream {
|
||||||
#define DIVA_STREAM_MESSAGE_INIT_ERROR 0x00000007 /** Stream init error */
|
#define DIVA_STREAM_MESSAGE_INIT_ERROR 0x00000007 /** Stream init error */
|
||||||
#define DIVA_STREAM_MESSAGE_RELEASED 0x00000008 /** Not message, used internally */
|
#define DIVA_STREAM_MESSAGE_RELEASED 0x00000008 /** Not message, used internally */
|
||||||
|
|
||||||
|
#define DIVA_STREAMING_MANAGER_HOST_USER_MODE_STREAM 0x40000000U
|
||||||
|
|
||||||
diva_streaming_idi_result_t diva_stream_create_with_user_segment_alloc (struct _diva_stream** ifc,
|
diva_streaming_idi_result_t diva_stream_create_with_user_segment_alloc (struct _diva_stream** ifc,
|
||||||
void* os_context,
|
void* os_context,
|
||||||
|
|
|
@ -80,7 +80,7 @@ static dword get_segment_length_proc(struct _diva_segment_alloc*);
|
||||||
#if defined(DIVA_USERMODE)
|
#if defined(DIVA_USERMODE)
|
||||||
static int map_entry (struct _diva_segment_alloc* pI, diva_map_entry_t* pE);
|
static int map_entry (struct _diva_segment_alloc* pI, diva_map_entry_t* pE);
|
||||||
#endif
|
#endif
|
||||||
static void* map_address (struct _diva_segment_alloc* ifc, dword lo, dword hi);
|
static void* map_address (struct _diva_segment_alloc* ifc, dword lo, dword hi, int map_host);
|
||||||
static void* umap_address (struct _diva_segment_alloc* ifc, dword lo, dword hi, void* local);
|
static void* umap_address (struct _diva_segment_alloc* ifc, dword lo, dword hi, void* local);
|
||||||
static int write_address (struct _diva_segment_alloc* ifc, dword lo, dword hi, dword data);
|
static int write_address (struct _diva_segment_alloc* ifc, dword lo, dword hi, dword data);
|
||||||
static void resource_removed (struct _diva_segment_alloc* ifc);
|
static void resource_removed (struct _diva_segment_alloc* ifc);
|
||||||
|
@ -331,14 +331,14 @@ static int map_entry (struct _diva_segment_alloc* pI, diva_map_entry_t* pE) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void* map_address (struct _diva_segment_alloc* pI, dword lo, dword hi) {
|
static void* map_address (struct _diva_segment_alloc* pI, dword lo, dword hi, int map_host) {
|
||||||
void* ret = 0;
|
void* ret = 0;
|
||||||
|
|
||||||
#if defined(DIVA_USERMODE)
|
#if defined(DIVA_USERMODE)
|
||||||
#if defined(LINUX)
|
#if defined(LINUX)
|
||||||
qword addr = ((qword)lo) | (((qword)hi) << 32);
|
qword addr = ((qword)lo) | (((qword)hi) << 32);
|
||||||
|
|
||||||
ret = mmap (0, 4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, pI->fd_mem, addr);
|
ret = mmap (0, 4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, (map_host == 0) ? pI->fd_mem : pI->fd, addr);
|
||||||
if (ret == ((void*)-1)) {
|
if (ret == ((void*)-1)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue