Exemplo n.º 1
0
Arquivo: lisa.c Projeto: ghorn/cletus
int lisa_open_connection(void)
{
    int ret = 0;
    open_device(&lisa.ftdi,LISA_DEVICE, LISA_BAUDRATE, LISA_BIT_TYPE, LISA_PARITY);
    if (ret < 0 || lisa.ftdi == NULL)
    {
        printf("Error opening LISA device\n");
        return ret;
    }
    ret = set_chunksize(lisa.ftdi, LISA_READ_CHUNKSIZE, LISA_WRITE_CHUNKSIZE);
    if (ret < 0)
    {
        printf("Error setting LISA chunksize\n");
        return ret;
    }
    ret = set_latency_timer(lisa.ftdi, LISA_LATENCY);
    if (ret < 0)
    {
        printf("Error setting LISA latency");
        return ret;
    }
    flush_device(lisa.ftdi, BOTH);
    return ret;
}
Exemplo n.º 2
0
int main(int argc, char** argv)
{
    int         baud_rate         = default_baud_rate;
    const char* device_filename   = default_device_filename;
    const char* firmware_filename = 0;
    long        timeout           = default_timeout;
    int         c;

    opterr = 0;
    
    while ((c = getopt (argc, argv, "b:d:f:ht:")) != -1)
    {
    
        switch (c)
        {
        
            case 'b':
            {
                baud_rate = atoi(optarg);
                
                if (baud_rate != 9600)
                {
                    printf("Reset device to 9600 baud for reprogramming!\n");
                    
                    return 1;
                }

                break;
            }
            
            case 'd':
            {
                device_filename = optarg;

                break;
            }
            
            case 'f':
            {
                firmware_filename = optarg;

                break;
            }
            
            case 'h':
            {
                print_usage(argv[0]);
                
                return 1;
            }
            
            case 't':
            {
                timeout = atol(optarg);

                break;
            }
            
            default:
            {
                print_usage(argv[0]);
                
                return 1;
            }
            
        }
        
    }
    
    if (!firmware_filename)
    {
        printf("Required argument firmware filename missing\n\n");
        print_usage(argv[0]);

        return 1;
    }
    
    if (optind < argc)
    {
        printf("Too many arguments given\n\n");
        print_usage(argv[0]);
        
        return 1;
    }
    
    printf("Writing new firmware file %s to device %s with baud rate %d...\n",
     firmware_filename, device_filename, baud_rate);
    printf("Reading firmware file...\n");
    FILE* fd_firmware = fopen(firmware_filename, "r");
    
    if (!fd_firmware)
    {
        int e = errno;
        printf("Could not open firmware file %s for reading: %s\n", firmware_filename, strerror(e));
        
        return 1;
    }
    
    int firmware_lines = 0;
    firmware* firmware_data = 0;
    firmware* last_data = 0;
    char new_line[80];
    
    while (fscanf(fd_firmware, "%s[^\n]", new_line) > 0)
    {
        int len = strlen(new_line);
        
        if (len != 67)
        {
            printf("Length with invalid length of %d in firmware file\n", len);
            
            return 1;
        }

        firmware_lines++;
        firmware* new_data = new firmware;
        new_data->line = new char[len + 1];
        strcpy(new_data->line, new_line);
        new_data->next = 0;
        
        if (!firmware_data)
        {
            firmware_data = new_data;
        }
        
        if (last_data)
        {
            last_data->next = new_data;
        }
        
        last_data = new_data;
    }
    
    fclose(fd_firmware);
    printf("Read %d lines from firmware file\n", firmware_lines);
    printf("Opening device...\n");
    int fd_device = open(device_filename, O_RDWR);
    
    if (fd_device == -1)
    {
        int e = errno;
        printf("Could not open device %s for communication: %s\n", device_filename, strerror(e));
        
        return 1;
    }
    
    printf("Setting serial parameters...\n");
    struct termios new_termios;
    tcgetattr(fd_device, &new_termios);
    
    switch (baud_rate)
    {
    
        case 300:
        {
            cfsetispeed(&new_termios,B300);
			cfsetospeed(&new_termios,B300);
            break;
        }
        
        case 600:
        {
            cfsetispeed(&new_termios,B600);
			cfsetospeed(&new_termios,B600);
            break;
        }
        
        case 1200:
        {
            cfsetispeed(&new_termios,B1200);
			cfsetospeed(&new_termios,B1200);
            break;
        }
        
        case 2400:
        {
            cfsetispeed(&new_termios,B2400);
			cfsetospeed(&new_termios,B2400);
            break;
        }
        
        case 4800:
        {
            cfsetispeed(&new_termios,B4800);
			cfsetospeed(&new_termios,B4800);
            break;
        }
        
        case 9600:
        {
            cfsetispeed(&new_termios,B9600);
			cfsetospeed(&new_termios,B9600);
            break;
        }
        
        case 19200:
        {
            cfsetispeed(&new_termios,B19200);
			cfsetospeed(&new_termios,B19200);
            break;
        }
        
        case 38400:
        {
            cfsetispeed(&new_termios,B38400);
			cfsetospeed(&new_termios,B38400);
            break;
        }
        
        case 57600:
        {
            cfsetispeed(&new_termios,B57600);
			cfsetospeed(&new_termios,B57600);
            break;
        }
        
        case 115200:
        {
            cfsetispeed(&new_termios,B115200);
			cfsetospeed(&new_termios,B115200);
            break;
        }
        
        case 230400:
        {
            cfsetispeed(&new_termios,B230400);
			cfsetospeed(&new_termios,B230400);
            break;
        }
        
        default:
        {
            printf("Unsurported baud rate %d\n", baud_rate);
            
            return 1;
        }

    }
    
    cfmakeraw(&new_termios);
    new_termios.c_oflag &= ~(ONLCR | OCRNL | ONLRET | ONOCR);
    tcsetattr(fd_device, TCSANOW, &new_termios);
    struct termios cmp_termios;
    tcgetattr(fd_device, &cmp_termios);
    
    if (new_termios.c_cflag != cmp_termios.c_cflag)
    {
        printf("Could not set serial communication parameters\n");
        
        return 1;
    }

    printf("Waiting for device to settle...\n\n");
    sleep(2);
    flush_device(fd_device, timeout);
   // enter_command_modus(fd_device, timeout);
   // info_command(fd_device, "ATVR", 2, timeout);
   // execute_command(fd_device, "ATPG", "OK", timeout);
    usleep(100000);
    send_bytes(fd_device, "~Y");
    char c_in = receive_byte(fd_device, timeout);
    
    if (c_in != '3')
    {
        printf("Invalid response received\n");
        
        exit(1);
    }

    send_bytes(fd_device, "W");
    c_in = receive_byte(fd_device, timeout);
    
    if (c_in != 'W')
    {
        printf("Invalid response received\n");
        
        exit(1);
    }
    
    firmware* data = firmware_data;
    int lines = 0;
    
    while (data != 0)
    {
        c_in = receive_byte(fd_device, timeout);
        
        if (c_in != 'R')
        {
            printf("Invalid response received\n");
            
            exit(1);
        }
        
        send_bytes(fd_device, data->line);
        c_in = receive_byte(fd_device, timeout);
        
        if (c_in != 'A')
        {
            printf("Invalid response received\n");
            
            exit(1);
        }
        
        data = data->next;
        lines++;
        printf("<> Sent %d of %d lines...\r", lines, firmware_lines);
        fflush(stdout);
    }
    
    printf("\n");
    c_in = receive_byte(fd_device, timeout);
    
    if (c_in != 'R')
    {
        printf("Invalid response received\n");
        
        exit(1);
    }
    
    c_in = receive_byte(fd_device, timeout);
    
    if (c_in != 'y')
    {
        printf("Invalid response received\n");
        
        exit(1);
    }
    
    send_bytes(fd_device, "X");
    printf("\nAll OK, XRF successfully reprogrammed!\n\n");
    printf("Waiting for device to settle...\n\n");
    sleep(2);
    flush_device(fd_device, timeout);
    enter_command_modus(fd_device, timeout);
    info_command(fd_device, "ATVR", 2, timeout);
    close(fd_device);
    
    return 0;
}
Exemplo n.º 3
0
Arquivo: lisa.c Projeto: ghorn/cletus
int lisa_flush_buffers(void)
{
    return flush_device(lisa.ftdi, BOTH);
}