//bus pirate initialization
//setup clock, terminal UART, pins, LEDs, and display version info
void Initialize(void){

	CLKDIVbits.RCDIV0=0; //clock divider to 0
	AD1PCFG = 0xFFFF;                 // Default all pins to digital
	OSCCONbits.SOSCEN=0;	

	BP_LEDMODE_DIR=0; //MODE LED output

	IODIR|=(AUX+MOSI+CLK+MISO+CS);//AUX, MOSI, CLK, MISO, CS pins to input
	IOLAT&=(~AUX+MOSI+CLK+MISO+CS); //low pin

	//modify setup behavior according to defines in base.h
	#ifdef BUSPIRATEV2 //only for v2 and v3, not v1a or v0a
		#if defined(ENABLE_PULLUP_RESISTORS)
			BP_PULLUP_ON();	//enable pullups
		#else
			BP_PULLUP_OFF();//disable pullups
		#endif
	#endif

	#if defined(ENABLE_VREG)
		BP_VREG_ON();		//enable vreg
	#else
		BP_VREG_OFF();		//disable vreg
	#endif

	//set pin configuration using peripheral pin select
	BP_TERM_RX=BP_TERM_RX_RP;   //Inputs UART1 RX RPINR18bits.U1RXR=4;
	BP_TERM_TX_RP=BP_TERM_TX; 		// Outputs UART1 TX RPOR1bits.RP3R=U1TX_IO;
}
Example #2
0
//get bus pirate ready after first start
//or clean up after any dirty modules
//modules MUST teardown any PPS functions on the CMD_CLEANUP command
void bpInit(void){
	//do this manually so there aren't problems with hardware
	//that has I/O on different ports
	BP_MOSI_DIR=1;
	BP_CLK_DIR=1; 
	BP_MISO_DIR=1;
	BP_CS_DIR=1; 
	BP_AUX0_DIR=1;
	BP_LEDMODE=0; //mode LED OFF
	BP_LEDMODE_DIR=0;
	#ifdef BUSPIRATEV4
		BP_USBLED_OFF();
		BPV4_HWI2CPINS_SETUP();
		BP_BUTTON_SETUP();
		BP_3V3PU_OFF();
		//BP_5VPU_OFF();
		BP_EEPROM_SETUP();
	#endif
	#ifdef BUSPIRATEV1A
		BP_PIN6_DIR=1; //AUX2... unused
		BP_LEDPWR=1; //light power led
		BP_LEDPWR_DIR=0;
	#endif

	BP_AUX_RPOUT = 0;    //remove output from AUX pin (PWM/servo modes)

	bpConfig.busMode=HIZ;

	clearModeConfig(); //reset the mode settings structure
	
	#ifndef BUSPIRATEV1A
		BP_PULLUP_OFF();
	#endif

	BP_VREG_OFF();//disable the VREG

	//setup voltage monitoring on ADC. see hardwarevx.h!
	BP_ADC_PINSETUP();

	//configure the ADC
	AD1CON1bits.SSRC  = 0b111;// SSRC<3:0> = 111 implies internal
								// counter ends sampling and starts
								// converting.
	AD1CSSL = 0;
	AD1CON3 = 0x1F02; // Sample time = 31Tad,
						// Tad = 2 Tcy
	AD1CON2 = 0;
}
Example #3
0
void binIOperipheralset(unsigned char inByte){

	if(inByte&0b1000){
		BP_VREG_ON();//power on
	}else{
		BP_VREG_OFF();//power off
	}
	
	#ifndef BUSPIRATEV1A
	if(inByte&0b100){
		BP_PULLUP_ON();//pullups on
	}else{
		BP_PULLUP_OFF();
	}
	#endif
	#if defined(BUSPIRATEV1A)
	if(inByte&0b100){
		BP_AUX2_HI();//AUX2 control
	}else{
		BP_AUX2_LOW();
	}
	#endif

	//AUX pin, high/low only
	if(inByte&0b10){
		BP_AUX0_DIR=0;//aux output
		BP_AUX0=1;//aux high
	}else{
		BP_AUX0_DIR=0;//aux output
		BP_AUX0=0;//aux low
	}

	//CS pin, follows HiZ setting
	if(inByte&0b1){
		if(modeConfig.HiZ==1){
			IODIR|=CS; //CS iput in open drain mode
		}else{	
			IOLAT|=CS; //CS high
			IODIR&=(~CS); //CS output
		}
	}else{
		IOLAT&=(~CS); //BP_CS=0;
		IODIR&=(~CS); //CS output
	}

	//UART1TX(1);//send 1/OK		
}
Example #4
0
void bp_reset_board_state(void) {
  BP_MOSI_DIR = INPUT;
  BP_CLK_DIR = INPUT;
  BP_MISO_DIR = INPUT;
  BP_CS_DIR = INPUT;
  BP_AUX0_DIR = INPUT;
  BP_LEDMODE = OFF;
  BP_LEDMODE_DIR = OUTPUT;
#ifdef BUSPIRATEV4
  BP_USBLED_OFF();
  BPV4_HWI2CPINS_SETUP();
  BP_BUTTON_SETUP();
  BP_3V3PU_OFF();
  eeprom_initialize();
#endif /* BUSPIRATEv4 */

  /* Detach source from the currently-set AUX pin. */
  BP_AUX_RPOUT = OFF;

  bus_pirate_configuration.bus_mode = BP_HIZ;
  clear_mode_configuration();
  BP_PULLUP_OFF();
  BP_VREG_OFF();
  BP_ADC_PINSETUP();

  /* Configure the ADC. */

  /* Enable automatic sample conversion. */
  AD1CON1bits.SSRC = 0b111;

  /*
   * AD1CSSL : A/D INPUT SCAN SELECT REGISTER
   *
   * MSB
   * 0--0000000000000
   * |  |||||||||||||
   * |  +++++++++++++-- CSSL{12:0}: Omit A/D input pins from scan.
   * +----------------- CSSL15:     Band gap voltage reference not scanned.
   */
  AD1CSSL = 0x0000;

  /*
   * AD1CON3 : A/D CONTROL REGISTER 3
   *
   * MSB
   * 0--1111100000010
   * |  |||||||||||||
   * |  |||||++++++++-- ADCS: A/D conversion clock is 3 * Tcy.
   * |  +++++---------- SAMC: Sample time is 31 * Tad (Tad = 3 * Tcy).
   * +----------------- ADRC: Clock is derived from system clock.
   */
  AD1CON3 = 0x1F02;

  /*
   * AD1CON2 : A/D CONTROL REGISTER 2
   *
   * MSB
   * 000--0--x-000000
   * |||  |    ||||||
   * |||  |    |||||+-- ALTS:  Use MUX A input settings.
   * |||  |    ||||+--- BUFM:  Buffer is one single 16-bits word.
   * |||  |    ++++---- SMPI:  Interrupt on each sample conversion completion.
   * |||  +------------ CSCNA: Do not scan inputs.
   * +++--------------- VCFG:  VR+ is AVdd and VR- is AVss.
   */
  AD1CON2 = 0x0000;
}
Example #5
0
//self test, showProgress=1 displays the test results in the terminal, set to 0 for silent mode
//errors are counted in the global errors variable
//returns number of errors
unsigned char selfTest(unsigned char showProgress, unsigned char jumperTest){
//toggle display of test results with show Progress variable
	errors=0;
	if(!showProgress) bpConfig.quiet=1;
	
//instructions (skip pause if no display output)
	if(showProgress && jumperTest){
		//bpPOSTWline("Disconnect any devices");
		//bpPOSTWline("Connect (Vpu to +5V) and (ADC to +3.3V)");
		BPMSG1163;
		BPMSG1251; // //bpPOSTWline("Press a key to start");
		//JTR Not required while(!UART1RXRdy()); //wait for key
		UART1RX();//discard byte
	}

	//bpPOSTWline("Ctrl");
	BPMSG1164;
	BP_AUX0=1;
	BP_AUX0_DIR=0;
	//bpPOSTWstring("AUX");
	BPMSG1165;
	bpTest(BP_AUX0,1);
	BP_AUX0=0;
	BP_AUX0_DIR=1;
				
	BP_LEDMODE=1;
	BP_LEDMODE_DIR=0;	
	//bpPOSTWstring("MODE LED");
	BPMSG1166;
	bpTest(BP_LEDMODE,1);
	BP_LEDMODE=0;
	
	BP_PULLUP_ON();
	//bpPOSTWstring("PULLUP H");
	BPMSG1167;
	bpTest(BP_PULLUP,1);
	BP_PULLUP_OFF();
	//bpPOSTWstring("PULLUP L");
	BPMSG1168;
	bpTest(BP_PULLUP,0);
	
	BP_VREG_ON();
	bpDelayMS(2);//in silent mode there's not enought delay for the power supplied to come on
	//bpPOSTWstring("VREG");
	BPMSG1169;
	bpTest(BP_VREGEN,1);

#if defined (BUSPIRATEV4)
	BPMSG1265; //bpWline("EEPROM");
	BPMSG1266; //bpWstring("SCL");
	bpTest(BP_EE_SCL, 1);
	BPMSG1267; //bpWstring("SDA");
	bpTest(BP_EE_SDA, 1);
	BPMSG1268; //bpWstring("WP");
	bpTest(BP_EE_WP, 1);
	BPMSG1269; //bpWstring("ACK");
    bpTest(eetest(), 0);
#endif

	//ADC check
	//bpPOSTWline("ADC and supply");
	BPMSG1170;
	ADCON(); // turn ADC ON

#if defined (BUSPIRATEV4)
	BPMSG1270; //bpWstring("Vusb");
	bpADCPinTest(BP_ADC_USB,V5L, V5H);

	//bpPOSTWstring("5V");
	BPMSG1171;
	bpADCPinTest(BP_ADC_5V0,V5L, V5H);

	//enable 5v0 pullup and test
	BP_5VPU_ON();
	BPMSG1171; //bpWstring("5V0 VPU");
	bpWstring(" ");
	BPMSG1172; //VPU 
	
	bpDelayMS(2);
	bpADCPinTest(BP_ADC_VPU,V5L, V5H);
	BP_5VPU_OFF();

	//ADC test (3.3 volts)
	if(jumperTest){
		//ADC is connected to 3.3 volts
		//bpPOSTWstring("ADC");
		BPMSG1174;
		bpADCPinTest(BP_ADC_PROBE,V33L, V33H);
	}	

	//bpPOSTWstring("3.3V");
	BPMSG1173;
	bpADCPinTest(BP_ADC_3V3,V33L, V33H);

	//enable 3v3 pullup and test
	BP_3V3PU_ON();
	BPMSG1173; //bpWstring("3V3 VPU");
	bpWstring(" ");
	BPMSG1172; //VPU 
	
	bpDelayMS(2);
	bpADCPinTest(BP_ADC_VPU,V33L, V33H);
	BP_3V3PU_OFF();

#elif defined (BUSPIRATEV3)
	 //v3 test
	//0x030F is 5volts
	//bpPOSTWstring("5V");
	BPMSG1171;
	bpADCPinTest(BP_ADC_5V0,V5L, V5H);
	
	if(jumperTest){
		//Vpullup is connected to 5volts
		//bpPOSTWstring("VPU");
		BPMSG1172;
		bpADCPinTest(BP_ADC_VPU,V5L, V5H);
	}

	//0x0208 is 3.3volts
	//bpPOSTWstring("3.3V");
	BPMSG1173;
	bpADCPinTest(BP_ADC_3V3,V33L, V33H);

	if(jumperTest){
		//ADC is connected to 3.3volts
		//bpPOSTWstring("ADC");
		BPMSG1174;
		bpADCPinTest(BP_ADC_PROBE,V33L, V33H);
	}
#endif

	ADCOFF(); // turn ADC OFF 

//*************
//
//  Test bus pins three ways, also tests on-board pullup resistors:
//	1. normal/high, 2. open collector ground, 3. open collector high.
//
//***************

	//pullup off, pins=output & high, read input, high?
	//bpPOSTWline("Bus high");
	BPMSG1175;
	IODIR&= ~(ALLIO);//output
	IOLAT|=ALLIO; //high	
	bpDelayMS(100);
	bpBusPinsTest(1);

	//pullup on, pins=output & low, read input, low?
	//bpPOSTWline("Bus Hi-Z 0");
	BPMSG1176;
	IOLAT&= ~(ALLIO); //low
	if(jumperTest){
		#if defined	(BUSPIRATEV4)	
		BP_3V3PU_ON();
		#endif
		BP_PULLUP_ON();
	}
	bpDelayMS(100);
	bpBusPinsTest(0);

	if(jumperTest){
	//pullup on, pins=input & low, read input, high?
		//bpPOSTWline("Bus Hi-Z 1");
		BPMSG1177;
		IODIR|=ALLIO;//output
		bpDelayMS(100);
		bpBusPinsTest(1);
		#if defined	(BUSPIRATEV4)	
		BP_3V3PU_OFF();
		#endif
	}

//instructions (skip pause if no display output)
	if(showProgress && jumperTest){
		BP_VREG_ON();
		BP_MODELED_ON();
		//bpPOSTWline("MODE and VREG LEDs should be on! Any key exits.");
		#if defined (BUSPIRATEV4)
			BP_USBLED_ON();
		#endif
		BPMSG1178;
		BPMSG1250;
		//JTR Not required while(!UART1RXRdy());
		UART1RX();
		#ifdef BUSPIRATEV4
			BP_USBLED_OFF();
		#endif
		BP_MODELED_OFF();
		BP_VREG_OFF();
	}

	bpInit();//clean up

	BPMSG1179;
	bpWdec(errors);
	BPMSG1180;
	bpConfig.quiet=0;


	return errors;

}
void binpic(void)
{	unsigned char cmd;
	int ok;
	unsigned int temp;

	bpWstring("PIC1");
	modeConfig.HiZ=1;				// to allow different Vcc 
	bbL(MOSI|CLK, PICSPEED);		// pull both pins to 0 before applying Vcc and Vpp
	picmode=PICMODE6;
	piccmddelay=2;

	while(1)
	{	cmd=UART1RX();

		switch(cmd&0xC0)
		{	case 0x00:	ok=1;
						switch(cmd&0xF0)
						{	case 0x00:	switch(cmd)
										{	case 0x00:	return;
											case 0x01:	bpWstring("PIC1");
														break;
											case 0x02:	picmode=PICMODE6;
														break;
											case 0x03:	picmode=PICMODE4;
														break;
											case 0x04:
											case 0x05:
											case 0x06:
											case 0x07:	piccmddelay=(cmd-0x04);
														break;
											default:	ok=0;
										}
										break;
							case 0x10:	if(cmd&0x08)
										{	if(cmd&0x04)
											{	bbH(AUX ,5);
											}
											else
											{	bbL(AUX ,5);
											}
											if(cmd&0x02)
											{	bbH(MISO ,5);
											}
											else
											{	bbL(MISO ,5);
											}
											if(cmd&0x01)
											{	bbH(CS ,5);
											}
											else
											{	bbL(CS ,5);
											}
										}
										else
										{	if(cmd&0x04)	// pwm?
											{	PWMfreq=100;
												PWMduty=50;
												updatePWM();
											}
											else
											{	PWMfreq=0;
												updatePWM();
											}
											if(cmd&0x02)	// vreg on
											{	BP_VREG_ON();
												//modeConfig.vregEN=1;
											}
											else
											{	BP_VREG_OFF();
												//modeConfig.vregEN=0;
											}
											if(cmd&0x01)	// pullup on
#ifndef BUSPIRATEV1A
											{	BP_PULLUP_ON(); 
//												modeConfig.pullupEN=1;
											}
											else
											{	BP_PULLUP_OFF();
//												modeConfig.pullupEN=0;
											}
#endif
										}
										break;
							default:	ok=0;
						}
						if(ok)
						{	UART1TX(1);
						}
						else
						{	UART1TX(0);
						}
						break;
			case 0x40:	picmode|=PICCMD;
						picwrite(cmd&0x3F);
						picmode&=PICMODEMSK;
						UART1TX(1);
						break;
			case 0x80:	picmode|=PICCMD;
						picwrite(cmd&0x3F);
						picmode&=PICMODEMSK;
						temp=UART1RX();
						temp<<=8;
						temp|=UART1RX();
						picwrite(temp);
						UART1TX(1);
						break;
			case 0xC0:	picmode|=PICCMD;
						picwrite(cmd&0x3F);
						picmode&=PICMODEMSK;
						UART1TX(1);
						temp=picread();
						UART1TX(temp>>8);
						UART1TX(temp&0x0FF);
						break;
		}
	}
}		
Example #7
0
uint8_t perform_selftest(bool show_progress, bool jumper_test) {

  errors = 0;
  if (!show_progress) {
    bus_pirate_configuration.quiet = true;
  }

  /* Alert the user to perform the required manual operations if needed. */

  if (show_progress && jumper_test) {

    /* Print alert. */
    BPMSG1163;
    BPMSG1251;

    /* Wait for a character to come in. */
    user_serial_read_byte();
  }

  /* Start the test procedure. */

  BPMSG1164;

  /* Check whether AUX0 goes HIGH when requested. */

  BP_AUX0 = HIGH;
  BP_AUX0_DIR = OUTPUT;
  BPMSG1165;
  check_result(BP_AUX0, HIGH);
  BP_AUX0 = LOW;
  BP_AUX0_DIR = INPUT;

  /* Check whether the LED line goes HIGH when requested. */

  BP_LEDMODE = HIGH;
  BP_LEDMODE_DIR = OUTPUT;
  BPMSG1166;
  check_result(BP_LEDMODE, HIGH);
  BP_LEDMODE = LOW;

  /* Check whether the pull-up line goes HIGH when requested. */

  BP_PULLUP_ON();
  BPMSG1167;
  check_result(BP_PULLUP, HIGH);

  /* Check whether the pull-up line goes LOW when requested. */

  BP_PULLUP_OFF();
  BPMSG1168;
  check_result(BP_PULLUP, LOW);

  /* Check whether the regulated voltage line goes HIGH when requested. */

  BP_VREG_ON();
  bp_delay_ms(PWR_STATE_TEST_DELAY);
  BPMSG1169;
  check_result(BP_VREGEN, HIGH);

#ifdef BUSPIRATEV4

  /* Test the internal EEPROM. */

  BPMSG1265;

  /* Check the I2C flash clock line. */
  BPMSG1266;
  check_result(BP_EE_SCL, HIGH);

  /* Check the I2C flash data line. */
  BPMSG1267;
  check_result(BP_EE_SDA, HIGH);

  /* Check the I2C flash WRITE PROTECT line. */
  BPMSG1268;
  check_result(BP_EE_WP, HIGH);

  /* Performs a more complete EEPROM test. */

  BPMSG1269;
  check_result(eeprom_test(), true);

#endif /* BUSPIRATEV4 */

  /* ADC check. */

  BPMSG1170;

  /* Turn ADC on. */
  ADCON();

#ifdef BUSPIRATEV4

  /* Check whether the voltage coming in from the USB port is within range. */

  BPMSG1270;
  perform_adc_test(BP_ADC_USB, V5L, V5H);

#endif /* BUSPIRATEV4 */

  /* Check whether the +5v rail output is within range. */

  BPMSG1171;
  perform_adc_test(BP_ADC_5V0, V5L, V5H);

#ifdef BUSPIRATEV4

  /* Test the +5v pull-up line. */

  BP_5VPU_ON();
  BPMSG1171;
  bpSP;
  BPMSG1172;
  bp_delay_ms(PWR_STATE_TEST_DELAY);
  perform_adc_test(BP_ADC_VPU, V5L, V5H);
  BP_5VPU_OFF();

  if (jumper_test) {

    /*
     * Check whether the +3.3v rail output is within range when measured from
     * outside the board circuitry, once a jumper wire is manually placed
     * between the +3.3v rail pin and the ADC input pin.
     */

    BPMSG1174;
    perform_adc_test(BP_ADC_PROBE, V33L, V33H);
  }

  /*
   * Check whether the +3.3v rail output is within range when measured from
   * inside the board circuitry.
   */

  BPMSG1173;
  perform_adc_test(BP_ADC_3V3, V33L, V33H);

  /* Test the +3.3v pull-up line. */

  BP_3V3PU_ON();
  BPMSG1173;
  bpSP;
  BPMSG1172;
  bp_delay_ms(PWR_STATE_TEST_DELAY);
  perform_adc_test(BP_ADC_VPU, V33L, V33H);
  BP_3V3PU_OFF();

#elif defined(BUSPIRATEV3)

  if (jumper_test) {

    /*
     * Check whether the +5v pull-up output is within range when measured from
     * outside the board circuitry, once a jumper wire is manually placed
     * between the +5v pull-up pin and the ADC input pin.
     */

    BPMSG1172;
    perform_adc_test(BP_ADC_VPU, V5L, V5H);
  }

  /* Check whether the +3.3v rail output is within range. */

  BPMSG1173;
  perform_adc_test(BP_ADC_3V3, V33L, V33H);

  if (jumper_test) {

    /*
     * Check whether the +3.3v rail output is within range when measured from
     * outside the board circuitry, once a jumper wire is manually placed
     * between the +3.3v rail pin and the ADC input pin.
     */

    BPMSG1174;
    perform_adc_test(BP_ADC_PROBE, V33L, V33H);
  }

#endif /* BUSPIRATEV4 || BUSPIRATEV3 */

  /* Turn ADC off. */
  ADCOFF();

  /*
   * Pull all I/O pins HIGH with pull-ups deactivated, and check the pins
   * state afterwards.
   */

  BPMSG1175;
  IODIR &= ~ALLIO;
  IOLAT |= ALLIO;
  bp_delay_ms(PIN_STATE_TEST_DELAY);
  perform_pins_state_test(HIGH);

  /*
   * Pull all I/O pins LOW with pull-ups active and check the pins state
   * afterwards.
   */

  BPMSG1176;
  IOLAT &= ~ALLIO;
  if (jumper_test) {
#ifdef BUSPIRATEV4
    BP_3V3PU_ON();
#endif /* BUSPIRATEV4 */
    BP_PULLUP_ON();
  }
  bp_delay_ms(PIN_STATE_TEST_DELAY);
  perform_pins_state_test(LOW);

  if (jumper_test) {
    /*
     * Pull all I/O pins HIGH with pull-ups active and check the pins state
     * afterwards.
     */

    /* TODO: should this be done without jumpers too? */

    BPMSG1177;
    IODIR |= ALLIO;
    bp_delay_ms(PIN_STATE_TEST_DELAY);
    perform_pins_state_test(HIGH);
#ifdef BUSPIRATEV4
    BP_3V3PU_OFF();
#endif /* BUSPIRATEV4 */
  }

  if (show_progress && jumper_test) {

    /*
     * Alert the user to check the LED on/off states, and prompt for a key
     * to be pressed to continue.
     */

    BP_VREG_ON();
    BP_MODELED_ON();
#ifdef BUSPIRATEV4
    BP_USBLED_ON();
#endif /* BUSPIRATEV4 */
    BPMSG1178;
    MSG_ANY_KEY_TO_EXIT_PROMPT;
    user_serial_read_byte();
#ifdef BUSPIRATEV4
    BP_USBLED_OFF();
#endif /* BUSPIRATEV4 */
    BP_MODELED_OFF();
    BP_VREG_OFF();
  }

  bp_reset_board_state();

  BPMSG1179;
  bp_write_dec_byte(errors);
  BPMSG1180;
  bus_pirate_configuration.quiet = false;

  return errors;
}