summaryrefslogtreecommitdiffstats
path: root/package/ifxmips_adsl/src/translate.c
diff options
context:
space:
mode:
Diffstat (limited to 'package/ifxmips_adsl/src/translate.c')
-rw-r--r--package/ifxmips_adsl/src/translate.c848
1 files changed, 848 insertions, 0 deletions
diff --git a/package/ifxmips_adsl/src/translate.c b/package/ifxmips_adsl/src/translate.c
new file mode 100644
index 000000000..164f4396c
--- /dev/null
+++ b/package/ifxmips_adsl/src/translate.c
@@ -0,0 +1,848 @@
+/*
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ */
+//-----------------------------------------------------------------------
+//Description:
+// winhost script translation tool under Linux for Danube
+//-----------------------------------------------------------------------
+//Author: Qi-Ming.Wu@infineon.com
+//Created: 29-October-2004
+//-----------------------------------------------------------------------
+/* History
+ * Last changed on:
+ * Last changed by:
+ *
+*/
+
+#define _IFXMIPS_ADSL_APP
+//#define DEBUG
+#define u32 unsigned int
+#define u16 unsigned short
+#define u8 unsigned char
+#define IFXMIPS_MEI_DEV "/dev/ifxmips/mei"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+
+#include <asm/ifxmips/ifxmips.h>
+#include <asm/ifxmips/ifxmips_mei_app_ioctl.h>
+#include <asm/ifxmips/ifxmips_mei_app.h>
+#include <asm/ifxmips/ifxmips_mei_ioctl.h>
+#include <asm/ifxmips/ifxmips_mei.h>
+
+
+/*============================definitions======================*/
+#define OPTN 5
+#define CNFG 8
+#define CNTL 1
+#define STAT 2
+#define RATE 6
+#define PLAM 7
+#define INFO 3
+#define TEST 4
+
+typedef unsigned short UINT16;
+typedef unsigned long UINT32;
+
+
+
+/*=============================================================*/
+
+
+/*=============================global variables================*/
+int c=0;
+int input_flag=0;
+int digit_optind=0;
+FILE* script_file;
+void (*func)()=NULL;
+int fd;
+
+UINT16 var16[8];
+UINT32 var32[8];
+UINT16 Message[16];
+
+/*=============================================================*/
+
+
+
+
+void display_version()
+{
+ printf("translate version1.0\nby Wu Qi Ming\nQi-Ming.Wu@infineon.com\n");
+ return;
+}
+
+
+void translate_help()
+{
+ printf("Usage:translate [options] [parameter] ...\n");
+ printf("options:\n");
+ printf("-h --help Display help information\n");
+ printf("-v --version Display version information\n");
+ printf("-f --file Specify the script file\n");
+ printf("-e --execute Execute the specified script file\n");
+ //printf("-c --check Check the script file\n");
+ return;
+}
+
+/*
+print the content in buf excluding the command "echo" itself.
+*/
+
+void echo(char* buf)
+{
+ int i;
+ char msg[128];
+ for(i=0;i<128;i++)
+ {
+ if((buf[i]!=0)&&(buf[i]!=32))
+ {
+ sscanf(buf+i,"%s",&msg);
+ if(strcmp(msg,"echo")==0)
+ i+=4;
+ else break;
+ }
+
+ }
+ for(i;i<128;i++)
+ {
+ if(buf[i]!=0&&(buf[i]!=10))
+ {
+ printf("%c",buf[i]);
+ }
+ }
+
+
+ printf("\n");
+ return;
+
+}
+
+static void makeCMV(u8 opcode, u8 group, u16 address, u16 index, int size, u16 * data)
+{
+
+ memset(Message, 0, 16*2);
+ Message[0]= (opcode<<4) + (size&0xf);
+ if(opcode == H2D_DEBUG_WRITE_DM)
+ Message[1]= (group&0x7f);
+ else
+ Message[1]= (((index==0)?0:1)<<7) + (group&0x7f);
+ Message[2]= address;
+ Message[3]= index;
+ if((opcode == H2D_CMV_WRITE)||(opcode == H2D_DEBUG_WRITE_DM))
+ memcpy(Message+4, data, size*2);
+
+ return;
+}
+
+
+
+UINT16 CMV_read(char* str_group,int address,int index)
+{
+ int group=0;
+ if(strcmp(str_group,"optn")==0)
+ group=OPTN;
+ else if(strcmp(str_group,"cnfg")==0)
+ group=CNFG;
+ else if(strcmp(str_group,"cntl")==0)
+ group=CNTL;
+ else if(strcmp(str_group,"stat")==0)
+ group=STAT;
+ else if(strcmp(str_group,"rate")==0)
+ group=RATE;
+ else if(strcmp(str_group,"plam")==0)
+ group=PLAM;
+ else if(strcmp(str_group,"info")==0)
+ group=INFO;
+ else if(strcmp(str_group,"test")==0)
+ group=TEST;
+ else
+ {
+ printf("wrong group type!\ncheck script file please!\n");
+ exit(0);
+ }
+
+#ifndef DEBUG
+ makeCMV(H2D_CMV_READ, group, address, index, 1, NULL);
+ if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
+ printf("cr read %d %d %d fail",group,address,index);
+ exit(0);
+ }
+#endif
+
+ return Message[4];
+
+
+}
+
+
+int CMV_write(char* str_group,int address,int index,UINT16 value)
+{
+ int group=0;
+ if(strcmp(str_group,"optn")==0)
+ group=OPTN;
+ else if(strcmp(str_group,"cnfg")==0)
+ group=CNFG;
+ else if(strcmp(str_group,"cntl")==0)
+ group=CNTL;
+ else if(strcmp(str_group,"stat")==0)
+ group=STAT;
+ else if(strcmp(str_group,"rate")==0)
+ group=RATE;
+ else if(strcmp(str_group,"plam")==0)
+ group=PLAM;
+ else if(strcmp(str_group,"info")==0)
+ group=INFO;
+ else if(strcmp(str_group,"test")==0)
+ group=TEST;
+ else
+ {
+ printf("wrong group type!\ncheck script file please!\n");
+ exit(0);
+ }
+
+#ifndef DEBUG
+ makeCMV(H2D_CMV_WRITE, group, address, index, 1, &value);
+ if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
+ printf("cw %d %d %d fail",group,address,index);
+ return -1;
+ }
+#endif
+
+ return 0;
+
+
+}
+
+void execute_script()
+{
+ char buf[128];
+ char str_command[20]={0};
+ char str_group[20]={0};
+ char str_value[128]={0};
+ char op1[40],op2[40];
+ int address,index;
+ int n=0;
+ UINT16 value=0;
+ if(!script_file) return;
+
+ while(fgets(buf,128,script_file))/*scan one line into buffer, 128 bytes at most*/
+ {
+ if(sscanf(buf,"%s",&str_command)==0) continue;
+ /*if the line is empty, then go on to the next*/
+ if(strcmp(str_command,"cr")==0)/*cr command*/
+ {
+ sscanf(buf,"%s %s %d %d %s",&str_command,\
+ &str_group,\
+ &address,\
+ &index,\
+ &str_value);
+ if(strncmp(str_value,"$",1)!=0)
+ {
+ printf("error:cr parameter type mismatch!\n");
+ break;
+ }
+ n=strtoul(str_value+1,NULL,0);
+ var16[n]=CMV_read(str_group,address,index);
+ printf("read %s %d %d, value=%04x\n",str_group, address, index,var16[n]);
+ }
+ else if(strcmp(str_command,"cw")==0)/*cw command*/
+ {
+ sscanf(buf,"%s %s %d %d %s",&str_command,\
+ &str_group,\
+ &address,\
+ &index,\
+ &str_value);
+ n=strtoul(str_value+1,NULL,0);
+ if(strncmp(str_value,"$",1)==0)
+ {
+ value=var16[n];
+ }
+ else if(strncmp(str_value,"#",1)==0)
+ {
+ value=strtoul(str_value+1,NULL,0);
+ }
+ else
+ {
+ value=strtoul(str_value,NULL,0);
+ }
+ if(CMV_write(str_group,address,index,value)<0)
+ {
+ break;
+ }
+ }
+
+ else if(strcmp(str_command,"mw")==0)/*mr command*/
+ {
+
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &str_value);
+
+ n=strtoul(str_value+1,NULL,0);
+ address=strtoul(op1,NULL,0);
+ if(strncmp(str_value,"$",1)==0)
+ {
+ value=var16[n];
+ }
+ else if(strncmp(str_value,"#",1)==0)
+ {
+ value=strtoul(str_value+1,NULL,0);
+ }
+ else
+ {
+ value=strtoul(str_value,NULL,0);
+
+ }
+
+ makeCMV(H2D_DEBUG_WRITE_DM, 0x0, address>>16, (address)&(0xffff), 1, &value);
+ if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
+ printf("mw %08x fail",address);
+ break;
+
+ }
+
+ }
+
+ else if(strcmp(str_command,"mr")==0)/*mr command*/
+ {
+
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &str_value);
+ address=strtoul(op1,NULL,0);
+ n=strtoul(str_value+1,NULL,0);
+ if(strncmp(str_value,"$",1)!=0)
+ {
+ printf("error:mr parameter type mismatch!\n");
+ break;
+ }
+ makeCMV(H2D_DEBUG_READ_DM, 0x0, address>>16, (address)&(0xffff), 1, NULL);
+ if(ioctl(fd, IFXMIPS_MEI_CMV_WINHOST, &Message)<0){
+ printf("mw %08x fail",address);
+ break;
+ }
+ value=Message[4];
+ var16[n]=value;
+ }
+
+
+
+ else if(strcmp(str_command,"meiw")==0)/*meiw command*/
+ {
+ meireg regrdwr;
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ regrdwr.iAddress=strtoul(op1,NULL,0)+IFXMIPS_MEI_BASE_ADDR;
+
+
+ if(strncmp(op2,"#",1)==0) regrdwr.iData=strtoul(op1+1,NULL,0);
+ else if(strncmp(op2,"$",1)==0) regrdwr.iData=var16[strtoul(op2+1,NULL,0)];
+ else if(strncmp(op2,"@",1)==0) regrdwr.iData=var32[strtoul(op2+1,NULL,0)];
+ else regrdwr.iData=strtoul(op1,NULL,0);
+ //printf("address=%08x\n", regrdwr.iAddress);
+ if(ioctl(fd, IFXMIPS_MEI_CMV_WRITE, &regrdwr)<0){
+ printf("meiw fail\n");
+ break;;
+ }
+
+ }
+
+ else if(strcmp(str_command,"meir")==0)/*meir command*/
+ {
+ meireg regrdwr;
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ regrdwr.iAddress=strtoul(op1,NULL,0)+IFXMIPS_MEI_BASE_ADDR;
+ if(ioctl(fd, IFXMIPS_MEI_CMV_READ, &regrdwr)<0){
+ printf("meir fail\n");
+ break;
+ }
+ if(strncmp(op2,"$",1)==0) var16[strtoul(op2+1,NULL,0)]=regrdwr.iData;
+ else if(strncmp(op2,"@",1)==0) var32[strtoul(op2+1,NULL,0)]=regrdwr.iData;
+ else
+ {
+ printf("meir grammar error!\n");
+ break;
+ }
+
+ }
+
+
+ else if(strcmp(str_command,"lst")==0)/*lst command*/
+ {
+
+ sscanf(buf,"%s %s",&str_command,\
+ &str_value);
+
+ if(strncmp(str_value,"$",1)==0)
+ {
+ n=strtoul(str_value+1,NULL,0);
+ printf("$%d=0x%04x\n",n,var16[n]);
+
+ }
+ else if(strncmp(str_value,"@",1)==0)
+ {
+ n=strtoul(str_value+1,NULL,0);
+ printf("$%d=0x%08x\n",n,var32[n]);
+
+ }
+ else
+ {
+ printf("lst grammar error!\n");
+ break;
+ }
+ }
+
+ else if(strcmp(str_command,"echo")==0)/*echo command*/
+ {
+ echo(buf);
+ }
+ else if(strcmp(str_command,"mov")==0)/*mov command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]=strtoul(op2+1,NULL,0);
+ }
+ else
+ {
+ var16[strtoul(op1+1,NULL,0)]=strtoul(op2,NULL,0);
+
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+
+
+ }
+
+
+ else if(strcmp(str_command,"or")==0)/*or command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]|=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]|= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]|=strtoul(op2+1,NULL,0);
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]|=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]|= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]|=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+
+ else if(strcmp(str_command,"and")==0)/*and command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]&=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]&= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]&=strtoul(op2+1,NULL,0);
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]&=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]&= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]&=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+ else if(strcmp(str_command,"not")==0)/*not command*/
+ {
+ sscanf(buf,"%s %s",&str_command,\
+ &op1);
+ if(strncmp(op1,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]=~var16[strtoul(op1+1,NULL,0)];
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]=~var32[strtoul(op1+1,NULL,0)];
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+ else if(strcmp(str_command,"shl")==0)/*shl command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]<<=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]<<= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]<<=strtoul(op2+1,NULL,0);
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]<<=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]<<= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]<<=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+
+ else if(strcmp(str_command,"shr")==0)/*shr command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]>>=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]>>= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]>>=strtoul(op2+1,NULL,0);
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]>>=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]>>= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]>>=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+
+ else if(strcmp(str_command,"add")==0)/*add command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]+=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]+= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]+=strtoul(op2+1,NULL,0);
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]+=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]+= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]+=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+ else if(strcmp(str_command,"sub")==0)/*sub command*/
+ {
+ sscanf(buf,"%s %s %s",&str_command,\
+ &op1,\
+ &op2);
+ if(strncmp(op1,"$",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]-=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]-= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var16[strtoul(op1+1,NULL,0)]-=strtoul(op2+1,NULL,0);
+ }
+ }
+ else if(strncmp(op1,"@",1)==0)
+ {
+ if(strncmp(op2,"$",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]-=var16[strtoul(op2+1,NULL,0)];
+ }
+ else if(strncmp(op2,"@",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]-= var32[strtoul(op2+1,NULL,0)];
+
+ }
+ else if(strncmp(op2,"#",1)==0)
+ {
+ var32[strtoul(op1+1,NULL,0)]-=strtoul(op2+1,NULL,0);
+ }
+ }
+ else
+ {
+ printf("grammar error!\n");
+ break;
+ }
+ }
+
+ memset(str_command,0,20);
+ memset(buf,0,128);
+ }
+ return;
+}
+
+int main (int argc, char** argv) {
+
+#ifndef DEBUG
+ fd=open(IFXMIPS_MEI_DEV, O_RDWR);
+ if(fd<0){
+ printf("\n\n autoboot open device fail\n");
+ return -1;
+ }
+#endif
+ while(1) {
+ int option_index=0;
+ static struct option long_options[] ={
+ {"help",0,0,0},
+ {"version",0,0,0},
+ {"file",1,0,0},
+ {"execute",0,0,0}
+ };
+
+ c = getopt_long(argc,argv, "hvf:e",
+ long_options, &option_index);
+
+ //printf("c=%d option_index=%d\n",c,option_index);
+ if(c==-1)
+ {
+ if(input_flag==0)
+ {
+ printf("translate:please specify parameters\n");
+ func=&translate_help;
+ }
+ if(func)
+ (*func)();
+ else
+ {
+ERROR: translate_help();
+ }
+ break;
+ }
+ input_flag=1;
+ switch (c) {
+ case 0:
+ if(option_index==0)
+ {
+ func=&translate_help;
+ break;
+ }
+ if(option_index==1)
+ {
+ func=&display_version;
+ break;
+ }
+ if(option_index==2)
+ {
+ goto FILE;
+ break;
+ }
+ if(option_index==3)
+ {
+ goto EXECUTE;
+ break;
+ }
+ case 'h':
+ func=&translate_help;
+ break;
+ case 'v':
+ func=&display_version;
+ break;
+ case 'f':
+FILE: if(!optarg) goto ERROR;
+ script_file=fopen((char*)optarg,"r");
+ if(!script_file) perror("fopen");
+ break;
+ case 'e':
+EXECUTE: func=&execute_script;
+ break;
+ }
+
+
+ }
+ if(script_file) fclose(script_file);
+#ifndef DEBUG
+ close(fd);
+#endif
+}
+
+
+