6 #define XMODEM_SOH 0x01
7 #define XMODEM_STX 0x02
8 #define XMODEM_EOT 0x04
9 #define XMODEM_ACK 0x06
10 #define XMODEM_NAK 0x15
11 #define XMODEM_CAN 0x18
12 #define XMODEM_EOF 0x1a /* Ctrl-Z */
14 #define XMODEM_BLOCK_SIZE 128
16 /* ¼õ¿®³«»Ï¤µ¤ì¤ë¤Þ¤ÇÁ÷¿®Í×µá¤ò½Ð¤¹ */
17 static int xmodem_wait(void)
21 while (!serial_is_recv_enable(SERIAL_DEFAULT_DEVICE)) {
22 if (++cnt >= 2000000) {
24 serial_send_byte(SERIAL_DEFAULT_DEVICE, XMODEM_NAK);
31 /* ¥Ö¥í¥Ã¥¯Ã±°Ì¤Ç¤Î¼õ¿® */
32 static int xmodem_read_block(unsigned char block_number, char *buf)
34 unsigned char c, block_num, check_sum;
37 block_num = serial_recv_byte(SERIAL_DEFAULT_DEVICE);
38 if (block_num != block_number)
41 block_num ^= serial_recv_byte(SERIAL_DEFAULT_DEVICE);
42 if (block_num != 0xff)
46 for (i = 0; i < XMODEM_BLOCK_SIZE; i++) {
47 c = serial_recv_byte(SERIAL_DEFAULT_DEVICE);
52 check_sum ^= serial_recv_byte(SERIAL_DEFAULT_DEVICE);
59 long xmodem_recv(char *buf)
63 unsigned char c, block_number = 1;
67 xmodem_wait(); /* ¼õ¿®³«»Ï¤µ¤ì¤ë¤Þ¤ÇÁ÷¿®Í×µá¤ò½Ð¤¹ */
69 c = serial_recv_byte(SERIAL_DEFAULT_DEVICE);
71 if (c == XMODEM_EOT) { /* ¼õ¿®½ªÎ» */
72 serial_send_byte(SERIAL_DEFAULT_DEVICE, XMODEM_ACK);
74 } else if (c == XMODEM_CAN) { /* ¼õ¿®ÃæÃÇ */
76 } else if (c == XMODEM_SOH) { /* ¼õ¿®³«»Ï */
78 r = xmodem_read_block(block_number, buf); /* ¥Ö¥í¥Ã¥¯Ã±°Ì¤Ç¤Î¼õ¿® */
79 if (r < 0) { /* ¼õ¿®¥¨¥é¡¼ */
80 serial_send_byte(SERIAL_DEFAULT_DEVICE, XMODEM_NAK);
81 } else { /* Àµ¾ï¼õ¿® */
85 serial_send_byte(SERIAL_DEFAULT_DEVICE, XMODEM_ACK);