Пример #1
0
void putc_raw(const char c)
{
#ifdef CONFIG_SILENT_CONSOLE
	if (gd->flags & GD_FLG_SILENT)
		return;
#endif

#ifdef CONFIG_DISABLE_CONSOLE
	if (gd->flags & GD_FLG_DISABLE_CONSOLE)
		return;
#endif

	if (gd->flags & GD_FLG_DEVINIT) {
		/* Send to the standard output */
		fputc_raw(stdout, c);
	} else {
		/* Send directly to the handler */
		serial_putc_raw(c);
	}
}
Пример #2
0
static void
xyzModem_send_hdr (void)
{
    int i;
    serial_putc_raw (xyz.len==128 ? SOH: STX);
    serial_putc_raw (xyz.blk);
    serial_putc_raw (xyz.cblk);
    for (i = 0; i < xyz.len; i++) {
        serial_putc_raw (xyz.pkt[i]);
    }
    serial_putc_raw(xyz.crc1);
    if (xyz.crc_mode) {
        serial_putc_raw(xyz.crc2);
    }
}
Пример #3
0
int
xyzModem_stream_read (char *buf, int size, int *err)
{
    int stat, total, len;
    int retries;

    total = 0;
    stat = xyzModem_cancel;
    /* Try and get 'size' bytes into the buffer */
    while (!xyz.at_eof && (size > 0))
    {
        if (xyz.len == 0)
        {
            retries = xyzModem_MAX_RETRIES;
            while (retries-- > 0)
            {
                stat = xyzModem_get_hdr ();
                if (stat == 0)
                {
                    if (xyz.blk == xyz.next_blk)
                    {
                        xyz.tx_ack = true;
                        ZM_DEBUG (zm_dprintf
                                  ("ACK block %d (%d)\n", xyz.blk, __LINE__));
                        xyz.next_blk = (xyz.next_blk + 1) & 0xFF;

#if defined(xyzModem_zmodem) || defined(USE_YMODEM_LENGTH)
                        if (xyz.mode == xyzModem_xmodem || xyz.file_length == 0)
                        {
#else
                        if (1)
                        {
#endif
                            /* Data blocks can be padded with ^Z (EOF) characters */
                            /* This code tries to detect and remove them */
                            if ((xyz.bufp[xyz.len - 1] == EOF) &&
                                    (xyz.bufp[xyz.len - 2] == EOF) &&
                                    (xyz.bufp[xyz.len - 3] == EOF))
                            {
                                while (xyz.len
                                        && (xyz.bufp[xyz.len - 1] == EOF))
                                {
                                    xyz.len--;
                                }
                            }
                        }

#ifdef USE_YMODEM_LENGTH
                        /*
                         * See if accumulated length exceeds that of the file.
                         * If so, reduce size (i.e., cut out pad bytes)
                         * Only do this for Y-modem (and Z-modem should it ever
                         * be supported since it can fall back to Y-modem mode).
                         */
                        if (xyz.mode != xyzModem_xmodem && 0 != xyz.file_length)
                        {
                            xyz.read_length += xyz.len;
                            if (xyz.read_length > xyz.file_length)
                            {
                                xyz.len -= (xyz.read_length - xyz.file_length);
                            }
                        }
#endif
                        break;
                    }
                    else if (xyz.blk == ((xyz.next_blk - 1) & 0xFF))
                    {
                        /* Just re-ACK this so sender will get on with it */
                        CYGACC_COMM_IF_PUTC (*xyz.__chan, ACK);
                        continue;	/* Need new header */
                    }
                    else
                    {
                        stat = xyzModem_sequence;
                    }
                }
                if (stat == xyzModem_cancel)
                {
                    break;
                }
                if (stat == xyzModem_eof)
                {
                    CYGACC_COMM_IF_PUTC (*xyz.__chan, ACK);
                    ZM_DEBUG (zm_dprintf ("ACK (%d)\n", __LINE__));
                    if (xyz.mode == xyzModem_ymodem)
                    {
                        CYGACC_COMM_IF_PUTC (*xyz.__chan,
                                             (xyz.crc_mode ? 'C' : NAK));
                        xyz.total_retries++;
                        ZM_DEBUG (zm_dprintf ("Reading Final Header\n"));
                        stat = xyzModem_get_hdr ();
                        CYGACC_COMM_IF_PUTC (*xyz.__chan, ACK);
                        ZM_DEBUG (zm_dprintf ("FINAL ACK (%d)\n", __LINE__));
                    }
                    xyz.at_eof = true;
                    break;
                }
                CYGACC_COMM_IF_PUTC (*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
                xyz.total_retries++;
                ZM_DEBUG (zm_dprintf ("NAK (%d)\n", __LINE__));
            }
            if (stat < 0)
            {
                *err = stat;
                xyz.len = -1;
                return total;
            }
        }
        /* Don't "read" data from the EOF protocol package */
        if (!xyz.at_eof)
        {
            len = xyz.len;
            if (size < len)
                len = size;
            memcpy (buf, xyz.bufp, len);
            size -= len;
            buf += len;
            total += len;
            xyz.len -= len;
            xyz.bufp += len;
        }
    }
    return total;
}

int
xyzModem_stream_write(ulong src,long size)
{
    char c;
    unsigned char  *psrc;
    unsigned short cksum;
    int ultlen = 0;
    int total = 0;
    int retry, i, res;
    int flag_ok = 0;
    int flag_frame = 0;
    psrc =(unsigned char *)src;
    xyz.blk  = 1;
    xyz.cblk = ~xyz.blk;
    xyz.len  = xyzModem_1k;

    for (retry = 0; retry < 300; ++retry) {
        res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, &c);
        if (res) {
            switch (c) {
            case 'C':
                xyz.crc_mode = true;
                flag_ok = 1;
                ZM_DEBUG (zm_dprintf ("Receive char CRC***\n"));
                break;
            case NAK:
                xyz.crc_mode = false;
                flag_ok = 1;
                ZM_DEBUG (zm_dprintf ("Receive char NAK***\n"));
                break;
            case CAN:
                ZM_DEBUG (zm_dprintf ("Receive char cancel***\n"));
                CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, &c);
                if (c == CAN) {
                    serial_putc_raw(ACK);
                    xyzModem_flush ();
                    return -1;
                }
                break;
            default:
                ZM_DEBUG (zm_dprintf ("Receive  char %x***\n",c));
                break;
            }
        }
        if (flag_ok == 1)
            break;
    }

    if (flag_ok == 0) {
        serial_putc_raw(CAN);
        serial_putc_raw(CAN);
        serial_putc_raw(CAN);
        xyzModem_flush ();
        return -2;
    }

    while(1) {
        flag_frame = 0;
        ultlen = size - total;

        if (ultlen > xyz.len)
            ultlen = xyz.len;

        if (ultlen > 0) {
            memcpy (xyz.pkt, &psrc[total], ultlen);
            if (ultlen < xyz.len) {
                memset (&xyz.pkt[ultlen], EOF, xyz.len-ultlen);
            }

            if (xyz.crc_mode) {
                cksum = cyg_crc16(xyz.pkt, xyz.len);
                xyz.crc1 = (cksum >> 8) & 0xFF;
                xyz.crc2 = cksum & 0xFF;
                ZM_DEBUG (zm_dprintf ("add crc check***\n"));
            } else {