firmware/greatfet_usb/rhododendron/configuration.c
int boot_up_phy(void)
{
	const uint32_t phy_startup_phase_timeout = 100 * 1000; // 100mS

	int rc;

	pr_info("rhododendron: booting up PHY!\n");


	// Clear the PHY's (active-low) reset, allowing it to start up.
	gpio_set_pin_value(ulpi_phy_reset, true);

	delay_us(10000);

	gpio_set_pin_value(ulpi_stp_gpio, false);

	/*

	// On startup, the PHY should assert DIR until the ULPI clock stabilizes.
	rc = wait_with_timeout(ulpi_dir_gpio, true, phy_startup_phase_timeout);
	if (rc) {
		pr_error("rhododendron: error: timed out waiting for PHY startup (waiting for DIR to assert)\n");
		return rc;
	}

	*/

	// Wait for the PHY to de-assert the DIR pin, which means it's completed startup.
	rc = wait_with_timeout(ulpi_dir_gpio, false, phy_startup_phase_timeout);
	if (rc) {
		pr_error("rhododendron: error: timed out waiting for PHY startup (waiting for PLL to stabilize)\n");
		return rc;
	}

	// If none of the above timed out, indicate success.
	return 0;
}
/**
 * Initializes a connected Rhododendron board, preparing things for analysis.
 *
 * @return 0 on success, or an error code if the board could not be brought up
 */
Initializes a connected Rhododendron board, preparing things for analysis.
@return 0 on success, or an error code if the board could not be brought up
Initializes a connected Rhododendron board preparing things for analysis . @return 0 on success or an error code if the board could not be brought up
int boot_up_phy(void)
{
	const uint32_t phy_startup_phase_timeout = 100 * 1000; 
	int rc;
	pr_info("rhododendron: booting up PHY!\n");
	gpio_set_pin_value(ulpi_phy_reset, true);
	delay_us(10000);
	gpio_set_pin_value(ulpi_stp_gpio, false);
	rc = wait_with_timeout(ulpi_dir_gpio, false, phy_startup_phase_timeout);
	if (rc) {
		pr_error("rhododendron: error: timed out waiting for PHY startup (waiting for PLL to stabilize)\n");
		return rc;
	}
	return 0;
}
int boot_up_phy ( void ) { const uint32_t phy_startup_phase_timeout = 100 * 1000 ; int rc ; pr_info ( " \n " ) ; gpio_set_pin_value ( ulpi_phy_reset , true ) ; delay_us ( 10000 ) ; gpio_set_pin_value ( ulpi_stp_gpio , false ) ; rc = wait_with_timeout ( ulpi_dir_gpio , false , phy_startup_phase_timeout ) ; if ( rc ) { pr_error ( " \n " ) ; return rc ; } return 0 ; }
Initializes a connected Rhododendron board, preparing things for analysis.
Initializes a connected Rhododendron board preparing things for analysis .
// 100mS // Clear the PHY's (active-low) reset, allowing it to start up. /*

	// On startup, the PHY should assert DIR until the ULPI clock stabilizes.
	rc = wait_with_timeout(ulpi_dir_gpio, true, phy_startup_phase_timeout);
	if (rc) {
		pr_error("rhododendron: error: timed out waiting for PHY startup (waiting for DIR to assert)\n");
		return rc;
	}

	*/ // Wait for the PHY to de-assert the DIR pin, which means it's completed startup. // If none of the above timed out, indicate success.