/**
* @brief Control API function of Linux driver
* @since 2009/01/08
* @note None
* @attention None
* COPYRIGHT FUJITSU LIMITED 2009
*/
/*
* 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
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include
#include
#include "FmbCmn.h"
#define FMB_MAX_ARG_NUM 20
#define FMB_MAX_STRING_LEN 256
#define PROG_NAME "fmb_ioctl_apl"
#define BANK_SIZE (512 * 1024)
#define FMB_LSIBIN_PUT 1
#define FMB_LSIBIN_GET 2
#define SWAPW(x) (((x>>8)&0x00ff) | ((x<<8)&0xff00))
static unsigned short s_vmsg_mode = 0xFFFF;
static unsigned short s_vmsg_seqend = 0xFFFF;
static unsigned short s_smsg_body = 0xFFFF;
static unsigned int vudata_cnt = 0;
static unsigned long internal_info_data = 0;
static enum FMBStremModeEnum s_Strmmode = FMBEnmNothing;
extern const struct jump_head_table g_internal_jump_table[];
static void usage_print(struct ioctl_private_inf* pri_inf_p);
static void result_print(struct ioctl_private_inf* pri_inf_p);
static void api_ditail_err_print(struct ioctl_private_inf* pri_inf_p);
static void api_timeout_print(struct ioctl_private_inf* pri_inf_p);
static void error_print(struct ioctl_private_inf* pri_inf_p , int err);
static int check_unsigned_string(const char* string);
static struct param_check param_check_unsignlong(char* input_param);
static struct param_check param_check_unsignshort(char* input_param);
static struct param_check param_check_signlong(char* input_param);
static void data_dump(unsigned short max_num, unsigned short* msg);
static BOOL setCmdtable(char* lineString,struct SceTableType* cmdScenariop);
static unsigned short vdatabuf[141] = {
0x0000, /* mode value (default) */
0x0000, /* inter_gop_gap value (default) */
0x0002, /* tfrff value (default) */
0x0000, /* extra_info_bit value (default) */
0x000a, /* vdisptime value (default) */
0x0000, /* sub_mode value (default) */
0x0000 /* vudata_length value (default) */
};
static unsigned long vidbuf[141] = {
0x00060001, /* parameter id for mode */
0x00060002, /* parameter id for inter_gop_gap */
0x00060004, /* parameter id for tfrff */
0x00060005, /* parameter id for extra_info_bit */
0x00060006, /* parameter id for vdisptime */
0x00060008, /* parameter id for sub_mode */
0x00060009 /* parameter id for vudata_length */
};
static unsigned short adatabuf[11] = {
0x0000, /* a_mute value (default) */
0x0000, /* a_ch value (default) */
0x8000, /* lch_scale value (default) */
0x8000, /* rch_scale value (default) */
0x0002, /* d_ac3_compression value (default) */
0x0080, /* d_ac3_dynrng_cut value (default) */
0x0080, /* d_ac3_dynrng_boost value (default) */
0x8000, /* lsch_scale value (default) */
0x8000, /* rsch_scale value (default) */
0x8000, /* cch_scale value (default) */
0x8000, /* lfech_scale value (default) */
};
static unsigned long aidbuf[11] = {
0x00070001, /* parameter id for a_mute */
0x00070002, /* parameter id for a_ch */
0x00070003, /* parameter id for lch_scale */
0x00070004, /* parameter id for rch_scale */
0x00070005, /* parameter id for d_ac3_compression */
0x00070006, /* parameter id for d_ac3_dynrng_boost */
0x00070007, /* parameter id for d_ac3_dynrng_cut */
0x00070008, /* parameter id for lsch_scale */
0x00070009, /* parameter id for rsch_scale */
0x0007000a, /* parameter id for cch_scale */
0x0007000b /* parameter id for lfech_scale */
};
/**
* @brief Get the video message mode.
*
* @param[in] none
* @return mode video message mode
* @note None
* @attention None
*/
unsigned short FmbgetVmode( void )
{
unsigned short mode;
mode = s_vmsg_mode;
s_vmsg_mode = 0xFFFF;
return mode;
}
/**
* @brief Get the video message seq end.
*
* @param[in] none
* @return mode video message seq end
* @note None
* @attention None
*/
unsigned short FmbgetVseqend( void )
{
unsigned short seqend;
seqend = s_vmsg_seqend;
s_vmsg_seqend = 0xFFFF;
return seqend;
}
/**
* @brief Get the system message body.
*
* @param[in] none
* @return mode system message body
* @note None
* @attention None
*/
unsigned short FmbgetSbody( void )
{
unsigned short body;
body = s_smsg_body;
s_smsg_body = 0xFFFF;
return body;
}
/**
* @brief Get the argument.
*
* @param[in] srchchar Serch character code
* @param[in] argc input character code counter
* @param[in,out] argv input character codes
* @return index argument index
* @note None
* @attention None
*/
int FmbgetArg(char* sarchchar , int argc, char** argv)
{
int i;
for (i=1 ; i < argc ; i++){
if ((strcmp(argv[i], sarchchar) == 0)) {
if ( (i+1) < argc ){
return (i+1);
}
}
}
return 0;
}
/**
* @brief Get the argument.
*
* @param[in] srchchar Serch character code
* @param[in] argc input character code counter
* @param[in,out] argv input character codes
* @return index argument index
* @note None
* @attention None
*/
int FmbgetArgOwn(char* sarchchar , int argc, char** argv)
{
int i;
for (i=1 ; i < argc ; i++){
if ((strcmp(argv[i], sarchchar) == 0)) {
return i;
}
}
return 0;
}
/**
* @brief Create the argument.
*
* @param[in] keybuff buffer
* @param[out] argvStr argument messages
* @return argument count
* @note None
* @attention None
*/
int FmbCreateArgment(char* keybuff,char** argvStr)
{
int argc;
int search_flg;
int i,j;
int len;
FMB_FUNC(TRUE);
len = strlen(keybuff);
argc=0;
search_flg = ON;
j = 0;
for(i=0;i<(len+1);i++){
if ( keybuff[i]=='\n' || keybuff[i]=='\r' || keybuff[i]=='\0'){
if (search_flg==OFF){
argvStr[argc][j]=0x00;
}
argc++;
break;
}
if (keybuff[i] != ' '){
if (search_flg==ON){
search_flg = OFF;
argc++;
argvStr[argc][j]=keybuff[i];
j++;
}
else{
argvStr[argc][j]=keybuff[i];
j++;
}
}
else{
if (search_flg==OFF){
argvStr[argc][j]=0x00;
search_flg = ON;
j=0;
}
}
}
LogFmb("argc :%d",argc);
for (i=1;iscenarioFunc = WaitCmdInputKeyFor;
cmdScenariop->arg1 = SCE_IGNORE;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
}
else if( strcmp("wait",argv[1])==0) {
if (argc<3) return FALSE;
if ( strcmp("mode",argv[2])==0) {
if (argc<4) return FALSE;
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return FALSE;
}
cmdScenariop->scenarioFunc = WaitCmdVideoMsgFor;
cmdScenariop->arg1 = param_check_out.short_cnvdata;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
}else if ( strcmp("seqend",argv[2])==0) {
if (argc<4) return FALSE;
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return FALSE;
}
cmdScenariop->scenarioFunc = WaitCmdVideoMsgFor;
cmdScenariop->arg1 = SCE_IGNORE;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = param_check_out.short_cnvdata;
}else if ( strcmp("symsg",argv[2])==0) {
cmdScenariop->scenarioFunc = WaitCmdSysMsgFor;
cmdScenariop->arg1 = SCE_IGNORE;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
if (argc>3){
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return FALSE;
}
cmdScenariop->arg1 = param_check_out.short_cnvdata;
}
if (argc>4){
param_check_out = param_check_unsignshort(argv[4]);
if (param_check_out.result != OK) {
return FALSE;
}
cmdScenariop->arg2 = param_check_out.short_cnvdata;
}
if (argc>5){
param_check_out = param_check_unsignshort(argv[5]);
if (param_check_out.result != OK) {
return FALSE;
}
cmdScenariop->arg3 = param_check_out.short_cnvdata;
}
}else if ( strcmp("syack",argv[2])==0) {
cmdScenariop->scenarioFunc = WaitCmdSysAckFor;
cmdScenariop->arg1 = SCE_IGNORE;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
if (argc>3){
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return FALSE;
}
cmdScenariop->arg1 = param_check_out.short_cnvdata;
}
}else if ( strcmp("strm",argv[2])==0) {
if (argc<4) return FALSE;
if ( strcmp("snd",argv[3])==0) {
cmdScenariop->scenarioFunc = WaitCmdThreadEndFor;
cmdScenariop->arg1 = (int)FMBEnmStreamSend;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
}else if ( strcmp("rcv",argv[3])==0) {
cmdScenariop->scenarioFunc = WaitCmdThreadEndFor;
cmdScenariop->arg1 = (int)FMBEnmStreamRcv;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
}else{
return FALSE;
}
}else{
return FALSE;
}
}
else{
len = strlen(lineString);
if (len==0) return FALSE;
cmdbuf = malloc(len);
if (cmdbuf==NULL) return FALSE;
memcpy(cmdbuf,lineString,len);
cmdScenariop->scenarioFunc = FmbCommandSend;
cmdScenariop->arg1 = (int)cmdbuf;
cmdScenariop->arg2 = SCE_IGNORE;
cmdScenariop->arg3 = SCE_IGNORE;
}
return TRUE; /* pgr0524 */
}
/**
* @brief Print the error message.
*
* @param[in] lib_inf Fmb Lib information
* @param[in] comment error messages
* @param[in] file __FILE__
* @param[in] line __LINE__
* @return None
* @note None
* @attention None
*/
void FmbErrPrint( char* comment , char* file , int line)
{
char* err_cause;
err_cause = strerror(errno);
fprintOut(stdout, "%s at :%s(%d) : %s \n", comment, file , line , err_cause);
return;
}
/**
* @brief Print the error message user.
*
* @param[in] lib_inf Fmb Lib information
* @param[in] comment error messages
* @param[in] file __FILE__
* @param[in] line __LINE__
* @return None
* @note None
* @attention None
*/
void FmbErrPrintUsr(char* comment , char* file , int line)
{
fprintOut(stdout, "%s at :%s(%d) \n", comment, file , line );
return;
}
/**
* @brief main of the dirver control application.
*
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[1] option
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
enum SceResultEnum FmbCommandSend(HANDLE sceHandle, unsigned long cmdBuf, unsigned long dummy1, unsigned long dummy2)
//int FmbIoctlmain(struct fmb_lib_inf lib_inf, int argc, char** argv)
{
int i;
int res;
struct ioctl_private_inf private_inf;
FUNCTION prgFunc=NULL;
char argvStr[FMB_MAX_ARG_NUM][FMB_MAX_STRING_LEN];
char* argv[FMB_MAX_ARG_NUM];
int argc=1;
/* 0 Clear */
memset (&private_inf , 0 , sizeof(private_inf));
for (i=1;i");
for( i=0 ; i<(argc-1) ; i++){
/* printing */
fprintOut(stdout, "%s ",argv[i+1]);
}
fprintOut(stdout, "\n");
/* serch function table */
i=0;
while (g_internal_jump_table[i].function_addr != NULL) {
if(strcmp(argv[1], g_internal_jump_table[i].option_parameter) == 0) {
prgFunc = g_internal_jump_table[i].function_addr;
break;
} else {
i++; /* next */
}
}
private_inf.cmd_id = i;
private_inf.fd = SceGetDevHandle(sceHandle);
if (prgFunc != NULL) {
res = prgFunc( &private_inf, argc, argv ); /* call function */
}else{
res = NG_OPTION_ERROR;
}
switch (res){
case OK:
result_print(&private_inf);
break;
case NG_USAGE:
usage_print(&private_inf);
break;
default:
error_print(&private_inf,res);
break;
}
if (private_inf.private_buf != NULL){
free(private_inf.private_buf);
}
free((char*)cmdBuf);
return SceEnmResultSyncEnd;
}
/**
* @brief Print the usage message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
void FmbUsageMainPrint()
{
char* comment;
/* USAGE Format */
comment = " gparam id \n"
" sparam id value \n"
" scmd cmd sub_cmd body [sync] \n"
" svparam id value \n"
" vcmd \n"
" saparam id value \n"
" acmd \n"
" sack [timeout] \n"
" rcbuf [type] \n"
" smsg [timeout] \n"
" vmsg [timeout] \n"
" amsg [timeout] \n"
" gfact [timeout] \n"
" rfact [factor] \n"
" async type [timeout] \n"
" glsi offset \n"
" slsi offset value [mask_bit] \n"
" dlsi offset size [filename] \n"
" gpci type offset \n"
" spci type offset value \n"
" gdata type \n"
" sdata type [value] \n"
" ver \n"
" strm set [-fin filename] [-fout filename] [-st start_postion] [-ed end_postion] \n"
" strm start \n"
" strm stop \n"
" sleep value \n"
" boot filename \n"
" logstr filename \n"
" logstp \n"
" gopstr filename \n"
" gopstp \n"
" scrpt filename \n";
/* printing */
fprintOut(stdout, comment );
return ;
}
/**
* @brief Print the start command message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
void FmbStartCommandPrint(enum FMBCmdEnm command_id)
{
char* comment;
/* USAGE Format */
switch(command_id){
case FMB_CMD_WAIT_MODE:
comment = "[wait mode] : Waiting for the video message mode\n";
break;
case FMB_CMD_WAIT_SEQEND:
comment = "[wait seqend] : Waiting for the video message seqend\n";
break;
case FMB_CMD_WAIT_SYMSG:
comment = "[wait symsg] : Waiting for the system message\n";
break;
case FMB_CMD_WAIT_SYACK:
comment = "[wait syAck] : Waiting for the system ack\n";
break;
case FMB_CMD_WAIT_STRM_SEND:
comment = "[wait strm snd] :Waiting for the stream sending\n";
break;
case FMB_CMD_WAIT_STRM_RCV:
comment = "[wait strm rcv] :Waiting for the stream receiving\n";
break;
case FMB_CMD_PAUSE:
comment = "[pause] :Waiting for the key input\n";
break;
default:
return;
}
/* printing */
fprintOut(stdout, comment );
return ;
}
/**
* @brief Print the end command message.
*
* @param[in] command_id command id
* @return None
* @note None
* @attension None
*/
void FmbEndCommandPrint(enum FMBCmdEnm command_id)
{
char* comment;
/* USAGE Format */
switch(command_id){
case FMB_CMD_WAIT_MODE:
comment = "[wait mode] : End.\n";
break;
case FMB_CMD_WAIT_SEQEND:
comment = "[wait seqend] : End.\n";
break;
case FMB_CMD_WAIT_SYMSG:
comment = "[wait symsg] : End.\n";
break;
case FMB_CMD_WAIT_SYACK:
comment = "[wait syAck] : End.\n";
break;
case FMB_CMD_WAIT_STRM_SEND:
comment = "[wait strm snd] : End.\n";
break;
case FMB_CMD_WAIT_STRM_RCV:
comment = "[wait strm rcv] : End.\n";
break;
case FMB_CMD_PAUSE:
comment = "[pause] : End.\n";
break;
default:
return;
}
/* printing */
fprintOut(stdout, comment );
return ;
}
/**
* @brief Print the usage message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
static void usage_print(struct ioctl_private_inf* pri_inf_p)
{
char* comment;
/* USAGE Format */
switch(pri_inf_p->cmd_id ){
case FMB_CMD_GPARAM:
comment = "%s id \n\n";
break;
case FMB_CMD_SPARAM:
comment = "%s id value \n\n";
break;
case FMB_CMD_SCMD:
comment = "%s cmd sub_cmd body [sync] \n\n";
break;
case FMB_CMD_SVPARAM:
comment = "%s id value \n\n";
break;
case FMB_CMD_VCMD:
comment = "%s \n\n";
break;
case FMB_CMD_SAPARAM:
comment = "%s id value \n\n";
break;
case FMB_CMD_ACMD:
comment = "%s \n\n";
break;
case FMB_CMD_SACK:
case FMB_CMD_SMSG:
case FMB_CMD_VMSG:
case FMB_CMD_AMSG:
case FMB_CMD_GFACT:
comment = "%s [timeout] \n\n";
break;
case FMB_CMD_RCBUF:
comment = "%s [type] \n\n"
" : type of buffer for reset command \n"
" 0x0001(bit:00000001) system-group command \n"
" 0x0002(bit:00000010) video-group command \n"
" 0x0004(bit:00000100) audio-group command \n\n";
break;
case FMB_CMD_RFACT:
comment = "%s [factor] \n\n";
break;
case FMB_CMD_ASYNC:
comment = "%s type [timeout] \n\n"
" : type of internal data \n"
" 0x0000 xerror \n"
" 0x0001 vudata \n\n";
break;
case FMB_CMD_GLSI:
comment = "%s offset \n\n";
break;
case FMB_CMD_SLSI:
comment = "%s offset value [mask_bit]\n\n";
break;
case FMB_CMD_DLSI:
comment = "%s offset size [filename] \n\n";
break;
case FMB_CMD_GPCI:
comment = "%s type offset \n"
" : type of internal data \n"
" 0x0000 Base Address0 \n"
" 0x0001 Base Address1 \n\n";
break;
case FMB_CMD_SPCI:
comment = "%s type offset value \n"
" : type of internal data \n"
" 0x0000 Base Address0 \n"
" 0x0001 Base Address1 \n\n";
break;
case FMB_CMD_GDATA:
comment = "%s type \n\n"
" : type of internal data \n"
" 0x0001 encode operation \n"
" 0x0002 asynchronous notification mask \n"
" 0x0003 read DMA timer flag\n"
" 0x0004 write DMA timer flag\n"
" 0x0005 IRQ Status clear flag\n"
" 0x0006 VSYNC control\n\n";
break;
case FMB_CMD_SDATA:
comment = "%s type [value] \n\n"
" : type of internal data \n"
" 0x0001 encode operation \n"
" 0x0002 asynchronous notification mask \n"
" 0x0003 read DMA timer flag\n"
" 0x0004 write DMA timer flag\n"
" 0x0005 IRQ Status clear flag\n"
" 0x0006 VSYNC control \n"
" : in case of type=0x0001 \n"
" 0x0000 top field \n"
" 0x0001 bottom field \n"
" in case of type=0x0002 \n"
" 0x0001 system-group message \n"
" 0x0002 vedio-group message \n"
" 0x0004 audio-group message \n"
" 0x0008 vudata \n"
" in case of type=0x0003 or 0x0004 \n"
" 0x0000 timer off \n"
" 0x0001 timer on \n"
" in case of type=0x0005 \n"
" 0x0000 clear \n"
" 0x0001 not clear \n"
" in case of type=0x0006 \n"
" 0x0000 top/bottom field \n"
" 0x0001 top field \n"
" 0x0002 bottom field \n\n";
break;
case FMB_CMD_VER:
comment = "%s \n\n";
break;
case FMB_CMD_STRM:
comment = "%s directive \n\n"
" : directive of stream control\n"
" set [-fin filename] [-fout filename] [-st start_postion] [-ed end_postion]\n"
" start\n"
" stop \n\n";
break;
case FMB_CMD_SLEEP:
comment = "%s value \n\n";
break;
case FMB_CMD_BOOT:
comment = "%s filename \n\n";
break;
case FMB_CMD_LOGSTART:
comment = "%s filename \n\n";
break;
case FMB_CMD_LOGSTOP:
comment = "%s \n\n";
break;
case FMB_CMD_GOPSTART:
comment = "%s filename \n\n";
break;
case FMB_CMD_GOPSTOP:
comment = "%s \n\n";
break;
case FMB_CMD_HELP:
comment = "%s \n\n";
break;
default:
return;
}
/* printing */
fprintOut(stdout, comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter);
return ;
}
/**
* @brief Print the result message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
static void result_print(struct ioctl_private_inf* pri_inf_p)
{
char* comment;
struct utsname system_info;
unsigned int i = 0;
unsigned int num = 0;
unsigned int vudata_id = 0;
/* USAGE Format */
switch(pri_inf_p->cmd_id ){
case FMB_CMD_GPARAM:
case FMB_CMD_SPARAM:
comment = "[%s] : id:0x%08lx value:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->private_ldata , pri_inf_p->private_data);
break;
case FMB_CMD_SCMD:
if (pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.sync == FMB_MODE_SYNC) {
comment = "[%s] : cmd:0x%04x sub_cmd:0x%04x body:0x%04x \n"
" cack:0x%04x sub_cack:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.lib_cmd_sys_info.id ,
pri_inf_p->cmd_str.lib_cmd_sys_info.sub_id,
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.body,
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.id ,
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.sub_id);
} else {
comment = "[%s] : cmd:0x%04x sub_cmd:0x%04x body:0x%04x distinct:0x%08x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.lib_cmd_sys_info.id ,
pri_inf_p->cmd_str.lib_cmd_sys_info.sub_id,
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.body,
(unsigned int)pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.distinct);
}
break;
case FMB_CMD_VCMD:
comment = "[%s] : mode:0x%04x sub_mode:0x%04x \n"
" extra_info_bit:0x%04x vdisptime:0x%04x \n"
" inter_gop_gap:0x%04x tfrff:0x%04x vudata_length:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->private_buf[0], pri_inf_p->private_buf[5], pri_inf_p->private_buf[3],
pri_inf_p->private_buf[4], pri_inf_p->private_buf[1], pri_inf_p->private_buf[2],
pri_inf_p->private_buf[6]);
for (i = 0; i < vudata_cnt; i += 1) {
vudata_id = vidbuf[7 + i];
num = (vudata_id * 2) - 0xC001C;
if ( i%4 == 0 ){
if (i+1 == vudata_cnt){
printOut (" vudata[%02x]:0x%04x\n", num, pri_inf_p->private_buf[7+i]);
}
else {
printOut (" vudata[%02x]:0x%04x", num, pri_inf_p->private_buf[7+i]);
}
}
else if (i+1 == vudata_cnt){
printOut(" vudata[%02x]:0x%04x\n",num, pri_inf_p->private_buf[7+i]);
}
else if (i%4 == 3){
printOut(" vudata[%02x]:0x%04x\n",num, pri_inf_p->private_buf[7+i]);
}
else {
printOut(" vudata[%02x]:0x%04x",num, pri_inf_p->private_buf[7+i]);
}
}
vudata_cnt = 0;
break;
case FMB_CMD_SVPARAM:
comment = "[%s] : id:0x%08lx value:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->private_ldata , pri_inf_p->private_data);
break;
case FMB_CMD_ACMD:
comment = "[%s] : a_mute:0x%04x a_ch:0x%04x\n"
" lch_scale:0x%04x rch_scale:0x%04x lsch_scale:0x%04x \n"
" rsch_scale:0x%04x cch_scale:0x%04x lfech_scale:0x%04x \n"
" d_ac3_compression:0x%04x d_ac3_dynrng_cut:0x%04x \n"
" d_ac3_dynrng_boost:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->private_buf[0], pri_inf_p->private_buf[1], pri_inf_p->private_buf[2], pri_inf_p->private_buf[3], pri_inf_p->private_buf[7],
pri_inf_p->private_buf[8], pri_inf_p->private_buf[9], pri_inf_p->private_buf[10], pri_inf_p->private_buf[4], pri_inf_p->private_buf[6],
pri_inf_p->private_buf[5]);
break;
case FMB_CMD_SAPARAM:
comment = "[%s] : id:0x%08lx value:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->private_ldata , pri_inf_p->private_data);
break;
case FMB_CMD_SACK:
comment = "[%s] : cack:0x%04x sub_cack:0x%04x distinct:0x%08x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.cmd_ack_sys_info.id,
pri_inf_p->cmd_str.cmd_ack_sys_info.sub_id,
(unsigned int)pri_inf_p->cmd_str.cmd_ack_sys_info.distinct);
break;
case FMB_CMD_RCBUF:
comment = "[%s] : type:0x%08lx \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.cmd_info_reset.type);
break;
case FMB_CMD_SMSG:
comment = "[%s] : msg:0x%04x sub_msg:0x%04x body:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.msg_sys_info.id,
pri_inf_p->cmd_str.msg_sys_info.sub_id,
pri_inf_p->cmd_str.msg_sys_info.body);
break;
case FMB_CMD_VMSG:
comment = "[%s] : mode:0x%02x sub_mode:0x%02x \n"
" cmd_invalid:0x%02x v_error_level_h:0x%04x v_error_level_l:0x%04x \n"
" Hex dump \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
(pri_inf_p->private_buf[1] & 0xFF), (pri_inf_p->private_buf[41] & 0x03),
(pri_inf_p->private_buf[1] & 0x4000)>>14, (pri_inf_p->private_buf[4] & 0xffff), (pri_inf_p->private_buf[5] & 0xffff));
data_dump((FMB_VIDEO_MSG_REG_SIZE / 2), pri_inf_p->private_buf);
break;
case FMB_CMD_AMSG:
comment = "[%s] : a_mute:0x%02x a_ch:0x%02x a_mute_st:0x%02x av_sync:0x%02x \n"
" Hex dump \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
(pri_inf_p->private_buf[2] & 0x01), (pri_inf_p->private_buf[1] & 0x03), (pri_inf_p->private_buf[2] & 0x8000)>>15, (pri_inf_p->private_buf[3] & 0x03));
data_dump((FMB_AUDIO_MSG_REG_SIZE / 2), pri_inf_p->private_buf);
break;
case FMB_CMD_GFACT:
comment = "[%s] : factor:0x%08lx \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.factor_info.factor);
break;
case FMB_CMD_RFACT:
comment = "[%s] : factor:0x%08lx \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.factor_reset.factor);
break;
case FMB_CMD_ASYNC:
comment = "[%s] : type:0x%08lx \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.async_info.type);
if (pri_inf_p->cmd_str.async_info.type == FMB_TYPE_ASYNC_XERROR) {
comment = " xerror : %04x%04x %04x%04x %04x%04x %04x%04x \n";
printOut (comment ,pri_inf_p->private_buf[0], pri_inf_p->private_buf[1], pri_inf_p->private_buf[2], pri_inf_p->private_buf[3],
pri_inf_p->private_buf[4], pri_inf_p->private_buf[5], pri_inf_p->private_buf[6], pri_inf_p->private_buf[7]);
} else {
comment = " vudata \n"
" Hex dump\n";
printOut (comment );
data_dump((FMB_VUDATA_INFO_REG_SIZE / 2), pri_inf_p->private_buf);
}
break;
case FMB_CMD_GLSI:
case FMB_CMD_SLSI:
comment = "[%s] : offset:0x%08lx value:0x%04x \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.reg_info.offset , pri_inf_p->private_data);
break;
case FMB_CMD_GPCI:
case FMB_CMD_SPCI:
comment = "[%s] : type:0x%08lx offset:0x%08lx value:0x%08lx \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.pci_reg_info.reg_type , pri_inf_p->cmd_str.pci_reg_info.offset , pri_inf_p->private_ldata);
break;
case FMB_CMD_GDATA:
case FMB_CMD_SDATA:
comment = "[%s] : type:0x%08lx value:0x%08lx \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.internal_info.type , pri_inf_p->cmd_str.internal_info.data);
break;
case FMB_CMD_VER:
uname(&system_info);
comment = "[%s] : firm : %04x-%04x-%04x-%04x \n"
" driver : %s \n"
" kernel : %s \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter,
pri_inf_p->cmd_str.lib_version_info.firm_ver[0],
pri_inf_p->cmd_str.lib_version_info.firm_ver[1],
pri_inf_p->cmd_str.lib_version_info.firm_ver[2],
pri_inf_p->cmd_str.lib_version_info.firm_ver[3],
pri_inf_p->cmd_str.lib_version_info.driver_ver,
system_info.release);
break;
default:
break;
}
return ;
}
/**
* @brief Print the detail error message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
static void api_ditail_err_print(struct ioctl_private_inf* pri_inf_p)
{
char* comment;
/* API Detail error Format */
switch(pri_inf_p->cmd_id ){
case FMB_CMD_SVPARAM:
switch (pri_inf_p->cmd_str.cmd_video_info.cprm_num) {
case 1:
comment = "Can't set mode parameter \n";
break;
case 2:
comment = "Can't set inter_gop_gap parameter \n";
break;
case 3:
comment = "Can't set tfrff parameter \n";
break;
case 4:
comment = "Can't set extra_info_bit parameter \n";
break;
case 5:
comment = "Can't set vdisptime parameter \n";
break;
case 6:
comment = "Can't set sub_mode parameter \n";
break;
case 7:
comment = "Can't set vudata_length parameter \n";
break;
default:
comment = "internal error \n";
break;
}
break;
case FMB_CMD_SAPARAM:
switch (pri_inf_p->cmd_str.cmd_audio_info.cprm_num) {
case 1:
comment = "Can't set a_mute parameter \n";
break;
case 2:
comment = "Can't set a_ch parameter \n";
break;
case 3:
comment = "Can't set lch_scale parameter \n";
break;
case 4:
comment = "Can't set rch_scale parameter \n";
break;
case 5:
comment = "Can't set d_ac3_compression parameter \n";
break;
case 6:
comment = "Can't set d_ac3_dynrng_cut parameter \n";
break;
case 7:
comment = "Can't set d_ac3_dynrng_boost parameter \n";
break;
case 8:
comment = "Can't set lsch_scale parameter \n";
break;
case 9:
comment = "Can't set rsch_scale parameter \n";
break;
case 10:
comment = "Can't set cch_scale parameter \n";
break;
case 11:
comment = "Can't set lfech_scale parameter \n";
break;
default:
comment = "internal error \n";
break;
}
break;
default:
return;
}
/* printing */
printOut (comment);
return ;
}
/**
* @brief Print the timeout message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
static void api_timeout_print(struct ioctl_private_inf* pri_inf_p)
{
char* comment;
int timeout;
/* timeout Format */
switch(pri_inf_p->cmd_id ){
case FMB_CMD_SACK:
timeout = pri_inf_p->cmd_str.cmd_ack_sys_info.timeout;
break;
case FMB_CMD_SMSG:
timeout = pri_inf_p->cmd_str.msg_sys_info.timeout;
break;
case FMB_CMD_VMSG:
timeout = pri_inf_p->cmd_str.msg_video_info.timeout;
break;
case FMB_CMD_AMSG:
timeout = pri_inf_p->cmd_str.msg_audio_info.timeout;
break;
case FMB_CMD_GFACT:
timeout = pri_inf_p->cmd_str.factor_info.timeout;
break;
case FMB_CMD_ASYNC:
timeout = pri_inf_p->cmd_str.async_info.timeout;
break;
default:
comment = "[%s] : timeout \n";
/* printing */
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter );
return;
}
comment = "[%s] : none (timeout:%ldms) \n";
/* printing */
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter, timeout );
return ;
}
/**
* @brief Print the errro message.
*
* @param[in] pri_inf_p private information
* @return None
* @note None
* @attension None
*/
static void error_print(struct ioctl_private_inf* pri_inf_p , int err)
{
char* comment;
/* Format */
switch(err ){
case NG_PARAM_ERROR:
comment = "error: parameter is abnormal \n";
break;
case NG_OPTION_ERROR:
comment = "error: option parameter is abnormal \n";
break;
case NG_VERIFY_ERROR:
switch(pri_inf_p->cmd_id){
case FMB_CMD_SLSI:
comment = "error: no verification. offset:0x%08lx reg:0x%04x \n";
printOut (comment ,
pri_inf_p->cmd_str.reg_info.offset , pri_inf_p->private_data);
return;
case FMB_CMD_SPCI:
comment = "error: no verification. offset:0x%08lx value:0x%08lx \n";
printOut (comment ,
pri_inf_p->cmd_str.pci_reg_info.offset , pri_inf_p->private_ldata);
return;
default:
return;
}
return;
case NG_ERR_IOCTL:
switch (errno) {
case EOPNOTSUPP:
comment = "error: no support function \n";
break;
case EINVAL:
api_ditail_err_print(pri_inf_p);
comment = "error: parameter is abnormal \n";
break;
case ETIMEDOUT:
api_timeout_print(pri_inf_p);
return ;
case EAGAIN:
comment = "[%s] : none \n";
printOut (comment , g_internal_jump_table[pri_inf_p->cmd_id].option_parameter);
return ;
default:
FmbErrPrint( MSG_ERR_IOCTL,__FILE__, __LINE__);
return;
}
break;
case NG_ERR_MALLOC:
FmbErrPrint( MSG_ERR_IOCTL,__FILE__, __LINE__);
return;
default:
return;
}
fprintOut(stderr, comment);
return ;
}
/**
* @brief To check whether include the character which does not allow in the character string.
*
* @param[in] string input character string
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attension None
*/
static int check_unsigned_string(const char* string)
{
int rc;
if (strspn(string, HEXDEC_CHAR) == strlen(string)) {
rc=0;
} else {
rc=-1;
}
return rc;
}
/**
* @brief Convert and check of input parameter (type of unsigned long)
*
* @param[in] input_param input parameter of argv
* @return struct param_check convert data and convert result
* @note None
* @attention None
*/
static struct param_check param_check_unsignlong(char* input_param)
{
char* err_val;
struct param_check param_check_out={0};
if (check_unsigned_string(input_param) != 0) {
param_check_out.result = NG;
return param_check_out;
}
errno = 0;
param_check_out.short_cnvdata = 0;
param_check_out.long_cnvdata = strtoul(input_param, &err_val, 0);
if (errno != 0) {
param_check_out.result = NG;
return param_check_out;
}
if (*err_val != '\0') {
param_check_out.result = NG;
return param_check_out;
}
param_check_out.result = OK;
return param_check_out;
}
/**
* @brief convert and check of input parameter (type of unsigned short)
*
* @param[in] input_param input parameter of argv
* @return struct param_check convert data and convert result
* @note None
* @attention None
*/
static struct param_check param_check_unsignshort(char* input_param)
{
char* err_val;
struct param_check param_check_out={0};
if (check_unsigned_string(input_param) != 0) {
param_check_out.result = NG;
return param_check_out;
}
errno = 0;
param_check_out.short_cnvdata = 0;
param_check_out.long_cnvdata = strtoul(input_param, &err_val, 0);
if (errno != 0) {
param_check_out.result = NG;
return param_check_out;
}
if (*err_val != '\0') {
param_check_out.result = NG;
return param_check_out;
}
/* overflow check */
if (((param_check_out.long_cnvdata >> 16) & 0xffff) != 0 ) { /* pgr0539 */
param_check_out.result = NG;
return param_check_out;
}
param_check_out.short_cnvdata = (unsigned short)param_check_out.long_cnvdata;
param_check_out.result = OK;
return param_check_out;
}
/**
* @brief Convert and check of input parameter (type of signed long)
*
* @param[in] input_param input parameter of argv
* @return struct param_check convert data and convert result
* @note None
* @attention None
*/
static struct param_check param_check_signlong(char* input_param)
{
char* err_val;
struct param_check param_check_out;
errno = 0;
param_check_out.short_cnvdata = 0;
param_check_out.long_cnvdata = strtol(input_param, &err_val, 0);
if (errno != 0) {
param_check_out.result = NG;
return param_check_out;
}
if (*err_val != '\0') {
param_check_out.result = NG;
return param_check_out;
}
param_check_out.result = OK;
return param_check_out;
}
/**
* @brief Retrieves parameters of the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] id
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_field_param(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of id */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_ldata = param_check_out.long_cnvdata;
pri_inf_p->cmd_str.param_info.prm_id = &pri_inf_p->private_ldata;
pri_inf_p->cmd_str.param_info.prm_data = &pri_inf_p->private_data;
pri_inf_p->cmd_str.param_info.prm_num = 1;
/* call API function of retrieves the parameters from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.param_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Sets parameters of the the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] id
* argv[3] value
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int set_field_param(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 4) {
return NG_USAGE;
}
/* check 1st parameter of id */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_ldata = param_check_out.long_cnvdata;
/* check 2nd parameter of value */
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_data = param_check_out.short_cnvdata;
pri_inf_p->cmd_str.param_info.prm_id = &pri_inf_p->private_ldata;
pri_inf_p->cmd_str.param_info.prm_data = &pri_inf_p->private_data;
pri_inf_p->cmd_str.param_info.prm_num = 1;
/* call API function of sets the parameters of the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.param_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Sends a system-group command to the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] cmd
* argv[3] sub_cmd
* argv[4] body
* argv[5] [sync]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int send_cmd_sys(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 5 && argc != 6) {
return NG_USAGE;
}
/* check 1st parameter of cmd */
param_check_out = param_check_unsignshort(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.id = param_check_out.short_cnvdata;
pri_inf_p->cmd_str.lib_cmd_sys_info.id = pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.id;
/* check 2nd parameter of sub_cmd */
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.sub_id = param_check_out.short_cnvdata;
pri_inf_p->cmd_str.lib_cmd_sys_info.sub_id = pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.sub_id;
/* check 3rd parameter of body */
param_check_out = param_check_unsignshort(argv[4]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.body = param_check_out.short_cnvdata;
/* check 4st parameter of sync [omit is possible] */
if (argc == 5) {
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.sync = FMB_MODE_SYNC;
} else {
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.sync = FMB_MODE_ASYNC;
param_check_out = param_check_unsignlong(argv[5]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info.distinct = (void*)param_check_out.long_cnvdata;
}
/* call API function of sends a system-group command to the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.lib_cmd_sys_info.cmd_sys_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
//MB86H55 add start
/**
* @brief Sends a video-group command to the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] mode
* argv[3] sub_mode
* argv[4] [tfrff]
* argv[5] [extra_info_bit]
* argv[6] [vdisptime]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int set_video_param(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 4) {
return NG_USAGE;
}
/* check 1st parameter of id */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_ldata = param_check_out.long_cnvdata;
/* check 2nd parameter of value */
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_data = param_check_out.short_cnvdata;
if (pri_inf_p->private_ldata < 0x00060000 || pri_inf_p->private_ldata > 0x0006008e) {
return NG_PARAM_ERROR;
}
if (pri_inf_p->private_ldata == 0x00060001) {
vdatabuf[0] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00060002) {
vdatabuf[1] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00060004) {
vdatabuf[2] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00060005) {
vdatabuf[3] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00060006) {
vdatabuf[4] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00060008) {
vdatabuf[5] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00060009) {
vdatabuf[6] = pri_inf_p->private_data;
}
if (pri_inf_p->private_ldata > 0x0006000d) {
vdatabuf[7 + vudata_cnt] = pri_inf_p->private_data;
vidbuf[7 + vudata_cnt] = pri_inf_p->private_ldata;
vudata_cnt++;
}
return OK;
}
//MB86H55 add end
/**
* @brief Sends a video-group command to the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] mode
* argv[3] sub_mode
* argv[4] [tfrff]
* argv[5] [extra_info_bit]
* argv[6] [vdisptime]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int send_cmd_video(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
int i;
if (argc != 2) {
return NG_USAGE;
}
pri_inf_p->private_buf = malloc(sizeof(unsigned short) * 141);
if (pri_inf_p->private_buf == NULL) {
return NG_ERR_MALLOC;
}
memcpy(pri_inf_p->private_buf,vdatabuf,sizeof(unsigned short) * 141);
pri_inf_p->cmd_str.cmd_video_info.cprm_num = 141;
pri_inf_p->cmd_str.cmd_video_info.cprm_id = vidbuf;
pri_inf_p->cmd_str.cmd_video_info.cprm_data = vdatabuf;
/* call API function of sends a video-group command to the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.cmd_video_info) != OK) {
return NG_ERR_IOCTL;
}
vdatabuf[0] = 0x0000;
vdatabuf[1] = 0x0000;
vdatabuf[2] = 0x0002;
vdatabuf[3] = 0x0000;
vdatabuf[4] = 0x000a;
for (i = 5; i < 141 ; i += 1) {
vdatabuf[i] = 0x0000;
}
return OK;
}
/**
* @briefSends an audio-group command to the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] a_mute
* argv[3] [a_ch]
* argv[4] [lch_scale]
* argv[5] [rch_scale]
* argv[6] [lsch_scale]
* argv[7] [rsch_scale]
* argv[8] [cch_scale]
* argv[9] [lfech_scale]
* argv[10] [d_ac3_compression]
* argv[11] [d_ac3_dynrng_cut]
* argv[12] [d_ac3_dynrng_boost]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int set_audio_param(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 4) {
return NG_USAGE;
}
/* check 1st parameter of id */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_ldata = param_check_out.long_cnvdata;
/* check 2nd parameter of value */
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_data = param_check_out.short_cnvdata;
if (pri_inf_p->private_ldata < 0x00070000 || pri_inf_p->private_ldata > 0x0007000c) {
return NG_PARAM_ERROR;
}
if (pri_inf_p->private_ldata == 0x00070001) {
adatabuf[0] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070002) {
adatabuf[1] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070003) {
adatabuf[2] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070004) {
adatabuf[3] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070005) {
adatabuf[4] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070006) {
adatabuf[5] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070007) {
adatabuf[6] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070008) {
adatabuf[7] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x00070009) {
adatabuf[8] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x0007000a) {
adatabuf[9] = pri_inf_p->private_data;
}
else if (pri_inf_p->private_ldata == 0x0007000b) {
adatabuf[10] = pri_inf_p->private_data;
}
return OK;
}
/**
* @briefSends an audio-group command to the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] a_mute
* argv[3] [a_ch]
* argv[4] [lch_scale]
* argv[5] [rch_scale]
* argv[6] [lsch_scale]
* argv[7] [rsch_scale]
* argv[8] [cch_scale]
* argv[9] [lfech_scale]
* argv[10] [d_ac3_compression]
* argv[11] [d_ac3_dynrng_cut]
* argv[12] [d_ac3_dynrng_boost]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int send_cmd_audio(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
if (argc != 2 ) {
return NG_USAGE;
}
pri_inf_p->private_buf = malloc(sizeof(unsigned short) * 11);
if (pri_inf_p->private_buf == NULL) {
return NG_ERR_MALLOC;
}
memcpy(pri_inf_p->private_buf,adatabuf,sizeof(unsigned short) * 11);
pri_inf_p->cmd_str.cmd_audio_info.cprm_num = 11;
pri_inf_p->cmd_str.cmd_audio_info.cprm_id = aidbuf;
pri_inf_p->cmd_str.cmd_audio_info.cprm_data = adatabuf;
/* call API function of sends an audio-group command to the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.cmd_audio_info) != OK) {
return NG_ERR_IOCTL;
}
adatabuf[0] = 0x0000;
adatabuf[1] = 0x0000;
adatabuf[2] = 0x8000;
adatabuf[3] = 0x8000;
adatabuf[4] = 0x0002;
adatabuf[5] = 0x0080;
adatabuf[6] = 0x0080;
adatabuf[7] = 0x8000;
adatabuf[8] = 0x8000;
adatabuf[9] = 0x8000;
adatabuf[10] = 0x8000;
return OK;
}
/**
* @brief It retrieves a system-group command acknowledge from the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [timeout]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_sys_cmd_ack(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 2 && argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of timeout [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.cmd_ack_sys_info.timeout = 0;
} else {
param_check_out = param_check_signlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.cmd_ack_sys_info.timeout = param_check_out.long_cnvdata;
}
/* call API function of retrieves the acknowledge to a system-group command from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.cmd_ack_sys_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Clear the internal buffer for command.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [type]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int reset_cmd_info(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 2 && argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of type [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.cmd_info_reset.type = FMB_CMD_INFO_ALL;
} else {
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.cmd_info_reset.type = param_check_out.long_cnvdata;
}
/* call API function of reset the internal buffer for command. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.cmd_info_reset) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Retrieves a system-group message from the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [timeout]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_msg_sys(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc !=2 && argc !=3) {
return NG_USAGE;
}
/* check 1st parameter of timeout [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.msg_sys_info.timeout = 0;
} else {
param_check_out = param_check_signlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.msg_sys_info.timeout = param_check_out.long_cnvdata;
}
s_smsg_body = 0xFFFF;
/* call API function of retrieves a system-group message command from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.msg_sys_info) != OK) {
return NG_ERR_IOCTL;
}
s_smsg_body = pri_inf_p->cmd_str.msg_sys_info.body;
return OK;
}
/**
* @brief Retrieves a video-group message from the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [timeout]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_msg_video(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 2 && argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of timeout [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.msg_video_info.timeout = 0;
} else {
param_check_out = param_check_signlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.msg_video_info.timeout = param_check_out.long_cnvdata;
}
/** memory allocation */
pri_inf_p->private_buf = malloc(sizeof(unsigned char) * FMB_VIDEO_MSG_REG_SIZE);
if (pri_inf_p->private_buf == NULL) {
return NG_ERR_MALLOC;
}
pri_inf_p->cmd_str.msg_video_info.msg = pri_inf_p->private_buf;
s_vmsg_mode = 0xFFFF;
s_vmsg_seqend = 0xFFFF;
/* call API function of retrieves a video-group message command from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.msg_video_info) != OK) {
return NG_ERR_IOCTL;
}
s_vmsg_mode = pri_inf_p->private_buf[1] & 0xFF ;
s_vmsg_seqend = ( (pri_inf_p->private_buf[2] & 0x4)>>2 );
return OK;
}
/**
* @brief Retrieves an audio-group message from the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [timeout]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_msg_audio(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 2 && argc != 3 ) {
return NG_USAGE;
}
/* check 1st parameter of timeout [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.msg_audio_info.timeout = 0;
} else {
param_check_out = param_check_signlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.msg_audio_info.timeout = param_check_out.long_cnvdata;
}
/** memory allocation */
pri_inf_p->private_buf = malloc(sizeof(unsigned char) * FMB_AUDIO_MSG_REG_SIZE);
if (pri_inf_p->private_buf == NULL) {
return NG_ERR_MALLOC;
}
pri_inf_p->cmd_str.msg_audio_info.msg = pri_inf_p->private_buf;
/* call API function of retrieves an audio-group message command from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.msg_audio_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Retrieves the asynchronous notification factor received from the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [timeout]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_factor(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 2 && argc != 3 ) {
return NG_USAGE;
}
/* check 1st parameter of timeout [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.factor_info.timeout = 0;
} else {
param_check_out = param_check_signlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.factor_info.timeout = param_check_out.long_cnvdata;
}
/* call API function of retrieves the asynchronous notification factor from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.factor_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Resets the asynchronous notification factor received from the MB86-LSI
* and asynchronous notification information.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] [factor]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int reset_factor(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 2 && argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of timeout [omit is possible] */
if (argc == 2) {
pri_inf_p->cmd_str.factor_reset.factor = FMB_FACTOR_ASYNC_ALL;
} else {
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.factor_reset.factor = param_check_out.long_cnvdata;
}
/* call API function of retrieves the asynchronous notification factor
and resets the nonnotification information buffer. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.factor_reset) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Retrieves the asynchronous notification factor of exclude
* received message from the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] type
* argv[3] [timeout]
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_async_info(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 3 && argc != 4) {
return NG_USAGE;
}
/* check 1st parameter of type */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.async_info.type = param_check_out.long_cnvdata;
/* check 2nd parameter of timeout [omit is possible] */
if (argc == 3) {
pri_inf_p->cmd_str.async_info.timeout = 0;
} else {
param_check_out = param_check_signlong(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.async_info.timeout = param_check_out.long_cnvdata;
}
if (pri_inf_p->cmd_str.async_info.type == FMB_TYPE_ASYNC_VUDATA) {
/** memory allocation */
pri_inf_p->private_buf = malloc(sizeof(unsigned char) * FMB_VUDATA_INFO_REG_SIZE);
} else {
pri_inf_p->private_buf = malloc(sizeof(unsigned short) * (FMB_XERROR_INFO_REG_SIZE / 2) );
}
if (pri_inf_p->private_buf == NULL) {
return NG_ERR_MALLOC;
}
pri_inf_p->cmd_str.async_info.data = pri_inf_p->private_buf;
/* call API function of retrieves the asynchronous notification information from the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.async_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Reads the register of the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] offset
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_lsi_reg(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of offset */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.reg_info.offset = param_check_out.long_cnvdata;
pri_inf_p->cmd_str.reg_info.prm_data = &pri_inf_p->private_data;
pri_inf_p->cmd_str.reg_info.reg_num = 1;
/* call API function of reads a register of the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.reg_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Sets the register of the MB86-LSI.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] offset
* argv[3] value
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int set_lsi_reg(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
unsigned short mask_data;
unsigned short value_data;
if (argc != 4 && argc != 5 ) {
return NG_USAGE;
}
/* check 1st parameter of offset */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.reg_info.offset = param_check_out.long_cnvdata;
/* check 2nd parameter of value */
param_check_out = param_check_unsignshort(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_data = param_check_out.short_cnvdata;
value_data = param_check_out.short_cnvdata;
pri_inf_p->cmd_str.reg_info.prm_data = &pri_inf_p->private_data;
pri_inf_p->cmd_str.reg_info.reg_num = 1;
/* mask_bit */
if (argc > 4 ){
param_check_out = param_check_unsignshort(argv[4]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
mask_data = param_check_out.short_cnvdata;
if (DrvIoctlCmd(pri_inf_p->fd,
FMB_API_GET_LSI_REG,
&pri_inf_p->cmd_str.reg_info) != OK) {
return NG_ERR_IOCTL;
}
pri_inf_p->private_data = pri_inf_p->private_data & ~mask_data;
pri_inf_p->private_data = pri_inf_p->private_data | value_data;
}
/* call API function of writes to a register of the LSI. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.reg_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Dump the register of the MB86.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] offset
* argv[3] value
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int dump_lsi_reg(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
FILE* _fp = NULL;
struct param_check param_check_out;
struct fmb_reg_info reg_info;
unsigned short private_data;
unsigned long offset = 0x80000;
unsigned int size= 512;
unsigned long do_size;
char* err_cause;
if (argc != 4 && argc != 5) {
return NG_USAGE;
}
/* offset */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
offset = param_check_out.long_cnvdata;
/* dumpsize */
param_check_out = param_check_unsignlong(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
size = param_check_out.long_cnvdata;
if (argc > 4 ){
if(_fp != NULL){
fclose(_fp);
_fp = NULL;
}
_fp = fopen(argv[4] , "w");
if(_fp == NULL){
err_cause = strerror(errno);
LogFmb("%s stat info:(%d)-%s",argv[4] ,errno, err_cause);
FMB_FUNC(FALSE);
return FALSE;
}
}
size = param_check_out.long_cnvdata;
reg_info.offset = offset;
reg_info.prm_data = &private_data;
reg_info.reg_num = 1;
do_size = 0;
printOut("[dlsi] : offset:0x%08lx size:0x%04x \n", reg_info.offset, size);
if(_fp != NULL ){
fprintf(_fp, "[dlsi] : offset:0x%08lx size:0x%04x \n", reg_info.offset, size );
}
while (do_size < size) {
if (DrvIoctlCmd(pri_inf_p->fd, FMB_API_GET_LSI_REG , ®_info) != OK) {
LogFmb("FMB_API_GET_LSI_REG NG!!");
if(_fp != NULL){
fclose(_fp);
_fp = NULL;
}
return NG_ERR_IOCTL;
}
if ( do_size%8 ==0 ){
if (_fp == NULL){
printOut("\n0x%08lx : 0x%04x",reg_info.offset,private_data);
}
else if(_fp != NULL){
fprintf(_fp, "\n0x%08lx : 0x%04x",reg_info.offset,private_data );
}
}
else {
if (_fp == NULL){
printOut(" 0x%04x",private_data);
}
else if(_fp != NULL){
fprintf(_fp, " 0x%04x",private_data );
}
}
do_size += sizeof(unsigned short);
reg_info.offset += sizeof(unsigned short);
}
if (_fp == NULL){
fprintOut(stdout, "\n");
}
else if( _fp != NULL ){
fprintf(_fp, " \n");
}
if (argc > 4 ){
if(_fp != NULL){
fclose(_fp);
_fp = NULL;
}
}
return OK; /* pgr0524 */
}
/**
* @brief Reads an PCI register of the MB86-RB.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] type
* argv[3] offset
* @return 0 Normal end
* @note None
* @attention None
*/
int get_pci_reg(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 4) {
return NG_USAGE;
}
/* check 1st parameter of type */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.pci_reg_info.reg_type = param_check_out.long_cnvdata;
/* check 2nd parameter of type */
param_check_out = param_check_unsignlong(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.pci_reg_info.offset = param_check_out.long_cnvdata;
pri_inf_p->cmd_str.pci_reg_info.prm_data = &pri_inf_p->private_ldata;
pri_inf_p->cmd_str.pci_reg_info.reg_num = 1;
/* call API function of reads the PCI register of MB86-RB. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.pci_reg_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Sets an PCI register of the MB86-RB.
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] type
* argv[3] offset
* argv[4] value
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int set_pci_reg(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 5 ) {
return NG_USAGE;
}
/* check 1st parameter of offset */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.pci_reg_info.reg_type = param_check_out.long_cnvdata;
/* check 2nd parameter of offset */
param_check_out = param_check_unsignlong(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.pci_reg_info.offset = param_check_out.long_cnvdata;
/* check 3rd parameter of value */
param_check_out = param_check_unsignlong(argv[4]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->private_ldata = param_check_out.long_cnvdata;
pri_inf_p->cmd_str.pci_reg_info.prm_data = &pri_inf_p->private_ldata;
pri_inf_p->cmd_str.pci_reg_info.reg_num = 1;
/* call API function of writes to the PCI register of MB86-RB. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.pci_reg_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Retrieves the internal information for driver
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] type
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_drv_internal_info(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 3) {
return NG_USAGE;
}
/* check 1st parameter of type */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.internal_info.type = param_check_out.long_cnvdata;
/* call API function of retrieves the internal information for driver. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.internal_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Sets the internal information for driver
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[2] type
* argv[3] value
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int set_drv_internal_info(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
struct param_check param_check_out;
if (argc != 3 && argc != 4) {
return NG_USAGE;
}
/* check 1st parameter of type */
param_check_out = param_check_unsignlong(argv[2]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.internal_info.type = param_check_out.long_cnvdata;
/* check 2nd parameter of value */
if (argc == 3) {
if (pri_inf_p->cmd_str.internal_info.type != FMB_DATA_TYPE_NOTIFY) {
return NG_USAGE;
}
pri_inf_p->cmd_str.internal_info.data = FMB_DATA_NOTIFY_ALL;
} else {
param_check_out = param_check_unsignlong(argv[3]);
if (param_check_out.result != OK) {
return NG_PARAM_ERROR;
}
pri_inf_p->cmd_str.internal_info.data = param_check_out.long_cnvdata;
}
/* call API function of sets the internal information for driver. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.internal_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Get each version information
* 1)the MB86-LSI firmware version
* 2)PCI version
* 3)Linux driver version
* 4)Linux kernel version
*
* @param[in] fd file descriptor
* @param[in] argc input character code counter
* @param[in] argv input character code
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int get_version_info(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
if (argc != 2) {
return NG_USAGE;
}
pri_inf_p->cmd_str.lib_version_info.version_info.firm_ver = pri_inf_p->cmd_str.lib_version_info.firm_ver;
pri_inf_p->cmd_str.lib_version_info.version_info.driver_ver = pri_inf_p->cmd_str.lib_version_info.driver_ver;
/* call API function of retrieves each version information. */
if (DrvIoctlCmd(pri_inf_p->fd,
g_internal_jump_table[pri_inf_p->cmd_id].ioctl_cmd,
&pri_inf_p->cmd_str.lib_version_info.version_info) != OK) {
return NG_ERR_IOCTL;
}
return OK;
}
/**
* @brief Dump the data
* @param[in] max_num number of data
* @param[in] msg 16bit datas
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
static void data_dump(unsigned short max_num, unsigned short* msg)
{
int i;
for (i = 0; i < max_num; i += 8) {
printOut(" %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x \n",
(msg[i+0] & 0xFF00)>>8 , (msg[i+0] & 0x00FF) , (msg[i+1] & 0xFF00)>>8 , (msg[i+1] & 0x00FF) ,
(msg[i+2] & 0xFF00)>>8 , (msg[i+2] & 0x00FF) , (msg[i+3] & 0xFF00)>>8 , (msg[i+3] & 0x00FF) ,
(msg[i+4] & 0xFF00)>>8 , (msg[i+4] & 0x00FF) , (msg[i+5] & 0xFF00)>>8 , (msg[i+5] & 0x00FF) ,
(msg[i+6] & 0xFF00)>>8 , (msg[i+6] & 0x00FF) , (msg[i+7] & 0xFF00)>>8 , (msg[i+7] & 0x00FF) );
}
}
/**
* @brief main of the dirver control application.
*
* @param[in] pri_inf primitive infomations
* @param[in] argc input character code counter
* @param[in] argv input character code
* argv[1] option
* @return 0 Normal end
* @return -1 Abnormal end
* @note None
* @attention None
*/
int strm_command(struct ioctl_private_inf* pri_inf, int argc, char** argv)
{
int index;
BOOL res;
enum FMBFileResultEnum fresult;
int errPacketCnt;
int startPos=0;
int endPos=0;
HANDLE hScet;
FMB_FUNC(TRUE);
hScet = gp_FmbComProperty->hEmptyScet;
if (argc < 3 || argc > 9) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
if ( strcmp("set",argv[2])==0 ) {
s_Strmmode = FMBEnmNothing;
/* -fin */
index = FmbgetArg("-fin", argc , argv);
if (index!=0){
fresult = FmbFileOpen(FMBEnmInFile,argv[index],&errPacketCnt);
if (fresult != FMBEnmFileNormal){
FmbErrPrintUsr("File Open error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_OPTION_ERROR;
}
s_Strmmode = FMBEnmSend;
}
/* -fout */
index = FmbgetArg("-fout", argc , argv);
if (index!=0){
fresult = FmbFileOpen(FMBEnmOutFile,argv[index],&errPacketCnt);
if (fresult != FMBEnmFileNormal){
FmbErrPrintUsr("File Open error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_OPTION_ERROR;
}
if (s_Strmmode == FMBEnmSend){
s_Strmmode = FMBEnmRcvSend;
FmbErrPrintUsr("File Combination error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_OPTION_ERROR;
}
else{
s_Strmmode = FMBEnmRcv;
}
}
if (s_Strmmode == FMBEnmNothing){
FMB_FUNC(FALSE);
return NG_USAGE;
}
startPos=0;
index = FmbgetArg("-st", argc , argv);
if (index!=0){
startPos = StrToUnsignedInt(argv[index]);
if ( startPos == -1 ){
FmbErrPrintUsr("Illegal start_position." ,__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_OPTION_ERROR;
}
}
endPos=0;
index = FmbgetArg("-ed", argc , argv);
if (index!=0){
endPos = StrToUnsignedInt(argv[index]);
if ( endPos == -1 ){
FmbErrPrintUsr("Illegal end_position." ,__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_OPTION_ERROR;
}
}
FmbSetStrmFilePos(FMBEnmStartPos, startPos);
FmbSetStrmFilePos(FMBEnmEndPos, endPos);
}
else if ( strcmp("start",argv[2])==0 ) {
res = FmbStreamBegin( s_Strmmode, hScet );
if ( res == FALSE ){
FmbErrPrintUsr("Cannot start.",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_OPTION_ERROR;
}
}
else if ( strcmp("stop",argv[2])==0 ) {
FmbStreamRest(hScet);
}
else{
FMB_FUNC(FALSE);
return NG_USAGE;
}
FMB_FUNC(FALSE);
return OK;
}
int sleep_command(struct ioctl_private_inf* pri_inf, int argc, char** argv)
{
int slptime=0;
FMB_FUNC(TRUE);
if (argc != 3) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
slptime = StrToUnsignedInt(argv[2]);
if ( slptime < 0 ){
FmbErrPrintUsr("sleep time error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_PARAM_ERROR;
}
usleep(slptime * 1000);
FMB_FUNC(FALSE);
return OK;
}
int logstart_command(struct ioctl_private_inf* pri_inf, int argc, char** argv)
{
FMB_FUNC(TRUE);
if (argc != 3) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
if(!StartLogFile(argv[2],"w")){
FmbErrPrintUsr("File open error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_PARAM_ERROR;
}
FMB_FUNC(FALSE);
return OK;
}
int logstop_command(struct ioctl_private_inf* pri_inf, int argc, char** argv)
{
FMB_FUNC(TRUE);
if (argc != 2) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
if(!StopLogFile()){
FmbErrPrintUsr("File close error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_PARAM_ERROR;
}
FMB_FUNC(FALSE);
return OK;
}
int gopstart_command(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
FMB_FUNC(TRUE);
if (argc != 3) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
pri_inf_p->cmd_str.internal_info.type = 0x00000002;
if (DrvIoctlCmd(pri_inf_p->fd, FMB_API_GET_INTERNAL_DATA, &pri_inf_p->cmd_str.internal_info) != OK) {
return NG_ERR_IOCTL;
}
internal_info_data = pri_inf_p->cmd_str.internal_info.data;
pri_inf_p->cmd_str.internal_info.type = 0x00000002;
pri_inf_p->cmd_str.internal_info.data = pri_inf_p->cmd_str.internal_info.data & 0x0000000E;
if (DrvIoctlCmd(pri_inf_p->fd, FMB_API_SET_INTERNAL_DATA, &pri_inf_p->cmd_str.internal_info) != OK) {
return NG_ERR_IOCTL;
}
if(!StartGopFile(argv[2],"w")){
FmbErrPrintUsr("File open error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_PARAM_ERROR;
}
FMB_FUNC(FALSE);
return OK;
}
int gopstop_command(struct ioctl_private_inf* pri_inf_p, int argc, char** argv)
{
FMB_FUNC(TRUE);
if (argc != 2) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
pri_inf_p->cmd_str.internal_info.type = 0x00000002;
pri_inf_p->cmd_str.internal_info.data = internal_info_data;
if (DrvIoctlCmd(pri_inf_p->fd, FMB_API_SET_INTERNAL_DATA, &pri_inf_p->cmd_str.internal_info) != OK) {
return NG_ERR_IOCTL;
}
if(!StopGopFile()){
FmbErrPrintUsr("File close error",__FILE__, __LINE__);
FMB_FUNC(FALSE);
return NG_PARAM_ERROR;
}
FMB_FUNC(FALSE);
return OK;
}
int boot_command(struct ioctl_private_inf* pri_inf, int argc, char** argv)
{
char* firmPath;
enum SceResultEnum sceResult;
HANDLE hScet;
FMB_FUNC(TRUE);
if (argc != 3) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
firmPath = argv[2];
hScet = gp_FmbComProperty->hEmptyScet;
sceResult = DrvBootUp(hScet, firmPath, 0, 0);
if( sceResult != SceEnmResultSyncEnd){
fprintOut(stdout,"Error:Failed in the firm boot.\n");
return 0;
}
FMB_FUNC(FALSE);
return OK;
}
int help_command(struct ioctl_private_inf* pri_inf, int argc, char** argv)
{
FMB_FUNC(TRUE);
if (argc != 2) {
FMB_FUNC(FALSE);
return NG_USAGE;
}
FmbUsageMainPrint();
FMB_FUNC(FALSE);
return OK;
}