prog.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. //Include Header-----------------------------------------------------
  2. #include"prog.h"
  3. /////////////////////////////////////////////////////////////////////
  4. /////////////////////////////////////////////////////////////////////
  5. //Main-Program
  6. /////////////////////////////////////////////////////////////////////
  7. /////////////////////////////////////////////////////////////////////
  8. int main(int argc, const char * argv[]){
  9. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  10. //Initializations
  11. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  12. //Setting up Timer-Signal--------------------------------------------
  13. sigset_t signal;
  14. pthread_t thread;
  15. int signal_err, pthread_err;
  16. signal_err = sigemptyset(&signal);
  17. if(signal_err!=0){
  18. error_handler(signal_err, "Not a valid Signal");
  19. }
  20. signal_err = sigaddset(&signal, SIGALRM);
  21. if(signal_err!=0){
  22. error_handler(signal_err, "Not a valid Signal");
  23. }
  24. pthread_err = pthread_sigmask(SIG_BLOCK, &signal, NULL);
  25. if(pthread_err!=0){
  26. error_handler(pthread_err, "Error changing Signal-Mask");
  27. }
  28. //initializing USART at USB_PORT-------------------------------------
  29. int USB = open("/dev/ttyACM3", O_RDWR|O_NOCTTY|O_NONBLOCK);
  30. int USB_err = isatty(USB);
  31. if(USB_err!=1){
  32. error_handler(USB_err, "No File Descriptor");
  33. }
  34. struct termios * termios_ptr = (struct termios *)
  35. malloc(sizeof(struct termios));
  36. (*termios_ptr).c_iflag = IGNPAR; //ignore Parity-Err
  37. (*termios_ptr).c_oflag = 0;
  38. (*termios_ptr).c_cflag = CS8|CREAD; //set Size, enable RX
  39. (*termios_ptr).c_lflag = 0;
  40. (*termios_ptr).c_cc[VMIN] = 0; //set min Characters
  41. cfsetspeed(termios_ptr, B19200); //set Baudrate 19.2k
  42. tcsetattr(USB, TCSANOW ,termios_ptr);
  43. //initializing Stream for Source-Code--------------------------------
  44. if(argv[1]==NULL){
  45. fprintf(stderr, "No File \n");
  46. exit(EXIT_FAILURE);
  47. }
  48. FILE * file_stream = fopen(argv[1], "r");
  49. if(file_stream==NULL){
  50. fprintf(stderr, "No Stream \n");
  51. exit(EXIT_FAILURE);
  52. }
  53. int page_cnt = 0;
  54. int skip;
  55. int page_end = page_size;
  56. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  57. //Enable Programming Mode
  58. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  59. set_timer(0, 100000); //setting Timer
  60. pthread_err = pthread_create(&thread, NULL,
  61. &signal_thread, (void *)&signal);
  62. if(pthread_err!=0){
  63. error_handler(pthread_err, "Failed to create Thread");
  64. }
  65. unsigned char * cmd_ack_ptr = (unsigned char *)
  66. malloc(sizeof(char));
  67. char * frame_ptr = cmd_build(prog_enable, frame_mask);
  68. reset_1:
  69. write(USB, frame_ptr, 3*sizeof(char));
  70. while(true){
  71. read(USB, cmd_ack_ptr, sizeof(char));
  72. if(*cmd_ack_ptr==frame_mask){
  73. break;
  74. }
  75. if(!timer_state){
  76. printf("\n");
  77. printf("Connection Timeout \n");
  78. printf("\n");
  79. timer_state = true;
  80. goto reset_1;
  81. }
  82. }
  83. pthread_err = pthread_cancel(thread);
  84. if(pthread_err!=0){
  85. error_handler(pthread_err, "Failed to close Thread");
  86. }
  87. tcflush(USB, TCIOFLUSH);
  88. printf("\n");
  89. printf("Ready for Programming \n");
  90. printf("\n");
  91. for(int i=0; i<32; i++){
  92. printf("-");
  93. }
  94. printf("\n");
  95. free(cmd_ack_ptr);
  96. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  97. //Programming cycle
  98. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  99. //Loading and Masking Page-------------------------------------------
  100. while(page_end==page_size){
  101. skip=1;
  102. page_end = page_get(file_stream, page_cnt);
  103. printf("\n");
  104. printf("Page %d: \n", page_cnt);
  105. for(int i=0; i<page_end; i++, skip++){
  106. printf("%02X", page_buf[i]);
  107. if(skip==16){
  108. printf("\n");
  109. skip=0;
  110. }
  111. }
  112. printf("\n");
  113. if(skip!=1){
  114. printf("\n");
  115. }
  116. page_cnt++;
  117. unsigned char * page_ptr = page_mask(&page_buf[0], page_end);
  118. //Opening Connection to Programmer-----------------------------------
  119. char * cmd_ack_ptr = (char *)malloc(sizeof(char));
  120. char * frame_ptr = cmd_build(page_read, page_end);
  121. set_timer(0, 100000); //setting Timer
  122. pthread_err = pthread_create(&thread, NULL,
  123. &signal_thread, (void *)&signal);
  124. if(pthread_err!=0){
  125. error_handler(pthread_err, "Failed to create Thread");
  126. }
  127. reset_2:
  128. write(USB, frame_ptr, 3*sizeof(char));
  129. while(true){
  130. read(USB, cmd_ack_ptr, sizeof(char));
  131. if(*cmd_ack_ptr==page_end){
  132. break;
  133. }
  134. if(!timer_state){
  135. printf("\n");
  136. printf("Connection Timeout \n");
  137. printf("\n");
  138. timer_state = true;
  139. goto reset_2;
  140. }
  141. }
  142. pthread_err = pthread_cancel(thread);
  143. if(pthread_err!=0){
  144. error_handler(pthread_err, "Failed to close Thread");
  145. }
  146. tcflush(USB, TCIOFLUSH);
  147. printf("Ready to Send Page \n");
  148. free(cmd_ack_ptr);
  149. //Sending Page-------------------------------------------------------
  150. set_timer(1, 0); //setting Timer
  151. pthread_err = pthread_create(&thread, NULL,
  152. &signal_thread, (void *)&signal);
  153. if(pthread_err!=0){
  154. error_handler(pthread_err, "Failed to create Thread");
  155. }
  156. reset_3:
  157. write(USB, page_ptr, 2*page_end*sizeof(char));
  158. unsigned char * page_rec_ptr = (unsigned char *)
  159. malloc(sizeof(char));
  160. while(true){
  161. read(USB, page_rec_ptr, sizeof(char));
  162. if(*page_rec_ptr==frame_mask){ //Framemask
  163. break;
  164. }
  165. if(!timer_state){
  166. printf("\n");
  167. printf("Connection Timeout \n");
  168. printf("\n");
  169. timer_state = true;
  170. goto reset_3;
  171. }
  172. }
  173. pthread_err = pthread_cancel(thread);
  174. if(pthread_err!=0){
  175. error_handler(pthread_err, "Failed to close Thread");
  176. }
  177. tcflush(USB, TCIOFLUSH);
  178. printf("Page Send Complete \n");
  179. free(page_rec_ptr);
  180. //Receiving Checksum-------------------------------------------------
  181. printf("\n");
  182. for(int i=0; i<32; i++){
  183. printf("-");
  184. }
  185. printf("\n");
  186. }
  187. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  188. //Deintialization and Error Handling
  189. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  190. close(USB);
  191. return EXIT_SUCCESS;
  192. }
  193. /////////////////////////////////////////////////////////////////////
  194. /////////////////////////////////////////////////////////////////////
  195. //Sub-Programms
  196. /////////////////////////////////////////////////////////////////////
  197. /////////////////////////////////////////////////////////////////////
  198. //Signal Thread------------------------------------------------------
  199. void * signal_thread(void * arg_ptr){
  200. sigset_t * signal_ptr = (sigset_t *)arg_ptr;
  201. int signal_nr, signal_err;
  202. while(true){
  203. signal_err = sigwait(signal_ptr, &signal_nr);
  204. if(signal_err!=0){
  205. error_handler(signal_err, "Problem with Signal");
  206. }
  207. else if(signal_nr!=SIGALRM){
  208. fprintf(stderr, "Wrong Signal \n");
  209. }
  210. timer_state = false;
  211. }
  212. return NULL;
  213. }
  214. //Set Timer----------------------------------------------------------
  215. void set_timer(int sec, int usec){
  216. struct itimerval timer;
  217. int timer_err, signal_err;
  218. timer.it_interval.tv_sec = sec;
  219. timer.it_interval.tv_usec = usec;
  220. timer.it_value.tv_sec = sec;
  221. timer.it_value.tv_usec = usec;
  222. timer_err = setitimer(ITIMER_REAL, &timer, NULL);
  223. if(timer_err!=0){
  224. error_handler(timer_err, "Error setting Timer");
  225. }
  226. timer_state = true;
  227. }
  228. //Build Command------------------------------------------------------
  229. char * cmd_build(mode cmd_mode, char cmd_option){
  230. cmd_t * cmd_ptr = (cmd_t *)malloc(sizeof(cmd_t));
  231. (*cmd_ptr).mode = frame_mask|cmd_mode;
  232. (*cmd_ptr).opt_lo = frame_mask|(cmd_option&nibble_lo);
  233. (*cmd_ptr).opt_hi = frame_mask|((cmd_option>>4)&nibble_lo);
  234. char * frame_ptr = &((*cmd_ptr).mode);
  235. return frame_ptr;
  236. }
  237. //Mask Page----------------------------------------------------------
  238. unsigned char * page_mask(char * page_build_ptr, int page_end){
  239. unsigned char * page_mask_ptr = (unsigned char *)
  240. malloc(2*page_end*sizeof(char));
  241. for(int i=0; i<page_end; i++){
  242. *page_mask_ptr = frame_mask|
  243. ((*page_build_ptr&nibble_hi)>>4);
  244. *(page_mask_ptr+1) = frame_mask|(*page_build_ptr&nibble_lo);
  245. page_mask_ptr = page_mask_ptr + 2;
  246. page_build_ptr++;
  247. }
  248. return page_mask_ptr-2*page_end;
  249. }
  250. //Get Page----------------------------------------------------------
  251. int page_get(FILE * input_stream, int p_cnt){
  252. int j = 0; //init loc Variables
  253. int c_cnt = 0;
  254. if(p_cnt==0){ //check for Start
  255. for(int k=0; k<9; k++){
  256. page_buf[0] = fgetc(input_stream);
  257. }
  258. }
  259. else{
  260. c_cnt = 16;
  261. }
  262. while(j<page_size){ //get Char
  263. page_buf[j] = fgetc(input_stream);
  264. page_buf[j+1] = fgetc(input_stream);
  265. if(page_buf[j]==0x25){
  266. return j;
  267. }
  268. if(c_cnt==16){ //check for Lineend
  269. c_cnt = 0;
  270. for(int k=0; k<11; k++){
  271. page_buf[j] = fgetc(input_stream);
  272. }
  273. }
  274. else{ //Convert to HEX
  275. for(int m=0; m<2; m++){
  276. if(page_buf[j+m]<0x3A&&page_buf[j+m]>0x2F){
  277. page_buf[j+m] -= 0x30;
  278. }
  279. else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){
  280. page_buf[j+m] -= 0x37;
  281. }
  282. }
  283. page_buf[j] = ((page_buf[j]<<4)&nibble_hi)|
  284. (page_buf[j+1]&nibble_lo);
  285. c_cnt++;
  286. j++;
  287. }
  288. }
  289. return page_size;
  290. }