void DFU_FirmwareResetUserpage (void)
{
  u8 DFU_String_au8[4];

/*
  flashc_erase_all_gp_fuses (TRUE);

  flashc_write_gp_fuse_bit
  FC07FFFF

  flashc_set_all_gp_fuses ();
*/

  flashc_write_gp_fuse_bit (30,0);              // Set SP_IO_COND_EN  = 0 for DUF 1.0.3
  flashc_write_gp_fuse_bit (31,0);              // Set to 0 to start application for DUF 1.0.3



  flashc_erase_user_page (TRUE);

  DFU_String_au8[0] = TOOL_DFU_ISP_CONFIG_WORD_DEFAULT_0_0;
  DFU_String_au8[1] = TOOL_DFU_ISP_CONFIG_WORD_DEFAULT_0_1;
  DFU_String_au8[2] = TOOL_DFU_ISP_CONFIG_WORD_DEFAULT_0_2;
  DFU_String_au8[3] = TOOL_DFU_ISP_CONFIG_WORD_DEFAULT_0_3;
/*
  DFU_String_au8[0] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_0_0;
  DFU_String_au8[1] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_0_1;
  DFU_String_au8[2] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_0_2;
  DFU_String_au8[3] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_0_3;
*/

  flashc_memcpy(TOOL_DFU_ISP_CONFIG_ADDR_1,DFU_String_au8,4,TRUE);
}
void DFU_DisableFirmwareUpdate (void)
{
  u8 DFU_String_au8[4];

  DFU_String_au8[0] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_0;
  DFU_String_au8[1] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_1;
  DFU_String_au8[2] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_2;
  DFU_String_au8[3] = TOOL_DFU_ISP_CONFIG_WORD_START_APPL_3;

  flashc_memcpy(TOOL_DFU_ISP_CONFIG_ADDR_1,DFU_String_au8,4,TRUE);

  flashc_write_gp_fuse_bit (30,0);              // Set SP_IO_COND_EN  = 0 for DUF 1.0.3
  flashc_write_gp_fuse_bit (31,0);              // Set to 0 to start application for DUF 1.0.3

}
void flashc_set_gp_fuse_bit (unsigned int gp_fuse_bit, Bool value)
{
    if (value)
        flashc_erase_gp_fuse_bit (gp_fuse_bit, FALSE);
    else
        flashc_write_gp_fuse_bit (gp_fuse_bit, FALSE);
}
void DFU_EnableFirmwareUpdate (void)
{
  u8 DFU_String_au8[4];

  DFU_String_au8[0] = TOOL_DFU_ISP_CONFIG_WORD_START_DFU_0;
  DFU_String_au8[1] = TOOL_DFU_ISP_CONFIG_WORD_START_DFU_1;
  DFU_String_au8[2] = TOOL_DFU_ISP_CONFIG_WORD_START_DFU_2;
  DFU_String_au8[3] = TOOL_DFU_ISP_CONFIG_WORD_START_DFU_3;

  flashc_memcpy(TOOL_DFU_ISP_CONFIG_ADDR_1,DFU_String_au8,4,TRUE);

  flashc_erase_gp_fuse_bit (30,0);              // Set SP_IO_COND_EN  = 1 for DUF 1.0.3
  flashc_erase_gp_fuse_bit (31,0);              // Set to 1 to start bootloader for DUF 1.0.3

  flashc_write_gp_fuse_bit (30,1);              // Set SP_IO_COND_EN  = 1 for DUF 1.0.3
  flashc_write_gp_fuse_bit (31,1);              // Set to 1 to start application for DUF 1.0.3
}
示例#5
0
文件: flashc.c 项目: marshaev/MAVrick
void flashc_set_gp_fuse_bit(unsigned int gp_fuse_bit, bool value)
{
	if (value) {
		flashc_erase_gp_fuse_bit(gp_fuse_bit, false);
	} else {
		flashc_write_gp_fuse_bit(gp_fuse_bit, false);
	}
}
void flashc_write_gp_fuse_bitfield (unsigned int pos, unsigned int width, U64 value)
{
    unsigned int error_status = 0;
    unsigned int gp_fuse_bit;
    pos &= 0x3F;
    width = min (width, 64);
    for (gp_fuse_bit = pos; gp_fuse_bit < pos + width; gp_fuse_bit++, value >>= 1)
    {
        flashc_write_gp_fuse_bit (gp_fuse_bit, value & 0x01);
        error_status |= flashc_error_status;
    }
    flashc_error_status = error_status;
}
示例#7
0
/**
 * Main TWI handler
 */
void twi_handler(void) {
    struct ucinfo_t *info = &ucinfo;

    if (ts_rx_valid == true) {
        /* I must be a slave, I've received something */
        switch (slave_rx_addr) {
        case TWICMD_POWERUP:
            /*
             * Turn on a the power supply. If I'm getting this command, I'm a
             * slave and I must have standby power on, so there must be a power
             * supply on me. Separating this and TWICMD_STARTUP gets power to
             * ALL slaves, even those without power supplies, for when the
             * TWICMD_STARTUP happens.
             */
            info->addressing_complete = false;
            gpio_set_pin_high(SPARE_DOWN);
            gpio_set_pin_high(HAVE_USB);
            power_supply_on();
            break;

        case TWICMD_STARTUP:
            /* restart addressing cycle */
            info->addressing_complete = false;
            gpio_set_pin_high(SPARE_DOWN);
            gpio_set_pin_high(HAVE_USB);
            usb_powerup_request();
            break;

        case TWICMD_POWERDOWN:
            usb_powerdown_request();
            break;

        case TWICMD_ADDRESS:
            if (tmp1 < sizeof(addresses) / sizeof(addresses[0])) {
                addresses[tmp1] = slave_rx_data.b[0];
                su_pin[tmp1] = gpio_pin_is_high(SPARE_UP);
                sd_pin[tmp1] = gpio_pin_is_high(SPARE_DOWN);
                tmp1++;
            }

            if (gpio_pin_is_low(SPARE_UP) && gpio_pin_is_high(SPARE_DOWN)) {
                /* This is MY address! Grab it. */
                my_twi_address = slave_rx_data.b[0];
                my_twi_address_set = true;
                delay_msec(1);
                twi_slave_setup(my_twi_address);
                delay_msec(1);

                if (info->chain_configuration == CC_OPEN_UP) {
                    /*
                     * Send notification back up chain to master.
                     * Last address done
                     */
                    gpio_set_pin_low(HAVE_USB);
                } else {
                    /* Propagate down so next module gets next address. */
                    gpio_set_pin_low(SPARE_DOWN);
                }
            }
            break;

        case TWICMD_ADDRESSING_COMPLETE:
            info->addressing_complete = true;
            gpio_set_pin_high(SPARE_DOWN);
            gpio_set_pin_high(HAVE_USB);
            break;

        case TWICMD_FPGA_ASIC_CTL:
            fpga_reg_write(FA_ASIC_CONTROL,
                    (slave_rx_data.b[0] & F_FORCE_BAUD) ? (slave_rx_data.b[0] & ~F_FORCE_BAUD) : ((slave_rx_data.b[0] & ~F_ASIC_BAUD_MASK) | ucinfo.asic_baud_rate_code));
            break;

        case TWICMD_REBOOT:
            if (slave_rx_nb && slave_rx_data.b[0]) {
                /*
                 * Tell Atmel DFU loader not to start app ever again (harmless
                 * with custom loader).
                 */
                flashc_erase_gp_fuse_bit(31, true);
                flashc_write_gp_fuse_bit(31, true);
                /*
                 * Tell custom bootloader not to start app on this boot
                 * (harmless with Atmel DFU loader).
                 */
                AVR32_PM.gplp[1] = 0x73746179;
            }
            /* never returns */
            self_reset();
            break;

        case TWICMD_FAN_SET:
            set_fan_speed(slave_rx_data.b[0], slave_rx_data.b[1]);
            break;

        case TWICMD_DIE_SETTINGS:
            if (slave_rx_nb) {
                hf_nvram_write_die_settings(0, &slave_rx_data.opSettings);
            }
            break;

        case TWICMD_BAD_CORE_BITMAP:
            if (slave_rx_nb) {
                hf_nvram_write_bad_core_bitmap(0, (((uint16_t) slave_rx_data.b[0]) << 8) | slave_rx_data.b[1]);
            }
            break;

        case TWICMD_MIXED_BAUD:
            set_mixed_slave_baudrate();
            break;

        case TWICMD_VOLTAGE_SET:
            if (slave_rx_nb >= 3) {
                module_voltage_set(0, slave_rx_data.b[0], ((uint16_t) slave_rx_data.b[1] << 8) | slave_rx_data.b[2]);
            }
            break;

        default:
            break;
        }
        ts_rx_valid = false;
    }

    if (info->master == false) {
        if (info->addressing_complete == false) {
            /* propagate HAVE_USB back up chain to master during address cycle */
            if (info->chain_configuration == CC_MIDDLE) {
                if (gpio_pin_is_high(USB_DOWN)) {
                    gpio_set_pin_high(HAVE_USB);
                } else {
                    gpio_set_pin_low(HAVE_USB);
                }
            }
        }
    }

    masterHandler();
}