Subversion Repositories ngs

Rev

Blame | Last modification | View Log | Download | RSS feed | ?url?

  1. // ngs_jtag.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include <conio.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <windows.h>
  8.  
  9.  
  10.  
  11. #include "ngs_jtag.h"
  12. #include "flash.h"
  13. #include "jtag.h"
  14. #include "bsdl.h"
  15. #include "tap.h"
  16. #include "types.h"
  17.  
  18.  
  19.  
  20. void error_help(void);
  21.  
  22.  
  23. int main(int argc, char* argv[])
  24. {
  25.         int mode;
  26.         int start_address;
  27.         int length;
  28.         char * filename;
  29.  
  30.         length=start_address=(-1);
  31.  
  32.  
  33.         // get ports control
  34.         HANDLE h;
  35.         h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  36.         if (h==INVALID_HANDLE_VALUE) {printf("Error! Unable to open giveio.sys driver!");return -1;}
  37.         CloseHandle(h);
  38.  
  39.  
  40.         // load and parse bsdl for ep1k30t144
  41.         if(NULL==readBSD("1k30t144.bsd",1,0))
  42.         {
  43.                 printf("1k30t144.bsd failed\n");
  44.                 return -1;
  45.         }
  46.  
  47.  
  48.  
  49.         // parse command line
  50.         if( argc==2 )
  51.         {
  52.                 if( _stricmp(argv[1],"a")==0 )
  53.                 {
  54.                         mode = ERASE_ALL;
  55.                 }
  56.                 else
  57.                 {
  58.                         error_help();
  59.                         return -1;
  60.                 }
  61.         }
  62.         else if( argc==3 ) // read all or erase sector
  63.         {
  64.                 if( _stricmp(argv[1],"e")==0 )
  65.                 {
  66.                         mode = ERASE_SECTOR;
  67.                         if( sscanf(argv[2],"%x",&start_address)!=1 )
  68.                         {
  69.                                 error_help();
  70.                                 return -1;
  71.                         }
  72.                 }
  73.                 else if( _stricmp(argv[1],"r")==0 )
  74.                 {
  75.                         mode = READ;
  76.                         filename = argv[2];
  77.                 }
  78.                 else
  79.                 {
  80.                         error_help();
  81.                         return -1;
  82.                 }
  83.         }
  84.         else if( argc==4 ) // program
  85.         {
  86.                 if( _stricmp(argv[1],"p")==0 )
  87.                 {
  88.                         mode = PROGRAM;
  89.                         if( sscanf(argv[2],"%x",&start_address)!=1 )
  90.                         {
  91.                                 error_help();
  92.                                 return -1;
  93.                         }
  94.                         filename = argv[3];
  95.                 }
  96.                 else
  97.                 {
  98.                         error_help();
  99.                         return -1;
  100.                 }
  101.         }
  102.         else if( argc==5 ) // read with address and length
  103.         {
  104.                 if( _stricmp(argv[1],"r")==0 )
  105.                 {
  106.                         mode = READ;
  107.                         if( sscanf(argv[2],"%x",&start_address)!=1 )
  108.                         {
  109.                                 error_help();
  110.                                 return -1;
  111.                         }
  112.                         if( sscanf(argv[3],"%x",&length)!=1 )
  113.                         {
  114.                                 error_help();
  115.                                 return -1;
  116.                         }
  117.                         filename = argv[4];
  118.                 }
  119.                 else
  120.                 {
  121.                         error_help();
  122.                         return -1;
  123.                 }
  124.         }
  125.         else
  126.         {
  127.                 error_help();
  128.                 return -1;
  129.         }
  130.        
  131.  
  132.  
  133.  
  134.         if( !do_flash(mode,filename,start_address,length) )
  135.         {
  136.                 printf("do_flash() failed!\n");
  137.                 return -1;
  138.         }
  139.        
  140.  
  141.  
  142.  
  143.        
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150. /*
  151.         int address=0,oldaddr=0;
  152.         unsigned char byte;
  153.  
  154.         set_pin_out(bscan_state,"nramcs0",0);
  155.  
  156.         set_bus_dir(bscan_state,databus,OUTPUT);
  157.         set_bus_dir(bscan_state,addrbus,OUTPUT);
  158.  
  159.         jtag._IRSCAN(sampre); // prepare 1st data
  160.         jtag._DRSCAN(bscan_state);
  161.        
  162.         while( address<filesize )
  163.         {
  164.                 set_bus_out(bscan_state,addrbus,address);
  165.                 set_bus_out(bscan_state,databus,(int)loadedfile[address]);
  166.  
  167.                 jtag._IRSCAN(extest);
  168.                 jtag._DRSCAN(bscan_state);
  169.  
  170.                 set_pin_out(bscan_state,"nmemwe",0);
  171.                 jtag._IRSCAN(extest);
  172.                 jtag._DRSCAN(bscan_state);
  173.  
  174.                 set_pin_out(bscan_state,"nmemwe",1);
  175.                 jtag._IRSCAN(extest);
  176.                 jtag._DRSCAN(bscan_state);
  177.  
  178.                 address++;
  179.                 if( (address-oldaddr)>=512 )
  180.                 {
  181.                         printf("wraddr=%d\n",address);
  182.                         oldaddr=address;
  183.                 }
  184.         }
  185.         // complete last write
  186.         jtag._IRSCAN(extest);
  187.         jtag._DRSCAN(bscan_state);
  188.  
  189.  
  190.  
  191.         set_bus_dir(bscan_state,databus,INPUT);
  192.         set_pin_out(bscan_state,"nmemoe",0);
  193.         set_bus_out(bscan_state,addrbus,0);
  194.         jtag._IRSCAN(sampre);
  195.         jtag._DRSCAN(bscan_state);
  196.  
  197.         oldaddr=0;
  198.         for(address=1;address<=filesize;address++)
  199.         {
  200.                 set_bus_out(bscan_state,addrbus,address);
  201.  
  202.                 jtag._IRSCAN(extest);
  203.                 jtag.DRSCAN(bscan_state,bscan_tmp);
  204.  
  205.                 byte=(unsigned char)get_bus_in(bscan_tmp,databus);
  206.  
  207.                 if( ((unsigned char)byte)!=((unsigned char)loadedfile[address-1]) )
  208.                 {
  209.                         printf("check error at %X: was %X, must be %X\n",address-1,byte,loadedfile[address-1]);
  210.                         return -1;
  211.                 }
  212.                
  213.                 if( (address-oldaddr)>=512 )
  214.                 {
  215.                         printf("rdaddr=%d\n",address);
  216.                         oldaddr=address;
  217.                 }
  218.         }
  219. */     
  220.        
  221.        
  222.        
  223.        
  224.  
  225.        
  226.        
  227.         return 0;
  228. }
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248. void set_bus_dir(char * bscan_state,struct bus * mybus, int dir)
  249. {
  250.         while( mybus!=NULL )
  251.         {
  252.                 set_pin_dir(bscan_state,mybus->pin_name,dir);
  253.  
  254.                 mybus=mybus->next;
  255.         }
  256. }
  257.  
  258.  
  259. void set_bus_out(char * bscan_state,struct bus * mybus, int value)
  260. {
  261.         while( mybus!=NULL )
  262.         {
  263.                 set_pin_out(bscan_state,mybus->pin_name,value&1);
  264.  
  265.                 mybus=mybus->next;
  266.                 value>>=1;
  267.         }
  268. }
  269.  
  270.  
  271. int get_bus_in(char * bscan_state,struct bus * mybus)
  272. {
  273.         int result,shift;
  274.  
  275.         result=0;shift=1;
  276.  
  277.  
  278.         while( mybus!=NULL )
  279.         {
  280.                 result |= (get_pin_in(bscan_state,mybus->pin_name)==1)?shift:0 ;
  281.  
  282.                 mybus=mybus->next;
  283.                 shift<<=1;
  284.         }
  285.  
  286.         return result;
  287. }
  288.  
  289.  
  290. // add new pin to the bus (add pins from MSB to LSB!)
  291. struct bus * add_bus_pin(struct bus * mybus, char * pin_name)
  292. {
  293.         struct bus * newbus=new struct bus;
  294.  
  295.         newbus->next = mybus;
  296.         newbus->pin_name = pin_name;
  297.  
  298.         return newbus;
  299. }
  300.  
  301.  
  302. // delete all bus allocations
  303. void del_bus(struct bus * mybus)
  304. {
  305.         struct bus * tmpbus;
  306.  
  307.         while( mybus!=NULL )
  308.         {
  309.                 tmpbus = mybus;
  310.                 mybus = mybus->next;
  311.                 delete tmpbus;
  312.         }
  313. }
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328. //set output data for the pin
  329. void set_pin_out(char * bscan_state,char * pin_alias, int value)
  330. {
  331.         PINS * pin;
  332.         if( (pin=findPINalias(pin_alias))==NULL )
  333.         {
  334.                 if( (pin=findPIN(pin_alias))==NULL )
  335.                         exit(0);
  336.         }
  337.  
  338.         if( (pin->output) != (-1) ) bscan_state[BSbegin->DRlen-1-pin->output]=(value==0)?'0':'1';
  339. }
  340.  
  341.  
  342. //set direction for the pin
  343. void set_pin_dir(char * bscan_state,char * pin_alias, int dir)
  344. {
  345.         PINS * pin;
  346.         if( (pin=findPINalias(pin_alias))==NULL )
  347.         {
  348.                 if( (pin=findPIN(pin_alias))==NULL )
  349.                         exit(0);
  350.         }
  351.  
  352.  
  353.         if( (pin->control) != (-1) ) bscan_state[BSbegin->DRlen-1-pin->control]=((dir==OUTPUT)?OUTPUT:INPUT)+((int)'0');
  354. }
  355.  
  356. //get data set for pin outputting or -1 if pin->output==-1
  357. int get_pin_out(char * bscan_state,char * pin_alias)
  358. {
  359.         PINS * pin;
  360.         if( (pin=findPINalias(pin_alias))==NULL )
  361.         {
  362.                 if( (pin=findPIN(pin_alias))==NULL )
  363.                         exit(0);
  364.         }
  365.  
  366.         if( (pin->output)==(-1) )
  367.                 return -1;
  368.         else
  369.                 return bscan_state[BSbegin->DRlen-1-pin->output]-'0';
  370. }
  371.  
  372. //get mode set for pin or -1 if pin->control==-1
  373. int get_pin_dir(char * bscan_state,char * pin_alias)
  374. {
  375.         PINS * pin;
  376.         if( (pin=findPINalias(pin_alias))==NULL )
  377.         {
  378.                 if( (pin=findPIN(pin_alias))==NULL )
  379.                         exit(0);
  380.         }
  381.  
  382.         if( (pin->control)==(-1) )
  383.                 return -1;
  384.         else
  385.                 return ((int)(bscan_state[(BSbegin->DRlen-1-pin->control)]-'0')==INPUT)?INPUT:OUTPUT;
  386. }
  387.  
  388.  
  389. //get input data on the pin or -1 if pin->input==-1
  390. int get_pin_in(char * bscan_state,char * pin_alias)
  391. {
  392.         PINS * pin;
  393.         if( (pin=findPINalias(pin_alias))==NULL )
  394.         {
  395.                 if( (pin=findPIN(pin_alias))==NULL )
  396.                         exit(0);
  397.         }
  398.  
  399.         if( (pin->input)==(-1) )
  400.                 return -1;
  401.         else
  402.                 return (int)(bscan_state[BSbegin->DRlen-1-pin->input]-'0');
  403. }
  404.  
  405.  
  406.  
  407.  
  408. void error_help(void)
  409. {
  410.         printf("ngs_flash a - erase all\n");
  411.         printf("ngs_flash e <hex addr> - erase block within given address\n");
  412.         printf("ngs_flash p <start hex addr> filename - program into flash with checking\n");
  413.         printf("ngs_flash r <filename> or r <start hex> <length hex> <filename> - read all or given range\n");
  414. }
  415.