示例#1
0
static int sysfsgpio_init(void)
{
	bitbang_interface = &sysfsgpio_bitbang;

	LOG_INFO("SysfsGPIO JTAG bitbang driver");

	if (!(is_gpio_valid(tck_gpio)
			&& is_gpio_valid(tms_gpio)
			&& is_gpio_valid(tdi_gpio)
			&& is_gpio_valid(tdo_gpio))) {
		if (!is_gpio_valid(tck_gpio))
			LOG_ERROR("gpio num for tck is invalid");
		if (!is_gpio_valid(tms_gpio))
			LOG_ERROR("gpio num for tms is invalid");
		if (!is_gpio_valid(tdo_gpio))
			LOG_ERROR("gpio num for tdo is invalid");
		if (!is_gpio_valid(tdi_gpio))
			LOG_ERROR("gpio num for tdi is invalid");

		LOG_ERROR("Require tck, tms, tdi and tdo gpios to all be specified");
		return ERROR_JTAG_INIT_FAILED;
	}

	if (!is_gpio_valid(trst_gpio) && !is_gpio_valid(srst_gpio)) {
		LOG_ERROR("Require at least one of trst or srst gpios to be specified");
		return ERROR_JTAG_INIT_FAILED;
	}

	/*
	 * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST
	 * as outputs.  Drive TDI and TCK low, and TMS/TRST/SRST high.
	 */
    tck_ld = ld(tck_gpio); 
	tck_fd = setup_sysfs_gpio(tck_gpio, 1, 0);
	if (tck_fd < 0)
		goto out_error;

    tms_ld = ld(tms_gpio);
	tms_fd = setup_sysfs_gpio(tms_gpio, 1, 1);
	if (tms_fd < 0)
		goto out_error;

    tdi_ld = ld(tdi_gpio);
	tdi_fd = setup_sysfs_gpio(tdi_gpio, 1, 0);
	if (tdi_fd < 0)
		goto out_error;

    tdo_ld = ld(tdo_gpio);
	tdo_fd = setup_sysfs_gpio(tdo_gpio, 0, 0);
	if (tdo_fd < 0)
		goto out_error;

    trst_ld = ld(trst_gpio);
	/* assume active low*/
	if (trst_gpio > 0) {
		trst_fd = setup_sysfs_gpio(trst_gpio, 1, 1);
		if (trst_fd < 0)
			goto out_error;
	}

    srst_ld = ld(srst_gpio);
	/* assume active low*/
	if (srst_gpio > 0) {
		srst_fd = setup_sysfs_gpio(srst_gpio, 1, 1);
		if (srst_fd < 0)
			goto out_error;
	}

	return ERROR_OK;

out_error:
	cleanup_all_fds();
	return ERROR_JTAG_INIT_FAILED;
}
示例#2
0
static int sysfsgpio_quit(void)
{
	cleanup_all_fds();
	return ERROR_OK;
}
示例#3
0
static int sysfsgpio_init(void)
{
	bitbang_interface = &sysfsgpio_bitbang;

	LOG_INFO("SysfsGPIO JTAG/SWD bitbang driver");

	if (sysfsgpio_jtag_mode_possible()) {
		if (sysfsgpio_swd_mode_possible())
			LOG_INFO("JTAG and SWD modes enabled");
		else
			LOG_INFO("JTAG only mode enabled (specify swclk and swdio gpio to add SWD mode)");
	} else if (sysfsgpio_swd_mode_possible()) {
		LOG_INFO("SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode)");
	} else {
		LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode and/or swclk and swdio gpio for SWD mode");
		return ERROR_JTAG_INIT_FAILED;
	}


	/*
	 * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST
	 * as outputs.  Drive TDI and TCK low, and TMS/TRST/SRST high.
	 * For SWD, SWCLK and SWDIO are configures as output high.
	 */
	if (tck_gpio >= 0) {
		tck_fd = setup_sysfs_gpio(tck_gpio, 1, 0);
		if (tck_fd < 0)
			goto out_error;
	}

	if (tms_gpio >= 0) {
		tms_fd = setup_sysfs_gpio(tms_gpio, 1, 1);
		if (tms_fd < 0)
			goto out_error;
	}

	if (tdi_gpio >= 0) {
		tdi_fd = setup_sysfs_gpio(tdi_gpio, 1, 0);
		if (tdi_fd < 0)
			goto out_error;
	}

	if (tdo_gpio >= 0) {
		tdo_fd = setup_sysfs_gpio(tdo_gpio, 0, 0);
		if (tdo_fd < 0)
			goto out_error;
	}

	/* assume active low*/
	if (trst_gpio >= 0) {
		trst_fd = setup_sysfs_gpio(trst_gpio, 1, 1);
		if (trst_fd < 0)
			goto out_error;
	}

	/* assume active low*/
	if (srst_gpio >= 0) {
		srst_fd = setup_sysfs_gpio(srst_gpio, 1, 1);
		if (srst_fd < 0)
			goto out_error;
	}

	if (swclk_gpio >= 0) {
		swclk_fd = setup_sysfs_gpio(swclk_gpio, 1, 0);
		if (swclk_fd < 0)
			goto out_error;
	}

	if (swdio_gpio >= 0) {
		swdio_fd = setup_sysfs_gpio(swdio_gpio, 1, 0);
		if (swdio_fd < 0)
			goto out_error;
	}

	if (sysfsgpio_swd_mode_possible()) {
		if (swd_mode)
			bitbang_swd_switch_seq(JTAG_TO_SWD);
		else
			bitbang_swd_switch_seq(SWD_TO_JTAG);
	}

	return ERROR_OK;

out_error:
	cleanup_all_fds();
	return ERROR_JTAG_INIT_FAILED;
}