//Include Header----------------------------------------------------- #include"prog.h" ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// //Main-Program ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// int main(int argc, const char * argv[]){ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Initializations //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Setting up Timer-Signal-------------------------------------------- sigset_t signal; pthread_t thread; int signal_err, pthread_err; signal_err = sigemptyset(&signal); if(signal_err!=0){ error_handler(signal_err, "Not a valid Signal"); } signal_err = sigaddset(&signal, SIGALRM); if(signal_err!=0){ error_handler(signal_err, "Not a valid Signal"); } pthread_err = pthread_sigmask(SIG_BLOCK, &signal, NULL); if(pthread_err!=0){ error_handler(pthread_err, "Error changing Signal-Mask"); } //initializing USART at USB_PORT------------------------------------- int USB = open("/dev/ttyACM3", O_RDWR|O_NOCTTY|O_NONBLOCK); int USB_err = isatty(USB); if(USB_err!=1){ error_handler(USB_err, "No File Descriptor"); } struct termios * termios_ptr = (struct termios *) malloc(sizeof(struct termios)); (*termios_ptr).c_iflag = IGNPAR; //ignore Parity-Err (*termios_ptr).c_oflag = 0; (*termios_ptr).c_cflag = CS8|CREAD; //set Size, enable RX (*termios_ptr).c_lflag = 0; (*termios_ptr).c_cc[VMIN] = 0; //set min Characters cfsetspeed(termios_ptr, B19200); //set Baudrate 19.2k tcsetattr(USB, TCSANOW ,termios_ptr); //initializing Stream for Source-Code-------------------------------- if(argv[1]==NULL){ fprintf(stderr, "No File \n"); exit(EXIT_FAILURE); } FILE * file_stream = fopen(argv[1], "r"); if(file_stream==NULL){ fprintf(stderr, "No Stream \n"); exit(EXIT_FAILURE); } int page_cnt = 0; int skip; int page_end = page_size; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Enable Programming Mode //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ set_timer(0, 100000); //setting Timer pthread_err = pthread_create(&thread, NULL, &signal_thread, (void *)&signal); if(pthread_err!=0){ error_handler(pthread_err, "Failed to create Thread"); } unsigned char * cmd_ack_ptr = (unsigned char *) malloc(sizeof(char)); char * frame_ptr = cmd_build(prog_enable, frame_mask); reset_1: write(USB, frame_ptr, 3*sizeof(char)); while(true){ read(USB, cmd_ack_ptr, sizeof(char)); if(*cmd_ack_ptr==frame_mask){ break; } if(!timer_state){ printf("\n"); printf("Connection Timeout \n"); printf("\n"); timer_state = true; goto reset_1; } } pthread_err = pthread_cancel(thread); if(pthread_err!=0){ error_handler(pthread_err, "Failed to close Thread"); } tcflush(USB, TCIOFLUSH); printf("\n"); printf("Ready for Programming \n"); printf("\n"); for(int i=0; i<32; i++){ printf("-"); } printf("\n"); free(cmd_ack_ptr); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Programming cycle //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Loading and Masking Page------------------------------------------- while(page_end==page_size){ skip=1; page_end = page_get(file_stream, page_cnt); printf("\n"); printf("Page %d: \n", page_cnt); for(int i=0; i>4)&nibble_lo); char * frame_ptr = &((*cmd_ptr).mode); return frame_ptr; } //Mask Page---------------------------------------------------------- unsigned char * page_mask(char * page_build_ptr, int page_end){ unsigned char * page_mask_ptr = (unsigned char *) malloc(2*page_end*sizeof(char)); for(int i=0; i>4); *(page_mask_ptr+1) = frame_mask|(*page_build_ptr&nibble_lo); page_mask_ptr = page_mask_ptr + 2; page_build_ptr++; } return page_mask_ptr-2*page_end; } //Get Page---------------------------------------------------------- int page_get(FILE * input_stream, int p_cnt){ int j = 0; //init loc Variables int c_cnt = 0; if(p_cnt==0){ //check for Start for(int k=0; k<9; k++){ page_buf[0] = fgetc(input_stream); } } else{ c_cnt = 16; } while(j0x2F){ page_buf[j+m] -= 0x30; } else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){ page_buf[j+m] -= 0x37; } } page_buf[j] = ((page_buf[j]<<4)&nibble_hi)| (page_buf[j+1]&nibble_lo); c_cnt++; j++; } } return page_size; }