Beispiel #1
0
void comm_proceed(uint8_t data)
{
	if (comm_recv_error && data != 'F') return;
	comm_recv_error = 0;
	if (!comm_recv_pos)
	{
		comm_recv_crc = 0;
		comm_recv_done = 0;
	}
	comm_calc_recv_crc(data);
	unsigned int l = comm_recv_pos-4;
	switch (comm_recv_pos)
	{
		case 0:
			if (data != 'F')
			{
				comm_recv_error = 1;
				comm_start(COMMAND_ERROR_INVALID, 0);
			}
			break;
		case 1:
			comm_recv_command = data;
			break;
		case 2:
			comm_recv_length = data;
			break;
		case 3:
			comm_recv_length |= (uint16_t)data << 8;
			break;
		default:
			if (l >= RECV_BUFFER)
			{
				comm_recv_pos = 0;
				comm_recv_error = 1;
				comm_start(COMMAND_ERROR_OVERFLOW, 0);
				return;
			}			
			else if (l < comm_recv_length)
			{
				recv_buffer[l] = data;				
			} else if (l == comm_recv_length)
			{
				if (!comm_recv_crc)
				{
					comm_recv_done = 1;
				} 
				else
				{
					comm_recv_error = 1;
					comm_start(COMMAND_ERROR_CRC, 0);
				}
				comm_recv_pos = 0;
				return;
			}
			break;
	}
	comm_recv_pos++;
}
Beispiel #2
0
static void read_prg_send(unsigned int address, unsigned int len)
{
	LED_GREEN_ON;
	MODE_READ;
	comm_start(COMMAND_PRG_READ_RESULT, len);
	while (len > 0)
	{
		comm_send_byte(read_prg_byte(address));
		len--;
		address++;
	}
	LED_GREEN_OFF;
}
Beispiel #3
0
int df_init() {

    DFDEBUG("Starting init");

    comm_start(2, process_incoming_rget);

    // setup formatting
    formatting_init();
    formatting_add_rule("\\\\[\\[\\]\"]", "\"");

    DFDEBUG("Finished init");

    return 0;
}
Beispiel #4
0
void bfmcommIroIro<Float>::comm  (int result_cb, Fermion_t psi,int dag)  
{
  comm_start(result_cb,psi,dag);
  comm_complete(result_cb,psi);
}
Beispiel #5
0
void wfm::dslash(Float *chi, 
		 Float *u, 
		 Float *psi, 
		 int cb,
		 int dag)
{

  /*
   * To a first approximation, we simply
   * remap the arguments into a form acceptable
   * to the assembler, then call it
   */
  /*
   *Pull in the first Psi to cache early
   */
  cache_touch(psi);
  cache_touch(psi+4);
  cache_touch(psi+8);
  cache_touch(psi+12);
  cache_touch(psi+16);
  cache_touch(psi+20);
  decom(psi,u,cb,dag);

#ifdef DEBUG_BENCHMARK_COMMS
  double ndata = 2*2*allbound * 12 * TwoSpinSize() * 1.0E-6 * 100;
  struct timeval start,stop,delta;
  gettimeofday(&start,NULL);

  for(int i=0;i<100;i++) {
#endif
  comm_start(cb); 
  /*
   * Hackers: you could split here and do something else...
   * Such as DWF fith dimension, or a clover term etc...
   * Might as well pull in a few sites worth of pointer table 
   * while we're waiting for the comms
   */
  comm_complete(cb);
#ifdef DEBUG_BENCHMARK_COMMS
  }
  gettimeofday(&stop,NULL);
  timersub(&stop,&start,&delta);
  double seconds = delta.tv_usec * 1.0E-6 + delta.tv_sec;
  if ( isBoss() ) printf("Comms %le MB in %le seconds = %le MB/s\n",ndata,seconds,ndata/seconds);
  ndata = 2*2*allbound * 12 * TwoSpinSize() ;
  if ( isBoss() ) printf("ndata = %d \n",ndata);
#endif
#ifdef DEBUG_OUTPUT_VECTORS 
  static int file_cnt;
  {
    char buf[256];
  sprintf(buf,"2spin.%d.%d",UniqueID(),file_cnt);
  FILE *fp = fopen(buf,"w");
  for(int i=0;i<vol;i++) {
    for(int pm=0;pm<2;pm++){
      for(int mu=0;mu<4;mu++){
        int offset = interleave_site(pm,mu,i);
        for(int s=0;s<2;s++){
        for(int c=0;c<3;c++){
        for(int r=0;r<2;r++){
	  int scri;
          if ( WFM_BGL ) scri = r + s*6+c*2;        
	  else scri = r + s*2+c*4;        
          int gbl[4];
          site_to_global(cb, i, gbl, local_latt );
          if ( SloppyPrecision ) {
            float * pointer = (float *) two_spinor;
            fprintf(fp,"%d %d %d %d %d %d %d %d %d %e\n",gbl[0],gbl[1],gbl[2],gbl[3],
              pm,mu,s,c,r,pointer[PAD_HALF_SPINOR_SIZE*offset+scri]);
          } else { 
            Float * pointer = (Float *) two_spinor;
            fprintf(fp,"%d %d %d %d %d %d %d %d %d %e\n",gbl[0],gbl[1],gbl[2],gbl[3],
                    pm,mu,s,c,r,pointer[PAD_HALF_SPINOR_SIZE*offset+scri]);
          }
        }}}
      }
    }
  }
  fclose(fp);}
#endif 

  cache_touch(two_spinor);
  cache_touch(two_spinor+4);
  cache_touch(two_spinor+8); 
  recon(chi,u,cb,dag);
#ifdef DEBUG_OUTPUT_VECTORS
  {
  char buf[256];
  sprintf(buf,"recon.%d.%d",UniqueID(),file_cnt++);
  FILE *fp = fopen(buf,"w");
  for(int i=0;i<vol;i++) {
    for(int pm=0;pm<2;pm++){
      for(int mu=0;mu<4;mu++){
        int offset = interleave_site(pm,mu,i);
        for(int s=0;s<4;s++){
        for(int c=0;c<3;c++){
        for(int r=0;r<2;r++){
	  int scri;
          scri = r + s*6+c*2;        
	  Float * pointer = (Float *) chi;
          int gbl[4];
          site_to_global(cb, i, gbl, local_latt );
	  fprintf(fp,"%d %d %d %d %d %d %d %d %d %d %e\n",gbl[0],gbl[1],gbl[2],gbl[3],
                   i,pm,mu,s,c,r,pointer[SPINOR_SIZE*offset+scri]);
        }}}
      }
    }
  }
  fclose(fp);}
  exit(0);
#endif 
  return;
}
Beispiel #6
0
int main (void)
{
	// Short circuit test
	/*
	DDRB |= (1 << 6) | (1 << 7); // LEDS
	DDRD = (1<<7) | (1<<6); // ROMSEL, R/W
	PORTD = (1<<7) | (1<<6); // ROMSEL, R/W	

	while(1) 
	{
		int i;
		for (i = 0; i < 8; i++)
		{
			DDRA = 0;
			PORTA = 0xFF;
			DDRF = 0;
			PORTF = 0xFF;
			PORTA &= ~(1<<i);
			DDRA |= 1<<i;
			LED_RED_OFF;
			LED_GREEN_OFF;
			_delay_ms(500);
			if ((PINA != PORTA) || (PINF != PORTF))
			{
				LED_RED_ON;
			} else {
				LED_GREEN_ON;
			}
			_delay_ms(500);
		}
		for (i = 0; i < 8; i++)
		{
			DDRA = 0;
			PORTA = 0xFF;
			DDRF = 0;
			PORTF = 0xFF;
			PORTF &= ~(1<<i);
			DDRF |= 1<<i;
			LED_RED_OFF;
			LED_GREEN_OFF;
			_delay_ms(500);
			if ((PINA != PORTA) || (PINF != PORTF))
			{
				LED_RED_ON;
			} else {
				LED_GREEN_ON;
			}
			_delay_ms(500);
		}

	}
*/
/*
	DDRB |= (1 << 6) | (1 << 7); // LEDS
	DDRD = (1<<7) | (1<<6); // ROMSEL, R/W
	PORTD = (1<<7) | (1<<6); // ROMSEL, R/W

	while(1) 
	{
		int i;
		for (i = 0; i < 8; i++)
		{
			DDRC = 0;
			PORTC = 0xFF;
			PORTC &= ~(1<<i);
			DDRC |= 1<<i;
			LED_RED_OFF;
			LED_GREEN_OFF;
			_delay_ms(500);
			if ((PINC != PORTC))
			{
				LED_RED_ON;
			} else {
				LED_GREEN_ON;
			}
			_delay_ms(500);
		}

	}
*/

	sei();
	USART_init();
	USART_init2();	
		
#ifdef UPDATE_CHR_MODULE
  unsigned int bd = (F_CPU / (16UL * 19200UL)) - 1;
  UBRR0L = bd & 0xFF;
  UBRR0H = bd >> 8;
  UBRR1L = bd & 0xFF;
  UBRR1H = bd >> 8;
	LED_RED_ON;
	LED_GREEN_ON;		

	while(1)	{	}
#endif

	init_ports();	

	LED_RED_OFF;
	LED_GREEN_OFF;
	
	// MMC1 test
	/*
	set_address(0x8000);
	PHI2_LOW;
	MODE_WRITE;
	PORTC = 0;
	while (1)
	{
		LED_GREEN_OFF;
		ROMSEL_HI;
		_delay_ms(200);
		LED_GREEN_ON;
		ROMSEL_LOW;
		_delay_ms(200);
	}
	*/
	/*
	write_prg_byte(0x8000, 0x80);
	write_prg_byte(0x8000, 0); 
	write_prg_byte(0x8000, 0);
	write_prg_byte(0x8000, 1);
	write_prg_byte(0x8000, 1);
	write_prg_byte(0x8000, 0);
	
	write_prg_byte(0xe000, 0); 
	write_prg_byte(0xe000, 0);
	write_prg_byte(0xe000, 0);
	write_prg_byte(0xe000, 0);
	write_prg_byte(0xe000, 0);
	
	_delay_ms(500);
	
	MODE_READ;
	//set_address(0x8000);
	PORTA = 0;
	while(1);
	*/	
	
	comm_init();
	comm_start(COMMAND_PRG_STARTED, 0);

	uint16_t address;
	uint16_t length;	
	
	unsigned long int t = 0;
	char led_down = 0;
	int led_bright = 0;
	
	while (1)
	{
		TCCR1A |= (1<<COM1C1) | (1<<COM1B1) | (1<<WGM10);
		TCCR1B |= (1<<CS10);
		if (t++ >= 10000)
		{
			if (!led_down)
			{
				led_bright++;
				if (led_bright >= 110) led_down = 1;
			} else {
				led_bright--;
				if (!led_bright) led_down = 0;
			}
			if (led_bright >= 100) OCR1B = led_bright - 100;
			if (led_down)
			{
				int led_bright2 = 110-led_bright;
				if (led_bright2 <= 20)
				{
					if (led_bright2 > 10) led_bright2 = 20 - led_bright2;
					OCR1C = led_bright2*2;
				}
			}
			t = 0;
		}
		
		if (comm_recv_done)
		{
			t = led_down = led_bright = 0;
			TCCR1A = OCR1B = OCR1C = 0;
			
			switch (comm_recv_command)
			{
				case COMMAND_PRG_INIT:
					comm_start(COMMAND_PRG_STARTED, 0);
					break;
					
				case COMMAND_PRG_READ_REQUEST:
					address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
					length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
					read_prg_send(address, length);
					break;

				case COMMAND_PRG_WRITE_REQUEST:
					address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
					length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
					write_prg(address, length, (uint8_t*)&recv_buffer[4]);
					comm_start(COMMAND_PRG_WRITE_DONE, 0);
					break;

				case COMMAND_PHI2_INIT:
					phi2_init();
					comm_start(COMMAND_PHI2_INIT_DONE, 0);
					break;

				case COMMAND_RESET:
					reset_phi2();
					comm_start(COMMAND_RESET_ACK, 0);
					break;
					
				case COMMAND_EPROM_PREPARE:
					write_eprom_prepare();
					break;

				case COMMAND_PRG_EPROM_WRITE_REQUEST:
					address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
					length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
					write_eprom(address, length, (uint8_t*)&recv_buffer[4]);
					comm_start(COMMAND_PRG_WRITE_DONE, 0);
					break;

				case COMMAND_PRG_FLASH_ERASE_REQUEST:
					if (erase_flash())
						comm_start(COMMAND_PRG_WRITE_DONE, 0);
					break;

				case COMMAND_PRG_FLASH_WRITE_REQUEST:
					address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
					length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
					if (write_flash(address, length, (uint8_t*)&recv_buffer[4]))
						comm_start(COMMAND_PRG_WRITE_DONE, 0);
					break;

				case COMMAND_COOLGIRL_ERASE_SECTOR_REQUEST:
					if (erase_coolgirl_sector())
						comm_start(COMMAND_PRG_WRITE_DONE, 0);
					break;

				case COMMAND_COOLGIRL_WRITE_REQUEST:
					address = recv_buffer[0] | ((uint16_t)recv_buffer[1]<<8);
					length = recv_buffer[2] | ((uint16_t)recv_buffer[3]<<8);
					if (write_coolgirl(address, length, (uint8_t*)&recv_buffer[4]))
						comm_start(COMMAND_PRG_WRITE_DONE, 0);
					break;
			}
			comm_recv_done = 0;
		}		
	}
}