This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335X SPL 串口下载Uboot ,YMODE不能正常打开串口



1. ROM CODE 通过串口Xmode 可以正常下载SPL。

2.在SPL中,能够通过串口正常打印debug信息。

3.通过串口Ymode下载Uboot,发现SPL 中Ymode 打开串口时,

   info.mode = xyzModem_ymodem;
   ret = xyzModem_stream_open(&info, &err);会调用 xyzModem_get_hdr ();

                    static int xyzModem_get_hdr (void) 这个函数中不能读取到STX。 导致不能打开串口。

上述现象,表现出来串口硬件应该是正常的。串口软件是Ubuntu minicom 串口是USB转串口 /dev/ttyUSB0设备。

请问这个问题如何处理,谢谢!

  • 能否用Windows下的超级终端试一下,比如secureCRT

  • 你好! WINDOWS 一样的现象!

    在xyzModem_get_hdr函数中,终端用键盘输入按键,可以获取对应的按键值。可是就是无法打开文件!

  • Ymodern下u-boot.img的时候,这部分内容是要load到ddr里面的,所以你需要保证在你的spl阶段中,对于ddr的配置是一切正常的。

    能确认ddr配置是没问题的吗?如果是ddr3的话,需要做ddr3 software leveling。

  • Steven:

         你好,我们碰到的问题和楼主是一样的。DDR3我们通过仿真器在目标板上进行了software leveling。在xyzModem_get_hdr中每次都是超时,不能从串口获得STX控制信令。

    static int xyzModem_get_hdr (void)
    {
      char c;
      int res;
      bool hdr_found = false;
      int i, can_total, hdr_chars;
      unsigned short cksum;

      ZM_DEBUG (zm_new ());
      /* Find the start of a header */
      can_total = 0;
      hdr_chars = 0;

      if (xyz.tx_ack)
        {
          CYGACC_COMM_IF_PUTC (*xyz.__chan, ACK);
          xyz.tx_ack = false;
        }

      puts("\nentry >>> xyzModem_get_hdr\n");
     
       while (!hdr_found)
        {
          res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, &c);
          ZM_DEBUG (zm_save (c));
     printf("get data from serial,res=%d,c=%c\n",res,c);
          if (res)
     {
       hdr_chars++;
       switch (c)
         {
         case SOH:
           xyz.total_SOH++;
         case STX:
           if (c == STX)
      xyz.total_STX++;
           hdr_found = true;
           break;
         case CAN:
           xyz.total_CAN++;
           ZM_DEBUG (zm_dump (__LINE__));
           if (++can_total == xyzModem_CAN_COUNT)
      {
        return xyzModem_cancel;
      }
           else
      {
        /* Wait for multiple CAN to avoid early quits */
        break;
      }
         case EOT:
           /* EOT only supported if no noise */
           if (hdr_chars == 1)
      {
        CYGACC_COMM_IF_PUTC (*xyz.__chan, ACK);
        ZM_DEBUG (zm_dprintf ("ACK on EOT #%d\n", __LINE__));
        ZM_DEBUG (zm_dump (__LINE__));
        return xyzModem_eof;
      }
         default:
           /* Ignore, waiting for start of header */
           ;
         }
     }
          else
     {
       /* Data stream timed out */
       xyzModem_flush (); /* Toss any current input */
       ZM_DEBUG (zm_dump (__LINE__));
       CYGACC_CALL_IF_DELAY_US ((cyg_int32) 250000);
       return xyzModem_timeout;
     }
        }

      /* Header found, now read the data */
      res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, (char *) &xyz.blk);
      ZM_DEBUG (zm_save (xyz.blk));
      if (!res)
        {
          ZM_DEBUG (zm_dump (__LINE__));
          return xyzModem_timeout;
        }
      res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, (char *) &xyz.cblk);
      ZM_DEBUG (zm_save (xyz.cblk));
      if (!res)
        {
          ZM_DEBUG (zm_dump (__LINE__));
          return xyzModem_timeout;
        }
      xyz.len = (c == SOH) ? 128 : 1024;
      xyz.bufp = xyz.pkt;
      for (i = 0; i < xyz.len; i++)
        {
          res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, &c);
          ZM_DEBUG (zm_save (c));
          if (res)
     {
       xyz.pkt[i] = c;
     }
          else
     {
       ZM_DEBUG (zm_dump (__LINE__));
       return xyzModem_timeout;
     }
        }
      res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, (char *) &xyz.crc1);
      ZM_DEBUG (zm_save (xyz.crc1));
      if (!res)
        {
          ZM_DEBUG (zm_dump (__LINE__));
          return xyzModem_timeout;
        }
      if (xyz.crc_mode)
        {
          res = CYGACC_COMM_IF_GETC_TIMEOUT (*xyz.__chan, (char *) &xyz.crc2);
          ZM_DEBUG (zm_save (xyz.crc2));
          if (!res)
     {
       ZM_DEBUG (zm_dump (__LINE__));
       return xyzModem_timeout;
     }
        }
      ZM_DEBUG (zm_dump (__LINE__));
      /* Validate the message */
      if ((xyz.blk ^ xyz.cblk) != (unsigned char) 0xFF)
        {
          ZM_DEBUG (zm_dprintf
      ("Framing error - blk: %x/%x/%x\n", xyz.blk, xyz.cblk,
       (xyz.blk ^ xyz.cblk)));
          ZM_DEBUG (zm_dump_buf (xyz.pkt, xyz.len));
          xyzModem_flush ();
          return xyzModem_frame;
        }
      /* Verify checksum/CRC */
      if (xyz.crc_mode)
        {
          cksum = cyg_crc16 (xyz.pkt, xyz.len);
          if (cksum != ((xyz.crc1 << 8) | xyz.crc2))
     {
       ZM_DEBUG (zm_dprintf ("CRC error - recvd: %02x%02x, computed: %x\n",
        xyz.crc1, xyz.crc2, cksum & 0xFFFF));
       return xyzModem_cksum;
     }
        }
      else
        {
          cksum = 0;
          for (i = 0; i < xyz.len; i++)
     {
       cksum += xyz.pkt[i];
     }
          if (xyz.crc1 != (cksum & 0xFF))
     {
       ZM_DEBUG (zm_dprintf
          ("Checksum error - recvd: %x, computed: %x\n", xyz.crc1,
           cksum & 0xFF));
       return xyzModem_cksum;
     }
        }
      /* If we get here, the message passes [structural] muster */
      return 0;
    }