nt9856x/code/application/source/cardv/SrcCode/UIApp/UsbMsdcCb/MsdcNvtCb_ISP.c
2023-03-28 15:07:53 +08:00

283 lines
6.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <umsd.h>
#include <msdcnvt/MsdcNvtApi.h>
#include "MsdcNvtCb_ISP.h"
#include "vendor_isp.h"
#if !defined(__FREERTOS)
#include <sys/ioctl.h>
#endif
#define MSDCNVT_AF_READY 0
#define CBW_TYPE_READ 0x80
#define CBW_TYPE_READ_ARG 0x40
#define CBW_TYPE_WRITE 0x00
#define CBW_TYPE_DEMON_READ (CBW_TYPE_READ|0x1)
#define CBW_TYPE_DEMON_WRITE (CBW_TYPE_WRITE|0x1)
#define CBW_TYPE_DEMON_READ_ARG (CBW_TYPE_READ | CBW_TYPE_READ_ARG|0x1)
#define CBW_TYPE_IO_READ (CBW_TYPE_READ|0x2)
#define CBW_TYPE_IO_WRITE (CBW_TYPE_WRITE|0x2)
#define CBW_TYPE_IO_READ_ARG (CBW_TYPE_READ | CBW_TYPE_READ_ARG|0x2)
#define CBW_TYPE_COMBO_CMD (CBW_TYPE_READ | CBW_TYPE_READ_ARG|0x7)
#define CMD_PASS 0
#define CMD_FAIL 1
#define CMD_NONE 2
typedef struct _ISP_USB_CMD_HEAD{
UINT32 type;
UINT32 cmd;
UINT32 size;
UINT32 state;
} ISP_USB_CMD_HEAD;
UINT32 g_ParamBuffer[0x4000];
int active_fd = -1;
//Step 1: Declare custom functions
//Declare Gets Functions
static void read_cmd(void);
static void read_cmd_arg(void);
static void read_cmd_test(void);
//Declare Sets Functions
static void write_cmd(void);
static void write_cmd_arg(void);
static void write_cmd_test(void);
//Step 2: Create your function mapping table for 'Get' Command
static void (*msdc_isp_get[])(void) = {
read_cmd,
read_cmd_arg,
read_cmd_test
};
//Step 3: Create your function mapping table for 'Set' Command
static void (*msdc_isp_set[])(void) = {
write_cmd,
write_cmd_arg,
write_cmd_test
};
//Step 4: Provide API for Register Single Direction Functions
BOOL msdc_nvt_reg_si_isp(void)
{
return MsdcNvt_AddCallback_Si(msdc_isp_get, sizeof(msdc_isp_get) / sizeof(msdc_isp_get[0]), msdc_isp_set, sizeof(msdc_isp_set) / sizeof(msdc_isp_set[0]));
}
int do_io( UINT32 cmd, UINT32 *data)
{
int ret = CMD_PASS;
#if !defined(__FREERTOS)
if (ioctl(active_fd, cmd, data) < 0) {
printf("[ISPD] Warning from %s : CMD=0x%.8x\n", __FUNCTION__, (UINT)cmd);
return CMD_FAIL;
}
#endif
return ret;
}
#if defined(__FREERTOS)
#define DEMON_VER ((0 << 28) | (0x06 << 20) | (0x00 << 12) | (914))
#else
#define DEMON_VER ((0 << 28) | (0x07 << 20) | (0x00 << 12) | (914)) // Linux-USB:0.07.00.0914
#endif
#define DEMON_MAJOR ((DEMON_VER >> 28) & 0x0F)
#define DEMON_MINOR ((DEMON_VER >> 20) & 0xFF)
#define DEMON_INFO ((DEMON_VER >> 12) & 0xFF)
#define DEMON_DATE (DEMON_VER & 0x0FFF)
#define NOVA_TAG 0x41564F4E //AVON
typedef enum {
DEMON_GET_VER = 0,
DEMON_GET_NAVATAG,
DEMON_GET_DEVICE
} DEMOM_CMD_READ;
static int demon_read(unsigned int cmd, UINT32 *data)
{
int ret = CMD_PASS;
switch(cmd){
case DEMON_GET_VER:
*data = DEMON_VER;
break;
case DEMON_GET_NAVATAG:
*data = NOVA_TAG;
break;
case DEMON_GET_DEVICE:
#if defined(__FREERTOS)
*data = 0x1;
#else
active_fd = open("/dev/nvt_isp", O_RDWR);
*data = active_fd;
#endif
break;
default:
ret = CMD_NONE;
printf("Error from %s : CMD=0x%.8x\n", __FUNCTION__, cmd);
break;
}
return ret;
}
static void read_cmd(void)
{
UINT32 *pData = (UINT32 *)MsdcNvt_GetDataBufferAddress();
UINT32 uiLength = MsdcNvt_GetTransSize();
if(uiLength < sizeof(ISP_USB_CMD_HEAD)) {
printf("%s, size < 16 \r\n", __FUNCTION__);
return;
}
memcpy(pData, g_ParamBuffer, uiLength);
}
static void read_cmd_test(void)
{
UINT32 *pData = (UINT32 *)MsdcNvt_GetDataBufferAddress();
*pData = 0xaabbccdd;
printf("%s, %8X\r\n", __FUNCTION__, *pData);
}
static void read_cmd_arg(void)
{
UINT32 *pData = (UINT32 *)MsdcNvt_GetDataBufferAddress();
UINT32 uiLength = MsdcNvt_GetTransSize();
UINT32 *start_addr;
ISP_USB_CMD_HEAD *head_info;
UINT32 cmd_type, cmd, cmd_state;
int loop_count = 1;
int combo_cmd = 0;
UINT32 *cmd_info = 0;
if(uiLength < sizeof(ISP_USB_CMD_HEAD)) {
printf("%s, size < 16 \r\n", __FUNCTION__);
return;
}
head_info = (ISP_USB_CMD_HEAD *)pData;
start_addr = pData + (sizeof(ISP_USB_CMD_HEAD)/sizeof(UINT32));
memcpy(pData, g_ParamBuffer, uiLength);
cmd_type = head_info->type;
cmd = head_info->cmd;
cmd_state = CMD_PASS;
do{
switch(cmd_type){
case CBW_TYPE_IO_READ:
case CBW_TYPE_IO_READ_ARG:
cmd_state = do_io(cmd, (UINT32 *)start_addr);
loop_count --;
break;
case CBW_TYPE_DEMON_READ:
case CBW_TYPE_DEMON_READ_ARG:
cmd_state = demon_read(cmd, (UINT32 *)start_addr);
loop_count --;
break;
case CBW_TYPE_COMBO_CMD:
head_info->state = CMD_PASS;
cmd_info = ((UINT32 *)start_addr);
loop_count = cmd_info[0];
cmd_type = cmd_info[2];
combo_cmd = 1;
break;
default:
cmd_state = CMD_NONE;
loop_count --;
}
if (combo_cmd == 1){
cmd_info[2] = cmd_state;
start_addr = start_addr + (cmd_info[1] >> 2);
cmd_info += 3;
cmd = cmd_info[0];
}
}while(loop_count > 0);
head_info->state = cmd_state;
}
static void write_cmd_test(void)
{
UINT32 *pData = (UINT32 *)MsdcNvt_GetDataBufferAddress();
UINT32 uiLength = MsdcNvt_GetTransSize();
if (uiLength > 1) {
printf("%s, size=%d data = %8X %8X\r\n", __FUNCTION__, uiLength, pData[0], pData[1]);
} else {
printf("%s, size=%d\r\n", __FUNCTION__, uiLength);
}
}
static void write_cmd_arg(void)
{
UINT32 *pData = (UINT32 *)MsdcNvt_GetDataBufferAddress();
UINT32 uiLength = MsdcNvt_GetTransSize();
ISP_USB_CMD_HEAD *head_info;
if(uiLength < sizeof(ISP_USB_CMD_HEAD)) {
printf("%s, size < 16 \r\n", __FUNCTION__);
return;
}
head_info = (ISP_USB_CMD_HEAD *)pData;
memcpy(g_ParamBuffer, pData, uiLength);
head_info->state = CMD_PASS;
}
static void write_cmd(void)
{
UINT32 *pData = (UINT32 *)MsdcNvt_GetDataBufferAddress();
UINT32 uiLength = MsdcNvt_GetTransSize();
UINT32 *start_addr;
ISP_USB_CMD_HEAD *head_info;
UINT32 cmd_type, cmd, cmd_state;
int loop_count = 1;
int combo_cmd = 0;
UINT32 *cmd_info = 0;
if(uiLength < sizeof(ISP_USB_CMD_HEAD)) {
printf("%s, size < 16 \r\n", __FUNCTION__);
return;
}
head_info = (ISP_USB_CMD_HEAD *)pData;
start_addr = pData + (sizeof(ISP_USB_CMD_HEAD)/sizeof(UINT32));
cmd_type = head_info->type;
cmd = head_info->cmd;
cmd_state = CMD_PASS;
do{
switch(cmd_type){
case CBW_TYPE_IO_WRITE:
cmd_state = do_io(cmd, (UINT32 *)start_addr);
loop_count --;
break;
case CBW_TYPE_COMBO_CMD:
head_info->state = CMD_PASS;
cmd_info = ((UINT32 *)start_addr);
loop_count = cmd_info[0];
cmd_type = cmd_info[2];
combo_cmd = 1;
break;
default:
cmd_state = CMD_NONE;
loop_count --;
}
if (combo_cmd == 1){
cmd_info[2] = cmd_state;
start_addr = start_addr + (cmd_info[1] >> 2);
printf("%s: offset = %d\n", __FUNCTION__, (UINT)cmd_info[1]);
cmd_info += 3;
cmd = cmd_info[0];
}
}while(loop_count > 0);
head_info->state = cmd_state;
memcpy(g_ParamBuffer, pData, uiLength);
}