int main(int argc, char **argv)
{
	void *hnd;
	int ret = 1;
	int flags;

	/* Parse command line options */
	flags = parse_parameters(argc, argv);

	/* Open the USB device */
	hnd = open_ftdi_device(usb_vid, usb_pid, usb_interface, usb_serial);
	if (hnd == NULL)
		return 1;

	/* Trigger embedded monitor detection */
	if (send_special_waveform(hnd) < 0)
		goto terminate;

	if (config_i2c(hnd) < 0)
		goto terminate;

	if (check_chipid(hnd) < 0)
		goto terminate;

	if (flags & FLAG_UNPROTECT)
		command_write_unprotect(hnd);

	if (flags & FLAG_ERASE || output_filename)
		command_erase(hnd, flash_size, 0);

	if (input_filename) {
		ret = read_flash(hnd, input_filename, 0, flash_size);
		if (ret)
			goto terminate;
	}

	if (output_filename) {
		ret = write_flash(hnd, output_filename, 0);
		if (ret)
			goto terminate;
	}

	/* Normal exit */
	ret = 0;
terminate:
	/* Close the FTDI USB handle */
	ftdi_usb_close(hnd);
	ftdi_free(hnd);
	return ret;
}
static int send_special_waveform(struct ftdi_context *ftdi)
{
	int ret;
	int i;
	uint64_t *wave;
	uint8_t release_lines[] = {SET_BITS_LOW, 0, 0};

	wave = malloc(SPECIAL_BUFFER_SIZE);

	printf("Waiting for the EC power-on sequence ...");
	fflush(stdout);

retry:
	/* Reset the FTDI into a known state */
	ret = ftdi_set_bitmode(ftdi, 0xFF, BITMODE_RESET);
	if (ret != 0) {
		fprintf(stderr, "failed to reset FTDI\n");
		goto special_failed;
	}

	/*
	 * set the clock divider,
	 * so we output a new bitbang value every 2.5us.
	 */
	ret = ftdi_set_baudrate(ftdi, 160000);
	if (ret != 0) {
		fprintf(stderr, "failed to set bitbang clock\n");
		goto special_failed;
	}

	/* Enable asynchronous bit-bang mode */
	ret = ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG);
	if (ret != 0) {
		fprintf(stderr, "failed to set bitbang mode\n");
		goto special_failed;
	}

	/* do usb special waveform */

	wave[0] = 0x0;
	ftdi_write_data(ftdi, (uint8_t *)wave, 1);
	usleep(5000);

	/* program each special tick */
	for (i = 0; i < TICK_COUNT; ) {
		wave[i++] = SPECIAL_PATTERN_SDA_L_SCL_L;
		wave[i++] = SPECIAL_PATTERN_SDA_H_SCL_L;
		wave[i++] = SPECIAL_PATTERN_SDA_L_SCL_L;
	}
	wave[19] = SPECIAL_PATTERN_SDA_H_SCL_H;


	/* fill the buffer with the waveform pattern */
	for (i = TICK_COUNT; i < SPECIAL_BUFFER_SIZE / sizeof(uint64_t); i++)
		wave[i] = SPECIAL_PATTERN;

	ret = ftdi_write_data(ftdi, (uint8_t *)wave, SPECIAL_BUFFER_SIZE);
	if (ret < 0)
		fprintf(stderr, "Cannot output special waveform\n");

	/* clean everything to go back to regular I2C communication */
	ftdi_usb_purge_buffers(ftdi);
	ftdi_set_bitmode(ftdi, 0xff, BITMODE_RESET);
	config_i2c(ftdi);
	ftdi_write_data(ftdi, release_lines, sizeof(release_lines));

	/* wait for PLL stable for 5ms (plus remaining USB transfers) */
	usleep(10 * MSEC);

	/* if we cannot communicate, retry the sequence */
	if (check_chipid(ftdi) < 0) {
		sleep(1);
		goto retry;
	}
special_failed:
	printf("Done.\n");
	free(wave);
	return ret;
}
예제 #3
0
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;	// Stop watchdog ti

    config_clock();
    config_spi();
    config_i2c();
    config_gpio();


    // LED Table
    uint8_t led_table[TABLE_SIZE]; // [ 0x0E + Brightness | B | G | R ]
    off(led_table, NUM_LED);
    uint32_t i, reset_count=0;
    srand(32);

    /*
    	// TESTING
    	uint8_t IO_A, IO_B, IO_C, IO_D;
    	IO_A = IO_B = IO_C = IO_D = 0;
    */
    // SENSE Table
    uint16_t sense_table[NUM_SENSE];


    /*
    		UCB1I2CSA = SLAVE_ADDR_MASK; // Slave's address

    	while(UCB1CTL1 & UCTXSTP);
    	UCB1CTL1 |= UCTR | UCTXSTT; // Transmit and Start
    	while(!(UCB1IFG & UCTXIFG));
    	UCB1TXBUF = 0x00; // Inputs
    	while(!(UCB1IFG & UCTXIFG));
    	UCB1CTL1 |= UCTXSTP; // Stop
    */

//P6OUT |= BIT5; // get ready to turn off
//IR_INPUT; // high impedance

    for(;;)
    {
        P1OUT ^= 0x01; // blinky

        /*
        		gather(sense_table);
        		random_shift(led_table, 48*5);
        		//flip(led_table);
        		put_data_24(led_table, 48*5);
        		for(i=0;i<0xFFFF;i++) // shitty delay
        			__asm__("nop\nnop\nnop\nnop\nnop\nnop\nnop");
        		// inject(sense_table);

        */

        gather(sense_table);
        off(led_table, NUM_LED);
        process(led_table, sense_table);
        //random_shift(led_table, NUM_LED);
        put_data(led_table, NUM_LED);


        // Read Inputs
        /*
        	//while(UCB1CTL1 & UCTXSTP);
        	UCB1CTL1 &= ~UCTR;
        	UCB1CTL1 |= UCTXSTT; // Transmit and Start
        	while(UCB1CTL1 & UCTXSTT);

        	while(!(UCB1IFG & UCRXIFG));
        	IO_A = UCB1RXBUF; // PORT 0 INPUT
        	while(!(UCB1IFG & UCRXIFG));
        	IO_B = UCB1RXBUF; // PORT 1 INPUT
        	while(!(UCB1IFG & UCRXIFG));
        	IO_C = UCB1RXBUF; // PORT 0 INPUT


        	UCB1CTL1 |= UCTXSTP; // Stop
        	while(UCB1CTL1 & UCTXSTP);
        	while(!(UCB1IFG & UCRXIFG));
        	IO_D = UCB1RXBUF; // PORT 1 INPUT

        	if(IO_B&0x01)
        		P1OUT |= 0x01;
        	else
        		P1OUT ^= 0x01;

        */

        /*
        		for(i=0;i<0xFFFF;i++) // shitty delay
        			__asm__("nop\nnop\nnop\nnop\nnop\nnop\nnop");
        			*/
    } // main loop

    return 0;
}