/dev/mem is accessible for root user only. Implement system call instead of mapping using /dev/mem to access stream counter.
This commit is contained in:
parent
00b4758564
commit
7cb0fe0e8f
|
@ -335,7 +335,7 @@ static int init (struct _diva_streaming_idi_host_ifc_w* ifc, dword version, dwor
|
||||||
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];
|
||||||
} else {
|
} else {
|
||||||
DBG_TRC(("use system call [%s]", ifc->trace_ident))
|
DBG_TRC(("stream uses system call [%s]", ifc->trace_ident))
|
||||||
}
|
}
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
|
|
|
@ -59,6 +59,7 @@ typedef struct _diva_segment_alloc {
|
||||||
#if defined(LINUX)
|
#if defined(LINUX)
|
||||||
int fd;
|
int fd;
|
||||||
int fd_mem;
|
int fd_mem;
|
||||||
|
int fd_xdi;
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
DESCRIPTOR* d;
|
DESCRIPTOR* d;
|
||||||
|
@ -133,9 +134,10 @@ int diva_create_segment_alloc (void* os_context, struct _diva_segment_alloc** s
|
||||||
#if defined(DIVA_USERMODE) /* { */
|
#if defined(DIVA_USERMODE) /* { */
|
||||||
#if defined(LINUX) /* { */
|
#if defined(LINUX) /* { */
|
||||||
pI->fd = open ("/dev/DivasMAP", O_RDWR | O_NONBLOCK); /** \todo use hardware related DMA entry, needs update of XDI driver */
|
pI->fd = open ("/dev/DivasMAP", O_RDWR | O_NONBLOCK); /** \todo use hardware related DMA entry, needs update of XDI driver */
|
||||||
pI->fd_mem = open ("/dev/mem", O_RDWR | O_NONBLOCK);
|
pI->fd_mem = open ("/dev/mem", O_RDWR | O_NONBLOCK); /* /dev/mem is optional */
|
||||||
|
pI->fd_xdi = open ("/dev/DivasXDI", O_RDWR | O_NONBLOCK); /* /dev/mem is optional */
|
||||||
|
|
||||||
if (pI->fd >= 0 && pI->fd_mem >= 0) {
|
if (pI->fd >= 0 && (pI->fd_mem >= 0 || pI->fd_xdi >= 0)) {
|
||||||
*segment_alloc = pI;
|
*segment_alloc = pI;
|
||||||
} else {
|
} else {
|
||||||
diva_destroy_segment_alloc (&pI);
|
diva_destroy_segment_alloc (&pI);
|
||||||
|
@ -214,6 +216,8 @@ int diva_destroy_segment_alloc (struct _diva_segment_alloc** segment_alloc) {
|
||||||
close (pI->fd);
|
close (pI->fd);
|
||||||
if (pI->fd_mem >= 0)
|
if (pI->fd_mem >= 0)
|
||||||
close (pI->fd_mem);
|
close (pI->fd_mem);
|
||||||
|
if (pI->fd_xdi >= 0)
|
||||||
|
close (pI->fd_xdi);
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -337,10 +341,13 @@ static void* map_address (struct _diva_segment_alloc* pI, dword lo, dword hi, in
|
||||||
#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);
|
||||||
|
int effective_map_fd = (map_host == 0) ? pI->fd_mem : pI->fd;
|
||||||
|
|
||||||
ret = mmap (0, 4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, (map_host == 0) ? pI->fd_mem : pI->fd, addr);
|
if (effective_map_fd >= 0) {
|
||||||
if (ret == ((void*)-1)) {
|
ret = mmap (0, 4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, effective_map_fd, addr);
|
||||||
ret = 0;
|
if (ret == ((void*)-1)) {
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
@ -379,10 +386,23 @@ static void* umap_address (struct _diva_segment_alloc* ifc, dword lo, dword hi,
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int write_address (struct _diva_segment_alloc* ifc, dword lo, dword hi, dword data) {
|
static int write_address (struct _diva_segment_alloc* pI, dword lo, dword hi, dword data) {
|
||||||
DBG_ERR(("%s %s at %d", __FILE__, "write_address", __LINE__))
|
diva_xdi_direct_access_cmd_t cmd;
|
||||||
|
int ret;
|
||||||
|
|
||||||
return (-1);
|
if (unlikely(pI->fd_xdi < 0))
|
||||||
|
return (-1);
|
||||||
|
|
||||||
|
|
||||||
|
cmd.hdr.ident = DIVA_XDI_DIRECT_ACCESS_CMD_IDENT;
|
||||||
|
cmd.hdr.cmd = DIVA_XDI_DIRECT_ACCESS_CMD_WRITE_BY_ADDRESS;
|
||||||
|
cmd.cmd.write_by_address.address = lo;
|
||||||
|
cmd.cmd.write_by_address.value = data;
|
||||||
|
|
||||||
|
ret = write (pI->fd_xdi, &cmd, sizeof(cmd.hdr)+sizeof(cmd.cmd.write_by_address)) ==
|
||||||
|
sizeof(cmd.hdr)+sizeof(cmd.cmd.write_by_address) ? 0 : -1;
|
||||||
|
|
||||||
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void resource_removed (struct _diva_segment_alloc* pI) {
|
static void resource_removed (struct _diva_segment_alloc* pI) {
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
Copyright (c) Dialogic (R) 2009 - 2010
|
Copyright (c) Dialogic(R), 2010-2011
|
||||||
|
Copyright 2000-2003 by Armin Schindler (mac@melware.de)
|
||||||
|
Copyright 2000-2003 Cytronics & Melware (info@melware.de)
|
||||||
|
|
||||||
*
|
*
|
||||||
This source file is supplied for the use with
|
This source file is supplied for the use with
|
||||||
Eicon Networks range of DIVA Server Adapters.
|
Dialogic range of Adapters.
|
||||||
*
|
*
|
||||||
Dialogic (R) File Revision : 1.9
|
Dialogic(R) File Revision : 2.1
|
||||||
*
|
*
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -22,6 +26,7 @@
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DIVA_XDI_UM_CFG_MESSSGE_H__
|
#ifndef __DIVA_XDI_UM_CFG_MESSSGE_H__
|
||||||
#define __DIVA_XDI_UM_CFG_MESSAGE_H__
|
#define __DIVA_XDI_UM_CFG_MESSAGE_H__
|
||||||
|
|
||||||
|
@ -307,5 +312,27 @@ typedef struct _diva_xdi_io_cmd {
|
||||||
void * cmd;
|
void * cmd;
|
||||||
} diva_xdi_io_cmd;
|
} diva_xdi_io_cmd;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Diva direct interface access commands
|
||||||
|
*/
|
||||||
|
#define DIVA_XDI_DIRECT_ACCESS_CMD_IDENT 0x1234abcd
|
||||||
|
typedef struct _diva_xdi_direct_access_cmd_hdr {
|
||||||
|
dword ident;
|
||||||
|
dword cmd;
|
||||||
|
} diva_xdi_direct_access_cmd_hdr_t;
|
||||||
|
|
||||||
|
#define DIVA_XDI_DIRECT_ACCESS_CMD_WRITE_BY_ADDRESS 1
|
||||||
|
typedef struct _diva_xdi_direct_access_write_by_address {
|
||||||
|
dword address;
|
||||||
|
dword value;
|
||||||
|
} diva_xdi_direct_access_write_by_address_t;
|
||||||
|
|
||||||
|
typedef struct _diva_xdi_direct_access_cmd {
|
||||||
|
diva_xdi_direct_access_cmd_hdr_t hdr;
|
||||||
|
union {
|
||||||
|
diva_xdi_direct_access_write_by_address_t write_by_address;
|
||||||
|
} cmd;
|
||||||
|
} diva_xdi_direct_access_cmd_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue