Exemplo n.º 1
0
static int par_open(PROGRAMMER * pgm, char * port)
{
  int rc;

  bitbang_check_prerequisites(pgm);

  ppi_open(port, &pgm->fd);
  if (pgm->fd.ifd < 0) {
    fprintf(stderr, "%s: failed to open parallel port \"%s\"\n\n",
            progname, port);
    exit(1);
  }

  /*
   * save pin values, so they can be restored when device is closed
   */
  rc = ppi_getall(&pgm->fd, PPIDATA);
  if (rc < 0) {
    fprintf(stderr, "%s: error reading status of ppi data port\n", progname);
    return -1;
  }
  pgm->ppidata = rc;

  rc = ppi_getall(&pgm->fd, PPICTRL);
  if (rc < 0) {
    fprintf(stderr, "%s: error reading status of ppi ctrl port\n", progname);
    return -1;
  }
  pgm->ppictrl = rc;

  return 0;
}
Exemplo n.º 2
0
static int linuxgpio_open(PROGRAMMER *pgm, char *port)
{
  int r, i, pin;

  if (bitbang_check_prerequisites(pgm) < 0)
    return -1;


  for (i=0; i<N_GPIO; i++)
    linuxgpio_fds[i] = -1;
  //Avrdude assumes that if a pin number is 0 it means not used/available
  //this causes a problem because 0 is a valid GPIO number in Linux sysfs.
  //To avoid annoying off by one pin numbering we assume SCK, MOSI, MISO 
  //and RESET pins are always defined in avrdude.conf, even as 0. If they're
  //not programming will not work anyway. The drawbacks of this approach are
  //that unwanted toggling of GPIO0 can occur and that other optional pins
  //mostry LED status, can't be set to GPIO0. It can be fixed when a better 
  //solution exists.
  for (i=2; i<N_PINS; i++) {
    if ( (pgm->pinno[i] & PIN_MASK) != 0 ||
         i == PIN_AVR_RESET ||
         i == PIN_AVR_SCK   ||
         i == PIN_AVR_MOSI  ||
         i == PIN_AVR_MISO ) {
        pin = pgm->pinno[i] & PIN_MASK;
        if ((r=linuxgpio_export(pin)) < 0) {
            avrdude_message(MSG_INFO, "Can't export GPIO %d, already exported/busy?: %s",
                    pin, strerror(errno));
            return r;
        }
        if (i == PIN_AVR_MISO)
            r=linuxgpio_dir_in(pin);
        else
            r=linuxgpio_dir_out(pin);

        if (r < 0)
            return r;

        if ((linuxgpio_fds[pin]=linuxgpio_openfd(pin)) < 0)
            return linuxgpio_fds[pin];
    }
  }

 return(0);
}
Exemplo n.º 3
0
static int gpio_open(PROGRAMMER *pgm, char *port) {
	int i = 0;

	bitbang_check_prerequisites(pgm);

	for(i=0;i<N_PINS;i++) {
		if(pgm->pinno[i] != 0) {
			if(i == PIN_AVR_MISO) {
				gpio_fds[pgm->pinno[i]] = PINMODE_INPUT;
				pinMode(pgm->pinno[i], PINMODE_INPUT);
			} else {
				gpio_fds[pgm->pinno[i]] = PINMODE_OUTPUT;;
				pinMode(pgm->pinno[i], PINMODE_OUTPUT);
			}
		}
	}

 return(0);
}
Exemplo n.º 4
0
static int gpio_open(PROGRAMMER *pgm, char *port)
{
  int r,i;
  char filepath[60];


  bitbang_check_prerequisites(pgm);


  for (i=0; i<N_GPIO; i++)
	gpio_fds[i]=-1;

  for (i=0; i<N_PINS; i++) {
    if (pgm->pinno[i] != 0) {
        if ((r=gpio_export(pgm->pinno[i])) < 0)
	    return r;


	if (i == PIN_AVR_MISO)
	    r=gpio_dir_in(pgm->pinno[i]);
	else
	    r=gpio_dir_out(pgm->pinno[i]);

	if (r < 0)
	    return r;

	if ((r=snprintf(filepath, sizeof(filepath), "/sys/class/gpio/gpio%d/value", pgm->pinno[i]))<0)
	    return r;

        if ((gpio_fds[pgm->pinno[i]]=open(filepath, O_RDWR))<0)
	    return gpio_fds[pgm->pinno[i]];

    }
  }

 return(0);
}
Exemplo n.º 5
0
static int serbb_open(PROGRAMMER *pgm, char *port)
{
        DCB dcb;
	LPVOID lpMsgBuf;
	HANDLE hComPort = INVALID_HANDLE_VALUE;

	bitbang_check_prerequisites(pgm);

	hComPort = CreateFile(port, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

	if (hComPort == INVALID_HANDLE_VALUE) {
		FormatMessage(
			FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_SYSTEM |
			FORMAT_MESSAGE_IGNORE_INSERTS,
			NULL,
			GetLastError(),
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
			(LPTSTR) &lpMsgBuf,
			0,
			NULL);
		fprintf(stderr, "%s: ser_open(): can't open device \"%s\": %s\n",
                        progname, port, (char*)lpMsgBuf);
		LocalFree(lpMsgBuf);
                return -1;
	}

	if (!SetupComm(hComPort, W32SERBUFSIZE, W32SERBUFSIZE))
	{
		CloseHandle(hComPort);
		fprintf(stderr, "%s: ser_open(): can't set buffers for \"%s\"\n",
                        progname, port);
                return -1;
	}


	ZeroMemory(&dcb, sizeof(DCB));
	dcb.DCBlength = sizeof(DCB);
	dcb.BaudRate = CBR_9600;
	dcb.fBinary = 1;
	dcb.fDtrControl = DTR_CONTROL_DISABLE;
	dcb.fRtsControl = RTS_CONTROL_DISABLE;
	dcb.ByteSize = 8;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;

	if (!SetCommState(hComPort, &dcb))
	{
		CloseHandle(hComPort);
		fprintf(stderr, "%s: ser_open(): can't set com-state for \"%s\"\n",
                        progname, port);
                return -1;
	}
        if (verbose > 2)
                fprintf(stderr,
                        "%s: ser_open(): opened comm port \"%s\", handle 0x%x\n",
                        progname, port, (int)hComPort);

        pgm->fd.pfd = (void *)hComPort;

        dtr = rts = txd = 0;

        return 0;
}