OSDN Git Service

projects clean up 1
[pinoc/pinoc.git] / pinoc_hew / pinoc_hew / xmodem.c
diff --git a/pinoc_hew/pinoc_hew/xmodem.c b/pinoc_hew/pinoc_hew/xmodem.c
new file mode 100644 (file)
index 0000000..b694c02
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * XMODEM.c
+ *
+ *  Created on: 2011/02/27
+ *      Author: mizu
+ */
+
+#include "3069f_sci.h"
+#include "XMODEM.h"
+#include "stdio.h"
+
+
+#define ACK 0x06
+#define NAK 0x15
+#define EOT 0x04
+
+void (*xwrite)(char c);
+char (*xread)(void);
+char (*xread_pol)(void);
+
+#define XMODEM_DBG 0
+
+// \92Ê\90M\82ª\8aJ\8en\82³\82ê\82é\82Æ\8aÖ\90\94\82ð\94²\82¯\82Ü\82·
+static int xmodem_start_nak()
+{
+       unsigned long cnt = 0;
+
+       // \89½\82©\92l\82ª\93ü\82é\82Ü\82Å\88ê\92è\8aÔ\8au\82²\82Æ\82ÉNAK\82ð\91\97\90M
+       while (!(xread_pol()))
+       {
+               if (cnt++ > 400000)
+               {
+                       xwrite(XMODEM_NAK);
+                       cnt = 0;
+               }
+       }
+       return 0;
+}
+
+
+// XMODEM 1\83u\83\8d\83b\83N\8eó\90M
+static int xmodem_read_block(unsigned char block_num_now, char* buff)
+{
+       unsigned char c, block_num_rec, check_sum = 0;
+//     char c;
+       int i;
+
+       // \83u\83\8d\83b\83N\94Ô\8d\86\8am\94F
+       block_num_rec = xread();
+       if(block_num_now != block_num_rec)
+               return 1;
+
+       // \83r\83b\83g\94½\93]\82Ì\83u\83\8d\83b\83N\94Ô\8d\86\8am\94F
+       c = block_num_rec;
+       block_num_rec = xread();
+       block_num_rec ^= c;
+       if(block_num_rec != 0xFF)
+               return 1;
+
+       // 128byte\82Ì\83f\81[\83^\8eó\90M
+       for(i = 0; i < XMODEM_BLOCK_SIZE; i++)
+       {
+               c = xread();
+               *(buff++) = c;
+               check_sum += c;
+       }
+
+       // \83`\83F\83b\83N\83T\83\80\8am\94F
+       c = xread();
+       check_sum ^= c;
+       if(check_sum)
+               return 1;
+
+       // \90³\8fí\8fI\97¹
+       return 0;
+
+}
+
+// \93]\91\97\82ª\8a®\97¹\82·\82é\82Æ\93]\91\97\82µ\82½\83u\83\8d\83b\83N\90\94\81\8e¸\94s\81E\92\86\92f\82·\82é\82Æ0\82ð\95Ô\82·
+int xmodem_start(char* buf)
+{
+       unsigned char block_num_now = 1;
+       char c;
+       int i;
+//     int starting = 0;
+
+       printf("-------- xmodem_start --------\n");
+
+       xmodem_start_nak();
+
+       while(1)
+       {
+               c = sci_read_byte(SCI_NO_1);
+
+               if(c == XMODEM_SOH)
+               {
+                       sci_read_byte(SCI_NO_1); //     \83u\83\8d\83b\83N
+                       sci_read_byte(SCI_NO_1); //     \83u\83\8d\83b\83N\94½\93]
+                       for(i = 0; i < 128; i++)
+                       {
+                               buf[i] = sci_read_byte(SCI_NO_1);
+//                             i++;
+                       }
+                       buf += 128;
+                       block_num_now++;
+                       sci_read_byte(SCI_NO_1); // \83`\83F\83b\83N\83T\83\80
+                       sci_write(SCI_NO_1, XMODEM_ACK);
+               }
+
+               if(c == XMODEM_EOT)
+               {
+                       sci_write(SCI_NO_1, XMODEM_ACK);
+                       break;
+               }
+       }
+
+       return block_num_now;
+
+}
+
+
+
+
+
+
+//     while(1)
+//     {
+//
+////           printf("recv header\n");
+//             c = xread(); // \83w\83b\83_\8eó\90M
+//
+//             switch(c)
+//             {
+//             case XMODEM_SOH:        // \92Ê\90M\8aJ\8en\81I
+
+//                     if(xmodem_read_block(block_num_now, buf))
+//                     {
+//                             xwrite(XMODEM_NAK);     // \8e¸\94s\82ð\92Ê\92m
+//                     }
+//                     else
+//                     {
+//                             block_num_now++;
+//                             buf += XMODEM_BLOCK_SIZE;               // \83o\83b\83t\83@\82Ì\83|\83C\83\93\83^\82ð1\83u\83\8d\83b\83N\90i\82ß\82é
+//                             xwrite(XMODEM_ACK);     // \90¬\8c÷\82ð\92Ê\92\81¨ \8e\9f\82Ì\83u\83\8d\83b\83N\91\97\90M\8aJ\8en
+//                     }
+//                     break;
+//
+//             case XMODEM_EOT:        // \93]\91\97\8a®\97¹
+////                   printf("XMODEM_EOT\n");
+//                     xwrite(XMODEM_ACK);
+//                     return block_num_now;
+//
+//             case XMODEM_CAN:        // \92\86\92f
+//                     return 0;
+//
+//             case XMODEM_EOF:
+//                     return 0;
+//
+////           default:
+//
+//             }
+//
+//     }
+//}
+
+
+void xmodem_init(void (*io_write)(char c), char (*io_read)(void), char (*io_read_pol)(void))
+{
+       xwrite = io_write;
+       xread = io_read;
+       xread_pol = io_read_pol;
+}
+
+