nt9856x/code/lib/include/nvtipc.h
2023-03-28 15:07:53 +08:00

556 lines
16 KiB
C
Executable File

/**
This header file of NvtIPC APIs.
This header file of NvtIPC APIs for user space application using.
Applications can use the APIs to communicate with CORE1 and CORE3.
@file nvtipc.h
Copyright Novatek Microelectronics Corp. 2014. All rights reserved.
*/
#ifndef _NVTIPC_H
#define _NVTIPC_H
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
@name Core define value
*/
//@{
#define __CORE1 1 ///< Core MIPS1
#define __CORE2 2 ///< Core MIPS2
#define __CORE3 3 ///< DSP
#define __CORE __CORE2
//#define __CORE __CORE2
//#define __CORE __CORE3
//@}
#define VOS_IPC 1
//------------------------------------------------------------------------------
// Typedefs
//------------------------------------------------------------------------------
typedef signed int NVTIPC_KEY; ///< Signed 16 bits data type
typedef unsigned long NVTIPC_U32; ///< Unsigned 32 bits data type
typedef signed long NVTIPC_I32; ///< Signed 32 bits data type
#ifndef ENUM_DUMMY4WORD
/**
Macro to generate dummy element for enum type to expand enum size to word (4 bytes)
*/
//@{
#define ENUM_DUMMY4WORD(name) E_##name = 0x10000000
//@}
#endif
/**
@name NvtIpc message queue number & size
*/
//@{
#if __CORE == __CORE3
#define NVTIPC_MSG_QUEUE_NUM 4 ///< queue number
#define NVTIPC_MSG_ELEMENT_NUM 32 ///< queue element number
#define NVTIPC_MSG_ELEMENT_SIZE 24 ///< queue element size
#else
#define NVTIPC_MSG_QUEUE_NUM 12 ///< queue number
#define NVTIPC_MSG_ELEMENT_NUM 16 ///< queue element number
#define NVTIPC_MSG_ELEMENT_SIZE 24 ///< queue element size
#endif
//@}
/**
Core ID.
The core ID to send message to.
*/
typedef enum _NVTIPC_SENDTO {
NVTIPC_SENDTO_CORE1 = 1, ///< the core MIPS1
NVTIPC_SENDTO_CORE2 = 2, ///< the core MIPS2
NVTIPC_SENDTO_CORE3 = 3, ///< DSP
NVTIPC_SENDTO_MAX = NVTIPC_SENDTO_CORE3,
ENUM_DUMMY4WORD(NVTIPC_SENDTO)
} NVTIPC_SENDTO;
/**
Sender Core ID.
The Sendor Core ID.
*/
typedef enum _NVTIPC_SENDER {
NVTIPC_SENDER_CORE1 = 1, ///< the CA53 core1
NVTIPC_SENDER_CORE2 = 2, ///< the CA53 core2
NVTIPC_SENDER_CORE3 = 3, ///< DSP 1
NVTIPC_SENDER_MAX = NVTIPC_SENDER_CORE3,
E_NVTIPC_SENDER = 0x10000000
} NVTIPC_SENDER;
/**
Error Code.
Any error code occured will display on uart or return.
*/
typedef enum _NVTIPC_ER {
NVTIPC_ER_OK = 0, ///< no error
NVTIPC_ER_MBX_ID = -1, ///< there is error on mailbox ID
NVTIPC_ER_MSGQUE_ID = -2, ///< there is error on message queue ID
NVTIPC_ER_MSGQUE_FULL = -3, ///< the message queue is full
NVTIPC_ER_SND_MSG = -4, ///< has some error when send msg
NVTIPC_ER_RCV_MSG = -5, ///< has some error when receive msg
NVTIPC_ER_PARM = -6, ///< has some error of input parameter
NVTIPC_ER_NO_MORE_QUEUE = -7, ///< no more message queue to get
NVTIPC_ER_ID_NOT_INSTALLED = -8, ///< the NvtIPC used flag, semaphore ID is not installed
NVTIPC_ER_KEY_DUPLICATE = -9, ///< the NVTIPC_KEY is duplicate with other message queue
NVTIPC_ER_RCVSIZE_OVER_LIMIT = -10, ///< the receive message size over limit
NVTIPC_ER_SNDSIZE_OVER_LIMIT = -11, ///< the send message size over limit
NVTIPC_ER_MSGQUE_RELEASED = -12, ///< the message queue is released
NVTIPC_ER_NOT_OPENED = -13, ///< the ipc is not opened
ENUM_DUMMY4WORD(NVTIPC_ER)
} NVTIPC_ER;
/**
@name the key & queue id of system queue
*/
//@{
#define NVTIPC_SYS_KEY (0x0000FFFF) ///< the key of system queue
#define NVTIPC_SYS_QUEUE_ID (0) ///< the id of system queue
//@}
/**
System command ID.
*/
typedef enum _NVTIPC_SYS_CMD {
NVTIPC_SYSCMD_POWEROFF_REQ = 0, ///< cpu power off request
NVTIPC_SYSCMD_SYSCALL_REQ, ///< system call request
NVTIPC_SYSCMD_SYSCALL_ACK, ///< system call ack
NVTIPC_SYSCMD_UART_REQ, ///< uart command request
NVTIPC_SYSCMD_UART_ACK, ///< uart command ack
NVTIPC_SYSCMD_CPU2_POWERON_READY, ///< CPU2 power on ready
NVTIPC_SYSCMD_DSP_POWERON_READY, ///< DSP power on ready
NVTIPC_SYSCMD_IPC_DUMPINFO, ///< dump debug info
NVTIPC_SYSCMD_SUSPEND_REQ, ///< cpu suspend request
NVTIPC_SYSCMD_SUSPEND_ACK, ///< cpu suspend ack
NVTIPC_SYSCMD_CPU2_RESUME_READY, ///< CPU2 resume ready
NVTIPC_SYSCMD_POWEROFF_ACK, ///< cpu power off ack
NVTIPC_SYSCMD_REBOOT_REQ, ///< system reboot request
NVTIPC_SYSCMD_REBOOT_ACK, ///< system reboot ack
NVTIPC_SYSCMD_APP_POWEROFF_REQ, ///< linux -> uItron ,application power off request
NVTIPC_SYSCMD_APP_POWEROFF_ACK, ///< uItron -> linux ,application power off ack
NVTIPC_SYSCMD_CHK_AVAILABLE_REQ, ///< check available request
NVTIPC_SYSCMD_CHK_AVAILABLE_ACK, ///< check available ack
NVTIPC_SYSCMD_PERF_REQ, ///< ipc command performance request
NVTIPC_SYSCMD_PERF_ACK, ///< ipc command performance ack
NVTIPC_SYSCMD_GET_LONG_COUNTER_REQ, ///< get cpu1 long counter time request
NVTIPC_SYSCMD_GET_LONG_COUNTER_ACK, ///< get cpu1 long counter time ack
ENUM_DUMMY4WORD(NVTIPC_SYS_CMD)
} NVTIPC_SYS_CMD;
/**
System command message info.
*/
typedef struct _NVTIPC_SYS_MSG {
NVTIPC_SYS_CMD sysCmdID; ///< system command ID.
NVTIPC_U32 DataAddr; ///< system command Data Address.
NVTIPC_U32 DataSize; ///< system command Data Size.
NVTIPC_SENDER SenderCoreID; ///< sender CoreID
NVTIPC_I32 ret; ///< system command return result.
} NVTIPC_SYS_MSG;
/**
System performance measure command message info.
*/
typedef struct _NVTIPC_SYS_PERF_MSG {
NVTIPC_SYS_CMD sysCmdID; ///< system command ID.
NVTIPC_U32 perfCoreID1; ///< performance measure core id 1.
NVTIPC_U32 perfCoreID2; ///< performance measure core id 2.
NVTIPC_SENDER SenderCoreID; ///< sender CoreID
NVTIPC_I32 ret; ///< system command return result.
}NVTIPC_SYS_PERF_MSG;
/**
Get long counter command msg info.
*/
typedef struct _NVTIPC_SYS_LONG_COUNTER_MSG {
NVTIPC_U32 sec; ///< long counter sec.
NVTIPC_U32 usec; ///< long counter usec.
} NVTIPC_SYS_LONG_COUNTER_MSG;
/**
The callback function of system call command.
*/
typedef void (*SYSCALL_CMD_FP)(char *cmd);
/**
The callback function of uart command.
*/
typedef int (*UART_CMD_FP)(char *cmd);
/**
The system call command table.
*/
typedef struct _SYSCALL_CMD_TBL {
char *cmd; ///< the command string
SYSCALL_CMD_FP func; ///< the command callback function
} SYSCALL_CMD_TBL;
/**
The NvtIpc init parameter.
*/
typedef struct _NVTIPC_OPEN_OBJ {
NVTIPC_U32 workBuffAddr; ///< the work buffer address
NVTIPC_U32 workBuffSize; ///< the work buffer size
SYSCALL_CMD_TBL *SysCmdTbl; ///< the system call command table.
UART_CMD_FP uartCmdFp; ///< the uart command callback function.
} NVTIPC_OPEN_OBJ;
#if __CORE == __CORE2
typedef enum {
NVTIPC_MEM_TYPE_CACHE = 0, ///< cache memory
NVTIPC_MEM_TYPE_NONCACHE = 1, ///< non-cache memory
NVTIPC_MEM_TYPE_IO = 2, ///< io memory
NVTIPC_MEM_TYPE_MAX,
ENUM_DUMMY4WORD(NVTIPC_MEM_TYPE)
}NVTIPC_MEM_TYPE;
#define NVTIPC_MEM_ADDR_PRE_DEFINED (0x80000000) ///< the starting address of dram1
#define NVTIPC_MEM_ADDR_DRAM1_ALL_FLAG NVTIPC_MEM_ADDR_PRE_DEFINED | 0x00000001 ///<
#define NVTIPC_MEM_ADDR_DRAM2_ALL_FLAG NVTIPC_MEM_ADDR_PRE_DEFINED | 0x00000002 ///<
#define NVTIPC_MEM_MMIO_BASE_ADDR (0xC0000000)
#define NVTIPC_MEM_INVALID_ADDR (0xFFFFFFFF)
#endif
#if __CORE == __CORE1
/**
Install NvtIpc flag and semaphore id.
*/
extern void NvtIpc_InstallID(void) _SECTION(".kercfg_text");
/**
Wait until CPU2 power on ready.
*/
extern void NvtIpc_WaitCPU2PowerOnReady(void);
/**
Wait until DSP power on ready.
*/
extern void NvtIpc_WaitDSPPowerOnReady(void);
#endif
/**
Calculate the needed work buffer size of NvtIpc.
*/
extern NVTIPC_U32 NvtIpc_CalBuffSize(void);
/**
Open NvtIpc task.
This is the NvtIpc task initial function.
@param openObj: the init parameters.
@return
- @b NVTIPC_ER_OK: initial success.
- @b NVTIPC_ER_ID_NOT_INSTALLED: the NvtIpc flag and semaphore id is not installed.
- @b NVTIPC_ER_PARM: the initial parameter has some error.
Example:
@code
{
_ALIGNED(4) static UINT8 WorkBuf[8192];
static SYSCALL_CMD_TBL ipccmd_tbl[]={
{"lviewd",(SYSCALL_CMD_FP)xExamNvtIpc_testsys},
{"hfs",(SYSCALL_CMD_FP)xExamNvtIpc_testsys},
{"",NULL} // this item should be the last item
};
NVTIPC_OPEN_OBJ openObj = {0};
openObj.workBuffAddr = (UINT32)&WorkBuf;
openObj.workBuffSize = sizeof(WorkBuf);
openObj.SysCmdTbl = ipccmd_tbl;
openObj.uartCmdFp = (UART_CMD_FP)SxCmd_DoCommand;
NvtIpc_Open(&openObj);
}
@endcode
*/
extern NVTIPC_ER NvtIpc_Open(NVTIPC_OPEN_OBJ *openObj);
/**
Close NvtIpc task.
@return
- @b NVTIPC_ER_OK: close success.
*/
extern NVTIPC_ER NvtIpc_Close(void);
/**
Get a key by path.
@param path: the path for generate key.
@return The generated hash key.
Example:
@code
{
NVTIPC_KEY key;
key = NvtIPC_Ftok("lviewd");
}
@endcode
*/
extern NVTIPC_KEY NvtIPC_Ftok(const char *path);
/**
Get a new message queue by key
@param key: the key generated by NvtIPC_Ftok().
@return The message queue ID, return < 0 when some error happened.
Example:
@code
{
NVTIPC_KEY key;
NVTIPC_I32 msqid;
key = NvtIPC_Ftok("lviewd");
msqid = NvtIPC_MsgGet(key);
}
@endcode
*/
extern NVTIPC_I32 NvtIPC_MsgGet(NVTIPC_KEY key);
/**
Release a message queue.
@param msqid: the message queue ID.
@return
- @b NVTIPC_ER_OK: Release a message queue success.
- @b NVTIPC_ER_PARM: the input message queue id is incorrect.
Example:
@code
{
NvtIPC_MsgRel(msqid);
}
@endcode
*/
extern NVTIPC_ER NvtIPC_MsgRel(NVTIPC_U32 msqid);
/**
Send a message to other core.
@param msqid: the message queue ID.
@param sendTo: the core to send to.
@param pMsg: the message data address.
@param msgsz: the message size.
@return the message size sent, return < 0 when some error happened.
Example:
@code
{
NVTIPC_KEY key;
NVTIPC_I32 msqid;
UINT32 test[NVTIPC_MSG_ELEMENT_SIZE/4]={0x1000,0x2000,0x3000,0x4000,0x5000,0x6000};
UINT32 msgsz = NVTIPC_MSG_ELEMENT_SIZE;
int sndSize;
key = NvtIPC_Ftok("lviewd");
msqid = NvtIPC_MsgGet(key);
sndSize = NvtIPC_MsgSnd(msqid,NVTIPC_SENDTO_CORE2,&test,msgsz);
}
@endcode
*/
extern NVTIPC_I32 NvtIPC_MsgSnd(NVTIPC_U32 msqid, NVTIPC_SENDTO sendTo, void *pMsg, NVTIPC_U32 msgsz);
/**
Receive a message from message queue.
@param msqid: the message queue ID.
@param pMsg: the buffer to receive a message.
@param msgsz: the buffer size.
@return the message size received, return < 0 when some error happened.
Example:
@code
{
NVTIPC_KEY key;
NVTIPC_I32 msqid;
UINT32 msg[NVTIPC_MSG_ELEMENT_SIZE/4];
int sndSize;
BOOL bContinue = TRUE;
key = NvtIPC_Ftok("lviewd");
msqid = NvtIPC_MsgGet(key);
while(bContinue)
{
if ((ret = NvtIPC_MsgRcv(msqid, &msg, sizeof(msg))) < 0)
{
DBG_ERR("msgrcv %d\r\n",ret);
bContinue = FALSE;
break;
}
// do something when receive a message
// ...
}
}
@endcode
*/
extern NVTIPC_I32 NvtIPC_MsgRcv(NVTIPC_U32 msqid, void *pMsg, NVTIPC_U32 msgsz);
/**
Dump debug info.
It will dump the debug information of NvtIPC of all cores.
*/
extern void NvtIPC_DumpDebugInfo(void);
/**
Lock a semaphore in multi cores.
@param semid: the semaphore ID.
Example:
@code
{
NvtIPC_SemLock(semid);
}
@endcode
*/
extern NVTIPC_I32 NvtIPC_SemLock(NVTIPC_U32 semid);
/**
Unlock a semaphore in multi cores.
@param semid: the semaphore ID.
Example:
@code
{
NvtIPC_SemUnlock(semid);
}
@endcode
*/
extern NVTIPC_I32 NvtIPC_SemUnlock(NVTIPC_U32 semid);
/**
Map a shared memory range that can shared with uitron or map a IO memory that can access HW register.
@param memtype: the memory type that want to map.
@param addr: memory address that want to map.
@param size: memory size that want to map.
@return
- @b NULL : map has some error.
- @b otherwise: the mapped address, the output addr will be page aligned.
*/
extern void *NvtIPC_mmap(NVTIPC_MEM_TYPE memtype, unsigned int addr , unsigned int size);
/**
Un-map a shared memory range.
@param addr: memory address that want to unmap.
@param size: memory size that want to unmap.
@return
- @b -1: unmap has some error.
- @b 0: Success.
*/
extern NVTIPC_I32 NvtIPC_munmap(void* addr ,unsigned int size);
/**
Change a physical address to non-cached address
@param addr: physical address.
@return
- @b NVTIPC_MEM_INVALID_ADDR: this physical address is not in memory map list.
- @b otherwise: non-cached address.
*/
extern unsigned int NvtIPC_GetNonCacheAddr(unsigned int addr);
/**
Change a physical address to cached address
@param addr: physical address.
@return
- @b NVTIPC_MEM_INVALID_ADDR: this physical address is not in memory map list.
- @b otherwise: cached address.
*/
extern unsigned int NvtIPC_GetCacheAddr(unsigned int addr);
/**
Change a non-cached address to physical address address
@param addr: non-cached address.
@return
- @b NVTIPC_MEM_INVALID_ADDR: this non-cached address is not in memory map list.
- @b otherwise: physical address.
*/
extern unsigned int NvtIPC_GetPhyAddr(unsigned int addr);
/**
Get IO memory mapped address.
@param addr: IO memory address.
@return
- @b NVTIPC_MEM_INVALID_ADDR: this IO memory address is not in memory map list.
- @b otherwise: io mapped address.
*/
extern unsigned int NvtIPC_GetMmioAddr(unsigned int addr);
/**
Flush the cache memory data.
@param addr: the cache memory address.
@param size: the memory size want to flush.
@return
- @b <0 : this memory address is not in memory map list.
- @b =0: operation success.
*/
extern int NvtIPC_FlushCache(unsigned int addr, unsigned int size);
#if VOS_IPC
extern NVTIPC_KEY NvtIPC_Ftok_C1(const char *path);
extern NVTIPC_I32 NvtIPC_MsgGet_C1(NVTIPC_KEY key);
extern NVTIPC_ER NvtIPC_MsgRel_C1(NVTIPC_U32 msqid);
extern NVTIPC_I32 NvtIPC_MsgSnd_C1(NVTIPC_U32 msqid, NVTIPC_SENDTO sendTo, void *pMsg, NVTIPC_U32 msgsz);
extern NVTIPC_I32 NvtIPC_MsgRcv_C1(NVTIPC_U32 msqid, void *pMsg, NVTIPC_U32 msgsz);
#endif
#ifdef __cplusplus
}
#endif
/* ----------------------------------------------------------------- */
#endif /* _NVTIPC_H */